From 9689c6bbd6b3703e63e3247d3387a26078871cda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=8C=BFDD?= Date: Tue, 14 Jun 2016 17:56:26 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E9=82=AE=E4=BB=B6=E5=8F=91?= =?UTF-8?q?=E9=80=81=EF=BC=9A=E7=AE=80=E5=8D=95=E9=82=AE=E4=BB=B6=E3=80=81?= =?UTF-8?q?=E9=99=84=E4=BB=B6=E9=82=AE=E4=BB=B6=E3=80=81=E5=B5=8C=E5=85=A5?= =?UTF-8?q?=E8=B5=84=E6=BA=90=E7=9A=84=E9=82=AE=E4=BB=B6=E3=80=81=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E9=82=AE=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Chapter4-5-1/pom.xml | 59 +++++++++++ .../main/java/com/didispace/Application.java | 13 +++ .../src/main/resources/application.properties | 6 ++ .../src/main/resources/templates/template.vm | 5 + .../java/com/didispace/ApplicationTests.java | 96 ++++++++++++++++++ Chapter4-5-1/weixin.jpg | Bin 0 -> 22635 bytes 6 files changed, 179 insertions(+) create mode 100644 Chapter4-5-1/pom.xml create mode 100644 Chapter4-5-1/src/main/java/com/didispace/Application.java create mode 100644 Chapter4-5-1/src/main/resources/application.properties create mode 100644 Chapter4-5-1/src/main/resources/templates/template.vm create mode 100644 Chapter4-5-1/src/test/java/com/didispace/ApplicationTests.java create mode 100644 Chapter4-5-1/weixin.jpg diff --git a/Chapter4-5-1/pom.xml b/Chapter4-5-1/pom.xml new file mode 100644 index 0000000..1640972 --- /dev/null +++ b/Chapter4-5-1/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + com.didispace + Chapter4-5-1 + 1.0.0 + jar + + Chapter4-5-1 + Spring Boot project + + + org.springframework.boot + spring-boot-starter-parent + 1.3.2.RELEASE + + + + + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-mail + + + + org.springframework.boot + spring-boot-starter-velocity + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/Chapter4-5-1/src/main/java/com/didispace/Application.java b/Chapter4-5-1/src/main/java/com/didispace/Application.java new file mode 100644 index 0000000..2a14b75 --- /dev/null +++ b/Chapter4-5-1/src/main/java/com/didispace/Application.java @@ -0,0 +1,13 @@ +package com.didispace; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/Chapter4-5-1/src/main/resources/application.properties b/Chapter4-5-1/src/main/resources/application.properties new file mode 100644 index 0000000..be54b4f --- /dev/null +++ b/Chapter4-5-1/src/main/resources/application.properties @@ -0,0 +1,6 @@ +spring.mail.host=smtp.qq.com +spring.mail.username=username@qq.com +spring.mail.password=password +spring.mail.properties.mail.smtp.auth=true +spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.properties.mail.smtp.starttls.required=true \ No newline at end of file diff --git a/Chapter4-5-1/src/main/resources/templates/template.vm b/Chapter4-5-1/src/main/resources/templates/template.vm new file mode 100644 index 0000000..863856e --- /dev/null +++ b/Chapter4-5-1/src/main/resources/templates/template.vm @@ -0,0 +1,5 @@ + + +

你好, ${username}, 这是一封模板邮件!

