MZ@( !L!This program cannot be run in DOS mode. $EZZZ}0԰԰԰)Z ZK`RichPEL}{`" ~W@n`n@@lx0N4nm<T<`^@,.text|~ `.rdata@@.data @.didat @.rsrcN0N@@.relocml@BL$h]p]ɉ h]d]áh]USWV} ]jWS ƅud]t Wuى^_[]U ]juPP ]USWV}  ]jWuSS ƅtud]t Wuщ^_[]USWV}  ]jWuSSƅud]t W<uՉ^_[]USWVPMu} t ]jQPP EEp`Nj5 ]jWuVV Åtud]tWu+}vtEWjP踧 ؃^_[]1UjjjԒVl]]U5l]ВVl]]̡l]UVjzr1Ftjj1F^]ËD$zUVuwVjP̒V1^]UVut`VjPȒV^]UWV}u tt3w:0VWjPĒV*w VjP̒VWjPȒV1^_]UVutVjPV1^]UtuЃ]1]USWVE rLuHMG1\w%kSjP̒VtO!ω)O^_[] jUSWVEld}U teG1\W7]M*U)uSjPĒVtykG1\wRSjP̒Vt?O!ω)O+G=)CWjPȒV1^_[]É]%ujP̒VtދUJ!ʉ)҉JtljujPV+EM 9CPWS6 Gy6=s4)WjPȒVv j j j j j j jUVut!Fy=s)^VjPȒV^] j jUu ]USWV]M t 119uVitVjPW 1^_[]U jUuu r]Uu 5]Uu ]Uuu ]Uuuu / ]Uu ]1=]tU]át]tUVj}ܹ)ρ9Bt}ujh WSuV9rM1Vl$^_[]ø{1D$UWV 1lVΉyyy y(y,y0Pig@F,~4~8jQg@@f@ F4^_]USWV΋IA1C9wy~(usF~PV1PPPjVPVF@rF1ۍ~SSjSVP3~ SSVhP@SSVPF ^_[]USWV]9t5VCr>PuVS2@WV^_[]USWV<2]}1E`u1ۉ^Fj h|V&V,AGEGEPVEԍMЉjQPVEPVG4E}=VE`EXEЋ}EWVMEPuWV}ȅu uVG}ȋ=Vnhd1V_MԃrRE؃wL$V}WVEЋME̍EPwW=VVMuuVEt7]؉]ԉ]jEPEPEPVׅu1FM1ei<^_[]1UWVlV΋AHrN1WjWPVF HrhP|V=t#N,eN(~(tjPFPxVN4~}N,7j v,^dN(tjPN ^_]USWV8@A;9t΋O, j Wd;u^_[]UV2]΍U1EP0R7 j6cM1/h^]UWVuhkc@>P^_]̃yt7USWV1W1V NSARN~^_[]}BUWV 2]Eu1UPVF1(yʀ tJy u;Qt ? tF9uԋM1Mg ^_]USWV2]Eu1UMPV*V19t.qˀ~ tKy u;Yt 6~ tG9uԋMRPEPM1f^_[]USWV桤2]}1艆?N ] ^d, ;G F @F PV_ۉt@1^RWPLÅ@NPKÅ^p&{K,N1ۍF`^d^h^lWqB9_tv~x~CN\QSRP Cu  1C|.@1ɃˉN-FPFXPFTFXt#NhVl9t Nh FXNdPR FTt(;FXt#NhVl9t Nh FTNdPR J8X9t/NhVl9ʉFCFC F$Cf F}wV聏W(eN<賅~tW eNPtzNd NpuwNt;v V}OtP1`؍e^_[]@s&Nh;F ^$x8pV^8P~ G V$VF(jF$PjQtV_,Cj [ۉًVDȉDȉH1ɉPN8W0TUUBW0C4V4FD^$D$ T$$D$ N8u}NM1[^e^_[]UV1t#UNt9,Va^]Ujq|V1]USWV52]ϋE ]U1u79u)9u%rp0pGF9tB֋Pz tY{ u;Kt Ӌz tPEP%9uË]ЉM1n]؃^_[] UWVE uPz t‹z u;Wt ׋z tPNjPX>^_]USWV} u!ΉwjW|X{ t^_[]USWVPEMp^ t‹Jy u;Qt ыz tz DuSq9tLJϋ;Hty~ u~7PQPJU9BEXE9ESDrx~ u~M9Bt 9WD29u ~ Љu ڋ{ tME9Bu9~ Љu ڋ[{ tPE PQQ p q P Mx  ~ 9t1x u@ F V:x uLHy R uQt5hFx u@ F VFx uP8 R uUun@ ~M;psvu}A @ P{MV P v p V8MuG @ PMFMV P v @p V"MދEF QrQ^_[]VD$P2p2~ uFpr 9At p9NDP^VD$r0r~ uFpr 9Atp9FNEBP^̋@sUV-PuV6@/6.^]UVA΃r @P6FF^]UE M=rQ)у s#PQU]|USWVEQMUxف9v\#PTx#GuEpXVuW0~ E7r @P3J;؃^_[] 9C؍Kr1S$HF뎅t Q T11KUhV UVA΃r @P6FFf^]UM EɁr‹@)ƒ s#QPS]9UWV1Fr+PuWV]-^_]USWV D$T$Yy{ t(*ʋs9s9BӀy Eʉڋ{ t18Y D?8_ ut$61;wBϋ<߀ tH^_[]̋t!UVQ)RP 1FF^]UM Er‹@)ƒ s#QPR],USWV}΋ ?^))ˉEFC))9Љw 9Bˉ}1ɍ]UI?G=r#BPQx#Gt PQ1Eڍ E MN)‰MRPW  9]tNE)ٍ@QSP ]tV)RPE>FEF؃^_[]̋t)UV΋I)iRP 1FF^]UM E r‹@)ƒ s#QP/Q]諴UWV΋M1FFtFsD<rG#PP@#H WPFǰ~^_] UhV] USWV02]]U1Ep~ tEDM܊M 1ۉE؋F99uň448^ t܋]}tCM܋UE;8tލ]M܉ #EuD$T$ |$4$D$/1Qu;s3ML$t$ u|$D$M܉4$)C CM1T؃0^_[]USWVy 7}ujDO Hf@ PCP9x]tM t 99uG  G 9yuAE{ }ЍK s9t6z tj;;u MSߋGM@ G@@ GpQVz t1;{u MSߋGM@ G@@ GpưB IA x_G{ K ]EM@@ E^_[]hV Vȋ y tI^Ëz t Qz tыRz tډ0Vz u; ty ũyA1USWV2]1E5$ ]tVh^PlV~FVuVh_PlV|tnt`uVh`PlVVtVhaPlVhVdVDhjW褁 jUW`VuVhePlVƅC袂t~D蝂CS9;u%1PPjh0:@\Vt,t#PВVDl藂t D膂VhbPlVCF] ] t QPuVhcPlVM1PĴ^_[]̍Aá]tø]]V]]]]USWV2]M1E<tyM NjE11FWwVD9v13]WPRs tFFDMDFP~HN@M1N؃^_[]USWV$EMԉ`@ @9[@hNdd@ RE؋M7MEPQuCs Md $^_[]e 1̋AUEH)Ћ 1@]USWV$2]1E] ^d, ;M1cM]$^_[]h]sL]uύhjPY} DžWTVDž t1ۃu6h6VVhVPVQjjЋj\Hh]PVSh]W(5]h]hKU]]USWV 2]λ1EA4A0A Vh6VVhVPVt!MEQW1҃}…EʋEN@^XFTFD}؉@FAFA F 裡jhVh谡uEEMPhpV?}ԍM~N u[N } bE Bs ?f :Y 88L1Y)<}/VuJB1tu1Ƀ)ȉ^ FFGft1f.f|OIu1QP}WV 9tjF4߃r/PrY)ك '$ىRQEEGEMOEEE8Er0M؍xrQ)у $щWQ}EE EUHN8HN}u|utu|W |WȺƍdAp"|M1%CĐ^_[]USWV,2]u11E~FfPhV ShV^ShVQuPu;PhV)]SңPS1ۉCShV}ԉ}Љ}̉}9Fvu؍EWPSVt1EȍMЍUPQRuVt"1uPPPju uVVVuLVMiM1A,^_[]ËD$wV1USWV 2]E 11L$whVL$ QPtDuD$ G PVPWjVVVt$ LV1DVƋL$18Ae^_[]USWV 2]]11EtLVMQhPVt*E}PS7VƋM1@ ^_[]USWV(2]M1}1EE70ppWPDžuwE܍M؍Uԉ012uRPQVVtOE܉ufxt.=|V1ۍuVSPׅtEЀ8tECH9rHujuxV1uVǍMS M1?(^_[]USWV2]Ή׍M1E1QPPRVtVVÃzu6]SuM MQuPWVtVuVËM1k?؃^_[]UWV 2]1EVMQh PVt)E}P7iVƋM1> ^_]USWVD2]M1EQhvVax} W}zEEu2}VWhPV Mu$EЍ}ЋU1]̋Mwwwww 3uRQvv6WhPSUx0E̍MP} u&MMP1Px1EĹ8PQQWhupVtgEčM9PrMȍuE8xx>VPDžuCujuxVt)MFMP'1V*VVǍM M1M)M!M1=D^_[]USWVP2]u1EHVVPDVEMQPTtmEЍM؉EPuhVQ1]̉3ShV.E M}@VQWVPEPE0WjPxMuV!PƍMEtPLVM1"<P^_[]USWV΋I]F))9sPʁ9Љw 9BˉʁU}rB1H#BQ7x#G69s)<SjQk ~gteډV^t R61Uٍ)QjPk N)QPWe tV)RPE>^F^_[]USWV9t:Y9tp9u>F)iPW1FF^_[]UE M@=rQ)у s#PQ*6]覙USWVϋ EWw)))iiC)9w 9BˉΉ]iU u1IG=r#BPi5H#AtPM51ɉ؉MEjDRP^ wM}9ΉEtj9Mt3΋]1+uMD; 9RQP^ D9uEMp)t_EM1\DMD; 9RQP^ D9u19Mt,+M1DϋME 10SQPW^ D9uދuuuuE^_[]USWV΋M] }tN)iRPM؉>FF^_[] UVQqE9t91rr@BHJp@fAPV^]USWVˋ ESs)))ii֫ G)9w 9BωΉ}i1ɋu I U@G=r#BP%3@#Ht P 311ɉE]LLUFDNLЉNFfES 99tSU11Rt:4:\9CKL:D:CD:9ÉsCfCuMQ9Mu1L,1t949\8CKL9D9CD99ӉsCfCuQ9tMU11Rt:4:\9CKL:D:CD:9ÉsCfCuuuuuE^_[]USWV΋ME U>t7^9ty9u>F)iPWMUE @‰FI‰F^_[] USWV΋ 2]} E1MN9s ML$D$<$; r ?~QPS` f{M1W5^_[]USWVE=MI=Mw)9UUw 9Cȉ1ɍSDIH=r#BP70x#Gt P01uEpXÍ6PuWY Efwr @P3&;؃^_[] USWV΋ 2]E 1M^V)9Ms UT$L$D$ $@%<~rSPQR^ f{M13^_[]USWVYuE)9ދyM=w E)9w 9CȉME1ɉ}]IPDH=r#BP.x#Gt P.1]MEqArFu6UPRWLX Mw QuP6X uCfwuSu4u6PQW X Mw QuPW ufwމ>^_[]tUVQ)RP1FF^]USWV 2]΋E M1UMEEFFfVPaNFr>t>f:tKu%t!)t9r*rVAfQM11 ^_[]UV΋Ir.T r‹@)ƒ s'Ƀ%RP-FFf^]~UWV}9txNr.T r‹@)ƒ s[Ƀ%RP,FFfGFONGGf^_]USWV΋ 2]E1M^)rsV9tlsED$ $^QwLrG>DPWVU FLr) s,%QW+FM1!0^_[]'UhfVm USWVYu)9ދQM=Uw!Ѻ)9UUw 9Cȉω]@D?H=r #BP*UH#MAtP*UEEMquy] PMQ}WTTU }taM_rMfnƍ|_pP)fpUf.@G uU};UUt f0Iu]u܍Lf_rF)ƃ ҉ƃ%QV *]PQ}WS Utd_sOӉыUfnƃpX)fp]|Wf.G uU}]9Ut f0Iuf_E8^_[]AUSWV Q])9ӋqЉUM؃=w)9w 9Cȉωu@D?H=r#BP(uH#Aut P(1ɉ^]~rGE>DPWMQ9R D=r) s=ۃ%PWk(}EDPVQQ > ^_[]迋Uju-]WVD$ t$L$T$|$0PHx ^_̋$USWV Yu)91AމM#EEx<ׁ9#w'U9CэB=J$ܿUFW/'Mx#GUEpHrX0SVWP MQuPPU ]JrF)ƃ st$ƉQV&u'SPWP MQuPmP ]> ^_[]tPv&J1>b UVu4 V^]USWV} ]u VSWuR^_[]USWV} ]u VSWuR^_[]%pVUVuV^]Uj@V]USWV2]u} \$1D$SIWVt$t$ƉS*D$L$ 9}DD)‰ȉى$D$ZP@VS$L$9ʉL$ D$|ËL$1)e^_[]USWV2]}1EWhVVhVPVtgƋGv]PQS蘊 }v]VSP֋Mr/E؍T r‹@)ƒ sEɃ%RPk$uwdEt|G>wdSPg^wdSP莙Mu(|KwdSP膚1wdSPq wdSPXwdSP+ t1^_[] USWV2]u1Eu 观EI\ |$1ٹ9)øʾMEEEub 1U8BE‹@#L@tYUу|WuL8D@Pi tDE@|1L8D@P9 uU }] ErމU }ML8jWRP$1 uH؃|51EOE‹@L8D@P 9t؃}EEuU1ɋ@L$L }1@9t8Dэ  T VR5 MEIL8tPM1^_[]USWV(2]΍|$ 1D$ V \$@D0HKPL$j =L]X]|$8PÅu?u9L$D$QP|$W P\$L]L$ L$tPtj@ T@D8D$D$D$0}D$L$ L$|$T$ $P$D$11ҿI9T8E | RW L$ D$ IL8tPL$ 1Ce^_[]轊USWV2]]΍}؃l1EGGfS=|PS-WARM11^_[]̃xgUSWVE2]11AQQP̐VtG9tEǐURP%1.e^_[]PjhthXVi j  j ƁÍUSWV 2]u1Ey0u 轿1S]ωw8w4jw0t1F$}MWd[P=p1M̮M1\ ^_[]USWV2]1Eu PjqHq(1C:~<tuFHtmN=4]0]D׋҉8tOɹ<]8]D9}9t:HXPQN j Pt<V1WV^_[]1USWV2]1EAht_MtU] t1҃|t>B9r}G1@Pj=3SV:1A9uM M1t^_[]A@ËADƁ̊USWV||unue~Hu_M EthVhPVP*+ PE,P0?t~P^Tx!!ډFX1V\FTFP,^_[]UWV}΅t>t,^_]UWVutw>^_]UVuɉtT^]UEt ] j UWV΋  IF;t8j Pl;>u^_]UWV}Ή9PL8t PPD uL<1t9tR@D F^_]UVQ E:tQ02~N2I r1 PR ^]UWV 2]1E@|8tX}VEt*@L8P4u@ D jP1MEIL8tPM1 ^_]USWVE2]1UA #AtKnVuVVDD]Sh@x@h@] uWSj~XM1?^_[]UV^΅tVЃP1PPPPP>p̋D$~X@1@ UV}t V^]̸VUSWVE uu^FjhV%P lj^FPtPW^_[]̋D$T$HD$I@3H3T$ USWV 2]u E}1UPWR GN@;Au E;1ۋM1؃ ^_[]USWV2]]}؉1EGGSsPSWu u$蟵`~XM1Y^_[] USWV eԋ}Ρ2]1EEP 1҉SK S PE {}؉C;J$eԃvE؉FD~XEM P~XFN M1e^_[] USWV2]Mu1E~tjhVRE}؋H‹rWPG9OvU؉PR#苴1MCCFCNKAQ A L7M1 ^_[]USWV]΋K9Cv9wKNZϸM9CrG$P @#H GPuuNQSP2u N~^_[]UV@| u.Dt%L8P4u@ D jPh^]UWV2]1E9u(1MW 9>u ^@^M >M1 ^_]UWV}A9x v H4u1xtm 9x v@4^_]USWV82]]1ۉEtN;uI} jƋGt HEV}P.F$X3M1 8^_[]USWV 2]}11ES ^^^ ^^f^^f^ ^$^(^,^0uMAVD~XyWVz M1  ^_[]UVQ F,t P蠒F,F$t P艒F$Ft PrFFt P[FF t PDF Ft P-F^] A1IDUSWVP2]]ύt$1D$HEPhVj@V@M UT$ $ D$ UMD$D$t$\$T$<$L$ L$H1? Ee^_[]USWVXL$$]1ɾM(V2]T1D$PL$HD$LD$80#CS= DKLf.Vv@= u7E|$0|$$qy؋LiuZ| \$82D$ى$E@D$LD$ D$0D$D$$$K9{vT$8Et$ D$L$$D$ 9|$LvL$8U uUD$(D$(D$L$MD$T$t$L$L$$ $L$P1e^_[]USWVXL$$]1M(V2]T1D$P|$HD$LD$80#CK= DںSLf.Vv@= u7E\$0\$$w؋LiuZ| \$82|$ى$bE@|$D$ D$0D$D$$$oK9{vT$8Et$ D$L$$D$3 9|$LvL$8U uUD$(D$(D$L$MD$T$t$L$L$$ $aL$P1 e^_[]USWVX2]ϋM]1D$PD$qhVPWat$u uPj@Vy M UT$ $ D$ MD$t$uD$\$L$<$t$8 L$P1xe^_[]USWVX2]ϋM]1D$PD$qhVPWt$u uPj@V M UT$ $ D$ MD$t$uD$\$L$<$t$ L$P1e^_[]USWVX2]ϋM]1D$PD$ qhVPWt$uPj@V M UT$ $ D$ MD$t$uD$\$L$<$t$ L$P1e^_[]USWVX2]ϋM]1D$PD$ qhVPWQt$uPj@VlM UT$ $ D$ MD$t$uD$\$L$<$t$+ L$P1ke^_[]USWVp2]}uU 1D$hG@u:E]D$(D$(D$D$\$|$ 4$R$G0t$PHNPL$8$ =T]\]|$4$ƅu@u:D$PD$D$4$ .t$44$ Pt$45T]\$8h L$TtPt$}D$dD$`D$Pt $P $Pt$P/D$HT$8L$@D$HD$LD$8FNMU q A$| D$`9C)1Z#A @tPȈL$L$t"}tى<$uD$NuD$L$U 11H !ÉZ|$`D$PʉL$L$ t>|$dvD$Pt$t!މ$|؉t$uL$@Ou1HE !ډPD$U D$ 1ɅJ$J t:ED$$D$tL$$lj $uNu݋L$  ȋuL$P^蠧L$h1_e^_[]pUSWVP2]}$M U1Et <+u 1C 11<-ø#B=uC9w<0uL xuËB0u؉]HNPMj P]^]Pu:ۉu4E؍MPQ^?uV+ PEP]ME{ M܅tPtj1u؉]EEPW99]vu؋ME Í8VPSREu@0HNP1MP T]\]]PEu>ۉ]u7EMPQ h]ST PEET]M MątPtj]VP}vu<tO~KPt<~8+U9v/)ύMS1@PW:~~Ft ~ +E9wԋMuY A$| 9C)1۸Uu#A@t8=u_J‰E%}ME}uJ‰E%}E}} BʉEMۉUt u}tMVuEKuUM U1H!}EωH}]u؋}tP~MuEFOuU} U1H!ۉωHuMtVRVP& EWPV+ M1Q ؃^_[] USWVH2]]1ۉEtl;ug} jt ƋGt HEVMP}F~XW OMNF3.M1 H^_[]UV~XW}t V= ^]USWV] u9tσWPh F9uމ^_[]UEQP6 ]USWV] u9tσWP F9uމ^_[]UEQP ]UVu E)QPu ^] ̊D$UVu E)QPu ^]̊D$UVA΅~ v SxvD^]ËF tP USWV΋ 2]}E 1MN9s ML$D$<$8r~WPS( ;M1 ^_[]USWVEQMUxف9v^#P x#GuEpXEVPWP( E7r @P3j;؃^_[] 9C؍Kr1S$HF댅t Q+ 11K!USWV82]]1ۉEtX;uS} j ƋGt HEV}P\FhXjW!3M1> 8^_[]USWVd2]] 1E菥ǍEP 1FFFEP ۉ}t VE EWZC1@PS[~t 1ɊA9uFjj3~tn}VTAuFjj ~tFVTAu}FtF ., F GF M1( d^_[]& UVhX}t V ^]̊A ̊A UWVyuFFWYPW^_]UWVyuFFW~YPW诰^_]UWVyuFFW>YPWo^_]UVq,|v!|v|^]USWVQu)9Ay։UM}xځ9#P H#ʉAM}quYrVEVPUR EM0EQPSo$ E]@)uPVuSU GW}uw=VQR7 ME7QPS"$ EM]@)PVS >^_[]9C؍{r1S$HFtW 11K X]UEQ9s)U RP"yrA]ST$D$ %uHH@+\$t#Af.*tYӁ0u$f t^_[]9C؍{r1S$HF@tW =11K3SVT$D$ %uHH@+t$t#ALufI6A4AӁtuXoVA^[USWV}΋_j J DȉDȉHM HNTUUtANG^_[]hV USWVAAAA AAA AA(A$A0A,A8A4A@A<ADH΃=`]td]t h]u:h6VVVhVPӣ`]h>VWӣd]hXVWӣh]^_[]UVADtPh]FDt PN ^]USWV2]1E9HuyDt1ۋM1T ؃^_[]}]ESjWj`]EtP FDSjWP`]uFDt P FD̋ADt"Ujjuu ujPd]] 1 USWVL2]1Ep] ^d, ; l]t,E}U 1]3SVVPRW=uW^1ZxV]jh ƍMSg1VF~jDMQPL  FL~T~P~\~X~d~`tSdVM1 L^_[]hp] p]=hVVhVPVl]hp] USWVL2]1Ex] ^d, ; t]tlEURPхxX]jh ƍMSf1VF~jDMQPF  FL~T~P~\~X~d~`t SdV1M1 L^_[]hx] x]YhVVhVPVt]hx]y +1HAt,u'UVVI\gNP_V ^]USV 2]1E] ^d, ;u=|]t?EPt.uu`VEPV|]xM uz 111VM迋M1 ؃ ^[]h] ]phVVh8VPV|]h]I BUSWV]jl ǍFPPV1SPPWPP<W ^_[]USWV82]1E] ^d, ;=]}؃GGfWgto}Ev}؍EPW]1ۅx:Eutf8t 1f|X[u}SPޱWEtP$V1 1ۍM蓋M1 ؃8^_[]h]) ]$hVVhXVPV]h] USWVL2]]؃1ECCfSetWE9}v]؍uPShrVVj}F9~vU]PRްM S~諊1ۍM蝊M1 ؃L^_[]USWV2]u 11D$xt f1|$ L$fnEfpfrfrfofVf VffWP\VD$L$PSQSSjVuXVL$D$yLD$txL$0jTbD$fxt^1ۍL$QSP|V|$?w1GD$ PTVtL$0cdPt$PVtGD$CH9rL$1ۍD$fD$\$@fD$0Pdt'D$L$0uuPQVut$(t$8LVÍL$萇1ۋD$tPLVL$x1r ؍e^_[]USWVH2]E΍}1UPWKbjWM1$ ؃H^_[]USWV}Ή^ct&E u-FTVX9tDSWP ^T17NPWR>N`Fd9tDSWQ ^` \WP^_[]USWVH2]E΍}1UPWs`jWHM1T ؃H^_[]USWVH2]E΍}1UPW bjWM1 ؃H^_[]USWVH2]E΍}1UPW`jWM1 ؃H^_[]USWVH2]E΍}1UPW_jWXM1d ؃H^_[]USWVH2]E΍}1UPWajWM1 ؃H^_[]A\̊D$AL̊ALUSWV}jl7 ÍFPPVn ^_[]UV1VΉAAj @FF PV^]USWV2]}11EtJ΋MU ESjuQRPАVt*E];~ CWVNSvYWVM1 ؃^_[]USWV }trA ΉEPVN9t^u]U9xt@H0x 1PQKjP4 1HPW}ԐVM MK9u 1E]uV؃ ^_[]UVA VPxVN>jv ^]UV}t V ^]UWV΋  IF;t8jPd ;>u^_]USWV}΋_j DȉDȉHM @NtANG^_[]hV躤 AA AUSWV]΍yAA A3pspCFC F ^_[]UWV}yu>u ~ u~t7pNwpGFG F ^_]UWVdF@r'~3PuW77荰@r$PuV6軰6a^_]UWV@r$̮PuV6耰6&F@r'~蜮PuW7P7FF ^_]̃yu 9uy tÃyUWV}Ή-tOVtGFG F 1^_]USWV 2]1ɉEt:5VωUE։֍MjjjQSWPĐVtMunVPV1ۋM1 ؃ ^_[]USWVP}GG GCrDPuVS^FCrFEPuuSʮ_FGF G FF ^_[]UWVA qAFrσ訬PuWV]^_]USWVPv1ۍM ~^貀Pm}F^E藀MPxm^N0GF^ G F$^(^,w5y~M ~^_[]UWVtj26|Vj6lV~ jBN08F,t P__GN~N~N ~^_]SUV1Et"V ^]UV1tV ^]USWV2]u 1艄$u茆O,G,t Q^VpM11ۉD$9qD 9wt#LيEMT$0W)RuVVSPVV\$8SQwHVD$0L$ PGtt$ PؐVOuAD$DL$ D$Pjt$(VD$D\$@1ɉ|$ PbkHD$W ÍpHD$Lt$TW1PS D$Ht$PPWSjt$DVtc3t]jD D$VUD$OVMVMjt$$lVUT$ D$D$|$uL$L.L$@{1ۀ|$t8G0L$LPt$ UD$PSSD$XPSt$ 視L$L4D$t P2 ۋ\$T$ tT$D$$L$LRQ@VOC{L$:{MD$ Pt-t$ iG(t5t$LL$ V(V1XVjt$$lV=Vjt$$lV+"Vjt$$lVL$zL$ t S[$1 e^_[]USWV2]1Et$}E ]SWPP6ܐV9;M1# ^_[] USWV2]ϋUM_1E 1QPQhQjVPhw1AF9w&VMM1 ؃^_[]}?V1ҍMRRjQWVPĐV1PPPj3Vu] MEt6t2EU<QSWu t )ىuE죈] }D$D$]]u`E] D$D$][]u0E] D$D$]+]t4VVMVuG Ej ÉVw$w7{MS-O huu{RPV1=UV/t j6lV^]USWVϋ 2]E11L$HrE1L$\$s1QhV0ejSj 7D$yPfPVL$1e e^_[]USWVE ]1Ήy9y yIPq~~ ~$~(jDSWO iSVF9td)ЍNiQPN9Nt6115SNDٹFLCNF)i9r΋FN )NF^_[]UWV΋ 2]E}1M1ɉOOWPczM1] ^_]UV΍I ^]4zt!UVQ)RP 1FF^]UE M=rQ)у s#PQq ].USWVP΋ UF~))9sc ׺)9Љw 9Bʉ1ɍ}IG=rM#BP x#GF9s!)tPjWg <߉~vttщFltPs 1)t PjQ& N)QPW tV)RPE>ljFEljF^_[]ỹ=]USWV1ۉΉYj0 @@f@ ~SSSSV^Pc^_[]UV΍IBt^]UV2]΍U1EP0Rj06 M1 ^]USWV2]} 1EhVuhVC1@EUHH VЉNjCE1QQQMQWuPĐVt6E;Et#MU9t M EMPR*vFtE9Eru}9tV6Ӄ9uEM9EuىˋM1 ؃^_[]USWV8Mġ2]1E=]AE]x1҉q UhVV{uE1EEfEV-]؉PV觖MSEPẺىEs19GtxqE(1MθE1EfEVa-]؉PVNEԈD$ 1\$MȉD$Ẻ$ Ys}uPE̋MG@ ;ytFrU] B;P 1hVPV5]M1 8^_[] j  j USWVXMu2]1EVVPVhVV1V E]VWPD ك 9}]EEfEd}1ۉEE?MEM)EMPVST 5EWP芎uEPVS2 xM+M9MD=t=tFM1fNEEfUMQq+MPu^MEPEP8MzqME;tWy,t'EPSMMt:E؃(P7t*jjS̐Vt5SVt*EMPSMMAc11ۍMpMזM1o ؃X^_[]USWVE]} u`@ @9[@hNd d]uh]hV\] ESQWjVЋMd ^_[]Ëe USWVu V9tÍ@PxE^_[]UWV 2]Eu1UPV F1(yʀ tJy u;Qt ? tF9uԋM1= ^_]USWV52]ϋE ]U1u79u)9u%rp0pGF9tB֋Pz tY{ u;Kt Ӌz tPEP%9uË]ЉM1 ؃^_[] USWVE Pz t‹r~ u;Vt ֋z tPtjH(ǍXqnj0W E0^_[]USWVP]{ u7ωs3CK(E&Mdnj0Su ~ t˃^_[]UV2]΍U1EP0Rj(65 M1 ^]USWV52]ϋE ]U1u79u)9u%rp0pGF9tB֋Pz tY{ u;Kt Ӌz tPEP%9uË]ЉM1 ؃^_[] USWVE uPz t‹Z{ u;St Ӌz tPhHmj(W* ^_[]USWV} u)ΉwOlj(W { t^_[]UEH)Ћ 1]USWV}WI&N~r69ut1Vf;WuB9u1ɉ^_[]USWV2]] 1ES;tكPx E0@&EU]RPhVVS!uFM1\ ^_[]USWVj0螿 Í{ KKfC uuuWVCSWu uV^_[]USWV1~ u]OSI<ǀ t^_[]USWVD$Pxvqyr 9Bt1,Xf9,YuC9u191I9B D^_[]USWV2]u}1E1E9AM 99qV[y#E MZpEW<W,U UJA tыQz u;JщUt ʋ y tU;tRyTE @@ لuVu ruW3jk΍APyuWVjLIWxuuWjVu+uWpEHy t1uWPjuV,M1 ^_[]uVu눉uWu zUWVEu 1~~P%~~j( @@f@ F^_]USWV]΋K9Cv9wKNqϸM9C1ɍWID?H=r#BP胼 @#Ht Pi 1uuL6QSP! u N~^_[]USWVPAu=TUU}@MAF~99tU t79:u2w2 q w9zur8 ]O w9t6z tj;u MWfCM@ C@@ CpeOVz t1;_u MWeCM@ C@@ CpeZ IA X{C O _EM@@ Eȃ^_[]VhV USWV2]u1E9Wz t}D] M׍BtV Pɋπz t̄}t+M;8t]Mil E]uVWjVEV2x0EH(ǍpOfj0W` uEF!ME]uVWPSuFM1藾 ^_[]UWV}O(wej0W ^_]USWV02]]u1EM؋9Oy t}I] ύIt4$Z $Fɋ πy tċ]}td5F RQP] EdE؃ ^_[]Ëe EUEH)Ћ 1@]USWV uUEM EfF F9[FhNd=>d5F RQP] EdE؃ ^_[]Ëe EԉEUSWV,E`@ @9[@hNd d ]uEh]hV2K ]U1EERPPjuщE؍MEEE̋M؅tFEjP MP]MԉE؋ẺE0iMQuPjuU؉MEiEu 0M DAjP MP_M-1ɄMhE؍MhMԉEhupu xaMhE؃Mf\u M؋ULPu MQ xu MmM؃UfBM؍MEuEUy t1ɉ E]PQR]Ed,^_[]Ëe uU M"]UEH)Ћ 1@]̉UUtPj5]]]USWV 2]E 1Mt$1up`tguj5]]R}]1uEjh WVSj]x*}r׋E1EjhWVSj]xuM1詴 ^_[]̃9̋tUPj5]]]USWV(E`@ @:[@hNd dsM U}u BBx1ɉMEЍ@EԃQP M PhM 6M t\E@@EeuuP x3M eUԋMfDPUtB M1t,B%M Ƌt19E]PWR]Ed(^_[]Ëe űM yUEH)Ћ 1@]USV 2]u1Et1=]u0E؍MPjQjj]x}uE죬]7x1E؍MPjQjV]x }uEx ;]1ۋM1^ ؃ ^[]USV 2]11}D$uhEtaM tZMtS11ҍL$JSSjQRPR]x8D$L$PjQjt$(]t$]1ۅx|$u\$L$1ı ؍e^[]USWV 2]]1ES]1f}fGf}]tUtLǍDPj5]]t2fxCEjPS]ySj5]]1M1) ^_[]U 2]M E1Utu.Pj5]]MEhPQj]M1ǰ ]USWV0MEu aA A:[AhNd1d Q UЍMPMEE5b1҄tmE MȀEt%@ EMP_EPc1MȉE؉E_U؅tx(tM xtE MȉU؉UEEEdE؃0^_[]Ëe EЉEUP EԍMȉE؉EVE؉EЃ]UEH)Ћ 1@]ËT$ VPUjR^]USWV,MEaA A(:[AhNd1d Q U؍MPME`1ɄtM1Ʌt Mp Z^MԉM؍MEcEEdEԃ,^_[]Ëe E؉EUP ME&E]USWV2]11EtfuSj5]]tIVSPjuj]=uWj5]]]3uyWj5]]1M1̭ ^_[]USWVPE1X1Jpft1f|C\tAHU)U tz)ω}th)F Pj5]]tNǃNGf7fOMLKVQP xGfWj5]]1^_[]UWV2]΋M E}1UU N QPRWj]DžxEFEFM1虬 ^_] UWV2]1E9t0A΍MVF Pv QRj]1FFF 1M1; ^_]ËL$rE|$ u>D$P9r0w%Hufx \ufx?ufx?u fx\1USWV2]1ۍ}1EW"8u \M1觫 ؃^_[]USWVP΋UtQ1P GUtU1ɉt%A;uj2p|V=tϋU1ɳ U11Ɉȃ^_[]̋D$+A 1ҍBT ̋T$ȉRPUSWV z}ˉ+A LjhtUEtVtC=uoEM=|Vtjp=u2h6=t} u3E  pMU D @^_[]̉AAUSWV2]]΋EM 1UUERSjQPVDžu(tPVFE^M1蓩 ^_[] UV΅tPVFNtj^]UWV2]Eu}1UUEEERVWjP18Vƅu Ew}u E M1M1ި ^_]USWVQ])9ӋyUM؃=w)9w 9CȉΉ}@D6H=r#BP豣 x#Gt P虣 1MY]qrKu 6PMQW? EfwDfDw=r?MȋI)ȃ sPۃ%']PQW Ef_fD_MPQ6 u>^_[] NUSWV E=>yλ=w)9w 9Cȉˉع@DH=r#BPs H#MAtPX EEEF^ÅtfEMrOuufn}߉ڃp)fp ~vF u]u9ߋ}t ffJuEfXr.L?r@) s$%QPɡ  ^_[] M6USWV42]׉1Eq1Qt>Krw4r]\$L$ D$t$$osO}؉)v0W)9s:ML$D$$D$ }؉}uCrwfp.}؃wrU؋:t OPjQt fw}؋Grs EMԉu11EUEԍQUÀuqY;]Љމ]}dƃuVu4usCuԋ]?]w+EċUȃM?  Edf.D;Ut;À>w1u?wM $f.DjPuЍEPuV=  Dt]ߋU=w w$D%w fDzfz]ߋM;M}؉O)v6W)9s[ML$D$$D$ }؉os1Grwfp;M1A ؃4^_[]Ë}؃wrU؋:t OPjQE fw}USWV82]] u}1E\$4$Pt9^rW]\$ʉ $D$ t$T$e O4[)v1W)9s7ML$ىD$$D$ 豵=rw0*srUىD$D$ $X }3rE HE11҉]ЉEf.@Mwމ˸UWVMU Eyvq9q)RPVW{^_]UWV 2]Eu1MFFft<M v ED$L$<$pi~PQV f~M1蚞 ^_]UV 2]uM E1UMMFFfE2M1H ^]UVuE MFFVQP ^]USWVPA΋IwP>D PWV FLr) %QW? FB9ع@DH=r#BPŘ x#Gt P識 1FDP6Wg FTrQ)щU s!M%RQ菘 >^^_[] USWV$MЋ}uMء2]1)EEEfERk9tef.DMU9s#YU؉]vUfJfDJ&D ML$M؉D$$oF9uuЋ} M)σ~r)E}vU؉ˍU؉PRWS_Mr/E؍T r‹@)ƒ s'Ƀ%RPX M1辛 $^_[] USWV2]]1EA)u }M9B9uyrXWuP 7ڻ)Ӊ))s@‰ȉQyrM H?MPuQ Mۍq ySPQ IUUM)9Mv>ED$E|$t$ $MD$ED$M1谚 M}QrMU܍J ruU؉M4~9։vM܉ A;MrM1+Mv΋EMۍ HSPQE 6PS]S EM)A spWPQF M1 E^_[]iUSWV Q])9ӋqUM؃=w)9w 9Cȉωu@D?H=r#BPє uH#Aut P賔 1ɋE}^~PSQ[ E}AQWVH FPrO)σ $ωRWu FB9strC$P x#GCP NjF@P6W躼 VJrH)ȉM sE$QP >^^_[]X USWV$MЋ]u2]1EEEE)t#rMԈL$M؉$=E9tg1f.EU9s xU؉}vU؈ D9u& EԈD$M$D$9u]ЋE U{r ))ʋu}v}}؉VWPRXEr,M؍prQ)у s'$щVQ褑 M1 ؃$^_[] USWV2]u1EA)g} ]9B9uyrMRuPS )))s4Ɖq΃yr1uMRuV uSWV QU)9v>ED$E|$ 4$D$ED$ED$M1 }QrMMUыUMϋMM;UUMv#ыU‹E9ʉʉErE)vESWWY }WSuI EM)PSQ谹 M1s E^_[]NUSWVYu)9AމEE#}Ex=ׁ9}w*U9CэB=UJ$ܺFщUu8 UH#AEwuWMrlUVRQٸ E<7PuWƸ CE})u)SVW諸 U JrbMA) u$JVWQt E<0EPuW^ CE})u)SVWu@ E uEQP舎 E^_[]tPU7 U1ɺ": USWV Yu)9AމM#EEx<ׁ9#w'U9CэB=J$ܿUFW菍 Mx#GEpHMr@0CSVW5 KrF)ƃ s]ډƃ$QVg uCSPW > ^_[]tP {1o8 USWV ΋I])9FˉM#EكEx<ׁ9#w'U9CэB=J$ܿUFW] Mx#GE^NrOuuVSW U EJ7D7rC)à sj$ÉыuQS& uVSW践 E7D7މ> ^_[] tP躋 `1T7P USWV΋ ]?F~)))G)9Љw 9Bω?}UG=r#BP x#Gt P 1EE ]N)‰MRPW, 9]tNE)ٍ@QSP ]t(F)=rQ)у s/#PQ轊 E>FEF؃^_[] USWVPu]H| D$| 9F)1D8t RHD 7DVӋ}1ۍMSShQVWPĐVt MuyVÍM.M1藈 ؃l^_[]USWV2]1Ey,toEPƅu{EPju0VtNE1}7PVӋ?ىэMVVhQSWPĐVtMu"VVƍM-M-M1χ ^_[]USWV`2]1Ey,΍Q$E}Pj:uEU@E1D E}tFE9Ht<11Eًt VPPVUu[EGD@)i9rȋE}tuFV 9tDSWP ^ MWR?LUE@;WRy 1 uM1蟆 `^_[]USWV M׍u졤2]1E1VPPu2DVt-S VSPu7DVt&E u3VM uVM uS‰ M1 ^_[]USWVL2]1Ey,tYϻLuS腉 VSPjw$DVt7]66OG 9t+DPSQ跪 DG!VSPJ1V M1H L^_[]USWV02]1D$(y,΍D$$|$ Q$Pjs8HV 1t$D$L$T$ }|$tsE9AtgL$T$11 I\1ɉL$L$|8r8L$QPj,V;D$u C;D$tTEFI)iɫ9r|$t$L$VN9tFL$ PR|$D$G;8;Ṗ 1 t$$L$(1 e^_[]UWVy,t$΋IEV9tDWPQ ~ PRI1^_]USWVP2]1Ey,t7΍E}Q$Pjt t_1Ɂ|?wA9rLPuKDt8}PFV9tDQWPF DF WRpHS蹆 1M1 P^_[]USWVL2]1Ey,t\ϻLESy ƍEPSVjw$DVt7]6'GW9t+DQSP訧 DGV SRG1V M1< L^_[]USWVT2]1Ey,ti2DžEucE}uV$Pj`tAt'1D uuteMVG9rSv 1 }M1蜁 T^_[]ËD$A(1A-USWV}΋ ^))ˉEFC))9Љw 9Bˉ}1ɍ]UIG=r#BPi| x#Gt PQ| 1Eڍ NjE MN)‰MRPWs 9]tNE)ٍ@QSPX ]tV)RP{E>ljFEljF؃^_[]USWV}DSjQ WVS(V^_[]UV΋ 2]EU1MDRVjP$VM1 ^]UV 2]E u1 Ms2 cVU@fJ _V MAQjRV$ jDjVѯ M1 ^]USWVP 2]]uE W1L$H)G0)G )G)G@SPW Vt.ۉt1WVVM G9ujDVuVF jDjV: L$H1~ e^_[]USWV2]u\$ 11艄$;Sh*VVD$8PhJVB9;tkD$tcM t\f9tV1ۉZQRЍ|$`WD$_@)G0)G )G)X@)@0)@ )@)WPD$PT$x jDWVk jDjV_ $1~ e^_[]USWV 2]uE 1MMQPvUt}DSjV WVS(V jDjV M1} ^_[]ÉUQTV]USWV2]1EEPQTt'}uW PWGt WLV1ۋM1<} ؃^_[]UVu~vjhfVP5- 1Ʌ9Fs1#~v6NjhpVP- ^]USWV$2]u11E<|VjWt C r1EЍM1PQRhRRRhV4݀V1@]1CHKpHMf0CKٸsDžtCf3EMUslulhhu }MvMWpPQV9rNpBP^u pVJu }EvEWpVPV9suVt>pW MPW;hlt}v+E)Hr {MЃ}vEqEjhVP ! tuh]1u{Cf;jjV$CK{Cf;ًlFNutt#jhfV:EЃ}U]1u{Cf;jjVCK{Cf;}FNZE9tU}vERP :EЃ}vuPVUPR>;,E9t#UЃ}vERP9 Eʃs71p0s MMM1To ؁Č^_[]Í4Pf>\tɺ)ʅtf~\vu)1ۃt}G_fEVSPMAYfjVEPSWTEU1xqAf1UR=E9}vU؍xPR:E9}UvUxPR9]ExMuEfxCKMMujj\!@1ۍ}عO_pfPSVuCGO_GfFN_Gf}؉jpumuGO_GfFNE Ƌ@EЍ]1ҹKSfPJ<F9~v6PV8E9}ԍuvUPRi8DEUM1DžlE}fEEMU utzMM1UV 2]1E]u-hVVM VA u15] ]u EuP5]VűM1k ^]USWV2]]} u1EEPjSWVVtM1_ ^_[]USWVMEY9v&9U )QRP D9t)Ɖ^_[]SWVL$\$q9v2|$ Z)ff99t u t)^_[VD$ps^ËL$T$ 9B΋08u^Éfr 8Tu^ø^USWV2]M1艄$y] SEu69؉)QRP˕ D9)W)$)$)$)$)$)$)$)$)D$p)D$`)D$P)D$@)D$0)D$ )D$)$3FJu9v f.<u@9rƋ$1] e^_[]USWVD$t$$xyq9t8t$ >|$~4?4$t($t$f;.tu9u 9t)^_[]USWV2]U1艄$B] {t)Mu(9;8 A9rW)$)$)$)$)$)$)$)$)D$p)D$`)D$P)D$@)D$0)D$ )D$)$3f.FOu9vf.< <<tA9r΋$1[ e^_[]USWVt$(L$0~9vtT$,<$D$ BD$DT$D$|$tFD$l$\$ 4H1f;3}[ttut<$A9rȃ^_[]USWV 2]E1鉌$x] sMuO9C88W)$)$)$)$)$)$)$)$)D$p)D$`)D$P)D$@)D$0)D$ )D$)$;GNu9B<t#If.@r/8T8u*f.DrL< t$1 Z e^_[]UWV2]M1艄$ Qs Eu 9B‹Vu& 8r8TtW)$)$)$)$)$)$)$)$)D$p)D$`)D$P)D$@)D$0)D$ )D$)$6f>FJ<u <t!D<uƋ$ 1X e^_]USWVL$(Qt$0D$,9BP9L$L$D$ |$DD$l$|$ 1҉t$pf.f;uttut$1ҿDDޅu$ƅu t^_[]WVt$T$L$D$ ~9B)9Cx^_WVt$T$L$D$ ~9B)9Cx^_USWV2]U M]u11EUMUMUMtEMjPQI uEEMjPQk @)MPWQVYM1V ^_[]USWV2]U M]u11EUMUMUMtEMjPQ uEEMjPQ @)MPWQVM1lV ^_[]UVEuPu V ^]USWV2]]} 1ECCwt-vEEوD$t$4$D$ 6iu2s3EEEsVjS 3vEMܱMeDEt+EuG}tA t MMvU BUMEtaff=4Vt&4V6Vf9wfuvuEE 2FuU @zv J9uEUK"E)‰Љ)v-S)9s5ML$ىD$$D$ g3{v{8 {v3PjQ} >M1t!G9rDf.|@u^_[USWV΋ 2]E1M~)rmV9tfsED$ $A~KwFrAGWSVt FPrK)˃ s,$ˉRS8J FM1N ^_[]蝭 USWV2]1E=]5]( ]~v6jhjjjjVV]@\fDžWhV7=,5]W NjF9> D$L$<$b];jH ƍhSjVFFfS誮 ǃv D$\$<$~PSV`r f~NFv19CfFf|G\9D$D$ D$&V$.5]dz) s-D$D$ D$$V$ =G Fv 4V,V $VfLxDx xfDx5]( ]Ax~rB\FN)ƒ s-D$D$ D$$V$ F;P Vr6 4V,V $VfLFDF FfDF]xvjhjjjjPV]@w ]1ۋM1J ؁^_[]̋D$9]~1Ë ( ] ]UV 2]1E ]tE UHUEEP1+]OM1J ^]USWVE] ΉA8VA FXpXIXFTHjP=!F@DXF@HLF XjE jl GF~@}FFFF F(F$F,F0F8F4Ft$A00~N0A q0EuP uك|u@L8U A 8tA00~N0A q0 ‹PR 1҃uR@L8T@q ‰E>t$A00~N0A q0uE@uP uك|u1҃uUSWV2]1D$HD8t RHD 1DWVP] Ƅ=jPQ ى))99v v 39щv 9r 1)v@ 2PRQbb WS\ )VPS\ ]DžDžƅCKvR9wR ˉvPVa /9vT$L$D$ $k Nj]GCOKGGr3prQ)у $щVQ1 DžDžƅr/prQ)у sb$щVQ1 r/prQ)у s($щVQL1 M15 ؁X^_[]赔 USWVP΋ME}NFF8VF`pXFF\HMN`jP F@DXF@HL FXj0 j CF^H] F FF$F(F0F,F4F8F@F$щWQ/ E؍EP豄DM13 ^_[] UWV 2]E u1Mt f8t31f.f|HIu}EEE11ɍ}QPW E}v}PWVF ƋEr,M܍xrQ)у s2$щWQ. EEM12 ^_] USWV΋}+qF@DXF@HLNFXXFX^t!KtPtjS66 XVv t V6 ^_[]UVA<tDF tN0FN, N )=rQ)у sS#PQ- F FF,FF F0F8f<^]̐ USWV}XJX^4t!KtPtjS)5 t V5 ^_[]USWVA<V}t/΋I V0 t&~"KAF z8EN8!1V ˋ)ӅɉUDٹ sMQ5, >?s rA#MP+ x#GSuWU LN8N9N MV0) F<uVN F89N+U)ЉF 8FF,8F<t-rMA) s9#ESP+ F<F~^_[]ËY +tA<uY89B9vY8+AUVPtF,FQ^]USWVu] E] uωMEfGtWO, ~Nʉu9ى}։ωuWPuVS M)uuA,u)8A8$fPt MAMظtE U)^_[] USWVu] σuU] }G MtTO0 ~KuU9ى}։ωuWuVPR Mu)A0u)8A 8ω f֋PR tMFظqME U)ʃ^_[] USWVq YD$$T$0.;|$ty89s i8y8q |$ 6)tWt\$4$cT$4T$4u0T$4$D$tkT$$tb\$4$11|$uuFT$\$)4$T$(D$4\$,9r tJt|$tt;u7D$$@@ @@@^_[]$4D$4t|$t|$D$ 7)y,D$4t,t(y Ai0?D$$}l$E)A 0A08D$$XrUSWVYT$4y t$8T$,\$D$ t$0tY89s ÉA8Y8i ߋm)l$9r(׉D$ t1D$Dt|$ tD$Dt|$uD$(@fD$Dl$|<$t|$ t,$|$/)l$y,\$DD$t"ty AY0?;($A )߉A08D$(p@ @@@^_[] ̉ USWVX}΋Y4t!KtPtjS- t V- ^_[]̸̸̋D$@@ @@@D$@@ @@@ UVXQ }t V- ^]UWV2]u1EFFA<u.Q t%AU;Q8I8UBы:)ǃv@ M$uFA8t=A I,9)ǃv ML$D$<$Y~WPVbS >M1( ^_]USWV 2]](V1EA0AAAA$A A,A(j# j G~0^8F<EREPj R MÅtPtj^@} ~8t!t V M1' ^_[]F jP萚uUV+IXQq }t V%+ ^]USWVL2]uM1Ej =^P]u1Mj =^u^@^^M =^F9x vH4xt 9x v@4ۉu}j" ƋE@t HEV}PEF~XP( EMNFV P5P]MO M16& L^_[]USWV΋HD8t RHD uiDM1 4^_[]U=]u8jVhVPVt=iAt jPjjjo]]USWV2]]1EVI:?jF] ^d, ;]dždždžh0  @dž dždždž?j EEPjdždžM1Z ^_[]h]n ]-j h=]h] USWV] ^d, ;L5]E=]u*}u] h  ÉPC=]V4V^_[]h] ]uj g5]h]7 rUWV}t&΁VDWVtjD WVt ^_] j  j USWV2]1E } pVÉDEE|<]썍hPQA 8wh ÅDÉDÉCECC hQP6A =?t]@_PPR t-4VM1 ^_[]hV  hPW@ W+lhVW@ W l j USWV2]1Ef΋}CjPSC# 4D?9Ήt9 ]9_u9G hPV? E 9GjPB# ƍ 9|t9uH@9tLG'L OOHhWN S4VM1 ^_[]hPP> V:j j V,jhPV~> Vj j ƁUSWV2]1E΍@@}@jP A# 4\ f.9Ήt9v7w1 CKMf.DJuNfnЉU )ƒEfpF uE9EtJuK ^_[]脿s USWVyu+9?G=r#BP H#MAtP EE C9P})ʉFs}i}uփt19s9vFu]u<1f.LL9uuM]9Mt)14 49uu}t)K)rP)Ѓ s-#QP M  CK^_[]@r USWV2]] 1EEEjPX;#GW w u9t4426f.D9t4v;^uE‹JJHOhR 1Z]39t0S2V Q^QY][^]SWUW 4;]t'9t5] 9ٍUt*O 4@]G ]؍UG xVWfVfV\\ZWZ^.wrGO 6+G 9s@|MMSMUGERS}FGwG9t$p fDGCSPEP9uuދ}7GM1 ^_[] UVIʉƁ u jh@BQP= ^]UV IʉƁ u V(fnfnfbfD$l$\$D$^V$$e^]USWVPq5 u h]Wt'j( mjjVh]5]^]USWV 2]1EM1~EuP|E;Ftx(}j U@@NjBzv wIObEMԹ=BȁMrA$P @#H AP MAQuP- E UM؉GOM܍ERPEx(F HE܀y u+19YC рy tM9t ;XCȉMܡ] ^d, ;r]Pv/F$trQPPE9F ts^Sz ]^j  UHHMf@ IH@P@PuR" ExV4Vr?W'; ~^ V4VM1K ^_[]H؉]f19JC‹ڀz t]9L;HAh]$ ]]j.h] USWV Eq~ E PxEUvEˉMf~ ~$]vFf.DF]9BQuP 19ߋ]EȅI4΀~ tM9tHs {$vCCU zzv9BQPRs 19EȅɋMIˋE^_[]USWV$2]}1E-9~ u ~s\\F Pz tk9FPz u/If.f19JCڀz t9t;OCNjxr?V4VM1& $^_[]19zCʋڀz t9t{9yG9mE؍NEEEUPRhEЋx(r?EwM؍XrQ)у s"$щSQ F9c USWV2]}U 1EM1^{ j, MPPU f@ J@BH@ BB@(UP@PVREGM1 ^_[]BzUEvEuf.{ {$uvCf.DCu܉9BQuP 19uEȅIˀ{ t;ut~ ~$v F }FM YyvM 9߉BRPQz 19}Eȅ7GUSWV$2]uU1EytE 9t!9t2X x$vQ@OuR7jp x$@HZzvq y$MI@}zzEЉMv9EBVuP 19Eȉ؅ɋMBuЋu ‰E܀~ ^@Zzv 9މBRPQ3 U 19]EȅSRu jI9BRPQ 19ދU]EȅSRux tFx t=f.Ë@x t#90t{ u;u Ë@x t{ ts {$vCC9BRuPQ 19UuEȋE܅ɋMx|19}VuQ U}E؅ۋ]xESRjP/EuM AΊH ɈMt9Mԉf.p~ u1;Ft(Cx MRuSjM@Ƌx t9tH~ ~$vFF]9߉BQPub 19U]}Eȅ<}t(SRu juV2M1 $^_[]SRVMRuUSWVPQu\tEB~MQF9tU t09u2p0p p9Bur7~ }F V9t{ t1;>tG@Z{ t;~t[fC @@ pGGx upVEW9pt;N9qAE0Fx upVEW9ptgN91AD]8w~@ }F@@ F@P H y uAHJ?9Gt H9yDY87~@ }F@@ F@JJy uAHJ?9GtH9AyEBPNv~ F EM@@ Eȃ^_[]VhV USWV2]}U]1EM܋1Fx t;0~ ~ً[uyMvM Mf.Dx x$v5F} u59߉rQPu/ 19E5F} t9rQuP 19Eȅ4ƀx ztf}U]E;0&M܍ERSVjPEx t!Fx  %f.@Nj@x t]1ɉS{v_ $M؉EvOO9ډЉډ]BЉRuQ" 19]EȅxS]C$r0KprQ)у $щVQ j,S E8@$E؋M܍UuuVPRE}GM1 ^_[];0t ;8u Nj@x t Y UWVuF$r,NxrQ)у s"$щWQ j,V ^_]Y USWV2]}U1Eyt+u 93t*9tEV9ЉE~ tJ~uR1;FuuVjWdF֋P;uuPjڋx tFx t ?f.DNj@x t#90t u;8u Nj@x t tE9GsGx uuWj}9sa~W t,f.Gx u!;xtf.@? t}9t];Xst:uuVjEuujPEM1 ^_[]uuPuuVjuVM1 USWVPQu EB~MQF9tU t09u2p0p p9Bur7~ }F V9t{ t1;>tG@Z{ t;~t[fC @@ pGGx upVEW9pt;N9qAE0Fx upVEW9ptgN91AD]8w~@ }F@@ F@P H y uAHJ?9Gt H9yDY87~@ }F@@ F@JJy uAHJ?9GtH9AyEBPNv~ F EM@@ Eȃ^_[]VhV蹾 USWV2]]U1E1~ t;t[x MtgXMM f99„uֈ< tڄtV]M};uUuWPjR9E]z tx |DӋRz th}1҉ËK;s#MҍuuWPRVE]Cju E@M1= ؃^_[];tf;u  t{ XuUjup ]USWV$2]]U 1EM؋1~ BzUEvEuf.@_ $uvGf.DGuԉ9BQuP 19uEȅI<π t;utR~ ~$vFFM YyvM 9߉BRPQr 19Eȅx ]3C.]U M؍EUUuPRhVWV'ECM1 ؃$^_[]USWV uj, Ë}CCfC 6C C$F~v6U ߃wNO]E=BȁMrA$PH @#H AP/ MAQVP E U MC K$MC(SWRuV ^_[]USWV(2]1EAHxvQP3Dž^P 9u!FPvv RFHxvQPHEEE Eԍ}؉D$D$(V$)eVWHE)M؍prQ)у %$щVQ FHxvQP;HRP5P,~Eu"UЋB+IN IN DFESEt*ǍE؍UԉPvuvv vvRP]ԅufUԉuRP]ԉv)SPS2*NjE؅YM19RPRC\NjM1{ (^_[]O USWV 2]}u1E9~ 1ҋ  hV]9|I='r '1 =u uFƸEEE Eԍ}؉D$D$RV$ ^_[]USWV]S#VF Fj( Džt SO 1PSWBuu ]SRPaN ~ tjj( NjF @uu$Sp0`N~tj^_[] USWV02]*E u}1D$($Բ \$D$x^)KD$W*$菲 D$ \$ $_;~xVD$ L$fnf\\^X $虲 $Բ \$,D$9ǍLE<0KuuN)IhV3eL$(1 e^_[]USWVPPutG]11f.EMWPL9EELuGPPM9ljr1E@ H "dM4 ApP )t~ O Mǃ^_[]̋I D$I ̋A H A+HËA HQUWVPP;Eu?F UH I)qrx9uU r|91^_] UjuP]UWV΋MhVE 9ʍRO1I~N PWRW ^_]USWV}j ËF ًPp r2]v PvP^_[]USWVuj[ ËG ًPp r2\w PO SPOSP^_[]USWV}j ËF ًPp r2d\v P^_[]̋I `̋I `UWV,2]u1ENF)ƒs*E܉D$D$ D$V$襺PVrE܉EEE
Et$$D$ Er.M܍Pry) s$‰T$ $ NF)ƒs*E܉D$D$ D$V$ PVr6fDE>PQR \$t$D$ L$f.W(Rƅ|$ uWPTD$(t$HL$4)D$PD$$ȉىD$LW$VP\$$v$}wW)9s"$T$L$D$ $$_ru>PQR }D$9$st1f.GO9s&PWrf 4f.D $D$D$ $;O$C;D$r\$HL$t$ u+L$PPL$H9sL$FPPL$sVSPX}\$xt'D$xL$LL$|$$L$t$ ؉ً\$T$$D$DD$(\$4fnfnfbfD$pl$p\$hD$h^V $L$|$ D$8D$|$ tBfnfnfbfD$`l$`\$XD$X^D$(<$D$D$V|M AyvM wW)9s'$T$L$D$ $&D_ru>PQR D$DL$4\$t$D$ $L$r0$xrQ)у sU$щWQ[ D$PL$LD$(L$$|$ GPP9j$1 e^_[] = UV2]E1UEEfE UPRj[Er,MprQ)у s#$щVQ M1 ^]= UA tx tAtx t@ Ht] j2 j3 j4 j5 j6USWV 2]u1EAEt PA 1]ESGESG H Q)JrPUSG H I)QrtuuS轻PPES諻G @ @ ES藻M1 ^_[]USWV]SVF Fj Džt S@ 1PSW3]SRPWQN ~ tjj NjF @Sp0(QN~tj^_[]̰USWV] ΍CPRLNjSPL)*ML*^ $$e^_[]UWV}u PLPW^_]USWV2]u1EP ]PSYE}v]؉PSjhV]Er0M؍XrQ)у $щSQ G H I)IrPRjhV\G H I)Qr\SjhV\PPPj hV\M1 ^_[]9 USWV2]}1Ej ƋC Pp r2'Os PsPP ىu]F@E PP11fMV7JE]j(? VY}VPLPjhV[PPH9tMFPRLPjhV[ujhVt[MX]]^CMFPP9YMjM1F e^_[] USWVH2]]}1EEEEW= ƃv EM؈D$|$4$vuEVWP D5EM ]ЉEԉMuuEEE}}؉vM؍Uԍu̍]RSVPQEԋMЋỦ}EUMEEMEE VEƋEr,M؍xrQ)у s%$щWQ M1 H^_[]7 USWV u$]($" NjE \$t$D$ED$ED$ E $ VGG$, @@f@ GE8 ^_[]̸USWV] ΍CPRLNjSPL*M)*^ $$e^_[]USWVu PLwVz tl9E@@{${([=BF$P @#HMz@19BMڋʀz t9t|;CL9pu PLPuVMtKH"FPO MOQSP E xp^_[]9USVuPLNqʀ~ u%ʐ19FM֋4ހ~ t9t;BL9^[]USWV u] $ NjE\$t$D$ED$ED$ E $Y VGG$,c @@Gf@ E@V8 ^_[]̸USWV u] $ NjE\$D$ED$ED$ED$ E $ V> ^_[]̸USWV2]1EuF @ H+Ir4}MEW迲F C@ H+I9rۋM1 ^_[]U*E$$]UWVV΋ItjN }tjO$t V? ^_]UWVVI~wFxF8FxFj,v VNtjN }tj#t V ^_]UWVj? NjF@P1LWvv ^_]USWV}$ ËF$ M $L$ ^_[]USWVP} ufΉMf.wG(r/OprQ)у s1$щVQ uj,W { t^_[]0 UWVj ƋG@PKN)Qrv~xV*G *O% V1fnf\fBfnfnff\\YYX^X,|sċV)J hV )L^_]USWVu$S ËG$) M $L$ VCC$, @@f@ C^_[]USWV M܋M2]1EMP :E܋p,V!E1ED]f.19AMً рy tM9t(;C|!hf.fEUԋKy tj,A MPPf@ P@(@$@P@PSEP]}}ԍCEW3 ƋC(9s& ED$|$4$Mv)f.Ers$VWP 7E܋}pT G,M1" ^_[]USWV2]}U1Eyt+u 93t*9tEV9ЉE~ tJ~uR1;FuuVjWdF֋P;uuPjڋx tFx t ?f.DNj@x t#90t u;8u Nj@x t tE9G}Gx uuWj}9}a~W t,f.Gx u!;xtf.@? t}9t];X}t:uuVjEuujPEM1 ^_[]uuPuuVjuVM1Q USWVPQu\tEB~MQF9tU t09u2p0p p9Bur7~ }F V9t{ t1;>tG@Z{ t;~t[fC @@ pGGx upVEW9pt;N9qAE0Fx upVEW9ptgN91AD]8w~@ }F@@ F@P H y uAHJ?9Gt H9yDY87~@ }F@@ F@JJy uAHJ?9GtH9AyEBPNv~ F EM@@ Eȃ^_[]VhVi USWV 2]]}1E1Vz t;>tW ute_E f.@׋R99„uԈҋ׀z tڄtV];>uEuuWjP=E^x t Wz $f.Ë@x tfu1S;} UuVWPRE]CM}G(r,OprQ)у sl$щVQk j,W` E@M1 ؃ ^_[];:t;u ӋRz t{ L( UWVuF(r,NxrQ)у s"$щWQ j,V ^_]3( UV 2]M u1Ew)$VFF FOGRAHISTfFMFFFNOWNUNKNFFFED$D$ V_FFED$D$1V$AFFED$D$CVFFED$D$TV$n )FFF GRAMFSTOGFY_HIDUMMFM1 ^]̋T$pVP@̋D$ A̋D$!A1UWV 2]1EA yEEEWh+ ƃv E؍M܈D$|$4$muEVWP D5E܍MPQ` Er,M܍prQ)у s=$щVQY E؅t uPPM yM1 ^_]% USWV$E2]uH^E1EYVX V,E~i]f.FNK9u5ED$D$ D$V$这fDPVrf-FN+}9uED$D$ D$VPVrfO2e$HNf.Df ~5FNO9tPVrދڊED$D$ D$V뛋M17 $^_[]UVuu hVV[ ^]UMED$V*L$$^E D$ Ab]UWV2]1E5]wAh]9t*]]h]jh]h]轌5]}X ]whh]tQ ]]j(~ @@f@  ]h]jh ]h]E ] ]EUD$ |$$D$DEx$xr?V4VM1 ^_] USWV(2]}U1EMԋ Ax t;1~ ~"ZzM؉Uv M M@x x$v5F} u59߉rQPu 19E5F} t9rQuPJ 19Eȅ4ƀx ztv}UM;16ED$ET$ t$D$Mԉ$Ex tFx !f.Nj@x tU1ɉBzE܉vW $MЉEvOO]܉U9BRuQb 19]Eȅx E8@7EMD$L$ Mt$UЉ $MԉT$NE}GM1x (^_[];0t @;8u Nj@x t ,USWV yeff}j({ uƉHHf@ @ @$Gv?VwOJU_EU=B؁rC$P @#H CP MMAQWP E U }F ^$B9~tM t7 99u1w 1 w 9yuquy Uq fy9t{ t1;tGB}_{ t;Qt[B}DC IA H BBx uHyz}79Nt;A9HpE0Ax uHyz}79NtdA9pDZЉJQ@ A@@ APrBx uPBF?9Wt B9xD7VЉ Q@ A@@ AP2FFx uPBF?9WtB9PxE7VrʍAIy q EM@@ Eȃ ^_[]hV赆 USWV 2]1Ef.F(r"F(N$<jvvW?`t^[EfEP[t1NjE;FujPvW_u_1;}t1t&}tZ1t tu#vv \t~tWa1M1l ^_[]USWV΋M 2]E 1ꍘT$VF^~ FtLFFt8FH H t-H Ht%H H$tH( H,tH0;N u 1CNAWů$F@ Wϯ$F@(FN H0aNj PQl ^ ]tAI 1Y1ɉCK WS$CfD(]tFL$1 e^_[]FUSWV2]1D$]t*}tuKDžu$t Dž>tGP8;W sh_D$PT$蚮D$E UL$MU TLp RT|LxT$DDGGJH8VFL$1 e^_[]USWV ΅N9H v{@|htn]KxM~9y vJAD8ht @@f@ ESPEMD$ 1 $|$D$MYE} MtI(EU؈D$ <$D$T$A#s(vC(pC(0C(pC,1MXM1 e^_[]USWVE1΋yAfS4 PS${~~j(4 U @@f@ F NFJNB^_[]USWV$9D$B(J t .{k ـ tY{ u;Kt ? ttn9u΋D$J)Dy tr~ u;Vt ΋ y t;4$u^_[]USWV2]1Ey&ǃP胳 ƉWPt`Eu0jhWjVVtXÍEPWuSuVܐVt.9}u)M]jh]hV#1hjSu8V1ۋuV M1 ؃^_[]USWV} uWjV* >]C}~F9;}K {$w CrQPV C ]MfDG |F)ȉAC,AC(09tO~$Fr^ QPW Ny tFx u;pt ȋ y t|_]9C(uU)ȅD)щ Sz tKy u;Yt ыz tUlj9 ;}1^_[]USWV2]1E=D]uhD]hV4M1 ؃^_[]USWV02]]u1EM؋9Oy t}I] ύIt4$ $ɋ πy tċ]}ttM t99uG G9yuAE{ }ЍK s9t6z tj;;u MSPߋGM@ G@@ GpPQVz t1;{u MS{PߋGM@ G@@ GpPưB IA x_G{ K ]EM@@ E^_[]hVr USWV]j0ۥ 1NNfF ~ N~$S(~(~,P褥 @@f@ KN(CF,KN,C^_[]USWV02]]u1EM؋9Oy t}I] ύIt4$ $ɋ πy tċ]}ttM t99uG G9yuAE{ }ЍK s9t6z tj;;u MSNߋGM@ G@@ GpMQVz t1;{u MSMߋGM@ G@@ GpMưB IA x_G{ K ]EM@@ E^_[]hVp USWV]j( ǍOWW1fG W W$S^_[]USWV],V^FhjP{ P蚢 S耫fnlj~LfpFuF I1^_]VT$ rr wL0t^`1^UV}t V# ^]UWV}1ΉAj衟 @~^_]USWV 2]} 1EIt-ja ÉWcMEHP61ۋM1ң ؃ ^_[]USVy u΋Ijv"t F 1ۉ^[]USWVP]9tcCFC F P1 ljP3W @ Ǎ|MP蘞 KQ+M8L HF^_[]USWV΋{t*W謦 9uj6d ^_[]UV΅t P{ Ft Pf ^]USWV42]1EEj @@f@ EuЋ9t>}ދF E܍EPEPEHVp63U92u΋M9 ru؍4uԋp?R}؉Ẻ<1@E9thϋJU@)}ĉUvu؍TuVuVPRMU߉ȋ+E;UȉȉuԉuEغ%I$0}̍vҋw@Ѐ~ tWz u;zt 6~ tu9UtЋUЉu1ۍMM1 ؃4^_[]USWVϋEu 1ۉ}EUDDDL L|uTUML)rPxuu| E)ΉEߍUQW}V Muu+EDMIj1^_[]UV2]΍U1EP0R?j6臛 M1 ^]UWVEΉAA h菣 P OxF^_]USWV1}]} ۍ@EЃt8EMtPu|Nr]Ru h14vfT ]ȋN]rRu uSPMGM uȃۉDNruuRPjSuIu]Ru jPS3trGf1^_[]USWV$2]11Ey E }΍M1҉M؉YAfEMP;1Cf.~Gf/t}f?uՃE؉PEPjRuuu:EԺ f*uHukE؉PEPjRuuus:f?uLfCE؉PEPjRuuu1ۍMDM1/ ؃$^_[]USWVy t1G1ۉ΋M1ҋE} C9]9tu"NRPWNRPWt^_[]USWV52]ϋE ]U1u79u)9u%rp0pGF9tB֋Pz tY{ u;Kt Ӌz tPEP%9uË]ЉM1$ ؃^_[] USWVE uPz t‹Z{ u;St Ӌz tP?Hψj wX jWM ^_[]USWV} u6ΉwO臈j w jW { t^_[]USWV2]] 1E1Vz u619BCʋڀz t9t] ;AruF7] ΍EURPh@V3]PPVSvuFM1њ ^_[]USWV] j NjGGfG G GP @G^_[] USWV2]]U1E1E9AtHu 90tI9t]N9so]ى3uGE9BsQB]x t#uuRuR7;FuuVjkFH; siuuPTN]9sTu^K tSz u;ZӉUt ڋ{ tU;]t;Bst@uuVjS>uuujVgM1M ؃^_[]uuRNUSWVPAu=H$ }@MAF~99tU t79:u2w2 q w9zur8 ]O w9t6z tj;u MW`>CM@ C@@ Cp=OVz t1;_u MW=CM@ C@@ Cp>Z IA X{C O _EM@@ Eȃ^_[]VhV?` USWV2]]U1EE9w~ t}GMM 1ۉ}F99uň448^ t܋]U}t3MEu;>tMMމDMڰ uRPWj1Iu;sMRVWPuVCMRECM1 ؃^_[]UVuNj vv jVk ^]UWV2]E1UQq9szyr fQfDQUT$D$$ M1t ^_]USWV2]1EVt~M1Uy9A :QWRWWVjPV#uPu]ShWW VuVu1Sj PP VuLV19 E"M1辕 ^_[]USWV2]M1E1AAfjhBV_}uMjhrV`HV]PhVjSmS }؉PS`pVPVtbl1ҍtQA QRVRRSjPV%VËEt PVtL}vTER$}v}؍h1VhPPPWV] vLVtPlLVhE؍th1RhQQQPVu hpLVSVt-;t!jh> jWj3W1  Mp;M1 ؁Č^_[]USWV2]} ]u1EuEVjSWjup0A M1HN1蕓 ^_[]USWV2]}]1E1SPPju V3t[1HBQ SVPju VuFFftWZ PWJ]WÖ GGfM1ߒ ^_[]USWV42]Uu1҉EE MEfEtY}PW]؉9GOGGfCK9j\lU}RWG9OvU]؉PR]9CKٸCCfFNJ9NFfM1軑 4^_[]USWVx2]u1ۍ}1E_GfV PV[9_ujWWK=&(}v}؋] jhVWVA tYu؍}VWk8GOG_fFNR89^vu؋] MWMWMWMWMW9yDž| $8V1۸V_MCSPRSH1MWSPW5MSV_PPSMWSPWDž|+1'11MGWWSPMWWS1P}1ۉjVSSMWj1ۄ}jVSSTMWj{|t}1ۉ|jVSS tfMWjK1ۄtU}jVSStBMWj't1|t$}1ۉjVSStMWjt1ۍMHM@M8M0M(Mb6M1 ؃x^_[]UVujVJV=&^]UWVuE 1~~PhVjWt$hVjj t"jhVjpjhVjj^_]USWV(2]}1ESAMS81FVVVV1ۈE͉ShVSVE΍MVVVVEωShVSSq}}}]}Wjut~VjgtpWjYtbVjKtTWj=tFVj/t8Wj!t*VjtWjtVj1ۍMIMAM1 ؃(^_[]USWV@ 2]EU0u,1L$81D$0|$Wp0D$(ww)sC p0u\DSD$,PWVuu*E M,U0u(u$u ut$DVW1M0M4F"1ۋL$81% ؍e^_[]USWVM1]ס2]1E3Sh(VEVVuuuuVuu VWPx?Fpu}t+u V1jSSuVWPĐV"E WV"M1n ^_[]USWV@ 2]EU(u$1L$81D$0t$Wx8D$(~~){C x8u DSD$,PVWuu(E M$U0u juW|$DWVM(M,G"1ۋL$81蒊 ؍e^_[]USWV@ 2]EU1L$8uzD$410PhV\$D$(Wp0ss)wG u DWD$,PSVuu'uSD$<M"1ۋL$81؉ ؍e^_[]USWV@ 2]EU1L$8uzD$410PhV/\$D$(Wp0ss)wG u2 DWD$,PSVuu&uSD$<M"1ۋL$81 ؍e^_[]USWV 2]E}$1MulE10PhVz]3VjVVSPuE 0ĐVt4]EuPlSuuu uU."1ۋM1w ؃^_[]USWVq+urf} u 9B{r9BȅtU1S]sf9ruF9u191J9B L^_[] WUSWV2]1EQ+E΋I})9] s6ED$E|$\$ <$D$M1菇 :^ruuqu 4~u9މv Q;M r 1+M v΍D {PSQ 6Pu S[ E) spWPQC M1 E^_[] VUSWV΋I]E)9Nˋ~M؃=w E)9w 9CȉME1ɉ}IPDH=r#BP΁ x#Gt P趁 1E^]FErhMPQW\ E GEMPuQ@ MEUH)ʋMEET HRuQ CSuz-GPVW EGEPuS UEM)F KTRPQ >^_[],USWV 2]E 11Mu4}ujejWSSt MVjÍMXM1 ؃^_[]USWV 2]EU,1Mun}u(U$ME] v?jVRu uQPW9]EuԍG$tWwى4$褜u0G M܍DE؊ED$ $ىt$D$G8OPuԍDE؋?9u}tEEMM1d E؃0^_[]USWV4E U52]1uy rEuоt1v(rỦE EЉEA9yEMĉ}1ɃMMMP衢E PEPV99t^ލE؍NPtFFuЍM QMQPwt~9uFMNHMI}ȉVu697uEEԍM؉E sV=N9uE̋MԳM1c ؃4^_[]M 1USWV2]] U1ۉEt;8jhSjWVt,ƍEPSuVWܐVt9]uE01hjVW8V'M1b ^_[] USWVh2]E1Ut31VFjhCVh*VWVhCVh=VW {8jh hjWVsEFPEPJ]%OEj@hVP}WVǁu1ߋ]F FhPh] MVSWCÅuREPjVWuܐV*t8}u2EPj uWuVEhh]hRV1ۋM1ua ؃h^_[] j USWV2]}11Er@;uFFfj hV\+WÉyM1` ؃^_[]USWVuMFD)s1I] ;>G GGGN~vVVQRPą FfDG^_[] USWV Eu}x t O hV GHW0\E)s1M 1ME UFGFGPF FO09Cʺ9W4vW W QRP" EULDM1ɈHOH9C9wLv88uQWP EM1҈TF ^_[]USWV2]1EhVV|t>8x@u;|djZ ^ 1ҋ P HXP`VjuZ ^  |F1҉P HXPVLjGZ ^ 1A QYA| V1 VP HXPVFl9ZЉMhMP}EEfEj hV(MWY1ۿ}E MU+AI pU9}}v}ԋ]x9UL tvUM1W1PtpxRW|Sx)EM‹@ DM]B B@P PV(1ۍMMMMth;l1M1jM1&] Č^_[] UWV΋  IF;t8P ;>u^_]UVuN@ N(N9j\VJX ^]USWVPuM^j\W DžDDǍO7Gu MA= Yt@AMy;^_[]hV$ UWV}W` N9Vr69uPWVq 1^_]US 2]1EhHVVM VAh\V* ] MhV ]MhtV ]MhV ]Mh*V ]MhV ]MhV ]qMhVt ]WMhVZ ]=MhV@ ]#Mh=V& ] MhV ]MhV ]MhV ]MhV ]Mh(V ]Mhu^_]USWV(2]U} 119׉EbЃWr11ۉ9AUEMEAE11ҋ։]̉Ej$8Q 1M܉CC]EЍEP1b}tOWVY }̉u؍D7T7uPRuSM؋UDϋM@KMKCʋUEC FCFCFC N Sh5B3VEԃ@;E"v=,]V1QQhSVWPĐVtEM1ۋM1T ؃(^_[] USWVP}1ۉSSSSVPbuv?VSShuVWPĐVt;} SSSSVP(E?pVSShuVWPĐVÉ؃^_[]USWV@2]U1҉D$8tUJYuAW)F )F)F0z VWR4  MAXqVL$81S e^_[]USWV2]u1EujVdPvu .S 1ۅuȉ^^^^ ^^^ ^^$XMQVP聪 oX1ۍ`\tp|x]]]]]]]]]hE@lIRV\I< $VhshfhYhLh?h2h%hhuhuuuuuuuuR`t@Ep PhU\xudPu w uuj#U1ۍEPV藨\W^QM1Q ؁Ĝ^_[]UWV}wtNwpV$U j WL ^_]USWVuϋ^j L DD1҉0u HHOTUUtUAOB^_[]hVE ̋A@uF)=rO)σ s8#PQ= EM U I@ ʍ‰NF^_[] USWV ˋE s)ȉEC)F))9Љw 9BΉʋE} UEԍG=r#BP< P#B P< ‹M}UʍʋKE9t'u9N)Bs/}9tDOu)Fus<}UʃT9sL9v@tM܅ʋ}T9U/9XU]1 Ѝ<אLL9u9U]ut1)fD9uK9A)Bs UU}UuT:t9UsNjED89vЋUNu]]Uuuԍt1D}LD ރ9]uu]9uty)1@0D29u]U]1 Ѝ> ؃^_[]USWV02]M1ɉEEPQVtsu1ۍEȍ}ЋM _EċEGE_ ___GEPuWjVu-EȉEjWjuVuLV 1u1ۅt VM1p= ؃0^_[]USWVL2]P]1E;W3S]WPjSDVt(>t7}v豼jPWS!V=Åuh;V1V M1< ؃L^_[]USWVL2]L]1E;WSWPjuDVt"] }6SjWu<1ۅt VM1P< ؃L^_[]USWV02]} 1ۍM1EẺ]ĉPSQSSjWuVuuEuЋM^FE^ ^^^]8FEPSVjVt uLV1+1PuPPjWuV=LVuuׅËM1; ؃0^_[]UV脛 { VFjV^]UVqV6I 0^]USWV(桤2]1F ;AEFFjhVP tN@)FNjj.FP NPjWQFNFNr <-inluF;^[9tMf.EtFFvFGF FPFP;u' 9u^C 1+8N 1): e^_[] jUSWV(2]M E1T$ y|$T$|$ 0Ht$t$ΉL$Ã<L$1uw *tn\t ?t5/u#|$/t#\tf.f|$:9A9L$ uʋD$T$T$D$)ʉD$|$))ΉT$|$ \$)ω|$|$)ω|$|$|:*uD$HBuT$?9L$T$t1\$f.fD$PSu|$t$NGu1*&ʋD$t$ 1ۉT$T$))ʉD$t$T$L$ 1v8 ؍e^_[]USWV2]u1D$1to1ۃufD$Pd+f.WJ+$L$+D$L$ 9ø| fDjh t1ۋL$17 ؍e^_[]UE MtEt uP豐]USWV,2]E }1EE$D$ D$D$ED$ED$F}tG-U'u,҈f.Bu|)u9yt,@.xQ҈Ptȃ@WGu@eEPU~ G+E G-1+EE ֍C9~€0WSr.f.UK)ҍE€0G} $!M16 ,^_[]Å~Zۈ UFJxUtf.Dt^@.҈uɉǃ}Ph.@y0@Ex҈bfDBuF }~f.D0GMUVty| V:^]1SF 0]40]1^]1TUSWV1qS40]tK0]$P荻Ɖ^~1SFF ^_[]Ë58 ]`])ʉʁ wΣ8 ]USWV5P]ӉσwAhP]t*T]T]~hP]jhT]hP]25P][4]]t E4]D8 ]`]) w 8 ] j x@E@P]wAhP]t*T]T]}hP]jhT]hP]P]S4VE@@ wwDمt*]tPE17!1fEۍyEEÍOEE؍AωEEu @E]P11ɉUfEyEEӍOEEڍAʉEEu]tU@ ]JA ]EEىM ׉xXÃHU ك SC}0tM5)E1TGG֍pG^GGލ=?sGGxE @tFE)ى^_[]USWV,ЉσVO11ۉUEEMEDeuȉ։DuC;]|ދM}tE;H}UfU}j@EX P]]wDhP]t*T]lzhP]jhT]hP]T] P]]WىuU4] 4]#P`MHXE5P]wAhP]t*T]T]yhP]jhT]hP]p5P]V4VMuAA A N VRQPT ~|V5P]hP]RtpT]T],yhP]jhT]hP]L8 ]`]U)ʉʁ Uʣ8 ]5P].V]C 0] 0]5P]wAhP]t*T]T]}xhP]jhT]hP]'5P]V4VUu؋EtGxC`]Å}U=X]wAhX]t*\]\]whX]jh\]hX]=X]AU`]=P]wAhP]t*T]T]whP]jhT]hP]B=P]T4]t 4]C8 ]`]) w ؃ 8 ] j 荳CC5P]wAhP]t*T]T]vhP]jhT]hP]5P]V4VC CqC`]5X]}wAhX]t*\]\]xvhX]jh\]hX]"5X]V4VU)fV4V}ԋUE5X]fDuf.U‰ƅt|W耲Uuԉ=P]wAhP]t*T]T]uhP]jhT]hP]G=P]RF 0]40]5P]wAhP]]t*T]T]7uhP]jhT]hP]5P]V4VUu uԉUߋ5X]wAhX]t*\]\]thX]jh\]hX]k5X] REG1ۉE;GE_5P]]wDhP]mt*T]T]GthP]jhT]hP]5P]]Q}0]E܋0]*P>ËE]܉Cs]5P]wAhP]t*T]T]shP]jhT]hP]I5P]V4VU܃}JBB ~*Dz9G)ЍDPjVX }EЍtPxu}tRM11UEEE؋U}$ 4uËE֍D;ErӋEUȉ4u9rŰEЋM܅~ |uJQ5X]5P]V4VEG_ 1}܋HPEEMHLMO:UU+8@)Ӊ9Uރ;Er֋E]|9s8}]f.@)}9r@f.H9It}܉G^_[]Ë=8 ]`])ʉʁ ϣ8 ]5P]I=0]t 0]C=8 ]`]) w 8 ] jgGG5P]wAhP]t*T]T]khP]jhT]hP]s5P]V4VG GGUSWV]K{ C|W5P]wAhP]Mt*T]T]'khP]jhT]hP]5P]oH 0]K<0]5P]wAhP]t*T]T]jhP]jhT]hP]k5P]V4V^_[]USWVp2]EU1D$hD$XD$PL$TD$PxL$\uʁue'5P] phP]UT]T]ihP]jhT]hP].D$XfWf.uD$dT$`L$XPT$\D$%L$X1#T$\?P:hP]TT]T]*ihP]jhT]hP]5P]6hP]T]T]hhP]jhT]hP]}D$`D$d=|ht$X( ]5P]E50]t 0]58 ]`]) 8 ]t$X(~xVfnκHf\L$HL$HT$Lfnfnʉ|$8fbW*XVY VYVXVXfW,f.W*f. )΃w(Vf.D$XvND$0D$0NjU1ۉt$|$dمHI˅xL$D$ t$|$)D$|$L$t$ 1ۃ M$D$,GӃrD$ Nt$$}1$V$ɿO|$,wjFF=P]wAhP]t*T]T]ufhP]jhT]hP]=P]W4VE ~FF FNaN8085P]}C50]t 0]|58 ]`]) A8 ]>5P]*C50]t 0]58 ]`]) 8 ]s"4$D$|ʉT$,xr1ۺtC9vȉD$(5P]wAhP])t*T]T]ehP]jhT]hP]5P]KB|$0]Nj0]&P‰׉Zr5P]wAhP]t*T]T]edhP]jhT]hP]5P]V4VGG L$ ]|$4|$uT$D$X~fщоf(8 ]`])ωρ ʣ8 ]<ډЃ (VYL$XVf.t Y FL$XuTf(ȃ^ VL$X(Vt!Vf.tYFu^1L$X|$0Vf.|$,D$Y VL$,FHL$X_jFF=P]wAhP]vt*T]T]PbhP]jhT]hP]=P]W4VM ~FF FInfiFnity33jEFF=P]wAhP]t*T]T]ahP]jhT]hP]Q=P]W4VE ~FF fF0N30D31f(ȃ|$0eD$W*־YXVT$@t$Dfnd$@fn։fbs+X Vf.L$XAt$D$ 1.<$(V6 V|$^\yV3|Nց(VYVt#Vf.ftYuf.vf(Ӌt$4,W*ڀ0\L$X V~d$Xf(\f.&Vt$ff.L9OYt$YB,W*0\f(d$X]Gd$X\f.vD$fW%Vf.t$Kt$4,YW*Ҁ0\L$X~tYfWf.u{M Vd$XY,W*\f.d$XEK΀0G9ʍRu VL$XXf.v]D$t$}  V]\f.v'Bz0Rtt$} D$/0|$D$XD$`|$ZxVD$|$(t$(VY VD$D$ f.D$X+F,<$63+|$d|$85P]\$EhP]T]T]]hP]jhT]hP]L$XT$4f(эz^,W*ЉYЀ0\fWL$X L$Xf.um.t$} L$\$D$ L$8D$ 1G+5P]:4]tD$ 4] 8 ]`])  8 ]V} NfWfYf(^,W*Y0\L$X BL$Xf.uNut$Xf.L$Xwd-f.Z-T-Љ@<9uB9D$4uL$4D$10J)--j s@D$ @D$5P]wEhP]t*T]T][hP]jhT]hP]y5P]D$D$8V4VL$D$ @ @@t$T$ ~~9ىN)D$8))Å҉L$~<<$t?L$ D$ ZD$ ~|'V—t$ D$ 5P]w[hP]tDT]T]ZhP]jhT]hP] t$+,D$+5P]8T$B 0] 0]5P]wAhP]xt*T]T]RZhP]jhT]hP]5P]V4V5P]wAhP]%t*T]T]YhP]jhT]hP]5P]G7=4]t 4]C=8 ]`]) w 8 ] j GG5P]wAhP]|t*T]T]VYhP]jhT]hP]5P]V4VT$G GG~ ǃ|$$\$|<$t |$XZD$<G|$L1G֍HGGȉyGG?GGGDžxt$\$ @t @t$\$1ۿT$8I)σ|$~ L$ D$ ۉD$ ~L$fD$L$$|$0t&\$ t${V)t'D$\$>T$ D$T$T$)LCT29quW9wL$ D$L$t$L$$T$D$\%D$8CD$<\$~\$ m11D$f. d|$DF9|L$tat$ D$;FjFD$0X5P]wNhP]t7T]T]VhP]jhT]hP]D$ D$5P]4"L$04]D$4](PÒ‰ZT$r5P]wAhP]Ot*T]T])VhP]jhT]hP]5P]V4Vt$\$ FF F K SRQPs0 {|Sd5P]hP]t~T]T]UhP]jhT]hP]7Z8 ]ى\$0`])ى\$L$ D$\$0£8 ]5P]2T$ B 0] 0]5P]wAhP]t*T]T]ThP]jhT]hP]y5P]V4Vt$D$t$|@Ft$L$$T$N<$|$ t$11D$OD d؉\$DF9|tD$ ;H}L$$T$st$D$,~@D$0@D$5P]wAhP] t*T]T]ShP]jhT]hP]5P].1L$"T$04]!D$4]04D$0V؏L$T$0D$HP5P]wAhP]^t*T]T]8ShP]jhT]hP]5P]V4VL$t$ AA A N VRQP- ~|Vs P]hP]twT]RhP]jhT]hP]KT]S`]D$048 ])ʉʁ  ȉ 8 ]\$0 P]/F 0]40]5P]wAhP]t*T]T]QhP]jhT]hP]5P]V4VL$$T$D$t$\GD$ xD$,t$~B<$D$,T$]t$L$ D$D$ |$<ytu)\$11$KDd<$DF9|D$;H?t$D$4]t$D$D$f.@D$tGƉx|$"T$0 BFu ~|$;|$,~ T$։L$A1Ƀ|><$|$1f.f $։΍C;$|]<$ thD$;xK@D$@D$$P]wWhP] t@T]T]OhP]jhT]hP]ft$D$P]-\$$<$T$4] 4]"PËXxD$$P]wAhP]Qt*T]T]+OhP]jhT]hP]P]S4VL$$|$AA A O WRQPu) |Wf]<$P]<$hP]tzT]T]NhP]jhT]hP]0Vً8 ]`]D$)ʁ ˋ|$8 ]؋\$$P]~+T$B 0] 0]P]wAhP]t*T]T]MhP]jhT]hP]vP]S4V]D$$\$$|$D$PD$ D$|$<D$X5P]wfhP]_tOT]T]9MhP]jhT]hP]+]t$|$$D$2 5P]\*40]0]$PƉ^~=P]wAhP]t*T]T]~LhP]jhT]hP](=P]W4VT$FF F J RRQP& ^FN9|f.fC9} $=P]wAhP]t*T]T]KhP]jhT]hP]=P]#)0]D$ 0](Pׇ‰ZT$ zP]wAhP]ct*T]T]=KhP]jhT]hP]P]S4V|$ 1ҹGG FDD Ӊ\9r$@Gt~|VU]P]GhP],T]T]wJhP]jhT]hP]!D$t$X58 ]`])ʉʁ WΣ8 ]X8 ]`]D$ )ωρ wo|$ ʣ8 ]O@$p P]t$hP]T]IhP]jhT]hP]0T]|$ P]&F] 0]40]5P]wAhP]2t*T]T] IhP]jhT]hP]5P]V4Vt$D$4|$D$0D$f.D$0]T$~D$t$R)u;L$t$ALTD29qu9w1 |L$T$ Dx $t uq<D$V@)Љ$u[L$ALTf.f9Yu9w$ D$]f.@~|VdP]wAhP]t*T]T]GhP]jhT]hP];P]$F] 0]40]5P]wAhP]Nt*T]T](GhP]jhT]hP]5P]V4VD$H0D$$t<$u D$X<t$T$ tu D$X <$ D$0 B;D$,r N11T$$f.f d؉$DF9|tD$;H}L$ T$rD$L$ T$i@t$(D$ x5P]|$wEhP]#t*T]T]EhP]jhT]hP]5P]|$A#!T$ 4]$4]'PL$$Hx5P]wAhP]}t*T]T]WEhP]jhT]hP]5P]V4V $t$AA A N VRQP ~|V蓁=P]hP]tpT]T]DhP]jhT]hP]fL8 ]`]$)ʁ $ʣ8 ]=P]!F 0]40]5P]wAhP]6t*T]T]DhP]jhT]hP]5P]V4VL$ T$$t$(\Fp9ʋJD$L$tW\$L$11$f.D d<$DF9|tfD$\$;X}bD$ j\$L$11$ d<$DF9|txD$\$;X}xt$D$ @$@D$(5P]hP]T]T]BhP]jhT]hP]oD$D$ @D$(@$5P]hP]蚿T]T]pBhP]jhT]hP]5P]L$($4] 4]$Ph~L$(Hp$5P]wAhP]t*T]T]AhP]jhT]hP]w5P]V4V $t$AA A N VRQP ~|V ~Y P]hP]XT]3AhP]jhT]hP]ݾT]8 ]`]D$ $)ʁ $t$ ʣ8 ]5P]% $"T$(4]mD$ 4])P|$L$ Aq5P]wAhP]]t*T]T]7@hP]jhT]hP]5P]V4VL$ t$AA A N VRQP ~|Vr|r5P]hP]T]T]?hP]jhT]hP]A P]F 0]40]5P]wAhP]Vt*T]T]0?hP]jhT]hP]ڼ5P]V4VD$ $|CL$YH1ۉ1$D d؉$DF9|ۉ $tD$ $|$;H}t$it$|$@D$@D$(5P]wAhP]艻t*T]T]c>hP]jhT]hP] 5P]L$(T$4] 4]$P]zL$(HpD$5P]wAhP]t*T]T]=hP]jhT]hP]k5P]V4VL$t$ AA A N VRQP  ~|Vy  P]hP]KtzT]*=hP]jhT]hP]ԺT]V8 ]`]D$ T$)ʁ T$t$ ʣ8 ] P]F 0]40]5P]wAhP]藹t*T]T]q߉FEljF^_[]|) USWV΋M^+?G=r#BP x#Gt Pm 1N)QPW t(F)=rQ)у s*#PQW >FEF^_[]( USWV΋ ]F~)))G)9Љw 9Bω}UG=r#BP x#Gt Pw 1߉EE ߋ]N)‰MRPW 9]tNE)ٍ@QSP} ]t(F)=rQ)у s/#PQ) E>ljFEljF؃^_[]' USWV2]1EAAj ~ @FF FF?j~F]ESj FFF F$F(j$. ~,@F$F,F0F4F ?jF$ESj螯F8F<F@FDFHj ~L@FDFLFPFTF@?j衲FDESj1FXF\FdF`FpFlFh]w;h]|t%][h]jh]h]]]Fp5]h M1 ^_[]USWV(2]1E5]wAh]t*]]h]jh]h]|5]]w;h]覍t%]h]jh]h]/]]}ujt G]u̅}t W) 1EԍEЍU؉PRe E؋pt#}9u4VjMHEEE] WQ) ƃv EЍM؈D$|$4$k}uVW}W D5WEPwE}r,M؍prQ)у sV$щVQ@  ]E;A$tx t j j u4VM1u (^_[]{# USWV2]1E5]wAh]؋t*]]h]jh]h]\5]]w;h]膋t%]eh]jh]h]] ]ujt * ]@ EUD$E$D$E]xV4V9tt=S M1C ^_[]USWVPu!%t&%FF=]wAh]荊t*]]g h]jh]h]=]]w;h];t%] h]jh]h]Ċ]]ujt跽 ]NP}+9s@seR]X;9tiɃFJu1ɋP#H@ 1ȉED M UE] f.E9t Eu9t?9K usQuV UM uQVu EE9t{EP4V^_[]U]w4h]蹄t.]h]jh]h]B=]u9]=]u)j*hVjr~]jhB]USWV2]1E5]wAh]t*]]h]jh]h]蜄5]:]w;h]ƃt%]h]jh]h]O] ]}] ujt; d ]E SPQ ]E;A$t P8nV4VM1菻 ^_[]USV5]wAh]t*]]h]jh]h]芃5](]w;h]贂t%]h]jh]h]=]]ujt0 Y]Hltu uPV4V^[]UM Eqp輙 ]UWV2]$1艄$DŽ$DŽ$Ƅ$D$D$$WPRD$r0 $prQ)у $щVQf j*hVjo~CjhhVo$$D$v$QWP* s$r0$prQ)у s&$щVQԴ $16 e^_]? USWVE x}Ut12iBOu1Q#AMI F1iǓJu#AqI M DEωM9u ?9tEU9uUf9tFE9Gu҃v _ _uuSF MuuSu0 tE0^_[]E8USWVE yY#x A 49t9މMt,E [s/MA 49uۋACEj f UۉDȉMDȉHM HJTUUAJMCыR9t-KH1NPNVSPEKP1\ȋH E9t)9ut59Ét(E@ 4PEMڃy M*EH^_[] hVf{ USWV2]xV1EIQfVfV\\ZWZ^. YαrFN <+F 9s@sgMMWMFEEPW}CF^F89t$X fDF8GWPEP9uM1- ^_[]]USWVE qϋI _#p 9t$9uPfO 9t=E [sV-tE‹JJHOj R0 1]9t*KJHZHX][Z]KO ;_t$9t4]9؉t)G @]w ]؉EH^_[] USWV0] M2]u1)ʉEߐE]PSQEPM]ƋE)ω)9}uVPuM]DuVuQc]M܉)ʁt{M܉]ЉUUJUUfDƍXD9u؉]̉E|:u6\6|6ttUUM܃Dߋ9Ӊ|Eu9u Eċ]ȋD;]}4su4Ut;u؉} މEԋUE̅H}Uf.B1ۉEԋBRU)ʉUBỦ‰E|81|66\6}ttUM܉D]9|Eu9u E̋]ЋD~0suu4Ut&}@f.fމEԃ}U)9A9~fD^E1S}׃t+E}))ƃPWV 5f.DuvNFvPS׃uuM܍F;EuM1 0^_[]USWV EM ƍ@)tc‹EHWh["R@tIuƋE}9Ht1 Bx)9rMHȋUMu$}^_[] UU EIt PB]jhYdjPw@]USWV΋] y 8SumMljOGV4V^_[] ̡]USWV2]΍y,1EY$C9ttG@Z{ t;~tYhfC @@ pGGx upVEW9ptCF9pt@8?Fx upVEW9pF90xxxw~@ }F@@ F@P H y uAHJ9At H9t QQPNv~ F EM@@ Eȃ^_[]VhVxa USWV2]u}]1EPz t$;z MUZމE܊E MvDыRyM9ډ9„uԈ}Ƀπz tDŽtcu}UM]E;zEWSRjPEgx tJy "f.Ë@x tDu1K}S;Ws"MUuWuPREF-ExtfW芛 j uP FM1谗 ^_[];tf.f;u ˋIy t{ \/UWV}wtV j W֒ ^_]USWVE+E Eu q;uq1ۉMI)9)Ɖ]??)9]))É)9щw 9BƉ?UG=#BP H#AM)ˉ9s9)}WSV M>AE))SPV Wu S4SQV Eމpuu W t PU 1ɍuu EP }]t}O)QPS)EM)QPS^ EU}O)QRPB t(G)=rQ)у s2#PQ MGEG^_[]@N USWVˋIu)9f{ΉM#Ex?ׁ9Ǹ#w&9CэB=܍J$UFP UH#AsuSMrx};]VWQ讹 E3PuS蛹 E]@)PVS腹 EHr‹G)ǃ щǃ$]QW譏 E:VSQ@ E<0EPuW* E}@)PVW E ؃^_[]tPU U1ɺ ; U] ^d, ;]]h]虒 ]u]hV]Vh] UVqt V? 1PV^]̸̰ USWVuj- j! xSjj`V>^_[]UVE}t V3 ^] UWV`V}΋At Pݕ t Vɕ ^_]UVujO V^]̰USWV 2]] }1EWP(NuHEPSW{ t-Ft_NEjP_EtFNU9SEVM1H ^_[]Cu P,tpC p+0{jr S NpVOwW Gt0uuODuGHO;Ornufj K pVGGO G4USWV(2]}1D$ PT$\$ S\$SRP t$P(ËT$RP1D$+T$F DыH+I94T$PF|PtaD$ Nƒڃ} DRStAFND$D$jPD$NT$rPF L$; D3D$3L$ usD$ ك} DȋF PuuT$ RT$RT$ RP T$RPt \$\$t$P(ËF H+I9_D$\$L$ 1踋 ؍e^_[]D$UWVA @)NtQU9O9T~Nt11@9 Ɖ)8u9T~^_]19T j5 j2 j3 j4USWV]jk Wu uVF^ C+t$VFFF^_[]  j1̋AUV΍IF P+JQRF^]UWV}uu uHVF~ G+tDE0V@F HNFNtP,^_] j1̋A$tUV΍I/FF^]1UV΍I/u$N A+HARQ ^]̋A;AUVA΋Pu$F;Fr@F@F;Fs Nt^]WVT$ D$t q y642T$tq y6t0pt AI^_ ̋D$tIUWVV΋At P` Nt=F)=rQ)у sC#PQ FFF}t V ^_]P UV0VI}t VË ^]USWVA΋I]))9s_@Ⱥ?)9щw 9Bɍ?UG=rK#BPւ H#AD9s)<SjP膷 ~Ft P荂 1ɉډM)RjPA N)QPEP誱 t(F)=rQ)у s/#PQY >FEF^_[]1 USWV]AA@ r%ȉϹ#CQ要 x#GtQ芁 1>~FQjW> f.Ku~F F^_[]0UV΋ tUSWV2]}Uu]1EE}ERVhVPSG}u*E9t 0tV E?ptW M1!~ ^_[] USWVP2]}1EPj(Jy x@ /'CEE CuM1} e^_[] USWV$MЋu2]1EPj(x DžEEEt9Ev MԈL$M؉D$4$#uMVPQ^ D5E{MEUME GOWG /'CM1| e^_[]USWV0L$E Mt$2]1T$(L$D$jj.V Ǎ\$ fDWjVD$P$t$D$L$ D$D$L$PS D$ ;D$$;F@8GD$jWt$V\$,S!$D$ L$$L$D$jj.V$ ǃft$D$L$T$ D$D$L$PR~D$ ;D$$t;FtMt @1ۋL$(1{ ؍e^_[] USV52]EU 1uuVRPtE8u Mt1ۋM1'{ ؃^[] USWV] t`΋I}V )i9r@VPJ _4vSwt^Vb~ 1ۉ^_[]USWV2]E1UQI )i9vNMFA}7M1s 0^_[] USWV$2]}1EMQq)))iڷm۶iַm۶I$ C)9w 9Bˉim۶Uuԉ]ЉE@I$ G=r#BPn ڃp#FtPin ڃ1Muɍ@Eˍ E܋Pt=DD]؉Ev3 UT$$UT$>3UDD$TƉPuQ& 3uU܋]؋MDI99t}M1ҍIf.@DDDDLLDDDtD4t9uEH9E1ҍD4DDDDLLDDDtD4t9un9tjM1ҍIDDDDLLDDDtD4t9uuuuuM1p ؃$^_[]UVUF ^]USWV Y΋U)i̋N)i9sdgffȉӺfff)9щw 9B‰ÍfffG=rw#BPhk UH#Ap)s9tC /'(Au^82 u49tiG (9uEptPj U19]t&)׍f.@ /'(Gu6XE9t9ωMf.G /'V!((9uuUMu but[v9t"fDC (9uuuF)=rK)˃ s:#PSIj UFEF ^_[]n USWV2]u1EF~vPQ膯Džt$P M13n ^_[]ËF~vPQRP苲} EEt!MEUPWjjjVjR]u(ji VPIWSNjE>M19RP(, j2USWV]SN VѷFjh Džt SG 1PSRP~j`h ËGp0^^_[]USWVu]j*h ljSuuu >^_[]USWV] S迤N VFjg Džt S 1PS)u]SRP~jg ËGً@uuPR^^_[]̋AHQ̸1 USWV] ~)y Ή跓NSuPW4Vu^_[]USWVjf ËPRPLw bwPwP}V4V^_[]USWVj~f NjPRPs sPKWPKWP];V4V^_[]USWVAjf ËPRPw 螒wP}V4V^_[]USWV]y Ή[NSPW4V^_[]USWV]y Ή+NSPW4V^_[]UWV,2]u1ENF)ƒs*E܉D$D$ D$V$u=PVrE܉EEE
Et$$D$ Er.M܍Pry) s$‰T$ $d NF)ƒs*E܉D$D$ D$V$< PVr6fDE>VPBN$tjPF~uNA$ƒQ$u$1a e^_]USWV2]΍]1ESDžtE9EuM1` ^_[]USWV]u S\Oƅt tStjP^_[]USWVE1@rKƒuDQ x9w:y\iyu+r#9w<r 9wU^_[]USWV 2]}M ]1EGG $ CrML$$GwE $ 9s$ED$|$ <$}E D$ 3,EƉxvE0E |$4$D$ >}C{vWO)9sML$D$ \$$2(<~v6D$\$ $藉 >}M1^ ^_[]USWV\$q19wX)ڃrOy 9sH@rCՃu~FF AT!Ѝ9v A9rE FiyȉF̊Au A@$u1U]USWVAA@$}@Q G9At8iy48489T8 D8 0AP,0uYƉs,ƒ0uq06@rIЃuBA r9w8q\iyu)֋r 9w0~ uIy,^_[]SWVȋ\$L$T$ t$|$xp@ PH^_[USWVȋl$L$T$(t$$|$ \$(Xxp PH^_[]USWVA΋8tS1ۃ@rBu;FQ \89w)^]Y]\;iyu];91ۉ؃^_[]ËFvEPFKt0DžtuPN19u&~pWc1ۅtjP띉@rLuES 9w7[F]\;iyu"];r];9w ]1T;E89.UEtD89Iu F \USWVP2]u 1EP @ @U PE UÉ M1;X ؍e^_[]̋L$` UVuFVt F^] j2USWV(2]u1D$ D$D$D$D$D$ D$D$$ytVT$|$\$QRWSP Vtt$t$V< FL$ 1/W e^_[]̋D$̋ X.]D$ IH ] H ]HUSWV2]΋M}1EFt WF| WNF FE܋(FWVÉe c Gt@E܉ىG We+MEIMJ~eP 8;tG;MEPEP?MA y tHuPeu4VM1U e^_[]USWV 2]΍}Y1Et WA| WWVS^}}V+ENWS4VNj|v t VX M1)U ^_[]UWVP2]1Ey t5A(;Au'A@PPy A zI RM1T e^_]USWV 2]u1E}V5ŝi1i“V1i“V1‹A iғ#QE܋ Ѝ\w1]ˉUf9t U܋u29tYU؉9SuݰMԉE9tU܋MMԋ9‰tE;Bt9t%1fG9uEƉɉMM9u 9u"}uPEP@M9މuM1S ^_[]USWV2]΍Y 1D$I tR9@ ~$D{^ F t SV W4V$ NL$zF|$HFPWR9߉$t' $D$D$t SwV \$t{ S_V ^KP tL u5D$PK|,(t$t$?Cjt$4V$t4]D$P Džt#tV D$N ȉC1L$1Q e^_[]̅t UjP]USWV2]1Eyt~=']Ph WSN 0NWU }v]؉u Sq*Er,M؍prQ)у s*$щVQL M1,Q ^_[]- U@] ^d, ;]]h@] P @]u]h@]O USWV桤2]1F WIOO$G GGG GGG(G0G,G<G8G4j K @@f@ G8G@GDGHG`G\GLGdGhGlj$)K _p@GhGpGtGxGd?j ;GhىFFPj7G|LJLJLJLJLJjJ @LJLJLJLJ?jq:ىFFPj6LJLJLJLJLJj$J @LJLJLJLJ?j9ىFFPjg6LJLJLJLJLJLJLJjgI @LJLJLJLJ?j59ىFFPj5LJLJLJLJLJj$H @LJLJLJLJ?j8ىFFPj+5W4LJLJ LJ,LJ(LJLJLJ LJLJ0{LJLJLJj@tj3tj&tLJLJLJjG @LJLJLJLJ?jl7ىFFPj3LJLJ LJ<LJ$LJLJLJLJLJ LJ)LJ%3^É %#"iӳʉSٍFP=F ROGtj A9A Wq=D]N1J e^_[]UV]΅t ]ux08 Wt  Wt-EQ ]ƅt ]u5^]Å Wt zEQr{{@{n{HrHUSWV2]1E W$J ?tHuPtdWHM 0eqZqOqtx9tf.i@9u)=rO)σ #PQD dždždž4RtM)=rQ)у E#PQ)D dždždž*tM)=rQ)у #PQC dždždž*tM)=rQ)у #PQeC dždždž,+tM)=rQ)у #PQC dždždž Idž;t8jPB ;ujWB NptAFx)=rQ)у #PQgB FpFtFxNh:*F`r0NLxrQ)у 0$щWQB F\F`FL~@tb^D9tftj9u~@FH)=rO)σ #PQA F@FDFHF8N8UP0R*j v8xA N,t=F4)=rQ)у se#PQIA F,F0F4N$\Nd3NtjN?5M1kE ^_[]s USWV΋I tAF)=rQ)у #PQ@ F FFF8F@F;~u7DjSe@ ;~t"?C tHu߃PjW3@ ^_[]讣 USWV΍kuwtnte]t ]uXkt(;Ht%jRj? ÉV,Sk]t ]u^_[]Xu@NuHrHUSWV2]Hˉ1E h@j KDkKtVP {[9tV!9uD4VH u h WI M18C İ^_[]Uu@]USWV2]]1EA u111C4Et P 1EEP1N 9p WEtˆEuE{t W覦 1PW+tM9tV1E@EHɉMt QX EEPt EMEw@F9uEEMHMM1A ^_[]USWV2]1EA T]ˋ ^d, ;P]H;y9ljEb]fDT] ^d, ;P]H+"EhW8 w9u!vPhWQ}V hW 9u!vVhWPKV <MWQЃMEEɉEtjMtjET] ^d, ; P]QA9t EEAf.@URP/Mtj@9}j N; @j ;; s CC CC@?j+CuEVj'CC]Sh W+ VEPMEEɉEtjMtju]N tAF)=rQ)у r#PQ: F FFNA-VB bj): =MuAj6hT]= T]Mj 9 @@P]hT]?= hT]w= T]j 9 @@P]hT]< M1= ^_[]hT]= T]Jj 09 @@P]hT]<  j; j:諜 USWVP2]u] 1Ej8 P 8>M1M= e^_[]USWV02]ϊE1U_ 7(- G tE]܋9t#Mf @9uMԉߊ]܉ t 4< ]EPu}9tVx 9u}Cى߉E[w}9t.f.;tW? 9u}؋wwG(u4VO$Mdw,09tP9uE؋@80E9f.DFe܉EċFEPPj7 hPzChzChzCKCRCu)F_Chh Wh WEPMԉe܋Ny t+f.p~ u!;Ftf.@΋ y t;u=u4VMbE@(M1: e^_[]USWV@2]1D$80IFtM9f.DjjpӃ FxtW'> FF9FuJ9tFfDjj%VrFxtW= FF9FukD$ D$ PhI WhP WjztPhY Whd WW~\tFLPhVhw WW:D$ PbD$ L$$+D$L$L$v(T$$D$ Sh Wh W|$WW~lJD$ D$D$~h9tq11Ƀ{ w D$L${ vS f.S T$ 9ST$$tD$ D$f.T$ L$ RP9uD$ jhVPD$,PWh Wh Wt$D$4r1L$ xrQ)у $щWQ3 L$ tED$)=rQ)у #PQ3 D$ D$D$9u +D9t { tC PhY Wh WsڍNL$_9u&9t {tC PhVh Wsڋ tPh Wh Wt$`t$4VL$81K7 e^_[]S ̋@USWV桤2]1FtB9@OPPLJPP܋OPFPRF^9t%NFFtKS/: ^E t1S: E tUOP tI u2FP_,(v v&jFt:FP}t+t'F} ȉG1ۋN15 ؍e^_[]USWV2]1EA8A@AA9u"Bf.@jS0 F9t"?C tHu݃P̋N~ +N w j FEEPjFFM14 ^_[]USWV2]]ϋM1艄$C9[E$](ML$D$ V[E8t$0u \$] ,%DE1L$11t$ \$] 1,(E0p0$D$(T$$ctD$8P`D$<D$8E1ɉ\$t6 [u,L$,= 9))u,-ơL] ^d, ; H]Z9> H]t$VZOL$43[M-],|$D$ E,5ŝi1iM.1iM/1i# t6t$ $f.?<$9t t$<7<$99_u9G W vO T$ T$@jjjhVPQRD$D\$@9ËD$ Pi lj\$9{uWt$3G <9u݋<$GO 9PWT$ r f,L$ E,T$@PR<#t$@\$F $S NjF 9s$ D$LD$\$<$L$ ;|$$r~Wt$S0\ ;|$ $D$D$,$L$ʟD$P^ W O)9s$$L$D$ |$$L$&t$ σ{r6Pt$Q[ >D$@D$T$|$tED$H)=rJ)ʃ M#PR., D$@D$DD$Ht$44VE] t"u4t$ t$$uMQP#T$tn0t_|$@Éu8u4t$t$,t$RuuuPt$dt$dt$Tt$\u, 1|$,]SPWփ B E|$1DŽ$ DŽ$Ƅ$u,t$L$,]Fɉ$tzS 1jx* Éu8u4t$t$,t$VuuURPt$dt$dt$Tt$\u, VXh1$WjSt$T$tRt W BE \$u8u4t$t$,VRuuuPt$dt$dt$Tt$\u,, ً\$D$0WΊM BXtȋL$T$@Vu0PR$ r4$prQ)у $щVQ) D$PT$@L$H$$$$IP4V=9 hT], T]j ) @@P]hT]s, thT], T]j ( @@P]hT]&, UtkT] ^d, ;?P]<0t=T] ^d, ;^P] 0WPt$u<$ Wj0 1$]tUjtGL$@jhh Wz$ D$Hv $$VQPT L$@tW/ $ r4$prQ)у $щVQ' L$0jiS$1+ ؍e^_[]4EhL]* L]/j& @jF@F;pt~z uzX^Xs9Ch9E]Dxz uz19Ft 9wD19t9Ft4x yz um} t19Fùz ufm} t^x t/3X^^ x ~ X x t Dz1;Vvz h?9t t8 uf.z tM uf.fG B :__{ uSZ_9StDj9U]E9G B zZ{ uSZ_9St;j9U]D0;Wz: _{ uE{ t4;zz _/} [ ueG /} C G _+o+} u}ok)9}tpo\$,$$k$9;\$D,$TE G k/k} u}ok)9}tuo\$,$$k$9{\$E,$X];_:Z _ B ?G :__{ uSZ_9Stj9U]E;WU]{_zZ _ B G zZ{ uSZ_9Stj9U]D;zB QrQ^_[]USWVu MV5ŝi1i“V1i“V61i“Q #ADEAfD 9Ét}t@0LD^_ ̋D$9AFN^_[] USWVuD< Ws{C 9t H WC,KhH WPk^_[]USWVPWu轂2FN~Ff>CKDžDžfDžEMU؍賓覓MAIAAfFNou jh Wo jhWo19FEt9E9v9HvM؍QRhjWPV}vKI1M؉AAW) 9GvPRmu؍1VRhQPQVJH=v E@vV#L PVuvM؍1@BJHRj MqVuSMqP+iFޑM1^ ؁@^_[]USWV 2]E1Mt*u}WjuuPu v"jFF1ۋM1 ؃^_[]UV} u=ujhCjhWhWہtjhCjhWh6V轁1^]USWVuHWss{C 9t $WƋ{,{h$WPd{9{ t PWC, hPWW=^_[]USWV2]} u1ErU]1@SCISj]SuuWvPOqFFM1 ^_[]USWV 2]} 1ErU؍]fnfnʉEflfs f  WHIPj:uV3WMqPqGGM1  ^_[] UE Mtu,jhDjhVjhОDjh,Vh|W]1]USWVu`Wss{C 9t WƋ{,{hWP|{9{ t WC, hWWU^_[]USWVHM}]12]1Esusu [%t6VM1UIjVVRPW1ĐVMu~{uU S}v]؍EUĉ]fnȋEfnflfs f  WJHRPYMu"UQRVu u3uuu uvPg,tEF}EF~1ۍMnMM1 ؃H^_[]USWVDMu]12]1E{}{u $t6VM1UIjWWRPV1ĐVMu.z}U S2}}v]؍EUĉ]fnȋEfnflfs f  WJHRj M"UQR3uWu }wPg t uEGw1ۍM7M車M1 ؃D^_[]USWVE ut!uYjhpDjhVhW|?1WGjhDWhVPs|Éjh@DWhWWPW| 1^_[]USWV}օt4WQ^htBjh&V華F~v6PV{9tF~v6PV 1ۉ^_[]USWV 2]uύI1EM GHƀy u'U 19QC ـy t9t9VG9t0PFtM7܀}tEVPLu4VM1 Ee^_[] UWV9E΅}tuwvW ^_]USWVu1WsCCP K@@f@ C-{C KSUM9t W:,:h WPyU:9{ t LW:,:MhLWWLU:9{ t xW:,:MhxWWU:9{ t W:,:MhWWU:9{ t W:,:MhWWU:9{ t W:,:MhWWU:9{ t (W:,:Mh(WWkU:9{ t TW:,:MhTWW>U:9{ t W:,:MhWWU:9{ t W:,:MhWWU:9{ t W,MhWW؃^_[]UWV2]u1艄$I ta} ?u_W )@p)@`)@P)@@)@0)@ )@)QPvk Ot1ҋ<|B9uFFFW$1 e^_]UVIuat2EW8hu%@M hPQvk 1҄WEʉN^] UVIu"tFPu vl uFF^]USWV$2]ˋu1EIEUM 8@RWEPQv&mu9}wzKEЉMF]܋EFEtFE14uj MÉpEPEPL MSGE;}ru4VuEЉFF"M1& $^_[] USWV2]ϋ]1EI"t&E xt6KQPsl ƅuCsM1 ^_[] ujuVt6KQpsm }ƅtuwZqW 됾 USWV2]΋}1艄$It ]@r!G"$1 e^_[]W|$SuJ(tV1L$(PWL$(S1Pl"tE xt9St$pPEpKlNjEL$(xEpE@"a|$juWt;St$ppEplt$DžtuvpV 닿 USWV2]΋}1EIt>]ju S31EȉOt"uvoVm G"M1 ^_[]USWV2]΋}1EI t;]ju S3t.E8u/pvwFl uGu2G")G G uvnV M1 ^_[] USWV2]΋}1EIpt>]ju S3t1E8u/pvwk uGu2G")G G uvHnV M1B ^_[] USWV2]΋}1艄$I1\$$Wu S,9;t|}Whu7%tc1ۍ|$(SVuhST"tD$$t$lpv0k L$(F7G"4E@(G"t$$tuv4mV $1* e^_[] USWV 2]΋}1艄$I1\$$Wu S9;}Whuy$1ۍ$(SVhS(to|$(hjW D$$W$pp]sjƅuhW$t[ s(G"LE@"@G"E@"$(t$$tuvkV $1 e^_[] UVWI`(N ^]kUV2]΍U1EP0Rj6 M1W ^]UVI褵 r1M 1wu$XWjh0:@jhWLjhDjhW7jhDjh$WVjhDjhVDjhDjh3W2jhЭDjhGWhPVn`jhDjhVhPVjhDjhVjhDjhVhVwnj!hDjhGVjj#hвDjhVXj$hDjhVFj%h0DjhV4j&h@Djh^V"j'hиDjhVj(hDjhqVhVm^]j h`Djh VhVmPY@j"hDjh,VUVP2]E1UPt8M1: e^]USWV 2]1ۉ1}D$\$~!VL$jSSQPu7ĐVuD$WJlWu t$L$1 e^_[]UV}t VS ^]USWV52]ϋE ]U1u79u)9u%rp0pGF9tB֋Pz tY{ u;Kt Ӌz tPEP%9uË]ЉM1 ؃^_[] USWVE ϋHy tq~ u;Nt ΋ y tPvÍ@PW^jS E0^_[]USWV} u.ΉwGPVjW { t^_[]UVE ptuvgV ^]USWV2]U 1E1^{ t]919CCӀ{ t9tU ];Gr;C)]U E}URPhWWVWCM1 ؃^_[]USWV}]j HHf@ H@P@Pu W ^_[]USWV2]]U1E1E9AtHu 90tI9t]N9so]ى33E9BsQB]x t#uuRuR7;FuuVjkFH; siuuPTN]9sTu^K tSz u;ZӉUt ڋ{ tU;]t;Bst@uuVjS>uuujVgM1 ؃^_[]uuRNUSWVPAu= }@MAF~99tU t79:u2w2 q w9zur8 ]O w9t6z tj;u MWvCM@ C@@ CpuOVz t1;_u MWuCM@ C@@ CpuZ IA X{C O _EM@@ Eȃ^_[]VhV USWV2]]U1Ep~ tEDMM 1ۉEF99uň448^ t܋]U}t2ME;8tMMމ||Mڰ uuRWj1I; sMuuRWPVC(Eƍ@PujV^ ECM1 ؃^_[]UVuFPQ_jV ^]Vq1)փrBD$ 1r2r rrr=wfBfBt D$B1^1WVq1)փrMt$1D$ z:z zzzw%frfBtD$BB 1^_ 1WVq1)փrGt$1D$ z:z zzz wfrfBt D$B1^_ 1USWVPE 1f8PVOE)كrmM1ESS SSSwN1fKfCt4E P0. @Pu S,tuMUCs މSK^_[]1USWV΋I}1+9r'] )Nt VNWSQ F+E^_[] USWV 2]M1ɉESE 8G ]@ɋSs C[U܉E؉MQ])u܋E$xuxM܉}u U܅ۍT^Eff^]ԍuۉ^fDGfVSVEP]EO;}܉EwŋE؍49uau9VwIMԋu܉׍UZ q4?|?E߅f2fZ]DKf3f{PSR]t(1FM1 ^_[]+EԋM1EۋEM1UWV΋MthVx ;U s[1}WPOVft;twWt!t 1ɉOVt O^_] UV1wqU$W1@b2tuVRI1; G:uBB9A9A *:u%RI1 1u RQ] A^]UV\]t^]áX]t61VVPG X]\]91~DF;1|1USWV }2]u1EW]fEfE}tEjVP]tE tMjPQ]t1M1 ؃ ^_[] USWV2]1E9~!1Wu uVu?C9| 19u t1ۋM1 ؃^_[] |u׋GujEP DtMMD@ DHD@tW'MEUL MQj PRj]^USWVMMyqE 1΍X~}9U]vu]D9viMʋ 9v\MMjj@]Sv Pur} wEPx.F@]G OM@U6B;QY1^_[]UWV~.΋M1Tt9JtG9|jRD^_]UV=`]u1VVjw Wp `]=d]u1PPj R Wd]h]uu1PPj - Wh]tt1u `]d]^]USWV(E]u,}0U(`@ @L:[@hNd dMEWVuRu$u PSVQu UÅHW7=l]uq6tc]Ej hWEP] j h%Wu] ]؋uu KSRul]]؋uE u$u Vu EP6U6ƅu1Et V0lju-t*u6Wuu6u]t jWE؅tjPz]؋Ed؃(^_[],e USWV}] WSUƅxSettW%^_[] USWVPu uuuuu uPxhFPEP NjWP u~5t*uW9t]$uWP$ىÅtEWe É؃^_[] USWV2]ιU1EEPQRvv V1ۅt<}u6E}uM U~)ʃ)UNEMHM1 ؃^_[]U"]USWVPύAPu uR ÅxIP;EEw7uVP u5tPPtEtMމ^_[]USWV$2]΍}܍M1EWPQvv V1ۅ}}}E=tȁ}u{=uEEMHYEWjPuv Vt@}u:EPujVt'F tEEPvjVtE9Et1ۋM1r ؃$^_[]USWV2]}΋M 1EOEMEซGEAE庉EfEFtEEEE ^WS] SPRPÍEPSWu vܐVt*;]u%~ NFUt,uVuRQPܐVt1M1 ^_[]uRQPTuUS 2]U1EEPjRqq V1ۅt8}u2}u,E=3u}T$u}du f}u}t1ۋM1 ؃ []E}u8}du-f}u&}u }uEEMH1ۋM1 ؃^[]US2]U1EEPjRqq V1ۅt\}uV}uP}uH}uB}u<E=u1E=4u&}u EMHEMH1ۋM1} ؃[]US2]U1EEPjRqq V1ۅt?}u9}u3}u+E=u }uEEMH1ۋM1 ؃[]` UV 2]E1Mt(uU M VARn1ɅEM1落 ^] UVh2WVF ^]USWV΋M2] 1}Etc}t]EtV] MtLP#9w<}uURuu PxFPuuR Džx EFNjM1м ^_[]UV 2]E1Mt8M VAnn{t#uMu m1ɅzE M1` ^] USWV`E 2]}]1L$XWSPu UƅxL$X1 e^_[]IRplt҄tD$ۋt+u'{ u{u{u {u{t GD$땋OL$ujju x sf|$PpD$ WL$U)@ )@)@0PQRj W'$D$(L$0U Ɖ USWVM:tmM NjE1ҾWwf1ۄVD$jjV~ Ǎt$`D$VhVH=wt$L$WR D$ WT$ t$} Z)@ )@)@0M(] PRQVWSj D$0PK tt$(V1ۃ|$(1t t$V1ۋ$h1״ ؍e^_[],USWV 2]M1E1M NjE1]wG<GDًjVP3VE]ًk1҉BRjP3RE]ً<jjP3jE]ًjjP3jVtiE @U؉EjjRPS,utAu$W t(ËGtMPeE׉Wd}ػt M1h ؃ ^_[]USWV2]}u 1艄$x ARct+Eu0u,u(u$u uuuWVЅt1C@RRc1ۄVD$ jju0 |Å$tW$[tVDžE(1tP…<$t$p1t$,tO҉L$(tBt$pT$|$D$$D$ VhVH=wt$ L$ST$D$0W1|$ \$, M0p0)@ )@)JL$$PRQWSD$DžtPat7E]FEu vSuuu ЅVÅu VËP`E t^FxjjP ^tw} Fxuj}td"t[^NPU}NF W])@ )@)@0V :}PSWQRjFPt.Fx^FxSV1Nld e^_[]v(V1~(uۃ} tF0FxP4VM F0Fx볋eun`뎋eun`UEdH)Ћ 1@]USWV2]M1EM NjE1ҍuW_19=N9I9F: 49sZ)sJSr94)Mt*)fDVuMr9)Mt3)f.DoVuMU9JEu9F<6:9s)s ̃}uCr9wv}t5Ef.DUuMME^_[] j j j j j j j j jUSWVA A΋HD8t RHD t>jP1Q D jP@L8tP^_[] DG=L$ D$)twLQjPL$L 9$u>=T$u4}u tuRSwL肋 uD$PwL褋 t@FF FFFL$01" e^_[]G L$9uOPWT)ʋGG,W@D$DL$NF F~VUSWV@2]ϋu1D$8EMU ]E T$MD$L$ L8tt=tnjP ttO8W@$D$PD$*D$L|$P 1L$Hӆ\$@T$D_WO T^_[]USWVu N~?DD?ʃQjP[ uGG GGGGGG$G G,G(G4G0 RjPֳ ]f.uFNFPNTfNKFFFFF$F F,F(F4F0F<F8FDF@FLFHFTFPFFF ^_[]UWVd2]E M(pWu}1UMEEEEEPW8WVM1a d^_]UWV}uu u(WFF jz} @@f@ F~F^_]USWV} u]Åx91y'Wjb9}PjPjG;mWRP&^_[]USWV 2]u1EAPz t9t>yE߉D19rMʋڀz t9t9qO9u‰jVDžKV{tjVM1 mj3| NjSJy tYUj|  UHHf@ p@P@PuRExM1r ^_[]ЉU19qM рy tU9t9p{USWVQEzր t9t7Ft<:19GM<߀ t9t9FO9ujPu1^_[]9uUWVjj`N1Azr~ t Wz u!;ztf.@6~ t9u^_]USWV 2]1EyuCKSp0ljCWSE}؉]=VM19WMϋ<ǀ t}9;Q jhP_  ƋyʊG Et9Ff.^ʉMfD19XMЋȀx tM9t;ZLʋ]9uS}F E7jy  HHf@ NH@P@PWEPMEԉAE9FuE }؅Dƀ} Eu}؉EM1} E ^_[]USWVujj,j x WNjK9ȉGOuafGH9uMPz t,f.fHy u!;AȉOtf.ыz tOPt>^_[]UVuhjhPntM hP1^]UWVuhjjhPt1MU }Hx@ hPljP 1^_]USWV 2]u1D$Pt $}$f.T$RT$ RT$RP D$t5\$ى3T$3L$ u,Ɖރ} DS0uPPt$L$1g{ $e^_[]UWV2]΋}1EWItVVFNUP0RDjvv t V~ M1z ^_]USWVP} 1]EM9>u19u-}pp0pG9f.@OQ ˄t ~ u!;wtf.@ߋ{ t҉t Jy u;Qtf.@ y tMP_jPu E9y]lj;؃^_[] USWV} u0f.DwjW)u { t^_[]̋A;AUV΋IQz t.f.@Ax u!;HFtf.Ћz tFNPuNFH9uCPz t.f.@Hy u;AȉNtf.ыz t^]WVT$ D$tqv2T$tqv0xt A@^_ USWV2]}U1Eyt+u 93t*9tEV9ЉE~ tJ~uR1;FuuVjWtF֋P;uuPjڋx tFx t ?f.DNj@x t#90t u;8u Nj@x t tE9G}Gx uuWj}9}a~W t,f.Gx u!;xtf.@? t}9t];X}t:uuVjEuujPTEM1v ^_[]uuPuuVjuV+~M1v USWV2]]U1E1~ t;t[x MtgXMM f99„uֈ< tڄtV]M};uUuWPjRy}E]z tx |DӋRz th}1҉ËK;}#MҍuuWPRV}E]Cju"q E@M1}u ؃^_[];tf;u  t{ Xű D$1҃EщT$D$ڇ1ɃEʉUSWVT$t|t$1wtwf߅If.DtEtf9u8xfs(f.ff)r t u1^_[]̋̉AA AAAVȋL$WH Qt^ T$ t$1Q^ USWV2]΋M1EA@Q^zR {S VBURPjuP$MtjM1}s ^_[]WVt$ yT$D$wW IA^_ USWV82]}1D$0D$(PhPD$$PPtuL$(^D$$T$,KS NAD$$pW|$D$POt$L$D$PPtL$D$POuD$jRP$1ۋL$01~r ؍e^_[]USWV2]΋M1EA@Q^z؋R ){S VBURPjuP$MtjM1 r ^_[]USWV(2]uύ\$1D$ A@D$SPG@D$ShPRP $P $uj|$f.T$RT$ RWP D$D$S PD$D$SPD$D$SO $P $P $ttjL$ 1 q e^_[]USWVt$yt1|$wzۅIf.ot]D$tf9ʼnuLxfs<f)r0 ƒt#Wuyl$GW Ap1^_[] USWV 2]΋]1E ]ujj j jhW]} SP ]ujjdh@jhW蚂]WPF8EEE Eԍu؉D$D$1W$JWVEr,M؍prQ)у s%$щVQk M1ho ^_[]n SWVȋL$T$ t$|$\$PWXx pPH^_[̃yAVT$D$ tq2T$t AtA^ At L$1̊AUV΋IFPKt NFPKtNFPnKuF^]WVt$ yT$D$>AI^_ USWV] jki WSuWFF j8i @@f@ F^_[]USWV 2]] }1EMqNy tgEXjh  UHHً] f@ x@P@PVREX؋MSRPM1+m ^_[]f.D19yM рy t9l9xaSVAPz t 9t.A+t$ 19rMʋڀz t9t9qO9u1^[9uWVI1?DzBր t"fVz u!;rtf.@? t9u^_USWVuj kg WNjK9ȉGOuZfGxuOPz t.f.@Hy u!;AȉOtf.ыz tOPt>^_[]USWV(2]u1D$ PL$\$T$ RT$RT$ RP D$3T$3L$ L$ 3ϋV߃} Dz t_jEf  HHL$f@ H@P@PVD$(PEL$uyPPUHf.@19BMʋڀz t\$9q;AfD$L$ 1@j D$e^_[]UWV2]}1EWAt Pm FNUP0R!jvte 蝺t Vm M1i ^_]UV΋IQz t.f.@Ax u!;HFtf.Ћz tFNPu>Fxu5Pz t Hy u;AȉNtf.ыz t^]WVT$ D$tqv2T$tqv0xtA@^_ UE t Pu?@t] jU@8]UV2]u1D$P`$L$NL$1Nh e^]UV] ^d, ;]^]h]7g ]ujVc 5]h]f UVP2]1EWIAFF j0b @@f@ F A1AWM1]g e^]USWVX2]M }1EWaEEEed_mEsharEyEemorfE/MEEUMEEEM)EUMȋUԋ]Љ)9r9vU}v:M9w:M }ΉMMvuPuS" E&M9vƃUT$L$MD$ $9G]COKGGU} Mv}؍ 9Mv 9r 1)v@ PWQU{ VuW E)SPWڊ ]EUMEEECKEԃr0MprQ)у $щVQ` EEEEr,MprQ)у sY$щVQ` Er,M؍prQ)у s%$щVQS` M1d ؃X^_[] USWVP2]u]|$1D$HSW(WMƅu D$VuP |$tD$MWƉj|$WhWhW轻ju hWhW觻|$0SW\$W]D$Dr1L$0xrQ)у $щWQC_ }SثÉjt$hWhW/jSP D$,r-L$xrQ)у s&$щWQ^ L$H1;c e^_[]A USWV$2]]ύI1EMCXs@ECPE[Dj09^ WEMOPPUf@ XpH$@P,UP@PjRu4VM1b $^_[]USWV2]]yΉ1ENCDEEP*W4VM1)b ^_[]USWV 2]U1EXx{ tE02EfS9s @9։‰]BӀx E‹{ t׀x D7~ t]'U]:f.1;~BƋ4ր~ t19tE@Wz t%D{ u!;_tf.@׋z tF9uUPuR$M1a ^_[]USWVPύIM79tQ] F SPvv0Ny t"fp~ u!;Ftf.@΋ y t9uu4V^_[]UV2]΍U1EWIFP0REj0v[ N}t Vc M1` ^]USWVP} 1]EM9>u19u-}pp0pG9f.@OQ ˄t ~ u!;wtf.@ߋ{ t҉t Jy u;Qtf.@ y tMPj0PZ E9y]lj;؃^_[] USWV} u0f.Dwj0WYZ { t^_[]USWVD$PZ t f.fw~ u!;~tf.f? t8 DuMV9tFw8>;pt~z uzX^Xs9CX9sxz uz19Ft 9t WV19t9Ft1x tzz um} t19Fuπz ufm} t^x t/s3X^^ x ~ X x t lz1;VWz I?9t t8 uf.z tK uf.fG B :__{ uSZ_9St@Z9St=;tG@Z{ t;~tYhfC @@ pGGx upVEW9ptCF9pt@8?Fx upVEW9pF90xxxw~@ }F@@ F@P H y uAHJ9At H9t QQPNv~ F EM@@ Eȃ^_[]VhVx Uj0uR ]UV] ^d,u ;]"~F^]h]U ]u]]]jP~h]fU U塘] ^d, ;]}]h]oU ]u]]]j}h]T ̋ ` ̋ t`̡]tUV5]h]Sttj0Q W@ jP N@@FFf@ FFF$F F(jjVh]5]^]USWV2]y1EW|^W4Vt趵|NFtjP]W4VNtjPdN FNUP0Rjv P M1sT ^_[]UWV2]1EEP UPEU} x}x ?EtHuPM1S e^_] USWV2]΍M1E~(q&Ej$O ljMAMH耹܉}~n{EMUD$ $T$D$W4Vutu蛹VV MAtHuPM1R e^_[]Uju]USWV 1]} Et߉]NMzF09Mf.@N9YtMVz t/f.DNy u!;qtf.@ыz t9u9} tFEHxtjF@ Fx t#Hy u;Atf.@x tMV_7XDžt u SNU jWM }u4Vtj ^_[]USWV2]u} ]1E]]SjWjVpQ7 MƃN1 Q ^_[]UV}t VT ^]USWVP} 1]EM9>u19u-}pp0pG9f.@OQ ˄t ~ u!;wtf.@ߋ{ t҉t Jy u;Qtf.@ y tMP5pÅtuZVS jSfK E9[]lj;؃^_[] USWVPuM~ tIf.jSK ~ u-Mv{6tuԉ͵WS ƒ^_[]USWV02]]U1E1v~ tZ@} FtT$$觵4D$$蒵Uɋ4ˀ~ tބ~];0t~ t7^EnED$T$ Ut$D$$Ex t!~ ]܉#f.Ë@x tECM؉T$׉$Դt6EMD$ $|$ t$E܋M؉D$xE]C E@M1M ؃0^_[];7tf.@;u  t{ EZ)USWVy 5}jH  UƉuNNfF @҉Vt C98tM t M 99u(U!UW  MO 9yuUQz }r ]f.J9t{ t1;:tJG]Y{ t;zt^G]DC IA ]P G]Gx uPJO 9Qt;B9PHE0]Bx uPJO 9QtdB9HDZ9Wz@ B@@ BHqAx uHAF;9Ot A9xD7V9z@ B@@ BH1FFx uHAF;9OtA9HxE7Nq׍BRz r M@@ Eȃ^_[]hVu UV5]wWh]t@]]]]jrh]jh]h]5]rt^] j UV5]wWh]'t@]]]]jrh]jh]h]5]q^]UWV}AI!%% %p%$`$$P$$@$$0$$ $$}$r$g$x\$Q$h F$ ;$X 0$ %$H $ $8 $ #( # ######p##`##Pu#j#@_#T#0I#># 3#(####x""h""X""H""8""(""x"m"^_]UWV΍y{#p#e#(Z#O#8D#9#H.###X# #h#"x""""" ""0""@"~"Ps"h"`]"R"pG"<"1"&""" "( ! !8 ! !H ! !X ! !h !!x!!v!k!`! U!J!0?!4!@)!!P!!`  p vtVH ^_]VD$r1kxD^USWV΋IuAht?  ^~t躔SG ~jj N}jf Ë@u9tV9s)kx|f.@v!Cx9r@u N }}@)kxPj v ^_[]UWV}j(> 0Wx@@ @GARF FF~F F$t/@s-W1f.DN@9u^_]UWV}j= ƅ`W@@x @@@t@sNW;^_]0UWV0W}΋At PE N(t VE ^_]USWVP]] ΅t ]FN1ҍ~FN@A9ȋNBЉVV V )9r@WP@ڋ<tWW;E }tXF$E@F$;ts1Gx;;rEsCtVD } hr< ËF$HN$P]t ]u^_[]:r@-rHrډHUSWVE΍M ]F9t 8t^WBD NV1ҋFNA@9BщVst*VD ^_[]̋A +A̋AWVT$yI 1)9s tt$ ;>u kxD^_USWVPAq 9t5yY )Ɖ$19t"iQlCB9C؉Y 9s$1^_[]USWV΋Mj(j^F9u8NCA9C9t%NV~ )9s؋ uF^_[]USWV Q}+?G=Ur#BP?: H#At P': 1ɋs9t#)1f9u3}tc{M9t)]@tCS'B 9u]3C})=rN)΃ s2#PQ9 ME  CK ^_[] USWVPtsq9t,};tWA 9u}G)=rK)˃ s-#PQ$9 GG^_[]舜 USWV ϋ uG_)ȉ)9sf@?)9Љw 9BΉʍ?UG=#BPR8 H#A9s&)tPjRl ډW"}9ЉEt$]f;tcWG@ 9uEMHt P7 1)މMtM VjQyl M w9t")1@ 9u7ً]th}9t.tS? 9u}]7}G)=rN)΃ s4#PQ<7 ME GO ^_[]i虚 UV`WIl}t V? ^]USWV2]} 1E]t ]F+FENF9tEF UNRP]tS> Fh6 Ƌ@PE0ơ]t ]u#M1: ^_[]k@TkHrЉHUWVI} EA9t 0tV= 7tV= ^_]̋A+A;A ËA+A̋A WVT$yI1)9s tt$ ;>u kxD^_SWVQqy)f.D9s_Y߅t1^_[USWVQA }΃+QRPjgFV9t,1f. t WFVC)9r^_[]USWV]ϋ ?w))ΉEGF))9Љw 9BΉʉuu }?UG=r#BP3 P#Bt P3 1ҋMU}G79ta9t1}1)f.@9u}G)tVMUL1fD449u.9t/U)1f.D  9u7U]tg9t0ft3S; 9u}]7}G)=rN)΃ s5#PQ2 UEM OW^_[] UVhjQ g ^]̋T$D$RDDVt$D$T$ 4vTD^ UEs @] j9SWVT$X@ u^_[USWV2]11EfD~}W wWPuhWE؉PaM SuyÉjvhWhW-j6hWhWjvhWhWEr,M؍XrQ)у s2$щSQ0 G AM15 ^_[] UV2]1EIt=F)=rQ)у sP#PQN0 FF FUP0Rij60 M14 ^]荓 UWV΋I t=F)=rQ)у sp#PQ/ F FFN NIF;Ft"f.f8j P/ ;~uj Wm/ ^_] UWVy<΅t Wo7 N芛Fr+xrQ)у s&$щWQ/ FF^_]r USWV,2]}1EEqu}<$Ȑ VN)9s ML$ىD$ |$$/-ljσ{vD$Eى $D$V ;M1A, ^_[]USWVP} 1]EM9>u19u-}pp0pG9f.@OQ ˄t ~ u!;wtf.@ߋ{ t҉t Jy u;Qtf.@ y tMPjP& E9y]lj;؃^_[] USWV} u0f.DwjW& { t^_[]USWVE MpxEvEŝtMfA1iHuEX#x@ ]9t 9ډUtB[;su3{vCf.CVPu? U9uu^u E0 U9t,KHJJMыPQMSPKNV 49t';uMt/9Ét"Q rMރy 0&1ɋEH^_[] USWV2]xV1EIQfVfV\\ZWZ^. YαrFN <+F 9s@sgMMWPMFEEPWCF^F89t$X fDF8GWPEP+9uM1( ^_[]`USWV]Msj # Džۉ؉uDDE wGGHxvwHN]MɻEBفrC$PD# @#H CP+# uNQuPL OM_A=t@UAMz9^_[]hVUSWV} wv?ŝ}tf.G1iړHuy#YMI ۉ}9t89MUt@;wu4vGf.GMVPQW< U9u}M}9t5}֋WP2V:VUPVWPEGAy E΋M;Ut.;U9ȉQ Ryω^ dUJJHEHBr/JprQ)у sD$щVQm! Uj R_! 1ωʉNE8H^_[] 躄 USWVP9YM9tWDGr+prQ)у sy$щVQ GG9uu>uF)=rO)σ s-#PQ FF^_[] (WAA AAA A@A,A(A8A4A0AdA`AlAhApBUSWV}(WE@U}~ }~}(F~ }0~,},~(} ~0}$~4}F8F@~`}8Fd~l}4~h~8NpN4}~@Mt R[FdSuPu^_[]<UWVA@΄t#1|>AuLPt jF@G9rߋF8t P蒪^_]UWV}G09A0G(A(G A GAGAOItF8t P!G8F8G8G@N@PeG`OhF`NhGpFp^_]UVAAI@褝8j踖^]USWV}@Y@AAjN8Mj}MEu19u-}pp0pG9f.@OQ ˄t ~ u!;wtf.@ߋ{ t҉t Jy u;Qtf.@ y tMP_jP4 E9y]lj;؃^_[] USWV} u0f.DwjW { t^_[]USWV2]ˋuM 1Ex tIƉ]EU܉MGM9CPuw[#  D<ǀ t;ut4M FʋI9BPv2# ـujtfu]j  HHM f@ ʋ RHىP@UP@PWR8EFM1% ^_[]E0@USWV(2]uU1Eytwu 90t}9~vJE؋9uЉMBEuV}W߉EP!"  MXPu ~ vuR7jFJ9BPv2! ً]SRu jvBN9BP2vv! U ً]|SRx tFx t 7f.DƋ@x t90u;0u Ƌ@x t~ tŋFM9CPuv ـutFx uuVE;Euuu Uً]M AΊH ɈMt0f.@p~ u!;Ftf.@Ƌx t;ut6FM9BPvu U ً]ut}tNSRu juVSESRjPrEuM10 (^_[]uuSRVUSWVPQuH$ EB~MQF9tU t09u2p0p p9Bur7~ }F V9t{ t1;>tG@Z{ t;~t[fC @@ pGGx upVEW9pt;N9qAE0Fx upVEW9ptgN91AD]8w~@ }F@@ F@P H y uAHJ?9Gt H9yDY87~@ }F@@ F@JJy uAHJ?9GtH9AyEBPNv~ F EM@@ Eȃ^_[]VhV)USWV2]}1EM܋EJy t#Љ;0~ ^E0} xUu΋AIt49CQuP  40f.D9BQPu  ȉɋ ΀y ttZ}E;0OM܍EuuVjPEx tFx ÉMË@x t}EEK‹@9BEP2s  Mu't#EM܍UuuVPRFEGju GM1 ^_[];0t"{ rCf.;u Ë@x t{ GUjuP ]UV2]1E5]t-h]{]UP0Rj6 ]M1T ^]UWVĂWEEF}tUO t=G)=rQ)у s=#PQ{ G GGO.W ^_]c UWVW΋ytUO t=G)=rQ)у s?#PQ G GGOW ^_]TMc USWV$2]E1UqX4EEESh ǃv EЍM؈D$\$<$r}EWSPx. D=E؉UPREЋM9t9u1ۋEr,M؍prQ)у s'$щVQ M1V ؃$^_[]Zb UV}t V ^]USWV] S{vҸŝUtf.>F1iǓJu#AyI 4MMDEu9}u>f.@69}t)EU99Nu~vFfD9uDFQSP M u]9}u_f.D9}tIEU9t@;Ku;{vC f.CQPux M t 9u9uE0X^_[]UVEW^]USWV]t ]t]tQ]uG]Cdu>s0CpCp{4D$1L$,T$(PRQWCD"D$,L$t$T$dD$ (\$$fnfnΉ"flfs f  WJRjMtZt$t$$ML$,D$0fT$ f@ f@f@0 L$ PQD$0PRjV:"ut$8D$,t jPFL$x1 e^_[] USWV2]M1EKM NjE1]wG<GDpًKjVP3V'JjjjujJtjE@UEjjRPjIutAuWL t(ËG\MP}EWK}ػt M1 ؃^_[]USWV2]]} 1D$xSWU=">[R"jj8S.=  l<D$1L$,T$(PRQWA"D$,L$t$T$dD$ 8\$$fnfnΉ"flfs f  WJRj$KtZt$t$JL$,D$0fT$ f@ f@f@0 L$ PQD$0PRjV"ut$8D$,t jP$DL$x15 e^_[] USWV扮U]`@ @:[@hNd VM dRSuuQU="5^ 葂R":jjuS; ^j^ SEP6; 1NF0F4FG\MPjÉWEۻE]M1 ؃^_[]ÉWEUSWV 2]E11Uwr}tj} 1)rS uO@DD9v1@LDMWu Pi }tFEMDDP|HL@M1 ؃ ^_[]USWV`E Uu}] D$E$E$ 2]1L$Xu(PSWVRt$t$ Uƃ](x}R1NV5tz1L$LU @AQQPDtSL$S)DD$WM$U ])@ )@)@0PQRSEPEPEPE PjD$,P(tWVL$X1 e^_[]$t$V1|$ t$ USWV2]}11EFE0xpPjCt']u܉ucCE MSPQWjVƋM1L ^_[]USWV2]M1EGBM NjE1]wG<GDpًBjVP3V@tXjjjuj@tBPjjuP|@ut&uWB tWhBM1{ ؃^_[]USWV } ]2]fnfnflfs f  W1EEHPjBt!uԉu BuWSjV1FM1 ^_[]USWV2]M1E@t|M NjE1]wG<GDdً@jVP3V>t?jjjuj>ut&uWmA tW-AM1@ ؃^_[]USWVnpF|U]`@ @:[@hNd VdERuSPu UDž"yR*"jju q2 1FFXK1ɍV ~CH @HQWRP6"xfF t_~N W1dž)Q0)A )AA"QvuWP=t~( F0M 1džF džt jP9F|de^_[]UtnpF t jPa9]USWVn`Fl]`@ @:[@hNd dSuu UDž"wRv"jju 0 /FFHK1ɉ~ CH Nx@HQWRP!5"xWtQNW1Fx)Q0)A )AA"VxQvuPt~ F M 1FxFxt jP7Flde^_[]Uun`t jP7]USWV扮]EMbB B:[BhNd=:} du$WSQuPu UDžyXFvRИtAjju / t.E$tjjP/ tt {tf;u} tde^_[] .t߉F~1~NV WRQuZ3~eFZMV<1džF~@~ N$~,~(N0NV4t3V@džRPQb/ xN@tF 1$FN$A1@AQj<1F@džt jP5džNv;V1N@Wdž~ ]A0E )A )A)UQPRSFPF PWPFP$~džu"FHxU$NP} ҉tNT ~Fdž/jP5U$dF@t jP4$]U$dFt jP4$]USWV 2]M1E9M NjE1]wG<GDً9jVP3VjjjujEUSjSRjttojjjuj^tYjjSu SEt@jjju$j/t*Mu(W9 tMW9M1 ؃ ^_[]USWV扮]}`@ @:[@hNd dCrR͔jju + W*FE1ɍV^~ N QWRP/}VJF?1N<džF^$~,~(N4N ^0~@~t3V@džRPQ+ xN@tF1$FN$A1@AQj81F@džt jP"2džNv8V1N@Wdž~A0E)A )A)QPF PF PWjFP}U džuFHx NPlj }Fdžt jPo1de^_[]UdF@t jP51]UdFt jP1]USWV 2]M1E*6M NjE1]wG<GD|ً5jVP3V6tvjjjujv6t`EUSjSRjU6t?jjjuj?6ut&u Wm6 tW-6M1@ ؃ ^_[]USWV]}u SWVUy SWVP^^_[]USWV]}uVSWu Uuy SWu P%^_[]USWV 2]E11Uwr}tj} 1)rS uO@DD9v1@LDMWu P }tFEMDDP|HL@M12 ؃ ^_[]̉AA AAAAVt$T$ȋL$ 0@JH@H^ U1V]USVE] AAfAI PsF@FD^HFPFLF\FXFT^[]USWV(2]1D$ yDt9vV|vDLVFDFTFPF\FX~ N*tSNr/FT r‹@)ƒ s8Ƀ%RP FFfFL$ 1l e^_[]t= USWV@2]] y Ή1D$8)1ۅx t~Dt1ۋL$81 ؍e^_[]>tU ]ÅuhWVhVPV]WD$)D$jjPjSхuD$u]1~HDD$ 藏M Qu\$St$PVÅFDuD1~H\^u ut$SPVÅFDun^D D$jPS̑Vt D$)D$1T$F@RD$L$NXFPtVy11@USWV2]11}$E }?jRɌj"1$WL$s0)C )C)PVQ= D$L$HL$ W0SD$PjD$P襋 Cu/D$ w&1Ft11uSSt,Ut G;|$r1$1 e^_[]1USWVp2]]11ۉEtfHt(uZuE1UM Fh1Kt1u }Hu1(EVVj SjPVVБVt1FM1 p^_[] USWV`2]׉1D$XhR$tY tP\$ WL$)C )C)C0Pp/D$L$ hx1SPQjD$(P  C1ۋL$X1@ ؍e^_[]USWVl2]M11ɉEtF؃@hu:U u1}Fh1щ tSWu 1FM1 l^_[] UM 1uuu ]USWV2] 1}$j}@]։˅t f;K%gR诉"+KUL$(D$ D$( @|$,1DŽ$$fD$pD$$tf;T$p+ t$$Wt$D$`)D$P)D$@)D$0t$ z-EL$($D$L$vD$pD$pL$|$T$\$$D$0PRWSQjV "u#|$8uut$0u K 1 L$pzL$($1 e^_[]UM 1uu]USWVp2] 1}D$htL$h1 ؍e^_[]É׉΅tf>t^eR"ttW1ۍL$\$`)D$P)D$@)D$0P0,\$(\$ \$D$,fD$t{v \$|$ D$L$0T$ QRPjD$ Pd "u\$8u E L$D1ۉL$1~UU 1uuu ]UU 1uu]USWVP2]1D$H6dR"tQ`tH} t$\$W)C )C)C0P+D$8SPjV'"ut$L$H1 e^_[]USWV2]M1E)t^M NjE1һuWG<GDXSRSVRwt*MuWy* tMW8*M1I ؃^_[]USWV`2] 1}D$XuMbRu"t1t(\$lj @s L$L$X1 e^_[]D$thuP t$\$ W)C )C)C0Wb)D$U L$ D$SQPjVd"tt$(kUSWV1ۉ׉ΉYSRShSjVPhHrWSSjPVF^_[]USWV 2]M1E't~M NjE1һuWG<GDdSRSVR%tJEUSjSRj%ut&uWk( tW+(M1> ؃ ^_[]UVA΅tPLV^]yUSWV`2]1D$X`R`"t1t(\$lj @s L$xL$X1 e^_[]D$thuP t$\$ W)C )C)C0WM'D$U L$ D$SQPjVO"tt$(hht$ u< 1MUSWV`2]1D$X_RP"tctZ}t$\$ W)C )C)C0P&U L$D$ ySQPjV'"ut$(L$X1_ e^_[] USWV2]M1EX%M NjE1һuWG<GDdSRSVR#tkE1F@UEjVRPV"utAuW% t(ËGPMP9EW~%}ػt M1 ؃^_[]USWVp2]1D$h6^R"\W1ۍL$\$`)D$P)D$@)D$0P%M |$w_fd9wv|$D$ L$0 8QPRD$P"ut$8u EL$D1L$wL$h1 e^_[] UV2]1EAEEfEr MRP芙E9t8vEFEMNEEfEMwvM1 ^]USWV2]M1E"thM NjE1ۍu1ɉ_AOSuRPuu uWxrE@ vRSP#tkM1AAA Pj vDžxtG@Z{ t;~t[fC @@ pGGx upVEW9pt;N9qAE0Fx upVEW9ptgN91AD]8w~@ }F@@ F@P H y uAHJ?9Gt H9yDY87~@ }F@@ F@JJy uAHJ?9GtH9AyEBPNv~ F EM@@ Eȃ^_[]VhViwUWV}w(tV讲 G$r,OprQ)у s"$щVQM j,WB ^_] USWV2]U]1Ex t)ߋ];0~ MuvE܊E sMDO_}9щ9ʉü]Ƀ<ˀ tɉلtp΋]UM}E;0}ERWVjPlTEux tFx u-@Ƌ@x tVƋ@x u;0t~ u ]}1҉΋FN;Os"MUuWuPRSECj0uݨ 3CM1= ؃^_[]USWV2]}u1EytCU 9tB9tcE܉ЋvXxU9ډ]}}  tVuV1v;BruuRjW6SBPp;suuPjԋx tGx t3f.Nj@x t98u;8u Nj@x t tɋUG9WsGx uuWj9U}U uusar^ t%Fx u!;ptf.@6~ t;EtUu;PU pst\uuRjEuujPEM1~ ^_[]uuu juVQM1T uuPUSWV2]ϋuU 1EHEy u_2Z}f.Dy9qCҋ рy t;Et M uʋ R;HPrFuE}j0 ËCCE fC ICKKCCC$C C,C(K C(C,ESSRuPEFM1! ^_[]USWVP]AA΋C{vMU wKNZE=BrG$P @#H GP MAQSP E U MF~IFNV F$F(F0F8F<F@^_[] USWVy8΅ta^<9tf.X9u~8F@)=rO)σ so#PQU F8F<F@Fr+xrQ)у s'$щWQ FF^_[]w USWV΋EM2]1T$L$$N8V몃 D$ <$D$i D$<r1L$(xrQ)у $щWQ趄 D$ T$L$T$(D$8L$0T$(D$uLt jG9r^_]USWVE} Mtv1t P CEt P GE1f.ELtQX @C9rۄu nE1tc1DED<u} tED@<u0EDt!P} }@f.D1C9r]t98tOQP 8XD؀} ;EEƋtWPS3 \}tM)QPS3 \E1f.DMLtE)PQSx3 M\\G9rτu dt P OEtF1fM|9u)MLtE)PQS3 M\\G9rŃ^_[]̉TQWUSWV2]}11FE} }u܉M ]1SP] ukE؉ruPt;Uwhu1ҊB9ut)^V1)U Wr1QhWԱ t u M1x ^_[]USWVuEUY} €}uqq҉uux9U}_ƒUVU}U׋U }s5u47uuu}?wEU?  EA9t/׉€>}w?w jPRVWZ3U= = ȃ^_[]USWV$2]]u 1Ew)FN9s_PVr6D~s_N)sbED$D$ D$$OED$$D$- /~rFFr9؉}w~r `w ~r G- ~r9؍W $?~r ؉$?~r ?ˀ~r\8N)v-V)9s5ML$D$$D$ 7~r~8$~r6D$D$ $訮 >+}M1g~ $^_[]USWVؑV11t@=rf.ft,݃ GjhSuu^_[]UVh΍HhD(h9r1?wfDHhD(h@rh7wDHhD(h8r犎wPhL(hvQhD(huQhD(htQhD(hsQhD(hrQhD(hqQhD(hpQhD(^]USWVq(\ F(v,\ F,v0\ F0v4\ F4v8\ F8v<\ Fw3t+Hπ?wE эUjSQRP(Ë}M1u ؃^_[]̉A A1fHfH@USWV2]111EGA I F EN ^f^>f^FPuI9t/EU]ERSP>rN]E +M>M1.u ^_[]USWVE\Xkd|2t tu2Y Y Y Y } T2fttuAAA2@WP^_[]USWVP]}  \X"\X:\Xr :\Xv1G^_[] ȋ\XkdUTtu"1ʋECPE0Sy봀|t>~t |0tD.~t |HtD4~tDLMxEȉE‰E@rgEp ZEpM<\XFtEt,PS#U CRSWVT$ t7ցfw &sA s fA^_sʀw$`QWAуAAƀy Qu9B9Q밀y Qt!A1똀y Qt  A넃QyUSWVE y t[E1ҿpfXpgXÈ8Q D8t\Ydu tUBVPR^_[]̋T$D$ uT$t tu QA U$EPؒVE]U$EPؒVE]̹]hV ],hV>o Y̡ ]P]j$%;Uq j^3ۉuhcVM؉]]T,E؉]P],]0]&MEr:M@EԉME=rEPEP;%EYYMPQYl MYYhV]u]n Yp hcV<0]+hV^n Y̡ ]]̡ ]]hV0]|+hЈVn Y̡ ]l]̡ ]|]hVm Yh Vm YhV 1]+h0Vm Y̡ ]]̡ ]]hVD1]*h`V~m YhV\1]*hV^m Y̡ ] ]̡ ]4]̡ ]]̡ ]$^hV1]\*hVl Y̡ ]P^̡ ]h^h|Yt2]*h`Vl Y̡ ]^hpVl Y̡ ]^̹^07hVsl YhV]l YhVMl YjjhX^^譁hV*l YVWj! YX^TjVX^XAhVk Y_^̹^A̹^6hЊVk YhVk Y̹^P6hVk YhVVh,ZPV^hVVh1YPV^hV=k Yj Yp^^h^VjX:Ulm uu Nue,FM FHFHF@ F@ l j{:Um }uV; eF PO + l UM UVAq+9BvB+B;ryr VQj-R&MP) E^]UuM &MP E]UE=r PY]ÅtP{g 3]UEH#;$Q^g Yȅt A#H] jY@@f@ j(Y@@f@ j@wY@@f@ UM +MEQu+P= ]UVuW} +}WuV 7_^]Ujh:UdP2]3PEdE =rE PEPE YYPuf YYMd YUVu N?$ ;u u^]UVu ;u u^]USVWu EPu }˥uVt E0@?{ffft=u M3SVMp`Vuu MA_^["j:Uj uF]++=?@PEPΉEF$M eV}  FW9EuP6u6YCVPvuFuuWi uMu'jj諛 J#U SVWF+M=t}@PE}PΉE#]u +ENjȉE| V;u]VWSQVˋ]C VPRQuuWw_^["Ujh:UdPV2]3PEdpuOj6Id YYMd Y^Ujh:UdPV2]3PEdpu_j(6c YYMd Y^Ujh:UdPV2]3PEdpuDj@6c YYMd Y^Ujh:UdPV2]3PEdpu)j06bc YYMd Y^Ujh:UdPV2]3PEdpuj(6c YYMd Y^Ujh:UdPVW2]3PEdu vuƋ6jPb YY~ tߋMd Y_^UVu WvuVu6DYY~ t_^]UVu WvuVu6XYY~ t_^]UVu WvuVu6nYY~ t_^]UVu WvuVu6YY~ t_^]U VuEPuuEu^UVW}pg~ 7Gu,S] SN74#yv33w6@G~ t[_^]UM;M tE9t;M u]Ujh:UdPV2]3PEdu N. j(Va YYMd Y^Ujh:UdPV2]3PEdu jNj@V` YYMd Y^Ujh:UdPV2]3PEdu jNj0Vx` YYMd Y^Ujh:UdPV2]3PEdu Nj(V2` YYMd Y^UEx uM P!x2]UQQS]VW;w[GQPSE NQQuM ESP_wL ErEP7YYE_^[ j;U4d ];wYGQPSETNQE_weSuPވ uEr @P7-YY7c U USVپWK+M;rkC<VPWENQ{}M Esuuuur3VPq GPVYYSP\ E_^[U USVپWK+M;rhC<VPWE?NQr{}M Esuuur3VPB GPVYYSP- E_^[Ujh:UdPS2]3PEdE 3;EuPu]uw uËMd Y[UQQM SVW};w\E+;wStR]AK CUE0+uPVQ WuVG8 t%E+PuV 8 u҃_^[+UVu W}WVu+u _^]UVuW}W ;} uuVV, _^]UEVW} r;rt/S;uBNVQBWW E[8PWM_^] UVuF;Ft F P^]UMU ;tVuW}ff;uff;u_^]UE3VxVVV@tHʅtjQR ^]j$%;U` E3xV^^tfPM؉]E]9E؉]Pe MEr6M@EԉME=rEPEP/EYYMPQM[ YY_ jX;U$` EfxVFtPMePd M_ jX:U_ uEefj(FYK_ UQ3VEuuFFT^UVufF"^]UVu3fFf^]UUVNBFBPu^]UUSىtBVWxG0,VO_^[]UESًtBVWxG0,VO_^[]j;Uw^ ى]{3VV4VECCCCs CVEuFYE WC "] UQVufhVcEFpV^UQVW3uV>~Y~~ ~_^UVuRV^]UVu2V^]aaAVVUjh;UdPV2]3PEdFV `PEPX YYƋMd Y^SV3Wj~ ^ WVtSSjWVt~ ^^ _^[Ujh:UdP2]3PEdxVmMd YUjh:UdP2]3PEd Vu APYMd YUjh;UdP2]3PEdyt j(qUW YYMd YUjh:UdPV2]3PEdFtH0Ft j(PW YYMd Y^QUjh;UdPVW2]3PEdN exV9:E>*Md Y_^Ã5Ujh^USًMVWtAxG0,VO֋M tBxGp,VO_^[]VBx tB ;PuЋ@x tPY^j- ^_^[j=U9O eE Q̉ePmEsEluBM N U 2]3ʼnEV3DžhVP~ u3fEjj jjjjVV$VRP$VRP$VMRM PfMj#PfMܒVM^3M j<>UkN 3EEE؉EEPYt);EP YMEQPMMEr6M@EME=rEPEPEYYMPQH YYM jF>UM ueMFGM UQSVu3Wt tZVhVEVt4hVPVt"t 3@}j[ES,V׋؅u^hVVu3MhVPVt9t}j Yj XEjYjEMPj"VP,V3ۅË_^[UQSV3SSjSVt_Sjj tNSSj u>WEVtjEPjSVtjEPjWV_^[iBUA3Ʌt9HtPuEYYEH@]UE M#P+ƒw]鑪 UMV;Mwu ֋E+;w 2;BȋE^]UMV;Mwu ֋E+;w 2;BȋE^]UQ?++;w;EsE]UQ++;w;EsE]UV>tF+P6GYYME FEF^] UV>tVv6iF+P6E MFEF^] j a>UJ ujXNM9Fr6WUWU;s ej[(ٸ;G؍CPYEE@PVW o M EEI UEVxr0yrpVqR>^]UQAESVuF;u3ssF } u p;Cu s0;u3FWx GP ;u8Jy t5;xu WG@ G@@ GpLy u@ A G@@ Gx,;8u WG@ G@@ Gp Gx cuC_@ ^[ UUVrBx uPBF;PupB;u0pr^]UEz u ‹рy t]UQVbEuuK^UUV2FFx uPBF;PupB;Pup0Vr^]Ujh:UdPV2]3PEduejVQl FfMd Y^U M/hC[EPby hVV>tF+P63YFYF^V>t(Vv6F+P63FF^V>t(Vv6F+P6i3FF^VFr @P6FYYfF^VFrEP6YYf3Ff^hVhhVhxVhLVUQ}Vt3WEEu~Pv 78;F uEP7EP_^UE=w PY]YUE=?wPvY]8UE=wPUY]UEЃxrpR6]j-UuE GO+] ;w,Gre4SuVo SuEuSD j-UD } ;~w&~r~eWuS"o ;uEuW_cD UEVu WP;r$M+;BʃxrQpP>_^] j-UD E ;Gw+rGe4VuS[n 3fuEuPC UA+‹M;v],VW7vWv6vg_^UVuFPAFP8F0P/FUB QEeEPuE EuQPuE輀M *M"!B UE PuYY]UjhU1A d,3ۋ ^t] ];uW^^o@ þ]V? =]YuhVω]]]t]h0V@> MV?? YYU=T]VuFth|VhVfU^]jh?U@ d,3ۋ ^}} p];hX]ω__@ hp]> =p]YuҍE]PEEPQhVPEEP?VPEEPhVPhX]E,MMMM]h@V= M$p]> Y;UQSVYs+3W3t*WEtu |3u9G;r3t!WZt v"G;rߋE _^[uM>EPjB?U> OU;Gu+;1Glj}rEU 2;vE;w ;w3++MeAEEQPPh EESu EPBc E+PE PEEP c $Vu ERuVV= j,e?U7> uEPEYEЍM؋EVEeEPM= j(?U= xwGp,VO/3EhcVM؉]]IGMQM̉]Qp(,VO֋EEr7M@EЉME=rEPEP2EYYMPQP8 YYE}jX]E]u.̉ehcVYAEE菞M< UQVq EWEyuPV7;t PEPH_^UEA ]UEA]UQVW u~r6u'EPV芪 M ;t ?"tE t+Ή_^hHV)h0Vj8?U$< }Eu 3j S}P]]k EPv6_jXG3]Fu9]v_učM؉]uE]E؋PEr5M@EԉMЉu=rEPEPvEYYMPQ6 YY]EPY; ÃyVEAhhAU; E QPV3ۉ`ƅfg]E]h$V0]Fh,VEE P PLMKMEl@l; HgtkLPxVE <hVMP$E(ME)ExVE$xVE*$$DžhVWE+膻YHpuE,t}tVX j V- LP0E.0)MErHM@lpE/=r!lPpP.lYYpPQF- YY3@ 3Fj`jd, Y`E0t jVJPpE$pWQE1VPK `p:xVE2$$3DžhVWE3YHuE4t}tVj Vc, LPP< j `E?QP ME ]3ۉ]ttEAPYYEË3ۋplE@DžTxVX\}ECuPMXYl'TDXtPXYYEDt#\ttPYj Xq* YYE@Džc$hEDždDžTxVX\hxVTEEnXEFt$\tXbj X) EE@P&YDžTxVX\PTEHXEIt\tSj Sv) MEJExVE@u T]j[Eˈ T]PhVEˉ`YWQV8PP臆hVEVV ``P,YYhJ菈V$V̉lC\PEKp,VPE@hVNVVV8h VTYY$nPmh VYEP0̉\hcVaAELE@aJ@]R2j0,Vl+hVVVVCErHt@lhEM=r!lPhP)lYYhPQA' YYeEƅtENDž8 Vu NEeQQԉEPPFM FHFHF@ F@ ! UQVEuuuPE P^ UQVEuuuPE P^ UQVuu Nu FM FHFHF@ F@ ^ jAUl! &fVuu%Yueu! jBU-! }E3ۋP__w]Vu^gY jBU }E3ۋP__Bw]Vu^芴Y{ Uu M]j Y@@f@ j)BUw EE3j]]ܳYM HM HHfX  jLBU8 EE3j]]蝳YuN M ƉNNf^  UVuWu 7pAF7GFx u P7YBHy tB6@_^]UVuWu 7pAF7GFx u PYBHy tB6@_^]UUBt@BA]j gBU }E7x uPPVWM؋E CA uC ~ S1EσeuuϋESpC} uMvMPtjjXP j BU }E7x uPPVWM؋E CA uC ~ S1EσeuuϋESpC uMMPKjjO jBU u EPu }܋˥uVwt E0@I{ tHu M3Sp`}t ju YYVuuMA; USVWu EPu }˥uVt E0@?{I$ t=u M3SUMp`( VuuMA_^[EUS] V1֋FȀy u$W;9ysIz t;yBы y t_z ux u ;HsЋ@x tE0^P[]Ujh:UdPV2]3PEdpuj06~ YYMd Y^Ujh:UdPV2]3PEdpuj061 YYMd Y^Ujh:UdPV2]3PEdpuj6 YYMd Y^UVu WvuVu69YY~ t_^]UVu WvuVu6OYY~ t_^]UVu WvuVu6eYY~ t_^]U VuEP_uuEu^UUHb By u$E V03 9qsIJ@ By t^]UVW}pg~ 7Gu/S] F7SPYYtv33w6@G~ t[_^]Ujh:UdPV2]3PEdu jNj0V= YYMd Y^Ujh:UdPV2]3PEdu jNdj0V YYMd Y^Ujh:UdPV2]3PEdu jNIjV YYMd Y^UMy uE ;Ar2]UEx uPu qYYu2]Ujh:UdPW2]3PEdE };BǃePuu. u;} v؋Md Y_US] EVWSPuSVSt E0@LUUUtJE]PEPhhX7MWMp`Vuu_MA_^[US] EVWSPuSVt E0@LUUUtJE]PEPhhX7MW]Mp`VuuMA_^[UQEVu W3E;tMG$9uu_^UQQu EPEMMHjBU? uEefj蠪FY jAU  uEefj0mFY jBU uEefj:FY~ UUV3qqBABArr^]UUVN!BaP ^]j CUS uE Nuaaex u  jMBhG[EPG UVuWV萸hXF G _^]UQaaEA MhXUVuWV jXFG_^]UQaaE A EAM jXUjh;UdP2]3PEdyt jqp YYMd YUjh;UdP2]3PEdyt j0q/ YYMd YUjh;UdP2]3PEdyt jq YYMd YÃyt 1IKUjh:UdPV2]3PEdFtHjFt j0P YYMd Y^Ujh:UdPV2]3PEdFtHjFt j0P4 YYMd Y^Ujh:UdPV2]3PEdFtHjFt jP YYMd Y^QQ QOËIUjh:CUdPQQSVW2]3PEdeujXeE ivEËuN QNQMd Y_^[ÃUQV;utyuu^UW uV"u;^t (_jjWM hH[EPFD UVNQcEt j V YY^]UVNQ6Et j Vu YY^]UVNt/Et j VL YY^]UVEt jV$ YY^]UV襷Et jV YY^]UVuEt jV YY^]jnCUj d, ^ 4]; 0]  ÿ4]W =4]Yuej8 YuEtfFh$jX3W50] YWGuV0,V^__WGuVp,V^_UVuW;0E u&x t E MVuE ;u_^]UQVuWuMVPWEYY_^UVuW;0E u&x t ]E M訷VuE ;u_^]UjhCUdPQVW2]3PEduMu[VjP EYYMd Y_^U S]VMMW{x u tMy; suwU9Xux 9u>~ M9u t W}UYM 9Xu5 t(W}z UuGЉUBx tUMHc YH;Ku quw>CACHU9XuHC9uHCAC a A c ;x u;uwNy uA VF TNUy x u Ax toAx uQ@ A NF A F AMV@ UIy uA VF bUy uAx u7x u/A Mv;H-G JtIJ_^[x uAQ@ A zF A F MV@ _jCU! E 0tTeM܃ePuueEPO@MQMQ(oMMtVu U} Wt>SuEPO x{,uVu0,V^E PEPK(o[_VW7vW0v6vg_^VW7vWv6vg_^VW7vWv6vg_^UEVxr0yrpVqR^]U]UVu uuu CPu^]jLCU? ى]E K }P]};C Mσ(QPM3EEĉEȍEPYEWKEN;Ct (MPBuMuuu>}E;tC_MQuE8,V~EËEuEME耲}빍MEPEPs UQQVWuEPuuYYuϋu_^UQQVWuEP{uuYYuϋu_^I uhXÃuiXÃuiXÃu,iXÃu~]j} YȉMt33@LjXAAY ωƉN6 jRDU^ }uVѧeFPO; juDU* ]3>~]j}& YȉMt33@tjXAAY ωƉN jDU ]3>~]j} YȉMt33@`jXAAY ωƉNL jDUt ]3>~]j}p YȉMt33@jXAAY ωƉN jDU ]3>~]j} YȉMt33@8jXAAY ωƉN UVuVuYY;u u^]USVWu EPvu }˥uVCt E0@?{ffft=u M3SMp`Vuu_MA_^[臽USVWu EPu }˥uVt E0@?{t=u M3SMp`Vuu׺MA_^[jDU uE+jY؋F+E= @P PΉEKu ek}ߋˍCE܉E-FV]W9Eu P6. u6"}CVPvu E@uPW  u܋Mu uMuhjj}5 UQSVWEs~ u=u FPYYtv tFPu YYEދ6~ tƋE t06FPu YYtv~ tEx_^[Ujh:UdPV2]3PEdpuhj@6&YYMd Y^Ujh:UdPV2]3PEdpuMj(6YYMd Y^UVu WvuVu6YY~ t_^]UVu WvuVu6YY~ t_^]UVW}pg~ 7Gu,S] SN7tv33w6@G~ t[_^]Ujh:UdPV2]3PEdu jNsj@VYYMd Y^Ujh:UdPV2]3PEdu FPuj(VMd Y^UEx uM Pu2]UVuW};} tWB_^]j EU u]}uu]eWu;} uSVV l UVW} j0,V_^]UQQu EPPEMMHUVuF;Ft DFP^]j DU, uEefj@荓FYUVuf0jX2^]UVuf0jX^]Ujh;UdP2]3PEdyt j@qYYMd YV1tpjVYY^V1tVAjVYY^V1tVsjVYY^V1t j VeYY^W9tVjp ,V^_Ujh:UdPV2]3PEdFtHjFt j@PYYMd Y^Ujh:UdPV2]3PEdFtP6FYYt j(PYYMd Y^qq1z VN^%I<0jX j(WEU u3Ɋ;G;FrHt*=tωU;u;UtEu.ωU;;U $2EG:FG;FG;FG;FɋGF;t0u2Gf.FDx땋 ϋ ;wM܉MMfv3MEEEPM9MEt]A+jYU܉MȋB+};u=EC΋:38CE;tW't#jX;uu]Mt8M2wM̉MЍMveMԃeEE̋M;Eta@;AuYϳ ΋ ?ȉM7uE,FP;Et$(H(VytM.uM;u2ۋM؅tMЅtwJEQE_E_EgE+EEEˌEvEE+E_EJEUSVuWtotdKt@WtL=t udtG;F< w7$ER ΋8I t`tpV<<2_^[] ϋ؋ ;;_ ϋ؋T ;wrz߅trG:F뫋G;FG;F똋G;F|J< P{ PYYpFf/G^G;FPr G;FB=>EEEEEEEЏE>E>EE>EE>EUEVt jVyYY^]UVNEt j0VMYY^]UVNtEt jV$YY^]UVEt jVYY^]y|y~yuy| yr2ËAttu2Ãy|yrËAHVtt2tu$A3;Qu^ËA3Q;| ;r;t2^ËA4^j~EUd, ^ H]; 8]þH]V=H]Yu38]hXhЃVE<]@]D]%V(YYUA+jY +;w;EsE]UV>t$Vv6F+jYkP6臋kE MFkEF^] WtVjp,V^_Vq tѯjVYY^Vq tVjVYY^Vq tVjVYY^Vq t9j VYY^Wy tVjp ,V^_UQu up ]UVuW;0E u&x t .E M賝VuE ;u_^]UQVuWuM腝VHPWEYY_^3j EUuF+jYu΋eVWv}6uSW+uMu!jj' V>t.Vv6cF+jYkP6i3FF^UE= wkPlY].VW7vWVv6vg_^V~ uNtjf^V~ uNtjf^V~uNtjyf^V~uNtj\f^j EUuejIY]Et7j4Y}Et'gWY3WE3FF EËuFMtÃfPMhG[EPk% j FUuLejY]Et7jY}Et'gW:Y3WEg3FF \EËuFMtÃfPMhG[EP$ j+FUVuejY]Et%j Yt ``3P%3FF EËuFMtEÃfgPMqhG[EP$ UkE Pu蜆YY]VVB wHt>Jt1t%t u.k'Ntjf3 _f^UQQVWuEP uu1YYuϋu_^UVW} WvGPFPVEF8_^]UQVuWt:u4Uϋ4j_A+;s>kPEP~-~u% uϋV2_^U]jRFUd,^d];v}u'~ uZϋZP;t>(>6t.~uYj^@+;sk.]d]W$=d]Yqeh VMWYYRUy u$AtujQMmhH[EjMhG[EP! Uy uAjMhG[EPg! Ud,^V`];_~ u:~X]EF^W`]W:=`]YuhVWYYjM\hG[EP Ud,^VT];_~ u:~L]EF^WT]W=T]YuhVRWUYYjMhG[EPe UVt+FHtttuVF3ҋF^jMhG[EP Uyu$AtujQMhH[EjMYY^]UVmX(Et jVYY^]UVmX Et jVYY^]UVTnX\Et jVYY^]UVnXEt jV~YY^]UVnXEt jVNYY^]UVnXEt jVYY^]jIUd, ^ ];lþ]Vy=]Yuu e]iEh`V]]tmXVYYj6IUJd,] ^ ]; ,þ]V=]Yuu eEhV]]~]j}YȉMt33@tqXAAY ωƉN%j]KUM]3>~]j}IYȉMt33@rXAAY ωƉNj]KU]3>~]j}YȉMt33@rXAAY ωƉNoj]KU]3>~]j}YȉMt33@drXAAY ωƉNj]KU<]3>~]j}8YȉMt33@sXAAY ωƉNjKU]3>~]j}YȉMt33@`qXAAY ωƉN^j]KU]3>~]j}YȉMt33@qXAAY ωƉNj]KU+]3>~]j}'YȉMt33@qXAAY ωƉNj]KU]3>~]j}YȉMt33@qXAAY ωƉNMj]KUu]3>~]j}qYȉMt33@qXAAY ωƉNj]KU]3>~]j}YȉMt33@TsXAAY ωƉNj]KU]3>~]j}YȉMt33@qXAAY ωƉN<j]KUd]3>~]j}`YȉMt33@rXAAY ωƉNj]KU ]3>~]j}YȉMt33@qXAAY ωƉNj]KU]3>~]j}調YȉMt33@rXAAY ωƉN+j]KUS]3>~]j}OYȉMt33@rXAAY ωƉNj]KU]3>~]j}YȉMt33@rXAAY ωƉNuj]KU]3>~]j}虾YȉMt33@(rXAAY ωƉNj]KUB]3>~]j}>YȉMt33@@sXAAY ωƉNj]KU]3>~]j}YȉMt33@~]j}舽YȉMt33@xrXAAY ωƉN j]KU1]3>~]j}-YȉMt33@rXAAY ωƉNj]KU]3>~]j}ҼYȉMt33@PrXAAY ωƉNSj]KU{]3>~]j}wYȉMt33@sXAAY ωƉNj]KU ]3>~]j}YȉMt33@rXAAY ωƉNj]KU]3>~]j}YȉMt33@,sXAAY ωƉNBj,SY@@f@ Ujh:UdPV2]3PEdpuj,6iYYMd Y^UVu WvuVu6YY~ t_^]Ujh:UdPV2]3PEdu Nxj,VYYMd Y^jKU莿}3Svw oX__V]u^Y jKUJ}swqX3uVEF YjKU useN=d]Yu3ju[Y}Et.jFYEEt qVEZMS5`]蒸YdjLU̹d,^];)]5\]8p,V֡]Oh]]=]Yu3juzY}Et1jeYEEts苉VEMh]5]誷Y^jLUd, ^ ];)]5\]8p,V֡]聸h]菷=]Yu3j}謳Y]Et8j藳YuEtmpXVEWMh]=]նYWj0MUd, ^ ];)]5\]8p,V֡]衷û]S讶=]Yu3ju˲Y}Et.j趲YEEt VEMS5]YdjqMULd,^];)]5\]8p,V֡]϶h]ݵ=]Yu3juY}Et1jYEEts轎VEbMh]5]*Y^jMU|d, ^ l];)h]5\]8p,V֡h]ûl]S=l]Yu3ju+Y}Et.j(YEEt TVELMS5h]bYdjMU謵d, ^ ];)]5\]8p,V֡]1h]?=]Yu3j}\Y]Et;jGYuEtipX~VEMh]=]肳YTj4NU̴d, ^ ];)]5\]8p,V֡]Qû]S^=]Yu3ju{Y}Et.jfYEEt qVERMS5]貲YdjuNUd, ^ t];)p]5\]8p,V֡p]聳ht]菲=t]Yu3ju謮Y]Et9j藮Y}EtVipXWEMht]5p]ԱYVjNUd,^$];) ]5\]8p,V֡ ]蟲h$]譱=$]Yu3juʭY}Et1j赭YEEtslVETMh$]5 ]Y^jNULd, ^ ];)]5\]8p,V֡]ѱh]߰=]Yu3j}Y]Et8jYuEtPfdpXVEMh]=]%YWj8OUld, ^ ];)]5\]8p,V֡]û]S=]Yu3juY}Et.jYEEt VE^MS5]RYdjyOU蜰d, ^ |];)x]5\]8p,V֡x]!h|]/=|]Yu3j}LY]Et;j7YuEtd@pX~VEMh|]=x]rYTjOU輯d,^];)]5\]8p,V֡]?h]M=]Yu3jujY}Et1jUYEEts2rVE`Mh]5]蚭Y^jOUd, ^ ];)]5\]8p,V֡]qû]S~=]Yu3ju蛩Y}Et.j膩YEEt _rVEMS5]ҬYdjlsX^UQEVW}w&fVuY_^UQVuu|sX^UQVuu|sX^UQVuu论sX^UQVuuкsX^Ujh;UdP2]3PEdyt j,q͛YYMd YUjh:UdPV2]3PEdFtH=YFt j,P{YYMd Y^Ujh;UdPV2]3PEdj%(]NQMd Y^{j$SUEM؃eeP#UEPV~YYM؃r4UAMԉUЃerEPEPSUYYMQR讚YY>jISUQd, ^ 0]; ,]þ0]V=0]YuehV薜V虝YYjDHU%(]u+j YȉM3EtuaM(]t薞hsXMO?EEPM蠸hxN[EPMUVuW;0E u&x t !E MFVuE ;u_^]UQVuWuMEV蝎PW@EYY_^juuW;M_^[QUjh:UdPV2]3PEdpuj46FYYMd Y^UVu WvuVu6fYY~ t_^]USVW}gp7G~ u0E PF7Phtv33w6@G~ E tӋ_^[]Ujh:UdPV2]3PEdu jNJj4VrYYMd Y^UEx uPu u2]US] EVWSP^uSVt E0@LNtJE]PEPh'tX7MWMp`}VuuLMA_^[Nj TU_u]}uu]eW88u;} uSVVI UEU ;U u]UME PQYY]UM +MQjuE ]UQ;Qt EA uR+]UQ;Qt EA uR]UVu W}VMu;uE_0^]UQQu EPEMMHjmTU,uEefj4(FYєVW3j>~~~ ~d(Yx0_^jTUє3GGE@E;t7+j8YϋVk8G}ȉOeWPuSGAUQVuu,tX^UQVuu@,tX^jTUى]E{3ɉC OOsMVuNYEW螓UQVuu~t.Vv6F+j8Yk8P6!3FF^huXTUE=$Iwk8P Y]DjH"VU譌]ˋE j]3E贃P,V؋S]M蕃 q,V3ۍMW]]AEEԉ]PM]ȉ]lAEEЋMEPEEPE̾r0M@EME;rEPEP?EYYMPQYYMEr3M@EME;rEPEP?EYYMPQ諆YY=jPOVUEeEE E7؋3;st+VuTPuωE2uu8htXM+EEPMhb[EP薼j|VUًu x}eVDžx0jXޢeF jPxPFPWMxEUC8p,V֋؍EP;r ,V֋MpUQSYV0;t/W~( ME^;~,uF(VF,s0;u_^[j@GU}tp,Vքt蝉h`uXMT*eEPMhLb[EPUjVU脉uq;>tgw(]jM|M؃eEjQ,VMӃMM؋؉]t Y,VMӋM Ph;w,uΈUQQHH P@JI#ыjVU׈39EEEEMQr7uE,VYu u2EdM}t_j8[ x;uuE+lj}k8EE=rEPEPJu N @uN85EFP^]UQQuEPE (PjAU賆uuoNueFM FHFHF@ F@ 4 j2WU\EE3j0]]YuuNXM ƉNNf^ UVuWu 7pCAF7GFx u PX=YBHy tB6@_^]j MWU"}E7x uPPVW4M؋E CA uC ~ S1EσeuuϋESpC uMxMP肞jjUSVWu EPu }˥uVt E0@?{UUUt=u M3SMp`&Vuu:MA_^[ =U VuEPuu^Eu^UVW}pg~ 7Gu,S] SN7tv33w6@G~ t[_^]UEx uM PUu2]UQQu EPEMMHUQSVu3WV}__39OFPYjd_^[Ujh:UdPV2]3PEdFtHFt j0P~YYMd Y^UQV;ut|uu^j$SUWEM؃eeP8E؋P8M؃r4UAMԉUЃerEPEP6UYYMQR ~YY蛂UVW}Wt=Wkt/S^t"twp ,Vքt2[2_^]jH}WU臂5P]u6jW}Yu3EtVFYM5P]thuXM"EEPMhxN[EP衳UQQuEPVW7vWv6vg_^UQMI]UVW}W;t (OPW_^]Uu MY7]jWUQuENuE MFaa6e j$SU<EM؃eePd6EPVuYYM؃r4UAMԉUЃerEPEP4UYYMQR{YYj@GUƀ4]9Ath]gtPh0vXM !eEPM]hxN[EP jAU9uuiNEeQQԉEP,FM FHFHF@ F@ UQVEuuuPE P^^ jWUuuNue"FM FHFHF@ F@ 0 jBUX}E3ۋP__4w]Vu^ Y~j8Y@@f@ USVWu EP*du }˥uVet E0@?{$It=u M3SMp`Vuu4MA_^[6U VuEPcuueEu^US] EVWSPuSVt E0@LUUUtJE]PEPhvX7MWMp``Vuu4MA_^[(6UQQu EPEMMHjWU}uEefj8FY:}UQUSVWz]sWΉuE}G_F^[UEVE F^]Ujh;UdP2]3PEdyt j8q1xYYMd YUjh:UdPV2]3PEdFtH~Ft j8PwYYMd Y^Ujh:UdPV2]3PEdFtHj#Ft j0PwYYMd Y^à ~UQQMPEPI(j0WU{uM̋~W@E{GEMEăePEPM}{V0}P^j@GU{Axtd{hvXMeEPMqhxN[EPj@GU{uP;u{hwXMeEPMhxN[EPʬUQVuu讔lwX^UQVuuДlwX^UE VWgg EG0VhG ljw_^]j@GUzAuPN;Ft (4zhxwXMeEPM?hxN[EPj@GUOzAuP;t @0yhwXMeEPMhxN[EP蔫j@GUyA tyhPxXMNeEPMhc[EPOUE]UVuW;0E u&x t UE M VuE ;u_^]UQVuWuM ViPWEYY_^VW7vW蓛v6vg_^UQQVWuEP[uu4aYYuϋu>_^UVMj6M Q^UUBt@E BA]UE Vu&ft QP^]jXU4xuu3xXNEMAA-wjVUwujMxeEPuuu uMyEFXxX~wjRXUwuEN u xX3FMyy,EN0u}F$EF(\w~H~L~PEvwVN00^qoVxXNPt0fN0xN ^/UEVWp `Owte_^]UVN/nEt jVqYY^]UVbEt j`VqYY^]UV2Et jXVqYY^]jXU:vd, ^ X]; T]uÿX]Wt=X]YuejqYuEtfFhxX03W5T]QtYjXUud, ^ `]; \]Muÿ`]WZt=`]YuejxpYuEtfFhxX03W5\]sYjtXUuًEu} EQPF ,ΉE` eMQMEQPEM0s MEvP蔏MF2t j`YU0uE 3ۋME]/PMԉ]])EEPM]̉])EEr7M@EME=rEPEP>(EYYMPQ\oYYEE]PME]F E8p,V֋؍EP;r ,V֋M@M,MkEEr3M@EME=rEPEP'EYYMPQnYY,Fø,F2DsjJYUs3uuMPk MQP~tv9utquuEEPEPutEEt>utFM EEPuMtatavrMta2FøF3VVIjmYUxr&fVuuYueurjDYUmr}M؉}35<]]E],j M]!rSPEEPEȋP诫 PWYYM̅t`MsMEr6M@EЉME=rEPEP%EYYMPQlYYjqjYU}qEE3j,]]YuuNM ƉNNf^ qUVuWu 7pCAF7GFx u Py(YBHy tB6@_^]j YUCq}E7x uPPVW4M؋E CA uC ~ S1EσeuuϋESpC:p uM3cMPHjjUjhYUdPSVW2]3PEd} 3Sh@Z]hC]S71u^t PWvƋMd Y_^[j)ZUouu3xXN}9ywPu N EMyy%goUQVuuNxX^UQVuupxX^jLZUNouu3xXNEAA$njoZUouuuuu uLueNXxXnnyt 1IpQiVN 'Nt]^fVNX|p^jUVEt j$ViYY^]UVNX)pEt jpVziYY^]jZU nd, ^ h]; d]mÿh]Wl=h]YuejhYuEtfFhxX(3W5d]7lYhZUmuL] jmedlVDž|Džd0jX舅LEP|PFPdPwMw dnLEnMHnPևMnMljp[Umى]EM Ew~PM^C e8p,V֋؍EP;r ,V֋]@tkuMPFP~F E8p<,V֍MQ8p ,V֍MEctM%MUdkhxXM EEPMvhi[EP襝j`YuEtfFh3W5][Yj<^Un]u3EEEu MEP?EPVMG E8p,V֍MQ8p ,V֍M+MtE+PQYY\j ^U]ee'}POIMQPt6}t0POIlE΍EPu\2C-FøC-FjjjDYUI\}M؉}35<]]E]j M][SPEEPEȋP苕 PWbYYM̅tJM]MEr6M@EЉME=rEPEPEYYMPQVYYF[UjhYUdPSVW2]3PEd} 3Sh[]hC]S7Fu^t PWƋMd Y_^[j _UZى]3`yX0jXMCKC K(4]C8K@KDQMEZuKEn4]K C8EPC<nMf\IZVNDtIN E\N=\^RUVEt jHVtUYY^]j@_UZd, ^ ]; ]Yÿ]WX=]YuejTYuEtfFhxX3W5]1XYjt_UYd, ^ ]; ]-Yÿ]W:X=]YuejXTYuEtfFhxX3W5]WYj_UXd, ^ ]; ]Xÿ]WW=]YuejSYuEtfFh8yXn3W5]WYj$]UXEMPu F e8p ,V֋؍EP;r ,V֋M؋pMRPWj_UfXe3C]PNE9Xu& 1FÊ]Wj_UXeew]PKDMQP}PKDgE΍EPu?tQj MQMjE赿 EPEPYYM EPMtFMt FV22Fø2Fjj蒈jH `UVu u@q,V֋7؅uN\j,VV\lN ,VV PMlMeQ,VjtMQ,Vp\,V֍MUj=`UVd, ^ ]; ]Uÿ]WT=]YuejPYuEtfFhxXu3W5]TYjq`UqUd, ^ ]; ]Uÿ]W!T=]Yuej?PYuEtfFhhyX3W5]SYj`UTd, ^ ]; ]Tÿ]WS=]YuejOYuEtfFhxXU3W5]RYj(`UTEMPu M̍MF e8p ,V֋؍EP;r ,V֋xtGűp,VO֍M MLS VKPN@^mej `UTee]PK@MQPt>}t8yPK@cˉE|PEPuR2K6FøK6Fjjބj!aU Sd, ^ ]; ]Rÿ]WQ=]YuejMYuEtfFhxX 3W5]$QYjUaU}Rd, ^ ]; ] Rÿ]W-Q=]YuejKMYuEtfFhhyX 3W5]PYjaUQd, ^ ]; ]Qÿ]WP=]YuejLYuEtfFhxXa 3W5]PYVPN>^cj aUQee]PKT>MQP{t>}t8 PK0>*aˉEPEPuP28Fø8Fjj~jDYUP}M؉}35p<]]E]k j M]PSPEEPEȋP# PWbYYM̅tk?M(RMEr6M@EЉME=rEPEP0EYYMPQNKYYOUjhYUdPSVW2]3PEd} 3Sh[]hC]S7ގu^t PW#ƋMd Y_^[jaUOd, ^ ]; ]-Oÿ]W:N=]YuejXJYuEtfFhxX 3W5]MYj bUNd, ^ ]; ]Nÿ]WM=]YuejIYuEtfFhxXn 3W5]MYj@bUjNd, ^ ]; ] Nÿ]WM=]Yuej8IYuEtfFh8yX3W5 ]LYjtbUMd, ^ ]; ]}Mÿ]WL=]YuejHYuEtfFhlyXN3W5]KYSV3ۍqCP`tPc:9Xu u^[jbUwMMeef}P_!:MQMPG}P9\EEEP9MPEPu E=FË}e#tR蝍 MQuME7 EPEPYYM EP6M܅tI;Mt=;K2e=Føe=Fjj}j(`U'LEMPu M̍M'F e8p ,V֋؍EP;r ,V֋xtűpH,V֍M|MCUK nXUQ3oXAAA MCUV~CEt jVtFYY^]j@GUNKytJhxyXMeEPMdhxN[EP|U]9jbUJEtyXeEPMB`JjDbU,K]eSp,V֋p,V֋Sp,VքtSp,V J2jj&hyXMEEPMdhxN[EP{̋A UVuNd^]j]KUI]3>~]j}DYȉMt33@$zXAAY ωƉNMʵFUVjh\\]hM]juڅHQp^]j$]UFEMPu e8p ,V֋؍EP;r ,V֋M؋p;M|>FUVW} p,V֋p,Vjh\]h\]juurpPu,V_^]jUUE3MVE}MVuQ0,VփMM܋mGtq,V֋E H85EUQVuu`_lsX^UQV;utuu^UVN=Et jVD@YY^]UV3PYbF^tMQH]j@GUDytDhxzXMBeEPM$ht[EPCvUVjhpZ]hM]juzP[^]V~u FF ^j 7cU'Dى][CEpzXEeM8p(,V֋؍EP;r ,V֋MP ~M<CUuP謤Y]jPux6eeYYNTQM"eEP9j9F P9F8P9FPPR9jMAMjQE0,V֍MЉCKCM{tw0!Aj@GU}A}tAhzXMeEPM'[hxN[EPrjcUgAejhX]hM]juP@jjrj$cU@M EMЍMPae8p,V֋؍EP;r ,V֋MЋ@MPM8)@aaUP蛰Y]釸j dU@U B+t RuLB3EEEE΍EPuEPu MtE+PQYY?j dU@ى]} 7u;wt)eVuJFË]} uM3?UQSVW}ًpL,V֋NNp,V֋Er,V֋uWVgt WV_^[UVu ustPo^]UVWjh\[]hM]ju}ȃQ By+u9AtP RWO_^]j$]U>EMPu e8p ,V֋؍EP;r ,V֋M؋pMG6=UAt=hH{XMdeEPMWhxN[EPeoUPY]}UQQSVWjhX]hM]juى]|E8p,Vu؋;p ,V֋UM@BpQWPsY_^[UQVu|EffF{X^UVoXNt+Et jV7YY^]jUU<jh4[]hM]ju{{pPjRVp,V3CVM_<{EVuP2,V֍M܉C=;̃aaUQVu{X^jQdU;d, ^ ]; ]|;ÿ]W:=]Yuej6YuEtfFh{XM3W5]9YjldU;ejh]]hM]ju>zH PMuRp:jjljVU:M]u pL,V֋HuI!}MPE0jXR!}EPpL,V֋tHMM؋Yt.Vv6>F+jHYkHP6S3FFWkHF_ȉN^]t.Vv6F+jHYkHP63FF^jeU380,VuMu c>MeQp ,V֋MEPMfMr+E2 UE=8wkHPY]Lj&eU2jh_]hM]juqˋ~W= EVWPeE;tuuuMS2j(QeU{2u3EEEEM̍EPu }Etj;]t"jH_j0,V;]u}uE+lj}jHYkHEE=rEPEPE}YYPW/-YYE%8p,V֍MQ8p ,V֍MM)g1UQVju|X^UVjhp_]hM]juzpPpn^]jeU;1~8p,Vu Mu>MeQp ,V֍MM))0j&eU0} Wu|WuEPeE;tuuuMU0UQVWu3u~~u N9y_^j(teU0EejhZ]hM]jP?oH PQME覭MQMtM/YFVaNQ ^UQVuu?|X^j(eU/ى]ԋEM؉]3h]xXCuuC uM؉EQȉppEr3M@EЉME=rEPEP/EYYMPQM*YY4]C$C00jXs8E CHsLsP{HEtgp,V֋{HC$p,VPK q{Hp ,V֋{HC(p,VPK0B-F.VN|XQOGoXN^[VN tKN^?UVEt jVD)YY^]jeU-}]CEp,VM֋sEkeeeEVuPee}܅tGE؉E}MEPuE?MtMtw}H;s u-UVjh\\]hM]juJlP+^]hQfU?-hE] dElp,V֋ q,VփeM؃eW-eE؃ 0jXP DEErIM@tpE=r!tPpPttYYpPQ'YYEeEEp,VjY$,4l}H;s u$UVjh\^]hM]ju dP!^]j`gU%} E]Eċp,VփeM؃ePeE؃eMPE0jXM̅tM%M%# UQVuu3}X^jeU}#}]CEp,VM֋s EkeeeEVuPee}܅tGE؉E}MEPuE4MtMt }H;s$u"UVjhp_]hM]juaP(^]h hU"`E] \Edp,V֋ q,VփeM؃eWeE؃ 0jXPa:EErIM@tpE=r!tPpPtYYpPQYYEeEEp,VjY$,d4t6蠞Y&Md Y^Ujh;UdP2]3PEdeQXYMd YVF@D0XFPBD2܋F@D0pXFHAD1F@D0`XFHAD1^ËA@D`XAPBD ËA@DpXAPBD Vq4XtjVYY^VX^VFN@D0XFPBD2N^ 9t1/Ujh UW}tVj0,V^_]Ujh;UdP2]3PEdQB@DpXBHADeRXYMd YUjh:UdPV2]3PEdqheVXYMd Y^UEV~Xt jVYY^]UEVt jViYY^]h~iU@u(jj38]#<]eu Wf8]pVPXWHVP8PYY 8]<] 8]PQ<]8WPYYaEP@E؋P萺MO(%UE3@;tt u jjjX]US]ыÃу$Eыʃ$Dʋ[D]SVWGG ww__WW O$O,G(G0&320w3_1^[j-YYM̅tMnMEr6M@EЉME=rEPEPvEYYMPQYY$UVu IX;u u^]jvkUuE+jXY؋F+E=.@PPΉEu ekX}ߋˍCXE܉EFV]W9Eu P6 u6}CXVPvuE@uPW7u܋MuuMu:jj 7詾US] EVWSPuSVt E0@LtJE]PEPhnX7MW1Mp`VuuMA_^[j kUu]}uu]eWXXu;} uSVV/ 1UjhYUdPSVW2]3PEd} 3Shf]hC]S7HCu^t PW荋ƋMd Y_^[UVuF;Ft FXP^]jkU}uO MFGFGF aaPeF(PO(F@EPO@w>qq1" Uy u6uMQ(jQMhH[EP4jkUd, ^ L]; H]ÿL]W=L]YuejYuEtfFhxX肽3W5H]%Yj2lU~d, ^ D]; @]!ÿD]W.=D]YuejLYuEtfFhpX3W5@]YUA+jXY.+;w;EsE]UV>t$Vv6vF+jXYkXP6kE XMFkEXF^] UQu u2 ]V>t.Vv6F+jXYkXP6藕3FF^UE=.wkXP蚔Y]\UkE XPuWYY]UQQEVWyHMEExXQ,V_^j(`Uى]̍C PC$PMCe8p ,V֋؍EP;r ,V֋M̋@AHM[M4hklUz]jXYC+T\DžT0jXe(uj (u jT3;sN(W |AlA܉pAPpPlPQRwM葐MEttxPHtEtL(u*|&PTtQT-tQxt@MEM|W XX|;sOLTPPv TA8Q0H w ILR(v jlU(^L ]F`VXH wRt 3EEEE΍EPkE+EjXY΅t EPvMut]};tjX[A;uu]E+ƉujXYkXEE=rEPEP EuYYPV'YYhlUىtsX,赢{H,ejQ,V֋|q,Vքp ,V֋؋q,V֋| q ,V|։x|q,V|֋tMPxPWSF PvMELPMM蓅,8sLtSXBH w Rs KLjr ,\jX mU_L;u$EP= XPJMЅt] 4]9O$uGLG(PYOLPr G$E0jXEE eE3PpPY 3E0jXMG MMMPEBEEPM3EPPY EEr3M@EԉME=rEPEP藯EYYMPQYYeMEE6M.&j\6mU`ً} Et57jPENP,VVe}t KEPM=UEjY;wP$ FE ]ËE ]ËE ]ËE ]ËE ]ËE ]ËE ]ËE ]ÐFFƎFюF܎FFFFjAUOى]u*{ueVO*FM G(CCHCHC@ C@  USVWu EPu }˥uVt E0@?{UUUt=u M3SOMp`Vuu豯MA_^[ٱUQSVWEs~ u8u N3tv tM FPEދ6~ tˋE t06M FPtv~ tEx_^[Ujh:UdPV2]3PEdpuj06YYMd Y^UVu WvuVu6>YY~ t_^]U VuEP3uu Eu^Ujh:UdPV2]3PEdu Nj0VEYYMd Y^UQQu EPEMMHUQ3MAAA Ujh:UdPV2]3PEdFtH[Ft j0PYYMd Y^UQW}t?E;t-SVX(tjp,V֍M͞E;u^[_UQS]t0V3;st'WEtjx,VM׃;su_^[UVuW;0E u&x t fE MPVuE ;u_^]UQVuWuM"VPW2EYY_^UVW}Wu~u u W$t~u u WH_^]j(\UuME EẼePEPMjDcmU}WA1+;w&u E P_U RPEPYhXMeEPMdhxN[EP'VW7vWv6vg_^UVMyu>u t >uU^]jzFUjYu3EtVFYMG7qVWj Yt 3FF37G_^Ãy yjÃy1yzVW7tVSjVuYYg'_^VW6>YtW%jWGYYf&_^VW>tSj W"YYf&_^VW6>Yt&j WYYf&_^j@GUyukh XM$eEPMx hxN[EP%%j@GUyu9tyu9thXMГeEPM$ hxN[EP$UQQVWuEPuuUYYuϋu _^USVWf}3ۃu~u W&Nt~u W/_^[]UVWu3;tx(_^]USVu3WA+9Fs vj_^[]U]Q̍AU]5jUUueME0jX u eEPuMU]YjmUe?$\øFjmUe2øFUVW}u~u W3t~uW_^]jDcmUFMJ2+;sPEP謮hXMyeEPM hxN[EPz"UVQtFF^jMhG[EP;"jmUe#jj"jmUejj!jmUueq5u΋tjp,Vְjj!jKU}Nw|X3uVEFEGYXjXUuu3hXNEMAAΤUVuWVz2FPO _^]jUU"ً}MQp,V֋eVMj0'nUEj0t6MeMVMQEp,V֍M'MMQEp,V֍MċE(j0RnUuMЋ] l0eEPV}tBOS>eeE̋EPEEP7uN,VVMȅtMtM̦UVWup ,V_^]j$cUM EMЍMPeœ8p@,V֋؍EP;r ,V֋MЃPM0Mq US] Vu;tWj8,V׃ ;u_^[]U$}щUttXtXBXX@SVjpXHADXC0CCCCCC C$C(C,C stjڶF3Es0C8C<W~}}p,V֍EPhj q ,V֋}Et,r,V֋tj1,V֊E{8C@_uC KC #u} t SeE^[] t X$X<XDEjPkMPVU } SVW]t 8VCPXXjsjVuj@XHADXtjnF3Cp4XX ppxxHH P$P,(]]C0]u]ËXF8$_DыƒD‰F\rL~XtFSWQs ]t WSGWVvX,VօtSW3GW's _[^]UVq>0rL~,tFSWr ]t WSFWVv,,VօtSWFWr _[^]UA84Vp0WP,V֋E3t@j EWWfF~fWONfG'r }xVGGtTES^t/t+j gjPWGSuf@G賺}[tVj V^ _^]E^xV@@]UA88Vp4WP,V֋E3t@j EWWfF~fWONfGq }xVGGtTES^t/t+j WjPWGSuf@G裹}[tVӹj VN _^]E^xV@@]UI9HVqDE @xWPQ,V֋E3t@j EWWfF~fWONfGo }xVGGtTES^t/t+j .jPWGSuf@Gz}[tV誸j V% _^]E^xV@@]UVq>Lra~Ht[SWqo }؅t SWgDSVvH,Vօt,7vW zWv6vSGDS2o _[^]̋AV8XrpTtP,Vօ^2^+IVq~ u2^Vv,Vօ^+I̋AVp u2^P,Vօ^UIV9Dr-q@t&E@txtPQ,Vօ^]2^]AV8@rph~dSWFa ]}t WS 5WVvd,V։EtGC;;t%Dj0,Vփ ;u];uSV{4V` E _[^]2^]Ua Pu/ E]UQAV8$p P,V։EH; .]tPQuDE ^]pSWtFXD38,VN׋EXx,V׋E0t9FXD38,VN׋FxWr,VO֋E_[^]E^]UQIV9@q<E @xWPQ,V֋u E8_^]Sj؉Et jKy3ۉ].]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UIV9dr-q`t&E@txtPQ,Vօ^]2^]UIV9E SWH+$Iډ]tO3ɋú Q舸t.3ҋ] fRIDADAu]uMA#QMA#ȋEQWSpV,Vօt W_[^]UVF8rtuP,V^]VF8rtP,Vօ^2^VxF8rtP,Vօ^2^V8F8trpptP,Vօ^2^VF8rp|tP,Vօ^2^VF8rt P,V^VF8rt P,V^VxF8PrpLt P,V^UQSVWBVU:TzPE@xM uA#ȉM tpFXD38,VNj,vt 3ۋs8,V׋FxD7p,VO֋M U3ۋErPSQpR,V֋EtHyGp,VO_^[] +IVWFxt P,V׃Fuet[F F\X@D0 HXF HAD1F F\XjV@D0 HXF HAD1FXx_^_2^UVN9xr#qttE@txt PQ,V^]USVW@FE8Dx@}}H> Et PuuFXD38,VNj,st ~3ۋs8,V׋FxD7p,VO֋E}uSuWpE puVv@,Vօt W= EtHyGp,VO_^[]V(F8rt P,V^VF8rt P,V^UVN9rtEPQ,V^]UVV:r"tMA#QR,V^]UVEV:r-t#uMEPu A#QR,V^]UVV:r'tME PA#QR,V^]UVV:r(tMuu A#QR,V^] UVUV:r"tMA#QR,V^]UVF8rtuP,V^]UVN9rtEPQ,V^]UVV:r4t*MA#QM A#EQPR,V^] UVEN9$rq tEPQ,V^]UVN9prqltEPQ,V^]UVF8rtuP,V^]UVF8@rp ;uL];tDV> ;uuvu;t]+߃ W ;> ;u];tfC;t ؋j0,Vփ ;u];K*+ @rW#+Gw;QW1EM_^ I KMȋEK[]W"XUS] VuW};tV= ;u_^[]US]*WK+ tV3t0u j- v u^_[]UVWu*- 3E2ExV3}MuS] u!j EW}fGWVu, s ;st]xVFFtBGEMt3t/j 謘FWjf@vFuusC EPVuFu;uM[t}tWsj Wy _^]UVW}0;tTS] v vSj, F x tFx u;pu @x ty u Ȁx t;7u[_^]U(SVWu+ 2ɉE3ۈM3]3}Muu_^[]}u!j EW]fCSVu+ u!j MEW}fGWVuf+ E3t5st,t(j EjWWVfSGWrEEEt6pt-t)j jPWEVfS@Eru 3ۋEHM8Y u]Futxu t2t,txtttWPry v3ۋE ƻ6E~ tu x uStu@-x#Et-t'@ xPWq~fffyj(E軕FxVFFtBGEMt3t/j 膕FWjf@vFuupMFxVF F$tBA EMt3t/j +F Wjf@v F$uuspE܋M VSuFFfF O]t}tSpj S t}tWdpj Wߔ u]Fu;u ut}tV3pj V讔 u}V pj V舔 _^[]QUVW}0;tTS] v vS( F x tFx u;pu @x ty u Ȁx t;7u[_^]U SVWu( 2ɉE3ۈM3]3uM}u!j 茓EW]fCSWu' u!j ZEWufFVWu' 3E ut6;st-t)j jPWEVfW@E`nE3uEt68pt-t)j ̒jPWEVfW@En] j(螒EGxVGGt=pEt1t-j iGWjf@wGVumEGxVG G$t=pEt1t-j G Wjf@w G$Vu]mM __fG X38C u[Gޅtxu Nt4yt.t!xtNtytQPPmy 6v3~ tM yfffWPSoLut}tVlj Vu ut}tVlj VW }]Gu};}wt}tVlj V& ut}tVlj V _^[]NdXA(.]AI AAAA AA FAFAFA PFxXA$FUEVXt j,Vc^]UVxXoEXt j,V(^]SVWSBxD0,VOֹC(_^[̋IVWAxDp ,VO_^̋IVWAxDp,VO_^SVWSBxDp,VOփC(ujp,V_^[_^2[UVGutRvWtFSXD38,VN[8,V׋FxD7p,VO_^]UW}tV0,V^_]UW}u3_]Vp ,V^_]UW}u3_]Vp,V^_]UW}u3_]Vp,V^_]VhjFXPw džF^XAD.]AI AAAA A4A FAFAFA PFXA$GA(PGA,GA00FA4GA8`FA}4}*}PEPDejE؃t K葠3ۡ/]s{t8,V׋{_t W,VӋE0t!8,V׋x,V׋EEEPQExVuEPu P^}p,V֋MExVt$}tQUaj u΅ EEM_^[]_^3[]USVW}&} }]}3EEthPEPdMtAxD0,VO֋MUMtBxDp,VO֍Mg.EEuMuEPA8EE荅PEExVPEEPQu Pp ,V֋MEExVt$}tQ_j uR EEMou;uFXD38,VNׅu E3ۉZjdɃt =3ۋs8,V׋FxD7p,VO֋Eu]|EtHyWr,VO֋_^[]_^3[]U(SVWo}/} %}}}]$u(},j|؉Et jK苈3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]UQW} u E8_]SVjn{؉Et jK苡3ۉ]$/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]USVW}}}tGXD;0,VOQejhz؉Et jK腠3ۉ]$/]sECt%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VKփ}EEEPQExVEEu jy؉Et jKօ3ۉ]/]sECt%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VKփ} QĉEu jx؉Et jKN3ۉ].]sE Ct%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VK֋MQ0,V֋EExVt$}tPSj u x EEG@Gp,VO֋utmFXD38,VNj@wt .3ۋs8,V׋FxD7p,VO֋u3ۅtFxWr,VO֋_^[]_^3[]UESًtBVWxD0,VO_^[]U}tBXXBXBX@DXBX@DІXBHABBX@DXBHA]+I+IXUEVWFX~F@D0ІXFPJL2t jWv_^]UEVFXW~F@D0XFPBD2FX@D0ІXFPJL2Xt jWu_^]UQISVW9(My$utmFXD38,VNj,ut 蹪3ۋs8,V׋FxD7p,VO֋M3ۋE q$SpEpQ,Vօ2ۋMtQzTr,VO_^[] UQASVW80Ex,utmFXD38,VNj,tt I3ۋs8,V׋FxD7p,VO֋E3ۋp,SP,Vօ2ۋMtQzTr,VO_^[]USVu WtjFXD38,VNj,Nst 3ۋs8,V׋FxD7p,VO3S ]PSׯM tQzTr,VO_^[]+IVWFxt P,V׃Fu`tVF FXjV@D0 XF HAD1F FX@D0 ІXF HAD1FX]r_^_2^UQQSVW:$Uz E@xM uA#ȉM tpFXD38,VNj,qt ҧ3ۋs8,V׋FxD7p,VO֋M U3ۋEr SQpR,Vօ2ۋMtQzTr,VO_^[] UQISVW9,My(utmFXD38,VNj,pt 3ۋs8,V׋FxD7p,VO֋M3E q(SPEpQ,Vօ2ۋMtQzTr,VO_^[] U SVWy}? ؉]t SuWu tvFXD38,VNj,ot 3ۋs8,V׋F]xD7p,VO֋]}E3wPSW,Vօt S E tHyGp,VO_^[]UESYVW;rJ{tDt@Q̉HyG0,VOsPS,VօE2ۅtHyWr,VO_^[]UESVqW> rO~tI}Ot?yt9t5QEPITPE PwVv,VօE2ۅtHyWr,VO_^[] U}u3]SVWj,mt +3ۋEC0,V֋MQzTr,VO_^C[]U}tB,X,XBXBX@DXBX@DXBHABBX@DXBHA]+I+IXUEVWFX~F@D0XFPJL2t jWl_^]UVWFX~F@D0XFPBD2EFX@D0XFPJL2Xt jWGl_^]VXF84rp0tP,Vօ^2^UV%N9,r+q(t$E PQ,V֋uPVL^]E^]UQVN9\qXE @xWPQ,V֋u E8_^]Sjk؉Et jKgr3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UV赿N9Lr-qHt&E@txtPQ,Vօ^]2^]UVeN9`r7q\t0E @t&xt PQ,V֋uPV耧^]E^]UQVV^:Tr+JPt$E@txtPRM,VU]]UV赾N9Pr(qLt!E@txtPQ,V^]3^]U Vbv><~8SW ]}t WSBWVv8,V։EtBC;;t ؋j0,Vփ ;u];uSV{3V' E _[^]2^]UQV贽N9dq`E @xWPQ,V֋u E8_^]Sjg؉Et jK3ۉ]4/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]V蘼F80rp,t P,V^3^UVbN9XqTE @xWPQ,V֋E3t@j fEWWfF~fWONfG }xVGGtTES^t/t+j GfjPWGSuf@GA}[tVAj V>f _^]E^xV@@]UV5N9Dr(q@t!E@txtPQ,V^]3^]UQVN9HqDE @xWPQ,V֋u E8_^]Sj*e؉Et jK3ۉ].]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UVŹN98r-q4t&E@txtPQ,Vօ^]2^]UQSVWrFuE8(x$FXD38,VN׋F;.]t FxD7p,VO34^{tS,V׋^FxD7p,VO֋uSVv$,V֋u2ۅtNyWr,VO_^[]VxF8rptP,Vօ^2^UQSVWBFuE8$x FXD38,VN׋F;.]t FxD7p,VO34^{tS,V׋^FxD7p,VO֋uSVv ,V֋u2ۅtNyWr,VO_^[]VHF8rptP,Vօ^2^+IVWFxt P,V׃Fuet[F FX@D0 XF HAD1輶F FXjV@D0 XF HAD1FXXa_^_2^UVeN9@r-qrPtG}Ot=yt7t3QE PwPwV,VօE 2ۅtHyWr,VO_^[]UVN9xr:qtt3E@t)xt#E $PQ,Vօ^] 2^] UV赳N9tr0qpt)E@txtu PQ,Vօ^]2^]USVW`NE M9MIyE PMuu3[F;4/]tVPeN؋yWr'^{tS,V׋^FxD7p,VO֋EuSpV,VօE 2ۅtHyWr,VO_^[]UVEN9lr-qht&E@txtPQ,Vօ^]2^]UVN9|r3qxt,EPt"ztE pRQ,Vօ^]2^]USVW蠱NE M9hydMIyE PMuu3[F;.]tVP諘N؋yWr'^{tS,V׋^FxD7p,VO֋EuSpVvd,VօE 2ۅtHyWr,VO_^[]UQW} u E8_]SVj[؉Et jK+3ۉ]4/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]A4XUV4X误EXt jVhZ^]VWGpt P,VֹG_^UQVTF8(p$P,V։EH; .]tPQuE ^]pSWtFXD38,VN׋EXx,V׋E0t9FXD38,VN׋FxWr,VO֋E_[^]E^]UVRF8pWP,V֋E3t@j XEWWfF~fWONfG }xVGGtTES^t/t+j PXjPWGSuf@G3}[tV3j VGX _^]E^xV@@]UQVDF8,p(WP,V֋u E8_^]SjW؉Et jKP3ۉ].]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UQV4F8 pWP,V֋u E8_^]SjV؉Et jK3ۉ].]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UV"F8pWP,V֋E3t@j UEWWfF~fWONfG }xVGGtTES^t/t+j UjPWGSuf@Gl0}[tV0j VU _^]E^xV@@]Vq~ u2^Vv,Vօ^̋AVp u2^P,Vօ^UQSVW販^u;${ tt{8,V׋F;.]tx,V32FExtP,V׋FEx,V׋Es PS,V֋u2ۅty,V_^[]VWFxt P,V׃Fu(~t4X趨jWXuS_^_2^V舨F84rp0t P,V^U}tBXXBXB|X@DXB|X@DhXBHABB|X@DԈXBHA]+I+IXUEVWF|X~F@D0hXFPJL2t jWCR_^]UVWF|X~F@D0ԈXFPBD2/EF|X@D0hXFPJL2Xt jWQ_^]UVզF8,r&p(tP,V֋uPV葑^]E^]U舦 PuZE]UQVdF8Dp@WP,V֋u E8_^]SjP؉Et jKX3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UQVTF8HpDWP,V֋u E8_^]SjO؉Et jK 3ۉ].]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]VHF88rp4t P,V^3^UQVF8LpHWP,V֋u E8_^]SjsN؉Et jK者3ۉ]4/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UVF8@p<WP,V֋E3t@j iMEWWfF~fWONfG }xVGGtTES^t/t+j MjPWGSuf@GL(}[tV|(j VL _^]E^xV@@]UQSVWFuE8(x$FXD38,VN׋F;.]t FxD7p,VO34^{tS,V׋^FxD7p,VO֋uSVv$,V֋u2ۅtNyWr,VO_^[]UQSVWFuE8$x FXD38,VN׋F;.]t FxD7p,VO34^{tS,V׋^FxD7p,VO֋uSVv ,V֋u2ۅtNyWr,VO_^[]+IVWFxt P,V׃Fuet[F F|X@D0 ԈXF HAD1蜟F F|XjV@D0 hXF HAD1FX8J_^_2^UQSVWBFuE8dx`FXD38,VN׋F;/]tVPaN؋yWr'^{tS,V׋^FxD7p,VO֋uSVv`,V֋u2ۅtNyWr,VO_^[]UVUN9Tr!qPtEPQ,Vօ^]2^]UQSVWFuE8hxdFXD38,VN׋F;.]tVP1N؋yWr'^{tS,V׋^FxD7p,VO֋uSVvd,V֋u2ۅtNyWr,VO_^[]UV%F8\r)pXt"E$P,Vօ^]2^]UV՜F8XrpTtuP,Vօ^]2^]UQSVW蒜FuE8lxhFXD38,VN׋F;4/]tVP豃N؋yWr'^{tS,V׋^FxD7p,VO֋uSVvh,V֋u2ۅtNyWr,VO_^[]V訛F8PrpLtP,Vօ^2^UVuN9`r"q\tEpQ,Vօ^]2^]XA`.]AI AAAA APA FAFAFA PFXA$0AGA(PBGA,pCGA0DGA4EGA8FGAt 3ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]UQSVuWu 3_^[]vtFXD38,VN׋MQx,V׋FxD7p,VO֋uttFXD38,VNׅtRj04=t i3ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]UQSVuWu 3_^[]vtFXD38,VN׋MQx,V׋FxD7p,VO֋uttFXD38,VNׅtRj,<t 虦3ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]UQSVuWu 3_^[]vtFXD38,VN׋MQx,V׋FxD7p,VO֋uttFXD38,VNׅtRj4:t 詧3ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]UQSVuWu 3_^[]vtFXD38,VN׋MQx ,V׋FxD7p,VO֋uttFXD38,VNׅtRj89t 詨3ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]UQSVuWu 3_^[]vtFXD38,VN׋MQx$,V׋FxD7p,VO֋uttFXD38,VNׅtRj08t 3ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]UQSVuWu 3_^[]vtFXD38,VN׋MQx(,V׋FxD7p,VO֋uttFXD38,VNׅtRj87t 3ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]UQSVuWu 3_^[]vtFXD38,VN׋MQx,,V׋FxD7p,VO֋uttFXD38,VNׅtRj8t6t 3ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]UQSVuWu 3_^[]vtFXD38,VN׋MQx0,V׋FxD7p,VO֋uttFXD38,VNׅtRjhT5t 詹3ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]UQSVuWu 3_^[]vtFXD38,VN׋MQx4,V׋FxD7p,VO֋uttFXD38,VNׅtRjp44t 93ۋs8,V׋FxD7p,VO֋uu3ۅtFxWr,VO_^[]U SVW}} }tGXD;0,VOQejX3؉Et jK3ۉ]p/]sECt%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VKuQej2؉Et jK3ۉ].]sE Ct%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VK֋p8,V֋O؋IWr,VO_^[]_^3[]dXA(.]AI AAAA AA FAFAFA PFxXA$`SGUSVW蒆ul} bvtFXD38,VN׃}QĉEu j0؉Et jK3ۉ]t/]{ECt%G@ljE,VMӋE@Xt P,VӋE8t;G@ljE,VMӋGXD;ߋx,VK׋E MuEExVEQ8,V׋EExVt$}tP j u0 EEFxD7p,VO_^[]dXA(.]AI AAAA AA FAFAFA PFxXA$`UGU SVW蒄}-} #tGXD;0,VOu}uPQej.؉Et jK3ۉ]/]sE Ct%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VK֋0,V֋O؋IWr,VO_^[]_^3[]dXA(.]AI AAAA AA FAFAFA PFxXA$0WGU VĂuE vWt FSXD38,VN׋E [}EExVE>PE?P,V׋EExVt$}tPj u- EEFxD7p,VO_^] dXA(.]AI AAAA AA FAFAFA PFxXA$pXGU V脁u} SWEEPuEE蜒vtFXD38,VN׋MQu 8,V׋FxD7p,VO֋uth];t"fDj8,V׃ ;uuM*+ @rv#+ƃwQVU+_[^] ̎UESVW+EG+=%OX+ʉ]+;v ;B=r'C#;P*p#Ft Sn*3EM ƉUABGU;u+PQVY #+RQV}YGM+PEQPgYt,O+ȃrP#+ƒw3QP*E7 ƋEO 3O_^[] kU}tBԉXԉXBXBX@DXBX@DXXBHABBlX@DXBHA]+I+IXUEVWFX~F@D0XXFPJL2t jW(_^]UVWFlX~F@D0XFPBD2}EFX@D0XXFPJL2Xt jWw(_^]V}F8$rp tP,Vօ^2^UVU}F8Pr&pLtP,V֋uPVq^]E^]UV}N9Xr,qTt%E pQ,V֋uPV^]E^]UV|F8Tr,pPt%uu P,V֋uPV˪^] E^] Vh|F8\rpXt P,V^3^UW}/|GE8`x\SVuxDϋ^+],VM;B3ۉE]tX3ɺ Q.؃]t6MQjS"[} t3fDщӋDDB;r}ESPW\,V׋FEtBt>3ۅt-}N;NtGAF WQC;]ru).^[_]UV{v>d|~`tvS$ ؉]t SuSVv`,VօtGEWH8;t&j0,Vփ ;uE]8PSxՋSɷ _[^]UQVdzF8pWP,V֋u E8_^]Sj$؉Et jKe3ۉ].]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]VXyF8L~HSW ]}t WSBWVvH,V։EtBC;;t ؋j0,Vփ ;u];uSV{3V' E _[^]2^]UVoF8<p8WP,V֋E3t@j EWWfF~fWONfGp }xVGGtTES^t/t+j jPWGSuf@G}[tV,j V _^]E^xV@@]UVnF88p4WP,V֋E3t@j EWWfF~fWONfG` }xVGGtTES^t/t+j jPWGSuf@G}[tVj V _^]E^xV@@]UQVmF8pplWP,V֋u E8_^]Sj؉Et jK03ۉ]t/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UVlv>trB~pt NM_N^[]WPS3]΍CPvucbUEVu;u t8SWtAXD ً8,VK׋EE;u u_[^]dXA(/]AI AAAA AA FAFAFA PFdXA$PGUSVuWu34F;/]tVP:^{tS,V׋^utNyWr,VO_^[]UQW} u E8_]SVjN؉Et jK3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]UEVu;u t8SWtAXD ً8,VK׋EE;u u_[^] U4}SVW} |}rEMt`}V} LEEE3ۉ]4EPdEu;Et,Ή0tAXD ً8,VK׋]E MQPMtFxD7p,VO֋MC];]r3EEEtbPEPtCxD0,VO֋M]tAxDp,VO֍MTnEEE EЋEExVEX]tCxD0,VK֋E E܍EPEExVPEEPQuPEP0,V֋M܈EExVt$}tQj u{ EEMmu;uFXD38,VNׅu E3ۋunF;/]tVP6N؋yWr'^{tS,V׋^FxD7p,VO֋Eu EEEEExVt'}tPj uu EEtFxD7p,VO֋]teEE;t/ tAxDp,VO֋E;uԋ]M+˃r[#+Ãw!QSE_^[]_^3[]\\U}tBXXBXBX@DXBX@DpXBHABBX@DXBHA]+I+IXUEVWFX~F@D0pXFPJL2t jW_^]UVWFX~F@D0XFPBD2LEFX@D0pXFPJL2Xt jWg_^]UVuLF8(r&p$tP,V֋uPVQZ^]E^]U(LE u E]uPw PuZE]UVKF80r%p,tMtuu QP,V^] 3^] UQSVWKFuE8$x FXD38,VN׋F;/]t FxD7p,VO34^{tS,V׋^FxD7p,VO֋uSVv ,V֋u2ۅtNyWr,VO_^[]UQSVWJFuE8 xFXD38,VN׋F;/]t FxD7p,VO34^{tS,V׋^FxD7p,VO֋uSVv,V֋u2ۅtNyWr,VO_^[]+IVWFxt P,V׃Fuet[F FX@D0 XF HAD1LIF FXjV@D0 pXF HAD1FX_^_2^U}tBXXBXBX@DXBX@DXBHABB0X@DXBHA]+I+IXUEVWFX~F@D0XFPJL2t jW_^]UVWF0X~F@D0XFPBD2GEFX@D0XFPJL2Xt jWg_^]VxGF8$rp t P,V^UVEGN9Pr,qLt%EPtztuE pRQ,V^] UQVFF8lphWP,V֋u E8_^]SjS؉Et jK3ۉ].]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]VEF8`rp\t P,V^33^UVEF8\pXWP,V֋E3t@j EWWfF~fWONfGp }xVGGtTES^t/t+j jPWGSuf@G}[tV,j V _^]E^xV@@]UQVDF8d4p`)WP,V֋u E8_^]jЉEtbB XBXBXB BX@D XB HADB BB0X@D XB HAD3҉U/]rzSt!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]USVWCC^;N9Lr4qHt-EPt#ztE @txt PRQ,V^]Vh>F8,rp(t P,V^+IVWFxt P,V׃Fuet[F F0X@D0 XF HAD1=F FXjV@D0 XF HAD1FXx_^_2^V=F8rpt P,V^UQSVWR=FE8txpuFXD38,VNj,t 3ۋs8,V׋FxD7p,VO֋uSVvp,V֋EtHyGp,VO_^[]UQW} u E8_]SVj؉Et jK3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]U}u3]SVWj,6t 3ۋEC0,V֋MQzTr,VO_^C[]AXUVX;EXt jV^]UQSVW:FE8xut{FXD38,VN׋F;/]t,VP"N؋yWr,VO֋E+^{tS,V׋^FxD7p3ۋpSP,V֋EtHyGp,VO_^[]VWFxt P,V׃Fu(~tX9jWX_^_2^ȌXA< /]AI AAAA A,A FAFAFA PF܌XA$GA(`GA,@GA0GA4GA8GUEVXt j@V^]UWXu)VwVF PFP F$P^EthWn_]UV܌X8EXt j@V8^]SVWSBxD0,VOֹC<_^[SVWSBxDp,VOփC<ujp,V_^[_^2[USVu W}CV#Sw7覽VC Pww 薽VCPww膽VC$Pw(w$vG0@C0G4C4G8C8GHCHGXCXGhChGxCxG|C|_^[]UQW} u E8_]SVj؉Et jK{3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]UQW} u E8_]SVj؉Et jK 3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]U2]3ʼnEVu W}P5Sh\DžXXjP EXjVJwtFXD38,VN׋XQx ,V׋N؋yWr,VOփ}DžXX[u0\PݺhPѺtPźEP輺_^M3]M3_3^]U2]3ʼnEVu W} 4Sh\DžXXjPb EXjVwtFXD38,VN׋XQx,V׋N؋yWr,VOփ}DžXX[u0\P譹hP衹tP蕹EP茹_^M3q]M3_3^]]UV3utSvWtFSXD38,VN[x,V׋FxD7p,VO_^]U$SVW2UQ} FM;u0EAEERPExVuEREEPEPQej؉Et jK3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t7FXD38,VN׋FxD7p,VO֋}p,V֍MkOMEExVEAEt}tP荷j u _^[]U SVW1}4} *} tGXD;0,VOQuPejU؉Et jKr3ۉ]$/]sE Ct%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VK֋0,V֋O؋IWr,VO_^[] _^3[] USVW/Mtlu teEt^]tWEEQPO8SPiEPuVp,V֍MSMEM_^[]_^3[]U}tBlXlXBXBlX@DXBlX@DXBHABBX@DXXBHA]+I+IXUEVWFlX~F@D0XFPJL2t jW_^]UEVFXW~F@D0XXFPBD2FlX@D0XFPJL2Xt jW_^]UQWPm u E8_]j<ЉEtbB lXBXBXB BlX@D XB HADB BBX@D XXB HAD3҉U$/]SVrzt!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋NyWr,VO֋E^[_]UA8TVpPWP,V֋E3t@j EWWfF~fWONfGGi }xVGGtTES^t/t+j jPWGSuf@Gӱ}[tVj V~ _^]E^xV@@]̋AV8LrpHt P,V^3^UVq>@ra~<t[SWj }؅t SWASVv<,Vօt,7vW+sWv6vSGASrj _[^]̋AV8drp`t P,V^33^UA8$Vp WP,V֋E3t@j EWWfF~fWONfGWg }xVGGtTES^t/t+j jPWGSuf@G}[tVj V _^]E^xV@@]UQAV88p4WP,V֋u E8_^]Sj؉Et jK3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]̋AV84rp0t P,V^3^UA80Vp,WP,V֋E3t@j EWWfF~fWONfGe }xVGGtTES^t/t+j WjPWGSuf@G裭}[tVӭj VN _^]E^xV@@]̋AV8\rpXt P,V^ø^̋AV8`rp\t P,V^ø^UA8VpWP,V֋E3t@j PEWWfF~fWONfGc }xVGGtTES^t/t+j jPWGSuf@G3}[tVcj V _^]E^xV@@]+IVWFxt P,V׃Fu`tVF FXjV@D0 XXF HAD1F FlX@D0 XF HAD1FX_^_2^USVqW>Hrw~Dtq]CtgxtaE @tWxtQd t WuX;WQEPXsPE psVvD,Vօt WHd EtHyGp,VO_^[]UI9Xr%VqTtE@txt PQ,V^]UA8PrVpLtuP,V^]UVq>Dr;~@t5Wc t WuY:WVv@,Vօt Wgc _^]UQASVW8WPuXu?P,V׋N؋yWr,VO֋P38WDžXX}u0\PAhP5tP)EP _^[M3]M3_^3[]dXA(,/]AI AAAA AA FAFAFA PFxXA$GdXA(0/]AI AAAA AA FAFAFA PFxXA$@GUVut]vWtFSXD38,VN[} 9P,V׋FxD7p,VO_^]U}tB|X|XBXBtX@DXBtX@DXBHABBX@DhXBHA]+I+IXUEVWFtX~F@D0XFPJL2t jW#_^]UVWFX~F@D0hXFPBD2EFtX@D0XFPJL2Xt jW_^]VF88rp4tP,Vօ^2^UVF8,r&p(tP,V֋uPVk^]E^]UQV4F8XpTWu P,V֋u E8_^]Sj؉Et jK3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UV%F8HrpDtuP,Vօ^]2^]UQVF8\pXWu P,V֋u E8_^]Sj@؉Et jKW3ۉ].]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UQVF^8PrHLtuMP,VU]]UVF8LrpHtuP,V^]3^]UVUF8`r)p\t"u P,V֋uPVh^]E^]VF84rp0t P,V^3^UVF8TpPWu P,V֋E3t@j 6EWWfF~fWONfGU }xVGGtTES^t/t+j jPWGSuf@G}[tVIj V _^]E^xV@@]UVF8@rp_^[] USVWEuto} tivtFXD38,VN׃}PQu Px ,V׋FxD7p,VO_^[] USVWutq} tkvtFXD38,VNE D$u Px ,V׋FxD7p,VO_^[]U SVW"u} vtFXD38,VN׋E3ɅMExVEȍEPQĉMu Ptx,V׋EExVt$}tP~j uY EEFxD7p,VO_^[] U SVWBu} vtFXD38,VN׋E3ɅMExVEȍEPQĉMu Px,V׋EExVt$}tP~j uy EEFxD7p,VO_^[] U SVWbu} E3ɋvMEExVMtFXD38,VN׍EPQu Px,V׋N؋yWr,VO֋EExVt}tP}j uy _^[] _^3[] XA,H/]AI AAAA AA FAFAFA PFXA$GA(@GUEVXt j0VӠ^]UVXEXt j0V蘠^]SVWSBxD0,VOֹC,_^[SVWSBxDp,VOփC,ujp,V_^[_^2[UQW} u E8_]SVj螟؉Et jK3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]USVWBEe} [}Q}G}<PEPTejE菞؉Et jK3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t7FXD38,VN׋FxD7p,VO֋EEEPQExVuEPu P}0,V֋EExVt$}tP_j u跃 EEEExVt$}tP _j u腃 EEMu9xt FP^hP>tP>EP>_^[M3}g]M3_^3[hg]U4SVWE} }}}(PEP$ejE_b؉Et jKL3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t7FXD38,VN׋FxD7p,VO֋E$3ɅMExVEExVE M3ɅMExVEEE}EEPE؉MPuEPPQuPu P^}p ,V֋MExVt$}tQa EEEExVt$}tPpt7Mt0u EQuuuu Q$P,Vօ^]2^]UV%F8(r2p$t+M t$uEQQ$P,Vօ^] 2^] UV՟F8$r2p t+M t$uEQQ$P,Vօ^] 2^] UV腟F8@r=pEPEPu ,V׋N؋yWr,VO֋ME_ME[^]3^]UVTuEMvEESWtFXD38,VN׋>EPEPuu ,V׋N؋yWr,VO֋ME_ME[^]3^]U V蔅uEvExVEESWtFXD38,VN׋MQu 8,V׋N؋yWr,VO֋EExV_[t}tPC j u/ ^] 3^] ̐XUEVȐXt jVs/^]UEVȐXt?u0FS^tWxt P,V_SN7[^]jVA^]UIV9 r0qt)E@txtu PQ,Vօ^]2^]U}tBtXtXBXBԐX@DXBԐX@DXBHABBX@D`XBHA]+I+IXUEVWFԐX~F@D0XFPJL2t jW-_^]UEVFXW~F@D0`XFPBD2FԐX@D0XFPJL2Xt jWL-_^]UAV8rtuP,V^]3^]̋AV8trpptP,Vօ^2^Uu Pu/E ]UE PPu.E ]UE $Pu.E]UE SVW@xuu E0_^[]ËFXD38,VNj,+t -3ۋs8,V׋FxD7p,VO֋E Sp']PS.EHyGp,VO֋_^[]Ë]EtHyWr,VO_^[]Uu OPu-E ]USVuWtjFXD38,VNj8*t S3ۋs8,V׋FxD7p,VO3ۋu StjFXD38,VNj0Z*t ߗ3ۋs8,V׋FxD7p,VO3S臿]PS,E tHyGp,VO֋MtQzTr,VO_^[]UE p Pu),E ]Uu ϾPu ,E ]U肾Pu+E]UIV9r%tEpQ,Vօ^]2^]UAV8r'tMxQP,Vօ^]2^]UASVW8Eu3E^+]3ɋú Q0EE3ۋU]6]4tLFXD38,VN׋F;/]FxD7p,VO֋EU3ۋMu]C];r]Eu PStFFXD38,VN׋F;/]FxD7p,VO3ۋuSV,V֋Et P/]VS)^{tS,V׋^FxD7p,VO֋EU^{tS,V׋^FxD7p,VOO]M tQzTr,VO_^[] UASVW8Ek^u u ]3x}3E_+]3ɋú Q.EE3ۋU]7]4tOFXD38,VN׋F;/]FxD7p,VO֋EU}3ۋM]C];r]Eu }PStHGXD;0,VO֋G;/]G@Gp,VO֋u 3ۋFSXD38,VN׋F;/]VPaN؋yWr^{tS,V׋^FxD7p,VO֋EU}_stS,V֋_G@Gp,VO֋u 9^{tS,V׋^FxD7p,VO֋uSV,V֋Et P,]VS&E ]E tHyGp,VO֋MtQzTr,VO_^[]UQAV8P,V։EH; 0]tPQu胚E ^]pSWtFXD38,VN׋EXx,V׋E0t9FXD38,VN׋FxWr,VO֋E_[^]E^]AV8rt P,V^3^̋AV8PrpLtP,Vօ^2^UA 8`VrLp\tEPEP,V3WPEHDAp$H^P؊X]EW^@@@$؊X]UQA8\rHXtPM,VU]]UQAV8pplWP,V֋u E8_^]Sjz!؉Et jK觅3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]̋AV8rt P,V^3^UQAV8P,V։EH; /]tPQuSE ^]pSWtFXD38,VN׋EXx,V׋E0t9FXD38,VN׋FxWr,VO֋E_[^]E^]UA8VWP,V֋E3t@j ZEWWfF~fWONfG豱}xVGGtTES^t/t+j jPWGSuf@G=}[tVmj V _^]E^xV@@]̋AV8TrpPt P,V^3^U Vq>SWа]}t WS蓄WV,V։EtBC;;t ؋j0,Vփ ;u];uSV{聄VuE _[^]2^]UA8dVp`WP,V֋E3t@j `EWWfF~fWONfG路}xVGGtTES^t/t+j jPWGSuf@GC}[tVsj V _^]E^xV@@]̋AV8XrpTt P,V^3^UAV8SP,V֋؅u ][^]C;/]tS]PS [^]sWt8,V׋[x,V׋]3t!8,V׋y,V_[^]E^]UIV9r/t%E pQ,V֋uPV^]E^]UAV8r1t'M x QP,V֋uPV^]E^]̋AV8lrphtP,Vօ^2^UIV9r"q|tEpQ,Vօ^]2^]UAV8r'tMxQP,Vօ^]2^]̋AV8Drp@tP,Vօ^2^̋AV8$rp tP,Vօ^2^̋AV80rp,tP,Vօ^2^̋AV8HrpDtP,Vօ^2^̋AV8(rp$tP,Vօ^2^̋AV8rEt<}x5t1QE PLgPWV,VօE 2ۅtHyWr,VO_^[]̋AV8xrpttP,Vօ^2^dXA(/]AI AAAA AA FAFAFA PFxXA$PqHU SVWh}} tGXD;0,VOQej؉Et jK蚋3ۉ] 0]sE Ct%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VK֋0,V֋G@Gp,VO_^[]dXA(/]AI AAAA AA FAFAFA PFxXA$rHU VguvWtFSXD38,VN[E 3ɈMExVEȉMMQ8,V׋EExVt$}tPj uR EEFxD7p,VO_^]U}tBXXBXB|X@DXB|X@DXBHABBX@DؒXBHA]+I+IXUEVWF|X~F@D0XFPJL2t jW3_^]UEVFXW~F@D0ؒXFPBD2F|X@D0XFPJL2Xt jW_^]UAE88bx4XE@Jx@ES3EVW9tnPM-ut[F;/]tVPKN؋yWr'^{tS,V׋^FxD7p,VO։]EEE8tPM詗uu3EeF;/]tVPYKNEyWr-FExtP,V׋FEFxD7p,VO֋EEuEPEPuE pEpVv4,V֋MEtg;QEPtCxD0,VK֋EtAxDp,VO֍M+EtAxDp,VO֋u ;uBjQ ؉Et jK~q3ۉ]/]st!CxD0,VK֋Ep~t V,VׅtVCxD0,VO֋CxDp,VKօtCxD0,VK֋EtAxDp,VOօtWCxDp,VKփ}_^[]EtAxDp,VOփ}_^[]2]UQAV8 pWP,V֋u E8_^]Sj ؉Et jK3ۉ].]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]U袠Pu#E]UQAV8$p WP,V֋u E8_^]Sj ؉Et jK3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UAV8(r&p$tP,V֋uPVH ^]E^]UQAV8pWP,V֋u E8_^]SjZ ؉Et jK3ۉ]0]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UUQASVu84WEx0FXD38,VN׋F;/]t FxD7p,VO34^{tS,V׋^FxD7p,VO֋uSVv0,V֋u2ۅtNyWr,VO_^[]+IVWFxt P,V׃Fu`tVF FXjV@D0 ؒXF HAD1F F|X@D0 XF HAD1FX=_^_2^U}tB,X,XBXBX@DXBX@DXBHABBX@DXBHA]+I+IXUEVWFX~F@D0XFPJL2t jWC_^]UVWFX~F@D0XFPBD2/[EFX@D0XFPJL2Xt jW_^]VZF8rpt P,V^+IVWFxt P,V׃Fuet[F FX@D0 XF HAD1LZF FXjV@D0 XF HAD1FX_^_2^U}tB̓X̓XBXB4X@DXB4X@DlXBHABBX@DXBHA]+I+IXUEVWF4X~F@D0lXFPJL2t jW_^]UEVFXW~F@D0XFPBD2F4X@D0lXFPJL2Xt jWl_^]̋AV8rpt P,V^3^UI9jPWGSuf@G}[tVj V5 _^]E^xV@@]AV8$rp t P,V^3^UA8,Vp(WP,V֋E3t@j pEWWfF~fWONfGǓ}xVGGtTES^t/t+j jPWGSuf@GS}[tVj V _^]E^xV@@]UA8HVpDWP,V֋E3t@j `EWWfF~fWONfG跒}xVGGtTES^t/t+j jPWGSuf@GC}[tVsj V _^]E^xV@@]+IVWFxt P,V׃Fu`tVF FXjV@D0 XF HAD1F F4X@D0 lXF HAD1FX-_^_2^UA8 rVptuP,V^]UI98r%Vq4tE@txt PQ,V^]UA8(rVp$tuP,V^]UI90r%Vq,tE@txt PQ,V^]UI9Lr%VqHtE@txt PQ,V^]U}tBXXBXBX@DXBX@DԓXBHABBX@DXBHA]+I+IXUEVWFX~F@D0ԓXFPJL2t jW_^]UEVFXW~F@D0XFPBD2FX@D0ԓXFPJL2Xt jW_^]UQASVu8,WEx(FXD38,VN׋F;0]tVP8N؋yWr'^{tS,V׋^FxD7p,VO֋uSVv(,V֋u2ۅtNyWr,VO_^[]UQW0u E8_]jLЉEtbB XBXBXB BX@D ԓXB HADB BBX@D XB HAD3҉U/]SVrzt!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋NyWr,VO֋E^[_]̋AV8 rpt P,V^3^USVWGE8$x ]C+Ep,V֋u;B3UE3ɋº QEMQjPN. U3E3E40FXD38,VN׋F;0]t3VP5NEyWr,VO֋]EU1^]{tS,V׋FEFxD7p3ME@E;EMEuPEPVv ,VSs3U C[MP3E:T~PSW?]}t WSZWVvP,V։EtBC;;t ؋j0,Vփ ;u];uSV{YVE _[^]2^]VxHF8`rp\t P,V^3^VHHF8HrpDt P,V^3^VHF8Drp@t P,V^3^UVGF8PpLWP,V֋E3t@j IEWWfF~fWONfG蠄}xVGGtTES^t/t+j jPWGSuf@G,}[tV\j V _^]E^xV@@]UVFF8LpHWP,V֋E3t@j 9EWWfF~fWONfG萃}xVGGtTES^t/t+j jPWGSuf@G}[tVLj V _^]E^xV@@]VEF8rpt P,V^3^VEF8drp`tP,Vօ^2^VhEF8\rpXtP,Vօ^2^+IVWFxt P,V׃Fuet[F F4X@D0 XF HAD1DF FXjV@D0 XF HAD1FXx_^_2^U}tBXXBXBX@DXBX@DXBHABBX@DxXBHA]+I+IXUEVWFX~F@D0XFPJL2t jWs_^]UVWFX~F@D0xXFPBD2_CEFX@D0XFPJL2Xt jW_^]UVCN9,r0q(t)E @txtPuQ,Vօ^]2^]UVBN9(r0q$t)E @txtPuQ,Vօ^]2^]UVeBN90r3q,t,E @t"xtuPuQ,Vօ^] 2^] UVBN94r:q0t3E@t)xt#Pu Q,V֋uPVm9^] E^] U VAv>rutlS]W}EEEEEPEPEPu uV,Vփ}U}} _[ ^]2^]U VAv>rutlS]W}EEEEEPEPEPu uV,Vփ}U}} _[ ^]2^]UVu@F8r(tuu uP,Vօ^] 2^] UV%@F8r(tuu uP,Vօ^] 2^] UV?F8XrpTtuP,V^]3^]UV?F8xrpttuP,V^]3^]UVU?F8|rpxtuP,V^]3^]UV?F8TrpPtuP,V^]3^]UV>F8`p\Wu P,V֋E3t@j 6EWWfF~fWONfG{}xVGGtTES^t/t+j jPWGSuf@G}[tVIj V _^]E^xV@@]UV=F8dp`Wu P,V֋E3t@j EWWfF~fWONfGmz}xVGGtTES^t/t+j jPWGSuf@G}[tV)j V _^]E^xV@@]UVrD~t>}|8W%jt Wu =WuVv,Vօt Wj_^]+IVWFxt P,V׃Fuet[F FX@D0 XF HAD1L,F FXjV@D0 ̖XF HAD1FX_^_2^U}tB4X4XBXBX@DXBX@DXBHABBX@D XBHA]+I+IXUEVWFX~F@D0XFPJL2t jW_^]UVWFX~F@D0 XFPBD2*EFX@D0XFPJL2Xt jWg_^]UVu*N9rqtE PEpQ,V^]+IVWFxt P,V׃Fuet[F FX@D0 XF HAD1)F FXjV@D0 XF HAD1FXx_^_2^U}tB|X|XBXB ]U2]3ʼnEVEPN 聣}ECEP6]Ur(MBrI#+wuRQVFX@D0XFHAD1N޵FV@D0pXFHAD1X蹝M3^]$+UE=wC=r#H#;v3Q:ȃt)A#H]t P]3]9*XA,/]AI AAAA AA FAFAFA PFXA$HA(HUSVWutd} t^vtFXD38,VNQu Px,V׋FxD7p,VO_^[]USVWeutc} t]vtFXD38,VNQu P 8,V׋FxD7p,VO_^[]XA,/]AI AAAA AA FAFAFA PFXA$ HA(HU StMtv]to}tiU tbVEWEEQP:8EPuEu7Puu v,V֍M8E M M_^[][]UVuu3^]vSWtFXD38,VN׋8,V׋N؋yWr,VO_[^]U}tBXXBXBX@DXBX@DpXBHABBX@DXBHA]+I+IXUEVWFX~F@D0pXFPJL2t jWC_^]UVWFX~F@D0XFPBD2/EFX@D0pXFPJL2Xt jW_^]UVN9rqtE pEpQ,V^]+IVWFxt P,V׃Fuet[F FX@D0 XF HAD1<F FXjV@D0 pXF HAD1FX_^_2^U}tBؘXؘXBXBX@DXBX@DXBHABBX@DĘXBHA]+I+IXUEVWFX~F@D0XFPJL2t jW_^]UVWFX~F@D0ĘXFPBD2EFX@D0XFPJL2Xt jWW_^]UVeN9rqtEPQ,V^]+IVWFxt P,V׃Fuet[F FX@D0 ĘXF HAD1F FXjV@D0 XF HAD1FXx_^_2^U}tB X XBXBX@DXBX@DXBHABBX@DXBHA]+I+IXUEVWFX~F@D0XFPJL2t jWs_^]UVWFX~F@D0XFPBD2_EFX@D0XFPJL2Xt jW_^]+IVWFxt P,V׃Fuet[F FX@D0 XF HAD1F FXjV@D0 XF HAD1FXH_^_2^UQSVWRFE8xut{FXD38,VN׋F;/]t,VPuN؋yWr,VO֋E+^{tS,V׋^FxD7p3ۋpSP,V֋EtHyGp,VO_^[]U}tBDXDXBXBX@DXBX@DXBHABB(X@D0XBHA]+I+IXUEVWFX~F@D0XFPJL2t jWS_^]UVWF(X~F@D00XFPBD2?EFX@D0XFPJL2Xt jW׺_^]UQVF8pWP,V֋u E8_^]SjC؉Et jK`3ۉ]/]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]+IVWFxt P,V׃Fuet[F F(X@D0 0XF HAD1|F FXjV@D0 XF HAD1FX_^_2^U}tBXXBXB܊X@DXB܊X@DLXBHABB`X@DXBHA]+I+IXUEVWF܊X~F@D0LXFPJL2t jW_^]UVWF`X~F@D0XFPBD2 EF܊X@D0LXFPJL2Xt jW藷_^]UV F8,r&p(tP,V֋uPV^]E^]USVWP GE88x4 ]C+Ep,V֋u;B3UE3ɋº QEMQjP9 M3EfD3E40FXD38,VN׋F;/]t3VPNEyWr,VO֋]EM1^]{tS,V׋FEFxD7p3U E@E;EMEuPEPVv4,VSs3蹴U CM3Et|f4EPS;St) tAxD0,VOփC PR藴EtHyGp,VO֋EM@E;ErQ/_^[]UV F8r&ptP,V֋uPV!^]E^]UV F80r&p,tP,V֋uPV^]E^]USVW` GE8<x8 ]C+Ep,V֋u;B3UE3ɋº QEMQjPI M3EfD3E40FXD38,VN׋F;/]t3VPNEyWr,VO֋]EM1^]{tS,V׋FEFxD7p3U E@E;EMEuPEPVv8,VSs3ɱU CM3Et|f4EPS;St) tAxD0,VOփC PR觱EtHyGp,VO֋EM@E;ErQ?_^[]UV%F8 r&ptP,V֋uPV^]E^]UVF8r&ptP,V֋uPV^]E^]U VF8(rLp$tEPEP,V3WPEHDAp$H^P؊X]EW^@@@$؊X]U VF8$rLp tEPEP,V3WPEHDAp$H^P؊X]EW^@@@$؊X]+IVWFxt P,V׃Fuet[F F`X@D0 XF HAD1 F F܊XjV@D0 LXF HAD1FX訯_^_2^UQW} u E8_]SVj>؉Et jK53ۉ]0]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]ȌXA</]AI AAAA A,A FAFAFA PF܌XA$@HA(HA,HA0HA4`HA8pHUQW} u E8_]SVjޭ؉Et jK[?3ۉ]$0]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E^[_]U$VuuWfEEU^]vSWtFXD38,VN׋Mu Qx,V׋HXME܉XNywv,VO֋E_[^]U SVW}A} 7}-tGXD;0,VOQej3؉Et jKp63ۉ]0]sECt%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VKփ}PQu Pp,V֋O؋IWr,VO_^[]_^3[]U(SVWrE} }}}PEP ejE迪؉Et jK83ۉ] 0]s{t!FXD38,VN׋Ex_t W,VӋE0t7FXD38,VN׋FxD7p,VO֋EE܋EEEPEExVPQEu ExVPE}p ,V֋MExVt$}tQbj u۩ EEEExVt$}tP0j u詩 EEM_^[]_^3[]USVWutd} t^vtFXD38,VNQu P x,V׋FxD7p,VO_^[]U SVW}3} )}tGXD;0,VOփ}PQejX؉Et jK93ۉ]$0]sECt%F@ƉE,VMӋE@Xt P,VӋE0t;F@ƉE,VMӋFXD3ދp,VKQu Pp,V֋G@Gp,VO_^[]USVWutc} t]vtFXD38,VNQu P*8,V׋FxD7p,VO_^[]U}tBXXBXBX@DXBX@D XBHABB X@DXBHA]+I+IXUEVWFX~F@D0 XFPJL2t jW#_^]UVWF X~F@D0XFPBD2EFX@D0 XFPJL2Xt jW觥_^]UQVF8Dp@WP,V֋u E8_^]Sj؉Et jK3ۉ] 0]s{t!FXD38,VN׋Ex_t W,VӋE0t9FXD38,VN׋FxWr,VO֋E[_^]E^]UVN9lqhE @xWPQ,V֋E3t@j EWWfF~fWONfGG6}xVGGtTES^t/t+j 臣jPWGSuf@G~}[tVj V~ _^]E^xV@@]UVuv>pra~lt[SW5}؅t SW SVvl,Vօt,7vWT@Wv6vSG S{5 _[^]UVF8|r@pxt9PEP,V3WEHDpHX^]EW^@@X]UVrF8xptWP,V֋E3t@j ١EWWfF~fWONfG04}xVGGtTES^t/t+j pjPWGSuf@G|}[tV|j Vg _^]E^xV@@]UVbF8`p\WP,V֋E3t@j ɠEWWfF~fWONfG 3}xVGGtTES^t/t+j `jPWGSuf@G{}[tV{j VW _^]E^xV@@]UVUF8Xr&pTtP,V֋uPV1c^]E^]UVF8\r&pXtP,V֋uPVb^]E^]UVF8Pr&pLtP,V֋uPVb^]E^]UVeF8Hr&pDtP,V֋uPVAb^]E^]UVF8Lr&pHtP,V֋uPVa^]E^]UVN9hr-qdt&E@txtPQ,Vօ^]2^]UQSVWrFuE80x,FXD38,VN׋F;/]t FxD7p,VO34^{tS,V׋^FxD7p,VO֋uSVv,,V֋u2ۅtNyWr,VO_^[]+IVWFxt P,V׃Fuet[F F X@D0 XF HAD1F FXjV@D0 XF HAD1FX踜_^_2^UVN9tr>qpt7EPt-zt'E @txtPRQ,Vօ^]2^]UVeN9}4])}3EEthPEPMtAxD0,VO֋MUMtBxDp,VO֍MtEEEuE܍EPExVE8E EEPEExVPQEuPWEPp,V֋MEExVt$}tQ8rL~4tFSW ]t WS`WVv4,Vօt3SW|Wp  _[^]UVv>0rL~,tFSW* ]t WSWVv,,VօtßSW W  _[^]UVv>4rL~0tFSW ]t WSWVv0,VօtSSWW  _[^]UV%v>,rL~(tFSWJ ]t WSWVv(,VօtSW,W  _[^]+IVWFxt P,V׃Fuet[F FtX@D0 XF HAD1\F F|XjV@D0 `XF HAD1FXu_^_2^U}tBXXBXBX@DXBX@DXBHABBȜX@DМXBHA]+I+IXUEVWFX~F@D0XFPJL2t jWt_^]UVWFȜX~F@D0МXFPBD2EFX@D0XFPJL2Xt jWwt_^]UQSVWFE8xuFXD38,VN׋F;$0]tVP衰N؋yWr'^{tS,V׋^FxD7p,VO֋uSVv,V֋EtHyGp,VO_^[]+IVWFxt P,V׃Fuet[F FȜX@D0 МXF HAD1~]j}bYȉMt33@PXAAY ωƉNfjDYUf}M؉}35|<]]E]!j M]fSPEEPEȋP9PW'YYM̅tUM>hMEr6M@EЉME=rEPEPFEYYMPQdaYYeUjh:UdPV2]3PEdpuj06aYYMd Y^UVu WvuVu6YY~ t_^]Ujh:UdPV2]3PEdu NEgj0V`YYMd Y^UjhYUdPSVW2]3PEd} 3Sh@E]hC]S7/u^t PWtƋMd Y_^[Uu cM]joUd}u O3XV]Y^EuO YNEEGE9t Hd jMNhG[EP(UVuWVPNhXFG_^]UQaaEA E AMhXj,oUd}wjX3ۉuV^˅w ]Vu^赅YYcjOoUc}w0X3ۉuV]^|Y_0G4_ FcXW9tVjp(,V^_VNtbRNtVRX^XVN NQX^jHoU9cue]ˉ]ej]ceEu>MQp,VփeMؾ0jXEPuzEEP/bMgdMEtEM؃eePeEPMEuzEEPaMdEEr6M@EME=rEPEPEYYMPQ9]YYEaUVvEt jV]YY^]UV4NEt jV\YY^]UEVXt jV\YY^]UEVXt jVs\YY^]UVEt j8VD\YY^]j(oU`}?VEPM eAH w QM1}t~t uu}E]tCE܉E]EEPEEt lOEjU[YEEtuWuU3PMEee}؅tGEԉE}6EPEEPEN0,VMVMtNtNtN#?up,VօtN2R_jMIhG[EP2Uu +MPE]jpU?_d,] ^ ];^þ]V]=]YuehV]tX]j\Vm]YYjCpU^d,x] ^ ];f^þ]Vs]=]YuehЅV\V]YYjwpU\^d, ^ t]; p]]ÿt]W ]=t]Yuej*YYuEtfFhX3W5p]s\YjHpU]}EPeEPM]ME_j M]E%PM(ZMQqEP>PQ,OQ_B;tPM!_M_\jpU&]d, ^ l]; h]\ÿl]W[=l]YuejWYuEtfFhX3W5h]=[YWy tVjp(,V^_UQVuWuMVLPWuEYY_^j0'nU=\Ej0t6MB\eMVlMQEp,V֍M'M \MQEp,V֍Mċ][UVWup,V_^]3UEVPw@;tx(uPEPq(^j MpEhG[EPjqU[u EPYYe}>tOEPu,VWuO$,VW$MtIZUM5p<]j nhx[EPXUM5<]j >hx[EP(2UM5<]j hx[EPUM5<]j hx[EP踋UM5<]j hx[EP舋UM5x<]j nhx[EPXUM5<]j >hx[EP(UM5<]j hx[EPVWyA Pr,V_^UQVEuuuPE P^ jBUXuuANEeQQԉEPFM FHFHF@ F@ KXjX:UsXuuN3u]YY FM FHFHFX FX W UQEVW}w&fVuY_^USVWu EPW=u }˥uV>t E0@?{ffft=u M3SMp`1Vuu MA_^[Ujh:UdPV2]3PEdpuj6sRYYMd Y^UVu WvuVu6YY~ t_^]Ujh:UdPV2]3PEdu jNjVQYYMd Y^US] EVWSP;uSV&=t E0@LI$ tJE]PEPh`X7MWfMp`VuuR MA_^[zUQQu EPEMMHj$qUU}3W_;5w]Vu^%5YY}UUjh:UdPV2]3PEdFtHjyFt jPPYYMd Y^Ujh:UdPV2]3PEdFtH"Ft j(P`PYYMd Y^QUVNQEt j V,PYY^]jKqUTd,] ^ ];sTþ]VS=]YuehVRVSYYUVuW;0E u&x t E MVuE ;u_^]UQVuWuMVDPW#EYY_^UVuW;0E u&x t E MVuE ;u_^]UQVuWuMTVDPWwEYY_^UEPEPu MQUVW7vW~.NEE yPyM MID=VqtJ;t Ѕu2^ð^ËAt@3UQQVW3uWMuuMut<_^UQVN(_PaaMFHPE^jqU?Mju MQyMeP`Mt$~]j}zFYȉMt33@XAAY ωƉNJjDU#K]3>~]j}FYȉMt33@ȟXAAY ωƉNJUVW}3ɋыGt@ЉNVt9_^]US] EVWSP/uSV"1t E0@LI$ tJE]PEPhcX7MWMp`*VuuNMA_^[vUS] EVWSPw/uSV0t E0@LUUUtJE]PEPhcX7MW&Mp`VuuMA_^[US] EVWSP.uSV*0t E0@LUUUtJE]PEPhcX7MWMp`yVuu6MA_^[^jVUHuueME0jXaeEPNhXHMJXqHjrUH}u3G |X]_$_(j O0EXG XyHu wHΉ^)EEGP9t H jMW2hG[EPyhXIUjh:UdPV2]3PEdFtHjKFt jPCYYMd Y^Ujh:UdPV2]3PEdFtHjFt j0PBYYMd Y^̃ 8UVNhXIEt j VkBYY^]UVLnEt jXVDBYY^]j$'rUFM];0,Vք;MQp,VփeMtzNXMPEPy 0IVEN(EP;F(tHuj 7EPEPN(SlMtN5EjjMH0hG[EPwUQQVuWt/SW؋S*;uSEPRV(`[_^jBrU%FueCI2hEjPrUEu؋M 3ۉ] }OI w1!]Mh<0]E0jX]!]ECP]+GEtEMtM]F}t~F Pr,V2jX@Y}EtMVuN QP%3MMP/E E8}܋7u;jpE?YEEԅtM̍EPVmMt3 EIË}܋]MEvu%EPu؃~t@vYEPM~EPF E P2,V֋Mt2MЅtx2 C̋AH wITh<0]PYYt2̋AHj Y;UQVu uyf F0jX^ UQE VujNMB^ UQVuuwBNEQQԋEPFM FHFHF@ F@ ^jAU]Buu8+NEeQQԉEPIFM FHFHF@ F@ AjDYU+B}M؉}35<]]E]j M]ASPEEPEȋPm{PW YYM̅t0MrCMEr6M@EЉME=rEPEPzEYYMPQ<YY(AjDYUoA}M؉}35<]]E]j M]#ASPEEPEȋPzPWYYM̅t/MBMEr6M@EЉME=rEPEPEYYMPQ;YYl@jDYU@}M؉}35<]]E]=j M]g@SPEEPEȋPyPWZYYM̅t=/MAMEr6M@EЉME=rEPEPEYYMPQ ;YY?jDYU?}M؉}35<]]E]j M]?SPEEPEȋP9yPWYYM̅t.M>AMEr6M@EЉME=rEPEPFEYYMPQd:YY>jDYU;?}M؉}35<]]E]j M]>SPEEPEȋP}xPWYYM̅t-M@MEr6M@EЉME=rEPEPEYYMPQ9YY8>jDYU>}M؉}35<]]E] j M]3>SPEEPEȋPwPWYYM̅t -M?MEr6M@EЉME=rEPEPEYYMPQ8YY|=j,rU=]M؊Eu ]5<]eEEEDuԃeEVPEȋPwPSYYM̅tO,MEr6M@EЉME=rEPEPEYYMPQ:8YY< j,rU=]M؊Eu ]5<]eEEEuԃeEVPEȋPUvPSSYYM̅t+MEr6M@EЉME=rEPEPjEYYMPQ7YY< j,rU_<]M؊Eu ]5<]eEEEuԃeEVPEȋPuPSYYM̅t*MEr6M@EЉME=rEPEPEYYMPQ6YYf; j,rU;]M؊Eu ]5<]eEEE.uԃeEVPEȋPtPSYYM̅t9*MEr6M@EЉME=rEPEPEYYMPQ$6YY: j,rU:]M؊Eu ]5<]eEEE|uԃeEVPEȋP?tPSrYYM̅t)MEr6M@EЉME=rEPEPTEYYMPQr5YY: UUHb By u$E V03 9q}IJ@ By t^]UMy uE ;A|2]US] EVWSPuSVt E0@LUUUtJE]PEPh؟X7MWMp`VuumMA_^[US] EVWSPuSVt E0@LtJE]PEPh؟X7MWMp`9VuuMA_^[ UjhYUdPSVW2]3PEd} 3ShXk]hC]S7wu^t PW˿ƋMd Y_^[UjhYUdPSVW2]3PEd} 3Shj]hC]S7wu^t PWdƋMd Y_^[UjhYUdPSVW2]3PEd} 3Shk]hC]S7vu^t PWƋMd Y_^[UjhYUdPSVW2]3PEd} 3Sh(k]hC]S7Qvu^t PW薾ƋMd Y_^[UjhYUdPSVW2]3PEd} 3Shk]hC]S7uu^t PW/ƋMd Y_^[UjhYUdPSVW2]3PEd} 3Shj]hC]S7uu^t PWȽƋMd Y_^[UjhYUdPSVW2]3PEd} 3Shj]hC]S7uu^t PWaƋMd Y_^[jsU5ى]j5Meyu,Hx0HV35;uO5jMhG[EP/gUjh:UdPV2]3PEdFtH7Ft j0Pl0YYMd Y^UV~u%WGj_@+U_;sk^jjVMPhH[EPfjEsU4d, ^ ,]; (]\4ÿ,]Wi3=,]Yuej/YuEtfFhxX-3W5(]2YjysU)4d, ^ ]; ]3ÿ]W2=]Yuej.YuEtfFhxX3W5]@2YjsU3d, ^ \]; X]<3ÿ\]WI2=\]Yuejg.YuEtfFhxX 3W5X]1YjsU 3d, ^ <]; 8]2ÿ<]W1=<]Yuej-YuEtfFhxX}3W58] 1YjtUy2d, ^ L]; H]2ÿL]W)1=L]YuejG-YuEtfFhxX3W5H]0YjItU1d, ^ ]; ]1ÿ ]W0= ]Yuej,YuEtfFhxX]3W5]0Yj}tUY1d, ^ t]; p]0ÿt]W 0=t]Yuej',YuEtfFhhyX3W5p]p/Yh\uU0]Eu ]PuqeuPEP%YPEp}P_MED2@$MPz'CExF+M}ԃvj:MK!ytj=F+}]EYEu8jEE0jXEEEEPMj M/MEm?eM؋EhܠXuEDEEPEċPj(^FEEr7M@EԉME=rEPEP,EYYMPQJ*YYEeMj^hܠXuEMЍEPpEP(AMEEr8UAMȉUErEPEPUYYMQR)YYExeuEx tjEM;C)0^M<]E0jXY|EEEEMЍ|PE-|/E|EEMЍ|PE g-|E/jՔEPM|j谔EPn$d, ^E ];xh] uP0EPg"YPE 9PME .FP_Mj | -|E 'Yj uU(EPi!3ۉ]DzM P軅8M Շ:uLhXt uV^3 hXt!uV]Y4YMt'CWME0jX]1@uEPEZMԈ])SEM0H'juU'eeuVh{3e@PEL'j4HvU'}3ۉ}W]]h3]EFPuwYu7PP#M؈] )EP*ME]E]$XEPEEPȉEEr3M@EԉME=rEPEPEYYMPQ!YYMȅtw&j(uvU&d,3 ^ ];M G9jH+YE؅&M ESP}Vh@E]hC]VWuAejhpE]hC]jW+ejhE]hC]jWEejhD]hC]jWEdPEjhD]hC]jWdjhD]hC]jWEdjhLD]hC]jWEdjhD]hC]jWEdPȅEEE9EuX9EuS9EuNuJMMЅtICj^;]E0p ]tA ] ]H$Ëu&f]t@]]FnPEPu3YYVHNP;PEPPEPuPV!EPuPV M؅tyMЅtmQ]W##=]YhpV5]5]!W"YYjvU$d, ^ 4]; 0]#ÿ4]W"=4]YuejYuEtfFhxXx3W50]"YjvUt#d, ^ $]; ]#ÿ$]W$"=$]YuejBYuEtfFhxX3W5 ]!YjwU"d, ^ d]; `]"ÿd]W!=d]YuejYuEtfFhxXX3W5`] YjEwUT"d, ^ D]; @]!ÿD]W!=D]Yuej"YuEtfFhxX3W5@]k YjywU!d, ^ T]; P]g!ÿT]Wt =T]YuejYuEtfFhxX83W5P]YjwU4!d, ^ l]; h] ÿl]W=l]YuejYuEtfFhܟX3W5h]KYjwU d, ^ ]; ]G ÿ]WT=]YuejrYuEtfFhܟX3W5]Yj, xU E MQ8p,V3EEEEajMQMQ:PMǨMtuMMNiIËu3FMw!Zj,7xUE MQ8p,V3EEEE`jMQMQ\PM7MtJuMMNnjIËu3FM j,bxU_E MQ8p,V3EEEE_jMQMQ~PM觧Mt uMMNjIËu3FMW :j,xUE MQ8p,V3EEEEc_jMQMQPMMt* uMMNkIËu3FMj,xU?E MQ8p,V3EEEE^jMQMQPM臦Mt uMMNlIËu3FM7j`yUDu3߉]WWE0jXEEEP}_MMҵM PI% /jH+YEP]~d, ^E ];hp]MPyzEPYPEBMP\zMEAh̠XME0jX}4M܍EPEEPEPPEcMЃ t/ M:d, ^ ];~EP]=]E =]p,VP#}PyEPYPE OPjyME OEP\ j [E]PYuPE NP)yME0jXE]u܍EPEbPxM]EP#\EEPYuPEPxME0jXE]uԍEPEPxMre0jXj^]uEEPEP菞ME]uEEEPEPgMEEPEPPEaMЃ t. M؅t" Mt M))=]EP[j [EE0jXE ]EEP&}܋PwEPYPERPmwMEREPZ EEPYuPESP.wME0jXE]uԍEPEgPvMEEP'ZEEPYuPEPvME0jXE]uEPEPvMErEPYMEPE)e0jXj^]uEEPEPuM+]uEEE PEPMMEEPEPPE!t_Mȃ tMЅtMtM؅tMMtþ]V=]Yh VEp]0jX]x] VEYYh]>=]YjjpEUYuEt6E v PMԉ}ԉ}EEP3ۍECP]WP]E EtM؅th0VQM$]JYjUUuj}E0jXEEE܃eP}MG,UQQ00]Eh00]Put*00]j|{UNu} j0}0jXE]EE؃eP6}MM詮PO(jH+Y=]" EEPVEEPVyj[E]P YPEMMPGsM00jX]uE EEPMPsM؈]eMhXu]-MȍEPE贝M؈]EPEPrPE]M ]tEP YPE}PrM~uE E EEPqPgrMPu؉]EEE PVM؈])EPnUj [E]PY YuPE (PrME0jXEE uЍEPE 8PqM؈]EP~YMЍEPE %EЋPEPEPEPcZM tMtMԅtMątMEPyTvEEPbT+EEPOYPEMPpM]E E EEPMPpMej][]MȍEPEsMEEPEP0PEC[M EtEPSEEPYuPEcP>pM'j _E0jXE.}uЍEPEtP pMEEPYMЍEPEJ#uEP<EP YPEPoME0jX]}EEPPoMEuE0jXeMhxX)EEPpMEBEPEP6Ej[; EPfREEPOREEP<YPE~]ȋPnM0jXE uE EE PPnMeuEEE!P}MEsEPYPE"}PcnMLuEE EE#PP5nEMeMhXuz(EE$PMEEP0QEE%PYuPE&PmME0jXEE uЍEPE'PmME%wEPYMЍEPE( EЋP臚EЋP|EPEP{PE)XM E(tXEPEPQPE*uXEP=P~EE+P'YPE,I}PlM0jX]uE EE-PPlME+eMhXEEoE.PO MQh$EE+r7M@ẺME/=rEPEPYEYYMPQw YYE+EPPOEE0P=YPE1MPkME0j M ME2EԍEPNod, ^40] E3 h];hP]uPtkEPYPE5}PXkME3=40]3Pj YPEPE EE6PDžx0jX]EeMhXE7EE]ԍEPEE8PF(P"!EE7r7M@EԉME9=rEPEPEYYMPQYYE7eMhȠXEEaEE:PEЋP:x(P EE7r7M@EԉME;=rEPEPDEYYMPQbYYE7Mj2sMEPQsx MtMtME0 EPEPEPPEE 3A0jXMuE@EEM PthXM؉u؉} EPEsMfEuEE 3EPEPNZ;p,V֍M$MjLU]e]]eSB=eM؃e3F0jXhXủ}> EPuSrMEd, ^ H];3h0]PYj MEEPeMj_E}E$XC6EPMEȍFPEr3M@EԉME=rEPEP1EYYMPQOYYeMȉ}EEtEP(eME}E$X觵6EPMEVȍFPEr3M@EЉME =rEPEP蕮EYYMPQYYeMȉ}EEtk EPq;r,V֍M þH]V=H]YYhVE=0]@]8] nVEmYYjDeU3u}Wu:3E0jX@EEm]EEPphXME0jXuEPEoMȈ]-d, ^ ];M=]p,V֋]P3PV;r,V֍Mh]=]YujpEY}Et8EPMuuWj[EEPE]P9V]E?EtM]tjh VE$]Yj4U"3u]Su>9 X3@E0jXE}EЋ EEPEohXM؉}؉u EPE.nMEd, ^ ];73h]PjU;r,V֍M@#þ]V0=]YuhІVE=]]] VEYY{j4U3u]Su80jXuhXME}u EPEnhXM؉}؉u EPEmMEdd, ^ ];73h]PCT;r,V֍Mþ]V =]YuhVE=]]] VEYY{jMUee]S6eM؃e3F0jXhXu} EPulMEbd, ^ ];83hp]PAS jk;r,V֋þ]V=]YuhVE=p]]x] ~VE}YYwj4U3u]Su53E@E0jXE} EEPkhXM؉}؉u EPEjMEAd, ^ ];73h]P R;r,V֍Mþ]V=]YuhVE=]]] aVE`YY{j~]j}mYȉMt33@XAAY ωƉNjނU]3>~]j}YȉMt33@lXAAY ωƉNUjhYUdPSVW2]3PEd} 3Shk]hTi]S7,u^t PWtƋMd Y_^[jUTuu3\XN}4E N$uF 9yE9~ t  jM2hG[EPjUuu3LXN}E N$uF 9ytE9~ t s jMhG[EPSj:UuEeX@F'j:UOuEeXFj eUuEeXx u08tSjhk]hTi]j0+F./x u)PEP}sYYEEF Mthj:UuEeXF8UQaMXVN(tbNX^W9tVjp,V^_XUjh;UdPV2]3PEdXXMd Y^UVE΋@F ^]UVWV t&p,V֋MPqE_^jMhG[EPUVEt j0VtYY^]UVEt jVDYY^]UEVXt jVYY^]jUd, ^ ]; ]\ÿ]Wi=]YuejYuEtfFh X-3W5]Yj̓U)d, ^ ]; ]ÿ]W=]YuejYuEtfFhX蝣3W5]@YjUd, ^ ]; ]<ÿ]WI=]YuejgYuEtfFh$X 3W5]Yj5U d, ^ ]; ]ÿ]W=]YuejYuEtfFh,X}3W5] YjiUyd, ^ ]; ]ÿ]W)=]YuejGYuEtfFh@X3W5]YjUd, ^ ]; ]ÿ]W=]YuejYuEtfFh0X]3W5]YjфUYd, ^ ]; ]ÿ ]W = ]Yuej'YuEtfFh8X͠3W5]pYWy tVjp,V^_V~tVNP0^V< N^>jUou EPe}t#MEPMt[EjMXhG[EPV~tVINP0f^jU }?[0,Vքt0SM!?MeQjp,V֍M6eMeW?EEP@PK0?Mtz$jMzhG[EPjBU3_0,VuEύEPae}t@}t$0,VքuMPEMtjMhG[EPnjqUN ~MQp,VփeMt!Mtw MtgjgU;~MQp,V֋MQ3ۉ]p,VShti]hi]S0E "M]tNPYY0MFHPWMtEgVKF^HjBU{Ext0,Vքt2u MEPeEtLt%0,VMքuM PDMEPMtEjMhG[EPUVN^y(uufJEjMhG[EP[UV@N^y(ty(uKjMhG[EPVF^@(VFH^UVF^x(t x(tPjM7hG[EPUV(M PIՖt^]UV|uNK^]yj~UeeIM ~0_(E0,Vքuzuvup,Vu uVcI33AEM9u;EEEMPu EP5P iMtMt;]uutu JujjMhG[EPxjUXu~ut_j0YȉM3Et VSu MMPuEtFEEuEEPAtLEjMEhG[EPWytV0,V^t_2_UVuNL^]UVvuNL^]UVX}tu}NP0e^jMhG[EP-UV}tuNP0^jM]hG[EPUV}tuNP0^jMhG[EPUV}tuNP0^jMhG[EP[UVCztNu0^]UV}tu\NP0$^jMbhG[EPUV}tuNP0^jMhG[EPUV}tuNP0^jMhG[EP`UVE}tuNP0^jMhG[EPUV}tuNP0s^jMJhG[EP UV}tu.NP0-^jMhG[EP UVs}tuNP0^jMhG[EPH UV-}tuNP0^jMxhG[EP UQV tENEEP^Vt N^!;2^UVNuH^]jUvwj0YȉM3Et uVu MMPjuEtFEEuEEPftqjUytjM\hG[EP jDYUI}M؉}35<]]E]Ӕj M]SPEEPEȋPPWYYM̅tMMEr6M@EЉME=rEPEP蘍EYYMPQYYFUVuNaa辎F^]UjhYUdPSVW2]3PEd} 3ShD]hC]S7$u^t PWi`ƋMd Y_^[Uu iM]ٲUjhRUdP,SVW2]3PEde}_ X]XeGEȉE PMcjO0Eo=,0]GPEhMQuEwWPd6uԅtFuԋEЉEȉűMEPE{EEtEMQp,VMքt7eeEE0EPEPwHN,VMVM̅tMԅtMb IË}]܋OLtzO07yMhX"Md Y_^[jmUe,0]wu5y,0]ø{IjUd, ^ ]; ]ÿ]W=]YuejYuEtfFhX`3W5]YUQVuWuM}VPW&mEYY_^UQVuWuM}VPWEYY_^jUy8 uQ0u eMe蓶ueEPMQ(MtqjMǿhG[EPQj0̆Uu}3ۉ]?tF0,Vքt/EMQ8p,V֋uC8t~8 u EuEt Mt,}N0PE܋P0F0H v j N(N(nuEP]\YYe}t2eEPME0jXEEPE܋PMcMt<USVWu f;tBuX(U;3t/NctVEPRuNE_^[ j M9hG[EPjuUكeM euVe6SEUuP1]W3uPz1bUy8 u*u 0#x uQPuEYYjM肽hG[EP jU;3Ey8 Eu\}GG0EE0E(OP;Ot QDMzE;uԋjMhG[EP}jUueu u*EIËE `I UVuQ΃&fX^]jH^UT}jOMQPEċPx3ۉ]܉]M܋HMXMȉ]t#}O0PE̋P(y nE0jXE܉uPM]3ۍECP]>MEuE;0GPωEFPEPx}؅tG}؋EԉẺ}ЋMEPEuEt[eeEE8EPEPEOpH,VMWMЅt!MVM؅t 3ۋMt|XIjRDUuuffu eNXjRDUuu3~~݅u N}0jXyj DU>uuNueFM FHFHF@ F@  jnU]3>~]j}YȉMt33@XAAY ωƉNdUE ȃxrpQMj苐MPoE]jDYU}M؉}35<]]E]j M]HSPEEPEȋPPWkYYM̅tMMEr6M@EЉME=rEPEPEYYMPQYYjDYU}M؉}35l<]]E]bj M]SPEEPEȋPPWYYM̅tbMMEr6M@EЉME=rEPEP'EYYMPQEYYjDYU}M؉}35<]]E]覈j M]SPEEPEȋP^PWYYM̅t覼McMEr6M@EЉME=rEPEPkEYYMPQYYjDYU`}M؉}35t<]]E]j M]SPEEPEȋPPWlYYM̅tMMEr6M@EЉME=rEPEP诀EYYMPQYY]jDYU}M؉}35<]]E].j M]XSPEEPEȋPPWYYM̅t.MMEr6M@EЉME=rEPEPEYYMPQYYj,rU]M؊Eu ]5x<]eEEEiuԃeEVPEȋP,PSYYM̅ttMEr6M@EЉME=rEPEPAEYYMPQ_YY USVWu EPtu }˥uV話t E0@?{t=u M3SqMp`Vuu€MA_^[UVuW} ;}tW_^]USVWMj[G+;skWw7Vkw*v+G+;v u QW+QwG _^[]jyU[u} F+jYuΉE:PΉEU؋Ee+kVP]QMZVSvE6uuS>uMuuMu&jj 詂UE Vutf0jXuuVVL ^]UjhYUdPSVW2]3PEd} 3Shti]hi]S7u^t PW4PƋMd Y_^[UjhYUdPSVW2]3PEd} 3ShLD]hC]S7u^t PWOƋMd Y_^[UjhYUdPSVW2]3PEd} 3ShC]hC]S7!u^t PWfOƋMd Y_^[UjhYUdPSVW2]3PEd} 3ShE]hC]S7u^t PWNƋMd Y_^[UjhYUdPSVW2]3PEd} 3ShpE]hC]S7Su^t PWNƋMd Y_^[UjhYUdPSVW2]3PEd} 3ShD]hC]S7u^t PW1NƋMd Y_^[j$U_u uu;_t];u uGEM؉}desVUGSVuV E؋PEPuYYE0 VM UQQu EPEMMHj`UMu 3ۋEu]]U]RP|2}%MEPE]P],9uuE]P`PN*WtGu}uEPEiE]thMQp,VMքu9t_EPEP YYPEPEPn VuPEN0ŷM}M}Fh]PM]芥E ]]E]EPEP3uv,V֋M؅t譳t袳_jdLU}EE0,VքEPs3ۉ]p,VPjMP"MQp,VPM]]谤EEPiuP!MtM]tݲE9uE]PjPNKxE]PE]P)}tGu}uEPEgE]tqMQp,VMքu9EPEP YYPEPEPs 6uPEN09ufjp:YEEt0]EP q,VփMMh\XPESE访MMt6M(PMԉ]ԉ]qEEP躾MM؅t诗Pu辺EYYD j M蚒hG[EP$jUSG(Et 0,VքMP^OQMP3ۋu]܉]}]u>~u_OP÷M脹Pό;uAM" uPVEPAHOP臺jH+YΉE船E;EvIM M9MPVEPtPMR0Mte}t VË]Et@E2UAV1+jYM;v k^]n`̋A(t tt2ðj|Uى]ċ}ϋs('(3Ʉ{X MM؍MhcVEoaeE؃eMPE0jX謾EEP&M9MErlM@EЉME=rEPEPAZEYYMPQ_MYY0{Xu*jXE0jXEMEύEPJ&MMÀE;0,Vք3PȍCP芧ksPVx脥E}uEMEt蜓}uu̍EWPMt{MLE;(KPQxQx2jT8UKًuMj "eMV PM%PEEPME讥M\EP詻PK0חM茥膣jXuUͣMuM} j 蠣eMeV)PMPEEPFME,M=\WfPMpPEEPMEM \EPdMP0MԤ΢jXuUMuM} j eM譲VPM%PEEPMEtM[WPMPEEP[MEAMR[EP̺MP0gMjUU)j M7ePM诞MQ$EP¸PN0}uSM踣蝡hŏUMul} j ơel舱VREuYYPV\YYٝjUuVIiK3EEEuMEPEPeM}tRj[ V;uuE+lj}kEE=rEPEPQE}YYPW讘YY+j@ÐUSى]0,Vք{(tjEjYx0+ƙ`jMMjeA+YMPѯ踰VSGAIEPMVEMQX,VMӃeM܃ePF}EEP9&MPPMt脋MEtt]S&MPuMMjXEtB;BEPEPq}MQp,VփeM܃eEChP|7EPEEPuN,VVMtъM莝sjMɅhG[EPSj8U肛uFVȉEH؍Mj;7utseM2];EP]MVEMQp,VփeMeP{EEPDMPMtMEtۉSEMPuMyMJBMEt詉uFMfjH+YtieEePEP}MQp,VփeeE7EPEEPuN,VVMEtMSCGMӛ踙UVq KuuOE E `^]VgP^VjqU蔙MQp,V3Phti]hi]PuEtUtHP M t@HMtSVgPNS^ΪV`xPO^4j(9Uu 3E0jXM̉}Ẻ}PEPME蜚Mu,}}EEPu uMt詇E EMHCj(9Uk} E0jXE}܃eEPEPgMEMu*!M!MEEPWuMt&E EMHjuUSM3uE0} EE]MQMPSE93u=? 97t4EMQp,VMSWPE"M t~&3VVjUD3E}GGyX EEu=P0E(OP;Ot 蛽QM>E;uԋ詖jđU<d,^];gu ex u"w8tPuèEYY/ IËE ` ]tA ] ]H]W#=]YuhV輓W返YYmUVuqPEu谚eMPE0jXSEPEPYYeEPMEE0jX)M܅t"yeeMtAMEEMEEPMEtxSEPEPM葋M艋MtxMtx2PIÃy(ujy(u j P耠UW u!Vu~u"POV|^_]UVu3PN辅 ^]j8Umى]M8}7u;eFeMPE0jXEjN(QMQFEPEԋPEEPEP0M؅twMtwMG (JË]}MM/u[ UEA(]UU3Q(x~tt u jjj XPP ]UA(ttt t]]2]P]UVu9PNG^]jMSQEp,V֋EEr3M@EЉME=rEPEP~7EYYMPQ~YY,j(HUsى]ԋ}3]XCC5<]M؉EEEE=MSQEp,V֋EEr3M@EЉME=rEPEP6EYYMPQ}YY膂VN;N^qUV`X%]Et j V}YY^]j>UMd,L] ^ X];þX]V=X]Yuue:hЇVL]PX|VYYjeUׁd,] ^ ];xþ]V腀=]YuuehV]XV YYjUad, ] ^ ];þ]V=]YuuehV ]X~VYYjUd,<] ^ H];茀þH]V=H]YuuehV<]@X~VYYjڔUud,] ^ (];þ(]V#=(]Yuue8hV]X}V~YYjUd,,] ^ 8];þ8]V~=8]Yuuehh V,] X.}V1~YYj$0Ud,] ^ ];?þ]V7~=]Yu3EhXM؉]]]:EEPω]]4E]r:M@EԉME=rEPEP2EYYMPQzYY]hVQ|VT}YYMUM VhjXiu?M hXQuhuPff3^]jGUX~5]u2j \yYuetu uO`X35]}j<>U<~=\]u6V%Pvj_3ۉ}M؉]]$X8E؉]PEPVPEGM6MEr:M@EME=rEPEP1EYYMPQxMYYV]}]fVVV,V:V\]|j$iUC}d,] ^ ];|þ]V{=]Yu3EhXM؉]]]7EEPω]] 2E]r:M@EԉME=rEPEP0EYYMPQwYY]hVyVzYYMUjh:UdPV2]3PEdue~YrPuvQbMd Y^jU7|uOev薖jhXk]hC]jvu qP,VJ2D{jU{uOev6jhj]hC]jv`u qP,VfJ2zjĕUw{uOev֕jhk]hC]jvu qP,VJ2zjߕU{uOevvjh(k]hC]jv蠹u qP,V&J2$zjUzuOevjhk]hC]jv@u qP,VJ2yj0%U zuPN g~uoO3QMȉ]ȉ]wZΉ]iPYY/EPM;+EEPVYM؊v2MԅthM̅th29yUu'Y]UuY]UuIY]UuY]UukY]jZUx3Whk]h?]WuutYjM P)oVM#eE3P譊NP,VVMM耍SXMP0`o-WMڌM3BQpRU,V֍M?xU SVW'v'tG&u ~ u5Y΋AEt EPWEP>EMMH E `_^[jqUw39^ tJ9]uE~$]WM]VXN EPF]P襵M؋Mtfu&?t j~$tSu p,Vwj U,wu 蔑39O tv9MuqtmM_$MMSWO EePGPu5;t/eE0jXMQjVpE,V֍MxMtReK$tDE0jXM܄tMEQj MEQjVp,V֍M7xvj,rUxv]M؊Eu ]5<]eEEE0uԃeEVPEȋP輯PS?YYM̅teMEr6M@EЉME=rEPEP)EYYMPQpYYu USVWM_Ӌ7+;sG,v*G+;v u Q+ʍ4VSiYYw_^[]jUuu}?F+uE)PΉE.U؋Me+ʉ]PPYYVSv6 uuS)tuMugZ2jjj .UVug##^]Ujh:UdP2]3PEd2##Md YUV#y#t "^jMH^hG[EPҥ̋AHVtt'tu!A;Au;Q A39Au;u^2^SV3C~t=~t7u.V{u#9^t~ t{u zu2^[h1Us}+ u(1p,VP 3ۋ]ԉu؋ω]9XE.SWMQPMMta JË}3ۉ]E0jX]}E MԋMԉEMQPEP՟EtQu]]tFEuEEPME0jX]jMtcaTauԃ 9]܉]E 9PMĉ]ĉ]REEPEVP褶Mȃ taM]̉]ЅtAME܉ẺMЍEEPME0jX]ćMЅt`Mt`MtLMt`E0jX]EE PM誅ME8s} u6M詁Et%p,VM֋}P qMM]ruWuYYtW}pj tpEE }H+MMQ蝀87u;tR]SF(Pu EPE Vt!mMQ跄MME =ru;u3ۋMEPu]}tP-ptrM؅t5_]WSYYjtptE 辂}C+E؍EPu虂jYG+Pr70SVu EPMEPE oME Eq;u̍EEPu؋MtP^_] Uu uE]US]Vu W}t{u _^[] jWVhSjh$VuShXWV_^[] ~4fDL0 t uH0_^[] t .uD0_^[] ̸XU2]3ʼnEW}EPxVUMo X^Wf/MVE3P|VuFw:EP|VtUM1oYEn^W_M3de]j4hXh Xig G^_M31e]j,hXhX6gM G3_d]̸ȣXUM y%=uɁ nd)J$)JE@@أX]ËE)@@أX]ËE@@أX]ËE@@أX]ËE@@أX]ËE(@@أX]ËE'@@أX]ËE@@أX]ËE @@أX]ËE@@أX]Á'Kt3YL*J$<*JEi@@أX]ËE@@أX]Áa .t8-E @@أX]Ád E@@أX]ËE@@أX]Í8*J$`*JE @@أX]ËEd@@أX]ËEe@@أX]ËEf@@أX]ËEg@@أX]ËE @@أX]ËEj@@أX]ËEk@@أX]ËEl@@أX]ËEm@@أX]ËE@@أX]ËEn@@أX]ËEp@@أX]ËE@@أX]ËEq@@أX]ËE@@أX]ËEs@@أX]ËE&@@أX]ËEt@@أX]ËEu@@أX]ËEv@@أX]ËEw@@أX]ËE{@@أX]ËE~@@أX]ËE@@أX]ËE@@أX]ËE@@أX]ËE@@أX]ËE@@أX]ËE@@أX]hȣXQM{E]f$J%Jm%J'Js&J'JW%J$JA%J&J%J+%J$J$J'J*&J$J)J          %Js&J%J)Jf&Js&JO'J'J'J(J{'J&J(J9'J'J(JW(J(J(J&J&J&J'J+(J(J&J#'JA(J'Jm(J(J 'J'Je'J)J Ujh UdPT2]3ʼnEVWPEdu E}jjPhVjh}uEpVuEVhXEj&P3MGGQAu+ʍEQP1uujjjjjVjjEБVEuuWjPMJs}EjCEjuEPjujjБVȅuuWUI~@DECE| tECE| uIECE|.uIE;wMECE +jQMToEGGE~EfGEEMVLVNjMd Y_^M35\]U02]3ʼnEE VuPhXEԉuj&P腐MFFQAu+ʍEQP3M3^[]UjhXUdP SVW2]3PEdeك{(]CVEEЋʍqAu+QRK{(tjhX~XK {Ms Qp,Vփ}EuCEԍKPEUr(MBrI#+wURQoV{,CrMd Y_^[]ËEV@Eȸ.JMËEMd Y_^[]褹j DUZuuZNEeQQԉEP,FM FHFHF@ F@ uSV@t E0@LtJE]PEPhX7MW6Mp`&VuuMA_^[;Ujh:UdPV2]3PEdFtHjFt j@PSYYMd Y^UQSًMyt_V3W>};t2GjPJt;3tF ;G sM}M;u;tMFPYM (VM_^[ UEVxr0yrpVu qR^]UQQuEPgu (UQVWu}wUM FBFGGHGHG@ G@ _^ jU_Wu&fVYu eu"VjY@@f@ jBU Wu EuP9}ܥ}tE>{ t=u M3Sp`}t juQYYVuu nVUjh:UdPV2]3PEdpuj6QYYMd Y^Ujh:UdPVW2]3PEdu vuƋ6jPPQYY~ tߋMd Y_^U VuEPuuEu^USVu щUW~ t+Bx uB]@;EJ@];;2u;~}iE0@@;~}5Mul9z}=BH E@t0@~pMuz uH;z|CMESPMuS]S tFF3EEFFFH E@u 녋E@0`_^[ U USVپWK+M;reC<VPWENQ{}M Esuur3VPGPVYYSPE_^[ h U USVپWK+M;rnC<VPWEJ NQ u{M u}Esur3VPc}PVYYSPJE_^[ U USVپWK+M;rnC<VPWE NQ u{M u}Esur3VP}PVVYYSPE_^[> j$%;U S}?` eMWEE eUt}E؍MCECMVPQm' MEr:M@EԉME=rEPEPiEYYMPQMMYYeEEtS` QUSVuW VS;u u_^[]jUQuEefjEFYQjUQu73XΈ^H^=>^Lt]F@x]FDƉ^8>Qj/UhQ}3ۉ]9]t`WGpXX]ESSwV6E@XHAD9RjXuE΋E Pu|&uSjHXjZ9Y8E A P>PUjh;UdP2]3PEdyt jqKYYMd YQUjh;UdPV2]3PEd~LXt#~Htw`9Md Y^UQV;utEuue#^UEV;txrpQ ^]UQыx t@Ly t9Hy u&VWSىM;1u IÀy t[_^x u ȋAx t j-D>Oj-YYQCj$ÚUC3F=l]l]Ee3efE؍EPr}YtZXMWfhXMY}t9WMJh(XM=}ECEP ^ l]EΉ l]MEr8M؍EEԉMЉu=rEPEPEYYMPQ=YY95l]YBU SWltIE3PhSh8XhVu)E]PSEXPSWu8VtuV2_[Ã}uVuSuGN~r6EPVSSWu8V^uuVh UA3EhcVM؉]]E؉]PYtwh8XEPEPhXPEEPME`}EjCEj@jP@9MMEr6M@EME=rEPEP EYYMPQ*<YY@j$ÚUAuM3E3fEh8X]T3]G9]tU9^tP}MQhE؉]CESPhVu(~r6SSSSVuVuԃEVMEr8M؍EEԉMЉ}=rEPEP2EYYMPQP;YY?U SE3PhSh8Xh]Vu5E]PEEPSShXuVu9]uV[j(U?~3EhXM؉]]>]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEPEYYMPQ9YY2>j@8U>[,Jj^3ۉuԿX]WM]IE]P؋EYۃMÃr:M@EME=rEPEP8EYYMPQV9MYY3ۉuWM؉]]E9]tbE]PhSh8XhVCuC}MQM]QjEECEjPuVu9EuV3CMEr6M@EME=rEPEPeEYYMPQ8YY2 =j(UT= t3EhXM؉]]]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEP\EYYMPQz7YY2<j(UO<t3EhtXM؉]]]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEPWEYYMPQu6YY2;j(UJ;t3EhDXM؉]]]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEPREYYMPQp5YY29j(UE:t3EhXM؉]]]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEPMEYYMPQk4YY28j(U@9t3EhXM؉]]]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEPHEYYMPQf3YY27j(U;8t3EhXM؉]]]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEPCEYYMPQa2YY26j(U67t3EhXM؉]]]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEP>EYYMPQ\1YY25j(U16t3EhXM؉]]]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEP9EYYMPQW0YY24j(U,5{3Eh0XM؉]]}]tcE3PhVh8XhuVu@}MQMEQVEECEVPuVu9uuVMEr6M@EЉME=rEPEP.EYYMPQL/YY3j(U4ket3EhxXM؉]]]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEPEYYMPQ<.YY22jDmU3fu eXWGj^3ۉuԿ\X]WM]tE]PYMMEr?AMEME=rEPEP`EYYMPQ~-MEYYWM؉]u]}Et]E]PhSh8XhVu<}MQM]QSEECESPuVu9EuVMEr6M@EME=rEPEPEYYMPQ,YY291jDmU1HXGj^3ۉuԿX]WM]E]P1YMMEr?AMEME=rEPEPEYYMPQ,MEYYWM؉]u]}Et]E]PhSh8XhVu<}MQM]QSEECESPuVu9EuVMEr6M@EME=rEPEPEYYMPQ8+YY2/j(U 0^Xt3EhXXM؉]]r]9]t]Eԉ]PhSh8XhVu<}MQMЉ]QSEECESPuVu9EuVMEr6M@EЉME=rEPEPEYYMPQ/*YY2.jDmU.TeXNGj^3ۉuԿȨX]WM]kE]PYMMEr?AMEME=rEPEPWEYYMPQu)MEYYWM؉]u]}Et]E]PhSh8XhVu<}MQM]QSEECESPuVu9EuVMEr6M@EME=rEPEPEYYMPQ(YY20-U } SV3WFH^=I}t9E]PE]PE]PWtEF FEFF EF,F0~Lt]F@x]_^8FD^[UVW}tf8 Ή~8_^]UQVEuu(^Wy A<9uQPVqT+AA,0^_Ujh:UdPV2]3PEduejVQQf 3FfMd Y^UQVMFV+;w.~S W^r>Qu WP5 3f__[u EQuQ^j-Uu+FV+‹M ;w1~ ^r>e PuWPU 3f_QuEuQ*U) Puu ui! ]j-~]j}$YȉMt33@$XAAY ωƉN(j,U()u 3ۉ]舌uYU]؋ID1$|1 ;|;v;| ;v+WfEЋEԋ}VMȉ}E}]u j_MЋ@t00EEPYMЉEEIL1@tIM;|B;v<HD1@L18PUfȸf;u j_׉UM}Mj_ӋE˅;|f;v`E EԋEuԋp0,VM֋uPHL18/UUȸf;EMD׃UEE M뎋EM;|,;v&HD1@L18PTUfȸf;u ׋@\0 \0$KEMEM뭋Mj_jP3ɋB 9J8E WbJËU3ۋuj_]SH39Y8E y WMnP&j śU&]3u }fMYȋM@t D$;|;v;| ;v+WfE܋EuSMԉEy }Eu j^ EAD%@t>E;|5;v/HD@L8PSfȸf;toEENj IWuu L8S;EuG;uCE;|5;v/HD@L8P6Sfȸf;tEEj^j^֋@| |$6Mj^jP3ɋB 9J8E VtdJË]3j^EWH39y8E q VM$Uu MjLMP@E]jx-Y@@f@ USVWu EP u }˥uV t E0@?{ t=u M3SMp`p VuuWMA_^[USVWu EP u }˥uV t E0@?{]tt=u M3S}Mp`@VuuMA_^[USVWNV  uA9FwjNAV ~N#YF N#؃<uj豶YNN EF_^[]jUt#uE+j Y؋F+E=UUU@P$"u܋Mu$?uMu2FjjSUjh:UdPV2]3PEdpuhjx67YYMd Y^Ujh:UdPV2]3PEdpuMj6YYMd Y^UVu WvuVu6@YY~ t_^]UVu WvuVu6TYY~ t_^]Ujh:UdPV2]3PEdu N jxV>YYMd Y^Ujh:UdPV2]3PEdu N~jVYYMd Y^UQQu EPwEMMHUQQSVWuٍMG7C3OG_KM^[t`j U6 jM5]^euMPuCt;uEPl=YYt8}}WE5Yp,V։=]M}h UVufxVF1^]j.U~uueNXM\#jQUK}W躰w3VEuFpYYjUue}tXFXeEu u@XHAD1HF jʜU}33CE9EtXGPXE]PPwV[Ή]@XPBD:E PuQ j-j\YuEtQEPSOTEM}}h|VMFME Q;Ft 軺F PdxVE MЉ];hVMEźFME Q;Ft qF PME ]GF@D0XFHAD1^Vq4XtjVGYY^V`XV9^Ujh;UdPV2]3PEd~TXt v 藞Yv莞Y~XMd Y^Ujh:UdPV2]3PEd19&jPYYMd Y^VNP ND^Ujh+ǃr?p ,VEuExVEMȉ}2}MEtDEQ8pL,V֍MEQ MEExVEhXrEEPME}跷EubEP詸32xE rPM%EE PEP YY0ME MzME }Rh$XM۪EE PQME} EMȅuFEQ8pL,V֍MEQMEExVڶEh4XyhEjPEЋO P,VW }E ExVt}tuj uF uE8,VׄtFux,Vׄt.ux<,Vׅxux<,V׋hXMEE PEPYYMEExV@uMQEx,V׋8SjEpX,V֍ME}EQP`jpP,V֍MMEExVM覝EEtHyGp,VO֋EEtHyGp,VO֍MRS]W^=]Yh`XE Ah`VWEYYjEjPEċO P,VW }E ExVt}tuj u8 uE8,Vׄtzux ,Vׄtbux8,V<uJME ExVhMMEE tHyGp,VOE3xVE}ЉEԈEء]0]E;e=0]}Et(Muȃ=0]50]C50]V uEPEEP>EjPEċO P,VW }EExVt}tulj u uE8,Vׄt;ux,Vׄt#ux<,Vׅu E3]0];3ExV]Ȉ]90]t(Muȃ=0]50]C50]V uEPEEP>ESPEċO P,VW }EExVt}tumj u uE8,VׄtTux ,Vׄt|SPEO P,VW xVEu9]t8]tu'j u MHX|E|MEEtHyGp,VO֋EEtHyGp,VO֍M藔j@أUeMhcVEd,0] ^ ];(eeuMQEx4,V׋8MQEpX,V֍MEuMQx4,V׋8MQEpP,V֍ME 迓e=0]ExVEt(M诙uЃ=0]50]C0]S uEPEE P>E3SPO EP,VW E ExV9]t8]tu7j u uE 8,Vׄux ,V׋utx8,V׈ESx ,Vׄt@uMQExL,VPME XMEExV蟙E hXM)EEPEPYYMEExVhuMQEx,V׋8uESpT,V֍MEuMQx,V׋8MQjEp`,V֍MEё}EQPFSpP,V֍M訑xVEM]觘M茑EEtHyGp,VO֋EEtHyGp,VO֍ME]DM)*]V5=]YhXEhVVYYjCU ًKEE;sxEQ̉eP%QEeEPoQEeEPQE eEPQEe܋EPٌQE V蘌Ep,V֍MEs;CiMM MMMUMM ؏MЏMȏM]jTU hTX蹗ʬs<辘 %肃eMj^hhXuE荥3uhXM؉EEErE读t 2@jYEEtjst$Vv63F+j Yk P6wkE MFkE F^] UQu u ]U2]3ʼnEAWPEfEPuEP"M UEыM3͊U AWPEfEPjEPEP_MHfjU M ]Ã<QN@輚E ePuEWM 9F8ÃEuF 8F8F,u6FV8E+щ8F }F0tF 8F F,8f8^<, Ut.Vv6qF+j Yk P6q3FF^j֥UheEPE(P豸MUE=UUUwk PpY]jUA+‹M;v  ]~jXU'3EEEEPpYEuMQEx4,V׋ME;tnHEP艐PEEhXP躷hXPEEPoPKE蟖M_MWMEKME;EuEPFsM VW7vW膺v6vg_^UkE PuLpYY]UAPuu u=] UAPu fEYY]U]USVu;u tW}uPgG;u u_^[]USW} ;}t&V Puq,Vքu;}u^_[] USW} ;}t&V Puq,Vքt;}u^_[] UAPuRYY]UVu;u tWyWP'fYY;u u_^]UAPubYY]UVu;u tWyWP7fYY;u u_^]U]lUSVu;u tW}PGFf;u u_^[] jFU@|08t~]j}9YȉMt33@XAAY ωƉNUjh;UdPQ2]3PEdjuEEPE Md YjUuE+j8Y؋F+E=$I@P>PΉE@u ek8}ߋˍC8E܉EFV]W9Eu P66 u6^}C8VPvuHE@uPW}u܋MuuMu> jj'j TUu]}uu]eW<88u;} uSVV2 ;UVuF;Ft F8P^]jDUp}] jBEYtX3PMeCMSEPWPEzM:MtjkU}33CE9EtXGhXXE]PPwVΉ]@XPBD:y1UQVuyXFX^UQVuuDX^UQVuuDX^UQVEEPfXYN^UQVu]@XF\X^jUuEN3$Xj]f^ ^Fu EYY"jsUUJ}uVj3ɉOOFGFGMNNF EPO jsUUuu3~~Vu N}9y苪uN E VFN@D0XFPBD2yF@D0pXFHAD1^Ujht$Vv6*F+j8Yk8P6XkE 8MFkE8F^] UQu u<* ]jUjp Yu3EtjpPV UVWp,Vuuu uuV#_^]UkE 8PuWYY]3@hUE}e] lEhE`EdSYPq@,VSYPq<,VHAHppQp0,V֋SpD,V֋lp(,V֋hp4,V֋dp8,V֋`p,,V֋pP,V֋px,V֋,Vh`XMbEEPth[t%h`XMbEEPMh[EP2VW,V_^UVu N,;u u^]UQ}MtXAA XAX@DXAX@DXaUQ}Mt,XAA XAX@DXAX@DXaUjh;UdP2]3PEdexVlMd YUjh֨UdPVW2]3PEdNexV9@lN E9/lE>lMd Y_^jU.d,$] ^ X];ϿþX]Vܾ=X]YuevhVjVmYYV>t.Vv6!F+j,Yk,P6S3FF^VWSw(PF PFPWl,;w,u_^j$UZd,3ۋ ^] ];uW^^tþ ]V= ]YuhXω]]]]yhViMVhYYjGUeEQP_#QEP_KMOcPjGUxe3PQEP_dMcj`UqE3P]}YxVEPM}]]0jEEPM7]fE]uEt8]tV覔j V! MEvEP^YPME}]]iEEPM\uE t}tVHj Vø ME gvj}YȉMt3j؋}QST^MQMQp,V־xVE MuhMEuhMaּj֥UE 3juX EYȉMt3j7}QV]uSp,V֍MPaQjAUyuuTNEeQQԉEP,FM FHFHF@ F@ UQVEuuuPE P^ jBU}E3ۋP__Iqw]Vu^OY肻UEPuu j u]US] EVWSPuSV>t E0@LUUUtJE]PEPh4X7MWMp`VuuJqMA_^[rsjǩU}hw3VEuFY衺jU˺u3F,X]ENu`XFlXFE EF ^YYo^Uj2_0u;t8uN(S;F(uM[u;3uN(Pl`~,uVReֳj-Et hVQYY^]UVEt j V$YY^]UEVXt jVYY^]UVEt jpVĤYY^]UVEt jlV蔤YY^]3ҍA$B3ҍABUQIhEPEfUVE:M3jA,XAq `XAlXQXA(Q$QA@Qt hVMXEPEPEPMEQPEPZM;t ]uPUMxVMpVEEr7M@EME=rEPEPbQEYYMPQ耘YYEKESP Ct~hcVM؉]E]W7ESPjEPEEP,VEr3M@EME=rEPEPPEYYMPQYYMcAEԈ]r3M@EME=rEPEPPEYYMPQ詗YYMRU3UQVu u~]j}–YȉMt33@XAAY ωƉNCjIU֛uF]++=?@PEOPΉE$Uu e}؍CˉE܉E^uMEPE)Mt;Mj$IUad, ^ ]; ]þ]Vݒ=]Yu3EhXM؉]]]NEEjPH]E]YYr7M@EԉME=rEPEPGEYYMPQÎYYV Y]hU蓓|]˃ejhMEux>3EdhdP&YdhEeMhxXEE/MEEPpPdLh|YYMPQ詅YYeEEtYEԃ]r|YYMPQKYYeEEEtHEr=M@|ME$;r|PEP=|YYMPQYYE}eMhXEE^DpE@E%Pp]en;eMXEVEDeM؁ˀE&V]EECEE'PxPd]p0EPE(PV(PREYYtEt\E]rpEE7Pp]Jh;eMXEVE=eM؁E8V]EE=EE9PxPd]p0EPE(PV(P7EYYtEt\E]rtVv6MF+P6ME FEF^] UQu u ]UEVu WP;r#M+;BʃxrQƋP(;_^] {9UE9Avyr ]\9VVv6 F^UVuVVF P|VFPsVF$PjVF0PaVFEMPuMQEE8,Vj[8uEt M!t M!etM!}tVEMP8uMQE8,V׋8u Ep,V֍Mw!Mo!Mg!h|UQSVuW;r7Exr8] +;Bڃyr p1WSPOc_^[] 5jU<|jhJwYu3EtjhPV {hU-|}]Eu x]EEEEh ]EEVt#hjljPDžX|3 hEExVEE~ErPMlqPEP:YYuB#}EExVt"8EtuQj ufv eEE,DžlxVp3tE90uEEE,PEP>YY3}EEKPV :H6VE#Eԃr3M@EME=rEPEPf.EYYMPQuYYeEE}EExVt#}tuPj uJu eEE #Eԃr3M@EME =rEPEP-EYYMPQtYYeEE}E ExVt#}tuDPj ut eEE DhXltY|Et'juGuuuQPsEPE3PME#E/PEDž7|Qĉe uPEEPQV_ QE8,V׈EtMEPrw3E0jXhXM]褐hXME]E]3MQMEQx@,V׋Er3M@EME=rEPEP,EYYMPQ"sYYM]E]y]#MeEԃr3M@EME#=rEPEP+EYYMPQrYYeEE}E%ExVt#}tuMj utr eEE&hDžXu P.Yvt"MQx0,VjY8u3CjY2tM.E0jXM3hX]hXME]E]Z1MQMEQx@,V׋EsM@EME=QEPEP@*EYYM73hX]_hXME]E]0MQMEQx@,V׋Er3M@EME=rEPEP)EYYMPQpYYM]E]E\w}]EPM Eԃr3M@EME=rEPEP5)EYYMPQSpYYeEE}E ExVt#}tuKj up eEE!UVW} WvGP`N [EF8_^]UQA;At#Vu90t;Au^;At PEPIUjh:UdPQV2]3PEdue~YruPuu vQMd Y^Ujh:UdPQV2]3PEdue~YruPuu vQ$Md Y^j U|sM3҉UEq3CU;qEP8]t>EPM ]]1Ex,V׋]EuEtM]tbetM؃]ta}uE;pa 6MEsrjFUr3}uΉ} ]}G}9tF<;6j[DÉ?;DÉFx+:DÉF|&<DÉ=DÉ6DÉBDÉ4Dlj7DÉBDzq̋A+A̡@ZjPEur9M@EME?=rEPEPEYYMPQ^YYuhdXM؉]E]0EE@PWEur9M@EMEA=rEPEP#EYYMPQA^YYuhxXM؉]E]EEBPEur9M@EMEC=rEPEPEYYMPQ]YYuhXM]E]PEEDPwEԉur6M@EMEE=rEPEPCEYYMPQa]YYajj@GU\hXMeEPM8vhxN[EPUVuNTpE N uF8EF<;p^]hU\u<3Dž8XjlSP]詋 ]xV]}̉]Ј]C~]r6VMQ8PEPmYYu2H}EEhVMEEEPM=ME} t2l}E3EE 9puEEElPEPYYE Rx0EVPYYu ;u2ۋEr3M@EȉME=rEPEPEYYMPQUYYeEExV}E}t#}tu1j uU eE}EDž8Xu KËu3E3SjHX9Y8E A EP 9M4JjUkKu܋]+EF+=@PEPEHeEYM V}W 8;^uv6S6E@VPvSuuWE=JuMujj|UVuE PFPVk +^]UVuE PFPVN +^]UVuE PFPV1 +^]UMVu +E PQu E^]UQEuuu uj4ѷUI}EuEȊE EĄtً:ٍFEBueMjVEEPeEE233ۈE׉UЅMUЊ;t':tC;uECE؀<tECE؋E]̊;:tXtTuċM2u&U8Bu 'UȊB8;u MEEG}U؋ECUjY9MBȋEE̍U؃jCUY9MBȋEЉE MU@E;*Eׄt%uċ*2uMER&MMMr8AM؉EĉME=rEPEPEYYMPQ+;s'v(F+;v u RV+Rv F_^]jUHu}w{F+uE{PEU؋Me+V]QPmVSv6=uuS\FuMu92jjxUVuu Vu$+u u^]UMVu VQYY^]UQ;Qt EA uR]j UFjM5]]eu9MPd9uCt;uEPYYt8}}WEYp,V։=]ME3j'UFى]#{uKE uC@LKC"u3K EAA7sEYzEUSVWX u{Ív_^[]jiUyE}33CE9Et,XG`XXE]PPwV+Ή]@(XPBD:E PuD jUEu3ۍ~P]9] tXF`XX]ESSSWE΃EPXSS@ED0PXHAD1LNP@ȉq82IDjUqDu*}߃eXru (1YPwSl"CjU%DuE*E3XF8MN>jbUL>E̍E 3PyyEPuEt#9}tQEPMWxP,V׍MMM =hU=u jju]u e0 EP8E.EEԋ΍EPEPEP葂MX (,=U}tM]j8ur8YY]jlȹUQ=Eu3ۃxSjE]Pxjx0,V9]hcVM؉]E]j_E؉]PE}PEPMuEPENh谂M&MEr6M@EME=rEPEPcEYYMPQ7YY~ <hU<u]]F3+Fe}thjjE P@cMMQE@ECF<p$,V;Et,u}G}F+F;r#M J;MEI QUQVWEuEPvv1M+~G_^A$+IX+IXVjF#jRjf ^j&U:uMu eEPEM06M^_:jQU|:3E GKP}[{C+Cuu x$,VPMM 9j|U :QE EP>wVʋ+;wxPEP V+uGMqM ij9UMPM HM@M8]jd)U9euEtx ,V׋uEuEtMQxd,V3ECMjE[PM؉]Yu[E0KKEu܍E ]PE]PEP EPȃEQPYYjtF+P6YYME FEF^] j8ɻU3}3ۉ]tG9uCj.Yu!]tM B!PM'C8Xf37tMp'jX3hU`3}]u MGU%0]uMU=0uRWQSVuw0MeEP}MYM|EPq,V|w03E@EEMEE)EEP YMEaEPhXhpXq,V֋}WSYYtD{u C:EuE+ˍp( {u C:EuE-׋uE2Ƀee0tF8ʚ;EMj$YDʉu}xCEE<5-}uE|EeMjjEE'8uE3SYY{u7CEEuPYY sVM3BU9x EtUutpXFAuM}ECEȀ<8tQ}ECE8AU܍EȋMȃC<8tL}tF{u U܋MȊC:Eu+jMGuSYY)U܋MȅtEC<8~WGU܋MȋEtKE<tBt]EȃC:8]u%u]EȃC:]|E@8~EEEr6BMEE=rEPEPEYYMPQ+YYE}WS2YY{u|[:]ˋFu WSYYt{uKCEEuP/YY sEM9x EtEut pXFAME WSuYYuu.]E8ʚ;}WSDYYt7u{u C:EuEN WSYYu҉uuEyh0F@E^{ug CEEuPKYY sEM;x}pXFA3M@MjXEȉMˈE6 WSYYu}tD~;tt07:t9u0tO;u t;uE1}E@WS/YY,{u C:Et{u C:EeF u3ES}YYt:{uE C:Eu+{u + C:Eu -F8 uSYYt?}{u C:Eu3@E WS_YYuр}}t0FuSCYYtD{u CEEuPYY s} pXFG3@E 뭊E}uuuMdEB,hLU,}ME ]tEw0EExleEPMYMpEPq,Vpw0MEyEEP#YMEEPhXhXq,V֋}tWSEYYt@{uf C:Eu+{u J C:Eu-ˍpS 3f0xWESuEEYYt`{u C:EuK WSoYYt3{u C:Et{u C:Eu Elj$X9ʚ;Dƒ}|ECEE<D<}uEpEeMjjEE1uE3SYY{u CEEuPYYsMME9|EutXFAuM}ECE<8tQ}ECE8AU̍EMC<8tL}tF{u ŰMC:Eu+jMsGuSYY2ŰMtEC<8~]GŰMEtQE<tHt]EC:8xu(u]EC:x|E@8~EEEr5BMUErEPEPUYYMRQ#YYE}}t }u0FuWSYY{ukp[\:xˋFuY~WSYYt{uCEEuPYYs=M9|Eut XFAMEWSOYYuu#x}WS*YYt7u{uC:EuENWSYYu҉uuEyS0F@EI{uMCEEuPYYs0M;|} XFAME1WSYYuE;WStYY'{uC:Et{u C:EpFeWSE"YYt:{uC:Eu+{u sC:Eu -FWSYYt7{uFC:EuESWSYYuӀ}t0FWSYYtN{uC|E|PYYs"M} XFAME륊E}uutlEM3%jlU%E ]EEEEPE!EYPq,Vփe}uE EuEYPhXhXq,VuuSuYYt?{uC:Eu+{u C:Eu-FˉEujXj _}uuj^#u2SEEEYY{u]C:EusˈEEfuSYYtJ{u*C:Et{u C:Eu tuj2^EEjYjYu jYt;t j;XDEueMjEEz*E3uESEYY{uCEEuP+YY;EsH}XEu0t ;Es@EE}EECE<8tQ}ECE8AUЍEMC<8tL}tF{u UЋMC:Eu+jMGuSQYY7UЋMtEC<8~G 2 UЋME}]C]tOt<;t7tEC:8Uu.uEC:U|{~C}Eu 0@E3ۈ]r2BMEE=rEPEP6EYYMPQTYYM]E]!VtLt2&F^j;U!} ]Ã<tyWEeWuPoFM9F8ÃEuF FF,8u3FV8}E+у}8F F0tF 8F F,8f8^<  VtNtF&FF^UQQVW觀u u7'EZE}U7_^t,fnED$V$9ZMUQQVWDu u7'Y}EYY7_]^t5fnE[ZD$V$Y]EM]EjFUQVW3uX~~ ~~N ~~ tcN~~tQ_^jU%}uV]eFDPODq Ujh;UdP2]3PEdyt jxq YYMd YUjh:UdPV2]3PEdFtH>Ft jxPYYMd Y^VND!^UES;t6VWxp,,V֋uKCFP'FPK'_^[]UVWup,V_^]UVWup,Vօ_^]UVWup,Vօ_^]UVW}Wu WqtGDPNDu2_^]h/U ًEMu }P[eMVEEP8WME!8EP0PK8MMS  UQjEYt 43jxrU wTyGDE@ ME_[FGTu!GPGPG~]j}JYȉMt33@dXAAY ωƉNUVuj HPQwN^]UQQSVWuٍMd7C3OG_KM^[tj0rUu ]uЃEPhXwZYYP7P:Mă p Q,VM֍M3QȉuAPhXwEYYP7P MݽMM}0X XEPh@XwYYPP }ujh]hv]VCpVhLXwYYnPi$\XwlYYhXw[PC G@UEVXt jVSYY^]UEVXt j V#YY^]U2]3ʼnES]VWj]AEEPUgj Y}EPhXEjPP@cECPLM_^3[h!U}3h{ u PPiiVjYjZ;hDʉt"Yxet$S ˆS $1]QYIp3pMM؃ehcVEE蕽xEPxEPtP|Gj_lh|QEp,Vp֍|MErLM@txE=r!tPxP(tYYxPQ@MYYj Yx}tUeMhXE0jXEEPDDžhhj_PElh3pPEltDl/lMtMdž{p,Vpxq,Vj YȍCttXAY3ɋQp ,Vj YȉttCXAY3ɋQp,V֋{xp,VքtC kp\Qp ,V֍ME QiPCE hXP8YYP2P MM\xj0,Vh@V{jp,Vj$%;UeMhXEEseEPޑMEYr6M@EԉME=rEPEPiEYYMPQYYU2]3ʼnESV~]j}YȉMt33@tXAAY ωƉNjނU8]3>~]j}4YȉMt33@`XAAY ωƉNjނU]3>~]j}YȉMt33@LXAAY ωƉNZjނU]3>~]j}~YȉMt33@PXAAY ωƉNjނU']3>~]j}#YȉMt33@XAAY ωƉNjނU]3>~]j}YȉMt33@XAAY ωƉNIjނUq]3>~]j}mYȉMt33@XAAY ωƉNjނU]3>~]j}YȉMt33@8XAAY ωƉNjނU]3>~]j}YȉMt33@XAAY ωƉN8jނU`]3>~]j}\YȉMt33@XAAY ωƉNjނU]3>~]j}YȉMt33@XAAY ωƉNjނU]3>~]j}YȉMt33@XAAY ωƉN'jނUO]3>~]j}KYȉMt33@XAAY ωƉNjނU]3>~]j}YȉMt33@XAAY ωƉNqjނU]3>~]j}YȉMt33@XAAY ωƉNjނU>]3>~]j}:YȉMt33@~]j}YȉMt33@$XAAY ωƉN`jނU]3>~]j}YȉMt33@XAAY ωƉNjނU-]3>~]j})YȉMt33@XAAY ωƉNjނU]3>~]j}YȉMt33@XAAY ωƉNOjނUw]3>~]j}sYȉMt33@(XAAY ωƉNjނU]3>~]j}YȉMt33@XAAY ωƉNjQU]3>~]j}YȉMt33@XAAY ωƉN>jyUfj$tYE3ɉMtM uMMQȋuMQFKUE eEEjYEEPuMMYYUE3ɃeAEEEE EEEEPuMMYYUEeEEEE EEEEPuEEYYjPU u]ejjYtUE4] 3jZRjQp0494蘑@E@4Px GVh$|]h{]Vup,VOPW@E@hrΉ8,VO֍QMQEp,V֋8EjPj7EPjMoE]܃eMhxXEEPjE܋PMMĉ}jM"eMhXE]@EE PjE܋PMMĉ}jMվeMhXE ]EE PjE܋PMbMĉ}WjM舾eMhXE ]EE PjE܋PMMĉ} jM;eMhXE]YEEPjE܋P7MȿMĉ}轿eMhX]FhE]3AEMEEPQEċP`MmMĉ}beMhX]FhMăe|PE]EEPjE܋PhMM e]EeMhHXE]WEEPjEċP{MƾM܉}軾jMeMhXE] EEPjEċP\MyM܉}njM蟼eMhXE]EEPjEPpM,M$ j4oU`u]uԉ]ԍEEPm{YeMPEExVEhEEPxÃ}Et}tu膒j u MEttOQEeċP\uԍEEQ̉eP\QE eEP\VE+E &M `M`M`j,UPu]uԉ]ԍEEP]zYeMPEExVEgEEPwÃ}Et}tuvj u MEstEPuԍEPE PV.; &M 1_M)_M!_5jUHd, ^ ]; ]þ]V=]YuehpV荷V萸YYUUVNBPF,^]jU.uE+j,Y؋F+E=]t@PPΉEM ek,}ߍC,E܉EAPK,FV]W9Eu P6j u6^}C,VPvuHE@uPWDոu܋MuwuMu,jjGrj +UҸuE}uuEe;} tWM,;} uEuPVV WUA;At]uP]jYUcu%3EF(F,F0EjU%}uVKWeF PO FEOPM(W趷jU޷}3xV__uw ]ΉuVfF ^u OEMVEETjU|u3xVFFuN ESu NEM}VEUQ3҉MxVQQA QQAQ Q$UQVuWV}(VF G F G FG_^qq10 UVuWV(]F PO FPO]_^]UVuWV\F G F G FG_^]jUVd, ^ ]; ]þ]V=]YuEehV ]蓳V薴YYUA+j,Y]t+;w;EsE]UV>t$Vv6F+j,Yk,P6IkE ,MFkE,F^] UQu u ]UE=]twk,PHY]mj4UuEPN ieM=p1]\1]5l1]C\1]PoEPNh}EuCE؍MPEeoMEmEP`Mm蠴UkE ,PuIYY]hzU蜴XMWSeMhVSEEPEP\zxVEM]&`ME]`\EPMEEEPN(MEkWMvSh|VMEeSEE PEPMPME EEE PN(2MM E ]܍Mv_ME ]g_\JjxU訳EPrY3ExVPM]]]j_EEPMqRfE]uEt8]tVj V[ MEkEPqYPMEExV]]_EEPMRuE t}tV~j V ME kEPEP| PE |xVE M]=^ME]+^.jUCE`aPYMQuMQM QuM VMVMVEj;UjYE3ɉMtM uMMQ ȋuMQFPKjUEV&FKFE PF Y^]VWyjp,V_^Ujh:UdPV2]3PEdv eEYt jVRYYƋMd Y^UVW}0,V_^]UMtjz]j ^U謰́t8EEPEh KPePQ螂YYjU YYM'UVW}p,V_^]UVuW~,VN _^]j]KU]3>~]j} YȉMt33@,XAAY ωƉN药j]KU赯]3>~]j}豪YȉMt33@@XAAY ωƉN2jUZuEEPN XPE MFSjU}3ۉ]9] tGXLJXEXSOEGXGXGXGX@ED8XGHtD9E_OPGOSO,E_ _$_(TAO4EjXMGL`XGPlX_T_X_\_pGt_`_xRj/U}3XuwwjDE YEEt uVMEPOMt՜}SVWjGXGXGX@D8XGHtD9X9GtG_ tj0,V֋_$tj0,V֍OL賗OHՉO4蔕O,@OQGXLX_^[XtXVNttX^j _U̬E3ۋp ,VMփtHuiu O葞Zj 觧YE]t u [؃MMSOEPEuOu SM؅tY+IB̃8UVNPEXt j V+YY^]UVEdžXt hVYY^]UEVXt jVӦYY^]UEVtXt jV裦YY^]UVGEt j VtYY^]+I3ҍABA̋A+IA+IAjGU蚪yEeQPKp(,V֍M/O.j ULى]}EhAY}3EtjQE PUKEEPK}Gj YEEtsEQP KMWj EG Y]EtEpEQPJw$M:NM 2N3j ULى]}EtoC0EQE PkJwu ;s uDx,V׋MPItj8,V׋MEVPfMMM ~Mj "U蜨qyEQE PIu+;u2ۍM(MM MMMQEePIuE EQ̉ePmIQEEP]I>GE0,VOֳA+IAu#WltVj2,V^_2UVuhXfFjb^]UE`@]hUIGDjjp eTV*iGPTPYYu\g}D?E赦jJUݦjPYE3ɉMtM uMMQȋuMQ zFK_jrU艦jT藡YE3ɉMtuM uMMQȋuMQyFKUVM +MF+;v Q} Ru u;: F^] UQEVu u&N FKF^UQEVu u&N FKFgEFP^ jU营3GGE@E;t0+VV_G} OeWPuSxCGjU/uEN N 3ۃNFEhV]X^F^FEu N8EYYjXFP`XFTlX^X^\^`^tFx^d^|EEBj UjufENN 3udXFE F]YY3^@fF0FD^H VN貀^q f\UjhYUdPSVW2]3PEdX] t"hw |Vjw xVw Vtj0,V֋tj0,V֍N贋OP軍O8S\O K\LXMd Y_^[SW_dXtVj0,V^O0\O\_[ih$0Uً}7.Yu2hjPVhXP3DžfP^KeVPWQMrQEE=r!PPVYYPQ-YY轡jhU̡M}3Cp ,VփtJH+MAEEPu EhKPȃ ]QPsYYjRYYMBMWu I Xu ؍Eh KPVePQWsYYjYYMtޠUEVXt jV3YY^]UEVXXt jVYY^]UEVXXt jVӛYY^]UVvEt hV衛YY^]UV&Et jLVtYY^]UEVXt jVCYY^]jUhYȉMetuEju 03Mju辚EYt Xx3P衻EPO 自= hU荟u~uXv (jje8V6aEP@uEEPOTMW(CўUVutN SjPVYY^]UVutN 3jTVYY^]ÍAP̋AhU譞M utV]~uXv (jj)e8VI`EP@tEEP(NMW(VUMVqPqA P,VYY^]USWtVj0,V^E_[]jU蘝j覘3uYtE~~~ ~jL~Y]}t,jjEYt XpuPu Mω~dUQSVWjdjKtN+Q603YFYFWGVF_F^]Uj a>U6u~FEr6OMOMs ej[jX/؋σ;G؍CPUEEEPVWM EE胛UQQESكxt>VsPEPE;st*sW{ uE,VMӃ;u_^[jUW]{wSMH;wMW}e}uESX,VMӋ];uދEM;t up0}uEX,VMӃ;uMMS]SdUEPju hu]UE VfF9Et +EPugU^] jƔEuV&f"M3ǁxVEEuVEVYYuEDEDE3dž0jXE D E D3Ɉ8<@DH`jZdPxhlpt| uE&E3Ɉ $(,f048EMT[E EPMs(PEEPqEM+E PMJPEEPIME+}G@P6^@3Dž(Xjl,]SP蟶](EPV\ExVE]EEP|Y9`]EteEE\PEPAJYYVM؉]#tƇ}E"Dž(Xu ,PYM i*}UQ}щUtYBBXB|X@DXBlY@DYBHAƒbUEVPFY^]UE!A]jUou3҉VVMXUF ANFQAE9V t Qv uYY } tu hX? LËu]jFU|}uV'XOF 3҉G FGFPUQQ9UVu3NFFF R^]UVu& X^]UQVuuj X^j'Uƒu3FFFuE#cj'U苃u3FFFuEuuu P޶$YY YË Ãyt 1I qq1| QyQUjht 6V&N7Md Y^UVjҍF#ЋERP譹 ^]UjhCUdPSVW2]3PEdً}9;tDe;t34Y#Mt(?tF>u+FVYt VWP ËMd Y_^[UESVWtx80,V֋E;tG8p,VO8_^[]UESW{;xtEVp,V֋tj1,V֋Ex{p,V^_[]j٦UP}uMEPreMh|j$eUJ}EMP:eEP{M|j(UF}}WM3i]8]M@t80OdEEP9WYMufE6ZIψ]QQEA@$EEuQq8NuP,VMVÉ]8Ej^EƋ9Mj^jP3ɋB 9J8E Vju LË}3ۉ]j^SH39Y8E q ViM f{j-Uwًuex$,V9uuƃME2Dwj,UwكeEPMЋ0tif1u?u6̉ehcVaA1EU$EOE̋P8MQEp,VPERM/MEteKtE;tDxEQ̉ePQESEp,V֍ME;CtuM1vhUuvًExxrh@yXPFYYjj(ܕe$X;(XDP8h,XPVYYPVPo (X{DP8h@XPVYYPVPo (X{DP8hXXPVYYPVPmo (X{DP8hpXP\VYYPTVPYYMDMlBj@tUBكeMjBME`UMEQjxujx0,V׈E׍MEPj* Zujx4,VE0jXEEjME MQ?VMECujx4,VE0jXEEjME MQUMECujx4,VjYE0jXMEQMEX MQUME7Cujx4,VE0jXEEjME MQ]UMEBeMhHYEEMQMEQp@,V֋EEr3M@EЉME=rEPEPEYYMPQ;YYMkBMG]@jXU@M̋u }G^+jYe9jMY@MESMEQjuS3ۍMS TFPjM SjM @G+jYE]Ѕ]jM?MERMQjPu7Mj QS7Mjp QS7Mj V QeS7Mj< QKSM'RMQ>MEAG+j^MAM;:3jM MQ;Sh`YM؉]E]}̍MQMEQGp@,VO֋EEr3M@EЉME=rEPEPEYYMPQ9YYMR@MJ@M&<> UMM2]UMM]h U=>`3ۉp3@dE>79tN!p;t:jh]h{]jp|V{pBp;ud, ^ ];"DjljPDžX0mD =]Et>u MQxP,V׍E3QCPpwYYuƅwExVtMEUxVw4T3ɉX\HLP9EtMEMPEPYYYBEhVMpxPYE ptej_}EPEPYYj_EE VˈPpOYYtdEP1YE pt e}EPEPyYYE VPYYt j_ƅd taEԃ߉prEM@lhE ;r!lPhP lYYhPQ86YYe}Et MtaEprEM@hlE ;r!hPlPhYYlPQ5YYe}EtxUEtNErFM@hlE;r!hPlP6hYYlPQN5YYEdtw`uhhYMOu MQExP,V׋jPEEy8P,V׾xVEM̉uhMEuYDEDžXu P萹YMM (9 ]V8=]YEVP_V]E7YYUMM ]j|U8EE;tEE;t4jh]h{]jpwWvM7E;u̍Mjl?MQNGjl'MQ6GjMC3MEFMEQjhjMQFjMQFjMWFjMVFTEMQA2MEu4+zTLjlgMQvFjlOMQ^FujYeF+]3EjMH2ME EMQjg6Mj >QEuMj6 >QEEMj0 >QEEMj0 >QETDMQ-1MEa3uCjYF+;1]jlBTQEjjQQE@$5EPueEPMEE0jX-IjlEMQEM2MEeMh0YEEClQMEQp@,VK֋EEr7M@EME=rEPEPnEYYMPQ+YYEuy} us~j~aƃPMQuMQE8,V׋8jE px,V֍MMƃT1l}1MY/jdU/كee} PMEX3EhYM؉EEEE0jXEECMQMEQp@,VK֍M0EEr7M@EME=rEPEPEYYMPQ)YYEVMu}j [E]t:VMuMQEE8,Vj[E8uEt Mt M3@EtM}tOuM*uMQE8,V׋8jEpx,V֍MjMbMZp-jU-كeu BKRv#EP追MpG# -jxUP-MuM3QC]x ,V׍MEQMEExVhXME0t#uQTx,V׋MhXMzjM,ME]?MEQjbuMQx,V׋8jEp0,VֈEMEPj CMEuMQx,V׋8MSQEp<,V֍ME QPSME AMME ExVsMETeMhXEEX}MQME Qp@,V֋EEM@EME =EPEP7EYYMhXMmZjM +ME=MEQjv`uMQx,V׋8jEp0,VֈEMEPj}eBMEDuMQx,V׋8MSQEp<,V֍MEQ"PSME"@MMEExVMEeMhXEE}MQMEQp@,V֋EE9M@EMEhYMjM)ME_uQu86E;t8jh]h{]jpSZtVWME;u_^j-t$Vv6F+jYkP6kE MFkEF^] UQu u装 ]UQQEVWMPg@wgDVG PSMgL_^j U[uF+jYu΋eVWv}6ljuSWtuMuj jjNKU2]3ʼnEVW}EjVPN>jWVE>jEPW9>M$3_^U Mu@ht%\EPJV>t.Vv6mF+jYkP6G3FF^UE=I$ wkPJY] UEЃxrpR+]US]VW} WSHt$+ (+_^[]UUV3F9A9A9rxA9r|A9A9A9A9A9A939rpA9A 9A 9A 9A 9^A]jhUEMu 3hlYEE0jX]/j_h\YM؉]]}]>EEPEċPE(P$M؃r4EAMЉEErEPEP%EYYMQPCYYeMM}ETeMhtY}EEEPEP~()M؋M]ȃr;UAMԉUErEPEPUYYMQRMYYe}E3;sj_ )Eԋ@+'Mԋ 'xrPMoEr?WMWE̍MQMEQxT,V׻xVEM]ME]tM]j_;sIbUkE PuéYY]3y UQQE WUSVuW} fE6;UtFCPEPE+PQRt)tjYD;Mu3_^[jX3@UM ES]VW} ;UE9u3 @f9v*A?B?f f3ɃAfCs3Is-sj sj^uU @Eu MBL+ȋEA+;MB;s.EE?E? EN@E;|ՋDv-} @fEf07}r;EtH@J?wC? E3f9uAf} f0;UoM 3;_^[BjXUQQSVu W}]t6;ut,CPuE+PEVPx3AD+uϋ]+_^[Uuuu uQ|]jXU 2]3ʼnEE US]VuW} M};UE+ƒ|!EPSPRP}yLjXaECEEPSPEP!ȃMxϋE+;|=QEP76E ;Ms3;MM_^3[MEECUME SVu EW ;M;EU3C9!UEf;s-$f; $ ؊Ms#3M؍(f;w@( MՋӁs 3Gs jj_MBljE@EE+;E|qM}us EEt!kHE?ʀE3 AÀ}EȋEfEE;M39M _^[jXU2]3ʼnEUE S]VW3UEBEAPREWPj_2EN+;}E3MGMH~VEP3h4 3M_^3[$UME jX]Ujjju VPuVPĐV]UE9ArAуyr]xUQV3ɍEQQPhuQh$VtLuu uLV+~r| t~r| uHPpFu M hX^UQEVxr0yrupVu qR}^UQEVxr0yrupVu qRe}^UE Ѓxr@PRuE]jP0UuE 3ɋ]}]jEE3Z}MЉUfEMMUfE؍F@EE8NHuHQjM}fLM;}UECU~UB7URUPREPuQuN,VV~*MuMP\BMAM;u3EM;s+PQMr}jjMMu+EFL;MGcE؃cEuPEEr6M؍EEME;rEPEPEYYMPQYYe3MjfE؋EZUr5MEEMU;rEPEP?EYYMPQ]YY  ExJ/(3Pˉ{{oEr6M؍EEME;rEPEPҿEYYMPQYYM3jfE؋Eԉ}ZUtMEEME6ExJ(3Pˉ{{ oEr6M؍EEME;rEPEP4EYYMPQRYYM3jfE؋Eԉ}ZUMEEMEhYUSVu3W<|]"33Att@j@VC?|VVYT]T]_^[]UQQVW37u;t>SFuEX,VMӋuMϱu;u3F[_^UVtFHtt tuF^jMhG[EP;jaU d,3ۋ ^8] P];uW^^H þP]VU=P]YuhhXω]H]L]8]'hVMVYYUEV41]4t1]JYVPV^]UVj3YjEjPju,V֋U M^ MJUSVu3W<]"33Att>j@VC?|41]V]]_^[]U]$u EPؒVEh&Uo(MPze؃0H` Ixf~fƤVL/zEPEPLEEPEh(YPoh$YPEEP_oME<EP8Dž8xVƅ@WES,,4QEx4,V׋(SED讧(HQE x4,V׋D8E pPQ,V֋jP8E r8P,V־xVE 辱H蠪(蕪4芪,<E 8t$@tPȂ0TI>3(LxMEHEDžxVPWEItQEJx4,V׋EKP֏QELx4,V׋8hQEMpP,V֋3SPENr8P,V־xVEOhh͒’t跒謒EP9t#8tj  M褦ErEM@EQ=r!PP胡YYPQYYME]E]؃M@ER0htXwhXch YOPMW_MEXM̉IM̉I0ˍPPtPPPM]WEY莍QEZ8,V׋M̋8E[IH7dPEP,Vh YNPMV^ME\M̉IM̉I0ˍPPtPPPM\WE]荌QE^8,V׋EE_;H`pHPPEP,V規蛏Mh Y,t`WQE`8,V׋8Ea7·P,V/h$ Y輍tCW苋QEb8,V׋8Ech< YiPn\+j^Ed=E̍IeEЍP}YEeI0mPPEPM[WEf螊QEg8,V׋8EjPQEhPb,V֍迍贍EEePM}ZEiPQEj8,V׋8MjQEk,V֍B7,hP Y,PZElhIpM܉lhPYWEm.QEn8,V׋8MjQEo,V֍^S hd YtUW趈QEp8,V׋8Eq,V֍hx Y肊CPhYhErhIM܉PUXWEsQEt8,V׋8MjQEu,V֍ ErPMWEvPpQEw8,V׋8MQEx,V֍袊藊3h Y+EP0XEyH3ExVPM̉]Ј]藑EzIgI0SdPWDždhXWE{iQE|8,V׋8E}IH7<PdPEP,V耉uxVE~u9]t 8]tuVj u ]Ј]ԍ h Y҇>PhVhE3DžxVP2hEI]̉]Љ]ԋF+jYMEPNt;x0|H܀HxPlTEЍHEQ;EtTjXE PMNE;tajjMVhEHHp0PPMVWE+QE8,V׋8EPEEP7EPP,V֍NC}̸`XEEEЉ;t!S0,VjX;u}̋E+ljjYkE=r!PPYYPW4YY]̉]Љ]ԃxVEt0tzj  hh YtZW輂QE8,V׋8E,V֍h Y胄tD}h YatAW0QEx8,V׋8Ep=h Y3E]]h YMEʚDžxV9]t(*}EuCEP WEqQEx4,V׋EP2QEx4,V׋8hQEpP,V֋jPEr8P,V־xVEhhH* Et$tj W MEwM@Eh Y?t1Q̉SEjMkh Ytjvn h Yׁtg3SF PM؉]]蹓EEP@jnME M@Eh Y`tAW/QEx8,V׋8Ep<h YtAW~QEx8,V׋8Eph Y辀tAW~QEx8,V׋8Eph Ymt>W<~QEx8,V׋8EpLh YtcW}QEx8,V׋8Ep ,V֍# h Y3ۉ9 PN+j^E$7yIPM]]3EI0ePM؉]]xVE9]t(H}EuCEP= }Eủ]Ј]t"MuЃ}EuCEP ?QMEQ0,Vփ}xVj Eu_t }tu衱Wu ]Ј]ԃEt#thW ErEM@E=r!PPyYYPQYYE]E]Er^M@E=r!PPYYPQ3YYE?p,V֋S|/ h Y}3E]]h0 YME͓DžxV9]t(-}EuCEP" WEtzQEx4,V׋EP5zQEx4,V׋8hQEpP,V֋jPEr8P,V־xVEhhK-}"}} }Et$tj Z MEzM@E=r!PPYYPQYY-hl Y{-3ۉ9kcQP"=j_hܠXME]}]0EEPP(PEErFM@E;r!PPYYPQYYE]}]h| YM]}]|EEPPN(+PM]]؋ErBM@E;r!PPKYYPQcYY]̉]Љ]ԃ}EhECEPiuMEP;Mt uE QM²hEDžhxV蔁MQSE?0,V֋}̅EЉ;tS0,Vփ ;u}̋E+ljj Yk E=r!PPFYYPW^YY]̉]Љ]ԋEErdM@E=r!PPYYPQYYE?p,V֋S{fP]hXw3ۍxVVXEPP艀YYEȉ9t/8t輪j 2 EP uEhXw[PhFhEn3ۉxVVoEPPYYEΉ9t/8t֩j L QE͋x,V׋8ESpX,V֍ElwPsQEЋPsjxP,V׍wwh Yu$]Džx0jXEE3Eh YM]E]ތxQMEQp@,V֋EEуrEM@E=r!PP賅YYPQYYx]E]K3ۍxVV_}ESPP}YYEV9t/8tçj 9 EUPrEWQPqjxP,V׍VuKuaUEV ;|+;}E ;|;}2^]UMX;t=Xu3@]Ë@]j@U@ًMu MuE;tOxVQMeP2,VփMMM豈M\wEMu;uyUjh%UdPQQSVW2]3PEd؋]ٮSWSRP[jEڸʚ;PVQWuRP\ûʚ;ȋEE0xMd Y_^[jHU }ȋEO<3P]]DŽPMEpu]MQx4,V׋uMQExP,V׋EEr9XihcVM؉]E]+uȍEPE~> EEr7M@EԉME=rEPEPEYYMPQ;YYEFhW5|OYu̍MVo}j[E]t:VMnuԍMQEE;8,Vj?[8tEt Mă5rt Mԃ%rEtMr}tOu̍Mnu̍MQE8,V׋8jEp,V֍MqMqME ExVxMqOtMqVt +FPLV&~t vVN^V>t 6V&^U@2]3ʼnEEVWEM ɋEE̸cVEMPO.ut#tj3ZA jZjjZjYS]Ãtt tjjujQVuċEujR0j|Vt'[u V=tMw3_^iPMaF jMjFjEPMnFh%\EP4UVW}jVu W|M+t+lj3_^]U82]3ʼnEM VW} ;M|:U;Ur0E+uMMwrw+EM‰3_^jMEjEPMEh%\EPUQQ;QsyBAr fEfQ3fDQuEuj8UQQEPEPeA@#QTz蓍UQEVW~;w+9Ft&sE+uP7~s ~r_^UA+Vj^^9Ev}I$ w ]]AؑVuP@VjtUMMPM2O(13+t)uEMM؍Mh YEӂE؋PEr7M@EME=rEPEP{EYYMPQYYEeEE;tO(zfn[EeMh YEEDE؋P_Er7M@EME=rEPEPB{EYYMPQ`YYEeEE;tO(fn[EeMh YEE赁E؋PЫEr7M@EME=rEPEPzEYYMPQYYEeEE;tO(\fn[EeMh YEE&E؋PAEr7M@EME=rEPEP$zEYYMPQBYYE3E]];tO(ͻfn[EEM!]P]guMQE8,V׋8MQE ,V֍M;jM3j]uE]uM %E.E"MUUM BABAB A BAfBfAfBfABA]UUM VWryBABAB A r y _^]UQV񀾨t]MS39YtQF|P~ztDE-Sh]h{]Sp}t%MkE;u[^jE0jXej[u؉]EMEMQME u؉]EMEMQeMEeMhXEE~MQM؈]Qp@,V֋EEr3M@EԉME=rEPEPlwEYYMPQ芾YYMhUXM]MQ;p,VփeMe0jXP})jEuYtX3eMh(X}jEEPVEP@g+MxMpME}{}@jQ,V֋GhM؃e|ePw;Et8}t2MQp,VPEEPj M{EEr3M@EME =rEPEPuEYYMPQYYe@EE6gj|UE0jX]EEЃej萼uYtUruFOGFNOeEuP蹥UQVW7EPVE6Pa'9ut u%_^̍AxrjGUu3ۍ~P3CE9EtYFhXXE]PPVlE É]Pu)Y@D0PYHAD1L> jUfu膤E NuMQx,V׋uM3ESQx@,V׋uE8,Vׄux,V׋]ԍE]PWMԉ]܈] uSWuԋEx,Vh$YEEtjjMQMԍFP#t=E+MEE=rEPEPnEYYMPQYY]ԉ]؉]܍M\_MT_MJ_MB_3ۋME ExVMQp ,Vu}xEp,VEtEMEtMt38E"9uEPu jdhYAjEPO}t5jEEjPOyr ERPQOEPMphjYu_}+hEl+pUtE3;|8w+p+hU8QRhYOujYuEjjPEN}tuu EȍEEEPTEEYjjPNVuWp,Vքu39uPh8hYQN_UT]hU]rU]Hj(}Uى]SMe@D ubD8ujEXPEjYK,P,VMS,MM̋EEЋ]#ȃujjHXjZy8E A P蒝M貙JjUru3`yX0jXMFNF N(4]F8N@NDu EQh4]u SUQSVW]c4pXHE {uECEC vECxXCu{$v_^[UjhME @"L2(j$ULu3uw YuE @2CVh]h{]xV,VKP j_thMP3Ijuu[ uEߍE]PM I}t)]EtFxGp,VOEtMGLEtGMPHM*L3E0jX9EEEMEQM 胻MMKjUwًE3uHytE @ʹjMA+Y3B;t M ‰QCux,VKVh]h{]VPthMPGujE[ uj[]E]PMGEt)]EtFxGp,VOEtMJEtE0HMJE @L2訥j2U7EeHytE @}苸jM܋A+Yj[;t M AыGep,VOjh]h{]jPtthMPFuEjE[ 3uE]PM]dFEt)]EtFxGp,VOEtMI}}܃ee7΃~u臲],ENt 蘶E7΃~uX],Et iE}~}~MEPEPMIE @ZL2j4U认ًE3} ủ}HytG6ǶjMċA+Yt G֋Cux,VKVh]h{]VPthMPDujE[ uj[]EЉ]PMDEt)]EtFxGp,VOEtMG}tIuċ6NHN0EN΋učMSWPMȍEPE3MGE@L2虢hU+ًE3M x|@dtxtAmCux,VKVh]h{]VPFthMP\CujE[ uj[]ExPp2CEt,xEtFxGp,VOEtMeFpt,tuj_F+ t|@p%Fyu&ݝhh .fnfZ|tlωE|ٖt̖uMSWPxEBx|B`t菖ωE腖|xtkuMSWPREJHr0Z=Έ|:ˋ1xlW|VPQM$XEE pEEPd@L2͟j wU̟u3uYuE @2CVh]h{]xV,VKPj_thMP@juu[ uEߍE]PM@}t)]EtFxGp,VOEtMC}t&OMjQ̍EP0@q,V֍MC蒞U3E EMjEEQPEMp誩hU蹞j^3ۉuhXM؉]]KYE؉]PME0jX]芶EEP>CMEEr7M@EME=rEPEPREYYMPQ<YYEjuQΉ]],V֋؅ q,Vփx:j^3ۉuhXM]Ј]_XEEPpDžp0jXx蔵E0jXEEEEPpP(MpEE r7M@EME =rEPEPQEYYMPQ"YYE (juQΉ]Ј],V֍()BBthjuEPL@xErPMf5MENhDYM5jtEYEEtjMQMQ-VME jUd, ^ ,^; (^ÿ,^W͐=,^YuejYuEtfFh\YL3W5(^4YhDU辑EHu 3ۋ}T@EhcVXD03ɉM9N;X9H,9O#QW9jwEPN;xEreMPEEKMEId, ^48^;<^;#@^D2];T$2]9Er0Pj`PM:j[h2]PEDYYtkT2]9Er/PjxPM:WE PDYYt2 <2]E;r.+MjPEPF:h,2]PYYu ƅ_ƅ_t MHtxHEt `H}VtVMWt _tWPMXMeeSDCHE PI<\t'EYYMPQԅYYdh4^[=4^YehV$4^YhDUp\3ۃ]p,V֋EVPNYYjEx0,V֋MEu`EPddP`Ph\hPEOLhEs9_Xu9_TtcjjSDE&SXjXP9'Qp,V֍t GGMsM-؈̍ALjfÜQEEP)su2rCt"uc{$t\jVp,VFQEP)t/{t(?p,VK֋OPCP,VKWM,M ,M,݇j,[UMuMQ3ۉ]x ,Vh|YMEE'EEPMDMEExV3E3uMQx,V׋uMSQEx@,V׋uE8,Vׄux,V׋]ԍE]PWMԉ]܈]uSWuԋEx,VhYEEtjjMQ؋MCPEۃ4#؍EP]vMԳt4E+MEE=rEPEP:EYYMPQǁYYM;+M3+ME ExV32M+̃4j8U,Mu3ۅt PSh]hHc]+PRtϋX+0uOjSSlEP~D΋X3PPPP@|08SYjSVuݲh|YM$eEPEP1YYMEExV(1uMQEx,VSuEEPm}EEP( jpd,VքtC}EQP.&jpP,V֍M)M)M})Mq)Mi)Ma)2`UVWuuu7u uN(,VV(E_^]j UYVM4qeHD1 uHL18Ej[Suu uPPH H#уujjHXy8E A PqMn调 jU؃33M]KCfu }MENOQZVjWjUUQ=T^,SVWEPFPF0P` ~ tY}uS~HEtPWΔYYu;hPW tc%T^^FHtWp,Vքu6t}u WYu}tT^h@V_^[jVj=@PE1PΉEU6u e؃]ύG E܉EWFV}S9EuP6u6]G VPvu|uuS{u܋MuuMuajjw5Ujh:UdPV2]3PEdpujX6vYYMd Y^UVu WvuVu6YY~ t_^]USVu WE~ t4Cx uC}WPMZYYEK@F}PW;3u$!ZYYE0@@YYYtCMu*WCPYYYtYCH E@t0@FWPYYYt~Mu!{ uSCPWYYYuCMEWP_MuW}W`t>FF6EEFFFH E@ufE@0`_^[ UVW}pg~ 7Gu.S] F7P6y 3w6@v3G~ t[_^]Ujh:UdPV2]3PEdu NjXV~tYYMd Y^UVuW};} tW _^]US] EVWSPh^uSV_t E0@L.tJE]PEPhY7MWMp`Vuu.MA_^[0j Ukxu]}uu]eW} u;} uSVV wUVuF;Ft DF P^]USVuW VSH;u u_^[]UQSVuWu ]#{CPMK_^[UVufxVF#^]jUwwuEefjX FYwjUDwu&fVdYu euvjRDUw}uggVd,eFPO vjBUv}u3V__(,O]FMPYY,`vUQVW3WWu0~Ɖ~ ~_^j Uevu3FNNEMPQuMu j賩u Ujh;UdP2]3PEdyt jXq@qYYMd YQ9Ãyt 1I(Ujh:UdPV2]3PEdFtH0Ft jXPpYYMd Y^qq1 VWO0\.OT._^K.VN@.^8.UVutNj VbpYY^]UV>tVv6F+P6D E MFEF^] UQu uB ]V>t(Vv6(F+P63FF^jCU{teE PAM d't$UE PuYY]UVW} WvG PN EF8_^]UQEPQMEjjUsd,l^ ^ ^;sþ^Vr=^Yueh@V'qV*rYYj,UsكeEP+YM EMPMME豄MȃEUeMPExVEEuMQEx,V׃}xVEut}tuIj u'n MEI0膄eMPuEuMQEx,V׃}EExVt}tuCIj um Eȋ˃HEPEPxEȃ`PQEPEPEȋ˃xPEPMȍ考MȋǃPa j` mYuEtjSWQEPuu"3PMEQĉeԃ QEeE PQEE PEEPFeEeuSWP E0KME EP+E PQhCYYj_MDMMM{MMpj@U$qu 3ۍMj]pME蹃M׈]QjbSM;V誆hYM؉]E]z+uMQMEQx@,V׋EEr3M@EЉME=rEPEPa$EYYMPQkYYMrMpUQE1PjH U2pًMۂPMwEeH0p菁΋膁WPEMuMEiPEPMQ(NM(M(MAzZoj02Uo}3M }DEj[@+]șuj>!uԅ2}3ހeM؃eP$hYMrthYMYthYM@tohYM*tYh,YMtChLYMt -hhYMt@hYMt΀Er7M@EЉMԃe=rEPEPN"EYYMPQliMYYjXGE̋@+};}V?p8,VmjHgUnM }}3ۍE]P]YE]E;tFHAPQMԜEEPEPM#M؈]ZoMk&ME;u?MQp,,V֍EPPmhUmtEMp3ۉ]j_F+3~PM]̉]V"E7~j^U]u]ԃ}EhCEMP\^PE0jSSSShEEPTWTME]u]|']EuMP#ErMhEPklE PYYlMԃ}E CMԋQux ,V׋hlQP p,V֋phQP?p$,V֍EPQE P tFlhErUYYMQR\WYY[̃,t0jF>U[ًusex,V׋uPy ,V׃tuPy,,V׋E MH12[ jQUL[3Cy]u2u 8,V׍MM ZjUZu eKu}7uxrP 7YM}Z+IAu,,t!AVWjxWr,VO_^2UVWx0u;u;u2_^]UAtxtpM0rEE`3@f]VN$ujjHXjZy8E A PG^V3FF^j EYYMPQ\TYYuhYM؉]E]EEPEur9M@EME=rEPEP EYYMPQSYYuhXM؉]E]kEEPEur9M@EME=rEPEP^ EYYMPQ|SYYuh XM؉]E]EEP"Eur9M@EME=rEPEP EYYMPQ SYYuhDXM؉]E]EEP貿Eur9M@EME =rEPEP~ EYYMPQRYYuh\XM؉]E]EE PBEur9M@EME =rEPEP EYYMPQ,RYYuhYM؉]E]EE PҾEur9M@EME =rEPEP EYYMPQQYYuhXM؉]E];EEPbEur9M@EME=rEPEP. EYYMPQLQYYuhXM؉]E]EEPEur9M@EME=rEPEP EYYMPQPYYuh0XM؉]E][EEP肽Eur9M@EME=rEPEPN EYYMPQlPYYuhDXM؉]E]EEPEur9M@EME=rEPEPEYYMPQOYYuhlXM؉]E]{EEP袼Eur9M@EME=rEPEPnEYYMPQOYYuhXM؉]E] EEP2Eur9M@EME=rEPEPEYYMPQOYYuhYM؉]E]EEP»Eur9M@EME=rEPEPEYYMPQNYYuhXM]E]+EEPREԉur6M@EME=rEPEPEYYMPQYYMqEMMcC+IAu)t!AVWjxWr,VO_^2UVW} wWNkF_ȉN^]j$V,CMЋuMԃeQx,V׋8Ep ,V֍MEwuy,V׋uEԋy ,V׋MPEPx-hYMuhYMt }t3C2ۍM9MBVVv6B F^UQQEPqrYjh@Bp0FMQUE V;;vtj= tY=ptH=t7=t&=t=ih!Ydh!YZh"YPh,"YFhL"Y<h\"Y2h!Y(=tH=t7=t&=t=hT!Yhl!Yh!Yh!Yh!Yh8!Y4;etY=tH=+t7=1t&=2t=3h Yh Yh!Yuh!Ykh(!Yah YW=5tF=6t5=7t$=8t-h Y(h8 YhX Yhp Y h YhYp $JMhYhYhYhYhYh Yh8YhTYhlY}hYvhYohYhhYahYZ wM$JMhYDhY=hY6h Y/h$Y(h8Y!hLYh\YhpY hYht"Yu΃fF^]JMIMIMIMIMIMIMIMIMIMIMIMIM_JMXJMQJMJJMCJM~Auy~@tnE3P^@VHV8YNLN<+uuHEQRP E0KM]]EP^]PQ YYSMj=j@LV=jMG=3ۍM]PM׈]Qj,sSMlOQShYM؉]E]A4MQMEQp@,V֋E]r3M@EЉME=rEPEP)EYYMPQG8YYM><hV=}EP:3E]]̉]]ԃMtx|E}URw EECEM]VP^PܸPMEDME[jSSSSVEPMʢPtE۾MEgow(EM;w,t4t~rvPP`M NEM;p,u҃ E̋̉ePEE PE3j\;\E NM]Qj.qS\kuNQQj\PMQUQj\8N QQhYM]E] ~4\QME Qp@,V֋Eȃr3M@EME=rEPEPEYYMPQ6YY\UЃsjY}Er EsjY}ErE؉]Ĉ MC;]5t'u]̋uEЋ:lMUMEj4VE3ҋ}]EЋE E]ftf;uCB Wfu]ȃeMjSEE e3BEU3E39]wftf;t Fwfu}ErE؀<t}ErE~wf;tUftPuMu$M8AuMfwf;Au ṴEAŨsjY}Er EsjY}ErE؉]Ĉ MЊEC;]1t#uDuMEjMUM(EUSVu W(_,tF FSjP=G ~.cVwF SjP G ~/;YwF$SjPGFSjPfG FSjP$fG_^[]U02]3ʼnESVWj ٍuY}u EPjPkfC EPFjPUMfC3_^[4U0SVEЋWP]Yj YM 3SW+P8u M SWFNhPSWh,:YF F_^[U,ESVWPYj Y{M P|YM C/P|C $;Y|Y_^C[UEMV;Mt,1f;rw;E u;Mt3@ 3;E ^]UE +EVu+u; 6Quu4 ^]U u3!E!EfEEPjEPEPfEUeeS]VWQAu+3AEt#uEPWESPD~F+u]FjVEYYt=eet%uEPuSW~ ؃uދE3f_^[UQQS]VW;waGQPSEf NQSuEP_w1u3 f^ErEP7YY7_^[ U USVپWK+M;rnC<VPWE NQBu{M u}Esur3VP}PV|YYSPE_^[dU USVپWK+M;rqC<VPWEF NQu{M u}Esuur3VPW}PVYYSP>E_^[U USVپWK+M;rqC<VPWE[ NQ@u{M u}Esuur3VP}PVLYYSPE_^[4UQQuEuuu PU H‰Jj U jM5X^^euMPiuCt;uEPYYt8}}WEYp,V։=X^M j U jMq5(^^euMPuCt;uEPkYYt8}}WE Yp,V։=(^MXS >j Uw jM58^^euMP?uCt;uEP<YYt8}}WEvYp,V։=8^M j U jMG5^^eu_MPuCt;uEPIYYt8}}WEYp,V։=^M.) j UM jM5^^euMPuCt;uEPVYYt8}}WELYp,V։=^M j U jM5<^^eu5MPuCt;uEP1YYt8}}WEYp,V։=<^Mj U# jM5 ^^euMPuCt;uEPYYt8}}WE"Yp,V։= ^MojUj UjM5@^^eu MPVuCt;uEPYYt8}}WEYp,V։=@^Mj UjM^5^^euvMPuCt;uEPYYt8}}WEYp,V։=^ME@+j UdjM5D^^euMP,uCt;uEP}YYt8}}WEcYp,V։=D^Mj UjM45^^euLMPuCt;uEPPYYt8}}WEYp,V։=^Mj U:jM5L^^euMPuCt;uEP#YYt8}}WE9Yp,V։=L^Mlj UjM 5H^^eu"MPmuCt;uEPYYt8}}WEYp,V։=H^Mj UjMu5^^euMPuCt;uEPYYt8}}WEYp,V։=^M\WBj U{jM5^^euMPCuCt;uEPYYt8}}WEzYp,V։=^Mj UjMK5,^^eucMPuCt;uEPYYt8}}WEYp,V։=,^M2-j UQjM5^^euMPuCt;uEPYYt8}}WEPYp,V։=^Mj UjM!50^^eu9MPuCt;uEPYYt8}}WEYp,V։=0^Mj U'jM5^^euMPuCt;uEPZYYt8}}WE&Yp,V։=^MsnYj UjM54^^euMPZuCt;uEP-YYt8}}WEYp,V։=4^Mj UjMb5^^euzMPuCt;uEPYYt8}}WEYp,V։=^MID/j UhjM5P^^euMP0uCt;uEPYYt8}}WEgYp,V։=P^Mj UjM85 ^^euPMPuCt;uEPYYt8}}WEYp,V։= ^Mj U>jM5T^^euMPuCt;uEPYYt8}}WE=Yp,V։=T^Mpj UjM5$^^eu&MPquCt;uEPYYt8}}WEYp,V։=$^MUVuffa^]UVu3fFfSx^]UVu 3ufFf^]U0E SVW]CEP4X^Yj Y{_^[U0E SVW]CEP5Y'Yj Y{_^[jU<uE Fue9YXjU uE Fue7YX uË uË vVv 8Y蘃Y~X^Vv 6Y~Y~X^V~6Yt v ^YvUY~X^Vv9Y;Y~X^VvP6Y!Y~X^USW}9;tF;t3Y3t1Vf9tf9u+V藂Yt VWP  ^_[]UVNtu)f;u^]UVW};t6~'Y_^]US]VW}Wu SV uVuPE3_^f C[]UES]VW} PWS EuVuCPxME+EPOP1CP$_^[]UV9YsE~Xt jXVYY^]UV\7YsE~Xt jXVYY^]UVEt jVYY^]UVEt jVYY^]UVEt jDVTYY^]UV8YsE~Xt jVYY^]UV6YrE~Xt jVYY^]UV9YrE~Xt jDVYY^]UV7YrE~Xt jDVYY^]UVEt j VdYY^]UVEt j V4YY^]UMV;Mwu ֋E+;w 2;rE^]UQSVW}كGEr?s j^1;wFP+,M MQWPGE C_s^[U2]3ʼnEeAePEPuEP^E uEM3U eAePEPjEPEPxEUyrEA3f B]UUVu W%F t+@t#@Mf.*t@ʿ0#t" t";uA6 ME$ uf;ua Me@_^]UM39UvVu 23iȓB;Ur^]j`#VM$E ]u E]Mt<+t<-u3G3C0#;tX"GX;w<>0uL>xtXuRVEj.XfE袤EEPVŤEMs0eEPMYME$eM3EPufE8p}EErE؋MPEPVs0MEEP9YEMupEP,VM֋MEuЉU;ut M|}ȍErE؋Uf pEE}uru<t3]~)ȋ+;sR+ٍMjS(~~FU<uӋ]{$EE|{ v s ;v+3C%@=t9]EVuuuPSm3}MPE؉UrEWPRQZ}ErE؋]WPuEuPSaVuM@PEEQPSZm03$}ErE؋]WPuuEPSa}MPE؉UErE؉EE+PExPRQEPSpaUVuuM@b b$PQVSEl0MMj`#VM$E ]u E]Mt<+t<-u3G3C0#;tX"GX;w<>0uL>xtXuRVΡEj.XfE苡EEPV计EMs0eEPMYME eM3EPufE}EErE؋MPEPVs0MnEEPYEMupEP,VM֋MEuЉU;ut Me}ȍErE؋Uf pEE}uru<t3]~)ȋ+;sR+ٍMjS膰~~FU<uӋ]{$EE|{ v s ;v+3C%@=t9]EVuuuPSj3}MPE؉UrEWPRQZ}ErE؋]WPuEuPS^VuM@PEEQPSCj03$}ErE؋]WPuuEPS^}MPE؉UErE؉EE+PExPRQEPSY^UVuuM@b b$PQVSEi0M˩Mj8UV}3މ]tC97u?j4YEutM bPM.MCVP7tMjX'j8UVQ}3މ]tC97u?j4MYEutM PMMCVP7tM,jXj\V}3ۋE Eԉ]Ѕt{9uwjYu!]tBMԍEP芮xEErPMEfj[8YFV 37t MtMV3@4j\V}}3ۋE Eԉ]Ѕt{9uwjAYu!]tBMԍEPxEErPMfj[6Y=FV 37t MtM货3@j8V}3ۉ]tO9uKjDYu!]t&M RPMfPC6Y37tMxjX j8ɻU7}3ۉ]tG9uCj5Yu!]tM PMC8Yf37tMjXj8ɻU}3ۉ]tG9uCjYu!]tM zPMFC7Yf37tMjX=j8ɻUg}3ۉ]tG9uCjeYu!]tM PMC8Yf37tM@jXj8ɻU}3ۉ]tG9uCjYu!]tM PMvC,7Yf37tMjXmj8ɻU}3ۉ]tG9uCjYu!]tM BPMC9Yf37tMpjXj8ɻU/}3ۉ]tG9uCj-Yu!]tM PMCD7Yf37tMjXj<V}3ۉ]tc9u_jXYu!]t:M rPM>fC]SPE9Y^( D9Y37tMjXj<VC}3ۉ]td9u`jXAYu!]t;M PMfC]SPE9YF(CP9Y37tMjXj<V}3ۉ]tc9u_jXYu!]t:M iPM5fC]SPE\7Y^(C7Y37tM{jXj<V:}3ۉ]td9u`jX8Yu!]t;M PMfC]SPE\7YF(GC7Y37tMjXj8ɻU}3ۉ]tG9uCjYu!]tM `PM,C$8Yf37tMjX#j8ɻUM}3ۉ]tG9uCjKYu!]tM PMCd6Yf37tM&jXj8ɻU}3ۉ]tG9uCjYu!]tM PM\C`8Yf37tMjXSj8ɻU}}3ۉ]tG9uCj{Yu!]tM (PMC6Yf37tMVjXj{udLCf;Eu+{u HLCf;Eu -F7uSYYtB}{uLfCf;EuE7WSYYuр}xt0FuSYYt>{uKCPEPZYY s} :YFGE7볊E}uuuM脗EbhV}u MUG]%0uMx=0uRWQSVu fw0|e|PMY|pEPq,Vp֋E|w0EEEEd|EPZY|EEPh:Yh:Yq,,V֋}WSOYYtH{uSJCf;EuE+ˍp5"{u *JCf;EuE-Ջux330uFu9ʚ;UUHU%$}lEErEE<9Uutp3҉tRjMUEUMuE3S[YY{u[ICPEPYY sWME9l EtEut:YFAuM}ErE<8t`}ErE8OU̍EMr<8tYfttO{CuHCŰMf;tu+jM褱G4uSyYYŰMtEr<8~YGŰMEtME<tDtErU:8Uu&uErU:U|E@8~EEME }wWSYYtj{uGCPEPxYY sEM9l EtEut :YFAME3WSyYYuuWSiYYt?{umGps_f;u蚈uˋFu2ux8ʚ;}WSYYt9u{uGfCf;EuENq2WSYYuЉuuEyY0F@EO{uFCPEPOYY s:M;l}:YFAMtEE1WS[YYu}t;~;}t*蟇:t9u 0EO;uE;uE1}EHWSYY4{uFCf;Et{u ECf;EeFW1u3ESxYYt>{uECf;Eu+{u ECf;Eu -F0uSYYYtB}{uZEfCf;EuE0WS'YYuр}xt0FuSYYt>{u ECPEPYY s} :YFGEb0볊E}uuuMʐEhV}hE ]\Ew0pET,ehPMYhXXEPq,VXw0hE־hEPYhEEPh);Yh ;Yq,,V֋p\VSEYYtD{uCCf;Eu+{u CCf;Eu-ˍx/3f0xVES`t|DYYtf{uHCCf;EuO.VSYYt7{uCCf;Et{u CCf;Eu z.ET39ʚ;H%$}lEdr Ed<}u xXxeMjjEE3pE3S>YY {u>BCPEP脿YYs[tE9l|ut ;YGA`t}ErE<0t`}ErE0OMUErЀ<2t\fxtR{SuASMEf;xu.jM胪F,pSUYYMEtUrЀ<2FMEdtrtkt(ExEr Mxx:0Eu:u"}Mxrxx:M|dB:~dEME轌p{VS荽YYtn{u@CPEP׽YYsFt9l|ut ;YGAtE+VS%YYu`}ttu 0G`VSYYt@{u?Xsf;u*ˋG`U+ptVS蟼YYtB|{u?fCf;EuEO +VSiYYuЉ|`|yX0G@|K{uJ?CPEP萼YYs6t;l} ;YGAtE*VSYYuEDVSֻYY0{u>Cf;Et{u >Cf;EpG+*lVSE}YYt>{u>Cf;Eu+{u e>Cf;Eu -G)VS2YYt9{u6>fCf;EuE)VSYYuр}t0GVSYYtJ{u=CPEP6YYs(l} ;YGAlE:)멊E}uu\T|M葉3phV}hE ]\Ew0pETehP:MYhX EPq,VXw0hE螷hEPYhEйEPhI;Yh,;Yq,,V֋p\VSE|YYtD{u<Cf;Eu+{u b<Cf;Eu-ˍx'3f0xVES`t| YYtf{u<Cf;EuO'VSYYt7{u;Cf;Et{u ;Cf;Eu B'ET39ʚ;H%$}lEdr Ed<}u xX購xeMjjEEpE3SYY {u;CPEPLYYs[tE9l|ut,;YGA`t}ErE<0t`}ErE0OMUErЀ<2t\fxtR{Sue:SMEf;xu.jMKF%pSYYMEtUrЀ<2FMEdtrtkt(ExEr Mxx:0Eu:u"}Mxrxx:M|dB:~dEME腅p{VSUYYtn{uY9CPEP蟶YYsFt9l|ut,;YGAtE$VSYYu`}ttu 0G`VSYYt@{u8Xs跹f;uyˋG`$ptVSgYYtB|{ue8fCf;EuEO#VS1YYuЉ|`|yX0G@|K{u8CPEPXYYs6t;l},;YGAtEY#VS趴YYuEDVS螴YY0{u7Cf;Et{u 7Cf;EpG"lVSEEYYt>{uI7Cf;Eu+{u -7Cf;Eu -G"VSYYt9{u6fCf;EuEn"VS˳YYuр}t0GVS贳YYtJ{u6CPEPYYs(l},;YGAlE"멊E}uu\T|MY38jAVMMEMp0ݰeEPMYMu](} %uCECjp$Pu$EWuuuuu P,VM֋M @E uTEPM 誅@}uM 5ujHp,VMքtNM EPM kut1}uM Q5jup8,VM:uM uC  EPM tEM MH$jAVMEMp0舯eEP聽MYMu轱](} %uCECjp$Pu$EWuuuuu P,VM֋M @E uTEPM U@}uM B4ujHp,VMքtNM EPM ut1}uM 3jup8,VM:uM ^uC  EPM 轃tEM MH{$hlVE ]lExEPEEYPq,Vփe}u p蛴puEYPh:Yh:Yq,,VxlS|ٯYYtF{u2Cf;Eu+{u 2Cf;Eu-Fˉ|)uj _}uj uj^#x2SEtEEYY{uE2Cf;EuyˈEtxSYYtN{u 2Cf;Et{u 1Cf;Eu tuj2^EtPuj^t;t3HEteMjEEUl3xEStQYY{uQ1CPEPpYY;EsS}:Y|u0t;ts @E|}EErE<8t[}ErE8J}EMr<8tVfptL{Cu0CMf;pu+jM裙GxSuYY$M]tEr<8~G 2 M]U}ErEtgtQtJtMMMr]MM:9Mu8u}]]rM]:]|x~@뫀}|u 0@lM{M{hlVE ]lExEPEEYPq,Vփe}u p辰puEYPh;Yh:Yq,,VxlS|YYtF{u/Cf;Eu+{u .Cf;Eu-Fˉ|Luj _}uj uj^#x2SEtEhYY{uh.Cf;EuyˈEtxS)YYtN{u-.Cf;Et{u .Cf;Eu tuj2^Etsuj^t;t3HEteMjEExl3xESttYY{ut-CPEP蓪YY;EsS}:Y|u0t;ts @E|}EErE<8t[}ErE8J}EMr<8tVfptL{Cu,CMf;pu+jMƕG@xS蘩YY$M]tEr<8~G 2 M]U}ErEtgtQtJtMMMr]MM:9Mu8u}]]rM]:]|x~@뫀}|u 0@lMwMwԾU@2]3ʼnEEMSVu ]W} PWEЉMuԉ]藨YYtFu+OjQp8,VM<+uE<-uE܍]݋ω]uuEW>YY]uԀu6+OjQp8,VM<0uϳuWYYu]ۄۋ]tL0CFu*EOjQp8,VM֍HЀ w$E;sCE0uW苧YYu}u]3EȍEPj EPEPؓϋumzt3@3M9Mt}u;u| 9u|M1M_^3[hn VeEM} LeEEEEtxTpp0蓤}txEP蓶؉]xEP؉EYx裦e2E3EEfEEp,hP,V֋E`@px3C]p0]xEPYExlth:Yh:Y|eEusGEh KHuEFutM}]uUrErH;DuWDYY(uD(fGf;]MU멋u3ΉESxEpEP,VMց]]}E M;`f}ErE83EEEPME 蛐u3WvYYuv'_StYY s?:YMddHME؋U؃r€<0tHE؃r09}ErE؀<0tAu &Gf;`u%jMFeuWYYJt}ErE؀<0]~F E]E}UrUuBtW tPt}ErE: 0uu}ErE:| z~BEMTrMEHrME 7rguVW YYtW]u &GPtvYY s-:Yˈ\\ގYVW趢YYu]M车uW虢YYfu%Gf;uW\uYYtZE;}fuV%GPtYY s/:YMXX(EuW렋E;} EuEMyu E;}+j0؍uT{uW襡YYEpEP,VMցE}]]vREpEP,VMցE}u]]ruu>$Gf9u2ۋEtMEJpEEM؉EE/ptTy]MQp,V֋]EƅPMPP]]Mo]p EP,V֋ME}MMvTp EP,V֋MuE }MMruu 2#MGf9u2tMM=oMEMMM"otXl]MQp ,V֋]Eƅ|M| P]]MnE]pEP,V֋E @E }EEt'p EP,V֋E @}u2ۨ@t࿍ME[nEEM؉EE@nuۋ]WENEpEP,VMցˀ]]puE@u/VW裞YYt"u!}EOrEf;u9}uH}wBVqu!8Gun!}EOrEf;t}ErE؃e3f}uruuWYYtI]}MrM؋EA;t-u!Gf;uσu SWҝYYu]}MrM؋EA;tEEM uu2W茝YYtNu lOQjHp,Vlքtϳ uWAYYuu5h uۋ]E]~]MUErH;u}tMj-jj϶ MjգMlEϲhn VEM} LeEEEEtxTpp0A}txEPk؉]xEP؉EYxQe2E3EEfEEp,hP,V֋E`@px3C]p0]薙xEP茧YExl›th:Yh:YqeEusGEh KHuEFutM}]uUrErH;DuWYY(ufGf;c ]MU멋u3ΉEnEpEP,VMց]]}E M`f}ErE83EEEPME Iu3W$YYu$_St菚YY s?:YMddME؋U؃r€<0tHE؃r09}ErE؀<0tAu Gf;`u%jM虅FuWnYYJt}ErE؀<0]~F E]E}UrUuBtW tPt}ErE: 0uu}ErE:| z~BEMhMEgME gguVW踘YYtW]uGPt$YY s-:Yˈ\\茄VWdYYu]MkuWGYYfu>Gf;uW uYYtZE;}fuGPtoYY s/:YMXXփENuW詗렋E;} EuEMyu E;}+j0膃uT{uWSYYEpEP,VMցE}]]vREpEP,VMցE}u]]ruuGf9u2ۋEtMEeEEM؉EEetT']MQp,V֋]EƅPMPP]]6Me]p EP,V֋ME}MMvTp EP,V֋MuE }MMruu MGf9u2tMMdMEMMMdtX]MQp ,V֋]Eƅ|M| P]])M}dE]pEP,V֋E @E }EEt'p EP,V֋E @}u2ۨ@t࿍ME dEEM؉EEcuۋ]WENEpEP,VMցˀ]]puE@u/VWQYYt"uU}EOrEf;u9}uH}wBV/gu!8Gu}EOrEf;t}ErE؃e3f}uruuWƓYYtI]}MrM؋EA;t-uGf;uσ#SW耓YYu]}MrM؋EA;tEEM uu2W:YYtNu>lOQjHp,VlքtϳuWYYuu5h uۋ]E]~]MUErH;u}tMj-jj} Mj胙MaE}VWtVO )Vf/YG _^u3YUVu W(tF8FQu WPX\ 3f__[u QuQ?w^UQVW};~w&~SrWu ~S \ 3f{[ u uW{v_^UUVrffu+RuhO^]UAPuuu utȃy3]UAPuuu ua{ȃy3]UqM%E]UqM跆E]fA UVuuff=^]UVuuff詋^]j@ V耄U(E ]u$UURPuEPE PEPeEPM At}t7}}r}eEPjEPWb9}t }uE؃M MKM<葃$jt 9uu ^]VS(A}ErE8-u=rfE3fF'}ErE0Exrf pF;rՋ]M MKM@:$jMMă_}uM!.EPVEPEP&LM̃E9Et}tEPM 2t EM MHuu j8޼UuuMċE] EE$v0E\eEPvEPE PEPWnMMă$_}uM!.EPVEPEPKM̃E9Et}tEPM 1t EM MHt U,2]3ʼnEES]$Vu W}RPEDžʚ;PE PPQtiQPPPSٝم9t-u$=ʚ;t#tPQ$RYY؍EPM 0tM ljMOM_^3[ys U(2]3ʼnEES]$Vu W}RPEDžʚ;PE PPQt_QPPP\R9t/u&=ʚ;t%t!PQQ$TS ؍EPM /tM ljMOM_^3[r UEPu Euuuuu PEU HE$EH j4 UrEM$]} p0M̍MYeEPhEPE PEPVOMMă\}t*EPVEPEPHM̃E9Et }tM!EPM .tM É MKq j8޼UquMċE] EE$v0EYeEPvEPE PEPW莮MMăD[}uE `1EPVEPEPIM̃EЉQ9Et}tEPM -t EM MHp j8޼UquMċE] EE$v0ENXeEPvEPE PEPW辭MMătZ}uE `1EPVEPEPIM̃EЉQ9Et}tEPM -t EM MHo jh V0pMEu} ]$@@H0QuMEoWeEPnMYMuYeM3EPjfEY~EpEP,VMփ}EErEuȍMP:MEl(jM&MpEP,VMփ}EErEuȍMPY:ME!(}ErEPj^VEPE P;[3Ƀ+tt 7 MM'uRVEEPEpEPE PEPu身MMEoX}utEPM .t}uM ujp,Vքu'}uu$MEWuuuuu P'tEu%u$ESVj jPE Puɞ Ru#E$S PjjEPE Pu蟞 *u$MEWuuuuu P!M @EEPM HtEM MH] Uq EjPE PyIȃyE E$HEM MH] j V\uEMp0zDeEPeEPp6MYM@p,EPh:Yht:Y,V3E9{t{rff;Eu3EG;{s%{rpPEP@YY sF;srۃ{r+{VPM{}Eu u؍MHu؍EPaa詹uuuMuuuu VWMUj`E VUME uы]uEzE;Y3Az(VɁ A{QQ؍E$h:Yj(PXEMv0j0p0,VMփeM3PuEfE}EErEPEMPMPVWM(VEPaaGuMuuuuu SM =T jL VpTMEM] EEEp0;eEPIMYM=p,EPh:Yh:Y,V3E9{t{rff;Eu3EG;{s%{rpPEP >YY sF;srۃ{r+{VPMU}Eu u؍MFu؍EPaaZuuuMuuuu VKMC Rj`E V@SME uы]uEzE;Y3Az(VɁ A{QQ؍E$h:Yj(PVEMv0&:eEPHMYMu[<j0p0,VMփeM3PuEfE`}EErEPEMPMPVWMVEPaa3YuMuuuuu SM Q UL2]3ʼnES]EVuWuvh`XPWvPEj@PTPEPuVuu SWŭM03_^[PUL2]3ʼnES]EVuWuvh\XPWPEj@PcTPEPuVuu SWUM03_^[Pj0r VPM̋]ueEEF e%0N~|u ;tj_3EMȋ;u;VAu*EPQQ$ֿEȹ 3+iu 8A2jPMe\vEjPudXMЃ}rMEQQ$WPuQZSMЃ}rMPQuVuu SuX MOj0r VOM̋]ueEEF e%0N~|u ;tj_3EMȋ;u;VAu*EPQQ$趾Eȹ 3+iu 8A2jPME[vEjLPuDWMЃ}rMEQQ$WPuQ:RMЃ}rMPQuVuu SuW MxNUD2]3ʼnEES]VuWPhPXEj@PQPEPuVuu SW赪M03_^[MUL2]3ʼnES]EVuWu uvhXXPWPEj@PPQPEPuVuu SWBM43_^[vMUL2]3ʼnES]EVuWu uvhTXPW胥PEj@PPPEPuVuu SWҩM43_^[MjD VpMً}UMMG@Uu&E3PRWuu QN$,VV$E+w0M4eEPEKYM6e3EfE؀}MEEQtH,VEPH,VEPEEuMPM$| v w ;uv+u3G%@t&VuEuu PS3M @EEM }UrUuRPQEPSUVuuM @g g$PQVSE0MKUL2]3ʼnES]EVuWuvh`XPW薣PEj@PNPEPuVuu SW藪M03_^[KUL2]3ʼnES]EVuWuvh\XPW&PEj@PNPEPuVuu SW'M03_^[Jj0r VKM̋]ueEEF e%0N~|u ;tj_3EMȋ;u;VAu*EPQQ$Eȹ 3+iu 8A2jPMVvEjPuRMЃ}rMEQQ$WPuQzMMЃ}rMPQuVuu SuV MIj0r VIM̋]ueEEF e%0N~|u ;tj_3EMȋ;u;VAu*EPQQ$ָEȹ 3+iu 8A2jPMeUvEjLPudQMЃ}rMEQQ$WPuQZLMЃ}rMPQuVuu SuT MHUD2]3ʼnEES]VuWPhPXEj@PKPEPuVuu SW臧M03_^[ HUL2]3ʼnES]EVuWu uvhXXPWPEj@PpKPEPuVuu SWM43_^[GUL2]3ʼnES]EVuWu uvhTXPW裟PEj@PKPEPuVuu SW褦M43_^[&GjD VGً}UMMG@Uu&E3PRWuu QN$,VV$E+w0M.eEPEYM0e3EfE؀}MEEQtH,VEPH,VEPEEuMP\M$| v w ;uv+u3G%@t&VuEuu PS23M @EEM }UrUuRPQEPSuVuuM @g g$PQVSE۾0MEj4 VFMȋE}]9YeE3]EfE̥f!EE$fM ufM ffMfE}ȋ]j^jVMK}ErEwMSQuPȃu˃}E̋]rE̍HMrMuu RQSM8M;D USW} ;}t&VQup,Vքu;}u^_[] USW} ;}t&VQup,Vքt;}u^_[] fAjUlD33]u^FfE+E ]EtjM5|^\^eu0MP1uCt;uEPYYt8}}WETYp,V։=|^M=+j U=jM%5^`^eu=0MP0uCt;uEPYYt8}}WEYp,V։=^M =*j U+=jM5^d^eu/MP/uCt;uEP{YYt8}}WE*Yp,V։=^Mwr<]*j U<jM5^h^eu/MP^/uCt;uEPNYYt8}}WEYp,V։=^M;)j U<jMf5^p^eu~.MP.uCt;uEP!YYt8}}WEYp,V։=^MMH;3)j Ul;jM5^l^eu-MP4.uCt;uEPYYt8}}WEkYp,V։=^M:(j U:jM<5^t^euT-MP-uCt;uEPYYt8}}WEYp,V։=^M#: (j UB:jM5^x^eu,MP -uCt;uEPYYt8}}WEAYp,V։=^M9t'UVu ufF^]jU9uE Fue=Yt,9Vv ;Y7Y~X^Vv,=YY~X^UVdM @E#}uM `MF HHtM kEPM (t͍EPM u88EuM jup(,VM<:t<,t;E0PWuVuhS\ui_^[]UQeEjPj"VMp>E0tt t3j3@jXUEVu +uW}+}uM@u-;|Puu uA;t=;E/WuVuhPui_^]UQQMES] VW}++}uuLM@Eu;w?PuQ- oS{EYtaS]PWuhSTu$PPWuhS:Uu U3Ʌt}fOA;rRSY_^[UQQMSVu+uW} +}uK@EKȉEE A EMuu;wVuu, AjQjjVuhP t$;EjuWuVuhP _^[U,2]3ʼnEES]VuEԋE]EW~VS7SYEY }~ WPSYY t;EEPu V~4}r&}EtHt:r:8ujX~7}r)}Et u܊Ht:r:V8u3@O3SSVuj u VE؅/ Q;#tA=wĉEPEYEÉ]uPVuju VuSSWVj u VE Q;#t2=wYtZPuYtEt4uVWuju Vtu}VuWu ur}VY}WY jr3e_^[M3UVu~ Vu\gYYE~ PuHgYYttPuVuu u+uj^ ^]U usYtuyYt]Ã}Uu"Y]UEVH<AQAk(;tM ;J r BB ;r (;u3^]ËVt d^P;t3u2^ð^U}u^BDu2]vyu jIDY]U=^t]VutubPt&u"h^wYuh^wYt+20 ^ ^ ^ ^ ^ ^^^]jjh8L\eMZf9@u]<@@PEuL f9@u>E@+PQ|YYt'x$|!EE3Ɂ8ËeE2Md Y_^[UOt}u 3^]U=^t} uu$xuBYY]U=^uu'v h^vYY#E]UuYH]"jNYthNY3jVWhh^Vh^YVuhVVtFhd2YVVhH2YVVtt=^^_^3PPjPV^uj0h^xV^tPVUV^VVEV V^]UV^VV 2]EA 2]Vd, ^ 2]V^]RUVW^WVu>u)jdcY>td, ^ 2]WV_^]V5^th^,V^5^V5^V^UV5^tuh^h^,V$^VVju5^VVV^]; 2]uBMd Y__^[]QËM3M3Pd5D$ +d$ SVW(衤2]3PuEEdPd5D$ +d$ SVW(衤2]3PEuEEdPd5D$ +d$ SVW(衤2]3PeuEEdPd5D$ +d$ SVW(衤2]3PEeuEEdUEVX^Yt j VCYY^]VjtQPu6Ej0 ^tshN6*;PokYYuQ Xt hpFtYNNQ6PB|YElt3o76 uj 36 6P萄YjhXL\ jYJ2ۈ]eEܡ^3A;)uI ^hVhV~tYYtEhVh0VtYY^و]uYQ39>tVYt6WjW,V/9>tVYt6aY ZsVPWh@ tju Wjcsmu%~uF= t=!t="t=@t_3^]0w0̃%^h0Nd5D$l$l$+SVW2]1E3PeuEEEEdËMd Y__^[]QUjVuVh VPlV]U$jtjY)^ ^^^5^=^f^f ^f^f^f%^f-^^E^E^E ^H^^^^ ^^jXkǀ ^jXk 2]LjX 2]Lh(_YUj]UjtM)^ ^^^5^=^f^f ^f^f^f%^f-^^E^E^E ^^^^ ^^jXkM ^h(_YUeEePtVE3EEpV1EHV1EEP|VEM3E3E3Ë 2]VWN@;tu&;uO@u G ȉ 2]_ 2]^ø@h^Vhhj譄 uj̸ ^H$HHH392]ø^ø^SV9[9[;sW>t ,V׃;r_^[SV9[9[;sW>t ,V׃;r_^[á,^Vt ,V[jhxL\Et~8csmuvxupx tx!t x"uUHtNQt)eRpJE1u uCYYËet@tQp,V֋Md Y_^[UMU ]U} t2VW}7>csmu!~u~ t~!t~"t_^3]-pw-pU-@$tM9t @u3@]3]UM UVq…x I ^]UVuW>?RCCt?MOCt ?csmtr-x~g-H_3^]Y-xvN-pw@-7-XUS]V U <uW ;tN+u~B+u ~B+t3Ʌ MNB+t3 E3ɅoF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~ B +u ~ B +t3Ʌ MN B +t3 E3ɅF ;B tOB +u~ B +u ~B+t3Ʌ MNB+t3 E3ɅLF;BtPB~+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3Ʌ(F;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3Ʌj Y+;Ӄ$NF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅAF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtPB~+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3Ʌu_F;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3Ʌu3ɋ_ F;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅuF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3Ʌ:F;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅxF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtPB~+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅTBN+D3 E1F;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅoF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅLF;BtPB~+uB~+u B~+t3Ʌ MBN+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅfFf;ByF;BtPB~+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅRF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtPB~+u~B+u ~B+t3Ʌ MNB+t3 E3ɅF;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3Ʌ.F;BtOB+u~B+u ~B+t3Ʌ MNB+t3 E3Ʌ~B+uB~+]3Ʌ MM1+uqB+u qB+t3Ʌ MIB+t3 EVMu +u QF+t3ɅIF뾋Mu +uIF뤋EE 3^[]ÐפNNPN NzN$NNNN¦NNJNNaN,NNZNN˨NNNNjN&NN>N NŪN7NNNcNWVt$L$|$ ;v; s%2]%^s D$ ^_Ë3Ʃu%2]%^s vs~vftefoNvfo^0foF fon0v00fof: ffof: fGfof: fo 0sv foNvIfo^0foF fon0v00fof:ffof:fGfof:fo 0svVfoNvfo^0foF fon0v00fof:ffof:fGfof:fo 0svrovfs vs~vf԰NtIuу $԰N$NNNN ND$ ^_ÐD$ ^_ÐFGD$ ^_ÍIFGFGD$ ^_Ð4< Q%2]t׃+ʊFGNOu $NNNNND$ ^_ÐFGD$ ^_ÍIFGFGD$ ^_ÐFGFGFGD$ ^_tINOurhooNoV o^0of@onPov`o~pOW _0g@oPw`pu r# ooNO ututuD$ ^_̋ƃуtf$fofoNfoV fo^0ffOfW f_0fof@fonPfov`fo~pfg@foPfw`fpJut_t!ooNOv  Jut0tuȃtFGIu$ID$ ^_Í$++Q‹ȃt FGIut vHuYWVt$L$|$ ;v; s%2]%^s D$ ^_Ë3Ʃu%2]%^s vs~vftefoNvfo^0foF fon0v00fof: ffof: fGfof: fo 0sv foNvIfo^0foF fon0v00fof:ffof:fGfof:fo 0svVfoNvfo^0foF fon0v00fof:ffof:fGfof:fo 0svrovfs vs~vfTNtIuу $TN$dNdNlNxNND$ ^_ÐD$ ^_ÐFGD$ ^_ÍIFGFGD$ ^_Ð4< Q%2]t׃+ʊFGNOu $NNN(Nfnfp rG stb|GD$tGutt $GuD$UW}tHtBQAu+SVYStZ:^u2u3);s} Bu 9:t @;r3_^[Ë҃@t ];r;sދ}Buҋu :utZ:^uu3҃t@;r뗋EU$E SVW@3}߉}}p @u܉E}MEM4+;Ev%u61YYtFuuFu]Eu6 YYFPuYY;EU+M;MttE@@EuuF$"ЈUu&uF@ @$р"ЈUt#tFPuQYYt9Eu?EUEMCu;]ttFuۋƉEׅtEu3_^[UVu 39V|VE F^]UEU ;t3S3:utX:Zuu[u]UEM ``HD_Y]UEM ``H,~X]jhL\^Uu3Md Y_^[Ãex+wO+#+G@uuuW +U +RuWVuu9EuPE놃PVYYEnE3Ɂ8ËehL_YEPYYhL\hp_YEPYYh(}[EP3t9Ayu2uU}u ]UVuW} t N3 81FN 3 8_^]US]VWE3Eo] Cs32]VPuEu8E{ @fuZEEEECtiMGGHEtMxHMuɄt. Eth2]VVuE_^[]ËE8csmu8=0_Yt/h0_YXt50_Yju,V֋uEM }E 9x th2]V׋E VuX sM֋I+UEM ;u3]Ã:utP:Qu u]UEt=0^tPDY] ,Ã=2]u3SWV52]WYtuYj52]yYYu3BVj(jDYYtV52]QYYu3S52]=YY3VCY^WV_[Ã=2]u3VWV52]YVVG#_^hN/2]Yu2h0^PYYuá2]tP1 2]YjhM\3ۋEH 8YPu9u x ]}y t(^Et,VU EtHGPQ7t=xwpV, uV>tQGP6OYY@H9_u#tZtVwGPQ,YYPV t7t3j[C]E 3@Ëe3Md Y_^[}*jhM\UM :}y zeuVRQ]St!u4FPsYYjPvW FPstYYPvW` EMd Y_^[3@Ëe)U} S]VW} tu SWuHE,uuPu$6uuWu F@PuW1hu(s uuWu8tWP _^[]UhSVW}3WuEu E E;Gx];csm{{ t{!t {"39s9pXE@E;csmu*{u${ t{!t {"u 9s9pti@EuSp" YYuG}97;ΉuGhخ]L"MFM;7 3MMME}̉uЁ;csm{{ t{!t {"9w u WuPEPEPUEEԉU;UkM}jpEY9E;E3ɉM9MC@ E܋EU؉E}}܋~&sE7P u"NMEUAME;Mu/uEEuu$u P7EPuuuu S0UMBEԃUM;U#}3}t jSYY}u{%=!rmuG t]} uWG tXMHGwSYYt]'9w v"}u$u PWuQu S| B9pui_^[djS?YYM@hM\EPsXMHE$uE SPWuu W8P%U8S];VW39xtFWV9pt3;MOCt+;RCCt#u$u uuuu S EE}9x u PuEuPEPUE܉EU;UkM}jpEY9EN;EIMԋEHtyu.@u)jju$Mu QjPuuuu SU0MBEUM;Ur_^[x$UUSVWBtvH9tn} tua_3;t0C:utY:Xuut3+ttEtt tt3F3@_^[]USVWuYM3U"9p u":csmt:&t#;r A Bft&9q9uQuu 7 9q u#=!r9qu;rhA t^:csmu:zr49zv/Bpt%E$Pu uQuuu R,Vփ u uu$Quuu R 3@_^[]UVu2V_Y^]aaA_Y_YUEPAPXYY]j u%YËeeuuE';uu6Vuu Md Y_^[Ëuwx~lHBUSVu W>3ۅ~qEӉ]@@ MEȋEME~;F‰EUr1Pp uEMHEMEUEUu_^[UuMU ] UuMuU ]UE@]USQE EEUuMmVW_^]MUuQ]Y[ U,V=@td E;Ar;Avj Y)]U,V=@td E@;Ar;Avj Y)]UVu>csmu.=0_Yt%h0_YUYtu V50_Y,VYY^]USVWUjjhiNuēV]_^[]ËL$At2D$H3语UhP(RP$R]D$T$SVWD$UPjhqNd52]3PD$dD$(Xp t:|$,t;t$,v-4v L$ H |uhDODe뷋L$d _^[3d yqNuQ R 9QuÍISQ2]ISQ2]L$ KCk UQPXY]Y[UM3SVW}] It+;t-tP ;r H;rVWLt\@$ tS֋st5+;t)P ;r H;rVWt @$ t֋ s_^[]_^3[]Ujh0N\h0NdP8SVW2]1E3PEde}_]TdHM;r ;X;W UE3ɋË0t;xt uuA ;vօtG;E;}3 ^I;4X^U܋\^E;EPuSUR' E@M+PQE^9 ]D$T$ËUt$ZL$)qqq( ]UVWS33333[_^]Ðj33333IUSVWjRhNQēV_^[]ËUl$RQt$ ]UQSVW}8 ^0Ettoi,iYhjS(Vu<VWu!jhiYS= t VVS(V3u MMƇtV0Vu;} n3_^[ËUEVWt)\tuuuu u,Vփ^]u52]u35X ^uu uu.3PPPPPËV3VVVVV}VVVVVjVtjY)VjVj VVPlV^ËUV52]Wu3=X ^YX ^ϋ_^]ËUM3; jYt'@-rAwj X]ÍDjY;#]ËjY]ËUVMQY0^]=u2]Ã=u2]ÃËU^VW|zu֋} j X+#;s׍ 2;t 8t@;u+;+ȃ;ttu ;uE 9tA;u+w|ru֋} jX+#;s׍ 2;t 8t@;u+;uU+ȃW;tftfu;uE 9tA;u+UʋE ;t 9tA;u+_^]ËU^VWEt3f9t+j X+3#Eȍ)]UfMftf9t]9u2ðËUM A=w EH#E]3]ËUMVt0U1B=w P#E *~~ Qu R03u uP ^]ËUQjuQQu uP" j3ËUQjuQQu uP j.ËUE\ ^]ËUV"tu,VYt3@3^]j hPN\蕠ejYe52]΃35\ ^ΉuEƋMd Y_^[ËujYv1tj1Y3]t"jVtjY)jh@j j\̋UQQVuu,SWSh?F5EYYM#f;uHQQ$34YYt&t!tEVW\$$jjDSW4EYY^Dz8QQ$2YYt%&hkYW\$E$jj]EVQQ$2SW]4E_[^j hN\eE0CYeM uEƋMd Y_^[ uE0BYj hpN\蠞eE0BYeM uEƋMd Y_^[ uE0BYËUQ}ujS]VuW}u u u3qt t Ee9}uAEu$u u;vuƒu8"uMËUQ}uS]VuW}u u u3st t EeQ}uCEu$u u;v>CPVu utGy3fu"_^[WVu u3ɃfL~uu8"uMU2]3ʼnE}ES]uzttVWu|yM33ҫ ‰u uƅu Puu QP etKE3Ƀ tuum;u*x);v%Y tKty ;tK  t |P_^M3[MÅuŋ;uj^L벋U2]3ʼnE}ES]uttVWu|M33ҫ ‰u uƅu Puu QP etQEtuut;u.x0;v,`tQty3f;tN3f G t |P_^M3[ɉÅuŋ;uj^3fD_믋U2]3ʼnE}ES]uuttVWu|tM33ҫ ‰u uƅu Puu QPetKE3Ƀ tuum;u*x);v%Y tKty ;tK t |P_^M3[HÅuŋ;uj^L벋U2]3ʼnE}ES]u ttVWu|M33ҫ ‰u uƅu Puu QPetQEtuut;u.x0;v,`tQty3f;tN3f Gt |P_^M3[ĆÅuŋ;uj^3fD_믋U}u]Vut:}v4u uuuVu uyu X" K6^]ÃuËÃuËËUQVuWv 2SS39uv;w1V+EYtEPYEPg+Y[_^UQVuW?vr 2TS39uv;w1VK+EYtEPEP*Y[_^UEHtt t} tEJ3҉N(u ؍B0ȃ9vE4fȋF4ffF4N4+~8F4_^[] U SVWN@u] H}ω~4}V( t=SjuBSWF(6][0ڀ9~ E4ȋF4N4N4붋}+~8F4_^[U SVWN@u] ut_^[UQSVWw u gw M&Gej QPM G u3G 8"tE;GrG2>ut_^[SVH!t39^^[É^8^F9^vF1P`Ftw$;OEN(^$^0^ ^,^<8'^(!p7jFF1kFPPJF? O O O O O O O OSVHt39^^[É^8^F9^vF1PFtw$_OEN(^$^0^ ^,^<8'q^(!\UjFF1kF< HPP;F0OOOOOO OOSVHt39^^[É^8^F9^vF1P(Ftw$sOEN(^$^0^ ^,^<8'M^(!81jFF1kFPPJF?OO OOO$O-O6OSVHt39^^[É^8^F9^vF2PFtw$OEN(^$^0^ ^,^<8'c^(!INiFfF2fgFPPEF:IO O"O+O4O9OBOKOSVHt39^{f^[É^8^F9^vF2PFtw$OEN(^$^0^ ^,^<8'G^(!-_iFfF2fgFCPP6F+ O)O>OGOPOUO^OgOSVHft39^S>^[É^8^F9^vF2PLFtw$O{EN(^$^0^ ^,^<8'^(!7oiFfF2fgFPPEF:IHOQOfOoOxO}OOOA1 t-t"tHt uI I I  I I A2 t-t"tHt uI I I  I I wu2ðu2ðu2ðuwb2ðËUQVjt#F1HEutFN^ËVju^ÍFPF1HP^ËVF2HPF<ztFN^ÍQA<RQ2HRËSVh^1PFF<0 t=SHtFNF@N1FufQ2^[SVh^1PFF<0H t4FPSHF@N1Fu2^[y1*Q(tRÃAA@y fy2*Q(tR8ÃAA@y ÊA1t6;Ct?DvGSu 2jj\Ztt[HuSы?ȃpwUtGerăgv1itntou 럋 떃N Sj 놋z ns^Ht̓^Sa8^0Bˉ]f]3ҋ^ BWÉMj _t0tj-tj+XfEMt f}ʉUV2jx_f;tjXXf;u t2ۃat jAXf;t2E0ut%EjXfDMXf;tjA[f;uf|MM^$F+^8H+F uPSj WMF PFPQEPN tuFPSuWzjN9|F t QSj WR_M^3[=fËU2]3ʼnESV3jAZjXF2Ydwk;w>t6;Ct?DvGSu= 2jj\Ztt[HuSыȃpwUtGerăgv1itntou 럋 떃N Sj 놋8z' ns^Ht̓^Sa8^0Bˉ]f]3ҋ^ BWÉMj _t0tj-tj+XfEMt f}ʉUV2jx_f;tjXXf;u t2ۃat jAXf;t2E0ut%EjXfDMXf;tjA[f;uf|MM^$F+^8H+F uPSj WMF PFPQEP@N tuFPSuWj N9|F t QSj WY_M^3[cÀy1*Q$tRÃAA@yI ؉fy2*Q$tR,ÃAA@yI ؉ËUE w  &O$%O3@]jX]jj3]ÍI%O%O%O%O%OSVWFFxt._t'v,F1Pv6^4tF<jF4PPESP2F ([t~(u vv4MYYF1ut^[U S]VU3u ׳U3]M &E KM;tTW}P:u&Eu 藳M8*u"Mj?tU;]uE_>ut^[U8EMUEEEEE܋E UMEu ÅtEMEȍEE̍E܉EЍEEԍEE؍EPEȉMPEPMËU8EMUEEEEE܋E UMEu蛲膱ÅtEMEȍEE̍E܉EЍEEԍEE؍EPEȉMPEPM ËUu$u uuuuu u ]ËUu$u uuuuu u\ ]ËUu uuuuu u)]ËUu uuuuu u ]ËUu uuuuu u_]ËUQHLMMQPGEYYUV3PPPPPPPPU I t $uI t $s ^ËU}SWt?M3Qff;u+YPYtuSW u 3_[]3PPPPPޯ̋UVu W}+u+ft7+t_+^]ËUMu3]S] VW}Bw 3Fw ƒ+u tu_^[]ËUEf;s MځYtE ]u PYY]ËU= ^u)}uӯ辮]Ã} t];juu u]ËUW}u苯vS] uiTVuu3vuMREuVSW >MQPME[QPU+u tu€}t E샠P^[_ËUVuW} Aw Bw +uu_^]ËU= ^u)}uwb]Ã} t]ju u ]ËUVuu2W} ukuME􃸨u WVYY5SMQPMvQP˃+uu[}t EP_^áh ^Vj^u;}ƣh ^jPjl ^- =l ^u+jV5h ^jl ^ =l ^u^W3p3]jhF P l ^4ǃ?k8H ^Dt tuF8G4]u_3^ËUkE8p3]]̋V93l ^4l ^Y PxV u5l ^>%l ^Y^ËUMuR=jX]ËU tAEtUtA3]ËUE PV]ËUE PV]j hN\[eE0YeM 4uEƋMd Y_^[ uE0YËUQVW8WE0F 0F0F0Wu4_^ËU S] VWtut}u23_^[Ã}t3;w؍G EtOމMUG t@Gt9G GE;sƉuPR7oE )G+k;rlG tWRYMƅt 3+‰EurjXEPuW6YP Ѓ tSM;w+;rBM%WPYYt5ON3M3AM@UЉUEEjY +3ҋu U} t}tEu趩表3ÍMEMMEEMM PMEPMEMPMjhN\(YE0@Yeu v0YYt2F8u@ t0SYtFF EMd Y_^[ E0Yj,hN\XE0Ye5l ^h ^} u;tOE7PYYt7WO}}ĉEȉM̉UЋEE܉E؍EPEPEPM} EMd Y_^[ E0迈Yj hO\WeE0YeE 0?YuEƋMd Y_^[ uE0YËU eEeMEEEEjEXEEEPEPEP}EuEËUEtH tQu E 2]ð]ËUE$<uEu Et]2]ËUMVWq $<uGtB9A+a~1WPQ~3YPG ;t jX tjX!3_^]ËUVuu VY/VYu!F tV3P YYu3^]jYËUEEu PYË@ Pu3ÍEEMEEEEPEPEPËU2]3ʼnEE ȋU?SVk8WUMH ^uDuEuГV3ۉESMM}3IM}};uEՋE]EH ^EЁ-U.‹ˉE8tA|}E+M؅ED.P5]@E+E; Ӆ~uDB;|EЋ}܅~uЍEWP-jM؃ ~!U؋uE >GH ^\.;|}܍E|E|3]}Q@EPE?P5]AM;}3ttx}@QEPEPEPEHMT-tD.EEEjT-EPCEfMf9H},GE;E5jEWP I}jWEP} ,SSjEGPu؍E}PSu E̅SMQPEPu Vu+uEu9E} u4j XSfEԍEPjEPu V}EFu;}M~&u܋Eы H ^3CD .M؋U;|u}uS~u܋EӋ H ^3CD .U;|΋UM]H ^\.H ^L-FVE8]t EPEuM3ͥ_^[tBËUQSVu3W} EljE;s?SYf;u(F uj [SjYf;uFF;}rV_^[ËUQVuWV YtU?k8H ^|0(}<@LuH ^|0)tEPH ^t0ԓVt2_^ËU ZE2]3ʼnEM U?k8S]H ^VWDMщ3;ss;sA< uC FFE;r䍅M+jPVPW VtC;rM;rVM_^3[@ËUD2]3ʼnEM U?k8S]H ^VWDMщ3u;s% u Cj _f>fE;r׋+MjPVPW VtC;rM;rVM_^3[?ËUC2]3ʼnEM U?k8SVH ^uWDM3;P;s! u j ZffM;rjjhU QP+PPjh u tQ3ۅt5j+QPP Vt&;rˋ+EF;FVM_^3[>jh0O\gNuu膞 葞 ;5H^ƃ?k8MH ^D(tiVxY}eH ^MD(u-  uu VQ }E )u}VYӝ ޝ ɜMd Y_^[ËU(ME EMSVuWu 肝 荝xƋ?k8UH ^}\:)tuШtD:( tjjjV 3}V Yt?t%ˀ]uESP u]ESVPMUH ^|(}EË]t*tuluESVPuESVPuESVP뢋L}؋]3jEPuSQ Vu VE؍u؍}䥥MUEu\Et*j^;u3 0PYH ^D(@t;tߛ h+E3_^[ËUu MEPju }t MPËUu M誨EPjué }t MPËUu MtEPju荩 }t MPËUu M>EPjuW }t MPËUu MEPhu }t MPËU= ^tjuYY]ju5H4]軨 ]ËU= ^tjuYY]ju5H4]芨 ]ËU= ^tjuYY]ju5H4]Y ]ËU= ^tjuYY]ju5H4]( ]ËU= ^tjuYY]hu5H4] ]ËUu MצEhu0ʧ }t MPËUQSVuWV‹#f;u&u3f9Fuf9Fu f9u@jXu3f9Fu f9Fuf9t3++E f3j5Zf;3FffNbfEDlYdlY Vf#3ȉEf Vfȃttuf N3fFf N3fFf 3f3fH_^[ËUMVA#f;^uu3f9Auf9Auf9u@]jX]éu3f9Au f9Auf9u]3f]̃=^r\$D$%=u<$f$ffd$Ã=^\$D$%=u<$f$ffd$]UEjPYY~~0EjPYYftEEt%V]V]E]ËU= ^VuH}u1>} t9uv ^]juu u^]ËUW}uɖ贕S] u觖蒕|Vuv脖oXu3PuMtEMGU C+u tMuـ}t M샡P^[_jhpO\EE01vYeM *EMd Y_^[ E0LvYjhPO\}E=| ^3@t ^3ۉ]u,=2]σx ^;t3SSS,Vh ^ u h ^GYE9uh8Vh$VYYh@Vhuu 9~ u jujF3fWWjVj u uVP轒Y4} ;G v Pu w wjVj utHG3_^]ËUVuuM 3S3f9u%u 9^ uj%F3^zSSSSjVSu uVPY?MW} ;G v Pu7SSw wjVSul uVPɑYHG3_[^]ËUQuEPu uoËUQuEPu uËUjM賞E9Pt 3҅uB}t MPËV~t v/YF^ËV~tFCj"Yf F^UVW}V?PFP t f F F3~ _^]Uu YM ]38AtAAA AjhO\s@uu覐葏3f} t?t>u 聐ލEPY}u deeuuWV6uEƋMd Y_^[Ëuu uYuYjhO\?uuڎ3e} t3f9tf9u ȏ܍EP:Y9]u 謏]]uuWVuEƋMd Y_^[Ëuu uHYuJYËU]U]4Uj@u uk ]ËUQQSVj8j@3ۉuYYuK;tAW~ ShGPlO8_̍GG G g_ֈ_;uɋu_SY^[ËUVut%SW;tWxV8;uVKY_[^]jhO\)>} r!Zj ^0FƋMd Y_^[3ujdnYuH^}9E|94H ^u1H ^uj ^uE뢡H^@H^G뻋ujZnYËUEȃ?k8H ^PV]ËUQSVuxi;5H^saƋރ?k8H ^M|uCWY} u"tt uWjWjWjؓVH ^M|3_6  ^[ËUEȃ?k8H ^PV]jhO\VC.V&EPV벍EPVVaV:Yj Ztj Xf9tu3f9FjhlYW j [f;u f;tf=f9tjhlYW u j :jhlYW u jjhlYW u+jX f;u If;tf/mX_^[ËUM@t2]Ã@]ËUMt2] ‰]ËUMt2] ]ËUE 8t2]ËMI]ËUE 8t2]ËMa]ËUE 8u%U u JJ]2]ËUMt2] @]ËUMu2] ]j hP\4eE0WYeE 0ƃ?k8H ^D(t VY uEƋMd Y_^[ uE0YËUVuu蒄 蝄 axE;5H^s=Ƌփ?k8H ^D(t"EuEMEuPEPEP4 ? *^ËUVW}WYu3NH ^u u u@`tjjYY;tWYPVuVWYσ?k8 H ^D(t VhY3_^]ËUVuu}j^0iSWj Y} uXj^0D-S39_|9rjX9G|?*Xv%j^0[_^E]P]]V YEPp YEP Yы_ ÃwnrAPwdE+ȍEPډMV]YYt9EtVYeE)EEPUVYY>F ;WVYY!}tVUYtEEF E+jj<SW'y <ĉjjFN j[F VVхF NF mFV3SSSSS'̋UV tuVWYY#^]̋T$L$u@:u2t&:au)t:Aut:auuҋ3Ët:uttf:u΄t:auńt넋USVu 3W}ƋϋjЋ%؋Y%j؋%؋ыXً_^Ћ[]ËUUV##^]ËU VWWh?EYYM#f;uvQQ$YY~:~nu0E]E\$E$褲WV]NEsEVV\$E]E\$$jj?DzWVEYY)EPQQ$M Uy +;|Z+; = =~-PQQ$ V\$E]E\$=}%V\$E]E\$E$jj|=}&PQQ$! V\$E]EPQQ$WV]V\$Y$3\$E]E$QQE$jjR$_^ËU}SVWt}t}ul}W|3_^[Ë}u t 3u9Ev$tVjuTM t3u9Ew׍B EtBEE}}EE]ωM/B tFZt<;sًE;MS2PQUM+)Z)]]E;rTvt 3ҋu+ʋU;wnBbQMQRYP؃ tzMxhU+)])RYtht+MUMBIKE]3C]MtP]tVju L {"oEjZ + EjY +}3uQEIUuuu ju]j h0P\@+}t2}t,uu7} tu Vu{K R{=z3Md Y_^[ÃeVYeVuuu u}E 뷋u}VYËUVuu3mEuzj^0ySW}t9u rVWP? 36u jPJ u zj 9u szj"^0nyjX_^]ËUVuu[zFyRF W t9VVpVPgy~t vٿfYVY_^]jhPP\)uuuyx uC;uɋ_^[]ËU]U]UEuqs\r]Ë@]ËUSVu3WjSSVjSSVWM G+ȋE‰wGljW O_^[] U(S]MVWuu SE#E܃#E#EE}Ejh[YYu r zhSYEEY|rPVS t++E‰E|uuSΉV 3zr8u #r rV8YU|sjuu S#ƒt,SYPVuq qVq8juuuR_^[ËUU jy RuVYY]ËM]j hP\*!u u]qHpeV#YeF VYt t?k8H ^5]5]ً?{)utt k8 H ^A-t(pojMQh2]j UVuYY}ENjMd Y_^[Ëu }VdYËUSVu WV  usV5]YttЋȃ?k8H ^ ȋ߃?{)utt k8F u)W胯j@YYu p ^h@WShWPF0_^[ËUEM MEAEM EHE`3]ËU MMuhgËEt t@uڅt@u E=wčEMEEEEEE EEPEMPEPMX̃=^\$D$%=u<$f$ffd$g~D$f(mYf(f(fs4f~fT0mYffʩu"=|Yf=2 fL$D$D$~D$ff(f.zf= |!=2 fTlY\fL$D$f mYfV mYfTmYf\$D$̋L$ WVSًt$|$u 't+t/uuatt7uD$[^_tuutu[^D$_Ét~Ѓ3‹t܄t,tt uĉ3҉3t 3uwD$[^_̃=^\$D$%=u<$f$ffd$~D$f(PmYf(f(fs4f~fTpmYffʩtL= |}f=2  fL$D$f.{$T$ ԃT$T$$D$~D$ff(f=|%=2fT@mYXfL$D$mYf`mYfT@mYf\$D$jh0Q\[p te,V3@ËeEst̋U2]3ʼnES]|VuW} hjP4Vu|WSh@POh |hmYPI0_^[ttűM3dj该Yjs̋U(2]3ʼnEES]VuW} h,nYEWVZl hpYWV lhPnYWV Uh PP3 3PSjV؍S#QPVuhpYSPk ˍQff;u+A @v/M jhoY+ȍQS3SWV {hpYWV dhdnYWV MʍYff;u+A@ڍKff;u+Dž\3ADZf;t3z<_f/t;sAf;u} +&vIsAj5X+PRWVNhoYWV yHP&j5X+PRWV>hoYWV '+XPWVg hpYWVP htnYWV9 3ۍQff;u+ʋZff;u+Ӌ+j PVPuphpYWV thnYWV ]3ۍQff;u+Yff;u+;+ƒPWVhoYWVE pYSWV- hnYWV SWV hoYWV yj#RWV1uwhoYWV udjHPWVuDhoYWV u1XRM_^3[{3PPPPP^̋UQQuu uj蘲@ ujjjj}YP3jjEbEEPE PEPEPEPj?P耸$tn̋UE0E0E0E 0E0']ËU2]3ʼnES] VW}jܓVtmtiVȐVu]u|SWhmYh@PP_x;|3Qff;uW+ʉxxPQ|PVVuM_^3[m̸mYËUuuu uy p0*]ËUVujuYt#u stVuu u^]uu u3̋UEPju u}]ËUSVWtM~@3ۅujhSF@2~@ t%u2hPhW_uF@@pY_^[]SSSSSA\̋UVu;0r0^]ËU]\UQEjj QQjacËUQEjj QQjaaËUQQM3S] VW]E8EtC-E3@ىE]u]3ҋuj ȋCEX;$'0‹UFEt;rϋ] ;ur.\j"^0[OF;r3_^[ËUQQM3S] VW]E8Etj-XfCE3@ىE]u]3ҋuj ȋCEX;'0f‹UFfEt;rˋ] ;ur3f[j"^0qZ3ffff;r3_^[ËUM VuC[j^0/ZOUSt$]3f@;w [j"uF"v[j^0YSVRQu[^]ËUQ} u }E|Euuju uE ËUQ} u }E|Euuuu u+ËUEM 3 A]ËUM EI ȋE% ȋE3]ËUE3 MVu   E% Ep3^]ËUVuW} t7uYX]uMfEPQQWVP]g^ EPBtu |Y"}E]t E胠PE_^ËUVuW} t7u:Y%XWuM5fEPQQWVP]] EP'tu X"}Et E䃠P_^ËUQQE EEPuEYYËUQQE EEPuEYYËUQQE EEPuE,YYËUQQE EEPuE,YYËU2]3ʼnEEVutu#XW3@"QM QPVQPU^tM M3ËU2]3ʼnEEVutuWV3@"QM QP*VQPU^tM M3WËUSVu WNe}] C@WjPM^e uUM-Ut+u @MIbiYN=n43ۈ]0u4>WECE_A^ [];ы+;|"u A4 >;9u H;}sBE ]̋4LƉuЉMt + }+ljEԅt'Me uЃvu MԋD E3EU.]EȍK MčK M;EwA3Q EEEMtI‹M3UMM Ƌu}EurEEMԋD EuSjuPRc][3‰]E]Eu܅uv*juЃPS3u܉]]EEwPrwIPS3ɋ MjuM;r)w;Ev"E]}ЉEUEu vE]uM33tUE ]ăE܉MEEeȋEe3;s+E܃mEu]M3;wFr9}s?t4u 3ۋUă v3RNˉJ؃u]UEHEu3UËM]mJ}EEHUEȉMM]A;sSR@;r t <u uE_^[]_^33[]Àyt ø3ËUju u ]ËUju u? ]̃=^\$D$%=u<$f$ffd$6jYËUSVWuM2E33MzBuL+׍yAu+σMFrЍC]P|kYtq3ۋEM:AF4+PV)] uj΍QAuE+MA:Ft+PV\ u7΍QAu+Crjj}Yt M胡P_^[3PPPPP#jYËUSVWuM1E3j _hENЍQAu+ʋBEBu+U ؃uύCPijYt{eE:FpЋ+@PV\ uu΍QAuE+:F0+@PV[ uG΍QAuE+MAEM rji}Yt M胡P_^[3PPPPP"I#Ujuuuu u]ËUDSWuM0E3ۋHEMt} t 9]t9]uL#7"QEԉ]Pu]؉]܉]]]3 uc?VPiYtJuuuuWV)t0EuEEčEPV}}ȉ]̈] #]VhY^}t uvhY}t M샡P_[ËUjjuuu u]ËUQQVuu["F!3^Ã} ueEePEM->Ձޱx|=GsSSjhQP][kd3V@[N랋U3W}jEP`YY_tUEMtQj hPQ\aeE0uuYeM 4uEƋMd Y_^[ uE0JuYËUQSVW8W]uE0F0Fj0uN3Wu;uC_^[ËU}u ËE tH V uoWPF5]YttЋȃ?k8}f}uEf%tfMEHMEa9]]ȃ#u uEfEt fOuuMRQMQuPEPEt"MU^t] 3f+]4t3fuu "}t M؃P[^_ËUUVtM t uu3fj^0^]W+>fftu_u3fgj"3ˋUQSVW493ۋʍ;t}99t ;u˅yu 3Y@uFEE FyB$PlX ;u^9wGt>9t/9t 9t9ubXQJC<9t/9t 9t9u FPj,VY^qY,V׋EYF3_^[ËUS]u3Vttj^0Wh ^3VWV<^5(^Etf98uƉuM}QM}QWWPjuu8 u mj _82EPEPEPVuvuEH,^Ƌ4^JE}PVŶYYtE&Uϋ9:t@A98ulj ,^E߉4^P:Y}V:Y_^[ËUEMUVu W}'tu S2E E j"Xf9u Ãt ffftuf;Et f;Ej"Xuąt 3fBEft]f;t f;Euftu Ej\^3Ef;uCf;tj"Xf;u*u#Etj"A_f98u EeE}tKtf2ft,}u f;Et f;Et}t tfcu t3f [t&E_^ËUVu?s9M 3u;s*M;vjPJj8 3^]ËU] ^u"9 ^tt u ^3Ã= ^t3VW{u$VxYu ^3 ^jH8YVA8Y_^Ã= ^t3VWLu$VYu ^3 ^j7YV7Y_^ËUQQS]3VW<=tB΍yAu+FuBjPIYYtn}RˍqAu+΍AE=t7jPaIYYt1SuV~) u@Ej0EX7EY؊uW4j=7YY3j27Y_^[3PPPPPp̋U S]3EVWft3j=[f;tB΍yff;Eu+4NfuՋ]BjPHYY}ft|Ћˍqff;Eu+j=AYEf;t8jPZHYYt7SuV uFE0E3PP6EYCfuW'3W/6YY3P%6Y_^[3PPPPPc̋UVutW P5YuV5Y_^]ËSVW= ^tmt\3SSSSjPSSEZ؃ tNjSGYYt7jjSVj73SSZ tSVSS|5 u3 Vf5Y_^[ËUVW~MV,VUY;u_^]̋UE; ^tPY]̋UE; ^tPY]6hO ^hO ^t5 ^5 ^YYyj hQ\蘞eE0YeM uEƋMd Y_^[ uE0 Yj hQ\=eE0YeM 4uEƋMd Y_^[ uE0YËU ESVW02]ȋ~3؋v33;+;wƍ<0uj _;rjWSjE3Mu$j~WSjEk3MىE42]}ωE+ǃ;#t}3@9I;u}E@0lSd] GPR V AE  A3_^[ËUSW]8u2]V733υU}u;rT;Et3‹UȋȉE,VU2]ʃ@33;]]]u;EtuE뢃t V22]YPP3^_[ËUuh ^ZYY]ËUjEEMXEEEPEPEPËUMu]Ë;Au 2]AA3]ËUEEMjE EXEEEPEPEP ^H4]h ^~$ ^rY+̋V52]VVVB,V,V6W^jY̋UQh^M]̋V5@ ^05D ^35@ ^050^5D ^~054^50^m054^^ËUVuuW7]9>t 6;0Y>_^]h8YhYYYËU}t=l ^tC]h8YhY8YY]á ^ËUE ^]á2]3 ^ȅËUE ^]̋UV52]35 ^΅u3u,VY^]ËUuY ^]á<^u ^Vj 2^f;w ft't"uƒf;w fu^ËUQE SVu+ƃW39u #tEt ,VUG;u_^[ËUVuW>t,Vׅu ;u u3_^]ËUMujX]á@^3]ËUE=@t#=t=twjX]ù@^3]ËUQESVW?k84H ^D(\)ȁMM @tPt@t$tuB D(H ^D). D(H ^D)$D( D( H ^D)}uu@3H%_^[jhR\WeM bEMd Y_^[ EPjhQ\E0yYeM |EMd Y_^[ E0Yj hQ\ŖE0,Ye ^H4]u$ ^t9>t WV2YYEMd Y_^[ E0&YËUEU SVu3WjUGPPRV7W_ 脵u _^[] SSSSS|̀y uqA1PjUPNu3PPPPPL̋U VWhj=j2+ t:MEGEGEG EGjEXEEEPEPEPe_^ËVFpL0"F0F 00c NFt?5]Wf83Af;:uftfxf;zufu3 _t ^0FLP0}F PuO6]uFpLh ^X ^YY^ X3] 4]@ 5]Ë0(0TYY^ËUVu ujUFPP賳uu u^]3PPPPP̋UVu uv6uu F ^]3PPPPPk̋U}SWt@jUuYYUs- ]Q%*YtKQuQWu 3_[]3PPPPP 3 ^@̋U jXEMEEPEPEPËUVW}Wu u 3uFf90tPhYju uf97tWhYju u_^]VVVVV\̋UQQSVW}3hSW>u fu3j.Yf;u-Ff9t%jPjPfhYV]1YYj,Z FMMu+@PVj@W覱j.Xf;uK3@Iu@sv_tqPVj@u`s[ftf;uQPVjPOuBEj,Yf;fu@hYVEvYYj,ZE_^[3SSSSS ̋UVUjXP@t3t6ttP 6]^]ËUVu tEt;tWj.Y` PoY_^]ËU2]3ʼnEES] Vu3W}pf>C u,f9Fu&hYuS: T6PPuH,"H($W 3ҍOff;u+sr΋ff;uftfPf;Qufu3n$ff;uftfPf;Qufu33A3ۄ0VPYYuy0ۋ,PSPt tY(0PhSP Qff; u+APPP Ge,VJ?Vt0 GWV(hScWV0P YYlPP>Xf0fȍAw j8ZuuA2Aw tu*4Aw fuf96u f8t)f6-f98f: PP YGWV(hSjPQff; u+APPP\3f9t$9sWVP$ t S$3f,Su u"3؍WËM_^3[}3PPPPP̋US3V9]~"W}7u uLhf~C]f~_Rh|YV^؉4YY.+<j;Xf9<ąYDž@WV3 u Qff;0u+;t@ Y~Ë4hYSq8YYu j;Xf9@_VShPu6=b3fP@WWD tADD4sftf34PjUHPhPV3ɍW D f8f;98u3f8t'fPf;QfBDufBu3ɋ3Ʌt,PVWlD tC3 3ɋ<Cf0Df;18u5f8t'fpf;qfB8ufBuDucQff;Du+A4EPF(Y  >, OQ4@P. ZfC@>ufu DHPlYD0ы<ΉG@F 4F$Gtu_u j"3SVL$ T$\$tP+t:uHt:Bv4u%=wڋ;uӃv#Ʃt3^[^[ËUEu]ËM UVt2ft f;1u +^]jh0R\vE0)YeE @HEMd Y_^[ E0?YjhpR\pvE0צYeE HHtu7]tQL YEMd Y_^[ E0ԦYjhR\vE0lYejE 0YYEMd Y_^[ E0YjhPR\uE0YeM A00YYEMd Y_^[ E0%YËUE3AjCHEYEPEYj@H7]EfHlEfrMELEEXEEEPEPEP&EEMjE EXEEEPEPEP̋U}tuu YY]UEYt Q EYp< Ep0} Ep4r Ep8g Ep(\ Ep,Q Ep@F EpD; E`- $EEMjXEEEPEPEP{jEEMXEEEPEPEPËUVu~Lt(vLUFLY; ^t=H4]t x uPkYE FL^tPܞY]ËSVWV@4]tP\!t ux3ۋt@4]jP}!thdj*YYu3S5@4]W!S0 YW5@4]B!u3S5@4]0!Wh ^Wj VV#t_^[̡@4]VtP ttxn@4]jP tehdj}YYuP5@4] VY؉]؅ug3VYYu8#؃2ɈME܃et jCYMeEeE܄t2]ʃ3ʊMUUԃEul;t tu&CEЃc;u>EU;u"kY k Y ȉE;t` 2]M܉E1}um;u9pWM,VUY-j_u]؋UԉU}t j蝝YUV,VUY;t tuEЉC;u &M̉H3Md Y_^[ÄtjKYj )̋UE%]ËUEVDz 3Wf}ǩuzM UuthپS3AuCEuɉM yM NEtf}Uf#f}[t fEEjQQ$1 #jQQ$ _E0^]ËUQQMEE%] fMEËU} Euu@]Á} u ujX]fMf#f;ujf;uE utj3]jhR\k=^|[E@tJ=5]tAeUE:E8t 8t33@Ëe%5]eUǃ࿉EUMd Y_^[ËUQ}EËUQQ}M Ef#M#E f fMmEËUM t -(Y]t-(Y]t -4Y]t ؛ t]ËUQ}EËU}t-uj5l]ȒVuV VP肹Y^]ËUVuw0uFt VYtVj5l]̒Vt 貹 3^]ËUSW} ]?uE 3fVuMvExu!h4 ^SWu7&uMtf3FEPP4YYtBu~~);^|'39EPuvWj v>uu ;^r0t*v339E3PuEFVWj p>u藸*}t MP^%4 ^%8 ^3_[ËUjuu u]ËUW} u9}vEt!83S]t }Vv j^0uME3Hu,EuPEPWu+ t~?躷069u\fEf;v7t9uv uVW讇 腷j*^0}t M胡P^[_Åt9uv\tҍEuPVuEWjPVQ! t 9uutVzut9uv uVW( j"^0pUjuuu u]ËUE3VW8P#;u;ǁ u@,;|;s ;u ;ujX# tjj3_^]ËU83W}ySVu Mu(`G 9Ew>j"_8*]K%=uP3Pu$PWuuuVS$t~jeVYYtM P@3W3; |;s-FKE V4EEU܉E3 j0XuC % uME13ɍruu E̋C%Ew9 j0ѹXEUM~P#‹S#ыMNj0Yf9vEUMFEOUMEfyufxU#‹S#ыMfv5j0F[ftFuH];Et9uM:@~Wj0XPV| uE܀8uuE4PS聊3E+MPUx r+ j-[Xj0X3;|(;rSPSVQ][U0U܈z3;u ;|#drSPjdVQ][0UU܈G3;u ;| rSPj VQv][0U܈G30G}^[t MȃP_ËU VuW~G;ErEPuEPEWp09MtM3}-+3+ȍEPW} Q3Ƀ}-3Ptu(EjPu$u VuW _^ËUVW}~3 9E w蒲j"^0~_^Su$M苿U ]t%M3P39-Pu SU E8-u-s~FFE􋀈ƒ9E t+E hYPV [uvN8EtEUB80t/RyF-jd_;|™Fj _;|™FV}u90ujAPQ6| }t EP33PPPPP蒰̋U 3VWu}uE}PEWp049MtM3}-+ȋu EPEP3}-QP<tu EjPWuV_^ËUMSVWuUu}JI}t;u3:-f80:-u-_BjSu W30@؅~NjSu WECE@y%؀}u;}VSu WyVj0SM}_^[t EP3ËUSVWu3}uE}PEWp0קE3ɋ] }-HE49EtE+MQWPVtPEH|+;}'9E} FuFu(EjPWuSu(EjPu$u WuS _^[ËUQM U;s Ej XÄɋMt -AtJESVW};4@YFEFu+u;C4@YRQ _^[u3PPPPP̋UUt&VuWyAu+ύAPVP0y _^]ËUQQVW} usj^0_}v}tރ}v؋uAtEtFt EGuEE$S]u9SIYt.39K |9 sEMuuWuPE$tjjXa(t Atu,Puu uuuWS;Ueu,t6tPuu uuuWSt/u uuuWSPuu uuuWS$[_^ËUE @yu EP YY]ËU fE f]ËU2]3ʼnEW} G tWuYYSVWb95]Yt0WQ9Yt$WE9W:9Y?Yk8H ^Ê@)<<W 9Yt.W9Yt"W8W8H ^?YYk8ـ{(}FuEjPEPRu&39u~D5WP:YYt F;u|fE WuYY^[M3_KË 2]39 < ^ËUSVuWVL8PYYjYj[;u@ ^SY;ujD ^p ^N uR u-hxj5YYuN^N^FFF2_^[]ËU}t-Vu W~  tVY!3FF_^]ËUHEPVf}S]V3CƉE ;|V9H^Y;~W3tYEtDt?Tt6u QȐVt#Njσ?k8EH ^BDB(EGE;u_^[ËSVW3Njσ?k84H ^~t ~tN(yF(ttjjjXPܓV؃t t SȐV3t^uN(@)u$N(N(@Fl ^t @GW_^[j hS\4Yj螉Y3ۈ]]SYua]EËMd Y_^[Ê]j裉YËV3H ^tPaH ^Yrݰ^ËUf9Eu MfMf;s$UځYtEEujMQjMQRP贳u EE}t M샡PËUVut j3X;E r4u uFt VYtVj5l]̒Vt 3^]̋U3]|j h0S\WeE0YeE 0Y(^jh`APPV2](^uEƋMd Y_^[ uM1YËUV52]35(^jju΋,V^]hDYh@YhDYjh\YhTYh3YjhdYh\YhdYjhYhYhYjhYhYh 3Yj hYhYhYjh0Yh(Yh0YjghYhxYhYjMhYhYhYj3hYhYh03YjhYhYhYjhܓYhԓYhܓYjhYhYhYjËUQSVW}P^0Et }ȍYhjS(VuPVWu5jhiYS< t!jh0YS( t VVS(V3u MMƇtV0Vu;} U3_^[ËUESW^2]3Ѓ;u3QtIVuuYYtu PVt VY2]j Y+3=2];3^_[]ËUVh(Yh$Yh(Yjatuj,V%^]UVhYh|YhYj!tuj,V%^]UVhTYhPYhTYjtuj,V%^]UVhYhYhYjtuj,V%^]V\t ,V^3@^ËUVTt'u(u$u uuuuu u,V uuuuu juPV^]$UVtuuu u,V#jEEMXEEEPEPEP^UVhYhxYh/Yjtu,VV^]UVhYhYh/YjRtu,V^]^]%đVUVhYhYh0Yjtu,V^]^]%hVUVhYhYh0Yjtu u,V^]^]%ȑVUVt!u uuuuu u,V uuuuu ju*PV^]UVuuu tu,VjuPV^]UVhYh Yh1Yj tu,V^]^]%tVUV7uuuuu tu,VjugPXV^]UV tu u,Vju udVP^]UVhxYhpYh0Yj<tuu u,V u uV^] UVtu,VjjuPTV^]UVtuuu u,Vuu u臫 ^]UV\t'u(u$u uuuuu u,V uuuuu ju PV^]$UVtu u,V u衫Y^]UVtuuu u,V^]q̋UVhYhYhYjtu,V3^]VhYhYhYjt ,V^ËUVh̔YhĔYh̔Yj!Qtu u,V^]ȭ̋S2#ut /tÊ[1F[pVWhYhYhYjt@,V֋t0hВYhȒYhВYj {uW,V3_^̹(^^3;V52]Ƀރ"B0@;u^ËU2]3ʼnESVhYhYhYj t\hTYhLYhTYj؃t=,V֋ȅt)W3}jj EPjQ,V_tEu2M^3[<̋U}u'VP^>t>t60V&^u^]jhPS\Lej|Yej^u;5h ^tYl ^tJ@ tl ^4%"YtEl ^ PxVl ^4Yl ^$FEEMd Y_^[jB|YËUVuW~  t%tvfY!3FF_^]ËUWu 'YM I u\ E jY E @ t /"ыE @ t(u ^YM aE tHE jY !E Sj[ E jY !E `E @ u3Vu jY;tu SY;u WYu u n1Y^u ]S7YYuE jY [_]ËUWu &YM I u!G E jY E @ t "ϋE @ t(u GYM aE tHE jY !E SVj[ E jY !E `E @ u1u jY;tu SY;u WYu u W0Yu uVYYuE jY ^[_]ËUVWu %YM ЋI M 3A1+@E HIH~$E VpRR E ;HEett‹ʃ?k8H ^5]@( tjWWRG#ƒuE jY jEPR H_^]ËUVWu $YM ЋI M 3A1+E HH~#E VpR E ;HfEfatt‹ʃ?k8H ^5]@( tjWWRx#ƒuE jY jEPR _^]ËUE@ tËESV@ Et;HtN@P! Yt<3ۍECSPjjVVt%EPVVtE;EuE;Et2ۊ2^[ËU]U]j hpS\F3uE0* YuE 8ǃ?k8H ^D(t!Wz YPVu谖V贖 uEƋMd Y_^[ uM1Z YËUVuu c YxE;5H^s=Ƌփ?k8H ^D(t"EuEMEuPEPEP ^ËUMu 8x$; H^s?k8H ^D(@]赕 蠔3]ËUM3SVW~;t;u5;w'tN*tI+v8.v91t13t!vv;t ;t U #E$P#E PuuuuRQБV_^[]jhS\D}u͔ ؔ ;=H^Mǃ?k8UH ^D(t|WYu؋މ]܃eEH ^MD(ui K uuu W]u؋ډ]E .}]܋uWY  ֋ƋMd Y_^[ËUQQVuWVY;uΓ NjMuMQuu PVuVPhYӋEU#;tNjE΃?k8 H ^d1(_^ËUuuu ub]ËUuuu uS]ËUM9u3@yujX 38A]UQuEuu P蘟ЃwMvEtfËUQQ}SVW} ?]uthWMhuPEWP6Ѓt\tOMv+v3KM  ffu] +u;Y33fE 8%*=3 t:uCCWMuPWj蕞u*_^[ËUQ0tEPEjP^ tfEøËUES] ?VWk8UH ^L8MMt ; uL8(d8( ]E;Ê@ t FE;Es((FE u3u @EEjEEPjEPudVti}tcUH ^D8(Ht'MFE u H ^L8*E2} u ;u "jjju2U} t U FE;E H ^D9(@u D9(F+_^[ËU(ES] ?VWk8MH ^E TUUtj ^f93uL(d(SE;dEE f;E)Jf;Et;Ms; MNj MM[f;uSX3f9]] fuEjE܉MPjEPudV}MH ^D(HtMfUFEf;Uuj Zf1j XfH ^j T*H ^fT+H ^ZT,Ej Xf9Eu;u fU.jjjuqUj Xf9EtUj XfM;U H ^D9(@u D9( jXf+_^[ËUQQSu] Suȃ 0EU?Wk8UH ^E|)uVpx3Bw;rNBP5]tP5]uٍ*@;uSED(Ht5FL*rMF H ^D+uE H ^FD,+ڋjRPuu+uVSjhc؃uVPY#E;ɋH ^D-$ ȍL-^_[ËUEVW} ϋG;sXSt4 uY;sj Xf9uj Xjj[f^;rEȃ?k8 H ^L([+_^]jhS\SjYY}EP}Ytxx8xHEƋMd Y_^[ËujYYËUE3ɉEHEHEHEHEHEHE ]ËUQSh ^VW=l ^ ]B7tRF u.VYV   u] ШuVoY;uE _^[ËE0j8jj tӃHjh P7 F VY벋UVWu EP}YY}_^tWhuEuuPlu9Ep ^ M E3ɉHEHEHEMEAE3ËUVWu EP}YY}_^tWhuEuuP3u9Ep ^ M E3ɉHEHEHEMEAE3ËU]U]g8^p3<^@^D^6]ø<^ø@^ø8^áD^ËUMuvujX]á<^3]ËUMuovZujX]á@^3]ËUMuCv.ujX]á8^3]ËUEVWH+jd__+^]ËU Vuuuj^0t!Wj Y} uuj^0t3OEM |=@WrjZ;|=Xvwuj^0SEEPEP]YYjFQPuSȺQN+؋E€}EYuԖY3@9J}@9 |HFj+ QPN w7Qj}YjVPWS3Fj+j<WSf Fk<+3[_^ËUQQE3SVW@jQPSEFFPEJYQȋƺ3u++}wE|s?3؋EHPwE*`YtE ÀQwu_^[ËuV_YtM Vtt!F8u'j$ڹjF8薹F8YYu s 3^ËU]USVE3PuY9u]W{;=6]u ;=6]^95P^ ^f95^u^3^@]u^Ƌ։u]^]^]^]^Su]uuuuRQWPVM^, ^]^]^]^]]f95^u^3=^@ Ƌ֋5^uuuuVWRQsPj,XVVV3kjV@VP3kPWjVVV3kVjVVP3k PsjjzX6]6]K_;};|Q;M;~;}3@^[;|;;~;|.kC<Ck<i3;u ;56];56]3VVVVVp̋UQQeS]VWSw]} }YEujt 4Y4ЖYSF!Yimj6YkM+u;U}t YԖY}u ;~t 4Y4ЖYu kE$<E(k<E,iE0}u56]6]6]_^[ã6]EP56]YuAiM6]6]y \& 6]=\&|6]6]6]3PPPPPlőU SVe؃eEP]YEPeYH^ut4ʋƊ:utX:Yuu3L]R蒵Y΍QAu+ʍAP贵jH^nH^YYWyAu+VAPRQ j_WVj@3{>tFu_-uFVjYiM+tB< wF:uLFVCk\ЁuT$t1 # fnfs f @YfT$^ʺg #f0YfWfTfvfɁf%=uefL$ fT$ fnfT PYfs4ffffvf%=t#fL$ f%tYYfL$ f%fL$ f%Xĺ]fT$f~fs f~ҁ ¹f YfЛYYɺfd$fT$ f~u fs f~?uf0YfWfTfvf%=uUffd$% уtf%=?rf%=?sYXºYf~fs f~ f@Yt0f~%=wrwfD$D$ÃfD$T$ ԃT$T$$D$Ã~(=<VЃW?&=VЃ €WXX YfY\ YfY\f(Yf(5`YfYfXfpYXXf%Yfnʁƒ fW?fYT$Yfs-fpDf(=pYXfYXffYYfYfXfYYfpYfpYYfnfs-fnfvfXXfTXfWfvf\XfTf_\XXÃN^YYXYXf%=fD$D$^XYYXf%=fD$D$fțYfnYfs-fVtfYYYefYYTfpDfYf%@+-p< Ё!=r ɀfnfs-fD$D$fd$f?f3%-Kj0V}3E ]}؉Eut u3tugTRSXuM^aEȉuHuEԉuPSEuPWq9u:Mf9n7MfF;rxuat#Ef90tut f90u+]CEPVSWSuVQ }|7)N#EPVSWjuVQ诽 t}w}Vz EUȋJ~jY]SVQMQjPVrL]Ѓ }:;ƉE܅~M؊D9E@GE;|EE;nt}R*-9u)Mftf;w7Ffu3EPVVVjuVQ舼 t }uxR*}t MăPËUQVu 3EW}t.t.tS]t9}wE=v QjYtQj^0PkuPuVutyQE@t5;v'}t;wZQj"^0FPjPYMD0Mt[_^ËU2]3ʼnESVWuM ^E3WWu@u E~؅t}H;#t2=wtVPʖYtAt0SVuu %tEWWP#EPjVWuֺ V)Y}t E胠PǍe_^[M3?ËU2]3ʼnEE MS]VuW3px;h|PuVQttFjP蓧W譕 9;tAP|PQ33VzWWuVp[tjPYYt*tVuxptƋVYwuu&jjtj荄 tFF+>vj X5Sj?S6if uj ^ NF3j6Y[_^ËU]jhxT\E0oYeM *EMd Y_^[ E0YËVQ@HPQ5^Q@HPQ5^F uF87]t0oYFBH@H^ËUE-t(t tt3]áМY]á̜Y]áȜY]áĜY]ËUMjHJ% ^Eu ^8V,u ^3ۿˍQB w LA w F AÈA;rˋM_^3[ËUuuuM EIH;Au3SVWh 輀Yt.uvHWu'YY;u:WBY_^[À} uwVE@HKuExH7]t pHYϋE3HHEPu6]uEEMjEEXEEEPEPEP} mE5]^j hXT\3u}6]Pt9wLt wHtmYjYuwHu] ;3t'tu7]tVDY3wHuE뭋ujYËƋMd Y_^[H̀=$^u<^7]^(:]^ 9]uh^Pjj$^h^uPYYËU 2]3ʼnESVu WuoY3ϋljM90;]A0M=rP@V;u&F~f~~3~ VFEPSVtuhFWP< ^}u}Et!HtLA;v8uߍF@uvC3Gf9= ^hFWP kE0E@;]E8t5At+s(;]DBA;v9u΋EGErS^FEN j4;]_fRfIuV3YM_^3[4V8^V<^ËUUW3f9:t!Vʍqff;u+Jf9:u^B_]ËUQSVW0V3tYVWWWW+SVWW蹠$Et6PZ|Yt3PPuWSVPP葠 t33W{Y߅tV,V_^[ËVW0Vu37SV*+ރS{YYt SVW j{YV,V[_^ËUVuu5 SWj=V=-EYY;@E39 ^u{9] t9 ^t,FvZ8]u3jjیS ^z 9 ^y9 ^u#jj谌S ^z 9 ^N ^E>E+PVEYYMxO9tK4zYM8]u0UDA9ujQRp\SEWzEtb[E4V8]؉EP;?jRQ#\SE zEM4\ ^9] tNFu+jFPE誋YYtFuuVk uXM+EAE#YPV2YYYu3*VxyY3WayY_[^SSSSS2̋UQW}u3_3ɋ9t @A8uVAjPYYtftPS+ߍQAu+jAPEϊj;x <;t.7u4;j uu[jxY^rVB3PPPPP1̡ ^; ^u P=Y ^ËUSVW= ^t*] SPuW u <=ttu+_^[]+U]USVW};} tQt,Vӄt;u u;u t.;t&~tt j,VYF;u2_^[]ËUVu 9utW~t j,VY;uu_^]ËUMS]Vuuu9u t)1j^00^[]ÅtE tu 3f3u3f+ًWufRft.u'fRft tuɋMu3f_uuE 3jPfTAXt3f0j"YU]*UVuF ;3]tPvYF;3]tPvYF;3]tPovYF; 3]tP]vYF;$3]tPKvYF ;(3]tP9vYF$;,3]tP'vYF8;@3]tPvYF<;D3]tPvYF@;H3]tPuYFD;L3]tPuYFH;P3]tPuYFL;T3]tPuY^]̋US]3VWM]M9u9uM3]4jPjMjucu u3@Vjj)j}?u u V2uYӃjjj} u uVuEPtY‹F PjWEjPMEQjWjP EPjWEjP EPjWEjPzP EEPjWEjP] E PjPWEjPF E$PjQWEjP/ E(PjWEjPP E)PjWEjP E*PjTWEjP E+PjUWEjP E,PjVWEjPP E-PjWWEjP E.PjRWEjP E/PjSWEjPq E8PjWjEPZP Eu9Jj*qj}pYYSu pY'E싾jWjPKQjWEjP CPjWEjPv C0PjWEjPbP C4PjWEjPK t*SbSUpuMp MMQ=pEYpS HЀ wh Bu}uM3@ttN|tuv|ooYYEF|3_^[<;uFu놡3] 3]C3]C83]C0<3]C4fUM SVuW3?;#t6WoGvY;u_^[]ËUE eSVWVuE EYM3j1`XjZEUMj_3PuEVjPu ؋EPVuEjP ؋EPuEujP ؋E}PVWEjPl ؃PE@mEhEj8^huEE Ѓ PVWEjP,u ؍EuWjP ؋EPVWEjPu ؋EPVWEjP ؃PEFmEuuuPj(WEjP ؍Pj)WEjP ؍LPj(WEjP ؍PPj)WEjPpP ؍PjWEjPV ؍Pj WEjP? ؍PhWEjP% ؍Ph WEjP P ؍TPjWjEP ؍XPj WEjP ؍\PhWEjP< _^[ËUVujV3FjP(F8j PFhj PjPzloldljPjPDj Pj PLjPTlXl\k`k(^]̋US]VW39uXYFhdj}YYtSV`YYuVYWk3@$WdžkY3Y_^[]ËUQQU3SVWf9t8u ft#Ef9EtЉUUfu3f9u_+^[ËUM3SVWf9t1U :ftf;t!fu3f9u3_^[]ËUE@ H|ttttVjH(^y5]t tyt QtuLY^]ËUQSVuWtl=3]teF|t^8uYt8uPjCYYt8uPiYYv|iiYYtE8u@-Pi+Pi+P~isiYjXE~(5]tt8uP;i34iYYEtGt 8uPiYEEuVhY_^[ËUMtXYt3@@]ø]ËUVut!XYtuVVhYY^]ËUMtXYtH]ø]ËUEtsH H|t t t t VjH(^y5]t t yt Qt uZY^]j hT\eI^ 6]xLPt7u=j#Ye5 ^W=YYuE t uj?YËƋMd Y_^[ 1̋UVu WtpYff;uftfPf;QufuދhdYV mYYtjhxYVlYYtYYff;uftfPf;Qu fuu.jEPh E PPyt'E}_^V0YjEPh 3U2]3ʼnEVuEj PjYVqytj EVPS u@3M3^谺ËUQVu 3WB3xNStH7+‹؋Ek M4E0kYYuEMȋE ys{;~[3_^ËUQQS]VWxV33҉UpPPVf~Eˍf9tWjhYG 3Vf9tGf9t3Y9Fu2Vj@h؜Y t3Vf9t XY39~6f9;u f98uuftfzf;~ufuދ҃t]Yf:f;>uftfzf;~u fuu jEPE h pVt)E5Q Y,jEPE h pVu3 EuYYȉj _tu33ۋ0É4\C,3DžDž3ɋ ; 0u䍂ϋ3҃+ȉ3@,HЉt@33+su 9v2Ƀsrr jrZʉ+0;rg;s3F;sB3##苍㋍ É0INt,땋t΍03󫋽9v B,3,+3P,P0SPd3jXA\PP`SP-ϋ3҃+ȉ3@,HЉt@33+su 9v2Ƀsrr jrZʉ+0;rg;s3F;sB3##苍㋍ É0INt,땋t΍03󫋽9v B,3,+3P,P0SP莇3@Dž\j#5DžDž3ɋ ; 0u䃥t@3+,΍;s0A;s3ҋ Љ0It,볋s F,,5+VjPn3@5,t@3+,΍;s0A;s3ҋ Љ0It,봋s F,,4+VjP3@5G\PP`SPK3j YT񉅐ʉ|b&vj&X Y4YW1jPPYpYPPwru3\\\33؋``F;u`\Y\`PP`\SPu3\P\\3ɋ3؋``F;u\s43\P;\r``ut ω \t\33<u;F3ҋ!std;u@Ɖ$@A;ljut4s;uA3AȃsF;\PP`SP܁tr+|zY|u]3\P:3\PP`SPh2늃\jP`\33`lj`|F;uW\sQ`\6񉅠ʉA&vj&X Y4YW1jPPYpYPPku3,Pmu,h,33؋00F;u3,s0,,0P|P0,SP6,,3ɋ|3؋00F;uE;,r00ut ω ,t,33<u;F3ҋ!std;u@Ɖ$@A;ljut4s;uA3AȃsF;,PP0SP}+zY,330lj0F;ut,ssN0,e3P,P0SP|27,j3P,P0SP|,t|j 33[0Ɖ0G;u䉵tB,ss‰0,&3P,P0SP|\P,PYY w\1j 33[`lj`A;u䋵tV\ss`\<3P\P`SPb{u H 0wAx wȋEH;r;,33ɋ0ʚ;lj0A;u߻t@,ss0,&3P,P0SPz\P,PfYYj_+30;r7Ou vj Y;4t_^[t lP2YM3hPY hHYh@YuQ, u h8Y3PPPPP̋UVu~Vu Y;Yp|3PPPuuVuu uT^]ËUSVW3;+‹jU4xYuC ty^~;~Ѓ|Y_^[]ËUMSVWt{ts} uufxb3;+‹+XYtyXx;~݃x1\YjUSYY~;}SVu u G3_^[]3PPPPP̋U}tuYx=s XY]3]ËU$2]3ʼnEMS] Vu]WuD^3Bu cVE߉E#ujXD3f9Fud CMxt3$+t5+t,+t$@tgR39~jjX3@3fF Fyu@uEP3Yux9}ttL^#ExF@tNNN t N tN t N tN_^[3PPPPP̋UQSVu֋?k8WH ^D(Hu{ywjjjVTڋσ#˃u$8tN*G3fEEjPV\ uf}uSWVt t3PPPVT#ƒt3_^[ËU3VEEEEEEVPEPuU tu uuuuu u9}t uC-Y^ËUjuuuuu ]ËUDSVWuEuuP1}ԋjY9uu E 0Y] ;u 3ϋEuԃe3AE E#jYEEPu }ukM؋#;u5Et/EuԉMjYPu }u+ ?k8H ^d(VPYWȐVuGVVY ?k8WH ^d(V uE @ Eu W3EXUYY U?k8UԋH ^T( ?k8EH ^D)t3Yt3+aY*EEPuuԃjY3L$tRƊE?k8 H ^D) ?k8 H ^E2D-$0D-EHuEt ?k8H ^L( uع#;EtuVEu؍ujYPuЃ u2VP1 ?k8H ^d(3\XY ?k8H ^T3_^[ËUjuuuuu `]ËUQVWtM}tGuNFu+0эBEBu+U;v<1=uVuQ2 tu3_^Ë@j hT\Jej Yeuuu u2uEƋMd Y_^[Ëuj YËUQS]Vu"j^0s#uW} tYYtt VYu6-YM_3^a][̋UE W};t&Vut+@TLPu^_]̋U2]3ʼnEM S]VuW}u%t!M_^3[]ÅtۅtDžrIΉ3+x;7IƋ;w1PV,VӃ~ Ɖ;vы;t4+߉ RBDƈJu㋝+ϋ;kIt ˋWP,VӃ~VW ,VӃ~V W,VӃ~VW ؋d$;v7;s%WV,V~;w=;wWV,VӋ~ۋ+ډ;vWS,Vփً;rYt6+ӋIRLDJu답;;s5+‰;v#WP,VӋt;r;+Ɖ;vWP,VӃt׋ʋ++;|A;s| A;I{;st @;8UV3PPPPPPPPU I t $u t $sF ^[3ɄËU= ^u]!Djuu u]ËUMSVWuVEu3MtU u  h;vM}􋟤uuVPRQC-wPRPQhESP u p}t MP_^[ËU0S3V]Љ]ԉ]؉]܉]]]]u]]]HPEPuaH u(HPEPu HHu u Vu(V؀}tVY}t uY^[ËUVDUuUF3^]ËUQQVu6XVvVeEeP u;Eu F;Eu33@^ËUQQeEePYu+MUEAEPU{Yu 33@̃=^t2\$D$%=u<$f$ffd$uE $ ÍT$蝒R<$tLD$ f<$t-Yt^uA=^ Y鹒uԩu|$u%t-@Y"uŃ|$u-Y=^P YYZËUQQU VuWuP^>$u<f;w VYZ(f;w'@ 3=VQu.f;wčE3P%#}Pu}>~ _^ËU,2]3ʼnEESVuE؋E EԋEEW}}~VWDYEY *] ~ SP$YY  E$u E؋@E$t;CMQPV~4}r&}EtHt:r:8ujX~7}r)}Et u܊Ht:r:\8u3@U3WWVuj u$f\E؅3 Q;#tA=wĉEP'EYElj}uPVuu$jV[WWSuj V[E Q;#t2=wRt\PYtGt6uVSuju$j[t]WWWuVuSuu1]V^Y]S^Y jl3e_^[M3tËUuM u$Eu uuuuu PD }t MPU$~$fD$f(ffs4ff( Yf(Yf(Yf(%Yf(5YfTfVfXf%f(Zf(YfTf\fYf\XfYf(fXƁ*f Df( PYf(f(`YfYfYfXf(pYYf(-YfYf(YfTfXfXfYYfXf(YfYf(ffY˃f(fXfXXXfD$D$fD$f( YfwHt^wlfD$f( Yf(YfTfVft8YúOfY^f 0Y4f YYs:fW^ɺ fL$T$ ԃT$T$$iD$fT$fD$f~fs f~с t릍$̸( ^H%( ^, ^H%, ^0 ^H%0 ^4 ^H%4 ^8 ^H%8 ^< ^H%< ^@ ^H%@ ^D ^vH%D ^H ^fH%H ^L ^VH%L ^P ^FH%P ^T ^6H%T ^X ^&H%X ^\ ^H%\ ^` ^H%` ^d ^G%d ^h ^G%h ^l ^G%l ^p ^G%p ^t ^G%t ^x ^G%x ^| ^G%| ^ ^G% ^ ^vG% ^ ^fG% ^ ^VG% ^ ^FG% ^ ^6G% ^ ^&G% ^ ^G% ^ ^G% ^ ^F% ^ ^F% ^ ^F% ^ ^F% ^ ^F% ^ ^F% ^ ^F% ^ ^F% ^ ^vF% ^ ^fF% ^ ^VF% ^ ^FF% ^ ^6F% ^ ^&F% ^ ^F% ^ ^F% ^ ^E% ^ ^E% ^ ^E% ^ ^E% ^ ^E% ^ ^E% ^ ^E% ^!^E%!^!^vE%!^ ^E%V%VX^UEX^]jVnuu3HXNEAA$Rnh?Vn}}ԃeCM$jj+V4EH0EPM 6e0j V*e}(EuAM v3̉ePyyoE̍EPyyWEMM fd0jD@Vd]EepeMVFEE3PˉuI;tT(MPfdEE;Eu4ẺePIdE̍EPqqEMfMEr:M@EЉME=rEPEP EYYMPQ(_MYYM EȀx #chpVcjj\Zx} er7rG; :t1t%tt Hu2h4 ZMh8 ZFh@ Z?h0 Z8h< Z1"t'/t\tQ\P"h$ Z h, Zh( Z\P DYYF`u`K9\NEbjVbd,3ۋ ^x^ ^;uW^^Qbþ^V^a=^YuhZω]^^x^0hV_MV`YYjV)bd,3ۋ ^\^ t^;uW^^gaþt^V`=t^YuhZω]l^p^\^hV8_MV7`YYjXVau} ue}tEPY3C EP/Yj[3ɈMuMMMP;Et M*EtM tX3ΈEuFFEPMEM@EME=r|EPEPEYYMepPEPeY3YEuFFEPMEr6M@EME=rEPEP~EYYMPQ[YY,`j\2Vu`}Mu 3ۍMV]cE]PM؉]E9]t EPWYYE]r3M@EME=rEPEPEYYMPQ[YYM]E]_hV_e }u j}ЃejN0Eh ZPq@YYu0VP_@YYK!W85j_j Egkh ZfEPhYPE3M ;J^UVW}7t u `u ;u2_^]ðj|V^]3}u xECC}E@VWEEYY>/||Pz~ ;h ZnE0E; xEWPLPEEhh ZP9h ZPEEPA MMEuGPEP[ }Eu h ZM}EPEPt!EEP_ PEM6EPBPEEh(dYP8PE xM8M0MM MEE;}h Z~h Zo0xuEVPo ME uh ZMM}Et}QCE؋PE&PEh(dYP8 PE MaMER;u}h ZWxRP\Ã~ uh Zn0EWPEP ME uh ZMM}Et}QCE؋PE3&PEh(dYP[ PE MM/MEpE;lj dU\[3EEEEEPu uU tM+ʃQRxYYEZh V@[}Eu }E3EGG^ΉEEWeEEE uhD ZuhH Z u hP ZMsEPEhX ZP6hT ZPEEPPMPMHEEM@EME=rEPEP3EYYMPQQUYYkh ZSEVPYYEσEPM }EuCE؋P.GH;:r<^uhl ZSM uJjj>yhl ZEiPhh ZPT:YY@PE:YYt.jjxENP;`t.jjxEjP `t,jjwxEiRPKi_t,jj@xE jRP52u\jjxE eQQ$IEPr.E؋P0M7C{u/~X~XDQV uGhuhp Z=up,VPEP PMz u h ZRFWj$VWu3} ]uЉEԉFFωEE覡SEWPtb P7MVj(VVMAE ȃexrjpQMuMuHM$EnVjAUVuus?NueFM FHFHF@ F@ V jKVAV]3>~]j}=QYȉMt33@ ZAAY ωƉNUUQVuWV}3ɉOOFGFG_NN^UVu j\;u u^]USVWu EPu }˥uV t E0@?{UUUt=u M3SMp`JVuuS MA_^[{ UQQSVWF+=t{@PEPΉEPMu +σ#˃c5V9UuVWuQrMCVVPRQ]uuW_^[ Ujh:UdPV2]3PEdpuj06OYYMd Y^UVu WvuVu6_YY~ t_^]UVW}pg~ 7Gu-S] SN7ffyv33w6@G~ t[_^]Ujh:UdPV2]3PEdu Nj0VNYYMd Y^UEx uM Pfx2]UMVu;M t)W+3>~D2F9|2;M u_uVV@ ^]UQQu EPDEMMHUVuF;Ft ȃ`l3FP^]!j~VR}E3ۉE jG_G MYE]t 3؃MOSEwEGG Q VjjFP ^V1t{jVtVv6F+P6 ME FEF^] Vq tjVKYY^V>t(Vv6F+P63FF^US]WVW3F3ɉuMGWE$;Ws],0< wRYVă0j fnȋEX Gw MYj ȋEZʉEeM;wruыX ^ȋE 9G_^[UQQS]WO#cWME;WsEV,0< w:jj s3YȋE0 sWBWE;WrM^;_[SVWV>:sJc$Q_?QC?Q?Qw?Q?QUQaMAUyQr E;s2]UEVxtP ^]UVLu^]UV0jEP^]UVu^]ayr UE39Qu 9Pu39PtP<2]U]<AU SVu3W3CEO&fMtHrEЃ w-jj v6~HE0E@VE;Er3_^[yr UEPju jduw,]UQEA,X ZA, Z@AMUQA,X3M@ ZA, Z0<]@HAA,X ZUE;t@A]̃8UEV Zt jV38YY^]UEVF,X Zt j V7YY^]UE@;Av]UQM EjjPEM@,X Z@, ZHUQ^u0j [7EYt@,X` Z@, Z3^UE xrP?YMA,XA ZA, Z]UjAMjP]Ul2]3ʼnEVquEhQ ;P t@.WpyV/t3VW}YY3ɃAEʋ_^]jHV?;uE} 3SjuP]wSjE]Pf]E]SjE]Pψ]E8]SjE]P+EP>EYRPSEM؃ePSEEEEuMPEr7M@EME=rEPEPEEYYMPQc5YYES=YEPEPEP'MEԃr6M@EME=rEPEPEYYMPQ5YY9UQSVW}3ۋSjFPSjFPv9^ ESjPEa8]t.F SEEjPH~r6EϙRPV._^[AXtItjUjh:UdPV2]3PEde~t vVEt j V4YYƋMd Y^UW}t0Vpp,V֊Gtp ,V^_]UQQSW_t_Vp,V^tHEEPFjYOtjj 13EYtHPQx3ȉG _[UQVEP3QVh RQQQMVF^UQSW39_tHEEVPiYȍGGpVp,V^8]tu O4_[UEtV0tp,VY^3]UVWw4VpV;tuw|V=2_^]jV6uEefj ]YM F H6UQVuuVEM bBFFHFHF@ F@ ^jUu6}uE3ۋw]0NM ^TGGHGHGX GX 5j;U6~UUUtHu MVEFUJEHuer1}t j u1YY5h ZU VuEPuu^Eu^UVW}pg~ 7Gu,S] SN7(tv33w6@G~ t[_^]UEx uM Pe(u2]j.V 5] ESP4}SWt E8@V~ tUE]PEPh8 Z6MVx`}t ju/YYWu܋uMAN4US] EVWSPuSVt E0@L.tJE]PEPh8 Z7MWMp`>Vuu,MA_^[TjoV3ى]} ]3ɉME ZCKCKC PEr ,V֍EEPK,NML3LjVt3}phEO3dX]_ _G_SO EO(Ew,EVu^LYO4E{w8EVu^w@EVu^YYOHEjXGxE GP`XGTlX_X_\_`_t_d_|V2Uh2]3ʼnEEVW< ZE Ful ZpVPEWP EPV~uM_3^1Ujh;UdP2]3PEdyt j q,-YYMd YUjh:UdPV2]3PEdFtH"Ft jXP,YYMd Y^Q~VN, ZN (NU,X^UjhVdPh2]3ʼnEVWPEd~ Zu ZpVPEWPW EPV~u  Md Y_^M30UVNh (Et jV+YY^]UVEt jpV+YY^]j('Vj03EEGȉEE e_tkG M܉E}܉EZCMEGu3E@3ۉW 9]tMԉ}ԉE&MttQp(,VքuME E/j JV/GEȉEq 3ۉ]9_t+EtMp(1,VMքu u ME, /j mVUX*N4EN8@ EEP蹫;F8ÃeN4)j5U*~Eω}ueN,11;ËE)UEt tjjjX]j mV)u~3ۋω}]GuN,];F,t0HTt)E P؄tjW r,VO ֋}E(h%VX)]33@ddt3hQp,V֋3@ȃz uzt2dthEdt2EPYep,Vփx uxuMQp,V֍EPNu EP`EPu EPtSEPM(j]V(uE^43ɉ]MMˋ@ E!}EPN@b;F@tEPEPN@xE~Mt} 7jt_N ,VV ˉ]EEuEPEN8;F8tHtEEE'v,Vքu3jHVZ'EP~YeEPu EP.uEPMb&jXV'ً}E Ep ,Vփt2jC(PMejs!j! Et83K CtPjjC MP vEEPMEC Etj0,VM֋uWp,V֋ȉC MMS sLr,VK ְ% jV%uE~4ω}3E@ EpE]PN8;F8uyj YEEt sMEPE]PI8Ajp` YEEt SMEPE]PI@pE$jV$~Eω}3uF,]0ȉE ;u9jYEEt ruMEP]pTEU=$jhGV$ME} jpE}dYu3ۉ]tDT:{YWu;E]Mh*YEEt l؋EM;p,VM֋OP,VWEPzY PEq,VփMM"}ˍPMQp ,V֋ PEq$,VփMMuxMSǃ^#hVU#`]\p,VPhrMeQptR,V֋EMgE2 gt_EPyY PEq,V,V֋EgME gt SwG8p ,Vփuk`XjF(PNEtvQÊE jHV`EP蛤Ye~ω}^0;tDEԍNPu6;3u,F$Etj8,VM׋}VEPEPMEEЍEEP3?MESdMEHXsTUQVuWuMVPWpEYY_^VW7vW$v6vg_^V6V_YY@f^UE V0@0E @Bu IQt_EYY0^]jVى]EecjP-u YVxC]aFDGD]j;U~333tWu MVEFUJEHuer1Mt}t jPut YYh ZUM A tV0Pu YYu^]Ujh:UdPV2]3PEdu N?jPV YYMd Y^VjP&fY@^jVu|E3l ZN}~ NEjE^ YEEt WǍN EFo^jE, Yt ZljF(Ɖ~,^Ujh;UdP2]3PEdyt jPq YYMd Y &UQSVWl Z^{tj0,V֋{(tj0,V֍{ 0;t&FEtj8,VM׍{ 6;7uڍK oK3 K_^[̋IUEVT Zt jV YY^]UEVT Zt jV YY^]UVEt j0V YY^]UEVD Zt jV YY^]=^WtVOOz^O__UQQ=^Vu2MSF2WȉE~0;t%uNu6;7uVEP6M_[^SVWS uBS {Rp ,V֍K$_^C K[VWOuO_^VWyhp,V_^hLV L=^E\E Xu2F2ۋȉT~F8P7\N6;u\M2\X}eEP`\EEP`PE1`MMTuCj$YȉTtL` ZA X3ɋQp,Vր jhGV ME} jpE}Yu3ۉ]tDTbYWuE]MhYEEt T؋EM;p,VM֋OP,VWEP"bY PEq,VփMMw}MQp ,V֋ PEq$,VփMMuME ]P1ts hHV \]} jjdXJ3`Ep,V֋@ ;G up,V֋@;GtWp,Vƅ`MQp,V֋EE\7N9AE;A t'QX,VdӋd3@``tQX,VdӋd$`؋FLDˉXQTZ,VTӄuOd\SjPE6;8d\j0MlXE\79F`t"QX,VdӋd)#`؋FLDˉTQXZ,VXӄUd\SjWE6;e\w,XEP,VYYhQp,V֍h@ ;E.ۋdt MQp,V3A``7;jF;EuztQX,VdӋd!`؋FLDˉTQXZ,VXӄu)d\Sj+6;`iTjx0,VU3VW3ɉUzEM7;tmSFLEX,VMӋȅtEEp(Q?YY]]t%MFPSj,VM3ɉM6;uE[_^U=^tEA,]=^tVWyjp,V_^Ujh:UdPV2]3PEd6VjP6Md Y^V6V{YY@f^UE V0@0E @Bu IQnEYY0^]jRUEuuPcNEeQQԉEP,FM FHFHF@ F@ UQVu uffCf^ US] EVWSP+uSVjt E0@L]ttJE]PEPh Z7MWMp`cVuuvMA_^[螼jU.uu3,YN]}j_`X^lXNF^^ ^4~8^$^L~P^ًEPEPa3E3P};tE؋PEPx(MUE3+tt ujY3A]jV3ۉ]u^FM E3]SG]WP}Z8]t5M ESWPZESP ~rERPQM ZjdV@ى]EM3E}Qp ,Vu}xp,VփMM}MQp,VuxEp,VփMM]p,Vuxp,VքqMQp ,V֋EP(MEM辿ME3SjP8]tE}MQp ,VuExEp,VEt]MEtMN}uE}Sj9PE[}t4SEEjP>yr ERPQ!9ESjPE 9tBPGYSEjEPEtWp,VMքt3ۊhV0}3ۉ(,8Qp,V֋!]|0QDž,p,Vj[WE,!(t?p,VP0p,V0֋ƅ7uƅ7t|HMt 847Wjh]hX]jW960;jj_WjW}Ep,Vքp,VքQp,V֋Qp,V֍EP5EEP"E;Eu:EPMu*M蒲M芲(MhM`pe2)jV<3E}܉}}E}PEPCP E tup,V֋Eu'hYEEtjjMQ9MGPM#t7E+MEE=rEPEP裬EYYMPQYYEP?MVSp,V֋p ,Vփt_p,V^[́|KUESW9Ct=Ct,?Vp,V֋wPS,V^2_[]UW}tVp,V^3_]U$SVuEWt H3jh]hHc]+PQ2؃t.89ˋp+0,9MuQMQ0GPzjjjnE܋PֱXH H3PPMPn@D08Eu2ZSfYuMSV* E]PEPGVP|V6Etup,V֋E_^[UQVuȐVu?hVVt0h ZPVteEPu,VօtE^Ujh;UdPV2]3PEdu0F0|Vt"Fj0VF0VtF%j VYY3Md Y^9t j 1YYÃy&UEjY;wt;Wtt1 t(mu.j)3A%-t-t-t u jjjY]USVu3ۃ>tS6V6Vt^[]UQVu>u2FSj6V6V6EXV3AtE[tu2Ɋ^UQQVu~uEE 3SW}E~rjhjjjh@QV؃u=VEt=uh@VUJUuEP}Y'_[^U3SVuW}9Gu PE3ۍECPSh ZeEE Er?=d<]EPjPPhjESW}_^[j V}u }EOGE ZaaPEVO EخE(EPO,;EuW跱EEPu؍MM#UQQS]VWjjGPG$Sp,VO$֋E3Wj9~PE}t+FWEEjP͈FxrWuP趈~0Sr,V_^[h7!VE8p ,Vփt3@_jj[SHL}MeQp,Vքt!}MQ?p,V3ۄÍHۨj,p!V0uԉuEMj_3 ZhcV]F ]}]訤EEPEԉ]PEENPM.EEr7M@EЉME=rEPEP芝EYYMPQYYEM NTNX]}]MƉN\ Ujh~]j}HYȉMt33@hZAAY ωƉNjނU]3>~]j}YȉMt33@TZAAY ωƉNnjނU]3>~]j}YȉMt33@ZAAY ωƉNjނU;]3>~]j}7YȉMt33@ZAAY ωƉNjނU]3>~]j}YȉMt33@|ZAAY ωƉN]jނU]3>~]j}YȉMt33@ZAAY ωƉNjނU*]3>~]j}&YȉMt33@DZAAY ωƉNjނU]3>~]j}YȉMt33@XZAAY ωƉNLjނUt]3>~]j}pYȉMt33@0ZAAY ωƉNjނU]3>~]j}YȉMt33@ZAAY ωƉNjނU]3>~]j}YȉMt33@,ZAAY ωƉN;jނUc]3>~]j}_YȉMt33@ZAAY ωƉNjނU]3>~]j}YȉMt33@ZAAY ωƉNjނU]3>~]j}YȉMt33@ZAAY ωƉN*jނUR]3>~]j}NYȉMt33@ZAAY ωƉNjނU]3>~]j}YȉMt33@ZAAY ωƉNtjނU]3>~]j}YȉMt33@ZAAY ωƉNjނUA]3>~]j}=YȉMt33@ZAAY ωƉNjނU]3>~]j}YȉMt33@@ZAAY ωƉNcjނU]3>~]j}YȉMt33@ZAAY ωƉNjނU0]3>~]j},YȉMt33@ZAAY ωƉNUjh:UdPV2]3PEdpuj06YYMd Y^UVu WvuVu6YY~ t_^]Ujh:UdPV2]3PEdu N-j0VqYYMd Y^US] EVWSP聽uSVt E0@L]ttJE]PEPhV Z7MWjnMp`=7Vuu̍MA_^[j"VeeMj eE#MP5<]rMPOQvEj"VeeMj eE@#MP5<]MPvOQ Ej"VeeMj eE"MP'5<]MP OQEj"VFeeMj LeEl"MP5<]4MPOQ8Ej"VeeMj eE"MPS5<]BMP8OQEJj"VreeMj xeE!MP5<]`MPOQdEj"VeeMj eE.!MP5l<]n MPdOQEvj"VeeMj eE MP5p<] MPOQE j"V4eeMj :eEZ MP5h<]" MPOQ&Ej"VeeMj eEMPA5<]0 MP&OQE8j"V`eeMj feEMP5<]N MPOQREj"VeeMj eEMPm5|<]\ MPROQEdj"VeeMj eEMP5<]z MPOQ~Ej"V"eeMj (eEHMP5<] MP~OQEj"VeeMj eEMP/5<] MPOQE&j"VNeeMj TeEtMP5<]< MPOQ@Ej"VeeMj eE MP[5t<]J MP@OQERj"VzeeMj eEMP5x<]h MPOQlEj"VeeMj eE6MP5<]vMPlOQE~j"VeeMj eEMP5<] MPOQEj"V}@(0QEr9M@EME=rEPEP9rEYYMPQWYY}5x<]M؉]E]xEEPEP}@(QEr9M@EME=rEPEPqEYYMPQٸYY}5|<]M؉]E]WxEEPEPB}@(QEr9M@EME=rEPEP=qEYYMPQ[YY}5<]M؉]E]wEEPEP}@(QEr9M@EME =rEPEPpEYYMPQݷYY}5<]M؉]E][wEE PEPF}@(QEr9M@EME =rEPEPApEYYMPQ_YY}5<]M؉]E]vEE PEP}@(PQEr9M@EME =rEPEPoEYYMPQYY}5<]M؉]E]_vEEPEPJ}@(QEr9M@EME=rEPEPEoEYYMPQcYY}5<]M؉]E]uEEPEP}@(QEr9M@EME=rEPEPnEYYMPQYY}5<]M؉]E]cuEEPEPN}@(0QEr9M@EME=rEPEPInEYYMPQgYY}5<]M؉]E]tEEPEP}@(pQEr9M@EME=rEPEPmEYYMPQYY}5<]M؉]E]gtEEPEPR}@(QEr9M@EME=rEPEPMmEYYMPQkYY}5<]M؉]E]sEEPEP}@(QEr9M@EME=rEPEPlEYYMPQYY}5<]M؉]E]ksEEPEPV}@(QEr9M@EME=rEPEPQlEYYMPQoYY}5<]M؉]E]rEEPEP}@(@QEr9M@EME=rEPEPkEYYMPQYY}5<]M؉]E]orEEPEPZ}@(QEr9M@EME=rEPEPUkEYYMPQsYY}5<]M؉]E]qEE PEP}@( QEr9M@EME!=rEPEPjEYYMPQYY}5<]M؉]E]sqEE"PEP^}@(pQEr9M@EME#=rEPEPYjEYYMPQwYY}5<]M؉]E]pEE$PEP}@( QEr9M@EME%=rEPEPiEYYMPQYY}5h<]M؉]E]wpEE&PEPb}@(QEr9M@EME'=rEPEP]iEYYMPQ{YY}5l<]M؉]E]oEE(PEP}@(QEr9M@EME)=rEPEPhEYYMPQYY}5p<]M]E]{oEE*PEPf}@(`QEԃr6M@EME+=rEPEPahEYYMPQYY5^ h^Y9=^qj]YuEtV^zYh^5^}lY,SMhG[EP{j^&V誳d, ^ ^; ^Mÿ^WZ=^YuejxYuEtfFht Zn3W5^YUu}E]UuE]UuE]Uu[E]UuE]UuE]Uu9E]UuE]UuE]UuE]UuaE]UE`0jX]UuE]UuE]UuE]UuiE]UuE]UuE]UuGE]UuE]UuE]Uu%E]̡<]̡<]̡<]̡<]̡<]̡<]̡l<]̡p<]̡h<]̡<]̡<]̡|<]̡<]̡<]̡<]̡<]̡t<]̡x<]̡<]̡<]̡<]UVWp,V֋p ,Vքt#Ožxtp,V_^jMhG[EPk̃{xUSVWu EPu }˥uV#t E0@?{]tt=u M3S Mp` Vuu~]j}艦YȉMt33@ZAAY ωƉN j&V2]3>~]j}.YȉMt33@ZAAY ωƉN诪USVWu EPIu }˥uV~t E0@?{UUUt=u M3SMp`&Vuu`MA_^[bUQQu EPgEMMHUQSVu3WV}_____FGFG_^^^[j%'V}Ew&fVuYeV腩UQVuuff_E FEFEF ^tjPZ跤YYjM'Vc^u.j hYEet uC3M^tjMHhG[EP̋A tjPZ8YYWy tVjp,V^_UVu EPuP1Mt貗>^tjM谒hG[EP:j ^]Uiً;uup ,V։E3EE;EEPE7Pu N,VVMt1ۧ j4ѷU7E ]]ԋ80,VփeMPEEb3E9Ev]CˉCEP']MEr6M@EЉME=rEPEP[EYYMPQ躢YYJPM茑hG[EPjqUE3EE] qΉEs 3;tx(tMQS0,V֋EMMHh'V{ًE3MEE]E}}y};蒹tju賦6EEu;pVEEP QËu]}}Eut*MEPEPu EEWuMP\KEPEEP}Etut軶MtM^ME^}+t蚸jH+YtEuK0tPt_t菔_jqUajmEYt Zp3t1PM>MeQG0,VO֋Mt(Ҥj4'V0EY} ˋ3PE;uMtIWMeMPuPEEPZMtÓM]Mąt诓nj(V聤}GZ3ZGZEG,G0Gw4EVuFMEGJP蓃;_^UQQSW}ًGH w(VKHVMQW(苲^_[US] EVWSP褃uSVt E0@LUUUtJE]PEPhZ7MWQMp`2VuuSMA_^[VjC)V觝d, ^ ^; ^Jÿ^WW=^YuejuYuEtfFhXX3W5^辛YUS] ;twVW7NP;u=PEP褗j ( PEP臗(訬uMQo(P_^[A8jlf)Vى]{ :KPu/.P\6;ujMohG[Ex(WZYuj MJhG[EWK8MPMP;ujMhG[Ex0 tjMhG[E(K PK 虫87u;tjejN(QMQEVEPKP6MQ(EMtuMMBu룋MIPxjjjMUhG[EPj)Vd, ^ ^; ^豚ÿ^W辙=^YuejܕYuEtfFh8yXU3W5^%Yj)V~d, ^ ^; ^!ÿ^W.=^YuejLYuEtfFhXT3W5^蕘Y똋A VPN^j)VBeEPN QÊEvUSVK聩x{ WKduPp~T3Pa~6;uj\(PrYuj J;tO(ڠt8O(#_w"C uMP~;t@0H vj ^[jMhG[EPUQEEEVP;PN`٬^UVuPN=׬^]j*V聘d, ^ ^; ^$ÿ^W1=^YuejOYuEtfFhXR3W5^蘖YUSVW u_OʧKP|;ujBp(3Cu9^u*΄t u2ۈ_ 4G _^[jM誁hG[EP4UQQVLPEPMQ(^jQ*V/d, ^ ^; ^Җÿ^Wߕ=^YuejYuEtfFhXQ3W5^FYUSVW u_OzMP{;ujBp(ȝ3Cu9^u*赝΄t谧 u2ۈ_ 3G _^[jMZhG[EPUQQVPEP辐MQ(ȭ^j *Vߕ}#=3EGG EEPSPOMt軄cVq`P^j0*VxuM=eEPM=wEPE`P1MEu<Mj0*VuMT=eEPMp=vEPEpPM賖M論萔UI]U]<U]<j *V蚔u3FEEP4SPnMt聃)jqUSM;ueM;uM<uMi<MPu 2Mtɓj0*VuM4<eEPM=<6EPE_PM蔕M茕qj0*V虓uM;eEPM;6EPEoPSMj0*VfuM9eEPM9vEPEioPMMUI]j *V}93EGG EEP MPPOMt腐Vq肃Pʡ^j0*V蚐uM8eEPM8wEPE\PSME8uK9M& j4+V3MeAH wQMe3Cj MjE[PΉ]D9t M؃近MtM讑eEP8脏UVH^PNH^]锥jqU菏EPq&uNeMt|~&j0*VNuM7eEPM7vEPE1lPMM͎jN+Vd, ^ ^; ^蘎ÿ^W襍=^YuejÉYuEtfFhjXiI3W5^ Yj+Ved, ^ $^; ^ÿ$^W=$^Yuej3YuEtfFhhyXH3W5 ^|Yj+VՍd, ^ ^; ^xÿ^W腌=^Yuej裈YuEtfFhܟXIH3W5^Yj+VEd, ^ ^; ^ÿ^W=^YuejYuEtfFh YG3W5^\Yj,V赌d, ^ ^; ^Xÿ ^We= ^Yuej胇YuEtfFhlyX)G3W5^̊Y똍AhËU0SVW]{ KPpE PpEGPpE览PpEPpQPpE!Pp6K EE;t(P跟EK ;t;uj^u {(IEƃ;t0(ȉEْ&M9utE;t h(W6S]YȀME;t(P W EYE{P(PWYEujE;te(s8Pɞu tmt ǃQ{@ u ǃ?{@t{@ u3ǃ'E;p(IjYu9Nu _^[jM#thG[EP譻j A,V܉这ME0jXEMeCPEPhEԃ(PߝMqVUQQVgtPEP)u(衝^j~]j} YȉMt33@@ZAAY ωƉN衇UQSVu3ۉu^^,=^(ƈ^F,^[j4,Vً}MQp,V֋E؃ePr,VWC=M؊=@M5@j4,VPً}MQp,V֋E؃ePr,VWP1fYYM؊?M?裆UVN?EtXt jVہYY^]j,V聆3j uu臁EYtXppƋ]P;u uEr,V֋juU3j]]!YtjY3ZZBZӋ]R;u eEr,V֋{h-Vօu3] XLPj_h4ZM؉EE}EO@EEPMEErIM@\XE=r!\PXP:9\YYXPQRYYE3}PEE؍EPS u &feMh8ZEE?EEP`EErIM@X\E=r!XP\P8XYY\PQYYEeGP`EPSE u &fFxPEPTP] LP Xt sLPFx<`M ^(^,GGHGHGX GX ߀US] EVWSP~uSVt E0@LUUUtJE]PEPhPZ7MWKMp`&Vuu6MA_^[8Ujh:UdPV2]3PEdFtHLFt j0P{YYMd Y^j.V(d, ^ ,^; (^ÿ,^W~=,^YuejzYuEtfFhlyX:3W5(^?~YUVW}=t4~(u jNPN|莖F(@~(t:2_^]u~(u j F( PN{M~(uưj.VePN8l/ tPNl~jjMMj hhG[EP舰Uy(ty(uA jMhhG[EPXj9.V~eFPNk E# RÊ]$~̃a(jlt.V~3}ZPoIPbMKP c;tp(# t C(}Ã~ C(贍0E;t׃EEپMWQMQI}EIuME0jX}豕EEPEPK OMQ(2M+MtZlMM$Ej3WW~C(j^MA+E;kEEWuMQ{}EtWE0jXEuEEPEPK MQ(lMe~M܅tkMFMEtj MfhG[E&jMxfhG[Ej MdfhG[EPUVMLt1~(u F(~(uPNxu/2^]j A,V{} 39u~(t ~(MԃP{~(]uFTPN#x_MmȋF+j_;wQEPu z@k4PNwMތPEPuMQ(SM|2zj.Vzd, ^ 4^; 0^zÿ4^Wy=4^YuejuYuEtfFhpX^53W50^yYj.VZzd, ^ <^; 8^yÿ<^W y=<^Yuej(uYuEtfFhlyX43W58^qxYj.V'zى]eUPDPMKxP^Px^;;tK;3tG](VK 蛍(EtjWMQPK8+Mt>hxjM@chG[EPjjĪUVuW蕀u~uPOwuV_^jMbhG[EPqUEVW0t1PO2uNQȌ_^]j+/Vqxd, ^ D^; @^xÿD^W!w=D^Yuej?sYuEtfFhpX23W5@^vYVhPNe^V輇MP\;^jF/VxeAUPDPMNkPz\;tjj)wjMahG[EP UVuW~u~uPOsVZ_^]jz/Vwd, ^ T^; P^vÿT^Wu=T^YuejqYuEtfFhpXw13W5P^uYj/Vsvd, ^ L^; H^vÿL^W#u=L^YuejAqYuEtfFhlyX03W5H^tYVPNc^j/V7vكeSP/CPMK苅PZ PZ;t<;7t8p(E蘶jVMQ PK OMtbd ujMd_hG[EPjjUVuW|u~uPOqV7_^]UEVW0tXPOrqNQ_^]j/Vty艇j^@+y hd ,^ \^;n5X^YY;tUx0 uOH()BP8Y;t4x0u.H(Ӆh0YuhYt2sÿ\^Wr=\^YyeMWX^VrY[j$0VNtuEԃeQP3YYEjEЍEjPEx}EjuCEԋP`MX,Hs(Rj(P0Vsu3ۍMV]WYMS]EEMԋ@t00ZuEEP@PQQQQ̉f@@D08YAEP,YMQM\1MjZjp3ɋF 9N8Eы R` RËu3E3SjHX9Y8E A EPU`M[ rUQQSVWuٍM7C3OG_KM^[t!aj0Vq}33CE9Et,VG4VGhXXE]PwVVu ]u@XPBD:-Yq jL0VqEPyejDlYYEEt MQ3PNEM[qUVuW~v,S] VF{tEPSVV[_^] h1VqًEu }PjjVEE3PuXWEPEPMjDEkYEEt MQ1VKE%MZ[,p jhL1VspEPfj_3ۉEhcVM؉]}]*E؉]PE]PEPM%EEr7M@EME=rEPEP#EYYMPQkYYEjD]}]jYEEt MQNSNEBMYToh1VouM3EhXZ]]*E؉]PQEErIM@E=r!PP#YYPQjYYEjXhhZM]E]؉]ЉEԈ])EEPHEErIM@E=r!PPz"YYPQiYYEjXhtZM]ЉEԈ]]E])EEPx=EE rIM@E =r!PP!YYPQiYYE jXESPV]] tG@PHPVp t@PxPVY xPHPP"M=&x2&`'&H&0&&lUVWu$u u7uuN$uu u,VV$E_^] UVuhZu@ghZmujXRhZXujhZDujhZ0ujhZ^]h1Vmlu3uЉEԉFF3ۉEC]9GSj ؋G]XSp0hܟXhXZPLYYPLYYNPLGYYSp 0hhZPLYY-PLGYYSP0htZPLYYPYYPLYYEP8AE؋PMD$ Vkj2VkNz@…tCe~ uAPN!XMP(`P ERÊUjjMThG[EPgjL92Vj OczIPrO3;ujMThG[E(PpYuj M`ThG[E-8P#O;t"(P:Yuj M*ThG[E^@PN;t/ep(jVMQ PO MtXxiøRjMShG[EPTj,rUi]M؊Eu ]5<]eEEE8$uԃeEVPEȋPPSYYM̅tCXMEr6M@EЉME=rEPEPEYYMPQ.dYYh j@T2V7iueEP 5PMNx17PMGGPM;7t_;t[~0uop(E菩jVMQuPN CMtVW~ u.j MXRhG[E2jj-jM>RhG[EgjM$RhG[EP讙jo2VGhNw@t5e~ u3 PD P E!RÊMSgjMQhG[EP5j2VgN=w@…t(e~ u&Pv Eg"RÊUfjM8QhG[EP˜j2Vfd, ^ d^; `^fÿd^We=d^YuejaYuEtfFhXe!3W5`^eYUSVW u_O:vKPIK;ujBp(m3Cu9^u*um΄tpw u2ۈ_ QG _^[jMPhG[EP褗j2V7fNu@t5e~ u3 Pt P E$RÊMCejMOhG[EP%j(2VeN-u@…tje~ uh:Pf PYNtPJ;t x0u!jMOhG[E'E$RÊUdjMNhG[EPpj(3VeN}t@…tje~ uh~PQPNEtPTI;t x0u!jM_NhG[E'Ei%RÊUcjM6NhG[EPj*3VWdNs@…tCe~ uAP$PPNP E%RÊUUcjMMhG[EP7j.Vfc] ESPH}SWIt E8@V~ tUE]PEPhZ6MVK,x`}t juF^YYWu܋uMAb<UQQSVWuٍM7C3OG_KM^[tQUQEVu uNZF!a,C^jX3V_b}uwZ3ۋΉ]^BE9t aSMNLhG[EPؓUQEVu uNZF!aB^ZVN tPX^VNtPZ^Uu AIuPj]Uu AIuPj]UEVZt jV\YY^]UVPEt jVd\YY^]UV7Et j V4\YY^]h3V au$jju蚀E 4e0"EP<7EEPVv$YYM$KS`jRU`MEP$eE؃}CEPCcYM؋4`jL3V`Mċ]]ЍPEPNYYMeQp ,V֍EEPg3Euȉuj EZ}YYtXwwjDZY]Et!MЋ q,VMP,3PMEAPO2zMtbNWMgEjh@x]hv]VE>}ăPEP7EPEP,VM̅tNM!M^*Rjp54V._}E 39jDYYE]t M q,VM֋MP=ÃMMPTEEX]ȉ]̍EEMP}$yEĉMEQp ,VM֋EMQEp ,VM֍EEPGEP~}YYGuTE O u8p$,V֍M M} M̅tLMEtXtL_]Ejh@x]hv]SE蒜xPM'ME6pjA+YG];_GhcVȉESE؉_ PMEQ}E0,V֋MPEPE ujM܅tKu Ml,RË]}CEkM^+RjMFhG[EPCUVxPu^]j84VQ\M3h]TWYE]t ݤMj )WYuEtuMA3ECP]\<PEUMtM]j[u ω6;MQp ,V֍EEP YME4EPEPMԋxu3[UV"Pu^]j4V[u p,V։EMQp,VքtEEPEPO4hxt,uEPYYePr$,V֍MhEfZUES39vVq4P;^t[]jGU\Zj hUYE3҉Ut uЋ8MRp,VYj 4VwZ}3u ]p,Vք*jh]hX]Su]@E܅<p,V֋Mu Eԉ}PI4 u܋@Ep,VM֋up,V֋u9t\jhTYtVu0ˋQp,Vj9TYtuux؋Sp ,V֋Eux<p,V֋}j0,V0Rø0RÊ]~X j *VXu3FEEP軙0PzMtG5Xj0*V_XuMeEPM6EPE>&PMZMYWj0*VXuMJeEPMf6EPE+7PMYMYWU ]iUQVuuW^UQMWE]UVfEN^0jXH@ ]j *VRWu3FEEPg'P&Mt9FVUE 0-]j0*VVuM;eEPMD6EPEP貴MXMXxVU ]UQAZ3ZAZQQ 4]A0jXAQ A0Q8QHQLMQPQTjoZUIVى]} Wu&exXp ,VPKXVUVZFZNTtEN0WNWFZZ^hf5VUًE3ɉ$0(0jXHMDž0p,V֋p,VփeM؃eW Dž0Eؿ0jXEPcmErEM@,@E=r!,P@P ,YY@PQ"PYY Dž4EEP43 P4y3{P9sp ,VsxW$DžxxXuЍxEhV<<@P4LF EPO .LF8G8Ft$Vv6'F+jHYkHP6<kE HMFkEHF^] UQu u ]jL5VKJًU MEeRP;Ep0,Vր}EtP;rP,VPEPYYEMQE8p ,V֋MEt@8E8MQp ,V֍M-H jjzj 6VQI9ep,Vu؋;r ,V֋@vHjjezUkE HPuYY]USVW}ًp$,V֋Wt|_^[]jL76V|Hً}3EEEEMEEZEQ,V֍EPWM;EpL,V֍MQ8p ,V֍MM}te];tj0,VjHX;u}E+lj}jHYkHEE=rEPEPE}YYPWBYY6Gjd6VGEeEE ExZE9Ep\,V֍MQ8p ,V֍M;?F jjxj<6VGً}p,VPWM%;epP,V֍MQ8p ,V֍M]FjL6VlFM EP=PuMMNePMFj6VFuE+jHY؋F+E=8@PPΉEu ekH}ߋˍCHE܉EFV]W9Eu P6 u6}CHVPvuE@uPWlDEu܋MuuMujjwjLZUAEuENu eZFEEF D j5VEى]}eZp,V֍KaaPM@u K E{O~DVNF^MQEp ,V֍MM;xC jjguj7VC3EEEu MEPEuEPuM}te];tj0,VjHX;u}E+lj}jHYkHEE=rEPEP"E}YYPW@>YYB j87VPCu ejVu"uF P,VzB jjitj,c7VB3E܉EEu M܉EPGEPuMh ?EpH,V֍MQ8p ,V֍MЈEaMm:M}܅te];tj0,VjHX;u}܋E+lj}jHYkHEE=rEPEPE}YYPW=YYE}Aj,7VBuE MȃePu=?Ep$,V֋؍EP;r ,V֋MЋp,CM9A jjrUSVWu{,Vքt{u u0,V_^[]U VW}pL,V֋NM MMjQEZ}_^j@7V2AًU MEeRPD;Ep4,Vր}EtP;rL,VPEPYYEMQE8p ,V֋MEt'/E8MQp ,V֍M/? jjqj$7V8@u eMui ;Ep,Vր}EtP;rT,VPEPYYEMQE8p ,V֋MEtf.E8MQp ,V֍MW Mc7> jjpj7V?3EEEu MEPuEPuM}te];tj0,VjHX;u}E+lj}jHYkHEE=rEPEPE}YYPW9YY+> j@8V>ًU MEeRP,;Ep8,Vր}EtP;rX,VPEPYYEMQE8p ,V֋MEt,E8MQp ,V֍M= jjaoj7V=3EEEu MEP?uEPuM}te];tj0,VjHX;u}E+lj}jHYkHEE=rEPEPE}YYPW:8YY< UVI~uu u~u u u^]U } SVW76tPu;6t}]MuMuE3p(EP,VM|u;0u4E;t+] p(P1,V֍ME;u_^[jF8V~]j}(6YȉMt33@,ZAAY ωƉN:jH8V;}}#3Zj]GZ_X5YEEt BPO\]ME9_\tS:hZM EEPM>oh[EP lj(8Vp:uԉűEM3TyXh]]F]]NEE؉MPYYiE]r3M@EЉME=rEPEPEYYMPQ5YY^ Ɖ^$^(9 tjxUjh9VdPQQSVW2]3PEdeuZFZeE APRËuN`tR('Md Y_^[UVNDDEt jVC4YY^]̋I tjUu uQIHZ]Uu uQIH]Uu uQIH]Uu uQIL]j<<9V8ـ{X]Euxe{PCXtUSM{PEp,V֍MQ8p ,V֍MEEQRÊE]Ejr,V֊E7UuQIH]UjuQIL2]j|q9V7} MtQQ,Vքt0hpZMEEPxG*h̀[x-6h ZMeEPMQhxN[EPhUu uQIH%]̋A\jP9V7u3ۍM]]NHESPVEM SRÊ]/6jUUL6eMhXE0jXNeEPpL,V֋CMM܋7u2u up,V5UVWyu u0,V_^]UQQI\k(MMMjQEZUuQIH]Uu uQIH]VW,V֋,V_^VW,V֋px,V_^j9V75epL,Vu uBl4TRVW,V_^jH9V5] ueSVuV,VքtSu ,Vu+pL,VSu=B3 hZMEEPM&h̀[EPej :V3eM衿tM)EMEPGGPPp,VP(YYWG+u 1+EP\+u$^+u(MVQpp,V֍M 52$Uu uQIH-]Uu uQIH]Uu uQIHg]Uu uQIH ]VWpL,V_^BVWpL,V_^ BUVWupL,V֋B_^]UQ3TZAAAAMTZUVEt j V$-YY^]USVu3ۋCC|tCW} Gu Gt.*~ u PV&~u PVYYtG0_^[]UVu~ t2ySW} 39_u Gt0^E,AEGEEt3ˉ]E@Pu0UY"YUtMCM;]rUOt1_[^j$/:V1u }>u63EM؉]]E؉]P8^u;u;tN(QPYYMEr6M@EԉME=rEPEPgEYYMPQ+YY0UVuYtE @t02^]UEtNt@t2t$Htt2]ËE x ]ËE xE xE xM ]7M ]-7UW}t2E V39pu@t8SϳXBȉMjA+YȋE @E90t;Ätl9pt ;H"؋EtY@;BEt>։uUƋM ȋE@ PQ1YY"t$EFU EU;ur̋E Ht9[^_UVu tctStCt3tW}W6YYt Nt9_~]j}oYȉMt33@tZAAY ωƉNjT:VuF]++=?@PEPΉEu e}؍CˉE܉EܠFV]W9Eu P6' u6}CVPvuuuW >u܋Mu uMujjNUQE VuuNTZFF\;^j:Vu3҉U9U tZFFXUEFtVv6 F+P6ME FEF^] UQu u ]j xu7eVSv]6 uWS`uMujjBV>t(Vv6C F+P6-3FF^j$|VuE؋M PueEPEPYYM&EЃfP;MԅtLjTV}u3V_wO]FYPYjjN>Vu3ZEFFF VE=P$qq1 VN蔃^Ujh;UdPV2]3PEdVZΨP详NXMd Y^UVuW6FPO_^]UVuWV FPOǬ_^]UQVW9Qu¦p,V_^UE;u P>]UVN蓂Et j$VhYY^]UVEt jVDYY^]j>VM yjY0@+ƙ~Nuwyuqd3ۋ̉ePYY Ή]DPEP~YYPM]]-EMEPEMtmMtaEE3ۉXX@Xj>Vd,^ ^ ^;þ^V=^Yue2h@VUVXYYUA+j$Yq+;w;EsE]UV>t$Vv6"F+j$Yk$P6跗kE $MFkE$F^] UQu u ]V>t.Vv6F+j$Yk$P6Y3FF^j(>V EM̋u P"eMVEEPOiMMnUE=qwk$PY]ɺUkE $PuĖYY]US] VWSwuCWwVEw_^[] j?V+3E}qYEEu Nu $;u 6AU$2]3ʼnEVu WPPEPYYM蛺M^tM3BUQQVWu+uwEVwPOV0EP_^Uu`]USVWpHEMu;tB;QuNp,V֋ut CP$;]uȋ}vuEVSPV0EPE_^[UVu WvuVu6YY~ t_^]Ujh:UdPV2]3PEdu NnjVYYMd Y^UVWMW7+;sWw4Vew*v+G+;v u QW+QwG _^]j,?V4u}?F+uEBPΉE臹U؋Me+V]QPEZVSvE6uuSuMuuMuڼjj0艸UU Vut W34_uVVS ^]UVuF;Ft FPw^]UESW8;tV0,V^_[]jO?V}wZ3uVEFBY0ZUV:Et j VYY^]j?V*3ۉ]uM ]EAj_;totPt1h12QQE$Pr EOPEPYYE5PEP YYEƚPEPYYE0詤MkEQQE$P }ƃt@tEPYE QQE$P ExV]PM}]EEPEPYY0EMk}E }t}tu=j u 0h >@VW3ۍjl]迸XSPX,Xjl`]SP\]+]̋EC]xrPMdEEE荅PEPUYYt9E xrPM.jXEEE荅\PEPU]YYuEExVtEEMEuCE]tMEu*]}to4MAuME2EEPMu MEuME uҦ ME uME u貦2ۃ}E\u `PzYXEu PzY\UESVWp3+0tߋu wuEG;r2_^[]ËE8UQQSVW}7)Q̉]u D~X4,VMӄu;u2_^[ðjl@Ve] e;pP,VքuE d;MQ,Vjh]hu]juE8tMEPMKEuM&K.jHdCVu3ۋ} u]d, ^] ^;" =^R hZMhZMEEEPE^P迍M؈]8hZM̘hZME踘EEPE^PzM؈]hZM臘hZMEsEEPE^P5M؈]讜hZMBhZME.EE PE^PM؈]ihtZME hZMEE PE^P諌M؈]$hZM踗hZME 褗EE PE^PfM؈]ߛh\ZMshZME_EEPE^P!M؈]蚛hZM.hhZMEEEPE^P܋M؈]UhZMhZMEՖEEع^PEP藋M؈]hZM褖h ZME萖EEPE^PRM؈]˚hZM_hZMEKEEPE^P M؈]膚hPZMhZMEEEPE^PȊM؈]AhZMՕhXZMEEEPE^P胊M؈]hZM萕hZME|EEPE^P>M؈]跙h ZMKhZME7EEPE^PM؈]rhhZMh(ZME EE!PE^P贉M؈]-hZMhpZME"譔EE#PE^PoM؈]hZM|hZME$hEE%PE^P*M؈]裘h<ZM7h ZME&#EE'PE^PM؈]^h\ZMhDZME(ޓEE)PE^P蠈M؈]hdZM譓hDZME*虓EE+PE^P[M؈]ԗhZMhE,hpZMTEE-PE^PM؈]菗hZM#hDYME.EE/PE^PчM؈]JhZMޒhZME0ʒEE1PE^P茇M؈]hZM虒hZME2腒EE3PE^PGM؈]hZMThZME4@E5EPE^PM؈]{hZMhZME6EE7PE^P轆M؈]6h ZMʑh ZME8趑EE9PE^PxM؈]h4 ZM腑h ZME:qEE;PE^P3M؈]謕h< ZM@h ZME<,EE=PE^PM؈]ghx ZMhH ZME>EE?PE^P詅M؈]"h ZM趐h ZME@袐EEAPE^PdM؈]ݔh ZMqh ZMEB]EECPE^PM؈]蘔h!ZM,h ZMEDEEEPE^PڄM؈]Sh8!ZMh$!ZMEFӏEEGPE^P蕄M؈]hX!ZM袏hD!ZMEH莏EEIPE^PPM؈]ɓh|!ZM]h`!ZMEJIEEKPE^P M؈]脓h!ZMh!ZMELEEMPE^PƃM؈]?h!ZMӎENMh!Z迎EEOPE^P聃M؈]h "ZM莎h!ZMEPzEEQPE^Pp(,VքjTETEuЉEEVH+M >,V3ɉEM̅tn]Ћ;QMQpx,VučEEPEPb EHE w MEP2MjMEXMAM;Mr]MčEPuE+TPJTEЋ8p$,Vքj <3MQE,V֋u};EЍMVQEX|,VMučEE PTP4 \HE w;E؋PGMEP4E PTQ(M+T MEW;Z]MčEPuEEE PEȋPs }E EPMPEE Pނ赂ME Mԅt$EPEYPtEPYY0ME2MEPD YY0MEM1PME tEȋPeMPM{ej dUzM AH v u53EEEEEPQu9U tM+ʃQRuYYEUjh:UdPV2]3PEdueD~YrPuu vQ舠Md Y^jZEV}uVdeFPOFEPOdF EPO d>j EVf}uqd3ɍwMOO EEPTY0E聇MEEt0MQp,VM0OEHMEaNEP舱Y0O E$MANj FV}ucu e_܀uOEcuO Ec;Eu#EP}Y0E誆MEGEu% MtMQp,VME5p$,VMքu5t/MQp,VE0O0MEIM u EPjY0O EM#Mmj EV}3ɉwMOO EEPY0E超MEEt0MQp,VM0OE}MELEP软Y0O EYMvLUQVW};thWViYYtWG PF PVYYtDGPFPCYYt1G~;8t+t#8tQP~p,Vքu2_^UQEVW8E ;8t+t#8tQPkap4,Vքu2_^j=FV(E];t'p$,VքtM3K4ExMQp,V֋M0eM:KjFVu33C}9} tF"ZFX}]WuNFM`"Z]@D0"ZFPB2~t jMchG[EP UjhFVdPQQSVW2]3PEdeuFF`"Z@D0"ZFPBD2eNEtN խRËuNMd Y_^[+IUVW~YEXt jWYY_^]jFVWM 3ۉ]]jEEYE3AMtQu ]Q̉eV]|}QEW] ]Et F^@؋?QSJ),V֋]MSu bjMhG[EPD +IAu)t!AVWjxWr,VO_^2Uu uEYY]j mY@@f@ UVu bH;u u^]UVu WvuVu6YY~ t_^]Ujh:UdPV2]3PEdu Ntj VYYMd Y^UQQu EPEMMHjO?V8}w#Z3uVEFYjQGV}33F]9] tG#ZG4X]uSuuGx#ZG#ZG#Z@D8#ZGHAЉ9____ _$w(EVu^_lYMEt )jMhG[EP QoUjhGVdPQQSVW2]3PEdeuF^#Z#Z@D0#ZFHAЉ1eNE!tSN2 ȱRËuN(QNlNXMd Y_^[+I47̃*UVe+Et j VYY^]UVEF4Xt j8VkYY^]jGVd, ^ ^; ^ÿ^W=^YuejYuEtfFh"Z腑3W5^(YjHVM 3ۉ]]j8EoYE3AMtQu 5Q̉eV]?w}QEW], ]Et F^@؋?QSt$,V֋]MSu jMhG[EPnjIHVd, ^ ^; ^@ÿ^WM=^YuejkYuEtfFh"Z3W5^Yj}HV d, ^ ^; ^ÿ^W=^YuejYuEtfFh"Z聏3W5^$YjHV}d, ^ ^; ^ ÿ^W-=^YuejKYuEtfFh#Z3W5^YjHVd, ^ ^; ^ÿ^W=^YuejYuEtfFh"Za3W5^YjIV]uMeQ,Vjh]hu]juEBMj%MAj7IVd,(^ ^ 4^;þ4^V=4^YuenhpV7V:YYj,zIVue^S YMEEVtK}uEuV|u MVVEPPMESMEu'uEP|PME'ME/MQMQ0}EyME2@?u3MQMQp,VM0ExME?Mpt EjPe YY?tcQWsU}YuMEuPI((t M (MP$}iRjM#hG[EPjIVd, ^ $^; ^ÿ$^W=$^YuejYuEtfFh#ZP3W5 ^YjIVLd, ^ ^; ^ÿ^W=^YuejYuEtfFh#Z3W5^cYjJVd, ^ ^; ^_ÿ ^Wl= ^YuejYuEtfFh"Z03W5^YjJJV,d, ^ ^; ^ÿ^W=^YuejYuEtfFh"Z蠉3W5^CYj~JVd, ^ ^; ^?ÿ^WL=^YuejjYuEtfFh"Z3W5^Y+IAu#Wy̅tWVjr,VO^_2jJVd, ^ ^; ^rÿ^W=^YuejYuEtfFh #ZC3W5^YjJV?d, ^ ^; ^ÿ^W=^Yuej YuEtfFh(#Z資3W5^VYjKVd, ^ ^; ^Rÿ^W_=^Yuej}YuEtfFhT#Z#3W5^YjNKVd, ^ ^; ^ÿ^W=^YuejYuEtfFh<#Z蓆3W5^6YjKVd, ^ ^; ^2ÿ^W?=^Yuej]YuEtfFhl#Z3W5^YV>t(Vv6F+P6:_3FF^VW7vWzv6vg_^VVv6 F^Uu uEYY]UVuPXt b8P=tvqP%t^P tFaPt.Pt%Pt -P ^]jdKVNىM{]jWC}C+C YYjYe3EčK ;s$kP(EF-RË]}]MύEPPEEPMEMЅt$}EPM[E5sEuM;EMMWQeeExVE{EPEE POEPu,VKW}E ExVt#}tu*j u eEEE tHY؋Cx,VK׍M6]tRøtRË]u]MEoMċ}EMEHK]3WESP2}E t1jh]h`u]juEt1,VM֍ME5G rM1lXV~uCW~Ht3SF^ujWp,VS[_^j]KU ]3>~]j}YȉMt33@$ZAAY ωƉNj]KU]3>~]j}YȉMt33@,$ZAAY ωƉN.UVbEt jVYY^]jKVMe]Vy8t*jhh]h@]j0tX RÊ]jLVAM3ۈ]]~9t(Sh]h@]S0tX RÊ]\j8LVMe] x8uEu;j|Yt $ZX3PM4MPExMtMjhh]h@]j06tވXٸURj[LVeMe] 8uEt;jYt $ZX3PMMPEMtkjh]h@]j0tވXٸRUjh:UdPV2]3PEdpuj6脿YYMd Y^US] EVWSPNuSV豪t E0@L tJE]PEPh<$Z7MW Mp`&VuuyMA_^[|Ujh:UdPV2]3PEdFtH1Ft jP裾YYMd Y^VNZQX^UVuW;0E u&x t E MjVuE ;u_^]UQVuWuMjVIPWTEYY_^US] VW;t`utRqtMEQO D;GuWnNtEOEPEP63i_^[j MphG[EPVW7vW|v6vg_^UQQVWuEP!uu`YYuϋu_^jLVM 3ۉ]] t?}M ]E}sENEPC;Ft phIjM蟫hG[EP)UQVM-sENEP/^U]jLV#uFNuD$Z@D0X$ZFp$Z@D0$Z]Me+t jMhG[EP}UjhLVdP SVW2]3PEdeMAAp$Z@D$ZeqEutV9 HRËu#Md Y_^[UVUEt jVAYY^]jMVd, ^ l^; h^芿ÿl^W藾=l^Yuej赺YuEtfFh$Z[z3W5h^YjCMVWd, ^ d^; `^ÿd^W=d^Yuej%YuEtfFh$Zy3W5`^nYjwMVǾd, ^ \^; X^jÿ\^Ww=\^Yuej蕹YuEtfFh$Z;y3W5X^޼YjMV7d, ^ T^; P^ڽÿT^W=T^YuejYuEtfFh$Zx3W5P^NYjMV觽d, ^ t^; p^Jÿt^WW=t^YuejuYuEtfFh$Zx3W5p^辻YjNVd, ^ L^; H^躼ÿL^Wǻ=L^YuejYuEtfFh$Zw3W5H^.YjgM )ٺjHNV裻E3ۋMEEEEPE]nMQEp,V֍EP!EY GPEPEPa EExV]PMĉuĈ]fQEEP[EPEPH 0MEaM(Eu9]t8]tuj ui M(M s#MrMPfRÊ]ӊԹj#OVAe3C]\eMPExVEeMEP]vE}Et}tWAj [SW躴E j [Etu +eMPExVESeMEPEvE}Et}tWɏSWEE Etu +eMPExVEdMEPEuE}Et}tWYSWճE EtuW 'eMPExVEsdMEPEE؉E܍H$MMQj PE܃eEPEPMQM}؅t' ;uuE+ǃPW>uYY \E΍EPEPM 1M@ ^Qͩ j M#hG[EPVW7vWv6vg_^UQQVWuEPԌuuYYuϋu_^jLV腩M 3ۉ]]tE}M ]E0[ENEP*;FtPM4P jMLhG[EPUQVMZENEP)^U]UVu j ;u u^]UVu k0;u u^]UVu ڍ;u u^]UVu WvuVu6YY~ t_^]Ujh:UdPV2]3PEdu jNj4VgYYMd Y^jQVu3}9} tF%ZFX}EWuF%Z@D0%ZFHA1Ɖ~sj QV蛧}33F]9] tG'ZG4X]uSu=G&ZuwV@uD8'ZGHAЉ9^? lj___ _$_(Y_,jQV u3}9} tF(&ZFX}EWuF&Z@D0&ZFHA1Ɖ~xjRV蠦u3}9} tFd&ZF(X}EWuWF%ZF4&ZFH&Z@D0P&ZFHA܉1Ɖ~~~ jLV!}GOut(Vv6;F+P6\*3FF^V>t.Vv6&F+j0Yk0P6$*3FF^V>t(Vv6 F+P6)3FF^UQVuu5Nu5FM FHFHF@ F@ ^ USVWu EPzu }˥uV{t E0@?{ffft=u M3SdMp`?VuuJMA_^[$MUQQu EPgEMMHUQ}Mt'ZAA XAhYYlPQ贅YYuh(ZM؉]E]3EEE!PdPEurKM@hlE"=r!hPlP>hYYlPQ+YYuh(ZM؉]E]DEE#PdPfEurKM@hlE$=r!hPlP=hYYlPQ袄YYuh(ZM؉]E]!DEE%PdPEurKM@hlE&=r!hPlP=hYYlPQYYuh(ZM؉]E]CEE'PdPTEurKM@hlE(=r!hPlPxEE9PdPEurKM@hlE:=r!hPlP7hYYlPQ~YYuh(ZM؉]E]>>EE;PdPEurKM@hlE<=r!hPlP7hYYlPQ6~YYuh(ZM؉]E]=EE=PdPqEurKM@hlE>=r!hPlP6hYYlPQ}YYuh(ZM؉]E],=EE?PdPEurKM@hlE@=r!hPlP 6hYYlPQ$}YYuh)ZM؉]E]PdE]PM؉up3h)ZMPdE^PuMB3h)ZMPdE_PgM؉u3h)ZMPdE`P9M؉u2h)ZMPdEaP M؉u2h)ZMXPdEbPMu2h)ZM*PdEcPMu\2h)ZMPdEdPMu.2h)ZxPdEePPxu1h)Z`PdEfP`u1h)ZHcPdEgPHu1h)Z0/PdEhP0u^1h*ZPdEiPu*1h*ZPdEjPLu0h*ZEkPdPu0h(*Z_PdElPu0hX+PdEmPuZ0h0*ZPdEnP|u&0h8*ZPdEoPHu/h@*ZpPdEpQp/vh^uY95^W] ^$Vtu$^uYvj WVve]#u 3@EEEPsYYE}eMPExVEJ"uMQMEQx|,V0ESMp}EExVt}tuLj uq M<SøSË]uuj8LXV v3ۉ]uu 3@EEEPYYM EPE蘓E+EjYQEĉ}QĉEP^E 0EMEÉ];kMEExV]Ј]EP!uSQEM̋EQPx|,V׋}MQ,Vփ}EExVt+}tu_Kj uo ]Ј]S3ۋEu@}EEBMwNM?Sø?SËutjXVteu&M 3@EEߒPEPuYY0EQMnSøSËusjXVs3}}u uVر}E9>tjsjM]hG[EPLjYV{s3Eu} 3CEω]+tG+t.+t+ugEWPYY]=EWPeYYE(EWPsYYEEWPYYE0JMgrjM ]hG[EP蓤jTYV-s3ۉ]uu 3@EEEPYYM EEWP}@YY0EME;s?uQESPxx,V׋}S,V֋uC}뽍MvSøvSËuqjYVWrO.uMPq3ۉ]PMExV]]MEPE.ËuEt}tVYY0]EDME]3;eMkExVEEP3QEM؉uQPAYYW,VMփ}EExVt#}tu2Fj uj eEuGEkM^I oBSjPYVoM̋E M]EЋ8@+ljMu[?p ,Vքu+[PnEЍMeQ8pL,V֍MEQ"MEExVmeEPMEE0jX跆M̍EPE蚍PEP~]j}gYȉMt33@*ZAAY ωƉNylj ZV mu3}9} tF*ZF0X}EWu]^F%ZEZFh*ZF*Z*Z@D0*ZFHAԉ1~~ ~$N~(E_tSN SËukj:UkuueN*ZE Fk9UjhZVdPQQSVW2]3PEdeuF^h*ZF*Z*Z@D0*ZFHAԉ1eNE蓊tSN^ VSËuNNX7Md Y_^[+I0 ̃UV/EF0Xt j4VfYY^]UVNOEXt jVeYY^]j$ [V|j}up,V֋]E3C+ƉuuWMP[O}uߋ>p0,VքuLVuM苉C +evAPM誌Mp$v APM芌jdYEEtuMQ3PMEee}tGEE}]MQEp ,V֋MEt^XE M0tFXMgNhjT[Vid, ^ ^; ^hÿ^Wg=^YuejcYuEtfFhP*Z#3W5^%gY+IAu#WyЅtWVjr,VO^_2jo[Vhue1g[!SUVW~tWYt uN u_^]UA+‹M;v]9!j8[VhzMԍCPL3EEȉẺEjMEVu EP葥M E躃eMxVEPugEEPEP8YY}Eut#}tu=j uWb eEE̍MEQ;Et E PMauEP6YYMEP;Mt E QMIMEE̍MQ;EtẼE PM'aE̍KQ;Et E PMa{EPQC eP_QCE P~7EPE,VMMMyuȅt)};td;uuȋE+ƃPV%YYM/Ke#Sø#SVVv6 F^UVWu5tXp,V_^]UQSVWy3ۋw+7tAESgMPC;rx_^[UAu E;pX <uE;tXu u PA]j4[V~eE3P]ˉ]聁3@ErMQMQAEEPkYMĄjXD؅tSMyMЅtS %SÊ]ˊRdj \VLd.3ExVPM]]LMEP]!Ã}Et}tu:j u8_ cj \Vc>3ExVPM]]MEP] Ã}Et}tu?:j u^ 2cUQSW_^_[jނUb]3>~]j}]YȉMt33@0+ZAAY ωƉN]bj5\VbuF+}+>=@PE%PΉEbu e؃]ύG E܉EFV}S9Eu P6D u68]G VPvu"uuS au܋MuX uMuijjjP\VbuF+}+>=@PEM PΉE) u e؃]ύGE܉E萀FV}S9Eu P6 u6]GVPvuuuSK `u܋Mu uMu jj裒Bj s\V`u]}uu]eW u;} uSVV踷 V`j \V`u]}uu]eWu;} uSVV裷 `UVuF;Ft xF P^]UVuF;Ft 8FP=^]UQQSVWuٍM7C3OG_KM^[tNj\V_}uVeFPO_G_j]Vo_u33B}9} t$+ZFFtXUFtVv6F+P68E MFEF^] UV>tVv6F+P6E MFEF^] UQu u茭 ]UQu u训 ]UE=wPY]tUA+‹M;v ɍ]VVv6 F^VVv6= F^UE PuYY]j4^V!VuEx+8}3ۋSd]PM9E9^4uD΋A H wAPEPsYYEEP&YE0N4MEÉ];sMP]}܉]ĉ]jMECuEv0P|&YYMEP;Mt E QM7ME=Eă4V;EtEăE PMFOEčO Q;Et E PM$OEp,VքtXu܍EPQ̉e܋>FP`QFEP7EPE,VM~5S3ۋu}Et6EĉE;t^;uuuE+ƃPVYY]]ĉ]ȋE@EM9qS5Sø5Sj^VSF8PMe~0jPXj\YEPNPjN\bMSj _VSMexrt[j6NYt *Zp3~PeMeWF3MEPu E&sMtAR6SUQVWyw+7t#SM3ۋӍBPRM u[o_^UVNsE NuF0fF^] UVNtuu uNj ,i^] UEVjhp]h`u]j0Nu Q^]j 0_VQٍsrt{VċYtp3E0jXEԉEEKEPDMZSMEtAxGp,VO֋EsM0Nu Nxe u uPjނUQ]3>~]j} LYȉMt33@+ZAAY ωƉNPUQQSVWuٍM7C3OG_KM^[t?jr_VwPu33B}9} tt+ZFFLXUF+IUVW~EXt jPWJYY_^]j$_V,OMue^+u;MP%EP?YEE8p0,Vքu;MP}eMPExVEMEPE  ,u}Et}tW5%j WI Er9EHQPEPuMnPE!MEn3rAeEMEPEPEPu>nPEM,3EEdeeEE PEPEPuMmPE M2EE tHyGp,VO֋EE tHyGp,VOEEx(~MM 豻LjP]`VMٍ{\lu:MPLuF+s9كe,iPM,6EEPYY3ɉMQĉeԉQEEPE EhjPGYEEt jV3PMEmMQMEQp ,V苮3ۍMȾxV]PuȈ]ASË]̋u3Et6EE;t螶;uuuE+ƃPV^YY}}}MEmEu@EMD-GASøASj^VGFPMe~(j,Xj8YEPN,N8MAGj `VGMeft[jgBYt H+Zp3~PteMeWF('MEPu E9lMt6FBSUQVWyw+7t#SM3ۋӍBPRdM u[_^UVNhE ΃F(^]UIt]]UEVjh0]h`u]j0XNu Q^]j 0_V Fٍsft{VYtp3E0jXEԉEEKEPMGMEtAxGp,VO֋EsM0Nu NY u u8Ej`VEuE+j0Y؋F+E=UUU@PPΉEu ek0}ߋˍC0E܉EFV]W9Eu P6i u6}C0VPvuE@uPWp{Du܋MuuMujjNvUjh:UdPV2]3PEdpuƛj46?YYMd Y^UVuW};} tW_^]US] EVWSPv)uSV*t E0@LNtJE]PEPh+Z7MWݨMp`VuuMA_^[j aVyCu]}uu]eWH00u;} uSVV聚 Cj aV,Cu]}uu]eW00u;} uSVV4 BUVuF;Ft tF0P[^]j?aVB3GGE@E;t2+V@Gw}eWPuSG+BjpaVSB}uOFPeFPOeaF,EPO,3AjpaVB}uOFaaPWeFPOaF,EPO,AjaVAuE3ۉ^F^N]b^,JAjpaVrAuENu aaeNbuN,ER@ jaV$AuENu 3yyyuN}3`~,@ Ujh:UdPV2]3PEdFtHj[Ft j4P;YYMd Y^qq1轗 Q鬪UjhaVdPQQSVW2]3PEdeuFF&Z@D0'ZFЋPBЉD2̃e~EX_t=vPavavavsbvb ISËuNTNTN{TNsTNkTVMd Y_^[UVuW6vOvOv O _^]j2bV;?d, ^ 8^; 4^>ÿ8^W==8^Yuej :YuEtfFh+Z3W54^R=YjfbV>d, ^ @^; <^N>ÿ@^W[==@^Yuejy9YuEtfFh+Z3W5<^d, ^ P^; L^=ÿP^W<=P^Yuej8YuEtfFh+Z3W5L^2t$Vv6qF+j0Yk0P6okE 0MFkE0F^] UQu u- ]UVuW;0E u&x t E MhVuE ;u_^]UQVuWuM:VPW&EYY_^jgV.ً}EWPK9MQu (P3 uLeEWPK0F(;F,uW@Yt WKOu N(W [S2-j44gV.}N] Nt3FPgYt%SWjMneN4PMB SWU-jPgV-MЋE] EE]̉EăeLu [+؉Es 8HMԋp ,Vքi}ԋ?p0,VքKuԍMaL}ȍMQE?pL,V֍MEQMEExViErIE̋Eԋ8p,Vքu'}ԋ?p,Vքu EԍM0rVE̋ ;p,Vքu7;p,Vքu ;p$,Vքt SMN}ЍMQMQp,VPEPUYY0MEMMMMPMT+UE=UUUwk0P׾Y]UAV1+j0YM;v k0^]j,gV+u Me^SrMi3EԉE؉EjMEueMȿxVE}EEPEP&YYMEP;Mt ®E QMw M }E}t}tu:j u% EuE;EtmE؃E PM$E؍N Q;Et FE PM$>EPQFeP"QESD7EPE,V}MHuԅt)};t3;uuԋM+΃QVYY_Sø_S2R) jgVz)ًu3E +}tuNjPu*tE M |)VW7vW蚀v6vg_^VVv6G F^UkE 0PuAYY]j4$hV)EԋMu MЋMM̃eH Hu_/F+Ãss;p ,VքuMP;MQpL,V֍MEQ3MEExV}ԍKQMEQp ,VPEPYY0MERMoMM_'j IhV7(EuX P ;3u;u2Le;3] tS (Vuuu;~tS (Wu'5bSj44gV`'}N] Ht3FP-aYt%SWjMeN4PM袃 SW&UQQVWuEP #uuYYuϋu_^UVW} WvGPMN  EF8_^]UQVWyG+j0^3EtSYVPF;ur[_^UVuq ;^tH(@,+t QM f2]jdhV<&~?u2j EYt +Zp3P7eNHY%øcSjhV%~ ?u2j EYt ,Zp3Pq7eNH%øGdSjhV%~,?u2j- EYt 0,Zp3P7eNH$ødSjRU %uODPt!Put %PXt |uP>t e[P$t AzpEjPPe_PMM؊t#jhV9$~(?u2jEYt ,Zp3P7eNGV#øeSjhV#~$?u2j~EYt ,Zp3Pn7eNG#øJfSj`ciV#ى]܍MxDeMlDEEP9PEEPP3Eu}uaE6}uȍEEeeCEPEP`FEPMu EEP@YY0MEMEِuEP@YY0ME ME豐Q3QĉEP< 0ME fMEPMExV]Ј] E ESQ̉tHyG0,VO֋uMQ,V׃}xVE }t}tuHj u EPM}]]{}E SQĉ8tG@ljEԋ,VMӋMQ,VӃ}xVE]t}tuj u1 E]M3P]]SQEEPӤMQ,VӃ}EExVt}tuFj u }EtC]PEPKGMQ ̃(ePEqPE]܀}t>PEPKMQ ̃(eP6E(PE]MAMKEEt HIEԋX,VMEt,GXߋCx,VKjSøjSËuEEtFxGp,VO֍MM} UIt]] jtiVى]u M}T@eMH@VE;PEP EEPEԋPEӍEPP3EÉu}u\E1}uȍEEeeCEPEP\FEPMEEWPPEPKMQ ̃(ePE1PEMMԆEtGXߋCx,VK׋EEt,HY؋Cx,VKqSøqSËuEEtFxGp,VO֍MM  UIt]] jl)kVى]܍M8eM8EEPPUEEPWPA3Eu}uE*}uȍEEeeCEPEP1UFEPMfu EEPi5YY0ME2MEKM7tCMEP,EE PEP$5YY0ME M MEe$EP#Y0ME 追ME؄Q3QĉEPc 0ME 荽ME覄5PMExV]Ј]0EE SQ̉tHyG0,VO֋uMQ,V׃}xVE}t}tuoj u E3PM}]]}ESQĉ8tG@ljEԋ,VMӋMQ,VӃ}xVE]t}tuj uX E3]M3P]]SQEEPMQ,VӃ}EExVt}tumj u }EtC ]PEPKnMQ ̃(ePEPE]܀}t>=PEPK&MQ ̃(eP^EPEMiMs}EtGXߋCx,VK׋EEtHY؋Cx,VK׋EEt,HY؋Cx,VK {Sø {SËuEEtFxGp,VO֍MMUIt]]UU:uBPBP5:uBPBP!:u :u B,PBP]̃j44gV ~.t,WGYt!jMeN4PM+jN3? jlVT eO,uMPQ6p,VPEPYY0MEWMt{Ml{ j*lVG uEPO0EPu (V' tAE΃ePEP;FuuYt uO-}S23 j44gV }N] 2-t3FPMFYt%SWjMeN4P&Mh SW jXulV EM] MM]MeH+ug4[+؉Euv8p ,VքuMP蚷}MQ?pL,V֍MEQ3MEExVME,jYE;r'u4MhMp[M@ 0ru4M<M@rFuMP}MQMQp,VPEP7YYE}EMECEePETMEPIEr7M@EME=rEPEPPEYYMPQnYYEEjPYYE0M[MxxM;MM`x UESW;;ttVjp,V֋E^_[]1 YUjhlVdP2]3ʼnESVWPEd} MU]uˍqAu+΍<;ty+Í@=vN3ɺ Q EFPVWSCVL RQEPPWS$Md Y_^[M3Y]UjhlVdP2]3ʼnESVWPEd} MU]uˍqffu+u(XFV譄MtVh(XP" Et,p,VM։Etj1,VM֋NjMd Y_^M3V]3Ujh\nVdP2]3PEdd, ^ ^;<]Md Y]h^=^ujh,Z<]EhVh^UjhnVdP2]3PEdd, ^ ^;<]Md Y]h^n=^ujhY<]EAhVh^UjhnVdPT2]3ʼnEVPEduE؉uPEEPM_PM}U؋ECU؅tIH;Bf|:/t\u @;r_^[]UfEf/t f\t2]ð]UMVu tYQrDp/t\uut5u5Qrarzv fw\r fy:uN^]ÃrDQr/t\u+r@/t\ujh,Z;^]2^]Ujh`oVdPVW2]3PEdEDU u@EDM$;u;tRU`;U u9}dt?EHPEPu\EPEHPuAEPEHP;u&;u}`;u 9}du3;u;tUr2MUrI#+RQ6U<3EEfEr2M(UrI#+RQU\3E8E<fE(r.MHUrI#+wgRQU|3EXE\fEHr.MhUrI#+wRQTƋMd Y_^]PVqt7Qrf|p:t#rDp/t\t j\&^3^UQUtmAV0E;s_Wyrf|P/trf|P\u8Sƻ+;B؃r E Q+0+uPYPQ [_^]SVWwWtrp/t\u2VWЅt%N;trDp/t\uuۃuu t_^[_^[UjhoVdPSVW2]3PEduNFFVy;u&F~r63fMd Y_^[]ÃvK^ƃr/t\u2ƃr@/t\uƃr@/t \t2yrS/t\u}~r^f|X:yrP/t\u BVy;u݋F;u1HPQu"NoPGMd Y_^[]vNh,ZVȃuJF+QPE܋PE;txrpQǪM=Md Y_^[]F~r6/Md Y_^[]UjhoVdP8V2]3PEdE\Ѓu3EEfEԍMԸ ~rQPVMȸu3҃FF~AfFAAftME=EtM.ƋMd Y^]UjhoVdP2]3PEdd, ^ ^;^Md Y]h^>=^uWEh^f^hPVh^ UEVu v5Pȃrfy:uȃrI/t\u^]Ãu;Pȃr /t \ȃrI/\vrHЃr/t\uYЃrR/t\uBЃrfz?u2ЃrJ/t\ujh,Z;^Bȋ]ÃvbHЃr/t\uIЃrR/t\u2ЃrJ/t \tjh,Zn;^Bȋ]Åtxr/t\u3^]Ã^]UQU3VuW} uFFfA;r%+;BЃyr yRQ_^] 襤̋tPVUjhKpVdP2]3ʼnESVWPEd}u u 2FFأXUE̋P+}UMuECf8.u2ۃr/UrI#+lRQGrWO׃rf|B.uC׃rf|B.u2׃rDB/x\o:fEEPEEȣXWWPfEK }utFFȣX2EEP}Et^EPEPEP }uDEEPEPSE}t&_~EMEfF薍2rjP`VttFFȣXMVEEEȣXPEWWPfEN }ut1MF2FȣXAۉFȣXF2ۍM!EPVPE`MŒËMd Y_^[M3 ]h,-ZMEEjP&QW~@fAEP< hX\jLjV: F3FfFF,F0fFFDFHF43t G0MEw0F!MA0A0ME,SË}NjMd Y_^[M3y]V1NHr,F4ArP#+ƒQPFDFHF4N0r.F MrP#+ƒwwQPi3F,F0fFNr.F MrP#+ƒw-QP3FjLVFfF^~6VN0X.Z^'nUVN0X.ZnEt j4V^]AyrUjhhrVdPX2]3PEdM t#EAȣXAMd Y]uMswEqPuMk ~@fAEPMhX\EPMUjhrVdPSVW2]3PEdE}GGFEEEt#~rPEW CQVsNjMd Y_^[]UjhrVdP8SVW2]3PEdeuF00xDEyN0׃4ZfBu+RW荐N0ytYj4h`.ZߏN0EPN0Ѓ4ExrpR賏MEzyN0j4hh Z蕏F0x,t\jH4hd.Z}N0EPgN0Ѓ4ExrpRQMEyN0j4hh Z3F04xr2Md Y_^[]ËEH04>SËunxMd Y_^[]UQjjuVt2EPuVt!MtEuVjXVjhFl.ZP[ ^VF.ZPwY^jq YYUjhYUdPSVW2]3PEd]Et)hS~7j$VW tk$QW[ YYjv YYt j$VYYƋMd Y_^[UVutW}M,VU} u_^]U졨^x ~t$M.Z](=|^t M]=d^tӋM]̃8#̍APxṼ ̍APV̍APaYU2]3ʼnES]Vu W%uu.pV9C(tC0,VKpVC(C,#u&pV9C(C0,VK~ Fu9F~yEjPYYM;N|!9Er9E;NE;F}|pV9C(tXCpEPu/YYP,VKքu2EjPwupV9C(tCp,VKքtK,AC,~'u(K,Mt Au9AtjjX pVC(3M_^3[̃{̍AP,VÍAPYU]̍AP,V̍APӷỸ̍APV̍APYUEH(H,]UVW}Gp,VO_^]UE]UVuFPN(E f,Y^]UjuYYY]UpVMA,A(]UW}o,uO(GVp ,VO^3_]VF.ZPµY^VF.ZP諵Y^U졨^x ~t$M.Z],=|^t M]=d^tӋM]̃kU 2]3ʼnEESVu3W} WEuEYu WEYu0,VM^EjPWpEpEPu@Pu,VMքu!EjP脮EPuuj[WYM_^3[Ã̍AP辵Ỹ̍AP踵YUEP]UjuSt]cUjuct]CUu EPi ]Uu EPAP胴 ]UEju PAPq]UVW}p ,V_3^]UVW}p,V_^]UVW}p,V_3^]Uju u ]j *UuԋUʃeuEEyAu+QRM薇eEPu uؼM\`~X5 UE~~t uj jjj;UVW}4.ZJVP4/ZM@h4A\EPUQSVW^'E轔3ۅtP~}Ht6M9Ou.GtRwb'YYCȅuu^_^[UE3SVWH<AYt} p ;r H;r B(;r3_^[]Ujh\h0NdPSVW2]1E3PEdeEh@|tTE-@Ph@Rt:@$ЃEMd Y_^[]ËE3Ɂ8ËeE3Md Y_^[]UMMZf9uA<8PEu f9Hu]3]̀@s sË333̀@s sË3Ҁ33̃=^| $XU<$D$L$f?ry6f@sff>@3+3wy =u8/ZɸÍd$=^|>z,w0/Zv ̃ $$vL$38/ZU<$D$L$r"f?r"y&f@sff>@f?s38/ZɸÍ$$=^|̃ $$T$U<$$T$L$f?r6yUf>@s5ff>@؀ r3f|$}؃33Í Uw u f|$}8/Zɺ3̃=^|Cz0w4/Zv1̃ $$T$vL$38/ZU<$$T$L$r.f?r.y4f?@s-ff>@؀ r3f?s 338/Zɸj h\E] Ë}NjuueO}t+uM,VUEEMd Y_^[}] uEu uWSVjh\&3u}u;ut>+} }M,VUFEEEEE8csmt'EEËeEMd Y_^[QMEpJ0UuY]UW=^}wwU  fnp۹#σ+3offtftf#uf#DžEЃSf#3+#I#[DžD_U t93t;DDžt Gufnƒf:cG@L9Bu_ø#fft#Ϻf#ufft@ft뽋}3كE 8t3_`iHCÞ&HËUEuf$Q#jX]à jPuB$ 7$]3]j h\}u VPVD``ujGe7w,VPMEQPa,YYËeűVW7t%~t vV~ t v 0VVRiY'_^ËUVat>`t4~t蝄Ft tPVF tt uPVuV̋UQVWjjz3Wuh tME FF PQjV}M(_^ËUQQ}u"!3VuuEYYt,MQuPh Su uVuVP<"Y3M^ËMtEeUuU SV3W^~ F^^}tAC|SVh@Su t(j SuVhS PWN_^[Mwh?\EPV5=]VuYY^A3AAAA AAAUVu2d@/Z^]UEVWjwjV_^]Ujh:UdP2]3PEd nMd YUVWRBVu_NtVE+3B;w;Be=]M3EpS=]P`Ft Mu!_^$=]us5^uYtÃy t3@A@u jQ螻YYUVu 3jZNuW>p ,V_uuYY^] UVW}w jVP= O3jZu?p ,V;_^]V~ t3ҍFBu ^^V3QF32uaW9r ,V_^2^UQE@uRW}GtDS_Gt,Gu u?Vp,V^tE X[_UVFeEpS MFt^VW~?~ jjW tJ;u_^VF3jjV 3u^U VuW;tlSލG΅uWwf!Ssw~tW} [tFGFGw~_^hH/ZMh`\EP̃9~ jjQ V~t ^^>3A;%=] IUEujX3@AA]UEujX a3@A]VFu!F5=]tOt.tu v ,Vf5=]r2^ÃnuFv ,V.u FF^SV3ۋF+u^5=];t:t tt%^5=]2+nuF.u FF^[UVW}GFGF~u&֍N;tGFGF_v^]3uA2UVW}j ^ A; =]r~N3P?Y3ɋ#E;E u_^]UVMjjEPEP2^UVWMju3W2u!EWȉGeEP2_^jsVjYE3ۉ]tusMSVyt VQ舺VWO'qwuW2;tMwt?Su2ދvwu3ҍO;t twu[_^UVE3EFE /ZN NNN F(ƉN$N)^] USVW} f0P0FF_}Yu^ u^Wt{/Z{]N t׋FANuEGljF_^[]UVLE3/ZNFƉNN N$v^]UVuu u/ZF^] Vf`/ZFhF^UQVuN3^UQVufN^q/ZDYV NF1F;Fr@F^UjhVu PG$Et8r ,Vְ^2_]UWMt!3@G @;Gu"Vu pQ,V֋2^_]UWMt!3@G @;GuVu pQ,V^:2_]V3WB> 3ɋA;uvSp ,V֋u[_^UQSVW3G~(^tF@;~E F t8q4NM| QYjuPl 9~u}u FxtN39t Et! Etp ,V_^[UVuW3t&S} ΋tpt>u[_^]VWyp,V_^VWG ;Grp,V2)tp_^VWyp ,V_^W$tVp,V^2_ð_UQW)t1Vj0EP,Vքtp,V2^_UQWG ;Gs )uVj0EP,V2^_UE t aAMwh?\EPUVW~tN~M2|jVhSuH'j juVhPSPW H2_^]UV~t<1|}t,~t&vY YvuMIQVP ^]U V>tZWFPM>Mt8SeEP}tp ,V֋u[_^j +sVك;tkCPMl;eetCEPu7'ut!ω}p ,VM7Nj8VsV謯E3E/ZM܉}ىMMPME3EF03ɋƋAuH;#t0=w芺ąt P5Yt 3PME3ۋ>EPt MAqEtMCuЋ}MELK<p ,V֋}uuYeNjDsVcjMFPMej6YEEYMpMMNM׭jDsVMt.u>QjEujP3EpSEEԋt}MuMlEEx/ZEMFPe>uEj6EEYYMM}u}tjYU3 tg3j0sVE] u2uuj(YE3}t jREMăMw PE3@PEE0EYYSω0}tCMMM5 $Ër,V֋M%Mrh?\EPjdtV6Mtu u3`}ut;u IW83t<.@;rt;t2P;MPVue23҈EUEEEEMEP EEEu<}EMPti6tEjpYYMEH}tEjPYYMEMEUEBEUE;fQ}tEE@;s.]}]]+EGPˉ}]u}ME]}U:jY3 u u3@F@!~ F);tzExuq+u|'jVhPSWFuBMph?\{j jWVhSPFPDuMtph?\EKE uuF t +E3+Eu؍M聩h0ZM]ph?\EP`UVuWV0L 0ZF G _^]V5`^tjV蟤%`^YY^Vtj N^e}UVFVPEYt jVIYY^]USVWhVVh0ZVVh,0ZVVt=t9SqWX^fYYhD0ZV\^VtPIY_^T^[V~ V~ PMI h\EPUuuu uV]UuV]UEhPjjJtV~ PMh\EPUuuuuu uV]Uu uuuuu uV]UVj^uu uVuV=tN^]UV5T^Yu,V^]UVuWVjVVzu>6-YuMmh?\EAVWVu V~_^V~ PMh\EPUSVWh`0ZhVVPVtd] Sju,VVzt V~ND3-YuMlh?\E=SWu,Vօt_^[V~ PM h\EPUEPVtEV~ PMh\EPUQQ'|"V5\^nYu u,V^#EPEPVPVM 3fAE3@Uu V]Uju u贋 ]UEj juu uPАVtEV~ PMh\EPU9&|$V5X^Yju u,V^E 0uV3@]Uu uVtV~ PMsh\EPAUuuu uV]Uu@V]%ؑVUVtV~ PM h\EPUuđV]UuhV]Uu uȑVtV~ PMh\EP{UuV]Uju uV]U}t3@@ +u1V]̃=l^SU^3E]U3PPPuju葊uWSl^tP0V]Uh^u0Sl^t uPV]U^Vh^VE352]PPPEPVPVtE3E3^UVuuuuu ut3A h^Au $=]^]U2]3ʼnEWjV@;t2WPQVt';t#jjP(Vl^M3_蛡V~ Ph\PvUQQVjuu k t@K$=]jhjuEE؉Uj#EPEPV ^UVjuu 6 t$=]juV ^]U3PPPu χu =Ql^t PuYY]Ujju u Ql^t PuYY]V荌^U3@VteE0SMC3@u^IjYSV-؄u^[Ã9u 3B‡t2ҊWttVq ,V^__aa0ZÃaa0ZUVu܆@/Z^]aa0ZÃaa0ZÃaa 1ZUVu莆0Z^]aa0ZUVub0Z^]aa0ZÃaa1ZUaaEA  0Z]UaaEA 0Z]aa0ZVW/q,V_^UVW3VuYY_^]j2tV~u3H1Z~N,~F ~~$~(h~DNh~H~L~P~T~X~\}~`~d(jES$Y =^j[|Sh0hWVt-WFP3ɋF  QFYFTY臝ÍM2dh?\EPk̃a aUVu"@1Z^]aa1ZUVu?0Z^]jq$sYYUjhYUdPSVW2]3PEd3H1Z9~v3ۋFHL tjG(;~rNHtj}vD;YthjPVvPVvT~LYtvLPvXv\ Nh覺N,pMd Y_^[ËUjhYUdPSVW2]3PEd]Et)hPS~7j(Vtk(QWYYjv$.YYt j(V YYƋMd Y_^[UVj vEYYt jVYY^]UAUuRR@BABA@PAPQ]UQQE VuW;S]u G\ptuEy1Z]EEEy1Z]ut53G\BJ$+MEy1Z]EFZ;rЋuVSw\4 ['39uvG\BJ$+FJ;urE _^ UVuFPt!&^]U Vu3W}EEP EY_^UE8t ^u ^tP]UQuYY]j$ZtV4h^h^VPV^;^=^|^VPM j ƔuYt^M3fN3j蚔EYt 3ɉpAf3^RjwYuet5j bЉUYt ^33fB 33V@f35^V~ PMh\EP5^%^%^YUES3ɉM@9KVWjZ+ЍpU39>3ɉMF,3҃eBUE9SvuCT@ExlvUMHQ0U:u?E8u|xEuhz0ub}u\Bz1u WQMEME@ЉE;CrG4M;>eMA4M;KC_^[WQi뻋BA0MVW?@;r 3p_^VWS @;r ? W_^j$tVcu܋F3j4Z QÚkN43]QWS}9~σMFH{jYE;3j4Zlj} QlYuЃethSWj4XPV3k4Ms,PjVe ;vK33}Mj4q {,C,}I C,σ$}LE@YщE;rj4YEًu@M(EM;F&]؋U3VPPVhpThPFL^t jPIYYV~ PMh\EPbjtVĕً}pEP,V3hu谐YEEtMQSWM+:juVb^M^3ۉ]uhRYEE&PY 1u6h*YEEt x]FV^Y^襔j|>UϔٍK,3 iKdtI3Ʌt*kU4kE 4EAD0E@;KdtI3ɅueK,h=;rUQS]V39pvW{07谗F4Y;sr]_S蜗Y^[U^SVW3j Z}G^G^GG Q]kO GDQjPw3j(Z 3 P(t0H3kG(OHPjQt =^^33҉MU9 ^!MtbH8^3ɍs k(ME>t%OHjj6FPRWrUMBE(UCA M;ȋE|\=^u1{ t+C$OHjjs k(PRW&OHCEDMs tWDUK$CE BB2MK[UM; ^ 5^u6 ^t V05^OHjjVjjWGD033҉MU9 ^!M3ۋFt3H8^t~9tzOHPP6PRWJUB(UZ=^u/>tOOH3PP6PRWOHUFBUD (MEtODMFaE AEMM; ^S=^tZ39wvS339WvAGH_DED E;Cu}9}uEB ;Wrk WDDUDF(;wr_^[USEXdt[3ۅtJVWCx{eeEE7PEPNEP,VVECxE;Xdt[3ۅu_^[U(Sى]{d~CdVpΉu9r .WP{+ΉEFEFE;C{3ɉM3;E"ЈUtdEQMEk4EE;sHuًk4EE@;AvMB;rM;ˋu܉]]tUE}E؉Uek<4}vS]3ɉMG0<u}v*DjSW茜MD1t SW(MC4M;_r]M{AUM;_;u j +9^[USVuW]3Et=C\ yv&A(;A,vuEEQPE P tMG;rɀ}uM3}t~C\EO}M;sJ] @;Av ‹EEB;rދ}];tK\C\MMC\Ext };rMƉE3t=C\Exv&uVPEPE PM+ȋEMxuNEG;rÅu_^[US]Vu WU3E}tuB\<v^O,9O(vVGE@OEk4AkM(EBH|v)GjjuP]MA;AuG,OKUG,}G};r}]i3}B\EO}MM;sWߋы} ;@;Av ‹ډEEB;rދ}]U;tJ\EM@\UMB\Ext };rƉE3t4t4B\ExvVPSU+؋ExuNEG;r̅u_^[USVW&333҉]u9WvvGT A;A$v\GX FAu싰+q$މ]9qsqq(+A$+Y+;r؋AY,+A$+Ë]+ƋuA0B;Wr33!O MU9Ovi3uGHeƃxvFU3ۋH ˋquM@AM;qu @G MB$;PrŋUuB(Uu;Wrug$u3u 9w u333҉M9OGT4F;F$sG\4AFMN$+ًMB;Wrˋut\QSV#uϋ~E3ɋE;r+‰E;sE+;r+EuuQRV@)u+ދMut- v'QSw uϋPVG)w uG$G$"_^[UQU S]Vk(W3qH3ɋF M8ut 8u3t/@ tNNMk4SWAP踖mt MU G$_^[U,EMkM4S@VWMԋXىE؋M]S,;suUC ++;rC(M+++E;sƉu+3҉UUUS0UU܃:z(z1Z0tt tIM"Ot tHE NkM(E@HȋA EtuPQMRuh(E܊x1EtE]tK( K,EH0u]MSU uuBEPcmtEM]EE4E$_^[UMjY3]j5uVjd[} E(Uw,ujSwPVΉE[G(3u+tou~}u e%!U+udv0v n39wvVi#jdEU[*v jJ#jd[+ۃ㛃dMEo[M(tu:ɆUTыMSVWAUEXp]3ۃ}u]u]A EA,R]}̉]]ԉEЉU;}k4U9\:}B}qu;t:r T2U؋uӋ}]܉U>v#k(E@HDt9s3҉EBUME u8}]Mȋ};0GXu4V;F$vjBT+T$UtZ^(T,];sUȋD E+‹ЉE;F,rV,E+E;F0rF0uUtE +;r‹UBuUuUE@;EEE ^}3ۋMEƀ}t|;Eu;Uv}Љ}̋}UԋuE@E;EẼdAU;su+ljA}6tLEk(@HDt;;r;s;r;}s;w;wMSVRuE)0+E 9;]0E@XUB;B$kM4BHA+A$tpQ,UUZ(]9Y,sY,]ȋY +M;J,rJ,+;B0rB0]Et2;r;s;rEMVupRE )0+E C]ą>E]}̋P, 3 MA,@_^A E[U(SVu 3BM3WFHxM9Uu]F EF,MM]EI;M؋MUk4UU9ZuDEVU;Pr@EkM(E@HDt 9EsEÊUtX;EtXME@E;ErEjZtM^;rRS4MvV,)^E E 3F,@;EvMMEu뜊_F ^[ USVu2ۉMWFHPF,M EUk4M8v*BHk(|vjjuv_EE 83ɉM9MulBX A;A$vHQR|,w D +D,ty,wD+D$ty0vjuvQMPE UMAM;MrtMD;DuF,NF,_^[UV133Wf;sIf}k f9xtBf;r3_^]UQ=^|mfË8uMQjjP\VjXuV&^u0^Mre^u P.^Y^豀USVW!|hEPVE3҃BYȉEE3KHU9A u)t%39Qvy ;EtB$;QrEUF(̋Mtqtt=^ueEt 3Pe3FE3ҋKHu1t!39qvy ;EtF$;qruB(ՋMt1_^[M h\\EP蠱̋A@̋A@ @ ̋AH@$̋A@̋IQI +t@ 3̋IQI0t@$3UE+A Vj$^^@;Ask$A 3]UE+AHVj(^^@;Ask(AH3]jXuV ^u0^MWe^u P^Y^~̋A@3@=]@U=^h^| uY3Y^]UVu3UEv9B3Ƀ,SMW~39^!]3E~?1BHD EEHMu#MFSPʙ0UMtXE HN+H38G0;v;^wʉ5^^h^3E3u5^kYˉ]MƉE;s_F+t0tHuEVYM9t7AM1VYM9t#G VYӅtAB#uMEu;ur;^wϋE^=^ ^8]u^W3^^u ^~ ^S ^#ӅtAB#u£^^ ^tj_^^[Ë+;wU} SVuWtF3ۋΉE8]tDRΉE%ȉM8] tE!;GE9EM؉EpΉEE&ȉE]uV]JSuV{ ؋E;sg} u}v[j+EPV ؋E;sAMPu PV;؋E;s#j+ËPV ؋E;s +ËPV ؋uu S}tV_^[ UEVW}ME _Gp3Sډ]9Qƒ,EV9VvaU9VvY]ʉUUVU:B0u&zu KHWA EPQRFԋPEME4AE$M;Nr]3ҋMC(4]E;Yr[_^ USVW3u}\^dj8C@jP辤 C@PSWMtc{CxeeEpEPEPEP,VuK8uuu|Cd;v P荃CdEuCxKdt*{Tu;{dv(2}K@CaFT G;^d}t[v؋;sͰ3ۅ_^[UQQS3ۉM9YVWATMeyl9s{uuEE>}t sPVjj uV+jw,3ۋΉ]]u\>8] ]]t赂EuE;uGGO`S>ujS}uE;uStE=k33@G(9_Lu8GL3ɋG j[ QlGX3ɋG  QlYYG\E=wPMVtEhUQVW3M9u vE GW+PuM;u r_^U$MS]VW{h}t jEK2s3ۋWMuE]tS39yv5]3Q(<2uD2;u2EEG4;yrӋ]UC4]R;ru3ɉM03}#Ek4ϋ] MU+]t{9ZvZw;psh}k 4MAE;vY]܋AAJJEJE;sk4UΉMuExht ;Euk4ދMEF;pr}uzveezvW}3ۋB0Ã8uZV~ PM?h\EP ̃!aUVu0Z^]UVu0Z^]V6vd]Y^SWW̓VP GP̓VP w _0t8V39w(~j4TFYY;w(|3s]j ST ޅu^w4\Y_[SWW̓VPb GP̓VPP wF _0t5V39w(~4FY;w(|3s\j STT ޅu^w4t\Y_[Vv d\v\\YY^qP\YVvC\v;\YY^1Z1ZUjh3@j蛁++;#}t ;sPD_^[UM ] UM]UQQVW}j(2+;s +V_^U싁;s3|+ds j 3Ye=,sV=Xs j3YEjPU E$6Z}؋j@XfEEEĊE EŋEEEP5^5^IK_^[UM : ^w^tuQur ] UVWD菄EP9t资_^]Vuu~jX^3^3@^UEVudžT)XTT;XtX3^]V;Xw3^ËT9Xu3X^U}SVWtZ@Ѕt WVBYY u0J;u3AAQupD,VD2BIQjpD,VOu_^[]UV}tH%=u(3@@@tjj|VN^]W~DS3ۅ~%VGt0j PYYuC;|^gPjwS [_UUV3#13#3BABAB A ^]Vj&fI&FY^j\xV"uENTN<3FE  3Z~ ~~~ ~$F(~,~0~4~8~@~DFL}~P`~dFhFl~p~tj~x~|/EONE~؉^r,V֋MSPjj~E!Vv [%vS%YY^VvD%v <%YY^Sك{~(CW8tV7w%jW u^_s$Y[3ZVWv$Y3Z_^Vv $v$YY^Ujh:UdP2]3PEd cMd YUU3u A;Bu2]UU‹I} I Iu]UEV3Zt jVYY^]UVEt hVYY^]UVNLmOEt jtVuYY^]U$SVEW3}^0S:|N3҉E9V(~?jY8u,M:}EADF@E3}EjYBE;V(|čS}jY ~(}{?33AF(3jZ Q"ȋF(PjQM@Oj fȃMt5EaI(}E};}|F@ƒS V3ɋV<;V8} F4 F<?ueEpSMa?t}[}_^[UVuWF\POPC} FMtOd_^]UUuR@B@P]j-VF#׋N щED3ɉEGF9>|F NNNtQMou3CMErU@S^t]VWj>EjPB ED6Z}؋j@XfEEEĊE EŋEEEEEP5^5^J8_^[UM : ^w^tuuQui]USVu+r BH;uA;r}:;2|6J3ۋB#΍tJB #j eu3@3^[]UI L]A#;t3UE WxduVu6WDP7E xdt^_]UQVuuEFlE Fp3Z^ UQEVux3ZFF 3ZPFGDF4jP0A Fdfh^UVu貳l3Z^]aal3ZjxV}OO<3wwGww8WuuFdGd3GlGxOG @4FGt t@ O<`} t,Wdσh2Ɖwh GhOd׃h;uOxghNgUVu袲0Z^]q3Z^YUjh:UdP2]3PEd1?P=YYMd YÃyt qYVF43ZPO?F P_BYYx3Z^Ujh yVdP SVW2]3PEd3p u*S^ 9duOhtqh ΅uwlt^jV: YYwt tV%jV Ot tB uO<_VMd Y_^[ÍMfohd\EPV@QмYUVv3ZEYt j V YY^]UVEt jtV YY^]UVEt jlVT YY^]UEVx3Zt jV# YY^]UVE PEP^]UQVWjEP,tp3t2Fxt)FdωEEjPhVYY3_^VF uvF @@^U SVWN^lΉE]bt3Fdxh}t{ tuC q~g}vKCK LlHQωȅt/t Lt@ @laQ}]u~ut NdWjeWt3Fd@h;t뷃]tc}uW_^[UQQeEhTPMMhTV}vxLEtA Alj6yV K؋V;^ u ;uNt9pdt>Vu2hYE3}t jVlMWVt V~ uJF ~t2FN x PjAxjXP~N VR^UQVW"j΋tRu;t }W+S^8;t1t,jY3 ;u}jW[u W1_^FN PM0u uOjXUVu u vhu^]USVWA8M03jE_+tt+uj ZjZtfMM;tψ]tu/AQ P]UMu uMuutE8_^[jYyV ^C]ȉEJe} u ~0~;u2N V;!3ҍGBhOjO;;t3uҋMEKUEHE ;]UQVW~? 3@@uNU_^j yVw 3V]u8P!YYO<]}C9tW<jXO]V]8PM}YYti3OtZj[~ ~P;tLr;tCj^ƍO;t5G4PMƚWEuO P3}]tu-8PtYYWtVj0,V^_Vqpql,VY^jyVً}3ҋNj@hFuE3ZUU U;#t0=wąt P׍Yt PMUKdЃuFPV^U3҅t6W}Vp98t Ћƅuu1rxuQjPGYY^_]UQMEEEPu EUSVWj(uYj Ë6Y_^[]UVuB0Z^]UVu"0Z^]UVu0Z^]j(1YYUVuWj Y68_^]UU w RiYPMah,\EP2U} tEt 9E s2]ð]j4yV3ى]j(Yj 3ZYE3];]sKM p@E wyPVYYuVYPMahd\EjEC밋uppQYYuM`h\E99j(uWYY3SSVbYPMy`h,\EP1SVW 3Ћ~Fu;u VP;r‰Fu ;w~_^[UE vj X3Z]UE3A $T} E ||}txts=tl2h} tb9M E t=vO܁} vA} ͸;E H,} v} v9M t} 뢃} t 9M "Ȋ]hTOTbTTqTqT"TDTTTU xt x ujjYPM+_hd\EP60UU 3V34ZNN NfF ENFNNN BF$EN0k4F(B0LB ȋƉN,^] UыM V334Zrr rfB ErBrr JA$B$A(B(r0A,B,^]̋Aq(q$H hVn0u]W~Nu>NPv(v$u1VPNEcNVjNVDNV_^̋A$U 2]3ʼnEVuN0AF0~NW~uyPv(v$ugSV؍MS+^kV$4}SfHfN NNAL 43fMMubuVNrNVu [V _M3^&U VW}t2N;tM^h$\)N9yuI V}_^hh1ZMh?\EP-VFv @ ppWf YY^VWG@ ppVWWVG W _^UEu]3;H]UQQEDzz EME]EUQSVWj@[r uE3E EE  $(,0Ɔ4y1Z_ݞ^[ 3AAAYUEEAɉAAY] UQQE E y1ZE]E VEy1Z]uU SVWuj} W]ˋ]E+}ɉ}UE]EE]u%4Z]8C]u]Ez؋F]uEwu VM_^[UVJ]F]E9}]}^UEV;t-Pd3HHHX^]QVj@^;t';t$+B2vb"bRR u^UUƒ?9Pt``XP]443UMywyr4ZAu2]UQQAEuE]E9UQSVW}؋cMЋu9;s;v +;v;u;vNF;v;s;tX+P,YuH]O;t+PYu0Wx~W< Vuw_^[U SVuمu3$WV(M Ut ,0;s ;Ms+Ћ rJsEs@}u:G,Ή(0uGFR3 Q,ˉ0(P ]w Wˋ$EQQΉE$Extq;tmV܋ۃy1Z]EU-;uQQ$iEYYy-VDt P{_^[UQQAE|HE]uEiE]uQWAuj%zVى]E K c5ZC 3u3C8ΉCxEEjCjΉjΉjΉjΉjΉHuVP-OY{0,V։C|Ps3ҋu艳AM;s G33҉EuHljuNA33A3+ȉEΉM+񉋤HM;r uH+uƉK 臆t/h8YEEtSus|3EC8tc3jZ QY3ɉC9vC A;r Ujh;UdPV2]3PEdvN 5Z^vvYN N &Md Y^U SVWt HKMU k4jA^A00X$}t RQ[uEE3ɋ QuYt,eu uq,V֋MuAM;rSVE;tVY_^[ j|>U Ep B]ESk{$4kK(4@ D0e'UAUuR8R4@8B8AB4A@8P4AP8Q]U]j HzVsEp Ήu3EE9E tDuM8,VkK04k4FD0 ȍCPXE@E;E r‹uEu uXx ,V׋EM E1UVW3ɋ;v++S3;r +N [ \;r \;uru_^]U SVW}مt.p,VօuWp,V_^[h,5ZM辶h?\EP!U3҉EU9SV3W]H3ˉuM9qvm3҉UA0\t[83ۅt:A0;\t[83ۋkp$,V֋MUuɋuF4uU;qrEU]B4U];k_^[h8p8xYYjpzV#jFH$2tRP' MG2}tFD0|$u_^[ VthVVYY^j Uً}skG$4kW(4EUL0MD,D$u)ELS kO$(BHkW($T JK EM WeK j}uH9EtE;Eu }tñBt EUEEt\M̅t HIMN$t/]̋uRp,V֋UȋMԉBUȋUău3EMEuAE4>u}t F,F$;Er u؋u9uuЉEUMŀ}t9^(w}ut;uuEUM;uuE랊MZFE4|E؅tuԋPVVY}t;}u]u$}tVSC0k4jZCVS_^[ UEVkP$4p(Ak4T03@D2@^u"+Q @9Bv rPV]UQQkU4S]VkM 4WUFM|0O(AG(uAF@$1tu G2PQUt$FMD0|$ut G,_^[ UQSWC pp4CYtuGtxDugPVGEp,VM֋ G,t xDt3Ep,VM^t Wb3_[U VuV8F4B4V4F8B8A;^u;@8u3@4A]jzV`uEU k4HX0]K$;u K$)c${1t RP C0ΉuGeCt@83tQu;CtH8MeHt*yDu$AD^MjxEP,V׋]MuuENUVuVtjYY^]UEV5Zt j0VYY^]UEV5Zt jVYY^]jT{V|jDYȉM3Et uVj$VG+j0PYȉM3EtujuV?u-w ΉuFe?u WYE6UME 9AtPc]UVu3WN; 5Zt@|'S_SܑV;^} FtNuAP@p6L&^]VF\u P,YF\^UQEhPEP'EUSVWME3҉AP3ۉCQx@ATAPf} yXQQhQlQpQtQ|Q\fQ`Ybp,V֋up,V֋uP/ UPߒOЉ39C u@PVN(_FP8p,V֋}MWPjXP@KHVyV5GP8p,V֋MSPjjT_^[USVW}C4NuW3ҋσBKҍ !_^[]UQAS]VW3MG4F;uS2MI 9_^[U} VuWG|ttu OPj GPGPtuGPGP G0_^]UQQeEWjjPbtC}t }t2tMjjuƇQVp ,V^Ƈ_SVWCPsXp,V֋KPjP_^[SV3W~VOF #׉~uGFtNF#j 蚴u3@_^[UQQE SVWN,^(K#] ;F<N8~4;|+|x@u<3ҋEEE EE;EjOX}trVܑVMQ;FD~R~WȓVWܑV;FD~@N$膐u43ҍNHB3u$W̓Vv$NFVhT VȓV2_^[ UQQSVW}OPP GP0GP$u GPOPW !`uGPHOG|A+M~ &3ۅtD}K$ԍN QaS*O+ȅ~ 3ۅu‹}GXEXGP8p4,VP,VMӋE`X@P8p,VS]Pjj-{\t s\芢c\YKPjsd8S_^[ËыBPP舖UVuWFh+VpFpFl+NtFt_^]UESYVW3GteE0SMu_^[UESYVW3GueE0SMt_^[USVW39{|t}E0SM~9{|uu t9~uWWue MWW-ujjKP 62+Vp,V֋{Xs|p,Vְ_^[U@S^t]VWj>EjP Ed6Z}؋j@XfEEEĊE EŋEEEEEP5^5^_^[UE]UM : ^w^tuuQu^]UQS]W`GPEt$u2VHHVGbMVP^tHH7E _`Ga_[V3t A$F;r^j{V }uOuw3ۉY~O]hlE O8__ h_$h_(G,6ElOG0e SWW̓VPGP̓VPw_0t5V39w(~4=FY;w(|3sj S} ޅu^w4Y_[VWO8}O謧w}w uYY_^U$SVEW3}^0S:|N3҉E9V(~?jY8u,M:}EAdF@E3}EjYBE;V(|čS}jY ~(}{?33AF(3jZ QȋF(PjQMj 8ȃMt5EaI(}E};}|F@ƒS V3ɋV<;V8} F4 F<?ueEpSM ?t}[}_^[UQQSVW~EC8PEVt!DtuSp,V;uSp\,V֋} utNƇC$ 0<9uIx~AWK8 jkt?t CHjQp,VMWjj_^[SVW}u?GPNF #t}uF u9F #N3ۍt.F#Nj ɩuG;F|3_^[]tOVj&"FY^Ujh;UdPV2]3PEd>tv"PNR.YYuMd Y^Vvq"YtN^USVuWVYtK u47ZVYW "YF_^[]UV> }UFR!FY2^]UVuW6!YtOV uVzY_^]UUv] v+jYt A3@H#эB]UVuWVYt47ZVW3!YYF_^]UQSVW3Su}O9Z荡49ZG\9Z_Ƈ_^[UVuf0Z^]UVurf0Z^]UVuRf 1Z^]UVu2f1Z^]Ujh;UdPV2]3PEdq49Z\9Z Md Y^Ujh:UdP2]3PEd Md ỸUVhEt hVYY^]USVWwS }~.{ ̋pjY8u+M:}EF@E3}EjYBE;V(|ōS}jY ~(}{?33AF(3jZ QȋF(PjQM]j 胡ȃMt5EaI(}E};}|F@ƒS V3ɋV<;V8} F4 F<?ueEpSM?t}[}_^[U$SVEW3}^0S:|Q3҉E9V(~BjY8u/M:}EF@E3}EjYBE;V(|S}jY ~(}{?33AF(3jZ Q蠨ȋF(PjQMj ȃMt5EaI(}E};}|F@ƒS V3ɋV<;V8} F4 F<?ueEpSMe?t}[}_^[USVWYt z;t EǀX~&̋pHEtjVPu F;|3_^[Ëu3ҋvN8fUVWjH[tu uWb_^](9u3Oj}Vpj,|YȉM}3EtGF Pv FP6FGy( UVuNQ~t N^]Q^]UA ]{UQQE S]VW}WN F{EWdžKP_XNPu%YuwKF$FPN4I_^[ A; AP;AL2UV~u} tNNAF 9ErIuRȅuދ^]U0SVWOTtX O*[؋KEPu3EEEE1OjZ؍EPKePM}z;uEEEPM"St‹up$,Vօu88E t3OSup$,Vօu SuG_^[SVW39~5WNXAEЅtJ; 0BP;BL(z8uRG;|ˋVP3NL;_^[Ëj-fY^@Ut]1EPϕY]V񋆠ujPY^̃UM jQIFuuYY]UVu YNjVF^]̃y,UA }t@tHAMh \EP8US]VupVFDWVVV]jjjQWVPĐV_tSQS|)hpT u%V~3)hT ^[V~ PMh\EP_V8ztPV^VWp,V_^UVulE;tMS^W~p,V֋uSPjj}F,H_[uV^@wMh\ Mh\EPUQSVWxXEp,V֋MSPjj};_^[UQVuu l:ZF:Z^UQVWu}OL:Z)2:ZG;Z_^:Z;Zp6̃̃2UVl:ZF:ZkEt hVYY^]UVEt hVYY^]U];j}V萎h蛉YȉM3Etu3j*~V\heYU3EtN#QjU~Vh'YȉM3Et u u(輍̍AVWyp,V_^UuKE]̃U]_U]cUV(^tV~ PM!h\EP5(^đV%(^UVuV:YY^]Uu:u:EYY]UVqʋЋȃ M;u^]UA3ɨtȃtAhjXUt ]Vquʋƒ;t Шt2^ð^Wyƒt uJʋƒ;tVjSYt V3Y3ʋЋȃ ;u^_j x~Vwt; t6EVPp9eV&:jVgEt P:Y胋QQPj~V蝋eEP9j{V胋uE3ۉFh^^^^ F?ӎF$ĎY}]tj@^0uu~ ߊj~V}wpV3ۍOLV]_8_HVE_,4GG@蓊UEA<pQhPTmQ]VWOpCGG@Op3GGLGPGdG`GXG8GH_^UEA<pQhpTQ]UMQI<]UMQI<]j{VwpΉu>ueEa萉j~V踉ًKMeC80NE;3|oFEЋKC#΋EtIu MP,VUYYt0u Mu,VUUYYt;uOKC#΃$UNJU;3}E8ME܈ UL]@jh8\耘u3ۉ]Npt1]u؉]E u]NpEÊˋE ËMd Y_^[USVWeNF#t}uF ޿u[~t ;F|FN3ۋF#ύt t)NF #j ku3ۋ>G;~|>_^[]>3UQSt3CHW3EtO9xp~JVp,VM^u28C`tjuKLuR{Pt;sPtMh$\6CTV*W_^[h,5ZMHh?\EPU S]VWA_P{_0,V֋S}ȃ 3k4MfD fEuE_^[US]VWt`PuM;h$\]p,V֋9wPuكGLHuOPGT1_^[h,5ZMGh?\EPVWG@ pp YtȀut ;GPu`&jp ,V_^U S]VWt=PuM[h$\:p,V9GPuۋOI >_^[h,5ZM?Gh?\EPBUVW~PFLHu}FPu<3S؋ q,V;tuSp,V[_^]UVWEPO0u wMfE fG4EG0_^] UVW3E0S} 9~Tu M9~Pu_^UVW}y@Qp ,V_^]UQQeSEVW{${ÃPp,VPQ{$YYuZ{@Sp ,V֋{@MQp,V֋s3ˉ{@{ t jx49{$t_^[Ãa@VWyQp,V_^UE t(QuuuaPh;ZM)Eh?\EP,US]MVWp,V֋uES@xp,V֋]u SK cMu3@MWt ujjs w NM3_^[h,5ZMVDh?\EPYUEAE SA3V3;ZWyCAAY A$Mp,V =]Cuj^(F F,PFhVh U PjFt _^[v V~p ,VV~ PMh\EP膮UVu0Z^]UjhtO>u_Nu/NE4P[#}t^_[UQQSWu2tOV&EtEΉMtuƅt$PuOuu'V%Eu܋pPu؊^_[=USVW} EPEE]}t8؅t6E]􋏠E@uu}#u!G`PuEP%u2_^[ EUS] EVWPEE+q ,V֋u!C`PuEP$u2_^[E@VM쉓?}USVW} EPoEEa}t:j؅t8EE@uu]}%؅u!G`PuEP$u2_^[ EUU+dvE  ]UU+dvE ]UVuW;u usEV S3+tZt7uYtDRu2OFP<,t,8]tRu  Ê[_^]UQeVj;E tjPu!ujNEP[u2^USVW} ٍMQϋGxPjR*;utss5ujEP1#u2_^[ PM}A3;~RbЋUVW}Oc>Nu;tjv+;t jQ°_^]Vqq,VY^j*Vdu肌u eu;ZIdUV;Z行Et hV_YY^]̸ ^;% ^ !^:% !^jMV\d3Vhk]h?]VubMPxMuQp,V֍MycjpVcًu jhk]h?]juFEtT褰P$ZWMExMueQp,VփMMwxMSu]Z@c$ZUEt0t$tt u#7pBj MJMhG[EPԔjVcd, ^ ^; ^bÿ^Wa=^Yuej]YuEtfFh,qM6q \j8V,\̫M P{RM PkRjhk]h?]juEtEuMoeMV6p7EPSEENP,VVMpMpg[j8kV[|M PQ+mEM PQjhk]h?]juEiEPq,VPEPYYeM؅t'JuEPEP WMEQo3EPuEENP,VVMoM\MtItZUjhVdPQSVW2]3PEd} 3Cw\_Ή_dMOCM>RCCA>csm~F= t=!t="t =@F@ HMy`;}vKuWeYYEu7EPYEPM?EMtE3U/}ME_`QvS7 EVX$H U BG3UuEPYYEPMEMt&E3UE3UuVuD 3UuEPvYYEPM^EMtD72UUjhVdPQQ2]3PEdMu)EPYeMPMMtlDu UH BMd YUVuWu4~t-FPu iYYtjPWu詥9PWu荥-v} Wuy ttQp,V_^]UjhVdP2]3PEdQxYMd YUjhVdPV2]3PEdy csmueyu_A = t=!t="t=@u@Q(tGI$t2zB @t rQht tQp,V֋Md Y^UjhVdPQVW2]3PEd3u^Wh.Uh^u t1E0puE^$^xMd Y_^MUjhVdPQVW2]3PEd3u^WhP/Uh^u3 t1E0puE^^xMd Y_^iMUMEU aa csmAAA Qt t@@At tA@]UMu !a 3]UE `]UjhVdPV2]3PEdLg0t^>MOCtV>RCCtN>csmu2~u,F= t=!t="t=@u VuYYj`~PVu(Md Y^UMjX]U`2]3ʼnEEVW0uM hM\EP?jY}Mcsmu^}uXE= t=!t="t=@u9}tUuȅtNv tG>~BvF\VuWM }čEPuuQ8Ve_^M3P&jh\^`3ۉ]]];]tM,VMUE EC]EEMd Y_^[]EuuSu uʼñ $j R<$D$ tQf<$tiu=^i [BT$B J3HN>['T$B J3-Nt>[ MT$B J3 NJ3N?[߃̍MT$B J3MJ3MD?[鬃MMM M T$B J3M8B[hT$B J3nM=[MT$B J3SM>[2T$B J38MX@[T$B J3M=[T$B J3Mt>[T$B J3L>[ƂT$B J3LH>[髂hP]tKYËT$B J3LB[鄂h]MKYËT$B J3~LA[]j$uGYYËT$B J3VL@[5h]JYËT$B J3/L@[h<]JYËT$B J3LA[h]JYËT$B J3K4A[h]JYËT$B J3K?[陁h]bJYËT$B J3K@[rh];JYËT$B J3lKA[KM eM]T$B J3AKC[ MMT$B J3KJ3 K$@[MT$B J3JA[ȀT$B J3JH>[魀T$B J3Jt>[钀MM MT$B J3JpA[_h](IYËT$B J3YJ?[8hp]IYÍMMMMT$B J3JJ3Jh?[T$B J3I>[MT$B J3IJ3IB[MHMM8T$B J3IJ3I\B[bẼ eMËT$B J3OIJ3EI>[$M0[q|Mk1T$B J3oFF[N|M1T$B J3LFF[+|MT$B J3&FD[|M2M 2T$B J3EE[{h4]DYjubAYYËT$B J3EE[{T$B J3E>[{Mg2T$B J3E(E[b{MM'2M2T$B J3PEJ3FED[%{MET$B J3#EL[{MET$B J3EYYju>YYËT$B J3,CJ[ yju>YYËT$B J3C|J[xhd]AYËT$B J3BI[xjuV>YYËT$B J3BH[xju.>YYju!>YYËT$B J3BI[_xMT$B J3]BM[YËT$B J3 @Q[uh]>YËT$B J3?Q[uh]>YËT$B J3?R[uh]z>YËT$B J3?R[uh]S>YËT$B J3?P[cuh0],>YËT$B J3]?S[YËT$B J36?S[uhX]=YËT$B J3?T[thD]=YËT$B J3> T[tT$B J3>pS[tT$B J3>xT[tT$B J3>S[vtT$B J3|>`Q[[tT$B J3a>P[@tT$B J3F>Q[%tT$B J3+>hR[ tT$B J3>XP[sT$B J3=R[sM退T$B J3=\[sMzT$B J3=[[sMT$B J3=$[[ksMT$B J3i=P[[HsMŀT$B J3F=|[[%sMM̃ M̃(E?T$B J3 =J3=Z[rhd];Yjup8YYjuc8YYËT$B J3< U[rh]j;Yju/8YYju"8YYËT$B J3[kh0]4YËT$B J35X\[kMnMfT$B J35J35][kT$B J35\[ukT$B J3{5D][ZkE eMËT$B J3G5,\[&kMT$B J3$5J35\[jMMT$B J34J34][jM黢T$B J34a[jM9T$B J34a[~jM鶢T$B J3|4^[[jMmM[T$B J3K4$`[*jM,MMăMă B6Mă876MăT 6T$B J33J33(a[iMrM5T$B J33^[iM5T$B J33a[xiju/YYÍMT$B J3i3J3_3T_[>ihL]2YËT$B J383 _[iMMT$B J3 3J33a[hMT$B J32J32`[hx4MT$B t32J32`[zhM4T$B J3x2_[WhMlMءT$B J3M2_[,hMT$B J3*2J3 2_[gM:T$B J31(c[gT$B J31b[gju[-YYÍM]T$B J31J31b[gM-T$B J31Tc[agM隴T$B J3_1c[>gM`T$B J3<1c[gM)T$B J31d[fM M0 3ML 3T$B J30Pd[fhX]/YjuJ,YYËT$B J30d[fh`]Q/Yju,YYËT$B J3u0d[TfM{T$B |3O0J3E00f[$fMMM(T$B J30J30e[eM2T$B J3/e[eMbM"T$B J3<,|k[bMT$B J3,J3,k[aT$B J3+$k[aM-T$B J3+Pk[aM T$B J3+J3+k[ah]L*Yju'YYËT$B J3p+\l[OaT$B J3U+l[4aM#MT$B J3'+n[ah])Yju&YYËT$B J3*m[`h])Yju`&YYËT$B J3*T$B J3#w[YM>T$B J3#J3#x[YM9M̃ .M̃0%M̃L%T$B J3m#J3c#_T$B J3J3MwT$B J3J3T$B J3T$B J3p[kQT$B J3qQT$B J3VL[5QT$B J3;[QMPMMT$B J3l[PM5M T$B J3J30[Phd]{YËT$B J3ą[PhX]TYËT$B J3[dPMFT$B J3bT[APMM`M UT$B J3)Ї[PMT$B J3[OMT$B J3[OE eMÍMOMM?MT$B J3J3[aOMMjuYYÍMnMfT$B J3:h[Oh]YËT$B J3[Nh]YËT$B J3([Nht]YjuYYYËT$B J3h[NMMMT$B J3Ԇ[dNhl]-YjuYYËT$B J3Q4[0NMZT$B J3.[ NMYT$B J3 [Mh]YËT$B J3[Mh]YËT$B J3[MMT$B J3|[yMM "MT$B J3oP[NMMM FM0nMHWT$B J3+`[ MM4T$B J3[LT$B J3[LE eMjXuMYYÍMjpu8YYËE eMÍMMT$B J3nĉ[MLMT$B J3KJ3A[ LMVT$B J3[Kh,]YjuYYËT$B J3[Kh]YjuWYYËT$B J3[Kh\]^Yju#YYËT$B J3T[aKh<]*YjuYYËT$B J3N[-KhL]YjuYYËT$B J3[Jh ]YjuYYËT$B J3L[Jht]YjuSYYËT$B J3[JMMMMMM||MuMy|nMZM^MVMM鹸M2M6|+Mh]Yh]YËT$B l3J3[Ih]nYju3YYËT$B J3[qIMMT$B J3g[FIE eM`ËT$B J33([IẼ eM,ÍM/MM钷T$B J3J3[HMT$B J3[Hh4]bYju'YYËT$B J3P[eHh$].Yju YYËT$B J3R[1Hhd]Yju YYËT$B J3[GhD]Yju YYËT$B J3[GhT]YjuW YYËT$B J3 [Ghl]^Yju# YYËT$B J3[aGh]*Yju YYËT$B J3N[-GMcMOT$B J3#H[GM8M$T$B J3x[FM MT$B J3[FMMT$B J3[FMMT$B J3w[VFMMxM|MtM`MXM\MHMLMDM0M4M,M$MMMMMMMMMMMMMMMh]7Yh]+Yjpu YYËE eMcËT$B J36X[EMKM7M/M3M+M#MMM MMMMMMMMMMMMMMMMMM{MsM_MWMOMSMKMCM;M3M+MMMMMMMMMMNMMMMMMxM MM|hh] YËT$B t3A J37 L[CM鿱M8h] YjXuYYËE eM醱ËT$B J3 J3 <[BE eMÍMh]W YËT$B J3 [gBE eMÍMh] YËT$B J3@ x[BE eM9ÍM<M4h] YËT$B J3 [AE eM ÍM M h]o YËT$B J3 4[AEă eM ÍM M M MMp MM` MׯMP MǯM@ M鷯h(] YËT$B J3 J3 p[@E eM ÍM M h(]u YËT$B J3 x[@E eM ÍM M hH]% YËT$B J3V [5@E eMO ÍMR MJ hh]YËT$B J3 [?E eM ÍM M M T$B J3 h[?Ẽ eM ÍM M M MM MhH]YËT$B J3J J3@ ,[?E eM9 ÍM< M4 h]YjpuYYËE eM ËT$B J3[>E eM ÍM M h]IYËT$B J3z$[Y>E eMs ÍMv Mn h]YËT$B J3*[ >E eM# ÍM& h]YËT$B J3<[=E eM ÍM M h]aYËT$B J3[q=E eM ÍM M Mr Mj h]YËT$B J32[=M; M3 M+ M# M M M M T$B J3[YjuYYËT$B J3b[A;h] YjuYYËT$B J3.[ ;h]YjuYYËT$B J3$[:h]YjugYYËT$B J3[:h]nYju3YYËT$B J3X[q:h ]:YjuYYËT$B J3^[=:MgT$B J3;[:M^M<T$B J3ܜ[9MT$B J3|[9E eMÍMT$B J3[9j0u*YYÍMMT$B J3y[X9j0uYYÍMuMmT$B J3AT[ 9M[M 2M0@MH)MʎMMM T$B J3P[8T$B J3[8h]jYju/YYËT$B J3\[m8MMT$B J3c[B8E eM)ËT$B J3/[8T$B J3P[7MM!M MMT$B J3[7T$B J3[7MDT$B J3@[r7MMM MM|MtT$B J3HJ3>[7MGM?M7M/M馥M鞥MMT$B J3J3[6MMMMMAM9MMT$B J3~J3t[S6MM醸M 鋲T$B J3>[6MBM0MD/MP2MhjuYYËM鷜T$B J3d[5MBM0MD"/MPMhMT$B J3[b5MMM|jpuYYËT$B J3CP["5DT$B @3@[4M̊MT$B J3[4h$]Yju\YYËT$B J3[4h<]cYju(YYËT$B J3T[f4hd]/YjuYYËT$B J3SX[24h\]YjuYYËT$B J3$[3hD]YjuYYËT$B J3[3hL]YjuXYYËT$B J3[3hT]_Yju$YYËT$B J3[b3h]+YjuYYËT$B J3Oį[.3h]YjuYYËT$B J3|]YjuYYËT$B J3[2hl]YjuTYYËT$B J3[2h][Yju YYËT$B J3([^2h]'YjuYYËT$B J3K[*2h]YjuYYËT$B J3\[1ht]YjuYYËT$B J3[1h4]YjuPYYËT$B J3 [1h,]WYjuYYËT$B J3{[Z1MT$B J3X[71jpuYYËE eMDÍM;T$B J3У[0jpuYYËE eMjpubYYËE eMÍMT$B J3[0MT$B J3}[\0MMMxwMoM[T$B t3,J3" [0M7MT$B J3J3[/MMMT$B J3J3[/lMMMMT$B `3gJ3][M*M"T$B J3([-E܃ eMÍMT$B J3<[-E eMËT$B J3[e-T$B J3k[J-MtT$B J3H['-MQMUT$B J3`[,M&MT$B J3[,T$B J3ܨ[,MMMT$B J3ԩ[,MMMMM T$B h3^J3T$[3,MiMԚM̚T$B J3!J3[+M,T$B J3[+MMMMMT$B J3̫[+MMMT$B J3~[]+MMMT$B J3K\[*+MTMLMPT$B J3|[*hX]YËT$B J3д[*h]YËT$B J3[*h]rYËT$B J3[*hH]KYËT$B J3|[[*h(]$YËT$B J3U[4*h8]YËT$B J3. [ *h]YÍM骘T$B J3J3[)h]YÍMqT$B J3J3Ա[)T$B J3h[)T$B J3[e)T$B J3kx[J)T$B J3Pp[/)T$B J35[)M>MpT$B J3 J3[(M#MT$B J38[(MMMMT$B J3|[y(T$B J3[^(MMMxMpMhM`MXM\tQMIt>M6T$B p3ĵ['MM}T$B J3 ['MMz}T$B J3H['MMO}MT$B J3rж[Q'̋M鈗T$B J3G[&'̍MM麕T$B J3J3|[&̍M邕T$B J3ܷ[&HËT$B J3X@[&McT$B J3T[r&MT$B J3p[O&MT$B J3MP[,&EeMpËMTMןT$B J3[%ht]YËEȃ eMlËT$B J3J3 [%M(T$B J3J3[h%ME eMËT$B J3MJ3C|["%MГT$B J3 J3[$hh]YËT$B J3([$yT$B 3J3и[$MDT$B J3J3@[n$MT$B J3lJ3bܹ[A$MMMڒT$B 3,J3"[$M骒M颒T$B J3J3[#MuMmT$B J3J3t[#MMT$B J3[l#MT$B J3j([I#T$B J3O[.#MLM T$B J3$[#MT$B J3@["MT$B J3["EeM[ËT$B J3["EeMP$ËM@T$B J3e[D"M|T$B J3B,[!"MfT$B J3[!EeM`ËM XM(MM0IM[E eM"ËT$B J3qX[PT$B J3Vt>[5T$B J3;h[MDM|QT$B J3J3[EeMhËM)T$B J3\[MͨMeT$B J3([uh]>YËT$B J3o[Nh]YËT$B J3H$['h]YËT$B J3!P[M6M顅M际huYYËT$B J3J3[jpuMYYËT$B J3[M4M,T$B \3~J3t[ST$B J3Y [8hX]YËT$B J32[h ]YËT$B J3 [MT$B J38[MMhMJM%MPM2M T$B J3J3\[jMiT$B J3h`[GMPMNT$B J3:x[MW%T$B J34[x霃M锃M錃M鄃%`nT$B 3J3[MT$B J3[gM1M MkT$B J3O[.M1T$B J3,[ M1T$B J3 @[MM}0Mw0MƺT$B J3[MyM 1Me1MqMPT$B J3yD[XM-M0M1MT$B J38[T$B J3 [M:#T$B J3[M/T$B J3[j,MYYh:YYj *YYj0YYhYYÍ T$B 3XJ3N[-MրM΀MƀM龀M鶀T$B J3 J3([T$B J3L[MET$B J3x[M:MM M@T$B J3[^MMT$B J3TJ3J[)MMT$B J3J3X[h]YÍMT$B J3J3[\MC~l8~dDM;M3M+M#MMM pVDM~M~M~E eM~ËE eM~ËE eM~ËE eM~ËE eMl~ËE  eߍMS~ËE@ eM:~ËE%eM~ËE%eM}ËE%eM}ËE%eM}ËE%eM}ËE%eM}ËE% eMh}ËE%@eMJ}ËE%eM,}ËE%eM}ËE%eM|ËT$B X3AJ374[M0}E eM}ËE eM|ÍM|M|T$B J3[ M|E eM|ËE eM|ÍM|M|T$B J3mT[L jhuYYËT$B J3E[$ @MzlzM{hX|YYÍM|@dE|{M{MM[{MMK{MM;{T$B 3J3[b E eMl{ËE eMcËE eMJËT$B J3[ E eM{DËT$B J3[ MqzMizMazMYzMQzMIzMAzM9zM1zM)zM!zMzMzM zMzMyMyMyMyMyMyMyMyMyMyMyMyMyMyMyMyMyyMqyMiyMayT$B J3J3[ M4yM,yM$yMyMyM yMyMxMxT$B J3IJ3?<[ MTMLMDXyT$B T3[ 8=MewM]wMUwMMwM[xT$B 43J3[ (=M wMwMvMvMxE eMwËE eMvËT$B 3 J3([8T$B J3gJ3][<M s@T$B <3, [ M%tT$B J3 |[M tMsT$B J3[M sMsT$B J3[MsMsM sMsE eMËE eM騌ÍM韌MqMJsMBsM:sM2sM*sM"sT$B J3J3[MrM rMrT$B J30[M QrMrMrMYT$B J3[mjuYYËT$B J3fp[EM鑷MqM遷MqT$B p3(J3[MIMqM9MqT$B h3J3[M^qMVqT$B J3J3[M̶T$B J3~J3t[SM韶T$B J3QJ3G[&MrT$B J3$J3H[MEMpMpMpM%T$B J3J3[MT$B J3[MwT$B J3[fMqT$B J3d[CMT$B J3AX[ MM88T$B ,3J3[M駵M|T$B x3J3[MdM額T$B J3J3{[ZM/M@T$B J3PJ3F,[%BMMnT$B 3 J3[T$B J3D[MMhnT$B J3J3`[hx&YYÍM(n|Ij xYYËhhM|ËhhDbÍ\2MmT$B @3 J3[MT$B J3x[j$uWYYËT$B J3L[MM6mT$B J3J3P[`MMmT$B J3VJ3L[+MUMlT$B J3!J3[M MlT$B J3J3[MMblT$B J3J3[MM-lT$B J3J3x[WMMkT$B J3MJ3C["MLMkT$B J3J3[MMkT$B J3J3@[MMYkT$B J3J3[MM$kT$B J3yJ3ox[NMxMjT$B J3DJ3:[MCMjT$B J3J3H[MMjT$B J3J3[MMPjT$B J3J3[zMMjT$B J3pJ3f[EMoMiT$B J3;J31H[M:MiT$B J3J3 [MM|iT$B J3J3[MMGiT$B J3J3P[qMMiT$B J3gJ3][T$B J3[MMM MMMMMMMMMMMMMMMMMM{MsMkMcM[MST$B J3[McM cM cMbMmaMbMbMbT$B J3J3趽[MbMbM bM&bMaT$B J3sJ3i [Hh]YËT$B J3B|[!T$B J3'D[MT$B J3p[MM(fT$B J3ּ[MH`M T$B J3証 [M`M MT$B J3o[Nh]YËT$B J3H['M`M`T$B J3J3[M_M}_\MjMb_MZ_MsMJT$B X3費P[M:`M_MM"`M_M|T$B x3YJ3O[.MH`M@`M 8`T$B J3\[ju蕶YYËT$B J3[MxT$B J3Ѻ[M_M T$B J3覺X\M_EeMËM MxMb_M,KNT$B J3;[Mt M9jDu衵YYËT$B J3$\j uyYYÍMT$B J3й\M ^M^hu6YYj u)YYj uYYËT$B J3{@[ZM t^Ml^T$B J3P[/MI^M A^M9^M1^M)^T$B J3 [jPu膴YYËT$B J3H\jTu^YYËT$B J3轸t\MT$B J3蚸\yM M ]M8]MP-MT$B J3H\'MQT$B J3%\\T$B 3J3\MuMuT$B J3Ƿ\hu=YYËT$B J3蜷\\{(M\T$B $3kJ3a\@jLuڲYYËT$B J390\MXT$B J3\M4T$B J3$\t\7T$B p3ʶJ3$\E eM=[ËT$B J3茶#\kj uYYËT$B J3d#\CMӶT$B J3AP%\ T$B J3&%\T$B J3 l$\M3T$B J3$\MmZT$B J3µx"\MMT$B J3藵\vM2T$B J3t\SM霟MYM(Yj4ṵYYËT$B J3+"\ M $ZEeMTËMlYMtNM|sYM1MAXMZMrMrM鬶M1MrM rMH5MhT5M|z5M85M^5M5MYMXMXMiXMEWM(εM84MXMX($MWMXT$B $3fJ3\\;MYMWT$B J3.\ MWT$B J3\T$B J3<\M$4T$B J3ʲJ3\M MT$B J3蕲D\tMWMWM鎴MWMnWT$B J3RJ3H`\'M$AWM 9WM1WMoT$B J3 !\MWMVM VT$B J3ڱ\MVMVM V,GM)UM!UM/VE eMUËE eMUËT$B (3OJ3E\$M>VM6VM.VM &VT$B J3 \MVMUMUM UMrUMTTMbUMDTMRUMJUMbnT$B J3藰J3荰\lMUMSMUM銲MTT$B J3JJ3@\M9UtSMTM:MTMTM"MTMM}TT$B p3ϯJ3ůh\M TMTM=TM±M-TT$B J3肯J3x0\WMqTM-MaTtrMNTMFTM>TMRMSMBMST$B p3J3\MSM SMS bMDRMD3D(DDDCMCCMCC;MCCCChMZcCXCM<EC:CMAdCChiAMiHMMBBBBBBMB@mBbBWBLBh@6BMA#BB BBAAAAAA;MMz?EЃ eM?ËEЃ eM?ÍM?M?T$B J3荚J3胚\bMMgMl?Md?T$B |3EJ3;\MPMHM@M>T$B J3J3`\M~>MM@?M[>MS>T$B <3襙J3蛙!\zM鰛M騛xA?T$B t3b$"\Aj@u۔YYÍMN>MF>T$B J3*(\ EeMh駁ËMh1T$B J3&\MT$B J3Ř$'\MiT$B J3袘%\T$B J3臘H&\fM=M;M;Mh=M`=MVhu͓YYËT$B J3,l&\ MMM6$7T$B 3J3L)\MX5@cXM:5M25M*5M"5M06MNT$B 3zJ3pT/\Oh^YÍM5M5M5M5T$B J3)J3/\MM5M5My4Mq4jtupYYËT$B J3ϐJ3Ő0\h,^mYju2YYËT$B J3葐1\pH4M5M5DD`4ËDDx4ÍM4h8^ҎYh<^ƎYh@^躎YËT$B <3J3ޏ(1\Mf4M^4M@3M83hu4YYh4^VYËT$B J3臏J3}0\\Mv4M)zhz^NT$B 39J3/3\M(4M2M2M4M4M9MhuuYYËT$B J3Ԏp2\MF2M3M3M3T$B J3虎2\xMxT$B J3v1\UM2hX^YËT$B J3GJ3=@3\MFT$B J3T6\MkT$B J3(6\MT$B J3ԍ@7\T$B J3蹍6\M1T$B J3薍 7\uT$B J3{5\ZM0T$B J3X6\7MT$B J355\M1T$B J3l3\M FT$B J3x5\h^蔋YËT$B J3Ō3\M1M1M4 M0M0j`uYYÍM1M1My1Mq1MJT$B J3M3\,M M(T$B J3"J3L5\T$B J3J3t>[M0MT$B J3ȋJ3辋X4\M 0M>0M60M T h0l~0T$B P3_J3U4\4M.MF0M>0M60T$B J3d7\EeMp镢ËM m.Mb.M$w/M, ML M9.MG/M M T$B J3茊J3肊7\aM{/M-M /M-M.M-M.M-M.M-M.M-M.M-M.M|-M.Ml-M.M\-M{.T$B J3迉p8\鞿M.T$B J3蜉D9\{EeMprËMrT$B J3Z:\9EԃeḾҠÍM-M̃+Ḿ-Ḿ,Ḿ-Ḿ-Mx-T$B 3ʈJ38:\韾M>tM;:T$B J3茈x9\kM+M -T$B J3aJ3W:\6M,M,M,M,M,M,M,M,M,M,M,M,M,Mw,Mo,T$B J3ćJ3躇:\陽MqMrT$B J3菇9\nM`qMrT$B J3d9\CM9T$B J3Al?\ M9T$B J3?\M,EeM\鑞ËM(gT$B J3Ԇ<\鳼M+MML+M.*M<+M*T$B J3艆J3=\^Mx+M*T$B J3TJ3Jh=\)MC+MWM*T$B J3J3 ,=\M+t*Ml)xw*Mo*MQ)M_*d^*,ևMA*M#)M1*D鳇M*T$B (3pJ3f@<\EM_*MW*T$B J3;J31?\MBT$B J3@?\M#M)T$B J3J3ل>\鸺Ma)MtMMM\鸆M#)T$B X3uJ3k>\JMnMlT$B J3=@\M:MT$B J3A\j uYYËT$B J3@\ѹMLT$B J3σ`A\鮹M1xMLT$B J3褃A\郹juYYËMmT$B J3tA\SM'T$B J3QJ3GTI\&MrmM'MbmM'T$B J3 J3xE\j4u{~YYËT$B J3ڂHC\鹸juS~YYËEЃ eME'ËT$B J3虂J3菂hF\njDu~YYËT$B J3gtC\FjXu}YYËE eMvËMelT$B J3xH\ju}YYËE eMcvËMlT$B J3ՁF\鴷j uN}YYËT$B J3譁C\錷|kM*&|kM&T$B h3iJ3_D\>hkM%htkM%T$B P3J3D\M[6T$B J3[M\M\MvM 4T$B J3q,\\韧M8MNM M(}NM,E@M4gNM8+!M@ !T$B J3PqP\\/T$B J35qJ3+q=[ MHT$B J3qP`\M%T$B J3p`\ĦMT$B J3p4^\顦Mv[T$B J3pJ3p\\tMv?M骶Mf?T$B J3bp]\AM[MwT$B J37pJ3-pD_\ MZT$B `3pJ3o\\ܥMMT$B J3o^\鱥M>M~ZT$B J3oJ3op]\|M麵jukYYjukYYËT$B J3`ox^\?M}jujYYËT$B J30o^\jpujYYhujYYÍMYM2T$B J3nJ3n_\齤hYMYMYMwYX=T$B T3nJ3n^\gMi=T$B J3enp_\DhY`t`iMXT$B \3nJ3n ]\j`uiYYËT$B J3m_\ˣMXM`8`8ST$B ,3mJ3mb\}MXMJX|0dhTT$B `3ZmJ3PmLa\/MHXj$uhYYÍMWMWx!0T$B t3mJ3lpa\עMWT$B J3la\鴢T$B J3la\院MWMRT$B J3lJ3l`\dM\T$B J3blb\AMk3M5IM\jugYYËM 鳾T$B J3l,b\M\`\T$B H3kJ3kb\鵡*MVT$B 3kJ3kb\zM.T$B J3xkbYYËT$B J3fg\|E eMhËT$B J3ifLj\HMM shM8\hT$B J30f8l\M՝M MT$B J3fk\M駝M hT$B J3ek\鳛MyT$B J3e j\鐛MgT$B J3eph\jM0M gM8gMP鋜T$B J3Gek\&MM QgM8FgMP;gMh0gM"gT$B J3dpj\ɚh^cYjuW`YYËT$B J3dDh\镚j@u/`YYËT$B J3ddl\mj0u`YYËT$B J3fdk\Ej(u_YYËT$B J3>dhk\jXu_YYËT$B J3dS\T$B J3#S\M[MT$B J3RJ3R\͈MT$B J3R|\骈M*T$B J3RJ3R\}MWT$B J3{RD\ZT$B J3`R\?MiTMT$B J35R8\MmT$B J3RЄ\T$B J3Q`\ևM/M,T$B J3Qd\髇MP T$B J3Q(\鈇M#MST$B J3~QJ3tQȆ\SMMuST$B J3IQ\(MMJST$B J3QJ3Q\M)SM!ST$B J3P\ȆMyT$B J3P܊\饆Mju7LYYËM\RM.T$B J3PJ3yP4\XMHMT$B J3NPJ3DP\#MpM\BRT$B J3P\MT$B J3OJ3O\ȅMqMiT$B t3OJ3Ot\鐅MjT$B J3O\mT$B J3sO@\RMT$B J3POJ3FO\\%M[QT$B J3#O\MT$B J3OJ3N \ՄT$B J3N\麄EeMVfËT$B J3Nh\郄T$B J3Nx\hM 7M T$B J3^NJ3TN<\3MMMMMIPMAPMjuIYYËEЃ eMx3ÍMOMOMOM錼T$B J3M\隃MiMOMOM4MIT$B J3xMJ3nM\Mht^LYjuHYYËT$B J3:MЍ\hl^KYjuHYYËT$B J3M\h|^KYjusHYYËT$B J3L\鱂T$B J3LT\閂MS2E eMMÍMtMYYËM+E eMËT$B J3AB\ xEeM4YËM頁M3WM鋿M(iT$B J3AH\wMYMVMDM(iT$B J3At\vwh^?@Yju=YYËT$B J3cA\Bwj8uYËT$B J3?$\uMUMUM UM鎮M醮T$B J3?\uh$^]>Yju";YYËT$B J3?\`uh^)>Yju:YYËT$B J3M?$\,uh ^=Yju:YYËT$B J3?\th^=Yju:YYËT$B J3>\th^=YjuR:YYËT$B J3>\th^Y=Yju:YYËT$B J3}>\\th^%=Yju9YYËT$B J3I>\(th^ \sh^MM9#MCM;MM+T$B J3Z=J3P=\/sT$B J35=|\sT$B J3=4\rM#?T$B J3<ܡ\rM?T$B J3<\rE eMrËT$B J3<\rMQT$B J3z<\YrMQT$B J3T<ب\3rhl^:Yju7YYËT$B J3 kh^4Yju0YYËT$B J3+5\ kh^3Yju0YYËT$B J34 \jh^3Yjud0YYËT$B J34\jh^k3Yju00YYËT$B J34P\njh^73Yju/YYËT$B J3[4\:jM MT$B J304\jMM֢T$B J34J33\iMM{MsMkMcM[MSMKMCM;M3M+M#MMM MMMMMMMMMMMMMMMMMM{MsMkMcM[MSMKMCM;M3M+M#MMM MMMMMMMMx`H0~sh]RpGh^_0YËT$B `31J31,\bgE eM!ÍMMMT$B J371X\gE eM՟ÍM̟MXM鼟MxT$B J30\fE eM遟ÍMxT$B J304\fE eMEËT$B J3s0\RfE eMÍMMMMT$B J30\eE eM齞ÍM鴞M鬞T$B J3/\eMMMEM=T$B J3/\eMWMNM T$B J3u/\TeMMMz1M T$B J3:/J30/\eMMM51M;DM龝T$B J3.J3.$\dEeM0^FËMMCM)T$B J3.\jdM܊MCMT$B J3O.\.dMju)YYÍMC0M;0T$B J3.\ch^,Yju|)YYËT$B J3- \cT$B J3-x\cM\MM^MMNMFM>T$B J3m-\LcMMT$B J3B-J38-X\cMT$B J3-\bT$B J3,ܽ\bT$B J3,\bMTT$B J3,4\bMBT$B J3,\xbMGT$B J3v,,\UbEeMtCËM`.Ma.M4T$B J3,\ah^*Yju'YYËT$B J3+$\aM 阚MMLM通MxM;MhM+MXMPMT$B J3w+ܺ\VaM)M-MM Mjxu&YYÍMMMMMЙMMT$B J3*l\`E eM,ÍM,T$B J3*\`MOMYMQMMAM9T$B J3h*\G`MT$B J3E*\\$`MN,T$B J3"*\`MT$B J3)\_EeMLzAËM+T$B J3)\_M kMMMMKMM;M3MT$B J3Z)\9_M Mg+MMMjPu$YYÍMӗMM×MM鳗MoMgT$B J3(|\^T$B J3(\^MSM]M MMMET$B J3t(d\S^M}*T$B J3Q(h\0^T$B J36(\^MT$B J3(4\]M]T$B J3'\]MuM[ T$B J3'X\]MDT$B J3'$\x]M$>M$FM~ËE eM%ËE eM ËE eMËE  eߍMËE@ e쿍MËE%eMËT$B J3 $P\Yh^"YjuzYYËT$B J3#\Yh ^"YjuFYYËT$B J3#\Yh0^M"YjuYYËT$B J3q#,\PYh(^"YjuYYËT$B J3=#\YhX^!YjuYYËT$B J3 #0\Xh`^!YjuvYYËT$B J3"d\Xhx^}!YjuBYYËT$B J3"\Xhp^I!YjuYYËT$B J3m"\LXhh^!YjuYYËT$B J39"\XT$B J3"(\WM T$B J3!J3!\WM韐MbMSMaMT$B J3!J3!\WMMMBM:T$B J3i!\HWM +T$B J3F!\%WMMMM܏T$B J3 !J3!T\VT$B J3 \VT$B J3 h\VT$B J3 \VT$B J3 p\tVT$B J3z \YVT$B J3_ \>VMMMMMMMMՎM͎MŎMMyMqMMT$B J3H\UMEM=MDMbMZMRMJM0M:M2MMT$B |3NJ3D\#UMMMMڍMҍMʍMM麍M!M骍M颍M^MVMNMMT$B J30\TM"MMGM?M7M/MMM~ MMMMMMMMT$B J3\SMMwM餌M霌M锌M錌M鄌MjMtMMdMMTMLMMMMM8M0T$B J3KX\*SMMT$B J3 \RT$B J3\RM鳋MoM}MfM铋M鋋T$B J3J3\R̍5T$B 3J3w`\VR̍T$B 3AJ37\R̋MMT$B J3J3h\Q̋E eMhÍM^T$B J3l\Q̋T$B J3J3=[dQ̍Mj4EPËMMXMMMMM|MtT$B J3J3\Ph^YËT$B J34\Ph^rYËT$B J3\P̍M'EЃ eMËT$B J3^J3T8\3P̋E eMǾËT$B J3\O̍MhMHM(MT$B J3\O̍MWT$B J3\ŐE eMËT$B J3f\EOh^YËT$B J33\O̍M鷽M鯽M颽M隽p鏽T$B 3J3h\N̍M-T$B J3J3\|N̍M"T$B J3w4\VN̍Mx-T$B J3GD\&N̍MǼMM鷼MT$B J3J3\M̋E eMbËT$B J3\M̋T$B J3J3\dM̋MHM0>jLEPËT$B J3=J33\M̋MM0>T$B J3J3\L̍MrT$B J3\L̋E eM2ËT$B J3$\eL̍MMT$B J3Od\.LjuYYËT$B J3'<\LM UT$B J3\KMg]MTT$B J3J3\KMTT$B J34\KMTT$B J3\hKj(uYYÍM_TT$B J3Yh\8KM\M4TT$B J3.\ KM,Mh3T$B J3l\JjuvYYËT$B J3J3\J3ۋEj4Y SuNYYËT$B J38\rJM|huYYËT$B J3`\?JM>xhuYYhuYYËT$B J3<\IMÑT$B J3\IMwT$B J3h\IMwT$B J3\IMZT$B J3\pIM7T$B J3n \MIMT$B J3K\*IMȺM)M0锺M<鉺MH~MTiM`ϹMGM[M\Mh T$B J3\Hh8u$YYËT$B J3t\bHh8u YYËT$B J3X\7HE eM靹ËT$B J3$\HMvMT$B J3\GT$B J3D\GhuT YYËT$B J3p\G3ۋEjY 3 PuKYYÍM߸hu YYhu YYËT$B J3G\&Gj8u YYjh^Yju\YYËT$B J3\\>M M M MT$B J3\_>MMT$B J3U\4>MxMpMhT$B J3"D\>MEM=T$B J3x\=M M M T$B J3\=M\߭T$B J3\}=M\IT$B J3x\W=M T$B J3U\4=M\pT$B J3/\=M\T$B J3 `\ .         ~ f R @ .          v \ H .         P @ $       .DTbz,BRht0BRdt :Rjt*Hdpzv\@(rZH.\J6.v^J4|`RB2"zn`RB,xf~bPR8 ~l     $6DVl~"2DPh*:JZl  l & > R ~ l  @`NE@EEE0EpE`EEEEEEEEEpEEEEEEEE`E@E E0EpEEEEEEEE E0E@E`EpEEEEEENPNjM0N;O@gP`rP QC0SPP>>??@@@ABpDEFF0GH@IJLLLM@N@OOPQTVX@YYp[@\@_@bdfim@ppp`qq uPuwwx|}} ЊPp` `0У0ЧP@p@ @Ю 0@е0`P@  p@P0pp `@@ 0@P P@ Pp0pP `P@P P P0``0P pP@  @@@`0  !!""##$@%%@&&'(P(@*p**+,-./0@01p102@2 33455689::;;< =`=P>>??@0APBpCDEFGI0JPKpLMNOP`S`U0WpX[[p\\\@]]]^_`` aPaaaabcccdee ff gghi@jPk`lpmmop qPqq0r`rrrr sPs0u@uuPvvwyz {P{||}`}~@pPPPP@P@З P@pОp`@`pp0`pp p0Pp@P`@pо ` @@PP00 ``0 0`p@@@@P@``Pp0   P       pP00p@0 P! $P%&P'()*p+P,0--0../p044506@788p99 :p::0;;;0<0==>>??@@@PABCDF0G`GGHIpJJpKKPMNOQRS`T@UpUUVVWWP[[[^`ab0bbbcdef@fgh@hi`iii j`jjjj kPkkplllm0mmnno ppPqr@tPt uxyz{|}0~@~ Pp P`p@`0 ЏА 0`@@Й ` @`@P0РPС@ Ф pP@Ч pP0@ 0`0@P0p 0@ ` 0 `pP@ pp`@P`@P@00pP0@ 0@pP0 P  P        @   @ ` @   p `        0 `     P         0% ' ' ( @( p( , - . `. . / 0/ @/ p/ / / 0 00 `0 0B @B pB C @F pF 0s @ p ` p P P `   p  0  0 @ P ` p   P  `   0  ! @! ! ! " p" " 0# - u @v Pv `v pv v v v v w Pw x 0x `x x x y 0y `y y y y z Pz z z z z z { { 0{ |  0 @ ` p 0 P ` p Ѓ P ` 0 0  0 0 @ p ` p 0 p Ю P ` б @ P P P P P ` p 0 `   p 0 ` P ` p @ P ` p  ` p @ ` @ @    - 0- 4 H H H H I 0I `I I J 0K @L `N N O pO O P R @S S S pi `j j k Pl `m pn n o Pp q t u u w 0x } } P Ђ ` 0 Љ P @ P ` p Ш  ` P p 0 p 0 p 0 p 0 p 0 p 0  0 ` 0 P ` P ` p  @ p 0 0  0  @ p   @ P `  P    0    0 `    0 p  @    @      @ @  0! `! ! " " # `$ % 0% P& ) 0) * , , P1 P2 8 8 9 : 0: P: : p= PB `B B E E I 0K PK pK P P Q Q R Z \ `\ b b 0c d d d Pf f f f i 0j Pk l l @l l l m Pm m t 0t t v v w w x y z p @ 0 ` @ P p @ @ P ` ` 0 p p @ P    P $ P$ ' `' ' , , - - 0. . . ; < < = = = > @@ D F 0K P `P P P Q Q S 0V V @Z j Ў 0 ` P `0pP@  ` 0 0 0  @0 @"'P,,-.0//p000@11112 2@2P2`2223@5p67P889;`;;@<=0>>?@@AA BCDDEEE0FpF`PPPP l`lllPm0nqpvvw xxxy y`z{|0pP`h0q0;<@P@PppP$''?0@`AKL@g`r@P` pp@   0@P`p 0@P`p 0@P`p 0@P`p0`@8pLLLLMNOP RXZ [p[] kp@q`quvPvzzz{0{{@|p|@pЍ БP`P@p0p0`0 p`P@0 pp0Pp0Pp0@P`p 0@P`p Pp``00 @  @` ! " ##0$$%'( (P((`)-@.`.. /p/6667078899@9p99::;; ;`;p;;;> ?P?CD`HPPPPQ0QQQRRR0SSST0TPTTTTUUpVVVVVW0WW@[[P\\\\]^bc d0eggipjkkPo`oov{}p0` pп0Ppp@ 0@ @p`p@!@!p! $`$$0%%0&p++p,.26P777:P:`<?BC0CpCP [[aPb0c`jmq0vP{{{|0}@0 жи 0@p@P`p0 @ @PP @ 0`00p0Pp       P`@/P/p/022303`333P4@777899<< >`GGINPPQ@UUVV@WPW[] ^^bbbpdhilooooppPupxy{0{`{{Ё ЋP 0``@@P@pШP@ЫPP`Pp@p`p   P00``p0p `Pp@P0@P0P  0  P  @$%% %%P)*@++,P--.P/01p145 0@P`pЃ 0@P` @`Ѕ 0@P`pІ 0@P`pЇ 0@P`pЈ 0@P`pЉ 0@`pЊ 0@P`pPClientRenderer.FocusedNodeChanged  ! {7d a P ' p   ://=Z4EPNEUnknown exceptionX=Z3EPNE=Z3EPNEbad array new lengthmap/set too longinvalid stoi argumentstoi argument out of range?Z2E>Z2E=Z@2Ehttphttps/rna-resource.acrobat.com?ZNN@@@ZNNNNNNNNNNN3E@ZFE@Z K K KKKMED ME-K4KJEP3E@AZ^A^AKESoftware\Adobe\Adobe Acrobat\DC\SecurityDEPSoftware\Policies\Adobe\Acrobat Reader\DC\FeatureLockDownbEnableATL7Compatkernel32.dllSetProcessDEPPolicyntdll.dllNtSetInformationProcess<>Z2Een-us16448250--slMode--type--locale=locale--backgroundcolorbackgroundcolor?&=RNA::AcroCef::Browser::LibcefLoadhellotyperendererOnRenderer:Startgpu-processcom.adobe.acrobat.rna.RdrCefBrowserLock.DCen-USRNA::AcroCef::Browser::CefInitializeRNA::AcroCef::Browser::MessagingSetupRNA::AcroCef::Browser::InitODMRNA::AcroCef::Browser::RegisterLocalFolderPathsRNA::AcroCef::Browser::RegisterCefSchemesinvalid vector subscriptvector too longinvalid string positionstring too longlibcef.dll@@0@@@`@p@@@@kernel32.dllSetDefaultDllDirectoriesSetProcessDEPPolicySetProcessMitigationPolicykernel32.dllGetProcessMitigationPolicyp@ !@"@ +@BrokerEventstring too longvector too longlist too longmap/set too long@@@@k@k@B@6@6@8@IsWow64ProcessGetProductInfoSOFTWARE\Microsoft\Windows NT\CurrentVersionUBR?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@SeChangeNotifyPrivilegeS:(ML;;;;;)S-1-16-16384S-1-16-12288S-1-16-8192S-1-16-6144S-1-16-4096S-1-16-2048S-1-16-0NtCreateLowBoxToken\Sessions\%d\AppContainerNamedObjects\%lsNtCreateDirectoryObjectVVVV4VLVdVVVVV4VLVdV@@@@A@XA@A@A@E@user32.dllinvalid string position:SetThreadDescriptionKernel32.dll _Bd@d@@d@`d@pd@d@d@d@d@f@d@pf@f@f@g@g@`g@g@g@g@@t@h@h@Ph@h@n@n@n@Po@t@t@u@u@ v@../../sandbox/win/src/sandbox_policy_base.ccFailed to add sandbox rule. error = , subsystem = , semantics = , pattern = ''g_shared_delayed_integrity_levelg_shared_delayed_mitigationsProfile for Chrome SandboxChrome Sandboxios_base::badbit setios_base::failbit setios_base::eofbit setiostreamiostream stream error: bad locale name%pfalsetrueeEpPLuLdluldi@+j@A^AA@t@ AAAAA0AA0AAAA@AAAAAA A0AA... Histogram: %s recorded %d samples, mean = %.1f (flags = 0x%x) {%3.1f%%}typeminmaxbucket_countlowhighcountеA^AAA AAAAA0AA0AAAA@AAAAAAAAPAеA^AA`A AAAAA0AA0AAAA@AAAAAAAAPAA^AAдA AAAAA0AA0AAAA@AAAAAA A`AAPAA^ApA0AAR@LINEAR_HISTOGRAMBOOLEAN_HISTOGRAMCUSTOM_HISTOGRAMSPARSE_HISTOGRAMA^ANNNNNNNANNNNN@NNNname-O %d (%d = %3.1f%%)XAAAAA*A`x@`AActivityTracker.ThreadTrackers.MemLimitTrackerCountActivityTracker.ThreadTrackers.Countfunction_namefile_name../../base/threading/scoped_blocking_call.ccScopedBlockingCallWithBaseSyncPrimitives,Keyg_handles_to_closeAAAsbox_alternate_desktop_local_winstation_0x%X\Device\\/?/?\**~*NtQueryAttributesFileNtQueryFullAttributesFileNtSetInformationFile\/?/?\\??\NtCreateFileGAAA#ANtOpenThreadNtOpenProcessNtOpenProcessTokenNtOpenProcessTokenExNtCreateKeyNtOpenKeyNtCloseNtOpenDirectoryObjectNtQuerySymbolicLinkObjectNtOpenSymbolicLinkObject%d\Sessions\BNOLINKSNtCreateEventNtOpenEvent|2N'G+ տЁjH8lHinoWX>]MtI !Wfw*EzT:EnumDisplayMonitorsGetMonitorInfoWGetSuggestedOPMProtectedOutputArraySizegdi32.dllCreateOPMProtectedOutputsGetCertificateSizeGetCertificateGetCertificateSizeByHandleGetCertificateByHandleGetOPMRandomNumberSetOPMSigningKeyAndSequenceNumbersConfigureOPMProtectedOutputGetOPMInformationDestroyOPMProtectedOutputntdll.dllkBxBBBB@g_interceptionsntdll.dllNtMapViewOfSectionNtUnmapViewOfSectiong_originals`x@CPC`C@CCCPCCC`x@CPC`C@CCCPCCC`x@CPC`C@CCCPCCC`x@CPC`C@CCCPC0CC`x@CPC`C@CCCPCCCntdll.dllNtAllocateVirtualMemoryNtDuplicateObjectNtFreeVirtualMemoryNtProtectVirtualMemoryNtQuerySectionNtQueryVirtualMemoryRtlAllocateHeapRtlAnsiStringToUnicodeStringRtlCompareUnicodeStringRtlCreateHeapRtlCreateUserThreadRtlDestroyHeapRtlFreeHeap_strnicmpstrlenwcslenmemcpyg_ntNtSetInformationThreadNtOpenThreadTokenNtOpenThreadTokenExCreateThreadkernel32.dll6B6B6B6B6B6B6B6B7B6B          ( ) / _ 0          ( ) / _ 0 V?aCoc?`(?yPD?jm Zjz  ' }Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju m ?6grWJz+{8 Ғ |! ӆBhn[&wowGZpj;f\ eibkaElx TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-CCCCECECECC\CnCC%C^A@CPC`CApCCCACCpC0C%C@%C^AB../../base/metrics/persistent_memory_allocator.ccCorruption detected in shared-memory segment.tracing categories exhausted; must increase kMaxCategoriestracing already shutdown__metadataaccessibilityAccountFetcherServiceandroid_webviewaudiobasebenchmarkblinkblink.animationsblink.consoleblink_gcblink.netblink_styleblink.user_timingBlobbrowserbrowsing_dataCacheStoragecameracast_perf_testcast.streamcccc.debugcdp.perfcefcef.clientchromeoscmacompositorcontentdevtoolsdevtools.timelinedevtools.timeline.asyncdownloaddownload_servicedrmdrmcursordwriteDXVA DecodingEarlyJavaevdeveventexoexplore_sitesFileSystemfile_system_providerfontsGAMEPADgpugpu.captureheadlesshwoverlaysidentityIndexedDBinputioipcJavajnijpeglatencylatencyInfoleveldbloaderloadingloginmediamedia_routermemorymidimojommusnativenavigationnetnetlogoffline_pagesomniboxoobeozonep2ppage-serializationpepperppapippapi proxyrailrendererrenderer_hostrenderer.schedulerRLZsafe_browsingscreenlock_monitorsequence_managerservice_managerServiceWorkershellshortcut_viewershutdownSiteEngagementskiastartupsyncsync_lock_contentiontask_schedulertest_gputest_tracingtopleveluiv8v8.executeValueStoreFrontend::Backendviewsviews.framevizvkwaylandWaylandwebaudioWebCorewebrtcdisabled-by-default-animation-workletdisabled-by-default-audio-workletdisabled-by-default-blink.debugdisabled-by-default-blink.debug.layoutdisabled-by-default-blink.debug.layout.treesdisabled-by-default-blink.feature_usagedisabled-by-default-blink_gcdisabled-by-default-blink.image_decodingdisabled-by-default-blink.invalidationdisabled-by-default-ccdisabled-by-default-cc.debugdisabled-by-default-cc.debug.cdp-perfdisabled-by-default-cc.debug.display_itemsdisabled-by-default-cc.debug.ipcdisabled-by-default-cc.debug.picturedisabled-by-default-cc.debug.schedulerdisabled-by-default-cc.debug.scheduler.framesdisabled-by-default-cc.debug.scheduler.nowdisabled-by-default-cpu_profilerdisabled-by-default-cpu_profiler.debugdisabled-by-default-devtools.screenshotdisabled-by-default-devtools.timelinedisabled-by-default-devtools.timeline.framedisabled-by-default-devtools.timeline.invalidationTrackingdisabled-by-default-devtools.timeline.layersdisabled-by-default-devtools.timeline.picturedisabled-by-default-filedisabled-by-default-gpu_cmd_queuedisabled-by-default-gpu.debugdisabled-by-default-gpu_decoderdisabled-by-default-gpu.devicedisabled-by-default-gpu.servicedisabled-by-default-ipc.flowdisabled-by-default-layer-elementdisabled-by-default-loadingdisabled-by-default-memory-infradisabled-by-default-memory-infra.v8.code_statsdisabled-by-default-netdisabled-by-default-networkdisabled-by-default-paint-workletdisabled-by-default-powerdisabled-by-default-renderer.schedulerdisabled-by-default-renderer.scheduler.debugdisabled-by-default-sequence_managerdisabled-by-default-sequence_manager.debugdisabled-by-default-sequence_manager.verbose_snapshotsdisabled-by-default-skiadisabled-by-default-skia.gpudisabled-by-default-skia.gpu.cachedisabled-by-default-SyncFileSystemdisabled-by-default-system_statsdisabled-by-default-task_scheduler_diagnosticsdisabled-by-default-toplevel.flowdisabled-by-default-v8.compiledisabled-by-default-v8.cpu_profilerdisabled-by-default-v8.cpu_profiler.hiresdisabled-by-default-v8.gcdisabled-by-default-v8.gc_statsdisabled-by-default-v8.ic_statsdisabled-by-default-v8.runtimedisabled-by-default-v8.runtime_statsdisabled-by-default-v8.runtime_stats_samplingdisabled-by-default-video_and_image_capturedisabled-by-default-viz.debug.overlay_planesdisabled-by-default-viz.hit_testing_flowdisabled-by-default-viz.overdrawdisabled-by-default-viz.quadsdisabled-by-default-viz.surface_id_flowdisabled-by-default-viz.surface_lifetimedisabled-by-default-viz.trianglesdisabled-by-default-worker.scheduler` ]`7CkC0kCp7CThreadLocalEventBuffertracing/thread_%d`kC`ECTraceLogtracing/main_trace_logevent_name_whitelist../../base/trace_event/trace_log.ccSetDisabledWhileLocked%s: [0;3%dm| (%.3f ms)numbernum_cpussort_indexprocess_sort_indexprocess_nameuptimeprocess_uptime_secondslabelsprocess_labelsthread_sort_indexthread_nameoverflowed_at_tstrace_buffer_overflowedCNACC@CCCCCCntdll.dllNtOpenFileؓCCCCCC C@CCCreateNamedPipeWkernel32.dll..\\.\\\?\C`C@C C PC C C @CCCreateProcessWkernel32.dllCreateProcessA\\:\CPC@C0CCntdll.dllCC@C CpCntdll.dllNtOpenKeyExCCCCC C0C0CC0CC!`CC0CGdiDllInitializeGetStockObjectRegisterClassWEnumDisplayDevicesAGetMonitorInfoA C5CJCC\CnCCCѲCCC)C;CMC_CqCCmC!CWt>W>W>W&?WF?Wj?W?W?W @Wi@W@W@WAWMAWqAWAWAWAWAW BW%BW:BWiBWBWBWBWBW CW1CWSCWgCW~CWCWCWCWCW DW-DWMDWeDW}DWDWDWDWDWEW+EWHEWWEWpEWEWEWEWEWFW4FWNFWuFWFWFWFWFWFWGWJGWyGWGWGWHW)HW\HWHWHWHWHWIW7IWXIWIWIWIWIWJWJW+JWHJWmJWJWJWJWJW KW/KWLKWlKWKWKWKWKWLW6LWcLWLWLWLWMW+MWFMWcMWMWMWMWMW NW,NWQNWmNWNWNWNWNWOW>OWbOWOWOWOWPW@PWpPWblink_gc/allocated_objectsblink_objects/AdSubframeblink_objects/AudioHandlerblink_objects/ContextLifecycleStateObserverblink_objects/DetachedScriptStateblink_objects/Documentblink_objects/Frameblink_objects/JSEventListenerblink_objects/LayoutObjectblink_objects/MediaKeySessionblink_objects/MediaKeysblink_objects/Nodeblink_objects/Resourceblink_objects/RTCPeerConnectionblink_objects/ScriptPromiseblink_objects/V8PerContextDatablink_objects/WorkerGlobalScopeblink_objects/UACSSResourceblink_objects/ResourceFetchercomponents/download/controller_0x?discardablediscardable/child_0x?extensions/value_store/Extensions.Database.Open.Settings/0x?extensions/value_store/Extensions.Database.Open.Rules/0x?extensions/value_store/Extensions.Database.Open.State/0x?extensions/value_store/Extensions.Database.Open/0x?extensions/value_store/Extensions.Database.Restore/0x?extensions/value_store/Extensions.Database.Value.Restore/0x?font_caches/font_platform_data_cachefont_caches/shape_cachesgpu/gl/buffers/context_group_0x?gpu/gl/renderbuffers/context_group_0x?gpu/gl/textures/context_group_0x?history/delta_file_service/leveldb_0x?history/usage_reports_buffer/leveldb_0x?java_heapjava_heap/allocated_objectsleveldatabaseleveldatabase/block_cache/browserleveldatabase/block_cache/in_memoryleveldatabase/block_cache/unifiedleveldatabase/block_cache/webleveldatabase/db_0x?leveldatabase/db_0x?/block_cacheleveldatabase/memenv_0x?malloc/allocated_objectsmojomojo/data_pipe_consumermojo/data_pipe_producermojo/invitationmojo/messagesmojo/message_pipemojo/platform_handlemojo/queued_ipc_channel_message/0x?mojo/shared_buffermojo/unknownmojo/watchernet/http_network_session_0x?net/http_network_session_0x?/quic_stream_factorynet/http_network_session_0x?/socket_poolnet/http_network_session_0x?/spdy_session_poolnet/http_network_session_0x?/ssl_client_session_cachenet/http_network_session_0x?/stream_factorynet/url_request_contextnet/url_request_context/app_requestnet/url_request_context/app_request/0x?net/url_request_context/app_request/0x?/cookie_monsternet/url_request_context/app_request/0x?/cookie_monster/cookiesnet/url_request_context/app_request/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/app_request/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/app_request/0x?/http_cachenet/url_request_context/app_request/0x?/http_cache/memory_backendnet/url_request_context/app_request/0x?/http_cache/simple_backendnet/url_request_context/app_request/0x?/http_network_sessionnet/url_request_context/extensionsnet/url_request_context/extensions/0x?net/url_request_context/extensions/0x?/cookie_monsternet/url_request_context/extensions/0x?/cookie_monster/cookiesnet/url_request_context/extensions/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/extensions/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/extensions/0x?/http_cachenet/url_request_context/extensions/0x?/http_cache/memory_backendnet/url_request_context/extensions/0x?/http_cache/simple_backendnet/url_request_context/extensions/0x?/http_network_sessionnet/url_request_context/isolated_medianet/url_request_context/isolated_media/0x?net/url_request_context/isolated_media/0x?/cookie_monsternet/url_request_context/isolated_media/0x?/cookie_monster/cookiesnet/url_request_context/isolated_media/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/isolated_media/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/isolated_media/0x?/http_cachenet/url_request_context/isolated_media/0x?/http_cache/memory_backendnet/url_request_context/isolated_media/0x?/http_cache/simple_backendnet/url_request_context/isolated_media/0x?/http_network_sessionnet/url_request_context/mainnet/url_request_context/main/0x?net/url_request_context/main/0x?/cookie_monsternet/url_request_context/main/0x?/cookie_monster/cookiesnet/url_request_context/main/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/main/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/main/0x?/http_cachenet/url_request_context/main/0x?/http_cache/memory_backendnet/url_request_context/main/0x?/http_cache/simple_backendnet/url_request_context/main/0x?/http_network_sessionnet/url_request_context/main_medianet/url_request_context/main_media/0x?net/url_request_context/main_media/0x?/cookie_monsternet/url_request_context/main_media/0x?/cookie_monster/cookiesnet/url_request_context/main_media/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/main_media/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/main_media/0x?/http_cachenet/url_request_context/main_media/0x?/http_cache/memory_backendnet/url_request_context/main_media/0x?/http_cache/simple_backendnet/url_request_context/main_media/0x?/http_network_sessionnet/url_request_context/mirroringnet/url_request_context/mirroring/0x?net/url_request_context/mirroring/0x?/cookie_monsternet/url_request_context/mirroring/0x?/cookie_monster/cookiesnet/url_request_context/mirroring/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/mirroring/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/mirroring/0x?/http_cachenet/url_request_context/mirroring/0x?/http_cache/memory_backendnet/url_request_context/mirroring/0x?/http_cache/simple_backendnet/url_request_context/mirroring/0x?/http_network_sessionnet/url_request_context/proxynet/url_request_context/proxy/0x?net/url_request_context/proxy/0x?/cookie_monsternet/url_request_context/proxy/0x?/cookie_monster/cookiesnet/url_request_context/proxy/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/proxy/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/proxy/0x?/http_cachenet/url_request_context/proxy/0x?/http_cache/memory_backendnet/url_request_context/proxy/0x?/http_cache/simple_backendnet/url_request_context/proxy/0x?/http_network_sessionnet/url_request_context/safe_browsingnet/url_request_context/safe_browsing/0x?net/url_request_context/safe_browsing/0x?/cookie_monsternet/url_request_context/safe_browsing/0x?/cookie_monster/cookiesnet/url_request_context/safe_browsing/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/safe_browsing/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/safe_browsing/0x?/http_cachenet/url_request_context/safe_browsing/0x?/http_cache/memory_backendnet/url_request_context/safe_browsing/0x?/http_cache/simple_backendnet/url_request_context/safe_browsing/0x?/http_network_sessionnet/url_request_context/systemnet/url_request_context/system/0x?net/url_request_context/system/0x?/cookie_monsternet/url_request_context/system/0x?/cookie_monster/cookiesnet/url_request_context/system/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/system/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/system/0x?/http_cachenet/url_request_context/system/0x?/http_cache/memory_backendnet/url_request_context/system/0x?/http_cache/simple_backendnet/url_request_context/system/0x?/http_network_sessionnet/url_request_context/unknownnet/url_request_context/unknown/0x?net/url_request_context/unknown/0x?/cookie_monsternet/url_request_context/unknown/0x?/cookie_monster/cookiesnet/url_request_context/unknown/0x?/cookie_monster/tasks_pending_globalnet/url_request_context/unknown/0x?/cookie_monster/tasks_pending_for_keynet/url_request_context/unknown/0x?/http_cachenet/url_request_context/unknown/0x?/http_cache/memory_backendnet/url_request_context/unknown/0x?/http_cache/simple_backendnet/url_request_context/unknown/0x?/http_network_sessionomnibox/autocomplete_controller/0x?omnibox/in_memory_url_index/0x?web_cache/Image_resourcesweb_cache/CSS stylesheet_resourcesweb_cache/Script_resourcesweb_cache/XSL stylesheet_resourcesweb_cache/Font_resourcesweb_cache/Code_cacheweb_cache/Encoded_size_duplicated_in_data_urlsweb_cache/Other_resourcespartition_alloc/allocated_objectspartition_alloc/partitionspartition_alloc/partitions/array_bufferpartition_alloc/partitions/bufferpartition_alloc/partitions/fast_mallocpartition_alloc/partitions/layoutskia/sk_glyph_cacheskia/sk_resource_cachesqliteui/resource_manager_0x?/default_resource/0x?ui/resource_manager_0x?/tinted_resourcesite_storage/blob_storage/0x?v8/main/code_statsv8/main/contexts/detached_contextv8/main/contexts/native_contextv8/main/heap/code_spacev8/main/heap/code_statsv8/main/heap/code_large_object_spacev8/main/heap/large_object_spacev8/main/heap/map_spacev8/main/heap/new_large_object_spacev8/main/heap/new_spacev8/main/heap/old_spacev8/main/heap/read_only_spacev8/main/mallocv8/main/zapped_for_debugv8/utility/code_statsv8/utility/contexts/detached_contextv8/utility/contexts/native_contextv8/utility/heap/code_spacev8/utility/heap/code_large_object_spacev8/utility/heap/large_object_spacev8/utility/heap/map_spacev8/utility/heap/new_large_object_spacev8/utility/heap/new_spacev8/utility/heap/old_spacev8/utility/heap/read_only_spacev8/utility/mallocv8/utility/zapped_for_debugv8/workers/code_stats/isolate_0x?v8/workers/contexts/detached_context/isolate_0x?v8/workers/contexts/native_context/isolate_0x?v8/workers/heap/code_space/isolate_0x?v8/workers/heap/code_large_object_space/isolate_0x?v8/workers/heap/large_object_space/isolate_0x?v8/workers/heap/map_space/isolate_0x?v8/workers/heap/new_large_object_space/isolate_0x?v8/workers/heap/new_space/isolate_0x?v8/workers/heap/old_space/isolate_0x?v8/workers/heap/read_only_space/isolate_0x?v8/workers/malloc/isolate_0x?v8/workers/zapped_for_debug/isolate_0x?site_storage/index_db/db_0x?site_storage/index_db/memenv_0x?site_storage/localstorage/0x?/cache_sizesite_storage/localstorage/0x?/leveldbsite_storage/session_storage/0x?site_storage/session_storage/0x?/cache_sizesync/0x?/kernelsync/0x?/storesync/0x?/model_type/APPsync/0x?/model_type/APP_LISTsync/0x?/model_type/APP_NOTIFICATIONsync/0x?/model_type/APP_SETTINGsync/0x?/model_type/ARC_PACKAGEsync/0x?/model_type/ARTICLEsync/0x?/model_type/AUTOFILLsync/0x?/model_type/AUTOFILL_PROFILEsync/0x?/model_type/AUTOFILL_WALLETsync/0x?/model_type/BOOKMARKsync/0x?/model_type/DEVICE_INFOsync/0x?/model_type/DICTIONARYsync/0x?/model_type/EXPERIMENTSsync/0x?/model_type/EXTENSIONsync/0x?/model_type/EXTENSION_SETTINGsync/0x?/model_type/FAVICON_IMAGEsync/0x?/model_type/FAVICON_TRACKINGsync/0x?/model_type/HISTORY_DELETE_DIRECTIVEsync/0x?/model_type/MANAGED_USERsync/0x?/model_type/MANAGED_USER_SETTINGsync/0x?/model_type/MANAGED_USER_SHARED_SETTINGsync/0x?/model_type/MANAGED_USER_WHITELISTsync/0x?/model_type/MOUNTAIN_SHAREsync/0x?/model_type/NIGORIsync/0x?/model_type/PASSWORDsync/0x?/model_type/PREFERENCEsync/0x?/model_type/PRINTERsync/0x?/model_type/PRIORITY_PREFERENCEsync/0x?/model_type/READING_LISTsync/0x?/model_type/SEARCH_ENGINEsync/0x?/model_type/SECURITY_EVENTsync/0x?/model_type/SEND_TAB_TO_SELFsync/0x?/model_type/SESSIONsync/0x?/model_type/SYNCED_NOTIFICATIONsync/0x?/model_type/SYNCED_NOTIFICATION_APP_INFOsync/0x?/model_type/THEMEsync/0x?/model_type/TYPED_URLsync/0x?/model_type/USER_CONSENTsync/0x?/model_type/USER_EVENTsync/0x?/model_type/WALLET_METADATAsync/0x?/model_type/WIFI_CREDENTIALtab_restore/service_helper_0x?/entriestab_restore/service_helper_0x?/entries/tab_0x?tab_restore/service_helper_0x?/entries/window_0x?tracing/heap_profiler_blink_gc/AllocationRegistertracing/heap_profiler_malloc/AllocationRegistertracing/heap_profiler_partition_alloc/AllocationRegister../../base/run_loop.ccQuitWhenIdledisabled-by-default-*%llu%lld"0x%llx"0"NaN"NaN"-Infinity"-Infinity"Infinity"Infinity%sintD]DDDpDDDDANBdEiEuE^EE/E^EXEEE/EEEXEXE-C6?]X  ]X]X  ]X]X  ]X]X]X]X  ]X]X  ]X]X  ]X]X]X  ]X]X  ]X]X  ]X]X]X]X  ]X]X  ]X]X  ]X]X]X]X  ]X]X  ]X]X  ]X]X]X  ]X]X  ]X]X  ]X]X]X  ]X]X  ]X]X  ]X]X]X  ]X]X  ]X]X  ]X]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X ]X]X]X ]X]X ]X   ]X]X  ]X]X  ^X^X  ^X ^X^X^X^X^X^X"^X&^X)^X,^X0^X4^X8^X;^X?^XC^X    F^X  F^XK^X  K^XP^X  P^XP^X  P^XP^X T^XP^X ]XX^X  K^X  K^X  K^X  K^X  K^X  K^X  K^X\^Xa^Xe^Xk^Xp^Xw^X}^X^X P^X P^X P^X  P^X^X  ^X^X  ^XF^X  F^X^X  ^X^X  ^X^X  ^XP^XP^XP^XP^XP^XP^XP^XP^X  P^X  P^X  P^X  P^X  P^X  P^X  P^X  P^X ^X^X ^X ^XP^X  P^X^X^X^X^X^X/QW^X^X    ^X^X^X^X_X _X_X_X_X_X_X _X _X_X_X_X _X_X _X#_X)_X0_X5_X9_X   =_XA_XE_XI_XM_XQ_X U_X Y_X]_Xb_Xg_Xn_Xr_X^X  y_X_Xr_X^X  y_X_X  _X  _X  _X  _X  _X  _X _X _X _X _X  _X  _X  _X  _X  _X  _X P^X P^X P^X P^X_X_X_X_X _X_X _X _X`X`X `X"`X ,`X 6`X @`XI`X R`X [`X  d`Xl`X t`X{`X`X`X`X`X`X`X  `X  `X  `X  `X  `X  `X  `X  `X  `X  `X  `X  `X  `X  aX  aX  aX  aXaX$aX-aX4aX  ;aXBaXIaX  QaXYaX  _aXeaXkaXqaXxaXaXaXaXaXaXaX  aXaXaXaX  aXaXaXaX  aXaXaXaXaXbX bX  bXbXbX#bX  )bX/bX5bX;bX  AbXGbXMbXSbX  YbX_bX ebXebX obXobX ybXybX bXbX bXbX bXbX bXbX bXbX bX  bX bX  bX bX  bX bX  bXbXbXbXbX bXbX bXcXcX cXcXcX%cX ,cX,cX 4cX4cX F>F@N ApNZPEME?F>F>FE@F A@AFEF@F,OZEME?F>F>F@@F A@AFFF@F|OZEME?F>F>F EFF APZEME?F>F>F@JF AOZEME?F>F>F ELF A`PZ@EME?F>F>F`E@OF APZpEME?F>F>F@OF APZEME?F>F>F@@YF ADQZEME?F>F>F@YF AQZEME?F>F>F0E`E ARZ EE@EГERZEE@EГESZEE@EГEhSZEE@EГESZEE@EГETZEE@EГELTZEE@EГETZEE@EГETZEE@EГE0UZEE@EГE|UZEE@EГEUZEE@EГEVZEE@EГE`VZEE@EГEVZEE@EГEVZEE@EГEDWZEE@EГEWZEE@EГEWZEE@EГE(XZEE@EГEtXZEE@EГEXZEE@EГE YZEE@EГEXYZEE@EГEYZEE@EГEYZEE@EГE too longUnable to create/initialize AppModelRemoteClientListenerManager instanceInvalid Object Handler Look up arguments in BridgeObjectHandlerLookUpInfo::ensureValidPropHandlerLookupParams()Invalid Object Handler in BridgeObjectHandlerAdder::ensureObjectHandlerIsValid()Already registered object handler in BridgeObjectHandlerAdder::ensureSameObjectHandlerDoesNotExist()l\ZEPEEException occured while finding context in BridgeObjectHandlerFinder::ensureContextWasRegistered()Exception occured while finding prop handler in BridgeObjectHandlerFinder::ensureObjectHandlerWasRegistered()Invalid object handler in BridgeObjectHandlerFinder::getHandler()\ZFc]Z FNP]ZFFo]ZEPEE<^Z0FЊF^ZF]ZFInvalid context in RNACreateContextRequestCommandHandler::createNewContext()rfa^Z0"F<_Z+F_Z@/Fev_Z@>FInvalid Command Factory in IAppModelCommand::ensureCmdFactoryIsValid()Unknown Error occured while executing command `ZNME?F>F>F@@F A@AFN@F4`ZEE@EГE`ZEME?F>F>F@@F A@AFBF@F`ZpDFInvalid context found in AppModelCreateContextCommand::ensureValidContextExists()aZ0GFME?F>F>F@IFHF AInvalid Context in AppModelCreateObjectCommand::ensureValidContextFetched()Invalid object to destroy in DestroyObjectsCommandInfo()haZLFME?F>F>FMFLF AaZEME?F>F>F E@NF ARNAAppModelDynamicPropbZEME?F>F>F@@F A@AFPF@FPbZEME?F>F>F@@F A@AFQF@FbZEME?F>F>F@@F A@AFVF@FbZTFF>F@@F A@AFXF@F`dZp[FME?F>F>F@F ANcZp[FME?F>F>F@F A@\FtdZp[FME?F>F>F@F A@_FdZp[FME?F>F>F@F A@bFeZp[FME?F>F>F@F AdFdeZp[FME?F>F>F@F AfFeZp[FME?F>F>F@F AiFfZp[FME?F>F>F@F AmFiZ3EPNEbad cast jZ`x@PNEjZ`x@PNE: jZ`x@PNE0kZPuFwFwFy@y@0y@generic|kZ`x@x@x@y@y@0y@kZ uFNNfalsetruelZ@`~@p~@Ў@@0@p@@@Џ@@8mZ`x@PNETfZ_Aios_base::badbit setios_base::failbit setios_base::eofbit setfZ_AgZB0hZaAhZ`B @gZ^A@@@_A@_AYAP_A0ZA`ZA0[A`_A_A^A@t@^AiZWA@@WApYAYAYA0ZA`ZA0[A\A]A^A@t@^ATiZЪB:mZ`x@`~@p~@~@@@0@@@@@@%pLuLdluldmZ0@`~@p~@`@p@@@@eEpP.8nZEPEEnZFContext Creation error in AppModelContext::CreateNewInstance()nZNN}F oZEPEEpoZ FF}FProperty Object Creation error in AppModelObjectProperty::CreateNewInstance()ioZPFIndex Out of range in findItemInVector()Invalid collection type set in ensureCollectionTypeIsValid()Index Out of range in removeItemFromVector()Invalid collection type set in ensureCollection`TypeIsUnknown()G;G =GG:G;G`=G F:GFF@2G ?G@G FF?GNNNNNNNNNNNNNNNNNNNNN FcGFF[G_G!G aGp\GPaGaGcGp1GdG`GbGaGaG`G\G\G@]G]G]G^GcG FcGFF[G fGNNNNNNNNNNNNNNNNNNNNNNNNN FqGFFeG gG!GFp\GPqGpGoGmGPkG@jG6GhGgGiGPsG sGrGrGrG`rG0rGfG`lGpmG qG FqGFFeG uGNNNNNNNNNN FP{GFF0uG"G.GvGwGzG {G FPvG5GyG FP{GFF@uG |G}G FF|G FPGFFG"G!GPGPGGFG FPGFFG NNNNNNNNNNNNNNNNNNNNNNNN FGFFG"GpG aGGPaGGcGp1GdGG@GPGF@GG GG@GGPGЗGGGG FGFFG p*GG0G/GОGGpGGG FFGGG FFpGG F GFF`GFGPG`GFGGpGpG0GGGGGGpGpGGG0G F GFFpG NNNNNNNNNNNNNNNNNNNNNNNNNNNN FGFFPG"G!GFGGpGGG@G@G@GGоG`G G GGGGGPGGGGGGGPG FGFF`G G0G FFGG0G FFG G`G FFG G`G FFG`GG FFG`GG FF0G@GG FFG@GG FFGPGG H H FF H H H FF H HH H FFHH H FFHNNNNN F@7HFF4H"G!G5HwG06H F@7HFF4H NNNNNNNNNNNNN F0=HFF8H"G0H"G?H@H?H@@H FPAHFF>H `GHGH FF0GH@UHpUHUHNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN F0mHFFVHFF0FjH kHlHjHFplHPkH@F`jHjHkHbHfHhHbH0bHgHlHiHbHWHpHmH jHiH[HP[H`iHiHoH pHnH@fHnH@hHcHWHaH`HmHeHdH[H^H F0mHFFVH NNNNNNNNN F}HFF@tH{HFxHyHzHlHjH|H uH F}HFFPtH NN FPHFF0~H HpG FPHFF@~H NNNNNNNNNNNNNN FHFFHFpHHH HHPHFHHGGHH FHFFH FHFF`HFF`HH0H@H H FHFFpH FHFFЏH0H?H@HwGzGpG FmGPkG@jG6GHH HHАHGHH`HF FHFFH NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN FHFFH"G!G@Hp\G@HHHHHPHHH0HHHH HH H@HЧH HH@H`HH@HH`HHHСHpHHHPHHPHHРHHФHHHH HH@H@HH HpHHЙHHH FHFFH FHFFHHpG FHFFH FPHFFHHpG FPHFFH N FHFFHH FHFFH NNN FHFFH HpG aG FHFFH NNNNNNNNNNNNNNNNN FHFF0H"G!GFp\G0HFHH0H`H6GHH HH HH FHFF@H FpHFF@H0H FpHFFPH F`HFF0H HpG F`HFF@H FHFFHHpG FHFFH FHFFHH FHFFH F HFF H0HH F HFF0H FHFF`H HHHHpHPH@HGHH FHFFpH NNNNNNNNNNNNNNNNNNNNNNNNNN FHFFPH0H!GFp\GPqGpGHmGPkGH6G@HHH@H GHHH`H0HPHH0HHH FHFF`H NNNNNNNN FHFFpHHGHHHPHHpG FHFFH F0HFF0H"G?H H F0HFF@H pHHHH@H FIFFH0HPIHPIzGIIG5G`G6GhGH H FIFFH F@IFFII!GIII F@IFFI F@ IFFIF IPGpFHHH I F@ IFFI F@IFF I+G.GvGwGzG I I` I I F@IFF I F`IFFIpIpG F`IFFI FIFFI H FIFFI NNNNNNNNNNNNNNNNNNNNNNN FIFFI"G!GIFPqGIImGPI`GIH`IIP>GIGIH III0I FIFFI FIFFIFGH`GHPHjHF FIFFI pZwEEpZ^A^A'IwillDestroyContextproxyContextIdentifierlqZ0/Ip/I.I00I/I0I/I@/I/I^A@(I$qZ(INNNNNNqZ`.Ip/I.I00I/I0I/ICI/I`0I'I vWidth || rect.top > vHeight) return false; return true; } getVisibleNodeID(); scrollInfo var selection, result = false; var hasRange = false; if ( document.getSelection ) { selection = document.getSelection(); } else if (window.getSelection) { selection = window.getSelection(); } if (selection !== undefined && selection.type === "Range") { hasRange = true; result = selection.toString(); if (result === "") result = hasRange; } result;selectionInfocurrentYOffsetInfo);window.scroll(0,CDRCCSR1CSR2CLRCZ wJJzJZEE@EГE  ! {7d a P ' p   ZEPEEZNJSome exception occured while creating app data model object : AppModelObjectCreator::createInstance()ЊZQRJE8R8R?F@9R9RJ9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@@Z`J07R:RԋZJNNNNN@ZPJhZ`J0KЉKPKK@hZQR0JE8R8R?F@9R9RJ9R`;R;R;RME;Rp;R;R:R ;RRRp9R0K0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@`KČZpJ07R:RbrowserCEFManager،ZJJJ(ZIE@EГErna-shm-resource.acrobat.comtZNZNNNNxJԍZPK$ZzJJJ`JyJ8Z`KZzJJJ`JyJ0%d  ! {7d a P ' p   ZJNNNN0Z`JZQ [Qp[QpB]Q kQZJ@qQPvQuQvQ`qQ̏Z`JJJJ0J|ZpJK [Qp[QpB]Q kQZJNNNNNNNdZJNNZ J`J`JpJpFpBpJJZJJB0ZJ J@J`JPJZJJJZJNZJZzJJJ`JyJZJJ$ZzJJJ`JyJܑZ0K0KZKԒZzJJpJ0JJ, 8Z J@JZPJpJJJJcom.adobe.reader.rna.%s.%s.0  ! {7d a P ' p   ClientRenderer.FocusedNodeChanged  ! {7d a P ' p   ZFԔZFZ`FUse60FPS8Z@JInvalidBrowserSettingsBrowserCreationFailedInvalidRenderHandlerInvalidContext,ZJJ@ KrendererLoadedblobhttps://www.dropbox.com/oauth2/authorizewww.dropbox.comdropbox_hostredirect_urihttps%3A%2F%2Facrobatoauth.adobe.com%2Fclient_idsn4fcgj8be67u0vforce_reapprovestateacrobatresponse_typecodeechosign.comechocdn.comdocuments.adobe.comechosignstage.comechocdnstage.comdocumentsstage.adobe.comechosignawspreview.comechocdnawspreview.comdocumentsawspreview.adobe.comadobe.comacrobat.comadobe.demdex.netadobetag.comtypekit.netechosigndemo.comechocdndemo.comdocumentsdemo.adobe.comechosignopsdev.comechocdnopsdev.comdocumentsopsdev.adobe.comechosigndr.comechocdndr.comdocumentsdr.adobe.comomtrdc.netnewrelic.combam.nr-data.netadobe.ioacrocomcontent.combehance.netgraph.microsoft.comadobecontent.ioadobesign.comadobesignstage.comadobesignpreview.comgeo2.adobe.comZQRJE8R8R?F@9R9RK9R`;R;R;RME;Rp;R;R:R0-KRRp9R@0QR9R{JTRPTR@URURJ0WRWR ARR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@@Z`J07R:ROperation not allowed on Read only primitive objects|ZIE@EГESOFTWARE\Adobe\AcroPerfbLaunchTimingSOFTWARE\Adobe\AcroPerftOutputDirRB\AcroCEF_TimeInfo.logw+%lf %s ClientRenderer.FocusedNodeChangedZG ZGZL@LZIK(ZJPJJJOKOK@SK PKJtZNNNNxJZJPJOKpOKOKOK@SK PKRKZHK ZJKSKNK`NKHK Z0IK@@tKuKYA0xK0ZA`ZA0[AuKwK^A@t@^AlZIK@@tKuKYA0xK0ZA`ZA0[AuKwK^A@t@^AtZHKȖZHK` Z`IK`~@p~@nKpnK`mKPlKPpKoKkKjK`jKpiK qK0123456789-+Ee0123456789ABCDEFabcdef-+Xx0123456789ABCDEFabcdef-+XxPpClientRenderer.FocusedNodeChangedZ`KN%Y-%m-%d.%XЛZKKFuzz Test: Request id: Delivery ErrorUser ContentResponse: Error code: --------------------------------------------------- Unexpected request content!!{"foo":"bar"}Failed to send request: id=MessageFuzzerSent requests: Response received: Tests run on: ----------------------------------------------------ZEE@EГEClientRenderer.FocusedNodeChanged  ! {7d a P ' p   cep-pluginshZEPEEcallZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KdZ@K07R:RxZPKNdZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KĞZ@K07R:R؞ZPKKZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KLZ@K07R:R`ZPKPKtZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KԟZ@K07R:RZPKKZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0K\Z@K07R:RpZPK`KZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KZ@K07R:RZPKpK ZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KlZ@K07R:RZPKKZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KZ@K07R:RZPKKZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0K|Z@K07R:RZPKKZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KtZ@K07R:RZPKLZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KZ@K07R:RZPK0L$ZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KZ@K07R:RZPKLZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0K Z@K07R:R ZPKL4ZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KZ@K07R:RZPKpLZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KZ@K07R:R0ZPKLDZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KZ@K07R:RZPK`L̦ZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0K,Z@K07R:R@ZPKLTZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0KZ@K07R:RȧZPKpLܧZQRKE8R8R?F@9R9R K9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWRJRR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@0K { viewerObj.scrollCompleted([{ requestIndex: scrollToID }]); }); }); }} }]); }); } else { $('html').animate({ scrollTop: $(element).offset().top }, 10, function() { AdbeDx.appApi.viewerUIApi().then((viewerObj) => { viewerObj.scrollCompleted([{ requestIndex: '); if (element === null || !$(element).is(':visible')) { AdbeDx.appApi.viewerUIApi().then((viewerObj) => { viewerObj.scrollCompleted([{ requestIndex: '); if (element === null || !$(element).is(':visible')) element = document.getElementById('if (!(typeof(AdbeDx) !== 'undefined' && AdbeDx.hasOwnProperty('OverviewLayoutManager') && AdbeDx.OverviewLayoutManager.getLayout() == 2)) { var element = document.getElementById('viewMouseMoveEventviewMouseWheelEventviewSetFocusEventviewCaptureLostEventviewDragEnterEventviewDragWithinEventviewDragLeaveEventviewDropEventviewImeConfirmEventviewImeSetEventviewImeCancelEventtouchEventSelectAllEventDeselectAllEvent if ( document.selection ) { document.selection.empty(); } else if (window.getSelection) { window.getSelection().removeAllRanges(); }handleNetworkRequestsetAuthCredentialsremoveSharedMemoryCopyEventPasteEventRedoEventUndoEventCutEventauthCredentialspauseAllMedia var videoElements = document.getElementsByTagName("video"); for (var i = 0; i < videoElements.length; i++) { videoElements[i].pause(); } var audioElements = document.getElementsByTagName("audio"); for (var i = 0; i < audioElements.length; i++) { audioElements[i].pause(); }FileSelectedfilepathGetSpareRendererCrashCountSpareRendererCrashCountZLidradius_xradius_yxyZL`~@p~@{JwLpFtLxL zLvL4ZLZG"document.activeElement.value = "$('html, body').animate({scrollTop: '+=40'}, 200,'linear'); $('html, body').animate({scrollTop: '+=40'}, 30,'linear'); $('html, body').animate({scrollTop: '-=40'}, 200,'linear'); $('html, body').animate({scrollTop: '-=40'}, 30,'linear'); accDataBeginaccDataReceivedaccDataEndaccLocationChangedlogNetworkRequestsonLoadStartAcroCEF URL Request: Returning Status: urlRedirectedtoolTipSetpopupHiddenCefPopupCefOSRviewRectsInvalidatedfocusedElementChangedcompositionRangeChangedCefCrsrcursorChangedonTakeFocusbad conversionNtSetInformationFileNtQuerySystemInformationNtQueryObjectNtQuerySemaphoreNtQuerySectionNtOpenFileNtCloseNtQueryTimerResolutionQueryPerformanceCounterQueryPerformanceFrequencyntdll.dllkernel32.dll333333?@|ZL@@tKuKYA0xK0ZA`ZA0[AuKwK^A@t@^AZLBad boys, bad boys whatcha gonna do?Whatcha gonna do when they come for you?Bad boys, bad boys whatcha gonna do?Whatcha gonna do when they come for you ?When you were eight and you had bad traitsYou go to school and learn the golden ruleSo why are you acting like a bloody fool?If you get hot, you must get cool ZLN{JPLL`L@L@LpLPLJXZ0LpQ{JPLL`L@L@LpLPLЍQ@QZL@L{JPLL`L@L@LpLPLЍQ`LExtraBytesInStreamInvalidIdFuzzToFieldFuzzFromFieldInvalidContentTypeFuzzCustomFieldFuzzContentFuzzHeader  ! {7d a P ' p     ! {7d a P ' p   image/bmpindex.htmlstatic.js  ! {7d a P ' p   com.adobe.reader.rna.cef\\.\pipe\NamedPipeServer  ! {7d a P ' p   UR_FLAG_SKIP_CACHEUR_FLAG_ONLY_FROM_CACHEUR_FLAG_DISABLE_CACHEUR_FLAG_ALLOW_STORED_CREDENTIALSUR_FLAG_REPORT_UPLOAD_PROGRESSUR_FLAG_NO_DOWNLOAD_DATAUR_FLAG_NO_RETRY_ON_5XXUR_FLAG_STOP_ON_REDIRECTPostDataProcessed  ! {7d a P ' p   Z'MP$M`'MJJ@LZzJ'MpJ0J$MlprivateCache-Controlno-cacheno-storemust-revalidatemax-age=0proxy-revalidates-maxage=0ExpiresPragmaVary`Z0.M-M.M,M,M-MZzJ.MpJ0J,MFT::RNA::AcroCef::Browser::FileLoad::demdex.netechosignpreview.comdocumentspreview.adobe.com  ! {7d a P ' p   ZNNNNNZNNNNxJ$Z@@MDM>M=M NAN@AN0>N=N BN0ZM`~@p~@NENp0NN2NZ0M`~@p~@`NEN0NZ`IK`~@p~@@2NN^A0Z`IK`~@p~@pNNZ`IK`~@p~@@5Np6NZЎM`~@p~@NENp0NN2N 2NKP2N1NZЎM`~@p~@NENp0NN2N 2NKP2N1NxZЎM`~@p~@NENp0NN2N 2NKP2N1NZ M`~@p~@@J-N'N.NP,N/N@NZ`IK`~@p~@ N0 N0 N0 NN@N` N N@ NPNNZ`IK`~@p~@;N9N8N;N`;NP8N7N@(MY?0MY@8MYA@MYCHMYDPMYFXMYG`MYIhMYJpMYKxMYNMYOMYPMYVMYWMYZMYeMYVMYMYMYMYMYMYNY NY NY $NY 0NY 4PY?@PY@LPYAXPYCdPYD|PYEPYFPYGPYIPYJPYKPYLPYNPYOPYPPYRQYV QYWQYZ(QYe8QYkHQYlXQYdQYpQY|QYQY QY QY QYQYQYQYQYQYRY, RY;$RY>0RYCYY`MY7YYLY YYN MY/YYthLYYYYYZLY YYOLY(YYjLYZYaLYZYP LYZY(ZYQ(LY4ZYRMY-@ZYr0MY1LZYxxMY:XZY0LYdZYSMY?pZY8MY2ZYyLY%ZYgLY$ZYfZYMY+ZYmZYMY=ZYMY;ZY(MY0ZYZYwZYu[YU8LY[Y[YT([Y@LY4[YXMY6@[Y~HLYL[YVPLYX[YWd[Yp[Y[Y[YXLY[YX`LY[YYMY<[Y[Y[Yv[YpLY[Y[LY"[Yd\Y\Y \Y0\Y@\YP\YxLY`\Y\UYl\Y\Y\Y\YLY\Y\Y]@MY3\YzMY@\YhMY8]YpMY9 ]YLY]Y^$]YnLY0]Y_PMY5<]Y|LY H]YbLYT]Y`HMY4`]Yx]Y{LY']Yi]Yo]Y]Y]Y]Y]Y]Y]YF^Yparbgcazh-CHScsdadeelenesfifrhehuisitjakonlnoplptroruhrsksqsvthtruridukbesletlvltfavihyazeumkafkafohimskkkyswuzttpagutateknmrsamnglkoksyrdivar-SAbg-BGca-ESzh-TWcs-CZda-DKde-DEel-GRen-USfi-FIfr-FRhe-ILhu-HUis-ISit-ITja-JPko-KRnl-NLnb-NOpl-PLpt-BRro-ROru-RUhr-HRsk-SKsq-ALsv-SEth-THtr-TRur-PKid-IDuk-UAbe-BYsl-SIet-EElv-LVlt-LTfa-IRvi-VNhy-AMaz-AZ-Latneu-ESmk-MKtn-ZAxh-ZAzu-ZAaf-ZAka-GEfo-FOhi-INmt-MTse-NOms-MYkk-KZky-KGsw-KEuz-UZ-Latntt-RUbn-INpa-INgu-INta-INte-INkn-INml-INmr-INsa-INmn-MNcy-GBgl-ESkok-INsyr-SYdiv-MVquz-BOns-ZAmi-NZar-IQzh-CNde-CHen-GBes-MXfr-BEit-CHnl-BEnn-NOpt-PTsr-SP-Latnsv-FIaz-AZ-Cyrlse-SEms-BNuz-UZ-Cyrlquz-ECar-EGzh-HKde-ATen-AUes-ESfr-CAsr-SP-Cyrlse-FIquz-PEar-LYzh-SGde-LUen-CAes-GTfr-CHhr-BAsmj-NOar-DZzh-MOde-LIen-NZes-CRfr-LUbs-BA-Latnsmj-SEar-MAen-IEes-PAfr-MCsr-BA-Latnsma-NOar-TNen-ZAes-DOsr-BA-Cyrlsma-SEar-OMen-JMes-VEsms-FIar-YEen-CBes-COsmn-FIar-SYen-BZes-PEar-JOen-TTes-ARar-LBen-ZWes-ECar-KWen-PHes-CLar-AEes-UYar-BHes-PYar-QAes-BOes-SVes-HNes-NIes-PRzh-CHTsraf-zaar-aear-bhar-dzar-egar-iqar-joar-kwar-lbar-lyar-maar-omar-qaar-saar-syar-tnar-yeaz-az-cyrlaz-az-latnbe-bybg-bgbn-inbs-ba-latnca-escs-czcy-gbda-dkde-atde-chde-dede-lide-ludiv-mvel-gren-auen-bzen-caen-cben-gben-ieen-jmen-nzen-phen-tten-usen-zaen-zwes-ares-boes-cles-coes-cres-does-eces-eses-gtes-hnes-mxes-nies-paes-pees-pres-pyes-sves-uyes-veet-eeeu-esfa-irfi-fifo-fofr-befr-cafr-chfr-frfr-lufr-mcgl-esgu-inhe-ilhi-inhr-bahr-hrhu-huhy-amid-idis-isit-chit-itja-jpka-gekk-kzkn-inko-krkok-inky-kglt-ltlv-lvmi-nzmk-mkml-inmn-mnmr-inms-bnms-mymt-mtnb-nonl-benl-nlnn-nons-zapa-inpl-plpt-brpt-ptquz-boquz-ecquz-pero-roru-rusa-inse-fise-nose-sesk-sksl-sisma-nosma-sesmj-nosmj-sesmn-fisms-fisq-alsr-ba-cyrlsr-ba-latnsr-sp-cyrlsr-sp-latnsv-fisv-sesw-kesyr-syta-inte-inth-thtn-zatr-trtt-ruuk-uaur-pkuz-uz-cyrluz-uz-latnvi-vnxh-zazh-chszh-chtzh-cnzh-hkzh-mozh-sgzh-twzu-zaapi-ms-win-core-synch-l1-2-0.dllZpN2][v,VDV u?A^H^NZ QMPNEDZ QMPNEAccess violation - no RTTI data!Bad dynamic_cast!Z QMPNEbad exception cY,cY4cY@cY LcY XcY dcY tcY cYcY cY cYcY cY cY cVcYcYVcYcYcYcYcYcYcYdY(XdYdY;Y dYVdYVdYdYdY dY$dY(dY,dY0dY4dY8dY><<!==!=[]operator->++--+->*%<<=>>=,()~^|&&||*=+=-=/=%=>>=<<=&=|=^=`vftable'`vbtable'`vcall'`typeof'`local static guard'`string'`vbase destructor'`vector deleting destructor'`default constructor closure'`scalar deleting destructor'`vector constructor iterator'`vector destructor iterator'`vector vbase constructor iterator'`virtual displacement map'`eh vector constructor iterator'`eh vector destructor iterator'`eh vector vbase constructor iterator'`copy constructor closure'`udt returning'`EH`RTTI`local vftable'`local vftable constructor closure' new[] delete[]`omni callsig'`placement delete closure'`placement delete[] closure'`managed vector constructor iterator'`managed vector destructor iterator'`eh vector copy constructor iterator'`eh vector vbase copy constructor iterator'`dynamic initializer for '`dynamic atexit destructor for '`vector copy constructor iterator'`vector vbase copy constructor iterator'`managed vector copy constructor iterator'`local static thread guard'operator "" operator co_awaitoperator<=> Type Descriptor' Base Class Descriptor at ( Base Class Array' Class Hierarchy Descriptor' Complete Object Locator'`anonymous namespace'8iYtiYiYapi-ms-win-core-fibers-l1-1-1api-ms-win-core-synch-l1-2-0kernel32api-ms-        ! 5A CPR S WY l m pr  )   Y* EEE50P( 8PX700WP `h````xpxxxxEEE00P('8PW700PP (`h`hhhxwpwpp(null)(null)??/mscoree.dllCorExitProcessccsUTF-8UTF-16LEUNICODEccsUTF-8UTF-16LEUNICODE??330C??33Assertion failed: %Ts, file %Ts, line %d Microsoft Visual C++ Runtime LibraryAssertion failed!Program: File: Line: Expression: For information on how your program can cause an assertion failure, see the Visual C++ documentation on asserts(Press Retry to debug the application - JIT must be enabled)... <program name unknown>Visual C++ CRT: Not enough memory to complete call to strerror. Tc-^k@tFМ, a\)cd4҇f;lDِe,BbE"&'O@V$gmsmrd'c%{pk>_nj f29.EZ%qVJ.C|!@Ί Ą' |Ô%I@T̿aYܫ\ DgR)`*! VG6K]_܀ @َЀk#cd8L2WBJa"=UD~ $s%rс@b;zO]3AOmm!3VV%(w;I-G 8NhU]i<$qE}A'JnWb쪉"f37>,ެdNj5jVg@;*xh2kůid&_U JW {,Ji)Ǫv6 UړǚK%v t:H孎cY˗i&>r䴆["93uzKG-wn@  _l%Bɝ s|-Ciu+-,W@zbjUUYԾX1EL9MLy;-"m^8{yrvxyN\lo};obwQ4Y+XW߯_w[R/=OB R E]B.4o?nz(wKgg;ɭVl H[=J6RMq! EJjت|Lu<@rd 6x)Q9%0+L ;<(wXC=sF|bt!ۮ.P9B4Ҁy7P,=87MsgmQĢR:#שsDp:RRN/M׫ Ob{!@fu)/wdq=v/}fL3. iLs&`@< q!-7ڊ1BALlȸ|Rabڇ3ah𔽚j-6zƞ) ?IϦw#[/r5D¨N2Lɭ3v2!L.2>p6\BF8҇i>o@@w,=q/ cQrFZ**F΍$'#+GK ŎQ1VÎX/4Bycg6fvPbag ;s?.❲ac*&pa%¹u !,`j;҉s}`+i7$fnIoۍut^6n16B(Ȏy$dAՙ,C瀢.=k=yICyJ"pפldNnEtTWtøBncW[5laQۺNPqc+/ޝ"^̯p?m- }oi^,dH94X<H'W&|.ڋu;-Hm~$P  %-5 > H R ] i u -C Y p        %  d'@Bʚ;minkernel\crts\ucrt\inc\corecrt_internal_strtox.h__crt_strtox::floating_point_value::as_double_is_double__crt_strtox::floating_point_value::as_float!_is_doubleINFinfINITYinityNANnanSNAN)snan)IND)ind) ((((( H   !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~ ((((( H ( 0pow?am/pma/p : +%   OOKPLPpBpB@OO@@@O'P'P?P0@PpPpB PpBpOPOpBOOpB  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~YpFY5]pF(Y5]PO@@lNY|QYxNYMYYENUYENU8YENU\YENAtYNLBYENCYZHHYZHIYCHSYZHHܡYCHSYZHI(YCHTPYNLBlYENUYENAYENLȢYENCYENBYENIYENJ H R ] i u -C Y p        % 1#INF1#QNAN1#SNAN1#INDKYKYKYKYKYKYKYKY KY KY KY LY LYLYLY LY(LY0LY8LY@LYHLYPLYXLY`LYhLYpLYxLYLYLYLY LY!LY"LY#LY$LY%LY&LY'LY)LY*LY+LY,LY-LY/MY6MY7MY8MY9 MY>(MY?0MY@8MYA@MYCHMYDPMYFXMYG`MYIhMYJpMYKxMYNMYOMYPMYVMYWMYZMYeMYVMYMYMYMYMYMYNY NY NY $NY 0NY 4PY?@PY@LPYAXPYCdPYD|PYEPYFPYGPYIPYJPYKPYLPYNPYOPYPPYRQYV QYWQYZ(QYe8QYkHQYlXQYdQYpQY|QYQY QY QY QYQYQYQYQYQYRY, RY;$RY>0RYCYY`MY7YYLY YYN MY/YYthLYYYYYZLY YYOLY(YYjLYZYaLYZYP LYZY(ZYQ(LY4ZYRMY-@ZYr0MY1LZYxxMY:XZY0LYMY?pZYdZYS8MY2ZYyLY%ZYgLY$ZYfZYMY+ZYmZYMY=ZYMY;ZY(MY0ZYZYwZYu[YU8LY[Y[YT([Y@LY4[YXMY6@[Y~HLYL[YVPLYX[YWd[Yp[Y[Y[YXLY[YX`LY[YYMY<[Y[Y[Yv[YpLY[Y[LY"[Yd\Y\Y \Y0\Y@\YP\YxLY`\Y\UYl\Y\Y\Y\YLY\Y\Y]@MY3\YzMY@\YhMY8]YpMY9 ]YLY]Y^$]YnLY0]Y_PMY5<]Y|LY H]YbLYT]Y`HMY4`]Yx]Y{LY']Yi]Yo]Y]Y]Y]Y]Y]Y]YF^YpCONOUT$????????????B?B???r?r?????N?N?????B?B?????H?H?????b?b???????F?F???????B?B???????V?V???????z?z?F?F?????????R?R?$?$???????t?t?J?J? ? ?????????\?\?6?6???????????b?b?B?B? ? ???m?Lyc>=*p%??C;0=|?Ix"<=`` ә?yM==orO?+C==v?R1=PQ ?Ӏb=@P?5M[g?=V?d+[7=?nB>= kz*?w#8=0nط?C#7={?D i00=ˮf?j -=x)?}z= ? 0$=HV?o=X a?;M_8=@? 5=?^@'=L$?/r(==ɥ%?Nl,"=@\r??t8=85R?ӇӜ=L. ? >)g=Ը3U?Ӱ== ?hXg+=og?X=ذ0?{fHn=<w?y5s3R6=)?a8< O4W?4bV0=L?4@=@?Xۓ4=Tk?>_(=?*o=@[c?,=$4b?dO"=lx?#608=ě&m*?ɉh"0=בl?n6ѯ{<9[P?cezb<$?F 8"=8B.?0gǓW.=@Mu{<`w>,g5RҌ<2ؼcnQU ZsniŠ#4<Xq?BJ=_D?mKF=Ԛ?s7E=@[-?K>d:=g?Z}=\uI=s~Q?g:"(N='?9~$O1=q?n1%=p)k?vʌ=`X:?q.W =Pi?g>M=[?ֲa M=_3?֍,uXO=`Ɏ/?1w<=>'eH?` JJ=x~? Š&=n`Y?˖C=0?]/=# g?uP= ?,lC=5q?ᕎ =@Dӳ?-[@=pt4z? فpnJ=l?i.Eg<y~??O^'=(Tt? x;;=P?RRF=&?XɣN=J@?~=Ht=c?AzU"=nB?U_lj7=]?qBD= h0"ؿ؍ IQn0ؿHn&E:׿E7D57A׿ %@@ֿ*Z+ASTֿrJD@ӑտNT?w3kտr19]ԿFKm8C!`Կ1y2Y@ Կ*(FEO5iѿ4Q!?: пC +pڌXпxO,C"пAri<q~_ϿR v== ~οo6@mPͿ d+>̿9Ȓ[\˿8B'&˿i[JZOʿbnEDE}ɿUgc@H ȿUZdL" ǿ=Dj!ǿVm:A@`3ƿ~%3kcſ"7M Ŀp>)%ÿ\Bjx¿#6HˆQ;`t-¿=]PH0;TaָE&a-#KV\ Vb4M@U@Xx55@캿D=iI^Gי'7AԷUNҪ1GƴO\C@+Bg:IB@Zu}M:(T!1n]vQ<)8h׾o$|f+x2S74U".mœFB*6IKS_ D 5M-Cz1}BKG c?OfFL,sX4I+xm w$VcE?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@?@??????????????????????@????@?? ? ?@ ? ? ? ?@ ? ? ? ?@ ? ? ? ?@ ? ? ? ?@ ? ???@????@????@????@????@????@????@????@????@??|)P!?Ua0 !=+34?2Q =`??7; WJ=`7E?'a%C=MkK?*b<=0ɘP?*,z?=d|S?KT'K=R_V?bF=p^BY?E&= 9&\?߇N9=p _?߭Eb2]A=`?f#I=hb?O2H`3=c?e2a1=ԆLe?2RM=f?A3_:=@0h?[2ieO=i?1rK=k?Σ-=l?̈[8=yQm?>|W8A=՛ko?>qݲN=np?z m{ M=t)(q?m,SD=E`q?}e?=ԩr?}~:fE=PSs?&A=& t?,&8=tt?eѴN@=PSu?^p?o40=!9v?W?N=<v?+#GYM=Hw?qC@=Pex?0 &ے=Xy?8=<8y?!({=H= z?d,GB=6K{?ҝE M=¾|?w31!=L|?^X-F=Dfqsg~7(7s6uE(ruv.E,t]rLvOrȚ p&qC"5FzIqoOjpO|Wp Ȯ/N#D5pO/3N^o I!` 1nDCE"Bnu ^!EWΉm--0lNpCP&`l™J$akN8xj[ -=8Riy~ La8i[٬zF+ghk<@8KHg}7ڒ%gmg1&3{4WfI8e}OA8ӌd_\MP4.dó6D@uc2I{bTWB`b.r}X]La6MŞr<P`;ƥIpη_v<-UF^9M\̢N3e[ݻk>? #JY&-DPZXm4I@@7eWO/jUIlNAi0TWq uIbR|m:K@VNQ?|G¾d0`7O84 fXLzB7CIp4"%H`/G: WI`ȃ1D/!H@%OAA9"Ix'8RؔN;*2]@G?E?@D?C?A?@?>?@=?;?@:?8?7?6?4?3?1?@0?.?@-?+?*?)?'?&?$?@#?!?@ ???????@??@???? ? ? ?@ ??@???????@??@?????@??@??@?????@??@???????@??@???????@??@???????@??@???????@??@?????@??@??@?????@??@????????@????@????@???@????@???@????@???????@????@???@????@???????@??~?~?@}?|?|?@{?z?y?y?@x?w?v?@v?u?t?t?@s?r?q?q?@p?o?o?@n?m?l?l?@k?j?j?@i?h?g?g?@f?e?d?d?c?b?b?@a?`?_?_?@^?]?]?@\?[?Z?Z?@Y?X?W?W?V?U?U?@T?S?R?R?@Q?P?P?@O?N?M?M?@L?K?J?@J?I?H?H?@G?>Y"G=>.ܶlWE=>jۋbH=>^IL#=>(i&I=h>gݟP'E=p>*)D=>&N=x>.;ĝ@=H >Qyu3= >c-=@>Rݡ:==> {M= @>C=` >bߔB= >tdC=$ >9O=>B NC=>j&==>.<=@>`lrG=>!ls1= ?8= @? mN=&?UtQ$=X?PiB{^C=?Gv72=@?qlm+=?!.j7/=d?L C=`?m +=P ?5Od% =?r<(?*Hga2=@ ?CI=r ?sA=* ?GTiA= ` ?KՋD=r" ?Dp`q=L$ ?~G=4& ? D='@?E=)?'P<+?f4±cC=@?qWn{;=?gC i8=?XKD=P?G;R"=7?8΁3,'1D=B'@?:+NB=(?1z@J=*?3=+`?wU4?=,?DO=;.?$b=/p?g)([|X>=H1?>gV=20?OBO=*4?bPA<5?e4=f7@?|[{~*L=9?ٹE=t:?G]C='"?@(6F=? #?'A=@H#?43 A=Ax#?uN}*J=C#?)r7Yr7=]D#?.K="=rE$?r =F0$?3=1Z1=H`$?h|=G=gI$?ܩN:=J$?4e 6=K$?{<9==M%?uYPwH=NH%?-*8=Px%?yF.=-Q%?\9 ;,=R%?29Zd@=T&?~YK| =sU0&?WĻ(J=VX&?RIG=X&?W N=Y&?g'9=[&? D"^=2)$7bmLMӿ( ԏS4_ >L|/ dM4g±82qڜ1ןqaPCQo%;9?_0Cw4g%6L&M;k@ڿ81ABۏ1uB)_ Y/󓎣,:x.Ճ^-?ޯԝI-:]=O>O#w_jُBn(+E -V~|_B}_ACK!ܨY:_5Gt/C$>#Hm- MVn@QU^tA$OÄþiM@K8|;2@(AV64oꬠTC9?&u.~Fs:4Կ J_L II=@0(ן$.G?}3Rʏ3 !|.4*ڟ ඄}3? G"jm >; *O 0 :O 2K;޿ Q`4_  ZD 69* F_ T3ʢK M.֢> @_@? 1\hUXpM&Jx3Ҭx/h 78Lv]EV 3Bv9r_cM*5&Lq3?:R$@܎$=K'\?Ъ{b>$EvCIw8R'FG_j,)+jBD|_ `kA%'r BL TE_GO#i# ;^طH?6(`JJ\HB5``.11\?QDTӾ96оk< xE˾CqTR;ǾdG GgL@_h %? SS@b?Wdy>c*GPAiFC.ֿ?53=?͸)a,?][SqnC?nwtӰY?eus<)kp?&<ߑțuE?Ka<>?5a1xH<lX? aJ.?#Eq<1 ?1j<1Lp!?|眊<dD8`<;f?Ud4ݛ u? gVr/eT'?*mb|L%?2L#FG?AֈDh?ԛƟfNJ?:|”<۠*B?&KVU?An/X0y?c~˛=޶W?0 k8=ޮp? x9=>.ښ?pn5=Yح? Q*=c??b6=Y?T?=>?W!=@-32?Dz=p(?vP(=`?US?>=e?g7=`ŀ'?bͬ/=^s?}#=Jwk?zn=N ָ?LN9=@$"3?5Wg4p6=T?Nv$^)=&?.)<lB?M%=`j?w*= <śm?E2=ެ> ?E=t?? =OQ?w(@ <0?Ac 0=Pyp?dry?=St)?4K >=$?QhBC .=0 ub?-0=?a>-?=?Й,<(lX ?T@b ==P?3h,%=f??# =V ?ߠϡ6=Y?z $=G? $l35=@n?[+3=Rŷ?sdLi==p|?rx"#2=@.?|U2=lԝ?rF=a? 4=Y?sl׼#{ =`~R=?.i1=,? =vX?=p?h}s"= E[ ?%S#[k=7H?j=!V1?}a2=jq?20J5=?5=x¾/@?"B <1=iz?\-!y!=X0z?~b>==:? #.X'=HBO&?(~=xbb? .=Cq?y7i9+= v?:=0 ?2ض8=xPD?X1=??Q?Q?????????]?]?P?P? ? ?U?U?(?(?`?`?_?_?????z?z?1?1?p?p???(e?(e?@#?@#???`?`?hk?hk?,?,?x?x?????N?N?x?x?p?p???~?~?HN?HN???????p?p?Xi?Xi???????????8?8?s?s?pI?pI?&?&?????o?o? *? *???`?`?Z?Z???0?0???PY?PY???`?`???pm?pm?/?/????? OsCůNtQueryInformationProcessZQNNNN(Z0Q`QQQ@Qhttps://acrobat.adobe.com/us/en/landing/acrobat-pro-in-app.html?btn-url=https://rna-resource.acrobat.com/ob_preview/UpgradeToAcrobathttps://stage.acrobat.adobe.com/us/en/landing/acrobat-pro-in-app.html?btn-url=https://rna-resource.acrobat.com/ob_preview/UpgradeToAcrobat\\\"\/\b\f\n\r\tsetvectormap]""[container "^""[object null]"null{":}[]abcdefghijklmonopqrstuvwxyz0123456789ABCDEFGHIJKLMONOPQRSTUVWXYZ_rdr__ttsrccattZ8QE@EГEXZLQNZLQLQDZpLQMQ{JProxy object acquired for write by thread %d. Proxy object acquired for read by thread %d. Thread %d releasing Proxy object acquired for write. Thread %d releasing Proxy object acquired for read. lZXQPQ{Jlist too longZpQJJJZ0{QNNLZzQNZzQzQZ{Q{QpB@|QpBp|Q,Z0{QQ0Q\??\pipe\GetNamedPipeClientProcessIdS:(ML;;NW;;;LW)xZQQpB@pB@QZ@QpQ{JPLL`L@L@LpLPLJbhjklmquZNQ@QQ@t\Z0QQ@QQ@Z@QQ@pBQpQZQQ@pBQ@@ZQ`Q@pBQQZQQ@`RQ@ZQ0Q@pBQQ$ZPQQ@pBQRpZ@QQ0 RpBQ@ RZ0QpQ@pBpQRZpQQ@pBQRTZQQ@pBQRZPQQ@pBQ RZ QQ@!RpQ@8ZQQ@ "R0Q@ZQ0Q@pBPQ #RZ`QQ@#RQ@ZpQ0Q@pBQQhZ`QQ@0$RQ@ZQQ@$RpQ@ZQQ@%R0Q@LZQ0Q@pBPQQZIE@EГEZIE@EГE0ZIE@EГE|ZIE@EГEZIE@EГEZIE@EГE`ZIE@EГEZIE@EГEZIE@EГEDZIE@EГEZIE@EГEZIE@EГE(ZIE@EГEtZIE@EГEZIE@EГE ZIE@EГEXZIE@EГEZIE@EГEZIE@EГERZ ?RZP?R(ZCRZP?RZDR@Z`HRZQRJE8R8R?F@9R9RpF9R`;R;R;RME;Rp;R;R:R ;RRRp9R@0QR9R{JTRPTR@URURJ0WRWR ARR^A ATRPRPRVRpVRVRJVRPR0TRRRTRVRTRSR0SRQR@@@@^A@@@@^A^AQR AB@@Z`J07R:RInvalid Object Accessor in AppModelObjectBase::AppModelObjectBase()Invalid property provided in AppModelObjectBase::ensureValidPropParams()Property cannot be added to app model object in AppModelObjectBase::registerPropertyZSRException occured while registering property in AppModelObjectBase::registerProperty()4ZPRE@EГEZWRNP\R[R\R\R\R@[R F0eRFF]RcRbR@H?H dRaGcG F0eRFF^R |G}G FFgRZoRZA p[NNNN`3T([3TNNNNNNNNNNNN[P4T[03T[3TIT@J`GTVTPWTVT7TT8TpBN[2TTTGTT[0TKUT@WT2TTTPT@7TTd[2T@TGT[0TKUT@WT3TTPQT[T7TTeventObjectppVirtualProcessorRoots[NNNNNhT|[ENpTNNiTNNNNNNoToToToTpTN[ QMPNE\[{TT[`{TTNp[0{TTЁT[{T3Z 4Z4Z,4ZL4Zd4Zx4Z4Z4Z4Z4ZSchedulerKindMaxConcurrencyMinConcurrencyTargetOversubscriptionFactorLocalContextCacheSizeContextStackSizeContextPrioritySchedulingProtocolDynamicProgressFeedbackWinRTInitializationMaxPolicyElementKey[PT`d@ TЋTMbp?333333?[@T@T0TTPTT`TTT`TpContextpExecutionResourcecombase.dll[pd@0 U UTpT U[NNNNNШT@[@TTNN`;@@TNNNT [@TPTTT`;@TPTTЫTTM;Mq҄Y/}JrLp>B~md* 1G |RakC`Si,'WPEViqN~Z@ _'/vN~D0/ y_RIc^['[yDd3=IFMFk1eaB@1_M׷\f]FFT4HyIadvapi32.dllRegisterTraceGuidsWUnregisterTraceGuidsTraceEventGetTraceLoggerHandleGetTraceEnableLevelGetTraceEnableFlags[TpFpF`TPTTTTT (08@HPX`hpx 0@P`p @` @`@@@@ [NNNNN[?FTTTTTTT@[pTTpTT`TTT TpTT@TToToToToTpTNpThreadProxy[ TNNN[0TKUT@WT2TTNPTNTproc`TpT0TTT`TTTT0TToToToToTpTpF[NNNNNNNP[?FTTTTTTT@TTpTT`TpTT TpTT@TToToToToTpTJTTTTBB|[TIT@JTVTPWTVT7TT8TpB`T[`d@@UPU0Uf@NNNUN,[`d@@UPU0Uf@UUU0UPUswitchState[pd@NNNP UN[$UpFpF`TPTTTTTunknownfunctionprimitive[5U4Up1UГE,[@@0UГEx[@@1UГEsqrt}{`K4&}{` 4&}{` 5'9[9[^V0=]$=Z4=Z<=Z=]@$=Z=]l=Z|=Z=Z<=Z=]@l=Z`=]=Z=Z=Z=Z<=Z`=]@=Z=]>Z>Z >Z=]@>Z(>]P>Z`>Zl>Z>Z(>]@P>Z\>]@>Z>Z>Z\>]@>Z|>]>Z>Z ?Z(?Z`?Z|>]@>Z>]@D?ZT?Z(?Z`?Z>]@|?Z?Z?Z>]@|?Z>]D?Z>]?Z?Z?Z>]@?Z@Z$@Z?]@ @Z(?]T@Zd@Zl@Z(?]@T@ZP?]@Z@Z@Z$@ZP?]@@Zh?]@Z@ZAZl@Z$AZh?]@@Z>]@?Zh?]@Z?]hAZxAZAZ<=Z?]@hAZ?]AZAZAZAZ<=Z?]@AZ?]BZBZBZ?]@BZHBZPBZ?]@8BZ@]BZBZBZ@]@BZ(@]BZBZBZPBZ(@]@BZ`@]CZ$CZ0CZPBZ`@]@CZ@]`CZpCZ|CZPBZ@]@`CZ0A]CZCZCZPBZ0A]@CZ`B]CZDZDZPBZ`B]@CZB]DDZTDZ`DZ<=ZB]@DDZDZDZB]@|DZC]DZDZDZEZDZC]@DZ8C]@EZ,EZEZDZ`C]LEZ\EZdEZ`C]@LEZC]EZEZEZdEZC]@EZEZEZE]@EZE]FZ$FZ8FZTFZFZEZE]@FZE]@pFZFZTFZFZEZPF]@FZFZFZEZE]pFZPF]FZF]GZGZ(GZDGZGZEZF]@GZF]@`GZpGZDGZGZEZ(G]@GZGZGZEZF]`GZ(G]GZtG]GZHZHZ4HZpHZEZtG]@GZG]@PHZ`HZ4HZpHZEZH]@HZHZpHZEZG]PHZH]HZLH]HZHZIZ$IZ`IZEZLH]@HZH]@@IZPIZ$IZ`IZEZH]@|IZIZ`IZEZH]@IZH]|IZ,I]IZIZIZJZPJZEZ,I]@IZ`I]@0JZ@JZJZPJZEZI]@lJZ|JZPJZEZ`I]0JZI]lJZJ]JZJZJZKZ@KZEZJ]@JZ8J]@ KZ0KZKZ@KZEZJ]@\KZlKZ@KZEZ8J] KZJ]\KZJ]KZKZKZKZ0LZEZJ]@KZK]@LZ LZKZ0LZEZxK]@LLZ\LZ0LZEZK]LZxK]LLZK]LZLZLZLZ MZEZK]@LZL]@MZMZLZ MZEZhL]@]@@?ZX]D@\Z]L@|Zȡ]T@Z$]\@Zd]d@Z]Z]Z]Z ]Z(]Z0]Z8]Z@]ZD]ZL]ZT]Z\]Zd]ZT]Zآ]ZZ(ZZZTZDZآ]@Zu]8@Z8آ]Z]ZZZZ`Z]@Z]Z4]ZZZĺZ}ZlZkZPlZ4]@Zp]HZXZ`Zp]@HZ]ZZZZZZ ZF>a>|>>>?B?e???hAAAAB)BLBgBBBBB C:CnCCCC D/DRDuDDDDDEWE~EEEF+FRFzFFFF'GXGGGGGHLHyHHHI6I]IIIII JGJbJ}JJJJJKK:K]KKKKK"LmLLL0MqMMM4NuNNN8OyOOOeڔ0iĕߕ%Z1_ Xy/o@fÚ8mś .Qʜ KnL}I u4أCȤ*u֥Fl٦kQ֨$Gǩw&j5XԬ$IlۭI]±Fy. _ڶ .`ѷ'i"bȹ&Q|)fɻL޼ X˽/r߾Gr!QyCxL U)^2`Bz> Q)o+Yz;^/_"Jr 0h<b $Gm'Be"U%]-2Gjtj^0a&%/Gj.M}?+2w<`D[8[v Cj 2gpbk[!L=`#UZAln    )    H     E r    2 8m?|W @p2(K~D.o'Jm%]GC*ZuLL|F ~  !7!p!!"<"g""""-#[#~###E$y$$$$%D% &^&&&&&%'M'''(+(_(((()C)f))))*Q****+N++++,A,t,,,-_---..9.t....+/F/z////0P0001L111292T2o222223*3X33354444f5555 676d66666787c77778F8i8889<9q9999 :/:T::::t;;;)<]<x<<G===== >N>>>>?,?O??>@l@dCCDODDEZEEF=FFFFQGGGHIH}HHHI7IzIIIJJJ~JJJKNKKKKL8L[LLLLMCMwMMMNNNNN#OVOyOOOPcPPPPQ3QVQQQR=RRSEShSSST8TlTTTT*UWWLXXXYTYYYYBZZZ [T[o[[[\5\P\s\\\]E]]@^|^^^ _0_r__]`x````a?apaaa2bfbbbc6cjcccd:d"eVeeee&fZffffg4gggg$hIhdhhhhhciij)kkl*lulll0mmm'n\nnno`ooooKpppp0qyqqq3rhrrrs+sVsssst2tZtttu5uXu{uuuuvvv w6wQw|wwx\xxxxx y6yYyyyyy%zHzpzzzz{,{T{{{{{*|b||||;}a}}}}}*~U~x~~~~*Mp @tڀ 8kځ&aRSDSQD|fC+wD:\B\T\BuildResults\bin\Release\AcroCEF\RdrCEF.pdb(p.textp.text$di@.text$mnP:H.text$x .text$yd,.idata$5,.00cfg0.CRT$XCA4.CRT$XCAA8$.CRT$XCC\.CRT$XCLd.CRT$XCU.CRT$XCZ.CRT$XIA.CRT$XIAA.CRT$XIAC.CRT$XIC.CRT$XIZ.CRT$XLA.CRT$XLB .CRT$XLZ$.CRT$XPA(.CRT$XPB,.CRT$XPX4.CRT$XPXA8.CRT$XPZ<.CRT$XTA@.CRT$XTZD\<.gfidsTk.rdata<.rdata$T=.rdata$r.rdata$sxdata4.rdata$zzzdbg9.rtc$IAA9.rtc$IZZ9.rtc$TAA9.rtc$TZZ9.tls9.tls$9.tls$ZZZ9H.xdata:.xdata$x`.didat$2\ .didat$3|.didat$4.didat$6.didat$7(.didat$8@l.edatad.idata$2.idata$3$,.idata$4P.idata$6 `.data`=.data$r@TA.bss .didat$50 .rsrc$01 B"J.rsrc$02p;@F;@b@!a@@]@@@@-@@|@@0@@@@@@@@CC0@C C C@CCCCDԎD D֖DDDAD7DDDͦD =]4YEAAB:["U@;[;[@U @U@U#@U.@U6@U>@UF@UNN@UNV@U^@UNNNf@UNn@Uv@U~@U@U@U@UN@UNNNN@UN@U @U!@U"@U!@U$N$@U$N$@U$N!NNNNNN$@U$AU!NNNNNN!NNNNNN1 AU>AU>AU@@@)AU@N@4AU@N@?AUGGAUGN@N@RAU@]AU>N1N!NNNNNN"N" >[NN"8>[N"l>[NNN">[?UN">[;UN"?[P;U"U>U?U ?U?U>U"?[i=U"?[ >U>UN" @[NN"H@[U>U>U"XA[>U"A[};U;U;U;U"B["B[?U?U?UN?U]?U"B[~gU>gUNFgUNgU"z[{gUgUgUNgUgU" ({[gUgUgUNgUgUgUgUgU"{[2hU:hU:hUNBhUJhUwhUhU"{[hUhUhUN"{[PiU"<|[siU"h|[iU"|[iU"|[hUhU"|[p/E8}[D}[UFUNUVU ?]I ,[" t[<[ UUU'U2U:UBUJU ?]IĠ["Ԡ[[ ?]I[",[<[ֈUވUވUU"t["ܡ[ސUUUUU-U5U"[U"8["[ UUU*U5U@UMU ?]I ?]I ?]I" P[[[ Т[ [pUxUUUUUUUUU"["[;UHUHUaUnUnUUU U"P[U"[ ?]I["[Ф[!U)U)U1U"["p[UUUUUxUN"[UUN"̥[3U"[2U",[ ?]JX["[h[UUU ?]"JȦ["[ئ[UUU ?]J8["[H[̓UԓUܓU]UeUmU"[(U0U"["<[UUUUUUUUU"d[ ?]*I["[Ȩ[ ?]I["H[[UUUUƒUUUU"[sU{UU"[ ?].I[TUmU"[[ ?]cI`[ύU"[p[ ?]6I[ߑU"[Ъ["D[͎UՎUNݎUUUUU"|[ ?]J["[[VU^UfUnUnUvUljUωU׉U߉U"0[0U8U"t[[UgU"[UU"ܬ[gUsU"[UU"D[+U7U"x[_UkU"[UU"[UU"[ÊUϊU"H[cUoU"|[3U?U"[/U;U"[UU"[U U"L[ˌU׌U"[NjUӋU"[UU"["@[ UUU$U,U4UU"[fU"[@,J[U" [[qU"H["[UUU UU"[UUUNU"0[ UUNUN!U)UNN1UN9UNAU =]xnJ ["[[+UGURU]UhUsU~UUUUNUNΥU"`[UUN"[ޟUU"ȿ[" [^UfUnU{UUNNUUNNNN"[dUlUtU|UUU"[ڠUUUUUU" T[UUU UUU#U+U3U;U"[%U-U5U=UNEUNMUNUUN]UeUmUN""[UUU'U/U/U7U?U?UUGUNNNNOUUWUNU_UNgUNoUwUwUNUUNNNN"[\UdỤUlUtU|UUUUUU U N U N UU UNUģUNNNN"[UUUUUUUUUUȡUNСU ءUءUNUNNN"h[΢U֢UޢUUUUUUU U U U $U $U $U,UNNNN ?]oJ[;UCU",[[" [ΝU֝UޝUUUU UNUIU"[UUN"[UUU"D[UNNN"[aU"[UU"[U"$[U"P[@bJ|[UU"[[@HdJ[NU"[["p[˞UӞUNUUUNUNU U U NUN$U,U,UN4UNUFUNUVUaUlUNNNNNNNNNUU"h[AUIUTU_U"[U"[PU" [U"8[ѫU٫UUU"d[NU"[-UN"[N"["h[UUUUU"[sUUUUUɬUNªUʪUժU"["L[UU UUNUNNUUUU"[",[UUNNU#UNNNNNNNN+U>UFUQU\UgUoUwUNUUNUUNNNNNNNNNNN"x[xUUUUU"[UU4UMUUUDzUUU"[" L[UUUµUNʵU ҵU ڵUUN   NNNNN"p[4U?UGUOUWUNNNNN" [LUWU_UgUNoU wU  NNNNN"F[aUNiUNqUNyUNUNUNUNUNUNUNUNUNUNɳUNѳUNٳUNUNUNUNUNUN UNUNUN!UN)UN1UN9UNAUNIUNQUNYUNaUNiUNqUN-U"["`[UNUNUNUNUNƴUNδUNִUN޴UN UUU#U"[">X[nUyUUNNUUNUNUNUNUNUNǮUNϮUڮUUNUU U$UNNN=UVU oU NNNU%U&U&N%NNݯU+U,U,N+NN7U1UU2sU2N1NNU7U8ͰU8N7NNNUU"H[˭UӭU"|[5UAUN"[ݱU"[@J["([8[dU"p[&UN"[NҶUN"["0[UUUUNU"X[}UU"["[UUUUUкUUUUU UU N U U U U !UUUUU"l[AUIU"[lUtU"[NUVU^U"[UUUU"T[UUN"[JURUZU"[UU"[θUָU"D[UUU"x[UU"[SU"[BU^U"[@?KH["X[h[@]BK["[[@>K["@[[{UUUU"h["[0U8U@UHUNPUU"[ּU"[U"@[tU|UN"l["[UUUUN"[,U4UwU=wU<wU;wU:wU9wU8wU7wU6wU5wUHUIUJUKULUMUMNHN3NNUSUUUNUUUXUYUZUU\U]U^U U`U#Ub.U9UdDUeOUfWUgbUemUiuUjUUlUmUnUUpUUrUsUtUrUvUwUUyUz$U{/U|:UyNEUPU[UcUnUvU~UUNNUUUUUUUUUUUNNN UUNU(U3U>UIUTU_UjUuUUUUUUUNNNNUUUUUUUNNNUUUUN!U)U)UN1U9UNNNDUOUOUNZUeUpU{U{UNUUUUN" \UUNNNNNNUU"90\|UUUUUUUUUU U U NNUUUUUU(U3UNN;UFUQU\UgUrUNNNNzU"U#U$U%U&U'U(U(N#N#U,U-U.U/U0U0N#N"NNU6U7UU"\UUN"$\"\UUU'UN"\UFUNUVUN" \UUUUNNNNUU U NN"T\UUUUUN" \lUtUUUUUUUNU U U N" 4\U'U/U7UN?UXUqUyUU"|\0]VL0]tTL"!\\ \\6U>UIUQUNYUaUiUNqU yUNUUUNUUNUUUUUUUNUU0]5BL \"d\,\UUU UUU"U*U2UN:U BU JU N RUZU NbUN"0\UUUUUN"\UUUUU" \UUNUNUUNN"<\UUUUUUU UUUN%UNNU"U*U"\'U/U7U?U"\UU UN",\"\UUUUUN U+U6UUU wU U N NNUUNNNNN B] dLD\"\T\UUUU"#\UUUUUNUUU U UNUN#U+U3U;UCUNKUNSU[UcUkUNsUN{UUUNU!U"\pUxUUUUNUUNNNNNNUUN"\UU]UeUmUxUNUUUNU UNUNNUUNNNNNUUNN"\@UHUPUXU`UhUpUNxUUNUUN" \?UGUOUZUbUNNNUU" \U UUU" \ B]iL8!\"!\H!\U UUU" !\TU\UdUlUlUlUlUwUUN"H"\UUUUUbU"p"\@oL"\""\"\"#\NUUUU"d#\ U(UNNNNNNUN"#\U"#\WUN"$\@K8$\"H$\X$\4U"$\?U"$\@K$\"$\%\U"@%\/E%\%\`}[VLVZVVVNN":\";\VNVNVN VNVNVN#VN+VN3VN;VNCVNKVNSVN[VNcVN,V4VPV"<\"d<\=VEVPVXVXVNcVkVsVsV N {V V V VV VN VVNVVVN" =\VVN"P=\"=\vV~VVVVVNN@^OM=\"8>\>\qVyVVVVNNN NVV V NNNN<VDVN">\VV"?\V"8?\V"d?\ V"?\p/E?\ D[ V F V]VeV" K\(V0V"TK\"K\MVUV`VkVsV{VV"K\V"L\vNNNN`NnNMN`NQML\L\L\Qp\^)V",p\p\)V)V"hp\)V)V"p\ ?]Qp\"p\p\*V*V"(q\8*VD*V"\q\l*Vt*V"q\*V*V"q\*V"q\*V+V"$r\5+VA+V"Xr\,V,V"r\+V+V"r\+V+V"r\i+Vu+V"(s\\,Vd,Vl,V"\s\9,V"s\-V-V-V"s\,V"t\" Pt\,V,V-V-VN -V-V-VN,V"t\z-V"t\F-V"t\-V-V"u\ ?]\ R ?]\ R ?]\ R" u\u\pu\`u\ Pu\T.V\.Vd.Vl.V ?] R0v\"@v\Pv\ ?] Rv\"v\v\.V.V"v\.V.V"w\ ?]R ?]R"hw\w\Xw\Hw\/V/V"w\ ?]Rx\"x\(x\/V/V"`x\a/Vm/V"x\ ?][R ?][R"x\,y\x\x\ ?]2RTy\ 0V"xy\dy\/V"y\k0V0V"y\1V1V"z\" lz\q1Vy1Vy1VN1V1V1VN1V1V1V N0V0V"z\"${\/1V71V71VN?1V0V0V0V"L{\@R{\"{\{\80V@0VH0V ?]R{\"|\|\ ?]RP|\"`|\p|\ ?]f!R ?]f!R"|\ }\|\|\ ?]!R4}\"D}\T}\ ?]]"R}\"}\}\2V2V"}\ ?]#R~\"(~\8~\ ?]$Rp~\"~\~\ ?]_%R~\"~\~\ ?]%R \"0\@\s3V~3V"x\ C],R ?],R" \\ \ \3V4V 4V4V4V%4V-4V4V"p\\ C]0R ?]0R"\\"(\P4V`4Vm4Vm4V4VE3VM3V"P\ C]*R\"́\\3V3V3V3V" \4V 5V5V5VN5V'5V25V=5VH5V S5V^5V@@R\"\\@@R؂\5V5V"\\@BR@\\6V"d\P\6V"\'6V/6VN"̃\5V5V"\6V"<\@Y8V"\@DR\"̇\܇\8V8V8V8V"\@;PRX\9V9V"|\h\@QR\49V"\Ј\@UR \9V"D\0\:V"\ B]SR\9V"Љ\\B]TR \"\,\i9Va9V"d\8V8VN"\a8V"Ԋ\':VN"\ l]FoRD\"T\d\ ?]EsR \"\\:V:V;VNNN;V;V;V&;V .;V ;;V ;;VT;V T;V\;Vd;Vl;VNNN ?]uR\"\\;V;V;V;V;V:V:VNN"\o:V"`\Vq>Vy>Vq>Vy>V>V"\;>VC>V"H\=V"|\>V"\>V>V"ԑ\>V"\@ R4\"D\T\=V"\"Zܒ\/CVXCV@V@V@V@V@V@V@V@V@V@V@V@V@V@V@V@VAVAVAVAV'AV/AV7AV?AVGAVOAVWAV_AVgAVoAVwAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVAVBVBVBVBV'BV/BV7BV?BVGBVOBVWBV_BVgBVoBVwBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVBVCVCVCVCV'CVVHCVWPCVVN"Е\jDVrDVzDVDVNGDV"\" H\j?V?V?V?V?V?V?V?V?VN?V"Ė\?V?V?V@VNN.@V6@VNNNNNN"h\\@VNd@VNN"\DVDVDVDVDVNNDVDVDV DV DV DV DV EV EV" `\CVCVCVCVCVCVCVCVCVDV DV DVNCV"Ș\G?V"\@6R \"0\@\"\uEV}EVEVEVEVEVEV"\EVEVEVEVEVFV FVFVNVFNV"\ h\ ?]R l]R" \T\3PV;PVCPVNKPVSPVSPVN[PVsNV{NV"\~PVPV"8\ ?]|Rl\qOV"\|\ ?]ER̤\"\ܤ\NVNNVNNVNNVNOVN OVNOVNOVN ?]R\"\\NVNVNVNVN ?] R$\"l\4\>OVFOVNOVPV"\QVQVN"\PVPV"\OVOV"0\MVNV"d\MVMV"\^MVjMV"̧\*MV6MV"\LVMV"4\MVMV"h\ ?]BR\LV"\\OV PV"\OVOV"0\NQV"d\+QV"\" \XRV`RVmRVzRVRVRVRVRVRVRVRVNTVTV"@\SVSV"t\SVSV"\,SV8SV"ܪ\TV+TV"\RVSV"D\SVSV"x\STV_TV"\TVTV"\`SV"\qQV"@\QV"l\QVQV"\!RV"̬\TVTV"\"qP\WVOUVNWUVN_UVNgUVNoUVNwUVNUVNUVNUVNUVNUVNUVNUVNUVNUVNUVNUVNUVNUVNUVNUVNUVNUVNVVNVVNVVNVVN'VVN/VVN7VVN?VVNGVVNOVVNWVVN_VVNgVVNoVVNwVVNVVNVVNVVNVVNVVNVVNVVVVVVVVVVVVVVVVVVVVVVWVWVWV%WV0WV;WVFWVQWV\WVgWVrWV}WVWVUV"UVN"ذ\"8\XVXVYVXVYVt\ l]jS ?]pS"\`\+YVDYVLYV\ l]S ?]SgXVXV"\\ l]S l]3S ?]9S" Բ\\X\ h\XV,XV4XVjVFjV NjVVjV^jVNfjVNnjVNvjV~jVNNN(\ l]jS ?] jS"l\\hVhVhViV iViViV#iV+iV3iV;iVNCiVNKiVNSiV[iVNNN8\ l]zS ?]{S"|\$\DkVLkVTkV\kVdkVlkVtkV|kVkVkV kVkV kVkVkVNkVNkVNkVNkVkVNNNN\ l]uS ?]uS"\l\jVjVjVjVjVjVjVjVjV jVjVjVkVN kVNkVNkV!kVNNN\ l]9mS ?]?mS"\\~iViViViViViViViViViViVNiVNNNNbVbV"|\cVcV"\QcV]cV"\cV)cV"\cVcV"L\=eVIeV"\qeV}eV"\eVeV"\eVeV"\bV%bV"P\MbVYbV"\bVbV"\bVbV"\ fVfV" \AfVMfV"T\fVfV"\fVfV"\ufVfV"\cVcV"$\!dV-dV"X\ ?]IS\" \\aVaVaVaVaVaVaVaV"\ZaVeaV"H\,gV"|\7aV"\@DS\"\\aV",\lV"X\lV"\ J\,[`}[vVIvVWvVevV svV ]ET\" \0\lwV"h\vV"\wVwVwVwV"\&wV.wV"\xVxV"8\vV"l\vV"\QM\\ .         ~ f R @ .          v \ H .         P @ $       .DTbz,BRht0BRdt :Rjt*Hdpzv\@(rZH.\J6.v^J4|`RB2"zn`RB,xf~bPR8 ~l     $6DVl~"2DPh*:JZl  l & > R ~ l  VerSetConditionMaskGetCommandLineWCloseHandleaGetLastErrorGetProcessHeapMHeapSetInformationReleaseMutexCreateMutexWGetCurrentProcessxGetModuleHandleWGetProcAddressSetDllDirectoryWVerifyVersionInfoWGetSystemInfoGHeapCreateHHeapDestroyEHeapAllocIHeapFreeLHeapReAllocNHeapSizeuGetModuleHandleAGetCurrentThreadVirtualQueryExVirtualAllocEx^InitializeCriticalSectionCreateIoCompletionPortCreateEventWCreateThread2SetLastErrorResetEventGetQueuedCompletionStatus1EnterCriticalSectionLeaveCriticalSectionTerminateJobObjectSetEvent#PostQueuedCompletionStatusWaitForSingleObjectDeleteCriticalSection/SetInformationJobObjectGetCurrentThreadIdTerminateProcessGetUserDefaultLangIDGetUserDefaultLCIDGetUserDefaultLocaleNameSEnumSystemLocalesExGetTickCountGetVersionExWGetNativeSystemInfoLocalFreeGetCurrentProcessId/ProcessIdToSessionId}SleepIsDebuggerPresentbRaiseExceptionGetThreadId^SetThreadPriorityGetThreadPriority+DuplicateHandleNGetFileType.SetHandleInformationRegisterWaitForSingleObjectUnregisterWaitEx$AssignProcessToJobObjectWriteProcessMemoryCreateFileMappingWMapViewOfFileVirtualFreeGetProcessHandleCountGetProcessHeaps{SignalObjectAndWaitEGetFileAttributesWEQueryDosDeviceWnGetLongPathNameWCreateFileWVirtualProtectExvReadProcessMemoryGetCurrentDirectoryWtGetModuleFileNameWbGetLocalTimeOutputDebugStringAWriteFileFormatMessageALoadLibraryExWLoadLibraryWFreeLibraryReleaseSRWLockExclusiveVirtualFreeExCreateNamedPipeWCreateProcessWCreateRemoteThreadCreateJobObjectWUnmapViewOfFileFindResourceW|SizeofResourceLoadResourceLockResourceCreateDirectoryWsReadFileTlsGetValueTryAcquireSRWLockExclusiveAcquireSRWLockExclusiveGetSystemTimeAsFileTimeNQueryPerformanceFrequencyMQueryPerformanceCounterRQueryThreadCycleTimeVirtualAllocGetProcessTimesSearchPathW<lstrlenWDebugBreakwGetModuleHandleExW#SetFilePointerExLGetFileSizeExSetEndOfFileFlushFileBuffersuFindCloseFindNextFileW{FindFirstFileExWmSetUnhandledExceptionFilterRtlCaptureStackBackTraceTlsAllocTlsFreeTlsSetValueVirtualQueryWideCharToMultiByteK32QueryWorkingSetExSwitchToThreadKERNEL32.dllPCloseDesktopTCloseWindowStationGetProcessWindowStation{CreateWindowStationWGetThreadDesktopLSetProcessWindowStationeCreateDesktopWGetUserObjectInformationWUSER32.dll[RegCloseKeyRegOpenKeyExARegQueryValueExAInitializeSecurityDescriptorSetSecurityDescriptorDaclRevertToSelftRegDisablePredefinedCacheRegOpenKeyExWConvertStringSecurityDescriptorToSecurityDescriptorWbGetSecurityDescriptorSaclSetSecurityInfoConvertStringSidToSidWKGetLengthSidSetTokenInformationOpenProcessToken7GetAceSetKernelObjectSecurityJGetKernelObjectSecurityDuplicateTokenEx{ConvertSidToStringSidW#SystemFunction0364FreeSidImpersonateLoggedOnUserMapGenericMaskWGetNamedSecurityInfoWIsValidSidEqualSidAccessCheckCreateProcessAsUserWpGetTokenInformationSetThreadTokendRegCreateKeyExWRegQueryValueExWCreateRestrictedTokenDuplicateTokenLookupPrivilegeValueWCopySidCreateWellKnownSidInitializeSidlGetSidSubAuthoritycGetSecurityInfoSetEntriesInAclWmGetSidSubAuthorityCount!EventRegister#EventUnregister$EventWriteADVAPI32.dllCommandLineToArgvWXSHGetFolderPathWSHELL32.dllCoTaskMemFreeole32.dllVirtualProtectLoadLibraryExAdInitializeSRWLockReleaseSRWLockSharedAcquireSRWLockSharedFormatMessageWLocalAllocTerminateThreadCreateFileMappingAMapViewOfFileExOpenFileMappingA^ExitProcessMultiByteToWideCharGetStringTypeW-EncodePointer DecodePointer_InitializeCriticalSectionAndSpinCountCompareStringWLCMapStringWeGetLocaleInfoWGetCPInfoWaitForSingleObjectExIsProcessorFeaturePresentUnhandledExceptionFilterGetStartupInfoWcInitializeSListHeadRtlUnwindoInterlockedPushEntrySListlInterlockedFlushSListGetConsoleCPGetConsoleModeJSetStdHandleGetStdHandleWriteConsoleW!GetDateFormatW GetTimeFormatWIsValidLocaleTEnumSystemLocalesWpReadConsoleWGetTimeZoneInformationOutputDebugStringWIsValidCodePageGetACPGetOEMCPGetCommandLineA7GetEnvironmentStringsWFreeEnvironmentStringsWSetEnvironmentVariableWGetSystemMetrics{GetUserNameWRegOpenKeyAbSHGetKnownFolderPathsCancelSynchronousIoConnectNamedPipe"DisconnectNamedPiperCancelIoExCreateEventATryEnterCriticalSection9GetEnvironmentVariableWDeviceIoControl&GetWindowsDirectoryW#AreFileApisANSI=GetExitCodeThread_ExitThreadFreeLibraryAndExitThreadCreateTimerQueueiGetLogicalProcessorInformationCreateTimerQueueTimerxChangeTimerQueueTimerDeleteTimerQueueTimerGetNumaHighestNodeNumberGetProcessAffinityMaskSSetThreadAffinityMaskUnregisterWaitGetThreadTimesReleaseSemaphorenInterlockedPopEntrySListCQueryDepthSList4VBB`]BBlVVVVVVVV VVV+V9VBVLVXVjVoVwVVVVVVVVVVVVVVVVV+V4VEVIVSVZVhVrVxV~VVVVVVVVVVVVVVVVV VVV$V,V3V;VAVGVTV[V`VfVjVqV|VVVVVVVVVVVVVVVV VV,V=VMV[VaVqVzVVVVVVVVVVVVV WWW!W$W,W4W=WEWLWrWWWWW0WMWvWWWWW"WCWhWWWW W0WXW~WWWW@WYW{WWWWWW7WSWtWWWWWW:WgWWWWW$WGWjWWWWWWIWcWWWWW WA Wn W W W W W' WI W]0W8W(WW0jXP )QS]("?BZ %>g}./VNc7 !&,-2368LRI0e\ MU^f{dWC<Y*$#1XO`[F|yz~hDEGHLئXxXئXXئXXYYYYYY Y(Y@YXYtYY DN@u  \3]` ^` ^` ^` ^` ^` ^` ^` ^` ^`3]d ^d ^d ^d ^d ^d ^d ^3]..  $|YځY܁Y|Y5]5]5]5]5]3]XY؀YXYH4]7]C PSTPDTP6]6] abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`y!@~ڣ @ڣ AϢ[@~QQ^ _j21~T ZlyX$.Y@yX8 ZxXjXhyX+?+ȴ@+A+B+p+(q+@r+Xt+pu+v+w+x+еy+z+{+|+0}+H~+`+x++++ض+++ +8+P+h++++ȷ++++(+@+X+p++++и++++0+H,`,x,,,,ع , , , ,8 ,P,h,,,,Ⱥ,,,,(,@,X,p,,,,л,, ,!,0",H#,`$,x%,&,',(,ؼ),*,+, ,,8-,P.,h/,0,1,2,Ƚ3,4,5,6,(7,@8,X9,p:,;,<,=,о>,,,,0,H,`,x,,,,ؿ,,, ,8,P,h,,,,,,,,(,@.X.p/////D/G/H/0K/HL/`M/xN/O/P/Q/R/S/T/ U/8V/PW/hX/Y/Z/[/////(/@/X/p////////0/H/`/x/////// /8/P/h////////(/@/X/p////////0/H/`/x/////// /8/P/h////////(81@91XR5pS5OOOOOOO0OHO`OxOOOOOOO O8OPOhOOOOOOOO(O@FPXGPp_______`0`H```x````` ` ` `8 `P `h````````(`@`X`p``````` `0!`H"``#`x$`%`&`'`(`)`*` +`8,`P-`h.`/`0`1`2`3`4`5`(6`@7`X8`p9`:`;`<`=`>`?`@`0A`HB``C`x|`}`acccc c8cPchcccccccc(c@cXcpcccccccc0cHc`cxccccccc c8cPchccccllll(l@lXlpllllllll0lHl`lxllllllm m8mPmhmmmmm m m m( m@ mXmpmmmmmmmm0mHm`mxmmmmm#m$m %m8&mP'mh(m)m*m+m,m-m.m/m(0m@1mX2mp3m4m5m6m7mmmm0mHm`mxmmmmmmm m8mPmhmmmmmmmm(m@mXmpmmmmmmmm0mHm`mxmmmmmmm m8mPmhmmmmmmmm(m@mXmpmmmmmmmm0mHm`mxmmmmmmm m8mPmhnnnnnnnn(n@ nXnpnnnnnnnn0nHn`nxnnnnnnn n8nPnhnnnnnnnn(n@nXnpnnnnnnnn0nHn`nxnnnnnnn n8nPnhnnnnnooo(o@oXopooo ooooo0oHo`oxooooooo o8oP oh!o"o7o8o9o:o;ooX?op@oAoBoCoXoYoZo[o0\oH]o`^ox_o`oaobocodoeo fo8 {P {h{{ef|}~(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph   ( @ Xp0H`x$%36 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph ( @ X p        0 H ` x        8 P h           (  @  X p        0 H ` x      ! "# $8%P&h'(+,3489(=@>X?p@ABCDEFG0HHI`JxKLMQUVW X8YPZh[\]^_`ab(c@dXepfghijklm0pHq`rxs 8Ph(@Xp !"#0$H%`&x'()*+,- .8/P0h12345678(9@:X;p<=>?@ABC0DHE`FxHJKLMNO P8QPRhSTUVWXYZ([@\X]p^_`abcde0fHg`hxijklmno p8qPrhstuvwxyz({@|X}p~0H`x  8 P h       !(!@!X!p!!!!!!""0"H"`"x""""""# #8#P#h#######$($@$X$p$$$$$$%%0%H%`%x%%%%%%& &8&P&h&&&&&&&'('@'X'p''''''((0(H(`(x(((((() )8)P)h)))))))*(*@*X*p******++0+H+ `+ x+ + + +++, ,8,P,h,,,,,,,-(-@-X-p- -!-"-#-$-%.&.'0.(H.)`.*x.+.,.-.../.0/1 /28/3P/4h/5/6/7/8/9/:/;0<(0=@0>X0?p0@0A0B0C0D0E1F1G01HH1I`1Jx1K1L1M1N1O1P2Q 2R82SP2Th2U2V2W2X2Z2[2\3i(3j@3kX3lp3m3n3o3p3q3r4s4t04uH4v`4wx4x4y4z4{4|4}5~ 5 85 P5 h5 5 5 5 5 5 5 6 (6 @6 X6 p6 6 6 6 6 6 7 7 07 H7 `7 x7 7 7 7 7 7 8 8 88 P8 h8 8 8 8 8 8 8 9 (9 @9 X9 p9 9 9 9 9 9 : : 0: H: `: x: : : : : : ; ; 8; P; h; ; ; ; ; ; ; < (< @< X< p< < < < <<==0=H=`=x======> >8>P>h>>>>> >!>"?#(?$@?%X?<p?>???D?E?F?G@H@I0@JH@K`@Lx@M@N@O@P@Q@RAd Ae8AfPAghAhAiAjAkAlAmAnBo(Bp@BqXBrpBsBtBuBvBwBxCyCz0C{HC|`C}xC~CCCCCD D8DPDhDDDDDDDE(E@EXEpEEEEEEFF0FHF`FxFFFFFFG G8GPGhGGGGGGGH(H@HXHpHHHHHHII0IHI`IxIIIIIIJ J8JPJhJJJJJJJK(K@KXKpKKKKKKLL0LHL`LxLLLLLLM M8MPMhMMMMMMMN(N@NXNpNNNNNNOO0OHO`OhxOiOjOkOlOmOnPo Pp8PqPPrhPsPtPuPvPwPxPyQz(Q{@Q|XQ}pQ~QQQQQRR0RHR`RxRRRRRRS S8SPShSSSSSSST(T@TXTpTTTTTTUU0UHU`UxUUUUUUV V8VPVhVVVVVVVW(W@WXWpWWWWWWXX0XHX`XxXXXXXXY Y8YPYhYYYYYYYZ(Z@ZXZpZZZZZZ[[0[H[`[x[[[[[[\ \8\P\h\\\\\\\](]@] X] p] ] ] ]]]^^0^H^`^x^^^^^^_ _8_P_h_______`(`@`X`p``````aa0aHa`axaaaaaab b8bPbhbbbbbbbc(c@cXcpccccccdd0dHd`dxdddddde e8ePeheeeee e e f (f @fXfpffffffgg0gHg`gxgggggg h! h"8h#Ph$hh%h&h'h(h)h+h,i-(i.@i/Xi0pi1i2i3i4i5i6j9j:0j;Hj<`j=xj>j?j@jAjBjCkD kE8kFPkGhkHkIkJkKkLkMkNlO(lP@lQXlRplSlTlUlVlWlXmYmZ0m[Hm\`m]xm^m_m`mambmcnd ne8nfPnghnhninjnknlnmnnop(oq@orXospotouovowoxoypzp{0p~Hp`pxppppppq q8qPqhqqqqqqqr(r@rXrprrrrrrss0sHs`sxsssssst t8tPthtttttttu(u@uXupuuuuuuvv0vHv`vxvvvvvvw w8wPwhwwwwwwwx(x@xXxpxxxxxxyy0yHy`yxyyyyyyz z8zPz hz z z z zzz{({@{X{p{{{{ {!{"|#|'0|(H|)`|*x|+|,|-|.|3|4}5 }68}7P}8h}9}:};}<}=}>}?~@(~A@~BX~Cp~D~E~F~G~H~IJK0LHM`NxOPQRSTU V8WPXhYZ[\Ȁ]^_`(a@bXcpdefgЁhijk0lHm`nxopqr؂stu v8wPxhyz{|ȃ}~(@XpЄ0H`x؅ 8PhȆ(@XpЇ0H`x؈ 8Phȉ(@XpЊ0H`x؋ 8PhȌ(@XpЍ0H`x؎ 8Phȏ(@XpА   0 H `xؑ 8PhȒ (!@"X#p$%&'Г()*+0,H-`.x/012ؔ345 687P8h9:;>ȕ?@AB(C@DXEpFGHIЖJKLM0NHO`PxQRSTؗUVW X8YPZh[\]^Ș_`ab(c@dXepfghiЙjklm0nHo`pxqrstؚuvw x8yPzh{|}~ț(@XpМ0H`x؝ 8PhȞ(@XpП0H`xؠ 8Phȡ(@XpТ0H`xأ 8PhȤ(@XpХ0H`xئ 8Phȧ ( @ X p Ш0H`xة 8 P!h"#&'Ȫ()*+(,@-X.p/012Ы34590:H;`<x=>?@جABC D8EPFhGHIJȭKLMN(O@PXQpRSTUЮVWXY0ZH[`\x]^_`دabc d8ePfhghijȰklmn(o@pXqprstuбvwxy0zH{`|x}~ز 8Phȳ(@Xpд0H`xص 8Phȶ(@Xpз0H`xظ 8Phȹ(@Xpк0H`xػ 8Phȼ(@Xpн0H`xؾ 8 P h ȿ(@Xp0 H!`"x#$%&'() *8+P,h-./01234(5@6X7p89:@ABCD0EHI`JxKLMNOPQ R8SPThUVWY\]^_(`@aXbpcdefghij0kHl`mxnopqruv }8~Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp    0H`x 8Ph !"#$%&'((@)X*p+,-./01203H9`:x<=>ABCD E8HPIhJKLMNPRS(T@UXVpWXYZ[\]^0_H``axbcdfghj k8lPmhnopqrsxy(z@{X|p}~0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@ X p   0H`x 8Ph(@Xp0H`x      8Ph(+@,X-p./01234506H7`8x9:;<=>? @8APBhCDEFGHIJ(K@LXMpNOTUVWXY0ZH[`\x]^_`abc d8ePfhxyz{|(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp0H`x 8Ph(@Xp  0 H ` x 8Ph( @!X"p#$%&'(*+0,H'`'x''''''' '8'P'h '!'%'&'::::(;@;X;p;;;;;; ; ;0 ;H ;` ;x;;;;;;; ;8;P;h;;;;;;;;( ;@!;X";p#;$;%;&;';(;);*;0+;H,;`-;x.;/;0;1;2;3;7; 8;89;P:;h;;<;=;>;?;@;A;B;(C;@D;XE;pF;G;H;I;J;K; L; M;0 N;H O;` P;x Q; R; S; T; U; V; W; X;8 Y;P Z;h [; \; ]; ^; _; `; a; b;( c;@ d;X e;p f; g; h; i; j; k; l; m;0 n;H o;` p;x q; r; v; w; x; y; z; {;8 |;P };h ~; ; ; ; ; ; ;;(;@;X;p;;;;;;;;0;H;`;x;;;;;;; ;8;P;h;;;;;;;;(;@;X;p;;;;;;;;0;H;`;x;;;;;;; ;8;P;h;;;;;;;;(;@;X;p;;;;;;;;0;H;`;x;;;;;;; ;8;P;h;;;;;;;;(<@<X<p<<<< < < < <0 <H<`<x<<<<<<< <8<P<h<<<<<< <!<("<@#<X$<p%<&<'<(<)<*<+<,<0-<H.<`/<x0<1<2<3<4<5<6< 7<88<P9<h:<;<<<=<><B<F<G<(H<@I<XK<pL<M<O<P<Q<R<S<T<0U<HV<`W<xX<Y<Z<[<\<]<^< _<8`<Pa<hb<c<d<e<f<g<h< i<( j<@ k<X l<p m< n< o< p< q< r<!s<!t<0!u<H!v<`!w<x!x<!y<!z<!{<!|<!}<"~< "<8"<P"<h"<"<"<"<"<"<"<#<(#<@#<X#<p#<#<#<#<#<#<$<$<0$<H$<`$<x$<$<$<$<$<$<%< %<8%<P%<h%<%<%<%<%<%<%<&<(&<@&<X&<p&<&<&<&<&<&<'<'<0'<H'<`'<x'<'<'<'<'<'<(< (<8(<P(<h(<(<(<(<(<(<(<)<()<@)<X)<p)<)<)<)<)<)<*<*<0*<H*<`*<x*<*<*<*<*<*<+< +<8+<P+<h+<+<+<+<+<+<+<,<(,<@,<X,<p,<,<,<,<,=,=-=-=0-=H-=`-=x-=-=- =- =- =- =. = .=8.=P.=h.=.=.=.=.=.=.=/=(/=@/=X/=p/=/=/=/=/ =/!=0"=0#=00$=H0%=`0&=x0'=0(=0)=0*=0+=0,=1-= 1.=81/=P10=h11=12=13=14=15=16=17=28=(29=@2:=X2;=p2<=2==2>=2?=2@=2A=3B=3C=03D=H3E=`3F=x3G=3H=3I=3J=3K=3L=4M= 4N=84O=P4P=h4Q=4R=4S=4T=4U=4V=4W=5X=(5Y=@5Z=X5[=p5\=5]=5^=5_=5`=5a=6b=6c=06d=H6e=`6f=x6g=6h=6i=6j=6k=6l=7m= 7n=87o=P7p=h7q=7r=7s=7t=7u=7v=7w=8x=(8y=@8z=X8{=p8|=8}=8~=8=8=8=9=9=09=H9=`9=x9=9=9=9=9=9=:= :=8:=P:=h:=:=:=:=:=:=:=;=(;=@;=X;=p;=;=;=;=;=;=<=<=0<=H<=`<=x<=<=<=<=<=<=== ==8==P==h==============>=(>=@>=X>=p>=>=>=>=>=>=?=?=0?=H?=`?=x?=?=?=?=?=?=@= @=8@=P@=h@=@=@=@=@=@=@">A#>(A$>@A%>XA&>pA'>A(>A)>A*>A+>A,>B->B.>0B/>HB0>`B1>xB2>B3>B4>B5>B6>B7>C8> C9>8C:>PC;>hC<>C=>C>>C?>C@>CA>CB>DC>(DD>@DE>XDF>pDG>DH>DI>DJ>DK>DL>EM>EN>0EO>HEP>`EQ>xER>ES>ET>EU>EV>EW>FX> FY>8FZ>PF[>hF\>F]>F^>F_>F`>Fa>Ff>Gg>(Gl>@Gm>XGn>pGo>Gp>Gq>Gr>Gs>Gt>Hu>Hv>0Hw>HHx>`Hy>xHz>H{>H|>H}>H~>H>I> I>8I>PI>hI>I>I>I>I>I>I>J>(J>@J>XJ>pJ>J>J>J>J>J>K>K>0K>HK>`K>xK>K>K>K>K>K>L> L>8L>PL>hL>L>L>L>L>L>L>M>(M>@M>XM>pM>M>M,?M-?M.?M/?N0?N1?0N2?HN3?`N4?xN5?N6?N7?N8?N9?N:?O;? O?hO??O@?OA?OB?OC?OD?OE?PF?(PG?@PH?XPI?pPJ?PK?PL?PM?PN?PO?QP?QQ?0QR?HQS?`QT?xQU?QV?QW?QX?QY?QZ?R[? R\?8R]?PR^?hR_?R`?Ra?Rb?Rc?Rd?Re?Sf?(Sg?@Sh?XSi?pSj?Sk?Sl?Sm?Sn?So?Tp?Tq?0Tr?HTs?`Tt?xTu?Tv?Tw?Tx?Ty?Tz?U{? U|?8U}?PU~?hU?U?U?U?U?U?U?V?(V?@V?XV?pV?V?V?V?V?V?W?W?0W?HW?`W?xW?W?W?W?W?W?X? X?8X?PX?hX?X?X?X?X?X?X?Y?(Y?@Y?XY?pY?Y?Y?Y?Y?Y?Z?Z?0Z?HZ?`Z?xZ?Z?Z?Z?Z?Z?[? [?8[?P[?h[?[?[?[?[?[?[?\?(\?@\?X\?p\?\?\?\?\?\?]?]?0]?H]?`]?x]?]?]?]?]?]?^? ^?8^?P^?h^?^?^?^?^?^?^?_?(_?@_?X_?p_?_?_?_?_?_?`?`?0`?H`?``Nx`N`N`N`N`N`NaN aN8aNPaNhaNaNaNaNaNaNaNbN(bN@bNXbNpbNbNbNbNbNbNcNcN0cNHcN`cNxcNcNcNcNcNcNdN dN8dNPdNhdNdNdNdNdNdNdNeN(eN@eNXeNpeNeNeNeNeNeNfNfN0fNHfN`fNxfNfNfNfNfNfNgN gN8gNPgNhgNgNgNgNgNgNgNhN(hN@hNXhNphNhNhNhNhNhNiNiN0iNHiN`iOxiOiOiOiOiOiOjO jO8jOPjOhjOj Oj!Oj"Oj#Oj$Oj%Ok&O(k'O@k(OXk)Opk*Ok+Ok,Ok-Ok.Ok/Ol0Ol1O0l2OHl3O`l4Oxl5Ol6Ol7Ol8Ol9Ol:Om;O mOhm?Om@OmAOmBOmCOmDOmEOnFO(nGO@nHOXnIOpnJOnKOnLOnMOnNOnOOoPOoQO0oROHoSO`oTOxoUOoVOoWOoXOoYOoZOp[O p\O8p]OPp^Ohp_Op`OpaOpbOpcOpdOpeOqfO(qgO@qhOXqiOpqjOqkOqlOqmOqnOqoOrpOrqO0r`Hr``r`xr`r`r`r`r`r`s` s`8s`Ps`hs`s`s`s`s`s`s`t`(t`@t`Xt`pt`t`t`t`t`t`u`u`0u`Hu``u`xu`u`u`u`u`u`v` v`8v`Pv`hv`v`v`v`v`v`v`w`(w`@w`Xw`pw`w`w`w`w`w`x`x`0x`Hx``x`xxjxjxjxjxjxjyj yj8yjPyjhyjyjyjyjyjyjyjzj(zj@zjXzjpzjzjzjzjzjzj{j{j0{jH{j`{jx{j{j{j{j{j{k|k |k8|kP|kh|k|k|k| k| k| k| k} k(}k@}kX}kp}k}k}k}k}k}k~k~k0~kH~k`~kx~ k~!k~"k~#k~$k~%k&k 'k8(kP)kh*k+k,k-k.k/k0k1k(2k@3kX4kp5k6k7k8kЀ9k:k;kk`?kx@kAkBkCk؁DkEkFk Gk8HkPIkhJkKkLkMkȂNkOkPkQk(Rk@SkXTkpUkVkWkXkЃYkZk[k\k0]kH^k`_kx`kakbkck؄dkekfk gk8hkPikhjkkklkmkȅnkokukvk(wk@xkXykpzk{k|k}kІ~kkkk0kHk`kxkkkk؇kkk k8kPkhkkkkȈkkkk(k@}X}p555Љ555505H5`5x5555؊555 585P5h5555ȋ5555(5@5X5p5555Ќ555505H5`5x5555؍555 585P5h5555Ȏ66__(_@_Xdpxiyizi{iЏ|i}i~ii0iHi`ixiiiiؐiii i8iPihiiiiȑiiii(i@iXipiiiiВiiii0iHi`ixiiiiؓiii i8iPihiiiiȔiiii(i@iXipiiiiЕiiii0iHi`ixiiiiؖiii i8iPihiiiiȗiiii(i@iXipiiiiИiiii0iHi`ixiiiiؙiii k8kPkhkkkkȚkkkk(k@kXkpkkkkЛkkkk0kHk`kxkkkk؜kkk k8kPkhkkkkȝkkkk(k@kXkpkkkkОkkkk0kH`5x5555؟555 585P5h5555Ƞ5555(5@5X5p5555С555505H5`5x5555آ555 585P5h5555ȣ5555(5@5X5p5566Ф____0dHxi`yixzi{i|i}iإ~iii i8iPihiiiiȦiiii(i@iXipiiiiЧiiii0iHi`ixiiiiبiii i8iPihiiiiȩiiii(i@iXipiiiiЪiiii0iHi`ixiiiiثiii i8iPihiiiiȬiiii(i@iXipiiiiЭiiii0iHi`ixiiiiخiii i8iPihiiiiȯiikk(k@kXkpkkkkаkkkk0kHk`kxkkkkرkkk k8kPkhkkkkȲkkkk(k@kXkpkkkkгkkkk0kHk`kxkkkkشkkk 8Phȵ(@Xp     ȶ ض     ( 8 H X h x     ȷ ط     ( 8 H X h x     ȸ ظ     ( 8 H X h x     ȹ ع     ( 8 H X h x     Ⱥ غ     ( 8 H X h x     Ȼ ػ     ( 8 H X h x     ȼ ؼ     ( 8 H X h x     Ƚ ؽ     ( 8 H X h x     Ⱦ ؾ     ( 8 H X h x     ȿ ؿ     ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x             (  8  H  X  h  x                      (  8  H  X  h  x                      (  8  H  X  h  x                      (  8  H  X  h  x                      (  8  H  X  h  x                    ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x             (  8  H  X  h  x                  ! ! (! 8! H! X! h! x! ! ! ! ! ! ! ! ! " " (" 8" H" X" h" x" " " " " " " " " # # (# 8# H# X# h# x# # # # # # # # # $ $ ($ 8$ H$ X$ h$ x$ $ $ $ $ $ $ $ $ % % (% 8% H% X% h% x% % % % % % % % % & & (& 8& H& X& h& x& & & & & & & & & ' ' (' 8' H' X' h' x' ' ' ' ' ' ' ' ' ( ( (( 8( H( X( h( x( ( ( ( ( ( ( ( ( ) ) () 8) H) X) h) x) ) ) ) ) ) ) ) ) * * (* 8* H* X* h* x* * * * * * * * * + + (+ 8+ H+ X+ h+ x+ + + + + + + + + , , (, 8, H, X, h, x, , , , , , , , , - - (- 8- H- X- h- x- - - - - - - - - . . (. 8. H. X. h. x. . . . . . . . . / / (/ 8/ H/ X/ h/ x/ / / / / / / / / 0 0 (0 80 H0 X0 h0 x0 0 0 0 0 0 0 0 0 1 1 (1 81 H1 X1 h1 x1 1 1 1 1 1 1 1 1 2 2 (2 82 H2 X2 h2 x2 2 2 2 2 2 2 2 2 3 3 (3 83 H3 X3 h3 x3 3 3 3 3 3 3 3 3 4 4 (4 84 H4 X4 h4 x4 4 4 4 4 4 4 4 4 5 5 (5 85 H5 X5 h5 x5 5 5 5 5 5 5 5 5 6 6 (6 86 H6 X6 h6 x6 6 6 6 6 6 6 6 6 7 7 (7 87 H7 X7 h7 x7 7 7 7 7 7 7 7 7 8 8 (8 88 H8 X8 h8 x8 8 8 8 8 8 8 8 8 9 9 (9 89 H9 X9 h9 x9 9 9 9 9 9 9 9 9 : : (: 8: H: X: h: x: : : : : : : : : ; ; (; 8; H; X; h; x; ; ; ; ; ; ; ; ; < < (< 8< H< X< h< x< < < < < < < < < = = (= 8= H= X= h= x= = = = = = = = = > > (> 8> H> X> h> x> > > > > > > > > ? ? (? 8? H? X? h? x? ? ? ? ? ? ? ? ? @ @ (@ 8@ H@ X@ h@ x@ @ @ @ @ @ @ @ @ A A (A 8A HA XA hA xA A A A A A A A A B B (B 8B HB XB hB xB B B B B B B B B C C (C 8C HC XC hC xC C C C C C C C C D D (D 8D HD XD hD xD D D D D D D D D E E (E 8E HE XE hE xE E E E E E E E E F F (F 8F HF XF hF xF F F F F F F F F G G (G 8G HG XG hG xG G G G G G G G G H H (H 8H HH XH hH xH H H H H H H H H I I (I 8I HI XI hI xI I I I I I I I I J J (J 8J HJ XJ hJ xJ J J J J J J J J K K (K 8K HK XK hK xK K K K K K K K K L L (L 8L HL XL hL xL L L L L L L L L M M (M 8M HM XM hM xM M M M M M M M M N N (N 8N HN XN hN xN N N N N N N N N O O (O 8O HO XO hO xO O O O O O O O O P P (P 8P HP XP hP xP P P P P P P P P Q Q (Q 8Q HQ XQ hQ xQ Q Q Q Q Q Q Q Q R R (R 8R HR XR hR xR R R R R R R R R S S (S 8S HS XS hS xS S S S S S S S S T T (T 8T HT XT hT xT T T T T T T T T U U (U 8U HU XU hU xU U U U U U U U U V V (V 8V HV XV hV xV V V V V V V V V W W (W 8W HW XW hW xW W W W W W W W W X X (X 8X HX XX hX xX X X X X X X X X Y Y (Y 8Y HY XY hY xY Y Y Y Y Y Y Y Y Z Z (Z 8Z HZ XZ hZ xZ Z Z Z Z Z Z Z Z [ [ ([ 8[ H[ X[ h[ x[ [ [ [ [ [ [ [ [ \ \ (\ 8\ H\ X\ h\ x\ \ \ \ \ \ \ \ \ ] ] (] 8] H] X] h] x] ] ] ] ] ] ] ] ] ^ ^ (^ 8^ H^ X^ h^ x^ ^ ^ ^ ^ ^ ^ ^ ^ _ _ (_ 8_ H_ X_ h_ x_ _ _ _ _ _ _ _ _ ` ` (` 8` H` X` h` x` ` ` ` ` ` ` ` ` a a (a 8a Ha Xa ha xa a a a a a a a a b b (b 8b Hb Xb hb xb b b b b b b b b c c (c 8c Hc Xc hc xc c c c c c c c c d d (d 8d Hd Xd hd xd d d d d d d d d e e (e 8e He Xe he xe e e e e e e e e f f (f 8f Hf Xf hf xf f f f f f f f f g g (g 8g Hg Xg hg xg g g g g g g g g h h (h 8h Hh Xh hh xh h h h h h h h h i i (i 8i Hi Xi hi xi i i i i i i i i j j (j 8j Hj Xj hj xj j j j j j j j j k k (k 8k Hk Xk hk xk k k k k k k k k l l (l 8l Hl Xl hl xl l l l l l l l l m m (m 8m Hm Xm hm xm m m m m m m m m n n (n 8n Hn Xn hn xn n n n n n n n n o o (o 8o Ho Xo ho xo o o o o o o o o p p (p 8p Hp Xp hp xp p p p p p p p p q q (q 8q Hq Xq hq xq q q q q q q q q r r (r 8r Hr Xr hr xr r r r r r r r r s s (s 8s Hs Xs hs xs s s s s s s s s t t (t 8t Ht Xt ht xt t t t t t t t t u u (u 8u Hu Xu hu xu u u u u u u u u v v (v 8v Hv Xv hv xv v v v v v v v v w w (w 8w Hw Xw hw xw w w w w w w w w x x (x 8x Hx Xx hx xx x x x x x x x x y y (y 8y Hy Xy hy xy y y y y y y y y z z (z 8z Hz Xz hz xz z z z z z z z z { { ({ 8{ H{ X{ h{ x{ { { { { { { { { | | (| 8| H| X| h| x| | | | | | | | | } } (} 8} H} X} h} x} } } } } } } } } ~ ~ (~ 8~ H~ X~ h~ x~ ~ ~ ~ ~ ~ ~ ~ ~   ( 8 H X h x           ( 8 H X h x     Ȁ ؀     ( 8 H X h x     ȁ ؁     ( 8 H X h x     Ȃ ؂     ( 8 H X h x     ȃ ؃     ( 8 H X h x     Ȅ ؄     ( 8 H X h x     ȅ ؅     ( 8 H X h x     Ȇ ؆     ( 8 H X h x     ȇ ؇     ( 8 H X h x     Ȉ ؈     ( 8 H X h x     ȉ ؉     ( 8 H X h x     Ȋ ؊     ( 8 H X h x     ȋ ؋     ( 8 H X h x     Ȍ ،     ( 8 H X h x     ȍ ؍     ( 8 H X h x     Ȏ ؎     ( 8 H X h x     ȏ ؏     ( 8 H X h x     Ȑ ؐ     ( 8 H X h x     ȑ ؑ     ( 8 H X h x     Ȓ ؒ     ( 8 H X h x     ȓ ؓ     ( 8 H X h x     Ȕ ؔ     ( 8 H X h x     ȕ ؕ     ( 8 H X h x     Ȗ ؖ     ( 8 H X h x     ȗ ؗ     ( 8 H X h x     Ș ؘ     ( 8 H X h x     ș ؙ     ( 8 H X h x     Ț ؚ     ( 8 H X h x     ț ؛     ( 8 H X h x     Ȝ ؜     ( 8 H X h x     ȝ ؝     ( 8 H X h x     Ȟ ؞     ( 8 H X h x     ȟ ؟     ( 8 H X h x     Ƞ ؠ     ( 8 H X h x     ȡ ء     ( 8 H X h x     Ȣ آ     ( 8 H X h x     ȣ أ     ( 8 H X h x     Ȥ ؤ     ( 8 H X h x     ȥ إ     ( 8 H X h x     Ȧ ئ     ( 8 H X h x     ȧ ا     ( 8 H X h x     Ȩ ب     ( 8 H X h x     ȩ ة     ( 8 H X h x     Ȫ ت     ( 8 H X h x     ȫ ث     ( 8 H X h x     Ȭ ج     ( 8 H X h x     ȭ ح     ( 8 H X h x     Ȯ خ     ( 8 H X h x     ȯ د     ( 8 H X h x     Ȱ ذ     ( 8 H X h x     ȱ ر     ( 8 H X h x     Ȳ ز     ( 8 H X h x     ȳ س     ( 8 H X h x     ȴ ش     ( 8 H X h x     ȵ ص     ( 8 H X h x     ȶ ض     ( 8 H X h x     ȷ ط     ( 8 H X h x     ȸ ظ     ( 8 H X h x     ȹ ع     ( 8 H X h x     Ⱥ غ     ( 8 H X h x     Ȼ ػ     ( 8 H X h x     ȼ ؼ     ( 8 H X h x     Ƚ ؽ     ( 8 H X h x     Ⱦ ؾ     ( 8 H X h x     ȿ ؿ     ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H X h x             (  8  H  X  h  x                      (  8  H  X  h  x                      (  8  H  X  h  x                      (  8  H  X  h  x                      (  8  H  X  h  x                    ( 8 H X h x           ( 8 H X h x           ( 8 H X h x           ( 8 H+}P,N,I,,&,\ F, ,78,8, @,y,,X,t ,W(,%P,(,,x,^ ,e@,--' - -qp-q--x-.-U6-;-KX@-HD-HE-^I-K-@P- Y-nP`-Pb- o-o- (}-q -e--*-؝- x-X-%-^-= -/P-H-`-0-/`-P-| -x...&.(.c.( .%H.4/'.#.+.~8/.1.G 8.Uh77 x>.C.w.'.^.W,.d.l X/@/ /@*:"//I@/_%/z 1/9/%89/=/C/ Q/Q/a/gu/x/ /X 8//1P///L`/ //P ///=//_2h224023Kh3FY498u4+P4ˇ (5 15l J5 U5[58n5r5x5y5x@{51x}55(5G55{8555sP6N6 66{(66! 6!A6 K6 V6PX6 b6h6cj6}n6Pr6ax666x6*66s6qp6p6Sȟ6}H6X6[66C` 7h7^7b07@ 7&C7E7x@H7%n7 8_8o8`8I8%38 @80E8J T8VxX8.808X9 : :I : : 0!:9p):3;(\;Xd;Ix;L{;~x};n); %I;!FIJIS KI3XLIPRIj$wIOhI0IDxIN5IpI8Js.J 4J8J>;JMJ_8OJAWJ?J8JJJ% JK`K}K[@?L XJL'bL"0LoL%L LL>MMMpMHM!M(M 0MX6M0:MV#]M7tM MȓM5MM0MY M0MW M|MNXMXM NN8@RN$GNb0`N\'O>@HX>x`> k>hh>4 >>h ?H?F.F?hU?Xt?-H? ?n#P?8?n+@+@"(@K 6@? `C@5x@P@X@H@8@ A=A1A6BA LAwSAZhUAF aA8wAA^ HAAAOAxA~&A=8ADAe%*, :0::::::>@:H:H:::x:P:::$@ ;K ;} ;;; p/8/?/LD0I0K0 W0<[0 e0e0w0902/; H2 h2222 2Q P22y2 8B$ `>BTB8LC4pEDX6E6E7Eh8E8E9Ex:Eh;E0Eh?E @EAEAEXBECECEDEEE FEGEGEIE.0JE@pKE LE`MENEexNE^NEg@OEpOEs(PEQEQERExSE/TEUEFWE;HXEhYE\ZE[EI]E8^Ec_E`ExaEbEcEeEgEjEmEppEqErEhsEmsEhtEuEuEHvEvEv`wE{wEhxE@yEXzEA{E~EEXE&EEBȊE ؒEE> ExE2ПEEXE`EEA0Eg ExEEEHPE E E=E88EaEbEBPE\EIEchELEMErE|EFHENE|EiE`EdPEREME=8EDEBE@EFPEFEFEbHE>EEEj@E?E^EqXECEYEEE(EF F @FH%F /F@FxEFO^F kF`pF} zFF HFؑF'FFF F F,*0F@F 8Fk F]G G G; (GnX+Gb-G0G@AGHAG%EGMHG TG VGWGH8XG$`]GC]Gz(`GdG&(eGHpiGqGrGX0tGwGv({G0|GGpGGDPG/GG9GI GxGG(G= hG{G+GGn GtG7GGiHGOGPGvGe0GFxGHG8GzG,GxGGOG G)H9HHp-H.HH87H8H>Hx@HHEHvFHPMH*QH>fHw8hHmHdHuHwHpyHl|HH HH3H H HhHHH@H4H HHHHIAIx II I~pIuIu`!I$IBP8B#`BBxBBBHJJJJXJ0J@JJx,p;~@, ,@h Ph`hph hPMhhh hhhh hhh h(h 8hHhPh`hxhthhh0h hhh iȍhYhwh hi@ hH hP hX h` hh hp hx h h h h h h h h? h hxh h)8 hP hX h` hh hp hx h h h h% h h- h(H hP h0 h h h h h h h h h h h8 hP h` h h h h h h h-h h0h8h Hh Xh(hhhh hhh hh h8hHhhhh hhhhh h-h h0h @h Ph `h phxhhhhhhhhhh(hHhPhphh/h hhh.h!@h Ph `h phhhh h hhhhphhhhh8hh8h Xh!h4hVhhQh(0hHh^hahcxhmhh1@hXh4hhFh<0h1hh0h!h8hc`hPhXh(h 8h Hh`hxhCh hhhh8hPh?h]hdph'h0h,hh!8h"`h9h` hn hZ0!hY!h!hO!hR@"h"hn8#hi#hM#h& $hWx$hE$hy@%hK%hN%hnP&h=&h&h&h&h &h# 'h-P'hG'h3'hH(hIh(hO(h(h0)h38)h,h)h3)h7)h)hM@*h8x*h*h*h*h*h"+h +h;`+h+h,h ,h,h(-h4`-hS-h-h-h-h-h<8.h1p.h .h.hG.h`P/h/h/hup0hI0hS1h2h2h(2hx@4h6h^p6h 6h07hFx7hW7hP 8h88h[8h 8h 8h-8h"9hK`;hO;hm hJp>h>>hW?hYh?h?h0?hx@hAhAhAh'Bh;HBh`BhSBhBhBhBhChixChChCh@hChChChU@DhvDhDha@Eh`EhEhB(FhEpFhZFh]0GhHGhhGhGhGhGhGh1GhHh(Hh"PHhpHh?Hh3Hh$IhIhGJhvJh{Kh~Kh@LhILhLh$Lh`MhpMhMhMhMhMhMhMhMhNhgxNhOhOhOhOhOhOh PhPh Ph(Ph@Ph&hPhxPh PhPh PhPhPhPhPh.QhDPQh8Qh!Qh Qh$Qh0(Rh0Rh @Rh PRhSh Sh 0Sh@Sh PShhSh xShShShSh ShSh Sh Sh Th48ThPThXTh hThZTh ThThThUhUh Uh0UhHUh`UhUhUhUhUhUhUh Uh UhVh(Vh0Vh @VhXVh hVh xVh Vh VhPVh Vh WhFPWh `WhxWhWhWhXXhpXhxXhXhXh XhXh XhXhXh YhYh Yh (Yh 8YhPYhXYh`Yh pYh Yh YhYhwhYhYhYhYhYh YhZhZh Zh Zh 0Zh @ZhXZhxZhZhZhZh<Zh+[hVp[h [h[h[h[h_\h \h*P\hh\h\h\h \h\h\h\h\h\h\h\h\h \h]h]hl]h]h]h ]h ]h]h^h:H^h&p^h ^h ^h^h ^h^h^h ^h ^h_hax_h_h_h _h _h_hP `h(`h0`h@`h P`hD`h*`h1ahah ahBhah qiahahahbhbh(bh1`bhhbhbhbhbhbh bhbh bh bhch ch(ch 8chZch chchchchdh dh dh 0dhHdh`dhpdhdhdhdh dhdhdhdhdhdh dhdhdhdheheheheh eh 0eh8eh@ehHehPehXeh`ehxehehehehehehfh fh(fh0fh8fh HfhPfhXfh hfhfh fh fh fhfhfhfhfh fh fhghghghgh gh(gh0gh8gh@gh PghXgh`gh pgh ghghFgh:hh(hhQhh\hh_@ihLih4ih:jh jhcjh'jh;jh"kh/@kh`khxkhkhkhkh=lhCXlh`lh plhlhlhlhlhmhnh6Pnh4nh2nhnhA(ohi `oh pohohohoh h hh0h8h HhPh`hphh hhhЉh؉hh hhhchh hhhȊhЊh؊hh hh h(h0h @h Ph `hphxhhh3hȋhЋh h hgXh+hh!hA0h @hXhxh$hhȎh ؎hhhh h h 0h8hHh`h(hhh hh ȏh)h;8h,xh h hh hؐhhhh h8hHhPh `hxh h#hhThaxh3hВh8h1@hHhh?h6h.Hh@h!h'ؔh8h h6Xhh hFؗhhhh h8hPhhh+h"h Иhؘh hh h(hPh`hxhh h-Йhؙhh h hhhh0h@hHhPh `hDhRhAHhPhXh`h ph h hh hhh'h5 h1Xh hhBhȜhhh38hhhJhh hMph[ОhN h(h@h Ph+h9h,hh h#@h Phhhh"hh hhhh(@h6xhh7Сh(hh@XhNhGh;0hIh)h6hD0hPh'xhh+Ȥh/hJHhXh>h= hKph=hhЦhئhhh(ih hi(h 8hHh`hphipihiih ȧhЧh i hR@h&hh/h,Ȩhi ij h hЎiPh `hphhhhȩh&hh"0h@hتha@h Ph `hhhphhh@h0h#8h@hPhXhxhhh#hh9ph xhhpiصh hhh h(h 8hPhph"hh>hhhh1hvhhh/hȻhлhhhh (h8h(`h,h h h(ؼh_8h Hh Xh hhhh\h&0hHh`hxh?hPh@hbh[h(h(Ph'xhjh hhh0hNh#hhh1 h8hHh'phh hh:hhhh h h(h0h @h Ph`hh hhh h(h0h @h Ph `hVhl(h0h8hLhhh h hhhh h(h 8h@hHhPh `hphh%h0hh h h h8h2ph h hh hhhhh h- h(h8hPhhhxhhhhhhhhhhhhhhhhh(h8h Hh`hhhphxh h(h@h PhThu h/Phih.hh(hHhhhhhh'h!h#8h%`hhhhhh!h(@h.ph#h'hhhhh?8h7phxhhhhhhhhhh h8h@h Phhhth6h;Xhxh hhh hh h hh hh h 0h@h`hxhhh<h/ h(h0h8h@hPhhhhhhhhhh hh h8hPh `hxhhh hhh hhh h@h Ph`hphhhhhhhh h@h PhXhhhhhhhhhh(h0h8h@hHh`hxh"hh h h hhh h(hHh Xhphh hhh hhh hh h8h"`hhh xh hh hhhhhhhh h h(h0h8h@hHhPhXh hh xhhhh hhhh h0h @hPhhhhhh h h hhhhh (h 8hPhXhhhxhhMh h h\`hph9h hChh%@hHh5hh:hhA0h@h>hh0hh@h0hKhhh hhh#hhLhhph8hh2hh58hHh.xh h4hh/hh h PhXh`hHhWh38h:xh)hh h+hh hhh hh hhh h(h0h@hHhPhXh hhphxh hh hh!hhh0h@h`hxhJhhhhhh8hPhphxhhhhh hhh^Hh`hhhahh h h 0h@hHh Xh`h phhh hh hhhh h h(h0h8hPh.hhhh)h/hhrh8h&`hhhhh hhh hhhhhh h7Xh*hh1h< h0h7hh/hh h-hh h#HhXh!hhhhh h8h"`hph*hhh4h)@h%hh4h)h%h)(hHhhh.h#hh9 h.Ph*hhhh$hh h@h`hxhhhhhhhh h hh(h@h Ph`h ph h hhh h$h( h'Hh&phhhhhh<h0hHh`hxhh hhhhh(h@h Ph `hhh xh hhhh h hhhh0h:phh hhhhh hh hhhhhh h8hXhphxh hhhhh!(h#Ph#xh#h h"h"i"8iXiEi.i.i i8iXixi#i/i i+ i$Hihii!i(ii i i0iHi#piiiiii i@iXixiiiii ii i i i @i&hi xi(i iii ii ii0iHiXi`ihipi ii i iii ii#i i8iPipii ii ii!i!(iHi`i#i ii.i! i0 iP ip i i i i! i i i i i8 i[ i i i i i i i i i i i i 0 i8 iH iX i` i p i i i i i i i i i i i i0 i8 i@ iH iP iX i h ip i i i i i i i i i  i0 i @ i P i` i p i i i i i i i i i i (iHi`ipiiii i ii i i(i 8i,hiHiii!iii8i?xiiii i iiRHi*xii i iXi]piXii i ii i"Hi.xii'iii)i/0i8i Hi Xi`iiiiqi(i0iHi|ir@iIi7iAi,@iXihiiii=8i+hi(iii'ii 8iPi#xiAi0i(i8iXi8i%iii&i8i+hi i1i&i i i!0i(Xi&i"iii.i0Hi&pi(ii"i4i-Hi(piiiiiii)Hihi%i i$H i'p i i i i i-!i;@!i8x!iA!iA"iIX"i'"i*"i0"i#i#(#i@h#i#i"#i #i+$i $i'H$i(p$i!$i'$i!$i5 %i/P%i!x%i%i0%i%i*&i-H&i!p&iD&i+&iW@'iA'i8'i"'iR@(i>(i(i)(i,)iIP)i)i,*i>H*iH*i@*i*i1+iIh+i=+i+i{8,i|,i,i,i-i(-i H-i"p-i-i-i -i-i-i-i-i .i.i(.i@.i P.i=.i.i.i.i/iv/i/i /i%/i$/i0i0i0i0i 0i0i 1i1i 1i01i @1i P1i)1i h1i1i1i2i2i82iH2i X2ih2i x2i2i 2i 2i2i2i2i2i3i 3iSx3iY3iT04iP4i `4i p4iV4i!4i5i)5i,5i+(6i,X6i,6iO6iS07iM7iQ7iF 8iEh8i`8iD9i9i:iJ;i;i ;i8;i H;iP;ih;i;i;i;i;i;i;i;i;i ;i iH>i<>i!>i ?i$0?i @?i P?i `?ix?i ?i?i?i?i?i!@i @i@i8@iB@i@i @i@i@i@i @iAi Ai0Ai @AiHAi`AixAiAiAi/Ai0BiBi (Bi@Bi XBipBiBiBi4BiBi98CiPCi`CipCiWCiR Di&HDiPDiXDixDiDi>Di6Ei&8Ei%`Ei%EiEiEi.EiEi FiFi Fi 0Fi @FiPFi `Fi pFiFiFi"Fi+Fi,(GiYGiHGiFHi0HHi-xHiEHiHiHiIi Ii8IiXIi`Ii pIiIi Ii IiIiIiJiJi (Ji&PJi3Ji JiJiJiJiJi Ji JiJiKiKi0Ki8Ki*hKixKiKiKi KiKi KiKi Ki KiKiLiLiLi0LiPLi+LiLi:Li)Mi0@MiNMi$Mi5Mi* Ni)PNi+Ni2NiIOi9HOiIOiOi$Oi*Pi*@Pi&hPiEPiVQiQiWRiRiJhRipRixRiRiRiRiRiRiRiRiRiSi Si(Si8SiXSihSixSi SiSiSi Si/Si SiTi1HTiPTiXTi`TihTiTiTiTiUUiUiHWiXWiUWi9WiXi)Xi XiXi)Yi7H[i\i=(]i0]iP]i `]i]i`^i^i^i^i ^i_i_i _i _i_i_i`i(`iH`iX`i+`iQ`i`i`iaiai:Xaihaiaiaiai aiaibibi bi(bi0bi8bi@bi`bi pbi bibi(bi)bi7 ci(ci0ci8ciXcipcicicicici!di dixh @di!hdidididiyhdi ei5@eiPeiheixei1ei3ei7 fi5Xfipfififififififigi$0gi5hgi,gigigigi#hi%@hi-phi hi hiQhiA0iiHii3iiii:iiA(ji@ji6xji6ji jijih8ki Hki`kiwkikili i li 0li>pli/li/li)miFHmi@mimimi,mi98ni4pni1nioi oi pipipi pi pipiqih(qi8qiPqi `qipqiqiqiqi qiqi8qi"ri\xriri riririri'ri hsisisi=Xsi`sixsisisiRsi sisihti(ti 8tiXtipti0uiMuiuiuiuiui؍huiuiuiuiuivi0vi!Xvi`vi pvivivi vivivihwi wi (wi 8wiHwi`wi pwiwi wi wiwiwi wi wiwiphwh xi xi xi(xiHxi0yi*`yi pyiyiyiyiyiyiyi yi#zi ziE`ziQzi/zi zi{i{iZ|iTX|i|i |i|i& }ib}i}i}i }i}i}i}i}i ~i~i~i ~i@~i P~i>~i~i~i(~i'~i ii i(i0i6hiiiii ixiiii؀iQ0iSi(ir(ibiio iuii#ii i-8iXi`ihii$i Ȅi؄iiii(ЇiiU@iOi(i&ii$(i7`i1ii+iD(i+XiDPh(i&؊iii2@iEi'i#؋i:i6PipiiiiЌiiF(i8iXi xiiiiȍiii i i 0iPi`iIi 0Sii i@i9i@i"i)i8iXi'ii ii,i iih0i8i*hiiihБii+i?Pi!xiiii4iG8iXi&i9i?i(i$PiXipi i*xhiؔiP(iQiFȕi ؕiiiii0i8i Hi&iЖi ii i i 0iPi#xi iiiOiWXi hiii i4iiin`iXh0iHiPiXi?iiؚiii8i@i Pii(i 8i1pi5ii i Мi>i i8i'`iq؝iQ0i,`i#ii ȟi,i& i7Xi xi/i#Рii-i0i@i`iii iȡiiiЪi i-PiXi hiUiȢiТiآiiiiiiiii (iHi`i iiiiȣiiii8i@i`i pi!iii iiȤi ؤiiii0i8iPihii!iȥiإii$i&@iHiPiXiii(i 8i Hi,xiiiiЧii"i}ii iШi ii i@i$hii ththuhuh uh(uh7`uh*uh[uh[Pvh0vhvhvhvhvh=vh=iii i"Hi2i i ii"Ыi i ii i i8i]i8Ьi;i/@i*pii%i!حiiii i(i0i @iHi Xi`ipixiiiiii iiiȮiЮi iii i i(iHi`i pii#iiiЯiدiii i iHPi `ii i iiTiSXifiZ imii%Ȳi زiixiii#iȳi_(ipii iشiеi`iuضi1i#8i@iHiPi `ihi xi iiii ii(i08i)hi(i%iWi(i(PiWiBi'(i[iiiiiкiii ii i8i@iXi hiPi6iii(i@iXixi.ijiȼiмiiii ii@iJHiLiMi_HimiiȿiEiiD`i=iBiN8i8pi thii ii(iT8iiE8ioi=iii0i3hiii i/iii+(i,Xi9iHiiuxiiii$iiii/iiiii(i0iHiPihi%i ii!iii ii ii(i6ii_i iFhi i|i(ii#iiiy(iHihi xi*ii=i i-Pii@i8iJi@ii:(iPxi i7Xii?0iLi4iiQ0i"XiEi>i@ ii7ii/0i"Xixi1iRi@HiLiDi-iqi9i`iBihipiidi_PiTiKii 8iEiBi>i.8iXii`Hieiiiiiiixxhiii>Xi`ihi xi i iiv(i 8iPi"xiii i i iiii i0i @iPiXipixiiiii$i.i+yh8i@iHi Xi3i/i ii#ii5Pihi2iii iiihi0ii#0i@i#hi+ii#i i(i i0i(Xi hixiiiiii i iiiiiJ`ihi xi i i i hi ii$i(i0i'Xihipi#iii#iii30iHiPi pii iiiiiii i0iPi`ipiiii i iB8i<xi4ii0i*(iHi`i#i i'i%iihikihi iii3i;i0iNi?iiHiiinxiaipi'iRii9Hi XiBii ii1i i i(i8i@i Pipiii i7i iiiii i0i8i@i Pi `ihiii ii iiiiiiii(i8i HiXixiiiiii(i,Xipii i(i i i i ii8iXi(iii"ii&i=Xi`i iyiivjth j8j%`jDjj jj jj(j 8jHj`jpjjjj jjjjjj0jHj Xjhjpjj jj jj jjjjjjj j0j @jHjPj`jhj xj jjj jjjjjj0jPj!xj jjj jjjjj8j$`j&j%j;jA8jtjWj6@j`jjj#jjj j@jXjpjjjjj j j  j j( j0 jGx j j; j9 j?@ j; j< j? j9@ j> j= j j jhX j_ j j j j j j j j>` jx j j j j j j j j jjj j (j0j8j Hj=jj% j 0jHj Xjxjjjj#jj0jHj Xjhj xjjj@jjj (j)Xjpjjjj=jE@jXjxjj/j2hh j j@j`jxjjjj jj j jj8jXj8jj jj#j" j8jPj.j0jajLj jMXj?j j)jjjj(j0jHjXjhjpjj jjjjjj j j j(j 8j Hj`jxj j jjjjjjjjjjj(j8j HjPj `j pjxjjj j jj jj j jj j 0j8jPjhjxjjj jjj j jUhjQj2HjPj`jxjj(jjjL(j`j-jj jj j jG` jE jJ jB@!j@!jEMh!jE"jn"j8#j#jR0$jh$j $j7$j$j)%j (%j@%jX%jp%jz%j'j 'j8'j'jVH(jX(j8(j(j@)j)jx*j,j,j,j,j ,j-j -j .j.j/jH0jX0j0j(1j2j`h2j3j3j4j4j`5j5j 6j@6j6j6j7j7jr(8j 88j H8jX8jp8j&9j&9jL;j(;jo;jC@jAjpBjiBjFj*0FjDxFjFjFjFj*FjXGjxhxGjHjhIj8Ij Ij)Ij&JjZhJj9JjJj;KjKjNhKj Kj{Lj Lj Lj7XLjpLjVLjLjT8Mj HMjhMjMj<MjPNj8Nj HNj XNj(NjANj5OjOj OjOj/Oj Pj Pj^PjrPjQj?HQj RjRj,SjUj! VjWj&XjXj/Yj$0YjYj%ZjZj'[j[j[j\j&]j\p]j ]j@^j@_j`j9H`jaj/Hajaj>bj0bj!Xbjcj1@cj djej ej.@ejPej,ej9ej&ejej40fjKfj3fj4fj?0gj@pgjCgjgj gjgj"hj$8hj#`hjhj"hj#hj#PBiwh|hhhjiXxh li (i8di?hshwhЍhPthwiri@th ti i uiiviviiixi؎i i ii (ih i pi(i8MhhXth(ph ixi xith whi xhi iyhvi`i i(hhiPxhЅi؅iiii ih 0i hpi i iiih hxihhhjjhijhGjii hhhxh0h@h ȑi8h(h ih hthth9thi;Щiiiwh0i0h 8i@hHhiiPhiXhiتiph hhh Эhhh(h@hPhhhphxhhh hЮh$h h h h(h0h8h@h Ph phh'h7h9 h9`h)h;аhEh7Ph*hh'ȱhhK8hPhph-hh#h"h(h@h"hhGh:hZPhYh[hh h(h 8hHhPhXh`hhhxhhwh"hhhihh$hhDhyh60rhNsh3 thhh5Hhhh&h$h+h# h*1i2(xh! yhGh&h wh.xh3xhhxahXhȆiyh10h h8oh'Pwh10 hW h h di? h:(h`iXihi@i$i kh h!h4jj-pi1j9oh ohoh oh oh phph8ph HphUphtqh.HqhZqhdrhrh"rhrhshyh,zh2Pzh2zh,zh2zh<0{h2h{h,{h6{h,|h)0|h3h|h/(h,|h6|h<}h6P}h<}h6}h3~h9@~h6x~h4~h:~h4(h:hh4Ȉh1@i7h4hh hhh h h8hPhXh hh xh h h h h ȀhЀh؀hhhhhhhh h h0h@hLh Lh MhMh Mh(Mh Ph `h ph h hhhhhhhȁhЁh؁hhhhhhh h (h 8h@h PhXh`hhhph hhhhhȂh ؂hhhhhhhhh h(h0h8h@hHhPhXh`hhhph,h h hhhhh h(h 8h HhPh%xh#h"Ȅh#h&h%@hXh hhphhhhhȅh؅h hhh#(h*Xhphxhhh h h h؆hhh h0h @hPhhhhhhPhh h 0h+`hphhhhxh xhDS^S TmT6@FT XQT8aT kT1МTT(TPxXU`^U#dU`gUXkUnUJ XwU{U!UpUU(U U? UUUUU UVVq(V8,V 1V?V!CV MVy8UV @^V`dVkVV7i-W?ZZ~4H)[,"xK[dj[0[h[cx[[[A [ [  [ؑ\!RRH\e\ \\RSuSwS6 SS;0S-`Sm ДSS;@;S;SSy(ShSxS8SȸSSS S SSSL S;(S X_SxdS SS;SpS`S(SHSpPPSx[S&hR@RpRpTS1\hoV@VvVp S~0S!Sȵ\}2S}\FSLSrYSX8S}R $S}ShR@RpRPRR`S(SSpS{Se S S SSSSmVSYPqVsVxV}Vh~VH#SVVhV@V VP-S/S`0S81SV805S@6S7S9Se>S~@SCSo@DSsFSs(HSsHSJSLSpS@RSSSx\@\\^S@cS7nSoSqSKSLP4SWh SV7SS*SSSSX S!SH(S%S()S*S+S,SmS.V@V V3S(RRS S*SxSJ'SS0/SS5SHCSHXISVSgShSS4S@XSXSXYS0SpS2Sn8S?p&S|\H\ASH\ X\E\<\Sh\B ]Y^ ^m(^6^ ^^ ^1p*_T-_P__#(____J ``!`*`:`J`Q` p[`? e`pi`Ho`(r`0u` H~`(``q(`ع``h`!` X`y` ````a7ibXepe~4e," fd>f0Pofhfc fffA Ȯf f feg!X\\Ag9g`gg]]P^B ^  ^G^90^y ^h ^GH]G#^*^00^t5^<^p>^C^G^J^, N^,PQ^HU^@Y^X c^Gg^,P] ],0n^ r^Ghu^w^^؈^k^ ]!8]#]\ \ ]hs`xa +a@]S](b](g(](Pg(H](]]j](`\(g](H4](\1'] ]]$] +].P,]2]3]58]<]=]p?]C]mXE]K]`N]aaaa_a] f]^Ha] a_"a^h#a0'ay] ,a]-a`.a_@0ah(]PЋ]Oȍ]O@]]u]Т]~P]]p]8]P]#в]$]!]] g#Hg$pg!X]H]@]]] x]X0]c=]b ]M]Ft]/V]W]`\]8a]b]p]j]r]u]w]hx]8p]}]]]y(]\\p*];]6K]\]Vhp]_h}]_x]Tx]T0]h]P] @]]p7]]]]0])]8]F] X]2(l]>gpgZ(]MgFgggp.]xgMoj(xk%k`khk(0l%llh(oj^oj^Ȳk>l>hj,(lwCDRCCSR1CSR2CLRCAPI_ADOBE_PUBLIC_KEYT405_ADOBE_PUBLIC_KEYIDI_ACROCEF_ICONIDI_ACROCEF_SM_ICONٖH ^_5* H@RאַVX؈Nc?s<;rdܱ. eeu+#Af-rB0e˟>G 1M*),&7_1EU䔔9M-m-*&A'XbZ78WSۈ)tU>"ӌ>#s'kmr I9])ۈa‰_@M(8@?y_5eA'?=S c^dT@cJTXn1FC 5Ӳ(>& Z1R:L-C~s_lI3Z 1/臄3/Ŋ9臗'ϟ 4@^slv"k f~@G^e,Z2%Q>&U?R,3~TOT AxUykrꢤ{ vK. :! v\-^p41h\E<|̪rJVYKrNYbjTsù$qSH `E ;߂v/>DW(chJEU{Gt\%Kq%D%e:/a8s5s { ϝ"4MM j M)緿ϨoȲ*GeMMZ1Cɜa+ \TPg½zOV/.ׯie{P;_ A 8c\Bv. $ZRWg<[)-r;o1PMkAfNr,FDՀd6w`K)uHdڇsWG^(( 3^ ơ+IkCй3qF{cmӟ.T,9}|vye +g裢0Z'˱=&l'_ Fȿ|J M d">@1+:z9LeS@ 䐻3mW'OWuzGa_R: slftEC*&Oy 쁢ׅS5{8H+ʄ 6aVr9lN - H]g2;+=ֳ{#RPܝNkA>(Y,\+-nsq<t7ߞO2l~}R"_jWm Jms-+CRC=G'/sN}a:g2/њMPNqE$ޮWa=2ֽE t9X>&Jp$s''- @K=D'cw(}2 puwXF^q?>I׀3Zq?3)@qAA'ߧh@5HϘ=!ewϦZIde"8+Nyrde]0_׻LwVݓi|8{68bs 6?\v &,T?5 eQr(qwBbΓ,KUܝZ:|˱+@.O0 ϮN*NRsv psfK-Y r&6o-U4h~{Ũ*މ#w}ﮉWE8XzhfO-+;1r&oބ"XwDC(Fx} UКSs>>H_7; lHaq=QS@4cE_x:g6RPzp;k\3S JlMNӼit"=a|DAح]mtxsè :Ãq#|CI9 FDF?>YzP}t)K|I|X0\iZ, l;Ihha->;Po53 mh7QBM*s @)x5| is1F۞ulOAMMh1C΢ojPSЏ/$TE:4w]!~b:uyYCnn5:Y_.xӐNu|7۟'': OTCM IXC<s.,ORõN""*g|ѥd2sQ%\bi@* 0x5>@0|U uMQ`v3͛9ĉĐN; 6x㝪ܽ~Qw{= tMwJy$( z\!idwr(z=p)Xu?O1J;egB#r&٨n8Nf/JERd 󴸭RbkJ\V#am\ >:x6 ߍ0h4` ߢ3,IؚPBGkG|+`GW'd$iX(D&O 3OPOc$ `D Jd3O ⾏*d {G;| >%دO8$ b_P;}`_t!qOdp l6_( >:kp,juQ!]A1_{qàG@`N5X2v p`_x|w߯)jDwv ~'R0t9rIr1g<]2Q,oA~aNaЕ}/zgL#Cx7O03 F >AK֩Ӏpȏ8yS|1 !Kj ôj*zt+d2*l>'.Tק 榳i<.)ǪoN;Ps৳9$νrPtBAx$D~ l W*K=^eu$,:_`CkO=!! \D~H7 @فCG*z3o]z_f9ىnd n{h)3iQ2RK7SQ!@!GB;mw 2秵`~h:|~)VW)/=a:]䂪GH/|e )ЧCϔ'|/yz˻R >n<+d'4#no\iGݖDT4I#3O{hy[N3#n\ww,<`{>O`AǗ#Z-הˮ,N| el }I] bBYBO{p)_iF'XQ1bR]`@Ҧ'5%{-ʮ/3P$"&IVF֗En4{:(j`q(H[O( уqP8>wVӗ` Q^f<‚1+h:c2ڍı@9j?(r#9%JLdjg+N#'x ٜ7rsH9v߿b/?lιa!}@'1X/ ooc`|DђW8Ct{fT1tI"2mẏ1 i4x[4qT`/s2sN(/rӫ$?}cS_LL]dwR.0!'OV X0,u v]˧B,0Ҵ+|= +H4i߉)bIrY?tD]SHfrq:'jN_J=v/#&U2bs/lE5O[uϥ8/=}&׿U!к*Rp_/{D.}@OK*[HO&Yz쭫'lݏv`uw}qHhENt"8&VW+|ҢN^:'zCM@I` O,)kg=gU_!0䬠< z/:!˗:@>Y$>ӽ!R!qKpеD !VXbsӗ_t.8s/72YXSir:&o =3}BxbKYq'*krI5{ "i0 +sS^ŤC ;򏎳K(qLRbxw} ċfEzh˄xØ#R\?25N}K9}9g5!{?WifL 2a+Z^ =aZ%g.N{I!OOmu1J@<϶?BO'(G\UwوQ^!ogR܈Fvz1+TSԢ0֮t(* .Jǯ=_v{qh?M ?`kϵFBRkR4'F_MbII _*pw>z7oSrʽ2nS~^qr!7UﹼtZ7 7h ['Fڼ*LDOr1r"@,ۻWwܽ.O QW똦}< 8!CZCywz>jл^ ΰ/5XB@_Ro+fC_U SMUȔ079]hx2]ʐD w~{R;wRG#/O':osUbY3UtmGeιp d;fF^4zc%:TQ1o3[βTw|Uoz}1Wå;SZNyFvoVS (n=M4]3_(~ ] rSy^w*J rwH"bOWgq(79#x"57*8?~=g~;ZkRn(2q]Dx'r[W?=tv᥹>#Mצ?Nž?.W5$xL_@k,}׬/#2X#_"Ug~y $~@{]~gw&oD<$\2u}op~s.v|o)='Wm.k/Cw}}W\hWLߋ%P'HTVg+Nr0%ib:o 9 z/KqUxnG@,(^=L)q^:oUlMz [›>σWc̳{ :~ ^s"/2f@!`xO<зsqnߗNqn]V-} *Х:þ@atkă[n _;D(BsQ7)P?;Ih:1C>NOK {C"xӍH$L>L$ MӹOEǏ륳3?"Жۤ ߳we'^<]2ib:3 c6/^xY xoŎqj~[ss˹ar1vA/y>3;8.a76ECo)P_g4zSx1Cw 4 TrQ/g+~r:c*az˷uwH_w ɔȼDCO\Z L(|G4e |'`6+5 ByJ;(swYmXP~_üV#*}$T4 %YMֱA {d <{.WY:,f^:H*D0LnG[BX_Ŵ-[ti6oft-:$[ lҖjzk&6ܦ]_XaEɲժϪz[4$XfrquVsC@EѨHAWF+{`q<*][;Eqq?`AU=UKb>mQVd%)j+5v79-Y]pacr[b/rSKv.3s"CLh,B+slng-P6~A\>+bio!KZXn^9IJM&ȩwyFzun M&d9A;2x;)7F$cL|X.U,*sG %W4LieY3iTw*6;cf٤r|]b.m{ϥJzzRT÷u+;RzReRA4yf~V.䴢z+$̲<-0JsLf:ֆƳ,'AcQlpiu](["&.O۬L:fڥKhV י Gض PղCl]5߶D|38$'tg6p`4;#BBqSYڶkjMXOjv)X'Jqϩs"ɕN`⩑2ym:fkQ+ݛTO@PnwҦdOi ׭"?Ȱ5zR@)3$ͭ3lVc[(g]hxCtW@^MkXbH ] 9Y)vmFFj6IemӆX7׋a]%?UeƳ/9q N6*/Ǖb^of =`J^b6A¸WDg.$cJd3Wr 4A[M&Y0S59̯6.hV _~4$b}su\jR\ί#dg3^Ye, Ho~H򛁀u!_rTiYm2Lq?'"*L㸕 N}Z-ҕxǚAԵ|cV)fwXvPZZ弉[*7f\ΡD*rYs@^>%j ]YMa,M%0&'Ɩ¦m"Ӓn-GvNqvNmnгXOKk1r4vm ߀7@ޘgʹN@:6JlRwCLV+zq33A%trZx!N&>SJ=*cṷ2EBH[ (9)͙]FTS+bH%)C4S 2G0'ך=nXZrhz:u%Fk EΗ'pk3LM6;]Bh6!f-vm_BU^'!PD<J IUqiԚvU[dg v%-FQBXQ0-ZPæ;SbptŦ4[gjwRXG !b:+g 8 6eKɞY7VQT@ZYJIEܕH:*f񶊪 q.Zdō[yY;d;ʰ}j} "ʀUJsHmif :(Vdw(˷U9YCdaG QRZ&bɁ3d,/K2ZN9iL(TIDQ\)!.fCڢd8*Jqa$6jMb[%U#3˗2n뢾\U+<TA*@2P&:#:M_!=haf;mU:Q%RczOYcirre^LI%sl8IDiЕ5[U%KdWұ#只(OV6XUG%c)=72>xZA[k2 rR ze7DFOӽzHUzeVRިX4P{IJAKCeonٌP*SZz X-%GfA4@b[8'ؽJ%{}ېHs;|wҚ IsyMũ8,%֚FeP#ˢ6kYKz SĎϚq-]1>"IW+dh8gq,zjjm}g5\b,模1^@>st^ScBY`lh0^ K1BzSn"*bJb8,K 4 PJt3rYܭijl%ךT fݰ, [jZ@=3*nfc ,uV[QȺP1T:?i5Vsa2B- /50\MvqVR55 XB\yK"Gf&[n+ DJ {NiB'CZf=G; h"d@'iB{YKm\4¤nV ,.%1jSSeIbT_fс8;CTև&`+=5@ Z^9H~ =r"R?0ra6켞_gRn5X_9 &6:[ۓ2 ~~C$&ygUŃ^V_4+h=ڟu^LB "(;0njÙͳz$w|KN;(%F~T #KH)PyEĬE]XM`kh_lvR~Qx{*Э1\m;:~<],$鬾43eMgV\jjRQQԅ`bYiح$k5<#@,iR1k~aIMBX|RIc :O&Q뿾r`vG43&.^ q>PMU s2`n^?&ޕJ;( Bd`9ᝆ\N1#Dqz}_= 3Sǔp_Cq#Q` \5sG11e^R(ŸOܧqݧ? URgI.x^?Q,hwiGHJ|wm4-X;1M*Vvjqʴ9)".E~)P9q> w(PNސ>gD Ha硚͚4u.v0stK7m7D:9tӹO9yv&̐iԴ꽥%th9t4-?aKb~2IA\4;;I?)uƋw:58.DV5SkqvY1ý8>koF;.+}{"ʏ׃tW|gb9#L)=:y$NH:;•iYyFw xD~_!\2Ȁt~qzo0/MǽxU/Q gGV,:cZKG|sRO.5PPLnGlkm&>ٰ=O57<t~=?=v+"xљ+/:.]=YO$;Yο&U$P|T #2)!~@hxb.`+,w Iڇ ആ HjXwhtG`SM|fsŐ MT$hKQr..uz%Md4smH4 ܟj{⃶xq0rR6p&q 6GygQ[--@Ƌ@c,%Kg硳y4?+:WK'=*}س6{C睡/-a_Pr!rߙsu5Nl>)3fĖZ07R<-GJ̋)pj`=;lZj;b`HPw8|) C@<LjPT=|r֯_sp|ݝBYPɻ)jvg Nnϣ/S L#` w7=5w+1xC%s뫹B#wkbځQ);`*;M s|bKk+rq!qAs a%f@nRGp磔uN9_NLj[tf@k8 = %cH"vq^ 7A7u!B.Aޯx R3·(f޹c5X)z>0 |gjx qb=k&ɻ=f} Av\Ν{53vVG/|SA!yt])X/.ةrG#hQSd'ː?vNiʸ A\qcpHO8$$âbp#/ϼ+"Rw:%t5+J4k墨 rZM߻C3 _V8w;A+Rܢ Ǘx!))u#–gلw&Lv vޛͪSᅔKKN4&>wcdKCG8;PQ/CCv;,\ , Dèޮw!b3*:L;Pp\DB[y87]0(KQ0BJWALK# ө#C<|;XuT`%Fcν V!uFxNKMN  `dj~paI|D`pޅ}[:X!@`LYT8&VȾ!#0&ɱ~&üaプ" ,gҢ(?#B ]Oxk9nKN0MKo{DAA-,(knY!@QTN߰ >:pسGG[\dcNO4nꙅ?/-9>s䆛۞dF^֔*`ķPؿ$9nmijWb)-v̆q[)2`q`[QIX H]#mׯZ0?|5x-wNȯO=}Fs Gba'M{ƌM*;,oN0|4~C/Œg8#bZwX?;L:ѐRQr$7 Mh^wǨ3 JȈ1>Lq}⡹~pQ,rB'= SMyZ@RDӻy>8 ެPn]Wuu# m/{>w l!E1 ĉq}I'úTDe):P{ڀN1 a? [2b@?>-%vk}ꗋKu$Ϟd8_WIG|^TRs-%X3r13{Z`1E/Lg GI`) 0'9%|zōWm bmC!N^xT ]:>?T3M?g:Dv*\mۉ4% VN4[s낊 ȯ$\r31~]'t̀s~/ VH`@)rsK1E7R\OwBN7o'}bmO߾)ka.2BɅo=%DxXi"Ti+gƟP) őgc=% 5G <aФ5 1>#t@}/pHZyeMmޞTw/k*3Z˹{Inh?JH\47ϋB}:ks |6X:1kxTmydƠ\sݴgnƲiܖ c3_?oyuӚH)Q`J)ohj&K`B1o8g f-҇ >6lT˕%HlŁ*Guq0PaW3 9YvL1XdfSVuA"Qvn65s)_ZbΜM+ [SG i4KbmrK(yP.A(ZnRO#/J{.G$ \g{E5VOTRivƧ8j(p$2.RN+Xʦ֣r8^.> "g5lj9FldC) " ;\%TJzBng[I{[SVFk;'mk6(ZܲKQjd-Ɂb,(b]ce.&ӞX54JQp|0Yw9l 5!Zc oH7i9rA16fJ" FUܐ!d\$ij^énx]0ŧ=Mꤙ22/r4N+ a71dV^Unf"E ^ 4S랪d57IeVϴfiq<(z͍hNvvf K[T8"n}ݛ)۵79Lcj/,yuڴm#B`6d 6\oK =C#yC$*V }t0)eڴuq;Sv]JEsYT{?rPe=(t-&0p-^CGrZ{.)8gFwZk^syӞdj+Y۬xt5K-E͜Wn7#n$Z5i2zy7ʗʻ8(m +Ӛw;RX!"#irHX:eh FrGA]rvJ}Wbgͭ&Q  ?XZ-6 =^Jv"0m [@4d oaOyQkך%[];'.i*SJ)PD$Elⲳa c6%iPE0b)QDHݦ`I{T=Jbծ?TC>֊D~2K/{i4zS\yޓ!gE]* dY촎&Qded.ke i*UufZ7v`I.9Z;B3zFy2xJsG KRk[!t]ixd B2$w4NOiv#1A-,Z^vV;ۥ٭-w:յ`xDHj0+jiI7Fz@ ޮ6cHқyuk\,}K Ѩ۳ʼ3[iݶbW6ٕr ih!P `#@|nlvp5-6F^h54✅Jr4U \툥\&Sbʶy>[Ud1 ),g6:|ɮ/,Ln3dgz36EechIFj62amr盖^s 2< $et PH;-ڇ*ZZQ擃"vd$q` ee.15uZnW8t\"GzѮ!bI.XZ>ͶTnz#ASAݴn,iZwnFo=2f&j^@s1l$ :+1KtVߖ:vYO vPkkҖITkXP̆îjvt#RsEP2(nw#2)3L綁$gz{ʞ5N^D7rrn U]6>2"Z^qQLvᮮ`띬%KM_iH}$tU GD_3=f֘zhܠպ(n.ݠ* )-רW,T-lI*0rCJ#ڬrq"G:+E}lڂH@)"~kww"%am^SsV͍{xfưL0ov~+;¸[[E-;,j 6Ӌ-׼IP٣Xh>W{B_RGT67nv'y)WZWH?ըYp܁)zdU(钤T%)!\kҳmkifGu]VIdz>Z׏m^3;; Ze];ZE[2j,)) k8t&mV?<+=bPj]Z'-klr܋B$ZbXYuwͶ¬tSVƂu6z򦑞UD$38.^P q+#=l4k]c`d&:eZk}` z&-#a\gfqCaubʺ#[5C Qi]W&]j~LfYjwCmCqj=#[϶9xqŽܴ˴I#s­PӉWsl&fZ;kxgIs6CI.v])MϓlYU䨮\UJVd{Fa@R0}2+Asbà^д[s+Nުͨt;_tQn Vav+|=vSObgW/t!?b d<(J}!(}C2|ޤXk]T zvJ3K} @Z{ZkD/5n:k1f"f8F՗"}'"ސ$9]"[8($&خ |vzaqfř6/ w%=Wz/AфWחt"m}VuՇY!ّXg*]h&]eHuOo|U+O6E#$xs5nd;{ /]Dqͻ{ct%MN9aQ=%a'~5V Ÿ ئҥ͖ͫ*z:_># xY~O쁧2iMpG2OEnQ $1)arS=$Y#&̜{,I*I'}x >ؗl lN7a^RPQ2qmyjrUf޶a3tǽYBaΐ}C,Q(n{demƨ@ G0qHN^2\h@K ;c^;C "qCI,>SSΩ}%NHzqz[9J ֖gílImO)ɨ.XaXjY8V4*$mfl0߫0-PS聾8Z^Ps4ՏjDh.]xyv|dś€[>N ?.$hfQ^LޡqtK׆+Q5yM]r,·1AxgGjja6/?pg&Uo~iVaP ~1Oб892\@tO+<9R 5$d տӰʾw"RXuء~ um&DZCڼQ9z5􊑴R _}p\@QN-[^$+nJa=ZXC(\=jhہS0 #=bbhD h~ I]#DWˢN(/*%+"1 "Xh@PźX$2b$(Ej0<h<ț0X3 7ux!x:KS. v)z1 8@]^_TP@i zY|j{/zt_ޝ#_ ´+l!KC$y^oE\5Q4-J5_X!:[4q^ cbw;mӗfJGZ$ +Igezf;1j<:4؜A~}B[9I뚈y5 [7~0v.+kT^X uOh9t*;-PŲdK=23:2䓽pjY ~#' ~ho\Ycu ~Wry5SΉ6ΰ*{烛y٤wpFTSmʾ8jLsf8̋N7aС#O!zU_0/\{s󾱗q;w$)3~q<7 @lWsQhܕZHBdY #{P6[qh3 a9Z4횿tmן}^ߐ\ܥׁ}#AwiT i}o^03obRks sP > PqQ:S;#KbPȎN4\0m׺ex|>]#LӾa|r* ,4i1w6*ݦ"W@e:ϠhxS?|LZJXР4u@`$I/3-#)1I}kE'tLu-~34 ֧Bbiq5çL'VHr5^8'7Zf$[rC2D_(@N e^{S(׻Uxft+*14@Z#mrxG-$H0<"g2י»;*r^ßͯ5oӾn92s={Ԙi$E, vGNDR[erݻۏ0!<8efedd#L|]fF[w4'fm[Bx-s;̌BZWj( GG\t}1rNW\d(ƴi+Og(r(CAՕ8gޖquؒ?#J3[8,s\:Eb!$~[{@&>%'i>CQ㾠AU'Ǯ}CMkGhDGG'\S_O#d?@I׏젠k(N'W:/ᴀ2ҥgMƕ~]poLB2ͷe#+ڹ7};(^yɀ !­z"-K7Al{KP ;S/˞lƧr#j(Rx=֣7ȢaĸJ7@ofN_\C應aq sr`{`n Qؔ$uR$2Cimul$V,l'-'}Ͷݭig;mѼ}̸> vAObi#)+^Ȕ;< WZA2 p*(f@0oP^&,|8횼Z$J(Ƭ;9L Ud' .bvq2+}Wlq_T 0֙oV&}} fTrE0@ hjhmm~;Bߙ;M4n=un2\9kQ-KRpSpGM N=BmC#ZjQ?s^8,soI.kO~)& $H병$X$}Yܱ^:wZμSX "À ؛\ۃI0RLG+^ v) -)Dڅ~fGdl+݊lqw}•+97t6\&`c5IK.*Nר1`4ē )eRG+3ikqԙoNL4OuVƈ_d֘ ѝU  `ح\36͎Xn[f>2 %B3Ya{/;  ĩEU %"gD'l81rfœ㺔A9 Y0sY3"ZP~9guYibFHqljo@_mx+CGV$W\beB5u{5 Wo$ .~vqMr! HڬM/$K:64M'&UoC{b| RȠ^KIy??'9[@Σ[wS fzsHc8ňbfȀU-KVPY+ZG_ Ĩ N;??m@I B.\l7En'<.e pfMScqwqY3$*s=pML4F>hEG'@Vİg챬p`,yP.CV/ ̯NQ )W[~c&:3O+R quxsۜmܠsk,Ej;1얌Š%E2e cl֏Zwۤ49.R>4ip WBTz`Q䝗 vAęmFnw  Q`&^鰣-rcå|jjPxk?zB VbO&LեP#KZ/D*jXga4ѕCsP=tf/\LYAGs[Ax,VBʃE*?K^KI^4~:NY]jg~la1lWڷ[u|EQZ]5. esu1E:K^=l| tN >՗K~gIY5҇}ZYw1St&vi )'a.thM~tGi%A|aqFbU=oi=e!.86pYDX»~zߪL%k2N֢T}ΝR9^ bz#"P1R49F'L3}X~?Rѷ:NF).q{]ej sMܢeqP*T˱CrTד&j6KM%qڻiL>Mgì8P^9M)_'jqvMteetBK:V + ܦO83vg"+PaF=9Zań2%Wu!+^ ߡ.dXOVisE0#u̶RU|"֨D/p_F#`&~Pnl[bxw󂯣Ӻ:=2HC ?n5ӗ)=50\( gvwk}J@*X۶K [O7xP]ZX3%w]'h %dܗL a'FTIZ݇{͂ Ntֵa r#/z춽]{5]'Uݪ\x2]s\%fy$nP& E/;{Co@g+Lw&&=>W_dՠ>s hh3f8% nh_%1:Sb-XCi![ n^cvr`w,;~t룽`Wh ſ<$JFmO"oV [xI|HVD_ bq7*H}J ~Q#éahv3ZCNDtr 7W^ƳD0FBhP_H!  KU+̏yuwIdX/ˮE@ B2|"BI*, _uj%!&X6+ӯ<4T+Jn{hZ(s)/*"N"BRwG )!lV ЬlG qQ $x=*p Tyhwϵ}=ȏб_tG0X^)Vӫ(#8aNLd`qʸZ%Iuy]Vqu;}D̏-6~d:mq/ωn+L~mqw/kZk)zIĮ$/)H'?gxruwoM}]E@bx9-typ7f'uq!dA u^ger.F/Auy+尅w`K\_`Td = $_͗(z;]0|~4%o r@nE}p傀]c9~Ɛ\,ә--|j߇)g~iIt o=Wqb)g[fx8$[? } H#/trP0H`@ȎJ``MinY2k%Up/s]xe}Hv+/FZ6bBvx1wצ"eYJcئtR!Hr c:\7k Z|( Y+彮X0jMdWa Ć2m*Ve#ۖm`E\תiS H:d/ɲ0_cv#eKw}+,ߵ  2n AX1 r| =Mj/h\'so80;d;:ZbǺw|7s;+t{3r2-rGBJQ?w%,`YD,V+i0Gx|rxR[9"iIf~-eܴ$knջd_o]+?7kgҵ W Q 'a$wgl-A;}tǕֹ fM jP4ըJA:ɰwRCj`!A="Ȅ!tmD!9*#.P0?a{|7 qVLubl;#BY3ܶ+$ƄQE|P@b!>뚦3Oeq}e^l\qRzXc U8wyM&dXKazm(O@N\yF1F~ S%YTrGJ%H&zhL|U sь?kߏE!Jl2I} Vc!v剬!ԏw>Xb`J7 9R7Ahr,~{Ul@6WG}9>c 4( u>+PҰ5Ս>8UO{/i)1-)뮞XbvE*8.aKqzu7/m=k[P2_,A {7FF%g~lʡWmgH͌D „7h]з=tA[$e |k&f{oRlNI"oi1q{J94S&C6ޏ~I˾%zʮ J56a5 d{9/!,۾8#.mm2eNstrЫ)ҭJ2x鑤3rh_ 39aF)-e_lmoX@ OmPg WIQjK-֝q̍F- yy‹FVt.}XPlKhJ5֫9-/=Ԛ@ )2bɉ`\O}5ɒ_|X3~LUeBq ՚-q-cҭDWj?2b~f5Zq9#ȞuRkzBVA]-529Ӑ%܎XRm: QcRvn )fЍJ)x@S$ȃM/wc;ii?' ׿䦟o'71V [䦔ߚ{zs&]=maU<\T [(;;D-}\xtip-Q蚽Hh֚}HdmgosF zFb )Lod %WF{=eA2'oM"omPOz~lG^" 6ux}s+<."\'O]Z=B_"{;f%];.NE9Qm˙/D0Ժ$VR1 n]Eb,#5 Kں7j~ +,*o~إʲ׿?Of-[t|b9VYɽ>u2,Ob u5TbCn\N_d VhWŷ9U'*@{;ގZ7FE=.| I[~ #$#X'mPY[P 1GqbHaj ίU娍'Ѭ;e,^Mgk"(9s>6dE4c2MEx@6)w}2?"yhݯ}ɢR,b%P2Xِ^Nrzm 6^[nJ}C1Mop%AgӿT\L^@SZOB:OmZ. BW,5DHS;l>m|_ .QxY_gi0-tS[L,ueEVS: 9x񢓛h'1t9ZCy糰d"@z&#^Ե98{ Y"2Uk|s,qRl)VfլwBx]64VI \Ki» 5Om&& \|aN)_Th=]-Q$*}WhCKymZ-V02TL氿XsP2S;dT-8*6/ƆHe X&ٺyE}eF-Uȫ0א`ݖ6O2*;c7/gU[sFDVItsJ't%dΥ"SqgsyB{#x8o&S+)ݙekտHحvKyojL T/+™L6w#."|">WAA1֝yi哺.+&FL1dTv#g,g s13Xrr25ynDzl?Ix+UYV`b>?"^-r_%#B$kƉMn}ci@4`S-J#|mn˖U+}ݭ !@tUBH p㺂(@ ĉ?7o?/'8AT}}7Nwm+W\\ m0`Uq';![&6L9ݴ1B.X7l[&&n[>]J$Qk#`%![5E2eVVN5k#b8jZBwpl1AU-|S_28ev)pc4pV׵ ? v#TM f[]/zL fbRèO)Si3^D Tj˾5)j Pce*S3c*r:RU"2~ .hVœ@;V,DR`C/݀x6w(eeLkM 4Bm6Ԫ8ްBSMM[MV,29 S|N,7ZOWE*p.235,aGcZnuճθ5AʈgSBWţ!3H$x61Y2MէJrl.%͍^/k.$1{.\,Uʒj* &Skr#)^skbXVNa6F=n[0pȶ]`zAq S;G.-jNFtdeo'tG@uh &f]"L@M2pY㵁t'b1xP*ڳpacy%k9l]c=b OVGl蔕HAM7NM+G')7ƪ&#Pڢ ,4Vk2i!֜KZH}ULߞT V^+YRj4)4e`yb xǤb04/cj/xV$gJq][;By.HX6˻HTE %譻|9t%6f<Nj3{MʅZقZfG5GpR]$,ǚhEv>Y/!tE-t:]-;FE{Nio2 2czZ VKFXW r‡㝄4㭻X,RͧfKJ3œU:g[n?[ *4Y(n8DѲ;v7`Z*u_`H;X\J)!ܟ %pu3Rs*1jQh 0=zIO7x}cI5 1gK657No޼[ ]C8ުt>%Y6RP/ؐ3j^kʚkk"P\ٰ[\jS ZjD9usZlYDc5`0 Cuˆ+%}ؒkmt$6c8%LtԶ.!ťLb)0L[^Y=nV'.GR"+DN#mؙԡ`~2S,x$jWdA3y-˚1Y'nHԮxSjm KIٽF\]9VVJOh ~*E>~D %.ps}s}#_\K!,eP2!Դω%م?1Ӛ!=0I r IN mgeRhuRB,t*hV&UUiT "*ºZB.]1jf8l|S-Gcr4BTXqequ'%Nyoic< h"0D,pʄYu[5CՄ*pR!md'(e":FuUn[44/t#wA ;vtm]2 ޖ wLvH FSʋđk5l>J&Z uԀ7٤DtkFWk& 5Q:Sr` tR F+%czj4 2w2>״|g,B!Nnj(onuV3k{#B3tv"/:"hʠ&4G(J0ehy]4"enN`5#15gXzjuxjeRt5nb{4qjn$)Ѩ & ]8*7H+X1tKYwF;I߲+M 𡻭M?R/5b܊cŘt5qhr"ͨ=&BS[Vխ Nz8r`h v9+{K5=Z Cو߶cy o2{Dܤ lV=xt_v0^hQ}][k*Zʥ^ZQG\5h:lsE.\lZ3] YLחhuĂG cv=^OMۭ&үag>IRdxBJ{84A052?.[\pL0&)oBDeuCSrqi|o wol򱭿A*SȳY~R4inq )Đxlov2Vj Vi},fnIgBg&Y&s^)8\`Amc Ѷr_:N6lWdLI=jH"8'XmDҤ6ytsijk ԻЫդmGb(IX+;E.EĬP@㮓r6e ǡ&g*AX 9=#Pk^wнX۶ w815-.>>\ ]+^jH!^,'呍ʎkqrjby~- ƘٔۮiN0*:Ŷfz4aoLE[͆⁲8hb f@+N e$hP3U:ڡp%CtVTiꀎQg]Հ+;mqn}(:j3p4 ٝ2k :ҙ+>m6EN[7=vC؍frySRaqjQiA Y}:rcRbAvvb{lqd,h l`] H BG kh;%h4Za!\acwS16pxUI ߩC$6,6-q;G]ϜF 6qSfcšPI4yUШ#uD:4Ԙ1 $F:b q#IՆ*p]dFtBngL-9H @FٔaCC /5t0v\npLx'j`(XZ=. *VfL!SWp=DʁjFJZi}(1„\ln3KW j=]}X5㕢H:+I' $;@^rvu%e&BwDlaVə qr,Q!7Es;Mjz%F [4_TZ)6G4po*;ShkTH `#݁0vC"\H#|N2B6u*XrEC29Jٱ(j /Mj PId$sXdKx**.QcZF3d[iy)u@Hõ+ ӵi D|xX:rUVBdL w]=M`tRebװI< eb z䮱ܸ0tk],+b:Z%ʼlYV,LBRWu$[hmW}5icxlXB#ed3p}`ƢܛyNn#/\&dMi%piD.d NrgoFԑP,=lD lrSp([ deY6fe2YK)%]bDiz֡(*M9!9ڑ~\-9hsIYnZ]yP!Í^/L i¢j%860ܐAGÑwv *hք0|:@TᚙTЃG5m߬uq}v ⌗0!D\M[N#pͺkL9CVV4w%4 M@uǞR.Xh-/vEXza-RΘDFB?G#eg@Xawd]_&U)@칤=Ś ;scTBW hObG4%x&-[R&r&7WIlĜY'VXF M~OD#|W$9Ѷ*qKIrkԛL_ )I{0cOM2bTTZ-j-c@U06x ЈH༵#%xb&̰;H$v),֦} ,N/阤]2vue^]BINGٖst,1 p: e_dЇS{_]M}-p~[gbG%;ݜ*=Kl#+zv,])q{/%yM;/~c}U4)T̏_1qѸ_^3>{o#Wr0KZyn+Q Ш}.;R6P|1q-}h|FO "O͕q4/of0DJ-׺JTJf eroݕɿaxKrQO*WK *5H)GpHיxgA6i vbsfp,0L^<-#Ӕ ڨTRk=9pVrZ3]sݤQigg#6e?F >F_$Ue'2=ʘ\ꎟdrwX ߏ`dWׂM.rJ?tdNVl|%h-Kl~^]HsDF@>gl V r?aTۺ s1&N_#Q CC@}9JHsp +$XO߿A/f|4ycw%i]jRɟCn|miVSY _5J%U`>0\ `JGc% PNUW bC'{irxugj)Pfˍqse;}h ~g ?mlkqSX6xO=9o%WρY91QWݴTU U|/ 3{`&fFAݹzSXa?a_)a@ZI17eF~o9>Z=?~&ԉGts މcd?*S{NφK0)ywKex@/HX1O3so~Cq|Q-]UF|r~aV4_ߚ/{⤇Z;|5 aUd0&GjGytI79)GP/B~XS,3Z`Ϗyt:^V3]T& Z^췓Ic{k˃ ̄J/"gy@iqR B-\~K?'`j( )dJheQ)ݺORΏGg"g ~H'{WiwHH>.RN"gDb+#◼ԯ_,=TPG"i-bg\GJte3wlA& .;A WD`M)^l/2'|gC5r&T@Vb6s!D7mxxςflq6:JmN<߿iwŏ}}/n|C‡jC5^5HqԼ&'jҠPcYֻ̝}rtcaVJ>.&}sO߄};R_oY \14^ {]Oy)!9-p} X,{Hj79M*9>Z 3GFٷקu!2əyCL8dN:xTXQ@DW ~w|I3ٯ#jz>Qgg\mpK19x855cS3Y$̍|b}0kC_KE%ڕtB,*IvT<[^F.R[{1Ƕá 'xF{ ߎӷTȒ Q} @!9o[9UΨ`іs(/V-a{B] (P&5sعxsYDmc~cu.bٞ*\7c)޻{y8xoR~@x@\Ǥz;%y۹wy9̧o><*b~*7P.Ta6_Ώ¥j!}q I~_-h#K KɧlFLi~}Bܿ#o@WwUkXCkhrq[uWH3=,sE~p.YnqR?Efiجwkʝ]~_9U<HZAdEzk zJmby~NnwօnƞT,Zfu?A_7P++A]+AeQt ~6Y 1?Heвݴ|l6F _ XWg'(^p쟊ΦRy?6 s`q/=},$Y"ǩC haǝzrwI VWC J;c2`ҿaQ.Sʾ]nCFF3rbdHv;kE=CU*ߟuU`sw7Szl>s ];Rk%~0B5{Z]*@ NoJ|r6:Y<WjA--^U%p8b--:WLG,ۥQniY琝"~XR-lhkwOSݷ~6= ~s k⿿&>˧״efBj[^}Fs&:Q,R*C%vŒ$_ry/)ˀm/ӌ'R<3؊]'AKg2Ie<>Κ^" {}^(+JY4:(I@\זRdG7YOVFYYʒ7|eh-T`k?Њ} ,1^\8bt՗$4C,T_iLҳ/fX>?E(hyΈz7k6~ojA/ݫ8'yy7H煓kw}xyc֮W}fwzmwY8?0{y nY˥u=8''8q_rx={*5B5zYFs_gjF~*bQ.:qZ@[E9T-.Jg,ޫ bًoqKV77-JUZ4\e^J/JkhٵBR~~:MEԷ͟z^r]M^-U)ܘj*UJfǑ.$bЭEuCj~-2|T2`:i\e.Z'nZ̈́ў/nŲJf${U.&W ȵ۫|ى 0F 5{\^۝2a>LJ]=QHӰ {gzQ6-H1I2J,!?,K,Q,7Q3̨Dz\vm"Y;3{WVVqfP oݮ@!xh&C"1A^ ׉fy9v8 957^%znzLQc%0#giB#e l5]Uܯ7\bgjE%LZ]]hb/?=_'gnkTO#rݯNt^0a R,Qh\ @qcv \f!~IҌlOէuVj𬼙\17 h(wH/,2Y5P|狦Y]`Cm&X.MLeOh+4n.lX30TjOM`~QZ-Xxr{[?STyZޫ,7^ QJlDo-*λz-Zkhf-2 i%ƟGXkzlyN* *b ]u!t6;O';f̂lAJ*HNP;j"'ZiMkp"l+?,:}KTCBaF?@8ޔФz }IDѨ%/lAo~S]IJ .m,Bz@T5'bEn/MȘ ߳GBڞxju-Y(V/oD"l M`dϗBhW^ydҗ\@jDu( S:NUV|\ 81#By>721Fh~TQu(+4+ o5Rnk$hkT'HԪy^HW\D+uJH\#]|5A'?}gJ|)6%{ B B%b:'8"Gu1]7)(;+Nyߴd1mt:}J̶S{A L]^ /u_hk\uzY~)t>w&%gJ:Eq5 皝'n&PEI C㍑;/n-+ګȫltni^rŨ P騫E 35nL0HS:S\"V.gJgANn18M^Hc܈\15 +">优˛bO[ K_GD `IPCz]lڀ"v8+<{|URzKl/ [4Xt\`G1ifU#~m0y}={HrTR:Zިkv#nԴXrFa6PM<( æk,D0n ,PMX Xۖu>2D1r -\n-|z?:J %dlK\dC3->(*y4˩X^o2in+ŘƏZf?+R@F[Nv2K0II mS# t&PPq"A38W"g ذ{*vVGSj`qVX_qmG'UEDe~X(:Q1otmRJs2Ç{M/e'p]^nS)N^  8(mfֹbl 08::Q9<D0Gj4K*[K>!QbmRmJR[v]QIV.LzǶSJAۡFThaËARvQeYS6ttܹs%qsG fuP/D%M`RV1=~l UR;ho:V {r͎_,pwي7 vAǵqޭNˋ39NT8;&0UBl'{+sZ1 h ˿ԩu"lP$t_[ef&oO)O |\}OG뵩>{My zJ䈗o4d32-G&,H\oabxA%.Hfԑ}94ɧ5ǥ|;l fUXEqln PMG J! ]=)d؉DT^: *j ήC\v-;5 mn Mڹ[@ Jh4j4$ԡC 6BglG^>YNu/Lm*ѝ#^gO\g 19TǨĐ*px׊u3 Qf\^tVj毫6$K{Szv8XLgn*}`fgazJU.}ZL2* sɉs?r$s uKI1Tk  *N/fJP X&8xJ=%5m[J)?x%&Ft*s U~;ZQ.;#h4VaRØ84Upk4Fu&ܵkǜ/:Q=u8\ĭU6 uWti}i'4 tB`p9 / `yo\GIVU G( PZ2a%ab ,DnNrHy[;Bh<F"T91:D-|'Yف"͐3 Z︎ZdG,?5G$}1_1 KPMNn*-<+Ķ#BZ/K( 3 |' Gе_`Fyz6 gfXm3 fJsf(Ͻ%& C..~M}¸K 5-/T|>s?rW;>EA"AX⅛ !m5*$+26Lڌa'`6? GnR97e6vkKj H*o *cXL@uL8R"iO{4q_ōy]bZ4L.C./:Fٷ[oE6&j/ yw[`MNlPx+B.bܝʻ;A\DJջbOLjzVvOGO/cO/bQN= !k^w 5 >?|i}P aN2m{Ǧkx3e|n5 MHkByu)9ɳbh>~vv6iB'TD~sw5 WE ~ހ&ŻP@`IPKJءݨalqcgZtb^?K$}IXC J[K\K'4eپʷp]fl ^Mf+EcI}IA27:n1AcNcCkzDD"%a)Oxٕ.@ UuV )R('M~#ű O3CrİQ~E35tB"ūs-ZV&M" >_u7۵$!qcv^1p QY.j*@)-r!q]AvͿVPTX5M̵66l rZnϳa> ;3a)-y#wQ % 32x'Jm**w맒}3[f6-sٚf{jU ;n3SռZ/jӛٲv_ q\8Ӡd[NDksBtԗm!" H;@mUJvbҹ,b‚}T,P1G/!xAع9BEݳ޳g?|Iߖ̯+J;B;)˕U:=W!; lv>LdlbɝqUu&Uu-c at7B=f1 2SU%Gh_zQ%L;OEp3Ձڷ@+ۈeك}`zw"Q"/Gxb+%M$Pr2k27:7zQρ_9KpTA-aՏ9!_ՇT`ǣDPm O[wd3Df*M; oaǣ,X6`2E7:|n+ax1*˫WBJ9sBl4?),&y |t;莾v>uO/*NVj  2j1FHՎFZתDJJY1].n>MGO]OOSE_ oƒgGl o}۞Q{ krk9]=qiT: "gg? ibNv%sY6}XK+f7&nkbcv_)4|l@D֘ʨOrO0tM{C:&ewD hY'}c׼[rvպY|`V[~t}S-ѕyJ[ }o1yb8z1 Jخ{JF5!pƵ0m 9v;A"\R):H5xɦ~klbuP~{7͒ݵ);1S 훗hn+&rzRIyOkN@W{m?h@h>]!pĦNlmH)d&WUPaC1B $Wx)I&Ib3>S(O>$x'jLjL w<ѝUUa ^>rNue,IO1;zor}c1G`y˱-~* oYީϦ:V!0ăA4N Ƣ%N".ΦOco51' b&*b&rb ӣ`nxͯK hz/ 1NE &3bzSǍj3S{;nrmOAb&Ꮯ=Nl|~]$w9}'Np/ ),r;x^tCN4YaS_/޷?񛓣?$ˇGg'3re|yD=tP)J!mr2͗@n,N)=Sh_t}\T6w S <ݬnGtZ&ʢ@{s0(V: %"HU[1FFj ru@J PJD1o3%|$<ƛ7v_(^l%PX_-ȯҴ͇SO3NvK~U&@/o>&ͦ-HSjKVKL )pY~&@ϗ0X7-vd_;c"fb2ZV&3_;o6n.573:igGwESHiw9J` f`0lVug 0{\oDG@gh8_":I|HrҜP&J#HM+V\p&M(̌tϙHhfYHGFTvdشEaiCwĞ٘w+CgX0Jw(tɾCIWl@MQV=1A 9JF#?E n1_UI:ɠEW>L"& +1Fu?W$~ĥm$+p6(Y;%݄1ebE7mlv4P$wʬgW+Y͆X~9a%7_?&LƣX:o@Ѹ*7k(\S0vgS=L auHtya\"^F.fNdx;ׯ"[vUt.˓yttsxxt݈/tEeَ ~{ab6hk#^fgm Y{~g~M|r;uWySϢ-x g냦Ms/W!k\մ´iPPVVh՚ -e K?aJ5ؙAlK55󮶯~%ePT@"3UC$MEzTmZ#yyĿ 5d)JYlmD 9 1k$NZK*Rl cK"G( xWj3&'b*1W8ɩn'cV EѐH$/H#>QˣpɆy!nh[a@䭛K0f0x:mJ'suì /ܚ5A2Kz Q"2[ø^;dYM]U,*3rCKuj8F S)`eo^wz9 ]A5" oMv`y!5lk 鼙F7,$n#bj3_;Nb#Qu2E3XTDyp "6q3hj;2, bsJs`ʲ.}`i\˗57)8OAV.zġp;ĸ8˦YE:Ae{귐eٝ(џ6eB@32dH\ 2;z ɲ=^F곅0h#-c57,ƕ  Ꮎ]zV8j0چ;0[کD4KўbvuIna|h9LS к҉aqr<:352~$ٛtb:4V]#'6ב zCqN bA45׺D @=@}QLQ h$C7ԂMUZLgb6 o_L\ Z.e~q 7I5Y.E|A\Wl9cgU: aSz)w+^@Aި#tkl7^Vkq`]Vt#x AS yBtp0.fL8"߽QqAJM]ٖk]h݂metJ)ceA^TbbhcQ{= %s^LL*6Z@mv9_zgo7 , hm6}T$iF` %YYnڻ!"_E4{l Iel +l_3W~ )9,N[Vm;KpYlxF3!86kTk۞J7||i\:ȫr"sC%W'Vq;Q{! fRmv‹+YF'3lZ ^5NzX,O4M$, f,BmG|Gهv2Tt#`h&1)eLs\=],s)8 _5q>lgEiMX6)a$䚐 0䫷C8I {_!uH/e#v[+$X;u5v|T)DĎ*z$*‹M юt>%v\iF.<ѕk;5o2ɧ)1 A- 8b >q4ɫbmj!n kv9"+DD=,"4f7>Tݖa[lS;/57i̼Wq N$"["̮HmheX<R؆{K6)J{J)].c񊺴W4ұTudfI(ZZYBwA58w'"D;S|u DF: +=:u{E_ )$vm_q>vZQHDv5BL\^> :G'w-7f~OoPrEٱG_X3t!5At[1p:B1وMJVn76q+f$w (b0\͘4z%s&pAyNFDdz58E43F{/YxgEƃ+ !Vd$ 3jG͇6U&[>tocs%e<po;@^@pS+V ^'RJfxB yd됫[W^V-ޱ e( 0[Hʌ \?6K^Tu67oB+ #j4yױyXn)zMeמ)Zh ]Ͳ J m: IVY {1COIB{nU0^c /e"0\?kemU3l6֍7DFLC/`}v$DgƖ cj(o{y,t_L7@;ppD|ԍ5!Ga8SlH,rZշtp⍲?n0 %ۇ[۷/wo޼~ں|U{@n3`}8fwYq.=|dy6wgcm7A.K: TG.51.tԑ$J6sVy,'%x2$xrB/'l,uUWuD>U w˯ #\Hh^u"*8M{T’o^fj9h@6D40x2xmY/)!7isGYSX vPi?9g fk˝L!p͖kȆe:YVes&z#5`~ 3'zQ9v&]l/([OrE}+TןW>dUl ^jω;s;zjn/\0XsƳAn% dȔq^E+vZ?[RwϦ HS\_.2an JXn<>;-2TK&=a$Md3% L"2*.eڕm(,. U;*Z㣫nw}x5x[uw*&Ddp%c/'>\n/)Ft6`+u:B̒ ǀ#i? :8rUXEI`5k6'vKl$oSLO ;vpzGz j8Kcf>|(8׈78B-^ ,3OJI&^ pk$ {:I/$Sttf6'D?ggA^6|lh1;a agJnFz.+ku ܥrSt%P FJSM H oUh;^ q}Fc"3)#}56j7Z]js^o#6;oCĺڣ-ʗ@a~ɕޘ3< =0Mnv*Ҭf sa+\ʗx>C\=,Io=Xv߻PЍ+8?W&V>ހ* RSƃgDQ׆"vGaoiK:UGw* 7̪6;wm2vQP qQ?XB#EkEsI>*#~JE1F_.iƝoˆ)27s_NhG W}b?+}ѝ dc=WP_xԌԍVwyčQĎ nqA[ K܇}Tlvl9"rn}֙䶘R{l cv{o+5lp<;z9.B~Ҭg%k=洵_< ~Y*!a^Ś4A^*7sG\nwBkcbưmgW] kQ܁(ވbo=١~ӑJ|ā߼fDWOnG扃={#|/t{;v*{@P!H5U[;S;Z؅t6;MoEčM(F`6wQw&ff?l2Q%'Qc_5IhP.#Q UgJ$Fv}9<>Ω}jFMn](. {#ig`;l=$6/n}DŲtK /<t[LJ)SjC¿,tʱ[Z/4%o󉣙CG,w;LY.;lU @p=0SAiXz F>Z#:jM瘻 t]me_| qGGq~PvDMtCytMӍz:9 B5>D4O} J@jK_U8ieh7Ļ B iLE ek#`=ADܸJu\J͡A=@t8#(#ӭ ޥosVޖI$X0\JgU[vsz % S?-"|:~(Ƌ)MY~MǏz*Ôf㸱c\_w2ŃK9&hTh,Û~>?d%xFOJ=޳xv)SC9Ty#P}X+ipx|~1˓bm>Y˴\Aoo xKY% -yR8|q[I -0,"ywg?7zjmjW"^g02ˬY2:ЋvF+@dH'l2]x3E+i [.W7k<<7Z `f~f+uy%} cP?eZo"xP#:p&Ipb,kF1B2Pشk]ESe+:0'x:Q:Yg; >͓c?dD>w䑾Ի,3tim ^ZD5Eplz %-A8poʐjOic%p_ȁ g|yk-Th#SHDh#$)(am ~Sk,m*M9%@d`ښOU%/nPvd9hhCuSsUsT/lEQƲytzxXZUc`Eb5 PTi ]:](Ys´.]ꓠuN1@KHF 렜c ZN.< 꼅PsP&RaBW W9\ k#㠙jP/85II z[lBдߩh-fB F] Rl3OUunkGbD`;w s9f8A~.;_}Yu^H+>O>}:~3w)~?z1<<ߣ?}ѯ}5NF6o6p~yv2>=u;|>Sd Uk}TNt% ;Gh•> s5O]ӧJF<{>c*kӺ7OT|N#&K; `Nލxt'OjއՊWu'؋hV iGg'CԄc_>|<9=}]";ڧ Ӽ3E'wm&.#t,'"*|Ma1|^VZ}guE {KPdžTF=VԮfj-Y*)s..Vzl~HquxU ?St2a jP@PI9+ $ZE`h~_q>P?\9v9 Pهԟ-8k"3 O9l8mo @OL?1;o`;j.v|SVs\ڙHT(L>CN ڊ.v[ bC}j?{= f3'ucD#}ԢA6aDM>o.N,61 VBJ 8AnwFv6RҾ`L]լjds:!OͧgE\dxP=Yxrztuy ii6ҡ]vv/فgIИx|ugv_WJ A6lnOUƟâ_47 J9FrPgI':ِ=j> HâYz箵E4bUTڴYJK6j6g='L~.InBrT1yhB\1! y0 Ac jY i REZX'BjY}:K!^2cP L[Lq4&8@q8"dӓ.A񯷦qo&1$( nMzB=MW&ƌi_R*j.&)zI3jj5f*h߇{lgS,nLA˒$σgq:H-Y*6YbH'A&Г 1?%cT̚r < (3բZR'7QQQteo\4Z4r qM}y#oIy5[9<-K ALnJJHk `'o]0Y|$E-ɦxAaaV.7K%;4DIM]*"dPCE؜I3l^ul3}UVzdKXe CC+` qbydkV6sS(s{pP01AX|:^UXOې8kR$lf6#)C%m!Vn^[ŃFJp{ZpEEW$jzu }^e-􁵎IV-;:!T}hCyWۥR7ٲ"-*woZK/pZWDlV$]LSP@?Hð"t3]" *X;$ G8&1^{Q TWLC}e0.:f?T!8_uRM\U/Hp`MX֌trr,W:!-}s8AW~~scuy9n3<$@2rGauWd~i(4ghf##hܷptY{[Pq38y.Clj5/B">ѓ #žchG8ڇ+#HHLL>7υݗ+T"G3ܻY=Ik >#0e4FqFZ~k[Ȇeuαo ۡQaW-c~ʯNݛ3q]ӄH${L-LH4b 6A.\Ic=&F‹r " TԁO+x"5'M헤}qx8 pldhC5ziq5ebp7vFS SYD#xBF+5鑭5CzDnAEݒU/]mi &Xτk0dwx!ӏmr N0!i*g$qIOUoSč3>Qx 웦 ZRY+R*#9 gQ>~hφΈ,Ɲg i v܂֍0U[xxVq(׫%\zs mp)`lF la^9+/W y-jr!G!zQP.cB Q8 =fc~jo{fWgL6,M_tu8%*0ΣZ ?lq~HtH̟N^d|vhy2WY:U{xVL!#;'g|<_h_>=;zw|6U&9ydz0_N_=y˙|x(OT8UlP 7BdHTϯ(ޏ;a,YH KIoKP>{g=BrF? _>|xtT7^LjyZU9`wvRuDx8F Ƈ^M*xgW .?mzm~)kVL#k!ۻC# 0pՠ]q&uѲS|ݛ*1K~{J8{a?~뫲P8*2>;R1>r`ؤ^U,&<=ϕjnUՌ+PpQ>s#j*M_K2@(0Kw\P|C;zTN>*rv&9 3_f r$%>J/S+_U{,]yB/18bR_kGMa=yФfR2C}+bFb$S iMU]7*Ejѽb`"k,o9 6㏻rSKD~gd|5Ij2vkQ2V!v]+i&X"*~='/QjwX#0m/Zj4դ݌6HaQ@v[hޮ9w{OF0Y\L:PD ڜHtCe}ʖV&xưdsJ h( o/KpIDӵDp UjQ}qCS*K|U?&P{+չ<{:/௻q&)6Y!u?ܹ]4t߫,e6ɧٴH4B4d]?`⾁XM(YQְ} h6.xH/mp|2u諦NJ@%fŰ.f~Q(Ʃ=JM蟁IR 4u)R #7EA H@\qFxANbE/0T#bg})+bK<)/HJ≴ddL;v7% cPȩ $P,x4|]9rSޥP_ !/Ƣ?XLC=uk'}CzxrV3'N(k6ϽRJDjHFJ`(t =<]v!ᚩP~q[.h^&b8kQ_q   ;Ee>2dߛ쿆^5{4#IjkIBJ Cڻ-Hy o,oT0Mxʢ$دp"-2O;Qfz.T^qz Ӏ $Gj!"rLS]֞3WuJ,8O f2XC=a^l-jy] ɴ+ :Z%$+91K{8xSڮTRIITj<OilvW3Ǯ lѿl`r~|г;%T:RO,E$ p <5%8ǓOv[ϋ\=4f5MHB<<P6y6LrESVJ0]n̝QQJ!tD|4DIzd_n~g.VS9h4 Z#Po)S._YϤ{y1h\Ю|[ıAZQ*Fv\xnڑ֡F3w!IX98ǁ4X0͜Xs D rzGM̸vмn-:u{ɜ/?y@ x`Z}6N=b+h1UaxWz*+ zBI<*z`3z4L}v`/gG-*4pPa^U .@U5Uq=`WDM7E tSG::0/ycKk7#9~&56n0ڶ!1U"3]>Q_c^}+vR.O6/uci`{ # 4fT#:f$ET)#IBr](f(/d KJECLvP]Sfp0 f/` 3"^׽y7G(cӓo?H>Cؙl]}OASՀCO~6JmHAMJuPOَV$C[:]=i :TKŚ{{Oӻx:] ,mS݋+l {Ik'F~5^>|#y"+x3+ZF@uJ;1_KB{S(Lw*0Aەy*vѰSIwxL݋rq.\}ӹz '"Cぇ >K\uI Uy*^{sz<НY>B6@bD:СdRU=?o LjSϋ8Vޯe^tpcs̒EpZPLm{Ξ=uy4mﵑvăv>*™F>PK/ne>i6*.;:p!=tW#k㒵<[sͧc޾zS*ْӍiQ{HanhM]L/ (at4),Z6 unB~i hYaYa>y5U}Xwf0~e(WcfsDiG5@j #<%K$:n[+}#oSwW۟206cH6fn; KdܾuMm#PٌSph2ss/kB877*H1މxB%)$g*. a@ڧC?OL9^ I "?+ * -\{ 8L hoDwQ߿CT*ίb"ⲘT-0}ύ 3g%͒(OϠ&D?E찦ꁙZZH. X!3pC'S~Ц lT7 MN4Ų(lVQD,(;EIR(J%a2ISN.QLs7@T]1ۛ 躆yt 'Z;.wHv"HPUNM'pa Ktٲ J蝓Ta1Bؕ!O* w!_ YT V#tRox];ٻEpo<|f7olI Ɏ\ j*>0{Y֙' ~`zAM,A8eE8(LqE]}rb;^GgG5ax# UfC'I;s!UQ2h}LVL+OOUKD XphV%!R9k$K62:Ca Ȓwu:gxDPttFc6eo`39ZQq|~l?'(E偙vPDbU R=wW5S=<#qFҡ1 0;mJ!ԚWзw柕P0ѹ\jCugV?cS?Qc-8<}iKAbP^.y^Bv#DVΑ'D#dBEm#klU! Gr[˨dTͨ aP#sp- -OG0ibޠ*ivƾڟyo wABWyK[i=I<T?ḣXŸxp1S7%ZʛI'"؏k'#)MD^\R0 5*ABt[W ȿ#2־H UBB8 6ڳDG94LLF8gbl&\U_ l.!/򘁭| iJl2ޠkVAkxXR4{{i VY9 &G#OdRu]ׅNШYcFmuMđ{اwa딖"?g-+eHV%ϳI O;WSXOAjjʧYy-& |AۚʭL8mn K"8!ZML}`C:+i!Ӑgݩ%WUwcR: ڰ!)!DRNz&$[=m}h~l׭ >D`Sf2D-&HDoaӖ.jUVRW;>h6z:nn f*$d/`ϝ/O !D͖]-F@N6b$eAS yoUQ6Ŏ!)XF'Mˉ)Cr1Bqn Q)CQj)c]ok^@W8܂3-38ӧ4N)λwLƸ`R Ʉ2T0M͙cJ@]AnR?_J 9&ʖa,p*FP"Ub_ tn{&̻q^D UX3G7߱#{:N\ak6&Tt )>%77> L}xLH,'ofp~;Jv;f*cDJgcڱe sow]䚠C\zVr.y9{lΆKqF1yubSt?>UOSt}S)Bv}zlPNc`)g- c:h^QOjJL]dY::O?}^Q[u::,ll jx]fL#b6-UK)* EzZ y WV!&mւo잾DBqׅ'": QQoLx1$:Tyo*S޺nsɋ !2㻨ҞZH,>xUD6|+\;?xOqBвV2 &j85V|{V ;2.η3xo ً|6S$, 7_|Y7ߋ|;ŖzDVu[#/ow˗qPy$_`Mz\`A9ҬӔ9/MVg=6LwP~i>?[K@g¤:+]nx}=6V_UO_6̸Jό}\ga_i+^.esQfǓtRh7OpF#Eb*>a|f\iZ~ ;;Y24L#tf ԤΣfJقHMd ^G}kk-'{1 n=D"TLa&3ǃ{Z$q@G4P8ZYbs4 q/׿h!O# 1 BcDZ fy1~f 7шbقjbdG?wF$ s?RYwO2Ccg|;j IY`qˌʒgw4VeF"3###2:#;f;;o|Fg9U4T 4f-GZ9=ZpNc`@𦫟s5Hww 9pHhNcnwߠp mm9v ٚ}[/%Cu~BV3#]@#>Ozо4 (-VˍM\wUZ5*GKxfdO2C7gK1G%Rzg5CY~mIu|.۠/[M[;1ԡ.$ڻHaTi6s ѳE!Xݳ!QC|KX[:EؿTnVƾuט!g"D~Y#zɓa|Vb =OY-mLͶE >p+sce ]f"DFMCDHVG4[jI=u3YQwybejjlF8zgVzJ{ڇIƎL )`+!"{Ի?qe+ y~#Gi^$#p!C۪~='f&&s7oܙ:AE]K73u,WxG쪝_*;P%!1k!~&!Ni.:ŀ yz~XvwjoFTg %y[{=vMY^M*V.F^rpH/7<[RI:ǖ{FVm5LɎN4=E0@U^V/BxGmw)>eّi *XgxSz,n@J>L)7b86: ʊ%ڔ@09cn5u^ϲMZT#Q{Ydf -f*f#^6js1Rvo"qH{Cpx4 &èL = NZ+!xy&@Bw5K7-E{Gn5166okoUӢ?Jf:yo:@f˱n2lݴ*;iosrDT,T}P6X@ 섂ޜ~~gw g3)wC0#ք.>*jFf3hAIxIQ|JYzwo1HMQj5G7`UT1;B􁖅ErD4MPX`0x.X k{fMtUjWYEҔ }]|GdU a~}] g!`lVJBzln^$a $UeA0g} ~?cK|{/wTvUa)ފ%`?s͕bڿ.*l?;6Q` Ip…e_%7jpqÿc޷'[iPkj! 15i%S!nA ^_gsVCz\m\YDꖷm S9zQ(rX(k}:(l&s79>$Q+5;OyrOHCAIytaFVEz , se)Z`4)ezD]vg 7'=D-VVtG;9%ɂ Re6k\?scS7kݛ*eF-''XMqX`L b “4 !HvqWbxf?\0Yٽs䳻@2wt=nmnn>dJLs.CFwv776n<=!0ݍ??|siN&xz8ivgs6? Qxtr$K;T-ۮ?zz>95mY+$hnb)3D6y#\ݪqMדLŠ'"&%A?qa>aE?x݌Rk5U]æf ;iN?95nR]R:y cW{9]YN^CF;pN0>i< u3>x=\9: Llp@2wHr$OǼt+N,5TRk>ࣞaf\JgkDLԬfDwTQBzRK-,Q$}A*{z)%іou oYւ)k(A5x|//.uW@ h:-%=r7";S*ÒP7Kl$S='.3);; |,bz+kvw4e[E^2^j 0fA`6hdŧbhv[2tv[{}LЬY_PšuWַPup Qhܟ}g4|Lȝ(&hؚtƘV4{M[L$PUxжag!VϵJi߂^../&ݳn.B&5`ooI=]sFF8*$ xYܐCSyF-"AM#‘3'o-w\ݝWOS?^۴0f]F;B7T\̬@E;C003}X?SxdRwu(N63'Ռ< =! \cKm>y1Sq}(<%{ݍ{;9*IX;9I\-OҨ <+~dp.Dp _VD8x8.oCP $5j5Z=c֡O"\[+[zxtchsp;t!vEԖ䜩;uy4+3P*^o_{W`~\O!#yҥ]:]1EԦ5rx:Gt/0cbفsO$Fhcu+$ո%U4GͰo(j` = R9؇9ĝyV x<&ľya d_UP28-gOO *s̯y.%Qߴ۫(EG6^p?^#[.Y 3n$! CN_i#jUM|d\"N6Gq[',(2.q&:Ie"Q'%څnEb!hLO-l2[yO?Rncncuӓm76iL{]QT|Ga]R+?x+ yIl3I0p$y̓G8^GA,1{_&VҶ!e\;CI{)RƂ&09< ZbV/ݬ& WO_tpi9q[Clz? !N GTZG˓grt}0eWk7Uj.~To$f_1B*|49|%A޼L;Bɘpe,nIڼuv4txe+; Q{L$km8Eym]`&_Upϛ^IighnRfԓÃhiguwpߟZ|߷A3u~GUh-DO}Sфo"'X#OEOtpD5P܁#"'0PB _ 2rڜr5;-BWE~{u%t>ņ 9, ւvݱ# {h-tqKP7w{L|ƔT4 R+i~u;8nKB@xPzM0p zsvƃDUWu>/$"U*/N!χsKT7ȁ 4&;޽D1gm\cWo~{o upl* PdC c|~Jh@]@_Ņ(=`?~ 9 EA1!UuT?ry xyKxNiAPjeڜӅB P l90]L[İy%Evlړ)3D(u8!c"}y97bs3 §s8PMx@lM 1)F'*]M@f^a gDt`D3v]xL&!r`Hbͦkn@f(S`e OG[2]ښNGp% vvV@sKeT64BAU,[\hHpy#+db$ps4 UV^[cb q\ԏW6&ͪ'}]QdHa켫5*nu`6ʽ\W?+W]mrF6KF`PQXz-ǽPX d25|x+d5rjJ\ ܷ_`q[]'Ay)OLx`VR;zs0+kq=i']XZ |25alK6\ϰXglJ 0<"ϽìSŀ] x?[ 4AiCaym6__pP++.1H/˟ d1PMe+ݴz]O7=,?t(щwXY' iK(-OEL6zi>%qiO~v!lMdǒPk8i֢+㙜D1͜.5&r`Q|60sn\&9N)v%T| ٞ",s{|HݱjH-S\oD ZNcᮔz5f랞q Bom#R@g$ ]";??>I&h5y7'5/I*f弄C i籥 y;f{b,$6qtx,NM[ \< qƧKYeAEP AŐ^h\fel_\&y"Z-~=;1KH\̹ 'pm#}S=\~"}tȕ9MSQ0A x9S{uGSСuF{s1l֠e3Z->g}0KUg9K*cWU"Dp9Ĉ+),%\B;&H-oG%w(AP.loQKyR݀_엄pQĉ/j֊Ql)4>ad.ɰלU>T։Fx>|gl7*5S=g3UߺWح7^h]#|5\0Eg T\"C\uԡXܬy9Pl,7;w:myq\PiۺZX'`eiȩ:1ݾ`ŏѶ?@pYd-œS^m>N'rЙ_?S S ϲJu\6ӱ woQ\)qJO.DW?zԦ7yTT 3FsgJ+Q !irhfg(f?_٪uMM7giu雃TL9l;-VDOy}8KöjkPwz%E](&pRdelD #% [7KGʶi02tbԏM~docYRvȇ&j8mͱ_F^ gȡv*(h%\=ĽGڻw?СŠ*^tpǽZ0>Һ >'`t/? asI,%N:-aPB%"NeXz%es 6KYep(0fj[Df5{inU1<";$Wk ujTW;!!=#0t%.j"+AWy;;CtJvuъF7KgmMv#,l+dGC}>wL0'Hk̉0vM Ox+f@/ BwWXjMRlS tTV6SocdpNw$ W(IbHw$f3'UjPK⢎)@`0]eg!umNb΃lJPs sFT6ZMЀ,Ri 3A"*7M:7VipLs=ƷvHߞza jϳz+F_t>?D x3S0%]Du%^$>2VQ0<ϣwٽb:G+;P '4O1u.ȶ!P.E*-df=4AGoz[ qNvCO[iPG2^eH08_^+hG?$bL͘,PL)pܓMndAd&$jb8z浗tO'ǃ@~;w t]4 -|R&ե[HD*8fRa(W9=K56W~KFUXGaJ8ދ-s)::ǒ#r5(f4MZyXA#<HWB6Q>b.K(p\S#:ӯ#,Ndַs[ߝnPgFХ2MAϞ/sɀoGR9VC5rQ}Pbe3#۱Iι''M,KsbG"-tr_1+/zߣn{Yv013߉'z&G!oAp兿@/k;Sw~n1ωFZ{jvɼGt7Q(s9#nW{M{QHk{C"{Xm}H|]fn9s9hC|ι!6 ,O=<)T!Ǧ45 ˼z`s' 1x_ϒvW_O,WM}c5 A=ZDX9xw'.ivzկ^ӷӟ?Y> =8 JȯˌE'Msd,j6 ?R>Y^`bcDbCVW<2k kg"$f[q+ 1`=ltX.|Rר'Vsabx} Bl_k+nM"`>8f,C5/4Tb8ΩߌfX%<'d ^T7TAit Ԩ()Fm|e|Jrp D_z8o 5細b[nRQ˪Z+L2|Üh }^hR"[ y}k<^E#%8|k*l:5=_m'tc$Ӑ҂ X5Q~"{ .92ei"T{iYaX1s&d.t}or6jIH{^kl)M}Y+I~guYk!(;+g2W$܇k&^/r}ƟsX6cUQ:ѹ0 OsyU7:çج*cmEP.+{@ٳZBnEЈǰ7)>`t+&-ʷrBc"Ν8N.0x`p ;MB8'8~|mBCt:$ <6Bpzѩ|xܢ.#p_mxNKЩzxX =}<4ϩjҾ]}P%.z'VNQzwlK[Z?{SaP#D5_rڛ5nos,3b9nY`N0vDD)5E)_7:7|Nnk$Dqa0%##g4 r's$֯hNnH&oxUtC2R;}N蟆#; wVpC mog*`[8.5I"fe-WټSgDEa@oDC+xٖAA@TyP3_*Hlg_N( #{+^-t4L{0Е=/ (FEvpj&󢼼) T0u2_6eDW[T;9mڙ*F?5tk⢘f,^ &pqv}qF0{a}a\P :CV ^IBFO[sܼW;'ٻǮ=-=qqKG]B_[weMį؜hV99Ҧ(pW!3]Kh*͎HZvejCt ATZBͻ֍r0>iz?y3Nّ'h`kO0\:i^  [tj< <K ~Nn{2d5l4XCyov"MX! LEúmOFr-p `gP+hdlKL޼ҞE!Žυ&5QP3#jp\ym+)O;p`~&19P>ֲ;t]fz&A5ˮ-g/m2KaIQG`s6Mƴ'0%a/7/)9kV{CG y%VhMl"o0˿ǟkgUPnY^o>@vh~^ݡxFG͇C4Q463cy=1a*WZ@]NU#tn`=5:|2O_Y3ڟU9(GV̧]{tj'&^'#ih4>3w>_3E+g$ٞ(&` yDD \Hy-)u5 / q}#S4,3ߧaPQҒym 9۴ߵ+9@Y ,d* }ן]}: D)&Bo#:=(H7\_jU]jbʂڨ#X;,X"4A.ła=dG[]UÌ ty%W ,un;;F%r'KyhP;'y+ >2DK*B%S{!lT!X٪U~u*j * iL64y,R&ZueYbp1^'p3c5Rf同I="Aӫ"윙5DqxC%*)yGc"6T`A` ']r2 z[Z9VMWI <$GrP9BEv 2<|T&./ tyd,ju("ZFaYzj {xSvw~kQ'Yr!a~$s@)b!Hx-ft1=XdFU X '8_06iZv^Fd UVh xnhX^Mk1m̆o+,s4 Zt , +Ela'@]5m({6kXxP8]=AZnԊ]5QF(.x/%2xݜAK r̎B'2\#ťy8lw24!H\d TʰyRu DGM9XWT\ͺ0S[ƘDjE9y!@Y{Iz.P _!EЩ;zQNҪިgh6=L4yyAXJ1q\I27VhnŅ P31u1 NἾ 9h04G(uoPO1)V!AD͙]=nu z *VW@QZ5sf3*̈eVlNeJVE.&^T"n~xwY9"¯beLXۆDgdi-wPҤy1o"mO` &yP <z8V\Ru&OAݣȓIC')Me ׍k)V) Z0)x#rC]xs05MO ~ P"Ҿy׭Cf\Q>|xUoxr9=gf_4cm]EauA\CGtSGɆ ZaB.~XдŁkT)5n,G%mLOŭ) fYKQ ?p,HG+beQS Tuc'Gj~ HI/laͫpFq$<2 ǀO&gU`:[1|3pchsTJmc /Q-^P2;鍫p%j o#9d2k?4!t4I35O{kmNwT#UT<|idJ 5T@R :HsTVf)췁<ܞ ÛShm8]6TywۿR?7i@)tؘjND xNYdRM/BjJ}abCAhq]7C.}; (Ory^[HHЋ:҇[~Dom63?FN-DzzHu#oF7!%yOg 13fwe$(3 Ng=P0w#4LB2z8$Z՚+f2'Hć<~;ޒbwʭU?pW7W3"&%/Lh~|9Q2ŀ氼auсT]:AXȌ E491}ngG徆u9G`7U,X20R?ӳeYMe3IX3A=6jDV"ҏ5)%{YO.Sk'Hv 9PkUʕ#tf˗`FdPMu<EZ~̸zGМҖE@H4ѯN0$z\3Mkdc/͂XSQ9R2}?F\ޥ#?ͽRz1&8s!0m_KJ"[Fc+e,L~po|A#2ZI( [@}69{L lU(@DF۹.Ig4(1T85aty ei7E5S,"U63NC+~ z뻙NI9"rVhyG'5=I¼ؘayCtz}- Sc·/q /j$K:I*VZp ynx 3t+ N2.jm響{WBtu Ǘ-O/S+f{mf==р}Xf ϪZjIXh 0 uZ nlNc#'Ek$X2=- YzVwm#pW8|\qzkAsf%v 5س!!@FCOKxMk WʹhD@!\LsvÂx=-:+Мg[M,V>rn:/>2z03&VI2\sz[3亐ܾD߅z(2Ƃ# p92m+!Oxcp^dߟt1; >8վț?.A\?`HQAjh[NVf t!CIK+x-}1/ƋrZ1Jt6 `. ^<`jPfgAU3[; Նϩ,-=~+w@iKn؎W Զ;CvtPQ9Bu)u_//蘖GQۦ!bdni믟9rR4<4nk{}o:_ַ[y/.j ~sp%$ntZRHtW LK;w&Vcushw࿊j~zGHә#|4x?ly7lI&H|PK r7MhLd}M=M!*ۋIk/I}v$'k*!HI]O gr[z=GJYvt|ΦE@oo9"B_2aCJ-G{4JjTun3Uq5$Jl9I#pNxl[ِ}(tI?S`.9@Yi:@t8+GGtcLG5M|$V@p-8}R'yraoT:X>n̩d35ݘIq[F wlRCO|Z`lh_CtLMaxCv}3 ʼԙbI^IP@Pl6ͽ-)--3UrJV7a9HO3DSMkb\1+˜aMie;\x%K#Yrhۧnh+`k}T5OCf3='~ qF/tҬOKMfЧ&8Zk<UOLN=sSsbdEs/jT wM޿coo0˦߫GG|v7?wG-_<_Um[Nd|r`kds۶)~u;:oہƹPJ{stQKR^tuui4P0>G4ZT;Kkgܚʋܩ%I^x%Q_p3Nd+6Wy(zR@mË O7Ol.R_0^0\bzS޶ΟַNGpt9hq–3Vx}zbn+K یcDm;H5S_sW1#X ѳoifI-O:+A_X;xSĴ_[+Z!~pW  8i%/߾f? 85;d4.rz\z`*e戅ٖX&d]O^*۲HHxan9!׈蛲򞘭.F<Wl<=\  .*#G_I}Z`5EJʸ/Aƹh YLuW曇奟&[ѹzZy tLu;Gq:i& 0eeö3`e;-IIENKCɍS,iC0I@ٴ,ɻ[]t>hBhI7>f/b&.( q9ܹ TL!rFS0A XrȍK<|U&9 :5c`3ѐ_y c!gۃ|cw..#rt%ÕF2VCݹdf,Yɶ. #jrɴ"1gͮ}-HԒ9r452aNj][%#|;zo[ci+M֖N7)!{Y17+2zU:YzGl JcE3PLܖ<o[u{q?FITOZg?vD|n!N0KNE:3 S:ܨ-b.p6(u#"w@doedk\Ʌ N 3z=|c$߀gT 8 BH-¬a+x-`C#j~< HkwsC:M?b8+Ͽvֹy4*. vߘGx8v;t!0ZqW_xŢkϾMמs[Pmųk {T\&TIc#Ο?~i65-w;{:ʧOv*sgVOדa i&¯Ռ`~)u80{ˤ2앃:i}l}=ٸtC<1NsIodrJ>}qMiޚ}]\PC, Ρ8{?5u5MFǝth;q~=˞ΑɅ/4-N[~1S_^OO6`bPtrr/{[_'#51{I n3IH9s+sFO~GF2ѵ#se_?t-- b!}kcWD[? eY4&A d5{Ss`ȬSq+\%j0~ Fh6tmƀir^L$څNb=w1I Gϣ \OWl}í%^-p <Lg 7N?hJJX6ESc(ʄR/fʵC xt{=Vs`_՛zM0Oqrȱ0%!5"9dN ީ*/6 IP/LcuTH =h, *SSe>ey>dQ W5EM _yT_)o}1 8,dQdtୠy;L2~Ǩ̶cTTooo&ډwًZWDQ7_ujv /c&UrK+!Mfz3"EK[*W 9$[1GP(7 -UGf (8<͟j, j[ziqtتJ5ίZ{\`tоX7$lO}4La)Lgb㦜9]X㎉z)2֗6c1%oprj>[/!rʷ-Agד5bx cr=a#-+:|8P[,N7sqCCw2Б7l\Frei1b9_ ]\fp+ umYKEH7LNRE#*n8Jt>Y?9b̀f?b%CZntcFO߹m3 vI~Zz Mm) b\FXPqZoHۍZ-PTϺj?nCIRgRR9 } pթ̅Ҝgw:{֗9.7W`?:g Amvݟ0ʆ?)zISXji)L<ǓTxo4 *p~L%s(osb86#6onΛDxMvS3`Fdb '7X%ڽhb9 -Œ/.OEiښIsKK.2\~K@6J[s"b ?a+XBmO7p+].G5= VR y,Y+sN)NMkFS,0p"r{d?'˵mUFœB^s(m`pw↴WLeyq1Ft˰sRT6Xŋ]V_w95nvu1N895., xr M]R={M~Yx |\LOdavR#4}8k$`L4}yĕ q=w qTRvV(j?T,:9I&۳|3CGq&Vݟ-7[`{t2Ym ,5@IX&r,i3S ,~E5b>NE8OUKl_nJ9뀢@'TZ>RQ%rgyXyr+};>F] ~/aA>xQ6چ?[kb4ӑN_BYut*0EmEW,bZE X 9x\O@2 y ^"c6{#{n"q4+3+ܐluocۺuU֒{auh]Y =w nVh.ZEEf0-23A/<.2=yc6t v0Vɔ\QrL"GjkiXX"Oe\>}@`dϮom7fz0BNȂ%0+qKRxZzRhAMJfʱ"Q~`VNnm&pRdv/4ZRkYNu24kk'nYOpʬ2v ٽ R3}-b:btۧ&h~bZbkQ>l"MYݶr6"<{R‘KE#ެpq2Cm?jIc}Ѩ^|t7=eܨ5tF 5>_e:gjž D4"|vsvf7SK," TI}o 9\P5VmEjP^-Yf] cێ{ִg[Vt 09fcտkc^ʗk];euMs2/X8 +]MCVC);]!uK"gw \{~F~^pP9NF*K./G-Ne(b[bXh^+t^KtAgbHW1iѳS=&HŚr(IQ[BSk&xT СjlgZ|up2}y-g_a^85ƫki02G BE\Ϝ4䰥* pR `dTA'Lݐmo&^0s9, jf0m5. I]tƭ@bʓn[:3@~ ΅i1.<xp;:3IR'-%>A.ZR I,rSg:BHJV] +$.pX'|D4%%4+52 whn.u;_]Պi9[ ⁻1F1 :H!^b[ym,leGG6 :䜝 >{Ѫ,jyUfשȽaU|RxZVvha{ 60:`@Z5f|=l ATmfnة!V땀(g\>`A kjȵ._!FIV)8f3kK&e~/iZR.zdu "$_dz=ES{w kMZ5͋hՒ+h_"%<T۷ZzY^=xe h: j>k]&_g1J,1Ǣ'tŔdvŖl̽(RFnJ N7yxSv4R#WL2y[7S,yٹ" !lc:<E#VVCpތ8wA,G8 * 3)i ކ\\\* ŨYtb0wYޟN^߫=ttC4n~Mv߾yypt{w7?>?Ÿ[^oc1]O-uo}ٷϞEOy-0*rp0.&)hA!TG(De@,2+TJV=·c*\|1+r!iN4ݨX' ˣG1TJU+fᯘ;,@+ٌ_`Y 0pKx4ݲI}$fGmjFEޡ+_CnW FX; >2%Jz|8gcvOg[U`$֒P[j&yU"|SU 7눌VTUb|JOָ߲m !xt?-Y):F(bdtrB0jspo)\ט}r'>t%IAW3b7z~hbjU{M @OgHA:2֊N}Ps%Xȴ]P$.l/֢ViD}Mz ;~팝?UKwD]vXV Z_ԅ}훽d[P;'wwG=fWuzP+K-aE4d@!h ƎN5A6+Kqz꘡jFaZrZ_y)]n.6Y0%?ST\]b(\1@*ET#wO7/ru46y^l7Φ6 hmg~ xIY48_?׌հnZ/FRi߾Sm4}Q4T>aFWJ8CXöW}y <y7xO-SBMmWUmѽqUUw eIvqq5nMǸ;%{tN:I<Ȳam&= հ|kͺN79@-~󇐣 &|]Da^hx<'8JƷW^"rk|ȠHG&+fJ cL=PܦߥJ 9/u"4d=rY`oeRf>_,18E"bdKQ8,A A fۅNLlP2κ/B:DCB͈,IGa e vx4E?)HgќxżcY5 iLezS_FZ^ߨ]<ͥ i'{ion7;o~۽xp9$)A:)xfv?(X4*uQL.e@PH6X?ԼnʺrԴS 7.%mΐs5 , 9CT5p{wV&y,EvOfUwv+xm{ՠZiu ]=U \MR_pu/H8n ˋ7;{-w`\&s2t1͇ 9y3"#)v,hBf/v%@~mzv ?8j)~qx vejDqw" Bv~Q6M&5+%6:>;Gc~'W@jl}0/+t&(ߋC+GOxk1W*Dl[r?B'unO@Sz_Vf%)/E xˍBEl7rNiV s- EE xTL֛j`U7Ȕ? nA[7;C*0"n}Sd[;h}`;@kV#x Ez,Ly((>^`[P@,z]L,# ~"h~U4k.U0_>Y+Sy?Mcflrn%aø\<x ϊ؞{9 0=F[83rwX;krpPp{.xqa}?U9"d+ ia~܅CBl6H8 adϤX񐜱O3OC&0CWNA1w o) U*}w|iT4xRn*V|^嬓mXEQv9$'I6/6 FyfNj)Vm="ÒA'^%3Fs]~/;dӪ}H>,Sbq%9<qh1-C|Zd ȕ~JLx*]!#Hϋ# Iu3Ѻ5w6f#]]:MƜ.#gXu&"z:YTPj_enG +(znj }by櫕W&>P`#%D K-wg*eh[_`( 4"d|aY TľP k50Y_Gq xnP wf1pcY$9yz֯uc7ė?.-0pۏͩ+H1r-bQ ϔ$mJlhYIDMƄxμ;Q퉱LwhzwL?RG۳FXW'jb\,uSt3j v1 J]'FK򖃊\s 6rxpO ~5Lp2舫]ma}ܐ <ZYr.Ƥ8( ۰̞/w#?Ԙc\ b)vp.K>F~63N t uNa(z$”CŧIeblaTz7+[T[@BtП6Pփ冷h")(FifiV V,¢8=V` -ZFKVCݠ{Vً2_ +Zj~JDӰ諥&׵{wGjm(uENn)[pqL{-o%ի9ëw<ٮ?9v泄mvȹOAydEK%C:*vjj]ofcgڙs,*==N$^<38>>4O\)l?WS_8tE/t!ks&ogQVR![셓x0 '0k^.w)s?xKv_|\$-C_>UY ifD8vNO ΐ*F4Jcw Wo'ԭ?4nГ(8O; u+pИR%M0~ٿ_ļo!Vw|e$>ǎ|eѲ0oS,|RГDíCXWaqĒAuXE̊.o͟3gfBU2?"- &Urg ^Wbb>mWOo@HB {zgYx=?]|YG&TūnPU[hD9U' lԾWX]~p৖θ)@U#); ~ٟT[}8?&0 jۃaX?V{M|:~3먏7Xw1B ;;_Eb'9omž2lӿ" XS)I00^"9_ih8Ī,DZ3aYK㞦7˰j٥uY l6M(($tO<)BW Ȥ3/ Qȶ d gڮʵ)[H!Wڜ{imވj*0yUMJ Z4B pmO1ēr@5H4PLA4RX3B 55,5Y<یy15Ly2jcD#̹;$t7H>'TW?ɪñ>`K}B!G,3Vo[RJܺjXZ1rܣ: M;8 >9D6=DS,nŮ,+DK.%_ZS_l&)uko1=?煲tpoM~j7ι 4Nζιe:Z4k=x&~m zc5ņŦŋǘItX+wUwCxMŐ[JL"-Lm*u =lkE%7񨌂 Vàqp =<K_UAfmjTW~.=J TZf8'!9\)Ts eLu Y, ԩ&P;e7쿕H$e%WsCN9sP'j$H$h- 7Kc ]\^`9Br"e!Xf`eC,ƕ_+;(%fLukOb~(1%i_^f@2 /D;,6f#>ӂe\"!`ꪁ |MנMv]=5wa5kn?׎nڭW]vY5CڞWX%qY)NA[N\%G)thꨠAɹ#PN_ ,~D٦/kԎ9ն(CZu+W\ ^3|f>(뻽-\*m?[-8m- `=$DO$n$LO%$TO%nMqpU[WA]aґLj%$KI+o86V*0l [kj8^h;_-<1;sM5IHt%]K| ֪ D#m)Vq0ÚfU +-V[ tǵz~22qͥ ҽI!t zz^&\:2Ua' r*F7@BX%\7H@ a 8s/h(7ƵhM~@dhsQ4s(ISʕ$U u;\GԀdL%׺f 5lPjbYzzLdLF-n u.jHؼ]$'Xʖ,g'8*@w @{ڨ)z^S80(,K2qK\A1\G$aJ5:֡ЯBzՕЩB9E;sszNg%W"\֮c$ /c,?"_ \^x)  쪳5gvGO~C_۽n6;zo0{UjavUG6MȑA=g8pu.% D lp 40lU.)JEsoc#G12ѡ``k1!t1,6@&~-cMA@:#rPaUFF-'} )]46[؞-O'9ׅJM+=unBS0q/gw7矂'AbP{WwkځB;._Tl+A_Zp?H v#!n1 ;«klKHJ/q v{pߍ]B][(Ko~ J7ރS(s@>\a$s33e|}Vqk 詟aE_[q,w cHP[q7́`=qlx cHPb)א)mrPpm?'^8ބi[4 `΃ <}Ky$P+Vx/WzlHVE ĮM?2MOOig.! fG" "EB1 _ i7ńl3!;LGrYۣ IQQRb d#Ia@D ~Ą"#AH "P?.idON5&:r KjRMRMRMR՞u'7Lql~'Tjs$,%$;-3AT%mKw%o }F/1A}P/k:+.,Й@?Odeͽl.9SO?x>v'0KdQ1!RP}Y#z l\Ծ}وD${K0F[h׿-5OвC߀T$Zsɿf8(UQcR@zU 7Xہ/s qJ8NG03jmT3.4MC p:]7GʏR-S-Svaa(>LK3_)1#"ErPn.(2\Lèc7V}U+U6j_a,1Ća(]ƀ['RxO WB$}\9~.H?'#"H'}H;/Do="K0*HHdH\0FeDrH;ArQƁQ@Q9#RrRm6](ڑg WA1Tfl2bG 2\=G^qM)GuԆ2ϔAU,~(qzWFu) TM< _Q#5o$ө|,w-<մ>STh1FJ{ p1}g޸L -Օ)r+հ]wpĪKPC&6ƃ/[s>ݍie5&rAe,Y*6K l_ EätQ Sk{? 2{a-$l<׵k?WK6\v y\vp432.=Uۀ$zd-/ɂkAêrXc&tY-p#WAD3b9FOXhlkS3cUj$:T9=;rnTq_"đHCYq- CUB,}0HfUL-*6des] QH𮦝8ۙ <2쁂){U 0!&d„L(i U|mk^kBWVQV$qH\ R,Oz>)̼s6 qMu7Q#U': +D|āU1SB<`IM~`"f5eIz->dp0_.{ 4.w qPSsB/𨊶)GƣΑ' w`+Q:Y~m:I6t3gԚA۬v zU1ryu4PZ|(󗸶'pǹKHCxu"XLN b3<hp Y)?= B%m.2,1(bEeK "t;=Ԡw44uLMQb/3Q{ Cqb U`WRvj?zrGyW 1,Ȳs\eEH,q[Hq)'=t#a˞b9Q(ݘ~]'Lfn^@@ Vjjs Ć aClX wQ`t!&nf7QM_56b7b7xœI\ƭPEmP02:ёaWM7%MQ)ʰrGs8 (;N+ ,Ҍ=%4P7e 'eKLtX~nacΞf;>IFsD.7kW/sȢحImRmQpY u߄Xt@ԜDߣS" %PfR_H6sҔSbnL<6;BF9-dK9'yM-f+_ L[oN s71Ô+X >nS`b̅ J8G"H4sEȹ"$?תڼC5ot'n㥑ڀR^1=f-Z.ŤYa6h hTcIX:"^8JưhAa.UU>> yK>cG%c1#c(BkSSW=5𚦆_#N됔42Ȕ|QzIq*%fJvRٚndks|$N2y5x)ωU1Nb\O2 V>i/;y[6Ҋ<1Z61cCYL'FGC=~ZMU# (.#z "Do{@Aq=H=jdH=܌]#,%mp,%p,e+a;!5Zՙ$FZiu %x!M%<:j_Uk.[Sl/J#8ioUPXceΎ9ݓϟ %X0OrhSۓz`d QEu??#[{5j3Vy?֏q wk^JcTAk"%u4 A]f;GCܫO+|6o+;[3zQsyы{ EߴnKȷ%ojι[!o@#zؼNx{<?t p1_6}2~2f;zzxEP9J|ajee8n\QϬumx`l}iT5s *7~ v3{Ug8Nj~Q789:{w|{㋓ÏG{'Y>X]YY8M Pmƿx+)U8y*){Rj plj?nȥJjS44Jd# Sw1N$6㤮KרO[רXq@Ve ;i8 U !kǔ-J^Vo$Y<՛0S_M'0lfg}Egk}#;AR_mmlnՠ\ګkm4 u}iu6e:mmZk-8V;[mYyVޓ'QFfpͫͼzۆyn6nv"$CAK=+ s y2;:׀w440M? Pg4 4^9%Y/zƥuԸΡJb^Ttx^o;L>+ bYrüK) + +Y/ ^28g@YU2O&D۟wKĎ/6]N"lʪm/˂D.`'x(ї8 4S=oh(o~a4t^( wcQ\ ^m01"DKȍ/5tYMI%CYfd{&6~\ɳ8 hbUDP.F و_xMơ&W,X:W)C̼JdoъPMҼ!f `x6!π ۉ֪ BK582jA, N}BAoMif_5"%[}Ѽ"q ӽou) qa7fP44dv; qqOPtOUF\Ha踅w,׏g\@!+`4QU3!B!P2ҨK7iF!tf7T?r]T[2gWsDej2~∅Q  N75&>:L Ց E?TLǷȣ 4se~Z.i(&mYōFrh$zC` :*$-_"s(a٧ lKNƊ&g+ /8E6БpV瘜/\I QԜm@i.,ވz2$wf3ۧR0&zsK`N@gc{7٘jl ֟'Yx.,M"cG"G Z.|>]xufQ6`|{Oqe) A tDxݠuٓ#-4~hAވ^ξeUf,8,شE'(DcfSIփܯjd|˺p<#6za]Ck]Uy<` }mI|5 [l *H. "[46JAA-h7XgQUʗʢ[yrB% qۄ.#ƑU" NPTyu1,W$JјBv1, WdnqGYS4h@ͦՓ$[1 :Fz(FS Yf?YL:qH{M>MmߢOEPɪ XRѠ^7[M80naovuĉԜ*#p\}KFQ)7T;xikV"KiH:hAhlGVn!*Ry]HjbU\rPM;$fa8NR0DK1rl?O!L1u<&9)aoE-LRxDus;k1 !=$l 0Pݟ*(>B=cGDI4b+(i2K)2ߨY`)rgLv3*j} ҂Tg u(Tc~%:|I $ƠGÜXZZ27 BŕY_4Ek棔NY12=)ͪy,`V64X$Zs3d|7{<5_caGd>tƪuǜ\^n00yFUS)dY+u&|S x{c1*+Ե2KP*Z5FL,T_>!}h)=+WhFCHP#q_0?C?9hm~ tg& !Ӯ<}E^YC|^PGgύWۨd^G}jt3Νɩ&R ^0No >_ZWZ]ϼq=kk:ީi`vdToCݡu{vBJdngRRzRc,qn K4G>ѿc׀i8q-И 5/9#|!yˁz3|( Z:'쌧0h7DuQ`>n3ҽkl).(ꭨnalo\iM|{*^Hs$#@Aiw݌0 F;{[xhu IT:JmB@Y쇾9m@B97~_, wDuVstZGn[.N#ETCo '%2b=q H^$EwgU.|2G) G"溝gP3.ju_J \ 3lh_rlF". IY !kκ^[E]٨'_x/6+'аwZ-Q!t!7Z~o"GFj'&ɗI-Ü 4O.$̯*Ѓ&Ⲣ 8Z1. _S &na.D.i >Par/xKx|)+m$[pH0IxOƦ^EP`8@t9l\7dxPIgpyG:NE~omz>0h:OP`xW QNe..SőV?FB;^T@td]i xk J]ͱt|cnoaEEjDV({ISI ( [,>5ƽz*%=hA/UWwG[6ߓGo`868.fKƫ( saxaSw4صOcB3 aYEŁOū6ƷU#wn2Ey{kɶퟛ`/Mt)|n>DQ$W9IiBQ1;%w\(=.PZ͓ZWv1wϚ+ >\^fl}e9}k~{ O l~,SͭE⫫e*(Х{Vojx0uv"T^"4SG4~$:BzpRU(asa4k$}jbAYWvΉ`rup<;!+pKuݮl9s΋r毡)07 $y1mkT ngV=ϭB^z|D߄u G &L;K@W*l϶Fuj*l gqx{Dq]:B+{q^Xx_1GPs9pc8obO fh6Y't at՗f w3L/9$D?D?vͲXm锼 ^ˀ%OR ?~T8+1c:+\'⯐Q7pަBr3}2{Obcz'Fb6ɇȧ4B BȞQw7)sЬ.|d[Jkb%/q[N*^oh'*%v5m+Ur%A`ًRN-vMv# ALJŤá[C Z3G3u~Z U<; ?x< 569IV2`N$ KE,p>U7Նxex/\:EQ|&pcx[w/_,1 L~:'|釿i WFJd?>+Y? @ LAvseb"CSVԽW>)]':3-9Z>'l=}#e.'ZZZ%)w֬Re*@Pyw@GDhw*D|H-eH oTn @k+>>c6 |N/pw8LY>q!F!Hj<'B+`&Kq1K:$AW83Sm8[l؄Y7b_"! ދ6~Ҧ,Pg붚v_ 3/VW[eH'"Р2ݜ;2ҖKIEv ظ&Y |TT % qo7n ?R"W{s(TE8.5 umi esQ24/+ #Xaz  7{8YT6̷WVfx rW<\dU闫隠r .5j&JNG/-W$"?08Ȟ9"xm(Q+(ͨ )@#Dy=ܬB{MKh5CبRY `S>ThJYST _(Ya[3rNN?]uiP9@˳yc)M(,c|nboG Y!AGz+uysk 6[) v)?GBW8dM׫k8@gpQ2ڒ.?iNV xC]VD)47ϥΜ1H%# ݠqtq*c=c"dS39I]VX,cBA'Ӧq|yqsć(]q9xU΂z2΅XnYwG/N~9x۽b݃w;}!˱ N=Ps./NO?K=QߤԵ=KteEL:?NxTOD G@c q=q ~dĊ/N=$ 6GܯqOHٹ{̓}4eOlL _0|j!GF@ .F'kh0>XOwTi8<A y<>IddJEt 'R* ' t=5,>*iw#q:߉KBP.jȿ> 8nJhIA_A9\҉^(}ɯhe/98?yDŽ czVWx=u&*_\3PSP<=/r"H(Ki?:1M _ui:h]7PiI7e)O$`Alvc$Ѹ\{wVۖKVqr}ab?yyo0Efa\xZs鱼#$'.3_ҙ{7?~͕+2 EK=yx8O[yíwYӼGx!8\^a +7/ g۝\*oL]m+]L}9!~TȂCA슐q0my0 V[ΌnGFU.Za Ņ_g=blfe]N&|- v&_W{qX2#L[|_w|]W*b޶R,W=]xXs]9޵= .h}R~&O~td/JE0c]r!l~5J cd]7n6@{@(nʳN REQDKy#Җ{h%%A# 0,^KrA6+J\w _ /u=j@~6|]Uy+\I we=P@[q0v(bSnf6M#xYhL5|\PbKA\0" ƞcP0uB wH9TٜN6[.`<,/_T@(/|-/wgٿg7'h (okz'ĻL~E5=t3K CK(U@_|71Xr)3 TxL.%9oa FMa(ezjA?r)4Բe\-&gx|K3+bNNe$a!ޑe!FƷUܦ9FlĿ,-nS u(P[e ob"^@wטX::;9ywBl#c+] XIt]]Pߨ+h+tow-äR-PZ~GG;c{":#k!xkOͶ%iљ )CόG,Y4vKH93SYtp\]=)IevzE;J|bvc 6< z+ ډWܮ❯cCx{L>EϿ~DW ))XfqMw-BU b- 2ޝ#5bsT*3`f<\@rM`ŠɳpX⭮ 9 o,/\Ӂ2"$8!vj. KuO:b&QG+XntŇB:VFʚVjhV+ E}FܥliXMEs=%Q:JhUvC5#{)D _6`gˤr_(QO%S"U~lIO A?'Uxa("ST*٣7E!g@K0w>xdmB)πuMA. zC\DZ{hoKjoԠ,%$l 4'iJ,r' n[v,h?BbĿL8,~ْz@3 9O|ɬ^eFPHWd*:AĜO1†_FuR`Szi~Lnj:Ȼv5d+͛K47Rmmj*RgWWx"Rb=q Dr8 PAK.A=* e24xF@+I4!-@(_͑#$LF.7ƿjo>nϛt{ ޽Wc&" WdzU8M9hwR,Se3=hR2eG@Ã}z6W9J|_F=ߗAuI㲺{W9nݭֲghelWZViT_|TI~$|wʹUAAGoyͿSi/d2Ϧi/ˉZ8Ij,SS~R ;zBtj1v aJ(=W:͔pOs1od,#[ٶ T/D><wts!Z롺cLa,ז$]`2#RcKЋ$CH4 K gv el=d?N;C_*& )?PCZc5MB6k2OvFO|6vk(OI58Pb77bk5o-{g^޼sDDk'0%*Fg,HfDۭG\Wl*?l"1΋(WX ;K;Y?V?t:؅=KM]tZf7uI(-'s lނ-eH}B\B#$TKu7L^7Vnñ|)!}'sPdJ+V)_'lW`vL@t}CTh5 Q):K #(6:fƽ941:W\[R٠N7jrתnLXĿNhٹ2*>Kas4xV&_3]H{͐!oHa"x.x=#ȶh sDUdovtˇb ;#F},u8A>Y%+4j^)>t kV=Wt KF )rfG,& e/;!wQ?kb$kk0I*W`V`e`ט⩼0h1P=@b67C|ck y(ƬJV㢭C̲Ff+6МW .͍@eElg'vh0Ÿ]ɲ`KVk3mgP*&!†zLAf^ח>m4!o֎5X?VYgM@hR 6nUb1_yEG`ͼMg6/YM XPzLL=a@͛AI]"K_?HhMGH0 {1 ͊nugӴ&n.X0b]ʿ EƤ(4*,,e=5f2Ϗtˆy˛AԱs+sAǂu 4.K9xi~S{>Z?VxK U;Zlk hg2**aөgtJ3oTO']{;Qg_o2@vA} a0)0B2cn&EVU[V2S;%wLJ84;},3oXkqNG ):Y,#'eޟ(ԭȆk綢 M +æluʯm;+U-xBQ`8D+q66^njeC~!b_п57eaqA4TIW1}W섈`&>`X!ᦣ\Dd" #x,/ GV墂Kt'^h{xxx׶%à ܖtPCAa a^YwЙN/ $wEs *ypp*OI%M=ˉkV ]7S,[Q\qWm{bm6wle{^^3u7wwz$߾pRiOΧq+:([?mvv!* 77[;{[G;Hŏ2# .8-fGi1ى'<p/YN?GГ^2{ɜ@__&w} .v))tƊ[Zz&~$CPΓ8n4~>˞pm|=BI q*- haT9D Db2ًL٨5QkEO(sЊ~̆i.~?`tF;I 5eVP?IyVbu ߥM\J\yܼ(:3ܡ$ltSA5ٙ׉&{<,Zé+K,Qlme9Mե>j'|*/OSbd#pI bdtO1(#:6'rXa~fx8 AM%3U3xmM%2F5$;#O "QBˋQ*"~|~YfW3JTa*J델osX[0HٝYv %NO0naD)R-Vf$m%PXV̞9cC(Z ekUS҉# $ͦuֆQ*`zpe<۸rGb>]:E{E *mRou@:ok* ې(H# dF|1E_1ajBLH}p/䝤7̴#)9yWN[jfVҖTe|/:g^K !0󐧒0Qz`4/{yt; ncC }tI_-2l nYq@~w2Ӫ6-gp5ꁩ q8(t;-=;>c% c鏇t*S/޽BelN w7qs<^J]tiN)%ԏG}H$]N͟jQ~j VZhXe 32n 4Ýc.E㴹9oĪ2/ů} VYnQ-*"Ek![9nچ"E&gOQiM;l?Ov'gzHC> >Wpx$Z/|vSmsjZPn1 wQ"*M4; 8}49 "7/tzO6h@Tq;HЧ|*ӕݦw/"&l4X!$(m0) eQLԺse}Zr 0j^`6dp? ` \M&1:'㽓Qlܛ/f+Bj`i8pX['g e:G}ߏ*RU)4xfR(H[+26l18w`۰Eݠ/!>㵬ЙTJP2u1(>HG.2S feC(ǧl褵:/~sPCbZh648-37'%d>2p1=T _B~:qglN^_Q{ ̤@*3&d4-p@:N,&5/L%6tڜ%`ְmM?(Ɏx^| 2^,`dg(UtVD&'#힂EVu פ7}g|'D y̖C`(6KSn+AYژHķXg1t"SR|CBUz%ʥ? "D? Zv]̳ÿD]oM_}:k+JV4gyaP63]eзG)Q%C}+"r*i[rW6cvxꓔY |kr[-ɴKy>pOzxժNJ8HLkm0cEZ]ʳ^f /8rHڷ^N]Uٷ >vE%kHrA.f5eZ#|_˛agAH`{M\19x z B )Q`nZwF%Fcr~su—u|T!V_H!ʲ7$rKKC*%uf4w0 x1[E_A̕tɾj⟥Bp`eیZ չ3z梪[* LX;<|y,ӝ&ؖAPf@}z|Ύ~M~ʦŌMKWsy ~ijy]]X?S0Dž}UWJDin2cG1+XV_ܟ7(WW1T3|Uq;O^~ +j0vY:Ŭ8fjPy݇\cu+U~_>&}e:̵OZhshmC=W2:lWyC<)Rg}+K̷͙ h 8Ea  M!W*;a)w8*&;?EZXfh罄Y\aԍ-LɽFY+D]E?wtFct2N6UU~obwrm63mPs&5!ۿ5LFT݊TmjOO5?o~F\{~cu ξzmcϐ}7~$oTG{{〙J06e )sP}Vg|T Y_ubߨ nV2^tN_( i!SԂg&L9&I"G_Jup:Jzb!tdߝ^ڂu Z`L1_:d~}.0槝^gxQ@}% !% Y'wSx5zH tY\S>* skAV{MnAt,$ʪޭ; ԏ7QEU2^LN|/OAXqT)\OFEJ> t@5{Hd~SU6"  _Eʙr y#ꌤD߿kٰ6W,n,Cc r1:3JXdm=2^g?ZtZf=>7^$U >˽%aCep í& am{-TKpT.p+8\J cS#G ZpUSWp2ff vF+o_gfםo;%JWzJqodEZ!3YyWQ-hLEe|6;6F ?ė@GY;/EqD.ԪG(BfzY4UbMc-C!u X7,_*o2te"_`"#!ߺTIo[h,/gGf-Cv%N@Ni0[WYĤ@rce vW:_Eu_@ȈǤltISn*g ՚@&iG$}E}!DWӶӡY"X?1]o\x66i<\,!ge@Dĩ{ڽ>GLɜOs ڂ(lqwEFRx n&AߪC;: ڕt [jr6k93-(?^tzu^2hĝ/WKGZvq{|IR\!a WWCH\J.Ry+Vw*{:2DB}oOʱ,ħ\ ]0;:dMQ^}FJ.;դ]>{4$4c5=Aş2. 8!3w2BMö=j&we3E:Ѓ=tDQy_)$A7 f95IGH<Ҳ,#*Ĵ@ ?LȸJ sMV7IMPӒh ]/Who9b]Gf  [Dqr#cVn0ȉRsA}:0d>ItK (ʼ4.QV?@lg*T60]Y3kM x),UmZtDbmKLOSBIc 4PF oe+>֊' +erI&ɂ*M.8WyTo5~Dز#4=^Ui[[W]RU3g5 M‰qkZvZ.^YpT1ί$ZۿgٕD*\=!wVHlE@Xy.WkźiW:Jrj3Bx(59gZ36ӾUj6b9a.9Y_n &2kW Lhy%X_|U)탫tus4b?Czhό̉Į` q+s F$m,խQT1xIJh|~>J7d[dj\ػP;5j:`Ɋ495̭]awѳ$¾`TQ@.F^!.5PN&H>IK; ?٠?֘]JYߦӭ7DQ_쵣ZGM`1է[oKr UX{AȖj&^'*W;jZUT(gbJH;9Tk6|?;d)U_6JI s Um$i L-qI|W!O5q9 D1 8hv`!IJE j[uu+ipٶWyV#k}PfB5Be9vw~T*GJ]OF||/tHfiuCqICO: <{qq ph''lT,Կ\]߈{:Ǖ<o(1P@;ff)SMIYizMKk\:©(uѸ?Rw-X92 ϖ_?¤DĮ2K[ % ǢPxe]K˙l5Z[+SqdaC }҅40kV!=^bh@aͭΏ;:?1)%tE=AMTO[^g{҅X4ݝ#m%kFԗ;pkm>+7, c)k+"{XեR"~Iz+\Ba~ f!7y(t6HQv%G/sQPzF$LbQаARִCٚeQ3>ͼX,%t|cs!O%U,2.hf`?fӎJQ;$娪thP !P-aHPLZZ X*dw*k=:lq/@Y&rJcv>B]?)A^>u8D[T #ߌ:ԅ$,kkAY67h-ݮh! !p_4 +N#+f]Vҭ<Ğx_AJFe[:CH(Cޤ8#NEﺃ(mu{N%~ݯh7~77kRnPp,-6yCVP5YMZ G:i5GC-oogJTįb)^ >ߟ(]L= aTnVVdFQ!_8S@Χim&QzTFYARO z=\ݬYTW,iy"Q\)P< |P+kcݯ}LISC *{(?^$dށF/*^:) kNHVQmZ,pLʕBJTAʎ;$B?JoUK%hhpAjCy8tx *{mմ֓&z\2‴*A»۽G%YtOn+0q1Ev+8ot{_;dDkzVhcQԯp*PTFZqy5x 5_elŭAWnxcsJ*zp4,P|9x>ڛ,*{gu[z6gdJV7NcTC)^;6V#D(2sqtsxDQYH'!/_KY8 H bρJ`l%g&LBB:?$927{^U5B6-c E1?$, R_U2pL ?)a~J2#GV=f:iblȧE"AE^5aEPyԇae8`(BHiQPl$@dVxb[%\iXdoĪ<ٰ͚7M/L;v >^ڇ8+L[ZGޘki>Ij A'F5pG|6=1袪3QË,oɗ;b OMm#e/`nC8~dΞd=|E)z/7JVQ LxRSvF*k]G@' ChFUZ+\UoMp۾.I]nk<$%éf*T?o.O`M 'DpE" <4YӥAR8P'>ӝ]j]_اr/GGIz'q߿AU?KpFزl9P*W&dACj}KHʘy ؽkJ Z+XNˬX.!2$%O j7I:4;S[6 ;S;owi'}onp n;fJ0 BLl x kٔ= wYvS&(TFʋ`̼`j,೬9k% ӓv>2&ͩN!sb4*guRw*>H~p<meеDHi;31Th. bWȮGy|Y CKG`0;#z#1dOsLjCq=#4.KWi9uۡc0yM1N: ?Bz`Q'eE7{Q.;EwM>I?Ʃ}Sg/nH偩+ԹT8#k*f,ft5M}h۲үт>lNA{ag"E$0,い2?r"aᅡ nOZ-R´)"cצkӣOܻ6!xifKC=P:gyegVG6kk,\Ӊsd]$VuSLr:95;8I ;pt: FńWL 8ۭ}vby1VM㟛Vs%02p5l*XPo%L0 u9$^+ YcjH= υjjiI[kl+#UוґŎ 1嫝C-7iA?9YzOy4o-9fR0Zq2v ϊ?sB){=:E\Uh8^ͽ|=f^d+roxT`w08G[k3'=xܘ&)MMGp&*'^ _y%sߤSabFO{=܁MTfjZ`HJIrvBƠ.'OP% YRC/pZH0 rpwL/]+Wsykj25v;*ZwK ph9pkXcm ;]F[gXR=2'ZJqP_gKU7ꚜ&Q~u];hw{y(|hVmE~n~Sgks(nUދm>Btb%O+7*Dla]9?iQ*S`yk먻|۸ZC̞0K(+;0nA>Za–吸g-ǽ`z j "N28sŜb{e+nSyN!O̕GLgnU^ (٘rkg:÷{z6xYU7=;R7$//^a:hTǗB*8рx3v)ݼq]8@AQG`E%Q謚Ζqdi=K) ;)% *$Ѱ/da$dLWuZ9ت3b+l~c:ˠ||obYA4E0 ]RV\Of 5tV@cJdQ7`2: u8嚌أ,?&G;TCg=}I$_|\vknqClEg5/f5<Ļ .Jq5"_>̘cssG -j~NsbU{C4V=lq9ym?{QᶞMJ} {-FqZ y%vA+eҶvb)9Onx뼞%_]%mY1%h])ח+ƺh=@@#G0cl0.vЎOJMzM9j,z.z휩gHsS}Iچqp+GM)#|(TQ{KJ+Z^QNQx|wjѯb0Fb/עJ$` {52WՔëBwWi]I-dċ')'uکOZ9ibx^s CB*Z!,W9~G5`Au-~.mu.zL3ڢueLmx=yojK-djK%^ڦi҅-?Bn2)Gmi=1NSYn%O;v_A{S)[YG\uC! GmkԩV  M  C\dZmOd/MU䪙@U%U*PE=z5EM]Kj=?[![R ŐxϴؗYſZE5+ _83tAgir (p.ߵhO{Y2Zf %y>6c4PEȗh]bŃ Y+%Q#BpVPwtUq1+L@\C%9Æ15fq: E i>lbƅ0@M҆t~oTY(0B4xM[ #Tpc]rl xd9eME8Mkf7ݫOJ~HF/*I`ϋhS qz=iQ-| O"ūe'9WrKnpG1d6MxX)}tT4"9?ud֭*Za(Aob) 1Z-iv7pYꙵpEo3'ruwƳ,\0 LkiJփ ykZVF Xe|7peSQnW ۑ AHZH:F,I9M1zssm}.a ReAC| i1{N]e*D> 1FB^ϯ?ax|֟]=Yq2:oj' c<0S1GvfxoFvBV&}hP8(pt{[aDhq:ݶUM:}Vr.EBwFM;ǣun+Vm! zX|QBj1磴'PN#[,ps1D`Uү'AR1l B<0u kz$1(VC @#n!(G.8/au y. 'lJ 9 k]qQpxPQW ѿIژOQvyn~+o6-"q>}h0qbk41 )9LJ/??d92j~ ?b>aNU_į4jċ @yv$X^oDF9zX-` / &}b5<&uX1b hl}t>ʅ,q>N#u2/¼[y$2Use_`PޫZ['.T~rUL~ xNz \+Pv:TM}/Y Po q賷xGTo1kz/?38&*y{.%VS꥔nx_0ޑ;junqb8b 1hr`48Y=gŪkZϚإzN磑b!S)0Zhu.0 `e6+qct;tĵV&vu*QyJ$S{}J$& &Zo5I/f>O(KڄjmJ$ 'pdfQ FT Q6n!S/6d:'pYooxgwbJz#Nl^V3r/OJO1 Uw3/IqνN ())8pA\b&o:=Lޠɴpv!<>Ծ &<,^xe.Kt8I&.".V,K5mMyN0]8^G?a:D5|Ƥd Gt3*r0kcAV.r@gc09}+n\ꝗwMltC>/_N?wt࣍8WSԦPUͯ:9֗ 9/{~io+&MbOGiζ|$̩` ‘tW+T[O>)!~ E9 !tyldUnP$"3Ս-?ps F 8R^>1"饕vVaJE# fdL>,Xmd|\{ ZrƝ/y z6$/+^sSuH>EB|AXA#6c٣{?8|^옣pBAsB~fWp;CsEwIUSd%&;ȝ< |Grٌt!_j"Qf7le!kظm}& ZGҎZ:B]J~< DEWNRŊh > " 0[P<\{c:*º[m软i=-$;{^k;1,^cauK B=nHݷJiz]ȧd$m0YU_6tX<GBb \FݯЩ? `zn:n(x^dĤ2IkaP@' V֑]XLH$H]gu)6HɺsD =ޥ>@\G#kt.{&U5 ~Oi4+$FIpG&LS: |aD 7 2Oitړ+D(i80Wf\BC ,MyUuCο)F~( gB=Fy^0~5FώӔ9#.dN<pm  VݟFh!!9 zQHc0PKUho$Y>f)e,cv{kטbEBA??LʠG ۨ@;:ˇJqoT \ c`(~ CT"JfYdog)12L ImYݰui|ư6j)؍ ˫߉FdҚ6tg8bRͫ P@ '6А%(2yY"?;[a-ͨ?q 2?IDL(=l蕪 #Įw-5'Đj/0R[|U.\G#i& ѽd=̈́ =tFks%- sLb=eO߰P-A28NGl74MC?rtS6M/’ Daֈ*K)*mpj'' M>yWj:ICNXh`Baj*T)B~-S?YH 1t7rЇz+gFz켷T;VoC*[ke!a#+zSO}i"?$6? '`Y#Q:&C G"T  y55FE;eU(-\f[YbFB$!#cGx*Ǵ$d>Q* Œd{L']T).*JAZ^zf2 ߶0F}\ZK8+l!," =xϑt!c䳬bޏ 8)$ĝއ7_/Op >snҙߤ4':ŸuXPMනM2CJ-'_ޯ)Gn-iw[^fGMMd ao=j^C%&ˠvl,}E:5 Xl9#˅nIb5wG.4~,C+db%%ŒV$XMLXUcޔjt GMu\' ,D>S %@*W`KWQpl}ƭbFca+M*Rm'Ry8'yI'+;~K>,| Xne4!~}UҲB[+(v̨H9,NSm;`vX1AVl]{utrgF]逶-EV<8߸g>wfdtu+̈́C޸?\7 ?8C;O7MMry~/OS/PV0p*\! ?Tpt"!m-!1Oo|ƛ\Jt`b:gfGd.x=epJG5#tEMQ+x] hIe48mC=QTZ_ gCȥ㷖Pob6w2t:IĴQ: mF\YOz4)drWw:(i\71XWL'a_޾.zb AϝJq!I;I.UtY{eHJJ(X GрMTH [ǪnB7]W˫lbߒJ䮛yK$Oq+^L27ߛT\f&f?%-6bc_ǎ19$J dPN$e+l#UM{@eO/G`s#|W܁YUǘmEd0kZ\jf( bmAqdX BYAcIWeqޫ_çT.b=!dښkqsP CvؠePMס%֡J_텟:8WYjs*iҟ]C@H cJŢA=fxm`cTӏBf^>Ӛ*^1͍-M -k)STxCzuuJuH,5B+I#R"9M(YrO0NjsJ:V\7x9<3;7AkU%B5Je_WQ3<|\ Vn:+|v0碳1|mلX΁%%ӯtCnt>QPT5 xI%>Yx;r󀩛T%Y"h^nT@Yh?Y O}WkX6)s $O**qnzu|ɎDž$la5^"h2xY,I%õr1C6Q+1rg^C]4IAdwɡ!3߫71Dנ?<yf ȹV\V\~aV>}Ʌ,=,Rt`_)=_`E!o׫D:xcʏ< C9=hPzF'{4+tPECK(TS[,&a^1I$DTQϜ{`mWipFnen qCVWTa"ͭu{zԌZ^Р Vڨ/WC-_nm-JB-BUݦMLxٵqªV o3itį)ݎzvo?wM٘F#SyX}Ъm?ۉebC]"nݢ]AFJ,8ngM, <цpuUlC(} V gcZ:xPH:Tt7v(xфP>XPy})4?}uIv]eRƕFt3p-h nwN>#, @bvSkX;B}ӣSftމƂPer?GKxk/[\JC sͥҹv/P;B>b= h^,b@a ,W o38/﴿%{F-*B撬}.z-^Շ^{9]5_'*]F!H 11mZ 0U=y:j+JL r+1d4mlp"b-iU0A:icϘICVn= )?sՔ8uhc!r Fyu>~t(Q@z$=`$o~`U[0KW^pUmψ@ہI3 >$7 8Lz&J. NJmeDeG1Z G*qiR~HaGK9ՉtZ &[ B^1*VAfkAXxwL Q=0'l֦ [Q*m [5t5V'XIL @: U+D1 S|m mc63l!AD)6f!n,I2XEcl|]yJšl؀]$zB49}ɑ H㧳h& SemD} @&@%W4n~f(ΆU@AAuQHtsl!CrJx%1Rƞ!lI*|UsT1X0A)56Ä-TMi)"O)6.lc <ha߼Cc-su&' M5$LbέhYJމƆԊ1cly~&κe,J(rh4l+A+(E(@R-g"ΨvhZ[lxڼYuxA47KP"6B[|Qȿ|qtUf]75bEr}Toj]$^eXiBib첥˔o :C 'ud AA^dm>aPKAKQ`MKZjѮEOUo "I: m[xShcQ;xV0Qs.FaJT [?qNGNT 8W'W.EFJ$IÃOx0hA2kV1/` ɖ͹s~~@d=z_];eem;Yzbs;ػ{Ƕs;30x>Sz=/r̪dH(#괬T_*c ^ Hk&F,pj>#ɠ 6;=JS49Y:b|ִ> Գq>.FWFb~&Aq\~SXl& cKd6-To(G]kbCu#"^, !Z}mXo&*;"O$h])ƟfódaWz n5#[6|OYjbNh=^}ҿzdanN]FPqtl L>"6q|/ A7QV4wqј5ZBAЈBn1M$ UyWE.#HbWαժ l6dQeRiś^ɥXՐ9T nw_ ´+H= GFc EuL7'5y.Y ?~Ⱉ=Νhu-Xެ3miav2S(bHы)n†@S|M0fh-l!dڸ3 @Pid03oL _ Kr.;rj6d9TԕV;pI.4nS~F{_ZSdʪ)iHUƬE3&?CƌiM?~.y!<ߧ} ~<*& v6x vu:)}#vFﬔSv}LU[">ʰ@._Pe/|HX 6o+;LNP?Cp.P_A =L3wXVHV3on-8YaA VAXI@EyaCQQh)>m8$fhK -j9 墾v4)ἷ^EC$#5ۍ1*Oi0ͥQz;` aNغ 6)ژ!m\u@E'P DO?z G.-^V_l\W$/ŵY PfĆџBs]Nm! ;` z 3n @zЇF! C9,D zvkL|i^t{-Z+wy*ke7 kEG8L%qJ/[%->Je>1"ݻw8ěkc>Vw5oMzY{ewӹ"~5mQy˖7 Fb)Iuu$/~TB%V.9m1fYXWax"=.It1XovP 1hL,bNsjEJz2LSxx@JX>67N=y(*ڵ# <_6&,҂Ie5}&AI ~Ĥ=K-9$1 mv [~"Xar Dkީ6YqXo<=gpYGD!MgQ M%ˑ7oHJj(hd?!VDwmV V_]zG 䧇+U= zYhHnIC5ticyA>C@3EN lkzAAXzFB!ve0qLt-dEow0&3'ܒՔ<_?/t0C5w>mv;tmE?p `#4G_QX q: ?}t*W9 u,lu$, {tf6fQz#}N##Qܡ?GtҩUb8 8ߐoft[@rIqs"|.oz4c?q+5g/nhw3N`!=ph޿D6g=R)Y9h^X齎b֎c H2~0}eT:@h BOR2 ;ql]=D4Bg',_K_7 alBnb&ʚ_>kMhQ ֙~If^b3.{up id@?z2Kŏc(<\͑c=U!VqD` NI]!o-_((rAL) "{hiڬU7*8%p&}X^bNr؍٨L%E 1KY/nN[kX"$XEWD艃 %OX !MUZ Zg# "؟bWe5 6TH}ݻ?5#_v zv惻z7Gq ieӰUfzTo4.R))%Rq/䅵5,A+ʉ_\hN',gwlʒnu>* @!.^C?6-M^r)۸IWUK+fO&QR*I贺&v(5_ ,,X8b+,ۚ2`y OHCqYlҏ|V>vm2<+Lb=/A#(U b I%sЏZdh4$jZC}B5rH5׸SP6orkTJ[x{ a$(E5a#ňBgyV\XUu9.m0s&r+|;z%-?3<Uңv L`q=Cߴv2*HI+-:7VpC1\~冄xj 8!:=͠DN aR 2hCqI42 UCN~%1XR34`Ϋpo0UҮ鸚:h8?|4$^,kҘ_T %Nd͚1p*rlj  ʃ||ʋUq {f1a30+la /yI[=E Zs0qi/#Z̘w%:6ABz*NԈRSLг6R =nbKQ;Eį:rRVe.ɴCI q؊@U.;p+_|F$R Yuk:_GMŮ֋tQ0_̅`3+|? B[bkDnp^Y=Yg#] `ym<8HٌO"L\79 ' mO rاXO1vO^E ՖȻ(S [xɍ]y- Vk\9hcVb0)4dShF-V!/R/w$j^V Z}o!%q)3WȄ`m˓HS!a8b<5=&lziGOkو/]Bƽq[ŀ:_!,/\PfIlfd.h+:^@$906~\1[ f2_{1;cE*HeEV\V.2[|!jܫ‘O&IIݖOD/CZ`6ZX8e#+ 2ϐW Pyrp4U2K 6R*3mؘ|,ˌ1v&{ @;u=|X3aΰ7Qg6tYl b)̯8Bu[ظ r7O+MCթÈn6! xXT}e~ʋk)֡~w(f M|;'Mv#oc$5DAY+!bpH=h?.jbrpW&(UDP°6Qe\͂3-&'{5e$Dh~rB//" u€Wvʗ5m^,mT+N0HϙZq MiEnyn~Tv >'tzF:a'PHh>./ ՠS8¿]OMPuL`ePX+^~AS'" q6 Z'ehV@*.)&j,(MhHf{k,1kQĢF,썌{(c;IC81VѠb- TY[[^&,+%t?c?aBp&L?K^o>K 67 I-10 ko~I# fdZ]#2܂e8m:}D&Õbǝ! YkTjlA(x0ÊW(m%Y2(SHG8Ѡ$ݒSTMaȢvyJf@&>)aΞBBˎEN M f̘;tAyNM- .XZ+BMj#`O%qCWMKNdʅĄ(hƂ(~L=@TC7>hP fڼ{P2]Ex vԂ0,i!/BKVV3p!N&'`N1ڝH=+E 0`@?3!:"9hcM] Y9R`dWW,\< U2SE4J-ԍ^tZ-.zy|"i+òx%Tc $_X+b8P^{KiI)'*vy9i0*]Klc0Jt68,YSfXHV3BZeexkDMo /8uzOVL;V4l̊`-C^:>gSHô|Zт]bOzhVRI$EJғ7.kX:rdW,L OћzGYQsP@El< /0KyH;f nɻ{cBҷWU &"11(=c i EK3y-ڐt(w@Z 0d9S ̌C p6{rW2U-fҔq4Z׳Dz3Iom5"bޓ2PHwN=>[@Ռ&>g~ɹmS j}:Pe6%OQ_g3,~΅BPhy|$/.Pq89]|BX HxZ X1X .xXKio6O GL$@ /#zF--5(|},vWRdVf$=@ GQY2Mt #-/p`'pGQ ỌOR: V# kY6 U;bwI7KjN MJX0qtCýfAtZ۳xyŜtI2٠epPD؛u"9kZVMQ_ VՙA:1xyeLM>'(y\($u#;pMޥ Ϥ w77~h;~g ł6XFFQ+\Niw$>vTqUn |v 2jh)_ys-*rڔ"Wȇ} KfPw䇖ɛc}Fp9ڀ:7[Gt0\9gf r7?CdV:^:8CXX U[^VM 6paZgLy@#e l:)*G9!v 9lVOew\LO_F$+k"1*c#c*K:)s]˭RQ^޶<ۯjV-H9!)Ԧ@]p`+ٙ}F[Ys~~OyBN6;U%y m.w|@^ .sQ!5Q@cgx)!qDٲбŨ޽OOQ`%9\6`%rON ~'cu)g? ,GQQ=ŀFщo݈цG @Z0p죲`o[y20mmG }魮"L*oWPhi +/iݐoO{Y4%: zA G {&4t/7mn ?Ann(GE F*Ts7AŏKWդKYϱáL\|, zwRRODJ5k苦8L*T?K-9raO 0էnXDؖ{ _o d\kjܪ_ \~#6 'W}|IvҵA>:>'./:򈪐*ҨsPj&^{2#(L˕AUF",e( ^'i:Zph0-_oXIi0*PGSd# k:쭾HT @phLZoԔg x'+ICLK (!Az{'}~#<f-#K=U2C}E\1 GN PCߗۺh6B}U*ی +ƞn'Qg@7sT_V*oufnr6G?ȫ4N'J$LAn +ca\ =J=MǭT%o ^J6kә`T/=@:BHP ټ{8oy@N+V-g. tfu+j)MuΓFJpb阥PLgVu)ۖcxI3:bUhϷrluzay;U+bPm8zɄ` хaU'(}`(*_kv m脦el`.:ͨ܇5ۊFduOnaрKT)K#UZ#@)h"6l뺮rq؂ȧ^ SmV&o}"7"zpmӌ@OcS*zsiw<` R,Ii{&oxTXݙÐͣ?ٻv|^~_5 i.lIgW1F{d^.eiŏQxd5wrÞ3*BQ"dy_mޜ;OgߝnԑE=[5p.|^$h]O8sN{1B_vfe_phFg]_H0nFC)aVE pcEQՇ4c݋YHVݢz#HɅ+OUb DR%KXR5@ۈɤcH#bBg¯^ҫdI|@3?Zy`L294}me, Ջ!B/A[?J((8ljPvz(9SINI0ǓDjmDU`^[BcHc£cMHԉOW bCC"êup;0!D\gXs]ayNOyް^7 yWe¨W:=8VLttI t`MPv֠DKT2=}|v3`/zf W+.~dnh2t .+J53hzW[aj[n̏b~q`(hP*-9vьEW{3cmJ0+G[zDۊHI}WuآsN*B^$5IH9(|J%yo^ö҅rAO1zuCeiKȚFܯsiRz2)~q+ֆ13Jj,}=@)glG;;GvݝΧq`xF:dG103֏SXWłA"w~nx~< w]t:Lws>(Gx(jOxrp?NƓO?-1je' (B|Ou+qԗCvEkvQBa|cy^dUs{b6Ov40 ~g)5(BfUT>8oMy\`4 u|'A` 42AgD,D?YbJON<&q_>ӧX{qwqL%i8I0<ǰt))tбSs|rp(Q%/ǸlX h&Y:[{Ѯz^UU:'/ݟv~1CqUT<='c Fh#@7PG0od{>p]ӛ Bz+kT;jrjuxdb}q /`x޳X}98 1%0A_M`a-\L ,^HoAW91rmX4ړp]gCf3oyYywz Gi!ѥ*'wK„~(`e6So0" ү+yh'\ѯtg i ._4ť'Z#z}I ӦlHY6^>XN{ǤJ/W1nkfx0'Z|jNl;{ر%D|, {1K,E>b1EBP^EVҋShюiEZS"Tּ6)&CVzA%/!5?'+mI|_3T+pپX!yt%x`9ZjSsP #@e7ӼUghG@.\p^VxJfgь|FwzMI|K\ *za@C/Kޫ*a3jzT%Σ6nw,͌:b"K;~=Q}g?Y_sv}!m*[^|FQtsn6ldX\EHLgc5fB.xNn{K9o tvPMX-ziRddO.UxՊ p0eN/a+I/ץvAn=p 2-棥x\qh[E*;PcgqZr5Z๨M@d}by4,Sy ʟWE|k"ՌCD&3٭v`rFO~2VNk+4B5bB[C \us=2iۺ1c##V_hjNq@<+[Iֽ֐eaƒb* ,n6iE.TKnkkmN6P>dnjE(uO*urY*po<0`ZdM(#D'sE('9=R9}4ROȆ) -}UYStN;隸bt\VMn{"UԮ-]v+2uHۄ3-,`?<:'N Wזs93'T{>U#y|vO+:$ 1JAYߔQ2msude<}Ŗ^OɢXX)&dp խFYBd̴NUkMTHS(Ve_i(8GMOƊR)Ŧ^80Ӫp)|{M0y&8Xt,ֹCeDBr %Ct{흾T2 Tgq_V-Te ?ғKV,YjQ F|v^OI3m{(:MZY7R&LvV6֒#@ヽk^HTӃL̠,Tx]ƙ0(]o}Aݝ-GG҉ LȘzʲm@J"P<1x\#~:i+,YLmAӼPw^p$gY?,1d2ҹ\GއjEVБNǚo ZMnXԪ}xEZ/EC2cl8Z^VF[iN}FwoZ; eI|bp ac\ pO@O&p`JTTi?d+Xf Js,?Ŋ*ۯj_hV8' [(LCD۷;<[ 㛞|b=>boW5גH)%yz` \x!ʔ (ǝǧ-BKKءXHsR %~|ORI΍dT"al> =97ڈ򓎙[3A~hE'3}.[OhLM#1KݴfDU](G~w[,[1qЏ"q9.)SQUvԄ{q})/V-DNfV(@Ծ2s ҂g~քero4 <@(.`7{i Bʼnl)(ݭrt?%x߮Tg}vO|&W_gkVc%wEYx,O|{ +2$e&S|\` sp'^f;"pJa+=(^[n̋,h%ԓ^"xo ~RcMNoizի Y7 wM&O}@ dŬn|t*`Ě̇0٪IjVNo7VD̤Q~Ϙ 'שqPGdeUtʞD/*ր/V26|MȇQiN}ڟdl u`=39uC}CwPrd J5β{㢞q($Q6wwzH|$ghq94bIzsRF'$hLnkRdh\w*@ DY;1ܚ44$>fk{?igފu*S^;t2z9ޥsLQ)xJ\M4 !W޵Go"RS# 1Yp%pV+wvbq ilk_| Su$Nn@h݉ĬWisNӖk@-MZL8H[kچǘ٣q]rhkHOښ|lU^+ue+@ x;_YgY6k( M@uKw\÷ Et\F_s08IKi|!t"r8%/\keU27Qte TyŪ}㼎9Cd9޲zd (+TTE ٥|؇WOASō^ 0x6܀@rBz4@vb[c[9RsS*1~=Es'žu< ^9JyfwVH~Pa'a)mDǐG#m%b把ɟ⠵C/MJ"ls1owjRxʏ >CgY9.v }caFhM^:)Eݞ%N*`PK]n" ^t@AUc'js`7 K'1+YA*p(YW7,.@ S4-e#ViQیV',~rUeSa['e<*W@ӕrvmmd[m[NF|1z=Hʉ|K3W ~2ѩJ:,V& ClB848ZxM{A/A4@8fQ6AbۼS~黪|>` zXY-n gP(ٴSf3)W@#CR0eIIG|uy5{i` z4ura.#xwl0Չ뭎ÚvB"ȴ+pydۦ|e}yV^$啧YzCyd.!#*#"W .eh7"z}!L&:AU'HY_$1V/mk3,IDfznf:#i8vƦ{1oK1~wܐcc:t bM M2ocuXdj"'8ҫAŃ}FPLBwsXYJ=Jj*+TvuQїd|lb ȽU[2E<6'nAmA_ ~R`xwzLX[SvC >( +I&j:34(c4<#^Вmy8N7/]'ޭ-/;w\q&[U(}JP vlge.0SOk9o\Fꈀ+)+pRk=v{B= ñ k Κg|:b>;灭uNюs^qOfU_,WyIHؘH0ݷrGuQ3J2<6E`86"T7^uz/KEME ]Rֆz}7MH0 Q=6n9F~U,/;᧔ű3m"Cy/)ªE:)n j"ߡBUZgWhFC/Ұ2ΒUMl2n(s,k]!i(tcG7(^T3iƁ?rP16仁H8{۶vBLnjI\=nY~|PEUu7ɜ˒b*8Rٌd!^YN"oqʊF6I"1iakJxq6s^BTڽt2Ҩ-|q11 X-m;ڢJdg $GG O/2gβu`L,+=m2~:\spLo sq{+HYV_Ŭ_*XB>xX[[?^f#~[1 w&%'uYе4hJWG-qr{E514ۄ@V G8(dA̦IEVs d#M11LdWܩ6w%^G2=)-g$l79h=}q ltVJvJ*5a{cKn_]W*U z^ۻdt=6~K#Ȑ $Dvxyr/.kXwS8=J J7U,R)spkGF/޵v;-ޅr8=dW sS:2 ˯⏷I(Dċ &ɴ'~N^39«qV+Fk&[g+fh`}p/)h G;%*2{)ά^ UPonWe/Ͷ,fs,:mLYV_ŵ~g=hzs>f&Zޔ׃j S\XB27t4ߘx`ᔵN:{;㝭n+JŘa^_P?=ّi4^7aMkz}k?Z xpz07??˵h睝fO~E2_3Y:sƿ{6] ӧ_PUV@c jׇ܌cO)^?Vft2: !dxq?h7tWٹ?*!tfVj ojnx;`>.QKДJ)nj\*){u.75P^k5z :ػ"1;2*qoҥ--\uGɦdP4n S.y0G'ׂ~bL ~G8S>c-hF,}Ee@R Q#^;`cXfG`hިbv濂 %wM(ceLjrIbɭkԅEݭoYAֲ Ivp98cbn9 }ʻWOf1)9ޢS(e;b Z` ՗Zŵ%<_aaw ,Il擖=Ѱx%'b yfOH;oщv1(Oؙ758st|ҕ}8nv.!5z9 REu#4qޗ-yyBz4n82DֻM\vVZ܍zxp|A5Ot1zn?C𭳇!y;$g&,9{Ru0Yy_rL}xibKiO]7$iﲝͧˮh 5W{=yX*a`<7@c6Ѧ{)483Q`  ?oZ̾S֡RO4+6FDR ;Yheʋ3pZNMj<VJ銍\3S !egȥbx.E@ b Pz`M5]jwu$&R85u/?/{Sk8C`YT2g6.8$HY@/a+^o5P+oK3^|c4 PY./{h}[8I!VBf &mɱL0*dRT Qr+Φ35EjSNsS40t*Ӱ)5g9kBn;Kb'R{xύQ3J R萜7Ծ^u6ZFf՗ B!#"j*9 ~loOH?=nn" {ɛ5yh/G?[RAbm-BrC5?ݨ0{7-!qD-阄_Z2nkIKw9|>-IIgp*o)#$S]9*%Ɉrl&{Kĭ(7-"Q:Z/izƱqYosnD8ϼk h#0nvS®}%S]@lũЍN,aW:7ٴ!:3>ڴrOtPqLAo!DuV z&q;Ol4$j!J 3z)oзN&Zg\lfQ> 7!cU͵ayAC+Uo 43Zk.wlDOoVH6oL͗0lh) SSf1 /鵠Wl|(k% FjΨo:Uۧ Yzū.6CIKK_]ϲ|DZx?/9!pO3+ ~k}8@߲6Clle\SqX+OI6׻DpmJLhgk9IHЅb J1tG2Ǡݹ/: !e|Zڶ=HIW7JI S liqg꓾>>:_ :zr'}#MrFIף11#o֐bfLbLԾ{7UWc{ ]lޭ[+[v?j;Nl$E­(8Dzͪ5yJud {ӑb_w1=x0v`%7I~lB~:}Kkf|ۘI/qp̲nr!S% ,D7h@N@BVO78@F1Q<<4TD>H:*{?LA~ b/bQ8_5/Fm f(`ae#|OԭW)nbsU~q2f7@b"YUs+?0!p8)Ep TUE n7J@b %uI1nt!րӌ]!FR|uVB\M[#`@ +Jc)/Ī\/18PӬ k1M$!vcObJpF qav$"tHAU>k:V'0*$ 0ڎ7oQݺ+MմnA$Rg[+|I;5: L-]BFGcrYiyȨ(aCLce8&-b5]Jg0Pm璆EMd|ACq,|tg>|'f|[C rqo"\3 .ę"h p^*g&J uC =a IZ|ֽ9K,\IS  b. եXVTGu58Csv_M|.nNJE#!. &W6k[kV9pu6͑@7c^L4&V rxJnVۺ9,t%a,ׂ±!eGȣ\ʙ2V-a 0j{ZOZerG˜TpY3g0FG*=Bv͒'U,(#Yh9O;eAݍ՜uk|JV޷wo+EeL!9P"H%WT.D \X/NS2KNUlmL!UXR'|zO+Ւ2ј,kyfHa%FU dc+5&mI`FٿOb.S0o═n,$ 71|YD`TCm 7}5sA<7] *,(0\Ű'LCPCl--sfxK>E705(R[Y& W/Veh՛Uk]ILLtRWTvmEY>(,lDIX(鋿3tC/Tq(>}N}k6g:-imyx7cXv,')R@?wv~v_,)HCü6v:vq>'8wiY^K ՞. C>G޽-  GD]ӕngԛf'DEM`lR^Ez KSDpP"+^xc:L%oN5 ^#઒^^*Ex(+ DK 95x6r(U&$#ew!/ҷC)G31a+ޚAڊD3]ǜA <+ PX_bJq@bZ.7J4%,/ wa"tz^e[\2ΡYSIJkWwP~O{YVo< j¿`X5\8(fX'g%u OY8ug+ p3ZFqݙ 7 RAp[x2&YE[_z_ьm?`cwwvI{D0q)P%5B 24fuD2 ,s:$k tB`MÃ9)§ҡwBfeUkP\lKwE_ڽ+ו@d0fB[(/>Cc,㌵n;eG'_zHg0LЧ;Q8~6m4YsCG ηi6Lݽ4"֦;Gb뫸*ƻ`X{kC_V cU{T2- ^>ǭ>Rxm0`+aPngWd}Gq&8 {#iPtcld{$PfسԹ.7#şF>3OƂis8&e_Rӏ!5>VD G J+C,Nz? xRUZezBa:/2eR^v6w20YJ᯷-P+ 78[7*;Fua?gWJ}+,Ț3Vnr +Crޢ~сw|BsqA<ʉ"m.扽zKk:l bp.9p.0 q5$.(8(FzW@ vAj՘n(y6ҢY{pb^]cJV4{njfBY`\{Td}OŪFג;ǝ]TTc}C045*  jgc(]X9^tMPV #y<؅<ϐtlf~bxz5#D+;">RFpGl4>'*Z=$eoQyKqjSow\aW1:/UqǡUoAUZ8}.9*}\wK鱿?Tjƕؕ`t1GNw;?u] q9uZ! ?UJ F͎dلdj%Fɇ1(B&4UXlv?n;$35k DCQH*\55̹!kr9T\^n"($|x`?Zh?SF_4%4{᎕=,TJJcM@\ׅ"D{mh8'=ja |B ŷD푸=p#;nM5ᭈ.M'ܙqe7%qg˓2&Zǒ^*~u\0e.ڨ%X5 uBz =toOQ:i JR^")oP&5'JFiv:~޳1]W`7 B3ؐ|p8p;k;;##cОW \OeNi6gs맱Wfk`+ lEba5TUgKXҾD.tRwLQ7j+`JX%MR.-6\ Ǡ?u2㵣{Ր ʁڒ2oC1*kol}ڌo*zr<*7tڌȻ%AI%zHÆ@e1:ywZ9b||m'iHHkty!!|Gai7J}qcI9Ŀ68Gra}TFc4-`,yO76MWٶP37=A[c(_; yNCx up4;Ӳ7wkj֏O6~Bvw[kd?* G[qBg:8;v WCG()+ +Ψ h2ҏ xHd (v\Ew-xp#^ٿ\RvO@>BH5ĺYL>}{PPYs57 É5BvrF d72 h{JTqIƯB ,X16Ҷƶi؆*o=?uqf[(YAG(:n6**uc8/C150LZ_Hч8JDXa-EhZp |ȇG9E*'Mr\ko,xAk Tm4VxzfnU2&cI"Kpflz}m <+ -\S#Rse;mgͩ?8t:QxYK\ʘ]bTX\VUu6jp.PQ1q*7輟ennM!H()lBŃl2Dz +o\~þx6}|iO-K 6^$Dq`ql$8rV^n;9GK=p籓񧼟gc|)1pդN`(DwA81Dq}GO>rAKWXo3Vr:1ID R~Cv] #_lr3aƳy_;: g=%(Sj|0'h*C9U.) 9"y?VKK-RDzݸI-*$\BS=k°Q2@E@5A{yi`C ߛр\;g A^j@ 5% ?TRڐJ[a>]0gPxIFcz@S^ʏv?s6j3}Zlu0t!xhae, 8&`:WCǍhM#E^FuACצ>ꀼ\dS]}_kBGc[DIXdo*V9C>'W~w."vD<9[N.?(&S)` 8r}kkZV ]h(8]% &KQWwP3V/=/Y7oC@;sltҪ qe$"*(#8-UؠiW/27FXQ=@tL.ݻ [m[ 1 7tMG?mbLc!fVk``z{QX6ޖhov%Zxv-L7B71Zt#G-`z% C# j(c@ $ȦQW]4P@ Sf;}:DiXGF^[ɸ^6"$(#EiXd^Z ھ(>ӆy!`?]$XW=zcѾ^go*z&y7}ÎuO(tOX.0JoRmM,SP΢Evz<Ő*3j`f ?_?j |a˅0_,Q <G效F%xm7jYXcSR+ T}M~ aA`U<=lXИ-a}//2F @?w"gpR=4$ў۸BZD^³mO\mZh)N;&~]mdLjr1aL?Vdm9bnBj=Rg`/Ӭ8̦Yn]^a}ouZ%C0ZQhƎYْ|@4DH#U*2@ pO+Nq勥9sp,Z4)Y莄Y[4srr)y+N;%^b9>[g5SF)Dm)\A]q? LG6vv;aFV)FE&XSBCp$ HGx,wU-ԯlgceݝ'?&kȢ܋<<_-و83W`i8}ϭb>L{|u+xq -Fd< ֦N^tQa yv&s54W7 ©6눩SF:T> 3_55@N3,mqq9NR\s̾x3ɧl|,s@ ,OE;rhd"H|n D"8PIP30aOF-.o 4 d|d>p?i_YaC Q!RZ +.atowgkXoo*9. !v`Usu>NK%Kvݵs\gWY] {8Ġ6r0Ĕt|Hle^[f(V>҃ Pz~MMF(BE3K{(L#XcaIܜkkߚ9 Rl`o(^2ǶgmrBBܖB\_ז>?F hc,y7;z1J"EX72Йozkk^ƹf:K7t5YqnO:{;㝭w| h}j75/okut]bu6_h?okig?qRUWj, ?2 8EZjvW!@= g_cp^>yYH%#Jg<c$=! 8IpG+->f\12#8)꥘k>l)GC30 1ɻD]ܬï_WP W;)%Yj^m& SȾ {۾]+U,rg~\@,/BꌎY֗%3_.ΔK'X;@Vݖ܆}ȋ2ƯɷM]nB\9me lqiW/gK)W>W%ig%SJe9I3PCBa0O!+JoI8m (q7ɒ{ꁆ/#,d~3?G 7ǢH!\%"S'}pT@%Z+n._iK ZŇ=(}K^7Q i|'d>)XS1ɴ (Hj'O `-ľ~7U k@CXyVYW4Zά5{ NfEcР`jv:5cD;)8qB@@p mu(qUC McPqd`3ҫ@cE$Z_җl*Dj#IEs챤Ps\ȶ1H^-j-4*Ɇ񑟕U{iȈ5bs8lR]{Ib2~]Mƿtw):VT<oϢ!ƳR[; RZ`SY4N9x7[JϻQ6/бNU!Hώl,NYpg0W]I6uԙ$HI~-M< J`Gj|U&%d3$r-le+<YywZ$I"lNmifW-Ł-xwdhGH!+졮h`"]!.i坪o!dHY-lS QY[9B.~aƜ] !@mȪԷftkSg35ZrT#t Ե[QFo7}jH+JV]D$iAycyܸM;ZhJaRsT>{k||J!dW!DLf8P}ȪvSYSWcQh(͉R|FN>tOF{߿puVM0dycΓld㭌9Kκ99V}#^4/ڑCTyjzμ2HgBu hÁyięau<Ǩl\ΖCc)$YhO1]ǭe6X4;)shb\zD]/9My<&unl:j[UM[Y[ld5"Zh;SMPs-r)*bqWU%LZ:uTY?@Y (<[ gJ>|$zdrYS7n<[c>j9vR#u^22/iWV]V[ٝ y+ú]JݫJxcğ[-qQ:͐}h4 cڿ#$ \՝&b0©1h3;z>3>xgI/*R5I`>}δy痘x;/XPL>s>wMr-߾CrbHu:<6b0rIR?gƫK2!bJ)''޴+Ԃ@*()4|GkYCΧhe 'OP?&rơ Iy"GxJzHT| U]elxQ<} o}?ݟ&8qT܎YjPD9$[i@,it*BQSΙ%4aIS`yq,V@V2`*OAO)'*lcS Cnto^9g.{J,m@}HsB^L`=s.Jy\҂NߢX雽fV&Ō-M '88'h1+pQɄ:A1ݨgy23H&R/vyS?7EwUOs6P8 ҍ cw78p 3Tfh*l,\bp}k˱zT!S&,گȰp@N  Q:7|ۢߗO$?MXi؜وr֋"^|Kg S e+1䇠cmLTɋRgOV 6߅lsZÌO87:JaTyK/,%OzsIdcPk5A$M@Jɥf4SBtY@$'L `MM=mĭV_^m/ƭ3,s5@Xo`+|(i&F7\h5hh|:cj-&j P9 vj*TOx d5tQ*0נ|fkS [1"UBCC0:JkmK'_[E 6W)O̶>j"k+M )gni9%3[6fMƤ "Xq [φ?/+Ӫ' ǭ}-Ϸ_f}``i`;$7V08a-|Me8IT\h(l#Qt/ YҸ)LM0k-k ֚3]fMƼrIRY<2ig iK";S-FX]{o+#!u?ݻ[Ğ80]DՊx v{!YuDn䏫br~1^.oZ(skdJIn g_Tfnӆx0ƳPJJ\dfxԱ5 vB[-5e ueex/gi[Z,Zy!:}BTPa/I kFOzjyXW 8ɩ9:CF.0;#ގGCb282:38#IdCXqUCB f34j\(3!*z]+i fQ5e k|\[X2%]*;$\XDq_ð)k󬮟s>9qg:ZiawdDJZb1]ٽqP&eJylm#m\:nu8H}eNN}6@l޺Pb%UZ15s艃Pkp齻=t~+xe(W$$NE[uB؋c5F&U:ADYGl`vͱ۞۰β)?-?z/ FhMe$ W0Gqb׆,[p߅{0- ]XI: mW!e ;\`.&wDO|ՃQnJRKT4EbƸC)leaO*[skm=X0 WD/xONr^|q0n#œ6&)Iĸt&%\gV–!|%lk~ʋ?YZȮcy V VRDĿʥ+lNS*8WTy$BZK !ױBwvm.}ۇ_- z4~E[UmAyt9=XΧm$4+gpU-5 Bce`Z{[޷|*q;`t?Ķh;}8>5{qLr) ]_x";qXE1,_YuYn-)jqNc Pm |\FcA0xJ<)Oej0wi|"VX&I}Q&/IR?a0[]s $~_NK&(B)D_X^ppy4T 93\JNt5Ϻ9?hx]Xuш~Q"T³b+k\ @%,qTUm uӘ- G4ͥ5OCita}H_+0n ēbmTP`$ ٨PP-xW/+*zbE wS$h\ Y?LKA#U[N4%NI6Op Wp;n .t*1ӡ=1W+>@l}S@KOJSաb-eL@J {E5JK CNbڐCN&lz?LBQߒ pA&~64 Dl˹DMRO *%a@ufL5_5ea/Bc) ٽ7.hLc92II8X!iO`FHope͓ɕT쎧XELq:mڍ*t.NE}:( 1篿o`I~Crn}籿.~:B&*7UJMB*/,8,%L`@\N܄e:-Z]mˬݞ2=,t# ; 1t/+ޗVePۆ0rqa-.XtM&;! &=%iT#Ĭ1"*-Pa%ƃR d&@76 EcB|!t}r:'H|* 999?8[Xp|JaߗBi +ͩN:C17q*p;c^i<{x~}E 6^%/ Zcy+^6gt$Xgq c[Ϡ׿wq<8'4¡|y|(N'|ps E 5%uR?0/|}W+I-I/_7^ܯmEkv tm#ifWz ] bur֮zp5[?Q;td$悳!@oU-DC䃄Hoah3ظ7Q7Dގȼo(F"hl/@l/ʮ)l}4Ɋ`Vb9(%Mgf3 yD"gb3ny9B C}!4\!1 '?Lw 44֡\['Ke_|U{?#,_Ne';Ql, 2N!Ade;ݦ_Gd^ ,(8͑ogFs-`]kZ8)l[Zhw\(幷p{wڝu`"k輳fn[ O굛N@ŋo#F$G ^z#:ە=okGZ3,}9qU@Et?a桼hxY==͇sz2 ]\DBZA j?^ υ%;. >_ zan7dx f 2KΒI:0){ԣŚ[> 0()_.5rxf7 .of:+/O'Odto"%Mz/8 ?h7VLXQK|SjဪpV->n O!ATA1b/Y y뻀kv5|Zs|7D&Gr΂ VE`MjnA(UJR919PEAZ/uF-_=,c| rjXv詅7VW_ָ*mݙ NعElĬ!kϭ`!bܥov}h.5:kVW#Ʊͺ_ u<\Ϲnqp}!JQʪ"zB{CxQzPŌYvbE:\ɇ[" <*S R潪h¡Brxĺ])RT&}N1Lo?ԂdC^^ FJ{3vuoĆ)d%ǓFhnTOZ~ )w@q< u7=iՏ<ŀ>7{C\Smi ]wF\<5 D0Ukm-[L`UOOsY%xXe/ǞMLҐTWBzoz[ө< êwg5An`}njqNmzmj : DZ+dՅrCn`yQְ P6c*`2lsWNy%~;8鎎??ta !A+S* ׍eiwVҠ5iv˩2דn{dX!cuNTP?uL)88Zp8۪"sc 7*"D̹v meͰ)6y?k˚KFH)FCdzQ\V3 Ub@m]ڙT3ce?= E1W0rTUL"S/D)7t$& OK 3t c%X0U-3uaw;u V/GǟNDYѫ!s9v3vNӼgGY-{ G'AZϴ;ZI/iVO6*l F%kX)?4BdqJ\L:l#c^:Yüq&V=JFwٮZAJKWƁ[\oJGPl EUElD> X+kqmYdb_dU.1Zռ_":ZVQhI5Yic.E4%OR-B/o ,;hrrybW+bAAdt$>RݤY֖9lI#@. Qr?Or^c`F[g7Tpyk_bׯ?[I~ /<6+s4GBQOgGl/~]H ;u'FteO:Fy!jP y!uɡ`lQ*;>3߂:Y SWu4:/^}fvG(cwBaPC(OT bxp5[dV¦M&N3n&.+WajJAǀ2}]L"!wS86=$X$T?>a%]ZkZpTSdSZ`ݣi]K͠X0? Dwٷ@ $l !Uǎܰ'o5z}5TOw5nX"PEe3wJ7|xJYy2B9p':]I9W ޷.ML m{ח1+|'ZLZub)ƞEdy35( [и$)hߋUڮ! -yKi 9|M! FES(<Ъ'A32e,~dF\˅X %:-+=(tW)U{ڥ4yyd]9/҃sPwz}' ۉ&T8K؏ (xkd]DPxi: Y,\Wa,:p jN=\g"9ހ.+Kb#+:Ⱥ(?\Qtf,4WaB)HRU]r-1E掌v7F *w!E۸ۢ%xVv7f 6c:56\Ǜ"Ŀ,5TT7v:Թ Ix(3T-!3F+`/eAczپeͺ=Hy%:VnxH]&7L#2hM`I:7ʭ!>(]掷 MxFkS *~]`ø*f‹Om(0/+vvLTkc'PgnQ[h[Zi<M![kmQȖ@0t@Y)|Շ(ҎtOd0FmfLKu,~[[Fyr:áo_~}[+on/u.\K;Z Dh]77qo;)dCR郸DEݘnyN[2Y\c>^jpo @]*]cݳs;,zS( EoEX|Kw>4|NF%؟9fb;uP!(apP@,.oO.A?[YO. #6N,yJV%jq-t>q"1 I ?0()j(Uve7(iLר+Y4o+Z[wIB1]38-jG #e_w꯻7[㫐-,/#ʳ˻< ~j)$T H : : ?GQ `| R4 @([[h  w.stᝣ gx>-ZwMm,Ƭd:`[ą J~0 0hyC N0w8}'UGIvm혨01lib+z5J> ~{"[X` i2Rg: T\[VVҷYïv5M,k=]e6C6UK sy{ߛl .jQWa]&]*c2;śb^q$ ;мr2ް5Tqp] x./6m }y5!W~d`]`9|ǛiK%Z Q"(jpm\_;BvB q|(`4 Tu$;vA6nM!ʢ&w&Y?96NZH^-.2k < ʄg%`Io}ƭNlyhί _̄\Z{U۝dwlwcy-\)׸V];`ף;DSaw: r%Ws2bAtU{+JwSBt0 {)`~ʄGclŒg 5›DBw|@~jsPs.a޹8^kM:aɜvC?ϝK~%3VMszCŮ8T8,wiY3#(R~'Z4cWd.w#{ TȨe;?8q ͍k4?Fo"byg2qE~kE")x)6Xŕ7$ !I 4n5cS; an#̦y4=ҟ:YS'?D(~;o=|/G]aCwv>mx߮{?^Pֵ>փOQwop|yC3p^~LJ?NG'>X0<ۇސ[S`>U?׮_`;A`GA.C(qp?bT$:^:u4r*C OAF3z G_GÏÃѧAi l4}r>tҔ/ qWw*Pδ4QÊޝr~Bظ}Zυ&iLycw$r$rRGj7;Ef R_?xT?շd P؞ X&9B q C5jP䭺ֿ"(kL|eD8\Iq\oGlԷAT *SwF疝@U+qr֯!󍏄fߒŵC31NYڶ8M*GK'ET5jV#$Z<ۚ"ܧ6Y;3K-C5Mdd ȊEC-C>PehyaRz*Ya*jWd82z?NeJ;-i@5bUscV0w@o"]N7CսGL>|*M(8ټ'au%r{hDu^'?&#>I%?^p\m=[Ѱ?OƸPun@iClsbIӾ s!r$ t,ڢs)[ IThp62~rq1VwDq¢>Hl#G yo[vA.>!]#>#]O(ta!lwY7J0ʑi>ojKhCru*ɻx?KSQ?FaO!XVU-Ђ ЮP Emv괔lw% JC~sMʼnA"hp"+SVme2LL;4`4BӺmKxBՆ a AhJ [lVǰ}Ž;E1Dpׯ1e)` Hhe3oz-ŕ$ùHGe|yHL[ڼ߿Baz``=S" ʍo]j__b[:VEƽe;66`"wSQ1>Hh߿(b>.͗ixs?'vՀָ 6ƣ‡^p1H "UJXŴu|~|l[Q+@L.o-r|lgY> j*վȰj*g][LաkZS[ճ}WA<C@sw*gp!8 1Pq5IW y]ZI`t{ ?w? *b^B='ޠ`G~ w,kϛϺ݇\&7A~Zu/o{[rl6 _0Fّ 9eкgKXzMV6*y"02k.9 ?!෬ȽaN.EGMBuCO'`Ӈ+m$ r)`;Gn̆qmPM[n7urrji_=ǾeIO}9=pB"D$<̾aQ?n\0Fz*@b``\yϓ%ϸ7ǿ06?V`z 'T[;aG j 8H@%'ImF!)@co=1t)TlǓ_g #,I{;b8]* FJ1vɗ7j7Ia֧F?w? %+3 䖭ġ7XCV<$|G [aRq$nv-GDӺU!~CIǰv%n;7_YU ]x۸1RȪ[!8L녞f`Zn|L9N$NsQIYb(x d$P&^_"P&0a* !Ϳu4zӘ:-#} GoNͲ|$ĕ\-6(rAHwTrc/xsuO\~gٗ$B1K@x4 I t H)顥񺷾x'jS- Q͠jcwv0 wNLJι Vu@5Sg(mncwW'j?Fn+33zP pު aI^Lk'#ZY!RGSe&@& 9Q"xxQc"tF/-K i6-tvU2 ZQC~*dqP& J[r!KʘPzH&ͦV!4ˊ-l !&`f[9wQ63˭X;oǀ,8bb?}? H9byUz냁{ЮnE ׃GGݽ^~Lڟ 0 t^? q︴ʥDeIxu,'¾Sy,[>Nh_gF9890v9^}nDl6˘~,ʙs_X 1." Pc#lj| 8°ǂMv^7va]+y,ڜfzik8,*'oq6'}- F;^u] \L[5K(l~ Fo_m} L 5PtRo=E*8mZ۩Pw7:9apy-ʀ~2(b%˞'b-L_ E_k-)Y!!WY GgJ5_B֋2aؠ, Kf7M2 ӟ9B]đ9|{cя(?#x;4ECT zUb!g_M'C=;Ը2?J*T#9o9ąw׸~qL([9ԮD zjQd,01>~d a, 41 ?UHQnbh^BI%TĖ#Lk},hx&XP.D.%Y29[m Ⲡ8 D Z1 ɻe KEL鄃a:\D؄\f̦LږYM>r+q 7K٫+:0(6XYXydO^šWBuʷX(ˊBYeE Fs4(*,(%,yIHN' 0 0weƨk8A301;qC96CZqG@{5EDf.1[,MI =CRt`}nUz9պ3nhd"FZb>)Q 6b=wv m=*M )wIJ^[ rY8x)\M@fuT;+l7ٚQuv}8Nݪ7@T#})⁎9'hg0Gw8)C`.wXz&>&6!QR3K),֍qR2 8moBS&Q4鞖<KZH@qFU\#Qc&,| `Tz[K\Lcٱ/l4)J8@ILe^Y#HVMX! TiTgT`^X42"'!6QRD }'mut=IK̮GihABŖb B) )Uo}xNegj^jsM!aCX s tmSnNm][E62^14=>sj1=d:@N+a/Ȟs.^wJxQO1;f€ TeyM$XljR](ҙlJ.cZ5j]j0j|ieB^PW;(zzkCʙ "sW늦!"z 3*4O "V.sUd =('TT`n=T{zmU[F1IJdL{J'XXYĹ [xWa2/m[)Y1Xh&k0uO_LA3bkb4Rv u'\gK)'@pkafk$;5sGc‹J|w *|9oQQzŝin`wJV.;LŅ`.H`x#l,u:C-9Mkx˯ OŒL|g77`*h{ZspX 'H"%J: LbXOڀ`7Ut%A 7ыhȈhKXC>io h*,T7@nJԪeUHf@YY%a}aѥS{; G؇{lŚ*u+U0|b`7(xyXu JUW"*]sߌLWcd{HFUy3n+wtL}dv'3 *~ /I> <(x*U^X}zԀX5/ARݜK˦=p]V̝ɦ( aǠ}Iq:nֹ,q7svl?Uz:ye|&>0kh=~ce?&V8Xհ#fe?C酯 KԦe`/A?B_&Qs? RzK!M*Q}oG }yTQz"&SHzeDWf:0s5yxhqLC \}+n5|HϏJ4lpwEU\FkB޸BYOC2&+'H벧ԁhs"KF!d/:~BR64!][:KX毜kdlvvǮ;=?ԨT! " %p;XЩzP/UpB$?A>Es M=]2j=<< r)AqiHj(K!,XzQDFH.$E Uh?r:U4UO]hDZJ1I&GPk]].&RrЍB0N/24tǗ)XltV .%<4]WJjVW{!eMBLyu\ H/^1r/krOn9d.hq9KJ4EJZpJ 8"@`Ӧ]J,j O6^Y!G%tvo$Es|W悔2EkP ؈$:L:rYCLiiHR0 s/O1NE6>dcd@ .}ª )~FmhR=hKrc}xHƕ^ g5] *9~/_^l:b[w$f4N2a/AcXU9 1pⰖ*dT*Ifѷ[+1C9>7d^h:1j"gBF=;[iWP;XިCNc4bí d98G#jw7c%M D9~]m E?bVܬA@ #!ly / Ce PcHkV6-(taH<4fxDP MM+ iBpPK>b,jX8bOǡ~`\$unFn L !ձ(`1yUi(=KSx8-i Jk0bs634u0'WI*\d2ɾ wmϒ[pPt2VňAlb d@rcZ-G &9 L.^ϳM?UnV0Gɟ$DFwW /w>-5^VIGf<3!jƜk9ױ%-ڄu6P!6c3*ɖ:%(P'C#ia/Re:uS'9AחFU:Q|{hTWqw<'mU#N XGV0m/ą]ȊjCT+#bUML}Z`+*ҽ::AW7|cDv'~R9.l='5 } Ywֳ_fSvd ctb\b##u[!Z_Ą9!(N3|ٙa{ 0b[FDfKªTz RVDAޮ!~mIPy8VK"Mq~ХZo?5; EA1U !`PRBJU7qFJ;XnS4\:yt{3lN83|]:v{[ ĂYҳج6쪪Mv&m iTWh-CɘN ,o8[$\lf.5A}cT JQ Y:0OkBvx:61r_=hMYGI[vMB5rdPqUjYsHnR3;Qn3CNϽfb##׉~B_B\ҩ 1D CEOk1_ G\5n,)7P*\`z %{7]%ZOO5m[]o T+[%ǟůz݇QIy䶑O^b%`݆\!e5 Z19Pi(gsEY N_ 9\kTղ+(6пt+\՞ XiLVT-_1@COXdq9(Rd#7-]+/Է9B5V鈰ksB G'/(uLS ѿ21;g`uPA,indK0l?)xgծכ+߄m$7yv+ܫg7(DSѻDP!k^'$SFty^mL0F%D 7p\#`nITwP_0Ps9^N،_""BɄ L3D-?z_#yKܖrIu҄:qχ y¿[@W g!K[=K^G+Łu\3!qtfJ}ā:53E}]h!W\V K jv|jfԨh0kB/NyPM)? ނPmNk{zحFazxg8Ӥy)OtyJ`ih_sv|zDùx02T ZsC(ڒNEI,% 9oLɞtǏ۾(n;V}Htǟ[9:DEFIfWw8lcB4Tص XR?RL# ?'vgX k0Ky]xaea/V!uV煋ȈȭI8FX`f 5c aLpC|#! 2.i֐*5M[_ %7:5[@CZ*jj iԽ͊}t;%_ oUw*&* `iuK/9"gNpkEe7qIB)dT*i,?UKojq#~_hR7lFj[mԣњVjڵlqs kPgQ4x+h,1`oc@邧3SG{ӹUA>x.#"> FR &ٍif#o$ų" vbYd$bTQ@hslG%P<71PO+% 7[HC[2G}C y۪WT@@Jm$HXPCXbW (ުuup&'j)L|V%r:|p)NYIynY~CsW?GP^՗-`f . |FOuZ(Z.Ni_7"UHE/)%Qg@^6Ƭplv9op1*{pEsNTaQu%Jf`nP,]N_ucQױT9/kaǠ-|VԦyb4K|ɓ >5L8g'59ұF`Hr͠7hM>2,2?ߒuH8N[D_]5TI! žt 4_o;Ͼeh۸(Iɖ.G]%ۚjIqv[Bm!]!s0j]γFgtgq O -~xUmEMڸ;i9]5n=+(9B,dE}ct|WG3^h;F)Gwo-C6hI /{lYҿ Zb<~?͢Eԇ%Doc52~3 caDŽ+l.HfPCsrX KU3K2lo#C@T|gb 9`.'węTfS!VGnA^W{ҀY2$Julbu8wNS)d2KtԦM=Ҫvoi5:v !$|yvGrub n'rsZ(Tp׶wcgCR!y 4ws.NٹFWџ~0V}jDdۇZň'h͋).oxOu*/"E'Α<07- \~~xe 6DfѧMe@mߜr&fUp̟S-'T4rΘ78+$13},é{ RhARm] z^YHǎzjh)?g~<ƿ =87N#zNߏAx]ʲI=늟5읞{<Q{(*FG߲aFnjDyHQNӤSN,e~&bMcI-:nXMS!SS-? J >yTc4c]fr*hb9dYG48BzCR$#KN0uZPTTg:/ɉT|TY(n⹬ "vX-8EbBdAlz|o|5d7r|az|IGwA)M[dsxUڻ{NKU+:PA{'88la;hy`/|&=i'I/ ^!-7p qO.o[Wpsm -15<>mwG0}Ι@ߝ5ɨE˙Ɋngi9i*"[raI۷ ꥛ML{bW BP(0:Ԍ+KU'2?|@el7oC8fN7>Dtnh*[:<׆#1tUBt!`l xAO`B!C̞ 3ĒJjNmhT;`xnv" !s:Mb {:wvѡW7}H e- [VXǡ2]($CpҪi$,XgqH[dڙErVY\Wxp&N yY#IpKs4{{q^[%t׏Z99nҜcZx09;4l?`T# ,*)WQ}ᨪf,␾dr l\Ltx$Jk^:AD䔓ph, Ƶ]k?`,Yō ܑͦ5nEgڶ_ (6VVNp mՐغhfJj͓Q/'ˮLY4تk rh )2ׇ슦eԼVZxG1IA~#3TsM@y V as*MD ߴEzZeI\/`^u9Xl|sl=x W|fϑ'eWథV2EinĔj($܎F`tqV΅,g\v iP.WԳPDH%lX3nZ&v1j vj4E'LO]SӮTm9/F\( ,mzEVƘ]MοB4o8F~YA8âl wMƻe,20b!D`7."::jLr3l(pj9sTՄË>|,߬cO9v'nZܭ)eJ5{B[Vg>e8uP]?C5e:ṌU3Aﻖ}j$оQaȳ£~{RjTe3/  ؁r"3A@ᆖbIm Dp)s^06PhXؐ?u5E,xCE+o}T(A^Nsya~-z'[7!NxS&)DTFY0 $h|TS9ʷ lDw9p19OR}c66و4@V=BVv]1 +$WB$aزf=$ se.M:Qf/Yr[ax#> 6'Q M1̡)l4b*BLl\Y ãuiQGo^wõpAp }HKBˉE`DGNqZ|X(Ds@:Yx s1G:Y͜q_?prNv)cp9ѷ -v_6R̈\B,W }^SS&6S&%iI['J9m0mjO V`v"w6 \X$wdGє.YEk*O* .tP@sP8!P;`zv|BU}Yc|UMg`PQ_)2`Dxv3adTXW`䂶uu{B |!YrWf!]'Oy%I|[ɒ[ 'c,L7:E~tY`\6( \\Vh[:UQRW;.kBkeuwBe|$z}4s%b%FyMbN+HT<(faQ,ba|[%{S"%O?+J2 "\pKJz2̢|_B $X` #?L! 5f@8-_c!k|bw+Sv}p;9:otZ{ߚ?t ߉*~m:~gj9/W;VrWv,AoUi,۴dbávV`˧V?iH﫟^Nfj&@̫u!kshסX,V1 ]~Fl[HwXoWS w𚵩[:/UK1FS5/fXCAg80p\վIz>\3߇CH F1\{'Stvww2TZ,߻n.{)O!'Ea}:Mʄv8n^U3gg1E^&Te 8.n"c%s8SYQ0Ӆi>uM#N#(6[#t0۫EpEF{!5j?‡wϡ .e3G<1LzYƜ?IO3mA^l:\N K(X,?c6H63@O7_LHaV$KL?3*M-w`E_8Rr*MZ@1Ut*_ W!29~gV^bSlQ;hh@<9x9Ab6 LpIA헋Rh,A.p2ȯvhk  ̺]՛t, 8Zn正0)@m-N758~w}vvOfu(XC7-9ӯg~-mmP̥6j չt8`țPGedML2P6erGG^6is bC=SZE#S\M46ӣ;f[GGPqPRגg搫Lt̝]%q0EBTo( H.3˪A#s#W*iџE ArK?¢Sj$/τD> Ba:NtuZ؅]:C2.|+y5S!K;(OWE% QrQGռx䂂iԏmL#uXj﮻ 'w[nG&Puj}sqmfu[w6x?Zw#<_5Zaߏ^ro9,"1!=&<@4(L _=$D^BAp1!OЈuloZ5eBᛂyֵCQǬRp#zq8FxnӨ_v[Җbj*ILM5`NS?S)ufHa7ĀtE8DBF*HJ0IXWݭy5Q"7MG>iYc!xOg3<^%Doy&p fV<Ja}ӿHO.1r mwLɨj(B@OK5X>ֱ5^gk )pq$Y^qXkzhI-CFl76~57L 4jE#|ѻC?jG'μV?SVZUq^'v}Vh #&UVB < o壐o|)30{.a枾^L$_>Fӑ6ԓY6h~ {L.ByǬX%?N-hsp΄/M%3,bKuf-;7˚,=:7s| s ѺJRY2@LIkaU+@|cAܹZQAi-(!#^*p|+ XxB!PCh"?*+UTãE S ]u0dG ;5]:Y0q7'lGN oZe ,Nx1IӠOz{ôzL2D :Z"Îb F=_DZOl5&1d?O(rU!r8F@[b˧ӉuX)/_!ؽw> wpճe**w) Tm;cʲ\Hēr]xUa% ex2ep f.7pV 7XGgWu%7~4ḿxT(;aP(WHC$;C^זK/*`}S/Fޔ%qe xDhٔznf@A'KeŬuEy}Px6}JdMc4,;Bjˤ,s,Bp {p-𵏉NiNf`8^& {i;j/I!"* {{E3bdXj!8zp`Tހȿjb%?Ķ\?(]C7{﫛7lH2g8b=%1:ڏdc}.N8`RފI&+N*]{9Jx4.WiȈ@M+fFV|k <͝SS5\a/ϸĠ>yp<u`l ]̆[+XA$)ׅr>҆ȿ.[o,c8!RZ8(~.MQ Ous8}_/t~鯆cV La yF58Lƾtgɘ$c'Rm>t^b7&DѐܜvCw8 } =Ё:ZR`8TY8.5P牞_s}9jy` Rv2D<4ݙ < B% ,½EGCp~JkS ̲/B~ ٧ da%h&9&n`J} v? _ޖh%_vE=7 $_-Y5? =]*~!AQYWyD79)Xj9,9'S6t *Y)- K|ރ&Nߴv;Â^/E?_Ij*4K r,. /tC]Wms]` 0ߚ#j1 ÅC tUn?paw{OZ5$!jnJ {!)@yw߻L=aO참b8Px/1b0j271vM)jQ;:Aht?v6Irq,ob5]6t{sx|M55 o|B6V, V{qJ%ւ؞lZ^l.q>,)(^UGXk? `nerِ" L^!ɣ/M3< wTOl2>FDg/yZlh&tGbt0xX)FߚPp`0Vzw6P `׳4,j r5<$e`"%TBf:Bb,J١RM2\>t8SŅ[.c(}zm'р<@:'[ZR BP:Hs[A}&@[>!TY +2f2I (FzO;BĬoy8);AŬ"~0rr9zN?nzcsݝo%$EGhSoN@Tʕ0)5\EIkO#A@+agGmH3&T_kIPg@%3X6/tWJpoV ЯOYh=E/=#JX65Κ$ ?1YI QU0RA5BMLZ@p~8OWGzzxfbx*ewtvdq۝N/MG7/QCQ:у !жLP<PT(%ɴNjYְH5N7uj 5^hx4ɂl] $PzK%5kU?x L>%0Ƿ`95Lvy|̩{AE7{,Etכjc^CBouu5\( r\^}bH_T-Օ^B'h"ȸJ@E 䇊jzU,g~gaSoA!9knz/Wqv3f+}n Ə;'aC:vʬȎj*tt84vG Zp\0(IMpAvtw!]䅵l)p TPYvP14!?F}/TIOF[\*2U5&ĴxfJ'U6Qv;"r=_j;Y g't,PZQNN/"c`O!qiݒa'"2GcbV!ƭᝪ 1!oa,рZ)D8Y@bYn5jF2DK-%N *e*AE%H^ՕL0$fQi UE !> +qsZM\U c6E~EE(eVEntOl.8vuѧz/ɒu*cM^I}E B&;Bt3OvSWeu9txt_)?,#PFTY2 ,S|_ rXrFbV ÷t  H:Fkp;)ƞb)s||t\?l@>_j5ףIū5tdG>Z6ǿHy9MX 6^4SLG IRԻzˇiӝˬ< l+P uy hp ?DsHNK(i^B!_b!} "+[Qz\f 0#J/Hq>^jsz(.J7ꝏ :,+֥׃houU ,J7QЧ;񎗭Ӣl?6{!Z[>_̵_h_[=, 5r8k,-_tle u|He3o9.sآwiDyݝ%V:dx s'AP@gHjn7tC DԺ""|<%a*Hm?zs:|P®Z O֫~1yaQN/ }a#tz=={Rc;0*QrŲTΩDy2}Ǎz9l=hS<Ġoqp M(J^,9S(AT DUvk|FahPogg7Ɩ54 .H.$|' uW᨟[Wymw ^s[98:i:IyzG~{C0޻v]5!PPSt;~aA&BcVʰM~_ZG.<ﴬA]ToZqnOS$tJs)rόFkyEEfddnI>H0ǏҸn.׆P! ]b+띿k +]C\.#k/Cִo.qM e@(HGP 8'U2`J xbRENر['8t&':4M8hzLh֚L4m2f8aw-ʻ _mC6>{R%"⿨2\`.1 ~!!m|/˻)KE@//ܞ`E .}f9e.vo L%Ÿy5/B x fޑ @2OR"W[a͐ $U~r91D׈EkgO"^ !XenIO|#6|1曆d48W8 h&`AQ8pT u:s77OJ[W@LbFdT162(q;|A*hMG𩻚k_9kJNVAFŶĠ"l{<1n[pe7lf{ڶgj xnkV0pۘ]" 11.C'q q(mBLl>q4mӹRE,aP&ɵL a&4=+iupTNm~?w( a$I 042r} hDI2[ ~>[R]` 3VPnjhGng|F>GY&q }2vq='QRlj8gQ +H,ǀ+3L{8Ovy,?@0VF~iZȏу;ծi~KPtK2S1T!bhHEEО6V)PL \?fҡA!xSa+\%#ϢW2}׏_緄DH(@ 2E]]R 1wZʵPU ܣӚ =̹ʹڸ})]I#3>yWꧥ:Rg1/}К0b7ExQqABO&2}4d@ÅJͮU7,x{ ~=2 k )(nE؂,j7mw{bDC>2D=,OGz.dMws!.n] yFD"V }1hCfcB+ڮiq0o8()cf"U zigѷu@;xЃUc6c~{rtt~,`8#'Xj G v 9HN̚ըp EURD~]Jbi}1g0"uFt:֟dHPU3BxHL2/+`h\-~87]V5~?t~/:uZ21F%řTK`둘<.!ϭG\eTۃ>|eM~n'etH34RId#`B/̕NS9tystF>f0 #U"vy|ܡ0f6|JƼJH;DrШ?iBu#50;B3+IGrjSͭAJɤ~b7pRRuIѧJ [ٵk:fUf9h7IǢl?S"0{oIDn\0RbJhkbCa1kt -(?# E G%[Ӆ|nkҘ[5Ll­/|@OoV2U MnCMXi|=dv߭XhᰙC$U5F/>öZ/<6t @1BP_)rUj6ІDȟ[$r^b .3WzcύĹ"_lml1`[1w췏֗s?6u|OH;'ŠGМl-!PyWt,KQ}Γvu ͗U] tI(cL/R!B]6מ1Py zr(ㅝ+Hfe0&`u90o8"6 6:\r`5CLz0.|.>5t8h7^?9($oHM~6ާ$op4 Pw%^ssb. m^d YW à [D7d2RQaȈ :8?7yX2/11HKF!V\)L:7ЮC׾yzx7H_[AJ ̄;eEND(d+ 1{谁-[Cl#-a?u[ȳW;xo8D@`+ ˟ᎂr[6}~]=U4l^9Sܚ}㛒\eBN.@Em猩&USFܐ;\! '~- w`v@fG*YKn"~'힋(|u趜Hkfr kT$Z0ı eP+2 K5VKӌ~j >j[ޠBTC2Q35 gQҾ`y]NeiӜ0a|Qu+QYIݧD32%W,T뮞wZ/jԔ3~/e 'Cx(?"e ̲ZHe)}MgՎ?2 ýt?w7Xr@Q2iZ,(>k6eKR] fj!<\/C.J >ڱM tIQ0D, oirO5^M!/;$ԪAO{kv`)#w"?'Rf,7)a,U!֢B\|c#=uΈk!ǀ`nHGK8#Hq>5!Se7 vA!B]1eo6/%/o'yHol]- P lZ:k/`/s Eɉ%KVWh3UŐCJrEU ٿjtӹ-aU-vv) 7(4m]r@ɳӼhE-;t tUAiĆ?ߵzalMtv'L)5ZSJϮG׾w6 mkW8+=ׅǒXI'Y yG' l cxS~p[Z(Q {kD|N-?ue}B{Lš"Uɶ)=\8}k/&|Y)i3/gTƠfWMX6rjzF?RL`EU\]DgLzXΣB2iDŽru  \nRc'1S<}(T$hs܀s"irZfv冺 [ȵ#9mƗq~%_܊gÃMAi`^1e*zzJ5gMQ()ݖ[ .GZ\9i(bYlCm]T9ȯECvkf.dq^]$W:2tsAd[e-,B ?R$ʅӶRHD}1kł /❻;_2!{9) 3]_\ޢDhRh,&N30kNۮțI ѠGCBxAxr1[U4.g T.ws,EY$it'] m}t/z`kӭz bIAb@ HwbU,\aӢ "4v+Gy?/*HC1n_f4BUp+jɔ:c~=]zOfp>M>Bg> e}Vΰb` )5S˕KSu4=_a)E~”45tjz}fbw _ ã}ww4jnfяr}u~ xݸo aJ`7 U-l֜/f~d)O R;%=;gSf!pySůEf*ݙ/vauw~pVR?4̋wتn N?#(u:[U.CA>Bͨ 1*#!IF@ S@X0Y1Calw*M28wŘL|kYYlFii&֨4PU,fn}2J,e"g^]%$"$2Ƭ L(ơt[-q".2X+*W=@*_ dV"n:eOMPַ3* ٍ<xI4W#u|k?W2R 7!֨j28sXk o/zYA'GPoo-9|uznl^\]A+M?N>o 4g#S)y&X#i'1]s4giEݳy6q:bhitpR2Y&>nQlxV*x;1AӦp&-3)th\r)kU5QVvb"➨ Dx3c$?aGeEZc/tl0d]`AM5ěp:6H O~?!o 6)a1!G~wpXN} &h %eD(B'[R ,Qzњ%3RRrƤ-kFL뉃EouaM54.خL$K+qTvj[ү錁{ai``z,UyP^ҼҐD"-aN7~18಑M&fⴖ+6xnN2p^Nxc @fl+V]#}y ׈B_{Y􁹈YkXefY&= '0G.u +c$NLpNnWZflCpuV szɤZuu :~+ {>u q:Jbwd t?hc(ވ0X[*-{0%8$X$v0ruyh9nLNu]F86GO }C -oddҋ-vyC qF沯<~yń>hh986JqQdzO %VOךA!L su}g_bs|w$mI'K{Ges q}Բ8t1EljzǤeЋto3IGFq:l#rGV62Ls;Bn(` ~:/jem21Emح $䵤7* c*jj-Pn +!=FA(9fFjN&Ljok,Nӳb[J<oznwL_Yw7[]̥3JBNlZpѹOQI:wHG۬bɊ&`1:.Pi-}d}'-Itr瀝5lB6fDC) ʙſ8-*D%-h p m[iVzi#Ӛ\D奍OAƇ<ԛi)Gn}ZG*0" }6pZI2_iTN5"!@P!W(a\@kGUn[٦t`iwW?Ԙ0Ie$3 $CorXSZCcyZovsf$X;v™RLY_1V&3lB4g*ےw͔5ҟ_L>Q3Hg-Kޫ/%8̴Iôj@%Go,H'm7HOtT&ŬdDQM2\ \&Z']Cq߬KZF+]8tN{s_Ud5jĢ?TEODԑvqtQ7_tnyHr3!@#U!z2 A)W$ܞuס_7P#v{lM=l Y) )^ӱ5̞HTCXq|tKhS^-uSK.N?ê3g<ºrȉePL)( ήBdj@ph6ܼqݳ,y,$6tyj|-%p(z[v3OH(!( +ȕnFXSZ_Nޜq$$yaYd 0E@7h41} 5YC2,:K F5 ^&'~1 !P, Ieg &%)y7mT7$v@ڸM78\20txw4;GI:ʋ6dKėq,?<2l7΢SI%rz&>DYnU2RkqbIWTGFiwNڝ~Mgۏ4ĠGC2qSu4 ~ Һ,{d6ų@/}!Y^?h,&m 3 v'$~0_0ХGkHz0Op(Fƛ\?nj;8u mg+^NթROVqTnwjPcx}Ac׃Հ?9sReǀZpQ3n 4ӓmZjp'R?{X*՝,Ij5_|mlam(ss5D66'Q@q;xB7H_+͗:;Uyh8/(ۥSn 6;}(!ĦEFY%فؗ9Yu 4ǽ{*PX myל6w]J{ 18_> EAx Xd%!.#@yh/Nǃa:}16}GYZgno5d5<3IzZt U{XΕ Ȍ1# }vHiFOb5k wYlHtfo~ĪM;;;gR5Lg˾Ïd`iT=lt?Йv&`pCzg8P8bf4ȧOٽo`_ K AQWyF:0'>7Fjj0k*$4"IMif6YCpT ]촣uԟ7`4/FϣWA{8UpbEOZ0s7wL e4Be7(.H[HVH^<nU}1ޤY9)L 3k@ ]l. əO4R|.  2)=*NAg~{rV^dZpoA9:iw}9 (“Z'M&-ʗe$oy'b:ɍ / ]iUjܭn)txvZ;ч5kB5 w\ÑFE\M2e2#J z)R[ctOl˔^R[Ke>BQ`-2fQn1h8D-Vn*]|Z]$ճi?ܒ>'Q6HUÛ61H`:ռ]%d0&} l u~g# T.7@Y&B/ *+NkAu{:{A:f4d2 YP?8z= "`Q] qњyHjQ:7ŠjF([18V'e\ p k?}p:}͜Z$B3VvoN (Vw1njw~THt8Y}#*m[$3,ZUH=SD:HLf ,LŎ8/-YWaS_ 'F-׭m$7?i.ʶ' [{ur#|9J7j[#V?%+>1X|[QρU Q|^eړWIv!x\a _dt c0贋Kj ٷbH^N$~euq~~Wt7TQPp1oL_5dXJ ¦[Zu*nUUvQZboz֬s7)%)6Mt]VK ɌK**uW^:)om]zC}+||:r|k_ Xl,ãU;Y[jd-V9)zk u.KT*qrx3'9+ R'^Un@b*',wp+rAlT~gs<82IQn݈Հv\q L|` <@׸ǝeS,;_пN:'~G(UG}PZBw{=-ş^gU`-|;NM(zo"}KsVQ,{Z^x? T[]Tդtog MB q(I6]kCL9/|yuqzQ2,tW#0 ^! RhCӟ{9*trXAyͽz`GBBqyN[*MoXQ[@D=+@VBx}h=ʨrAсe"Vq֩ R24Ή}wtW(f.6,{grى|&vkB  6h NEo9}| eDŽm]>rTi]&;>+gʌa r j -Ni$>4<df/kiSsz.DIEw$bdtemi6[2m3Yi&DmoV ic*Gygb$ܳ&r4Ђ0mAdH%zbK@UU@CC%> M8_CaVglK*$nk X[Πu78[{~/FZ}_p:r8.PK9 w.Fp'@#a_JI[XkzΝjB'!K537ޔJad4e(jƻJt,R@êc ?KRE LWV)8cVKmkYww[n5 rY5BR7'4`C"n#妾c*4x2KavQg7MDZ? mW"bNU9TkJ#Eهj CC8;JMm"QJl¾RSP6hs&* *?*9`u] $BaMQ)(E-F\# sD9fM"b2+k?0Jz BTM/!E,@&=x#}lP{@J7쾊g5-A+ݼq>&To*4iXyV} W&4OuosKWQmEDwv0uFKN}S҃@sdn#&:(Xj 12nB^^uմP_#f@!HG(&K# ˆ{ίrwуq*Dп` ; u?L7Կ޷ZΠijNVux=k`4ISd"Ϩ^d؜v,C99AP:i3b0/Lhq狡8fu` ¼"1e#޶NęmÅЋx!7Lp/`ema{mnW T ;Oyr6xuQcjd .x׮}p9#]Ǐn7(:w}tp|t(gNY2tu";3Cfm3%'Uz®nuB;ǥЩ  o8#@[85Bexgjk:^R0]apW #8eu {.$ RAY*N,б?7 zf!Ŋu#5?OyS̛Q/G^H4SE>m^y^d:u fԇt{C> $*h@_8Y[#D:<13JY%j $0fq'xs,}iSÀ kf*!|EY8{tx=ZRd}MCnsb;bRcole=d8<Otx RT~TNnbY.̖_m~|7A8X'}T @YpۺcM%m8] #o"bqT0Jwvϋr^oXd098VT3!Dh8@C_.>u]m]$gFKƸhc2&3fŒo3s6J2_^A|l!| g z0 Gz 8%cmJJ۟)f4%4*R 4j;pRhdέ_n/7vLT+Gh|"J[Rl5:4J a)X4k:T'fXY+Nh}P.Ys \OdD,zءr;;e~zZ.ܙ.NzZyEjTQ&Ub=C{P W)f`Wk^5!K ,VQh3K%+ҫiQO( -."b#иwBCx7JߪVjPC7TxdӟH.Gp'~NdaUE;vE'$s+g4B8--n^ ;"s u~ 螇<$FX} 9CY>[m5tEYLu&sdYx2MntFI E O$*_GdУGm2{)tf6,3\rBm$H}dStǡww,$MWIj#_h,Ao ˘La+ M!UJMFem{UDP&|KݸCDL'fάZZSǫ ܩ2^*Xɝy-`.[f}iÖVL#pD[FGkPBx6r]؈n)Hg,`CBK6C5T,KI}E5 {esIϿu[Ɵ7rjDU30eaPNFtrFågiѱ:-]=P9֌>3ryHӪ.Q, YPL |J*[~p9ma}lʶ͖A=|)vd82_|[WLxTmp49պ$"n=7HeƄaF03["ߘ_Y(x375L֍BZwn>PӼ!{pʛQ<VuKL4eo|v79ӫcu2tsMV&Jkm%rPeYmt]F>s2xsjw rh45S&ɓ~Rsޤ6W_(k ċ-ȏ_n58Sϗ߻e8WK{jNGXz.Y_R.n(gƁWxa] ?ǫtJd˱,_}=7 UxiM6TН}$R'1w#6 ~2Dq85-铂Fuwܼ `UJ*sngX޺Y @5/N,JdP Y[b{:7E3j֮D).-Ōz3^VަJ@8[TqR"5V8ԁ;MN\i6KO20^\J (7Pܡh6PaFYБ Yů)4紤15SA}f:AdKbb_!αU,@֜8_Nߒ4l B<Ή %[Bu[W3W :y|^#:nH+zC̯Z0F6Q%oC^M|$8eHVtR=5}O2/֜3PP7$;rcctzTyV`WM Gc++FVTpX)®T~$eyaL'ʻ}ͧ.|-CZhz+/mVt#juPՐA+ {Ql#(RƥjivKv[QsOץ 04" c)_!O: 3CUN$¡ ش _Ҝ h{=شQz5v N:~'Ui!*ίqA tNdU ߶>z)S]I& 9H]qpb ) .7Kuê`A0cA&m*~'bz`mm%*WñI\o1wm|'R!y{vc]1]y6ݧM%[,$ 51-G}%W7ĻG1,#ӧ5..š\˵O=|on?ɥ/fv[2:vҐnc,=1jRpxYrX埍_zYnEsOZI rqz}~-Kov q[H)d:M3ѥUJ ),X?xQs[M:Y|Aߦ)C$.BWn:8Y<%H2*FŽr&r;ȼmOp"VloinY R԰KԺF8tL\)ʼFtk~qnEM"d^͑^ӣe2`l̮>Ù䙳s.vj 0^aTmm$I~⹳d ݳ>p7w0>^ c!iT/o=w_ڨ2322222222\qiћˑPm!8UR=&} 2[$Rk6L>u=5IED=7>NLjW ,&y! R Vi{%J( bD7SFb4U䬝PjkgO\ 4zFoY( 6QW !mߣTU(P׭cx ;N߁phWLbؖWMT]^#rJ_䴃JR' -MJOJK` <r U*Ԛ9j[Dѵ NfL0܇kQO@cLƭiB `QhbT-.&8qun.פ|)yS>+{itU=jTkU7|ʧ0[3%V3dYK᮲Y!XgGhQ;8UΩgAI>~ljgi!C1}F5JeMﯪ?_>_G ^bTqYNTՇW T׾7Hwj2!T@ ȿ 䕌'hc HaH|˱i Ԣ;!GUBY>K7*^n:jz 4C|~t:7nӮ,u'P5zl8D%Л$88k <Fȹx e>=U?sTn 1dsiQvF?&bc;'ysqbxu6y#MR z[~ *c6WnWxvɋ7qk8|:5 M3&?\飋_4d`,n(S[X:SgSbTSdjDS+ V&so.u3L4Ujl HVnޟ*͍AIC?:d8ѻh͏$I%zTR!d <s4lmRϻu ;ao܆/ vR( bnWP7|*.p8P}`7Q6%3\٨!\ k%g235ZGߌl ID'ÿ`w` 'A':5WO

+%\Z)0Z4ŋU |8ԜV1S޹;Vሡ7D`.Vdx]l-\ U Y k_{#ZnyVvu(ljB-$cZ?.խ 4BuAS{epKZ=Ƿ#Ȏ2$SUWOv^ aVj4Y Ox{<ϧS`p}]Uo nug#=6/G]x%-*>|K_~@^Ie7̐6tZl^Y̲)D/&Th%o #LكH0Am"U' 봊s~tN\؎yx:cRwfaNWz\vi^Y΢՗ZcJ ~'?V1 ,0?lOU^@]v|88-^ Z6KmêMuܭ}]]Ҷܭme.u5B8׎u/8:yqg-N?6=DEbֺMYU/J1ׯ?J>Lil 84wY&0+RTtb\ݺ]D?5u1.- MJ'q4^%:t!Aa\g=y *[~ɔ8#iu{:iDA6 Rs]}[z=fS SW^EVa8ajB5MVa%wMJÌ?;q˂;8Eʥ7pv6%x$Wu+E5FXyRr|T`ܵLPXR#⿀z]鿞zgJ5iQPEFPdU/\ W EgSSF%S5\k%2eE]3`gKfQO%ʛIE ôfi3c'R*R#]"F7020 j\d-2Z~8ueN쫌~bv;P"Aw>mAޑp7sĝRq{X{q{KwWLt 9̈́s4\IYmS0T'/hlIXe1Xy&2VgD5JV.8XՆK;bf͊T|Οz +kX jsP89:Tц{;$eM;m'py􂼋FaTMV9VbGW1>D䐲#)pb9)]1֬pjpƧT渟 λݓλ5 1n/U,.;)DkNʖc!Ahqpж2)hTOCZ+q鎲$ʴ=E[7 mQvG@ #VeV,%-8+ƁQEkgY1k)45ubFI.l1l+ͦ)lQB&fKR!(8ɁG[DSF4}{6_4k N> fyģX$lu23+g7LMgޙx,Izv)(/YdyuTkmC⡋l::YIr͑)6|vGQ[qCG8/3Mb>:MGoJBLy"09Rv*zvik&Ͷ_\ݠqډKم7oP^]mRdMI%SO:3/erp@->ڇ=v.{4q#Dmθ0X"sA;kD __jv]d_/$"J#!OQ(BѣHA -$zd(||PîtH,bfFr5~涶'2e|#_E /p6ׁeU"ԡl6eN15j2+4, ATbmr#{#WH%hLR*8x'<ޜsLr 7/͍_g!/ĹTKcz'aQL|T9wd9[N{u:$]HH棌GeFp xs}tpEMK^ki߫OTm}_wV}񋖙iף_vvz[v|8yٍ(+G c2{$Y=W4%`SvA tj-TEN.6l.EJTIO!mA8R)nGwXY؊+|L'du}D.(J~3f{qU!vOӱw,pЦľI_ZűP}{ 3֡t[T T'Y % 2R9+Zh*`#L N5hf%HySv+QrzS袬73];6$dkȊ2+ףݎzHe8r;o䔒I"gut88ӖݣPq {%TJaf=02Bl ĺ:~ӛ;C?{ QҘ]{u3m|Nhs `%gu;6X``U<Z Y.",h4QPO&O gk0,58ge=TfTk:gPK5UUk ~ jǗ`\KBƣq4-k!Gkj~ RoŘw5ӂdߞi-T?5Օ5vwmSq=V)YQVAYe4³gGuӊ8ZzvQ%only^d7V1+~NNz'yPڥ vnSp6yq;sho` p{#eC3`" iu_YΦ&EB\G2uPuցyT7^]7;I p ןmL4ײƬi]9n@,bQv6i]=6 =[h:CV|%Ԡl}tis;%^? , `jkHZEei9 Ʋ&}z|c;:#ЩW#~d3k*`Lɩs6,j:.woe^~ӯ8>_XUT_wN~O݃#q2z'_w?w{GwNv{'{'<9۔ /Tݭhwp|%% φ :H6P TݛݟdlnMTo DQ99zSeCUz??qocw~*!KlN#l%&r=.8@Oć,.$De.,6яBFV/_VLxXmW6=`9J$R0+w;0~ ,`֊+cCjPV(+D-~ĭO_.+h?J@ Pф:1r4%8lBdIIH9٨|s{<hFGc v =hڰc޾r|a}er/@܍0bVV׀4~is3jЈN5zP/;'(U;+mg.&p/1ѬY9\CGD0V HlzOP, o{86cʱ:ud7p>;6jKrbh& p2 4͗d=mFN|#?$SFzAA>ms:I1PJΕFsW>=h.N6D4DP8M~,eOLc⿯4@PXA%hjJAGb5?^6єW~- I`X+}l8-/..g-6y77~H~|ýbmY˗֏׾Џ,yStGO[@v &dmCH8>jU]/-ZmY_pc:emtl(; e` zTMSQ '٨ pf8B]7XNIEd؉/u]~ij!1C Ő#؝v5 ɠAYiwk ߸]&Cx~ES`D`^{Mosjsr1 [ 0mޚہO>6^8e[C@=^Ɂ*XHu25Pm3"fBmUFtIYX/{k=Ƀ/t0@O'cDCO)!+i%z8bZFyAd2qzvsVvHNƓvM72/:3h\v]j4HNGbO&,-8~{X`Eqi'DռHڱ.ƕtIV+9Ho  @̯S. {ߵXEAq?#mJFaR.91b]61p?AhICQ<"{~} #dsނ>Z&DTÀ<0!ͱ~2&=oWcxku|Eؔ.<  r7DnQ`kbP7_AfhL [!o/Z]2%ewlG2DMNi6=#VCB, SIrUHk/UDz) FC FAv@?5y-iS(-p}ƟQ~j?;Ymߴ?|&dZGth'T2;gq'L)6'-?@OXJH;/WԞУŠJ`}k uF ϴR+۪ީN1_9}ZIH|3b|XRA˜-H1 imHΌSI2^q=ImXBo7JUal˷YC$&~h6GsUXmވ؈U ,馃'bce,9g`ؑf7ThX`8Fnb ȂG>jK!@BDKw2\!e۲(aѧ~1 \P}2;gD*:[4В`}uWPY(H43ج. IܢGUSAd躀ԾHW$H} "OB(V}n1՜TVO pZQIr]Qʸ(ڣC^:8߰$a_/7 0F ` MVBIiUr;r)glgXisT)Q(~a%gG2#rl]8DWf?hYxyAdĖ$e?䨣֪ϓH8hQk%#)Z I#j-rVj-yr{=. W{uH(t)@|w@U4gER7R7er bD|yOh05Bq/_m2ukp;;{o:vrgȝH#2nr:]TPjfJ}$i@0vX4Uk' ,Esqu-?2>goR.ԭ8mC :Wf-+@8&wq H0!}u`# <_9Q9]l2bjM%qQSǪzqV&H hBm[>?S!&'mF&i2T@ ib;)5J.,j4 ϫȦ;.r+ne%|hrb%q1ݱBfru1hђDt_pOR|He_ž?Zp grDJ~K%%|x!_g݋M#M"=v,)Kq;٢~DrE K#[%< 9$C"B*Xt/om!i{􁵆 #V_1% 7 тEGRF7X HF%8Hٓ"VLMBRe2WK TUIX;#=tro5y!xkP8P4%F ړ8~8L `N%2x8[5_&#&riGdu[8&78X7L;3`HB$#PUԠR* kdI%ک(X&!Q@cЫݙDDPovY *IsxjMS]ڭ$T1UaTЉ<{z`j4K<=!E XTKy!Z!Y9)NM j G:ŌB\]@)$9'iRA+@Nsv u\յ^珈JrJk@W5)Qx~{<OaT))+'|*\hCi^`g,TB|QĊ$* ӲG5ůٴF!Ȫ fogeSlu-#Iɦ2B=xlMS,MW4_ ]bi5`IU5u=Bˌj%C&tć_@M3cj5&1 5X %NS[uI 'o8@Ύj鱬w^` xM˱Rj6j(kglQKޭ7z#UËcKjn/O [g֧Vnp߭C:f48.5S= `O?7 ɦV8;b{ircrxg8u1mI`}5-/3 ? }H4~ҭ6M5_z{ۻ_v~$^񷭽{9SΪ}n憪nd'tVZ E.l$'Ђǟs1] @|Xo Ѓ|~G0>*A\PK8.s bk:_{(d^R}Ɵڍ"6}v~#Qo˿Og^|-Qmu~!>(7VhNԷ[0&ܰvtp~g7_}M7wщƚb?岚5g7jv+ yv_ֲ[j|^ i d@eydJd-n!3AYT{^&sӚ=|ڬQޑb~M?(-6rbWve  hFFNsiRmV"sgM3F(|{6"q]u2jC %yſT 5n:}§gb"&A!-2*hR*t++{wu;9O9ޤ l0#kxLq#bXz]M*q$u!;ULx*n'iB~ 3K2Ҕ8_ghXE 3wք I+ qG4Z§8I 1Q*jrV2G>,M<!ZoܥKX3kN U[|is5\wV]G3›k'#=PU@-EfFR>vwGߣM~~z<m7Y]#giE m kɹX?2H,ZuF 1>R?6g }ӖB1`{9i٨\+Mf ,n4W'al]zRxQSl:x8H}\ՠ*b6 JPXEb2|L]XoFŨXOFUgC),k%Wn%K$toxxOFk4Mͦ1*ïI68,CWWO^qS~XGy=ޕC鰉X/#.ߟٔK~g%9roWrꨝ5vh`uhklH5bԟ?{V5d<*[7;po*,ꍀߏK5|+ 1()S6I5L Y#>u2I4x*/a_wmC:nX :BNSb}bE^_i580S vn\L'vu-2>H:Šg7 %nİvpJDVZSx3fMuÄfJ܊!l¨UL-MJ[bLNN`Bs\U]-cn׸q+ؚ ^/Y J JW>mݪ6%:^r{uRS(py @aОJz_ /5MM` 6#PX;[qdv<4!ud\fVo!ӡݐ9#7pv PGJPE=D!RfWl*Q]* H-+D~FDBtmKL̩aŦTB4@5Rчe;,3Cg@Q8gfϴDZ"2si-A9 YijpZ?'Ba>'VC 9 ǬYԪ HC[]jn+ ݌] 9NձZ|/C,C+^Q/nva ]˵p:1[nk2-5k' ml_3{EAqK G=1  nKYkFJf:\VGe>bD1HKL=Pzx^_d2ܐsQRt*]2EWY:VYhXKk{~R]b9.~]btD\. ~]/,8 J451J;e|l=_Ilpg0WRU$c'.K_Q>w+LT#E@KwbjTV_ yM(8ƋdR ]r/|@L:jy92A65)CCԱn9hLmhčȤktd3D?=;0Z Hh,E}/i*s$!L]0*3н\>_?S??: S\ k K73IwXqnmU&Qzw[_0n_Ӎe5V2ʂۭãt]aV<[t͖7p(h8*NlIKߔ=q7Nw-既 *IPVꅚ X `̇В-|!ՔvbHVP1l3i*դʅog/Uѡ*ԛk -bT _*)0ӿB>8h'&-eeSx?ϻ#leVnC&[IaxtBOQΙPyDE`qՍ+x!޻Aݱ'ņmA+\z_plO}^*|Tv)yߚAȎTlai]xM E7ד_!}kkE5È\vdD`:S.pR.JcԇfbE͊NQ& *XIQMi3&V/J(t)Lb &Z֣`nEk֠bmI؈qZn1(Ɠxv3Ax,"ĝ-2&ɖ~޻@|x I9os`.E$SAC[kXU= t rfcJXdZ*_*b,\ ieVHǐ~5i-l''}IJg7' 6HW*ѐhAP$Y.f6$@>O&m} hdZ@ɏQ{?{DNv~g{spYR̘?\HRCPww иj !Z9Fl WcD`\[b,Ag?9uؿc&Hz:H&O{CK8CHUf3T X;W9؉K"+au넖$XUd!L0bDa1>G2TuF=Tp5Tz6&lU0Lh1 aA؍3`&1|ZTEB[Uh:F:j6OB}b'e]W`P6*U\WvClCЌ9}H1=4~WZyn]. χcCf^h?_lQĴ517DWw]Qn69t~5M.HzLBP'Y֜" +p#(7W fw[Bۤ[nag"NأP՛Wk [ _fߘs LgonVSkO [tt`sYetA+bg4+ۙm (Zǥb7xl~ieb>=hGy;:o1RW(i*[yg,w4?ÁusSi*B{5H$f LWց'#Jq[\V[zt7kq.Ses>G33 􌵨6UCe-zx.?J>Jt{4-9")M@6)`Zkʢfi))2ܞ 8rFK;igJaq6TXM\aʊC9 7SM UՆVuuU>Av{^pv̞ܩ0}`hB!#SUF5ic^2>tO(e.CЊMɒ`DFƏoe@̤AM}W -:6OJ#Fq^4cD Ս-?6N1٬ccx幩j2YA9ب0M}ɬD胓B+yQ ;O6Ǿ&}w묹 6>Ǡ [p IdžPˬx#ۡ5(>öv%gV~UVW*Q k&rY,#lբ[l[!pщD4ԭ$+?{) D*΢| z竰т1t_IG(%Q9u;ڙ,K [5{>*f],(|Nqq}^oOFF@ln/=e 6l\@H$BE6O2NJu> lS&|2f+6{?Qh0L$& eOݒ'pM-&BsG#Q扠Fi4<Qb2Fa*s|D)byi'lГ2=!YSCfw+iuA@"AI/΋}2i FQ~$^zKR'Tt3q smS tA7)8 tG4 7uN ,7ݘqSYu~DBxߍي1w k@T~ɳ0/0I% 'o&B9 #^uiWVsӪ^\|Y7 HߏWUUnKR]i(\;L1R E"pA$ifs6]kٚckBL&$ΊܼwpIZ}26]Q)+Ij,`P~O]( sS?{MNڜg"O=b+ΒkD 0f~Q=G*UV_?ݽʼKi Vk/.Fl¸0^`'c<3<7s d~R *4TU^5t&xZ<6kj$B$gS HAYX0a.ٝȉZŠ3(marҍ]' O[2BUC+8 Iʽ]51;Ø-sQkk&:< )a&eUy b4 Ӽ<ɆCywjr}2Di.#@r|"44C Z<Fͭ=Y^oءǣx< 5ºdISS;8jnW &H;Wh1uLK𯊲Sȇ6i$Ń_ 6aO\StE( IvU"2NiFeV}? "wvz`+32GtqPL }F8$4ޅaFN15Wz$war5qUݭ0[nY|Ry]!CPBh&Cf*#Z Q9z`U@ZPnlI9}F`2"7 ܾ RPy[vp,YpbĹ5aVhm(]yVho,y&w5Eu- f[reP-luCўjWR/TN9bhZQD->vڦEMj?eԣH< ^ԺQ>o7/96r^=kȪ殲|\cU2*JqUE%GS7 ^A3>v@tUZB;jħӋlT#$Tk^2Ƃ*t<@~c@505/G H² 4_O3ZftAr rD3d,=m]IKwr~b<-7?&,|M6u :8<؅(Zmn$ۻ/rGovvn}?mF6_&;[Gn=ίFwB#la6ˣ7>l:h$jйg2nã?Y1쇃ãݝ ޼U w߫;uGL8W):UV2I!<Ӑ3~mY5uH~g:CU*;]^u ܩų5 CLBZk{ݑD p*f4Ҭ03zupTIOP7߱3MMA@)dVP\ ZF[1ܽ=|6"&^ n :V R$LA> 3{[^ڔ_a&bSeO41.wu6\ngh-$=:W2غSl< #/_&vᜃKnH6˫jG\Utl𿨵˿ԅ0 ŒlDzouU71nZ,jd1ߒn2,G**{* Y#0vhTNRUe,! Qyl 0ce j~ KRD왩~_:ex2X-ɦ< dM8Eδɦ\},Z⸮b|Uh<${FK(s[x' eV(Ũ?Z(U:zn/s:y!vr&>!ҏP*jKkЫA z,oD4D86M#BB!Na4 4p W^vȡ׍޵RoGh;mX$4`/*O xc]HMsg?wBq+~*v&+Y$CI5ʎ:Ÿg2[JK{ i?T) Ɓ)Jεebu3=jad0d]aiыP# ŸÆ J|3i%G0UўG1M/AME^>-NO+ԥh;lX{ZDr z^"bZ#(9^aZHN;I}0 gHuGl yHU! Qjo¼C^eo/Zlj́j|VfsQՓP 'Ktp/U*%ԫ*)޴C\ -b YYϞDz;S ?#64wõv##6364?MhxjO5 pmJ=IO#ewu`zƢW4E&^-pzcTm耲D6\ @,몁@Pţq7'|;lJ@ײ4gf6ي *DClB,{5X9,*(?.S=Q]gJ&k >d,LF]w׊?[Ͳ2G xRuwKɀl)*Ba0zfwikDl'#4 pbvWti]^f`!/Q|= !+fFT`[ 붕O䮊}ʵ*7R~Ϙqv,W\>7 5r {5)ϥd9ʢi$C~6'7.RYYڳ -`-4k4W86)151uX`/4jiޯ%rq[nHv]8)u$$hLڧM66p,4 JRdNJ࣠M+ʰ>H@ɔ ?0 `DHToM{ p2ryx3kDwq@Pklɼay,/bjcRY {"%8/峙A"XX8NKYx K~ \&!_oɚƍ.jأ=" ٨~b|OS6|(3N+ϡgCR̼#Nm[2iwˈ%!*>b&jJjM?O]ts:섮-FZY*tR At˭(R 9l{7Ƴɻb6| ê 9BM_^rKNrlkyLʢQ8tXRSO6ˏoׂ,jY ytb<䃞+ 3-7OR*._ژlzc ;˴K+$'cD"j%VxVت?z.b&Wjh>uXţa ,~Җ ΃VsAˎ B0,K>Is:mtT,6.rFTMi+q[˹ w%(UE\ZZElRoiB"i˭%o]ؒ6JmhA=Q4#?5 mҸw2Ol6xz,Ӱ-9qFus^%= }R2ϢT#\S%qA.$zna _u˾o_rE%Uy0j$$Ľ{4Zx|(bWdOJ2L5n&tB T#&cA 3y>%P5p>RFF7 n Bj$F>JIT; ifȶŒa B̵1rJM*=?S y,Mgn4 G>ե]^<jˇםX! 7K1t""p O5`hXu z*~$ oZ eC:oK2v&a|sع97yrKO~(»<'I+1,4|\f,d ]21bVcux%%;s[0R}!8mɂskpZ8"IF=ƪ`o&wݑ2٭,6&tS̟N&iVȫ)hU{">mCAoJ- b0~fU9+'o?u[6Jvќ1u*촛[}oaRZ&uxYu̸7 *vX[)cdL\7]GC !{/CulUZ)7*Wf ,|4ПBU򗏇nDU~+/S+~=R=Y>Qk[ڒG~$W@I:5zf_ly|:uyV\ F B|2͡dmgd[ ؖ{n !dK!_yjzQbSķV}07`^/%_EZm12yU8:5A)zn3y/)ҧqgalsޜDAVn>ZZQ KC((54&]mA[jgnVsnLMz:12 IP*>En] ad\qo~{- Xl js>ڮ`.,9yOI`@a?z|8-$^: Zq,d|n`wn8n{p{L{Gl<_T?CGua𷃦J,ݿ໸`ΧPbY7}>b|*6+q)DJJ԰$!`_Eg̘)-RyӰh',|4Ǭ4EMd i(Jdl!z`?a'TEzkKp}~\d] oNKaqmLvHk3w^!/杌O.# |F5/OE4 I 8: NT#Lm8q=尷iwX,5DŹGN}RFڴDi~E v{r!-`L >dS QVtdi)uȏDeNz69y=%C;W8@@#Hh pUp\`j2S,,uɾ(S$&"mOb:,󩈱zd6]x\{Rz0!P)Yy ֶ@u俛(|"W*fnQ+c`['QĪ0/{D527YDܘ 5!b:-'sZqݜ, N RO?\W8+"f4~*)B+MAvVs 5PcWݗ=#||VJC['LpPTH9#ej3n0 < 1Ӑ=> AmKw[鸖~նr;#ӕb듛}⳩.]_6F&za?te;R yY$vb?0߂pcI_)h.[%[çEmډ1]ٺC_ST4w0g@DJ"QB(q-wR_GFXw3XMxBBf}.b5/FG͌%K)餦f!i{n'9Xm=qǘ@&*bRY6b @FOb!{[1ڼ*2Et9*DtZL RGZ;ݛ4X*w( 4wL}.7w0!p%kr@ffb0\>_NߖfE-8Y[`hdC>^ϗ`%P"R$7ПaK 9%PM hxh$!O+A.ơ@P{P 'ϙ<2w.uMKI(=##1$)aAW2^Y5$ \U> Ob ΣQGs^idwT9LZ={2ZV{=Z`^ e< 6HX ÿ#HEYXIZT#U4HJ@.6QyHV"9z3YYh߀d ;&,.>2h3`P -59f5h]{$x>9oSsʣr P2$2y ! a`^Dӆ^5>D;g2NdH-~uz="ʶ&;P>[iaMpw`9VN3˚82 o,oHcn 9VfE).BB(b(*JJ[&v"X@z9$S>njU6؆DU'v ' *R o.@pA ,vЕTpc\A}[qj/LmJf[9 צFQ~T/=%GW:۱|@ 1p0b԰y9Wxz;D?E=̔g)~73}]>€ !x'c{7C acЅJkXP} SS@IbNo'>ˬCNgM35MM墒-mѐѢ:V6#\dF3ÛPF(9K%#i-9KWoZT$_6 ֧Cȉ}޾Z* aZIIi#I>ƓYO0yq=o/C4N9[77)9_(KEװo .C&FW;}gX_RIM|/b_1*&}ΧcI8UvaT̬ftwۿ( U˄YޘLǟ @5/QC[@379,1Sheh* KT Uc 6AsJ$!) +ҥH?JѸ8/#vv+NM4'&LȔV;wdI]2!"/7xwIIdd~|VS<6tX5uj[}Fl:;߯l 7:woXE*ÃnWe.ٴ)'-oa@ H֑j|}nC*i_&Iiӷl:+R0G3ch ğږ(lf 5%t)f#M$ ҍaّo!Qix}ǯY4k\)mR't+`'< %7J n"F_)Z*'ٺyB'E;,}ʴї՗hp?~dsh@s3qW[Ȥ.-; hz$;_ d=,æ,跨C '㲀׺@M2MlQ]KZ@´-G7] ":` - W2LSIx}B٢܅bvd {pL bJOQղU-1OsMj^U+b^φ't bLe /0#.ap=*Xi14tAFS[P70_FJr"=ܓ 6G2hiͷR ( (уiĩ)t~uV86vʆjlB9z@ǠS0l#NUU*DnE+[ Q4ݚIZX[8zs| tf|rl);pd g:kbZMM*Ғ^`o ykS>ZISK4%<*!:$FF둬@s[|M=>ćpM>YL,nwp۽M[\h|A`:P5g>] 8FֿE냚>d`Ǧ)> LR(Dg][VԵ59ٓjN1U/#̼-Qofdhr d3z'-WXUӅ((d6Z1S^9GyuE$ϏW}}$ ϩbENhGU|,*:mTWP&K_.Ej-KlP+&|-;3uoT bW?"l͢z> "w ,mymwnR^휃nMykOF:9a`:O 1O49^r!|%Jozǥ߰j4gc)NqLW9{F 6%pov{ ZXCyէԿVAL6LgmkF|B]gq70n@X)DVlUQp2֚m"6d> s?2b<{&GtS(J 9x9zFS-?ob(dx4s\ExOѧlj9uJ0B#(Ryb ]CIFxa *FB+d)F&e9E uR|_CTa_-.ro 2G |,||YnZu@.n*'^,New'm8rd#g\jD2:tkhBl'5v'7GRuvbSj$U˗=Y6_#?0&ُ#lH23xղ fs&gYꮮ -ˈ$_$4ް6;;ݶkcow݃_>mnxjzb+64BW-E@61gqHc3;׶>vǕa,0Nu;Dp%LK !YBemLS뾌 Mr*$`[e987;L#!|AUsؗ1Zn#We 2X`Լ%jdv K=[lY#a6XDup)]>u+1Z8yL!/͡UQ)5 0=rx'g2_[P}%v޲I爇, p;f4STQRXf(Or42)qki\b2 v:r^C6i[Bv9z:(S^7!shD٭V-Xe4@e7+r^]DdPA<ʊ@9uhqg G'syb:xs΁Y_%2`SOE#j~\S67myw-c;8^ZfL2Kj賎bQZV]ذ OM'|co^noTujc0u6.*A2dE7Yysʬ٥%E0ֶYēyײtg:h _kZř6*YM G-M5ąd ^js0_Ɯj|LƉIn`e9ݟh)ޠl˫V]!4zSs:sjV ϯcH ޙC&H3 A~QwX Zy/Pqd{\V[kx1ˁ fWZtl)(%tUHNGM"cpn'_ʼnT`KQbҹ;L&Tji5{6F5̣DsǜGƸDaz-Ħܔns `upȣ$G͒cd-} 6>r 2YqF2}-C2ViN֨yPB0zN`u =:=:ޛ#OY$zfH6_>" $Ҁ9J)GvLyk(D~lj6mƱa[ T5E%0tZI7}6[ʾE`q]6FZ±7+haճkljl56)Ғ WUSjmC8`[qDݽÃj۝chwH(L=9D\Q;$ w>̙KsV͔ #q!s"k @qҽ=Ɩ̈́'d\u( \YorDM069U}eU ~qj,LQ Fb^`a,%eF>x8ѢJ(Iv|d}SkY<nw+YlYFRr01J/"e5f e@*g& (.4+I Py̦9fS dQX %3okipߗs+v/9io]|Sa "lζJ,[h.- ]YLn *TU |H:;0R@͠TISg6`.M]z` .~_'ˊ<SzM? yw'rPm_+~ O&nݬO$,2m#Sӝ>EZz/jk.@h*LTu,0KƄ7w&aNs邡 ` gᐟ~=.7qWc{Q7_?w7{qinĶ"7`~sC|a×y%؋ˊ`fI`jZc[$;7Xӊhe†&089g]+\sQ6zw棔uXRjdeʳJSmZXLٷS>t\wYPglF/R MC%{R, |E6o"LjƔ@O{㥉yUhכΊw3Q?~)řeŬ6 TDVdVD GJe!S ѝ jq*Q@(+ g@AW݋DUTY3wVG-a7Wp}dr#G7 ޽|h=%Xʟ`rI~U6nM-8M౞[ga}bAU3JLw"wX#7JQks`O\Ӯuz觯_-3y[E _[~i5GWv6wtE~G;_v? >伒|*/mm0@[w7$ >D5 =JwObE8p!j~~{uӻ"%47M90柷ǿ}T0[2VXFE|ۮ&/%..WAv}Z#9=uweUIE䁪`ǍVmsK_@Aک9UW̵V0gг&\X/"`'no|>Zi`pioKaϬi>8Ut%q><:l%Ҫ SWp|'b~%]y=bqSY;QE끅QA)T_Nǐ K\2ŕ d`i-*95LY4qCQ@ z`g`C^Vavht.EeJ'>G(6t /yHM9sG(?Eᷞـp;d,0\2S"n >ϨU7,,Ӱ/<#6M[U`Q fK#\wg,G.>"x\Ox,,M $7owe+(8 *`22jR~F"|(mwبEea (;J;$dXLyџ8Th{t8'Ūȯ0f A=K)T*V,dLf'"t4h!)+HCƁE9 $S3H'h'<ڨS -Gp)CʤJP|e cq]A8b3TM*_6ow*v=R۬#xX~1#j-uۮVTc9Ɂ|3]-W1=^绊RYk~hN]WlKNHiVK0UEɮa?:7v J4>za8H4VQ_|Yh ZUv1&p:xӠ<.h}O4uEsJ13vq!r<ū{qVJM6xVr bfVRRg26m1>Ö|,}qNV-Wzv}:̉aV<^3zqr//Ttl~tˠ#MaEcyRbnI NkN}d]kw'zҽh1LݫqpSE`j. ׃~ӛMד-v6KBڀ5=cO-Zɛ"{v)cup4A;^( /tX i>=j*.o](, KEb52JE4 ,k$T_`YDg?|ȿ QLn%&߼EFcٜb,=_,fe8/x-k>D,+T^kպ߻dĬYLvE\W9yßzQ.9 $"ʺ'5PT|ZPchuJ}ӊ^~iK5IlH>B7&i1@<,eksYwųF,îӲhf"" }b>$1E)2>Jg/6 }Ӝ\Ee)q, dIϖ'MDo_PK[[KDZ]LBc$#`Aʣ]؁gH0՗\~GԚ1=7XE~񙦏8>y͋0r؟Ymd:i E9]ϭώo)נ>?{, &ílRǻXm# `ukb*޿zLQRZPZlAiߺWqhh={d`=VWs\0MSєbQj:T!2h'f5S)~ f|~~uEq.9 hzC(fvM 35]X$l@bOfYg}>4'bDe Ԉ[e[\]gQD%3y-›[k~de早EvA:.db6b˔tN6Wq^x;(:(U/GO5&[Ǻbx}$۳𗺐+uC.r*hshAcs"q$Gao2IYh]6h:%W[6!Kr"{LK3]~5~D/2~QΓS xd.|2KTɄ^9Sl Iɩl(g#_Vy:XnZ9qߺд/pgM.F)wnjV17ERFW u trU7wH=df`PY= (;evJ4 n5+u}]M;8<|<:y.Jʳ8B6YK2:f1b["cOё|=sZ,( Z07@O`b|AݩC=B o?beu7w$عO<ga\".JX~#Hwjhv ctl_8zu] SqXe1@3w.2<727 $qD-Uhct:>8@_8F/:ʇ}" R?loy3-9~:SOu Z'|r|p#uzvĠ*Uz>6 ,2Xƭ~D+91rDEn7OC˧23|}0A{гB%<ݑI0x]SV< d6+`dLBgYvnORBpmn,m2֩}AiP;ҏ#}|^F2ĥ(yJ_\We_6r>>+&Xˌni]u6P~ꪒAq%* [GXY{`*`+ `Exa[VV(gn}hjp^Xv%EzF!.c0OL=&Wi cd9lI0֬l=lr!x%S['*^+H9VPb:j&Whe xeCC-*)|jZTeԧq#JWhUS;vͯHOy@ %yarShq9P/% +ՉTƘ޹1sA>uua=W3CĽ~bR/w?aGJO}k4tGE$s+η;G6fQ`]OG{A;;[ǘF ˢλ++,'W4Gy:Ɇx~z%pranph{vjstHMNiscopkS8moz6{~0[ά7p_8aa]6?x1|h 83Z8q<AqImxk{;tҘr!&4r:z3rNG'GcΤ@wfᮩ f 3aq%sŪk}:n/f, *Z }Opܟ_}pAp1ٯ)6gRpP0a<`Ra& ZNڂ9bs;;ē:lI 4}(iϞ2MDp5s?tk10Y̦u[R{q&hr]x|nb;$]smi 5ǨP2SPasլ'>g羂"x55[iq@^D87{ZwK !=ĺ1B*bMԷBe%Ƒ3*"+M1F%7g6e'*ݹۖe=1Xy&q+J&YcblLXxt-|c=("&QRcX:5Σy$y4sGl5F" #;Fs _b= S̟vݦp1ƪ8Q?"ViƓcJvZ6 e$iOD,V)$l(+N(sVW`%7ED-Yo{}۳|MEx _ťÛ(dՈq s=uGWFyoL@ ɄwEӉ4hi|LN_{b_/CGDhr! %Ɨt[Mv노!S7j5䣠N}.{sG÷o*|(mɔwW^V7}QDj5'ˎ"ɒ o{=35@ 1I.r~f3fE^govb;0-::%Ŗ,IAdI7$aߊJjp~$޶rاvmr4BSc UmR% LU5ȡPY@ܷ *6\Rd**" ?;<_C>pXNL|+@hsV.w(Qw0ux*keLiLAwk}n`w fMXj7tF9IT9U"I9+X̬we6<^挦b)ݣ1~]gz4]W)Z"t-^l*2 vNUMn2Ma"aʅg# TXh_7vO/tM&}bTVMj0νES_*¶8͘cGt cPqSaW9Fy#\ ΄L``RY8Q71ۅGp3ȸ3xjQ5cPԢm*t'F+Kَgu9Vƅ'AQ3͇A:mO-#'܏ n^ۡT,(ebPG{7ЃbF {P4ZW؎CQq\hűAKyP:Fb"WAuiˑ 5'@VE[$y5\՛ـ.ٜSh$2e TV㛲Vi@7k۾Pex ]#si+#m}5sQh+PhNjTkֶT;-=<@s1ʦ BDrwj1"ҹD2< c|g;vVgKc^9E>ڨt1KO`F)m$l]  R4H8Ul`O-5*8cZ]+nC8 +?M'ill>W{vMr\d_|6P3QO".FE"9 X EӺBDLhZh'/̕ntάmB.Tk^b M8VI KWZ!*]aѐܛjUhB;Y j {Y{W4Pv.{N8cqaDOcOs&Ҋ$즘sd ޿#9>&LeQUH dfiN7O ߯=z|BVzF&1y|%rGVr?:t=iX-o`ʕ1ClKEy4k|GHU9mD-$'b3GAJ^eg,Ǐ76b$'҅&Z $PWVr;o<E9zSR~:$(?c,y^7VvynzY@ܟ-<a 9ӑ1P#C4L҅~lKdFqsQ GqsuĠ.|*'gʼn@q< eG>7{X?07@tsP 14Gsyv$ eqz, A[e^Z ްH~c5:Is -zbȟMiq<.yϷmYG(.O2Cv+}B+|)Ӻ>#H'69 Ge3'9]l(դUq8DH rUO p%Q&@d2ҳh\N EE)ݪ.EYi{[ǘ S֧|^P فc п$Sڼ6i;u CVP2bэ94;㏓:y2zUg7MӇRf[Z,L3]]ЕE%?̤(,s)Xjf A-N"Fzrgu3z-<C7yMr.9ίʰk "{r4Q2B@ǻP;גMnK/x`xh&d6*Y,R{td[-;a-a>%][_M^X&Y5aj v{?mvwvnvvv j!AڇZܩ![S*^O|CrHl4eO76;G͍oD70.݊?<ljע꧃}hnq`a^U7;1}?a4^ܘ%Zϓ9 iV/1p dW+랕rNr#tGV@8aDɾ'@&c%0<\]frMϸg \3A(Pp0>>H_ [u%,e:;0nW|SJF9^&cv4};%c6)Am;1+717{q[k{sLD.皭%uM X1;uf`^c`e8JdFserQ4Y?0.)۞ַ_խGv:~n*1 ??c؇ݘ{V/SG=PA暀b@?H,ox>ίʉ(:LN$*Th.hp=m\]KKc`JK a2,.LDY >QFO]fxg#$W_J}Xq28<}JXMvJ #v2n-ㅋ /09Ū3T`|]eI4^Uzk*Q[xj3n6>n5{Є :͌P[2VInl\;vE~Iį[झ[TnGM%`(ˢ?:d6uA)3U Y$ >Xu^`P3cZlz=MƷˁ<0f8|(zZ82Tcw >tdrIҜjCwL J"wNZs =:Ge? Ç?~ZqO\x\,.KQ11zU/n<:KbZf9R/s_6q"Jׇ R'S LC%S-1(B&yE*eYG-eLbw'vgl[pIZL'2d&7gre ϝ@q/K0o=b@W7z6+bEpXnDt 314|ahh՚v`v s8:\; X;NN}H*\ikꢺo j" z+wsTƧ݈qwbݮeH3q8: *UF/k%ќxtR5җ>gꖂƖ*37em IzJ hx&]HZ\n2;,:ASɨ?ʹx8U|VUכstʒ&Delՠ G^ّ),&Ys]L[k*u-xb̠^tYHMa kE)6Hyc6auayL>|(on}z =1kEuDT t>.׻>WaQ]5X B;/:[kOThv4"=[I'}p/=qD) e\"dʻ&xz[ChN< xOVPe #ݵֲ3uJڲJXF0Tvh%nvKWUJAQl|*8qzيgەUTf t5\jBO#iY:HEH|Jyf&g6UW|$2GW7-BEXzZLGiq]Exl6#<91CKc<\&!\ipaεl 3 v:X)FYne:|QDznUIBUJ?KY0Q<Τ;j~NUVCy=d0Ҍ(mO7o{=ĩѹ|ҫ,\#oAJ8c*[O JE.<~wn۔X%ܗ<+QmMv3  3=RŹ>R[g2UNKSpL[jNEfJ|g;!&\s_lMѩ.aE)x.M:6<b@ۧ)|ܠx>ȋ.tM;bMNA&|4*]2PKT4g3ZgVri~]p3Y:fK1f2[]ͼϚTO>v5# ;V X."Ey}@dnz(jX20%t1!S?ӳp8wK!B<cOVČ+gJNbRFjU⥓ˁW%,fl~: Z{ۃc-@_m_tLQ:[F/}?bYaD~Uϩ^}笋ۃ^nWUr~;a{GOSk3uUUiRўOti^e%F^Чmiz]+PYu6JőDّFѡ">|2)ݺģ+ TBUnXSp- q f0a]vxk5.@SS5/#Q_MӚY).4JjA´VT:%20ݞkFE Ws"p%6OK놘U$ʮ9ʮ=, ٣xVޓ7; =x'Z0eHd> :Fh0ū2LJ/e2?H1Q18y8oG5w(H+ٟ[c-c8/Lx8ʨ|"quO5Quπ%dMM|SPKYC9`hT462NJBzS -iXۤq3/`'[&=藗;qWqn]Xۛ)G>q?-st c]<ҳu02W0ZU .zVZep'4ȅ@ 0W F :٘K0lbJF/_U"Nppi$x'rI~嗤(D[FZ^ItP$Ic UflӐi&#›HgSWq 5 kEhwb%;RK~F>*-w*nhG^3牦< .k8\%͆v<75gaJӡ9>:4:y.n[?Iu2f%> 4,K4Ga6yY݌n:SW[,#-U5>|%3PMҼΒ K|Pێ pQez*Dig8'y^ GHgyR_K6j*G+0x<%{k=d#|Eצ\@m(VQ{iIWXO{ %!V ؛p@P!c!0yށP(h:`BCr!v]F,WHZ7Q^D f?Z\;KSIMa񮮾f u``iv q^H4,j.JhVhT_Xp̛!;I\Yu :CHҸCJ`r LAF ȗF"ZG(  |r޵EJ̧:JnÀh;W_Od^YEd`KSȁ9C3:T}C8Zw:/& X'ZTog:b>QK^@ tk z8TTm;ri+8p`* ҴPUۍi2JƲ7:u&]Ĩ10NmL\籄A}jՔwaT S QQzgHQw"(扁`21JXI6SX e~-9]JouFfTdL 6yr'Fr nCQu\!qi9w$rL~`G !fÈ ^ H(+[QXQ) + J#̷Ktm4| mx$s-fy?( O.)-t`Z؜LQ#YCUX\g&ћ# MJ 0*OlRD(Td-@!h#]W=m$}KFQ^rUX{fʭ1tc+"Pk?C?ͫ eU)M)6kXhqVJe:̜w G=}柆'(J1'o\l6N'EeIq)jUY eN9jMGA81 ?Z꽝)˸Ȣ À(=uY\wzk7qAtQkto 9:~SXRGz׎9wGSm-DWp25fAgnoNZvQg(բ&]y=ċz5ʫQt*&K5N[c () 1.;HX8\a1$VRYacgsmA(<= dj }~uq<Ԓ-^r^u}&iЏN :w܇ݸNHT3bvzеWEďƈIǃb`3%X*UlT:\_j\|i0c;Lֺ#\H,|]<k&x(^wkh%- ՜Ӏ&lo1xX èăW11?P6SCc;>Œ1`0)+5`t*o(o]Q^P5厪6gd<=  `js2F*fT>r҉c\}w p'4q-UkgkW{< Ÿ(x"H^Ax_dB/O ר 7aP^\|yriK7U>'>ΰV"_ m]O/ <?NYb\$aywzA5=ޫ_֭0l$BjP%Re% ?NSU+VW u]S B{(C !ڊ^ab|g.-5+CD_ \}^AsE_t3}cK 4:>RkTZ Y'LK6-PA,H 6Uh :$U,CqEF#bMLFhl!tauCs^m@? ?2~1!b )H#R!DF)@Dk"W'[B% V ^]ORЭC(,"UZ@E_1@xq0տCV?ngV)}1PQg_J/ɐlD,`3A`2&SB]lV4CNFG ~XD0qTO$xLdBJ)X f _5tW@I`/m 茭pm6}* <ߑ0?ke#sG2TNʹ*RD꺰DG@r0ᒼ9s\E>k5+uc"a7C`eǕ单 qaQ#G_k(z]_w~7-6a  ?[/t`]̓@kU.qIKWpКzi`;UY? W,؞Ƚj)84 .cHƞͰ`0Qua>AD0DE/.zAkW/@ `9y=K}Ҁao$ușR$tֲ%2`;낒)̂JbFYnek܋XXZ% œI +`E6\bRluoR/s$3+Xk> ;.9_Ǫ_wh`Mw7!_b0N|M@TRzr:j H>zEExħ!T'L5<m? bQ.\K{)F('~GC[yoK5TQ25?*q0HЉa u7~D FA e׵Hdދz'h? {T'd ,LVeo4'b\VRz#Ln5zZ^ɓ`c~`ҏQYFKS&LM'?5y`Б@ߕ>(uؗԳLCA'BЋѫaNdJ2'S3)>ޔ l*86Z`.|I*c$=~H6s*C׉un򁭗F+6 H>}*&[=T# uTgk-REiq$4uEJˠ߿[(0}ʒ.&$GH=Y}h&%&'?ך䶫/kN7*W,WGLp-#9?3e:n> 47_!581jIըgB" 5;+nVme(Lz{*g>F P|4Ѓt!ͅu\:6 Cu*K3{t:op/l+h͚j[̀N|3o0ba\_`zjuy^|yHw_v^-ǞŚ|2ҭwoߴ;wY~y /j󫗯Tk{(ӁoWW_B)&V0?vW`X^ObhDڟP? s5@ͻ__ZO0VVV޶޾{~V;T޽~N__K+*.' Ջ~~$H+uJ`aԒ5zO؃VR/Nuk^9G31G/sFob{A}{8DmW}v`N}}T ( 'a-^ŮP 9v)OxV:rz.8`B 0:{*Bgx V2?m]g 3|NH'Qu. bfO8 ygNu.  vv 8ۖعfp?+=-]?(&G 퇴5aAz˘,Z=hbQ'p,@<"TC`qaC!~PG,!p$pg5U'"ʢ B$+_zwmed$$y[,_LB A[Wh030HDL׳ WL\Z-+eN٬ )mJK[R#qK [@]p ]WGݩ0n LX08sC)sfEoqyxZvػ2[8q%/p0Sa=;`&Єr>Y&`\G)!sp]8MCaWDS|Z~?FmK~x2>UV}F`R,E|]pcU 645&KK1 /!4Dt$وZ IđM-\1΋, ǐٗ:# 7 Q9[1iQ Wј-.ۅn 2EV_|EL?0_`% 46H sm R ?VzC8S+ ?=/Y 3HM|С<Ӷ '}sO|eBkHEvk)sBXqP,h& x4qzCB{ n&+tZ:mr߁'[[wpd%у^cX}(We:dĬQ$z]xd[T $4(>)kh0@H=o\tuh_4Rϣq@` G7ZG!C:BC:P~M-,B#?|taN^_9S;/5 EǕ=TM.ƥy~=m).Rʃ,͸&8ώ u 1&EPYX~-v/=3HS+bC@m\[7W>h{^ϱf5'r"؇/{<> VAp~4Yz4"=@ocy$m ^(ς[6ΫޫqY\ xiYIց4 ;0fp(l@X|̢5Kho?h7FLMk(s #8LaI~}X\ W:nϏ/ςp_C(.Ӛi-e&bPd\_Amv߸66Oki٩eB$E]w2\7tS:~h˦ؖfU7A]UJ^r3s3&]";;i} PB%Q9ޅ_쾣yi-o?v_a,A7 U8jr>L +L3Б).y$0_'zu^AS#C%^'95aŤBX ?0-t)`Fm SD>,l;:;w @c6BW& aakHQ}HS =Q3FkL@wМ拊k`w Hn,/Bx ,o}(WC'>wBwmbFIx/eYMSH&O>%O[[ev+O+-i-ZTFoWGm󰉿~5 `dͻuxKݵyyE.try_Knӧ[yZڟORvKyqڛR'cD_i-tPٞXo= aYAI@߽QU'Y6DRWyX%GQTqF'o즰4T?}dEv9ŸQBHGD$2w pI5r*@ ES߿cv.YZ[a~%»NuS?,?\C:y$F8x:/n`/'b]QHgl'#=D'XNǷi"YZe! 0][܇` \YmÕWO3#еo{*a.eFh^x~.-q/y0Y6˲\.>^Ne]鎷G}{~qٻ2J*8CN:]-'B5ԣ TmϟEG  3FI6OD8_V]ſwwDmb% i~, Iu`X}~MtiK9gР-mTLӳeZ +W2Fz菆4GCo~]ᯢy~⯨yK4Rx =6 oP\jy-2 iX_r،a}- n] Z@;j [ m]Z}.==OUc6BИmQMz:T'lkh4ٸ& .JUZ"%b\~ vh}A;=u`)ectf}R3 *u;S(i|M q-JS^!H1=\B\NS3ROB]jlm"ͷ!wcסmԴZVKRZXNϓgW쟴Cq=JH4ncʞӦAhTVpGGFp_.oG+JhW?1 6޻bJӜjw@+k=OкQ[2DGݨӹJ3kb2$:1i+HW48 .׵Ž ,m@#F.iBko7ľLԚ.oY3Fم}Tva1[74/$j]S|jfWm5f%Qj`BX#{m_3.\k#U'CNum!'uQ_ٛr\HCGҚurk]MƕZ}֔jMb K{MhDiP ` ؁T,eŬ,\yt @r}h۩5swg߸/!͌b}l4TX^ЯtiU"ȪhUE^RPCN56h,W:}!`Q4VAI8t/pѪ8.7r *,LE]C6s3fDHh`Q]3.6<2UMY o>w ͵{>O D@[ByI'_S?ۯ -drf/JN_lИlb^]F\V[C09r.$5uytdVRSf Io%N k _Y֯u*oZnhst +2j r7, wv9P10_ ʚO"qX/4C۫{v p@H{S(jZl7m@2!xr{~u&`\D*xy^jne&֦-x|Ú ,}kzTNmW@/z{j >Cly;Wؘbm1^ \f{w)dFwzwT;YTB1ӭn8CkW3noU45+)fWLwխZ6=x,^ o lӁaᄅDg{x;i[X௔}[4K{+"^:a;j썖Os- Թ4GK+qq++ O7ei,n6b$lmFm8tw^ѓi?8"qSq!|Y1"6ȹ{MNȹ"DN: kq_0m;ID%{Au Mz9yF?<syi:\q h?k$9{"%Fܡ+zzfӰ_wXJ'sB3u'g8٘ o!8@ԧj7G?P;\`ߔ8^ O;xJHtLqBD#o.-U=IԽaA݆GsDVJwx)ӁCk`أ-ɆsX?P f)o񢈚6!Tv_oןuR+|Uuobe4ǷqR{ugڃ3EBf.83VHATErξR"u D*.ԁC'2w5Tp5}]*7}XtϦH3Zr]^+:얇PO_UI2SJ*S݅J_T 6 5>SFZ>%0RS0Ö9/3QFg'D>~8' nCrv`ҧƜ^<:ŏRE6WB&#![?P\.i=^\ 1(7ќݰRMdU=HDH8qOg9s50W p_]= CQB@Jjhn_? B޵w,m;ʙ#XXL%[K]jl7?_9AzKWTPkSec9B}C#z&no€5;ij$z4SO=sJXTt(tÎsYzeK~mD'\H _ڡjUhݥ&%,e'Nc q#媔J-s}X$ x&&.݆IZz6 YD̽DqFwvlЩ 23 +7U!TOF s_B NN+fu%jE+ANCӾT;o3߶Qc;[ m=0 v\U2{*TW?h uܩh(J;&]IV!I+ipDekHpQb늞ۿ4 b>8i8Ck&`ٷMo|D@3 w[ ,{Wj%dn4GYW>}廈}3c]DGhM㑗-;[_-dTtAt5ć4PR>׾.{Kd[r#Q jJ&;ٍ ;bQ$ ",iUw8"IUUHŊ+mqURFh+qRv[Ժ-+ZGG{9UwgrGKrLYf[Fuk(9$qXp[ٮ#܂7lV&6Vb*m{I,E?U(Yi rq˲ %K:~*1GEa:ƫyg}.WpQ^"QK|fco_xwjGTe9IrVu|o=ݿrw|nk3;>)wilΐWNcة L̶E6D}[A7|u"@YHh!DӀX63 I޸1{M Q`@Ca}-ȝT`7C XJOjZW5tLF½%,gD1ۗu j갠1U}/9O-7ĿZ偶ʓbE;Wt]_+U,v-囤%k+m2ƨ~iQos\3K)ad):8OtBifPzkQυ,-D5#ZNZW+uE4_~z2p y %wS?V4BC`[WӐfH]?ww|sETwj?YE'1˘:cSskW\Y= aSh iFZև:!GDmd45 %H`\f Bg+w!J N\ 5@lga[3q*\f*G*Xj;!n M^CzrİOؾO'RFXK7儾ӵv\ +:<1j!+NY?z~]6wKt= !-繪 ?j& ;@.o:#q@`8n ~G:KvF5_0BESB<^*[q}OMW,20+PuMz?Ou'q^^VT)L dӗ^ ~nDۥ'_h\bi7uvfZa! Ф2=-AsXl:)&^nѕ2'$\8D=VȓzIv{LxXl ~tL$[&;} wOS6'Ij8AA71:ѡ)l'I+@Od-m)e`˚2m'D]~;쬈I'm0l[C"\N\XT7 oHaz<$"xHJ )kr;?iLT1j9,)gq;IB%x MۈI8Ν|2)VgӁbgX6uFǗj:x5Zu\0Rh1 DWf񊾯SS42rq5Z렌My KIĴw{?U iG+%R+8T:х {Gum̎ .+ͺi'TjhIMU)ʢuAa mb䗺yo't Ɖ9{F7M;nqbsW|VrA/ʤ%UD) <N;9[+5lDREJhCHoq5qƹjA5L4UoaNe_[} F=sox܊Y,JK{aZ Bڮ_V-Ě躆 O_Gwxn%셶f'~4{yaV]tl6&*a2{MwAm2v;"a/'B"лĽ΃4.vTCJ܀Ƹԏo!8 =8E쀤+t2t+T6‰7Zv#( m0؃^h ӹȹͽ7s;6 WVgd^nEn8+OĹT}a{;܆!B3ŔVFPU:-X(s_0XȒq{&+Gqe\NVxRN(AUqߪx,n¦UjK"@ >ؘN}PXC[;w Wp= F:0+5 q̼5вN~} i G8%ʎز&)DxS~ $D&u%OW׋d pmG3RX! g"piYmk,fBP#+D!!h ~.k~'5;s{g1+OskI !Wژ^$ ^dJTeXO4| HҔyrf,_i}F|45ժIPI=WAe"=&ˮ7zCKӍ'CK7"ɂpZ5KQݛ_KR&bGDh1JOH.97Ӧzb j-}ʴ6 Ln{Fsb-keBQsŪ-+Qhl1߰?\Ҙ*EYIdԷ o(gXmlhjhF;AHwٱI&GCy5R.r:FdT-zdw %=0lu߁&VIhtIxF)DlAf$<\?%"+8x1|\~lA=QN›o Y},,zSXԕ`X } tįЕE%1Ʋ=,W0Xւ}e351koȍٻV蓛U{݈VkuDtPj T _"DA0%Q9KR.H7=8#.#C8Q/+R~ 0+$P7 U/-JZ ګA}+ -8"/7qAO.*<@!09to6)$V>8VyV.S*1U+EPiMNw^MgtVÊ$X{cr+Vj蔛+V(| +O7)bJY׽5 杀 Y}#mW_' 6_Z^wk&ĉIw-J.;,S'PȒzo/,dɥs)\:$uCs!DW K\LeyIY R'5m*FK-`S#ob AqCj\u@4Ъu݉iiw5/!2jb˰m۴)l~*ZDg-5n5g.}jΈ0t4JF ȾP遐ߍ;0D'(mEE G77Eg7%gzJ3z^nOz+z~Uw徻86P3}ҬX@`dݷ⃌NS\#D$2&Ru:vqi/ D$tx=p1-A=A4LB0;@!s?R%=IҟmAǓ/Ҙ$r\]*&8C qڝwg`Nϴ*T."˱nxv{;`W%owS6X8g7;:szW,g~wwWXv%]Bv=Me'!R3'AK.JyhG/dZ5ڢҡZe1 UyVgnߗe}Y]2kZr1]S;QNs 4 AM01D'UG @ #aϥw&D7ה'?XRqޡί~qEcа1f,ьi`Fkb50g ᴌi{Q꼚4JEO;g4<LX?/OSK@ߏ#LPg|BLEDnF[#M.o58d_fЁs1,32c9.!ًs3eI ( L;Ⱥ ^仯[e]eBna& 5 i55UMO[w\to>/#0#3Q<"rs`p/ zMCw{ǍyVk*u\~p97ݏ,m}x"gtC*i/~eZ\S(2Zޙ:K\aLy'knݨiJk΢<ƄW!+Ռ#bib >;ҫE4=̰!0Bi" wʰ-Uqjaa%\?ZKw &(D)vpǡ׾]Ş00m-!5MVYr_nSB'Q?O!Gl0f18,ҝx&ƆZIrLNheX ĹW^'N'ǴReIi%^i<5d5=UQR$UD7f/cѐq f"6W3+T(֓Q~'Ӛ[ERLdk`2pj(g>t"cЩ|ru'8Vlvf:Ca^ɬB 5mr) ݪ*b4Y?EoTNɡ~pZ `twRa jmڃ>ST7B(~vgCHioi,z)6A!r"b6eCCH4_v(fUIen6OçZڱ ݅s:!"K!Ȣ?PWK C>UPJZ' t쒥3Ibn)I:_t 7#fǖLZD_O#d=@ L''tF=»t44-h@ ڝye6ҴaiH/idGB+tuvP: Σ]dh)2Lp*)j]pV'0ĥ*Ha=5T6Ǯ(pg"` I ƌ[`h΀"YKgRUo4Ќ#,j%}&FY1X1JpVp)qDm"s% ch= ER{}ZZqcw9 {SpJdr ,x. Ś"p>~nF΁BxTs-X͊1PmDfCEZt8(Bu*X*"\,ɔ| .#pIM cYǀ( &otsQ= OYOW_0:Va`@_#NGd;3H:5qYE D\G]dEy\֔5Tya! Rܠ2_Ã0ٺߣQۧ%$8IhUr!77*u.k\HM0u5=D~t߰7D 4U욏K5<+"!=33Vc-fp'|-ȌM7DqTUiǖ"{#Ktf;e"Acqx!ih=,_7wݍ͋w {KJB 7eѢ+o-@MTۉ_o~&^gkjW9U7O[Tf4y0e'_`wõrv,V6%nS Eq)vVZRr@8½#Z1  -RTmءZz vQ쯧 " f9䂄YQ"+De^*A2 B%7^ZAi"@]= ΀t)oVګy;MvV^f)8&ݧVRz(h5 DgYlLAvE=9 YgUX)'Rk,$JNG!' 1oT:*s^ߪi˰!jwu`-R2М|kD^SNC'ǡ+Vp &:ڎ}.Af OLͮOV>.e,#3YgaHUEI_Du!9F&ڼq?J(ie5bC`DB7GE>ֽVE ~M }WG-ao1UÒw}-FDzbWW;#=#(N^`9'׷!iTnL?%AϡOAeYAF@Ć{iCOݨXKX87hTHJd7vN**ס N'\t,xa&9*?0a`jx/([]8a,YKW`kt P 9~"m)Y`E T9mkQvc{HȿCW ?a3zf #7};Qe򩑴T1_gF=*lM0KJgNЋFbё2̞^5!I+*)Dڲz+: *׆G4hٍ=Lw!2y3AS6phن:8^xgnރbߴ=8^v1L)ʪ =ѝPAVxq6`z4yWJ sRy3LmI6H'ڧB,Ђs5cކUA 藡,xq BOXOAȞO!]/hWq̺n4\L>'ήVQa֋vtgE-YYk ,5eP@~n'&Ы IPɶSEP׃MӱjŘIN8yp,60 |̾ԩj U*WW2☤ym|>pǹe98[fW-'K/<f݊h x#v,B- .8ì.Қ4RjMTqzpu&L6dY%SFIA.''9e/NA K<\&GG(hy8ʁa) y5aJglwWv ~ /:;iw_ߓ/#ϊ] 0I}/E: `ȲLj)INRC@٧D\8YQaP|ϰ$ev}h*1_WWnRϩfwRWa:ĥ0"3ޤ#Zbf}B8t`VЩPt+Ϋ2+ ,>-7DHz׏BBXg K/5b7!vτM%gL lG9 =J;9llCJr%F O%-3KߴB-LRaR÷R8GifJE/ͪ={lr|7Tγ\ͧiH`a;+e16l{{{m :cs%h2:Z:UhꡋlVF¥rN|ulEhK U`Aq -TJ}3\]#Z ܋26ԄP^|lZkr[G᲍y"e>$`a/hF c$R9H Ia"rdA}FZԼYpV?&SS# i3ud$j{E ~. MZzm3+sKq% u޹XfZV{*d>YM.05wcP]P4qN -xN3k KyRE}tH0(30OvF8X/8 cJnMp{2cDql282&iGїDc.zWWKZ-o ,Ǟ)k_iD)/Zj, LS>DWAA?E*ah^qK5~~F-Z,n7Hm845 Xۀ p%*zP{- JT%6 &Yhh|WW\GiVib у/lNLT6E̤WZVm?ˣbFklPz̀\dLT3%-myۈdB9xS>OxXy{elЦ# #S&ANBab:[$ϔDnh296v,La"5x^ddžj aT[msP;Rl:KPH3gPe5 .b `eepr65Z58e nEC) rJRMa8ejm\>uGqi"v Y 9/zιs\#GwP(>NQiO!Jfczu1TH~+V/BYØŗѽaQ,֝].Y%{Dr9C[MlcJucNuHlQ$#B2YyTjہ-kۉ⹲.-Z ioSYT[xJ3q6*oԾ混}nT^V)V,hW(ٕ]-nqI&B z3ߤѲ}+$_G ren.UΛ#1[-Pm;.с]jM.nN O4gfx~4ٝUe/T9!UM ep;XM;6gj{̆hzvtuD|oM.׌`|v62?# 3j TVҭjpZ%^#m^'clr^Mr?yUm?Σ:2, =`$O<ld8xi$]ጷkCsHweAӕ,.}',z;&a:zwҎ2ܾUi[(RMޕ|g6tL86ϾTP~EKI9$Nl/CEȼv:jɲpKgl!f(W?XM#e"0NiUY=4R)(܍1 <ɉ'2d.-NpA 0 28uUXKzYH5Dk5Ud,fK?X꩐ߟt"zg̲Jxw-zc$"!Ss+vݿlJ'}%Kg(#ZOpM_Ei/Ћ:ӟR, =@F-c]UA}7}=VCM N΢vv %7ȏ!4V"|no:-a쬑*{{9N{&e)ƃ&{P py3sqgU`ߣ}*{/?s^]s|@;. g7|MZF1`BS yb@ `,ML7z??>ja8JtbZ-`I@UvkZT8B~&:gHEa>o[}xKyXk @mwߍk"6d,5;! B;qb7_I^п,y?z} 8ؽY|=ʒͧcXGb)D/=;(Zˍ!K9%RҩZ-@/;efU$a @M5!ъמf:7lHE~Q]YIwYuog<Δ<"IoN섿qrr 'J0OӨVOmfuSn[mUcSPėƷ>˷nէq4$ ^{G-i^I yMj$ -W3YwxzۃN y 5WlRMͧ0UsA*7JwE%K2XKPk[M,"s6år8YțU`m7 ;<6ݮ(y2vhg>#SReBρY*WE5%+ycS[ 7|{}щpKKh,˫(*% (C'blM$346t*rn% ItP57 Y8UɤJ` m^] 8kRh/' ƧU0wأb5'K9"HIbxwEjxY= &Z'wNGz&{Us5P6r{DE^\%Y9e0L_*h&@ Oʰt:f?b= "r)i -%/$ഊ^zh?N8ߦ{u5rsõNis|Hд\>6fʀ-+}f!GRGW2NPhL tH,Xi^4Oi&݊ڐdxL?i+}Hu#*%:67ʻZ/rzvUAs]йu:9hAjJӪN'`c34"46ӑB' Xua?0d^bf$feP[a4gGK0exfMqr(~b8Vq3e%mcxUz~j UK /4gx(7D,tXjԾDeH[*DOK/uB~Alcz%VLRQE^ԉm25u K +_l Ml(=߫wQ&wQp'NÏl㤶iK vI`"3o=h<ܦIŇz\xpls=ZvIQi3@c`FVE쉼-F'x L+5^:{]nwaµXxҝmf^뼀d)½9YjOW2PQ(4J-J`@ ~.',F5+״Pb6@"Uni@+H^"aH ]jupQzfQTHrD>_:7bC`pPMgc\xQ ~.nmaa#%j7IdLbLhTBIWYכ͌mRGp.諉uQΎۓN\0\"2aB8XzWa :hQ6U/ s>+"qx[Eڗ)~cSHlk$+ 1k[:~nEӲ[uJ@.ݸQwiL- Tg"Ҁ+Q% g3D.._;PSFL.5'-ޟB +ws'+~ _^q>KTYyvÇZޕ>|WN?>ܝܣU=;c蟝MU$EhHEJa,1A9aeKsK㇘+d"-6psmkOIp2NI »]}{*D`0^deԭu/UO׌d!p 0z [27P๿m^-2Nw}}ݽɢ7=k7rTdp||\* ! 5W(ya|?Q_k1I0oK;V|4%w8LT򠆷:*Ǖi_zuOmD=fĉZ|h$hLe.bcNcQڕ*]n~`H>DWJ/.%A۞7 xqMˆvдȽ8rt|vp002bhaxP:B ps">f\A@U# K |[u!)X-Z?N*|Are/$AR. z_ @35a\"jg0,P}!%FnE7!:_㤼y़& R-?o}Jh[1RP|V!HiܧJIwW4cz3WqYiZm9QA'}?4Iu҇c9GUﶺlAʾh#tAVn NNPw(9giT[TT$@lDn-RPV/DgB9aQy^=f$w7/ȿ7J[TL"ʰ+̜\'t.Y@5C AjsJ P)D_lfAt6[cp;fod1z#(C1@wSR^# '[t^-dNݺgX/)ՅrDڋZ]-}a\ E1^AۼHK8~/#NcW\U[F.Nߕ>4  JȖT> (!|Uk4o ܄MtjV">s e< M.;u,Zp"IT'ǐl`D/0{#*δBr18UrGChNv8d?~u}d{{!trwFmeU,8H&Lk#s:"K!* X8V;fUc$ZP;Hƃ:_H؄Epv{<.צ:GH3-tUZz]l׆c퍸?ﬧǗ^,;DEt$7v&Ux i~ HaHIJyr0-2bV(,cB|"63p,o6ț៱;dRMZЛ[M#2;qCP{$kV3K +Y\q%s/[z*61l^ɥiU4AuXOݲEl_["gm)/B&7&&(2p{I_̻r7)gl%L#TN,b\U?߅_w& 6~ S?,xT6W!hqqBec(D9'-Wwb><jqϣ.BPO7loL\|oIz'pa܍FEZtkU7g1b"&鴬 \hFѥξkC' ƣ?ĕ,?D^/;7~w>5JWp-.@͠h,lmIZ9_iƞmeXU$\<0t|@jD޾aij_z==8_xsܳpi~EYO=*^~CoD?P!=ls Kl&=o4Fx3|E .Ċ۩AkULYyRKD\ܬt\xb.nuV{IૡO۩Z^~h0l@hN˼+Rַh/=Аn6i{:Wgyy{[{i>%AF3AQLWQJ|nzPe9ᅽ{vW!s^Uvp}vN7f{a' UrRPm[Ci_7%>^bB IKk} Ϟ'xX G";$0)c*pXDΘ뽽kUC*~0q aF |+\NSLJaLLqtc@yFTL+ HBpBKÍ|Ň\bv't<ƪGeb{q&%9nI+|NRD6x/RRD2U}HE.5ҥ:􊥾z꩛CJЍPwPIvQ~(".4ݒSHt΍6!Pj굎B4tC {wڼq}qKUŚ_N wAuHZDE]"DzWݵ% ) Wclӳ2_nQ@>KˉOn>K$cR|PY7 2UF;/YMPz潺-W5ZؤNCwvjOMH4!%3{&cp0-I#G۰ҵbfRaKM5d\H{n_ٗ>ktКqz|'2zI(~j 8__%O ޸5 \iRۯ Wwl߽ oՉŒiFY,^ HiZ eڒMϓjΦ2ղ"24 z2%17x5uٮ9H՚M,K$z8:@r?Ww MAa;߀xML0Q+߹лŮهzjB .aꥩڤA5k?kY~)ֿt2u%;yzrĦ[yo1Kӹg|kYvO?}ts٤flD O9'}l?l*oXj|dʹPoQf:__S箷?=ɘ+TI_KĠ>09[9%xKji$FUO SǛ,8.>f '],sS4V9ߊ.Hl ba'iYWSx\r-o=n;Ap6!ܱfztpp=p_<^zԉyс}Q CbopIxp`<(&;?Vq4a>G0Kx U9ah'9pʓ:="G$}]?RR3 <=>x?B'Ox)Q逓pu=l? /ӘD/j??|2EQcYjxg@;QVb]TPTssb QcQ4n1'g/CY37~JHR@;|zp$v%t elV-LJV->aJrPOΈA`N0izOx 6|G^h)a*W#!B6%K>!wp_j-'á̐[P*,2e:O֫6.h:sDb'Oi-ud!m'T‰悓50?%TOkob<JQ Ɂ/ڷ8i W%>}_$錠(Vrh sv(9kvѳUѝ ˂vc3p'.-+[5ʩy҈çϠՖ54,ke:g}Wʅ ¼~W"ށ^ʲ'\r&*)U9sGV롮٥V,o=zk:^^)#z ?{~`aYP`e&5 "{po/yKee#qv{k,Xs0ˢk߼P'a*C,v^fP@&M3_KdfJ㱄G \?kmGawDiѩyW6Sa5{Aa#t舳(n޻G- FTnw` #UI?{Wg?xw>]USy^෉w[ÚRAd҃#<@6ܗ~K"J+ CX(F_ynxkVo[ь3)0@;W˴u݋L8rUcQˆFVAbыH!؏ >ߜ_D>ܜBg/[}Gӿe Aֿ[V^e6P,NV!eFm!3TElLNҴ$t B#*/}-K災*Ɖ!CjMZAoTgǘ 6WgcSVOG>0S3oSTڑ_McH7y_fT|K5q:/;9-?L" QKq'mI6 EJlTٵdUA Hb  IǼ Eysέ[E`0(t}֟e0Lic5SH42QF ߉S╳F (\4 nfA5'x#ϯ)@ vf_ݟ{%2D+PJ|ػHP&Q4"thē{˙yUȃ-JR6Y8E0(p~g%Ԑn,du:-Uz E5L<1#s J\)XqF#ӗeN$ p@J㗍e64l k cb¾YQaS2SxA̅O8'UψQ۠/&۴Y$2W<-nO?fhoNi- /Lbfs*ocs9Kύ3ͥjC" mE. L$䝣.ZGQޔ L!4h`VtK̏4|qFI:}t8+-cVMߑ/+Q{frqEW{80zXU8$tBeQ(sl 4!B1[ҽoG[d:IE gXAVYݛV5Y|zrzVu焾vs|at#qL? dO^+4ڸ2` 53dF@w( Lv;X _M߷x}i?.dٗPFXW_{? ^M7kΖR$bBc0DES*XL/ OWoC{D©:B T?_Cjh?R'P؅}{xa>/Hp /]KnRiO rp;Jt'Ñn:B"VzðY q PS'Ƣ[~F=x0dݝe li/|w'{+]^YV͗w;d1t7oA;U = YO1)yɗB`YDl0Pncl"JDq+߁ w*e@fM +4X{ZmwE|?g9āYw Q^f c&!j:ȡHǞQWI0a{|fm{0c9:=?/#2 n'6XhXh XmxY#v8#nɾIA ^I޵.ً@̚ZPU@A+|}}veXZmlx@#Xx INaq<`'2-Ґmn,9=ez}(P>m0O6ZջY?j: ׫Թߓx": ȨhVjm:|w?}瓢U|@>)eyG ׯ6̚gwGUf5e=D/k[QbUޱ_Y_~7l{S+M"ޚ NIl mxvJJ4a"V!C DipbFiIR(O>Tڗ3j( >"3dt!;ǃsHX{` o" BOUѦwA}ﻟ}b8AF#Z_\iǼ=$`52%Kh5ayƢh xcP FΈI})yfv_XhS4kd{aѡ {H LBhdG"l:"f $|V#'IoV(v@]} Q#ecVipػAݨNw=xvvFo}3 & 7^w C:K F.I0f$c&R%8pQa2%| a}mR(ke5tPr.HoKE8&ǔ[s7kZHqBIIy8ad ?@V*3Pǚ|ysnˌ#g|N&iUoGQQ~{aqD41,$V2].)R`Bo Z]ŵW[ /+amXbjDW.Pįg䚫U4ɶ5)o7^kx~*Vw'fs~;<]cX1c /|E@y竣*S '>.134=y) eϋgzތO A$&ͨRiinCPtu߃YxPݾY\bUmUWY#=uG#G*Tܶ;o>{ RzT-Zr[$<>y1_פI_yhn؜f ~Q;;7j\URvп,B/ZEQ^CzYG~U)%"d0kdؐUƣQڴ4|$\ٙRڿDh؝m'ԊqR;{NCŘ >]e |۶G?jfQVN;lHE8=i}!Eݑٱ7:IYzӍǥH Ҍ"ecə~.G5A'MoL$r :1Ȃ?/l)jt~13 oQcj\+75d99BP`r[O5ע9?}[)e9GWTPx2l!=5&Q@Diu nJ5n@#;cjGkݳ%G -mYF!):ĶK-\vs۬!{$JdȨp7vx-}F)y^(F ;2D^M)ox.BҵA"c4NC򑥃ftҝypӽ~s}k0G =:hT$:]w?"-~)d~T?I:~ؗ\5w?7WzE{ؕ]8LP*ks  }fl1VI}=A\7G(~B3-/LIeєkn Z3#1{!f<)NP ﷬=-j٨s0 o-aDA9<[G304x9Hh)Px% $NqR@nLqb'|$!ѶZ{TW8Ax1}Bf 8rJ0c4'"vsX4H]I!~zIB92:>D >tBu/CQ [p"ﻯ~|OP~͆#l¹2?%O .j\oАGa]1n+;׸ĺa{7 ΌA2CeHmYS0+Rm&qLjĹ1RIM,W_I_]tr?A\[L=\,n-h!vJ<|(ڒ%]ƶI QMFSeOF.7,̬w aX+@3>x@D< 4TP).c. 6F~Vy $HSW 12%eBW:> S&%!fGl(R%YUII 9s7=6s˗}=r~L-FF1J t22=) @9IhR. @}[}n_;+P/ݕ۱ MQ"BZRFz4{q<2ahe'wXBO2 uy| +Z)4+$Z^Z\S=:>'$_s.* Q\Uzy^v3wՙ NV}=tgN`~CZߜ ^1b(U4T*ߌL3$"VoM`gda3\%؍x|eV0ű5ȴ\E᠗τ~%&rm]+ܖuB2 %>H.I{njb} 6.Ǿ<#"Vnң4\rIֻZl8h;6n7N N٧م_/,UE`7''d~6cNfX#eI&PN;ym{tv<۲rnx *gLl% >d͆JwP>wν7٪\ )ߋx 襃8cppmPLQov }Ñݠ[4|9GxdE^Cuׅsao)ݬVV8)pZ*lTZ(//Ň8*뻁Lig>=-K,qUmii$Py5}hk>.3AU7BAIR#D6C?9&!`.mUe rV\#8'Fmn4G~;-^kLU4uxMΔB&{i]UqIZAe!<@p7l'?v AY+Q>`A}@ nXud7ޝX%z GV,UTRC{^Ag0[x b8CS,uX9Nv__"$ȑf=zJ2^Ca*rzhB}0Ī/Z̽An?c!6R w%wOzËwRsWx<śD=@eg w O+xZ9].ۧ69CIwCk6[veo,w݅s`C^jϚLQc|;q6w&lXf2!$WÒNCeضCh%6CֲxC)Ψ? &>:mPbh &xbC rآun3v"nyÊ>`~>M&9GxItbۑK Y=bkO̜ m/g\*_Pzd<ă6A"TeK\@Zz}ͱi>Fir2!ۮl3*3 a]p]`.f6K0Rt%u%y{ەkP4 a l=/P _5"(18fkq〹8>Wo#x)d LD跂`TH6ݱf%H2О|dRxJHOtօF\k%ZD%q ԍhw2U&ɥe閭_/_`bedg@@zaIՇ<2o$!|#EK1²4DZT;J},Pݖ:"zSjM8(4A_ZQO+Ose|Zb@Necy DÚՎC΅T[}SԲOpMZ!U1߶ N5Uj&T̨ⲩRfsLWne,6QI͚wX@B.9$-b4.xT"'̲ Ayߓe^ޑ_&E$W |Cҩ[[ܐ)+$- [ Ɠb♻߃$Ãa10#+<ȝYۍX<OYGdCܙ8Qtͥ\Țv{kG(%YPU,Rjl'RjIͭD3J'XGH&<-z5MP aW#Cs@vA_E_ {l{@ޖ^7$jۺb!KqPz 0j#yWn\浐,zIv+WL&@gV'8G$ 8hztO< L;{ m/p=;WaZZN\g)LBKf֩ Qh[ԜJϔÕ0bG) ]@`,H14$ `t'1a٘̊vX)eݶ0hyd5A 2=hlm93Tr8|r64f2lx^u!+i_ z5V$nqa{S9w6SiUmYNZA2/U\W(|egýZnCT7P]klJYd]ú[;{UgofBYVc\CQ(`oc:^5KVy|Av o60"QcQ<[]E3SPifW/:ҧ0^a' l'yPGJ0qc;kT44@. ԉ ᐐD&n>Z){ DC ,y{;,>ԦpF2Hql" diS,]whxu%ޱ§{9{:tE_-%Joo 'j$x_ PWn'+na T)ωʂJ{XtplTDV D2NK'#V&N6ԧ N*#8-'38HHno=~ P F=_'llO+2 &<_ǩ[̹BXT#y&w8Kb&͖'Q /:@Z:i`Hecs9q0 m;o4hst>72f%I7z1<Cw!c X;-d6z/}jd{Ъ ͂j)vAKdIpne;3ըzvt^R6F@("n>wkCp +iL,ʛ!cブ F1->LYM:0&.&qCL2f~hFӧz;xl>://`=}{vps>Cы#xxv80V_>}Ԩ _=UzQ7f={8<|~CrJGO/jz/CO=B>gϜà ~bt5/>KoŋeGGG#/`ggG!SAǽ8:|D>zؼ>ՃomPw gGOap>Aacw'Ӟj+Ϗz`S'YqkRi3!/LsI,mrgO52`En'E8CRF߃ %>'\#hl4YO6߯-CwE*W+4iBG _"K^HbzK,M)=k!o|m! mrI9Љ|O]4I]کwSwOn[;}R_D'fa"Ϙp2STU&]Hd*Kݒ7ѕC1$|7t.'p t$ r(5t[YKR3ǫ%3F|õ;*z&XK+,>!~ XM E.[]^$Ѧ%ۙNPm~Jl+&q1[pC1 uY(RК4ɚTZ#jݜ_~2+P>ɌMŁirR @n P2i!qvX_MJuHHZ VӒ;:nӬW7UfԌ :|+WT,YO $ b[͜WQGQ?huwœ|| )h &E9` @7X ,R]CF{t>8`xjh#OoBqJ>GIt!&_^FCeᏲ1媃??xѶOLh`nչm߉@@>8?Gk'׷}#H7 SrE}unU=tu/sD*NS9n4{ZgS5s^(lMF3™*`88tIݡGQ:ݰ*8Kq8 mXE*貓j :1e YXٴ ̯zC0g[>+oA e>WX;e,AzP Ǿ@lm<40frvJhOtMg ok.IF = Z3\Ybt >KƏ쁵T/W,P'}> > |$6]G@ cú04jC#]lf[p2·?&UK1MAcez+;7o?ur6N&N6~Ʋavr h#5{^60PLAv?Y[A&qH|#v7?$ jŇwz]u3< c,S2 iJ:WK9@tooگ1XkLɊvn*}oRRKgG2wx F#_T/kRon h0 _ Fp^{ȗ-~ܠ61rn[1Wd #ߎLҰG힓:Nv5umMgNu%yꌥ|_>']|!@۪vBْ|nZOʇ|(!7Q:Q]R\L«pl1 Cϙ+78̽m/ Ldʋ]`62qaԀboijd`iZѹ.y'9!n?v 92aI$ Y}pӦ`]2aRcqR OWeqJE0S -^ӲOZq*#|RfJ9)>tWD4)J׬;0ɢ.*M3ʦT6q0(#R]L0E^Y)$+3֝] b+]/r8qBr1%TJMP_ .'{N&Mŗ}W^'Z躏#@tQ2Q-ւ!5ԫ2-{b\^rq>sJ')y>EU^-XXKj~oG#p߱SS~&/c! }Lc{}b;o<v͇5+A#Q?_eWAZwf\J8& ,r A ʸw܅uI{ s[_pᐄ߿>)\+m =XK \jwSxz@ 1z즷c&oBsw@vﯻdsBi;lGAV+Fmwl5sc(y>]PE1ejk_`U4F Р&#q< +{fz3&fZ,1n6?9mA$AߘuW:b>O1R>;uwUo`颙Ի+7ǸiK;ݝme65.и{@U jgЭ&clm-؛ dt+.[R<~#0=S*[cܙ1 &=Zł=Q0sM8йQc$]n))¡;Pcy99<*nSqjڎ<&z{>&=$!\B=P\U\ExzT1FXqH]xʐlIjuR{0[+^D[sEna59W%ar[s#mu;چӂz 'd3 Ł^%ƒPlc{̥}jR 44B7gOz޲ҷҷ^, P62tPɑ]s92w4jŨ[A5-P nAR~)/^;o5}uw~܏k?p:! }s)j/gr'O ^{߅$tk2-s~MfDAK.^~U2@3O);;~pk8 -jŃ3EƠd+er9cB3% @F|`|‘0>ÛSv<-7 mXƆ.a5Xϥ͓"6K òzꃣp*:ηm=ضcxDVfӧh&q>_7Xd⡱ )wrZ}"q m9EP~fo;#F_x𩂟6@,8pL"=t^s9~GO1>~8=/#ٳgGs?Gc?&ȧ~;,˯=~I'K,&|d5E*TؕtOD/(- @[Vb3Hh I_ȷXֽz~6:ǮxYb]?+ȋ_a3iU|MA`5sUT(n٨|Dֽ|N(YCU<`@]>T4ͣXh&`}0nP[H, 8󿳤j/rM>aޖDѦfj9BK(sz_Nv ` M~OA+!@"K<;)_)B&xgÝ"  5' vba2 pR!婨sbKv/vL,G; 0E&U[}FwO7;ea}ΐA|~__')ZViȻuo7Q&}8swy]__wI:C|J̟ E݋0Ts2_ Vַ`V)7Q? 'Q+2EHYrA*V &K0l*ҽ 3ankwQ=t):^e\M6 'l?AK[;8d9ZN}߱Ln )v;N<-LCĬҎ"m{;TJ3;̾1x>t5CᾥOWai\@ޓ2gRL/&K^ju]ieKSqӹ Xg0swg_B0pN( 8QsXqH{99 &GԱ U(Un}`ˆw~$+M!S\fTJsDiҢվ(]m_Pf_/YJ jdM>zT哀+FzF*3_&ɓc<rifVǐD΢FQe;11xElnbvYVcU~sbجfK Nu o?`~wVo 4E&4-g\29hSo>&2H\Љ0˻db9KZ#gD 棨#eD\YG"0=11&kԢc\Q]R\N`7v^ՍS{Q[T ?A-hu7I#iBdq*ur5 ͖ Z{m@`TD<*JZ=ELMtm6qz U2fJvemb՚KՖ6֛\Qvm]Ͷ6*Xc;Ef.,AqN)$ Ē*\&zȭ'8bg+QH&JKOE^)ޏK:kv4alqw4Ra{jk7 Xy@wv\,E,{@vMF@ "z ,'% FKyzLky\r+?1s3jfY;=u5S ,Ӥ}гb eJ&-x–eD@wrPt6!x;ow\\M2nuV;ʲKʎ}]#;Σr*-1H&&/uIF9M0lK*ѣZ6Z|/*CTqIpGB'#?{ˬ[t&6!ih֎]EsqQ]h:Lлh<'nw,3(!0u~5 U?o3C3a啹'm13qQoA~59H9hYH!|#,~*m*Vz%+A҇;V;a䚬ަ)#ߋ$,`Ic-'OqbS6YHdڷB3mD}[wnQRe5+,d1 9pR 3шՕo#'5?@VϩMN\ˉ%Nb&W)P͏@)e]^ZBέklP𲔹K|+uQTt*&TV ;NS Rj! m-{Qy)%, %-"y@:tei4ϕ2* ̱K˘`(֌RET g BH Vxk ,v?Dog<>L +Pt]C~'-IU=6[^#5~4-y (`JpC#~tKX\Pd"{a2\w)_Vx'O$dUO_Շ,!_]}f@"b]wFJɪ?Ick?qxOވnHU4RN]$[N Q({i4J7ׇlo[հlT, k̃篾rv_|~wb>}Om@ŐC1a0"wU>BЋmVKLZu75 bDmY1p4V8KV,W% ` ʸ˫eԯTra?{"! %2E; "@H52YvUXOeeJVV=UQJweNw3˿!oev\zKq!KC&n9ѠC`Z2e7k|*'DT(#0IRM)˵*YgRUpho,| l}sTEOt&44q5 ݺDV_7A$]nۭ&wHo~֛;bܴ>3z߈^%'촆6!؏5v ?sw>G~OwU/dAUIe7cq0E[ˀw\>uWUXʷʕPfY)!LgX,Z򴷮b-Z~ZJ`Znڦ֐YemIJ1J.> f޺F†Mư} =`R1.X"T7p8? Ǣ170eGU`.BPuה@`*nV7꭯e$f}e`{؞ Qz k`q Xm|mJ5UMZշwl_[ӿrcqD&]KWUN=^ +4kX`Fjֹ4&h28ET>f3B,  %J3BUD60s* K~It̺ &S"V5.bK\g5\}/qq,+xh빗Z )&+\*d.,kXmdNCyFEIC&nZU8f]XCSKaϿҨ@0 0CDwRJT -oH,OD,9;NbI6Q [`S 原dd|y| \ m kGvӥ*'2`PCL:w<;,"nKy/þcJ?uzAոSk(-kY,iǙEoȃl2sf\^He7m2UYYp fy7Uo@kX7`SͿZcmBCV55 _\ F Bpz+'BˁQ`A wjNW+Κ'NE[|'Va.Uytr]+f]7ip[\YYf%YfPMCcvi%[{ʢFmp1k9:nw i0#z5BS2ZH<KW.V́5H bdͷDmg)xCf{hao,<24jIeGƕ5txrpW4nXc!-]Xށ9:[anc3 fe=wl3>6_4nӼX_߯}#~f6ZiZ.bl6PK;Ɏc,e2fF͍vܽ46s%JKɛJo6*U5e4|J\]┎:>26fy@խ+"Wϩۡ n.BVɼFadZ4YT3^VPA saDS2Z2NUfG8-{xk,xWs OMXh~2 З{mHt9QOにpE$B&F6ԩᚸnkOӪn$XG2)s#YSC[)6֪?6@ efo1h<?Kkj{M쾀EEurzb5\rw]PR X)K'BY,2k46K, @JhLoRݹas?آ `}ۥo즡*^ d+=-xJn_^^8"K!f&`JgXKLe>'I9\|nrk ?e7w2l}77ߕrJie,mWTftdlC{e7)fhT-% _1tVƿ _5z&Tk@wU0V#p: ;AH?̊KӦC晊K>-(Et<ƅp H R ;(mWC^tռ|؇5BonZa jjs{*e8J9ǥˍ.\sȝ'7d3аڗ WGsP=4JPˆ ~\_kΝi˘ޱi2U FiT'牬:OOҼtxr^{A51YbζEײql맍hG,޳=BM.awOKTCFJI/q!{.E y= 9j>E-C;~C< 4 ?.w ro.L3VHz,VG.*s0N%ȓ]rmt4l!VRêi\߳&l ?Z SڼrQ“K׶tMFC*GXf4ᓞZb]GD95}n>|(p t΍t弆ղZ Pָ$C{?K戋#t#mz2AD6*\^S<}cyH-@M"L 4c9}$R#,ni+UǛ2ڔԀR\W! Aeַs8,s^iVdI즗žTJ܄dʼnŎS/߼6;Qj$vL}mbiv'f4}:;98uk݉H>S@1xT6c xǝ@i gվd*Yl33-BR( ba:[ty׿HFb]})Ҥ ǔTZ2TG, B !GKi-H( ϧ |"!~%E}Cv V"27D494ĚG.g*s]H #ɜ$E@:t(( P[a6|!wuYjsW57ON:_ٟ#(zEXi~໎(QqQu>B&2%-iHߞĨY}^S҇O9%]q!6p YmjljakMJZ#y^'[|ʣ]`2$h#v=bNOk7& |nu z)z7\3A$m*o8"[LGswi0 M}~,5ܡM*(`p*7<䵈,zS o< YǍʃ !;}QxQJ-t uFKi2 #{>s4g8D:SVJ.T`wRҚh|+-p=Xxt=bݘeww6Xj@H5̉~Z4~%hIKk`>/lwE>AtO[|Wݼ欿{% H}+M6\'Br=Y Brù%wY'?vŇz:TRD<|jP$[g$zXx,i.l%C3 rhx2`@;1>?=u[ ߽3W QCQ>- W6L"-4ǚ)13 pfq7)`qK  L1a<N4򲩣c̯_f~E,?sᅦ<| ̸9l.*^5k7 #\pSG)j!\r}mk}/{^7rM'2Ǵ MrW 3g8Ż99<ٷ(z?.[y7?ܿnc%`_%9)˟Dq=V+'x^K}ViʮlnV[qBam㪵Z|d4ٳWM+$S(s+q)℣?pvȈN^#\8dODh>%(cfK,v'WPFcv<d[j+CJE/%aH\@F^/_MCV[ IVxKFD\*ᨖ7!|ס|b*qBkLЗH劕NR\#>54,G'@q"#)eBKFac*0M#YQ'$.4GCؕ3ZڍxZ(Ԓ|p2tu;Zs|Mcbl@j!=qkNH ZBgQc> y6I4-8!_\O!R@"PTKq|5V !'E,0%[>E?4}i@;gZƣ6a+5ꉆa']ğ]QB |c,3?4zIm%Ddn&=prH?|A CָC9 lTտweŎ~嫓 kJreg˳zpVbos&=w6ns:~bcu/CmHp-QJƥ2^pS'EgB]}|e.w!uRtDqȷ$*ԫyXCk% XeXʁ߄P@@ .0[tX/j 3[-G>_jV6ۏ9- ؂!ً!ij ㇆vgQ@_7f@vX7֗,6޴5wg@?r'ix8oqʚ~؍G%˝%l_@g قiX0Q3#} 22Bѧpa8w&` 8"gy~> zKH><]b(MPo ȡ\SXoDSv kOZ1_ɕFvo5pе C#1c"C6Yϵh#,`cbٕE=O``̉@Kkz ^ӄ>PX!+t\!v}+e4YKl4׎'ǩWXnY$XmsO*qζ[@|ǻXw0pUh00/&$/ H v5dGߠp&8LѼp(MۤhAotAGu{IHJz+ ǰQxE?6mA (J>%rsyU$$ꂖ=:4Bb'X G*5(B9|%E~a5|oÐnC=VeH$-)uCx ci< żqxl!6ڟQIAِ1 0ŏ80jZo7DWT8{k v%5W c*_Ρw)HeHPдS-y7$*H('ֹ`9E!%aENfM8߿Ja+RoHqpBxOdSzl~;;ƧQp$mB$ ݊:3%XEש-V%@ Py+yJtB[~$ *%N.Ss%%Mߝox5%*&\jZx[܉n꺭f uܡoӊGB\ Bf*աW-k[wH@֗jDGۢ*TʖdC.QzJԍKmxc Pw z?wq ?Pw`O_T]Ѐ G|e~EKeMq+WHh~NJ~27 [O.!P$;⫊ BTA⛗(BT(UYjfZNOHJc4ւ>_a9 kzF2tQaã{.(y P.ڧxu 90KZsOEku\M̙4I5g\.Pp;(}@&ΚՂ!p5S@3aik~0~@C kT07tǹ_2,^ :y#?Lc'8lnFRG >3(>ײ9TDԎ|!=<ģoplק.id|P!!᏷ܭ*kȚg`1?`wZw+ eyTr˱-pWZOF& ^J ` ."hv,O*,s(7pp)@X"0g` b_>P( OAgcg]x)f5rN>S+ e4|#jDl,(:mXS盻.(O.3AX\3HSDlG*Z<6 @D 'B+]X6/M|\3% _:4Q`R  C0 &h3$l,},\ !KmB Q0iE}gJ*f`x?S/4Rۤc12>%AYYx Jǀka_7%`mS&r+eg60^!\)8HӲlG#^sJ.(PϗMn"s|~0cٓ􅮁_x2`!"9!3hT}AEHsNUD.*Ѡ T5Ӛn\ 0F)T.|3SoOGl QaNis|R T_"`)t:!:[E AXx4mh); =kMX۾m{{w;ljkaYTaZ Zb)MgDtXD3S%޼ d ű X#dShNz/q #ϤS-Z7jO|8I`HLL*-Bنp3IXKL_A9 &)qjd~-zK?@0z* |%Ր@SBQqyɢ7N$\s2JE=rG]@d*-arhAwC6zRK{Dnb ,i)RtnYB $"<ԅK,R".k{0o H￿EZJqbJGeB<lG`mi~J$%y’>c3mo|x2} `e1Űdpe 0&xAwvSWnܨR|Su_ q C= *\btMcU,| ?f~@÷ogؖdH&qV)B(NsE$0sMPBF8` E &FstIt5QP~M$l9\QLɕWDpY}0 Js)z<7 XOE8<~..ؕę =-e4ŸizT5^u 1=H^ 2YF|ޥh2F >etXIc Z\<\O|~7ҍ"4Gs?I5By? ٤$,oħgʦY5)#UYLPhY1e;2żjJ?`ʁrϾS{.AwsnSSǵ)PɀVJt@2B /7IvA&hgO!dO^Ecy9!$& 9ڶV,0ǐOP}`a29Ys&nxax*E:`N˸W44aN5m0S'ᲣqU8'#IMSOzq_Zn:y8p<}#ȂcRY ֍2IAw0ݹVL-?A䪑% M/}Σ{ kYRԦE]bEwI@>6 08e{M@kIZ]U!HĻO<-CvxBJE)d Iə4ttc: pwNAqP cZULnTWSBN>ᨔ@uX)L_'ezfQ(3ȶu@y]W;mߒaxe4OJއKc& f\=}6]eXH'!X zӲnT93pp LxJup6a"z44@8aړ, ^TQX/AM`#~F怕oʱM|S߂#/l\t e:P\-鼉uH+ !+)ޢ$~R_bYE_y>mtO:WCly~p-/ {cXxp_CpmodcL7heO7nc~LQ?!H9ǝ\ly:]oq?I|6,05gQPEGsiw5M09rRB  n@THpc4pݳf k }@HD%Q/;:c]Q8e~96HU\}*C%iP}c,l[R fe\i솩P"Ka#jC$U|y甹/ i')UB_i5~) hߦ*@$RO(f}/Ro`K(1 Yw'F=uY%Io𶫟yO.8 vh±K4v!]SdS@?. ^Ost]GjkYnl$CJB,d '3RuHcؕ˗$=i*`i>6y6ػМ)Ӓw" )rQOu oOzAKy' D4M:*({H-pw[üxeE بHOfW"bs\JS4;8y3䄃QOHxtZ:I Ǣh9(3,x `<$. %6.f9 &9T |AVb$uߦ hqF'DGY+gm)o Ihp̈j8~ڄ}Ƭ :) WhPl4X4[4@0LeF4hq3= oCKr @߂^Zu>ɻʳe}kGPTt }!U[oQv01r37ہ>z N8h@0( h6 3ׁ09V?ұ;?%XRuX>zcc]'Z z,X0uS@( p(>]JsW1pk S9_GkCcBlXQ J~QI<lBaUm Rc9mtQ-r~N+ez!N\C?|OG ~^t+mt(03w׸IT"c?/D.3s"3D:8Q.Fw F.\j2J e[T( ˅O%zp2)k(jucZF%pKNPr!Ndл,4EPic|A \;n{Yl.rmm2y*zpj@A'$C"s˿Nlαfl6 nҶ4WњYQw ĩe%Ja5% azŷ@KR~as ]݀ki+ed}NY5` 5!BW>JjJJ>LUxqZ] GKЄqXٺh9 .uBehYx-QKJ\sp"\l[#hw LqK5L^lD2Y&\A)9 >mû#c_"#s5t7GycԾ9lL$bu-A `n~E8Q49Eӂ'J2c bH{ ԏDyd" } NG)*:tYYB~&h'D={iTˬ73y=We6[|'B>f̨;+kFV<ќ VAnUsۏW6oXVZ,zf:36o !뾁A* C;92Y?*^Dyz1ϥazBÞGT* /Oc-gxD)O80yBL@`F54]Z}B͹I.DwUs1_>TM6^alɘ.Rf0'Mֆ/w_XnplB J-^PLHޑ|랚^sϝ^b*9rb_s*l>]{DX܅` H"A~DlDs8?܀<,/#ВwbIxR.$ŅaB;{)hE7|]X3Ssбa=$&٢G#j劊 Q͘/ ~(;Qyڂ94j[m&5`gX @B-N[(e\;Ͻќ~@^pR^ONCNV0pEN\6`}.r?ğp0|bƓ.vS[?v1VψZ3nI 8c`cr^}N%,`u-2%aR\ Oqˍ:isקBY&cQd'N(Iӄ^i\Cg@*4y$E'5)>)"x*ȭ'^!$Xu8(X6Dd`8Ó7Y5 |מq-8EjJ$`Fց""FQȕ{Os#)|" !4V2)MEL~5g|#ܷʑeX6A r|Ii a}U3[ %o5oqz3:I0!(&|Soq[^ITg}>ґ#\4oq5~`\ҪfT6!X[8m72#T-%ֻcw KRJ4++Ej (k<}>@( 3C}8m7 p5#-A-iyp. ˡ?й skBv1d hPCSku~dcAA{|UVkPnCC"\[W L>;]xоi/>oOU( UsE/j:bbCI]j {wsa 0X`#4‡܅6.IzNSKpÞT*FQԱ / p˴ׄ&fTZTm@s;voԊE\..Qٙ0,#T}vo;ibpnCm+1ɵ(Lrc0>(uOpp(G6-Ć\Qb v,& Eb,L/,?! v E>jU'SKS7-:y1}}K h mö5(E |H<׉=8 .Q*e5c blP(L\@ZM¿oX4:(HRQHSI|jX&2 o\""D|nHܽJk`/Zg`O0PYJCjb0IudB$=S(Ad;R7,tP^i'l. T$)z4PHz*plW`$"&]S$NBZNФoi4TS*5Aw$5pV耭$**xTv 翗=&b z7j8I_%o3(Pjܢ!jFbG~v3P D,n>VhkYcj ]xrLh]S2aېrF;';PmEY x=ӻ,qϷ-sBD}[W x>~__ŋ{8&e܃w.Jp-ɣ`($kl P@6D5t+f v,_nFF,TӺbt5Di^5YθVI A:-cd`5X bk̊,m_>we/ m.$;x̵ <3q'l4_wf@Y v+G #N7:'Nϭ.[^c¤a@w5$`*pzRpiԶ[魋roկ3[Pd ~u8*će,}T>BzOUCB)Z-]1\5q6Y~}XZw: ޅEvȦ&w*N++/;unC o4s*N0v y-Ձ:(2w9ym҂ L$/(}M˫Kg7:_Q-ĩ(4*|#y=?i*8DA:=E%Q睤_0W4"D"&-]HҞU`PC W蘼 7tgY}LQdK~/td[#ҡ;'2?BEf'v}}5djIu" t-Oz*6,*"m|K /&l_Pm  3P)F#JgK/+Ŝx sԦVhz,"M]oXrn %ے`ز Gr¹]b3"m )f$,xľ܊֒,f, b$^>q1+& 7qyEUyq@ATUUePۻâ7 KmcDG &*\mൽ:!O6L cDU{P``0`5"Z',rg5PRYR$/mzi*\ DO;T+<1h*C IT=`9c AD8=q`厽8z:wݘet c$k U/5 F"XE)bF$𠀐5"|*n{helxF5ט rl8YOc.!98b3͆_`bu^JS0[JPhChǀa40^jāMywt84h ;A3c8DfE#0gz&[*Ԏ }u,rnzvhq^ٓnbwSsIOuvBNu{w8 Wהazc\aYU]!\IG`Qʢ4}eomԂOц㕱7/Ui eםm KB\ΘQ@x.XO/u-W܁ՂCbJ(Hkj4~C;N l瞭wR.{%]N$ G`$ߑ~\KRk#}% F0NGS ')Ę F qzZ{X6t_C$ Da ږt*-LB PӰz2R7Sq!1:W1alLU&0pEmu/Ѣ^ iMlROcQ.#LZU FWSڒ4*[?LpmS.V,9R`8 PO:Ho#;axw_gK4k|{3[{]"3*L4)>itK4EDSz63~$Gn&𨾟摇5q.@+)fPz~^f|51@;Z2?= ql1HzHㆣEu_q yǗ=5qxw̷+>6Ca2uNL (~T^]y*;$>^=2ς}ɍf"PRO]9/B/ń?uJm8A:XﵿT,뺁\l\ p9tNނ$&Y.M$hYQ ~mML46=SO .\*oIP릶 Jg6톹3m˓gl&W~"yƟ7߁/n-<=YR@ĄmW79 ֌ǰy҇_$،p?"A EF0td}Pd0 &GeGdE0톂DkL﷔-cH]SoL3srָ()eYhzǒz‹SrD[ k!<%dj' K[3𙪡Uxz5:rzs|%u 1y<S&]jbQI(6L0^d4GOyɀ&Ys/|A+ ߫"MSqSb0 J:`QUڇՇݒ=.~bq8?G5dOSOE2X%s|\bX*X%֍TtPJB"ܩPz-V^'F(\. MS1Ε)?S./>(HK ǐ4\Zs]E/HzëN)0F|++C ~-*)VNK!ϱw^e;\` Ex[nx:0(z_Iv|>qs=ӶIf7H.p]r5vxWA_ xqD{iH"/9(dI7U7Zg)i˰C n*&۪3]LE~IPR.'%'b$dzg ^,TYsV3&i0p9(3$fl˻,aĹČ==BaeW3EjA5E摹$cOO?QK$\QLݠvH^"((Ѥ4068^_̐5b(&;p9G>U2(%-*#cR(;iNeb|Z{ B FbW'4{b Y`&lψ?%ea ,\!S|EZw?N ^ba+zc3G|>FZ]I(ӥۿ=dCW?ʷ 8NҍLnM EҁEVO o#u~r~L.&] w{L9lq±k\N8}N,3;X&tp)H ?I5k8-hriH8x+r+۔3٩(Ck헫.F=;v;8"i~3-'}MQB)Ȥ])iYo실h)8 Qu3oOZ>z-k/;&_z/a {!:A7%N`*m0E:4\XNv$^tGĵ\tAI~uX??/eMt]!@w`Adcm#MtE,޿/^4ɶLS|fZLhM!IN%@J=B m4tbA'Nl`cy۠@Q-U/ERӏ|PlaC_5ra+VIT|LPD/pX\ADw9 4]Os+dA Y)j&L뇠ߤ9^iHP t w 8\CIuD @+U x+<%w"e]*j{ZB\~HHqu58^х~EYL Jp8Óβ*s8+<8BThnmkԶf@S-J2`=4CbK\TDMc XDN i[VpeH$@|;(jKnckbM n%"|0@PSa2kx_\!!oWZKOlۤ$qO3;C wt`(hS,&zꭉ8t91ZWd{Q&sYK]+ R寻W'M߃3W1Mm/ﴳwMsl`ڭI?}Δ{ıU(JS2ًS4G/swX VAht_IXݸ_dw؞nO/jK{:ݎ>_fc4({kZcV*Ί^fg0ͽAs1=޾a_]e_{Ey~~_I_rχju\8{e_ n7sm_z*tKŻR9t^;ۓRsY}JwëY7;.^O;|{yx;wQ:_+Y?y>==ܝ? Rhj&nh~ԫ3Z^FUxfq><[jv25+v\ݜ#~w^f]c9kTGwCf#b^2+sp>^^wG`tz6___#G櫑Y{8]G"{}q*k`LggQdǰ^Jޠ1^r~iG;;BfN\f"wD%ln4z:^a8|9.$*yy1vB{}l57J㢸s\nѳ&݋aVKiv8/$poOv^^Ë^*;F=nAKJk;PLw偱=[]|h cq];zSje^wםM{LO2c ڗ8ܷc+3.GzV?>_qfvv8?=ַ]ipywlݷϭvsШAY%qn(ӗՑ5#p&2׫q2z|xV^un2* {B7SGӷ΍v0vzcCqibڨ,f3qf N_W_Eec{{>zNŒ;hh6J`w>$wNblwe`bWF7;N򭳫"׋0^s;Itܪp;]h'oGٻέ)kJ{я{}< +cy^ggØWׇPxڹy).kC<1^z7oZ/Y*·󌓫evoo*H:9xtcM\<6nTM#ÖsgV,6] w[i+Tz9v,ޖ{A5?_{竝q0hJer>^nipX?F Qo<3l|| Z_·pie|n\]ZjzR*_8fT_Ŭ\H|>/^㳇I7cN.vۓqu4{迤i|gv5&:χQJgVb^_lWr.f]>_\w/ӻ]иlnP̫Lxֵhp8ns갖hمqqv׻>+ 'lrhu:> m6>ܦ.Us3`/^Gt4Nd3{_[m?w~7Rppң^e}#=N}>X]15+bV@ƈ^7k~/o;Vm}WG# @Sqr5G"oejviR/D|8kw:Leo~1 yo-bp{9 agzUr{NkTXv_Zt<]\VwӇgQ>\i6;7Ktjx>4|~]|Ysҵ٢Se{{ֻ~y(]XY;{`ZE>~~(㷽Fp=}:c>8;l_GFh{ƑU?Nɛ\6A|ݯ>ޏWYK6_wΡ0ۻ˩:>=T =o嬜9J6~S;?̕ήUR"=/#GNξ j]-=ލ#`xTj=D&/qL?tGVaZ%}< I6Y4탃SgJmrsUN~nyt5Uo|u&=ܽq²Or{F>ѫT/.3WN'TuB;nl gZ_U/#Hl\LyZNMe=ī|Pi5?}ٛ^ڌ%jYp>J7"e|Y̡>f d_Urny8ʰV.WoniZi{{<8zW](re\ms\8W5z:?_s-V;idfn"`4.Gy<<987avl*!ͶoJU^ʃè6['eoAz2w^+X8oYIZ)_PU )`* |Bta|>xGW)Y\:0ȞSYʑdS LL.3rbP!z"֪e$l6ՊLL^DRS_(+Za޼jH0K X$771gwq1۸w?oJV^J1ob$ M@oWD'|ّKPn^퓃]WxA7@a}LTnti@+ȘH<4E [uժRzBł5m8ٵzlx($ ,6 D|8l" QG6sD&&*o* #yQ8rVQ[)hqw cQr!i GOh.yOݯE*0ۍBO\[&7k5 lGI]lHS/_}\0\pg3qȾZe_Z:*+w kSA\\1űJ]I a2,n):̃P ɯy0yM'cK7_'Ęԏ^d ǧWw#qB~zE }u ;u@?β`_c34:ZG:09.{)~RWsՖ_ }tjor}`qSڕ`ĄOV;A ."Ond#Ux1l-7NE5/_&f}&$]|\MOt4e=&'3o1f^bnqqC݉GW{^̜wp^^se4=Fr{Nyi.LNvta~L9^ )(]EEf:v.YjƮ](o<Ա.M_E͊X;YO װ2rPT;S,J槶ol/|.R];i$DTa9S9# Mo6]ok(+ l DˡQ4u(,VQVI^?XS5P%Fz6>z7'IVLE*v[m 4uBɍb뭧)Ⱦ7Ҷpā&ۗg5eL1)珞GLgL UpR?4J7xן- Ն9\q]'a Erg,+4+#p)f֯6?U= 5@ŏǴ`/Βoڧm TkTU-3MU:+`gь9mCSmAC9pgz͉krԫ  &?ύA'dPsv]vgf|4?naP9˿5KS0 ѨF4`Hv=|7W'ވo:ƈ^5O5_!*Ykv ~Kzj$B)mE'NN3h0#DH2mJʷb sSƇMx+$t` {q$l#*K`iM3Ty-M{#"XPw-1܈4%IłfSXq7TC::A/=!aO d/h< CÙмʠWv7xd4 u}z3u4^VM:>~f6nN䎚{eJ&83M͵[BT if6KD1YYbtG_Ѕ4㬄iߛ9{XH/")2-!\?Y6IEi̔-'hPսLF`vuAVV֨.u8">(:E:r˟JN-~9);D͇%ygI;hKpJ&W*mlo)FlߙXa'k@*U]0dJ!c#=>o0(Nu ƶ{3̾WC)s̓B*V 8 Y9}ɢKTL{#u v\qE~ⰾԗ"~<o\Roe'`Vir0^9|tL8$hq&9o)N J-{QŒ7 C0Oehrَ=%J}fVPcx'y@[0|Ew2m*] $&LIfy%u\ĎԁWȲwo0'?'A͙:r-{h,4G,OkxWȱeXWaB*X?xY5SNɢwu;*ni0 BlhFtoc]BC)DC?N/&)Z<dXO^n}E(7 OH`úňX!poA{Ҡr)Gڱoo--<xLUH#+m166eLvZD`(L.ơIdN5*02͜b"aQtWAZ -]}HʅD|&UfX5 EѴ;@;sy I80JvuBDыnC9iE@JV|9Sԩ_\K-\b-g(󔠔c<*m_;Ҹ,sy# b2b%7ϞqUWI* kr }֦n s_ ҧHa+Pd߶Ḇbиj L_/=K1Gh'~p*<=5{*ٗܧ5O\w'<`]LQoZjKPEuZ<~>GBM2T[-wY]3[ZÙHey!N9"'y6-ȏ7aSe,BKN=lY6O6۷c' FΓ,ݦCϴ "t56Ψ&)CՋ˲m%kL#?osY;O̾3-I ӛWW qvmglڃ)$O˨#e߀f T|L\I2NֶF]=md,p4 85Mx`!рAF"Sᢆ&¿2f̤թsC鐼ǴI|P"Q7{(">ǂ2k!rwȬ6ݤ WntBQ#M.S~UXl7G+g7 >(6" ~yFĢ-h/&F} g07)wp?,i$^'XQ:58 Bxǂ O@UK,C!}+~(m}y,Viم`hUƛ^MHTg'Y=R }BN8ww1>0u b\ub3uY !Cs.rzcVb ߗn8ǰԵ-iԡ0/|T $ظn7> Hoe?Z0*\-i]nF3F?֏(nDyJY+BPSwÀ{[VDN].` _:dؤ8>_?zb,C|`Rhc2`?" F;} wff 8OT8xcb.J$tT͎|6Priヷwh.[H_] {rc'O8Fѵ?e")6%TWY'+6XSlLߜnGS 1[єlG[@YnݎO=pP0&#e!0^B!JYg_XЮ[R6Ld~!b;p>\7JjX;x~ؘ]n 9*7A R80011F쬨uHٙ !!)Ȩk?{?㌿/a&D.QzNPS K7"6?׃3 _a@JL8I72@&{+Mή*|&2%Ir]okԸ^|=L G@o2+)~@[Ayt w7l]wZ%@t 'v⥈i(wJWvU?wCŤ8n$~Fp(_:˥֐_#'[EKpI5E QVo=~x< 2f|n"5Rt#yR#ɏcI3v.*_2R{<"5ז׆ ,{_X ݕW4 [/Z{֔~#>7()~N}{Tk[2Nn>Z8 7;+bx]˖<% "&P`P5} ECy& $ /`J`xe*Jq︘;?HABt[S $h_7]iB%&7aZ,4OdilN6_S9s>:!p4E_2gxȋx2X #R׻C>/#dkXkiA\1\%qzr|p7YiiS qR@eAs EݹLq?,D \~԰JYc, >aSw >+}",n+Ԯ=Waf<0G|aIRQ9t?X%rHkj5U# ކcV~VY+ej;0ȰDmcx%i7L[a a=4.;'ل HQ((r=C|}>d}~ڎ4W մp3\=`5~bI,sHH@*aCb&IJn'ܰߣ:l}VXB_z+M8vw3 FA}K=M r'701}{pC2jvᴽрL1a*$#lYҌaF aBB7)ڠ~w%|WJSG nD=# v̔P=hC> gcxArׅX(y&cT~7bw3{5nU+nK98K?] 3%vɜl5iBOt-^h on (r,@IU/:+.q,g򓆬GG?/Cjgv.BKL>OR 4 > M> p-eٳBO^A03zA @|e_>qMU}niY";Q[GZ3MCIz5~Mt+S'zVηU@%E4ZĈǢ5\w][f5+l~!2 B1KŨ?xN nBdrb(C1a>ŭ3\R Kȩq/EОh UtOJ>+YfIOgiVāC=A;hq@*IWw'L \/FT }~۲<`Ao] :Q/RyJ7ȹx=?EZ dFgt&G=j#836PhR\{WL8!?&%1TP {njEQL8oRJidDXW6k/J+?7JhO|2%߃rs911^%~S@kV2\{F ~|b䆸Ǒ1YBꪷdasV^I5VQ;Ok\ip$:I Ӫ]yFSw)C9"чg~QeR+Lx,8"()fЇy>O;K;I*b|%3JRߣ0 5 p Ѝc]( 0}rB6Nlو[Z9Lt q`?[3; ю֩'413"_  M W fj;W5Ԯ"R @ޔOڽ5$Lt;>hO-p0Ul` ڟMf(! C1fdH3PRM9m!EZO+` z҉ QF!ti?蹘T}XRkCB Q{yjΘ[p" bgB˳q̨vJ՘[]e3p (L0lb7ϋןC\?1HJNE : .0hS9-a6жoY3/=Ⱥ5FU6\ؠ$HdOPdXU׷g޹I+w(xݼ\Jڌ̇|*> >NŰܞ^p--ghg}na\ϫ LJ'zDŰJћU'W>i4Vn?[9 ,Um=IjegޡZ(5 H,'W]XW'F_M1EoDrݺY fJXUMǁcEUi~͈q[Yl.Btex tOBK87 gi  =͉[77o09dCL{Mb0}ac }+QFA&N%Fq=lP'st?P;ڵE$}ŘSָiPE t[D4~H\qβm3bsh(*ah,Ǡq~:ڍ*ٟiԪB:?+s۶.'EB)ekG؏{ iS1 wAкn黫@;b5Gd}PJR m{ԅ Rxj>t4'!.Ϫ zlv,Ejbd7=$B x n2ՍA_kg ȯ3c~Fuu3£ $}Yn5Se[Ն2Mxܧ TMFc+' >#XJN)0O @E9DQʂcm䳆Y۩K?{Xպ8Y&]IU=/!j;I}܎6J=lRVAS<7 *JXEeƿEÍ8~ZE+pz{3eQg!$۷7P(@ycP#6r߹x". XR_`#X 7A' !  x*b~c_pQ Z&.HDЛ),KyKk*nCK랋cwN2ֳ .P(]sNu21i\1Ce~[8n)qa`a]ƩFV Ho{Fmd.\3`L6 Xr | _lH39T!zE 2C-[ Oe +J)Kz$k:l#ZLzMҦmHpV{c9Έuv_%^0K!鳚_O$cW[y|>Xpꭎ? "=A^7bDnCIӭ_GwHG/1Lt{ cX>^˹ d'w^દ mrPG7l+~9k6QڶBm=L\0BoJ0HcF|}:L0'H&R]+\u}VӺ|`nAQ}RGd +u&v_q;;b㇄&ҫݥw#:O @27d)p˸\G 5=qq88<8 "`H, C|gFai.|mx5ΓSqFͶKwjO#q?^"/-(CiZMXhqXXE;igñl?o'X )D:T'Fm &6zVO,`KX]JVC*cHsDpΟFTݬ-&l!`̾Fup$m5t02*(r|e$K#묎L9OiS1|EzRJ*~h]3 s4pDCVMe#_н/7VOOk yR2z-][V͍*iubX¨oٹ>LӴ2b~Ģ^ 6l [#4"_DBןfCےp: _qJK5ֻ>LC lA5,N9#߷{A.!E.̐jrC6: G>a UȔI@Æ !7A8w2! 2~*e!+2|wL d^-j6ŇL⮦( KZw%\ Mc0b=[@\Us8Kau;]lQA(%U̲HE>dZT m{̈L9–dʫPG5#@ߋَ߸Gme{~"IJo [e=͔Нe鈡~RMBx0^KP17 # UNm0=Q!_*.T-cf '( C#e#E6߁41ƟW1[ ָ=̴<9EG7_#r`c0^єĽ;<2 b @"71w.]Ȭ+~w) |~_txdOo. oϐ̣ M ѯkeypGYIy!0puJْ"0H ߥ[ޥ[_lښ26r0T밐_2q=Z3 V5};^=ƈNevhk^z-?2L6->@' _ !l<&t¯>djLhlKAt*]@2 a-4/fogU{uYP?=z$FO#* I-lZ~>aǔq0ƒ4pC-Z*0ܚΆlvEXU#y$Wd)_r;pCi<.L)|G\ !G\Ob񡿂 ƂGŔKTv+f͔y}XK?Ԕ̺/%.]hgڦj:P}]q&lRLWS0;فW负 P c*El͖6\$6FRٖ}!@0.U=l10k `pN> 1MKiCƷRY xIyV*Zio=37k0P9u~{RGr]PgHF<>RpC#V&w.}٦4oO11 SzƄ vxzص$bIO1߯EB eF=t bRS`c?9)N*; Oy(*:H q'Lzl{=LKa!41H1@Y~KMՖ pC XcU q,ѭ-!G]:߯[w` ȝV2ESK(ĖhD 9.~pى;JudO~0O *=V73c ~ʓq\8@<;LܞJg'Vy]>vH| wS^;6VO `Rʛjq&ph!bJr@@% yVa* "ͧoNܟ/0ƃkޑ7'hȾLOb &V[+_~K DV´Dt^~h)[ͣ!C{uAG)M yyV31%|G." 49g6J(=:X_7~EAID@݁?#.G6QQ9!BcJp胭x^ĔZE1eCa({:77'nRI;h OM8r.Xʲ _PkL a}=7 R?[ Aq(CԐ-~|O*wVGs5X~KawW0,BxH~r#> 96kz-UjMcTҰC$ LMn]VܳX*!<YM딈BP=_` ݳ"i喤d21;V+߯$׾]&{_x̠i*NdIMW֌磆aJ$5R:Ě1pӯdWr ,bưtړ~gYAQx St_B^R98W%C Jtf rq r`vR9)U5j!v7ɭ;,E8_㾉RD]3nzOګ!m 勅4u֩gG4W\B}Ѭه?Ӎ'`Fv> `|]hrig1<srSU=y&>؟KLլVnB݀JÛU%ƫȗQeNzcp]("R :)&Ly>q%/ ?XmԚ܏XY|:}ޝ F繉Uܜϼ^D+*̊1W ET꽎H i.RԇȞ-8(*FL4jb(Je'Fl !&H=\ ? o㟡M{,:'4w1X6E]~tXۻWW="H4A~S?ħլMr ދ- =UIIoZGe1h$3S+. q2O#$Y&Q_@z8s'YCw=  oLZZs}U?zBb6#@U$IVl:"BA,m-nݸ<XBzˍNYoزij``* u@[u7RTݕ- Ñ5g?~=od,Se$U=ucYIjj坯{&:g(yg"rǚtov䳳6{yVos26崠\?+ VY˭ׯpI. ^:%ѠQ^j_X>o6e6jЊa;Noh K::c P6yUۀ+voSM_9[4/Ľ9=ʶxDncd9j&2%Io}T+n1_*XiA V~LXbo~vq@lwmZǭވyH&*ԳqLy ģPIW+} AL5p">'}{~^+8aɊM~׼XU<|<ѱj&[o.%C>2G.s#ռpK#SXUdNW_Fɨli}͋"^J#9}4a@a2xl[b/@Ȍ|~ڼ"Թ>#>wPj;:^t8G'5- ˍ,w|`V ;|,sI萆m h*oR/ڝck<8!+wcۺ5蹭rQR&v%7+ڐG"f&0K*|^4EI Y)ɔ}>֞aa^ϼAROrhoo ݌piiG0L9TM Zp0ӝXEw!F 6Ӎ,ե 9Qlh+DM# ,.@ os~MRDRF.bO> 3c<6"s'}TY#YC\29ց5ke~Jyb/=(M:8vKh-96ͨb\K E1Z3~oyVS8ա93 KCY?om6[˼q|r%ںM F|uqy+߸G y("rǏx6l{]KĞ0~moؐg!@7A_r̿&~{d'Vd0;"_,tI{pS2\փ( 5 |ά[&_~a9#D+[MtKFӘWab{%x}笟xp1I9B:.),4ᛉ 1KK  ;ߴGLj7Dy'owfA#@!(dy`e׻Vluֻ-zQ`qY#4D\ c7T+PX&h7gb츍 g,5֌jg# 5E(jZc={XygQ}dէ4oeKmvņc*>lz63E;BKqʠ=b0Y\qլi q]qXڧt3wmŰTdX4eN RE 3h]HݺkuNzcJgUvRbj6*ڽ紙LͬvWpauB'QhMTD_t+'ω`TۖUH_Ħҕ/JKŸrA4phD&ڎ:r&_ȤHP0.#(ZMVK%*G+;C5.Ɩ3=P*O_"Z'ꔬx _@nj0@ج` (|`*~u¨ %OפYOVWH4Y9w"> [IBZ^6Gܩ# M檨]=d&sU Hflp>:&e {Sx*[z\mjI/vr' ߛr`^Bn3hLXfs2fv;xH 7&fqߟ q#vTL_?h ثWGPiX/=zS31='"M 1ȹ%w[0sݥ"V vx `@So}>ۑ~x.˨J^+cQvdn)Ӊ/^C8NORǴh3I݂#e޿s3Em ; dG$\{ڵy`ƄOQZ.~(ƹ<+% ۖ^[;(Fs-o6{ Z ~SŞh &t 9!3́@܂_* )36'O6p?5-WHCWϭ0+%7?¥Ok9Ӱi2ϴ a7dȟ xhc r72so30 rC[ѿoprq;{>{ m=5UWaˁ+S-߁cIP ߸^ ;C7X[B?g^[J2œ咕!탍|ubpvu/[FkV}{>qR.r33ҩu~Hi.!= bwQ 6oytz+(NgHs iD_%zT%>MY#fԒ 9Cś+6Y)pz2'[eVfxi }(0V0~T)+=9j C2WPW#fn8+Y)sJUý˰Dk~P40CuGB[E G&2A<*ɇ/6H4m /k6ޫYoQɆy\09nDXY=+ub%n5:{:xJD̡kV5__wӇՄu0y@<*SX-WFNYby} O󋹐GnȴZ͵v#yq&Z.9c0s;YXIvx 8r$+5Ǹ '%5=XVX82ʃ:3JA ם/=S9nm'gՐp`KyZر2dmwKT9"WsֺԸٶ ˠkhD5qozҍpHǭf$Õ=>N ӽoc{oGi l/jg0 ~/mlmma,}iBx&Uʗhp0C3,Bju|)6{oIt&lx3}?y->S 6mtfF? v ]|>H򛱖>!.3A;K8>xiKNj]jY9'\8JOCdP5K24#08|dQKsGGp aSپ}^)DS_$$8(gaxʦ'5*~ە[9CgQ Š$$N&V26t2ufzod(VzC3ЧoV#igߵ 8rsQM$&(a~1O7#65#nm!Q*"N/ #~#uȍyv|{_dZ\5}1=aDkz|3`|i:[:j(^C&LM$|՟>FZBHzFL$cv P,-\Xzgo\0CU[3W[?E&몣k rW&fX +x{%dwg˖:q_Tt꧳(\c{#u}nҋ^9xl؋ˆMԹw-h9 I SeVh)]Tqmn]%.ђrGeD+GREO&= kd <{ůP"סϗ%46e ȼsB3owhi4 QdDΝLK^na%mn2,Bâ&I$O|x|j:O6DMtUs)]+6q?"5d|z ocfD>FIjy'5othW唢æOc~x@ FVh}̃U-{_e5tZi,:^*MbxP4ICvX u>/"r+&\nx Y2(?IEF0>t)V;~W%" LK{L&LC~4sJ `;3,–AQ%[*ʡ%* a<%l¦!Y^~7n|WC4.0|'St澬MO07u#P(! Vy]R80KP)yd nBd: _zw=^>f4ZZ/}}L`7' ǰ0RLu -= jSgArFdl g+`Lp; _]i-9 `ҏ k4`s KA_ne[N!i-(nTՀ#&f@W38+2` I5f X _1z|i- 9[+#A oϘi`ʳZ(K -e9!-7pШq4DM,QpK:2K\p7cëSHl-l3~*pUΩnW+ uCcdIMm 4 I0>;ɘ-b eD ֲr!3Ͷ9 d,Dȧ_џ;2CjssvlO:a"3i1L]ZFcMm ek-S1רYj[īiX.KHT=˼_հ}_Fxl +ZL"1,d?9/T,DDK纄2h&닐B=.>+L,( E[^4 II!*={Fs߼)$4?G%+cQ~ҸWR"'DKds,/q|wHu K Ě5FBrr!LD,_/x.qLhc~4vI$ s1!L){Fn"},{Oi">7/?H,H8Qm?.H?cN #D<\ObZf`F'9~Wnk1xCce zKL QTs&YOjo %+j{GT+]0-꟟}Qa37=lk5R5>8E[^/F=ZSNOMHB4-TB T| k: e5?]$۴hl-S㜋r| 0 TP9Ccb}L/{ξd 4A~Lrvdsu2KqAOл$\Ag1z= HLsAҭTs~\,6eqPG9).f-KS_4%e[ )P"+_\9>]+1Gh Ji7~}n)ʓ?a _90~&&nW5BrB]QXe0fL6fG >dKVm'M*LwExsH$ϵ4,u&Zh"+aMBL m`" eXBAvBmwDroSGY$3mi釺^<1uNY}BgV{*G,$Jț`_TW)?«99rCd9F QGtHE)ѶRN~& >XeAKBAكn}{sY.7H$kµjE^ X]ό ,#$[xnuw\? L_Y s?)ș!k7d{&NXW.k@"tO}ȧJ ێ \)sXDg\G0~ipHjq%Gz!n*5uFcʴjB 4K4TMxI꒘-{)ITo}F dK=sv2 m]3W[PdG`d ~Zhmݠc ;Nb<_PR M&Jv+\ѥ~_Z+VPe nc7$e N^nvKp}x#҅ PZK}\'e~y!Tۘw:p}caļGT'׉H \6(tåXI$t\>Z$S߫ }mRԱ\f?%)`F7,%9|8hOН[dx NpCqEa/3x-|hT !X|3i>-f]7~o>VB||.TO|<:D"_"äc1z;At#$ԑ~cH ?%l(HI 9擽[6p]FB3މLt :Hn]OfY}u]>O$& ~KJ Ueyh[7 `Am~b8ZtK_( Joꦈ!KQ=mFX3IhaZ0&s?dz7f7'@Ìk!˓L1inP ąR{!ڰ/+,2nLSwjXX`bt^lb?*[բ[5vWbS?$[j*hFew8Ϭu5v 1k.QLfdae~މYr̨ҳ@k\'L+ysB5nN^N Co!!);9p$D{C:o0R_:q"X@6H?)-(?zA3@?\E gB;Ҍd]dةp# zA |a׊M._P?2tPҥԏig%yw ,ٿM\UвV pPu4Rlh:.+B`­LysFxLMDyoY*+U8ņw(I R:|KD{Ȏ— HugOMp)*58˹U!#DͥPfῌ2Zx?NCpbc4ӊ'FO}xc+$E7Iy(ӋvqhE-&Vf+Lu!k:,/g "|Vrσ<49k3߇V2aƖ2,zHTRaku}n"|myXqcnl(Q~b잀* MFOn+YB8ˌ7z̧U":AǷzּ^O-d>o&tG@"i8 7ڳxd>h)P*0s~^.7)3 ~SzH)p4ߞ#/ P~ 8fhQ 2ӳ6Pæ7Ϯ#9I%\F<.A@ I1t09)d/ `mlNӨCJ`5X>4l6I @7"4foJ8B kxmh73:]mѭɌzđx0ں9u( [8rivξ8kDDҍylmsa0hTJ}"\ĹVgtZ =oRצ$ڸ7r,j}oMh\Cwu3cvݐhPb;LGsbp(xi}Jhհcop5C齰v4 iSJ¢ i:HhuH h U$IGh-PVsMA=p-p1}(dŋn"K{涆 ;ȑfqH֗pP6 /X]i}`0F`[A})6+" \dx9sLx5śFIqUplh;kPĨo FLtEL䨧?:anCӥb Nk2c z|dHFHiCju֏,9 ܷ<h t4o]\T!ԫ0G4GqG4 V {hӳ/5A kԳ5#y1頋'}c(X5v@|-Qxw DtVB4)Xi;i0UfD [RGߔ\Q.4I!UUĖWCsw"ݏKx=4'& FAkL*Ѹ)V4q!x "9 Oof˭,AS5(eߘF 2IޓA+4 vhv65ΫE 7źVk5Mu@qZdEHi1"hهuL Ո?N[oQ):Xh;QCqa:Mic0Th 6Yy;ԅu+iPkø-9He̥ 5b`kAaOZAb /DCl ^Kk+aTf9uo yQ lL}6Z3^/MmE j 1 '-Oo e KZG1+ Bp <,۶鮷=Q79fT>[tF<Ή,~e\N DŽ]BZIٹx ^H4A5tѠlID]*۠{|,.ˍ}KL=S=FwX}귒Exgc*smЭl/NOd:$4AԴ'48v:1B7-fIFJY#N^(cz췉>Ye*}dI \6r;1xvPw>#z?<8CjFCV&Dݎn;r$qAm^ q@K<"M҂t%;QiIAXڧmRވ e5E@ʪ;K+s-Lh~Gӣ]AjG<36*xr2h%jrD,IxHtO n#5ZڦFPiݙ@z-fMƦ y,~":12u70"0rG \֯jz S۱\PJq/NGaz6Ŭb0ɭ{(5Vy{Ju+RB Fx0 ahla9i +^kDC]Mejʘ򱌤b5 2 nϴpjCWHv`K:Nu%FSdkVRji>+`P5v׍?iΰIÝ@̄Ķt[\Į$5/apW7p#Hl%۩tq: Uӱ k O;s3-5G"r ۴Aخ.i1ӤHxSuq5]mzqpŌkV: r:Sle{&$@x [Nݠy 6Z#M@~bGe4K0=$pA?qe nDGoq>:N4{iɨf܋V/2P<#xϕ銏PŷNXƏFW+Kٌn%Y&pNfr -*AK>N]dM-#H2kԔj8/-3ilޒ-&ap|"q 3.5qWr!=xi򄦻aLҥmQ6& ƙI{o4Zg=eD6ZӡȜF)ӛL4W 1޹, wf;7ŏ㾪؍DJH{9FiM$LkĞr 8] @g#Qo6w֢Q?@}:Z#>#Q:璴C}% rz4v#2%cր^2FQG:SkJ6BT]s1sfyCdg -!FQ{гRƉz3ad\%xl8 ceE*7Xθ Fo'th_tz͔4pnvAmcK"&=Xؒr1#+v?^ :vcv"qJkv.dͽ0?J4ol6iϝ7f<tA$`u1!˔S:J!TDg Bxjj|PLz&LhCbc%ݵ%'ŭ+34Rzm#<̾1S=H %%;BFi+`SQ^*#CH jKAbZ]Er*6B'I*6 Y Au{ښXmVk e#rQd }^&toKbXj4٨*L$ ƌkƉK #FD @:ىD//07\{L8CS:# sj[A$N9ϙSצ5L(6bYkљe1c&خo`Տ>ZJe})p-KIk06!`PC(lCU!61 bG H:= [w$?XjfՕn>M iȀOQ)6C Sk0@u3c$F$RiNbr3vX>pАJB@o(tZf%! L2ځuBh$$D^J\a=M;E<> xn&c1v$*DhqO !z,<_MĔ\=ML(YZZǠ8'!H.p臌8&cKLJA#lF2Eu$mfp8Աv=ԙs訉v bÇ@'3u+1iv1r#W7'{u_^#EU^j(/G n>Z7d9mz'!e>MlvB6g3yrWcMbЈ¸iSgVzG=2newGIkĦP"l:k>D/7bh:=[8UbG̕[cg@׎Aa:I:р-^ZbPW!C;bk[d?{ /ɸޠfpE3X'd*ў`jMpEhTD ;VRh}whG{> x+vPil{?x,dx؝ء~Cc% g;`O;$I(Dc/¸՘@؟2H>3f43A Cܡ!u3 pFȣl)M"u)nm$3ZLO^qI@I`ѶinB.g&VN0c)e`ik砭pm`΄g?v _@+Mmљȍ@\qۓӞO(` k')1sVAdV0QJ!Iܠߨ}#]F֩yT nhHKAM3+jUC|4R<[<E4Jkk1vg 8s% Vl)4[ $&N&J6ZY.n}ĵGnʬh;2p2a$pVjVMUZK5-nDz \@ X0F`hvoprūZC pF |cح QN +rت1X}0&YrB! PTFz,GP/&Wb=mҒڪjMzǥAhwn BRQ=lJ(XÄoLMz?ejmϓȡ-t$ESѣpl(GiZM6*1!izЬBqR&΅v’Q}&F<R(%sU7cfm6%!2&q#EjacnJ6[f:$Ml`>I0 b,be#6`%&MDžZuރқt6զ Ѧu;@GFl7;YF .|>dHc$Dj哸6hBxB5)Psw f׍ uݔ VrnYxtDE8gېX7X͠扉R=cnl;3$1Շ}<(ڣ=@2 g^}6LV㹀ݰbcӇǥAA2x4_!rGZZyh=S#xvaAϐxN(b,t,DeD ^ˣQçݒ-|Z=V_Q!&֗Ap vVmzGZbh &Eݨ5jc{u49a~]x"{š~Zt;YOiR;у3*^P\t kXHP0@E{[tu !)榵HwK uEڡfrj_ ̧~sߒT^ M,A$Dr6{ygQv5f Dsq Sv˜mD x 5)0!eHaN.L]4բ@>/VG#N1nxY4A-aM);OrE2)ACM&!lPh9S[ǻcFj|w挼SfDf37RëKuKXۇdAwD: ĩ^́7X&T2 Z@L ȖR<@$!x^ vI\9]{ wOXP{SbF@$!w&5npn[ !؇F^K6Sw1.t_:GFF>ZFjxL}tD1 d;#Gv*fv,bWym¼)P  *H lhHمad<NJHb o=5{߈֝MnG,ސFV1Gj +al4cRsnpqw˞46ZBCh˲n`ׇpXU0kn GqVِiApOڮ Y+`D66uN}R_^ZPt VwH)ַ`Ԗ"fǛ {j4ü^G64}t9c-∏1m i6 Iktj0h`.ݩ'>R7E Bs@sdgZ sRn݂M`1:RIu!n k1{6Ln6S`=L$F.p=әuCj#֢̍fb :38HgKs-RkoѢF#[ꖠUCnkG7pmFk)_-=ije!#ZpjGO$\h,rxb*oC"8Nڎee_~V?}n@ %F5,R&׷+̣F,:'(R!,49051{#t$}' E6%-oh#[}<ՇLջuj!1YGM-uR~dvĽdi\C[gm!hV(yH{0 1\6au'RB 0(ڐakQuj ]u1IUtvdOhS8 1cC]bwY7k+Ĕy-!i $={p _Pg@jۦ!ڂQUDr %#lKlgqiy ELbp3ZcH@{&.&$0F#LЇKbdk?d;'z9/ۄ1#K9lc!쁘hx"%wxZ$G6ɾ0<`KOk:g5A_.%SQɏlQ[:t( Лd̤Սڂʳ.*^W сoGjI0 ݢ5:3kʤޓd /Zn/V ?WlKtPQ*-C] M0n] vb8ٷZjr3h$cwmWk(ظj43b2>C Q1tifF^oX8[qc`nn6d3J<#?5]R?g,vv1M+^ҫ+,vziDߝԹ9\&Ӟ=yPK fa{[[mNh7ݽ-;֖ux4c1:y¼i/ߠ-OYl{.s8kqng~#D25MwM ]uTbwfa _<"x6,' HKG@T/ Xu_B=E/soPp-{_zdY}0yhǫ_ a~]XO{͇-DgIBHSZ'ߗO*#ӋW}_)0K}[B-<ǻ;CFoH6B5S5v-X"^.l1Z8YɅ=fx8>B'K`w-UT gAS?U!W63WS\k="PzR7G%* aY9?̵kUKsuRtX~SSH[Uعެ?>\m_:~+#*A_WW*h bxgy~r{md;?@ 8v~y5RQ"7!D?t>TpW]Ϳ¯"j5?3$\&#qTzjd8]5^W ʕ:{Mm;Xd=45X'ѲXչwjczҀ`(# hBϝ;=4L)s[hqRgHk8=\d(ٚRISB( bu=s6N}V_"P5|^(wUA7rm^цv/9o2z+1{_-@SN8>_]@NV@230g.SX!="97~iJ*F4#ÿ8#0ᾑY73k;|[2d9QT6@}BDz*%Uغذ^\*S->ݔ3 EArw[&sߊHQNr7B#WWU*:z^9N͏ }~+&^Jw]!^A^7&#LEozyId5_N ;cno^ y|'3H ߅'ھxrafp‹<ydzz*v ]' H͊>_㞍6c.fMdюDi6(~9;u$Je*7)7(/3q;jupO6/mWQQK=lO͇r)lLvSa:/<{f;!'eD8w2Vb*z~Zt[?i7HoL?߂JH7rhSf9}^wpy{FS4bX KdJfb4PݾY1 b˺og wg}D;s,*|a\)3~c vݣ@3s}䕹*v B`д[ R<<ǟET9<"{{Z-8]eLs:Üh)UҫR|M*ʒvբ3/# : 90{zYpߧYQ[%WQrMGIL>A쯐g8yOS}Hk21:?IU|j=~jArLr'ryaQ'שJS5ΘJr*K>C.3B r]=ި _3Z~Ͷ"32:eŹm2Z`)^Ԯ0zK&ZzqM*Զ`GߗzKTI. (S쟓G *63˝|Y;ۉ"l ͓e_QW(*%Rm RyŔ|Gu wdK,ϒw)AW$f*MJ*?ݕgyܷ'cKɫfϝY$x H>/_raD;9/{AݐǽG7j`3 >Dyő t;5i<<ܨBbd]*. {}͎dSe]\l]7(.Nur\[6W|v@;Fz.TT%倮MdHžjyʞ'Y5U!*wԓK'tXU/mu08ʼn sy_l+rt\T뙂4;1_͜N }Muo!8>>r4)A [BE=ξaxK<]N)(kww_BLasBUA{gC!\P3?.~Y=;)w3EÊV)TTʳ3ʧTt]V[RNJMw%g3gjxrA言Y/ST7gUOUF7BCLUŜCePhcoHby8Ѿ\p/ݭ X>Er<)/t|8 <~1'/y ߹Uo9?Tm#U/Ɂ2;pJcDҒ܂-omê<Hk,7]O`zwY9K'9GY_N8V`wpFP=++ޔɒ|r+?oA%F˳ ū{~2wIօe.߶UUu`t8{@ŽȏAW݁]Qxs %w;PzecwӫW/ŎI~ƤKuO"YHsvzSTPY/*_s|$&zr) 敕\Z\슞߮j, ķR&ojr\Z s\\ΎyBiJZU%^\e/=TPyx8U NG{ު^e*F@.C$n~gǃrd3zW)_xՊZ6K*^`ZP2kd ^2_Yw Vry/阉)4<>]<CK]ܿqS`Qvɖ `qvK6 >5l+,ofgFWٞKcHT-uϿZϿJN–\ oM7tN5S?{l^sx>Y)_Tp6Mxp *_Z0/);jPm-U?;@<_xڋ9믪 >|YIUM*y,&v>ͭCQe9J$ԀPs%պTU}QZ1i˃W^??o_UDqVIM~AlA{*:*U{o||'!>0J, _n$ η)="lڵoO_y뼛=X8Uyzb/a8RNYWoo6)O pzVĪ:v/[E9|7{"Yׇ/L2/,[1`d2yg=xVy'rx yIpL D 9$Fbd+e3k\u\ZG~Cp!ܧ2+l4{4WU*&d8[8FXŘܿ22}@]%3V^I*Fܿ.D&_Iu b8{[85[άf>s%Q{F_,R;-;*r=y_dh;z*;?82׾|sY@g{odtyeyڴ\Zk?ʚTk5tZ_5nM^^'*vS~I%;"k Q})'E YeWUѳ؂^r_MݽO/ R~oIh԰ [k@UdmSx,b%Ь=T:!ٷxs-5ǝH0EP˳o秊/0OCxm_] ̪ޔ+L=e7p) Yݕ6KA}bMWC|9szMZMNjV݈"WUңXr20r{kwX\; :O)D+TY6օRU}8xۃcHf<- g$ս?kCϯYO(_xs z&Az/M^}q{߅YoS/PCtm~Mr<{;u޻Y@޵rPN0ӟsUtvĿMgnu]Pq^]rm 8zy?!h18-<|1=;odU~bSaE)X-0 +k(6x<ㄗWJz8gS*QV~9#cU2o{(J.F׃_CF_>?^N5_O8Cvc,' $y4pυpf; \qvBԅ~$'\ ^*<Ք}9"qٴՕ.iOyo +wXr>!2R'/=>W3ŪfZW Bvw|w|)ZEj×VW*?_ա4rAe'NiҫW>CPnth3?͛W!3f,^;5h{雚,['@ 0Yj2orj;kyo^z]im6JHG_,t.H{<wQ]oC^\3oŏQȫQ%7 C)ルzr/:rzW3{6(*+u#pB*#}tǓ]VZq~o}o}u+izHNz iPEi4YgJ~8sY}Gdr!_W^kFv-/ og(~.C|>Lo̥j&1[n2hXWOhŨ1gm;BrHƿKoioz o1֏4f1WOj,' $Gw{U'N'_7WǰG#zF> 9K(;}bSnkbJFTnOW/Qn:ݬWLd/(yz63ӯE ~x~# ]yRrcog-V`q3?r{@d*z>O'fxjVZ2)}~f.K Sl[>N8eyVyz*XvYw(JUytzEҰ\U.erF ~ QQTv)it) rM ԜP.tO>$4, ?voP-FQ}~=jۑdj,Ur4gv{$ph'.!"4~`0bpiJ>gdKyzOſscg7]UМsW]&' O=FAx7ej VUҍ󧿼%颵SWe[h,W<|䡂?O;aW7p:Z(UPwvs 72_E XJ}/?< sA.H ˑce.[^å/TO%U;(zuUϗRV3ݾrz[ϏO?[o?8'̯I:fP9ߞoF\+9>#柯~Ybe?^b&jP{wKJ݆FaKrAS?ma=^z *3\>H:lsanvy.΋ z^AoGg57a섭]kY [~_՝pp/0-?:vޫ^xl75nf+gVx=vi*uz ,LK䓬y.}Flozuy)q:r2[cTd0ޠ2*-oڤȇe_<0#{]|x<;%"gHzcő*/L^uSXM67:=wGtjҢ|nN nZ`Ho#AEF =>wfGZXwvsN|&i59o9$ۺ%%OĖ1E2lʦB?n6EٙfcBP @PmZ77?=nVȍLt"z{2Z>ݺ,Ye[r8l+%h:ˤ|w3/5xyn-GHIDItPR tAG&,-Gjf="hSK~~ I1,N*\>8j;#|ϝ6gO1Ƴ$Gn \:ErO#Ngo3\iݠ"ݸ:iYTI_LԸ&\ ::@_t$2Hq` zFZ*L?M @Z*zb#HYW7Ĵ4aڕ~bexbҬi 헳 dd^lXlX;> 3~oQ>NNc8|\ɰQڲ-t}R4:ʄD+F= —~bu G&}`C>݌fw%{$v#[ !6ciβxs9mH k!z\Fb&7156p#i2|]LDX@QcybtÆK+: ,:oq&*@z?4 `̵Din.2YdGf'%jP$:fŚfRgƑyݤ7[rSDymY}pڞ WIxK;  R`r 7?VcPzF_k SG8n/WAM?C-e~4jP]x[)^b eV0 !Zj(T^Q V!nWrW%SjOԼrXG>N֢o'ٵ  Wcmt!H2耚gGGLʒE-fl4j؋(;#V{Ԅɺխ`φp"dv , &1URQL&o:ᜍ ^erŞ^BN4]ЬEȐ9`SѪV7M!; ̴?+OT!|/Kdij]!,'=2Äi6`%Ԏ45: ]Lh_Nuy1ÛTFyC:]mSy6&/7\%?j[z{d7UA" !O![H! Gk~Ғ)U-C0m F_Lh!nGXE#GₖE*ʗ{ʝ=mwpgnr~MU4n5fo4m:Q74J&PB`Opj5hA}V)],P;3TwpJ壍}%mOM 6sҴMu(%٬68R9sA˾5Ix=3FxG6E}k z/Tי?76jB&l:}p ^[m4(s5zaLk`69ۃ0TӼVqYbڕ  Pi"-)IHiTDYgbG< T݌1R}FF`g8.W9_vNG@PĀvoU]wrZ*;wHI70,ibʄ."o ~g\l0wc<~$haY<8m%Sݚ   o*옑\g6()ȓlr"U =0OHUW\&nQLXX;)>1j?KJ |)~(( X?:׾:z^̈́.jXRg$$\-urDӴIUGuē":7,xP<4hL"\PUn{0T H$:߼oSe~5jbƥ`t of[i56'Gu߀)3II2%=&sE{A6)8~w!+zvii- sxQ+\QTs_r_hmHcw"=ME5;=r/I _Fo~.TVRwrQVw>U&Ku)AFe PvV(V~uB 1[U>Yr;MәXK R]+݁U4D1jM 8̒ktlv ;Kf~\AŻ@ŠRS%LLK*2[qsɣ uʤ=HhHlQqsd֦~ebλݽw`sxbe:ȾS(ajDCM`j!G~OKp$L/1HOn6Sq[͍qWx.:T*s 4tHnwP]ǝ{{:wu~HTD ޱ0 s9| \w_2*W8FeCǍ`VWRG"\?pNג D9z,T"h} =_gJPMz 8?ڮLo6ɳw.N=݈"Jʛ(1F nn",Zе"5<:EӸAb0})IVOPj֩}Nd9U zEC?If!LNp]U:GNϹv _ELJK)"²TWOC]5tLڭ_쪳p#*7̛IN=ನ/mA^k-EA,$ݕ+yys4pG\ &<\I)S:)0va~V7.;sYnaގ=3{xG F@&) 1>_&:Gn.뗕 aI|ef{tݱz_̷$4i6IMa wm.؇#1)/5{!0ͦb;+)c^vur9VɊWjO[|μ$ށaz]v#<<ϵ^w0뵵'l3 62``$#P4PlcNO^oB)4mdǬ/B%w;;Bqǎڞ.:Iݸ9bdJ햝vv! L {L[)neʬ$}پ|/ |ϸh@: J $)g<)9z\wKsl딁`Ǽ,rq)!mG]N4~ ><v95k\k,`>MS)qLJY>䬕:@x}D:r>塒͇IiP\Uh=&ՂDL&+6@-uze 8Bi"}b?p΄nw8[$6v,oMGפ26 g7# :m P^y[?adMiS=ѥ׍O_ɞ1ȚreAFDxm!ݏݏn g s~џ+%3Y_birQI6--azPxuW"?on{]]֝() Zz% QamR 1xj|1v|ɀ:Jۚ)#6퐗[Ry5hse~,&O?ZӮ`o[̖baR(]v|%]'9"W<-Ğ.cݼ:l$ x=p|9BF" =;y,/~Mׂ#;rEٚs}שeA5-q)gݙRG,`"V=o9ƒ@F`0g(ͩ3lꝊ~;>D@> ۂKQtCŸy#LSXi] 8:qEpuwk۞?}IpVǺ%F*h9Nr(N]z$ Ȇ8s_|mYQ;T>畈!ʮ[cv%޿Ľ è>`tU%v 퉵Pr wXr7W뾣in2Q@=P[ܘF14o!BFl|WG`%Ot 6A=V bě5mFaެaB]^=ݸ/";T-ߝrnΪ{z{& I' ~yu1r^ޢ6@y?@Hn<7i133 C .3.T3^mu)0N@b q%p;K(h*R{j,iqU{GaDpȎG) vs|rPG v;E-c;@TT?Lyԇ@'nnl~18bUugxwfwgاhÇDF؟ 25m[Eju9,:8,B7D6:NGuK" k7Yw-v&Q[ 9FW=_/}UW.vzn3YA˓l1CbiF4}CA{XLstOperS}[[ XFJ%fi<+E}DgQ jx6e@@I-Y¼}Y{M5i$|oTO2XugfK>0s\ /$PIj43ӫ mC3"lz5l3@:g=)6 Omnqik`&/ t=K5/@yr^=O<뱓CWՌAim/eG:12'ȒRtAv-YsQmS!!tm߁sus:4rAhbg[z4t? ӻzΒrS/^&q$A4#sm\ {) xm< 2 G( 6`-D/Mâx>]2Lĝi~͐Ns|goזcx1QaWpIXIvD}.8s}d*)`&]xf#Lnkr%}vgOe{$F7qZcKVfecd1_3UgƔ{miG,_^$u`; VY0 rE6oV;EN _N380ۺ=cZ=p\o\\FfW(Ƈ6~]H>[|VnB2tl\u&Զȑ@} Ih=-ioc#M#*dy"xI/׷]Z[{^@uf]gC(ːFc&~ISݒ֧Ϸm1 +>N)vyKAùh= ݲܞ'eGXC']GA ϑ!S P~GY4LdȒ5žȍpp6f([[v qRZ;W6oݟu w UpL)=gߟ.)ÝJ:6kK$ʬ$WYٖnNpmCIQ}c-z(P"̑*.Ɨjm*Q :)vLNd'vmjuie`ePw: /pz6j4X-m6営䦀yʵJo?@Zr@[-ƍ}U"#_5 [klF)Wl_1V n_wQy~ ٕ)7(Pp&aWdwAAGD.ikehn%9LOi1oύ] 9ܫ|Tm6`It\|֥ 4B*l?aeee!VuR\BI%&}?ZN/p4؆6G7q6(=Ef]6*EQPbV&2}DVfNvlDUZq< !0XOįNG3eSjb4 W+5Mnn#r f N$)T߄i[;AMK.E1i/ŸE)hkTA:UpZ o0-O{3/ D<룿}"_\QzdX:P@DP^F LbmeB`(7|nBC.XGu纣Q0teJ*X"A0 <$iX)(5|*wG𾯈b v޾Klٳ1 d6Mv.ǭ>;̌ 3R?_0!R2:ǣ77{o}~W{ju>.Z#$ϷQ{G7G; A$0z$ѽC ҂x -7*L55 jS8왊݁z*'O %.Ph)'ZK튶`?!R$`BM z/hr(״H98΂[!`w( Q4(fedH_ك8Ֆfm(j`1W:\D\tvk) y#Kvc\#='XyέG+]_:OɆ}c+x >Nu:qݦ9K6ZRpoC=O٠6Exm쿛~>u^E{R˟UA7`Gµ=m3Qng="v\j±^;#ּuA͝c(}ѫ {RN;Cfu HMEMgE)tt7^(+d9<`liOnoXɶIM-q&">?0i_;puQ,Adщ Bo2xk+EY@XX")X yߏm i;=g%r2TN`s#=.T#[nl҅ٙ[->z4N]ڎ<2YLӆtNd/m܄B[?%P 7JJt+lf2F/aR i=N@ѶYwBHzQ2 BF"_M[ ]گNJ0 ~L_j+a@lh(^C~z (usq0."yTI%)Ƀ51y{N%}bu~}}̗o/MM&Do+( ~TXlJ&v;UPd13G|_TSS+zYMzmȇibt"NX7 r4yū)0&Rf?TtgA.OBղQura]J^C4k=  xR8򽂾P"ڄm%ߌ2 'MlLoO&O"g!s45[єD۟w:iD>"G,M=,=b77a=qgtϝԘIq<%01mHxp&P TjdJmQ"xe߇[< Bx5AC<OAW9|ω9nD냛 ?MS4ƏC-,J26å ϙ clXhUn?Ѥ$LGeYi ~ u 鲏s>"(^ u,Dy8N~ Dc˙>3݄T,w5/C~nL˲x,z,>C+Ԏ__C&$ϖ{P2_ֈS%Sp3wzZ/5SDI-hi:F|;fĖϒl&(5״?dFA_zZ!]nsbl M/ie|ϙ͒Ѷ+"'…'H;Pd/@.:$+m\EGwɸiyXLj:NAzR21E'U?5U慚$\~.+I4!J6[ )|ÏZ4#5{LUÇ\6i಄Cbe1t酼&jm t_Yaj{Kd_e׶jpPDQ^[ 7T ~3-I#`B|8>/?# 7heY^ 5&VW>n- g]%0ϯq1mRC,̠ NOK}|v K!) o;%;% kj%pw ZI=G ߟoTk-XH<'Sez'ҜƁ+HwQjRQ]L%$AɎW'"if oLGK#ۚ.ldlMᴟ)HρNft"?WCٵu< _e*UF CQMwl̊&>%a1ظO5Cۡ] *gp; 4>XMo j85\FH 6ucZy#QcON^t~T3D@9sI'" 6@cU0@ 쒢Ujr6h^ܐ[\TgldۡMO؄_j/F 6#]urrf RK抸Af \Ǘx l`_)rY$Cqhcn74=%aS]$>Y<88ϴѿPӜOUԻѩ@ ƑQ"yH`znEpA]SD "L_\vu[0` y O T_ Y0^u$Tz|v?wd(d1BYTVڵI.IZ6FS}O/`vk'T^$՜o蓨sz2Vx/%^rbVvbС2CV =0qaUN󴒋S}-Mf JX9.Va!_w" <&_]I0dټռbΦNaVzBPp!O§p9|`ԮO"ϺsłqX}^V;a*[[\P\d\e^Qwa.!_\WfVquwUjqcCxL>vFAwg]dã}oFXM 26pj3RSRMTPZ棧 <ʯ8BDK74{pgNK@-N2 .MImGe[ڼ؀7 , Y'=ۭԿVY؋?d3VU;SZPxpefi&m\Yc&c3rw R3[s4݌V>p>&ox;6mVĹ"rBbHjAr:rIMWKjq%u4~;]Z]2_`#W4AL*'G-46-uBXcT8ܭ<$],H>7ovhelrI/ᬞp~u ӑ':#t'1 #Snt2LADMsڂ\UbzE]ꌃܰVhY_,t!@F&wEAcE/#8DD|@?~= zF-ߋ7AlܖML+?@R:-!y/CerWGSE\*75=|?daYQɗ m!ԨOYq¨3eO(:R ~J}@$uPj*w.C{PjxL4}sN uoow{/}9k<ךI=Lnݛjz]#*ګ`8uξFPA-[`P=[PմEZ\=dUTMkC"-ɑuAVd1ldƟ _EY)\Jѵ7bY!x2;@g/nZ^ ޞz6,Z${ѹ9}+aOMessxmh>\k0Zz#.FH^Z͸EX[3ʴ /5XYQjn@0k.,I*K9IY0te{knK%i¦c*hRFd23ؘWtOYҿmLm/jy+ym3k#OnDYk k4pi4_Q@gj6JỈĘ!nވ"Ҭ[Nafㄳ{0-ѷ),_"{tޛ:WyUm)=M7rP&H,jMgseߛB؋/S̫]4qgo~hO~ ";vj#o]U(涝f^8?`ya+27VY X^Wvq}o2V =|YZD$/ٰ6 *)5/w ٛ{EAZj1xjszgύ!땒~#O . v.ʆ^a'j]Y*/A8}EM _Ѡ&7˽11I鏽1O4G6"N9KGD"AՖ& gʙi"'M!ƌ$ByoE֒^ݲ-vsyr8/d/q?ͼ3+v4H-{I ");ɳ};YzNd{p,ryxnӋw5 !N|E:5s]0o0qf9Ϲs8/> Z.~k.fQe:M(.i}A^切XhfkV,w0`L^P4VptEݵ"uH4k.R{ICu!#dhCxr;BgG9P)eGYYShrt ^|\$DWC?:` ТJ2˜!vk[zЖ"Gh!G-X̅<q> 2MhzT|+NJ9)í7QI-\ul]shA;} qې55-QNxET*c4PpcyPAvOw8_&2;`{_qηTv`td~l%, գ{ gjriפsn{/v!|Vb\)hVsCzpE;.f_ݐyضd" ͟ {ot¥iBEhLf3Zn}ΤS8Gː+FmyPmD0rش\av+VGjn''HA☎O1-qN0A%i FVё1~Xxtt{ m_"5>z8nO_g8*l; thx0>977>UL~ eFɍG 傥Sl,\BF_u~:Qm|T߸+ P X;ФxL 寁/V|đμۀ GԢe,XkߥWe9E!bijP6.\tXF-N^J62tǠE~H7(Ư90 ķk`?ҍUDwqEB 66K%_P܎귳v3 Q67U[EW.w%ca-Mr3~E \s19OefÁ4FÇwwFeʆPm꟎:*}(brril2q/mQ6~3P|(^t : "NBiJ`B}l-em,SEc,b+&Z%>b!a˫_ZWVW8AhD:V)dE0ɸ\%ՋZ҉)]>6U)#D_Q.eNTq pj'ESLd8ꤋ/@DCUjϯ-Te|RDNF{5JZ#?Dpv%)tQheo.0[o?A8~n@$: iAtlҏ/J2QW]q;DShP\z.F(R]|aTE|hR`?WjHZ~pxpTG+s.hIB' ?HZ\FpDt<'g6$\Rk-hBxЀ:ӻהZƌ/_Wׇ;{7{o}+ZMl'ć>48ߨϥ2BXdz{pYLX#>6/]hx]gܼ@$JInd,a޹Po8V-Bl)k=&kp& X|=l1ўLgel;ۂ}mSxshEp' L.e}]!V51|Ǯ[tA.svQ<8f1Zv_sx2P\ F6hm QLG㦬L%ٸT&00~8@c\u:]\vC5UkJt%#yx>W6,s;K7R=aĄ“(J#mQE+uJ_eB~y7Ɖr0i~_\KkQYlDtE%h 6UՄ"I]DL>oGZ} 2TR"ɣ\m5au v<{GѶOORL_&sGA˄*(;a(^c1GUc-C>BŠ͖0:V:c S _AٷLDy "ir`J^ét);!W7!n=VK\PܻdGZce'!ܞ'foa'u_E٬+ n ~ȱ'ij;55H3xQԠhz(x"j̕^|fiPEp)bVl2ܛԡQ77}+_ϵMŘn}:UGw8_G Lbee~MI"&ۊZ+bʼ]unB4,ֵi_mGhBZ>I_#lу~zFhMflbjK %%6BZ4}e:OVb4yo \cP@aG%s5ɼߒ3 JnXvZzR9l7ї_£;&Sߍ qrSFPՍu>tyW*N)xt2q!eg|>G<}F yVS3xak9lЬE/10 [J*˙辱O=m딿m V9 |j]FZRG 9LPB]B `Fl128# w,[,td \BQyvr+';l|`GKN}hIA?fuIc )J5F~U(9:ND]z%ԳZkv\D1*`̊/ oDJ%ʿ/E-, ڮz=>߸@xu4yӝ|V~OZ^>[gݻÿmy3Txe\ q3$GG 7TSKwh;/MBJ̍ɴZ*pslVg;]7vl Ӗix*q履FT[\DNcӻ ݤ6L[i1lII t*A Pi|Âɓp?pKk>pF"72Aa!H9MK&F`5kᴟ~3>@*v8`hGvWpDecG,ގ[TRer8*H0{P %Г-q?xؚPrBOGUSW g{1nG(cC(O (5%UmGմTabSX֘Iw~8=P=!Z~}(+zrXͰ:MTGy6"oEc۳~[Yll W0].~A=AN'S^ƓC7YSF4(fQ("BKpzP>@ .ocF&^0]\tT6R.Ek}M_._Nڣi=򗭀[V3VIeeu-Mb[W{2nG΍}9*z3 RYcu>ndæ q-" 8si۝v˯. (A29vN06?7Kr7>sXmDN0FWܟ|4EHT'M/h[xu *xuzF>b9|i\9N'?g4pS<:k)4#]**Wˆqô' OԀƴ|'$EZ4Y/k" 'jFksuDIf4Y!o᠔>5I>,Rg>aX8Tj3Mgmdv.oي[3.'cd}=z# 3@Qm t`>j'1 ď~- uY 񑊡dFkHނ_}`N͗/!q{$;U7Gcͦpd*FM3}V o>sxsI1ufOO%. *zAbp{1 =~Twq&5"B 2)W6XE($FZ@.j ; !^#;4^2aEDJQ!h=P8Љ*cT[?/ W A%|$;!:(oNP7xWZYY{ֱ^2o0i[1tgmMmv#D-!=l-ˆgO#C[0{w^op~I.ŕ .'ia1@SpIo=E T)ܑ 2?.Dp-"Y1i獻u1MZ~t}/v) ѵ%>1r?dsK9zYvWf.A@!e"KcbKj.lª!O8qe#c7#<&BJDZ (~GK3gl:sݕ%\*OБ-7[Ƕ^9]~TBw3v2~-aR3im 8+R -ױ\eR/5 @Rpӽ!Y*" U{ьQ^?͌7 (JcO3Y/> y0' px;;Ma V0B M-[ j-j?3t+notu[7uN/pg*Ij4j-6j-N[lqaϭ֠[E^ͮ$O g[-k˰QZ8g`[vC5~:޶F"CDܶGft9`o\&` ٌ{ښ#*!XJv='5X溭nq%"ZnSb~e׫1!NXbF[deȔjppVA`Tm_ ʀ<`b;8I 5_M*.2&ou=ΛݽBzru@oI/%e67l$&uXVI!Qi/FPZ nO% 1 LbDpCg ilJg&G~xuj]jއXniyY^\!)HExyS]j2r <U]`'x+Uh\WTqhϯ- JFHЛP`O5p MGxmukv{AzNN/uVSXOFP7-qmpxmgWG5]վyǷx)nk00W@Sl= zjv2wɿr_W (-AO+ӰU;) |{땪{du8Vb?]Q@R}jwWUvt9M/v? -f"ѵU^3vœ'+սBU+XXy|{ V#^n VJvh(v?Z;@TBu/ǃLA$\,$a"|f1J{"Nfvw#:^IwfcY{C_[mO͋#PUh6X_03.jn/:in!oM5XR⩸l]d[\4Ң?l_xgJς:o|g `IqI1%ޏw8 6{v6ЂfHȴdsȢ֏m;@tg1E,яN)nl]`'aSbGa$J ގClW^iۢstD-!boH2mkj6b!j't 4ҟZګFIJBPc%3#oBP<|`1¡t♡Q&{rLUKl]pbVCSiOʈ^im;nr?.uv%ީ֯80SgB8 ÀK)ôtVYt3h@* wo5rIDKq؜,҃D?Ϗm]b /24C$ױ|AA,YGjU ڼ }.p[wDTϸ;3%Fv.fM>kC!]+/ػf2yc,lIܹQ)J,LQ Oʞk-]W $ͤ:&a@tH(\L_ n-A))1-$Jzɭ)ZL9}k DOFDKL4jDS@?8%@.3O"VJEa`6}tǵ;4_xXZK}bו)Ɣ?eHXp]Z8p$b@_Ǔk΄w-xd&&4ń?T-wjQ@88?7qlr, -qb%+' g[y+L6\Ѵ7 o$H{lO9NOm怨ȿ$C:o(bW&pQx:uYPOOb\fNhXT?4=AWm}p',9D ԥGm22Ͷ2 $Mrm>ʼ6&E.\A^g9u}¦p *kU4PFbhȔ=g٭ݖT!U(aCA5&hsgRNZ~dX"@մM h+w<%T@1{Jc)͢y#L dxN ^Ve\ lXdFQj"2͢0+\(;%!\lk!^:I!8Ʋs+aHuzPc[jOڝj`N(*e~LlGNF0Iux,0sGl ?L]2J))G>k;`vtui~Ƿ oPj[46k_,yP':]*?VȧM\]Л__ߣtg&g)˩^&eN}\ ׍6RfW@Ou$ )i^S-g\n`%NivoCm:!Qeq.㇣aH-S.N`2rͷc!eH\jZrz8Y0`l92 "*$觊M֧Œ(|&7k =uGU?M"t4/_f՚aRTaQU>\MZ@2h%I"*k,9Vm'Hif|':j8fHiG|Vp `0LOO{.=)-v HO0 &P5lU771La4sD;jZ;C?OJ~ i 2658Ju'kHH]P ?=5 ? Ȇ+22@-%T֊{{fW*9Y0 _9*S }h%'tλ~rr nvӰP-X噂-UT}%g뛍l>yO5aR^(ɕfU=1T+kMBipYT 5GD2.g)!6j =fQ[:8g>PK= =_TGqL\K Dz-M@98:Ǡn:<UC`2}!HSO%?RUlTT> Ajfh\nnU<׏D. q!۷mf~t:[Q$3#^qFJ0A9,q 7C<}t8c 3a1p34pД1/g 4bingxɯNl83N4rsC"IU~es;%ՉU^&r$"TSst7^`[]5T,.DM.@ j ߆U@j(椚}5[z. `XA9E]۰W 0[rӰPRk w =%ZG8eB}p`ק QP\ymO&k(PQE7\BJބ:6Ik@?t6 p\ 1I5{m+=x숕ƅcXf@\<0O;dFZ<|( <iMl*I>09u9z|c6gWL'.Y,u>|{:HrJ8a]v GSlvT|ѥbE|!MUTTAk5 b"{yhlfJ'B:3'`%ҁ܋-r-^aEkp߀Ж^yj[IAńR*ў'jlsmM%s=VP#]YוbІh݉gGĦ&Юu'5Ut+V-Jw +I5g(Y a,紐KIB>w//'u2)^'}nN>^IߘSrH4B0Fwj$AT@*Nn387D #<8-s*t#9gh?8 S@O^C[fXѢmS zb4Kh5ZzX`[P62Zc`jSטOG&]BD:JFWSmgL]Le(rI\M\j0$7z5M[XCQG:̓h6tr1}O2NfwHF6c73^e|:-́B".Ռ`!AT}ǁ'wffz v퐞ҺٰNzN'^ء툷H-jd 5upT݃[+m=\pMMd]ם貟gv+_3 ͤsX2WmiY~R+{+LO] v {ji&Z2܉^,vss9^LFU>rUGj-ʌl#&ځ!v׶8SټRm?Çu !Xvsc{= e^{?Ze51;,`yuFYkWj z5X:Z*Er< V16Zs&kf$nmL.۽Vh a>,5[[e3`mh< `\ul2})D U¯S93Ò0zP{2ۅ5sx&|DC1WF%HFɅ5jЂN̲0PG oO`RX[gtb್s>xꐟ^!MSPq%e/j6xGIrG"H#jY:eks/Ґj%\Ǫ)}1F”#cJXUڀtVc%MGk;R8u^ ͂(1_OkoXJPqhkGes 5-Pl\4exPd!6&[Sn2)#l-obdݯ$wu0p&;T+\G"HQ"&+V<2W;eFV%C%2v*hgU*ZNo"U; ԺM!4!APG;w{/}_eAzP•6jVU oQbH||G?ܔI Y{2%^rt)xxb4jH'2cxc; ^| a2/!Cj2EN,tOIA=;k ݰz<8Ԓ"-ErI{S𦰛 2+A!J pɛ?$b"ڴGnݥ%R9CfP/ f*=E hP˃#ڎv\'j_\j<£tOis-Ƃ_2[Fwـ)n!oJ%S-0 ")*\W$E~j Ã1gòjz,_ ƅWjD:P]{ !/Fq 4lJ*cwl}gtx  ݎ)huX-1$t~ u q6ApL|m:NaĥΧn'H? 7H3P a"Z5vJ[ע5F5@T|Gkkpvjpp"% |5?<XjTg Tg^!E*[ E -65&6)D98x7b981w84epk3PCA`sh-1(]/7O_m-t+"Up%co1VrlŖГ^:ޥ֍dmٽ/$KֹȰ^ ?R4IYpZĉLb􇧃^kraے/,|T R zޏb`+R̮51}}&} GGnE67&?{F$ÿ {ERS-̃9l1m!Pc!1U%cؿ+Ϫ힝}o#2322"222rk~H}zUVo{y: Мes 8ú7Apnä\Ln5㽊wd̲Ho Ug1y _6G`䎜u<to-LO9Vu>\-i r0Srj8%˹7@U ͣ~=beVԏfԯNNJ1hMqԓ 0&gԅ0tCNbQZwO0K6汍L "D0df*|U" ?;K~YLʀtrzlRUerk\1ln.S[׹zG% Q28Ҙ"N¡@#\^.d K2ѻZ}Iυױgu-LKcqC]zLS0z+jy `594AneSŒڈ5>ߗY{ގPا_z1Iӭ7*'gctpg/pbJHޫ7 Vր qϊ9a` +29Li-_8N6Kl٠ ('^rN2h7WyU%~?KfO/]OhY=7ub0:× eJ kU5?wwUirgzz:#o*7?.?wCVYc_ڷh=p'<w{P$e#אH;[(x f]ұELAIVF|Wh*:5$UqA%j-PN3`Fr K>kIx%Ö*/n:#H{Lik=Y?G;J 'GixguPmȗKeRNf{\V!%'PYgՃTAkQ7&m}0GPjv>Ji3+jH!1i+-3ᓃ ;zͺYQɲbZ1'}~nXxbjV!S~SњrqZ'PIGYIaAyMTCY%3dزՍQό lpzsӽ>ŷd(+Xcz7ȄҨCcHPvq=0hߴ<"B c eB([,N:>׸wTJ_{0w6.r6^fلpg\T-6X(Q|yD}m%:CZ1:ʡ3Vʽ4m^a+S*1B+d"e*2 ӧv1*QctBq,)q |hىw#˧=/zEH!i룛(a_JT'I=ȢoфL9v 5m$0Z r[=Pƪ-$?GD=ai-'uJp1J}̻Yu ݨ-HEC-,7W2*3K+K譤3%XŅ߷5 ۻ*wfFT{d00'bY5sG+G[6\Jl_0ZވOPuEbX +EKN "ei}B= *ùV+ϒf鷍 kA]Qj:L2/GAm oG㌮x'hoSfMr۵?I3- `'\qNxseu&-0},gyx8R9%MӬFKjxan&Fozh)gTQmjŨRX&xQuUj8Z>@-)Sr<`Vf[Sg@Gx aT$ uJmh#t-o,6G׀M$lv- Zw=6ef).QG+`[a:g_=R|R j pTLO}N@ NE?ϟL]ݹ3ײ2K1J wP#-18wKbӰRT'Rnජr Ywe-6K{~Nm&WƼIc<M:2&'?OU=6S>AFI ٰr*JveZ&ۇݍuK?Gs˴@ESuq)FYdS]ob.w%Ǘc+Orɩj2m3x/j(}3C:[j j-\`E,EhcC.NG,KLOM; ޖ\RN5)RvĞjR}]1…T,A *dx@Ǧ\ƒ9Mk@it6PW^[ZӗvÊ mğF,/yWAZ&9*ۘ*J4+zeF~U̾$:Nf|MU{/>$I)]E] 4f&V?mCgT`{S#;cII?=+W!A5 >IayFM ܰL>n̢rL$F}LK T16h0h\Pe|H萻NRJd5n9K@*\*qh0k تMbCPVA ]yx/.-  o~[}ڿ鳋  ˄ }Y\\o_^M94/>o??S|̊YKW ‡[eTo >;i^g6No-o4\{r=H=TVzc+ ڨ)X5n5޴]Kk>ǵA4f[`ٳsFo) .u&S)*%8/'6lwEV>1Z%}gMTnT0 &<Fa>^>0"M5DA//./[yHlEP]kz FgqR$eb]NAM@|lb\k8AoOI~|#gleT&^6y~~୴FųٗjP&j@Ǜ >K>-BiD%+,(sb<^]yvKt$ֱq4\-\ |Zn;5O+ gdW4)mGKTf[NqpGADϳ! IOoP=>8fn$Q# ~!,M(9[.fNF&$ : ѵԶ'P2CĝX2m~U֯jW,'M,'Bka |x`CO!lmx˛뮉_u+c cÆ9q(QIijDL|Zq gceGYE9a; F~1Q~G%hR?m Bi2J6\VHn"Kzѐ։Abq>:|tV{b2l M 3y@ݔpb BuK2%5T3P { [OO띇N^L{dd2t)KZ;CR~8>#"!D-6ƆXWOɩ~\̯l1e]0_v,(kh*-'P1Ўv۔Al-~d%с_7!րmځ %=ZzS`&Y*'/)N=*'ulQ? l5ܪ IKT?@ޞ).l^c#Huokgmv 7XZ\\ I յ:l<!ȭ֯/_QqJ_7;gBtxK_?JSZ0[IDJt(kGow{rE*|km=vpv Py n0hPG66ڇ=x#F[NP_eDJ#Wj`swcrXa܆}jooJAr;>?G&ZVھ/75.R5Ov纹Lj3q8/QA%ߛ x`%͑ŇɈZ,oid]o%@.g=Y;NIj| ֝*U)&dVjV,VP7sQN}‡V!>X9#8H\hH7$Aդ9;yUEV%qdرv `0A!?)cbW1K8C&.=s(Q ЎC&I-C7lvKB` f%MCBea)PȰbsVI1rt*]gCzDMϽHUY7aa8n):ؼ+2{RW:6ea4r($@ 'SPTӉ7 aQպ!w0A). *xƞw4)x"yxHnd6 E[jtK5sN6+V2ú!c͵9qdP͉|bw p S:T<8oF]>Ĉ]dscƉÝx(ckIrFc{hOGIV3$1ܜ_>m WqRNkrj&;g0OԽ'ꯛBG(b_h#^H@<îѕ6-:-W"݈]ݢe?kִ6>FŘoR=]QCaYΌ2זm[w ڱǷTv}3В*#r#SmE8)JV7o 9)NkXĖ ~4Ù^$(oB:CU+fSTuWL 2#A)ˣAYΨG ߨQ*r1diU'B\;p#O,w@<:Sjs-\(DqE*e[f W*vsE{QPpb 5EY.Bp[-u⎸,FJ+˸ЎTvJ9^uVJXXCy3"ZF&P-3i[r E y)_Zt.۵JSmT>w7mv?%삌܁Jxu}Ƃ?1rͻ%?TcnꇝDfI 2GR(1 Oc\"-D-ș<]U0S@+jZ\*i:BQSdW70v,ab1rU?%ل)Hхo:Ş{&2;#*WY&*hT')v&Y­MϮoIGt̅U嫢S>KȬC5II^TXZ8ZzZ:+\tY@ 7x))çQ@wDu)?RɸUc2ዞ/hUEK@|_/VldaB>Y7e1cMSReKo`8Q}Χ`;Fq -q v[kݭwÝurGWף,92N].d_EJRLg|AAE7R["`*Q<ƪhѳY<H 6>>JێDe0jY;NmǏh ֹ\BC;a: ˈIq{SZR۶QǪ !Z*YDgV™,XSkF0L(845iqŻzqaа_tI[B>nUOB nʪ)9ƃw ydC^8'D jq*81i53G~ Lj."GF$9J ^K>\cRXeh0J{񕜟[ r:Jw`vxh9Tz9ۃ8M),IS0QQCRS28l?H}3KF\?rQM˿x201]L5K_xz\,߈[=YuĴх$SqǯVekI4m| |1( ,!*ni3\IkN7Fd"URJ ^I$[QI?5I3{pdu*^Ìz`En7겘j5~fx m Lނ>>]=P_7/۟?ooo}gc>0wM 4 +kSE?F(5 B`c³<6_H 0C@oWTQ:^æM*zXzWS|0&@ZB/Fd؉n_X@CGQ' zTLU7N^7,`V2,_eS:0 KZ?nC"s |PPqb2. o0A&UT[xH1QGF42 t ǝ(>|πf 2(v ػ#IƟ"g\T-ؒ*:{, ?( ECd RDIO_go曲z5l>__CjhוK - >O %R ٸS uzsoS)u/m2=̹i3_)P:tV^3qʞMEu)|\Y+D.V*y;Wr f}!_)}[եbGǻ[r}n^(Agݱ3YӺ&UCtTk-}Iv fmz3‹p)@(ĸ3;]P]]р2p,"Xd'U6e#,Q8 Ϳ:!e6ȃb7 i'6>kyVmsa ''ى.z0W@PBOU@ k%F-:Z fDWc2>/}*nW >bi)h\dwı g0dyrֺ L;-BUΪ,Y|)KSb%(ݧ&Æ3* i* p}A+VpٺA.4wp5H`v zBĠݬ$Lnk $QB]Z[GS Ȏ  RhQ qqw"X,Yտ40ֿ8gi1Q'3]#SFɪ;1->;JQ林3u̩_HSO`TƩ6J{ԙB:l0|c|1 6Q gUe|٪2:&>+Wog˶t!scVОiAľtOfbTWq6 q>n" AR.O0l;NG?qKhU[CK 2..؆$%ə/ j%Xj4/Gn^nN|(`_EW2ǬͯDh(wF" 4t_jP`":دZFqńEq3J?L\h6d3(A^UKA2$1;7VQŤ"qЀ5O 7ޯ"+SWtΑEΒMz~_C^[\d<!̹1وT-"X#FiJ(*\z+孔ҳ"Ɠ?VV *km@Ř[\Ӕ(22]ѵZVjYSR >e€V6*jpMoG|` ZOmUvZp ȹ_,~|q<#W[wRk1bޭk-\룡<e2"8cWA-_~^jq=yzc*]XDN:xqo˥ͣDx]v8җkEѷ"Jʻ&(O BNӋ}:WQjCdD!jyKhPx1.^:ywڋť߱|祰/_ UD/w߫¡.S룷6 )&M Cl&P.a)FVl쳇>:H:Άe1³XS<EI#襇7e֌[-A0+Qc&зrf7n za peO3g{//ŷ ?69?YiJ(HXӽ pNah&·|AJTpwl—Kڃ:I VU@OA{AR) S}+m&E,Q^ӌ"w ivn+`Гxss߀=V8J^qpwɻ ᐭF4p!oDWotlZDk"=G^y,-ղ=QߪBZ"\+|HΚv7߭gM?rgvnN4dAEe-bXbJ^mrSI6LvB9%Y$Šf)Ж\@,> & SiVdcC[z~yO2I3EŊK|&@â\y΢>g6ry'npU5D)&$+AXK3^cIkK7>?,7 ßTJᇾ~h`8鳷z_&^֟y!0M-noou RᛌNyb G*[ o[+?ޏCqNnc !mZ,tnu IBo #B5e1jHY tCੀ!6\=woXL)kk:^r/Dv ȡnyͩLd۸uVqm4γ%PuT{SÛ,FTuTS鞵j%f-ް|w7vL.KVSIejT Mkpҩb| [ } 8[ FoBW[Y`=eG@f#Z1|NRt#]nj2hzUˣ9zQX< =nIa!Kճ̦W8O{| aYP׈^ NIGAxuS5(Sxv.r"*/.Vd+)<ެ'Sg tO+Z_B Ut]]X!W VI°TC #TduR:SR\ִ9z8ĨF4a`͎wg Aa÷~B;jÒ^^1|A9#pMVDt\#LIkYPoO39{~NM=5R[xVu׉ov%m I//vjH|U*{ȍdEq0Pأ;.Vʝ/dd/oa &sZt;{쀍TltЬNǀx0FkfeSz%E{/ [;%"l9KҤEPYcZ+U]ſodҽ9sr>a_nzo LNTΕ8Ha`+(/uRZx8K'UDaQ7,*pJRPTL^~&7>h Qg5Wy)Fd,L} ?rȍ = Z  րh1 u$&cBEx!@I62r)+O9_8+949 @ G*L#,rr1_b@ JP;AI'u[} ? *#E;8 m3@)a XsX]H9UzC->la4 t2Bbm((ĝΒߩWYj'vuX`Dy*%'/}4Xse΃N2fr?dhS錳ZB 0۽}ƺKP9 [2y ĵZ c;\$UIZVzu`2 G| 'ϣR (w8^QFaLg/炜Rkd" S.lXMb/ޏ`J9`&BqmP(zx`:&Y:x9 LWt=}lCLĺoz /b}Sm}b6zz)wDxF nt:MB٢Ǔ]8EAaWUbvpF7#o;~P2(4;R *^ΌzЛm!X:~z*p &5ðS HWz˭ݨWZmj5F$$[[n>#:8Eiqk](K81VW_mMĆs~ѵQo$FL^kƬmt NJ0^@,d 0T$z :Ș_ )̼U;&`Av=G oF 6ߢyl ڰx~fs@& e2 [PQ_./ƹt3'ո{͵]k?TXd=j$?06AÊa3/S>g"^t[;G9Ƙ#qVyq? !P`2MNאfR\o ӾEj ݑ '$ #҅X]#+v8"jZGYP38v7I]@1OE3H1VO_C]%Jm'(Do9#pxe0QFv)l7f)e3ف,ÎnP1'C;֮S|T3Q<3W,ƒUkT¦](sY~uBm7 E:T{7=+T,U~R3qaP41iV)y;aw00wCwvu›a0S%,$;߄9rd!w;vm `V(hم-88J/(27PV6<aPm9}VA0~YInfbE,n  ?Ng;GS#L%̆0]zŠegzӱ)][/ECe m[LhUi\ZHd3:JxߢRR(5y)Ь_Bʲ))2-@(?4J*Cԥ᠄FGBsD+EgpFf|Z tA6Z m$!GC&!Gs9V_]%\㫖~E7pwFp|Fu\:]ss TKqn4kUו~ ܆E5܅r|ndZ@tTGZ.T'WpkɦJ^6`EY_͠J`M@2LʖԆkyuux"{fOiJj? hY. +ԟMx HP 0hMTUh+L$Ë['ӎc dB7֪7=/k&}}uJ)qZӹWa _]a|KEcE#XxWŨdjJȭj;txL>P ~B@b4 PՏxe驹җ4{Y'~0Kg5)& ܜ:70`)j]m~o=$E@(hgQ~ejEݾ59~_?3sSNU;J2Q5xהS*ZHa -. c#G\wՍ]UU\i4Dx{ >϶1? =xy?[<s=ʳ|| $+թ}L+j}uKo,";]52;P,yVҺ i'&TSJ$D e]}S]+@K`(T<.~SzV0K`o;x@E92l*%\ݽh}?Şcփg'ةt|gk7KJf~bIw: J 3l`b^.28ɴWyRfXEeo]V$s3]a&Ur ?5*2,McIbZʊ2H̓ZU\-O)<+(\XNx"ȨTG"f2, Au+`6!Slw.oTyxPbQ-Vr;Ӫ G6aLV !9 #]_;! RLFԦjul)gXTne e"rȌϭP~r5Fcv@ ^qj3ɮ2?.oND ߀bGz,6Azł~څ#Q8GzK';}@oߓJ w0P-]&/ Di/6 .aAB'JJ&wj>d8$J5u:BP79c;8 B" Xz}nQ?x \] kImc%!\0IGQZO:HVOZ0OFduvm4F),Ke 6Jdxa{7.Tktw?`.$6)97z ;70qCrV*7\VMRAXcaVWjNhvCPRHXz{o,. 3Qr%XWsҽ84g<*1OI&z4h,Zx!Y,eY>,`-e6ʹ \.ԀHð͇HK5pYd3[B,:0h۾#sU$1: )x&9bgR!2f"vp|::G< sS}sko[sL˓!}%F:BjZÒ,XMW 3P,@E7NT|G o+`ڪ:!9PcxTi# %us"]"#ɴ1gOi--$+{1Q|7QfGw{\];^l><:aoc-ooFYչK\k ƴ$y ),mI866~\\\x[|RhLw]SeQ3kJX˸I鬎sO=HѠo9@_Jl2_ָ$ȒC䤖z%9he`yVMòr0kiMw |Rwr!g,-sxq |~4Q0F HQPɐAkl: ,~s 2Vi\\)1wFY>ʥ8OE\ Y6sUѐ&KD"QOD:LhNGr+9[iف_DL5}J38RHK/^X354 d X+,pQ`Z @t`h6W"Psi  I x xq؂^Y~(j!б#<NpoP1pt w zxgxsK_~gMF b) GN.E'=߷I1|{ 1R PO}#<+7JX1q sKORG,[  (G :e|JKPdWUb6@6>Ё4u=ݯWoBCBZAt! 0,eX;f2j +;W@*1\7Vnk-<w f$ɚ b,eVhHz(b8@E'T\̦Oq@_`H+p&pI"Ps iŁ@L` 0 qY%eܔz>MF2jB M@^0VPC ],euzj oox? WKpY_nh&UhjVkVARU)Yh9֌I 3)J &%(]}gӢD@$(Fl$njYm7fwa.&-a3g"7nAP~=V"oB?;J4; L:anNlwNGzST~2K}HyIH%x|rpW~<4g*R1Vz'}őכTŢ|a8_QyQ!( ֥T6Aaݒٻ5_(mQ൤[|/FyDOhmh,x=ew8P||R%gsrRaLY{0z3Q1ZyvOG#+n.NC?U\nh?8pC7hgw;J@q\PR|^ M4CSPlOh>2SS7T>|qB6TpaCJ+Wm,W6L&M&tXgo&dd6*v"iĽa[~xV2Pm1 7Z'wl~Lz]! :>b3œd Ү_F: (l?Y$ow+MCݞ ۱^^j]3vVqnul~i2oP(tB |g caVr8RF鼔tRklm_6x-N5C%sZҦ' =hEFi}Ca(Z!DvZ%n55R 5h07۽qir GH0 $RYY1a"f\3^ҙ@ ͥj&Q6Aܫ'i[nW؈\$S}; }w5r. 3tAE`3G vkEͶlx;s2pn%L%ZCŌ ⼛h0b׊|,Ѳ{B*$/)Z1ꝺiq@vU+R6&3*TCkZZWѵPKD,#&+LaMD  G 7Cz *_^"RkϮo}.K\e&.ct h->H`AK1,O%{A=̽y^cD܊V]{[h!w=k%<@EU˱/`d(Q_J'D(h'لLMdEU\V%Va6#+(Ӷ;:BpmCOm=GxQW`8NBۙ"f:j$b3GIVru z8M[Vb}!nB(8eNDԍQt6h?DJ1X}E> vt< 0v1jxY!8b+)1ʲNPYˌ}({k \y7gx'xStSTN*a(iԮfoW>mIkρPj=O0ngA<|ܻ̒tQw`{`Pm7v6G ϟ/ڡ*txvVn~K[ W*7~EϫrgBn1F cy1QU7?Sf^=l6Sw\?l6[R֜gx79wh;EҖˋHuֲ(-Rŕ:,)>ꐱ4~Eƴm٦e]£*=f]z!Ja닛X Zr\RZm5H Q*eiX0v].e؆U,e' j#Y VKe_ 5϶׳2:me d2`&9U69Îd&96f̞5um`j( 28j*t|v@:GqgSԼAI)lKu2杄P՛g$vTǘ:oG2ao#gKqOBr8B„s;XS֔_%RQhn,hiNG"Ã-"v &؉v5Hl~faK!H Pw67sLs1 2CmBJL; x` `hֿ*;ĺJKSo6mSv P7hdX^)!=)L\BiFT6ehv]epӜ|6+5ƹԡ-?&`lv간KO=Z+kRUrJܫńce胂a@=1,ܾ^^QsS"[IV>fF+Ғ+DZbRa\mdƴHHo1g(,]Ė+YȽNZдd0R";NYBNaU O/=N[ǻG{ݵwݣжh=_a7v$r`@y ~)r;%.ɽ,EVyۡƴ}oY&%9ɇMU7ԁ<_@pa Zc1' j?}wddI +yk/"4߭s (+;L7F0a/7t n6/c3F߄`R7}Mbp(@G8v\ QӃiFbVQAo80OOڷNLe^1 6aL:װٜ*E]Ԁ,>+񦭲-z#ǦYޟfe.N#Tw 'x2j&X!dxFl_D@,rss}ƱqEj;b..Ğ jw3g#FD ˜;뤓7aiD!pm۷K4g 8Duuԉn2'Jҙ`ת! hP)ʦ|TWfSMvNNZk/[-<<C(LTAL2,fj ; [P,1;`,X^|b/,;;撓>p<CKcfEŘݞˎ sz0[oaeۜ}tnJNauMenPfQRӂ! 5n5 `i8x.X^}_r{3:Y~4?K8Z,X>`yIhIxKػ|bi/ͽxh&^%* v^7bs,P}'h5̇WK"~~PEsfl#q f׹I6?bBu! 0[ћ7o^*a˕ǧ Sѥe,U{R=_zz06b%0b8,Ab 8; IoM 0 ԝ.g$)FQ;)J]a-p^K/do`'maKD>d jmB"F4H} s8ӑB1򃞷`j*Pӈm5ߨ_h aehq~q_h~teNīQ;VAJ"/ W/{9~L_Cv܇GRF aFoU;B#

>Atzؼ_B CayxSJ}9H}vp#)K[l/] 9 6EA5\ 8q`wdCJ{37֎7-,l a`p{ozyx=܇&-P7֎wtT}am+`gS ynm{v?69"Xr@(~%)Ӆ6(;Yf'(ّ: +6Hå|uW\^yDmAsu7@$pi!ji|0.gxǓD2'$`mI5JknД Fζ- 6Nk/F &B _ԛÄEjR 0lGWӚ AZ7it X(aC~A?d{+I%.mVTkhaѺtA3J VƟäwpg<,r^HU4Vz8ePCA98#jL ~#E#Pm*i"uhI 2OfbQg'cඑν 9~U5&N -^s!M|zcwcY)QETSks 6x5NIP2KP,>}j#Bk&Kiwww/_3ЎQwDܰ^g2X$Wʤpi5ò@.dhEU&=͜!Žyf=FC39Hnk< |wiFnߵ2ryk?syĎs*1-"91Iٕ Ѣo*9@| m*c2ֽi'O42yhg{t4'1 d`N737P_D!VS6ɨ"^sNݼ*0o™]%rWДW Ew}!z 5f=-ZIBCy'XM/ɇ=tLe䎋nI;)I8Yd%)=z/L/55a]{+fJ0*ia4r(#%f-Ӧ`5l_6a>XSVĆ_ҙ͋>kS!j5%q5[Bqk ̱jlq\2s׋| mu}rjz7|0c7 C[b=&yhgcc<ɜhk@ݘi1:/G]¹)~rPve3^w|CBC p7?_?P>~>_ٛM˃yǒwDzx dy?l?P{H?^VɔHTX66uuѰν 5遖jB/, Xg,Q|S^t%ngź+tb1rĤH(@*&/Z}Z❻C% s?[z=zσEiېv.,GJ.vPx PWg*x.>_W/ Wå?-<q<\~*. 2ksF('b#6~?@b̑(Vm5n{4G$A -IPjIof)=Ɲ-YYYYYYYU>YV2 Afi9Tx5l6)|15>#eg%]:U_ÿ(BcZiȐ|[d{ښ4mQY:2r@"%Q܇NTcH;F2;ʱ l r.RguֆW:&)M ZPˤ6~bv_#`04(]V&>ǘww {GQ3q_ .2 ?EUp1kηh΄|%X.R. v==t59` 4\guKЪo"e^1L[L?who=|b}bМ<;vi}=JehFⱔJ r"Bz|]K Ėmg' nV{%Ns't nTӜF/89*U~Ł` ?k$f ɧ+rVOO2HNjӔ"FG)Y[E+NJ`:CX$t )ǂ}9N.-de,8ɸe:rg`=H_!uEA5t8J3`hʂ;T'pu T(1e{$N96!ks,xo\Ck)&L='TYxҎ^N v3u'[`d]Rina %r BN;< 4FLh|GEqȔ,PM)C | ffGg^P9L` ^YLCx2prC&t?$,#zixV9q9h\ˮ`s9E]\rV'f  {2Xȳ+^C+#f-mrjaO;CnSJyR<=ޭ>ξ~ UbVj]HswlqE$rE9Јwzt<ҕ!ltg.9/o]KhFh Pe΍I2`FG Hdk 3z/cRޒ\rD8P;h NyH𿔃 4^@ ?:T޵{eGM 9(p,Lۺj~ĝ~ONTmC&/\njR{F'/lD f{'Bs8O8b&58,L`畸6*N#qH?,ʰ"t_MP=E1X.O{BpL2}w Iћd`_nM #BG,lŪLKuCh"*3BhV(eb숢*GóOz #)FXm$ުVCcsSO’& Uɂ/[ G8Y\XY~Zys;"Os4c3]ٚ(H:w!PqoDxK)⦚jūʕɑER5AX31 M H ݣk56'R|)&#-5h )*QWv:OW;i51*:QneGى4:bN+|LCxp":bL7Z1須/OFWqDLz2\/Ⱥ#ӕ"?.TSk7iIt{PE^s)D@ M4VNG崫vNK紋]:Wޯ%2(n nνDKZ׮`d*7*Oy(J&?X/bg!#8+ff 3m}**pc|>^F,+"Uw 3QWkGQӚHH>Wbl\b`LҠ14)4Aw Shϒ >x YLXASvI?W08ޓ8-l]sʮRvݤKʾyNp>D, ^b@*k0bZ>1xk Dnۣv|-3?qr,ejnF)AuLwLRa O.^*-k6G?+vsZ:ɝL:I>5s}؛U*1K!a&0h7;Ppj#.uߣtPW3o/u,5r/(CSEJS>*}bڴ-)Ϸ@D]-dQn!<IZAa214T]+yܬυ5=o{pݺѱ,w?u_+/o~3s:e4QѪ RB)VDk#\7ny_p2PdDd!nӧ >4Ln6^؛cޛodlo#.Ғ% p|j5/}k}HzO r͇B%%؆~9u:~}Td-f怨Pf뻖nj z7KWqNVO%T$A?)b:L=` Uj4kʽ_jrj,YKIޓTd NwaC<}y·إ)ϩ')g>ByUإ92L̛s/<yb|d1B0OʔFWgiW8 iwMÕ8sݎiwwvx$~*ޟh^ax\դC{䤨#]4+5zփa8ïF?yo$cnj&!!ܭ`Hp!Gkg ZIi[26'>ꪑ.NLUU-9!vNU{@qLdHX׫23 w?M˜y01"Z:nye5([ZkF5tuaUV@8RT3,#Pq:&0kv=4g/*9`/>݅%$'w%x. 01C:bg!|ÃvÿW3qWʯl::wE_n{@i/57wtT y<g.Λ_a+<swM^kc>{+ܫWΛ`{S`]GVp/b<q!lЛ3\=L܆ӏ"`hhqY "&TYr}҄+L<zyK5X[*R+uKShH*(jFJCJ<_xGt2LRY#Ȉxc^#h:Z`^I۪?^q!өy([0SGr)/˵#o ?]reZRy:mzB%Q،TE?J ~jsbz=YT] } vd& %\ x]хYkcXyDtÁ]4Ay+#wf2KyPE@_'T[&F :]5Ƈ; Jm26md%h֣`Cv ͹BJS  QlleKw[Bj5RuL}褲 ?3k῎x J{/.P%,# X,0<>aep:++ڈ=(q{9Hs˦r&(છ`-^o2﹋Jg%ѳ#A4"# =Bvm+=Lk\zV*94΢"3]|dBpY g)K2^ćo/0Xr# aA2s(;H7qNRY 5;\>%&#~3=RhpL/X9 '];a * L׆/|Y+8^SW &J!mfPU~ˮ\ij :jKZD)zg$'HGXEZHKiYEڭM e|☽qMY$6?3P%O<5M_|L G||ټ05j}?amn|t׼c` U|vG%sk^"g/<%I؄_eVa L"(J$L\c-Xh2DD3U毶^ğU *&Cy2]d"LE.r«?D'|3ߨGV"}D8V |yFc&&&=tWꬎ7hedd$ 9D}!BL' QNz$g~Yi"3HVFByCmE" ,5bT =?+RtM>PQӳ ?gyQZۇk#H7FZ5҃j/KF "k"kRޥ[xJ..—,,)pQ_O`wwV8/s͕%P8[>t]|KÃf1Lo݈P+I c.W [O&\Umy(JE4ːif2t"LuM'չ'EWH# |/gX_f\*ʼ?SS:˂`$ Ԯu ;^K9A4Go/\.a \'%Eʰ.$ c&}9^u`Y%ESBy?Ğu ŏ?.3F nG? sף3dGf֋}8:=|oz2(HV/dv[ܦ9r>U'6d|nU?a!VH5:s0`j`ɘ/ |{ zX5:L]ݻ;ypq2g[FC쩃hs96af(hp@5mL]6a_4]{ktUb.[o;1g0<d. tvП|< [>H`isֲ?lyR|=jxٵ㳷c0rcO b[E\˳~REOC^a ^>W,9 22T1b U1 o!4HhFj+5%& $ryh %hd1Qb{|6BgFS-b\^WXt鄗U<%Wh|7L(qjת{{9^O|# sCwr~$i!*-_\z.*ꊘjRpiVwkk߷:ˇqZ7Yc^l4f0(o_3ŵ+:4SF$ ؇j= F>Y@hJ6*0|DIE/Wc"O j hV7+i#%@Mh>~Sv%S>%Ve*MrYt[32Fĉo'&ҬpJ؆&:Y N2 ^N8 -T"#4{p>P-.[iefq؋xY|]CkEqXK/"Ѯ]Vd0)P&r᳚`C͉&}aeDss!i番EBbVz{0/21V#8R]z{@ex\ӹ`T䜵J"agVs^jvC7O3E9 0jz#BQߦX {[4)ٵkiU:wݽ %6G^->==. iK3D2JcGN]n\>Lip+yF!id5¿ " c+jAUaxWEt/p3nDv{p.6gruy=-=8nRPrv!fX[^fGgG_![=E_&~CɫpDVK .O%Rz N肟=:oA|dnh5,z++#EMC Q 4f%v(dCуe@^HP1KTzUV~^v/T!݇Up:>8wE7ˑ5M=QVa9^QSF9~@Hk( =h! xA2aX=e2&j*[:e/z?㶗&TW95R8gN`zFAKrq2ͺQ+~rtp5{ v7ᙯv]C7k*@um\E&// fM5Ͱ% h<|ϥ.p-q7#kTKθuNߥ.ZE?W;7GttQ`#MoPH_\\N&q4O7lv"h/ņ"=uea^~*\kuyQ>&z$=Ϣ Gu%Mύ: =8= Ø"fyhX/;b3dNhXxN 1͏K(<❼zr+=2, BMjp++VI`@j"y ~yn>9P I7]9_x!C﨣y.vYI'3 Ne(i!g ty4Kg,dFԖy00QPyg7>Ύ(Q)#M(#4\n5H.Ə6M$\qeɭXf|z5A'#68i ذԅ(X Q]C~ ًKr(RG< 6MCr #W;%"t6U޶x50X+Bn+H 1S7'(*fyjpQsz @"M}k]5h:р1tAtX^%N}PȆ6=CE{E޾pg_u=9]1#h)x!?DZO_셳Y2+i+Vv=@9 $] # ]'[@,-sz;+{3LsswiKԻgKmڄ_abunyݪ{tM}H{ɏ8}uwﺻ]]U0KuCD=$/R7$ݥJb*gUԛ;q<{0~;\p6 m=Ӱ,v84zh}M}.mNe~.d|Do>dSd#T_rրC4?c~XTfw?'d<՞@*؞NŠvj c;n95rE-A{0PiJ2 Xo:ziP.2wn`/JOB-߅%mģF~|ՋG,9N;gixW*߹;gO6xӿ}| sJߟ40" V'4)5HW~͢4f艓R*wIp3]튡T =ċ"}"P<L~ h^h:y}]VB~A$r9<(WXfkpZ2y[$n ^%e%C:{(h)l&%ũ-&˧'%f'tVK,ߨð!uRJ,}jn1h$!ݤ$vv)|~X\0ۿⵂ@ ȈRxPsn׏w,щ"EǧA<-9 ҒO[T,YCK0 f`#Z !7t4BRB6=Äڊ'@%%z=!h!̶̆LXmVws5¨ ÓxCjk::d`T֪5=!zp>.)<{N><M0Ҕ٣ 5X߻jZ7*ebvnJR2 G@ai$j*3`&M&Y|OB}+,w]h(:Ln6i+ gL槁)u2>AgL8[-@뎄CR/)qLyk5+9N8'$K)9-LAQ+~ʮ<yAAy5+:mXSn,(>¿WM!"0k3 : r,lVb@}q."fʣXf3}q3k4ZPE^p &uB(r,\V/H:|TO)"~ R#7 uWM# )Eeؕ!PDoG^*I0{10 ZnTMԤr5C;K-(3z e|QnoAl(mhv$fY8LGaeSlڡy?54=CbB 3ZT*rU6̴8کfjڜ8Vu ^]:AGѐ.h6g7jDD$fڑEE+FZ8fxPT#Ď[&)hs;?RJW37wy 1S@c^2M-KA60Q**t2%ţdoլ`tXlzz0`sMlnzk%g ex%2jU۶Oa`$ 'hcEhA qnQ[՜e']591  9c|D-`]|J'NN/gԗ/xF۫fQ\0[O#x=alSq܍+FMtXb]ј:A͓i߅΢#$<6zr9="zBa`_oUÓqy-Y}t9)~4*~n܅z t;=vv#3lTD/EBsP'WsxJ NQUHe=&m)<(%^,S(Ğ21k@@K)$¨籈_) `PI2^}x|Jzul@}(jPlQ8^\xeSha;-]hDSL!󚕓-HVW򫿊8"OF'pM?hk!H\ EB  F oFjI6L@cܖAhv3X*pOo(i%=\r(-[ޢdHO]^+c V;:t5#Q`Cfغ᷎lK*Ⓞ,!E( 0d4kyI%QoNMQI*%E3QU"/tEa$e.Rf!AХ/UqcC{HrDDN(chPs;}\Nte`ɳ_=CE>mGKA9!MH2T:^{:5GJ-3&5*"eb{Bxe{XIR tD3*Tp*K xP cy,Kw N3+d=č/\ 0^J#̴o˷\%8;j?oh%i!Ob Ybob6~+[lOėT$hupQs GcX KXu0/SBELuhgxq}P;{ *_AwC],Jqr]4lH,F'4˛Tŭ=m`q3<)f0!9EeTY:+P]*&&žz;.H Ҧ8_yx1$wAAx&|y).ƫVvOM]}n?ݳx'* B<*Jo ?ckkLC8x 5\ڬYQ0E!QD39R=Bw:U ^mrF.kַΚcATQan%~Ǝ7oEܾOCb\GBN,s~9،l͋N*ΨHҺ j2Ĩ=0{'޾? n/óx-ZKL59Vިu4} 5ISDIi{$3kY܆7/].l tFݩZSxV|U ނTϯ7kub^ݬ6ZMEFVWkmUg~^oT5Z5Z[^nԦߩCPW=Vk[jZo(]׫wڍZQo3go5MV;UلT[զ{umBv\5XݫmE=j5km1PٮZ-@Ao&Z 4lNV[ A FkNUmժ&%Vk Z 6y*j{EL[MhTH(ۄQV;@Gy*6͆M;*f@+}$<@16^z]M@ HPk0u,C@D^۫ց9XhT[>ȷjryA;ZnfիwqdӺWozYG&u0t0pU>-ƲYC&mCkR -YUѦ_PE VuȇMMn{Nu`|d`' zii :~Z 5ۀ+  T@0n ȊTo*&ya(2> Ly= `Ud:&i;5`@Z-dR Pu&j&PFQktUi;MUoUcS62ih{Ԭa I>Lئ&k:MLX Z@[݀ySoum m7|fXH:0a1p6m`2`1Xvhx| :0rE\ 2rWkGP68rګX kT& LS .  Yٴk5G f3 ݅P\@nyՆAqA"4O L #-h8\@I' E'PS L:P $Y^ Pa܁0;U|0-rHmen.t mNh5AlAtD4B^f f[0k0 `}Q Ղ&PXeJ?{64(7[ B IȮ |? 0Z07@8UAAg@]C]󁯐A0@Mv(I= .a <C.Ea[m Rd1RC  &fhBxYX=yPҠ?PaKY4e|MT1iC9 D9hA@=(/ WGa@uXdwځVa]n"Pmh2poPE&^p UCmZÞmD5ݶz^(U҈#KA@ލ6+4"OqC `&V{sԓ&@GS /t`7'H$&(JȠHx"U" |~xWԋ @lQׯ;3)<$8;Y @KtL=*P0K fI<K,1B. cmw%RTSuO^Crqъ(GlwlllEK1)U|PƄZEY2Fo۞[fp骕/$e$+qb,\JAVVK1,L (&)'s1`,yuT)^>)dKNF+}flqe@.,x* .iQAݰ"f T" Lqo Ȥ8=0ƒ=|#` ѩpqBnPѝ!C**w]zyn\E 0Ge6; ̪AI[(f(Ȩo*r# W(&呝i$b 6>^|xL ߳hV&1Vz(@g Uoo:W׈p4HcEBՕFe/Ҋrb mgzw7F7Hpq/2OxwԭOg u"l ӭmС,JvѲֳ_ZS58cgŤK1\Ǫx.YM3Rq "V`Gվ]VR})t^AlH鿣 a`!!C,]=)\ܞԳuk4&l5YX8W.Y҇yxVυJ ju 8JytEP,5. ڊ3.V@Tcs(|&!xt1g{|wԐf c36#j|lzϾf+Hs7q;.LV%0~dwh|us"=יJ8Hh~hi¥>K!AqGCrH.TYYDw #вK>ncRO[0 ᩤ"UdND:F+AaU=UGٽ;< nJ6%%%\?1s Ɓ+Yo8 9:^nnulJ^:U@qr[[fܓ q[CKaz&RMv5;LIixn^-,HEB["EDwMuK;TWf3v?N@OE)PB4T!\Wmt22F9xv K2:*Z4xp=gk]KR[ Lih`!>|2a|5fwVV{zU? ˩CJD2[h]܋G08=zh9X_pҹ0.*,(20Fd$'L#YSYj*|NނB'yq0sn^5vsicjdpMd\Kd2_:"sJ0S Ru4 /.Kȉ])+.eܔv~,7`Q D"D 'pYEpisƭacن}_Elmn`kMzVot=amtffot2]2%^Q2c_0wi6?M!h/}xv;QQ"v'O 0'QIQ_r\v2Ô[yEѨ-MXՍ<6(V et6r<|4}obӐ8hYu~L+.m{POI~BxJE;K4)Nr^'_ OTzSH(J=E!C7 h?!#3O p?.$$ɨ{ < 0Sm5 0PRV*SeS| {$vyJ^i>MEF uB\=f#)@&&Z W#Gn#ea>, -M̆ #'ٻ8H!M δpuFӥcCw|~77jN?z?^l7@zQ?X,NL72StF4&B;;P쑗.\h.>A8h6fWWuΤBT:rq=?.Ճ_n]Ǒ3,s+W~;Wwl48+Xv 0xA}׬>(0|,U-^뵳#vŵF=T3a)?ғ7Y Q ;`&j/Mm^ZrhE=#ҎIz(:ćp :L.dS|]l ^8"?fۥ$2gĹi;?2~ s {+uN[ihNkg=Ary` qUKFBˮ(9N&4sVݮ!~_AgVLrj+ vo,4.ps}iB@_ӅNz 碒rOs~i%i&=+F"t*ٵ6Q9i*2%|+3ьl#w f'>2*ƸlSxROz"l6Do.,O9ܱ mjFvc0?о6jf6eo ${Wg[ݭq8ŷ0{P-kP0iw{߻[;awZ~r (ullĐ+lNԪi>Mi'<(=%;<<ԋ ='~d)tN 9&EŭaEƫ¡=-{nTأod̰h'7͠GϠ"aDъ:~cgOQcc+D`)D֡ҍۗIҀfDž}\[}t |1}K97(cjr:9o3u p`ύGB{> V;0:v@dn]^xFW|]Is} ^4 Tv&X%k+6LkM(61hE1c`4 #;37WK<RlAK#?7>d1*8S4ʜ|e5*g <((=~uF+ZgψܩSp98[ւ7\Ck}M`HZͣ/W.l9a9B[68ONQp Kŗ^(ow 0/X1$˷@=#KSyQz( XX~elAB^0/L9WƁ-Y.&&Aao7rXI~cm1Ө54]kO7]a*{g6ٖh>^.h[ϣ8}9 qGClxClJfA^;LCCp]kTo7'@{1f]lΚIE~|Oe6lVƹkA̳v Jܺb7>T5 }CĄJʋ,дACMRxݝR-&HgI<(KP:;ߊE[AGT~ar`mmeq9.Wx0({_e6.f\lNpAG*]cn "怂ОAM+882nh3 ZЫf*۬VHgx⎉=vUPx288y>%qť\w(Kb'c,$}JouKܯGȨE Aԫ *>z re|O5T?BQ`OtjDޅhB,n~UXC IkX?6^<@_Z?%؅^l~ië,y;J`Q ōRxIYCLs-vI,,f)+^\,M/"qYu`FkѰYٔϋR-1ѿ#uY |aD+&.8!Ɗ`;Cdm/.U+FK85d-C mH`gжLQ@ǓpBF[ u!:AJ=:O@ :pI~\@L^a]X6>X=bV i`XDbelV_}x8 _Ze~+-{ ti^SF2_hZa|KL$94w>m&s4!}_-ӑ@RT+eR ʪH*jew+oY} Vgʲ,{׮ygߺDr<3mY>(rknBt Z"xl"0{ڵn8.r]^7#L`u'臆ҚAM劉ga˼A 6C;A%_>Q%S ؾ/b^σOD.du}u}W_wSTp/ wVݘr|rY!|2 PM'/)5h4#h8D@e 1.:0Ubt> E:cmIN+NFcgdj cgQdezЂK@4G'Mr66 ' 0crKtX>FՀL&j^TgRZY~{poϼWk)U?6'rXª; :D(2N Hmm!j~QX"4Z.BGd:Ơ`1L [HYo7$F, MpZzR'&95VӽU7%{PqeQI"R tG=^qovCNdY󝆌-^xlv(eqFvͨ%Ngɰ5l Ψ?q*#tSvdsjNսl2k!%dRҋ')L+NIB$ ï V#`מû[=b`챣/ ˕h6C5~}MF")7,^uP`T/6h "P+ʥЁq0 ȶ:Wk^!ush\:ׁmGR컼UxC!_DgDݖ0טp_--4 pЍ>TmHxbVHb ?NTzγbŤ~p(Ꝗ= AS:&̻%DZ@\:{L:Cg{*CY[.X"ة{H%q졎=m졎^1xGCe]z3(,|xyG6yJ+{f9lU P=GuPC w /DG`TK+w{TzSIku{(~?}tw`()ǿVes+],WW w+W`ծ) Λ7{OaPrU IA7ӮĖׇ>P[vON?B}e}??9RU}}pzxaz:+Yr';oc ί'_ TڇokjJOe7gPLE" C: 5e4eiUY_[++kK$Ƭ5yMml|֔?lMv'h3wagSNЙ)Q~hV@~{wAfGXK[bN,U P0hHESXhOczuNq<:*_{mz9|A6 Bه0mAޞV tx:vWi]H#ӯ SնZH1}?2Xjy9p,u `kҫEBf{L3MR3Byr( CHE#-,+نK孳e2cHj6QafPaPY>8C& o=I8mW`⌾ (M ,k?D!o-@˳vj =XrSXW3+ưWYO])ڍB^{sIMNfp%ccC ^i ZPy(j,bIYТHA3äeB#P(A96DplG<ccY]jcmz:Y}Y錰VS׶-Kti⓻RO$IT3rdm$ N$  #-Z;nJu8߯N6GyB1qQ4CtvmBo2[yTReytQD;;NO4{nIO ov u}S/)GV񛺼N, uLUvhYNKHLneDQ6K@M=s)uϑ)RcϲnlXߵ XտWV(^a!oZlŸQҰLOٶ@3-ᡣ1+ ^ꧭϜ;hVS"9I ,/Q$0yq$Ua+r8a<q[z}#/5BHZ-JF cMluDxfs^`o}![Uhzzi%l]M]P'dMW|&-vѺjD-S99pk-gWˬK@;TԿտH |漏aC!+.ѦB ỵvP)C®{1&-:фɒQV{$iv( eQ*'YXGTǐ~"e]Ҳ8f$"WD+Q/囑hGRq$K'"ׅ<*k<( H.~$2+bՊFr$FPXRE!eELKLB_.,HfBF#;R[G2uܠE ]HYKb :)ˢnҊßWI[O.H,7JaM6PX^s0GiaHe !c$/q_ĵ*n7-@b "+/N޽ u 堾֓BckM*ZbÏk_X`kBG;gAcI+&7T Ă!+eTZYEAiy3hQ^wg92/r\-L|u~-l:#ʼn;<_׻']J](?XYOlLm| h;p xZk8W\;2T/m6|p7~o,*PBUjJ_5~z5:B-xY'@+:r)J9_Eh&I}EPxټ L4\Mf"0B^+ m 3|--/+ZGn7\k,7-1-)"k ;:@u\sy |/O y|K9f~Q#2hn? lp(fEt `>}ب !}b ,$@Z+kfg{WBC[ypt qe qYcmaeXh4~* >K{[Y4;nHuKAdLgVwz*X"rN]k3sZlR.+DQs~nnC~3}lA+RNRJSpPX%>y't8VGW{<_xY5-j )(' yv\ˠ󴵨oqn긤Qsi:ǽWy` ?*Օ5[Z`Gz#3z!T #l gdQ!.@YaOd82LF*{`ޭ,mI>CX?467BX.Qh7>wvzvB'zNPyⷄ*s^61zá-YNDp(P0*50:but`>;{XM>+!RU@1V! UJ8fA\GH3PyA:i)PbTd+Z0H|`Wi$"%בH|6Z|בNΪ(U.່E% *(UDYB{F.ne#Bg?$ ?w> a=IXx=-^eeMj6a> m5{_U k[:Ң́[jQ xxS 兖ҏ2*9%.5 KM J1{7Q[GZ4y^R8ww~a?‡@t&ㄏ/Mmz&>eB-\e5Fv>Կ:2!ڮM\(d\-uqT/r&;׮W-8] S[^,-HI j(s,,j Cی ,*2h(]\bLLBЉ a Y|]o NVvOzr=9fHD2*m8 !#- }Wor2%_lM͚GdOg11h$4p1ɞL%7 Bzv Z u&iG !fYhABh>B3t-fV)R7<Vy83Dװа7(f&1w7] ͦfhh"-qJ鉝D΢r %70jQ9Im|#!K?1O֔;kgdOMK"Lة4W~f~k ww+;1*!+ޒٵ0@ QzkVC+c_ӶO :QJplbU;<%D_PQ$j&SÅW&B+3ݧ`s_Y4z&u ͎RR2ZGadi1`'71i߿#>:p~g]4+uu%9&ԑ5ӓzZz)MA*23KL-Q %.@fymNA٬`esphn8Rh؟dؼY2NuPXՔ<_Guy W5*سʽXifV*4ZjەЪ$M{\h neօ"㴥u煺nhڌ(IUW#I]6[{#>j0Դێ`M=ؤa\Ы(j(8IdK+|Șx\=W9{Y%<@8 _+i`P Gjg5qQM&4;WS*R6J MѾę 33-;\GܘGG6$%U(/4Rv 9υa@jfzQ{3W;չjn3fݍ^$q/6&b^7辅B{*ϱGxVaFVt_>zέ4zyW[+Z[Eۣ>~ۂ V8 o@¯=^/0c&Kc}n"Q˻:e8Y ?ֹq}kBht"$y%l_ ޠϣNзʮZč,orIle r! @.{w’ c?5!,!ubD,ϲTRE*KK7{]VZ٪8%WV{eEVV.፲ro+tl o6Yym^$+EJ/UJx WErmkyL7ɖѾWfLgO(n".8ul"ݓ:$!z闎~a: (ހP, ^yLnl#icv#=sY"VŚXG''` P+b"Kby]@XX2K+Pe}Y,^\+bC\UUϚgvJT_-յC 襅#iXeX~-C*bu KP•j/ܭҲX*rym;K˫ܱDn3eS?KgПUFi̸bqK7H"H"H"yZ)Q)Q)QT7OIlϏt &tW8Vxχo*ڮ 7wj;F#w5Ԯݔ%Vo| B|ˇ*ob?W0Le q[yc+K®n`Q\8kj؀M}u@g|'(* <$?<MH{\R!w86=#9PZŤsqXGB 6ɁC%|M{o.(%>z{7@>FkwGEɼw$mw7[6zI &ՏՀ!4 $?bp.N` C5|1_57qMOL2OR")xR´NURׇ!?;a,(oyFF 1чk\|a(] 0v=uq/Z!^MAx~ |>PKC#b1>kxi Pѕ%~3(P`VB q5LyQCɸyX|uc63*iHeIY`rZx0/|a"ȈǶ GOAs_1: GkϺxwНu՛* |_i5lx7PyOy>лj?Z8CoЙ6,^Dh~a?laae3EYxW>#bd_`g$*EѢI.͢} 7*btA;kR{p4P]s@ZxyP;ݝ-`x$s!94)ŚWX6'J AV,ˠP 3rO)s[hW4jyҖ-iډz/|c e89-f܏-|sv]XQo80"tQ-"Fz5jWeS6"x8 rd6k eUu[fu=QfUYeVkđ 'mH;lR: a "z*>Bħ7Tzta+#L4v%v`o2j*Dl8ःA#-*rlHẀf7BFSFmyZUNŇuӣ.ߎ鵞 _q-u5cx O0oƸ a"x1v1DQK " )U*l7krgz,2P_X9)^`vFvUfyc2Wln{•g|LI_dƙ1?\]=*SEC\UQ{ d`A]8-#sZ5(3u *$Q1q&ιlFn50M6VӾNkWn*OSVk/43Lo `M75]@0[-U/{ yNOaI&bjKom)ooբz,qTh Lk|bƬ=TgZ\kF=5bvz [BCpnO[b2$d$u/LKS|NSP-muMk"a-O;6E?ywAҒ*i:^=K5pQ0eqw=w^ga&W,js)w7z x'+p֊V fS1no EZ*nJ^uAv^[|rtTC r\rGry׺{T!ϋfǡhR5_;WQ}:xr77y"!I=LC4b?ҹXy吀L)+(o&]aSj%F(l*NU1T+UrJ+}{p,W*?I~[r }e`Z?ۅ%A_ko Li {K;/0˥zej,JIEȖ9z lZzY+;H\l n^_oGX;ҏU>pZ\;#iا( @ X3-W1^ضf_  -`lk`PK,nw)n2$zW[}u%Kr83_ݤNR$Ǜ$bXV~[bD[@UMݻ$IFt{Z:`de.,RZ8@Zw &)Ac_b i`q1FV FLdۻֈtJQfo¥k2Nі?ZăReh6v ]zbiԺB|vOw:,=YVǃAG-LO9e?/H~ҿM&8uUWRߒoYWl/Bݭb+tgx|]°Cw4Н!G?@AH]ǟkdw#먼37a֙Y&Q#S9n5vr." I=cf^gMcpjҡz1$;^lIr{clnf<:j"'+ŷM(HQUkFc7W?3R-pbi6憐s7-Yy\:yϋfQYP7`=k9&boso05FǿFR}ռ4y5hǝ n)vQit|&Ի{]xs2ajc |7Z '0l_c9?_qkNڽe@s2 r#qNo ;=U @Ǻ{a0} عxIN9[S`Ɠo&aT?5Щ4?b9vV:Hc$|Ld'^ RrF8q@A&+ ww(G0m 3`dc0:?AǜsaAe(}"v_s;ajT==*..)΀:yA,9Wɸيi&Svkz|$ f q}`=w&c '_a8"O[Spq609u(XlN^Y CΦNIq|֛qz׊N%SrҼȞhg0pOHfxl]a@i  m#`ArO J?j* U\oI\b_59!L|x]G`?r Q˽6Rd*H XT FXkdYly_ڦD$chy{I:J &[hlqбhx]ՠ֑3ѣIkXk³U,ْ/YuNz*MG#ŸyO<~w7Y9l?Mè>3$,ĥO4‘}v!;X]suKJ9bI3c'xzҊSe;VQMRx0>ip}a衝q3 S䃬lX [ߔܛۻe`hԸSra) לܰSCw=nՈ*H7VJGP.Mktb%?lt6׳N0ݦ[IQ6j3+6l!ђDnߦ6:c$R`f3sJd?}Xd`  T|cw&S adzb[:!Ybu< %g1NRE_o%–UMD+׏aR%]yGmo IReXK[}`XsΧh`Vg.~<>NItA)E$SSN tO=hN"Ia ZU$!>6iefy9Fy?Vg"i[Lzć;4mӲTOM<@l5GʡL(vv{_cWX*@TIбj7qݳGy2AovB-͉)AyӁ!Y;_gjÅa'+?Tn6v."* zJ(mC[PiNc< chy(4qaǡ(AY}o !Lͬo[wթ:stZ&xr&a[|ٛ7o.oz~p3ESp +Ï;ɲL(zx)Bݔ?yD_}9:9x{N,/Q ;^ă@3q.vA>/qq 'J^ >:-$u ܢH7gn8?o>oϊN{"8k q8!}OoȤynfB.LLc.<ՠǬ${H#W)ؿ>H IOTa_[+||v$։N[&)"ȉD`C뜊$"_[q܎9 i>ٖ?4]tJLHH,eT,ǐIJdqGB`[^ַhgpns,s)sLvmGfv1L-#LhSAXK5~j6fP#;a?M);n%8qY_N iJ`NJv>jFk} G \Pal$FY.a*fn}3u-4K|>b5uvf85٦t&~<'9 lNg$<.;VP\>nA>QyvwQlƸf0qUSo.sa.^?cSdG EYz@k26Hͨw9<5`znS] ~VGg<\Y |,5$rUrreiyeum=CCAO Ow9C1?f`{gFnw6d}hNӶcjJ3WN&t6HdPqW{o?VB /zzaݗ۞xbkVR.ٶ_ 6.59yhkm^50fX\c3H'z/Z䧁AIc}@s@hpSa(2N&LE:"t(Q$Jnړq@;Gpɥp뉖ޔ U֣c|?eqK-J]BJUz6 I 5@HlqvFH)3tjLiQB.gi3Y. gxX3j2N@H=c r=h^eI,IjOZ0Y<0~u5;8Cx^pu{@mw :ØU*>Kyv))\M i&uS >m?j ovNH@ 9+8 E|# *;6t8H:b%b6htfH|k[""s)^5b0х8=]P~uxtK$瀫AN㰪&1?M 1N0&GǠQ7 r\6 F"{S`I`Jj%(¨4r1F'u]</323(ermbAHzdr8p>Yyn9(Y54~t:kEA?'{ir_%s_5g]7T"c4ۤRA;d‹A;b1Чw'ONv|5 e^,4R hp돗[/@>`pD hl45nzqw 쟟Q 쟟Q YdLDװ^;=?_#O~Xu;4:lc?[8n萄R/-U#xFIha?(=O'~i?8ҭގzL"BO!k4mˇC$-fvl# xH,%fS%rx [V*-IRQ,!~-]VN|Y 5/'L|׸A;hsB- ?hwwoc^_!H7E@ x۴M6KT؅FT~wq~@0#?AhTzfEC[~|y5~ _b6|_kp[/7C݇q0`n3̂wqJ6okvx5\.NnFO*o$,-U)^x~7Ixݬ }Qz-23ȟACX]*iVi$Y&ABU'V/sk>αŴJ~txHV;yms8Kj(Sr!h YюVܖSq ], ,< O T@;^o&xm?M@[ڍu6[m![0Xx#!l}$ήMo%ڬ%H=3+f̒k'PuM5<8WGx) ,hq7AD`]{Lr X>8j2ɖg@3HEwX~ZTwSWJ57T{!4aAė.[HQOdj5 (xO6y 9_2'5X9H%t*c74M[4~v.UŌ;x \q{Rsk  =_~ sM2}!\ M!m 3N^?Pކ|hn/8\`I9Ƹ<}36r ! ɒV w79U-=qj<}5qmb iWFc<4}̬uMzĶtHǮxDB9طoNiBpѷhyBIlHBr5q& &G)jv1|1GpuvZ1qepf+ PzTMhvG|.sy okW{0=8N #ٽd? h']9jдTޠ-uf6PMu$K=hQb|KF(R:99k.1Qr/`Ut| E r!QqA'^\\:bAVqSib-eZJ€* qUS׮ڲww:}r>$Β88kz*#Ra%M :OM;JK9EAOZN;sA2M)㥖F t,IJcw J o'[RzL0AJnQx;P&{3j:HlrpiR*\q%2<{IոNbt; $v99/ .dL"n730%h2=ݻ,<j=i5>>&6>r]#/xJNFJ3BW;5wûXs~!O1f=pлDOI^<2ׁgN$$XPV^N8~C2&ijA;'{Qq&ӨWDpIhؾC|Vz K !t,*[,jnkhUCTDZm0G䞢: Cs$iu%ȭfePȒ)A&6؅GOd @S51n;$FiTPpS-f- ۟ ̱~N/>"i>^kx@96sB0 tnlאI_MTx!{$W^ҳn64Qi6AΫA*uWeZwlzZs|* ji_F[K6+!xO*eg18Q7i5.BmVu8UV1]<̝m_2t:wb>ӌ*~jrxqh=U5g$D$W.Mz)Z(}W<#T?ظ9ҝ?8$ |D`exᎩtncShnJ*О7yM9B6xm?E穬E&Y2rd4*J~3Iw:xPŰq--d);e6FWϖTV8*AWioE;#q^ Sӷp*UZ#yNBEvxBsƙaSeçH;j|HlD5kS42"uy]sw+\Xkz{5-ُ+wwc5tn 1,>jؠheʘٶqȱʳ`Lgk$Rͺ57R5}Ca"du[%%Ŀe"q>-)+3/ %%P.!AU8k \˾1C~.q}t햎~N`e31su֥< 2ZTa'\9 ?W/ݝ  rCmsB Cx5{X!5F˄Nӛ1Z pݝ!IãT@åbCwD:G Bܚ̛X0&L \ ;#v ؼ6O(A>00w:` ~ 1Rcy1\ --=&wW ބP ͚oqp=v`0\} 1K.1+9 ՛xp5&tO8tz/M%BJ3/O&jBn㒪,vz}4Ec˫[Pã= L.)"u$l&9]̴)hr]ɂANX'j2]n{PC0U\hmE  ?()>F?U00T߬oPt9-ĻEPj ԺVH{XRK[pWOCgxl?Rl_aFhqŸW^'3v_32bRSN40O;6ox.,FE&MtrYl-ԣsY ,:CoӓoK2:5SqnT_*=S8=>DGm*h&ʘ~b$(-Ϙ|`[9ЮkZc$WߞܷEݘ k"REyǽ7՜ΉÏ'{~~Sap7>7[1S l.o|Kp6lkur*ʼnVT D?``jl]לH]َS; ˁp5_괲ޠsVXiaQ&xt_4chOo } d Pρоz/qPS. cb|QDY%RW5&(q8Lᮯ[TV. %:'_ q{=d$*Zf\Qr*x:/k*f_Y&Rb.O*y !B(r%iJ"^4EQ:6!2ڻjSٌK9ۅؔ0&錓@K4GoV.$[6Ρ.{'J\SRk;ՔCdub*ttBSg+h JU0Ü&v 'ru,X:0!;]b!}œ4{IC6m/a+X|UQD!Ȟ@ROZ) ^ K "jR c+U0WLfzXt+>4݂a&x [C!M7RfISIԲ3UPL!5w-η4z竓T c'[Ad K&Kgʌ_q ]ԦkPjxs"o8@cɁ{i2W!u,)ShaX[2a|Idsu!~~&,V tjocȁD 35 1"T:wFߖ;ʟ)Tiǝ8ʎ^(@ۍQC{^q_ʺוYU39v/.V|*|?vG$c\]/? Ď5WV^jil>,Ѿ}:TEZz;M_}S9IEp 2a"BQA 9ȃP؋<,e= J-MΧab4 pӵ$iMi;\]Uou)~O o!OV}f裞6Bwxnfkmw6/2 )5SB}׍~ξW66ܣ6^ FidԖ_^̝=x[Юt|{%_|a:]809 g_Q3[lAdfd i|m#h}Ne.N(Zc X$8U@ڎ41oЗ0LƷdjp 'N8I n_ͪQ 93*Mnc>]ӺpJA tTPO6=r B*[A-I :$5oL\j*q}djT ^oR(K!)Jvme(7]l1czF&jlUIɇ>U%B:r ᖆ:a]GmcZrL\SIwTk(jn:UnVs +'zA/Tj֤=XZӷ|xœ[A #M%Ueg1QGEv%|JRyu_[{~읜wA Bt +c :|4`{?71LRV^B-NI6I:K_DMzE얊/Y7OZhUT>Hlq3C|&ږh޽atܖƷ \bpX\~ ,$.%{:ճ;<`v /C E:w``SF&| !^Ϣ4J>P(+MȐr)/t@FWr ڑwO)HD8Nw+NwzqzxOZӪ6ϟ/A9k5!XjwA  .t[d&/ͽ_aF!O-m5!#H4S7jj  +ﷺMx)J}UGsϽ7GCAA`z'gzB*dʹn'6Ŵ5'gPo!t#n BKi. `kI3 '!&8߲l7tC]֚)2>BpFmc/NxS)vNn8}ہ4U{zJZw+Jpi;C?V@\J)L?za4``a*6^Tnajh^=fӏQ;JS4ZߊUzcT|D"{XAx'bMNmc(/@}x! h29vE^wrQs<󭍑 CcBC !{pI[0p q Np1,{{/x{u)@N0Zoxyƾ]/&CQ/<ŘW45[ε%OhMoY,Ha&awЫ} kѦrGiޣ,GPV:yGkV"{>+u#OG^߀7U^;~8$2hUy1o p0hƙNIe hqRТ<,dk&t48-p0'!%THal=s BM#KzІzTvVA Ts PFC8!2NqͤJ3-ޱd=٘?/U;ceZT|ECPcPDZɽğ_=nF)rHa>>DHvүP7+ƕٗy2G[7K~>q4l`<'}DR_wSѺG|XDV8ѰWLu)OYӊ/&=5xYMX,3:t"dmN쪆yx)&e<1+ߥl{!IԳ{6}ei]an9$^b DtNǠZ sFYơlAy(8qiKa 0-o)`:OQ 1=5تVިI ?nC%^=2C!Wԅs[ER([Xapj|O&pAPE ˃Pf^Zf"*ji Ļ&QE9/@)/#&õLb !%\QGOԉʔR)@bMHܸxwa\V¶_|~#yRsjXuBdJT3} iY% +!@Yy8)K t+mQF456qP{ʋڠZ R֢a}jsh"2Uk* ]#5[c6cm!Ab],,߱sS`̕Q{Io&o\?>Uj[K5!BR7N @=5pV_XQ̇-EG_7+lzڇͧO 0pH=N8]@x{|#OZv(ĆDYi?adq @S(LfIae_N~bJ `1p;ЧI80`>EYf)#s仸+/ %ﳀSo| c]Slm #?g4J1՜$2@; vpy"/?LsKc% _gbxS+H h-Wa{(K+ie2qX AY"==O! :IOXf&JX.|ګ*X>l%;鼉`ɠkK9 D<`P0zµ.!^d0ׅJRl1Plb![VD08t#k>{8A'怏#)/xg'gn̰7Fk4~ i≼j09 pޓr-R2Me92#\P"eܼ$AXY~ief-)*2^cB1챳r{5O_4b l.GcRa%> 0i~RaDB-sq4QB@z' ʻm4S7~i 9|p7f8}V2(^tBNT^.M"Ym6=_ 4¯8}8j5',0A`C(UrJE-#, ݊`Hkn6B>B*YF`Írdôa6m֊{*(;ϣtmMM7X Wh(tBuI?$,]:Nz]L6%",Jb.v#SPzsIx9Lv?նm,eJ8׿_OGy?T7ny6T3s]SvdO+ ;7{4J JQ Y M^u9N.) gQċ)Hm?pj{d ۜb N@J  >8-DbjAo^r1eQ7FzyO*l!;Db1v"Ay%r\H륦Y5% .SW~lw6ezH9$ y3a-%UY-_Scx4Ѳr|mWޢ7VX%j+7Ezv=2F!J_ґ2 !w4֑ ְ.=?%+oGGB$)8Wa/J'ݻb3S @+@f9|y߹r(*CV]LPΪViߧO1Pe:W:t]PcQfz]ͨt*-DDw89Cdjƚ@JP]>_ɓ12 E(s̶Af2 2X,n{0(ZAʮիė,\ð=g=>iQny&u`YNݎti@?J{[>8$!Q!wn-ILEm)8:xfKԪsd-xwnIwG>(DbXLZВHC+T+SgnPXMlmˉw+{U&0UrF>,\Cs*(7LRS+ _Q=yD(.Oӊ:'v dH7atK,IJ@J}E`v>. 4Ei O_ . |dS W+0LChE<Β烯h%Gmw-Gmk8jHk:ޤFrfd״膖8/XMoǘ#&UzpjGSQNT 9 E/TN6YhSA<19Eg.?90Պ=f-u$'%+E"z\UQqSiR/ }O@$Xn@1fCeWzۆ/FcQG)F{բ_3Wtgb P*hp\WI>ǃipX,¬?#ĦgCT5j'k(:aYԗSCgw{UdtA!xAmrDZoPE-%^P8wԣ T<5Jݣ?yI#BzH;,Sg}m0)h1!.&&`]] xmf!9˹ߙ," W""D3~ἕ#p.(1vpDu136<>Nz2僴dnu29¾S9r*% V ۣi s.`cb&G*;y9-VTLʻ?*+W:zCz?͆W\c8M(7BbMSQwǾssGO39[ھ)*5g~,7 <<$tn;23k0IH#hEi(Hг>AgRD=TzɰG3 Пޖz)GR〷oG5$7=tٝZ"&u5/qfZkՃj]=*E! thS`v F`OV&n|<k'kE'|T(J VtAa_-Bn>@w2|]uq*BȩCɸ۾{ qEC ^ʁsJ($e9ٮ\(TZ% +;@>*Hi_HAՉal+&0TϿ}&?GN>-NR5UХVDSVb2Gc1 ֱѭ02Ye 9\t]0t[SKHZA3>ʅmREg/lrr2{%D 3 fƞ{ D4=$&ŹL"ܖK8٠hyM_4$ݙPzV4TC J_ ?~ag LL% -R0a<< װKU~`Rd>h+-R~FѤH'vg.+^;+Ea 2i#|PNju+Ţij[I?KاJCuֆf@i4^#.v~1/_ &K˔AU4;9!h(ִ]n:F`C c+T#\ulALd;|KfX_xXfT 1 A =ſl&y|"xwv05'O2a1ws QBbAZۡ/$V%g[$=jNLAL2mm*///).05YOg(TN 4Pڶ{yU$݈&nY)D(P-GpxxxhErQN}9K4:anqޔH%~|ϸARP40:dfW~Vj1F2[`*`! ;y, kڎ;rȲ,Z=v D}!S Dž*T /pg|Ig ]Ǔa<%*sq3-8_YmNW[֪`': ݵhb88ɂRE6W0ڗd_d`eusrZ Q-9'o13v~կ&@)NP`?1tOf.|@:;VՇYB[uwi$X/.QNupMV/YHDHy>%B\am/ 9V*N؞vSE@sLu}#wkEm<,u6Vi>L3!F 5߸d)@54TS hr;|SK]R'IC5[rW^\'/=cj`iXrӏr<jv1|aWzK!o/#4gٰ`e c&Kϑ{΃l̰ >v\o]M)Y6!|Dɩ' gI s+QpO<~l` aqJ.{{F+dq6O%(0?/cRJ:Uj/#>[+0f ׷oHEٷ} fu޼s)1ܕ/K2E5bJadd#<&_RRhWȹ'Y(9p;eDdAp$}b{:=;:w)Pnw~ 8#ʶ\U?;NuENqÁgt>q9~v,-e'chhF0]yaw=#z+#|(1VE^ːg%KO񿎖d[Yq^65 +%K\6=pGSS\=("n+5޻J)hQk g-8)J )aVЙs  )X~"6/2KKF\چjLk c*WNeTPm?%ҡ?5t 0pY:R!؂k7X&~,z>7AGv!,Ri[Bʝv^g`r`|K3Aq@hi3 y= K;۟ Z* ܷnbf j|ƬzV2=.BxmYf7örRIɤ#8=6Wdw!2ݧj{Wľ޵3RfK'DQu2OiBQ`h~FXDs5-GufυUT\Hhly1hc r=O]THVb*.}mzTA1 4%g1{ !}*_> X0dtIL^Y㪾RNS~X{#tGͬ=9շb)qV?S nhOr;e9#'r4\$+L8gݱfϲr0iRI!DoRvd\K{Y2W*⇨?ߺ(w*:__YZJ.a8?kOS0~lۯʶcq1Zz1{;QJƣ jN(ClNwŵDXJ`esf)TPHpuASEQ@5XśT  :wuoe^> 1k͖>ٴTU37`'j؉|j2*L@Fs3(HhZV\m@uy >ȩkrX5^M"0WL4.!8ܷbuU Hu /1{E ن'Ta`T?N OX .Y27NIvdpW]'Yg0U' >olEݧ^NԌl\L@^9)SQIT/OYjDEDt,cOpy<򶙆ܩ2{jګvӟ |B˽ PH4eZm|tT;^ȢN5k= ֍)npPsVj/S{WPlY7kscsts [3b2q35:,ikW9A/Y??w[N٥lUGS/5:;F$>Ve5@Eޒ[k4s2ٚYTT ۈڬO]^!s]m8J\ielur!#2=C >f%BbFi _5=G,'wFf7fnU"e4k%fb:MDl3H\e8*W%Z"kPaE'K^{|$v h|Zއ֫S,TKhx o;2]+GGs8<> )U^5XhC%CSMDVEOT?lZ-*ɵMjHjЋ,_LC#w۴j(%eEDP G@YM,EJLep.joKFíz }N@hY?)܍9[Z,id`q"%6 ~9aFh6UQJݛzd8cs#fW ɛ} ƐXMRơ q0f' /BibDfQE orek/i[jc%7V'yPxm0 \.w!ZG'g?[?{'=b~L?}bL; @[2Bʹ !)W)āC${$vżvsG F Cn@t/M Zj|_as4_ϟ+H'OXmcO~d=9Upp|-맺BwݗR.R ER|pdyux.*bqI^`&$O/Q]nY&]q?Bc..Փȅ#3H)!թp҇Skgf)oI,R\6آ*j2MĀ5 6,#U,#-E1ܟQ,YS;q5 JgS1)x |R |PsZ["ch'ȵQE/M1x#wXe ;$8ЇL4 Z$><1L2C y{{.e3_a\6O=4P +LaU so.+{]6ruS.$ؾӠ{frŃtҞ ! nO@LD$Z¯ +td}#>/oIň'xڣwI;ݍ( hv"]O0yc MPvUh3D5>VdԍB^}!aRkJj٩m.кm瑩h#sM>PX \JkRb,dN-# yPpNzѹ5WԅC>Ő|6iKJoh91!tt0"YW[Ã4+@P| Nie_vl\x'9GM %Mb{KRl[Slx٭rO=HG}?HT${WIv--E/)X5_,o$(j(_("NًA :Yhӫݧ1Js8ԍBh.&:[DO; "$zhfDc+E4IW}aOz 'fgGS0߲'FK6=f>I=F [A$d$'mFp؈ߜZz;hv[g8wDQs?\]VƦAa  *@̮.u> ;DzkDfxy }a0Sx4|vyL*0dǺو7,JFƤSPkc^QYY?HĿ3H.SOV+58Z>ogHyN6;={۝ϽVmG߈買BDWui4N U %MoybX:A>HzP5Vkf2P':j3wi7Sp>x BaO{FTGr2oOj]$iIoklGrSHeކ0nӵl;LQ_F.iCq4̻}t|^r{|$EWu.sq%!_GXAqHQt)oS3Yؽƀp714ۇ 2dh3 }6YQg/ʨ tY7̃قqv.kdg@ ]T'Tρ6ihoh `mBhAՔ^* l7^d׬Uue>W]9b؂[foɴ%ِːO9|(M,?JH]Hr`S,ƿX4T1܈0cğۓm2ЖNӗCUZHk;lfpq9;#B299ٗUr۪ QȮEQzQZWTܱ0˖ӣI; "w b,B`8^LG4( C4|cc1V8ݥJĿ0iD m{;9n6n<Ŏzvrׅ?x;oA^;% Li0 FqL&ݒ1nދhl5XЯL'ѳ ζɶB.XyXD!bVhI03 fPTsb$W}2$EZb1THcY"x-4Bf*+ ҽ҉.!xP,@G3ΨϺY{B8~B֬N (6Rǿ?+(Gb+Ę/TZ%\vo0؝S&t6vuZʂ0SڍU=JUeUX7 8åi,Q'JsF s ?6X=\h 攨o)VE}Zsu*<"Ij[ zV,ptt6њd( œ> RzCA`A{P Hnv{6}ڪ^RXby' {0 p*ܼ ||<` U,WILW6Ԕϯ `j~v4JR P9gWr{ 4EUUj A |k%I/狚/^F<6BiRGŸ>r%$I ޣ! ]}30bӆ D >{<ӿ.5E ٽA"*WZb`@k`/p=̌w4\K:lwo5Ũ#I.bQq]{Ϲlb[+jere@)I*HɅނ#'$bSpJO8RNW*Y_S ²aj@Cv<|'i? u$OMn6y ϣJh6Hˠ/DEItqg ?)H]89;j=@&fT bMf6EHi\)*GAَЀW*iaA<+*#FnK}LK[e`vBs&xr5,GyaS#2 *7 G938]dbsr0@41朔i5G1\z.,OǓP5*7/U%LU'r0!YbWR+CH338;m#)mTW#v^|Veiv77osN#'$eƏ@ad!kwt#Љ jH\Ər2ލez ֬;_oNVMĩ۴5Ubft1?O?Z|!@<ۛG[;.;)Wi 00~# dm-ONwj|maǯF#KG.n"I^G ({lyq݆M[A2&G%Ѧio>W#0!/A%;!YY쁹Pf[wqgrQ+8晜~fu'簪Ɩ+ Q<0rн,s)³W2ݥo3\u8}Ѥj} A'~t 0mO}OШeFz 12_yo(a `5cc>ePyjNSl PvZ`%?06*9^j);?a 14FMu=T̃zϲVnL0iwǯ;F"ݠèxH{ x%n %F =(eG a^ ~Ւ8H/6zr ~ɲ~C0T;s(R \ah/ T73Cldz:Zb߾r=jIM0 =1?DL~E%۴@%ۓ.6 ir"C/"O"x(ڤd_4].@ F]L60.OOf ~@dnX.c~.FI r+,>TBP<;04xB2;Έ QX:*ahm!ъFT; 3y *00Ʊ6T[t0'!g(N2Y ǶqQHeh@Te׹ +EtRxL,c8tQJ{87Ml[0BJ4.k5Z he7̹퀏ȁlM4)iKTiЇm,\V[kk/zֳ>:wvDzi /o t6@z7|sJiRB= \V^Xl=o7C͓ \R'H{rNd3rX~&Y }o32>gCer|73Nƹ2ix3uE? .\DB@*G~[oчJ ja%LG48*Mzy&cV=7R+us05< K, u(+ZYL# \9}Lgq4mMxtC{ *?^P MmܯpIL8 ϦdAāQ EXR}N$p ?zG1,o./Knd ` -Wвj?// E).*?yl$#wlbӔ/fk2w`5}.o\&2֥@&*Ճګ۳^(? ))e,E35-5:k,1yL_if6%ij K F 3~ER>DYmz/1>1ڼ*9HL˷3{f~rܟ!Pg CȂ^!BlA0s@`_Gw$ACZK+7`sr{@ kx(J^sf/_m}L7X4BX=p}͂ FXyX\bl)!Ģ]+57})HTQ .ŏVPvz- .@w ˊcpIQIaIXj@c>܇YIB+itU%z#ckJ6WW ie /?)9>}`,~2hVQ̊y.Nu]@Έ&<O0k@/q{i|5 i!dlZۏv:hԅ8 0?'& ɟ)Ӝt&S۳BeRJvUl:tr+me2{OM|M2I ^`Kak'!Ɏ 2}b_ZJiCzrxB զryO^܇1ng%P( oUZ-1}Z{,JswhʺBcO>sjWT_lAoPSIIY0.׳~`R, ^m3Ufb|| dX&<腅4gg;m?7 {xM7Q !6.wSG胘O*ƆVܧVJаL߇jƓ7.cǭڶWҕk`[&px=+DlH 1hE,\dZL|Tq&V?dmdzHdWN#KToB2JKk5u[,/!ԈA倞=Y^C{& mъ51{$g-ML=^ߨFg20f_ݻg[]ƒ`̤dS%!g2T0V٤=oROLk0 w;gbk!H0u8[RsS?]0CJ:YICyo &FVہa_hTB}؛ٶ5']Mإl[W߸ t\x Ka$ےapt |!#ۆzT@_'-:G}mCN_xFmDI$$V֕E>*W H.Oţ  m+*v%H4h` 3I3w=uBd@SZ&2_=(ʀMe f]Ybi,+ڠa-' }D[,&=iT|/@׻nz_ 8f9G -QNcPuYS -&_urgoj xaL [<5n{0ħu;{-il])9́d3dv&%Fh@ 8 |qFn'/Њ M/NDC\2EG+`R#rMA ^1(<{^t_/^KVz'hܻ-zv< kU( wm\-"u_ChZ·-VMcwwz1e^*⡄],g-JdE>&hB!E.=|8JP@VI6ȝPnW|}Vus 1@qp4g32X2{:xQhԐ-8c4a Jei"_BydE 7ha_6G?lʡf+Xh2F rl5b2Ax,'+/HhW>݌$*ӦH]I]HJ)c [3xZeX, o'XQ]o3O>/2D|^R3c׿tu6VKk-dHaLv5C-I OV֥N1B]4Cu*~M>N+`Zlhel\+XU\f1 _5ízLQlԏm&WunIr,nfTEg;N~M: L'k^ >&$벰+U3WcF^ գFtaJM~͘0:n|mb`$ zAJfPwX uX3›,q}YfeK9Դ ,հL*}lt! =Bt8Vb|=|k0c mn$mHAdM?~ ͨk(&_GGZ/s8Ȁ2lH'͌8%͗^vlWZfa~p\G]^ƙË x>x DYK43P(XЕX՗ #B([#ޅ sSUҟ]09ې{kMUw+EX-̈́H{p{\|FFErxbJiEHR'z`Pcj(}3{WUIz4~׼/w7Dnngs\7@:s70JUVSV 4 7P|}x]Oÿ鄉wt[^u B,tx%략ZZ>ī?@Z-v0 ^s+*GWj hT!zx;֖_Bm[=[ z=!nN/S/xn#SPy%5P]+Bf+楹jw8t޴4]k{u:δ CvA<@G7K&˞ݳvaK<&qr%aMT7}_ϯOt|{%Lqēy c ʌ᧽mX?|KW<oji6NŬ5ǯE݃d:Ӆ WmhtӳQv{4o*?i *9BVOR>wyioz3[̣NNt[JtCU'=Y,讄 ^o"m#HV1RUħx'iM\g'g88% 9oNESi-$v %\ZEWT–.?#trIH0UZ;xD^#[4' #3#`9Jtȩ:q2 $ͧw(캍*7vb Ѓ Hs*9]i?e!pFV}W ޺(R9^piˮ92MB-k% ̆XhҫiOG%Nkc4n(S:G5Ÿj)=bb>HM56-R{۝^75'@Mp@gbc's9<f*{QI6}Jvt8ܧAruasv{3rb^[ʰ̭''ɸDEm[^:I΄wqnKcD;2GWd0t> 4(1 6!C0;IEIXOu3~PT H$UƝ~|Y̐`5SUQ9HAUCFŴϯE.o:$"|U։h0x S(TQ#Bue+sr2~FWO`c0<(3 95hkK{qj=BT]ڃUloToM̮Zb%K-0 qP-*b~"2šLHŦlضZ_+h)V`[r*gY%X [౽Dz[ʖN5kk wua΋FtV^b^ҌnoN]u& Wf!1 ׍/L^</RkZ뾦RThfQ3©T4`,\|l GO ! B-~Kl^ SJos%!YtvUJʪ'"qsI=#! やߵ \_e﬇bݾ=zyyjokܹ`l<ӌ=HG}sPG=gJؒj~<&J+Z5u4,ϭ9Lgx:OD$C(N-֕AХ5n]!7KԸ __mWY^mږ뫬:kE+QbT\M]Gk~Lm+{f?jażlvu8tцd_lJV&2J>h1([ o_NxĎ Y6㲏@UU5Da6Յ7=xѓc{5F-w[Zn{.*k]}6W T^8>c*nwb|H=/C2(aʡֲdf}Y%S+|#2F|ޠܲ{9  mJ_ly8 (h ZvU%UNTV#}9QxcUs ɞdUgi?AȬ ްhpZf2R-*)jE-B4>SbUhÛw@5'Φ։i*%l56? a47 B=i#ҧ\"Ȋљ+B@WM?;[x sv 6ή1$p^ cT}6Bߓt5*eڟ>¿Jar=e!o8tj8W ;_#xuD&pd# e+OM'T\pM]Q+u>3](Œo*9Ns@ݷoۆOK"kғa6*M#8l44c9h6~^r`~$  :{}1rBOPD%fpnUzdb뛼`7W6(PavEw]v>5hKxʷq"3"Bt0 DB٣P$>TMܢH6'2ҪkT(%s30őqfOE4ﭠ~aO oVk;SS!K ӧcrxqra8ĿYC`OX)S;Eh" LM<9,{D\1c<<7h-R35w9έaMYv|ɯg'B x8Qi/OBaTw'XTOg.*=OF%MjSХ|g^xen[0U܄O͛iitLNpqog2o r Fz}vAR 󠅴oaY $,MOԶ,cjʌR-`3} 99.BBWj0жG23f2ё*mu9hNOirekpW>Ϫ!]`΀gSzhbq*5RCnH'vG ǓQoML gi&It;0ji6Dk]n#@Zkk[T?T s$InnFb0؞݉hkk[LqzҒVK ~a_Rr+"/O''8:q0<\^P8qiDq8D 8 u|2i Od[wqcUi;UiPw{/6IS$:ܖ$*~e_K'8_+k< .ڟB "u) $#HL$oe뽏4WG֪F5{U'L4ÑO>'1[SyН3*6ۺ`4}\LLGɩ|N~^w.U|ɟ]`P ~ ui]\r"3Z Wx7}3p0:VfwwN," uUdSLs-W$ڔI &khmm՞Pգ 3{;U_&iF7-P`o8qH$p@s7`[[?~ei[c؉Tao3u~jZbO0!ԗy;B*LDN7l){ ^9`Rr"nr5&`Z O0=78`YCNٻaC7eSKOOVx5/mEgXtW+\[zO~YqkpҁG&#[`Po}:BXB|' }ih{/]Uf4&-89a-B.ֻw?6vӂӵ~D|\|l_kQJuʃk<'-莏Ȩݍ140Ppϳ詢xr "0L$>!08԰4qV+NcεT5|f:cA#Io=+K/dՀ _g%D#HٮR]C;KjM e׻1y,,u4IۖU%OIśg62!\7Zn=fU'BW,s[:#1MJNR%,Ww.҃&uə>^Gx[~X~i#u MJ'FEvz_P+0Or[׋{A1)kLxihTYΤ$e]bIz'} p4^[I=|s0h cΈ6UmV/n`d(eJWlبGV Z[@Zf&ب3tm@OΙ*j#'ItY*E2T ][.ɶ[zT:э$' 6>uvti9hҫ0)NKa!rV@LCm?Ѹ{d}nݣC}4hC5hSD|9V*2[?C[=$·鿓^cf%X:: $-4]YxԪXL{nݡ/Z_JW!C90CytIn"1L$G]&6 <UfM@B ح6IP/T=ay]_(+ vaCFoDn=Es7}tbVgpO5x2m ,0T:GeMc_Py_4(8Ո#N*hqyj0+ 82''8qu9;pdۡL3mRChU0CeJ?4S) 8!"Nɒc6K{/6d`Qړ%̈8_TՂGY9Sf4\敶g dc;5zhq]{)bMDB1+)RKҫ1+kug!y PhR ֠SkA-!`~"gd6GX{q9m "J42Cf˽C Kɍ8J|b%ɗ&yb1'H F[x(mbGD|U:Fodٌ>q:WlyP6-z=?T' +y)$f:BS~Hzwl)u[#nyWɞ%R+.x(:b C{^1k;܇FbqäT(M@cXǁ1XQ"bz]CiۤP4GByCZ()eDԀ7䒋]f%k ta5oKZW ;9YCLJrcXֈI ;`q&~)8kr{s$o۝{ʽH;:y~ma; As= &AS ~hp " 询;ap]v緝npGl K{m1jjarԁDfX)p3: _P>dx]-uLׁiLr@(NDNI.Y3ۋ~8S9F7D|'4O)· Qcd8[y ;ᄌ;E{ڔh5Ycak&9.O3.oSjp( e|Ug o&IRRo0@5M4К"h gAmCBZ -`wU03_my8v''@WCH$*Dޖ=9%V\uP)Tk !Jh{p,u9PPiU'$'h,bmT$M !b@ۡ~PFL&r~BtTjL47-ڭDž>reɄ M,Sf"cA"4NJf"tƃm"26Mpir3{Y_LIEբnL./;]c$f陼"H`25D?Z)l0q u OreړJjnaOB eTsxVQkmڻD6 4lwB̑j9m']4Yr\Y~e!="A(Q%jra޲{n"InByZ.;{ʽ7)Cm༦ɸ ֒d7[aJWw'O}Y񵔋ԩu4Rg?UްSV: T+2?˝P0k>ǜSzϮ'L;NixzjKhO锎{)KG)&}Tύ`dhi!P]1-[o$U\e:XoXV=pWj"SMڭ1|Hi,.vbn{w+]߻ijLA+heGYc aj-n9ұ)Ԗ24XE=zTON) MC)gs-~|2̃> W&#ZM)~ wKI@Fc,dRF̐Xrc%eTh9ghzj^>=z>z6q= eպڭVKi冧Ny5xAtGF<~8d1~|˰F&s}4QfJ" 2- 41[K[]t9t :< Avn9f|J#ӭ\(?&go59Jl[-S6s DicW -;!P:Z>qr#.@j-BӦlM4 3/I.d.*_Г1֝ f\~*ȭ8@q3a%cD51 lĖ% Z ܗ ޵ >Jl4nzU;. ]]~[N;SxD<-Ƽ%b,?/z{cIC'|1w}jkf\ZG IpȾdRe%OF7ͽ uZwel_\ؙg'B1O2+?xyth(s"k%hr~R׿|1}q}?H*g~t%@OE*EUPe" m&jpC/ȗ\CJM vKz39eڬEM16fLC35 E2^OF槴G5h~BSے%vZš`}`]hҵi'/'gẓH 5ˏ-e33{b{? {G>I=d噀2=`>Y^_e^S۰w+ҟylb3@< FS:>Oh~+ʽݗv_$PU=m?LX/2h6^% {~xSMft8~s2oZ|0dosZM-5/ FA&h 05}TOZǨw)DޢkZVM(?J 26z_7eqRz~i'bG]5#is3A=攂EkTuGY|Lf/FGC1p-sKmWAP9;Rp(~[QHEoཨg'zXE(XKE ?~,TXl/QP{,{娗8:Z^zԁhA/́͋'Y՗LcuSMAa35vRȝMaר Tغ"V,x@QCM,d]1Ö*P:ڀj JNs,0{L*l Lh7Hm~trٶ/vw. Y3 M@'R8HƇGtv?%:I0`+en1ӵc>dv<òDjK8r,?Fc`gҘ{9ԲH #-ֵ kSY\ |X7`|8 34܂ t-av1:}9ǽWғ[$Q0L.M2dWĢ1$HHE,ʸ|>\d]U' Z.et[g.Q_V{aB֝&|jw1SgkG8p K+A1]GH6sxsr 3s(| ƺtDߴ{rD8BO,%^~ٴ0}vKhwA-n6 2k 5כ'KͲg> dQ==^T~8jWCe-vy_`y\gl= o{qK7uɶ~}߱ <Wλ-5ٙ1W_Ų;d& U q}^dCQ+C:N!t>sHgw5vơ~6I6ũ^OhK=MH':C))8R+qq|'  X NkAJWuX;V\g[2V`Q{!ިLC'U ([kٺ눒ETg=7˦NJU Iz~1PrK!:.\ 'adS2S0%C7o1 GjohC1rozt/_"j}CfaݝZMz+ja1ܘAِAKݼHI&T!IOtqdؽE&k?\ǃy#әi:#%/Zj;z2Rt3(iGpFCvD zuD՞{JpUplT[Uc&cجl&}&+śzr!avnOXHئ>)x7˻:l\`OCk\ R5A%v*QLw) ڡ._S212)5<D:%.SlQ*AM'W5x8k7q0s"M*ԀDS}# AcқWGTj_FHnD ʎQQ%^Rjī< f8*῔ iU?pWCc{p2ka41)CH>M1KiRQu.[Hi sg٢ <tpB˫|M#S@IOɄGIBO3rsuorWj P+nٴ+ <">1} AUX^zx#IZ%jnL6Op\`) ;#3vsm\V׵\B7T&_͖5Llf&y zbŗbÖFf(PP~3FllD<+bŒ'[a_(jĕlEBb9 F$xR>CifX|Ig@6gy)Y^W HE WMMTro"R #Om9oC1=(KhѨbwaM&(1/!)bKkEOz]{iLQs^G(L ߮$P}j *Е߲Ty8m)IruWF \Fld`6Y6q&dhJA3Ph&dY:^:vNfC0&q6z=&a|*}QMJU6Ec)PT3q:l'~bS5_ӥO޲qݬ)WnTfe%*b9kAW^ {z5"=RJF`*W$yк2|Mu,}GrlV!cjȖN'͝sK =L j~(Fڲ ]!i0vwںoxWX ]'i3.hX[|hsp\gPTsbps,<{ aW=ueyovL|Az'*-#C[uw ۝&W wLR,; Y4]aرvls">[0 ly8\ ʒ~xRZ0yu9pK/Y ~=~Rs`<鐣zz s&#޾ LF**\K23vT;-R0M%JXlD͛!Z  7D9-Hh;aEwzO$t:}) N/V]0n(Hp&@vN:J ~ox6NtMPd^(…sqInd7~T0zzPRc;]sG`f٠Hj7UBϼϽ/jW:dϼ n"^ T"fV%/Wc{t:! t7;'QB @+3Z&7TXG^WrʫsbB<+7 K[<_d}Ԯ!a!Y |r$kA9M JJex~SMކ}g|kesak W)+ 9:Q~an0ce}sp^~Eg?eQУT>/v2X` \nq9׼<1t=+jSɦ[}^?/Mna`&0'"?MI| %O36:VM=\ cm|f~>?.';$j?(s S2-Zⱛ VOܧf1aޯqa`G2TDs0 UZ~flyBuT*d4HȌ&Z6/}&u)Na+ܳ~}%!&IU` XI{PHil(E^1x|SPum$D|8l'Um0CDսH=1 >xߓ^ϴ}sq Dl7]i4gkZڷ㙺a ~>o:}3MΧ23*:'k[LKg=LJ 5 v*.M2|q^R~9^^2-vk2""9e3Spշ---fW@N*ô2鈭([? R3.J5=\.@r ^ H,}S;AͲQ6z^edAmtߐ.wuoh◼u7dBNz੬U5n]|u$#x{O(sWv[=oR-*{2 0V,Xi-.ō-GER^s*Fh24[oÆuZעF{ؕ'o&t2 ;L ̙*uTҗC Z_Y_[[QFG,3+ W dbDK u"$4)χyRKmRyyF>an~;1# D~cBem5Dn,&HdUVk-93Cˍ3_U1JZ8%և_1ӋzO]9=jPb@58/YB[gzGlumXu`KkcW>Y9c'ۋ0ɚ& L_2,>p@䛁YH ub30P^7#{)t3g$%5#cth)+ʳuz@zܸS`x,|JqKpTmXT[l ` Icʫdyȁd8,7j 16NP$>VS @G g)(q˱ 5 5zGp-!wGŦ=|w|O P}r.JxX#. %c:%H{#tٗ# $ElMZc%9|lvFBj5س"ْ yLҴ@qH4X }UyA2ab=9`)c;ͶUK!,qR{2e7Tqn}0 #h@)n?2<S{yȦ7Dy>9Yi'}`=p4Ll rFCpYObqw2f[ sTU>0:@P@e{ h*a ;)ڝNRiiLFd2N`E *fX7B% `Yk2[dt )NFa^z<{$ߞ3E< T ӂl80#<9Us흣N8ܿ-zڧISSvOUki,'ua\vlndk/55-Y;lِj;O nwi{2@}{&&E/,ۛGv{@=V=L'VFD졀T5bOGLbx:Ea BwXՒ(E^! 'tLn.冊I7g)zFkM Xyt7en+{j!HXh)p^ߘHlMfeQ οf8'{2%ٸ钙N '$/_<=*c\bWiɼn9y=#g5t0Oar)n̡#TYФw|$C,<9{9hn,PXYӤ/Baj`BnTB0FnɁ&~R]|J[腆yzfP$(@lץ7&)e]_\bK%y%ѸK"rgV4>j6Ƶ(T|k$)1/IT!!z l9^ZhԾ|qMJk/ҿ2kM݋p4v,iR Q}ۛ4 9kǿL<3_yl'1YtSqePHh34p]{wW*cRaRH-JoWZPDї˗)/AVW"W`4AS㦁B0N. +%ki#O5s,T#+]kͩji^h/\],i:lHy%u9jGxO~siI%6ZmV۾!n]wc|OF|7^%KچK5rn*E;P%A 2[_̾9CP!pgV+؅Yh!Ż<V6Ha!-%}o@wÇ#L^:3p%h6Vk̀tv`wYdmlEkh7ߚT8+kR5m}4,<2zw~;Ty~cgr&hLhV9$75e29돮 MGQ cq² Izd~|cṌmԜ`mQP_[.FZ^ڍuPK;+)c-@(v4qMrD(S4Go,6{&H[OKQGcsKJ#<&9Ō-_E|q^. M(lz6m+~bydKƳɸ3mx @~ wEA)dfE)8-vzӬ8pa Dp3tS%QZZX APK4 >=<$_ <"oHh^SH].R;_ Z ٍO,0 #$&¢-1T?f9meRU:d}T5`-d5)Bc]f;zR[4l2flg4^|ixg3bɗL&l!a$D_v GnEX ɐHn( Ckj;LBJgQ+[0\dH8.h5JlR֐䦎+zvy}" FcBCH0\u|绗B9e E g|@Lym; qU̱)> I%V^ek)&~dRs "%s8Z`4Gse[˿HS0wIrh6ee![g%P/eRnYZU &-bnx|Rks KG~OѸj|+M=oPb%KT=kY1{ʡνuw Icyr@&q1B,NdU[Q{씦N&GNa!)ʵޏɖR+󚲻DJ6D۱QbT8uәdnF?}'V '0ek"]܆2/(1MݽyzgZA3윯Ig,`4x:B8$sQ |G ;5M8OgGI3b#tsyZ-il^t/Vn_3an},%#˯rMf`uxFd  G:*N!#*3o9p?s /6Ŏ)q!z+s1,]tz1r??&#w ^ȺTxs&ܞ3}E> M@9ih aj bD%Nfr{JdAԆX~<ʢfU+ԮzYX7M 7xh)'n=NQV33c>>!=&&Cǎ"/'pk3[·suEu6RG֡ wa)UVR!ólCz碭 xdSmαwG0<;eYz1NsyZA+t@&g0o!oe-\WAx +GiE u\)m7y%A/y2 XF83T Cf421WSc)!sВe ^r.0[o( e; k>WKDE1[zp$> _W!+iǟKԴi3UKq=X1F x]!&U6mlΠ(5J5DHL4ͮغKɧ-S(.ͪ7S R3G*nr fF)E0VzH5. dd/ uZJǢ9q#2Ǐ9mpƣWKR͕ 뽥ƽb(INX .#y3i׼@HF]xڵAUf k]pz,>t `^Uf隨 -“9q-Ţ;чeE⚳tI!\wlvwWjԗ.--u 8D̨zm1 Ї!lK_7H܈BII{ `agW!>-[6+M"E.?#i?!rSWuAA>rij[P>Ab-Vj=U5njO}ÏΜ 8,md܂4L͡|QGfrl,B A[=Ui o4EpGl2+NU\ *#?,R KH)FiY2m|W͕c6~ԟU<%.4'5݋xn6n)SQ=6eOw3+5܀o㤯)M|*JPjp1O^]]57F?"Q8ܸ$gRt"5gB\h MQrx !jI7:lH= ,tz8Ъᜫl}>#*&B SZzε;IY# =67_皣=Vva>* %E~m{ܖ Ϙ~OqϲϽ姫3+ @,wrN}ZMDYymqS6P1ok1TlEdch }ʝJ&5Jj_pa`Q\Âجk!G8ZT3Z &2#'Aɨ94u-'ėu'V%NinM/߾A׳ egQs:O^NOĐœ^0gym%W +Qo_VTQ- 7LBl=Chxכ/Ů d>`g* /f>|D'ă/`0M `]\\Q)gܠ,c4p_"4n,ZƉ^hB34MtA幦]Jۺ"2[鿀9~wOh3qPdNŽU(Gm"~8ݤ3Pt^t:9ì⹷W*UPL׋dXB^X iV4à4ZyeY,CRV58`{.bg( MޅNNiKLP5HYlx4? vV+|kEZηbB|X&˕c!AUf,Od[ tPD+BXȘKmlL2i\֧_N_bqu_[=aϭRG:yRQItk8=xz\^3 :t4 ֣I% y[nZ`k5t:, Q_Wn^`nYsʂՃ~Gϕ?aiL4*q,,,NnDy0s˪C_cf:Z`@q*P>א&z6F͖T.LΌ-E4AlF'6q|TLɗ/4n):tH('YYӦ/|YeXeŪ'aы֑jy[[J!b~۵[¨\aw5~ra/C[@kWuj0(h_{r@wvFb?mXS4{~d#B$۰˩TP De`7Yb^^5G-_Лj Q|Pclq]l㽼 z_D(i b䴡M\nRf ȄhaClQ4o-Ƣr*CP oG̦NN4VXmGc[&:5k[xٞT46Kz#eswѵǏ灾Z)ZӞNJ06No@,r jOXA*`)l/}-L Ƣ\k$e9RZj#;o2i-Ȍ[eaC}fuQ0$s"+0 !BXĻXga/ 7Oȶ{eѐ[VK;+KY/@uCEpX@+S6+shVE7XKylW~S*rl1sS{ݗf:[,""{q̰8aHleme\ict[TW^MoҤҁ!G`T `Gi\6;d/U:SgV{I#d2%v{GzeRv~lﶏ6?l47{v>oTfpqGv+uz9:>xIogfZBZ5h&]f)}rEW݋d-I]L@G&3-&o _bꝜD#;ϯWt֋7 pz;9BzYj]E>~(DNQf2&:wߋ\lpI j_洪@Bݥmm(!uz?\ "\:Wތ&\A5O52Tۄ;C\)aztb^\tڂ~ "I/*A3cxk!LX5 P]^ʺ+NcapL }C24~g픔@S>;cwOz&Gn278xvrҺL4Tz\6L" @v=DU=P,&&o:D4j%f゜i ^Y6b.j28ɎEtƲ4d0݂la~ؘͨVp*'"DveyQ&33 _=זHC[Dag8CR"BQ8CU`6ZfFsPkosWÂDRȋ7IÿCxgB>u؄=~~Wu;j.9!ٛedmb&:Oq?M&ѳ E%Zͳ-Ƒ&tԌiBXUÄ旪^bjFZY:@>"N[D/ *i库Q#"3֢pnJdBOm sM~z!)>13:enX1Q0T 3 =dǧYCWI;R7ճ 0zO$mݾh5nឲys.?5'0Ns)Lh3> v庼_fm4։V~*DzqfBqC{ IlЏ($lr1SBg_͡/3wjn e-!mKRaCvYYKReTW86BdlXP}mv[ @鐫;5Կwԣfx>6 t*}coo?^7ۯ@UcEi]텬֨1QDþ!RƅkOCeX5 gݿȑ<;i;$3x:s !M/<c7M%|ҥtv0{KpKRI*I%.>1#NLI*GPpH|=*wD706 ' {/b(~q{vw`pW|n;Hw ֫v ?^Iڃ7o_%=כWMk0γLȦu]ųn<ųxэxc`^Ѭ .DNszNκYǜu;P`[ P`[ P`[ Ķ[ў>N|c$A30enOB*w]&TBNTE}J%(i݇Z5Cuqjuj݆R "=i*ď5BXUKzۦv ʯWY%FE k%^W®#=>V=v:T~Āo$Si9OQ<"I(k ȣ|r+*osN' 󩊰^UJqݢߚrg]±.6Z|B %/C=gx#n/>Cpz/ <~z8Yt%1g{ξh=~c>NpU*E&Y'}8{2g%{9mO8mO8mO$mDQ^Wfv)'?{Ⱥ! x Ɋl™d\tyBFmT-]tq9< ѓ+."So,Yyz֩J@TڧK[5ͭU1ԪziYu7zfXkOm/\f GD%xN^*5Ҏ5&ޠ0z}x6vViheQSUe}YWBIl?E#_8ƨTWp2k"xH w,$^OP/OdSd_gtcsSOZ+ͻ3+Ez^ʬ'WGjO/\W9Y |(doMnH J:v+svf !C._+5qIoT6\B? &m(rQ9׆0P'ŨeWgǭb(;O#E$!C+;D[RvӟbS/? ]M.ͤM6=BNS>>B*`[.׶nX8]t*evcpL6%p5;$lM.N|ro~6K g=c f:kqY Wauml]?8n{L_{'r]L>fNTQYXcqGlo?Z<=&ĭCƙ|tkǡwx:&E'ǓM@ϡsYA,5txRKphvv},ZtȐ[{1Kjg?nxQ1^,^/#5bJ5U%S<ҷп5pUZE6_F"8\ !xRvtƁXj *d0A\YJXpū +ҰYk[:=/@li.mrdonƝMy%jjQSm:6, }\ (uaVΈl"rLj3%%s'/)UZ+VYo6ItPTmM@1p_5sM!-{6;0(ScMD$~m!ps*K6tHY-qh9xM msJzX_? (4BCϸК&gB6&dU(plPDM jR!OgW]Rhg.X'SɀA@ `J70T=JW <,tDp@G)awVhE8^a! ~Jj_BUk 륯ɝ>e&])AaeZAKwd\y\>Ggg]iCVʵyg:@ \ aKi,8l:Z]5S*]eJL'k~0_E ww[M#[OT PgКd $.&(DiqTbjw/D𤛶d8U.ɁyȁO$"CWޏb)a;}YL)ܙ>fEݛq`԰ey3se@f~"]I/0ˁ6_\eܹ;;j sXr>h^wgr,' p$DOmV\w&g6 x/#[o=}'3τ-ҫ V$ "1ȺHA&#z$7G1ӿ4s_==%O-4 /[XHlҤYMSOO)<֓x"lJi2 4^)"qGv;qoᗔxD˓$ r]v/pp|Ŧ'2H(ּ$F4AAT%'ϸfe^9 fOc`jҭVOWUm]]~qi} joj] {y}֒RHn7 8j<ܵ}GBli_"OPsyׇNu>+{@@<zo-gPvZtشBfpuIR!1D؊;SVXfd;ܤzG19G|FTFY!DTk[rҦx80Dž|d [<|78uoNu=xfՇۯ{;;&wDg<[܄ ~8(z?}~/P7H_(FGh>&(+jC@[:"{h G2q^8f7H;oUTju*ℱ~RCW g,QYϿ2f?ދMzG_?q^8+P0\|(*1c]06tǩgn5q4P,!ֲv3_Q/9"RSOxm(R0Z+ZvȠFXA 0Klu00R:(" QI}i%Ix.$ QH60GAh9oøBJԏ~]emxyx~J\eÇJS9JʕLIe0?EAB%#9L9oD}($H:Lg#@wJl@Dڄ5PUw(#$#G%0$maCK%}!)(7ܸ Ѹ+T߫UXDŹѦOAY!<̋0Iw~2ë[(:P{8P47h6|!:;El b:ɥSe_`jݔAj$ӇN$cRtIݮrKzPthPvY!^q;&L@]ʨ]D}+0+uG}ē3ToxsV@ż7/l`ްd{JC<zם6NR3ǁ-q)2!U&@A~^ MTeSd$ˉRd3FNsj{C ˗L2MAm1H$&ȇ:NCjVJȳ6uZigӅSHj wZ#zL^@z]4F|$$Ϊ{W· ;ewp:܈p[ǨQ͒"'R>>srPu3lAa ~wsO֣>JKn)mv 9M~!YDai}u%$Il8ZNh@K_vtE5lR) ,ǶG6$ [vC/ڹ:SխS"g @pR9nɚ$E'@BDMTj~]U5l햳C,n=/赟I+qA8A^q&lMdrbx!^& L r9 C/QˡT8E7".~G~{(+7Ѱ$.`;k7c5Iů! _QUu78UN?8#B x࠹+]1t-l*&]=0lV Z:MGtsH]fA@ 2A(F-f6>ȧмFdM22c GJ Vrى9cAyK]Q4Nw*Sff']R$Rg_A`ݑausrAbYb2!*m:إob¹In"/ Ij?kW5}APr%PeM@lfpSn4K$N[]VELp,e3koR5^ RTXXdP{yQd'ʪYieʯgf^8)v ~%FRZGJo"Z}+VIHmm`>RTG'`*MY'f[i4xH]e~%ԉ̾#?FDiCsTx%B w\aEghJ8[A׀Q~JNٙѿ)3ni3B*E8zX`6-їMX#0Hpc콹Xm~sWz6x,u:nZkQ]IPtdm[Mj75`ߏA}G<4ywz AsFD^ HN7𨟍pڙHga;gd8ߦߢFOIs!fw͸q>A5HTza*˅p`CPL3q]q~Wl吡Kdc:^L) E+e"y陠ΫR(m% /敪-%Bv%' YQ+e ^tY !%!أ 힉"aYP0ed{ BhnNHBrh+eTWH4 ,1fGt5T$Uxt7u+ ,x ZjFcAE Fe&ЏE|CI?tAZ ⵞV ]zHPgqﯽwq\tz}?:]L߉~CcL!W]ݘZƆB lTu@5_t [5%T܆Zj:I p7na̡Ni7`1ZJpUG͚Ф5b}0VǐDNx.+ZcYt Ѳ u)2DsPfG.gZ`n".̿?ן<fy}-h Et6$JӷV鳸t+SSnʉ{n3LppDjm|ߗ618SQI`:9\"Ø2ByTZ7rt<VM$!@cF4 ^JoM{,/E^QX4Paf=q CwUYCHf"T<. ( ?TLٺ%8`M /#=ǂk jښNRNg%EU tYOty!Vg,4J(Se$҂$?NQbШ=NxYȀ+{7<(׻(,r]WJpnZ!1fVɾ s KF]V먃.iV-aV >.+>X~nd N}H#՛oQSNJO%P|K(=^e6) YY[6\֛tHCHHDy?`ﷃ]>SSŊ[-$ #8Tnq1D0)6ֻ6%E֓(h8/-A΋ɰō]ԩ`2dPQCү=! b`/}֏9,K&/5W4@qe֓ҥ#Җu =-IAKɈRmATEO fʔ.Bqf+}-_v@=kkޙn].v@dz2]p"rW[:m[wGptnouu SwUa1Ĥɢ?dr>ˋT^B; N0KL"t(Mql$4gé)bem$>A?2QwvވI|s2;Xl-f[O;c:mV׃YQYBm*'x<--)V @ehtJ6E~`iKT>N#C̆#ę;5{7, i9ظrJ;Kb@M\<)ymCnG7Uy%]Tbiɧ#JRIgpjOpjROւj %{GDwLjZгM#;S1v4x/=0'LbFh?z蘕E1LuWCeTa6-tY wϵz1+/#U;$Px&^[cԹ qnBZ8KÅ%IA[-Iz'jV^ Qd.Ͽ{B'26r]XEE`UkkK*jnCs J.fpBZ*RVQ;W6H JY!#-sgX;k*y`,#CpKыu,{,x a;?(ژ)ԨlKzbQلЌ< ee;v2RZ([ks| YNeg?-y\ =T$LFX3UlÛ$Tiqdk>3/Ê^\$B\ןǡ"sFQKD䅋lSI J+Gww<%ZiݤU/bAޜL. HHHۍqjŐ}~n[;. i3z40c/DaOP <.5moRcxt#ֻ0z$-qR vL?Y{"g̲D [jk 4~J;` 7gó!yr[Vw.Xř=X,*A-k'+۳\N]I'3Mؑ<}u-Tp*-F"m8ni kRL nh4WoWt,GU|ejCA#-~Ro0 ?¿hXIlL{xv +Puja†|Zӄ_UԹ>NwWկ8X5n*H|=ɣɅ=DX9|VNg+5A4nYuPp<uO'jaMPئr=YV<ܝڇtaI0, m[L4d~|+\adhpWjd0%Nl^H_ ժd`&i%;^ix^y^A2٩Ffi@uZw-IE~yɤ|SKm|j>h7vàUzry&ӛG^[\&t?%t o1m 5puקAep4#9'ҵ`%M1<`hJ6 l+e?T NO(S˜n!]IGQ+9C}6ѼA'fDuT^,n b[ ˓N %YMgf{_DMx:B Q u\r(\d]ϳGjޅGTiR%g0X7+k9Ck'[IIޔX[ES ;l F0rל}d^Wx w!l p<jN Oj%|3U6L sun-jgxNSNܲ;K}W.,!y6:G/򡸾o"8alkޥZN(g.O >S+NWn݈{P;؍Ge}^Aq6%J^o{| L-N-)R⥊=.~ -לf28@K@ADp;ÝS|8| n>LyaLns fQCy{z0gkp]|V$V˿ vw;)*Д^͟_l&=i{_T9o>l/w_m6_χwo%< 1狃ˋOWYSnhT^ʱ?ˤ凥S"B ,:i|g(uǩ80Z.n'Ă˥TTM)53HZZT֏UC8J3rytjn$v`0`GsP\LC&v9. ܦby'RBpIE-MZZi Z nO_ڵU0mMٴY)`DGd+hr1<`eBMǘl307.ƃEvaf 1r3 SdR]bCkt88T1}p>XbS|DmDž'uZ ەv[Mb!NS[ZdhpbLa<1$lۍ]Vsfi"G4JiR1hI(WN ] V}zֲKЮӇc,ZPnuvP*D ~m?)gu@@07EmUA1‚ڒx5A3 > 568IRmXg2/y8{kr9OBZQr}wi6`>:E|b*i]̇ӂTZ0oy{oJv灁___)uhC>{(Fo}v؜gI!Y/ 1d;hw=ޔ=e$5zFhDkleZ.VPP:M.m8 B t}UgeS&JOF/쐁=tQ 'L~H>ޢ7I-pHYᝈE{wyurWU$<eJOŪc(՗dqdrGD󹲰%Q waMEIVnxcw"Z]a1/Ճ Ep-1hPFM21s"2M X|ƗT7:\qo7fS9hIbܭH; Z%xIXHunq]% KAx{m1'ϭa=i q-NQh)j%E>it5ؽ0V8S*4/ӧK$o6'XՐ[1Z'niO1K`h؜aߜdgԂ^>w_as[$-f$ˁF\(-~J)=:m-)d*'vGF:ZueeYW) "YE4Jaꈓڟ2>:k.E`X*Yk%pcJ&_?.yέ٬vuIγ8#r V mhLPsli&.Q5U72ew,--=*ɳI*GE>W6D^?TpMY}ԿW6c A![oyg \|gRBD@,{3>W!b*'ooM+dNUF766,tAa;HI/Hq-a}aw|.',rfxk7a^sA S( $/AAO{ %b' @ +h1#+Z{z#a@=ʫ K`]>%|dMtQGYZ59ODo8r[qe'>'zLWo{ fJᢨVhyYBB &`a k=֣8䣏^𝧪rd:PDT'.Q˼XQj[=.=,G7C0]%zj\NSsq:;]s5`a*[ݙV6Z =flm djP}2=0}+~(B7[UQϿngh0W)d LSD$r&X׭ p:SRE/8C,{aT <)ɒJ!.IJ&~Z:P;@% rI.JCu.h>cVAˈrQwIZ =5mBLTax~S{#N;xRO6P'd`dD1Hp6x%ivR!#DǙMukLKA:}[ۋ_tŎj=Rjt_ CeCDA߱ه/G7e,"uKFgol2L+ڏ&M}F{%{MWY@uR },U1 KueE[aժe*^8V(obmL+? Gqo3t , .@ht*c_2+*=^Njrc)«ޚezK+6J%a { hg^L9;SZkKkF3{*Lp" !tF%+VLb:&9rFP+jTJ}pkW2pv3m oXO* ~U(.C,1L,+SD;}x } [>Y~lm]V-bs|\!˵y#d]i9,hO!mKI]>ǤLݞWĔ=5_% qe=!疪C H* %#Tה!ײ0E/R4*FJNT\d}u˵9d%R5X<]W*kyL=A9KYnŇ59[=і|nM#˶C/[{ݮYpöo*۷_3'I 2chFkb[ Xk׭%o"&qA2'|V|"Ȋ{r !)BżU{A&PWf,y 6zn+{on5Wv}*o=}rJᛶa.JD=L/M<fJ)=T?x'kn7!@IN@?Y;y,y5&3swؾhNzy'}R)W !Fu4 1!Au2U݇=|#v_2 Eb<-:__<[TXAthRzRBp&,2p^PBBGeږP8(t~C,PRO$#+d.z(^&i\m&wbF?7b\B} P:Ht J剢ma0P^d8xK<2h.\B#}`l3L2q3/QM[X"b_arNŎSg W4jO^d0R(s_n_RZS%1FIUnVH@]q Zg> ^2} כGr@# ĖUAV*u$#r%Ւ!BKk֮PrvzR;W,p%WW/|d.qmVqٖ\D,xÔ3p{csGU50L7πEӌf˴#cx8d ,_Qq{˴4,mb]rM]0Ga<ʴzA@V 6F#V Kr_+F:q[;k΋tAH'[rYMnDX͎&`0jBKL_9o)u Vr%@i R8/N)d:A,Va%sz@hK#E<ɒ@U:҉c*ĥI3>)$HG-D-8ӛ6b%E9}䋿7MGtd- F$JiQ^9?@IG$Ft98MTVx/nwwz`&WE[\PN%>IO << IK v{xlۺ<=M(lR%ll2FdW߫Z 8kjXXhדI~l#SlD/EOa?x,BANQ 8>'*=->쿕OOwug}ЌƓ'WWN>?{_|q1P=$R I>l rUvԵd܌bi&ݜ早<*P/%vctJ!ij}=%Ϫm/W:lFfBEt>;!NOxmwC=d \Hc(a*6TB 'W=w5H[k+k>b/*c*I,/&!̮ZfC‰򎷛V1:OǗϻ^VUAңZE)b0t̶SPIf3y=ݡIHIheK+gO9]~ v9ݜfigz( ӽ(ա6BM *t`Z:!镺j֢u JzEiQjLg~W*))ÁW:lN&IWqA[I$&4DNN9 j-j6 {^3A4HAiDj(W/A grEd˘BjD$[o_%Iv To$mar8Ϋ! fò3"|A*ѥ:.휥s#4DԠ(]q)>&_UG7o=Qa×_Bo/_wO[ O*Mm7?m흛nAȭiQ&G.@0ʌIQz Bk-q1uIf{QmמfZzը mFWQ͚'ff?dTS?гy~9o?і\Ψ>P0T J`B[/_%+,"Z̕H#ɪ_~538cH~7,>7wo_RT\3ccEHK-cқD=i>*&?T]h RW^Ok$IK N0nO>:XH z f' [Эqh=Kk2M@TZL ۖd&!b-i6íܴUun@Kљ3jPvzlebnI>Sc/$<8˺Pn㗶w]BAFZw&QP+=K:k6+sPmyxuyՌH9 F{SKȭTZXïĿabGaam~++0 R^lar &hy:VxA]͑(K c`BP2?N+y"; ҘEDH7SqĚol_2A2}?=0NAN26 Ȁ TX[)G N#Z͐x09~uWb-ZnE/ͬWس1ng#3[X\4do;C5\pGHb?CLu`dk|2D=M5log 2 k=a(y;+DTOr&t *P;Gk0(YG8B ͭRZ=/-אr6K7ob#J䅨O t"7{1v;ݫ~Ӄ" eDprvJڙ{z0NE,f ~uNn\Tѝ" JRaHOG,T8:QOMETtTUW`mWLlۓ%a[dm8j3dd(-qϩyhMm8Uo3,p5Fbq//ͅy5`^^`>\,C>ap6r %UXZD:i.Қk1)P[EZ+!Y6wLz-Y J<آ˓KR8YJ\22(χSExS`4wk{8:7-e`./zTܓ"&Kx}2{@;NI5Xŏ5LlUaxF ӶŠ21rOocyt+{ƨBw[YC0.Fr@0mtC3[>%J@MI=%ޏM PKnsbwYAVXvza3x2xT89PrIq0UsApfwۂg\1HPGs*(浐} | /Y䅉r2ɟđ\›͢13NrnA$.4 'oBƖNmmqClD.A 55ѝ_4 Q"e5VzAV(q7NA5VW^㡸e*XS/\)gX uWЊ;s%+!UdXvS^̻Q6NōJaQ#p0VR _B [{[|AKp, 7fI"a;8m@K=hѳKJeCI'Bz<4x LA :ˊRoHo@.#1mf by -i tvR1e@@-m{AǺPyK/ 1'iWvqySiu!'!^-e&D6O%YLOJÞ-j>SݚՏfh1^eGV> 'Y+t]O5o١dv1i)OaC-|(+,dON]f24 |>}Br߽=$+'k2UQHy$޹X  U*oPU4H6AcbɓQAfhGPDO ߨx[EB4<9_[ QK|| lDD j!mwضTGe`,nUf=㏳K,Jrd2>R` /Z|\aU9Tv !vvEHt( KI v9`VR{bQ*zHC(!IZZ'ln=`u snGBXpN@ܦrߙecS\#Lo`RXԞTkC..VBaE쾢̇)Z4T!e=mU gF˰"F6|ZΩ"d1Yao/ϻL-Q/>AxĚZjXg`=y}tmb-].~DGGKU1WM9 t.3RMg^+la #al[U+#QgIKgٙ2y#)PQfA_ "LZ -NE.Qq G #82$Jԇ~tuB^PH߂I%"˴Z-AުvAC!ޅcMbۖkD޿ߊ@ܕɋVJt+8m]m8N墼MW {cp1[9Hd.CR=KG75Q1t-&: F :?SxNBf{C0piОc*@)/B ':':ttR*>:ֻ-m_Klh`g|:R}1JP@HAeޚ Ǥ6ȅj;]]]s)"]nٜ1YZV.Sh&sA!JW2@/Z4NZ&*N>xq6IBy-φp3< bFhI$~l~/ts=_,Cٕj]k6*96:6IhsSP5Y/'cXd{nd"+I-I)-Z8P+>f U o~ޑb VA8M@vUdcV_{v+E%s#)I%3R`!G0<Lٔc)2y+ۅuKkOt qÖ0*S yEPKl>b_K DU = o59)e >cU℮샡:MbRTV]JXGr~ܙbX(Эܙw{kgџɨ9HRXf4iUO|x, f -MxzudJbB%T_4\"f Ī0 לR<rWސB%o؞ϠNUw)H~cs&A rDetcܞU&5![&kQBl'dL>Um/0a.߯šl LoÃCCƍ$}eWK={7vX`5 ԠmF\~>bD[NYR'M utT !|H6=ZrijǥaQF>ǟ v6'ϿXh/k ^^֛y#pZh')R yw\cN"ô"kk\{;&0µ395`&e=CL$>v1 Ef1]14b>yIl؁9qq}Ǥnjlb@9nLTXb".Ç;w+|"PAFASeH]4o;`GvŨboAa06'-NlXb ,r _bnxJ,~+aA -;#qz8*N&r졗yRj1*ZkqORXo']$`x)RL1FE6H/ zq͊Y661/bww*8oxx k 6T2_  Wl!$yLB7x,OS $KN5I-i:xe~F.NCPbqt Plx& RoY' Io/YNٛ1aU͜O`X9aeNw> @?Y Ϻ_FH \]*BNwUI$έM۞ztl[9-X/9n лk=rKZ~0,*#%w*u)خݚB~+?B֞ťG\\!/ѩ'3]S]k.6*@p>@ ~;@FOs tt9/O頩oV,2ddu,S8 )?IN(۲K+pBxl*0>X"iFuL*+f ﬜%[^obhcg.V9긆T\ *DR?I-*U'Z P_*蘼ۿY!cS@;r1!q,vfk<1dTYH^ZS9 _%IL`~+sZ^#k`r[y9pՂK8WzaS.h0;Mü&ۀx%{hDNrSr`:Q|ېRb]0&^X+EXUNLMHZ=%^^$WّJ4KjXRV4.!a&|L}^!OpGMG\s5^BEC'rj}"]?iEUZ|:].;n,'cv7xܩt)j:5>mk^+ր*%]1\q]ؼE[$;&Q:G489 g׍y6DΐE:3@mv]R1)N qBAE-%!(u-jlg:M'N5<@d>yVwdU)NI6iA<ڦa8ZA{ W Uі(F(i+|U@ h(@'bK0EK/jhW0nw=wkqT7U-dtWlJWq>Hn/@CqKf=~j{ j)_{__1cc b4g=]o6"SLosL+y!!.)sq >lۊa>!6n/4kSU]PYhGlT4H$.l<j=v^}~#7^}ł/׫(!K!yGb &h$O [(,R *5]zBRlW)͎%eȅMctx >cYbP'ځ܄hdR-8.qu) _yz㱔< Zc®wã@ci% Hzh/'FQgkF"?/7*Y"H4B'xN< h ڌ7(ƀR}ZT&/GqT++f O\Q=Vuݯnk;!MIP8L_; Ԛ`@/Z#'Bgupy^yvG4 /HV#*>;DBǙ!4Dx? O 44˦՝Nʁ))*XhҠ_\sl(6͖骱mtgZiZ}aߘ-WQXȐSMq_fN戡jtS! N xq_1Ijv[eA?diANqUoU-4rW澷o;Ttb)K"{-JE |CY!IPFfʲN9/or4i$S3GٱS'{Xز2a@pQރpTRMѓ%~((@c.)>n2wG{u4Ih'UZ[B4gr3ײK;#c Xs-tv ]vr;L };O] U3Tp4Cwn2>O7] yv!ıqei '#{Xnh1oeOQגk.~"ov%mNHt)q/!ntx8MU*Hl,XDD*AGc:h=$ LoAG0`K9Ćs&YEB+M\8+sI, "E1߭/)kWIa\S.|@fyJh ٘AެJq{}oX|M.wb/|kJ1h#ZkߤߖBzi{|qp;w{Szo; =)/SVQh Dҧc|}6j H['-RuLI!oedmuUJu;^>þ2;KP$V,JE pêr6=:TLຘvo9y~}-}AtDA)\7ޥ PՂpslBWJaL1aB'({=f#J@tdI(%Yf%_ZQ=_J:/bFHQ?W?VUܛI0Ls-k;L h>k$tQV{F]҇~1{{1S};X)BQՎD(s[UB00Pc3/*.~|Dȓ2"y_ 3O.W=" f*Tw+1KѸ[R+hyb?~hX g/qc8~ĩ)V)p{. \@7qfՁh*VtgPY;{sa'5%U~4>;Q^%=.flS}Vo+a )J.!qN^QnMq5s Z`2g`_T|?%i %N`bpcR`^_yQŰFh:O)͒"ADU6cW +њ\kcK,#ӢJ O1n048՞k,buqΠZ{ 2,;hړ:mX a}Ҡj8qݠ@5 뻅nA62AcZƅiU:3n6[X=x/j /oH|"{..OiIz>k˼8rlh7ڂ 12k4!8Hrr,DX+#XU1E4xۂkq@B laޗ!H w(ZPmN,Fl\ Ej1Z`p!y1g$;G@vF `c7HUhtC]0&:8"f!&M\ьD)T-![5Hdyz ~I0[$-O:醂\$i#D!zmD|ްCNͅ؝ mELt#k7 =β-s#ZɆ-:vJ"&xy) [!gBi<Ȉ5 WՐpdkIԐd=Ps2 ?`p*hŒZ$JZYCc1!dQ1ɯDNBiFKRD'䀫E6)˺Bq4,C\PhI9m\J5=Ђ\ &>"5Xںʵ'4ㇵjq6 `;d;G%[\SW ,(k*d hyt9J"n Ln%Ȗm=_}u JsXi=R/,乙l0* څH Pjؠu. ^]җH BB-}e,HԾeycBLrKz"NwMe[9 ~eMQꎕY4Q}- H>X˭G񔺄c}[}o:X}c)y8͖SJim {^pJP豔 7}3-qf({*ԝ/gEmZՀ8A T [E˶kb,òO;Wczdnfc{-="FNc`m^'/TqrJMw殌0Z1.a092lTV4Řd3۪騣45T{0#d}?4!&\لMgj<53i>He׉7hɎ3r>zƲ}E9\Y4ɖ1Erؔ,~ @=Pn6e;;w?P* BX>THlI,ŅlPQm-cUWǎ6KB7L:!b[eѠe]HRQ\8;LWL.l Vo]BBa|d4bGOӕf0l7 ͋I7ЦCް ɚm|E$|7[L,]cAG7>SNR q(cn/^0 =![S,yk}J_2|_+h^\_3n ~Ia{OcߩV\2jmw]:iz_TMx!!x=h VR-L5z { wC{k_ սV] Bwt68{Dgh?z4Lyk2;}T ̣?66(`[?`׃?$jK0y1ƋVL URE@L y9(j /&52py/4iT0 4_Rϴ*7w{e^!>?Dhb6xt## `QsM#qeAa 5ht 6vDN `c)Y[Xf~j>40p@ ,eJ\8RiKV-ibL8&]58HNp>k'_ܖ> M=slQUD07 LنlPl;$]Zv,Ukf${ecHY2Mwgtʲw~bߞNZn`ž^pWb~ ue{uC*~ ChLBQ'PeeLLa!ti{VO7xl{#L>~L$"9Ev3KυU^ӗRw x<ya Mκfb9,%0 6!aiW40̜Y fh(Cl Mm%&t5GٿWpp} ƻ+uىuG]\gʲLG3oOiFlw /PvBt)bqvwă-aÔ/jo7ڷ~mpߟ6B+c``)"(# s6ۺ.aqbEBx{%7Wh8[d$.mXI-J)N]緫981Utް@_g)H[_\\ryBaÃ}{_>yI7FZeON|$`6>56ZI C6tR9=Ե%}SI n^ʋfr)>%*4a֚Lh f:Q݁Xw:fy˵P=_ɫl]')NF#' 7)-;'ii6;`LŬXv.x\*sR8f4.+ *v' V)UyN2mQ_g*J/\l=2!,P.6"~ӑ׬]+[kb sKY5`wC?!Y*ZW騀],#xu v,T[tR <]hZq 4J?Z*0yx ۱S'EFa1g$AY⫍${ٱFRգ~ @s S0P21)P$SQ.(^*xvUz7spAa͇SنxMrv0,^Pݧ0,+}DME'ʺ$-i"ZǚhqW1+:vJ]!I\:=OX֊Wu^SA|70G`upCO_j$Rx ޶Wp>1Vp%FYE1ڶDTp`fgm-2ne;v:=xVg/z= kʒ%rcʅ,EI,eN2Qg -9UKNQ.0Cr-kٳ)}HN(zH7GA#fi "bsC:F[3vbM晃wT,y lZp1]5'|Mq6 \{PǶDți|FpD.DQT-:}U Wnq,-(aŘ=AK +De"ItC d!.ᙝ92H"\oEoA#E,ٱcB 8dȫ !^OcX.`E9))ڵ[gCy/ћt$ʀ|β!:MC/0Q+)B1TJGY:vm*~F=T5I +Np  d^ֈckKөVSr|pV ]N~*ʳz?A/gLDKK@ڇSeQ>-rvѴ- @Y(?CDM(Q|uȩ#{RYFẲ?bQ=|HR'Zv6o]gT&ŲRSw ő}?>z`٣bkx;%G5U7?%}U\vE6 mxXlʌ!)D@{J<Zߧ_Bu\#tJϕ* #D1HHɼK[kqVN^MƽIu Ȯ+qcBtbX@IpC+"w;0SE.1*bUDx 2-YښW7]Z|_B'}] _tp<BlC|\Q|BU@Ì"UB,ѿG= ώ&q'%j}x$oez;*c,KpDף'==zS.'Ѱ7P]F0ch'sѽms.Ij( FݐBؕ7#U [q[ b4>IH-IsٳQ\V'B~P19cknĽ )-40UTM9˞f&o̞88 b 3 JI#`;)d]8OW/5dVthzۮ·~t[/Np%Z5W#qIGhX鮵"cީl)HCtf] DnͲIJ Ǎ(X@fs%D]&{jD~ etStTqA;afI`|v <yV4.OglEBrkis.è5U+rPY5F i-^;G&3z^5or%U NNb_dg̈́i+'DsD(VڶHZd@"#g5 }"9VݶW.+ 7~?UmW:XRc֑t"o2R=UŪo&updjC](6F!YWF+ |toБ3 ~3Gt&$HJ|eJ'˃ 18gwe*[PS@b*Mucc'潈Ys͠vf}*K՝8qzꃘ"L^%E Y$R t;. SG+ 4r5(zBؾ;xo_s1l'\,)FUgox B0-^,W/OGlI=7-SZjH !E+9iXOVh(#(..ٵ#?͟w6_޾yk~w{ot!S4*PT"NPn{ RDirͷ77+yfk* y2?KnRd6 a&u [a2/Ƅ 9#>Dڽd-:\~(WYuc?*Ip'lcseb.&K'f 6klƫVߑqt1M ֚<=O‡^7;>-%}pX 5E>k]қ-G8 )Χp$}U6)2H 9op7Jʻ :3uAv@ʠcJ5G.>oJAlB7F9N}ibuJ1KO 7Gb؇*&g]R<<#5/*X/GlEcx"kTP7Nf/{K/bPé.+G u2h_ " f LIy'/csZҋPZ/ܱ = tAo)LƱX[RXIS}'O2Ucqn&GH`KmuLrfYN6ၿcT}!$m?t_!G !@;Vܩ~J/A.ͅ5QI7,_N~d~6c/ GNfEh ڐt@6ijLMuXN=J@HX'T<۔Y4k,$63{GM?VNB:QS1ڒ'{eKRNB >[9]K!"+s#S e-y.dG .6梟L* W#]))^vx(V %4pg714o,{65>fWcg{Ѫ F,6X8Ui\B`u6/- #?CC/jZ9kh5%8mS \g'xXb*r{b%aqU%;zCeq?v+7_[a,:Ύs^k䧯h#7 h0d~6JnC]K5d#VeSmNz~G#yCQXwg!ed {e\(^`*WG ubD M&S\FH:I;{-Q}XYaXX/pjXw[b BjiEYgER39|p9y8L OGZ5$'ubMGwdU ndpQPIlzڣepl|{#'t 'bvD3Ga%a1 ʛXB7% U5oA 2?Dj|#C=.Q<,Yzlja-A !^}YkSLޠoyy>@N uz5`&p}_.`^ct@cݻnX)#"X0_w[2^a2c囷o߿{(B8B 0=-Nw,;tt !UT%gS::e P(ڲ Lq:ˀ:&3j*1ӛG#:&fg*vkW 2An +3"'.3/~>tQ=i,w7=ĆA,zK^wK wVK2ToI#R@CS^G(Y&+B^MN꺁9" `*F/3yaXo4מIZM;ldd{UC$8 iDH,q|_h F22.}7?0|nY4[ QB}zͭztgׇwoݽRvvۯ`)]V%Y-1Uo_2*Ʋ䲅ƻTӦ5qmt6У(D¸58΂ $$EsCziUePzɳS vܴQRe?MM+W{÷/6q;Ԣu: ¾nc]0ҫnz>bsͮۘ{-cɐwœ~.Y;ZޅF7G#Yk2eX"@sp\].ǒg)ە!F.,4PV8\ũZ[Uwn~nq 7L)3OO? 1C)yiu3&Eae;4*0:fjaRFs2hj8NLV2dWx, uɡC 2fRg'8P\bgzH/uNJ=j\&՘h$a^즠Ot:DZMsVGJQUƘ` 0|f\EԴb Ih UwZ C }{QP>G!w(uo($'eO-&tUO\ƯpЬ:Dmk=b2i>2 c YY>f $!j%x+<MJ>^s{__(B;7ᄑ)o tjYkќX L@(5V(ը!+ZES>$SϝmO@nXˍZQrD+EOROzU"4ʼn\<\ZG ;P";0]~(f{a=rن@5V6yB~U_"h t]~ءP3gɖ" :{W%{n#Tt\'NzrU3q tU- tQWTw iB%#z=u(CRS:(flƢBW%5?m7!94&:Ỹn%wƬSM\@Κ5t,>ȹG㣒 NBQbd.Uw{c"dfM x;"bֺmH&-㥋̩SA$}0Fc4Ȥ *mV"M:ʿ9ΩIƝB;C]*pl- c4bX&l^GǨ4T@ˆ IvQST+h>A8H̎OtstV>%E04GaU91{zYy(BvXIs}Bu|DFsƌ";W@\(3Pu.CvJ,a*Vj^}k`qMTy&ɳ"ROY`D&EiF:Qb3b!<;~lE~l.Ej]Ch!2.:>0p…%phD hj^WrX?"-Wy6uzmᎍn6V?NoSq ]: esテ@:FCHKQ j@ߩd6]!TB?=t+Go^F"q:Xw~@Y>=jVU: vyǺœ`I&!oᔆrN[qƊg5x-l9-'JWK1P7ZHN+=tAxpG <<YK0 "OH0xKPUݧIrӅQǴ5[sWwh{njخ[z:w@Wt;u.ʝ. |C]&ϹtVxvXݿ޳Oo9q=z{ƹҸ!TuS.],o; tB7?C `TApt߶dӂULV2(FBacna!+7/^K<Qnp$B43ɞzaC\MI"m LR[&޺>3Dsж[R(镍ɪowRd *R zLLK;}ޮ#FbVc ˴YKx,`%a쒸dsnT׎'p[& UCOR[! 6ѹUK:VY<$K;O&؄*^BUْUy:IB7u3ka R֦XΎl̗N /qlཇM(ɊAPv}it~]jv9/h N6ɴtXQKC4}7LSqQy5,tDH߆-nDd. "jXX'1iSI|:v]*Ⴛs ҆m6KLc#O )z] miucɣqoYXa՞rRCb2U*e"pr՛jdJaX.m$ 2G0`-hBiE 4,*(ElS9BJFWeRb[VW as+P6.e" # ~LSLݺ̒g(]6㳳Uc嫸l»hN.Oj]RLU[qS^\M>eyjO q+yt %R`zGzb1-w:;- ۄJL`w. #$}h/{3Qzo_eoU?'w1ዏEE.D3Ty!5J[[#K?넠M_T-] AKp/p~Vi(t*nQqC9weY|gxak릍<2-S\s'wA0S^%NJQD-`@Sk~LU9<|Yڍ}ļ.OEpFö S#c HF CC=ohF,ywM 2Ykc<1c?C'#|H`'!xvBC'ayDy/uM`l+&&DRxo:h+7R&4{5|s~{dsUۨ!jv"9dQCqg2ML ZCĆϻ:9Yˢ:fgCZr(<+==cgYlA"'8VOqK^nN*iF}5|OY6bCj V|%8|%&YDHEףy%X3y뮝F/w3%4dc`m=HRV^fߖuEkذ; ^]53e\]:/P׃#qRGڝBW|f:Umf ;36D5@Z]Bj$OcS3 ԯ^M+}ԻⵤlE~ yqѳSã]z8+ 48{"/v^dpӽ8:.x{&N$De UlǥbK2kIH4Kbf EY й9XD4 lWZHZW]qI{9܌5'Ͱ%o'ŷuΌۂSͿ)d^KE(ra_z]OĘG+%oX[YII`oZ$w i/ԙ@k#U_چ`bb 䛲%Ԧ0U}w3C*&Vf{jN jf%o ^4.jQlQ,Eʚ K6's&Bt:HaYώj=X_YNA֦iòHvWKv/"P!97go$0^Nxd՛qs[}7$*PdVBU6[hq cKk&kX[M-I-I-F,k Ӊݫi*$ʸ,dOc(WMUVϥ"tSk1| È-t["*t&fEK;1m.oߨ2 Ks;5l/\|4˰WB(Ke*~coKe8dn섓qVO`3Rv{L6HopYYlBn7RE X00O>A&@^-AL%ͼe:/ʞccPnE. RB虰HEBs|;tQ}/(p+Xbƛ(\Ő DB1[#K ݍF![-068Ǥ78oh~AŎnq_eXeBJ 5k ;ܫD#T;^XPPޮXT`<}C>kT=zP$>KMx+3npT5zHfia'(k8G%rGv=7k3хd4PxDP&3ɓ0TH_OV`y:;ԧˠ\I SBsjU;"X`X+VΞ` Y=&=T|i?p>Lu?LSg$K +Chj,h[} K;z?xs[3d+$EkS=P1q槳|u$D}w=CC@Df,j"f2Bm3DʞӥvTB7o:e/`; vbφp2.?$V10Sg7^ʳ\Eb$s {) 1f(r,?v<``?^`M7*J,-iu@ Pno +9z `l9F xbj 37cNXF*ΠڤKw j$v<9Z=2^Qw^ ɳE~=kWeu9SqtY+Fe*'F `j޸Jsy[޵]w' !]O thXia:^>󼱱&fbq#ItZ'}2*о i皫ۍrP]F5E޶wz{]5PUSe B9dvT㝕Tclݞ 5Lf `[<`}]^XOLŒSڨny YL(Zn բÏ'/'qkuʠg7TҲ(:^Hɼ8NI/~ &KOTOcGN۠D(ZU}E."'ca(*env)&Jcju߽zsk5|tS]p"L 41ӝY⹱SS%*Δe669cjK#*n=sn8|_Id~pb^,*\5t7&~g܍Yn]lM B,\#O/$d .Cqvoc*.^Yۼ迭i(ޡ8;i%onDS1퍍oDqe+~w$Hb Q9ӱV2'ɭ]GUĢzȉ{@7BHD#B!G%3}Sq=<[yCU)Ė,lLNyg|g*Ty d&8@ItmZ=vKԅl*%76_<}y < p wlE/\ٱR+]1RH'$jbmj(Ed2:̧8u`N̛1Qq0oɤ˟؁vg7|y>z03㠉!HG%ó^E+5O|е{#jOǢ:3CQ[r0rvׄT S.~Dor|v.8Lzۃ-QHb{d:ҝyu#cj~?^d0[ǭ+5J.m1`Tՠ;SӶ fľKD92Ǎ^k@`N|T|ͫiϋF(t*f^IJ*<.GR8DLrFOʼӱH$$]0amU&0em(Z1Sp؈t0((vͮĮC|+]VS+1V:SoZWl"¬C"WJB,0;a:VF*Y,d-g &olVQy-b$P ނYizJKie{S %c6P7s kvJZy%Lxpfݰ⑈+GD8eOYr[ٟtdXND٦QdRJG?HrJ= V\i`l-.Z%|DG\y )! w}t=~"TB mؘqH(ydEWwǖdll-E8Xݩ -[$Stâ vD *s#&MB.]@wz[mk227RG3c#\BGGVWa[A-ƉP8I!]D[5?Ѩ.4V#* Ɔj0XGXZ\r욾\ן% Y>-Jg98IYG9)X5$Ckel:-kwL6u,H6 T[_\/bVwlҼW.6-6mѧefL_jȈ|.h\#3W ⾒$alN0 i+1QqF֣ |wCrc єm1K>Xß}*KEp;Ǵ`n)1~'t~iE])yq;Qjyէf}D%_@Jwc@%d4#Ў&uC?qfV| 2hɬ%6~E UMrn32LQߏжAsѝߑ5bK33m U>l_dmleK}|~r({ F txD*Y]\g6N];i 4އ⑀fkåk͕s;B+utkۏ!UOv|g6~}/ֺo;/ǿm|}'O7瓿us} #a;O7^ȿD[D/ġ_?n [c $^{Wjr\ ;Y!bc!?t`zћT@{JbRB}ebZ !٥Dvgu<3m˝4Zy:% $_vQD| ީCW߮qxcсՌJ썛]R&вXk-g- ~2r Eߚ;ɓ!~//ŷow>8cPg>PG 28u=C؝W}( ]"a-xo6Kcv?kfOjENr8vӇ*I/1?NQ*t3ZTd<(Wg2YS4JD36Tv>@}}24(i]07^Q߼Q W۔>6B02{T"|_A})tcqG}h`o+N]7h)#No8fI4eʛx8%EAaiV^oc2?e׽. ]٪ R.- XAJo)tK1l8҉zlkyAY_Y&`@4/..$8jhUT>βUE="$?.ԒNwxM=%$kl"ҭRw#U-aߣlyVL\G.n~厛ʇn6\ |h_N>oԿD~5% H֗WHqWT5fM jS:gRO,s- UuxIV\bdZ+K}Z_d\~=,?j5.2KdjV#T-Xqͱ;vjeb,v4iBEH7؎&]'J'вqBkc/so3Sghیh+ p N>[a=f^B07nʼnWQxy:8[8p*[bK[>ܛOQv2)ؿCO|ԙ,V[aVl0Fu6xgq1WzFtX.z'9ky;`b4eXSS(7#"rXud!9ՑHf\s;O dlڵ,> ٯ~ ,fU7h*:ѾzXS%} ,Άm</f^Sܱ&5Umض&q"8CpXt/=tkf4nEyv/DžyD` œCʳ@sp`ssa6w^(g n>\lK4q@sx=TKlHQ><oɕYRi,㻯: RO! 2H:I c3'"zCfvyz_{1˶Џ9ˉ-[?صΝ*e2rv!k`aż72.35=fɲ2 =6ƺlkjt>C ͨzIݵ4u)yU;{8!Z&TN{ĥ4MDCR|۹cX*Dho/w.U|MX $E }`(|=YPI4*CfLI©P4pUU~ﻜ.ѡT:ܺȞgSjL6^ySZ*/FXlrS5xXf=wmxaV_UJ;'P&m ߑt4WrB3ݲ@QMƏӫ.VHdpU2dq!ю;xr)aJO:,]{R-2cFM-Y=[&X^q!Zo59HyE *'ࢇJ`1O-d6;aVQ4ŵ8z OSjL,*v+_$ϰVG:c:2ǚ'8>JޱJhg%0/83NoD+amYߟ\{rQD!8__<;o%uv1Z}$݂J&t$Efm2vؒcT??1S%! #< jpg * jpeg * mp3 * mp4 * png * csv * ica * gif * txt * package * tif * webp * mkv * wav * mov * swfD * splE * crx * 001 * 7z4 * ace * arc * arj: * b64 * balz * bhx * bin *0 bz * bz28 * bzip2 * cab * cpio@ * fat * gz6 * gzip * hfs * hqx * iso *0 lha< * lpaq1 * lpaq5 * lpaq8 * lzh; * lzma? * mim * ntfs * paq8f * paq8jd * paq8l * paq8o * pea * quad * r00 *0 r01 *0 r02 *0 r03 *0 r04 *0 r05 *0 r06 *0 r07 *0 r08 *0 r09 *0 r10 *0 r11 *0 r12 *0 r13 *0 r14 *0 r15 *0 r16 *0 r17 *0 r18 *0 r19 *0 r20 *0 r21 *0 r22 *0 r23 *0 r24 *0 r25 *0 r26 *0 r27 *0 r28 *0 r29 *0 rar * 0 squashfs * swm * tar9 * taz * tbz * tbz2 * tgz7 * tpz * txz * tz * udf * uu * uue * vhd * vhdx * vmdk * wim= * wrc * xar * xxe * xz5 * z> * zip * 0 zipx * zpaq * class * jar * jnlp * pl * py * pyc * pyd * pyo * pyw * rb * efi * torrent * btapp * btskin * btinstall * btkey * btsearch * oxt * msi * msp! * mst" * adeb * adpc * madd * mafe * magf * mamg * maqh * mari * masj * matk * mavl * mawm * mdan * mdbo * mdep * mdtq * mdwr * mdzs * ocxZ * ops[ * paf * pcd\ * pif * plg] * prf^ * prg_ * pst` * cpi * doc * docb * docm * docx * dot * dotm * dott * dotx * pdf * pot * potm * potx * ppam * pps * ppsm * ppsx * ppt * pptm * pptx * rtf * sldm * sldx * xla * xlam * xldm * xll * xlm * xls * xlsb * xlsm * xlsx * xlt * xltm * xltx * xlw * partial * xrm-ms * rels * svg * xml * xsl * ps1+ * ps1xml, * ps2- * ps2xml. * psc1/ * psc20 * url * website * js * jse * vb * vbe * vbs * vbscript * ws{ * wsc| * wsf3 * wsh} * msh% * msh1& * msh2( * mshxml* * msh1xml' * msh2xml) * ad * appB * applicationF * appref-ms * aspG * asxH * bas# * bat * cfgI * chiJ * chmK * cmdA * com * cplL * crta * dhtml * dhtm * dht * dll * drv * eml * exe * fon * fxpM * gadget * grp * hlpN * hta$ * htm * html * httO * infP * iniQ * insR * inx * isu * ispS * job * lnkT * localU * manifestV * mauW * mht * mhtml * mmcX * mofY * msc * msg * reg * rgs * scf1 * scr * sct2 * search-ms * settingcontent-ms * shbt * shsu * shtml * shtm * sht * slk * sys * u3p * vdx * vsx * vtx * vsdx *0 vssx *0 vstx *0 vsdm *0 vssm *0 vstm *0 vsdv * vsmacrosw * vssx * vsty * vswz * xbap~ * xht * xhtm * xhtml * xnk * cdr *0 dart *0 dc42 *0 diskcopy42 *0 dmg *0 dmgpart *0 dvdr *0 img *0 imgpart *0 mobileconfig * ndif *0 smi *0 sparsebundle *0 sparseimage *0 toast *0 udif *0 action * as *0 cpgz *0 command * applescript * scpt * scptd * seplugin * osas * osax * mpkg * pax *0 workflow * xip *0 pkg * deb * pet * pup * rpm * slp * out * run * bash * csh * ksh * sh * shar * tcsh * desktop * dex * apk *"  *( { "x-version": 54, "adobe-flash-player": { "mime_types": [ "application/futuresplash", "application/x-shockwave-flash" ], "versions": [ { "version": "32.0.0.171", "status": "requires_authorization", "reference": "https://helpx.adobe.com/security/products/flash-player/apsb19-19.html" } ], "lang": "en-US", "name": "Adobe Flash Player", "help_url": "https://support.google.com/chrome/?p=plugin_flash", "url": "https://support.google.com/chrome/answer/6258784", "displayurl": true, "group_name_matcher": "*Shockwave Flash*" }, "google-chrome-pdf": { "mime_types": [ ], "versions": [ { "version": "0", "status": "fully_trusted", "comment": "Google Chrome PDF Viewer has no version information." } ], "name": "Chrome PDF Viewer", "group_name_matcher": "*Chrome PDF Viewer*" }, "chromium-pdf": { "mime_types": [ ], "versions": [ { "version": "0", "status": "fully_trusted", "comment": "Chromium PDF Viewer has no version information." } ], "name": "Chromium PDF Viewer", "group_name_matcher": "*Chromium PDF Viewer*" }, "google-chrome-pdf-plugin": { "mime_types": [ ], "versions": [ { "version": "0", "status": "fully_trusted", "comment": "Google Chrome PDF Plugin has no version information." } ], "name": "Chrome PDF Plugin", "group_name_matcher": "*Chrome PDF Plugin*" }, "chromium-pdf-plugin": { "mime_types": [ ], "versions": [ { "version": "0", "status": "fully_trusted", "comment": "Chromium PDF Plugin has no version information." } ], "name": "Chromium PDF Plugin", "group_name_matcher": "*Chromium PDF Plugin*" } } { "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDqOhnwk4+HXVfGyaNsAQdU/js1Na56diW08oF1MhZiwzSnJsEaeuMN9od9q9N4ZdK3o1xXOSARrYdE+syV7Dl31nf6qz3A6K+D5NHe6sSB9yvYlIiN37jdWdrfxxE0pRYEVYZNTe3bzq3NkcYJlOdt1UPcpJB+isXpAGUKUvt7EQIDAQAB", "name": "Cloud Print", "version": "0.1", "description": "Cloud Print", "icons": { }, "app": { "launch": { "web_url": "https://www.google.com/cloudprint" }, "urls": [ "https://www.google.com/cloudprint/enable_chrome_connector" ] }, "permissions": [ "cloudPrintPrivate" ], "display_in_launcher": false } { "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtl3tO0osjuzRsf6xtD2SKxPlTfuoy7AWoObysitBPvH5fE1NaAA1/2JkPWkVDhdLBWLaIBPYeXbzlHp3y4Vv/4XG+aN5qFE3z+1RU/NqkzVYHtIpVScf3DjTYtKVL66mzVGijSoAIwbFCC3LpGdaoe6Q1rSRDp76wR6jjFzsYwQIDAQAB", "name": "Web Store", "version": "0.2", "description": "Chrome Web Store", "icons": { "16": "webstore_icon_16.png", "128": "webstore_icon_128.png" }, "app": { "launch": { "web_url": "https://chrome.google.com/webstore" }, "urls": [ "https://chrome.google.com/webstore" ] }, "permissions": [ "webstorePrivate", "management", "system.cpu", "system.display", "system.memory", "system.network", "system.storage" ] } { "name": "CryptoTokenExtension", "description": "CryptoToken Component Extension", "version": "0.9.74", "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq7zRobvA+AVlvNqkHSSVhh1sEWsHSqz4oR/XptkDe/Cz3+gW9ZGumZ20NCHjaac8j1iiesdigp8B1LJsd/2WWv2Dbnto4f8GrQ5MVphKyQ9WJHwejEHN2K4vzrTcwaXqv5BSTXwxlxS/mXCmXskTfryKTLuYrcHEWK8fCHb+0gvr8b/kvsi75A1aMmb6nUnFJvETmCkOCPNX5CHTdy634Ts/x0fLhRuPlahk63rdf7agxQv5viVjQFk+tbgv6aa9kdSd11Js/RZ9yZjrFgHOBWgP4jTBqud4+HUglrzu8qynFipyNRLCZsaxhm+NItTyNgesxLdxZcwOz56KD1Q4IQIDAQAB", "manifest_version": 2, "permissions": [ "hid", "u2fDevices", "usb", "cryptotokenPrivate", "externally_connectable.all_urls", "tabs", "https://*/*", "http://*/*", { "usbDevices": [ { "vendorId": 4176, "productId": 529 } ] } ], "externally_connectable": { "matches": [ "https://*/*" ], "ids": [ "fjajfjhkeibgmiggdfehjplbhmfkialk" ], "accepts_tls_channel_id": true }, "background": { "persistent": false, "scripts": [ "util.js", "b64.js", "cbor.js", "sha256.js", "timer.js", "countdown.js", "countdowntimer.js", "devicestatuscodes.js", "approvedorigins.js", "errorcodes.js", "webrequest.js", "messagetypes.js", "factoryregistry.js", "closeable.js", "requesthelper.js", "asn1.js", "enroller.js", "requestqueue.js", "signer.js", "origincheck.js", "textfetcher.js", "appid.js", "watchdog.js", "logging.js", "webrequestsender.js", "window-timer.js", "cryptotokenorigincheck.js", "cryptotokenapprovedorigins.js", "gnubbydevice.js", "hidgnubbydevice.js", "usbgnubbydevice.js", "gnubbies.js", "gnubby.js", "gnubby-u2f.js", "gnubbyfactory.js", "singlesigner.js", "multiplesigner.js", "generichelper.js", "inherits.js", "individualattest.js", "devicefactoryregistry.js", "usbhelper.js", "usbenrollhandler.js", "usbsignhandler.js", "usbgnubbyfactory.js", "googlecorpindividualattest.js", "cryptotokenbackground.js" ] }, "incognito": "split" } { // chrome-extension://mhjfbmdgcfjbbpaeojofohoefgiehjai "manifest_version": 2, "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDN6hM0rsDYGbzQPQfOygqlRtQgKUXMfnSjhIBL7LnReAVBEd7ZmKtyN2qmSasMl4HZpMhVe2rPWVVwBDl6iyNE/Kok6E6v6V3vCLGsOpQAuuNVye/3QxzIldzG/jQAdWZiyXReRVapOhZtLjGfywCvlWq7Sl/e3sbc0vWybSDI2QIDAQAB", "name": "", "version": "1", "description": "", "offline_enabled": true, "incognito": "split", "permissions": [ "chrome://resources/", "contentSettings", "metricsPrivate", "resourcesPrivate", {"fileSystem": ["write"]} ], "mime_types": [ "application/pdf" ], "content_security_policy": "script-src 'self' 'wasm-eval' blob: filesystem: chrome://resources; object-src * blob: externalfile: file: filesystem: data:; plugin-types application/x-google-chrome-pdf", "mime_types_handler": "index.html" }

$i18n{header}

$i18n{headerName} $i18n{headerSize} $i18n{headerDateModified}
5 3sha256/fjZPHewEHTrMDX3I1ecEIeoy3WFxHyGplOLv28kIbtI=5 3sha256/m/nBiLhStttu1YmOz7Y3D2u1iB1dV2CbIfFa3R2YW5M=5 3sha256/8Iuf4xRbVCmCMQTJn3rxlglIO1IOKoyuSUgmXyfaIKs=5 3sha256/8IHdrS+r6IWzSMcRcD/GA6mBxk1ECX8tGRW0rtGWILE=5 3sha256/k/2eeJTznE32mblA/du19wpVDSIReFX44M8wXa2JY30=5 3sha256/urWd7jMwR6DJgvWhp6xfRHF5b/cba3iG0ggXtTR6AfM=5 3sha256/IJPCDSE5tM9H3nuD5m6RU2i9KDdPXVn4qmC/ULlcZzc=5 3sha256/0Gy8RMdbxHNWR2GQJ62QKDXORYf5JmMmnr1FJFPYpzM=5 3sha256/8tTICtyaxIQrdbYYDdgZhTN0OpM9kYndvoImtw1Ys5E=5 3sha256/F7HIlsaG0bpJW8CzYekRbtFqLVTTGqwvuwPDqnlLct0=5 3sha256/zaV2Aw1A742R1+WpXWvL5atsJbGmeSS6dzZOfe6f1Yw=5 3sha256/UwOkRGMlP0K/mKNJdpQ0sTg2ean9Tje8UTOvFYzt1GE=5 3sha256/w7KUXE4/BAo1YVZdO3mBsrMpu4IQuN0mhUXUI//agVU=5 3sha256/JnPvGqEn36FjHQlBXtG1uWwNtdMj1o2ojR/asqyypNk=5 3sha256/AUSXlKDCf1X30WhWeAWbjToABfBkJrKWPL6KwEi5VH0=5 3sha256/zSyVjjFJMIeXK0ktVTIjewwr6U5OePRqyY/nEXTI4P8=5 3sha256/9dcHlrXN2WV/ehbEdMxMZ8IV4qvGejCtNC5r6nfTviM=5 3sha256/E+0WZLGSIe5nddlVKZ5fYzaNHHCE3hNqi/OWZD3iKgA=5 3sha256/QJ/69CTHYPRa0I3UVlwD6N4MtToxpQ1+0izyGnqEHQo=5 3sha256/LKtpdq9q7F7msGK0w1+b/gKoDHaQcZKTHIf9PTz2u+U=- BadSSL AntivirusBadSSL MITM Software TestF Avast Antivirusavast! Web/Mail Shield Rootavast! Web/Mail ShieldK Bitdefender Antivirus%Bitdefender Personal CA\.Net-Defender Bitdefender/ Cisco UmbrellaCisco Umbrella Root CACisco5 Cisco UmbrellaCisco Umbrella Primary SubCACiscoO ContentKeeper"ContentKeeper Appliance CA \(\d+\)ContentKeeper Technologies3 Cyberoam FirewallCyberoam Certificate Authority1 ForcePointForcepoint Cloud CAForcepoint LLC# Fortigate FortiGate CAFortinet FortinetFortinet( Ltd\.)?M Kaspersky Internet Security.Kaspersky Anti-Virus Personal Root Certificate( McAfee Web GatewayMcAfee Web Gateway( NetSparkwww\.netspark\.comNetSparkD SmoothWall Firewall-Smoothwall-default-root-certificate-authority@ SonicWall Firewall*HTTPS Management Certificate for SonicWALL+ SophosSophos SSL CA_[A-Z0-9\-]+Sophos SophosSophos_CA_[A-Z0-9]++ Sophos UTMsophosutm Proxy CA sophosutm8 Sophos Web ApplianceSophos Web Appliance Sophos Plc! Symantec Blue Coat Blue Coat.*> /Trend Micro InterScan Web Security Suite (IWSS) IWSS\.TREND Zscaler Zscaler Inc\."@ 3sha256/cH02TnKuUhQx3ZU4l/nEhG1bjDJCmP5T+9StofLRFX8="Mitel(0"@ 3sha256/cH02TnKuUhQx3ZU4l/nEhG1bjDJCmP5T+9StofLRFX8="Mitel(0"@ 3sha256/atuOPgVUYJItFQHLl/lMagLjnI8ndMpAiCW3tYN53BQ="Mitel(0"@ 3sha256/SQtuxr6y1gNHILUUm2spzTVRWYjMFq+FQUiwe5sfihE="Mitel(0"@ 3sha256/71UShHFSMt6S4kbDIzKTYrEySTuxa1ieR3VSC+uHGlY="Mitel(0"@ 3sha256/71UShHFSMt6S4kbDIzKTYrEySTuxa1ieR3VSC+uHGlY="Mitel(0"O 3sha256/DEPqi83p/DvKFlZkrIIVVn40idU5OgyB4aeRQZkuGVM="Sennheiser HeadSetup(0"O 3sha256/j1kfeqTcPv6UkMOKRpLJAR7RKPHeWVVpQG13tvofa0w="Sennheiser HeadSetup(0Z[s~ׯ@KMݦL<ً{i"!1H0hY;IQlNPKr;9|z98sTK#c/kv v*g+icR/+̭H/V0=c.Y]DD\ SM]-`J&6q^tULs6J q<0v s8K2np'QfwQ=ؙ.;Vι W3]\OA $bQj"P8QB.;I-)*&hxx)̫d43bЍ6V'̈́L(!hx{Qbȉ;53^)gihy +^?ՠt٫`a?j y0J`H7 Soy u.78zgºz7`0ү!IgJ/,i*wߥ7$FC)7lon W)OiX"@)mW4r+Tg$9T|FH|n3 ]]8OҊvf+_ r8 fQPK>Yz֠\yR wCvT"%"S͎oo|͹ˢv|Hi`:}DZɔ_ߗl*mrXDΉxtrcr{p/ͽfPU@oIF=O4HY#i,-t!hbI'b[D`t?oԋh8-l~_ P"uB٨Kf8) L42.p ++F ˄1kwu/)(|wAQ[ |^ۘ .' DwۃIØTnkm,Y:fMbGj j 6{L)ӯNkߛF!\,ʎ:B|xt Ǿ$`L.^p-h ՘g'uC;obzvWPN: K<)Ċ NP1@[[Ĵ:(R Nb#|52x<*z[Ϟ2[͜+-$uZUX(%(K4G?riFנR+D#76qaIF!(o_~?EY9斥8VΡB_yY#BKXiiy7;W PN b - LݠA)u~xwZsd"dU2Gk~Np̢* nԀR*k`*s]jdmk5*-.S8y),Ujц6@0؋d *V[8uRDRwK#_Bq@-ۢ}, "*u{jV$v%dK_K=8HWk>Yqu}5rt~WBzf}{HrB/ TH¨_+a%3%i·hzVdC1rͤYyI ](P16P/%:>#Ǯ /,:Fp1{ZRxt¼H] WlBb|YPO,n` 2I_VS8(R}(XT@`.V7Ғ:xP z6 JWI>M͂N\9KAfрIOp J#!H#B\aCLgx-C7YUFE8$" ?Kk-iO!jZ7_HnѺ,~8~1@wŧCLrX%X7T, X S;>%!oCx5~㣝v==;LmmciBg#[?Vrm_Eȳ7#~L)V :VnLBOgrG!Go(DqKc,eSi% 񰵉'}H4 |샠>L.:JHWQa0?t:?>R[wm/}kto7kWvk#s\Kin( :yA{=cJذaH " U/1 ICh4I++8;^#g߸ D;e{2Rgms(bP$]2zOtK ${AY8aJr^Ϻ BhnWD!ra*a=qLpVCu?@z`\gwѽGۯG.r?52~5ݩGgAe[$$u}y8K~c?hz/KoneD:l]KoeRѯ)ujiHM3o%z5f7]vNpV󘮁"C&G?[{n zWKDZt}$= زz&:Le!قp I=(y=B̴+ 7&cSgg|7U;uh ԿXGږtҪs)>:-p&|[l~STyDK|'Z:wd2j}r'']'D_!I}xRz,zk>ϻ B+DL7&|Ťt&}ksFw IZUuvet#K:"-C1 pP6'0AIIΦR Etkzz?M_Ί;~|`8,Kj쭊Y`o>ad"ٕz[ϟiPH`62Eb1?o7>\\t"N.\Nd쎛}޲?ߚIG8Ў0ĉz~;u_lςK] { %s;ÌCj%9WX a-Z2a1¢*4<ӎLÆ*&GËJ"]^m5+1Lb"'atm<7qNk m9u]$Wqy\܀t6"Kbs&ww~a@} 5|^ N?q7 ̀:UI;g ˹0"xhf1wh(h2'o;*K DvSه!>?y^倓 !xm^ q[e!:;,Yh##b8"e BG.9H+igc$7$ad4"kQ3k'i֯iKA]%\.EyEDLm!8E\{6 |s#)ύpǧ^V!Te2|issY# ˱$<ds> ηժm8{Ar솽x(K֍UEMa‚aQUaRđE&`NEN.Dz5XOfbf-,/Mp>f(8(Cqb,Q_ љd=@( u i@{0'ӘGDDxgpYf]iȥ& fMvيe-lKM$]G:uD5?{62QObq qW916f0N2Gp,..+vt%G;+Ф+bF}uͺ6.|moEJ%G±pˠ#ڕv`-?E{@ÛT'?t!F)AP~D҂F?ym=G8_ǝHV=l~6fA4ݢd'DᎯ0Jij)xNL)i7eUjIC)$BD,/ +7B#5%}{aP̊==mBiǰES:Lk{⪪t$gvmW^y-gyޒ1]W96-t$0́(Hg(K=;yFBtIߴ*Œ~ Ph1sBS}" X)r "k!OA ` Z5A@CPp\ id53 :a_ `X*(AN"|,d2_EO9p*XW|E\@ I`XP>A&@ˏAXK1$Xy^PS9?H'8dqA%q{hÒRAPpH)"@.Nvi8%\]=-Dc}ʗ 0G۸*}s_j̔xd!$}@?K=~< 6֯RU2|i7DWGb4ڕ(25T3no [RBu:O2Ge [vMȔGL͎[ ,pn#b:VyJ*ANeJ&e&IU*-)!Zm]5ВAGF$ sq~|r k!<ɕE)!p<"eÆxF'=ROV&*oT.bBit8RKy"s2x!m,&:\fi9VKe<dB qOcJ@t.@HyWgp%PZ׃d(˥+V]uy*S|ϑY%"Tէ9({XWQaA'L\*$z4jiP޶05袩+/_pp -9X,I#^ loēS2z ~QF)r`9_R8=ou p8<W,Le &@p!WfSi]9]t X:`VWϟG7y=a!`tLxz=<8#a'7@&ZH-;~w@rH9,hQL Y?2pw]l6]¿/^R4Xΐ7 khXgnZ__E (pZ ,B%Us-q]ȨQ4(6@F?]`a-GH:] BӋ!=8J,a[y)`b h`} m'NYS)h~slh;11d4Sc)1Q$m+V&Ayx*I=M h`(z8x &+<13S@Zså!/ˇD/GZqpEXHJCVK[l|h.Q,]oģ>FLUbGxk ~<6 xou9W0PŒʨ00Fdp5`OovB,`f`H?šْGS m`tL839S 0v̀pop|ښ=:وǠr8D U(1֑uĴ(XwӰauE?ϻp'd0( W+r n7j+6F^sqɲQS4p@倫G ݆7eB*vϖΎN^Tqnk*aXQb|kDa>p)byĐsʂS+P1lVQx.Fl@]Xev 5DZCAM`yjMn]խf7sog?Gi3-VcH]sTVvD *cٟ$]JfTCn=Y PTU=vpBUFU&U'`zx?!LpC[Vª>T7&.Ұf7Sۛa!Xd@9b}Ui)`5ۋp&ϥ[ae_anFntv_?r@-дZ9;&\St@Va4l2<\Gt+*a;_[o.b:x,&ȿJic iqslzU>+]y{I_K/柙*@XM2 ςΫʪ2!+*KYZ'TiJ1ǘ#b-ԉۼaZa퇓h_Z FaD;;Gn^U`bw Q;1#aPێШ3NHPGT6Xb{mpqd0>ywG\ gQTn{ߪ7_3 o9-/ÌHԲ04dDi'4~4ZᏣQ`1zӛb1Xa'7y!}?S'_P*be3 *Z`࢐Y<(^#+8|8xO@zQ}?{V LM?Ɵzկ&q?6r#挹'ڽ Y%e"΄@y FZ1Mof2uUނ:NLB!M r- kjrWIk)6i&\^bյx_Stה9V1J''RU-KUv bUWbc1qt+H%(KF7-ZӂOvE=MY$u(_\x[@RT n\+xQ/ kdz^4(E+sϕF=kNfz=+k "{,C/;{ɞROoF]SéRI'ekL_8AL&z)"?qrGԔ;ȇ4RSI݃#:e&1B\*WĂ`vcMЧ )Vbۍ[8y@ d}4⛏^V,eN먖8֜(j$#00]MfIZ)aqݔxا8-: 3A? ZDɪHܛ`wb/EqTĮ]8/[9ˊ^)b7TF_HH5S5F CX u VW*OʵKli\.`U3bވ0dW .Ώ{uv+ FMjJJ,2( %͜gT>,'ص _S}B]Y/3)ZgMS7˗Ebk2:5U//fyU/&P#,hMSRMv*dCDVx]mĒ'XdW6 };-MO~P8Y-I C2vmz++/wqp8&a]Xt6K"wԔX* .KmeQ6d*YJ Jm\ z%YI>&c4 82?VIzt`"r *S+bֈx:d$ɥs~#K<4jCo۾`nAdҊACA2W KpSQh ^Nj&%GnUmRPLj(%M[]=ȗ|V9Q>eNfqezT߇m V8DV%+RC-[M ɭOAX 음Bx{<>@^+$^Ey rƶ&!\p6Fw#)k;JYu[J,Ķ0>4i1-XėKQ~Eh{d(a@Bʤd:>:)&ӵw|I.}AqMy_M3_^@T7 <՜}7鹉 ((+v>d2@^ZVլҊ{iYQwy@2V ɴv=Gv헪:s~r e$UQ(S'zr9b{X[I3 3w: ?ǹ"XpIp~x@_#GzS;z!8)>& 3Φb$0M\@{@ZRE^u;?tf_Hm|A¶ $__?~چ_3¼+~yi< 1ti,pvRz)k!E%=)'gޕ3 LCIhuUY6f0yo5u_ԁ>w]N+5;/_@wejm^*f)]-଺W%f,bt{* t)tzvוf|ZUNG+|͠|uW{pxz€6K4IvtKf7TTF:ɠLrc;j:ZsܥUX^ɞjkJg!rZB?OJEk qh4Ϛf?YT R,e@4:࿄KPoіrH9ե; |D X~yXBV*ø(ugj+GO;:OFýR!,+wfvAf7kmy<d+Cb GnbLQ)5aʉy;:߬OۧR{%"y=.5U_Bi 䞒?-Z~[^1a4 x(Daf/[6,7xNr<[z)ω!Y,S gWĹIA a=zTj\ z <2t&~pKhKI%Ft4ҝjf cb݃ka Fgǣw .U etm}a{Lؖ+X݃6Z|@-dso;@4gwywV5T͈T++/&mmKLִMqdrY;ok{fO16hF5{-uMA%sPFj`{eXf=[dѠor׎cE(aVkcCmz^䤵Nb'j72Ii1R1:g@H6,+T<gT9E ۈtk@wptN;Im0dM}o)3;1CvJ۸N+\; 9kՕk!/HHF^_!)d>;ɛ#=)a_2.#YFY2 V4STP| >Ų;myD,o̮Ur1wifh`O; DU/v(|[ iy0>c$YR0Xhh^PPbF`*E$o3TJE lΧH( < uEQ~%!H1 4 Diw4ȣoɍt5fVw@K,"6C&a ,'8@#؎RfBIn;`g&kh -^낉r ZɼC/5 :/eB+˷`[sae33   ߭^g{`G{ËqKF| '? G9ю²JYⱞ@Neb_nT~IXsVal:7&ބVvJXl Oۋ8}`q-9N bZ' nIG'M)D+y$\&idj+ZצRho^g;I4YZ7ZWFVp7IѹNvhgpsB{iBrȾ-gYvUMݜwD^N-߮܋oX ڇ<ѝdTt6 o T$ ݘ+ ![dٿʛZ `?Bkv+5it*n5*ܺZCC`Ej 2D\s<xwֲ'" 0M$E[${珊DyE><,/m?9=?I%֚9$5:(p_2Kpa??[%Xm-Qe[Fk=n4xS1 &Q.t(ڜ/;(S'|)f̰PtCo^_";N"vGRNSufbb);V'̺ڏ{T-M&n7kV;vG*R3 ;;o\XKS]=vR;i]&h®рHRN~Ǽ|56<i|n.Y+e9<, (m9x c+e=@oDRT{ |=Vo99UW_WwЖe;R׺SIu]E,mTiN4s]tLlӎ֞!۱GF{* CEF remote debugging
Inspectable WebContents
About Version
CEF $$CEF$$
Chromium $$CHROMIUM$$
OS $$OS$$
WebKit $$WEBKIT$$
JavaScript $$JAVASCRIPT$$
Flash $$FLASH$$
User Agent $$USERAGENT$$
Command Line $$COMMANDLINE$$
Module Path $$MODULEPATH$$
Cache Path $$CACHEPATH$$
// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This file defines extension APIs implemented in CEF. // See extensions/common/features/* to understand this file, in particular // feature.h, simple_feature.h, and feature_provider.h. // If APIs are defined in chrome then entries must also be added in // libcef/browser/extensions/chrome_api_registration.cc. { // From chrome/common/extensions/api/_api_features.json. // Required by the PDF extension which is hosted in a guest view. "contentSettings": { "dependencies": ["permission:contentSettings"], "contexts": ["blessed_extension"] }, "mimeHandlerViewGuestInternal": { "internal": true, "contexts": "all", "channel": "stable", "matches": [""] }, "resourcesPrivate": [{ "dependencies": ["permission:resourcesPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://print/*" ] }], "tabs": { "channel": "stable", "extension_types": ["extension", "legacy_packaged_app"], "contexts": ["blessed_extension", "extension_service_worker"] } } OK1)wDj=zdvwJ,ei E0$aoޛM]W0N!!G2!Dn`i-"2=`ACAP}ch@j\s,%ҠhŪ  _>^_֛:Tu# 8꧙>:G!D;.l=KK sqas%ܖ0NQ1K2W9Ōhc8^,IB,qT QXPOڢ̞7կa/LmXhrGvwf>q&g'OcXn8}WLmNµI ɶ&#0(ilHx~>Er|i]9spfΓ0l|0+\V/28(li h4G4A ܀Qb pF%&ر@_FJΈFL}R}󍄆1[ GW=LTf*)(`y F`Hhc14]~4Y !)mϓUa l:'6Ъ ;lKcᵭEJ'I,7؆ Nl0Y<_^~}W=ۆ}~-*PvG z={ {_˗[w#eVvCt`Unޤbhr뤺,w3E}B,LC NCGlO|0xQ.S~dڮt\`6UE4݆\9BJzn3t"7qK,zQv7 5R~Olwr;$hz$5GuCrEUꄤ Q_s) ~SܺVbúBEcfE#niT~ؙI?3s;V~j! @,)sJpS)&*yN nTKKfXzt(~B WTy\6?,ť{c59J׹K= 2̔`/o^uxͩDtt~Th?k,͚Ri`:6RɸLndtosdty74]s[UFwnt~|Wy-xS},[Mj6l2H{=Is=MV2f)%G![+puFL؜wkB/(27)'r| Wa݉Z d!—k?Dm0#K!p/M@f94zY%,WzL8g懕kI5=-{5NC*c*AL?K)_Ԏ>OJ.4D?2 T ʘ9M[F!a KpsvA&͵Z@amw7p +xtx7ܦ gt!ª SًVI0BQ3`oպr0/.:aʩk E9u9JWgW҈y4Mca[5-܃_qyZ[s6~@fv*u]]Ovf< Y)B JD?k=HInN`Q p9hDb%Lo9I1Lr=R $Md%KU)3E|K&3hE(9>(JIy2XgTf$bHi*,!ɁҒǺstkr :I""{7.x6StN>/b>暝`$LryΝ 5(6r4Y4g-1-wҏ }bڋd:5S͗!§ w$C||_(pd!%p$|Fߋzze٥}YDCgT4e+ `K+qwwmsߟ :{T\3Rc2 GBsٱ˅ecU+ .cX{u!;٦@WvLD6y˅T)&K0Ϡ&fx4&ҳt֭E<ȜR8 Jβ$], R{O^d.@kf$ϸV Ÿ׆jy`w)OK:aAL=0L_Sʼn1:6C:EtZtlZEitOEp7Š6bQK`O{ѵ~jIw꿟nq֓W/,kIdnRy4$ iyC@KaVŅ 𧻓N5Q شaE9r !IhA]R"R|2ÊZ}EC<׶ ?fM#w]PXrdDJC$'9TmoFN*R[>-wq˸-˃q]!xsg kLvQF M F-"6K.$}lYr;u$gZ`CDlEkj, H͢)YaI_0|LeΙ0^K ʋjgyİ%aLح1ݫ{}_b^o:&B =Jcn H6#r`1r<=(}蔾8.!ś'Ww/OО8S"jUƓfVQ":HxLԂKGpår,1~r G),8sF&w)SSgCl8Z!qUX ʒnGmzCMsmO`IYʨ !h,Tt)x j!Kd Ӌ{6R6IU iIR)سPL͋$Pt"f2%]mA g1lQ]l͑+Y׋J/¾s)H,P-\?$%1,lpU2(sf!3 KK(Uw.`[F؛1DGW%;_Y;:6 &'C" V"̪슷fkVZj: f,^`l6Ĺh~⡰)bXi*5>:jA MpYhTwSʥlcCfv‰>mZoVmWSx(TĹ"I&Y%80I[`h5[s S}&cX9A&-*P;/0,wW_Ye0G08M(|coP^ [9!lkaMX:>< Pt#NY%Qq,7 ,4#af 8*im|p>OK}MУ89NUE}g~hFt7[2Aj>8DD淁#oWB{:T ݜ5fɤhh3 rSBX;!llV;6Z.O@Zb:` 4cĭ m yF QwB|Eo[:ố˙N,Ɇv7eߟ?ٲB q_ɽX?q\>~lLU/D׳ PNHޱHZEW/C+ǯw-UZf7a殅!eCDBija`IAD9393|AQ x0/ؔO[5&٭VgR/P/AɟaKq]LR'lM>?16s^7ٽ4Cjc[8 p4_j1w}UO|FI[ /ۈT8M&d7Bضgªdw'b}Fm>j;x /*Lk}ߚp6Z^V'U54|(J M ?fg45j3TMO0WL#R)ݞmDUHU/B+=I\;mq>6A@ aym.I,+OpY!TԲnJAr`ѡݡXD?)Wҁ3rKCQv \&5yL´ZR".7)'Jh520n۲\.B *Q-E|=FΔI<ʔ7Ԣ:ec,G1#uR].|ƨ}v8 *Q{"BtSpF5Al9Ve*IofJMB3YVKǙEҲ#L:h邥蒚IMc(18.5WxkIޏ,yxo+<eT5 ></"5IQWr~z :-]4Ӣg%\:><͖xrY̓,œg .O{?p=ooG.W3Md?ߨكXRFz*p0KPވ#0cLPTOt.q+"?];)3G̫j0DN{*)us(PH5dV{^:q^]mߖɕ m=a,4:$"%Xd h׸P .+4۔WOx70ԷluƠ./jN|~yJ}EN_Ƹ4h1i;i6,qd= s4:sS.TH@ Zn6Sچ6@d'in!K[ XЋ8aD[l(R )'؃zO'!%۔,nV(,|xᡔ_HA[ttI4FTutB I^W>UHT"$bH$'!FJAFGj}Q\_}zvgl?\I̐l< (&kZ.!ڀp"A;d0_r|v(%sƉC$s/0f˷KUHǬ6h*xר|nvlX=@ʱ"8K&aW# gBSG{!UA:$N#}Do)2C< I&ޫ7 w|7k'הS'III1*Pţ\k-Ȩ,#H% 7Q"l혿vcm\c-cP%X$Ą8*M#k4iXqPT3bq8c?PGM.Uxl!Z 9 J>v D$bXBoׅAnjҋV^bO%ZRE{Q=*ݞx6ئ&&XxxH's'Z r]-")Cl $rʐIBsh3"%5i}夨 6UҙM0QiOlF&Uc[ӽY; a`|/NCeAVk8Әog$ t:g5u 1iRYF[4 D՟=̜r:Td.3\c'_ʥ5,b'g`/N{Ƥ.Zk;W'By*\T:W15l˗XpIӗͨbG?kDxNtjφ^)kxgl4~/b.Q)fX·S3mM̐,*GsUTνb΀]$k 6'\+P󘛫Lgv4p(2RW1xRܳe/Xu,#Urar?/=-) }'%awPmƽ{vfKx.1xj2 .d~uk `%.{dxGIם2r9[/nvBwl xn]-s!hV"T8c156}i:+"*}3y6P\fo@Gҹ4]ŽD8ZxW1^r W1@`] ;@ \lͶ|LyY教mb)۰oVr Td uxnݺst`aX[֚*V8$8{Ro*Da3g$` 2c+Y>lrJj&N7S7]NV)[w~}\ɂ;,&LSse+,kv_Ϋ*A,{ɘ;` BhE\5d5YkeĶ?S2β0@UYUT1ees0;͹ A]JBl*aX)2TXWM] iW7/| Ɲ@@%ӶOnuhYV2m<0()>8[ϻa[)iLý*}XX#Odw5eF6Ghs!CbHw[@RW1Msxf0fO* {? T iےel꓿W\0Z@'[ms6_C%l܇Nr9M; DB.#A9j~x!7L<["szJb|!ɫ #E,<]~*"N<C:%$f ,NOCˆ ID"`Ś tC(y{uMH}04"Sf"#xh0wt^f3' jFNTII/O㷤O"6яN?19ӟ`JV"9LkgT(kԒ0d Mn+h:M4gDÏzىp!e:@YRxJqرJ,+U}XKѽrN;}Gjk=򒜓붺ZC` gѿw]njm>~ 8Za ;=a.\e"C7a< \Li?G)m7xŴjcC`*F.RtbF?4F;\tJD5`Bb Yo\JrEK'jX#S`2T@dxN2LCOWD{p%OX " raN]AA^XgXv]5^q9[\rD xeE%\6!'JvFvSUBWIpLXҤHwPz*FoLw݁fqb{%ʥZj͕ΗgnO )&+L8cTL34F3z\XzٹX,sQʀJuTn;TG-JDus6d\eIooHǸ H;+p;3(r.h8R"$?=drSk\BʐN=x8mW,Ru?XVouYJԳ˲>TSU J- ٭Z3 s={m`1DCԭDmBYtDڔLBL]Qج }2pRd>[=l N%l\qy kA^=_΋8:SBni}C`QS+4-L8a7@oQ0bf1XT%Z_C=2D5O̯T)p-J`lSYL'G;Lqu _fSSShYQ6w)V}"].OU0 2t BeZzRW޶4u܄&>|4IDU8!{UWofi=_l_MǶ5mFQsܾ8}ԴU.ۙ8z*uJ"[,wUp>Ž:kU ģW9Djc~êq+.iW! ?,o&A !Eg`ŵGksl>ɂZ+LV4ʝL{y+wV R6|JNUD#',7:[YsȖ~LT2wo 2zF[~s{f:Q'5ϟFqTU]/=C/+Wa/+/~9ە}e^Lb]W'ңm]+?um??9/z~uW*Ķyzlo~>wYO'Kk/C_Y`M?s&;.&T,JU[4&U3i'zꙁiHy')jOM4%iASg&9Eb>oxǐgMmEkVEQWZ{h\v/ھzc')!Mk,{ChM]mV^:tU?n۾b;Vu y\sג_;XvpO_9[ku!39nJ}3>7O=Cu^dB+4mqc4^T<\?:~o>wjѻ֐A?;u=M:ox֯w}Jj[:|ΧY}}8 xЋ~іk~_:[QV1dH^{NCnu lWb|_|Aco" ?+'/~ΝڲARa?\yOطddccv󭙴v):ϫ4iaJᬪ|_UWx9Y4Fh:3ًMY` 赉;Hd[uFۻ5g^ǹwF+gI\GsFZ'K^ݷ]+DB f= ҆,_A=נ{Е8i/5xy -u ПԧV|Q14UY3ӷ8؍E/_z{|k-pޚϷqՇlGǘ-tg9p 1*LjcڏA}ڬh23ڶ!UaЏA{m o=GVGfRw8K߀WVdX667}|'vddɬsbo# <h<&˟͹wgaYҳ| a pȽD[|jtvџBAb OȰ%-Me߃ıh5=4[ ƞmXݔG}n>&FYvo`|G?{Z>`HD%Rt45bed|<'zֈO iըŒpu夭ϊI(AKnsS'd_3S]wI1#ń8ڮٳx09]eʖ`!d7{^ή yp᳚ٞ{;w :b?7ME߷3_7\abͭ+CbUմ[g4s<'A|!:<vnp0̀sXRzqS=BqF})mt\hti3cȕ |8OH7#!s]9+ǭ¡D~07(io< 6K\&W:8 cçsyܞNIS.cGΙɭِK5)b' a@xOzeTLc:rfuT7bS<0!~o=]3?I9Pts(h?'xy4%0ٌ.rP<'o3l5Z0lNa W؄x9m&˘wKz\wE̙[3Yc=3WݒM)p։+* l3+ٻ  2Yn Sۃç6G2r8eOdwsPMl <΂ 5d6Gdj\7En͉|gڢ뺨,juNU9zFJؙ<6>}}q&Ϋf^RȾ\3-_3ʅ'>BW6E"olI|b– I&,hs?&3oaE,g!+F:_.bx[5!f/fE9iF‹gy'tӤQ{yΏ1Y咷9&.Ҹhtʚyi'rm<羝I uKfzOX۰:x_tvzq3)'Xσᩈ5Jt;9WCOAq/ y|>b~,ϋ^ s1\QOv)l+zDnWt\V77D^ %K2NQ/y"/W:0d]|:nGĞy$q H wd?tI39J{>Yi\} zҘF9fBw2MoBN ;izdr?CQ> SO(pǐbju[p̤n = 1Af,TkQtxf_oY*e4>f:^5DO5P7/DwOYͣL"#ϥ=u]*Ȏ g?y󥵾YfZsmXF^_t9}s-+'lldJ<ۚ' Ԩ X}{+)?}E?Fȃtú%)Q჋<%%ӚOs|ݿ #1o)#^g .MzX-LmeY@ԼXME>fy D>. b 0ؽ\S.6PnKG/eX63KrV@ί;WkSeU`?;zH>_mkq[{!8xߠ@cIf(Do^gj>sHK>v9搛o{ xwoʮ'+C$YwDH{`Oy{ =^yO%xU>dǿX=j21X] 3>88iy N-aw`q=W9,+npg=ؐ.R 'ƙ\_~m CP.dcDdU)xǧZ"WӸ>ϛg :E|\={k3l׬}q&7 D)bwfoػ?T*/@Pl$O#"/c*'5hOsANΞf?6[/UU uOa{s[}?ӞNzo)]Wcol_OgO FW!ǚ@Sk0~_q8!=un)u]b]lmHr:SW72؋uw}?8V˼19BZhdSUc ҆UYBh2Ѡޢ`8G@4`BF}EP_gƶ%B)3TnB#mQr ldl4PG/#psřl=a/[BCr-‹)RqKUnbO~\z릪5i0g?_A5e'qj FkTZN pղo@gEqkHKJ GPz.Dx[hfxM0cd2-t'NUBEhQ,I߷%rW4d&%NX%7 IPFƄԖ#uՇrM9@]["`"vmBMPye3"L*' E,R?r׈%̼d'R?Ac'GGܸ9xEѾ]CZNa-\n6o>:oXџ2WdS8w!m4ⴻ&s.Oy"/2@WKr7Ej$ZɎ?Uġ%VɕS+8$af,!,Ar\ WH70Cg*^3@׍Fc{tnhγp5F8=zkccex! -[L6\[=7M>Gs{B&TA" :W)HE;^a(3;)(6& s8&|D9Zgd⢽-(3YgRV)Z\TI߂;vt?j; fhX,C< lK ?tQɄT'Q:!3{nL{*4tw%НCui@ar|Ջ'{^.BD;(ϳxֈUO?-D+TrTK ST^TوáL$*  So3.h #&%݃T:@Ҧ J̔f^CPdGކF[?bl\Kqi CTF:wۅ'l 4!rLO|'qvn*SZTp@PݥZ37Z3sg1*eGK79kkh)|UCe6)Q&̉)|*`-T6(K6,eJG[Eh-e2M2t>{#A.gGNޝ^_阼٫ r|v}b-PQ=<BoBT3?u~Zwaq;uZvW/}3) IB8ve mqk, ^H;,? pximmoEB!_7?뙎]j$!)cHzwk#W u,P^XY"3;Khy=bobVgHWM12!K¼k =P,٨O4Q5qq}x#1af,31h%.{[H̏^2/ h+`uhehL1'񋫖BBobm~֦[R 6C{o ?"{r,û?O5w;) o4~T-lG-ޤ[G^USOɀwז߯nc%ȵ=#w[W|DTw ^瞊?|ovro@WjAi4 9/)F4e*hq E RHNUiex1`4K}> sBIFsa|#$b=1͒D\'`=dQLT匧]E|U ό|@,&g޴qZ(fS&4a||3%,Wkp~4¯'lEG`0u ] p (;TgR<ܤM"1Ά%0c e"aFzUDH[x}_wm0XiXYwXk'b7?HOh鄮!v08x¹O#6Y8bIYO!&Z@װα Fyv33<|y4@"#R8 ceLx0 <;3/Aߙذ#Ff~J#)/9grV}h5 ̏ӡ+]"K*2k%0r"/jz(&`8Brq;>p`Ġ +^`woa݈qVj7SYoBJk#b~Mw DŽFqh`-Y$g*/U 'ߢ鴨$=ES!#X6X",ja1V%jvȴZFhm),֧nѿH}vtꃠztnKMH ¯m<1"zHEIqDAXj=TvN+i^=NLJJީfHda x6g k7Q_F̪8=:9׏imNadROzY'/2GjHsOFu_M[x֟ǰ}IZ.fZSsr\{Ɋ濎6 $R9k:zQwUN2wYDIVQAHhiBJ\OdžЪM(yT^M50CVu/ET8BlA#|UiS5iSL;C>Hͯ IIJ(=8SDYwqNc0 40l.if '9|(-KfLAIјsbyU v!bqU8A cldc+f5j~w:jU7%vI b笂Y1 djs(7/ p cD Z&#QE800m{eND!5_<j2N&ZH {*PV2G%l-R$ǜ̏1^V5IlA_z BQK!(4i#-t3l&:Z2>}gxrOGs<=8Wvj24mMi^1x]dEۮa:~пcbKljBi[ 5NWאTKܔJzߢ].D\!?.WEޥ:K#n = `gKY mQT*;zq1 q˨չ ..a̾2IUWCޟp(nJY&U4˒nlдVNR.I-IEr9Jm3|Xf_yqYl+Jk@v2hn{C?-%g0%#L8}(cRm)=,g( %OWu[ L%a[Qv5-H<Y#-!977kK84`kfy$ZyCU)5jXmE iJcZl. ~ nD4ˍx^z yzo z v S#鐴v1QǍ-?I-LԷLU cazl{U*߿~/ºR;SIS! 5=i\_ K0UAN,h{T !uMxkbr&`(TGxz\od(ki,D`X}-l.T1 xd0ȱqmh[;]T1ltģ]|Z +zmYdcLs k3{sQSJ} &Xyu.y׈W!٭CN!QZsSMdq>!!ӳ!~aj&c(^$FGAC5 9B ?8wT;vrOv:W! /:Eikm%_'>; +il3 uMYoGb"FB@J=*]P)Q =+*'d07FxLhC9l/Fh~]#/WŞW6#fUcc1A-zgZRD/Jufn4%$~giR (5[tdPnXvmkRH%K* Sy#BBld#bPYdw4LR DWV"hBCW1J a$P߼X9t2 g^oO!%Bk!T5-ULj{lwɳGW񩫳/^7Ͼxo\4n@ U9Z姏*ԷA>j)b)Lt9C(,0֖&#bG-pV9 f@ZՒ)gFX%5sN]l-^z5,4ȵ5ZI:a WR 46ZO5P/*샌I}MQȺT-"aw:"犥΋)@TNtKxlP\pE}lUL+ꮆ3,Yu'hy񪛯IV1៝rXwz=ca/=szniTꪳP< !jn+3 }3}6b_#~Dm˷i~Huj{ACoU;W4ؽN|hTc%mxP5d>yrݘfHS2tk`.u0Os"O:9pu՜ rcr4RnG`Xz$]ٱogFʵ2GuѳeN,A=vn"+Rqp:̋s3n|*5g,G4!g评GqqWCj .7`GKIf3i?Yr|jOa)m ݶ~ꌿM믵~~N\_fMS'Sn0 }WyJ)(<'V#@Ia>عE <<4YjeWAφxqH$l%:c5!0fwp>'*dVC*+`D1T<76 LnvsPD(q*>RF0^vA ClMH!]1"[bPʑMuT~=,jZkiI=:%~ף:B5{$Bd_uySRق~nF( 0e_ivZeRLJ{أJ>Za}q6Ҡ@RF0Rƽ릲GQт,_F%-!Vo1<=kF3f9ג|ĝM_*jFDpg_1sR扲6퐤N$Gw\I  gtaWyȦe)gVnF}WL :uXZTŠ /Ҫ;{$ڊ yLrs `(/gC0,,ySR> HB 4 FK0נe2LO*aWSm6A +r33 h#-eS+zp3f#Xri kxfwQ,*3\VIhpr̦Fxrj '(6p;OFl4K8?;;{\نV.7#"h:GVH8OfgQ+id&Ek)6%F䚌JizMVɖ>/`O?+Qv/  5ю C`?!iV (1o^ =1& ShUAR3Cb+uU.ש~v{t&)o܃ϟ!=`[qZWTl}F/Ψ`d5J ;o@!AP\ׂm(9nj k .(W %A! 4щ vc>+ _7xyٮInʼn.23# nS2M؊1K;N^F [SsY2i!HplM!R{#QxiU+5Pvw6'#ؼJ߇_X[ϸKKmB;bBMz-=u6jkic;-FIF% 6v /-y#l9me֔44#7#)YۂL K2I2iob5saLӽAmjao?snU7[)%^53 ʘP"ɍ=XS٘ĕM>9,h1tAv{NiÔ}2SK!J: s, $z]q:2Rx/-=6iŌUsN 2˒RPMZ7K}x|>C+sd^Jdʊz| FA-g<۵;BJw8wFNO[[K% !%g)68Skх3}af,7uW}tIbg Fo ae"})wa5LFu`շ_Rx4韛ڶښ_/ΗBAKR/6Ά-7t[%JNDą\5]BmP[Ln;A\3\0< 6 e\Ÿ4$UN-M;7\ %A0 }O% R-}*}A-&~hKT0L H$ u!\fo,XD1Cmw?ŀ}#Ǽ\zmS0+-nmoݽl6]J`YBKEDZ@$' !ޑM(M`lyf\ީU/xi ٵ֘vjȓR]deWO B<$H[se ըxX~a ZI2  PㄧyFi*LFG;T-MgdPpȀr<ƽ2\#Xθ{<]8k `F8i~B2QnDP[ 8COGL_-7Bi[ZpmyNi/Cld-M.)DƷ7G~ DTgO?=z/ʹQv%L;/ĊtFӚ /Sl/.||osf:Oqmc/'SPF*%vh/Cx>3ktY%)X$_٩ܥۋH}{$Jˎ\7*J-=0! SȦj(h"=I|h+}]lb-K'6B:MV[.m8lwﯻg4-o6R'SZ30؂BH76qhT5ϩ~:O4Eޱ[U*)Vs \Ɵ3"0ZBư(T願wiP4ri-^"'6H=q8hr, Tn!UILRd ,wb?h$r
Loading…
// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * This variable structure is here to document the structure that the template * expects to correctly populate the page. */ const moduleListDataFormat = { 'moduleList': [{ 'type_description': 'The type of module (string), defaults to blank for regular modules', 'location': 'The module path, not including filename', 'name': 'The name of the module', 'product_name': 'The name of the product the module belongs to', 'description': 'The module description', 'version': 'The module version', 'digital_signer': 'The signer of the digital certificate for the module', 'code_id': 'The code id of the module', 'third_party_module_status': 'The module status' }] }; /** * Takes the |moduleListData| input argument which represents data about * the currently available modules and populates the html jstemplate * with that data. It expects an object structure like the above. * @param {Object} moduleListData Information about available modules. */ function renderTemplate(moduleListData) { // This is the javascript code that processes the template: const input = new JsEvalContext(moduleListData); const output = $('modulesTemplate'); jstProcess(input, output); } /** * Asks the C++ ConflictsHandler to get details about the available modules * and return detailed data about the configuration. */ function requestModuleListData() { cr.sendWithPromise('requestModuleList').then(returnModuleList); } /** * Called by the WebUI to re-populate the page with data representing the * current state of installed modules. * @param {Object} moduleListData Information about available modules. */ function returnModuleList(moduleListData) { renderTemplate(moduleListData); $('loading-message').style.visibility = 'hidden'; $('body-container').style.visibility = 'visible'; } // Get data and have it displayed upon loading. document.addEventListener('DOMContentLoaded', requestModuleListData);
$i18n{loadingMessage}
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * Takes the |moduleListData| input argument which represents data about * the currently available modules and populates the html jstemplate * with that data. It expects an object structure like the above. * @param {Object} moduleListData Information about available modules */ function renderTemplate(moduleListData) { // This is the javascript code that processes the template: const input = new JsEvalContext(moduleListData); const output = $('flashInfoTemplate'); jstProcess(input, output); } /** * Asks the C++ FlashUIDOMHandler to get details about the Flash and return * the data in returnFlashInfo() (below). */ function requestFlashInfo() { chrome.send('requestFlashInfo'); } /** * Called by the WebUI to re-populate the page with data representing the * current state of Flash. * @param {Object} moduleListData Information about available modules. */ function returnFlashInfo(moduleListData) { $('loading-message').style.visibility = 'hidden'; $('body-container').style.visibility = 'visible'; renderTemplate(moduleListData); } // Get data and have it displayed upon loading. document.addEventListener('DOMContentLoaded', requestFlashInfo);
Loading...
/* Copyright (c) 2012 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ .key { font-weight: bold; width: 200px; } .value { margin-left: 10px; } // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. (function() { /** * Takes the |moduleListData| input argument which represents data about * the currently available modules and populates the html jstemplate * with that data. It expects an object structure like the above. * @param {Object} moduleListData Information about available modules */ function renderTemplate(moduleListData) { // Process the template. const input = new JsEvalContext(moduleListData); const output = $('naclInfoTemplate'); jstProcess(input, output); } /** * Asks the C++ NaClUIDOMHandler to get details about the NaCl and * re-populates the page with the data. */ function requestNaClInfo() { cr.sendWithPromise('requestNaClInfo').then((moduleListData) => { $('loading-message').hidden = 'hidden'; $('body-container').hidden = ''; renderTemplate(moduleListData); }); } // Get data and have it displayed upon loading. document.addEventListener('DOMContentLoaded', requestNaClInfo); })(); n0 } M5SvP$&VFKH $ڞ,_ )7l0| zp{Ӕp,u݃y ]g)P+Q,7B4=h[y9 渁ߣ{j!P'ط) Ed!RŲ#2aPzF@&ȂyHjd,hTM~T5CCS!H+ʄ!:1m;vtV~3E)$N^` 4{ *zw5Y`9d7*DWy/5c1zR,Wnd~s~CO5Q+v75g!i߹ܮ_㙀#JP¼X8"Rى>~-{[g4TTk5ˋ/Y舫CW^5%^#oj{O/AȳVn6+XNKd;q6Cb/۞(qlHx(ɖl'lr83o捦𤫽A3@x*.ŦWhcC,%x# --pE+p`shro%9*: g 2Vz8E/CF1VSPZu44V.;_=JZ"C`'+R/*ƹPk2k3&lVT?qOFE20 kM f]'ϓ $qnGWֹN!ӒlSŒ{z,x&l0n_k- !'-/H 538cKyLOw8[rj Sa*gG9;\g o~W*Nw* }\Y[}OJ+*,&2KL53VF]˅Z%www<[E COF lY5\j A$ZseB'.|.X(kސZ5>g9gCwmDrU^ OM̲XO.#xWXn+3MbC(C+\SWV#0Άk#5܉_auX lH͐G%^Z9/ 2 e+{R7 Wjn 4J~897f8RUFAmlmvxoopP< 1^& x[kƁyp^4}o*VϊZA<=I}cëA@9̅ee@{{L>*I~6}} ;x)3a&MV}KڼԿ=OMU^/Sn("s7QEeFSuz1rL˜yO@W 5F\ G^yp֩K Ե2)x;5|”X3-UȿN EU-v:Ar2#9,ɤ0/C sD/c =Y:uWDzZ5U[z,|tGGbہXABVUε=() ՞~dc-JꢕXD^lbˤ7Zm#Ʒbc\s&>΃ FBbhzZ%EHMft1 RA2!&K3;25iBeG%!oó&"QPR0lu`GhClh}/"4e) fM{wqHވP)f[l:{mlwĦtZ~%_ U|7bwcp{m¶mCa[|0@ͧq_}WٷimBAgӎ0VLmq0YBû]3׬(9G']OEo:!OK1UOPAipC׼d#4Uyxa*LiFdP:Uٻ"qCiM<9 Bk0^oD=`j<ȕ3axm%V{aiʨnGb%&>S͸J#*AυC-1h !4v%Q͘I0HU)_}\0C9dLs ibP4v7,gq nWp%-imG(%c2D;Lcz18@oņ幡cfZ" I R "R%m.5g&MHjMCa8br\X"=Ol6-,I\Vxʑ<_T gBr_W"~]-VC*"6KNPO;#s`CtdהwҮ5tT=VDX^USKo0WTBE-]D*R8xplv}N}5B#BCQ2@_loBE eF'V%q$[BˢfFx9,WvCp5i=1d0!6uMj]rPXo0uףwczN&#8myH&HrΩ]e\g 9;$iLJ[boȄ~HV ap}ZO}WSWa\PT t7/Hԝ֢;,Cv Nώ&yg4Z ?;Sx c> Ǝqrϧb% Tvf& ſ [=H. ŏ<n:G]S9_!2v "l"d+(j<#{# m׭f4a`KݭV]rrA鐼\-EΫ:&GEA$`M*Zf.\S§D&5_V)%)(3~Gfd" ysy-V%Ki h"OIL(ReV8%g''d omU)+ JҔ5U4"e EHʵX* s.ta.)ƵU{&rWx)/-ns^z+a7\8p9nPBy"=> +7RcEӲ}^ү J ={VhJO_~8C/Y2H26#&"|*KW`%'~8{/ 1K0H$~KKP2ˢclJr\$bYCpF` *L.`Hn_RxT5}rq!1 rcb8$2V,*v_ zi^N*~K4kf^HeGWsy[{!bЏbKQX'gQD2?,vD0ȬdN]!n#U ຽYÁc,s (hpaw! NePv@Gs6. X,U|Yd'.պ3I#"X(ݖZ)&(" sErɠ |qm[CP_P5@j@_Ӥ04#7hB&K!EPW2jC4{}ʬzDsZQ!UR`W42dRd)Jpry !ϵIyC{0Ԭ fYW.kF41b1 ^_{BF׵ՌFL 7Kv#a,SqњK6זoPNڀB3S%Cr嚏$ÑkFa8Ԅ6+;)Q\}u)V2z9$!C㡟*MX4FK:~^!N, ~C RL2W2[xo0ya0\ x [I6"^H 7-Ec7K Vtv)"d5a07x\r&ri+ɲK Ο1(\$kYTfXY "0.mZBn͡r@F(8EtRT&t<!3% 3hAW{qZ$\ 8$e ܁4O:ϲfxW$3^J4-7*R悧 zIfׇ@k[aa`P@z4UH (EC%w.guNTA;VN>05Sr-Y`ʖ{)T[kCO^a؀6Еk& 8%M"C.y+_vB &Mx\ y-"Cj<g#Y7Ne[rWrAlP;H~EnFB˰{td!ރ3GyԭP91-\MF4\ckKciV ~;D@Ija0SÞy/jWt tr혩턤4k$ȳ)#U 3I-Ȥ0gCy f 3dՁ%"Ny5w۪ZQ)(P翖/^4eK-jV cBHC6ddZT :22K #kq4- cÌP3"0 wg6[3$lL8hUk$Rsֺ<<aNSH)xw?t5Kt#H@uq4 ^u$i)M o܂6f-yq?#AХNv3.Z%$K/*XG Ӯ:kQZi bl &ۘ"z ! [еˎ'o7l(:7ZeaD$v["޳y5son -֢h|~̤3:A4.7e]Cܖ"qOY_3@6R%KVb2Ł|XB\ UUsn+H:eLAzwҷzd\@pE 67إ@{2s.#ǃ&[3͢_Ɔmʕ!;_g-ġ>}y.f}.1E0^I g^J--xM- S8!0gZ3'D ڝٽc\@TtʿLG8KdBCz36а_^`dl͚0܏)1k& dNy}uyn|]v{gm lۤp{z'9-;CD_"LȣtWR}V}6&"kCi=psIxm|:z[OYM/ټXI-GqaxP 9mQ9o\@mDR[$jy%LzZωhzM=Q}:po--+na3qPk0Qtw pU(ͱ㲁P 6) ZXTZbTZk*,Is,-OQ+I-K)чȀL҇b&TBu`ѥPh_1hyg]nH(gdˇlYn|Am3!);^C/b:JdEQUuUuUEwYfQgCkD`^MCB]v:ڷ7uIԕ䵛ӳ sz~yu*o///`4~};zq{uwz~wՆ3km񹵳Bh棗$'0>H da5K, [q "zX,{rLcfVˣg4 dJ 7е# 8 bւ`0耓&m(YQҶ [rC`SߕTO7WDqt?X>b[H@х{c2ɮOCE4AzMT߄nȠeq &'Nboxf`䲈dLa†1i##LJۦd| 6"Mڥ[M/F|0UTLTzc-4$jd`L7n"A+!N  (T[=Nm[2 ` +F7dcF. J[Vnj9؎"l Tjw?̤ tNXm[<#Abm65m` -34yԚ>.kg,l/oUd=b$^hXoHϹc&hS` ]OATz5S5 D-L,n"=,5?p"rBOWtCuOL4ނ+ Х9L<]1g2`\ӍG4F0K)JhfHUI^5kQƏbް(Fy&MI\~VR5b>~9 jflƻqYC!vβAF<,OK]'9[64aXITmpܻ?ebĚe*a/$%u\^p2;4nr^]`o_jd^*:J M)E/ Wy=hZprZ̔3\5e,U$4 /H7/?:jʡQY>+qtШ5[s. EBux=Q"tW.jV:j> -HPKiVA0zһ2OiN*";[쥛HFoԩ |hw-߸Ĉ6]ʮ0rbb}7^97G|k}h/.OtJ0,77J⨒E b%+8e&2dJqke'<4f[t$Uk+:`(ϢcRZzP"z٣ZA0fC0jqiAi1iS͸ffV+^0PSWQhEWL˄Vl\ D`"3[A(RWlΌKuf`Sqr|j}M3,0Wp~6-v5oQU5('j;(95lX_#'ѻ8%ǯOXe 5%(i HϠi1&{b EKh ]^^yVԘkz\,G&h8#NR7& s^dj,GPeeLZsjl!Fr]8XBA (p6tpws dNs%7/:C?1^l&|=t[oX@ah1rwyu'n&~7=n4^6zO/2Z18?׶ `I N@(aD9H*J\/""E<7,hyVY/vǵW;>ml`j!aq|Q+If8=l/tg{sGÛwV/&ݛo]SSr5$k=o܅l-Wo:B\/ѓkD7=߁MпyN+!Cr]W\o}iA'4+۝~'nz+&j5ϔ)U5p#cra&N&%)H@8O3dj ,rMHLy=Qf2 ]IG {<֤ ZYeqyaV6~j6ƺBXM犥L_CaO !:?[cZ,Cqđ~;K:M&a1墏l6`%t>Q`܋ OzDIIM? sK{P  M$g֥bIKNħ9݀??t]p98 i f)s(s-6侧QHeiǎf2l\Fh$푖i +49|=fp/}Xmlא{gىgh.-[X??"9F-,,=ߒ =%.'!C 6rϕ_it >3 1=, Ke)Og#?鎏3^;>8?oQY.`Q=dސqBV)! 5Ơ_b L{p-2Ez^KF ç 꼠VG° K.Oyg}hZXQL+; a3c b{es<9_bDG9;0hfߘK]\guiF"ټVgof$Dv!=א/Tl-mYJQa1>~20~d ^t4%#s22g*-Kp6wEE~hga@ðџGSm<^;1mhbZt R&Fka4H Qu^C=c<;}AHM&Xłw5P#Y-֏~Ddž$y=$i*zEjKOPnIJy*q@oY SyU[9o^-p"\W(Wۃ;Qztt=V)pF -'sHdYՔXͤXfdی9̣ ]PjI\qS(BHP/ѱ5,ƈI%Rtew9W ?z+Xv@Y]Y`O{6M ,ٿO0k3S҃r `(/`$FB&֊JX[JIo]t؆81ϐbӠ)l l|Ou V''y"H#'xt9[٪ʜMsү[[\?/B7uXdJ4A>#6G7-4瞗 @rk$<[$9QTm*|].WO _tP.VUYM꜔ʢ%n<ŨVo,~wFt6Y`:T[ּk#%FyT݁s*˟Kjh'3_?op:X%iַt!IT3m4'0l#Mrr? C'/Y%aToZB5c sȎڥ~.u.>TKL34+EUxU hd:V%0&XM&=[DH-'Yiup{bO>X۴2|@72mNVxwTrU2|H՗JgSR:\t۽|ljUJ^#zsGߢ vwA˩:;.h=]rޑ,=K";1;Qw>[1Ç&_\ :ߡ1H|Ұz} }r|}L p7dߎ2z\zE\COIU3B\L,5 `t<)JNfF+ W\]f 2eٶ"9IY)G8n A)lłrHe;l 뭥)mu=sc6Q9;Xé|I40|O[;\6G9@Z}Ek8?+ʕK8뷟Wqg yo]*#741n%)ՎJ쨍* &NVLY/I_"S\X֧(%WYBN[mdL+iŔ\JcwYvd+\9 XPz Bs&fͶAR}Od8{..6, Ȩx*TKf݂,hn19^^2ܜmH\Pe2n TؐrITAkjCVw՛}ۺHNX$1 W -Hx8nFXF5[. \P,C4%"(`Lx%셊y2Gͽ'HoR|՞/.2;3 s;rDX{}dfrAoh97[BVlKP H"ITY2/_9j@(sa9BUvЯ힄;])@`Cjgax~lV^ }1Ek˗цGN@Z~&m\Yk5;44LsH12F955/))/;P8[E&z1t0q__ذ ԡ-]ZV, %s&+ᾛAhJ%+@䑺S=-a)ؓ0 E𸹒r+S0čLbܢ7zx79?H| O1Yqzؐ-#^7VJz+H9O1y<;,wTDIy|2R}/u75Id YA1M%M=LMum+u %9yHǏL`_Vu(`l EBu!=dt ٞ5ȆP ٱ&.3gZgGsR} MvGI=:M";)A4`Pd(ҸS'dƠwR= lϧ.k&[^š*&7RhӅFU) G =J/.6d8w)(COqF=ubC YQ?`UoGw\i ۨ&+O}>jQdjc}+jܢPj/,ڋ&tFJYF 8M;?K܂ Ő^ se3>qd҅@+/͇ _/JX&5=Br1|vAԴ5Iy&Mߕw]u'ww^ܽу7i?fHfXmģGiz^7@۟zAnP)r&_n_(ПN6 vc,V2Zπ8ujBhۖu+3*"迓/ x&LҬf- bN'lLt2ˆ/F'sM)}?[:#|4Y2K3R] ~k09)]S^XW 9rOv6zЪ`x5~έ1,JLDoͦx%?U\)yْe5AFӶ}L'͌kv] L=f % [q$&=ɒk.k2qc1qfOlx'G9w \_]5q\gk' cǷIδuSɒ \RsMZcf幼Es45F.9JIg d,B63a\g).밳$ĒשiI".\⬕a&ܺu˒p'Lmܒ>٪bmCCq=?ў)9fڞ{N)vɍOBr( (=)_a}-IӾ3=(xwz}M'h'ã3Yv$%ԫML ӊR d Gio}kVZxa4f}}y~%j^ UW~7)/rVr%ם5TnJT'`[v^#Sotb<ǧDh@oNNN&moiXZ [@6Lp谳~︱I3)r7%jܞ}l TG?Lܾ4UZ!Smٶ(37'hޔ|S=mvG2>8i؝X |-( Sxܷ4 ^i8l-obm|{@f)vt17V>v~x-j,Y7X.lUݓJr-xߺ˴ ?ā7[.5.C]_4-}V>iRHeK*;DRsJQ=2xb%*Ŵ-R|Q*GqoD>U1^| ٺw)<] .0* ] nf!*qfl=(01+cרcѠECLG?<Tp6TO0~_q&% l{bZi; JEÞ*74fNY$%ET4F >| ¨0z-5 kWhc ~X+k!dZ q7h Xn|Rk%@*#\&rY"4S7fFV _45ANC4]5:]1,/m(REas0ygQQ ZeNjsfwtx;ePp! {gA8exJV"t R\Z}AUtf3kv\Hyxƽ+ V=:"5 VKer|}X9FOaomRZZ嚅x)YɭC%,d[h5,H)uΜ6-uf?(Q<|vғГ<Y+ޗ @ZtDŽbaf4?b0s,7Wu?*d)`ND(ZPZ`T|BdC4@et~\pe4d$Aixqhu]VDwT[9nzf[ɾ]5 $4$bIYs tqZqnZ?5riSA/t;6,Q{fQuuJ4B~Ywm]mTw=c V~Nks{~/5v:әdreۥ͒ t:aƦ HmI~A|,KCwDŽl8? w$޲F{ԅQJ!)M4p/CxJ)kB%>$@b|cH!d>oD:G)O&,.@R?a; JIs3 2a b =p 1\1#C~t"s|3>9^]G($Qp -- =sZDV!-${80F'!TOl BX;uXbB>&&T.3[~ct )lW0>MO |r{'5%fbHwKthb$Iʑ)D850NW!JYLs6s5c@j,9[qp&Q'xaO#./e/ƞ$"H.U+Q8`7Q C&]1~@BLJ(p>>aLVŰfSF~rܡʺ0 ;`m8gB +s(\Tл&bZӀS鮥E&uQ~>w3j2R rY"Pf-t qD%l8;ЌPx20_:SB;b\J AFK,${lj!+n1fki=13 t)|NoE䒼4Tt%{`8($TXT^F瀮'Ǟ(2\|H5L,m7%ytzgi}a !1pJtqtr&oˆE( ]L%y0VzLZd2@}ohFb +#:.tH/aUIs]}6CBIt] yN_^wYn ? 9V{xP3D[ѫiXN& -u8I˂A1ct;%H1C,Zf FKBsVPZ`|[M*E=Eʪia\p}?Fe~:Nd40:L͚My>]NқOut}"1 7^;gvvOgݨ¿>Tl)o3*/,uy&-'1/7f}OG'^*v{?zmu2I^MfwϏhZ?\MZw”3<]bk·Z>Þ'qS?9 Lpc23ܿ e9a 榦T5*{'_qf y-fo !wR{ă^Ls~y_ ;la֝Vת`q.k5~kRle:qތ㐒6i*y'Ȏٰ~k'Tbk9S Opҧ=mEI*@ls"PzLUҪj=@ѿ8o#kºvʄ @:LwC@ !0]C礐 ;^?مu+e!K~z󂮸 L_[4LkuxcbPDt](D׺=5jK:10Y1qVIKZe<æqԩgQWUl} ^i ]( 5rMODMgH,7D)Y*Q M}M*օ8,vP#7 =cr H6˗w2?JΜX}aH%dK74lt31fl2b_k q']o6ݿ$;sm0 Afeh"I `EHIdɱ$Fp-~_q.jBps 4d@ #Z$7'#@ΥV:D.ZL$0OݤR [ySAfj% 3j|0LF''=8?X˥Eh /~/+C E""I>q6MӕJ,rS3b5b1GIIu"hU[?x 8kԚoP)\[IV>oE?/Q>MDguC"^%D@2 0OVx,ErԏZ-BgZ`˛lDAW ]rsnED7ЭJ&DS~-X  HRsDe7Ʊ\J7S"Trk-zWa[b!2[ʺr!\ BL;vBDU*XЫO%|ޔNZ:-$uI`ƗIP!M~qcСe\Bg+םuPplsh5 0 w.E.`ז(p&4U rܡ-!%Z`''z*INpѐL ^ٝ[僰mb~:Uɠ٢\{]RITy|YqkL&VbH[@n;,9mJ_וBw ՐYxRgnY!H\ub>4#6 a2{u躪Q<@5%ZYyH;:K?O~ DO+ \؇1F\GBp?Wds]l7;-^{k\IM%߇D3g.d/> t*lKjuyʵ\o%DjY*@jJ. FSuɇ<oLۧmw)@< Y}/nJwg߶CN1a=tM'[6b0.Fm7_{AthmYj=&y:#u-Sޫ4=?B>&2U*<̽PoЌFtg<\n>níwHv>VLp˃9I9 YG~`B A1?64'q@NH|q['pRt/>7?N7;jJN_g^ca ^-?^?UQo0~ϯ>5T42])ESvTX]X 9Cq`T< Q]vc%#+/Qtշa{NEs[ΣVɓ]Dz75Sͤ{ W A3.0<ݳY%jqx_=?RVmdҖ.I1.X)"|EA:tj7u}3n~^ 3I-wݡ0y۾a{\ro/<>hc6OcEm܀VKs6Wl.ȔCrܩ#wj`܁ȥ4(Gw[Jf:偢o},&7/#,r%mirt ENIBjifd&,Un`RCPH5ZO,E \rG" NVp{rERL[}$6fD#/0z,q;iM!+rH!2hL:Wl9J[ Q.e'5IN㖑dIOy/2 rbXX!g{$hwOjx^!动`eab/ mFU9ٌ{`=s:aܯǞ*}:rdYlR).[@WvJyb$λSHr*2ܣpR ix@](2\i5۠GXΗ-5/ \;꛷[;Hlʉ9IƞG /i&gs-_=#`wDu|/R6 f?A-*@*N;IKg𘉻ʮHTՉ&|`Lc~9hϻ[R.*TR55aMM@?Π7=?y&e nC?ow},-fYC;(OnpUOi9@8AuVN%`;Ttc8Ikxm:VvV # ]s۸]b39JB]|#;wrNrnO,\(@@4{$b-ls;HPoزr R, @ $UTif3(5 SD)3 )V vqJCA`刦7DCF8%ρqIRF#CKheZwjo?d5goZozle [L s^?g=z.8G4PxD*=A&}5uXT S?荁Z# rlʘj{>8,zjcgmA? GJQ|&Tv%CfTMEVsDLiG*۝S 4GȞBe + JR&Ee"~ty֞.kMn󏷷S^p]-yzy$+On<߰""+ a1?+v_iEhL{0B)4Â14Lw#\&S/TQvD1?PmE7Ȧ؄*K2lt[ÔW=,AtύK}OG;SM=n=Xu΃Jn0qq}LW;Ŷ{C:Ib4Vx7p4JKXGUebQZآJu T ;!FY75Jگj(v^[0t]G~2pw򭣪FSGf8ݷZU֨cvL[h|+ABK=i`Nv;f5d 8uD|!iV0`V9BKY(_pZС T'zm6*'N#(6`jEk)[ (Bn }I^5 dǧu\$ \tq*;3Ǒ*jQdl(b9+1vlS@k~̢Rw ];`~HԌ.Ù ק'N!g*W Dwzj<B ח9d'qӗ|>w|>c> ^wnƟgjy__!؍HOڝosq͂pv B풉4 5;8m,+ǓNr`>F"UZҭ4#m0F$lBv`p $9/ҲA>f߅s)ÇUlp;+{NI$1P2XD9)m&f ǚm{/>$,zr3DPv 7j 2)+i0kpUԃ^Ռ C%цQKN~Q""~0aa̤51PN2;'?3>ҩQ)|$Q\.aUE´r'daVnsBҀ\|`2,2ܢz.Hsl-Y}?jD3]WSJ-坁9{ͨBRXuT+l)\~pA]V;{Nk~rގ _~hbUتj~)ڔQSE >O{v$bEզM^ Ь'do5 &*VƹbkNUDz-%er9f:ɨFY$ FLH*>;k׊E2r{Qad!.^y=]Nnum:g:1'Pz2k|{'siWr3[ZsͬH4~'}XBf:VU!]"*=cQ˲ GpH[L ?ʲdd ~5w O)m#^E{m4 "YX%<.KQ2#GS}{w޾'-ԍ'ytŹp/xY\WԳbF ~#i\iN{ͼ_Gq92^2ȏ!@i)-0)E9) B%^ӳj@$CBLp^h }LR@c;1"/ϥYEJJa<үdSS'bzfvm'^Ou muEb;W@p0]dOIxرKU1+D4ESzPn^@C"\%fE[5Z3Dh^-vdŲ|>׮V]=viLTF/Z5%Eazy]u<X9w0‘5xE=>SHccECec-m0H]s x #*_z{wSZ5Ibsp~RK'Ŭ8Y` Nϱ^Y2eRd5 ,CEw{M'nʟYSAF-=ZSLF&S &S(YBl{t(>m7d; ?IXjՆ_NHn:1!Tb6:1M%K^E#fADUd=PAm*S;pɒt5{I\oZ{S?99JUQO0~ϯi)I{(bZxKv8II!w>>' Ty4GV3Q࠲҆AQw2ѠcƢ$+&`saJh:Us3p)J 9r ct&Ivӓ&@EfϹI(-ykR >ElA&T uU$Zl-%0 #$R28]?ނI%S+m]!e>Q`\)r[ΕRKj}tw^x[B90 :xtysvjY7k~3,vh[I˅4t"9 g/sZPiY[̕KjkдJҁ,3UeݰnF)K>&ěu&6{ Ŝ$\Yo=j;C+i *Է#,Зu~c+ϲ9J{* Q*NI?Htf256}x;UzJ{x|FpGHw!J 6Ci_rIo]x}Cl pia(ΏuUfb] $ ͵a*1ȉoӕm5 uMn6V@N$sRrD2mqg=DXUV՚1kUUW)Ioޥ) zWQlgS mDt="D?#f޹n[v&' :i/2iv;jލGiI_cMX|79ržU^ , AhReQ?VӴ*{D7qjD1&xnZ uR Rj'.]1buW-ѾǻfgV4ۦgX"Y0g oT͠n}iU#0+Ta;=nFD*u ,G#͹ۻx;xSׇ?n~GjzȹXo6_q}96  h3;2idEݑԧ%'iN LfCbןDɵpD*e%Ҡjp0A$B8D2?䖫ǰ?Smv)TD@C$32-Sp͘a0)\E<>dzڠl:.V}$x‹[sgQZl e^/x=.Hj <0]0s-naY,iqmRC'_eD5)*$kxNL袞.Wˇ]sa{/{_TY2 Cؕ06(vz]d%8 J{ðB~?5d i"xxX( -9:| '䷃T|= Llߘ hUʟ:,Qæ(+>%*xS8za6 RHHOd1=6xC=y;t|Zb琼*^CGzc{/U,EQ%z=qm *nVX` жf]gys7.ʞ9F bMAjڕׅFak: ѹO`9+)6}psx0fywJXJrAsCIYT&NeA{1W}BF' ^h)/YՏԟ qE;MG&G797GaZ7˙b$Nynhz{%`Ibc?\;BBzm_Gɻ_Z ɛJɮ; }x~w FjGT;U⵵JL.b7| w& PgV8n8c뛣#:І v-EK!+C2jhb_ULTnaJk@-hʳO"* Yuq]xuwn| )&}` er~@RoK,ֻ?_;dWKs"7+z2'=*^UٔN)Ĩa DҀ)4/0~l%֧{crk2wwa .+kc\E Z4kl0A/҂Օ2-qh oç#B!3TA#-tHE_W7wW`|r2͌,6p'ι9,iȼ8ENkr/x0  Fʜ*Ln["/0XgZ{Ӥe"5ݥ?cf":R9M 9!\Y )vB\ɰCd1<&X\*n„׎o|+C׎gC#zVeWpdQ'JW~xvVa6dke88Qh^@.G;hbZ/~v!;S4i/ihDl6c8mo."n(9Pl YJbG@ӓ]Wx OC U>X`>蓖&kD B7kA3D/l)}\(ӫ/K$NTO6rS':Xt\"ɟ*Lu'3ql**ZTH?VWT6uB3"fۋJ~:7"HMXosŖ%ɢ . I,Җ>oϋi`Am2|[rş(+2B)篓F k%^~ %Q8 cPkg`ЯH,i|(&=J(5RK,b_̵,25+Q|HH ~9Л"(d&^")_q`]E>s_H t-W=KPZq>m *aij1":Gv8?&Mq_ubiڮ<K/˛׋|OW_Y<\gD_ v7d >/ -je\N@oΓ9;n/K|]au:PUIt\?OLݝ>0,fLS!yfxY: ˬR֬ Mr+ pW Jr(eQriYnuJ(Y%Cj ^ˍZ}; XAJD:riΖKh>RӎzyI!|l|Iu*$ydd=.G, X1 b}l^"4*r KFZ$Q;1:##FXYS6 dߒ~ \z7(5z!4=kp|]/e!A[`d8*xBxp*4-@-h{W!,ʼżF1f U:T*div nMQyBWtG#pۢQQb'REÃ4CH M%r~]yn5QMa$,0|BR^#<Zn. ks 0mzZǿ}DMCa -`=O_˂qvc zx)A_q!ѰVZȗوb\Oau3ujqY us(jxby>^wUw2(3x(z z jdƊ:=EќaWo>jںna; 7mk't]6bgTg6:2/Q)=FklNSD`CRB#Wq=Yx%Z_XRiJ%#"W 9 Q~~8ρBf\ǩiX)텂F*Ny0X#PsU2`H>0KXHL'$7vlһbmp|pا@B?_l\8Ө?S  \aEĵj3ނMaEي s!H國;1 PztaS,]}1Lzt<:zyH/-x/MͿx=LPE~>"hGʹ/lCshgM9r"3XqHdJf*f$ωd3RޭYbĀ˫A[ pĖ;Dx QFy(BlFV`yP# bDi|(Df7*.Das`xܡo|If5$E%z*,DkyT?#D܍$QS~Sj,oJf* }uԎk< %e50@iER._A\ɷk7,C{`J #R z%yF&4@"KȓR\-;&\p~׷B>Hw`&.'{;bu&W$]k~ױo|.YE)/>|6ϥ7*A _gpp :Af!Y[+׈g5VH@!Mxz-rګ&oڑ[<(wDž|O4+-57 i^7Gdpp;*mWi?faw*Qs~mRMC'K^6@g-< `0,+L  t0l +#fv0~Xθ~ё]"2:sg TJTVmJlU 0 dpP)y`3Ul6$^R'vu߳8 `K,Ӵ賃o28UV]lV m8^P(Qc{-P8m 0 -;h{Oq*šNȠ2|X? Pd>ˍNIX&\j%Rْ_Kf0,TJZ^" \<@4`2Ij&}YTZy ݐJ4Aբy,xK"۬ u7Zy x=KiƁ'q`@g.YKy.!z*fCeUT\/X20dV>bigθDQΆHYGހRe7֖3&Q,KT lH+^_qwM'/3{EHhz⫊02%eQdZliBz[>XYx-NŪHq((݉IlҀ[__2~h諣_/Ϗ.O^_̞&)[8ake( Hʣ `B] b4S.N y=` "&SE z*O9^`78yJU3I)*/[k-;8jxW7)4_d7K3M%pkG==w ) ঺= BAfo;s$TCG.M0pG^aTIP:Ta+)ZTnZ͡jG zl.<zV+H8@v8 dfŗ]Wp8-K}:ӛe1 ʼnA=+ZͫM;Z]D\a nsWX'릨dڡ<$)L/Maasj`\%v\fRa*9)StRRrr}}>+Oެ0pGnDfV36fI(:3lU!'Icww{2|M{w[ܫ7G45V} B1/i-}?ux JX5d-/?#VLL)S'Z*/OT{s*}Wu`mefKuiy˛Yd nt · jtr,:t2/hk)KD%1#&D1nY27hq*f%BE>Z}soylW$uf+˘L+28CjXy'^kwQ^ḽ]k^W`m{NyNjټI<;TRl+;|mgd֥z?-?-l7F*G_ꘟG]LWeÇ '壽πVWܘ0Vo;xg > 5yICWm#˜2 Inspectable pages
Inspectable pages

UMo0 WF[TN/n; P$:V&KD _37:EG..tljjE~]/7/#%ig20'[wbOYD.IH,R& Fl@GF j6w ࢗrBE/V" ~yIFh[U6 30@suK|6,H|wMka)]je =EНbԱ'RfS^zf {wvsJ \qRgņ1\N"4Jhy vS"ԦN\uibyUoZȇKigA0EI5^qځ6)3Ӓp{y%Zlgp>.x9B499ЄRlU[ St%X U@]tLVy7\ǰ^=LmlZ1d;0r\yy;EK97#/"GZhxm''u$ Yz~@/$JOGqwtΖI/ס5cX޻[< 9똨Y$D^|Ӈtаָ My8t!G 圌@D麿3%p"upcV8=E{>1Xn7}WLZ':K8 (JԮA!t\<2پ S\ۆ/ f룡(L0{4]M4՘k˜h&zȱȱ҂mM)d )+&/w,YfS`@7d_}(2+'ǥS8~3Y$ Ksmg3gdY3~6髀 ImLAxmv# IJj)˙4"H!' ,SToO`dƶefg6pZ5 gh m 5#|3_ao ,HfT\X1 U<)>MRiwݡb;4%i/S_Sbꡧb|䩭_[z\ktkI;/uK~@R)^Xx9_%|Yd|َbn"fGc£>RMG{;2$;`&0wL δaSg-< zn-h߬9 /և+#n;˵x de*K6nwr(/19W:g Be8SC{u3+oG4_} dCch1?wxb Tud^ yKgF\B|,:|??#rj?&JsgTT/3oXS!U+V3ۣ98(ƮaGbQ}S=0hXI޻(R+d5 ))i7:W[ d%q Ƨ,go&O #=ȳ>S?xڅ.ʄ `,%-QR<]N;+*m\ C*|;Vңo(62 0U'JD*H֍q8'uжZ1"8*5ߙ01)v >'2Rį'ag$8ʊ$oR*Q_ܨ?#Ȋ{ɺYKไ5>J} 2_֩,RZWYZj,sU*׉ZlU^_|S7L,]˚uܨe&JWE'*]7gǧ*tӯ~VjNJFJ\>YoGUoBWh~$ӍzbQt7vHiT=*N>f@TM-u=5MĐJ0jPSWP,KxQc4b (LǹafpZuZ;Q)f.JҺ-۸HJ,QrG2Lg dDBS^myGYR˶w95Bb?+!'* $o iJը[#UY'ZS+hsmĺMܠ*UhرYCg9m|Xv@kHJofK~mewo.O 7٤|5TXĆdZ)_.^LϘ3ݷШ3^dԉ5DDNaqW.fA1C&UZ6r2⍺=PGna|n*wQmq'[A^89 e`JFZ#bZ`uLAfcD~DWCB2LNA=J=٧$S|"RWdݮ^йd<"JgpBFlc(zz6H>nqrA4g]1u}Vq0P'M!0EpN菄+*]Vzj_ c9 ;'YͽDb2ph( 8C' 9@"mQb'bB&Ob uo1X><<pjW#G( by92a Yp5JaÇ 6oyg:_?/鏕\Z_'9.,[}Y#u̬t&so9ۋQօ}6|f]ذf90ɞ\..p{7ۀi,us2p$,.זIỜ݉ls&h2u,]oŠitz7W[6bl)D6ENQmmcm>SXЀIU Z QI܉ļMڻv ٰ7ŹS0Q'2j۳̞I3D/L< =AȀ܍`5r|A1g6%2Js<՛a/u؆!Mlk+J4u#uXY]0_uX Fg]-%^E?| @2~_.v ,eٽZSJSޏհ})(ͺa44WħhDuW2m6XhuaQm.#!A+5`E`&vZ?/8#|/y< Fڥt<;a(f9Wy맾:%I0!9z2/+Hw;-%\/mBk.#jvP"5vU^X`qX:/ Қ%ˇ3WebnI>q*NswJ&UxZ 7ifs ]vtBSR!ʤ 2H'T<+V,LH,3 '75R_T/zN qF1chU&eǭKJJRe1#]B\ޮƫA\sw :Ф-J$lГ{mNWkt ƙGE#{ uzW^3+gI=3x9o}e˶k_fvE39f$wi,BdIlӊ.ե,ƶ"1yOsaHȊ:m-h}7XpˣFj*A@䖚.9ܠ9e)Rcjen)96:Xұ5{Jϙ'ŠX}e="O ˳O\x>2V^:U9~w=;;R8i/C]zzH7^cq8k&= 1O:+~Ue~ÉeFo9} u+t-TMżxٴӕV.%PbBddbӵBOO; ӕMH7xSJ_B6 r L0b-z#F-ܢu|CINΩHy,.%9ecC \QKt [#eݓM3m[,P^{vN]60~0ՋlitO@b(ީmBvj&:0Jk ry$Eczl, }z;p6"p,|V=D~ H֦hҤf$R s$-䗷d򞟧2 H _gks5:dm/WA^^뤓ƓOs27_ 17'ړ r9yEwkiLɽR@hsNvv/:9І<+yAeגyk :`,Vn"(>r4R\ Jo]:&-ښ +uٓr#9|\ X``RFڞ'wj<2emDTDr Y-z+:fV6@i @`)buJYJTAv7p.N))1@x+jw֔:6ji #`oݗL n9޽WFU4dfuLdT߷& *ɛb^ i~pQP|]=Da3ٸNNʱ/GﯻъטQ׈=vd)q}Lrӂo6!-=:ߩ?=)>6 Ivߏ-1]kfz+FU^S`k6wK,OݧQAqr`HWPKbr1ecfVENtd]Swk1*I |rp~I1wނl]nbT ռ۬U0QQ3mVbc7򟧬QdWW4l 0/e(ho{a+HKg+¡$8pGI\>!KےsWR:N_@Aוw4jF %,5P֊}2 3PVpi\= "3zۆBҿ-9TQO0~8  $x{[uvZi}g' h6q}wwzT)\W,j*kNkHAzt O`Wm8ݠ3(/O_3vA+`A(02lc(C#<~+11}~b1@<֌y@`єP2'6{P1W*kǘP~I3bXr5YB`|]XiN}d.+ M8 ,T.tS (*I[VqU"Ⱦ$IWڲNh\ !BZ]NƊSqkL 2Riqb8}zGpܠ9/GAIuO 2:ρеeSքl/j8kn9%3F5 )c]mˋǝx9H%j1[׉s"}m-+Wx:YUq)HotϺuq][er9D9O zX4Uzp%]([GSn v 5L{vֱs:7 z˂)DdcY'HK*l\Eo UH^)z?݀hh$'7 `:J:<ƛk&eCbG&\&َ]&0:@W'CTk~C (˛hK¾PL3rp!Xmo6_q * e6/@u_ J<[L(Q#);ް#%98ɒb](ޙ(RQgdt`zHQ`"^3 ivv~jVTsܢΙ4,a08/$s n!ǙH0]4a`BII08IUQѨR'hĘH cvqJi*GEp^'K|,mG)3ߠ!v`5 նd @˩CNC%HLNb6eCiʜ;狓/Wg0u:i"%>={Dȏ\Sli<Ƅ|'Ce:[mptjTr^9=k̒v+yN81!YLx Hbl+B m+ yh=ѣ׊`ʄBl96 b!IC?cp6* *;i%*L)WeDwͬ|xT ca1{%z7"1gB6uI(,)+MySFlcq՜>.]<__8lDM;Ċ/j9sM?]Y-4\D;i\@;%&5Q'v(}R\;F5)$K0U#5ڂ\6ϻx˲k;临V8ef`tvT+':lc2~곺 I%3oO៩ȇKfƩp9u&R'Vmr l+Қ\Ef-DU-Z/򳁔QSs sh+p`eaWMPƈX.jOt:cV X9aN( > m [8ѭWetMډdvwZ;.1(1> m1c(àch %gN:Nлܜr.,ʘx`¢7V̝KuJ.d|9)TtHpqTi:#ɣ$)_%dͱ$6\OKHA>鞭F*:BܚJ09k"ŴQwU 3/r ~ڷeʹQ~?IҢ_25 8niVƈxPٛJ{anmbBR8;Uqj-~|8uV—6amc~j^-%j*d"c6莽o,^~Accǩ7 b{IZhCAy~r#gaVBŧ3//x i* AܺXG 29i;lZ&)ۈӿ<ʼpyҰo}͹'G`Eh_Yjz Rs8qf:)ϧ}1򻊿Az&2=-f<*'\7&r-iGnb||_`nkJ uZ'6񅲻EwY}2 Tn0+$Hr2P4M{(PT@#0E$eG-%);c%A͛w~7ji`$ CaZ5mີLiõ@4kAP5X  R.D eݾJfP %zZΎ͇Ϸc8;LD,Fm# 0˓|rCcR#YF\NV tzQ\]L!Ȧ͒SY+i#84I!z](ej H1jGtj\ɀܬ %FPr@/֪1lz3N)>JbPEK0mL_(?#+k"ZOX]HˢqAO$r{^_#O%v& `tOsr^#,yoཻ}y#𣺮{C>Jr˗U }Яo  14ފt>ZpVV?uD_N`l!?[%7t8aGWipbQ{Z'cɂt ,՝3k~$Dom^j6Q70JXZkzj96ϲ}4)ѮlD|>"8l,OҀ \FV~\GWn8}WZ)l9[/l.fѤ-c6(S7!)%I}-j83gƣriћ?df\VszW66wJQdزYpF#jLZ2Ss&<s,IӡuKŤdp&5MuU$ 3]|<9|uFS82<'̻ƩJ8!-*MƄM"sR= \=I'?d./ /p{ߓ3ae  GԇVv.JL:VҾ ݊gp_$8&BU|{\ ߧ<>߮zp]C\I1+֦(^D?{+v-K6`sK+ʒIõct&7k^@MwAA.rO{ae~zvz(\h5:*>// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; mojo.internal.exportModule('skia.mojom'); /** * @const { {$:!mojo.internal.MojomType}} * @export */ skia.mojom.BitmapSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ skia.mojom.InlineBitmapSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; mojo.internal.Struct( skia.mojom.BitmapSpec.$, 'Bitmap', 32, [ mojo.internal.StructField( 'imageInfo', 0, 0, skia.mojom.ImageInfoSpec.$, null, false /* nullable */), mojo.internal.StructField( 'rowBytes', 8, 0, mojo.internal.Uint64, 0, false /* nullable */), mojo.internal.StructField( 'pixelData', 16, 0, mojoBase.mojom.BigBufferSpec.$, null, false /* nullable */), ]); mojo.internal.Struct( skia.mojom.InlineBitmapSpec.$, 'InlineBitmap', 24, [ mojo.internal.StructField( 'imageInfo', 0, 0, skia.mojom.ImageInfoSpec.$, null, false /* nullable */), mojo.internal.StructField( 'rowBytes', 8, 0, mojo.internal.Uint64, 0, false /* nullable */), mojo.internal.StructField( 'pixelData', 16, 0, mojo.internal.Array(mojo.internal.Uint8, false), null, false /* nullable */), ]); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; mojo.internal.exportModule('gfx.mojom'); /** * @const { {$:!mojo.internal.MojomType}} * @export */ gfx.mojom.ImageSkiaRepSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ gfx.mojom.ImageSkiaSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; mojo.internal.Struct( gfx.mojom.ImageSkiaRepSpec.$, 'ImageSkiaRep', 16, [ mojo.internal.StructField( 'bitmap', 0, 0, skia.mojom.BitmapSpec.$, null, false /* nullable */), mojo.internal.StructField( 'scale', 8, 0, mojo.internal.Float, 0, false /* nullable */), ]); mojo.internal.Struct( gfx.mojom.ImageSkiaSpec.$, 'ImageSkia', 8, [ mojo.internal.StructField( 'imageReps', 0, 0, mojo.internal.Array(gfx.mojom.ImageSkiaRepSpec.$, false), null, false /* nullable */), ]); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; mojo.internal.exportModule('appManagement.mojom'); /** * @const { {$: !mojo.internal.MojomType} } * @export */ appManagement.mojom.ArcPermissionTypeSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ appManagement.mojom.ArcPermissionType = { CAMERA: 0, LOCATION: 0, MICROPHONE: 0, MIN_VALUE: 0, MAX_VALUE: 2, }; /** @suppress {checkTypes} */ appManagement.mojom.ArcPermissionType.CAMERA = 0; /** @suppress {checkTypes} */ appManagement.mojom.ArcPermissionType.LOCATION = appManagement.mojom.ArcPermissionType.CAMERA + 1; /** @suppress {checkTypes} */ appManagement.mojom.ArcPermissionType.MICROPHONE = appManagement.mojom.ArcPermissionType.LOCATION + 1; /** * @const { {$: !mojo.internal.MojomType} } * @export */ appManagement.mojom.PwaPermissionTypeSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ appManagement.mojom.PwaPermissionType = { CONTENT_SETTINGS_TYPE_GEOLOCATION: 0, CONTENT_SETTINGS_TYPE_NOTIFICATIONS: 0, CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC: 0, CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA: 0, MIN_VALUE: 5, MAX_VALUE: 10, }; /** @suppress {checkTypes} */ appManagement.mojom.PwaPermissionType.CONTENT_SETTINGS_TYPE_GEOLOCATION = 5; /** @suppress {checkTypes} */ appManagement.mojom.PwaPermissionType.CONTENT_SETTINGS_TYPE_NOTIFICATIONS = 6; /** @suppress {checkTypes} */ appManagement.mojom.PwaPermissionType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC = 9; /** @suppress {checkTypes} */ appManagement.mojom.PwaPermissionType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA = 10; /** @export */ appManagement.mojom.PageHandlerFactoryRequest = class { /** @param {!MojoHandle} handle */ constructor(handle) { /** @public {!MojoHandle} */ this.handle = handle; } }; /** * @export * @implements { appManagement.mojom.PageHandlerFactoryInterface } */ appManagement.mojom.PageHandlerFactoryProxy = class { /** @param {MojoHandle=} opt_handle */ constructor(opt_handle) { /** * @private {!mojo.internal.interfaceSupport.InterfaceProxyBase} */ this.proxy = new mojo.internal.interfaceSupport.InterfaceProxyBase( appManagement.mojom.PageHandlerFactoryRequest, opt_handle); /** * @public {!mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper} */ this.$ = new mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper(this.proxy); /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */ this.onConnectionError = this.proxy.getConnectionErrorEventRouter(); } /** * @param { !appManagement.mojom.PageProxy } page * @param { !appManagement.mojom.PageHandlerRequest } handler */ createPageHandler( page, handler) { this.proxy.sendMessage( 228594235, appManagement.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec.$, null, [ page, handler ]); } }; /** * An object which receives request messages for the PageHandlerFactory * mojom interface. Must be constructed over an object which implements that * interface. * * @export */ appManagement.mojom.PageHandlerFactory = class { /** * @param {!appManagement.mojom.PageHandlerFactoryInterface } impl */ constructor(impl) { this.target_ = new mojo.internal.interfaceSupport.InterfaceTarget; this.target_.registerHandler( 228594235, appManagement.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec.$, null, impl.createPageHandler.bind(impl)); } /** * Binds a new handle to this object. Messages which arrive on the handle will * be read and dispatched to this object. * * @param {!MojoHandle} handle * @export */ bindHandle(handle) { this.target_.bindHandle(handle); } /** * Returns a proxy for this interface which sends messages to the browser. * The browser must have an interface request binder registered for this * interface and accessible to the calling document's frame. * * @return {!appManagement.mojom.PageHandlerFactoryProxy} * @export */ static getProxy() { let proxy = new appManagement.mojom.PageHandlerFactoryProxy; Mojo.bindInterface('app_management.mojom.PageHandlerFactory', proxy.$.createRequest().handle); return proxy; } /** * Returns a proxy for this interface which sends messages directly to this * object. Any number of proxies may be created to the same object. * * @return {!appManagement.mojom.PageHandlerFactoryProxy} * @export */ createProxy() { let proxy = new appManagement.mojom.PageHandlerFactoryProxy; this.target_.bindHandle(proxy.$.createRequest().handle); return proxy; } }; /** * @const {string} * @export */ appManagement.mojom.PageHandlerFactory.$interfaceName = 'app_management.mojom.PageHandlerFactory'; /** * An object which receives request messages for the PageHandlerFactory * mojom interface and dispatches them as callbacks. One callback target exists * on this object for each message defined in the mojom interface, and each * target can have any number of listeners added to it. * * @export */ appManagement.mojom.PageHandlerFactoryCallbackRouter = class { constructor() { this.target_ = new mojo.internal.interfaceSupport.InterfaceTarget; this.router_ = new mojo.internal.interfaceSupport.CallbackRouter; /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.createPageHandler = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 228594235, appManagement.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec.$, null, this.createPageHandler.createTargetHandler(false /* expectsResponse */)); } /** * Binds a new handle to this object. Messages which arrive on the handle will * be read and dispatched as callbacks on this object. * * @param {!MojoHandle} handle * @export */ bindHandle(handle) { this.target_.bindHandle(handle); } /** * Closes all bindings bound to this target. The target will not receive any * further message message events unless rebound to one or more handles. */ closeBindings() { this.target_.closeBindings(); } /** * Returns a proxy for this interface which sends messages directly to this * object. Any number of proxies may be created to the same object. * * @return {!appManagement.mojom.PageHandlerFactoryProxy} * @export */ createProxy() { let proxy = new appManagement.mojom.PageHandlerFactoryProxy; this.target_.bindHandle(proxy.$.createRequest().handle); return proxy; } /** * @param {number} id An ID returned by a prior call to addListener. * @return {boolean} True iff the identified listener was found and removed. * @export */ removeListener(id) { return this.router_.removeListener(id); } }; /** @export */ appManagement.mojom.PageHandlerRequest = class { /** @param {!MojoHandle} handle */ constructor(handle) { /** @public {!MojoHandle} */ this.handle = handle; } }; /** * @export * @implements { appManagement.mojom.PageHandlerInterface } */ appManagement.mojom.PageHandlerProxy = class { /** @param {MojoHandle=} opt_handle */ constructor(opt_handle) { /** * @private {!mojo.internal.interfaceSupport.InterfaceProxyBase} */ this.proxy = new mojo.internal.interfaceSupport.InterfaceProxyBase( appManagement.mojom.PageHandlerRequest, opt_handle); /** * @public {!mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper} */ this.$ = new mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper(this.proxy); /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */ this.onConnectionError = this.proxy.getConnectionErrorEventRouter(); } /** * @return {Promise<{ apps: !Array, * }>} */ getApps() { return this.proxy.sendMessage( 837008426, appManagement.mojom.PageHandler_GetApps_ParamsSpec.$, appManagement.mojom.PageHandler_GetApps_ResponseParamsSpec.$, [ ]); } /** * @param { !string } appId * @return {Promise<{ messages: !Array, * }>} */ getExtensionAppPermissionMessages( appId) { return this.proxy.sendMessage( 1944046757, appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ParamsSpec.$, appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ResponseParamsSpec.$, [ appId ]); } /** * @param { !string } appId * @param { !apps.mojom.OptionalBool } pinned */ setPinned( appId, pinned) { this.proxy.sendMessage( 1279943958, appManagement.mojom.PageHandler_SetPinned_ParamsSpec.$, null, [ appId, pinned ]); } /** * @param { !string } appId * @param { !apps.mojom.Permission } permission */ setPermission( appId, permission) { this.proxy.sendMessage( 1301363866, appManagement.mojom.PageHandler_SetPermission_ParamsSpec.$, null, [ appId, permission ]); } /** * @param { !string } appId */ uninstall( appId) { this.proxy.sendMessage( 1563424474, appManagement.mojom.PageHandler_Uninstall_ParamsSpec.$, null, [ appId ]); } /** * @param { !string } appId */ openNativeSettings( appId) { this.proxy.sendMessage( 1845493121, appManagement.mojom.PageHandler_OpenNativeSettings_ParamsSpec.$, null, [ appId ]); } }; /** * An object which receives request messages for the PageHandler * mojom interface. Must be constructed over an object which implements that * interface. * * @export */ appManagement.mojom.PageHandler = class { /** * @param {!appManagement.mojom.PageHandlerInterface } impl */ constructor(impl) { this.target_ = new mojo.internal.interfaceSupport.InterfaceTarget; this.target_.registerHandler( 837008426, appManagement.mojom.PageHandler_GetApps_ParamsSpec.$, appManagement.mojom.PageHandler_GetApps_ResponseParamsSpec.$, impl.getApps.bind(impl)); this.target_.registerHandler( 1944046757, appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ParamsSpec.$, appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ResponseParamsSpec.$, impl.getExtensionAppPermissionMessages.bind(impl)); this.target_.registerHandler( 1279943958, appManagement.mojom.PageHandler_SetPinned_ParamsSpec.$, null, impl.setPinned.bind(impl)); this.target_.registerHandler( 1301363866, appManagement.mojom.PageHandler_SetPermission_ParamsSpec.$, null, impl.setPermission.bind(impl)); this.target_.registerHandler( 1563424474, appManagement.mojom.PageHandler_Uninstall_ParamsSpec.$, null, impl.uninstall.bind(impl)); this.target_.registerHandler( 1845493121, appManagement.mojom.PageHandler_OpenNativeSettings_ParamsSpec.$, null, impl.openNativeSettings.bind(impl)); } /** * Binds a new handle to this object. Messages which arrive on the handle will * be read and dispatched to this object. * * @param {!MojoHandle} handle * @export */ bindHandle(handle) { this.target_.bindHandle(handle); } /** * Returns a proxy for this interface which sends messages to the browser. * The browser must have an interface request binder registered for this * interface and accessible to the calling document's frame. * * @return {!appManagement.mojom.PageHandlerProxy} * @export */ static getProxy() { let proxy = new appManagement.mojom.PageHandlerProxy; Mojo.bindInterface('app_management.mojom.PageHandler', proxy.$.createRequest().handle); return proxy; } /** * Returns a proxy for this interface which sends messages directly to this * object. Any number of proxies may be created to the same object. * * @return {!appManagement.mojom.PageHandlerProxy} * @export */ createProxy() { let proxy = new appManagement.mojom.PageHandlerProxy; this.target_.bindHandle(proxy.$.createRequest().handle); return proxy; } }; /** * @const {string} * @export */ appManagement.mojom.PageHandler.$interfaceName = 'app_management.mojom.PageHandler'; /** * An object which receives request messages for the PageHandler * mojom interface and dispatches them as callbacks. One callback target exists * on this object for each message defined in the mojom interface, and each * target can have any number of listeners added to it. * * @export */ appManagement.mojom.PageHandlerCallbackRouter = class { constructor() { this.target_ = new mojo.internal.interfaceSupport.InterfaceTarget; this.router_ = new mojo.internal.interfaceSupport.CallbackRouter; /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.getApps = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 837008426, appManagement.mojom.PageHandler_GetApps_ParamsSpec.$, appManagement.mojom.PageHandler_GetApps_ResponseParamsSpec.$, this.getApps.createTargetHandler(true /* expectsResponse */)); /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.getExtensionAppPermissionMessages = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 1944046757, appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ParamsSpec.$, appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ResponseParamsSpec.$, this.getExtensionAppPermissionMessages.createTargetHandler(true /* expectsResponse */)); /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.setPinned = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 1279943958, appManagement.mojom.PageHandler_SetPinned_ParamsSpec.$, null, this.setPinned.createTargetHandler(false /* expectsResponse */)); /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.setPermission = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 1301363866, appManagement.mojom.PageHandler_SetPermission_ParamsSpec.$, null, this.setPermission.createTargetHandler(false /* expectsResponse */)); /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.uninstall = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 1563424474, appManagement.mojom.PageHandler_Uninstall_ParamsSpec.$, null, this.uninstall.createTargetHandler(false /* expectsResponse */)); /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.openNativeSettings = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 1845493121, appManagement.mojom.PageHandler_OpenNativeSettings_ParamsSpec.$, null, this.openNativeSettings.createTargetHandler(false /* expectsResponse */)); } /** * Binds a new handle to this object. Messages which arrive on the handle will * be read and dispatched as callbacks on this object. * * @param {!MojoHandle} handle * @export */ bindHandle(handle) { this.target_.bindHandle(handle); } /** * Closes all bindings bound to this target. The target will not receive any * further message message events unless rebound to one or more handles. */ closeBindings() { this.target_.closeBindings(); } /** * Returns a proxy for this interface which sends messages directly to this * object. Any number of proxies may be created to the same object. * * @return {!appManagement.mojom.PageHandlerProxy} * @export */ createProxy() { let proxy = new appManagement.mojom.PageHandlerProxy; this.target_.bindHandle(proxy.$.createRequest().handle); return proxy; } /** * @param {number} id An ID returned by a prior call to addListener. * @return {boolean} True iff the identified listener was found and removed. * @export */ removeListener(id) { return this.router_.removeListener(id); } }; /** @export */ appManagement.mojom.PageRequest = class { /** @param {!MojoHandle} handle */ constructor(handle) { /** @public {!MojoHandle} */ this.handle = handle; } }; /** * @export * @implements { appManagement.mojom.PageInterface } */ appManagement.mojom.PageProxy = class { /** @param {MojoHandle=} opt_handle */ constructor(opt_handle) { /** * @private {!mojo.internal.interfaceSupport.InterfaceProxyBase} */ this.proxy = new mojo.internal.interfaceSupport.InterfaceProxyBase( appManagement.mojom.PageRequest, opt_handle); /** * @public {!mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper} */ this.$ = new mojo.internal.interfaceSupport.InterfaceProxyBaseWrapper(this.proxy); /** @public {!mojo.internal.interfaceSupport.ConnectionErrorEventRouter} */ this.onConnectionError = this.proxy.getConnectionErrorEventRouter(); } /** * @param { !appManagement.mojom.App } app */ onAppAdded( app) { this.proxy.sendMessage( 1854544433, appManagement.mojom.Page_OnAppAdded_ParamsSpec.$, null, [ app ]); } /** * @param { !appManagement.mojom.App } update */ onAppChanged( update) { this.proxy.sendMessage( 508524816, appManagement.mojom.Page_OnAppChanged_ParamsSpec.$, null, [ update ]); } /** * @param { !string } appId */ onAppRemoved( appId) { this.proxy.sendMessage( 649607897, appManagement.mojom.Page_OnAppRemoved_ParamsSpec.$, null, [ appId ]); } }; /** * An object which receives request messages for the Page * mojom interface. Must be constructed over an object which implements that * interface. * * @export */ appManagement.mojom.Page = class { /** * @param {!appManagement.mojom.PageInterface } impl */ constructor(impl) { this.target_ = new mojo.internal.interfaceSupport.InterfaceTarget; this.target_.registerHandler( 1854544433, appManagement.mojom.Page_OnAppAdded_ParamsSpec.$, null, impl.onAppAdded.bind(impl)); this.target_.registerHandler( 508524816, appManagement.mojom.Page_OnAppChanged_ParamsSpec.$, null, impl.onAppChanged.bind(impl)); this.target_.registerHandler( 649607897, appManagement.mojom.Page_OnAppRemoved_ParamsSpec.$, null, impl.onAppRemoved.bind(impl)); } /** * Binds a new handle to this object. Messages which arrive on the handle will * be read and dispatched to this object. * * @param {!MojoHandle} handle * @export */ bindHandle(handle) { this.target_.bindHandle(handle); } /** * Returns a proxy for this interface which sends messages to the browser. * The browser must have an interface request binder registered for this * interface and accessible to the calling document's frame. * * @return {!appManagement.mojom.PageProxy} * @export */ static getProxy() { let proxy = new appManagement.mojom.PageProxy; Mojo.bindInterface('app_management.mojom.Page', proxy.$.createRequest().handle); return proxy; } /** * Returns a proxy for this interface which sends messages directly to this * object. Any number of proxies may be created to the same object. * * @return {!appManagement.mojom.PageProxy} * @export */ createProxy() { let proxy = new appManagement.mojom.PageProxy; this.target_.bindHandle(proxy.$.createRequest().handle); return proxy; } }; /** * @const {string} * @export */ appManagement.mojom.Page.$interfaceName = 'app_management.mojom.Page'; /** * An object which receives request messages for the Page * mojom interface and dispatches them as callbacks. One callback target exists * on this object for each message defined in the mojom interface, and each * target can have any number of listeners added to it. * * @export */ appManagement.mojom.PageCallbackRouter = class { constructor() { this.target_ = new mojo.internal.interfaceSupport.InterfaceTarget; this.router_ = new mojo.internal.interfaceSupport.CallbackRouter; /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.onAppAdded = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 1854544433, appManagement.mojom.Page_OnAppAdded_ParamsSpec.$, null, this.onAppAdded.createTargetHandler(false /* expectsResponse */)); /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.onAppChanged = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 508524816, appManagement.mojom.Page_OnAppChanged_ParamsSpec.$, null, this.onAppChanged.createTargetHandler(false /* expectsResponse */)); /** * @export {!mojo.internal.interfaceSupport.InterfaceCallbackTarget} */ this.onAppRemoved = new mojo.internal.interfaceSupport.InterfaceCallbackTarget( this.router_); this.target_.registerHandler( 649607897, appManagement.mojom.Page_OnAppRemoved_ParamsSpec.$, null, this.onAppRemoved.createTargetHandler(false /* expectsResponse */)); } /** * Binds a new handle to this object. Messages which arrive on the handle will * be read and dispatched as callbacks on this object. * * @param {!MojoHandle} handle * @export */ bindHandle(handle) { this.target_.bindHandle(handle); } /** * Closes all bindings bound to this target. The target will not receive any * further message message events unless rebound to one or more handles. */ closeBindings() { this.target_.closeBindings(); } /** * Returns a proxy for this interface which sends messages directly to this * object. Any number of proxies may be created to the same object. * * @return {!appManagement.mojom.PageProxy} * @export */ createProxy() { let proxy = new appManagement.mojom.PageProxy; this.target_.bindHandle(proxy.$.createRequest().handle); return proxy; } /** * @param {number} id An ID returned by a prior call to addListener. * @return {boolean} True iff the identified listener was found and removed. * @export */ removeListener(id) { return this.router_.removeListener(id); } }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.AppSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.ExtensionAppPermissionMessageSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.PageHandler_GetApps_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.PageHandler_GetApps_ResponseParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ResponseParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.PageHandler_SetPinned_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.PageHandler_SetPermission_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.PageHandler_Uninstall_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.PageHandler_OpenNativeSettings_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.Page_OnAppAdded_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.Page_OnAppChanged_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ appManagement.mojom.Page_OnAppRemoved_ParamsSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; mojo.internal.Struct( appManagement.mojom.AppSpec.$, 'App', 56, [ mojo.internal.StructField( 'id', 0, 0, mojo.internal.String, null, false /* nullable */), mojo.internal.StructField( 'type', 8, 0, apps.mojom.AppTypeSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'title', 16, 0, mojo.internal.String, null, true /* nullable */), mojo.internal.StructField( 'description', 24, 0, mojo.internal.String, null, true /* nullable */), mojo.internal.StructField( 'isPinned', 12, 0, apps.mojom.OptionalBoolSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'version', 32, 0, mojo.internal.String, null, true /* nullable */), mojo.internal.StructField( 'size', 40, 0, mojo.internal.String, null, true /* nullable */), mojo.internal.StructField( 'permissions', 48, 0, mojo.internal.Map(mojo.internal.Uint32, apps.mojom.PermissionSpec.$, false), null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.ExtensionAppPermissionMessageSpec.$, 'ExtensionAppPermissionMessage', 16, [ mojo.internal.StructField( 'message', 0, 0, mojo.internal.String, null, false /* nullable */), mojo.internal.StructField( 'submessages', 8, 0, mojo.internal.Array(mojo.internal.String, false), null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.PageHandlerFactory_CreatePageHandler_ParamsSpec.$, 'PageHandlerFactory_CreatePageHandler_Params', 16, [ mojo.internal.StructField( 'page', 0, 0, mojo.internal.InterfaceProxy(appManagement.mojom.PageProxy), null, false /* nullable */), mojo.internal.StructField( 'handler', 8, 0, mojo.internal.InterfaceRequest(appManagement.mojom.PageHandlerRequest), null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.PageHandler_GetApps_ParamsSpec.$, 'PageHandler_GetApps_Params', 0, [ ]); mojo.internal.Struct( appManagement.mojom.PageHandler_GetApps_ResponseParamsSpec.$, 'PageHandler_GetApps_ResponseParams', 8, [ mojo.internal.StructField( 'apps', 0, 0, mojo.internal.Array(appManagement.mojom.AppSpec.$, false), null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ParamsSpec.$, 'PageHandler_GetExtensionAppPermissionMessages_Params', 8, [ mojo.internal.StructField( 'appId', 0, 0, mojo.internal.String, null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.PageHandler_GetExtensionAppPermissionMessages_ResponseParamsSpec.$, 'PageHandler_GetExtensionAppPermissionMessages_ResponseParams', 8, [ mojo.internal.StructField( 'messages', 0, 0, mojo.internal.Array(appManagement.mojom.ExtensionAppPermissionMessageSpec.$, false), null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.PageHandler_SetPinned_ParamsSpec.$, 'PageHandler_SetPinned_Params', 16, [ mojo.internal.StructField( 'appId', 0, 0, mojo.internal.String, null, false /* nullable */), mojo.internal.StructField( 'pinned', 8, 0, apps.mojom.OptionalBoolSpec.$, 0, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.PageHandler_SetPermission_ParamsSpec.$, 'PageHandler_SetPermission_Params', 16, [ mojo.internal.StructField( 'appId', 0, 0, mojo.internal.String, null, false /* nullable */), mojo.internal.StructField( 'permission', 8, 0, apps.mojom.PermissionSpec.$, null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.PageHandler_Uninstall_ParamsSpec.$, 'PageHandler_Uninstall_Params', 8, [ mojo.internal.StructField( 'appId', 0, 0, mojo.internal.String, null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.PageHandler_OpenNativeSettings_ParamsSpec.$, 'PageHandler_OpenNativeSettings_Params', 8, [ mojo.internal.StructField( 'appId', 0, 0, mojo.internal.String, null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.Page_OnAppAdded_ParamsSpec.$, 'Page_OnAppAdded_Params', 8, [ mojo.internal.StructField( 'app', 0, 0, appManagement.mojom.AppSpec.$, null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.Page_OnAppChanged_ParamsSpec.$, 'Page_OnAppChanged_Params', 8, [ mojo.internal.StructField( 'update', 0, 0, appManagement.mojom.AppSpec.$, null, false /* nullable */), ]); mojo.internal.Struct( appManagement.mojom.Page_OnAppRemoved_ParamsSpec.$, 'Page_OnAppRemoved_Params', 8, [ mojo.internal.StructField( 'appId', 0, 0, mojo.internal.String, null, false /* nullable */), ]); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; mojo.internal.exportModule('apps.mojom'); /** * @const { {$: !mojo.internal.MojomType} } * @export */ apps.mojom.AppTypeSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ apps.mojom.AppType = { kUnknown: 0, kArc: 0, kBuiltIn: 0, kCrostini: 0, kExtension: 0, kWeb: 0, MIN_VALUE: 0, MAX_VALUE: 5, }; /** @suppress {checkTypes} */ apps.mojom.AppType.kUnknown = 0; /** @suppress {checkTypes} */ apps.mojom.AppType.kArc = apps.mojom.AppType.kUnknown + 1; /** @suppress {checkTypes} */ apps.mojom.AppType.kBuiltIn = apps.mojom.AppType.kArc + 1; /** @suppress {checkTypes} */ apps.mojom.AppType.kCrostini = apps.mojom.AppType.kBuiltIn + 1; /** @suppress {checkTypes} */ apps.mojom.AppType.kExtension = apps.mojom.AppType.kCrostini + 1; /** @suppress {checkTypes} */ apps.mojom.AppType.kWeb = apps.mojom.AppType.kExtension + 1; /** * @const { {$: !mojo.internal.MojomType} } * @export */ apps.mojom.ReadinessSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ apps.mojom.Readiness = { kUnknown: 0, kReady: 0, kDisabledByBlacklist: 0, kDisabledByPolicy: 0, kDisabledByUser: 0, kTerminated: 0, kUninstalledByUser: 0, MIN_VALUE: 0, MAX_VALUE: 6, }; /** @suppress {checkTypes} */ apps.mojom.Readiness.kUnknown = 0; /** @suppress {checkTypes} */ apps.mojom.Readiness.kReady = apps.mojom.Readiness.kUnknown + 1; /** @suppress {checkTypes} */ apps.mojom.Readiness.kDisabledByBlacklist = apps.mojom.Readiness.kReady + 1; /** @suppress {checkTypes} */ apps.mojom.Readiness.kDisabledByPolicy = apps.mojom.Readiness.kDisabledByBlacklist + 1; /** @suppress {checkTypes} */ apps.mojom.Readiness.kDisabledByUser = apps.mojom.Readiness.kDisabledByPolicy + 1; /** @suppress {checkTypes} */ apps.mojom.Readiness.kTerminated = apps.mojom.Readiness.kDisabledByUser + 1; /** @suppress {checkTypes} */ apps.mojom.Readiness.kUninstalledByUser = apps.mojom.Readiness.kTerminated + 1; /** * @const { {$: !mojo.internal.MojomType} } * @export */ apps.mojom.OptionalBoolSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ apps.mojom.OptionalBool = { kUnknown: 0, kFalse: 0, kTrue: 0, MIN_VALUE: 0, MAX_VALUE: 2, }; /** @suppress {checkTypes} */ apps.mojom.OptionalBool.kUnknown = 0; /** @suppress {checkTypes} */ apps.mojom.OptionalBool.kFalse = apps.mojom.OptionalBool.kUnknown + 1; /** @suppress {checkTypes} */ apps.mojom.OptionalBool.kTrue = apps.mojom.OptionalBool.kFalse + 1; /** * @const { {$: !mojo.internal.MojomType} } * @export */ apps.mojom.IconCompressionSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ apps.mojom.IconCompression = { kUnknown: 0, kUncompressed: 0, kCompressed: 0, MIN_VALUE: 0, MAX_VALUE: 2, }; /** @suppress {checkTypes} */ apps.mojom.IconCompression.kUnknown = 0; /** @suppress {checkTypes} */ apps.mojom.IconCompression.kUncompressed = apps.mojom.IconCompression.kUnknown + 1; /** @suppress {checkTypes} */ apps.mojom.IconCompression.kCompressed = apps.mojom.IconCompression.kUncompressed + 1; /** * @const { {$: !mojo.internal.MojomType} } * @export */ apps.mojom.LaunchSourceSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ apps.mojom.LaunchSource = { kUnknown: 0, kFromAppListGrid: 0, kFromAppListGridContextMenu: 0, kFromAppListQuery: 0, kFromAppListQueryContextMenu: 0, kFromAppListRecommendation: 0, MIN_VALUE: 0, MAX_VALUE: 5, }; /** @suppress {checkTypes} */ apps.mojom.LaunchSource.kUnknown = 0; /** @suppress {checkTypes} */ apps.mojom.LaunchSource.kFromAppListGrid = apps.mojom.LaunchSource.kUnknown + 1; /** @suppress {checkTypes} */ apps.mojom.LaunchSource.kFromAppListGridContextMenu = apps.mojom.LaunchSource.kFromAppListGrid + 1; /** @suppress {checkTypes} */ apps.mojom.LaunchSource.kFromAppListQuery = apps.mojom.LaunchSource.kFromAppListGridContextMenu + 1; /** @suppress {checkTypes} */ apps.mojom.LaunchSource.kFromAppListQueryContextMenu = apps.mojom.LaunchSource.kFromAppListQuery + 1; /** @suppress {checkTypes} */ apps.mojom.LaunchSource.kFromAppListRecommendation = apps.mojom.LaunchSource.kFromAppListQueryContextMenu + 1; /** * @const { {$: !mojo.internal.MojomType} } * @export */ apps.mojom.TriStateSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ apps.mojom.TriState = { kAllow: 0, kBlock: 0, kAsk: 0, MIN_VALUE: 0, MAX_VALUE: 2, }; /** @suppress {checkTypes} */ apps.mojom.TriState.kAllow = 0; /** @suppress {checkTypes} */ apps.mojom.TriState.kBlock = apps.mojom.TriState.kAllow + 1; /** @suppress {checkTypes} */ apps.mojom.TriState.kAsk = apps.mojom.TriState.kBlock + 1; /** * @const { {$: !mojo.internal.MojomType} } * @export */ apps.mojom.PermissionValueTypeSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ apps.mojom.PermissionValueType = { kBool: 0, kTriState: 0, MIN_VALUE: 0, MAX_VALUE: 1, }; /** @suppress {checkTypes} */ apps.mojom.PermissionValueType.kBool = 0; /** @suppress {checkTypes} */ apps.mojom.PermissionValueType.kTriState = apps.mojom.PermissionValueType.kBool + 1; /** * @const { {$:!mojo.internal.MojomType}} * @export */ apps.mojom.AppSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ apps.mojom.PermissionSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ apps.mojom.IconKeySpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; /** * @const { {$:!mojo.internal.MojomType}} * @export */ apps.mojom.IconValueSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; mojo.internal.Struct( apps.mojom.AppSpec.$, 'App', 96, [ mojo.internal.StructField( 'appType', 0, 0, apps.mojom.AppTypeSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'appId', 8, 0, mojo.internal.String, null, false /* nullable */), mojo.internal.StructField( 'readiness', 4, 0, apps.mojom.ReadinessSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'name', 16, 0, mojo.internal.String, null, true /* nullable */), mojo.internal.StructField( 'shortName', 24, 0, mojo.internal.String, null, true /* nullable */), mojo.internal.StructField( 'additionalSearchTerms', 32, 0, mojo.internal.Array(mojo.internal.String, false), null, false /* nullable */), mojo.internal.StructField( 'iconKey', 40, 0, apps.mojom.IconKeySpec.$, null, true /* nullable */), mojo.internal.StructField( 'lastLaunchTime', 48, 0, mojoBase.mojom.TimeSpec.$, null, true /* nullable */), mojo.internal.StructField( 'installTime', 56, 0, mojoBase.mojom.TimeSpec.$, null, true /* nullable */), mojo.internal.StructField( 'permissions', 64, 0, mojo.internal.Array(apps.mojom.PermissionSpec.$, false), null, false /* nullable */), mojo.internal.StructField( 'installedInternally', 72, 0, apps.mojom.OptionalBoolSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'isPlatformApp', 76, 0, apps.mojom.OptionalBoolSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'showInLauncher', 80, 0, apps.mojom.OptionalBoolSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'showInSearch', 84, 0, apps.mojom.OptionalBoolSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'showInManagement', 88, 0, apps.mojom.OptionalBoolSpec.$, 0, false /* nullable */), ]); mojo.internal.Struct( apps.mojom.PermissionSpec.$, 'Permission', 16, [ mojo.internal.StructField( 'permissionId', 0, 0, mojo.internal.Uint32, 0, false /* nullable */), mojo.internal.StructField( 'valueType', 4, 0, apps.mojom.PermissionValueTypeSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'value', 8, 0, mojo.internal.Uint32, 0, false /* nullable */), ]); mojo.internal.Struct( apps.mojom.IconKeySpec.$, 'IconKey', 24, [ mojo.internal.StructField( 'appType', 0, 0, apps.mojom.AppTypeSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'uKey', 8, 0, mojo.internal.Uint64, 0, false /* nullable */), mojo.internal.StructField( 'sKey', 16, 0, mojo.internal.String, null, false /* nullable */), mojo.internal.StructField( 'iconEffects', 4, 0, mojo.internal.Uint32, 0, false /* nullable */), ]); mojo.internal.Struct( apps.mojom.IconValueSpec.$, 'IconValue', 24, [ mojo.internal.StructField( 'iconCompression', 0, 0, apps.mojom.IconCompressionSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'uncompressed', 8, 0, gfx.mojom.ImageSkiaSpec.$, null, true /* nullable */), mojo.internal.StructField( 'compressed', 16, 0, mojo.internal.Array(mojo.internal.Uint8, false), null, true /* nullable */), mojo.internal.StructField( 'isPlaceholderIcon', 4, 0, mojo.internal.Bool, false, false /* nullable */), ]); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview Module for functions which produce action objects. These are * listed in one place to document available actions and their parameters. */ cr.define('app_management.actions', function() { /** * @param {App} app */ function addApp(app) { return { name: 'add-app', app: app, }; } /** * @param {App} app */ function changeApp(app) { return { name: 'change-app', app: app, }; } /** * @param {string} id */ function removeApp(id) { return { name: 'remove-app', id: id, }; } /** * @param {PageType} pageType * @param {string=} id */ function changePage(pageType, id) { if (pageType === PageType.DETAIL && !id) { console.warn( 'Tried to load app detail page without providing an app id.'); } return { name: 'change-page', pageType: pageType, id: id, }; } /** @return {!cr.ui.Action} */ function clearSearch() { return { name: 'clear-search', }; } /** * @param {string} term * @return {!cr.ui.Action} */ function setSearchTerm(term) { if (!term) { return clearSearch(); } return { name: 'start-search', term: term, }; } return { addApp: addApp, changeApp: changeApp, removeApp: removeApp, changePage: changePage, clearSearch: clearSearch, setSearchTerm: setSearchTerm, }; }); TM0+'Xi m/@{HQS@$ce 굷B]:,-IWͅx7AmfO_ LG?L*9 5&Ng0F)i2W1B,{* l@aN8g1 [f2j 6X02 0aYH eN'VN)&r//e\O\ĆIѻnn/FtG8af.mhv0qu׊@36)uIygFkXLtuD}{Q#v(tñыKOJx~YZ;x@J Iy۟Ed\-"2yAU[Q.㟘\6pW!\os؛[$j>Yi͟e5p^)Lgkk/jXe p•v[Y۲nl%QJײpZeWmƱ}OVdܙGe{kdeO߰)y{/ވF%// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('app_management.apiListener', function() { let initialized = false; async function init() { assert(!initialized); const {apps: initialApps} = await app_management.BrowserProxy.getInstance().handler.getApps(); const initialState = app_management.util.createInitialState(initialApps); app_management.Store.getInstance().init(initialState); const callbackRouter = app_management.BrowserProxy.getInstance().callbackRouter; callbackRouter.onAppAdded.addListener(onAppAdded); callbackRouter.onAppChanged.addListener(onAppChanged); callbackRouter.onAppRemoved.addListener(onAppRemoved); initialized = true; } /** * @param {cr.ui.Action} action */ function dispatch(action) { app_management.Store.getInstance().dispatch(action); } /** * @param {App} app */ function onAppAdded(app) { dispatch(app_management.actions.addApp(app)); } /** * @param {App} app */ function onAppChanged(app) { dispatch(app_management.actions.changeApp(app)); } /** * @param {string} appId */ function onAppRemoved(appId) { dispatch(app_management.actions.removeApp(appId)); } init(); return {}; }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-app-item', behaviors: [ app_management.StoreClient, ], properties: { /** @type {App} */ app: { type: Object, }, }, listeners: { 'click': 'onClick_', }, /** * @private */ onClick_: function() { this.dispatch( app_management.actions.changePage(PageType.DETAIL, this.app.id)); }, /** * @param {App} app * @return {string} * @private */ iconUrlFromId_: function(app) { return app_management.util.getAppIcon(app); }, }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-app', behaviors: [ app_management.StoreClient, ], properties: { /** @private */ searchTerm_: { type: String, }, /** * @private {Page} */ currentPage_: { type: Object, }, }, /** * @override */ attached: function() { this.watch('searchTerm_', function(state) { return state.search.term; }); this.watch('currentPage_', state => state.currentPage); this.updateFromStore(); }, /** * @param {Event} e * @private */ onSearchChanged_: function(e) { const searchTerm = /** @type {string} */ (e.detail); if (searchTerm != this.searchTerm_) { this.dispatch(app_management.actions.setSearchTerm(searchTerm)); } }, /** * @param {Page} currentPage * @param {String} searchTerm * @private */ selectedRouteId_: function(currentPage, searchTerm) { if (searchTerm) { return 'search-view'; } // This is to prevent console error caused by currentPage being undefined. if (currentPage) { switch (currentPage.pageType) { case (PageType.MAIN): return 'main-view'; case (PageType.NOTIFICATIONS): return 'notifications-view'; case (PageType.DETAIL): const state = this.getState(); const selectedAppType = state.apps[assert(state.currentPage.selectedAppId)].type; switch (selectedAppType) { case (AppType.kWeb): return 'pwa-permission-view'; case (AppType.kExtension): return 'chrome-app-permission-view'; case (AppType.kArc): return 'arc-permission-view'; default: assertNotReached(); } default: assertNotReached(); } } }, }); WQo6~ϯMNCvXM[&H*HJY XĔxxG<3S/,+GB8f_\)F,:(;~;3_I4#p#4h5 ,/r AI|lt2LUKEK_t r{9zrgڻ#?4 ޅ#=4.X.ISB=eϘ-.5< !uYQ}lh8 17J!7.O*m`Z:42 ,ɀ GkP@:)c WcxKᫎY$J>fc2)|N.BZEAAAFd_h_弒J!ݲ̐nUw5-Etu5Osē"y@n, @hPs xLKAcUgIZױKUclX렷1u& ۝pTRk^fӈ"vhr#mD~ NN+d$҆y Fr.YdWX&'6fI!4Nk"I>X򫉹!3 *GFf<(Ñ饧_Ër2Lo|8db#$]w6q9ҿu 7444f4ؽ@b 홦WR,u,[(Οlt[(nѵl8s9\ B7gVS~ds=e6V$>pr^x.\F DD51e*JDOԏRPq'ưcq 5 b9{KF}4i݌Càm6MFo`ͮ&xiL2'uo`c5m// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-arc-permission-view', behaviors: [ app_management.StoreClient, ], properties: { /** * @private {App} */ app_: Object, /** * @private {boolean} */ listExpanded_: { type: Boolean, value: false, }, }, attached: function() { this.watch('app_', state => app_management.util.getSelectedApp(state)); this.updateFromStore(); this.listExpanded_ = false; }, onClickNativeSettingsButton_: function() { app_management.BrowserProxy.getInstance().handler.openNativeSettings( this.app_.id); }, /** * @private */ toggleListExpanded_: function() { this.listExpanded_ = !this.listExpanded_; }, /** * @param {App} app * @return {string} * @private */ iconUrlFromId_: function(app) { return app_management.util.getAppIcon(app); }, /** * @param {boolean} listExpanded * @return {string} * @private */ getCollapsedIcon_: function(listExpanded) { return listExpanded ? 'cr:expand-less' : 'cr:expand-more'; }, }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('app_management', function() { class BrowserProxy { constructor() { /** @type {appManagement.mojom.PageCallbackRouter} */ this.callbackRouter = new appManagement.mojom.PageCallbackRouter(); /** @type {appManagement.mojom.PageHandlerInterface} */ this.handler = null; const urlParams = new URLSearchParams(window.location.search); const useFake = urlParams.get('fakeBackend'); if (useFake) { this.handler = new app_management.FakePageHandler( this.callbackRouter.createProxy()); const /** @type {!Array}*/ appList = [ app_management.FakePageHandler.createApp( 'ahfgeienlihckogmohjhadlkjgocpleb', {title: 'Web Store'}), app_management.FakePageHandler.createApp( 'aohghmighlieiainnegkcijnfilokake', {title: 'Docs', type: AppType.kArc}), app_management.FakePageHandler.createApp( 'blpcfgokakmgnkcojhhkbfbldkacnbeo', {title: 'Youtube', type: AppType.kCrostini}), app_management.FakePageHandler.createApp( 'pjkljhegncpnkpknbcohdijeoejaedia', {title: 'Gmail'}), app_management.FakePageHandler.createApp( 'aapocclcgogkmnckokdopfmhonfmgoek', {title: 'Slide'}), ]; this.handler.setApps(appList); } else { this.handler = new appManagement.mojom.PageHandlerProxy(); const factory = appManagement.mojom.PageHandlerFactory.getProxy(); factory.createPageHandler( this.callbackRouter.createProxy(), this.handler.$.createRequest()); } } } cr.addSingletonGetter(BrowserProxy); return {BrowserProxy: BrowserProxy}; }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-chrome-app-permission-view', behaviors: [ app_management.StoreClient, ], properties: { /** * @private {App} */ app_: { type: Object, observer: 'onAppChanged_', }, /** * @private {Array} */ messages_: Object, }, attached: function() { this.watch('app_', state => app_management.util.getSelectedApp(state)); this.updateFromStore(); }, /** * @private */ onAppChanged_: async function() { const {messages: messages} = await app_management.BrowserProxy.getInstance() .handler.getExtensionAppPermissionMessages(this.app_.id); // TODO(ceciliani) Remove this after app service can fetch description. this.$['app-description'].hidden = this.app_.description.length === 0; this.messages_ = messages; }, onClickExtensionsSettingsButton_: function() { app_management.BrowserProxy.getInstance().handler.openNativeSettings( this.app_.id); }, /** * @param {!Array} messages * @return {Array} * @private */ getPermissionMessages_: function(messages) { return messages.map(m => m.message); }, /** * @param {number} index * @param {!Array} messages * @return {?Array} * @private */ getPermissionSubmessagesByMessage_: function(index, messages) { // Dom-repeat still tries to access messages[0] when app has no // permission therefore we add an extra check. if (!messages[index]) { return null; } return messages[index].submessages; }, /** * @param {!Array} messages * @return {boolean} * @private */ hasPermissions_: function(messages) { return messages.length > 0; } }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * The number of apps displayed in app list in the main view before expanding. * @const {number} */ const NUMBER_OF_APPS_DISPLAYED_DEFAULT = 4; /** * The maximum number of apps' titles previewed in notification sublabel. * @const {number} */ const APP_LIST_PREVIEW_APP_TITLES = 3; /** * Enumeration of the different subpage types within the app management page. * @enum {number} * @const */ const PageType = { MAIN: 0, DETAIL: 1, NOTIFICATIONS: 2, }; /** * A number representation of a Bool. Permission values should be of this type * for permissions with value type PermissionValueType.kBool. * @enum {number} * @const */ const Bool = { kFalse: 0, kTrue: 1, }; const PwaPermissionType = appManagement.mojom.PwaPermissionType; const ArcPermissionType = appManagement.mojom.ArcPermissionType; const AppType = apps.mojom.AppType; const PermissionValueType = apps.mojom.PermissionValueType; const TriState = apps.mojom.TriState; const OptionalBool = apps.mojom.OptionalBool; // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * This is an expanding container for a list of apps that shows some items by * default and can be expanded to show more. * * Note: The implementation assumes children are all the same height. * * Example usage: * * * */ Polymer({ is: 'app-management-expandable-app-list', properties: { /** * Title of the expandable list. * @type {String} */ listTitle: { type: String, value: '', observer: 'onListTitleChanged_', }, /** The number of apps to collapse down to. */ collapsedSize: { type: Number, value: NUMBER_OF_APPS_DISPLAYED_DEFAULT, }, /** @private {boolean} */ listExpanded_: { type: Boolean, observer: 'onListExpandedChanged_', }, }, listeners: { 'dom-change': 'onDomChange_', }, attached: function() { // Hide on reattach. this.listExpanded_ = false; this.$.collapse.hide(); // Recalculate child heights on reattach. this.onDomChange_(); }, /** @private */ onAppsChanged_: function(change) {}, /** @private */ onListTitleChanged_() { this.$['app-list-title'].hidden = !this.listTitle; }, /** @private */ onDomChange_: function() { let collapsedHeight = 0; let numChildren = 0; for (const child of this.$.collapse.getContentChildren()) { // Wait until we have an actual child element rather than just the // dom-repeat. if (child.tagName == 'DOM-REPEAT' || child.tagName == 'TEMPLATE') { continue; } if (numChildren < this.collapsedSize) { collapsedHeight += child.offsetHeight; } numChildren++; } this.style.setProperty( '--collapsed-height', String(collapsedHeight) + 'px'); this.$['expander-row'].hidden = numChildren <= this.collapsedSize; }, /** @private */ toggleListExpanded_: function() { this.listExpanded_ = !this.listExpanded_; }, /** @private */ onListExpandedChanged_() { // TODO(calamity): Hiding should display:none after the animation to prevent // tabbing into hidden items. const collapse = this.$.collapse; // Since iron-collapse does not support a 'min-height' property, we force it // to animate to the collapsed height. if (this.listExpanded_) { // Reset the opened state, or show won't work. collapse.hide(); collapse.show(); } else { // This technically leaves the collapse open. collapse.updateSize('var(--collapsed-height)', true); } }, /** * @param {boolean} listExpanded * @return {string} * @private */ getCollapsedIcon_: function(listExpanded) { return listExpanded ? 'cr:expand-less' : 'cr:expand-more'; }, /** * @param {number} numApps * @param {boolean} listExpanded * @return {string} * @private */ moreAppsString_: function(numApps, listExpanded) { return listExpanded ? loadTimeData.getString('lessApps') : loadTimeData.getStringF('moreApps', numApps - this.collapsedSize); }, }); // Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview * app-management-dom-switch is used to select one element to be displayed at a * time from a group of elements. When an element is selected, it is attached * to the DOM. When another element is selected, the first element is * detached, meaning only one of the elements is attached at a time. * * The elements are selected by giving them each a route-id attribute, then * setting the route property of the dom-switch equal to the route-id of the * element to be shown. * * Data binding from the parent element of the dom-switch to its child * elements works as usual. * * Usage: * * * * * * * this.$['view-selector'].route = 'view-two'; */ Polymer({ is: 'app-management-dom-switch', behaviors: [Polymer.Templatizer], properties: { /** * Should contain the route-id of one of the elements within the dom-switch. * @private {?string} */ route: { type: String, observer: 'onRouteChanged_', }, /** * The template instance. * @private {?Element} */ instance_: { type: Object, value: null, }, /** * Maps the route-id of each element within the dom-switch to the element * itself. * @private {Object} */ children_: { type: Object, value: () => ({}), }, /** * The element whose route-id corresponds to the current route. This is the * only element within the dom-switch which is attached to the DOM. * @private {?Element} */ selectedChild_: { type: Object, value: null, }, }, attached: function() { const template = this.getContentChildren()[0]; this.templatize(template); // This call stamps all the child elements of the dom-switch at once // (calling their created Polymer lifecycle callbacks). If optimisations // are required in the future, it may be possible to only stamp children // on demand as they are rendered. this.instance_ = this.stamp({}); const children = this.instance_.root.children; for (const child of children) { this.children_[child.getAttribute('route-id')] = child; } }, /** * @param {string} newRouteId */ onRouteChanged_: function(newRouteId) { if (!this.instance_) { return; } const newSelectedChild = this.children_[newRouteId]; assert( newSelectedChild, 'The route must be equal to the route-id of a child element.'); if (this.selectedChild_) { this.parentNode.replaceChild(newSelectedChild, this.selectedChild_); } else { this.parentNode.insertBefore(newSelectedChild, this); } this.selectedChild_ = newSelectedChild; }, /** * TODO(dpapad): Delete this method once migration to Polymer 2 has finished. * @param {string} prop * @param {Object} value */ _forwardParentProp: function(prop, value) { if (this.instance_) { this.instance_[prop] = value; } }, /** * TODO(dpapad): Delete this method once migration to Polymer 2 has finished. * @param {string} path * @param {Object} value */ _forwardParentPath: function(path, value) { if (this.instance_) { this.instance_.notifyPath(path, value, true); } }, /** * @param {string} prop * @param {Object} value */ _forwardHostPropV2: function(prop, value) { if (this.instance_) { this.instance_.forwardHostProp(prop, value); } }, }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('app_management', function() { /** * @implements {appManagement.mojom.PageHandlerInterface} */ class FakePageHandler { /** * @return {!Object} */ static createWebPermissions() { const permissionIds = [ PwaPermissionType.CONTENT_SETTINGS_TYPE_GEOLOCATION, PwaPermissionType.CONTENT_SETTINGS_TYPE_NOTIFICATIONS, PwaPermissionType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, PwaPermissionType.CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, ]; const permissions = {}; for (const permissionId of permissionIds) { permissions[permissionId] = app_management.util.createPermission( permissionId, PermissionValueType.kTriState, TriState.kAllow); } return permissions; } /** * @return {!Object} */ static createArcPermissions() { const permissionIds = [ ArcPermissionType.CAMERA, ArcPermissionType.LOCATION, ArcPermissionType.MICROPHONE, ]; const permissions = {}; for (const permissionId of permissionIds) { permissions[permissionId] = app_management.util.createPermission( permissionId, PermissionValueType.kBool, Bool.kTrue); } return permissions; } /** * @param {AppType} appType * @return {!Object} */ static createPermissions(appType) { switch (appType) { case (AppType.kWeb): return FakePageHandler.createWebPermissions(); case (AppType.kArc): return FakePageHandler.createArcPermissions(); default: return {}; } } /** * @param {string} id * @param {Object=} optConfig * @return {!App} */ static createApp(id, optConfig) { const app = { id: id, type: apps.mojom.AppType.kWeb, title: 'App Title', description: '', version: '5.1', size: '9.0MB', isPinned: apps.mojom.OptionalBool.kFalse, permissions: {}, }; if (optConfig) { Object.assign(app, optConfig); } // Only create default permissions if none were provided in the config. if (!optConfig || optConfig.permissions === undefined) { app.permissions = FakePageHandler.createPermissions(app.type); } return app; } /** * @param {appManagement.mojom.PageProxy} page */ constructor(page) { /** @type {appManagement.mojom.PageProxy} */ this.page = page; /** @type {!Array} */ this.apps_ = []; this.$ = { flushForTesting: async () => { await this.page.$.flushForTesting(); } }; /** @type {number} */ this.guid = 0; } async getApps() { return {apps: this.apps_}; } /** * @param {string} appId * @return {!Promise} */ async getExtensionAppPermissionMessages(appId) { return []; } /** * @param {!Array} appList */ setApps(appList) { this.apps_ = appList; } /** * @param {string} appId * @param {OptionalBool} pinnedValue */ setPinned(appId, pinnedValue) { const app = app_management.Store.getInstance().data.apps[appId]; const newApp = /** @type {App} */ (Object.assign({}, app, {isPinned: pinnedValue})); this.page.onAppChanged(newApp); } /** * @param {string} appId * @param {Permission} permission */ setPermission(appId, permission) { const app = app_management.Store.getInstance().data.apps[appId]; // Check that the app had a previous value for the given permission assert(app.permissions[permission.permissionId]); const newPermissions = Object.assign({}, app.permissions); newPermissions[permission.permissionId] = permission; const newApp = /** @type {App} */ ( Object.assign({}, app, {permissions: newPermissions})); this.page.onAppChanged(newApp); } /** * @param {string} appId */ uninstall(appId) { this.page.onAppRemoved(appId); } /** * @param {string} appId */ openNativeSettings(appId) {} /** * @param {string} optId * @param {Object=} optConfig * @return {!Promise} */ async addApp(optId, optConfig) { optId = optId || String(this.guid++); const app = FakePageHandler.createApp(optId, optConfig); this.page.onAppAdded(app); await this.$.flushForTesting(); return app; } /** * Takes an app id and an object mapping app fields to the values they * should be changed to, and dispatches an action to carry out these * changes. * @param {string} id * @param {Object} changes */ async changeApp(id, changes) { this.page.onAppChanged(FakePageHandler.createApp(id, changes)); await this.$.flushForTesting(); } } return {FakePageHandler: FakePageHandler}; }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-main-view', behaviors: [ app_management.StoreClient, ], properties: { /** * @private {AppMap} */ apps_: { type: Object, observer: 'onAppsChanged_', }, /** * List of apps displayed before expanding the app list. * @private {Array} */ appsList: { type: Array, value: () => [], }, /** * A set containing the ids of all the apps with notifications enabled. * @private {!Set} */ notificationAppIds_: { type: Object, observer: 'getNotificationSublabel_', }, }, attached: function() { this.watch('apps_', state => state.apps); this.watch('notificationAppIds_', state => state.notifications.allowedIds); this.updateFromStore(); }, /** * @private */ onAppsChanged_: function() { this.appsList = Object.values(this.apps_); }, /** @private */ onClickNotificationSublabel_: function() { this.dispatch(app_management.actions.changePage(PageType.NOTIFICATIONS)); }, /** * Show a string with apps' |title|(s) previewed into a label, with each * title ellipsised if too long. * @private */ getNotificationSublabelPieces_: async function() { const notificationApps = Array.from(this.notificationAppIds_, id => this.getState().apps[id]); const /** @type {string} */ label = await cr.sendWithPromise( 'getPluralString', 'appListPreview', notificationApps.length); const substitutions = []; for (let i = 0; i < APP_LIST_PREVIEW_APP_TITLES && i < notificationApps.length; i++) { substitutions.push(notificationApps[i].title); } // Add X more apps if the length is more than APP_LIST_PREVIEW_APP_TITLES. if (notificationApps.length >= APP_LIST_PREVIEW_APP_TITLES + 1) { substitutions.push(notificationApps.length - APP_LIST_PREVIEW_APP_TITLES); } // Only APP_LIST_PREVIEW_APP_TITLES of apps' titles get ellipsised // if too long. the element after that is "X other apps" const placeholder = APP_LIST_PREVIEW_APP_TITLES + 1; const pieces = loadTimeData.getSubstitutedStringPieces(label, ...substitutions) .map(function(p) { // Make the titles of app collapsible but make the number in the // "X other app(s)" part non-collapsible. p.collapsible = !!p.arg && p.arg !== '$' + placeholder; return p; }); return pieces; }, /** * Create for each app title previewed, * making certain text fragments collapsible. */ getNotificationSublabel_: async function() { const pieces = await this.getNotificationSublabelPieces_(); // Create for each app title previewed, // making certain text fragments collapsible. const textContainer = this.$['notifications-sublabel']; textContainer.textContent = ''; for (const p of pieces) { if (!p.value || p.value.length === 0) { return; } const span = document.createElement('span'); span.textContent = p.value; if (p.collapsible) { span.classList.add('collapsible'); } textContainer.appendChild(span); } }, }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-metadata-view', behaviors: [ app_management.StoreClient, ], properties: { /** @type {App} */ app_: { type: Object, }, }, attached: function() { this.watch('app_', state => app_management.util.getSelectedApp(state)); this.updateFromStore(); }, /** * @param {App} app * @return bool * @private */ pinToShelfToggleVisible_: function(app) { return app.isPinned !== OptionalBool.kUnknown; }, /** * Returns a bool representation of the app's isPinned value, used to * determine the position of the "Pin to Shelf" toggle. * @param {App} app * @return bool * @private */ isPinned_: function(app) { return app.isPinned === OptionalBool.kTrue; }, /** @private */ togglePinned_: function() { let newPinnedValue; switch (this.app_.isPinned) { case OptionalBool.kFalse: newPinnedValue = OptionalBool.kTrue; break; case OptionalBool.kTrue: newPinnedValue = OptionalBool.kFalse; break; default: assertNotReached(); } app_management.BrowserProxy.getInstance().handler.setPinned( this.app_.id, assert(newPinnedValue)); }, /** * @param {App} app * @return {?string} * @private */ versionString_: function(app) { if (!app.version) { return null; } return loadTimeData.getStringF('version', assert(app.version)); }, /** * @param {App} app * @return {?string} * @private */ sizeString_: function(app) { if (!app.size) { return null; } return loadTimeData.getStringF('size', assert(app.size)); }, }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-notifications-view', behaviors: [ app_management.StoreClient, ], properties: { /** * @private {AppMap} */ apps_: { type: Object, observer: 'onAppsChanged_', }, /** @private {!Array} */ appsList_: { type: Array, computed: 'calculateAppsList_(allowed_.*, blocked_.*)', }, /** * List of apps with notification permission * displayed before expanding the app list. * @private {!Array} */ allowed_: { type: Array, value: () => [], }, /** * List of apps without notification permission * displayed after expanding app list. * @private {!Array} */ blocked_: { type: Array, value: () => [], }, }, attached: function() { this.watch('apps_', state => state.apps); this.updateFromStore(); this.onViewLoaded_(); }, /** * Creates arrays of displayed and collapsed apps based on the sets of apps * with notifications allowed and blocked in the Store. The orders of apps * in these arrays should then remain fixed while this view is showing. * * If all the apps have / don't have notification permission, display the * whole list, else display those with notification permission before * expanding. * @private */ onViewLoaded_: function() { const state = this.getState(); this.allowed_ = Array.from(state.notifications.allowedIds, id => state.apps[id]); this.blocked_ = Array.from(state.notifications.blockedIds, id => state.apps[id]); }, /** * Updates the lists of displayed and collapsed apps when any changes occur * to the apps in the Store, maintaining the original order of apps in the * lists. New lists are created so that Polymer bindings will re-evaluate. * @private */ onAppsChanged_() { const unhandledAppIds = new Set(Object.keys(this.apps_)); this.allowed_ = this.updateAppList_(this.allowed_, unhandledAppIds); this.blocked_ = this.updateAppList_(this.blocked_, unhandledAppIds); // If any new apps have been added, append them to the appropriate list. for (const appId of unhandledAppIds) { const app = this.apps_[appId]; const allowed = app_management.util.notificationsAllowed(app); if (allowed === OptionalBool.kUnknown) { continue; } if (allowed === OptionalBool.kTrue) { this.push('allowed_', app); } else { this.push('blocked_', app); } } }, /** * @private * @return {!Array} */ calculateAppsList_() { return this.allowed_.concat(this.blocked_); }, /** * @private * @return {number} */ getCollapsedSize_() { return this.allowed_.length || this.blocked_.length; }, /** * Creates a new list of apps with the same order as the original appList, * but using the updated apps from this.apps_. As each app is added to the * new list, it is also removed from the unhandledAppIds set. * @param {!Array} appList * @param {!Set} unhandledAppIds * @return {!Array} * @private */ updateAppList_(appList, unhandledAppIds) { const newApps = []; for (const app of appList) { if (unhandledAppIds.has(app.id)) { newApps.push(this.apps_[app.id]); unhandledAppIds.delete(app.id); } } return newApps; }, /** @private */ onClickBackButton_: function() { if (!window.history.state) { this.dispatch(app_management.actions.changePage(PageType.MAIN)); } else { window.history.back(); } }, /** * Returns a boolean representation of the permission value, which used to * determine the position of the permission toggle. * @param {App} app * @return {boolean} * @private */ getNotificationValueBool_: function(app) { return app_management.util.getPermissionValueBool( app, this.notificationsPermissionType(app)); }, /** * @param {App} app * @return {string} * @private */ notificationsPermissionType_: function(app) { return assert(app_management.util.notificationsPermissionType(app)); }, }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-permission-item', behaviors: [ app_management.StoreClient, ], properties: { /** * The name of the permission, to be displayed to the user. * @type {string} */ permissionLabel: String, /** * A string version of the permission type. Must be a value of the * permission type enum corresponding to the AppType of app_. * E.g. A value of PwaPermissionType if app_.type === AppType.kWeb. * @type {string} */ permissionType: String, /** * @type {App} */ app_: Object, /** * @type {string} */ icon: String, }, listeners: { 'click': 'onClick_', }, attached: function() { this.watch('app_', state => app_management.util.getSelectedApp(state)); this.updateFromStore(); }, /** * @private */ onClick_: function(e) { e.preventDefault(); const /** @type {AppManagementPermissionToggleElement} */ toggle = this.$['permission-toggle']; toggle.togglePermission_(); }, }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-permission-toggle', properties: { /** * @type {App} */ app: Object, /** * A string version of the permission type. Must be a value of the * permission type enum corresponding to the AppType of app_. * E.g. A value of PwaPermissionType if app_.type === AppType.kWeb. * @type {string} */ permissionType: String, }, /** * @param {App} app * @param {string} permissionType * @return {boolean} */ getPermissionValueBool_: function(app, permissionType) { if (app === undefined || permissionType === undefined) { return false; } assert(app); return app_management.util.getPermissionValueBool(app, permissionType); }, togglePermission_: function() { assert(this.app); /** @type {!Permission} */ let newPermission; switch (app_management.util.getPermission(this.app, this.permissionType) .valueType) { case PermissionValueType.kBool: newPermission = this.getNewPermissionBoolean_(this.app, this.permissionType); break; case PermissionValueType.kTriState: newPermission = this.getNewPermissionTriState_(this.app, this.permissionType); break; default: assertNotReached(); } app_management.BrowserProxy.getInstance().handler.setPermission( this.app.id, newPermission); }, /** * @param {App} app * @param {string} permissionType * @return {!Permission} * @private */ getNewPermissionBoolean_: function(app, permissionType) { let newPermissionValue; switch (app_management.util.getPermission(app, permissionType).value) { case Bool.kFalse: newPermissionValue = Bool.kTrue; break; case Bool.kTrue: newPermissionValue = Bool.kFalse; break; default: assertNotReached(); } assert(newPermissionValue !== undefined); return app_management.util.createPermission( app_management.util.permissionTypeHandle(app, permissionType), PermissionValueType.kBool, newPermissionValue); }, /** * @param {App} app * @param {string} permissionType * @return {!Permission} * @private */ getNewPermissionTriState_: function(app, permissionType) { let newPermissionValue; switch (app_management.util.getPermission(app, permissionType).value) { case TriState.kBlock: newPermissionValue = TriState.kAllow; break; case TriState.kAsk: newPermissionValue = TriState.kAllow; break; case TriState.kAllow: // TODO(rekanorman): Eventually TriState.kAsk, but currently changing a // permission to kAsk then opening the site settings page for the app // produces the error: // "Only extensions or enterprise policy can change the setting to ASK." newPermissionValue = TriState.kBlock; break; default: assertNotReached(); } assert(newPermissionValue !== undefined); return app_management.util.createPermission( app_management.util.permissionTypeHandle(app, permissionType), PermissionValueType.kTriState, newPermissionValue); }, }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-permission-view-header', behaviors: [ app_management.StoreClient, ], properties: { /** @type {App} */ app_: { type: Object, }, }, attached: function() { this.watch('app_', state => app_management.util.getSelectedApp(state)); this.updateFromStore(); }, /** * @param {App} app * @return {string} * @private */ iconUrlFromId_: function(app) { return app_management.util.getAppIcon(app); }, /** * @private */ onClickBackButton_: function() { if (!window.history.state) { this.dispatch(app_management.actions.changePage(PageType.MAIN)); } else { window.history.back(); } }, /** * @private */ onClickUninstallButton_: function() { app_management.BrowserProxy.getInstance().handler.uninstall(this.app_.id); }, }); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'app-management-pwa-permission-view', behaviors: [ app_management.StoreClient, ], properties: { /** * @private {App} */ app_: Object, /** * @private {boolean} */ listExpanded_: { type: Boolean, value: false, }, }, attached: function() { this.watch('app_', state => app_management.util.getSelectedApp(state)); this.updateFromStore(); this.listExpanded_ = false; }, /** * @private */ onClickSiteSettingsButton_: function() { app_management.BrowserProxy.getInstance().handler.openNativeSettings( this.app_.id); }, /** * @private */ toggleListExpanded_: function() { this.listExpanded_ = !this.listExpanded_; }, /** * @param {App} app * @return {string} * @private */ iconUrlFromId_: function(app) { return app_management.util.getAppIcon(app); }, /** * @param {boolean} listExpanded * @return {string} * @private */ getCollapsedIcon_: function(listExpanded) { return listExpanded ? 'cr:expand-less' : 'cr:expand-more'; }, }); T8}K&a92'a PYI-d1SS[P&=-V^Z×|Խ{?o0wn}3ux3j1nҴvnO꾅`0oL\ھs8$fZMM GiŻWbuAsoCҦPhф ƿQbi('ȕP{ _mLvmoNشj{4Ŝ)lI@kM(*k!򱌔Ûĩ˞QPrl}} ֵn?~0i/pobz[7?ޝqx;pI\WXwV\pz~o፟FFc zlwvH_VY[S~WN ,I x&$v2>ȶhp,æ#ˎ8ڄ[sUf+rr>8;'B,F4;IΈd/,6鱘gJ0W\13FxJ2ˈ鑐TnBu#\RY/xDFPȆ5Wd# A_ $xD"9npЈRHČLRH H'G<# Cui 8F k&5\JA@8*Y@%% R2Z",U47IT1iI$PסܔqtPb7mUVh̀ 12te-#:1^H0t4XWtY$۰ qt8eFܹ>g79owL:d4{xۻ&c=4y0|$sjT's|.p5s`;׺@6m;u{Co7|׸otgǰvrxK}n+ bSZKX)!RilE"rH^W\#^$)+bCrvsu򟓓Ts N,݉٫YIR. Ɋ1K үz&$t[+_{|wҏ[ udDaE8 yCWML -!@5dUSlhB.͡p: C!}(U^?9_B`GyZ(W:mWc eW|7b&UT+OY$ Um%otXM/DBk`Uܕn] :  ~ǽ qz7µ/|RTي҄Z\Ь^ݚ%qcE ׻%}?ªaQSddh_М\z,eYBU+ju.A҅Mi TPT]%%UKi V /iu~іj7LQ{F-A4 [`R8hJ![jVbf*JMFGIof)h&¿p.A`VBdUbMᬙ})JP{iŤTy'S!?96w? һ%kοUV*6[IHR0ZFͳry\c*ʡсU>γQ0IZdF8u6_˴Llz8F%6HQl$?1IeDU)`ӳ8?4CqV&0c -q4I+R ˆ@_"@xI\D^ $N8ͯȴJŠ=ȡHҊY:)A!iЈ;$mAt 檌AV)%t} "Ot _ rW$a1 9 ʏ2?nPxd%匌P]WDMl%;INޞ~:MG?$o~dO{?;M$[;x͇ӣh'ZuS$G=o;{?"Syzԧ]-;sO˷{ۣc:>upd7AvNvw{x7E8Gw.`fn"Ym`" G@'ww.uS=?&;[[?z m8=@܁%'ޜ~8M~8:ڡl?=qo{d#?:pK:ݢ`Ԁ|8٣,;<=>tc8nACOAG|| ߏk[Ȏ^ fR{?nb#qdwh J;F)}:dk=ğy8Cٷs`q*9#-N#!_v`n&̧v= ;'%} BS(쏧m_j^?mI~9:UI~NI2F_HLIN\eI2G鄬'2]pӏ7Ivȩ0RX e?=#͒s|N:Y2/*`Bu-ҊH 5+_o)1e *y4?kCFܧ'破 )R;]KH*NG1uoz2* M_). )k2,?9awx=NVPeuq>eMIbYOH:e *&i7MG"P>Ϧ,;nVەVF),:No@r\w Y7L1+ !A'y' R132i0p`JEv^:U}mC_^c`3vZxE/æ/3p>Ub>t域ӚyUQM E;iAN~z 6(e$A3 8^_mBb{l|B z`lw5vng`VW_l %i-BmҀp#o,UK40F,fSƺEdABp h=MW0Ш`=KG ) c+ t65_Xikth[}][+ߑ$"r2| -nw&&ݿϟO>:$l W=(O{&a@H d}oWx14x(ڳ0ZHꚋϞ?^]>YEp8q.V"nDgȇO~ RbC'y$y KOS&[J~5y~k6a4& _iƙZ#[vE5̈́z=1*}8@0 dо4nB66kIǶ?QKV4&nמBCp8\$H[vya )IMPU|][ؼĿ8P7eazUMhw{=&ejgo ٘6Z# L ['ԭ1`JrpaB`żt21oLLj @tyS Ҡx#6e{GK866!bBjP]bh b#2 _Ɉ֖6/mh"' ]v76}cZcp}׭DS@`&q ٥TM`E~E: 4rMGdw. [܄@D=/BNz\J,QU*ݍe֞<3y} 5ɻ5>F]wR454>*H Ir]:0̀=@ i@ `0i-(3UE)p̰t kV,J"P>SL:阜gS20eLXC'k5Vxn鑟& oP6KO4U!f}QHZb^58ϊi y\ta,uCWe =jJM&eCF旆 |DFHT9v+6Rp0! Я/lO@} `]yڇ66Z>J:+ b9`]]cQ5e5**P+I|#p2K%H[Zإ?͙O~A9-I>3 BNlv*gUq]G>]O4NcܕRB$cϣjU9Pvdj~ōq<_[}_?hVH?fQ^Ǘ1``xeټh!|RT7']&Ʒ㠚`>^p#?rpwēy;ʄG<[gOcYAzX k Ë#9QM LOL&f̂7qQs9v5k*V:*lcxdB* ܡӄ~ x?|LfS3>]Y"xųχɋ|@@|Fإ|J= :h6տG"VZol `ٵo[k׾Иs}36~mq ]r(єVk2}QϣG%`vtҨWVV,\( JGi}ǚG}!{CzzuƎddcsO Ja^ۃ&c@\J>Eb M5RZwLub:X]V{R:$l1b2u6-Ks} 0h1cg:p1vQAG^o v1nj;ߍ[1OwHzɰW3;tu:⍌RTޫH4RKRvp@^g@?{55_N[~sfeNLM|l͒eL"Z{m7ӕQ -aR-t#NpahUtM@?K<><`=L^Zhۖ֠]*DT\5jN M3k]a׼m˭X4Fju.k]- ͎4 I~ j`$5, 4?u9 ݇m!ML̃m"4?-۟Ѻq4hb? p{ ׁGz,l&3ݠ> #U#PJ e MWs,Pb2ZgfSutÕJ\gUNVZ28-JR4H얛oțtxxâgCI(Bi(kanC<FCAbX.;0ZG-=roc2 ׎/Bҷi1^RjoŒ7څFH~$.NM5Vٶ5.wV͆j[+ۺbb[Uk1<XRH,UH;ֵC1(|oJԠ`䑌_ TADC/bSN 8˹ 7ͪ dRg}ݽ]B}| Z%^kiI <&# EtA UŜ&$ݿ f? L{=f̀'*0Q{Zeu46]x$]n%&M >a~{! MZLL"_dٵbC%0zXq Yg6hɆW1 R"(,J:T32=ӤH1YetqatD9 ~,#3u m&v N]tGVy26+^|o崕h-tlyVKs(1 ۻ״i0V |2 E)OFW7L!M:7+UVLPd&J[ #:-0n.y]%P\'['xnWɊl˘;CC.Pwi.:dA:M,FWo0eiBtqYy ]k|"!Bߨ|GPLc/f-DA6G9g CSL xSt[r-?${Q}d auaim ~91oj)WPÅ'~>E$WԚ [&Ǯd TKu+FL,E1R?R FRi>,ĤYPe7 ;.q~biEIݦ.O} ȳb OT4ߊrH-H,EiA7h 춼fW{x!Ңu) L%oX}^ J%;'NwJQЯ8`Ñ o6]Ϡ'@1J%M>~$-?KĝE:ujbׁوa@zŅe݌Խ5,{l6sSm?9!EyL5SKYܫ96+wPtC]"!Ͷ[R鴤ɒ-&usjW=9\`6 %Vl_G 2`ܱh,JATh'AHRI>\9V+Zu&I8`Ӳ$EJYXzj*[at4I1$n)=ͣ"ޞu*(Use$yh3"Uf ohs fAwu0웥2}4g\ׄS v>DQmr ;LQVFHZXz7/ k‡qW mȎ dװҙ]UR6Vx=Edrz<0Ӗo"q3cuG'ƩKƐ}38,I"Eb1^Wv&EXy67*l/f+ >A>&8$?l|/#̥m*ޓRxGD;hɾj-bԷނZ)G(}o3"Og3`6(+5+Z%;{ȕ9̷yPS8Ȃ8\M6Ї0dpJ 9Tk)1O{DM|>|L"[I<=ҫ?{<օ h\\/Ѻ}o}v6( { D (@:Qˇˡ攕8Tdf"Z`xúp1ONؓE 'O={ɓ2(,AKFYtj q=LWZjYYvཏXc$V ōZb̄ǿHiy#:Ohhޥ6DDy⋹M4ah{Bvs``Bٝ{قHߨc xḿ1Z$Ү,dϛ.(%+'5r>A^ȈQ7'O]ޘNǁ!E7\NaF`jxE< )(#LlgevIGy4u.(PN]yE,] CZxbnCI8W<ȏ bĂ}q#*##;eIU" ^VV.Deu7xţ3ipmKM3}妴MdWQPaGy/K~ 0ժ%u(,wmU";la<agd]'i2Iele;,DZ&ug1}8.[< 5ZpPks5ܐ9uC+kvd8o,3onke\|. C5\tۮ،7z/>^p#nwh0c=,qef;O-,X~y}ɸl}$ :z5ީYbɃK-CV|F2 xt{Y\_4L'XqkW8mw,6"nHmӿ+8r%Rd;;~,_ĊE&5)1;7dB͑#/I/p^e]Q#@3HjV;U-IqP'T1=HƂ2&1r/yA=x oㄕuLF yMCӍa֠+ul<&e,Uyok}!`a%xpI\Hkirnwg=Io!^g$tdA>3ylRBRP*ń: *yNu]u WK'o*e0dl^^*NFf QHý5oNt24W K00M;7IjSi7UYQ6=c[ C譟!f6ǚIGҖ;L y«}7Rre%/ժᅥ 5;f&1Z-nǴ +mZHW_C)ڪ"; tF,}F7gEvM-= Z7qp'Ct&?Aj7 ۍ,?[5Eh[_+`! J'WG8 azYA=vHn '6fLA=!j /wL-S-*dHѮR3}pc7S|XٵP-/o{(S7 e!eS%.QE1S4l TF: #<]T17.ȯ("jۧ_~VpdĘw4G՚rk-c9\ߛ ]{u%$ S8d /**OAc0f+KA8|̩>Q~xs"ia)&h'Ih,E{_(Co>,:KKt^ؐ|fkֲU?9C}K-Vl6 ^v MkBzߛ"F˙qSKjoRc3fnӯzߢCH17rDT tE>#:+v"cGLAƠ[/>vL+KV6Ok/"r&:Z J3aԿ"7eQ cb,VMLc;ϼ@>thJ~/y߇ٿ/BR#ԔOe&exsFPh \_څgV+WFmWO:G}|l}?=#5@&d]'fȝ_{u{e/v0AB ~)I_48M]zO7y1&ś,$tГl" Zqյ $9H\Ifvۗy^&4fHK?^Zh7%z#d'}mx#`-po:B')E|dDa8w֊':aDnWxv ҏ<06||VAb|Jf3L˽i:D!و:y'k6ĵZZv9_`[%ʟZ"1k/5 JgN~U?лPKΰ6oFW^!4  m7'Q*Kgǖ3jP7ׇ_N9 8͂Ċx.'F =G[+0Tr܊2ҸRbSҧ{QvPKucKo]gȝެ?UЩz۬/o9KE%=?Lo2=1 MsT_е)EsBsIh?]氍wнau17y]byу;s+?~b:Y &C590s-Zfx.fv oY`K7$oSV"W6yrkZ;vV@+;gòMWt˗6w;KC[+V(|ϩeNɭ-sFdzP_k y+o|8}`C]"eE~7ԤI]y17du5= ~XKu5l0"O47d 雱1U;kmpKlz?Cb%`/}"w Zs љprPsIs?6`v󰝬sţAw=m&j,%ckT&.vȯK|{1Vmn&x 8q dwF 'qVB~0?ݪ_ bd 6;OH>ݞ'] u2X> gEN~Yr-غAu>ٌfqe4xEL;?A_2/ʤM2 qsz#Czigï4 A;\/XMeM2~r9_eq`{n8,"5RJc) f2LuyLK[."v]ˇXޝdgXdٵ0wDd+׮N8/Dr^čF',׮AFnsh wޑDL%Z{!bwR"$vLf%^A_ Á/,"y_* m Z5{h7Dg_Yq+٪C)V8t0t2lqo{Dkjpsl#xqkC݉Hxr+w&wt<1o& M0Xu.v#N1>d`:OhmN#tI_y%'bN7vјO#6c P fLûȤ҃}vV 6]THz]^B(k =r~zD/=F2ȅsٶ_}ٚ~zF׭`´ <\;oC7|0|No%*YT;zPDb@%Ҙ'qcgtY 4lnSSޜ[7UўtK1:wM-vUnk3*x؜W-S|Zhu@X 6 &GUFEɿS)0^GgY CssKc+|}KxX\;xzo~B p"dF7L%Y]Ѿr0>}2{s_O.1$@d]^/ vdgg'b 6/Z-9; EA6e]ey}mdzw^ @o J:&/OP#j g6W/Wzm̟jc^'7>yz<۩rrny%>\Ew1NmBj9]pVDn6ҊЯT/7W\?;JGi6֧i(T%lƺbW [YەsB~k0+?PRPƀNA&F:F%NlLD;bGf|:TkMM&Av4qF1hy5vfls0[.,eB5c/&*5]A`OtJPa T&`JyZc o n1"Klg!d -O޵Z-ZnD^ӣv(17pB)JZb =W?ܳ}0߂oc*Wx]~AQ@4RQckJ ^BeA7EKFYp wq#_-ʭ\vx}`BXU6\zj52ѭMM  |jY7ˋ(ePzL^qAr(qGNAsCt&-hG}Әup kv?=Зwx穼Ok.3A0$jCo-p<~  Ha?y2pφ?l d^ 1 '%,[ jִ>5m26!pñS+j&Ϛ*v(RD; uknD. WMFZ?h-6(2XYڃ*SӬ#QA.5$yڼ` ҷA#XRtKYw;`[UZܱuInp;BZ1vxE "Ό?&X {Z-W$@$' :;+qH%qm4<ӢsO9ϡj3\/-ө}ZYG&Գƒ:\%\7b3ˬ(%G6ࣇPfB91td[t"ٜ>d,ϛOQB\O5` YR/h̥|l_\~QOdw-l/ dҚNJk. H\0{,Cn/{/7N\h(<4 :[:AO4l+b{jmuCC9 ZġzfJ|aT43Y6š cŌ$"vc&bSNOjok/zY<~た vgb|TadGmPi׿ϻkdͅf;M pߦ}k+ jxƹhl)i>#_CbO;<гj cf^\*<ϙ:Gj)!P ,)[`pːo}h&K4hoE~+۠b|^_m `-6iA#hti"M;aBYUO^<7l?zwj!5*L󃏾ZaN^n "i.q4~ pΤ13(?X}f yD#|!OsX=zG:Ϡΰ'l ՍvL6Z=e\ V ~>_@vƓAqh嚕*'x,lab- /_R _PIH)xc=7[z-Uքa?Rl9CZX27`k*vff1u(+M:ƗlbNd q\?(Jn%o.kVss_;{<=qh_)|mgB?>Ǿᣳ^ŏa˹>ds )tӵ)gPW[*_ӧr׸h|G: X21X_B҄{B̺#!vi,ϐxÜ%)?Qc|4e{-m:ӶԢo3fbhZp^pi5Cy8pm#~V+n@;5CaSVsH>AAܮ☵'I6N)z~R$ BGޜUcC4'| 8JHA|˕H);܏PzOmc>ޞ{ Ÿ r . pc1d(O'U)X[%r9ha*6]skw>-!"`Nk]'[A";kvt =Vk~≭cr&7%03RT)^Gp =VPRg^C$\^5@!,r擎7^ۏE4V\ׄV}=Ѧ:s_w7k˙zϻmf2;/%*[{4fjagцng8*MuH7zaK+BYcrXhg. i(jMXo؎: CU GeK.#z # ~{1$h($&y9u>7j6w i`y,^Esʷ}ML_(/7=sD;iJ3ҁE jC#ߍh$:VQEsL$s0<#rIwP뎛!F; &w>l̷A&.&9GkN븩mIavF'6RW-|>J}eKc lǦ]/pύ$NեǏ) x|N~ inYO,/p N$ UIzgd$tZftG ?D}os/Rwkyy2[Dz2P9 >TAh!yOD'm.2|6-gR{Lp(yx`T]aEj{M:.H1es-H KlU,{]5Fע9֎H\zZgT6 <@Eyxpy8UӸ){:Cx䒲/GcXWqO^kFW18T+_ã}H<"xy w8oG@ k6j^CATwi-ޫKi] G`u;M1h[~>"`.g޹8kN*+Ц-;Gfm3պ+W3*4_uDӗRm<e/7WiBecˢcHJ[1 BqJb0='O(=Ӿuuwp&- LwL$ G%~!Gwrk?dsW s5'`8_Pؽyʪgwu_0(Xp/ \Byߌ[^Å[zly[V& )&H|ŻL:42Zh&Ƚ;ޔ`fܮ44gS'Vl&p^vВ] *v$=()C>%+cۚFgFUl߆x>aE,6N<^t1/E E;"o^6'V[] =yD!1F%K73r$| !W:i>mAfj` 5]M3 C/f2u2O'\#)AhD@?Řkf6=~d1:7xwA7|:f/f8h!Ҵ.W}&#L~ t'U> T=gFMz׿v)Bo2'}ƺsU_p4O ;Rn$/Nu~ZFgSXQEbҀAGK2 dDφM%,#,# K3 ֞AS>ǎqa-ۂ֛ܤ_>HO9Io@E_oR_ 5;q%% TT:Ql&/,ǻMٝP!mdX{"U_2Rq'6Ρi"ݎW?­B'g݄ ťqgOeYצ/wcVg\+%<4$} _p u٭,eJl䥮`>1rutCq@M}Zl}H܀ RkSkT1iY9#<#ㄦhg<ѧs"ۀ'>~TBeHOZ wo7մdҁʀ3jŃf)D|5ȇxpȜБ|-R٘"(;# >+i^%H$e96^\/ { \q%14yhSMn$_#9lsOhyrM&UU'z@g|+#ދwy-X;_ɗ=噚<$^_>ako]Zݸb&K dU6īlrÃ/yҨ_Sp/A?q0ad8|' e~fW4EvMs`Y:48Ռ9s;6U<2?|JsM*R]LERBԻlšQetX7]SOZۇS]9ڠ+<z g\Pid9hK Z3:>56`k(*<as"B>8LfsznM&  .Fd.kko@{s\<:z~ poZ CelHVUx(t 2C[ėvgbX ($`j&+N /\Ojg_9jŠІ\ vW?\#<~)bsMZxP#]Muo^T FQQҫiۡ*0Z4almk_Ƕ; #2')Ow`4PMю iiz1쇱Do60ҍ7n-ڂ@^mؼdYLX"LwUa6#ߙ0FfLQ!ř!a|{Fئ G,z%ymE~s-;ɺw:C!6B_Cڸh(luwiWp߯# P(֓U:yEb1^$0!w02ӊwxlfð"|rk6{YԘ4 3]4k,IO d\#hi\_fȘ8Y9YyǢ%o~#NE,U,8Qmx`4ǖn#ƊGzK[4G7S",[S4񋄰6trPkyES\Rs!7;SVmo6_q@1.dqݥs$ɓ0D%ѐ`%v݀Fr&=Oo+Zz= ֫\/yvJֲzHf6Zn%2m-APmJ;T^WE2kЕP { p@T6*12MTY /8yUTE5кB gՠw9:Cmm#0WBK@S-?6*zr#}X[qN4ͅ*dED0#Dl\Et-diNSC|0R"[Hx qxܺQxgl;psP0A" >vc\srBӄw>#F>G(Ď ,v_xp@&k[:#WBx,;>OlR< (saF |آQi3{˯l9`\`7,H r}ReSISߢHXGK!u@Qey* pg7oq+ļ6>j>NG_-{-2YMlb2VK:~G}BmvOz-28~2s*kiZ7DhG; 绘5ff<7DT2͐O1޽ZB{+~Qef=nl# o;*־,3$ilmDe QT|Ld)&kɫ?f?8n;҃6Fs,_K_̳QN!y!2Z9QG"!Rhf2xM?B3zH@kœ- L(8V?cҫm29*aQ7!O­}dK \ũmW4tx>HΒ ,")4gV\TsQQ97t!{U縭c"hRoGN Sn0 SDvT&Q%f3$mVP>|;;ж8+o@gBXgw{m!q}T5lBaQ!ʚP9bӟDphX횽XՇֻj3r l}eYKvNf gW}+-d؂wp5F=0Ш鉠q,7ДE>Վ w+xOO*#8ThZ%v-99` !$:m<#|B\c6VCdB>`gH8 gr4ݕRk}.3C"M|/\x3.ϔ\Z[w ~C(2rJ,"OۓPf"^$+^7IMNsK`>` PI"΢8trq-ӂ.tcѺݛ؇ x83h8b!x p;.͓ |fC|gQ NOo; Uc[7~dAHA#*pܥ쐳5Wns`:%~c?E;.NxU+E,Xf2-((6Ȋ

y䕢Յt?qYF=fꚁ_uXLzCh5΀mؿu(ͦ 0g2Սh>hhyFt630P@a0 3 cKNg1w4ChZfI͓13#.ꃬcw:%W0mH}u} O Җ;I("BC{>]̸R Kj&<¯;)@/'1ua{^cDU. G b@4/NVsNȝ{\!޽ׯYg 6$s'bqHbq;EX'}#p017ŐGϹT;\4I'+uf{wPgJP{<7eB*QNriWnlu@ttu.Y[m'0oah9'[HB)〕U墂Kw Pdm45^mpQsc{$h{ T0iRD l- pZXX / !6B"0(Rٺ:\@.A_BvY RH޸ $Exy C}q ;c6S/1&!on/>=;KG,wEb=h]gG/,e-O$̗'Gn;htDHrG!7Q{$}{и ~[WCV)^QV9xf{q8MB#;UM|Z讠 K%N ' =<4sma؞Mm2 Q%9>/RiRk$Zh$%%PLK^%,iu6Q''MqJ2V7 j[THTJjk)sm-*oD_[e_v^1}뀋.B?Mv'\fDŽ$7&V' +`)5uBbܐD0ǶppCnDL 'Wb9ѾbGw(P=q<135/mk/T1T\fv_i)bIkxN4n){":kCZ]37 unlq2ԫFYVy.6/wYu$JEC餛ŚډA\B ޒdo+sd.Im/6W\kYlUbJ\zz;R%ѰRp~]S$Z~7h*cBk4 N) ZL?|^K;hIQ5JJ͙1=%+#psqJvA4P T{W$DŠV^Vr*/ܫm8Hml>~i:;QR\/ #෈SaVqPCVֈʍ: sx,'.eؔX!Aֆεl?D :9n0Op'5]cnuMEo켽P67'وjP- "T0DpXo[޹#rb!Tu?NWJߎn;WxoO0lu{ϼf>n=\[+wɑFGPgN /gQAA->"_#Ij.zyJ>g+t/kop'N |)=ƼG {I[lN*Ez焇;hE%>]t=렳OaǩSiҗ|-ccϵtf 0[Kq`>oOԊp=5zE,Bf[} x_׿` kBjm,-# -gWtW-I!=ڑaTj9O\[rjS1 P kXxǮ)pp򵧷>wǯLc- wVTJgha9Ny0ofc-CCxBGYG,NROqͧO&4?Z>OXBCPQYZh@g0-=J`ƒ`?ytxQ;O2,B?"ǩC#icglCX=2H~+%GCsP',H(@_A:gP,=Fؔ$ ؟wc/"a3VQl1&%<`-q<["# a)w(cIg<`?3-qGN3'NK~.x0e85Hѽ #L~fgb!bOX0SvM)%$xc)kg;s]~S2n/O/u3t ꧲]< M_J޺J?7FR!ʞk]arPDYbVe.0U ij¬Vn;t:;:^~_mM!q֥*`_} ?u(^Up)x.&K 4Y˾A݋jNK-Pu)9(l=xCGUZ|jN*6\>:gáYŹ̇ky6s~VSu`*~`u3GCT|6yFhľ Rm.6z(UhSjG2ЧV yVuXsfy%v~}H6$T@d2}N4ly߻{ҁp⾶}۽ݽ=)ۜA^dQP(7O5 .Au߾4] $c9d,g= uT#MͷE&'!~@nyi5xn BYa043`!l> qP0ĉ!JIRN(f9 j9S( 4+JO$iLC(-7 7 b?Z|G*"hgEr. ,4خYRաHq=_,x~`,Qwmڗލᘀc`L# 0&C<s̳~pQGQhЌ-?OuvOGB!cLeb(EOK0,"_ c(V6})ޜ,tp_lɓ,wX"!S0O<|5Q mL]al_2 t `vc _LkOtDK= 顔CEe#.,@6H{Ң Rn!,D\Z5k*GU)HexR,K3  #y) G P%aA.c1H5QpsPTާCn$LT.9+nXi \3*Ϝ-OިqMeB. xXMloBH1%wĭTy4r~ű< .3P?]]àK|?|^m?vr={ßهRpx@-픧Vl 6%y4q?g1M3+OzVIל1lNxjPU/-Bx \3 + {e2Iѕ^MaVc]ğcOPy3Q{ʔkzDZJ=M1§bOP *bid t -R4ZC&};C^G UUf$Vꊐ; qVǦ/t$CKS,klpcl>H'c7XnCFd Qm */N_~,맏z=<"wmCan 4Y>e>ʟz(#VG*D8rMnU {m|['H`HG6#T"!nϑFHZ-i4G+;dr`}QP4/v1ƿ-t(*yaP orl/(Q?6u#0;ub X 2|}16Ie)CrYwDQkɫ:Յ>o;QOҗۊ%TJӜ{g2y:~|X-}wb*K}gC~lm bQ\R++oՁ?[s ĽiVӿz_(T1+< $ qo5ms ~x77/M7.a b?)@6H֚ȇg-7g[*鿥pe"e EFlxpUli3 SL $`bn@1}EoAmv9s(Rx:{h}Uz{*b86@Z@a1jhcT_5$tJO{#~˝ >uv*9vhdJYOqknI6pl_g]b;enGtPC<èS^ &lsUH+6 PWw,3]>$Fsz)xB dّjV<:SQo.mhOo Nclˋ0RhADH(%hВDyf{-Q/YRbJR\`9=HF%|}fG#SgM-AcĚJtC/W|Ro|I]*<e4L&e(i6W+W`uj.iq;LIlV{P.8MD1`W0Pwq >ICq?H"H>ÜQ㑚u!h ?42DkGcE2b12X [nY;(],(jn"ZSz,X{,2\A '.q_-8B w=o)lrvJzf(u|{0I O?Q}_En0۫XCZy)yEi=Iۿ2İi!fޥt{gJdV"F{3T4J2zU« KE KViHEbjY$cup<f΃@Eq"z@=Dt%SpxM)l83ʖ7"2KVXPH9KDg&?һ֛~tgc kOFJi(;@s)u-إQM1C}yͤ=wC#%ٟ{A|t[|znBGb=5u;!Pr\]\5Sr&#ǝ&Gdf9#DB(WX(sJ04tatL0 `ɟÏ?j(4~Bo"XSLM S##5;u@>k~AkW;'KuZP1(D""#ʪ@0PB þ_wH* aE0@b/+:^a$!c / ם(/S!MW^. &^+=HXx;PS\fD1 46-AOq12ֆ`9-U!*cﲻ!WI3 !Ŏ[@ay(A*: 03&h.l >W;͡BC:u:"9-)E)ᑲ(LcToT`A̒X&˔1/'#[*xL=_gEWvgGPkǨzO֐kCם z"HUgy8,O1S)%{b$w!a@>EWo`90PXC [UrIu/ʺ;^}GC\Ú)ٶJ riVzD 뭭{]SU+]хtzìe  ̷_o9![FIj@G(wo)v xca7q*Xi:P7”:(>KTY8, [u޷p{|iu5{be0 iܾoW/k{W$i8,c= ?d"] DKgwK!! n H) ki/34!҂CT7&=p?cV9 jI|q]+x:<"ʯ|a\NV)y[fCu^./Q K^L<˰.5yd4maB 54A"Aj0n)86ÚI<-sQ*0&'g=7Txm#bޱhGe!>Vc/O-IƬT{2T:h(_nVx+/Em3e,6f˾hp›4^5f8s [Svikmdfwx'ǭd% FQv7 ;mvbBBUTPتwHaTRZnEB|hCa (qOpHKDV)1?n??Tuvx ss`x>9} wPHRQgdxKL(kvB/q7ASvB(]p-9VT'|* ~4J,9 a=`cPLJoU/xNuY}aK{rȥ{Jg v=9fCj9K(Nyj3q2II*kaZju!w pY>9{oJv**xRYT^A=~fe\k2׳jgJjٮ[y*޳Rv1Tӛ6L4 s*̓~ o~Xj䡱\#5zfq=6!OYVw]qFIr汁%yc?7[ J 4D8v@&+0vܫilz뭃~@\">+rWU5g >%\ ?X _0 Zn9&u9Ҁ"-_l59|z'|L%|r3rȡR`lRi7ۅR홪zX_|I7H2_CT% hu}>;],x)&Ka}7ug2KFs[n;<]4 =vQ:~^? ͺzQv*ۜf_|qfjRÖ=/;OT&uױI3@Na'ҼMQ[T˥dNo)UnND>;{8 |TsۮLUg[wl!u= HV6Kî}4I[IZu 5ޢJMl7U [G}0491, :󘋭tˊ=q5Tߍ*RX1G&\-fcܥS&GAɞ9q. Ǝ9}r̾C]zߟ͜~XFRG\Sn״"w#NtUi?ҜuWj߁6jlʋle۽t9*Qs5D i,14dlkH흃<̽Mqt\#q$}tEC JR7REV|]n$kTi< VGy)zXDm|v}pnk i KS20kr8cBs$ԥ05LbVff,ײݾe jKEjr,ɭF}ՊQ,𭔭,& [͐[ Vpr+I#g<1 (S^z@$E?sЎ_{<=WA Hi\޿SJ"3X7xFxX?/m[ݴrq ,v$z7 PZz6]):Ư&أE,N7fQ:bۤV`?baGDa#@iSάAӛ]T,(Ym*Re3LZ|1nȉmCDiNFۜq#-]M) XIHa&rX[PbQϕ2,rW dC-UkD~VT-K5$",8p6\W)axfVsDqǰH?pI=gΉ30*j\MRtn*_sheB賺*C =v9y[m1 r3C,]\)EW^gf*w4[Y#6U.rkM)C -3e/Ego2W2Q)0KufqRzgJ"N\xnyj& iJm][tz F *%f & M%Y3(`!!0P""z;<#l?&t|[fK@L|!r|<@3x0y-c2$#{DFD'8.yeS ޔĕbϽ5%K#ܹ̄Q|q[>2IQfO)_[ɣlCj?ī|y@2kP>".'Yoۡ ]iOJv>h::q8e1T$48ЫȰwɞ|\2I٤N!yyD1 ~Mq N̖C$2yюf=:a[H;dI1&28ʁ"!%/<$˞YT71%XMmn|ŒHwB>j#ܕYBJ7*ycfia^ETu~hFI%mw:Eå4y4mq:-G7GA9>6fT bY #?_״_q-;t51P=)_R C"ҭR@GC.'B*)4hU]dX\DP>.C $l'd 3K|)b b;y4ȈHhixKQL1՛^UrFt&+y! 5GnJˡ%G•<1^N40/"ɪOnoK%q$*!Zn%OҊѶ!%_;@qRD5d(d^Ӈ}eyҕ 2!|-*u-4 t?bq(b;HQLmAƅX؆EE L0ɒLf%<A"B|.C<>D|TFyV }cjwڠ:"0zRD7Z0\N LUw0D :)wc>8'-#T)ݍ./h)ZB|,|S?3$[KSxhSfB7 @Z=6̆ĭTHLNo ` YtISR8AuL|K)A.B0iI?LZ)d&@HOl+ h(YZ>as TP"cD](\hBE"QCi RHǫ##N(@L2$H/'yʷb\6̐zZ}:̺kRv{jPsBVR]\rȬ. Y67|^lڑSX(p[ܷrDӕ]#R m[R_?]bYEsH]x 9E)7vi:kO&ZRk~y u t!8QOhDP0@!f-z1I'F'`oENq,jr2,o*2#܁R8#Rϥ:4;PFǟ}Y"d %-0݊N5ӪT"Mp8L$M{H>0*rE.QjLa/r>Ô<ߕI $r;m,VFy+ؠ1\3q ep~ī8U'9˪~>%/}]F8WTShX㈽)ÚLPSI]qSyn% ecw!!A'(ֲ'ʖ?UQ䚸Z|ܽ\{`nKT1ѡszN I(@ -ۀNwDA_RRkIҨRT%W/f$^@tqϠ(rR=0FCjջBܼ<357g"~ ;Wyֺz<ݺd5h5NT+Kǎp,dR}u,g>q4Gfd7ޔ(0'O4(קwX=۫$5Ssn_ |}<І]Gƹ %\3!%x35WX\I !5r.bՠ/4X `Lyȯx eԒpRN< TxQbQN\2n((-MD%#rLQ t"_ͲxrM.|SstYO诟^ﲩWHl(.u+J:)ݫسvgV}Z[w2akƳRs7Н A}JVXh'؄`F\8(:J eGE65>ݮ˲m ,GDX^d^_qBCvUEdzStj;ihIN.=Qgnt\HI +Rl=u~#vg:1C[OLEO}bvZX%gYMH$Ԁ4=4UBOf$eZm)P_ - g˺(f[X^`֛~`Mzmsvg4 `cbf'L"zupT[b(ZQ@_Q9I[#dyWi6 U dڜT:W[;ݹwml-C2Q% z/U8uߒ"^=kZCJ\OksbYxdKKj|t̔}nێzGI)NZ*MתƳ.yDѥޛ &ﻗԇ,!0=Ny%ٗJ6T:Rv:X_/]'1L zujqRY[Yso¦ܬGWzHd@'yG`^AȞp+@GݬzB9[f~ W[!!dƷkgҹ)('ppI26Z eʤ(F p #at)Di [%yUz^Iy{l#T6WIdgSLcv6X?-_~uj^;NrHQŚy,]RJB/׋Ulҧy^kWQU9/TzC~5!W ȼUǥ#@rU0L% Q eУ'ߪE\ 4+x-c  P x 2rYEj9IN6GX`k g^)] 9ApX7=_ar^1|A(7fJ.Oɧﶆ,]iC~P _r#n̛QMJ7*EnѩlNZ7+ gKpݸ0LDˇ"gܛ6n ! f^F0 gP,q9LN1g(KY.ǝ%];ʼBF ˤi:֊ &Xq2C$2< $ $ $ $ $4(;MĚ̍.j*5l[>lqLpEiSt8'Ag5;E{9*Muأ"!⻒mՍ/D}ϒBDsjcUU+* fbCh|Z|j&eIݱ?UskxAuR />zj^Zc~ށto'/.G1uuvNR{ qj#y;ߝ).|D}L99֢G- 5^-HvyuvCb٬F*,-/ՀM˭},O 'ȭ酫5 Эo+%jfK~kޠ) DR,rSB}*>ّunYⒼX@V% BOu;M̦/jS,Z<ۭF֣M 2`э) -+ߴfMioW"0UT{Z8?GD"rP(閧dn=cW AݶU7}Zs%j-~M].=c?[KtX2JRRLSʉ4c:l'GNO_j=!*F|O;i|\ Fߐ$ w.|r-* rB^1{ؔb$]LR@HGItoL7J^G񳬱WW?낂;{Jޣh_32yD/g{Tn17C10,\H`fn\n\>s-nWű%E7JۂW]QM7\Quاa2}^UtaHMLRݡT]=K 5yk)WDyf"nL\&ǝ;EO*`G:f\n8k1&XX8wlBB-0 " kC-hD >b[/0n!"}fAYm 2PQ5BxrLYlC'Q)90S2Ɠ8L<0r%h.? {mC]:ߢow-/MrojrR7E7ȹMz+uRR4LpQ2!r;J<[R\TKuq[+eշ:V?~_\"M^ZZT<$&CؖQ}y/sc#Ն͆4+#ʬ^/:h |+(L XwOic7'> [pQQxňPHD@ V;-p LL_[r h*g,mJn[BAD@ 1ga5}\%]:ߢogr&* %+qN[DH~\U!#)*9[,Ĝ%)×TKuo3b}UXRo'ۤKLTZD{ԵJ_$9h-#OyXl3@)+#ʬޑ!95JKU!TcەiI2߆ uv|Yh"0- (MoD@ V;-p LBHܑ SDQS=cl9 7-f j䘴 *Cؒ\%,pHr0I20Me@Y' #y7$&M_{>UYl@J!K HZ{*gREVuɓWKBl0fIP1P2,bNx&ʒlDչֿL;3=Vi \A XQ\U\ͤE ];ጽ4sʓK?. dG D1ăZRYJuH_M]OJP0"=AtƖ2-XtF=-$7i _ sNrp9OǞԚ"}g7јqg =E̠!$,PhC>]}YG<}eRrvgѓDAۓ/ i[kV,/S렿{kdqBX&ˢ|t"ΉGW7''&&ʞ2B=. &R+BYNzjNGtl,l@1|B$(`pURcy[{do)Ͷ?@V~6 LvsVG裖X_"L0bI ̓/aET9ƛV]>٨_5f)yhre WI4-ޤ6fvvuRQ`4z_Sy`IIKMmw\.p !#ybYsF6G+nG(򴥎w6-'~Hr%ԢZ>)tc-|AMꚱJuS(ݩ{G\>I\ 8s^^߹A|Qnd (D%-+Xn?8 lzIRv/:K]T#!Bl*=/gPQf3 /UhKZ$IPw]݋w2oԇzb:,zdJowX o1jܬ<0)ZAd:9"Nke9Y8i8&)D;u#ޘqJ +UM%!sď5ް4aWVU`@XVG{@L STFe,)5)돯:Ғz {|NU؉-/6 !2*=n<7.6dWR 1dwɼuBTN֍ܓ~ߩ/l O 5 Nv2Y A}y9F+E :ݓw9#l9PZ4LeS;A@I;qd<:5zpàa_ f#B,|˞W 3Ĥ !&-;TVZ2J*2ֵeSkYR:Ŗ2okR>÷nKԳ-^-+J麭jÊmkNıK*ŠǨbUT)RK%~I"k}J5kVql[Ӟ,[]0]}.}J6 :m_lAE] /Ϣ -*q,&u:rQbh᳾"vg[ns< rOh/: vwFOF/^=(1k䐨g0 X'53\2_LI>%%DGFNsU?@:ƕ *̫jyTTep彭K.ϰے,j׹- JҺp ⸭~m;ӱ,zʫpkꞢ*}U#g{z9^.$MrwoPcפ왭+v9s՛v`_oo_R}']X-Vն@9D9)8e :B^;Gcw q'EѼ׽x/slr|c$Nŀ(IE\gF6?/A} }?`A4"|˞W @N' CX`3̢$LyMweH-b6mi,uᓿX6cɐFp%yM ݉-ḸG$0/eNҙU:ْ*BFF<]mQïn0unՕ@7Rs1f.!k Om׈1=1"zDm{J~'Wo+E9?[yn_oO۔ DXޜ( ⛨*:WdxkPZc \*ةXHLpC?f_{eP\`嚐zՏf\ )5ULYHk5M!Јq vְ(r&<,GWL!#g. & &kQ0_B*4ĎW勃2TӬ75hK Kace6EA۴Qv]}FY-4'}f "'8(J0c9p{P"+N}cM¿.o] T(~4Ζь F4dڎs{28[]܈.n34ȱ% ӊ/گ{ɮ\_ n~3켙JP^:IUAl`P92eOC/( XnT+XALe܊[MU2T[ub q9 @艓VzZďmI* 'H~\Hxڌ *ztf/ɫ؆a;dGhʪ@ܢ :h¼Ŵ^iPSE>z;%ޯђQN=M$0(]-1H;,jrAmURRsT ƒDQHJFT Xv+2Vd= S9gLr]JQl+@+%榤Dj fgoR>-mi/ȃ/ʿrM ɗkFt%*5OcQs^ "'=''÷Gwl[\Y3Ȗ߫;~/t":sK6?Ӓ>뜾|\9i:+ {卾!8Z+eLC\n"W6CE\&R2*o1-$Y|_~K6Wk `)$ϝi3Kh#XɆqag{MK2eg! 㜺 yp~$UvC!VҀiX/#)OכEվS{ߒ>}W=k[/(Rjszp2jԍC pl+ܫ,34ᔀ\BF_"+ƒ4&JH0M񳫯ٟ#@~{yRljv_ԛRILE"iӏqU &Kt P` oo|~~Z~?RF1\^UY f@,&RAڹ: 0#d;6cb`%}q7}>X`bʊjSQupL~HF_wd{n༢&K!dLd{f}u#m{2dK/+vx55}MH 5&{LI3 |+JD_: . ^kE&!֭iM^%ԛRIvPT,o 9w h,N,Yӌ$J*(x!E%q}e\tIdI>`hjvjiӷϡ%llG`'k'9E a`iIvo*!Q7ZD2:lh Fa@J~Jf_CC˘(lc@ED,cE,?;OCv6!'m"ב/am oF 5,&۪ye[OmCeO+^RVgAoOagRk)WzQɹȤWTB{PꇹoUJːG˩~*(Qqu>Y*k<ҩuJj>(`P \$֐Y֠i^ +hfqr6 RlψEfr~{B$$sPvo˞h"thd=YQHVv[{€oPWf9R[&1_(>wuS_Fshx&ftIv˺?Bʄ\]+.w+F%ZFxMe+\q[!}c]|k)$$;BS54v~vs~LRud?/oE -$f᫅n髆jfljp>er\g#RkЋ`l+21tKd ;z-H:V mB n/IPn0\β䉀;L[Tnq%"'G (p05扴n$!µ>LYl(eHϭ&eF.釖GvCk*#`iiN-6edavq17Rʍ4]V~^֣ DdA\3?5_Ŷ%L*?f:CYfWPXSI5E" LGG2gL{*,y k*H6ijkoxex~k(Qf~Y߁Dϕ1Bl ֡O0ʬY Wg8yQsm|&;K+zЅ!7ΔV2.](PN$%j[y}/ɬɬO/5397AC]+xU@.z&D6%E io;{!H^s5%r \ KKTS mPMbt8m9TANB_8xryηY6~{ejJeߙr嗰L"{$I몙8 m&&vOoeٓI+\tLòI.Rw)iϸ aݖ"OGDXkjqڛmYx1QDDDEKD Hr"ʗJ 0,K6\ˈ\E|a $>2{̜VbOLY729#V ˆ K9I "e&ٱvlEKkOL{ov $dvm-VYp\Q+ߴ>^V<%k ĺNX%|+b.Ū#:-H'g6)L3x,w5,aGؓ㹟{QcZQc;1mAB2*a[PS(T'DDUk}$VM%'h,o1?Zz%[kW. 㼊*Iv㟢8g IzԞJ9DD$ G>!"E5}8DYDiGE sA$i{O}*V*GJwGinCy~Sl'P]gѬ4GMb"D:(E, E }|e2#β\~RU .R٤G6+IY]Dj#^{wrvĈ}H,?E/*5دr,{8G\}>+n'˅ R~Ш :,UK;3Vie"o}C8DjpQ04-QkxI2bIݪTU[tl99M; c‡JvٳM*_M{AXh(RD9eډluPŁU(J"e)CLGeQ{]d[I]mCW?F5bL;SV$_$rBiKAd[Ƌx|3Џ(Wg:wqwU$!: gՍ\žh 4ۦ̑aئ<2 )ۿ#8D0 oxaԛ/ڋogZ.&|I1NEhڨ;+S3,+*iNJoacmkysȏ ](_WSz׆)e=EP"nq~~ ɲ(P>F*~'.Ok2#^yu.N'Q.J1EPHBq6RkyǾ'R1^8-qhbUM(^kV!/LݠZb qZwd8fL $ND@ "PǻΌK$Jv^˂V1jݶ$hG/Ӓ1ǝM^2@tŮ9UJu NԛZi14'OeJ5V#|B]ĺ-xzBN \ jrZǿ暈UIijXVUsد:ۍrvֶ,c &0tY[WIcn#Ք,bY+n|QIگB?7C0v5B>1PሚE-} WB4ygxMn~V\sp+[^(`o.^(ڨ*<<7hc,(TA"y/" &D{1~: lKBA>}l)'x̚Ϝ~#f4Ѹ:i2_[??Ýs.гLe(d ,KUAiҦϕxsvRp}H̱~ʰs_ZD][ޖe{[Q(6ipHxdu\wUAN+Jk;$@*h3^4#BRJ+( ZP-5qjW} ̫ e_Q.r>Ѩp%62Wj$v]%s/rc9WDłxR -Uu*֬tڥ6s)5x^q/)`gh2`v ѭDG3p&b"g?1EkSt/4`5 ̭DZJ\T9+6*b<;eI0͖yc?f7~ vgK-q-E5 4p,?(J.?_if =;w;`r7G6_߅6EB.@Z8"[$H"Iqo?VϚtdbϻ}b{Rj|t5-GˉI<,;#!I+0ܘv$b4dI@9/1.W%k6%k@qp[y/F jzђNX*tFN8)y_t35>GL4ǯܻI.F}ߺ>륓-hN$%qL* Atoȗ3źd^O+AYi%sVYKYVh*?a_q#y),? oV|ɓ2Wo&0n`,wʝAԹqz?s9 k=RFj~XH~Ks YPh\'ICF+([W9~CUP/X4H ]bՉ_[e  \&'uK'ՖI5%1&@#4M%Se>m,(rI諭hOi门{2}bH&'r˝#,+'{`Rͥzl?J7[Rn* :®*z.,MA׳]Xc(AU( =%BS<27wLTF f,:K2|,F*)Z%ZNJ&e͏LF] ^$F* %d,9doHqqh= $Hfj6>jiU"uG}.Y_2uּ>xM3!rU3:_۝}E'2-amџIoxB~ȼOmJbsDloe.p }e ! WB`Oq+1BAny%ב[ "w7Z[ˍ}Cr7ioN,18\SfL/JF8W;ݫSMTe8S\=4BtV!'6:MFexMdizуc#g\Z&"FQG,`#`8;(  !tpT_7ꢦP?JȎȭHXAA8LFH>^pN@2 Ƥ^=~鎣= D6zZWi_WUSXRrj KdV[ °̰-˦+bQW&AT%Oh e{:^6$Y_dVd e^)`ɷtisDNI(V_a?)j*_m(45$k ިlydf{br3[-v=X$p)]dj #X(VL9WD2p|DE39i@/4̚1I!VmY-Jpe3p'+r~t A*5My,xҥ&Gj"57yS=%bb?!ؿ,z?](f\ )!ӓŏc⇑* mJ;k>~gEXyIMkI+cX{ i^ڐl8Z$pk5hwj5wҕws JQjD'1ZPo?+e me0jcOG~aDR"UU)\ =$'0$2^g Oag^b'73!@ǿ C>9'egO-lOa{&H~S˗5'\YFTUh6Gni2t{9Ev @IRvE#]ͬL\sƧ>pTM+>@_W}K Ҍn\&q.b ]Y__DcwY|mUcU\JN%I;v*Txݩk>ZxY.<[E_)YC%-M.ݤ`XSQ8?|Dm_+4Nw`WjZɋ=$yB]ZgCͅ[^$i2 {hh3kx>Ðy'd[''REo5q6⤝ *U n]Hy"{lg %4Vn2VPKzi%)(uLN.O(QWdTazڋ/9a!= Cmcq \9=aIm]/\mME; gh-QhMҫkpVq&y<1YΔ[WQSͻMɛ̃6x%8zo5!Nd(3o~* Us22s Xo ECd/jYyy]A{ks00h6ySS8r۝1jEyy =U.(Kܱc*&Eb¼ܤۯdmZf=%<>bwbRhNτ˼]\UָWJ uЦV+ cXdkϝA7G[I ƿ%nJސN+}\usi t-D^MO <=/zߟ=AlMܼaQ"nCf B`ِ񘰉֫+: = Ŝ544hQB5gNey (:/ŭM,aT@RXCoPd?? i]"~hc4;|Y"o$wsݎd'&+`^cݖ5*N@YZ:~#82U4([mпĬ^=W]t}A^\;ǝ{.} EH~ Vni:ITz=͊+Gci15_}< bP5C`X!'/Z={.We:RD p:HB#jQ=D;Mχ EB fsU$MT.@yCt))I^[UzYDQ."*%Y Dpn4i2Gh~e͊ʩ߅C!ӕ6~w^+I5!~ *v"FXռm-8R\cf)tk{Onw畕|R!v<ϥ-j**[ v\9>] @dKݪD? ܵWmfVUǴ;",gmK3$$ w^P*fܳ]}}R8mDE{`qTC{bi'j*swCǁL؄aPX4  Ȧv`qQ/j ]EYomF#ݝ%:RGZwI^uڨWLfU7J\f7ۈg\фEfb夠5Fm׷[MUj -= dwy6,䀔T8aP XJrGhw{mKӲ ~zH>UXY UYsUcc]"}\mL/ȗxH;yzzu٘o`} 2l}$ɰC㽑OoͶӝUj-K2ȇq$~rFpFYeYdbA$fS1 I 5̹VCy,b0AAAfh/2Ab1LU+hUd3bE@(5×npB\M^hWoMբ־j[WMAwxIL>h B ,AJkeKIjb 4#+&.cm-hQ|TȤR)ExXX8Hf}Z (0+D 씘Ap8<8ûd1T*ٙ39bm%{+YqFۑ3t0-(Ls8H;Rz(/.7 1=,vES⟱:o}+uʩ$ܦ{d?Jo0FH'dZ"B;ݵ"ޒw,Y:wFE[zqT5V-1}jUKJl{! J8տ F#SuXb7࿛?' ߾ CuH "gbLVOx1?ht(8U-:OXPޝDS0~<iW#]lٝra4*#~xFtBMK Ew n,A(l7AmGrAe\}<<,_GIGkfWr͢Ocvy;{v.^/uK r'eaYb,e}QSD8(6O# ⸮*h{ıd4L,P&_;6WSE5(yX+ UA_XdPh<K,f(>RٱJ 4Sw$3Qфsvt٧;М#U+UW9,>9l(.dTr;2K:Z;h;%!V3$m 6cO"I(t_;@Wq!9 l = 4% pL\c,3r,2F,c&KY%6\V3+(miIVe92VQYpE1`}{׌J>kKt>c]kBaJմUXUX]\e:4Α(4kѠF/^)d!e/,؅piMy#&i2Y 5$)a"/LFNl SR {5Hn>⑽>֜+DڕOy1$_4SGc:2[觐 Kf8i9]Q`GjF[4⇺-'m؍v}lcV)@w9umSe? Fb̹Wbbp>\hmF,. (4ۈ Β"Xoegyʜhu ?XqR78.yRx%2{F]%ҴuQwQ,5MucƗ^3J"j 'NÛ&TC!X N㝯y\!V-g3X'jH6o)6)qE RŢ`gyS 0?AK!Q<Km0y0S*IU(e! 5uy]͘tm" u[Ҩb%2Pw2ˇsJh© HEّ Β"ٲ˟5FR˵% z79WF #%3#%]hb< ak4ٝEusJԬ28_laJ:uI xĎ"wCOZ ,;RA|Nq^\ (jF-_׵s8@<1 ^! 1jXռ;ۆ9PXJ F-1 eh砞`)yy]͘tm" ([Ҩb%2ߑmùX޴ivTUQ\-9+WHE"HR)/{u*zX20`"NLA3s5MATm$SFP\Y @m5i"/D,"rrjO]ή,c2eNj{ZĵU\ٺ+t%cR+tz m1&$\.藴W)䖺olweOPL=υtenFv>@NU &'B;]&j[D(=uCabX%bX%!!!׼"T\܏>!%׮d X 4 r4D"C.R#xgBDwEb䤝^o^DxU,'PّD3IЍEqD%ˬsuwb]TIKvK|{{kwfe:%gEiGQmŒs4՟[R*bWSb9%&vŸ_.`w:TR)Elr-IS3PS3 _dMƏ&,$ +,dm}t~Z"i7HOzS2XRw/&&;eq iZҁ|v&D #wɊC5ԑք0ԇ*xn.H2]Yv-Mf4x1'3XOޑzKZ{엷[ 7OD,Q4Htˎ#i|6f4z0F1>H@ #H4#BYHR)G&|rE_V6LD&d|V b,`TB/*[pa(25v>$Q:Y|ҮoN<woIdMi0-GJ!Рƃ h2id0<_urw U3p;z*p[>EŞCaM$j'sOzl Mڟ}>nw8*2.Q+$& IL(9r2c7Js]7n"idʗm,4qZ فvwiEO晦3KJ"󲖋ǎ4qYtYzKXR!9Urs-J̉Dj54覙`Z$cE&u=Q>¼̕{I#8x!!^ #^J,]T8}Ν0BaAH ~:+;׋DjvG5ŸoĒyE!(9 | 5Ϥ)g]4jԏ:.*o-KVN"yzEϵ^p1mQ4C Q'W47_[fxU0ՎA*~#D|󤾳<ȃѫ J5(֫bEGcќ;]vM(/肨%\/\{S#( m*9N]5~k ezC'2|I:X5^qjRGMmj^?jmCs?I~KFdRjz؆ښI-vll]~/i?@]Aݨ*%5m/֗M_^_+Z=\O/6-rN"2ntLCPYbH矾&jr" 2Fzx\^C:D'u'qgL;m5XK.e#goofy;>V+W*RJhkN3`Q}65}'tS~S mV pUKFV2|Zڮ깛_wE/NٕSz 6{M~ۚ"+[ֳ|{MsEW;v;ե Oceܡ˶Z"f=S]1@KRDnW?oWs_=n˖m:`i3)\B&$DZU5|sꒅ%^AF, rsGf?T-s)W0ʑѺ:G,F|kV:hR{)'ml3}HИ]]eܡ˶Z"vnc0U@KRDn]s%~K_=n˹kvӦ :)\B&$DZcZӰAϪJ{ eFg"!dDi3ǃȌ#1Z Hm7wyԟ\*Q$ ǪZ4r2ΘND-a<2:V1ʎ)ˇJ.u*K+Y ~oWцc1gN!4Ј=d6cv}v扻7 B ;Gkw]ANI1]X~w!b\i]vr?T@g;Jjn{|9<p0ׄh9/@f̌Jזc (u QU@06]Tc]]bɷp̺Kɋ6gjj* *);ζ1^^[C }e&{^26HYnKR.nS+b0Rm ǬU^)6MRAݥ\ӯN]HQL68b;<+pz!' ?ֿ٦ŲvҊN 􂩭)CȘ,d-2@ر鶡2p]H^GmN_7tDe[newMmPC3|o.{?!6 gͻB}/7\$N뷏Z"qT6rULtvS֥yʂ9Z~rnƗƱvAUȫ;.GGBKTF/hq9DF(~+$eu;ەC#ƚҴOrb07$Xɨz$`Õ=g4 MW$GhЫE]P}CO1E]Vk:Unb*]XLLWw_e0'3\ v\V!doR`v5sz KV*R1X6UC n"k3AA" 5xcͼ)7[i'x>rҎ'`6!%x~O+Oxuㄘz! bry^7USpI\ڐN:PܐY"ݠ| ΘrXonnB!beAx~$@A*y6L4n3S].VTngR4b˕Nw)Y#Ԭbf'CAc8 PƄ(!s,83/-xh 4- ,U:fI^O}Uv[;z W7)ޗ֙]$C"ho{+&ϐo (,PLlz]~e1YQe첽d^!(>Ǐ2 ) fnʘ]o[qHw:.ש.,f@TW㋈B-}GW:(D-ܸƤ5Cm $m8z,c3X}N5o)Uq˘]O?xl̡r}{;ZP_L+vˣڻWVuS%{xָ\IeT-$M?瞆ٳ{[z/\<"J# oZU]:B{*/IRw!K".].z\,ۄDEQ}mC/cB#%c3\H2 Vh8\ =ezjZꄏ^FR1H ӳk: L%PQM=:`j!@垿ɈyKIDF *lR&8Pu,p-D8>:V1v5J=d)}Jx>_5tu[v^,ICUd/RmڛqDª+*Τo ^ASuSrQؿ[,Ft5I|~7Wke^KX<_ޤn[yLGi>W#ҏKkY6ic(GW*c_!ib;ud]<]켪8 ;HOR2JL )Ul.~v$o%Q krY5֌BD`xt'^)xCP+f:YpN VbBUvIF2]EO[;)Viv[ RDU#43e` hKRd~ٲeI_6GigTvcbݷ%=rVnv^kv9Y-G[uS-\q7'ʫTڂ䫥!XU߭iX|*g v]O-l&ҨR8f3@quPGO#N7dċ^?&)^i`r˔޽]Ҳ dј:HND0jɗ+#<@+. c4LHAʣ"dR>0HKtce+,췿$ hfCYxS/bflB]2'͐7/,$ NQ?{Hwk=o+0i+6{j[ Vg؛ijkQ>U]ߦK%]/zōgڬ~^GJJǻP8t@g;@`2b~Sh|UKg6t)3z< nYJ!/?ϭܹ";vM HX/t~)E\5xwy P׻%5֌BD`xt'^C!K-YX/GڪTJ%"Uv$c%TѺuL;)Viv[ߒ\y3!epԲgflB]2'͐8q 򤯊 NQ?{Hwk=o0nےi+6{j[ ͏ZVg؛ijkQ5ߦK%]/zōgڱۯQe?w(Ktgwzcɕx~_I#O5ёnKIrZ包yIN:W,4Oɨl<Ǜ`vd\5jeo@-Xz'IDN{!*!vsWʂinVChmt/nv}VƵ}II?eX^]Yly*iYSF՟I=W{Eva # GTus~oyז(#&m͞MZsyIv6DQ0eU#ҿÓcRAۓ,D:/[9z,1#IWh#gIF,%)vO~ R``!^_xQĄ,:ƪb+{CX`)IZ "RI l(BnFPqƨ18M~"tR*Ak_/#ggaIOF[PsfxX?Su_:$ n̖ Slˍ%yI;5K ڑFL9'Zv)r2}:^͙SXՒm|[! *!M0EwΞ -iNc u1Q7Fwb#i\SGyf$'.vvїƹb+ ppJ@ o`*}Rd<=WH~aΔ)O:N~Q d@:9Taǥ!hl.*||t\|\&tAIcx̡}w9K!h!V=į/Zn_V˅b+}Iߔm Zvwɛe+3Q^,߅~KӦNkgNFXm[SvدyԶ35F!Oo̦}"YSڋY⶘y{vU:K r~xT5;^AaqygM9V,]b2vYY[5)*V%4!CXy:٭w=B$S.6s-!U=~NW fO]|NWv 'y]G ɄǞ茮 Mm QL҄83o'w_q~ƶKjg (,źёi1 V.a/vK㶘+NU?LIjpbqNZ9 5ceϔt|4pkj'RtUh``ˮC2* lDzO ș*eñb(kqE;] HaX*Lh3mܩs2?$gW{ S(w?̦fMeKŰ[6}7TlYEJO3 14yUi׿&j0//5 mkb=EQQQ]11Ri'vХxO^]y)[SbJfh2|!܌?ee1:L:y+//7_:uEWputs^tE"fh2dWceäw 'QŒa"ZԜ W'C UuWRZL')xw~K#WjoL k,=Ez M t$Yxio`^\YUK*$ LtLtLQDTEDTEDTEeX]⯨V|7YFmy/r%3o> ÐFu 1W{*s^_"ntkދ\g1yS艘b/Z f0<vYPa&tYegYG@ulkkpzbh3!Uj;3^Ji33[E.h^Z{4XͪquSU'^'^E0[r;UPReD鎘(KR#q Q&)+sȔ;d3C~jz'"5둗D`פpRe1c'7ܔ-"š_dVaM<2a?=|`]x2k6yv A&Yh4l1W"jӟӚ,./tʃAPQ[R}KS4Ci N\b\FdJpr4'QIj$N@v` r==}9'V.YF d@:di5:N*Д=g!c!90D?c4<)v/,;3Ȥa"5#DM E/l•<\E nB' RDy*0.&Oiq{q)yKMCj”:3UĚN])!EJ=1- "ܗ?᫸ 5&7t^4M qB@* b4#Hr,,Xf'fVg3n"KǽW^=bf#@ q®" e'EN бh4,,4#Hx: H M^q?ӄzZ3a|L)` ^B.4a0i7Y˄( RP]|Ikš$Oq ~}9m\UeleeN}a^$03Bo904WgY!0|P~u}Bྴ.jnȧm1UR2M Y1*fd\ X:Ң|nRجnLNCHB!Jx0pP:JT!e62>G< pőjIYoLPNGg?Y˴#)w is1643[s-%#.+(cOuWo? Z/[19iaJv?81zU.ֻWZ-/$UZ=PcX'{vNJY3+cFQj5 \Wq]eؠxQ~υ'q< cHpJ!Ja:ȏ~=,tBi4G[bY8^p%8>T1"|\<9!1,S +[6:F1S\?NkIO,\:0_|>*2d.˄u[~Oy1]\g-1ށZDj%b {YhxK3~&+myfA 0 ˌ` I|4*/~z`ױLP. Eٝ:$#eJoPc.lU,zii'fXӪt̸IAQq G%c&WlɼLcd("#~B郝ni{v4+;[Q<"R>4ywU՘m.r:5̚iheL[VEpog74 B]IoKm˹=V&{F؎EQºfPZX^wkƽrs?HBuY5|Fd~GIuǖydê (pudb#̩Q5 le͙JxS*ҝ43.P{\GL%c&Wlɼf i<>_`fp6<76Qv:DŽ]Gڦ-,@5؍GVPk5-9̩j4݀u~&恁tC\+ڒA~M]Tזw'Oh[(<u11Fl 2i$I$D CkW:"lqxj@C>Ջqg f P"<yV8gRL9C&_,WHZ9E`kN3K`}ƯSނF%4. ~ 3pJCB[zpIBAiO#9֟ҘUrn5jmY*G03Ĺ4̦(68.#.KZ7 rJ윜JE"8ijQR!YT@p I6W^ R/kKUԖ+ke؈vxړ1w@zm_.#5HL,9X.M,9y= 8 PMXލ(FG:_Ew ?RN S~:jWEW],\mhV*c(nB;-҄&F{P[ȧEJZ3곿 m9(  B9,gVWI8H3 l[aY޳>֨iCqT#U]_B@Q%I\HIκYwHhu+l`i\'KٷpX؉|q+1`DVI7 .{6-0i6$&[ЯXIj(֕b I4{ꥺ)M#ޙfӌ,qQ9#@@"SK= POm!#dVLg>wdUaA;^@-a򒵍mW1j7̉NO%zNm&YX~k%:9WzJ%oXTB,]CN{gx}9QJolFnߝJRHެg޻;۟#o/eYykWqݺhɴ1IP^VǛS{jwD[Ho_a !7<QJ"(g \S[HŨPbUp#CXL؆f"' w+0:Dӕ]p׌HMmF$Q[BMOs>;* ligyIZƶ)!>c&fc!8!O|37A,?5k_%ne-Fŀ\6G63`ʨ 7S#7yShwvV_)f$oVNR3{o\Y÷X}zY],֊n-m&9L|Re*tBrձ}R+m9tObFdU҈*"o|m"զ).y1ainwy9!I^ۮ NsW31 GEhM~:" (Fk w$+nWE,'f.-ndLPzrKpByFۈ%[Mp |zJ%oX̢@1ce"XN{gx}ÙU&d`f2ߝJK,܄^Fc޻;۟#vZ[_d*1ۦlINzIPa\ly>*_GjwDjJvF">}R bum'6sqYo;* l␌9hX]Y3H\I {n Vnx5_=(7ic2ō`q,ba9 0AeTRزC;~u+l/r7r߳zn|kc1e^U=o'x&RBrձY(R+m/H.J4.ESMoEmǫLRfE5:,2slC3KJS)ݷMPHAn lv(h_ &M<8ld+' [!%&kÓ=jqPq7$y/>l|k+}%ޯBuT}bO1o[&jӡ^@|Y}-Eҽx-Y[zYY~g*mXadYeCXuWѼJ=r [{}vY>m(:nݧTR:fhϬ)-7\ęPҖTPhL1].c_c+!͙.[tk|x) %BXV*LDPSYq\3V!!&S@ȽQC^s:C~g a!7?S{[<~>)U62I/e׷Uso%é٭n_;p{@l׉HJ>vu$&>Ȏ÷ml]bb|"4Sh @iɮFf^u$> >% U& Ujl$nPjֹb#"GI%uiV$d50_9^ܗOT!R#BfMV*ȟůe4\U:g T]2=ҊZ|O(\Kp6Y/yTs_"\oDRb W q\t_SsЋIqK~ $dg1lɳ|(8'*8#˚d%9,%ZژjRڥnήQtؿ:m2$/ΙYվ{{j7V%5*x]B2|$ E-TN*|ѪO~}GTvǔioC*פWmd(1>wW(:3"Yȳ(.M68+uBIR4lB\uD|@!U)9)Lڅ7śYtxL3y:n;L\[EΔ>89í}z,E.g 9S\ShʴTl5t΢wNدi_bR?֒v|-rI:{}LL(8ti[}0Kpd&Z;;J.ru򂔙 MM}CgxhG4fX9 ""I_o4ƒoy3} lfG >ʲ?Z)jf@Ơͩw) 荻j*dr8l<"Oѱ/Ɗu.KVkz./7UŀnRW1]*, ,XFʄg\%{|ceH)"C"ڳ9e>ߩE$==U %#(ў`:XUzB`?ZJ{R^U.-ٟDɺ zljNqoT\^Z諏c}d;^}?-UzY;ZbFX˳KV+BְǦx,x&\{zo~m ޷|.䧗=9`$8I-d_YTlo}s(NhSO:cH3jGz,"ЂȫUi :'X!q9j:=ononSa A*v'KTM"TA5k]R/ @Rr>e?/h ` Ezqbc&}aٲv9hz~գfx?DU*G\3mPUkJ:ƻ̍(KiBܵ"t]ک|`,=36/{|:N*|JuY7Vzp[Yw 9}0M+Qz.L yUGItIw!]W/ۇ n=uW?$( u^7!2A =3y5KŻ%ZX L9(F֪ RS x=<Ĝld,(,5w|ÍuX>-f"P&p#\`7Q`tYb)E%}&uRθ^?%@EpxH|.ixNctMa*?0C=~_?v?9.huĕAo\P NLrOȏ子ZK[;! kDZDwnēlQ)֚ttRU~j>Ӎ6YxlG$mZ/G Ŵ80O%/BUaƸyGVn d'<BG痬~ {,R#LR-`rTnh} f #PG L)%EǴ9a&P zP8@Ȥ5)6(5lY ]˺vų(▵ B#\+jR*>uGOV5M[Ca^,Mr:z'cTTt" mYyǍ>}!w^԰kwNgH<أ5:ʥ0/"),Ն~GFh+LJUl]CLC;dU[ \~i . /dmtjɼ$~]9}␬.AQ&,Jҿ{aU\طu_7꒨ osֲۗ`%nwsd E#bjBqE7Q=,}SlY lNl5M.#S~'|ڷB,D53y"cG""@y%{GHB (Tm]W}ԓpPEۭo|ޝ*{ }/U$+ޓRgi̮܍h)1bE#a+X\c'ly.V zF WM(U\D55!8J\s)jkjg f0 J F”RBs8n',vZ[؟ʳek@idiHx _6 ̒JHfY/윴z5 \_HL2,ݕrr7=IU9 ^;ˎzPIjgf"8Y^ ΤEJP[kM*B+Ɂs盽ɄyMՌ@(Ӛ8׫orȩ7߼+C0{HIx&_涂F=S\TyN6ʷ2ve]!ҫlg)S"ir*K?'-j=biDhOdW[s>FW ҪsE@Ewm]"Ijgf"8Y^ y&9*ƐKq@n%1JIoF#:#_)q_쯆X\Oc7F!4!N5a)@W o37Leb}HafM]m Uڈ{j猹Ŕ+6jioXe޺! Y]+lg)T4f[RhϘrj=biMF[Vqi |nv1A4NS*,0-EǮ KVk;17rgdjJD"pƺ LdүR[ѥE%\;_)q^MpWЃ uU qW}+2>0{HIx&]kh*mD=S\iG4Gʷ2vebeJt~jT=M1WQtqICrj=bׅcrKbQ%aj6i{`*0TXdEwm]H!Gکv1p'G?x!W(vM&4B-P[kM*hJe%ҧG&Ϡcn1.J&oq 5y}+iDBkv%( jwѕ!BKks[AVSj!2OX̸ _,NٗtBg4Z޺g)ScUРFQj+3@d!<*sSP,Œ"±vu/p}A8UE*Z%i{(.j>HRVs ;ϳOyKvU<,S 41DIYf&be IKȸQr(T Y/"^\SCؤZV0Dſjow=p"zZۑiUdU)?=VTмӚ%/ K [#hAR-Um  7'=FT%sHyky5 2]0/WHu3(D}CMLAY"㢺(f j5p!Z?V eCŒʷ֋v$9' Fֳ J9ְz?9[z;BkZǵ T0 Tas=Y)rKvxS Ж_ Qm+ }03f_+VhHf XPm8Qu]0&An:DYo9.[râ|5[*I0QvDFj9Z1K%/X豮'Bs9,KrVc֏9?}^+!SjhcNʁM -D]˻7Mg~Uݺ]Pbcu3fvjԠJaj^\+,rkYҪ2]X-4Vɩs5 (N*TYSUumlJ6*R;djkDVV?yd[=-aVA5܀ d!&Ud,D; el3S.1JŘoo' j 4TI hKkG4}&*q=}V4Ƶ/P^39Y?DKz7G=PW5.Ի~vohА߯~b~}Ix(dlg\MCH"_5<`LDDDD!B  ~j|-|U$t P|z?=^bqT)-DMn~0נI4AGhN|%jg@@m~TUmOgl1#"X+G@u|o-W؁_8xp8ȆqpQ=!G7 bWMN^_;A?-9}68{T}96QֲZ/xz*5$)##q5[PAȁ3J),!j֗+kR'~ 5[p$ QnLkL%ty2!Y$݁SsrcmoPq.^:}->d~~ 1 <Hsp^r<~D(t#UХTfLjJvh4[whUfBd~lwf:~J ץn;+(Vl)05dEV@5Y5Y5Y5avj4 CυC>QL fi T5@ٵ"^~1w^PH"gv ŠM()7$iz1uR:? M?>:(Kԋ(-l n $tGXOieQm@ޤjq}G.z:(i5:&V~!\.U|!ԧ['Y4ʪ´Qп_#BҀtϦg#09K=ӑi+ڈA\Y aHtQDHmPjbApx ( 0ҒV^tvm0TEUBJ-.cf!2HSFʭSG+Gхr[)ӏU,ζP-m*f\{PkNLWv+R jEm2k6I'ɣuLTMOڳ{S5ޝ-'2r>O;+]!|fE1?q#s9F }9 nZH;sT5$蕳P($6(}_ \R8KU]5$ԁ]yYjD߅AL-}Qfqm*В 0zkx\=#QOThM5MhvidNu_zVDҖ)Tƀ2ڃZpc+#ZukR(n< LjI'ɣuLT57=YmI '2#?xfEQr;- BH'PHԱa%'d3CdtI#n*iƢSV5)B-l3j08->0ū N?0wٍRs7bq"E*CpςDJ럭L2 SȤR)EZTGVIDx4Z'Bg.A~>ƞ0g)q]Mv<"5.^21n5hFY I5pkw#ۛ-N40Ik0IMSdPK):4~=i[2U AAVgoFH ٲ{UU#U3V2VUvzD}/V3d\GwYpH.,ݾ'{r˟G 22JO[LInDt>)àw  y}tߓtIK}(l)ګ-z^m 6e/\~OORv2U72?e\ͪڮØX8Hśy7||]ǡ?rpok ˴{v&ݿ*Z"PnSP.UZ~]j6j2(Ү*hUբKQ}kqu#(Uh+\J9#l%_[ ;uv!sR_Ud" 6d/cS$ևiLБU\Gq.Մو;EV.ˀzSFpYBރ ʣw9E?_{V:~~TGla5]%NjYѶ6 * [-QG:VW:=M|sV+ʚsu9g y{Mw@=]c ,Z"T/[˙2"{utbWw S>瞪DK>9M]kBQsN$%'NŰ'e~;YvI#Kz^w5e d6MSa&mOm{.U[Vj^_;mzݮ:H4r\(Z$UʣW?;N&}9څg:|T(*/G_ jQ^&mO͹o;.U[Vj^_ݮ:H4%2I]ʣW?;Ng9څg7/J$)-E] ԟM赔om*f&b_E" *K%DOYЦ/ߢ'葀wLY%J-;sP `F;nR^5M[.f*h :\us7.ltfwB$gODτ2'wR\v{*= i6Nw*"UҖ2)Jȳ ZQsDjuPH{vށ(#KBv2Or"c}W~(?4}%o6TUn,& Xavܫ8^i8q$[LʷE|5.d@B6"ULgE^ޱ)墠T0|n[բQ^MQ[a(ԇ+r׊TnMENReec"~ Q=9KB.;_#v;9ۘ;9BnpՎXq[:)dWj~žg 3\qo(كVS<7KjE:!ݵu""iԫ_VK>J+Iu;XЗ-Xjh 9%yAb y+*".p{ȟ[2T_," 7FnieDou?G jM!(2c",xs-K #^U*`X)R'?4ߋSYqptZ2 3' ϧQZm~EGhr~']?ˏ5;7N$-#\aPf~y^y̕kBAhw0R&$CU]0μk*3k*nalvTNU+7K1I,G}~Vh{˙e`Nhf8E6Ю%CV=b }U4] q6H5J.\]30 U2h68?(FV&~ `kKG| 볅n(tI4dY[DKN/i]}&-inf1$eŖ5˟:Ê[qHi&4-20o> F= 8Z/%\?m=Xݹߢ/-k,TQGJ/=guPP%iu/W{sx&b Uk^%YNAX4œF1WBQIA FDFU )Ի?o7,iDZ%v2?eb"]]k{n,eћWBա}UbP^J6ն̾ߪ'9Կb$_.)q}K%͖AبRFۢTgh1RiҎSV[]ϕ,#qW%9tEYHMFC;_;)S!PÛɑb٫zA] ;5n 6Xx(4l8e9~ˑguCɼsnĭ6_ 3hP9M3o)4ڔ}1JlG~P# ١/<[clnꐜC{uӭVgzɻV>ά6=LR>-= CPLhb}7t8[|'"^s`kDIjL,~.#yLC+&˾v&ߴ^׹sʽ50`ۺݣ~gM=>AҶvqy+3:Բh\q.~ ^;ݘ+r-hF9S))8 zrU&-=}G`kprG~t|c(qbvR8klVe7TݣĖ'̅"Jޣ xt|mJ{>~|\#b>l I\nbgww$nHNE޽V;m;O; g+Qko)FK,׭hi2mDݎfHM 2w[RoҟА ~gоK wUSww9o2R%=2}<,a:%{ӶA C-Ƒ %Q^"4w7,GRmM=U83CRTIcUPC>1D̷sHp~ⓛE n$f/ v}C-hkCQ_`߄ܩz:}Ymͺ~d;9f1e4y_Y5c5MM{j|{ruF?#P%)$#AJgR[ý5:Lf &@}޶g6%bXz7! #݂b2a̦c_H @3wecj2u@c3C=ŬaԓMZe 6X'drhqgB 5?j>SR(etsThP iUFT٫3(v߿NVu#FjE)4c8Jȅh/}۪;aCu FԬd -hJaj*+)E1D8g(o!2p K@U-78B`IQ#B'`<ı(sᣜ8 vtE:T w1e ¼LZ|(?Mػc07>9ku~a3iʹ4aVjDŠ/%6B?ׁJF 5Аr;T },OnvpB3ե5ܮA-"X^xׂdIh]RuğebJ:ĹƢ<14d<E/%첥ydD_PC1u <Ċ Oa_kN1IJp>v3B3t2-l0E,ŐETR˙{GMuoԶx̲ 4bY qoHQEWYW2W>ngg;3ե5ܮA*ۿ5X^xׂ)(ZTq'u `9TO~n~ABIN7~XE/  'TD4C7"1Υ^y+RRI,=u+iݟ))RΞ|@1= Z&1<>'̴yZ04qAQK.dR)5ս-!2$qCegG gEEuy >%rnvpC9JZSUܮA-#Ux)A\Kd'HjRNO@@d-y^-.A7+&:Pm1([o:SAސ b^yk2W>nvpC9Jե5ܮA-#UxRd'HFRNO@@d*~n~b\4;EzDe\e\e^t pWJBv&;nP2T8I\VZ q,*c2ȡ ;_ɭZ].WբRh[6v$0Y7*8xa n,ofsQGX6n{%kc7 8Y RK1 [ަ1M{%{NIi"ef#D7dX태b;G)" "aL+J7I(u:ug!4"V+hlު=.*ҥsQ(XݤRr-u$bX]E9:Uvv|_E!O؄/E%v)ͥ;5{)a, 6G|I6V ?t+ 57Q*r{1S Ql{)heDR$%$CsIaTH[BjMȗ 4Q9J|bfF2B.ʲ6ԕjʀAUԣ BC8T<[5HGgB LڳF 1SZٌ2I3Y(iFm v:6_2xO4FfoI˔B@cq-tsm>>:J *Z]e~z Dj[p!֌!m>IuEg>YFHP t:BVHh?2ECO b=9>I &\=Կ?7(x~_< \4L0-󻴒[R.?vlF: y_z=BRR+fBF5M`c-faeCUs߁&Vrޗ4K=x/JW >HNP$/Tga^vjjeNYDXߓS&.2o6Au̷AHk֏u"4ck/ _GUxy:f>粸ֽgB!"b )NlXrE%:~r_7Pmhu[y"wcYdYaOҞ'_eA:vVb UF {Y F-椻X. A)__~T 2NҬ))ZbuMK~W~V]Ր; *h( `I>4UR02ië M@ oʵOz40!WL-[T-]5!( N}Ŭe)8~+O]d*6hw!&:0S#IEU!2iëĂNUPO|{SPLjžF%n@'Sgb)kʙ$MU-TڦiMm(kwuA%$]@m(/6Xy(RVm.V3!;kifqS(qWq2dqfK!K-W;d5C Ot0ѹzZf\)8~7SyO)5tB4 ;tbTEa|IhUR02iëĂNUPO|{sP 2@JS-G. EN?s!$*Z'ЫAm"V3K&P䴓\s -^&C. ToTVxշjsɽ%b#EW4Y%Nfzl 㪄1hjɬk۫*YK-5$t/E&kjx~$JhًnpꀗYL7mu[fXX77 썯rє#ؚq|E5Cĝ͚:5/ 9E&£M5epmo kyz"hCX$'z;<O,&@;&Jku}_dޯK-S*Qlp>lݛ;K0pUG&\] zWmi7cЇId.m1C$A HDD*z] Iu bB0 O*t$xƕ ڞ.(e)C*YMr"APXXZ!㍦p4hd jTdjԩ9\Jo eV8OSf`hJvx# JB,gCGY8Do\$a5nuNaNx,&!&oVF{U+Um"Z9]e^2Fc^λ"ԩ'2aҖ&(l/hC,gƗGXWS"j% \"@hk|Ԉ*6n#9mbaBZ $y;Xy*5׫ -Wyy!%Dq7 q&X/Y/6l!/,dTbtK_+%Ȋm *O{qS=; x, EdiLK 7t!1;|vANW2+kfT2Eǡ5^s:>xJY_:oa۱Qio6s)mĺ"l PV^3HO~g^oRؘx$0!TL- w涫<<#,ϒϙ$Ai$[вf2HZ; +=/1)t5JBJ,@tz\_T#s3(qPճo++GV瑩*j|wf )0Yۙ}r_ۛtӳN{Ӛ(P0ex…(Lt5n85IP/9߇*]XDҒU!S_4x%ھ(]l@J%!VS:\f}Tסޠ4ghZkܡyk MZ() +c5b j&2K.w6ߴ$4r&ԪMh@Kh@5Syjn]Ӓ=SM.D'U'};!5Ἐ" !\W[lg;3}*%,,OX~3 7${=h u9pR@ver熹M^HsAЃn=D~)tʸ17hpb-WB\(ΔIN 7^r/Ejmv "}9zɸкդSϙ*UF>` 5~[\6E\b ҵ~k[ sO\JBl$pXU%D y(mP.frMFR.aC.8iR:1@i-5Mq /Wr Gu ĜԘթKV+1/1!6N2|R%惥muM1WUJ!DzpiN"\Z4ijgJ_Q9KRc5ԯMdX//R_7V#OVQCJ}XMkߧi6:th4RنhC:VooK<\-W5344cJR$:*9(&JQ]BL߮IR(dbqhꆂ5VH46pL|M~U*@&srIk.f| ҟҧSs g9KRgεKky2<m0u)Iۉ܋T}<k^ӊy͝cZk2 kp?'V1, sO\JBfLK)H`|䠡Ejt] 3~&)Hs t}ţ|LbKL /WrnD@NĜԘԪ ,cez_$#vz>&m @dR0jD\t ۡ2czܹdJ[rA5SWnPӕ܁pX4@(w/ҀP^6y+:lGT\@CpSHXfr)9*cR$xEgѷ2FT6{v )&i@X9aCRsoZR9EX #RKQ%n T!#o|_Ԋ?PG:[-HxF5ШīPo._l*5 rogd"@ש6pԥh`MMS9Z?#D"R mI5Mi]ٖ;|X 3GFGƥ?.Ոru9%"'& B$M ؒ35n#V/ [BIDu, S$Tr6EҼ'kz;V]SP ]Oȃ lF9%fMw;MRFIgl]nlv%ڱһj&hf7~R(D*;Uvr_]$LbBf`NO~qp[x7JM5IOˤ&qKҰI PzN= 4hxF#T\<;g/@PF>X iQB<[OMn̕KI†Ԑa 'Aw̨Opߦ_|zD|&Dlb0IgBh-6T҃84R [*1|"H-Lb, u^< Ne."Hs.bNˠO m$(-S*@@1 O"i5jK#=T y ,}\2)uSPtS hIc̅Kh+??????????????????????`OOrYklKı,Kĭ=6fAՒtk4Zvh-@>-s$i(&+DI}Bq g7u93>ty<u_۽"\/XfXT6H;ɥV.{hO'B:,޸)Q0 /eltOU:nV5L+9HXCBAdϔ0U^ڈX6e%uVu>jihvU{FR԰_«7LC݈LaNʊHFz D)B%"Iיcw5epE{d<C^ԄTrȴDjo{.Co>t䅏aci6XL۲ҡ &q'u!ꅇRܫijU7Ǖky}L,R:" mY1b{;>>qyaֶc]{UME'eR_w>$vK7?5ԵtuE)xD`E*(T7fI .^ zB{[5ʻ&B dm|7dT:E19loJP3X7C[ɇ܂ |12 %t@5u C!ZX IO &/,`r Xc:I8RdVd[W:=iQN|m+iؠdϛ Ws>*m-1=.Z:\YQ۩.<ߜQ⹋GcVؑPDB.5E*~rp _kS=ߝq&U2S*UI+`7HMO-E \o*r-`hA~PC[|`*UYH <#j w~Q_/U+0(!Z= _;1I8RLoJs)Qtr[-o݋isŭm%eOGʛjLOzغKĖ?jokjnNcmڗo(\#lH\!Pޗm-TҾz,pS=ߝq&U2H2UI+`7HEQiRj1dxh AÙyuXN QN'@f/tb ɺ'j w~Q_/U+0(M)_af<{ŌAopPtp*lK}jt{%6lݺO bZ,) g͍凋Z$wV6iYuTω-.~߬FzVnNcmڗSh'QdBX2b|j"Q9# aMd(Dћc¤an o 'lʹB4Y3t`H(w./-ҀLR 5[Xj'E vXA'؃ݏ9k;wv&Vֲ~[mdćt t̽,ln*-3!m!h=puJܩcl1jXUk9˛`o&vS#&@`4-W//;E$)N[ |hZEŕ~I5M()KEAs=% ;q;/S>|ܰ߼>KWAiȈ|5OD}7CIZn[Unb+(Oy)[Xe3Z/%4Ɯ#M2I om{íFI+%/}=7)}q]Cat+5W^y\fKd$_ Sގd)7 ,I#$ju\鐦J:lnQ(J#ZU4xр\ER9w;Rw%[h'a𴑂aN>#(.RX*|oZl>[#x^OTVԞ/6I̴{)y\ݪ۬y֩Y Nא7>J?fTML_>xND9'$k]tƞtU~)PE;)҄-, =y02rM9+N]f۰I`~?ӺRUO168S!A1HffhDyQI.tQj[- +OJ0j(r 3q&9>mQB kcx:LI)a(UuE5WAP4MccnGɚQAy!eISʻx Od//) sC'3DI~dL;W+P'uT:~;";~˿?Z9 *&y\e_ULI#P@bW3 Hmn~Sq! 8Ձ+S)@jAk;[^k[[4itUVJ꒤~gp,=y+oݿ^r7Xs/Ye(ǧ@kgN'/;HyE{4Pi*Qq.NocվsU~YGS:=$ab5n_SUq6Up%Q[P=Z/zRww1Wy!1Y8J6#u]HZs>i#X2 Oث䮼[I#dYW&1ޢ!w7Yc]o2g-΃]tϮ^=cm mO68z;ڻe]Y[y ?юC#J}Z ~s!H۞/u ,ǖSn+of.:ЕoI0 358pl+(v`Ǣ#}'iB؛eY \s9ub TUI'TRuI'P'rr[=}&Hg8^v=gpcb:deyО888qPbQ|vW.̵p}nMvI#xe0}(A]:KyMlC5QfSJm5$)ZzkUQrM42nWT^8kH ,C=#2yWr ^Z؈_A:|maW pՒXyJn[rB )~)aEF\WIiaw TZcuCL$UuíEevE"G#fJ4=/ h- zhmD}Mf͸T@Sށa?`(i>mT0 t{_ ] !?j _<!] ěÿ̖XYB>2JKIٷ\Dps9+cӝiHLۥn7MQ۽l#~-Qb;]Р/,L|g…ƁfTI (̈/E+⸮Z%!(hXHLwQcE 4 B<"Ood蟢H U'mw ( 4TTS wOo>T::V}Tnjq.^;-FemekDdT=הuT]m~WQV[zKJu5u4N"cu5SzvVQ}Jh=KQOdSu%C1_J0@(IvBFdOg._ 8 BJz$ֳAUP*1Zh%@gkXzEj 1i/K]Z]F]uJзFn-(>{3(|6̏)XͺJT-W` u?eX]aoƾ֫Ewyڏ>6e쇭9<)"8! gߍ}]tS_qi*_}v1)_[r?Tyjĥ1 ưb6WUp !5jjbj!#Z_|޹ ϑ%Tb 1l{@AHIPOX]d:`5Pm5jKu G%h ;_R+Бl0sZ%bbΑ(ݗB!\֔SAOL*{shO2>bnҭ WՂc~7/"YGD5}dl[;Zk-%]^[j60eq Fi):^ RzQ#bO:GׇWS bӼGB;sOW{C ?1E4HoiCøڦ@*VЅn W٩NOy{;X F%>WXi)QwXP"݆(-.Ҭ*.2(N%ytuCWvĭSN@_oA ;EAH"}L[i*$xJS;=A#4zͽ1p KkEQ^UE^KCү![k aYa'Oqb.N,&YbABh.,,XOG}245]*=n;1Vwx٠Fy^IJUٖY4㕽egrҳv6fPT2 ivaVqBh.&A=s\/|;DNU1$ 2rl h7 UqHQ!0FEKA2x}CǗ53 E}C+5ե=uROwO]iq[AgMAw)c-:2o7q^UC㳓Qyi\vmXe"3'FpO ǂQ0X.[%[sHm SM6SabX,d<,<)@XOVƟ㫛ڹ$ڊHwȤ6o,GCg_])1< .~mg_k­z-QH{]C=P(0ii-DmLJų}Ihi#ANBHѥTR)#OF[h0k)@QFfgKTK*ViƓŽzycO1jh{Қ?}1@&Ud,@ߐomϊ~xڨkEӎV= xC4Bh65͢|S'yd]f$ZMAoa*cu-e-,9'{AjVUs#!w³]ϘݹH0* RR'v {zBW)9k*ZkTN%o-7~Оq{dgw&&M*&.oe#VPp*f+o?dA>NWM!ddbO?i?GX{Hi^@4(|qI.s&Z+J^-65xׁ}4,@z$J(x tOX%{;NHiG/z 1*UDUMgMG: I8譗1D6$쭅#lC1@Շ J] a4y5,H oi7Ukz3Zϕ1޿Z$KQj+Gѝs[W3逶L8*EϫapМ\c$1YkIcWM HD,kC݃ nQMİsUll`J#<0E6,EдÐq7v3prN H[ y]!N!%†G"P.cW`R(Dt(M.AƄt[?~IbX:d &LHu??jRaM1B%܊injW,$Bd.ʼnʖ9B7[((j0~쥱y#(&[%ऍXʧ/9T9ogQRDD HڣTO75Sq|'B_6ÁuGZGJFKUA2!sb&Hj<EvzZqX1e"I@TиA/1Q _"@V1[bURaoC;%܊F漟9)/⃳Ի'*Zpj:W3^o)e-4CO7r/$hvsB8yڧyKSYhPlYiL~c⃊0w$"|ͰpQ+f򒑮mxPm"d ͢Hj<EvzZqX1e"ID1p= ^bA:E8?&[Nn~woT_[a#&"Q'| pb4{?Q豸d.Xk.ӏ]ZvNrĵWBFk0~쥱y"XiHy&[%ऍh^/9Ty T5QT6 jD1h ZȩSjqЦ;(jOFM ȒH& H56 nSnw GEҙ/XNK6ApKt\*j[:'n7MJǃx?օ!MIд{\\:]H~'#} 4-lnkhZM>\RՉzR\]cSZ+O!xz( q7<3a-Tpvn߰oq83 Oha1r{Zj^,܌=^5?3$c++5 RuvH@BXJq yǹEq"j㊅RzOpS샤1]C:1H$bxnT@+xjO_W&.Ob^5Ԅah* [izz7N\ůGD)]4B&K>YWni 9e恢lsRSDCJGJIPMPOTQ%(t\^-oC䧓up7/ K̈́' 08YsCyQ3,ؓae㦨I)vxŤ' I6oJ,x16YPm0jKCy/X_+Give o65ɾE o箢WxErIfͶ=˄3GqݧPͣ_c`ۨeS;k) ֪^YE8dQaIt*"fxxmV<mƴ3*jnAY}DKz7*ImAc%ŀNa;_〟?X)YAwV2[ h@xf>[)uE DGQw@c` cl 292Q*rleOȑzpMQ1vKrE[Z{ q`PSmF;3c(C*;)o' ygܳH-{BGcPZlUMatjaO7M@GҤ`{Lp|<6w8Utl#{Eymw2]T 4b+bZcNp*38d3<9bguK-WSt?#Csx*E8P웙$GTѣD֗nRA,yϽxZMk{+|DzHixw Qk_RRVX,QVL;}(ӫ>YSN]kEg5^Á鎗nf)~>]VQH`xD=$:EbwOm#|mD2cХt#\E-H,>X^b[Iغ닎#V5uGO亨6b*;Ҿ7R4+"g'섷^©;1]oT*wMMsIMU4saF]sa~a=&F[U8YYIܢU” |EmLtELtLt p07ڡLj^e.4v M)@f)CM= ܮT"HT\1Rl|f.]U5nY/I#FL~:xYF!Iغ닋m.>5uGO亨6b)|o&iM9-=VD_B[]/aTMVqBŐxؿ7p;& ݎi/𩪦[61U;b|!LkqgN)}VVmRQH)1E:G3xZ)/'Tyhn(AsHh6 xD=$zncx3=rP!RepǡJqWhչf $3܆'&;b.ޫA㴻Xm? XoUyK)M +Kqk* ;ކB{D(cKh*j~ * }pօkqgN)}5ef&Cks.*eG¬.o2/:ID^nWϹ3a@֚mQxl p0Ck-BX,z|8r]k!Z$S 06kjziP?laۯZz䚭hr]Gd\;P~.yejs tMO|nÝ }(bGkS!TerJ'J~;ńlBLnԪ "@^Q蕑1U-#7G,W.#n1o* eCu6$ʋ9y7pQ^d[ib9E;tHBq,.TUQ4Ee F޸9C='tR&l&4#zF < :յ_ $Gֈ}AېZ5LrvGݣt}(w1~T-bMEk?y_>2џE0]Z@glnU~5Fᩡ#ޖzN6@*\+*j4rrrrI<>JOćI \\˦TѼB\KȜ, 8ey-J%>zO䴾a 48XrXQn&5{DKJ8k= x0eAYbW=yYױ0iׇOc'o3g߁B-q 2m.t[D%ҕ+V&b"GghܖeRSG IdO>x^hDɃe$ҙ,Kı,KFD$_J=BOuS]YsS922 ᗙ1,oCG.PvAj QXƼ0:DC}g"ӍAp8":zMZw;ъPy{Xm)o v/MAq@l #JrBmՎ=OЗ2]#R3v@),90BrKkʊYY3U69|͡{.c\P!%Yb!%M+ )D;`g7ۻ&%]s * ;I@$@Hn&f)WkVaT 8(SDŽg=a iMZ$Ս}VN̓Qao  -Ù3UOD8m.ĮCePο^9Qd|:֊[oE8|d'\ОWcJ&AHIcb1׉fW9d}†uz."ثꯕ!s%$پ (.PWnW~˞By0֩zie˖6MLXV:iiLc^MRkOm{SEMQ1,L yd!E-$ B13jr%%-pه[Uxl*Z'g&y>tξ?GQ^%ɿ.S! ٫55 gqc!:+5$;!a9a]Ю[$6~#kĤf@ [#ٜ #DNiԾ[rlϭ ɀMij-s-VMh 0q@% (ƲA4rcnH_n(|#kڜr!Ml,?RԐ:q "oG:q`kîW0t|ʾ͘U$",$q'ʩ)?3/G*{o)KTȤ(kf Mf=Y{4錄 -MIŅ)X594UwB alڴASa-lfp \`'4IREdMl_ËϦr3!KjÝi1ʌUݑOyldD@zjHІ87z8m2K[îW0t|ʾM3 hN+yVORMnREdMkx0ތ!?2*PL4!2bѵaΎi4F*n'f m!i&XC~ t!!B$M^N?b~ۀ%-puyIfUxl*oqiUSޗ*JmOzGQ^,kjL?ɧ&Dm %#S:P VSGٵrZ c @#YS<]VU[_(*mcnޫ<ߔN31MJ!aJ"-V0{~ rDJ],f|_JG-r薛=.z;c(*&*­2o:Iյַott{9[TW fǻݰ~{7LلiEkU! _M*Uuo[ePa_WAB ~7WQ__վ[탓$QҐB[Jg[+ܱ㴊tȳYe[S+q>&"iK ŏ1'ūmj"ƩiB\'(8!@ pކUg}"w.AM#c/@XYaIaH!M-0Ee#J!6gDև.-oQ\2e ~=؞ng6 -TB9JB%%̄^vTG׏.$Z FL!$HINh!Q{NP}{ \ N!W+d7pմ4V}>KqW0߭Fjˢ۬&Bl7s4)CHŖH2I?-r"ŔgHⱦwt$K͔˪o^VںáFs/E{p`+];5źDf I%|Ymj ȿw-j=$)IİY};/d0#xMU|hXTCͧ4T5RE8U_9AK\=deisFv0n/hų7oqkm_MCͺ<x].8n T 84IŦH?K?nU\0kLge#i 3e2(Y{1;նQK^mjH^xvX?JWzlKϗ@(Ai3On-R/"RZxd9zծ{$#p)8 /f_/@tmL*{r&_G= r_(z6k zrpZ 7=sYmaV`ƣ;7}ln=mqO_ܕ|\fn35Fjˢ۬&B tR VTIbEI  f iL:Du3"_tfe7 /pF'z 3icI Ѹ~ݾ ]]bnJ r/n49_Ok2"!R%.NէA9ZIR>=a /gzedFDgvR/#_fP/=T5REU?c3,k v0cQ _c͏6OX;]|\RNϪdH/4# <HȿR"& /Q .%M%5R":svDsE^7|IL=_Ob]Xg6Λ 5]ꗒTDC*:@ ¬%iA LUрUvʅԃd5PR 浳VI{yΕ}ĕ|3'!rDߘ82"0s3h&oZ!Wfp!16ּKp>r{>p1 (D8FZE%AhH8AcDa PD*fH3)fp (TQ@:HT%~)&$iVrBι/QI)vAUC6PQ[Ub*g)(ypFN܅Ջ^ gp!QGN_x)$W*wqNyڬ-]<+˱WgIȝK3Mb2E>-)n˛OϿ^ͫ-޶2/YtGk12MJ}$${miMYBӓ{/Znܝ`\Ob'3#RT[T(Dn`BӸjGwjaqR{!HjO< .Vm8J]BB=*a_X`.fK^0b{>w+}M:2}t!s[-FܻM ѿ yDHfF_:dZ3%+cUWP\U+'6}r{ܣ@˽4]scQnHXoENo^Q51TA<0 '`%C+Qp-WEʔ^. EF iϥ:QAPYwsޕ[ L߅].çƩLI4kBr*ىU#H AJ52z [ŸЮ @w98yZy͚&H8/ZB(RK1-ƹi>8`?FS9^@L@N<~Ɉ4tי:g Ii#6oߢd; pC#L/2Y91mi*f5QlMp%WkkU^tiA \oMizLCz@tĬtJ$rf+G1ظ#CmL ̓ .oJVY'Oȭ<ߊ}|ڈ|d My~uﵵ'ua?$Zw+,͗^[=o_:DpMW,o^ׯ EhԮQM_owA-$E}]eQXz| 1NR!2=Swy5%!ID"U/h×ɉJwS[y{\brt*R`}$&GzʥMMZaE BTJ-.htRA +%mL&B*gy~LJ?3HWS~3Y~-d=J#XT+%5Rd^/KeҕZ݊NȒU'X;5Z(WS[ #_']:Z՗FX55"br6}O57'#-ti-HY1g }S]I:ͫ)Yh->zx!aܺBZkr+r1,R(s߯o7v!#TU&ع }F1T7RLk3Y"-%| thMI/̬)DՆ$ gL-8{/gﯪ.[TF{>F3 TSU _˺RU}$NvkeRT[ B-#G+TKS/̍fW}(}aSjUtx-JUjbS$wcʥj`TVrG̏!~V=tuebx׺ԊG}'nQJٗ=,zV6ѤR%!^@t+bWVC [+F.r.b?N*5W䞈M@33IQHQ**'Wq]'B1}"k~J4hr}KrGg5 HbR!wCo.-?3qoWv필4_yg+ Fw bD ku v@$#Ӯd}%~]ezkY)LЯGO!gW^[ȗF%U1+i0V9QQ_\ͤOjl+4_K3 \pB}h -ijgӡ k;q9ѿZf4`9%hCWtƂ3D|]YM:r">-2:ajo6|O $[H0wI(nUIYc~PѵʹPt#ZSW:֘9b?tckUlwRW\$wj֚jqqEUrIĊC*S@.}y+2d_>eS^.p٩6G%|Af׶:ahD4}Dm&$tF2F\^Oqz pz\:Y2nV ZE" |nDY"[L@s&"ueY Qh=Ziݵ2@H|oܼJU׵nߺ3udnIÉW4"Xn0?Dy*uN%ʵH[Pszt]~Q}KŴ(i9}[ȠY CΩD|}QzlYG41-k֫aeRV5QI3qcYvS,ciBiF("'֢/]?si aj7#AKsl[(Tu~̌ॺV܍.  x9^:1)ˠdzy8FVL62#VkEDmT1^Ԛs֌I\%lKrŷya#Ck$P[T̡EfSH#GfZ/ȤoMe~΄`&Q]T ~RmCGՎ6Ꮢaֹfkȉz+Fs|ș>ɟ1Sk(ؙ(i[e,Qʚ~I&WfXȾL_L Cnb*!f:$eFU<7 2]V^V(pCW(BA]`1[wD?U= sSjh#-Ptg0^jt^B\X̮!.*]r@<)p!!1)ۥt `/Z68BQR8f;bo5kU<ӦHtGΗ Z,6_/ oEJ18!r}.ğ"J׋Q8NTyG t5ӄ:)J)KWrfO-6SPho;ՙ%LMCfBG;Dy=ʄ)IUY THKr2)t#H4$S~fδѶ'G-=^̰A߀V5qLq1yA “n$rd$t J5Jvz'RUmvVΧR#ga})GV߄m0ykn#ѭ z;B+8 圽##[hnƅִeI2,}%+Ęhۼ뒝Y>*Ϊb3KP B!۠NF&cMQi=n7 ^E`N!azG,)uH9MZ ܁OX]b{_0iEU#Fر&(Տ GVt:M H;S Kwgz s9(Oc+y<utuXk'} )i^1m1Φ5a|] NnIրִM05ܑ&ip_: @j):p6*#c Cy-j^*bC+N$'E$څ[QzV}T8䊕dQ+]"(6|Q_`+88V(tR RΦ(DX[H Qr[B6]"֡-AGF|Ŀ`:yߝ&C iπERAéՇHP 9)e`1Vx'? Nh_iְ趘SCt.,t?=$@kZ&HiӍ6Qj7oF*nň-PrZJI8S޶J)X"F6^uT->eU'71 n7ӓ#H4I`6 y_5We,JIFv1OU"KӡL:M"P#`w(߱%Zo8K98fIE]/a 0\Wbmo;0PGfuoJ! +]6}043H6W~\ k WDvLRɍ_VD񪋄n?W&G1۝|MM]UXUZee| 3>'oc$v8p6"EXк'l™-\3簪/V+>8vsw("v6"6:+Z h+ #_ I}>E;!G7tCE@ϛh>O@p/|3h=fj ;AtgaCVT?-dQz/ڤ=\rFtGU"HR)GNgyu Lx}GeԦP2&fq!Z/dT$}-r>*Nb" عas, b(Q!*?M#i*`K{ӥA3IΔȏƴQZLBȤéG*B#+hĺQ텴=e Lj诫C5yw:қ;e_Z"f]x ]Z 'JQ\ CzS;B(>%⸮+⸩Qjıe4mRsxRQ2 <3D HA4'nRޚCp =Ww=zy5}"ACS LF,GbeutWT=G;҂ SF243TG\oEuD44vFg.D}Wc?"Ì;lgqV}mJ%,[7‘ FM6j &Ta&ڑ~Fؖ,IƊk8Er/^DDװ8NiRQvU Gcdo %6ъogbdkWP%|lc/9`B) VVYmItWq/u< xj,S_1hUVN(TrseIKE[b[X-0$ cluLYjK^ U”yp,9ijšWwc04"3EpUmV!s Oi C9v=&-Fؖ,kUgȮ@KȀvd*6{3J}]ʏ+,&d=<1ܲPh@'qR{%[_nVFoٚqI>l,҉<0ܴN1xrH>Z d,|U0Œ#|D ?fJʚ-^8?4nƆcbWt7]=[Fw˄`-WfVҼ[YXX1=ZH+VO]Zlz5bXMF[Vqi _$ *Uv{*<԰>z3trAQiJUvY}Uvfv,M҆++,O# 7-29Gg.IVbhdSk!fQdoagRRpدkmc{58ҀcluLYjĺ{U”yp,[NӚ_jšWwc04#?yiW h®a$K'jbPcrj6REeZd` 9|ˤFJ`|ږQT2gD)>v&FxWWʜ:`B) VVYmiDGN^rk˳n$@bȰȧB.0.-x9x9-^8:ֶCJ1e!ף;Vs Qk~)cY8`iDg-0!EX1=ripd&P @Ahj5R)E#Q 3Q0ShԡSFeA@#A"&f[,gmSC#)0O==n"[w*3Z"a(o)9+O1Jej_9tBއ9Gn cn:*<o CjG6n'8AtsgBJ?)+ G' fsb-dZ'.%ha"AdY: ]MMHNj5RX%!o>H  ˢP鵂(31#BEHD)=2躯%<έvyP.ghmla0r-5InLIg!=g˟{F.ҡR_V$ ͈_oʄ:> }!j~=7ٞ ͇ca67*1HW&'~1Lnf2{+ݗV/'*CW ϖޫ,,ґm]WP"^ fc##o@OW ԄO|}/ ϖ%~Λ+&!S e:ؐOb4!Ud(J؋lat*5% -rx]/Ѿo,&:?Z ١ī?T告1nw;|jy֠G|:@"P|Qvΐ ;b*9;;;# Wvor1!+i"v p |^X7 '%{|/+Ǭ ,9 ;q}iDzBˌjiU/$ny,EY]2W>[DԺ݁? qٝ~}oTUAX6mkR.^WIf#E vX< R{,V_ւ.(\f:Jo9ߤJ31OXʾKSoJ|j쁕`˳\tjQC2Uʜ'8sfm[p9AհB!o$mN=竩QFP*#ŨA4sߵb_(lLceKU]`qH@z(uKCHV{壣R]%)lr3>w,56R^5CKimrFN(u6gmS5^ IJ*Z[*υ=k%5kwd:*sam0PSm\t̍]%:&D_W;&e_$V>n^׺ݛW{"&Qn0UR%/O!>z¾g,fE Hk?w${PM qHSƃZ"6p>DCUZyZ!\*Kn,&^fVETv" ?VBQ8{PvGUG4(X g=Ye dlDyZNOSs纞r%Ovg@1} ZUq$鐘~CE:g;;xѿ'7Ij87'^oKv+ϖ1umJ6Ok ~ܧd+s-k_KNًdVv0GX۱)M"~qwET02BYR}c ;)}%g j7([VP]W#LBuJW'T;8m-ZTo[\\z[maRe+Rj((іN4m=(.[$mOVI ybcK˻u:+zʨ _KVeҘII]vd3sU-z4/GJh"iЭ?ih+R:ϥQ@n^io^lF7X,tc*c9,)h{lom̺Je& iL=KCqYhLlWU]n~r[^HV%PR!`9O9R]DR1lr_@bQ_z^ɺB;>Z!@FBP3eOB -K%K[FuSղC^q-mq5Ί޲*Wյ|tc'5z]1L}e^Dj2{qJ;4zMj]V}Jh"M+ roޓ3>23ϭb~ٗI[> M҂ ǢxbP[\̇XMiMʸֽ@$GRʇ"&=w_N\%ch( :\ a m~[}2Yօ6c_QE%}0_J` ļw_93'[ݕ%I-dԭ-zH,i7~#rIcR&R<8~ű^r4wa8!aݒG{ƹtVΦP[㜴$af9^@0} `״hЮ`̏ q9{|Ҝ3r|2)d^g/kGL>H'qĜg*yJ_Ji8"k 6w#VݶᄀSpH3> 2qУ`1C5,l[yp7WUM'0jڥ6#Kc:A~@۔k6oZj<7a[Z[{9{;֎^)J0Hq<Ԥiɂm_ `inq/?4$J_<ڮdL&eKUǿcr- ^lR %:3T2K\W[9L&Dx`4dGo{Ο#IV+wåvK̡$ m:%H!6iy,OœMobh7Z^Zd3Q`%]qtHo ׂ]-DN-7ş_sfKlЙuǙ.,TەWFsչPEW~*; FZ2F Rݮj.1UVfi|$o[ޑNgr]{oe DV287Ş3mɘkql S# >EY%TϙnpU6dqHWBL҄5dB[dq*;^s`{Jc!X|)LϏf:Z#m;.Y=<| C6!3uuZJkivT1v<~b9\J8GTeMe?iG_Y+#"Ts{l[n]4(@u }e ۟I>SgH||6JC2w=15y9Aup\ x`Dx.s3~qJ ^ݞ(!js(b#Ml,_,Љ% ނ!G p f X}" p3 唙U *b%ZV՚#3zeCaZXZE~ef]-JZ0N0^!?qE5:{&#bP&zL3+akr8+/@9RV)vp{SʮE뭒>""i6\/q 9sc;j[%*Y]~0CpA]"ږi\Ck+{JuUU^7ޭQO:V7S^< ڮdU+Kb\i p5\ꡡx[py #qSS?B}/9|Ѷ5bZ5nOy&}iMKX}[(R P'vibv;N@.T;ƥ\KFOpk!q{eh K 7?2{晴O(d4R|_UT_`J1}z;fzi*o*s$x"gɘTQPop\ +)iN-:gaD%!f?AK>\m9bC%kNAzm:b`p.~#\=/& F#=q10KK'i_Y0noiaO&Ez.lV[< icw.񫹵&rU<~D,g(V_ FջZ,)˲{&=T5 |c"(qTvߨʹ16Ă^Oe5D]KW" Q=V#+NNmL&gs4nu[oXuh< e$->Y>&&d:w>( &<"JZZp`M:*m/܆ ,ql9e땉Z>0lpL02H^É-,Gb%~Z`VqL,UB<OH||޽˛Yl/-ܹƮԗ/dMNvymkkEL]#0!"ʅ>+R/ZҏWOGmʹ16EWUZE_ƯC |!N{0h\6%jqZpsnfq3;!5F~ׯGo$]5^J0sB>&&d:w>( &<"WT8nUK[4хi=4B. )3S.6㥚/} 6 Nŵ:eeh k:q2& F#=zc$~ɋ_Y0V t&Ez.me7rX7q&佑6O:-J|)Vh؆<ʆ\= }V^=*QhbmN(l+٢Ýv3n&K0ݴfgs4n֝Z^%# U(<9@<6~B*2hp7'  ȠrR4ђӳk'KbB\r<&cy%t_El&^mιXu?I6iv0$Y t{t3~ޞ甽xFΐRfASsӬ]>U+UպC7NzP2tIr=JXGh>jiJ{Kskjm'Z.{}bo&4sV >HTQ3!>n{6)AZ b mѴѿnޝvO&QD%9Ʌ(2Q2vk^++7]Ţŧf nT q +3y *qtcZ߰i@HN~j3jVډn# 2w3Ws"㝨ص3Nzܙ;O iv%=3[*=~hq.rtu:/ݥEIr&j+KYMܲk}xjdkW֏hSREY; XS*bf§4ZaIZnq 1Te7[`n4߼O*&P%8d2Vd9p× 3)!h6:TDm=gQrھSdMtϭQP3Kcz=?KK,UEYmY5l>Yv *[Ke:߭:zfR 1EXy.tw݇#V'[uK?1Cn N;GĺĶ1I?$ZփϣJQD/it7Bꆛ;TSS®',?d\d!m""zGO%M*r VmD\ }LxT LaI!@?"l0`|'M1}Bul `3DRdH=xЙц\&jִ&%cO&0Fvi=>R1r1wKntJT9Ȏ&%EgJZ t۰Dyrk ?x0l9WR)E"HYhnN`Kf[LJrߓx 3/ [I C/961\BHԻC] I{HôĬ6tp.:]ưU t]_K L( }f8atDFyfm3(ZdZЧ=U ʇVJWRD( ԵcK(c3QbJ*5*Bb">"\RuʛE@Vy H,ɰKΒ"XTX_l7F'lT$rgXC ı ]8|1*NWvʁ+EV>R6"n*y=ތF g?ui1F>k\(…LXRUԆR5& k;7#Nҋt3=Kfen)t4'ևI-#8B񕈪[ :ܕIփ AEE 6l߭[iŗ|/3iOamrZeI9-^ڊx3i!S^u9)Ũs4S7d`PӏӢ+{Ο)MZ3KŌތF g?ui F>k\(…LXMW걔$tP瞌Whc#Nҋt33԰Qfen)t4'ևI8鴢8B񕈪[bܕIփ AES͝Qi-aWb+2nm 'wID* VRM>7uD25JW1txO4OcI RUcb HpGWwNh|(1j,WvF 8 X:.- \f)xј(r] *68Lw7IZUe3I*ꁧ=`^ ߗ)%vM^-3԰Qfen)t4'h~Ԓ8鴢8B񕘊ŲܕIփ DZdS͝Qi-aWb+2kf'wID* мRY5Y6iwyDKmZuBMp p}fY؉qA@4Gxomr+HY1Rԣtw[ Wطnav~< ;zw-+3 vsȼE@50`oxOc"V5 lsO(r^jL'HZ_yF.%:fvu٬\|[QpPG/쾩mʦh G [\QS!BQiO@m oFucjL*<L_%ހB"ψ6.NO}-)MbBdh}xlK-`Ȇ=f33o ҮF6ͫĎ_`Vk)N`j0NF*0&ѥhT\HEwA e^_<ĴbT!A3C$3O%`g Jx'㘪%}s90n9ޛeu44fqkrMSl[DBk4O$7\xr|K)G+vײ29mkU.huiZ$ NޖڪC =Dށ}4CrB9Iۭ,WRIL;$Z#$~U˂Y!gfȥa -Tݚ հs0]XJ#A@ WH'v[RO-2%|-u/uxQe4<Ҙq-G:ʕ7vy($u|$ C>YY;'-Yd%z=rA)O޲Q zFarB ώMjtG[%B+*!6ZƸ2Mbp1J%C TR^C4e_K}/++m|F`A4tc]u^Բ3 -)t1R/WOu-uI.@8_t|Hظx-dz.yNgrǶj=ԉvOn>qWAMfpW%[=8 ^ l_YVіdĪfu'bBcJT{xiP_MToJS@n`ׅIh7WWv$^5M(&Bi}/%_Q5p Wd,7 M`2#]j"Jd4m"ΔDSձ~Lڝ\#+Q7=Or/bU Y7|ӲYܥ?Y=ԉvOn>tS[8+Ef9* ^ ͅ/_dBhO2bU3Ed嫩;!1_%*=b4/jzgeG)]} 70Uhxn`ȴXśЏ'!史~*ZHW) %_K}DU($3 d[㝀C ̊(52qngJ"IǩjP ؗsTiJzqeE>i,]=ԉvh&L=%ߘ%[Ӂ9_\tHD5aEV@~[;!1_%*=bJjzgeG)]}Ҟshxn`ȴXYg]Ke*h)@93D_K}/)֫sQw11#86W>dKKx 8[H$>Zѽ7NZp6$"dCFƫAo=;_>G?%wG~^w[R%r"ۏD2$٨rU=8善іdJhRv,BcJGFFS)˯= 1υTz>κWvגOTR5YeYeXZ%fD3B{oox fޙ9V JQ'>Y毧g"1:02AnD&cv6iEN"[a-$I[ycG"k(g{#Ճ_JJVMjyt y)O6F (T93z7[eQuK9${OVib?] sQ*.*̰ *?hSBp "aت37>W4mfqU *sjLlZ]LgzPWcm?TpbEhRVT\>X.Td$f&k Xlܾ/(Jki4Ҫhlo]/GmR> c^dKi?E̬,`1#de(=Q&FVT07}? NPHjl7/-ywr*5 U5UN5}ƼY,pɾ+Bkzi q5D- bV$ffbT*jTէ OsNo":Q/zlC%>j LpsqUvd2!{gg&tBt0*63w]weoX$㰻rv5F0Ġhw8Kdc4ceZ՚ooePSD(9t@E2Ƭ\PlZdt /ȹE Kn?5sGkK1K_(Nz#;A_\ÆU]N\$7^Q_UnllYR4Udܷ__tC_]/Β搟Y )+kzkm tV"6=\Rz4Fr ~ho8wnڳCMgbN }uVCMlJeihd6ҫ#4^hλuL3[_m3CQVU@!c (hv)gVibKIQD~ 6Gy;pupʫIzˑTK"Zb*Flk2_%!?ׅ9eoMm1Od鮬]޲ַǡ[JP"dˆaۣE9w-u۩6sؓ$*W]cjg)դ[:ҎmN4VJy]2Z8wfꙟ5f`r>,(pgxU:XBՔt.٘4q `0tpX+ZS^_ʂ}-t]2]2rXՙ`@ص:<"Ha)mj3cgVibKIQD~ 1o4wupʫIzˑT%*Fl ێ2_%!?ׅ9elt3Od鮬]޲ַǡ뛿M"dˆaۣEލǂ-u۩6sj;O$*W]cjg)դ5(mN4VJy]Ѿ-=,ro0Ӫ[ue=zxn$`\0Lܮ9 1BzL`RmTvxd!2Mq 1b`6݈,sI,w.ӊ^p(Y(T N- [wOK_g|rB|띬t9k d+˵hY)QZNTr_(w'I$gZ(gGCFOڐk<5ͼ3FKNx[|/.5,)K蕜'sQџؓh۸E=SFTio$< Va`qEtBXIsv#W]B=rR) 88/]f!Y<㇛\s6i~JQ{k|zH'.DM:rAFZG ^3؝zOwر8 U).ږUIi/XK}7}cբ|tϮXsX.٩6ŎH6oNoa?"'jºi IDE^LR;4#% lFz1$#v]CͦPl&g!Pʅ 5Nw$Y]нP`e:T'sS»S8yk p rd.HqƆҤʇ!4Fd* Q/s%:{EZviT))GAJR$>-x)_yۺuvvmH]Tw5j)O#RRU//nu b)+EnO.,&wSΉkgsd~,[㔬4W .IL膖/ H(U|@y/}E)eQKT _K(2бYh4NnKRo<ͿeGJ bE@u}t M%~IzCas-7A K;,WTL |`&vdR{cS snُB'21bxh'͞P!*!TV쳲[5/HP)(xy8h @n,LmػM14J "Uʖ4: o!`k?c+O)\>Go7$dt$`'ЋF Dy'OMy6>κqu6I'U}ʏگjit]#ggQQT-Ŵ9v6 BVm[Wm_B0ɟ,UZ޺ZjJґmq*e. *JkU2 yJ=I XK; <^p!Ig{JGU2ayL%'5Ջ,JC#(DPJBY(xh! Dp{pY^.SLdI  ^K)GjqSbC(U]̵}w2>-by +#Y8F^5xXZ"wZ?}ZkϹ_uӋ~\r[JI?dJT|f{V3NU &k;:gRo.-CrQ@\jڼo/!tLd 7lʪן{vfZR->5T˄]@|I^jR)G_Aث6޾ gz@NBþ`ӻHJb iKR}M]XĮD? #(D2$MF ̨#!d\8c1X4"B6lfYW*[T>%P7컛kGˆ19ߊ8WHD:21+#T)/e,rׅ$^}ͪn;:tڒQ"tq]테Ӯ軮GT,2UJ*ˋhrmG_pHJںk+zȿą_34ݳ*ֹ:x|9t[p.}"ƿp/ʒL\(ο'փeV:m|x%}Cwb\I1/I7ub+『>2đ6M 2#NiA#dWʹRڦU1 -2XAeܬ] 1ZxdLS#HUhEWZ"wZ?}ZkϹUg]8|tRJ?RcmWc4.U &k;:Vu(CrQ@\j붭޶/!tLd 7qf&k.׀WÙ+WJEp.}-k p/+/LHR|}h6[c}|RXw9wlQE% ~RS|g]x1ߌRJDfTD=HdQV!ځ5@='mumIaCW"H&SY91B[AYzjuKԻbv ΠoԥS~hw5W`r|w6FaҰ镈*EFZJ}Omc[/N\[+]1}m+:ޢ-_eVSX>{nii .x~ӗY]k ᡺  ށ Y.eWl>SXVew ,w=_LcuS/R`T3}8J0yE A;ƒQ+L }&Y ZH1-htP z`n#{\9t!,$ hBh?GEg,hrvm" 3J%GK잎 l.Jg2NPn -iPWH3vq6p1G^ʉ{6G<ɉN'w1?,?z ';31-K΋v5T E? T~=G{;%VMj)mU/!sot*\ov N9ri !qE$ }Y~ZoVI ~GΛ/o[wzD8Ě̯S~8tHw70Sl?]Xq- ȟ0X޷-C^J3Bc*mspD*U?JiX̨=?Kmj=^W,KӦЛJJvdzYaeVi=V63aV`-1UK#LwQΌ^jF >H) z"mƕ5h&J4ʆiGS;먿"RM6,*nQ5/y1@WjcMey^J+r`c౭@CYǍGp,˜忪SȳC> =Q-KzĄ9NҔu:ska$Q&!a @-eU5tO\C/ѶjHY (8 2$!;Ak鸷*-YAR&ȚWŪ&oz 5`&I _,'ו_L-S? -c=YXۍy)5]9!}%c]*ѨSLvE=5T,VPT %_+I cX-ɁH9sDW=`$KTO9/|)u\|OQ`,msI|`c-6 5YWiYU@9J XOdk L:U?>_R7_7U Y&5 nz^Wʏ*<3N$tҴ$ S>eP9@qѼ-b j}hBeW4•^w/úP=T9B#|r,l]~ 3S派^`ҠO+Rzzβo#ifvMl$]%bO }n35YTDY"=1)M,AUKRYOy[7V }w:Aڛt!m6#h]kS;nZC5ma҄F#5~߷߷~C}$@F;3 UopY.}`-@{\@*2ll<=&+e` )vpO>r`++tM6m4]_}Y#v,э$rzr.(e#Kqq@M"7Kv{Ue E/2S)QgWޢf,{km΋4|.[E_Yj%3`qSV7(T/˔s"WW%h@w[m;Oz^bX4d`:Ƃ3@UbRmⵢ^Q ![n53 H *ŢR/sG6aw n+|DWp1]g C{nv5:go6$`O7!N+u'D)ÍESF(P^J-#SE)LH7nG9iՍCa+sEkjUZnȵDæP@(n]?e*q\g}Ʒ-rܷ-!4$.I 5TY ierf0U 'ZE!ʡ$(Bm'@>7+TA ћ1 xl8LC}k,tnr߿R;lB83fY|Y}ACsĻ_VӬ~'< G j:MXwcF8Ɣ|}{ca'X -7ܙ G8s[$ڋb"-18HuԵ+ͪEܨ:ZTa5~F5vAzPl6Ô-hs Mc%i;s(S86VӫVweYf uAݞЋy_Eqef@#z%H.qe~b}рab j+QRJ 9 PZJ_oo]nn%@^r{|lk0ӣɀ/P&!- 0Eʄn\_%~(%Hyyd1 |qJ"^7.^$Ql`$mnD7: m/% Jz˼c(wjoR0E _P֫/l#Lv0wQ=O,zNcS :@[+X P5T^q}P;mrXQPX&gNӴ]v۷"$wҟQ'Ab}@haWb:"}U,+ЊYE&ӎjifڪ4©RA #֐Qԧz=T'Qh :uY摳/|׆1Xb:9r#ZeLtR $Ѹy@mm'xTҚX2Y?9J< yXUp0שJb73U_̓~7OwHrD4J~'iػv۷nݹ" <V=?_dpr>PFj0 5qz#'R¹Q#fiPc43mUfKUT}"0RVQԧz=T']l:uY摳/|}xjv1Xb:9F6eLtu/$Ѹy@ZЏm'xTқ%*Y?9J< j%B!x#%!RjU7~~wM$NqSOpv۷nݻ<4D,d#?p+tlDdD \^xT7Bl"m8fmӊNSHLk:u)ޏU8hE[,25N`VylԽi^݁gE}ʹW&,}V+\.:8\7?Z  o4eR[|'58xpCEA*Jo;Tgrw#G;˒'8H|o=}&NwD߭,2KgK:A} [Tp^W"9Y畹*XHJd1 NJ)^@z(9Sf&%6^nkA.SѻTu)r-( z H$#bt!c*ܻ#л|M=h#$*JR\-jڴ}DW7ueݢ^FSL]we"-X庬y,3wM6uq2j#. vm'˥r7g # wISPgiv'd{F 6AaOĉ7p]wranofk88KG D W<{@`x \0ʝͫqfQcM*F3/>JA %r4yR UU9h@x) ѳ]o?Y#kav6یfZI,vOrZVpBy4ttΥy_7$V\=ovl֋:6PIP4~xEW߉<զ;K-7lt2RUYC[ڽH9dѤ& ,oznWEb,A řlj>Vr?dkQY:$kܝkֺZ\'\"{  ?C&ËMf/-̠"O0I i _:i,L;1+e/N}?PHtc"Mҳac:^Q7n_y;[JOuaPEu-N5Ԝ)A 30,zge_= gRXW[ix ( ||̽|X,EI,X ˮZ˭&q*6*Fk;rm٘Q5ӥ@';$oAuqiX8SVWnv2GRK)%'4椮6~5#'0q>اQ;WOY5Y6S Uɫ)F .Ȃ֒F]q_m nΟ2B2 W4hXՁRKaƾD(̸)I)Br o= $htlRfw RZ76~ú?O~[wg.Q5qг5ws`U7WQ$iJL]VhU|C,h`@IUUynbq5JJ#CG#y4^ +4Báp," "r Dʰg*+{" P$Ψ#!O`1Id+*IH!sN(#3!"TD\U2 0o1w9"K;zX^X+_A)VJ)_ީ^z2CKɝx`7YAԟї7LBop41-agj̜sr}h1n͞^ PnĜ,[ =yF;'21GCdV^{޼CCڝkyP7b)C4w=n>|,caO"LsR8.T@0fmr#މI2xG$Y(@wpaVׁM;ǩ;߂\:x O y ,^ 6W8>3'E"6W )eLnЌdSx,SL O2XC<mkϚAVK!սvj6zm0iSFôlvZ )IoEII侫)n:C[~HkFt͒MLʚԩ6@dIkS KBqaN6Jew^nywko. ol9eLZ״'XulXY !%AgtGa`-6^]\ؔF֊.EnΧN@q|+vog>nFRR9P/] '7hn4(;oFmHm_V$\Pqe/A\C !PZ 憋Szvl/[DM4D+vIU7=**jJJ(hQb_N׭+eg߶%?Trɂ£,-jSr2V. "ɪ0ڨK݁]V}cU*)M9);LR*+zM;X (g:ornT[JF\@0tXatEgqqa`[ڐ s> F:l +/S,` o%,5Cr_(SFZc>Ki*5i'ݙUV(I A[ CB' [\iHm ^бwޒ|UWypEWso'<BdN%91ykĵA8,ssF)Nܴ- SI[2o:lbǺk%TV AU~<cV֞ӱ+~wp֢1yC-Lgپ hkQqo>M%%v^ 1%0͏Cgٯ}{BAJKTa+%& ;/`_Pf/?tl`Rl..2d$D2Jdw[Ҏ~!Q] (VoXE@T'ʩF, V=zkYCHmێocNs[@R1=AӋ{=&%`~^\[{&~MSuM511Ɖ%8gNg63/4_lO-<ٴā"ERN:eTJL`܈t {^l%LT ӳ\ʆⷼi?:~h>~3 DOE;cw)R!^.;߉r:bdCF'4LGrH03(̽pC{43T3br1aN-V.=]y)N2Hr/% P;_(0H!D,dwcNx.2!Z(>&z5Ĥa69ME԰Kr.ބO$`武7"|l,<õ(}gaӱ:IdF.eJR.ⅅ-%I~MZEumU;7vݴV." ~SzĦ(CV|FvbZS丆Xl~$"'= 3$$=%fy%~ &ؒhخp46r,rfg/|,42if m5ZU/Ob IvL= Ps6 y23?L(ګZO\oۗ=UTDX_Åݟ)%Ԕ)yY?,D|m$مaWj~V.rR]R*e 1cn~I6L뒟 H<ԅ'z)Z粼5f1.J_ҿ)K(ʛ%!Q &PMfx&b|M}2߈y ڋؑM &DmE^PiuՀf4[MCS|N"JIL]w71d~h(F`_ l+'Mgp ׌9Kp2LLhBPeML`?5}v0K.Gqs]e+JF-O]H?P6{|d=Gt[7 *Y@*&HV7D7EySRv%$7\\/9h 5$!;Ug.Ȥ}R dJ-.r%uݬk%keCnIn5+b =-|ʤ}QX+? VY(IlrM-&%~aMU H3̪GI\8B@P 3=oC'9YV^@ō;%A@B4Ǜ@> JIYlނ+^3;DS#$U~ 0ΤƄ%T=`?5}vdv?˷=/"-O]H>a a(yki'{|d=G!;߰|M__[7 *Y߾$ dkc|$MEySRv%:BmjO78(4J9n1"%Č$}R YUQ, v+ַvQZs䛵[\Dn4j7U@tJZ@CRwQR\ 2Y OJ.!hT@nݻvC49gS1 m -y3 ,-1Tl\]7,N^GhƣӆRoX-‘Pv䓌z3 &U'C:ER?GZ.35t]XkʝC9k sk:%\qWBq0X__q{!Y:S@dz;8JYqag}Nю9?k{9eSsu eojM]4X+6e+\x[aL+1 nl"lR?!!!!!!E?Nfҙ6"+l /9]}XCpB9LP1[pOʂ9"Cl#-c&MhZXZ &딞fo *GťrCjTe]f޸)m1c3< 9qrt"b۷p8/UYvu9 6jz^clBjr!'ڍz)R?Yg&3o?!Q^QH!eNw&rtV/>! {:?$&cBcDRU9xxȹ *{KH+eh;5mQɉ=he&?Eq0Pr\glVEKj4 A+ GTF29͘(FZ~wSV5^zcotE|:m_Z9"V'M$7(_TD4bOPU8Hcs4p%Gk~FQ..aߜek+=J*?^zʀjvB%'.s7#VTKQ4{{v{g5{mWfcͧx%<ދۼ u%(e) >e`ȳb3PvjB[6$D\*نoK4ivWqN ,zX/]'gҴ<O; hPm~t4RXJس EY#yw_1fK"n̑άJurJ~.ɷdΪl-PsB o=M\~B'SH4a롯^x%yCz/o̦s\J}5w& 1`@Y11CR=aC;c;:vX'*4G]Xݲv5pz\,#?P^+.89!i4gۣPS Ͽxm\}*~EJ*ę;\5PkX*E_UJʷg?ečOLi.Jm32I=۶Ajջf3ـtʕ3-w+ vb*!?I}HINXf}w1+8]=;DBIbыU\pV(0:2uI|l]`;9ْaG,|,|Bޠ$ A T3jC6D"ڨLRh^8,nؕ}6k/R>,9}\.O?Zwh ~TM,6OKg+-[_8p6lւ\sYkyvTvu]&0?mE#{[j]Ǵ*ykgd,;YH(uH 4CN e!ξph,".l&&dW%Ϩ"$A2Nnc@׏l"ARxhTEtg^9Jr?̉`2zA(3e~DxDU,ocXzߟ*Y= 9 ye ?0/ ̳Qew% c=_DacV)wɉK7S_V1H)׸ /r)[(SbI3)] 4;%8b*!2=z__u_ϰa;r#*Z4ӷS޲M-LQV&jrFVFOb?TE]F /F9rKOU>^Fwm<몛 Tzi4:Lz1g$,u.KBuJ;~fNZOB|hǰm8% 8@f&4:8 Bx$}gQ6 Dn㈏]c EGlž5a0R8&iXN( 0$b '~*CP,Bs}̀42G$\k՜tͻ._Wӥ\gT&u8gG}|%dc`yG%f2cCz0\qp;g~/徫OcUzwFD_]C2[0h7ut#ZkkZMGTQ = Є)B<1VRV0v!*U11 [+MzQ4-q}?X*VtB/&+_ ɶ-V9<`9?Ҿm`0`LG@$MfHeL`E&3XT+ Al+.CRS3ʹVOxU+ GoF{i2݂a-k҉8!fFÓt)YW=sf؆LYȅ\_g@} ؎:ݨ2Z–h5 [p3gza UtQYOSSeCNzGnvᵡb G$;?yu݀f4[MS};ZȵM]g" V|\nXuD`) D#Gf@0\JiSYtٷU*k:;MFwr%wDOz%7iYMMJetjo 7d7w4#vg[sgam}HY+7bV*&+Rҟpm?T]U)Z†|ĶƿʼLY'8lFUyeHCq]T$H}9WIFTXXtDvB' v%niBE|b( %BHH{c&h(Fـ A#KUb u9 IIġ+VjLim+q́3(\7S&;uA3j*}vtt0۰>;Ia?lpB@F<5\˕H$YxZEJjY@ 0=TNnBM$yS}, >Eٸ9vOH-rt=+n 7sK|1/'|Eiq 9{L)a՝GdqιCxvW>GVu"v>zARࡿ./:4֧bh,cFA<w$޲N MC$ɶ.,ұU꿺I~UIJMGR& RxnqF,lxcg %vIQk˝BS~B =_:,ؑ_AJ߱)7dQyI5mO))lȑd}E_%Y1T+NӬ}ONWgZ觥)aGM,vݹLw:6D4V%z\l%{WP$+-Y2~')_ +e]"NhA#KVȶr3PFer{wBPݓFAv)YJ9;2_U҃/濨 *x4_4 'l]BБ!8).V #?eU¦ζU,:޿9ٶT;zůy I׭ ~T7I(>kTed]yz\yc”לT ݵ}T-[q`YwˊtK\|gy XES(05rDw%2c܏F,q ;ܹ_rư%ힰD1L#eLoD". }LZ{V~K@?H"~~V΢CAN&7같o0 mұ( ͅ L錚ZlvĻ8k u$Wv7"B-d"[/?P  p13(WTHУ]*oHȡyYS8ٖiQiYV+<.1X3qD'6bo].E\-f[::J&F[5g dϡ|w&.^*}sG?9iú+(w{{F4L3~G2Ehz|6Y zc>HYaZD%Dqi% +`&2!,lkjAX!|uzAزdT/7hI ڕKNxotKR[mEMтF& ?GV:w4!yj nh80ľL9r#ngo \kY%'|,YC`5 \Vڲ&GJnֳ32*,EUȺ*U83\e~6 DK/̪T۲ _'?$R$R~ ȗeOO޼zWWBzI( ͬO#]8e_\6a@MffX|nJYɄA,S.檫ҷo,$IV>  KoNЦdaK#ӃPPOôd{1m֋99,~"մJ:R 0~Jg|pSyG>=J,pwYw9IvXf*U'(/̖h;7Sr: qJ̤$Eܩ虔?'fRv>sM*JBm*eaeٞ+u6z1gXu%ﭻv@dFkkWbHn]yJƻ6bk2W`D}˂2On F"~Jz"dXS|@1rG(L2WiߚҿDjŪ*a|/%Uv[uanۖei6Uq\V][vգkwoYumSSeqPӖ 7T5,tܔO]}!Igj]EZ}4r=Z!Mev)j\˖XuL-LZ=k~B dy):eA8q52A6AѶ϶g[m#F%q \AKs#h@> QsY|n'EckM*\ƾS)hcvy?D8B3d^jkJSY*{CAhXrWn]edWnYbZv}dV]qZvumVye]{`U%MLUCNX4SH詨'rRu=v=%z&m.kFHʈkS~)|=r.Z7b5jF,2j^, A:Ruʂ RGb٫d%&gGj4>bcZRNs?1U ᑴ {qpՅ(t,>{D#aZ%k8ȟ0 )cv˙N.Ȟ2rǣ#>'o5D_5ZWȑUUSصF}C! BÐ䪾r,;"Zݷ,ӳ&ʲ+ӴnF׼ .޲*jb*rnkEMFY>)+ߑy'z6{yV$idʈk7MZ,2wb5֯Ti2i+aDW*/ϲ-+Tc@ᢃI5Q>f` Zu~(9`kpGxe$IՓA&̵ˮZT2.TpkEZI" G;&eV$0d8g>1Tl(mǰh :oN{.IU^~%^Jooan Fo^I2ۥw5LsF0AQbꭵ[іf*pI⧚O&*It~kAq+n.IYZS r^$#ZV]X.IƞfpNZ0V3Eu _HGYѐV.튺LK)(iZZ+F*I HZӱ Y0 5~Bj8ߘGs+{SR"Bi-$`VS % 9Ki΄P&pU~/nNrmmW|GjGn \f`.&&PU;1plFQR2A3A7B I Lth o(Cc(YDFdcnwre~HW@Pfu /=҇'[tJ j]}QᩚjYvkᲖxyxdYR]mXFhrZU`е !Tx+3Ĭhj6q|C{:3 #Z!!77M )Roy %Dz$TleRJ+JvJt'K:Q̦It30d!W$M@Z؞NŠ/`a0MP!6c b,ɲCnL3A68ydxm, V=i+B5[Z^kw\kJf%.~۹ѩ^WK-h'{tnP+ٷ]Y1܎-W.#=9{nR}:e^z SHi]=U%>Y(a1 lQI R-&C RJ/YOUKQGA3- 3u0aJ[ʜdiỊ3 YHpcjwW[<1%o% 7A b_*%7$01&ʪJi 0ph-;Glt' ۿ%Y/@˔{m^%zY(Qq\4QFl֕&:KZw:58CZ>N vܠWv+7;Ū]Gzsn庭OL]RK}=[%/Z[/UjR_$#n1=) ZZL%PbV'TB4-T3L"BZQ| Y)*¦ n?äfQ $8V䱵OHxiH\ @"O!# BlL0*̛*FCnL3 N? Ch+rW^JAj[EI_k΍N^9kD;:B](݊qjtgi!ޜ[mnr-" WMJ.uy DkJJ)uwT]d=1ۥO`2HJi2 (e3VRm 'YI[Іp4!Zu@r%G>߆Ew,xN{,wbƸaB6!0¬dpDrX2D"R$zF;z>C1B1GՅOc^d2vk?l۬w3:|=~/=^\9+unR(ZlH[% Ty::eVȇ2 R-,\p1jiG_V1Ⱦ_pi30;O.<,d\|E]VG c >v2HռM!75J u^5BK-LyF]M>4am]EwmΚeh:4of&L%C Xt~?`TޣF%5] i2g!! -AG}HHc7rIǹpܺmޏAU?==4v~mzDS,U i垑cXTNObɵǹU<)mI`餓ceք %ΣSug?~<|q Őfs0ӰBbWXH{?'^{!Ń ieΚ"c!T̔ W22} uӍ ' V#خ@=Ga:A8hRR`JbMg,ԱEF FnV4+$ݭg܈8ַ-6NK'ҕXXr䝪) L]SMKkKRyI&?o{xYa,ˮtxe_GⳄUS:ӌBz )+1n(fs+Q 3DCEQ_q&X%|Ifa3m7e| 3- ~Ɇ0Q b#%vG*S]$4+u*1@ E* ٬9a:Jrq&fR]l'7Y.DH%MLop]PR$=rKxR&iBNቾ)[-P~ȰnAetUyrsߐm">Jy*}hȉ ڛ˪ [y$I/j@$-=#ޅ雦7E1keT,rzYun~;`ͤZV%a{YV֭sN*TT5.`GezUeڨ:?Rn|oq,+]HckAekjs !r22Y0mجaH3@ ;]|T::?FP'18ln εXNc0ݤ]riLL3u[o{ HapG_ciG<&{FJ±;zTXGZ)6ԈNAx獝e˵:ۜK7 lglNKޯ5fPv?At.B.MJtoBlDPKw +s1P4VL+q ҰX9 7 !=o˸&hg7k)I!Kk"K_A%?3rL^rQvύzQ!PB'B=,Wc~%_QԪj˥=7*(W{{ 31̗8t!sC _HnWEok̅+ c,7'@РREQ#2_â.f㾦*CDaQ(aS2!=›j6Dd蟝m+\Bai9W7O:}w0C*x,;ll=>#6dme0=1sˌ*b졅q.zf% jjʕ%"fGƶNY#3l- ۭi[a}=/*dM\1\lqpp/RAv5gthvh4Y iDȐÅwXۤ->اA 6X0 ƦXfH#w4ң$nVms[9웥Xt2Cu05/vN a1nu]hv50n?&sN8++SZj؞6;*쁍oOV щ6uȇ0BzG[e0n}~Ca[|RUɜ(754+#^5`p2"#=:uzݺ5ߠ\Rʵ"~1775Ucԑwj[vwAHd|4J X[oF~ׯ8M JT܇k (0EvZVR&Rm$̹~:NJ{ _>?7n6RlyY7Bfi HDp0 A$7\"#ϵxDa =0xOާ)0#6a" DY ,S,\dc2Dιbi*v}ǫBT9ƇۛI&Hl,Bunn',T+A l@*x'?Y稀"T)!X "52H b  +mr]16ht6 N8J[weww̠ 642u'ii:H=7#9K) =ډn}ZD|A݆JDK&Ǣ"T<;zcgpb؈uX~\+hR>.5#u\͘w3)2;\O#Ic+L()cFM}kNS+׮͡YϘyWbۃr_6dakHG2)_[|ZQ`#p ֏Gcpbpib]* i+R h\lmv&3)>f N]YƐ7Bp'%F̆<%ڲʊ1nZ@]4M5U,J5݋^q:B|6,[c/ r1h?\Ԡ< MW6:^גŘ!ƴY^b.ҡ7Sl o`7vl:0١,̿`U^a(Ub8+M&pjxT%wM#G"%ÿZxl;pEˊg^4刜~׃KM^||LX,<9iڏȅOd .4ǜ)~툪$Q}<&# KtZ\gT[ZlcvL ;:UF'v"  2MԮ,e·DjYio3[XKs6WGC/rLM[O4SgG@$d"e+{O%{e߾ ],hJwd=BW5kyAheX?0*%㶖 Y+rZv>Yyz 9~\.8k;yq*6 /N''=gK%%kD7@ŌsK& >vY&X!=cu/7##u?r!/YӐB2Pm I4p'M8y( <'¤ՃQ䦭kniTTA{@-)fZnߴ.4SJaG;~1t3pt3rsFv{|,6A# esf=^ԉ&62tB".~r#WʲL&) TDݰ ڀxO+T*o-O@Ǎ@Ss H97cqn"< <{ޤaCKW]bNn//j[4򷅧rVjt ~3c ϡnK=_hkLU-UrL۞xzv.IߪVpXiuB_&ⶖM2Y;]ˎاMV3Av[v֦:ٌ猵8ڟoݢh'߲NoKU,VYDY&K۾yY^*ɎXZɞzᱜ% H$8Ά8# $~_ e޻ TBhE8X5֓E@KIJkhA&EJ^[PET`}k$CUqU↝]0dJv DDWCh)aWbu!_+V6eJf`DܲK4Wp'zzp!ϜtWs2`Cs/0(1"&y5cf`4=S)~ _Q Ft}SY1F{'ِXӛ7`#R!A9{y c4R;1qx͚5#{Z% ϒZ(t8V.(fb-E5q& ,Xzcizv*(3+M7Vp v*j]=f؏YrER C#!AM3*(-|F8b>IN>%H\PN[Xļ$jeXiFh F 0@wGTI-9lpRNU- SAv)G]oC%=EXj3<աRTczF-ly_ ]x*Ң@PX%Tm∰poًt'9O3~6B:o>9.dFu2gLKm٢*Y]nKW=%;hJH>Tϼ=Q}tp?/LZ"}>S9 uS- 3ir< ܉&LцMAF{{#V lA/Ǹ1z _Oop-P?-\_؁m'` tk E>H4^*̈eU,U;K1B01b: U>熱F=(Ε@[͗/stơX.ˋ. ^ D@n P3thճv <)s,mO ތC+2lzc5Ԯ@gt7ЁCc6fERuUVV<:p?>ًmÏDr;R<1R}P%4d(sy Ʋ)}:vzo\%:ou]Ԓد0]5B_}Q>{V%h2Ih9ɍ.__ b#cm>K< ~ n!c7E-̓1[bwhk͞^:U ;ddqM cD~p_g\ 4a`֢jx5!9;J֠>S!]VTyao>"' b8O;AQ掼-)Dl9/RQ(Q #4τ7i^/xQyq',Żփ;( pn ke&(~#nQa}6U_8g㌁ע {-\'}OW1{C6qР148 OKi$]f5O+}UJ.ƘL`m }{J AuAk-kH^aC۬+'NpSyZ]+,g ^, R^{x dmE@PHdtaj='Fi=,`ʤ/U6 |/0W9i 7m4!+v.NjY<.<oA>˥Jtqʦv oqZfI/qy×Nw,k}^Bm2];(I tf.ݽK>YX{%Ỳ N˨iy̺0.9.KS-Ho Q`{R |:v+Ow)3`B$| T2Í~I$mz%nO%!"_(Lgcb )+ڇŏlGBƀj!C{|Ʉ|Ң06`C ppg䏴Fxy|C_'duz|?ݍ[0yX#ŖFoPBI Ě a.Mm@y]އ'p>phȟ[nrڅmp\:|gS(cCvڪ 5uIR8Z-k{&8/ϾxX>^)r~Ywp ҪdC$K֫O"Q╻P Vӄ@ k*4b2A $zk{O CX"M\~Nv/xE_a[{É1J<ͯǏ&M趎*ͼ.d?z%N.lb\2Xi  \Guާvs+5"'DW8Oz] s "hi%e%sIU'.{ow,ot4۝IrjD>Si[ٿi.LTcfT6$a|qőũuwI:irM"^Qn*7rY@'\A^R)|7O\ZQRw|e/Fz3lQ[vzot viqMԿOJ; u>DTxv3QաJd&edd?/=(2[ms6_L;LzqӜ\28mӉ)PSJu@P}WX,g_W_ͤؑYŗd\JYq\Z)i A.rNkZJB$-sA!S^ YSɫDnWtDXP"ޏk`"Gk!BN%a#$PЪ&k#]ڏvFTby5ǮF ΩQJL=hJ%heY]NQ].DVH3!247f؝H2c@/^j"0MеNʜtf5TqTA! LLKYXq,B%'78kQIZL S= 7Ys~`RXl*eYGH/ 9n 9E8-9ws)z}Dº;?j?C.!м18o-!^3FL >͊lIw_}ݰO!Snڸ-vr0f#(E ,"b0ejK# j0(pH;3\f'aϮ}3<-Pζe(jw2Y7g*ߨj5Rנ'Uf#DnH;7 {kՂhpRMq)-ޔlО ܵIT8I T;FKa/*fDQ6c:\$r:DN],\FyW;B#V6 w6YU&Եbku=uS'hxAOl,R7mmz r /Y[; @czigISF/Ռ $\[C+*%"N ~&wEuꤎW6uBt02cK Ñ㿭+_3dDCHvS5[=v^cYi]&4 Af ;&u<3gI߷[-7sf+5  ^n3ӽ |!ݜpMiOfhBbZ݈ ;9^eS05=Uղ[A:^Œ- ђ?$[|Xbk:J.VAzr.=wB|%n-R \+Ҏ헁'|pmJr|/0Y"2jMVAߘ͌{; m0gy{~酒㛵3lk0G/.U& ^RrAGK}64.^F "s+\1^t>[opİ?^tW'??Yȕ).O"'B ?:2YYo8~ϯv8quEl4 Y#neIiCRw 49gs|鮮 ]'BH-N7f&'V%9_HNmx#`t%< ڈ˪`<t-|BDUafn/*X&9oN].ԗ=޲w m`}Ed lj7&XU `n\WO0fT2H=BFu("$4I>b"KT") M2K= W$FEuR44*3 rPߗinS/!jSxvW%,URR󪖑\`=TlyDBp5_e mxC$l)\j4TGs8ԽqW%Sܫ2d v+R¤dE e"1_U ^8S%`P},emuSNI^g<\*E+^*F8eu2_Rm /~]RTzoi1T9Dl C<x'=%lwfHIl6Üģ\G38xuȼx)mn<Ѳuc`3$n+; mGуbuhۃf 9mȚáTS-LԲb0bqŠlT 0 YFA74[{(F(MA:Ts:Z$qt{0> ~dIT0ըQ`w̺8N7<]&]_܃&Z9^a qs KeShSWG u\HPypCE^e*Wϔf!:pYx:x m p1yYQ>eGVBJh O[-|am@tR.Xly[C%&)iEg%m;T7 yȅ1Hc&iwIhڭ<-p8M~.%)\)?BA=ҍzTz,!J@nk{Î( @oWU s3@5!`ׄt8(P4BP=ɏ@=x8<, AP :~19.Y]݀(CN@7L&OW;֭ԏn;Ugj}L̙* FF'M٫臲rJ(ɓ{JA *=$$O#Pײ[urMot q6 mTB@9Iye{GC CF}< N76ZgNhCv{p[Fm|\m|+ߛWP)y. a.-q / ; LҢeZU2kgrZMAz>,?G1<_؎}~>T͚_]3*V{}~BE$ia UA }4V#3 ]c(%j6Uk0!Oh$2d׽*4jQH3AӦuM,a:N|+[i8u*75Nx|skP4,K̶i vW-6ZwX.DyЯw'꾎_?"%pTk0~_q{(UiA>*,9IWO%Erc/&9}w?X]tjQ|lE ٜ[lQ^9{m@%S)]8^aScF˕h]d`&U1Z1Fm AIzj90$[xjqϬ^0Wٖ.`>_ɰɳA\m澢 Ҵv-ߘ5\D5:{r}dB2D3g[l à$pu%pL%k;\rƔ3jpE=qH|jtPOe(4B'bڥ!,]GR5H =Czv ڞ2Ѫkk"Ubqz\L~/N8PUW UF:=MA}lGmCY"XGlN+ Mo6%yV]0\S@ ޢlx@~?Xc֑|~e]F(˖ 06 8}!VYEKY gSFY~)`iBO-w˯8g-~^gy$8B34'BkPF:\= W eb$p{>Ζr2y[H`=%/";muٲm!P91[HV9#Zz㍧#v_bi(+N:S^CK !8#]ʸjnqřmISIxfoQӈN(cWjוNhsvq@$L R~7]Ў\ie<(9<Gq<Yz8*>Q^=FeFUkCR9xN!2H/ZD+ӵ) z]5wWQ* XH^B=II{™*(qUMHv ekUj\.6EЉT\398"!`XiD2t 12xKϼK LrZU*t@nCJ`*k#qM2Bb`%_!1!TEr%!U@ϙ3uaB;>z;*4&?eǦX-T/yf[jf΋&/~_=DrbWGUKڞQR`RdC[>+YAۮAAߢ^ceƬեE_w3 Uǥ8vya*q7>Fb RK9Z]֧ ^ۙWdGQ_ =P= B=Bqm"<đΟОx1=nͱb{O16׵܀-o\~ܼ |r:u{6wpJ3>՛ޥԎ"e߈@TM6=TTλBlf,{e۰;Q%Jk6T`P E9}7r{8|앦SĀ2/<3 %yvx/TT5⑑ɰ4"%N4a8 <~( PZ~#3;u eI %=gTWptlq`뮆CM>-$_22-)ZSmxxj@ "\@"ȸ{~<\:=yy8(ot!ϗ;+Yvz!$6H#lx ;}p$,#tIEΠZ4'\@|͂b"[MǟA7.N=yMݣjL)jw gC9\b -„H oU: e r5kAޗ!Cr n =5vhBAFlO ,=ϡ)tatW/c{R0C8=`{ITC @n$=$b Sd{|83OO5(uE;+*5v{yΧl= m|)^"v 4-BY:>}Ʒlx4' ~Fmo& $i18n{pageTitle}

$i18n{pageHeading}

{ // chrome-extension://ahjaciijnoiaklcomgnblndopackapon "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDNyyvaNmqNZsjBwes4YNlrsy64asdP710pdMUM27jtvOe2YkXUdvglcC6r2ihlvPg16mjYK+ZmvxchcEu497KUPqBq34jXILabiUuXLrQJlvl3A7QMLatuZlijSx1qXL/5w5/ggF2Tblo9SHSVtlVyhwyyGkT9ckga5erBUbbwkQIDAQAB", "name": "Identity API Scope Approval UI", "version": "1.1", "manifest_version": 2, "description": "Displays scope approval dialog boxes for the Identity API", "permissions": [ "chrome://theme/", "identityPrivate", "resourcesPrivate", "webview" ], "app": { "background": { "scripts": [ "background.js" ] }, "content_security_policy": "default-src 'none'; script-src 'self' blob: filesystem:; style-src 'self' blob: filesystem:; img-src chrome://theme; object-src 'self' blob: filesystem:" }, "display_in_launcher": false, "display_in_new_tab_page": false } $i18n{title}
/* Copyright 2013 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ html, body, #contents, #signin-frame { height: 100%; margin: 0; overflow: hidden; padding: 0; width: 100%; } #signin-frame, #spinner-container { background-color: #f5f5f5; bottom: 0; left: 0; position: absolute; right: 0; top: 0; } #spinner-container { -webkit-box-align: center; -webkit-box-pack: center; display: -webkit-box; } #contents:not(.loading) #spinner-container { display: none; } #navigation-button { color: white; position: absolute; top: 0; visibility: hidden; } #navigation-button.enabled { visibility: visible; } // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview Inline login UI. */ cr.define('inline.login', function() { 'use strict'; /** * The auth extension host instance. * @type {cr.login.GaiaAuthHost} */ let authExtHost; /** * Whether the auth ready event has been fired, for testing purpose. */ let authReadyFired; /** * Whether the login UI is loaded for signing in primary account. */ let isLoginPrimaryAccount; function onResize(e) { chrome.send('switchToFullTab', [e.detail]); } function onAuthReady(e) { $('contents').classList.toggle('loading', false); authReadyFired = true; if (isLoginPrimaryAccount) { chrome.send('metricsHandler:recordAction', ['Signin_SigninPage_Shown']); } } function onDropLink(e) { // Navigate to the dropped link. window.location.href = e.detail; } function onNewWindow(e) { window.open(e.detail.targetUrl, '_blank'); e.detail.window.discard(); } function onAuthCompleted(e) { completeLogin(e.detail); } function completeLogin(credentials) { chrome.send('completeLogin', [credentials]); $('contents').classList.toggle('loading', true); } /** * Initialize the UI. */ function initialize() { $('navigation-button').addEventListener('click', navigationButtonClicked); authExtHost = new cr.login.GaiaAuthHost('signin-frame'); authExtHost.addEventListener('dropLink', onDropLink); authExtHost.addEventListener('ready', onAuthReady); authExtHost.addEventListener('newWindow', onNewWindow); authExtHost.addEventListener('resize', onResize); authExtHost.addEventListener('authCompleted', onAuthCompleted); chrome.send('initialize'); } /** * Loads auth extension. * @param {Object} data Parameters for auth extension. */ function loadAuthExtension(data) { // TODO(rogerta): in when using webview, the |completeLogin| argument // is ignored. See addEventListener() call above. authExtHost.load(data.authMode, data, completeLogin); $('contents') .classList.toggle( 'loading', data.authMode != cr.login.GaiaAuthHost.AuthMode.DESKTOP || data.constrained == '1'); isLoginPrimaryAccount = data.isLoginPrimaryAccount; } /** * Closes the inline login dialog. */ function closeDialog() { chrome.send('dialogClose', ['']); } /** * Sends a message 'lstFetchResults'. This is a specific message sent when * the inline signin is loaded with reason REASON_FETCH_LST_ONLY. Handlers of * this message would expect a single argument a base::Dictionary value that * contains the values fetched from the gaia sign in endpoint. * @param {string} arg The string representation of the json data returned by * the sign in dialog after it has finished the sign in process. */ function sendLSTFetchResults(arg) { chrome.send('lstFetchResults', [arg]); } /** * Invoked when failed to get oauth2 refresh token. */ function handleOAuth2TokenFailure() { // TODO(xiyuan): Show an error UI. authExtHost.reload(); $('contents').classList.toggle('loading', true); } /** * Returns the auth host instance, for testing purpose. */ function getAuthExtHost() { return authExtHost; } /** * Returns whether the auth UI is ready, for testing purpose. */ function isAuthReady() { return authReadyFired; } function showBackButton() { $('navigation-button').icon = isRTL() ? 'cr:arrow-forward' : 'cr:arrow-back'; $('navigation-button') .setAttribute( 'aria-label', loadTimeData.getString('accessibleBackButtonLabel')); } function showCloseButton() { $('navigation-button').icon = 'cr:close'; $('navigation-button').classList.add('enabled'); $('navigation-button') .setAttribute( 'aria-label', loadTimeData.getString('accessibleCloseButtonLabel')); } function navigationButtonClicked() { chrome.send('navigationButtonClicked'); } return { closeDialog: closeDialog, sendLSTFetchResults: sendLSTFetchResults, getAuthExtHost: getAuthExtHost, handleOAuth2TokenFailure: handleOAuth2TokenFailure, initialize: initialize, isAuthReady: isAuthReady, loadAuthExtension: loadAuthExtension, navigationButtonClicked: navigationButtonClicked, showBackButton: showBackButton, showCloseButton: showCloseButton }; }); document.addEventListener('DOMContentLoaded', inline.login.initialize); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview * Provides a HTML5 postMessage channel to the injected JS to talk back * to Authenticator. */ 'use strict'; // // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * Channel to the background script. */ function Channel() { this.messageCallbacks_ = {}; this.internalRequestCallbacks_ = {}; } /** @const */ Channel.INTERNAL_REQUEST_MESSAGE = 'internal-request-message'; /** @const */ Channel.INTERNAL_REPLY_MESSAGE = 'internal-reply-message'; Channel.prototype = { // Message port to use to communicate with background script. port_: null, // Registered message callbacks. messageCallbacks_: null, // Internal request id to track pending requests. nextInternalRequestId_: 0, // Pending internal request callbacks. internalRequestCallbacks_: null, /** * Initialize the channel with given port for the background script. */ init: function(port) { this.port_ = port; this.port_.onMessage.addListener(this.onMessage_.bind(this)); }, /** * Connects to the background script with the given name. */ connect: function(name) { this.port_ = chrome.runtime.connect({name: name}); this.port_.onMessage.addListener(this.onMessage_.bind(this)); }, /** * Associates a message name with a callback. When a message with the name * is received, the callback will be invoked with the message as its arg. * Note only the last registered callback will be invoked. */ registerMessage: function(name, callback) { this.messageCallbacks_[name] = callback; }, /** * Sends a message to the other side of the channel. */ send: function(msg) { this.port_.postMessage(msg); }, /** * Sends a message to the other side and invokes the callback with * the replied object. Useful for message that expects a returned result. */ sendWithCallback: function(msg, callback) { const requestId = this.nextInternalRequestId_++; this.internalRequestCallbacks_[requestId] = callback; this.send({ name: Channel.INTERNAL_REQUEST_MESSAGE, requestId: requestId, payload: msg }); }, /** * Invokes message callback using given message. * @return {*} The return value of the message callback or null. */ invokeMessageCallbacks_: function(msg) { const name = msg.name; if (this.messageCallbacks_[name]) { return this.messageCallbacks_[name](msg); } console.error('Error: Unexpected message, name=' + name); return null; }, /** * Invoked when a message is received. */ onMessage_: function(msg) { const name = msg.name; if (name == Channel.INTERNAL_REQUEST_MESSAGE) { const payload = msg.payload; const result = this.invokeMessageCallbacks_(payload); this.send({ name: Channel.INTERNAL_REPLY_MESSAGE, requestId: msg.requestId, result: result }); } else if (name == Channel.INTERNAL_REPLY_MESSAGE) { const callback = this.internalRequestCallbacks_[msg.requestId]; delete this.internalRequestCallbacks_[msg.requestId]; if (callback) { callback(msg.result); } } else { this.invokeMessageCallbacks_(msg); } } }; /** * Class factory. * @return {Channel} */ Channel.create = function() { return new Channel(); }; const PostMessageChannel = (function() { /** * Allowed origins of the hosting page. * @type {Array} */ const ALLOWED_ORIGINS = ['chrome://oobe', 'chrome://chrome-signin']; /** @const */ const PORT_MESSAGE = 'post-message-port-message'; /** @const */ const CHANNEL_INIT_MESSAGE = 'post-message-channel-init'; /** @const */ const CHANNEL_CONNECT_MESSAGE = 'post-message-channel-connect'; /** * Whether the script runs in a top level window. */ function isTopLevel() { return window === window.top; } /** * A simple event target. */ function EventTarget() { this.listeners_ = []; } EventTarget.prototype = { /** * Add an event listener. */ addListener: function(listener) { this.listeners_.push(listener); }, /** * Dispatches a given event to all listeners. */ dispatch: function(e) { for (let i = 0; i < this.listeners_.length; ++i) { this.listeners_[i].call(undefined, e); } } }; /** * ChannelManager handles window message events by dispatching them to * PostMessagePorts or forwarding to other windows (up/down the hierarchy). * @constructor */ function ChannelManager() { /** * Window and origin to forward message up the hierarchy. For subframes, * they defaults to window.parent and any origin. For top level window, * this would be set to the hosting webview on CHANNEL_INIT_MESSAGE. */ this.upperWindow = isTopLevel() ? null : window.parent; this.upperOrigin = isTopLevel() ? '' : '*'; /** * Channle Id to port map. * @type {Object} */ this.channels_ = {}; /** * Deferred messages to be posted to |upperWindow|. * @type {Array} */ this.deferredUpperWindowMessages_ = []; /** * Ports that depend on upperWindow and need to be setup when its available. */ this.deferredUpperWindowPorts_ = []; /** * Whether the ChannelManager runs in daemon mode and accepts connections. */ this.isDaemon = false; /** * Fires when ChannelManager is in listening mode and a * CHANNEL_CONNECT_MESSAGE is received. */ this.onConnect = new EventTarget(); window.addEventListener('message', this.onMessage_.bind(this)); } ChannelManager.prototype = { /** * Gets a global unique id to use. * @return {number} */ createChannelId_: function() { return (new Date()).getTime(); }, /** * Posts data to upperWindow. Queue it if upperWindow is not available. */ postToUpperWindow: function(data) { if (this.upperWindow == null) { this.deferredUpperWindowMessages_.push(data); return; } this.upperWindow.postMessage(data, this.upperOrigin); }, /** * Creates a port and register it in |channels_|. * @param {number} channelId * @param {string} channelName * @param {DOMWindow=} opt_targetWindow * @param {string=} opt_targetOrigin */ createPort: function( channelId, channelName, opt_targetWindow, opt_targetOrigin) { const port = new PostMessagePort(channelId, channelName); if (opt_targetWindow) { port.setTarget(opt_targetWindow, opt_targetOrigin); } this.channels_[channelId] = port; return port; }, /* * Returns a message forward handler for the given proxy port. * @private */ getProxyPortForwardHandler_: function(proxyPort) { return function(msg) { proxyPort.postMessage(msg); }; }, /** * Creates a forwarding porxy port. * @param {number} channelId * @param {string} channelName * @param {!DOMWindow} targetWindow * @param {!string} targetOrigin */ createProxyPort: function( channelId, channelName, targetWindow, targetOrigin) { const port = this.createPort(channelId, channelName, targetWindow, targetOrigin); port.onMessage.addListener(this.getProxyPortForwardHandler_(port)); return port; }, /** * Creates a connecting port to the daemon and request connection. * @param {string} name * @return {PostMessagePort} */ connectToDaemon: function(name) { if (this.isDaemon) { console.error( 'Error: Connecting from the daemon page is not supported.'); return; } const port = this.createPort(this.createChannelId_(), name); if (this.upperWindow) { port.setTarget(this.upperWindow, this.upperOrigin); } else { this.deferredUpperWindowPorts_.push(port); } this.postToUpperWindow({ type: CHANNEL_CONNECT_MESSAGE, channelId: port.channelId, channelName: port.name }); return port; }, /** * Dispatches a 'message' event to port. * @private */ dispatchMessageToPort_: function(e) { const channelId = e.data.channelId; const port = this.channels_[channelId]; if (!port) { console.error('Error: Unable to dispatch message. Unknown channel.'); return; } port.handleWindowMessage(e); }, /** * Window 'message' handler. */ onMessage_: function(e) { if (typeof e.data != 'object' || !e.data.hasOwnProperty('type')) { return; } if (e.data.type === PORT_MESSAGE) { // Dispatch port message to ports if this is the daemon page or // the message is from upperWindow. In case of null upperWindow, // the message is assumed to be forwarded to upperWindow and queued. if (this.isDaemon || (this.upperWindow && e.source === this.upperWindow)) { this.dispatchMessageToPort_(e); } else { this.postToUpperWindow(e.data); } } else if (e.data.type === CHANNEL_CONNECT_MESSAGE) { const channelId = e.data.channelId; const channelName = e.data.channelName; if (this.isDaemon) { const port = this.createPort(channelId, channelName, e.source, e.origin); this.onConnect.dispatch(port); } else { this.createProxyPort(channelId, channelName, e.source, e.origin); this.postToUpperWindow(e.data); } } else if (e.data.type === CHANNEL_INIT_MESSAGE) { if (ALLOWED_ORIGINS.indexOf(e.origin) == -1) { return; } this.upperWindow = e.source; this.upperOrigin = e.origin; for (let i = 0; i < this.deferredUpperWindowMessages_.length; ++i) { this.upperWindow.postMessage( this.deferredUpperWindowMessages_[i], this.upperOrigin); } this.deferredUpperWindowMessages_ = []; for (let i = 0; i < this.deferredUpperWindowPorts_.length; ++i) { this.deferredUpperWindowPorts_[i].setTarget( this.upperWindow, this.upperOrigin); } this.deferredUpperWindowPorts_ = []; } } }; /** * Singleton instance of ChannelManager. * @type {ChannelManager} */ const channelManager = new ChannelManager(); /** * A HTML5 postMessage based port that provides the same port interface * as the messaging API port. * @param {number} channelId * @param {string} name */ function PostMessagePort(channelId, name) { this.channelId = channelId; this.name = name; this.targetWindow = null; this.targetOrigin = ''; this.deferredMessages_ = []; this.onMessage = new EventTarget(); } PostMessagePort.prototype = { /** * Sets the target window and origin. * @param {DOMWindow} targetWindow * @param {string} targetOrigin */ setTarget: function(targetWindow, targetOrigin) { this.targetWindow = targetWindow; this.targetOrigin = targetOrigin; for (let i = 0; i < this.deferredMessages_.length; ++i) { this.postMessage(this.deferredMessages_[i]); } this.deferredMessages_ = []; }, postMessage: function(msg) { if (!this.targetWindow) { this.deferredMessages_.push(msg); return; } this.targetWindow.postMessage( {type: PORT_MESSAGE, channelId: this.channelId, payload: msg}, this.targetOrigin); }, handleWindowMessage: function(e) { this.onMessage.dispatch(e.data.payload); } }; /** * A message channel based on PostMessagePort. * @extends {Channel} * @constructor */ function PostMessageChannel() { Channel.apply(this, arguments); } PostMessageChannel.prototype = { __proto__: Channel.prototype, /** @override */ connect: function(name) { this.port_ = channelManager.connectToDaemon(name); this.port_.onMessage.addListener(this.onMessage_.bind(this)); }, }; /** * Initialize webview content window for postMessage channel. * @param {DOMWindow} webViewContentWindow Content window of the webview. */ PostMessageChannel.init = function(webViewContentWindow) { webViewContentWindow.postMessage({type: CHANNEL_INIT_MESSAGE}, '*'); }; /** * Run in daemon mode and listen for incoming connections. Note that the * current implementation assumes the daemon runs in the hosting page * at the upper layer of the DOM tree. That is, all connect requests go * up the DOM tree instead of going into sub frames. * @param {function(PostMessagePort)} callback Invoked when a connection is * made. */ PostMessageChannel.runAsDaemon = function(callback) { channelManager.isDaemon = true; const onConnect = function(port) { callback(port); }; channelManager.onConnect.addListener(onConnect); }; return PostMessageChannel; })(); /** @override */ Channel.create = function() { return new PostMessageChannel(); }; // // Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview * Provides WebviewEventManager which can register and keep track of listeners * on EventTargets and WebRequests, and unregister all listeners later. */ 'use strict'; /** * Creates a new WebviewEventManager. */ function WebviewEventManager() { this.unbindWebviewCleanupFunctions_ = []; } WebviewEventManager.prototype = { /** * Adds a EventListener to |eventTarget| and adds a clean-up function so we * can remove the listener in unbindFromWebview. * @param {Object} webview the object to add the listener to * @param {string} type the event type * @param {Function} listener the event listener * @private */ addEventListener: function(eventTarget, type, listener) { eventTarget.addEventListener(type, listener); this.unbindWebviewCleanupFunctions_.push( eventTarget.removeEventListener.bind(eventTarget, type, listener)); }, /** * Adds a listener to |webRequestEvent| and adds a clean-up function so we can * remove the listener in unbindFromWebview. * @param {Object} webRequestEvent the object to add the listener to * @param {string} type the event type * @param {Function} listener the event listener * @private */ addWebRequestEventListener: function( webRequestEvent, listener, filter, extraInfoSpec) { webRequestEvent.addListener(listener, filter, extraInfoSpec); this.unbindWebviewCleanupFunctions_.push( webRequestEvent.removeListener.bind(webRequestEvent, listener)); }, /** * Unbinds this Authenticator from the currently bound webview. * @private */ removeAllListeners: function() { for (let i = 0; i < this.unbindWebviewCleanupFunctions_.length; i++) { this.unbindWebviewCleanupFunctions_[i](); } this.unbindWebviewCleanupFunctions_ = []; } }; /** * Class factory. * @return {WebviewEventManager} */ WebviewEventManager.create = function() { return new WebviewEventManager(); }; /** * @fileoverview Saml support for webview based auth. */ cr.define('cr.login', function() { 'use strict'; /** * The lowest version of the credentials passing API supported. * @type {number} */ const MIN_API_VERSION_VERSION = 1; /** * The highest version of the credentials passing API supported. * @type {number} */ const MAX_API_VERSION_VERSION = 1; /** * The key types supported by the credentials passing API. * @type {Array} Array of strings. */ const API_KEY_TYPES = [ 'KEY_TYPE_PASSWORD_PLAIN', ]; /** @const */ const SAML_HEADER = 'google-accounts-saml'; /** @const */ const injectedScriptName = 'samlInjected'; /** * The script to inject into webview and its sub frames. * @type {string} */ const injectedJs = String.raw` // // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview * Provides a HTML5 postMessage channel to the injected JS to talk back * to Authenticator. */ 'use strict'; // // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * Channel to the background script. */ function Channel() { this.messageCallbacks_ = {}; this.internalRequestCallbacks_ = {}; } /** @const */ Channel.INTERNAL_REQUEST_MESSAGE = 'internal-request-message'; /** @const */ Channel.INTERNAL_REPLY_MESSAGE = 'internal-reply-message'; Channel.prototype = { // Message port to use to communicate with background script. port_: null, // Registered message callbacks. messageCallbacks_: null, // Internal request id to track pending requests. nextInternalRequestId_: 0, // Pending internal request callbacks. internalRequestCallbacks_: null, /** * Initialize the channel with given port for the background script. */ init: function(port) { this.port_ = port; this.port_.onMessage.addListener(this.onMessage_.bind(this)); }, /** * Connects to the background script with the given name. */ connect: function(name) { this.port_ = chrome.runtime.connect({name: name}); this.port_.onMessage.addListener(this.onMessage_.bind(this)); }, /** * Associates a message name with a callback. When a message with the name * is received, the callback will be invoked with the message as its arg. * Note only the last registered callback will be invoked. */ registerMessage: function(name, callback) { this.messageCallbacks_[name] = callback; }, /** * Sends a message to the other side of the channel. */ send: function(msg) { this.port_.postMessage(msg); }, /** * Sends a message to the other side and invokes the callback with * the replied object. Useful for message that expects a returned result. */ sendWithCallback: function(msg, callback) { const requestId = this.nextInternalRequestId_++; this.internalRequestCallbacks_[requestId] = callback; this.send({ name: Channel.INTERNAL_REQUEST_MESSAGE, requestId: requestId, payload: msg }); }, /** * Invokes message callback using given message. * @return {*} The return value of the message callback or null. */ invokeMessageCallbacks_: function(msg) { const name = msg.name; if (this.messageCallbacks_[name]) { return this.messageCallbacks_[name](msg); } console.error('Error: Unexpected message, name=' + name); return null; }, /** * Invoked when a message is received. */ onMessage_: function(msg) { const name = msg.name; if (name == Channel.INTERNAL_REQUEST_MESSAGE) { const payload = msg.payload; const result = this.invokeMessageCallbacks_(payload); this.send({ name: Channel.INTERNAL_REPLY_MESSAGE, requestId: msg.requestId, result: result }); } else if (name == Channel.INTERNAL_REPLY_MESSAGE) { const callback = this.internalRequestCallbacks_[msg.requestId]; delete this.internalRequestCallbacks_[msg.requestId]; if (callback) { callback(msg.result); } } else { this.invokeMessageCallbacks_(msg); } } }; /** * Class factory. * @return {Channel} */ Channel.create = function() { return new Channel(); }; const PostMessageChannel = (function() { /** * Allowed origins of the hosting page. * @type {Array} */ const ALLOWED_ORIGINS = ['chrome://oobe', 'chrome://chrome-signin']; /** @const */ const PORT_MESSAGE = 'post-message-port-message'; /** @const */ const CHANNEL_INIT_MESSAGE = 'post-message-channel-init'; /** @const */ const CHANNEL_CONNECT_MESSAGE = 'post-message-channel-connect'; /** * Whether the script runs in a top level window. */ function isTopLevel() { return window === window.top; } /** * A simple event target. */ function EventTarget() { this.listeners_ = []; } EventTarget.prototype = { /** * Add an event listener. */ addListener: function(listener) { this.listeners_.push(listener); }, /** * Dispatches a given event to all listeners. */ dispatch: function(e) { for (let i = 0; i < this.listeners_.length; ++i) { this.listeners_[i].call(undefined, e); } } }; /** * ChannelManager handles window message events by dispatching them to * PostMessagePorts or forwarding to other windows (up/down the hierarchy). * @constructor */ function ChannelManager() { /** * Window and origin to forward message up the hierarchy. For subframes, * they defaults to window.parent and any origin. For top level window, * this would be set to the hosting webview on CHANNEL_INIT_MESSAGE. */ this.upperWindow = isTopLevel() ? null : window.parent; this.upperOrigin = isTopLevel() ? '' : '*'; /** * Channle Id to port map. * @type {Object} */ this.channels_ = {}; /** * Deferred messages to be posted to |upperWindow|. * @type {Array} */ this.deferredUpperWindowMessages_ = []; /** * Ports that depend on upperWindow and need to be setup when its available. */ this.deferredUpperWindowPorts_ = []; /** * Whether the ChannelManager runs in daemon mode and accepts connections. */ this.isDaemon = false; /** * Fires when ChannelManager is in listening mode and a * CHANNEL_CONNECT_MESSAGE is received. */ this.onConnect = new EventTarget(); window.addEventListener('message', this.onMessage_.bind(this)); } ChannelManager.prototype = { /** * Gets a global unique id to use. * @return {number} */ createChannelId_: function() { return (new Date()).getTime(); }, /** * Posts data to upperWindow. Queue it if upperWindow is not available. */ postToUpperWindow: function(data) { if (this.upperWindow == null) { this.deferredUpperWindowMessages_.push(data); return; } this.upperWindow.postMessage(data, this.upperOrigin); }, /** * Creates a port and register it in |channels_|. * @param {number} channelId * @param {string} channelName * @param {DOMWindow=} opt_targetWindow * @param {string=} opt_targetOrigin */ createPort: function( channelId, channelName, opt_targetWindow, opt_targetOrigin) { const port = new PostMessagePort(channelId, channelName); if (opt_targetWindow) { port.setTarget(opt_targetWindow, opt_targetOrigin); } this.channels_[channelId] = port; return port; }, /* * Returns a message forward handler for the given proxy port. * @private */ getProxyPortForwardHandler_: function(proxyPort) { return function(msg) { proxyPort.postMessage(msg); }; }, /** * Creates a forwarding porxy port. * @param {number} channelId * @param {string} channelName * @param {!DOMWindow} targetWindow * @param {!string} targetOrigin */ createProxyPort: function( channelId, channelName, targetWindow, targetOrigin) { const port = this.createPort(channelId, channelName, targetWindow, targetOrigin); port.onMessage.addListener(this.getProxyPortForwardHandler_(port)); return port; }, /** * Creates a connecting port to the daemon and request connection. * @param {string} name * @return {PostMessagePort} */ connectToDaemon: function(name) { if (this.isDaemon) { console.error( 'Error: Connecting from the daemon page is not supported.'); return; } const port = this.createPort(this.createChannelId_(), name); if (this.upperWindow) { port.setTarget(this.upperWindow, this.upperOrigin); } else { this.deferredUpperWindowPorts_.push(port); } this.postToUpperWindow({ type: CHANNEL_CONNECT_MESSAGE, channelId: port.channelId, channelName: port.name }); return port; }, /** * Dispatches a 'message' event to port. * @private */ dispatchMessageToPort_: function(e) { const channelId = e.data.channelId; const port = this.channels_[channelId]; if (!port) { console.error('Error: Unable to dispatch message. Unknown channel.'); return; } port.handleWindowMessage(e); }, /** * Window 'message' handler. */ onMessage_: function(e) { if (typeof e.data != 'object' || !e.data.hasOwnProperty('type')) { return; } if (e.data.type === PORT_MESSAGE) { // Dispatch port message to ports if this is the daemon page or // the message is from upperWindow. In case of null upperWindow, // the message is assumed to be forwarded to upperWindow and queued. if (this.isDaemon || (this.upperWindow && e.source === this.upperWindow)) { this.dispatchMessageToPort_(e); } else { this.postToUpperWindow(e.data); } } else if (e.data.type === CHANNEL_CONNECT_MESSAGE) { const channelId = e.data.channelId; const channelName = e.data.channelName; if (this.isDaemon) { const port = this.createPort(channelId, channelName, e.source, e.origin); this.onConnect.dispatch(port); } else { this.createProxyPort(channelId, channelName, e.source, e.origin); this.postToUpperWindow(e.data); } } else if (e.data.type === CHANNEL_INIT_MESSAGE) { if (ALLOWED_ORIGINS.indexOf(e.origin) == -1) { return; } this.upperWindow = e.source; this.upperOrigin = e.origin; for (let i = 0; i < this.deferredUpperWindowMessages_.length; ++i) { this.upperWindow.postMessage( this.deferredUpperWindowMessages_[i], this.upperOrigin); } this.deferredUpperWindowMessages_ = []; for (let i = 0; i < this.deferredUpperWindowPorts_.length; ++i) { this.deferredUpperWindowPorts_[i].setTarget( this.upperWindow, this.upperOrigin); } this.deferredUpperWindowPorts_ = []; } } }; /** * Singleton instance of ChannelManager. * @type {ChannelManager} */ const channelManager = new ChannelManager(); /** * A HTML5 postMessage based port that provides the same port interface * as the messaging API port. * @param {number} channelId * @param {string} name */ function PostMessagePort(channelId, name) { this.channelId = channelId; this.name = name; this.targetWindow = null; this.targetOrigin = ''; this.deferredMessages_ = []; this.onMessage = new EventTarget(); } PostMessagePort.prototype = { /** * Sets the target window and origin. * @param {DOMWindow} targetWindow * @param {string} targetOrigin */ setTarget: function(targetWindow, targetOrigin) { this.targetWindow = targetWindow; this.targetOrigin = targetOrigin; for (let i = 0; i < this.deferredMessages_.length; ++i) { this.postMessage(this.deferredMessages_[i]); } this.deferredMessages_ = []; }, postMessage: function(msg) { if (!this.targetWindow) { this.deferredMessages_.push(msg); return; } this.targetWindow.postMessage( {type: PORT_MESSAGE, channelId: this.channelId, payload: msg}, this.targetOrigin); }, handleWindowMessage: function(e) { this.onMessage.dispatch(e.data.payload); } }; /** * A message channel based on PostMessagePort. * @extends {Channel} * @constructor */ function PostMessageChannel() { Channel.apply(this, arguments); } PostMessageChannel.prototype = { __proto__: Channel.prototype, /** @override */ connect: function(name) { this.port_ = channelManager.connectToDaemon(name); this.port_.onMessage.addListener(this.onMessage_.bind(this)); }, }; /** * Initialize webview content window for postMessage channel. * @param {DOMWindow} webViewContentWindow Content window of the webview. */ PostMessageChannel.init = function(webViewContentWindow) { webViewContentWindow.postMessage({type: CHANNEL_INIT_MESSAGE}, '*'); }; /** * Run in daemon mode and listen for incoming connections. Note that the * current implementation assumes the daemon runs in the hosting page * at the upper layer of the DOM tree. That is, all connect requests go * up the DOM tree instead of going into sub frames. * @param {function(PostMessagePort)} callback Invoked when a connection is * made. */ PostMessageChannel.runAsDaemon = function(callback) { channelManager.isDaemon = true; const onConnect = function(port) { callback(port); }; channelManager.onConnect.addListener(onConnect); }; return PostMessageChannel; })(); /** @override */ Channel.create = function() { return new PostMessageChannel(); }; // // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * @fileoverview * Script to be injected into SAML provider pages, serving three main purposes: * 1. Signal hosting extension that an external page is loaded so that the * UI around it should be changed accordingly; * 2. Provide an API via which the SAML provider can pass user credentials to * Chrome OS, allowing the password to be used for encrypting user data and * offline login. * 3. Scrape password fields, making the password available to Chrome OS even if * the SAML provider does not support the credential passing API. */ (function() { function APICallForwarder() {} /** * The credential passing API is used by sending messages to the SAML page's * |window| object. This class forwards API calls from the SAML page to a * background script and API responses from the background script to the SAML * page. Communication with the background script occurs via a |Channel|. */ APICallForwarder.prototype = { // Channel to which API calls are forwarded. channel_: null, /** * Initialize the API call forwarder. * @param {!Object} channel Channel to which API calls should be forwarded. */ init: function(channel) { this.channel_ = channel; this.channel_.registerMessage( 'apiResponse', this.onAPIResponse_.bind(this)); window.addEventListener('message', this.onMessage_.bind(this)); }, onMessage_: function(event) { if (event.source != window || typeof event.data != 'object' || !event.data.hasOwnProperty('type') || event.data.type != 'gaia_saml_api') { return; } // Forward API calls to the background script. this.channel_.send({name: 'apiCall', call: event.data.call}); }, onAPIResponse_: function(msg) { // Forward API responses to the SAML page. window.postMessage( {type: 'gaia_saml_api_reply', response: msg.response}, '/'); } }; /** * A class to scrape password from type=password input elements under a given * docRoot and send them back via a Channel. */ function PasswordInputScraper() {} PasswordInputScraper.prototype = { // URL of the page. pageURL_: null, // Channel to send back changed password. channel_: null, // An array to hold password fields. passwordFields_: null, // An array to hold cached password values. passwordValues_: null, // A MutationObserver to watch for dynamic password field creation. passwordFieldsObserver: null, /** * Initialize the scraper with given channel and docRoot. Note that the * scanning for password fields happens inside the function and does not * handle DOM tree changes after the call returns. * @param {!Object} channel The channel to send back password. * @param {!string} pageURL URL of the page. * @param {!HTMLElement} docRoot The root element of the DOM tree that * contains the password fields of interest. */ init: function(channel, pageURL, docRoot) { this.pageURL_ = pageURL; this.channel_ = channel; this.passwordFields_ = []; this.passwordValues_ = []; this.findAndTrackChildren(docRoot); this.passwordFieldsObserver = new MutationObserver(function(mutations) { mutations.forEach(function(mutation) { Array.prototype.forEach.call(mutation.addedNodes, function(addedNode) { if (addedNode.nodeType != Node.ELEMENT_NODE) { return; } if (addedNode.matches('input[type=password]')) { this.trackPasswordField(addedNode); } else { this.findAndTrackChildren(addedNode); } }.bind(this)); }.bind(this)); }.bind(this)); this.passwordFieldsObserver.observe( docRoot, {subtree: true, childList: true}); }, /** * Find and track password fields that are descendants of the given element. * @param {!HTMLElement} element The parent element to search from. */ findAndTrackChildren: function(element) { Array.prototype.forEach.call( element.querySelectorAll('input[type=password]'), function(field) { this.trackPasswordField(field); }.bind(this)); }, /** * Start tracking value changes of the given password field if it is * not being tracked yet. * @param {!HTMLInputElement} passworField The password field to track. */ trackPasswordField: function(passwordField) { const existing = this.passwordFields_.filter(function(element) { return element === passwordField; }); if (existing.length != 0) { return; } const index = this.passwordFields_.length; const fieldId = passwordField.id || passwordField.name || ''; passwordField.addEventListener( 'input', this.onPasswordChanged_.bind(this, index, fieldId)); this.passwordFields_.push(passwordField); this.passwordValues_.push(passwordField.value); }, /** * Check if the password field at |index| has changed. If so, sends back * the updated value. */ maybeSendUpdatedPassword: function(index, fieldId) { const newValue = this.passwordFields_[index].value; if (newValue == this.passwordValues_[index]) { return; } this.passwordValues_[index] = newValue; // Use an invalid char for URL as delimiter to concatenate page url, // password field index and id to construct a unique ID for the password // field. const passwordId = this.pageURL_.split('#')[0].split('?')[0] + '|' + index + '|' + fieldId; this.channel_.send( {name: 'updatePassword', id: passwordId, password: newValue}); }, /** * Handles 'change' event in the scraped password fields. * @param {number} index The index of the password fields in * |passwordFields_|. * @param {string} fieldId The id or name of the password field or blank. */ onPasswordChanged_: function(index, fieldId) { this.maybeSendUpdatedPassword(index, fieldId); } }; function onGetSAMLFlag(channel, isSAMLPage) { if (!isSAMLPage) { return; } const pageURL = window.location.href; channel.send({name: 'pageLoaded', url: pageURL}); const initPasswordScraper = function() { const passwordScraper = new PasswordInputScraper(); passwordScraper.init(channel, pageURL, document.documentElement); }; if (document.readyState == 'loading') { window.addEventListener('readystatechange', function listener(event) { if (document.readyState == 'loading') { return; } initPasswordScraper(); window.removeEventListener(event.type, listener, true); }, true); } else { initPasswordScraper(); } } const channel = Channel.create(); channel.connect('injected'); channel.sendWithCallback( {name: 'getSAMLFlag'}, onGetSAMLFlag.bind(undefined, channel)); const apiCallForwarder = new APICallForwarder(); apiCallForwarder.init(channel); })(); `; /** * Creates a new URL by striping all query parameters. * @param {string} url The original URL. * @return {string} The new URL with all query parameters stripped. */ function stripParams(url) { return url.substring(0, url.indexOf('?')) || url; } /** * Extract domain name from an URL. * @param {string} url An URL string. * @return {string} The host name of the URL. */ function extractDomain(url) { const a = document.createElement('a'); a.href = url; return a.hostname; } /** * A handler to provide saml support for the given webview that hosts the * auth IdP pages. */ class SamlHandler extends cr.EventTarget { /** @param {webview} webview */ constructor(webview) { super(); /** * The webview that serves IdP pages. * @type {webview} */ this.webview_ = webview; /** * Whether a Saml IdP page is display in the webview. * @type {boolean} */ this.isSamlPage_ = false; /** * Pending Saml IdP page flag that is set when a SAML_HEADER is received * and is copied to |isSamlPage_| in loadcommit. * @type {boolean} */ this.pendingIsSamlPage_ = false; /** * The last aborted top level url. It is recorded in loadabort event and * used to skip injection into Chrome's error page in the following * loadcommit event. * @type {string} */ this.abortedTopLevelUrl_ = null; /** * The domain of the Saml IdP. * @type {string} */ this.authDomain = ''; /** * Scraped password stored in an id to password field value map. * @type {Object} * @private */ this.passwordStore_ = {}; /** * Whether Saml API is initialized. * @type {boolean} */ this.apiInitialized_ = false; /** * Saml API version to use. * @type {number} */ this.apiVersion_ = 0; /** * Saml API token received. * @type {string} */ this.apiToken_ = null; /** * Saml API password bytes. * @type {string} */ this.apiPasswordBytes_ = null; /* * Whether to abort the authentication flow and show an error messagen * when content served over an unencrypted connection is detected. * @type {boolean} */ this.blockInsecureContent = false; this.webviewEventManager_ = WebviewEventManager.create(); this.webviewEventManager_.addEventListener( this.webview_, 'contentload', this.onContentLoad_.bind(this)); this.webviewEventManager_.addEventListener( this.webview_, 'loadabort', this.onLoadAbort_.bind(this)); this.webviewEventManager_.addEventListener( this.webview_, 'loadcommit', this.onLoadCommit_.bind(this)); this.webviewEventManager_.addEventListener( this.webview_, 'permissionrequest', this.onPermissionRequest_.bind(this)); this.webviewEventManager_.addWebRequestEventListener( this.webview_.request.onBeforeRequest, this.onInsecureRequest.bind(this), {urls: ['http://*/*', 'file://*/*', 'ftp://*/*']}, ['blocking']); this.webviewEventManager_.addWebRequestEventListener( this.webview_.request.onHeadersReceived, this.onHeadersReceived_.bind(this), {urls: [''], types: ['main_frame', 'xmlhttprequest']}, ['blocking', 'responseHeaders']); this.webview_.addContentScripts([{ name: injectedScriptName, matches: ['http://*/*', 'https://*/*'], js: {code: injectedJs}, all_frames: true, run_at: 'document_start' }]); PostMessageChannel.runAsDaemon(this.onConnected_.bind(this)); } /** * Whether Saml API is used during auth. * @return {boolean} */ get samlApiUsed() { return !!this.apiPasswordBytes_; } /** * Returns the Saml API password bytes. * @return {string} */ get apiPasswordBytes() { return this.apiPasswordBytes_; } /** * Returns the first scraped password if any, or an empty string otherwise. * @return {string} */ get firstScrapedPassword() { const scraped = this.getConsolidatedScrapedPasswords_(); return scraped.length ? scraped[0] : ''; } /** * Returns the number of scraped passwords. * @return {number} */ get scrapedPasswordCount() { return this.getConsolidatedScrapedPasswords_().length; } /** * Gets the de-duped scraped passwords. * @return {Array} * @private */ getConsolidatedScrapedPasswords_() { const passwords = {}; for (const property in this.passwordStore_) { passwords[this.passwordStore_[property]] = true; } return Object.keys(passwords); } /** * Removes the injected content script and unbinds all listeners from the * webview passed to the constructor. This SAMLHandler will be unusable * after this function returns. */ unbindFromWebview() { this.webview_.removeContentScripts([injectedScriptName]); this.webviewEventManager_.removeAllListeners(); } /** * Resets all auth states */ reset() { this.isSamlPage_ = false; this.pendingIsSamlPage_ = false; this.passwordStore_ = {}; this.apiInitialized_ = false; this.apiVersion_ = 0; this.apiToken_ = null; this.apiPasswordBytes_ = null; } /** * Check whether the given |password| is in the scraped passwords. * @return {boolean} True if the |password| is found. */ verifyConfirmedPassword(password) { return this.getConsolidatedScrapedPasswords_().indexOf(password) >= 0; } /** * Invoked on the webview's contentload event. * @private */ onContentLoad_(e) { // |this.webview_.contentWindow| may be null after network error screen // is shown. See crbug.com/770999. if (this.webview_.contentWindow) { PostMessageChannel.init(this.webview_.contentWindow); } else { console.error('SamlHandler.onContentLoad_: contentWindow is null.'); } } /** * Invoked on the webview's loadabort event. * @private */ onLoadAbort_(e) { if (e.isTopLevel) { this.abortedTopLevelUrl_ = e.url; } } /** * Invoked on the webview's loadcommit event for both main and sub frames. * @private */ onLoadCommit_(e) { // Skip this loadcommit if the top level load is just aborted. if (e.isTopLevel && e.url === this.abortedTopLevelUrl_) { this.abortedTopLevelUrl_ = null; return; } // Skip for none http/https url. if (!e.url.startsWith('https://') && !e.url.startsWith('http://')) { return; } this.isSamlPage_ = this.pendingIsSamlPage_; } /** * Handler for webRequest.onBeforeRequest, invoked when content served over * an unencrypted connection is detected. Determines whether the request * should be blocked and if so, signals that an error message needs to be * shown. * @param {Object} details * @return {!Object} Decision whether to block the request. */ onInsecureRequest(details) { if (!this.blockInsecureContent) { return {}; } const strippedUrl = stripParams(details.url); this.dispatchEvent(new CustomEvent( 'insecureContentBlocked', {detail: {url: strippedUrl}})); return {cancel: true}; } /** * Invoked when headers are received for the main frame. * @private */ onHeadersReceived_(details) { const headers = details.responseHeaders; // Check whether GAIA headers indicating the start or end of a SAML // redirect are present. for (let i = 0; headers && i < headers.length; ++i) { const header = headers[i]; const headerName = header.name.toLowerCase(); if (headerName == SAML_HEADER) { const action = header.value.toLowerCase(); if (action == 'start') { this.pendingIsSamlPage_ = true; } else if (action == 'end') { this.pendingIsSamlPage_ = false; } } } return {}; } /** * Invoked when the injected JS makes a connection. */ onConnected_(port) { if (port.targetWindow != this.webview_.contentWindow) { return; } const channel = Channel.create(); channel.init(port); channel.registerMessage('apiCall', this.onAPICall_.bind(this, channel)); channel.registerMessage( 'updatePassword', this.onUpdatePassword_.bind(this, channel)); channel.registerMessage( 'pageLoaded', this.onPageLoaded_.bind(this, channel)); channel.registerMessage( 'getSAMLFlag', this.onGetSAMLFlag_.bind(this, channel)); } sendInitializationSuccess_(channel) { channel.send({ name: 'apiResponse', response: { result: 'initialized', version: this.apiVersion_, keyTypes: API_KEY_TYPES } }); } sendInitializationFailure_(channel) { channel.send( {name: 'apiResponse', response: {result: 'initialization_failed'}}); } /** * Handlers for channel messages. * @param {Channel} channel A channel to send back response. * @param {Object} msg Received message. * @private */ onAPICall_(channel, msg) { const call = msg.call; if (call.method == 'initialize') { if (!Number.isInteger(call.requestedVersion) || call.requestedVersion < MIN_API_VERSION_VERSION) { this.sendInitializationFailure_(channel); return; } this.apiVersion_ = Math.min(call.requestedVersion, MAX_API_VERSION_VERSION); this.apiInitialized_ = true; this.sendInitializationSuccess_(channel); return; } if (call.method == 'add') { if (API_KEY_TYPES.indexOf(call.keyType) == -1) { console.error('SamlHandler.onAPICall_: unsupported key type'); return; } // Not setting |email_| and |gaiaId_| because this API call will // eventually be followed by onCompleteLogin_() which does set it. this.apiToken_ = call.token; this.apiPasswordBytes_ = call.passwordBytes; this.dispatchEvent(new CustomEvent('apiPasswordAdded')); } else if (call.method == 'confirm') { if (call.token != this.apiToken_) { console.error('SamlHandler.onAPICall_: token mismatch'); } } else { console.error('SamlHandler.onAPICall_: unknown message'); } } onUpdatePassword_(channel, msg) { if (this.isSamlPage_) { this.passwordStore_[msg.id] = msg.password; } } onPageLoaded_(channel, msg) { this.authDomain = extractDomain(msg.url); this.dispatchEvent(new CustomEvent('authPageLoaded', { detail: { url: msg.url, isSAMLPage: this.isSamlPage_, domain: this.authDomain } })); } onPermissionRequest_(permissionEvent) { if (permissionEvent.permission === 'media') { // The actual permission check happens in // WebUILoginView::RequestMediaAccessPermission(). this.dispatchEvent(new CustomEvent('videoEnabled')); permissionEvent.request.allow(); } } onGetSAMLFlag_(channel, msg) { return this.isSamlPage_; } } return {SamlHandler: SamlHandler}; }); // Note: webview_event_manager.js is already included by saml_handler.js. /** * @fileoverview An UI component to authenciate to Chrome. The component hosts * IdP web pages in a webview. A client who is interested in monitoring * authentication events should pass a listener object of type * cr.login.GaiaAuthHost.Listener as defined in this file. After initialization, * call {@code load} to start the authentication flow. * * See go/cros-auth-design for details on Google API. */ cr.define('cr.login', function() { 'use strict'; // TODO(rogerta): should use gaia URL from GaiaUrls::gaia_url() instead // of hardcoding the prod URL here. As is, this does not work with staging // environments. const IDP_ORIGIN = 'https://accounts.google.com/'; const IDP_PATH = 'ServiceLogin?skipvpage=true&sarp=1&rm=hide'; const CONTINUE_URL = 'chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/success.html'; const SIGN_IN_HEADER = 'google-accounts-signin'; const EMBEDDED_FORM_HEADER = 'google-accounts-embedded'; const LOCATION_HEADER = 'location'; const SERVICE_ID = 'chromeoslogin'; const EMBEDDED_SETUP_CHROMEOS_ENDPOINT = 'embedded/setup/chromeos'; const EMBEDDED_SETUP_CHROMEOS_ENDPOINT_V2 = 'embedded/setup/v2/chromeos'; const SAML_REDIRECTION_PATH = 'samlredirect'; const BLANK_PAGE_URL = 'about:blank'; /** * The source URL parameter for the constrained signin flow. */ const CONSTRAINED_FLOW_SOURCE = 'chrome'; /** * Enum for the authorization mode, must match AuthMode defined in * chrome/browser/ui/webui/inline_login_ui.cc. * @enum {number} */ const AuthMode = {DEFAULT: 0, OFFLINE: 1, DESKTOP: 2}; /** * Enum for the authorization type. * @enum {number} */ const AuthFlow = {DEFAULT: 0, SAML: 1}; /** * Supported Authenticator params. * @type {!Array} * @const */ const SUPPORTED_PARAMS = [ 'gaiaId', // Obfuscated GAIA ID to skip the email prompt page // during the re-auth flow. 'gaiaUrl', // Gaia url to use. 'gaiaPath', // Gaia path to use without a leading slash. 'hl', // Language code for the user interface. 'service', // Name of Gaia service. 'continueUrl', // Continue url to use. 'frameUrl', // Initial frame URL to use. If empty defaults to // gaiaUrl. 'constrained', // Whether the extension is loaded in a constrained // window. 'clientId', // Chrome client id. 'needPassword', // Whether the host is interested in getting a password. // If this set to |false|, |confirmPasswordCallback| is // not called before dispatching |authCopleted|. // Default is |true|. 'flow', // One of 'default', 'enterprise', or 'theftprotection'. 'enterpriseDisplayDomain', // Current domain name to be displayed. 'enterpriseEnrollmentDomain', // Domain in which hosting device is (or // should be) enrolled. 'emailDomain', // Value used to prefill domain for email. 'chromeType', // Type of Chrome OS device, e.g. "chromebox". 'clientVersion', // Version of the Chrome build. 'platformVersion', // Version of the OS build. 'releaseChannel', // Installation channel. 'endpointGen', // Current endpoint generation. 'chromeOSApiVersion', // GAIA Chrome OS API version 'menuGuestMode', // Enables "Guest mode" menu item 'menuKeyboardOptions', // Enables "Keyboard options" menu item 'menuEnterpriseEnrollment', // Enables "Enterprise enrollment" menu item. 'lsbReleaseBoard', // Chrome OS Release board name 'isFirstUser', // True if this is non-enterprise device, // and there are no users yet. 'obfuscatedOwnerId', // Obfuscated device owner ID, if neeed. // The email fields allow for the following possibilities: // // 1/ If 'email' is not supplied, then the email text field is blank and the // user must type an email to proceed. // // 2/ If 'email' is supplied, and 'readOnlyEmail' is truthy, then the email // is hardcoded and the user cannot change it. The user is asked for // password. This is useful for re-auth scenarios, where chrome needs the // user to authenticate for a specific account and only that account. // // 3/ If 'email' is supplied, and 'readOnlyEmail' is falsy, gaia will // prefill the email text field using the given email address, but the user // can still change it and then proceed. This is used on desktop when the // user disconnects their profile then reconnects, to encourage them to use // the same account. 'email', 'readOnlyEmail', 'realm', ]; /** * Initializes the authenticator component. */ class Authenticator extends cr.EventTarget { /** * @param {webview|string} webview The webview element or its ID to host * IdP web pages. */ constructor(webview) { super(); this.isLoaded_ = false; this.email_ = null; this.password_ = null; this.gaiaId_ = null, this.sessionIndex_ = null; this.chooseWhatToSync_ = false; this.skipForNow_ = false; this.authFlow = AuthFlow.DEFAULT; this.authDomain = ''; this.videoEnabled = false; this.idpOrigin_ = null; this.continueUrl_ = null; this.continueUrlWithoutParams_ = null; this.initialFrameUrl_ = null; this.reloadUrl_ = null; this.trusted_ = true; this.readyFired_ = false; this.webviewEventManager_ = WebviewEventManager.create(); this.clientId_ = null; this.confirmPasswordCallback = null; this.noPasswordCallback = null; this.insecureContentBlockedCallback = null; this.samlApiUsedCallback = null; this.missingGaiaInfoCallback = null; /** * Callback allowing to request whether the specified user which * authenticates via SAML is a user without a password (neither a manually * entered one nor one provided via Credentials Passing API). * @type {function(string, string, function(boolean))} Arguments are the * e-mail, the GAIA ID, and the response callback. */ this.getIsSamlUserPasswordlessCallback = null; this.needPassword = true; this.services_ = null; /** * Caches the result of |getIsSamlUserPasswordlessCallback| invocation for * the current user. Null if no result is obtained yet. * @type {?boolean} * @private */ this.isSamlUserPasswordless_ = null; this.bindToWebview_(webview); window.addEventListener( 'message', this.onMessageFromWebview_.bind(this), false); window.addEventListener('focus', this.onFocus_.bind(this), false); window.addEventListener('popstate', this.onPopState_.bind(this), false); } /** * Reinitializes authentication parameters so that a failed login attempt * would not result in an infinite loop. */ resetStates() { this.isLoaded_ = false; this.email_ = null; this.gaiaId_ = null; this.password_ = null; this.readyFired_ = false; this.chooseWhatToSync_ = false; this.skipForNow_ = false; this.sessionIndex_ = null; this.trusted_ = true; this.authFlow = AuthFlow.DEFAULT; this.samlHandler_.reset(); this.videoEnabled = false; this.services_ = null; this.isSamlUserPasswordless_ = null; } /** * Resets the webview to the blank page. */ resetWebview() { if (this.webview_.src && this.webview_.src != BLANK_PAGE_URL) { this.webview_.src = BLANK_PAGE_URL; } } /** * Binds this authenticator to the passed webview. * @param {!Object} webview the new webview to be used by this * Authenticator. * @private */ bindToWebview_(webview) { assert(!this.webview_); assert(!this.samlHandler_); this.webview_ = typeof webview == 'string' ? $(webview) : webview; this.samlHandler_ = new cr.login.SamlHandler(this.webview_); this.webviewEventManager_.addEventListener( this.samlHandler_, 'insecureContentBlocked', this.onInsecureContentBlocked_.bind(this)); this.webviewEventManager_.addEventListener( this.samlHandler_, 'authPageLoaded', this.onAuthPageLoaded_.bind(this)); this.webviewEventManager_.addEventListener( this.samlHandler_, 'videoEnabled', this.onVideoEnabled_.bind(this)); this.webviewEventManager_.addEventListener( this.samlHandler_, 'apiPasswordAdded', this.onSamlApiPasswordAdded_.bind(this)); this.webviewEventManager_.addEventListener( this.webview_, 'droplink', this.onDropLink_.bind(this)); this.webviewEventManager_.addEventListener( this.webview_, 'newwindow', this.onNewWindow_.bind(this)); this.webviewEventManager_.addEventListener( this.webview_, 'contentload', this.onContentLoad_.bind(this)); this.webviewEventManager_.addEventListener( this.webview_, 'loadabort', this.onLoadAbort_.bind(this)); this.webviewEventManager_.addEventListener( this.webview_, 'loadcommit', this.onLoadCommit_.bind(this)); this.webviewEventManager_.addWebRequestEventListener( this.webview_.request.onCompleted, this.onRequestCompleted_.bind(this), {urls: [''], types: ['main_frame']}, ['responseHeaders']); this.webviewEventManager_.addWebRequestEventListener( this.webview_.request.onHeadersReceived, this.onHeadersReceived_.bind(this), {urls: [''], types: ['main_frame', 'xmlhttprequest']}, ['responseHeaders']); } /** * Unbinds this Authenticator from the currently bound webview. * @private */ unbindFromWebview_() { assert(this.webview_); assert(this.samlHandler_); this.webviewEventManager_.removeAllListeners(); this.webview_ = undefined; this.samlHandler_.unbindFromWebview(); this.samlHandler_ = undefined; } /** * Re-binds to another webview. * @param {Object} webview the new webview to be used by this Authenticator. */ rebindWebview(webview) { this.unbindFromWebview_(); this.bindToWebview_(webview); } /** * Loads the authenticator component with the given parameters. * @param {AuthMode} authMode Authorization mode. * @param {Object} data Parameters for the authorization flow. */ load(authMode, data) { this.authMode = authMode; this.resetStates(); // gaiaUrl parameter is used for testing. Once defined, it is never // changed. this.idpOrigin_ = data.gaiaUrl || IDP_ORIGIN; this.continueUrl_ = data.continueUrl || CONTINUE_URL; this.continueUrlWithoutParams_ = this.continueUrl_.substring(0, this.continueUrl_.indexOf('?')) || this.continueUrl_; this.isConstrainedWindow_ = data.constrained == '1'; this.isNewGaiaFlow = data.isNewGaiaFlow; this.clientId_ = data.clientId; this.dontResizeNonEmbeddedPages = data.dontResizeNonEmbeddedPages; this.chromeOSApiVersion_ = data.chromeOSApiVersion; this.initialFrameUrl_ = this.constructInitialFrameUrl_(data); this.reloadUrl_ = data.frameUrl || this.initialFrameUrl_; // Don't block insecure content for desktop flow because it lands on // http. Otherwise, block insecure content as long as gaia is https. this.samlHandler_.blockInsecureContent = authMode != AuthMode.DESKTOP && this.idpOrigin_.startsWith('https://'); this.needPassword = !('needPassword' in data) || data.needPassword; if (this.isNewGaiaFlow) { this.webview_.contextMenus.onShow.addListener(function(e) { e.preventDefault(); }); } this.webview_.src = this.reloadUrl_; this.isLoaded_ = true; } constructChromeOSAPIUrl_() { if (this.chromeOSApiVersion_ && this.chromeOSApiVersion_ == 2) { return this.idpOrigin_ + EMBEDDED_SETUP_CHROMEOS_ENDPOINT_V2; } return this.idpOrigin_ + EMBEDDED_SETUP_CHROMEOS_ENDPOINT; } /** * Reloads the authenticator component. */ reload() { this.resetStates(); this.webview_.src = this.reloadUrl_; this.isLoaded_ = true; } constructInitialFrameUrl_(data) { if (data.doSamlRedirect) { let url = this.idpOrigin_ + SAML_REDIRECTION_PATH; url = appendParam(url, 'domain', data.enterpriseEnrollmentDomain); url = appendParam( url, 'continue', data.gaiaUrl + 'programmatic_auth_chromeos?hl=' + data.hl + '&scope=https%3A%2F%2Fwww.google.com%2Faccounts%2FOAuthLogin&' + 'client_id=' + encodeURIComponent(data.clientId) + '&access_type=offline'); return url; } let url; if (data.gaiaPath) { url = this.idpOrigin_ + data.gaiaPath; } else if (this.isNewGaiaFlow) { url = this.constructChromeOSAPIUrl_(); } else { url = this.idpOrigin_ + IDP_PATH; } if (this.isNewGaiaFlow) { if (data.chromeType) { url = appendParam(url, 'chrometype', data.chromeType); } if (data.clientId) { url = appendParam(url, 'client_id', data.clientId); } if (data.enterpriseDisplayDomain) { url = appendParam(url, 'manageddomain', data.enterpriseDisplayDomain); } if (data.clientVersion) { url = appendParam(url, 'client_version', data.clientVersion); } if (data.platformVersion) { url = appendParam(url, 'platform_version', data.platformVersion); } if (data.releaseChannel) { url = appendParam(url, 'release_channel', data.releaseChannel); } if (data.endpointGen) { url = appendParam(url, 'endpoint_gen', data.endpointGen); } if (data.chromeOSApiVersion == 2) { let mi = ''; if (data.menuGuestMode) { mi += 'gm,'; } if (data.menuKeyboardOptions) { mi += 'ko,'; } if (data.menuEnterpriseEnrollment) { mi += 'ee,'; } if (mi.length) { url = appendParam(url, 'mi', mi); } if (data.lsbReleaseBoard) { url = appendParam(url, 'chromeos_board', data.lsbReleaseBoard); } if (data.isFirstUser) { url = appendParam(url, 'is_first_user', true); } if (data.obfuscatedOwnerId) { url = appendParam(url, 'obfuscated_owner_id', data.obfuscatedOwnerId); } } } else { url = appendParam(url, 'continue', this.continueUrl_); url = appendParam(url, 'service', data.service || SERVICE_ID); } if (data.hl) { url = appendParam(url, 'hl', data.hl); } if (data.gaiaId) { url = appendParam(url, 'user_id', data.gaiaId); } if (data.email) { if (data.readOnlyEmail) { url = appendParam(url, 'Email', data.email); } else { url = appendParam(url, 'email_hint', data.email); } } if (this.isConstrainedWindow_) { url = appendParam(url, 'source', CONSTRAINED_FLOW_SOURCE); } if (data.flow) { url = appendParam(url, 'flow', data.flow); } if (data.emailDomain) { url = appendParam(url, 'emaildomain', data.emailDomain); // ChromeOS embedded signin page uses 'hd' (hosted domain) as the query // argument to show an email domain. url = appendParam(url, 'hd', data.emailDomain); } return url; } /** * Dispatches the 'ready' event if it hasn't been dispatched already for the * current content. * @private */ fireReadyEvent_() { if (!this.readyFired_) { this.dispatchEvent(new Event('ready')); this.readyFired_ = true; } } /** * Invoked when a main frame request in the webview has completed. * @private */ onRequestCompleted_(details) { const currentUrl = details.url; if (!this.isNewGaiaFlow && currentUrl.lastIndexOf(this.continueUrlWithoutParams_, 0) == 0) { if (currentUrl.indexOf('ntp=1') >= 0) { this.skipForNow_ = true; } this.maybeCompleteAuth_(); return; } if (!currentUrl.startsWith('https')) { this.trusted_ = false; } if (this.isConstrainedWindow_) { let isEmbeddedPage = false; if (this.idpOrigin_ && currentUrl.lastIndexOf(this.idpOrigin_) == 0) { const headers = details.responseHeaders; for (let i = 0; headers && i < headers.length; ++i) { if (headers[i].name.toLowerCase() == EMBEDDED_FORM_HEADER) { isEmbeddedPage = true; break; } } } // In some cases, non-embedded pages should not be resized. For // example, on desktop when reauthenticating for purposes of unlocking // a profile, resizing would cause a browser window to open in the // system profile, which is not allowed. if (!isEmbeddedPage && !this.dontResizeNonEmbeddedPages) { this.dispatchEvent(new CustomEvent('resize', {detail: currentUrl})); return; } } this.updateHistoryState_(currentUrl); } /** * Manually updates the history. Invoked upon completion of a webview * navigation. * @param {string} url Request URL. * @private */ updateHistoryState_(url) { if (history.state && history.state.url != url) { history.pushState({url: url}, ''); } else { history.replaceState({url: url}, ''); } } /** * Invoked when the sign-in page takes focus. * @param {object} e The focus event being triggered. * @private */ onFocus_(e) { if (this.authMode == AuthMode.DESKTOP && document.activeElement == document.body) { this.webview_.focus(); } } /** * Invoked when the history state is changed. * @param {object} e The popstate event being triggered. * @private */ onPopState_(e) { const state = e.state; if (state && state.url) { this.webview_.src = state.url; } } /** * Invoked when headers are received in the main frame of the webview. It * 1) reads the authenticated user info from a signin header, * 2) signals the start of a saml flow upon receiving a saml header. * @return {!Object} Modified request headers. * @private */ onHeadersReceived_(details) { const currentUrl = details.url; if (currentUrl.lastIndexOf(this.idpOrigin_, 0) != 0) { return; } const headers = details.responseHeaders; for (let i = 0; headers && i < headers.length; ++i) { const header = headers[i]; const headerName = header.name.toLowerCase(); if (headerName == SIGN_IN_HEADER) { const headerValues = header.value.toLowerCase().split(','); const signinDetails = {}; headerValues.forEach(function(e) { const pair = e.split('='); signinDetails[pair[0].trim()] = pair[1].trim(); }); // Removes "" around. this.email_ = signinDetails['email'].slice(1, -1); this.gaiaId_ = signinDetails['obfuscatedid'].slice(1, -1); this.sessionIndex_ = signinDetails['sessionindex']; this.isSamlUserPasswordless_ = null; } else if (headerName == LOCATION_HEADER) { // If the "choose what to sync" checkbox was clicked, then the // continue URL will contain a source=3 field. const location = decodeURIComponent(header.value); this.chooseWhatToSync_ = !!location.match(/(\?|&)source=3($|&)/); } } } /** * Returns true if given HTML5 message is received from the webview element. * @param {object} e Payload of the received HTML5 message. */ isGaiaMessage(e) { if (!this.isWebviewEvent_(e)) { return false; } // The event origin does not have a trailing slash. if (e.origin != this.idpOrigin_.substring(0, this.idpOrigin_.length - 1)) { return false; } // Gaia messages must be an object with 'method' property. if (typeof e.data != 'object' || !e.data.hasOwnProperty('method')) { return false; } return true; } /** * Invoked when an HTML5 message is received from the webview element. * @param {object} e Payload of the received HTML5 message. * @private */ onMessageFromWebview_(e) { if (!this.isGaiaMessage(e)) { return; } const msg = e.data; if (msg.method == 'attemptLogin') { this.email_ = msg.email; if (this.authMode == AuthMode.DESKTOP) { this.password_ = msg.password; } this.isSamlUserPasswordless_ = null; this.chooseWhatToSync_ = msg.chooseWhatToSync; // We need to dispatch only first event, before user enters password. this.dispatchEvent( new CustomEvent('attemptLogin', {detail: msg.email})); } else if (msg.method == 'dialogShown') { this.dispatchEvent(new Event('dialogShown')); } else if (msg.method == 'dialogHidden') { this.dispatchEvent(new Event('dialogHidden')); } else if (msg.method == 'backButton') { this.dispatchEvent(new CustomEvent('backButton', {detail: msg.show})); } else if (msg.method == 'showView') { this.dispatchEvent(new Event('showView')); } else if (msg.method == 'menuItemClicked') { this.dispatchEvent( new CustomEvent('menuItemClicked', {detail: msg.item})); } else if (msg.method == 'identifierEntered') { this.dispatchEvent(new CustomEvent( 'identifierEntered', {detail: {accountIdentifier: msg.accountIdentifier}})); } else if (msg.method == 'userInfo') { this.services_ = msg.services; if (this.email_ && this.gaiaId_ && this.sessionIndex_) { this.maybeCompleteAuth_(); } } else { console.warn('Unrecognized message from GAIA: ' + msg.method); } } /** * Invoked by the hosting page to verify the Saml password. */ verifyConfirmedPassword(password) { if (!this.samlHandler_.verifyConfirmedPassword(password)) { // Invoke confirm password callback asynchronously because the // verification was based on messages and caller (GaiaSigninScreen) // does not expect it to be called immediately. // TODO(xiyuan): Change to synchronous call when iframe based code // is removed. const invokeConfirmPassword = (function() { this.confirmPasswordCallback( this.email_, this.samlHandler_.scrapedPasswordCount); }).bind(this); window.setTimeout(invokeConfirmPassword, 0); return; } this.password_ = password; this.onAuthCompleted_(); } /** * Check Saml flow and start password confirmation flow if needed. * Otherwise, continue with auto completion. * @private */ maybeCompleteAuth_() { const missingGaiaInfo = !this.email_ || !this.gaiaId_ || !this.sessionIndex_; if (missingGaiaInfo && !this.skipForNow_) { if (this.missingGaiaInfoCallback) { this.missingGaiaInfoCallback(); } this.webview_.src = this.initialFrameUrl_; return; } // TODO(https://crbug.com/837107): remove this once API is fully // stabilized. // @example.com is used in tests. if (!this.services_ && !this.email_.endsWith('@gmail.com') && !this.email_.endsWith('@example.com')) { console.warn('Forcing empty services.'); this.services_ = []; } if (!this.services_) { return; } if (this.isSamlUserPasswordless_ === null && this.authFlow == AuthFlow.SAML && this.email_ && this.gaiaId_ && this.getIsSamlUserPasswordlessCallback) { // Start a request to obtain the |isSamlUserPasswordless_| value for the // current user. Once the response arrives, maybeCompleteAuth_() will be // called again. this.getIsSamlUserPasswordlessCallback( this.email_, this.gaiaId_, this.onGotIsSamlUserPasswordless_.bind( this, this.email_, this.gaiaId_)); return; } if (this.isSamlUserPasswordless_ && this.authFlow == AuthFlow.SAML && this.email_ && this.gaiaId_) { // No password needed for this user, so complete immediately. this.onAuthCompleted_(); return; } if (this.samlHandler_.samlApiUsed) { if (this.samlApiUsedCallback) { this.samlApiUsedCallback(); } this.password_ = this.samlHandler_.apiPasswordBytes; this.onAuthCompleted_(); return; } if (this.samlHandler_.scrapedPasswordCount == 0) { if (this.noPasswordCallback) { this.noPasswordCallback(this.email_); return; } // Fall through to finish the auth flow even if this.needPassword // is true. This is because the flag is used as an intention to get // password when it is available but not a mandatory requirement. console.warn('Authenticator: No password scraped for SAML.'); } else if (this.needPassword) { if (this.samlHandler_.scrapedPasswordCount == 1) { // If we scraped exactly one password, we complete the authentication // right away. this.password_ = this.samlHandler_.firstScrapedPassword; this.onAuthCompleted_(); return; } if (this.confirmPasswordCallback) { // Confirm scraped password. The flow follows in // verifyConfirmedPassword. this.confirmPasswordCallback( this.email_, this.samlHandler_.scrapedPasswordCount); return; } } this.onAuthCompleted_(); } /** * Invoked to complete the authentication using the password the user enters * manually for non-principals API SAML IdPs that we couldn't scrape their * password input. */ completeAuthWithManualPassword(password) { this.password_ = password; this.onAuthCompleted_(); } /** * Invoked when the result of |getIsSamlUserPasswordlessCallback| arrives. * @param {string} email * @param {string} gaiaId * @param {boolean} isSamlUserPasswordless * @private */ onGotIsSamlUserPasswordless_(email, gaiaId, isSamlUserPasswordless) { // Compare the request's user identifier with the currently set one, in // order to ignore responses to old requests. if (this.email_ && this.email_ == email && this.gaiaId_ && this.gaiaId_ == gaiaId) { this.isSamlUserPasswordless_ = isSamlUserPasswordless; this.maybeCompleteAuth_(); } } /** * Invoked to process authentication completion. * @private */ onAuthCompleted_() { assert( this.skipForNow_ || (this.email_ && this.gaiaId_ && this.sessionIndex_)); // Chrome will crash on incorrect data type, so log some error message // here. if (this.services_) { if (!Array.isArray(this.services_)) { console.error('FATAL: Bad services type:' + typeof this.services_); } else { for (let i = 0; i < this.services_.length; ++i) { if (typeof this.services_[i] == 'string') { continue; } console.error( 'FATAL: Bad services[' + i + '] type:' + typeof this.services_[i]); } } } if (this.isSamlUserPasswordless_ && this.authFlow == AuthFlow.SAML && this.email_) { // In the passwordless case, the user data will be protected by non // password based mechanisms. Clear anything that got collected into // |password_|, if any. this.password_ = ''; } this.dispatchEvent(new CustomEvent( 'authCompleted', // TODO(rsorokin): get rid of the stub values. { detail: { email: this.email_ || '', gaiaId: this.gaiaId_ || '', password: this.password_ || '', usingSAML: this.authFlow == AuthFlow.SAML, chooseWhatToSync: this.chooseWhatToSync_, skipForNow: this.skipForNow_, sessionIndex: this.sessionIndex_ || '', trusted: this.trusted_, services: this.services_ || [], } })); this.resetStates(); } /** * Invoked when |samlHandler_| fires 'insecureContentBlocked' event. * @private */ onInsecureContentBlocked_(e) { if (!this.isLoaded_) { return; } if (this.insecureContentBlockedCallback) { this.insecureContentBlockedCallback(e.detail.url); } else { console.error('Authenticator: Insecure content blocked.'); } } /** * Invoked when |samlHandler_| fires 'authPageLoaded' event. * @private */ onAuthPageLoaded_(e) { if (!this.isLoaded_) { return; } if (!e.detail.isSAMLPage) { return; } this.authDomain = this.samlHandler_.authDomain; this.authFlow = AuthFlow.SAML; this.webview_.focus(); this.fireReadyEvent_(); } /** * Invoked when |samlHandler_| fires 'videoEnabled' event. * @private */ onVideoEnabled_(e) { this.videoEnabled = true; } /** * Invoked when |samlHandler_| fires 'apiPasswordAdded' event. * @private */ onSamlApiPasswordAdded_(e) { // Saml API 'add' password might be received after the 'loadcommit' event. // In such case, maybeCompleteAuth_ should be attempted again if GAIA ID // is available. if (this.gaiaId_) { this.maybeCompleteAuth_(); } } /** * Invoked when a link is dropped on the webview. * @private */ onDropLink_(e) { this.dispatchEvent(new CustomEvent('dropLink', {detail: e.url})); } /** * Invoked when the webview attempts to open a new window. * @private */ onNewWindow_(e) { this.dispatchEvent(new CustomEvent('newWindow', {detail: e})); } /** * Invoked when a new document is loaded. * @private */ onContentLoad_(e) { if (this.isConstrainedWindow_) { // Signin content in constrained windows should not zoom. Isolate the // webview from the zooming of other webviews using the 'per-view' zoom // mode, and then set it to 100% zoom. this.webview_.setZoomMode('per-view'); this.webview_.setZoom(1); } // Posts a message to IdP pages to initiate communication. const currentUrl = this.webview_.src; if (currentUrl.lastIndexOf(this.idpOrigin_) == 0) { const msg = { 'method': 'handshake', }; // |this.webview_.contentWindow| may be null after network error screen // is shown. See crbug.com/770999. if (this.webview_.contentWindow) { this.webview_.contentWindow.postMessage(msg, currentUrl); } else { console.error('Authenticator: contentWindow is null.'); } if (this.authMode == AuthMode.DEFAULT) { chrome.send('metricsHandler:recordBooleanHistogram', [ 'ChromeOS.GAIA.AuthenticatorContentWindowNull', !this.webview_.contentWindow ]); } this.fireReadyEvent_(); // Focus webview after dispatching event when webview is already // visible. this.webview_.focus(); } else if (currentUrl == BLANK_PAGE_URL) { this.fireReadyEvent_(); } } /** * Invoked when the webview fails loading a page. * @private */ onLoadAbort_(e) { this.dispatchEvent(new CustomEvent( 'loadAbort', {detail: {error: e.reason, src: e.url}})); } /** * Invoked when the webview navigates withing the current document. * @private */ onLoadCommit_(e) { if (this.gaiaId_) { this.maybeCompleteAuth_(); } } /** * Returns |true| if event |e| was sent from the hosted webview. * @private */ isWebviewEvent_(e) { // Note: prints error message to console if |contentWindow| is // not defined. // TODO(dzhioev): remove the message. http://crbug.com/469522 const webviewWindow = this.webview_.contentWindow; return !!webviewWindow && webviewWindow === e.source; } } /** * The current auth flow of the hosted auth page. * @type {AuthFlow} */ cr.defineProperty(Authenticator, 'authFlow'); /** * The domain name of the current auth page. * @type {string} */ cr.defineProperty(Authenticator, 'authDomain'); /** * True if the page has requested media access. * @type {boolean} */ cr.defineProperty(Authenticator, 'videoEnabled'); Authenticator.AuthFlow = AuthFlow; Authenticator.AuthMode = AuthMode; Authenticator.SUPPORTED_PARAMS = SUPPORTED_PARAMS; return { // TODO(guohui, xiyuan): Rename GaiaAuthHost to Authenticator once the old // iframe-based flow is deprecated. GaiaAuthHost: Authenticator, Authenticator: Authenticator }; }); /* Copyright (c) 2012 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ * { box-sizing: border-box; } html { height: 100%; } body { color: rgb(48, 57, 66); display: flex; flex-direction: column; font-size: 13px; height: 100%; margin: 0; overflow: auto; } .hidden { display: none !important; } img { flex-shrink: 0; height: 16px; padding-left: 2px; padding-right: 5px; vertical-align: top; width: 23px; } #container { display: flex; height: 100% } #infobar { background: rgb(255, 212, 0); display: none; padding: 4px 0; text-align: center; } #infobar.show { display: block; } #navigation { flex-shrink: 0; padding-top: 20px; width: 150px; } #content { flex-grow: 1; } #caption { color: rgb(92, 97, 102); font-size: 150%; padding-bottom: 10px; padding-left: 20px; } #serviceworker-internals { visibility: hidden; } .tab-header { border-inline-start: 6px solid transparent; padding-left: 15px; } .tab-header.selected { border-inline-start-color: rgb(78, 87, 100); } .tab-header > button { background-color: white; border: 0; cursor: pointer; font: inherit; line-height: 17px; margin: 6px 0; padding: 0 2px; } .tab-header:not(.selected) > button { color: #999; } #content > div { min-width: 32em; padding: 0 20px 65px 0; } #content > div:not(.selected) { display: none; } .content-header { background: linear-gradient(white, white 40%, rgba(255, 255, 255, 0.92)); border-bottom: 1px solid #eee; font-size: 150%; padding: 20px 0 10px 0; z-index: 1; } #devices-help { margin-top: 10px; } .device-header { -webkit-box-align: baseline; -webkit-box-orient: horizontal; display: -webkit-box; margin: 10px 0 0; padding: 2px 0; } .device-name { font-size: 150%; } .device-serial { color: #999; font-size: 80%; margin-left: 6px; } .device-ports { -webkit-box-orient: horizontal; display: -webkit-box; margin-left: 8px; } .port-icon { background-color: rgb(64, 192, 64); border: 0 solid transparent; border-radius: 6px; height: 12px; margin: 2px; width: 12px; } .port-icon.error { background-color: rgb(224, 32, 32); } .port-icon.transient { background-color: orange; transform: scale(1.2); } .port-number { height: 16px; margin-right: 5px; } .browser-header { align-items: center; display: flex; flex-flow: row wrap; min-height: 33px; padding-top: 10px; } .browser-header > .browser-name { font-size: 110%; font-weight: bold; } .browser-header > .browser-user { color: #999; margin-left: 6px; } .browser-fallback-note { display: flex; flex-flow: row wrap; margin-left: 4px; margin-top: 5px; min-height: 15px; } .used-for-port-forwarding { background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxOHB4IiBoZWlnaHQ9IjE4cHgiIHZpZXdCb3g9IjAgMCA0OCA0OCIgZmlsbD0iIzVGNjM2OCI+CiAgICA8cGF0aCBkPSJNMCAwaDQ4djQ4SDB6IiBmaWxsPSJub25lIi8+CiAgICA8cGF0aCBkPSJNMjQgNEMxMi45NSA0IDQgMTIuOTUgNCAyNHM4Ljk1IDIwIDIwIDIwIDIwLTguOTUgMjAtMjBTMzUuMDUgNCAyNCA0em0yIDMwaC00VjIyaDR2MTJ6bTAtMTZoLTR2LTRoNHY0eiIvPgo8L3N2Zz4K); height: 15px; margin-left: 20px; width: 15px; } .row { padding: 6px 0; position: relative; } .properties-box { display: flex; } .subrow-box { display: inline-block; vertical-align: top; } .subrow { display: flex; flex-flow: row wrap; } .subrow > div { margin-right: 0.5em; } .webview-thumbnail { display: inline-block; flex-shrink: 0; margin-right: 5px; overflow: hidden; position: relative; vertical-align: top; } .screen-rect { background-color: #eee; position: absolute; } .view-rect { background-color: #ccc; min-height: 1px; min-width: 1px; position: absolute; } .view-rect.hidden { background-color: #ddd; } .guest { padding-left: 20px; } .invisible-view { color: rgb(151, 156, 160); } .url { color: #999; } .list { margin-top: 5px; } .action { color: rgb(17, 85, 204); cursor: pointer; margin-right: 15px; } .action:hover { text-decoration: underline; } .browser-header .action { margin-left: 10px; } .list:not(.pages) .subrow { min-height: 19px; } .action.disabled { opacity: 0.5; pointer-events: none; } .open > input { border: 1px solid #aaa; height: 17px; line-height: 17px; margin-left: 20px; padding: 0 2px; } .open > input:focus { border-color: rgb(77, 144, 254); outline: none; transition: border-color 200ms; } .open > button { line-height: 13px; } #device-settings { border-bottom: 1px solid #eee; padding: 5px 0; } .settings-bar { padding: 5px 0 5px 0; } .settings-bar label { display: inline-block; width: 35ex; } .node-frontend-action { margin: 6px 4px; } dialog.config::backdrop { background-color: rgba(255, 255, 255, 0.75); } dialog.config { background: white; border: 0; border-radius: 3px; box-shadow: 0 4px 23px 5px rgba(0, 0, 0, 0.2), 0 2px 6px rgba(0,0,0,0.15); color: #333; padding: 17px 17px 12px; position: relative; } #port-forwarding-enable { vertical-align: middle; } .close-button { background-image: url(chrome://theme/IDR_CLOSE_DIALOG); height: 14px; width: 14px; } .close-button:active { background-image: url(chrome://theme/IDR_CLOSE_DIALOG_P); } .close-button:hover { background-image: url(chrome://theme/IDR_CLOSE_DIALOG_H); } dialog.config > .close-button { position: absolute; right: 7px; top: 7px; } dialog.config > .title { font-size: 130%; } dialog.config > .list { border: 1px solid #eee; height: 180px; margin-bottom: 10px; margin-top: 10px; overflow-x: hidden; } .config-list-row { -webkit-flex-direction: row; display: -webkit-flex; } .config-list-row:hover { background-color: #eee; } .config-list-row.selected, .config-list-row.selected:hover { background-color: #ccc; } .config-list-row input { border: 1px solid transparent; line-height: 20px; margin: 4px; min-width: 0; padding: 0 3px; } .config-list-row.fresh:not(.selected) input { border-color: #eee; } .config-list-row input.port { width: 4em; } .config-list-row input.location { -webkit-flex: 1; width: 100%; } .config-list-row:not(.empty) input.invalid { background-color: rgb(255, 200, 200); } .config-list-row .close-button { margin: 8px 8px; } .config-list-row.fresh .close-button, .config-list-row:not(.selected):not(:hover) .close-button:not(:hover) { background-image: none; pointer-events: none; } .config-list-row:not(.selected) .close-button:not(:hover) { opacity: 0.5; } dialog.config > .message { margin-bottom: 12px; width: 20em; } .config-buttons { align-items: center; display: flex; } dialog.port-forwarding .target-discovery { display: none; } dialog.target-discovery .port-forwarding { display: none; } .config-buttons > label { flex-grow: 1 } Inspect with Chrome Developer Tools
Port forwarding is active. Closing this page terminates it.
Port forwarding settings
Target discovery settings
Define the listening port on your device that maps to a port accessible from your development machine. Learn more
Specify hosts and ports of the target discovery servers.
// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. const MIN_VERSION_TAB_CLOSE = 25; const MIN_VERSION_TARGET_ID = 26; const MIN_VERSION_NEW_TAB = 29; const MIN_VERSION_TAB_ACTIVATE = 30; const WEBRTC_SERIAL = 'WEBRTC'; let HOST_CHROME_VERSION; const queryParamsObject = {}; let browserInspector; let browserInspectorTitle; (function() { const chromeMatch = navigator.userAgent.match(/(?:^|\W)Chrome\/(\S+)/); if (chromeMatch && chromeMatch.length > 1) { HOST_CHROME_VERSION = chromeMatch[1].split('.').map(s => Number(s) || 0); } const queryParams = window.location.search; if (!queryParams) { return; } const params = queryParams.substring(1).split('&'); for (let i = 0; i < params.length; ++i) { const pair = params[i].split('='); queryParamsObject[pair[0]] = pair[1]; } if ('trace' in queryParamsObject || 'tracing' in queryParamsObject) { browserInspector = 'chrome://tracing'; browserInspectorTitle = 'trace'; } else { browserInspector = queryParamsObject['browser-inspector']; browserInspectorTitle = 'inspect'; } })(); function isVersionNewerThanHost(version) { if (!HOST_CHROME_VERSION) { return false; } version = version.split('.').map(s => Number(s) || 0); for (let i = 0; i < HOST_CHROME_VERSION.length; i++) { if (i > version.length) { return false; } if (HOST_CHROME_VERSION[i] > version[i]) { return false; } if (HOST_CHROME_VERSION[i] < version[i]) { return true; } } return false; } function sendCommand(command, args) { chrome.send(command, Array.prototype.slice.call(arguments, 1)); } function sendTargetCommand(command, target) { sendCommand(command, target.source, target.id); } function removeChildren(element_id) { const element = $(element_id); element.textContent = ''; } function removeAdditionalChildren(element_id) { const element = $(element_id); const elements = element.querySelectorAll('.row.additional'); for (let i = 0; i != elements.length; i++) { element.removeChild(elements[i]); } } function removeChildrenExceptAdditional(element_id) { const element = $(element_id); const elements = element.querySelectorAll('.row:not(.additional)'); for (let i = 0; i != elements.length; i++) { element.removeChild(elements[i]); } } function onload() { const tabContents = document.querySelectorAll('#content > div'); for (let i = 0; i != tabContents.length; i++) { const tabContent = tabContents[i]; const tabName = tabContent.querySelector('.content-header').textContent; const tabHeader = document.createElement('div'); tabHeader.className = 'tab-header'; const button = document.createElement('button'); button.textContent = tabName; tabHeader.appendChild(button); tabHeader.addEventListener('click', selectTab.bind(null, tabContent.id)); $('navigation').appendChild(tabHeader); } onHashChange(); initSettings(); sendCommand('init-ui'); } function onHashChange() { const hash = window.location.hash.slice(1).toLowerCase(); if (!selectTab(hash)) { selectTab('devices'); } } /** * @param {string} id Tab id. * @return {boolean} True if successful. */ function selectTab(id) { const tabContents = document.querySelectorAll('#content > div'); const tabHeaders = $('navigation').querySelectorAll('.tab-header'); let found = false; for (let i = 0; i != tabContents.length; i++) { const tabContent = tabContents[i]; const tabHeader = tabHeaders[i]; if (tabContent.id == id) { tabContent.classList.add('selected'); tabHeader.classList.add('selected'); found = true; } else { tabContent.classList.remove('selected'); tabHeader.classList.remove('selected'); } } if (!found) { return false; } window.location.hash = id; return true; } function populateTargets(source, data) { if (source == 'local') { populateLocalTargets(data); } else if (source == 'remote') { populateRemoteTargets(data); } else { console.error('Unknown source type: ' + source); } } function populateAdditionalTargets(data) { removeAdditionalChildren('others-list'); for (let i = 0; i < data.length; i++) { addAdditionalTargetsToOthersList(data[i]); } } function populateLocalTargets(data) { removeChildren('pages-list'); removeChildren('extensions-list'); removeChildren('apps-list'); removeChildren('workers-list'); removeChildren('service-workers-list'); removeChildrenExceptAdditional('others-list'); for (let i = 0; i < data.length; i++) { if (data[i].type === 'page') { addToPagesList(data[i]); } else if (data[i].type === 'background_page') { addToExtensionsList(data[i]); } else if (data[i].type === 'app') { addToAppsList(data[i]); } else if (data[i].type === 'shared_worker') { addToWorkersList(data[i]); } else if (data[i].type === 'service_worker') { addToServiceWorkersList(data[i]); } else { addToOthersList(data[i]); } } } function showIncognitoWarning() { $('devices-incognito').hidden = false; } function alreadyDisplayed(element, data) { const json = JSON.stringify(data); if (element.cachedJSON == json) { return true; } element.cachedJSON = json; return false; } function updateBrowserVisibility(browserSection) { const icon = browserSection.querySelector('.used-for-port-forwarding'); browserSection.hidden = !browserSection.querySelector('.open') && !browserSection.querySelector('.row') && !browserInspector && (!icon || icon.hidden); } function updateUsernameVisibility(deviceSection) { const users = new Set(); const browsers = deviceSection.querySelectorAll('.browser'); Array.prototype.forEach.call(browsers, function(browserSection) { if (!browserSection.hidden) { const browserUser = browserSection.querySelector('.browser-user'); if (browserUser) { users.add(browserUser.textContent); } } }); const hasSingleUser = users.size <= 1; Array.prototype.forEach.call(browsers, function(browserSection) { const browserUser = browserSection.querySelector('.browser-user'); if (browserUser) { browserUser.hidden = hasSingleUser; } }); } function populateRemoteTargets(devices) { if (!devices) { return; } if ($('config-dialog').open) { window.holdDevices = devices; return; } function browserCompare(a, b) { if (a.adbBrowserName != b.adbBrowserName) { return a.adbBrowserName < b.adbBrowserName; } if (a.adbBrowserVersion != b.adbBrowserVersion) { return a.adbBrowserVersion < b.adbBrowserVersion; } return a.id < b.id; } function insertBrowser(browserList, browser) { for (let sibling = browserList.firstElementChild; sibling; sibling = sibling.nextElementSibling) { if (browserCompare(browser, sibling)) { browserList.insertBefore(browser, sibling); return; } } browserList.appendChild(browser); } const deviceList = $('devices-list'); if (alreadyDisplayed(deviceList, devices)) { return; } function removeObsolete(validIds, section) { if (validIds.indexOf(section.id) < 0) { section.remove(); } } const newDeviceIds = devices.map(function(d) { return d.id; }); Array.prototype.forEach.call( deviceList.querySelectorAll('.device'), removeObsolete.bind(null, newDeviceIds)); $('devices-help').hidden = !!devices.length; for (let d = 0; d < devices.length; d++) { const device = devices[d]; let deviceSection = $(device.id); if (!deviceSection) { deviceSection = document.createElement('div'); deviceSection.id = device.id; deviceSection.className = 'device'; deviceList.appendChild(deviceSection); const deviceHeader = document.createElement('div'); deviceHeader.className = 'device-header'; deviceSection.appendChild(deviceHeader); const deviceName = document.createElement('div'); deviceName.className = 'device-name'; deviceHeader.appendChild(deviceName); const deviceSerial = document.createElement('div'); deviceSerial.className = 'device-serial'; const serial = device.adbSerial.toUpperCase(); deviceSerial.textContent = '#' + serial; deviceHeader.appendChild(deviceSerial); if (serial === WEBRTC_SERIAL) { deviceHeader.classList.add('hidden'); } const devicePorts = document.createElement('div'); devicePorts.className = 'device-ports'; deviceHeader.appendChild(devicePorts); const browserList = document.createElement('div'); browserList.className = 'browsers'; deviceSection.appendChild(browserList); const authenticating = document.createElement('div'); authenticating.className = 'device-auth'; deviceSection.appendChild(authenticating); } if (alreadyDisplayed(deviceSection, device)) { continue; } deviceSection.querySelector('.device-name').textContent = device.adbModel; deviceSection.querySelector('.device-auth').textContent = device.adbConnected ? '' : 'Pending authentication: please accept ' + 'debugging session on the device.'; const browserList = deviceSection.querySelector('.browsers'); const newBrowserIds = device.browsers.map(function(b) { return b.id; }); Array.prototype.forEach.call( browserList.querySelectorAll('.browser'), removeObsolete.bind(null, newBrowserIds)); for (let b = 0; b < device.browsers.length; b++) { const browser = device.browsers[b]; const majorChromeVersion = browser.adbBrowserChromeVersion; let pageList; let browserSection = $(browser.id); const browserNeedsFallback = isVersionNewerThanHost(browser.adbBrowserVersion); if (browserSection) { pageList = browserSection.querySelector('.pages'); } else { browserSection = document.createElement('div'); browserSection.id = browser.id; browserSection.className = 'browser'; insertBrowser(browserList, browserSection); const browserHeader = document.createElement('div'); browserHeader.className = 'browser-header'; const browserName = document.createElement('div'); browserName.className = 'browser-name'; browserHeader.appendChild(browserName); browserName.textContent = browser.adbBrowserName; if (browser.adbBrowserVersion) { browserName.textContent += ' (' + browser.adbBrowserVersion + ')'; } if (browser.adbBrowserUser) { const browserUser = document.createElement('div'); browserUser.className = 'browser-user'; browserUser.textContent = browser.adbBrowserUser; browserHeader.appendChild(browserUser); } browserSection.appendChild(browserHeader); if (browserNeedsFallback) { const browserFallbackNote = document.createElement('div'); browserFallbackNote.className = 'browser-fallback-note'; browserFallbackNote.textContent = '\u26A0 Remote browser is newer than client browser. ' + 'Try `inspect fallback` if inspection fails.'; browserSection.appendChild(browserFallbackNote); } if (majorChromeVersion >= MIN_VERSION_NEW_TAB) { const newPage = document.createElement('div'); newPage.className = 'open'; const newPageUrl = document.createElement('input'); newPageUrl.type = 'text'; newPageUrl.placeholder = 'Open tab with url'; newPage.appendChild(newPageUrl); const openHandler = function(sourceId, browserId, input) { sendCommand( 'open', sourceId, browserId, input.value || 'about:blank'); input.value = ''; }.bind(null, browser.source, browser.id, newPageUrl); newPageUrl.addEventListener('keyup', function(handler, event) { if (event.key == 'Enter' && event.target.value) { handler(); } }.bind(null, openHandler), true); const newPageButton = document.createElement('button'); newPageButton.textContent = 'Open'; newPage.appendChild(newPageButton); newPageButton.addEventListener('click', openHandler, true); browserHeader.appendChild(newPage); } const portForwardingInfo = document.createElement('div'); portForwardingInfo.className = 'used-for-port-forwarding'; portForwardingInfo.hidden = true; portForwardingInfo.title = 'This browser is used for port ' + 'forwarding. Closing it will drop current connections.'; browserHeader.appendChild(portForwardingInfo); if (browserInspector) { const link = document.createElement('span'); link.classList.add('action'); link.setAttribute('tabindex', 1); link.textContent = browserInspectorTitle; browserHeader.appendChild(link); link.addEventListener( 'click', sendCommand.bind( null, 'inspect-browser', browser.source, browser.id, browserInspector), false); } pageList = document.createElement('div'); pageList.className = 'list pages'; browserSection.appendChild(pageList); } if (!alreadyDisplayed(browserSection, browser)) { pageList.textContent = ''; for (let p = 0; p < browser.pages.length; p++) { const page = browser.pages[p]; // Attached targets have no unique id until Chrome 26. For such // targets it is impossible to activate existing DevTools window. page.hasNoUniqueId = page.attached && majorChromeVersion && majorChromeVersion < MIN_VERSION_TARGET_ID; const row = addTargetToList(page, pageList, ['name', 'url']); if (page['description']) { addWebViewDetails(row, page); } else { addFavicon(row, page); } if (majorChromeVersion >= MIN_VERSION_TAB_ACTIVATE) { addActionLink( row, 'focus tab', sendTargetCommand.bind(null, 'activate', page), false); } if (majorChromeVersion) { addActionLink( row, 'reload', sendTargetCommand.bind(null, 'reload', page), page.attached); } if (majorChromeVersion >= MIN_VERSION_TAB_CLOSE) { addActionLink( row, 'close', sendTargetCommand.bind(null, 'close', page), false); } if (browserNeedsFallback) { addActionLink( row, 'inspect fallback', sendTargetCommand.bind(null, 'inspect-fallback', page), page.hasNoUniqueId || page.adbAttachedForeign); } } } updateBrowserVisibility(browserSection); } updateUsernameVisibility(deviceSection); } } function addToPagesList(data) { const row = addTargetToList(data, $('pages-list'), ['name', 'url']); addFavicon(row, data); if (data.guests) { addGuestViews(row, data.guests); } } function addToExtensionsList(data) { const row = addTargetToList(data, $('extensions-list'), ['name', 'url']); addFavicon(row, data); if (data.guests) { addGuestViews(row, data.guests); } } function addToAppsList(data) { const row = addTargetToList(data, $('apps-list'), ['name', 'url']); addFavicon(row, data); if (data.guests) { addGuestViews(row, data.guests); } } function addGuestViews(row, guests) { Array.prototype.forEach.call(guests, function(guest) { const guestRow = addTargetToList(guest, row, ['name', 'url']); guestRow.classList.add('guest'); addFavicon(guestRow, guest); }); } function addToWorkersList(data) { const row = addTargetToList(data, $('workers-list'), ['name', 'description', 'url']); addActionLink( row, 'terminate', sendTargetCommand.bind(null, 'close', data), false); } function addToServiceWorkersList(data) { const row = addTargetToList( data, $('service-workers-list'), ['name', 'description', 'url']); addActionLink( row, 'terminate', sendTargetCommand.bind(null, 'close', data), false); } function addToOthersList(data) { addTargetToList(data, $('others-list'), ['url']); } function addAdditionalTargetsToOthersList(data) { addTargetToList(data, $('others-list'), ['name', 'url']); } function formatValue(data, property) { let value = data[property]; if (property == 'name' && value == '') { value = 'untitled'; } let text = value ? String(value) : ''; if (text.length > 100) { text = text.substring(0, 100) + '\u2026'; } const div = document.createElement('div'); div.textContent = text; div.className = property; return div; } function addFavicon(row, data) { const favicon = document.createElement('img'); if (data['faviconUrl']) { favicon.src = data['faviconUrl']; } const propertiesBox = row.querySelector('.properties-box'); propertiesBox.insertBefore(favicon, propertiesBox.firstChild); } function addWebViewDetails(row, data) { let webview; try { webview = JSON.parse(data['description']); } catch (e) { return; } addWebViewDescription(row, webview); if (data.adbScreenWidth && data.adbScreenHeight) { addWebViewThumbnail( row, webview, data.adbScreenWidth, data.adbScreenHeight); } } function addWebViewDescription(row, webview) { const viewStatus = {visibility: '', position: '', size: ''}; if (!webview.empty) { if (webview.attached && !webview.visible) { viewStatus.visibility = 'hidden'; } else if (!webview.attached) { viewStatus.visibility = 'detached'; } viewStatus.size = 'size ' + webview.width + ' \u00d7 ' + webview.height; } else { viewStatus.visibility = 'empty'; } if (webview.attached) { viewStatus.position = 'at (' + webview.screenX + ', ' + webview.screenY + ')'; } const subRow = document.createElement('div'); subRow.className = 'subrow webview'; if (webview.empty || !webview.attached || !webview.visible) { subRow.className += ' invisible-view'; } if (viewStatus.visibility) { subRow.appendChild(formatValue(viewStatus, 'visibility')); } if (viewStatus.position) { subRow.appendChild(formatValue(viewStatus, 'position')); } subRow.appendChild(formatValue(viewStatus, 'size')); const subrowBox = row.querySelector('.subrow-box'); subrowBox.insertBefore(subRow, row.querySelector('.actions')); } function addWebViewThumbnail(row, webview, screenWidth, screenHeight) { const maxScreenRectSize = 50; let screenRectWidth; let screenRectHeight; const aspectRatio = screenWidth / screenHeight; if (aspectRatio < 1) { screenRectWidth = Math.round(maxScreenRectSize * aspectRatio); screenRectHeight = maxScreenRectSize; } else { screenRectWidth = maxScreenRectSize; screenRectHeight = Math.round(maxScreenRectSize / aspectRatio); } const thumbnail = document.createElement('div'); thumbnail.className = 'webview-thumbnail'; const thumbnailWidth = 3 * screenRectWidth; const thumbnailHeight = 60; thumbnail.style.width = thumbnailWidth + 'px'; thumbnail.style.height = thumbnailHeight + 'px'; const screenRect = document.createElement('div'); screenRect.className = 'screen-rect'; screenRect.style.left = screenRectWidth + 'px'; screenRect.style.top = (thumbnailHeight - screenRectHeight) / 2 + 'px'; screenRect.style.width = screenRectWidth + 'px'; screenRect.style.height = screenRectHeight + 'px'; thumbnail.appendChild(screenRect); if (!webview.empty && webview.attached) { const viewRect = document.createElement('div'); viewRect.className = 'view-rect'; if (!webview.visible) { viewRect.classList.add('hidden'); } function percent(ratio) { return ratio * 100 + '%'; } viewRect.style.left = percent(webview.screenX / screenWidth); viewRect.style.top = percent(webview.screenY / screenHeight); viewRect.style.width = percent(webview.width / screenWidth); viewRect.style.height = percent(webview.height / screenHeight); screenRect.appendChild(viewRect); } const propertiesBox = row.querySelector('.properties-box'); propertiesBox.insertBefore(thumbnail, propertiesBox.firstChild); } function addTargetToList(data, list, properties) { const row = document.createElement('div'); row.className = 'row'; row.targetId = data.id; const propertiesBox = document.createElement('div'); propertiesBox.className = 'properties-box'; row.appendChild(propertiesBox); const subrowBox = document.createElement('div'); subrowBox.className = 'subrow-box'; propertiesBox.appendChild(subrowBox); const subrow = document.createElement('div'); subrow.className = 'subrow'; subrowBox.appendChild(subrow); for (let j = 0; j < properties.length; j++) { subrow.appendChild(formatValue(data, properties[j])); } const actionBox = document.createElement('div'); actionBox.className = 'actions'; subrowBox.appendChild(actionBox); if (data.isAdditional) { addActionLink( row, 'inspect', sendCommand.bind(null, 'inspect-additional', data.url), false); row.classList.add('additional'); } else if (!data.hasCustomInspectAction && data.type !== 'iframe') { addActionLink( row, 'inspect', sendTargetCommand.bind(null, 'inspect', data), data.hasNoUniqueId || data.adbAttachedForeign); if (data.type === 'page') { addActionLink( row, 'pause', sendTargetCommand.bind(null, 'pause', data), data.hasNoUniqueId || data.adbAttachedForeign); } } list.appendChild(row); return row; } function addActionLink(row, text, handler, opt_disabled) { const link = document.createElement('span'); link.classList.add('action'); link.setAttribute('tabindex', 1); if (opt_disabled) { link.classList.add('disabled'); } else { link.classList.remove('disabled'); } link.textContent = text; link.addEventListener('click', handler, true); function handleKey(e) { if (e.key == 'Enter' || e.key == ' ') { e.preventDefault(); handler(); } } link.addEventListener('keydown', handleKey, true); row.querySelector('.actions').appendChild(link); } function initSettings() { checkboxSendsCommand( 'discover-usb-devices-enable', 'set-discover-usb-devices-enabled'); checkboxSendsCommand('port-forwarding-enable', 'set-port-forwarding-enabled'); checkboxSendsCommand( 'discover-tcp-devices-enable', 'set-discover-tcp-targets-enabled'); $('port-forwarding-config-open') .addEventListener('click', openPortForwardingConfig); $('tcp-discovery-config-open').addEventListener('click', openTargetsConfig); $('config-dialog-close').addEventListener('click', function() { $('config-dialog').commit(true); }); $('node-frontend') .addEventListener('click', sendCommand.bind(null, 'open-node-frontend')); } function checkboxHandler(command, event) { sendCommand(command, event.target.checked); } function checkboxSendsCommand(id, command) { $(id).addEventListener('change', checkboxHandler.bind(null, command)); } function handleKey(event) { switch (event.keyCode) { case 13: // Enter const dialog = $('config-dialog'); if (event.target.nodeName == 'INPUT') { const line = event.target.parentNode; if (!line.classList.contains('fresh') || line.classList.contains('empty')) { dialog.commit(true); } else { commitFreshLineIfValid(true /* select new line */); dialog.commit(false); } } else { dialog.commit(true); } break; } } function commitDialog(commitHandler, shouldClose) { const element = $('config-dialog'); if (element.open && shouldClose) { element.onclose = null; element.close(); document.removeEventListener('keyup', handleKey); if (window.holdDevices) { populateRemoteTargets(window.holdDevices); delete window.holdDevices; } } commitFreshLineIfValid(); commitHandler(); } function openConfigDialog(dialogClass, commitHandler, lineFactory, data) { const dialog = $('config-dialog'); if (dialog.open) { return; } dialog.className = dialogClass; dialog.classList.add('config'); document.addEventListener('keyup', handleKey); dialog.commit = commitDialog.bind(null, commitHandler); dialog.onclose = commitDialog.bind(null, commitHandler, true); $('button-done').onclick = dialog.onclose; const list = $('config-dialog').querySelector('.list'); list.textContent = ''; list.createRow = appendRow.bind(null, list, lineFactory); for (const key in data) { list.createRow(key, data[key]); } list.createRow(null, null); dialog.showModal(); const defaultFocus = dialog.querySelector('.fresh .preselected'); if (defaultFocus) { defaultFocus.focus(); } else { doneButton.focus(); } } function openPortForwardingConfig() { function createPortForwardingConfigLine(port, location) { const line = document.createElement('div'); line.className = 'port-forwarding-pair config-list-row'; const portInput = createConfigField(port, 'port preselected', 'Port', validatePort); line.appendChild(portInput); const locationInput = createConfigField( location, 'location', 'IP address and port', validateLocation); locationInput.classList.add('primary'); line.appendChild(locationInput); return line; } function commitPortForwardingConfig() { const config = {}; filterList(['.port', '.location'], function(port, location) { config[port] = location; }); sendCommand('set-port-forwarding-config', config); } openConfigDialog( 'port-forwarding', commitPortForwardingConfig, createPortForwardingConfigLine, window.portForwardingConfig); } function openTargetsConfig() { function createTargetDiscoveryConfigLine(index, targetDiscovery) { const line = document.createElement('div'); line.className = 'target-discovery-line config-list-row'; const locationInput = createConfigField( targetDiscovery, 'location preselected', 'IP address and port', validateLocation); locationInput.classList.add('primary'); line.appendChild(locationInput); return line; } function commitTargetDiscoveryConfig() { const entries = []; filterList(['.location'], function(location) { entries.push(location); }); sendCommand('set-tcp-discovery-config', entries); } openConfigDialog( 'target-discovery', commitTargetDiscoveryConfig, createTargetDiscoveryConfigLine, window.targetDiscoveryConfig); } function filterList(fieldSelectors, callback) { const lines = $('config-dialog').querySelectorAll('.config-list-row'); for (let i = 0; i != lines.length; i++) { const line = lines[i]; const values = []; for (const selector of fieldSelectors) { const input = line.querySelector(selector); const value = input.classList.contains('invalid') ? input.lastValidValue : input.value; if (!value) { break; } values.push(value); } if (values.length == fieldSelectors.length) { callback.apply(null, values); } } } function updateCheckbox(id, enabled) { const checkbox = $(id); checkbox.checked = !!enabled; checkbox.disabled = false; } function updateDiscoverUsbDevicesEnabled(enabled) { updateCheckbox('discover-usb-devices-enable', enabled); } function updatePortForwardingEnabled(enabled) { updateCheckbox('port-forwarding-enable', enabled); $('infobar').classList.toggle('show', enabled); $('infobar').scrollIntoView(); } function updatePortForwardingConfig(config) { window.portForwardingConfig = config; $('port-forwarding-config-open').disabled = !config; } function updateTCPDiscoveryEnabled(enabled) { updateCheckbox('discover-tcp-devices-enable', enabled); } function updateTCPDiscoveryConfig(config) { window.targetDiscoveryConfig = config; $('tcp-discovery-config-open').disabled = !config; } function appendRow(list, lineFactory, key, value) { const line = lineFactory(key, value); line.lastElementChild.addEventListener('keydown', function(e) { if (e.key == 'Tab' && !hasKeyModifiers(e) && line.classList.contains('fresh') && !line.classList.contains('empty')) { // Tabbing forward on the fresh line, try create a new empty one. if (commitFreshLineIfValid(true)) { e.preventDefault(); } } }); const lineDelete = document.createElement('div'); lineDelete.className = 'close-button'; lineDelete.addEventListener('click', function() { const newSelection = line.nextElementSibling || line.previousElementSibling; selectLine(newSelection, true); line.parentNode.removeChild(line); $('config-dialog').commit(false); }); line.appendChild(lineDelete); line.addEventListener('click', selectLine.bind(null, line, true)); line.addEventListener('focus', selectLine.bind(null, line, true)); checkEmptyLine(line); if (!key && !value) { line.classList.add('fresh'); } return list.appendChild(line); } function validatePort(input) { const match = input.value.match(/^(\d+)$/); if (!match) { return false; } const port = parseInt(match[1]); if (port < 1024 || 65535 < port) { return false; } const inputs = document.querySelectorAll('input.port:not(.invalid)'); for (let i = 0; i != inputs.length; ++i) { if (inputs[i] == input) { break; } if (parseInt(inputs[i].value) == port) { return false; } } return true; } function validateLocation(input) { const match = input.value.match(/^([a-zA-Z0-9\.\-_]+):(\d+)$/); if (!match) { return false; } const port = parseInt(match[2]); return port <= 65535; } function createConfigField(value, className, hint, validate) { const input = document.createElement('input'); input.className = className; input.type = 'text'; input.placeholder = hint; input.value = value || ''; input.lastValidValue = value || ''; function checkInput() { if (validate(input)) { input.classList.remove('invalid'); } else { input.classList.add('invalid'); } if (input.parentNode) { checkEmptyLine(input.parentNode); } } checkInput(); input.addEventListener('keyup', checkInput); input.addEventListener('focus', function() { selectLine(input.parentNode); }); input.addEventListener('blur', function() { if (validate(input)) { input.lastValidValue = input.value; } }); return input; } function checkEmptyLine(line) { const inputs = line.querySelectorAll('input'); let empty = true; for (let i = 0; i != inputs.length; i++) { if (inputs[i].value != '') { empty = false; } } if (empty) { line.classList.add('empty'); } else { line.classList.remove('empty'); } } function selectLine(line, opt_focusInput) { if (line.classList.contains('selected')) { return; } const selected = line.parentElement && line.parentElement.querySelector('.selected'); if (selected) { selected.classList.remove('selected'); } line.classList.add('selected'); if (opt_focusInput) { const el = line.querySelector('.preselected'); if (el) { line.firstChild.select(); line.firstChild.focus(); } } } function commitFreshLineIfValid(opt_selectNew) { const line = $('config-dialog').querySelector('.config-list-row.fresh'); if (line.querySelector('.invalid')) { return false; } line.classList.remove('fresh'); const freshLine = line.parentElement.createRow(); if (opt_selectNew) { freshLine.querySelector('.preselected').focus(); } return true; } function populatePortStatus(devicesStatusMap) { for (const deviceId in devicesStatusMap) { if (!devicesStatusMap.hasOwnProperty(deviceId)) { continue; } const deviceStatus = devicesStatusMap[deviceId]; const deviceStatusMap = deviceStatus.ports; const deviceSection = $(deviceId); if (!deviceSection) { continue; } const devicePorts = deviceSection.querySelector('.device-ports'); if (alreadyDisplayed(devicePorts, deviceStatus)) { continue; } devicePorts.textContent = ''; for (const port in deviceStatusMap) { if (!deviceStatusMap.hasOwnProperty(port)) { continue; } const status = deviceStatusMap[port]; const portIcon = document.createElement('div'); portIcon.className = 'port-icon'; // status === 0 is the default (connected) state. if (status === -1 || status === -2) { portIcon.classList.add('transient'); } else if (status < 0) { portIcon.classList.add('error'); } devicePorts.appendChild(portIcon); const portNumber = document.createElement('div'); portNumber.className = 'port-number'; portNumber.textContent = ':' + port; devicePorts.appendChild(portNumber); } function updatePortForwardingInfo(browserSection) { const icon = browserSection.querySelector('.used-for-port-forwarding'); if (icon) { icon.hidden = (browserSection.id !== deviceStatus.browserId); } updateBrowserVisibility(browserSection); } Array.prototype.forEach.call( deviceSection.querySelectorAll('.browser'), updatePortForwardingInfo); updateUsernameVisibility(deviceSection); } function clearBrowserPorts(browserSection) { const icon = browserSection.querySelector('.used-for-port-forwarding'); if (icon) { icon.hidden = true; } updateBrowserVisibility(browserSection); } function clearPorts(deviceSection) { if (deviceSection.id in devicesStatusMap) { return; } const devicePorts = deviceSection.querySelector('.device-ports'); devicePorts.textContent = ''; delete devicePorts.cachedJSON; Array.prototype.forEach.call( deviceSection.querySelectorAll('.browser'), clearBrowserPorts); } Array.prototype.forEach.call( document.querySelectorAll('.device'), clearPorts); } document.addEventListener('DOMContentLoaded', onload); window.addEventListener('hashchange', onHashChange); io8{~Š"_;ۦYl{`XD[lhQCRq2xH(vБwߏş~2e'||tyEFpqKFI$j5*:z5?xKV;Jvj+莦*[&$2/TQ"`FV"b;)|g$QK9d,,D"0K8b&~v~v^Мq l -1=l GI_8OÁ .$99hUʂFZټd$"Ō'X2x7&ݧ.wֵ1\3GMN:ITVYpS'a8&f|2 Mʆ~OJ!uVqS 1%+6aawd8J„P}ق7c(ˀ6 qiI^V kk=H:[WnZ:WzyLi.핳4`{? vo$aZWbK=tVnmKKvihڭ::9Z\eQQ>iU\gϧS4n6׳ƭ-yR7ca YفĎTudP]60EUS ,M/h'0( o#}`k0(LmkZ#c *]9SS>_ k^F8YZVYzG%) Pl BEf0L/pbHB Ƨ>Ԝʞ[`a8T3B/m!8r e*8@1akΙ-6i0L3iS'vJeѪYxS #rS 2h{u9}=j*QNZs,cH`8]4eиc?oIJ-ħu`bZ?eЮ6@'>cMpfT6Rhms-a0xKh^SϦnhnrU"ߔ#]{8Gu-jhrA&v}e8\N(UrrVu99{ڙ-{S6+Š<;_dc73E=Ej1,4["%TP"SwMZ\Gb@ӗ{[uA' K5hvu>VYYGf3!FV|b2b䮟QjL.Qp76BIF[T3HwР>uW#J@KJjWS':~'W.ǘv }UuuȞ׼#'`E(Hw16A)mŶa4R 交=/= HumHLFґ?DhRByL m>^(q X0Z{~R\LT hB"oZ+қh+ewz) _,,kB2(DF7%*q#4w为+1#=ҽr 3Tv9$tmz4Q{ADzT "ױ:B|8:}wPk%Y&nE??i%92cJ64+F fj|0ngFA0U"S^B lw}\4y6zjҷOXF&Dj& Z^_y38Mf`7>g+7T5n'96q$Y_nI>ߛIK׫c#0g|Lێ' |Eтn-$пlℓ@!pBB\ 6x{\Afj`3>0$p#]"I\R߽|̵:"Y-E4U4T.uqpo_}(g'*U1jZm~Lf"t\VT4 yTif*U}.O^YpooskEV2hTh*8-{hgUdPy/+uٯ/O~8drVYh[n,/v<>*ӤL8tH>uSC]їd;Ujw\42.%xH S.uvb71/gyd"BiB]4G"dQjptfhxgF'7[e nu.c g h:T)] 9P/Cxt?yQ? ?xJD`D=|X|t;3J-M%rpZD8>IrM b Ƚ~SbqPaY$mA* C|Qg|:}03*VLYƂ+e^O~~ˊpy@ v]$n.@/pq SqnC^3GtVE>R}?\F A@67 #Y{!.lU lE?5K{M҆#h3/@0b/p7CHx/$)R7Y~Щ^zegz?lT(S0xQ i`@AH)̧IwF>,[}?85(}?OgD\^1D"m]$ IfY'9l"I[ɧj3I*5P ^RA;H3FHP`ɶ4&SewR(NF ΢5wCJ,y9VJ?eŽOA^"V ~u@M7^T2S15s<NjMZ@0WͫEunjQ`Q2F +]!V9D!^8k#% ,=QelUI AaR]K!Em"e1VUa]9jHzYg9)Ǥ1fyCxfR )-$8(E.UOd`V>⧆fK&nyHvL9{r"``H0=)j j.(IüɴZskl~bconJn(eE<<-$KYex1P#$;llsg*$a>JgiImarr[M! -2c7C#ni7qwn;1;& $a@p}~ශo ;ikqxq;DuO:ɪ9]*)ful`ojMְc% 06nr-WG" \Y~:5mc^7?+ =B˪!WI5C GQf772"+1̣KR6QN.\Urt:!KĔh  ta6Gk|QޔX+%%#g}Cjtz{jפR1,Q*iTj ./#h-f,OmBLeuA`hJK~'3xe;,`^u5uDc)Gp\&;,xAu܆q R620b@xdEGUY遡ZP‹-SeTC,"'mm~qǿϒa?o. ]^@9ǮMme22QUePqE4N]EME&[xH"Q#Gwp:Ee'gI~̹ R7"ԬaIX_WeNF -\ Se{ d9Y%li"ڃ'w61#;U~-cʍyJ'#T1C\i\7Ap<^5!=S"}vtD1% ޫ3Ԡ!rtt[oyZ%KDh~/oUHaZvIY^R@[gcYKb3uzu%h(DpAX3Ͱ c9$—l>jZ6j'ΰ[ceƖ3h(RpBjÑ/O- % gedq#33x9j5Vҋa89ݞe5K9NzLEw}_-$?oAyP/nFC>_tYF/hO2nyNɜmMWIpo^P4 hB,Eyi*.cfl,x{'7. /&l@oK}w>vݤQL?̻MJ.ZkMɩm3'*;Ӥ,N &Ahq^ybk!DIGI߂lFfI{nSov۵B S&vmngc<z Z| ) _l;vF2սCLφѮoG{& mKHfՅg5§FԲ?!`S#/L_+ƒLd|0C莋DYyb,2sYaTSu[G 0-Kuo8.Hi뤊|-㛮wj =2I9J-Rbjch5:QD7;ʁ-]xěZ*(I@̴%L ftd:!64s8bm%5vdvcYD_dN3يZp(ǾqfhUs?SVL"ӥZ¹ӱN/}$-ovi5 D(]?ev)ueNK^O$%GU7`xqFQÆǵ$&j^nFp;G0 $ *WӁ4+yd7lkhXD<9nKSnGG$\ڗt0XgG}ӝ`XN deseV<E5ֺ0/7vp\"gjBdř3Xϭr-`3R|Q %F6 9{BcA?BG(߼&_8tA"Z|C/! hn<4ၦ ʪdm-5dA0ŶAP]f)x:|qR3քk7K%ވhksQ!咉 kFNdG(C \qwws*66;;b̥Dז 8?b}aұaBՇӤ o)ug:^طĢjҔ+ӯE onW J?-yDz< kԿUįwܱm`jMj}$Jk4׺Esoxvi6D3(5~wS҉H᷒K|h2a|nډեrQZMڛ]3l=ܐOQKC:6`sUzW+ݣmhi."8@Dpa0QoL1:GA Q0}88@w #oay!clϡm{B/<99]-04BFą1|}y ͆pP {{&qo9&{4١66ĸF;9;5݀x.Vd؍5ĿY` /,@Q߱C %ߢ=|:r'@v G=1YO{ }fQW&%IEˆ_wQAw 4i@z?r8Aa_K"><>%V6f$`b;TDߗ2 GTf4r,'f&pOͨ4wP1]Z` R<4c2s]_Q+.7/Q-幙w9A>܁_#RHqR=p7 VފG;ZO~d/Hd_V+9n]LͰkbku:NSAMwj٭J~̇x6?* BO8~N)OQ]B! m{!0&^svcr\<_7tYxHb<Lv kVЅcq >>aWM-!q*6 * XBfqm 0ߢ` JrjUdS2ߛZc*:pA:νJO^W:EBVIL՜GH*Ŗ F6aG_3D،ߛΡaq:Q_zX.#Od,! F==2L0NAc~Œ, >8o0JWE߇IO.q;Dd:6)OfCγއQQ8@A'E+]*:kTf1# ~dTkr枙0(5/1 @8O%5'(挭'nmd ]VWu+EtK7bfFZQ%v5Ky,b 3O$Gxyn ^*fU5XOq^U.i.ql[2 /L a C܈ K$sFN4E׌zttZT^rI$~?a$RZd0B D tH6CHF䵲ב̓Juje,i}-'aͤ.$ot<B(D z fXE\nzy( B (՟A^Cׁ/`Z.İcиqNÙPl͌ ̐߬q3Ojn-)}=фDJ }4  zjHᛕ'^f*5ĞuP[szp:-ӬTʶl_JR؉ւRVD>{C4A7o8_cv1|YqD2w9h{NJbeiy,^TdhD(bo0Oih vNNv~2Q$*M $Fw uA,ybfQ'g-wV 9-#n1[%Iݬ`>anK#Q`<8d+ }ҫ;=>,B~ΠVԓY=-<㛐$G4ẏ>+6[a),O{LdQۇeTDT!d}'y*bf_%2sxtf5Vf}3bA\U͞J;EHH-.+psԒ]QoPUJV4@U|2PNoMN7Sy}'AF SHl6uٜ^̈́IRT2zy5f9xSosszp3(uC)BJÛ-ݔ@ﭳB˗-o1?&9uKc Ug3}/[橣+& PyfՔa? Q ƧZNS4%G΃F[,Vj$9`-5'bYgUwՖ`?]3Ed0ފ;UH_R7AB7;v\0lc% Eyv /`(`+ekJ_[ t0e2+0rBP,ǵ0te2&]j=l19j`!u .R;wԙ_.^CQk#3{l𗊊mq.I=״KQ.^+w"5xqsN &-d%}*_b,Kl}Tu2ƪV)% *œƨF:-of[4 \ҭXATV†A9<W^n,ԷgTjsHT}8w5 ,׸g,IH<8P Q@u=KZԧ09fTa3VEtKź(nX[o6~M(MݤXCn0i+Ej$e'wxݠ<Vm29Qt)2GKI/kΑ#HQm% {7M\#1,UJAUB-Ȧ%>XAsL J@ ֲ1oњqjL'D{/WDk3~Bп%~|^+9+-eu@t/ٕ`Ԭ|L.4E'TrVHm9z'y^QJ$'v1jDddw^VE4ؔ:b^R'I쑯9D60Aǯ8TU$1R86ʂ^ٳaw"x'RRv3gcq\Pl Lw&œm¹^%4 [*ÆQZ|ʢ*: B"X,X% ]t=DZa?4M▌Xt MR^d G@.8]=W) xwcG'cM$A8jAu'Ei4 2s4mSGOG +mg[w?-ZHVM(iR·RCmx( K1vr@;zץX[KULSBH#-؁C6[cH$r vևxi ^Nv #腗;?^ 4d kvGIñ^EkRO!F>~ձwhSɢ4cIBJJe쐪gQX_ޠjy\fX@WˁP*V;/T|]`g^rpv Sd|p8`>Sۖևq&_%7S>z통FF8YzUnf @i󭦗'} :X2;Mc9pU1mrXڄI-x ܀ pԍ+4eBexeUpatm7h;#+̖yrb7 ҃5u©^Q-M,2)TȿdŗH"27a/nQ dnO:cB7~8s4EVL=?. #LL:9:[1I5/.1$^ϙ8*~vd7N{`V݊M8eEUl5&a!"C>_1y϶ ]a^%!oBԬNMc\57Uչش65(]0DD >ȿQf"/dgh4]KJ2J mznː &5>}ؔ.qDA +61xWϐjfZyqل+ڔlm_QP7>Hkw6o45]9pDi5jX&!TgjA!uh65V{NXu V [ERV]j=ڵNT^ؾ1*[O8>k+}vwlate,|ĝ$%77WlnWK^OWPl4k@5B+j[^pOm5ͽ Vh w ʯ@Ӗ2 Wko6_q JZlZ/V }IEaPuD&=k|HIzOmls}:ކ5[hqVXH_ P[fhlzϾa:)Hf}r-|s L.b=r"gt+a>JPI]m#E i2ԙ~ISAk84pP" hmgD~l--Qbc E(z.|NJ܌(5zT Z^Mz U*Z]pͪTSF:r.InTܑ78\9G6^;"^"'~3!l3=q'~TYLvuп}~>WyT|Ž^KZ5gq\k]dV2'Q?jo.YgѼntCȫ3/Rmk7Wy֑j=$|ZW'I$2/ᷮ^Z3#exÌw&Y.*`1Z<4k bX#mkx{i$Sa~#%&\LMK̏ݳtb2T BFN@HszUd6NYޓ+O3V $2
$2
$1
$1
$2
$2
$2
$3
$i18n{devicesTitle}

$i18n{devicesTitle}

$i18n{availableDevicesTitle}

$i18n{noPrintersOnNetworkExplanation}

$i18n{titleConnector}

$i18n{myDevicesTitle}

/* Copyright 2013 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ body { margin: 21px 10px 24px 10px; } h1 { margin: 0 0 13px 0; } h2 { margin: 23px 0 0 0; } header { border-bottom: 1px solid #eee; max-width: 718px; } .device { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAQAAABKfvVzAAAAsklEQVR4Xr3UvQ2DMBSF0StKpmCBLMAsVIyBWCCKBEpIjDH5KVJlSuIiusL2syMadDo/fY39ZCwb7RzgLosHHY6CLh70OAn6eHCWBQEdZEGAHA3efzTIGWQtDC5RA5RlspYBZgwJY1mXNUbMDKBxTdBFVVTQ0OvglqDwspQcaAFnDDBB/Uz+lTozBoaBWUDSjLdETiDMnBfmZnobvH7xcAhXer0f1sdjz+LBU7Z5W/f9BL71COOFW+QSiQAAAABJRU5ErkJggg==) no-repeat; margin: 23px 0; max-width: 695px; overflow: hidden; } html[dir='rtl'] .device { background-position: right top; } .device .device-info { float: left; padding-inline-start: 40px; } html[dir='rtl'] .device .device-info { float: right; } .device button { float: right; } html[dir='rtl'] .device button { float: left; } .subline, .device-subline { color: #999; margin: 5px 0; } h3.device-name { margin: 0; } .register-page { padding: 15px; width: 600px; } .register-page .button-list { padding-top: 15px; text-align: right; } html[dir='rtl'] .register-page .button-list { text-align: left; } .controls { border-bottom: 1px solid #eee; max-width: 711px; } html[dir='rtl'] .controls { padding: 13px 4px 7px 3px; } .controls .subline { margin-inline-start: 10px; } .login-promo { padding-bottom: 5px; padding-top: 5px; } .inline-login-promo { display: inline; } .inline-spinner { position: relative; top: 3px; } .cloud-print-message { margin: 23px 0; } section { margin-bottom: 23px; } .dialog-contents { padding-left: 17px; } // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * Javascript for local_discovery.html, served from chrome://devices/ * This is used to show discoverable devices near the user as well as * cloud devices registered to them. * * The object defined in this javascript file listens for callbacks from the * C++ code saying that a new device is available as well as manages the UI for * registering a device on the local network. */ cr.define('local_discovery', function() { 'use strict'; // Histogram buckets for UMA tracking. /** @const */ const DEVICES_PAGE_EVENTS = { OPENED: 0, LOG_IN_STARTED_FROM_REGISTER_PROMO: 1, LOG_IN_STARTED_FROM_DEVICE_LIST_PROMO: 2, ADD_PRINTER_CLICKED: 3, REGISTER_CLICKED: 4, REGISTER_CONFIRMED: 5, REGISTER_SUCCESS: 6, REGISTER_CANCEL: 7, REGISTER_FAILURE: 8, MANAGE_CLICKED: 9, REGISTER_CANCEL_ON_PRINTER: 10, REGISTER_TIMEOUT: 11, LOG_IN_STARTED_FROM_REGISTER_OVERLAY_PROMO: 12, MAX_EVENT: 13, }; /** * Map of service names to corresponding service objects. * @type {Object} */ const devices = {}; /** * Whether or not the user is currently logged in. * @type bool */ let isUserLoggedIn = true; /** * Whether or not the user is supervised or off the record. * @type bool */ let isUserSupervisedOrOffTheRecord = false; /** * Whether or not the path-based dialog has been shown. * @type bool */ let dialogFromPathHasBeenShown = false; /** * Focus manager for page. */ let focusManager = null; /** * Object that represents a device in the device list. * @param {Object} info Information about the device. * @constructor */ function Device(info, registerEnabled) { this.info = info; this.domElement = null; this.registerButton = null; this.registerEnabled = registerEnabled; } Device.prototype = { /** * Update the device. * @param {Object} info New information about the device. */ updateDevice: function(info) { this.info = info; this.renderDevice(); }, /** * Delete the device. */ removeDevice: function() { this.deviceContainer().removeChild(this.domElement); }, /** * Render the device to the device list. */ renderDevice: function() { if (this.domElement) { clearElement(this.domElement); } else { this.domElement = document.createElement('div'); this.deviceContainer().appendChild(this.domElement); } this.registerButton = fillDeviceDescription( this.domElement, this.info.display_name, this.info.description, loadTimeData.getString('serviceRegister'), this.showRegister.bind(this)); this.setRegisterEnabled(this.registerEnabled); }, /** * Return the correct container for the device. */ deviceContainer: function() { return $('register-device-list'); }, /** * Register the device. */ register: function() { recordUmaEvent(DEVICES_PAGE_EVENTS.REGISTER_CONFIRMED); chrome.send('registerDevice', [this.info.service_name]); setRegisterPage('register-printer-page-adding1'); }, /** * Show registrtation UI for device. */ showRegister: function() { recordUmaEvent(DEVICES_PAGE_EVENTS.REGISTER_CLICKED); $('register-continue').onclick = this.register.bind(this); showRegisterOverlay(); }, /** * Set registration button enabled/disabled */ setRegisterEnabled: function(isEnabled) { this.registerEnabled = isEnabled; if (this.registerButton) { this.registerButton.disabled = !isEnabled; } } }; /** * Manages focus for local devices page. * @constructor * @extends {cr.ui.FocusManager} */ function LocalDiscoveryFocusManager() { cr.ui.FocusManager.call(this); this.focusParent_ = document.body; } LocalDiscoveryFocusManager.prototype = { __proto__: cr.ui.FocusManager.prototype, /** @override */ getFocusParent: function() { return document.querySelector('#overlay .showing') || $('main-page'); } }; /** * Returns a textual representation of the number of printers on the network. * @return {string} Number of printers on the network as localized string. */ function generateNumberPrintersAvailableText(numberPrinters) { if (numberPrinters == 0) { return loadTimeData.getString('printersOnNetworkZero'); } else if (numberPrinters == 1) { return loadTimeData.getString('printersOnNetworkOne'); } else { return loadTimeData.getStringF( 'printersOnNetworkMultiple', numberPrinters); } } /** * Fill device element with the description of a device. * @param {HTMLElement} deviceDomElement Element to be filled. * @param {string} name Name of device. * @param {string} description Description of device. * @param {string} buttonText Text to appear on button. * @param {function()?} buttonAction Action for button. * @return {HTMLElement} The button (for enabling/disabling/rebinding) */ function fillDeviceDescription( deviceDomElement, name, description, buttonText, buttonAction) { deviceDomElement.classList.add('device'); const deviceInfo = document.createElement('div'); deviceInfo.className = 'device-info'; deviceDomElement.appendChild(deviceInfo); const deviceName = document.createElement('h3'); deviceName.className = 'device-name'; deviceName.textContent = name; deviceInfo.appendChild(deviceName); const deviceDescription = document.createElement('div'); deviceDescription.className = 'device-subline'; deviceDescription.textContent = description; deviceInfo.appendChild(deviceDescription); let button; if (buttonAction) { button = document.createElement('button'); button.textContent = buttonText; button.addEventListener('click', buttonAction); deviceDomElement.appendChild(button); } return button; } /** * Show the register overlay. */ function showRegisterOverlay() { recordUmaEvent(DEVICES_PAGE_EVENTS.ADD_PRINTER_CLICKED); const registerOverlay = $('register-overlay'); registerOverlay.classList.add('showing'); registerOverlay.focus(); $('overlay').hidden = false; setRegisterPage('register-page-confirm'); } /** * Hide the register overlay. */ function hideRegisterOverlay() { $('register-overlay').classList.remove('showing'); $('overlay').hidden = true; } /** * Clear a DOM element of all children. * @param {HTMLElement} element DOM element to clear. */ function clearElement(element) { while (element.firstChild) { element.removeChild(element.firstChild); } } /** * Announce that a registration failed. */ function onRegistrationFailed() { $('error-message').textContent = loadTimeData.getString('addingErrorMessage'); setRegisterPage('register-page-error'); recordUmaEvent(DEVICES_PAGE_EVENTS.REGISTER_FAILURE); } /** * Announce that a registration has been canceled on the printer. */ function onRegistrationCanceledPrinter() { $('error-message').textContent = loadTimeData.getString('addingCanceledMessage'); setRegisterPage('register-page-error'); recordUmaEvent(DEVICES_PAGE_EVENTS.REGISTER_CANCEL_ON_PRINTER); } /** * Announce that a registration has timed out. */ function onRegistrationTimeout() { $('error-message').textContent = loadTimeData.getString('addingTimeoutMessage'); setRegisterPage('register-page-error'); recordUmaEvent(DEVICES_PAGE_EVENTS.REGISTER_TIMEOUT); } /** * Update UI to reflect that registration has been confirmed on the printer. */ function onRegistrationConfirmedOnPrinter() { setRegisterPage('register-printer-page-adding2'); } /** * Update device unregistered device list, and update related strings to * reflect the number of devices available to register. * @param {string} name Name of the device. * @param {string} info Additional info of the device or null if the device * has been removed. */ function onUnregisteredDeviceUpdate(name, info) { if (info) { if (devices.hasOwnProperty(name)) { devices[name].updateDevice(info); } else { devices[name] = new Device(info, isUserLoggedIn); devices[name].renderDevice(); } if (name == getOverlayIDFromPath() && !dialogFromPathHasBeenShown) { dialogFromPathHasBeenShown = true; devices[name].showRegister(); } } else { if (devices.hasOwnProperty(name)) { devices[name].removeDevice(); delete devices[name]; } } updateUIToReflectState(); } /** * Create the DOM for a cloud device described by the device section. * @param {Object} device The device to create the DOM for. */ function createCloudDeviceDOM(device) { const devicesDomElement = document.createElement('div'); const description = device.description || loadTimeData.getString('noDescriptionPrinter'); fillDeviceDescription( devicesDomElement, device.display_name, description, loadTimeData.getString('manageDevice'), manageCloudDevice.bind(null, device.id)); return devicesDomElement; } /** * Handle a list of cloud devices available to the user globally. * @param {Array} devicesList List of devices. */ function onCloudDeviceListAvailable(devicesList) { const devicesListLength = devicesList.length; const devicesContainer = $('cloud-devices'); clearElement(devicesContainer); $('cloud-devices-loading').hidden = true; for (let i = 0; i < devicesListLength; i++) { devicesContainer.appendChild(createCloudDeviceDOM(devicesList[i])); } } /** * Handle the case where the list of cloud devices is not available. */ function onCloudDeviceListUnavailable() { if (isUserLoggedIn) { $('cloud-devices-loading').hidden = true; $('cloud-devices-unavailable').hidden = false; } } /** * Handle the case where the cache for local devices has been flushed.. */ function onDeviceCacheFlushed() { for (const deviceName in devices) { devices[deviceName].removeDevice(); delete devices[deviceName]; } updateUIToReflectState(); } /** * Update UI strings to reflect the number of local devices. */ function updateUIToReflectState() { const numberPrinters = $('register-device-list').children.length; if (numberPrinters == 0) { $('no-printers-message').hidden = false; $('register-login-promo').hidden = true; } else { $('no-printers-message').hidden = true; $('register-login-promo').hidden = isUserLoggedIn || isUserSupervisedOrOffTheRecord; } if (!($('register-login-promo').hidden) || !($('cloud-devices-login-promo').hidden) || !($('register-overlay-login-promo').hidden)) { chrome.send( 'metricsHandler:recordAction', ['Signin_Impression_FromDevicesPage']); } } /** * Announce that a registration succeeeded. * @param {!Object} deviceData data describing the device that was registered. */ function onRegistrationSuccess(deviceData) { hideRegisterOverlay(); if (deviceData.service_name == getOverlayIDFromPath()) { window.close(); } const deviceDOM = createCloudDeviceDOM(deviceData); $('cloud-devices').insertBefore(deviceDOM, $('cloud-devices').firstChild); recordUmaEvent(DEVICES_PAGE_EVENTS.REGISTER_SUCCESS); } /** * Set the page that the register wizard is on. * @param {string} pageId ID string for page. */ function setRegisterPage(pageId) { const pages = $('register-overlay').querySelectorAll('.register-page'); const pagesLength = pages.length; for (let i = 0; i < pagesLength; i++) { pages[i].hidden = true; } $(pageId).hidden = false; } /** * Request the device list. */ function requestDeviceList() { if (isUserLoggedIn) { clearElement($('cloud-devices')); $('cloud-devices-loading').hidden = false; $('cloud-devices-unavailable').hidden = true; chrome.send('requestDeviceList'); } } /** * Go to management page for a cloud device. * @param {string} deviceId ID of device. */ function manageCloudDevice(deviceId) { recordUmaEvent(DEVICES_PAGE_EVENTS.MANAGE_CLICKED); chrome.send('openCloudPrintURL', [deviceId]); } /** * Record an event in the UMA histogram. * @param {number} eventId The id of the event to be recorded. * @private */ function recordUmaEvent(eventId) { chrome.send( 'metricsHandler:recordInHistogram', ['LocalDiscovery.DevicesPage', eventId, DEVICES_PAGE_EVENTS.MAX_EVENT]); } /** * Cancel the registration. */ function cancelRegistration() { hideRegisterOverlay(); chrome.send('cancelRegistration'); recordUmaEvent(DEVICES_PAGE_EVENTS.REGISTER_CANCEL); } /** * Retry loading the devices from Google Cloud Print. */ function retryLoadCloudDevices() { requestDeviceList(); } /** * User is not logged in. */ function setUserLoggedIn(userLoggedIn, userSupervisedOrOffTheRecord) { isUserLoggedIn = userLoggedIn; isUserSupervisedOrOffTheRecord = userSupervisedOrOffTheRecord; $('cloud-devices-login-promo').hidden = isUserLoggedIn || isUserSupervisedOrOffTheRecord; $('register-overlay-login-promo').hidden = isUserLoggedIn || isUserSupervisedOrOffTheRecord; $('register-continue').disabled = !isUserLoggedIn || isUserSupervisedOrOffTheRecord; $('my-devices-container').hidden = userSupervisedOrOffTheRecord; if (isUserSupervisedOrOffTheRecord) { $('cloud-print-connector-section').hidden = true; } if (isUserLoggedIn && !isUserSupervisedOrOffTheRecord) { requestDeviceList(); $('register-login-promo').hidden = true; } else { $('cloud-devices-loading').hidden = true; $('cloud-devices-unavailable').hidden = true; clearElement($('cloud-devices')); hideRegisterOverlay(); } updateUIToReflectState(); for (const device in devices) { devices[device].setRegisterEnabled(isUserLoggedIn); } } function openSignInPage() { chrome.send('showSyncUI'); } function registerLoginButtonClicked() { recordUmaEvent(DEVICES_PAGE_EVENTS.LOG_IN_STARTED_FROM_REGISTER_PROMO); openSignInPage(); } function registerOverlayLoginButtonClicked() { recordUmaEvent( DEVICES_PAGE_EVENTS.LOG_IN_STARTED_FROM_REGISTER_OVERLAY_PROMO); openSignInPage(); } function cloudDevicesLoginButtonClicked() { recordUmaEvent(DEVICES_PAGE_EVENTS.LOG_IN_STARTED_FROM_DEVICE_LIST_PROMO); openSignInPage(); } /** * Set the Cloud Print proxy UI to enabled, disabled, or processing. * @private */ function setupCloudPrintConnectorSection(disabled, label, allowed) { if (!cr.isChromeOS) { $('cloudPrintConnectorLabel').textContent = label; if (disabled || !allowed) { $('cloudPrintConnectorSetupButton').textContent = loadTimeData.getString('cloudPrintConnectorDisabledButton'); } else { $('cloudPrintConnectorSetupButton').textContent = loadTimeData.getString('cloudPrintConnectorEnabledButton'); } $('cloudPrintConnectorSetupButton').disabled = !allowed; if (disabled) { $('cloudPrintConnectorSetupButton').onclick = function(event) { // Disable the button, set its text to the intermediate state. $('cloudPrintConnectorSetupButton').textContent = loadTimeData.getString('cloudPrintConnectorEnablingButton'); $('cloudPrintConnectorSetupButton').disabled = true; chrome.send('showCloudPrintSetupDialog'); }; } else { $('cloudPrintConnectorSetupButton').onclick = function(event) { chrome.send('disableCloudPrintConnector'); requestDeviceList(); }; } } } function getOverlayIDFromPath() { if (document.location.pathname == '/register') { const params = parseQueryParams(document.location); return params['id'] || null; } } document.addEventListener('DOMContentLoaded', function() { cr.ui.overlay.setupOverlay($('overlay')); cr.ui.overlay.globalInitialization(); $('overlay').addEventListener('cancelOverlay', cancelRegistration); [].forEach.call( document.querySelectorAll('.register-cancel'), function(button) { button.addEventListener('click', cancelRegistration); }); $('register-error-exit').addEventListener('click', cancelRegistration); $('cloud-devices-retry-link') .addEventListener('click', retryLoadCloudDevices); $('cloud-devices-login-link') .addEventListener('click', cloudDevicesLoginButtonClicked); $('register-login-link') .addEventListener('click', registerLoginButtonClicked); $('register-overlay-login-button') .addEventListener('click', registerOverlayLoginButtonClicked); focusManager = new LocalDiscoveryFocusManager(); focusManager.initialize(); chrome.send('start'); recordUmaEvent(DEVICES_PAGE_EVENTS.OPENED); }); return { onRegistrationSuccess: onRegistrationSuccess, onRegistrationFailed: onRegistrationFailed, onUnregisteredDeviceUpdate: onUnregisteredDeviceUpdate, onRegistrationConfirmedOnPrinter: onRegistrationConfirmedOnPrinter, onCloudDeviceListAvailable: onCloudDeviceListAvailable, onCloudDeviceListUnavailable: onCloudDeviceListUnavailable, onDeviceCacheFlushed: onDeviceCacheFlushed, onRegistrationCanceledPrinter: onRegistrationCanceledPrinter, onRegistrationTimeout: onRegistrationTimeout, setUserLoggedIn: setUserLoggedIn, setupCloudPrintConnectorSection: setupCloudPrintConnectorSection, }; }); N0 D&w+BiOPei%TߓB,qv?7Kb|Gnn5E\I\6h&ܒA]i̲OtNևy!i QbR,EAk1+ޡkYҍ5npJEf-Zr)f$!0%؃a||^ a0m:!!x&TQDHLoH#؈SP5!_Lȗ0YE. %T&>9 r6vkvir`<˨=qVL^gd>N+`3=T@*eka+,eMt;&#DtbW:$XAOy*?̯Dk}{~Q%lU:f^j>Mk36%ݮ0&z-T#9fټԵWM]u~Rw]{MYTV]]5ex2! // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('hats', function() { 'use strict'; // Install the survey script from HaTS. function setScript() { const webview = $('survey'); const loadstop = function() { webview.executeScript({ code: 'document.getElementById(\'contain-402\').style.position =' + ' \'static\'' }); chrome.send('afterShow'); }; webview.addEventListener('loadstop', loadstop); } // Return an object with all of the exports. return { setScript: setScript, }; }); document.addEventListener('DOMContentLoaded', hats.setScript); љE&&7SљG9/-ZXg0/"*rU]Mw#Caς0"<;*<\3xX q,g>f6n*a]ƞ3; ܃IaDeR^CNMj%fΎD;CqZ`^8c +#N }:tk)R^] g]UMfب,Ç*\pEP]%rZ%(ۈb\ⅮL,QJϘE! N}܌.)X-O , tzoq 7 <6Ocg Mfƛ寕hAo֘zV#BYd<,߁ՍnquC>ݐߢ_V2A2p /h-b;6MZPݤb8l "46rIƃd|evxSuP4 QG^fp$=RL: _F˪G21+jim2*)'oI.1l69cўysA(BMt!e"]wU :z4Mfj-5)#$`0C@l"CJB<߰pMlbz6v+Y(3 <&ai9)Xl@M.$݆ ̯F !;RJ"^OILz<]htf1~fg'2LL؎~'%831RtU҉jM G1B;"fs!jS@9"t)׃$2Ca LGK2wKT8Ty Q Gp̣隺= 1^ׂ5ǚZ-B)iS%[R 97-1.,qfX{Z^6ƏP[Uzu~]f}lh2λniwO73OSmZi/[aN{*]Zsm܀{sz}ᗕvi~_/7FC}\O*YDv.p0z39T {U?[W 5]gW q,pYު?koT{hEѕ1}߯jWWp:m߇ HmQ}1 p}z`j8m 0W٧p٘UُA>73}_~l`8?2 ?[|0> :K-\WТzݏ3ذWBжfV]3n;m|:, { X ZX˓@XQc`?{wưSk2KAJ W5#5i?Xj:`-8 xէcM~ 3~zwFRW? Rgww=5Gѣ7Oӯzg\7fmt/067z]]ϚVqK uzA՟lĿ:hOp\k}__?O`8nx'i4rxe?.{m6cDw٨}^V0ܠp7`pύc9f3€1@`m{}c*h<JZծ=tw#v}z޸k`_+!~M{YCI*s;YB_0qIzDJˉ_ҳ"45oIELf43 |S#PJ;!g:{!y frev\HXq7Z]%X1pf;M %wdnPRS85i:,XSP]D.J˔Iv-1׮jeʗ+!󿲰gG@>;fTԌnfݹ"Y:`0;<QՌLj/ [EΙiqQt B V =[s NфwRT\&e?M/>{sCp!f~ mng<=E Icܞm,4Y Xc2E 09r Gf88k@P5s,2ȳXDpCSC Z2Nh~ {(0md-,1@ 6L$H(:DfyZ#f|)"RKWJ&G܇vu %.^KMSkYnQ,!, FR%-f&døARnuxKENgK &M0@&=1 E!K'$GqB!&.|qW%{4q'?kڟ$!*%eM[zt᪞jA#;,H8܆WoIyG)gd(~_N"E6+0[b1\"U*`7AH )/?Vs?4`m-) DhIGZwTwz ŧJ$Q7iZ.9;)Ovu\4f>EvX£xgs1q=ŧپHht&tQ6Jwn RTOipeδ) CQ^C>C-.~!7.*_}\~ } 2D.Q/> .Vn!Wp"X/jZG+D\|b㩸. aA9,JV^' %[du++#;+򕌷'Y˸cA0MW1&4idc/n9o#B_X4.lNboھYE_N_%A8i%dxYc,dZ_1T4)2WUX0t^ ;\_LR>#~b>}m4Ɉgr/HT{ /HU^Dx~DS 83Ojq=i_Zkd#OHbY`gO-Tގ;{$gHpx[0iVL pfPJjhL\R]mgVhPz/.E ?/ۄR$ZRr<گԯ|!<-hs =.Ed~58'gFnjke# m+nLi}׼ SoįS{%)5:?ZV\SX™HgD&\V$,\a;zK컍HY׊ܭlt DcM:RRJpQ_3FqiDfV $ar Sk.(R&{ްJKVD{EID]zc{e\\ AjsfB$r2!{W>za'z!W݊dz`IKpŖc B +('n*ϙ8up/3io#~|>Qv61]cJA- ȊXޝtlya*C3]^(:ozA01&҇aTkݡmC \2҄(, cD,'g[1=n:wAK#BbxjRѧ%>'CAL\:qa˔$[AB5tcJJާCɍT[CQ|]+<m4D)&!edsj!K8}-m983LJb#{U0HmiڜwW.xXT iV@m0r.a\::Tekڨp9{xvBZVg6p-zp5|\e9m` 0{}qWds|m$™ެ;PXFl!oohLS >)&qg0Tz{bz::] 4xW7e2~ƝlU`.UT&TH6$WYo6~h|ަ ZtE_E"ņ".;$%u$"|s{]oX=V"/DSƕJ ȂAd7EKp`ucr\J?QX@>}`m%9*bs%wsznTB{_~~Oa)$&p3~Uk])ͣn\ݸ\˦RkQ&(-uyX@ÈNZ,|L)Lah4,Nh4HgYADJ(itlQo: 3ǧFjԒpj{Gtieu)zLB%!E\3GqOlsV)Lˠ#)y~JK BOKL!na2]l;i% Lֿ͛i?R}ޏiL G|gM`ADlq)dGd):RMo,Ru7>8dk߀!qqR ;d 127N=G-屧|GFEl)~T~@d3r-&ёJ+l[X\0]Iɗ6T3]z($[t4$!,yz,T 5Ofw^z&jK|P+ xnf ,cWm "Kؚ6HmjE+BO0,M)=B鴊y!E{rK"q}mE57LQWNT\4#GrX^ YӔ/]A1^2q9'Xmr9ARsa)Y+{ p~qS}iH=&7I2JSn%6]\M gp՝Sv )rb<s~0Yi؉߻?ј%0c1%ԘuSeW|*4Eh.e* k͔叕rc)XP%оkˆ`8}T]O0|ϯXT]iBTPx.>gbv#kDŽ!Dۼٻ;3;qTխ珟U0-DSAc Me >ɀF$JS6jj4G*GBݣìc%قYL \52!tz|\DQ:D0,kKf XEj/2sfb42oU`J]H=MSUI1S]qK4Q.q_(s'WgOwƃiV0\t`Kf4wp@H 5*?ƾWpb&ZƋ`zWi #Uu!#}`ocd*;0R6a5ABR=;lzZ/\Mr؁_T-h<‘6x(2 4P*J=m܊FhIB;R۱O|N|aw6"rś5%^wڛČeVpxvnuYT/Ȭ1yiap-Kq)"2pMUUӓմd}!xu-?i!0=0)LrTx|?N!t;C͹08QFhzػUMXL1Zo6_C ^XJ rݭrm7[âhuIR~H")Jp/-73|~bolZl8qe4@w$Oѯ BrS$X32_lG8%9ZF?$BK"#KaDIZ樠wۏhU$=;; A"9YuU/Y^"!yAs\(vmUIJʒKd$ZҬ,{D! F/K gzM *Nv;ZFDWDO ɢB"={~/5;"q5CaOw3u)Eh"!et 3g"'NJx ezSĝr}bɞS{Lh>-ՙd|:O"|:a:8I$$ٕ&RMsW7' Cp 8+J2I.%[.e]Y?[{xS^sY|D台sK7{G 71x E ح銘d$_ޅ] {Sh1"\1.!j0Qm@=vn5UWȨb?q=HaNoi7S99T}\pv*Vq`OrΪxV ;Eգ7p TWv\H^ЃZzPb ݔBЩBL1rpy*ŞՇFkO 49ב$(`EäOPšا0٨d҄DСȈxN 4hbM:GDMm#qcZ)"4 ^NЁEs2ꌟMBS ) 3f UqKu`4ېFPBc)&N06F~ˌeӁ'd[0љmH29sX^aw=̂}2gfSВ9v4(~8=G9!#}v| vmTZrz $ 5= &۽zR܋B>#m!iyOn;P8s;H;bXFYP{!I` DDa~ǠЁǡ |um5$ړqY!- ] #6eCYgknd+P0*Uط<빠1CΞHm9:y䉝`w68?h!z[„}Yw}&Pu56 Q2!l F>rةPiݿa<΍Mbj~ErFbO3@ap!Żb.e8WW鐶n33E=n:ܩ^hwVS9T'^zj 5\S.Kc*&>|&Y [p6!l LQ:$՝#Qb &4pg!$ r~ +2%T3{mX%RR:NXzmr@z^L>GhƷ܀?%p(Y0մ\j;Һ:tơx` 7/_mx+mV}C p[Wolл8H1:YuhmLHzn%u<J tF՞q8G"3R71(E{Jn3<W y O9 J@<{@X%=[ʱWlNsc9$}~PrІ$7~8 KA\Ipٗ%ۯm;;3;;]Fdݔ&_39d,|JEQV!2U-hFKEIqNꋴ"U1/cJ"~N+Z4!vU}Q1͡[}$r2鼘 IsxNEtv>KM 1$?jp0='ct.yL? E\A0;0Уͪh#$V^]roMh%xQKʧCl][ :(IQǫLyE r" EnUp fIVBaE>D`"nPYTf/4NƭP +Ys2 u4K@Q#a{1*MQ&Du4g` T.bZ (|~A#G#Jb ,{W\JZN:0MaBk^P:ެ&w=9${G(d uT\Qd {qW-3`d$U%T1e@p8|:H ^Q e_3|O腏|{bQj0io=ȋs||C'a-]MLE^}ްKE&8=_H!Q{T-Pod!]%Ff@ ow~TMGo!/[YgJ GV0Г|VNzDH=l}珟v?rgCyw|}Œp1SfGlaT$Mڶۜ*1#i<M̤IXZW^? px>DSp;)ld+Z*Tb`(¾p|6cOkm_vdMkSdǽũ`'=[w>6F]aTѨbCtX^ ct*9Wz5) W:(IB$Z̙De .SoN }_ŵag\dGxkE{ h XA^)G;ETsI5XVi:X]|DZe''eyaA1LƪZMћ $mxI IƖ%h9{mmrb *4'~X-#'38ꠝDYK`=9DPUI#*섌BMG&⍵&&,K g"'DWkS_]0Y_]0}_]R%r}|ʉwQ6S"5me 3["k%lг'X6*Ķl{9ߖzN'^S%_Ԓ-Sot! #Zsank78ZIG¹ַ|{3Yl2O&K鱅(M@V [ mδN.G/O™p0O>rAm}ͯ5+nڵ]5Q>n19zk!M`]X--DeoAG"]'~Ypw#hy^}^d+DKLa&k<k+OvhLȷrt} In}#oj +<HؼoB)%p}hYXJ#_Q Ӯ9!{l8%+KҍH"΂J쮼#D햦hP*jY8֐4K:sY;{hJM+I3,i"d>zO[ Fs$trbPcaµEm=ӌ,|o|e"3P50хʞHP ŲY^8Zu_4J<}qomĤվh- $l5;sÂEӢnpKE,}K,iNe^VS N?S&nJ?c׮^қ*p]_#}@{w{YvҐ6ԒLQ8!16;kWVVT`bA!+ʰqxX5'5:y&ihsRW {*G{;*Sr03Y~OPM \mrHn;V2ާcZ_S`W~bWPʻ ,,WST6zltkj0:TJL Z7ZaYL7j>UvlR7|Qsg&ڛyV^={z.:;j0iGWc hm1QZI8p7^+ a!|hҚyF /ʜ1cL īJoZ2m / ^nYomΟ+$wZ5; @d+HD {z9@-\lS<.z] `?7OV^:WʗCZ _Kzc= 憓)PW""iVCIpjt+11^]}:mV@]} |)rtfNYV]yV*7>L%X\bWe TFr~L j05NY^b2p#1𧜅)b:zOϯ'!> r&"/,הqkWf &JT)$l#4bmeRg؁I?kVFIVt"Ӗm6e[ZLy]_4zaa?i+.CniK1Ha3w Km[0v>Elc>Mb⑥%5}Vn5|WEn|sQ&8Œ?,9RvU|_ҴǛcgV K߽?1xΦ,-9ۏyyzrXD-b X| $20\_^jhKN垧~ ~zU9ܬ]_JAK'UH(5N hVNSM]vWT"L#3Ez!s?t; 3H [J9,#o"~?GٳX%=ƫsO^_Sê%0ɓƞYtKS`n;\ ,^Z^^}X-{lzgeg\v8k`X5b\&c; ~ޮɷߎ_GqjjvguS"sT>\>& Ѳf>~ykX@S\$vQyMa8S}3Y|Yl2}yDV9e9fGfO~9N^<U_՝Ęгz8~9%鄰˝GYEA~0(ŋe=ۣAokp~Iբ U![Z%~-5ߖBfR |̟3CUy`H 6];ǀJ2&s5 cϞ⛻nʶ1GPi"/x(@x|pT-sԈGV 5Ukv֓b~]Σ+|1zzk$wܭ+D8W}7=DⱣ3 ~vCvujOLǃ(P #Dus@\\&`,qΝb@ڞ;,漎{atvOt$28|o7"dU׎rQڷg`Jd+ޣi@}ށoB &lF;9,TOt\@zYeqO'tV-/fQ#!|䮰  b2;|?RZ A'  M%`@d HSpwTOXANsf_;:Æ=㚎iWK!rUԾDڳ uzv˗t!ꔞpD52qbI^p:*y 0x*/mpd0\3V5ԝꆠ+ :ctwD;糈DX{\d H MY]3rlNv|6+ !Ejq*]K"g%Ly.374K^/l_"p5< zSb'L͛GaU>ͷA (YPcTM)(in[ڱl{0[1:y^l@ck˺D؏Ts]U0ӂjްG^8vT-C$68|2aa':$#5ka0sd@CY9 1)Q3U ɥzs2U\aU@&FPXo 0L ffE'8"I?y"y>. &Qk8rITcYBN"K޾ ;d_ϛ'|FΨ_=lgKgVͺyQe{aV4:ηY/[cQ(qy_rPAR Xx|ϟ3=\xt /DU:}s%QULӔh;oVce(s(XgjJB^t*:`h,EbT . Fc*{Q"Y"h(Zͤ+3w+ifWYi˚xg`\zzBK/jxm 3?g/uS3+ s~ :lNR/9KCcCeߤA9/.z/#GDHsb7Ik6#n6wrpI+2.wQl(]I~* F_SuU/| qA`A3o=O'1=!t>eQUƣy:C\1+Nk'?E<~g{ _ŗv],)7g?hފwA 8(ɤ{^ivwg~|KH8x ;vo^'at/ت"NY q&oJo\ψ鬾ToƯ@,Jv^!BkB ^x%\WhVE3k2OD),c7|q zɱu=P06Z$W*XHumPtV}sA=8Ѹ׭zM/B-"~ZO۟BV&#?|+K7=-QCW0*0^"smW$U|&i / z- (>dyOڮD~iI 9<c[Q[Nħ@Tn`7!K:6hdJ䝜=_Fh|іZU.=2p㙙&=XmʘazǯF<12sb [j>k3Cnc [YْYmo8_Zjki^mH/I7 3CzR̐ɋ\9)!GI rTjfU`|Ќ 13*)eߊiqJ hNJԟ{}B@f$ظ!DQiAF& ShVʲop؎fD( PiRKX-mj(jFR6>z&,kPl!ۺ"$ nf1oMߜeha']o 6y +z*0Ä܋jv2ZLki}nn5w*M!KZ !VԜ*ܫKC0Qm ϒ׹+~ vF=c%S+'ت-5yI[{D3֚czBNتc*2vݺWJeveB6/X%@![]8tB*V㤪m%+ wVeAc,ײ,XʚB<AoP" QڌY(iSy\TrѡpD'$|QبV{t?P8䧟zz)G2yG}̔*Ъ|xO^TxPvBߝai)ҡ' Ka%Va5[-i ޴ v@jrwLV1w#dkղKXr&,W<%9ӱk+Y2؋&R0lQcViM){Wpmo` %x8 ܯf&5s7uj60R*οh(T?ݺp<&A.yz|uzrۣ+ΤoWrz7UAv K8N)\^}@Si)/ 6/f57&ܖr[ 4=9 <|nFF]jʬ5P^LOZxBe\lĬ+FOK9N!we\'RO8`1H 3b@D`ϊQKX6D[eR S^OGh Д$@s0P$PJ2Ћv}섄5`TvP?7p'K[8,Ui2O,M |pX#@V 16 Nw/1穑 zwQbe*I/vw%;N2ُ֐WKUا l~j FO"@hI!U52B0Tcmy#Ts7X4ö V"1Xv3<^0N"G3È} (c < ˓.h#[Y_D b͜3.C`QV@,SVE?x DŽ2#Un%)wah+75[jTT+1A|\O3MЈ%B^!ʉI-0".qȈ9+GV؎ Ol%Q]5kvkM;Hk~p6I\S6~~V[=6wj4wB1˛ _i ~Lڝ_~7'Wpa{]-DT=~6QV_`0׽\~ʂJpPІ8C;/?bva.ŀRvGGś^[dwD6da![%p &y`禿y^<5K7xvv^[:5D38U7~k09iTS`C)r4S5u@\,ݭ9o/k_/'@)_OO 6vYIprv)|EjB;?NFTbLBHl!+!Kוwޅ?'E8T"/?Sek/5 SumGM[$jJ@fFY|IP1vp>zŲ"+kjj\_R\(`ɑ" +G0%|% V)n=YM[\|zVW51&Rsz~uqR*J80y+?DlnR=*_A8V]'=-K ΅ΣE;:{Oq5, v=rd7[> |bt&ǹVIv7n[xMKGӾx͆]^,IG8QQMGӧo 7Uz\ROkkM2γ[5+9>)+Y6Zuy?C.sGd7.ڻ1/mx.9~Y{sڸO%7W &$a@@@o["X|{lCӽ4y?~G"WفSF\F ?xؓWf)y"yFGFFmri(8]ŕ` i3_!>_ܕ# KLHs h" % .[Y2r$Jb6#s&%f6J"|`S.UĢ>14fMt;`ˍ{I~hpNJ߹o,:~`e9 DH_VN5 f|DG'D+d6U=]QΝwOQW>ߖ7ї29{0v0V슽Uzyo\Z+۳xΞ~{> :ǻj߾_t&UooڭQŁk5͏ 9jO:ki5ϭn}Y}{/OfrMty&_}&a^\v'v_=~4w˽Ew؁ǫK+uUϞ_W;AUwX#eZjyж' Ys;y~ЙV`˭cv'ͧao~mS^}PUSz|7>z?0B6eTaU',j;PAlQM/5lB/"Xԉm6 2 0T:1V 9[Q*>guB d75|-ize]6V]&{tX(e4̄h\ґ`a+my4jZ8[!@2aX@*TuR;#^B1lִ)] mf/.2,IzSDk1.L4ӗQ4BR˅n$Vܢ ;iriR'T!CGVs;LWP&5h*貞$-iODT!S{; tT $L., ,M@  -PA;$q8ق)Zt_!@Pk7OfjQx' /;jjms=΢~ho*e#RTc54\;~4BŇ4]6 VW r0\.&gcY8i6*)XAo(ğx9&A@g{m}5ú88 {~N +OVYVX>O,bk_1lէ(oxG8z@Y.A{!Hq| S蠀#Ʒw(Yb3-10%cΒY!Ikg$K8J9Sd CtZW8لC$U֊ nj!Cf􌴙\O5H7hDJnRL?0 )#&FBoZ*߉ (fG0tWP3ϗxa:m( B-~ףQ!fj(x܃wѸv5OLJ\{YTq!zG 3::Q8fP߷e#8!nTj20BF.P}ɱ/-RbAjNsIiӏf)zk=N]/!V K}u!7 %$I_Bb Ϧ*A_!Md|HDGk-s-ƅ 6Mں8r"XM{)w}}nDqֆ9alب0bωLdRj }HIˎTӫdE㞏I*&S) F e/:8iJULˬGc65;`;={ k e~"wRi=S@Gt%223ř04񋸬E<[XI<6Psw{˯Oz G3fiRxe+bWʴ`W]oܶ}_1(u앓 pѺpv\b%uE6gHJZM0`|֛F*O_+Ikծm\NZSrH'{Yc$%J9rm I-%ueecdI zwu6s~%iUHc ah!YҶ$e.b~꜖J|2Z;ߨg'zADӈMKv][#RxnKeVtqvDFT :d=59LlնnYYH6f)ugP:=&\ZXs/`G:r<Oipnޒilw_W`[KW획zTQUqPR,,p+gaְdf&;+yy)"֟Ӆ'G-p39$mpPdP ֢k1>.:^(| >AW]!v $5 Lb)< !S:Y89/"$algq/\ѨǔΨ:i$)X|_skxwӬuXS[#QAZ#__Bc}CX52.GPT-: f|FO=r£YR 2C!mE_Z,P%e7 !8j6WV\H~~x _}"͹Q0#WNc1A}lr"u6jjq1 \HKv*AvMYJ^E n"f] q ^8s]aNK+,- M<;7zC7= - e^eGN *xw~V+i_-7YBG"+Ҭֲ-Ȕ)w45kCS #]$apS|HFy%㾬z:"O)٩Ծ;nQԜMΆ<ӟʇI,8 FnɳZPkIf9 ifVTEcp<(yyZs-WX9Shg3V3LZȶLXxRD]Y[0z2%/y`  Bodc&býQ2,50\W3ZwZoTWv2"w8<;Nm|bNYſ(n k9-Xs=7߼FRF#c]etr3øxu&nO.Ifkēǀz٘VAvO&~g,q 4\x5TE*y2&8n.mG24<8ms!l@م#Y}`X-;,q0DUF,.ݥCYK6{ϵtޙ YgGt6 L\cA9 `N瓞EY"TGN3K_BZt︍Rn0 w[(.C~CHLTCdE* H"ґMaU_~ʅ{>0<{dQ{1^ēG˚CJv9SfS#5٭nܬs <䝅kQ0M6ڻM/${Km@"/,_vyE%M AGKwTq=*1d72P6ls )>$#g۝8+<<2!N(mܹ%p"#2Fib(v:u`&Z'kpzQsfxG\>ٿm/ U 254Vmo6_q.NlCmlHOQ"JI9 IId]}%s7TϚ3 g!CfZmxfJ2ѠbF# ،0 BRz]-j),g xl,$LJ2.;V\`E*\6x 䇴+YWGctEyz&œ`ٖy6DKPS2US5NlzJv&JZG6/ { \ԆwYذO ;+qEC+ea2"JSrpJ,Qlbf|{\S 1kD0c]*A~iµ?{0*igldP:V |BU&HjףfJs򪭴|ƣ ]gv m>T71O՝/f8/sV4(IQР YJ |XG6so>7ه]Vg=]E#0WрC-<zA9E&(E6k!R:p9BnfV8gQ!(&3_r9װig-@jZG};0׳Y+3 ,I _v_fxPHW+~N! LHFoj*}?ⶐtb^B;e6PJ!P_ p6F\i~~8%|75BC,k]M$q{k(;K-u,SSٝx+Y'sů樔tRzd9n@'6T#|KBx&tޛj]& wi6NYT=N4BsXt[l|q-n+0PO]x\5+"m6f@3[?6#mKa櫷{0}Ii/AD َWR*MאoVj͌(,7zG+fvyoSx:>Zr*t\,4u2ٱZ,Pm}DCϏhmP#r*GW!A{?Fmw5ǼKr,zVIrJ3,ַq^1bS£a#r&YEua6s,07O͌6+(kddO?a4բDUhuJK%Zg\paG8AsҟV, Y[O8~Wd}ͤвbg[B(j Kh2I\bmXﱝ43b|ǟ?;CG1<Ӄ|o$W"q i`(p: L+HO2Ŝf%/I%7'ʈqƢb8a HncdDbFIlr1H3eA#1>mXvp`4x5bš.RFGYq87ˊBF4{|u8aK!c$veIY >qF౳;RRd_jXsZX z D_2Q,Dx O ;>-,rrU2 Q" !J6ev"4T VT /b!^Ƞ|FxEŴpG1E&d̳ 0+S]>5|h5Zz z fL43ωyƚ6fVOCE 9W"hs[H:'|>.sq^ɬ'CZFø&T0BAF[B$*sђTXK($>YUŘx9\[US(wZLfďDZ4{rrmKSX),,5t5LsM K6d;Pt_B RPb%~[hQmXqSqSN.8dLNv(1y9fb[D mAt'XcF[HzkFn"ˍ/kBW+]!1{e+fb*XRo I$KDv\ؓ8n;GPf;$]D:Ha>/VDsOEju>IqqG^m#'&؀sa3ZI!^FǤʷvͲ3F|N|kD7p SeҫP}VxN9_ӈcEB}hI,i;Ja}e{2LCQ]iڎ -ΔYskfi҇˖?Kٻ|iX泥NOnJ=8 lC@ )8ep%cJP(@ҥLnɄ o\T/[mK|&$:ﱝk+oa Ay5Xз'$oԇq}⳿'LOyRtuWu[5x_owh G?~'w\to;NUg>zp<|?/.:s^o=յY]uw\8->}-6ՆkwiO iK1؅#W>k:靷:Xu;mw[}ڀ׫xrouLcԾ~!N[[űP5jD-1MߟORt\LR*wFԉ:luޏl--Bu<,tecy~z7c4p{=4,}վ>q.~ewꧬ%;ɋu)5 f,|%;ne^V!;NSF+V򊗷< G}Y`RTʛ2,u~ˌ'lftV딳TE t7O%ҀM "_P+qF%iihS%1+ekPxHx+*1L,X*M%D+v/-`#q#xe4vRY)s40w (1;dPkҸy<ʎ6];/\gwҗAuL_E)FI+DmU~A2D2gj,crHٕnjS Jp /WR4f K'IG&~e㱞,lz:BR-Ep$~A0WG]E6NEv'%}r\RE5B) S =ٔ=S>>J =g7DNI1*גZUG {UBh`ڱRwUc<,wbO: y-;9x<1%)Ystƒ cS^Ż)/#* !< ):/VyUNIQyVi1AqkA,nfFtVhqM5@C@KAg\\XtJc~DT[-&S y)/F526U F*ǭ "dSY >cuoDkv>v,*ś[Xr%iBMgI;{kP^t8`B:>u 1H%ٮ(-cj2$@@n9;b:j7.qX 4 #S O(iޠ&׹e ]lAJjq*n BZ(kRta/:JhwT2O  $y @7ίA/yS Yl7bzV);@w ד?\4KL\<;P@X-B+'pHKq+h"LMw,Djǁ5uL%ۑPɏ=ƵШ[NG/Wҝ<y U,_3S.Pf9*uudGLLnI @>0&Bj|ɜ.k Odi.XIULpU缪k^!ؽ=d JuV{nsV~t*2l*0TŘG W`쒘: r-&;!uIf\f _K}!@g1aLXO\3DE]cq ddW#xNp:ݷi*AwFuJ ]2N~bQ[-"_EeB ּ|;~t {ۛzH51>[ж}v[ڲU.ۡ$ŭX#-fX(sK'lkj"^"2[$v&뛧W<]m6;TyYA4eI?aB/Djg0:&vɑQS&*,5+~{4TX?Z5T18*bL?mT!瀙>`?Bf>Й)r &ˎc-eU[`vp}x㎮sm{d܇mo =w3n! ކ emn1) CvNw˼jkVYUtwB8Q8»J BYDJD3I !s!.kuEcR}eF#ƨN _wʼn9^(tRGp8 rzQ"mA=go{{[H&r9d %59]喗Þ&>wx0Ea>6ᣊy[ `G7YQ q n+G8R'_9ޥ8d'Q!ݬW!\M7̌#.B0?2Tb;fLD}R+"F+.D JE~g(U*7N(v)-,87Q EV45|i{ 4%T> >=^TK| pt NE֢41tR@< fP^rԊK:޺F_d(sSDeFQ!_> zP ś\V4iEewG,#R^>26~RWu{:h騾U(_Vp#ϝ`,*KsOll[t7;_x []}$ئ$gW$xZMQYT&h/eG k"FG(nmwEcSN| JTj&\7|][s/v|byESMއ0 ] =$}xiMSqZ]TU: Gb:G#uSE8UGme]~)AQP T*C7A b|z ͐lm%W'}bp/)$0z2EmݸYRޠ#\֑%GuQ(`9n`v=3L~W9s)E`~{l-"|>]b(x^)C0RRPGѸ^w0IϮU2HSn>=V{k=l?~A*WmCf U*]+ƿR}W+"o%7w ΂Ih^[^,W@DJNFmet'gekw-s(`ڡV0h LJm:rt1P3 4֛}DӴaߛgK7\C3}CՆySNnUe"o(z/hxTUFygw;e쒌u >p@¬mэȿJEGun0 E|wRXv5 uCBbCEJ+خkhu48Tpwq14ą콇͘ b8UE]gB=)L `r9#n 6<<&N Js|jK =yT*?7iCLBӷ fK^{~9E]Ô䃶ă*l0ӈ,J[99Sde9vǷ&BAא?X{I4,+wؖ:¥@~Sn0 }WhFogWYbl-Pt.--;i&p0 -%l,ΗHg <TG, =) pz"e7PQn4leo9lqh?ƣTIǦ^LRV?gr-'ʲ-HDy_ {+NJZ5MɎIu3 $YUB 慮W[q T]u>͈ [Z r%&L&%>. 47491P~GhJmЏo$a+s4@fh龹'0EcäX"{J653t?|=/RЎN.4C'4 U{NQ*i'#LxrGՆ˗"9I&x- =Ь5N)IhKT8KO`0*A86c]݋e{edV9僆jrBŗԏ J  ܒꮯ=0Nwķ5o,DX^ҭpbEVx }} ƊڒGLݶ-BJmzV@84P[.s7>8c ).|HTYjmyķB9dC} tGjC+QN˧7t~VضЄ7m,͈ct*_8E=NOߒwU+äAnܤ, &(5:-s{̉֋?.6k~B^q:M8san~JvD4yBED]IޠJ5#Oڄ(f,<b~/Eb *?\_njVb҇e.q>7fguBRm z|ރ6@;bzNYʬ^8qz@N wM`.x*[j hqkhRFRޓ~ c+s)ϧ)!)cJQI9M.ߙ?gk/P5ǀv06L䎀c ×˙@;pbЄs ݱ}g@?POX+2f 9JUA0vQYzB q$ iHGRsjg25 #9G=Uߛ͘ܔ7T7mGBVr6Wmo6_qˁ-7lΒ5I]@@m17YHʩHNGj8K,%ix.gRy:TτT.GX%ng8[ g\ "X1 .n^F0&3=ci*8w9|3)t:ã;L0)V>sT=Kɖ*-yt/4x B+2?YLs{!3t3N:/"ZQ:A6[p*;Ɲws|QV;G4(K!"Ar6Y9cf[i1M58%AۢLRLp5TJ?2&&(׶^ &Z[#'_H^% j.0$yhyCR49RVHFֿR0~X$'ȪVQ6;R솗Amg4 B<.Pm q|3DC ޻)-+}f\|P H|IUKKQ-3Й+riIQUؠ>(᮫Mڼ0=KǂW$S԰NgK;@_9nI }]wny璅je kt qm_Fboͮ~6+BAb? =NP 5^?N+QK|pEcU_ SM0WL0"RU5*wD9T/ ]~}8- Shot x|vNo_+~ROfVn6)X `YǁVannoEPbB9Z-}4})ȿk0 SÙo>~CPXz* cJTU"zP,ޡLT:yb?EaBI,ypUB9DeM iXp\"K񥀒 ݐ,V6Ȝ'#_]RWK]Hp/_)8K+QZr\kUU'4Q|m$f&1q{#"{.cOPe#rSaXi4%Zg4vw\!ˏ'MC+B`ca#D [uBw挒q6m4 VPbʶtvV.~^.ִH]&?c:۠:Cd#5=LFڡ/?OiBk ɴYZqܞX6t&R:R__I}}Ā b) R6ܑXykѭ;6Azw+U;KKK{Uq8X^p6mN%e4u==~ݎ{*^eF#^{O{6-R;b}lZo`i?LfwՐN*NS^bHPߡ=JM߿"COHUH o&Mw]5K+45j||-\^gz7d1z2 l q, V;i~ չhT}Or?>WF;G;v|ғ>p%Dۘm}u3Qu÷)\ XKs7WR5C[I%HRV$I `ZLuOL[%+O~+kѬ1+te I⚫^dG''Es 0+AFrYpKU o6ےC)r^Y19` i!Qnofa!J% kDn#F{aM!QJ"J>4\} WxdYY"y-9F2uS2C<¬@ ÁWKY@ ΎJn,'OԯR}Fd˗FGxybE ټ_JzAJrݣם Q~~vxϪ q^/|T:Y>pUSGP?Q(oKSuL **+QܬW\AK]~@[ JRsFawa bҠiBޘ~>0X@d/_[G%CgJy~pRp(Y$3۱Oso#dhbXQo ef*miΙZTuݥ=e ^ħ7oJ_:-I5mIjU+8gsQ)9|!p,:eL]sMQ(ϫcixo{@kL44jU~@NF;?^k`G)mB9p1dàΙj-2;gQ8|,+HoakS9a` aP1ҮMA}}:! 0qqi9 hîX5Qs I4yd辤JܡE0ok2hֲWҶPk㾻815.f4i[#H:|Ȑl8Vثk- mλ(pu "IKѴf7pb zRK1P;hy>sSU>N5O9:Fp1|?D۷tl3: ]^g 1

~=p־[= iSZ B&/ǻpK}VӺ׿ړ0(*YYo7~ׯ$Lj$MP_ii`9C.%]*ɵ#^{H+[=p#b8װwW} }),qB **oh5vv L)"_{JN茀I;G)Ŕ4'b¡Cx>~8=>.Kihf8\ib|]DkO҈~ /D4-;y~tŎ8Ls#=:\QMX>Kq*/UB`RD7.Pτ')@>d@9ZȖ}NӳZ>5N _eBIc[р U5`Ϥ 6Ca E񮄇};MSYз QnU(|7+: VOX\Ҭ>|B,ٯ T>M K-nةƚ ~.7pT5}zKG=Kjml~QRIϦbs1aXJ2wNL2>Pѭ"~*{{`"Oslr[46$!VZ/9>62FN/2 !<tw*piL|͘B( Y ap@kߣ,M 1)s1)>]L 5Mu3Ua{3ii<#PN=)@/4 B ~Ztr}*̋Jh"1ů,Wv/e9=pk_T tѼruO6vEIZt_řֽ<@OBl*-vYȣ;ܲԗHL?II)@Ԑ踏i8%ԎJYD`qocfϘdl8;KVJB@MPi@aPFjUAB#f兛_ᛚũ$ILȘN=ncTOeƳFvT8C7Aӫf'T!~0U >MB#QI+{=j8iʾ ڪ7N\7̛Xxox?| =;-VQ|r'^ڞM >C~XwK Wp槅렡d';E-=R'pe(C:*jO'֭_'F<l[3ƣSG<sUCvt2/!7N/* Copyright 2015 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ .picture img { border-radius: 50%; max-height: 100%; max-width: 100%; } .details { padding: 0 24px; } #picture-container { align-items: center; display: flex; justify-content: center; padding-bottom: 32px; padding-top: 24px; } .picture { height: 96px; margin-inline-start: 84px; position: relative; width: 96px; } #profile-picture, .checkmark-circle { position: absolute; } .message-container { display: flex; margin-bottom: 16px; } .message-container:last-child { margin-bottom: 32px; } .message-container .logo { background-size: cover; flex-shrink: 0; height: 20px; margin-inline-end: 20px; position: relative; top: -2px; width: 20px; } #chrome-logo { background-image: url(../../../../../ui/webui/resources/images/200-logo_chrome.png); } #googleg-logo { background-image: url(../../../../../ui/webui/resources/images/200-logo_googleg.png); } .message-container .title { font-weight: 500; margin-bottom: 4px; } .message-container .body { color: #646464; } .message-container .text { line-height: 20px; } .message-container #activityControlsCheckbox { margin-inline-start: 40px; } #undoButton { margin-inline-start: 8px; } #syncDisabledDetails { line-height: 20px; margin-bottom: 8px; margin-top: 16px; padding: 0 24px; } #illustration { height: 96px; margin: 0 auto; position: relative; width: 264px; } #checkmark-circle { background: rgb(66, 133, 244); border: 2px solid #fff; border-radius: 50%; bottom: 0; height: 24px; position: absolute; right: 0; transform: scale(0); width: 24px; } .loaded #checkmark-circle { animation: scale-circle 300ms cubic-bezier(0, 0, 0.2, 1) forwards; } @keyframes scale-circle { from { transform: scale(0); } to { transform: scale(1); } } #checkmark-check { left: 5px; position: absolute; top: 7px; } .loaded #checkmark-path { animation: draw-path 300ms cubic-bezier(0, 0, 0.2, 1) 100ms forwards; } @keyframes draw-path { from { stroke-dashoffset: 16; } to { stroke-dashoffset: 0; } } #icons { height: 96px; position: absolute; width: 264px; } #icons > div { animation-delay: 200ms; animation-duration: 1.4s; animation-fill-mode: forwards; animation-timing-function: cubic-bezier(0.25, 0.45, 0.4, 0.7); background-size: cover; opacity: 0; position: absolute; } #icon-bookmarks { background: url(../../../../../ui/webui/resources/images/icon_bookmarks.svg); height: 36px; left: 58px; top: 0; width: 36px; } #icon-extensions { background: url(../../../../../ui/webui/resources/images/icon_extensions.svg); height: 24px; left: 30px; top: 30px; width: 24px; } #icon-passwords { background: url(../../../../../ui/webui/resources/images/icon_passwords.svg); height: 30px; left: 38px; top: 66px; width: 40px; } #icon-history { background: url(../../../../../ui/webui/resources/images/icon_history.svg); height: 36px; left: 190px; top: 6px; width: 36px; } #icon-tabs { background: url(../../../../../ui/webui/resources/images/icon_tabs.svg); height: 24px; left: 222px; top: 44px; width: 24px; } #icon-themes { background: url(../../../../../ui/webui/resources/images/icon_themes.svg); height: 30px; left: 184px; top: 62px; width: 32px; } #icon-circle-open { border: 2px solid #000; border-radius: 50%; height: 8px; left: 6px; top: 56px; width: 8px; } .icon-circle { background: #000; border-radius: 50%; height: 4px; width: 4px; } #icon-circle-1 { left: 64px; top: 50px; } #icon-circle-2 { left: 178px; top: 18px; } #icon-circle-3 { left: 194px; top: 50px; } #icon-circle-4 { left: 258px; top: 36px; } .loaded .fade-top-left { animation-name: fade-in-icon-top-left; } .loaded .fade-top-right { animation-name: fade-in-icon-top-right; } .loaded .fade-middle-left { animation-name: fade-in-icon-middle-left; } .loaded .fade-middle-right { animation-name: fade-in-icon-middle-right; } .loaded .fade-bottom-left { animation-name: fade-in-icon-bottom-left; } .loaded .fade-bottom-right { animation-name: fade-in-icon-bottom-right; } @keyframes fade-in-icon-top-left { from { opacity: 0; transform: translate(0, 0); } to { opacity: 0.1; transform: translate(-4px, -4px); } } @keyframes fade-in-icon-top-right { from { opacity: 0; transform: translate(0, 0); } to { opacity: 0.1; transform: translate(4px, -4px); } } @keyframes fade-in-icon-middle-left { from { opacity: 0; transform: translate(0, 0); } to { opacity: 0.1; transform: translate(-4px, 0); } } @keyframes fade-in-icon-middle-right { from { opacity: 0; transform: translate(0, 0); } to { opacity: 0.1; transform: translate(4px, 0); } } @keyframes fade-in-icon-bottom-left { from { opacity: 0; transform: translate(0, 0); } to { opacity: 0.1; transform: translate(-4px, 4px); } } @keyframes fade-in-icon-bottom-right { from { opacity: 0; transform: translate(0, 0); } to { opacity: 0.1; transform: translate(4px, 4px); } }

$i18n{syncConfirmationTitle}
$i18n{syncConfirmationChromeSyncTitle}
$i18n{syncConfirmationChromeSyncBody}
$i18n{syncConfirmationPersonalizeServicesTitle}
$i18n{syncConfirmationPersonalizeServicesBody}
$i18nRaw{syncConfirmationSyncSettingsLinkBody}
$i18n{syncDisabledConfirmationDetails}
$i18n{syncConfirmationConfirmLabel} $i18n{syncConfirmationUndoLabel}
/* Copyright 2015 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ cr.define('sync.confirmation', function() { 'use strict'; /** * @param {!Array} path Path of the click event. Must contain * a consent confirmation element. * @return {string} The text of the consent confirmation element. * @private */ function getConsentConfirmation(path) { let consentConfirmation; for (const element of path) { if (element.nodeType !== Node.DOCUMENT_FRAGMENT_NODE && element.hasAttribute('consent-confirmation')) { return element.innerHTML.trim(); } } assertNotReached('No consent confirmation element found.'); return ''; } /** @return {!Array} Text of the consent description elements. */ function getConsentDescription() { const consentDescription = Array.from(document.querySelectorAll('[consent-description]')) .filter(element => element.clientWidth * element.clientHeight > 0) .map(element => element.innerHTML.trim()); assert(consentDescription); return consentDescription; } function onConfirm(e) { chrome.send( 'confirm', [getConsentDescription(), getConsentConfirmation(e.path)]); } function onUndo(e) { chrome.send('undo'); } function onGoToSettings(e) { chrome.send( 'goToSettings', [getConsentDescription(), getConsentConfirmation(e.path)]); } function initialize() { document.addEventListener('keydown', onKeyDown); $('confirmButton').addEventListener('click', onConfirm); $('undoButton').addEventListener('click', onUndo); if (loadTimeData.getBoolean('isSyncAllowed')) { $('settingsLink').addEventListener('click', onGoToSettings); $('profile-picture').addEventListener('load', onPictureLoaded); $('syncDisabledDetails').hidden = true; } else { $('syncConfirmationDetails').hidden = true; } // Prefer using |document.body.offsetHeight| instead of // |document.body.scrollHeight| as it returns the correct height of the // even when the page zoom in Chrome is different than 100%. chrome.send('initializedWithSize', [document.body.offsetHeight]); } function clearFocus() { document.activeElement.blur(); } function setUserImageURL(url) { if (loadTimeData.getBoolean('isSyncAllowed')) { $('profile-picture').src = url; } } function onPictureLoaded(e) { if (loadTimeData.getBoolean('isSyncAllowed')) { $('picture-container').classList.add('loaded'); } } function onKeyDown(e) { // If the currently focused element isn't something that performs an action // on "enter" being pressed and the user hits "enter", perform the default // action of the dialog, which is "OK, Got It". if (e.key == 'Enter' && !/^(A|PAPER-(BUTTON|CHECKBOX))$/.test(document.activeElement.tagName)) { $('confirmButton').click(); e.preventDefault(); } } // TODO(scottchen): clearFocus and setUserImageURL are called directly by the // C++ handler. C++ handlers should not be calling JS functions by name // anymore. They should be firing events with FireWebuiListener and have the // page itself decide whether to listen or not listen to the event. return { clearFocus: clearFocus, initialize: initialize, setUserImageURL: setUserImageURL }; }); document.addEventListener('DOMContentLoaded', sync.confirmation.initialize); /* Copyright 2017 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ cr.define('sync.confirmation', function() { 'use strict'; function initialize() { const syncConfirmationBrowserProxy = sync.confirmation.SyncConfirmationBrowserProxyImpl.getInstance(); // Prefer using |document.body.offsetHeight| instead of // |document.body.scrollHeight| as it returns the correct height of the // even when the page zoom in Chrome is different than 100%. syncConfirmationBrowserProxy.initializedWithSize( [document.body.offsetHeight]); // The web dialog size has been initialized, so reset the body width to // auto. This makes sure that the body only takes up the viewable width, // e.g. when there is a scrollbar. document.body.style.width = 'auto'; } function clearFocus() { document.activeElement.blur(); } return { clearFocus: clearFocus, initialize: initialize, }; }); document.addEventListener('DOMContentLoaded', sync.confirmation.initialize); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. (function() { // Since all we want here is forwarding of certain commands, all can be done // in the anonymous function's scope. function wireUpWindow() { $('launch-button').addEventListener('click', function() { chrome.send('SetAsDefaultBrowser:LaunchSetDefaultBrowserFlow'); }); } window.addEventListener('DOMContentLoaded', wireUpWindow); })(); $i18n{pageTitle}

$i18n{flowTitle}

$i18n{flowDescription}

$i18n{chromeLogoString}
// Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; mojo.internal.exportModule('skia.mojom'); /** * @const { {$: !mojo.internal.MojomType} } * @export */ skia.mojom.ColorTypeSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ skia.mojom.ColorType = { UNKNOWN: 0, ALPHA_8: 0, RGB_565: 0, ARGB_4444: 0, RGBA_8888: 0, BGRA_8888: 0, INDEX_8: 0, GRAY_8: 0, MIN_VALUE: 0, MAX_VALUE: 7, }; /** @suppress {checkTypes} */ skia.mojom.ColorType.UNKNOWN = 0; /** @suppress {checkTypes} */ skia.mojom.ColorType.ALPHA_8 = skia.mojom.ColorType.UNKNOWN + 1; /** @suppress {checkTypes} */ skia.mojom.ColorType.RGB_565 = skia.mojom.ColorType.ALPHA_8 + 1; /** @suppress {checkTypes} */ skia.mojom.ColorType.ARGB_4444 = skia.mojom.ColorType.RGB_565 + 1; /** @suppress {checkTypes} */ skia.mojom.ColorType.RGBA_8888 = skia.mojom.ColorType.ARGB_4444 + 1; /** @suppress {checkTypes} */ skia.mojom.ColorType.BGRA_8888 = skia.mojom.ColorType.RGBA_8888 + 1; /** @suppress {checkTypes} */ skia.mojom.ColorType.INDEX_8 = skia.mojom.ColorType.BGRA_8888 + 1; /** @suppress {checkTypes} */ skia.mojom.ColorType.GRAY_8 = skia.mojom.ColorType.INDEX_8 + 1; /** * @const { {$: !mojo.internal.MojomType} } * @export */ skia.mojom.AlphaTypeSpec = { $: mojo.internal.Enum() }; /** * @enum {number} * @export */ skia.mojom.AlphaType = { UNKNOWN: 0, ALPHA_TYPE_OPAQUE: 0, PREMUL: 0, UNPREMUL: 0, MIN_VALUE: 0, MAX_VALUE: 3, }; /** @suppress {checkTypes} */ skia.mojom.AlphaType.UNKNOWN = 0; /** @suppress {checkTypes} */ skia.mojom.AlphaType.ALPHA_TYPE_OPAQUE = skia.mojom.AlphaType.UNKNOWN + 1; /** @suppress {checkTypes} */ skia.mojom.AlphaType.PREMUL = skia.mojom.AlphaType.ALPHA_TYPE_OPAQUE + 1; /** @suppress {checkTypes} */ skia.mojom.AlphaType.UNPREMUL = skia.mojom.AlphaType.PREMUL + 1; /** * @const { {$:!mojo.internal.MojomType}} * @export */ skia.mojom.ImageInfoSpec = { $: /** @type {!mojo.internal.MojomType} */ ({}) }; mojo.internal.Struct( skia.mojom.ImageInfoSpec.$, 'ImageInfo', 24, [ mojo.internal.StructField( 'colorType', 0, 0, skia.mojom.ColorTypeSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'alphaType', 4, 0, skia.mojom.AlphaTypeSpec.$, 0, false /* nullable */), mojo.internal.StructField( 'serializedColorSpace', 8, 0, mojo.internal.Array(mojo.internal.Uint8, false), null, false /* nullable */), mojo.internal.StructField( 'width', 16, 0, mojo.internal.Uint32, 0, false /* nullable */), mojo.internal.StructField( 'height', 20, 0, mojo.internal.Uint32, 0, false /* nullable */), ]); /* Copyright 2015 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ :host > * { --dialog-padding-end: 26px; --dialog-padding-start: 16px; --dialog-width: 340px; --navigation-icon-button-size: 36px; --non-navigation-icon-size: 16px; -webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: transparent; font-family: 'Roboto', 'Noto', sans-serif; } .button { color: var(--paper-blue-700); cursor: pointer; text-align: center; } [hidden] { display: none !important; } .ellipsis { overflow: hidden; padding: 0 1%; text-overflow: ellipsis; white-space: nowrap; } /* Copyright 2015 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ html { /* Remove 300ms delay for 'click' event, when using touch interface. */ touch-action: manipulation; } body { font-size: 0.75em; margin: 0; } #media-router-container { background-color: white; box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 1px 8px 0 rgba(0, 0, 0, 0.12), 0 3px 3px -2px rgba(0, 0, 0, 0.4); display: flex; flex-direction: column; margin-bottom: 1px; width: calc(var(--dialog-width) - 1px); } // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Any strings used here will already be localized. Values such as // CastMode.type or IDs will be defined elsewhere and determined later. cr.exportPath('media_router'); /** * This corresponds to the C++ MediaCastMode, with the exception of AUTO. * See below for details. Note to support fast bitset operations, the values * here are (1 << [corresponding value in MR]). * @enum {number} */ media_router.CastModeType = { // Note: AUTO mode is only used to configure the sink list container to show // all sinks. Individual sinks are configured with a specific cast mode // (PRESENTATION, TAB_MIRROR, DESKTOP_MIRROR). AUTO: -1, PRESENTATION: 0x1, TAB_MIRROR: 0x2, DESKTOP_MIRROR: 0x4, LOCAL_FILE: 0x8, }; /** * The ESC key maps to KeyboardEvent.key value 'Escape'. * @const {string} */ media_router.KEY_ESC = 'Escape'; /** * This corresponds to the C++ MediaRouterMetrics * MediaRouterRouteCreationOutcome. * @enum {number} */ media_router.MediaRouterRouteCreationOutcome = { SUCCESS: 0, FAILURE_NO_ROUTE: 1, FAILURE_INVALID_SINK: 2, }; /** * This corresponds to the C++ MediaRouterMetrics MediaRouterUserAction. * @enum {number} */ media_router.MediaRouterUserAction = { CHANGE_MODE: 0, START_LOCAL: 1, STOP_LOCAL: 2, CLOSE: 3, STATUS_REMOTE: 4, REPLACE_LOCAL_ROUTE: 5, }; /** * The possible states of the Media Router dialog. Used to determine which * components to show. * @enum {string} */ media_router.MediaRouterView = { CAST_MODE_LIST: 'cast-mode-list', FILTER: 'filter', ISSUE: 'issue', ROUTE_DETAILS: 'route-details', SINK_LIST: 'sink-list', }; /** * The minimum number of sinks to have to enable the search input strictly for * filtering (i.e. the Media Router doesn't support search so the search input * only filters existing sinks). * @const {number} */ media_router.MINIMUM_SINKS_FOR_SEARCH = 20; /** * The states that media can be in. * @enum {number} */ media_router.PlayState = { PLAYING: 0, PAUSED: 1, BUFFERING: 2, }; /** * This corresponds to the C++ MediaSink IconType, and the order must stay in * sync. * @enum {number} */ media_router.SinkIconType = { CAST: 0, CAST_AUDIO_GROUP: 1, CAST_AUDIO: 2, MEETING: 3, HANGOUT: 4, EDUCATION: 5, WIRED_DISPLAY: 6, GENERIC: 7, }; /** * @enum {string} */ media_router.SinkStatus = { IDLE: 'idle', ACTIVE: 'active', REQUEST_PENDING: 'request_pending' }; cr.define('media_router', function() { 'use strict'; /** * @param {number} type The type of cast mode. * @param {string} description The description of the cast mode. * @param {?string} host The hostname of the site to cast. * @param {boolean} isForced True if the mode is forced. * @constructor * @struct */ var CastMode = function(type, description, host, isForced) { /** @type {number} */ this.type = type; /** @type {string} */ this.description = description; /** @type {?string} */ this.host = host || null; /** @type {boolean} */ this.isForced = isForced; }; /** * Placeholder object for AUTO cast mode. See comment in CastModeType. * @const {!media_router.CastMode} */ var AUTO_CAST_MODE = new CastMode( media_router.CastModeType.AUTO, loadTimeData.getString('autoCastMode'), null, false); /** * @param {number} id The ID of this issue. * @param {string} title The issue title. * @param {string} message The issue message. * @param {number} defaultActionType The type of default action. * @param {number|undefined} secondaryActionType The type of optional action. * @param {?string} routeId The route ID to which this issue * pertains. If not set, this is a global issue. * @param {boolean} isBlocking True if this issue blocks other UI. * @param {?number} helpPageId The numeric help center ID. * @constructor * @struct */ var Issue = function( id, title, message, defaultActionType, secondaryActionType, routeId, isBlocking, helpPageId) { /** @type {number} */ this.id = id; /** @type {string} */ this.title = title; /** @type {string} */ this.message = message; /** @type {number} */ this.defaultActionType = defaultActionType; /** @type {number|undefined} */ this.secondaryActionType = secondaryActionType; /** @type {?string} */ this.routeId = routeId; /** @type {boolean} */ this.isBlocking = isBlocking; /** @type {?number} */ this.helpPageId = helpPageId; }; /** * @param {string} id The media route ID. * @param {string} sinkId The ID of the media sink running this route. * @param {string} description The short description of this route. * @param {?number} tabId The ID of the tab in which web app is running and * accessing the route. * @param {boolean} isLocal True if this is a locally created route. * @param {boolean} canJoin True if this route can be joined. * @param {?string} customControllerPath non-empty if this route has custom * controller. * @constructor * @struct */ var Route = function( id, sinkId, description, tabId, isLocal, canJoin, customControllerPath) { /** @type {string} */ this.id = id; /** @type {string} */ this.sinkId = sinkId; /** @type {string} */ this.description = description; /** @type {?number} */ this.tabId = tabId; /** @type {boolean} */ this.isLocal = isLocal; /** @type {boolean} */ this.canJoin = canJoin; /** @type {number|undefined} */ this.currentCastMode = undefined; /** @type {?string} */ this.customControllerPath = customControllerPath; /** @type {boolean} */ this.supportsWebUiController = false; }; /** * @param {string} title The title of the route. * @param {boolean} canPlayPause Whether the route can be played/paused. * @param {boolean} canMute Whether the route can be muted/unmuted. * @param {boolean} canSetVolume Whether the route volume can be changed. * @param {boolean} canSeek Whether the route's playback position can be * changed. * @param {boolean} isPaused Whether the route is paused. * @param {boolean} isMuted Whether the route is muted. * @param {number} volume The route's volume, between 0 and 1. * @param {number} duration The route's duration in seconds. * @param {number} currentTime The route's current position in seconds. * Must not be greater than |duration|. * @param {!{mediaRemotingEnabled: boolean}=} mirroringExtraData Only set for * mirroring routes. * @param {!{localPresent: boolean}=} hangoutsExtraData Only set for Hangouts * routes. * @constructor * @struct */ var RouteStatus = function( title = '', canPlayPause = false, canMute = false, canSetVolume = false, canSeek = false, playState = media_router.PlayState.PLAYING, isPaused = false, isMuted = false, volume = 0, duration = 0, currentTime = 0, hangoutsExtraData = undefined, mirroringExtraData = undefined) { /** @type {string} */ this.title = title; /** @type {boolean} */ this.canPlayPause = canPlayPause; /** @type {boolean} */ this.canMute = canMute; /** @type {boolean} */ this.canSetVolume = canSetVolume; /** @type {boolean} */ this.canSeek = canSeek; /** @type {media_router.PlayState} */ this.playState = playState; /** @type {boolean} */ this.isMuted = isMuted; /** @type {number} */ this.volume = volume; /** @type {number} */ this.duration = duration; /** @type {number} */ this.currentTime = currentTime; /** @type {!{localPresent: boolean}|undefined} */ this.hangoutsExtraData = hangoutsExtraData; /** @type {!{mediaRemotingEnabled: boolean}|undefined} */ this.mirroringExtraData = mirroringExtraData; }; /** * @param {string} id The ID of the media sink. * @param {string} name The name of the sink. * @param {?string} description Optional description of the sink. * @param {?string} domain Optional domain of the sink. * @param {media_router.SinkIconType} iconType the type of icon for the sink. * @param {media_router.SinkStatus} status The readiness state of the sink. * @param {number} castModes Bitset of cast modes compatible with the sink. * @constructor * @struct */ var Sink = function( id, name, description, domain, iconType, status, castModes) { /** @type {string} */ this.id = id; /** @type {string} */ this.name = name; /** @type {?string} */ this.description = description; /** @type {?string} */ this.domain = domain; /** @type {!media_router.SinkIconType} */ this.iconType = iconType; /** @type {!media_router.SinkStatus} */ this.status = status; /** @type {number} */ this.castModes = castModes; /** @type {boolean} */ this.isPseudoSink = false; }; /** * @param {number} tabId The current tab ID. * @param {string} domain The domain of the current tab. * @constructor * @struct */ var TabInfo = function(tabId, domain) { /** @type {number} */ this.tabId = tabId; /** @type {string} */ this.domain = domain; }; return { AUTO_CAST_MODE: AUTO_CAST_MODE, CastMode: CastMode, Issue: Issue, Route: Route, RouteStatus: RouteStatus, Sink: Sink, TabInfo: TabInfo, }; }); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // API invoked by this UI to communicate with the browser WebUI message handler. cr.define('media_router.browserApi', function() { 'use strict'; /** * Indicates that the user has acknowledged the first run flow. * * @param {boolean} optedIntoCloudServices Whether or not the user opted into * cloud services. */ function acknowledgeFirstRunFlow(optedIntoCloudServices) { chrome.send('acknowledgeFirstRunFlow', [optedIntoCloudServices]); } /** * Acts on the given issue. * * @param {number} issueId * @param {number} actionType Type of action that the user clicked. * @param {?number} helpPageId The numeric help center ID. */ function actOnIssue(issueId, actionType, helpPageId) { chrome.send( 'actOnIssue', [{issueId: issueId, actionType: actionType, helpPageId: helpPageId}]); } /** * Modifies |route| by changing its source to the one identified by * |selectedCastMode|. * * @param {!media_router.Route} route The route being modified. * @param {number} selectedCastMode The value of the cast mode the user * selected. */ function changeRouteSource(route, selectedCastMode) { chrome.send( 'requestRoute', [{sinkId: route.sinkId, selectedCastMode: selectedCastMode}]); } /** * Closes the dialog. * * @param {boolean} pressEscToClose Whether the user pressed ESC to close the * dialog. */ function closeDialog(pressEscToClose) { chrome.send('closeDialog', [pressEscToClose]); } /** * Closes the given route. * * @param {!media_router.Route} route */ function closeRoute(route) { chrome.send('closeRoute', [{routeId: route.id, isLocal: route.isLocal}]); } /** * Joins the given route. * * @param {!media_router.Route} route */ function joinRoute(route) { chrome.send('joinRoute', [{sinkId: route.sinkId, routeId: route.id}]); } /** * Indicates that the initial data has been received. */ function onInitialDataReceived() { chrome.send('onInitialDataReceived'); } /** * Reports that the route details view was closed. */ function onMediaControllerClosed() { chrome.send('onMediaControllerClosed'); } /** * Reports that the route details view was opened for |routeId|. * * @param {string} routeId */ function onMediaControllerAvailable(routeId) { chrome.send('onMediaControllerAvailable', [{routeId: routeId}]); } /** * Sends a command to pause the route shown in the route details view. */ function pauseCurrentMedia() { chrome.send('pauseCurrentMedia'); } /** * Sends a command to play the route shown in the route details view. */ function playCurrentMedia() { chrome.send('playCurrentMedia'); } /** * Reports when the user clicks outside the dialog. */ function reportBlur() { chrome.send('reportBlur'); } /** * Reports the index of the selected sink. * * @param {number} sinkIndex */ function reportClickedSinkIndex(sinkIndex) { chrome.send('reportClickedSinkIndex', [sinkIndex]); } /** * Reports that the user used the filter input. */ function reportFilter() { chrome.send('reportFilter'); } /** * Reports the initial dialog view. * * @param {string} view */ function reportInitialState(view) { chrome.send('reportInitialState', [view]); } /** * Reports the initial action the user took. * * @param {number} action */ function reportInitialAction(action) { chrome.send('reportInitialAction', [action]); } /** * Reports the navigation to the specified view. * * @param {string} view */ function reportNavigateToView(view) { chrome.send('reportNavigateToView', [view]); } /** * Reports whether or not a route was created successfully. * * @param {boolean} success */ function reportRouteCreation(success) { chrome.send('reportRouteCreation', [success]); } /** * Reports the outcome of a create route response. * * @param {number} outcome */ function reportRouteCreationOutcome(outcome) { chrome.send('reportRouteCreationOutcome', [outcome]); } /** * Reports the cast mode that the user selected. * * @param {number} castModeType */ function reportSelectedCastMode(castModeType) { chrome.send('reportSelectedCastMode', [castModeType]); } /** * Reports the current number of sinks. * * @param {number} sinkCount */ function reportSinkCount(sinkCount) { chrome.send('reportSinkCount', [sinkCount]); } /** * Reports the time it took for the user to select a sink after the sink list * is populated and shown. * * @param {number} timeMs */ function reportTimeToClickSink(timeMs) { chrome.send('reportTimeToClickSink', [timeMs]); } /** * Reports the time, in ms, it took for the user to close the dialog without * taking any other action. * * @param {number} timeMs */ function reportTimeToInitialActionClose(timeMs) { chrome.send('reportTimeToInitialActionClose', [timeMs]); } /** * Reports the time, in ms, it took the WebUI route controller to load media * status info. * * @param {number} timeMs */ function reportWebUIRouteControllerLoaded(timeMs) { chrome.send('reportWebUIRouteControllerLoaded', [timeMs]); } /** * Requests data to initialize the WebUI with. * The data will be returned via media_router.ui.setInitialData. */ function requestInitialData() { chrome.send('requestInitialData'); } /** * Requests that a media route be started with the given sink. * * @param {string} sinkId The sink ID. * @param {number} selectedCastMode The value of the cast mode the user * selected. */ function requestRoute(sinkId, selectedCastMode) { chrome.send( 'requestRoute', [{sinkId: sinkId, selectedCastMode: selectedCastMode}]); } /** * Requests that the media router search all providers for a sink matching * |searchCriteria| that can be used with the media source associated with the * cast mode |selectedCastMode|. If such a sink is found, a route is also * created between the sink and the media source. * * @param {string} sinkId Sink ID of the pseudo sink generating the request. * @param {string} searchCriteria Search criteria for the route providers. * @param {string} domain User's current hosted domain. * @param {number} selectedCastMode The value of the cast mode to be used with * the sink. */ function searchSinksAndCreateRoute( sinkId, searchCriteria, domain, selectedCastMode) { chrome.send('searchSinksAndCreateRoute', [{ sinkId: sinkId, searchCriteria: searchCriteria, domain: domain, selectedCastMode: selectedCastMode }]); } /** * Sends a command to seek the route shown in the route details view. * * @param {number} time The new current time in seconds. */ function seekCurrentMedia(time) { chrome.send('seekCurrentMedia', [{time: time}]); } /** * Sends a command to open a file dialog and allow the user to choose a local * media file. */ function selectLocalMediaFile() { chrome.send('selectLocalMediaFile'); } /** * Sends a command to mute or unmute the route shown in the route details * view. * * @param {boolean} mute Mute the route if true, unmute it if false. */ function setCurrentMediaMute(mute) { chrome.send('setCurrentMediaMute', [{mute: mute}]); } /** * Sends a command to change the volume of the route shown in the route * details view. * * @param {number} volume The volume between 0 and 1. */ function setCurrentMediaVolume(volume) { chrome.send('setCurrentMediaVolume', [{volume: volume}]); } /** * Sets the local present mode of the Hangouts associated with the current * route. * @param {boolean} localPresent */ function setHangoutsLocalPresent(localPresent) { chrome.send('hangouts.setLocalPresent', [localPresent]); } /** * Sends a command to change the Media Remoting enabled value associated with * current route. * @param {boolean} enabled */ function setMediaRemotingEnabled(enabled) { chrome.send('setMediaRemotingEnabled', [enabled]); } return { acknowledgeFirstRunFlow: acknowledgeFirstRunFlow, actOnIssue: actOnIssue, changeRouteSource: changeRouteSource, closeDialog: closeDialog, closeRoute: closeRoute, joinRoute: joinRoute, onInitialDataReceived: onInitialDataReceived, onMediaControllerClosed: onMediaControllerClosed, onMediaControllerAvailable: onMediaControllerAvailable, pauseCurrentMedia: pauseCurrentMedia, playCurrentMedia: playCurrentMedia, reportBlur: reportBlur, reportClickedSinkIndex: reportClickedSinkIndex, reportFilter: reportFilter, reportInitialAction: reportInitialAction, reportInitialState: reportInitialState, reportNavigateToView: reportNavigateToView, reportRouteCreation: reportRouteCreation, reportRouteCreationOutcome: reportRouteCreationOutcome, reportSelectedCastMode: reportSelectedCastMode, reportSinkCount: reportSinkCount, reportTimeToClickSink: reportTimeToClickSink, reportTimeToInitialActionClose: reportTimeToInitialActionClose, reportWebUIRouteControllerLoaded: reportWebUIRouteControllerLoaded, requestInitialData: requestInitialData, requestRoute: requestRoute, searchSinksAndCreateRoute: searchSinksAndCreateRoute, seekCurrentMedia: seekCurrentMedia, selectLocalMediaFile: selectLocalMediaFile, setCurrentMediaMute: setCurrentMediaMute, setCurrentMediaVolume: setCurrentMediaVolume, setHangoutsLocalPresent: setHangoutsLocalPresent, setMediaRemotingEnabled: setMediaRemotingEnabled }; }); // // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Any strings used here will already be localized. Values such as // CastMode.type or IDs will be defined elsewhere and determined later. cr.exportPath('media_router'); /** * This corresponds to the C++ MediaCastMode, with the exception of AUTO. * See below for details. Note to support fast bitset operations, the values * here are (1 << [corresponding value in MR]). * @enum {number} */ media_router.CastModeType = { // Note: AUTO mode is only used to configure the sink list container to show // all sinks. Individual sinks are configured with a specific cast mode // (PRESENTATION, TAB_MIRROR, DESKTOP_MIRROR). AUTO: -1, PRESENTATION: 0x1, TAB_MIRROR: 0x2, DESKTOP_MIRROR: 0x4, LOCAL_FILE: 0x8, }; /** * The ESC key maps to KeyboardEvent.key value 'Escape'. * @const {string} */ media_router.KEY_ESC = 'Escape'; /** * This corresponds to the C++ MediaRouterMetrics * MediaRouterRouteCreationOutcome. * @enum {number} */ media_router.MediaRouterRouteCreationOutcome = { SUCCESS: 0, FAILURE_NO_ROUTE: 1, FAILURE_INVALID_SINK: 2, }; /** * This corresponds to the C++ MediaRouterMetrics MediaRouterUserAction. * @enum {number} */ media_router.MediaRouterUserAction = { CHANGE_MODE: 0, START_LOCAL: 1, STOP_LOCAL: 2, CLOSE: 3, STATUS_REMOTE: 4, REPLACE_LOCAL_ROUTE: 5, }; /** * The possible states of the Media Router dialog. Used to determine which * components to show. * @enum {string} */ media_router.MediaRouterView = { CAST_MODE_LIST: 'cast-mode-list', FILTER: 'filter', ISSUE: 'issue', ROUTE_DETAILS: 'route-details', SINK_LIST: 'sink-list', }; /** * The minimum number of sinks to have to enable the search input strictly for * filtering (i.e. the Media Router doesn't support search so the search input * only filters existing sinks). * @const {number} */ media_router.MINIMUM_SINKS_FOR_SEARCH = 20; /** * The states that media can be in. * @enum {number} */ media_router.PlayState = { PLAYING: 0, PAUSED: 1, BUFFERING: 2, }; /** * This corresponds to the C++ MediaSink IconType, and the order must stay in * sync. * @enum {number} */ media_router.SinkIconType = { CAST: 0, CAST_AUDIO_GROUP: 1, CAST_AUDIO: 2, MEETING: 3, HANGOUT: 4, EDUCATION: 5, WIRED_DISPLAY: 6, GENERIC: 7, }; /** * @enum {string} */ media_router.SinkStatus = { IDLE: 'idle', ACTIVE: 'active', REQUEST_PENDING: 'request_pending' }; cr.define('media_router', function() { 'use strict'; /** * @param {number} type The type of cast mode. * @param {string} description The description of the cast mode. * @param {?string} host The hostname of the site to cast. * @param {boolean} isForced True if the mode is forced. * @constructor * @struct */ var CastMode = function(type, description, host, isForced) { /** @type {number} */ this.type = type; /** @type {string} */ this.description = description; /** @type {?string} */ this.host = host || null; /** @type {boolean} */ this.isForced = isForced; }; /** * Placeholder object for AUTO cast mode. See comment in CastModeType. * @const {!media_router.CastMode} */ var AUTO_CAST_MODE = new CastMode( media_router.CastModeType.AUTO, loadTimeData.getString('autoCastMode'), null, false); /** * @param {number} id The ID of this issue. * @param {string} title The issue title. * @param {string} message The issue message. * @param {number} defaultActionType The type of default action. * @param {number|undefined} secondaryActionType The type of optional action. * @param {?string} routeId The route ID to which this issue * pertains. If not set, this is a global issue. * @param {boolean} isBlocking True if this issue blocks other UI. * @param {?number} helpPageId The numeric help center ID. * @constructor * @struct */ var Issue = function( id, title, message, defaultActionType, secondaryActionType, routeId, isBlocking, helpPageId) { /** @type {number} */ this.id = id; /** @type {string} */ this.title = title; /** @type {string} */ this.message = message; /** @type {number} */ this.defaultActionType = defaultActionType; /** @type {number|undefined} */ this.secondaryActionType = secondaryActionType; /** @type {?string} */ this.routeId = routeId; /** @type {boolean} */ this.isBlocking = isBlocking; /** @type {?number} */ this.helpPageId = helpPageId; }; /** * @param {string} id The media route ID. * @param {string} sinkId The ID of the media sink running this route. * @param {string} description The short description of this route. * @param {?number} tabId The ID of the tab in which web app is running and * accessing the route. * @param {boolean} isLocal True if this is a locally created route. * @param {boolean} canJoin True if this route can be joined. * @param {?string} customControllerPath non-empty if this route has custom * controller. * @constructor * @struct */ var Route = function( id, sinkId, description, tabId, isLocal, canJoin, customControllerPath) { /** @type {string} */ this.id = id; /** @type {string} */ this.sinkId = sinkId; /** @type {string} */ this.description = description; /** @type {?number} */ this.tabId = tabId; /** @type {boolean} */ this.isLocal = isLocal; /** @type {boolean} */ this.canJoin = canJoin; /** @type {number|undefined} */ this.currentCastMode = undefined; /** @type {?string} */ this.customControllerPath = customControllerPath; /** @type {boolean} */ this.supportsWebUiController = false; }; /** * @param {string} title The title of the route. * @param {boolean} canPlayPause Whether the route can be played/paused. * @param {boolean} canMute Whether the route can be muted/unmuted. * @param {boolean} canSetVolume Whether the route volume can be changed. * @param {boolean} canSeek Whether the route's playback position can be * changed. * @param {boolean} isPaused Whether the route is paused. * @param {boolean} isMuted Whether the route is muted. * @param {number} volume The route's volume, between 0 and 1. * @param {number} duration The route's duration in seconds. * @param {number} currentTime The route's current position in seconds. * Must not be greater than |duration|. * @param {!{mediaRemotingEnabled: boolean}=} mirroringExtraData Only set for * mirroring routes. * @param {!{localPresent: boolean}=} hangoutsExtraData Only set for Hangouts * routes. * @constructor * @struct */ var RouteStatus = function( title = '', canPlayPause = false, canMute = false, canSetVolume = false, canSeek = false, playState = media_router.PlayState.PLAYING, isPaused = false, isMuted = false, volume = 0, duration = 0, currentTime = 0, hangoutsExtraData = undefined, mirroringExtraData = undefined) { /** @type {string} */ this.title = title; /** @type {boolean} */ this.canPlayPause = canPlayPause; /** @type {boolean} */ this.canMute = canMute; /** @type {boolean} */ this.canSetVolume = canSetVolume; /** @type {boolean} */ this.canSeek = canSeek; /** @type {media_router.PlayState} */ this.playState = playState; /** @type {boolean} */ this.isMuted = isMuted; /** @type {number} */ this.volume = volume; /** @type {number} */ this.duration = duration; /** @type {number} */ this.currentTime = currentTime; /** @type {!{localPresent: boolean}|undefined} */ this.hangoutsExtraData = hangoutsExtraData; /** @type {!{mediaRemotingEnabled: boolean}|undefined} */ this.mirroringExtraData = mirroringExtraData; }; /** * @param {string} id The ID of the media sink. * @param {string} name The name of the sink. * @param {?string} description Optional description of the sink. * @param {?string} domain Optional domain of the sink. * @param {media_router.SinkIconType} iconType the type of icon for the sink. * @param {media_router.SinkStatus} status The readiness state of the sink. * @param {number} castModes Bitset of cast modes compatible with the sink. * @constructor * @struct */ var Sink = function( id, name, description, domain, iconType, status, castModes) { /** @type {string} */ this.id = id; /** @type {string} */ this.name = name; /** @type {?string} */ this.description = description; /** @type {?string} */ this.domain = domain; /** @type {!media_router.SinkIconType} */ this.iconType = iconType; /** @type {!media_router.SinkStatus} */ this.status = status; /** @type {number} */ this.castModes = castModes; /** @type {boolean} */ this.isPseudoSink = false; }; /** * @param {number} tabId The current tab ID. * @param {string} domain The domain of the current tab. * @constructor * @struct */ var TabInfo = function(tabId, domain) { /** @type {number} */ this.tabId = tabId; /** @type {string} */ this.domain = domain; }; return { AUTO_CAST_MODE: AUTO_CAST_MODE, CastMode: CastMode, Issue: Issue, Route: Route, RouteStatus: RouteStatus, Sink: Sink, TabInfo: TabInfo, }; }); // // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // API invoked by the browser MediaRouterWebUIMessageHandler to communicate // with this UI. cr.define('media_router.ui', function() { 'use strict'; // The media-router-container element. var container = null; // The media-router-header element. var header = null; // The route-controls element. Is null if the route details view isn't open. var routeControls = null; // The initial height for |container|. var initialMaxHeight = 0; /** * Handles response of previous create route attempt. * * @param {string} sinkId The ID of the sink to which the Media Route was * creating a route. * @param {?media_router.Route} route The newly created route that * corresponds to the sink if route creation succeeded; null otherwise. * @param {boolean} isForDisplay Whether or not |route| is for display. */ function onCreateRouteResponseReceived(sinkId, route, isForDisplay) { container.onCreateRouteResponseReceived(sinkId, route, isForDisplay); } /** * Called when the route controller for the route that is currently selected * is invalidated. */ function onRouteControllerInvalidated() { container.onRouteControllerInvalidated(); } /** * Handles the search response by forwarding |sinkId| to the container. * * @param {string} sinkId The ID of the sink found by search. */ function receiveSearchResult(sinkId) { container.onReceiveSearchResult(sinkId); } /** * Sets the cast mode list. * * @param {!Array} castModeList */ function setCastModeList(castModeList) { container.castModeList = castModeList; } /** * Sets |container| and |header|. * * @param {!MediaRouterContainerInterface} mediaRouterContainer * @param {!MediaRouterHeaderElement} mediaRouterHeader */ function setElements(mediaRouterContainer, mediaRouterHeader) { container = mediaRouterContainer; header = mediaRouterHeader; if (initialMaxHeight) { container.updateMaxDialogHeight(initialMaxHeight); initialMaxHeight = 0; } } /** * Populates the WebUI with data obtained about the first run flow. * * @param {{firstRunFlowCloudPrefLearnMoreUrl: string, * firstRunFlowLearnMoreUrl: string, * wasFirstRunFlowAcknowledged: boolean, * showFirstRunFlowCloudPref: boolean}} data * Parameters in data: * firstRunFlowCloudPrefLearnMoreUrl - url to open when the cloud services * pref learn more link is clicked. * firstRunFlowLearnMoreUrl - url to open when the first run flow learn * more link is clicked. * wasFirstRunFlowAcknowledged - true if first run flow was previously * acknowledged by user. * showFirstRunFlowCloudPref - true if the cloud pref option should be * shown. */ function setFirstRunFlowData(data) { container.firstRunFlowCloudPrefLearnMoreUrl = data['firstRunFlowCloudPrefLearnMoreUrl']; container.firstRunFlowLearnMoreUrl = data['firstRunFlowLearnMoreUrl']; container.showFirstRunFlowCloudPref = data['showFirstRunFlowCloudPref']; // Some users acknowledged the first run flow before the cloud prefs // setting was implemented. These users will see the first run flow // again. container.showFirstRunFlow = !data['wasFirstRunFlowAcknowledged'] || container.showFirstRunFlowCloudPref; } /** * Populates the WebUI with data obtained from Media Router. * * @param {{deviceMissingUrl: string, * sinksAndIdentity: { * sinks: !Array, * showEmail: boolean, * userEmail: string, * showDomain: boolean * }, * routes: !Array, * castModes: !Array, * useTabMirroring: boolean}} data * Parameters in data: * deviceMissingUrl - url to be opened on "Device missing?" clicked. * sinksAndIdentity - list of sinks to be displayed and user identity. * useWebUiRouteControls - whether new WebUI route controls should be used. * routes - list of routes that are associated with the sinks. * castModes - list of available cast modes. * useTabMirroring - whether the cast mode should be set to TAB_MIRROR. */ function setInitialData(data) { container.deviceMissingUrl = data['deviceMissingUrl']; container.castModeList = data['castModes']; this.setSinkListAndIdentity(data['sinksAndIdentity']); container.routeList = data['routes']; container.maybeShowRouteDetailsOnOpen(); if (data['useTabMirroring']) { container.selectCastMode(media_router.CastModeType.TAB_MIRROR); } media_router.browserApi.onInitialDataReceived(); } /** * Sets current issue to |issue|, or clears the current issue if |issue| is * null. * * @param {?media_router.Issue} issue */ function setIssue(issue) { container.issue = issue; } /** * Sets |routeControls|. The argument may be null if the route details view is * getting closed. * * @param {?RouteControlsInterface} mediaRouterRouteControls */ function setRouteControls(mediaRouterRouteControls) { routeControls = mediaRouterRouteControls; } /** * Sets the list of currently active routes. * * @param {!Array} routeList */ function setRouteList(routeList) { container.routeList = routeList; } /** * Sets the list of discovered sinks along with properties of whether to hide * identity of the user email and domain. * * @param {{sinks: !Array, * showEmail: boolean, * userEmail: string, * showDomain: boolean}} data * Parameters in data: * sinks - list of sinks to be displayed. * showEmail - true if the user email should be shown. * userEmail - email of the user if the user is signed in. * showDomain - true if the user domain should be shown. */ function setSinkListAndIdentity(data) { container.showDomain = data['showDomain']; container.allSinks = data['sinks']; header.userEmail = data['userEmail']; header.showEmail = data['showEmail']; } /** * Updates the max height of the dialog * * @param {number} height */ function updateMaxHeight(height) { if (container) { container.updateMaxDialogHeight(height); } else { // Update the max height once |container| gets set. initialMaxHeight = height; } } /** * Updates the route status shown in the route controls. * * @param {!media_router.RouteStatus} status */ function updateRouteStatus(status) { if (routeControls) { routeControls.routeStatus = status; } } function userSelectedLocalMediaFile(fileName) { container.onFileDialogSuccess(fileName); } return { onCreateRouteResponseReceived: onCreateRouteResponseReceived, onRouteControllerInvalidated: onRouteControllerInvalidated, receiveSearchResult: receiveSearchResult, setCastModeList: setCastModeList, setElements: setElements, setFirstRunFlowData: setFirstRunFlowData, setInitialData: setInitialData, setIssue: setIssue, setRouteControls: setRouteControls, setRouteList: setRouteList, setSinkListAndIdentity: setSinkListAndIdentity, updateMaxHeight: updateMaxHeight, updateRouteStatus: updateRouteStatus, userSelectedLocalMediaFile: userSelectedLocalMediaFile, }; }); // Handles user events for the Media Router UI. cr.define('media_router', function() { 'use strict'; /** * The media-router-container element. Initialized after polymer is ready. * @type {?MediaRouterContainerInterface} */ var container = null; /** * Initializes the Media Router WebUI and requests initial media * router content, such as the media sink and media route lists. */ function initialize() { // For non-Mac platforms, request data immediately after initialization. if (!cr.isMac) { onRequestInitialData(); } container = /** @type {!MediaRouterContainerInterface} */ ($('media-router-container')); media_router.ui.setElements(container, container.header); container.addEventListener( 'acknowledge-first-run-flow', onAcknowledgeFirstRunFlow); container.addEventListener('back-click', onNavigateToSinkList); container.addEventListener('cast-mode-selected', onCastModeSelected); container.addEventListener( 'change-route-source-click', onChangeRouteSourceClick); container.addEventListener('close-dialog', onCloseDialog); container.addEventListener('close-route', onCloseRoute); container.addEventListener('create-route', onCreateRoute); container.addEventListener('issue-action-click', onIssueActionClick); container.addEventListener('join-route-click', onJoinRouteClick); container.addEventListener( 'navigate-sink-list-to-details', onNavigateToDetails); container.addEventListener( 'navigate-to-cast-mode-list', onNavigateToCastMode); container.addEventListener( 'select-local-media-file', onSelectLocalMediaFile); container.addEventListener('report-filter', onFilter); container.addEventListener('report-initial-action', onInitialAction); container.addEventListener( 'report-initial-action-close', onInitialActionClose); container.addEventListener('report-route-creation', onReportRouteCreation); container.addEventListener( 'report-sink-click-time', onSinkClickTimeReported); container.addEventListener('report-sink-count', onSinkCountReported); container.addEventListener( 'report-resolved-route', onReportRouteCreationOutcome); container.addEventListener('request-initial-data', onRequestInitialData); container.addEventListener( 'search-sinks-and-create-route', onSearchSinksAndCreateRoute); container.addEventListener('show-initial-state', onShowInitialState); container.addEventListener('sink-click', onSinkClick); window.addEventListener('blur', onWindowBlur); } /** * Requests that the Media Router searches for a sink with criteria * |event.detail.name|. * @param {!Event} event * Parameters in |event|.detail: * id - id of the pseudo sink generating the request. * name - sink search criteria. * domain - user's current domain. * selectedCastMode - type of cast mode selected by the user. */ function onSearchSinksAndCreateRoute(event) { /** @type {{id: string, domain: string, name: string, * selectedCastMode: number}} */ var detail = event.detail; media_router.browserApi.searchSinksAndCreateRoute( detail.id, detail.name, detail.domain, detail.selectedCastMode); } /** * Reports the selected cast mode. * Called when the user selects a cast mode from the picker. * * @param {!Event} event * Parameters in |event|.detail: * castModeType - type of cast mode selected by the user. */ function onCastModeSelected(event) { /** @type {{castModeType: number}} */ var detail = event.detail; media_router.browserApi.reportSelectedCastMode(detail.castModeType); } /** * Reports the route for which the users wants to replace the source and the * cast mode that should be used for the new source. * * @param {!Event} event The event object. * Parameters in |event|.detail: * route - route to modify. * selectedCastMode - type of cast mode selected by the user. */ function onChangeRouteSourceClick(event) { /** @type {{route: !media_router.Route, selectedCastMode: number}} */ var detail = event.detail; media_router.browserApi.changeRouteSource( detail.route, detail.selectedCastMode); } /** * Sends a request to the browser to select a local file. */ function onSelectLocalMediaFile() { media_router.browserApi.selectLocalMediaFile(); } /** * Updates the preference that the user has seen the first run flow. * Called when the user clicks on the acknowledgement button on the first run * flow. * * @param {!Event} event * Parameters in |event|.detail: * optedIntoCloudServices - whether or not the user opted into cloud * services. */ function onAcknowledgeFirstRunFlow(event) { /** @type {{optedIntoCloudServices: boolean}} */ var detail = event.detail; media_router.browserApi.acknowledgeFirstRunFlow( detail.optedIntoCloudServices); } /** * Closes the dialog. * Called when the user clicks the close button on the dialog. Reports * whether the user closed the dialog via the ESC key. * * @param {!Event} event * Parameters in |event|.detail: * pressEscToClose - whether or not the user pressed ESC to close the * dialog. */ function onCloseDialog(event) { /** @type {{pressEscToClose: boolean}} */ var detail = event.detail; container.maybeReportUserFirstAction( media_router.MediaRouterUserAction.CLOSE); media_router.browserApi.closeDialog(detail.pressEscToClose); } /** * Reports when the user uses the filter input to filter the sink list. This * is reported at most once each time the user enters the filter view, and * only if text is actually entered in the filter input. */ function onFilter() { media_router.browserApi.reportFilter(); } /** * Reports the first action the user takes after opening the dialog. * Called when the user explicitly interacts with the dialog to perform an * action. * * @param {!Event} event * Parameters in |event|.detail: * action - the first action taken by the user. */ function onInitialAction(event) { /** @type {{action: number}} */ var detail = event.detail; media_router.browserApi.reportInitialAction(detail.action); } /** * Reports the time it took for the user to close the dialog if that was the * first action the user took after opening the dialog. * Called when the user closes the dialog without taking any other action. * * @param {!Event} event * Parameters in |event|.detail: * timeMs - time in ms for the user to close the dialog. */ function onInitialActionClose(event) { /** @type {{timeMs: number}} */ var detail = event.detail; media_router.browserApi.reportTimeToInitialActionClose(detail.timeMs); } /** * Acts on an issue and dismisses it from the UI. * Called when the user performs an action on an issue. * * @param {!Event} event * Parameters in |event|.detail: * id - issue ID. * actionType - type of action performed by the user. * helpPageId - the numeric help center ID. */ function onIssueActionClick(event) { /** @type {{id: number, actionType: number, helpPageId: number}} */ var detail = event.detail; media_router.browserApi.actOnIssue( detail.id, detail.actionType, detail.helpPageId); container.issue = null; } /** * Creates a media route. * Called when the user requests to create a media route. * * @param {!Event} event * Parameters in |event|.detail: * sinkId - sink ID selected by the user. * selectedCastModeValue - cast mode selected by the user. */ function onCreateRoute(event) { /** @type {{sinkId: string, selectedCastModeValue: number}} */ var detail = event.detail; media_router.browserApi.requestRoute( detail.sinkId, detail.selectedCastModeValue); } /** * Stops a route. * Called when the user requests to stop a media route. * * @param {!Event} event * Parameters in |event|.detail: * route - The route to close. */ function onCloseRoute(event) { /** @type {{route: !media_router.Route}} */ var detail = event.detail; media_router.browserApi.closeRoute(detail.route); } /** * Starts casting to an existing route. * Called when the user requests to start casting to a media route that is * joinable. * * @param {!Event} event * Parameters in |event|.detail: * route - The route to connect to if possible. */ function onJoinRouteClick(event) { /** @type {{route: !media_router.Route}} */ var detail = event.detail; media_router.browserApi.joinRoute(detail.route); } /** * Reports the user navigation to the cast mode view. * Called when the user clicks the drop arrow to navigate to the cast mode * view on the dialog. */ function onNavigateToCastMode() { media_router.browserApi.reportNavigateToView( media_router.MediaRouterView.CAST_MODE_LIST); } /** * Reports the user navigation the route details view. * Called when the user clicks on a sink to navigate to the route details * view. */ function onNavigateToDetails() { media_router.browserApi.reportNavigateToView( media_router.MediaRouterView.ROUTE_DETAILS); } /** * Reports the user navigation the sink list view. * Called when the user clicks on the back button from the route details view * to the sink list view. */ function onNavigateToSinkList() { media_router.browserApi.reportNavigateToView( media_router.MediaRouterView.SINK_LIST); } /** * Reports whether or not the route creation was successful. * * @param {!Event} event * Parameters in |event|.detail: * success - whether or not the route creation was successful. */ function onReportRouteCreation(event) { /** @type {{success: boolean}} */ var detail = event.detail; media_router.browserApi.reportRouteCreation(detail.success); } /** * Reports success or the type of failure for route creation response. * Called when the route is resolved; either the route creation was a success * or if there was no route or the route's corresponding sink is invalid; * either the sink does not exist or was not the sink we were looking for. * * @param {!Event} event * Parameters in |event|.detail: * outcome - the outcome of a create route response. * */ function onReportRouteCreationOutcome(event) { /** @type {{outcome: number}} */ var detail = event.detail; media_router.browserApi.reportRouteCreationOutcome(detail.outcome); } /** * Requests for initial data to load into the dialog. */ function onRequestInitialData() { media_router.browserApi.requestInitialData(); } /** * Reports the initial state of the dialog after it is opened. * Called after initial data is populated. * * @param {!Event} event * Parameters in |event|.detail: * currentView - the current dialog's current view. */ function onShowInitialState(event) { /** @type {{currentView: string}} */ var detail = event.detail; media_router.browserApi.reportInitialState(detail.currentView); } /** * Reports the index of the sink that was clicked. * Called when the user selects a sink on the sink list. * * @param {!Event} event * Paramters in |event|.detail: * index - the index of the clicked sink. */ function onSinkClick(event) { /** @type {{index: number}} */ var detail = event.detail; media_router.browserApi.reportClickedSinkIndex(detail.index); } /** * Reports the time it took for the user to select a sink to create a route * after the list was popuated and shown. * * @param {!Event} event * Paramters in |event|.detail: * timeMs - the time it took for the user to select a sink. */ function onSinkClickTimeReported(event) { /** @type {{timeMs: number}} */ var detail = event.detail; media_router.browserApi.reportTimeToClickSink(detail.timeMs); } /** * Reports the current sink count. * Called 3 seconds after the dialog is initially opened. * * @param {!Event} event * Parameters in |event|.detail: * sinkCount - the number of sinks. */ function onSinkCountReported(event) { /** @type {{sinkCount: number}} */ var detail = event.detail; media_router.browserApi.reportSinkCount(detail.sinkCount); } /** * Reports when the user clicks outside the dialog. */ function onWindowBlur() { media_router.browserApi.reportBlur(); } return { initialize: initialize, }; }); window.addEventListener('load', media_router.initialize); $i18n{mediaRouterTitle}
/* Copyright 2018 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #sink-status-div { white-space: pre-wrap; } // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Handles user events for the Media Router Internals UI. cr.define('media_router_internals', function() { 'use strict'; /** * Initializes the Media Router Internals WebUI */ function initialize() { // Notify the browser that the page has loaded, causing it to send media // router status. chrome.send('initialized'); } function setStatus(status) { const jsonStatus = JSON.stringify(status, null, /* spacing level = */ 2); $('sink-status-div').textContent = jsonStatus; } return { initialize: initialize, setStatus: setStatus, }; }); document.addEventListener( 'DOMContentLoaded', media_router_internals.initialize); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // API invoked by the browser MediaRouterWebUIMessageHandler to communicate // with this UI. cr.define('media_router.ui', function() { 'use strict'; // The media-router-container element. var container = null; // The media-router-header element. var header = null; // The route-controls element. Is null if the route details view isn't open. var routeControls = null; // The initial height for |container|. var initialMaxHeight = 0; /** * Handles response of previous create route attempt. * * @param {string} sinkId The ID of the sink to which the Media Route was * creating a route. * @param {?media_router.Route} route The newly created route that * corresponds to the sink if route creation succeeded; null otherwise. * @param {boolean} isForDisplay Whether or not |route| is for display. */ function onCreateRouteResponseReceived(sinkId, route, isForDisplay) { container.onCreateRouteResponseReceived(sinkId, route, isForDisplay); } /** * Called when the route controller for the route that is currently selected * is invalidated. */ function onRouteControllerInvalidated() { container.onRouteControllerInvalidated(); } /** * Handles the search response by forwarding |sinkId| to the container. * * @param {string} sinkId The ID of the sink found by search. */ function receiveSearchResult(sinkId) { container.onReceiveSearchResult(sinkId); } /** * Sets the cast mode list. * * @param {!Array} castModeList */ function setCastModeList(castModeList) { container.castModeList = castModeList; } /** * Sets |container| and |header|. * * @param {!MediaRouterContainerInterface} mediaRouterContainer * @param {!MediaRouterHeaderElement} mediaRouterHeader */ function setElements(mediaRouterContainer, mediaRouterHeader) { container = mediaRouterContainer; header = mediaRouterHeader; if (initialMaxHeight) { container.updateMaxDialogHeight(initialMaxHeight); initialMaxHeight = 0; } } /** * Populates the WebUI with data obtained about the first run flow. * * @param {{firstRunFlowCloudPrefLearnMoreUrl: string, * firstRunFlowLearnMoreUrl: string, * wasFirstRunFlowAcknowledged: boolean, * showFirstRunFlowCloudPref: boolean}} data * Parameters in data: * firstRunFlowCloudPrefLearnMoreUrl - url to open when the cloud services * pref learn more link is clicked. * firstRunFlowLearnMoreUrl - url to open when the first run flow learn * more link is clicked. * wasFirstRunFlowAcknowledged - true if first run flow was previously * acknowledged by user. * showFirstRunFlowCloudPref - true if the cloud pref option should be * shown. */ function setFirstRunFlowData(data) { container.firstRunFlowCloudPrefLearnMoreUrl = data['firstRunFlowCloudPrefLearnMoreUrl']; container.firstRunFlowLearnMoreUrl = data['firstRunFlowLearnMoreUrl']; container.showFirstRunFlowCloudPref = data['showFirstRunFlowCloudPref']; // Some users acknowledged the first run flow before the cloud prefs // setting was implemented. These users will see the first run flow // again. container.showFirstRunFlow = !data['wasFirstRunFlowAcknowledged'] || container.showFirstRunFlowCloudPref; } /** * Populates the WebUI with data obtained from Media Router. * * @param {{deviceMissingUrl: string, * sinksAndIdentity: { * sinks: !Array, * showEmail: boolean, * userEmail: string, * showDomain: boolean * }, * routes: !Array, * castModes: !Array, * useTabMirroring: boolean}} data * Parameters in data: * deviceMissingUrl - url to be opened on "Device missing?" clicked. * sinksAndIdentity - list of sinks to be displayed and user identity. * useWebUiRouteControls - whether new WebUI route controls should be used. * routes - list of routes that are associated with the sinks. * castModes - list of available cast modes. * useTabMirroring - whether the cast mode should be set to TAB_MIRROR. */ function setInitialData(data) { container.deviceMissingUrl = data['deviceMissingUrl']; container.castModeList = data['castModes']; this.setSinkListAndIdentity(data['sinksAndIdentity']); container.routeList = data['routes']; container.maybeShowRouteDetailsOnOpen(); if (data['useTabMirroring']) { container.selectCastMode(media_router.CastModeType.TAB_MIRROR); } media_router.browserApi.onInitialDataReceived(); } /** * Sets current issue to |issue|, or clears the current issue if |issue| is * null. * * @param {?media_router.Issue} issue */ function setIssue(issue) { container.issue = issue; } /** * Sets |routeControls|. The argument may be null if the route details view is * getting closed. * * @param {?RouteControlsInterface} mediaRouterRouteControls */ function setRouteControls(mediaRouterRouteControls) { routeControls = mediaRouterRouteControls; } /** * Sets the list of currently active routes. * * @param {!Array} routeList */ function setRouteList(routeList) { container.routeList = routeList; } /** * Sets the list of discovered sinks along with properties of whether to hide * identity of the user email and domain. * * @param {{sinks: !Array, * showEmail: boolean, * userEmail: string, * showDomain: boolean}} data * Parameters in data: * sinks - list of sinks to be displayed. * showEmail - true if the user email should be shown. * userEmail - email of the user if the user is signed in. * showDomain - true if the user domain should be shown. */ function setSinkListAndIdentity(data) { container.showDomain = data['showDomain']; container.allSinks = data['sinks']; header.userEmail = data['userEmail']; header.showEmail = data['showEmail']; } /** * Updates the max height of the dialog * * @param {number} height */ function updateMaxHeight(height) { if (container) { container.updateMaxDialogHeight(height); } else { // Update the max height once |container| gets set. initialMaxHeight = height; } } /** * Updates the route status shown in the route controls. * * @param {!media_router.RouteStatus} status */ function updateRouteStatus(status) { if (routeControls) { routeControls.routeStatus = status; } } function userSelectedLocalMediaFile(fileName) { container.onFileDialogSuccess(fileName); } return { onCreateRouteResponseReceived: onCreateRouteResponseReceived, onRouteControllerInvalidated: onRouteControllerInvalidated, receiveSearchResult: receiveSearchResult, setCastModeList: setCastModeList, setElements: setElements, setFirstRunFlowData: setFirstRunFlowData, setInitialData: setInitialData, setIssue: setIssue, setRouteControls: setRouteControls, setRouteList: setRouteList, setSinkListAndIdentity: setSinkListAndIdentity, updateMaxHeight: updateMaxHeight, updateRouteStatus: updateRouteStatus, userSelectedLocalMediaFile: userSelectedLocalMediaFile, }; }); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This Polymer element is used to show information about issues related // to casting. Polymer({ is: 'issue-banner', properties: { /** * Maps an issue action type to the resource identifier of the text shown * in the action button. * This is a property of issue-banner because it is used in tests. This * property should always be set before |issue| is set or updated. * @private {!Array} */ actionTypeToButtonTextResource_: { type: Array, readOnly: true, value: function() { return ['dismissButton', 'learnMoreText']; }, }, /** * The text shown in the default action button. * @private {string|undefined} */ defaultActionButtonText_: { type: String, }, /** * The issue to show. * @type {?media_router.Issue|undefined} */ issue: { type: Object, observer: 'updateActionButtonText_', }, /** * The text shown in the secondary action button. * @private {string|undefined} */ secondaryActionButtonText_: { type: String, }, }, behaviors: [ I18nBehavior, ], /** * @param {?media_router.Issue} issue * @return {boolean} Whether or not to hide the blocking issue UI. * @private */ computeIsBlockingIssueHidden_: function(issue) { return !issue || !issue.isBlocking; }, /** * @param {?media_router.Issue} issue The current issue. * @return {string} The class for the overall issue-banner. * @private */ computeIssueClass_: function(issue) { if (!issue) { return ''; } return issue.isBlocking ? 'blocking' : 'non-blocking'; }, /** * @param {?media_router.Issue} issue * @return {boolean} Whether or not to hide the non-blocking issue UI. * @private */ computeOptionalActionHidden_: function(issue) { return !issue || issue.secondaryActionType === undefined; }, /** * Fires an issue-action-click event. * * @param {number} actionType The type of issue action. * @private */ fireIssueActionClick_: function(actionType) { this.fire('issue-action-click', { id: this.issue.id, actionType: actionType, helpPageId: this.issue.helpPageId }); }, /** * Called when a default issue action is clicked. * * @param {!Event} event The event object. * @private */ onClickDefaultAction_: function(event) { this.fireIssueActionClick_(this.issue.defaultActionType); }, /** * Called when an optional issue action is clicked. * * @param {!Event} event The event object. * @private */ onClickOptAction_: function(event) { this.fireIssueActionClick_( /** @type {number} */ (this.issue.secondaryActionType)); }, /** * Called when |issue| is updated. This updates the default and secondary * action button text. * * @private */ updateActionButtonText_: function() { var defaultText = ''; var secondaryText = ''; if (this.issue) { defaultText = this.i18n( this.actionTypeToButtonTextResource_[this.issue.defaultActionType]); if (this.issue.secondaryActionType !== undefined) { secondaryText = this.i18n( this.actionTypeToButtonTextResource_[this.issue .secondaryActionType]); } } this.defaultActionButtonText_ = defaultText; this.secondaryActionButtonText_ = secondaryText; }, }); /* Copyright 2015 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ .blocking { background-color: white; overflow: hidden; position: relative; text-align: center; } .blocking > #buttons { padding-bottom: 24px; padding-top: 20px; } .blocking > div > #title { color: rgba(0, 0, 0, 0.87); line-height: 1.125em; padding: 10px; vertical-align: middle; } #blocking-icon { color: var(--google-red-500); height: 75px; padding-top: 24px; width: 75px; } .non-blocking { background-color: var(--paper-grey-800); padding: 16px; width: inherit; } .non-blocking > #buttons { display: flex; flex-direction: row; justify-content: flex-end; width: 100%; } .non-blocking > #buttons > .button { color: var(--paper-blue-300); } .non-blocking > #buttons > #default-button { margin-inline-end: 24px; } .non-blocking > div > #title { color: rgba(255, 255, 255, 0.87); margin-inline-end: 12px; overflow: hidden; padding-inline-end: 12px; } paper-button { margin: 0; } /* Copyright 2015 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ .active-sink { color: var(--paper-blue-700); } .cast-mode-icon, .sink-icon { height: var(--non-navigation-icon-size); padding-inline-end: 12px; padding-inline-start: var(--dialog-padding-start); width: var(--non-navigation-icon-size); } #container-header { position: fixed; width: 100%; } #content { position: relative; } #device-missing { align-items: center; background-color: white; display: flex; justify-content: center; padding: 60px 0; } #device-missing a { color: var(--paper-blue-700); margin: 8px 0; text-align: center; text-decoration: none; } #first-run-button { background-color: white; } #first-run-button-container { display: flex; flex-direction: row; justify-content: flex-end; } #first-run-cloud-checkbox, #first-run-flow-cloud-pref, #first-run-text { font-size: 1.0em; line-height: 1.5em; } #first-run-cloud-checkbox, #first-run-text, #first-run-title { color: white; padding-bottom: 24px; } #first-run-cloud-checkbox::shadow #checkboxLabel { padding-inline-start: var(-dialog-padding-start); } #first-run-flow { background-color: var(--paper-blue-700); box-sizing: border-box; padding: 24px 16px 4px 16px; position: fixed; width: 100%; } #first-run-flow a { color: white; text-decoration: none; } #first-run-flow-cloud-pref { color: white; display: flex; } .first-run-learn-more { font-weight: bold; text-transform: uppercase; } #first-run-title { font-size: 1.25em; } #issue-banner { width: 100%; } #issue-banner.non-blocking { bottom: 0; display: block; margin-top: 0; } #no-search-matches { color: rgb(112, 112, 112); display: block; font-size: 1.2 em; padding-bottom: 20px; padding-top: 20px; text-align: center; } cr-checkbox { --cr-checkbox-checked-box-color: white; --cr-checkbox-label-color: white; --cr-checkbox-mark-color: var(--paper-blue-700); --cr-checkbox-ripple-checked-color: white; --cr-checkbox-ripple-unchecked-color: white; --cr-checkbox-unchecked-box-color: white; --cr-checkbox-ripple-opacity: 0.25; } .selectable-item { -webkit-appearance: none; align-items: center; background: none; border: none; cursor: pointer; display: flex; font-family: inherit; font-size: 1.0em; line-height: 0; min-height: 0; outline: 0; padding: 12px 0; text-align: initial; width: 100%; } .selectable-item:hover, .selectable-item:focus { background-color: rgb(238, 238, 238); border: 0; } .selectable-item.iron-selected { font-weight: bold; } iron-selector { color: rgba(0, 0, 0, 0.87); display: block; overflow-x: hidden; overflow-y: auto; padding-bottom: 0; padding-top: 4px; user-select: none; } iron-selector#cast-mode-list { padding-bottom: 12px; padding-top: 4px; } #search-input-container { flex-grow: 1; } #search-results { overflow-x: hidden; overflow-y: auto; } #search-results-container { bottom: 0; left: 0; overflow-x: hidden; overflow-y: hidden; position: absolute; right: 0; top: 100%; } #searching-devices-spinner { height: 30px; width: 30px; } .subheading-text { color: var(--paper-grey-600); cursor: default; font-weight: normal; padding-bottom: 4px; padding-inline-start: var(--dialog-padding-start); padding-top: 12px; } #share-screen-text::after { background-color: white; font-weight: normal; } .sink-content { display: flex; flex-direction: row; font-weight: normal; } .sink-domain { color: var(--paper-grey-600); padding-inline-start: 6px; /* TODO(crbug/589697): Handle overflow of very long domain names. */ } #sink-list { overflow-x: hidden; overflow-y: auto; } #sink-list-view { margin-bottom: 12px; position: relative; } .sink-name { min-width: 10%; } #search-input-container { flex-grow: 1; } #sink-search { padding-bottom: 0; padding-top: 4px; position: absolute; top: 100%; width: 100%; z-index: 1; } /* Separate icon class is a consequence of box-sizing: border-box set by * paper-icon-button. This should achieve the same dimensions as .sink-icon. */ #sink-search-icon { margin-inline-start: 4px; padding-inline-end: 12px; padding-inline-start: 12px; } #sink-search-input { --cr-input-background-color: white; --cr-input-container: { border-radius: 0; } --cr-input-error-display: none; --cr-input-input: { border-bottom: 1px solid var(--paper-grey-800); } --cr-input-padding-end: 0; --cr-input-padding-start: 0; --cr-input-padding-bottom: 2px; --cr-input-padding-top: 2px; align-self: center; flex-grow: 1; font-size: 12px; margin-inline-end: 31px; } .sink-subtext { color: var(--paper-grey-600); padding-top: 8px; } .sink-text { flex-flow: row nowrap; line-height: normal; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; width: 275px; } // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * This Polymer element contains the entire media router interface. It handles * hiding and showing specific components. * @implements {MediaRouterContainerInterface} */ Polymer({ is: 'media-router-container', properties: { /** * The list of available sinks. * @type {!Array} */ allSinks: { type: Array, value: [], observer: 'reindexSinksAndRebuildSinksToShow_', }, /** * The last promise in a chain that will be fulfilled when the current * animation has finished. It does not return a value; it is strictly a * synchronization mechanism. * @private {!Promise} */ animationPromise_: { type: Object, value: function() { return Promise.resolve(); }, }, /** * The list of CastModes to show. * @type {!Array|undefined} */ castModeList: { type: Array, observer: 'checkCurrentCastMode_', }, /** * The ID of the Sink currently being launched. * @private {string} * TODO(crbug.com/616604): Use per-sink route creation state. */ currentLaunchingSinkId_: { type: String, value: '', }, /** * The current route. * @private {?media_router.Route|undefined} */ currentRoute_: { type: Object, }, /** * The current view to be shown. * @private {?media_router.MediaRouterView|undefined} */ currentView_: { type: String, observer: 'currentViewChanged_', }, /** * The URL to open when the device missing link is clicked. * @type {string|undefined} */ deviceMissingUrl: { type: String, }, /** * The height of the dialog. * @private {number} */ dialogHeight_: { type: Number, value: 330, }, /** * The time |this| element calls ready(). * @private {number|undefined} */ elementReadyTimeMs_: { type: Number, }, /** * Animation player used for running filter transition animations. * @private {?Animation} */ filterTransitionPlayer_: { type: Object, value: null, }, /** * The URL to open when the cloud services pref learn more link is clicked. * @type {string|undefined} */ firstRunFlowCloudPrefLearnMoreUrl: { type: String, }, /** * The URL to open when the first run flow learn more link is clicked. * @type {string|undefined} */ firstRunFlowLearnMoreUrl: { type: String, }, /** * The header text for the sink list. * @type {string|undefined} */ headerText: { type: String, }, /** * The header text tooltip. This would be descriptive of the * source origin, whether a host name, tab URL, etc. * @type {string|undefined} */ headerTextTooltip: { type: String, }, /** * An animation player that is used for running dialog height adjustments. * @private {?Animation} */ heightAdjustmentPlayer_: { type: Object, value: null, }, /** * Whether the sink list is being hidden for animation purposes. * @private {boolean} */ hideSinkListForAnimation_: { type: Boolean, value: false, }, /** * Records whether the search input is focused when a window blur event is * received. This is used to handle search focus edge cases. See * |setSearchFocusHandlers_| for details. * @private {boolean} */ isSearchFocusedOnWindowBlur_: { type: Boolean, value: false, }, /** * Whether the search list is currently hidden. * @private {boolean} */ isSearchListHidden_: { type: Boolean, value: true, }, /** * The issue to show. * @type {?media_router.Issue} */ issue: { type: Object, value: null, observer: 'maybeShowIssueView_', }, /** * Whether the MR UI was just opened. * @private {boolean} */ justOpened_: { type: Boolean, value: true, }, /** * Whether the user's mouse is positioned over the dialog. * @private {boolean|undefined} */ mouseIsPositionedOverDialog_: { type: Boolean, }, /** * The ID of the route that is currently being created. This is set when * route creation is resolved but not ready for its controls to be * displayed. * @private {string|undefined} */ pendingCreatedRouteId_: { type: String, }, /** * The time the sink list was shown and populated with at least one sink. * This is reset whenever the user switches views or there are no sinks * available for display. * @private {number} */ populatedSinkListSeenTimeMs_: { type: Number, value: -1, }, /** * Pseudo sinks from MRPs that represent their ability to accept sink search * requests. * @private {!Array} */ pseudoSinks_: { type: Array, value: [], }, /** * Helps manage the state of creating a sink and a route from a pseudo sink. * @private {PseudoSinkSearchState|undefined} */ pseudoSinkSearchState_: { type: Object, }, /** * Whether the next character input should cause a filter action metric to * be sent. * @type {boolean} * @private */ reportFilterOnInput_: { type: Boolean, value: false, }, /** * The list of current routes. * @type {!Array|undefined} */ routeList: { type: Array, observer: 'rebuildRouteMaps_', }, /** * Maps media_router.Route.id to corresponding media_router.Route. * @private {!Object|undefined} */ routeMap_: { type: Object, }, /** * Whether the search feature is enabled and we should show the search * input. * @private {boolean} */ searchEnabled_: { type: Boolean, value: false, observer: 'searchEnabledChanged_', }, /** * Search text entered by the user into the sink search input. * @private {string} */ searchInputText_: { type: String, value: '', observer: 'searchInputTextChanged_', }, /** * Sinks to display that match |searchInputText_|. * @private {!Array>}>|undefined} */ searchResultsToShow_: { type: Array, }, /** * The selected cast mode menu item. The item with this index is bolded in * the cast mode menu. * @private {number|undefined} */ selectedCastModeMenuItem_: { type: Number, observer: 'updateSelectedCastModeMenuItem_', }, /** * Whether to show the user domain of sinks associated with identity. * @type {boolean|undefined} */ showDomain: { type: Boolean, }, /** * Whether to show the first run flow. * @type {boolean|undefined} */ showFirstRunFlow: { type: Boolean, observer: 'updateElementPositioning_', }, /** * Whether to show the cloud preference setting in the first run flow. * @type {boolean|undefined} */ showFirstRunFlowCloudPref: { type: Boolean, }, /** * The cast mode shown to the user. Initially populated within * |rebuildSinksToShow_()|. * This value may be changed in one of the following ways: * 1) The user explicitly selected a cast mode. * 2) The user selected cast mode is no longer available for the associated * WebContents. In this case, the container will reset to auto mode. Note * that |userHasSelectedCastMode_| will switch back to false. * 3) The sink list changed, and the user had not explicitly selected a cast * mode. If the sinks support exactly 1 cast mode, the container will * switch to that cast mode. Otherwise, the container will reset to auto * mode. * @private {number} */ shownCastModeValue_: Number, /** * Max height for the sink list. * @private {number} */ sinkListMaxHeight_: { type: Number, value: 0, }, /** * Maps media_router.Sink.id to corresponding media_router.Sink. * @private {!Object|undefined} */ sinkMap_: { type: Object, }, /** * Maps media_router.Sink.id to corresponding media_router.Route. * @private {!Object} */ sinkToRouteMap_: { type: Object, value: {}, }, /** * Sinks to show for the currently selected cast mode. * @private {!Array|undefined} */ sinksToShow_: { type: Array, observer: 'updateElementPositioning_', }, /** * Whether the user has explicitly selected a cast mode. * @private {boolean} */ userHasSelectedCastMode_: { type: Boolean, value: false, }, /** * Whether the user has already taken an action. * @type {boolean} */ userHasTakenInitialAction_: { type: Boolean, value: false, }, }, behaviors: [ I18nBehavior, ], observers: [ 'maybeUpdateStartSinkDisplayStartTime_(currentView_, sinksToShow_)', ], ready: function() { this.elementReadyTimeMs_ = window.performance.now(); this.showSinkList_(); Polymer.RenderStatus.afterNextRender(this, function() { // Import the elements that aren't needed at startup. This reduces // initial load time. Delayed loading interferes with getting the // offsetHeight of the first-run-flow element in updateElementPositioning_ // though, so we also make sure it is called after the last load. var that = this; var loadsRemaining = 3; var onload = function() { loadsRemaining--; if (loadsRemaining > 0) { return; } that.updateElementPositioning_(); if (that.currentView_ == media_router.MediaRouterView.SINK_LIST) { that.putSearchAtBottom_(); } }; this.importHref( 'chrome://resources/polymer/v1_0/neon-animation/' + 'web-animations.html', onload); this.importHref( this.resolveUrl('../issue_banner/issue_banner.html'), onload); this.importHref( this.resolveUrl( '../media_router_search_highlighter/' + 'media_router_search_highlighter.html'), onload); // If this is not on a Mac platform, remove the placeholder. See // onFocus_() for more details. ready() is only called once, so no need // to check if the placeholder exist before removing. if (!cr.isMac) { this.$$('#focus-placeholder').remove(); } document.addEventListener('keydown', this.onKeydown_.bind(this), true); this.listen(this, 'focus', 'onFocus_'); this.listen(this, 'header-height-changed', 'updateElementPositioning_'); this.listen(this, 'header-or-arrow-click', 'toggleCastModeHidden_'); this.listen(this, 'mouseleave', 'onMouseLeave_'); this.listen(this, 'mouseenter', 'onMouseEnter_'); // Turn off the spinner after 3 seconds, then report the current number of // sinks. this.async(function() { this.justOpened_ = false; // |pseudoSinks_| does not contain pseudo sinks without a domain, so it // cannot be used for calculating the number of real sinks. var realSinks = this.allSinks.filter(function(sink) { return !sink.isPseudoSink; }); this.fire('report-sink-count', { sinkCount: realSinks.length, }); }, 3000 /* 3 seconds */); // For Mac platforms, request data after a short delay after load. This // appears to speed up initial data load time on Mac. if (cr.isMac) { this.async(function() { this.fire('request-initial-data'); }, 25 /* 0.025 seconds */); } }); }, /** * Fires an acknowledge-first-run-flow event and hides the first run flow. * This is call when the first run flow button is clicked. * * @private */ acknowledgeFirstRunFlow_: function() { // Only set |userOptedIntoCloudServices| if the user was shown the cloud // services preferences option. var userOptedIntoCloudServices = this.showFirstRunFlowCloudPref ? this.$$('#first-run-cloud-checkbox').checked : undefined; this.fire('acknowledge-first-run-flow', { optedIntoCloudServices: userOptedIntoCloudServices, }); this.showFirstRunFlow = false; this.showFirstRunFlowCloudPref = false; }, /** * Fires a 'report-initial-action' event when the user takes their first * action after the dialog opens. Also fires a 'report-initial-action-close' * event if that initial action is to close the dialog. * @param {!media_router.MediaRouterUserAction} initialAction */ maybeReportUserFirstAction: function(initialAction) { if (this.userHasTakenInitialAction_) { return; } this.fire('report-initial-action', { action: initialAction, }); if (initialAction == media_router.MediaRouterUserAction.CLOSE) { var timeToClose = window.performance.now() - this.elementReadyTimeMs_; this.fire('report-initial-action-close', { timeMs: timeToClose, }); } this.userHasTakenInitialAction_ = true; }, get header() { return this.$['container-header']; }, /** * Calls all the functions to set the UI to a given cast mode. * @param {!media_router.CastMode} castMode The cast mode to set things to. * @private */ castModeSelected_(castMode) { this.selectCastMode(castMode.type); this.fire('cast-mode-selected', {castModeType: castMode.type}); this.showSinkList_(); this.maybeReportUserFirstAction( media_router.MediaRouterUserAction.CHANGE_MODE); }, /** * Checks that the currently selected cast mode is still in the * updated list of available cast modes. If not, then update the selected * cast mode to the first available cast mode on the list. */ checkCurrentCastMode_: function() { if (!this.castModeList.length) { return; } // If there is a forced mode make sure it is shown. if (this.findForcedCastMode_()) { this.rebuildSinksToShow_(); } // If we are currently showing auto mode, then nothing needs to be done. // Otherwise, if the cast mode currently shown no longer exists (regardless // of whether it was selected by user), then switch back to auto cast mode. if (this.shownCastModeValue_ != media_router.CastModeType.AUTO && !this.findCastModeByType_(this.shownCastModeValue_)) { this.setShownCastMode_(media_router.AUTO_CAST_MODE); this.rebuildSinksToShow_(); } }, /** * Compares two search match objects for sorting. Earlier and longer matches * are prioritized. * * @param {!{sinkItem: !media_router.Sink, * substrings: Array>}} resultA * Parameters in |resultA|: * sinkItem - sink object. * substrings - start-end index pairs of substring matches. * @param {!{sinkItem: !media_router.Sink, * substrings: Array>}} resultB * Parameters in |resultB|: * sinkItem - sink object. * substrings - start-end index pairs of substring matches. * @return {number} -1 if |resultA| should come before |resultB|, 1 if * |resultB| should come before |resultA|, and 0 if they are considered * equal. */ compareSearchMatches_: function(resultA, resultB) { var substringsA = resultA.substrings; var substringsB = resultB.substrings; var numberSubstringsA = substringsA.length; var numberSubstringsB = substringsB.length; if (numberSubstringsA == 0 && numberSubstringsB == 0) { return 0; } else if (numberSubstringsA == 0) { return 1; } else if (numberSubstringsB == 0) { return -1; } var loopMax = Math.min(numberSubstringsA, numberSubstringsB); for (var i = 0; i < loopMax; ++i) { var [matchStartA, matchEndA] = substringsA[i]; var [matchStartB, matchEndB] = substringsB[i]; if (matchStartA < matchStartB) { return -1; } else if (matchStartA > matchStartB) { return 1; } if (matchEndA > matchEndB) { return -1; } else if (matchEndA < matchEndB) { return 1; } } if (numberSubstringsA > numberSubstringsB) { return -1; } else if (numberSubstringsA < numberSubstringsB) { return 1; } return 0; }, /** * Returns a duration in ms from a distance in pixels using a default speed of * 1000 pixels per second. * @param {number} distance Number of pixels that will be traveled. * @private */ computeAnimationDuration_: function(distance) { // The duration of the animation can be found by abs(distance)/speed, where // speed is fixed at 1000 pixels per second, or 1 pixel per millisecond. return Math.abs(distance); }, /** * If there is a forced cast mode, returns that cast mode. If |allSinks| * supports only a single cast mode, returns that cast mode. Otherwise, * returns AUTO_MODE. Only called if |userHasSelectedCastMode_| is |false|. * * @return {!media_router.CastMode} The single cast mode supported by * |allSinks|, or AUTO_MODE. */ computeCastMode_: function() { /** @const */ var forcedMode = this.findForcedCastMode_(); if (forcedMode) { return forcedMode; } var allCastModes = this.allSinks.reduce(function(castModesSoFar, sink) { // Ignore pseudo sinks in the cast mode computation. return castModesSoFar | (sink.isPseudoSink ? 0 : sink.castModes); }, 0); // This checks whether |castModes| does not consist of exactly 1 cast mode. if (!allCastModes || allCastModes & (allCastModes - 1)) { return media_router.AUTO_CAST_MODE; } var castMode = this.findCastModeByType_(allCastModes); if (castMode) { return castMode; } console.error('Cast mode ' + allCastModes + ' not in castModeList'); return media_router.AUTO_CAST_MODE; }, /** * @param {?media_router.MediaRouterView} view The current view. * @return {boolean} Whether or not to hide the cast mode list. * @private */ computeCastModeListHidden_: function(view) { return view != media_router.MediaRouterView.CAST_MODE_LIST; }, /** * @param {!media_router.CastMode} castMode The cast mode to determine an * icon for. * @return {string} The icon to use. * @private */ computeCastModeIcon_: function(castMode) { switch (castMode.type) { case media_router.CastModeType.PRESENTATION: return 'media-router:web'; case media_router.CastModeType.TAB_MIRROR: return 'media-router:tab'; case media_router.CastModeType.DESKTOP_MIRROR: return 'media-router:laptop'; case media_router.CastModeType.LOCAL_FILE: return 'media-router:folder'; default: return ''; } }, /** * @param {!Array} castModeList The current list of * cast modes. * @return {!Array} The list of PRESENTATION cast * modes. * @private */ computePresentationCastModeList_: function(castModeList) { return castModeList.filter(function(mode) { return mode.type == media_router.CastModeType.PRESENTATION; }); }, /** * @param {!Array} sinksToShow The list of sinks. * @return {boolean} Whether or not to hide the 'devices missing' message. * @private */ computeDeviceMissingHidden_: function(sinksToShow) { return sinksToShow.length != 0; }, /** * @param {?Element} element Element to compute padding for. * @return {number} Computes the amount of vertical padding (top + bottom) on * |element|. * @private */ computeElementVerticalPadding_: function(element) { var paddingBottom, paddingTop; [paddingBottom, paddingTop] = this.getElementVerticalPadding_(element); return paddingBottom + paddingTop; }, /** * @param {?media_router.MediaRouterView} view The current view. * @param {?media_router.Issue} issue The current issue. * @return {boolean} Whether or not to hide the header. * @private */ computeHeaderHidden_: function(view, issue) { return view == media_router.MediaRouterView.ROUTE_DETAILS || (view == media_router.MediaRouterView.SINK_LIST && !!issue && issue.isBlocking); }, /** * @param {?media_router.MediaRouterView} view The current view. * @param {string} headerText The header text for the sink list. * @return {string|undefined} The text for the header. * @private */ computeHeaderText_: function(view, headerText) { switch (view) { case media_router.MediaRouterView.CAST_MODE_LIST: return this.i18n('selectCastModeHeaderText'); case media_router.MediaRouterView.ISSUE: return this.i18n('issueHeaderText'); case media_router.MediaRouterView.ROUTE_DETAILS: return this.currentRoute_ && this.sinkMap_[this.currentRoute_.sinkId] ? this.sinkMap_[this.currentRoute_.sinkId].name : ''; case media_router.MediaRouterView.SINK_LIST: case media_router.MediaRouterView.FILTER: return this.headerText; default: return ''; } }, /** * @param {?media_router.MediaRouterView} view The current view. * @param {string} headerTooltip The tooltip for the header for the sink * list. * @return {string} The tooltip for the header. * @private */ computeHeaderTooltip_: function(view, headerTooltip) { return view == media_router.MediaRouterView.SINK_LIST ? headerTooltip : ''; }, /** * @param {string} currentLaunchingSinkId ID of the sink that is currently * launching, or empty string if none exists. * @private */ computeIsLaunching_: function(currentLaunchingSinkId) { return currentLaunchingSinkId != ''; }, /** * @param {?media_router.Issue} issue The current issue. * @return {string} The class for the issue banner. * @private */ computeIssueBannerClass_: function(issue) { return issue && !issue.isBlocking ? 'non-blocking' : ''; }, /** * @param {?media_router.MediaRouterView} view The current view. * @param {?media_router.Issue} issue The current issue. * @return {boolean} Whether or not to show the issue banner. * @private */ computeIssueBannerShown_: function(view, issue) { return !!issue && (view == media_router.MediaRouterView.CAST_MODE_LIST || view == media_router.MediaRouterView.SINK_LIST || view == media_router.MediaRouterView.FILTER || view == media_router.MediaRouterView.ISSUE); }, /** * @param {!Array>}>} searchResultsToShow * The sinks currently matching the search text. * @param {boolean} isSearchListHidden Whether the search list is hidden. * @return {boolean} Whether or not the 'no matches' message is hidden. * @private */ computeNoMatchesHidden_: function(searchResultsToShow, isSearchListHidden) { return isSearchListHidden || this.searchInputText_.length == 0 || searchResultsToShow.length != 0; }, /** * @param {!Array} castModeList The current list of * cast modes. * @return {!Array} The list of non-PRESENTATION cast * modes. Also excludes LOCAL_FILE. * @private */ computeShareScreenCastModeList_: function(castModeList) { return castModeList.filter(function(mode) { return mode.type == media_router.CastModeType.DESKTOP_MIRROR || mode.type == media_router.CastModeType.TAB_MIRROR; }); }, /** * @param {!Array} castModeList The current list of * cast modes. * @return {!Array} The list of local media cast * modes. * @private */ computeLocalMediaCastModeList_: function(castModeList) { return castModeList.filter(function(mode) { return mode.type == media_router.CastModeType.LOCAL_FILE; }); }, /** * @param {?media_router.MediaRouterView} view The current view. * @param {?media_router.Issue} issue The current issue. * @return {boolean} Whether or not to hide the route details. * @private */ computeRouteDetailsHidden_: function(view, issue) { return view != media_router.MediaRouterView.ROUTE_DETAILS || (!!issue && issue.isBlocking); }, /** * Computes an array of substring indices that mark where substrings of * |searchString| occur in |sinkName|. * * @param {string} searchString Search string entered by user. * @param {string} sinkName Sink name being filtered. * @return {Array>} Array of substring start-end (inclusive) * index pairs if every character in |searchString| was matched, in order, * in |sinkName|. Otherwise it returns null. * @private */ computeSearchMatches_: function(searchString, sinkName) { var i = 0; var matchStart = -1; var matchEnd = -1; var matchPairs = []; for (var j = 0; i < searchString.length && j < sinkName.length; ++j) { if (searchString[i].toLocaleLowerCase() == sinkName[j].toLocaleLowerCase()) { if (matchStart == -1) { matchStart = j; } ++i; } else if (matchStart != -1) { matchEnd = j - 1; matchPairs.push([matchStart, matchEnd]); matchStart = -1; } } if (matchStart != -1) { matchEnd = j - 1; matchPairs.push([matchStart, matchEnd]); } return (i == searchString.length) ? matchPairs : null; }, /** * Computes whether the search results list should be hidden. * @param {!Array>}>} searchResultsToShow * The sinks currently matching the search text. * @param {boolean} isSearchListHidden Whether the search list is hidden. * @return {boolean} Whether the search results list should be hidden. * @private */ computeSearchResultsHidden_: function( searchResultsToShow, isSearchListHidden) { return isSearchListHidden || searchResultsToShow.length == 0; }, /** * @param {!Array} castModeList The current list of * cast modes. * @return {boolean} Whether or not to hide the share screen subheading text. * @private */ computeShareScreenSubheadingHidden_: function(castModeList) { return this.computeShareScreenCastModeList_(castModeList).length == 0; }, /** * @param {!Array} castModeList The current list of * cast modes. * @return {boolean} Whether or not to hide the local media subheading text. * @private */ computeLocalMediaSubheadingHidden_: function(castModeList) { return this.computeLocalMediaCastModeList_(castModeList).length == 0; }, /** * @param {boolean} showFirstRunFlow Whether or not to show the first run * flow. * @param {?media_router.MediaRouterView} currentView The current view. * @private */ computeShowFirstRunFlow_: function(showFirstRunFlow, currentView) { return showFirstRunFlow && currentView == media_router.MediaRouterView.SINK_LIST; }, /** * @param {!media_router.Sink} sink The sink to determine an icon for. * @return {string} The icon to use. * @private */ computeSinkIcon_: function(sink) { switch (sink.iconType) { case media_router.SinkIconType.CAST: return 'media-router:chromecast'; case media_router.SinkIconType.CAST_AUDIO_GROUP: return 'media-router:speaker-group'; case media_router.SinkIconType.CAST_AUDIO: return 'media-router:speaker'; case media_router.SinkIconType.MEETING: return 'media-router:meeting'; case media_router.SinkIconType.HANGOUT: return 'media-router:hangout'; case media_router.SinkIconType.EDUCATION: return 'media-router:education'; case media_router.SinkIconType.WIRED_DISPLAY: return 'media-router:tv'; case media_router.SinkIconType.GENERIC: return 'media-router:tv'; default: return 'media-router:tv'; } }, /** * @param {!string} sinkId A sink ID. * @param {!Object} sinkToRouteMap * Maps media_router.Sink.id to corresponding media_router.Route. * @return {string} The class for the sink icon. * @private */ computeSinkIconClass_: function(sinkId, sinkToRouteMap) { return sinkToRouteMap[sinkId] ? 'sink-icon active-sink' : 'sink-icon'; }, /** * @param {!string} currentLaunchingSinkId The ID of the sink that is * currently launching. * @param {!string} sinkId A sink ID. * @return {boolean} |true| if given sink is currently launching. * @private */ computeSinkIsLaunching_: function(currentLaunchingSinkId, sinkId) { return currentLaunchingSinkId == sinkId; }, /** * @param {!Array} sinksToShow The list of sinks. * @return {boolean} Whether or not to hide the sink list. * @private */ computeSinkListHidden_: function(sinksToShow) { return sinksToShow.length == 0; }, /** * @param {?media_router.MediaRouterView} view The current view. * @param {?media_router.Issue} issue The current issue. * @return {boolean} Whether or not to hide entire the sink list view. * @private */ computeSinkListViewHidden_: function(view, issue) { return (view != media_router.MediaRouterView.SINK_LIST && view != media_router.MediaRouterView.FILTER) || (!!issue && issue.isBlocking); }, /** * Returns whether the sink domain for |sink| should be hidden. * @param {!media_router.Sink} sink * @return {boolean} |true| if the domain should be hidden. * @private */ computeSinkDomainHidden_: function(sink) { return !this.showDomain || this.isEmptyOrWhitespace_(sink.domain); }, /** * Computes which portions of a sink name, if any, should be highlighted when * displayed in the filter view. Any substrings matching the search text * should be highlighted. * * The order the strings are combined is plainText[0] highlightedText[0] * plainText[1] highlightedText[1] etc. * * @param {!{sinkItem: !media_router.Sink, * substrings: !Array>}} matchedItem * Parameters in matchedItem: * sinkItem - Original !media_router.Sink from the sink list. * substrings - List of index pairs denoting substrings of sinkItem.name * that match |searchInputText_|. * @return {!{highlightedText: !Array, plainText: !Array}} * highlightedText - Array of strings that should be displayed highlighted. * plainText - Array of strings that should be displayed normally. * @private */ computeSinkMatchingText_: function(matchedItem) { if (!matchedItem.substrings) { return {highlightedText: [null], plainText: [matchedItem.sinkItem.name]}; } var lastMatchIndex = -1; var nameIndex = 0; var sinkName = matchedItem.sinkItem.name; var highlightedText = []; var plainText = []; for (var i = 0; i < matchedItem.substrings.length; ++i) { var [matchStart, matchEnd] = matchedItem.substrings[i]; if (lastMatchIndex + 1 < matchStart) { plainText.push(sinkName.substring(lastMatchIndex + 1, matchStart)); } else { plainText.push(null); } highlightedText.push(sinkName.substring(matchStart, matchEnd + 1)); lastMatchIndex = matchEnd; } if (lastMatchIndex + 1 < sinkName.length) { highlightedText.push(null); plainText.push(sinkName.substring(lastMatchIndex + 1)); } return {highlightedText: highlightedText, plainText: plainText}; }, /** * Returns the subtext to be shown for |sink|. Only called if * |computeSinkSubtextHidden_| returns false for the same |sink| and * |sinkToRouteMap|. * @param {!media_router.Sink} sink * @param {!Object} sinkToRouteMap * @return {?string} The subtext to be shown. * @private */ computeSinkSubtext_: function(sink, sinkToRouteMap) { var route = sinkToRouteMap[sink.id]; if (route && !this.isEmptyOrWhitespace_(route.description)) { return route.description; } return sink.description; }, /** * Returns whether the sink subtext for |sink| should be hidden. * @param {!media_router.Sink} sink * @param {!Object} sinkToRouteMap * @return {boolean} |true| if the subtext should be hidden. * @private */ computeSinkSubtextHidden_: function(sink, sinkToRouteMap) { if (!this.isEmptyOrWhitespace_(sink.description)) { return false; } var route = sinkToRouteMap[sink.id]; return !route || this.isEmptyOrWhitespace_(route.description); }, /** * @param {boolean} justOpened Whether the MR UI was just opened. * @return {boolean} Whether or not to hide the spinner. * @private */ computeSpinnerHidden_: function(justOpened) { return !justOpened; }, /** * Computes the height of the sink list view element when search results are * being shown. * * @param {?Element} deviceMissing No devices message element. * @param {?Element} noMatches No search matches element. * @param {?Element} results Search results list element. * @param {number} searchOffsetHeight Search input container element height. * @param {number} maxHeight Max height of the list elements. * @return {number} The height of the sink list view when search results are * being shown. * @private */ computeTotalSearchHeight_: function( deviceMissing, noMatches, results, searchOffsetHeight, maxHeight) { var contentHeight = deviceMissing.offsetHeight + ((noMatches.hasAttribute('hidden')) ? results.offsetHeight : noMatches.offsetHeight); return Math.min(contentHeight, maxHeight) + searchOffsetHeight; }, /** * Updates element positioning when the view changes and possibly triggers * reporting of a user filter action. If there is no filter text, it defers * the reporting until some text is entered, but otherwise it reports the * filter action here. * @param {?media_router.MediaRouterView} currentView The current view of the * dialog. * @param {?media_router.MediaRouterView} previousView The previous * |currentView|. * @private */ currentViewChanged_: function(currentView, previousView) { if (currentView == media_router.MediaRouterView.FILTER) { this.reportFilterOnInput_ = true; this.maybeReportFilter_(); } this.updateElementPositioning_(); if (previousView == media_router.MediaRouterView.ROUTE_DETAILS) { media_router.browserApi.onMediaControllerClosed(); if (this.$$('route-details')) { this.$$('route-details').onClosed(); } } }, /** * Filters all sinks based on fuzzy matching to the currently entered search * text. * @param {string} searchInputText The currently entered search text. * @private */ filterSinks_: function(searchInputText) { if (searchInputText.length == 0) { this.searchResultsToShow_ = this.sinksToShow_.map(function(item) { return {sinkItem: item, substrings: null}; }); return; } var searchResultsToShow = []; for (var i = 0; i < this.sinksToShow_.length; ++i) { var matchSubstrings = this.computeSearchMatches_( searchInputText, this.sinksToShow_[i].name); if (!matchSubstrings) { continue; } searchResultsToShow.push( {sinkItem: this.sinksToShow_[i], substrings: matchSubstrings}); } searchResultsToShow.sort(this.compareSearchMatches_); var pendingPseudoSink = (this.pseudoSinkSearchState_) ? this.pseudoSinkSearchState_.getPseudoSink() : null; // We may need to add pseudo sinks to the filter results. A pseudo sink will // be shown if there is no real sink with the same icon and name exactly // matching the filter text. The map() call transforms any pseudo sink // objects that will be shown to the search result format, where we know // that the entire sink name will be a match. // // The exception to this is when there is a pending pseudo sink search. Then // the pseudo sink for the search will be treated like a real sink because // it will actually be in |sinksToShow_| until a real sink is returned by // search. So the filter here shouldn't treat it like a pseudo sink. searchResultsToShow = this.pseudoSinks_ .filter(function(pseudoSink) { return (!pendingPseudoSink || pseudoSink.id != pendingPseudoSink.id) && !searchResultsToShow.find(function(searchResult) { return searchResult.sinkItem.name == searchInputText && searchResult.sinkItem.iconType == pseudoSink.iconType; }); }) .map(function(pseudoSink) { pseudoSink.name = searchInputText; return { sinkItem: pseudoSink, substrings: [[0, searchInputText.length - 1]] }; }) .concat(searchResultsToShow); this.searchResultsToShow_ = searchResultsToShow; }, /** * Helper function to locate the CastMode object with the given type in * castModeList. * * @param {number} castModeType Type of cast mode to look for. * @return {media_router.CastMode|undefined} CastMode object with the given * type in castModeList, or undefined if not found. * @private */ findCastModeByType_: function(castModeType) { return this.castModeList.find(function(element, index, array) { return element.type == castModeType; }); }, /** * Helper function to locate the position in the |castModeList| of the * CastMode object with the given type. * * @param {number} castModeType Type of cast mode to look for. * @return {number} index of the given type, or -1 if not found. * @private */ findCastModeIndexByType_: function(castModeType) { return this.castModeList .map(function(element) { return element.type; }) .indexOf(castModeType); }, /** * Helper function to return a forced CastMode, if any. * * @return {media_router.CastMode|undefined} CastMode object with * isForced = true, or undefined if not found. * @private */ findForcedCastMode_: function() { return this.castModeList && this.castModeList.find(element => element.isForced); }, /** * @param {?Element} element Element to compute padding for. * @return {!Array} Array containing the element's bottom padding * value and the element's top padding value, in that order. * @private */ getElementVerticalPadding_: function(element) { var style = window.getComputedStyle(element); return [ parseInt(style.getPropertyValue('padding-bottom'), 10) || 0, parseInt(style.getPropertyValue('padding-top'), 10) || 0 ]; }, /** * Retrieves the first run flow cloud preferences text, if it exists. On * non-officially branded builds, the string is not defined. * * @return {string} Cloud preferences text. */ getFirstRunFlowCloudPrefText_: function() { return loadTimeData.valueExists('firstRunFlowCloudPrefText') ? this.i18n('firstRunFlowCloudPrefText') : ''; }, /** * @param {?media_router.Route} route Route to get the sink for. * @return {?media_router.Sink} Sink associated with |route| or * undefined if we don't have data for the sink. */ getSinkForRoute_: function(route) { return route ? this.sinkMap_[route.sinkId] : null; }, /** * @param {?Element} element Conditionally-templated element to check. * @return {boolean} Whether |element| is considered present in the document * as a conditionally-templated element. This does not check the |hidden| * attribute. */ hasConditionalElement_: function(element) { return !!element && (!element.style.display || element.style.display != 'none'); }, /** * Returns whether given string is undefined, null, empty, or whitespace only. * @param {?string} str String to be tested. * @return {boolean} |true| if the string is undefined, null, empty, or * whitespace. * @private */ isEmptyOrWhitespace_: function(str) { return str === undefined || str === null || (/^\s*$/).test(str); }, /** * Reports a user filter action if |searchInputText_| is not empty and the * filter action hasn't been reported since the view changed to the filter * view. * @private */ maybeReportFilter_: function() { if (this.reportFilterOnInput_ && this.searchInputText_.length != 0) { this.reportFilterOnInput_ = false; this.fire('report-filter'); } }, /** * Updates |currentView_| if the dialog had just opened and there's * only one local route. */ maybeShowRouteDetailsOnOpen: function() { var localRoute = null; for (var i = 0; i < this.routeList.length; i++) { var route = this.routeList[i]; if (!route.isLocal) { continue; } if (!localRoute) { localRoute = route; } else { // Don't show route details if there are more than one local route. localRoute = null; break; } } if (localRoute) { this.showRouteDetails_(localRoute); } this.fire('show-initial-state', {currentView: this.currentView_}); }, /** * Updates |currentView_| if there is a new blocking issue or a blocking * issue is resolved. Clears any pending route creation properties if the * issue corresponds with |pendingCreatedRouteId_|. * * @param {?media_router.Issue} issue The new issue, or null if the * blocking issue was resolved. * @private */ maybeShowIssueView_: function(issue) { if (issue) { if (issue.isBlocking) { this.currentView_ = media_router.MediaRouterView.ISSUE; } else if (this.currentView_ == media_router.MediaRouterView.SINK_LIST) { // Make space for the non-blocking issue in the sink list. this.updateElementPositioning_(); } } else if (this.currentView_ == media_router.MediaRouterView.ISSUE) { // Switch back to the sink list if the issue was cleared and it was // showing an issue. It is expected that the only way to clear an issue is // by user action; the IssueManager (C++ side) does not clear issues in // the UI. this.showSinkList_(); } if (this.pendingCreatedRouteId_ && issue && issue.routeId == this.pendingCreatedRouteId_) { this.resetRouteCreationProperties_(false); } }, /** * If an element in the search results list has keyboard focus when we are * transitioning from the filter view to the sink list view, give focus to the * same sink in the sink list. Otherwise we leave the keyboard focus where it * is. * @private */ maybeUpdateFocusOnFilterViewExit_: function() { var searchSinks = this.$$('#search-results').querySelectorAll('.selectable-item'); var focusedElem = Array.prototype.find.call(searchSinks, function(sink) { return sink.matches(':focus'); }); if (!focusedElem) { return; } var focusedSink = this.$$('#searchResults').itemForElement(focusedElem).sinkItem; setTimeout(function() { var sinkListPaperMenu = this.$$('#sink-list-paper-menu'); var sinks = sinkListPaperMenu.children; var sinkList = this.$$('#sinkList'); for (var i = 0; i < sinks.length; i++) { if (sinkList.itemForElement(sinks[i]).id == focusedSink.id) { sinkListPaperMenu.selectIndex(i); break; } } }.bind(this)); }, /** * May update |populatedSinkListSeenTimeMs_| depending on |currentView| and * |sinksToShow|. * Called when |currentView_| or |sinksToShow_| is updated. * * @param {?media_router.MediaRouterView} currentView The current view of the * dialog. * @param {!Array} sinksToShow The sinks to display. * @private */ maybeUpdateStartSinkDisplayStartTime_: function(currentView, sinksToShow) { if (currentView == media_router.MediaRouterView.SINK_LIST && sinksToShow.length != 0) { // Only set |populatedSinkListSeenTimeMs_| if it has not already been set. if (this.populatedSinkListSeenTimeMs_ == -1) { this.populatedSinkListSeenTimeMs_ = window.performance.now(); } } else { // Reset |populatedSinkListLastSeen_| if the sink list isn't being shown // or if there aren't any sinks available for display. this.populatedSinkListSeenTimeMs_ = -1; } }, /** * Animates the transition from the filter view, where the search field is at * the top of the list, to the sink list view, where the search field is at * the bottom of the list. * * If this is called while another animation is in progress, it queues itself * to be run at the end of the current animation. * * @param {!function()} resolve Resolves the animation promise that is waiting * on this animation. * @private */ moveSearchToBottom_: function(resolve) { var deviceMissing = this.$['device-missing']; var list = this.$$('#sink-list'); var resultsContainer = this.$$('#search-results-container'); var search = this.$$('#sink-search'); var view = this.$['sink-list-view']; var hasList = this.hasConditionalElement_(list); var initialHeight = view.offsetHeight; // Force the view height to be max dialog height. view.style['overflow'] = 'hidden'; var searchInitialOffsetHeight = search.offsetHeight; var searchInitialPaddingBottom, searchInitialPaddingTop; [searchInitialPaddingBottom, searchInitialPaddingTop] = this.getElementVerticalPadding_(search); var searchPadding = searchInitialPaddingBottom + searchInitialPaddingTop; var searchHeight = search.offsetHeight - searchPadding; var searchFinalPaddingBottom, searchFinalPaddingTop; [searchFinalPaddingBottom, searchFinalPaddingTop] = this.getElementVerticalPadding_(search); var searchFinalOffsetHeight = searchHeight + searchFinalPaddingBottom + searchFinalPaddingTop; var resultsInitialTop = 0; var finalHeight = 0; // Get final view height ahead of animation. if (hasList) { list.style['position'] = 'absolute'; list.style['opacity'] = '0'; this.hideSinkListForAnimation_ = false; finalHeight += list.offsetHeight; list.style['position'] = 'relative'; } else { resultsInitialTop += deviceMissing.offsetHeight + searchInitialOffsetHeight; finalHeight += deviceMissing.offsetHeight; } var searchInitialTop = hasList ? 0 : deviceMissing.offsetHeight; var searchFinalTop = hasList ? list.offsetHeight - search.offsetHeight : deviceMissing.offsetHeight; resultsContainer.style['position'] = 'absolute'; var duration = this.computeAnimationDuration_(searchFinalTop - searchInitialTop); var timing = {duration: duration, easing: 'ease-in-out', fill: 'forwards'}; // This GroupEffect does the reverse of |moveSearchToTop_|. It fades the // sink list in while sliding the search input and search results list down. // The dialog height is also adjusted smoothly to the sink list height. var deviceMissingEffect = new KeyframeEffect( deviceMissing, [ {'marginBottom': searchInitialOffsetHeight}, {'marginBottom': searchFinalOffsetHeight} ], timing); var listEffect = new KeyframeEffect(list, [{'opacity': '0'}, {'opacity': '1'}], timing); var resultsEffect = new KeyframeEffect( resultsContainer, [ { 'top': resultsInitialTop + 'px', 'paddingTop': resultsContainer.style['padding-top'] }, {'top': '100%', 'paddingTop': '0px'} ], timing); var searchEffect = new KeyframeEffect( search, [ { 'top': searchInitialTop + 'px', 'marginTop': '0px', 'paddingBottom': searchInitialPaddingBottom + 'px', 'paddingTop': searchInitialPaddingTop + 'px' }, { 'top': '100%', 'marginTop': '-' + searchFinalOffsetHeight + 'px', 'paddingBottom': searchFinalPaddingBottom + 'px', 'paddingTop': searchFinalPaddingTop + 'px' } ], timing); var viewEffect = new KeyframeEffect( view, [ {'height': initialHeight + 'px', 'paddingBottom': '0px'}, { 'height': finalHeight + 'px', 'paddingBottom': searchFinalOffsetHeight + 'px' } ], timing); var player = document.timeline.play(new GroupEffect( hasList ? [listEffect, resultsEffect, searchEffect, viewEffect] : [deviceMissingEffect, resultsEffect, searchEffect, viewEffect])); var that = this; var finalizeAnimation = function() { view.style['overflow'] = ''; that.putSearchAtBottom_(); that.filterTransitionPlayer_.cancel(); that.filterTransitionPlayer_ = null; that.isSearchListHidden_ = true; resolve(); }; player.finished.then(finalizeAnimation); this.filterTransitionPlayer_ = player; }, /** * Animates the transition from the sink list view, where the search field is * at the bottom of the list, to the filter view, where the search field is at * the top of the list. * * If this is called while another animation is in progress, it queues itself * to be run at the end of the current animation. * * @param {!function()} resolve Resolves the animation promise that is waiting * on this animation. * @private */ moveSearchToTop_: function(resolve) { var deviceMissing = this.$['device-missing']; var list = this.$$('#sink-list'); var noMatches = this.$$('#no-search-matches'); var results = this.$$('#search-results'); var resultsContainer = this.$$('#search-results-container'); var search = this.$$('#sink-search'); var view = this.$['sink-list-view']; // Set the max height for the results list before it's shown. results.style.maxHeight = this.sinkListMaxHeight_ + 'px'; // Saves current search container |offsetHeight| which includes bottom // padding. var searchInitialOffsetHeight = search.offsetHeight; var hasList = this.hasConditionalElement_(list); var searchInitialTop = hasList ? list.offsetHeight - searchInitialOffsetHeight : deviceMissing.offsetHeight; var searchFinalTop = hasList ? 0 : deviceMissing.offsetHeight; var searchInitialPaddingBottom, searchInitialPaddingTop; [searchInitialPaddingBottom, searchInitialPaddingTop] = this.getElementVerticalPadding_(search); var searchPadding = searchInitialPaddingBottom + searchInitialPaddingTop; var searchHeight = search.offsetHeight - searchPadding; var searchFinalPaddingBottom, searchFinalPaddingTop; [searchFinalPaddingBottom, searchFinalPaddingTop] = this.getElementVerticalPadding_(search); var searchFinalOffsetHeight = searchHeight + searchFinalPaddingBottom + searchFinalPaddingTop; // Omitting |search.offsetHeight| because it is handled by view animation // separately. var initialHeight = hasList ? list.offsetHeight : deviceMissing.offsetHeight; view.style['overflow'] = 'hidden'; var resultsPadding = this.computeElementVerticalPadding_(results); var finalHeight = this.computeTotalSearchHeight_( deviceMissing, noMatches, results, searchFinalOffsetHeight, this.sinkListMaxHeight_ + resultsPadding); var duration = this.computeAnimationDuration_(searchFinalTop - searchInitialTop); var timing = {duration: duration, easing: 'ease-in-out', fill: 'forwards'}; // This GroupEffect will cause the sink list to fade out while the search // input and search results list slide up. The dialog will also resize // smoothly to the new search result list height. var deviceMissingEffect = new KeyframeEffect( deviceMissing, [ {'marginBottom': searchInitialOffsetHeight}, {'marginBottom': searchFinalOffsetHeight} ], timing); var listEffect = new KeyframeEffect(list, [{'opacity': '1'}, {'opacity': '0'}], timing); var resultsEffect = new KeyframeEffect( resultsContainer, [ {'top': '100%', 'paddingTop': '0px'}, { 'top': searchFinalTop + 'px', 'paddingTop': searchFinalOffsetHeight + 'px' } ], timing); var searchEffect = new KeyframeEffect( search, [ { 'top': '100%', 'marginTop': '-' + searchInitialOffsetHeight + 'px', 'paddingBottom': searchInitialPaddingBottom + 'px', 'paddingTop': searchInitialPaddingTop + 'px' }, { 'top': searchFinalTop + 'px', 'marginTop': '0px', 'paddingBottom': searchFinalPaddingBottom + 'px', 'paddingTop': searchFinalPaddingTop + 'px' } ], timing); var viewEffect = new KeyframeEffect( view, [ { 'height': initialHeight + 'px', 'paddingBottom': searchInitialOffsetHeight + 'px' }, {'height': finalHeight + 'px', 'paddingBottom': '0px'} ], timing); var player = document.timeline.play(new GroupEffect( hasList ? [listEffect, resultsEffect, searchEffect, viewEffect] : [deviceMissingEffect, resultsEffect, searchEffect, viewEffect])); var that = this; var finalizeAnimation = function() { // When we are moving the search results up into view, the user may type // more text or delete text which may change the height of the search // results list. In this case, the dialog height that the animation ends // on will now be wrong. In order to correct this smoothly, // |putSearchAtTop_| will queue another animation just to adjust the // dialog height. // // The |filterTransitionPlayer_| will hold all of the animated elements in // their final keyframe state until it is canceled or another player // overrides it because we used |fill: 'forwards'| in all of the effects. // So unlike |moveSearchToBottom_|, we don't know for sure whether we want // to cancel |filterTransitionPlayer_| after |putSearchAtTop_| because // another animation may have been run to correct the dialog height. // // If |putSearchAtTop_| has to adjust the dialog height, it also queues // itself to run again when that animation is finished. When the height is // finally correct at the end of an animation, it will cancel // |filterTransitionPlayer_| itself. that.putSearchAtTop_(resolve); }; player.finished.then(finalizeAnimation); this.filterTransitionPlayer_ = player; }, /** * Handles a cast mode selection. Updates |headerText|, |headerTextTooltip|, * and |shownCastModeValue_|. * * @param {!Event} event The event object. * @private */ onCastModeClick_: function(event) { // The clicked cast mode can come from one of three lists, // presentationCastModeList, shareScreenCastModeList, and // localMediaCastModeList. var clickedMode = this.$$('#presentationCastModeList').itemForElement(event.target) || this.$$('#shareScreenCastModeList').itemForElement(event.target) || this.$$('#localMediaCastModeList').itemForElement(event.target); if (!clickedMode) { return; } // If the user selects LOCAL_FILE, some additional steps are required // (selecting the file), before the cast mode has been officially // selected. if (clickedMode.type == media_router.CastModeType.LOCAL_FILE) { this.selectLocalMediaFile_(); } else { this.castModeSelected_(clickedMode); } }, /** * Handles a change-route-source-click event. Sets the currently launching * sink to be the current route's sink and shows the sink list. * * @param {!Event} event The event object. * Parameters in |event|.detail: * route - route to modify. * selectedCastMode - cast mode to use for the new source. * @private */ onChangeRouteSourceClick_: function(event) { /** @type {{route: !media_router.Route, selectedCastMode: number}} */ var detail = event.detail; this.currentLaunchingSinkId_ = detail.route.sinkId; var sink = this.sinkMap_[detail.route.sinkId]; this.showSinkList_(); this.maybeReportUserFirstAction( media_router.MediaRouterUserAction.REPLACE_LOCAL_ROUTE); }, /** * Handles a close-route event. Shows the sink list and starts a timer to * close the dialog if there is no click within three seconds. * * @param {!Event} event The event object. * Parameters in |event|.detail: * route - route to close. * @private */ onCloseRoute_: function(event) { /** @type {{route: media_router.Route}} */ var detail = event.detail; this.showSinkList_(); this.startTapTimer_(); if (detail.route.isLocal) { this.maybeReportUserFirstAction( media_router.MediaRouterUserAction.STOP_LOCAL); } }, /** * Handles response of previous create route attempt. * * @param {string} sinkId The ID of the sink to which the Media Route was * creating a route. * @param {?media_router.Route} route The newly created route that * corresponds to the sink if route creation succeeded; null otherwise. * @param {boolean} isForDisplay Whether or not |route| is for display. */ onCreateRouteResponseReceived: function(sinkId, route, isForDisplay) { // The provider will handle sending an issue for a failed route request. if (!route) { this.resetRouteCreationProperties_(false); this.fire('report-resolved-route', { outcome: media_router.MediaRouterRouteCreationOutcome.FAILURE_NO_ROUTE }); return; } // Check that |sinkId| exists and corresponds to |currentLaunchingSinkId_|. if (!this.sinkMap_[sinkId] || this.currentLaunchingSinkId_ != sinkId) { this.fire('report-resolved-route', { outcome: media_router.MediaRouterRouteCreationOutcome.FAILURE_INVALID_SINK }); return; } // Regardless of whether the route is for display, it was resolved // successfully. this.fire( 'report-resolved-route', {outcome: media_router.MediaRouterRouteCreationOutcome.SUCCESS}); if (isForDisplay) { this.showRouteDetails_(route); this.startTapTimer_(); this.resetRouteCreationProperties_(true); } else { this.pendingCreatedRouteId_ = route.id; } }, /** * Sets up the LOCAL_FILE cast mode for display after a specific file has been * selected. * * @param {string} fileName The name of the file that has been selected. */ onFileDialogSuccess(fileName) { /** @const */ var mode = this.findCastModeByType_(media_router.CastModeType.LOCAL_FILE); if (!mode) { return; } this.castModeSelected_(mode); this.headerText = loadTimeData.getStringF('castLocalMediaSelectedFileTitle', fileName); this.updateSelectedCastModeMenuItem_(); }, /** * Called when a focus event is triggered. * * @param {!Event} event The event object. * @private */ onFocus_: function(event) { // If the focus event was automatically fired by Polymer, remove focus from // the element. This prevents unexpected focusing when the dialog is // initially loaded. This only happens on mac. if (cr.isMac && !event.sourceCapabilities) { // Adding a focus placeholder element is part of the workaround for // handling unexpected focusing, which only happens once on dialog open. // Since the placeholder is focus-enabled as denoted by its tabindex // value, the focus will not appear in other elements. var placeholder = this.$$('#focus-placeholder'); // Check that the placeholder is the currently focused element. In some // tests, other elements are non-user-triggered focused. if (placeholder && this.shadowRoot.activeElement == placeholder) { event.path[0].blur(); // Remove the placeholder since we have no more use for it. placeholder.remove(); } } }, /** * Called when a keydown event is fired. * @param {!Event} e Keydown event object for the event. */ onKeydown_: function(e) { // The ESC key may be pressed with a combination of other keys. It is // handled on the C++ side instead of the JS side on non-mac platforms, // which uses toolkit-views. Handle the expected behavior on all platforms // here. if (e.key == media_router.KEY_ESC && !e.shiftKey && !e.ctrlKey && !e.altKey && !e.metaKey) { // When searching, allow ESC as a mechanism to leave the filter view. if (this.currentView_ == media_router.MediaRouterView.FILTER) { // If the user tabbed to an item in the search results, or otherwise has // an item in the list focused, focus will seem to vanish when we // transition back to the sink list. Instead we should move focus to the // appropriate item in the sink list. this.maybeUpdateFocusOnFilterViewExit_(); this.showSinkList_(); e.preventDefault(); } else { this.fire('close-dialog', { pressEscToClose: true, }); } } }, /** * Called when a mouseleave event is triggered. * * @private */ onMouseLeave_: function() { this.mouseIsPositionedOverDialog_ = false; }, /** * Called when a mouseenter event is triggered. * * @private */ onMouseEnter_: function() { this.mouseIsPositionedOverDialog_ = true; }, /** * Called when a search has completed up to route creation. |sinkId| * identifies the sink that should be in |allSinks|, if a sink was found. * * @param {string} sinkId The ID of the sink that is the result of the * currently pending search. */ onReceiveSearchResult: function(sinkId) { this.pseudoSinkSearchState_.receiveSinkResponse(sinkId); this.currentLaunchingSinkId_ = this.pseudoSinkSearchState_.checkForRealSink(this.allSinks); this.rebuildSinksToShow_(); // If we're in filter view, make sure the |sinksToShow_| change is picked // up. if (this.currentView_ == media_router.MediaRouterView.FILTER) { this.filterSinks_(this.searchInputText_); } }, /** * Called when the connection to the route controller is invalidated. Switches * from route details view to the sink list view. */ onRouteControllerInvalidated: function() { if (this.currentView_ == media_router.MediaRouterView.ROUTE_DETAILS) { this.currentRoute_ = null; this.showSinkList_(); } }, /** * Called when a sink is clicked. * * @param {!Event} event The event object. * @private */ onSinkClick_: function(event) { var clickedSink = (this.currentView_ == media_router.MediaRouterView.FILTER) ? this.$$('#searchResults').itemForElement(event.target).sinkItem : this.$$('#sinkList').itemForElement(event.target); this.showOrCreateRoute_(clickedSink); this.fire('sink-click', {index: event['model'].index}); }, /** * Sets the positioning of the sink list, search input, and search results so * that everything is in the correct state for the sink list view. * * @private */ putSearchAtBottom_: function() { var search = this.$$('#sink-search'); if (!this.hasConditionalElement_(search)) { return; } var deviceMissing = this.$['device-missing']; var list = this.$$('#sink-list'); var resultsContainer = this.$$('#search-results-container'); var view = this.$['sink-list-view']; search.style['top'] = ''; if (resultsContainer) { resultsContainer.style['position'] = ''; resultsContainer.style['padding-top'] = ''; resultsContainer.style['top'] = ''; } this.hideSinkListForAnimation_ = false; var hasList = this.hasConditionalElement_(list); if (hasList) { search.style['margin-top'] = '-' + search.offsetHeight + 'px'; view.style['padding-bottom'] = search.offsetHeight + 'px'; list.style['opacity'] = ''; } else { var bottomMargin = 12; deviceMissing.style['margin-bottom'] = (search.offsetHeight + bottomMargin) + 'px'; search.style['margin-top'] = ''; view.style['padding-bottom'] = ''; } }, /** * Sets the positioning of the sink list, search input, and search results so * that everything is in the correct state for the filter view. * * If the user was searching while the |moveSearchToTop_| animation was * happening then the dialog height that animation ends at could be different * than the current height of the search results. If this is the case, this * function first spawns a new animation that smoothly corrects the height * problem. This is iterative, but once we enter a call where the heights * match up, the elements will become static again. * * @param {!function()} resolve Resolves the animation promise that is waiting * on this animation. * @private */ putSearchAtTop_: function(resolve) { var deviceMissing = this.$['device-missing']; var list = this.$$('#sink-list'); var noMatches = this.$$('#no-search-matches'); var results = this.$$('#search-results'); var resultsContainer = this.$$('#search-results-container'); var search = this.$$('#sink-search'); var view = this.$['sink-list-view']; // Set the max height for the results list before it's shown. results.style.maxHeight = this.sinkListMaxHeight_ + 'px'; // If there is a height mismatch between where the animation calculated the // height should be and where it is now because the search results changed // during the animation, correct it with... another animation. var resultsPadding = this.computeElementVerticalPadding_(results); var finalHeight = this.computeTotalSearchHeight_( deviceMissing, noMatches, results, search.offsetHeight, this.sinkListMaxHeight_ + resultsPadding); if (finalHeight != view.offsetHeight) { var viewEffect = new KeyframeEffect( view, [ {'height': view.offsetHeight + 'px'}, {'height': finalHeight + 'px'} ], { duration: this.computeAnimationDuration_(finalHeight - view.offsetHeight), easing: 'ease-in-out', fill: 'forwards' }); var player = document.timeline.play(viewEffect); if (this.heightAdjustmentPlayer_) { this.heightAdjustmentPlayer_.cancel(); } this.heightAdjustmentPlayer_ = player; player.finished.then(this.putSearchAtTop_.bind(this, resolve)); return; } var hasList = this.hasConditionalElement_(list); search.style['margin-top'] = ''; deviceMissing.style['margin-bottom'] = search.offsetHeight + 'px'; var searchFinalTop = hasList ? 0 : deviceMissing.offsetHeight; var resultsPaddingTop = hasList ? search.offsetHeight + 'px' : '0px'; search.style['top'] = searchFinalTop + 'px'; this.hideSinkListForAnimation_ = true; resultsContainer.style['position'] = 'relative'; resultsContainer.style['padding-top'] = resultsPaddingTop; resultsContainer.style['top'] = ''; view.style['overflow'] = ''; view.style['padding-bottom'] = ''; if (this.filterTransitionPlayer_) { this.filterTransitionPlayer_.cancel(); this.filterTransitionPlayer_ = null; } if (this.heightAdjustmentPlayer_) { this.heightAdjustmentPlayer_.cancel(); this.heightAdjustmentPlayer_ = null; } resolve(); }, /** * Queues a call to |moveSearchToBottom_| by adding it as a continuation to * |animationPromise_| and updating |animationPromise_|. */ queueMoveSearchToBottom_: function() { var oldPromise = this.animationPromise_; var that = this; this.animationPromise_ = new Promise(function(resolve) { oldPromise.then(that.moveSearchToBottom_.bind(that, resolve)); }); }, /** * Queues a call to |moveSearchToTop_| by adding it as a continuation to * |animationPromise_| and updating |animationPromise_|. The new promise will * not resolve until |putSearchAtTop_| is finished, including any potential * dialog height adjustment animations. */ queueMoveSearchToTop_: function() { var oldPromise = this.animationPromise_; var that = this; this.animationPromise_ = new Promise(function(resolve) { oldPromise.then(function() { that.isSearchListHidden_ = false; setTimeout(that.moveSearchToTop_.bind(that, resolve)); }); }); }, /** * Queues a call to |putSearchAtTop_| by adding it as a continuation to * |animationPromise_| and updating |animationPromise_|. */ queuePutSearchAtTop_: function() { var that = this; var oldPromise = this.animationPromise_; this.animationPromise_ = new Promise(function(resolve) { oldPromise.then(that.putSearchAtTop_.bind(that, resolve)); }); }, /** * Called when |routeList| is updated. Rebuilds |routeMap_| and * |sinkToRouteMap_|. * * @private */ rebuildRouteMaps_: function() { this.routeMap_ = {}; // Rebuild |sinkToRouteMap_| with a temporary map to avoid firing the // computed functions prematurely. var tempSinkToRouteMap = {}; // We expect that each route in |routeList| maps to a unique sink. this.routeList.forEach(function(route) { this.routeMap_[route.id] = route; tempSinkToRouteMap[route.sinkId] = route; }, this); // If there is route creation in progress, check if any of the route ids // correspond to |pendingCreatedRouteId_|. If so, the newly created route // is ready to be displayed; switch to route details view. if (this.currentLaunchingSinkId_ != '' && this.pendingCreatedRouteId_ != '') { var route = tempSinkToRouteMap[this.currentLaunchingSinkId_]; if (route && this.pendingCreatedRouteId_ == route.id) { this.showRouteDetails_(route); this.startTapTimer_(); this.resetRouteCreationProperties_(true); } } else { // If |currentRoute_| is no longer active, clear |currentRoute_|. Also // switch back to the SINK_PICKER view if the user is currently in the // ROUTE_DETAILS view. if (this.currentRoute_) { this.currentRoute_ = this.routeMap_[this.currentRoute_.id] || null; } if (!this.currentRoute_ && this.currentView_ == media_router.MediaRouterView.ROUTE_DETAILS) { this.showSinkList_(); } } this.sinkToRouteMap_ = tempSinkToRouteMap; this.rebuildSinksToShow_(); }, /** * Rebuilds the list of sinks to be shown for the current cast mode. * A sink should be shown if it is compatible with the current cast mode, or * if the sink is associated with a route. The resulting list is sorted by * name. */ rebuildSinksToShow_: function() { var updatedSinkList = this.allSinks.filter(function(sink) { return !sink.isPseudoSink; }, this); if (this.pseudoSinkSearchState_) { var pendingPseudoSink = this.pseudoSinkSearchState_.getPseudoSink(); // Here we will treat the pseudo sink that launched the search as a real // sink until one is returned by search. This way it isn't possible to // ever reach a UI state where there is no spinner being shown in the sink // list but |currentLaunchingSinkId_| is non-empty (thereby preventing any // other sink from launching). if (pendingPseudoSink.id == this.currentLaunchingSinkId_) { updatedSinkList.unshift(pendingPseudoSink); } } // If user did not select a cast mode, then: // - If there is a forced cast mode, it is shown. // - If all sinks support only a single cast mode, then the cast mode is // switched to that mode. // - Otherwise, the cast mode becomes AUTO mode. if (!this.userHasSelectedCastMode_) { this.setShownCastMode_(this.computeCastMode_()); } // Non-AUTO modes may show a subset of sinks based on compatibility with the // shown value. if (this.shownCastModeValue_ != media_router.CastModeType.AUTO) { updatedSinkList = updatedSinkList.filter(function(element) { return (element.castModes & this.shownCastModeValue_) || this.sinkToRouteMap_[element.id]; }, this); } // When there's an updated list of sinks, append any new sinks to the end // of the existing list. This prevents sinks randomly jumping around the // dialog, which can surprise users / lead to inadvertently casting to the // wrong sink. if (this.sinksToShow_) { for (var i = this.sinksToShow_.length - 1; i >= 0; i--) { var index = updatedSinkList.findIndex(function(updatedSink) { return this.sinksToShow_[i].id == updatedSink.id; }.bind(this)); if (index < 0) { // Remove any sinks that are no longer discovered. this.sinksToShow_.splice(i, 1); } else { // If the sink exists, move it from |updatedSinkList| to // |sinksToShow_| in the same position, as the cast modes or other // fields may have been updated. this.sinksToShow_[i] = updatedSinkList[index]; updatedSinkList.splice(index, 1); } } updatedSinkList = this.sinksToShow_.concat(updatedSinkList); } this.sinksToShow_ = updatedSinkList; }, /** * Called when |allSinks| is updated. * * @private */ reindexSinksAndRebuildSinksToShow_: function() { this.sinkMap_ = {}; this.allSinks.forEach(function(sink) { if (!sink.isPseudoSink) { this.sinkMap_[sink.id] = sink; } }, this); if (this.pseudoSinkSearchState_) { this.currentLaunchingSinkId_ = this.pseudoSinkSearchState_.checkForRealSink(this.allSinks); } this.pseudoSinks_ = this.allSinks.filter(function(sink) { return sink.isPseudoSink && !!sink.domain; }); this.rebuildSinksToShow_(); this.searchEnabled_ = this.searchEnabled_ || this.pseudoSinks_.length > 0 || this.sinksToShow_.length >= media_router.MINIMUM_SINKS_FOR_SEARCH; this.filterSinks_(this.searchInputText_ || ''); if (this.currentView_ != media_router.MediaRouterView.FILTER) { // This code is in the unique position of seeing |animationPromise_| as // null on startup. |allSinks| is initialized before |animationPromise_| // and this listener runs when |allSinks| is initialized. if (this.animationPromise_) { this.animationPromise_ = this.animationPromise_.then(this.putSearchAtBottom_.bind(this)); } else { this.putSearchAtBottom_(); } } else { this.queuePutSearchAtTop_(); } }, /** * Resets the properties relevant to creating a new route. Fires an event * indicating whether or not route creation was successful. * Clearing |currentLaunchingSinkId_| hides the spinner indicating there is * a route creation in progress and show the device icon instead. * @param {boolean} creationSuccess Whether route creation succeeded. * * @private */ resetRouteCreationProperties_: function(creationSuccess) { this.pseudoSinkSearchState_ = null; this.currentLaunchingSinkId_ = ''; this.pendingCreatedRouteId_ = ''; // If it was a search that failed we need to refresh the filtered sinks now // that |pseudoSinkSearchState_| is null. if (!creationSuccess && this.currentView_ == media_router.MediaRouterView.FILTER) { this.filterSinks_(this.searchInputText_); } this.fire('report-route-creation', {success: creationSuccess}); }, /** * Responds to a click on the search button by toggling sink filtering. */ searchButtonClick_: function() { // Redundancy needed because focus() only fires event if input is not // already focused. In the case that user typed text, hit escape, then // clicks the search button, a focus event will not fire and so its event // handler from ready() will not run. this.showSearchResults_(); this.$$('#sink-search-input').focus(); }, /** * Initializes the position of the search input if search becomes enabled. * @param {boolean} searchEnabled The new value of |searchEnabled_|. * @private */ searchEnabledChanged_: function(searchEnabled) { if (searchEnabled) { this.async(function() { this.setSearchFocusHandlers_(); this.putSearchAtBottom_(); }); } }, /** * Filters the sink list when the input text changes and shows the search * results if |searchInputText| is not empty. * @param {string} searchInputText The currently entered search text. * @private */ searchInputTextChanged_: function(searchInputText) { this.filterSinks_(searchInputText); if (searchInputText.length != 0) { this.showSearchResults_(); this.maybeReportFilter_(); } }, /** * Sets the selected cast mode to the one associated with |castModeType|, * and rebuilds sinks to reflect the change. * @param {number} castModeType The type of the selected cast mode. */ selectCastMode: function(castModeType) { var castMode = this.findCastModeByType_(castModeType); if (castMode && castModeType != this.shownCastModeValue_) { this.setShownCastMode_(castMode); this.userHasSelectedCastMode_ = true; this.rebuildSinksToShow_(); } }, /** * Fires the command to open a file dialog. * * @private */ selectLocalMediaFile_() { this.fire('select-local-media-file'); }, /** * Sets various focus and blur event handlers to handle showing search results * when the search input is focused. * @private */ setSearchFocusHandlers_: function() { var searchInput = this.$$('#sink-search-input'); var that = this; // The window can see a blur event for two important cases: the window is // actually losing focus or keyboard focus is wrapping from the end of the // document to the beginning. To handle both cases, we save whether the // search input was focused during the window blur event. // // When the search input receives focus, it could be as part of window // focus. If the search input was also focused on window blur, it shouldn't // show search results if they aren't already being shown. Otherwise, // focusing the search input should activate the FILTER view by calling // |showSearchResults_()|. window.addEventListener('blur', function() { that.isSearchFocusedOnWindowBlur_ = that.shadowRoot.activeElement == searchInput; }); searchInput.addEventListener('focus', function() { if (!that.isSearchFocusedOnWindowBlur_) { that.showSearchResults_(); } }); }, /** * Updates the shown cast mode, and updates the header text fields * according to the cast mode. If |castMode| type is AUTO, then set * |userHasSelectedCastMode_| to false. * * @param {!media_router.CastMode} castMode */ setShownCastMode_: function(castMode) { if (this.shownCastModeValue_ == castMode.type) { return; } this.shownCastModeValue_ = castMode.type; this.headerText = castMode.description; this.headerTextTooltip = castMode.host || ''; if (castMode.type == media_router.CastModeType.AUTO) { this.userHasSelectedCastMode_ = false; } }, /** * Shows the cast mode list. * * @private */ showCastModeList_: function() { this.currentView_ = media_router.MediaRouterView.CAST_MODE_LIST; }, /** * Creates a new route if there is no route to the |sink| . Otherwise, * shows the route details. * * @param {!media_router.Sink} sink The sink to use. * @private */ showOrCreateRoute_: function(sink) { var route = this.sinkToRouteMap_[sink.id]; if (route) { this.showRouteDetails_(route); this.fire('navigate-sink-list-to-details'); this.maybeReportUserFirstAction( media_router.MediaRouterUserAction.STATUS_REMOTE); } else if (this.currentLaunchingSinkId_ == '') { // Allow one launch at a time. var selectedCastModeValue = this.shownCastModeValue_ == media_router.CastModeType.AUTO ? sink.castModes & -sink.castModes : this.shownCastModeValue_; if (sink.isPseudoSink) { this.pseudoSinkSearchState_ = new PseudoSinkSearchState(sink); this.fire('search-sinks-and-create-route', { id: sink.id, name: sink.name, domain: sink.domain, selectedCastMode: selectedCastModeValue }); } else { this.fire('create-route', { sinkId: sink.id, // If user selected a cast mode, then we will create a route using // that cast mode. Otherwise, the UI is in "auto" cast mode and will // use the preferred cast mode compatible with the sink. The preferred // cast mode value is the least significant bit on the bitset. selectedCastModeValue: selectedCastModeValue }); var timeToSelectSink = window.performance.now() - this.populatedSinkListSeenTimeMs_; this.fire('report-sink-click-time', {timeMs: timeToSelectSink}); } this.currentLaunchingSinkId_ = sink.id; if (sink.isPseudoSink) { this.rebuildSinksToShow_(); } this.maybeReportUserFirstAction( media_router.MediaRouterUserAction.START_LOCAL); } }, /** * Shows the route details. * * @param {!media_router.Route} route The route to show. * @private */ showRouteDetails_: function(route) { this.currentRoute_ = route; this.currentView_ = media_router.MediaRouterView.ROUTE_DETAILS; if (route.supportsWebUiController) { media_router.browserApi.onMediaControllerAvailable(route.id); } if (this.$$('route-details')) { this.$$('route-details').onOpened(); } }, /** * Shows the search results. * * @private */ showSearchResults_: function() { if (this.currentView_ != media_router.MediaRouterView.FILTER) { this.currentView_ = media_router.MediaRouterView.FILTER; this.queueMoveSearchToTop_(); } }, /** * Shows the sink list. * * @private */ showSinkList_: function() { if (this.currentView_ == media_router.MediaRouterView.FILTER) { this.queueMoveSearchToBottom_(); this.currentView_ = media_router.MediaRouterView.SINK_LIST; } else { this.currentView_ = media_router.MediaRouterView.SINK_LIST; this.putSearchAtBottom_(); } }, /** * Starts a timer which fires a close-dialog event if the user's mouse is * not positioned over the dialog after three seconds. * * @private */ startTapTimer_: function() { var id = setTimeout(function() { if (!this.mouseIsPositionedOverDialog_) { this.fire('close-dialog', { pressEscToClose: false, }); } }.bind(this), 3000 /* 3 seconds */); }, /** * Toggles |currentView_| between CAST_MODE_LIST and SINK_LIST. * * @private */ toggleCastModeHidden_: function() { if (this.currentView_ == media_router.MediaRouterView.CAST_MODE_LIST) { this.showSinkList_(); } else if (this.currentView_ == media_router.MediaRouterView.SINK_LIST) { this.showCastModeList_(); this.fire('navigate-to-cast-mode-list'); } }, /** * Update the position-related styling of some elements. * * @private */ updateElementPositioning_: function() { // Ensures that conditionally templated elements have finished stamping. this.async(function() { var headerHeight = this.header.offsetHeight; // Unlike the other elements whose heights are fixed, the first-run-flow // element can have a fractional height. So we use getBoundingClientRect() // to avoid rounding errors. var firstRunFlowHeight = this.$$('#first-run-flow') && this.$$('#first-run-flow').style.display != 'none' ? this.$$('#first-run-flow').getBoundingClientRect().height : 0; var issueHeight = this.$$('#issue-banner') && this.$$('#issue-banner').style.display != 'none' ? this.$$('#issue-banner').offsetHeight : 0; var search = this.$$('#sink-search'); var hasSearch = this.hasConditionalElement_(search); var searchHeight = hasSearch ? search.offsetHeight : 0; var searchPadding = hasSearch ? this.computeElementVerticalPadding_(search) : 0; this.header.style.marginTop = firstRunFlowHeight + 'px'; this.$['content'].style.marginTop = firstRunFlowHeight + headerHeight + 'px'; var sinkList = this.$$('#sink-list'); var sinkListPadding = sinkList ? this.computeElementVerticalPadding_(sinkList) : 0; this.sinkListMaxHeight_ = this.dialogHeight_ - headerHeight - firstRunFlowHeight - issueHeight - searchHeight + searchPadding - sinkListPadding; // Limit the height of the dialog to ten items, including search. var sinkItemHeight = 41; var maxSinkItems = hasSearch ? 9 : 10; this.sinkListMaxHeight_ = Math.min(sinkItemHeight * maxSinkItems, this.sinkListMaxHeight_); if (sinkList) { sinkList.style.maxHeight = this.sinkListMaxHeight_ + 'px'; } }); }, /** * Update the max dialog height and update the positioning of the elements. * * @param {number} height The max height of the Media Router dialog. */ updateMaxDialogHeight: function(height) { this.dialogHeight_ = height; this.updateElementPositioning_(); }, /** * Sets the selected cast mode menu item to be in sync with the current cast * mode. * @private */ updateSelectedCastModeMenuItem_: function() { /** @const */ var curIndex = this.findCastModeIndexByType_(this.shownCastModeValue_); if (this.selectedCastModeMenuItem_ != curIndex) { this.selectedCastModeMenuItem_ = curIndex; } }, }); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This Polymer element is used as a header for the media router interface. Polymer({ is: 'media-router-header', properties: { /** * The name of the icon used as the back button. This is set once, when * the |this| is ready. * @private {string|undefined} */ arrowDropIcon_: { type: String, }, /** * Whether or not the arrow drop icon should be disabled. * @type {boolean} */ arrowDropIconDisabled: { type: Boolean, value: false, }, /** * The header text to show. * @type {string|undefined} */ headingText: { type: String, }, /** * The height of the header when it shows the user email. * @private {number} */ headerWithEmailHeight_: { type: Number, readOnly: true, value: 62, }, /** * The height of the header when it doesn't show the user email. * @private {number} */ headerWithoutEmailHeight_: { type: Number, readOnly: true, value: 52, }, /** * Whether to show the user email in the header. * @type {boolean|undefined} */ showEmail: { type: Boolean, observer: 'maybeChangeHeaderHeight_', }, /** * The text to show in the tooltip. * @type {string|undefined} */ tooltip: { type: String, }, /** * The user email if they are signed in. * @type {string|undefined} */ userEmail: { type: String, }, /** * The current view that this header should reflect. * @type {?media_router.MediaRouterView|undefined} */ view: { type: String, observer: 'updateHeaderCursorStyle_', }, }, behaviors: [ I18nBehavior, ], ready: function() { this.$$('#header').style.height = this.headerWithoutEmailHeight_ + 'px'; }, attached: function() { // isRTL() only works after is set. // Set the back button icon based on text direction. this.arrowDropIcon_ = isRTL() ? 'cr:arrow-forward' : 'cr:arrow-back'; }, /** * @param {?media_router.MediaRouterView} view The current view. * @return {string} The icon to use. * @private */ computeArrowDropIcon_: function(view) { return view == media_router.MediaRouterView.CAST_MODE_LIST ? 'cr:arrow-drop-up' : 'cr:arrow-drop-down'; }, /** * @param {?media_router.MediaRouterView} view The current view. * @return {boolean} Whether or not the arrow drop icon should be hidden. * @private */ computeArrowDropIconHidden_: function(view) { return view != media_router.MediaRouterView.SINK_LIST && view != media_router.MediaRouterView.CAST_MODE_LIST; }, /** * @param {?media_router.MediaRouterView} view The current view. * @return {string} The title text for the arrow drop button. * @private */ computeArrowDropTitle_: function(view) { return view == media_router.MediaRouterView.CAST_MODE_LIST ? this.i18n('viewDeviceListButtonTitle') : this.i18n('viewCastModeListButtonTitle'); }, /** * @param {?media_router.MediaRouterView} view The current view. * @return {boolean} Whether or not the back button should be shown. * @private */ computeBackButtonShown_: function(view) { return view == media_router.MediaRouterView.ROUTE_DETAILS || view == media_router.MediaRouterView.FILTER; }, /** * Returns whether given string is undefined, null, empty, or whitespace only. * @param {?string} str String to be tested. * @return {boolean} |true| if the string is undefined, null, empty, or * whitespace. * @private */ isEmptyOrWhitespace_: function(str) { return str === undefined || str === null || (/^\s*$/).test(str); }, /** * Handles a click on the back button by firing a back-click event. * * @private */ onBackButtonClick_: function() { this.fire('back-click'); }, /** * Handles a click on the close button by firing a close-button-click event. * * @private */ onCloseButtonClick_: function() { this.fire('close-dialog', { pressEscToClose: false, }); }, /** * Handles a click on the arrow button by firing an arrow-click event. * * @private */ onHeaderOrArrowClick_: function() { if (this.view == media_router.MediaRouterView.SINK_LIST || this.view == media_router.MediaRouterView.CAST_MODE_LIST) { this.fire('header-or-arrow-click'); } }, /** * Updates header height to accomodate email text. This is called on changes * to |showEmail| and will return early if the value has not changed. * * @param {boolean} newValue The new value of |showEmail|. * @param {boolean} oldValue The previous value of |showEmail|. * @private */ maybeChangeHeaderHeight_: function(newValue, oldValue) { if (oldValue == newValue) { return; } // Ensures conditional templates are stamped. this.async(function() { var currentHeight = this.offsetHeight; this.$$('#header').style.height = this.showEmail && !this.isEmptyOrWhitespace_(this.userEmail) ? this.headerWithEmailHeight_ + 'px' : this.headerWithoutEmailHeight_ + 'px'; // Only fire if height actually changed. if (currentHeight != this.offsetHeight) { this.fire('header-height-changed'); } }); }, /** * Updates the cursor style for the header text when the view changes. When * the drop arrow is also shown, the header text is also clickable. * * @param {?media_router.MediaRouterView} view The current view. * @private */ updateHeaderCursorStyle_: function(view) { this.$$('#header-text').style.cursor = view == media_router.MediaRouterView.SINK_LIST || view == media_router.MediaRouterView.CAST_MODE_LIST ? 'pointer' : 'auto'; }, }); /* Copyright 2016 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ .highlight { font-weight: bold; } // Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This Polymer element displays text that needs sections of it highlighted. // This is useful, for example, for displaying which portions of a string were // matched by some filter text. Polymer({ is: 'media-router-search-highlighter', properties: { /** * The text that this element should display, split it into highlighted and * normal text. The displayed text will alternate between plainText and * highlightedText. * * Example: You have a sink with the name 'living room'. * When your seach text is 'living', the resulting arrays will be: * plainText: [null, ' room'], highlightedText: ['living', null] * * When your search text is 'room', the resulting arrays will be: * plainText: ['living ', null], highlightedText: [null, 'room'] * * null corresponds to an empty string when the arrays are being combined. * So both examples reproduce the text 'living room', but with different * words highlighted. * @type {{highlightedText: !Array, * plainText: !Array}|undefined} */ data: { type: Object, observer: 'dataChanged_', }, /** * The text that this element is displaying as a plain string. The primary * purpose for this property is to make getting this element's textContent * easy for testing. * @type {string|undefined} */ text: { type: String, readOnly: true, notify: false, }, }, /** * Update the element text if |data| changes. * * The order the strings are combined is plainText[0] highlightedText[0] * plainText[1] highlightedText[1] etc. * * @param {{highlightedText: !Array, plainText: !Array}} * data * Parameters in |data|: * highlightedText - Array of strings that should be displayed highlighted. * plainText - Array of strings that should be displayed normally. */ dataChanged_: function(data) { if (!data || !data.highlightedText || !data.plainText) { return; } var text = ''; for (var i = 0; i < data.highlightedText.length; ++i) { if (data.plainText[i]) { text += HTMLEscape(/** @type {!string} */ (data.plainText[i])); } if (data.highlightedText[i]) { text += '' + HTMLEscape(/** @type {!string} */ (data.highlightedText[i])) + ''; } } this.$.text.innerHTML = text; this._setText(this.$.text.textContent); }, }); Yo8b , w{{n/uS4$䱇CD[ʢVu!eIM΋30D˃ß&0I KBp`\hn9JE!1:wx 0xsv*吊gȦ!bL9I2Adtrrq}3p4JWFD%YD.r /䝈N͕V{LDR bi˄g$tl!a y˔i:͑h3 1L*E2S0ˊ+d| FūU?8 dqF|YE6!̭hWR (JeqjM)Ȭl&7ݰixd8]Yfu$ =L%ry!/S½KG&c* ӥ8hA-s IMb,zk@RN /Qe$Hz&pJ.}'Ԇ拜by &?:4j,y),0}OǖK>뉥Ev7x#EE((Z9CT&8 Q2,.wp~2KK!z%晘 Ė-? LoĂk?o1`N klWgyN? ^?< Y1k)A哄es^p0_;qce@TbZ͹vQSoV<` {͕OYå?_9=6<x^~oT˨$X2XN3PsqXpQK3Ah_申€H E kFj L" +׀l9D]wL-r3D\5g{0 /fF0>İhT$ {`67 R 91Jnu 0al`t "&Yb.r郑25À܊cC[8{?gZ`Z%3X5U2E 7 DRo=]@mqK47Qc˔57m;Ti"V/[k$Y]?X0lnI(6c"9+Ǿw2'|6_a@vJlǎv= [z4evp>fȘ=+yiMߣ^95q6GM"p~r 4"gr3I3 vq{pت=$,Q$iKӍwx͕BD.&nn0'&4nԷP_ivk2QQ5WX'DfTm;$/ .espf,,xCj߬r%`@C=G%Vȱ \<싼X  E' væe"4OW[Jw떊1&I3~^dYă-#b$';$ΤTڤ\"Z=nL”el4CFKgB[ vu3j8{Ag:Pb*%kشfؼ3-E辪EpfsVcX%MaIFGR+vUjG5 _) yT3j^T8M~G l5D?`7-o'N,!pa_ZM#=Sf2G'&9G$T=iLc!ZXdsITW664[~=wL]ۼݐάXPw,Ob8ugx95'oҰ mbf\~e2e6LSpwhm,jpFiĞD[[~kaW腼WNK>uk/^TS >D2‚ փSe?5+04cxZj{11KóJ77Y)ȣg'iP*D"C:7f63oqȐ5#z%gEH.S#1@\ZAa1^#kˇkH{.;AmxyWTS ,KˬzFN*7j2Z3>5s [mIP_A?j-E% nʼ8$&=&r@o[ 'RW>'x$r'˜[fz}/3]]y%<4u:-@8FmNybd^̺AH$0QZ[o6~8)2ҤuXdkf t{hDj$wx%lשnyowIBW#C {p=J"BT)A $UT$j{EAA% SEB? &ӫRSh 5 0Sx{9YJVJKe1Q>I#1R_HiфȌvt)|VeHtaޟЌr} IϨ&,URܰw* NRps"IwO.Pk“ah_*=Ec֠ }[^Jٷ,S"%U|cl'qk \L{5l4b'j%!gUcD2)Q'_~?Noai@r:jv**v[Q*ISNmad13AEŕ iR y~*{t4zζT*]%Յpwi+]B<9w;N.> {tBby,U gMspx[2>x/Hփ- oߗv֯>Aܵct}:M DX +;QƊ$qa KҔ$".XцfФ{6D#DQe[N&Up%]& ++emvu3Psa+1B5UyIvcB"8i!Nx0(DJf8'##d-$8_gC-P+۲iFUz'c}]:.??SWahD#*9-?sЏX'xl[4 `gPT5߱ Fnθ|i}jJ!S+I\3h0Vi)])F%S9-~p$:\3NgY+WJq*sߩ/κLcjAgQGB_,+fվh // Copyright 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This features file defines extension APIs implemented under src/chrome. // See chrome/common/extensions/api/_features.md to understand this file, as // well as feature.h, simple_feature.h, and feature_provider.h. // // Note that specifying "web_page", "blessed_web_page", or "all" as a context // type will require manually updating chrome/renderer/resources/dispatcher.cc. { "accessibilityFeatures": [{ "dependencies": ["permission:accessibilityFeatures.modify"], "contexts": ["blessed_extension"] }, { "dependencies": ["permission:accessibilityFeatures.read"], "contexts": ["blessed_extension"] }], "accessibilityPrivate": { "dependencies": ["permission:accessibilityPrivate"], "contexts": ["blessed_extension"] }, "accessibilityPrivate.onTwoFingerTouchStart": { "channel": "stable", "contexts": ["blessed_extension"], "dependencies": [], "extension_types": ["platform_app"], "session_types": ["kiosk"], "whitelist": [ "E703483CEF33DEC18B4B6DD84B5C776FB9182BDB", // http://crbug.com/717501 "A3BC37E2148AC4E99BE4B16AF9D42DD1E592BBBE", // http://crbug.com/717501 "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80", // http://crbug.com/717501 "307E96539209F95A1A8740C713E6998A73657D96", // http://crbug.com/717501 "4F25792AF1AA7483936DE29C07806F203C7170A0", // http://crbug.com/717501 "BD8781D757D830FC2E85470A1B6E8A718B7EE0D9", // http://crbug.com/717501 "4AC2B6C63C6480D150DFDA13E4A5956EB1D0DDBB", // http://crbug.com/717501 "81986D4F846CEDDDB962643FA501D1780DD441BB", // http://crbug.com/717501 "A9A9FC0228ADF541F0334F22BEFB8F9C245B21D7" // http://crbug.com/839189 ] }, "accessibilityPrivate.onTwoFingerTouchStop": { "channel": "stable", "contexts": ["blessed_extension"], "dependencies": [], "extension_types": ["platform_app"], "session_types": ["kiosk"], "whitelist": [ "E703483CEF33DEC18B4B6DD84B5C776FB9182BDB", // http://crbug.com/717501 "A3BC37E2148AC4E99BE4B16AF9D42DD1E592BBBE", // http://crbug.com/717501 "1C93BD3CF875F4A73C0B2A163BB8FBDA8B8B3D80", // http://crbug.com/717501 "307E96539209F95A1A8740C713E6998A73657D96", // http://crbug.com/717501 "4F25792AF1AA7483936DE29C07806F203C7170A0", // http://crbug.com/717501 "BD8781D757D830FC2E85470A1B6E8A718B7EE0D9", // http://crbug.com/717501 "4AC2B6C63C6480D150DFDA13E4A5956EB1D0DDBB", // http://crbug.com/717501 "81986D4F846CEDDDB962643FA501D1780DD441BB", // http://crbug.com/717501 "A9A9FC0228ADF541F0334F22BEFB8F9C245B21D7" // http://crbug.com/839189 ] }, "action": { "dependencies": ["manifest:action"], "contexts": ["blessed_extension"] }, "activityLogPrivate": [{ "dependencies": ["permission:activityLogPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://extensions/*" ] }], "app": { "blacklist": [ "2FC374607C2DF285634B67C64A2E356C607091C3", // Quickoffice "3727DD3E564B6055387425027AD74C58784ACC15", // Quickoffice internal "12E618C3C6E97495AAECF2AC12DEB082353241C6", // QO component extension "06BE211D5F014BAB34BC22D9DDA09C63A81D828E", // Official xkb extension "F94EE6AB36D6C6588670B2B01EB65212D9C64E33", // Open source xkb extension "B9EF10DDFEA11EF77873CC5009809E5037FC4C7A" // Google input tools ], "channel": "stable", "extension_types": ["hosted_app", "extension", "legacy_packaged_app"], "contexts": [ "blessed_extension", "unblessed_extension", "content_script", "web_page", "blessed_web_page" ], // Any webpage can use the app API. "matches": [""] }, "appviewTag": { "internal": true, "dependencies": ["permission:appview"], "contexts": ["blessed_extension"] }, "autofillPrivate": [{ "dependencies": ["permission:autofillPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://settings/*" ] }], "automationInternal": { "internal": true, "dependencies": ["manifest:automation"], "contexts": ["blessed_extension"] }, "automation": { "dependencies": ["manifest:automation"], "contexts": ["blessed_extension"] }, "autotestPrivate": { "dependencies": ["permission:autotestPrivate"], "contexts": ["blessed_extension"] }, "bookmarkManagerPrivate": [{ "dependencies": ["permission:bookmarkManagerPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://bookmarks/*" ] }], "bookmarks": [{ "dependencies": ["permission:bookmarks"], "contexts": ["blessed_extension"], "default_parent": true }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://bookmarks/*", "chrome://welcome/*" ] }], "bookmarks.export": [{ "whitelist": [ "D5736E4B5CF695CB93A2FB57E4FDC6E5AFAB6FE2", // http://crbug.com/312900 "D57DE394F36DC1C3220E7604C575D29C51A6C495", // http://crbug.com/319444 "3F65507A3B39259B38C8173C6FFA3D12DF64CCE9" // http://crbug.com/371562 ] }, { "channel": "stable", "contexts": ["webui"], "dependencies": [], "matches": [ "chrome://bookmarks/*" ] }], "bookmarks.import": [{ "whitelist": [ "D5736E4B5CF695CB93A2FB57E4FDC6E5AFAB6FE2", // http://crbug.com/312900 "D57DE394F36DC1C3220E7604C575D29C51A6C495", // http://crbug.com/319444 "3F65507A3B39259B38C8173C6FFA3D12DF64CCE9" // http://crbug.com/371562 ] }, { "channel": "stable", "contexts": ["webui"], "dependencies": [], "matches": [ "chrome://bookmarks/*" ] }], "brailleDisplayPrivate": { "dependencies": ["permission:brailleDisplayPrivate"], "contexts": ["blessed_extension"] }, "browserAction": { "dependencies": ["manifest:browser_action"], "contexts": ["blessed_extension"] }, // This API is whitelisted on stable and should not be enabled for a wider // audience without resolving security issues raised in API proposal and // review (https://codereview.chromium.org/25305002). "browserAction.openPopup": [{ "channel": "dev", "dependencies": ["manifest:browser_action"], "contexts": ["blessed_extension"] }, { "channel": "stable", "dependencies": ["manifest:browser_action"], "whitelist": [ "63ED55E43214C211F82122ED56407FF1A807F2A3", // Dev // The extensions below here only use openPopup on a user action, // so are safe, and can be removed when the whitelist on that // capability is lifted. See crbug.com/436489 for context. "A4577D8C2AF4CF26F40CBCA83FFA4251D6F6C8F8", // http://crbug.com/497301 "A8208CCC87F8261AFAEB6B85D5E8D47372DDEA6B", // http://crbug.com/497301 "EFCF5358672FEE04789FD2EC3638A67ADEDB6C8C" // http://crbug.com/514696 ], "contexts": ["blessed_extension"] }], "browsingData": { "dependencies": ["permission:browsingData"], "contexts": ["blessed_extension"] }, "cast.channel": { "dependencies": ["permission:cast"], "contexts": ["blessed_extension"] }, "cast.streaming.rtpStream": { "dependencies": ["permission:cast.streaming"], "contexts": ["blessed_extension"] }, "cast.streaming.receiverSession": { "dependencies": ["permission:cast.streaming"], "contexts": ["blessed_extension"] }, "cast.streaming.session": { "dependencies": ["permission:cast.streaming"], "contexts": ["blessed_extension"] }, "cast.streaming.udpTransport": { "dependencies": ["permission:cast.streaming"], "contexts": ["blessed_extension"] }, "certificateProvider": { "dependencies": ["permission:certificateProvider"], "contexts": ["blessed_extension"] }, "certificateProviderInternal": { "internal": true, "dependencies": ["permission:certificateProvider"], "contexts": ["blessed_extension"] }, "chromeosInfoPrivate": [{ "dependencies": ["permission:chromeosInfoPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://version/*" ], "platforms": ["chromeos"] }], "chromeWebViewInternal": [{ "internal": true, "dependencies": ["permission:webview"], "contexts": ["blessed_extension"] }, { "internal": true, "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://chrome-signin/*", "chrome://discards/*", "chrome://hats/*", "chrome://media-router/*", "chrome://mobilesetup/*", "chrome://oobe/*", "chrome://assistant-optin/*" ] }], "cloudPrintPrivate": { "dependencies": ["permission:cloudPrintPrivate"], "contexts": ["blessed_extension"] }, "commandLinePrivate": { "dependencies": ["permission:commandLinePrivate"], "contexts": ["blessed_extension"] }, "commands": { "dependencies": ["manifest:commands"], "contexts": ["blessed_extension"] }, "contentSettings": { "dependencies": ["permission:contentSettings"], "contexts": ["blessed_extension"] }, "contextMenus": { "dependencies": ["permission:contextMenus"], "contexts": ["blessed_extension"] }, "contextMenusInternal": { "internal": true, "channel": "stable", "contexts": ["blessed_extension"] }, "cookies": { "dependencies": ["permission:cookies"], "contexts": ["blessed_extension"] }, "cryptotokenPrivate": { "dependencies": ["permission:cryptotokenPrivate"], "contexts": ["blessed_extension"] }, "dashboardPrivate": [{ "channel": "stable", "contexts": ["blessed_web_page", "web_page"], "matches": ["https://chrome.google.com/webstore/*"] }, { "channel": "stable", "contexts": ["blessed_extension"], "whitelist": [ "B44D08FD98F1523ED5837D78D0A606EA9D6206E5" // Web Store ] }], "dataReductionProxy": { "dependencies": ["permission:dataReductionProxy"], "contexts": ["blessed_extension"] }, "debugger": { "dependencies": ["permission:debugger"], "contexts": ["blessed_extension"] }, "declarativeContent": { "dependencies": ["permission:declarativeContent"], "contexts": ["blessed_extension"] }, "desktopCapture": [{ "dependencies": ["permission:desktopCapture"], "contexts": ["blessed_extension"] }, { "dependencies": ["permission:desktopCapturePrivate"], "whitelist": [ "63ED55E43214C211F82122ED56407FF1A807F2A3", // Media Router Dev "226CF815E39A363090A1E547D53063472B8279FA" // Media Router Stable ], "contexts": ["blessed_extension"] }], "developerPrivate": [{ "dependencies": ["permission:developerPrivate", "permission:management"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://extensions/*", "chrome://extensions-frame/*", "chrome://chrome/extensions/*" ] }], // All devtools APIs are implemented by hand, so don't compile them. "devtools.inspectedWindow": { "nocompile": true, "dependencies": ["manifest:devtools_page"], "contexts": ["blessed_extension"] }, "devtools.network": { "nocompile": true, "dependencies": ["manifest:devtools_page"], "contexts": ["blessed_extension"] }, "devtools.panels": { "nocompile": true, "dependencies": ["manifest:devtools_page"], "contexts": ["blessed_extension"] }, "downloads": { "dependencies": ["permission:downloads"], "contexts": ["blessed_extension"] }, "downloadsInternal": { "internal": true, "channel": "stable", "contexts": ["blessed_extension"] }, "echoPrivate": { "dependencies": ["permission:echoPrivate"], "contexts": ["blessed_extension"] }, "enterprise.hardwarePlatform": { "dependencies": ["permission:enterprise.hardwarePlatform"], "contexts": ["blessed_extension"] }, "enterprise.deviceAttributes": { "dependencies": ["permission:enterprise.deviceAttributes"], "contexts": ["blessed_extension"] }, "enterprise.platformKeys": { "dependencies": ["permission:enterprise.platformKeys"], "contexts": ["blessed_extension"] }, "enterprise.platformKeysInternal": { "dependencies": ["permission:enterprise.platformKeys"], "internal": true, "contexts": ["blessed_extension"] }, "enterprise.platformKeysPrivate": { "dependencies": ["permission:enterprise.platformKeysPrivate"], "contexts": ["blessed_extension"] }, "enterprise.reportingPrivate": { "dependencies": ["permission:enterprise.reportingPrivate"], "contexts": ["blessed_extension"] }, "experimental.devtools.audits": { "nocompile": true, "dependencies": ["permission:experimental", "manifest:devtools_page"], "contexts": ["blessed_extension"] }, "experimental.devtools.console": { "nocompile": true, "dependencies": ["permission:experimental", "manifest:devtools_page"], "contexts": ["blessed_extension"] }, "extension": { "channel": "stable", "extension_types": ["extension", "legacy_packaged_app"], "contexts": ["blessed_extension"] }, "extension.getURL": { "contexts": ["blessed_extension", "unblessed_extension", "content_script", "extension_service_worker"] }, "extension.getViews": [ { "channel": "stable", "contexts": ["blessed_extension"], "extension_types": ["extension", "legacy_packaged_app"] }, { // TODO(yoz): Eliminate this usage. "channel": "stable", "contexts": ["blessed_extension"], "extension_types": ["platform_app"], "whitelist": [ "A948368FC53BE437A55FEB414106E207925482F5" // File manager ] } ], "extension.inIncognitoContext": { "contexts": ["blessed_extension", "unblessed_extension", "content_script"] }, "extension.lastError": { "contexts": ["blessed_extension", "unblessed_extension", "content_script"] }, "extension.onRequest": { "contexts": ["blessed_extension", "unblessed_extension", "content_script"] }, "extension.sendRequest": { "contexts": ["blessed_extension", "unblessed_extension", "content_script"] }, "extensionOptionsInternal": [{ "internal": true, "contexts": ["blessed_extension"], "dependencies": ["permission:embeddedExtensionOptions"] }, { "internal": true, "channel": "stable", "contexts": ["webui"], "matches": ["chrome://extensions-frame/*", "chrome://extensions/*"] }], // This is not a real API, only here for documentation purposes. // See http://crbug.com/275944 for background. "extensionsManifestTypes": { "internal": true, "channel": "stable", "contexts": ["blessed_extension"] }, "fileBrowserHandler": { "dependencies": ["permission:fileBrowserHandler"], "contexts": ["blessed_extension"] }, "fileBrowserHandlerInternal": { "internal": true, "dependencies": ["permission:fileBrowserHandler"], "contexts": ["blessed_extension"] }, "fileManagerPrivate": { "dependencies": ["permission:fileManagerPrivate"], "contexts": ["blessed_extension"] }, "fileManagerPrivateInternal": { "internal": true, "dependencies": ["permission:fileManagerPrivate"], "contexts": ["blessed_extension"] }, "fileSystemProvider": { "dependencies": ["permission:fileSystemProvider"], "contexts": ["blessed_extension"] }, "fileSystemProviderInternal": { "internal": true, "dependencies": ["permission:fileSystemProvider"], "contexts": ["blessed_extension"] }, "firstRunPrivate": { "dependencies": ["permission:firstRunPrivate"], "contexts": ["blessed_extension"] }, "fontSettings": { "dependencies": ["permission:fontSettings"], "contexts": ["blessed_extension"] }, "gcm": { "dependencies": ["permission:gcm"], "contexts": ["blessed_extension"] }, "history": { "dependencies": ["permission:history"], "contexts": ["blessed_extension"] }, "i18n": { "channel": "stable", "extension_types": ["extension", "legacy_packaged_app", "platform_app"], "contexts": ["blessed_extension", "unblessed_extension", "content_script", "lock_screen_extension"] }, "identity": { "dependencies": ["permission:identity"], "contexts": ["blessed_extension"] }, "identity.getAccounts": { "channel": "dev", "dependencies": ["permission:identity"], "contexts": ["blessed_extension"] }, "identityPrivate": { "dependencies": ["permission:identityPrivate"], "contexts": ["blessed_extension"] }, "idltest": { "dependencies": ["permission:idltest"], "contexts": ["blessed_extension"] }, "input.ime": { "dependencies": ["permission:input"], "contexts": ["blessed_extension"] }, "inputMethodPrivate": [{ "dependencies": ["permission:inputMethodPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://settings/*" ] }], "instanceID": { "dependencies": ["permission:gcm"], "contexts": ["blessed_extension"] }, "languageSettingsPrivate": [{ "dependencies": ["permission:languageSettingsPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://settings/*" ] }], "launcherSearchProvider": { "dependencies": ["permission:launcherSearchProvider"], "contexts": ["blessed_extension"] }, "webcamPrivate": { "dependencies": ["permission:webcamPrivate"], "contexts": ["blessed_extension"] }, // This is not a real API, only here for documentation purposes. // See http://crbug.com/275944 for background. "manifestTypes": { "internal": true, "channel": "stable", "contexts": ["blessed_extension"] }, "mediaPlayerPrivate": { "dependencies": ["permission:mediaPlayerPrivate"], "contexts": ["blessed_extension"] }, "mdns": { "dependencies": ["permission:mdns"], "contexts": ["blessed_extension"] }, "mimeHandlerViewGuestInternal": { "internal": true, "contexts": "all", "channel": "stable", "matches": [""] }, "networking.castPrivate": { "channel": "stable", "contexts": ["blessed_extension"], "dependencies": ["permission:networking.castPrivate"] }, "notifications": { "dependencies": ["permission:notifications"], "contexts": ["blessed_extension"] }, "omnibox": { "dependencies": ["manifest:omnibox"], "contexts": ["blessed_extension"] }, "pageAction": { "dependencies": ["manifest:page_action"], "contexts": ["blessed_extension"] }, "pageCapture": { "dependencies": ["permission:pageCapture"], "contexts": ["blessed_extension"] }, "passwordsPrivate": [{ "dependencies": ["permission:passwordsPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://settings/*" ] }], "permissions": { "channel": "stable", "extension_types": ["extension", "legacy_packaged_app", "platform_app"], "contexts": ["blessed_extension"] }, "platformKeys": { "dependencies": ["permission:platformKeys"], "contexts": ["blessed_extension"] }, "platformKeysInternal": [{ "dependencies": ["permission:platformKeys"], "internal": true, "contexts": ["blessed_extension"] },{ "dependencies": ["permission:enterprise.platformKeys"], "internal": true, "contexts": ["blessed_extension"] }], "preferencesPrivate": { "dependencies": ["permission:preferencesPrivate"], "contexts": ["blessed_extension"] }, "privacy": { "dependencies": ["permission:privacy"], "contexts": ["blessed_extension"] }, "processes": { "dependencies": ["permission:processes"], "contexts": ["blessed_extension"] }, "proxy": { "dependencies": ["permission:proxy"], "contexts": ["blessed_extension"] }, "imageWriterPrivate": { "dependencies": ["permission:imageWriterPrivate"], "contexts": ["blessed_extension"] }, "quickUnlockPrivate": { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://multidevice-setup/*", "chrome://settings/*", "chrome://oobe/*" ], "platforms": ["chromeos"] }, "resourcesPrivate": [{ "dependencies": ["permission:resourcesPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://print/*" ] }], "rtcPrivate": { "dependencies": ["permission:rtcPrivate"], "contexts": ["blessed_extension"] }, "safeBrowsingPrivate": { "dependencies": ["permission:safeBrowsingPrivate"], "contexts": ["blessed_extension"] }, "sessions": { "dependencies": ["permission:sessions"], "contexts": ["blessed_extension"] }, "settingsPrivate": [{ "dependencies": ["permission:settingsPrivate"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://settings/*" ] }], "signedInDevices": { "dependencies": ["permission:signedInDevices"], "contexts": ["blessed_extension"] }, "systemIndicator": { "dependencies": ["manifest:system_indicator"], "contexts": ["blessed_extension"] }, "systemPrivate": { "dependencies": ["permission:systemPrivate"], "contexts": ["blessed_extension"] }, "tabCapture": { "dependencies": ["permission:tabCapture"], "contexts": ["blessed_extension"] }, "tabs": [{ "channel": "stable", "extension_types": ["extension", "legacy_packaged_app"], "contexts": ["blessed_extension", "extension_service_worker"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://bookmarks/*" ] }], "terminalPrivate": { "dependencies": ["permission:terminalPrivate"], "contexts": ["blessed_extension"] }, "topSites": { "dependencies": ["permission:topSites"], "contexts": ["blessed_extension"] }, "tts": { "dependencies": ["permission:tts"], "contexts": ["blessed_extension"] }, "ttsEngine": { "dependencies": ["permission:ttsEngine"], "contexts": ["blessed_extension"] }, "usersPrivate": [{ "dependencies": ["permission:usersPrivate"], "contexts": ["blessed_extension"], "platforms": ["chromeos"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://settings/*" ] }], "virtualKeyboardPrivate": { "dependencies": ["permission:virtualKeyboardPrivate"], "contexts": ["blessed_extension"] }, "wallpaper": { "dependencies": ["permission:wallpaper"], "contexts": ["blessed_extension"] }, "wallpaperPrivate": { "dependencies": ["permission:wallpaperPrivate"], "contexts": ["blessed_extension"] }, "webNavigation": { "dependencies": ["permission:webNavigation"], "contexts": ["blessed_extension", "extension_service_worker"] }, "webrtcAudioPrivate": { "dependencies": ["permission:webrtcAudioPrivate"], "contexts": ["blessed_extension"] }, "webrtcDesktopCapturePrivate": { "dependencies": ["permission:webrtcDesktopCapturePrivate"], "contexts": ["blessed_extension"] }, "webrtcLoggingPrivate": { "dependencies": ["permission:webrtcLoggingPrivate"], "contexts": ["blessed_extension"] }, "webrtcLoggingPrivate.getLogsDirectory": { "component_extensions_auto_granted": false, "whitelist": [ // Extension used for API test. "ADFA45434ABA2F1A4647E673F53FF37F8F6047A3", "4F25792AF1AA7483936DE29C07806F203C7170A0", // http://crbug.com/775961 "BD8781D757D830FC2E85470A1B6E8A718B7EE0D9", // http://crbug.com/775961 "4AC2B6C63C6480D150DFDA13E4A5956EB1D0DDBB", // http://crbug.com/775961 "81986D4F846CEDDDB962643FA501D1780DD441BB" // http://crbug.com/775961 ] }, "webstorePrivate": { "dependencies": ["permission:webstorePrivate"], // NOTE: even though this is only used by the webstore hosted app, which // normally would mean blessed_web_page, component hosted apps are actually // given the blessed_extension denomination. Confusing. "contexts": ["blessed_extension"] }, "webviewTag": { "internal": true, "channel": "stable", "dependencies": ["permission:webview"], "contexts": ["blessed_extension"] }, "windows": [{ "dependencies": ["api:tabs"], "contexts": ["blessed_extension"] }, { "channel": "stable", "contexts": ["webui"], "matches": [ "chrome://bookmarks/*" ] }] } // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This features file defines Chrome Apps APIs implemented under src/chrome. // See chrome/common/extensions/api/_features.md to understand this file, as // well as feature.h, simple_feature.h, and feature_provider.h. { "arcAppsPrivate": { "dependencies": ["permission:arcAppsPrivate"], "contexts": ["blessed_extension"] }, "browser": { "dependencies": ["permission:browser"], "contexts": ["blessed_extension"] }, "mediaGalleries": { "dependencies": ["permission:mediaGalleries"], "contexts": ["blessed_extension"] }, "musicManagerPrivate": { "dependencies": ["permission:musicManagerPrivate"], "contexts": ["blessed_extension"] }, "syncFileSystem": { "dependencies": ["permission:syncFileSystem"], "contexts": ["blessed_extension"] }, "webstoreWidgetPrivate": { "dependencies": ["permission:webstoreWidgetPrivate"], "contexts": ["blessed_extension"] } } ko6vQ`XYٵѢ8\{`%/8~3$%Q$%?io23yԯi]R!Ǐrwsɫǫ/_||NE[}2#/ xyƫUBЪ YXq.BY)%Сms*U$ȨU*ŋӬ+V 0xbÙjˊU|n~hDi,,ɖ9MG$~V)PVmE]PkA* ;UH V봴ee'kie," 5Kk@\H 'XyZ5=5@ KD ޑa2ڒ$h]Cʿu䛢| Ƥa 5MuH?6e靖n8@s%-BI0$Xɡ.xMueLQl AEH2-RMi͟hn,Ihn % `yFeyy%̨|L#,xJQGTteﮀ9)>= < Ldz1@UX?akOSluIqG66ϒW@x ]N-K7S lsá:r ˛Ib߈yJn@u$ߣz&I>M_Ogk$*&,q}-HGYۃZ0f(x-\z@w7&v䌔5@XӒT+tv VlpTo+Ҋq G Jwu H0ڙC͌c";j g{,S3 %߱|P) VT 5F%D/?W"<@*;FkKpk4~U~܀ce\h&ʙpP1)teSI>ӃqW%aSfS19'S}h!_͡܇#}# T(#}lO9W~= x#lM\3+gb^QNC}ûC7/K2Z@lD->Jkknvŏ]5W XVaAVedؼSF$NiR"& B<KVۇ!ell%ֶ댻/|Jkpmޝw$Y{0&R#uގVշ@.hj ;ف ~t*:cD{HNKUiVeg3Zv˟z"S`ʗwS){o=k4mKX!s#X"~-s&ۏ5}8`R%5+cOhޓCm)-.}adTu6>56)@ ySNN*)XNC5@_LOyׁ w>9o{EF%<{EPAX漟nrТ/o!\zVN-8'hٰ%`t`9~/GT瀖j؊%?)gط!{c&TVf$.,Tjbxxn$UdDwQ3BVή,2\b4-a1[a~yÞiVxO*6" h̼>W|>0΋{Í鎟@YS;iuhyE8KeOE?*PIU]ob7}ϯD\>6TBЪ;,|[$a=6%m-g̜934)2)&fu7dYglnz?RؑVڍd\D@rgjҭEL𸤁~F)l/8S-<#ezY!%cZ:RraQܡRhey+[$= 5 Cp5g[82yq;5[5.\\vLQA`F]\&\g@xitX>bpDpKCLH{GJ ߏh^mzצDek@g J:oU-@ӻٔ8N-?J@F]VhCfܽKzPA?L&{SJt@%8:&9A )]+.X[^nL*aXp;q*%^,+j}tUj,7 9OqVms8ίMC&@^:p٦|hb[Y[&@ ]8쳯qNj`^ER<Ȋ7[v,AВG@a4al@%C"zgr"V0"+ X29._ % ( PP1)i,8iʗ,A)R(JK;J5'((%# rUdQ?9,JRS0ڽ]Nh4N ˨P1>453Y 5REFsII;|p<L<#i Nvc] !;;pף>\݃= qXN^߾! ~{= 0?v4tQۋ\'Ԋqn G [7B7@5[' _ѽzF2wlAC;P(q0C?}7 mcEF^HBr}ڠwӋfð!͡鹸"[vpo l5F9<}kߠG?*R\CWzH;"09aC{-t0I*2_[9߽h[ Mb"a s3to(_ݹp+w=F@n53tbUkye֩ǭpqS%|hLx 3[nhH2YX,Y"t?.Ƅ ,Hr$ջR~cY$5S+!9'd,]Y8>smVgHV9Ԏ$IG*p$)! )ir[ja89!C"xa@/ 1IiQM(u,/ K.ZqYQkI'L*+Uqoܺ|YNNQ+<1craMgm֟NfŌ#xShO?=fހX4E-9|5J"AxW,OfHT>zNk7wr-\WVN34k=o];s6{ e̝T~XքnqH%^3)#IYVJJis&uiV+PÖz{_TҘcHS8V1[}v*؂njNiVdkKouͩGdYޅ:HԀ/Sy~#U @6 l *rX8O&>#Uo:ph|imlK~okߍ3 =fsA}-kfn*שasRZ}_̳lo©5,}S*[Ү&/ O_UMo6W fa'P=mP$WEDD$Ҡ8FZI|h ؊f{oF Zo| ۗ`j̺uyA]`e+α*3YY2k%( l)ael`sҘJT)cJJ(d[kUn#~IĩkSz ѕ0Ke9Iw"Ef99Xc<4~59a,H $O@ H҂@b~ ,ҁoc%bY81yq[NxPIP +x l H_0Αv͒Y/Nz4˅1C8fΫx‚d=_h"Y}a(*n=l~_`! )j;8p+⎖q^bQ0imYvC_B޸E<((Q8"B,BVG4!͇aivK䇟nf gdw- ;rt/,Ӱ%=년Mc>eI(!%3)vА:tO 9qrޯ/cqqrr6xC5=Z<S;k|#'Oqޥ(t6v9'>=b_wyH^:ZM;GN.V +t)GB.ܥrjUOW8m-^JJ᪖ r\4=!|^ԝ aJD|eAGVk[+㿿;. ]J1 ).tEaAߣF'&%:nב2'99QDw2:jPD@&) Q"D ,u00}"Q`iL6"<:[ fdZQ1-Qk3U?$RPM-iOL <JuAm$w7ۻ Xw(Qlmq 2BN}pyZE.KCfA߫wkUn6+KpEEEDd%Fу,1 4(*YwV6.=ԇg޼f48g95,{4\:=xkKLL[oC0Bm[z Bdklp‹ |vC kͽij˜B5ߙt {MX܋8J))"p3RϷ{pj }@QFƄ]o3]~u4zצ㴲m6;/L Jնʅ_\iTٺfiצ]a?xA{SwaxINlN .E8жŧF\ptǰE8p}x' nh0y({Pz T1/,nESmCR7R,%,,RS|R̪`>07XKj j "O*b yQH&VȲgB1e3rKESy! R$U$+.җ dLxz.[,%.4ʅGlq*զB$YoMDٔԚ' GQLn#W[ƳvT;Z*EYEF"3dUG2)+Y,(hFyV)-yɥ֥(s:Lf"'41%썮1C{Iy%(M/|N ϱyBQq"lSӐ[l8OcwÁ8JKZ\M&W(=kǍ0n |OEk5$JaX2c/םn  cqغ vu_ -b`\:{ι'\yOp]Zv1ֻ=n\m,w x[7O h\ "ȼn?!{G k4t^+;˒4KO1S(j/z*j%Zc >mA4hg|gjXMpVZWp]il=S)ublF0RPosp\{9d 0t}ԮRIJ g2 3kB !1s0]yw ?qptDqe+Am]!.~M~LNCU@;'u%YBl)\"BCQвIE1b9vc!E4J9Z1΅^p0uu)U)p,dg+M֩A.\!͡NVr tډ2\EeuLYWՍr$17GkOyr 3k 3:: RFNb,%Z *@$=VA+j&EH7kQʶF̱Ey4Eo1Ɋ|E8(ν.craC3LڣLdzC?b >WenUIw9֌iqV%Bo>K>ߏ-T/㮋t&Kd Wmo6_qH?VmݰYcIr`Zc"iR^0;M2mT{U#>VfSÇ#xz+sSH:;(-TN'FX֕Z52Ρk*dam^045&Wk $leU9l+sr|7_q+}ѹ"%KJI֣yЂY2K([[@.VD]DGZerbe@07gbVUu"hp/0=t7o܎ |BM֔RעbPRA)jY)QاȻ}s.i$Z5͓@նLphV 0 ujF 1GXFxXz)JJem}O 3E] hqY h>aq~80xFqB0~NW\,I /@)gx̗ 1 Rs48_kB4s3W䔧!F1˹b/7I09  삅)$3>?tpːþ0fsNx̂zz 0Hr> dNՠMKBI 1;'d9NR.SgQ4qaOX||y-Lw7yL !SEʣ##L}ԞXG!+xl r<$9/lX0%OGLOwƱ"NICn.]r?Ŀ|\Y}[?Էwp$3DESNF9BlaD}VT#pS_$n!~;ɬ=Z`J؈~ P[NŞ/ "N;AwvqeJ{n},9",Vˇ+-z4њ[mu{EhGۦ~?^s vjppԩ&M7M7}]b0նk%ܺ481Cnxpߣ}V*8_]r<]/Eu'?_ЬDjJF)e0e]RpJǿTi);6Ɵ$K3Ki _UbU|}Dv{SF^ϥBg  ڕ5e6vƗZm4yI mV\xL!j7-GT)n˫rLU?EGoThխ\6Q~ [zynP} Пjc/|W*ǻ(҉l #xO KG Ru;NQZhe\qSST{Y%Xܴ\iuk@ -PHQ!4vDNlB"'4N^^ +ƞjߢ7q[ #OiX(<ڇ=,7ᰦP~tkV(U8hcߙdK UMs8Wte)Rsښ9[Jv[L>jk035%׭}_{:Ϸܹ֐1EmK!7O1~+X?0XQ5tlGڄ'Wڸ~Gl->|(;؍+Qڛ~g4ݓmՀu϶{uC$3|9s׏ =͙ZC k@ġ#ӹf1.Swn+3D˜3m ƅ/.tRٸ3P6AA"=jb2 q4w0{,;¹#+=n pdO `G!m`wᙻZ9sKuBj W*HhFPPJ-4JS%xJN"Wa>D?XIRBk*CezD22|D,/$KY`gBOR>P?Le)g8,W *R4R**ׂX_"uFr)18 /;Q~/qL(p)Li*8]PH%eb鈁Jk" *R V?JCh͡AR%s%Be!hI] u'cR`\E DEaR` T*dݠpL#Nyƚ#rfh#TcD El{qq )af21O\d 9K-nPH8b8yU p2/yB׫6 xWmoF_1Pq8$'iRGSͫ,HʎQ\IP\ri(R8-z*yf晗_Kʶ mif+YMFV4^_ l-N7u @JQT#",ɉ7jEB5֨UkHT%UQ[KJUZ]^-iuke V` TKS";Up$[aO,^UuU(VjvN3ާ\lp*V0^*$TC%Ѭ S`4/IFzGg¹< :owO87HeHK? /2J)ϳ? ϋ$n_,f!b iϧe" Ӕ™,>Eagi4l-$OeLq3`GWmapQzf_/v(A<ϒIJg! oAOh3EDx zL`Kᜦ(_9?.$Ix΃tyfQ"4L L,Nu4`$CT@u2'Eo@<=uls3'.ۀf>\>< q05H^=Ic4/fE8B&J/JY /]|RK/EO# HC9#ߕɦhz2Htmohn{4ڝF;cB1IEE+SSVTU7'z[PwW3 C~-:^6<@tR0Ù n3tƒ'Osd֘,<0=nv:Cq n|Le=>}ݕΟ[u;FQ z?0v>\^ &>`JQǥr9:qfhS6']p(Au˲ 9봺БCgN^ #vBka|@"@,P9 f ՉGnjK+=Eu 1zbM>u87F_~Mࣇ+g~:Mܯn䡠Ox0ri钎$!'̟A\jΪOx, V]s6}>&Cfۇnc  8nʠؚDҾ53I~{{b8F ͎s msr`n1y>(ixÇo[ U6(.7pSdsh%6V ٪[FTLAq`/eMRAdp)5W1J>܀18) 2Y5&+6W S&slhXMVfc$Jjq=D3i^c¢YDɕ> ``y,p˔ˬ-yi&Ls%X<o7$~ @ަk7&Q( x2Z$v>vt|`& 5I@]F>xLAJIbՌs0.ini b #!%SVi`b="7NdVq&L?3xKd6ܑ d6iLl'0%ם-cxx~6;Dģpd`[n|r0mB~Y]scCo$ia< gw# ab[%"t]a=}J%|RH"u1zf3RԆbïe5t$ȞtÒHfj}:'GChiBqhbڽpe{GYvwvG ODBdf&+yS3ೝdRm'W?01;9 h4(dU̐;؁;:[h ֜$'Lk3E}<*Pknٵi1Ď0ؘa&Q) Qב][lS}k6͟%+Ķ +;]sءX(D:!O55FPP^(fV퍢g;QxkccKV6܈ؔRVx'6fA?5WU] ==}[ݲUZ(ҳ+YUTz'wBƕgYA߈N˲WmlL dްHiu34 i4{Pj#JvCӰ{n_ &~dٻ{Ǝb,n / UMs0+N!cHhSf:iUdG_w% bHƻ]2CY"?Ȓ%3ru hi)dPJG6ѻVU2=5]egD#lL7*qI*g+&=2RI_wvFC;kgm4<%2On'w7#FtUKo6W nd/%& K.I%Q脀$$-;C+wsn1p|uyO>oo3_oA]<Sl! M0t3# ;m #Etݫpۈ ; n, Bohmni:ܹj^ii@otnM;l6YnSFpQ%&}v{h s`ؾ]އuCmރOF63Mh}lC>jߒ0A'TP fpPE;ԉ8pLx ‹RyQKu穰S0y! T}㵬D opC^7R,uYpUVZykSxSZcZr VR HViU˦"ĀRиSYx[Xq/+RMB:EJk&țIX7r]+*/Xb4%+KL-d/9Jen!$uFE5}!$ -3Pk d6 `+ RH"jJ h.(wBQ\މP*(!fQ09\Q2DٚK٬/1%tdp)t/9K7Ʀ`Ȋy3PE)9t/O:=C&٧bAmY=gzA+ i?քS t4...0vk0.xXU +h{kv[/~vαaH9lB՚Ëg|]|4̢3m [A7w$AqˉA,6:k <^{3avo:7Ms8ga)T6]{2^"l2!=X % &S{gT*pV~uK&rz }~?~'Xxt )<@ N12m{5 pF\e]&,Ѻ޿R\+~GK"<ؾ]KT:-\1l#N!1@8ɏ3 8Y0  \꯳5 J7KA˹0k%D m1!, 4(1T`1RU[࿯Zb\g Q-2@ !RFf?3AaUĿl&Ja\ͥ" k)Xj-5WLx1EX %+oT\[0ȔJNB(D$Yf<F_8bjV9 BVl;ؤV|E]ϴ6RvՃȹɸZD` \j-2\zmt2.ײ"Rm H`丯#;4cXLBX*t@Fh~T'I;5 vͿ,uX xAq|}rtdr_tm/6|Ɨi<3z2x%ݹ|XXiBɇN\ٵ~/&&0DY1Qq~ I%mAEg7sf($ȥ=7&b9_p3xio2 | }ED@ޑcD8ZܤESFTÃ~ONݴΧ\ l)SLG'h6X,U={HSt4kH6amر'ߎ4ݯR$yn6/ Rw' gIX*3ڔ4^ljxԧ#66H-?4\NL}J,QVҵ[YN 2vꙈ!GL V>xՇ  Xl۝Yΐ\oa#Ӡ , $ƖO܁rЍ>uJH`X='6C,M3!ٳMkL)YH6).rD}7S'0`m8P푱P2m?9(īvz =kՎ9Qm2mpd Vld8gp# ҥE)P%\^ЮrDA0CF AK Cr>7ۤ}}Pk5|i]5O'nn.vuB6__uZuMZ VYz V&-Ҽh@٪]u6H~q{Ҽ:@;yX:l4d >%V֎x\!SV#7VYm <ٮ_Ԛq׸yBtٍՎޝ4[z}i4Mиo@'j"[JrR5$F0VYo۝f g'LFYo6uN ~>m7WFu{i^_epY8 +.usy[(I&J RwT0 B$WY}h>4ۍ, SMNC ޲^B_196yJj'wM\@øBGB慍|ዓzAF؆56}u ͭ -JȄ0}VIi{2=v*\.| =J 7fvS{9=H,O'HNm̑sj?R=&)Œi+YW"z٦C&#wl&p->fwm/; #w~!5wᨻfsN? /l3GYpsyկ{s(Gܙk8T@pd`S<*QDxMRq2l!w],L,Ԏ)L:y+c_ӛz>Ox! FY>ux'&;s.f#@'ff9CA>BFmۚHLvoU)W*9)ʁ .ɁH@U>,R# )@hȘH9vgVM+JD|\X s &˳zِ>pB WXڋHg .dث0VV, 7Vfؖ*MmU/R90oEf!2J KiҘ0dٙU}k OwwrukV|w6tkUvԸ"^{?Ǐ{AvجyNo=|?}8}wT6jǴqmm_6? ݬu}rlۑ?>ݩ9}[WQ[s}xqAbrl'[_z{ן49;ۻֻJ<ʦN֙)Z ]0ö+`0qStҞR%}}*%}U{7nNnzەc XϟϝsGߵ{ÛskWjwVrq۹n8W:_ϝNwËN*Êuzm}V{d:߫jv/3yW:5?7fszj-ץl٬X77ky窳uGϲ??*ԛ۟˗N}i|瓛~{< ,o-|+Po[p8rUQBAVUjGAr!9,g.BY`,@%cG.6\vVq |ix4荞_Y~'bB0@Ă~ZjТG ]zAb[hh,vwwSDgN7Ѵ+V$luF@`3`9+zOʂ(zM N~"zcN^)+8/wWYQ\9;_ǝRkI,Ux9Rt+1SЧ~ϳ&,b.I3X׵B@/:(9J+uml,AȷZ9Sْ%^l%,}qk-UMނH6̡: !xG'qcxr0^{HH}fCdg1\GEQJ6}ϑXOW f4>&+Lb8J, \z990i$9i1DO7? L(gկco1أ`CMrJ£ +06LXtcab'sv4MD$i.y(#G \rA}GT(reJE1U-0I~! /*><ٔzhȪc##y7)}ZQb¿O5| 3?9ENuѥLE#&'|A!3'ɄKYУ ~:!4!yoIyrF[_*E{ _wy-ˑKШ,s'G 9yaKϷyNK²R,Nܝ܍&os7M1w׌zѪs7)m}:@ѳ,y: dN'{ĀL8Xf¸e)S}D3 syNLm)1ġ1Q:]sDE8-CsI͑K1{nZ[v&oY>|kd:1Jbpq$*qQӟz{X#|ɲtUXX) ڰ|+%WT9w*ϵ-%21Ku& H"J 25ԧVOMlLjA 0eLe3X4db DE LRJ0,7NN XZYe8 -u,Qe/Mn7VQUIVF-"i]AwD#qhyC:",рJ%a$W(=&l]h?e~9sM³aNeJYdz GtLw|kܽiR0q(qO>hDf!;w !!:G[h":$MǷ Zsb!pO9gO9%reRQ*Qv)W(nڽ).R=(aJX^ti0!&ǔ{rvTr| Z'>.u1^| lR.UK96ñ^R`lSJFA0nmflzíNk\,oz\RT-ft萮)d0lVtCliC1I3iN&s2@ 2+۴ 0R3Gbr,f&u7cXTi:gxzTbA8Xl%u n-Pv"3]g5^Lǖc:=@3jȴe퓤 æ,2 sBF@[z.pr,Ks ~!8sO}@Ĵg\X~`#!I2UG%AΊmh$Xцj??Īju)QU˟](>]!,^I>wdxG6%l;\$~.N$rBTޅXRmp{eՖκ.Z6Ai z=3muAO'#[()Q/ajWu5=EWXfrƏK$?*)L+G&b㍊&d86-6-=i9iYok+ (iIMLltص(D:Cd>nb9^ÿ]-?1x`~3ԩ@xb`z6'sĵ ?8" #\u>iQyI0^'u8)L8J7GtGiIt2#U6!Jh1 1&79;eJ/pl풊[I(BSktWPbFԉ "PNp8H#qS1N)(@<63ܥE÷aN0VXбFKmXznHO&' :m k)z(7`T). uO vGd(%,]8֨,ծ` tQcUpyO5ï +ዤڎ&|{^4wi]ʼnX"O/fZQgD>$:e#UvIZX1PFFds˘D=Q0@Q~\CF 1KcۚyS ء*qxy*$a>r<~ȞmΦe}6#L*KSwU!3 1FGTʼRQ WМ$d;0۬B)MUP5nQ'KPe+G$`|u#MKX1緲-. +-~N"Ht.U&/(2GjW(9%׾̞e FG|mr;.*C39>Kwڠ\jREh`J*D2mED7F4Re҆neY엍)ZquH 0V lNDCZ~-hTg͖|  ĥ_S7btE)׋DM/Pc]=? 6rqoFA#IپD0O$txLd4|GnʦJ@rܟ넥!LN\=5 [ď=,"slN&d-!{BpO$OOms٤lf?sD^v1ØТ7tCl |bE}B*XSv.6멚NASJDĦq'ڵg>o!)E 3ORCNxCW>)M^ޝ7bܬ(rbG[aV ~=0(ÍN,2ɷk6srN6ywMq|3 }\i>@4d'C4I,zTt]NFR#*tロ>R g=ꁂ-)]ŗ34_r|UDT+n )Wp>ًcO]g/+ ?.>-oB">H#/bӨXcu:E@g<A%n ,CH/T*_oϺUӝŠ dK7D>k;{`$9P^pSUc ?yH5'w6q/KSxRaɁ>U8'fF }0P^{[:]B4zϙMܓ`I.fHJ˴ݴEnnMw= w~Wzk~i$L>&{메E4*=i׊xR qOarhzعq4dy@+rRAm%o1]?b6V-MvґI`_O+}GJ/U6SXYjêzUɷJzjJ.IMf\)+ scF3#)'Gb.__ihppb#۟oUQNbPh&)ԶaBi}eW|O8UE4aWBjx׌mģ2Lnʂxw\O30 aDңs:UUk7ߡKk 4+3 ָđc_V".e8 10KL܉] j)qttM|ݖ22ao>8rߺƷ }ƛUP+ Z¤7c[fƾ:$R֗?r*U5I`؉~êޖ>=;#W>m\TLυĚQHS?Wo/w>w%7?g^gg=NQwDHmSЧ'8+IiN# / Ϋ ?%6= b3rW#<Żxr{sU`0o>;k2n sBu᫄{~9TX`);gք%/DO>btc3^ / Cc#kv=1{dEs0/AF~Cn%^3j ٔ(T\T bE9\Q4c׏ԳŹ@+p@ $ }u~9 #`6zȆ{]C`ֺ isӯ}]̰"5aK*{ "_CwKzJ*aD#Z%|"u'yba1_g ̟.>B2xح9,y[C/1SFf0e?JCa `1<.6.J ]!e<&M>BS! Bq}'.3f4<\\,i `3N+>؜okrk#~8H'cR̓@h)g@bf ߰qPsJ+e$4O2ʊ_y!J_/saJ-V"(1=\YeUǪ/{2K׭ZBo[%Տ|0.\\Ε {w*9jQ)VE2Q3J~=~yR~S*VF`laBeRdQd䴼AtWaN{*֨2/ b( ;F PO ߐY _EQXTvD~;Azjib'mq *jlήBV{P VXW58oDxYbU /n`WmɈl0QĮ^>/OOO<Zǟ\_ 'h24Ɇ.m-ј9bf`_`?/鐇[@aq *h?)Z21S~E $hD ~x+ ¥B6gNAZ c4+I=˞r0mmR9U"5\/Fu"@So0~_qBJci2x͉5ǶliA9'֎I~$;cNMY>= ML+SV E:S B#=xӹ 2Y(O[dBT\Cie:-@jGrsVRa̓M&B@'@OiXiB0m3!JR>ūcROv3:Zj qRzY% w Vm!&C2;ĤDa6pHh2:omDsAi[KHxVyP_u j#m!}#AXTHYv}_NV TX}:獣`C]Bwu,Sj%5R̎DSz)Bذ4ŵa-! aAy$ q%kr8RwX3iSoN-1 CE҄`,>Rly&q"y=;7\$S2`/疇"Cws3ɖHFw=$>z!]R 0 C`+" #f& ad: o> {r;7!sIst034У$ QAo7׿ʼn}!0] KKI ڶ،k(a&d\8+6T bT&qh=7]hIU YS']3b3IbYOr3Ji?A@5Sӥ  [G@yfH\De|:kIJه,, BSĤ} w27HH#`/XM'Zإ퍉ak*sDˋT;{fywz^p<7lzak\M15 8`l%ԪPغeW }=lfBlp5 .-mt&$ +s㲴6xSkcKlSQhNTJGӥ13iڗ4eVWZL9.um%.|bJ؋S@z\]Gs3l`MW]N]h'_,U߅꽁[Fq` 6F4X-L&T9Ԗ,Ύd+ os:#/1N5ئoTƺE9+r2BD`7&g zB6tI! =7.-(y9E}Fe]};E.{XtLa̘k|yD}s-(ݝ:' Ӡ+"Yц UhBְgRcN=SdYbI,MҮ_'U/5|'RRܳ&m %V{CE~9,7FG@Bw[5lyh/(s0rpEu9wإiL8 1\i5)#Ct+?VtehF#S2cgx 4D[7C`o4&3{3őUtp vRfH; %ߑhݟ~1 \2[r'>UD*]e0~()ec%lȈF~[GqhKb¸{Q/(oXgH9I[[* 0 ìMiK.Xgړ{]b$=*\QNfuO d(yRl.8풠{w%XP+-~~iCjF m\#]"(fZzOzNj |V B/;wWț B 1Js y^a,$X㰉 o&0d!lc_E@+C%nT2m)IG6Qcz2_;/r3z[Kud73GĶc+4~59AP̜8:P%TR$շn3FdBV5C.Ý5fҴX,\*rERboMLs>zː*ߞ+62]mr/R]k0}ϯSle;iHmVƠK7ث#] ~Wvۤ c}st{ q.li@50* ֓e@n̾=d<aS[S|mFkA,:GBL V9X DiehǯFJ`C4_DI>iJ1cn܊$I۶qVI9OU+ j Qa{kN+ƁtN%WL 0R(}L^{ +O&+UHmsIL㗂tUC㿊'WMo6W HKl7i6]^.GJ$")TloCeYz- C{3nQ6;"cd޵Jsp4(zy8[SSiвULpYW!q eTHTV)P0N,QRki)^JeTѮT9UA&T m} l׳ϳU&!LPD)Goz&EԷay%zzC:U=Hf fdcдlEƙ?Lu/j =容v薞 Jyqu|7D9}؀:7/7Y8z6.M5Q%t`:z=Zo9a*uƕ4ʓs,ΏBo[17~J»s%:v&k߼\oDž|Mߪ[AUN@,{rOm?lo\g=w7t'ɉ[=?#ݐ:Lt'jZGޗc)hS8R nSa 0 koF{~8TRЏ@%:A|"("WHʖ̾ev޳3;lryEA?;z ^ ]h,;)KEI8!c9Xh"QNY٦$%,`|e%~yrb i0GO< 3k`!. C OQ MˆrBt+V'fCҹ)HCS+qg' K" Q1#6Xn^]'~bNA(Ep=Rr `bIM;H/Xq^:o1t\p'ލ5?_M'=[F8` x. &co_{ jHY[?^MmׅW#Y!55z\`<`w%rY 7K?0ߍwx`tBn9.!8BuK&|D#J|Wk!%2Ȱ\ާd8zŔOk?W9eKx(& x= lD磹`3xsBB?{8̸cŪ0:{t]|ЂmyiIj幔PW7 JF)܄Qw~L`Yi[+ CWs= %͜V!v8B"F5Q5K2nCxtdPs>VZt&(Ҭf5c) ?3d~~$صGal,<*%v$vaH!bfx\HL8;;N$>_* X@-FC⧗-!}Fw%U-T n0*R2$&<϶BRI\;m)VNT.Oנ6I)7Cտ Ԗw>ƒ1i-, =?wzT٨x6fibqn-P-*7Fxnc/L)bYW>Id'24: 2A:o\ ! ӤS@⎭F2_F)+GNbkw(e&ݭ#zȩ-}ց_Uzi ' XGpipW\BYǠ⣿%zsEXu>›jҍVuBImufA*ݴi[9UwPT}w彧T*'ףe=;}_Gq)4hO J}TK,B"S \$Fy2 U|z9)U ST+f~uެiD\-Xj˫=W;_z`f ahoUQ>F^[DԤM(AO~E^EޙU0A!5G9jT̋|*җbdS9t߂]юdi7H˪Uѝ5N$^cF?ыa.7+4f~ҘF`r!S ib$,}m$* J4^? z 2YMwpvr|_:8ݱSoLg4cyjҡ H00FZhݎ;FsDQtX5m0‹ίKm]NH:b2[[ˆmF~eoSA#My@O atwx>u䑣eޥxGҝ;}#`Uw?y^EzpW4kډ瞊t>.x'J)%k)hmfl~ >.~^37qJi4\o0gģ7Z7J"xLv) zEHľX\iD@fz6+JU 6 R #/OVL%56/ = R垜 )Zw|3'͟nKO?50_L|{es*r$ndh:.R뽉bU@,9e.`•7E?TN_ @j7R*G\sU(kZEryT#rf"UԖ7 YMd3f[}[?/W3v3BsSuֱd^ {C>QY vH?! _Vٸ 岪)8D?Mwؕ'ƞ6K1b&&wڟ,Yo:PY7 ԃg۬ӝ6[n\Py`p&JwCAQ#-x hr &02ǙeJ0  եB&P̄@@Li*SA lg/]StS :c+N`B~ #f㓳7p|kw=LF&}%74; ޝf"yoqO12ORhM\pRL0:#tD|[7,簂;3HluTE%FzG8^>Gu>H7ǩ pvtT@[N#yׇSW)}^-@XDs^ޅ2_'$`VNdu2!\_jcĦꞣPᖥ)5fIGpdD: VFK s/ټLūFÏ63J#h4Ym&|U-!f Yn Ck`t -F;>._'N]ZX% b =X]sBm@hrl/jCTl5*bb+p2 )&UյPH'lTR#rJ~ss^ FHcDn@71^?#Dw"&fS~VU=AEm%!fV*-JXozeszvҷmUZ7{wJ7v&X)C'/rC[kM#|m {Bs7%.C6.h5&Jނe՚ ֢'c=ﳶ(0kmi8=Z7Җj)Ӡ.ėR CRMz"Uo بVWypW]Z J>HKwI0CL@* bOn/#ӂ7jPׄ[.iْ>LoD@'i$-\c\,6f+{Dx.ChaJFoRS*>2Nl{> 3;ʧXr,ѭ0cprD7P::WYZDR3齙[yHm-M 7!C/|!\jRR6gSoC-'J8>f'>IJaN({( 3\K.[oն3-2V.b\o/t*4R']+1a'9D pkk.p<௿Ԝ_6/nZj(6ͻ'Z`ͤɄ~/hdXʿ§CUtVRs筏,UPkM :7뼵d69NA uq7!QieAYU/Цp'Vߏ6~_1DhhE+uvt;UUŚ0FVq~AHv{/E(bJpb!,>Z8A>!vaTHW+I)NtP-GW9 9q,qhRs]p܍bwb*~p6iwܱ3.WoVO}K'Xe*}ԏvErJ'Eg 4MA@V<<+ l6g2y w]e8 %((Zʄ\7F"\"{j_9AOHk/bzNRV3cPVԒB Rm%kJ JDƉWW"v;TQgtHer¡wOEHwg~Fpxt AHLbiȈ"Kg"v9D,(ؐ,<֔kR8fI1PH4 hQxyj&RK5IMvzdixЭ#JHgÂ=vh䠓S _PY=FXD9AZp1^s,wc*tF(+| }H=ˉ ΆDe΋Mm1V™ O̓CfXf$^xRVXoX*)d5j=rf{7KZW-: VQ)e7|ZPTw9HF6Mg71_^R( BHs h!lxI+'rBpVh]׾g[E`Om焯A.:o/EP: [  &T-. 3 $i18n{title}

$i18n{incognitoTabHeading}

$i18n{incognitoTabDescription} $i18n{learnMore}

$i18nRaw{incognitoTabFeatures}
$i18nRaw{incognitoTabWarning}
$i18n{learnMore}
$i18n{title}

$i18n{guestTabHeading}

$i18n{guestTabDescription}

$i18n{learnMore}
// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'welcome-app', welcomeBrowserProxy_: null, /** @override */ ready: function() { this.welcomeBrowserProxy_ = welcome.WelcomeBrowserProxyImpl.getInstance(); }, /** @private */ onAccept_: function() { this.welcomeBrowserProxy_.handleActivateSignIn(); }, /** @private */ onDecline_: function() { this.welcomeBrowserProxy_.handleUserDecline(); }, /** @private */ onLogoTap_: function() { this.$.logo.animate( { transform: ['none', 'rotate(-10turn)'], }, /** @type {!KeyframeEffectOptions} */ ({ duration: 500, easing: 'cubic-bezier(1, 0, 0, 1)', })); }, }); /* Copyright 2016 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ body { align-items: center; box-sizing: border-box; color: var(--paper-grey-900); display: flex; flex-direction: column; font-size: 100%; justify-content: center; margin: 0; min-height: 100vh; } $i18n{headerText} // Copyright 2016 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. Polymer({ is: 'welcome-win10', properties: { // Determines if the combined variant should be displayed. The combined // variant includes instructions on how to pin Chrome to the taskbar. isCombined: { type: Boolean, value: false, }, // Indicates if the accelerated flow is enabled. isAccelerated: { type: Boolean, value: function() { return loadTimeData.getBoolean('acceleratedFlowEnabled'); }, reflectToAttribute: true, }, }, receivePinnedState_: function(isPinnedToTaskbar) { // Allow overriding of the result via a query parameter. // TODO(pmonette): Remove these checks when they are no longer needed. const VARIANT_KEY = 'variant'; const VARIANT_TYPE_MAP = {'defaultonly': false, 'combined': true}; const params = new URLSearchParams(location.search); if (params.has(VARIANT_KEY) && params.get(VARIANT_KEY) in VARIANT_TYPE_MAP) { this.isCombined = VARIANT_TYPE_MAP[params.get(VARIANT_KEY)]; } else { this.isCombined = !isPinnedToTaskbar; } // Show the module. this.style.opacity = 1; }, ready: function() { // The accelerated flow can be overridden with a query parameter. const FLOWTYPE_KEY = 'flowtype'; const FLOW_TYPE_MAP = {'regular': false, 'accelerated': true}; const params = new URLSearchParams(location.search); if (params.has(FLOWTYPE_KEY)) { if (params.get(FLOWTYPE_KEY) in FLOW_TYPE_MAP) { this.isAccelerated = FLOW_TYPE_MAP[params.get(FLOWTYPE_KEY)]; } else { console.error( 'Found invalid value for the \'flowtype\' parameter: %s', params.get(FLOWTYPE_KEY)); } } // Asynchronously check if Chrome is pinned to the taskbar. cr.sendWithPromise('getPinnedToTaskbarState') .then(this.receivePinnedState_.bind(this)); }, computeClasses: function(isCombined) { return isCombined ? 'section expandable expanded' : 'section'; }, onContinue: function() { chrome.send('handleContinue'); }, onOpenSettings: function() { chrome.send('handleSetDefaultBrowser'); }, onToggle: function() { if (!this.isCombined) { return; } const sections = this.shadowRoot.querySelectorAll('.section.expandable'); sections.forEach(function(section) { const isExpanded = section.classList.toggle('expanded'); section.querySelector('[role~="button"]') .setAttribute('aria-expanded', isExpanded); }); } }); // Copyright (c) 2008-2014 Marshall A. Greenblatt. Portions Copyright (c) // 2006-2009 Google Inc. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following disclaimer // in the documentation and/or other materials provided with the // distribution. // * Neither the name of Google Inc. nor the name Chromium Embedded // Framework nor the names of its contributors may be used to endorse // or promote products derived from this software without specific prior // written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. XKs6W gh)q3iI䁈8(wD![qz6\~b9Wɝؒ|Z-x g6}r&ɔ `@/qfRs-䷯|c#ԒJ244SdKtqɌ |=?$]wz;­[,W#y]t=b],%QL;R;y#˭Y(Q7H{YH&5^䨃0DM5}~2 )i8iy8ڑrz}$c7bAqLit3n)tH|bW2|~)@V%!$UpNJ_g 2]4>ҟ*k"$oۊ40e eyH^3%GS.;Ws vp(]e.%lZd&+Ch8"b$ޅ.VS᭿!99>=̈́Z$持u.s39n$l<1ܸGMB#p+M:sr|d@MKXG.T-V hdVX Y@o|'h[r-30b?,B$`fF dsqzí_wa۷owk?K|X#Ŀ9J}o=ٝAyX-MR5O%Vv\F_(p6GJK^͒'w3Ÿ\Ȯ=>"A):uE͝; kS ţrɅ4JmXoSwn Zkq1j׍/݂"V SO^+1e'*J/\>w䂅DvY~B}t$<2X+z:$iTnwgn]mR1ia _&1<;i HŠ|@8/ˆ+qruU3s]SeG;\$J@6VIh;Zjںreil: Rņi2>ͮO>|&xK+0z=Id6O Ȅf-HNTI1$at:Of ]EybkL.1]4>6'@94M:=8>$=@f Aa?UDUG*(DQ_>zJ P-zc41G|3*}pʧqMIa_|`yhϳdIsapN1:+{hgU ʛ;G⽣O?u$~;|VY7|:l@X bkDkm\= ^DS8t7nHG(fAmzrmjqOF>ETCz]]u%oAKWͻL#&%2* sM: 0e`ꁢ~xέδZ&gɤ$>bhG.G(izwR0HMʘ5TP{%&E@mbkxi{AȚjÏUq })ħC>gP|Sf :Ψ>GN_f # ]v4vdsݭɨջ]kFwWS3M4zݕ^M՜^OaP,ޖh_UҾJK?S7wU^~ʆ3V't!KZW GCG} "K(fA"V=~mc|}a 놢)^n(blStLrv5rTV,_!)%[Q9g4ǫ6ȚޘTm2ӶM>쑷&TK5F+ȇs^nxSٺj8J,r Bȵ<_r]*u7:KՖa[cg2jEIU\\\E(x;< Ջ&B]yW"ʿd7O *[Sn O1;I<%<9Ek+E fyHx$YAlк8Ha CE''mgeػyx`qTqz_9%dԀ_sS$[c ?7KPt:U#,ׄKR>B^i{h؇#tP: ԉ7"{7?%XW8lcUdc]UgXsu|ZD yRj$5}o 6"y7pzB(Tn0+5BG_rJ J\I).AR"^Qv"@jwfgv)l,+I/{,ղY7{Or`ѡݣM` ?+QcsB,iV>=~f9P+!2 jC÷(Lo'7&y5u~N2JUlOHXl>uydZɤChUI ěE_RjT2耐 1ÅLa>|=k) JM;+x'HkI/Ia{l! ( W$3ஒY( JQ40vS+)TRgB?4b oMO?Q)itݯ 0gx]~kvNĂ{AF< {ԩXFM/UK6lX”,/`5ײ@iѫ>mN^…˦ 1IFP"p_~N3O~[_ =[A.4-PNG  IHDRaRIDATx^SA 07;:usKHjtAa%81d/T8|!姜?S:[üIENDB`PNG  IHDR D PLTEVtRNS@fcIDATx^I ѽYJpNBW+JpT g, 3 2 s B}QIVըju}0cicpx3^+o:IENDB`PNG  IHDRJ#+IDATx^10Ec{.T¸L vqve1kp #"y$\^#3tT *ath2um!D`(BW'MB#bi@sP HLT*3shsãm׷3{}\#:uBn|USgL4ݾM]5ףmIENDB`PNG  IHDR..IDATxO@p.p'eNZAb71ª˵nhq:^൐ *!{EcHk!=DdDoJ}V[!i=t4R$ =EZW/SVUUDJJClJw ~UVupyFЂ;xoXe߷7uib2)*).:ڰ%_l1L4bV %t2:s4=ZfeoMSAm{Jdyax`TPX)&LD匇эD!X\fXD~-|4Ad OJalP RGLʴsqa;K^ 9'Z+doɹVtb?V ?Jl;9Amh,U27xLлg,G̈h_7*5je&/ce|ySSO<(CsCjڗQuQ='`:`I &h.ZyS nu#y s:+y0O|Ll(lk+"5V![v.,5mhq۔VD= Х[/̵d%| `XUwe h0Җm^H*Qyv!j1ÚWC &ZXt\䴌X0uLHI8k< tjo8:PK_ktXY  }'u&P/ɘݓ pWEOxo5TVe*C0hC"g_r`6;a02PL %**XCT:W9B3MjG$Wl_]}7؞G@ope6+ h4O@vDsۉ) `$;Mh,5AɨlqOY(KU_fٺf#č8"vxנ>HʞțD"h$ ǖ3Њ))ddoVYEYJ/ \kGh=^t (J_+Kt -~p7D6265aUR2FWIHt!l ְ BLH7DžDd{ 7 p%Z 16dY#GuUfUɜ7[48{Q z4߄ .Go|qř7[kcН1[Q]TPLa":CNⶉ6X%j:H":ej%`gZ >ҤMF~4^d_X#8E׬S E'x.J1qAO*pUY 7 \B0׳Kۙ黜m糣gЊ&ˎߑԏ_>rvʿ&t,40X"~?r]bo(DJefC. Nr U"P}0 X`P"A_XeEtu~{`ɲFCZ$[ @kOVM1@ԗwt,yxG5LSŒe#ƌ 2+9(|7;Q fQV@wKF{N@;|_r:6!co8,fʊ^N;1,Wѷ!MwU~q;(m-<" @q2K5O#9N!jMe,:JNtK?3OUv-;&8$t;31j8 .͆be";'NfH*[ 'Y3|E ΀'ചs=VOGC=eCn]䏲<=73\fO1R"'0g/8:xRpieXOC5U%T"Xjlz7B~TǏp}5FB\(_>rs.\N*V S11 2E4=䦨ma?Z=uMjg/ze"Ru1EGpU[|ҞS`/!񙨬bnxi=OK`kw%[N<4W\gٲ|R;qw>~ & شuF[1M!/j*4M9>خ i˹X3ze۫7rAŝN_ʞ'yy$cZ5Fn 3햱l3!^?43d`ߣJ<ߓ~.T >A'mYzë@olΎCז_-Ow8doxzAim A\ΪE qs7XZA$C7y6Y}]-l1o$B?sY$-H]y@,,tOM["xWuV҇գ%yJV9}FW6":~-se# $qG8nﴇ$V:ލnJX[5ޫJې7&r/\S6ўwۉ-{*<%q-{U;8e}4[C64own%47N{ϡF{"f[39ƍ RWv6TIPc#LX3ơ<]1k#Ʌ-yqOƁ )5wWh_yR=[ / kdwUy-O.}/pWak/Zشh& #@;KYlCRn,a[G\lDb .k( x߇f}>&FVD&+ jRqeaYtўbyȤМ2dZ$+fA@sc y4)G|$@ø#l twݺBŐt7icbWA؟@zi&cc Qt`Y[{+[3X1,o; w X aDNS;t!˭v ׷Qzݸ뜉[!2 @+$Mח҆Ҁ魐:;KCpZKQ/Yw~_e?T9VڍsAVy=S5lkSsRFq瑣4l Qwqұ].mfLDZΚѫ-?=@ 8>vY>ɺ+k/|F+tA. R]l4n<Ǿ"Ց1t48 _9TV=&/|D6+Xi__>\*AP'xa?&t`Btʑ<.EՊu,#rd #șDG.r,d#%gw13* C۪~v ʸ=eLKiHuS]O@|ϯJHvh>UT !H T }}ZM>ɑ};;737ab׭ӫ\WIlCq:a\@<;*hO%r[se*lp8蹭 HW+%ES@Y'.&) Fh֊wGyFٞʩg `rl@z:!Ir,+DZ<4d8mbV\P߅ṁg*=FGyry2/(4y1Zfr<ՄqDR( MW;aj銦쉂Ӡ"jk%%ܿ;o0R =Gs0,o4⦾ $Zv 6쵾?{Ouyu=*`l!'*ƫP Y#<6x$ƲD-tbn@XRj܊8H0F<|ߙUEg_h6N^fGKkFk8,źJ&{y+#qT{$0QAW]o6}C%movI!k%}*,64鑔Sߥ%+FТ[HlQޜBoFSa<ߞ;ܤ6"s66RBnhECE TX:31B9=B=0xyZRĨͥAGJt8EWo/ (6D( 8~BWLNh (uF.hzOQLX"F5: e,[ׄ۾!lڄR*A~)2y %Ǝ{%5s`ʤ(d qGL;f4pz䘡 lO~`~DB29>W _/}s:͌0Ix 7t\R[aM:NqÖD06} zC[ c7!'RX|0l95gA=y="H$Q]:OEyn^|Da\8?X'Oj,7@ *aTf&zW`CpjHH%DvKvȠS51lbkr-vnhu黒>K-In[Xn䴢Y%_ױj勣ϒWX׆^p]Ls˗AǼ -a h+t7BkrJaݴ J>7!vUC=*(b$/R!yX+(_FǴRx؋ A_趰3x׬|OXtu^wiSeږj'1[5b_(CJ1Mwt&I1Qj$͌8,m!liA3: 1> J%f*x#9q( C惸[եᘌ\+ ?6k}/Nw犜uij^T^Clxa{9G^Gz|Zo̻(:駖NQgb'Vn@}+FKbBH4WYZc.] 6妄=sfΜgm\$Wp4 sbM*rJuxR Xth(=?́rn0K`{h=FHskRs?_~\*m7Z)xŌ-lQF`U8@8~ocyX6 E0>_%hzwR 4l9/iƄz>M "Oco IV5qȚ 2$I}%έ"$1U5 26]IA J J"5uҹ2)NT)ԧk rcYY6[v$̜tU% \8e~7=?T8ݰ~.p]7Z#/".!ܗA\(62pL;V+`WqT,sea)9\Tyy[̩ϦgӪ$8nDhPj>uzaM]ºdYu:Mj SrU4DݧtMA=48d[I>[6G ma9ISI1v .u}"|i Z}b_ 'y%k_Joy&)6_~8*ڗlVznӬ_ Z[o8~(;L-ML.fgMw}*hP@RqEn/I.&&ys'w߻FUd4>Ecb'2W1r.CH"A$$! R1H\<$+HDJB ~0 H l* 8EKҋx0IЯwW7ߠ227pb0_(b//<)@Q~ʭ9^f$8\%DaXH^"«RH:BypT4T<$p */|l(Y;`)fr6Ӛ(c1|^|An7^Ok[phu`Q,V4{d8 i*FFCS4Ø#TN(L/}krɟBx'G`V5Y>P_柢PiH3& eC9@i_Zhĩ=אpRp=bI5 \q=6fB*3a%b{<p|wi];"ѺE \T&8 ^ngi!V&}~صQx<a\Z`R]@zߋ' I>Ϳ ]kKFH_&ϹT4EVg0%QkBRMaT胒i7BUKDq"V8p`$əe-F2cO *˓?z2 Cʁ# a QM~/F#v$@rHk BhXR0ڲfhL6&#U2jo+ pA&8ШMMۡ-EBihy4u!eOiH@8S 7^R] p-t6d\R}9V0N;u h TiЛRcznSBî|<^ADզ86 I,g},ת&5r::c[ =`J8ު`O*+PG4)"]_\gڵfv8^y$9Sr3ދ%iHVlh_z3}7$殯?ځ`:L i,\jڞCW)te.tMU[4e ^-["#Uyȼ̽{n"D9CFsE ijؽ+ RvkZmgwb_Ymwjf022g}Hmt+80 eP˞CTH%E}Adw[DTzL5ir֖@,%ryA!o 5BZ;56Oe &BhkYln8m\M%\֬rYў2rҵ s-jk2\Z77ͯpKAB;l 1g~E$րȒ{G@}ꝇMo}m?7f@^S:˶&/[mD`R{WgW؞M{> ;xWV XGNw AҒ?7ÿ s,IP+&!5оhFPfbX_7j tdw$K&͋6_a)pN8-nJKCrCR~Fo7S击DVwdW+{ 2Pw@~,aEv|݄h%!6;^yhx y^{>[HdPr͜ؼa1+Z2mfBKlqdv<5ճ䉪l k`-na NG/X|(-Ve)?]i*A*3Qnk"߽bG$=rܸحܒc(ٹEGrNm$9w)EHH5ɺ@CپT6]{@nt70;;l^vѰ/~UKvneUG uYk^4aj,J8Kʔ3x[)~`1{uv]79gy5aI\knu9{sHG0_$s%K"雇v!\X~TS~;WtiُHw?^.2dK\\yTru-}tHsA}F-"h>~ F ]D/P}0z?+2S(fQZ*X'nRQ/d7 Dxiyh"U8_l#@l-em=ɯ- ?"Ի߳3$ Jc`$\oI9kD4e㚭1+`6)UsbSU; PFF3M{iTTV{>L( k\Z..~r_}].[kh%%0EZ46`^Uz9e9/Z:!-Fk6%Amw`5|+p"lfM+qL ymG{m9h*¶&\yp>-aD Qx vCgޠH zwZ#[>~AuDGD5() 8ÈCifSnBgv* :?I]ڲX! ʊTuߡ &fjXޱRYj G8 F Z54ZTȄkvD> i(z$IOZ6L 5>V=Y*+s(sH-ة5L:9ۏ2 HTSP ظobKy3暵~SVպ^*P2wXrA2Yލ hEuYf+V4i[#)Brvh5?'[R¡SV7cå&:\߯!Mаz^XM@:EC 0?t\H#'je)) Ɋ#r8t3sb_Hg@ɢ,`%de _mNl"DŽ"~}ϺJTvߢ4r#ɰƈA% |MC߄6lӷzԦ41ޑg=1amïl1J^Džߠ]\l@Y6FeTa7qP6JؿPѾ^D͊7鲳7^dN*\KN$ ݃)~exCdaGqV0+c$`N14lSd_qak'k! o|;PG4_߶ݩ$ȳ}`JNYLt}u|=j9 9B(m*3}k"38a3 2}A{)Տgw<vD5/o-᳉P  jψ9imִMvx]yiwICL@ٖ<e =.[Gs;4R#@oJ'=/醚rto"5/]ܳQa㎟71(OҶk3-/B3!.Ov_w:m۸^pӹ'-,Ƞf1l@W_nNjCp;wM|]P[%U'PEQLam!9REv2eoC逿~יXzuwgd}r`m!5m`gm!C6AC,z`Y7uOZqpUgt@` A #VM |TYU:EhѼw'WP O޾?ywhW.&t0vd|\?p0ۊn.TDj]\ewX_% *ك.,E[b gabjgwի'`肆F{xtv~J̠oi/hW0 YVm-޺ť|TU[qH*[tʡ*pR}_T.1ovƪQ ̔Ȝީ)<=k#!+UI ŔmۈJ1._< GD#I^yQRa8"KPX#O7A:z@HbNrthH@qvvrWɚds0\z%vgi,8f612ʊ$_c}e6r}>{t+4'b)$T+?Rh[0}0xa<71o_ʁ! N!!Ш^;Kؽtkؐ$[bɈ(5Yx-s:m%u؄B?$3OǞ?:TF2[Є`"ٚt;2ĆQL=%LLXuesgfmeҶDu2* 6wZiDھiKclTȶ'ʺ`F;xW&[>FJpg ]e^qǔ j:^'De~^gR-~1n)Z{NFD0Dvpc/C&o`t6~Ƞv5{O Otj(=B YP1RT􌁔ܤJIj:$wǛFv[nD*sAU2u^#˯))sp;`NdYIEX_Ѳ?E>zn}YX $NL&>gwv-REL,^M GɽokD;Ddfܼ|WBЍFr -5 'Juc`:Hin1iu|̗fwT#FIj)!0dhw0LԉHOA jڽ|vw#$=+\%Пˬݹ٭vD4ޱvЍAސa{*T?aI3~ r~#XTDbJyHB\?P+hu"_Q0gѓ6x/TK(D{@rf+L;PL"_Z-54b[ǎg^sN:&:fy m|(Ad}Y<@E2o40P8hxw!$@Չ~7tOM>gpL }S|sCevHVϵMtCFQMC?تo2y֯ہ E0`Pq>}goIIӾMyϫyl "֏(Ki'Zƫ,'OV۹ JfNUc{VNoiX":RKc #PZFۺ\%"IEyǢwW{Z/l7yPKo{/u7_6{wɬA*.Ybl$g_:*hoP"M}uOzIX]_u{N0IT ]˔R#q;?[8Alm ϊ/{ZCrr*Z3JgS.?SDq 5r Network errors

Network errors

// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. cr.define('errorCodes', function() { 'use strict'; /** * Generate the page content. * @param {Array.} errorCodes Error codes array consisting of a * numerical error ID and error code string. */ function listErrorCodes(errorCodes) { var errorPageUrl = 'chrome://network-error/'; var errorCodesList = document.createElement('ul'); for (var i = 0; i < errorCodes.length; i++) { var listEl = document.createElement('li'); var errorCodeLinkEl = document.createElement('a'); errorCodeLinkEl.href = errorPageUrl + errorCodes[i].errorId; errorCodeLinkEl.textContent = errorCodes[i].errorCode + ' (' + errorCodes[i].errorId + ')'; listEl.appendChild(errorCodeLinkEl); errorCodesList.appendChild(listEl); } $('pages').appendChild(errorCodesList); } function initialize() { var xhr = new XMLHttpRequest(); xhr.open('GET', 'network-error-data.json'); xhr.addEventListener('load', function(e) { if (xhr.status === 200) { try { var data = JSON.parse(xhr.responseText); listErrorCodes(data['errorCodes']); } catch (e) { $('pages').innerText = 'Could not parse the error codes data. ' + 'Try reloading the page.'; } } }); xhr.send(); } return {initialize: initialize}; }); document.addEventListener('DOMContentLoaded', errorCodes.initialize);/* Copyright 2015 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ body { margin: 10px 10px 30px; } ul { line-height: 1.7em; padding-left: 15px; } a { word-break: break-word; }Wmo6_qu7u]1,ݧa(l1H]$KvVtݾ^{xTϢުAuna6=99\Wl!+hPa6A܀QNR!vPK y?\ OQ͙IHyZJf%_}q-gJCB@;~r&?[r% \7gn]5>!lIZiδA{1*:-U).>a#!W!dB(r$5f_gbfLɤN1r1!$(]ŪP7:2rm[׈TO*meaOw99/>}Fd08ϔu#?QCbZ uD׃Sd:ޟ$*{'JǠ˳_5dܔ=İx7joHLB%)‹+#L9Mơj =OOk/xןח쎯LzueUeLm imxfs&.Ju.mTT'.Ƣ@UK=ȹm![DnP=k-3IS2M5t \9NHޣNg^vKH**-#66FݖƝA/&稹/vUa+` 2ca[Q?:},yw^2bkH݂yHq~7tRI 6^ ,vTk;#gGG[ԷkwI;7 `"dx\` SB1ipuw2WZCRDO< ;V4͵'d|9[n)_"BCZec*# 74X8^fdWo'wNi2lCv.QHA*1IͬKWlOyFsn|]QAP W0~A_`Y[6:@^H Hʥ:(n =Zq|Bv6e|?iV |kaxi }܆.=w&3VӤO+ɣ . $0/#;@_'[L2& %KWNqn!2Zmtɑ>`4>݇P-u*`?Gs42ZuCiSURm];e:T:KԨa@77 Z[o6~8)2%M$mbInzCCQDzoYNd%a~c<<;ᘥN/vw񘳘f1fr̸0@ ^o{> lrL@B]OBN" Hؗ 4bYM:'ǯߟg8\HNO̾1&Gw,"2{qS>_x'G"ĉ ~0"!/L{z~s?w8یX+;NP,M=Mφ|=4p }wfs-iF$& b nHhY{/T1ʯ_+a)$EՄizj^Vmrf*I, F&h9L{,g)ݑ@{wBî<(-Y@Rחէ,QaIm$],]X`Ȍ'0R״W7$J8Ŗ3j_`üC׭Вn$;Qr'vvwnZj ~R$6: 9%"%4 LxH3,{;{?/AeYudzȹ?qA *'x"׆.G{O,]n,Ҫzz~ÄWcKȍٽ@Z5#Yu0OW֫Yj';OתBITR E:&`9@4O9T}C¤cO\q#>_LG6!|w'YCn:D,(= m;TE x43QvE-Zj^l72MNP,˘]qd'+`Fb[GUD)9 _cTbM0><%\P?znG;m0`pj yP"J*#2Ί7k8cR|37-NKε6)\|(}N$ܯ_o%[z'ڥN]ܗ:FPw4[ھ\?01uTn0}+F*"iH -TJ}8Xuq(t߱s`3'ËF䅅8Z>0M ύ-Cx|R k4;F[֍20=A"H2[0 SՍ #Bbd'*Ohz|M&-)L`E>j~LKm0y:{X~"\ԕd=. fVhҦT>u&V>y<d&TSa+Gʨ u1Wl'r.PݐqNVW !-џInee0DM Iٹ`y Ao1BIK`ifhYx'Eqړ` Su q8m.qZ]6 kB2'Dh4@iCZuRtdؾZ.ZiA›^l^2lw~` %Di;`;Wf'rΧB[nB@W-#C+Ռv=x!;2.(m\]tp bxZ' 7lvT1WxnU =[,q߿5d)A8{{6IXmoF_1 t| 6U"iڹ~xEm(.;˗%MТ@?23<<=*Z7k 7Zme(mx h4w%Sxg F0)B2z\3XAwWߟrbAjv#,%2JUEuW/a%sL&xUpDiejdrϸB`XdNfXCLXηv_"WM~*Ec%Enވ"QO'9ZdPTym)-+G\%4JpX*(p+ L*O.Y`%Xf|n Ƃ˹"+ d*[ztx?R/!h: !ޠP3£8*NMG?8ž yq4F+5ɱX ?ys@hf}1o0Z5z` ₢Acz{w*z@7ͅ1Ī:8,z*N[MoH$c>_9ռiRm,Vf*ސ|#5U+a&5>\R5v eicr@->`h!;K2F?-3r͗g[ cC6L5 /s8jvSQzYYK~ 4)4n.ʒj|#,zYrG L{~ĢODɒs|Oi6,INmH4O`,ꤒ5ޱU]gKu@Ê("A$]s/>@; u..Cn S)(,t#) AgtN9=SP:&R:mj P}Dv#mqO&hmȍV8yT(RX5_\+j+ьHcZi#w!}VUjq=O-h//\FI]+vقLݳ)ZRǏ/dF*40Ņn :޻zF+O)Ȏq6te=dfI=DKo\n՟>\-ZQCTMQǛЏ> &$QF0GAn\¸mbR߄ $UVZjnw@0 s \>!gnsK)q6qIbFp^ȕ5=~.ט e ~[ݡ4IpV7[͊i_UCb7Ӱ;;kimKC3uRXԬ ws=K< > 2hA%a0F.da=;UR5>~Vzud{nWSjP] j7Ӆ%" ?@/=OG4O=M{ S=fȃO/jkcLI}<{p@d(VIԝ;.G_qͭD2WS0ߏNQɦ,K+JçJ%QDw$KoGmftB qɓn_EFS'0+`(+ORUNV͒]θpqr~s8ɕ%ف/. vgD4_Ӭݑ1(6;IeLR/ ݔh":U[a=Z⎪[\z FӖ+ĀT$uҴ f` spA&Y$Q:_k?/wm}r̸,%S+q+TZJ"$SGLP¨݌&ݭ9#:Kҍ?b].Ԣ_6' M7JF6G-+O[bvCj6 2R,Ħw ZA+uj:=z'%!ݠ=F8G&k\Y;1<Y[s8~WI fmw';Lla [< a:{di<-w  Ao dg⇡oi`p"b^$e$j1Q3/5{/0p:b%'v5USЙTwT0T u,gg6sNuL Vt|r2U@; 阤xJ0U>dX8>·'+8OM,9ikmaFSc01A C x)0??3MLL DZIcu _/>}ci^w[N:L4`DHY@r|PɛC8>_^}tRndC/G̜uC}8XrjT1Icć}mI9.VLD>+c)L{F|TÏS܎%}7M KƱoC6M6X\M 4ʢ)h+|{BN>$m jX&gij#@:>)ۚ袶NH@L 5F^T1JpAg$N莙v{*B$/Żw, /\d8mF&'C5bȦqyYj,n]H D5d\Z#6Ĥ$U!!bp!ps2ڭ:%j6*4)$]JG֕~"\Yq;&"xG1 Ŀ,tPm5S3ه5;ցbζ>ԊLY<]/>o #5UxX+11I8aw4g:&&k tj,0cfw_ehͶpy%))ENB&"w+!\M3u>#U?X8hsyV-z,gt$,GdMno>\@F j,<(C=xuc׼bۤl[a-lVtԁqE UT]7\dy" HWɈAHRuCQ 1KC촨KKjP!$$!SAMaٞs|ϼ4Talk_gcqFŕ֒]i9Z$<ҧ*t P ߙ.wn#ÌxK@=U8,_V< $a8/!{^|uc#Yo6_q0L =9Cd[6v{phKLj$[H%Qذmxw),x6Uͳ oR T]VT)2<C$APIMO᭤7L䥈)YwD"GN3E૞:†>,ON|gJC#+F*ʛzaD' ({ B*G"xL O?ƅ3je(1l]S/_ӜƊ 00DK/ٻ Ni|+ 4?G9e[I:"Xf(%rq{yGjZ$f E%ÆFffŰ ~ڗ[ ޖzmCiidD(ΉWdGg]׮ɪ8ZgxƁ㮒Kꐏ8ݪDI-Csݴ)"I?pv J@/E(TSu/; "^*/*D@ݎD ?*ıLĭ, :Bmk4fH +,ldA.$ B&9@gصkx{i֧^E$7{D}qKϢRê3|s3'+q >Em#!< yC93&0L|?C5*I.>s/}AN<]ECPջ?t] s_{ٙ]ʘS/1w#QgeT89z[cl}#+q/AW߷\_ԁռq;+i^ۯNo=-Zؼ`<(=/[ ʏz- W(sz{&·KӨ4*ۉi"_!mR0#Ң K,%{=Tz{X8vwB>D˛fq [rU!KY#lkOnxicM>8x f¯@%Zz I!=z |y%Z. {Z@[۾x{Rq2\y CiB* $ |U|,7&y\;rF;]==@YJF6[T&HMOT3RV9,HI6&sڨɟQtf/]3t(hD{'!z3GK'ے /g:8,R:8#fŤ0$w7UL03Nsdqu9$8!^{]k 73^K^J:?G yWL:(⊝ɘ=ZKc.u_QHu]K0+^aЮvz5& 8o]]{FdcXJi+C=x'!c,RlW܎o&XE=֔Rsщ4iRG#/YLCK2B&s+wHJPm6'pp6SY*TH+r05Y`"ϷNb<{!#&<σTf%s)Q;N"C!fڠF=^]"Va]i:etixF@=1‘13·_ !>(C:*jO'֭_'F<l[3ƣSG<sUCvt2/!7NV]o6}-;KȎ.+E{(JbC*I^vb' Bsx'iEej7P+\7oR4};Yhn4^^x5Xe| Qr1܌q*qf|&3\[l|nmu(a.Kp[:[wM(x5ztkßJ a%[5-pohJ@pF6F2OC4N|:&5c)dSY_*&0V Z,!*~1ZL" E[RИHQ2)\&_ ,6)&#+8l2. Cu)<=Bi,2^+xS여{S&,VܵzqRxp.E.4rTeWD%V cdkGH>fy(͕RiyH`C3{ܗMÎ/(vmbq&0UARP398{NMƃ~opfVns^)Mc#FxFUuݠA[y8vGʰ>>"dC~GAI|\AMY Jp=HlݙDZG]A{8h`Wd ׇR͒Kuz:ӗqӪsM4Gڪ*8eU7kDsP^/EALq<.V] (Ro)׌2RI;^vS= 7:IsfBsZim;z?˖rT 0Sٶo~Tzty[N?Su:+n"NtzǴ~&(=+'\K~9>LQꞢ%ogiݡ:cBE5G% }kWIw~Ev=-&Y}jLe$Ugp遺G`e6)ՇӃg.նqj\ig[ïyvm&hUU9<\oIr޻i{d 뼘|I%N8{eԅUd(c:Pyꂆ$e:P"h'ur `>>FyU\g5F߳+ if^79PTx B*-*N`J`XؠlBO=RU]ΆH=\)( E-`)bAI.FP)!'u e=WLM yG# Gŵl5+G0!OtJeQ4pyPMPY9=W @n 3M_>|=a5|oӤLW Y>~APprd>.֐*&f)pe?66('M1O':ӌƘ 3A7@/8Jp8"4 EٖXNa8N2ϪÔ&,g| VI_Y=2q%esq@lMdtfDuY U-AJz cWEAj`J}+} cAZXJ}f4e5' =p!M Q2d]^آ׋r鬺nuqT QvJ]#˦2Fd/gJByjL.o<=ԃkDq%3/A#u7-h^ή@^Q/K7)xʖ.2SM~U'ŬVw7[8 +5lblỳW^?`65i܈8[XƬKPM=!OmԸkeVeH2x>PuBp0)H 1(afyxCk M  v`DAs$BLr! *j OY6ϙ59C3TrnXwJo1;PEQ.WF!VFFknǻ{g`wbhu"dhd ڱ^G"ES YƉմ ڗΣlbzpz m8WIya ΔIC]K p}m xA! ijH)o7`ݛX>V71.-2vg&­fC)N FYbiiؕs !Ё0 sJu)O]$QYܩS;~`Pi1n,u'N5M&Ww iٗ]b'{Iw.>#i6ng*sPXM.$%*h+*hjB:"`8HaG'aSUt d ϐSkqM<c4Z QdcPؕY2 _RӐ}fn!3!qQx̋cT}Q|5|RhĚnb&M0}Z? 4=N2 wX7nrm\YAv]uSE{D| e #{ԎIGnhh4;oP}A!(4HVkyZ7'M^t!\eZ- m d!! #ᡵx\&euQ?d̮h.4Y-*ǃՋ_rHk5u㻸VmhL:k(qa1EPמ ^sP xs}%=`X3.v |J0٪B}β)4*g))JT2ғ4"26x;LF'EM<&Q##Ҥhvr/-Ws9 L T&!Ni5R*& ߯/?"Zb7AP].| FܵjifhU{?t.?/UK_[\v8n~)?_TfJ6=EKUҴBj#ˆo*-ˏmtqM2)6BvF5=W%"R{iwX$̵]jg[F'D.Syu&0yU߁Lj@:U t;g=ѥ@yC)~b*'D44;y>Fg bVe(Q3ܕt>%.FmՇӃ'g'ڧ*59_cXf 3`UҊ!=ͪaOdMF$>2}2'oFl Ad}~_Iӓ G'Y*f'p6<uū㽿eY?56?$xb+ c`PL`^cۗM6@&Ƌ?YY|\D:vkdOm+*Kʡ 1!mD* Lf<瑭8=T1=Hsv m9C ^YUef`Ԇ מ=kU\6$L  X; w0Pyp"07%k|e9jF"ґ qB`rԑp+áV N6(W)zF4^;'Y+<̮fۏm`ʀ~j3?̪z/<<0J{>]1<@<)xkȓL+<Sń<{qjRF珞)JBtz;vRH trR?q Ԡc"R712D2 D` 9dǃýݣWGQCS4Uvtt 䱬O N{=y;(mv%F(:NڎyC:>9wg^B1,/ 1ˋ яئG(:1~2TVh3ԸL2:isf|/dB pU5fmjlbo0[8:x':F7'{G'_{{{ >ۙxn_뛓䷯_XȎ{o4Cl==ͮ.hiU@.6z?@4-~O e|a/RN yX`7w 4Co`{Ai9ΒjVrv.&$/g`_fY dT죯: LIØ <)6)}:!>t: K3}K@ĺJpy3+Ǵ="%#^K+fQiA|ɇQO͛b.& |";XTwc?dK9(#'010˕xNj[+",R FEAg^g'㽃A_eTFN$*h䉤\W]8QD?V,u+ɽ;ߜ' %Q qI5S _i rĄ-*܆@VѾ3OyqX :Yx5-X'Ut2yXy4!@UO; @dcyLљf[ :ɰ-FfxmӠu#+6;|W[&53 w#N-lA 3g'RUL/b}EL=hg]RpE FacW}gmko|3܄dC\UV߫!nU4yМJ] 6⬴@MΑdLlb- Ns Y/"jGB8fS1i`~_vQ&sx,1,'_هIt'=n^ObZ_M cZյ۽^ ̢5bz52O KS.<9zFJ(Of?A^yr2PZN\oЌzIhH' M"x:j$jW ?\#wJF`+$ָOkN{wU`,9IJL={ O W3R_;'`ot׺Wyoeiv[tm}J-B)zt/5~X&GbA| &Ãf%vh BYSbP<Ю$[qC Y3X|trVgt]ijɆ7Uw}#Er၎ 'Մ,5G.8D:8WQ`v u>3*kZt vQwCR5tũd /Hw_ Gega$V矻܌g X1ᨖv  j 49[˕jwh&CPX b>W}vOA8#ꮫ0}wA6AQ"{>&4B[vGo @ !;5m;f"Dm2~NS@:7#M# g;92eP8AK؀p&V#$zkmL/&OD/@@dW!Gh=~K dӨC$ʁ8+=K}vm8ǀ#hC-»SڐOaAi 5dU\,&K dnrgޔſ-Vm^%onKVYFtY[K `f3`wVT_ eJܠR)f.AucMQ^ViwiFLs#j6z;) ;|؝ vp?N,A%9p!w:tY"\˹AMm~T̲K$jQ P4g\jՋ. 9# z@=6䳭8li{SNaJ|>MɰC^ܯo.p<} m]1_dePf>݉Rd& ##mR<w4s/9'W>^DzSDoFh'Sy*X N:XsyI:N{g>WY=o6hz]Kc06JtkDfLE=`?H,`EbӷnuewKFC>y XF~=I a^b^BPxGsS.״005hLG]iާa$M[$iTO4xZg|kxf?@+A!쒭Ys*3()a]'<ғfY8,`~dAAmNw-j+TۗX 1=r-vb|EͿΝWXĉ"-&TcApFuC.Ꚅ:, d-'ete!=k#Dz? „UW/^6#S"^ۘTń.D*8c'A_oP>T͇iƛn)u&H'|;XlVk͋]zsˬДƖy"|.08ü_,HI{/1ԋw-Cb,\so%?> O@P~z֨tj"OQ1+cɱ-|7aII+YL9gY||ZM(-hgonLZګ,[/VO"n[Lxn.[?шXn6k` /b}0Un}y| kfn,V5m~2;Hd1tBb3[Ln F!⽿k=5o"l1d덊 ^ l(6 6i3 F$ ~qM`p.u1o]BT`d/wuQڶozn1Pr ej(kICk#)Q"DI,Dqz:%(1zm*3u' Ucz%RkC?#jO:t80%5%0_8%nD|!h7oC4yX2L4z2:Ds64>M-2PjLX6]fڪVJMuu,\u̚j"Kg4δ(HL4)G~ h| A,u19e4ǒ0f*UmaK9gSKBqܛ8lDlyh"a:z˕v|O5y[kҝoNv z 4 *)ա)D͂\BBX'{/ޟ}{vxblR(O=*~nޗ4ݜlT' awzpv'V_잜~%uv`.vKo:BXFjĴIZ \~(Ȝ\e{x#;Z':۽M*NI %a~"t]p> _u ^QV&Lg%xP]r߈IFn.imw]f>2=Ľa\SHpTYHƘMJ?j\yiLϊYyJOq۞ =#LKtoh)(XW9>{<yqD]7}jK}HW^ka2a#0zcL6Si5FWfeFg䢕={ l+-hk=SV3>vkNޅ%L`QCHۢUQI6 jmh~\뉈ӛ*M| .!9fj*(C}'I7钛";BGSDKsj+d·8lr mᵠiL M2^]g-/_)20izm\O < = S}]VԤ*yrw\tEiwoJ\pf~˿܂}=*knr|Q5i/P4y mդ4%wQ e#J}%oZ3ŵ1[Խ-ӹXjˇ]粓K5s6^e⛀& .[M83x9zpP,ݿK7LdD9' ])'Yp.: <(™;E}`'d٣$b窳98fL[#sXdBZpu wl̔zx+C+GS՘w(S<p3ϳ~X> u>E>=+j3؀ (l W7^3tw["n _EOs}[ mN"!%Hn oA<9 {lZzI&׋g VO 4 Tr'7i8.ZBG>9տ1< ; N#aC"O[xUݹ)U]-6=#Pq/q/s0Im VYTQLjTiaG>٥§(pB.j;eփgOTX\kjoTFmNom~v!C,*g2c$\W~KoQ[J2ſS1cjQV8*f*Zq -e(6:wsHVֲRO%Q>"oei^65 }sͮӱTj#b"G#{f-h=NZlKtim[Y/[(\:W8Gδh! SZdEg3r^o\):iݡ|[~K_?Ǿ-'e!? c-\L~3m*T@_unH6چDA*r&:Eٗ)!_W0'c$<||Y';WRZ )JKöw tzx==E  xGu7Օ#oחq[zQ{c+/OїoWVcxޕ tUwcV$KN)l)4+[+KƞVغTcMK,I!Yzsq%g}\)8$4/:i]||`^wI웣 MI ID_:]faZG }:"?j_'Dsv4&AM5m]E*vŵ|>nQ.]ݐe>87 8y\h6 \+>,ަڻ1G1hѤY嫅3}=o%&oxD>Ҕ +Qgy2<(SN:^'[‘x LЋD4U6R|XT%Ԕ!;[Ÿjx!e,Jɨs'ϊjnmS7_Y;^!G!u}(MM4U? -3Ld6Ay ڷj6'jLv^N5.sKd-<~a4de<a^G0!*߷|̈[O&8J(QOx)+'k?;ǃ@M裍pLoj "i۞(֡."Gla-wA5VdY- $gpR<([o'u ccd+1%ef**[]RPRxk|G5X<ƖL!hRW /,YѰ, Zr_[S[W(Ag^^> 20dQߘH$_q5Lho g)yW6y<(S%ǐV6 NrExeg)'b辥[I9gARDHݗB~?bOL,NPv|slosp} ]t wE ". }'1ցlK,?ܷ8 Nw-ypchU匬Nqo%{FjI%mpZ|-C7_5R~w nיWK_Pѻom:"58wizbj纒 /}69pLޣ O5LmD)@@8 V3,JpBu}e|VyB B3 0MhhHxqfam,斬$]l=Lfp&'/j w|G">DfU {-XAb{(eDJpKS=㲲ċvlPHhxa)F:ω ^>vܾuCy4m[@,J~Ǐ"2\6-jb[mʄ;g;^;//v^7r- F##"qrX(W.啈bPy(2pR(E07Ќ~q|yuE0p߃R/ab cgC"u[( ] q>ooAo vQdQ@tծ',!4j -fvik.\tXVG_ xƒ߱ ) s;n-b>?XLDj ;k_>8 l HVl)|ݢ !34H3O Q]5L'U0M\ jCV{H3JOft%u2N|ݪe%R^Z~煈l9, #ś ޱl>_ߌ8H6[1T^iBŨxS k1 nt(4FQ65 >2@_ I,'ݒo3ʐY/Izs{7,L;m4E_y]#UQ8#:C@A)ƋH  w5Yw\D VsXXƘIoNIL]}2jDDks"j526 F+*con|o͛o7>v#u19ϙ#S.v8*cOfr2%x?fU?XlKN K.A0|tCOqmn Kk*Tb]t%i]K9$8:Kӣu׺^ꇪ}y(Qr[ 8A6MZ;`bdZ^،[lm^[Oxoi)~mZb FLXhSB'@2JvMk[2)/_Cה.x01ۮ$\wSZ/WrR2wHWv:zn3sb!i IQ;=m<קx:'rZANO(՜wiNn; l/'i{7x|^ s|p,5~^ b7TUY'uM\Ϙ^f:Zgofa=>Ö9 }tJ&Eџ鷶); h\GK}M=/w']-BNz;l$ hHBgC|ޡqzZ*R[avn6~$o!==3KYyJMc|-psK-)-_\7M{ ÍlSxFwʻcξQ4QPYJ6;qԏmHk4;4,)G>> Zq,xFGV1 a,7mJI6My,}8\*Z ;fCE-f`cb#?؃\E W]x^3*h,PQɉCxO{fQG>#Ncm%sK92yy9bɑ~q7 'K\v}75 Z&ӝT`'vo{@yr=)0HzaMn /Vj" EܩX_ɴ,1ȯÚ2jlohW Uw֠3*f`][PW~K )aYLo`{hF n"+ut?א-Ţ(|3OavxQL ec hFD*?g'g{-. }xT2GDsGY:RO _q?& f XX"+& `(@ZXMd/I[5MuuM~"pw"Ad }h>0xfؒ2^ej4+"C7ctaToyp]o )o3fUcd `݃=?ni715Qw= p6d$&3M_%@h\([pşp*.H/4awxťd٤)%S ʼM o6UCl/ʞs]FۘƲH-jf6ײR? nvy@\%% JOI!ODǀ]3F11_ WR.oJ_pBJu98U47 ]\왊q5Aۑ\b zr^5l eY1`faqa$t9Mb)2UNNR PQQ 4}hZK zj H:T\='TskNPO u!|tzl><-Fyk2dR6L@ԩx Vg{ gg|@(|-Z6XɘnGȌ* |aӐv=B%UJS5?D8M[p| B2P 50?̧,/ ^w gis/o_qyQ 'jwkS)˯?iC;ܪZm 4-c/}ϊ!|OyYEF\M_,)c>Gׇyu\$hpBeb2׷zF="{QU+?*JH ͊%Rt)>gX,UVǩE@ZNuсbS0˨GYRJF0Dc-Xso!2W^%([htqϽD""i2*&Muwɜ'x, l<}jV փ6M]O͵a L;cw7e+HgmFۯi eƷf,BW/=R9=Xm<N)P tRP)>JGJ4r)H9P[U@A /f)m}Wf-5y7{/N$5)yjZ>zx!yLlwW~[duVqȢL݀w|2~w 2~Z'\w 1]wpdcHM`X.,8\T;"O\%!ž[(x7a*!Zf -%9v&l5SJ# +$tKv;> Oy8\ 6f߷$o '.Cz-wVnݭr]>1HQ;h،=H)mXp J@q/ќ+ԓ,Cצ"1Q (Sd֤Bvp>i$ *+#AMFݒar1 =f9@Gk} #Wt0-KgHҔܚWÔ*{j:f:&vy+ڦ >x[?8qm?e> N-,yBү0S' nAQIB+)٤Ű/VGd5Y4ץ|̂\:-d1]Fg4G7kjtz5t @N$?M$BbEy}'<>"ԧNEIt¸5#"B4A$=גIIOT%E'-<,2'Z ;_4l$qdū.lt^jVL㬪p?-Yى@EVn$vD7 Ux.DY"UBfJ\'5_t]KnXPP!\wV}@r/v~z hLI%[8mt?sD Q6λ 5E\yx5rY.pY(!Tb$lw\hw֋N,A_Y'HZP)b)Ӟ̌ZD1&L0_r޸EC:87eJM=YKIl-[*TA\F,1eX6*P n`K\Wm3Y~޺}w9n``:nB;쟺NN.♞}{t`|4}]`h/wk_ᬎUY6ÒP._j~ĉܮM_?It?` 4P&(O$º rV>;=! W?gt)F|ƒRĨKŋ/fԗqaږ0o_X3ޡ\EDk3S+ۯ}Cxu5 7>BK[)ΌhvQMX7 jyEz&\ՈQ]hLdoۛ},@=Va7A4̻%ݜP tO6`N%Bb 0xA6hLg_U| 6`aR`CG=ǜ566ma̎4TefP2#<[\՜|+:gP[9얜8>$N?jI;0a)gtҶZ|ڿ#;&6kZa@?ɪZ:.̇4\(// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var ExtensionOptionsConstants = require('extensionOptionsConstants').ExtensionOptionsConstants; var ExtensionOptionsEvents = require('extensionOptionsEvents').ExtensionOptionsEvents; var ExtensionOptionsAttributes = require('extensionOptionsAttributes').ExtensionOptionsAttributes; var GuestViewContainer = require('guestViewContainer').GuestViewContainer; function ExtensionOptionsImpl(extensionoptionsElement) { $Function.call( GuestViewContainer, this, extensionoptionsElement, 'extensionoptions'); new ExtensionOptionsEvents(this); }; ExtensionOptionsImpl.prototype.__proto__ = GuestViewContainer.prototype; ExtensionOptionsImpl.prototype.onElementAttached = function() { this.createGuest(); }; // Sets up all of the extensionoptions attributes. ExtensionOptionsImpl.prototype.setupAttributes = function() { this.attributes[ExtensionOptionsConstants.ATTRIBUTE_EXTENSION] = new ExtensionOptionsAttributes.ExtensionAttribute(this); }; ExtensionOptionsImpl.prototype.buildContainerParams = function() { var params = $Object.create(null); for (var i in this.attributes) { params[i] = this.attributes[i].getValue(); } return params; }; ExtensionOptionsImpl.prototype.createGuest = function() { // Destroy the old guest if one exists. this.guest.destroy($Function.bind(this.prepareForReattach$, this)); this.guest.create(this.buildParams(), $Function.bind(function() { if (!this.guest.getId()) { // Fire a createfailed event here rather than in ExtensionOptionsGuest // because the guest will not be created, and cannot fire an event. var createFailedEvent = new Event('createfailed', { bubbles: true }); this.dispatchEvent(createFailedEvent); } else { this.attachWindow$(); } }, this)); }; // Exports. exports.$set('ExtensionOptionsImpl', ExtensionOptionsImpl); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // The custom element. var registerElement = require('guestViewContainerElement').registerElement; var GuestViewContainerElement = require('guestViewContainerElement').GuestViewContainerElement; var ExtensionOptionsImpl = require('extensionOptions').ExtensionOptionsImpl; var ExtensionOptionsConstants = require('extensionOptionsConstants').ExtensionOptionsConstants; class ExtensionOptionsElement extends GuestViewContainerElement { static get observedAttributes() { return [ExtensionOptionsConstants.ATTRIBUTE_EXTENSION]; } constructor() { super(); privates(this).internal = new ExtensionOptionsImpl(this); } } registerElement('ExtensionOptions', ExtensionOptionsElement); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements the attributes of the tag. var GuestViewAttributes = require('guestViewAttributes').GuestViewAttributes; var ExtensionOptionsConstants = require('extensionOptionsConstants').ExtensionOptionsConstants; // ----------------------------------------------------------------------------- // ExtensionAttribute object. // Attribute that handles extension binded to the extensionoptions. function ExtensionAttribute(view) { $Function.call( GuestViewAttributes.Attribute, this, ExtensionOptionsConstants.ATTRIBUTE_EXTENSION, view); } ExtensionAttribute.prototype.__proto__ = GuestViewAttributes.Attribute.prototype; ExtensionAttribute.prototype.handleMutation = function(oldValue, newValue) { // Once this attribute has been set, it cannot be unset. if (!newValue && oldValue) { this.setValueIgnoreMutation(oldValue); return; } if (!newValue || !this.elementAttached) return; this.view.createGuest(); }; var ExtensionOptionsAttributes = {ExtensionAttribute: ExtensionAttribute}; // Exports. exports.$set('ExtensionOptionsAttributes', ExtensionOptionsAttributes); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module contains constants used in extensionoptions. // Container for the extensionview constants. var ExtensionOptionsConstants = { // Attributes. ATTRIBUTE_EXTENSION: 'extension' }; exports.$set('ExtensionOptionsConstants', $Object.freeze(ExtensionOptionsConstants)); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var CreateEvent = require('guestViewEvents').CreateEvent; var GuestViewEvents = require('guestViewEvents').GuestViewEvents; function ExtensionOptionsEvents(extensionOptionsImpl) { $Function.call(GuestViewEvents, this, extensionOptionsImpl); // |setupEventProperty| is normally called automatically, but the // 'createfailed' event is registered here because the event is fired from // ExtensionOptionsImpl instead of in response to an extension event. this.setupEventProperty('createfailed'); } ExtensionOptionsEvents.prototype.__proto__ = GuestViewEvents.prototype; // A dictionary of extension events to be listened for. This // dictionary augments |GuestViewEvents.EVENTS| in guest_view_events.js. See the // documentation there for details. ExtensionOptionsEvents.EVENTS = { 'close': { evt: CreateEvent('extensionOptionsInternal.onClose') }, 'load': { evt: CreateEvent('extensionOptionsInternal.onLoad') }, 'preferredsizechanged': { evt: CreateEvent('extensionOptionsInternal.onPreferredSizeChanged'), fields:['width', 'height'] } } ExtensionOptionsEvents.prototype.getEvents = function() { return ExtensionOptionsEvents.EVENTS; }; // Exports. exports.$set('ExtensionOptionsEvents', ExtensionOptionsEvents); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements the ExtensionView . var GuestViewContainer = require('guestViewContainer').GuestViewContainer; var ExtensionViewConstants = require('extensionViewConstants').ExtensionViewConstants; var ExtensionViewAttributes = require('extensionViewAttributes').ExtensionViewAttributes; var ExtensionViewEvents = require('extensionViewEvents').ExtensionViewEvents; var ExtensionViewInternal = getInternalApi ? getInternalApi('extensionViewInternal') : require('extensionViewInternal').ExtensionViewInternal; function ExtensionViewImpl(extensionviewElement) { $Function.call( GuestViewContainer, this, extensionviewElement, 'extensionview'); // A queue of objects in the order they should be loaded. // Every load call will add the given src, as well as the resolve and reject // functions. Each src will be loaded in the order they were called. this.loadQueue = []; // The current src that is loading. // @type {Object} this.pendingLoad = null; new ExtensionViewEvents(this, this.viewInstanceId); } ExtensionViewImpl.prototype.__proto__ = GuestViewContainer.prototype; ExtensionViewImpl.prototype.createGuest = function(callback) { this.guest.create(this.buildParams(), $Function.bind(function() { this.attachWindow$(); callback(); }, this)); }; ExtensionViewImpl.prototype.buildContainerParams = function() { var params = $Object.create(null); for (var i in this.attributes) { params[i] = this.attributes[i].getValue(); } return params; }; // Sets up all of the extensionview attributes. ExtensionViewImpl.prototype.setupAttributes = function() { this.attributes[ExtensionViewConstants.ATTRIBUTE_EXTENSION] = new ExtensionViewAttributes.ExtensionAttribute(this); this.attributes[ExtensionViewConstants.ATTRIBUTE_SRC] = new ExtensionViewAttributes.SrcAttribute(this); }; ExtensionViewImpl.prototype.onElementDetached = function() { this.guest.destroy(); // Reset all attributes. for (var i in this.attributes) { this.attributes[i].setValueIgnoreMutation(); } }; // Updates src upon loadcommit. ExtensionViewImpl.prototype.onLoadCommit = function(url) { this.attributes[ExtensionViewConstants.ATTRIBUTE_SRC]. setValueIgnoreMutation(url); }; // Loads the next pending src from |loadQueue| to the extensionview. ExtensionViewImpl.prototype.loadNextSrc = function() { // If extensionview isn't currently loading a src, load the next src // in |loadQueue|. Otherwise, do nothing. if (!this.pendingLoad && this.loadQueue.length) { this.pendingLoad = $Array.shift(this.loadQueue); var src = this.pendingLoad.src; var resolve = this.pendingLoad.resolve; var reject = this.pendingLoad.reject; // The extensionview validates the |src| twice, once in |parseSrc| and then // in |loadSrc|. The |src| isn't checked directly in |loadNextSrc| for // validity since the sending renderer (WebUI) is trusted. ExtensionViewInternal.parseSrc( src, $Function.bind(function(isSrcValid, extensionId) { // Check if the src is valid. if (!isSrcValid) { reject('Failed to load: src is not valid.'); return; } // Destroy the current guest and create a new one if extension ID // is different. // // This may happen if the extensionview is loads an extension page, and // is then intended to load a page served from a different extension in // the same part of the WebUI. // // The two calls may look like the following: // extensionview.load('chrome-extension://firstId/page.html'); // extensionview.load('chrome-extension://secondId/page.html'); // The second time load is called, we destroy the current guest since // we will be loading content from a different extension. if (extensionId != this.attributes[ExtensionViewConstants.ATTRIBUTE_EXTENSION] .getValue()) { this.guest.destroy($Function.bind(this.prepareForReattach$, this)); // Update the extension and src attributes. this.attributes[ExtensionViewConstants.ATTRIBUTE_EXTENSION] .setValueIgnoreMutation(extensionId); this.attributes[ExtensionViewConstants.ATTRIBUTE_SRC] .setValueIgnoreMutation(src); this.createGuest($Function.bind(function() { if (this.guest.getId() <= 0) { reject('Failed to load: guest creation failed.'); } else { resolve('Successful load.'); } }, this)); } else { ExtensionViewInternal.loadSrc(this.guest.getId(), src, $Function.bind(function(hasLoadSucceeded) { if (!hasLoadSucceeded) { reject('Failed to load.'); } else { // Update the src attribute. this.attributes[ExtensionViewConstants.ATTRIBUTE_SRC] .setValueIgnoreMutation(src); resolve('Successful load.'); } }, this)); } }, this)); } }; ExtensionViewImpl.prototype.load = function(src) { return new Promise($Function.bind(function(resolve, reject) { $Array.push(this.loadQueue, {src: src, resolve: resolve, reject: reject}); this.loadNextSrc(); }, this)).then($Function.bind(function onLoadResolved() { this.pendingLoad = null; this.loadNextSrc(); }, this), $Function.bind(function onLoadRejected(reason) { this.pendingLoad = null; this.loadNextSrc(); return Promise.reject(reason); }, this)); }; // Exports. exports.$set('ExtensionViewImpl', ExtensionViewImpl); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // The custom element. var registerElement = require('guestViewContainerElement').registerElement; var forwardApiMethods = require('guestViewContainerElement').forwardApiMethods; var GuestViewContainerElement = require('guestViewContainerElement').GuestViewContainerElement; var ExtensionViewImpl = require('extensionView').ExtensionViewImpl; var ExtensionViewConstants = require('extensionViewConstants').ExtensionViewConstants; var EXTENSION_VIEW_API_METHODS = require('extensionViewApiMethods').EXTENSION_VIEW_API_METHODS; class ExtensionViewElement extends GuestViewContainerElement { static get observedAttributes() { return [ ExtensionViewConstants.ATTRIBUTE_EXTENSION, ExtensionViewConstants.ATTRIBUTE_SRC ]; } constructor() { super(); privates(this).internal = new ExtensionViewImpl(this); } } // Forward ExtensionViewElement.foo* method calls to ExtensionViewImpl.foo*. forwardApiMethods( ExtensionViewElement, ExtensionViewImpl, null, EXTENSION_VIEW_API_METHODS); registerElement('ExtensionView', ExtensionViewElement); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module contains the public-facing API functions for the // tag. var EXTENSION_VIEW_API_METHODS = [ // Loads the given src into extensionview. Must be called every time the // the extensionview should load a new page. This is the only way to set // the extension and src attributes. Returns a promise indicating whether // or not load was successful. 'load' ]; // Exports. exports.$set('EXTENSION_VIEW_API_METHODS', EXTENSION_VIEW_API_METHODS); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements the attributes of the tag. var GuestViewAttributes = require('guestViewAttributes').GuestViewAttributes; var ExtensionViewConstants = require('extensionViewConstants').ExtensionViewConstants; // ----------------------------------------------------------------------------- // ExtensionAttribute object. // Attribute that handles the extension associated with the extensionview. function ExtensionAttribute(view) { $Function.call( GuestViewAttributes.ReadOnlyAttribute, this, ExtensionViewConstants.ATTRIBUTE_EXTENSION, view); } ExtensionAttribute.prototype.__proto__ = GuestViewAttributes.ReadOnlyAttribute.prototype; // ----------------------------------------------------------------------------- // SrcAttribute object. // Attribute that handles the location and navigation of the extensionview. // This is read only because we only want to be able to navigate to a src // through the load API call, which checks for URL validity and the extension // ID of the new src. function SrcAttribute(view) { $Function.call( GuestViewAttributes.ReadOnlyAttribute, this, ExtensionViewConstants.ATTRIBUTE_SRC, view); } SrcAttribute.prototype.__proto__ = GuestViewAttributes.ReadOnlyAttribute.prototype; SrcAttribute.prototype.handleMutation = function(oldValue, newValue) { console.log('src is read only. Use .load(url) to navigate to a new ' + 'extension page.'); this.setValueIgnoreMutation(oldValue); }; var ExtensionViewAttributes = { ExtensionAttribute: ExtensionAttribute, SrcAttribute: SrcAttribute }; // Exports. exports.$set('ExtensionViewAttributes', ExtensionViewAttributes); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module contains constants used in extensionview. // Container for the extensionview constants. var ExtensionViewConstants = { // Attributes. ATTRIBUTE_EXTENSION: 'extension', ATTRIBUTE_SRC: 'src', }; exports.$set('ExtensionViewConstants', $Object.freeze(ExtensionViewConstants)); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Event management for ExtensionView. var CreateEvent = require('guestViewEvents').CreateEvent; var GuestViewEvents = require('guestViewEvents').GuestViewEvents; function ExtensionViewEvents(extensionViewImpl) { $Function.call(GuestViewEvents, this, extensionViewImpl); } ExtensionViewEvents.prototype.__proto__ = GuestViewEvents.prototype; ExtensionViewEvents.EVENTS = { 'loadcommit': { evt: CreateEvent('extensionViewInternal.onLoadCommit'), handler: 'handleLoadCommitEvent', internal: true } }; ExtensionViewEvents.prototype.getEvents = function() { return ExtensionViewEvents.EVENTS; }; ExtensionViewEvents.prototype.handleLoadCommitEvent = function(event) { this.view.onLoadCommit(event.url); }; exports.$set('ExtensionViewEvents', ExtensionViewEvents); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. if (!apiBridge) { exports.$set( 'ExtensionViewInternal', require('binding').Binding.create('extensionViewInternal').generate()); } // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the feedbackPrivate API. var binding = apiBridge || require('binding').Binding.create('feedbackPrivate'); var blobNatives = requireNative('blob_natives'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPostValidate( "sendFeedback", function(feedbackInfo, callback) { var attachedFileBlobUuid = ''; var screenshotBlobUuid = ''; if (feedbackInfo.attachedFile) attachedFileBlobUuid = blobNatives.GetBlobUuid(feedbackInfo.attachedFile.data); if (feedbackInfo.screenshot) screenshotBlobUuid = blobNatives.GetBlobUuid(feedbackInfo.screenshot); feedbackInfo.attachedFileBlobUuid = attachedFileBlobUuid; feedbackInfo.screenshotBlobUuid = screenshotBlobUuid; return [feedbackInfo, callback]; }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements the base attributes of the GuestView tags. var $parseInt = require('safeMethods').SafeMethods.$parseInt; var $Element = require('safeMethods').SafeMethods.$Element; // ----------------------------------------------------------------------------- // Attribute object. // Default implementation of a GuestView attribute. function Attribute(name, view) { this.dirty = false; this.ignoreMutation = false; this.name = name; this.view = view; this.defineProperty(); } // Prevent GuestViewEvents inadvertently inheritng code from the global Object, // allowing a pathway for unintended execution of user code. // TODO(wjmaclean): Track down other issues of Object inheritance. // https://crbug.com/701034 Attribute.prototype.__proto__ = null; // Retrieves and returns the attribute's value. Attribute.prototype.getValue = function() { return $Element.getAttribute(this.view.element, this.name) || ''; }; // Retrieves and returns the attribute's value if it has been dirtied since // the last time this method was called. Returns null otherwise. Attribute.prototype.getValueIfDirty = function() { if (!this.dirty) return null; this.dirty = false; return this.getValue(); }; // Sets the attribute's value. Attribute.prototype.setValue = function(value) { $Element.setAttribute(this.view.element, this.name, value || ''); }; // Changes the attribute's value without triggering its mutation handler. Attribute.prototype.setValueIgnoreMutation = function(value) { this.ignoreMutation = true; this.setValue(value); this.ignoreMutation = false; }; // Defines this attribute as a property on the view's element. Attribute.prototype.defineProperty = function() { $Object.defineProperty(this.view.element, this.name, { get: $Function.bind(function() { return this.getValue(); }, this), set: $Function.bind(function(value) { this.setValue(value); }, this), enumerable: true }); }; // Called when the attribute's value changes. Attribute.prototype.maybeHandleMutation = function(oldValue, newValue) { if (this.ignoreMutation) return; this.dirty = true; this.handleMutation(oldValue, newValue); }; // Called when a change that isn't ignored occurs to the attribute's value. Attribute.prototype.handleMutation = function(oldValue, newValue) {}; // Called when the view's element is attached to the DOM tree. Attribute.prototype.attach = function() {}; // Called when the view's element is detached from the DOM tree. Attribute.prototype.detach = function() {}; // ----------------------------------------------------------------------------- // BooleanAttribute object. // An attribute that is treated as a Boolean. function BooleanAttribute(name, view) { $Function.call(Attribute, this, name, view); } BooleanAttribute.prototype.__proto__ = Attribute.prototype; BooleanAttribute.prototype.getValue = function() { return $Element.hasAttribute(this.view.element, this.name); }; BooleanAttribute.prototype.setValue = function(value) { if (!value) { $Element.removeAttribute(this.view.element, this.name); } else { $Element.setAttribute(this.view.element, this.name, ''); } }; // ----------------------------------------------------------------------------- // IntegerAttribute object. // An attribute that is treated as an integer. function IntegerAttribute(name, view) { $Function.call(Attribute, this, name, view); } IntegerAttribute.prototype.__proto__ = Attribute.prototype; IntegerAttribute.prototype.getValue = function() { return $parseInt($Element.getAttribute(this.view.element, this.name)) || 0; }; IntegerAttribute.prototype.setValue = function(value) { $Element.setAttribute(this.view.element, this.name, $parseInt(value) || 0); }; // ----------------------------------------------------------------------------- // ReadOnlyAttribute object. // An attribute that cannot be changed (externally). The only way to set it // internally is via |setValueIgnoreMutation|. function ReadOnlyAttribute(name, view) { $Function.call(Attribute, this, name, view); } ReadOnlyAttribute.prototype.__proto__ = Attribute.prototype; ReadOnlyAttribute.prototype.handleMutation = function(oldValue, newValue) { this.setValueIgnoreMutation(oldValue); } // ----------------------------------------------------------------------------- var GuestViewAttributes = { Attribute: Attribute, BooleanAttribute: BooleanAttribute, IntegerAttribute: IntegerAttribute, ReadOnlyAttribute: ReadOnlyAttribute }; // Exports. exports.$set('GuestViewAttributes', GuestViewAttributes); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements the shared functionality for different guestview // containers, such as web_view, app_view, etc. // Methods ending with $ will be overwritten by guest_view_iframe_container.js. // TODO(mcnee): When BrowserPlugin is removed, merge // guest_view_iframe_container.js into this file. var $parseInt = require('safeMethods').SafeMethods.$parseInt; var $getComputedStyle = require('safeMethods').SafeMethods.$getComputedStyle; var $Element = require('safeMethods').SafeMethods.$Element; var $EventTarget = require('safeMethods').SafeMethods.$EventTarget; var $HTMLElement = require('safeMethods').SafeMethods.$HTMLElement; var $Node = require('safeMethods').SafeMethods.$Node; var GuestView = require('guestView').GuestView; var GuestViewInternalNatives = requireNative('guest_view_internal'); var IdGenerator = requireNative('id_generator'); var MessagingNatives = requireNative('messaging_natives'); function GuestViewContainer(element, viewType) { this.attributes = $Object.create(null); this.element = element; this.elementAttached = false; this.viewInstanceId = IdGenerator.GetNextId(); this.viewType = viewType; this.setupGuestProperty(); this.guest = new GuestView(viewType); this.setupAttributes(); this.internalElement = this.createInternalElement$(); this.shadowRoot = $Element.attachShadow(this.element, {mode: 'closed'}); $Node.appendChild(this.shadowRoot, this.internalElement); GuestViewInternalNatives.RegisterView(this.viewInstanceId, this, viewType); } // Prevent GuestViewContainer inadvertently inheriting code from the global // Object, allowing a pathway for executing unintended user code execution. // TODO(wjmaclean): Track down other issues of Object inheritance. // https://crbug.com/701034 GuestViewContainer.prototype.__proto__ = null; // Create the 'guest' property to track new GuestViews and always listen for // their resizes. GuestViewContainer.prototype.setupGuestProperty = function() { $Object.defineProperty(this, 'guest', { get: $Function.bind(function() { return this.guest_; }, this), set: $Function.bind(function(value) { this.guest_ = value; if (!value) { return; } this.guest_.onresize = $Function.bind(function(e) { // Dispatch the 'contentresize' event. var contentResizeEvent = new Event('contentresize', { bubbles: true }); contentResizeEvent.oldWidth = e.oldWidth; contentResizeEvent.oldHeight = e.oldHeight; contentResizeEvent.newWidth = e.newWidth; contentResizeEvent.newHeight = e.newHeight; this.dispatchEvent(contentResizeEvent); }, this); }, this), enumerable: true }); }; GuestViewContainer.prototype.createInternalElement$ = function() { // We create BrowserPlugin as a custom element in order to observe changes // to attributes synchronously. var browserPluginElement = new GuestViewContainer[this.viewType + 'BrowserPlugin'](); privates(browserPluginElement).internal = this; return browserPluginElement; }; GuestViewContainer.prototype.prepareForReattach$ = function() {}; GuestViewContainer.prototype.focus = function() { // Focus the internal element when focus() is called on the GuestView element. $HTMLElement.focus(this.internalElement); } GuestViewContainer.prototype.attachWindow$ = function() { if (!this.internalInstanceId) { return true; } this.guest.attach(this.internalInstanceId, this.viewInstanceId, this.buildParams()); return true; }; GuestViewContainer.prototype.makeGCOwnContainer = function(internalInstanceId) { MessagingNatives.BindToGC(this, function() { GuestViewInternalNatives.DestroyContainer(internalInstanceId); }, -1); }; GuestViewContainer.prototype.onInternalInstanceId = function( internalInstanceId) { this.internalInstanceId = internalInstanceId; this.makeGCOwnContainer(this.internalInstanceId); // Track when the element resizes using the element resize callback. GuestViewInternalNatives.RegisterElementResizeCallback( this.internalInstanceId, this.weakWrapper(this.onElementResize)); if (!this.guest.getId()) { return; } this.guest.attach(this.internalInstanceId, this.viewInstanceId, this.buildParams()); }; GuestViewContainer.prototype.handleInternalElementAttributeMutation = function(name, oldValue, newValue) { if (name == 'internalinstanceid' && !oldValue && !!newValue) { $Element.removeAttribute( this.internalElement, 'internalinstanceid'); this.onInternalInstanceId($parseInt(newValue)); } }; GuestViewContainer.prototype.onElementResize = function(newWidth, newHeight) { if (!this.guest.getId()) return; this.guest.setSize({normal: {width: newWidth, height: newHeight}}); }; GuestViewContainer.prototype.buildParams = function() { var params = this.buildContainerParams(); params['instanceId'] = this.viewInstanceId; // When the GuestViewContainer is not participating in layout (display:none) // then getBoundingClientRect() would report a width and height of 0. // However, in the case where the GuestViewContainer has a fixed size we can // use that value to initially size the guest so as to avoid a relayout of the // on display:block. var css = $getComputedStyle(this.element, null); var elementRect = $Element.getBoundingClientRect(this.element); params['elementWidth'] = $parseInt(elementRect.width) || $parseInt(css.getPropertyValue('width')); params['elementHeight'] = $parseInt(elementRect.height) || $parseInt(css.getPropertyValue('height')); return params; }; GuestViewContainer.prototype.dispatchEvent = function(event) { return $EventTarget.dispatchEvent(this.element, event); }; // Returns a wrapper function for |func| with a weak reference to |this|. GuestViewContainer.prototype.weakWrapper = function(func) { var viewInstanceId = this.viewInstanceId; return function() { var view = GuestViewInternalNatives.GetViewFromID(viewInstanceId); if (view) { return $Function.apply(func, view, $Array.slice(arguments)); } }; }; GuestViewContainer.prototype.willAttachElement$ = function() {}; // Implemented by the specific view type, if needed. GuestViewContainer.prototype.buildContainerParams = function() { return $Object.create(null); }; GuestViewContainer.prototype.onElementAttached = function() {}; GuestViewContainer.prototype.onElementDetached = function() {}; GuestViewContainer.prototype.setupAttributes = function() {}; // Exports. exports.$set('GuestViewContainer', GuestViewContainer); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Common custom element registration code for the various guest view // containers. var $CustomElementRegistry = require('safeMethods').SafeMethods.$CustomElementRegistry; var $Element = require('safeMethods').SafeMethods.$Element; var $EventTarget = require('safeMethods').SafeMethods.$EventTarget; var $HTMLElement = require('safeMethods').SafeMethods.$HTMLElement; var GuestViewContainer = require('guestViewContainer').GuestViewContainer; var GuestViewInternalNatives = requireNative('guest_view_internal'); var IdGenerator = requireNative('id_generator'); var logging = requireNative('logging'); // Registers the browserplugin and guestview as custom elements once the // document has loaded. // |containerElementType| is a GuestViewContainerElement (e.g. WebViewElement) function registerElement(elementName, containerElementType) { var useCapture = true; window.addEventListener('readystatechange', function listener(event) { if (document.readyState == 'loading') return; registerInternalElement($String.toLowerCase(elementName)); registerGuestViewElement(elementName, containerElementType); $EventTarget.removeEventListener(window, event.type, listener, useCapture); }, useCapture); } // Registers the browser plugin custom element. |viewType| is the // name of the specific guestview container (e.g. 'webview'). function registerInternalElement(viewType) { GuestViewInternalNatives.AllowGuestViewElementDefinition(() => { var InternalElement = class extends HTMLObjectElement { static get observedAttributes() { return ['internalinstanceid']; } constructor() { super(); $Element.setAttribute(this, 'type', 'application/browser-plugin'); $Element.setAttribute( this, 'id', 'browser-plugin-' + IdGenerator.GetNextId()); var style = $HTMLElement.style.get(this); $Object.defineProperty(style, 'width', {value: '100%'}); $Object.defineProperty(style, 'height', {value: '100%'}); } } InternalElement.prototype.connectedCallback = function() { // Load the plugin immediately. var unused = this.nonExistentAttribute; }; InternalElement.prototype.attributeChangedCallback = function( name, oldValue, newValue) { var internal = privates(this).internal; if (!internal) { return; } internal.handleInternalElementAttributeMutation(name, oldValue, newValue); }; $CustomElementRegistry.define( window.customElements, viewType + 'browserplugin', InternalElement, {extends: 'object'}); $Object.defineProperty(GuestViewContainer, viewType + 'BrowserPlugin', { value: InternalElement, }); delete InternalElement.prototype.connectedCallback; delete InternalElement.prototype.attributeChangedCallback; delete InternalElement.observedAttributes; }); } // Conceptually, these are methods on GuestViewContainerElement.prototype. // However, since that is exposed to users, we only set these callbacks on // the prototype temporarily during the custom element registration. var customElementCallbacks = { connectedCallback: function() { var internal = privates(this).internal; if (!internal) return; internal.elementAttached = true; internal.willAttachElement$(); internal.onElementAttached(); }, attributeChangedCallback: function(name, oldValue, newValue) { var internal = privates(this).internal; if (!internal) return; // Let the changed attribute handle its own mutation. internal.attributes[name].maybeHandleMutation(oldValue, newValue); }, disconnectedCallback: function() { var internal = privates(this).internal; if (!internal) return; internal.elementAttached = false; internal.internalInstanceId = 0; internal.guest.destroy(); internal.onElementDetached(); } }; // Registers a GuestViewContainerElement as a custom element. function registerGuestViewElement(elementName, containerElementType) { GuestViewInternalNatives.AllowGuestViewElementDefinition(() => { // We set the lifecycle callbacks so that they're available during // registration. Once that's done, we'll delete them so developers cannot // call them and produce unexpected behaviour. GuestViewContainerElement.prototype.connectedCallback = customElementCallbacks.connectedCallback; GuestViewContainerElement.prototype.disconnectedCallback = customElementCallbacks.disconnectedCallback; GuestViewContainerElement.prototype.attributeChangedCallback = customElementCallbacks.attributeChangedCallback; $CustomElementRegistry.define( window.customElements, $String.toLowerCase(elementName), containerElementType); $Object.defineProperty(window, elementName, { value: containerElementType, }); delete GuestViewContainerElement.prototype.connectedCallback; delete GuestViewContainerElement.prototype.disconnectedCallback; delete GuestViewContainerElement.prototype.attributeChangedCallback; // Now that |observedAttributes| has been retrieved, we can hide it from // user code as well. delete containerElementType.observedAttributes; }); } // Forward public API methods from |containerElementType|'s prototype to their // internal implementations. If the method is defined on |containerType|, we // forward to that. Otherwise, we forward to the method on |internalApi|. function forwardApiMethods( containerElementType, containerType, internalApi, methodNames) { var createContainerImplHandler = function(m) { return function(var_args) { var internal = privates(this).internal; return $Function.apply(internal[m], internal, arguments); }; }; var createInternalApiHandler = function(m) { return function(var_args) { var internal = privates(this).internal; var instanceId = internal.guest.getId(); if (!instanceId) { return false; } var args = $Array.concat([instanceId], $Array.slice(arguments)); $Function.apply(internalApi[m], null, args); return true; }; }; for (var m of methodNames) { if (!containerElementType.prototype[m]) { if (containerType.prototype[m]) { containerElementType.prototype[m] = createContainerImplHandler(m); } else if (internalApi && internalApi[m]) { containerElementType.prototype[m] = createInternalApiHandler(m); } else { logging.DCHECK(false, m + ' has no implementation.'); } } } } class GuestViewContainerElement extends HTMLElement {} // Override |focus| to let |internal| handle it. GuestViewContainerElement.prototype.focus = function() { var internal = privates(this).internal; if (!internal) return; internal.focus(); }; // Exports. exports.$set('GuestViewContainerElement', GuestViewContainerElement); exports.$set('registerElement', registerElement); exports.$set('forwardApiMethods', forwardApiMethods); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements the registration of guestview elements when // permissions are not available. These elements exist only to provide a useful // error message when developers attempt to use them. var $CustomElementRegistry = require('safeMethods').SafeMethods.$CustomElementRegistry; var $EventTarget = require('safeMethods').SafeMethods.$EventTarget; var GuestViewInternalNatives = requireNative('guest_view_internal'); var ERROR_MESSAGE = 'You do not have permission to use the %1 element.' + ' Be sure to declare the "%1" permission in your manifest file.'; // A list of view types that will have custom elements registered if they are // not already registered by the time this module is loaded. var VIEW_TYPES = [ 'AppView', 'ExtensionOptions', 'ExtensionView', 'WebView' ]; // Registers a GuestView custom element. function registerGuestViewElement(viewType) { GuestViewInternalNatives.AllowGuestViewElementDefinition(() => { var DeniedElement = class extends HTMLElement { constructor() { super(); window.console.error($String.replace( ERROR_MESSAGE, /%1/g, $String.toLowerCase(viewType))); } } $CustomElementRegistry.define( window.customElements, $String.toLowerCase(viewType), DeniedElement); $Object.defineProperty(window, viewType, { value: DeniedElement, }); }); } var useCapture = true; window.addEventListener('readystatechange', function listener(event) { if (document.readyState == 'loading') return; for (var viewType of VIEW_TYPES) { // Register the error-providing custom element only for those view types // that have not already been registered. Since this module is always loaded // last, all the view types that are available (i.e. have the proper // permissions) will have already been registered on |window|. if (!$Object.hasOwnProperty(window, viewType)) registerGuestViewElement(viewType); } $EventTarget.removeEventListener(window, event.type, listener, useCapture); }, useCapture); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Event management for GuestViewContainers. var $EventTarget = require('safeMethods').SafeMethods.$EventTarget; var GuestViewInternalNatives = requireNative('guest_view_internal'); var MessagingNatives = requireNative('messaging_natives'); var EventBindings; var CreateEvent = function(name) { if (bindingUtil) { return bindingUtil.createCustomEvent(name, null, true /* supportsFilters */, false /* supportsLazyListeners */); } var eventOpts = { __proto__: null, supportsListeners: true, supportsFilters: true, // GuestView-related events never support lazy listeners. supportsLazyListeners: false, }; if (!EventBindings) EventBindings = require('event_bindings'); return new EventBindings.Event(name, undefined, eventOpts); }; function GuestViewEvents(view) { view.events = this; this.view = view; this.on = $Object.create(null); // |setupEventProperty| is normally called automatically, but these events are // are registered here because they are dispatched from GuestViewContainer // instead of in response to extension events. this.setupEventProperty('contentresize'); this.setupEventProperty('resize'); this.setupEvents(); } // Prevent GuestViewEvents inadvertently inheritng code from the global Object, // allowing a pathway for unintended execution of user code. // TODO(wjmaclean): Track down other issues of Object inheritance. // https://crbug.com/701034 GuestViewEvents.prototype.__proto__ = null; // |GuestViewEvents.EVENTS| is a dictionary of extension events to be listened // for, which specifies how each event should be handled. The events are // organized by name, and by default will be dispatched as DOM events with // the same name. // |cancelable| (default: false) specifies whether the DOM event's default // behavior can be canceled. If the default action associated with the event // is prevented, then its dispatch function will return false in its event // handler. The event must have a specified |handler| for this to be // meaningful. // |evt| specifies a descriptor object for the extension event. An event // listener will be attached to this descriptor. // |fields| (default: none) specifies the public-facing fields in the DOM event // that are accessible to developers. // |handler| specifies the name of a handler function to be called each time // that extension event is caught by its event listener. The DOM event // should be dispatched within this handler function (if desired). With no // handler function, the DOM event will be dispatched by default each time // the extension event is caught. // |internal| (default: false) specifies that the event will not be dispatched // as a DOM event, and will also not appear as an on* property on the view’s // element. A |handler| should be specified for all internal events, and // |fields| and |cancelable| should be left unspecified (as they are only // meaningful for DOM events). GuestViewEvents.EVENTS = $Object.create(null); // Attaches |listener| onto the event descriptor object |evt|, and registers it // to be removed once this GuestViewEvents object is garbage collected. GuestViewEvents.prototype.addScopedListener = function( evt, listener, listenerOpts) { $Array.push(this.listenersToBeRemoved, { 'evt': evt, 'listener': listener }); evt.addListener(listener, listenerOpts); }; // Sets up the handling of events. GuestViewEvents.prototype.setupEvents = function() { // An array of registerd event listeners that should be removed when this // GuestViewEvents is garbage collected. this.listenersToBeRemoved = []; MessagingNatives.BindToGC( this, $Function.bind(function(listenersToBeRemoved) { for (var i = 0; i != listenersToBeRemoved.length; ++i) { listenersToBeRemoved[i].evt.removeListener( listenersToBeRemoved[i].listener); listenersToBeRemoved[i] = null; } }, undefined, this.listenersToBeRemoved), -1 /* portId */); // Set up the GuestView events. for (var eventName in GuestViewEvents.EVENTS) { this.setupEvent(eventName, GuestViewEvents.EVENTS[eventName]); } // Set up the derived view's events. var events = this.getEvents(); for (var eventName in events) { this.setupEvent(eventName, events[eventName]); } }; // Sets up the handling of the |eventName| event. GuestViewEvents.prototype.setupEvent = function(eventName, eventInfo) { if (!eventInfo.internal) { this.setupEventProperty(eventName); } var listenerOpts = { instanceId: this.view.viewInstanceId }; if (eventInfo.handler) { this.addScopedListener(eventInfo.evt, this.weakWrapper(function(e) { this[eventInfo.handler](e, eventName); }), listenerOpts); return; } // Internal events are not dispatched as DOM events. if (eventInfo.internal) { return; } this.addScopedListener(eventInfo.evt, this.weakWrapper(function(e) { var domEvent = this.makeDomEvent(e, eventName); this.view.dispatchEvent(domEvent); }), listenerOpts); }; // Constructs a DOM event based on the info for the |eventName| event provided // in either |GuestViewEvents.EVENTS| or getEvents(). GuestViewEvents.prototype.makeDomEvent = function(event, eventName) { var eventInfo = GuestViewEvents.EVENTS[eventName] || this.getEvents()[eventName]; // Internal events are not dispatched as DOM events. if (eventInfo.internal) { return null; } var details = $Object.create(null); details.bubbles = true; if (eventInfo.cancelable) { details.cancelable = true; } var domEvent = new Event(eventName, details); if (eventInfo.fields) { $Array.forEach(eventInfo.fields, $Function.bind(function(field) { if (event[field] !== undefined) { $Object.defineProperty(domEvent, field, {value: event[field]}); } }, this)); } return domEvent; }; // Adds an 'on' property on the view, which can be used to set/unset // an event handler. GuestViewEvents.prototype.setupEventProperty = function(eventName) { var propertyName = 'on' + $String.toLowerCase(eventName); $Object.defineProperty(this.view.element, propertyName, { get: $Function.bind(function() { return this.on[propertyName]; }, this), set: $Function.bind(function(value) { if (this.on[propertyName]) { $EventTarget.removeEventListener( this.view.element, eventName, this.on[propertyName]); } this.on[propertyName] = value; if (value) { $EventTarget.addEventListener(this.view.element, eventName, value); } }, this), enumerable: true }); }; // returns a wrapper for |func| with a weak reference to |this|. GuestViewEvents.prototype.weakWrapper = function(func) { var viewInstanceId = this.view.viewInstanceId; return function() { var view = GuestViewInternalNatives.GetViewFromID(viewInstanceId); if (!view) { return; } return $Function.apply(func, view.events, $Array.slice(arguments)); }; }; // Implemented by the derived event manager, if one exists. GuestViewEvents.prototype.getEvents = function() { return {}; }; // Exports. exports.$set('GuestViewEvents', GuestViewEvents); exports.$set('CreateEvent', CreateEvent); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // GuestViewCrossProcessFrames overrides for guest_view_container.js var $Document = require('safeMethods').SafeMethods.$Document; var $HTMLElement = require('safeMethods').SafeMethods.$HTMLElement; var $Node = require('safeMethods').SafeMethods.$Node; var GuestViewContainer = require('guestViewContainer').GuestViewContainer; var IdGenerator = requireNative('id_generator'); GuestViewContainer.prototype.createInternalElement$ = function() { var iframeElement = $Document.createElement(document, 'iframe'); var style = $HTMLElement.style.get(iframeElement); $Object.defineProperty(style, 'width', {value: '100%'}); $Object.defineProperty(style, 'height', {value: '100%'}); $Object.defineProperty(style, 'border', {value: '0px'}); return iframeElement; }; GuestViewContainer.prototype.prepareForReattach$ = function() { // Since attachment swaps a local frame for a remote frame, we need our // internal iframe element to be local again before we can reattach. var newFrame = this.createInternalElement$(); var oldFrame = this.internalElement; this.internalElement = newFrame; var frameParent = $Node.parentNode.get(oldFrame); $Node.replaceChild(frameParent, newFrame, oldFrame); }; GuestViewContainer.prototype.attachWindow$ = function() { var generatedId = IdGenerator.GetNextId(); // Generate an instance id for the container. this.onInternalInstanceId(generatedId); return true; }; GuestViewContainer.prototype.willAttachElement$ = function() { if (this.deferredAttachCallback) { this.deferredAttachCallback(); this.deferredAttachCallback = null; } }; // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // GuestViewCrossProcessFrames overrides for guest_view.js. var $HTMLIFrameElement = require('safeMethods').SafeMethods.$HTMLIFrameElement; var GuestViewImpl = require('guestView').GuestViewImpl; var GuestViewInternalNatives = requireNative('guest_view_internal'); var ResizeEvent = require('guestView').ResizeEvent; var getIframeContentWindow = function(viewInstanceId) { var view = GuestViewInternalNatives.GetViewFromID(viewInstanceId); if (!view) return null; var internalIframeElement = view.internalElement; if (internalIframeElement) return $HTMLIFrameElement.contentWindow.get(internalIframeElement); return null; }; // Internal implementation of attach(). GuestViewImpl.prototype.attachImpl$ = function( internalInstanceId, viewInstanceId, attachParams, callback) { var view = GuestViewInternalNatives.GetViewFromID(viewInstanceId); if (!view.elementAttached) { // Defer the attachment until the element is attached. view.deferredAttachCallback = $Function.bind(this.attachImpl$, this, internalInstanceId, viewInstanceId, attachParams, callback); return; }; // Check the current state. if (!this.checkState('attach')) { this.handleCallback(callback); return; } // Callback wrapper function to set the contentWindow following attachment, // and advance the queue. var callbackWrapper = function(callback) { var contentWindow = getIframeContentWindow(viewInstanceId); // Check if attaching failed. if (!contentWindow) { this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; this.internalInstanceId = 0; } else { // Only update the contentWindow if attaching is successful. this.contentWindow = contentWindow; } this.handleCallback(callback); }; attachParams['instanceId'] = viewInstanceId; var contentWindow = getIframeContentWindow(viewInstanceId); // |contentWindow| is used to retrieve the RenderFrame in cpp. GuestViewInternalNatives.AttachIframeGuest( internalInstanceId, this.id, attachParams, contentWindow, $Function.bind(callbackWrapper, this, callback)); this.internalInstanceId = internalInstanceId; this.state = GuestViewImpl.GuestState.GUEST_STATE_ATTACHED; // Detach automatically when the container is destroyed. GuestViewInternalNatives.RegisterDestructionCallback( internalInstanceId, this.weakWrapper(function() { if (this.state != GuestViewImpl.GuestState.GUEST_STATE_ATTACHED || this.internalInstanceId != internalInstanceId) { return; } this.internalInstanceId = 0; this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; }, viewInstanceId)); }; // Internal implementation of create(). GuestViewImpl.prototype.createImpl$ = function(createParams, callback) { // Check the current state. if (!this.checkState('create')) { this.handleCallback(callback); return; } // Callback wrapper function to store the guestInstanceId from the // createGuest() callback, handle potential creation failure, and advance the // queue. var callbackWrapper = function(callback, guestInfo) { this.id = guestInfo.id; // Check if creation failed. if (this.id === 0) { this.state = GuestViewImpl.GuestState.GUEST_STATE_START; this.contentWindow = null; } ResizeEvent.addListener(this.callOnResize, {instanceId: this.id}); this.handleCallback(callback); }; this.sendCreateRequest( createParams, $Function.bind(callbackWrapper, this, callback)); this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; }; // Internal implementation of destroy(). GuestViewImpl.prototype.destroyImpl$ = function(callback) { // Check the current state. if (!this.checkState('destroy')) { this.handleCallback(callback); return; } if (this.state == GuestViewImpl.GuestState.GUEST_STATE_START) { // destroy() does nothing in this case. this.handleCallback(callback); return; } // Reset the state of the destroyed guest; this.contentWindow = null; this.id = 0; this.internalInstanceId = 0; this.state = GuestViewImpl.GuestState.GUEST_STATE_START; if (ResizeEvent.hasListener(this.callOnResize)) { ResizeEvent.removeListener(this.callOnResize); } // Handle callback at end to avoid handling items in the action queue out of // order, since the callback is run synchronously here. this.handleCallback(callback); }; // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements a wrapper for a guestview that manages its // creation, attaching, and destruction. // Methods ending with $ will be overwritten by guest_view_iframe.js // TODO(mcnee): When BrowserPlugin is removed, merge // guest_view_iframe.js into this file. var CreateEvent = require('guestViewEvents').CreateEvent; var GuestViewInternal = getInternalApi ? getInternalApi('guestViewInternal') : require('binding').Binding.create('guestViewInternal').generate(); var GuestViewInternalNatives = requireNative('guest_view_internal'); // Events. var ResizeEvent = CreateEvent('guestViewInternal.onResize'); // Error messages. var ERROR_MSG_ALREADY_ATTACHED = 'The guest has already been attached.'; var ERROR_MSG_ALREADY_CREATED = 'The guest has already been created.'; var ERROR_MSG_INVALID_STATE = 'The guest is in an invalid state.'; var ERROR_MSG_NOT_ATTACHED = 'The guest is not attached.'; var ERROR_MSG_NOT_CREATED = 'The guest has not been created.'; // Properties. var PROPERTY_ON_RESIZE = 'onresize'; // Contains and hides the internal implementation details of |GuestView|, // including maintaining its state and enforcing the proper usage of its API // fucntions. function GuestViewImpl(guestView, viewType, guestInstanceId) { if (guestInstanceId) { this.id = guestInstanceId; this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; } else { this.id = 0; this.state = GuestViewImpl.GuestState.GUEST_STATE_START; } this.actionQueue = []; this.contentWindow = null; this.guestView = guestView; this.pendingAction = null; this.viewType = viewType; this.internalInstanceId = 0; this.setupOnResize(); } // Prevent GuestViewImpl inadvertently inheriting code from the global Object, // allowing a pathway for executing unintended user code execution. // TODO(wjmaclean): Track down other issues of Object inheritance. // https://crbug.com/701034 GuestViewImpl.prototype.__proto__ = null; // Possible states. GuestViewImpl.GuestState = { GUEST_STATE_START: 0, GUEST_STATE_CREATED: 1, GUEST_STATE_ATTACHED: 2 }; // Sets up the onResize property on the GuestView. GuestViewImpl.prototype.setupOnResize = function() { $Object.defineProperty(this.guestView, PROPERTY_ON_RESIZE, { get: $Function.bind(function() { return this[PROPERTY_ON_RESIZE]; }, this), set: $Function.bind(function(value) { this[PROPERTY_ON_RESIZE] = value; }, this), enumerable: true }); this.callOnResize = $Function.bind(function(e) { if (!this[PROPERTY_ON_RESIZE]) { return; } this[PROPERTY_ON_RESIZE](e); }, this); }; // Callback wrapper that is used to call the callback of the pending action (if // one exists), and then performs the next action in the queue. GuestViewImpl.prototype.handleCallback = function(callback) { if (callback) { callback(); } this.pendingAction = null; this.performNextAction(); }; // Perform the next action in the queue, if one exists. GuestViewImpl.prototype.performNextAction = function() { // Make sure that there is not already an action in progress, and that there // exists a queued action to perform. if (!this.pendingAction && this.actionQueue.length) { this.pendingAction = $Array.shift(this.actionQueue); this.pendingAction(); } }; // Check the current state to see if the proposed action is valid. Returns false // if invalid. GuestViewImpl.prototype.checkState = function(action) { // Create an error prefix based on the proposed action. var errorPrefix = 'Error calling ' + action + ': '; // Check that the current state is valid. if (!(this.state >= 0 && this.state <= 2)) { window.console.error(errorPrefix + ERROR_MSG_INVALID_STATE); return false; } // Map of possible errors for each action. For each action, the errors are // listed for states in the order: GUEST_STATE_START, GUEST_STATE_CREATED, // GUEST_STATE_ATTACHED. var errors = { 'attach': [ERROR_MSG_NOT_CREATED, null, ERROR_MSG_ALREADY_ATTACHED], 'create': [null, ERROR_MSG_ALREADY_CREATED, ERROR_MSG_ALREADY_CREATED], 'destroy': [null, null, null], 'detach': [ERROR_MSG_NOT_ATTACHED, ERROR_MSG_NOT_ATTACHED, null], 'setSize': [ERROR_MSG_NOT_CREATED, null, null] }; // Check that the proposed action is a real action. if (errors[action] == undefined) { window.console.error(errorPrefix + ERROR_MSG_INVALID_ACTION); return false; } // Report the error if the proposed action is found to be invalid for the // current state. var error; if (error = errors[action][this.state]) { window.console.error(errorPrefix + error); return false; } return true; }; // Returns a wrapper function for |func| with a weak reference to |this|. This // implementation of weakWrapper() requires a provided |viewInstanceId| since // GuestViewImpl does not store this ID. GuestViewImpl.prototype.weakWrapper = function(func, viewInstanceId) { return function() { var view = GuestViewInternalNatives.GetViewFromID(viewInstanceId); if (view && view.guest) { return $Function.apply( func, view.guest.internal, $Array.slice(arguments)); } }; }; // Internal implementation of attach(). GuestViewImpl.prototype.attachImpl$ = function( internalInstanceId, viewInstanceId, attachParams, callback) { // Check the current state. if (!this.checkState('attach')) { this.handleCallback(callback); return; } // Callback wrapper function to store the contentWindow from the attachGuest() // callback, handle potential attaching failure, register an automatic detach, // and advance the queue. var callbackWrapper = function(callback, contentWindow) { // Check if attaching failed. if (!contentWindow) { this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; this.internalInstanceId = 0; } else { // Only update the contentWindow if attaching is successful. this.contentWindow = contentWindow; } this.handleCallback(callback); }; attachParams['instanceId'] = viewInstanceId; GuestViewInternalNatives.AttachGuest( internalInstanceId, this.id, attachParams, $Function.bind(callbackWrapper, this, callback)); this.internalInstanceId = internalInstanceId; this.state = GuestViewImpl.GuestState.GUEST_STATE_ATTACHED; // Detach automatically when the container is destroyed. GuestViewInternalNatives.RegisterDestructionCallback( internalInstanceId, this.weakWrapper(function() { if (this.state != GuestViewImpl.GuestState.GUEST_STATE_ATTACHED || this.internalInstanceId != internalInstanceId) { return; } this.internalInstanceId = 0; this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; }, viewInstanceId)); }; // Internal implementation of create(). GuestViewImpl.prototype.createImpl$ = function(createParams, callback) { // Check the current state. if (!this.checkState('create')) { this.handleCallback(callback); return; } // Callback wrapper function to store the guestInstanceId from the // createGuest() callback, handle potential creation failure, and advance the // queue. var callbackWrapper = function(callback, guestInfo) { this.id = guestInfo.id; this.contentWindow = GuestViewInternalNatives.GetContentWindow(guestInfo.contentWindowId); // Check if creation failed. if (this.id === 0) { this.state = GuestViewImpl.GuestState.GUEST_STATE_START; this.contentWindow = null; } ResizeEvent.addListener(this.callOnResize, {instanceId: this.id}); this.handleCallback(callback); }; this.sendCreateRequest(createParams, $Function.bind(callbackWrapper, this, callback)); this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; }; GuestViewImpl.prototype.sendCreateRequest = function( createParams, boundCallback) { GuestViewInternal.createGuest(this.viewType, createParams, boundCallback); }; // Internal implementation of destroy(). GuestViewImpl.prototype.destroyImpl$ = function(callback) { // Check the current state. if (!this.checkState('destroy')) { this.handleCallback(callback); return; } if (this.state == GuestViewImpl.GuestState.GUEST_STATE_START) { // destroy() does nothing in this case. this.handleCallback(callback); return; } // If this guest is attached, then detach it first. if (!!this.internalInstanceId) { GuestViewInternalNatives.DetachGuest(this.internalInstanceId); } GuestViewInternal.destroyGuest( this.id, $Function.bind(this.handleCallback, this, callback)); // Reset the state of the destroyed guest; it's ok to do this after shipping // the callback to the GuestViewInternal api, since it runs asynchronously, // and the changes below will happen before the next item from the action // queue is executed. this.contentWindow = null; this.id = 0; this.internalInstanceId = 0; this.state = GuestViewImpl.GuestState.GUEST_STATE_START; if (ResizeEvent.hasListener(this.callOnResize)) { ResizeEvent.removeListener(this.callOnResize); } }; // Internal implementation of detach(). GuestViewImpl.prototype.detachImpl = function(callback) { // Check the current state. if (!this.checkState('detach')) { this.handleCallback(callback); return; } GuestViewInternalNatives.DetachGuest( this.internalInstanceId, $Function.bind(this.handleCallback, this, callback)); this.internalInstanceId = 0; this.state = GuestViewImpl.GuestState.GUEST_STATE_CREATED; }; // Internal implementation of setSize(). GuestViewImpl.prototype.setSizeImpl = function(sizeParams, callback) { // Check the current state. if (!this.checkState('setSize')) { this.handleCallback(callback); return; } GuestViewInternal.setSize( this.id, sizeParams, $Function.bind(this.handleCallback, this, callback)); }; // The exposed interface to a guestview. Exposes in its API the functions // attach(), create(), destroy(), and getId(). All other implementation details // are hidden. function GuestView(viewType, guestInstanceId) { this.internal = new GuestViewImpl(this, viewType, guestInstanceId); } GuestView.prototype.__proto__ = null; // Attaches the guestview to the container with ID |internalInstanceId|. GuestView.prototype.attach = function( internalInstanceId, viewInstanceId, attachParams, callback) { var internal = this.internal; $Array.push(internal.actionQueue, $Function.bind(internal.attachImpl$, internal, internalInstanceId, viewInstanceId, attachParams, callback)); internal.performNextAction(); }; // Creates the guestview. GuestView.prototype.create = function(createParams, callback) { var internal = this.internal; $Array.push(internal.actionQueue, $Function.bind(internal.createImpl$, internal, createParams, callback)); internal.performNextAction(); }; // Destroys the guestview. Nothing can be done with the guestview after it has // been destroyed. GuestView.prototype.destroy = function(callback) { var internal = this.internal; $Array.push( internal.actionQueue, $Function.bind(internal.destroyImpl$, internal, callback)); internal.performNextAction(); }; // Detaches the guestview from its container. // Note: This is not currently used. GuestView.prototype.detach = function(callback) { var internal = this.internal; $Array.push(internal.actionQueue, $Function.bind(internal.detachImpl, internal, callback)); internal.performNextAction(); }; // Adjusts the guestview's sizing parameters. GuestView.prototype.setSize = function(sizeParams, callback) { var internal = this.internal; $Array.push(internal.actionQueue, $Function.bind(internal.setSizeImpl, internal, sizeParams, callback)); internal.performNextAction(); }; // Returns the contentWindow for this guestview. GuestView.prototype.getContentWindow = function() { var internal = this.internal; return internal.contentWindow; }; // Returns the ID for this guestview. GuestView.prototype.getId = function() { var internal = this.internal; return internal.id; }; // Exports if (!apiBridge) { exports.$set('GuestView', GuestView); // TODO(mcnee): Don't export GuestViewImpl once guest_view_iframe.js is gone. exports.$set('GuestViewImpl', GuestViewImpl); exports.$set('ResizeEvent', ResizeEvent); } // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This function takes an object |imageSpec| with the key |path| - // corresponding to the internet URL to be translated - and optionally // |width| and |height| which are the maximum dimensions to be used when // converting the image. function loadImageData(imageSpec, callbacks) { var path = imageSpec.path; var img = new Image(); if (typeof callbacks.onerror === 'function') { img.onerror = function() { callbacks.onerror({ problem: 'could_not_load', path: path }); }; } img.onload = function() { var canvas = document.createElement('canvas'); if (img.width <= 0 || img.height <= 0) { callbacks.onerror({ problem: 'image_size_invalid', path: path}); return; } var scaleFactor = 1; if (imageSpec.width && imageSpec.width < img.width) scaleFactor = imageSpec.width / img.width; if (imageSpec.height && imageSpec.height < img.height) { var heightScale = imageSpec.height / img.height; if (heightScale < scaleFactor) scaleFactor = heightScale; } canvas.width = img.width * scaleFactor; canvas.height = img.height * scaleFactor; var canvas_context = canvas.getContext('2d'); canvas_context.clearRect(0, 0, canvas.width, canvas.height); canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height); try { var imageData = canvas_context.getImageData( 0, 0, canvas.width, canvas.height); if (typeof callbacks.oncomplete === 'function') { callbacks.oncomplete( imageData.width, imageData.height, imageData.data.buffer); } } catch (e) { if (typeof callbacks.onerror === 'function') { callbacks.onerror({ problem: 'data_url_unavailable', path: path }); } } } img.src = path; } function on_complete_index(index, err, loading, finished, callbacks) { return function(width, height, imageData) { delete loading[index]; finished[index] = { width: width, height: height, data: imageData }; if (err) callbacks.onerror(index); if ($Object.keys(loading).length == 0) callbacks.oncomplete(finished); } } function loadAllImages(imageSpecs, callbacks) { var loading = {}, finished = [], index, pathname; for (var index = 0; index < imageSpecs.length; index++) { loading[index] = imageSpecs[index]; loadImageData(imageSpecs[index], { oncomplete: on_complete_index(index, false, loading, finished, callbacks), onerror: on_complete_index(index, true, loading, finished, callbacks) }); } } exports.$set('loadImageData', loadImageData); exports.$set('loadAllImages', loadAllImages); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // ----------------------------------------------------------------------------- // NOTE: If you change this file you need to touch // extension_renderer_resources.grd to have your change take effect. // ----------------------------------------------------------------------------- //============================================================================== // This file contains a class that implements a subset of JSON Schema. // See: http://www.json.com/json-schema-proposal/ for more details. // // The following features of JSON Schema are not implemented: // - requires // - unique // - disallow // - union types (but replaced with 'choices') // // The following properties are not applicable to the interface exposed by // this class: // - options // - readonly // - title // - description // - format // - default // - transient // - hidden // // There are also these departures from the JSON Schema proposal: // - function and undefined types are supported // - null counts as 'unspecified' for optional values // - added the 'choices' property, to allow specifying a list of possible types // for a value // - by default an "object" typed schema does not allow additional properties. // if present, "additionalProperties" is to be a schema against which all // additional properties will be validated. //============================================================================== var utils = require('utils'); var loggingNative = requireNative('logging'); var schemaRegistry = requireNative('schema_registry'); var CHECK = loggingNative.CHECK; var DCHECK = loggingNative.DCHECK; var WARNING = loggingNative.WARNING; function loadTypeSchema(typeName, defaultSchema) { var parts = $String.split(typeName, '.'); if (parts.length == 1) { if (defaultSchema == null) { WARNING('Trying to reference "' + typeName + '" ' + 'with neither namespace nor default schema.'); return null; } var types = defaultSchema.types; } else { var schemaName = $Array.join($Array.slice(parts, 0, parts.length - 1), '.'); var types = schemaRegistry.GetSchema(schemaName).types; } for (var i = 0; i < types.length; ++i) { if (types[i].id == typeName) return types[i]; } return null; } function isInstanceOfClass(instance, className) { while ((instance = instance.__proto__)) { if (instance.constructor.name == className) return true; } return false; } function isOptionalValue(value) { return value === undefined || value === null; } function enumToString(enumValue) { if (enumValue.name === undefined) return enumValue; return enumValue.name; } /** * Validates an instance against a schema and accumulates errors. Usage: * * var validator = new JSONSchemaValidator(); * validator.validate(inst, schema); * if (validator.errors.length == 0) * console.log("Valid!"); * else * console.log(validator.errors); * * The errors property contains a list of objects. Each object has two * properties: "path" and "message". The "path" property contains the path to * the key that had the problem, and the "message" property contains a sentence * describing the error. */ function JSONSchemaValidator() { this.errors = []; this.types = []; } $Object.setPrototypeOf(JSONSchemaValidator.prototype, null); var messages = { __proto__: null, invalidEnum: 'Value must be one of: [*].', propertyRequired: 'Property is required.', unexpectedProperty: 'Unexpected property.', arrayMinItems: 'Array must have at least * items.', arrayMaxItems: 'Array must not have more than * items.', itemRequired: 'Item is required.', stringMinLength: 'String must be at least * characters long.', stringMaxLength: 'String must not be more than * characters long.', stringPattern: 'String must match the pattern: *.', numberFiniteNotNan: 'Value must not be *.', numberMinValue: 'Value must not be less than *.', numberMaxValue: 'Value must not be greater than *.', numberIntValue: 'Value must fit in a 32-bit signed integer.', numberMaxDecimal: 'Value must not have more than * decimal places.', invalidType: "Expected '*' but got '*'.", invalidTypeIntegerNumber: "Expected 'integer' but got 'number', consider using Math.round().", invalidChoice: 'Value does not match any valid type choices.', invalidPropertyType: 'Missing property type.', schemaRequired: 'Schema value required.', unknownSchemaReference: 'Unknown schema reference: *.', notInstance: 'Object must be an instance of *.', }; /** * Builds an error message. Key is the property in the |errors| object, and * |opt_replacements| is an array of values to replace "*" characters with. */ utils.defineProperty(JSONSchemaValidator, 'formatError', function(key, opt_replacements) { var message = messages[key]; if (opt_replacements) { for (var i = 0; i < opt_replacements.length; ++i) { DCHECK($String.indexOf(message, '*') != -1, message); message = $String.replace(message, '*', opt_replacements[i]); } } DCHECK($String.indexOf(message, '*') == -1) return message; }); /** * Classifies a value as one of the JSON schema primitive types. Note that we * don't explicitly disallow 'function', because we want to allow functions in * the input values. */ utils.defineProperty(JSONSchemaValidator, 'getType', function(value) { // If we can determine the type safely in JS, it's fastest to do it here. // However, Object types are difficult to classify, so we have to do it in // C++. var s = typeof value; if (s === 'object') return value === null ? 'null' : schemaRegistry.GetObjectType(value); if (s === 'number') return value % 1 === 0 ? 'integer' : 'number'; return s; }); /** * Add types that may be referenced by validated schemas that reference them * with "$ref": . Each type must be a valid schema and define an * "id" property. */ JSONSchemaValidator.prototype.addTypes = function(typeOrTypeList) { function addType(validator, type) { if (!type.id) throw new Error("Attempt to addType with missing 'id' property"); validator.types[type.id] = type; } if ($Array.isArray(typeOrTypeList)) { for (var i = 0; i < typeOrTypeList.length; ++i) { addType(this, typeOrTypeList[i]); } } else { addType(this, typeOrTypeList); } } /** * Returns a list of strings of the types that this schema accepts. */ JSONSchemaValidator.prototype.getAllTypesForSchema = function(schema) { var schemaTypes = []; if (schema.type) $Array.push(schemaTypes, schema.type); if (schema.choices) { for (var i = 0; i < schema.choices.length; ++i) { var choiceTypes = this.getAllTypesForSchema(schema.choices[i]); schemaTypes = $Array.concat(schemaTypes, choiceTypes); } } var ref = schema['$ref']; if (ref) { var type = this.getOrAddType(ref); CHECK(type, 'Could not find type ' + ref); schemaTypes = $Array.concat(schemaTypes, this.getAllTypesForSchema(type)); } return schemaTypes; }; JSONSchemaValidator.prototype.getOrAddType = function(typeName) { if (!this.types[typeName]) this.types[typeName] = loadTypeSchema(typeName); return this.types[typeName]; }; /** * Returns true if |schema| would accept an argument of type |type|. */ JSONSchemaValidator.prototype.isValidSchemaType = function(type, schema) { if (type == 'any') return true; // TODO(kalman): I don't understand this code. How can type be "null"? if (schema.optional && (type == 'null' || type == 'undefined')) return true; var schemaTypes = this.getAllTypesForSchema(schema); for (var i = 0; i < schemaTypes.length; ++i) { if (schemaTypes[i] == 'any' || type == schemaTypes[i] || (type == 'integer' && schemaTypes[i] == 'number')) return true; } return false; }; /** * Returns true if there is a non-null argument that both |schema1| and * |schema2| would accept. */ JSONSchemaValidator.prototype.checkSchemaOverlap = function(schema1, schema2) { var schema1Types = this.getAllTypesForSchema(schema1); for (var i = 0; i < schema1Types.length; ++i) { if (this.isValidSchemaType(schema1Types[i], schema2)) return true; } return false; }; /** * Validates an instance against a schema. The instance can be any JavaScript * value and will be validated recursively. When this method returns, the * |errors| property will contain a list of errors, if any. */ JSONSchemaValidator.prototype.validate = function(instance, schema, opt_path) { var path = opt_path || ''; if (!schema) { this.addError(path, 'schemaRequired'); return; } // If this schema defines itself as reference type, save it in this.types. if (schema.id) this.types[schema.id] = schema; // If the schema has an extends property, the instance must validate against // that schema too. if (schema.extends) this.validate(instance, schema.extends, path); // If the schema has a $ref property, the instance must validate against // that schema too. It must be present in this.types to be referenced. var ref = schema.$ref; if (ref) { if (!this.getOrAddType(ref)) this.addError(path, 'unknownSchemaReference', [ref]); else this.validate(instance, this.getOrAddType(ref), path) } // If the schema has a choices property, the instance must validate against at // least one of the items in that array. if (schema.choices) { this.validateChoices(instance, schema, path); return; } // If the schema has an enum property, the instance must be one of those // values. if (schema.enum) { if (!this.validateEnum(instance, schema, path)) return; } if (schema.type && schema.type != 'any') { if (!this.validateType(instance, schema, path)) return; // Type-specific validation. switch (schema.type) { case 'object': this.validateObject(instance, schema, path); break; case 'array': this.validateArray(instance, schema, path); break; case 'string': this.validateString(instance, schema, path); break; case 'number': case 'integer': this.validateNumber(instance, schema, path); break; } } }; /** * Validates an instance against a choices schema. The instance must match at * least one of the provided choices. */ JSONSchemaValidator.prototype.validateChoices = function(instance, schema, path) { var originalErrors = this.errors; for (var i = 0; i < schema.choices.length; ++i) { this.errors = []; this.validate(instance, schema.choices[i], path); if (this.errors.length == 0) { this.errors = originalErrors; return; } } this.errors = originalErrors; this.addError(path, 'invalidChoice'); }; /** * Validates an instance against a schema with an enum type. Populates the * |errors| property, and returns a boolean indicating whether the instance * validates. */ JSONSchemaValidator.prototype.validateEnum = function(instance, schema, path) { for (var i = 0; i < schema.enum.length; ++i) { if (instance === enumToString(schema.enum[i])) return true; } this.addError(path, 'invalidEnum', [$Array.join($Array.map(schema.enum, enumToString), ', ')]); return false; }; /** * Validates an instance against an object schema and populates the errors * property. */ JSONSchemaValidator.prototype.validateObject = function(instance, schema, path) { if (schema.properties) { $Array.forEach($Object.keys(schema.properties), function(prop) { var propPath = path ? path + '.' + prop : prop; if (schema.properties[prop] == undefined) { this.addError(propPath, 'invalidPropertyType'); } else if (instance[prop] !== undefined && instance[prop] !== null) { this.validate(instance[prop], schema.properties[prop], propPath); } else if (!schema.properties[prop].optional) { this.addError(propPath, 'propertyRequired'); } }, this); } // If "instanceof" property is set, check that this object inherits from // the specified constructor (function). if (schema.isInstanceOf) { if (!isInstanceOfClass(instance, schema.isInstanceOf)) this.addError(path || '', 'notInstance', [schema.isInstanceOf]); } // Exit early from additional property check if "type":"any" is defined. if (schema.additionalProperties && schema.additionalProperties.type && schema.additionalProperties.type == 'any') { return; } // By default, additional properties are not allowed on instance objects. This // can be overridden by setting the additionalProperties property to a schema // which any additional properties must validate against. $Array.forEach($Object.keys(instance), function(prop) { if (schema.properties && $Object.hasOwnProperty(schema.properties, prop)) return; var propPath = path ? path + '.' + prop : prop; if (schema.additionalProperties) this.validate(instance[prop], schema.additionalProperties, propPath); else this.addError(propPath, 'unexpectedProperty'); }, this); }; /** * Validates an instance against an array schema and populates the errors * property. */ JSONSchemaValidator.prototype.validateArray = function(instance, schema, path) { var typeOfItems = JSONSchemaValidator.getType(schema.items); if (typeOfItems == 'object') { if (schema.minItems && instance.length < schema.minItems) { this.addError(path, 'arrayMinItems', [schema.minItems]); } if (typeof schema.maxItems != 'undefined' && instance.length > schema.maxItems) { this.addError(path, 'arrayMaxItems', [schema.maxItems]); } // If the items property is a single schema, each item in the array must // have that schema. for (var i = 0; i < instance.length; ++i) { this.validate(instance[i], schema.items, path + '.' + i); } } else if (typeOfItems == 'array') { // If the items property is an array of schemas, each item in the array must // validate against the corresponding schema. for (var i = 0; i < schema.items.length; ++i) { var itemPath = path ? path + '.' + i : $String.self(i); if ($Object.hasOwnProperty(instance, i) && !isOptionalValue(instance[i])) { this.validate(instance[i], schema.items[i], itemPath); } else if (!schema.items[i].optional) { this.addError(itemPath, 'itemRequired'); } } if (schema.additionalProperties) { for (var i = schema.items.length; i < instance.length; ++i) { var itemPath = path ? path + '.' + i : $String.self(i); this.validate(instance[i], schema.additionalProperties, itemPath); } } else if (instance.length > schema.items.length) { this.addError(path, 'arrayMaxItems', [schema.items.length]); } } }; /** * Validates a string and populates the errors property. */ JSONSchemaValidator.prototype.validateString = function(instance, schema, path) { if (schema.minLength && instance.length < schema.minLength) this.addError(path, 'stringMinLength', [schema.minLength]); if (schema.maxLength && instance.length > schema.maxLength) this.addError(path, 'stringMaxLength', [schema.maxLength]); if (schema.pattern && !schema.pattern.test(instance)) this.addError(path, 'stringPattern', [schema.pattern]); }; /** * Validates a number and populates the errors property. The instance is * assumed to be a number. */ JSONSchemaValidator.prototype.validateNumber = function(instance, schema, path) { // Forbid NaN, +Infinity, and -Infinity. Our APIs don't use them, and // JSON serialization encodes them as 'null'. Re-evaluate supporting // them if we add an API that could reasonably take them as a parameter. if (isNaN(instance) || instance == Number.POSITIVE_INFINITY || instance == Number.NEGATIVE_INFINITY ) this.addError(path, 'numberFiniteNotNan', [instance]); if (schema.minimum !== undefined && instance < schema.minimum) this.addError(path, 'numberMinValue', [schema.minimum]); if (schema.maximum !== undefined && instance > schema.maximum) this.addError(path, 'numberMaxValue', [schema.maximum]); // Check for integer values outside of -2^31..2^31-1. if (schema.type === 'integer' && (instance | 0) !== instance) this.addError(path, 'numberIntValue', []); // We don't have a saved copy of Math, and it's not worth it just for a // 10^x function. var getPowerOfTen = function(pow) { // '10' is kind of an arbitrary number of maximum decimal places, but it // ensures we don't do anything crazy, and we should never need to restrict // decimals to a number higher than that. DCHECK(pow >= 1 && pow <= 10); DCHECK(pow % 1 === 0); var multiplier = 10; while (--pow) multiplier *= 10; return multiplier; }; if (schema.maxDecimal && (instance * getPowerOfTen(schema.maxDecimal)) % 1) { this.addError(path, 'numberMaxDecimal', [schema.maxDecimal]); } }; /** * Validates the primitive type of an instance and populates the errors * property. Returns true if the instance validates, false otherwise. */ JSONSchemaValidator.prototype.validateType = function(instance, schema, path) { var actualType = JSONSchemaValidator.getType(instance); if (schema.type == actualType || (schema.type == 'number' && actualType == 'integer')) { return true; } else if (schema.type == 'integer' && actualType == 'number') { this.addError(path, 'invalidTypeIntegerNumber'); return false; } else { this.addError(path, 'invalidType', [schema.type, actualType]); return false; } }; /** * Adds an error message. |key| is an index into the |messages| object. * |replacements| is an array of values to replace '*' characters in the * message. */ JSONSchemaValidator.prototype.addError = function(path, key, replacements) { $Array.push(this.errors, { __proto__: null, path: path, message: JSONSchemaValidator.formatError(key, replacements) }); }; /** * Resets errors to an empty list so you can call 'validate' again. */ JSONSchemaValidator.prototype.resetErrors = function() { this.errors = []; }; exports.$set('JSONSchemaValidator', JSONSchemaValidator); exports.$set('loadTypeSchema', loadTypeSchema); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. if ((typeof mojo === 'undefined') || !mojo.bindingsLibraryInitialized) { loadScript('mojo_bindings'); } loadScript('extensions/common/mojo/keep_alive.mojom'); /** * An object that keeps the background page alive until closed. * @constructor * @alias module:keep_alive~KeepAlive */ function KeepAlive() { var pipe = Mojo.createMessagePipe(); /** * The handle to the keep-alive object in the browser. * @type {!MojoHandle} * @private */ this.handle_ = pipe.handle0; Mojo.bindInterface(extensions.KeepAlive.name, pipe.handle1); } /** * Removes this keep-alive. */ KeepAlive.prototype.close = function() { this.handle_.close(); }; /** * Creates a keep-alive. * @return {!module:keep_alive~KeepAlive} A new keep-alive. */ exports.$set('createKeepAlive', function() { return new KeepAlive(); });// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'extensions/common/mojo/keep_alive.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('extensions'); function KeepAlivePtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(KeepAlive, handleOrPtrInfo); } function KeepAliveAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( KeepAlive, associatedInterfacePtrInfo); } KeepAliveAssociatedPtr.prototype = Object.create(KeepAlivePtr.prototype); KeepAliveAssociatedPtr.prototype.constructor = KeepAliveAssociatedPtr; function KeepAliveProxy(receiver) { this.receiver_ = receiver; } function KeepAliveStub(delegate) { this.delegate_ = delegate; } KeepAliveStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; KeepAliveStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateKeepAliveRequest(messageValidator) { return validator.validationError.NONE; } function validateKeepAliveResponse(messageValidator) { return validator.validationError.NONE; } var KeepAlive = { name: 'extensions.KeepAlive', kVersion: 0, ptrClass: KeepAlivePtr, proxyClass: KeepAliveProxy, stubClass: KeepAliveStub, validateRequest: validateKeepAliveRequest, validateResponse: null, }; KeepAliveStub.prototype.validator = validateKeepAliveRequest; KeepAliveProxy.prototype.validator = null; exports.KeepAlive = KeepAlive; exports.KeepAlivePtr = KeepAlivePtr; exports.KeepAliveAssociatedPtr = KeepAliveAssociatedPtr; })();// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var GetAvailability = requireNative('v8_context').GetAvailability; var GetGlobal = requireNative('sendRequest').GetGlobal; // Utility for setting chrome.*.lastError. // // A utility here is useful for two reasons: // 1. For backwards compatibility we need to set chrome.extension.lastError, // but not all contexts actually have access to the extension namespace. // 2. When calling across contexts, the global object that gets lastError set // needs to be that of the caller. We force callers to explicitly specify // the chrome object to try to prevent bugs here. /** * Sets the last error for |name| on |targetChrome| to |message| with an * optional |stack|. */ function set(name, message, stack, targetChrome) { if (!targetChrome) { var errorMessage = name + ': ' + message; if (stack != null && stack != '') errorMessage += '\n' + stack; throw new Error('No chrome object to set error: ' + errorMessage); } clear(targetChrome); // in case somebody has set a sneaky getter/setter var errorObject = { message: message }; if (GetAvailability('extension.lastError').is_available) targetChrome.extension.lastError = errorObject; assertRuntimeIsAvailable(); // We check to see if developers access runtime.lastError in order to decide // whether or not to log it in the (error) console. privates(targetChrome.runtime).accessedLastError = false; $Object.defineProperty(targetChrome.runtime, 'lastError', { configurable: true, get: function() { privates(targetChrome.runtime).accessedLastError = true; return errorObject; }, set: function(error) { errorObject = errorObject; }}); }; /** * Check if anyone has checked chrome.runtime.lastError since it was set. * @param {Object} targetChrome the Chrome object to check. * @return boolean True if the lastError property was set. */ function hasAccessed(targetChrome) { assertRuntimeIsAvailable(); return privates(targetChrome.runtime).accessedLastError === true; } /** * Check whether there is an error set on |targetChrome| without setting * |accessedLastError|. * @param {Object} targetChrome the Chrome object to check. * @return boolean Whether lastError has been set. */ function hasError(targetChrome) { if (!targetChrome) throw new Error('No target chrome to check'); assertRuntimeIsAvailable(); return $Object.hasOwnProperty(targetChrome.runtime, 'lastError'); }; /** * Clears the last error on |targetChrome|. */ function clear(targetChrome) { if (!targetChrome) throw new Error('No target chrome to clear error'); if (GetAvailability('extension.lastError').is_available) delete targetChrome.extension.lastError; assertRuntimeIsAvailable(); delete targetChrome.runtime.lastError; delete privates(targetChrome.runtime).accessedLastError; }; function assertRuntimeIsAvailable() { // chrome.runtime should always be available, but maybe it's disappeared for // some reason? Add debugging for http://crbug.com/258526. var runtimeAvailability = GetAvailability('runtime.lastError'); if (!runtimeAvailability.is_available) { throw new Error('runtime.lastError is not available: ' + runtimeAvailability.message); } if (!chrome.runtime) throw new Error('runtime namespace is null or undefined'); } /** * Runs |callback(args)| with last error args as in set(). * * The target chrome object is the global object's of the callback, so this * method won't work if the real callback has been wrapped (etc). */ function run(name, message, stack, callback, args) { var global = GetGlobal(callback); var targetChrome = global && global.chrome; set(name, message, stack, targetChrome); try { $Function.apply(callback, undefined, args); } finally { reportIfUnchecked(name, targetChrome, stack); clear(targetChrome); } } /** * Checks whether chrome.runtime.lastError has been accessed if set. * If it was set but not accessed, the error is reported to the console. * * @param {string=} name - name of API. * @param {Object} targetChrome - the Chrome object to check. * @param {string=} stack - Stack trace of the call up to the error. */ function reportIfUnchecked(name, targetChrome, stack) { if (hasAccessed(targetChrome) || !hasError(targetChrome)) return; var message = targetChrome.runtime.lastError.message; console.error("Unchecked runtime.lastError while running " + (name || "unknown") + ": " + message + (stack ? "\n" + stack : "")); } exports.$set('clear', clear); exports.$set('hasAccessed', hasAccessed); exports.$set('hasError', hasError); exports.$set('set', set); exports.$set('run', run); exports.$set('reportIfUnchecked', reportIfUnchecked); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // chrome.runtime.messaging API implementation. // TODO(robwu): Fix this indentation. // TODO(kalman): factor requiring chrome out of here. var chrome = requireNative('chrome').GetChrome(); var logActivity = requireNative('activityLogger'); var logging = requireNative('logging'); var messagingNatives = requireNative('messaging_natives'); var processNatives = requireNative('process'); var utils = require('utils'); var messagingUtils = require('messaging_utils'); // The reserved channel name for the sendRequest/send(Native)Message APIs. // Note: sendRequest is deprecated. var kRequestChannel = "chrome.extension.sendRequest"; var kMessageChannel = "chrome.runtime.sendMessage"; var kNativeMessageChannel = "chrome.runtime.sendNativeMessage"; var kPortClosedError = 'Attempting to use a disconnected port object'; var jsEvent; function createAnonymousEvent(schema) { if (bindingUtil) { var supportsFilters = false; var supportsLazyListeners = false; // Native custom events ignore schema. return bindingUtil.createCustomEvent(undefined, undefined, supportsFilters, supportsLazyListeners); } var options = { __proto__: null, unmanaged: true, }; if (!jsEvent) jsEvent = require('event_bindings').Event; return new jsEvent(undefined, schema, options); } function invalidateEvent(event) { if (bindingUtil) bindingUtil.invalidateEvent(event); else privates(event).impl.destroy_(); } var jsLastError = bindingUtil ? undefined : require('lastError'); function setLastError(name, error) { if (bindingUtil) bindingUtil.setLastError(error); else jsLastError.set(name, error, null, chrome); } function clearLastError() { if (bindingUtil) bindingUtil.clearLastError(); else jsLastError.clear(chrome); } function hasLastError() { if (bindingUtil) return bindingUtil.hasLastError(); else return jsLastError.hasError(chrome); } // Map of port IDs to port object. var ports = {__proto__: null}; // Port object. Represents a connection to another script context through // which messages can be passed. function PortImpl(portId, opt_name) { this.portId_ = portId; this.name = opt_name; // Note: Keep these schemas in sync with the documentation in runtime.json var portSchema = { __proto__: null, name: 'port', $ref: 'runtime.Port', }; var messageSchema = { __proto__: null, name: 'message', type: 'any', optional: true, }; this.onDisconnect = createAnonymousEvent([portSchema]); this.onMessage = createAnonymousEvent([messageSchema, portSchema]); } $Object.setPrototypeOf(PortImpl.prototype, null); // Sends a message asynchronously to the context on the other end of this // port. PortImpl.prototype.postMessage = function(msg) { if (!$Object.hasOwnProperty(ports, this.portId_)) throw new Error(kPortClosedError); // JSON.stringify doesn't support a root object which is undefined. if (msg === undefined) msg = null; msg = $JSON.stringify(msg); if (msg === undefined) { // JSON.stringify can fail with unserializable objects. Log an error and // drop the message. // // TODO(kalman/mpcomplete): it would be better to do the same validation // here that we do for runtime.sendMessage (and variants), i.e. throw an // schema validation Error, but just maintain the old behavior until // there's a good reason not to (http://crbug.com/263077). console.error('Illegal argument to Port.postMessage'); return; } var error = messagingNatives.PostMessage(this.portId_, msg); if (error) throw new Error(error); }; // Disconnects the port from the other end. PortImpl.prototype.disconnect = function() { if (!$Object.hasOwnProperty(ports, this.portId_)) return; // disconnect() on an already-closed port is a no-op. messagingNatives.CloseChannel(this.portId_, true); this.destroy_(); }; // Close this specific port without forcing the channel to close. The channel // will close if this was the only port at this end of the channel. PortImpl.prototype.disconnectSoftly = function() { if (!$Object.hasOwnProperty(ports, this.portId_)) return; messagingNatives.CloseChannel(this.portId_, false); this.destroy_(); }; PortImpl.prototype.destroy_ = function() { invalidateEvent(this.onDisconnect); invalidateEvent(this.onMessage); delete ports[this.portId_]; }; // Hidden port creation function. We don't want to expose an API that lets // people add arbitrary port IDs to the port list. function createPort(portId, opt_name) { if (ports[portId]) throw new Error("Port '" + portId + "' already exists."); var port = new Port(portId, opt_name); ports[portId] = port; return port; }; // Helper function for dispatchOnRequest. function handleSendRequestError(isSendMessage, responseCallbackPreserved, sourceExtensionId, targetExtensionId, sourceUrl) { var errorMsg; var eventName = isSendMessage ? 'runtime.onMessage' : 'extension.onRequest'; if (isSendMessage && !responseCallbackPreserved) { errorMsg = 'The chrome.' + eventName + ' listener must return true if you ' + 'want to send a response after the listener returns'; } else { errorMsg = 'Cannot send a response more than once per chrome.' + eventName + ' listener per document'; } errorMsg += ' (message was sent by extension ' + sourceExtensionId; if (sourceExtensionId && sourceExtensionId !== targetExtensionId) errorMsg += ' for extension ' + targetExtensionId; if (sourceUrl) errorMsg += ' for URL ' + sourceUrl; errorMsg += ').'; setLastError(eventName, errorMsg); } // Helper function for dispatchOnConnect function dispatchOnRequest(portId, channelName, sender, sourceExtensionId, targetExtensionId, sourceUrl) { var isExternal = sourceExtensionId != targetExtensionId; var isSendMessage = channelName == kMessageChannel; var requestEvent = null; if (isSendMessage) { if (chrome.runtime) { requestEvent = isExternal ? chrome.runtime.onMessageExternal : chrome.runtime.onMessage; } } else { if (chrome.extension) { requestEvent = isExternal ? chrome.extension.onRequestExternal : chrome.extension.onRequest; } } if (!requestEvent) return false; if (!requestEvent.hasListeners()) return false; var port = createPort(portId, channelName); function messageListener(request) { var responseCallbackPreserved = false; var responseCallback = function(response) { if (port) { port.postMessage(response); // TODO(robwu): This can be changed to disconnect() because there is // no point in allowing other receivers at this end of the port to // keep the channel alive because the opener port can only receive one // message. privates(port).impl.disconnectSoftly(); port = null; } else { // We nulled out port when sending the response, and now the page // is trying to send another response for the same request. handleSendRequestError(isSendMessage, responseCallbackPreserved, sourceExtensionId, targetExtensionId); } }; // In case the extension never invokes the responseCallback, and also // doesn't keep a reference to it, we need to clean up the port. Do // so by attaching to the garbage collection of the responseCallback // using some native hackery. // // If the context is destroyed before this has a chance to execute, // BindToGC knows to release |portId| (important for updating C++ state // both in this renderer and on the other end). We don't need to clear // any JavaScript state, as calling destroy_() would usually do - but // the context has been destroyed, so there isn't any JS state to clear. messagingNatives.BindToGC(responseCallback, function() { if (port) { privates(port).impl.disconnectSoftly(); port = null; } }, portId); var rv = requestEvent.dispatch(request, sender, responseCallback); if (isSendMessage) { responseCallbackPreserved = rv && rv.results && $Array.indexOf(rv.results, true) > -1; if (!responseCallbackPreserved && port) { // If they didn't access the response callback, they're not // going to send a response, so clean up the port immediately. privates(port).impl.disconnectSoftly(); port = null; } } } port.onMessage.addListener(messageListener); var eventName = isSendMessage ? "runtime.onMessage" : "extension.onRequest"; if (isExternal) eventName += "External"; logActivity.LogEvent(targetExtensionId, eventName, [sourceExtensionId, sourceUrl]); return true; } // Called by native code when a channel has been opened to this context. function dispatchOnConnect(portId, channelName, sourceTab, sourceFrameId, guestProcessId, guestRenderFrameRoutingId, sourceExtensionId, targetExtensionId, sourceUrl, tlsChannelId) { var wasPortUsed = dispatchOnConnectImpl(portId, channelName, sourceTab, sourceFrameId, guestProcessId, guestRenderFrameRoutingId, sourceExtensionId, targetExtensionId, sourceUrl, tlsChannelId); if (!wasPortUsed) { // Since the JS to dispatch the connect event can (in rare cases) be // executed asynchronously from when we check if there are associated // listeners in the native code, it's possible that the listeners have // since been removed. If that's the case (though unlikely), remove the // port. messagingNatives.CloseChannel(portId, false /* force_close */); } } // Helper function to dispatchOnConnect that returns true if the new port // was used. function dispatchOnConnectImpl(portId, channelName, sourceTab, sourceFrameId, guestProcessId, guestRenderFrameRoutingId, sourceExtensionId, sourceNativeAppName, targetExtensionId, sourceUrl, tlsChannelId) { // Only create a new Port if someone is actually listening for a connection. // In addition to being an optimization, this also fixes a bug where if 2 // channels were opened to and from the same process, closing one would // close both. var extensionId = processNatives.GetExtensionId(); // messaging_bindings.cc should ensure that this method only gets called for // the right extension. logging.CHECK(targetExtensionId == extensionId); var sender = {}; if (sourceExtensionId != '') sender.id = sourceExtensionId; if (sourceNativeAppName != '') sender.nativeApplication = sourceNativeAppName; if (sourceUrl) sender.url = sourceUrl; if (sourceTab) sender.tab = sourceTab; if (sourceFrameId >= 0) sender.frameId = sourceFrameId; if (typeof guestProcessId !== 'undefined' && typeof guestRenderFrameRoutingId !== 'undefined') { // Note that |guestProcessId| and |guestRenderFrameRoutingId| are not // standard fields on MessageSender and should not be exposed to drive-by // extensions; it is only exposed to component extensions. logging.CHECK(processNatives.IsComponentExtension(), "GuestProcessId can only be exposed to component extensions."); sender.guestProcessId = guestProcessId; sender.guestRenderFrameRoutingId = guestRenderFrameRoutingId; } if (typeof tlsChannelId != 'undefined') sender.tlsChannelId = tlsChannelId; // Special case for sendRequest/onRequest and sendMessage/onMessage. if (channelName == kRequestChannel || channelName == kMessageChannel) { logging.CHECK(sourceNativeAppName == ''); return dispatchOnRequest(portId, channelName, sender, sourceExtensionId, targetExtensionId, sourceUrl); } var connectEvent = null; if (chrome.runtime) { if (sourceNativeAppName != '') connectEvent = chrome.runtime.onConnectNative; else if (sourceExtensionId == targetExtensionId) connectEvent = chrome.runtime.onConnect; else connectEvent = chrome.runtime.onConnectExternal; } if (!connectEvent) return false; if (!connectEvent.hasListeners()) return false; var port = createPort(portId, channelName); port.sender = sender; if (processNatives.manifestVersion < 2) port.tab = port.sender.tab; var eventName; var eventArguments; if (sourceNativeAppName != '') { eventName = "runtime.onConnectNative"; eventArguments = [sourceNativeAppName]; } else if (sourceExtensionId == targetExtensionId) { eventName = "runtime.onConnect"; eventArguments = [sourceExtensionId]; } else { eventName = "runtime.onConnectExternal"; eventArguments = [sourceExtensionId]; } connectEvent.dispatch(port); logActivity.LogEvent(targetExtensionId, eventName, eventArguments); return true; }; // Called by native code when a channel has been closed. function dispatchOnDisconnect(portId, errorMessage) { var port = ports[portId]; if (port) { delete ports[portId]; if (errorMessage) setLastError('Port', errorMessage); try { port.onDisconnect.dispatch(port); } finally { privates(port).impl.destroy_(); clearLastError(); } } }; // Called by native code when a message has been sent to the given port. function dispatchOnMessage(msg, portId) { var port = ports[portId]; if (port) { if (msg) msg = $JSON.parse(msg); port.onMessage.dispatch(msg, port); } }; // Shared implementation used by tabs.sendMessage and runtime.sendMessage. function sendMessageImpl(port, request, responseCallback) { if (port.name != kNativeMessageChannel) port.postMessage(request); if (port.name == kMessageChannel && !responseCallback) { // TODO(mpcomplete): Do this for the old sendRequest API too, after // verifying it doesn't break anything. // Go ahead and disconnect immediately if the sender is not expecting // a response. port.disconnect(); return; } function sendResponseAndClearCallback(response) { // Save a reference so that we don't re-entrantly call responseCallback. var sendResponse = responseCallback; responseCallback = null; if (arguments.length === 0) { // According to the documentation of chrome.runtime.sendMessage, the // callback is invoked without any arguments when an error occurs. sendResponse(); } else { sendResponse(response); } } // Note: make sure to manually remove the onMessage/onDisconnect listeners // that we added before destroying the Port, a workaround to a bug in Port // where any onMessage/onDisconnect listeners added but not removed will // be leaked when the Port is destroyed. // http://crbug.com/320723 tracks a sustainable fix. function disconnectListener() { if (!responseCallback) return; if (hasLastError()) { sendResponseAndClearCallback(); } else { setLastError( port.name, 'The message port closed before a response was received.'); try { sendResponseAndClearCallback(); } finally { clearLastError(); } } } function messageListener(response) { try { if (responseCallback) sendResponseAndClearCallback(response); } finally { port.disconnect(); } } port.onDisconnect.addListener(disconnectListener); port.onMessage.addListener(messageListener); }; function sendMessageUpdateArguments(functionName, hasOptionsArgument) { // skip functionName and hasOptionsArgument var args = $Array.slice(arguments, 2); var alignedArgs = messagingUtils.alignSendMessageArguments(args, hasOptionsArgument); if (!alignedArgs) throw new Error('Invalid arguments to ' + functionName + '.'); return alignedArgs; } function Port() { privates(Port).constructPrivate(this, arguments); } utils.expose(Port, PortImpl, { functions: [ 'disconnect', 'postMessage', ], properties: [ 'name', 'onDisconnect', 'onMessage', ], }); exports.$set('kRequestChannel', kRequestChannel); exports.$set('kMessageChannel', kMessageChannel); exports.$set('kNativeMessageChannel', kNativeMessageChannel); exports.$set('Port', Port); exports.$set('createPort', createPort); exports.$set('sendMessageImpl', sendMessageImpl); exports.$set('sendMessageUpdateArguments', sendMessageUpdateArguments); // For C++ code to call. exports.$set('dispatchOnConnect', dispatchOnConnect); exports.$set('dispatchOnDisconnect', dispatchOnDisconnect); exports.$set('dispatchOnMessage', dispatchOnMessage); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Routines used to normalize arguments to messaging functions. function alignSendMessageArguments(args, hasOptionsArgument) { // Align missing (optional) function arguments with the arguments that // schema validation is expecting, e.g. // extension.sendRequest(req) -> extension.sendRequest(null, req) // extension.sendRequest(req, cb) -> extension.sendRequest(null, req, cb) if (!args || !args.length) return null; var lastArg = args.length - 1; // responseCallback (last argument) is optional. var responseCallback = null; if (typeof args[lastArg] == 'function') responseCallback = args[lastArg--]; var options = null; if (hasOptionsArgument && lastArg >= 1) { // options (third argument) is optional. It can also be ambiguous which // argument it should match. If there are more than two arguments remaining, // options is definitely present: if (lastArg > 1) { options = args[lastArg--]; } else { // Exactly two arguments remaining. If the first argument is a string, // it should bind to targetId, and the second argument should bind to // request, which is required. In other words, when two arguments remain, // only bind options when the first argument cannot bind to targetId. if (!(args[0] === null || typeof args[0] == 'string')) options = args[lastArg--]; } } // request (second argument) is required. var request = args[lastArg--]; // targetId (first argument, extensionId in the manifest) is optional. var targetId = null; if (lastArg >= 0) targetId = args[lastArg--]; if (lastArg != -1) return null; if (hasOptionsArgument) return [targetId, request, options, responseCallback]; return [targetId, request, responseCallback]; } exports.$set('alignSendMessageArguments', alignSendMessageArguments); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * Custom bindings for the mime handler API. */ var binding = apiBridge || require('binding').Binding.create('mimeHandlerPrivate'); var utils = require('utils'); var NO_STREAM_ERROR = 'Streams are only available from a mime handler view guest.'; var STREAM_ABORTED_ERROR = 'Stream has been aborted.'; if ((typeof mojo === 'undefined') || !mojo.bindingsLibraryInitialized) { loadScript('mojo_bindings'); } loadScript('extensions/common/api/mime_handler.mojom'); var servicePtr = new extensions.mimeHandler.MimeHandlerServicePtr; Mojo.bindInterface(extensions.mimeHandler.MimeHandlerService.name, mojo.makeRequest(servicePtr).handle); var beforeUnloadControlPtr = new extensions.mimeHandler.BeforeUnloadControlPtr; Mojo.bindInterface( extensions.mimeHandler.BeforeUnloadControl.name, mojo.makeRequest(beforeUnloadControlPtr).handle); // Stores a promise to the GetStreamInfo() result to avoid making additional // calls in response to getStreamInfo() calls. var streamInfoPromise; function throwNoStreamError() { throw new Error(NO_STREAM_ERROR); } function createStreamInfoPromise() { return servicePtr.getStreamInfo().then(function(result) { if (!result.streamInfo) throw new Error(STREAM_ABORTED_ERROR); return result.streamInfo; }, throwNoStreamError); } function constructStreamInfoDict(streamInfo) { var headers = {}; for (var header of streamInfo.responseHeaders) { headers[header[0]] = header[1]; } return { mimeType: streamInfo.mimeType, originalUrl: streamInfo.originalUrl, streamUrl: streamInfo.streamUrl, tabId: streamInfo.tabId, embedded: !!streamInfo.embedded, responseHeaders: headers, }; } binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; utils.handleRequestWithPromiseDoNotUse( apiFunctions, 'mimeHandlerPrivate', 'getStreamInfo', function() { if (!streamInfoPromise) streamInfoPromise = createStreamInfoPromise(); return streamInfoPromise.then(constructStreamInfoDict); }); utils.handleRequestWithPromiseDoNotUse( apiFunctions, 'mimeHandlerPrivate', 'abortStream', function() { return servicePtr.abortStream().then(function() {}); }); utils.handleRequestWithPromiseDoNotUse( apiFunctions, 'mimeHandlerPrivate', 'setShowBeforeUnloadDialog', function(showDialog) { return beforeUnloadControlPtr.setShowBeforeUnloadDialog(showDialog); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'extensions/common/api/mime_handler.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('extensions.mimeHandler'); function StreamInfo(values) { this.initDefaults_(); this.initFields_(values); } StreamInfo.prototype.initDefaults_ = function() { this.mimeType = null; this.originalUrl = null; this.streamUrl = null; this.tabId = 0; this.embedded = false; this.responseHeaders = null; }; StreamInfo.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; StreamInfo.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 48} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate StreamInfo.mimeType err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate StreamInfo.originalUrl err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate StreamInfo.streamUrl err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate StreamInfo.responseHeaders err = messageValidator.validateMapPointer(offset + codec.kStructHeaderSize + 32, false, codec.String, codec.String, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; StreamInfo.encodedSize = codec.kStructHeaderSize + 40; StreamInfo.decode = function(decoder) { var packed; var val = new StreamInfo(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mimeType = decoder.decodeStruct(codec.String); val.originalUrl = decoder.decodeStruct(codec.String); val.streamUrl = decoder.decodeStruct(codec.String); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.embedded = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.responseHeaders = decoder.decodeMapPointer(codec.String, codec.String); return val; }; StreamInfo.encode = function(encoder, val) { var packed; encoder.writeUint32(StreamInfo.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mimeType); encoder.encodeStruct(codec.String, val.originalUrl); encoder.encodeStruct(codec.String, val.streamUrl); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.embedded & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeMapPointer(codec.String, codec.String, val.responseHeaders); }; function MimeHandlerService_GetStreamInfo_Params(values) { this.initDefaults_(); this.initFields_(values); } MimeHandlerService_GetStreamInfo_Params.prototype.initDefaults_ = function() { }; MimeHandlerService_GetStreamInfo_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MimeHandlerService_GetStreamInfo_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MimeHandlerService_GetStreamInfo_Params.encodedSize = codec.kStructHeaderSize + 0; MimeHandlerService_GetStreamInfo_Params.decode = function(decoder) { var packed; var val = new MimeHandlerService_GetStreamInfo_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MimeHandlerService_GetStreamInfo_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MimeHandlerService_GetStreamInfo_Params.encodedSize); encoder.writeUint32(0); }; function MimeHandlerService_GetStreamInfo_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MimeHandlerService_GetStreamInfo_ResponseParams.prototype.initDefaults_ = function() { this.streamInfo = null; }; MimeHandlerService_GetStreamInfo_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MimeHandlerService_GetStreamInfo_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MimeHandlerService_GetStreamInfo_ResponseParams.streamInfo err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, StreamInfo, true); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MimeHandlerService_GetStreamInfo_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MimeHandlerService_GetStreamInfo_ResponseParams.decode = function(decoder) { var packed; var val = new MimeHandlerService_GetStreamInfo_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.streamInfo = decoder.decodeStructPointer(StreamInfo); return val; }; MimeHandlerService_GetStreamInfo_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MimeHandlerService_GetStreamInfo_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(StreamInfo, val.streamInfo); }; function MimeHandlerService_AbortStream_Params(values) { this.initDefaults_(); this.initFields_(values); } MimeHandlerService_AbortStream_Params.prototype.initDefaults_ = function() { }; MimeHandlerService_AbortStream_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MimeHandlerService_AbortStream_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MimeHandlerService_AbortStream_Params.encodedSize = codec.kStructHeaderSize + 0; MimeHandlerService_AbortStream_Params.decode = function(decoder) { var packed; var val = new MimeHandlerService_AbortStream_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MimeHandlerService_AbortStream_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MimeHandlerService_AbortStream_Params.encodedSize); encoder.writeUint32(0); }; function MimeHandlerService_AbortStream_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MimeHandlerService_AbortStream_ResponseParams.prototype.initDefaults_ = function() { }; MimeHandlerService_AbortStream_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MimeHandlerService_AbortStream_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MimeHandlerService_AbortStream_ResponseParams.encodedSize = codec.kStructHeaderSize + 0; MimeHandlerService_AbortStream_ResponseParams.decode = function(decoder) { var packed; var val = new MimeHandlerService_AbortStream_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MimeHandlerService_AbortStream_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MimeHandlerService_AbortStream_ResponseParams.encodedSize); encoder.writeUint32(0); }; function BeforeUnloadControl_SetShowBeforeUnloadDialog_Params(values) { this.initDefaults_(); this.initFields_(values); } BeforeUnloadControl_SetShowBeforeUnloadDialog_Params.prototype.initDefaults_ = function() { this.showDialog = false; }; BeforeUnloadControl_SetShowBeforeUnloadDialog_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; BeforeUnloadControl_SetShowBeforeUnloadDialog_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; BeforeUnloadControl_SetShowBeforeUnloadDialog_Params.encodedSize = codec.kStructHeaderSize + 8; BeforeUnloadControl_SetShowBeforeUnloadDialog_Params.decode = function(decoder) { var packed; var val = new BeforeUnloadControl_SetShowBeforeUnloadDialog_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.showDialog = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; BeforeUnloadControl_SetShowBeforeUnloadDialog_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(BeforeUnloadControl_SetShowBeforeUnloadDialog_Params.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.showDialog & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams.prototype.initDefaults_ = function() { }; BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams.encodedSize = codec.kStructHeaderSize + 0; BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams.decode = function(decoder) { var packed; var val = new BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams.encodedSize); encoder.writeUint32(0); }; var kMimeHandlerService_GetStreamInfo_Name = 1006836693; var kMimeHandlerService_AbortStream_Name = 1558191934; function MimeHandlerServicePtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MimeHandlerService, handleOrPtrInfo); } function MimeHandlerServiceAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MimeHandlerService, associatedInterfacePtrInfo); } MimeHandlerServiceAssociatedPtr.prototype = Object.create(MimeHandlerServicePtr.prototype); MimeHandlerServiceAssociatedPtr.prototype.constructor = MimeHandlerServiceAssociatedPtr; function MimeHandlerServiceProxy(receiver) { this.receiver_ = receiver; } MimeHandlerServicePtr.prototype.getStreamInfo = function() { return MimeHandlerServiceProxy.prototype.getStreamInfo .apply(this.ptr.getProxy(), arguments); }; MimeHandlerServiceProxy.prototype.getStreamInfo = function() { var params_ = new MimeHandlerService_GetStreamInfo_Params(); return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMimeHandlerService_GetStreamInfo_Name, codec.align(MimeHandlerService_GetStreamInfo_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MimeHandlerService_GetStreamInfo_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MimeHandlerService_GetStreamInfo_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MimeHandlerServicePtr.prototype.abortStream = function() { return MimeHandlerServiceProxy.prototype.abortStream .apply(this.ptr.getProxy(), arguments); }; MimeHandlerServiceProxy.prototype.abortStream = function() { var params_ = new MimeHandlerService_AbortStream_Params(); return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMimeHandlerService_AbortStream_Name, codec.align(MimeHandlerService_AbortStream_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MimeHandlerService_AbortStream_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MimeHandlerService_AbortStream_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; function MimeHandlerServiceStub(delegate) { this.delegate_ = delegate; } MimeHandlerServiceStub.prototype.getStreamInfo = function() { return this.delegate_ && this.delegate_.getStreamInfo && this.delegate_.getStreamInfo(); } MimeHandlerServiceStub.prototype.abortStream = function() { return this.delegate_ && this.delegate_.abortStream && this.delegate_.abortStream(); } MimeHandlerServiceStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; MimeHandlerServiceStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMimeHandlerService_GetStreamInfo_Name: var params = reader.decodeStruct(MimeHandlerService_GetStreamInfo_Params); this.getStreamInfo().then(function(response) { var responseParams = new MimeHandlerService_GetStreamInfo_ResponseParams(); responseParams.streamInfo = response.streamInfo; var builder = new codec.MessageV1Builder( kMimeHandlerService_GetStreamInfo_Name, codec.align(MimeHandlerService_GetStreamInfo_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MimeHandlerService_GetStreamInfo_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMimeHandlerService_AbortStream_Name: var params = reader.decodeStruct(MimeHandlerService_AbortStream_Params); this.abortStream().then(function(response) { var responseParams = new MimeHandlerService_AbortStream_ResponseParams(); var builder = new codec.MessageV1Builder( kMimeHandlerService_AbortStream_Name, codec.align(MimeHandlerService_AbortStream_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MimeHandlerService_AbortStream_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMimeHandlerServiceRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMimeHandlerService_GetStreamInfo_Name: if (message.expectsResponse()) paramsClass = MimeHandlerService_GetStreamInfo_Params; break; case kMimeHandlerService_AbortStream_Name: if (message.expectsResponse()) paramsClass = MimeHandlerService_AbortStream_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMimeHandlerServiceResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMimeHandlerService_GetStreamInfo_Name: if (message.isResponse()) paramsClass = MimeHandlerService_GetStreamInfo_ResponseParams; break; case kMimeHandlerService_AbortStream_Name: if (message.isResponse()) paramsClass = MimeHandlerService_AbortStream_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MimeHandlerService = { name: 'extensions.mime_handler.MimeHandlerService', kVersion: 0, ptrClass: MimeHandlerServicePtr, proxyClass: MimeHandlerServiceProxy, stubClass: MimeHandlerServiceStub, validateRequest: validateMimeHandlerServiceRequest, validateResponse: validateMimeHandlerServiceResponse, }; MimeHandlerServiceStub.prototype.validator = validateMimeHandlerServiceRequest; MimeHandlerServiceProxy.prototype.validator = validateMimeHandlerServiceResponse; var kBeforeUnloadControl_SetShowBeforeUnloadDialog_Name = 1870977746; function BeforeUnloadControlPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(BeforeUnloadControl, handleOrPtrInfo); } function BeforeUnloadControlAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( BeforeUnloadControl, associatedInterfacePtrInfo); } BeforeUnloadControlAssociatedPtr.prototype = Object.create(BeforeUnloadControlPtr.prototype); BeforeUnloadControlAssociatedPtr.prototype.constructor = BeforeUnloadControlAssociatedPtr; function BeforeUnloadControlProxy(receiver) { this.receiver_ = receiver; } BeforeUnloadControlPtr.prototype.setShowBeforeUnloadDialog = function() { return BeforeUnloadControlProxy.prototype.setShowBeforeUnloadDialog .apply(this.ptr.getProxy(), arguments); }; BeforeUnloadControlProxy.prototype.setShowBeforeUnloadDialog = function(showDialog) { var params_ = new BeforeUnloadControl_SetShowBeforeUnloadDialog_Params(); params_.showDialog = showDialog; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kBeforeUnloadControl_SetShowBeforeUnloadDialog_Name, codec.align(BeforeUnloadControl_SetShowBeforeUnloadDialog_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(BeforeUnloadControl_SetShowBeforeUnloadDialog_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; function BeforeUnloadControlStub(delegate) { this.delegate_ = delegate; } BeforeUnloadControlStub.prototype.setShowBeforeUnloadDialog = function(showDialog) { return this.delegate_ && this.delegate_.setShowBeforeUnloadDialog && this.delegate_.setShowBeforeUnloadDialog(showDialog); } BeforeUnloadControlStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; BeforeUnloadControlStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kBeforeUnloadControl_SetShowBeforeUnloadDialog_Name: var params = reader.decodeStruct(BeforeUnloadControl_SetShowBeforeUnloadDialog_Params); this.setShowBeforeUnloadDialog(params.showDialog).then(function(response) { var responseParams = new BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams(); var builder = new codec.MessageV1Builder( kBeforeUnloadControl_SetShowBeforeUnloadDialog_Name, codec.align(BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateBeforeUnloadControlRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kBeforeUnloadControl_SetShowBeforeUnloadDialog_Name: if (message.expectsResponse()) paramsClass = BeforeUnloadControl_SetShowBeforeUnloadDialog_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateBeforeUnloadControlResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kBeforeUnloadControl_SetShowBeforeUnloadDialog_Name: if (message.isResponse()) paramsClass = BeforeUnloadControl_SetShowBeforeUnloadDialog_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var BeforeUnloadControl = { name: 'extensions.mime_handler.BeforeUnloadControl', kVersion: 0, ptrClass: BeforeUnloadControlPtr, proxyClass: BeforeUnloadControlProxy, stubClass: BeforeUnloadControlStub, validateRequest: validateBeforeUnloadControlRequest, validateResponse: validateBeforeUnloadControlResponse, }; BeforeUnloadControlStub.prototype.validator = validateBeforeUnloadControlRequest; BeforeUnloadControlProxy.prototype.validator = validateBeforeUnloadControlResponse; exports.StreamInfo = StreamInfo; exports.MimeHandlerService = MimeHandlerService; exports.MimeHandlerServicePtr = MimeHandlerServicePtr; exports.MimeHandlerServiceAssociatedPtr = MimeHandlerServiceAssociatedPtr; exports.BeforeUnloadControl = BeforeUnloadControl; exports.BeforeUnloadControlPtr = BeforeUnloadControlPtr; exports.BeforeUnloadControlAssociatedPtr = BeforeUnloadControlAssociatedPtr; })();// Copyright (c) 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module keeps references to original methods before user code is able // to overwrite them. We assume that this module is executed before any user // code. The idea is similar to the extension system's SafeBuiltins, and since // it's similar, we also use a $ prefix as a naming convention. // For example, // myElement.setAttribute(name, value); // becomes // $Element.setAttribute(myElement, name, value); // We also provide access to getters and setters: // myNode.parentNode; // becomes // $Node.parentNode.get(myNode); function makeCallable(prototypeMethod) { return (thisArg, ...args) => { return $Function.apply(prototypeMethod, thisArg, args); }; } function saveMethods(original, safe, methods) { for (var method of methods) { safe[method] = makeCallable(original.prototype[method]); } } function saveAccessors(original, safe, properties) { for (var property of properties) { var desc = $Object.getOwnPropertyDescriptor(original.prototype, property); safe[property] = { get: desc.get && makeCallable(desc.get), set: desc.set && makeCallable(desc.set), }; } } var SafeMethods = { $CustomElementRegistry: {}, $Document: {}, $Element: {}, $EventTarget: {}, $HTMLElement: {}, $HTMLIFrameElement: {}, $MutationObserver: MutationObserver, $Node: {}, $getComputedStyle: window.getComputedStyle, $parseInt: window.parseInt, }; saveMethods(CustomElementRegistry, SafeMethods.$CustomElementRegistry, [ 'define', ]); saveMethods(Document, SafeMethods.$Document, [ 'createElement', 'webkitCancelFullScreen', ]); saveMethods(Element, SafeMethods.$Element, [ 'attachShadow', 'getAttribute', 'getBoundingClientRect', 'hasAttribute', 'removeAttribute', 'setAttribute', 'webkitRequestFullScreen', ]); saveMethods(EventTarget, SafeMethods.$EventTarget, [ 'addEventListener', 'dispatchEvent', 'removeEventListener', ]); saveMethods(HTMLElement, SafeMethods.$HTMLElement, [ 'focus', ]); saveAccessors(HTMLElement, SafeMethods.$HTMLElement, [ 'style', 'innerText', ]); saveAccessors(HTMLIFrameElement, SafeMethods.$HTMLIFrameElement, [ 'contentWindow', ]); saveMethods(MutationObserver, SafeMethods.$MutationObserver, [ 'observe', 'takeRecords', ]); saveMethods(Node, SafeMethods.$Node, [ 'appendChild', 'replaceChild', ]); saveAccessors(Node, SafeMethods.$Node, [ 'parentNode', ]); exports.$set('SafeMethods', SafeMethods); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Routines used to validate and normalize arguments. // TODO(benwells): unit test this file. var JSONSchemaValidator = require('json_schema').JSONSchemaValidator; var schemaValidator = new JSONSchemaValidator(); // Validate arguments. function validate(args, parameterSchemas) { if (args.length > parameterSchemas.length) throw new Error('Too many arguments.'); for (var i = 0; i < parameterSchemas.length; ++i) { if ($Object.hasOwnProperty(args, i) && args[i] !== null && args[i] !== undefined) { schemaValidator.resetErrors(); schemaValidator.validate(args[i], parameterSchemas[i]); if (schemaValidator.errors.length == 0) continue; var message = 'Invalid value for argument ' + (i + 1) + '. '; $Array.forEach(schemaValidator.errors, function(err) { if (err.path) { message += "Property '" + err.path + "': "; } message += err.message; message = message.substring(0, message.length - 1); message += ', '; }); message = message.substring(0, message.length - 2); message += '.'; throw new Error(message); } else if (!parameterSchemas[i].optional) { throw new Error('Parameter ' + (i + 1) + ' (' + parameterSchemas[i].name + ') is required.'); } } } // Generate all possible signatures for a given API function. function getSignatures(parameterSchemas) { if (parameterSchemas.length === 0) return [[]]; var signatures = []; $Object.setPrototypeOf(signatures, null); $Object.setPrototypeOf(parameterSchemas, null); var remaining = getSignatures($Array.slice(parameterSchemas, 1)); $Object.setPrototypeOf(remaining, null); for (var i = 0; i < remaining.length; ++i) $Array.push(signatures, $Array.concat([parameterSchemas[0]], remaining[i])) if (parameterSchemas[0].optional) return $Array.concat(signatures, remaining); return signatures; }; // Return true if arguments match a given signature's schema. function argumentsMatchSignature(args, candidateSignature) { if (args.length != candidateSignature.length) return false; for (var i = 0; i < candidateSignature.length; ++i) { var argType = JSONSchemaValidator.getType(args[i]); if (!schemaValidator.isValidSchemaType(argType, candidateSignature[i])) return false; } return true; }; // Finds the function signature for the given arguments. function resolveSignature(args, definedSignature) { var candidateSignatures = getSignatures(definedSignature); for (var i = 0; i < candidateSignatures.length; ++i) { if (argumentsMatchSignature(args, candidateSignatures[i])) return candidateSignatures[i]; } return null; }; // Returns a string representing the defined signature of the API function. // Example return value for chrome.windows.getCurrent: // "windows.getCurrent(optional object populate, function callback)" function getParameterSignatureString(name, definedSignature) { var getSchemaTypeString = function(schema) { var schemaTypes = schemaValidator.getAllTypesForSchema(schema); var typeName = $Array.join(schemaTypes, ' or ') + ' ' + schema.name; if (schema.optional) return 'optional ' + typeName; return typeName; }; var typeNames = $Array.map(definedSignature, getSchemaTypeString); return name + '(' + $Array.join(typeNames, ', ') + ')'; }; // Returns a string representing a call to an API function. // Example return value for call: chrome.windows.get(1, callback) is: // "windows.get(int, function)" function getArgumentSignatureString(name, args) { var typeNames = $Array.map(args, JSONSchemaValidator.getType); return name + '(' + $Array.join(typeNames, ', ') + ')'; }; // Finds the correct signature for the given arguments, then validates the // arguments against that signature. Returns a 'normalized' arguments list // where nulls are inserted where optional parameters were omitted. // |args| is expected to be an array. function normalizeArgumentsAndValidate(args, funDef) { if (funDef.allowAmbiguousOptionalArguments) { validate(args, funDef.definition.parameters); return args; } var definedSignature = funDef.definition.parameters; var resolvedSignature = resolveSignature(args, definedSignature); if (!resolvedSignature) throw new Error('Invocation of form ' + getArgumentSignatureString(funDef.name, args) + " doesn't match definition " + getParameterSignatureString(funDef.name, definedSignature)); validate(args, resolvedSignature); var normalizedArgs = []; $Object.setPrototypeOf(normalizedArgs, null); var ai = 0; for (var si = 0; si < definedSignature.length; ++si) { if (definedSignature[si] === resolvedSignature[ai]) $Array.push(normalizedArgs, args[ai++]); else $Array.push(normalizedArgs, null); } return normalizedArgs; }; // Validates that a given schema for an API function is not ambiguous. function isFunctionSignatureAmbiguous(functionDef) { if (functionDef.allowAmbiguousOptionalArguments) return false; var signaturesAmbiguous = function(signature1, signature2) { if (signature1.length != signature2.length) return false; for (var i = 0; i < signature1.length; i++) { if (!schemaValidator.checkSchemaOverlap( signature1[i], signature2[i])) return false; } return true; }; var candidateSignatures = getSignatures(functionDef.parameters); for (var i = 0; i < candidateSignatures.length; ++i) { for (var j = i + 1; j < candidateSignatures.length; ++j) { if (signaturesAmbiguous(candidateSignatures[i], candidateSignatures[j])) return true; } } return false; }; exports.$set('isFunctionSignatureAmbiguous', isFunctionSignatureAmbiguous); exports.$set('normalizeArgumentsAndValidate', normalizeArgumentsAndValidate); exports.$set('schemaValidator', schemaValidator); exports.$set('validate', validate); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var exceptionHandler = require('uncaught_exception_handler'); var lastError = require('lastError'); var logging = requireNative('logging'); var natives = requireNative('sendRequest'); var validate = require('schemaUtils').validate; var safeCallbackApply = exceptionHandler.safeCallbackApply; // All outstanding requests from sendRequest(). var requests = { __proto__: null }; // Used to prevent double Activity Logging for API calls that use both custom // bindings and ExtensionFunctions (via sendRequest). var calledSendRequest = false; // Callback handling. function handleResponse(requestId, name, success, responseList, error) { // The chrome objects we will set lastError on. Really we should only be // setting this on the callback's chrome object, but set on ours too since // it's conceivable that something relies on that. var callerChrome = chrome; try { var request = requests[requestId]; logging.DCHECK(request != null); // lastError needs to be set on the caller's chrome object no matter what, // though chances are it's the same as ours (it will be different when // calling API methods on other contexts). if (request.callback) { var global = natives.GetGlobal(request.callback); callerChrome = global ? global.chrome : callerChrome; } lastError.clear(chrome); if (callerChrome !== chrome) lastError.clear(callerChrome); if (!success) { if (!error) error = "Unknown error."; lastError.set(name, error, request.stack, chrome); if (callerChrome !== chrome) lastError.set(name, error, request.stack, callerChrome); } if (request.customCallback) { safeCallbackApply(name, request, request.customCallback, $Array.concat([name, request, request.callback], responseList)); } else if (request.callback) { // Validate callback in debug only -- and only when the // caller has provided a callback. Implementations of api // calls may not return data if they observe the caller // has not provided a callback. if (logging.DCHECK_IS_ON() && !error) { if (!request.callbackSchema.parameters) throw new Error(name + ": no callback schema defined"); validate(responseList, request.callbackSchema.parameters); } safeCallbackApply(name, request, request.callback, responseList); } if (error && !lastError.hasAccessed(chrome)) { // The native call caused an error, but the developer might not have // checked runtime.lastError. lastError.reportIfUnchecked(name, callerChrome, request.stack); } } finally { delete requests[requestId]; lastError.clear(chrome); if (callerChrome !== chrome) lastError.clear(callerChrome); } } function prepareRequest(args, argSchemas) { var request = { __proto__: null }; var argCount = args.length; // Look for callback param. if (argSchemas.length > 0 && argSchemas[argSchemas.length - 1].type == "function") { request.callback = args[args.length - 1]; request.callbackSchema = argSchemas[argSchemas.length - 1]; --argCount; } request.args = $Array.slice(args, 0, argCount); return request; } // Send an API request and optionally register a callback. // |optArgs| is an object with optional parameters as follows: // - customCallback: a callback that should be called instead of the standard // callback. // - forIOThread: true if this function should be handled on the browser IO // thread. // - preserveNullInObjects: true if it is safe for null to be in objects. // - stack: An optional string that contains the stack trace, to be displayed // to the user if an error occurs. function sendRequest(functionName, args, argSchemas, optArgs) { calledSendRequest = true; if (!optArgs) optArgs = { __proto__: null }; logging.DCHECK(optArgs.__proto__ == null); var request = prepareRequest(args, argSchemas); request.stack = optArgs.stack || exceptionHandler.getExtensionStackTrace(); if (optArgs.customCallback) { request.customCallback = optArgs.customCallback; } var hasCallback = request.callback || optArgs.customCallback; var requestId = natives.StartRequest(functionName, request.args, hasCallback, optArgs.forIOThread, optArgs.preserveNullInObjects); delete request.args; request.id = requestId; requests[requestId] = request; } function getCalledSendRequest() { return calledSendRequest; } function clearCalledSendRequest() { calledSendRequest = false; } exports.$set('sendRequest', sendRequest); exports.$set('getCalledSendRequest', getCalledSendRequest); exports.$set('clearCalledSendRequest', clearCalledSendRequest); // Called by C++. exports.$set('handleResponse', handleResponse); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var SetIconCommon = requireNative('setIcon').SetIconCommon; function loadImagePath(path, callback) { var img = new Image(); img.onerror = function() { console.error('Could not load action icon \'' + path + '\'.'); }; img.onload = function() { var canvas = document.createElement('canvas'); canvas.width = img.width; canvas.height = img.height; var canvas_context = canvas.getContext('2d'); canvas_context.clearRect(0, 0, canvas.width, canvas.height); canvas_context.drawImage(img, 0, 0, canvas.width, canvas.height); var imageData = canvas_context.getImageData(0, 0, canvas.width, canvas.height); callback(imageData); }; img.src = path; } function smellsLikeImageData(imageData) { // See if this object at least looks like an ImageData element. // Unfortunately, we cannot use instanceof because the ImageData // constructor is not public. // // We do this manually instead of using JSONSchema to avoid having these // properties show up in the doc. return (typeof imageData == 'object') && ('width' in imageData) && ('height' in imageData) && ('data' in imageData); } function verifyImageData(imageData) { if (!smellsLikeImageData(imageData)) { throw new Error( 'The imageData property must contain an ImageData object or' + ' dictionary of ImageData objects.'); } } /** * Normalizes |details| to a format suitable for sending to the browser, * for example converting ImageData to a binary representation. * * @param {ImageDetails} details * The ImageDetails passed into an extension action-style API. * @param {Function} callback * The callback function to pass processed imageData back to. Note that this * callback may be called reentrantly. */ function setIcon(details, callback) { // Note that iconIndex is actually deprecated, and only available to the // pageAction API. // TODO(kalman): Investigate whether this is for the pageActions API, and if // so, delete it. if ('iconIndex' in details) { callback(details); return; } if ('imageData' in details) { if (smellsLikeImageData(details.imageData)) { var imageData = details.imageData; details.imageData = {}; details.imageData[imageData.width.toString()] = imageData; } else if (typeof details.imageData == 'object' && Object.getOwnPropertyNames(details.imageData).length !== 0) { for (var sizeKey in details.imageData) { verifyImageData(details.imageData[sizeKey]); } } else { verifyImageData(false); } callback(SetIconCommon(details)); return; } if ('path' in details) { if (typeof details.path == 'object') { details.imageData = {}; var detailKeyCount = 0; for (var iconSize in details.path) { ++detailKeyCount; loadImagePath(details.path[iconSize], function(size, imageData) { details.imageData[size] = imageData; if (--detailKeyCount == 0) callback(SetIconCommon(details)); }.bind(null, iconSize)); } if (detailKeyCount == 0) throw new Error('The path property must not be empty.'); } else if (typeof details.path == 'string') { details.imageData = {}; loadImagePath(details.path, function(imageData) { details.imageData[imageData.width.toString()] = imageData; delete details.path; callback(SetIconCommon(details)); }); } return; } throw new Error('Either the path or imageData property must be specified.'); } exports.$set('setIcon', setIcon); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // test_custom_bindings.js // mini-framework for ExtensionApiTest browser tests var binding = apiBridge || require('binding').Binding.create('test'); var environmentSpecificBindings = require('test_environment_specific_bindings'); var GetExtensionAPIDefinitionsForTest = requireNative('apiDefinitions').GetExtensionAPIDefinitionsForTest; var GetAPIFeatures = requireNative('test_features').GetAPIFeatures; var natives = requireNative('test_native_handler'); var userGestures = requireNative('user_gestures'); var GetModuleSystem = requireNative('v8_context').GetModuleSystem; var jsExceptionHandler = bindingUtil ? undefined : require('uncaught_exception_handler'); function setExceptionHandler(handler) { if (bindingUtil) bindingUtil.setExceptionHandler(handler); else jsExceptionHandler.setHandler(handler); } function handleException(message, error) { if (bindingUtil) bindingUtil.handleException(message || 'Unknown error', error); else jsExceptionHandler.handle(message, error); } binding.registerCustomHook(function(api) { var chromeTest = api.compiledApi; var apiFunctions = api.apiFunctions; chromeTest.tests = chromeTest.tests || []; var currentTest = null; var lastTest = null; var testsFailed = 0; var testCount = 1; var failureException = 'chrome.test.failure'; // Helper function to get around the fact that function names in javascript // are read-only, and you can't assign one to anonymous functions. function testName(test) { return test ? (test.name || test.generatedName) : "(no test)"; } function testDone() { environmentSpecificBindings.testDone(chromeTest.runNextTest); } function allTestsDone() { if (testsFailed == 0) { chromeTest.notifyPass(); } else { chromeTest.notifyFail('Failed ' + testsFailed + ' of ' + testCount + ' tests'); } } var pendingCallbacks = 0; apiFunctions.setHandleRequest('callbackAdded', function() { pendingCallbacks++; var called = null; return function() { if (called != null) { var redundantPrefix = 'Error\n'; chromeTest.fail( 'Callback has already been run. ' + 'First call:\n' + $String.slice(called, redundantPrefix.length) + '\n' + 'Second call:\n' + $String.slice(new Error().stack, redundantPrefix.length)); } called = new Error().stack; pendingCallbacks--; if (pendingCallbacks == 0) { chromeTest.succeed(); } }; }); apiFunctions.setHandleRequest('runNextTest', function() { // There may have been callbacks which were interrupted by failure // exceptions. pendingCallbacks = 0; lastTest = currentTest; currentTest = $Array.shift(chromeTest.tests); if (!currentTest) { allTestsDone(); return; } try { chromeTest.log("( RUN ) " + testName(currentTest)); setExceptionHandler(function(message, e) { if (e !== failureException) chromeTest.fail('uncaught exception: ' + message); }); $Function.call(currentTest); } catch (e) { handleException(e.message, e); } }); apiFunctions.setHandleRequest('fail', function failHandler(message) { chromeTest.log("( FAILED ) " + testName(currentTest)); var stack = {}; // NOTE(devlin): captureStackTrace() populates a stack property of the // passed-in object with the stack trace. The second parameter (failHandler) // represents a function to serve as a relative point, and is removed from // the trace (so that everything doesn't include failHandler in the trace // itself). This (and other APIs) are documented here: // https://github.com/v8/v8/wiki/Stack%20Trace%20API. If we wanted to be // really fancy, there may be more sophisticated ways of doing this. Error.captureStackTrace(stack, failHandler); if (!message) message = "FAIL (no message)"; message += "\n" + stack.stack; console.log("[FAIL] " + testName(currentTest) + ": " + message); testsFailed++; testDone(); // Interrupt the rest of the test. throw failureException; }); apiFunctions.setHandleRequest('succeed', function() { console.log("[SUCCESS] " + testName(currentTest)); chromeTest.log("( SUCCESS )"); testDone(); }); apiFunctions.setHandleRequest('getModuleSystem', function(context) { return GetModuleSystem(context); }); apiFunctions.setHandleRequest('assertTrue', function(test, message) { chromeTest.assertBool(test, true, message); }); apiFunctions.setHandleRequest('assertFalse', function(test, message) { chromeTest.assertBool(test, false, message); }); apiFunctions.setHandleRequest('assertBool', function(test, expected, message) { if (test !== expected) { if (typeof(test) == "string") { if (message) message = test + "\n" + message; else message = test; } chromeTest.fail(message); } }); apiFunctions.setHandleRequest('checkDeepEq', function(expected, actual) { if ((expected === null) != (actual === null)) return false; if (expected === actual) return true; if (typeof(expected) !== typeof(actual)) return false; if ((actual instanceof ArrayBuffer) && (expected instanceof ArrayBuffer)) { if (actual.byteLength != expected.byteLength) return false; var actualView = new Uint8Array(actual); var expectedView = new Uint8Array(expected); for (var i = 0; i < actualView.length; ++i) { if (actualView[i] != expectedView[i]) { return false; } } return true; } for (var p in actual) { if ($Object.hasOwnProperty(actual, p) && !$Object.hasOwnProperty(expected, p)) { return false; } } for (var p in expected) { if ($Object.hasOwnProperty(expected, p) && !$Object.hasOwnProperty(actual, p)) { return false; } } for (var p in expected) { var eq = true; switch (typeof(expected[p])) { case 'object': eq = chromeTest.checkDeepEq(expected[p], actual[p]); break; case 'function': eq = (typeof(actual[p]) != 'undefined' && expected[p].toString() == actual[p].toString()); break; default: eq = (expected[p] == actual[p] && typeof(expected[p]) == typeof(actual[p])); break; } if (!eq) return false; } return true; }); apiFunctions.setHandleRequest('assertEq', function(expected, actual, message) { var error_msg = "API Test Error in " + testName(currentTest); if (message) error_msg += ": " + message; if (typeof(expected) == 'object') { if (!chromeTest.checkDeepEq(expected, actual)) { error_msg += "\nActual: " + $JSON.stringify(actual) + "\nExpected: " + $JSON.stringify(expected); chromeTest.fail(error_msg); } return; } if (expected != actual) { chromeTest.fail(error_msg + "\nActual: " + actual + "\nExpected: " + expected); } if (typeof(expected) != typeof(actual)) { chromeTest.fail(error_msg + " (type mismatch)\nActual Type: " + typeof(actual) + "\nExpected Type:" + typeof(expected)); } }); apiFunctions.setHandleRequest('assertNoLastError', function() { if (chrome.runtime.lastError != undefined) { chromeTest.fail("lastError.message == " + chrome.runtime.lastError.message); } }); apiFunctions.setHandleRequest('assertLastError', function(expectedError) { chromeTest.assertEq(typeof(expectedError), 'string'); chromeTest.assertTrue(chrome.runtime.lastError != undefined, "No lastError, but expected " + expectedError); chromeTest.assertEq(expectedError, chrome.runtime.lastError.message); }); apiFunctions.setHandleRequest('assertThrows', function(fn, self, args, message) { chromeTest.assertTrue(typeof fn == 'function'); try { fn.apply(self, args); chromeTest.fail('Did not throw error: ' + fn); } catch (e) { if (e != failureException && message !== undefined) { if (message instanceof RegExp) { chromeTest.assertTrue(message.test(e.message), e.message + ' should match ' + message) } else { chromeTest.assertEq(message, e.message); } } } }); function safeFunctionApply(func, args) { try { if (func) return $Function.apply(func, undefined, args); } catch (e) { if (e === failureException) throw e; handleException(e.message, e); } }; // Wrapper for generating test functions, that takes care of calling // assertNoLastError() and (optionally) succeed() for you. apiFunctions.setHandleRequest('callback', function(func, expectedError) { if (func) { chromeTest.assertEq(typeof(func), 'function'); } var callbackCompleted = chromeTest.callbackAdded(); return function() { if (expectedError == null) { chromeTest.assertNoLastError(); } else { chromeTest.assertLastError(expectedError); } var result; if (func) { result = safeFunctionApply(func, arguments); } callbackCompleted(); return result; }; }); apiFunctions.setHandleRequest('listenOnce', function(event, func) { var callbackCompleted = chromeTest.callbackAdded(); var listener = function() { event.removeListener(listener); safeFunctionApply(func, arguments); callbackCompleted(); }; event.addListener(listener); }); apiFunctions.setHandleRequest('listenForever', function(event, func) { var callbackCompleted = chromeTest.callbackAdded(); var listener = function() { safeFunctionApply(func, arguments); }; var done = function() { event.removeListener(listener); callbackCompleted(); }; event.addListener(listener); return done; }); apiFunctions.setHandleRequest('callbackPass', function(func) { return chromeTest.callback(func); }); apiFunctions.setHandleRequest('callbackFail', function(expectedError, func) { return chromeTest.callback(func, expectedError); }); apiFunctions.setHandleRequest('runTests', function(tests) { chromeTest.tests = tests; testCount = chromeTest.tests.length; chromeTest.runNextTest(); }); apiFunctions.setHandleRequest('getApiDefinitions', function() { return GetExtensionAPIDefinitionsForTest(); }); apiFunctions.setHandleRequest('getApiFeatures', function() { return GetAPIFeatures(); }); apiFunctions.setHandleRequest('isProcessingUserGesture', function() { return userGestures.IsProcessingUserGesture(); }); apiFunctions.setHandleRequest('runWithUserGesture', function(callback) { chromeTest.assertEq(typeof(callback), 'function'); return userGestures.RunWithUserGesture(callback); }); apiFunctions.setHandleRequest('setExceptionHandler', function(callback) { chromeTest.assertEq(typeof(callback), 'function'); setExceptionHandler(callback); }); apiFunctions.setHandleRequest('getWakeEventPage', function() { return natives.GetWakeEventPage(); }); environmentSpecificBindings.registerHooks(api); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Handles uncaught exceptions thrown by extensions. By default this is to // log an error message, but tests may override this behaviour. var handler = function(message, e) { console.error(message); }; /** * Formats the error message and invokes the error handler. * * @param {string} message - Error message prefix. * @param {Error|*} e - Thrown object. * @param {string=} priorStackTrace - Error message suffix. * @see formatErrorMessage */ function handle(message, e, priorStackTrace) { message = formatErrorMessage(message, e, priorStackTrace); handler(message, e); } // Runs a user-supplied callback safely. function safeCallbackApply(name, request, callback, args) { try { $Function.apply(callback, request, args); } catch (e) { handle('Error in response to ' + name, e, request.stack); } } /** * Append the error description and stack trace to |message|. * * @param {string} message - The prefix of the error message. * @param {Error|*} e - The thrown error object. This object is potentially * unsafe, because it could be generated by an extension. * @param {string=} priorStackTrace - The stack trace to be appended to the * error message. This stack trace must not include stack frames of |e.stack|, * because both stack traces are concatenated. Overlapping stack traces will * confuse extension developers. * @return {string} The formatted error message. */ function formatErrorMessage(message, e, priorStackTrace) { if (e) message += ': ' + safeErrorToString(e, false); var stack; try { // If the stack was set, use it. // |e.stack| could be void in the following common example: // throw "Error message"; stack = $String.self(e && e.stack); } catch (e) {} // If a stack is not provided, capture a stack trace. if (!priorStackTrace && !stack) stack = getStackTrace(); stack = filterExtensionStackTrace(stack); if (stack) message += '\n' + stack; // If an asynchronouse stack trace was set, append it. if (priorStackTrace) message += '\n' + priorStackTrace; return message; } function filterExtensionStackTrace(stack) { if (!stack) return ''; // Remove stack frames in the stack trace that weren't associated with the // extension, to not confuse extension developers with internal details. stack = $String.split(stack, '\n'); stack = $Array.filter(stack, function(line) { return $String.indexOf(line, 'chrome-extension://') >= 0; }); return $Array.join(stack, '\n'); } function getStackTrace() { var e = {}; $Error.captureStackTrace(e, getStackTrace); return e.stack; } function getExtensionStackTrace() { return filterExtensionStackTrace(getStackTrace()); } /** * Convert an object to a string. * * @param {Error|*} e - A thrown object (possibly user-supplied). * @param {boolean=} omitType - Whether to try to serialize |e.message| instead * of |e.toString()|. * @return {string} The error message. */ function safeErrorToString(e, omitType) { try { return $String.self(omitType && e.message || e); } catch (e) { // This error is exceptional and could be triggered by // throw {toString: function() { throw 'Haha' } }; return '(cannot get error message)'; } } exports.$set('handle', handle); // |newHandler| A function which matches |handler|. exports.$set('setHandler', function(newHandler) { handler = newHandler; }); exports.$set('safeCallbackApply', safeCallbackApply); exports.$set('getStackTrace', getStackTrace); exports.$set('getExtensionStackTrace', getExtensionStackTrace); exports.$set('safeErrorToString', safeErrorToString); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var nativeDeepCopy = requireNative('utils').deepCopy; var logActivity = requireNative('activityLogger'); var exceptionHandler = require('uncaught_exception_handler'); var jsLastError = bindingUtil ? undefined : require('lastError'); function runCallbackWithLastError(name, message, stack, callback, args) { if (bindingUtil) { bindingUtil.runCallbackWithLastError(message, function() { $Function.apply(callback, null, args); }); } else { jsLastError.run(name, message, stack, callback, args); } } /** * An object forEach. Calls |f| with each (key, value) pair of |obj|, using * |self| as the target. * @param {Object} obj The object to iterate over. * @param {function} f The function to call in each iteration. * @param {Object} self The object to use as |this| in each function call. */ function forEach(obj, f, self) { for (var key in obj) { if ($Object.hasOwnProperty(obj, key)) $Function.call(f, self, key, obj[key]); } } /** * Assuming |array_of_dictionaries| is structured like this: * [{id: 1, ... }, {id: 2, ...}, ...], you can use * lookup(array_of_dictionaries, 'id', 2) to get the dictionary with id == 2. * @param {Array>} array_of_dictionaries * @param {string} field * @param {?} value */ function lookup(array_of_dictionaries, field, value) { var filter = function (dict) {return dict[field] == value;}; var matches = $Array.filter(array_of_dictionaries, filter); if (matches.length == 0) { return undefined; } else if (matches.length == 1) { return matches[0] } else { throw new Error("Failed lookup of field '" + field + "' with value '" + value + "'"); } } /** * Sets a property |value| on |obj| with property name |key|. Like * * obj[key] = value; * * but without triggering setters. */ function defineProperty(obj, key, value) { $Object.defineProperty(obj, key, { __proto__: null, configurable: true, enumerable: true, writable: true, value: value, }); } /** * Takes a private class implementation |privateClass| and exposes a subset of * its methods |functions| and properties |properties| and |readonly| to a * public wrapper class that should be passed in. Within bindings code, you can * access the implementation from an instance of the wrapper class using * privates(instance).impl, and from the implementation class you can access * the wrapper using this.wrapper (or implInstance.wrapper if you have another * instance of the implementation class). * * |publicClass| should be a constructor that calls constructPrivate() like so: * * privates(publicClass).constructPrivate(this, arguments); * * @param {function} publicClass The publicly exposed wrapper class. This must * be a named function, and the name appears in stack traces. * @param {Object} privateClass The class implementation. * @param {{superclass: ?Function, * functions: ?Array, * properties: ?Array, * readonly: ?Array}} exposed The names of properties on the * implementation class to be exposed. |superclass| represents the * constructor of the class to be used as the superclass of the exposed * class; |functions| represents the names of functions which should be * delegated to the implementation; |properties| are gettable/settable * properties and |readonly| are read-only properties. */ function expose(publicClass, privateClass, exposed) { $Object.setPrototypeOf(exposed, null); // This should be called by publicClass. privates(publicClass).constructPrivate = function(self, args) { if (!(self instanceof publicClass)) { throw new Error('Please use "new ' + publicClass.name + '"'); } // The "instanceof publicClass" check can easily be spoofed, so we check // whether the private impl is already set before continuing. var privateSelf = privates(self); if ('impl' in privateSelf) { throw new Error('Object ' + publicClass.name + ' is already constructed'); } var privateObj = $Object.create(privateClass.prototype); $Function.apply(privateClass, privateObj, args); privateObj.wrapper = self; privateSelf.impl = privateObj; }; function getPrivateImpl(self) { var impl = privates(self).impl; if (!(impl instanceof privateClass)) { // Either the object is not constructed, or the property descriptor is // used on a target that is not an instance of publicClass. throw new Error('impl is not an instance of ' + privateClass.name); } return impl; } var publicClassPrototype = { // The final prototype will be assigned at the end of this method. __proto__: null, constructor: publicClass, }; if ('functions' in exposed) { $Array.forEach(exposed.functions, function(func) { publicClassPrototype[func] = function() { var impl = getPrivateImpl(this); return $Function.apply(impl[func], impl, arguments); }; }); } if ('properties' in exposed) { $Array.forEach(exposed.properties, function(prop) { $Object.defineProperty(publicClassPrototype, prop, { __proto__: null, enumerable: true, get: function() { return getPrivateImpl(this)[prop]; }, set: function(value) { var impl = getPrivateImpl(this); delete impl[prop]; impl[prop] = value; } }); }); } if ('readonly' in exposed) { $Array.forEach(exposed.readonly, function(readonly) { $Object.defineProperty(publicClassPrototype, readonly, { __proto__: null, enumerable: true, get: function() { return getPrivateImpl(this)[readonly]; }, }); }); } // The prototype properties have been installed. Now we can safely assign an // unsafe prototype and export the class to the public. var superclass = exposed.superclass || $Object.self; $Object.setPrototypeOf(publicClassPrototype, superclass.prototype); publicClass.prototype = publicClassPrototype; return publicClass; } /** * Returns a deep copy of |value|. The copy will have no references to nested * values of |value|. */ function deepCopy(value) { return nativeDeepCopy(value); } // DO NOT USE. This causes problems with safe builtins, and makes migration to // native bindings more difficult. function handleRequestWithPromiseDoNotUse( binding, apiName, methodName, customizedFunction) { var fullName = apiName + '.' + methodName; var extensionId = requireNative('process').GetExtensionId(); binding.setHandleRequest(methodName, function() { logActivity.LogAPICall(extensionId, fullName, $Array.slice(arguments)); var stack = exceptionHandler.getExtensionStackTrace(); var callback = arguments[arguments.length - 1]; var args = $Array.slice(arguments, 0, arguments.length - 1); var keepAlive = require('keep_alive').createKeepAlive(); $Function.apply(customizedFunction, this, args).then(function(result) { if (callback) { exceptionHandler.safeCallbackApply( fullName, {__proto__: null, stack: stack}, callback, [result]); } }).catch(function(error) { if (callback) { var message = exceptionHandler.safeErrorToString(error, true); runCallbackWithLastError(fullName, message, stack, callback); } }).then(function() { keepAlive.close(); }); }); }; exports.$set('forEach', forEach); exports.$set('lookup', lookup); exports.$set('defineProperty', defineProperty); exports.$set('expose', expose); exports.$set('deepCopy', deepCopy); exports.$set('handleRequestWithPromiseDoNotUse', handleRequestWithPromiseDoNotUse); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements helper objects for the dialog, newwindow, and // permissionrequest events. var logging = requireNative('logging'); var MessagingNatives = requireNative('messaging_natives'); var WebViewConstants = require('webViewConstants').WebViewConstants; var WebViewInternal = getInternalApi ? getInternalApi('webViewInternal') : require('webViewInternal').WebViewInternal; var PERMISSION_TYPES = ['media', 'geolocation', 'pointerLock', 'download', 'loadplugin', 'filesystem', 'fullscreen']; // The browser will kill us if we send it a bad instance ID. // TODO(780728): Remove once the cause of the bad ID is known. function CrashIfInvalidInstanceId(instanceId, culpritFunction) { logging.CHECK( instanceId > 0, 'WebView: Invalid instance ID (' + instanceId + ') from ' + culpritFunction); } // ----------------------------------------------------------------------------- // WebViewActionRequest object. // Default partial implementation of a webview action request. function WebViewActionRequest(webViewImpl, event, webViewEvent, interfaceName) { this.webViewImpl = webViewImpl; this.event = event; this.webViewEvent = webViewEvent; this.interfaceName = interfaceName; this.guestInstanceId = this.webViewImpl.guest.getId(); this.requestId = event.requestId; this.actionTaken = false; // Add on the request information specific to the request type. for (var infoName in this.event.requestInfo) { this.event[infoName] = this.event.requestInfo[infoName]; this.webViewEvent[infoName] = this.event.requestInfo[infoName]; } } // Prevent GuestViewEvents inadvertently inheritng code from the global Object, // allowing a pathway for unintended execution of user code. // TODO(wjmaclean): Track down other issues of Object inheritance. // https://crbug.com/701034 WebViewActionRequest.prototype.__proto__ = null; // Performs the default action for the request. WebViewActionRequest.prototype.defaultAction = function() { // Do nothing if the action has already been taken or the requester is // already gone (in which case its guestInstanceId will be stale). if (this.actionTaken || this.guestInstanceId != this.webViewImpl.guest.getId()) { return; } this.actionTaken = true; CrashIfInvalidInstanceId( this.guestInstanceId, 'WebViewActionRequest.defaultAction'); WebViewInternal.setPermission(this.guestInstanceId, this.requestId, 'default', '', $Function.bind(function(allowed) { if (allowed) { return; } this.showWarningMessage(); }, this)); }; // Called to handle the action request's event. WebViewActionRequest.prototype.handleActionRequestEvent = function() { // Construct the interface object and attach it to |webViewEvent|. var request = this.getInterfaceObject(); this.webViewEvent[this.interfaceName] = request; var defaultPrevented = !this.webViewImpl.dispatchEvent(this.webViewEvent); // Set |webViewEvent| to null to break the circular reference to |request| so // that the garbage collector can eventually collect it. this.webViewEvent = null; if (this.actionTaken) { return; } if (defaultPrevented) { // Track the lifetime of |request| with the garbage collector. var portId = -1; // (hack) there is no Extension Port to release MessagingNatives.BindToGC( request, $Function.bind(this.defaultAction, this), portId); } else { this.defaultAction(); } }; // Displays a warning message when an action request is blocked by default. WebViewActionRequest.prototype.showWarningMessage = function() { window.console.warn(this.WARNING_MSG_REQUEST_BLOCKED); }; // This function ensures that each action is taken at most once. WebViewActionRequest.prototype.validateCall = function() { if (this.actionTaken) { throw new Error(this.ERROR_MSG_ACTION_ALREADY_TAKEN); } this.actionTaken = true; }; // The following are implemented by the specific action request. // Returns the interface object for this action request. WebViewActionRequest.prototype.getInterfaceObject = undefined; // Error/warning messages. WebViewActionRequest.prototype.ERROR_MSG_ACTION_ALREADY_TAKEN = undefined; WebViewActionRequest.prototype.WARNING_MSG_REQUEST_BLOCKED = undefined; // ----------------------------------------------------------------------------- // Dialog object. // Represents a dialog box request (e.g. alert()). function Dialog(webViewImpl, event, webViewEvent) { $Function.call( WebViewActionRequest, this, webViewImpl, event, webViewEvent, 'dialog'); this.handleActionRequestEvent(); } Dialog.prototype.__proto__ = WebViewActionRequest.prototype; Dialog.prototype.getInterfaceObject = function() { return { ok: $Function.bind(function(user_input) { this.validateCall(); user_input = user_input || ''; CrashIfInvalidInstanceId(this.guestInstanceId, 'Dialog ok'); WebViewInternal.setPermission( this.guestInstanceId, this.requestId, 'allow', user_input); }, this), cancel: $Function.bind(function() { this.validateCall(); CrashIfInvalidInstanceId(this.guestInstanceId, 'Dialog cancel'); WebViewInternal.setPermission( this.guestInstanceId, this.requestId, 'deny'); }, this) }; }; Dialog.prototype.showWarningMessage = function() { var VOWELS = ['a', 'e', 'i', 'o', 'u']; var dialogType = this.event.messageType; var article = ($Array.indexOf(VOWELS, dialogType.charAt(0)) >= 0) ? 'An' : 'A'; this.WARNING_MSG_REQUEST_BLOCKED = $String.replace( $String.replace(this.WARNING_MSG_REQUEST_BLOCKED, '%1', article), '%2', dialogType); window.console.warn(this.WARNING_MSG_REQUEST_BLOCKED); }; Dialog.prototype.ERROR_MSG_ACTION_ALREADY_TAKEN = WebViewConstants.ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN; Dialog.prototype.WARNING_MSG_REQUEST_BLOCKED = WebViewConstants.WARNING_MSG_DIALOG_REQUEST_BLOCKED; // ----------------------------------------------------------------------------- // NewWindow object. // Represents a new window request. function NewWindow(webViewImpl, event, webViewEvent) { $Function.call( WebViewActionRequest, this, webViewImpl, event, webViewEvent, 'window'); this.handleActionRequestEvent(); } NewWindow.prototype.__proto__ = WebViewActionRequest.prototype; NewWindow.prototype.getInterfaceObject = function() { return { attach: $Function.bind(function(webview) { this.validateCall(); if (!webview || !webview.tagName || webview.tagName != 'WEBVIEW') { throw new Error(ERROR_MSG_WEBVIEW_EXPECTED); } var webViewImpl = privates(webview).internal; // Update the partition. if (this.event.partition) { webViewImpl.onAttach(this.event.partition); } var attached = webViewImpl.attachWindow$(this.event.windowId); if (!attached) { window.console.error(ERROR_MSG_NEWWINDOW_UNABLE_TO_ATTACH); } if (this.guestInstanceId != this.webViewImpl.guest.getId()) { // If the opener is already gone, then its guestInstanceId will be // stale. return; } // If the object being passed into attach is not a valid // then we will fail and it will be treated as if the new window // was rejected. The permission API plumbing is used here to clean // up the state created for the new window if attaching fails. CrashIfInvalidInstanceId(this.guestInstanceId, 'NewWindow attach'); WebViewInternal.setPermission(this.guestInstanceId, this.requestId, attached ? 'allow' : 'deny'); }, this), discard: $Function.bind(function() { this.validateCall(); if (!this.guestInstanceId) { // If the opener is already gone, then we won't have its // guestInstanceId. return; } CrashIfInvalidInstanceId(this.guestInstanceId, 'NewWindow discard'); WebViewInternal.setPermission( this.guestInstanceId, this.requestId, 'deny'); }, this) }; }; NewWindow.prototype.ERROR_MSG_ACTION_ALREADY_TAKEN = WebViewConstants.ERROR_MSG_NEWWINDOW_ACTION_ALREADY_TAKEN; NewWindow.prototype.WARNING_MSG_REQUEST_BLOCKED = WebViewConstants.WARNING_MSG_NEWWINDOW_REQUEST_BLOCKED; // ----------------------------------------------------------------------------- // PermissionRequest object. // Represents a permission request (e.g. to access the filesystem). function PermissionRequest(webViewImpl, event, webViewEvent) { $Function.call( WebViewActionRequest, this, webViewImpl, event, webViewEvent, 'request'); if (!this.validPermissionCheck()) { return; } this.handleActionRequestEvent(); } PermissionRequest.prototype.__proto__ = WebViewActionRequest.prototype; PermissionRequest.prototype.allow = function() { this.validateCall(); CrashIfInvalidInstanceId(this.guestInstanceId, 'PermissionRequest.allow'); WebViewInternal.setPermission(this.guestInstanceId, this.requestId, 'allow'); }; PermissionRequest.prototype.deny = function() { this.validateCall(); CrashIfInvalidInstanceId(this.guestInstanceId, 'PermissionRequest.deny'); WebViewInternal.setPermission(this.guestInstanceId, this.requestId, 'deny'); }; PermissionRequest.prototype.getInterfaceObject = function() { var request = { allow: $Function.bind(this.allow, this), deny: $Function.bind(this.deny, this) }; // Add on the request information specific to the request type. for (var infoName in this.event.requestInfo) { request[infoName] = this.event.requestInfo[infoName]; } return $Object.freeze(request); }; PermissionRequest.prototype.showWarningMessage = function() { window.console.warn($String.replace( this.WARNING_MSG_REQUEST_BLOCKED, '%1', this.event.permission)); }; // Checks that the requested permission is valid. Returns true if valid. PermissionRequest.prototype.validPermissionCheck = function() { if ($Array.indexOf(PERMISSION_TYPES, this.event.permission) < 0) { // The permission type is not allowed. Trigger the default response. this.defaultAction(); return false; } return true; }; PermissionRequest.prototype.ERROR_MSG_ACTION_ALREADY_TAKEN = WebViewConstants.ERROR_MSG_PERMISSION_ACTION_ALREADY_TAKEN; PermissionRequest.prototype.WARNING_MSG_REQUEST_BLOCKED = WebViewConstants.WARNING_MSG_PERMISSION_REQUEST_BLOCKED; // ----------------------------------------------------------------------------- // FullscreenPermissionRequest object. // Represents a fullscreen permission request. function FullscreenPermissionRequest(webViewImpl, event, webViewEvent) { $Function.call(PermissionRequest, this, webViewImpl, event, webViewEvent); } FullscreenPermissionRequest.prototype.__proto__ = PermissionRequest.prototype; FullscreenPermissionRequest.prototype.allow = function() { $Function.call(PermissionRequest.prototype.allow, this); // Now make the element go fullscreen. this.webViewImpl.makeElementFullscreen(); }; // ----------------------------------------------------------------------------- var WebViewActionRequests = { WebViewActionRequest: WebViewActionRequest, Dialog: Dialog, NewWindow: NewWindow, PermissionRequest: PermissionRequest, FullscreenPermissionRequest: FullscreenPermissionRequest }; // Exports. exports.$set('WebViewActionRequests', WebViewActionRequests); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module contains the public-facing API functions for the tag. var WEB_VIEW_API_METHODS = [ // Add content scripts for the guest page. 'addContentScripts', // Navigates to the previous history entry. 'back', // Returns whether there is a previous history entry to navigate to. 'canGoBack', // Returns whether there is a subsequent history entry to navigate to. 'canGoForward', // Captures the visible region of the WebView contents into a bitmap. 'captureVisibleRegion', // Clears browsing data for the WebView partition. 'clearData', // Injects JavaScript code into the guest page. 'executeScript', // Initiates a find-in-page request. 'find', // Navigates to the subsequent history entry. 'forward', // Returns audio state. 'getAudioState', // Returns Chrome's internal process ID for the guest web page's current // process. 'getProcessId', // Returns the user agent string used by the webview for guest page requests. 'getUserAgent', // Gets the current zoom factor. 'getZoom', // Gets the current zoom mode of the webview. 'getZoomMode', // Navigates to a history entry using a history index relative to the current // navigation. 'go', // Injects CSS into the guest page. 'insertCSS', // Returns whether audio is muted. 'isAudioMuted', // Returns whether spatial navigation is enabled. 'isSpatialNavigationEnabled', // Indicates whether or not the webview's user agent string has been // overridden. 'isUserAgentOverridden', // Loads a data URL with a specified base URL used for relative links. // Optionally, a virtual URL can be provided to be shown to the user instead // of the data URL. 'loadDataWithBaseUrl', // Prints the contents of the webview. 'print', // Removes content scripts for the guest page. 'removeContentScripts', // Reloads the current top-level page. 'reload', // Set audio mute. 'setAudioMuted', // Set spatial navigation state. 'setSpatialNavigationEnabled', // Override the user agent string used by the webview for guest page requests. 'setUserAgentOverride', // Changes the zoom factor of the page. 'setZoom', // Changes the zoom mode of the webview. 'setZoomMode', // Stops loading the current navigation if one is in progress. 'stop', // Ends the current find session. 'stopFinding', // Forcibly kills the guest web page's renderer process. 'terminate' ]; // Exports. exports.$set('WEB_VIEW_API_METHODS', WEB_VIEW_API_METHODS); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements the attributes of the tag. var $Element = require('safeMethods').SafeMethods.$Element; var $MutationObserver = require('safeMethods').SafeMethods.$MutationObserver; var GuestViewAttributes = require('guestViewAttributes').GuestViewAttributes; var WebViewConstants = require('webViewConstants').WebViewConstants; var WebViewInternal = getInternalApi ? getInternalApi('webViewInternal') : require('webViewInternal').WebViewInternal; // ----------------------------------------------------------------------------- // AllowScalingAttribute object. // Attribute that specifies whether scaling is allowed in the webview. function AllowScalingAttribute(view) { $Function.call( GuestViewAttributes.BooleanAttribute, this, WebViewConstants.ATTRIBUTE_ALLOWSCALING, view); } AllowScalingAttribute.prototype.__proto__ = GuestViewAttributes.BooleanAttribute.prototype; AllowScalingAttribute.prototype.handleMutation = function(oldValue, newValue) { if (!this.view.guest.getId()) return; WebViewInternal.setAllowScaling(this.view.guest.getId(), this.getValue()); }; // ----------------------------------------------------------------------------- // AllowTransparencyAttribute object. // Attribute that specifies whether transparency is allowed in the webview. function AllowTransparencyAttribute(view) { $Function.call( GuestViewAttributes.BooleanAttribute, this, WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY, view); } AllowTransparencyAttribute.prototype.__proto__ = GuestViewAttributes.BooleanAttribute.prototype; AllowTransparencyAttribute.prototype.handleMutation = function(oldValue, newValue) { if (!this.view.guest.getId()) return; WebViewInternal.setAllowTransparency(this.view.guest.getId(), this.getValue()); }; // ----------------------------------------------------------------------------- // AutosizeDimensionAttribute object. // Attribute used to define the demension limits of autosizing. function AutosizeDimensionAttribute(name, view) { $Function.call(GuestViewAttributes.IntegerAttribute, this, name, view); } AutosizeDimensionAttribute.prototype.__proto__ = GuestViewAttributes.IntegerAttribute.prototype; AutosizeDimensionAttribute.prototype.handleMutation = function( oldValue, newValue) { if (!this.view.guest.getId()) return; this.view.guest.setSize({ 'enableAutoSize': this.view.attributes[ WebViewConstants.ATTRIBUTE_AUTOSIZE].getValue(), 'min': { 'width': this.view.attributes[ WebViewConstants.ATTRIBUTE_MINWIDTH].getValue(), 'height': this.view.attributes[ WebViewConstants.ATTRIBUTE_MINHEIGHT].getValue() }, 'max': { 'width': this.view.attributes[ WebViewConstants.ATTRIBUTE_MAXWIDTH].getValue(), 'height': this.view.attributes[ WebViewConstants.ATTRIBUTE_MAXHEIGHT].getValue() } }); return; }; // ----------------------------------------------------------------------------- // AutosizeAttribute object. // Attribute that specifies whether the webview should be autosized. function AutosizeAttribute(view) { $Function.call( GuestViewAttributes.BooleanAttribute, this, WebViewConstants.ATTRIBUTE_AUTOSIZE, view); } AutosizeAttribute.prototype.__proto__ = GuestViewAttributes.BooleanAttribute.prototype; AutosizeAttribute.prototype.handleMutation = AutosizeDimensionAttribute.prototype.handleMutation; // ----------------------------------------------------------------------------- // NameAttribute object. // Attribute that sets the guest content's window.name object. function NameAttribute(view) { $Function.call( GuestViewAttributes.Attribute, this, WebViewConstants.ATTRIBUTE_NAME, view); } NameAttribute.prototype.__proto__ = GuestViewAttributes.Attribute.prototype NameAttribute.prototype.handleMutation = function(oldValue, newValue) { oldValue = oldValue || ''; newValue = newValue || ''; if (oldValue === newValue || !this.view.guest.getId()) return; WebViewInternal.setName(this.view.guest.getId(), newValue); }; NameAttribute.prototype.setValue = function(value) { value = value || ''; if (value === '') $Element.removeAttribute(this.view.element, this.name); else $Element.setAttribute(this.view.element, this.name, value); }; // ----------------------------------------------------------------------------- // PartitionAttribute object. // Attribute representing the state of the storage partition. function PartitionAttribute(view) { $Function.call( GuestViewAttributes.Attribute, this, WebViewConstants.ATTRIBUTE_PARTITION, view); this.validPartitionId = true; } PartitionAttribute.prototype.__proto__ = GuestViewAttributes.Attribute.prototype; PartitionAttribute.prototype.handleMutation = function(oldValue, newValue) { newValue = newValue || ''; // The partition cannot change if the webview has already navigated. if (!this.view.attributes[ WebViewConstants.ATTRIBUTE_SRC].beforeFirstNavigation) { window.console.error(WebViewConstants.ERROR_MSG_ALREADY_NAVIGATED); this.setValueIgnoreMutation(oldValue); return; } if (newValue == 'persist:') { this.validPartitionId = false; window.console.error( WebViewConstants.ERROR_MSG_INVALID_PARTITION_ATTRIBUTE); } }; PartitionAttribute.prototype.detach = function() { this.validPartitionId = true; }; // ----------------------------------------------------------------------------- // SrcAttribute object. // Attribute that handles the location and navigation of the webview. function SrcAttribute(view) { $Function.call( GuestViewAttributes.Attribute, this, WebViewConstants.ATTRIBUTE_SRC, view); this.setupMutationObserver(); this.beforeFirstNavigation = true; } SrcAttribute.prototype.__proto__ = GuestViewAttributes.Attribute.prototype; SrcAttribute.prototype.setValueIgnoreMutation = function(value) { $Function.call( GuestViewAttributes.Attribute.prototype.setValueIgnoreMutation, this, value); // takeRecords() is needed to clear queued up src mutations. Without it, it is // possible for this change to get picked up asyncronously by src's mutation // observer |observer|, and then get handled even though we do not want to // handle this mutation. $MutationObserver.takeRecords(this.observer); }; SrcAttribute.prototype.handleMutation = function(oldValue, newValue) { // Once we have navigated, we don't allow clearing the src attribute. // Once enters a navigated state, it cannot return to a // placeholder state. if (!newValue && oldValue) { // src attribute changes normally initiate a navigation. We suppress // the next src attribute handler call to avoid reloading the page // on every guest-initiated navigation. this.setValueIgnoreMutation(oldValue); return; } this.parse(); }; SrcAttribute.prototype.attach = function() { this.parse(); }; SrcAttribute.prototype.detach = function() { this.beforeFirstNavigation = true; }; // The purpose of this mutation observer is to catch assignment to the src // attribute without any changes to its value. This is useful in the case // where the webview guest has crashed and navigating to the same address // spawns off a new process. SrcAttribute.prototype.setupMutationObserver = function() { this.observer = new $MutationObserver($Function.bind(function(mutations) { $Array.forEach(mutations, $Function.bind(function(mutation) { var oldValue = mutation.oldValue; var newValue = this.getValue(); if (oldValue != newValue) { return; } this.handleMutation(oldValue, newValue); }, this)); }, this)); var params = { attributes: true, attributeOldValue: true, attributeFilter: [this.name] }; $MutationObserver.observe(this.observer, this.view.element, params); }; SrcAttribute.prototype.parse = function() { if (!this.view.elementAttached || !this.view.attributes[ WebViewConstants.ATTRIBUTE_PARTITION].validPartitionId || !this.getValue()) { return; } if (!this.view.guest.getId()) { if (this.beforeFirstNavigation) { this.beforeFirstNavigation = false; this.view.createGuest(); } return; } WebViewInternal.navigate(this.view.guest.getId(), this.getValue()); }; var WebViewAttributes = { AllowScalingAttribute: AllowScalingAttribute, AllowTransparencyAttribute: AllowTransparencyAttribute, AutosizeDimensionAttribute: AutosizeDimensionAttribute, AutosizeAttribute: AutosizeAttribute, NameAttribute: NameAttribute, PartitionAttribute: PartitionAttribute, SrcAttribute: SrcAttribute }; // Exports. exports.$set('WebViewAttributes', WebViewAttributes); // Copyright (c) 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module contains constants used in webview. // Container for the webview constants. var WebViewConstants = { // Attributes. ATTRIBUTE_ALLOWTRANSPARENCY: 'allowtransparency', ATTRIBUTE_ALLOWSCALING: 'allowscaling', ATTRIBUTE_AUTOSIZE: 'autosize', ATTRIBUTE_MAXHEIGHT: 'maxheight', ATTRIBUTE_MAXWIDTH: 'maxwidth', ATTRIBUTE_MINHEIGHT: 'minheight', ATTRIBUTE_MINWIDTH: 'minwidth', ATTRIBUTE_NAME: 'name', ATTRIBUTE_PARTITION: 'partition', ATTRIBUTE_SRC: 'src', // Error/warning messages. ERROR_MSG_ALREADY_NAVIGATED: ': ' + 'The object has already navigated, so its partition cannot be changed.', ERROR_MSG_CANNOT_INJECT_SCRIPT: ': ' + 'Script cannot be injected into content until the page has loaded.', ERROR_MSG_DIALOG_ACTION_ALREADY_TAKEN: ': ' + 'An action has already been taken for this "dialog" event.', ERROR_MSG_NEWWINDOW_ACTION_ALREADY_TAKEN: ': ' + 'An action has already been taken for this "newwindow" event.', ERROR_MSG_PERMISSION_ACTION_ALREADY_TAKEN: ': ' + 'Permission has already been decided for this "permissionrequest" event.', ERROR_MSG_INVALID_PARTITION_ATTRIBUTE: ': ' + 'Invalid partition attribute.', WARNING_MSG_DIALOG_REQUEST_BLOCKED: ': %1 %2 dialog was blocked.', WARNING_MSG_NEWWINDOW_REQUEST_BLOCKED: ': A new window was blocked.', WARNING_MSG_PERMISSION_REQUEST_BLOCKED: ': ' + 'The permission request for "%1" has been denied.' }; var WebViewAttributeNames = [ WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY, WebViewConstants.ATTRIBUTE_ALLOWSCALING, WebViewConstants.ATTRIBUTE_AUTOSIZE, WebViewConstants.ATTRIBUTE_MAXHEIGHT, WebViewConstants.ATTRIBUTE_MAXWIDTH, WebViewConstants.ATTRIBUTE_MINHEIGHT, WebViewConstants.ATTRIBUTE_MINWIDTH, WebViewConstants.ATTRIBUTE_NAME, WebViewConstants.ATTRIBUTE_PARTITION, WebViewConstants.ATTRIBUTE_SRC ]; exports.$set('WebViewConstants', $Object.freeze(WebViewConstants)); exports.$set('WebViewAttributeNames', $Object.freeze(WebViewAttributeNames)); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Event management for WebView. var $Document = require('safeMethods').SafeMethods.$Document; var CreateEvent = require('guestViewEvents').CreateEvent; var DCHECK = requireNative('logging').DCHECK; var DeclarativeWebRequestSchema = requireNative('schema_registry').GetSchema('declarativeWebRequest'); var GuestViewEvents = require('guestViewEvents').GuestViewEvents; var GuestViewInternalNatives = requireNative('guest_view_internal'); var IdGenerator = requireNative('id_generator'); var WebRequestEvent = require('webRequestEvent').WebRequestEvent; var WebRequestSchema = requireNative('schema_registry').GetSchema('webRequest'); var WebViewActionRequests = require('webViewActionRequests').WebViewActionRequests; var WebRequestMessageEvent = CreateEvent('webViewInternal.onMessage'); function WebViewEvents(webViewImpl) { $Function.call(GuestViewEvents, this, webViewImpl); this.setupWebRequestEvents(); } var jsEvent; function createCustomDeclarativeEvent(name, schema, options, webviewId) { if (bindingUtil) { return bindingUtil.createCustomDeclarativeEvent( name, options.actions, options.conditions, webviewId || 0); } if (!jsEvent) jsEvent = require('event_bindings').Event; return new jsEvent(name, schema, options, webviewId); } function createCustomEvent(name, schema, options) { var supportsLazyListeners = false; if (bindingUtil) { return bindingUtil.createCustomEvent(name, undefined, false, supportsLazyListeners); } if (!jsEvent) jsEvent = require('event_bindings').Event; if (!options) options = {__proto__: null, supportsLazyListeners: false}; DCHECK(!options.supportsLazyListeners); return new jsEvent(name, schema, options); } function createOnMessageEvent(name, schema, options, webviewId) { var subEventName = name + '/' + IdGenerator.GetNextId(); var newEvent = createCustomEvent(subEventName, schema, options); var view = GuestViewInternalNatives.GetViewFromID(webviewId || 0); if (view) { view.events.addScopedListener( WebRequestMessageEvent, $Function.bind(function() { // Re-dispatch to subEvent's listeners. $Function.apply(newEvent.dispatch, newEvent, $Array.slice(arguments)); }, newEvent), {instanceId: webviewId || 0}); } return newEvent; } WebViewEvents.prototype.__proto__ = GuestViewEvents.prototype; // A dictionary of extension events to be listened for. This // dictionary augments |GuestViewEvents.EVENTS| in guest_view_events.js. See the // documentation there for details. WebViewEvents.EVENTS = { 'audiostatechanged': { evt: CreateEvent('webViewInternal.onAudioStateChanged'), fields: ['audible'] }, 'close': { evt: CreateEvent('webViewInternal.onClose') }, 'consolemessage': { evt: CreateEvent('webViewInternal.onConsoleMessage'), fields: ['level', 'message', 'line', 'sourceId'] }, 'contentload': { evt: CreateEvent('webViewInternal.onContentLoad') }, 'dialog': { cancelable: true, evt: CreateEvent('webViewInternal.onDialog'), fields: ['defaultPromptText', 'messageText', 'messageType', 'url'], handler: 'handleDialogEvent' }, 'droplink': { evt: CreateEvent('webViewInternal.onDropLink'), fields: ['url'] }, 'exit': { evt: CreateEvent('webViewInternal.onExit'), fields: ['processId', 'reason'] }, 'exitfullscreen': { evt: CreateEvent('webViewInternal.onExitFullscreen'), fields: ['url'], handler: 'handleFullscreenExitEvent', internal: true }, 'findupdate': { evt: CreateEvent('webViewInternal.onFindReply'), fields: [ 'searchText', 'numberOfMatches', 'activeMatchOrdinal', 'selectionRect', 'canceled', 'finalUpdate' ] }, 'framenamechanged': { evt: CreateEvent('webViewInternal.onFrameNameChanged'), handler: 'handleFrameNameChangedEvent', internal: true }, 'loadabort': { cancelable: true, evt: CreateEvent('webViewInternal.onLoadAbort'), fields: ['url', 'isTopLevel', 'code', 'reason'], handler: 'handleLoadAbortEvent' }, 'loadcommit': { evt: CreateEvent('webViewInternal.onLoadCommit'), fields: ['url', 'isTopLevel'], handler: 'handleLoadCommitEvent' }, 'loadprogress': { evt: CreateEvent('webViewInternal.onLoadProgress'), fields: ['url', 'progress'] }, 'loadredirect': { evt: CreateEvent('webViewInternal.onLoadRedirect'), fields: ['isTopLevel', 'oldUrl', 'newUrl'] }, 'loadstart': { evt: CreateEvent('webViewInternal.onLoadStart'), fields: ['url', 'isTopLevel'] }, 'loadstop': { evt: CreateEvent('webViewInternal.onLoadStop') }, 'newwindow': { cancelable: true, evt: CreateEvent('webViewInternal.onNewWindow'), fields: [ 'initialHeight', 'initialWidth', 'targetUrl', 'windowOpenDisposition', 'name' ], handler: 'handleNewWindowEvent' }, 'permissionrequest': { cancelable: true, evt: CreateEvent('webViewInternal.onPermissionRequest'), fields: [ 'identifier', 'lastUnlockedBySelf', 'name', 'permission', 'requestMethod', 'url', 'userGesture' ], handler: 'handlePermissionEvent' }, 'responsive': { evt: CreateEvent('webViewInternal.onResponsive'), fields: ['processId'] }, 'sizechanged': { evt: CreateEvent('webViewInternal.onSizeChanged'), fields: ['oldHeight', 'oldWidth', 'newHeight', 'newWidth'], handler: 'handleSizeChangedEvent' }, 'unresponsive': { evt: CreateEvent('webViewInternal.onUnresponsive'), fields: ['processId'] }, 'zoomchange': { evt: CreateEvent('webViewInternal.onZoomChange'), fields: ['oldZoomFactor', 'newZoomFactor'] } }; WebViewEvents.EVENTS.__proto__ = null; for (var eventName in WebViewEvents.EVENTS) { WebViewEvents.EVENTS[eventName].__proto__ = null; } WebViewEvents.prototype.setupWebRequestEvents = function() { var request = {}; var createWebRequestEvent = $Function.bind(function(webRequestEvent) { return this.weakWrapper(function() { if (!this[webRequestEvent.name]) { this[webRequestEvent.name] = new WebRequestEvent( 'webViewInternal.' + webRequestEvent.name, webRequestEvent.parameters, webRequestEvent.extraParameters, webRequestEvent.options, this.view.viewInstanceId); } return this[webRequestEvent.name]; }); }, this); var createDeclarativeWebRequestEvent = $Function.bind(function(webRequestEvent) { return this.weakWrapper(function() { if (!this[webRequestEvent.name]) { var newEvent; var eventName = 'webViewInternal.declarativeWebRequest.' + webRequestEvent.name; if (webRequestEvent.name === 'onMessage') { // The onMessage event gets a special event type because we want the // listener to fire only for messages targeted for this particular // . newEvent = createOnMessageEvent(eventName, webRequestEvent.parameters, webRequestEvent.options, this.view.viewInstanceId); } else { newEvent = createCustomDeclarativeEvent(eventName, webRequestEvent.parameters, webRequestEvent.options, this.view.viewInstanceId); } this[webRequestEvent.name] = newEvent; } return this[webRequestEvent.name]; }); }, this); for (var i = 0; i < DeclarativeWebRequestSchema.events.length; ++i) { var eventSchema = DeclarativeWebRequestSchema.events[i]; var webRequestEvent = createDeclarativeWebRequestEvent(eventSchema); $Object.defineProperty( request, eventSchema.name, {get: webRequestEvent, enumerable: true}); } // Populate the WebRequest events from the API definition. for (var i = 0; i < WebRequestSchema.events.length; ++i) { var eventSchema = WebRequestSchema.events[i]; // Skip "onActionIgnored" which is not relevant for webviews. if (eventSchema.name === 'onActionIgnored') continue; var webRequestEvent = createWebRequestEvent(eventSchema); $Object.defineProperty( request, eventSchema.name, {get: webRequestEvent, enumerable: true}); } this.view.setRequestPropertyOnWebViewElement(request); }; WebViewEvents.prototype.getEvents = function() { return WebViewEvents.EVENTS; }; WebViewEvents.prototype.handleDialogEvent = function(event, eventName) { var webViewEvent = this.makeDomEvent(event, eventName); new WebViewActionRequests.Dialog(this.view, event, webViewEvent); }; WebViewEvents.prototype.handleFrameNameChangedEvent = function(event) { this.view.onFrameNameChanged(event.name); }; WebViewEvents.prototype.handleFullscreenExitEvent = function(event, eventName) { $Document.webkitCancelFullScreen(document); }; WebViewEvents.prototype.handleLoadAbortEvent = function(event, eventName) { var showWarningMessage = function(code, reason) { var WARNING_MSG_LOAD_ABORTED = ': ' + 'The load has aborted with error %1: %2.'; window.console.warn($String.replace( $String.replace(WARNING_MSG_LOAD_ABORTED, '%1', code), '%2', reason)); }; var webViewEvent = this.makeDomEvent(event, eventName); if (this.view.dispatchEvent(webViewEvent)) { showWarningMessage(event.code, event.reason); } }; WebViewEvents.prototype.handleLoadCommitEvent = function(event, eventName) { this.view.onLoadCommit(event.baseUrlForDataUrl, event.currentEntryIndex, event.entryCount, event.processId, event.url, event.isTopLevel); var webViewEvent = this.makeDomEvent(event, eventName); this.view.dispatchEvent(webViewEvent); }; WebViewEvents.prototype.handleNewWindowEvent = function(event, eventName) { var webViewEvent = this.makeDomEvent(event, eventName); new WebViewActionRequests.NewWindow(this.view, event, webViewEvent); }; WebViewEvents.prototype.handlePermissionEvent = function(event, eventName) { var webViewEvent = this.makeDomEvent(event, eventName); if (event.permission === 'fullscreen') { new WebViewActionRequests.FullscreenPermissionRequest( this.view, event, webViewEvent); } else { new WebViewActionRequests.PermissionRequest(this.view, event, webViewEvent); } }; WebViewEvents.prototype.handleSizeChangedEvent = function(event, eventName) { var webViewEvent = this.makeDomEvent(event, eventName); this.view.onSizeChanged(webViewEvent); }; // Exports. exports.$set('WebViewEvents', WebViewEvents); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. if (!apiBridge) { exports.$set( 'WebViewInternal', require('binding').Binding.create('webViewInternal').generate()); } // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements WebView () as a custom element that wraps a // BrowserPlugin object element. The object element is hidden within // the shadow DOM of the WebView element. var $Element = require('safeMethods').SafeMethods.$Element; var GuestView = require('guestView').GuestView; var GuestViewContainer = require('guestViewContainer').GuestViewContainer; var GuestViewInternalNatives = requireNative('guest_view_internal'); var WebViewConstants = require('webViewConstants').WebViewConstants; var WebViewAttributes = require('webViewAttributes').WebViewAttributes; var WebViewEvents = require('webViewEvents').WebViewEvents; var WebViewInternal = getInternalApi ? getInternalApi('webViewInternal') : require('webViewInternal').WebViewInternal; // Represents the internal state of . function WebViewImpl(webviewElement) { $Function.call(GuestViewContainer, this, webviewElement, 'webview'); this.pendingZoomFactor_ = null; this.userAgentOverride = null; this.setupElementProperties(); new WebViewEvents(this, this.viewInstanceId); } WebViewImpl.prototype.__proto__ = GuestViewContainer.prototype; // Sets up all of the webview attributes. WebViewImpl.prototype.setupAttributes = function() { this.attributes[WebViewConstants.ATTRIBUTE_ALLOWSCALING] = new WebViewAttributes.AllowScalingAttribute(this); this.attributes[WebViewConstants.ATTRIBUTE_ALLOWTRANSPARENCY] = new WebViewAttributes.AllowTransparencyAttribute(this); this.attributes[WebViewConstants.ATTRIBUTE_AUTOSIZE] = new WebViewAttributes.AutosizeAttribute(this); this.attributes[WebViewConstants.ATTRIBUTE_NAME] = new WebViewAttributes.NameAttribute(this); this.attributes[WebViewConstants.ATTRIBUTE_PARTITION] = new WebViewAttributes.PartitionAttribute(this); this.attributes[WebViewConstants.ATTRIBUTE_SRC] = new WebViewAttributes.SrcAttribute(this); var autosizeAttributes = [ WebViewConstants.ATTRIBUTE_MAXHEIGHT, WebViewConstants.ATTRIBUTE_MAXWIDTH, WebViewConstants.ATTRIBUTE_MINHEIGHT, WebViewConstants.ATTRIBUTE_MINWIDTH ]; for (var attribute of autosizeAttributes) { this.attributes[attribute] = new WebViewAttributes.AutosizeDimensionAttribute(attribute, this); } }; // Initiates navigation once the element is attached to the DOM. WebViewImpl.prototype.onElementAttached = function() { // Mark all attributes as dirty on attachment. for (var i in this.attributes) { this.attributes[i].dirty = true; } for (var i in this.attributes) { this.attributes[i].attach(); } }; // Resets some state upon detaching element from the DOM. WebViewImpl.prototype.onElementDetached = function() { this.guest.destroy(); for (var i in this.attributes) { this.attributes[i].dirty = false; } for (var i in this.attributes) { this.attributes[i].detach(); } }; // Sets the .request property. WebViewImpl.prototype.setRequestPropertyOnWebViewElement = function(request) { $Object.defineProperty( this.element, 'request', {value: request, enumerable: true}); }; WebViewImpl.prototype.setupElementProperties = function() { // We cannot use {writable: true} property descriptor because we want a // dynamic getter value. $Object.defineProperty(this.element, 'contentWindow', { get: $Function.bind( function() { return this.guest.getContentWindow(); }, this), // No setter. enumerable: true }); }; WebViewImpl.prototype.onSizeChanged = function(webViewEvent) { var newWidth = webViewEvent.newWidth; var newHeight = webViewEvent.newHeight; var element = this.element; var width = element.offsetWidth; var height = element.offsetHeight; // Check the current bounds to make sure we do not resize // outside of current constraints. var maxWidth = this.attributes[ WebViewConstants.ATTRIBUTE_MAXWIDTH].getValue() || width; var minWidth = this.attributes[ WebViewConstants.ATTRIBUTE_MINWIDTH].getValue() || width; var maxHeight = this.attributes[ WebViewConstants.ATTRIBUTE_MAXHEIGHT].getValue() || height; var minHeight = this.attributes[ WebViewConstants.ATTRIBUTE_MINHEIGHT].getValue() || height; minWidth = Math.min(minWidth, maxWidth); minHeight = Math.min(minHeight, maxHeight); if (!this.attributes[WebViewConstants.ATTRIBUTE_AUTOSIZE].getValue() || (newWidth >= minWidth && newWidth <= maxWidth && newHeight >= minHeight && newHeight <= maxHeight)) { element.style.width = newWidth + 'px'; element.style.height = newHeight + 'px'; // Only fire the DOM event if the size of the has actually // changed. this.dispatchEvent(webViewEvent); } }; WebViewImpl.prototype.createGuest = function() { this.guest.create(this.buildParams(), $Function.bind(function() { this.attachWindow$(); }, this)); }; WebViewImpl.prototype.onFrameNameChanged = function(name) { this.attributes[WebViewConstants.ATTRIBUTE_NAME].setValueIgnoreMutation(name); }; // Updates state upon loadcommit. WebViewImpl.prototype.onLoadCommit = function( baseUrlForDataUrl, currentEntryIndex, entryCount, processId, url, isTopLevel) { this.baseUrlForDataUrl = baseUrlForDataUrl; this.currentEntryIndex = currentEntryIndex; this.entryCount = entryCount; this.processId = processId; if (isTopLevel) { // Touching the src attribute triggers a navigation. To avoid // triggering a page reload on every guest-initiated navigation, // we do not handle this mutation. this.attributes[ WebViewConstants.ATTRIBUTE_SRC].setValueIgnoreMutation(url); } }; WebViewImpl.prototype.onAttach = function(storagePartitionId) { this.attributes[WebViewConstants.ATTRIBUTE_PARTITION].setValueIgnoreMutation( storagePartitionId); }; WebViewImpl.prototype.buildContainerParams = function() { var params = $Object.create(null); params.initialZoomFactor = this.pendingZoomFactor_; params.userAgentOverride = this.userAgentOverride; for (var i in this.attributes) { var value = this.attributes[i].getValueIfDirty(); if (value) params[i] = value; } return params; }; WebViewImpl.prototype.attachWindow$ = function(opt_guestInstanceId) { // If |opt_guestInstanceId| was provided, then a different existing guest is // being attached to this webview, and the current one will get destroyed. if (opt_guestInstanceId) { if (this.guest.getId() == opt_guestInstanceId) { return true; } this.guest.destroy(); this.guest = new GuestView('webview', opt_guestInstanceId); this.prepareForReattach$(); } return $Function.call(GuestViewContainer.prototype.attachWindow$, this); }; // Shared implementation of executeScript() and insertCSS(). WebViewImpl.prototype.executeCode = function(func, args) { if (!this.guest.getId()) { window.console.error(WebViewConstants.ERROR_MSG_CANNOT_INJECT_SCRIPT); return false; } var webviewSrc = this.attributes[WebViewConstants.ATTRIBUTE_SRC].getValue(); if (this.baseUrlForDataUrl) { webviewSrc = this.baseUrlForDataUrl; } args = $Array.concat([this.guest.getId(), webviewSrc], $Array.slice(args)); $Function.apply(func, null, args); return true; }; WebViewImpl.prototype.setUserAgentOverride = function(userAgentOverride) { this.userAgentOverride = userAgentOverride; if (!this.guest.getId()) { // If we are not attached yet, then we will pick up the user agent on // attachment. return false; } WebViewInternal.overrideUserAgent(this.guest.getId(), userAgentOverride); return true; }; WebViewImpl.prototype.loadDataWithBaseUrl = function( dataUrl, baseUrl, virtualUrl) { if (!this.guest.getId()) { return; } WebViewInternal.loadDataWithBaseUrl( this.guest.getId(), dataUrl, baseUrl, virtualUrl, function() { // Report any errors. if (chrome.runtime.lastError != undefined) { window.console.error( 'Error while running webview.loadDataWithBaseUrl: ' + chrome.runtime.lastError.message); } }); }; WebViewImpl.prototype.setZoom = function(zoomFactor, callback) { if (!this.guest.getId()) { this.pendingZoomFactor_ = zoomFactor; return false; } this.pendingZoomFactor_ = null; WebViewInternal.setZoom(this.guest.getId(), zoomFactor, callback); return true; }; // Requests the element wihtin the embedder to enter fullscreen. WebViewImpl.prototype.makeElementFullscreen = function() { GuestViewInternalNatives.RunWithGesture($Function.bind(function() { $Element.webkitRequestFullScreen(this.element); }, this)); }; // Exports. exports.$set('WebViewImpl', WebViewImpl); // Copyright 2018 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // The custom element. This serves as a base implementation used // to define at the extensions layer and may be extended by an // embedder that wants to define its own . var forwardApiMethods = require('guestViewContainerElement').forwardApiMethods; var GuestViewContainerElement = require('guestViewContainerElement').GuestViewContainerElement; var WebViewImpl = require('webView').WebViewImpl; var WEB_VIEW_API_METHODS = require('webViewApiMethods').WEB_VIEW_API_METHODS; var WebViewInternal = getInternalApi ? getInternalApi('webViewInternal') : require('webViewInternal').WebViewInternal; class WebViewElement extends GuestViewContainerElement {} WebViewElement.prototype.addContentScripts = function(rules) { var internal = privates(this).internal; return WebViewInternal.addContentScripts(internal.viewInstanceId, rules); }; WebViewElement.prototype.removeContentScripts = function(names) { var internal = privates(this).internal; return WebViewInternal.removeContentScripts(internal.viewInstanceId, names); }; WebViewElement.prototype.insertCSS = function(var_args) { var internal = privates(this).internal; return internal.executeCode( WebViewInternal.insertCSS, $Array.slice(arguments)); }; WebViewElement.prototype.executeScript = function(var_args) { var internal = privates(this).internal; return internal.executeCode( WebViewInternal.executeScript, $Array.slice(arguments)); }; WebViewElement.prototype.print = function() { var internal = privates(this).internal; return internal.executeCode( WebViewInternal.executeScript, [{code: 'window.print();'}]); }; WebViewElement.prototype.back = function(callback) { return $Function.call(originalGo, this, -1, callback); }; WebViewElement.prototype.canGoBack = function() { var internal = privates(this).internal; return internal.entryCount > 1 && internal.currentEntryIndex > 0; }; WebViewElement.prototype.canGoForward = function() { var internal = privates(this).internal; return internal.currentEntryIndex >= 0 && internal.currentEntryIndex < (internal.entryCount - 1); }; WebViewElement.prototype.forward = function(callback) { return $Function.call(originalGo, this, 1, callback); }; WebViewElement.prototype.getProcessId = function() { var internal = privates(this).internal; return internal.processId; }; WebViewElement.prototype.getUserAgent = function() { var internal = privates(this).internal; return internal.userAgentOverride || navigator.userAgent; }; WebViewElement.prototype.isUserAgentOverridden = function() { var internal = privates(this).internal; return !!internal.userAgentOverride && internal.userAgentOverride != navigator.userAgent; }; // Forward remaining WebViewElement.foo* method calls to WebViewImpl.foo* or // WebViewInternal.foo*. forwardApiMethods( WebViewElement, WebViewImpl, WebViewInternal, WEB_VIEW_API_METHODS); // Since |back| and |forward| are implemented in terms of |go|, we need to // keep a reference to the real |go| function, since user code may override // |WebViewElement.prototype.go|. var originalGo = WebViewElement.prototype.go; // Exports. exports.$set('WebViewElement', WebViewElement); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the chrome.app.runtime API. var binding = apiBridge || require('binding').Binding.create('app.runtime'); var AppViewGuestInternal; // appViewGuestInternal isn't available in lock screen contexts. if (requireNative('v8_context').GetAvailability('appViewGuestInternal'). is_available) { AppViewGuestInternal = getInternalApi ? getInternalApi('appViewGuestInternal') : require('binding').Binding.create('appViewGuestInternal').generate(); } var registerArgumentMassager = bindingUtil ? $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) : require('event_bindings').registerArgumentMassager; var fileSystemHelpers = requireNative('file_system_natives'); var GetIsolatedFileSystem = fileSystemHelpers.GetIsolatedFileSystem; var entryIdManager = require('entryIdManager'); if (AppViewGuestInternal) { registerArgumentMassager('app.runtime.onEmbedRequested', function(args, dispatch) { var appEmbeddingRequest = args[0]; var id = appEmbeddingRequest.guestInstanceId; delete appEmbeddingRequest.guestInstanceId; appEmbeddingRequest.allow = function(url) { AppViewGuestInternal.attachFrame(url, id); }; appEmbeddingRequest.deny = function() { AppViewGuestInternal.denyRequest(id); }; dispatch([appEmbeddingRequest]); }); } registerArgumentMassager('app.runtime.onLaunched', function(args, dispatch) { var launchData = args[0]; if (launchData.items) { // An onLaunched corresponding to file_handlers in the app's manifest. var items = []; var numItems = launchData.items.length; var itemLoaded = function(err, item) { if (err) { console.error('Error getting fileEntry, code: ' + err.code); } else { $Array.push(items, item); } if (--numItems === 0) { var data = { isDemoSession: launchData.isDemoSession, isKioskSession: launchData.isKioskSession, isPublicSession: launchData.isPublicSession, source: launchData.source, actionData: launchData.actionData }; if (items.length !== 0) { data.id = launchData.id; data.items = items; } dispatch([data]); } }; $Array.forEach(launchData.items, function(item) { var fs = GetIsolatedFileSystem(item.fileSystemId); if (item.isDirectory) { fs.root.getDirectory(item.baseName, {}, function(dirEntry) { entryIdManager.registerEntry(item.entryId, dirEntry); itemLoaded(null, {entry: dirEntry}); }, function(fileError) { itemLoaded(fileError); }); } else { fs.root.getFile(item.baseName, {}, function(fileEntry) { entryIdManager.registerEntry(item.entryId, fileEntry); itemLoaded(null, {entry: fileEntry, type: item.mimeType}); }, function(fileError) { itemLoaded(fileError); }); } }); } else { // Default case. This currently covers an onLaunched corresponding to // url_handlers in the app's manifest. dispatch([launchData]); } }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the app_window API. var appWindowNatives = requireNative('app_window_natives'); var runtimeNatives = requireNative('runtime'); var forEach = require('utils').forEach; var renderFrameObserverNatives = requireNative('renderFrameObserverNatives'); var appWindowData = null; var currentAppWindow = null; var currentWindowInternal = null; var kSetBoundsFunction = 'setBounds'; var kSetSizeConstraintsFunction = 'setSizeConstraints'; if (!apiBridge) var binding = require('binding').Binding; var jsEvent; function createAnonymousEvent() { if (bindingUtil) { var supportsFilters = false; var supportsLazyListeners = false; // Native custom events ignore schema. return bindingUtil.createCustomEvent(undefined, undefined, supportsFilters, supportsLazyListeners); } if (!jsEvent) jsEvent = require('event_bindings').Event; return new jsEvent(); } // Bounds class definition. var Bounds = function(boundsKey) { privates(this).boundsKey_ = boundsKey; }; Object.defineProperty(Bounds.prototype, 'left', { get: function() { return appWindowData[privates(this).boundsKey_].left; }, set: function(left) { this.setPosition(left, null); }, enumerable: true }); Object.defineProperty(Bounds.prototype, 'top', { get: function() { return appWindowData[privates(this).boundsKey_].top; }, set: function(top) { this.setPosition(null, top); }, enumerable: true }); Object.defineProperty(Bounds.prototype, 'width', { get: function() { return appWindowData[privates(this).boundsKey_].width; }, set: function(width) { this.setSize(width, null); }, enumerable: true }); Object.defineProperty(Bounds.prototype, 'height', { get: function() { return appWindowData[privates(this).boundsKey_].height; }, set: function(height) { this.setSize(null, height); }, enumerable: true }); Object.defineProperty(Bounds.prototype, 'minWidth', { get: function() { return appWindowData[privates(this).boundsKey_].minWidth; }, set: function(minWidth) { updateSizeConstraints(privates(this).boundsKey_, { minWidth: minWidth }); }, enumerable: true }); Object.defineProperty(Bounds.prototype, 'maxWidth', { get: function() { return appWindowData[privates(this).boundsKey_].maxWidth; }, set: function(maxWidth) { updateSizeConstraints(privates(this).boundsKey_, { maxWidth: maxWidth }); }, enumerable: true }); Object.defineProperty(Bounds.prototype, 'minHeight', { get: function() { return appWindowData[privates(this).boundsKey_].minHeight; }, set: function(minHeight) { updateSizeConstraints(privates(this).boundsKey_, { minHeight: minHeight }); }, enumerable: true }); Object.defineProperty(Bounds.prototype, 'maxHeight', { get: function() { return appWindowData[privates(this).boundsKey_].maxHeight; }, set: function(maxHeight) { updateSizeConstraints(privates(this).boundsKey_, { maxHeight: maxHeight }); }, enumerable: true }); Bounds.prototype.setPosition = function(left, top) { updateBounds(privates(this).boundsKey_, { left: left, top: top }); }; Bounds.prototype.setSize = function(width, height) { updateBounds(privates(this).boundsKey_, { width: width, height: height }); }; Bounds.prototype.setMinimumSize = function(minWidth, minHeight) { updateSizeConstraints(privates(this).boundsKey_, { minWidth: minWidth, minHeight: minHeight }); }; Bounds.prototype.setMaximumSize = function(maxWidth, maxHeight) { updateSizeConstraints(privates(this).boundsKey_, { maxWidth: maxWidth, maxHeight: maxHeight }); }; var appWindow = apiBridge || binding.create('app.window'); appWindow.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setCustomCallback('create', function(name, request, callback, windowParams) { // |callback| is optional. let maybeCallback = callback || function() {}; // When window creation fails, windowParams is undefined. Return undefined // to the caller. if (!windowParams || !windowParams.frameId) { maybeCallback(undefined); return; } let view = appWindowNatives.GetFrame(windowParams.frameId, true /* notifyBrowser */); if (windowParams.existingWindow) { // Not creating a new window, but activating an existing one, so trigger // callback with existing window and don't do anything else. let windowResult = view ? view.chrome.app.window.current() : undefined; maybeCallback(windowResult); return; } // Handle the sandboxed page case. if (!view || !view.chrome.app) { var sandbox_window_message = 'Creating sandboxed window, it doesn\'t ' + 'have access to the chrome.app API.'; if (callback) { sandbox_window_message = sandbox_window_message + ' The chrome.app.window.create callback will be called, but ' + 'there will be no object provided for the sandboxed window.'; } console.warn(sandbox_window_message); maybeCallback(undefined); return; } // Handle error pages. // TODO(arthursonzogni): Figure out why view.chrome.app is defined for error // pages and stop doing it. if (!view.chrome.app.window) { maybeCallback(undefined); return; } // Initialize appWindowData in the newly created JS context view.chrome.app.window.initializeAppWindow(windowParams); var willCallback = renderFrameObserverNatives.OnDocumentElementCreated( windowParams.frameId, function(success) { let windowResult = success ? view.chrome.app.window.current() : undefined; maybeCallback(windowResult); }); appWindowNatives.ResumeParser(windowParams.frameId); if (!willCallback) maybeCallback(undefined); }); apiFunctions.setHandleRequest('current', function() { if (!currentAppWindow) { console.error('The JavaScript context calling ' + 'chrome.app.window.current() has no associated AppWindow.'); return null; } return currentAppWindow; }); apiFunctions.setHandleRequest('getAll', function() { var views = runtimeNatives.GetExtensionViews(-1, -1, 'APP_WINDOW'); return $Array.map(views, function(win) { return win.chrome.app.window.current(); }); }); apiFunctions.setHandleRequest('get', function(id) { var windows = $Array.filter(chrome.app.window.getAll(), function(win) { return win.id == id; }); return windows.length > 0 ? windows[0] : null; }); apiFunctions.setHandleRequest('canSetVisibleOnAllWorkspaces', function() { return /Mac/.test(navigator.platform) || /Linux/.test(navigator.userAgent); }); // This is an internal function, but needs to be bound into a closure // so the correct JS context is used for global variables such as // currentWindowInternal, appWindowData, etc. apiFunctions.setHandleRequest('initializeAppWindow', function(params) { currentWindowInternal = getInternalApi ? getInternalApi('app.currentWindowInternal') : binding.create('app.currentWindowInternal').generate(); var AppWindow = function() { this.innerBounds = new Bounds('innerBounds'); this.outerBounds = new Bounds('outerBounds'); }; forEach(currentWindowInternal, function(key, value) { // Do not add internal functions that should not appear in the AppWindow // interface. They are called by Bounds mutators. if (key !== kSetBoundsFunction && key !== kSetSizeConstraintsFunction) AppWindow.prototype[key] = value; }); AppWindow.prototype.moveTo = $Function.bind(window.moveTo, window); AppWindow.prototype.resizeTo = $Function.bind(window.resizeTo, window); AppWindow.prototype.contentWindow = window; AppWindow.prototype.onClosed = createAnonymousEvent(); AppWindow.prototype.close = function() { this.contentWindow.close(); }; AppWindow.prototype.getBounds = function() { // This is to maintain backcompatibility with a bug on Windows and // ChromeOS, which returns the position of the window but the size of // the content. var innerBounds = appWindowData.innerBounds; var outerBounds = appWindowData.outerBounds; return { left: outerBounds.left, top: outerBounds.top, width: innerBounds.width, height: innerBounds.height }; }; AppWindow.prototype.setBounds = function(bounds) { updateBounds('bounds', bounds); }; AppWindow.prototype.isFullscreen = function() { return appWindowData.fullscreen; }; AppWindow.prototype.isMinimized = function() { return appWindowData.minimized; }; AppWindow.prototype.isMaximized = function() { return appWindowData.maximized; }; AppWindow.prototype.isAlwaysOnTop = function() { return appWindowData.alwaysOnTop; }; AppWindow.prototype.alphaEnabled = function() { return appWindowData.alphaEnabled; }; Object.defineProperty(AppWindow.prototype, 'id', {get: function() { return appWindowData.id; }}); // These properties are for testing. Object.defineProperty( AppWindow.prototype, 'hasFrameColor', {get: function() { return appWindowData.hasFrameColor; }}); Object.defineProperty(AppWindow.prototype, 'activeFrameColor', {get: function() { return appWindowData.activeFrameColor; }}); Object.defineProperty(AppWindow.prototype, 'inactiveFrameColor', {get: function() { return appWindowData.inactiveFrameColor; }}); appWindowData = { id: params.id || '', innerBounds: { left: params.innerBounds.left, top: params.innerBounds.top, width: params.innerBounds.width, height: params.innerBounds.height, minWidth: params.innerBounds.minWidth, minHeight: params.innerBounds.minHeight, maxWidth: params.innerBounds.maxWidth, maxHeight: params.innerBounds.maxHeight }, outerBounds: { left: params.outerBounds.left, top: params.outerBounds.top, width: params.outerBounds.width, height: params.outerBounds.height, minWidth: params.outerBounds.minWidth, minHeight: params.outerBounds.minHeight, maxWidth: params.outerBounds.maxWidth, maxHeight: params.outerBounds.maxHeight }, fullscreen: params.fullscreen, minimized: params.minimized, maximized: params.maximized, alwaysOnTop: params.alwaysOnTop, hasFrameColor: params.hasFrameColor, activeFrameColor: params.activeFrameColor, inactiveFrameColor: params.inactiveFrameColor, alphaEnabled: params.alphaEnabled }; currentAppWindow = new AppWindow; }); }); function boundsEqual(bounds1, bounds2) { if (!bounds1 || !bounds2) return false; return (bounds1.left == bounds2.left && bounds1.top == bounds2.top && bounds1.width == bounds2.width && bounds1.height == bounds2.height); } function dispatchEventIfExists(target, name) { // Sometimes apps like to put their own properties on the window which // break our assumptions. var event = target[name]; if (event && (typeof event.dispatch == 'function')) event.dispatch(); else console.warn('Could not dispatch ' + name + ', event has been clobbered'); } function updateAppWindowProperties(update) { if (!appWindowData) return; var oldData = appWindowData; update.id = oldData.id; appWindowData = update; var currentWindow = currentAppWindow; if (!boundsEqual(oldData.innerBounds, update.innerBounds)) dispatchEventIfExists(currentWindow, "onBoundsChanged"); if (!oldData.fullscreen && update.fullscreen) dispatchEventIfExists(currentWindow, "onFullscreened"); if (!oldData.minimized && update.minimized) dispatchEventIfExists(currentWindow, "onMinimized"); if (!oldData.maximized && update.maximized) dispatchEventIfExists(currentWindow, "onMaximized"); if ((oldData.fullscreen && !update.fullscreen) || (oldData.minimized && !update.minimized) || (oldData.maximized && !update.maximized)) dispatchEventIfExists(currentWindow, "onRestored"); if (oldData.alphaEnabled !== update.alphaEnabled) dispatchEventIfExists(currentWindow, "onAlphaEnabledChanged"); }; function onAppWindowClosed() { if (!currentAppWindow) return; dispatchEventIfExists(currentAppWindow, "onClosed"); } function updateBounds(boundsType, bounds) { if (!currentWindowInternal) return; currentWindowInternal.setBounds(boundsType, bounds); } function updateSizeConstraints(boundsType, constraints) { if (!currentWindowInternal) return; forEach(constraints, function(key, value) { // From the perspective of the API, null is used to reset constraints. // We need to convert this to 0 because a value of null is interpreted // the same as undefined in the browser and leaves the constraint unchanged. if (value === null) constraints[key] = 0; }); currentWindowInternal.setSizeConstraints(boundsType, constraints); } if (!apiBridge) exports.$set('binding', appWindow.generate()); exports.$set('onAppWindowClosed', onAppWindowClosed); exports.$set('updateAppWindowProperties', updateAppWindowProperties); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var Event = require('event_bindings').Event; var forEach = require('utils').forEach; // Note: Beware sneaky getters/setters when using GetAvailbility(). Use safe/raw // variables as arguments. var GetAvailability = requireNative('v8_context').GetAvailability; var exceptionHandler = require('uncaught_exception_handler'); var lastError = require('lastError'); var loadTypeSchema = require('json_schema').loadTypeSchema; var logActivity = requireNative('activityLogger'); var logging = requireNative('logging'); var process = requireNative('process'); var schemaRegistry = requireNative('schema_registry'); var schemaUtils = require('schemaUtils'); var sendRequestHandler = require('sendRequest'); var contextType = process.GetContextType(); var extensionId = process.GetExtensionId(); var manifestVersion = process.GetManifestVersion(); var platform = process.GetPlatform(); var sendRequest = sendRequestHandler.sendRequest; // Stores the name and definition of each API function, with methods to // modify their behaviour (such as a custom way to handle requests to the // API, a custom callback, etc). function APIFunctions(namespace) { this.apiFunctions_ = { __proto__: null }; this.unavailableApiFunctions_ = { __proto__: null }; this.namespace = namespace; } APIFunctions.prototype = { __proto__: null, }; APIFunctions.prototype.register = function(apiName, apiFunction) { this.apiFunctions_[apiName] = apiFunction; }; // Registers a function as existing but not available, meaning that calls to // the set* methods that reference this function should be ignored rather // than throwing Errors. APIFunctions.prototype.registerUnavailable = function(apiName) { this.unavailableApiFunctions_[apiName] = apiName; }; APIFunctions.prototype.setHook_ = function(apiName, propertyName, customizedFunction) { if ($Object.hasOwnProperty(this.unavailableApiFunctions_, apiName)) return; if (!$Object.hasOwnProperty(this.apiFunctions_, apiName)) throw new Error('Tried to set hook for unknown API "' + apiName + '"'); this.apiFunctions_[apiName][propertyName] = customizedFunction; }; APIFunctions.prototype.setHandleRequest = function(apiName, customizedFunction) { var prefix = this.namespace; return this.setHook_(apiName, 'handleRequest', function() { var ret = $Function.apply(customizedFunction, this, arguments); // Logs API calls to the Activity Log if it doesn't go through an // ExtensionFunction. if (!sendRequestHandler.getCalledSendRequest()) logActivity.LogAPICall(extensionId, prefix + "." + apiName, $Array.slice(arguments)); return ret; }); }; APIFunctions.prototype.setUpdateArgumentsPostValidate = function(apiName, customizedFunction) { return this.setHook_( apiName, 'updateArgumentsPostValidate', customizedFunction); }; APIFunctions.prototype.setUpdateArgumentsPreValidate = function(apiName, customizedFunction) { return this.setHook_( apiName, 'updateArgumentsPreValidate', customizedFunction); }; APIFunctions.prototype.setCustomCallback = function(apiName, customizedFunction) { return this.setHook_(apiName, 'customCallback', customizedFunction); }; function isPlatformSupported(schemaNode, platform) { return !schemaNode.platforms || $Array.indexOf(schemaNode.platforms, platform) > -1; } function isManifestVersionSupported(schemaNode, manifestVersion) { return !schemaNode.maximumManifestVersion || manifestVersion <= schemaNode.maximumManifestVersion; } function isSchemaNodeSupported(schemaNode, platform, manifestVersion) { return isPlatformSupported(schemaNode, platform) && isManifestVersionSupported(schemaNode, manifestVersion); } function createCustomType(type) { var jsModuleName = type.js_module; logging.CHECK(jsModuleName, 'Custom type ' + type.id + ' has no "js_module" property.'); // This list contains all types that has a js_module property. It is ugly to // hard-code them here, but the number of APIs that use js_module has not // changed since the introduction of js_modules in crbug.com/222156. // This whitelist serves as an extra line of defence to avoid exposing // arbitrary extension modules when the |type| definition is poisoned. var whitelistedModules = [ 'ChromeSetting', 'ContentSetting', 'EasyUnlockProximityRequired', 'StorageArea', ]; logging.CHECK($Array.indexOf(whitelistedModules, jsModuleName) !== -1, 'Module ' + jsModuleName + ' does not define a custom type.'); var jsModule = require(jsModuleName); logging.CHECK(jsModule, 'No module ' + jsModuleName + ' found for ' + type.id + '.'); var customType = jsModule[jsModuleName]; logging.CHECK(customType, jsModuleName + ' must export itself.'); return customType; } function Binding(apiName) { this.apiName_ = apiName; this.apiFunctions_ = new APIFunctions(apiName); this.customHooks_ = []; }; $Object.defineProperty(Binding, 'create', { __proto__: null, configurable: false, enumerable: false, value: function(apiName) { return new Binding(apiName); }, writable: false, }); Binding.prototype = { // Sneaky workaround for Object.prototype getters/setters - our prototype // isn't Object.prototype. SafeBuiltins (e.g. $Object.hasOwnProperty()) // should still work. __proto__: null, // Forward-declare properties. apiName_: undefined, apiFunctions_: undefined, customEvent_: undefined, customHooks_: undefined, // The API through which the ${api_name}_custom_bindings.js files customize // their API bindings beyond what can be generated. // // There are 2 types of customizations available: those which are required in // order to do the schema generation (registerCustomEvent and // registerCustomType), and those which can only run after the bindings have // been generated (registerCustomHook). // Registers a custom event type for the API identified by |namespace|. // |event| is the event's constructor. registerCustomEvent: function(event) { this.customEvent_ = event; }, // Registers a function |hook| to run after the schema for all APIs has been // generated. The hook is passed as its first argument an "API" object to // interact with, and second the current extension ID. See where // |customHooks| is used. registerCustomHook: function(fn) { $Array.push(this.customHooks_, fn); }, // TODO(kalman/cduvall): Refactor this so |runHooks_| is not needed. runHooks_: function(api, schema) { $Array.forEach(this.customHooks_, function(hook) { if (!isSchemaNodeSupported(schema, platform, manifestVersion)) return; if (!hook) return; hook({ __proto__: null, apiFunctions: this.apiFunctions_, schema: schema, compiledApi: api }, extensionId, contextType); }, this); }, // Generates the bindings from the schema for |this.apiName_| and integrates // any custom bindings that might be present. generate: function() { // NB: It's important to load the schema during generation rather than // setting it beforehand so that we're more confident the schema we're // loading is real, and not one that was injected by a page intercepting // Binding.generate. // Additionally, since the schema is an object returned from a native // handler, its properties don't have the custom getters/setters that a page // may have put on Object.prototype, and the object is frozen by v8. var schema = schemaRegistry.GetSchema(this.apiName_); function shouldCheckUnprivileged() { var shouldCheck = 'unprivileged' in schema; if (shouldCheck) return shouldCheck; $Array.forEach(['functions', 'events'], function(type) { if ($Object.hasOwnProperty(schema, type)) { $Array.forEach(schema[type], function(node) { if ('unprivileged' in node) shouldCheck = true; }); } }); if (shouldCheck) return shouldCheck; for (var property in schema.properties) { if ($Object.hasOwnProperty(schema, property) && 'unprivileged' in schema.properties[property]) { shouldCheck = true; break; } } return shouldCheck; } var checkUnprivileged = shouldCheckUnprivileged(); // TODO(kalman/cduvall): Make GetAvailability handle this, then delete the // supporting code. if (!isSchemaNodeSupported(schema, platform, manifestVersion)) { console.error('chrome.' + schema.namespace + ' is not supported on ' + 'this platform or manifest version'); return undefined; } var mod = {}; var namespaces = $String.split(schema.namespace, '.'); for (var index = 0, name; name = namespaces[index]; index++) { mod[name] = mod[name] || {}; mod = mod[name]; } if (schema.types) { $Array.forEach(schema.types, function(t) { if (!isSchemaNodeSupported(t, platform, manifestVersion)) return; // Add types to global schemaValidator; the types we depend on from // other namespaces will be added as needed. schemaUtils.schemaValidator.addTypes(t); // Generate symbols for enums. var enumValues = t['enum']; if (enumValues) { // Type IDs are qualified with the namespace during compilation, // unfortunately, so remove it here. logging.DCHECK($String.substr(t.id, 0, schema.namespace.length) == schema.namespace); // Note: + 1 because it ends in a '.', e.g., 'fooApi.Type'. var id = $String.substr(t.id, schema.namespace.length + 1); mod[id] = {}; $Array.forEach(enumValues, function(enumValue) { // Note: enums can be declared either as a list of strings // ['foo', 'bar'] or as a list of objects // [{'name': 'foo'}, {'name': 'bar'}]. enumValue = $Object.hasOwnProperty(enumValue, 'name') ? enumValue.name : enumValue; if (enumValue) { // Avoid setting any empty enums. // Make all properties in ALL_CAPS_STYLE. // // The built-in versions of $String.replace call other built-ins, // which may be clobbered. Instead, manually build the property // name. // // If the first character is a digit (we know it must be one of // a digit, a letter, or an underscore), precede it with an // underscore. var propertyName = ($RegExp.exec(/\d/, enumValue[0])) ? '_' : ''; for (var i = 0; i < enumValue.length; ++i) { var next; if (i > 0 && $RegExp.exec(/[a-z]/, enumValue[i-1]) && $RegExp.exec(/[A-Z]/, enumValue[i])) { // Replace myEnum-Foo with my_Enum-Foo: next = '_' + enumValue[i]; } else if ($RegExp.exec(/\W/, enumValue[i])) { // Replace my_Enum-Foo with my_Enum_Foo: next = '_'; } else { next = enumValue[i]; } propertyName += next; } // Uppercase (replace my_Enum_Foo with MY_ENUM_FOO): propertyName = $String.toUpperCase(propertyName); mod[id][propertyName] = enumValue; } }); } }, this); } // TODO(cduvall): Take out when all APIs have been converted to features. // Returns whether access to the content of a schema should be denied, // based on the presence of "unprivileged" and whether this is an // extension process (versus e.g. a content script). function isSchemaAccessAllowed(itemSchema) { return (contextType == 'BLESSED_EXTENSION') || schema.unprivileged || itemSchema.unprivileged; }; // Setup Functions. if (schema.functions) { $Array.forEach(schema.functions, function(functionDef) { if (functionDef.name in mod) { throw new Error('Function ' + functionDef.name + ' already defined in ' + schema.namespace); } if (!isSchemaNodeSupported(functionDef, platform, manifestVersion)) { this.apiFunctions_.registerUnavailable(functionDef.name); return; } var apiFunction = { __proto__: null }; apiFunction.definition = functionDef; apiFunction.name = schema.namespace + '.' + functionDef.name; if (!GetAvailability(apiFunction.name).is_available || (checkUnprivileged && !isSchemaAccessAllowed(functionDef))) { this.apiFunctions_.registerUnavailable(functionDef.name); return; } // TODO(aa): It would be best to run this in a unit test, but in order // to do that we would need to better factor this code so that it // doesn't depend on so much v8::Extension machinery. if (logging.DCHECK_IS_ON() && schemaUtils.isFunctionSignatureAmbiguous(apiFunction.definition)) { throw new Error( apiFunction.name + ' has ambiguous optional arguments. ' + 'To implement custom disambiguation logic, add ' + '"allowAmbiguousOptionalArguments" to the function\'s schema.'); } this.apiFunctions_.register(functionDef.name, apiFunction); mod[functionDef.name] = $Function.bind(function() { var args = $Array.slice(arguments); $Object.setPrototypeOf(args, null); if (this.updateArgumentsPreValidate) args = $Function.apply(this.updateArgumentsPreValidate, this, args); args = schemaUtils.normalizeArgumentsAndValidate(args, this); if (this.updateArgumentsPostValidate) { args = $Function.apply(this.updateArgumentsPostValidate, this, args); } sendRequestHandler.clearCalledSendRequest(); var retval; if (this.handleRequest) { retval = $Function.apply(this.handleRequest, this, args); } else { var optArgs = { __proto__: null, forIOThread: functionDef.forIOThread, customCallback: this.customCallback }; retval = sendRequest(this.name, args, this.definition.parameters, optArgs); } sendRequestHandler.clearCalledSendRequest(); // Validate return value if in sanity check mode. if (logging.DCHECK_IS_ON() && this.definition.returns) schemaUtils.validate([retval], [this.definition.returns]); return retval; }, apiFunction); }, this); } // Setup Events if (schema.events) { $Array.forEach(schema.events, function(eventDef) { if (eventDef.name in mod) { throw new Error('Event ' + eventDef.name + ' already defined in ' + schema.namespace); } if (!isSchemaNodeSupported(eventDef, platform, manifestVersion)) return; var eventName = schema.namespace + "." + eventDef.name; if (!GetAvailability(eventName).is_available || (checkUnprivileged && !isSchemaAccessAllowed(eventDef))) { return; } var options = eventDef.options || {}; if (eventDef.filters && eventDef.filters.length > 0) options.supportsFilters = true; var parameters = eventDef.parameters; if (this.customEvent_ && eventDef.extraParameters) { mod[eventDef.name] = new this.customEvent_( eventName, parameters, eventDef.extraParameters, options); } else { mod[eventDef.name] = new Event(eventName, parameters, options); } }, this); } function addProperties(m, parentDef) { var properties = parentDef.properties; if (!properties) return; forEach(properties, function(propertyName, propertyDef) { if (propertyName in m) return; // TODO(kalman): be strict like functions/events somehow. if (!isSchemaNodeSupported(propertyDef, platform, manifestVersion)) return; if (!GetAvailability(schema.namespace + "." + propertyName).is_available || (checkUnprivileged && !isSchemaAccessAllowed(propertyDef))) { return; } // |value| is eventually added to |m|, the exposed API. Make copies // of everything from the schema. (The schema is also frozen, so as long // as we don't make any modifications, shallow copies are fine.) var value; if ($Array.isArray(propertyDef.value)) value = $Array.slice(propertyDef.value); else if (typeof propertyDef.value === 'object') value = $Object.assign({}, propertyDef.value); else value = propertyDef.value; if (value) { // Values may just have raw types as defined in the JSON, such // as "WINDOW_ID_NONE": { "value": -1 }. We handle this here. // TODO(kalman): enforce that things with a "value" property can't // define their own types. var type = propertyDef.type || typeof(value); if (type === 'integer' || type === 'number') { value = parseInt(value); } else if (type === 'boolean') { value = value === 'true'; } else if (propertyDef['$ref']) { var ref = propertyDef['$ref']; var type = loadTypeSchema(propertyDef['$ref'], schema); logging.CHECK(type, 'Schema for $ref type ' + ref + ' not found'); var constructor = createCustomType(type); var args = value; logging.DCHECK($Array.isArray(args)); $Array.push(args, type); // For an object propertyDef, |value| is an array of constructor // arguments, but we want to pass the arguments directly (i.e. // not as an array), so we have to fake calling |new| on the // constructor. value = { __proto__: constructor.prototype }; $Function.apply(constructor, value, args); // Recursively add properties. addProperties(value, propertyDef); } else if (type === 'object') { // Recursively add properties. addProperties(value, propertyDef); } else if (type !== 'string') { throw new Error('NOT IMPLEMENTED (extension_api.json error): ' + 'Cannot parse values for type "' + type + '"'); } m[propertyName] = value; } }); }; addProperties(mod, schema); // This generate() call is considered successful if any functions, // properties, or events were created. var success = ($Object.keys(mod).length > 0); // Special case: webViewRequest is a vacuous API which just copies its // implementation from declarativeWebRequest. // // TODO(kalman): This would be unnecessary if we did these checks after the // hooks (i.e. this.runHooks_(mod)). The reason we don't is to be very // conservative with running any JS which might actually be for an API // which isn't available, but this is probably overly cautious given the // C++ is only giving us APIs which are available. FIXME. if (schema.namespace == 'webViewRequest') { success = true; } // Special case: runtime.lastError is only occasionally set, so // specifically check its availability. if (schema.namespace == 'runtime' && GetAvailability('runtime.lastError').is_available) { success = true; } if (!success) { var availability = GetAvailability(schema.namespace); // If an API was available it should have been successfully generated. logging.DCHECK(!availability.is_available, schema.namespace + ' was available but not generated'); console.error('chrome.' + schema.namespace + ' is not available: ' + availability.message); return; } this.runHooks_(mod, schema); return mod; } }; exports.$set('Binding', Binding); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the contextMenus API. var binding = apiBridge || require('binding').Binding.create('contextMenus'); var contextMenusHandlers = require('contextMenusHandlers'); binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var handlers = contextMenusHandlers.create(false /* isWebview */); apiFunctions.setHandleRequest('create', handlers.requestHandlers.create); apiFunctions.setHandleRequest('remove', handlers.requestHandlers.remove); apiFunctions.setHandleRequest('update', handlers.requestHandlers.update); apiFunctions.setHandleRequest('removeAll', handlers.requestHandlers.removeAll); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Implementation of custom bindings for the contextMenus API. // This is used to implement the contextMenus API for extensions and for the // tag (see chrome_web_view_experimental.js). var contextMenuNatives = requireNative('context_menus'); var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; var hasLastError = bindingUtil ? $Function.bind(bindingUtil.hasLastError, bindingUtil) : require('lastError').hasError; var jsEvent; function createNewEvent(name, isWebview) { var supportsLazyListeners = !isWebview; var supportsFilters = false; if (bindingUtil) { // Native custom events ignore schema. return bindingUtil.createCustomEvent(name, undefined, supportsFilters, supportsLazyListeners); } if (!jsEvent) jsEvent = require('event_bindings').Event; var eventOpts = { __proto__: null, supportsLazyListeners: supportsLazyListeners, supportsFilters: supportsFilters, }; return new jsEvent(name, null, eventOpts); } // Add the bindings to the contextMenus API. function createContextMenusHandlers(isWebview) { var eventName = isWebview ? 'webViewInternal.contextMenus' : 'contextMenus'; // Some dummy value for chrome.contextMenus instances. // Webviews use positive integers, and 0 to denote an invalid webview ID. // The following constant is -1 to avoid any conflicts between webview IDs and // extensions. var INSTANCEID_NON_WEBVIEW = -1; // Generates a customCallback for a given method. |handleCallback| will be // invoked with the same arguments this function is called with. function getCallback(handleCallback) { return function() { var extensionCallback = arguments[arguments.length - 1]; if (hasLastError(bindingUtil ? undefined : chrome)) { if (extensionCallback) extensionCallback(); return; } $Function.apply(handleCallback, null, arguments); if (extensionCallback) extensionCallback(); }; } var contextMenus = { __proto__: null }; contextMenus.handlers = { __proto__: null }; contextMenus.event = createNewEvent(eventName, isWebview); contextMenus.getIdFromCreateProperties = function(createProperties) { if (typeof createProperties.id !== 'undefined') return createProperties.id; return createProperties.generatedId; }; contextMenus.handlersForId = function(instanceId, id) { if (!contextMenus.handlers[instanceId]) { contextMenus.handlers[instanceId] = { generated: {}, string: {} }; } if (typeof id === 'number') return contextMenus.handlers[instanceId].generated; return contextMenus.handlers[instanceId].string; }; contextMenus.ensureListenerSetup = function() { if (contextMenus.listening) { return; } contextMenus.listening = true; contextMenus.event.addListener(function(info) { var instanceId = INSTANCEID_NON_WEBVIEW; if (isWebview) { instanceId = info.webviewInstanceId; // Don't expose |webviewInstanceId| via the public API. delete info.webviewInstanceId; } var id = info.menuItemId; var onclick = contextMenus.handlersForId(instanceId, id)[id]; if (onclick) { $Function.apply(onclick, null, arguments); } }); }; // To be used with apiFunctions.setHandleRequest var requestHandlers = { __proto__: null }; function createCallback(instanceId, id, onclick) { if (onclick) { contextMenus.ensureListenerSetup(); contextMenus.handlersForId(instanceId, id)[id] = onclick; } } requestHandlers.create = function() { var createProperties = isWebview ? arguments[1] : arguments[0]; createProperties.generatedId = contextMenuNatives.GetNextContextMenuId(); var id = contextMenus.getIdFromCreateProperties(createProperties); var instanceId = isWebview ? arguments[0] : INSTANCEID_NON_WEBVIEW; var onclick = createProperties.onclick; var optArgs = { __proto__: null, customCallback: getCallback($Function.bind(createCallback, null, instanceId, id, onclick)), }; var name = isWebview ? 'chromeWebViewInternal.contextMenusCreate' : 'contextMenus.create'; sendRequest(name, $Array.from(arguments), bindingUtil ? undefined : this.definition.parameters, optArgs); return id; }; function removeCallback(instanceId, id) { delete contextMenus.handlersForId(instanceId, id)[id]; } requestHandlers.remove = function() { var instanceId = isWebview ? arguments[0] : INSTANCEID_NON_WEBVIEW; var id = isWebview ? arguments[1] : arguments[0]; var optArgs = { __proto__: null, customCallback: getCallback($Function.bind(removeCallback, null, instanceId, id)), }; var name = isWebview ? 'chromeWebViewInternal.contextMenusRemove' : 'contextMenus.remove'; sendRequest(name, $Array.from(arguments), bindingUtil ? undefined : this.definition.parameters, optArgs); }; function updateCallback(instanceId, id, onclick) { if (onclick) { contextMenus.ensureListenerSetup(); contextMenus.handlersForId(instanceId, id)[id] = onclick; } else if (onclick === null) { // When onclick is explicitly set to null, remove the event listener. delete contextMenus.handlersForId(instanceId, id)[id]; } } requestHandlers.update = function() { var instanceId = isWebview ? arguments[0] : INSTANCEID_NON_WEBVIEW; var id = isWebview ? arguments[1] : arguments[0]; var updateProperties = isWebview ? arguments[2] : arguments[1]; var onclick = updateProperties.onclick; var optArgs = { __proto__: null, customCallback: getCallback($Function.bind(updateCallback, null, instanceId, id, onclick)), }; var name = isWebview ? 'chromeWebViewInternal.contextMenusUpdate' : 'contextMenus.update'; sendRequest(name, $Array.from(arguments), bindingUtil ? undefined : this.definition.parameters, optArgs); }; function removeAllCallback(instanceId) { delete contextMenus.handlers[instanceId]; } requestHandlers.removeAll = function() { var instanceId = isWebview ? arguments[0] : INSTANCEID_NON_WEBVIEW; var optArgs = { __proto__: null, customCallback: getCallback($Function.bind(removeAllCallback, null, instanceId)), }; var name = isWebview ? 'chromeWebViewInternal.contextMenusRemoveAll' : 'contextMenus.removeAll'; sendRequest(name, $Array.from(arguments), bindingUtil ? undefined : this.definition.parameters, optArgs); }; return { requestHandlers: requestHandlers, }; } exports.$set('create', createContextMenusHandlers); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the declarativeWebRequest API. var binding = apiBridge || require('binding').Binding.create('declarativeWebRequest'); var utils = bindingUtil ? undefined : require('utils'); var validate = bindingUtil ? undefined : require('schemaUtils').validate; function validateType(schemaTypes, typeName, value) { if (bindingUtil) { bindingUtil.validateType(typeName, value); } else { var schema = utils.lookup(schemaTypes, 'id', typeName); validate([value], [schema]); } } binding.registerCustomHook(function(api) { var declarativeWebRequest = api.compiledApi; // Helper function for the constructor of concrete datatypes of the // declarative webRequest API. // Makes sure that |this| contains the union of parameters and // {'instanceType': 'declarativeWebRequest.' + typeId} and validates the // generated union dictionary against the schema for |typeId|. function setupInstance(instance, parameters, typeId) { for (var key in parameters) { if ($Object.hasOwnProperty(parameters, key)) { instance[key] = parameters[key]; } } var qualifiedType = 'declarativeWebRequest.' + typeId; instance.instanceType = qualifiedType; validateType(bindingUtil ? undefined : api.schema.types, qualifiedType, instance); } // Setup all data types for the declarative webRequest API. declarativeWebRequest.RequestMatcher = function(parameters) { setupInstance(this, parameters, 'RequestMatcher'); }; declarativeWebRequest.CancelRequest = function(parameters) { setupInstance(this, parameters, 'CancelRequest'); }; declarativeWebRequest.RedirectRequest = function(parameters) { setupInstance(this, parameters, 'RedirectRequest'); }; declarativeWebRequest.SetRequestHeader = function(parameters) { setupInstance(this, parameters, 'SetRequestHeader'); }; declarativeWebRequest.RemoveRequestHeader = function(parameters) { setupInstance(this, parameters, 'RemoveRequestHeader'); }; declarativeWebRequest.AddResponseHeader = function(parameters) { setupInstance(this, parameters, 'AddResponseHeader'); }; declarativeWebRequest.RemoveResponseHeader = function(parameters) { setupInstance(this, parameters, 'RemoveResponseHeader'); }; declarativeWebRequest.RedirectToTransparentImage = function(parameters) { setupInstance(this, parameters, 'RedirectToTransparentImage'); }; declarativeWebRequest.RedirectToEmptyDocument = function(parameters) { setupInstance(this, parameters, 'RedirectToEmptyDocument'); }; declarativeWebRequest.RedirectByRegEx = function(parameters) { setupInstance(this, parameters, 'RedirectByRegEx'); }; declarativeWebRequest.IgnoreRules = function(parameters) { setupInstance(this, parameters, 'IgnoreRules'); }; declarativeWebRequest.AddRequestCookie = function(parameters) { setupInstance(this, parameters, 'AddRequestCookie'); }; declarativeWebRequest.AddResponseCookie = function(parameters) { setupInstance(this, parameters, 'AddResponseCookie'); }; declarativeWebRequest.EditRequestCookie = function(parameters) { setupInstance(this, parameters, 'EditRequestCookie'); }; declarativeWebRequest.EditResponseCookie = function(parameters) { setupInstance(this, parameters, 'EditResponseCookie'); }; declarativeWebRequest.RemoveRequestCookie = function(parameters) { setupInstance(this, parameters, 'RemoveRequestCookie'); }; declarativeWebRequest.RemoveResponseCookie = function(parameters) { setupInstance(this, parameters, 'RemoveResponseCookie'); }; declarativeWebRequest.SendMessageToExtension = function(parameters) { setupInstance(this, parameters, 'SendMessageToExtension'); }; }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Display Source API. var binding = apiBridge || require('binding').Binding.create('displaySource'); var chrome = requireNative('chrome').GetChrome(); var natives = requireNative('display_source'); var logging = requireNative('logging'); var jsLastError = bindingUtil ? undefined : require('lastError'); function setLastError(name, message) { if (bindingUtil) bindingUtil.setLastError(message); else jsLastError.set(name, message, null, chrome); } function clearLastError() { if (bindingUtil) bindingUtil.clearLastError(); else jsLastError.clear(chrome); } var callbacksInfo = {}; function callbackWrapper(callback, method, message) { if (callback == undefined) return; try { if (message !== null) setLastError(method, message); callback(); } finally { clearLastError(); } } function callCompletionCallback(callbackId, error_message) { try { var callbackInfo = callbacksInfo[callbackId]; logging.DCHECK(callbackInfo != null); callbackWrapper(callbackInfo.callback, callbackInfo.method, error_message); } finally { delete callbacksInfo[callbackId]; } } binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest( 'startSession', function(sessionInfo, callback) { try { var callId = natives.StartSession(sessionInfo); callbacksInfo[callId] = { callback: callback, method: 'displaySource.startSession' }; } catch (e) { callbackWrapper(callback, 'displaySource.startSession', e.message); } }); apiFunctions.setHandleRequest( 'terminateSession', function(sink_id, callback) { try { var callId = natives.TerminateSession(sink_id); callbacksInfo[callId] = { callback: callback, method: 'displaySource.terminateSession' }; } catch (e) { callbackWrapper( callback, 'displaySource.terminateSession', e.message); } }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Called by C++. exports.$set('callCompletionCallback', callCompletionCallback); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the extension API. var binding = apiBridge || require('binding').Binding.create('extension'); var messaging = require('messaging'); var runtimeNatives = requireNative('runtime'); var GetExtensionViews = runtimeNatives.GetExtensionViews; var chrome = requireNative('chrome').GetChrome(); var inIncognitoContext = requireNative('process').InIncognitoContext(); var sendRequestIsDisabled = requireNative('process').IsSendRequestDisabled(); var contextType = requireNative('process').GetContextType(); // This should match chrome.windows.WINDOW_ID_NONE. // // We can't use chrome.windows.WINDOW_ID_NONE directly because the // chrome.windows API won't exist unless this extension has permission for it; // which may not be the case. var WINDOW_ID_NONE = -1; var TAB_ID_NONE = -1; binding.registerCustomHook(function(bindingsAPI, extensionId) { var extension = bindingsAPI.compiledApi; extension.inIncognitoContext = inIncognitoContext; var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('getViews', function(properties) { var windowId = WINDOW_ID_NONE; var tabId = TAB_ID_NONE; var type = 'ALL'; if (properties) { if (properties.type != null) { type = properties.type; } if (properties.windowId != null) { windowId = properties.windowId; } if (properties.tabId != null) { tabId = properties.tabId; } } return GetExtensionViews(windowId, tabId, type); }); apiFunctions.setHandleRequest('getBackgroundPage', function() { return GetExtensionViews(-1, -1, 'BACKGROUND')[0] || null; }); apiFunctions.setHandleRequest('getExtensionTabs', function(windowId) { if (windowId == null) windowId = WINDOW_ID_NONE; return GetExtensionViews(windowId, -1, 'TAB'); }); apiFunctions.setHandleRequest('getURL', function(path) { path = String(path); if (!path.length || path[0] != '/') path = '/' + path; return 'chrome-extension://' + extensionId + path; }); // Alias several messaging deprecated APIs to their runtime counterparts. var mayNeedAlias = [ // Types 'Port', // Functions 'connect', 'sendMessage', 'connectNative', 'sendNativeMessage', // Events 'onConnect', 'onConnectExternal', 'onMessage', 'onMessageExternal' ]; $Array.forEach(mayNeedAlias, function(alias) { // Checking existence isn't enough since some functions are disabled via // getters that throw exceptions. Assume that any getter is such a function. if (chrome.runtime && $Object.hasOwnProperty(chrome.runtime, alias) && chrome.runtime.__lookupGetter__(alias) === undefined) { extension[alias] = chrome.runtime[alias]; } }); apiFunctions.setUpdateArgumentsPreValidate('sendRequest', $Function.bind(messaging.sendMessageUpdateArguments, null, 'sendRequest', false /* hasOptionsArgument */)); apiFunctions.setHandleRequest('sendRequest', function(targetId, request, responseCallback) { if (sendRequestIsDisabled) throw new Error(sendRequestIsDisabled); var port = chrome.runtime.connect(targetId || extensionId, {name: messaging.kRequestChannel}); messaging.sendMessageImpl(port, request, responseCallback); }); if (sendRequestIsDisabled) { extension.onRequest.addListener = function() { throw new Error(sendRequestIsDisabled); }; if (contextType == 'BLESSED_EXTENSION') { extension.onRequestExternal.addListener = function() { throw new Error(sendRequestIsDisabled); }; } } }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var fileSystemNatives = requireNative('file_system_natives'); var GetIsolatedFileSystem = fileSystemNatives.GetIsolatedFileSystem; var GetModuleSystem = requireNative('v8_context').GetModuleSystem; // TODO(sammc): Don't require extension. See http://crbug.com/235689. var GetExtensionViews = requireNative('runtime').GetExtensionViews; var safeCallbackApply = require('uncaught_exception_handler').safeCallbackApply; var jsLastError = bindingUtil ? undefined : require('lastError'); function runCallbackWithLastError(name, message, stack, callback) { if (bindingUtil) bindingUtil.runCallbackWithLastError(message, callback); else jsLastError.run(name, message, stack, callback); } var WINDOW = {}; try { WINDOW = window; } catch (e) { // Running in SW context. // TODO(lazyboy): Synchronous access to background page is not possible from // service worker context. Decide what we should do in this case for the class // of APIs that require access to background page or window object } // For a given |apiName|, generates object with two elements that are used // in file system relayed APIs: // * 'bindFileEntryCallback' function that provides mapping between JS objects // into actual FileEntry|DirectoryEntry objects. // * 'entryIdManager' object that implements methods for keeping the tracks of // previously saved file entries. function getFileBindingsForApi(apiName) { // Fallback to using the current window if no background page is running. var views = GetExtensionViews(-1, -1, 'BACKGROUND'); // GetExtensionViews() can return null if called from a context without an // associated extension. var backgroundPage = views && views[0] ? views[0] : WINDOW; var backgroundPageModuleSystem = GetModuleSystem(backgroundPage); // All windows use the bindFileEntryCallback from the background page so their // FileEntry objects have the background page's context as their own. This // allows them to be used from other windows (including the background page) // after the original window is closed. if (WINDOW == backgroundPage) { var bindFileEntryCallback = function(functionName, apiFunctions) { apiFunctions.setCustomCallback(functionName, function(name, request, callback, response) { if (callback) { if (!response) { callback(); return; } var entries = []; var hasError = false; var getEntryError = function(fileError) { if (!hasError) { hasError = true; runCallbackWithLastError( apiName + '.' + functionName, 'Error getting fileEntry, code: ' + fileError.code, request.stack, callback); } } // Loop through the response entries and asynchronously get the // FileEntry for each. We use hasError to ensure that only the first // error is reported. Note that an error can occur either during the // loop or in the asynchronous error callback to getFile. $Array.forEach(response.entries, function(entry) { if (hasError) return; var fileSystemId = entry.fileSystemId; var baseName = entry.baseName; var id = entry.id; var fs = GetIsolatedFileSystem(fileSystemId); try { var getEntryCallback = function(fileEntry) { if (hasError) return; entryIdManager.registerEntry(id, fileEntry); entries.push(fileEntry); // Once all entries are ready, pass them to the callback. In the // event of an error, this condition will never be satisfied so // the callback will not be called with any entries. if (entries.length == response.entries.length) { if (response.multiple) { safeCallbackApply(apiName + '.' + functionName, request, callback, [entries]); } else { safeCallbackApply( apiName + '.' + functionName, request, callback, [entries[0]]); } } } // TODO(koz): fs.root.getFile() makes a trip to the browser // process, but it might be possible avoid that by calling // WebDOMFileSystem::createV8Entry(). if (entry.isDirectory) { fs.root.getDirectory(baseName, {}, getEntryCallback, getEntryError); } else { fs.root.getFile(baseName, {}, getEntryCallback, getEntryError); } } catch (e) { if (!hasError) { hasError = true; runCallbackWithLastError(apiName + '.' + functionName, 'Error getting fileEntry: ' + e.stack, request.stack, callback); } } }); } }); }; var entryIdManager = require('entryIdManager'); } else { // Force the fileSystem API to be loaded in the background page. Using // backgroundPageModuleSystem.require('fileSystem') is insufficient as // requireNative is only allowed while lazily loading an API. backgroundPage.chrome.fileSystem; var bindFileEntryCallback = backgroundPageModuleSystem.require('fileEntryBindingUtil') .getFileBindingsForApi(apiName).bindFileEntryCallback; var entryIdManager = backgroundPageModuleSystem.require('entryIdManager'); } return {bindFileEntryCallback: bindFileEntryCallback, entryIdManager: entryIdManager}; } function getBindDirectoryEntryCallback() { // Get the background page if one exists. Otherwise, default to the current // window. var views = GetExtensionViews(-1, -1, 'BACKGROUND'); // GetExtensionViews() can return null if called from a context without an // associated extension. var backgroundPage = views && views[0] ? views[0] : WINDOW; // For packaged apps, all windows use the bindFileEntryCallback from the // background page so their FileEntry objects have the background page's // context as their own. This allows them to be used from other windows // (including the background page) after the original window is closed. if (WINDOW == backgroundPage) { return function(name, request, callback, response) { if (callback) { if (!response) { callback(); return; } var fileSystemId = response.fileSystemId; var baseName = response.baseName; var fs = GetIsolatedFileSystem(fileSystemId); try { fs.root.getDirectory(baseName, {}, callback, function(fileError) { runCallbackWithLastError( 'runtime.' + functionName, 'Error getting Entry, code: ' + fileError.code, request.stack, callback); }); } catch (e) { runCallbackWithLastError('runtime.' + functionName, 'Error: ' + e.stack, request.stack, callback); } } } } else { var backgroundPageModuleSystem = GetModuleSystem(backgroundPage); // Force the runtime API to be loaded in the background page. Using // backgroundPageModuleSystem.require('runtime') is insufficient as // requireNative is only allowed while lazily loading an API. backgroundPage.chrome.runtime; return backgroundPageModuleSystem.require('fileEntryBindingUtil') .getBindDirectoryEntryCallback(); } } exports.$set('getFileBindingsForApi', getFileBindingsForApi); exports.$set('getBindDirectoryEntryCallback', getBindDirectoryEntryCallback); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the fileSystem API. var binding = apiBridge || require('binding').Binding.create('fileSystem'); var sendRequest = bindingUtil ? $Function.bind(bindingUtil.sendRequest, bindingUtil) : require('sendRequest').sendRequest; var getFileBindingsForApi = require('fileEntryBindingUtil').getFileBindingsForApi; var fileBindings = getFileBindingsForApi('fileSystem'); var bindFileEntryCallback = fileBindings.bindFileEntryCallback; var entryIdManager = fileBindings.entryIdManager; var fileSystemNatives = requireNative('file_system_natives'); var safeCallbackApply = require('uncaught_exception_handler').safeCallbackApply; binding.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var fileSystem = bindingsAPI.compiledApi; function bindFileEntryFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(fileEntry, callback) { var fileSystemName = fileEntry.filesystem.name; var relativePath = $String.slice(fileEntry.fullPath, 1); return [fileSystemName, relativePath, callback]; }); } $Array.forEach(['getDisplayPath', 'getWritableEntry', 'isWritableEntry'], bindFileEntryFunction); $Array.forEach(['getWritableEntry', 'chooseEntry', 'restoreEntry'], function(functionName) { bindFileEntryCallback(functionName, apiFunctions); }); apiFunctions.setHandleRequest('retainEntry', function(fileEntry) { var id = entryIdManager.getEntryId(fileEntry); if (!id) return ''; var fileSystemName = fileEntry.filesystem.name; var relativePath = $String.slice(fileEntry.fullPath, 1); sendRequest('fileSystem.retainEntry', [id, fileSystemName, relativePath], bindingUtil ? undefined : this.definition.parameters, undefined); return id; }); apiFunctions.setHandleRequest('isRestorable', function(id, callback) { var savedEntry = entryIdManager.getEntryById(id); if (savedEntry) { safeCallbackApply('fileSystem.isRestorable', {}, callback, [true]); } else { sendRequest('fileSystem.isRestorable', [id, callback], bindingUtil ? undefined : this.definition.parameters, undefined); } }); apiFunctions.setUpdateArgumentsPostValidate('restoreEntry', function(id, callback) { var savedEntry = entryIdManager.getEntryById(id); if (savedEntry) { // We already have a file entry for this id so pass it to the callback and // send a request to the browser to move it to the back of the LRU. safeCallbackApply('fileSystem.restoreEntry', {}, callback, [savedEntry]); return [id, false, null]; } else { // Ask the browser process for a new file entry for this id, to be passed // to |callback|. return [id, true, callback]; } }); apiFunctions.setCustomCallback('requestFileSystem', function(name, request, callback, response) { var fileSystem; if (response && response.file_system_id) { fileSystem = fileSystemNatives.GetIsolatedFileSystem( response.file_system_id, response.file_system_path); } safeCallbackApply('fileSystem.requestFileSystem', request, callback, [fileSystem]); }); // TODO(benwells): Remove these deprecated versions of the functions. fileSystem.getWritableFileEntry = function() { console.log("chrome.fileSystem.getWritableFileEntry is deprecated"); console.log("Please use chrome.fileSystem.getWritableEntry instead"); $Function.apply(fileSystem.getWritableEntry, this, arguments); }; fileSystem.isWritableFileEntry = function() { console.log("chrome.fileSystem.isWritableFileEntry is deprecated"); console.log("Please use chrome.fileSystem.isWritableEntry instead"); $Function.apply(fileSystem.isWritableEntry, this, arguments); }; fileSystem.chooseFile = function() { console.log("chrome.fileSystem.chooseFile is deprecated"); console.log("Please use chrome.fileSystem.chooseEntry instead"); $Function.apply(fileSystem.chooseEntry, this, arguments); }; }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // ----------------------------------------------------------------------------- // NOTE: If you change this file you need to touch renderer_resources.grd to // have your change take effect. // ----------------------------------------------------------------------------- // Partial implementation of the Greasemonkey API, see: // http://wiki.greasespot.net/Greasemonkey_Manual:APIs function GM_addStyle(css) { var parent = document.getElementsByTagName("head")[0]; if (!parent) { parent = document.documentElement; } var style = document.createElement("style"); style.type = "text/css"; var textNode = document.createTextNode(css); style.appendChild(textNode); parent.appendChild(style); } function GM_xmlhttpRequest(details) { function setupEvent(xhr, url, eventName, callback) { xhr[eventName] = function () { var isComplete = xhr.readyState == 4; var responseState = { responseText: xhr.responseText, readyState: xhr.readyState, responseHeaders: isComplete ? xhr.getAllResponseHeaders() : "", status: isComplete ? xhr.status : 0, statusText: isComplete ? xhr.statusText : "", finalUrl: isComplete ? url : "" }; callback(responseState); }; } var xhr = new XMLHttpRequest(); var eventNames = ["onload", "onerror", "onreadystatechange"]; for (var i = 0; i < eventNames.length; i++ ) { var eventName = eventNames[i]; if (eventName in details) { setupEvent(xhr, details.url, eventName, details[eventName]); } } xhr.open(details.method, details.url); if (details.overrideMimeType) { xhr.overrideMimeType(details.overrideMimeType); } if (details.headers) { for (var header in details.headers) { xhr.setRequestHeader(header, details.headers[header]); } } xhr.send(details.data ? details.data : null); } function GM_openInTab(url) { window.open(url, ""); } function GM_log(message) { window.console.log(message); } (function() { function generateGreasemonkeyStub(name) { return function() { console.log("%s is not supported.", name); }; } var apis = ["GM_getValue", "GM_setValue", "GM_registerMenuCommand"]; for (var i = 0, api; api = apis[i]; i++) { window[api] = generateGreasemonkeyStub(api); } })(); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the i18n API. var binding = apiBridge || require('binding').Binding.create('i18n'); var i18nNatives = requireNative('i18n'); var GetL10nMessage = i18nNatives.GetL10nMessage; var GetL10nUILanguage = i18nNatives.GetL10nUILanguage; var DetectTextLanguage = i18nNatives.DetectTextLanguage; binding.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPreValidate('getMessage', function() { var args = $Array.slice(arguments); // The first argument is the message, and should be a string. var message = args[0]; if (typeof(message) !== 'string') { console.warn(extensionId + ': the first argument to getMessage should ' + 'be type "string", was ' + message + ' (type "' + typeof(message) + '")'); args[0] = String(message); } return args; }); apiFunctions.setHandleRequest('getMessage', function(messageName, substitutions) { return GetL10nMessage(messageName, substitutions, extensionId); }); apiFunctions.setHandleRequest('getUILanguage', function() { return GetL10nUILanguage(); }); apiFunctions.setHandleRequest('detectLanguage', function(text, callback) { window.setTimeout(function() { var response = DetectTextLanguage(text); callback(response); }, 0); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** * Custom bindings for the mojoPrivate API. */ let binding = apiBridge || require('binding').Binding.create('mojoPrivate'); binding.registerCustomHook(function(bindingsAPI) { let apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('requireAsync', function(moduleName) { return Promise.resolve(require(moduleName).returnValue); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Permissions API. var binding = apiBridge || require('binding').Binding.create('permissions'); var registerArgumentMassager = bindingUtil ? $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) : require('event_bindings').registerArgumentMassager; function maybeConvertToObject(str) { var parts = $String.split(str, '|'); if (parts.length != 2) return str; var ret = {}; ret[parts[0]] = $JSON.parse(parts[1]); return ret; } function massager(args, dispatch) { // Convert complex permissions back to objects for events. for (var i = 0; i < args[0].permissions.length; ++i) args[0].permissions[i] = maybeConvertToObject(args[0].permissions[i]); dispatch(args); } registerArgumentMassager('permissions.onAdded', massager); registerArgumentMassager('permissions.onRemoved', massager); // These custom binding are only necessary because it is not currently // possible to have a union of types as the type of the items in an array. // Once that is fixed, this entire file should go away. // See, // https://code.google.com/p/chromium/issues/detail?id=162044 // https://code.google.com/p/chromium/issues/detail?id=162042 // TODO(bryeung): delete this file. binding.registerCustomHook(function(api) { var apiFunctions = api.apiFunctions; var permissions = api.compiledApi; function convertObjectPermissionsToStrings() { if (arguments.length < 1) return arguments; var args = arguments[0].permissions; if (!args) return arguments; for (var i = 0; i < args.length; ++i) { if (typeof args[i] == 'object') { var a = args[i]; var keys = $Object.keys(a); if (keys.length != 1) { throw new Error('Too many keys in object-style permission.'); } arguments[0].permissions[i] = keys[0] + '|' + $JSON.stringify(a[keys[0]]); } } return arguments; } // Convert complex permissions to strings so they validate against the schema apiFunctions.setUpdateArgumentsPreValidate( 'contains', convertObjectPermissionsToStrings); apiFunctions.setUpdateArgumentsPreValidate( 'remove', convertObjectPermissionsToStrings); apiFunctions.setUpdateArgumentsPreValidate( 'request', convertObjectPermissionsToStrings); // Convert complex permissions back to objects apiFunctions.setCustomCallback('getAll', function(name, request, callback, response) { for (var i = 0; i < response.permissions.length; i += 1) { response.permissions[i] = maybeConvertToObject(response.permissions[i]); } // Since the schema says Permissions.permissions contains strings and // not objects, validation will fail after the for-loop above. This // skips validation and calls the callback directly. if (callback) callback(response); }); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var binding = apiBridge || require('binding').Binding.create('printerProvider'); var printerProviderInternal = getInternalApi ? getInternalApi('printerProviderInternal') : require('binding').Binding.create('printerProviderInternal').generate(); var registerArgumentMassager = bindingUtil ? $Function.bind(bindingUtil.registerEventArgumentMassager, bindingUtil) : require('event_bindings').registerArgumentMassager; var blobNatives = requireNative('blob_natives'); var printerProviderSchema = requireNative('schema_registry').GetSchema('printerProvider') var utils = require('utils'); var validate = bindingUtil ? undefined : require('schemaUtils').validate; // Validates that the result passed by the extension to the event callback // matches the callback schema. Throws an exception in case of an error. function validateListenerResponse(eventName, expectedSchema, listenerResponse) { if (bindingUtil) bindingUtil.validateCustomSignature(eventName, listenerResponse); else validate(listenerResponse, expectedSchema); } // Custom bindings for chrome.printerProvider API. // The bindings are used to implement callbacks for the API events. Internally // each event is passed requestId argument used to identify the callback // associated with the event. This argument is massaged out from the event // arguments before dispatching the event to consumers. A callback is appended // to the event arguments. The callback wraps an appropriate // chrome.printerProviderInternal API function that is used to report the event // result from the extension. The function is passed requestId and values // provided by the extension. It validates that the values provided by the // extension match chrome.printerProvider event callback schemas. It also // ensures that a callback is run at most once. In case there is an exception // during event dispatching, the chrome.printerProviderInternal function // is called with a default error value. // // Handles a chrome.printerProvider event as described in the file comment. // |eventName|: The event name. // |prepareArgsForDispatch|: Function called before dispatching the event to // the extension. It's called with original event |args| list and callback // that should be called when the |args| are ready for dispatch. The // callbacks should report whether the argument preparation was successful. // The function should not change the first argument, which contains the // request id. // |resultreporter|: The function that should be called to report event result. // One of chrome.printerProviderInternal API functions. function handleEvent(eventName, prepareArgsForDispatch, resultReporter) { var eventSchema = utils.lookup(printerProviderSchema.events, 'name', eventName); var callbackSchema = utils.lookup(eventSchema.parameters, 'type', 'function').parameters; var fullEventName = 'printerProvider.' + eventName; if (bindingUtil) bindingUtil.addCustomSignature(fullEventName, callbackSchema); registerArgumentMassager(fullEventName, function(args, dispatch) { var responded = false; // Function provided to the extension as the event callback argument. // It makes sure that the event result hasn't previously been returned // and that the provided result matches the callback schema. In case of // an error it throws an exception. var reportResult = function(result) { if (responded) throw new Error('Event callback must not be called more than once.'); var finalResult = null; try { // throws on failure validateListenerResponse(fullEventName, callbackSchema, [result]); finalResult = result; } finally { responded = true; resultReporter(args[0] /* requestId */, finalResult); } }; prepareArgsForDispatch(args, function(success) { if (!success) { // Do not throw an exception since the extension should not yet be // aware of the event. resultReporter(args[0] /* requestId */, null); return; } dispatch(args.slice(1).concat(reportResult)); }); }); } // Sets up printJob.document property for a print request. function createPrintRequestBlobArguments(args, callback) { printerProviderInternal.getPrintData(args[0] /* requestId */, function(blobInfo) { if (chrome.runtime.lastError) { callback(false); return; } // |args[1]| is printJob. args[1].document = blobNatives.TakeBrowserProcessBlob( blobInfo.blobUuid, blobInfo.type, blobInfo.size); callback(true); }); } handleEvent('onGetPrintersRequested', function(args, callback) { callback(true); }, printerProviderInternal.reportPrinters); handleEvent('onGetCapabilityRequested', function(args, callback) { callback(true); }, printerProviderInternal.reportPrinterCapability); handleEvent('onPrintRequested', createPrintRequestBlobArguments, printerProviderInternal.reportPrintResult); handleEvent('onGetUsbPrinterInfoRequested', function(args, callback) { callback(true); }, printerProviderInternal.reportUsbPrinterInfo); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the runtime API. var binding = apiBridge || require('binding').Binding.create('runtime'); var messaging = require('messaging'); var runtimeNatives = requireNative('runtime'); var messagingNatives = requireNative('messaging_natives'); var process = requireNative('process'); var utils = require('utils'); var getBindDirectoryEntryCallback = require('fileEntryBindingUtil').getBindDirectoryEntryCallback; binding.registerCustomHook(function(binding, id, contextType) { var apiFunctions = binding.apiFunctions; var runtime = binding.compiledApi; // // Unprivileged APIs. // if (id != '') utils.defineProperty(runtime, 'id', id); apiFunctions.setHandleRequest('getManifest', function() { return runtimeNatives.GetManifest(); }); apiFunctions.setHandleRequest('getURL', function(path) { path = $String.self(path); if (!path.length || path[0] != '/') path = '/' + path; return 'chrome-extension://' + id + path; }); var sendMessageUpdateArguments = messaging.sendMessageUpdateArguments; apiFunctions.setUpdateArgumentsPreValidate( 'sendMessage', $Function.bind(sendMessageUpdateArguments, null, 'sendMessage', true /* hasOptionsArgument */)); apiFunctions.setUpdateArgumentsPreValidate( 'sendNativeMessage', $Function.bind(sendMessageUpdateArguments, null, 'sendNativeMessage', false /* hasOptionsArgument */)); apiFunctions.setHandleRequest( 'sendMessage', function(targetId, message, options, responseCallback) { var connectOptions = $Object.assign({ __proto__: null, name: messaging.kMessageChannel, }, options); var port = runtime.connect(targetId, connectOptions); messaging.sendMessageImpl(port, message, responseCallback); }); apiFunctions.setHandleRequest('sendNativeMessage', function(targetId, message, responseCallback) { var port = runtime.connectNative(targetId); messaging.sendMessageImpl(port, message, responseCallback); }); apiFunctions.setHandleRequest('connect', function(targetId, connectInfo) { if (!targetId) { // id is only defined inside extensions. If we're in a webpage, the best // we can do at this point is to fail. if (!id) { throw new Error('chrome.runtime.connect() called from a webpage must ' + 'specify an Extension ID (string) for its first ' + 'argument'); } targetId = id; } var name = ''; if (connectInfo && connectInfo.name) name = connectInfo.name; var includeTlsChannelId = !!(connectInfo && connectInfo.includeTlsChannelId); var portId = messagingNatives.OpenChannelToExtension(targetId, name, includeTlsChannelId); if (portId >= 0) return messaging.createPort(portId, name); }); // // Privileged APIs. // if (contextType != 'BLESSED_EXTENSION') return; apiFunctions.setHandleRequest('connectNative', function(nativeAppName) { var portId = messagingNatives.OpenChannelToNativeApp(nativeAppName); if (portId >= 0) return messaging.createPort(portId, ''); throw new Error('Error connecting to native app: ' + nativeAppName); }); apiFunctions.setCustomCallback('getBackgroundPage', function(name, request, callback, response) { if (callback) { var bg = runtimeNatives.GetExtensionViews(-1, -1, 'BACKGROUND')[0] || null; callback(bg); } }); apiFunctions.setCustomCallback('getPackageDirectoryEntry', getBindDirectoryEntryCallback()); }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This function is returned to DidInitializeServiceWorkerContextOnWorkerThread // then executed, passing in dependencies as function arguments. // // |backgroundUrl| is the URL of the extension's background page. // |wakeEventPage| is a function that wakes up the current extension's event // page, then runs its callback on completion or failure. // |logging| is an object equivalent to a subset of base/debug/logging.h, with // CHECK/DCHECK/etc. (function(backgroundUrl, wakeEventPage, logging) { 'use strict'; self.chrome = self.chrome || {}; self.chrome.runtime = self.chrome.runtime || {}; // Returns a Promise that resolves to the background page's client, or null // if there is no background client. function findBackgroundClient() { return self.clients.matchAll({ includeUncontrolled: true, type: 'window' }).then(function(clients) { return clients.find(function(client) { return client.url == backgroundUrl; }); }); } // Returns a Promise wrapper around wakeEventPage, that resolves on success, // or rejects on failure. function makeWakeEventPagePromise() { return new Promise(function(resolve, reject) { wakeEventPage(function(success) { if (success) resolve(); else reject('Failed to start background client "' + backgroundUrl + '"'); }); }); } // The chrome.runtime.getBackgroundClient function is documented in // runtime.json. It returns a Promise that resolves to the background page's // client, or is rejected if there is no background client or if the // background client failed to wake. self.chrome.runtime.getBackgroundClient = function() { return findBackgroundClient().then(function(client) { if (client) { // Background client is already awake, or it was persistent. return client; } // Event page needs to be woken. return makeWakeEventPagePromise().then(function() { return findBackgroundClient(); }).then(function(client) { if (!client) { return Promise.reject( 'Background client "' + backgroundUrl + '" not found'); } return client; }); }); }; }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webRequest API. if (!apiBridge) { var binding = require('binding').Binding.create('webRequest'); var webRequestEvent = require('webRequestEvent').WebRequestEvent; binding.registerCustomEvent(webRequestEvent); exports.$set('binding', binding.generate()); } // Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var CHECK = requireNative('logging').CHECK; var eventBindings = bindingUtil ? undefined : require('event_bindings'); var idGeneratorNatives = requireNative('id_generator'); var utils = require('utils'); var validate = bindingUtil ? undefined : require('schemaUtils').validate; var webRequestInternal = getInternalApi ? getInternalApi('webRequestInternal') : require('binding').Binding.create('webRequestInternal').generate(); function validateListenerArguments( eventName, extraArgSchemas, listenerArguments) { if (bindingUtil) bindingUtil.validateCustomSignature(eventName, listenerArguments); else validate(listenerArguments, extraArgSchemas); } function getUniqueSubEventName(eventName) { return eventName + '/' + idGeneratorNatives.GetNextId(); } function createSubEvent(name, argSchemas) { if (bindingUtil) { var supportsFilters = false; var supportsLazyListeners = true; return bindingUtil.createCustomEvent(name, undefined, supportsFilters, supportsLazyListeners); } return new eventBindings.Event(name, argSchemas); } // WebRequestEventImpl object. This is used for special webRequest events // with extra parameters. Each invocation of addListener creates a new named // sub-event. That sub-event is associated with the extra parameters in the // browser process, so that only it is dispatched when the main event occurs // matching the extra parameters. // Note: this is not used for the onActionIgnored event. // // Example: // chrome.webRequest.onBeforeRequest.addListener( // callback, {urls: 'http://*.google.com/*'}); // ^ callback will only be called for onBeforeRequests matching the filter. function WebRequestEventImpl(eventName, opt_argSchemas, opt_extraArgSchemas, opt_eventOptions, opt_webViewInstanceId) { if (typeof eventName != 'string') throw new Error('chrome.WebRequestEvent requires an event name.'); if (bindingUtil) bindingUtil.addCustomSignature(eventName, opt_extraArgSchemas); this.eventName = eventName; this.argSchemas = opt_argSchemas; this.extraArgSchemas = opt_extraArgSchemas; this.webViewInstanceId = opt_webViewInstanceId || 0; this.subEvents = []; if (eventBindings) { var eventOptions = eventBindings.parseEventOptions(opt_eventOptions); CHECK(!eventOptions.supportsRules, eventName + ' supports rules'); CHECK(eventOptions.supportsListeners, eventName + ' does not support listeners'); } } $Object.setPrototypeOf(WebRequestEventImpl.prototype, null); // Test if the given callback is registered for this event. WebRequestEventImpl.prototype.hasListener = function(cb) { return this.findListener_(cb) > -1; }; // Test if any callbacks are registered fur thus event. WebRequestEventImpl.prototype.hasListeners = function() { return this.subEvents.length > 0; }; // Registers a callback to be called when this event is dispatched. If // opt_filter is specified, then the callback is only called for events that // match the given filters. If opt_extraInfo is specified, the given optional // info is sent to the callback. WebRequestEventImpl.prototype.addListener = function(cb, opt_filter, opt_extraInfo) { // NOTE(benjhayden) New APIs should not use this subEventName trick! It does // not play well with event pages. See downloads.onDeterminingFilename and // ExtensionDownloadsEventRouter for an alternative approach. var subEventName = getUniqueSubEventName(this.eventName); // Note: this could fail to validate, in which case we would not add the // subEvent listener. validateListenerArguments(this.eventName, this.extraArgSchemas, $Array.slice(arguments, 1)); webRequestInternal.addEventListener( cb, opt_filter, opt_extraInfo, this.eventName, subEventName, this.webViewInstanceId); var subEvent = createSubEvent(subEventName, this.argSchemas); var subEventCallback = cb; if (opt_extraInfo && $Array.indexOf(opt_extraInfo, 'blocking') >= 0) { var eventName = this.eventName; var webViewInstanceId = this.webViewInstanceId; subEventCallback = function() { var requestId = arguments[0].requestId; try { var result = $Function.apply(cb, null, arguments); webRequestInternal.eventHandled( eventName, subEventName, requestId, webViewInstanceId, result); } catch (e) { webRequestInternal.eventHandled( eventName, subEventName, requestId, webViewInstanceId); throw e; } }; } else if ( opt_extraInfo && $Array.indexOf(opt_extraInfo, 'asyncBlocking') >= 0) { var eventName = this.eventName; var webViewInstanceId = this.webViewInstanceId; subEventCallback = function() { var details = arguments[0]; var requestId = details.requestId; var handledCallback = function(response) { webRequestInternal.eventHandled( eventName, subEventName, requestId, webViewInstanceId, response); }; $Function.apply(cb, null, [details, handledCallback]); }; } $Array.push(this.subEvents, {subEvent: subEvent, callback: cb, subEventCallback: subEventCallback}); subEvent.addListener(subEventCallback); }; // Unregisters a callback. WebRequestEventImpl.prototype.removeListener = function(cb) { var idx; while ((idx = this.findListener_(cb)) >= 0) { var e = this.subEvents[idx]; e.subEvent.removeListener(e.subEventCallback); if (e.subEvent.hasListeners()) { console.error( 'Internal error: webRequest subEvent has orphaned listeners.'); } $Array.splice(this.subEvents, idx, 1); } }; WebRequestEventImpl.prototype.findListener_ = function(cb) { for (var i in this.subEvents) { var e = this.subEvents[i]; if (e.callback === cb) { if (e.subEvent.hasListener(e.subEventCallback)) return i; console.error('Internal error: webRequest subEvent has no callback.'); } } return -1; }; WebRequestEventImpl.prototype.addRules = function(rules, opt_cb) { throw new Error('This event does not support rules.'); }; WebRequestEventImpl.prototype.removeRules = function(ruleIdentifiers, opt_cb) { throw new Error('This event does not support rules.'); }; WebRequestEventImpl.prototype.getRules = function(ruleIdentifiers, cb) { throw new Error('This event does not support rules.'); }; function WebRequestEvent() { privates(WebRequestEvent).constructPrivate(this, arguments); } // Our util code requires we construct a new WebRequestEvent via a call to // 'new WebRequestEvent', which wouldn't work well with calling a v8::Function. // Provide a wrapper for native bindings to call into. function createWebRequestEvent(eventName, opt_argSchemas, opt_extraArgSchemas, opt_eventOptions, opt_webViewInstanceId) { return new WebRequestEvent(eventName, opt_argSchemas, opt_extraArgSchemas, opt_eventOptions, opt_webViewInstanceId); } utils.expose(WebRequestEvent, WebRequestEventImpl, { functions: [ 'hasListener', 'hasListeners', 'addListener', 'removeListener', 'addRules', 'removeRules', 'getRules', ], }); exports.$set('WebRequestEvent', WebRequestEvent); exports.$set('createWebRequestEvent', createWebRequestEvent); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webViewRequest API. var binding = apiBridge || require('binding').Binding.create('webViewRequest'); var declarativeWebRequestSchema = requireNative('schema_registry').GetSchema('declarativeWebRequest'); var utils = bindingUtil ? undefined : require('utils'); var validate = bindingUtil ? undefined : require('schemaUtils').validate; function validateType(schemaTypes, typeName, value) { if (bindingUtil) { bindingUtil.validateType(typeName, value); } else { var schema = utils.lookup(schemaTypes, 'id', typeName); validate([value], [schema]); } } binding.registerCustomHook(function(api) { var webViewRequest = api.compiledApi; // Helper function for the constructor of concrete datatypes of the // declarative webRequest API. // Makes sure that |this| contains the union of parameters and // {'instanceType': 'declarativeWebRequest.' + typeId} and validates the // generated union dictionary against the schema for |typeId|. function setupInstance(instance, parameters, typeId) { for (var key in parameters) { if ($Object.hasOwnProperty(parameters, key)) { instance[key] = parameters[key]; } } var qualifiedType = 'declarativeWebRequest.' + typeId; instance.instanceType = qualifiedType; validateType(bindingUtil ? undefined : declarativeWebRequestSchema.types, qualifiedType, instance); } // Setup all data types for the declarative webRequest API from the schema. for (var i = 0; i < declarativeWebRequestSchema.types.length; ++i) { var typeSchema = declarativeWebRequestSchema.types[i]; var typeId = $String.replace(typeSchema.id, 'declarativeWebRequest.', ''); var action = function(typeId) { return function(parameters) { setupInstance(this, parameters, typeId); }; }(typeId); webViewRequest[typeId] = action; } }); if (!apiBridge) exports.$set('binding', binding.generate()); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var normalizeArgumentsAndValidate = require('schemaUtils').normalizeArgumentsAndValidate var sendRequest = require('sendRequest').sendRequest; var jsEvent = require('event_bindings').Event; function extendSchema(schema) { var extendedSchema = $Array.slice(schema); $Array.unshift(extendedSchema, {'type': 'string'}); return extendedSchema; } // TODO(devlin): Combine parts of this and other custom types (ChromeSetting, // ContentSetting, etc). function StorageArea(namespace, schema) { // Binds an API function for a namespace to its browser-side call, e.g. // storage.sync.get('foo') -> (binds to) -> // storage.get('sync', 'foo'). // Note that callback methods are handled sperately. var self = this; function bindApiFunction(functionName) { var rawFunSchema = $Array.filter(schema.functions, function(f) { return f.name === functionName; })[0]; // normalizeArgumentsAndValidate expects a function schema of the form // { name: , definition: }. var funSchema = { __proto__: null, name: rawFunSchema.name, definition: rawFunSchema }; self[functionName] = function() { var args = $Array.slice(arguments); args = normalizeArgumentsAndValidate(args, funSchema); return sendRequest( 'storage.' + functionName, $Array.concat([namespace], args), extendSchema(funSchema.definition.parameters), {__proto__: null, preserveNullInObjects: true}); }; } var apiFunctions = ['get', 'set', 'remove', 'clear', 'getBytesInUse']; $Array.forEach(apiFunctions, bindApiFunction); this.onChanged = new jsEvent('storage.' + namespace + '.onChanged'); } exports.$set('StorageArea', StorageArea); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var logging = requireNative('logging'); /** * Returns a function that logs a 'not available' error to the console and * returns undefined. * * @param {string} messagePrefix text to prepend to the exception message. */ function generateDisabledMethodStub(messagePrefix, opt_messageSuffix) { var message = messagePrefix + ' is not available in packaged apps.'; if (opt_messageSuffix) message = message + ' ' + opt_messageSuffix; return function() { console.error(message); return; }; } /** * Returns a function that throws a 'not available' error. * * @param {string} messagePrefix text to prepend to the exception message. */ function generateThrowingMethodStub(messagePrefix, opt_messageSuffix) { var message = messagePrefix + ' is not available in packaged apps.'; if (opt_messageSuffix) message = message + ' ' + opt_messageSuffix; return function() { throw new Error(message); }; } /** * Replaces the given methods of the passed in object with stubs that log * 'not available' errors to the console and return undefined. * * This should be used on methods attached via non-configurable properties, * such as window.alert. disableGetters should be used when possible, because * it is friendlier towards feature detection. * * In most cases, the useThrowingStubs should be false, so the stubs used to * replace the methods log an error to the console, but allow the calling code * to continue. We shouldn't break library code that uses feature detection * responsibly, such as: * if(window.confirm) { * var result = window.confirm('Are you sure you want to delete ...?'); * ... * } * * useThrowingStubs should only be true for methods that are deprecated in the * Web platform, and should not be used by a responsible library, even in * conjunction with feature detection. A great example is document.write(), as * the HTML5 specification recommends against using it, and says that its * behavior is unreliable. No reasonable library code should ever use it. * HTML5 spec: http://www.w3.org/TR/html5/dom.html#dom-document-write * * @param {Object} object The object with methods to disable. The prototype is * preferred. * @param {string} objectName The display name to use in the error message * thrown by the stub (this is the name that the object is commonly referred * to by web developers, e.g. "document" instead of "HTMLDocument"). * @param {Array} methodNames names of methods to disable. * @param {Boolean} useThrowingStubs if true, the replaced methods will throw * an error instead of silently returning undefined */ function disableMethods(object, objectName, methodNames, useThrowingStubs) { $Array.forEach(methodNames, function(methodName) { logging.DCHECK($Object.getOwnPropertyDescriptor(object, methodName), objectName + ': ' + methodName); var messagePrefix = objectName + '.' + methodName + '()'; $Object.defineProperty(object, methodName, { configurable: false, enumerable: false, value: useThrowingStubs ? generateThrowingMethodStub(messagePrefix) : generateDisabledMethodStub(messagePrefix) }); }); } /** * Replaces the given properties of the passed in object with stubs that log * 'not available' warnings to the console and return undefined when gotten. If * a property's setter is later invoked, the getter and setter are restored to * default behaviors. * * @param {Object} object The object with properties to disable. The prototype * is preferred. * @param {string} objectName The display name to use in the error message * thrown by the getter stub (this is the name that the object is commonly * referred to by web developers, e.g. "document" instead of * "HTMLDocument"). * @param {Array} propertyNames names of properties to disable. * @param {?string=} opt_messageSuffix An optional suffix for the message. * @param {boolean=} opt_ignoreMissingProperty True if we allow disabling * getters for non-existent properties. */ function disableGetters(object, objectName, propertyNames, opt_messageSuffix, opt_ignoreMissingProperty) { $Array.forEach(propertyNames, function(propertyName) { logging.DCHECK(opt_ignoreMissingProperty || $Object.getOwnPropertyDescriptor(object, propertyName), objectName + ': ' + propertyName); var stub = generateDisabledMethodStub(objectName + '.' + propertyName, opt_messageSuffix); stub._is_platform_app_disabled_getter = true; $Object.defineProperty(object, propertyName, { configurable: true, enumerable: false, get: stub, set: function(value) { var descriptor = $Object.getOwnPropertyDescriptor(this, propertyName); if (!descriptor || !descriptor.get || descriptor.get._is_platform_app_disabled_getter) { // The stub getter is still defined. Blow-away the property to // restore default getter/setter behaviors and re-create it with the // given value. delete this[propertyName]; this[propertyName] = value; } else { // Do nothing. If some custom getter (not ours) has been defined, // there would be no way to read back the value stored by a default // setter. Also, the only way to clear a custom getter is to first // delete the property. Therefore, the value we have here should // just go into a black hole. } } }); }); } /** * Replaces the given properties of the passed in object with stubs that log * 'not available' warnings to the console when set. * * @param {Object} object The object with properties to disable. The prototype * is preferred. * @param {string} objectName The display name to use in the error message * thrown by the setter stub (this is the name that the object is commonly * referred to by web developers, e.g. "document" instead of * "HTMLDocument"). * @param {Array} propertyNames names of properties to disable. */ function disableSetters(object, objectName, propertyNames, opt_messageSuffix) { $Array.forEach(propertyNames, function(propertyName) { logging.DCHECK($Object.getOwnPropertyDescriptor(object, propertyName), objectName + ': ' + propertyName); var stub = generateDisabledMethodStub(objectName + '.' + propertyName, opt_messageSuffix); $Object.defineProperty(object, propertyName, { configurable: false, enumerable: false, get: function() { return; }, set: stub }); }); } // Disable benign Document methods. disableMethods(Document.prototype, 'document', ['open', 'close']); disableMethods(Document.prototype, 'document', ['clear']); // Replace evil Document methods with exception-throwing stubs. disableMethods(Document.prototype, 'document', ['write', 'writeln'], true); // Disable history. Object.defineProperty(window, "history", { value: {} }); // Note: we just blew away the history object, so we need to ignore the fact // that these properties aren't defined on the object. disableGetters(window.history, 'history', ['back', 'forward', 'go', 'length', 'pushState', 'replaceState', 'state'], null, true); // Disable find. disableMethods(window, 'window', ['find']); // Disable modal dialogs. Shell windows disable these anyway, but it's nice to // warn. disableMethods(window, 'window', ['alert', 'confirm', 'prompt']); // Disable window.*bar. disableGetters(window, 'window', ['locationbar', 'menubar', 'personalbar', 'scrollbars', 'statusbar', 'toolbar']); // Disable window.localStorage. // Sometimes DOM security policy prevents us from doing this (e.g. for data: // URLs) so wrap in try-catch. try { disableGetters(window, 'window', ['localStorage'], 'Use chrome.storage.local instead.'); } catch (e) {} function disableDeprectatedDocumentFunction() { // Deprecated document properties from // https://developer.mozilla.org/en/DOM/document. // Disable document.all so that platform apps can not access. delete Document.prototype.all disableGetters(document, 'document', ['alinkColor', 'all', 'bgColor', 'fgColor', 'linkColor', 'vlinkColor'], null, true); } // The new document may or may not already have been created when this script is // executed. In the second case, the current document is still the initial empty // document. There are no way to know whether 'document' refers to the old one // or the new one. That's why, the deprecated document properties needs to be // disabled on the current document and potentially on the new one, if it gets // created. disableDeprectatedDocumentFunction(); window.addEventListener('readystatechange', function(event) { if (document.readyState == 'loading') disableDeprectatedDocumentFunction(); }, true); // Disable onunload, onbeforeunload. disableSetters(window, 'window', ['onbeforeunload', 'onunload']); var eventTargetAddEventListener = EventTarget.prototype.addEventListener; EventTarget.prototype.addEventListener = function(type) { var args = $Array.slice(arguments); // Note: Force conversion to a string in order to catch any funny attempts // to pass in something that evals to 'unload' but wouldn't === 'unload'. var type = (args[0] += ''); if (type === 'unload' || type === 'beforeunload') generateDisabledMethodStub(type)(); else return $Function.apply(eventTargetAddEventListener, this, args); }; /* * Copyright 2014 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * This stylesheet is used to apply Chrome system fonts to all extension pages. */ body { font-family: $FONTFAMILY; font-size: $FONTSIZE; } /* * Copyright 2014 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * A style sheet for Chrome apps. */ @namespace "http://www.w3.org/1999/xhtml"; body { -webkit-user-select: none; cursor: default; font-family: $FONTFAMILY; font-size: $FONTSIZE; } webview, appview { display: inline-block; width: 300px; height: 300px; } html, body { overflow: hidden; } img, a { -webkit-user-drag: none; } [contenteditable], input { -webkit-user-select: auto; } /* * Copyright 2014 The Chromium Authors. All rights reserved. * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. * * This stylesheet is used to apply Chrome styles to extension pages that opt in * to using them. * * These styles have been copied from ui/webui/resources/css/chrome_shared.css * and ui/webui/resources/css/widgets.css *with CSS class logic removed*, so * that it's as close to a user-agent stylesheet as possible. * * For example, extensions shouldn't be able to set a .link-button class and * have it do anything. * * Other than that, keep this file and chrome_shared.css/widgets.cc in sync as * much as possible. */ body { color: #333; cursor: default; /* Note that the correct font-family and font-size are set in * extension_fonts.css. */ /* This top margin of 14px matches the top padding on the h1 element on * overlays (see the ".overlay .page h1" selector in overlay.css), which * every dialogue has. * * Similarly, the bottom 14px margin matches the bottom padding of the area * which hosts the buttons (see the ".overlay .page * .action-area" selector * in overlay.css). * * Both have a padding left/right of 17px. * * Note that we're putting this here in the Extension content, rather than * the WebUI element which contains the content, so that scrollbars in the * Extension content don't get a 6px margin, which looks quite odd. */ margin: 14px 17px; } p { line-height: 1.8em; } h1, h2, h3 { -webkit-user-select: none; font-weight: normal; /* Makes the vertical size of the text the same for all fonts. */ line-height: 1; } h1 { font-size: 1.5em; } h2 { font-size: 1.3em; margin-bottom: 0.4em; } h3 { color: black; font-size: 1.2em; margin-bottom: 0.8em; } a { color: rgb(17, 85, 204); text-decoration: underline; } a:active { color: rgb(5, 37, 119); } /* Default state **************************************************************/ :-webkit-any(button, input[type='button'], input[type='submit']), select, input[type='checkbox'], input[type='radio'] { -webkit-appearance: none; -webkit-user-select: none; background-image: linear-gradient(#ededed, #ededed 38%, #dedede); border: 1px solid rgba(0, 0, 0, 0.25); border-radius: 2px; box-shadow: 0 1px 0 rgba(0, 0, 0, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75); color: #444; font: inherit; margin: 0 1px 0 0; outline: none; text-shadow: 0 1px 0 rgb(240, 240, 240); } :-webkit-any(button, input[type='button'], input[type='submit']), select { min-height: 2em; min-width: 4em; /* The following platform-specific rule is necessary to get adjacent * buttons, text inputs, and so forth to align on their borders while also * aligning on the text's baselines. */ padding-bottom: 1px; } :-webkit-any(button, input[type='button'], input[type='submit']) { -webkit-padding-end: 10px; -webkit-padding-start: 10px; } select { -webkit-appearance: none; -webkit-padding-end: 20px; -webkit-padding-start: 6px; /* OVERRIDE */ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAQAAACxSAwfAAAAUUlEQVR4AWP4TxREZkYxpKHAKKzKEhOZvyG4zN8SE7Eq+6+wYCHbTwiT7eeChf8VsFsKVQhTxIDDbVCFfF8ginApgyp82wRShEcZVJIVzoJDAGqrgIJGRl20AAAAAElFTkSuQmCC), linear-gradient(#ededed, #ededed 38%, #dedede); background-position: right center; background-repeat: no-repeat; } html[dir='rtl'] select { background-position: center left; } input[type='checkbox'] { height: 13px; position: relative; vertical-align: middle; width: 13px; } input[type='radio'] { /* OVERRIDE */ border-radius: 100%; height: 15px; position: relative; vertical-align: middle; width: 15px; } /* TODO(estade): add more types here? */ input[type='number'], input[type='password'], input[type='search'], input[type='text'], input[type='url'], input:not([type]), textarea { border: 1px solid #bfbfbf; border-radius: 2px; box-sizing: border-box; color: #444; font: inherit; margin: 0; /* Use min-height to accommodate addditional padding for touch as needed. */ min-height: 2em; padding: 3px; outline: none; /* For better alignment between adjacent buttons and inputs. */ padding-bottom: 4px; } input[type='search'] { -webkit-appearance: textfield; /* NOTE: Keep a relatively high min-width for this so we don't obscure the end * of the default text in relatively spacious languages (i.e. German). */ min-width: 160px; } /* Checked ********************************************************************/ input[type='checkbox']:checked::before { -webkit-user-select: none; background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAALCAQAAAADpb+tAAAAZ0lEQVR4AWNAA2xAiAXEM8xiMEAXVGJYz7AZCFEkmBi6wYKtEC4/gxqY9gILrmYQhwiXMWxkiAVyVoOFfSCCpkAmCK4Fk+1QA4GqekECUAMkka0KY9gIFvZDd5oawwyGBqACdIDqOwAQzBnTWnnU+gAAAABJRU5ErkJggg==); background-size: 100% 100%; content: ''; display: block; height: 100%; width: 100%; } input[type='radio']:checked::before { background-color: #666; border-radius: 100%; bottom: 3px; content: ''; display: block; left: 3px; position: absolute; right: 3px; top: 3px; } /* Hover **********************************************************************/ :enabled:hover:-webkit-any( select, input[type='checkbox'], input[type='radio'], :-webkit-any( button, input[type='button'], input[type='submit'])) { background-image: linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0); border-color: rgba(0, 0, 0, 0.3); box-shadow: 0 1px 0 rgba(0, 0, 0, 0.12), inset 0 1px 2px rgba(255, 255, 255, 0.95); color: black; } :enabled:hover:-webkit-any(select) { /* OVERRIDE */ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAQAAACxSAwfAAAAUUlEQVR4AWP4TxREZkYxpKHAKKzKEhOZvyG4zN8SE7Eq+6+wYCHbTwiT7eeChf8VsFsKVQhTxIDDbVCFfF8ginApgyp82wRShEcZVJIVzoJDAGqrgIJGRl20AAAAAElFTkSuQmCC), linear-gradient(#f0f0f0, #f0f0f0 38%, #e0e0e0); } /* Active *********************************************************************/ :enabled:active:-webkit-any( select, input[type='checkbox'], input[type='radio'], :-webkit-any( button, input[type='button'], input[type='submit'])) { background-image: linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7); box-shadow: none; text-shadow: none; } :enabled:active:-webkit-any(select) { /* OVERRIDE */ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAQAAACxSAwfAAAAUUlEQVR4AWP4TxREZkYxpKHAKKzKEhOZvyG4zN8SE7Eq+6+wYCHbTwiT7eeChf8VsFsKVQhTxIDDbVCFfF8ginApgyp82wRShEcZVJIVzoJDAGqrgIJGRl20AAAAAElFTkSuQmCC), linear-gradient(#e7e7e7, #e7e7e7 38%, #d7d7d7); } /* Disabled *******************************************************************/ :disabled:-webkit-any( button, input[type='button'], input[type='submit']), select:disabled { background-image: linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6); border-color: rgba(80, 80, 80, 0.2); box-shadow: 0 1px 0 rgba(80, 80, 80, 0.08), inset 0 1px 2px rgba(255, 255, 255, 0.75); color: #aaa; } select:disabled { /* OVERRIDE */ background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAAICAQAAACxSAwfAAAASUlEQVR4AWP4TxREZkYxpKHAKKzKEhMb/iPDxESsyv4rLFiIULRg4X8F7JaCFSIUMeBwG1QhTBEuZVCFb5tAivAog0qywllwCAAavoiLhz+UlAAAAABJRU5ErkJggg==), linear-gradient(#f1f1f1, #f1f1f1 38%, #e6e6e6); } input:disabled:-webkit-any([type='checkbox'], [type='radio']) { opacity: .75; } input:disabled:-webkit-any([type='password'], [type='search'], [type='text'], [type='url'], :not([type])) { color: #999; } /* Focus **********************************************************************/ :enabled:focus:-webkit-any( select, input[type='checkbox'], input[type='number'], input[type='password'], input[type='radio'], input[type='search'], input[type='text'], input[type='url'], input:not([type]), :-webkit-any( button, input[type='button'], input[type='submit'])) { /* OVERRIDE */ -webkit-transition: border-color 200ms; /* We use border color because it follows the border radius (unlike outline). * This is particularly noticeable on mac. */ border-color: rgb(77, 144, 254); outline: none; } /* Checkbox/radio helpers ****************************************************** * * .checkbox and .radio classes wrap labels. Checkboxes and radios should use * these classes with the markup structure: * *
* *
*/ :-webkit-any(.checkbox, .radio) label { /* Don't expand horizontally: . */ align-items: center; display: inline-flex; padding-bottom: 7px; padding-top: 7px; } :-webkit-any(.checkbox, .radio) label input { flex-shrink: 0; } :-webkit-any(.checkbox, .radio) label input ~ span { -webkit-margin-start: 0.6em; /* Make sure long spans wrap at the same horizontal position they start. */ display: block; } :-webkit-any(.checkbox, .radio) label:hover { color: black; } label > input:disabled:-webkit-any([type='checkbox'], [type='radio']) ~ span { color: #999; } N0E+X$6TJdr3ɣ !xsMW3"vuuQ2fwxIqƻ#f Qå$!2 R$&\P5- a; w [pΆ붠J9 1T&څx-$X2W@`O>ݟY:m_xJ>Eiduޝ+A[9à>D*CNP3;PTk*+mdJbA0bJ5e"eiTA~XcrwmG1+pUVD~>~ۆy7\BKpJpIv+z{B8R ?."a2/E"šL  r 756(TS[~7=A͝0o 1H·`+/4E0BY,3{|ʲUC-@n8 QӻÜ bU$u"^9Kֿ,plUu{*UpjF?JԌ$:5TK¥3v*`оZKr[mc QƆ\%xBeqT6:Ϭkڸ6'&Z}YE&8ʒNZ-Z_-G$An0E:Tv!)-Mu\5P8F"&C }i.m!9 ?Ⱦ[#E`N_n>V#Ɏ=zBɰXS%} 2k I!brva`p*a8!? h.HfߪM˓a=tv6%rv%!"A̶{M$tu}kw^P&άC7OSES_NA )C7L  rv ;WfƊ56(TS[ mnzOsyY.+,˛ojbR~r`N[dOCOCUVWQw 1Ecq$9īWBO1ojV 0# VKs8 W 'W;N7n:K"dI E9M|H$ً$ן?UqءN~/QaB5d;8v^kLrVAҺ`P*! jP^QL=<>/)l](:BBZF( $A8Zɻ%6 nWJ {R p"bAdެZѥX- ' qCUHes^آeØydS`Յ4$"t9`%.NjSޣ^ٽYLnOqTL_:xѼהLHǑ#>,Fz7ܸ54f[p/Z-g˺*(؆pUԂϛKBYNg"NY=G稯棸$0΅+~j qclv6a&F: ВP(k.\ʿ ܓ.3@K;?ܩkEca!V |&K{&R2=4,t#pc2 rYNrPKDU1loW#i?i0C|x/R`Hnw%n$IE(c% ]-`cb]дv\VàƟTLa W 2>' h~>ly?K*n9S6{bT[4U$nsB` 17ȫ8UXc_XԶx3~PGj82Z|#2l_>Gpg~\vΎ'l}2fu`*%%IFޒܱNFbJ4a$KPC+wLi>F6`2b:/@P%CDiu=3x5}uѷ_}PZ;JxS,1:Y$~aCvDg(oHt1f(?7jٱ@/(k 0G1*VB/F gG nGp JY *?-ЕjݯK~$KR-2BD:eMck@I/q>m zuB8 ߉"avr 6:)l,3p 2l cP[m; +tPMmi=A<,򲼀ށbC-^M,ax1?KsVWQ4C r^7B-/1ojHPM~w'// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. /** @typedef {Document|DocumentFragment|Element} */ let ProcessingRoot; /** * @fileoverview This is a simple template engine inspired by JsTemplates * optimized for i18n. * * It currently supports three handlers: * * * i18n-content which sets the textContent of the element. * * * * * i18n-options which generates
Pages
Extensions
Apps
Shared workers
Service workers
Other