diff --git a/figs/apa300ml_comp_simpler_model.pdf b/figs/apa300ml_comp_simpler_model.pdf index 1141940..65f5566 100644 Binary files a/figs/apa300ml_comp_simpler_model.pdf and b/figs/apa300ml_comp_simpler_model.pdf differ diff --git a/figs/apa300ml_comp_simpler_model.png b/figs/apa300ml_comp_simpler_model.png index 493b5d5..725e098 100644 Binary files a/figs/apa300ml_comp_simpler_model.png and b/figs/apa300ml_comp_simpler_model.png differ diff --git a/figs/apa300ml_iff_plant.pdf b/figs/apa300ml_iff_plant.pdf index 2f6eafa..f2c981f 100644 Binary files a/figs/apa300ml_iff_plant.pdf and b/figs/apa300ml_iff_plant.pdf differ diff --git a/figs/apa300ml_iff_plant.png b/figs/apa300ml_iff_plant.png index 906a13b..2671c25 100644 Binary files a/figs/apa300ml_iff_plant.png and b/figs/apa300ml_iff_plant.png differ diff --git a/figs/apa300ml_iff_root_locus.pdf b/figs/apa300ml_iff_root_locus.pdf index b9a2d24..45f6b25 100644 Binary files a/figs/apa300ml_iff_root_locus.pdf and b/figs/apa300ml_iff_root_locus.pdf differ diff --git a/figs/apa300ml_iff_root_locus.png b/figs/apa300ml_iff_root_locus.png index 8bcb9f3..31065b7 100644 Binary files a/figs/apa300ml_iff_root_locus.png and b/figs/apa300ml_iff_root_locus.png differ diff --git a/figs/apa300ml_plant_dynamics.pdf b/figs/apa300ml_plant_dynamics.pdf index 8993e0c..eb09fea 100644 Binary files a/figs/apa300ml_plant_dynamics.pdf and b/figs/apa300ml_plant_dynamics.pdf differ diff --git a/figs/apa300ml_plant_dynamics.png b/figs/apa300ml_plant_dynamics.png index 5712c5f..31ef786 100644 Binary files a/figs/apa300ml_plant_dynamics.png and b/figs/apa300ml_plant_dynamics.png differ diff --git a/figs/apa300ml_resonance.pdf b/figs/apa300ml_resonance.pdf index 6a97872..a6f736c 100644 Binary files a/figs/apa300ml_resonance.pdf and b/figs/apa300ml_resonance.pdf differ diff --git a/figs/apa300ml_resonance.png b/figs/apa300ml_resonance.png index f4b8747..6e356a0 100644 Binary files a/figs/apa300ml_resonance.png and b/figs/apa300ml_resonance.png differ diff --git a/figs/flexor_ID16_compare_bushing_joint.pdf b/figs/flexor_ID16_compare_bushing_joint.pdf index deb3f9d..612d404 100644 --- a/figs/flexor_ID16_compare_bushing_joint.pdf +++ b/figs/flexor_ID16_compare_bushing_joint.pdf @@ -3,7 +3,7 @@ 1 0 obj << /Producer (Apache FOP Version 2.4.0-SNAPSHOT: PDFDocumentGraphics2D) -/CreationDate (D:20200804121346+02'00') +/CreationDate (D:20200831100334+02'00') >> endobj 2 0 obj @@ -1185,332 +1185,354 @@ endobj 198 0 obj << /Length 199 0 R /Filter /FlateDecode >> stream -xԽˮ,ɒ7X/I_A(h Q!z@hG%: w33ܾr =|OxsVŔ/j(|?p__W_O8#_o?_W_ }GH;8"xXachq-/}h`%9C6 ,?pʇmXa=19 9i9Q߾A>R){E_FVT1Ood_1O [Cb1v/}dhtZj\i-1 }Cü -){_6oehakX>2m-=B!5wϵ -shM{o~~#C?j>2Y#y#.,~ƚW}RnK,~.X_^оgs.Z奏 {?glxV}v?vy#CG Nmy#Cjz=奏 {AjY\xB>jpd>2fq[Khi m~#Cj=奏 {A‚yI|vqy#COG=| <./}dhߴ.8 {&kw>n}Oq2Kl}w>2ן"}>2<./}dh[ àKVx\>2Lma奏 {Auw>2чy\^о&9/}$ mk]<./}dh߳y\^оgC{qy#CX)f/}dh߳!=}wqy#CG=BOq2K쿇OO1u?wK)0-ZnG׸;KVE<ɮ-/}dh[ |}o59G;KV<./}dh[ <|y,߳8Ϸ%_оi]Oq6KAETG=EHD| l~#mW>2Yvq~#fP} 5@8}s~di8GѾ1\F]gFs%{ÿZ=ffCEobˏT{o.6!?ˏ{;5x>ڣ;g]~dH9Կvg[~dH]!v%>B̉oYNm~`@1 i? !göb?0u}:o=+v_?Gc}XBvң}({'3þҿ/_ or>?/2_i[>NFhݥC/Ϯ~׵Kcq㫫]WG|oÛeqzPOl!{靋wMw_)‹,;y 09﬿;#&Imտ2ć5qK_ks~d~(,u!4vFygP{/yPmΠ6(>A PA};[̃h5=Y' jow2}Od';5UdGڋp{[y4o򎓽74& joe2=MdG3}<1ykP[eP`Π%>ڻAmJA}ke,y}tJі) j2Regۤ5g3#a=O|;ڻ̃hۓw9ц'o gV' jm2MNމ]MA}[,dc2O=϶4y?7ϠCAMSA}{[ -:lߔw7Jю)o *g^) jo2]RT:=Gy'7DF( jo2=QeG3A?,?䭂<;yJfceg3ZATA}[JY~;̃h#Գl OCS-eGۦ3O<6LycP{iLmƐ(Ӑ>$坲NGۣ3.GUG[UG6x< e,?RcO:1'joOԘ'jL[5m|"ADi>az۠~4Om4a5h~4мeP?RcO\:1'(oOԘ'jL 5⭃|A@|no>N՘c|rADi> |ˠ~4mP?PcO:1'ooԘ擴'jL5y뭣5ꭣ|ADi>Yz~4mP?PcO~:1'9oԏԘ擙 jLI[5y꒰7ϠtOԘҷ'jL[5|"A@i>a|~4mP?PcO:1zo1'to͏Ԙ'jL [5D쭃|A@i>z~4@mP?PcO:1Se,w[21'oOԘݷ'jLI[5|A@i>}~4tmP?Pc'.6YcO":1'oOԘ·'jL[5 y?Pc:1mor1jt~ƛ>K} }l˂؞J1zjb౎v|es7_y#;Ԏ 1=Jo16<}t?@>db2~wN!`:pI_&_wM/t1AJ:| -z "ᣓ/2z%//#O_YWȩi~o=/_nSصNK_}5tju<0 m+>Jsؾ scaa10 ޵{h/]l$Z/Ev@^~@J~ZA'̮W =zL- V/HxE-/nͣcJWKNyc^q~8H}5Ա_5ì1+Ku}Uh]qo/U>=REǪKYKF=p-Sª]OZl^W+)Kj֋?thV1'+RSoDzyVG)/=/5p#y U''Pkȧ@qM4/a|AzSﵼZM!K&_PSN4 R$TfY]^id).ZIΛ;ްSK1gЛi%O-cb~a.V{2pcGpeaa2-㷶+ /ܟY>b7ܟڪi¯>5<%a>c1-Swg栐hj=$O?bZ굙Tco ?ANyj5-gWZBܟkr`Y#vs3c釻~<56+ ׅ|3-5ݿ.4X9<  -6wE WZɵuVg:i)anvrf5R;iU>` &-BWC)5hZ/)fļݴ{ 1^}QLS~%g3Gp6,E -mE4hZj$,Ka(qcr6 F4;؁[FZK`J~$1|P>C]3P`zI~\Wlla|$4.l|jk-ְT²[ U@5¸?0N`RIOFvL5'D#O5Zb~p3|&G3Ex6bP`]G߽iF~&)pjqC7gBAS\ DN?raMu.XCKx~a1/iCs%n0/3o$v0]̦ac] l|gSZ/bc=ZŊLBX7VIx%驙z ; G4&[f -o0Vp%c`}1mZ IV .$3C#H@4B?4ЍBf|hpftwI%. $FL㚆Gh> L{} <"-w2[>P6F5x f=>4Y{^ߟ` LJ^Ҋio':| ,Juv&bmJu@bi4X7'7>'5NI2!M?Zz|& a}la8Azsip2]93<,1w9` NV*R‹ąİya}nhE}k#񙡊snL9d/7r3H Ƙ~F мD?ɢN-{[fe0&E,D]M챏Ab }hD?ۛF3íAEOpD-Ɲz`h xrΫN 9whzmpꅅBaa08pn+a8pk̄\XR^ \hkxX3FDwS!Xʲ(`",b_#ҏ /dsks9W# ^ f-t.UL_d P -U$QÕ`P8*ڃA$9e~PCշ5AXtRx Œf!1&gXyh>k ^I.LbSb#lhLR;f'{g <~pu67.[t2JOt1KM[Qz68qT3y؞_b &V]fhb61) LX*s,02g‚&٢S+[τfhॺ44eLæTg:u ÜU}l :<([>1Z|LFтi|>,oݸ>0a)%B4,i ƈJCӽ$;jL 7r; 3lItA}xdea܀|G1⠛NjFf:K`:#:ѱ :2 1z-N fS.;0d{/Hpp5\CeXb,mliUP.[0隆h&%pLr[d6xCk.fa=GbLN4m"0~wLitR5-%2 3 C;140`ihx`1HZ[u ʰíjR걛Rf}P5] -0v%D@47̌i|@r V  - qFvHEB%"qo#,"j9,ǏMcⵛ1a2kD a*ϡy&IDƮNv$np(]eq8ؘh>f"UUJ <6]++L'>ܟÆvxVLcÛS -Z^)1i\^`YuǤqzCVXh8+.n;~nqh3e$ ks6 `RC̜]I#:Q¬v Mefv K`u*Aga 怚:shqD.}0Q2c,@G5]D#8~P0MBa'*6}_5hS{ph:mz70P P`_DW-)=BK|hv=a5LY/>#H 38v֙~%!Y;tg(ab N!8E=NvHH5,U}Xc94{54# -C1c^'E0ƌ$dYC#lIv*T+3cG?xx:X׼[f ]O(~<){njl!wd_`c3ag7.9nGM-H4#=ӛ1Ve]Glb3A~8Atf4taWTҕ4KOK 3vJcP/iQ)T|wTWϮh0_4 ~70@XF9 !\j0#ɠZ4$y$ 2 Ck i,[eA D4|/T;0#wPhI+cƝMZdG>4n9Xn=iXCqc2% -^I9v#'3{ǂf?r6ףVN4fBLKdiLeQSnӆ; -5#>˸/˄S  s:C3w(qCnpS[b{?L(<@Gԧ:+Pb]\ainK0)2nZ}i3S-t0[$x`FM i/z:FN=KܒS`HBɲ3xjqcnU7ӸO:54FE|{7eɢ:$6=X`scTZY}]5MK l2e-5x,qz), -8}704pyȂ %Ѣ&U04;,6N_j D,r: O Sc4=cQ -13Wȫj 0IA w fX -rMQua]qbGhk< ZkdCagIU)ZL-wU,i^yū{Β`V\B5]Xa,Ҭ P͏R|գE%c399j?Fabu&0.{aZL7W0wY`nJ4qClbwA@dK%cJg'a.\+Qr S%lĨ hbd?\/W&pm0H#)W[3UIZ#`\U,_ǔK UGi.e:LL˅fƮ`hq+eJo]5س`oEQ,bN6r7`RE4K0J:A24fC:Lߖ59SI4Bд90#d7f{d@,zaZ - LEheCJqu(r ŽJS$Xb<0rEk]iEJ>8pJE˰đx]57nU{\f!keh'Lʃΐ(:2 1z& TDͨUy{Cyr"LjaW[iܤ&MY55#N#рS# fR:LcUc+ D㘃؍+B4{Йk51q=NJдB~-Sv5Zb+7MO^4 H[o%ά|i:np5ݠDžĊqaɚkXb<!$VhxA6P)4agH1jěXIg4Sv,YǑƜRa:X);Y>zUqKyL;CRCpaj&JYU%+)Ɣ?<궾`dQ"Y4^Ac}$H$pv0J!BzE͊t,QMySNHX`Buaήcsk=svb^3ڒL í0f y`VԸu$$v&(\1ZdڽSwnv!- Dy$!c 'K#QfM~+XEc>T0s} ժ A*mɓӣQV*cH͆eDoҝH^x0W#{qF&?xy? MۢVXq`8G`zC2/&Aւ%j%^P` Q88eZa1+bzENU*MrFCLaZKP%X)p$-H֩$:~] G'tjtXG1#+Fl"CН ~Lɸ6Ac]3jޫSƢ&8`\j5S<|J<ŬH3-LI-dµQM43uX=Q: -–eW'i:#3#T}0?rDѦJ}j bƺ2:+nbOe6 >)WEJ~ҙŢx\M`aT 63R+UN/M`.G8=³\lR%$$Fj0?h>?RD8aԞxј|=|W9q&0q}5Cr^L1i<).!}D1C-zTjNX#=MSjI D‚^w:E1₲ cVoO7=1/U=W5wK}M6뛸9P!l3|Mpuj,'#aS.45ji'ݰ^KZݣgH.6;~4e$k5/Vo2RU:+3Q"qkΦiffV֗'r,KȦ%LCc0J3InҢ1QG#2L8C9^%NARxv_LE%R4Vӝ#ㆍL`gUp -ˡȪ L$YM pc1_1*mTi@CDql!SKL.4*r:ۼ%v4\$h?&!~a1ӺG֎T%}f$=_ VQ'SC$; ϩʀ8VM}wBQsem؎=)/ Bkj)URMθz܍`PģK&!?5x,lؒxfdH?Cl*Zg4=Fxx";M7fg(81_2$̙jeg$%y37#^jc DϝuOC ;+bԑʘ1!7tÒ,$/$!dCKy3>6vW E If7%֭xe\r*aţIt0̒$YcvԸiaI,[W`&찄#^`r7 sE#5j=w:kv*=cڨoˬ5(EKFSJҥK59P _bn{Ge;']x$Lh*x1%tˣuaa6LbbŽ}ƍvS1I>Jv -S==A]Ȗ ј (=\o= zײ~d`Jgӣh^4I",<MdLkSs_Ecl(QցRIJc%Hn>%E/+:Ĝ<'-Zrc< tʫjFObanGUm 28ٙl0͈gftYM9*{m 'oC}]khn3] -đЅͦqI&)OIORÓ|bb͆qQN F٘0}]D3v# قk(dѓHZ]bnzwP?;C:_tϸr;4Nc0 K|0~iaJtf2v_t`$=# WlͶ?xDjFIz=59j1:I{RWSr -+:9aiL0jAA}EQJ^P/ d3vay)ԨܮvÍvP}u(,_Iw|`5 tdL6?5|V"YQ3Ӱ0B"R;o6t1wunŜ G1DMX# ~|]fD ^ABG!9LawTu?4lTάŋ);"FEe{\&psEzK4эOVzMFeWԬƈ5'*-}dFEk/?4 i٤N݆WҴr& Z^H5|Udq*kfEz -:7b㝃ƮiB-E>h!q)Uhy4XdN2]512~a #:ݫ>i -Bfl+|g?/>^[ItlAϴP=2> MvSYS=jY$0 ?HF}(#z - 8#dڎ-A; ?g#wNcL۱/fgR7g"G<rS5`S LB6gHzȽeޮXU7_59Ff,,.&_5ÄfXbhҠ$ bah?xJ)rlcq,HB[nQ8{4r픲\I J`Zx@[%͵d#)z -D$*{4F,rxllaڎ*:j}7G􀣨ѯIlL) %%*?ZR[YyRMβ1an1Zf;K&ܘJ|2GCI E:NPX}rHL++cUKNiSgltɬ]g*> 4ޞuFz -0Ϭ`/~ݮ@55`/~]`mqu)oc6KK{iy8@ĖgcډѸ^T^LvZXp`Tg(oO3]b .z8,삡b6u&Y4-P{Y7 2eOndf6+[0c;5Jl7V zii -<,Ƹ ?@jߝ-]]jD\#$td -JU82,:{j7ŭUrQʬybNxIQe}w^ -ҙ $q$jLfu3^7ΒMZ[;p-c2xQK+LofKZ3D)֍~ظDLq%j*K14R0-jl-%y&0Sjřw)d[m,LdӥuӤ6SQq<{PBqYBAW~jl-q[rT~"r!zi++,P=yr4Zx f.h<?BeǺ"Fɀ -T8,9m%>ԺO˒̒K 6W@pyք72?KNSzX: @5lo4-'ckԶ~2 J=3.WhEzҰptԬ6唾Ijc22 ĻSX»YX͸Zrϖ ,XL,`2hli{j -M2ꇚy,q֥Ý]MvN:3V`Zj,iLdda<,-KgsX>ļ6rJT?t4j7$j%7LiH+49^G \ױ6<JĄ5vNcK4< %IK*]'8IG\NdvvgIfa=<JO$&-ѯ;eh/ .vQͶ-0s%ZQ(j9~,,h3'k~i @/h]3-11JtCT͚m}ڡi{l>L# VLXQQc[m9KKT)2 >Yu;~KnL, c -jŻ[L>pbx^pԤ}ƩX٨13aICҪV'* M6Ӈvtz4l .4th g*9]E d+O(U6֏\*wxt#THD 21T*sս66l< >:[vQ%ԆYtX# VCScŀc(˞j/մ@l@(kO :v*M,R6imZc-g3w>3%63 Mj-#5|;Gu4Dۧ $*~ITkZ^Bg* 1de*[eZ֢Yj '(0c )_T wԘOIƑOw7 FŽ<#GB9Ɓm̽=VR,R=f?K /ᝑVгAf{yw2fmc<[y6k;lV٬m̳UZg2Ϡ%m|@ViN=[zj+lv٪ԳY۩gRVm6lV٬ԳU[gRfmJ={.'lv٪ԳY۩gRVm񁮯gBϞ<[yH+lvd3ƞYۉgVm%Nq -vN;lm(Jw*u xw&!µΞ4w$<'?=hJwVhzΞуw6<;&eb-3u MwQM[xgY'HBK3Nh;︳uKݴw˯gwad\{Î;Kl`]WpX-CYqgӵ׵Θ-yV`Z{ÊwYzn︳T3մܴk܁;rl:qg ;֔L wƊ&=pgGygweVm3ڵA{-,<:5;,lwv6nUVL ZLcl -}G͘y6c^v1/gy6c^vٌy١gY=V=C;,56Lٙg81Uّg-ȳ\,s3BĽyN5š-380u"qڧDÜ'lBj&ʓCZxgώ7' Syw&mR2mazKx6qo <)j -5P&<ڹC[gGΪ:& s*,ygJ?&3Fjg&7CJ3v辛ϸm3uϸ6,=Ͼ3πg Qjyviar m5֦ ~zk/pgQb6m3;F6^ĝYwǸi,j܃w6+YԆ&+ޙ1mip6Yh,Hմw{Y|3xK3)KgS{?NYi={؈cVJkzƽ6:gpɾn꫓zƮtslٳx餞=', M5-lzpϘK`Ϙ-^pϺ^`Ğ1du=S&@سB;4tܳOg]Uٹg8wb7l%;vܳ,=kR0=#5M kٌK۰gUO|t< \Ձ=Y2mUI&VYD7aM|3gFH5 UJ\/g%hĞp {UdԳn$z -F=#bv@ٳN= >wP5m3 ?bg zF~Fکg앭e? )OeUeO ju) ߺS_Uk|3˙L[gl 6Y-3σ=\;L3ZjHzhv57YfsԳĐse ,Y%ꙵJ-3\UmԳ= -^R֘77_@XZ3 =NN)Uki9nvY3\w\naa |--3Ժ.7$3awHg1F=u3F$e!bjctN>#c^wYe7^P %IOg\ՄXt3v>#y-3iʢnڂ>jBZ8}Vy`ڂ>c;,'ugaʹ~IE_;V4_;,.?nz3e/f ?#{Cym4c? @誷XQn3F??ci H^~FsXWk f&cCa ŴpGFlzAQK~n"Qj5VWn#UHLg<5,~3vyo3.AB >のf̷|&y 7|} ?g3u%[bALg E!TN>Zz2UgvYO+gvل>crW0!xY(gglE[gQj jE1%3i袡Wp}w+}zb7D , }&@o6Լg vիҼv+ q"9#ޭ3ևYiE1+l΁7gOX_kGݛ}h|(؂>k7|{EfJ+pD)c`tgҖM3 -~?ʎ7T>" >cTO?+k78DLgM-l.ljY ɝmZgE6<$~sL=g8Ʌٓ~DOVS,dCqϋU FXۙz?Қe]WYLcbm/x-iE%yQ&ZMGg;$]D[gi9?:73LtjQF>c" v_:gϸN>㾻,/DZӾ숾3d36݌>P}42Lgl2mI; kѵhSh& 㰢m^+»ZW`/XgLq rYaɄY|o|4FΈb3~}0 |hް(h=rWLg|zP >Tf{~RUWXvyܳԉ!K9W vC3Z lwvq0_px͡IOCNT{<Ŵ {FRdBiOY<{FKqLeW왗cŘM+\;8^c.3n0u^g#v+ -I<{&T%{mܳ=cb=sҭ%[qψs=Ix\;,H?ظgDŸb}"7w)i{Þi~@*ϸqtŞfbϪԿIuiO&6 ܰg MԳ 0wkҼQ̲m1¥n=cǭαR23کg^{feL٤'nC_=|z>]9܍z&o+L6|\;pF=ozZtw8wY7iǞ8<سĶ1 \ڂ= YubϘ*lXgU(0%-3'65\gt; -rϸ91=V{F~Z{ƾk=v{3+LzJ {@EgɈ0׆=)^׊=sŪ\7gbϘVDɂ=B6a8aܮʌ=c/ -a7ٌ=aZЙrXqwظgX# ̠d%'sƞ zl${F&卆^g,c Zt3&lܳ -$q3v}cU+L3"+y1Պ؈+Tl"^ g|7S\ >*\ ->s<9 ]D9 -v3uqZg^8&UdVVеxT%~wtw6mkyYQn>W6 >#'=Izm3iF5ZgLe+.v$Ҁ3%h ->IC[`f:ֵ|vgkIl3ҟ e3cE?L8\;uJa>1Ϙt!63":z3 s -Xg<yǿŇEv^@XF1c2.р2 z:]+v2/3fe % ^@Ϙ `( =c2' -T[gxw٠gldSu:g$Z!=Sh zS^K3X=KOoe 6g`ztߡgکgzOO; [wI= -کgLAAj u`)eǞqSr6YM3xΆ=[\'LAKgI15lឱm4H/g,.>ĞMkJaٸg3Xv cN׉=szamžqŹ3n=Kcyܳw@L'HN\> Š~?h3!avc!g\z3>5N>K4Mip#14p3LS-䳀-4NS[gyBg1}YJ>#tILz,3%hÕ|ƣ\ngr2$6Ϙsz-7Yb5^A*g$mhM_0mby Ϙ+Y mc]}&֔`>j쮝}יѤ-wxςcyٴ~&.=hOO -?Rħg6tm> /u0EG$xcic=N~F0[g$}Uhg]gINfgw}aanmbU빗d#n(>sϞ+ ~Fbv6mdϢ4~fl1 F'p;1 @ p%J@cek'!m= h*+4߹Z] h24mE1;ܦƦ1O2xJs61В4lM 4cKDSZЎeƚ/a ȃ|cО4܍@c'mjQ+m&*-]g4veb҄>[|+l.Mس]g@vib҂<ۥxKl.MUZhg4vib҂:ۥtKl.MUZ(g*Arvhl١MU[Ag6mBm:;ui &١MM[Xg66ma:;ui LlG7٦-CXg66ma:;ui &٦-CXgddD&٦ͬCXg66mf:۴uvhL4mm6mf:۴uvhO!MM[`g6Tvi &٦-Cig2D]['nC{iD;;vi Lb@vi &١=ig*YeD;۴vvH&ڙjuuemD:[s& -մsvhl١M7_;l١M3F*{:; tZҶ&٦-3y5MC@gh B:;tZtvh錚t^;lԙjq٦-3լcІ:; u&ZI3CXg1q": -7.M3r^+LXT+TF1YIg6i圉G7t3b -:)t&L@gYlf6Y:SEu34~m34vЙjA@gF[@g*9歠3ъ@g6{kt&ڨ@gy93jKk'VFt&R@tFIRմ t&tmQu65gouW>^lQcW}W=wtuU謳sF)Jřh3Ld+猚l)9-2fړsK`Ŝ\W̙hN[0gDJG`d= s6JnՋY1gzbֵpŜϊ9[m9[J9[ J9[ -9[M -9[M -9[ -9SV20ԺUc~35a<gu[gb6XRMgjޢoVęhqcoe+ƙE;ҰAVB,Z? rr֟µCԜ r&ӦL-m֊q&$QL(gJrZr6̙HlWsb{9׎9MwX׎9Žnn3,CaDLRlÜYmڄ9M[]L.|3єs3&N9sd7Ιh9m8g 9-Ys&&ɴs&Ozs㜉Ƃs&k詵qDJk眉ˍ@0g"% 6`DKsރ1sFM;\ل9My3׎9`ڄ9-1v̙hڂ@g"  -:9Ik5s&Z -qt㜉&=L@g·,{"LsHL=j0t&vҙhp ΨSgr%VHg%ot&(Hg`U+ҙhE^;L46M3Ѽm3j^t&Z3N:Gm"Q7vv%6#o3FǍtF _QDQ+L43Hg8D+L46}:Y v&Z5bNn3jΜv&^Ψ96Dn=;)kuG v&4l2mQYS+L$;A(YQg10e[Pgy+PgnɆ:g6Ψk75dڪtEچ:vT6ԙh7uEQ7uEQss3rm3 ̈|w#Br#uꠙM3J\I:$c-3XLHgԒ*v5^'J:fOᵓΨazΤg6vЙ3tFЏ3]{fλQ*kRY9g6vĈYα0κto7mQ@gܭ65-0mQ6%9O675 ^9ki޳88gԸT rΨ|IQgቕsF`M3jako3j>;3捥̀M3jW.gaW9 ΙT9ٯ @qΨ4!+猚0iZLΚ;qΤIQc9m-W5mg:Ҹ޺l.헌x:ecn3jE#N:ڏ tFZz];m) _v3j%BtF-!YIg`8_ -:c㋛drΤW~ 0b` DAu;rS(9QΤEKa-3j޴rPp6rF)AΨW -9ckalۛQJ\r&ss{Q5 +LN^2m[ݕ@(WmBΤɕbc9bL38s8#zl3jғdѤq*/gԢ6`vYqQn3jOV8+ j8qF)F8b:Umΰ'C:vLnfu<g}b3 wp֟2;1HK+_[CYpƔ@A3<g:>b 8cAm>6;|v 8AK7ֈuE-&>fb v7avs7+-o#L;L23fwYeo|*~O9xNVg) m1ݴ!88 -pVXbh!8+08 0oƂ}늿͊3o[fܬ&qm|&ƕo&G`|3AOodc;ͤ ̱y9GVMfMߌJ}iߌ tomcDVߌI9oCc[7l5Y7c?LFM7c>Z;|3Bj7 ͸ юPM|3fPrvY=- ތR:S٤ o֞fn\7cN)+8l8tÛ1[$xhڌ7c/FSf7QnUfn˽NYr௘g|3;ߌu gĴpNBTN+u͊u1mᛥqr:fMfX=L[fܜmx`[#6͒qǛx3Ka f8М;̒C[f Gx3,okp 6K6Y7BoFTAufXf51x34ux4̈́NEf}yv_fl*XV^f˜dpq˞d3nB /wmd̚&ڠ=faLb$Ӟd"ǫLdrs?L68`3)xrLͤ l6 lCIl_{%Iʑ\f1wVm㻠̈́iIkCph ڌx_Xrݍm1|U{ 3Lsɝ*sk,b?l7d;`7ӓlFi![/c?fOM5F7 ̈́Nإs+ٺvև';mfՍapWsX8Y-|$aze 'Mm|3>Rot눦M|3:0I7/|3fO}C+ߌm|9ڍopƭv.dubя\g)k5ɵΘٲ+- -2}hO2뭀$Uih8[~VK6HxѶ+a'?L|D[g푍jD8Պ Ӟ,Gп`dh.3*p.{+ $pEq}V %8-dovƙxK+8ɾF+,nCIxq>m3mbE)Qf8d1X"|&Zbem3IUD8Ӄl8&--3ȸHEșqHy8#u}eEV(g22Z3iL'Lg 67YcY+?_̿~HƦzZv1мiuQ_;L:"3L{201l31sMgEj61θ-')#-3vorFPLrm9ѴQκӾ匇0lY)g| ^J9Kb [ReqKƵSiB΄z'(M gLݵw솜-hi7;*[5PΨiuz+LCa{SbŜ1o5P0gv<ݹs&X$kǜi 6+JBI sFD31e -vU6̙4ౚ2hO̙}G}]]VY{]Y;sOq^v PI*zҝ3AR,G@s47dEB彾n`/>i9[;ɦvqh:$s -1g0Pcΐuǜ=@96,RV6K9{D9cc0.X-`P^?f0gK {Τh1g㭛,33ϱWau5:~ʚAg .:;"/AgN^t3^kDt  ]`BF:cgS 'u\itb &́`p3,ZP1 :[v}jt -pΐ C*M\vq0v&{)Vq),f9 -+ɩjsVmel!O&T33܆]Zq73I"Ѐ9Mes&f7ҮgsV=cΐOq!0 S"(Q֯~ -"º9aB59,1vF\3:0T0P.yfg䥶IlcI I=Z@a>׉q#wmv3*&ݔgah;g*=8 ΘawGri,;8v[j628C22-u;0ΐJK23L^ -P3 ~nغ68gQ^`(ZaWWfgYbw 34ǜ.N㜡NCvy&&9|xʱC:`ΐ:(i-sƮz8쮪l_ZĜlZs0g'j$hœm=Ǥ͘3z{"HΎ 3E2 8hW+)Z,RvY'  3gY3,#{G9c!-RPD9 }-B HBjrNA9p嬲Vq&H9CʊN )(g8Ǻ(r\틛f g}Ag% g>9Cj9Y)gph/:ڠ!WI;-RWR3) ĔmSÜml ǜp"KFl 3x  z,]3d^_Qs'Es6aHUyߑ%9.*Je1g뗚`V,̀/ZĜd -1gb(>szAh1g\;މsŵ.L[M 3^rۛe^iL!a:[Ĝa/A3b:PEZab6G9C^QFrM9;?g(gg\ GO9êN)Zar3Teb;"0mO6= ܳP].rˆmH9yK@9=/2kSǜ XI3# ,k@9C/(g|޻9ê0py ӻ0g(GrƵֽx7Pΐ|P#d1O9.{(ǵ6(gwE 3Lta )QZ\T5G9bKd(gh{rٖkrVQ g -X$%(]13,&Κ%]23 LA8z[^gHLpmU0j%a;4;Y{}& BkA9ˁrf!g ^b0Cά(g^3yΙ"ktf:gyΌig^3EYc3kxfӒogVK" |@>;MݑnvC>cUR͓ld&׮Z a&q738o*;Ll QfٷNog'[ݩg ;w!Y?٩w3Eّ3,dw"~wN?]0]0p]@gpl p ?~vf[Ea]Y˱}6V3LT gg2fe ^ ?L~cVÌ?3H L\őMA g1 -;ȘgL(gpZ Dğ",]Y3,cgiB%N8Tql;hZŚsƟh'R)նB!D?K# :eO,qN`aL3@CJT" b>VGk<ЌT^$>' h(h"7/&='#а h( h8аrh-qwm uʕ>Ϩ3u?C Fj?fDbR6*&Iѫj= M쟳jM=wp]v@+r⥚P8_q Ml7B+EIC@byYdv?v"oI`-h3?3tˉV_?cEh4?JM^/ng j728!=?lϮݎ.gc>zz柍? ՙv-*gٵ8g::nƟ ?Pϙ63l 8gX3}$ݠtrgʦQEE\.DYB5?Ka6Xf7g~6|fY/el3,{0x+B&  >(YZ 9u0Zx?;3bRL3*n28Za'Y^5 ?C%Ygq7H.Um]{mʭ fϨ[dKw' Ev<Ң~ cg'&KJ~v^V3j~vZR`H?Yƾ,]3A3&[3}g9UfğeɌ?;.fn~L.cD?)~;clBng|d%ϐ&,6B1gC3ašgfefo Lg#qB`<&C EhF ?K/)?L (6MלhEcۉL9g:z?f3"g()9φ?WlAL31gNv@x,]Zݘh4e}"mWuwh+5eyM&8#f<\#3,_,KJIf ;w4<_+&y,bnh1g6&M] mN&xc*y -E5H@&E h|hpQ<˪9/491D@kFsn :`!)4@^|j%g])BgjoTT2d9ScVnt*5l?)Iv&I,vFAү Z1_l@(40АoEFK vb' ^  3gU5@972h Ҫ@@c-#:6(= Ȫ:\Z$nk.>АJ˪?ʗt81T14uyQmFM+:Z9@xaUM@T} Qth넨E>RZa.hڤ h1CY-"pj 4-SMlR{RvjHvqBƬUM }:{ -hU<jcXp 4( 4l\S=j{E̾H4pը| hHyXqA1АHu>;o4Am&g jc/C -gV,IR\ 4.8/e&c^e heB;$@iTF - /Zc!h ]VL,jv(A<⁁p4hLV@3` H=mbh؅af3а;@sC H:l0؇zfbhz:[cCPt/j, TE4*4yiJ4%.~QmP؃JW4)hL[u1XcJ%34 UQm-j6QPx%|z -C -QQrb͒NH5;%;!Pҗ+J{4lo2fC%F@EgM%+:ZceW֗CHjB")*`! -+8 VtVh9ywh>-@U PBr 4A>h N -)129-2PQ{g.pzn? 4x'U@ƌө< 65k֓@ TL 4얯̚cUcJg h=7]lJ48IbJ o,UWcqo2A4vDG)@CZHa.㟡ʬYeOπTKYzgؓYM!ȰfgNgw)- 3@S+[ǘe|T3ئPRg|S..ß'fggNl2Ԭc lD -qwĴ3>ZEA?C2l g+R5?l~ 0g1N[%Q~0l~d4g14O?"rU~"̰넳~YkbmmWn 3C *-`CO!K~4)U[X1' ~1mE2l+) }-pg 3N``a)r"YkKփGIֺg@At}v̉=cm s~M&m~&g+l,l~qjaLS޹8YfEقRm~0L"v/q < Ha$兘bgҡs ?þW9Y I[e.]8&g+gf_Ǯ>ۜdòEY-ϰ٢wEli(r:V 3>;*SAŚet,@wea~(y* 'ڳ؊9F֎vĩ?gys> m73du];}U9V=FWnQ 3)2_f}J.c!ya<>`!T3̱3)!p3Ka:33w3D/cg=O ~ ]6 g bVU?a%3~( XgXw垡g58{矡orgM='ll hH@_:,v,?ghߕ< h'(`-V,eS>hdksU'g,Jp 4T`rZ !U3 WА-h%węßHU8&Y6x8) -3xRZ H;PV>zY5 Y epg𜣉^UFv{)jWg |`Za~FP:x7}T3X_ g!Eg8p| aoK lc^R☣GXs3Ա9A,aF/(g %xsZT}-Z -DZ\J3V)8n~=vtU?id?3̖%-8gyJ k~'gqj~g͢>A~`hs3dU2 3l*xE xjYg$Eqg`>L>+8 к6"fm&qʩIN3M833Tp3RiP3>:S|Ff|f,C&>{|x s3$aSD!|p>t -$^r3[Zj|EC, i@ 'ǻl?>LܳE27 P$\=Ñ:sϐxy/vk3̠= ^њs" wݚ.`ϐOƹj{bj&)37҅gpBTg(t 6]ViPϘ'6gzŪjzyS29QfgKmLjzVΫ"@8yYV-Bley]J[d`*y,D,YU̳{σlaf9\s^gp8kzyazVz=Rг&zҳg\gءyqkpa>ۭgavC>' i3lKj|a}w[{>WX;x*FgH E]= 0V3¢g-g{l3"$=ZEpfipfmpϢfg6gQ3ܳYܳYܳY, Y,ll,j{6k{5===ErfmpTS[@=ErfmpϢfg6g6gQܳYܳ9٬ ٬ Y,l,j{6k{6k{5== @EͲfmϢfg6g6gQYY쳨Y٬ Y,ll.Yl,j}6K}6k}5>>e`&s}5>>E?A?ڠڠEfmϢfgmŸEfyfmfmϢfg6gQYYgQY, ٬ Z,M5`TYڬ ڬ Z,mM45 Y$ Y,llK}6I}$K>>=Sk[ErfmpfmpTC_E͂fmfmϢfg6gQ3Ֆ5w E͒fmfmϢfg}lO> #E>SzZ E͒fmϢfg6g6gɖM=nG ܳYܳYgQܳY3sfmpT.aUmpϢfg6gvqDg6gQ33~sfmpT{6k{&Z>ω{?egL5y4==垩V$qT1=&!z --PfmPTKU,l,jz&n -`T؇;Y,L5=3ր:Uس YJ[YjE}lL530 bTS=Ş$sD;nqT[OEYjTE͂DL3ѥ>SI =L4 jg͂T+[p>SM]=Lr3PsT|=&=L5MZu3z.瞩/WmpT=SiM= `Y=SM+MLZ g-Jt3 -Ug":J>Ss9[M>SMS7h[F{&X7= YJI=cgc{&`,YH!P{&<=SEsd=L&9z&ZC=Sm%— h~aX֎D3vGh{&Z3xh bDcj{&'hfg_r3h۩{&Q$ cDh g)k'=KxhJ8u3V)ADAD6AD[7z&T=mH*G=cm|wP=yw3ъCz&@=cMv0Y3YG= ڠV,Ll99kڀ&Tg"!Pi@D0HB 3zz&lV.Kp[=f{ `–b %Ddgp)^ÞcXژÞrG=Pȹt$a=w=;;'By.C=K9cX=cDdg(G(* qZb=C>ecؿ{vD=!~@:➡Ff ;@, ~lt]#1MjIb, LhfgTXh\|;؉#F\|NekUΕ!A*R3Hh >Bf4>cV>7X_9 j}^1+w7gЀp^ngƂϠ!fzG>3_l|8@j ov3 : ؒPYͣϠz͚AA6SCqXmS33س7>v`/Ŵ}MWʄ>/ARBAT`y, ZºEÄ- /Z>P]3h >FG*e[ZwcAЩu}W -r3h8:s.T;4{.ѵ}͸:#ұ1G ~+uϠ3wgG('Сow_y44 Ϡ鞜| -FdvVR킟qLmB]wbLHy4Xӊ.'h~Vҥ,, :$0H@[Ayc7(?cƖܥNA: .l~t Dg/XYagZ6&턳 ~& s]LL[3LOgܰTɌ.Bv32O-IB13I!lU?{L3L;yϰ -T + kB&mW$ ?=/kgXQ{u}-M1Śaa1mgXZ!f}%vיTgX7zeg]PS^>cb-x]Aa --JI ;b!RBa' % >î+-ӯYS'M38e 4g%5>CV g8M5>+(ϸW7,!煋ϐE~C< W.J`Jrk~g#8- @٢.K?CwTR%vPgﳖ- +vVogo,QeVނUo 3n,%O?CY%uYQ)yYVX30;Z׮ ٖxۥ;0ڠm%8KgUڠ09f~ ݰ0jc[ѝC{6Y!H}t3N2TGgmlSi|--xmh| ". @yɽehEoJ .xyfKS" g=ƒJ((ߗ o<8p4JyE@[٦mИ5Q -\34 ,ou4Ƞ\yO, نIx_;KU'aȼt@X $0VvGS$@C?iS@CHUȆ ϠѯYdglЗUqFJ'<'YkȪ]{5IϘmaM7M6w3h'.h0ϘڥUYlƐCU1O3nş(g($*g~V9KWTŸAZǟ1!_?c78# 2)3ro2q;&Ϡ!O{?c g^h c"73v`/d?cKZǟ1ex;P_8@XYԗ+7/MϘ/`څ?c˹ͳ󢟱= -Ȓ*~&ή}'t4?=L- evVt[Q g]3cPW}-j< /~/E0A͂OZaQMZU@ U,Yik2̖~$;l鞮!3$U ZvaBf-?  8Mow6ه[ x|YLwu389x?2<)arH*:?P<- <9ڀa.ڔ"lG6g;vO?yPR]g!*/`"]1pęh ߚg;o!rƟ#9f'"gi+<@1h?;pJG@`3>43?Tglx6*EϐA/)??0\a93jd2x.锳A@CehXu(F 4$I8cR ->U4NVN2aPq%M Ax2K@Cǰ4duVjvnډ&jhz*h'w2Z` x!Ѐwa("@ޥHe..IhPN+@$[\!RG#mwFR"@@EA;$tBBml_ -aR2`eh@2 C=4,  -2Ѐvd9.UY?8oEu4]$gTS,HQڤ"A@}v6u킠BMT h(JSxlrHr3 _[h຀i'`K^h tЀuYA;VMk Exm)o6O@ۀʼ6m5?3M}A5Ayنrfg bP3? -ܭ\gKcl|6o~U.iu-lI -pЂZ )XZGgN]-O?T ->&;YBIo~F&(X4PA?:U- [\Zm\W)3.?RzV)-ϰ؛I3U?,sgeJGVmSt~Odd~9+J~k9Ҏ, q<2gȜ5.xN3<= LRg;g3DT%{h6ge -[og qg+4\A/J7c㼘?~FH @@m@м?hfhFF@33j ֥ڥfhF]+K<^hCzfh]{f1g.9"Ͱў v^]s4M4G{ f@spWhCh*h6h74G{ f@p vnhhfM v@3p fh6h7GhmY8 ! m8Zu6 &Z ̲&aa  J"Yhhv@3p@p@pMwYY6ZY4?h3̲&h-l":EwFaZhmY8ZxEڪeMhfv&'h h݇vTIٿCuO[څGh̅hnhBQ%R}}G@vG@Kpb*ȸfhfhڶ;-_Z$u#e A<j4,U7ZW'ZtqCA f -ZʆvKA ivtvLA|mf -u -`(hí~nw/2a)QgvAC>|DA+pO -rN:4x4 G -Jo(h4[uTjaU!OoI&jF:@4V-@eѸ~(&lQ%? hؐ DAQ-@xV/VLA[ʻQ)hLN#/< VBٛ hw,@Вf0hrȗZXV3֥h3EYfM|펁V/@J63(.!]rmn7$ v97V74pV- ж]nhE3 >5&5nٺ!J!J䆀6톀FT٬74z/w49v0ж3Բv@AWM ^%@C_Z`qc@Bv@ hU JvGAro(hgfvCAeR-PԯPr]KmnxZ,#^~" EDp'Z7}kw  rhqK43$ 4i7 4qgZ{ m;4v3u@C6#F)܌@ې%ƈ@- O,%ˬEũhCo hҭohZnhۀNS5O@3H@+JIj74+'V%L4vu"enhXh0ғʙ6gZ o&`@gڡ;mFimJV +" -c -#,"trCaO &[3mTgű[2!h'־nhCQ@D@3ϻ@"m娺znhQ&H$eqjU4\/ehUr7 m4NN=' ,g< q!a"QSުjVa/(2а9gF@.ub ޢƐ.&Zeo֬c&JvqfBRC9('ږqUs4O]]H Jv2L0SGɝ4z$WmR"|DᖈL@>Yǎnh5L@v_Zh$ hǮ??"M?gLg CJ&ԀC5?@/πLYjtCbF+C1jSlc'FuFs# N>g[aVDg0v?xsJUgW.":j3lʇ'X ,{-c2OL?K {'Pd"~v.b}MH?yxXH?[_POZ ,y q > 23. |j3Ag!$>;1v |oQ|V6Tõgp -E6#2h3&ID&!и33 -3xTlnY:Ndgx. }Ϊl},=]x.E\}>`>FkG '\%L>"V<qȒwg-&~;GώL33" 5ӳ-wErz͚!sPY.~)K-1fgTw9Ya͹)`xlJNp3x[V:[qlF]`~{9QU." ˪~5~3s`q!Rog)8GA;l0e/32O?ۑw>O?á VVHFj~swtwjK?C dgD<.HO?C傽:Ry}{O?fP8Dg7e)g IIl~Prg$=#ϐACla)~EI[a^Nws38AW-Y5C?;/fv1?cnS2`g`] \,= ' HT -s3lp^Q`/v+@?Q*3ngkP 욷@?ĄI73t+'hfg^O?l -`4A3&a23P/*Y6;0~lgp_ kAs3CH,l3lK=;8k~#Pm~~e%fg֎$U {'f}?OVReg O׳x^Zd{m= 65T33tNg\ܬ/gׯN |gw*>C% ,}Z# ,$gZh}zCHfg䨱{g436HړM3VV}v}-lugRwޢϒdg,.fN:Xtgh>Kg_]:,h*{B-} kgKZ:<ϘBL/<|Ggj}&= OJx? -ݣg!| z~I y}& -xRgrگKDs#,鎴j}2Ή3ԓv^.dG/ a6gvjGaF[3ӈl >!3-MZ@C92Uε90ѕE 3T`RCAj}Z" ,PW}4i9iUɡumDvKڌ>C:fG6 $8ll}sGa7 ز賃62[YJGO%쳅Kó0KC3zk-Egsz*g+Yca@3#,C'}tg8Wg{ ]~e1! l}(# -모>[ ] mA" EA-Ϙ'<قzI 3xOfwـg~YՁmK՟gi[?[/&~VaSadYX?c`VU?9),Ia̴> E(>+[ ˦>X0Y5>Ù57s3vEse UK񩛤?C?I˽l7G?NH?>13fg0A`Ol/Kxp4#D?N,K3}>0n(g$<fgۗ ˱מ}`0 }̡ϰ٘OwF%#g;>i]~U߉3g`<~Br^6G?P/am,Wрv$D+}BgHeJ ϲlg8.j~j}[g?CBUlgZgV:gjK'pGNr3&IP 3,Xk?[Z=˄?S5?Vcth~ay9}e[W5@Ԧ6.HhZfh؂Gdr4Y-2g1kB?d?CEF33d2ao횡a+pWp3Qfgp|aHl%U5G?ce'Yt -dʯ3F)zQAԆ*90pU - ~Tϰ.Sr,9sy?N3qѿgH}g8r庙1e^~VؗI7~ -rgyl?+(|g8dJ@ßa.2mqOR3@?C}Nϐ)g8ulpR]gmQhGRCh6&$a#DrTfM4qeX[6S4dqgY :-Gi} ő-ytC -6 ӨEZatZ.u{F]l= -4-8T)fhsG34DE -'R`٨C-*d26/fh'" MqXFR`!ydj 4l?]{t!UANePFM*:}  T +QVh >QcZQGW f hG+< 3~5z7 &LZdpYgL4,jT!uB?S?p_˯j0ejL1H_0voB#~= -](6Iv'07?t+8?+o¹t@[~_\?_0D(PrK_g%y&;gd$_}o^ a!w(CߏEP̐r&&e0C;fdՐIFvO++=J.y+oD"fp7/B }ȍ/v)Ú{t:˘]>9 +ݥg{w$Fw ݑn=.=ܻ̓zgd\z&wGe;{kp3;/ݥg{s4 -[s .9p_ԻKx M %;2QKrۺ - -\z&7G8+lR;aw!Vv̥g{sVKA+cK7^+/2jp3;BmՕv.=ܻ#O@$wwG-:aQփ3 [js39BZ&zgB{s|WձLXo t>\x&7G~:s`S\x&wڎW ݲ3[Ֆe͎Yi/W *v~W?Hz'{g:{2 -88=:ҌͥgB+W\E/=>>w^uuP<]z&l,A31q˿ 0<(wmK>b`?0y.&b[wJY?_3lHPͫ#A5>Va>asBybeλő+)ZE΢B<&۳ǫ)nX=䙄g '/]Y3x -_ -=_9@I/`|Aׇ9, Քa b}C@h(W/_O tG>3p13݈sZ H֠/\Q_ʜߺK?KkUrSz>5Owk>wj>v7-0՟}͹&g_ *z۠5%hBozԍ IW6G_ -*ͻ4)]P, -.'_ *Z۠%)oz\J0A']_ *۠%hozGm I -v.'}_Zxԣ~/]POĿQFUozִG A -.'M_ *z۠5)EzҔI3B -.'M_ -*xλ4%uA?qobzԆ AWn6m_ .4AW6m_v=KՉ߮λȻ_5G5|ɽ#5 -kpE!OTKX>{ ǰ>Py&ٮ>{ ǰ>P}ae5?7a*{'j%,_D2'. -CXė|)~+Əa}_r1㫡+a}"_r%1>}X˗la~+5$W@mCXװ\y~ +Q}B_r%1kXH?*} kI? -C4ԗ|~/a}Z_r1KX`?} |H;ĺ}G5EGt}X !OKXx?} ˕ǰ>P/a'*5,W@ CXװl5(W@%JcX嗰|1/a}_!OTkXeGj>Rկa.?QׯAWt# G?D - k~o#5/a}_e!OkXTkX{ |+a}_J' |_%!OKX?+>Ra>R/a'j5G5}G%,o@{>E -&!OHX >7A} @V!OxhX 7 İ> ayC'4,g 'uӤ~%y['|8` 3bX9@#7a}!@*/?a9\-Յ1k0 -a})@V!OxHX, k~Y >a9ˀ<$,oklbX аq@ Q};>w}@8$g Cd-BH?!U'\$>3A}I@ZnJ4W_4*F1~W:vH -δWkԋBںR,B5ꁩ8$߬VǙ zYYC+EZimI:uXSVGRs`/>XJ~nGW@uJs*^C4jKWը[ЅC@YWN=Ue-̫:ꋩ3$vzKIبͭ9-ܤˀ!cE&#݉cU^ ШܲqK -PiFL}hyDdzһ%5m:M5zW| dsGۜ%ScNg镪rzHMSU0M#1hF-,]C |ҫΟfetAS9C:jn:cjN n*m/X3k;>OjrZїO8E-P'C!E~n)J4;iɖhUhUeќ,!Q>i~Y^V ˙hD^hL&Dƍ?(H9:4鵯keڼjg;6zuϤ`]ЫF^Lmԍ.; ěB jW|3 bOҼ j4|$㨽q4j=/KSG枟:'<۹yEz~Z-otI+єaY5cSX9j zb#B/F/9,XH:{7UCح41f&irO|PJ71% hLJLJ6¢1qWZ)f pKY7l$T y(;ob&/FicaZ&EGNjn'~xiLOegͮ2ЗнsrjRһ뢾p۰"(xJ.ЛFMH&NiLdX1PtPG<5Rs*~B7vC8M4NНK`~Rx؏v}zaz'h0f'j0AY*V6cAM9#+ 5K0:M -P)D͓4<_8y~/B x64[8F}!qZGl1DӠw. Éh>FT -5^[o8M09PUjŨXe抭4h& hIU#,cJ}P\US+?qiU@]jkg6K,Ӳ,j4^/}-5ԶisH9ԍ$#(i4G]>u_صv*ϕ`ܨF+'իLjh"q:Gmi$1!AWˬ,4BâFF=&CSPlP3DSCu~uj(xSÂ} t߰s@sE?!kDhyKB͡Ҩez pӺ: ԪQˣ=>V4GJ2C#\Q~Y:plrWPסmpߊ`K&L@ ?y[6zyRkkmύmsZ 6H{jw~xlM^{ '=3Nv Xva;b+ --L8} 6?n;[l]q5 ?iZ`=MWVӏًm/ˬ<2ӓV8ٽђo9)o"g&/B!2e5E10Z)--NE~iӈ+ؕ\_-6;,ɞ"~#B,|/{j;[xl>ݥ8?:cw}=$}lo"+= -YI^574[6dEnݒM ̶w[Qs:5͞K?7g!Y`jGH*ǒZHHbq"e>e,N'8_[78B+l) DX: Y:y&R@zx47#dŢGh\R߂=vl? M[|{F놽jT,D#Mw^O 6-yG!ضE&&8]u1 ź_[\盚Ii$_l,YYl+NX m[ ?mvo`->XΖa[,r>Y@igG#!e=7<ٗJԮ`=UVbR~1VVV[nM~vmVij~5e/V!xW4{,mT{6 ͂L?`o&n7ػsQ.ZT.Mg.CYU^rAUM7*l)H L;+ǟWg2xFDU5/Ml{ 4ؙͱE],޿6{ 8o_:,^oJ7v2Q5S!YX n~IDk磀gOfBnJʧ BX]Mh؆ʛ'[}^^aaZѶ^^Kێ|?[m4o56^G[m_Hqhۥ&{+ٯl1fYCG'kUs/-+m &cX0O`vڲ?+;rDT֟`g` >Nq5*#&k ^r%'3uqJ+h,'؞q9pڪgM[]J|:sFm=U?GҮl(Yi.^-qe^ynlKa?^/E`pzmoBw\ -WT-!4Hkky'~I^ޮ,͎}&$?-6T)BY{6;_A5'[0,;iw4{`\ p\.jE8Q;$&o1GD54{m\Jt9X4bmOy{{hrdopunq &Vl]bWPC_E{td_ʎF84-FOOL4W> -eM+A#GpH$~=]U!L\NvӟǛ˶0Pjeϋ4\/wG|_){. /[݉yN4Jy}/(S##f{T/ܴW(2Qv!5IYnA{\l?NF×5e,$prE&3 -x lx0hxEџO*VgU_N*Dg_VxycɌʯ[FnU!*S@Vw]T˛*J$|c9]Q?IPɮEv}~[,p8~~;Z*,F[l5'oq:A$d8D|RH b;.zL,3Q3XB(͏khL`Yaz;A"Cl4o[h$kXH)@XHqiFknOBk1B/[].-]lvrf_{I *L˖Eih`?{TC! l$m}#O$HGlE´7UڟZ"P ڊg%"zz&ȢO&£á$ 1l]۟M:fK!Hv! j 8 4w=iݛ97BK(>OjTw @n7A&CvFln54ѱS@pXV@;;$BHGvfLoiPn*,f:*ll]A(ASU~'dokף"),Z(4wĦ5,ZP VKX1J9yR4"{_MYA4Juv_]k;w,ܷG؝-O:M~lHNq_Mu_be >/izj%?I4]\>ENJ=>q'xAm=ًJhE1s,PwZ-Hti9I3~T_ݩ~^]r6mV߲&cG`2_7tju,v[UR_ -aU#4چ3㡴~h)iz9 lOλgkK -|7cc^7{|?]NdZwYqI_Ǧv&ת-W9Dݲ%sQNP@.{["T?Z鿒Rq42Z;?:^Sfo_s*['-M,ŵlK[im2nkvTR#di{wh4Y+blʒ¼I՚Hc -&r+)f H5PהdF&}h7'cAH۱Dmh hI)ORy 괰sf^+GJ -y+iP6:?vyJhę ޶8NQ$*g[,}r WhQr`UuX -= rtմǓT.'fkbJ,niRRSzC{bf4ڄiEqf3YÃW ];ŵCtlۣ)g+4[Mm1{FClL!YIFR,?F¾#JtEТ{ 5_kot]C[iOsndc!-IJ$._8HpȻzFkRC -*[_u/Eٹ,qMlE$mfOU&(b,it5I^&..ǢqeNtzAn~ht(Ʀd]"`_!N]HZei֋z]o|#h) Ɣ4Q)N''O۫7B27)jT&h=K`OC?78wC o5>RmsԵ1 x܊fۣGySABo-w\MڵH OOYj ~o{a ܯ*cE7_^aNe.K9 {X[i)yDrgwқA5&vٵh(OӐ^37R%هN-F=+BLh++[4#b5s`-V8U|i*Ʌd襌+m!+*83WҤU GxqZeVו ‹H>ةk(]W@oϥ`=q5/oufU-Q;D2ւך4'k몜7/PԎW"lucBꖗ.Ej-=Fr؋.mv,Z®}A(?Wrib`6pAc ;z+Z&OLCpl-(!U{y£| =$ qRgG\5SG_b/u%ܼ,Zi^#Jtxue+b;f`SZ`idO9xVHq :,TWCOW?Y >:YDam9?hy'bea0YGm2`pƫHL#{> QBR -,WQi(I'[ⶨf)D:l%fUa< Y$Ԩ^\gԤE褺N 'Iَv36i#/Ø~@VAЋ꾘, p"ٲXXtjO_. Jq3xqR%fp8ǾI9h+QnKJs0@U}VW|3ڮ KnT@ -(zs-JTŹC+t,E'3:%N?lGZr;ʊhtTUGʙh9%-4/p8=|Vwj>͚)v1Ui9F6J(v [Zx2\]Fۧ?T4yA(3V.M'qyO„WFi;F)4JGXli)<;8h34i5f S|QZ0JyObYy86 9I4 -:l+5#M1P9]Z s .qԂ`FxО1ӳ['til~c4Fzb="\r9ʞh --4AW. f]jn?O)C?X{R 홈I8/\i؏Nj m;f&#Aâ$$EɎ)JeuʳTj]cRG[.'.fMo˾&4_Ȋv1(dRkE6j4@w&~Ul- 1ÁScqZ3C3: j]! yZ NTR[hV[vg8}<(Xu(k(4{< xvlb`/lwRc%]Ek 燋&1vOz/h"N@{g$RWʼn%4[?EyR֙~0&ʩCRh.;G -͝2XUC4}4tJc2U?G< fK/itx<*S$F\!͞K+ff`rlk{*z+z\n!Ej:R@/[9"$sŐnH+7p];Blͫv.FUi%{iϵYW]7g1K\F+Xԃ.*vQ a;fO=|\HЎߥ ^//.E'!BvWh'hv??sZ;C=9 q:/sMa;pnPqѣd -mY<8v]M;u$ʡE-~sԾdU`ײG|nCzG.fyjE?)vriG4{umK'(/wMJϹd/-9C*Tfa=IgNnݲtGcW>g!lSbQ&IjvcҮߞe k(FL2DH~h։hzI5n'-Oͤ Zr-QT4A%ߪ$2|mBT!- Μ:"/}yuD$g3I" \,Q. "ϓi\eO3ו}k}r՟cxz$fYg^%}aA5Dtn{֑p(x5$4Mԣ읱7h/˛[;.q*MSBć3ط`*!Zb~RQ.eyE|X>Md٢~ؤ&ͻٖ)LS~]̢}V@h73w~΍fZz$2wuD%Ḣ%=@mNFzDJȺa=Ғ U/ -D/Ôytb:nI=–+7-kXE:J'5@w{bKHȨ{kƷADfK$و>KNsrk6|ITH| SOy7!y^:4?/0H&YrG(^o \7ĶEm4$hP$H fz곬ycr)8 |F"?-1 b" 7~ 1itHN..d3f/]~=YZB7Y'H#K 予@dm١z2vo./[M êr$qFۻ -'#~Χjh5YΓJ$>ODkPDF0HlM-NIڑ2qR| lkrPF@|BLJ!jg%#@ZL#Rk'iYً§h2ᡣ#(MCdD)}BDʮo' -ID{j }9~S0J - OrHB()dmРnP˦v7&*Bfv>?d<"FwѾU LLmtj 1\ - >[6Ҙ%/Q22T>ӑJݥD J,TfB4Tt1tkd lE.H5Xh _iTBa nTK("6HEG\DF5L_"]T݊9K8WBpPa!ZdlWGzv<1(v{%>XT:/ -M]o%Ѿh6V !+oD2$ ٌI8gB > 7!lxٵt1zOy{FLtB1kfYbB{vefqN૰es;Bv-CҼ%T!*p s#,bgJ|.P3YQī{bHBvk>k9Id^)LǸ J=Wp8BRhaeQLp+y:[l} Y{z-I?7s3ߡP gMw6Ba[iH6,LAdz|΀?E8 )EMn 1v}ç)J-N9CEX EbI"D!N1!1t.:IETE[uB#',]YԇF -ؗx eCO! O'uFBte߃]PO„?1S.Ei(19:]:XzJl*]r`W/gRxEkvET"WHR(rhj蓄'S!BTKКRBΒ)GǸ{cͬԵ_p2mc݆Cc&^ ECQ 티g4_ oxBXiys󃿣NM/$J|%-  TDggWC}/ep* 3ShDVh^oxO"~> zp!\X_^Wd  +n'ZZ$]cXBӅ5 D5βb^2E-M%z#~Q(P͸sVuE m!bͧX(~y޵d1SphB|Z&V? D(orFxa e%Ts {TN!8uydz! ~v)Ȍ1tŢOvn}uu!z0nDŽq(n}}`eqNyV[ FV܂q}YlU7;ѯ7{nr=Cܻr?8n(n7HyPa\4A쀙^ nYXV[BqSq$V m.7Bf+.`ӯvo⦋B nQw ny&[ӬAq'*]-&>(nI+M7h7SܨƟ!nu?;mmqWC~+g[J m5xn!2lg-ޖpbV3225 Vꁅ[n[Ap+IApY c!P঵06X;{%C6!C[fǗ/_nM&h+0B n_须 7`y-g]n,Dp+=p+&[R[ pUnCFf[xhv/pkD*[nap؜,Z lp;hFW7@=v$M 7; 7\ɣc UuX- Է?@nJr*Ah^Inap}6N 6ܨ:q%i`s ӚQn-t(7f(p_,mbEmb=+ͧ$-,7mbmrcN[rylDѷ\{%aP0&G6[HIn?m$>yv6Hn,k-yErí tXr+ϩx=ą:q; -w^^9nzŸmxŸ\d&O;mĸ'i¸n{bG֊qqa׵Rxr(--wGٽVU9qdmw$6Qr3IC0nj`R -r{0_ rS+^hM!Mfo`TQVK[8nMxs-u/V&SO /X$v+ɭzr[@Fh mh*+tvǭw}pyeŸij'uq9Yh֚3gb0rpˊq{*=_=0n80nF+m>uh#ŭm#C(nO_f}szqm -qkd!p4dC9n:n-3쌷՘ษȵqմ#V-)nqs&7"g6t]Ann|@n9  7;aeߟVaV Sťf& -ɵf۶&۩qn+퇂X1nAs?0ndr-7[4qq{[+G7o!(nͺ(n>(npQo[)nzfAhx7{ Z)nV·6Q~Jq|EqԱ.m˽l> nda^f>n -nĭwmMp# aMW|6Aܢ1sŭ* m0sRlgX)nEM6Bq?;]WO|PܞVf6ar -7ÕF'k d rVVF ^C@nE6줚rr%]oL$7?sܸ.g-ý^y!ÿfG/ -6܎ rh= r;9B[4oX@n$K{yi>pܢqܘxfKV[v!$7کH[Pno+ʭr6 ʭ_(gPvE٧zaF&ۉ?\FNVNZPnj'OI(7O -({(7w -mBj!6~E=iZ]Qn(77?CQnuz&ֽ>PnJܢUbr{_FwV:md>'mfwhm(+˭Tv6Xk0f[ {e4 -e%|07͐nCani)qvbs#FI ̭o=nh=o a¹ܨ2܈6?-,7,L,uFiYn( -sS=WR07ILpyhfifOh0&cm1r0 -OB r7S=^XnX^Y,7HZYn>9oe+˭`UYnOedEmЌr^'VxAAKJ{Cf[-m=}JsW|h:shͭ0vQotѽ( s{gjއ6ܞ9{+^anm{3^3gan*-6^ب3-)(07J I`nM07[fN 榑c̍hU 6*d༉V+-(U&d6܄Ia?xV{tѪc٫ mS@&si[hn o`ntsSa 0#ZC{[&Շ5ܶĽxHwN,7%ٽ eY{fH:AJ{h{Yntw3ˍ\T7^rO,7Vu;f`^,7CN\y0`WS7L,7҆ny{܀X'rUA>id2( W7ʍwK-# {yo+ɍ\ft H{[ɝ#H(Hr#7u"Crz\?&5?M {H vAnכl: -un+00+e IqAnCWҋv)/g8v5&[QquK F]/ƍHjgh?4˝1n$gF0M-M⸑8=cܘ^p:aĸ&?.met4yh/6l7н'-5FVױ &TΖ5r.k0B{qZ2rꯥ9n:#MV|z 7r< q77V=q.Ƹ_|00Q1nO~o>pXna9{AP,%\YOhǍA[NcQܘ/F@qk3܋⦞! )nLU_hn7fQGF pcRi 7|rO7pڽ&aMv(6 n8& -#nJ)Ix$ּuF7{Z-B3Ne }ѕb̵W#= 7aTsqSUM KcZ nzZ,koc -{O7*s!n};<@xRxB[ ?dvčΎDfqQHO78wjbm)% qG&]k l7G~7 -ڛ=Mvo]MS(n=u6QԸPCQܴF7.&#&(ʉtRۋWڋ{F=-=tC^1nr1|:aOMV4UQ*_[@7|SHh/Iɮ{Ƹ>ƍ70nƄ`Gq^0nW21ng0nEܖ0n` -Qq#pߘJ[@:pTܟw7VU7ʒHp; S1!DD ~cFbwgE?Ƹ:t;7n,Cܚb3}O7NG> oao#|\<(?IFK# #-h鼙mI;oK%g|fG0ۊTR9ۨԦK{·;9D%y/o|Z="G|YgޑV{em]_w·sbFo09yd;6j ހozRp#u6-b -m4Z߆N{#M*{pSEnx6t`J3p̵$g۰ 7 -V[(802ôn7(pơJG /F!n]nꣽnrŁFy4wdo޻oBqzm[]|8mg̡cF~WqBmXy9KڀoX#nj8,l}(q=_6qn8[T?6zc ͮMmg3F%r`:-u aC._6CmEߖ!nLvCߖW5ocGf&~t/ON7u>t"R}~p36\%āf.7:_y&A cmybDM#V|.n;S: n&vhTym7RLK 7z4I)/n4hY^pSHgp 7:DVuv q}|#čtCx n*~6@گBq>fk/4B6Sa2]0n  :c6cGsĸ^m~!0n& qSw6qãS7.bq!@v-76m`3ōHpY)nv3:ƍodۈqg C+}l1n :WaƸ3#ƍA7U:x#oĸiɏ!7YqeqZ^_qh'U/[[0?Ƭ')njIOLL~ }bmoہq=Z_71#Vӌɡj3A62ܪ@Bn(]nTyNb n9JpK3R DQ鐶C-_ -09Fj&ğndoae3 Dsߖhq.{Ʒ߅o+kmƷEA qfYm4Dl]mUIo~mѥ߆3/6#mƷ5nb2ogFz{mOP*,i^m W ww^mn^qUf|C^hYmEmķ;+^Mo+[| -mķѳ 87vweȭk#o6O26{:!61~8x=Gfv`mO6FZ;md+zvmdYp%ncNȧVvLW&v6Ȼ.;mdq^^mufx#[.杮+:m/6O -md] mjH#-o}:uAo  \f -o gۀ>NemĐ~@Iơ41l#G7_m o3+^ߖihoƷia]3mϚ -mķֽ~b+Mh"mf~-lqUf~2mKrA9|Vn%46#F|S?m gKܕk#b@,r65]mT-*-c]mEl&Oi3mަ~izA'o !H6@[m9ߖoSڌo+nڄoڈoKY-f|Qi7G N^ Ў⼍:ՊojwߖFN9 6nm# 7]O.#cF.em~qmƷU>6[a\jQ FBo0 qٶLocu?Ao)i z߼ަ -3b] 4^m-$mٳx8la䬴f[Ull+z[1%z͎D_^.k M}!)Vfz(RgH#[s6ՃF~x1\/|#vFYS6;VhVڈoj+v=po m]xJo8ozϲ}E^m)+hj@i%pF-6;f] -65836X +-v -x[d`kw|aCn}xpfn#ufG-PAh#\mѩk#~@X/6׼Nl6*۴86:`Z`\mnK[纍6ﱑ4ێK] 6"yE[umLHF؂n=+|%ݖ7+L6HW8rur&5;mٻzE͜6ZmfwQV j;n;Jns#v=&V+ +}ۺὒ~VC+XXmQD6cۊP5 i6c~ -[m6a+¨7uHm#LmK Bg\mvR+ŗf[0Vjm4\mW.{mL_ڦqw_jK5f!w+ͬΐFn=8rr0 -i^m%Ũrǰm{,x -8 rɝ6r8jw^m00gn[x6{V?m9vfwe nE+f/Rsߑf/Q>ٌmw!v;۶{KJhb$h=cm.:mWn69&w]m)n q6m۟Ċm#VoJ.ضOm(3^fl[;,6XmY6blYmmN6q(/6^x{fj~1gj[ﰻ?m?4Jm's+ ~Bے2١ 6[7Uf[R6 <,xAQ0,PVd]%^mlq#ƐӳWh762ώIfteA{ vpͻ6v+Po3 N{/жghF& -=XmySm;7`ƞxgmʧ,VWhc@b\Fh\tmE+Cm/`l͏+-R۞~P۰d۶6|(Iqp?mbmWz\Vj4T)mY\v7Cv,жt}жC35V)¿PG'6ٱP3P۰~F.vTfm -m <#fH m+*Hm T жe -m -m;} myDlNl}l{E1rElh#H7#8E,ۀl cڈl+_} ~N ^PfdmNTBm{44ls+XmD6[bPvUeF`[LKmG?mf i(6,זSBk#:.n3kKϼf) &۶?׆#;mĵ툉V¾^qmFcN6?Q6ڞ0Sڀkc3vTڌkb?pm";g\]ͧ\[ϗ6[:g5b'y.6[xa\[OG6 ꃼW\w)7>Zs$M6o>ym Jo)wkc',^6 k3dQ>ymc^Q_xmi-m൑g QMP&`aRhI96_[+͖v,so`?ͮëm -@6<ۨUAޝm6gd/EWa&qEսx7h8f>(DDAQ8>K0FdAe =#.GUmufb^m-Wb[MWbZ_sFbVO.Ķg^mD c6lK{ȶ.5Vzk۽"!zEML d=) *K3B1 6cھgd2U.imgpȶ{EUgd&?3-6!0޽?"4$#S}lZhLlS|B ElKѴťS^Ķ@|mu\b<۪kM:^6&t~r60{'b@iX˄lc|&fcȶk/fS3Mg|kb_枘mL9Lwq vn;Ba?>mcTh/hã=80 zm;;mLs6,m){JY|`e]ק?0dnA Ёٶ$*k?dޏ3tMQq6\ Cқن]Z@B1Wm{ֶ{31 -7 imI}lٶwۏa{h~6]Gd[Fþ7gDivz!*W9=}DUj>x6ޝ('N69om*/ m#MGVڻed6v F'#L62ԭ Dm{Y3Mf '9yiM63=FjL=BQ۲RG>Fjia6}mb$6`=|m0|QmcDPc66vDf6{s羅p0쉼7 1#㶨 n!o=mmFt.κ첟`{h?t=J֦~6^feneo oc۱m3ZeGx=)|vj wCx)WU\/^6JƕH{l?vIݠ 61zSĘ aݞ=۸&Q>C{mBIh?vne^~L#uݶh`doGHI64T3>WM1yO6 Bc^6m GU 65w'v[N6)Ǟ'vPvBm='?m۾OmT;{hΛm%M+ Ogt 'm@ѷSݲmtHڀnuώsh/tA$ &b@QmK=d]V2ۘ>:=|BQPysb;kHmѧ;3X;gtOsȄnkPƼJ|6:1t6nAJ'v ݺBQ~soP6[mql@13 gͯ:kBz( {|:Ο=T9./M4 6h_nۯso n/Wh/t[}*Jd?6ћ~64_]c#mgm>$FtNgGts!9L6 F{=hdC{x'e/Ї7(םGxN6_V~{F;m&gr[m4Nڀnއi#7s6Rm8~Q;w6hm \Zo%Cմ ܆E2dU'p:'<|FgpFpn'@yNg{)ܼWm)iy{aH}Gh?pg7m2ҋ1 n㈜; n>O6N| m'q$iT -'ܖv_=XUjmm܌~"UdZGrm"ge1$Ln#x=)gqԃ@p-~^p-?{9]E n;wnct1gq0>m,⶝xPp-<ۦ\me?cp<~7| {a۲ó!>?IFᖼmzhĶ1J|FՇ8flsˈm#)(XAL?¶1!mN9:yĶSGn[y6r|n/r9mt-Kb6m8:m.-geŷ?m$L6bmⰸ߆s6۞-F}Xv=ocWX6ܮKAoV-:/7qAHpj?n QJpk4&?+f6"?nJ*ߛnǹBn\In?-/[+W[۵6B,IAY n\8ǜ-7l?S)X!n^!n&"8=8Mx n(+Mv{h#qEܶ@r:a(zYl+Ͷ]nK md٣R!u@qs)nh3SF Ph5])nHqq}/0C] nt^n7Ɓ@upcp+q- 7J[M һ?nnXe^n7-7jWǻnM7R7@M7[W–6",6#ܰb9B7#.oc[ڞb_f3}3;jh/=C0,Mᴍ I [n 7[-3sp;zuiBQ6"dPvZؾv1[>6"Ff[n?Ɖ YYnÌ|a%{R[|V|@qla<p#ؕf[YbV;^vFQ,ǭn p;]nVXdSC)npz%h,7>xRjL0JqvG)n r]r'7HoO=S2m-^f4Z-m9 m^E3ŭxAqs%6Rܚghŭj{uFoi,'}RJB(n'E!|Z(n@3Sz -]jrLq#^<)n*7 7.x/&m¸{PRfj4K1n! 7px6`܈Dra-Vϡ0n #ƒ-ʀq# Lq@Bq@lMi&[&ВwYdž4RXPv.yY49b1AI{A,0k%|I(nvUH7>R:$^)n-^/il# Km6RmΦW+P5 ͂.$7!yAmWt;g9g>f/M 7tS. 7Swf+v 7^=WvtRrc=3i`3ȍE4\# W0?@nzE}_@n7wYAnʜx!|NyHn>Q$݇Kh1x_AniXAnqƘr P rž@M$f ~ņF+0c3ȭzih/=W['{S(#-{ QLrk$ |&ۏ6b iDN͹6Rv{qK#Z8[ynn(1p#+¤M<7}^}qZnY6݀$_=Jp@CFû&ϭvdۈs sGV%em-sxNzqn:87RZjڊs;&Qo# {Ӭ8jffnJ5熋j$4Ҭ87M-d߂ssǛqnlR5Po΍gof[{Sڌsc fsX7ܘ5Mt =etc7ZVrnl#Э[z^f1i3mo;63 -t F[<SJns[n{QBtu+6|vmuAt;Ato#Zn1P m哖=bt.t*Uh#Ͷw\yn>:࠱X -@q% t [D;g!]ngq. #%L掏oۦλ+VwD7ry6a!׶ĿLtsm{!ܒcvv1[xGb@JtL:mk.n_ э]N i3] ݼp6"j~~ d$ٲf_Btۣ Uw&6#$+mSmܶIh[?nr93ݎg`ue5wp63Ӎ\6232~GVo3v0~9+-q'wfY{p md^aYp#m߻t+ m Ͷ'W[х6@*v^Zn^-P7~]f[qF[m&qXnCs[aF-nOtHu}O LT`{h#-@k XWUHf.+Ս/Bu;?H&_n>Uvx[nޟ P~Nnn?g -6Bu%&7bupH Y:mĺbbupڈuB3ukO/uK^6c6[ 6bJ+N0KuSBEV\^\7F%jGXCnۏ`0=nGnxZu>ڈu; N1.R eڵf1-&m㖎FJ[\Hu"mO9CdWâ+gbݒ҆6bݨnWG X F'\7[Oo^nt@l7-}Bn-fovj6^xJfAson+؍MV[nG^`S3v -lBv#v+Lsqh#팿}ݎ[6pݞ=sݘ %L_<[Ur36RM;Lucx@PMW[s+ԭ@XnvZht=3a ֵ7ӍQH7Cnn}f@ I HMH7[_9#hj YntfCyF0gǶnڈtcoBvDt{c@t&\m+)k"QQ9  :kBYxvte0vF?tV H7 W[s;O{]n6.71\ LBٲnf᰸>0vf8In+5}amU-~tꓯn9]ML7,J2#~N - ͮALt#@t{.8g\$DtU#f^n -m 1JbWnxtnE}{nBn%ơ!fk^#;ݶֶOsౣaiO[.ۙa#ˍV]{ܰ/OffQUӽ޶#Mv ,7l;``&wڭ=sbqĂrh{Fa?dc)-rc~n2Yntڃ,YnԪ8BykO P㶳@rÂ29rc۬GŰ#|oۮͮ;[$71Վk?ōB{Xn2j@ce‡pYnYׂ)0(4bx}bq?beUq[?M,7s57'=x]Vap*4ܒO 榸<4܈v69`nttKh/[뾐 tۋF EmXͺ}ca`kMh 07 c˚aF sYٟƼ s0fW;syz~1c3sֶ-̍6@0y&bs)̽F' է7_^07:uql{F[&R+47{g=ܮinT,'y&#0܈elzmF47Y](hn'͍aGI4X+_eȓ87sO87jFI-΍MCs@@~87) s*5 .gքqDs` |G$hnduƟƛFb)b5 N}A;QV57^AsCߧ*sɏI:- ,Xn()w gr8ZwHfrPomBܸQ$qSAr9 v6 CIaiyqJ S_֝)7T)"vguG88QYg:_Yg 3-kZn=֡]Q0etp[9`nX~2`n[]"{ J|:#-(0sD8\mƏ\NsÃ>iڕ1jn`BɶƁ"(bYpn/Ƈ"ܐ=~:'oKNu6SU0ÞsКfsc?#: GA?]47 'FG *57,N{@ɣvueЏnnbVoQ(,| ĴƱ^2XnUY6},7=X;\rC,17fa{LFrVrÜny8?r;~QQp,(bnnۭ(Rpܮ_l^[gY6(5s{ܴXA7TBOaӎYNtC | Kj EA76^l>:zn/*ցnh~?I#i"a=hgr2A7UP -_^D"⊳tðNq:"oܰ%#icWV,aǹ0˃F Qȹ<9ÎsG ȹs#v5HaǹS*  VO}?ynJۓ4Ja="="} ->OMjϪ )ȳ8'?(@7LWy tûv2V>(D7܈"(D#ϫII7 &HQ*0*HڽQOa8FpZZI,  -; ח3 -r>mL2.?CA7(nf[ʣS-tn-# ̠MoD|כ$nEFЭ@7oC:=蹕`.Gmc%ϣV:f97zM?ܺ괙sênD+f-UȹI6<9*wP{y韣憩qՖ5:Xa+}j$̹ѳeq]uݻȹ̑s'Ͳh1{c,hYfS"<cns~3lo.5Ͳ1M+hn%!jn8AsrܬY(57ffO57.K57h+(EhQϹ1R`fuș%sl+rn̸r97#f52!1KBkcbfٝ"97lZ87˰u*k'zͲrs̏O"L+ ݘޱ{D7fT;7E7aD7VUm(YATʚƬiEͲٓn̰E7FwbD7˼:n.;Ƭ<6',BӂGtZS_}EҍYM7fiͲM@o0q7}6xNu4DԍY?P7fsmɳ1}D@,TQ7fhn+u@ݘ~Q7fܙ>5ԍ6{lx@\/1Ү_>͍WE̍Yscf쪧scC<`n8TV17FE ѩH} -H1" S](7F>(JnJ$7f)g= {͢-dk,LYu,نsܘnUǍYhYu,a1E1G rcv|ZW 7fe9b!BqCL)qCQz g1l r1qCd& .Cqx lw+*nO E  -'cf!K,e#nae qCݗxkۇ`B25 yGIYCܐa7d>'D YyR0O J }<#y@ܐj!< nlZ $ &6/pj݈}2dDܐuး!{V@ܐu@hZYa"`Fܐ'c#nہ!Km5#qC}$W> -\qYS>V-ڴ<(n'D7YPܐ(OYUИѴЀ}-ihT>VjV2ȸ!4e#G-00nNV9n77V(2nG M5q8qCo/FI7d{UㆎmqCD*izoȠ!:APܐm<47XNqcѢaBN-ᆤ_gz y5 Ix-nʒbC@]nu0@g.S}dXK7`kܱdyqT'7AqAq(rlPܒn}: m 0:7IcuSuA_ec:5oPa{ōoEC+np: ܴV7dQqc[9&Nqm:mz2܊6=lOPܐub@Pܠ}F䨸1c{ f0(n'AqCٽ67ܐ\{e 7dsM 7d0pC?߯3H!Hes߭n -,mxo!CI2 7dŽᆬ^(s4H6>$OepCv`ܓpC.' ن ıqK4ʸQ,O7D8Qͷ.E;ngϧf!*āt9:n.[⍇{nU g6w`Etz &aQ%2!Q>3 -[|fV(ً1np\է2geyd&*Lѡ2nȎf/ƍlF3_Yeܐ񠸑-׀N{ "mYIQuܐ7df8q S7ʹwWPϸ!"%q`ZϬ!z-YA)n0S!>5YǸ%N#䭬2nvV`NU VrUU=7˷uҞʪsԹ7df/ʪz>>FY0{:-Bq]{ O^Fւn|| -KPt@P܀?uL@`ct܀%;Ԧ 7rʪFQ[dv 78 NXzBm>n !jsn&1#mŝe*VnPѮn Q#g@1GmgpKkPo AO%SPP68ޞ% D%]{-4[,r/4m (nx W:-PFnxGVT^pbqܭntaf p#~}dU~7Buiqjo^p%,>n~75(^bוCYpWesp{J~Ap -C]7.r:!n\mOp -CyJ7>COfp3[{'ƭ~';N(#8~ ć3 C u]Hmkpc'k O$6NHaOѦfpÄfH JZ- 7cH@m^ pe2HY%PkH7T9V -5#ᆞc<nmpzi$\ 8dp:c$n6bNp@a&CY#UW^ЋnPϖ"Eۧ<n\uߠ'PὑpC Up)z[-p$ܒD_V 7,pfa ܰ@~+(7ڬ;TY#߾yFa1!1nh]{l4(苖[&tԗnMpj<۞֐5%U n]{Qe>*96CRYېLGo| KAgFy0߆#]ܵ0{Ԍp;U}9nЕQ nw@^êFwB 7 -˯u - 7dݶr 7 -6y"(,p\}7H,p|Fb;'͈:֡G(,xFa|1YX.ԯ!nAlBX.WߤMr#\.X 7dM_H,An>~Fm&kXFż -pFن?FCnjyeT^r;fgd͞%7φrܐiM%7˧akjQ(XLy/ͧ5戹!wOeqw"};os;X_X>r: QyYg<)7D& :1$@n7o0rj{.c^t' H6sz rpb -!{` Cns$kT *`O r8xm[?"z rtŇ}]/av^EmB(839h%7Ƽ+ %YOB_/ᅸlT&AmٯCn< <@n]kȢ7uʌۅƊF-UH 7{7Q Om^zs!n +no78]s*kLn)kf,ENpx8^D tmdtܰO -}vܰOdzdza͡NfN9Pnȍ7LW-78n7Zt7ej&Ƀv &qÁq<5&SJ (r >{mz7Ycp9h]ϸa 7i=ʍ2:(nؿۡYo̓;q[8,9I#͆qضrbX7lNJ(([6 "n.@WYĆܸ=:g#nŜ7zNr5čf!O1 7tЀVp45tnp{ycj3<0k.T 7xniss4h~apuxԂ' !j}C7樸:o!ǬS \V70W+xpܐ:qx[Qu($zMF;)nH>?UQqʻ Ylr@ᅃeN/v2L;r}G@'BOEqC`|n=;- {V =܏j!Ck{ ΠlP*om󯫈>6\uv- 9"n0[`qAQV7M}VV78!3̞-ߏϬm7 LSYN-GPGh=↽[= nPkp48L`a+  +5ÍMf%epC -}e.epn+Ŝbsvup{CR@6c+搕o78|YGv47 n5V 78ezmfTa]t!n^KNN[3ܠĿy0ܸ?6 zídky0P4;e 7D 7lupPvʚعpj%3 n˫@`%~6#Ta3P_v*3ntuPBWoW)$6 Yk #*' 3ج8PY3kpfa-Qп#nfo)l(8i^ nDUaCPWw>]3&a#n^x2 n5u4( { cX.‸8~g~ԽpacNyjaϸv -vݗU! Ԝ↭+Y{7#a&Oc#nl)Ss↙o/{/7&~+l7ڋf#nnw J8F_ 74܈}'P 7@Z2n(}ݳfA]y3 nƪ qCf=[zbا֚0n56_3.ݧp F^GޚᆡNC1 7TS(nؤyDh8y =V(n7fF0 7qU7Ts7n0=oEqE|KU 7`鋊5 3} p  ᆡ63 73cp6a6 ?4w=n7ii[#0TwAaVC;n(BO۞O^4m |=d?66žoc !m(=''ia3b/͞opGсo{61mt8mN,ק'9m,>:{?n٤7dV;A.n |_abe{pp. Ae n0"qU7(Qh4`Dn{ tvn]{ H$uuWMsD1/vxֹ̂·D Hd7( -nqyQpc6C#rZ}n0"SY۞pCxJn@"Ka%zH չ#ܐ*v~|ᆰ\  Dvf#vT|ʭG@D vq#vq - k+Gp!6eioC:moM|mQQ1)I6` }6ủ'vfgN& fԃoGBmoXm a2 'O{7 -{{7} 幷F߆G˰H7`A (ׄ xv'5mhݿ x܇W x[ͱho6Mޖ0 Gv -ޖ8UxOEg -߆&ۧ |iaz[6b߆ \(l~6+Ϧl(l~&~v41$y7/dzoC?(l~ہ1w:K6Facmqn6BYܰYCuDa81?퍌7wӺ FM+pC35 \qqd}anةwe pCCmiJw7(O ZUq&a=gg(7V̙aaN4v1sr)\|~7- _7e!n/*vOčB$IVn>+čyi4o4n=7g% -q&gE.^[GEfqK6hi}vldVLq+oEۆ6hS٤]RfƭR^2n_4d͎ۣVKsvwV}W79nV69nZ9n׎[yqmt%+Ǎry% .S49nv ۏ&"u1rмܜYIn$)w)#o䆞C]>dyrr9ģl܎˨/yrà rd%=fsrÆsm#[+Ͷr~zTf#IނrSaؒrsdAw^RnjirSsCq syaտsS6ٌտsSfdVzsSr;Al}W6Zn-%Vn>+-sI3vbs}gY+ eqMgV[R -sQd fA\^jn>gŹ]Yqn3scs6eV.d MV|ۂs{Q#s)97K%FuHȹ=Y.ߓZpngu ͇/87 Я0sn^Uܼ~vjJsӣ|^rnܜ2Xiney{47Bsڕq0P2jnI ͭ\vFNQ^in&lnM|_YnVqۓlr;\6[n),7[ - s+.3ƇƤlG` s{-|>inƊ@evXVl^v -07|T?EV=O_3is+6kZ`n5WnBs{VumL -K͇x/4ejIBs+*3f5y_sӟ$0QzM[%M۵m6xܾ:quhy[r8?/-7jKrO,ޣ1[[r2l>y\hnW >knu㤹?;s{>=.0r^v:a_`n-&"0 M s Nd`)EM# J4^=MU>)077n qW-bncsfпvt0Qr+\Vܮo̔['ʭ s;vN]Q܎:#dʽQsf c>& F j4"Jx @c -3  Qsy>4rnWE7l.AV:n,{ tvZmUA!y3}(zn\ye[ym]8;|>wvln3REUW= o&BsRУmsS=蹽GgN6l%m&,ϜJS97jwŶfGYܰ =87t6-rnesV#禙S:@ʴl+e`ʢ Qs˟45NkLyn%5~mVOێ`sSA^ynJ%k:sjLۍy=E-+ύʭuCIr}-ћ7InٔlvOW6HnU"%7Lk1InۭfYr+7״Yr/$ XYS\[EFΒNl$fͶFI%7/V7Bf kphyKR^`nc;Zy*087=綽>xsA^qnCrDslz)YsKv)45 -U-phRVV͢hf G6}"V̹s+򷽔E cɶȹb~s -jep8+8KK3sD;_`nך,07W07ǿQsUDѬ87b6rnfM>>{n却<7;lPA[ٖgl/9/<7|$m8eC}sfQܶr熍p>znLvus7 ๝1ٳ0s(vm*9qn8?4qn;ONێҾCYpr;qn?jnO/OѠlxF6kn6ˢ(skH숹|]㌹% m aG:qgͭVΚդlwEfmYsӤ,f@s떅3tsSs:"rx [l蹽uTsii9{ne]nE~L+m/ HLۥܬ^YNzhFM[Yn DvNfm󑅳Vp*M\n{H&y.8/vKE"F|_nvɹE/D7N'u-nʲmV["'эeCY$tc[ofʢf$!]V?=rEՠf^Eϭ3)WǍX έ\9.f mԉ[ nϱں~ܰgs6y.@7L@T tӴ߼ywE{+r7nG(nmtKFfQtC#&mkoQt#_E\\n\{ [yF It$ǵ(]v,l6ɺNOؕE}iS6nM#I7T)c&Лft1Z<,@s+ 3nssþ}gsnm|sæ}J&lƏЩ,pnmtZ̹`?Ĺޑ;qn#/8 <:qnyp*8̘Ύ+F slXּΧx̖ ܎10u3V7cI_#!esZ`္rK>ta6JsL 9Ҹ scᄹV{0磲€[S1&֞[bx%"ֶϡV1z^kۦhk&J`٠(r;lee%rH္gs;*"܎ۧϖ>[nZ+,7gh]_g̍GfN6z{uJaVs۹sSss9o9cneU8`n˲ ͦUmXzͭ\TNI3xs601kŒU07U1 -#_#vw׌pnX),Wrz57YUt|(kLx<4}Ys^NW[}:]@n5;n- 7-iFȭ\}M3CnY8anS vgs-h9|r+=`8QnǫVUR)(7{{)7},(7F΍Zqnw\z͜*Fέpٔpug7rnem$&mz+~<#f!&̍[ s'dc冺zNRe8Ynb^e} -ǵpl/ha(sV~A -feze'ˍ kͧ(,ntܺrrZ`]4?(??_/o -~;L}8ƒ <6 p?<{zpC5Я+XP\;Uؔ}P -ivSQ)7$R>"(I)]VB}d (ms?ǯ ͖F -_Aus(.ϳ,~X?!wh؞r3So~$~'@oF<܏į6𴶸eGW޳}>(O͚?-* =? ? +?|'ug|ouDJhhQ?j:BxPKzM/}HmŢ!xSlzC+핡C+R+Zu.RW"Dzq%7HWe|O(>Yfxyskvi%G65 ͰNZJ/wHiKQ}.JZc_juU *}KGT{߲jGW};U޷Z|BnKQ-}S5t?LoIo{^m> ~jg?վgS8[饏߳ {b-GTOl>,~XXş^j߳)W-GTO O/}DYN/}DN/}D5UU饏 zKQ{AITZB>npd>vX9UվWOvz#}o70N(=cX饏=C]饏=}8KQn}Ofd>Qv&0GTnp:KQ{n sZGx3KQ{?:KQ{?F>>DO1:TվgCkqz#}#GT[饏=BOfd>쿇OO16ߏwK)05jnGTn˱:KQ{tOfצ>vy^j |l8վVqz#}o70y߳8OÒ_jߴ.x7>R=߂:0(=MHD|)v#}W>, x#} +>(cž_P?F)vgjuLe!\Ϭ꾡%{ÿXWfCEobKXZ.?eO?¸ZJ5S0o\:. w׽.?ҿ#JK=.?_J]frB9ܶt-c?&6Jk2*ͽaK(4O B~tOCqW8rH.B|9POWxnBbf?xǯOo*|;=|enQ1~w=֗Q/U/OԵKCoX|s>͢B])dfke(߹o|'L ߴgMߙab*5<|gM6ڿ~C UH]z +EL*x!&br +r1ގ7 ~(,u MNFyGu]EyGu ]CyGu]NByGu]@yKeɤ':G瞼2dROROxXǚܵ|wuMN6yGu]4yGu]N3yGu|]1yKepɤ'':Gg2dRSK?wOs6)GG:#G6gǤT)(ND+(o)~~v(;JSPJ}t[J_:Rc]ό@yGu]?yGu]=yGu]9Egّ&Sf] +ZǨu:*Y?6cg:]GǬ:WG:QGG:KGTgq*(O+A*o)~Y~v[JݳwXܵؔwZܕ7Z't訔7TZgT萔w/ʏGyGKQ*Cё(oUҝ0{)xWo.x^jL']~4Y1M;joV'jLٛӴf~4`E1M;RoV'jL[t#-ԘkLgm~4мI1M;.oV'jLʛӴ#f~4pE1M;oV'jL[{;]?NԘκDi9|R?QcvߤԏԘ(5iJDiy{R?PcvެOԘ(5Fכ5iDiډzR?QcvެOԘ(5iJDiyR?RcvfޢԘ7+56%at'jL雕Ӵf~4`Y1M;oQjL㛕Ӵc~4Y1M7ޢ͟1M;toGjLӎۛӴf~4툽Y1M;\oQjLӎ՛Ӵ~4(Y1MW.VtGjLNӴf~4ԾY1M;oV'jLN[Ӵ3f~4tE1M7.ߢ͟1M;o'jL⛕ӴQ&~4mI1Myo.Ӵ1f~4mFgɹtoN9_q8^#<-ڎSy?l;ZI_c7WF\1=;8"Cu8+zdwCF J|;wzKf%#å +_~ZtßZtoZtAJάÏs>|ٔHE_yz%_E::|s_*WVIo.8K+?sR?tR|#+Oaג o +u<׿Es)pSOZyp}82 k6|xa^>yWjЮߦI,'MoS$W +)G+}WKÓ"$ߦdJnAVoS$x<8EhּHx (ߥҝxcmK+sx|x.=bx,ϡG}]zTj.;sųt2+F\t>D)prxW_G L}YvTx&}/=DεD)c O}K񿚟d%[}>bQ:<[?8q<1O*wWɷɼ>\,I[+IV+n{K PbzXiC_PEv\>\>ɰb}xW<~#_0TT°do-OZŭM,9](ySU~x ǓU,.+4/<|fyaϺb-ZuQJ9ʃbt\ƶaa`d8 +L:J?~\ T|ų˓yg9Ie=pÒKO2.>%ki=bup}*óM J+lJNG 0:>ŜLǯ +0,p=j-]`7l\L]kT#3mIA+ea=y|MV2a*ԅ`+ Őa7ͤ4ddki|f-"1Gid7!a8yaQL}$|~dC{%R"5ZO &J.%+0d{[m\~q^SU`qIyW̝Br bJQ<`c%#lo&v\iUlH]]-<^2]E/rG'G҂,2t0!D<}&ʯ fFf%x`MqA,cm0U2RJ &>X}f!t.,.t<`ǒW]`K$2']bJ)F4Sh]0<-x;Ree SR=4r)a7;Aޔ|'~ZlAʂ%ƓpB5YzJq]-<,-kSTd|oxAXIe̩MLqA6\\0GxL@8QKDp_C6Y#˰FYE~.aAQLȕBf'&4En%v1QCSך7Y+ j&ú£0 \}\\&ãpLܠw?> 'O+ N4E0N8x?&ӹwU|1,KCӒ\=n+ͼ& 7(Um]$QNPŠN]\NQKg|$66}d!%3ɰ-2X hpt!yb8gbKmdpgo1yVE[bkAGP[<Ζ.8g ]EO2x8Yd'؊onP*>3~A+:d qoӃ )!Z77O xp}R]!#%=O2,Շǻ's.$K.B$xn w\ZnB1gp|a-:rm!Ķ=Tpf \Mz`>ƍTGV߲p@yW( +Oe50#r'_&`1| 0&. hm쮃Wa#8 ΄'hMC: Te0ēQptmp>_J}ӵ-@Nvm;WRGd) +O/etA`.!Wη5w9;]8R[\F?nRTysc#e ,울Ǔ ƄgJ~`Bpd;7RVcj۹10|t&ِ2FeΆ/8dv6  ]ِ2,,ڱ-!Gm׹Άa%hgCZEx$AoD? h k1T`8@hHR}#qTǐ!Xs3ӳۉ)ÃV ]w1I=/v3%e[#81Δ5WqFt.$H7Mԃ2)l`A0ؒjϯu7IGwUJ!NX;@bGR +2Uuiud2si1 9GO~lY2\6T*7{͝ɰu]*WMēv&\KW308Tt9st[(Nv4l AWF*ꂇF] F;(نijbG 9? +}c,8&ۆgX+pTo +Y02~e< <*1Gqa1yN)ݝfƎ}DnIh@]W dM @P`netp48P\ 7O1d39yy`2\̰ɸQO121MAQ+I;M,.;U<'|I:^e{2R]1 =kUk%]Dk%4\FTXh-B&ӕS.×J`Oo o܆I$ +k w~x?J)U߷D }>$N#"RC4'eΎ/ Su왳:dA]2h#u[1Y;iv?A7uX#[ES] +cɘLcڵj +c,L;B =C/f*#q?y˵:-]#23{A@R|溧s"a4CV*7L|2Xiii oWlǰp̈oZ `acLgY@3c*G2 %QdXϘ]P1G˴,Fe8'WT:{! snDҟ\`%Ewf_MO9@da2d8VTV-Bpx r&ʰ0~M*2,0l"MSPxm w@23a. Kaa2Dzh0)a` }Od0*2y@ d]a9@ <(Ti $iүI LXWzP?|bJQ2*E/Ѻ*5F;D{ +Κh +fA/wzF;m VY8WIdBh hPa=%S e TO6}f(P'-i+e,æ` ˬ]2P&"$ՅϿ&+,k-IuQi}A8g2aQft cdc-GPX$*I]/0ŁϢWU 2SU dz/$FEVSkt2lKɲׂifR`d˥b,`! [qpUP@Yfp\"c /ا@>7ph$i(c!S +}UVt @+9 fNg~ߖW:hV\d,`app2~_,QEʖ)9qVبBG4"| /8ut\cr@K8*,)n):X-bem,-[*jWEd0d)+~k,ם̼K٨Rc|W  +R`%ic280Ħ q4b#c|,D6he̯I%;95 }~b (3"MaJ |<ꁹE_LVˁ sh_>{`!zr2ֻ;_vBRBAt^)*jG=s!LK1SXQM&ZflQ,`ޮ2>3pf˞u%oegc+t ֥TE0%V%%9g\iqACaDx"M!R*'6ɠѡE"-a%Q(*A3oW8Ǡ&P"'^0q Sl }MbE&c$ePuK"LdA >qeEa]<r2Ԕ$r,xO3& EU"r2+vY&e"<{{΅JAI8=f= s[6K"2- zY`$gGBadCхUPC ẕIV%9^U1ZƳ.L7n. ,Ylg ZGYc'[#c& .n2".ޫ&"-sv;3)>,iT}َ>>3G&ur-_<[IҌ1182ݹrf +)c!Cς,Px\E{6,\D؟P$?8CQ9JQbgXCaTrHd% Uvq,Aē#I#sw=*'02)ˠ+U{,swXV<>Nfqjv/8D֞MU(\zrX=qs&d)KZCAU8!JJUִ;=C%R$ ʸK7=ee?"r{d~jԓ 9,`;59[bޥg0Q>;|ʇE!E/26Fdpf&@Hx@҂2V҇ټ19IJz[b։l"2_tSP/)fHtv e촗AD7 SVyc"@IdqRA`\(bO>+۶ 1;KǚFcÖ+aNꅲȬ؛c- (QMDq*1LԺGO4bz8\O-\]z-*|qVbTh2%\a"zЄ;8C;l5*)Bcȝm6"O7_R-:[5rASv&]U#ڑL!㪹pD5Qf4c?;e+DLHV}˘Yl2ƬY-)¥OVOn;2P$zDQZ=+Zq4gq?UV-Uc@;C-t%`Is?%i;Qbfjm(4ѶGdx\m:d2mݣѧ:sT:dٺX!=h CĠ{I UWdLiDIg~Šax/K/f=KF$тG.NXo quX'#R\(ޠ(2xMLq8f՗73Yd'"1P*FGSZu}dڎ,^9h*Ax+'[fhH^07[ަI4Y0y +S@HvVXL\+lP C@g{qlUzdT#'J`VJL[HPɾl-v4i\V6@j.cRW]Vxg-vI> \:h#eD*@K2Xb$^y+XW)EΨ ?azt@e%8^ĂEg <{9G.mo|W,xB.©>> Vf^4&5s`I`AU ͈LJޔ: >8, +rvgY;msffR`KIΎ~ Q}G4-,5|?SE_`*MVFtxzkڻݍg3+iؓBV-Y4ӭUՆG/3+ =4.&8Ld*o-fҵ"*g,8p[ˡ ^HYcQQgm:Ĭ>uwŘ +<2Ԍ +peԇQlj$H2: +&1J8P͔UhmRSxsbNQ]8Z$[cA3X&@9$)7zbery`iPhʸQ*Do(pm:pv$9R8Ri`MSd3%ʰ?L[U92|UdiRĦV}8d63'URdq8JGo- e 1/3G}%+!1&h! l-LBg`sϖd1z7xMሣqNf~(;E(c)($*No뭆.I .IׅRD|ԅq &c!DXqb2CdAʼ}G$vYZڀCJ.\նCƴ"O&0 78*2C0Rªɳh뚤(IPU#E͈Z&Q!*1ǃ *.>2L5jpd4$HF-HU8itOf_$b24ɴĔ}MC()T}PMg}ed0G"c*E>q}"f"yEԶPʒ%bH3DH!1C$I9upc U`?(I,BU:McG<2QeZ)sP.єq %.4怨L*IOt L*|a2lռ*7NV';ʴIG{JXnYGe z?Rn:46Ġ([큲 uqC~jB{{G3whȑ;;)cQ7^)Y<1u2!'Bz[qv,FrǺ Jq+{l682Nl6{GBkzrMue/#$Y 2zgs"|_ bfIwd0OQo=}E$x2"I(yb/,'R&Tƙ8' +b&!0S2BھexYFQ&bUDUvԆf }f 6!K54Q/5xiU=3@ mA,#mvM!n 6dlCو'M!n e;.ZhlGe+.[h5@V%hwي@V%hwي@r;.[hwي@d;.[h6nG]vK3vav +%)hwJAh +]R6ol]ph Ao; Cvv]B.Av-mCoqh7ۆ@a6 !nva6 = fh@@,ZZ gu\hcm̪";Uhpcӷmд뉀Vt"#M'=Y>}q8x2?ә d6hl? ⶖj#,?ûknvm3Шww:|w`eu>. ?cNg֗w>ṉvc+.?b;b;lǟ v؎?a;b l]~vv .؎? `;삀l]vv%hl]vvhke+mv{]6(`lş +.[g?d;lhle "K.B@d;m0vMn 6fٍ&ق?V & +@b;.[hYl]hv ;Іh mPv]vav!Zglǟ]@v6+gl ن?xd;U.V?Xe;bU.V?6ٍUnOGOclǟ sgw?G'1gl]jOc?s8g~g+L <#BmS^ vC;lßg+l vqk vC;lş]vC qlǟQ[?l1f'Yly'=ϴs|gLЈ2 +@<9(;K{@ϢxfEO3osgȝqϘ&[gҁ>z +fgi#Mz1,KG?x?;VdVK[T@3R,d? j֞g(Vl-3- +֬& [\gB\;MVYzŸ'lş)|Ÿ׷tي?+GY`c6y-3U&[gxN?y3H'Y;w}<n XG,[LK-4*{@!g+MO&[hc*@;'>#MGO4>h2VMF@#Tᝏ4)g+@?в'Z6j'E+}hmt<аMgw6@5Umed m-4yr>&8@V G[hmhm-mMp&M1 @H@ƼȄ*]2+jВ6\O4yT ƊEO4ْx@UlC`ff|B'lF5/hن@ÁFa4lNo` FK!rmg1=e &&U:wg]hEEC8%JkU-4_`F ^ v &!hW4(eaV;6w +=8㍂B(hWw +Z [7BAi3NH[1hw@DAim"-4)EWFAk.V +[utFAln'XShӼ o4 &1hԷm[|vbfsɬ;8h"L4s5?pFXgɤC]; ޼35ZqCsЮ6ZAZ,VA0RAvMk"[9hG)Bsи%4ΘV&l&5AsGZ9hU&9hQ<ƑuN&cNl1lh,&9hUΝ&ACl4Ȉl؈vOw\id+%ra)8h,6ՍaŠ sК;#mUn 4 hEs:m9h}pЪL7AI7FmB26 !;AǧM4ڈFESŠAS6cВLS.يA;.:ÊAyqcpOk~V $ bИ`SA#@Kӛ*+If -V gӲ h5M*[1hk]̕K s6 +#L6SЈ&.v%`(a&0h n f ZMZ1hQ^1h8n:93+p\=0hd, sϟ;VSAcE.49kȸUV y=bЊ^jEl-4nq /nʑ; A4A$mAyRLvA8zVz&Zx2Cp]F6lL %e7 +M9f3Sؠ+uvQ8u+ѝQƽP8F2(hy4IXuEAbKn eCf +ODxiMBAZ Ĺ@8G:ТZs7N@iB]'3MFv@;^zx-_ + &e +N zY&c,虁&aNhQfmh&%38lL@#6R +:"\h~2)3@xys  5@4~5tl@v^xtÃ% 1s}sHw;<Ђ HYhNk9ZhLsnVy,4ƚ~4rme"c!IA¸&hL!T%M4>ED@qW &dhᷫh~sТ,[E9;2[Os1(P{O @ϫu990bͳ[m@cF0sS{Y@cq9.VG/$Xd7Zt ]hLl +h YbIQBM9h/ W hՃMv#UGȈ΅&'Wfj.SD@B_}3 Ιv߯4cph(qB174ׄ@a:"hF@c +wt}`''!`s~4v0:{Fyi9W=){h2wC1jP؄@cJg 4x9Mx[@c؉&^ε@5\!h,x6 hQװBZp͞8Y@cD5 -\ٹ2p +gF,hEM 4l51hsBFNd7{B1j'+L X6!x6`&2,4vZ9{+qV=@x-* +AŌ@?ͼ& + YgBAc";,4qME+q(h2X(heȏ`Ɠwaz`+!~^-4v%ƃn4t& +΅Ž î4o"f8oM&*=mQ϶yŠF0ozElmAҗ2m0h2vtDڍ.kx4Q\E/41;tX޹sаۍ5Mv<.NFv FFLrs+v -44%#@OA27L4N|!:G0hqj+M&Z(hKM2ٍƥ?r3Z3uKo=BAcUrf +6\)h(hLٜ)hl*?n,W +gnIaRЂd/`wqԩ?P8(5vFAb//(h c-KwU"rPЪۓ5Sx Qaw4N)h4E;-0~ <0(h28 3-]NRв$mʂAc0eYhfà1&BsFIDByJBts% QJB;0JBqLXHhLy^Hh<7Ε!\Hh<%ϵd|[갳 &a;FBc 4$GBc, 4S +BQgpFB;dlBŗuFPhI*%Ph*8wZ7x܂Blfd#Hf1i2$<䄓O 4/]l d@vsWɹИ$v8n !iRiJ@he6FBcsfn$4M*Gv#vXe%r&ʶ.$4vT;HhV\Ih" 0DB#Z5ϝ%FB4U? ?M,$4C\; -IQAw 7՘Uv(4 3 +MZÚƟ 'ܻI6pm;WC霴 /$4Hs빐 +8V/,МFJZc]贳 ^ 8AtIh(}~܆BN6zAI M$ {Hh߹&S2 uGqEYQh.+&Vd +G=g1i2f,w FӉBI6~gufɼAmYh,Q5ȹ^v;; M!l,4wXֹФߺYhaU.HFNE$04'n2WҟFs*UFd7,hO븳3 45\ihLwyw}Y7ٍ&T!"hhóοZhhUjCPp|M04w^`hG T.\-^hh<EmI!id % Fͫ&rF\qhTeCváѪzU V_[phڛצnys塱|6:CcbN,yh T}Ʊh3q :Da_F_@4ڮR,]չ]h.d݀hQ ݐ@4cDޕm'>W̩84zaE6XMjF`j84F84V| :h /04w&K LzywڍXЮً; m44lgihY'=в944ZM뉆vhh\'U4nؼkM44v/ޫxc^q %Ap!44v홆&y:Ў G &Q0p C Y3 +CkR[ah!dDf0CSzVZy>*@rM04`j뜴VZMиt3 ~HkBZDUeewsK0BVEˠ,*!f604b~BӇd +Keg|bqiҝ&+3la)Z#PhE@ +B~; +(﷣d'] vqvQhp6y,A{`]$vvEYhٶ vÝ(Qh7"؆BV õn8 v\m( bjG]̩K="jg + mPXh.B`N; 6,eQhiG]vv^PhwiG]l@"[QhZiG]hƁBQhZighGEVahCK ] .C o4\ah=`hsi l -Q1CxL; >/ahdvvZ5(4ܐlA~>.ӎBHN; ͓ lc=.B(O; m x`Yhjgy =vѡvv {! +"G( м6R; +aVƎBK$4%$8F{ +j'EQhjG9kccW4߆BHU; ͹ooe6ũi`hw +C04FۓR7Z\ C|`e3 -kۧڍ}.J|`1SAkއvbm04Hfڜ Haq-; M*<;lf6øYh7Bc"CV4~> +4j,  FXhw؍>$; RH mtvȿ|q\2CCJ&-0#Z1 dr>p4۷|2` m=FCVZlLJ+jaYClCc" -oo sdahxX;a^ -h&f8OB tla 2nv(Qd :|`t 網qUаpp&輳cSXh1 +|bYB zt=Xh}laEYhAঢ়x6yrс4; EF``h#ahG՟`hY0&>Ф\5Xh7BQ;'mf_mrYhJ꼳m BÖt7YhEEYhX^; ͆le1CvK~6BcMi1 ]^;18|_YhUr(mA>yE1lBsѺvZ(u8Bmo: lGQB"[Qhx VFBlzVQh>u:B_x(4v]6fi&'bФKn,dڍMXF`6Hb+ -~YhG-bЎ捅,ze:Yh:›lf5l044^мtV04ӄC&,04܏^8ja t|r)| +C+GcCI~DƩiUn08gvHm,4YhmYubBIF|GQwZȎBJ3m_Qh0cjBccX](̱%(4Ȫ3vZ>ifC<x +-7Zwhqde%#q>⸓j1m$4 ВH'~BBK>#7!LHh:-=l&E=wl%gZ=@; _FBsJ2DB-@h<^{@h;$m%BVLvvIDЂAfsM6=\oXHhV'M(VQQ;kam 4/BL6И#@B d +NB3OM$4w=l"1m]촳vs')ݬ&p3YIh$w-m ]ڂ KZB8B6[c 4 +XAhwzBA z:lqbkC&6M|y}"q3"$BBGAh cXFBJBKt$XNNB,qVQd `&qʏ/tB<</HhgQn C}ahsI4t BBZ |9i/Ț@h5mA1R>DpЦpn_75ТfP&i/"[@h6}l 4_'Vn+Z@h^2C&Bs=y. 4J1k]4vZr&eu:8h$^mvE+?6ǛYsB~BIl 4ҵ9Ad >\b eBq( ,^/sE#i +-+6lB4oZ7{6B;:BBLBc5w,,4R"јI6sg%2UH6\YhlB<ϝJh+ +- #QhtWMtC?bsG,мU؛lB9N'-{Bc_YZA$"8 N?g '}zV=ZF|s\POr :gZ|F-.7kt#4 4z҅V@hr8c/h#B$7|)V3u 46#Gׁ*3 .wKi{իw&ެG%ٴ u6oA>qF1Ն  +-pB l)@B5e7[gBcVbOb&O+d +DLQh̞깠8ĚQh\OIhD>k!ɴ1N{& ah|'E:j.9[LvrCg;їƺe-DBㄊ 6Ј*Z6Hx%xü9h۰ӈqnqCu n 9h g&8hE̫h)Gp+^3fZfdJseXM4;4]StAm :;WLZ8h2D-Mvq8ns)i Ù8hE&EQ2sЈ'n! fZYMtq4n]huv?uFڍƳjdC.$ %6w'QƤ338Az\}GutK hNgVL@ƾ܋0#xa͂DM:!ИJ2ߛBI;Z I:\hu 4E@cXN,9Adllo;_(hL +\)hEF]s1Kur4"DJh;MkŬcѻ,,u{ AX; 4`+51Т) I'3=0YhY~>YhBu@csaioЍF13uH,,@Z#-1@t1ڍvڍc;61'a8seH&\h Y@ +\h7wэ^ryg<+΅& Vq. 4db1eG18NH" h wF hlQA# )d7N4!(CF#&q-lu.u3-i=tНAK{o A9ռM49Wkr׏37KG@#$~:?xf5||TW@s-h|@G3-" MRFhG@h\h|@vқJgӠ;3M{u\ 8КVlq^`g)m4f [d]6$4g YiI-6?c,s~j˲ϴO#M3,}p3F# Z32 Ty] AUKӊʡ0\&}kWbAg8ڐAaҴEi}&| +x3MQ]|F] Ī6ϸK#!ނ2do|y?jO>PW͐τ10C>C6x|--uD%aD.ԥ 3 ឡ6`Ї- g4ܷ/g UO5?Y`Q(\~f5 ?5?YfϬfg׆>3Eɒ&ɣόdgg%͚'Y͒f͓v;,l|f5K>;dݑR|FZJ>H|F]_~ݑ丽#,(YV5[g|&g"|*0?O>;$|,|&QsYg;#a?% cs!c ' FJ>|6, lOV36ofg+ߠ.w SM6w(wE>C=Ġ0Kl ;o&All7,C>djl h|ZV?|V!v>;:U33tग़k|=gJ5 >]+pLYi⿵Wj7ೣݷ|DCLYJl73\%,lB-3.ߐϨ7SS|V ߡϤ 7 --Us39!j{ِ6 7ܳ ϶p&mQE+,|f4>6ogϨQ'q\_gϮtl`,9S5=Sv=3|{f4=;XUrܳI[g={6z6P~+h{v%`όfgn h{vT{ƅ6s3939ٵZ]WP٠)ԳkRόgRzU7гkqt=4=zv-nggzv~ng0@Ϯ lٵ]YԳksC=?7ԳksC=+pÞ]+ٵ2 =VM73T=T7س\gr{68+Z`Ϩ/gbrB t=˵٠ԳkwC=ѕzPtŞe5 @jŞ R=V7ܳҪ =?,#H~=ӕ{6 lNW@ܳ8ܳu82\gX +VN.ܳA8]gtM{6Nل1]gs&T=P lzل#]grtM\х{FS,+l.ܳ p&>x|6!;\g`s!3{سw`&n=ؔ l]س\g+SJ=GRR&vB= I=؀;QφJ=+lWYQ. +=Ӫv=(ogUH#zƏe@ +ROd:@& =+rJȚjHYzFӜ(~ :bU2fu#v=+v=u wv{=\zF݌>zv @0zي.`ы*n%m!+FԠ9JpĤ^ D +:-3%~!欹fY5 猷j%V=,f/]3wrxa4eZn!Y99Y~@K:[ ݾS0t }NA3KtM#)<͑*:̐*r,AS|ڄ:c2 j,r/#|t[5ȑΰTwӒΰ w'!Pё@1'A[&Zj<,L:yᗭ.^TD:czZ~!T ZHg(6 C:C+N,M3eIgg!ʒL߻CEVu#gY3`tQA+b(Z(hbВt!ayѨ=itm5N4A:wkjtvbRI0f6Hg8zZ-sRD9ЙQft3[itv> SaMjtwgh`̀o΀΀lI[֧fYG = C|o9ckȰ3!B/#@MKC\ "؂NQ?6@g߮!竧X4:+892nt$͂` ? c, Y'bmHg0'`SU3X`nuoϿ4F: u4 &WaENL kQ(ސtZtvL:V?c=PM64mXJ1!3Y:۱KySt;C,abFsTYꉷzT^;r +:Џ, paz+RY9BVip`Kxxa+]UuY㜱Tg9_5v>4qՋŹpd- ȕj8gg19۸_g9g831g{8\ƻ){s5drxe䱜3Hksxl̨9KCIm3 "%[L ?޵9 HrMuaIs2h28g&%q&690KKď穴/9ÍY :?bot6g86iNS28gpθ4Ao :㓇tN"v :x\[Y0' :Sv̓p!hLVHgr K:R̢YQ3,!FcƶݠΰwffQg0< g N܌:B:lBa< DoumMCejuyC-fvԺyY+6rU SE&T{I_3 p#w%x9YZ|IddPg``X:+XCrSǠM3Tv3 啻x6:QQ cVhQg ѯR:Os5β HbnPg؈I3- 3$<:c/"^C|grju$زdXg8f:=p3؝q,gZXYɈͱଃJͳvvæP@auznn]Xg[6ج:IC&]YXi,XgBOqYu rlz+Ӱ0;tou!=۬j ʼnͳ0#c 4m]XgLXutf:kxJ:C_Yg 31P̌ l5-ZQm`Bǝ!5 iqg"4M3chr{󸳈.cә}H>j  X[ + ;dPmYag;v#c%K~`s389dmrRe3Ί40,4;ccagH.W;3l`ת iv7SMV Nta`glWEa +;cOf=Yov'd(\ΰ@`h6ζa< 9BXΓ ;vIl!NPU3 v9CM, -6`g LΥs|gO +ik!$ﲬmv7fhgW"ȘnYg(VS쟚`g8/ ;˸lޥ;C5E +0jvƵSvfYd7U3ʑ< ;C[d5;Czҝ%e4ͫs?ΓpgQ5;:Y +QhN*rQ0 )Rxg8\g(Լ@<;P߹ ϐ1!xwv5;3WmNEm{Y.:;F]nxg3:v;)a-3/3XTь Ң VEVY3W$)jx`d& cm% ggx~mJr3'gz!XPlI[p`gx*E/ Lu gWG[g~;.3>- °3l"=wm"NgOaxv"Xs3-HCG<9'őE< DSgq@$$ij-EO- ۾0uE!Iw3~qapS`yFwSZ;\JkgH?Xh ]H$`!/ =cu*[jieg(0:sgcg\gW, _lgq.̳CI ys;M3 <23Wµ9ف̴n0.@[g6ecCz<4D=cuW@gXr̳8=쬶zgdg .;6VUg7RTg(]$2h,9ف}}̲KǗM3P&6hy:bgbtg웃$Dg +< WΌÞMkֶbfǞqX:og\h}Þ!kwօ5s*z13@zgyḡ.jOgMNsНZ,ƌm# iilPmqw#p 8zr?-rhgp[goKgP`gpSm"Ce ӐϸڐT33ZEHfk3>b|&PPm|zi j0Mt}9 +=͐϶Xy(IȮffg8ik3 (4ѕ}rfgR }R>Zm/Dgh+Қem8ȏ4ϪY8ٲ;_ng7V&%gAGgluz- 3TIyfWwW%W?L>h؇>سg[`Gܞ{&H L =sc}5DzbgRZ>ch3т([kz2ڢDvu3֮i>cm9Ggв<*}&Z/34ңX+XѢX,ng,l ] '|&P|-A3K %!}ykبg! kBԣϠEo6XE&Kg͞|VU<g,ml= C8jgx+IAWaAf"9 >-Zf >&!n6gkѺA{M|LbvP3tU1p.TN>S +'sg|n9N/ϡ!dgЀf5 pPL>6-qL>d[Xe7gYz)U3…g +kFBlgrOxh3"fT3U3hj?p |9kɺe.Y>cQaAe}ƚ7>c-ngV譞gEWl}ƚ4\fkA)-%. F> +?M i}^P1H63ѶMQ,5amF+*4>;X}d`?Xk`m}&~`g k|YT3zeveXhE2-LtG>=T3֐}f~&?g0 h43Jog"k6gaI!ܪ}&Z `1YhQs,L+gbYhڠֽ,LT LC,L"B?E*&Dh~&Z3Ę(=XUXhM +k5Ҡ&Sg(dLTtjdg|7 ?m[ꀳ?wU3693:ְXZXjZbg#6g*&6guS ?Sm ? LJj~&Z]?M-LXng!ScL5ƃ4>O6 L43 Grfh[N 5fCgT6M30CtA>[h.bf&[ ɐDCw6gmcgJ9hC~A3zEa3L 5EE3j*3d13Q-L܁|&Za>SC L؁|&Zt33Bh߂ϠUTo6gud֏ Lc53ѲS L@53bjM,%)3jLhE1-La|&ZDHC>+XgM,5\ĴA>M,L|&GVhSwA-L4*6XN-L~L4n6gT3B'#kk|&[(63z 垉B-_6gE4=垉֝P,Lfg N9k8n6g$439H5#oƞ$'aDSLc^0>c/[K݂Xh|j aېX,b>UL>cMa`͑Xd.+)ׂXе|Y* - jg G|[gi b,In >cۡh|ZTVka,M*A % k5>c% kIכ" > -54=c eE { +ңĦ`*'sIs3֐!-`XJokgT[{ƒ6=cm)t|F*[}'3h6>c-\X>cm: Ϡi k fs3hXũ3P[wd@ͱjEͱX~Lij3rVr͡X{bEAqF,%jpjg 퐛)| Rkgr3.4ABxzU A< ><|ƚ Y午^rfg6dmߜgzÂ*rTN%A!Tm-5VI[13h0|3h4!ɢXgڢϠ3h, c]igϐ, ˌ>͆< 5d2jgЄ)>*}VMYEAY4IzEA}-1Xz}i. Y5C>TŵJA>6| 6z:KgFZEA44F' ZR% A%j}ۡ7>ofY~ Ai3 SmgkRTg[ڶ3h֪д~ 5Dbdgubg Ϡl33w?lYYeT}b*37U?wU$oI9, ZIk3 AA?aX4Z#uVA%Į 4v~/({U-AIO3h$I3hMv91eY?sݯ3hWeU>~t`U>Dؖ5*v7ԋ4Ϡ2t* .]$|' Vм9YP=%Սwv/nL>|-"}!("$tmP}Vg@wٚE\̓Qkڅ>2uag83b\ ^ iϚClg0GWE|.>;Quwݢ$$fgiV 5}cg)Cs3R]A>IvL>;wͺ3弨h|[dڌ>c7 7.l/aɩc>bݢrs34Tq"gDQˮȴ}HCbT9}F\5u9Σ7$dcgE`=JfG}}ɠ2?_} ="q13hT>ԅޙ}]!V*M3hU脁ACpª]3}ig3 6f.8Ϡ F|gKAnbapa D<[`3ǫIՙg?ucYRba0rfxhb3&bvϠwzb\# E"vxދ3H=g.a,+9Aan6efm sAZ7tBaӔ.>Ϡ&͢xL}8Ug5c^:14_p|tJތa" n +Fge^%3,qŁg!@*]3Uƚmaa(3.+QʞΌ?èsB&D`ƟaXi, :ZwU}şqm%Ί|8Ep3(AÌ?C ;']H%I8=XIֆ~xEކ~&5&Pf^ArbC?K<Ȳ,%$mgx%p33mԲЀ)m!Ұ_>ϸJ]3ZOwvϸmSHf2Mߌ?ÒLmA,o;:cp ۧ (gTfM4AwӃj _Qmz pXYOY4p"h !6/e갔x&dϲ9Q'#%2khbWr.Y f}a/AĩT>,fgAăM:b1 "lU] rgLu8d, n, Lz0 q 溴m>`|.3hޫUg<ϔo G+ͲϘa"g *1Ͳ@޶L6gPb@÷@e1e~3 >{;^8cZT}ƨ.͢rA6J,J?63&zfgO-ːL>cDfaә|Szt|, 8u y"^-- jn3){";Ss7T]g+|ҁ` 7ifm,dC?Cl^ l񡂢šS3>2g-YV9fVYa(A֭s>ԋ4>iQ;olfA'36?{ɳe!eW76> ϢNO3̔(j>l}kW1T3)# ~ݻ:X5>OR3$'~ggغ-LrggSa؟D|{-4>^= >(WC b'Jr/ L_WH >t9dg0?,sUL=;9Q[`EQ0kR0PPk, Q RNdsqZL=;QZNO #x-l73^e>cm&J)hg81n]zu٠!b3\v%AgO:qkCw)0mz {i>Sz-S}C= <`.\JT56QϠs&8/J,z ,RyA.gg`P +o$vA9Q3}~3`^r0K (;mžP!L3h6bπyfΊR3`^2t*8cπyIZ7X.{49.X.>9|R0g3. ѵ |Kl3 0g4;y>9(ImžyC=%q&Yagҳh^9d%užAXɎsk՛=+8~ɨzY v 3fgx|0gbT]س^),fT{VPG=YAģj  Q˷ H=]=` + +Oسglי0ɨ+Պ#=+ք=Al3~j,%ǠYC=+3@fYIzٔ4C 2u=+Sk$.zV%qMгޑBϠޮ=+H гU =B29-0 <ҩE†ys jxY']P}rŘ%!qY$^bgIQ} + YaWg {7ױij¤܋ jgI[9LL=U3]͚Y͒f͓ϬfgVY3Y,le͚gYͲ&maYͲϬfggVY3Y,le͚gYͲϺj}f5>5>eYͲfϬfggV3$-3Y٬9,j~6k~f%K?5O?şYfϬdgFs33'ϜfgN339& l.٢L3٢zgN33if4?sS?39όfgN23if4?s9f9ϜfgFs3i4@5@sA#М-!hf4@sA!МfhVR ЌhN3 49 if4@;6#fЬdhV2Yr3HEx?3M@3 m \@3M@3M@tf4@f4 @CpVh6I !-YrnүI[gFsAYgόgЌhFs4j^&h&A,4#9ڀ4YMh6XK+h68L+mZ856M+h&J펀66P+m Vڤ- ڨC mEMđ!jE10je v@;`^ 4J0kI k mV\N:s49 +`l4Zw-ߺ]F]@km4 +o l +AcC]5 A^ mBz-4qbmAM6ImB- h^' C厀6 a IU [h h3@3`"f+m$ˬ .h3]1hRE,mnhxF#hxlE4hAhhJ2жM)+m- 4LU0p%3ZAjvV, m:v@ AI3+M˪9bVc[ 33[!hbn!hi-<b4`vFOYx+ $e; +E:ͤ3OA96<M*-QЂz[Q6/X[)h]ŒvAˎv Bۓ$I܁6)¿U6i|J-fŢڞj[M[&Jb2-I-v<*ހ[p4v.-"9wR.n@hr}B+cw 4u2#-ֹ%T]5B+jP MvBJhc/|eYoB%)i]̩GIQEuW;$;M5`Њ09VGVZN;s$Pj&G펄FBk+ M`- +MVvF[Z.yکSZɕ&.햄vF$f$4PU͓[( r]]5w 4kr4u7nw4 +PAc'3s+XC<-ͼàKj]b+-0h9+C&펃&[9fp`>"74krA;8h5 @rQc0@uDàqi<v%`{ $<V +MVf`mPat0h4RߊA Q:g)0 +UtCAʠŠфA6+ ݤ/4lA0h :a$Pиd + iF"fίhw4ɈVQ2ftj 4Z(,ae-nhOTs4$/hW ;uJ[h@,$,l2_gG1 +j6 ++^}ɭ*톀I MqeF%J@㴄ohH[^ h9٩^ hrTs4,Ģz%EIi74NH+(O''kw4ib{Wh@hR.3ohWBhJTs4ZBд@dHb q.n2n7 48>49i h;C,mx%Se%]f7A'+ {9 49ZE<,4 v jI FM#h!Jc3Y}ԑo3F5?H?CgAѩjF.˸vCw3UyY=u xDWYaBSy|p\5~>EihH/4dgbA(`1?X nៅ fng,;S,NyZm= "A$ 6Kak]RVY~PßR8fg}hTęjg99[gHڃb<[ B,YVY}?G]g4G-y}v}y)S.>cs-p3ίBFǢ,0GQͰp~ H6{k>/@]23t.cG]KgSuޒꔓ`=,Sf c:Cn+rpk+ lF<, dˆfg\yRӱYgyc=L +k}Ver!8Y<r~FN$-𳚇?E \gX1uـa#R[g GYŎS +?`86?# Pz g T>C9D9Գ6[ӣϲGfYsj:byg8?O_Tgp.B,,rަZ6ʣUcm$;grE= 3NR6g0쁱, ,&>c\j03x-ܰ0^}9ps348,ղײϰ4g<܊v38j)ݨt>Ä%mܚg@Ieg:al| 䞸bgHǢ4(̀"P, - _G> 3P,G>Cšz|{}k|V0f03r,,<ggj[o|NxM3w^M3x*[nJp3_ |ԁ=3a0Vm)=CFN:pp + [7ܳ1k{SR8˯3@*6g8T_fg}م{ߥ {.@{tʌS{Cf&rϮgT(j /͇l|H.3̓gQ]- lTgp8ل5=oТ=Ca$=Á.3_gRrf\32Tg|Yy*Г Kg-ge.mwпigMVYQpe[Ƃ8C- &L(# >L=,JUMQ`ƖOmŞm|.U/j{Vi', G5cp_g4*p=%׸lgbp0kDx{pܳ}8,3!HhUma:=s3lw{fsnp`VrDdgb9Y:͞Şmy:Y 6 [#ՁYg~%z̮г}T/3uȃa"˪vNe8-=w:! 殰IPmEܔgY{,_gqbJxYmzAUb@4=SD33l=ۑ"= fK9NeiyOT3̳̳K .NQ1Wy᪛s3v*2hCC!*\\->.>C)&,8Աh @iM30sͱh}Vmj}F6E%>i]GmrTgPwiI}1J+ۊ>|FU%C>BGq86'_#||$-dg(_ +R3eYŠ'|ff&G>HTv'I0K>cH6K>Cc4>V3{K% >G>ءha| K:ΒhTbH|Foy,͓߇z}n"lC#8 (.Qi ,Wz>YtJ3 I"c$Iw< E6' , NϱϦC&> 32Qaa!쳌;̰Ϩ߇uTmbI̐<*l}>uUg O`yA9.:I5> 3,ɓEa}X=,SG^ VY`733T2LDRmB GUޘcٱ?;>C2VegWA3H)}jݳϦԅ}T F^M ~ +;E A2ϰW?c]t?cvIRnPmŸ0tßUuIJ[g4EJRϰ_> L9bjur1- }*[' U &&ß<,;ՠƝ䈴d$?╏B D2϶Х"Q F9YD9/36`QO?ۂ*7O?CIsMs~l[d4?ۇ'Xǟip8W'I:|C_=`IY_c;gZ;}4 />mF_n__o_`|p<՘c_e~Ÿvl܅87SMߘ~g_J20~o @p¶ƅ:~b2K>M XW ,2|A~g?~.ƅ*m d&ጭ`[ý+ -?JJ_߅5>Ic7"W1@Ͼ !#7忿 +; "JȐ_Y9_KtEE%t.1&|}yCJ$]]NW,dX_/B;r_0EU48V *:iu&TdN$,\z*rd8GI{=[hEx'nW b+| 'GJ@d;3_z$fllOzjGb;ߌ  +Ul4ۻa8Tt^%6j^͗^c+zT+#kllD46]z$wz{N+ئKĖߌ +7jlGb+o@ ]/=ۻBd \ˮg:_z$wDž-V$Mc/=ۻB8G%6_z"6N\#L>cM ݑ 7tu!5.=ܻcUt24̥g{st@\ڸWC ͡Ɍlot7_z&7$4{pӥg{stbhlӕGB o 8 2̗ ͱEz396LKcJOݧ7GcռLph3;0¬ͥg{w4yV!Ý/=ܻ +, >7_z&wG8%Lpo\_B=?WKp#o\c39p5&p͗ eۜLpo+39B^Vٟ=39B$vC~Wpӥg{s V0͗ "`e۸Lho0Kj.=ܻYnHpa.͗ [-K]ۛK"(7 snmo.=ܛ~Lhojm39:k7 +рvmo.=\zs4`f7 ^X3J/=ܛ#\z&7Gzs 7h3;ͥg{w<ރ.=ܻ,e퉽Lp8.3;Bn|&p/=\ywt@ ȷKփ.=ܻ^\z&wGBP{pӥg{wtMX^:b/=ܛcA8;m̥g{s, BBnLpoޢI͗ 0ӬͥG; 9Kx@:k{sWB>k7 .ͥg{s<ir=Ɲ/=ܛ#D8.ͥg{w_>K^+}ڃ/=ܻ#3s!e'KW!P+,zpӥg{w/#\mnLpo0XUmއ39>o^؏&7Gq:z;]x&7G~:39"20?]x&wڪ_W ݲgB{m5;fn\y$B^L @ +ST:7_z& +Y.iO -H_ +d?̥gB{ձBAPs޲(ۃf;g.}5nj;^O "zE-Hc\畻05SaG[^M o4}$| l+w-^@H̛} $u>q؞}$(;^-!=da+=i!g໒n<0\`B/Ϳb (4_su_cz@ ;96ǭҿE%sK!xwOd=1̦# }tˍ8 ռ +oޠ/=@Iy?n4/eo>~O}i~K#Yw d4}'j9W?AY_w_Sm+3,62Pw?Gy}t^ a˿ؘ")īߞ3&g_m݉!(z7<Bn AvԳnI^ؾ/!# #/tfW`FP͆|ު#G `"2yg_s%˳5%(oB?KA9yԓ6m)(7ozxvnr)(0ozjԣ=5%⓮]%(o?KA9xԓ/MPOƿNs6sPſ7A=F C5WԳe=4) MoBzҤ'ԣ/MPOҿczҌIr&'_ *779G_ {A=j2JPS~Qsr^&'M_ {A=j&RP&/%9)g_ +vyin.-sP:ؿ7zԹ-x7A+_ A=TRPΘC+AyC9G_ +ћt)$g@obz҉ IWsP:Ͽ7zqԣN/@O:̿ 姠u)QGB +.Пu)~@A*NO{ϱA=`JPְ~AWFsH:ֿ7zԩ1 Ir&'_ A=HRP΀KAM[7cyy+o4?KA9yԓNu)u)Y'r&'߯ƴA}sqz{ԣ6])])(NozҦ+ԣ/MPOҿs7A=iGBP}~QBS@Ͽuyv`2??h7J@]~A]?j/RuⷫGm_.A;W5\чzvF{5{'%,[vDݽe +}XWlSzDe}Xװykހe +}XWdam\LXl Ujk]XW)wa}_².OkX߇j| ˔>PJ ߅| ˔>Pf+˷a}._š ]P?_!|j%,[Due}XϗL)Q}F_2E>TKX&+w|R_².OKXX߅j} ˔>P/aق}'*5#5jkmXװۿӵa}Nו>Q/a}'5,S@e ]XװL 5-wa}_Ú}T?_ǯAB~*5,S@-e]X旰l9 -wa}_ڿ__|mQ #UVvY~ *|He '|ga ]4װ>R/a"'%,[DOH}Z >Qar5}G*%,[DͿe]X\ٿ #uV~o#-wa}_-|_ڿOHe \Xpt/֧^  kpAd\Pp ^1a} @2v>HX G X> a4oIE _ذ> ak$,k;}?e \XpаxhX$ps5a} \Xp +U ^5 pa}-@ھ_/@².O8hX2 ˚>a|4,cselTfϻH@}8$c `C4[~C HOHP5'|$(c$ݔLi4W_4*׭|?(& +"")xIZD#8_\¯_W~9毿m__ow&k[~>'p~ +ӯB]3zLF^xK͗hyiQ +ۍG[o3C '}pm;NdKq%{'ۿP=tiAHR͖[p'j9_9Cc pZiѻB] 5ǎwZ#ԼJr9!LҐZ#vC8K8z +H]8J؂Z ՎT*I0 +tX +z.9ı:c8TmW tcU^{JNJ|,'ꬃrb~;.}=cW-_=OQ8>5גZiV8zTZ![׿(6ΰF^{R x:yWGJXJ)&ҹq54zԦcafȜ;vl4JSPBY^Y|@-q;E!yj73Z +|O WNkZI k􌷺s2ⱥ_ۙB-ޛC|IبI#yڑQ~;%1wFMdfm?Qb)BI"Ik-~rfĂ-S;S=]r1]+һ9 ks3F7V}%bgKb/ts^A5z I/$#I[]vj"|-)'$jFzki +{nYCchhHHԗ!HMU.~>$x';'k{_jtKP{%GԇYþFqFOsA g"oژ5zrRjN;o#gY. +z΃_7꺩ay4 mdLNj $ GN[=E3b7Q(M;$A4FSMaT+74>ˉsQFqƻ/-wܩSo$bR!hJo,~1ɟĭnIN]WE&/KI;=?`L]+;o(6ѣ*vk@Mb)4?DNY̟΀.U)̑T~` #Q;= +}}I*)ӋN?+(;j'Q,H=;IY H=Le4'G/5'RGD٪z + ]zP#P +z-z"YN=9|QXBw@D'N7zxs# Mm@0/5 +7gԶpp,4DA+6NbR_Z~H^P3q߈ QDs|)V*>nZD3QM4aN5.[V7`bLThG?UzȦ!4(pO픦2ʀNaf}`0y"@m~z2oTѓ A^dVE2٤u큚#}}:_F/ƵL"IOBktS +d5nCvϣn&K:9E6HI80H4tG4QbDg#,ĂN@Ë@x4qډAo::"àc4z4+IrHe 4[ڱB/e8D1\EkQPI_N/C@(t[N۶z`=@A2l$VPTD)}9F^B`Qh餷aG,tѿ۰#}LICnN:&cARK<8Y(m +4OEԋє';.OHC?nFW5H×G^DF) $hCa- Ƥ5HVZu^:zcrIUnx2OM)IvdB)4Z)МAhTM$`LCB&Kc,ih;Fh|ډg `SFEB5jyKO;5˃%&',yvdӟ!2 :%nEj,ȷKC +JVF.N!ћH%bH_rp.+=~(dKBC P6~ϱ7 /:-4NBM-Z;s~5K7bj'n34(2)!`A3&v6iI/7i,^DzU{#JZ 蕫{) zrǨ+=I:.BuB$|Oњ"[:bzhP\ʌ6v`,[Ш^RNRǬ +Mz%^Hb~dd%@Ĉy..-9"'mdI.h 뽲6!4z_c=ܳcB|;N;9zO^[1,=pChCR?őF͜V= +6=6.i#46jzbZST5K7" +jd_]4e%2.0T`H3\`F? Q <Nz ǎ}ߕ)~5>#FUN$eoIY:gYC3Nn)7t^"& z)<nj}MiJy`kеi4fȂv&IJJ +I4QTMA' Aɗ<|0X)dhK>+W`[ +*|,&T, 㳸 =8I٪`Ů]S'pI(LBdKLUg {E`[!UK!7[PstolkZ wSInFoKD RCõZ +I_ W[zuJs1{msӈfi o˅]\;3v!'\i %nsQ 6vg ]md䎏џp;ҭҪ}8vSIP?]؂!AgvmFޙLOD-OQU5߂/I7!xL诗˓w7v٪[,Ҵejb4{8%З$+T[ k7r,p%nh7r%j1.w^`G ;V:)vl>ax_ TAW֒ o @N:"cMl]KofKF+| ɖA{P-uaȿ\sVIg5DHv:V +M_~MWNJpPHX^9vs刕r"Ғ/Q@Kf˚]̈́lAb\ihMmE;܏eHv vя +v(pȚGc +#T5ۡ7iroo˿]Q +Rv@֜ch-o,!piʈR?ضXw,bi}*܄Z֬+m'93~b?=dgmysFNSdu|ivKl܅ { +%$@GTg6Ǯ: +B|f{?uO_-ck6{;Y.֖|ifWv3ht>vO]v/nH猥)Q3-U[홴7־NOwNHC6iv؟HߢS}U<'5{.T@p!PQY-q9JGf ai{dy~Ov`d w4;Rv^h +"cM SLԚjӱE]PWUhH{QAk{r*(!_7h_Qb0[4 蒴 +{MC‘?v2akI J*  WT86nW +Z_BB8&TMUIH "|dPe 24:\\}a7 5: ;# ulyGnOj埞V} WY;dCmU +2h+͢,;fϲ}m79Of(\Þ{#QU%͖^ uEtfk!ٞX(] uOiUjZr%b闭F}KCݲ#p\u^_ñ]b+]K5dw >tRw)`7 q8KCȈEe8ٳ'Z4{4yyE4{Sf K_,ϼ̠rТ4{`UźSXmWBEǂRGOm WT\CCwni8~Qߴ 3U*JcG*.]=dƺ!/#]v^ٱ㽳 w${Г(YJ#Y;,`G >(~NA6;AcKUh#_Lħbxz'lD{b竖A sӮ?~p43hXn VڊqTR346SIE|$ť-8QVHJjfo3vC/ElLg/jpf0k 1(-nCCۣmj\}mGG?!Ӈ.4oB +$>4$*:$Q|6 w֞roq2;*RV]1`g+w$f0χP"TZZH7 [iU_dϢ1ySҍS,LejXaW!͏8#]?xB#H٣Q=@>r:H=hjf~pTfI$[q +f/:zoj?ݬ. 5,.Vm[ѲW^f1 1+@.iY^؛K)28.&&~-Ýƍ]t!c7]^1,A03Q> : h]ui7H&8&vmP|s7ZRizGf 5 1`/b;2QZynY(S4HB;]ӷiF}uQjh-Rf5}* +|+Lsx jٹ4S<)嫑XdK_ohdFhJݙMTP +5Ϣ(ݶjZE6RgImn^]6IMmPX +d UeJvj-`wHg$Fo;dLqTv)f^ނx0kbHy ͐rjr(YDZ{9(ٺBq|АS>>Ƨ5CtlEWX o+rLv=E-xN.jrBb;fd, ;`V u +Xbуmd0y1ve!5 CrBؾϹ +XE +vJ[b[`{5gN Hgtwn B팦Nj=#8TPA#4ƾЅriY\ʄ8[,G }a(|E,;$=IB6d3N]O:,Ak -glo_YL FIDap攖k +LHg&)b9~.S ~Bή)NIN{W;D&x$i7Fp8a0gƩ*ǢR53".# ]L4m '>  d-H \(PY=p[ ˓G ᳠PڑZO`hi\^a 3pR{xw25.X|oHݍ'հ{z3.$\X <ʐf{yB5[sfd{s͞d[AC k^-_h;+wCs'!LJSk袴W1&Σ v-jh8Cb4>L$͗*yk3"/.",~Ƶ^1ح~T֩_ơfjmZXl 8k. +~,$1$i0;8nyd3RT}( ][*c9/Q+(8IM基$q$=ZNmYOeGmg<_ coh.GW4hD#nGvLJ٠S=@/?&]L?VQcaŵՋƼDQ?Z-jA|LRv@h" ">?"7)!QgF& jG!4w,"j X0-L.G@Z}鷢,uDk,Y ]+Qc3ĩlqi>ˁ ΢hpގBZo فF'$*@ +ç{#:3#;d|?@'(]H$=B{K\co1h/,ukbRި#{[(kX|Gi89Dޟf\mB0~ʂcJqHX:䟊( 4s#D./й r R=X֑rŰ1u{њK{2W>AӀC,XpcbХ#\j9Ľ 9z9nOɧҡ+q}#opxw*+n$ayoVJ}'wdν42t_Q6s*QCNBDhb*c@j/h~eN(]bn@ EH>c- 6ݡb#Qo`Tdυ! Ih!#>?4wj720ɶB].2@`t9o,.91hˁm::b~MP;DZIg˜o0C5mmeCA^}Ǡu v YzXzm 9@ i@CD4 Za-xhϮihjN;*ulKI(sP>{{ON@k|^GJ +*uzG2h|N}-Ű~]S4[mGwou8rژ5_ƖtvRfd,(6&j2` + +\CTL.n@+vG&㳛Z@C7NAB`ͮlLukkIƵRk>{ICoHUL!eרPKxC+!16 > v&dWЦ|^8-Gwˁ2\ vtO6jOHzcgP̼Jl%uxE8x*oB]TPpXLfWILU͞{{yNj2vzDIa5Nh'mHոMҊc5f\v%|tDr/'ՇW!h( )<%VvS!t-l=i8}'MA)N@k?k%hdQ$24[m_e?4{ :t]kzW``!h0[k'Cqcw; }dmI4_0mw?]cOl1Mi!׊&Så>8h77~:>Se?`÷@׸3]~(cc+U(8&E (TE~Q\v0h/1Zr}.13:'F5a?T[>J/qJ SQ+Ho+0:UQBs;iZ@ZCs?w4YEɆMXZE=-le4[I80܉\D}VghٓQTh0]-ǍSLHEmbBjߜ7}^87jw<M ; J11|>, +~)b[$,Ef}].lghiIMQƼ/E vGJD8 ѫ6iG{bGg~-АPj7E(s٦t6=0'-;E +G mh/h+L24,kab-EBn>zC >Eâ0oP6FILDSOW=(f P#00˃`: x<^)g!;o"[1;G!kD[2j'hrAv3(lh0~xQ|C^qo>(;&u^=MM:&V8l9 J,yuz/]j n?D$o E]!rݺ!pfD_V1F$Sf뛯6aMae9I@Gv+i^ysKA+74h$RgG֨%WEı:i_uGqDp-xn(?&:V.–nѝ V4!U@lCUJ +cݶKK!E skn"-'b%(o+-<+>=D{尧 Fn&a jѢY&ZXRKT|nKh{mCoKA0/BF{]?&_RƣN~6Be=5|4MKw5[xK}3d˅ߊSJDPHV.bn2[<60ZI>g$2رDXW~hn𰇿q)5E\ )@23R>OC{m} ?RDtYBD5ܓcO&!*t)})KS:"ૠJHTo,q^)&8ň=-j#7LQ'S'E`lla-E1F˃޵ ú^5@6~ffN%ݍ/qj<6LѾc2E^X!b D<}ě(^BVIp GlC.=Y&7QޑFJQH?&qOկ^ڼ(ľӌo7cE`6!k0vm(\3)Cw~Y:n&%,POr@Av͠XTÃlj#goI^*zH;gEZe=v#MasEr$*0(zyIK%{t%j*\*թ~LDMtMEðX+,zO3nD)lcf_fC!֤l%C/]E^LM;LKH ;'dL?d~7l9/a1nt1?hmi.y33Q5MHp2ng2\ǯaCRcBRbV}d6I,8N5SLC{ӕ(t;8Ħ.{MdjM$2E">dRlߤ/CN2F-PQ!n7Ҿy" EIw<2Pt`W@ +|A7$7 .uǎ]nYڄpf,* +Lυg[ڄ\nǩ/mF3PPp%jrpgp~qp9 ,ꈏu'S pT˳MG69AjZ;eMCM +*|[/7 mPq  y@"ŠoA+},x f.@Yr EN)E|[}6 dUI3qNKmh9v ˙. 16$\6U b6~~<+ t7Ǡt[9n+\/mF5EUn+]m 6?mq!t]Y+ [z4gm@ jڐېUo%iِܰ3Km2?m fr$u { }lmZ :[ ]( .6 Oat ӆm&Vr]m+ ~g !3GvsPNZ 5m=lA!ԹBYyE]/xEzn{v +!N۱ۼٱXޡN|morgosDڳ ݸaxߵƶ,-d_Ey5٢ۀOjp!K;r[tڐn5mn lmU}rPJm?#YOBn+>(Imae@K4a57xv춎?m}lm&ma?m:w/ݐ +v݆9_v[}]mhAzlݖg -Xkz o{73uYw!قn;Zi_t0u-춷_}a toEfQV'in>~j eA7Vr#mFqTnkÖnEi36FΟ Mf/ώ|nFdžV̷n#T66 `yaauC[m*>;v#~\m|v6|6출3mF-Ggnc0WvK wenspi3v?sv[v ώf]yeaSea `<mcn76?;v6zφٱWvL66 [m56 ~1+娸nÄ Vv[WJ6 ;_m]M-=8 .dXmɹ(\omnDmqm 9#.).ݞgoor巡W_m.nclm͹ώ߆I7_mpAmpFgKLoLVz-U(`Hm`};dlh3ݔz[I@oK/b f;]UaZv nc۴;1춗ڹ*%v>S[mn"ml+oC"o]³Kx5Vxo"eo{g7{̼om姴o\+-߯6دm>nKmZ -tv,mƷӞ?<ږmve֠Z-ې[mml. +oԱZyv4)~v6OH ƥH 6YZmd9Rl䳣28+ 7V_mCiޖԌ-6SJoipcWzۇjԁm(ѳq۰Љgn7H~tv 좻َ6hz-/ivųm9XGik8z['ϖ6v;x[9coOƶ#iF.iVJ{mƮ,-ێFֳ÷ן N?mQw_m%#-68mޖn[d6U=ېvK s Wk! @nL@n{cgnVt[%nôWx{fx[<x|aaޟݖ@;~/Jn{0tҳARPHݖ n&?v[+Тm\)mfed]6mn;'mf7^mMۓe!H%V ?F ml_fw$'Epȗ<+ Rs|ȳr i SgmLvap=)!g] 6{ 4sRۊHmDBmсެ6 Im,@mùL6Qrt]J?f9}^mo"-jYvDlL]mE]mzw G9د6xp*Gnm{mg]mñ%$im;mRmM`nGݍmctZනs].p*:/}msދۆKmol2{rmrRM䶏Bn>簱/r#|mMV} -mm(PYm8Um8YmIUOĶogsE .q})w:|" ~'bEьmKm5mzǜmeb@}mxۃbYۆ'P0]eQݠM6>B@2A0=hm# RNO%O aqsgh*l΄M^h&1`^^ m+,'A 6L6ibжD㽣چ-'h@mC?-@m8/Lf`՝Cm)֐tJMж @Qih:}[6Apܵ6mmr|m7 gUTvcÖP6_e&faIvHތنJՓlCOنR}mOgd ܼ^_dk> ,ن)OD9fHeeF|BUa1ਢj|a .m$vYm53m7׉؆ڡHl`f%FH?؆G 3_5i?bkv߲$-y2d01$Au: ۀ8)l5{ k61_ن[ەtmy1tA8YFUzM~h[z[6$9x&hI;i?h'? m >жNk&hS=mvgcbHgj6':Wh47k]m/I$rPp*+ \X2'ljv2Oضts'3 e1DlN?mQC/ UT9-nC^A=ƒkmKBn"aĂ;LnshL8j- 6m8ǁ+nCؾw~p/}" =?3 6rXP#%u>69Ua&B93 Q!nc^+:$mH"#;ڀm=y>z@܆A sP<ҧma6-:Ԥ}m(=Ž}m幅m# ضi]>chp`Tw ۆEDPHۆly>ۆy}flOĶ,&NO>.DmL ;-}X4saկs`DmGki3Be>3hlc&vӬ)lC=NC0Od{Q'd +-&d}l)0 ̶ [=]mHo%I ʯDf/d|mȴچMB{+P4i7A),8U?چH6DFmCM5AprƧ~5Qm +8h}K|m~kgh8˒>64[f:OH5lZڏF̨}m̲ȕ6@}b_ڏƍ&jۉExj>W)ʃj}i)Cmlm<ˌ@mam6ZDl݇)m E Pm +\< 6"LS Oi?l2vNnvLv$ ܆"f͟nCU/1 @L66B@a;xO ;}mवn߸mײ'۸#V+0^/vݟnkѦ܆a'Pl nC,{&=mtp 6<6)\Dp] +nCPb_Ӭ>DpqGF=3BaȶqƘmH 6"'ۘy3m8zfĵ/ =mheԾ6*ǥm|(O܆7vA!&pzޚm;m@Wm}mXi n[ ?ۆv om캧mUCCI`Nem3 o"m`e(?lW%ۆ| 勔h _ l:6%~mX˅| _j\z" 3bPm M=Sb?ؙچ|O7ԶsKPж~ܯmĕ~vⶑ[.Q(~my/ +y?nAmrm&pIh7FXB&ptO7qP>#4Ua¶UrF#m\?mk $mùTK#3>cۈKp{O?l[%)Mg(~mp+6;6$6ZeEnu,6l/h!gk@fn[G3c]ۆn/Hax@do?l>~64/m8c4~6?rۮ1sP/]>FsnmQ+bhG6dgr?" N4҇m1mWzŶɃ?ض;dJ|mHUöa* 2 q|+~tm#2qrmsZ'l[{چ%N6}6Q۲kMжd\m}}mi0#V/ Jbo6T("kHmzԶ,O-@p\8Qۺ:X] 6L!loxc#̜bĶgܶ::o{\lm_(WĶGYmW~m|g3ml%6- +}Epm6On'o۞-ZQm=07 6_/n;VmwSmZtF-~m)Vft] +趏݊n;6Pi݆3K}/n |6o^D]0-ۯ!~m|~  _&^@?{nCd{s&Vܑ't # /-97&,۪m\ 6{ +m]%mXn`6ZFvfU܆3#\BeX v=bٓ{'p۩Xh 3OmhZml " vhR4(^a"q"q= .r󢵕Dr[k krV+۪ن8,9YyߧVp6+Ku"M4 4`Wp[58>kwOp=n&pۋr$ A#%Bf.TtT'ռ,֛m7͐XUme%N6] }&rY_g&=~}"o`$j҈z)N6:vGnck6 +fƫmǠQm覸+M6{Dnc~[m0.3F`zܖ.{ml9_Խm/ UI{m?nm܆ý=[p:xw6ԗUl!Xva8plEC.ܶkx76ߎ6Zw6;uXmXr ܶ +V6ܶv\Wn +.rԴbmC-ܶ:p +ZۆˇWnejc;^m|Mz#1z#e -ה?rLinL3|V gm#8 \mTFzw +n+< m=]VpRr_m5v!;+F^au\nei-N)܆4,v֤+ ē+ &n;HxVr-h6VUwAbmc[P/<ϺGstݖ3ېk/n_emhhNU;2Z|V^M6X36/Um@=_mxOw^m\a5{lmm{Xm޸p5}m؛LƏo v 3}@Ў0~c`a{_nC}: +@6.6Gur@~CnCpg&/_"N%F{>+ ͝5pa_E@8n ̶Xdi_r# mhKŸFt-i&x~Nom)gzo%W[uXhRXmQo8Cm]+ Q[݆҇տy`1lmpnm0_mGsfvt.63#-E>6PϽ&'B.S|B6Df!t,7pD\n&DH{V )m "iEHDp-!q܀JpCv +=z!t$ gps, v Yw؅f'!IInOQ 78]yf[g\ n^!nYueٝB܀RfIpC]+­XnPcn.4If ͂cpÐ` _BF[A4InUf['3+ `mP 7#?nvi œᆄg-0ܘí7v>+- ps*\n 4[nc0zv|nnu?n,:8-2F1T#܊K  +xen~e{pV̤H H,j ÍԧpVX=nmP" , =7{;ևo!ʘ@NvoeщNR@} ۊ- 7;%($\n0KwH nvrz!M[_Bpci 7W;Vcpϔ<: ? n j nSo\ n>7v$i3 k ĭf'K^`] qC~ [(Y!nE5A܍Y!n\+WRh?@,<׹vtqhy܅8V[#?B +`čЮ.B> nny(-@.TIg)-@QCUYZze í77\n C +7?+­V66Ίp{'7egpke\ny]i&lֳum? [Cg"*S# cPGTǠE[>[[CBm%ѾYZ$--ܘEtHpCAn`f}/?;f*; mS6;2f7B_mCx&to]/|[^|ۘ @l/rAy g+M[;~k\V\/"Э ootZ +pSln%eAܮF#@YE۝O}΅ա!N[&uGpwc3h MSώ杔V&?[[?}}Cp;O=;[>:K7-J7inmu[nIJ;ۘl1Em d=[O*"[eCZ1"#5nLmnpHpkE4S-HqR +ppmn*9<[= +J并#݃!q% J᷵a r*᷉muem%yv~;7i~,|nmcoo$oUпoC7SW~[{ƅ߆P{(vqbTZIed {y;x<;x],{XhMEz\mNm*"06-V@'m0Ѓưou76%>[կ4xf̓ u2(mVkl;ۘ`Y1 +pc6µp5tP[nhߖ(-~̆PJoE~[߆ɸ6om76$->G+-.JZ෩~Tvqm]?;~=7qv>0+9~[% v{u7Ov7+س!U57E%GlxCpІ噷ܼp-7+"qI 7n" M qc٩ q5`[ _)nmEۨ-7zVraS~'Kn?p[ n_[npЕ7{,+ 5qWE0^,Z!nm]!nmn nf۝`Kma+ o1F[;nC*DX n.VS ×VDZ@nxGdu;)5]$7toInbq!܊JIn|ܟ䆈X+ YrCP5^dU߶,7S,`ea%oԑ冔)0^d4* v6k ˍ,7tsrgr;A9qgDaNх7{6,bhV[rnr{\Xn]#φZȬ(7̽fEn^@-k\܊rkn&,wD|0^DpukQn8crfo\*f_% iDٙr4 +-(Sri pKr{}妹S҇FU^Xnaܚ[di̍O9;[ը[Q07Gm԰ž`n軶Я`n`[ VL70Hd\ Omm`n[&I?ya>`B!?'oj& 9insv@s?Bohn}1ωkCscfHDs;fxWgM: FCs?<{~;aheCڇV&HLsK@F_t7jN UP{jڇ] +L7<5,tù^{,g۠LĦF)MH{fH7,o- 2cYtKE vq, K%cD J|D2;&}bG3 ݰyڄtCjx)_~Fѣ}Xztn nD7v DtC T?D7HHLt=}Q.|nynUGFڏ熼~u"j_ha"VseڏDbܘyM 1g _.i63k0~87Amf!!F90kd͙hn7Zang4F6g*.im| nFNEFg[PmscqhV@gE2&kVX`!,7078`n]`nXP~ V锐ng>&L,3 XsrCG^a 9HrC'|,00n +4]}PnH-YM,dYn7tlXnpwta ~gVg9>FgDsx,4 47J*K>49]zRhn.Y6P%hP&Cp4Ճinx[Ƴ Oa}pnXs&TM@7K<AYn<(m!QZ|#{sAu96޹'0!7@ۤݼ`R>@7ļW#a¾z$Gi+F gWh rM@%ML,@7Ld^?nb[ <О\tꙁnuy*nB޺Jv}{>ݐ[A]҇|=lR7`jynv,7X ΜYn( iE,_Wr+r)J$L, MYnՐar~,4#MY,rFge݅SaU7rL}Xnn&-i:5׋[8gM(7JhI8Es $7v/LHrKo䆪=ﳴ/ͮl=&AD#-;# 2$oɍ6qF[3OD8b +%# SYhO(F:ʍɦp.ܚ)ub5G֫%~`nHq-9mz=gVQƥy^0XVtos3ʭW$! AfDr뽸ʼnF:č$FR$7<#CrCTݏ%$7;n}k =ae%ux^ڗVY!~Pn?7#ǍhnMq]_1cఝ~,fqP(Dφ7;bkP 7L &]_ n7Gt!n(B.rF?B;6(q%V$W[ndƍ4' +61cXNl8a*jE1n=h8a~=3-FB @W /(bނƍrXs] + +×*rLqcc$VEG10nӫߏ6fX([u>\&=xlǍ=/`!!ĉ.ZbfYAnwx9ȭ5" / 7861}'m|r˷7 rA1űM ʭkebF߫ؑ`BYڋ$7x=In(ڽ-'ӍInv ɭ{'z^Lr#Ji$7@Nv?P}Anc'm!DN]! QV[gmr{]$N 7S@n0CQ8"4ܐϿ$ܔMCn["Uh97O10[JVܡ +r7N|iB1~ ϑve:\1n Ռqnz$`ܦUoƸezOtMAqÆQ}zbY'Z$rÎqx#r3O#fI_) 7G3sJWt +Ÿ_q¸įiƸa;.#!N7b7?$qasK7LHۛXW8nuKp܈2\9nǭ0F[~lS'3 bpE[-:'[ow5P +[f^K~T=!n'@8{LH@p8G #fB@}s#íUڄp:pME[.3­{V`i? ?N$Uo .l"|{ 7?wÍn^K8AܚC n~qfq H naS )zOg׫R)[m>j&p;X']78Kn⎪ +p|n7^3 s^o'Jp{M +(N7|:Z W@aE?DZcBa@*u" #~7p"\mߧnSh3#b@Mf".S~(N7K> nLŀp_rlLp/}ɱDcWntOJsM]neXHzb742?9nox!mJOHpCB*O74Y 4ʻE~8ܼ䮕"ppq&![!ܺw7EŨŵfoZ[nN2V "7녭onlGseZvӐZDٺuApKxg nv>Hnǂpc'ɐfzv7 !nwn1z 7Dwn7B鯦@܎kX!nEm&dDBܜnf 7?nCy/ 7d( 7g.I 7Vyv7 5Hs Sڌpss Х-0ܴq<[֗i 7Hn'mp-02 [ 7;rd_W=S͂$77'P[npHJnkAQa!l9- RWtp߾ oiᖫ{ony7GaP[ n2 nDUJ n0ytJpCVo3Ҏn+'-I'iMBZ$y`ݤE[vc "grJ 76!I +7ZP[ nZ ]] nxZn6w7ېي_pCg4pC*mf6;Kt^!njbB0t[壼qì{!n4jYnBԎvɒqB0nvdŸaBsۿҠwqP 'Rܰ %R8(-PܼQچvgGq;E[!nw67uJ7-|CqgKq㤲HqR3R0nCq{ +W[nڝ67E[ҰņHْ9n*" ~6 7~ 7@I-HnsC$K;}:(o` +mCr;G ~8 ͓;ϖvUNx 3i6/ ^[;G|ϖƔ++M(gGr%V-u}̕e,AKrC.JZD6g s sX607VҥEOAJf.w1y0 mxcXnPrC,cXn)j ˭*XnI];رFrr}EmnPnS[QnlQn>lQnNx(t<|v$78f%I&ar͓Z ق-an@n%-NZR[AncTxrçv p{i/%Inv#A[Qn׭v5]Εώvrkݑ.qQv$qW[UrqÔI;f>[[Y %i6v 7r+-|qlK{v7o,bFoqŸN MMZĸ0nxab.$E;ͤQ%j+-r9gr+};Q}ސ;v ҆cРE۩~ d4 qq+U`;-7jqsgq#ӻ㸝-w>[8nY ǭWrq{)Sۀ67-RpR ώ░OHq;Ǔ=)n@L#)B^K W@Jv ۿvET.-S+ĭpUZ1]j77[S46{*-RsBqڝHq;6ͮQkqBqm@Q6/yN-ϖGgKq49qFDø$-` +s+ˈ&gqi_0nww3gq#EZ5q;,9{lN+ پ>NZ9n֙䆶s ru})h+ȍr+^6 7l R--ڛ Xm'l.iFs3ߖXÆvy ?n=; W|}YmЕݘ(xo޳1KOoLW|ۏ{lm8o?m&jŷTڣo;q|zoKc n ;"-갆Y nAi! fhQ"NΞI o7+Z niXnn5F!W8"-\XhV;@pP[nbrYv{/p +CڌpCy~ 7/-A[nÑ ܼ;0mvpK8hAgpK>y8`H-",|!p;7~ +;YWi3,v; LpsΞvʗfgu^pC[puzh3bg5+7o4^_gp;qIf{EMs,Z+:p&.f[Şq pC:UpKuNݜ=,hWנM7$l>7k}ߖ + M7nx5}7~n0}nX;[ Ӧy',Q(4px ۷3pR02֦To2em葐Qmc÷aj& 5D|A@1!i/掷`ƞ6g|̅N,>6&|[za3Oa[rƷ!hd>IPwx3ߖi EamoA%M 86{6ۺA}m.9j ^mSÔ@o0 }m8XS~6d9lsJڇ~sOķy8g8hZ > +]o9I`V3 1zƷ46_n=:ALm-ArtDmUb7ez;):la,@oC7@o&@odX6RToћ|}m@gFyf -:7OY&|ńomȮ ߆ͫocFk`]6١e҇ކ΍ +ކ5D~6meƷO!}m p,ŷw؈_~2K p؞,jf6Fߤn7)[|mlH<O j3iLoc[6pN̖/ ' W~n3}nw<)xLy͉ICgGnxH  }n8]7lq@ڇ͖pCG>O$;l"{P!p3 Q7}gxMCnȮ >nfSnK҇ k,M 7bp5 7Lo{ +s63MVZ 7!nd:@ܐ=?]6Aܼ1>7n ntN +Xf>ьwcyVѷzi ݕ m=L"ɳRt RۇV0P(n()707KyV}Oㆵzu &[_" J_a1W̟gjFƽM7pั+'f? g37xsV~ḡ=Kf;F/³r8G㽿g~- 51:EqCho%6aα?&t.jd<1 6hM-`{[ n.c'b:9,qC1gaV@aw 4|q#ݹ7O?)&}RG=+{" Yg$R֝#=a`QvL& pF393 ~]_v]$$iٵ$Wz):-χqs{ kfKnx)sV#k %tH=o)7^wn+vY r՞ &Pr + CG[- g–(x&:Mہ9jnB/>rnrw˹a sKPsʹ# `Yѯ:t*xn8sy䟀nm>Ik6sc7߃s5蹵qs;Fq ϭ2p@ztmDzLsz:.ܮڢ>v|sMbܴaxsMȹ[II97\َtDέO3N!L[8qn}ʹM2zҨ_87t"jAs`ܲ|xxMʹnrCǹ#_9s:)57\}jn8Ұjn< jn g?>憩 z- X4qn8V wܤR$fM~߶L=77t]Уc ֮D9-lka9Y974sCíO9mZ97|C3ٓhԙ1qnz+4+&e`6󜛴{73c vHi+IX@It˟;lnm2^t;a/ gM + vNtɄ)>n~|.:M`Y-n-t;j{EM*; +ytCI?MvqCݤSmGԭCB=rêtC?Бnh(yvrЩB'$r7W1t[`ItCc^E||p"ݤ6|L Vmjn_*?ti)YU7c" nR)ᢺI7goNuCcӪ|P7Ck6 ֆ8Mb:ӭ=PL7{P7ѷΣnRo]V:-kO u{P:8u+ȗ uQx?!%3mni#p +\B 4{fRc54N?VM3톾nefM7!ꫜI7~%4y/'i"7覙9M_6n5{nyM3ke<7fнsct|Ys gYܘPfsc^c9ύU{nuWynA3ٗlܘɊe8ύDŽscTȤ;эI6n^tcf'LNJ6nIHfE7f^tcfM`>Փnnr3;H7҇d3S6nlޑn%L3u'ݘGIHĬnJQa&4⩫I7ffэ=ItӬ;эYbW'i6΢3q5 i]tЍutfeYݘ! t Yݘ%T3렛fYJ6nlہn%A$@7zЍYo>n7̠FoWfЍtL2렛fU;э̎$FmvuM疍f3|>ftL7<:Yf ՑnI7deI7f6vd`1niw&M3Y2uM3 +FוQ7t=YG4+LfP7tnSϪdgխNu&uӨVuMKqf6iVzul0Iv;nkP7^)lB4:CfuӬ>;MLi:Ye>&M2,D7^~s0q3&4$Z8}3&Yelnʨ~VMc$mA7ɤݺf3&%:MT2!;pJi3&Yd3u0@7ڻoa'$sHw M2-Ól$C۲!ku87z2ϹI>ifh<=&#K&Y~3&j87dMT7&esFϹIƆ(uܐ멼%rnK&Y3j{nڍVBxM+9rneQL NiϹI&< 897ɊS sLMVܐzUsHlhpnߴ\M6;87d0d[Q!87JGDȹ$ܐ]-;Mob447dZjܐ¥٬IVb687dYqTI(ܐ%mlhnȎy冨]#Xb6,7dǩ_ԺXnzA958 ٍ%ϼa!k; Y[,7ds}~m]0OYcn.2i L}҈dGeO}ęXf Y9%7DI$lHn4<=!7D|rCvKL'g {Of YqiܐV6Cn'wϐ2`==k %䆬%ILiII1tp[|OfM@6YmqC{qC5xM2C&oI%̹!A>fԨ +3 33 z̰K87d(q F\gMv@٫dLi ji|H4anp7zh*̚2l)J57H97d8yC97d(M @fsy 87xsܐq-#pnȦsۆ9M\4ksq1Kme>{nγ87ι!KmDj@̹"~R?8,͊ئz - ̹eJq9-Kw.: rֲzܲ{q̶AG[22ynO .fs}UX9:8sn; 76ww#M$rK=snYfIqnۍɤuǹЎbC3=\ιe#Fh97~qnY6ᮞs˲txh9|I:ι$eߨιSnt9-d֑2z^z)kn:̚[{ z躦6>W4ޫ2f=7m=_PB4M:kn/*?FsX/ΨPq䃕㌪Θ[.}I*u-R5Gk3/.b~anYxiDbnPɝ17\t}[nr86YndANfs;wYƌɍ.17ܨ3Zܤ&Mw s",繉sf_f 2W1Mzy4kn@0: 6IYs+ wwvs~:V7inPY1knEH߳L >>kn`~\M~z rae& 7a;ͭȡQ_Fs|`팹!k6A/ATWK +憬 +ӗ_#:nmL8"߽:97p,:QA'c:BS9)87]pl{c\>L&3ۺ |&Ξ U]xyn".0繉߲!{(Y܄\ֺ}?' Yi@71{t?nE[AqPlb܊|õ@UFG ]!-n; 2:k61{nre\͢=aE|˙CE7٣}V8׉n؇K ݰ>f3Lmh!aڴ.iE7hWݽp!/V·e &}6nxҭqt' BI7GG }l ϓnRמgҭH[]- VĒ*ZE7ln/N̺ /2lM1ɝ(M,<$!k_%VGP[ yiznQͦpϛM7t P醓atC?ײaICoy& OkM7,=V(H7,aȨ͊=^w_[H7Y .ޣ醹0|4>x %bjˢn*agj+nSz3P6-ˌ&p71O%y5a|gM%rmBqRe!A7ޮ߁nXöy qO/H%͢U~ײ!inriNt $&k3dsC- z87FKU%r+F g %K\]v M` PqB<4qnl_Pߑ;57d8Cz}!б˷,td|!Θ6Mb׍lfsCQ*Vu b뱪17hǰ7 &lXPiqN9QҦ̖ZMv'}n)+?$71 &b>f]r;W; >F ^!QIxv@(&W㦼b#7h +uYwܐ=9nqCb^>3(+dr;oܛ({MjmqY(ƩWx ס⧏}ꢸD<͊q΍$f}뉊a{}Gp[_ʬqzOqZ.!I6+nhۮP-!qdPܰ:y m0m!7q`dp@$m`I${#̺qK_U7;nI~!8nhbz ˛x$y-`Z?Jڝ㖦vuqk4)G{ ︡IK7;n8<`a)%U cY7 'P| -t߀qC7ܘCP +f-cߋv\(I墬sPhGxړ7:nX^c͎[>VgqC Z:#9nXՌ7s8K7v㆖.;n VekA 㖱&1 &Sq sjO:Q&krlp8nh*"ퟝ7TZʡQ)Ȳḡ'6,pڕ;ǭ4d(9ǭ8 +ㆥqfsqГ;M1\7)poa측)\`87ʣcܤ"l)z,f19nk$K͎I#&gpܰF#;vcʅq=Ǹ8EwjNF&F޻N }}측¯?$7dirZ[*_) I!=,l@nX$z a|@Yrb,'hټHnh%^1<sAn + ]ݴuΐ;-VE!}7[ otY8 7?Mi3&Jp@nXP'縡=X g  u-;-ْXqR4.kqCҔYw.YE f;n1;78wq{1nҧگx GWtRmV =wwʫ5+nְ+nh9e67vgQܠuVPyw}ø%i6bǸ8(j ㆒LpfRiqF)RLkfp4e/θ,M+õ n8:q${4j83n25X3ceqP*qlv縡I:&ovܲl>HWQ g kmm",eZ5-aZ$GJxSsԀvO9n(o|_qjQ$pynϱq2,6m8nX]Beroٳei2}k0MڵDZiPQ4f-Ka; =A e?Ra}dhdz3)si98 7 jrá\|%g ΐ-^W:VN/; c)|ph7((I}.$"ֆ7}ModYVd>E649N&5{EJ--R7tI &qCk{tC8n7ʹs0tmIÎ{{ +ۂfNs`r}<ΜLl [aܴr3͍}V-r+пHɅl +N#PnuM; Jm(7 Yn*vw[-*bs{079lܬuGa07S6[6`FsuwsCffϷGcYYs%fQsS57vjnҠn57F7[r^n17-.YqsK6ί;Pc6XnvjkXr2ɂցv-d +"֯65Yn(r[ng7n%3[-bs@H0bn{;1~dsӳOuY!AMw6Vs3s]ˆisܮ&g4$ۋNV6 eFsYܴCjnv:va21[57< +c j6[?nn=F[榝sݒE Iabn%ܞS+pv# uiS~7 7[6hù)fQ[s깡hH.znpڶzno@!>ځn-2n@*覭NtzvanEnE% &5f*E =t-n@}Ov[&u I{Q<7ԝ&m3ǽ.ѧNscQXjnpn57+hnQsRpinmNs:lJ|xn_-/-XxnX=U,xnwќ 6 +9zxzـn: ma[݂nzn@79Y~t;hy#7oDFM-ەy݉niHpAtk3KLѭ/e^1;э7[>lnf^uioɂA6> 6VwnMskb?XnJZnvD,7=%jl^wt-ۛx|ca>,`rٔr>R9k[(7ll܊ &rr+ְ0Rnv(-rðu']v x#yJrmp &y\!"Bn7Or v%c8Rn2Sw[+!v_!aڨܲVK bzi'YqE҆־f# )Hn7[ԝ6h ɱw/)r2󒛴V"Jn8!7`!7+ȭ=A2Kn8aMr/sstKnHt%7T5[%c?5Knv A$Fɭ@u 2)r{"@nh+CnAc)9May gJn8\Z,/Hnfj¬_Z$7Z$Q^E7vhȋz4*3$#RАЍн 8 %$r䆅r;d+ân .(+vJceV 'HH[Qr˽{xOg$c(aߖy.ԍ6!4Ark6~ԍ>s֦w6CnICn4:$^!7\fB-cl܊KBnY1[.[V;Rqf'5:naqk79]7۫gfq=d]OWQn7qþG%le +k}-ۋvvd7twWpܬsk8ngqQ)mB3f_u%m"iwۊk( +)RJ]!oZrkӭr#VuM +w[$rjYInǁf-yPB Gn.Eɍm$[% [j뵟۫d䆥#~'A GvOkG%7[oU-${̍}N G9 ۨ^ K ^EV̭(ghnmt04ʹɉ &s"@b[+vUܴt縑s;ڝNEI[zVOȹ ۤ)]$_5Ǜ9hSև+coݽhhHŔ,Xnr;3oՃy-XقNs;0Ħ1~yvqX7u$9]Hnm|$v|*D Z܎Q܎r$_δJWlܤ-1[$F _KRڥ\9n׍v}G!Xn۴"ZnY5I,7,$}-ۡ 5ZnmferkWkL6[іE ~w[nY +:̀ ˭}9Rnc6Rn1-[= G!@Y)7471.Pn CQ) vҝ(5f/z[S{)3OrrÙoOCur+Vz)Ϳμ9ʭۑrK] Q~vvYe2 +l>vPnzy v~˭Y-7g&r;X\79r'R7[S(Xn!$frkIN ioM~lƀ$RnhRWPnvE(i PnY{wY aPc*P虭̢|M+ y1Hn'w@Frk7whcHnasܞ˶_"lME v<%BsXQ-lڳ[~/Fۣnd n% M9U )yXn';tԈ[>eV̭yFs~eڜ7oua-$GTZ- ymrCYn*@`nXcn$D̍cfsڥ5sGsn0[`6ǹoV33Ϲ܏t#Co +a;]W"j]7["w+v'v + +6oq=F깵f.w=RZ7[wF A^xMfX (a#-n3~02ZnFG(ToLms[ OKƳ{uP¨N3]A7tC6t{. +OƎ u]ks RܴnɂVmͷ`sw͖Y[M +5 0[1=Zmn1s#17YaXnn;ˍed-ٽ`g?r6:,2\GMnpܴCdvpΣ喭r!T >sˍ$\-7%)7r^ ʍIFmW"6+rH x%Jn$[M$7#u%7Y.ەylc`8n"stmqz#WSq;ƍhƚz &3b鯗lan,|GMD-[{=fୌp!,ȸ={?sܸ9nWJN ;-\e d+FtҊF#FEM  ▬|q&᪸Nn7ܓ F 6.M.[~BAq+$ mzvj)]1nk723 ƍÅqcVƭ/d[;mBƣ.IG.۬ƍ$\,.7%4\7b0n;MK5\7iM2:nhM":nr n¸A 1+ &]Q~Ƹ]W}gFǭ~ۣ.[}v~%mDne*st¸V˽c8eҧ;ƭSwmM3ƱǭE%@s.+8n/2\ +oBc8n:puܴ9eq#lau"㦭,\*,v[oԿqPAk踥1 [n|ȭ_ <@nlCnumܒ +CMZǶ@n7rc1CqqZ!S1 7Қ^r!}rwWȭ;ȭ묐Jy[ 7N4$ 51 fdr+3F`w8r ;#3[ jܬFrs-0Jnwgf->$ [`t+o 䖆!k@raʀ# sWȭ=q ] + /ID [ ] /Size 232 >> startxref -137786 +137488 %%EOF diff --git a/figs/flexor_ID16_compare_bushing_joint.png b/figs/flexor_ID16_compare_bushing_joint.png index a19737e..c15129e 100644 Binary files a/figs/flexor_ID16_compare_bushing_joint.png and b/figs/flexor_ID16_compare_bushing_joint.png differ diff --git a/index.html b/index.html index 957cc1d..c476c4b 100644 --- a/index.html +++ b/index.html @@ -3,7 +3,7 @@ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - + Finite Element Model with Simscape @@ -25,71 +25,97 @@

Finite Element Model with Simscape

Table of Contents

-
-

1 Amplified Piezoelectric Actuator - 3D elements

+
+

1 Amplified Piezoelectric Actuator - 3D elements

The idea here is to: @@ -103,15 +129,15 @@ The idea here is to:

-
-

1.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

+
+

1.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

We first extract the stiffness and mass matrices.

-
K = extractMatrix('piezo_amplified_3d_K.txt');
-M = extractMatrix('piezo_amplified_3d_M.txt');
+
K = extractMatrix('piezo_amplified_3d_K.txt');
+M = extractMatrix('piezo_amplified_3d_M.txt');
 
@@ -119,22 +145,22 @@ M = extractMatrix('piezo_amplified_3d_M.txt'); Then, we extract the coordinates of the interface nodes.

-
[int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('piezo_amplified_3d.txt');
+
[int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('piezo_amplified_3d.txt');
 
-
save('./mat/piezo_amplified_3d.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
+
save('./mat/piezo_amplified_3d.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
 
-
-

1.2 Output parameters

+
+

1.2 Output parameters

-
load('./mat/piezo_amplified_3d.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
+
load('./mat/piezo_amplified_3d.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
 
@@ -170,7 +196,7 @@ Then, we extract the coordinates of the interface nodes. -
+

amplified_piezo_interface_nodes.png

Figure 1: Interface Nodes for the Amplified Piezo Actuator

@@ -628,26 +654,26 @@ Using K, M and int_xyz, we can use the -
-

1.3 Piezoelectric parameters

+
+

1.3 Piezoelectric parameters

Parameters for the APA95ML:

-
d33 = 3e-10; % Strain constant [m/V]
-n = 80; % Number of layers per stack
-eT = 1.6e-7; % Permittivity under constant stress [F/m]
-sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
-ka = 235e6; % Stack stiffness [N/m]
-C = 5e-6; % Stack capactiance [F]
+
d33 = 3e-10; % Strain constant [m/V]
+n = 80; % Number of layers per stack
+eT = 1.6e-7; % Permittivity under constant stress [F/m]
+sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
+ka = 235e6; % Stack stiffness [N/m]
+C = 5e-6; % Stack capactiance [F]
 
-
na = 2; % Number of stacks used as actuator
-ns = 1; % Number of stacks used as force sensor
+
na = 2; % Number of stacks used as actuator
+ns = 1; % Number of stacks used as force sensor
 
@@ -657,7 +683,7 @@ We denote this constant by \(g_a\) and: \[ F_a = g_a V_a, \quad g_a = d_{33} n k_a \]

-
d33*(na*n)*(ka/(na + ns)) % [N/V]
+
d33*(na*n)*(ka/(na + ns)) % [N/V]
 
@@ -680,7 +706,7 @@ where:
  • \(\Delta h\): relative displacement [m]
  • -
    1e-6*d33/(eT*sD*ns*n) % [V/um]
    +
    1e-6*d33/(eT*sD*ns*n) % [V/um]
     
    @@ -690,8 +716,8 @@ where:
    -
    -

    1.4 Identification of the Dynamics

    +
    +

    1.4 Identification of the Dynamics

    The flexible element is imported using the Reduced Order Flexible Solid simscape block. @@ -718,15 +744,15 @@ We first set the mass to be zero. The dynamics is identified from the applied force to the measured relative displacement.

    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
     
    -Gh = -linearize(mdl, io);
    +Gh = -linearize(mdl, io);
     
    @@ -743,23 +769,23 @@ And the dynamics is identified.

    -The two identified dynamics are compared in Figure 2. +The two identified dynamics are compared in Figure 2.

    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
     
    -Ghm = -linearize(mdl, io);
    +Ghm = -linearize(mdl, io);
     
    -
    +

    dynamics_act_disp_comp_mass.png

    Figure 2: Dynamics from \(F\) to \(d\) without a payload and with a 10kg payload

    @@ -767,24 +793,24 @@ Ghm = -linearize(mdl, io);
    -
    -

    1.5 Comparison with Ansys

    +
    +

    1.5 Comparison with Ansys

    Let’s import the results from an Harmonic response analysis in Ansys.

    -
    Gresp0 = readtable('FEA_HarmResponse_00kg.txt');
    -Gresp10 = readtable('FEA_HarmResponse_10kg.txt');
    +
    Gresp0 = readtable('FEA_HarmResponse_00kg.txt');
    +Gresp10 = readtable('FEA_HarmResponse_10kg.txt');
     

    -The obtained dynamics from the Simscape model and from the Ansys analysis are compare in Figure 3. +The obtained dynamics from the Simscape model and from the Ansys analysis are compare in Figure 3.

    -
    +

    dynamics_force_disp_comp_anasys.png

    Figure 3: Comparison of the obtained dynamics using Simscape with the harmonic response analysis using Ansys

    @@ -792,15 +818,15 @@ The obtained dynamics from the Simscape model and from the Ansys analysis are co
    -
    -

    1.6 Force Sensor

    +
    +

    1.6 Force Sensor

    The dynamics is identified from internal forces applied between nodes 3 and 11 to the relative displacement of nodes 11 and 13.

    -The obtained dynamics is shown in Figure 4. +The obtained dynamics is shown in Figure 4.

    @@ -809,13 +835,13 @@ The obtained dynamics is shown in Figure 4.
    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Fa'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/Fs'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Fa'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Fs'], 1, 'openoutput'); io_i = io_i + 1;
     
     Gf = linearize(mdl, io);
     
    @@ -827,20 +853,20 @@ Gf = linearize(mdl, io);
    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Fa'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/Fs'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Fa'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Fs'], 1, 'openoutput'); io_i = io_i + 1;
     
     Gfm = linearize(mdl, io);
     
    -
    +

    dynamics_force_force_sensor_comp_mass.png

    Figure 4: Dynamics from \(F\) to \(F_m\) for \(m=0\) and \(m = 10kg\)

    @@ -848,8 +874,8 @@ Gfm = linearize(mdl, io);
    -
    -

    1.7 Distributed Actuator

    +
    +

    1.7 Distributed Actuator

    m = 0;
    @@ -860,13 +886,13 @@ Gfm = linearize(mdl, io);
     The dynamics is identified from the applied force to the measured relative displacement.
     

    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d_distri';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d_distri';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
     
     Gd = linearize(mdl, io);
     
    @@ -884,13 +910,13 @@ Then, we add 10Kg of mass: And the dynamics is identified.

    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d_distri';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d_distri';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
     
     Gdm = linearize(mdl, io);
     
    @@ -898,8 +924,8 @@ Gdm = linearize(mdl, io);
    -
    -

    1.8 Distributed Actuator and Force Sensor

    +
    +

    1.8 Distributed Actuator and Force Sensor

    m = 0;
    @@ -907,13 +933,13 @@ Gdm = linearize(mdl, io);
     
    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d_distri_act_sens';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d_distri_act_sens';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/Fm'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Fm'], 1, 'openoutput'); io_i = io_i + 1;
     
     Gfd = linearize(mdl, io);
     
    @@ -925,13 +951,13 @@ Gfd = linearize(mdl, io);
    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d_distri_act_sens';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d_distri_act_sens';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/Fm'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/F'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Fm'], 1, 'openoutput'); io_i = io_i + 1;
     
     Gfdm = linearize(mdl, io);
     
    @@ -939,8 +965,8 @@ Gfdm = linearize(mdl, io);
    -
    -

    1.9 Dynamics from input voltage to displacement

    +
    +

    1.9 Dynamics from input voltage to displacement

    m = 5;
    @@ -952,30 +978,30 @@ And the dynamics is identified.
     

    -The two identified dynamics are compared in Figure 2. +The two identified dynamics are compared in Figure 2.

    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/V'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/V'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1;
     
    -G = -linearize(mdl, io);
    +G = -linearize(mdl, io);
     
    -
    save('../test-bench-apa/mat/fem_model_5kg.mat', 'G')
    +
    save('../test-bench-apa/mat/fem_model_5kg.mat', 'G')
     
    -
    -

    1.10 Dynamics from input voltage to output voltage

    +
    +

    1.10 Dynamics from input voltage to output voltage

    m = 5;
    @@ -983,776 +1009,23 @@ G = -linearize(mdl, io);
     
    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_3d';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_3d';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Va'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Fa'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/dL'], 1, 'openoutput'); io_i = io_i + 1;
     
    -G = -linearize(mdl, io);
    -
    -
    -
    -
    -
    - -
    -

    2 APA300ML

    -
    - -
    -

    apa300ml_ansys.jpg -

    -

    Figure 5: Ansys FEM of the APA300ML

    -
    -
    - -
    -

    2.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

    -
    -

    -We first extract the stiffness and mass matrices. -

    -
    -
    K = extractMatrix('mat_K-48modes-7MDoF.matrix');
    -M = extractMatrix('mat_M-48modes-7MDoF.matrix');
    -
    -
    - -
    -
    K = extractMatrix('mat_K-80modes-7MDoF.matrix');
    -M = extractMatrix('mat_M-80modes-7MDoF.matrix');
    -
    -
    - -

    -Then, we extract the coordinates of the interface nodes. -

    -
    -
    [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('Nodes_MDoF_NLIST_MLIST.txt');
    -
    -
    - -
    -
    save('./mat/APA300ML.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +G = -linearize(mdl, io);
     
    -
    -

    2.2 Output parameters

    -
    -
    -
    load('./mat/APA300ML.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    -
    -
    - - - - --- -- - - - - - - - - - - - - - - - - - - - - - -
    Total number of Nodes7
    Number of interface Nodes7
    Number of Modes6
    Size of M and K matrices48
    - - - - --- -- -- -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 4: Coordinates of the interface nodes
    Node iNode Numberx [m]y [m]z [m]
    1.053917.00.0-0.0150.0
    2.053918.00.00.0150.0
    3.053919.0-0.03250.00.0
    4.053920.0-0.01250.00.0
    5.053921.0-0.00750.00.0
    6.053922.00.01250.00.0
    7.053923.00.03250.00.0
    - - - - --- -- -- -- -- -- -- -- -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 5: First 10x10 elements of the Stiffness matrix
    200000000.030000.050000.0200.0-100.0-300000.010000000.0-6000.020000.0-60.0
    30000.07000000.010000.030.0-30.0-70.07000.0-500000.03000.0-10.0
    50000.010000.030000000.0200000.0-200.0-100.020000.0-2000.02000000.0-9000.0
    200.030.0200000.01000.0-0.8-0.450.0-69000.0-30.0
    -100.0-30.0-200.0-0.810000.00.2-40.010.020.0-0.05
    -300000.0-70.0-100.0-0.40.2900.0-30000.010.0-40.00.1
    10000000.07000.020000.050.0-40.0-30000.0200000000.0-50000.030000.0-50.0
    -6000.0-500000.0-2000.0-610.010.0-50000.07000000.0-4000.08
    20000.03000.02000000.09000.020.0-40.030000.0-4000.030000000.0-200000.0
    -60.0-10.0-9000.0-30.0-0.050.1-50.08-200000.01000.0
    - - - - - --- -- -- -- -- -- -- -- -- -- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 6: First 10x10 elements of the Mass matrix
    0.017e-06-5e-06-6e-083e-09-5e-05-0.0005-2e-07-3e-061e-08
    7e-060.0094e-076e-09-4e-09-3e-08-2e-076e-055e-07-1e-09
    -5e-064e-070.012e-052e-083e-08-2e-06-1e-07-0.00029e-07
    -6e-086e-092e-053e-071e-103e-10-7e-092e-10-9e-073e-09
    3e-09-4e-092e-081e-101e-07-3e-126e-09-2e-10-3e-099e-12
    -5e-05-3e-083e-083e-10-3e-126e-071e-06-3e-092e-08-7e-11
    -0.0005-2e-07-2e-06-7e-096e-091e-060.01-8e-06-2e-069e-09
    -2e-076e-05-1e-072e-10-2e-10-3e-09-8e-060.0091e-072e-09
    -3e-065e-07-0.0002-9e-07-3e-092e-08-2e-061e-070.01-2e-05
    1e-08-1e-099e-073e-099e-12-7e-119e-092e-09-2e-053e-07
    - -

    -Using K, M and int_xyz, we can use the Reduced Order Flexible Solid simscape block. -

    -
    -
    - -
    -

    2.3 Piezoelectric parameters

    -
    -

    -Parameters for the APA300ML: -

    - -
    -
    d33 = 3e-10; % Strain constant [m/V]
    -n = 80; % Number of layers per stack
    -eT = 1.6e-8; % Permittivity under constant stress [F/m]
    -sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
    -ka = 235e6; % Stack stiffness [N/m]
    -C = 5e-6; % Stack capactiance [F]
    -
    -
    - -
    -
    na = 2; % Number of stacks used as actuator
    -ns = 1; % Number of stacks used as force sensor
    -
    -
    - -

    -The ratio of the developed force to applied voltage is \(d_{33} n k_a\) in [N/V]. -We denote this constant by \(g_a\) and: -\[ F_a = g_a V_a, \quad g_a = d_{33} n k_a \] -

    -
    -
    d33*(na*n)*(ka/(na + ns)) % [N/V]
    -
    -
    - -
    -0.42941
    -
    - - -

    -From (Fleming and Leang 2014) (page 123), the relation between relative displacement and generated voltage is: -\[ V_s = \frac{d_{33}}{\epsilon^T s^D n} \Delta h \] -where: -

    -
      -
    • \(V_s\): measured voltage [V]
    • -
    • \(d_{33}\): strain constant [m/V]
    • -
    • \(\epsilon^T\): permittivity under constant stress [F/m]
    • -
    • \(s^D\): elastic compliance under constant electric displacement [m^2/N]
    • -
    • \(n\): number of layers
    • -
    • \(\Delta h\): relative displacement [m]
    • -
    -
    -
    1e-6*d33/(eT*sD*ns*n) % [V/um]
    -
    -
    - -
    -5.8594
    -
    -
    -
    - -
    -

    2.4 Identification of the APA Characteristics

    -
    -
    -
    -

    2.4.1 Stiffness

    -
    -

    -The transfer function from vertical external force to the relative vertical displacement is identified. -

    - -

    -The inverse of its DC gain is the axial stiffness of the APA: -

    -
    -
    1e-6/dcgain(G) % [N/um]
    -
    -
    - -
    -1.8634
    -
    - - -

    -The specified stiffness in the datasheet is \(k = 1.8\, [N/\mu m]\). -

    -
    -
    - -
    -

    2.4.2 Resonance Frequency

    -
    -

    -The resonance frequency is specified to be between 650Hz and 840Hz. -This is also the case for the FEM model (Figure 6). -

    - - -
    -

    apa300ml_resonance.png -

    -

    Figure 6: First resonance is around 800Hz

    -
    -
    -
    - -
    -

    2.4.3 Amplification factor

    -
    -

    -The amplification factor is the ratio of the axial displacement to the stack displacement. -

    - -

    -The ratio of the two displacement is computed from the FEM model. -

    -
    -
    -dcgain(G(1,1))./dcgain(G(2,1))
    -
    -
    - -
    -4.936
    -
    - - -

    -If we take the ratio of the piezo height and length (approximation of the amplification factor): -

    -
    -
    75/15
    -
    -
    - -
    -5
    -
    -
    -
    - -
    -

    2.4.4 Stroke

    -
    -

    -Estimation of the actuator stroke: -\[ \Delta H = A n \Delta L \] -with: -

    -
      -
    • \(\Delta H\) Axial Stroke of the APA
    • -
    • \(A\) Amplification factor (5 for the APA300ML)
    • -
    • \(n\) Number of stack used
    • -
    • \(\Delta L\) Stroke of the stack (0.1% of its length)
    • -
    - -
    -
    1e6 * 5 * 3 * 20e-3 * 0.1e-2
    -
    -
    - -
    -300
    -
    - - -

    -This is exactly the specified stroke in the data-sheet. -

    -
    -
    -
    - -
    -

    2.5 Identification of the Dynamics

    -
    -

    -The flexible element is imported using the Reduced Order Flexible Solid simscape block. -

    - -

    -To model the actuator, an Internal Force block is added between the nodes 3 and 12. -A Relative Motion Sensor block is added between the nodes 1 and 2 to measure the displacement and the amplified piezo. -

    - -

    -One mass is fixed at one end of the piezo-electric stack actuator, the other end is fixed to the world frame. -

    - -

    -We first set the mass to be zero. -The dynamics is identified from the applied force to the measured relative displacement. -The same dynamics is identified for a payload mass of 10Kg. -

    -
    -
    m = 10;
    -
    -
    - - -
    -

    apa300ml_plant_dynamics.png -

    -

    Figure 7: Transfer function from forces applied by the stack to the axial displacement of the APA

    -
    -
    -
    - -
    -

    2.6 IFF

    -
    -

    -Let’s use 2 stacks as actuators and 1 stack as force sensor. -

    - -

    -The transfer function from actuator to sensors is identified and shown in Figure 8. -

    - -
    -

    apa300ml_iff_plant.png -

    -

    Figure 8: Transfer function from actuator to force sensor

    -
    - -

    -For root locus corresponding to IFF is shown in Figure 9. -

    - - -
    -

    apa300ml_iff_root_locus.png -

    -

    Figure 9: Root Locus for IFF

    -
    -
    -
    - -
    -

    2.7 DVF

    -
    -

    -Now the dynamics from the stack actuator to the relative motion sensor is identified and shown in Figure 10. -

    - -
    -

    apa300ml_dvf_plant.png -

    -

    Figure 10: Transfer function from stack actuator to relative motion sensor

    -
    - -

    -The root locus for DVF is shown in Figure 11. -

    - - -
    -

    apa300ml_dvf_root_locus.png -

    -

    Figure 11: Root Locus for Direct Velocity Feedback

    -
    -
    -
    - -
    -

    2.8 Identification for a simpler model

    -
    +
    +

    1.11 Identification for a simpler model

    +

    The goal in this section is to identify the parameters of a simple APA model from the FEM. This can be useful is a lower order model is to be used for simulations. @@ -1763,19 +1036,19 @@ The presented model is based on (Souleille et al.

    -The model represents the Amplified Piezo Actuator (APA) from Cedrat-Technologies (Figure 12). +The model represents the Amplified Piezo Actuator (APA) from Cedrat-Technologies (Figure 5). The parameters are shown in the table below.

    -
    +

    souleille18_model_piezo.png

    -

    Figure 12: Picture of an APA100M from Cedrat Technologies. Simplified model of a one DoF payload mounted on such isolator

    +

    Figure 5: Picture of an APA100M from Cedrat Technologies. Simplified model of a one DoF payload mounted on such isolator

    - +@@ -1830,8 +1103,8 @@ If we can fix \(k_a\), we can determine \(k_e\) and \(k_1\) with: From the identified dynamics, compute \(\alpha\) and \(\beta\)

    -
    alpha = abs(dcgain(G('y', 'Fa')));
    -beta  = abs(dcgain(G('y', 'Fd')));
    +
    alpha = abs(dcgain(G('y', 'Fa')));
    +beta  = abs(dcgain(G('y', 'Fd')));
     
    @@ -1839,7 +1112,7 @@ beta = abs(dcgain(G('y', 'Fd'))); \(k_a\) is estimated using the following formula:

    -
    ka = 0.8/abs(dcgain(G('y', 'Fa')));
    +
    ka = 0.9/abs(dcgain(G('y', 'Fa')));
     

    @@ -1850,8 +1123,8 @@ The factor can be adjusted to better match the curves. Then \(k_e\) and \(k_1\) are computed.

    -
    ke = ka/(beta/alpha - 1);
    -k1 = 1/beta - ke*ka/(ke + ka);
    +
    ke = ka/(beta/alpha - 1);
    +k1 = 1/beta - ke*ka/(ke + ka);
     
    @@ -1872,7 +1145,936 @@ k1 = 1/beta - ke*ka/(ke + ka); - + + + + + + + + + + + + + +
    Table 7: Parameters used for the model of the APA 100MTable 4: Parameters used for the model of the APA 100M
    ka42.954.9
    ke25.1
    k14.3
    + +

    +The damping in the system is adjusted to match the FEM model if necessary. +

    +
    +
    c1 = 1e2;
    +
    +
    + +

    +Analytical model of the simpler system: +

    +
    +
    Ga = 1/(m*s^2 + k1 + c1*s + ke*ka/(ke + ka)) * ...
    +     [ 1 ,              k1 + c1*s + ke*ka/(ke + ka)  , ke/(ke + ka) ;
    +      -ke*ka/(ke + ka), ke*ka/(ke + ka)*m*s^2 ,       -ke/(ke + ka)*(m*s^2 + c1*s + k1)];
    +
    +Ga.InputName = {'Fd', 'w', 'Fa'};
    +Ga.OutputName = {'y', 'Fs'};
    +
    +
    + +

    +Adjust the DC gain for the force sensor: +

    +
    +
    F_gain = dcgain(G('Fs', 'Fd'))/dcgain(Ga('Fs', 'Fd'));
    +
    +
    + + +
    +

    apa95ml_comp_simpler_model.png +

    +

    Figure 6: Comparison of the Dynamics between the FEM model and the simplified one

    +
    + +

    +We save the parameters of the simplified model for the APA95ML: +

    +
    +
    save('./mat/APA95ML_simplified_model.mat', 'ka', 'ke', 'k1', 'c1', 'F_gain');
    +
    +
    +
    +
    +
    + +
    +

    2 APA300ML

    +
    + +
    +

    apa300ml_ansys.jpg +

    +

    Figure 7: Ansys FEM of the APA300ML

    +
    +
    + +
    +

    2.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

    +
    +

    +We first extract the stiffness and mass matrices. +

    +
    +
    K = readmatrix('mat_K.CSV');
    +M = readmatrix('mat_M.CSV');
    +
    +
    + +

    +Then, we extract the coordinates of the interface nodes. +

    +
    +
    [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('out_nodes_3D.txt');
    +
    +
    + +
    +
    save('./mat/APA300ML.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    +
    +
    +
    + +
    +

    2.2 Output parameters

    +
    +
    +
    load('./mat/APA300ML.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + +
    Total number of Nodes7
    Number of interface Nodes7
    Number of Modes120
    Size of M and K matrices162
    + + + + +++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 5: Coordinates of the interface nodes
    Node iNode Numberx [m]y [m]z [m]
    1.0697783.00.00.0-0.015
    2.0697784.00.00.00.015
    3.0697785.0-0.03250.00.0
    4.0697786.0-0.01250.00.0
    5.0697787.0-0.00750.00.0
    6.0697788.00.01250.00.0
    7.0697789.00.03250.00.0
    + + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 6: First 10x10 elements of the Stiffness matrix
    200000000.030000.0-20000.0-70.0300000.040.010000000.010000.0-6000.030.0
    30000.030000000.02000.0-200000.060.0-10.04000.02000000.0-500.09000.0
    -20000.02000.07000000.0-10.0-30.010.06000.0900.0-500000.03
    -70.0-200000.0-10.01000.0-0.10.08-20.0-9000.03-30.0
    300000.060.0-30.0-0.1900.00.130000.020.0-10.00.06
    40.0-10.010.00.080.110000.020.09-50.03
    10000000.04000.06000.0-20.030000.020.0200000000.010000.09000.050.0
    10000.02000000.0900.0-9000.020.0910000.030000000.0-500.0200000.0
    -6000.0-500.0-500000.03-10.0-59000.0-500.07000000.0-2
    30.09000.03-30.00.060.0350.0200000.0-21000.0
    + + + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 7: First 10x10 elements of the Mass matrix
    0.01-2e-061e-066e-095e-05-5e-09-0.0005-7e-076e-07-3e-09
    -2e-060.018e-07-2e-05-8e-092e-09-9e-07-0.00021e-08-9e-07
    1e-068e-070.0095e-101e-09-1e-09-5e-073e-086e-051e-10
    6e-09-2e-055e-103e-072e-11-3e-123e-099e-07-4e-103e-09
    5e-05-8e-091e-092e-116e-07-4e-11-1e-06-2e-091e-09-8e-12
    -5e-092e-09-1e-09-3e-12-4e-111e-07-2e-09-1e-09-4e-10-5e-12
    -0.0005-9e-07-5e-073e-09-1e-06-2e-090.011e-07-3e-07-2e-08
    -7e-07-0.00023e-089e-07-2e-09-1e-091e-070.01-4e-072e-05
    6e-071e-086e-05-4e-101e-09-4e-10-3e-07-4e-070.009-2e-10
    -3e-09-9e-071e-103e-09-8e-12-5e-12-2e-082e-05-2e-103e-07
    + +

    +Using K, M and int_xyz, we can use the Reduced Order Flexible Solid simscape block. +

    +
    +
    + +
    +

    2.3 Piezoelectric parameters

    +
    +

    +Parameters for the APA300ML: +

    + +
    +
    d33 = 3e-10; % Strain constant [m/V]
    +n = 80; % Number of layers per stack
    +eT = 1.6e-8; % Permittivity under constant stress [F/m]
    +sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
    +ka = 235e6; % Stack stiffness [N/m]
    +C = 5e-6; % Stack capactiance [F]
    +
    +
    + +
    +
    na = 2; % Number of stacks used as actuator
    +ns = 1; % Number of stacks used as force sensor
    +
    +
    + +

    +The ratio of the developed force to applied voltage is \(d_{33} n k_a\) in [N/V]. +We denote this constant by \(g_a\) and: +\[ F_a = g_a V_a, \quad g_a = d_{33} n k_a \] +

    +
    +
    d33*(na*n)*(ka/(na + ns)) % [N/V]
    +
    +
    + +
    +3.76
    +
    + + +

    +From (Fleming and Leang 2014) (page 123), the relation between relative displacement and generated voltage is: +\[ V_s = \frac{d_{33}}{\epsilon^T s^D n} \Delta h \] +where: +

    +
      +
    • \(V_s\): measured voltage [V]
    • +
    • \(d_{33}\): strain constant [m/V]
    • +
    • \(\epsilon^T\): permittivity under constant stress [F/m]
    • +
    • \(s^D\): elastic compliance under constant electric displacement [m^2/N]
    • +
    • \(n\): number of layers
    • +
    • \(\Delta h\): relative displacement [m]
    • +
    +
    +
    1e-6*d33/(eT*sD*ns*n) % [V/um]
    +
    +
    + +
    +11.719
    +
    +
    +
    + +
    +

    2.4 Identification of the APA Characteristics

    +
    +
    +
    +

    2.4.1 Stiffness

    +
    +

    +The transfer function from vertical external force to the relative vertical displacement is identified. +

    + +

    +The inverse of its DC gain is the axial stiffness of the APA: +

    +
    +
    1e-6/dcgain(G) % [N/um]
    +
    +
    + +
    +1.753
    +
    + + +

    +The specified stiffness in the datasheet is \(k = 1.8\, [N/\mu m]\). +

    +
    +
    + +
    +

    2.4.2 Resonance Frequency

    +
    +

    +The resonance frequency is specified to be between 650Hz and 840Hz. +This is also the case for the FEM model (Figure 8). +

    + + +
    +

    apa300ml_resonance.png +

    +

    Figure 8: First resonance is around 800Hz

    +
    +
    +
    + +
    +

    2.4.3 Amplification factor

    +
    +

    +The amplification factor is the ratio of the axial displacement to the stack displacement. +

    + +

    +The ratio of the two displacement is computed from the FEM model. +

    +
    +
    abs(dcgain(G(1,1))./dcgain(G(2,1)))
    +
    +
    + +
    +5.0749
    +
    + + +

    +If we take the ratio of the piezo height and length (approximation of the amplification factor): +

    +
    +
    75/15
    +
    +
    + +
    +5
    +
    +
    +
    + +
    +

    2.4.4 Stroke

    +
    +

    +Estimation of the actuator stroke: +\[ \Delta H = A n \Delta L \] +with: +

    +
      +
    • \(\Delta H\) Axial Stroke of the APA
    • +
    • \(A\) Amplification factor (5 for the APA300ML)
    • +
    • \(n\) Number of stack used
    • +
    • \(\Delta L\) Stroke of the stack (0.1% of its length)
    • +
    + +
    +
    1e6 * 5 * 3 * 20e-3 * 0.1e-2
    +
    +
    + +
    +300
    +
    + + +

    +This is exactly the specified stroke in the data-sheet. +

    +
    +
    +
    + +
    +

    2.5 Identification of the Dynamics

    +
    +

    +The flexible element is imported using the Reduced Order Flexible Solid simscape block. +

    + +

    +To model the actuator, an Internal Force block is added between the nodes 3 and 12. +A Relative Motion Sensor block is added between the nodes 1 and 2 to measure the displacement and the amplified piezo. +

    + +

    +One mass is fixed at one end of the piezo-electric stack actuator, the other end is fixed to the world frame. +

    + +

    +We first set the mass to be zero. +The dynamics is identified from the applied force to the measured relative displacement. +The same dynamics is identified for a payload mass of 10Kg. +

    +
    +
    m = 10;
    +
    +
    + + +
    +

    apa300ml_plant_dynamics.png +

    +

    Figure 9: Transfer function from forces applied by the stack to the axial displacement of the APA

    +
    +
    +
    + +
    +

    2.6 IFF

    +
    +

    +Let’s use 2 stacks as actuators and 1 stack as force sensor. +

    + +

    +The transfer function from actuator to sensors is identified and shown in Figure 10. +

    + +
    +

    apa300ml_iff_plant.png +

    +

    Figure 10: Transfer function from actuator to force sensor

    +
    + +

    +For root locus corresponding to IFF is shown in Figure 11. +

    + +
    +

    apa300ml_iff_root_locus.png +

    +

    Figure 11: Root Locus for IFF

    +
    +
    +
    + +
    +

    2.7 DVF

    +
    +

    +Now the dynamics from the stack actuator to the relative motion sensor is identified and shown in Figure 12. +

    + +
    +

    apa300ml_dvf_plant.png +

    +

    Figure 12: Transfer function from stack actuator to relative motion sensor

    +
    + +

    +The root locus for DVF is shown in Figure 13. +

    + + +
    +

    apa300ml_dvf_root_locus.png +

    +

    Figure 13: Root Locus for Direct Velocity Feedback

    +
    +
    +
    + +
    +

    2.8 Identification for a simpler model

    +
    +

    +The goal in this section is to identify the parameters of a simple APA model from the FEM. +This can be useful is a lower order model is to be used for simulations. +

    + +

    +The presented model is based on (Souleille et al. 2018). +

    + +

    +The model represents the Amplified Piezo Actuator (APA) from Cedrat-Technologies (Figure 5). +The parameters are shown in the table below. +

    + + +
    +

    souleille18_model_piezo.png +

    +

    Figure 14: Picture of an APA100M from Cedrat Technologies. Simplified model of a one DoF payload mounted on such isolator

    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 8: Parameters used for the model of the APA 100M
     Meaning
    \(k_e\)Stiffness used to adjust the pole of the isolator
    \(k_1\)Stiffness of the metallic suspension when the stack is removed
    \(k_a\)Stiffness of the actuator
    \(c_1\)Added viscous damping
    + +

    +The goal is to determine \(k_e\), \(k_a\) and \(k_1\) so that the simplified model fits the FEM model. +

    + +

    +\[ \alpha = \frac{x_1}{f}(\omega=0) = \frac{\frac{k_e}{k_e + k_a}}{k_1 + \frac{k_e k_a}{k_e + k_a}} \] +\[ \beta = \frac{x_1}{F}(\omega=0) = \frac{1}{k_1 + \frac{k_e k_a}{k_e + k_a}} \] +

    + +

    +If we can fix \(k_a\), we can determine \(k_e\) and \(k_1\) with: +\[ k_e = \frac{k_a}{\frac{\beta}{\alpha} - 1} \] +\[ k_1 = \frac{1}{\beta} - \frac{k_e k_a}{k_e + k_a} \] +

    + +

    +From the identified dynamics, compute \(\alpha\) and \(\beta\) +

    +
    +
    alpha = abs(dcgain(G('y', 'Fa')));
    +beta  = abs(dcgain(G('y', 'Fd')));
    +
    +
    + +

    +\(k_a\) is estimated using the following formula: +

    +
    +
    ka = 0.8/abs(dcgain(G('y', 'Fa')));
    +
    +
    +

    +The factor can be adjusted to better match the curves. +

    + +

    +Then \(k_e\) and \(k_1\) are computed. +

    +
    +
    ke = ka/(beta/alpha - 1);
    +k1 = 1/beta - ke*ka/(ke + ka);
    +
    +
    + + + + +++ ++ + + + + + + + + + + @@ -1899,12 +2101,12 @@ The damping in the system is adjusted to match the FEM model if necessary. Analytical model of the simpler system:

    -
    Ga = 1/(m*s^2 + k1 + c1*s + ke*ka/(ke + ka)) * ...
    -     [ 1 ,              k1 + c1*s + ke*ka/(ke + ka)  , ke/(ke + ka) ;
    -      -ke*ka/(ke + ka), ke*ka/(ke + ka)*m*s^2 ,       -ke/(ke + ka)*(m*s^2 + c1*s + k1)];
    +
    Ga = 1/(m*s^2 + k1 + c1*s + ke*ka/(ke + ka)) * ...
    +     [ 1 ,              k1 + c1*s + ke*ka/(ke + ka)  , ke/(ke + ka) ;
    +      -ke*ka/(ke + ka), ke*ka/(ke + ka)*m*s^2 ,       -ke/(ke + ka)*(m*s^2 + c1*s + k1)];
     
    -Ga.InputName = {'Fd', 'w', 'Fa'};
    -Ga.OutputName = {'y', 'Fs'};
    +Ga.InputName = {'Fd', 'w', 'Fa'};
    +Ga.OutputName = {'y', 'Fs'};
     
    @@ -1912,44 +2114,277 @@ Ga.OutputName = {'y', 'Fs'}; Adjust the DC gain for the force sensor:

    -
    lambda = dcgain(Ga('Fs', 'Fd'))/dcgain(G('Fs', 'Fd'));
    +
    F_gain = dcgain(G('Fs', 'Fd'))/dcgain(Ga('Fs', 'Fd'));
     
    -
    +

    apa300ml_comp_simpler_model.png

    -

    Figure 13: Comparison of the Dynamics between the FEM model and the simplified one

    +

    Figure 15: Comparison of the Dynamics between the FEM model and the simplified one

    +
    + +

    +We now compare the FEM model with the simplified simscape model. +

    + +
    +

    apa300ml_comp_simpler_simscape.png +

    +

    Figure 16: Comparison of the Dynamics between the FEM model and the simplified simscape model

    +
    + +

    +We save the parameters of the simplified model for the APA300ML: +

    +
    +
    save('./mat/APA300ML_simplified_model.mat', 'ka', 'ke', 'k1', 'c1', 'F_gain');
    +
    +
    +
    + + +
    +

    2.9 Identification of the stiffness properties

    +
    +
    +
    +

    2.9.1 APA Alone

    +
    +
     Value [N/um]
    ka40.5
    + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CaracteristicsValue
    Kx [N/um]0.8
    Ky [N/um]1.6
    Kz [N/um]1.8
    Rx [Nm/rad]71.4
    Ry [Nm/rad]148.2
    Rz [Nm/rad]4241.8
    +
    +
    + +
    +

    2.9.2 See how the global stiffness is changing with the flexible joints

    +
    +
    +
    flex = load('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CaracteristicValue
    Kx [N/um]0.0
    Ky [N/um]0.0
    Kz [N/um]1.8
    Rx [Nm/rad]722.9
    Ry [Nm/rad]129.6
    Rz [Nm/rad]115.3
    + + +
    +
    freqs = logspace(-2, 5, 1000);
    +
    +figure;
    +hold on;
    +plot(freqs, abs(squeeze(freqresp(G(2,2), freqs, 'Hz'))), '-', 'DisplayName', 'APA');
    +plot(freqs, abs(squeeze(freqresp(Gf(2,2), freqs, 'Hz'))), '-', 'DisplayName', 'Flex');
    +hold off;
    +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]');
    +hold off;
    +legend('location', 'northeast');
    +
    +
    + +
    +
    freqs = logspace(-2, 5, 1000);
    +
    +figure;
    +hold on;
    +plot(freqs, abs(squeeze(freqresp(G(3,3), freqs, 'Hz'))), '-', 'DisplayName', 'APA');
    +plot(freqs, abs(squeeze(freqresp(Gf(3,3), freqs, 'Hz'))), '-', 'DisplayName', 'Flex');
    +hold off;
    +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]');
    +hold off;
    +legend('location', 'northeast');
    +
    -
    -

    3 Flexible Joint

    +
    +

    2.10 Effect of APA300ML in the flexibility of the leg

    +
    + + + +++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CaracteristicRigid APAFlexible APA
    Kx [N/um]0.0180.019
    Ky [N/um]0.0180.018
    Kz [N/um]60.02.647
    Rx [Nm/rad]16.705557.682
    Ry [Nm/rad]16.535185.939
    Rz [Nm/rad]118.0114.803
    +
    +
    +
    + +
    +

    3 Flexible Joint

    -The flexor in Figure 14 is studied with a FEM. +The studied flexor is shown in Figure 17. +

    + +

    +The stiffness and mass matrices representing the dynamics of the flexor are exported from a FEM. +It is then imported into Simscape. +

    + +

    +A simplified model of the flexor is then developped.

    -
    +

    flexor_id16_screenshot.png

    -

    Figure 14: Flexor studied

    +

    Figure 17: Flexor studied

    -
    -

    3.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

    +
    +

    3.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

    We first extract the stiffness and mass matrices.

    -
    K = extractMatrix('mat_K_6modes_2MDoF.matrix');
    -M = extractMatrix('mat_M_6modes_2MDoF.matrix');
    +
    K = extractMatrix('mat_K_6modes_2MDoF.matrix');
    +M = extractMatrix('mat_M_6modes_2MDoF.matrix');
     
    @@ -1957,22 +2392,22 @@ M = extractMatrix('mat_M_6modes_2MDoF.matrix'); Then, we extract the coordinates of the interface nodes.

    -
    [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('out_nodes_3D.txt');
    +
    [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('out_nodes_3D.txt');
     
    -
    save('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    save('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
     
    -
    -

    3.2 Output parameters

    +
    +

    3.2 Output parameters

    -
    load('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    load('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
     
    @@ -2008,7 +2443,7 @@ Then, we extract the coordinates of the interface nodes. - +@@ -2050,7 +2485,7 @@ Then, we extract the coordinates of the interface nodes.
    Table 8: Coordinates of the interface nodesTable 9: Coordinates of the interface nodes
    - +@@ -2208,7 +2643,7 @@ Then, we extract the coordinates of the interface nodes.
    Table 9: First 10x10 elements of the Stiffness matrixTable 10: First 10x10 elements of the Stiffness matrix
    - +@@ -2370,8 +2805,8 @@ Using K, M and int_xyz, we can use the -
    -

    3.3 Flexible Joint Characteristics

    +
    +

    3.3 Flexible Joint Characteristics

    The most important parameters of the flexible joint can be directly estimated from the stiffness matrix. @@ -2401,6 +2836,12 @@ The most important parameters of the flexible joint can be directly estimated fr

    + + + + + + @@ -2423,8 +2864,8 @@ The most important parameters of the flexible joint can be directly estimated fr -
    -

    3.4 Identification of the parameters using Simscape

    +
    +

    3.4 Identification of the parameters using Simscape

    The flexor is now imported into Simscape and its parameters are estimated using an identification. @@ -2462,49 +2903,49 @@ And we find the same parameters as the one estimated from the Stiffness matrix.

    - + - + - +
    Table 10: First 10x10 elements of the Mass matrixTable 11: First 10x10 elements of the Mass matrix
    60
    Shear Stiffness [N/um]110
    Bending Stiffness [Nm/rad] 33
    Bending Stiffness Rx [Nm/rad] 333334
    Bending Stiffness Ry [Nm/rad] 3333126
    Torsion Stiffness Rz [Nm/rad] 236236238
    -
    -

    3.5 Simpler Model

    +
    +

    3.5 Simpler Model

    -Let’s now model the flexible joint with a “perfect” Bushing joint as shown in Figure 15. +Let’s now model the flexible joint with a “perfect” Bushing joint as shown in Figure 18.

    -
    +

    flexible_joint_simscape.png

    -

    Figure 15: Bushing Joint used to model the flexible joint

    +

    Figure 18: Bushing Joint used to model the flexible joint

    The parameters of the Bushing joint (stiffnesses) are estimated from the Stiffness matrix that was computed from the FEM.

    -
    Kx = K(1,1); % [N/m]
    -Ky = K(2,2); % [N/m]
    -Kz = K(3,3); % [N/m]
    -Krx = K(4,4); % [Nm/rad]
    -Kry = K(5,5); % [Nm/rad]
    -Krz =  K(6,6); % [Nm/rad]
    +
    Kx = K(1,1); % [N/m]
    +Ky = K(2,2); % [N/m]
    +Kz = K(3,3); % [N/m]
    +Krx = K(4,4); % [Nm/rad]
    +Kry = K(5,5); % [Nm/rad]
    +Krz =  K(6,6); % [Nm/rad]
     
    @@ -2514,32 +2955,35 @@ The two obtained dynamics are compared in Figure

    -
    +

    flexor_ID16_compare_bushing_joint.png

    -

    Figure 16: Comparison of the Joint compliance between the FEM model and the simpler model

    +

    Figure 19: Comparison of the Joint compliance between the FEM model and the simpler model

    -
    -

    4 Integral Force Feedback with Amplified Piezo

    +
    +

    4 Optimal Flexible Joint

    -

    -In this section, we try to replicate the results obtained in (Souleille et al. 2018). + +

    +

    CS.jpg

    +

    Figure 20: Flexor studied

    +
    -
    -

    4.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

    +
    +

    4.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

    We first extract the stiffness and mass matrices.

    -
    K = extractMatrix('piezo_amplified_IFF_K.txt');
    -M = extractMatrix('piezo_amplified_IFF_M.txt');
    +
    K = readmatrix('mat_K.CSV');
    +M = readmatrix('mat_M.CSV');
     
    @@ -2547,17 +2991,605 @@ M = extractMatrix('piezo_amplified_IFF_M.txt'); Then, we extract the coordinates of the interface nodes.

    -
    [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('piezo_amplified_IFF.txt');
    +
    [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('out_nodes_3D.txt');
    +
    +
    + +
    +
    save('./mat/flexor_025.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
     
    -
    -

    4.2 IFF Plant

    +
    +

    4.2 Output parameters

    +
    +
    load('./mat/flexor_025.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + +
    Total number of Nodes2
    Number of interface Nodes2
    Number of Modes6
    Size of M and K matrices18
    + + + + +++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 12: Coordinates of the interface nodes
    Node iNode Numberx [m]y [m]z [m]
    1.0528875.00.00.00.0
    2.0528876.00.00.0-0.0
    + + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 13: First 10x10 elements of the Stiffness matrix
    12700000.0-18.5-26.80.00162-4.6364.0-12700000.018.326.70.00234
    -18.512700000.0-499.0-132.00.00414-0.49518.4-12700000.0499.0132.0
    -26.8-499.094000000.0-470.00.00771-0.85526.8498.0-94000000.0470.0
    0.00162-132.0-470.04.832.61e-070.000123-0.00163132.0470.0-4.83
    -4.630.004140.007712.61e-074.834.43e-054.63-0.00413-0.00772-4.3e-07
    64.0-0.495-0.8550.0001234.43e-05260.0-64.00.4950.855-0.000124
    -12700000.018.426.8-0.001634.63-64.012700000.0-18.2-26.7-0.00234
    18.3-12700000.0498.0132.0-0.004130.495-18.212700000.0-498.0-132.0
    26.7499.0-94000000.0470.0-0.007720.855-26.7-498.094000000.0-470.0
    0.00234132.0470.0-4.83-4.3e-07-0.000124-0.00234-132.0-470.04.83
    + + + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 14: First 10x10 elements of the Mass matrix
    0.0068e-09-2e-08-1e-103e-053e-080.003-3e-099e-092e-12
    8e-090.021e-07-3e-051e-116e-101e-080.003-5e-083e-09
    -2e-081e-070.01-6e-08-6e-11-8e-12-1e-071e-080.003-1e-08
    -1e-10-3e-05-6e-081e-067e-146e-131e-101e-06-1e-083e-10
    3e-051e-11-6e-117e-142e-071e-103e-08-7e-126e-11-6e-16
    3e-086e-10-8e-126e-131e-105e-071e-08-5e-10-1e-111e-13
    0.0031e-08-1e-071e-103e-081e-080.02-2e-081e-07-4e-12
    -3e-090.0031e-081e-06-7e-12-5e-10-2e-080.006-8e-083e-05
    9e-09-5e-080.003-1e-086e-11-1e-111e-07-8e-080.01-6e-08
    2e-123e-09-1e-083e-10-6e-161e-13-4e-123e-05-6e-082e-07
    +

    -The transfer function from the force actuator to the force sensor is identified and shown in Figure 17. +Using K, M and int_xyz, we can use the Reduced Order Flexible Solid simscape block. +

    +
    +
    + +
    +

    4.3 Flexible Joint Characteristics

    +
    +

    +The most important parameters of the flexible joint can be directly estimated from the stiffness matrix. +

    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CaracteristicValue
    Axial Stiffness [N/um]94.0
    Shear Stiffness [N/um]12.7
    Bending Stiffness [Nm/rad]4.8
    Bending Stiffness [Nm/rad]4.8
    Torsion Stiffness [Nm/rad]260.2
    +
    +
    + +
    +

    4.4 Identification of the parameters using Simscape

    +
    +

    +The flexor is now imported into Simscape and its parameters are estimated using an identification. +

    + +

    +The dynamics is identified from the applied force/torque to the measured displacement/rotation of the flexor. +And we find the same parameters as the one estimated from the Stiffness matrix. +

    + + + + +++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CaracteristicValueIdentification
    Axial Stiffness Dz [N/um]94.093.9
    Bending Stiffness Rx [Nm/rad]4.84.8
    Bending Stiffness Ry [Nm/rad]4.84.8
    Torsion Stiffness Rz [Nm/rad]260.2260.2
    +
    +
    + +
    +

    4.5 Simpler Model

    +
    +

    +Let’s now model the flexible joint with a “perfect” Bushing joint as shown in Figure 18. +

    + + +
    +

    flexible_joint_simscape.png +

    +

    Figure 21: Bushing Joint used to model the flexible joint

    +
    + +

    +The parameters of the Bushing joint (stiffnesses) are estimated from the Stiffness matrix that was computed from the FEM. +

    +
    +
    Kx = K(1,1); % [N/m]
    +Ky = K(2,2); % [N/m]
    +Kz = K(3,3); % [N/m]
    +Krx = K(4,4); % [Nm/rad]
    +Kry = K(5,5); % [Nm/rad]
    +Krz =  K(6,6); % [Nm/rad]
    +
    +
    + +

    +The dynamics from the applied force/torque to the measured displacement/rotation of the flexor is identified again for this simpler model. +The two obtained dynamics are compared in Figure +

    + + +
    +

    flexor_ID16_compare_bushing_joint.png +

    +

    Figure 22: Comparison of the Joint compliance between the FEM model and the simpler model

    +
    +
    +
    +
    + +
    +

    5 Integral Force Feedback with Amplified Piezo

    +
    +

    +In this section, we try to replicate the results obtained in (Souleille et al. 2018). +

    +
    + +
    +

    5.1 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

    +
    +

    +We first extract the stiffness and mass matrices. +

    +
    +
    K = extractMatrix('piezo_amplified_IFF_K.txt');
    +M = extractMatrix('piezo_amplified_IFF_M.txt');
    +
    +
    + +

    +Then, we extract the coordinates of the interface nodes. +

    +
    +
    [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('piezo_amplified_IFF.txt');
    +
    +
    +
    +
    + +
    +

    5.2 IFF Plant

    +
    +

    +The transfer function from the force actuator to the force sensor is identified and shown in Figure 23.

    @@ -2571,13 +3603,13 @@ The transfer function from the force actuator to the force sensor is identified
    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_IFF';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_IFF';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Kiff'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/G'],    1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Kiff'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/G'],    1, 'openoutput'); io_i = io_i + 1;
     
     Gf = linearize(mdl, io);
     
    @@ -2594,62 +3626,62 @@ Gf = linearize(mdl, io);
    -
    +

    piezo_amplified_iff_plant.png

    -

    Figure 17: IFF Plant

    +

    Figure 23: IFF Plant

    -
    -

    4.3 IFF controller

    -
    +
    +

    5.3 IFF controller

    +

    -The controller is defined and the loop gain is shown in Figure 18. +The controller is defined and the loop gain is shown in Figure 24.

    -
    Kiff = -1e12/s;
    +
    Kiff = -1e12/s;
     
    -
    +

    piezo_amplified_iff_loop_gain.png

    -

    Figure 18: IFF Loop Gain

    +

    Figure 24: IFF Loop Gain

    -
    -

    4.4 Closed Loop System

    -
    +
    +

    5.4 Closed Loop System

    +
    m = 10;
     
    -
    Kiff = -1e12/s;
    +
    Kiff = -1e12/s;
     
    -
    %% Name of the Simulink File
    -mdl = 'piezo_amplified_IFF';
    +
    %% Name of the Simulink File
    +mdl = 'piezo_amplified_IFF';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Dw'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/F'],  1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/Fd'], 1, 'openinput');  io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/d'],  1, 'openoutput'); io_i = io_i + 1;
    -io(io_i) = linio([mdl, '/G'],  1, 'output'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Dw'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/F'],  1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/Fd'], 1, 'openinput');  io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/d'],  1, 'openoutput'); io_i = io_i + 1;
    +io(io_i) = linio([mdl, '/G'],  1, 'output'); io_i = io_i + 1;
     
     Giff = linearize(mdl, io);
    -Giff.InputName  = {'w', 'f', 'F'};
    -Giff.OutputName  = {'x1', 'Fs'};
    +Giff.InputName  = {'w', 'f', 'F'};
    +Giff.OutputName  = {'x1', 'Fs'};
     
    @@ -2660,24 +3692,564 @@ Giff.OutputName = {'x1', 'Fs'};
    G = linearize(mdl, io);
    -G.InputName  = {'w', 'f', 'F'};
    -G.OutputName  = {'x1', 'Fs'};
    +G.InputName  = {'w', 'f', 'F'};
    +G.OutputName  = {'x1', 'Fs'};
     
    -
    +

    piezo_amplified_iff_comp.png

    -

    Figure 19: OL and CL transfer functions

    +

    Figure 25: OL and CL transfer functions

    -
    +

    souleille18_results.png

    -

    Figure 20: Results obtained in souleille18_concep_activ_mount_space_applic

    +

    Figure 26: Results obtained in souleille18_concep_activ_mount_space_applic

    +
    +
    +
    +
    + +
    +

    6 Complete Strut with Encoder

    +
    +
    +
    +

    6.1 Introduction

    +
    + +
    +

    points3.jpg +

    +

    Figure 27: Interface points

    +
    + +

    +Flexible joints have 0.25mm width. +

    +
    +
    + +
    +

    6.2 Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates

    +
    +

    +We first extract the stiffness and mass matrices. +

    +
    +
    K = readmatrix('mat_K.CSV');
    +M = readmatrix('mat_M.CSV');
    +
    +
    + +

    +Then, we extract the coordinates of the interface nodes. +

    +
    +
    [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('out_nodes_3D.txt');
    +
    +
    + +
    +
    save('./mat/strut_encoder.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    +
    +
    +
    + +
    +

    6.3 Output parameters

    +
    +
    +
    load('./mat/strut_encoder.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + +
    Total number of Nodes8
    Number of interface Nodes8
    Number of Modes6
    Size of M and K matrices54
    + + + + +++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 15: Coordinates of the interface nodes
    Node iNode Numberx [m]y [m]z [m]
    1.0504411.00.00.00.0405
    2.0504412.00.00.0-0.0405
    3.0504413.0-0.03250.00.0
    4.0504414.0-0.01250.00.0
    5.0504415.0-0.00750.00.0
    6.0504416.00.03250.00.0
    7.0504417.00.0040.0145-0.00175
    8.0504418.00.0040.0166-0.00175
    + + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 16: First 10x10 elements of the Stiffness matrix
    2000000.01000000.0-3000000.0-400.0300.0200.0-30.02000.0-10000.00.3
    1000000.04000000.0-8000000.0-900.0400.0-50.0-6000.010000.0-20000.03
    -3000000.0-8000000.020000000.02000.0-900.0200.0-10000.020000.0-300000.07
    -400.0-900.02000.05-0.10.051-36-0.0007
    300.0400.0-900.0-0.150.04-0.10.5-30.0001
    200.0-50.0200.00.050.04300.04-0.01-13e-05
    -30.0-6000.0-10000.01-0.143000000.0-1000000.0-2000000.0-300.0
    2000.010000.020000.0-30.5-0.01-1000000.06000000.07000000.01000.0
    -10000.0-20000.0-300000.06-3-1-2000000.07000000.020000000.02000.0
    0.337-0.00070.00013e-05-300.01000.02000.05
    + + + + + +++ ++ ++ ++ ++ ++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 17: First 10x10 elements of the Mass matrix
    0.04-0.0050.0072e-060.0001-5e-07-1e-05-9e-078e-05-5e-10
    -0.0050.030.02-0.00011e-06-3e-073e-05-0.00018e-05-3e-08
    0.0070.020.08-6e-06-5e-06-7e-074e-05-0.00010.0005-3e-08
    2e-06-0.0001-6e-062e-06-4e-102e-11-8e-093e-08-2e-086e-12
    0.00011e-06-5e-06-4e-103e-062e-10-3e-093e-09-7e-096e-13
    -5e-07-3e-07-7e-072e-112e-105e-07-2e-085e-09-5e-091e-12
    -1e-053e-054e-05-8e-09-3e-09-2e-080.040.0040.0031e-06
    -9e-07-0.0001-0.00013e-083e-095e-090.0040.02-0.020.0001
    8e-058e-050.0005-2e-08-7e-09-5e-090.003-0.020.08-5e-06
    -5e-10-3e-08-3e-086e-126e-131e-121e-060.0001-5e-062e-06
    + +

    +Using K, M and int_xyz, we can use the Reduced Order Flexible Solid simscape block. +

    +
    +
    + + + + +
    +

    6.4 Piezoelectric parameters

    +
    +

    +Parameters for the APA300ML: +

    + +
    +
    d33 = 3e-10; % Strain constant [m/V]
    +n = 80; % Number of layers per stack
    +eT = 1.6e-8; % Permittivity under constant stress [F/m]
    +sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N]
    +ka = 235e6; % Stack stiffness [N/m]
    +C = 5e-6; % Stack capactiance [F]
    +
    +
    + +
    +
    na = 2; % Number of stacks used as actuator
    +ns = 1; % Number of stacks used as force sensor
    +
    +
    +
    +
    + +
    +

    6.5 Identification of the Dynamics

    +
    +

    +The dynamics is identified from the applied force to the measured relative displacement. +The same dynamics is identified for a payload mass of 10Kg. +

    +
    +
    m = 10;
    +
    @@ -2695,7 +4267,7 @@ G.OutputName = {'x1', 'Fs'};

    Author: Dehaeze Thomas

    -

    Created: 2020-08-04 mar. 12:14

    +

    Created: 2020-10-29 jeu. 10:08

    diff --git a/index.org b/index.org index 6e9cab5..d914e23 100644 --- a/index.org +++ b/index.org @@ -6,8 +6,8 @@ #+EMAIL: dehaeze.thomas@gmail.com #+AUTHOR: Dehaeze Thomas -#+HTML_LINK_HOME: ./index.html -#+HTML_LINK_UP: ./index.html +#+HTML_LINK_HOME: ../index.html +#+HTML_LINK_UP: ../index.html #+HTML_HEAD: #+HTML_HEAD: @@ -180,7 +180,7 @@ Parameters for the APA95ML: The ratio of the developed force to applied voltage is $d_{33} n k_a$ in [N/V]. We denote this constant by $g_a$ and: \[ F_a = g_a V_a, \quad g_a = d_{33} n k_a \] -#+begin_src matlab :results replace value + #+begin_src matlab :results replace value d33*(na*n)*(ka/(na + ns)) % [N/V] #+end_src @@ -633,8 +633,8 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ %% Input/Output definition clear io; io_i = 1; - io(io_i) = linio([mdl, '/Va'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/Fa'], 1, 'openinput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/dL'], 1, 'openoutput'); io_i = io_i + 1; G = -linearize(mdl, io); #+end_src @@ -646,7 +646,9 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ ax1 = subplot(2,1,1); hold on; - plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(G(2,1), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(G(3,1), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(G(3,1) + G(3,2), freqs, 'Hz')))); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude'); set(gca, 'XTickLabel',[]); @@ -654,13 +656,174 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ ax2 = subplot(2,1,2); hold on; - plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G, freqs, 'Hz'))))); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G(2,1), freqs, 'Hz'))))); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G(3,1), freqs, 'Hz'))))); + plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G(3,1) + G(3,2), freqs, 'Hz'))))); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); yticks(-360:90:360); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); hold off; linkaxes([ax1,ax2],'x'); - xlim([10, 5e3]); + xlim([10, 1e4]); +#+end_src + +** Identification for a simpler model +The goal in this section is to identify the parameters of a simple APA model from the FEM. +This can be useful is a lower order model is to be used for simulations. + +The presented model is based on cite:souleille18_concep_activ_mount_space_applic. + +The model represents the Amplified Piezo Actuator (APA) from Cedrat-Technologies (Figure [[fig:souleille18_model_piezo]]). +The parameters are shown in the table below. + +#+name: fig:souleille18_model_piezo +#+caption: Picture of an APA100M from Cedrat Technologies. Simplified model of a one DoF payload mounted on such isolator +[[file:./figs/souleille18_model_piezo.png]] + +#+caption: Parameters used for the model of the APA 100M +| | Meaning | +|-------+----------------------------------------------------------------| +| $k_e$ | Stiffness used to adjust the pole of the isolator | +| $k_1$ | Stiffness of the metallic suspension when the stack is removed | +| $k_a$ | Stiffness of the actuator | +| $c_1$ | Added viscous damping | + +The goal is to determine $k_e$, $k_a$ and $k_1$ so that the simplified model fits the FEM model. + +\[ \alpha = \frac{x_1}{f}(\omega=0) = \frac{\frac{k_e}{k_e + k_a}}{k_1 + \frac{k_e k_a}{k_e + k_a}} \] +\[ \beta = \frac{x_1}{F}(\omega=0) = \frac{1}{k_1 + \frac{k_e k_a}{k_e + k_a}} \] + +If we can fix $k_a$, we can determine $k_e$ and $k_1$ with: +\[ k_e = \frac{k_a}{\frac{\beta}{\alpha} - 1} \] +\[ k_1 = \frac{1}{\beta} - \frac{k_e k_a}{k_e + k_a} \] + +#+begin_src matlab :exports none + m = 10; +#+end_src + +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'piezo_amplified_3d_identification'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Fd'], 1, 'openinput'); io_i = io_i + 1; % External Vertical Force [N] + io(io_i) = linio([mdl, '/w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m] + io(io_i) = linio([mdl, '/Fa'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force [N] + io(io_i) = linio([mdl, '/z'], 1, 'openoutput'); io_i = io_i + 1; % Vertical Displacement [m] + io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1; % Force Sensor [V] + + G = linearize(mdl, io); + + G.InputName = {'Fd', 'w', 'Fa'}; + G.OutputName = {'y', 'Fs'}; +#+end_src + +From the identified dynamics, compute $\alpha$ and $\beta$ +#+begin_src matlab + alpha = abs(dcgain(G('y', 'Fa'))); + beta = abs(dcgain(G('y', 'Fd'))); +#+end_src + +$k_a$ is estimated using the following formula: +#+begin_src matlab + ka = 0.9/abs(dcgain(G('y', 'Fa'))); +#+end_src +The factor can be adjusted to better match the curves. + +Then $k_e$ and $k_1$ are computed. +#+begin_src matlab + ke = ka/(beta/alpha - 1); + k1 = 1/beta - ke*ka/(ke + ka); +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) + data2orgtable(1e-6*[ka; ke; k1], {'ka', 'ke', 'k1'}, {'Value [N/um]'}, ' %.1f '); +#+end_src + +#+RESULTS: +| | Value [N/um] | +|----+--------------| +| ka | 54.9 | +| ke | 25.1 | +| k1 | 4.3 | + +The damping in the system is adjusted to match the FEM model if necessary. +#+begin_src matlab + c1 = 1e2; +#+end_src + +Analytical model of the simpler system: +#+begin_src matlab + Ga = 1/(m*s^2 + k1 + c1*s + ke*ka/(ke + ka)) * ... + [ 1 , k1 + c1*s + ke*ka/(ke + ka) , ke/(ke + ka) ; + -ke*ka/(ke + ka), ke*ka/(ke + ka)*m*s^2 , -ke/(ke + ka)*(m*s^2 + c1*s + k1)]; + + Ga.InputName = {'Fd', 'w', 'Fa'}; + Ga.OutputName = {'y', 'Fs'}; +#+end_src + +Adjust the DC gain for the force sensor: +#+begin_src matlab + F_gain = dcgain(G('Fs', 'Fd'))/dcgain(Ga('Fs', 'Fd')); +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 5, 1000); + + figure; + + ax1 = subplot(2, 2, 1); + title('$\displaystyle \frac{x_1}{f}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'y', 'Fa'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Ga('y', 'Fa'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]'); + + ax2 = subplot(2, 2, 2); + title('$\displaystyle \frac{x_1}{F}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'y', 'Fd'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Ga('y', 'Fd'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]'); + + ax3 = subplot(2, 2, 3); + title('$\displaystyle \frac{F_s}{f}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'Fs', 'Fa'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(F_gain*Ga('Fs', 'Fa'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]'); + + ax4 = subplot(2, 2, 4); + title('$\displaystyle \frac{F_s}{F}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'Fs', 'Fd'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(F_gain*Ga('Fs', 'Fd'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); + + linkaxes([ax1,ax2,ax3,ax4],'x'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/apa95ml_comp_simpler_model.pdf', 'width', 'full', 'height', 'full'); +#+end_src + +#+name: fig:apa95ml_comp_simpler_model +#+caption: Comparison of the Dynamics between the FEM model and the simplified one +#+RESULTS: +[[file:figs/apa95ml_comp_simpler_model.png]] + +We save the parameters of the simplified model for the APA95ML: +#+begin_src matlab + save('./mat/APA95ML_simplified_model.mat', 'ka', 'ke', 'k1', 'c1', 'F_gain'); #+end_src * APA300ML @@ -681,7 +844,7 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ #+begin_src matlab addpath('./src/'); - addpath('./data/APA300ML/'); + addpath('./data/APA300ML_new/'); #+end_src #+begin_src matlab :exports none @@ -691,18 +854,13 @@ The two identified dynamics are compared in Figure [[fig:dynamics_act_disp_comp_ ** Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates We first extract the stiffness and mass matrices. #+begin_src matlab - K = extractMatrix('mat_K-48modes-7MDoF.matrix'); - M = extractMatrix('mat_M-48modes-7MDoF.matrix'); -#+end_src - -#+begin_src matlab - K = extractMatrix('mat_K-80modes-7MDoF.matrix'); - M = extractMatrix('mat_M-80modes-7MDoF.matrix'); + K = readmatrix('mat_K.CSV'); + M = readmatrix('mat_M.CSV'); #+end_src Then, we extract the coordinates of the interface nodes. #+begin_src matlab - [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('Nodes_MDoF_NLIST_MLIST.txt'); + [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('out_nodes_3D.txt'); #+end_src #+begin_src matlab @@ -719,10 +877,10 @@ Then, we extract the coordinates of the interface nodes. #+end_src #+RESULTS: -| Total number of Nodes | 7 | -| Number of interface Nodes | 7 | -| Number of Modes | 6 | -| Size of M and K matrices | 48 | +| Total number of Nodes | 7 | +| Number of interface Nodes | 7 | +| Number of Modes | 120 | +| Size of M and K matrices | 162 | #+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) data2orgtable([[1:length(int_i)]', int_i, int_xyz], {}, {'Node i', 'Node Number', 'x [m]', 'y [m]', 'z [m]'}, ' %f '); @@ -730,15 +888,15 @@ Then, we extract the coordinates of the interface nodes. #+caption: Coordinates of the interface nodes #+RESULTS: -| Node i | Node Number | x [m] | y [m] | z [m] | -|--------+-------------+---------+--------+-------| -| 1.0 | 53917.0 | 0.0 | -0.015 | 0.0 | -| 2.0 | 53918.0 | 0.0 | 0.015 | 0.0 | -| 3.0 | 53919.0 | -0.0325 | 0.0 | 0.0 | -| 4.0 | 53920.0 | -0.0125 | 0.0 | 0.0 | -| 5.0 | 53921.0 | -0.0075 | 0.0 | 0.0 | -| 6.0 | 53922.0 | 0.0125 | 0.0 | 0.0 | -| 7.0 | 53923.0 | 0.0325 | 0.0 | 0.0 | +| Node i | Node Number | x [m] | y [m] | z [m] | +|--------+-------------+---------+-------+--------| +| 1.0 | 697783.0 | 0.0 | 0.0 | -0.015 | +| 2.0 | 697784.0 | 0.0 | 0.0 | 0.015 | +| 3.0 | 697785.0 | -0.0325 | 0.0 | 0.0 | +| 4.0 | 697786.0 | -0.0125 | 0.0 | 0.0 | +| 5.0 | 697787.0 | -0.0075 | 0.0 | 0.0 | +| 6.0 | 697788.0 | 0.0125 | 0.0 | 0.0 | +| 7.0 | 697789.0 | 0.0325 | 0.0 | 0.0 | #+begin_src matlab :exports results :results value table replace :tangle no data2orgtable(K(1:10, 1:10), {}, {}, ' %.1g '); @@ -746,16 +904,16 @@ Then, we extract the coordinates of the interface nodes. #+caption: First 10x10 elements of the Stiffness matrix #+RESULTS: -| 200000000.0 | 30000.0 | 50000.0 | 200.0 | -100.0 | -300000.0 | 10000000.0 | -6000.0 | 20000.0 | -60.0 | -| 30000.0 | 7000000.0 | 10000.0 | 30.0 | -30.0 | -70.0 | 7000.0 | -500000.0 | 3000.0 | -10.0 | -| 50000.0 | 10000.0 | 30000000.0 | 200000.0 | -200.0 | -100.0 | 20000.0 | -2000.0 | 2000000.0 | -9000.0 | -| 200.0 | 30.0 | 200000.0 | 1000.0 | -0.8 | -0.4 | 50.0 | -6 | 9000.0 | -30.0 | -| -100.0 | -30.0 | -200.0 | -0.8 | 10000.0 | 0.2 | -40.0 | 10.0 | 20.0 | -0.05 | -| -300000.0 | -70.0 | -100.0 | -0.4 | 0.2 | 900.0 | -30000.0 | 10.0 | -40.0 | 0.1 | -| 10000000.0 | 7000.0 | 20000.0 | 50.0 | -40.0 | -30000.0 | 200000000.0 | -50000.0 | 30000.0 | -50.0 | -| -6000.0 | -500000.0 | -2000.0 | -6 | 10.0 | 10.0 | -50000.0 | 7000000.0 | -4000.0 | 8 | -| 20000.0 | 3000.0 | 2000000.0 | 9000.0 | 20.0 | -40.0 | 30000.0 | -4000.0 | 30000000.0 | -200000.0 | -| -60.0 | -10.0 | -9000.0 | -30.0 | -0.05 | 0.1 | -50.0 | 8 | -200000.0 | 1000.0 | +| 200000000.0 | 30000.0 | -20000.0 | -70.0 | 300000.0 | 40.0 | 10000000.0 | 10000.0 | -6000.0 | 30.0 | +| 30000.0 | 30000000.0 | 2000.0 | -200000.0 | 60.0 | -10.0 | 4000.0 | 2000000.0 | -500.0 | 9000.0 | +| -20000.0 | 2000.0 | 7000000.0 | -10.0 | -30.0 | 10.0 | 6000.0 | 900.0 | -500000.0 | 3 | +| -70.0 | -200000.0 | -10.0 | 1000.0 | -0.1 | 0.08 | -20.0 | -9000.0 | 3 | -30.0 | +| 300000.0 | 60.0 | -30.0 | -0.1 | 900.0 | 0.1 | 30000.0 | 20.0 | -10.0 | 0.06 | +| 40.0 | -10.0 | 10.0 | 0.08 | 0.1 | 10000.0 | 20.0 | 9 | -5 | 0.03 | +| 10000000.0 | 4000.0 | 6000.0 | -20.0 | 30000.0 | 20.0 | 200000000.0 | 10000.0 | 9000.0 | 50.0 | +| 10000.0 | 2000000.0 | 900.0 | -9000.0 | 20.0 | 9 | 10000.0 | 30000000.0 | -500.0 | 200000.0 | +| -6000.0 | -500.0 | -500000.0 | 3 | -10.0 | -5 | 9000.0 | -500.0 | 7000000.0 | -2 | +| 30.0 | 9000.0 | 3 | -30.0 | 0.06 | 0.03 | 50.0 | 200000.0 | -2 | 1000.0 | #+begin_src matlab :exports results :results value table replace :tangle no @@ -764,16 +922,16 @@ Then, we extract the coordinates of the interface nodes. #+caption: First 10x10 elements of the Mass matrix #+RESULTS: -| 0.01 | 7e-06 | -5e-06 | -6e-08 | 3e-09 | -5e-05 | -0.0005 | -2e-07 | -3e-06 | 1e-08 | -| 7e-06 | 0.009 | 4e-07 | 6e-09 | -4e-09 | -3e-08 | -2e-07 | 6e-05 | 5e-07 | -1e-09 | -| -5e-06 | 4e-07 | 0.01 | 2e-05 | 2e-08 | 3e-08 | -2e-06 | -1e-07 | -0.0002 | 9e-07 | -| -6e-08 | 6e-09 | 2e-05 | 3e-07 | 1e-10 | 3e-10 | -7e-09 | 2e-10 | -9e-07 | 3e-09 | -| 3e-09 | -4e-09 | 2e-08 | 1e-10 | 1e-07 | -3e-12 | 6e-09 | -2e-10 | -3e-09 | 9e-12 | -| -5e-05 | -3e-08 | 3e-08 | 3e-10 | -3e-12 | 6e-07 | 1e-06 | -3e-09 | 2e-08 | -7e-11 | -| -0.0005 | -2e-07 | -2e-06 | -7e-09 | 6e-09 | 1e-06 | 0.01 | -8e-06 | -2e-06 | 9e-09 | -| -2e-07 | 6e-05 | -1e-07 | 2e-10 | -2e-10 | -3e-09 | -8e-06 | 0.009 | 1e-07 | 2e-09 | -| -3e-06 | 5e-07 | -0.0002 | -9e-07 | -3e-09 | 2e-08 | -2e-06 | 1e-07 | 0.01 | -2e-05 | -| 1e-08 | -1e-09 | 9e-07 | 3e-09 | 9e-12 | -7e-11 | 9e-09 | 2e-09 | -2e-05 | 3e-07 | +| 0.01 | -2e-06 | 1e-06 | 6e-09 | 5e-05 | -5e-09 | -0.0005 | -7e-07 | 6e-07 | -3e-09 | +| -2e-06 | 0.01 | 8e-07 | -2e-05 | -8e-09 | 2e-09 | -9e-07 | -0.0002 | 1e-08 | -9e-07 | +| 1e-06 | 8e-07 | 0.009 | 5e-10 | 1e-09 | -1e-09 | -5e-07 | 3e-08 | 6e-05 | 1e-10 | +| 6e-09 | -2e-05 | 5e-10 | 3e-07 | 2e-11 | -3e-12 | 3e-09 | 9e-07 | -4e-10 | 3e-09 | +| 5e-05 | -8e-09 | 1e-09 | 2e-11 | 6e-07 | -4e-11 | -1e-06 | -2e-09 | 1e-09 | -8e-12 | +| -5e-09 | 2e-09 | -1e-09 | -3e-12 | -4e-11 | 1e-07 | -2e-09 | -1e-09 | -4e-10 | -5e-12 | +| -0.0005 | -9e-07 | -5e-07 | 3e-09 | -1e-06 | -2e-09 | 0.01 | 1e-07 | -3e-07 | -2e-08 | +| -7e-07 | -0.0002 | 3e-08 | 9e-07 | -2e-09 | -1e-09 | 1e-07 | 0.01 | -4e-07 | 2e-05 | +| 6e-07 | 1e-08 | 6e-05 | -4e-10 | 1e-09 | -4e-10 | -3e-07 | -4e-07 | 0.009 | -2e-10 | +| -3e-09 | -9e-07 | 1e-10 | 3e-09 | -8e-12 | -5e-12 | -2e-08 | 2e-05 | -2e-10 | 3e-07 | Using =K=, =M= and =int_xyz=, we can use the =Reduced Order Flexible Solid= simscape block. @@ -802,7 +960,7 @@ We denote this constant by $g_a$ and: #+end_src #+RESULTS: -: 0.42941 +: 3.76 From cite:fleming14_desig_model_contr_nanop_system (page 123), the relation between relative displacement and generated voltage is: \[ V_s = \frac{d_{33}}{\epsilon^T s^D n} \Delta h \] @@ -818,7 +976,7 @@ where: #+end_src #+RESULTS: -: 5.8594 +: 11.719 ** Identification of the APA Characteristics *** Stiffness @@ -846,7 +1004,7 @@ The inverse of its DC gain is the axial stiffness of the APA: #+end_src #+RESULTS: -: 1.8634 +: 1.753 The specified stiffness in the datasheet is $k = 1.8\, [N/\mu m]$. @@ -885,7 +1043,7 @@ The amplification factor is the ratio of the axial displacement to the stack dis %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/z'], 1, 'openoutput'); io_i = io_i + 1; io(io_i) = linio([mdl, '/d'], 1, 'openoutput'); io_i = io_i + 1; G = linearize(mdl, io); @@ -893,11 +1051,11 @@ The amplification factor is the ratio of the axial displacement to the stack dis The ratio of the two displacement is computed from the FEM model. #+begin_src matlab :results replace value - -dcgain(G(1,1))./dcgain(G(2,1)) + abs(dcgain(G(1,1))./dcgain(G(2,1))) #+end_src #+RESULTS: -: 4.936 +: 5.0749 If we take the ratio of the piezo height and length (approximation of the amplification factor): #+begin_src matlab :results replace value @@ -947,7 +1105,7 @@ The dynamics is identified from the applied force to the measured relative displ %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/z'], 1, 'openoutput'); io_i = io_i + 1; Gh = -linearize(mdl, io); #+end_src @@ -964,7 +1122,7 @@ The same dynamics is identified for a payload mass of 10Kg. %% Input/Output definition clear io; io_i = 1; io(io_i) = linio([mdl, '/F'], 1, 'openinput'); io_i = io_i + 1; - io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/z'], 1, 'openoutput'); io_i = io_i + 1; Ghm = -linearize(mdl, io); #+end_src @@ -1063,7 +1221,6 @@ The transfer function from actuator to sensors is identified and shown in Figure [[file:figs/apa300ml_iff_plant.png]] For root locus corresponding to IFF is shown in Figure [[fig:apa300ml_iff_root_locus]]. - #+begin_src matlab :exports none figure; @@ -1400,7 +1557,7 @@ If we can fix $k_a$, we can determine $k_e$ and $k_1$ with: io(io_i) = linio([mdl, '/Fd'], 1, 'openinput'); io_i = io_i + 1; % External Vertical Force [N] io(io_i) = linio([mdl, '/w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m] io(io_i) = linio([mdl, '/Fa'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force [N] - io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1; % Vertical Displacement [m] + io(io_i) = linio([mdl, '/z'], 1, 'openoutput'); io_i = io_i + 1; % Vertical Displacement [m] io(io_i) = linio([mdl, '/Vs'], 1, 'openoutput'); io_i = io_i + 1; % Force Sensor [V] io(io_i) = linio([mdl, '/d'], 1, 'openoutput'); io_i = io_i + 1; % Stack Displacement [m] @@ -1435,7 +1592,7 @@ Then $k_e$ and $k_1$ are computed. #+RESULTS: | | Value [N/um] | |----+--------------| -| ka | 42.9 | +| ka | 40.5 | | ke | 1.5 | | k1 | 0.4 | @@ -1456,7 +1613,7 @@ Analytical model of the simpler system: Adjust the DC gain for the force sensor: #+begin_src matlab - lambda = dcgain(Ga('Fs', 'Fd'))/dcgain(G('Fs', 'Fd')); + F_gain = dcgain(G('Fs', 'Fd'))/dcgain(Ga('Fs', 'Fd')); #+end_src #+begin_src matlab :exports none @@ -1464,7 +1621,7 @@ Adjust the DC gain for the force sensor: figure; - ay = subplot(2, 3, 1); + ax1 = subplot(2, 3, 1); title('$\displaystyle \frac{x_1}{w}$') hold on; plot(freqs, abs(squeeze(freqresp(G( 'y', 'w'), freqs, 'Hz')))); @@ -1494,8 +1651,8 @@ Adjust the DC gain for the force sensor: ax4 = subplot(2, 3, 4); title('$\displaystyle \frac{F_s}{w}$') hold on; - plot(freqs, abs(squeeze(freqresp(lambda*G( 'Fs', 'w'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(Ga('Fs', 'w'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(G( 'Fs', 'w'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(F_gain*Ga('Fs', 'w'), freqs, 'Hz')))); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude [m/m]');xlabel('Frequency [Hz]'); @@ -1503,8 +1660,8 @@ Adjust the DC gain for the force sensor: ax5 = subplot(2, 3, 5); title('$\displaystyle \frac{F_s}{f}$') hold on; - plot(freqs, abs(squeeze(freqresp(lambda*G( 'Fs', 'Fa'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(Ga('Fs', 'Fa'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(G( 'Fs', 'Fa'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(F_gain*Ga('Fs', 'Fa'), freqs, 'Hz')))); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]'); @@ -1512,8 +1669,8 @@ Adjust the DC gain for the force sensor: ax6 = subplot(2, 3, 6); title('$\displaystyle \frac{F_s}{F}$') hold on; - plot(freqs, abs(squeeze(freqresp(lambda*G( 'Fs', 'Fd'), freqs, 'Hz')))); - plot(freqs, abs(squeeze(freqresp(Ga('Fs', 'Fd'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(G( 'Fs', 'Fd'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(F_gain*Ga('Fs', 'Fd'), freqs, 'Hz')))); hold off; set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); @@ -1530,10 +1687,239 @@ Adjust the DC gain for the force sensor: #+RESULTS: [[file:figs/apa300ml_comp_simpler_model.png]] +We now compare the FEM model with the simplified simscape model. +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'APA300ML_test_bench_simplified'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Fd'], 1, 'openinput'); io_i = io_i + 1; % External Vertical Force [N] + io(io_i) = linio([mdl, '/w'], 1, 'openinput'); io_i = io_i + 1; % Base Motion [m] + io(io_i) = linio([mdl, '/Fa'], 1, 'openinput'); io_i = io_i + 1; % Actuator Force [N] + io(io_i) = linio([mdl, '/y'], 1, 'openoutput'); io_i = io_i + 1; % Vertical Displacement [m] + io(io_i) = linio([mdl, '/Fs'], 1, 'openoutput'); io_i = io_i + 1; % Force Sensor [V] + + Gs = linearize(mdl, io); + + Gs.InputName = {'Fd', 'w', 'Fa'}; + Gs.OutputName = {'y', 'Fs'}; +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 5, 1000); + + figure; + + ax1 = subplot(2, 3, 1); + title('$\displaystyle \frac{x_1}{w}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'y', 'w'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gs('y', 'w'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/m]');xlabel('Frequency [Hz]'); + + ax2 = subplot(2, 3, 2); + title('$\displaystyle \frac{x_1}{f}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'y', 'Fa'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gs('y', 'Fa'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]'); + + ax3 = subplot(2, 3, 3); + title('$\displaystyle \frac{x_1}{F}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'y', 'Fd'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gs('y', 'Fd'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]'); + + ax4 = subplot(2, 3, 4); + title('$\displaystyle \frac{F_s}{w}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'Fs', 'w'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gs('Fs', 'w'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/m]');xlabel('Frequency [Hz]'); + + ax5 = subplot(2, 3, 5); + title('$\displaystyle \frac{F_s}{f}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'Fs', 'Fa'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gs('Fs', 'Fa'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]');xlabel('Frequency [Hz]'); + + ax6 = subplot(2, 3, 6); + title('$\displaystyle \frac{F_s}{F}$') + hold on; + plot(freqs, abs(squeeze(freqresp(G( 'Fs', 'Fd'), freqs, 'Hz')))); + plot(freqs, abs(squeeze(freqresp(Gs('Fs', 'Fd'), freqs, 'Hz')))); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude [m/N]'); xlabel('Frequency [Hz]'); + + linkaxes([ax1,ax2,ax3,ax4,ax5,ax6],'x'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/apa300ml_comp_simpler_simscape.pdf', 'width', 'full', 'height', 'full'); +#+end_src + +#+name: fig:apa300ml_comp_simpler_simscape +#+caption: Comparison of the Dynamics between the FEM model and the simplified simscape model +#+RESULTS: +[[file:figs/apa300ml_comp_simpler_simscape.png]] + +We save the parameters of the simplified model for the APA300ML: +#+begin_src matlab + save('./mat/APA300ML_simplified_model.mat', 'ka', 'ke', 'k1', 'c1', 'F_gain'); +#+end_src + +** Identification of the stiffness properties +*** APA Alone +#+begin_src matlab :exports none + m = 10; +#+end_src + +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'APA300ML_characterisation'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Fd'], 1, 'openinput'); io_i = io_i + 1; % External Vertical Force [N] + io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; % Displacement/Rotation [m] + + G = linearize(mdl, io); +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) + data2orgtable([1e-6./dcgain(G(1,1)), 1e-6./dcgain(G(2,2)), 1e-6./dcgain(G(3,3)), 1./dcgain(G(4,4)), 1./dcgain(G(5,5)), 1./dcgain(G(6,6))]', {'Kx [N/um]', 'Ky [N/um]', 'Kz [N/um]', 'Rx [Nm/rad]', 'Ry [Nm/rad]', 'Rz [Nm/rad]'}, {'*Caracteristics*', '*Value*'}, ' %.1f '); +#+end_src + +#+RESULTS: +| *Caracteristics* | *Value* | +|------------------+---------| +| Kx [N/um] | 0.8 | +| Ky [N/um] | 1.6 | +| Kz [N/um] | 1.8 | +| Rx [Nm/rad] | 71.4 | +| Ry [Nm/rad] | 148.2 | +| Rz [Nm/rad] | 4241.8 | + +*** See how the global stiffness is changing with the flexible joints +#+begin_src matlab + flex = load('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K'); +#+end_src + +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'APA300ML_characterisation_with_joints'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Fd'], 1, 'openinput'); io_i = io_i + 1; % External Vertical Force [N] + io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; % Displacement/Rotation [m] + + Gf = linearize(mdl, io); +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) + data2orgtable([1e-6./dcgain(Gf(1,1)), 1e-6./dcgain(Gf(2,2)), 1e-6./dcgain(Gf(3,3)), 1./dcgain(Gf(4,4)), 1./dcgain(Gf(5,5)), 1./dcgain(Gf(6,6))]', {'Kx [N/um]', 'Ky [N/um]', 'Kz [N/um]', 'Rx [Nm/rad]', 'Ry [Nm/rad]', 'Rz [Nm/rad]'}, {'*Caracteristic*', '*Value*'}, ' %.1f '); +#+end_src + +#+RESULTS: +| *Caracteristic* | *Value* | +|-----------------+---------| +| Kx [N/um] | 0.0 | +| Ky [N/um] | 0.0 | +| Kz [N/um] | 1.8 | +| Rx [Nm/rad] | 722.9 | +| Ry [Nm/rad] | 129.6 | +| Rz [Nm/rad] | 115.3 | + + +#+begin_src matlab + freqs = logspace(-2, 5, 1000); + + figure; + hold on; + plot(freqs, abs(squeeze(freqresp(G(2,2), freqs, 'Hz'))), '-', 'DisplayName', 'APA'); + plot(freqs, abs(squeeze(freqresp(Gf(2,2), freqs, 'Hz'))), '-', 'DisplayName', 'Flex'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]'); + hold off; + legend('location', 'northeast'); +#+end_src + +#+begin_src matlab + freqs = logspace(-2, 5, 1000); + + figure; + hold on; + plot(freqs, abs(squeeze(freqresp(G(3,3), freqs, 'Hz'))), '-', 'DisplayName', 'APA'); + plot(freqs, abs(squeeze(freqresp(Gf(3,3), freqs, 'Hz'))), '-', 'DisplayName', 'Flex'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]'); + hold off; + legend('location', 'northeast'); +#+end_src + +** Effect of APA300ML in the flexibility of the leg +#+begin_src matlab :exports none + m = 10; +#+end_src + +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'APA300ML_flex_joints'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Fd'], 1, 'openinput'); io_i = io_i + 1; % External Vertical Force [N] + io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; % Displacement/Rotation [m] +#+end_src + +#+begin_src matlab :exports none + G = linearize(mdl, io); +#+end_src + +#+begin_src matlab :exports none + Gf = linearize(mdl, io); +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) + data2orgtable([[1e-6./dcgain(G(1,1)), 1e-6./dcgain(G(2,2)), 1e-6./dcgain(G(3,3)), 1./dcgain(G(4,4)), 1./dcgain(G(5,5)), 1./dcgain(G(6,6))]', [1e-6./dcgain(Gf(1,1)), 1e-6./dcgain(Gf(2,2)), 1e-6./dcgain(Gf(3,3)), 1./dcgain(Gf(4,4)), 1./dcgain(Gf(5,5)), 1./dcgain(Gf(6,6))]'], {'Kx [N/um]', 'Ky [N/um]', 'Kz [N/um]', 'Rx [Nm/rad]', 'Ry [Nm/rad]', 'Rz [Nm/rad]'}, {'*Caracteristic*', '*Rigid APA*', '*Flexible APA*'}, ' %.3f '); +#+end_src + + +#+RESULTS: +| *Caracteristic* | *Rigid APA* | *Flexible APA* | +|-----------------+-------------+----------------| +| Kx [N/um] | 0.018 | 0.019 | +| Ky [N/um] | 0.018 | 0.018 | +| Kz [N/um] | 60.0 | 2.647 | +| Rx [Nm/rad] | 16.705 | 557.682 | +| Ry [Nm/rad] | 16.535 | 185.939 | +| Rz [Nm/rad] | 118.0 | 114.803 | + * Flexible Joint ** Introduction :ignore: +The studied flexor is shown in Figure [[fig:flexor_id16_screenshot]]. -The flexor in Figure [[fig:flexor_id16_screenshot]] is studied with a FEM. +The stiffness and mass matrices representing the dynamics of the flexor are exported from a FEM. +It is then imported into Simscape. + +A simplified model of the flexor is then developped. #+name: fig:flexor_id16_screenshot #+caption: Flexor studied @@ -1640,13 +2026,14 @@ Using =K=, =M= and =int_xyz=, we can use the =Reduced Order Flexible Solid= sims The most important parameters of the flexible joint can be directly estimated from the stiffness matrix. #+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) - data2orgtable([1e-6*K(3,3), K(4,4), K(5,5), K(6,6); 60, 15, 15, 20]', {'Axial Stiffness [N/um]', 'Bending Stiffness [Nm/rad]', 'Bending Stiffness [Nm/rad]', 'Torsion Stiffness [Nm/rad]'}, {'*Caracteristic*', '*Value*', '*Estimation by Francois*'}, ' %0.f '); + data2orgtable([1e-6*K(3,3), 1e-6*K(2,2), K(4,4), K(5,5), K(6,6); 60, 0, 15, 15, 20]', {'Axial Stiffness [N/um]', 'Shear Stiffness [N/um]', 'Bending Stiffness [Nm/rad]', 'Bending Stiffness [Nm/rad]', 'Torsion Stiffness [Nm/rad]'}, {'*Caracteristic*', '*Value*', '*Estimation by Francois*'}, ' %0.f '); #+end_src #+RESULTS: | *Caracteristic* | *Value* | *Estimation by Francois* | |----------------------------+---------+--------------------------| | Axial Stiffness [N/um] | 119 | 60 | +| Shear Stiffness [N/um] | 11 | 0 | | Bending Stiffness [Nm/rad] | 33 | 15 | | Bending Stiffness [Nm/rad] | 33 | 15 | | Torsion Stiffness [Nm/rad] | 236 | 20 | @@ -1681,9 +2068,9 @@ And we find the same parameters as the one estimated from the Stiffness matrix. | *Caracteristic* | *Value* | *Identification* | |-------------------------------+---------+------------------| | Axial Stiffness Dz [N/um] | 119 | 119 | -| Bending Stiffness Rx [Nm/rad] | 33 | 33 | -| Bending Stiffness Ry [Nm/rad] | 33 | 33 | -| Torsion Stiffness Rz [Nm/rad] | 236 | 236 | +| Bending Stiffness Rx [Nm/rad] | 33 | 34 | +| Bending Stiffness Ry [Nm/rad] | 33 | 126 | +| Torsion Stiffness Rz [Nm/rad] | 236 | 238 | ** Simpler Model @@ -1773,6 +2160,247 @@ The two obtained dynamics are compared in Figure #+RESULTS: [[file:figs/flexor_ID16_compare_bushing_joint.png]] +* Optimal Flexible Joint +** Introduction :ignore: +#+name: fig:optimal_flexor +#+caption: Flexor studied +[[file:data/flexor_circ_025/CS.jpg]] + +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes + <> +#+end_src + +#+begin_src matlab + addpath('./src/'); + addpath('./data/flexor_circ_025/'); +#+end_src + +#+begin_src matlab :exports none + open('flexor_025.slx'); +#+end_src + +** Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates +We first extract the stiffness and mass matrices. +#+begin_src matlab + K = readmatrix('mat_K.CSV'); + M = readmatrix('mat_M.CSV'); +#+end_src + +Then, we extract the coordinates of the interface nodes. +#+begin_src matlab + [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('out_nodes_3D.txt'); +#+end_src + +#+begin_src matlab + save('./mat/flexor_025.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K'); +#+end_src + +** Output parameters +#+begin_src matlab + load('./mat/flexor_025.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K'); +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no + data2orgtable([length(n_i); length(int_i); size(M,1) - 6*length(int_i); size(M,1)], {'Total number of Nodes', 'Number of interface Nodes', 'Number of Modes', 'Size of M and K matrices'}, {}, ' %.0f '); +#+end_src + +#+RESULTS: +| Total number of Nodes | 2 | +| Number of interface Nodes | 2 | +| Number of Modes | 6 | +| Size of M and K matrices | 18 | + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) + data2orgtable([[1:length(int_i)]', int_i, int_xyz], {}, {'Node i', 'Node Number', 'x [m]', 'y [m]', 'z [m]'}, ' %f '); +#+end_src + +#+caption: Coordinates of the interface nodes +#+RESULTS: +| Node i | Node Number | x [m] | y [m] | z [m] | +|--------+-------------+-------+-------+-------| +| 1.0 | 528875.0 | 0.0 | 0.0 | 0.0 | +| 2.0 | 528876.0 | 0.0 | 0.0 | -0.0 | + +#+begin_src matlab :exports results :results value table replace :tangle no + data2orgtable(K(1:10, 1:10), {}, {}, ' %.2e '); +#+end_src + +#+caption: First 10x10 elements of the Stiffness matrix +#+RESULTS: +| 12700000.0 | -18.5 | -26.8 | 0.00162 | -4.63 | 64.0 | -12700000.0 | 18.3 | 26.7 | 0.00234 | +| -18.5 | 12700000.0 | -499.0 | -132.0 | 0.00414 | -0.495 | 18.4 | -12700000.0 | 499.0 | 132.0 | +| -26.8 | -499.0 | 94000000.0 | -470.0 | 0.00771 | -0.855 | 26.8 | 498.0 | -94000000.0 | 470.0 | +| 0.00162 | -132.0 | -470.0 | 4.83 | 2.61e-07 | 0.000123 | -0.00163 | 132.0 | 470.0 | -4.83 | +| -4.63 | 0.00414 | 0.00771 | 2.61e-07 | 4.83 | 4.43e-05 | 4.63 | -0.00413 | -0.00772 | -4.3e-07 | +| 64.0 | -0.495 | -0.855 | 0.000123 | 4.43e-05 | 260.0 | -64.0 | 0.495 | 0.855 | -0.000124 | +| -12700000.0 | 18.4 | 26.8 | -0.00163 | 4.63 | -64.0 | 12700000.0 | -18.2 | -26.7 | -0.00234 | +| 18.3 | -12700000.0 | 498.0 | 132.0 | -0.00413 | 0.495 | -18.2 | 12700000.0 | -498.0 | -132.0 | +| 26.7 | 499.0 | -94000000.0 | 470.0 | -0.00772 | 0.855 | -26.7 | -498.0 | 94000000.0 | -470.0 | +| 0.00234 | 132.0 | 470.0 | -4.83 | -4.3e-07 | -0.000124 | -0.00234 | -132.0 | -470.0 | 4.83 | + + +#+begin_src matlab :exports results :results value table replace :tangle no + data2orgtable(M(1:10, 1:10), {}, {}, ' %.1g '); +#+end_src + +#+caption: First 10x10 elements of the Mass matrix +#+RESULTS: +| 0.006 | 8e-09 | -2e-08 | -1e-10 | 3e-05 | 3e-08 | 0.003 | -3e-09 | 9e-09 | 2e-12 | +| 8e-09 | 0.02 | 1e-07 | -3e-05 | 1e-11 | 6e-10 | 1e-08 | 0.003 | -5e-08 | 3e-09 | +| -2e-08 | 1e-07 | 0.01 | -6e-08 | -6e-11 | -8e-12 | -1e-07 | 1e-08 | 0.003 | -1e-08 | +| -1e-10 | -3e-05 | -6e-08 | 1e-06 | 7e-14 | 6e-13 | 1e-10 | 1e-06 | -1e-08 | 3e-10 | +| 3e-05 | 1e-11 | -6e-11 | 7e-14 | 2e-07 | 1e-10 | 3e-08 | -7e-12 | 6e-11 | -6e-16 | +| 3e-08 | 6e-10 | -8e-12 | 6e-13 | 1e-10 | 5e-07 | 1e-08 | -5e-10 | -1e-11 | 1e-13 | +| 0.003 | 1e-08 | -1e-07 | 1e-10 | 3e-08 | 1e-08 | 0.02 | -2e-08 | 1e-07 | -4e-12 | +| -3e-09 | 0.003 | 1e-08 | 1e-06 | -7e-12 | -5e-10 | -2e-08 | 0.006 | -8e-08 | 3e-05 | +| 9e-09 | -5e-08 | 0.003 | -1e-08 | 6e-11 | -1e-11 | 1e-07 | -8e-08 | 0.01 | -6e-08 | +| 2e-12 | 3e-09 | -1e-08 | 3e-10 | -6e-16 | 1e-13 | -4e-12 | 3e-05 | -6e-08 | 2e-07 | + +Using =K=, =M= and =int_xyz=, we can use the =Reduced Order Flexible Solid= simscape block. + +** Flexible Joint Characteristics +The most important parameters of the flexible joint can be directly estimated from the stiffness matrix. + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) + data2orgtable([1e-6*K(3,3), 1e-6*K(2,2), K(4,4), K(5,5), K(6,6)]', {'Axial Stiffness [N/um]', 'Shear Stiffness [N/um]', 'Bending Stiffness [Nm/rad]', 'Bending Stiffness [Nm/rad]', 'Torsion Stiffness [Nm/rad]'}, {'*Caracteristic*', '*Value*'}, ' %.1f '); +#+end_src + +#+RESULTS: +| *Caracteristic* | *Value* | +|----------------------------+---------| +| Axial Stiffness [N/um] | 94.0 | +| Shear Stiffness [N/um] | 12.7 | +| Bending Stiffness [Nm/rad] | 4.8 | +| Bending Stiffness [Nm/rad] | 4.8 | +| Torsion Stiffness [Nm/rad] | 260.2 | + +** Identification of the parameters using Simscape +The flexor is now imported into Simscape and its parameters are estimated using an identification. + +#+begin_src matlab :exports none + m = 1; +#+end_src + +The dynamics is identified from the applied force/torque to the measured displacement/rotation of the flexor. +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'flexor_025'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/T'], 1, 'openinput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; + + G = linearize(mdl, io); +#+end_src + +And we find the same parameters as the one estimated from the Stiffness matrix. + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) + data2orgtable([1e-6*K(3,3), K(4,4), K(5,5), K(6,6) ; 1e-6./dcgain(G(3,3)), 1./dcgain(G(4,4)), 1./dcgain(G(5,5)), 1./dcgain(G(6,6))]', {'Axial Stiffness Dz [N/um]', 'Bending Stiffness Rx [Nm/rad]', 'Bending Stiffness Ry [Nm/rad]', 'Torsion Stiffness Rz [Nm/rad]'}, {'*Caracteristic*', '*Value*', '*Identification*'}, ' %.1f '); +#+end_src + +#+RESULTS: +| *Caracteristic* | *Value* | *Identification* | +|-------------------------------+---------+------------------| +| Axial Stiffness Dz [N/um] | 94.0 | 93.9 | +| Bending Stiffness Rx [Nm/rad] | 4.8 | 4.8 | +| Bending Stiffness Ry [Nm/rad] | 4.8 | 4.8 | +| Torsion Stiffness Rz [Nm/rad] | 260.2 | 260.2 | + +** Simpler Model + +Let's now model the flexible joint with a "perfect" Bushing joint as shown in Figure [[fig:flexible_joint_simscape]]. + +#+name: fig:flexible_joint_simscape +#+caption: Bushing Joint used to model the flexible joint +[[file:figs/flexible_joint_simscape.png]] + +The parameters of the Bushing joint (stiffnesses) are estimated from the Stiffness matrix that was computed from the FEM. +#+begin_src matlab + Kx = K(1,1); % [N/m] + Ky = K(2,2); % [N/m] + Kz = K(3,3); % [N/m] + Krx = K(4,4); % [Nm/rad] + Kry = K(5,5); % [Nm/rad] + Krz = K(6,6); % [Nm/rad] +#+end_src + +The dynamics from the applied force/torque to the measured displacement/rotation of the flexor is identified again for this simpler model. +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'flexor_025_simplified'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/T'], 1, 'openinput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/D'], 1, 'openoutput'); io_i = io_i + 1; + + Gs = linearize(mdl, io); +#+end_src + +The two obtained dynamics are compared in Figure + +#+begin_src matlab :exports none + freqs = logspace(0, 5, 1000); + + figure; + + ax1 = subplot(1,2,1); + hold on; + set(gca,'ColorOrderIndex',1) + plot(freqs, abs(squeeze(freqresp(G(1,1), freqs, 'Hz'))), '-', 'DisplayName', '$D_x/F_x$'); + set(gca,'ColorOrderIndex',1) + plot(freqs, abs(squeeze(freqresp(Gs(1,1), freqs, 'Hz'))), '--', 'HandleVisibility', 'off'); + set(gca,'ColorOrderIndex',2) + plot(freqs, abs(squeeze(freqresp(G(2,2), freqs, 'Hz'))), '-', 'DisplayName', '$D_y/F_y$'); + set(gca,'ColorOrderIndex',2) + plot(freqs, abs(squeeze(freqresp(Gs(2,2), freqs, 'Hz'))), '--', 'HandleVisibility', 'off'); + set(gca,'ColorOrderIndex',3) + plot(freqs, abs(squeeze(freqresp(G(3,3), freqs, 'Hz'))), '-', 'DisplayName', '$D_z/F_z$'); + set(gca,'ColorOrderIndex',3) + plot(freqs, abs(squeeze(freqresp(Gs(3,3), freqs, 'Hz'))), '--', 'HandleVisibility', 'off'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); ylabel('Amplitude [m/N]'); + hold off; + legend('location', 'northeast'); + + ax2 = subplot(1,2,2); + hold on; + set(gca,'ColorOrderIndex',1) + plot(freqs, abs(squeeze(freqresp(G(4,4), freqs, 'Hz'))), '-', 'DisplayName', '$R_x/M_x$'); + set(gca,'ColorOrderIndex',1) + plot(freqs, abs(squeeze(freqresp(Gs(4,4), freqs, 'Hz'))), '--', 'HandleVisibility', 'off'); + set(gca,'ColorOrderIndex',2) + plot(freqs, abs(squeeze(freqresp(G(5,5), freqs, 'Hz'))), '-', 'DisplayName', '$R_y/M_y$'); + set(gca,'ColorOrderIndex',2) + plot(freqs, abs(squeeze(freqresp(Gs(5,5), freqs, 'Hz'))), '--', 'HandleVisibility', 'off'); + set(gca,'ColorOrderIndex',3) + plot(freqs, abs(squeeze(freqresp(G(6,6), freqs, 'Hz'))), '-', 'DisplayName', '$R_z/M_z$'); + set(gca,'ColorOrderIndex',3) + plot(freqs, abs(squeeze(freqresp(Gs(6,6), freqs, 'Hz'))), '--', 'HandleVisibility', 'off'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + xlabel('Frequency [Hz]'); ylabel('Amplitude [rad/Nm]'); + hold off; + legend('location', 'northeast'); +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace + exportFig('figs/flexor_ID16_compare_bushing_joint.pdf', 'width', 'full', 'height', 'tall'); +#+end_src + +#+name: fig:flexor_ID16_compare_bushing_joint +#+caption: Comparison of the Joint compliance between the FEM model and the simpler model +#+RESULTS: +[[file:figs/flexor_ID16_compare_bushing_joint.png]] + * Integral Force Feedback with Amplified Piezo ** Introduction :ignore: In this section, we try to replicate the results obtained in cite:souleille18_concep_activ_mount_space_applic. @@ -2034,6 +2662,201 @@ The controller is defined and the loop gain is shown in Figure [[fig:piezo_ampli #+caption: Results obtained in cite:souleille18_concep_activ_mount_space_applic [[file:figs/souleille18_results.png]] +* Complete Strut with Encoder +** Introduction + +#+name: fig:strut_encoder_points3 +#+caption: Interface points +[[file:data/strut_encoder/points3.jpg]] + +Flexible joints have 0.25mm width. + +** Matlab Init :noexport:ignore: +#+begin_src matlab :tangle no :exports none :results silent :noweb yes :var current_dir=(file-name-directory buffer-file-name) + <> +#+end_src + +#+begin_src matlab :exports none :results silent :noweb yes + <> +#+end_src + +#+begin_src matlab + addpath('./src/'); + addpath('./data/strut_encoder/'); +#+end_src + +#+begin_src matlab + open('strut_encoder.slx'); +#+end_src + +** Import Mass Matrix, Stiffness Matrix, and Interface Nodes Coordinates +We first extract the stiffness and mass matrices. +#+begin_src matlab + K = readmatrix('mat_K.CSV'); + M = readmatrix('mat_M.CSV'); +#+end_src + +Then, we extract the coordinates of the interface nodes. +#+begin_src matlab + [int_xyz, int_i, n_xyz, n_i, nodes] = extractNodes('out_nodes_3D.txt'); +#+end_src + +#+begin_src matlab + save('./mat/strut_encoder.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K'); +#+end_src + +** Output parameters +#+begin_src matlab + load('./mat/strut_encoder.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K'); +#+end_src + +#+begin_src matlab :exports results :results value table replace :tangle no + data2orgtable([length(n_i); length(int_i); size(M,1) - 6*length(int_i); size(M,1)], {'Total number of Nodes', 'Number of interface Nodes', 'Number of Modes', 'Size of M and K matrices'}, {}, ' %.0f '); +#+end_src + +#+RESULTS: +| Total number of Nodes | 8 | +| Number of interface Nodes | 8 | +| Number of Modes | 6 | +| Size of M and K matrices | 54 | + +#+begin_src matlab :exports results :results value table replace :tangle no :post addhdr(*this*) + data2orgtable([[1:length(int_i)]', int_i, int_xyz], {}, {'Node i', 'Node Number', 'x [m]', 'y [m]', 'z [m]'}, ' %f '); +#+end_src + +#+caption: Coordinates of the interface nodes +#+RESULTS: +| Node i | Node Number | x [m] | y [m] | z [m] | +|--------+-------------+---------+--------+----------| +| 1.0 | 504411.0 | 0.0 | 0.0 | 0.0405 | +| 2.0 | 504412.0 | 0.0 | 0.0 | -0.0405 | +| 3.0 | 504413.0 | -0.0325 | 0.0 | 0.0 | +| 4.0 | 504414.0 | -0.0125 | 0.0 | 0.0 | +| 5.0 | 504415.0 | -0.0075 | 0.0 | 0.0 | +| 6.0 | 504416.0 | 0.0325 | 0.0 | 0.0 | +| 7.0 | 504417.0 | 0.004 | 0.0145 | -0.00175 | +| 8.0 | 504418.0 | 0.004 | 0.0166 | -0.00175 | + +#+begin_src matlab :exports results :results value table replace :tangle no + data2orgtable(K(1:10, 1:10), {}, {}, ' %.1g '); +#+end_src + +#+caption: First 10x10 elements of the Stiffness matrix +#+RESULTS: +| 2000000.0 | 1000000.0 | -3000000.0 | -400.0 | 300.0 | 200.0 | -30.0 | 2000.0 | -10000.0 | 0.3 | +| 1000000.0 | 4000000.0 | -8000000.0 | -900.0 | 400.0 | -50.0 | -6000.0 | 10000.0 | -20000.0 | 3 | +| -3000000.0 | -8000000.0 | 20000000.0 | 2000.0 | -900.0 | 200.0 | -10000.0 | 20000.0 | -300000.0 | 7 | +| -400.0 | -900.0 | 2000.0 | 5 | -0.1 | 0.05 | 1 | -3 | 6 | -0.0007 | +| 300.0 | 400.0 | -900.0 | -0.1 | 5 | 0.04 | -0.1 | 0.5 | -3 | 0.0001 | +| 200.0 | -50.0 | 200.0 | 0.05 | 0.04 | 300.0 | 4 | -0.01 | -1 | 3e-05 | +| -30.0 | -6000.0 | -10000.0 | 1 | -0.1 | 4 | 3000000.0 | -1000000.0 | -2000000.0 | -300.0 | +| 2000.0 | 10000.0 | 20000.0 | -3 | 0.5 | -0.01 | -1000000.0 | 6000000.0 | 7000000.0 | 1000.0 | +| -10000.0 | -20000.0 | -300000.0 | 6 | -3 | -1 | -2000000.0 | 7000000.0 | 20000000.0 | 2000.0 | +| 0.3 | 3 | 7 | -0.0007 | 0.0001 | 3e-05 | -300.0 | 1000.0 | 2000.0 | 5 | + + +#+begin_src matlab :exports results :results value table replace :tangle no + data2orgtable(M(1:10, 1:10), {}, {}, ' %.1g '); +#+end_src + +#+caption: First 10x10 elements of the Mass matrix +#+RESULTS: +| 0.04 | -0.005 | 0.007 | 2e-06 | 0.0001 | -5e-07 | -1e-05 | -9e-07 | 8e-05 | -5e-10 | +| -0.005 | 0.03 | 0.02 | -0.0001 | 1e-06 | -3e-07 | 3e-05 | -0.0001 | 8e-05 | -3e-08 | +| 0.007 | 0.02 | 0.08 | -6e-06 | -5e-06 | -7e-07 | 4e-05 | -0.0001 | 0.0005 | -3e-08 | +| 2e-06 | -0.0001 | -6e-06 | 2e-06 | -4e-10 | 2e-11 | -8e-09 | 3e-08 | -2e-08 | 6e-12 | +| 0.0001 | 1e-06 | -5e-06 | -4e-10 | 3e-06 | 2e-10 | -3e-09 | 3e-09 | -7e-09 | 6e-13 | +| -5e-07 | -3e-07 | -7e-07 | 2e-11 | 2e-10 | 5e-07 | -2e-08 | 5e-09 | -5e-09 | 1e-12 | +| -1e-05 | 3e-05 | 4e-05 | -8e-09 | -3e-09 | -2e-08 | 0.04 | 0.004 | 0.003 | 1e-06 | +| -9e-07 | -0.0001 | -0.0001 | 3e-08 | 3e-09 | 5e-09 | 0.004 | 0.02 | -0.02 | 0.0001 | +| 8e-05 | 8e-05 | 0.0005 | -2e-08 | -7e-09 | -5e-09 | 0.003 | -0.02 | 0.08 | -5e-06 | +| -5e-10 | -3e-08 | -3e-08 | 6e-12 | 6e-13 | 1e-12 | 1e-06 | 0.0001 | -5e-06 | 2e-06 | + +Using =K=, =M= and =int_xyz=, we can use the =Reduced Order Flexible Solid= simscape block. + + + + +** Piezoelectric parameters +Parameters for the APA300ML: + +#+begin_src matlab + d33 = 3e-10; % Strain constant [m/V] + n = 80; % Number of layers per stack + eT = 1.6e-8; % Permittivity under constant stress [F/m] + sD = 2e-11; % Elastic compliance under constant electric displacement [m2/N] + ka = 235e6; % Stack stiffness [N/m] + C = 5e-6; % Stack capactiance [F] +#+end_src + +#+begin_src matlab + na = 2; % Number of stacks used as actuator + ns = 1; % Number of stacks used as force sensor +#+end_src + +** Identification of the Dynamics +#+begin_src matlab :exports none + m = 0.01; +#+end_src + +The dynamics is identified from the applied force to the measured relative displacement. +#+begin_src matlab :exports none + %% Name of the Simulink File + mdl = 'strut_encoder'; + + %% Input/Output definition + clear io; io_i = 1; + io(io_i) = linio([mdl, '/Fa'], 1, 'openinput'); io_i = io_i + 1; + io(io_i) = linio([mdl, '/L'], 1, 'openoutput'); io_i = io_i + 1; + + Gh = -linearize(mdl, io); +#+end_src + +The same dynamics is identified for a payload mass of 10Kg. +#+begin_src matlab + m = 10; +#+end_src + +#+begin_src matlab :exports none + Ghm = -linearize(mdl, io); +#+end_src + +#+begin_src matlab :exports none + freqs = logspace(0, 4, 5000); + + figure; + tiledlayout(2, 1, 'TileSpacing', 'None', 'Padding', 'None'); + + % ax1 = subplot(2,1,1); + ax1 = nexttile; + hold on; + plot(freqs, abs(squeeze(freqresp(Gh, freqs, 'Hz'))), '-'); + plot(freqs, abs(squeeze(freqresp(Ghm, freqs, 'Hz'))), '-'); + hold off; + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); + ylabel('Amplitude'); set(gca, 'XTickLabel',[]); + axis padded 'auto x' + hold off; + + ax2 = nexttile; + % ax2 = subplot(2,1,2); + hold on; + plot(freqs, 180/pi*angle(squeeze(freqresp(Gh, freqs, 'Hz'))), '-', ... + 'DisplayName', '$m = 0kg$'); + plot(freqs, 180/pi*angle(squeeze(freqresp(Ghm, freqs, 'Hz'))), '-', ... + 'DisplayName', '$m = 10kg$'); + set(gca, 'XScale', 'log'); set(gca, 'YScale', 'lin'); + yticks(-360:90:360); + % ylim([-360 0]); + xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); + hold off; + axis padded 'auto x' + + % linkaxes([ax1,ax2],'x'); + % xlim([freqs(1), freqs(end)]); + % legend('location', 'southwest'); +#+end_src + * Bibliography :ignore: bibliographystyle:unsrt bibliography:ref.bib