+ + \ No newline at end of file diff --git a/Chapter4-5-1/src/test/java/com/didispace/ApplicationTests.java b/Chapter4-5-1/src/test/java/com/didispace/ApplicationTests.java new file mode 100644 index 0000000..9d1327d --- /dev/null +++ b/Chapter4-5-1/src/test/java/com/didispace/ApplicationTests.java @@ -0,0 +1,96 @@ +package com.didispace; + +import org.apache.commons.collections.map.HashedMap; +import org.apache.velocity.app.VelocityEngine; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.SpringApplicationConfiguration; +import org.springframework.core.io.FileSystemResource; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.ui.velocity.VelocityEngineUtils; + +import javax.mail.internet.MimeMessage; +import java.io.File; +import java.util.Map; + + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringApplicationConfiguration(classes = Application.class) +public class ApplicationTests { + + @Autowired + private JavaMailSender mailSender; + @Autowired + private VelocityEngine velocityEngine; + + @Test + public void sendSimpleMail() throws Exception { + + SimpleMailMessage message = new SimpleMailMessage(); + message.setFrom("dyc87112@qq.com"); + message.setTo("dyc87112@qq.com"); + message.setSubject("主题:简单邮件"); + message.setText("测试邮件内容"); + + mailSender.send(message); + } + + @Test + public void sendAttachmentsMail() throws Exception { + + MimeMessage mimeMessage = mailSender.createMimeMessage(); + + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom("dyc87112@qq.com"); + helper.setTo("dyc87112@qq.com"); + helper.setSubject("主题:有附件"); + helper.setText("有附件的邮件"); + + FileSystemResource file = new FileSystemResource(new File("weixin.jpg")); + helper.addAttachment("附件-1.jpg", file); + helper.addAttachment("附件-2.jpg", file); + + mailSender.send(mimeMessage); + } + + @Test + public void sendInlineMail() throws Exception { + + MimeMessage mimeMessage = mailSender.createMimeMessage(); + + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom("dyc87112@qq.com"); + helper.setTo("dyc87112@qq.com"); + helper.setSubject("主题:嵌入静态资源"); + helper.setText("", true); + + FileSystemResource file = new FileSystemResource(new File("weixin.jpg")); + helper.addInline("weixin", file); + + mailSender.send(mimeMessage); + } + + @Test + public void sendTemplateMail() throws Exception { + + MimeMessage mimeMessage = mailSender.createMimeMessage(); + + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom("dyc87112@qq.com"); + helper.setTo("dyc87112@qq.com"); + helper.setSubject("主题:模板邮件"); + + Map model = new HashedMap(); + model.put("username", "didi"); + String text = VelocityEngineUtils.mergeTemplateIntoString( + velocityEngine, "template.vm", "UTF-8", model); + helper.setText(text, true); + + mailSender.send(mimeMessage); + } + +} diff --git a/Chapter4-5-1/weixin.jpg b/Chapter4-5-1/weixin.jpg new file mode 100644 index 0000000000000000000000000000000000000000..89797465194089335cdba1397a45122cfc1b144d GIT binary patch literal 22635 zcmc$Gby!s0_wNvrN{1lb9ZJ{GrGRuZDxidP=OButAT1zWk|W&=-AD;YcXu$BEg2jnm0GJr^3Sxp&$h6VtrqACEn0x(kY zwtWo%XlMYq0000E03D44fPreEp(-HM7J&Ju4FIsA{sI6PS!n;hnuY$)RW#WwjDNL# ze|JP40K}f#IJrBy**G~fJmC`nh{>yIVE!HrRsOVD|1^ny(nih104gzef^fg=U&{v~ zI{?HuXufE&7-&oYbYe6NVl-qIfF3oYduV^kA2QTb&@s{O0kE)faPja_9Xg2sXc(w- z7?@a?*jSi2SZ-+O01RSG62^Oiq)bFua@vo{Ub--2zhj7%C(qV-Qo-^{fTG=XOd(Dv z7-vOSmerC{_&DAz=ec6#`x7=j5vv6Eju+z}avwUcvMY&NSLu7?C3c3KPAGc@t*IEi zuExcqqUPY_5)+qDRZ}-KGB$Z*V{7N-?c@6~G%P&gb5in`l+>*Jg2Hb_#oudc>*^aC z+q$}Ydi(kZMt@FDP5+viU0&bV+}hsRJv+a+yt;>#Z z03990Ck8skJ@k9%n3$nxC>dc8kuYL12+EP(6JUC*O(u)=g!!dBxr>g_yXP#i*$NdD z*sp|jkH=VFv@5Q-o=^r`ia4_=>BX_55u-rvksR#pGaUq|OZ98Ubh;_BMpOrHLW%Q=7o0P9b|!@|NN zz{A5MAR#~%5=xTag_4HyPoep{F#Rd)zYEX53KBI48a6gIJ{~?P9v&$lJvBYw|8+sm z0`6n{5g#$?;kwYMarl2!8CyW?7U9jin~j|?h>GF*NJtK?m6&2Q>!brC;G_7(7{>H5}8gmKw$w^NyCOD|M^V+<8=4yrf>S z%{??)M?O)({>Xd_WBYAM!ld+p?oDrkZ_9tm*@@!?+ZS%UU+3<(9>P>$=7m?O?PH$&w0P|e+>W{qfcW|aFC{sYuU*gT#{ksl< z3=PEcg64yBrU*M|0Tt?tD(If2|BeJPlu)-ubS{S-GzSK24AKYkk}MoObgmt zc;1xvd5tGMuLO2I;S494y++hi=UM+nsg;oh&A7w-E149sZ;C21NF74G#L^ z+ikWyw}Ggh&IVSdTnLlZyt*CUwQsCj7n{A{OKtH`nmGxeHM&LuYV@Y#G8e>s&qSpS zbEeZ^z^ui|LWebr!T%W4!8CEV`Qz6Q3)Vh`4uhh_NAepE_ObUb6HASO zmZ9C#%z!Pi-HSuMktoR1N7VbeDTa0{LMx)4TqO-2n~=0}NLtMd3|nNn#=arlY|Y+F z_^0Q5q2Yf`^3(no!>^482i#jgl~umoqNRL&L;kMCsp-`E(n=E z{@g2C~cwf~FjcSrT9wres)CD{Rep8B0SQ@$HM0oF@Ei{T;H7A5D) z?sMPMR>V|s@eQ4aKB3Q{W=p`jPYq$r)vyKbuBRETZ>V|K<$p}DcCtBb%0H)3f*5A) z_vBKdXzwPPpz%oLg2J7B9-?HSzuR`!cn%f4F!botH~Fc*5jc53qnA-s+X4aB{U{kX zKMvUVuf@oAk-?UzKwU~d>Xpzt9JL|7c|MPzQ-?cw*I%s7V6tY9UXS3ldP|xUY-OrdXqR4M3 z^U?hGJ^BCFLYWI3lu<^zhmHg!>8Yx2DRzbFBr_5HtY)b03z3?*5)U6?X`HSTM0?v8 zR8uBc2!C21xT!sjmsDgGzvzXl^Q1~Xk+xVSY2}eoFz0FnVL-KQW1VsA<3blf2mRTT z^~JF9_yJLoSL8SaajUy$OB(r5F%?AKe2!vL6{p=R)#3BZ17%?*!&g4vsx+#xHn*Ha zj(e#O;EPxcA?&f}Ui`ju8B;nhQ=IeZPMi}=iszCa(jftEM0M3#Rfs$jlIj8>#?#zF z-g~xn?|22eLTLoM;yw@oFe+b$<97*VbJ%_4Bin$5e=w3fJ?@P{CACG)=^lN_cYVU&zu0$&q=NF|* z;AKdFbR$ZmLP;*0k$@;aDr-6P-{T@`8wpKIF#(18=|;80U@2hIi_f8*D3yHS&Q zXF2CNadeCX^eA5L?QbFh`KfzuSN02oZg84A6$A@kz=(~g46NGQ>+WeM-?ZCR+R`|9 zFMVq3aJngJ>qh)gba91Xi(T?{<&yM|xtnK5K;DQ|e0n2Tnzg05xW!`n1rngXAFVZ3 zVVv?Z%_e%)`y=d5@bemj{rW zj!Rq2rkeiR8jaH0w6K#WajQOxzxzZw&uk{omuBvm#~xfY1#~Tqm~(2+nJmtkL$9M6 z0(#GVTc*#IT9>@sLur$??oSz*X72C~I%Vv+G*tdNpj)f#?N58#TK5S@FLK7=O?Ax@ zzeD*#e$o+su-{(fUY}DbZP`K1TwP7-fwM!L>EI!_7x?U;d}?5JY}VMQ^A2&~78qi5 zFv^RFn4y1coY`_(P+1w#BRw!RuuEPTHIpS5LGe*rgfA#39>0s1IIuXCRp+1;<&SN$*pu*)TZp-`|s3&L@ zG@`}MMmy*VXS&>@2dCQ8IWA#`!k#!vLhCh<04ma&1~|E&wcC;B+^0)YBtRK-Zawoh zaLcXnfM(KR4qC6!-~i17H3hx{AAsEEN?SS}48DakT|JmvTA8g2w98nl_Pd+Qn7I+( zzs*EFY{1s6!3I-ssdSmcdQ--aQ)y^jxW!=Yup@L_;P!H-#tdZU@W_9PU~$2Z8g;Wh zHALbLDeIc@TcVPd_VDZHU)I&Y842qT>nfJaj1DH2nih&zd&EUb!b%T3?Mv!;4~Z+X z4@{#(aS?u9c%0B^+D{_1gyW# z$&J-U@9Er!h#8Sv&ij(=C(|M;)nd})t5e$53R2Dr`0*aIY!p+|af^&N;WA7}0PVtM zzWOB@mvk>|@0Un}bv=UX@{xU*<7TLHsB>@!epVz%sL$9SIlL94`fCHNFoE8K5}}^HRSl! zE_~w;7|30cSRImoebb zxARaH>Be4MBp_q4cIS|i=1l&|d}{G#k#@JuM5D#%k;ccxMN^I1smqN*zuG!d4UxS7 zr#HOOlNI1_bCWZQd->JwHD68UT!(+w9xK$(E#P>l+d2NQVS-a4G*h#5{V& z{&kAzqY58CtjPfO28$*EUE90M-%AV$7)!2S3XFMw&feNk>SOwG!SY6i7NusH4(otE zl`~$VehAiDhs-=bV^hD4k!HUVXtlwdaQZB-M*g??BbvvE&@|UMpel5SdwzZEZIhM% zLE4SbmGt1b+gu$OoC(_t8~Tn~w*>ee`;m=Nhm!7159S4D91JPPP|FZhFS1k4SMF(A zqAD`?Yr?kLVZz8W-mX4kZuN$?gS}pZ?f|{KsxtcNI>?d2u)~&h?y|Q5^y|xX zeJ9&coQ^~Ek@petn|c)=zqcYS5ci6@iUqGHyxqfz!)b8(rg?>zcG`7AEg1tw8*^8p zjlDj+jeMToV?vT2PGw8{^bQSc+xHDcNiD!qs;Ui=N^8yLNlVma6_wGF8%ruex`aep zm?I8VVT1j1NWjy<+5_c@PX12lTGc_CwRJ_z`3FCX5iZZAijI@$;1+rG!b;&AAKs`s)8WZ^;=^QO<7>A&^)2{Iue7MCTksur zIKtgY~DMHoD+@l^c#1WeCgoW)Q~OG z^d!l)E_(FH0DatHw{2F%MT*&NQF`ORtFO9op47vGV6sljxq;#1n^oWmhgS)jt;od- z2a!GAj@5@*p>Ldv@Izq-)9|wEw3@9u%PH_l%x~227XI+66|~*N&3{pOIOvsfZGB`w zkyJa{$=a3Fq><-oa2q)29$CU|T6aU~=BCgzH{-BWATCl@ClbBpJmWZq1P~_^%v77H z)DN>w%4{K;T8bW(+9Uit86}5zMVhW|xUKx6YTw(<=90d>JehF_Yn{tdn9ok}Q=XO* zx#ZHL6rjJTS=4G=Qn9QxnJL)4+%&$t^)vPMm&P2e9>$w?bBwHa;ANa!X{f1OF!SS^ z52ziO| zPf~5Rb<>y_knUCWXm+hUI}-yt_eo>P4`zLMu0NeijH3#1BT>W{OoV#jnFR?-iiSF}r**ofB9V{~o!92jWLe`;`x~%pp2wO2ipeBz* z(hXhNqO=cN+rOU(54w@k`=B~PQ;ix!Lydnn9^Q|Lyv#!aT){a*6MV9yFVH7G7z^mM_W<3UAjs@ z0$k20i*%UTPwwY4<>jaob|Y4`j-S%3bCR!o&aI8R_o|oy++01gP$HIW5`orc*nb-m z`pmUZ@1)2e!xuWQhQPIr!+e#~=pqvmnU}jGAXlc9PR+<@v8_QqQNVKHAyhCB@^DYV z+-`)0)qO3ZA5oj;L#oG=KrW-w3&zE|MW8-fq{>mwho|uNWgnB-~gh$ z9|`d2g=_MkLYI51={LZ-wMYOn0&n#eyqu5tT=WBTl6kPua9`z`{;(R{gndkTsKnV3 zkGa}6Xr7fy>ZVO-FD2sUjd zKi_MK>7Qe{xl(&unh&15OxIU8h#FRZO;qgPXIr;n{mEnCt5!c^4Za7*{xe;g37wRD z^}=BV*j@f7ZXgl9mc#LXMMeE0o?oZd9~692?`EJyqYfw& zWSi6fj4kiKbcn+In7|XKs}Gfts?G+&E`Z_+j|JZmG*f*0u4=v5GDU33w^J!Y+!7 zGiM6pBV?m;a^!2ScYB-JY3l6?fGXY7NsX|8{FK)*WHAySnU(XE-xX2fc5Q)v(pVfe zR}3`Lzo(@5R$#lPcMKE}Ip~^XpViDrqz*;YL^0s@n-R1IPBl|QpOx?gd?K9NucB>q zWzY}z;@AOPegYG|vEUV*3P*5++_OH`s_8YnUHS<*6b?*L7WbphtebhYI!QJxW#>(w zdA7N@$TM1P=feKU1ge@S*GbdJz1NM3UmyW3`G}Zwv6<*teu9KsX)|FtSO#xP|w z4a!~%y0_iLETrZp(x;jh!Ub7ie39C)XW^0gLibe2cFge=y@+1CH~Fe3_0^@9_NCCU zyM%ptvluF{P9gxgS2!Fp%O_5r$Z4{3N%4g>R$TS7sv0?jGD_k!LUr)OF6lWMUO^_C zcojC%)G&h{+C98E;)uVj3sKSBZ)!DC=365xZf6$NW)Nx~Df2k;zYI=5N0vcXy}F z9x)z!9XHbIaaR8lQgv1cv1+HvHY|y;`$EbgR2-0z3)(xthJk)|&km?t#i+YXg&<;b zsxD4f3|Pa}0Bos~{XaOxCqg?)7tCqKTce|e*S54&_SLQl533!&e`exR%V{Z32Ns1{ ztA{f+YG?ZIZ8>*>-fU?ZMAn3m^{eYf=RnRw$U_S=sRemtgGe<@VCt$JiG!NVKr=eAyHD@{+;Hv^CW3mHiDY$n$jS)ghRcnyj#Vn#N*xR{=AuIrGlr$9wne1 zy)&_wDfqCPYQF}-i+2+R3H(b?)IBK(1lxV}KDMimR>LDU`3e`l07K*Nm`;*eVRe5N#BNtkp5q0`J!7!RBhDwh@hJ*bk!+y6)UtLE_6PTR8LM^Y7g@SP& zF)MsPmk_4JfdsAGIAIrc9AFs2pX@n2V5ySva0{(W(cp z!6P3=+)EuS3wWI6*tjVF|V`*$C1dWVg8HDtR1O09<%~jsHwdo+AhwW8<<~ivdj? zLbzYSQ~aDkS6%p2FE^bV^j_umI~dI-oI{BSuw9T(ExvjiR^AA7WO%H0iN92`Hql4K zZn}wsk`l_?*B~WvXLzoA`2qJpk~ADSV$)-zC68NFO3=)O&+HW4IZs(y$irg{{!F(n zjb=9i&mc3gV2#GLJafIq`1EvBrKh!qKr`yBFkMVg^oc}qLO!sp*CpDh=aZOAZXBxP zCtsHpgV&ocm2?sy7d7W^(xrCV(|h@s3VCchrM-~=8OKrGD3?783B9TTlUNI}RH1I7 z=ZyN(>ua^C!rWv*?wGchHFFBo@o}ou0O4DcNgi9{p%e1c2Z3Ac{M3dzz;}^8!9VM7 z^a4~zVO0+re-g7}e%r}9zoqTc`K*R70k+P(dWisZwdoav9>4S_Dg3cYbk`rw7f7)tBdT$JQ<+cz~`NBP_g&OWy%wVjlkdB9W6>-rH_uhlS0;sVZzB zVXY^ljQ+6w?q08hkevZ1U>j%Rz`pjQFgwdH|*$KUJVZkcy?DT}*I@<|3qXx7{x_U{wEcCozzF79d4Wl{=xr4D3eWzc0}S=MW^KL$TP z7?LfuyQ_x3)pI8tpjMPJEE!hkq#v;DJ?+EZ<)uuvL2#F81di}}*IQMMvm_+CTuetI z0U8^qT?HLzXzs?3=C}vm*fhF$dDB`Ih`o!FTL|t%I1@Cz`*3fNrX>3s=p9QYzc%{Q zX99L-9m@eE!GPa^R|v*coJ)zU%r$KHc2V|4F)z(>A~XGuQO+6j@7gf=NgLQp$-=T_ zvT>ZNS|3TKM^vhcphzq6)@w9KXNghHaDSMS%N!hnoi>G1MID43c&ser?<_!;QuWGE z()F%^T2A>9ogTfylyl1kGV;L*1;d2QaQ=mjFL>0qvi6ry&&>ergP*?BF$DY^`8vJr zvPgigR>Or`{T8I^w6Fx;mARZuejcGiMyeYNKv(Esxo4^uz=}(Dw!4x`GU$wkp32LA zMFI{sDhHb$}lU%NaWt zm^e?5hO(I0`fp9piNK1U(sSJV?iWx}vHBmj&!Ln*dDDEfZqKu7pM4den0 zWKmnqi@p9Ba0W^5d=QYCE^XY{#As{OhG}Pq0`0jywBp$;*4H)9@|nUgVX%OxL6SIt z&{Ua!Tx5m^j8RF}3WU8b5F^ChxmN)}FU$zRnSl*VpL-l_onH7vs`a6Kk~3IEohi@lxK6^TZE--Ex7Y#Sx^eM1SzK{2K7B40@!B`J zHvOpJSDS$Y-V^JmbBR&i=IW}PLNKUToP5zp8Q88l@EOX+3;Q+4annh=uU%FUOnpd^ zE6Q=%xwV0J@)yYK#HIQaBwmZHq^ffm_T5ycaVCD07%!SETqKP)6UKh89HHlakD*j| zWpm8I{oR&cy8mv6wLB5j#vSbZBTt zO7io!4@=NaCbUF9UMUFveEmf1?&7ROWjo*XdMk(n<}1u*Ojhx3G!+)JHIQI~q1CKL zU9mE)3A875c&eK4Rf9ZPYtBIQkrknS!;p~G z*8K6MMgW~@gy4rlCGI@KO_;t`6WCts&GhC*>ioS|iFRa~S^o2XSr^c4DJt}6m$Aa2 z_cJa>3|{*1xkiE7E;(o6=B|(Y=Za%v;MDYu%8s~R??B>ON5&`Ix%OgJ&G&q%G8$S> zE}h8{*i2WzlVakBhU)dUiaX{eEsNr$$#fCNx77O9I?Xj%=BnJ8Sm7(-$ z8fB$HCL!#j5p)u*R;S82_oSicX069xD|%96drEH$q}n)S^|eqNmNK83(LS`@qnF85 zIq1KRIrNP7ZsU4pvvw&}Fp)||0DOOCYQoD+b#VeAdT3G-9%qn}m^c!*GW+A) zXQ(mtg<-;SOwZ9XHE!e3$FN73LXV9|fLxqo@( z)_NOfI(at}{RK2<-ynEmH-8{{&qC-Sd9?o8$FJ0Uf`imMmtyA|8xhj}sBMOSfPR>d z_p9Qm8bl#&kGLhZ&`MAA(1l*3?@Sg)K4v~P&PtH5blP<%9 z)V49bo6AUmC;PRD#FHPb?#o^CL%YQ~35dG?-9R8^pNSt|spehbH?BQjpG?P`UG5lU ztsntdwp*roTOe!PQ}F825w2asN0vf{I0;#a&l6nr3_J)-s9$xCPHd>f$7cVM-Sw+( zH8#D%%;RL*A?*(-WDji1vy#3r7pPzOM{ak;O$+1&xx-R@1#g7yA`=g+T*|ziA%!;o z;X`|l_T;U{VFf)1oQ~4rWL`#v!GzW5gdxet6eW>SiE*kEx;iFT57%Y(i`_{A&BR=6 zn&dPE`?xJ6o>%;kH`JuU`zzE!TRm1}l!uYUtW{G!`|#)2IN4D&$n3xY+eRUmE|c&r z6`bY6;P9mjmCjf1iOFo22$nn|8Tyeqa4d@D-=NSu9U`kIpS zfs?^sqXDghD4QN6yj+Na9Th@?lk7i=UoEzsj^?ea&<4)dqs|8K^ELSBG>c7)ogM+* z6SQSUP!_{6-v*2R_;rRyhcfwcH4J)^c~xEIaKFfak--Dqow0z`*~sWl%|F_Pil*@= z*TjujaiF;6w3a5pq7b8!0$z~tr5S3sOt4J2SkFee^^?1i;Ac68WAGmEBnl24QFp#H zim-PD2#?{pfK>At<%GqF04&0$*^CAyInT1_t!`ELsD+tO$RW|71{+i{{6jw0%=U9( ziD0%Z7mch$jcLD`{`LTorf^@P;CYHG67W)Cq*LGzU4Od!W4pBwHF;IpO0<-A`K?I^DMERbH5HN(e^yG&Y%`sVCMhTh7I0m`xq zueDWKrrRanFS>o!nc-oepD(HAGc=fzlyD)uUtjWUT=%->Vk=#$s6C}2Wl|`g6Yk*V zR+Ji16a$(4`vv$74h*Ckz6z z&tEtPea`ycHoE*z))0^prO5QMm+h9$-Y+ny;`ut_#F5U9JxuTep18hk#Xeyi%`%&QQYLQ8Y&u<L?eSZ1AC(h`Pc2uo*-{GV5&$c=MQij`Kqk2|2zNS;0lMPtuxnz4EGJr_`17M zB%puMx}1HS?v3~>yocBL$%i9#(F6woiM$svC`>f}@P=*6mWJQ%kCfgOrodT2C+?{btcy}e{{RwY~FIJk0i zqo1pw^}=D+I7?4Y)D&SkzO5MqBU&t(OF2!ue1?)p(= z;XK*$awC^z%S z#3eudTF4&L6vMVUzo@otr%KAG`UYJGEi7<<)=4rMP|@*|nm+z6`HS)Cknb$v8lHWv zL|K+bDW+Fn%8M%I?T5x<&0;Ijdq}`LC<1G&+G81i2n<64R&FO-ZwLrfM(%$>n7UDNpbjyWtexy>t3=0o;j7TRKAmIABhcHySPaGE4&r%_)%pyrXROk_fjpvPn1*#9P_#a-OH9``KIwBDelnt} zIa2)B^r8st;m*}0CnSJy8nq94Bg@hkiNE55pvNR6Isv!AS|=cSgrTX;gvU^va`OHI z#gq6E(c7hEhPAH9$KdFS9n`Q?{+mhPH|a&UgepSC*AT87;B}_0u1Ey-HE7`ulg2yt zwbsd$w2YHHWj$r*D!e&|MTviKId;|JEkA1hHkjeWC@xl`!d+#KK4mi(KB05E1~0v0 z(;gybH&B$74v74i{Q9vWD$`?Koe(GP zTGWLp;LZEA3utK!1k!=pun=i(D67tX?{gqE9!LjTyS!=XWng6|@Qz01WK<|(@kf{1 z{e1Cav9ojX6uds<)&Xnfn{NRb3c7M^YVo*Fm=H;oQ^=*VM9clW&c1ug`%QsNF-B$ClM+?zE>;vHi9A?^kt3Tx2 z-Wj>ENgu_htx>Ce$)H5dxP5KdlC;3ZJNh(wUd2-EH#_FEE3XD)`H3s4lD`KBCeh+W zRgz@98o-uYMaX~pk{aK{6oo(b$e)+$bG(6g)|UqlxddKP&#l=g?hK7Y^x#|E-ZQO)zQCf?B)s58{>^uGrE=|AawPcS=2R25Ut;hlI zmZA(1@y(8F3;OtW#-Zj>*cYf%f;V)CT-L`MdgR?()$NTajP5Ulffl%HbLY`$T6y{r zzNpjgr!CJj=$zyiAQKyO;ANMK?ZgZ^8^V=K>DIT=fTK(j;N8VG`UnZ{_n6!@&s27+ zEE2sZQS3!0dKltVij(wjznc*ct~~p29?y!9h*`>z)(uGSWNINy1?s-1ysVBVDqsXSxUtv;~^s`MNPz2pgUkLUeO7acGv{j1B$F#jwd0!`8dW3^+# zr;4K`G*ZA0aGQ=j-nI-UY*~wII!=H(Tbo>n;3JCmC&UulQE*rGFl7R8V z`D~rL%7A3(DApb&$J#-Oe4xv>okp0Bl?7k`B0*K5aUy!>jhcpS=REp z|F66->o2c}JixDIK%fn9??r(O(IgYe@e%9$$2CPvp&65bV@wRz(+j%;4Br%K@#lyM z=^WL?#l;yc)6nETna+|IkH5Gl^X5KHixb&j3RiCuRq64(qPn5Luov*sUjAf z!kSY7SwhRrMCJfYGAgSSrx+KvYS!o%22RXkrCIKDoKsT0Pw3AUJfE|Ss3jwS;O8YQ zIAsQam8e7i=MU1`(OY8D_Jf({+I+rcOWEqjVQTl(s4*zfOh}!m6b7AngVyMg09nRP zgf~b$zf?SQ7&grF@`rbUh!t4cer)ypr!N|F{IED^b-!~5%;+Fv1yT=f<6J)T<72NP ze!)YZf&6+S#YH7z9dPANET1>Z~mwg0NKB9cwVxj078QmnM5BH6G~O3+H@SXe3o z{lfBBX~tm0%icSyztr{f$(Z{JYXdEQU&3)DwJ4M#`uFP#Xe`iW0YSl(BPcDXC`+&! z4bIs?(1E$GV_Yu+%(^jO@U7w=omW;7j8o>XLq%G{&sO>0f!Hjg4Tsn7JshOUYzOy~ z6?TT_?6VvSN{Od&VPZxr{JgHjY^G54W#>m^*o-z;cnR`XMva;r((wTTAUm5EnZfTz z^^ky_hp*rs<_YOKftsjHOH>fCI7hrquE3qnNd^?>ya-(hen7?ghL%5qzNdqoCNy$= zkjW~FY7J$ByQu`$1C~yKM+j%I`Ull{w>OVI&TNP^vrZ?P$Gd&)D1pzmg|>S2lc;I^4Ed5RI;Cv$+h0=Rwy?;ZSK&Bm3`V{a7M-ciPalZ_<1mk(k%>AHkB9(Xa8~zYxzzW zjH4jiJJvRPpP~u#Q`aSyJjI8&=HU&$!uK`{LZi1!q_C%zYT}5wcngjFlRjW#@Q` zfsJ*5cua^=&*Nj%-_;}D_H5bfeo>4L9p?VvniLkBVug{cs`P?=!?H+9HAHiw`}8dv z45huhOt+taw#g}vkE%V@GX4pYTI{UD-we)M4pKquF)-33a-&nX%aRkCf755&i`qdK zJmiXyZ>m1jT>YMnGv?RNb0va_O~4W+Lep5Trsl8LOAroC$`PA-+UTXTDGL(+kk&K*GR@{-_9cb&LzHE&IUsz=k3JSLYxQVC8KEQST3NhKMjWN^gc9;ak zMK75*yb$`L(F7#Y{Dd%=%j_^~fOzTH`)?cDZ>tiuF-Y{_hS;|nm-R;C`JPSs*kil!WAv* zRjv=&z&AZRWKRraee6WqVM}kc5D`P!o0V8<;-{_A#n5+BW1nh&n}^kog#5={eil43 z9NdA|Cygq7SujzY3TMSL)TZ+YodD~mj=1;tR!S6#yn07=lQxL~WQrYJgo}ocfh3;|8fTI zMBJ2~FJr&kjT-0?57EYF`>LWDaSQMXPkl||`@{w4F+ig59(UK@sQbQyk!zlQrd_Qs zpG~sx=0_giRYDm(VaraU>(i$8d>X9@g>~$Pu!2;;HU>{&1i=?P7qP8ip8`%IEiPqH z1cSW4)*Z`#sqwb#rODzk!w&V6qL{-vK9GJmmx>ti~V5t0-ZW_VtLrGYn8=tD3UjlpK)o zph@4{73>RBVC_&-cT+R%mVAhKC+f}60$hVWO!280i)I!`A4!$%k5Z$;*&0qNB13yX z=djl#NM?@HpVvG_5*`0$;5aPGs$BM?h0%!H>W)9dYtrwpjX`cHbg-2d9VF2zlTU=? znZhsLbSwMa_c^qdGRPp}o`;oq=djYUWy+GUh5ZIwUD!DW-adalXQg9BbfUuqGA$%k zox>^gy(X6^pEu;{P7&jaH#DdqhQ#S+QTPBQV3~Mj2JaEdmCu?BTDqH;&VB&qC|qere%jrdEYoOiM?oSk1p* z2qrokk@`P>j^B%s;*#Y8{^=&m65q?>()Q2c|B0Lj;~gM3nhaeLr4&*9#T42(Djx7W zk71bjeaOS`QQ#~>N+*iJ?a$%&A3|s<49?g%x_>%4j_%&BSk7DN9)ffpC@+rN1W0lZD2Rqe%u({hPJ} zmqQyzY&;6*ug;H0ge-CHqkjVYH55SQ{%XwqW9+|2MveAgpTYaGQ8df{Iys2CO7mYG z{&nfU8^6P9#J^v6#{i(A-$T9QkNWonxM%=kMnNJ}T#doyIQCt3#aR2w$^Qte{Z7jz zLg~G}f%raJEOI2^*soND`MgSsa9j*{N4pbWrGtvH`)@6x1k`TKZR3 z?jPcq8NjnxH!qY1!@hModMmiu?=~brKMh0>+cafYw1@C;A_GwMKvMtwk(At zYepP$Q}=7(8_DfL+tJ*9f~s1oB!l}m&tFQ^ySiuil>DM1lQ0h@wu z23gp}&~lh^$IG~9R3l(Sgl18Mr7YQ@#5bA%RzSjoR~OIgoxfT2%CL0-5`N5Z?Q%&G zv8uU#+El;CDn{7Yh=ry6*z@(fWfz60Me_L-;*Vl!2nV=1M;p37qgAC=?+8KGa+xAe ziT=0Ahv5%idl*B4aE&(j9{xz|+aSQ}FPG)@QK-C9ULCvtsjp-{kdcZu?*!b7N@zHL z{+dIRBv@`sxG1%Xvxnh_iPK{j7{24s4X@jMOi% z0Lui>BPwmez9j@xp^$)VxruwyOw7Jc^n{o z27v1s`-Q|g8F9SQdtxGZUq4YI=P&|GU-UWS*NE)z_xnFHGKM2;&o){$hti*K%ItQ6 zf0C3GH&#>SHM$6*tLEzm_7gJ7k!2MIo3$?BXw&>W_TZQISWds2_n1O_Wl+!qebk0ibW>6@^;g_*HmSwudeYgLt`hZ5x!YS`L`lP3d*d;cK0gD1 zP_LZzKBFzq7?o?FH6GFBXYIE$e`BEAHBP3bN}$EdR1&9>%Ja?W6*!Hg-$$7G)ywdc zfCU(#KsFmxgvZ1P7fsZDt(VG*Kz9FwEcz}T)#LIVFbA%{X3=9FQaL#R9^b4Ti!eq~ zVln$W4#h7D%(ycF68D^;37B8pP$6z^2yr3rQ6Nv7&C4Yr-=(x$PcAvp1kvG8&7QnM z34(`IU6M$ESc73B<6Fc}bwf7Nr>KMoUslFgj%+cC>gN0997pP}!AEpF+e$nvaREza z)}J-slwQNW4jn7%lN;Prp=Ar<(Os>^xjsPxMp^q0=Y1IOKU3@sxb?eCCx?$Rxs2Q` z=lZeQ|Da{!BSd9?W}HbYXJq~WjkYDYp!O{~@YT*tm%fCrXK;c;__s1+$klx+jeCn? za6Y+sf4LAGPuPor^Y@*nFPGz7 zuUI5m#6FxQ(%lF4fW#HA1ZS*p`v7rx&m_y90)bC3pDoj+?1m>mx^O5k9@D%=q-W*q z$+85ig|PiIR>^T#5W2P?-eC(`FlScxo-(=rq#WoDdlLi)r9<)P(dsle7(;_a-vu zp2a1-l<<3IHy*0Qg0ge&q^A?euaM3mfWe|Glud((@o>TxGS6>2?u##L12OdDpO${e z6+5L0FPXZ8>6=9x=}V#ESb8MN4J4Z=Z37J064(OW@nB{+Mv_IFKFVk{0!&9n7<(*6M``Z5FYBgB!r&Vtnz!Lj=KD?`?;aM z7;B_^@a6d^Fov@$Q^wa(!89F}D2{*qR_x7X_mnPoK!~Ztw)&!um8S!RZ;qasnLYHt zNZ)I5a9k-?9kQzrl9+=)u|8^67nEr$bbAo5e&3iW8q`HO6T2`S7=8?iI|LabKAT&Z zxVR`BqqG4bInBNAf7jhAlHOJbE2RbnmO%7WL zH}V+i5j!dKo0~-d^jGec&lf{bkJ(_M4dCE5q|J`cc!atFxUcJudCo!OgRh_EX)5|Y zyP%5bRJB7>nk!!(308Cpxw!T`LrKnAw-I4GEV;3mYKcv$Fb5F@;wSj!6c01EblWuO zm(L!N!wW7AY@{|lY=u%D9ea!}wM;>YW-(akE)z1$-K)G?L5cbc3sI}OXm6(Z->=hL!jhCjxVxiHK;Lx!z*U-619({km6Sv}fb>Hx(vv4k~cs^jj zU*ZdSkzV4GA{=M`ya0~y?)y7=Z!a3Fdx9zf=$sPnR{g|0R5_8U6hF7L@7lAgzt;!~ z04s0@wheTUypj0Ib)Z`toh(eXfdvjQEd*EwW#p??Mc{?zUdO`nNG> z*E78v*X?OwvN!W55(tFbT6+4@w8oTnjEJPRq>89S_ zBI)t>Fni5QZE>6w|BDX7f<9%|`BhW+^IO}v$)dKI^=bq{RA2s!j$<5sGn6%H?`Ui{84l>7&x($+wo8U#$WXtFH!~KPFePWuQnhg34^0^sA9q(4C6U76^c7x?H?tZP|=-K+m=VI7QI6sbzqVT2jiTH8EV>%V>u!( zpeEI{fD5aJH2$)xi$N&!&!YOoxcD>fPfIB~$8 z7cEVlPh3~kG`}!f<}5GajsNOWzxq6&r+1sAO@rvhGJ_y*Zw@aDs{)8|a zbxY*g%So3?xb%sVT&I-0gfpzLb6F-b6BCUywc-HqdY!$I^BYvc_a`W4Y^J%ZIt{Bm zjgYB2Z(ZnbE0hFiaQL6|>leWa@$AoCDQh3b#aA^E34sI@V2P}D4fyq*`NIBI!%~%Y zjQOJFOvsF(&Vj7x2$cBU`f?Wo@bntZXARwKh281YYnvXg`?Ofkf=R#UySO}&wVEVQ z!Hy_$!B9imn8NHm*47o$w93`n%dr3RC6aX&H#x4}rkE zil>z{CWuE3o9$YAJuC=vyD zM((5lgOv8STH!ZuC6phGCQMyqw(J#e3jE4f47$_VRjIE<7{PHXcBpfwzB!)ca3LgO zYDeOy#@=y{DIWODHq#vYo(DnR%GrI)7MkCEL9R$lkf7xB@4X%B{a&xutI|X-c?YjE z@VINGKEzS-?vBH}gQtp2X?oPid_3BSY|a-vX4n_ubAY5JT0vy{#DusC=jvcA2lbs& zS$U~f_%AZtJ!2n7*-HD!^YsBOYw2$_uZ$^2S|$x^#t!bTNzM^Jl~My9ttV_}Wu8*W z?fk|UEq7ZNFe$db8Teh`m!nAk2E}N-j&RD2!IM9ZsGSY)GvxBqLK#cG2~R{igUP+x zmO8giou(28nd?2-;=JgAA|#hZXXvCXb;xCw|d6y7`~`z~+RS^FOpR zg(0pvNs%3$8X<`_mU8*UZh=+SVyMYk+1pCXv;!N0AG?Ht&5<2sX;1%Zi(bvEzCH-} zhC~J1h~!m0y`bC`)C=jt5?&d6k|-CM?mY3Yl41gXSNx1*CqZ_+9nPf&upp|ycqBPP z8U`Th_u4LlQ+@R>KVYLYP)am=*?F zl0bYwNpQQj@NV}O&h-G-e^kKw>(Q=lD6uEd>_6Yp8Zo{5 z$g`oy-au6qYqeFWbAsyPfi9Pre_*kVW8h>|6m+IH8JX&U6H_$WpU24+?Q$jNN%`Zi z;o&{V5D#syICoCo1c<65@ln>3^o;3bX#d1jldtI%xO4vnzUq_;PQ~a+%g_)f0Q{1( zcH|APw`xt?$ENVJSdQXTisN;ZYd+vAG5=H6j;CRP;c%qyhQ_h@^>#Tm6pl`IYpeyR zT~Eau*5kap?-KJ1!vz!w39>&aXMd^V$|5}<&h(TF>hs=@4&pU^|G;fz1R`AKcIU4P z0!ZU{&2-l?awUXU%(_O$+U1@{qu&u*`byRL&z{M1nW|TBYFk<>Vyl28&SI>Xj^TQx zdo^2GEmcS`CAhNd(DCR}|9KAQ=)xI=zPpS(!K#MSkbX0AdREmYt%q#m$5NVL$GLOF|xq2>}fFnWZA;mI(6=e|^JF zu{sQc`o7-W6%t3rBaQpTG{=Z_7{X_nb2Sa^L(sBHc?w%u+f0!pq3U58bUDUDQBLt$ zk$jGaH%%qR83Y$R@>a59t*s_XNXF&bnHP2<5G<7x{KplamtsNeoIoQ$Qu2$C5_aK% zEr^UJuReVAnQv9^dNZxBAeu`LWN6*=++5h~@{?o`ud->J>m*lk*rlbePQ*-uhbZxz z5{=t5>~(waERe)**0q0FwVfM}68GHzra`IcX?lAOJPw{%$MVV&bbm=v#j@zgxVSLM zmS(JSl~~XIrmcX|x)n$^*`!4C__nq!EJW`0N|NT@aAX*hKV2zPbfy3E4sDjCXDaB` zP%2l=zCI-?kp-iI(AB}B+{@5|s8};r8O0-Ctt2+!Rr$+nbO=$ad=APj1_Md;;tqba z-2CfGx&r0$KrS%mh==!fE5Es~yDk4_{hqvYT=5A9^PzYAV5(hA4@VjO+jYf-TGLfS zWHFu((pqr^doEFJ8C1a^E*m&~DJHu>KU(;FwcD5 zOTd%VEP|XH{K6P%xdRN&zb4>tRsEN_DmnjRdmnyWn^oQx>w!X)`S}wQyo`@_J6V0r z8hEc|0)|6#rN1N<7@rjmobFDuV^xt!u1b7gg)VP>f6m}EemiHR18s@(GDPCYy$2*xJ-;mp!D)VA_y#o5p*#xL_Ml#_MT zgUG6(^I;3We!$w~{!OR*3tnjEY`L{OV0hTY3bm#m&Y12Jv3|a}zw# z0fclRQpr=MN(ZUYJ>xpud%>m_w>*A}0Wf!9aGweRo)j07}0+^l6q6!<@+aVeHP1u>0K>O}^nK!QI4fsyJNoiCV$$=ge7 zFMJEVBk`rw?^W3mCvVPZQ!r=Zz?fRe$_A$11*3Hxuk#L6*spL_4xPmb;AINMjLW)B zg~&@Lg3mbOe)v|&EmG(@V6y%PH@ahP<4s4mTX!Y510Qgn>~{Xc2fS1W%sJ*C%}hh~ zfz0PJC55RMAc!V(556*HGYDzaV3cT~^*@k%N;*mSpF~+h{_}u+1-N_`K+MW-y0^X8 zll6M)%G7qvaq?pL`&Eaq;s%4Z7Z1>xE2nrUSH;+e@j>hdF#>%nd-Jvmmtw)85956u zLgOq25kHO89UVE1UP@cyYjs4zfeeKAqdLY5}G&SNF2gF9_fBQ=rAs&LhI_iO}FMw)pXaNi^=U^vQqxz%d^f{Q;+2 zSL)demtDKyrP=QnwO+>{akGo0yEa5!(h1R7u6k$&o)&maTbXErfF4}+yrEvlRa~0- zzTjMW9>F2WD1|nEB=_xR96T-)?{n04=coj}a5m>eJt4mh_-oQfiO#>5^EBU;3co6` z+(uhgpEzQ3WK5WLLcjEBTtaM!WHjCfgcV=BB_8EkVES*5N?h8x=Fh4VAFhiJ$OfE$ z{X*r8i7?{pIq$)4R^xDyPOyz}CDYJKJWHX;9tVK|Ewpp0m4kOnm%VFmgxxp`zMXqz z zgF70B*~mNHQq8~yZBs?`>sWLC24VIYy=km#`|&YZvw7ke0(#LmA?uEbkh!45w!&S2 z=ILA$ZQV;urXl3sPQfJ`qaWb<@pSGkbCM44-);#+jc9& zH6y$TkdI%p9A(CCU{v~ePED_}14DHB*{fnDSU2W=wTY~h{kfJCmii>!{WQQBnI{R& zRe$eCW?SeS_2;A!JrN@&jfOT1m*yE~ldNE+Zq)(wudZjEK||gK4N$33RHA+X?F{t= y*G@QYx{HiBdAwHdk$&=K;o1c_*#%Fv(85cTa?Mb^ICeG%P-y4?{BiH!