Discover millions of ebooks, audiobooks, and so much more with a free trial

Only $11.99/month after trial. Cancel anytime.

Groovy in Action
Groovy in Action
Groovy in Action
Ebook1,786 pages19 hours

Groovy in Action

Rating: 0 out of 5 stars

()

Read preview

About this ebook

Summary

Groovy in Action, Second Edition is a thoroughly revised, comprehensive guide to Groovy programming. It introduces Java developers to the dynamic features that Groovy provides, and shows how to apply Groovy to a range of tasks including building new apps, integration with existing code, and DSL development. Covers Groovy 2.4.

Purchase of the print book includes a free eBook in PDF, Kindle, and ePub formats from Manning Publications.

About the Technology

In the last ten years, Groovy has become an integral part of a Java developer's toolbox. Its comfortable, common-sense design, seamless integration with Java, and rich ecosystem that includes the Grails web framework, the Gradle build system, and Spock testing platform have created a large Groovy community

About the Book

Groovy in Action, Second Edition is the undisputed definitive reference on the Groovy language. Written by core members of the Groovy language team, this book presents Groovy like no other can—from the inside out. With relevant examples, careful explanations of Groovy's key concepts and features, and insightful coverage of how to use Groovy in-production tasks, including building new applications, integration with existing code, and DSL development, this is the only book you'll need. Updated for Groovy 2.4.

Some experience with Java or another programming language is helpful. No Groovy experience is assumed.

What's Inside
  • Comprehensive coverage of Groovy 2.4 including language features, libraries, and AST transformations
  • Dynamic, static, and extensible typing
  • Concurrency: actors, data parallelism, and dataflow
  • Applying Groovy: Java integration, XML, SQL, testing, and domain-specific language support
  • Hundreds of reusable examples

About the Authors
Authors Dierk König, Paul King, Guillaume Laforge, Hamlet D'Arcy, Cédric Champeau, Erik Pragt, and Jon Skeet are intimately involved in the creation and ongoing development of the Groovy language and its ecosystem.
Table of Contents
    PART 1 THE GROOVY LANGUAGE
  1. Your way to Groovy
  2. Overture: Groovy basics
  3. Simple Groovy datatypes
  4. Collective Groovy datatypes
  5. Working with closures
  6. Groovy control structures
  7. Object orientation, Groovy style
  8. Dynamic programming with Groovy
  9. Compile-time metaprogramming and AST transformations
  10. Groovy as a static language
  11. PART 2 AROUND THE GROOVY LIBRARY
  12. Working with builders
  13. Working with the GDK
  14. Database programming with Groovy
  15. Working with XML and JSON
  16. Interacting with Web Services
  17. Integrating Groovy
  18. PART 3 APPLIED GROOVY
  19. Unit testing with Groovy
  20. Concurrent Groovy with GPars
  21. Domain-specific languages
  22. The Groovy ecosystem
LanguageEnglish
PublisherManning
Release dateJun 3, 2015
ISBN9781638352877
Groovy in Action

Related to Groovy in Action

Related ebooks

Programming For You

View More

Related articles

Reviews for Groovy in Action

Rating: 0 out of 5 stars
0 ratings

0 ratings0 reviews

What did you think?

Tap to rate

Review must be at least 10 words

    Book preview

    Groovy in Action - Cédric Champeau

    rabook_preview_excerpt.htmlKoY&W,1@CH9I+*QʜBa`~݂f 屪m0^ b6~ɜ;^fN*jѳEU>?MU?(7*[O^URyV$+eN,'e5wUV,r4?6+W%Ӣ/Ӳ'&wi풫;:pV/+lix\,\U'󬞕m2^\\vsSkMlu]VʢIgXTC17Lsq,͓4wur6iլ]? ku<4_>Ʊ>&oGG7X|Srߒ:g~[%:"OdݿEf%1ÕTM^S7|>9Lζ\J0)vbrwЈؤ=N/0 Ӿ)>ڐs>D<e*MhmC)7xg jl>)BlghA mzƾgXvy29=(x<@;A SzH5]r:{56"B#P+µ%=SOh(UBXdW+瑝m+Xz%rW"cr60#E*~5WL,ѵڝYjq|ǔ*dž/* <m4x-+"v=o ,[czF5IP[#@=}&"ۇ QVio+2Qe! 3k8M2 >`g-4+f<)S-e9Npy+Q Nu7[>)!~L+E\F^pb^qfE\R%K[?/PR&Q}ʕPm4Fٍ'dNkxtyF,;2bx= N17x=5(篲9P9QWSq!01و:y }J;jVjA7.{כ oqC&Sǫ{B>ĮOޗ˴_VZ>ݝ̹-[c?f4ڂ&md5Pwp{HGh"F?FK3&(zSrƍ~9>2 ݪ}m,w9FI{sFGwt^mx~|;!YES78VepH*qK8YA 0TE0Oщ%E,^F<\}7.xkCpwonW<ӳOu,e9ԯF8z:ޑ_7 v.=TR zn=T8ֻ>9a*as;1=ńn.T,NCvњoԃؐ (MPQ9ok*OLl72Ld]GMhn6ևZj!F~% =s{4ZpۋNO\]CmCzV3ݳv-b^x{ j޽`Q]i4O0cޭ>zYɑ|q<>.|r!GN].#ίҼUyYb,hvsz²o~B}Ȣ@on0c]R`Xύؚ;>gAaWwNZ2[EI-Bur/R:[Cf?#"e9bDR{]ޙ&X-SUQkp720H@^mE󭘍]5y#<_B~/PC&SfĒzktc 52m XWi6~gc~43h׾7.гҘ 8*c@ eC'4f潇EZW|F7'b.L-~:i gOcldn̗'q q>|t7Jyߧq WMSY!:NOďH'Ȧ'zm:N04[)ç?io-,Uz1 RƼOS-?_Dp, S| */ 3p iXU<+ΟM+{!y 2 ]$4DY"нpU: @ 1¿?rI<Vt**N|EX^ӑ'{FkPb8c7pjv .rO>$&: lS}z0Jiq88\Tn7"Cݷa=ګ-o) |> بGaT[K1h!)ex:.=A3[w*+@G.b`ɱL2^:.g7d_?"Ѐr{(G=],Q!T;eJ89u쬚 B7^羑)k.hb}e1|A50|L篫гwy8[>S'{G~ܫ(8:2@,{>(ӢD| "y7->>(݈`O<8 `P'0FڏhHaF;>(r R>.΅AȐx_ ť n<_Z_#mpZ47]# @s⍈&ףǑɱ|9,`(0w7 ~ah ;G> "CɊ!"^CswˑqO:+2M)\͋9Lp&J*/*Xgtڻ͌r^^ǖ _Xfq唃EyeSn'ѱ b?|N5ڊxϿ>Ru9~:7nRa^aOoUVTx3sdҡj_FQȕ.DGF'eIa{ݥ-ͽcáLW镈 /2Xw܄شe2:έ@t`f8V2 0~Uc GS11QGNK};XzbXçvE_B$՝|$ |_= 7}`W8mrV d(ыaO$j-=w.yV|FG{sB@@u'٣,j !v3@KYƇ޸M416Lɻ7zd.͉MiQ2^}au%( :3i.eaC=>Fae{c,2BxJ@z10#TClMG4)7!P6$$._s0* I;cOx4(:gc=X<< =*gi>̑#|huG,tݚ { lн7Wpk}V^d_o`8ճMدX8ZM7zdq<l0ɢSM ңCp(Tã& m1n% qiE}-#|q!/B'|~nNoT>fHCOc#yS*tےb?k /_>13}kurn{O9nNVdu E`ľ#ԢdކAF)lx4Ѡ䑹iټra >2Fxuٌ<{|WT+U~/ߺG]]XL\7Wޯvp dGœW32$JLy 0< 7y=Z]a% +ӑkh)13KO!gU6tweG[Hi>n%*3?NB}ALd:Xk"2i[}Ind_r|,Y29ŧD{׽x^dl!;ҎOHсGtgyͬl⶧qjKѯ(PjcUB#1zvЊ7?'\|N\Ix:WeiGYܦHTG5WI^ 3 B[2y$"GۏnKU癭yjb"CH{Y;>oBƊ@,L6qGXvN|kCy$8ᷦ0f"u/f>PiS/QhRUY+ϲ3_+ b֬nhO?=Ĭ8 82P{e·(?5Ʋ)5x;z)]ڟ^™e8ObB#>B$ޱo|P)˿K7OG1EP"1P-'W;L- 7-F |VwsҞt7 y/!z턕D=WGd/_sj"4&$6wa=Xȉ-Q3H>\F[}b#yr{ |)FzMy-C+K 2_7A%eY{Ls"lM~ #j'%)yw1WU^?K=}AQ ~0nne6Np:"+s˸Xs3rK햑MQ B -p.l}|wQ{b,ʼXml=|Z$⮬ OOG1E__z z׌uPE)P @9OW .ۮ4  gm0UuI0tSjKuC.$^}xp_]k&Fv9 AϹzk5|迀pEkvYk' -`&cx`<<( i7 Xi葈߄Z䲩##{"֌ލbO_PU |2MgMl\߼ 團,&)L_)c s+MlQ, S"a:[fx0w#I+ #I?)©͗ϧ_~|>|Rhy2ﶾ8c"ae 1.%}.-N.A-eu˒9b[hUţD"K2KaX&*:6.2ӭмXnV\mgPz5Eoie]of)Ff MzEkЭ>V 5f&DYz/Bځ(X$̄ke 1>'kRZS'**rhX?A鵠|''%lώ &? >M 9~kȠP~@bI"t&5vp0kɭ K|F^Y`fLx0冑eșh3lǛ"y˾ɬrg;_g /Ȩkz|^%ء`1U@vbu?<4?xeYnfH6RotɫlфcA=;<)p&ywuLəhɗɏoEwuV֯ל5)*@׶]F~RKi0@%EުNr"LNjwo>J^|>?se矓%㦍obϊ14>Ҥп؟6 1}B&Z%W0/yC4|"`ji" Ƶ&RlL{\``-jLmf$7(/ͽ{9]BeܥI{x ziuA]S4C;r<N&-ߚtuhPeВLkb Z}6CZT'wK9 aizB:m&vY̚&TYyLu yÛE/;RC:Jچ݆Okxj; >GǑH 9`d VOCLBJ!C 64Ъ㋘q|vBMϦZ\ۏmfuSdMMzl`#݇24=13GEKLj#|Xg&ZE DjIRy~PP}'!n;ݫ:v}-Dt"nQXe5=0N (3ҵ2) ^L]6<yC>%-JHFT5$n}>iWw1TAH̜6lm lF85^䪕X5c  ۸РЈ sBAEn7'NV="3SzU넨:')EgSBa'UCT!(X='kB߭*<٥DEa-K:rS9`˙,1U`4^fpx a}Βr(PE7Z|Mͪz D^ep8_-YMV+ddW_^FU%(v㨟q9ϗ(iJk]> ^rġ9:-k*Č#;X0WvB/jXI8Q_D]n5 r= vHJs:xBke&ȸ](̉b{fz-r#LYV3q*+8y/,xrt PdL5<*jU8]_.kN} sH whY3ADVu5JLh-2tL:&Ԩښ"p 3&b(lS+R꭮bj|z /JKSľ0Ť֏6 ߂c1MXi;.(+sӁUo @ -ȆUC`&ceɃ&췝@ëH#LU3k2A$P.hC+93]a.w ~vw"q@{JSD3uM1,Zp(L΂7HdU>!0VC_ѠI*Dj4wt "{a3j`S;(} `eg x}:8 dH2SPN,H*SS?M$cobdڔmtHW5 UJ-4(t8C֡Ϥ,g>+L3R]hX6WMKpy-lW*{rde'RBʔ:xD'S< >Z_Kأy~us;yUlKz|D#&Z;0zVFyY# zBJ+\"r,oU[ܝЈ]6Ӷ`lCm=czayI^Ԁ،Ul&0#`PD=/ 8i?$/^WlX1>1Jk;j Fy$iAFI2& әK}۽!*eEʔzwݣSpP{ R?j{2|.nGL:[ &qx&0 zgK T =d"9CxA~3KH#pE!9co^}:]#cU>̍aa5XiU[Q;W;b164\3u7P[﵏ оtsշ;-T#\l& W'#h: e[83LӋ9XzTeJjl\nP*oQoЕ*|b$?gE9Gd[yXo_ xё{Y r]zt'2ߦjw: UWe5*:#"B}RJ HŎOV=#:z\9gTOH;O?D 7p8۩ / JT?¬`Լ>*fz|9){ ^p뽤P7Yi$Z4,j^vvl ,<6dfR)K~6g=HnpP>FĢr~_,):jjnjch EfqMϘ'4_gtrg 6Ŋ;M^&hqDG+=+/bu$ UëtZ)RʟDU%nzjYz-qy^˧Ć}Mɾ>%\'Y yH˷r-1ZhALV"5J '06OI Br.1Y.CfS/YWm dUZhK9Q92DY^Xm!VZނV\SH4%)~̡ OY3/J0hr@%Ier>G7VgWiefe-ku+=FNJܱ]{aiLhN$gT> PBpLBc3f _[l.t dV>˼Ӛ\3 ѱ\kK#6X΁"ߩ^qVjo(Ge4Cpf (1HDJ4 m1ZܲL<ÕbՑiPti Kiٯp6o3eU^k2C+wi[A57/xCw$B @ 0tqppTx@: Uk=K&$r)d sYѿ&\N"<7`s_4ry #GZͅKy]Ob@m+U Վ7vA.xb&Y-]5E.6WGV-;K`q10Ts;X:{CTh, [6YD/倗! vK1Y`aFҪv/H!*PۛE}I#2ӮDw;!S9Ъ\]q>W+m]u9:O H( fOFMTf>FSY:kKiE)W98 n)~MWtf-G@ُeYNxct@eǁJGTՁщ(WUcXpϑY^( =Ih*eỌH7=.\HM_< kpJʺ23Wd;*'Dεq/YuU$"Q>s.Nv͔+DPz,@徝zu VcPJ?:NkyNj:Wb4jSέ#TviY6rv.׈kWq#:elRd:;|J[d!Ƽ7YG}/')}Ս*]ƴ =suEϲ-i:6`}JZ"lP`=Gh&&f-&lYՋeQ9>Af 4L d O>%{e5v \3ZU7:e4ǟW Y+kJ( ]M?e\̅!;rlosjM+N`G#k ~q#'/CjJWYpGlFjywa!<ZȎnnǔL @y1tBlLI|cnPGw2Sm`16+I)!9v/U!s9 k øRYκ9L*fjHߏ^$ضGn8=( vn|b(_CY1V]gKeJ꠫X>:"5d܍iKWZ.\9isr0ZٴKBrۏE;Ρ^d DtMSүrk <%Mi]DY'bND"BW&¼KQ\t<$OuP"=ZT˟I=0Db;[^`X70lZ~T1^WJMa1۞B}B\d0!~-gH>0hZޅn-W%vF:ͼ_CO Jac+YSw 2Tn/3z`Az4QG,)^lܫ7yL-֚-rL:nN$頟X_9u|0tbG'-mE͍/ -{[˄7=HKdO#Zu:;PU;zA3qgzuA]y T) o)tX`gIp!v\f4+We5k4R/VkM}mEw[3y.ae@z&3 t Yx |k?Vdv~mf2&I)Rj:(uwk3H:1ЎEY JVC#Mj"Sep9aL@}zunH2sG6 NGu F ߐ߭+RcHvs ްU um+eR!S9&Fp9͗͜iWʌ y΀1 Os\yfx AqM>> Q/Ltcq`6Ui?b|f~XK& J4#/(*1bg3_B;|kp|0g:9jmp;ҝQ">͐'l&%Hۆ: ArFm9Q~@[Oc=! rf.C>:%ePɡ "/NN8fEk}(6Ɇ| FEg6qBl@e97M@Ld j nH.M'aDx5;LwP>:?)ܢhO;{|,~˸i "PРD!\ed )'PTM}C5X}'Drb ݞ4ӬΛʗkJ<OxGhKI NXSמ+o@;EU1D.]aQ3VL]_ϘGEs5_&9EJpDNfvڵ-u Et9i+wLve@bmEXIkCxVGRjGWb1WhV0SrCr biB"Zxhچ4a|Gi5G&s+/IPS6 `{7ԁ[>SLFטϒ2㛣KyBҠth~wpO9+ʙUN*-SH>xIv974?eW]Y*,2ZXĞIMkҡ~^FhDj#VjFi*J/.W=,0ŏΠ(bs#h|yճu9PަnՆ ~&M((]9 ByXBSb砃><*~G2>Oަy@ME#-bjm5!bRC7yKPmIW[ToCy?}/H ČlWo2}j`x%Uzm@#f=>ੑhK *aժWG."CNV7 ;W7IV !.皆$@Ϛ׍6L, d^>aEB5'K*0ZS) !kN]N>xx?y-\Ք(sy~!pZ&/+l9N"|hPɘV`lW$b88GL)/Q#>[pH$apP.5iy+ۡ\(}ꦅa.|VW]M10 APnbss%x7擇q7͡UZ1|R#\T'#cUHkKP&-6VXnNsEy-]AZ %>,J'b<+9ըapIu+R*#ClэK46J`$0\l+2{刍SԂkR],EFМ΀dv>Z"_coE~\rvEU8:/nݷх]/j29(ڷ6Δs#! _ ^x`DLFޖo08NhwdhAk\[ !QPo_W-?mLbjn D0`m MIw0,q["1Gyյl[qpZFg "PҒ䨧wejGqOTE%T{)8\xE. mi:[v,1K¢d-sҥpi8̡ɬUV-ߴW/2 Wˍt|֊PIwq&ʙ4"-iا*ZANp>Tűj{b@t$5a=">n;I1냑t|/ƋvB.HIuBY w!CjѬ^{ՕJ&Y+kZerzfR\1.-i,WnD-f'7jCYoVnz0\W7Ez/w"J)A |~u0Xt=u]0C6ɛ(IDHݨ3H1TA8ضvzw7Rh0lOZ婣q*nd ؤPMr8~lg iO׸g|)=8ۯw4և޶M&e$SIB]ӆ32yY쫼c#;m?t)}Dž V. [=\,=Y9kȘ+@k)M]ϻJjq.fQ\/KHoeXA̐%W)DoR<#Q| 3#C+)eVC@I?Zܠf'D Pb\p6h\ BA<44L\Ch&+ bfmF5QV-vz!WH)5h]݌O+H 2(c?``dZy_Kj:Htz6txq7Y*cGUdg0>s0,fumTAvȪ}FEv_v@ MF`ʷ|JA!4XMS,ڴ2 ʩ/ߠ"qS8ωR]s ğꂓPӋ_;z`@$Vt#,jw[Bi3((R04PEX]Dbb Wcbޱ K-hVhu 7 f):,=LTIm9R6hN52R`½oB,Wc5w-O* bҨT!t8npxԚ[yexWO1LjTٖ\nYYlX.{7=_ӛwNz;}.1HƊ;u68)hNab 8D>J9/vz,-ߗ'ئY҃^,PF *w!:d:/ڂ ŋtI{&]iE2duj"#,ؙnPIM;fm'6w&=n U[#DY Q`d[Mcbi9}PR4wχ`Vf W:1McSvU6D8:v¬a `҇E-7/O:?I/T)wP[L7:|s1$)fiI<ӖcJP\mi34/º@mr b|zq]^;o칐 H f²:x]Ǜrݾxv 8]SXIZ9/gt$:Tߩ)jnw Y ܙ&sIz@=Ѯez<DNmd|9P<wk@a:۳(J$jGX<}}~7%Ơ9-afU_&m-:|醔O0shhxlR^z/韝ZQҡЈHhXR1륦m7gVvnJt-O7-1{ YK2i٩p@ ki&:YNL-؊s [H!m2.@}qZ  6LTEW! ׇ@{s&zGE;ʶ&orna 'JɬFXImW0fBGO>{;/Rici5`P!G,jfzB]&6Uu #K-X}r.=BƉro.mT,-:Սh7y?Y*/rx2ᯕC?/8RQc!J㭵&Ix0 1\y~wr IQp#:bF.A'߷l&lB ;Hfv/{Y_fӵ2kN"{c3P@`TC!&ڳ/ߛhDi$#߉ #MT%. ƉUί.C^&SY۬:=Zб>vfB(33`Q60"3iP:>>RL9Hc'JL C9Mw!ȳu֫h0.,DMj F9 5QkdϰezuvkE|*ݕA1l= ;2|RU1mW@%o;(pcдEɘARS+w U cki! D-KRЌ-Av(8ݪGE-ÊOz,QtrgP׽)Փ{ڹ]PU=\FuN.1K;XpL-OGLa^:=tz@mLx::C=ںsm>&H ɴAgXe@xH;A}H>Ph Xd6)JRw;X4eĨ;Yh7|$M{1xHo!5{nzQ ȷmOR=NÞ]7@M4}}/>1 e`tGB{iڤ*QVmpv;9f##R ɱLÅjȳ.;A{`<[25myʌw_ fG=ԼM=w!v pTµa߄bV{ҫbct'8;SK5eT! $V)S@P"9u* [+NW~4˳41G_o-tS\n ګ܌<7$kZ೎9u)ug*/(ڪBەv-7u+Y5|[ Ă) QZr`^~m(׻+yPGUe 9k/QhD;;ŲvVT>`ԑͷ/=w𫭿 ut _QrBMR zdA]gjQ{CYr Lv:+И &H#UeSjyQ;T:p#Kc˩;wݥPyڬz+"r30j6 7+8VE3cXf}:gR?؃]ݿС*Y*2Sȕ&z|ps ĕ.-JdگٹEO<`ruPdafA'Wkv):'ݰAbn6r\(j@R=L` n)YkU1 Yn\p 1Ot(5~Xmt fPJ9\]ե< 3ĶP-9,umB}m3ؑS\8&f+D4+5|@\)¶?8%D?$ELY0)$+l$=9:1XWǽCϘ.% YsZN:Zk&TݢE%p/joU 77gZu5!zX `i"xfً:wc$)YԿt Hr0?ЮR5*YlY㓋㼎C7*QGgua?: *?OrrDx{dJmt:Ŀdv۸@vN:;x8QXѭgY)' |IQ䵙$1W8_ZLeFêܨBBg ن3x'1o"T ;|W y 0wU 7mOk .uGh[򤩃҆-ʖ-8s>Κ n>-3,Hı, ]VdkDI 'UhFrxi!hO%XJpZ;ADi^=죆 Ӳ1CÌKüssWe ڒy6<@K͊Nk.y*ۓЈc;f`RUNQK!Sg.^8nr>+"mGD"O=k1ak_ uA#v5=,uhĦRsY[Kuժ\8)={Wu=$#8}WYV'#OYT[FI3jf.Ԇ!F}JRSQ X"':q\Vq-Oh`@z]PhS.i= ] ̧)27U9@Ծ \keT_[6hjU;DI*nV9aGPZS?mZj[ L 33Nsw'Y`WF.uˉwtyGF厨D{U$&iPsù|Pİ $F-&{nPA˽oAjf #?\Gvp]l+രdOR&UےѵǶqNB3ϑӾs9~l<8gWlYAtQ1]ţ݌`jm?R3aGf&.r-3J+ ,B) cC7=V>vpNȆpdj}~ګ{7~{M( ?_zv>Ns75eJggޥgJ꧆m\̀M_fizCw5*:egBH]G'wV:#VNΆ9!HL?S 9n01;Hͅ$e.1115ya{ t[xKt*Ww]KG5 L%`dv}PXF |gYeWQ0tL6sB$>֙(\82\%@70gaJp('uk +DM﫪CjLE4 k)uGBƵobCMJZy-\Ur"yl_lcx4%-c]F3'6~waW+F{皇޸JIZts)eq:Gg=n Ep$ y{wuAES:VMURdPOj6u]%IAVc $ۮzboKĚ+zϫvXeʒR5.Ӯl+x‹Y@96ǏwgT!n<#iUB~\XOovjOx:u91F)4so ۄ  d;`2$Y=EoO?:33*gr|8STyC[s,-1ZVZ?oψe([gfmx Jӝ!D10 xQ?=(2b7XL;?|~y j{Z_ˢ-?R{]+)wtd~ |g3.A5.ʀ$t{49S>˲PəU6(|ik{KWkgթٺzj7_:aB㬠u=aݢt#x.p\t|/[I1eҰδ5٘i6Σ^ʒy\ >zzɜ}ͅ)bER |7.<.xZh*KuGZ&ѲNAKS~|YLgZ~>: c⏚M}L( PFmKS}?&/2L0۹*:NU԰[Dhng.SP,t\s*EUQSu`,\{C+:tCK73k#dW@ZQӕl R l,Q `WuEu(1C]sW(O[OѻB%qrAزdQZvt+@ЪIu(ri&te(C/@aR<ɮϛAGf+]s Gcw_[L$ftЧYnZy=*v@IŬ0f֝y5:*[Z:փUyfԻBυt`״Vf4/}nPv݄i2B^Ӹl邓b86H2`;1`ZXDgְC{"Fovix_OǓx+ oV~MLբ&Qi'1V\Y  Ÿ- `^Exp@3O ( {c7T92>O^|+m09kX=94uW(4^&blzra\35a .fM;;/-6n/"bol7M}zFy"VL19.g>p| cy:G h*wmlµ'/{-`:Դ a}kl63Dcbc762HiL⥦?5M~Q},.+HGXA>1 xj܃j/txcFB b $:ujH !>qxIH๦CS97] Oia,F MԕWlQߥEmԕ؈zNm=SnEsԪ2Qk=.<8~dJzk*b,P vV$Ć"UrmA9Z‰2I}ƻ{yN?O WʸC43$k.7u+Kdf,ǩ9"58nW7֩`7q'
    Enjoying the preview?
    Page 1 of 1