From 6f0af763380a046cb5c4f67c646498f7d41073dc Mon Sep 17 00:00:00 2001 From: Dimitri Lizzi <dimitri.lizzi@etu.hesge.ch> Date: Mon, 17 Aug 2020 01:05:25 +0200 Subject: [PATCH] last changes! --- README.md | 33 +- doc/rapport.gpp.md | 7 + doc/rapport.md | 36 +- doc/rapport.pdf | Bin 1965450 -> 1966849 bytes doc/rapport.tex | 5085 -------------------------------------------- 5 files changed, 67 insertions(+), 5094 deletions(-) delete mode 100644 doc/rapport.tex diff --git a/README.md b/README.md index e6bb758..68e4cfa 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,34 @@ # Bootiful - \ No newline at end of file + + +Le sujet de ce travail de diplôme est le développement d’une solution de +déploiement de systèmes d’exploitation à la demande, pour une +utilisation dans le cadre d’une école d’informatique. À chaque démarrage +d’un poste de travail, l’utilisateur peut choisir quel système il +souhaite utiliser dans une liste prédéfinie. Il est aussi possible de +définir une liste de personnalisations qui permettent de configurer ce +système, comme par exemple l’installation de certains logiciels ou une +configuration de réseau spécifique. La première fois qu’un système +d’exploitation est choisi, une image contenant les données du système +d’exploitation est téléchargée depuis un serveur central. Cette image +est déployée sur le disque dur pour permettre son utilisation. Une copie +de l’image est aussi sauvegardée dans un cache situé à la fin du disque +dur, dans un format compressé, pour permettre de ne plus avoir à la +télécharger à nouveau les prochaines fois qu’elle devra être installée. +Une fois le déploiement terminé, les personnalisations choisies sont +appliquées, puis le système choisi est démarré et est utilisable jusqu’à +l’extinction de l’ordinateur. Au prochain démarrage, un nouveau système +d’exploitation sera de nouveau déployé. Ce mode de fonctionnement permet +aux élèves de l’école de toujours utiliser un système propre et +spécifique à leurs besoins immédiats. Des efforts ont été menés pour +faire en sorte que les déploiements se fassent le plus rapidement +possible, en économisant un maximum les ressources disque et réseau, +tout en fonctionnant avec des ordinateurs modernes. Le développement de +ce projet étant destiné à être continué après ce travail de diplôme, un +soin particulier a été apporté pour automatiser et simplifier au maximum +la construction et la mise en fonctionnement du système dans un +environnement réel. + +- [Documentation](doc/rapport.md) +- [Journal de bord](doc/logbook.md) \ No newline at end of file diff --git a/doc/rapport.gpp.md b/doc/rapport.gpp.md index ce17b30..a1d8146 100644 --- a/doc/rapport.gpp.md +++ b/doc/rapport.gpp.md @@ -223,6 +223,13 @@ d'un diagramme de Gantt. Ce diagramme est visible dans la figure !!pdfref{planning_gantt}{Diagramme de Gantt du planning}{images/planning} +Le logiciel de gestion de révisions _Git_ a été utilisé pour gérer les +différentes versions du code source du projet. Un dépôt a été créé sur +le serveur Git de !!acronym{HEPIA}. Il est disponible à l'adresse +suivante: + +<https://gitedu.hesge.ch/dimitri.lizzi/bootiful> + ## Analyse ## Cas d'utilisation diff --git a/doc/rapport.md b/doc/rapport.md index 2b79868..db11406 100644 --- a/doc/rapport.md +++ b/doc/rapport.md @@ -199,6 +199,13 @@ d'un diagramme de Gantt. Ce diagramme est visible dans la figure </figure> +Le logiciel de gestion de révisions _Git_ a été utilisé pour gérer les +différentes versions du code source du projet. Un dépôt a été créé sur +le serveur Git de <abbr title="Haute École du Paysage, d’Ingénierie et d’Architecture de Genève ">HEPIA</abbr>. Il est disponible à l'adresse +suivante: + +<https://gitedu.hesge.ch/dimitri.lizzi/bootiful> + ## Analyse ## Cas d'utilisation @@ -1879,6 +1886,13 @@ Le lancement de ces trois machines en simultané ainsi que leur configuration est assuré par l'outil _docker-compose_ (voir source dans la section ). +Pour simplifier le lancement du serveur, une cible `start-server` a été +créée dans le _Makefile_ du projet. Il suffit de lancer la commande +suivante pour construire et démarrer un serveur: + +```bash +make start-server +``` ## Personnalisation d'images post-déploiement @@ -2147,7 +2161,7 @@ LATEST_LOG := $(shell ls -1 nfs/nfsshared/log/*.log | tail -n 1) .PHONY: doc grub deployer start-server reprovision-server clean print_last_log help # Builds everything -all: doc grub deployer +all: grub deployer # Builds PDF and markdown documents doc: @@ -2242,7 +2256,7 @@ services: - type: tmpfs target: /nfsroot - type: bind - source: /run/media/araxor/bigdata/nfsshared + source: ./nfs/nfsshared target: /nfsshared - type: bind source: /lib/modules @@ -3648,20 +3662,26 @@ echo "Starting logging stdout and stderr to $log_file..." if [[ -n "$customization_choices" ]]; then start_step_batch "customizations deployment" - + readonly customization_partitions_mount_dir="/bootiful/mounted_customization_partitions" for customization_choice in $customization_choices; do - customization="${customizations[customization_choice]}" + customization="${customizations[$customization_choice]}" customization_dir="$remote_image_customizations_dir/$customization" - echo "Deploying customization '$customization' from '$customization_dir'" - for customization_partition in "$customization_dir"/*; do + echo "Deploying customization '$customization' ($customization_choice) from '$customization_dir'" + for customization_partition_full in "$customization_dir"/*; do + customization_partition=$(basename "$customization_partition_full") validate_with_regex "$customization_partition" '^sda[0-9]$' "customization sub-directory name does not match a partition of sda" - customization_partition_mount_point="/bootiful/mounted_customization_partitions/$customization_partition" + customization_partition_mount_point="$customization_partitions_mount_dir/$customization_partition" customization_partition_device="/dev/$customization_partition" ensure_mounted "$customization_partition_device" "$customization_partition_mount_point" - cp -RT "$customization_dir/$customization_partition/" + cp -RTf "$customization_partition_full/" "$customization_partition_mount_point/" done done + + for customization_partition_mount_dir in "$customization_partitions_mount_dir"/*; do + umount "$customization_partition_mount_dir" || + fatal_error "Cannot unmount '$customization_partition_mount_dir'" + done fi start_step_batch "EFI entrypoint file creation" diff --git a/doc/rapport.pdf b/doc/rapport.pdf index b73cdd9ee8cc55b07ebf52ea9ad154c296b11cb1..efd361dea0e56bfffd2c91ce32fafbc159339297 100644 GIT binary patch delta 123701 zcmeDBUEbJM(XfTlHMHKy&W@|Nq$o8pm#gB|+o;odugwJRe%JoOoMvfU!_+9wdW-3< z=!tbN4s|VFx9i3Ke5)Eyl~ik=3rk$rCrC_E?M*vTY@uKEE4#__6T4dXWYahc`@Mfo ziq}1RFaP>u`}3E-=Vv&nuGws0tACl3Wx_1KV;tO7Rr~&ZQ(0P=?qAbVFRnRpNr<1< zq0gOb9<AQd68|S;&!V4Qvo3Ew_Sw>l;q3FG+E?G7$1jtg-(AG;aO<%s%L#%}v-Pj7 zn<94XSKMAX!x_uHSBEOi7UAjiinKg;amKS<yXJY?sX8C$$-Xi{+ThG)maA>L#R13e zXB(x=bQdvSFB#Z#LMTFInzw|mG{ejKj>TQKuS=LNh}g^`!kKz`%W=WqhooyKn@@}{ zZqk;V^<d+&rXrSQ=UT2aE|&E^(Jvu8kDFVmhIxsr8qcCAme*(OWf&|UPJMm$qQy22 zj-G&j%FP_#Z(p6;o8G)u%3w#RERWgehJ#&8W4502pO<4GyKAc?=fPvAa`v7S$x|;s za<1M_dH<tJ9f`Wfnm5h+>Eg!ex~uK5YIWms%Nr$;xelL0o>`x{YxTW+YK5x9>bXMY zb{lWooKvaU#kc-U^@#@o6M|(WXS{3Wv2u~Nnr{#ksj8N+<Np@JX>ZPn-br&^{Wjrf z{S;B2%?gL+iB3Q3y64%2`OVQh|Mey=I_<fMyK;d@K)u9*x!0OG=O1QSYrO0U`wRxZ z1<ie&I*~IL=tZY(5ZSJ<`puNkpeF}XZMhxSvlOr0l;3G`sOE8<O3vCVei6>r#{9>P z9F~_0HLjLeGLL=T!-JD1OGE{=2^St!ov4)b^3ud>pPn`*u{;#{I*VVzURA5a^+qmN z2H)eDi6w!K>t!11Ekjuk%CoF+UMYO(lZfa&KYlCL<68gBFEQIXuyiwB_~sJe%PQE+ zl&5EZi9u{Kw|BhgY)g?h+-KOAX`B;Pd7EQ7<C7`RhoBFi-W_IK%fq2NE8<O@ck4aF z#ML*0n>wOfR{RV!mHIS!snFWpj29o4Tz$2;ie;&gT!DFC{siNDPW1<4@6I<^%2H*# zagMN%cVxd|z4!4=6+2CO66a52h{!oUgX!+IlRg1QcNyJln9Bb8@WNc7xHWpO_r@f! zJXvd#e)5sC+yY*iFp+Q9<R$JOl-T-Vo5;%)p?M4W9i}&BI_&+jao4#62^+6xS?>9o zuBd;%d5_Y=jUo>eJEphT?s)K`qCWPva@%zF0Pn7|^WJTBkNVykX}kCCwrkUpbk0;O z6=y~tj@dRV==H2=Yt8P5RrOulbkDh)W#_i3HJY5a_U+v{Eq<%B;tCnB=RSGnhkhHr zDU--kGrU#Ynz>-wuFD+rXWO~v6+N(f?-AKmXTWa$O(Cz`B<gXWtMR4`hbH+0`*&E^ zEAPEg<yMk+D<D*ArebgPx^=H|wjS7j_e925*%yDC)8D(wt=+K8M2aUz`nBTvElaIB z=e>Qq&Gq-T<dt=$x0M$B%Lq?)jm=D4s{Qip>t|Cl?`_-ByxIS@`0GRQzp_ksH1V^w znZ8+@n(u3C>|uLFVaE2qGybtJ^~&*LcX6L}>DYt-gWLAi&;GtsEiLuBxpT=STaC%R zU!Sp<?w@A)R6X0Mr`&w!y^epUctcjcU9fMVmZ_4M_~%=VS^pxh`H3qD+ZP;|e8KDO zzqnAB`oHh;zvrp+O=p}SA>6JI#n`S8#ni44#oVqC#nP@2#oDeA#n!G6#on$E#nG-1 z#o4Y9#nrA5#l2l2isy+hqsjEfHg45=GfQLS0&!`?>2=cPJa@lqKVx6xv1neyL)VM! zw_-2s*536Y=J-t$jZLrKPZ#m@G@e&IcYz06`5HmhPajH`JbnF0to#3+Nq;8=n=aK` zA7Ahwyv9!7exHtf-N)|YWyfAjpZ>e3=$K=KUqaT|)2H8_-@Nr+wDjGlPwGF<j9cS- z^;SdkgpYsQ-aq|x{q%e9lWG<H+}$_Sv)^lbvCKL+$(L*XhEw-%A6;&|w!*TpU!`>W zyLkoMjt06f{_;2K%h~lhjNdmV@l7td%ptzv-PerTODucVx$U}mCvTqk(Mfh&BIf&@ z=1=68oy==7eX{mC4kpJnOZT@(zZLr>q*&k0+A9CY$>ZOjO*OGRSA?e5@AmHM+)xwg z^hNE4*8cx-|03-2{?1IR7ZY*2KEKISGyJ2E)^w*|f=+S)x!>;Vi5!>}v2eF>kjMmS z&z~30R3F`*k?H6jz{T;TSYPb9^#03!Ql@9Kxw2QJ|8rV!e&15b+;6A+5|)2i`~I^> z=nLKY`pg;kkF9&)9>UZ4PW0HHmTy+`1>fbYx_;yNfy)=TghcON+qPQ%p6oZ@x;2KZ zUy@A?7pMmra!z-5XG=G7kWUP^TejrH)Qk&4XV<QdP%re8xcslh)_q1x{@ukL2RrYp zT9{t?t8y*qk#2C(+0+?9druxbyX?dX;ov#C%baHBNE#Z}Z&JD27JIl^Xl0`C6VY<r z*@u|@CTYvJe)CkhaebA?j&rRHuP1cxjkCEwmFpVY?gfW}7Fb*<G@0Bu@n6=z42@0l zdO{b@n_k!G{jj8`R=mz}uHu3AMYmS34sn+_`Q)bApM1u)xfzceMNMZ5#oRZD-MK~O zlGOc&!lBORyxL<`ldjj_lJZ%%C_??g7H$EC#TMzD&vTY83wZL}A%ppa%B?jI?WCM? zvUYTtIov&C!N4bOBB6R%;CSH$uKmfTheP-JEdJu66<4}$uBG9lv$@|b*(&xV*1cYu z)xNCz2G^U6JuJ#c#qIZg<V{eIKItCu&;Ol{Rblj`ke(|Ylc%_UP}^BsTYp7t`Zm{R zl@pdOvYmHTX-7xKj;-w>Q`U$3iq{xPPkPtx@T0|6(CpoU<Mprj*2~P=a&P13g$1iG zN8~(lSNNbO8GmP8&IIe|yHjnlOMiab|EZ^LqR<@2KU*&32`=tBY!zi;zQE4eLn>qT zmOa8B)@+ZOy!~X$tLIJYoTKM8Zn+elRqw8G_eJXer$RGA47?bAhjMk^c-DS@-;t-w z>$fQ9{O~-sta}g3PfxRknMY1INQuc!7VZya^t_;G`LOKosx-T8iq8+Gy#BsBNHjFc z^M$MV$9-;I(l_^hE%>Q+sxZP_X5#iQVaJ2KKCf9^@b|~PzNQH|Ka>(Ajqe>b`20VE zc^7|K{RgL)UmUeJv_&$X=Jd}h_13Uo<MsP~na6$630z0-^>22uo$`4B>$|T?tp9|X zC)`+YlX++FiZgpJD@m<fG*>8O?JD8oP)EzzC-hnE?y}vkelR7sa@NW{YvxaylJfPd zmCNUsOIG^r-teomeAdqO#uD#ma#+7}U$|lFy{PHSj3e2L>(lPUiWe@t`?cZuyoYj+ zg)ijTO?$ZB!0~kZR>$A7nO2`uD*l;kHr+kSEaoeN;;lQ+Bv0mBt?1FZvdK&CrwohE zzfI@=+THr1vNv%q-<;Qtf4*?9``x_q%B)Mz<G)|>|28vr(Msc_g!Antb<vk^%xTTk zE<J4V>08H>(7Z**)_z`FUcV~GsBcEJ%QTU@`=%}VDjS$%ulI~S@M+6I>G+NOkNK7! z+82{jU8iGTH#bkd>)b2$Uw1ez{F-4qX?go+Q~mEZ{M7F_Uz)LTY2TyuZ*63QQs4W` zSW#5$8k{=$N3P1<WlQv(Rp&iC_q$koySiXo=^VM4Mk^+4oAV@Hq-n`r9b@*d^<haH z3f9hGFK5iWV)L<hX>roMqh{0J75XH%-`I4%Wc6`{zgpg>*SD{pFEB-+(5h)|@J=c3 z4|B!1cfMY&GV^WfO}i<nVzKTAK4jSXm-~c0|GH#LaiQ8t-i}zcd}ohqb5DIuY-3z{ zuE=Yh)PZx_6E#d)Is_&LfA{NBx_MZm@3(5b#EwO8w*9{)vV`yH!`iNG4J(~KGO8#p z{_^!hlbcqk_LW|t`^!Dvr6<f?x#09qgF}@fPwzbb9zA1;(DarJ6Skuk_m&@$Tk<=2 zfl6J%F8-Wc?_V{GBfc-(dQDmCz58Jk!E^1^uJcx(w9gZD<&$_={;oj1=tl+fOru@9 zp8XUGYQJZ`>*LEsrV@A7hi_cglD=S9bXel1?EU5(9#a+`<2}DzILa&kw~B)S>!Z5! zbt_g^JKO*JAphsX-}}=)EawqnwA}8oj^~Cnqv3YNQ#|_^8BM1b){BX3|8km#O_tGo zy5cDw;q81cd6qIx@A}BYJv~}kQg8a3S3Ifw<_ZQ1LHcRBhPnn^#>U3m6JGOZvQ3}+ ziAQ+*oR2(AjEu(9A2#y~Pv7*3=lOIOR$ig)t3UJ16lAoV9wRMgvb~a(*O77hYiVAg z?Pu6{<wd90$?|efubn5xzWuK>ZzJRM3#z<O>$c1Ch8dX{g6*rYP%t(z1~KjI^xg9F zN^ETO({v4V4HS$`OhLjB7bzH<8cx5UEvCFZNsc#<eY&HbxN5z*nK?>59d@!$*ic~a zXVHI+-*%jO>f2T1VBm4b?Ma)(lF6LnN+#-c^R@Kv=1t~l4oJC~yZc-C`9OWHDG%jW zG-&-;k{q;LJHO`9$Jo90E85*d7_2PYUljxjXKYxawmO*WRl&bq#%vcQ*ne{#_7gky zBZcSVvU=V<cAu@@?U%J%En%X#>5<mAoHMCuoRg$ojl4fD*m>@`?XS5Rcl^cXdc^X? z*xWbU!@WuS`SBZJ7UG=Mk)~{~mTY!kbKt<sX>}iuBwbe9ck-^P&6>WSW-d32Vy~<} zlreoy&ZN!r6`a;cE|6M#W|H|vw{9*j)20Zv`5tQaa#y-9)tk94uhUiSycJm*`Xpeo z=hxruzZT7#R<&(rtL?3f;<vAh9zCist-Qe3)R1u0ZJWa6?Q1Tde0ccr)z$p=k>7(I zJKqN~Z4%3!FzMSmu{*z_5;UtCk2L7<+}ik>SJAKGXyETk&zCEY{#Q3SXziP~;bxG| zQL)|L51+Gbl9S4Q`=*ek{se>5x*C3=M&F(B?9*<ZJNwYrKa$l^+2U0-*U3zO1Ge`P z`fp7055`PMb8g~@cgQH5JoWae#n(@^1zPH!+UPdtqRg+b(-P}-eK$I7eYWN8^DyiC z`sWTw3zUA+b!#i%7VySPEqk#?x994oQ-t4gO&3vqyTm+Z@?2SwPTz^2rmv{a|CtoY zaGg=%{t1~$xtty?Go$83AK3ZPclZ7a4zF~(WX`Sa{~c^0s=>PXebSWR-K%XX-<kdu z-L|DM_vftLN|&O$J=Da{6-;INp38i4#v|SHrd!tUUdnze+#>wC_FX=OyW7?o&g!r{ z9ko8WN7<`?eFsyyt?)GsspI>S&lP7ZEUJ%-^t)BKzcAk=*Y>W0t=k&&CCvxDsvg?C zbiE|#+R)P{@Nf2)KJMFl+^VL<E;op(m43U{|Jt%0wr#iO)~h!8{q~yjz4}Ag!Ci-V z_2=?;Zg={BW9!;a_wGKIpYO4GzNzmc3+tXw=?gbhmrai4T6y-SZqltyCv&@=+^l~8 zetMe@vwBnf>4RxvQx{y8_;7jm{Wn|rOSn?=QlK6A)V!4Zq%1CDbCc<cQH-kF6E%2O zb1_0WM#j7>T;NQ!J=&Jnmu31x7YWtrXB~OnraRWisBO1&;yn(|WNO>hym+s2O*cF* zrM6u$ly?i~^o7TyRi_7-@d#|^isyCZnBIJpS9p6;Ixna6^ni3;q3N|vyxmO32HUxs zd5_9XU;2$#X#2y3yo;5mpI^u;G=17p-X2Di?aIe^_2s9Fi1G<-PkGAgC^$XnDX+-% zo!@x77%jHDeCK^GF#VYxpYV1&4!)~A)3rGGgr}>C^7SwpZQm@)_m^w>d`~{1?S~Zj zRQRTEP~a1u{!@>yo6&50t3Ka3p6Lxqe8St)Z1^mBr-#_^2~FSV$=A(fYA{_PnNN0m zv=^TU_w>$IKB47}p?tj4^F#TBrcX}d1G!2enePVI^q{SLBHMZL_-e(c|H$PNnm)Ug zuZPiMyG9$|4vFb&Zt@9j|1^&;UTpgPd3++%Q@8SUGa7CGxRsAveEPQ!d_vp#&hpLU znf~VtpV0JuH~D%P&9-~r;(Nq7U6F%dc)P<BzHL0y^`7tvP3QQ?*Ue;Zuzc!AKCbCo zl=+3WFaOO~%`<)KZ$6>vCLH`A2OZ?#|He7}Q82&I_LD;VuLY)W7vdM1eoUFao6%x> zLkPdT!1h8D{yTirA2jm|ZI5^6ZxWd9<IFES{Yx-E$XN{`{Bd&A%{TK4ZU0cj|3P5- zy&`_0>7SbUL4j4*!v9-ty23+#;q5((`B(E#uUgD6G~IJEe;1Rb!S<`0`RB?`pUx#9 zw7umb|6Km*MHl&nrW-%x?`AaFzW*WrO4;d44FrU?SN-Rg<({7LpI>PDN-lwJMvLi< ziv>isdvXitNKM}tCLpxET~$DadwQ{|fXMXi1_B^wIU5T2NKHRlBOo-r>OcR)?M6NV zJzUfKy#<7(UkDQbxh*DKz)EWRqeTM3+gBEXv`;S-5So6yMxcwy&|rIVtw4~}^uH$r zgr=`76qvX@VunCB*YvH^1%#%5T_gZ<VB=x|cd6;W-w6n9zqMCDnS1()y#hkh`A>oz zxPA6X0X?bdvZ8`Q({&dKPTZdJM4*pr`iaK^!qa)*gB>{Yy@0vYbY5#gq3w@21+BTK zU*HrJnyxP@*v)7*eP5!W<n}9~f?QJ5<r4*kAx>yA5bWlfeqUcuXu7<$U>7I@thN?3 zlbUYOE-1A9bEu#$_jJR{f+EvR5(PUMO}6h#6m*uF?z>hH90ZfMFRKyk;sWIYq3KTT zg3#!d6WIP{x}ZMS^oOB>!rS#03CeL#ms%t!JUxD`VE6RBiGotwS=I@%N=>)=DJZmE z`h=hu_jJw^f<n`sFAH{W4^#oAkGGEnRk^0e$O{Q?SA8ca$~|59ouJTkpPzzVOr{3g zZ~PRDmzqA)RY+*Nr-+aU_jGd+A))E{@<O0MYzX0(6WA_kAQT496hhk@t%M}Fr{`M< z2~A(^Dg<}r^f%K5`M0Np2`O?-7y2zCw0(MlP?s#D$#$hWp{I<~E0+lgZI^5iidTc= zf$n8O;!M-M4hTV;1GiTQMb=w@>-q`{1ruW<2-8x*#MlhNG&E2!F)@I$4HZmGOrUHd zE)x@|PD5h_6H};GLlXrPQ<z>;1rsxvUNZ#~Gnig;1rsxvUW<AK6LXkmOD+?0sAeNW z1rrOXW+Nj76AP$jBVz><3#euz69p4Xs9qye1rtk{UNZ$#1DIZOE>i=TUJC_N1DIY* z1ye(i-ufW@3S$EWQ$wg`V?zZ~BdBI$BL!0<sAgkh1yduaW@8gBQ&?abn<|*XLd)1p z!4wu+#^ws9u+TELP%wpsma(ORDJ-;13=~Y&A;E>#2IDe?h8(z6s9<VlHa+1rkMj24 ztAzYTL8B#)xm33o91wcO$YfzS9bC=S9uhjuF@5_zA))P2r-in%Pxm-2Br;w3vQP)3 z+4MD+g|1J3^+!l}`?M>d#L{v_NND=WdqSO{0w?6Y&<Ek^GE%}q+rvH!P34^K@>xh| z`rki7U5qB%JN^n82~Xc|E-bYDjDT<e=k#3y!a~#aq=dVsA6zUdxBZ%w@Ft<@`eDLC z+h^$tD|1b6(-jt(e$iaGi_vI%jD>KO$aJA%VWI6We1zROr(g3C7MkuDCfvnnw*5?) z@M)pxd-{cix39_+&fuIrBU4ytx=OKdC!^u?1py+W+Yc8D&k>s5w^~?edtsZf59jpw zHesRZ=lg}b7)_=>%n%jZUNAv;v(WUryM=|en=TfP<e09!SXg-a!qvi{+DvDSurk~9 zKR1MhwkK{9uI8NXw@Fxd`up7=r%kVy5S7_JZI7_9@bph#g@v~7J}>OZIeq1MVWH`K zH^J_kc~kh1&~!s#5#jB5Z-iSor^mbz7MjlTO}G<O#`J#^W)q$+U??KAeL1H{H|O-J zoFYQgU4%tIZd({2BD4Lqu*e;u=_~;vLfdbuiI{UuKdvSsG+oJ11RQe0+xHua%n+GA zH&;Yxd#0PnEY9g+ZX&|d#R5b?A-6C<#6ftvRkw)H_Rq;8t2h}=rq9b2nayan-6~IH zqwsWx6(Yjh|22x(a87^IC?Yi7r(2{GRMYl<6Bgb6rdwpA(DdhrMTEAmpC>YjbNbwQ zB0|%HSAg8M{oV=@FX8F=_e6xYTkR29%RXIWkBHFppNC=2ns!8_SpZU+XkQg^=A15Z zRYZ7t<2{hGrY{T-k>0L;Uu25V^he^NLfg-N6mjL8zWbwy&~%mGB3+DTAQdv(PyZH~ zC^UVWv8eF&d_K`)&grpyqC(TZh>LbInHy}cmk<>ao_^U!RA~ERZBY@9>56qi!qZO~ zi-L;h5EIc$0@GbGM1{6nxQfnZpRVRA3U*#6qd6$W32$%m6>S!P6wDHFqS{>3S>i;6 zr-x;Tg2L@#hUgaI>8guGg|;uR5$)ofKD9<vXu5NoDBNwY+C-lUO<%lURCxQNnWD~| z(=W^v6`F3oShSPT5|r#@x8GYVS|T+4VX}zu_S9{n_MDIkc-wwaP=0VcAbLt@`q?L< zLfd68i>?!7Ha9TXe(s5A1>^KT9AZM-Bc6#aQ354-;qCmKVy_sdM@fqbZ|C6_^A`YR z2x+lW#_0tbV#3>>$cXiDPv4~}#=X5-L(GnGI+wK=52RQ4SyL>c9$N00E11H{J3~VS zQ&@RtXry2YEAI?V6wF}douMh08LYfBG*d8xm3M~b3TEK)E=a$^&_clsR@@m{Dwx5F zJ0k-HGgxtFRBxzY1}pE3jJV8T<(-kSf*Gv5Gcr*ygOztirV3`T^3KRi!3<X38JR1X z!OA-$3k5Ssai?ElWXWX)E#pAtuNka%Fg8>$1Jw?03PJi6#zqQeu-d`cSiuZdI~bcN zn89iXV^ak)SnXhJ#$^TzEn{;9GfSiC{n}z;+K{pxQkI$<fQo%kf7?jcK*1auKxw+h zAfBPg_6yo#*8JdR`E~<qv3HEqpE`;OZ8xwL+sZP1lZ%+p_V12jyP2k6aTgQXe#AwL zpLu$jx0vwuXYOJXnHi0@S9ps>GBcWPzvL%&o@M%r95JEon}fwnB$-SMx4+C0Tg5nC zpiWF^`_eqIY<@=b?Sge;ag5V@=ZFb!Z>ksLk!3XA-akj|G2?XQ&0<2^Tjq()2MsK! zY!+)|oPK9NEP>qLA{JQ>>7-X!DwrEVMi43t4HV3cETJ{Dp@O+Fw5M-qqF`<e?&|AT z7@BgK8-ul?RXGag#t>tm!DIr_kfsX`CKHIU&|oq(RWO)-Nn1>D`;Dz)tXz!7(=V#> zs%~dKAm+vd>anP9&pRZxk7xSoTVj^mQ_qXJa!==Z4R!qXC%42j1sILNBmUcsUyDs; zgLHk~eH7zj2X%7Prpx^la|N+fw|D#$W9OP)s3N1beJiv0JCIe3Uc74CPw|QW;hNsG zM@nt`8%gmOToBbiRm9ymr%$#N*I+cA%E%*KZ)$9WGNbS|HoI76`^LX@^+#(;v{ZGZ zGWO&xjZyVVQ*qyRuPb+|eZV8PTQQv_9;>uYuHXMW;hW)ag}vTMs#;T%bkob8Uu1sp zh5N<3Ld}wG#hRr`cb=WIY|nkU=eXHzztD|S^;#O%zE1MFku_at`^M9O8+>EyJ#FmE zlQtjsJIKquPGg&Jeqq)`zmS6ekE}T5j&!|O(ORc<%aco?nOns@PSjdcC7_`3=-E9- zStr?)IrNq6Jvw#Y2Z0x?g*OiBE_!S!==;G&{qs%TGA_=?0e=rUEB(kgWFPa==@=j1 z?<4b_pNsl_=bPWa{+Vz8v5wUjEbUa^J*a>3$X5UD6|MIZtwl@P%2x*W&-)U$JAs++ z;hqNd!?C&IMz`LYmR)>gxVKHu>LA~_?nYhSOGjJuK2|JKnK>nQ`i+Tl+dWRP_wVyQ z_;5}~V~5;YhxJQED*WCA9V_fF^lI&wDxRJ#f9z6f`c0<WPjAI+G1GqEeDL(a#dlvk zk`d+SuTOX)A~gH<(=`fRYEKW{W3cK<&0o;pC7@k#Drmj{gQk}dgCnQPMCWj&-D{It zeAzs_#9~^xy&Sh!Djkf9b7P4(ov6sNX2HvS40Eoj%Bk+DaPQk4akQM(;D{T~Y9`4f z;Wn?e>kUHQe5`Y=h*LRY+b{H{Niq0<^AW}yU9Vkl%&zCMc(9<zpirDsB2bheL}`~B zBd_2W{cjcGU)aBCUAxH3wWnh<!;VLqM=S%vO=9O9zsYr?Bl!5|0(<cb%U^v6(M!7H z;m#1{p!P}6btk*jJZ8xYw;wV8Qh1=rVjHtT{6wH#GXL|3-z@l(RbExv+wjj~RAA|u zl))gx<mPU&=)Y3^?-1cWmv5WJcwCd#w{~fGi}5yiGu=<%(dmD5&OuAygdIZ&YjuYE zQLXCO0<P}`(^Vucwx~~bDf6!|GT5P7b@CPK-$^3RQ@;edU-1gN=gR$4K6y41E5k4G z>IH0W%%%(E@9MbNybChYQ2pkuS;~Lu(4@`5OU?-NBsg(5lyBm%7kIA|IFF$+-E?xS zf<q2No6xT-H(8E(d1~g%9F;yYLD%j}6JNsN{FzQ3HuLyxJNGf1SKD%v(Q=2_jxwPe zW(Lv~Q70Pq-Z&)e@Xyjj*uQIE;e_5DVzuvo7~EL=VCx&xEpkc{8D~W*9r$K!J7v@A za89Jkfv;k65dR6q{KuR!x9g`mN^dg!Y;$j?$h`LD?N?SCF;t)XXmjDi6t5}0=a|)Q zF!OR)&rugyGx0k!J45Kq=Z$UWTc1BXmte)g%2mu-T$+-`Abp<kW0P%vvC#{QP><t2 zt&12X9&}i$-nx0%PjTml_VjCWDs<n+7@a>nw^`NnRj0xdMwT58g7a6-VEU<FU+q=* zO6b!rZo$2?4U_Z)OeG^4VwQhl&TVge7F+QAMBO<F*N&8L#x0w=<<>5oQoN&cX~2=V z2Y*-mOFEK~`ejl#=O)d^kCXar`pY#%)(G6@d&GO*-FI3`l5qfksA^{&Yw_f~1ELLk z%IbezesOevopk@Zd2{B(^~|fUDn6LsuU4=A-`vW=)>>}<-faPAzg@rBeDUzbz1J_* z@9aK3um4}ouSX>%|7WkL|MBhi#mygYcV9m_%V*-8J&mhgZgEkbvcawS-><jZ|6gv3 zidZbxq{y84aoLwFmMg*4RjSgjY*wUC*0`}j)L(R^+O|bv*Q3;r1|*z~e!jT#<kscp z*>k6Qu`AVIh?u1%`NUbfD06G2UiD<fmCw#@{t;VLU3K|cV>eG|{(Y+%lhnj#23gzK z?tIYpiOsy)%xX!^+wU6PJKJyDT3XlsuBrK0_2tRGhcAx)m@mG#UB3Tb@B6Q_o9jMr z2<85i)$eFB!{@S!<cz)zEo(bJtKFFq6RE6zuwmx{b6%Hx@p{{;GiJ)=TfFoZM6w$B z*%r7fhls4rRkOLb=HlsV5m9M@Jh^unCWdaA`JrOBo4%EE?$RG}Q?~^fZj&^ZUq3O} zR7m_1Gn?Fr_l@_a>{a;MyS&nLYHvW?g8M!-J=brgJ6_j2;$Cp@fJ=sd{w=$udeI&K z5>B?9-SIGg_1WMRMoZJ{1DJL&h}G&naJoP5-kQpg)OpiPr}!y(v3_~1JFWlZx!Vs+ zLj_s+FI_17a!}e`jQgBN=F)|SofN8@^s`tOUUCi75RC|9S(tz9isv(y)w`N*Dd{X) zEiBA-udbDK&e3lyo%u6%$Q_cH{b0_*<&MqEO@b{C3-ScNoG2<5`yizGVMslrjOG^O zKYBd&)<5q2xyV|^o!;-%W+<hhxF@heU}BZ=)Nc=(<5>kKTI@`CapjU$Yth2h`FlQB zD{y>p{Uy#6czUOLwngI;8>xA>qpjZrG)`9Kyz!WY>y5yU@2nS!&sJ0>zSa0*Q2R*I zl69d-wD6b815p<*_%7MZbS{WlecR%S`tsG!UO1gNC-8q~p`2LSEQco?&qKRcvzZ)F zXq+r}^T5wL%{{EP=hRd=m{wF;*q^$&bH#!>-mGnhC!AZcx8~b~`T6(aWB!!=+rRkY z?vqD<{Fq#6Z&z<_mVdv$PhDPJJYD#6;-~lZ{%-kx{`zY5zrQ4gx_fW!v0NIXFvW6u z_>VR9+nEi&$ba6{7T0vqzyJOp+3&|(`R&<$&AQ$uo_Sw>{(jrpf65B0!uJ2G_)=(7 zRrda+e}CNHj~Abu{qg2SQc=~XKQEsAId|}7`{Sx}4=)}+*<N3}+2YQ}AM$SP@_qN_ zI-j^QnUBx!|Ic51p>Jg8Td-$N4c_qY`o+WDi}@#SFZaJ!Un@~wR`UJN+aFIBX`A)@ z(73bzv5VXHzPf6Id3&ns1J_I0?w6>qxtbbXE?2PJ?&OohGlXAU){DrxQS&BlPOa4S zc>ca~$G@HkeLH*3-1s}y^(Dv3Y^-Lz+pVBIH#GgNrP2Mldu(mz&DkUUx3s9}`;!`@ zA9Xb!|NYszTG`^y<1do+_M6|^G|v}!6ehp>bNm{+hfk0H-p%*_cGbT(Cx6-Q`tzr> zO#N1FZT64TU+2Ba{;}Kd^abVpeQ|U4+010%ecZSC!fTGZN2>12|M~RkyngtCo!Zw6 ze|_W&-`>(4$GYsyIiL3Kb<Zs2%O3CamfAM+?tu@h->{v3TlHq!pYPSj#d$XGs^4Ct z`uyAP<dZuOMuu;gzO`6v-p1W;#eF}%{BEJY_spwO)(f`|iY^I%pIY8t<o_}|$);wS zq~_WK@6^;zC#8A5*rF|dBSC<r%J^i#LWhTPSzNa@&Q5P<-~Z>woBr>|>+P$)W-dPT zhClY)wxr~j@2*TeH0f1Q;*OreSUH1r{LZ<Z^{dxCi}BrE_%4<A_K96emA$2=c}I7} z6*FHb*r?CD<+bU;@Dmz_sWa9uyk7R|S@gzJramu|{7OSF7a6Ty{Cl<LclU${{=(I% z-mD)!pLX}>-!J{;TOLP|7{{Zk^wOR=<<}hq*6osVJovtC0dMXt9=Yv#X{_62D^%`E zSQ!Q%KeDNwmnZn@i`k*}UmWMU>6S`MiU|F>uXJ5@c~#5pNx$wZ2?m?WG@CFjcJEs4 zUS+^#?_I&QaIQ?w^YuAjg81wo@x=c!wo|kDJ$+`W%(;`5&V4<uJ<l(h%UnBjLZafx zqo}hr>iZR5tVwj>3)hoL=58|X3F?~Dn6>TAOtJ1=uO=m0)Hkc~FPDxM2&p?B@$AB> zi@x2ZVe2kxMlJcW#BwJC%SE>(-}7gmHC=l2lKPWP8+ppS7*_UQxN>dEfg4&6nYXBG zuy8NlQe)PW*w|;*chEzz!F$$O8T~MO);Gr$WY66Soz1e%^P$c>|J7!mi*GtLv@nVs zWw!1)Vr=5PCt}<7(BIeUueq_Rg{3VBGw3m%JVPP()4vmid?6B1ZGLlftG3S4_DMY; z&=siNy;AK0zv-9PV!o!j%O3B)5jBBtT3Q$9ydcSnbcyEh#}Y=Vjo)j}^i{t%`1a*7 zLq+sq8Q#UMN=r&UycN_C@^xru_YgQP;i&poN`YJPZq{BK-fPdVMjTu2RA01lE+@~~ zsp?<SIV<^@SKJKA<(la4$f;svaK78v@_k}v?`e%b!`K(@*WCkWt?7BB<@WD%LiUg1 zIG)1=lbhcx?&JIWDLAPA-|6j(kFUG!KYx30yD|H|SCbpg^_)rwYtU~znK|9%dR*4o zMH+KvgnU&yBUm8a>b2$Ujw(SG<%z577cy;ox44Fdm)m4Z%j(>-JZoJey4>`RU%L=; zg17Z7*NsaVVFFvuuKE1&l2uag<`&a9FJ6JfAG?Jw<cn!cy2j+n64%jsJ+Lcr%hrNI zi|p!+KF)m)mo?Q*opqpr@yZ#6td8cA+03qNo9;Qf7hg-&+I_{jCt#ZC)YzNrS}z&q zFxQ6}EH?9M$ZR;6B{tnCC%$bXbM=*Q{)vv>F3#%|o3}}7?W@Y2)_!Zg;nX?N6SG_m ze@&PvZg*)<;ag5C3#WOGH+mjjiIaOeN!#8ti=Wf;LHIf5!}GX&7HRa{I#K#}-`w^u zU!4!>9laiLe2+$jkk9YN4GW&jJWTp^>C~e0uLWIZ)xTV1T`{?VrMQMG_DdSeUn|EK zYJMh0DV>hL=S@~P`{JdPt+)<{$T?o)NpoNFEQ|Fxf8a*KlbRXUXWyJx*{)-koE+e` z`$4z6z0Loh`u2DJm8w+nS+8Y^xwawq`oxT<@3!@cct^~hcYRmP;Wfu^UVQp?S@w)) zsjpWFUG7Ty_BA=Xevv@%;a67+He}zLvc7xEz0%rG5k-5FK5xq2-y*&6+s=+7rs{d= ztNrdg54v<VY@X8<-SByG|9;&4yqrJ(>#5+5O7k<h8JAVH{qtn=GTW!B^Db>tC{y)0 zob2^~<!_!7y_a>*bvF0M{=8QI-EQ4lU)PLj5u5oc{r3MmQp3H>@%!ugrz=lioqycY z(${hA<xq`kQI_oyn^y^PtjyV&Cz@3jKWlAl;5NO5MmKM7uiLsQ>*$w=@2*bf{p@cO zr|d}Hw3c(xXEoJZ4g03*&tZRUF-JHxtf1@I&RK$)EtZ#A&#f}M{NwRKEp}tx#|}@~ zgD=m?|8Dd1#e^`gymf#1<?X6I{m`zz@b9nIPrgY%Hnruh{yVec-_J!JVz=(`mHd75 zBH(oV+Q-+Gz1~FGbgu2H&YI72WoK;Yvy-=Ur~dTkpJ)5;-}C6TXC`00tFUFE@9nmU z8(a>qOH|pb^nA$~o1*f%l7%~_|JR@L-Kmj%zh~p^sJ4Yc8pd2ZXI)vns`{6SWxVx` zC%3Zdt0k)oz2C^%)O~%j+r7E)*TXMQz6kv(wb^FbVVcs`ciC)Rs?8@;g^tzh+7{fn zt5D&2Sx+!2Q?@NtTOv+yamw94`(@v({dezEf4S_X$mOQLOAAvzL^4g>q3ihN)60X+ z;r?yE9(|n6Ke@g}>b=^D1N`L?S6zN>{V`)*^P(Ab?5_2N$2(4)zP(M*({c^t%3XEl zjF<Eh3kzSJ{<d#}-btO^fk~?Sb*xqHR~7FMF}-(do^{2?FVmODH`-4B(`RWi-83h= z_f4^Kb)T`>=JVge?uIO0?#r~9{m`W~fgYd#uP!#@Uj43Wv#IQA0oQ4tqYS^5++H&A zx&7ZyhxdxFPA=4~l&n{NlA6Y<JZ*kcahdEI%WBhWCCBefyq|f0n;whzrW!x-M{Z8r zyKb(Y)5fK@n@P9&rb)sriLd(&8UEheJAeQFyNoa9e7U8|P`lT6`U%b5Y_ndm-qB&G zy}fe(&3nsE+FO5+2~+>~>O0r1jK50Exj!XOJ^G(IuX%3P`_%OZ&(*S3Z>>MRp=Eoo zC6n~>x$=LXKJ5R#pU+wU%?ztz*V}r6QK_=^A2+Ky+=<8teO*@`|Ai|?H+j{aD(#>d zjbB{3qIsq*mE3uxXqn=(sPsduhB`UNoy70GRW?yFYU5;)5Dt62QYu^Wg_hciEz8Zd zw+1K0GaNEvng3*O=cC(~la~}E@J`REk4T-SsJ7))<RkWbfxlDhj%^Z{D79A8=e|dh z&FZ>kEsZ+W9Lod^*Bm_kN_SscFw5ahUGpyXB=YO7S?ZCM7`-Wa*#d(#J6<Tu9eKOB zwWle$H}05s+flEs@~xjP+%q`kG9#k<+&76-leo<<mZY7Q`h2t}TJX*Dy{sG>`y1@S zJk;u?BA1ALTJ2JAZIyo^^>+B1hNgtIHzJK>x*w(ed~~zmNl(n?`x4i^7Z`~&_FP<J zbH?C`;f<)**<w*AE8@@PZSP$x)6#lyiNQq0OY6@2CeLGd-NT+cb9R}t#nP8LQL{~t zozJd3a`023!Iu9_o99RPNzO9*b?Da9V{cVGCOO`^(o=s`<U}p+dIMwDZ%Z_jb>CkX zPHAOml)pCZfx%Sc#jb1YG!<MHo=^#`YxfNb`EJk_$s4{X;+W@*e2(nC>;+l}BW}9C zG2UgeV_!+k)*_kWPhR;oCf*Ar)U+(uO7^j?+Hvj5@~>Qya=oYQtVG@>*QQTroO@$> zeDahGUDg@F)lE_LZ|l^4ESS5MCDlx4(vt+YwzR?x%{^>kag+BbSgf|XG2_9<Nk31_ zP?66*CLWyB`lTtI|9!K1gt*Fg)hk&ilO5XT>13~X`EQN8+U*;Yo?TN;KH$AM=yWsN zrX8D>usX6gEq!v0g}ur8!YhV@4u`g;#n(nNm82cEn#z3SNzBpZ20!aJ?K|Yi>wTJg zvi@Va8n?z8zwQlcY(Bp?30*6Zo}4$$Nbbm#C(k8!`boB`^%@tovozXWdptY+NmN$D z4Kw9(kN%s^vtHZmUYviHfp^oE+lQC5T78jQ?a8iecJ0;GX`#Djwq0Grc4R~0hRr|g zBwd$(ay7j2S|^4f`B23CTj^?AHT9L@+6v!UejnL;jip`Z*eQ;hmoAMr(i^=$Z1T|- zJ0UkoaYpepajykwZl7u;eWyBDZ{HHQ=#a0K{@T<@F2_^e+MHKuEN3vwNL#_b>20H1 z{OY6b!S@#kFU**7wf5xavuE~fiu03bnxDTs=@VDHo5-rln>p9MW<2n4<}pqz^_sw1 zf7NpDy%`T?H)=CEm0C^uyr5Wn{d~6EV+HxwH_we(u=w0`1<8FqZlOMT?K8iYsPpgM zy3Z?z>r$4@o1?X^;!%FP4iv1t>Ys4p+V$3h|FWO&m0SP3_~O@v8qI!1g|B|!*wfE; zXacYCefGD^b1l|3&HJvnII_>?<5tJE^+ri%cF(ug$F8}0J^G^b`f`oQSARB1=H$Mb z?3}Fmf9~_WtF|z3SA3|=fAU<Y=xkO?<(146HPPqmv)<H8x2~F*c`)jE=F3@ZC$EP2 z&6zN%qI;tGj8|uBDj$fyJh659GmRR)@cXaDBemyW&f{G!#Fp07e2{tZ)a)9)FJUT^ zr%dh3_<wEAe|9nE=PY*9AGU}KGnzq0wA1v&b-AZ6_$;Hoz0*(p5j&$XWb$xgnD_<m z=|bL8s@vO=#Gi398c%mz%cZ(~Ql7Xv50j+<MAd^TaZ%`CtaPimFh~`6FgA38I3G8Y zAyie@Y;i8=c<j!l;u_4;4^>I2Zf9F5ZqCeTG(AvRa?bW!Ys7yUGMYd}jep$}H(+8k zneG@aqqaTpq4;n1=~luL;3?`!+h4vE57dOLmx&jaaDba&BQCL27qX~EWjmXzL?APx zImGNQ9umD!9m|R&j<PVB89@C~E>XxcJuyjKW4m^X#7k}_bHnLi=i5w>c+CX~AD`J0 zB0Lag>vD-ToYVKpOM+c8W&4GV5^r-s+Euqdl9$Y3W-&A{FxVcbEE!S&(xA5e^km6G zW=2zxE9P#$HC=LcG(`2R&yt?ZOoq^DTCVSs_1uur>UB&~n>m?`3?PBq!6UVVo5|R4 zdg5{kwe2AiQU^If<J+p+t(2sMc%czhZ)R$Vyz*{s)agF$?SgloYyV<*`5aio*d)f7 z#C*?kX6%GklU=9O;w)zW+4pmWQg_a_G!w~~7k=imb;S5z`{vc>WKDiK|JI&+d%Bg5 zy#4$A$_MXXf2)7LzWwd;`Kn+qm+Y_KzTNQi(qO)QvP0tUx3d4wBfZux-BSOm=+eJA z@=Hnry*zr4Eq`8J#W%fv@84al`VOyMB-;N@_*Cevtnht>^63>{nx+5kjo)IO-Zg#l zMYH}YkFNzQxBINs+WzeQbqD`nVeT{Bm%nK2)ss<W3fjB=MY>;)TGq_%ced;LD<}8W z&5U?G@8tJ`w@iH43iQ-PLmXHb!e{?atH1Lp=YmJWanY7v-tk70>Z@=6yV25lFz<hM zv`~xb?f23Vx(;qN|IdHxf4klPjk<@T@YY?%*Fr+LcC)TMvi~Ia32(K&%==vR<t<CU z@bDb}7xwX;z`Acc&IOfs9<%b@a@j_xJp6m@mG8&y?mZXqymv?JO#56Zcgg+p>$XLU z9AiCEFOk7<s5z@CQ}~6MzRt-RrC%dg-r^Iyz3xj73wy|35vyZv0ede;ZQAoZw(iaf z)#4f96ZhNX$!zXnN__UEC3~*Ok0pWJ$xgFH)>+&M-SMYZ%H|Z~67k2*LLB;w_?9f* zA}kPgi=iQU;zW)sydi;=HOjgl&F>^}_yn6AVg9JGh^0QZ;?@ait#51p-P++c@qAQE zaNHWp@>cytLMzKJdOzT*dOmsk%Xc0krBgbdKex+eZPx#E@P^LgCwum2ZJqNmIWvFC z{rNW-XaD<kQ0U6EEbbc&g1x@+%^u72zb-GI{UqbQb@1h`(tO_6|2%v>m8V?psgdn( z^E~lHAgKL|{E@fs_t&4%{qMRs)m*>ni)(DFU)x)e$(OWTwN|g%bx3)&YNGKBTfc)` z&)@nyDqSo8K;7b3lll=p#v&)fADMpy|E>LR^RUnEl(Srd&UE&imCRfgY2I1ur?S2i zzLed#>(S$N9q0R>?4MK+W}o<E=jqj#W5YkK*N~~|__Ou}!!fq4@t=z2>Su(j-=9=H z>seN@es@-u$VyEu<rC{N<XePVBd;HMd_#H_!=bFA_II+8y=<aacAM=Fn)Ymg+|96= z9FuphzrVw>(*1GNex2L^)#UuGOZ_K`MSjrwD{xWt(w(9UCTGerH<_DU)~ZsPAD{Um zZBJpk+q3<8TrPZN5nFooq}4CFRz9m=6vw4J)!HTcY+#FK;jK8WmHG3g=v4PU%HWCo zdTYJW#kJN7=XCTkd%jjQOnWwQF;mzA$uCpiHhsFki(Bi>iM#IgS7cvq(3Y^!Sh;Jp z&by1NKiie4Jhyl!$m%5VZOX*6yQ^#8J-)lQTb-XX_Vr2SmMg0>vWpL{onDv!*Yud) z*SGcO(tV9Zmns`F6n&ejzHEs{>4Tg1-M=!O{oZ-aGo<1CtzQc-zIj-5lr7iG(RJ}v z$sGxaPrO=Zt=Xos?4>Mw__@fyxi37InH^bQ`o=;$@TPZO3Y!OC<kbnufjJ%dJ8m1F z^PMZ5y!hyfy?a+H`CdwAUbr;YtLN+kz6lF@+`lcXSy*pi;%_=jCg!mo=TzGh?l-s= z<_El8bM4cO9d!pMomx6|#r#JJvMZOWC|&Tp6vDf4?!y%}#oHs-ER2bq%Vc-6VVV!C zMbC%kR2$Lm>eqH#U0)vbvs=F{<%LGIwgz+2y(*qlF;QGn-<ebSicd5c%daet$dvr# zX6ah{d(X5)IdK{7dgcpaVQl@|1%f}a@g1tkDSXAY^vq|6c8AQgev7bxC5zk~k3Wp@ z(Ol~-xM`x7$L&?pTZ>98yp}!}cx$sJv{q@Ojb2kkZe!@1MHBDZ@Lw&k>{f|8Dbmh- z`cdungrls7wW`e(YPiBxoxf{nrD*6aV^>$2;pf4-G4FQq--tp+&U$k*3+}^$0e!9} zDsQ*Gzcgox<L1m0GIMw&9y-rRK6El>%^Rm#zfR~igmHU^MDedZ>ap#WWv}Hb<_|jR zt7X6K`?iQ{s^+Wds#(7zOm*j9343)QTv9eN^7Xe%dTQS9zU<q#QRB>$d0kn%&ea@p zDnE7f)K-Ta9<ABh+;<ZSx0{`_tAAo~t|sBVHv9R<O0QOiZ48{-n54YizU%OupDybb zy!Y0Rbe)@|#w8OKaw%ywe`5N_h;H5V>S^<Y|HehP>P@`4DWiDfrfDZW=C6$q)AM=w zzHFtbli2I`r*<~Wa>Z3#UcFx8*xV4k?<&7d+=_Ry-Tx-}WP4iRg18fl3ciUcZi#iT zclv!|#TGlB?#(ln@N7LiXUCIUot<mkB5!6-)G_j&@}pdcq3#1?l@Qy5OsRdghKIX< zl%)DpH2L236f5M9@S8qy+Mb-Zh7}>#%f-UB_7uIi{H-MHwvb@u&aRG_KRzxY&laCu zGsVsM$j%2x)8xFr=*-&Pc<{zrz7VeV>jhJ^%_Qr~ZJC~Auecd<``J`WN#k9QO{Oo8 z*O^=G>sI!>_VJsLbj{h?kp<G>JGJNX?VR^!E=$8apO#%)6GN|k@^h(+h`8U^Cs+DJ z_1wb=TDv~)dJ*{~&G7idVpl%7Iqz2gjCs1*`sp#tXz`QYd7qu7p9@&+pVF}<U-!Z# z+t)S)#lIKt`cfa5A>IDr#<93P+tuC&-t`O!WO*unPXBOzeZorn2i4ma&$QiNq<O7F z;rB(;%s(sUXJ~dEyQ-kKzm-46^4tEip64>UYc4;3c;ZCs^}wT&l|_EK_XCn0g7!!} zJ9J&^TB^9<&zst7viM9{tD_Ds`?YeJ?jehu6&tkwvIg`T-49<TS$`?cDE^ep2~Nqq zVN33-#+K^*3@p=c6nDOPvc_A~!g#L0@rMhv><>Ac3I7m$nX>Usde)K@&+kVke@fjl zHRToW?xc&kqI0aXY$6u*bmZJu|GMc*-AUu^TeoZqa!%1rab7RoedDGW-%p*&L$3Gi z--j2jFgw%P|FuJC?vCqWbxra0_rnTr8L4f1c%bf`*1~J+g;Y=Xp4{{y>u|PdoJ`?Y z?^l;svi!XJFkx-ssb}{Ki?=MldHH&rPjYzl7t^nEi?{F}HhE<#ZgBi?V`O%li(3EP z<=W0W%*BljXFOi9FXsOJ&^L?|t79fkt=7L-xbTXBv=8sE)g9qUa?u{_R$*5b-w&_9 zcz<TeE5nyE`dcn^N=$zsw6O2xt=vs>br!sn`Tq6Q^5u_;Gi-Nt9#?%)EUxLBzM@2Y zz3h%!$4@^)H}Usx`?hh}Ce6Al4>Q;N+?rvOk*KUaMbC(tB_Z|xE3bJm3`LhXUz+a! z=;+H{9x$iJX?GpFYPtW<M-OGET-$HHhF!px*Qx$kVv|$DU5A_T9||?=$`k(Af0=&0 z#LD~fqP}SfPE`guoE{H;O7U=T>{{m-KljSRS@qLRqCJ1u+CB~L+{ET}K>1$AuBp<# zH&#b9oX}J9jL}t)5)7BS#gVmB$*k|8ai7JpRcmYA-gB%G*;*|w8R7BJGGf9M|HMVh z4p;9}pM8Bn{o{Vg?M0g0`q?Yhr*E`U{v6e3QSNAQa$T}u>+?C*0#84Q6wZ@0ifhQ9 zdj6;q*OyAc^GCLPG}h1Db946wCcA}_?bQuej$GTc=iig0Td@~(-g!(~w0ZN}QjzJ| zXD9xf#@fKuX=B}XYU`vo?(<|WItEP$D3E)0Mrfwy?7Ol1?*IG5s=j9rqtf(`@lqn7 zb~R|>VZD)&1#*-0YSh_2<(<6yo@>5hUE^`ZKH<j(2O)*+uD`^dB>4A#-&A}fIL>~F zi<eg9)6DODWr8MLx#686_Fey<zTJK{N9z9>vBYl0)l;_X-~VvT{==`--!F52zrLSn z?3VgIv3hsD`r@9_+b37edHn6$zxSK3F+|l@7h5{oTxMVEeC^glU+IsZt?T@z|KIbs z*gMdYA>~X;{MLQ<Cmg!i<rTT&Ly`Hv|8<Q8YJJluv-*dW=e}bM&)$>$LeF-;+E144 zUWxDLCYLamPUMix_?&ulzRE_0J050Hw;wQai#<_F%eCD2{z$@Xzp_(1=lB?Pnm&-w z{j0wBVtwAajRg}0msC9zzVzh&y>0i+Qj0&`uD?A|<>}jRxy5o*F3;Tmf7jpa-#h0% zcUZFN>+O@4F(MPX_B)47%sh4Tx9+MX%5!Zr9O~4UPj%ya%Ar`R`RK=j0}_@IC*nVz zoVxBb=R*M=D}&SG2Nf3Yc=X(d{U=AKL4)Lx$<oa={1G)_X7#uFT07@2`skNxa#D6y z$M=}1MIS9U2a2dnym(>i&wbC*J1)$qJO8sP|4NIpaPRRK(hEFg*?$D)9Vq^9_VTf2 z-IpIPF3Z(#(^9yf{O8z5Q7tzsU;bu0o7aw?KcD#T>R<7RZI#^#<#~|~%%+-89oRLs z@9cZsaB}`Dg@s|8leb(qsK2e}vMtyx-0ytPwAc@m7AHA;{POqYOfyFH2KI`cZCa`? z8fN^{Trg+q=4J9)ZPJrUA5M48vNII!Tly}^$D;3unWyXIT{jLrSb68z0zIcY(Tk5R z5xl$k#-y9C=4I?XZLDm?l(6>GJzj<xhl?2`=1ush-t;)b>50_(S)tR*+iF-Y)T{0> zevr&|{-dSO?{@+mOE(K$_p+I=yMkH#VQayf>;<#cLl^iI^8`GZD=7bvJB;xNV?t^{ zgMYGRbGFSZoi^tN`LgNTeyaSNxWQ0Uw(W{4&$UZYJhy%boHPiM{!u&c;<kCM_LEGR z#X1*1HE7?uW<{X*1`9(@`yGD{Yq#i~>v>V{P<J8l=*B04eAz#fk9_cHWk1H9QF?xU zxNynGbY7W<tO0g>k}ei&KBo1r7Fu`cL*jv&{cIoR+%DgD-lDWz{Lr6^bMCv&3zSd# za*EwJA%*YruYJt|XR7Vq95`wkc*J1Z^_uj6$D0D19(W%-WP5(<?e>`UmvmBAeOW2J z@K$|>)T?^lmu3sLx_pZCSowN^o7TR~_ZiGho@VA|?C?Ihb>&0dQ@OD>tM#6|(3%^V z<aS_Fp}+cTE9=Z=ulbAg@6D^u7d_uJ*>R7s=-0@9Y9ZMh?{ROwb?V@W9!ZJZs>3EP zk}m$cc<fR{*hbsxoY1O`F1{0)XESDI3D&<f_HI6YBiu?bv3_FjmfH9uTl#NjG*6V) zmR-Vd=F*&?Y{9wHuH-FY^9jCp_DX>&Cy#ukE#s8_uRizJ&fs;(4)Z*_Ch6TlZ+kn5 z=(oKO@4R<8TXjKv`uXO!Z&q>~?~$I(JwJIqV?rsH>VgTL+wV3$)mgbP;-q!)?Ux6m zmoA(dmOH^AAX#JGlhWM%^*`;8My0&&>b$q=!_^tDmnGb0NKmZd(t5Qow&9&)_HOkY z&t<}<XC3cPShKuxmPMxNvB^hY9h+ryQze^eeqWyB{NJ5#Y%Aw2H4)#myRfx4Swiw| z-iFRc^WPrKatNLo=iZjocJzIY1iMbIZ)eHo`B`?1`x6g~Pg-4;Z>agSjOkc?pDSN| zeU!%)Q+fYuUrkc(S4m|WZ0BF{@npxIU_D;G4YMUeU(2@pPZCpMd3*SSlY7L5gjcWZ zHtIy$3(QCg&|^2;bGy4S)7{ropT{jeWq+*Sx(d~*%#VkgM6#Y7yS)B<p11v#h;Q$b zJB*JwU0S;PZFA$2)4RNQHq>>$|GlIzqrS$?dg|Hlz3*GY@(xWcZ(g1z6`OT=Lft8o zfc(9a<06l#@E<AaNUnI=qWSCH#Gfe}4;=rMDZe4@Dc`-bkFQP7p7?vCrXKH2$$)F! zvhneoAIomsym!e0jW?5?bL!UYZP3<i-7|mQ4#h1KO~phE=A4cTn;Ys;nSW7^Z&On3 zCl&3a`sGvqZeDZ3vwFU0?8>gV^IegXyZR<AidH$w)i6oPS#W#l;-<=o_2LU$ExlRI zEkCx%pItO}%~h^NEk%|`F7SVxz<l-dgLFRrop~RP7~f5wY`K5J`wf#>H`FKW`kfPG ze8cQfSbbX9?A!Y7jUMUUjhfo&ZwfA4Vzc<KJbR&5^WDt)qd$zAvV-*hvOD*@d|dX9 zZ~B{>nIh)?yXA^rJI-ra++n$Yo6yqprHZdxs@ZODQMo%|&swS7ox2vT<aP5?jk;e| ze`8DSeZkY-d*9vP(q<;~@aXm^`|XS6XPunX)AL>Hg@tI&UJv)^FGbHTevMsnGu!gi z^IG=39NP`2hkL9yRg|e$xuou_*OQ-d%iGII@#FUEPxnlX4|&3Ezd2&=q5qyo3U^6Y zee}|Eon!ohrC3+#ZSRcykEOP=idORa=~c~3-R=<hu4C;P)@OBBn^oP-dmLgO>kH3a zaMbWd?yb15v!%HYzF2<HW&SsTZBt8`mOYoatY?4xLUy5J^UlnLsp1CLZ`Mz@iW6U} z^4((Dfq%X{8;+{zIvjUC@-09zH_pz*)7ZAh{!h~bGq${+txoTc?|y%F{kQL&{}Ojx z`?j@c$7_>~dOkYK0%lFAc973uJ{;7m^6tRAiR=M^zh~B*P|G&Txw6Lpd>QZd<f1Df zwo7a+r{7Rt-P>f;&#QH^d$E*<mt{hIz0bc`HSgR|zr!1zZPVLh=zGBK`>798mcH&? zdE}X${KU|J3p*0iE^*s`Z``+K-J(zBIg_pbn|;@OJ<mM!+aCQ6=jZ?T-F~}!>cPc) zEz_8Te77Fcod3qg_OHV$xj!XqxEkttg3s5+Y?I&oZnamVjrOwUZ~gnv@2r2u?%{hQ z=-7Fsps5%B>{%1BbwR(r4AV7Hv*RCooA3O(r`<kbu9JdunoHoqGoeM7)p>ty`lJ8I z!uh>MdstuGjYaM41u_hCO0_1ozyH3((X4P=CEKsh@&DMH1f1)@?HfjO$SB<@M=5ts z&@Kz`xSXZ8)E!RH5?8hD)}d0TLF-XLjiBv12~v@qka5aYnNnfwpdmr<zCIUbLqkLG z0@iwCLo?)t($VPCc`Doa?mpLk#lGgnUk0|g7zNIPa?d^7n_iSvZ|W2;Hvjq8+iOwW z)mK-Rm>BjHm9JC@QsS3iv}(Kl>>Cz;I?tXwd-Fiejkx;@AFA*8r!oJ3<;{Kn19O9n zpU=G!XP58a#JP04`s*1YRn<HHe(Nl*FMJwv|I$*G=YEf$f1X^VW>@>~@6-Jb?@wAB zYdzciq_tRi!Q=z8&u1>tUA*SV@eiCPy6tk;H?kLX+cJHqXqDr-Rr9jdroO_{d%|o1 z9SP;zsvQR+3wF))laah6`dt6*a+lxlUOft)BYw{5{=CPweOHaX9x)TYy`g;0=KL_h z-^tze(=zv(m=*2Xw%6*XNzMHEO3i;Cw?ESE`7O3MI9n$8_rsP6GtZq-ii~@DZ=DUV zai!O{Ym<%{rXGt5FO<Ho>7C1TFtud0&Pv(WAJP&Qsb&8BE&o?d<Z`35%pzTGBZhlH z>8+;>3l6rJaQ&FH@bE`F;TIKFjPb6D3h{!4yDpn9Xs9ol!rC)Q;cu#q%B6*>x+w{l zep^}2;pt<Mi(28ISrxd-Y|)!@Us$%E;R=54KB+J4qL<aIu&E}VKTjVE`H=Q|wb%8m zXH#$AGtX7IY;$Fq{r33n^KUEaXf*fRKE8CI<5Ge|c-eJ%POpo6D|ElR3pnb}+`j1P z1dS#C=16k?Z(*|hQ~xQr{P+GhJI*|t@tiM}O{SMg=$x^x$2Y!GZt*DV<J~MFcNBV> z>Z1<ZuNIoU?kS)8(V0dI)0gInKTr#sa9wIeSE8zu>K>Pf)6e7#@??~9Qfl4pUGFSD zmiCLY@8$!kzbRblUxY;_-!hw~?aO4LrMW9(-t7zXcd82U_OM%jdUm3|xbxT=rsGe` zzc|`5-92*qvv7^8YE_Qyf)z^N151TnH5F$vYS+t~nj2rWN_b-VSV1<JSE%Cvr;3JV zq(Ebg%rUKiy(OZ&T#S9WFEj*YxA*YP|NUU^{I8J<BM<Th-+8CDo5jp2BW-S^CMRcw z@Ux#MTP8f-@96$8E5~Hog^qWJ>s!=<el-P8)Z;NZmL_%mi|wU?my@ovKmSp!&G=h! zANLG5i*pB-FO<%BSnKdu<nGe{2MXQfH;1j2`Ze=_WC?S+u*%CXvq~gNr<Zmf<h;Ek zTGG^NpZcOpGj~dG#Dw)5J$UiAEU`;ib7F`2c9)yx^ThUPS_b(s8YBw~FIG*olVGTC zmam+8CrGXP<g{sPm2XX6`%qF>J<cxQKyM}gIiq83cXwQ4OJ=G$9a*hWR{io<%4`>} z!oTakm>iRzp<3UpZc`gRf3o?3FNSJM_ju{oUGGe;dG{%6{a3qnuFuK}^=JK6e$zC) zm$8cB%-aTS&1Ke7|Ib`g{Q6zbWZOK=IU7qGmex=E*SL0Zy_nw8zmF!pjaQfVue1GC zu+wRt+_V>G^Wwal!W!mIzNq}R<Gr`r8owX%x816Dq$@l5=44KgcU3>KB!Jg!v#G+h zRy&6IO>Ke!#y=`f&&e=zb$Q5Bqp-7i?~U+7?Uzz(zVRxgB)&>CH{W<=W7!saCa2tu z32cjRJ!hCx&t>J-;QL_7&V-1~Rq`K8+59G)<kpi*m0NE+Ws$|7{fw&@{i^Fr%3XI) z@c*?PM#718+%=&)dOBu5^p04zXZ;T)F7*#fH(ua6S#o#n5!tSDs$xg3uf4x@&DoO7 z?RU>UZZ?X2u5evou}@gat|txEr=Hz<cfF`D&1k{3Hx*0M{dP^PFH8}8Ri?k_hg<Y1 zmAc(3k|O8sME{(avSCrJ$&8tm8Yj|Hg3T4V($6?Ixmvlh>do(tvYY8qvXb3L?VIEF z>~Ocwb$Qu~EB&iiUa#%g%e+A&O0LnUxpiC5_R`En1#Dtb2HJj$n9d7rNRjfk|G9>X zd3RN`l*8?vbrX_Bm6j+~*Q;;uO#Z7?8^XTbNjdv%NKt+M)$OWVTDzoY&nw$<+S}@U zm!s-*v!scS-Ztcl21~BZO^cppe1D#%K&$b#RGl?<=7px3X{=g$tS2>4RC1n&rO%hc zI@;lLt5>cy)Saui%}ud8*ZXel_uRD)%Z_B;&-~O`-&14eYNGi1H}9{i1DEQ%9`<ZA z-)!QsWKPzqTP_cKmOebVb2(G&mTBIn-t)H`%)b5cllSD=WqI7^lUIK&>t1fO;-u<| zZ})m4d(PbS_q)ovx1jLIVKLJ_j~Op*8}y>tXLHU8v_26rg;~pLLFkga@cxG$Z$IsF z`r>Bzoc){p6SJ337K$J3nj3f1xopb*vomAed_PvDeUw;W{m;1MyTEf3&&x6{Pu9#e zDm_qnPd3e3<L!}ypAMZiXYbr&{cOV1b2^1L4yLx>ef{}_-sCsgTP}3kN=?|A=dW+v zc=KiITl<1J7pHHCxqC&R)4}Y=e)j3f6;dws_k+7r?dP36yd^>Hm+ISdc~ktZoPKlF z_VCL;hZ`^Vbxje>HqOvIyd(QmyGvr%T_aF2vw)fVZ6#OWf{dj#n-YJB3oY3t<}~#| zHBYv1|H93w;wC5WR`aj@-2G{f$*nV)v+Ht$b~3+=ioKyRd#1{ov~wn|?28;Gb?E7? zlYX<^s@^iIGU3bw{eW1trmpAAFD5_J_Vrp}{i}K9HSxf6AqA^)+&-RbdC6qF&$FrH zkjReI11E})DP}CYeMvDef+2=KTYKu3#Rq!%tln+mn&MmQtGHYG;*nS9uU<`x+-bG+ z+t!5<>?hPEpDgIHUa(PVUf?0&$|$)RIZY~p7QJ<+O}Dhv#}@2t|NqzO)RtqdXQwqr zKe(_)S@^}Yk5i+)#T5KEDjBRkd+4s!-eb3d-`zhE^Yh!&4NbAjOsl(B$hTh%+hrT_ zJ>O1TRBS4b*W8r>l|L@MncaEdO!*Z?<<pYvcdp-fCM&Y2K<<q~j_RM-^qOaDm;ALj z<-@bLWzFq5%g%1o_^tWAp0D+>v8C7RkNOOs+HR|amsw?p{<!tW@5Ywp`lWIc7ruNw z>C)-R?0ftePjqaQT(l;Ant7&3pvT{IJ65NdKSv!My=T=-w@&A|6Ysb2@VXOIqaSZu zzwd8N+dj^(+qDDx_x;)Qc;8v^${wYqzJZU6cg^SX{9qPQyn!)$X2_e3zv8xXzIy)t zAAkQvtw+-fA4`ca85u(6HeXapl|ZM28(XE^xIhghwR&T7l)22K(cb;i<~;kpho6z( zp!G^O;h}S*nL~c&_pmPyV&6ZzBs0nTf89#<ubZB3O_vexyuQtC$&&YrJ-UqJ_UUdY z_`}{U+HE?|a{r#Xqiy~_er@{mY0sZOvm+R0T#wQ@|Nb<egvZu5DxdG^oj<;Ro`rZ* zF>n3vxf}c+GCx07ylz8a)SsFo=kxx5|NOptvkzxu*XA42&)@57EOhEukzD#=Y22sZ zh5BcLFYLJQxv=?)b$fa9UdwGx8NAo|`|LWWt0>-I?Y3I#rG;|Hfrnq`{4)^N^oX7j z{UUmr`llm2dz&_0vR$$Mkdv5?Rlzswf(J%STI<dBu-D%?l(A|>fZ6&3OU2_jJ^uaL zQxiSoi=X~~F)x|RML&0G=+1a#SN}i#XYtRNA2}^ErdQq6Y@N&F_4NHAV{ap$%0G*F z|1oa<^D#5$=f9;dp7wNKk@$UNU+n4cIo?$p&lF1Qcs>d^^hjibwx8zB7QSqktgR<k z{J7wjt#_Dpsn&|=h4pKmY4bjL<-lg|X~@HpukN)z;{6V`?3oV?R!y^be&7}3{oJVT zX+KLhP4n_p@N+oKX=<`$j=&1r$zfqkn?G=I<sS+uQZv0ZBkauMY3I1xO=sLY+_o!| zMf%e5H{pNGZeQ%vTzstb-qErXI@VXUZu~X8eO`21&<pvV^d#M|g?oQx)$2z7*(fcy zxaVr$iA|NsKlZ$QTXu=#X5NC|c|YQ|THO7j?x(Qk_140?e^yQ0$;^+1o93olxTsom z+fPeqH+ylF*`~_;LM`XJ(EFWd4xKyjuEpoUBujOz*^&PO&)uzFrt;_gxxKTG^%uPR zYxVxs9qX&xt-hc7pWt9z&3IgAN0$DQ`Ue|t%QLLKb%WjFN8OU&Rt=8ZeboCL;ujd! zwQt!}QTFj?RmJx3fan!cC+8Jvt6q*Wy_3ev|4ghnaL!BSnriz?b9cTiy+8Z5)72B- zdZM3hSh~<myTV{A*ZD81S-~NfIhkFbi%;Be;dri&wL|jt!wX(}tgCHZ=IA@i`F>H_ zTe%JO-BQ=<_B3WM%2TO#+d9!l;Z{8RJ9+1=56&dVu=CVhlj`!ayIghR;z^Sb=i=JO z$F?<PZg~7+`JDNTI~&Xn*fHO<I_6ufp~lL8E5NdrNqZ)v)y>vL6D^j^in!tXW4`xH zF0U`K3RgZ&xc}2^M|WoV<{ka=uB#K=Is$hVWWHk3^{D?9(e-=A?L#2v$CSus^z-hF zJbYvS3vH&yGt`xzI7Lkmkh&EmWvV){qdkV<FsH&X-^dV;-Y3F0^fg^(IUiBHz$|p| zsa1zY^Ygm+RSPek{x#)>8^5-+|CGf+3>I!n6P(|FowaD~Y41GKGyFVO&QG)6el6WU zIqZ2;+MQ<_`5)_5<9~5!UM&iqzvg!NF2h+|&v)%w*S5DTvbtmC#*|a%&*~hhPVL&j zw=`-&(94Y;Z<lQINvhi-tZ_SmEj>JGR#w&pp>@34ikezCZ^it5yZUtcua^AqD{EE# zOP^-$4U0J6^VVzI6_bs%4_S)YW)<mvD-ZL@-On{;TBpm(|50f*!u9h#n6FOEFLbn6 zG|f>xFT<73{+Gk#n)x=C!Sh^ndMjQ8vcDCz3OFibB9eG7NIEs=W9nzS&g#tlm+#r9 za_+vL_<Xrm@V9^s+9%Sd&w0G;&$lUOqn4;Xar>Yi;C-M$BQ(0&U&_ou*RsmYy>soE zx`;0RM88f)eL2G*&c+6}$q(z(?`&DWTj5(7=i`b{IsTYc+nYYN-+Ga8XVJWfC2|ud zCripoEsLFYe$z$mV}j3nLYdt7(t8%Zo_O}20_*0x;lKKo&wbH;b8Pl*!^neT%@d|Y z`Z8+%__pJ{&!;5A1orv)c18kLDqnt`^33GsPQA#SV?4otFX7OYhAE;xks3^oC)95i z)RFVcDV9^_jjk|wcu!rlr}f;8-Pz`8>T$2mhC9yxr5(Mw%1iu;_sxjF$E=gMRFqd4 z^UOUcoFCkw#v5(mQm@q$_4ba{NA0uQ3T-ZCzFgMv_0~?a6N$_lS<98Kt7pi*Dt|ih zn6mD(lr`_tRHklmubkC->T1{m$+%l5T0dQ^&r&m6WMObO?bDLPZIf3Yuy~fkVlczl zj5YAmhJ#$86%tOjwp#BLR}VXMw&euJMm?$3pRO0qF#UNaZT%&i)Xh%ji|h|aJ>v8< zdC8M`qiL%{)!LZeQgyqdx9*9?S2JE_y4dlFC)h^$li7WB-e`l+2KR4QCv3aKdhzfC zt=YaE^Rnt^D@QR%8O~GedY*87UcSd+F_*0e<I+r*%&j;$<(;r>y9EPpmHNj7;dj@2 zW+XdbJSkoKI?d+!wgA&jwvVr6rKSGX@wv94HJT@}qA&Vvu6o=K*+|Q@mLk3Yr5`hk z0#X#}`Q0@H&I(??qLsJr?6!k)kK}TUCRWVdG>7}T{GLNQ>;H-rOXy~$+0Qe+yQ^(Y z!mPf4|Aj|xE{=*ZzAE>AQxosAPK#D`<Lk51_2bTb&gr^&=ipaf&Gpx3-<Y$i>rBI2 z9#6qlGku?VaBXwo^qAMab$NGO%u{xkHuwJ=tD=kk^%s9D-E#J%#)G~uXKqZGRd_q) z=90v1g{#2f{B&l%fBoboiQM<SjxV>r_UUe?`~DwwFYhcp7k$XI?&l)?y{^Gu=IpxX zCy`&}&i$xYv{mrltCObRuA85oyXkR_yy3U-Qn90-8oSnrzu6>lFvHz=wP9D}-IVi7 z61%S^a74z&<+du%Tcn+H>zw_HuAI&j7i_$gk6k|PyHR%C>Gj$z%G}0h>er^<GIg9{ zl5<ezu$ISWsjq%Ew|49*y`HgRx2lqS`7vMXhcRVuirjpxA3WW3y~FWKP2t@52O9#6 zHd)m!i7~u7?}?{#@#oJxXZUy*%WP8?xiEA4&YumRnm<kOo|1H!f5F$ZwdwVS1@B(w zCuONrJFR^<kMpwK|G6S(luBRP_gP%7*B5!bPf|hq#)jX#6=_#qiEJ0&f1Pv9^1o`A zKYw*sG!ed3rs=xw1mB%AGbZrao3tkeZD{4{e6rr2=ldh`z{G5+z@`Ni9B){UP3(|- z7iE+^YqtB6MDBMI#j0!eRbJ`Nzt6;faPI*NBg4aYEz&BAT@-ku3yxbz&JT+0tX8k% zewSsq=;fRZzmGk2_^xwExk6(@-x;6!h#B+q3?({KH18i>9=&4aN#%3@wp~e>@Nkty z*YzC*f^`>W)-98)-_R)#;s3snk?W9i<1QPol#pGwbG@3Xt(G{=f3j$2NithRQ(EPx z1;3up|HmBH7M%}ijTxJOT4QS4XU~*c!!f<ER91C+&LSxf4#@WFTdSmYu|r0-c5RY6 z&IvkA0z9;}VviIX=hP$~we44qO2u+QG=`m*`p5|$<l3HdQ%Z_!`l8P=s@qpTmeS>7 zGKa2c`~Ozz83(h4nc?&gS7nu^KWCIysJApgJ@PsxIzQT6sP2Az;XJXs?7=ccZPQ(6 zFY+~yWj?yiBRHXP0Y{4W#;YeLC7ix}dj0+Pi*sJ@FcdPW7CC*-?#7}%k8`cYhi5+g zFy)E${i!0>A4TV1Yn||6=57hz`CBhb?3z@Y-t|6mR|@O=g{L#7uZh)^sGlDk?tLu% zor{h96u+h;-&P-K(DZuY!ki%T_K1?2=E}(~8WNh3KUo%g9on<BEXcBQs@{*L%B(j{ zA!lN?a$o$+SrE#&$+YyKMX_$I$Bdm!%@fXEI8Y!IT>HX_RqtxHxb3p_cBO#^TdFR- zvRqXX$o%_?UQ|!4=*y%_4Q_9g4A;~*Jv?e4(~#_26J+(Z>zu^Oq!%(t%M}?i3<~s_ zSoW>h#%48JODZA9=w;TC6+GXrYs@vXYq}qGu#=0&$L4oLx?_Vx#^x7}(~E2yyjc@A zA7J~X@`y)AS6JS8zEh2l_3D}aYrN%R)=%5T@^8_^-6D>8M;A2(l&y<MWLOi?Hl;(W zeuB5;<f}_!7cB|#@Lc6$x>V0Rtw}KQz&|d>lY%zurU<a!-qCfFrFK)Pf{22FQTjQa z%#*AdAs*h(F3j54HSe^`!bx4{ST9}hSSDaHiCe`@TTMqKgfo1SyPC+UfFmufmmKD3 zPoHezJYf|>Yt+t=2?tMY?T>MMw0262e_C{=?xgxoxs1RqwbjS=9ZHYjuHmiW`0+#h zb}+{_{<qt&aX&h$mU1im_u5)>57yle<GXTMO7+?QiT&8Cu{>w*j-(7VtxzSCCXt1H zl^v5jR>+*$xM<(OBmPOe0uj2CZk!eFd&0)+-OV{=vS8*yjs>0d2bY_z$<*6=)xCy) zp%6RA9G0)r^-&kLxG@;=N^2<;3Kh*3_tw5(rNp_CrElhB%>|BUqvF3X72n#!AgF1O zz?0Uq#q5dTEE9{2N6TldDSf~bDJ^X2?73FIplgbe$;Zh-2M+4`ERz=4l51e&!Y-t< zYTjXm!;7v>V-3=obt`Mq$yq0v_)iMxUc1)$`C6K?;*umgVV3$g@)o|{PdybxCVzH1 z&$7z%z!A<<Cr?@&5VCxpDXF{tY3r8mscgO8Sz8^IUr)||qr81m#$+xYkA=EotR}8W zzIP`tIkr#5ATpUVC03|pny=rq%<$T$DNBpkxXKn~E%dytz4T`N7pAvsJ1ZA%-L~-= zQ}q250p_B+CWiSFdsC7e>N__^)-^Dk)@TlhoKdt$PsHa9&y?_2feSmGg#WLaz<-Ew z>qh?s!wV|ATe^a$7O`D)xxB^nA~#!y!V2B3C!L*H+7_;4X}`#jpqInEZ(^%1$61FZ z3V9iBnf@DF9XdL#J{&)PYnJF)m&|64g)^l^PbD5znl0nj-KEx+JB>%EDXl&uBtdrL zPtK2~@1iHhwCOC!e8R@UaQ4cNY#F!Ltf@~oI8`@%eOk6XF!9~Vvpor_7pJu8rx>xk z+Ype$!+j@t<>QPXU;Do$Umjh*TJq&+(#Dwnefw>qKHoOqe0283>8C%R{PIWjd+q<n zFXk^keDU)1O+P=ew$<AIs`{B^`Rmo>h=29po}7H~^Gn5FA&=cmX-^;Q5M3E;#eMat zg1uekC-I)DZ82+pGMW{yd%ie*%DzpRhqRh`*Lrr(H}_po^;N*yrJAka{#^b3{qxtw z_wD=r>gJ21U#5S3@gb+isCL)SA4Q)FD_BeRYyP=$Wy)jetSu_(UrKyr{;JH-bbqhW zv?n96qM?3*r~BSc#hq$f8P2?w{&pv|+nT|nYk}|whPfAWvI@R<HH)%q$+tA*gg#i@ z-L+3u%OFGVa7ADU(>9eKH~6+?Ry2rAJ#u$D%k<3sXRIGD3tqi>MfLWgy-#21KB`@N zC-3F27eyA8-h2-wE!$>@HF4iC+^p7qH?N}MgXElpE~)%K>lYiR9=w=+a#E~LB|F1< zpJ}W&j@+;b6c_wDlZkQjUx5j4m+i^lefx`UVBmxh!LWdkNrp$vCagHj-1289%XQNw zPY$Wg$=DsEaq*!0eMX0XupPZwWj@wh-cH$9A9NzCHevVezm^rY)0%`TG;TH4u2Zer z6ujeJ*qKm$>j)>GH5{h(0?T$ScrxpNaMFQvKE;=HIuF0@dNX(1@>{`n7HZcXrK|J& zzPdGov*eo9l|!mK8^x1KJ1>4?i!*2~>|{RtI(jpQ{9Ml2+Kz!08+r`Bdj(WI+BkLQ z-=Y*{8TMy&LO;_2K0LB9>zs1%-X8gwJ?5pq<Ugh@+hbF(=l|cg7yW0n%bu&BF^%tG z+?!h!+39;Mo3&geB-l1F#wlE}dv-7<>c*j_#gh*4u80ySoT}(3`}ItE;t~II$+<k= zgzx1&$P`+0D<H3?D|%~t{<Q2}jqLrmo-T1_wyEnr(C{O4X4P#034wiWRw0iRUq-XU z9p0^05Ye!kLs~8)>iw~-JBuDn`+H&Cv3hqeDSq+8j}_Lc_v~M8^zq1hyA@}m-Hnz0 z`QK;@`r3C~#&G6orC2fk{-u2U8-B2zH#+o8CDzs8^yH^p)j@~&UT8m3dJyp?!m{PL z92?JvGtBdN`SlIHpJ5hw!?Ja0o1)!^?G8&$7qb7k((+;cbAxaOQ*jr*!i0wA$h3K% zj+bZFpQx>T7qoywphnB-lTF&`zOOQp^Q9i~IkB#uz!T;wprFIPE$s7!BWwj5uH1he zJ!w)>>l@_?)0ZZp%T1j{S?v;TY)?5b*Qhvu(x&bUU-`J~%_4VwO=Q(mIc+{k%GZ$p z$-`S4|EUEiwuLwJ9$lpqT-0#f*<{*TjbM2#>k9?^v+MIqPAM}9Olx<Lmk>?R|4_GL z?}8(72NvJB^Fnw=@<o^8MN<<!3hbsYWXSu@bTH^+&Hl9GOXTe$W(%@1PJjF0!n;>H zzG}HIO;Nsl`0%q8zZ|EPZ@s#bMO@NSi)CA=s{-4{()`IY<!$%O|DrPCrOh+`MpOSo zwIz)AN>3E*PSKd_SHCS*S<df@u1!V!!BZDLRB@Iz>TtaFU1Ti5zoSA=<j7&J^7Cy$ z8>ehz&{p>|XSgc;#Ic?2$FAvtA<t(P>FxYkDmc-8HGgyXJbPYNgZ!&fueNGV%lZ(K z;OZnPaWCQDlgGU8i^Esj`d!L6ytjVNmW@J}?T?gJFPOC@+;jh{?fYibuhO2q;ZFV> zrDQ9GPb=T#uPLoxSdriF`^+m*&r9aL#(~KNoE%0@eX6|t1`G}Tmo9x@bE>~7;K;gj z+<*8sxx9@KZK<^4ox<m$wr0waIPJr%Y_@$>M?&`One@;|y}&5s_@>Vc`D#32)<M;o z=D|9$=T&*~f|_O@`DL}jdG+5jhwFn^l-PLRV$$L8iqPGx-4G;rg>!1B`qw{4Cb`9N zC&ga)ceQSxF>87Mse4W$VoMSaR(w^hlJIevdeT_iV9L@px05|yM0u_>W_j3X-XtIx z`qpQ)^t!Co%U>F(>a2I>k*nZ!O1!m&X_v)B1DjHww#v`TRKFMPu76Z<%Ar=`-GX)X z?g<;-WKEN9*s_%Eq>NZXztiX096D}#DS55sGu@&kH}Is{9A3L8^FgV&*sX&VS!exT zKEK+Po24=H;>oqEbf-<^{^l6>Dk-#N_p-)}U3}@Mf6bhF$uDsoqmlA4m#Z5X)*cVq zG{JoGI)*3#jbyo5hw94WW1h*%aB$wZx#(uuT#b6gU2<CbiTk$y@60auS^wZ@&brul zQbP0EqCYt8eqTCOy4mbhUFxxS>wew)wV?dU*89mxd)}{c{9oC!LLe-6drS9Y+n}Y^ zuTC>tB>Z@BhPzzlZsgXSJ?Sq^MB;MO7TyV%b^Wx%uQwG(jb1#9*^(<<H<?M-d1cer zm~362Ke-Q6!|Fer-ta+gYC%r%>`4!;4|r)UN;*G9Ehha)t&OKf^VHU-x!WubaLw+& z{$U2Me_}?(U*Sn7K4rVvcf5YEX~Qb9iGj-%4>j>@JNxwh?`?*MUw&!am;1TrLDK00 z_ZxdxW$2$fBsR|=&M!5iVJ~<2p3e%=6&$~QI5jjr{CcO2$Nb=Tj{27SlMX##P~ZN_ zFgc&KlCf|7MhS@of7L1bQtvRebbXkRTh6es#5MTz+7)rJAG4Ql=r|s9vr%Z<r9~CY z6Bb6KE!e5uz?k*iJU{5hkEA4BmfdfAW20ZLU0?iv<&AlneU`cFma*Jl#ZYnXXt{jE z8D_S1e_8l?3L5mJceeSr>L#n!+crh2AN^*UTs41sTC%Ip;py=T3T^M#Yi_w@`%viU zm*<{$Z_6}a=6pPhYkj8szE8&_d$L!Z>3hYut^b73tQ(RwF8fqGd<2(zrgx|~$z=Us zf7{_63yV|c4DN@oo7RbQavi-r?|;A2L+gwqri}JB_D}AsFMs{@)uZ=|FP{8aVPsox zH}~B1=LhHd>H95v_oJj_<GwjQ;;+*;|NN4~B7eA_FJ5M!)t~FDUncFen741%nXu1K zZ+^LIzWILL?7hFL>MH*{6TScXVc6t(`KO(^PsR%6es@|wbFzZ)FGtINzZX5RN{pJE zoVa?^qxmJS`#vXlSUDU!Z~y;IUzq#juOC-N&zrxezO}jYared-?N66^uv+l;9BwOJ z{`~mnqg8vNdKG#ue?D6AucUIDlzv^UU99f;>v=VM=IM&hm(Q20`~B-t`^_htm;e8B zyzxg_#*-~e_Mbc6J^B1R+xMKUMyU<HeM=*sx@lBM@2(42^lTo-&M5xYRolgnJ$ccT zXnSFAU4Z0w>(<%zK_4%FnzX}TPyF&$=1q&cpZ=LNBfh8a`RUUq895I$A3f<&^C|4_ z!8b47JjmH)H>02b+_B9^4<3E`^We`fZ!#)3w5`&a_W9|_^^4;ymEJ!)bopU##Sg`U z4oYUBimm*U7QJ@mDtP+hk+{IIKU<SF+GQA5n0szEH~wB#xydSilT_2I`rGq*)4ET7 z5#MeVTf1-G+UJ+g^NGLy{PfAD&bw<*Kdad(s(tK-6U#cL_?_a~+s|2;Y)bf$^y_wx zoxHhC_0Bqf#=PlQ9*E_b2VC=L?{7U?Dj}a(SlM=Xdw@!&rSa<K<U*t9`F`P>KbGB= zke_?*+2iiu@AF?iI$P1Zm)U7sj6Z*U+KpDl{_SQv4<+9_wP&x%^Sc!V?-HkfelTNR zuekOOM)5o&+gZKhy_xRQ#W!Rv-hBFJRoO;6`Sn%4>Up~gmcQQo(`=oi$O)tW3rZ&4 z{-w6BRNGZ(Lpz81uVpnq#hTrB`TaO&5i8tu=EuE+PyM^X>Q{W;opdA4>i@c5e=lzS z)?}7xag=}klNIeh?;e-p|6X)R_tLwX?qjj9e`&<c+{WJS_xD2JgNL8aPSjerSNcMQ z+MHXRnP;no?tI_zeV^Cl<ICRmA4#zd+gmsPWz~*H71KXfC8+E<pJQWp{=vd^SLUm{ zS-tO#KIebd8)A;o2^ez|$QC#L?^2t&Kzq;xy`|K*w+l*72d!KI?|yTYk^TVQ)Th2Z zMqPRW7n3D)(ni=wx)M5Rv(ZL+D>r!3W_yo^^lnb*ZnW*WLDGjfz>8b9hek^u;{e%^ zxLiVgyGx4nO2~oL+lBI^_i#)<R3)W8eTIq*-*)D5>0B;G<L!lw(y`nSy<d8yCxA8+ z7Bot$Z(lP*+6}xxPHnry66rJ^h_y>LNdJO5S$+Gl-O{(YK%48-x1TsBeS@3H)DW`8 z@AxI@Z&1CD?@8~6=$(F&Pn>`I_1DtxK?Z<^H0muaO^{dO+>JSzr?OLU?{Do->@LOe z4Q+gEZy0N&cjve9uUdC8X3gOrkM5Tjs4GvN85x>WdUipeuBNsmkK3LIiI{2k#kK|f zI4*Wre6j4tyr16~`Rkg_uRk5XPp|%;bi9PJpXR=r+W0t$L?=D{CX4iG>#x_>F07wY z>?K-V`|w%!|JI<l8dE<6Nc{NAwg2|@`ue}WlXxf2VSae!jkwo+{R>XN%#%)E;IjKP zsV**l=f6jq`}T3Ht65!s>YnKy--nu?{r`T?H~W7~e`9OKdXe6oDE7VvhSdApUR3+B zoWEj||L?Am%{+<AKOc8ay>9#S){JhY$$l2=_3O_V%~nykoblIR-~9e;9hD`X${Rj1 z->>le_x1Is+fFT;vwp@0cB*>m$aja#@pyIV{{P5-JO9LdxoM*0x8kX*SB0nZ>M!Qy zN0yj5e$O&I67<;gyygm-r~s!%r;vpuovs2)g=U(1?P&VHq~-sXh<_i2>ptC&55LkV zcv3>?ee1#8`Zve25511z{1G!b?{6``-37Znzf|kA?|+In+P{2KPi&$gXN%AQd&W%0 zV!fhUb~h5Hc>47m?YXt~+yiB$=6{hX6=x5;-IR2$Nh|EouWvsdSctkvm!5v%^XuL8 z$i<Jj_DncxQ;;uyeNn{hh6Bp#J=Gf?+|$0b*SFx>0bBcw5BoON^FDBv2+UPBJ(iyy z^tANK&4yhQTbkAE0`hOhP40*giTa#AZANUQT1EcioNZ^a4OmnJb+Q+7WC)tqdTTws zs-LbMeD0uh&r$y$$5t=Ak+>;1P*dY~M|6Ud%l-?6JHo!omg(r!tTjyCZM#aT-@EB= z)|8Js|4ehqzpQ>?Mv|D&o%%gnj!)XbYZWA@ZNPNncXP;8rh??Ptdh0TCsT3*jyg?f z<>fhLbzsvfwyCr7*^L={3YmKkxXnGoGwaBb@7H!|ZME@F)X<1p{ynF!f&bu~gBPYa z|M~G@yWpWof^Bi3z5D;o7GY79I=uC#<es!jW9J&?Pw9U$Ct6;*>EOz9sC(<4`d1oT z?_Zx-?80Sc`}l&=tzh?i-7#-Cmi}rK>e{CJFD<lUz4SdH#rPVVDa9VllE)ucNBw8J zX+AM(-Iqe1LtR=drv<rYs<z$iI^?5pG|p+K`1-t*yS6uz>>Q^W9@u~G^CE=@Q#Yh@ zoGw^&W7U4i#EUat>=b;uyp?zJKiNtr5p&mi12%z62H|f{cD<Gsoqn3rL#!ilLZ1O= zWnWWbO~Qn{-EOIi*BYFNZ!DU<W2IW#MU~p=G2UhRzcxmwK9*Vd-sa5JAP=rp&sT1q zWZKt!_VVwb<L2#u_ME$-S>RE&cCqjUU5_IPa*p9q6_*su1#j@b^5F^+n)}mnuX4S_ zl~|2H+j?t`nKuRQ8nc&3ajANUste3uY*n;mQqY*&oM0!Q<SzX6m))yEm-`2N0?k_+ zd>$}7bQ9p^ym9%AZdKd9|4$Ze^WDFH{+0TP=GSg`I6j!SHaj+8QNaQQ?m&^8wQT1D z&T!3nX4s;2{Hx%{=`E{X=en&*i(E5V@l;vLm8*hpUh6m38*HzhJ$spKM<O$y>uw1J zW{U!@zD>GW>0JC*uGJ(?xxT4<#RS>Sah3<0B{%X-HcOqwS+vaHQ|ea6cg0tl4O}jz zeVVLkqa<^%GkDp08#U%nrwty>D+=0e_8@8Ly7%fco=x$XI=OA$KOW($A7($$K6P?^ zd&S&8^=E`;MeUNBk?L7LdD0SJqhRBsKD@nlPd!Ake@|mrK9xtcTmD;|8slu&1H1|1 zbCOo{H@uC{eqBHFP@TX7p)*fsYBkt8D|+2$6m4+sd$Ro6`ExrTX(g{&HZkY`!-~}2 zAfeW}$fBh(%<~jXp2x*_np-UuS{47Fvw7E{f~kLt_Q%fU>{hfDXs)qtuRoK$<ls%^ zj0Zw%PKZ}naaI^?XxVdN{|cM7FGpQ74K|veUs?C0`c&p>2IH1cM^3g|9AOiFReY>T zm?L|`>Pb@2YqN*lS0|_?&V4?4x9bb3<$3WdwCr{!|1WMj!8OC6y`yel^0HswGiF-X z?Onl_UB4uId1t0}^2|eZsb{9=xUB7|zpJ?7xXz41$?0L$Zp+rh6wUr{XY#klRr}3j zj`+N-Za8(k{_L_4kr{rS4;p>U6T$;p8Z8>;CiG}r&+F-A`4*_YqCe&x<CU|$%9WeF z&R-W1@Y-zpgyE3L3U7{0rMpjLNT1xh;O$Y<)VX(O&gl5cocyS8Cg-We{t>6&eEaBc zs8LYAH*xA?4*Be6t#6IGIVt`z!Y5~YRw^0Hx^eA$V88OOQ@`7eB^WpU_1P@3?!u92 zw{GmIDp_~&%a`xpw&t!exZl@%Wm2449;dVOkHiH}ZygO1N_sIVc!H+%!!->Yi=X#Y znS0MkJl3#DS2Wf;Xj@!Yg`m`l)=vvn!d_?{J)XK;$h@BG#-y^g7t5+D++sDN760iS zwrX$Ob}m3Hg*W-~inW#28&zUtMal}5``Ie@|9{H7dq=Z~3v;OUa{nT~>%Fr(S1elW zc|kVqysyu{UySEYr0z&C^nRsj&zs<VuiE6xMWLAMdO1lKto&}>db{PZXLPHQ+h>m5 zVS<;hZ8UDpee=w;Ug-S^mURAQ=hG+LT6WcZ`M%10kMrw}pALJmv(`ND=KbC$6S@1A zMP8h_YvZ0bhOWx96O$_!zl_S5|7PMcwmUD2gu<4;boc*tBrDj|DrY;h_EevP8nZ8X zE!!~PSUkJ6Xa3Zn{Z-j!vQM|VUp@ct%F>IMwtvx?UV1qvz&6b7{LxMG>UU}y$1U!- zl;`?uw^Bt{X!PVeCl~t2&D8sT<Z|b-2djmIY8pFFmQ+2E;&wim8Mo|)ii$&FRD)aP zcN^AAnGRJq(ylK%p%wV~-3|VwYp*@&On&Kld~4^H(naMrUg&sh9WZ<U>}~N&&giw~ zsa&u6=H9>SxH8Q5`Q(HE1qSas6IjCQ`<v%pJK^ehBO!OGeXzyzMJnF|pSRUCExjqY z#C(q7nxE`V7c$OfWXE4yY`Q;W=47F`m9JTiV-z%WpRjjqshw83edWzE`xBb12d4Db zFZ+?!;lefX%}a(LXa9@ate<OkJxsoD_(_B-?dvM*b>f<D{4JL>t?>J)?qm7OH}tR6 z$>#diM}Mwxx1X^o=1z$f^U;`#6~7otzke|hn|1uCx6X3m0-YC!7-SC``UuUgDqmJ$ zRNyG5{mN<5>b`)TYFBT>zL+oUV&(RXZQ{Hwe*>SHoATOCyDod=^2utCsR=?x#X<A5 zwsw3{&v;a0W%B&Mo}R0Jlm+=7hu?k|^GEAjf9#1DTk0*RCKURf)CsmIkeDPPIjebD zWVqGj_4*3ewgd<LFc#QmEnIh9&vbvrxx(_`J4{PrPc4t_`0{>}!;|m&o*$Sp4D6)* zi#Vg2XK%dkEO^Jj$@0Ho*N>R>3|vaL!g>5OGc#UZE!g<BUuUl6q1er=*1<R8Zv@uq zMNM1%OWNSr(%-l0C7+canL8oz^HcV;^7{O_j|`sedQ&oO_a(6SmIt$E^Ddov=tEfF zC5G>ouN=D#w(;M2dho~Jrz~FoH>7SCE`D6;U6{Fdjr`|1Q!VBmxHtKqv#3PFLW@}I zN%wax?3&uS?xF1KO3}wReB9g;buPa3a$HvMV3UG%qTd{AzWR2Rdf9H(`}^igI+SRg z6A?`PEz)MA>gZ{{MW!=vZiUApo~-tBNAnrhJz#e(sQ5lfVH5Af&I5IZ?mxTbcl^Hd z_`}b(Mf*PQef+__e7(=zeMepH6nEVCeOMt<V!!x}HEb1@;WsoL4hP6G1P6PwTz<PZ zw(&q+*@C}s`J?X6kiEK3V7qety&Vc`bQ{x{c8mYYtlzUg%whN9UTK@Db_Uaxm$95# zmb=-|I9MVz2VCDU?@6niyfKaI_u+5p`_2l>{AtQjc%$}GlI!2$@HR*JJ$X;E^`kDo zRJdMM6q2V<QJZM_c=6p?i(j4(PW)_}Y#I6{qFCAX=iOtut;)d?N()U6)bfSpZ}kaJ z%wp!8Wc)UF#?L_JuCv{~TR*d#Z?gPh?R2oeaDSQXdk)_1txd&-djEMAHMR6<B%XS@ z?CA5~*|yy#*YA2g43`jnXKwO2ym#HI$@c$W{;%Bi_sjH+-=sysJ&JluLlfi%{?!=o z{3kmE_dO4P!9U~SZ$_RPjtM#wZmSh@7Zu!oy!S}^+0_64#9YN(r@46E^{vj~soHf{ zw@zjCzN!r#nZIg<gxl+rii(QN4CI$RH~;ZSyyCCf-?zWNT(3Xj$syJ=@$&cUFC7gQ ze)+N>f+O$Ozfbe)^XGV<+$q@4f2p=x-eP-WF>kyU`~3I^o9q9)|6cER&rnyD;dz?9 zMg3j}ZrSx7y3fNtT$=vp-zSZ?+dF>zSg@pXZQRa^tp%p-`L2J={{4IMaq^xeVy{Xa zOLk@1_H!`osJM5iUpY|d;-ednwx(7Y@t=95-8A*I@}El)tCS|YS@hTQAL5>`y5Mup z<LW8VZ+yi$-hSe#sXC}1IH~@>-CsLH(LFQ&X=r^sv*Km$B{!q9&i{VbU*5kwzT0lK zn~sLDZ3eG+WX9D0(;9c)NxQaprp)I%u4ldZwA#hy6gqflnHWULPR-rKCAudisIRiJ zreXf-)sNmh*RIK1x`=7hEFUrEx_bHh^Dn*s@xAAb@VrXTQ-&QA>u0Y&`}UDWlC@?) z#vD)P|Czl1BTfIl7XNkje|_}%Xp3h{l#QQnOGvv}#J22+!-objp_0Ex#Wu0{a(Yhu z+bi_>=l0%-vG&<VRhc7<%nIAnt_elokg(Ktb#?!<=+Wb@-D(C;uN=C2r(*hEx6KTC z^)D9Rv|enNsx$dEPx>m3S(<q#b=(a?S@<6bi~I~W2(>z|)3Z`mI(3!6?I;1G{^N7f zGZp0)=C&{QGv?e>tGws#Q%#qo^gpFGuDl`NI=-2E$G@#ObK}_3`|qD9bhu>rrwJ^+ zwMKCE@fFiPy7Hb)e%5`hKqq}m;1TaDmoK*QKe%3hW>N2*ns8~kFVbH^Z>>mgoHXAu zP5bPFYPTK1pDr!8xY|?J@l~6(&@14H#rNwuwu;5w&u=bx%6`arPN7eB+;f(^7WM-i zcYFM26#vm|QD}Mf!M)(<p6T3;Mb%Z7i*&C~=Bxg}bVcJ&Q$NFQ9#JN?TtmhCC9GGr zDExlf{kbCcdHvK>wp5oAzrC6a@jVx>iWnXGCKBRtOIY9yqviQTvyC2;pIc0?<~h9T z$;7BXFD6}CciQFVi3wpwUgDXu(wnO)z4WUu_3An;E_&}7S^Z;~P!XGjz^1mTv)85A zoWGqad1I}@-WP`!?4Esj&+a)>8Ps!`B+m<^tCo7jM5owmIrJ6QM`UI9q(?M)E#LBT zBFhPV$M^XyrtB()2W-+a4^*$Zv^QsFy7TN~4f#bv2I_mP?Uwh<KC{Q%--BuAS}|sh z0)xQiGekGNHhW)W{lU}o)^Uz5>yteZz4LxYZ|V~)5#wr+e=~FCJ%)9%m&5kA%XqKb zCH6%9lW0^9Uy<qmQ0K$u8TCfTmz+*L{;5kfF#65RxCv+4tprkAaxXJqpLFHrL*^H% z?u(YEa+>Y`>^047f5_&PJ({mF(&jFldpyKp*PV@L*56FDJ(Q&Mrn>F+&F7CB!YBQx zOxq){Ofq17^Xk>HVw;M$o8CR2oO5c$TElsqXO42MP%J&;Rur-2%F=L`8~qUzBI}JJ zUll%{{6wsNTaWam`*&x#c$`dKvuDo4H%b~>uji$x9&ry}dqE(voK;ovwphbFwS781 z=4>G!UJ6t*2MHXi*t*2I<=(8qOo!iZz6$8CUM<zJ!9JB^ZQjc4n4+rhPOB=IwLd-= zpL@DzML?BOLrr&eV5fqz%#F!YFDh-~DEjGCpKS1e+jjHUjuii^^Q~9LGuwqL@Gssb zzG0Kul9wK$FKqS)ZTqBqZ|`i?%GAp}^(WFe#VVtoyzn?P;e~pvR}#P5KF6zvY`pHt zg*u*e4Cyv<u~@LGd*+5({dHz9!Y6H&of&_KdD`FC1%Exaecj<N+EMl)c}17o1*iIT zA?)TqIv&;EuWZkMXlFWq-bR+wF|j@_EqNbwcr)hDm75}PrlpGChVf1G;-(q;Ar;$Q z)*PL`da8-TdabG5k7ng|IA5K*TAKTC{?F6~PlqVW^?Oci`QyH`TTyLs!aM_etIpGw zuf*pCF8fxYse5@-lwwMQ+{fv!J^O8IbZ4x|PU9$Ws7alvUtii$u29!(e@H&LL;1u% zW#QF|OAYR{+KXHam2~KA(Oome`TMhDtGCL`k9_@=`=`j;V7^k7`K2olE&mjF`NM`i z+a+vErET>Sbu<=o^>=KDzZdLgu=?+L&G%d9&ewRqcG|wL_vW`8Jbhj~@Z$~cnQx{i z?SH1GyX%CC-t*JW-1eGB>#JMJYW{t2lf2ivdMV@E&DWdF&s=5IaIxT6Ghx}PpvJ29 z1GgR|XTC4q6diF|MSQhmy=K{Ih0XR^>V+?V&b3OlIQ!qp?9_EW>%?DYu3hzTdGWCx zoE8*#I+jLlQaoh$e``nT$)IlT#pWr6x3|1aKhd_vJ4N-x{H(q4I<GQ*)l0Kz{8}>Q zg&>2N*QRwxl@9$oS(K^ZZy(qY|KKG@_2Y|eox2{iam1dQ&bH-z9KYIzgjt7Aa3<Ct zJ7#eBbWoNZPiLITz5NT~@>jonIbl&&xBd~0<86XVkIL^1Q9ki6{l1IAvO_(`|Mnj# zTay!iQ0w3wFG;H|XPJ3|2M)8gXkPzNe=h%x!uEpA9`ghLsQ>XbRLknOeO)Z&60kN< z;Gx0;hXo<;BMxPMys!UIOTD1BIwb#QrtWFUHU2NITz2F9xb&UA?2p@)95?4Z-}mdn z<3$#$e$QK0+Yss>D(u|C?CX3;X^v&BO_}<)DU25^zq|{2C>3_(Y7&FsH+LSXv<DmQ zbMouItt;Iwdh*R}M}Esit&!Y~eY<(jXIB(hGGuE1c{Y13pG<|8bOw8Bcy7Q$zWg(i z`U{HE&v`k-+b2CLobxeB`>HY1U!#;8VNEN4KQ7F_6BV+Dwba7)yAspng;8e}neP3l z4E=M?{3PeuJ!M}N3+txLyBAb(EGqH#{T(Kv;x)Se>QAuBJARX|-2Py~6cO+L?Ml1) z+#|lI`&dn%{K%2VsXMwjD0O>8S+3u%8<M71=Ot?KDz7@#(@`MsU3JFp>+h#c-uC13 zwxXxEuK!G!%_zopuH1K8{%oBM^KV|$P%Reud-nBK*^*BWes{l&d&+RP>-lNPEn-%i z_s%<UweqJ^+^PR^^|wuzD6U)eL&0hNp-m<WYQI%={FW^Z6coIrE^}uB*Mg@<f4lL{ zYmU6Ta@Dlx`KPK*=c#*czV$iEiEroOjdyO}<STk{b}ma*OxxP0G4nG%K9}xrsx&#_ zXA==7&g-yq;qQIA&NeOnY4x7UbNro;S{HLlUttqI!msoCc<?$ydm*cO-rzk;ZXA!l zoc}TTd-;zu^-s#@yC1lGca75eJKN17*3GXvxi8_bR@=10-fJ=^?w?~EJ1y5;X_wLI zbLk7CB2Js@9&|kXK;h<`z13FrS4>L$rwjA#t?+-<u$%un!}b7uZ6k+o+suD79@<{< zf3r^L_UFIyer;y=i|%>CWnjLdpE<sMvDiW1Yh}#)!cJdfR@}5<#SZI3TMgfeZL3o` z!c(xnAa{@P?O9qUWj{~gjq%$0<FlQu{L=|d9_wa&3%v8Hqc%0f=w-@@UGX0#$lbe` zH2=hQF((19uN*1|k6yd&%W=Vb`!u#Kr{nm!?)b$9xwk~W;+m0kvtsk6Ps_jU&ePO* z@Gh|awtpEvvq;ao<wxZOjrRJ6dNjRpS6$@%qIc<~!!P5Xm+$qvYILYC_-K>RqRvzK zx?%|#c@Nj=is>A4e!D(Bw_xV<(2Wd&-}rCdtnl9>9j~KdlmFp4@0znq|IO;(tK@L> z#4d?|++$~?!|dJWSe##~Yt-qV8f3KNtm8aR$yTE&rS-ObjpbXux``+yTq|7L!p;5o z@58%mSN-yt9QK{le%cB)-4)&X*=+XqwI6#vbnC3N+I2qq41eYpzH2iNUOk_AWW84O z{hBAsct4(0OYQ$x8Tadig!$#m+RvXyG<}IZ@V!zg%HiFzn94V5a*e&yZx~%K-5!<M zv8?S|x9`=g&abcI+5WM-zrCXX)F2mOG@lL{*RMB4S@?H0#=Bp6yWqa(;a}th4u5Bk zICHQeS;1Vrn7c@#H*9AL|F@&{_m7%K-VG`D*6rVLq3?=P_t8h;{*z|a&A#FCP<}Sg z{GPHSyIy`~xB0;u_kVU>)%<_|`0Whc<^<JL?e|l6n=#?Cr@-?wU+R9IH}|q!9#X$? zyRiBFKhj=X7l#~jPJHl}_1^96|M&eb-qhxCuCd_Nx4D;IOICT@SNg`Y_krs9m+znU zzRsWb=(cCU)9P5w-B}sX;dXhm{g0pDaE{S-Ri1sXQCY#^=5wLi^PLZ7&U$`!yYA)3 zorZJc=S5_`J9+(FjL6KALzUKsr*kGX_|$LyTEF+spNvftCa9e~a7?`BvFgvyzrWme zY1y3hYq3tJs+W(w+DeOwSC*dtKmVWY->7SwU%Jc*xa{ebv1DQRuQRfSOZioU4%Pek z{QtG|_m66)wz)hTuT;cncrRg7Q&AOR>(JJ*PdLRCXH|Tc(fjJVV*-AX@74vE|Nk`k z{QJ@vwfdKrswdw2eB+#b@bvAIi_Qh_{E^Sa%);RBU}GRH{_LvlkJ@um##16z3*=w1 zJ2wBhmW^?Q$?qrUrba*Li<Mu(HLYRw&7!J%tjl5ypH4g;$-L^%0>`U7jR*D{EK)Kk z?OW?^5ID(VgG#6F^e;~~C-bXKP+$3Y&Tn;ZZ{LT~3vOTjUazIewZ>?{o@;3xD>Y^a zn{cdPXZ?R|%jT!E`3$z!X1zAO|8)65tyL^*&Tq@Tv|_f&a|4~X&%2ryZi;qg(YaL< zD;GLZ_1w4hE1xt)C|2D&@>F@>mM^b&^Sx{eYWc{xLbBCScl`>#zt!1$;x9=4Uog+@ zrgYk-;~|r(+ciGez2W$2RG+!%>HCUVr@!zW=3bO`De2S!+rM*ym){A#!u#{xNuk=a z9Z75#!__>`tox~xmT596w*Ht<*H`6fCo~W6`rKtYGbe{<V!D1C$A*Tzuk7^-6gyIQ z`hN*!otdfNAouZDg3POC4XNXg<*u34E&DKU<vw24sR;*^kH4CDtKDwp-u&oa^-t2x zJm<UJQZ$)zx?q3(#ktBs8<b5oe{Y>v#OE5r<8%6vTD2g{kws@Y1Xr!*p7Yk5p(*}N zzl--$J7eh*4h|OOXOc{hoZOYK1>3RhoaAb}?NI59^ab;c6CUl|xP3zg$H!-nWqt*I zFckVT>!tktFNs$*71x^;C7lsEoKu=KlOeA@o=rpc!-U0x2Oel_SYZEQ!uJ$~o90Fx zW{G#+$mkm?bT`iO=Q?V;v2eLh7sslP4hP@W+aFnM6e0HX14Fw6lip%c*ClWF1|CuT zTw3J0fcx{^>4zD<Z3#4XsCa$kT1|DKdB#NPH*X%bI{TfoP@As2@r99jM!`k#HATv- zlf~w3aH~Hk)cW*`mbHQ!tESzz17B7#>|XkQu0~f%(X)NZhFpFb)52QS^QN`s`Yf6^ zNy~8BgbODhs3z$+crn%Px07y&ENEM3#k5SUrT8*~abN`FGNv8Ub0=m_YMG=`bm(pP z9yS^7JJSvt{#VXBC>nfMMAN9X{m&G}-$yEfwI)yJous#>{=v<jit;%T&!z4Ow=NXd zm;ErKS<u4t$QIWlJ`c-ykKay@%l1AlUigdg+w7SkM<uT(#GTqu&=7n<(B$p)4LV$F z8V~N-_@4bn@Y(M^zt?wWs7UN*?aAM`By{EmyS^>_PTZ-pf`XSBTzY?tvENe4Q9>zm zGJ6V__AlLp)R241TAcN1&Fh=Yg|Fmhtk-6);8X6aHC`#zC)~Qw$BW(OSq4ik$5!8j zshT#A1T7LG-+RTpGwRo@ed%Vs?9>B}2O@(1Ze3BD{vu4x`u+1s{F%QC#lHWVB$)qg z%9OrtZ{_H(k0&i$X6APAZ&CZIOU;u0=ZvaO-4>b`67_P|y}9q6OmcV6t<T>UT*|Zh zrHAHRwPm{MDO|NTYeiy;9&6wHRhj8;f55Slf33(9(>Lm7_gR#Sa#wnU?z7(>9nyKq zGU{=_nTR+2=7JFy+3&eMmN#9Mp<KK_b=r>|CAUNWvd!XpWaqhP?Hle`(-)uq+E2Ii zon2(RTszus^Q+m$E*09G_rjmF)CSkjT)RksxsoAzzL3`ScL&{>IJfS8TX1YM!}fD6 z(j0mc57*zdJmt16{fj{O6mPGNFOTkByyLL^P~iQa7R?Mdr3}{3H~g4$?D^+^R_Zz$ z{i&^2U%o3cS~}^{<f~sg_BtMX*(8%3WU_q!@xR=PkLygF#B<}b1w>CB+p$dj(2>8# zW4!8>TEkw>_`|RBKrM9s?8`~A8*61FgF9?1qE~yeY&*)(Wc-2QRi&YWy@N&6rpx^L zmD}G~zWm7`Jjwfh$5s8Uig&tFE>thevMJR5RggPzS-<JFBf{Mu!#e_IY&&4!Y<Nm= zbpWHX$;LId!Nqgb?Mss746E)5r<T^5yGDkdow!h<ekSWu$2-1LrgHXpF>Pg*D>7*c zJ+h^BhEL++rx#~={66A4y{_SJ`>knwTdq!7cl9uX!R42InOfay?*CuDKW=;cUf%^n z#RZ*nx}QBQSu-cmxo4jExgAa2r7fD>IYQ+huW;|bGn<q1G)KgJTdOD&Che;ZtxNRp zZl8M0=i$Q;jwH7Fu&jykbG{vrYAcFAe?>9V-)>cphyF5K?&oFQKR$BxUF+7Ikr`ZY zQsh(B-9ioi0O?8kCp8NFN^U0~{UfuH=g={gHS#Yeq)xC=;qTZa8*;Gw>Dm>+i*BBk z2|Lwq;kDK3_iwKHjIS@)K8WfhTJ#-Yzczcj>JOj9%IHNhc~fE<W9xJL-`;q^)Vyo= zGm-DHThCX;E|5*1%yOz_gO8iggf4??Ig8S{vV|rn+z4v_qBLRp!rN6x4t-^o&3Y*C z@^Hy((Yy8cY-2^A@B8KH_oI5#><Li~?HjF~Ruvst`EHu~k_~MkOFI_r2@Q*Ue}0PS zp9+q(tU-4Z>>5A1w`%IFp7656us)v0rd-b3`?mexf~xKt-69{IdXD6&82X-@%xUvr z-sw{fS6tS{EzO-<5K{5?fsIR};+(ggM<#!^T#}l#M=|DEtE%xN=M^UA>LEgn?uWfN z9}2EM+Hu<O_vV*BxRmxS3<+D_$zr;z%2jpZu9FeQje&kK)(;fjl^s5vj1|6+&h@=M zXL9;V?fEx6e(z!4_j5vy{e?#Mn&KBX`3q8BbZXq5zCvKF-}ilY^IF<tZ{N-6l)wA_ z-O0CiKdigeB$~G*?vm5Ado2fM9(p?|_~b^B^2F|~CpUgNwYr7t;*_ATZ_M5+zuP8n z^QP_jEkXIY&trE4t;`Fb=QU@;UZ$f`hBKy~p8iy;{>(b<c^mzbIc7W$S$5HVT3>hN z$LS*RJBsF%Zb&YUzB|J(-ovQ&xv%TWRmKr--Mp5$KKQ|YZC88EjQv%?+(FX(|HHyQ z<hbqmZS9iVs1__y_2Uv_zvZ5Nyo`yj9|$+ze!fGrg?GyC=c2oRGg>`Px|O@-@3Vzs zLGue%-@cmb@a=EC=F&Ws8S8D;xEJPqd0-p-yyRig<-KoM?0FtA#%w*mZ$_Se8aq?J z%<U`xCe04BF5Oww^vvkd9PUH6M684*Ru;W&XqV|_kUM!(E%uB^-u%y3|1E3RFg(BW z<oUNhF1`3O=V$M$GoM^9?Or#lac7C~vd>3f9SE^)D_1}5eVb*s`9s<IenqLIFWLN` zo^%OLyT`UgJSVZD?*PYHo&3Inbgu8u-mtFwx2k_4^NzF=Y}z_<d#ws@ObfI-cg?u| zjOWfZg0?TO@Ax9W&f)XdN`1)4Jc~uW%Szq06fW&+=kM=JT5~t@im&b)E4`$vjE3hA z-_P-~|FVSF#q!*i{a>fZo1Ssg`<FAlY~Qv(u2u6D?>^j@B~;I-{YOmfMN8q&{22@t znE@5Sb-T3FGo;@1>8&=D4{JM|$JH;r>zDkcS%0+-tgrtqTx2Mx4{K6`?}E3QAR#b4 zOI@0~-sEsCqf{-&1fB`ERcg75HrzhHa|!=s?>hTXmG0Rt>pw}e@K=?cUe&rad}35x z^pQgk=SR$mnZtXg{poAzygy9W_fNC0)vN#09n+F<P-17zyy@l#TP~fRous(q>E|!~ z<>!_@xzo{a{_@^O?&oF&>mDvE`tX<K{@>&F_WyTP9N#jfzQLmT?}I-zEF8W5DknHt zr`tU{f4P0j`;L!~eLb54()G@X&3jf5{vh_x-v=*e+o*Aru9KLXw?Nswp`m-d?w=E# zlUjHy52v60l#+JlQtOFRk304;d55N4;(Y$tx8mVumXbK#x<z*;%+k}?a$5Vt%cl5% zN%j9?>Y`_G-P8H6tM#$|%!;Sg7a=3r_fOxS9^Y*ztspif^4^xVb{&VO`%@Fv9Vl34 z`bYiBr|t2(?Eg>JJ*?kX`R;;VPx>t;;aSFfER)(6hl$4QIOZ^C{Y=McOEY#Xl;*Y8 zzUG^7YUQaaHo5s~Ax}Rx-eB2%*{4ZhKYP~s4z@j~CH)sUZnvn})3~dC^Tt)5H5N#p znBjFSIxR=y1c!me=j7HIp3Wz74&A+f(}BNZ2J8E`AB%S%;}vXee8CXyvEsJ$>>0el zclu^rEHkjWp`!En@>1t*>Kn9kH`lKGBVD`w<hMtg&Fp7CRFZ44eyb>|dGO{D-k_bQ zla>gb`FSzPU`D6l$1X+Qiw^x87HzCwyIaC=j^snOoWLvbDwkg8#nxngINJI8=Ybt& zSHBunR8_^SFaDss;LC%vj+0mL70f)d!gJ@M8x3c}w@g0tM_F#6$cwrqy^J!#ErCz& zXlvW1bU!oHx)j|0hvnvW{rz(m&G;Pu=f|GoqRKBV&(9NFsv=eAJnf!lddOtsuoXc| zO<&f_ygjS<*htcC?X|tl-!;`0i*^*s9+*8LI&O#A*`(~|wSGRqpaJZwX2ySvGZk5u zP0i5#UNZOnsS_I}Nj^SgtX`8kN5JOL&ZYzfStZuQ$W=^>ZzimKlIQ(x>e9l%&87|e zB^S>&P2sscvGIxaf)0i=_U0xHDQk?C3wwAsb+gIW3veI)9d=FYp8b=xFH$ScUljg$ zz2|Lthbmtb<I`~Ozx%n>q)rLQy~$E6cbS~EaPh?RK2g;>E=QEOeV7uS70|KIe4c>v z<Dj&j=%XqDzvaR{aXg;ntj{TNAaU;Iez(boE^JtGlW9)+9kaL0iZ}SwTz4eA6??V! zRLYwR`;zw6D<#x3e4H_%`p@eqCni@;tEtN)YYdiO*(z0JWa-vc`gS7oy(!0Taq2&g zK0e>NW`#yt$XlPujz;oP>Zc^;ZFJ>7$^7W<T)z+tNpa)E*rMYxx9f!4B88(F-DVkc zU6?O%T|}oP@%EX|pHy9R6<4Y`itD_*WHxtNwv|z=^`=R2i_>kU*1N5I{zlSidq?5J zDMjuk8-1<>oEF#Esw6$7lPi0<)r=iSHC9Ww`<{8SPUiBSmD@QEhiqm|SYo-jp?_<x zP-4ZQH%r@GuUh@$UZ2go{E^R0(Kn@EujJY8y58ti8!dWLD7`1&t7BV^a;nmsowri= zd|%w_x#)q=2St-OezT*8mZligcf4-7&buu{#Qas=vdq^K-xpmhIX1zxw*KU_t+}ed z?!M)koYZf{9rk#t%!$R`(<e5aTQkEg{D<wG7i(PO7N1CG`qspHQN*|<@zolzy99KK zb6-12=(Rs=c)Rx2-WwOJ&gxeE*?2>OEic63MRMU0=|}JC&b9{FU46p5`k$Ix{kIua zRdaXEZfs1xzT@P!3AZ@XfAi+ZO+0+mWA||pw^>&*zn^hjyxOn5B(iq#YcYGt*xW}E zUQx?Zw>M5S`0`s$m_2yHkyftTd|{uCW&MBD`D@?u9ml`SIrOsO=krRAUaNI_Z`Y}4 zFG)+-t{ipxx=nFsM2_;NcjuO#e4D_qFDEpvUZa8~<!{D2TZ5nBlU3v=E)&gsuy6lD zj_k`TYH~Gqt$dVxd2Nxr=C6N6v4w9pwL2YrduvvB!xn493?=vN6?5lb^_ZFecD*3y z-Nc-HxsP|JyO%zGC|SEdOvGhLZ|KWATRa=D#<(zDlwRO8N6t}T^WAG1>pp(25LoEd zTmR~}Z*f-ruYm6nzWOd6xjmC6<j34Q(6{q-#hsXq%nu$MnEyymp+(q~VfW#WRfksp z%=T&A+`@iN>Gn?1#2q%<gH9R6KM%7{<&g6!o6}b|r*XGW__xciV}g2JGj{C%;j@3s z-Q-t#$5uwp?NRsN#b8)6Yx@-A(8$I6(r=lHF}WF^R^k!=%~GGrvia8jHU2L?9=Cg# z<{ESB(Ed`Dh^0ncWomB6A5VWDxNdXXI;I|zbdf!Y>*lT&Y&+f6loU4A@EW(s)rbA_ zw%tm5`Q~TVIsL3Frdk=NjMv?6E%N;P@%p<?nX{iA{--S!=j`{IwZi4`h7Gbi1>0s` z(mvo(?B?jOc=2q#c?K~dyXwV$L_X8m^^v_Yb;hl#E61K}Qrq2oR5b4R({p0W51hND zDV#W?Ydr(V0b3Fm$!->CYge20K!mIC&?22szOrP8rKd$>SN_|1^YoHaOOJOMYuG$G z!N0Vqa>v?0wNg{&`@2g_MOdruq+Twap4b2D#=K+mYTq>6y#7Mu@pbQQb*%jLCqvh- z$$EW6>E@RgV#ewQ4yQ_viwU=_oGscg@mWvP<ugB*wJGpS)|e{G*|hqVo8q(XP2Ymw zPWHUqDED8E%~_hCIn6}E#&>1#r|$WRp*mc3&GQWFw04#IF{jzYrXRICHl^P<F8Wj3 zy6#tQZ~aT(DkPd(_8a)DUCGd65-##-Wqnc$2dk2t&a&uU$Ca)Y4(zqw#cp>ra@xHl zY@cxjObc$7kZNW6TO{oN=7vOFrFGxU6#*-}1*6p+{GGQt)-Lw6zQNJ`{n~MVBj>wL zOM(jj#Q3eLuXPY@T7Kl?3v)SE|K(dhTYe0vv%PBkp-}W^PPt8?p70ber3z)K{0rQ{ z{q-Sz6RrQoy?hW^dBkCc@_+S3p3fh>w6U~X+1H|8Bzk^Ny~dhrcUp^|9E;o`8r6Gw z?aja(@fja|(~dts+gi1o>5BDjfu}!ARm@jLb8#}iZFF2LDJ%5v^uxuwo$IuIXnm68 z*LxOn`Q!0k^;>7omCnjA-~PMz?MmzLWyeeX!!i~5>$e`xaVjt@ieC57PqNO``tIA0 zzh5|%mVbJe;eFKApI2GK?DMH>8LNw2yV=8&wut`p=)Cb=qU!jGea|mcU#ZKM{<CnS zaqp>Wrn!-=%NC05zG^NIxi?5(P>OfWb*Jp_*XKWw-L&HSGu1uTljCQ;2%P`zrsb2& zx~ksyrFS$E6L?hWH*aXHR$bUBEqU<i21TaLxBjfza4~SVh}n|!-`~V3Hb0wS%m3Sj zhs(|O)n6sIJfC$M-R9O`pRfKMo)GeqcOqZrnkn<{>^>#!qc2dx$+TXm<m0tI2gzTz z!dspeO~|Nky!w4o7}ITao$29IzNN?B{If5n|JRn+agVuwv~9Cdy%}ErAvW&Fu0!A5 z%rtK%p3vW%v&g0<Q%$5LA?!?e!^9^&O@U`_ra3uEteCO?e!b?(mj|Y3ykFUR>(51N zwvPdiU!GKqyB8w8Vs8Eg*T|n5duFa!lRnMdTC(LKXW-I}Tei+RYG%%A75?qayjcsx zE^fJz94uN<y)Pzlnf)Dw4V(T2wp<PtpIt1Tz3^(#!L6}6ce7qCI$M4__rPZLD?Q1| zyoT|QmT2r%lZ%&NuP$n|d+ele&uDSXOtA~^)cR)S6kainTwCz{c29|*$i~&7>wbRa z|IeIUlFANl=}rf&SFblUMm=FV8tZcHX!FDET2oELUmNWE@m)5isi#LLZEaS<g%x38 zX`fsTz9~eWe%~FX@+a8)g7*i{BU|>=AMA~P@cH(q>D!;4ufN<Kq-42#`u6irT{%<V zd`fchO02a0`?`Hflz08hE3dox>_4?mvGdG)xQw%)w(0ecU+=f?*Ei%?ZOX7cQ9h_n zF0tio{*{TTA~kO|{<Ynk^<P<e-#&@ApH}#<w6oo#`*7W<^3R{0k7(DfQ9kqBfoEEe zo(y9{$ouCXjMd$gqn_#RzrB39bh4bi<eL5S9v)A~-Q^Q@sIoRN@TeN&?fSIY|I>D+ zW^Hr6aUo6MHT%32&wpQYf7S}Bxo-cnezgi$`n2^&t#sG;y!~B2tzK_`S?wf8CCTl3 zBDnP{C9dv!t>PpdT=IUJ!Xlo?&rul%sy7CCIIPezIk4fh&Mq^~AM5P4>7>ouqV(hg z+rsS+&#ERiN$%NtFxQQVC;WiP(hZqE>yPWdIaXhP`vbq*n}fgN=7@6syT*AUVr|Ib z;|(uNS6ps5=R0j{<NJ+wKU=Jvnk`VlAKrF&`oaapZ&y8i5t6u>^=b9f$XTaXcQ<er zC~Zt=W#g<d<h0W=<lsJdG=K69F1y`pPv!mo_lxPpO;gplr@y~OZrvio<n<w-n6qr6 z!9+imdWp#l$#OzDhkxGYxE7!OMD2x_l;C2y54nHV9bT%kCNLvlqp$6i8xLyw5<_|P zwq;*vy8OG(!XhzvX5qR;99n$m1RvPE&am`qw6S@{d0DB|`hiNEqpW7TWxJK0@TvDQ zAN}}FOmO&cdu8iaxx!x_Gq%}&$rpUPB)UH{Vr9{U{o?h8ZeH{EP0XCiFh^sR@ndP1 zPx5p8W;(8l5eq$X_40*zRZ8sptA5>6xlr)!SzL-mcu}}i_-~)n$2gwrTr6_lu^_eM zQNx`rIsCczCV2>}E%?H>e6GRs+G8tw3)&5CF{Jg~y8m1x{l`6ywakhEjAgc=mJci| zwv>5)c`@sm&@Jc94fO>FeXXT)l#I7Ii(HyKr;|ZkM55=zt7A)8wY2s{pW0%#KYMTC z@&0hTYt1oPA*;;Ks$Nq)kZK_uc`4vaP;eGUaPTW;i?f`py3HJ0PB^v1CSQ86s!Am4 zSxwLW6o+QB^!j6Kt{q~Xv`8TFev`?L)t6>0HE6v4pw2G0`R|KGiI<b=<7Qskn8uoB zs$Mny;F;z3(hs#7&feAd&t;NKJBP8i1hd6i$<{woy7~f%_l0ye%+;w%pZDu`!OkSn zPem_nGm5{ZpK+>HTdZ`(tc82pgRLKCaBu3G`m*)GS<w~KE~FWq@n(JT^Hx<@iyJHF zMMI$(+j3T~>snK~`H{@FXjV7p%DVb#UnlMMDqXSW$$qVEg)5i2y|8$0^-Ae^)a;iW zH~hPnXu2GjbpM;b;P)R@emBnEVVcqU{m7l74;R_>P8z={&->Am_C}q5sr^cG0mj{7 z4@@?%_DP&y<NEFKwAzmRW#Y<lu?NeZH~FU=+Qt}N-f4DLG(k-L*Y7!xc;c%QO+6)e zAJj9hl;Abyn&I2!`~AtBXuZ!TpQ<D(IQ{m@tbN|YDyhly;p7U>{YUqi3P`ZuJ((tF zDWdV6=iI{e+q_~A{!D!+9Fp$R!E<E}-=!sojb|KVn`LZ!Y3-gHE$XZ(Z!G2dj|*<k zf9~tap7&z^VX-Mbs@gTvbsb`>mrCAG;qh`VXDEG9zkO!&rmF0`yE5l==iD(>6^aSj zBCx<rW$mJDBjeM-C+BSza8<hK+sOASRbHlDdak?Q!|9U`cI?%uI-j(am3@({IFpap zuBZzVk6qvJPQSfo(K+uH$NplQ<O`JrYLnIqB+hqae>&%=t7W(8^Obs4TUe*geN-Lr zwCDT{o=q_|h5PE|J*(tYgmojQOB}u4$6Dg|BPDH(JA1Bu=1hUaDE=>ubDp&@?O63; zi?L(N-F*igrY@Ax+jmiI*PCq#>@$-OzWgV&H~pOG)?)9_ZGlU=6{BpGKdD|nbfK&L z`4g$g+fr<Q_oOtRe8coQ{aetkz=GYgA}1Cd;9R*)@FAmka{&LF+4a${PR*XA7B(f@ zYU%Y~6=`?3AFFSBdV|IPFPmlDYw7cb>(cg$FE5Y2m2Y->N`36L<Bz&Bznoihzk8MG zowbqmJJ`Ojo2lQJn6=BIiDP%<)hu?=-?EYQ6CTT)|FPLmW0ye#$L~LpGfMLRsz=^` zoBLiV^xTggU-oHF!m9U(KAbq=N&TFHp!+kvva8n^8DDE|&6<5Bw8P-^uVjYhmWu_1 zEA%7T99UxRG)@V(k^h%%m|4p1y5vci+XT%k8G^rVt(utoRIa<_!1tr4s`jK<OV4(F zY4_^FH%lK|7Q@@T6OM1&kal9;&6U0Ryxy4!Oi2^}n$A7GzU;!eoSs$ty60S<Q5d?j z{>{6+>%Xb6y|48T*!Ea0wMG5&x$DcdH<yO1ZEwH%lAUwq$;qpP1m&*VZP0U=BmH*$ z_ncjCN+-XFIh|WM<xNQ2S20(~+xLpJckkNpI8x=#{m{cwR_3)ot4*IZ$)4=@{uX2w zw(f+Cvv160<GoHyS30kJ>evu{+B(&Bi~Z_p@xi<6RW8KrJ|lB^*4)ipY==MJI9TCl z&#=(f;sc}E#N{R|f!A1#*=oP9oKgL3d9RkXZMNJg#&-9n7ov$d5&Go~Gj~dJznt~u zYsUwNwsI+(oG)MRUn^Pj(&M{A)~czmq_%22(L7zByK$!BUzW+`f+9KQCqAaTwJmpP z6`Ju?RB6{*R?m9DuJo;jr&r%n)O~Cjy}Md4q_x<sEZf>-&a~fu&z#mhp)jG0L-5_L z_BCfaPN&P7S|;gy&U<x~xA$FIiAC7DuX7G6|CYMPk*eH$o^_Gkgd~gqZ&}mr-!$KQ zblT5Wb81!Ql8e(b1jF_ugvNbUPFwdYsxmp)X72ZOyqjXgAN3#Su9tN#?wH#1ui)dM zrnB0obq%*`y}Ffi^KMi1wKM$(_85KDe;2VkclYV^sJnl2e=j&CIe(+%q7Nmif`W3M zuP*SdOv%f+4N5$hou9fzMAe!%sF#HPWLfKXd!5#XUUSQ&z<%%fU*0Bt(#^Qh&}uku zS>=)wyPXzj$m>1qw5jz=I8}ey_&ICB_SqkQO00TsUH5BYZ<@`LeTQniR=$7zPsRD) z<Eyr2SD4;S>ezP8V9V(@$!WY&my~1AJ2%{1bVK5R=Q#}t551C`yn^3&_2z#wUH#T4 zW~PTq>8zVCa~Ewp8|7NPtmA%`k>0t-?`Cj|AJ6&pA?nJKnNBS$D}FQh6}uf|e^~!= zm9WyAZgcsKZ@InBYj4}KI{H`kpSawwyE<azKVHcU4BPkn<L5rr>z8GIK7Kou@7mL| zp=N&{hW*|;oqxiY;05+S4n@0!r`PX(K3ViqlH+84okLSf-_3b_{=q5!M+u)4AKo_- zTy0_z_+tP4!(FE93xC*M*Nx;h_1D?9Wzp>Rv=Xk(oJITpz5Ktq<MH&1dVInxhDH{~ z(+eA=)#@!!8iq$@PWC<C@paz%3;ZIW0nt*(fM_Xqk;e4f#h$Wi(|`W06#2QsbBgNB zr%s1+r|a&kRbTq@d#A6+zl|q9oXl`vGuzJYVR!t4ueZN!-~Mv_{|Ca!M>LNv-+uec zAr9f9D#0U`#(QJ`e{K#sry2U@Yis>%`G3qyZv|>S^iF*6S=8?K_5b_+f>#tU7Q}p; zeCal8m`A;9gys6C>3fcRf31Dp-sZ@4@q<(2OBcUc_Ara<zR~}+|Nq{7q+Z9VeMHyU zWK)D~Fbjjm?}+C2nu0P5D{uYT+G#7tdHKhu1DBr4)x@1~o#d%H=el^>%wC}h6Qlpv zzkB*@<4G2$StlBK^?w}o{`5Zo@_S*ybE{tVFA?&dGQ&<Cw4&hX{{QBGtAClk+#CT~ zQP4f5U}9V7$NYC4o!M!3SDzH{?!9iKF7sfohnI!}hgOKg+ApWV0$Z8lY&6_sCx&<( zIKeT&rL*Mn{<_S4KmO-)$2d$&S>vk4tkfS;f3xGp{^})q3e&ECkWS~UOqt8{Q*M6C z|1BILA@|ozV7#RyrL%3>;nf}0rZ2_Z#ny*2rMK36>~=c9ovPv9A{Z%ISXgb^<Tc&= zgw=&!6&aU*Hxq7$n6a=d&Uq5O=!|cG!7Ha-pS#2w8fLRyT(&6irdf=*-TiQvNBbtm zxkp?RRH#?v*4FF4S2E+Qh95Uq(I=DX_trSR``~9E)fe4!jNxF8_^I#-t<CY0-1@1D z`bxj3M|S?`k#9URa|^Gj_kT;hh-D@l7m2PF7mRxCW815=_t+eP#jRbB=B?lBb}nC8 ziCw&B#%~_|X`b7ZR#@$@UBt1DaotZQ+k%3Gbx*qFzPZ1x7c6R*@mn&jomIajX5-?U zWf!<BbpITl=y%hUGgdrCxmjmJ%%9GHT*lDZ6Bc@{c=XHf=+h#5jb$3wT~7K1q=X1$ zSN3%k)~dG#Xb3JBf8HU&6MUlDgiZQ>W{HD1uZz3;)&2;}WBa(ap1;*mcTGL_@qL+` zg(=P4^+zHec-G7}u9vC1-MQf7b-x?;f;Cefn%#P-*&LZP<LoI1hS{8R4KHjk^VhmB zl@mYV+Gdd`%Wp^2SOOok&0i~19U2yQ;nADK31a&+1zZ?zS53SSa8g|)%2er0yVf@a zy{yAW?$?ER{El*%7QOJR%M#Xy4rkMqH?yDCW>dT-QQNUo*;F*ZR{eRslz-~AWd}B= zzFQGGxqHIVuh$>hTBUVOwK2V#uFa^XuuG@KY>8Nc+N~(wTYVgi%PY1vajg3Op^9n8 zV;AYKs!b(r98dYUi)uob9*HsQOE(O4<$dwGZ^7gy58<{d$Kw%Br5EFr8{QtsVY%32 zubminqpkJ%kxK2|^Hv;KwpP11qQ2#V@1#t}?#<1O!5xB6A8;z>Xf-?MJ<sH8)(omU zQ+iwZU;wN5x`*eB=e2SLZN0HX@Z0CY{0*}--inpn*u1P@Rk-*9i{;Y~?Z{7$T)8&( z%bJGb4sBQGMuDobY2sTfswG+!Cy9j`Io;T1e6Tb4{HjUWIkvvP@3|(vOej8Wl69$m zrBm0MPD!Ih3-j_=q)!w+Sl`t$b(O44=kZl1;wMLc(CF*`FjvRjw#LKh_^B0YGdfG} zR`91JIcy4_qLFs($(7PNxo!rtQ$JasX771l^zTXL+Rfi$F2{$Rix70W{_}E^SUP{R zSxZz{LWe*>@RJiuSe=`n#g*L*e`;O!zwWr_oqE4B#agT_UF)45w{I%)P@L}M$641h z*;{<F8|w`@-t=Ur$R6|Z3Y#Uh$L@3`ElKaWn=LK5eWCoSsZkN96upA#^cJ2?{J2=0 zExbl^r`zjT+xSgA7GYc7a3mK0IL>Ra;@V;EZ7Ih^|HK^>yR$jD@MCzD<b;<qdP-A# zuYKRq7`U;1#+uHZDwRimzFxFv=Q3>@L;1?=ly_%pcRjWacG@)a+M6o3XC{VE3-}as zq$NdWHgz33A#^d*==7DM`!@L}m99<uz&EqWa8b<8OgRRd31KW#Hu6+mPx9HfnANXk z%bG77&u4kWmBb1<=s$k;TDr&f$0WhHZ8ta`2%hBd&ABS%e5`)2cwwnV+Uu<$PbWC< zJieOy{<?iPUkGN;*zAA5OZJH3zST$eRNk0iui&dKU3OgR#C_of221ayevYVnVl-ug zX+&AIz#0L?rzXGbXOwSl-(q*ISaYf4Le~wB9J3VzHQcsriJw-U{iFEa(YHo&@r!u& zzqDx7{`S8p?ccdMxtS6UX7xI?-QG*y{%@OcdSA`#+@+@5=M_p?)&Iy@n|phQNyM6| z%RlEHyCrl_`Lb5hDMLZ03YE1EUE*_OeRp(Dnl_W~<)!%w+Ryzt7EUkv42o;!-~)Mq z#)>U(gKN&b4zhVI5#O47di|-nKMg1AE_cw`wlwif0=GZ=wFUdtXJ?5Wb2qIwR8|Y- z`BQ7>zj6NgkCRt!S$X5bac(8OkMF%_w7<8SKXcFW(gX8$b1v9AM^mwdJ!xXgtxH|O zqIp|Ixb8ff(dE^=@>Rn9qRkJ^a7xSdu643Mu>8XdKi(fZr4=mJ?K~V){&-1L_^G(W zjH!jo#I+ZS-hD99C-6w;_YdD|p4Qa8y2DVf$vaEi%Jl9-os-|9zrVEX4r!U{tlY9; z-s}%OT~iiF$Ie~9V^Q>UGhN?pi8JFiPx?GR+AZwiL+3L70`B!~wuek*xLdQBZ@%+g z;aubVX{Yht<9Ba4R+zM2n^m=Ku}tAAD_(g88=;J;N?r5b-ZgU74Yn2QVaXKTEA4bc zXZ^x(rFy0Qrnc{SrhnGIz037l`sQXv_G_zHwf#$3_wQDfj2GCrIsEjti?hPd&sfu( zwRy%}#g^RUre}?krMtpUM?@d0{=Ol=z&Q3x7RN)z?W{`$IexHLZ}ss!?bBcKjHBFj zeVf28^9M^<b<fGMDK=hSbl;7m;)9^n)SLGn?0>;^)m%fV-fg<kqXW@dr&eY@70&z2 zJmKNtS7PBW(y}}b-REQHJM#Sd(#LZaNPM@*c6p;NX6q#0E>kSrxKx+>DgSF0sd$B@ z*{_A~>g_qSv2jb3xMSGS)jpypt}!K8E!*ID-QDiV%uhb9w`G>*y$%VVvf1M&&&sBP zx2BQW&t|PzZ~9=~PA~8JIhs|nEgLMO0{)q8Ntd0mdZMam%~J<P?LAyyPcW@#`(t~V zWl!SjMX4tY81rx3I{Q@ojL?c+!4;4Cu8VC^?@s5>oV(_EP}G@_nr(L9JgUBIH`1!j zstZ^zyV?2Lh33Mm_ZDmZEZI7*vqt_}jlh{FW)ZO;|AY#<mzqe5%Ovj$dtT3E?y4wO zzk2hbm2F13N>`Tjztp%Hv-LykIyWDKxiO~9)%w%=cDe?&pFOd=Mz)yij&tUj7YG0D zH!)p#Q0}eb=KtFjmxvqmsP2+^uiSEWQ@rEEb8~)dlH1hwKZCz={SxV0){o}wNqlIj z=I_cg(e%??+vIJn*XHcv7ZGro#_P+np+498-#+Jee%pIEGrh~&J>G6My!^D8GmU{i z#pUgL#w)K94$t7sjCd({jy3UV3m4;;Uq|;WaJ_k0fv4~(1E*q+{g#9GYt-LN*80G9 z``+vu`<9savwz51)V9RSX6>bhfAc=cyzZSfL-Fg*sfqhb?B~Y^EJ)70@ZtD($s6+` zX2q`lT7Pby{-M-q;+v&gK6uReWWGkSa#hj#>(AEizq$F<^GK0swXS9Rzvb%6u5NyO z@%5~2j;RGj2WEW~+}G=VOzOh792@CF`q!S7|FkXZJL|afWd!%Pho2;(UrD{W_{qXL z^7V4t^<U2K*EoKbBXRSQi~qhIw+WDole_*wUa$ZCt%T({a+x!DvfB1tHQW)D_<P&b zPkf)fu3eIf`EHo`@n+U7hcAW8YW7Igg+|<ZHTlz)&lgpFXWBh;Ir;aj)5C?upC3P0 zm@C!(-dK53p+~KntuDW=d$UUEqtec>bN-tGb?;TKtS`Ik#J>OEQ-5o{OVc-elNM#P zfb6a_F*ZitUAGr>aJwbnzVqu>*e9&L$FJ}qvGFED_3XL(c%NO^_IPKGywUW(zr8(| zED4&r>Q<p8hs^DwmyexQT!UV{{H>zK_y5R~Cr@$`?0l~COZ?zkzkgZ%KHvX8rq5|f zI4EJc_wMq^2~ICxE{WjCtJ?kdV{5Tyy`}l1nn~}x{~XxKJ11KrgwO8&gU$B;e|~#^ z(t6oamV`OqdO!bWO?&afW!}uRgWmBU{+3Pq=IvrLe~L-rwYlB9TbEn*bXiE%*MI-w z8TW~&bbW`P`DS5vh66`SdF_i9sVsE8_h_@LO=nMJmFtF26)o#0FV(V|srkG{D6Zm4 zgIi|(<LWEXOO|oBlxZ}c*Z-lK_38Tdm%opMd`SBhA1QRcXO^8B=#H2N-~apV_uoJD zYmVB+1!qbwNy%+8;NE}wfXq41?0mK3Hsys+RohkDCFc}6obX=Jm^k?g$NLQ|2W)z{ zHm4XBsk%B(V3X?Ne&+*Pf*|XsHq+v=)IZ^@U+1sa-@Ly6Vo~j3+sO-hCtuWQ;8gnl z{v^YM>r4AOjvjJTKhluBd?w4^`jVh8{=yNJdz8%`zBd-;YFYWouZf&?i+R7};w#6V zm0o7M>vzyQt=%Y8num#*IpIQ<$FI4(6WXMs7KrG&_@7x=SmV5?>&iUNV}_c)R398L z(_MacwY7YtqI^Az%_8ehck~v@Pt}$P*z&&7_LM@v#OXV0JXhLiTUd75I=Ln4d|nkF zuyCGuP{hHW0)7ukU$wra_YVnP@?3aei}<CJOGS03m%a=;>ThK)y<_Twu1fvY@elu~ zC;4*tXgh9H%WHmbd;4^1Lf7p)E%U3IJ9|QMH*eTH(R8g;+T52r>pSb}Pb|{pxPR%Z zjQoQ#5x-{#tn<PTpHft0wXF{~i;d&lUKjh>Broh*#3|=T%@?%0Yma1cFwUODseO8* z{6qeUXQDpDZPdT%+@~eOzWn`H)p!1js^)E9B)O_{S@qGo4)2bymzuDv!;C8dv@(G= zfn~$Yv##9}ubIA#Ic2fFkiC9&;Pa1PmEO;NeEdn6)g5z{eIc{0++O82P1+*%;`+|D zQ!TBpeLGy8c>IsQaoNe*vTbqI^Eb>&V%;m-d&W&O?LdTmmGvz%=@YjYf3&Y|@Y<SQ zb7UFYR1-^6Mw^Yc+`Oi1>NbdI)O?xL^J80==M8y#D@V7Z4z>FhTO2B%S9p7hM?K4i zNPdpxGekcXtY03J+&6zu-NwxM3(s*X_wNskyi~PM(N1>O9Ow3$^ZQ-ddu~2j{%6UH zwb%c6Tm-E-;C5-rb*<+A#dW)Gk@=q`0dFPcH)!rmUZ?wlGcl#0)XBft#j)VTk6BDp z1lmMSwak0g#AIgls7Imn_UQ!+-EMPj%WtS>zMp+7NI<tyBKOJk9KXWZ8>cUMD#5Yf zOv6-zLa8gk+g^H1&GJpQl*#?zCK|J5%Y)5F3qx~D(;64u+N|jPwKC@MJ@<QUw_Vk{ zuPFEkZ1pd*oj>Jre9>V|vjs){9J_-z7C%jTuC;a1hR@Sf4)z7TDn4oB{q)RZ7ZX3B z7ecaGarLQDHs#NSZmnH(^m~hk$Or4c)Asyvvw2z<{j==k`BSGO3*TH^+1oem(S*{h z+fq!tyla9vPxfSO+x%ls<jGkl#9p@;8O?BPSYUXSrG)9g+z!Ws6Amf=X@7Yvr)ANy z2i*w^m!vo*YzWw1zHZUl31^osP@Mgq?d|Jb@^87$@4ccdX<Bb{Y_>)dgR|<i=hj`y zHIIXq{=X=Ehi4hr2Hy$xD|=0si&@_^EDqf<UGsy@(_$ux+XsbCXl<yejIifE5R~&u z!g9%s#X?(}*(!gOa{jM4zwpY!VkYCwyz4U*r?TDTp5hjIFetN>y}qkl%Ps!EZsRjI zHZ<&$J!C$0cXiGBBfUcG^}jrfxMchc-p|tM5!lAu-plU)FP*hda_iayine_>56^mV zW8<vP1wLmM6qvNz>7^amChdKC?$Jl3>Q}zsEz^n+z2a}1;dSwdajRdZ`(B5OsyutV zE*_0fXEC`N`^|K3?eyPAj%)ik-CA;VRjQoujHN<n_8wWeWRuVBqd_vl(}TO}*T)~; zZnop>zNY-cg^TY#tWLGpyzRXIaL+g4{F%bOhTa^9eYX3&$mG+=;LB{zJU5l2@l~t5 z#l?fMx)y2`nfk#yZ_erZ@cPv(n=3ktKhN#ERa<Yk>dD?uZmYVM$M1WYAbd!8)gf!{ zk4)WKv3ai?en0ms@-Q|260)7u@9f+N{uT8*uI{gQN_71f*Q(s=m@sLRW*KLqvGgUO zu!Di`!`9yD{jsgEe({AjH{}dh>OKxL@lj%0`|7cKprznNf%`etLSJ`=Wb3ClEO;Es zFE1^+vaxt+>(<oH#})s0S4;JU&pL8VS0c!3{q>1rx+$y&w}vMg9nuK6%4vI6kadON zoGks@^$Lf!89IKMysu<J&E@Zl_Pyi%ow<46yS|B{aaDzGXV`BTN4-@zVD<iJlY$&) z)((}+3$-;hZH~B{2%No3?*7!|<!9XzDzlb;jP2jGD=neBMtg0(PvgqQ9k+D+r=K|0 zqq_b^sh{UO{q_l8_T;Ik9jTPA+Y_?nXWd)3@Lf9+cjfBVD;_w}_xiK!Q9-+wnw7Kv zPGc}TdxImvN+du0wVL$Vs?#~zZ|D6M+<eO5-7MLDfo*Tael+sunhHM-+IIPCMv2|g zW<eeI&zAgq^ll!oUc7VbV%akhUz9x8_e^{tb!xBKXQh^fic`S;T|LwI>@jDK+tU~t z+rGJZJ~xfvy14N`{XMxz&F^RWBT5@3?;p{3y0MYDz;t0wap0<*T;D2!<`*xud~t7| z)%)7IM_Q>9w}fB&z_p@HX~D@tj>b#v?nY)&$^5Gy-U|Jf(-pS!C9Bki{K|w&+sYk{ z4+uZMHZ5CXVeILy+I8H*dnJ^YEoF1g+~L+RG5Z=gt37?_JUL6C{(x~*phA$R%ZF{U zY#U3?l-NJnCVgJq_}P^{jg`qdm$@y2gb&Lcv@BIGx4a)-*PIpds^^SDG3%E)mdjJR zzx!O*?R)?1bBTV%$;VGWg>X;c3+&s@n$^1Rl-Q}%eaXF!9`m^$h0kohP?VW>ROVXN zhUNMkRdc0Z#a0OBR+_)DbFQBfyK%y|s)x>veXDC$n6+1biA&_&SNlWG_4SJ<+boL} zTh2-+i5bbM{@Gw{dTyT9-g!?2o39z4o*gntV4Gyi9_82_KMt<8oSJq1#|Qts4`I!% zQyiyWvbmeJU}4+itNV9tN(hP(_ujQ^Psp*qy8ju2e+8>uSkL`s9?ON7JMK@FR#hzd ze(Bh6<)g0CQcNRe`Af~cc=mf{()$(W+wa%?w9oD;<Ok24Gg%sg&U;s#-ZfjCzy4~p zXZ{=55eSKe>K`5)W;n^P)Av#I1n2Fy=X%%7*!krBa*xo$$v3*6@)%T1h+cF;>F3o$ zQD3ITi$|#ZYd*UA=xz<Cn0xjcAExj5xA)JNZGV2Q&tep~7`1gz>~wK~1!q4ka_y<B z-2LZs`xGzF%!glHf6Bjf^AcZba$|*U{k`}Pc6<K4ew*+8;gCjaOXiLCDc6nr3|1bu zGU`8cdd|!5pH|)Jclr3$ReQEutZIzxw`n)HR+{d$XWbY4ytHLsSl2z1#h<$-G_-uT z{gtU2Ww>?Awkz9n{4XAoiSLYfIq$^vgI?l3Rt0hK3JwY^Ja5hZs@=JivuuLFyfT4n z-1k-LRsMh4_GcG|Y;)|t=m?>ftEZnQtr2o_tNM5TQ~%THht8)>=(we)e=I@0eesJ( z*N3MiG<y!(FPOgn{~g<ZZj%JX^qanT>P-o-xZOR`N$Ky@gU_ZgE@REVJ|S$?f=Cu~ zlhrrY+;CgCcb)dKgUR`7p}Y7e`>v=~7D@VUdB&}SL-s>`|K*qdXBK?X?cqMbYp^2f z9vhR}uj}GZiYHxCiT-gs;!@)$HQSjxyc{Ndy>i&<m+yPM*B+~P1uowjUdMcA)^GL9 z{yR#Oj}+R+YCii|I9ISC?fU8m&$`p5Ja@VstnZ#}q-{E3>G7Fq`zP4!pMEuN*Vfyc ztS-H`Ib{0V@B8#G|Mmsci~8|RGDxiHU|PPSXZge9lJWuf7Tq+kGyZ#Jqwcy3X$H@E zwq4PlB6k1V;*D2Mmnlt+{Cck==*^3i0`K@0O#xxa9l9H(i``qE9JdYhe7oS?<}DvG z9(-(Bs<4&AF?8OgA6u)RO~1QA+bz*VU^kb?nz=li&jfsIVx6~;>3SpEq?X0?xd}Hj zo;gXUFtnX~mzen_M)vY<$z7FqI&VGMrO2v$OKAIfv3qOT_UGTc$yTAQ<5j=Ee{GQ+ zzd(!0Zb{Adt4jkaGVd%sB%66>>9W{W4!Q5F%a)sP$hWCB*kzc@Z-@!aV?Q|mq$SHk z#SqJMCiZiM3?aJ5`R?sHT$HA&{(M*CkNSTmygQ_LSM)x%xg@uwt9{KU<*R4<FPC?; zT#Zy}bFFXQb6cUuSo+k%?_0R;CkX}w$?p2`U9rkbLy?WgJVAL{=SFGoZ5NXzzoqa> zan^Y`9(d0gS-Mf^8^1<n;H|*7=~3&pZpaX_ci);WesqfV=2dp@ZklygC~=l-DZHiD zGg+fv=)pV3s4r`z&)>^xI{2!}%1+<SkJ}(|$^1P|rCBx)zC`ai!?P!QPyC<O{%f9E zeiM^Qv+k~6!!bAc=<@wrSMPc%C%rv0{-D{E)c3XW=8{~CUxunzP54(}c9>z^{hTF+ zt{NX+bVimWhpeAzB)NstcgArRwRMV_-4_>Ce2O&CSW&<74cl(s^QR|OoGZM#*>sVZ z#+6Oy6EC{^mD;55Dfe%CUaELFERFlSqsR4@7d{Uv3|Qm1*|Vg5e;)hgHR;?k-TU#k z??v7_net@&P3<_>cQYn`XIQ|xK=6^|qQFjp=t@;Cb7x787oiK1E><q@i%4Oxx^6w| z{-amc3zyyw`1g3HUH!4i{N?P6WGgk^$f~9&@p~=ezqIV_j6*uyVeCD{=h6baBJLkK z=ksvc5zQ^T7I=L*lWv+`<WyYd{>VAot=2O_W<tpO)=38Io?5GzGW<#}bGEz^BdhMQ zNhD6=zf884+Ix#DcW1rc?lG@aDWkUjv~^M74I8ghK6)lzJ9CnJmlf1U>unLbD7O9X z_nA}u<nBpFa*FO<bAH)LCZn#{MLBgpu9fyj&(FQ`V5P|H%hNS|Lf7y}Jil|s;pZ=t zLvGiXz1g|aF<4)sK*Pa);mUn0G$wkhY8I*;^;B&!z2LjtK0_oWv$*Evrk~GFbw5lv zx_$+ds{fj2i#PqcY(1?gLPX=q_Vx9tbH85~f2(`dYZKRlg883}p6~l{D0R_R{)v6I zFEv6qVo#npw3^q&R#tGQl=646X9cmxt{&X^ZL;;UsQv>FJ5<V+fA=#qj9FK6^+WSK z{ZytYYjuMi7RpceO1dG&9egS1>v5@#S28lRS)(5Ja;+69xa?xG)y&B``EPLj+GmR* z+3T-N`zz>kVS##Hsr6y6hYjyn_6o)sUE`cO<<Mn~!e4b9`K_PJmK;p?-o`Dn_o&F% zhfhyV-JEN)o7wl~OO9(iQeUnlWyBaRD`1h5ZoL{Kb85qp823H1Z=NXhw6|HD6jeTb z^L5`<^;hZ_eC|ko5xn>Odq3ZY4=?Sw5wr2)^vPGAEv{c{zOngkc+I4xnpb3O&8Ny; z_<b!i$NT((EGO&Bk7a*I|IvFRt(tHw|I3l4EG}oChaCHDyJkH1FiPKSnz~7!f3=f) zGMj(2v=?WLw6gj}W!ZWEDlf3FD&D|dru@fvgK}H>x{p>f4+(BymQxH^QxvqOoGCik zQt{r|@`s6uW?K~MpPo8rzAe7Yn91m-ofUUQlKDB&V2h9m<~z#n=f$rTot%@dC)yQb zdGh_cgN~UW=9L5s{_skhEA+tjY>CKw&V_qsFYMWHt-q>Df&b`%pmmNP$|h!aKAhOf zc*IotuJFptH*?P`cSZC}GM%j4bImuSCVZJevB0Z_!gDj<&vM&w;b;B2J0<7KP5B;c zY<<4_)eqPEUpbw>)_;nvyz(mP(&ZNcr`Tn^vL{M=9t^tcZ~HnRYG%X@%PDtEelKx* z)Uv5iBe<Tq?q8s<WI*&ccLT?g&?$j$d9+(+CoX2yu4%b=_c6n7o8MdqXRV)Fc4FPv z%ZI+!NyKh9S28)QJXd4i#xFjJUG)``2InkiGv1xW(R=@pNS<<D&bGr-4t#uaXy>b# z?K|`K=$+h~7xVV=D%qcwmx_0pA2kiR`u)VNWN)pOmsV2JnQ!(!_xf#RzDTrR@RDQ$ zUotN@Z-dLjv|fhVsD-!JyWhyR+x~U_@&%jUip`h$InTY$Q}onw*|%+SL9I-;JO1#b z*Y{uau8uHly>0RMm&5LFJ{?n5Z}{8pZCQ7-Q>e%~y??=DzeDF`4*1Qy8v924r$7~J zkKp;2*C)71Tn%ZRc_{bGhlI|3Cp1?-{5}1G)npSnN1tPJOKn*qZvN+Z$YRhQyz<)$ zWhUdp(ZBkQ&%IE8c07$q=>u>4ghkI^^yFs63!GYB-?DUDVDUoVHRnYq&EZ_&<N0ib zlAiP7r=D^P>fCljEjjk@$HAzd2kj(x$vsGK%}+SMlPCLO*~t*Y#{2`(%8Q$;#NL1U z>$qlS?lFDEPpY5)vox?y5WFPWbn<nfuT!_CkLe;FiRW|9K4>b~ROmY6kgxR93m;PJ zcU<F1+3I;b%cY`TN!6vz@>BTnwpW2~r(d7Guj{kJg!X&!dRgCu?|kyt@=!i^S^vk$ z`{fxQvK}h_{(a{P!=B&sEn<AsMY}76?6<IJ)!yI!ufF4tz4C>9zfbJ1WM-SPVV9fl zpFrPJN*33Tn%>>QW~!CK_~O~w)b3)=|57paKQI4h`1@?(ey-HKl;Y{zzDe^lT22Su z`crRYgnA3l)2Oq3GU@{Ro@@SMofhy%IkLKAO2nzNC+{tiNlP!QJt;TGJI<apgz+rT zW!rhZk2E&jvi5cUcvV02z^Bwk*GKjdd!qJqD;;_Iqm5Vo<Ig>RK5VJ^KRJrQWlNZ@ z|N7I+92e3mFDSX~x0ze_TVZKXP<>QIO~60rUy4h+gQRk<$kosPP+sxp@5|?^6^T=v z4w<}hJ#{@@CNZer$f*C&ahuEcFE1{V7dm>JeQl1^SFMLv6Z1RQPKdhv-T6WMtDQX; z*7q(lzx$$xgVVzzZqfV+8Aq=OZM(94({hd(kJSZN-xdC87V%PR^3(!3c?AarPKifm z^?!Yfyf@GEI#lsUVG8?x70-V^w$wzn^c~cz51q=A`1R8^iPbF=C*J!XQ5S0$T3goa za;2=&fX&)c#`V1xmw)o6cW)oLPO!_2d#wJnutP-1Q$#k6bFo&A!kXj9*`FvV`d8V1 zn0++gEV6a+eb4*rzHEwQx)Z!8Y>nQe^CA9U)@jwRW!~l{CH_LYj!8peQfi9NKAW9? zLw<d-SeC>0#axK@<mQIRy@~RbkIY%uuxd^@`oHJk|2c7WKP|TX`S~+uf)|%Oo1@y^ z>^VWozqt--q&?ZfrW-qV*Y}I__Jli~4h;NIm1l7>NTkH=0PkGUIgvfRPStmH+SuZ^ zOJ=*coL8S6SbyZw#tl=xO#X7jYQ?Y8&|lj!7$&ue?3M3gfBxO${U6<z=S&<YS}o96 zQJwm>g-ue1gIoET+P>oOq?Ms3d5Y$8T#{aR!S_Df!8mahw~Tyd?oYdBw<O)WdG(B` z;bn8zyvcV|?<GHI_|weEd@JQ){PGjtVfC|vrhamAGgr8^_{yrK^^T{7m$qpHboj0` zsd;nuNY?knU7V#8qFNS6RZ5+A{3kYXgX>X^9=1swtZ#ccl1uyIS5K^F+SB_nn(M=~ zH*2>Z`Of`Gt7>7c%#ta!2j<v+zqS3E8_Qbvxo<YSPYY`HJ?A6P^g&=2r%~hS!qaSt zb36}U*f96L=#EXCnN?1~iDA|CHQy7S%IuQq5!k%!i{*?v-+Tn8ys_QBbj35xNwOSE zG{4Q-|2ysYOwO-<6Lqy7?vZ`?o-@~X>SDt)CF{3txK^@Do$LD%`2#7;&sFd6l|5Kz z;O3XM!}q{6J~P1``>r${lsaCJ&~x<PC#GNV=X3sFJg|IYgvkQ7pRqhO?d2RbD{cwY zzcIMI?!a+3!&z6)bj%T(;Z_nB!jW^t_Rqt;zr`NUD@{Ea;at<dWBLK3ACYff|Gp#7 zoVhl3^CoS!u(f<;hMSq>TS{Vo9%gyR)fmUk{%V>)L}E|RnS#egf=Tksorhv~Fh}j| zobHse$A9q&A3cR@#&3#VpL(IOx-(_UmqXv96@2O+Zc0w}O;?zDVn@iTZM>g!Ew=?) z+QuvIxw<~M@SI()$<MMM+yBfinq%r+{bzS(xygi?mKv&S-h1gRE9hUWamL@_ATQs& zgq}HP3bOTk-h3)rR&cXts)z=&%u<&v|9Eb&I!yh?QOKrI`r12jnZfGT+YN>1Zu0PT z|6;hy<MPnzbiJSI@r5%=r-j^oT&XtAx9zIP$&W>GZhS%IKB?w^&(5x4*r-#vdgq&| zzWdbH20k$U$R;4TtEF8t#((xy_obHK>+i{5Ti$%-*VBErNzp<lwp!dTo_=GY^#O~6 zTXP?!2`u(KtD|A{@ORZj&6x5FGrq0=I&VhE%YFg%hM?S}<oa8I^&CDQ7ECj+za~-P zcwDwZ>!;uYp1z_(EA+l9Fm2|z`HSD!@1?s>*e-!HEYE~LG!&lNEcru1z}>>&??z$s zQm3oj6)NqMUib?%A6qo{E6@2SUtTh7kP%<DRAh_8?rl4l6dfvE-adVjnCrcH%4f4b z-zq)idL(>-!@^s&*0YWnEZw`b{<EDo<Dtik=U-><sJRmPOW@@WHCe+<&eh5O-2G+( zUs>$tYn<{vaN%%MVd(~6^_d6MJ0;nbeIIi7&2+OmC30iZp6G(uK+A{9;YX9t?QrN? zHaBh3-uc-=OtZGTiyJnqiw<4MU#WV^AeJj6{G3kjp(lHurQfXEk(qSGjakepHlW_~ z@6>I<i}RSXPN%roUMz|*D5+!({xM5rLQ{ufgWthf4va6Cl$wO{Mo*LqojLiwC}-Si zp0yJzZM~zr^tZGf+t&9fGU{esxY^v(>%Au5sB|xvn|?gXYHr{4KK@AXcCIp^;DY<} z6~(x|b4VO!o|Gu;bE$XlSHGpvVspQK(5d&m?5Ez%a;f^PVbbpH0iS2zSpWao(o+?a zrP3|;UMbeR`>A`$<lz6uT$8)X=Nyb#=2*MZV)ap}f{iy*z0T@A5v>jX+AC&odHeQ= zU0>3Vxg<Vb)ab6wwW|BO<+}HWBbLhqo;Psoyz0X~kt4_92uH`t9~0h8TbeHJGq3cB zt#!@x8TDeP^pX{rq?f-BTK3yo$HQ;+-<x(vMVI70WBkpdX*JC#R`x85*#f3d@(Zt5 zE;*v`WjkA$<2nI1wX_+g>t^j+y>R9swzS^JJzR?`L|r>CEP8GCKMPz4Z2ZtuJMXy2 zHoep-Qq2YOx7w!IzB?4TTz2C50;}ei1=}|mwerq+v9o^bA=4*u=VNV`Yc>_G{kDg@ zmeu%^vGe=I8y0d4`Xn;jR++qr;xFF#Y**Fi3s+CJRlLzl+fujt$0`GNzvbdpJj;H> zIvo`;`@yB5yI%ie>5DMwZ});9ua*<Ob1b~ovdHS;Y0opeW9#=X6S%P>L7CU=YR9>5 z<y_VcE8lWEh#ov~xSnUDQ6=-s+=N7C!-T!5InNa$Z+PxF9<5X}yY_&+^J?aQFTzUI zHZX=S=DD>hFM7(8HBYvwZaF9+IrE|4_3)VO+y_L=3X)4M2&nD2UigCRmetRW`nGGV z4^zZ%&pfo|PA2m)%jMyYE5(Xm`0sjFx>M}&GCvdXd}eEt936$7)9lkMU00Q`ZjV`W zHay2L<@bsD%^f@%iKW`RH)pGICW$`2v+6^PZ}z8BaqDxl+tgnDdh_Mw<??#wjgLwf zPJfugD9mhZU;-N0QmeN#N129<I@zaeF0}W2_!It)!?lcDr4k2{6Y}J)pPk{n^2(>w zR|)Zde)lOT@9@+)>9zCXiFG2A1y$nTOx*c*+e+U<_FGx^vd(w$xqV!n=MTsA^|$xm z+gATCI^V1F$((!l&fRw8Onp;kptN+u-nn&^6N9of=T_C*zWC5&9`s9PX{)2~gMTdF zKYp#x|9>+{AS^q<C*}SU8~MgVk9wSDu6(e`{a1C>)qkv(`{a7cJW8j%dXu=VC9rkz zk3Y7b=GuvI73aw`zg_XUuc0wS{`!x{em!Y<JIv=q_b<;(o~NG@wp{tQ+Zx}aDGblQ zE?Csn(y;XMqxd7d;q{xRw(^!VMd(#DdHnmZ?e8|u$%}6PTcOl>Xy)7E&3@e4!hiq$ z|MvM?@YHm7l}UxS4@S*+(%4n^TE%JU#6wX({Aa%1Z_j66uYR^8S|E_^3b(Gwnz9W+ z9uMMKas;%Qr|X}{uxPM*m~VGvLHfEv;|;vBYGqszkyG|8<o@XJwyOPieTa$E%BE$X zQ_uYJ-Xox}cGu?54&^_%7sLpu&0rG|eBW>?a^eB06Jjz4h4UR3t47>&S^MSi3z-Mo ziXxIj`|TUIJ7`BNbY!(x|MKkSnKgd%r$ra^dwRT<Dp$I%*v+xrbK7Lsu$zzPZjxBR zTfx(?zre9`pSiL@R&Rmr6_!&>%&PUh9f9To9d+y+nw;5J7Ax>v`T1Zfa}4M4Ywh{V zXFiCS8|Nw*lCwOW&AM;B2*W$eWvPWr-<*AK{of-_*Jy(2tEA4GO8qGlH?;U(WeVMS zXXBYu-+ntLZ@aO+)a0LEOf9FTlwPOcmm2T?UT5Zn^&Ghwtm2iL^Pnnp!OYuHD?&Xs z*UtzKGIg^^w_YjKZX3k9obR-q&ecYn=fVw5w&^F=`p5AbC2zFa*=uk~c8<gw%N?yE zXYFd<&8xC9Tj?JbbmouKa;F(uC-oa17N7H2Tkz2>!-K_6eL+~`lC$%}Vm|T*dfaa< zP20f!BcUbySK<@)Pli#G_pVavdJ}viOxLygxqkhc-Lt1YuAduuOt*9WugSq1YrZ9v zuM@f@_gl2euefZ|@posg&RUQbxL#$p$rYo$o`UU5UxhSPo;}JH#U}Xc&P>ZU7i4+) zg08oi@6Pjo7k&4Nyn0Q6F~5k9*v9vV*!ybtI8B>saj8A)s>UmRF3UAS8-<M`t2jln z8%;~n8o~>*>UCpY2uVHL!0z{9m)G?vY64Rv6#dH&TYgBWJuf)p>rAB$skU~3TjCD8 zU9g|G{eJ4~_$Qxv-$o{Qf3$eG=hYEsnXqqHIG&m6hb{Oes@e2jJ3>m6CDI`+m~n>V zkr!2hR#}S9zI*$gT-dOnOp@seZz_w!(+TG)AMUned7h@B?h;x*+5Ajeky=ab>HC{< zgbn4)mWYH**zoYyLk4BzgMqgde&;UWUmhg&y_VzMj475!ta<k+3STtjyDPjrE>`8; z3gMlGitFE=X^y*{m%NjAlDb^aC#8iI31+t6W>p@{d%8MM|I6=?pUq*hTrQa%&u+*} z+HhS<;7roR-q_Qk+18vI&GoNR{gt^(O>Q+CzvN<=Gw+F&aRy876DwBZEnII7e$y7= zv;H&DupxBI?mNFvEPnN@^R89pM3;Tf7Jn95^Z3c+8Q1oH{(CFl#3aoj{6pi!ofm#` zKij}=7ZGK9$53)bwauM5(_d^<3%atf`2MW)zq6S8Z+_S+o~LluVtoKF*P6wr+v{f@ zmJ6}HvH$b#rY9$or#kNlV4nYyDf~rU{PHN~h>tTAV;Lp(UfAaSW9DHw2IUhvSA{0O z&h_lHPh)?XcK9-9rhY~3+VuDXLH?G^TN{pgsiwU5?K~(KBII`Si%bYxocM|f_gCBY zgxt4?dH?%UV)~A-2O8{*o4mht9-L>kld14W{jBH9h2l0YoWy*n^Ue8y{W0I~ZWfK; zdz3mS^7)nfVVh64+Ej1+ZF}SCXS?{IUvc|6_H8(0vb@~l;r4|u6xN?M)!5y5D=p!C zOxN_SC9AinRq8L5W_{K=fAfy;nJ&sRrpKsm3riF}`Ryhz|6Q-#+=4^fUM=>|eapP^ zEw8+FuF}C<^$)ts(l`5*J_}E`X}W#lbLzr_)x~qtzn;{}eL3^ws>xCY!S#xfr3YMh zInJ}$QdP}j*|9CQu>14Y=yGK#N7={#1LrSO7ZyJ})3|4fL4XxU{)hcjWUpEr+UIrh zw0J06+6xbclNX|Y|8<m^7he7RUfFe@k}3O(;-tKGIr#6^tNL0msJ2~d=3*89iP>+x z!hb*c>#_P_#=n)TF9u({wQbvCon5InzH)ALy}PnV-s+dO&aodQKeM)Z?ddAH)-{#y z220(F;?y$_Ijs^7e%O<1)v&wW>j>NJIlk*=|NN5CwDXYUQja1jn>r0cmc75de`Y8+ zmk4{POo@1Kpt$msPhNAB;jH?^xW-p&Io4^X%s4FU@YSHa<;&~6*Vmp|9{JW*<zZ5| zo<Y0%8(F5wM*j|JW=sk->-l#zG)g)(cxq6O*8SbBGKU`(<rV5|-?%#9Oom?kkLZp) zv479Y%xj2cS;<;_b>X!wFXzg<a?dsrYY(+s>d7=O{POC}PTm3$Odd;PHcmMsSuZ2C z@8;@t{*!-COPRD|m1Oj<HznP%)1KeSdoZ2jhSp?tKhykoC(5mj>R<Qey>=7*x<;4# z?uQ%qKmC2q+j_9>>W52*JbrQeEqs@1cQ)(&Ev}in&I&iHzmYA9%D;R6vCyO1w0nN$ z4>vm<b}-7{RmWgl!6d`>MBr;|nB9|?A6K=?*GF%h{rAw!FZZYaXm|W7$NfCCNMPCY zKc_Bj-j}j?>zr4o*1u2b_tn@O5gv5p*7b7z-!l#iFX0fpw&F*F$n<}+h3BSse%alz zM9GFbQ&mX5_5JCrXCGK5Iy^XMdgrg*ro1$}^PfI@XnnO|VVdj||LS8v_^$ZBPS={{ z+q7nQfA3$zY$Rpxtt&tK*?B+5HHsha*9ffMQlQ48S~K@qdr?`$wWi&jk}nct)y&1u zZkzw_qx#etR(HV-7$#%G=?`5bRO^k5P+Kr}qpbT?%=ym!)qcglWzBcy2%mz6^2XCO z<})8IkiR|s4qMry{q;+_uB`UHYJ2(Z69WyOsZmQ#^ozK9Mg5DoqV&*T*HQnVy5Qxa ze~i5MAN)N3ssH=a=j*Eiy;Pom`BWFn=cSQ6y;)GR_37VFx5YKL)=#^%a(gph{0CRB z`AfE3$Y9zN|G;+N-+%wktFk3-Wjp5bE%wxFP7R%J5t_!LHs4(S>*wF9ckIh&Uo0CG zyL4C83*CjGiQ50_dj2f)*KXYz)_2hCN~BVP!qv)dd#@yuV&|J1@&o-RC(M&i3EQRo z+iQ*Q!6nSk--4Sks<|KS>mRi(zIo^n+a-l{{C}D}{(ai_XCuetMbZDX)H)B%e0n@- zu2`7buYd19y?=T=>3o}q%HwIxTQ8hs7Oj1)!gMj^_HNY<4d$pgZr(q9VO*RtVZvI> zRtuTjfABA|GU-{EZd&DWXm(Z!r`GA>w<}YYZksMz$J={q-G0ULH|b|j%)M1mAM$~< zUGI6v`O0Rq0Qvowl=Nr6Fl6~MbKl3mUYi8{%N2c@w_Yxn>(7{A|9R^4Xy=8gTe2LU zx3PVd=H98|V{p~UWly$px@%LX*+#+aS5hMHZok@+to{9e_G+g8341!X?h!k-I!jkc zzS?;6rCN!1ZPvbpFW!6ow>i0TX(9XO6%6%z=HwpUIw|nPf*Y!SEIMw{lc)awnH@7l zkfGh#>UnFvQ|Yz`6Fc6#3bvYb^aRs1L0h3m9W_eN<_35*A8y;lH%IXntNTII<2efa zA7%v0udR%Y{4MbM%4R>O<2TkC3e?7`yn7L3S#w(Vpv{TYTGeyiuJ1a!n;D8`tiCX} z?)$8njrBV|on4{-rB;)<!T+w5Yo@Y{)KQCt-GMfGHg$jBpRqZk&3$@BZf!%9njYt7 z;T*};{z>Ke%k3h6PoI{{l=gh?hI^)eIvMqCg<2;o{Q0y#|L*hoQxcBMW>~gIXamaz z**<L}wmoMx+?JgVye09Xg+K4f#N_5BDb0_WcT8qt50p@^H#ur(-_II)S#Y(aNg$W< z?1BR_^BUDG0<Ycg@j7LB+%`l-C5O567|X{U`(zsgw<d(Ne{G1$OWPNfoWHEtIzsfS z`<Ju`RraoSHtk0rc)~c(2-`N7s)$cwky^3nvh9O}zC(+QKLtG#ld7KmC&xM1ME2k; zhsCKvnm5>_9(`ajsgJUHxaFZ_TR}r;uWH93_XRI2H5*)FITpFB+&lMh;8tnISqBpp zd^hG^@{;)#^SyY(0UJZTts4?1EWePWC#qEY@cz4lPkJ~CQ*zg}^0=kl{G*k1|I>4} z(;UGk`)mpoAKhsC_~w|S^0%Gp>zJ~oUb;W?vQyp=RMvZHyHK*r$-t-e9>MLK_XbaP zRqMLZpD7Ti@H>e&>6GThd2FgxVY(KN_vvrlw&B3-A5kk!bprfaeOK<kzVlZ@38Pls z=d72DZWe77yPSEhE<9<*l7{rEwMW>J&hz+B`*GvRp*Q;<Ca#>kXu&V9IoFTIJ0EDf zaqCn~xn#A=vjv=!`}T)UNn(F7lS!vOKcfE!hvv3NBGxkg%Ab2#7ajRscyflWKp3-t zuiGh^G|hZfiQ{ublRN}{r?(bg-W$YoN;q-NZH=REzWYy0if*h^4wODEFty0%-7ACn zc5&^7SEKYUUXPGD$=<CjAg&c^{^(0aY08quTbr~e?#z6o>&C{oaA{TdL@|{aR^D&p z>!Zy$XUq*#QoH{tUNT^pQi2)B1mU!TsO81CH<-@89&%J;%`Y!ift7w;*<DS)RV+{P zPB|9vkei!Hb>EJ1W50dpS;Tc_^~yb+`0tu-zVb=7U94*b-%IW}*3Izvzr@Enu{dV^ zz_$mwr4=l>zp$h)xbJ&bES}kr{YKof^XwmZZ*bRlEmln1V68eQzf5$-;msRvD@@_4 z-eBEi7xv=f>CMacA6tBOR>#*(ch1i=OVHKmbvU2!Rjw&)bBSSldg9lLmgMhEtqX6p z?Y$LH`?)H@I?|%FsByc@r&FSGEIS^UI@vK>Xfe(#V>T$P5PQH-=4*c2$ahJ>lU1vd zeoMuy-1kQ1ME%3>LEaPEH|SjGdEvKli<7y#@R@{NMMeJ$k3>#uWeHoJXSjS>b)?uA z!IONR)7t+l?$tUebx7yi&78+p)BH@#Zok-~^nULAZIeuUcc)MI^lkRDZ^g5pu|K=^ zF75KorzVEX(K~Axo+@bFO7lM(dwp$w{jtRl=H}+VJ`i~Jz{2ywKkHd$Og;Tz{&!<H z9qT{5x7k0tc4x0HUE5uF`N->B22-DECHB9~bMse(H{IIgdyq$1<n2P)gwzj5%I5dV zO*87_i|N}{Azg1L^Z(kdA_;{{ep41TR`9FmvF^S3F6?}8>s;Ybx11w2Wh=A}{!g7e zS-5#7XZHWZBa-zFtgj9}lbIk<|3?0{mVi}Z)%AH%N_{`qtbKR-c2!gKx$w&UDxcOJ zKDRS%V!@TdWkT=1wW&Q!=KHNR^J~MC&03MW<Tq`fAEzokb@s}n#M}ViNk?Vg$*kJ_ zW?KJ>N%c>Ii$WaVcf>D|6rI)iel5p3+Y~jv-;b&_&m<rE95_>DyVbSF|4NPCYXqm% zOJAL>DLkoQBWKx}L@QD5gBH)eFtMiboPEhze4}0akytQ$ME-fbNZkt;*Rt59Zu#jl zF>mvO>PPb`)+>GQd%ga5xj;m-V9QNimYFTz-s-kYJt)lGF<mU`-!axD@(G{2+N0Oc zJ~3l`*xj?~++50imv>8xJ;_N>W;?&2EjlOFU!}hK$j5gtTjReUslN4X&x^wxmpd!Y z3nt!a`+02H_t5(qpLbn6^OQsMV(eY!l+vKyNzZ0ZPQM_1!{F)O)E}!lYEGDNnfG6| zaEmLb`1Xo@&T5O(5Auwk8wtkES~F47XOVy}7qgu7SLeVJb5Bj*`@KeuE0oubCrv9k z@zw0!&}RmFdFw+tjv1ya|Inz}9eqgVn`7%&r>TG2CoRg-I{srW-^V*oXHFKsC-e6B zktFtf#VN0YE03lweo=h)LDho|!o3abZp~5GWxd62xIJ0E-Sy``$u-t$t?!tmOid@` z$4PwSe5x~D=)7cQ@Ai`GySM)o%UgGTx7A%OjblE0b=sDFRR8sUx8$M?($@~1>Ab1B zt8nI>J281bzApdISpL0!KfIY_cwS1a-pIlXeVpg9nZVxX+FzK@ZrC9#@k2mCQeivj z+`Ek1Z)1$wPpa;p|0qbswR6(lPdse1rfGh>dMe7pH(q^)#lPm0T_>f^&zY|mU+};< zuHN5%ub=%tB{ha;Tg5KF&aGl(3-Z;URGGj0`s?}gEySCOd6$dVC)&44pX+@d^KikI ziu$9~<-cBky?!!sS&PF1o40d6-<C{Y@xg7DWctIU=YGEbs&Zy|Lq*j@r}jv5KJ(`M zVwqM0sd@V?cL_f?alWUuDD>=`6M{?yJJvj8_gkW{<v?`B_6~KU<hFGTVR8H)N;ge# zRX2V*C+<MwX{mt7TOZ6{=myjWvpU_>Y4jGi<DB*9XX!61!<TdC{nJ(}^f~?V^pY(J zUBCbQp8vA{<@TiWX+oca{Pn#adb6cJy?@9!`dPs;k$>z(zy5xH^L+nJ<2xxcADjJX zJ<@qdNg-W^Q-%BW0ozkcWD9+J6nNrJs5brLu$NX~+9h<MPjhh<(?P+MeF3&iU+Yin z+isLQCAqBk{emm1H{~uoVq`68teg@4KyJFbdqaHnzE!48XIV_1EoeL@$9+5V{F13x z%PNchn>kLsZk@zjvU-Mt;Qo>;eLvXR#8=C{v_8_h-8MM$<eJxMr=sU>J?++<s=|D= z*^xuAuAetMQ1XKR)RVifMo&}we@)3Ux#V1SeV5`v$HUeyZ*p#Z*~~Y=!bZt=afm@$ z>v9M4s-h>!_aAmmwbqxkX#L!y9XnUa-#@=UY>l)1=dLsFiUW4DEWM(tX408G>C5Md zqQzDT=U(#JwfJWmNzM&3c^Ny`U;l^3k=Poo3t5l6l)ZOfoNW5~sb#(|1C!L#>02X& zru{eUUs-SRSfk(g=~vxYH`bfq-^TLXusm?!-T_su$dKmeKX0>rpQp*`%hw_G$#Y*u zjsGW^3n!HLCwWYL>Gx{lga<QN!&_Av0#()uS4~pp3Nl(7>a3`o^IFj0m+~j`Xv^Y1 z8%kV`^?SF6oZbAY{j{c(mz@8{goexw+{f+&%CFS1U8kd1uefYMT;%WUwNZP^=S-Zf z(XQM(J*7cbKQN+u`iH81#>ZYZ0e2gcj=k#p^m)yeMV>)E>u*g|GQ7&Y#$sQ|EZd+x z46klSUDi3aB7Aq4-5QSoi&rU9o(Zy#mubG^NH{LOCWY<D_HGH|KQnSFmldDmOS}DK zW#5s>)<RnQkN$4IoDf={pTA(D?VbbIcErw>Ogt{fmtP=iyT`)wTlDRYH75dZyi%1u zp|~S;Tka2zhbJxx%=qh)yCjL>#&*ZlrPI@n>=y93y-Y%}rBs?juG*l{P@E-HneEuA zH9u^-mD`pa_1mo}!|_o0luOr*b;`>U;%>W_Mq0dVmE0&7m#tmtByrWIv>vo3{a{2+ z-NJ<v1lg{gdL%9A6rd-&&{MH)tB1Y7Wf8H~dnGE#f>(02miU>5Z`kuCZ%agI>=DKN zD`TGP9loH{uO+D6z4Od=UUprrw`+|yF&@k1_mxv=c`Mp{cb(C*m!2+~%NVL^yp*gp zAL{OOep9{fs_K{Dj}Pw8S{nYwqqqKELigP%?^`ykb?ZsnB+|ouOkdT#?44NjBH8C$ z?|VXnrfl0}ZRT8m+C#~DhpzGI6H=#+d%G_zy|rbAw)&O6iA&CFuS+y)bMRfg-cG-| zTaEKl=+<Ua^{G+G4EL&izZ9J>-L=uJd;OPpW(9hjH@^HRV>e^W`8Dmx5td8l(U}uJ z*Jt<ko|65#zBHu9Em=VPMS!sDhB#AYSB}F|GQ1}9Y?!IP#NlaFt$W$}53<e5Wg-R_ z!yd30oSIPT<X_~$SQ}_AIZ5D{NQRStv16lOrqdZ+<3}qQculjW3P-d!Up8U4c_A6` z>hdoOb$Ns5o7PHniBH&ZZfBq9`ov|Hw-@T^>(#56m+g3wG5e=k?!|lU(<Nu0R5m!@ z{%Fe_tHcLW&E|Y*c|5yd&SbxsPm%r0m;cmISJ)@OwoFg0tL2B<a^tx*6~aaVGb)a6 z44X6i#L9-EbMC245)(c?&`Rw5V{&1_)83MhspscE;<(u2eQ3MdT&GmGk8CT}85PC_ z&Bzx$mY#IzXZ@1eK10V-3Y`<4&d70ncq}>FuDE5v1BF(>y<d*(KE>tlUbNOFQ2qKf z4cGgNUS0k0apR0l5uDRcnXY4$lG5=>HJ$eN?MbeE`BSCz&R8w%TXSB);rvFcd`^{y zI~E2ngG5{ZKRse4z3>cIjiA6(V;+U{wg|D-C!VK!lB#~LEmqoFf2YvQ)#iIpf8X*Q zZn@?kZJ2q^FF*AgwEX&+)52M06BzhP;-vyq_<g@GEk3_6hu6>WM#s}<O5%+7O`cxJ zNm;Bi@3L++)AKFAH`-X%`0RM_HZgkZ;-cHzE3X#jFP#{;B<+rwuAySiG-C~&H2&+| z`J0<R6-6-|FVlO;QsD4@PQA8wmUV8NjFtW8&5ynxm}jIHp!U`2L+a;Gjb|elN_cH- z=$oDH|1kE{o6XjH)>i}<_TAg>cCV%Ky7OjlM-CD7(49)}zdnz8Ke5*L<qq?3``CvI zd2hX!`IL6O=HKUCj~~r8{*%6g#caD@7we|#BcJC#vOH>9?h^BH&LfV!`n@*C>owk( z&bl>ApihOpIkVzoW{yE@#fzg7hPfL{ihLs-I1W#VRQqDmKEEg7kl<NAHbt4hZs&z- z{`|8nb~IPxcK2Lt*<|Evo<DDL@Jr$Omg414uOv0!>tS9jsdDw(QI-uegLuO&9_^3z zntM6=@~?8QwTGVe_ongKs%{N>_Iknm=~4Bc+djy>_MWe$cggzZiKR{&-+KL18*--~ zT6I)o?}}M{DSJO<-r%u*cSv9C%bV!A=XO5$%lYl-rLd&T+s2RW9-a69$bS0r#_aWT ztz{NT>?oc%(b=Qj-1oFM!{RH!>R(jcMGh^mS$6Y<N=xqi!#$b@Yo+JUPCQ=B5&c)U z?bPiz9=GaE{A+HR>^m*y`YEnbIaKmEPyVSmryF6S%l_?PHSYQ$-}kX3$ZWa8{Qa&a z5=TEgoIb^Pjg)=(mGCVWwM%~F7T^16I3s-N_P6Kwc}-`<{M~c+N5JZ7z8kzn0$cJ= zU7r5v<Ltti7uPP|*JxnM*}8P??sz5JzVO1Ss*$ROkKDb_zu>)8vXeu7|KAVxYWH{- zftyCm#zqF<i@obn7xJ8q_U>2S$-D1)_!apK*Z1rOFPt0BGVRR0v|XXSta{J%FNxnL z?U#S$Xd9ur`^_gmeKynF>E0@?bu}G9y8CsL9)9rG@zXoU_U!PdkDTUpZLhCC&Cfp_ z|6fmBF~Y!2FMs+|SA&ILJ}rvi$g8ye|6BTbP<>I}k=NZN_aCvJ%Y6`Y*!Ss!&yse( zum9ikH~C{<re<S-<hQw>PjkAx_~9Zq)9v6=|EKSNhTh7b_~>=_B(=U>1%(?wn6&R! zy4SmZfAt>~|H_tKCS88zizmA{G<5gt{t6UQoftJm*DiXwdUt}@dXF`BawoSR3<{mg zbE>jdFz&~qddAo^>HltfUGsKLy0Grdf#=+HowNSD%>9|0s8zA~&-z(Mj2BNk?<#%L zg#YR9`sww$`$MYBnj-?zDldYz<E^Th-ni4M&3NrY`-Ri$|Jl_1-KzjT8CXeAh24R{ z_MF9q^K52?QJyDn##k-*pus<3P56_GwXSl@K3-`2n7}!?p2O}R-?c4MEM)T@PM(xf z5wzjtr&P&@`N~HR*fwNN(MaL^EiG--)HrkM6z=|I)%{br%{Q*>-EE?`B;C*IkY@~E zP-va=$&<FCOYd9|F;sVDSKo8-VP>nX@Qk8WiR*dlSZcLWLM6^JY3$eds~opIpmBjz z+q&GNSAWjcPL|qP{iObLQ)T{&n&%aF!?LalU;N~<*3X!e;jc=T-GeI=#O8ct7I`o! zS|H9l{;1;RnI7*C%G@$}dAi`2iO}kP;WFV@P1*)6IZsai_+!!PHnWbyN4xQI|3}7T zDHT};&o5S+`A%yDKK5*xcT(fP`qq3SrN(xh6Dlf<3plej&RDOQd(R}gesa^fWVLNU zXC&@+#%i4Lxy}|a&zSGl;kkW|iUx*pGk3Omxh6Y3lHC343ez5w6^^q-t?u3A_{b{8 z{B*{)<gLjyoKo9r?8N;o6+^b@{#$%YSo4lcLSc>8HQAS)PQe{-Dmm+Rojo!qyTPkQ zO6Bp18FzvttfvRswQsD5lwEp{k){5M)z;f*yuu7QH~yGB<L$1gJQ4RIO(vfe?&^AT z*mu^KpC9k=6b5r|d=z$N=9w}%-X;336IZSHKWFLWq}Y>p_*D)%yIoT7Z<!Qubcvm` zVeNjdIe&Os&+-@v`c*&M%dK$r0gI7wgT)Gioax^u9+>#!naE});cT71SCvZx@}*CU zY_FeERCYN1MqJ@Cp9Np8|Jo=2^przc<V%&X1>cqbT59NvemuMKUigYdpLs$`O(s}G zMZD(aUACao>aLc0_FtbTRr*=qb9XMhcrthAl^tIy9IiU%FEn$Ta(ml)&Q;yTnq1Q( zCLQ$_++lOl|M*3%=G!GL`pv612_2dg&lw_Iamr<tfBjZXuGK=FsbU@{=3d<F<}Br( z{?ORtnR7gwDA#4H)qD$V)MZr4&wTY|TvA}#>aD?_8vX14LCrY@yBnvpO!~f0aN@<! zOHBBVZY^!&`q~qr=W^nnqsQ+}yKL=U>oi`NP1(i1msd+9*Eq-XWY24{1dqhFdu9!v z<`f3>W!}@BKjBb)<0mJr4o<e|{yRT7J+F7$*m(5733buT`|}eYzA|P0o6aDzTfJpd z{T223kNXq7=eBe6z1c2kk`pF#c~irTAD<%ZJu?_~UY!!NO3$vqbjRV^)$0SwXIqBX ztjRyG(7Kveg!9rab^SvdADdtDo9cJ!{9mJr-Bpq4Z-045ZK?OQRjIF;vpdfB&FNQ) z2Iil=*0NX~m3sd5Xp6w?56<Ch@~hvhZ;{%jVUwP)rLR!m%0P_k`azDbvS+?znfssL zUD>NSwOVbdxK779`6iLRC(7b??|;kgmaToF#yR(l&zFRmucNCx5@)S>&2XytkR#_o zpBLNb8#OMHK9(BN`u0xxj?Jvs>(?l<x;6zYT<x}c_Uha7OjfRaXEe3hflGM#q?o+h zE45lzl`eD1oH;FaZyZNVDYNQ9gL4;V#FQUirQebKJ8{Dd!CUKp*apbhtc*CWW5@Mn zN|NmB45wS)1)olM6J_)~zk46!N-jaBO_EEtBy4(rQL*v$jG$>hcO}*3&6CeOZWCWz z&-d(!LH5pg_vm>366>qy&%6wq5@F!?Xrb0mP0QF_F}*^Ke&6%?O_l_#IlCZL=fk@s zyPzF>y2>-I*5!OCQ{=jq%<j;(dd9@l#z{?qH<R5D#i#w)WwOika^(#fwo6CP*JexX zymt1Uo_2$V=u($C@|RMlIz9bo5c;Tj;<F0=tE=npeEYlkfDhxFvs^m0k4^NY`%L_z zWfm^X5UY^!m$%DQnH9P@m*J`9;|ILOwZ+_;G5om!O3rTX9J3c`giHBu3w79D{#Ndb z%bkUai$2JPtq5KgHT#8!dt7ZbpJvYM70c>18joI(^bWjVIyco)@4WD$)A>O;({}W0 zu68@*xWx8UeOB@ESF<&}B?Oj6Hz>BgKGn2>=R{CQ<WfDO_kRl;_w`Q{RrRs)VGobo z&F%Z|*!`ae_g&R^r1vy5HlXy}l;sKmU*9q=Y3M$EygN`g+5gGR+$)zB$a2=l&J6e# zmVfrM-R<PJh5>g|e`R@cwat9FHF44VoeHhW>D*h{N)s=qrq8VpI<-IXMgJ{sH)*~- zJMTVe=3e@>F;*wC?o86@ca}+A+m?Qq(Ri>y=}f^nli(Ro|AI45fz+8hx|tIWUERZ< zm9omTZQiaZxy<`9x~uoypSz^u|K&Av=O!LocjaqqcKQmVVE1m05~(tou4$J;&1MI? zUY~#cR^$t_lE8*@4_+|WPbrSI7toY>VUev7;*x9m*3#kDk_EyuW!axkV95=)Rc>8< zoX=r0&nf9k=hr`f@aDpG_1-3Tb8Gi`-%Y2N%Y0u~wP4j8O+KO3Jh7g=B5924co*2D z%S>UbDDhTb(y(;Or<?H)_Afg1kndH{hpm5A&YZm-t7<M2e{`)+jrro;)9vcx!>UV` z?sy;WyKz~sd+}23(zSY~IlYCl*Dp`_@@K>39ai5b&of)yy#4SBxrsk=ZfE-JO*Fn) ze&jp<r8Tc(V?K2heb|0+Pw$#6x2~3%cekb=ELAlLve;vv{K%T;@WUOSbL9A0Gbj5$ z;mMg-v}4npD-xXbH=pGg{9JRZw{l&!^W=JIx5E|}onJM}$bGZrkWRTQ5r1ys>w}f| z+S8vr>-KlAy8d|1LD8Sz=Y)LpsWD;SAGyeTb@2MEwOn^)=jmrZt&@Mg&Xi^P&Qyzn zjn>!f&a$o)KVNfg)se50tv)i&Kg+thGymO;s+@bgn%}NPhov@JUs|9(=Uw2+k2@zD z1l?JBX;r=AswXqO=B97UKdjLDSgUoC#}zY=qFtXpdDvKPwBs{f>%nIAqTr%$@nX}j z4PU;VnIxUnK5fp9L-I#Gmy7zV`YF8b<qb^Uys`4xwS9RTnNBa&s!3V;^V_P&jXNLA zyL*D6eBP$0$7fWQ{kkH=@&2x&P)PYbm6!9Z=7zm~^^w6#C%8W8u({0TNj(R8d+*wN zc^jRWl)=tcxN&7dm{8i%8mnhvCS~axV}3J5XiYtDzIfL&#nQNIeTql^6!;gHNNJ}{ zJji{)XM36>*X2vQ`4-rO%bbe7TiCK*`BL}YitJx`<&s&lKavan2JE@IcBNVT`|XPR zm;*0AbU(GiXp#MX&H49c>a));WBjkSHcN44;JST}<j=~~Zwq*MGiutJn^`9^?Ox?S z={|h*6o1{%)BhRYT%UIg)_OIW-q^;ix;?!{<{S&7+4K)rWtCWr3@nVMGV;jO8yT7+ zkN3Tej?RzSE?D<|y+!|}(~*;m4|5AhoM6psW^)yIzHsdW_M6kV7k9?0a9#NKyYBu6 z8C~VVyR(}kR{cph`|y+U^G|0B%BD*vZ&cMWoVM#q&wf$<vl>fOO_wg{W?MKxyj$;z z>T;HatxG$&GgnG!zPL2yb-k&M*p|RmKh7&GZ4eJyH-%x+BcW{<qBIy2&#LYT_%TCC zz;qXji?^Gn_=BlIaX}&rL#9t@IlX*?ir_mo-pN|u4?IaZHdR>Q=8ia~MJempBUa6P z&FQNb<6koIft7ch%C2)k;+}mCjY_Q?zTFw6oE+Ilv;=kris$GpEfi&5#5%oRXpiL1 zc?Z`U?wlg->-2Yxo|czpyX#fcvknqwO)M_kJUBZZZF4kTn-|TvNU~HjbK``S+*7v9 zSn2KfA!r#}!EVo`EfKSgY&Z{Ydsi)yeD^y~Iqw$nkK4p{8l5?%Sol<Ix=ibOrEiuy z^*HLpuCrb|9~GnJZT6i_W}@+4MaCPaZ0lKUPW0XrFj&LlCQujeB{DyJ+N3i}xfV_J zSgCu|R_}pZ;at^YOGT=}9nJ^U?(GPjRnQ+XP3nrqR@Rh7QyvAql=0XUl6Z#o$*L$% zAC{$3wkl1PH%l3nv(jo<ZC11zDxJ+rb>lb`oc%EG#tO6T%z7)&n!28e7RXB7v_+yu z$N5yf-L+|Mx7-|;L|^Cnm>a?z)Of^3<j8i-z22`(yT7o--07*CCN+IpYqG(@)MfKS z-h@fiI_gBH-jVnbCfm4U>oX3YytS9~OVT-(%rJ^%7Mi{&K&5g@Aa|#>X0fq~-qI_o z9NZ0))Eqsfdt-bg?Uz;_>~1$IZcaTk<J^Ol{b5~q>f<5<oC;-6tPfb+Z`QSr`L%aO zjqlFXjI-{MtLJ<@_27Yg;;|@^lQOAU3hz0M#Vmp(lvYnJa4_bcG0FW@(FJys>YqjS z1>ZBKE^ZCgpBx&sV}@{a<i&u1mCT(jNnWz6uAh0dSZ8DJ%5`T~FM0hSRe1;ByylCg zAC9C{w!Qe;qi0YbcJ4?{<BO}^JqBTCo+KKGd0kOhe4^C1W{PC)S@+q~g$_j=2{gA* zEOc7PH*F7}N?(=dT9u8Jb8}NR8m^sij$wAyF)eTN<i-#l5nKDrjT;R-9!)wnp{x4t zj(&^8Gd9^7)23&<Ts1qLE%M?2gI?itwNs>C^GrVT_H5<cyZhr<_SDy8eo=0-3--Tw zXoBWrjjfkAFXs^d+!Z)i^$VYussGX^J0Bigw0MHdo!&1lMFr;S(F@FDGF94(kC!iZ ze5LbUYvqwu>U)0K)k&<<o_j>rHKNGn<K4M|^JMl48Hj1kJNIS1QR7N^&htxx>{f?! zti5ww^VwGCyY6)otE^*cx34{BS-<t}p|c`x{&z(_e4Xsi=YN0i-e>YM{eou?nYS;W zH$66Gtw@*uJehs}9^O5j9)4ZCef|E5svqB8y}#bBzkmOq(^sGWJ)i#f{PgqlZGQ4j z`~6M6ez#T4uWxU6zdpQqeq7Awm#fY5|5yEZbC-Ypy1E@45ym$5f8Kp~`tWo24S74( zH#h4aZhyb8w*1E<pI4UK{ycm2^ee01?yZOVCWRd~T&~?2aJ$QDe{R|JmKReM|Np;H zT+#JdWbU=U#<>O$r%e5RbxY*}Hf{M9Tl0&R70dqiOyKWs?GM~-o?5u!)4^+f)oHyt zp8w81e*N*xuZTB4BWvDetN&n_b(8(}{&P{+*e6*x+w#|Um-Xx3t9|kyS+ic}Y5%o9 z{_K~Xt<(B-e=^tE|IRq?o^js&;GS7|I^Ac(>i(~(%oRNq8TB)D$Fv=@PUvrl*V5iU z#pCF;Q~4^Z)~POYb&3dmdave8O;2+4t@Xt+*DI1!Htm|G)IDRJqDx#z1aIP$pzzHV z_Ck-Y7caTz$-ddtyZ$NbBva@5wTZo3|0MlhIwve{){XDpqVN84Y<~Ec^TX?FCOh9= znR9EFXjN8Z_C{4@%Or34I{Q|0=fsOC*S1RUkLt+od3$(ywTWY?TUC407IPOZrKVIt z&mXJh?>Xg7d75Uwahut+>HNFyw`=QP_K#toWw&PEx8&1Dj_Vu$`+EF;z4MZPulfJ) zuloFV_G@|lbBBIL+SJ$mIQ;Z`_&*WVo%0Q(B1IMMIk`Bo`IH2_R#>ERCV*2zGN98q z*qt+V=0cGbHVeMo$)9C$>fGN|ou_Ah^0~c1_rq`V^>uqbSXa)ty#7gU(>tfRngI># zo0*=@x!&_@+0>#r3#9_4Gp{OKR&wQO{m%P)W-f?h_*&$!_raO72c}P1{;-1e%4^22 zukNhBYw?O}Q|_&O%Vhj-{`mDm*>|@4m9oU|vzBtoP4s=Zf`K_ZPrm(c&>a?GMla@$ zBO5OT?mMI-<=JqF(e=@jym%$kPiOX}I7|ic<a%8mJ@Jh`W_FvC`}9S}Y31cxd{68? zT~t5sp!SE{fQBO{x8{3gJu!2RWiq{>IMG72Ok`zX)i;%(#b-9DH%h(CifFu|VOuS< zGH}_geRlSf4d<!&y}Whl{?cM^iQ7_sGhTD&ywgf7_PZIpc8c$c!g-sNW6IRO&$_O^ zIq!p{EbEm?jZscnSLKovx4zOj!jyH=L3iQGzjK~jXgrZrWW6$Jp&jSSt5%AwSF((m zSvl32<y($q&z<0ux5YQQXz@)=>Dw2lb9Ktd)T;)pXA_yRe4(+><B8Yx)mLaQXk%(k zKXXT?ruJRA!TUu4KT0i9rhKk4F$s9LE2-=LwK>r*xJ&py%5D1HynTXs;%CWx1^;jE z=Ux}YJ-n&k{A*p&yX}tZ8mn@dyQ+@QE0p+tdy#MmTb4#Z#kbQ-`m~<c%`Rzjn)R~a z#Dkmqv#nOu&;6YnJY8S&w5GIvzg^d^>J)E-xE=ReZZ<Bp*if<}pyJux%lou<8orem z3H4;R)0nyWE5BFXmw%1L3g<tud!{=#E{d=IejxFLaV)Q7va?O^nVY-VlXI%SAF!P8 znlrn$^=x#t_QFYJ2g?@DJ#mxqy!WTs+aJGsBD>z$O=?Ff^Y;3lJFn7Bk1L)}%6Tx2 z_l{A~YWX)Z-?jG$i|j~sZZ#@eUCt=;eCY#8F3WUg`JOYcb&t=SD7`JyJ8#CEO&_0L zJif~~s674VIgi<Hl6N*eJYrmQdYi`NXtU%c506N9?U-2cH^YAM_D?!elFLKnxI)xE zS4kfz+<(>9QStGof>S9*>+846q|ZF_`Y-eIA6wt=Y~6S0nd0rp8RcS6@1|ECd(`vf zWb?+EXI`qC9RC~jlciNyn?JWet+?v^!NUF7c8&{q&pEfAO7Xj?qhfyQ%%L8e(}y)D zpPaMy<%tx(yIWFomh-mU{_*O?;!WxqH-*={iJM&}AgLZErxl`Byp2z3vdm>Zrg}Xs zX2ll^*Vb!1aeFUs!TL$3nrla38&~Lw-h1{1cl4k62b`E;bY$}c%jo|B61VT!7w|o) zIdrS2rh7@X{=!`Ut=r^huAOt@reOZ=$;G$l)-=yI+;pLkdHV;Mwer_x+HJZE8MmK0 zplg$ymacM4@w`Ojfwe{<8ZfSoPW_3UMjsf@&$uZWd4RWj_O|us{~lLW&#~EebkhdI zOHFSN9rNhktg%?;`oklO!+#~7P5d8uk)`?bGQL`ad4`*fg&t2xzqsN>^Xq_xA7s{U zXOwBT*}Puq@vDMU4{p{6JYL~bd3oAK-?Br89!KkRSC$`lQ}W(@`clu4sXrbbSXB~e zzi_&2kBktL_T1@)Ju<TO#;>e$<ue{`d~AMm(q)&j#PXY4sxvIs-wK!~Rk^v8zxT|H zGJamuOpi@&w{p%pD;sX}SAVhXWxKG)cE#H-F20@2x$8_?mD1HVpT*|emo@%-WqVli zuBq+6%qJ64tG_4welDI?DE`J}8sCQ<)n-#`=Su%LaqzG0jku@ZB5#$wliOY2*S)2- z==*W|zccqwjQMHoFi~{s*SG%nYroGC{$#N5!_-N)qP|~Gej$2ST|}qhy6HNLuzWFz z@(WY#!}7K@UHi?o@p@k(tHhQpOFxgIY$m>2qF?`5EW8uPSbu7R>-j~6OeGv&ZG|U2 zImr8m^XXbnp;XuNg>wpSclC%CRi1ANIbFZ1S#)mH;+eYZCFWEb9Tkl`7~SmHKCRDf zNm$sHxRsx7Po2#<>AlZ}0~6i|o19Zqa4;8sx2~b!cA?W{YhjhOFMm|c-dEQX%26JE zqLeq-?O^jC#Vj`E{B08oX7g^mQ(?*b`}_+n-}}F-GN0~Ue|*B_`U(7*PyO$HT)t0# z@unNM`s_m{m)vQZ_E~$uj%{XlmCSbW$$rdwJB82U-iK`|XU)Cx@|oPVp6xmHp=$5j zq{*W1Wwu?<-t{=u`?$bA;WG#I??JjJrlywDp*<2q<Ee~1()A{$mZ)8l81Mck+rYP1 z8(O+Ji*@TCh*0R57}IpXqsSxaiNWo)Y&;TX4`SJW{#?1pqjQOe*XGNQ**CP`z33ql zd49dz5;rYfy+=w@r-`%v36AH9Tf$cPv8{f)IOjb5JFZf4C;wNT6#vAu;D=Le!@b4a z<@Jo|KM%!Ed9q!{cXj24*6t#k8>_gz<lY=%oycyzN8zv1#I$RZj$71T^hlndcKO;z z*=oZ{$1*xy<a;lkitkx!IP2MlL!VmrN9@uz-I$`wf32XfX=l;9M<N@S?%8kQ+#D!S z-z2{Dd0Z=}Y@v_NVpH+=vhf!j7FH-74QKlyr>kI7f0^GTjOqN*Bi_^at&&2k=1rS1 ziD8e~enzREa(mhOrYBT2H<av1;>?t_NcTGQKtXxhA0-tvL!CaIYTd|XYYfgF3h<eq zmZ>4KMy-xHvm>!mLoP{YzgvvAHq&;K8><#%N+r!K<o&YltB)x6eb#D+ss}zZW~!CW zYdyjCXlCtE{(76@brps0o7+xs967Xep|<S0AM?1m1jHvydZ}#JppmpHV@}B#o{4M+ z=44;uW!U87xt2jELM545HPS-GfP+PGBBNFWzb?y(XU$7Q9Mohw%_Ek$WwGc+Hh0~N zUDJJ|Jt1yIhS*^v*GVc8PfSn99k`JYVX`@PO@G=(9X}Pv2HyH_>?KcIqC*(_L>vCJ zZMNxqUwLrLg-H)WFDR^iru*5uDZpt%$;l;C0(3l$Y*izoH74xw*wE*p;<YLv`%Pq9 zsmm4ZgjTIb;f@CRXTLY;vGz769CeY3^xu$F<W?58sNq@goBJMN%ME7CG%HDM63Y;i zbNZf<#(PHkg7hte&{=8q*K*ixA|$^t_|99+!`#gGJ!Z$EnR9vkGwsgrx{{)=(X>@~ zV#=d4(mRzi+bxxT9C+X}Yma#Eqe2yqEsab<5|yI2^_)ElLUShyI_n-=uNdGEwtOll z-$T7wjLqx*xXylHVY0XEwCy1={>GptA;~ng@5Wj$F0syexctf1wu6o98tN6=bDbv( zOY=YMy5P>{uF|tHYp1)zlIew$CUn@kUVd~<dfw61-IIH~bX?f2VltbSeqhr)s=Mu> zE@SY8ed#G&*%OMZ@|(IZ*E7X1q)Hy>%=~KNv4eHh%Ske4KdAZ&8BEagTz$#te_O9m z%b^Z&hqklR`!1ep-`KTq{&mwea-t3Ox(hZWwJ-DL2yBSw-jHj$Uafhy^N!Wce_J=I zS;Xv+UeodS?ump;r?d4IBt9^b(7wFAKvd^~!IBAyExWb;oSWSGpQ%VP;efH-ou#e4 z;)$kh=1xrevL!ydNO&7Z#l&&{IKC_+;=Z0joq=7uRSXkze8Obkv#V2enioVL%W~VZ zq27SG)8KS=i;9TWjFPrV0+~z-hncpsxiVPS@mfw{J7L5l%YCb04zuc^6cq~veZJ&O zQ&A7o6Azw88n8)zX6lgoWa8j^exDkf#*Y7QU(Wyk%lznx&fL($E=qsi9natY_k8}o zGQ}VL^KQSgWSw_%?fJ$F%C^&;{GOz-bP0c)p{7vZt*@?ddghg1H?DmVOrIPhznl5f z$vdZ?i%6(la;tfFG_NXg=7}$JCajnhKdUq4M(w(-GuOPbU;ZRR>AJ^xUtf7mE8+R- z4>adbF7(ZtJKts1E6$#CEEgmkrdhq5%KYIgR|~`Blj<u>efW$8tIE_D+_0?N>C0f+ z&vHt5ozb#@u-Ek`4!N}5sr5TpQuLZh<V}|3<b@Bv$-H{b@^5ylshqdafmKR=N!r2+ zqLIcA`Ws4uX7<gIlFCeGXuZN|BxqG`(0u>q#=^^5PWvw>o@@?J`?2RslC5A}fS=vZ zv;74+Dj#+qKk{IkUElTZEpr|}uiLXnkljk;F>6A<aV+D;>OifO`Zp>I@?At?jMZ=1 zFE=nb`0dU$rbSn>Ce7}B&vL|0X~RkfPT}iOFP0zt9g^;owly*LIM*%v<sGvhinyMC z`1{(sMGPlA%XtJk3%cTF^I!iaxyjt}r`hi=@nt9GC3;vo_|35szEIAh@gmeqo7Znc z){S4XK3%##Cv96UzKND-VE$cyJ^A}5zVpBJ7tVfAa_#H=Wm4%uWdhDw-vhIb&p&-8 zyen2J(ZfEkAwJ}c&jL1PjmSsx&5R-(yjvErh^h-;*SNQF(Pf?jhDntR7Cg#XG^=%P zg}2&@EB8AamF_Nkc8q7rOh2Q=iS5QA;VBy@u>Ek`5@aCZp!t>MCQr4aqg<Zq^7{Q( zg%+s2XJcMbk&?EJ(b_~IuUqn);q*)Ewpj-`9aCLAY4Vo6j3Eu0wm<n4R&>^}PIUiT z!;tM1c-FmP)okI0<VP!?&Ah-<p)g_IlVzOmoUf>PFDy0|-|8)swf)x0u2*wBOYhD) zWK=byWSYgB&)$m^<rB(JxLi}XqVUzBNzcT#-q+=PE|dDjXU^PhUoY0!OC%)}ea<Oa zzVYpgo$h{C4QFoVC{6gpVdJZodiv1Dn8!UAyo0~oW0-c^cj|rSjJ5?LcAHrQGz%Z} zaUNaHBO%4G@~%o)@}`E}sv1sG_jQk~@GD)ScbDs+$DhI;g@U59j3Ey`F}ND9@q8d2 zZ&Pbo|D*m#<LQqEpYB@k``({#S7%*cIRAaQq6t@`MorK~y)&T&k~%MfBx2U>{KB{Y z{<Okr@2eHl+^<hKwx{|R^V#3um)qC>?|(mk-=DQV?(Q!4kGK7AQ2%|RwW;@#Kd=An z@AqzB>FY5^M`y|7Cs~m?`}3c*cHCXGY3qw{`!oMzrD7~OZ`7+Ne&arGrf2zky3XRR z)RO9%tK)YVeE$)=w?tBBn&I2j54$+@3!0hFo@#AT_~0?=>rACA$HN^au@lnbJ!kd1 zRmO@;I>sJkoE&p<ooA?WkgwyaYT1?B9=bQW$UWBDRNyjA_rxdJO(Dlhm5wfbon;xU z_xv;Knm0NH{d;WO<3iNx^DYZ)&D9mE+_We{$jUpZWPe7-LDu!U@7GT&TfCI}!$#Q; z2YK#>2?>3O5$C;pYWB0qt{om(EUPXlXdC_QIK#9+=iA9SmyPuFnm;}_{kNs_OV-cl z7eBEU+~g}**wdi8*xOC>&9o}}s8tO5*=*l*ja3x%4!V^e;*k{M{N(WCx?sI0YsO8v zjDw5v&m45u?Me`OxbKe+Q>4k$KbF5z`NGm9=D#_a(zWLB!I%m8+&vp?dkngz7xxON z8coo@vn%S&y(pcNr=EIS8wT7r<t|*a?YYo}-ZjqiB-XzEebA(ZWp84U@cgT4cMo-3 zyC8VK+aW4p-<pPP$M#7J|6874_v1t1<oXNo^Xzkks(wBGZZ8zPKRj0W&Cka3Mshc7 z?p>R3XH#YD1l6KViwcw@*Gczy<(4P4o(s5eO))07&&u!qsff2+4kdegd~;7GeUO*k z%Ki1tjajxuFS))H?~<R#BwoaLb4m+~{eIp_Gg2zIYsH<2k-EJ*EM2U+%iQ)6FTYTS zamdp87SsNMy?5N4@=61@oRlm%E*T@ZbneUBH(#-2O)ffhy;$?vEe^%tl#VN!nr?e$ zWuHx-8M^aOzSirle=BxPv($?=F3wxM-HKc3|K|H^lwT(LR4coATQAywqIa%zim#+D zr~OPe4>Q$GJ*y^edcS6$;F7p?(&mrWa?Cr||GBRC^tJlQ%{x98$o=VH|8CJO6@51H zUDm7AMy7xT4d(+L%9H&Amsb=D9WRn~oT}lb!x1^7kMq*H4|<cs<EQA!^-VmP)E4mF zw{LfaL4IlT$ya?xcW1B4Qw?R^_e1WOdXDkL|7#BUM@9-WM{muIt1~aS*0m;A*!X5a z?d_zlz~(=1RE5seUq5?`akY!DnB_)6;YBt@`jN-qtJrT>k<Yy%KC}6Hv)paz6YHN& zw7t1^@0}#m#bWcXESmPXR^|92jW5qO%Usm`(^kJ#$FV0RGGz0;x@oG9Yohy#RE{gL ze|ooBrm%0*ozj*>mE%hHKmFS*!|Zl%2Y1Nnz}_b_u0L|?IA8SSS%+A??d&5Hb!rv8 zEl=p)4Kt4V?mgB0?Cy7;?`@Ttl6hSF^^H6I+S{iddTpdvka6mka_Gzc32qms?#TT+ zBQ4!8?z7dA=XX0+d<$v+5qoZaj;q)<rpJ2^*A>5WNLqP*M!CmVZ436xtCEHM13oNa zlg*!daf-R(;=QY%_loCTSl&B(kLUjS$GcZGOk&;RlD9|f7~cc`Yo8kztrvK@%`0&J zi>RY_9q-xR{}#Tz_QsXx#+(oRG7?<B{0_S<?{zcWwxQi~%d{E!o;r$xVxNrl-5<Kh zFOy?Wxi$Ourj0k{de7PvZj*jDXL9}7_n$lBV?Sj7{<F;Pz{<Xvx5^$lwIAO4`(pay zS6xTzwLbR<7v<f|pOAmYd27VGRci`Ur%&B4fAWHek<8bFC1Mj-U)FxBd)Uxv_Vz2M zy#-gdidKI6X!mmKw6~=y(Z9=P9=yGv`|P6XrpY3AW0#+fa5*G#KD_!9ySwnYSL%7; z+m%XJFyuUo4$Qx{ZPAal@<&(yP(J$FSa|j6zW77O-QTRKSBZ}?o*P>-*L{ze<nA}A zZ?>(es|t&J^UbMj(%R{Ps~0^Mx*oq$a<10JoBu>gvR3tNN#F1Kv1QTj<|MCe8r?yY zTT8ub_SCPRbf$0qo2Bf^Qr_Cvj!Qpm^sAPuKR4Iy#`|l}GGvve-OqZyar*T?s|EkN zim9AsWJ-K&b8T<ep~WZa#pi#|`hB%KI%C=C!yKE>r`);iA87F?cK=-0Hi`AyHphg0 zu~wQd*Z8iIWztW(@Q|m8ERz;p*l%kmH#>dJN`K>9$2kR$oA~LS31wB>eCE54*}^Xj z8?}2%nl~#)vPHe|Ke^aB?)XKs`|+pFuQ>2lG%7sp$oGkC!SB|t-g_&D-S&F@gEyOF z-tT(5N?k=NNNaxgzjmEBmrH-iKebz<{q@Cf^}?Js=`(>A%Ikg^=6_8K{$_Wrm?iBs z%hTQ0e@jG!&D?ZC)M20Eu{{eW-@3im=k@u@*lFKBzWo_{YvI?`tNxw!%k1%+@<d~Q z*0Rv&Pa~|-CoVs?_RhtX8+dltF0Sh_%6&Jne)XojmP2`tw%54qmY&+oe`uHZcc!ab zRcCgD2R!L$uy-tv$i24j+0oZOduDyR-SLe*bE~9kNLkmDTa$D8)_YD7jDP&ye)r`( z&iO+8u7B8TKjeB{YmD+=!2jvst<SIbecH+VUH{<wD5qlX*~0HX{rKG0BKoo={`-#A zTDuq(xMIK5`^in)cy9VG19s7^C!Z|O-m-q>?(g=$Rwz%CtzSCf)5fi{#Y?w+dsO^# zsiE2Dt$q88zMiSxWA*gQ)vEa=LOiE`iR2v2RG)2d_Kk5`?%v6(eM0}ez4Y~~(9aYr zzxhvV6Lgy{Oe*=bCFy%aXXBmHo!ib<9VvJp%9fwdYkTwiH|wa-`akFQ9S(Wz(OVL- zpkdPdb;`kS1=q&sF12}gZ9aQmsyX|!w!go4U&=j7o_Z&^E^7X*E1}!Ao|2Bg##}MS zu5f{WsEaV``U~k>og-_i6O{IUj$>bc)i*!>;~6`Tb;qyiWlwIuH*2NeuH3B`qrwj) z_%A6>;{587@A`DX740u&S^rnpuid?5arp1+ky3t-Ug_uOZ@RWt^5wP_Wg`2Ww!8nj zAX&D{w|}|eOVNs789(LUa<9LC?3mR474J5Dx-297DC)3n=@#W$vEA%m|9cEKAKJe8 z7hClQ-eaA84Yj2*#mbW6)*`3&Z0vb0JLAOb?!WBYwbp9h4-7v#<!k!))$_ZqndYyo zKmRpl@A|{Fox(;<&!g(=mh69Yr*o5ie}B!Ye{vh2?^}KBW2MUaM?IZI`P%ERZcl!< zDarHbVacDS_WkGm#I9Lis9a+?`|{UwCTk2&UfWb>KdJO0f55-qRNmS7>wfES7N_hK z|2*weT<TwqJNGZfzkXnK$?>A}fx!F&u8|$_e)<pURcpoOweMe(S+}rd`^28ETQW~8 zC9i&OlHcpN_M3&}8D`6bz{^SNmu-#Q|MdC|b1z%l{kHZtsY%n%8I=2%$Co{*Rk^(A z-jTSymg%LR)?fTywRMM>@=cMiQjaWeuBqqq%=vAndAurQ|Ed?^CvtnQ{d=AKM8&;G z>y^TrD~^qJ!m0HiwT~A3JGAn*>wLMd2R5!qzA$HcVD0%Odk*IQ`mg!1TBkX%U$Q%j z;jMN`Kz)0``#af3n(pou;Xm746&D-x?!@)*-CsVfS>ygUUgs6Zn=67}PcF&pf0)x( zU9@ldwdD2Ij-t;e-2N`&{&!K$_FV^ViS*ZM@*kV>^|V9e-`dt!>!Vd~UE4YR*!@Q* z_j|5Be|F9DZJ#$Ytqm@!x{`ft(Z7Qs|NqE)U4I)ped7Wd5hhau(Abd*qs4T_CK1u; z0!ySh>Me{dktek0MtQHlyG`)k_wbCHdR^Xp^2W?8Y)xWs7saw<mbHmH76r3tJUUdy z_2qtf+n*K6!691nkM6y+@I+<J=SSMt)<oY(QoYypOm~`;x!Ao+YMMDA<`<LZd*9r0 zEB|hi&l}!r(--}i{a0n$+4-$e>G^!6!S&gKEAJ)!-*W50E0?CphFT(0xsN?Aavaf- z7Tjs#YVM`@GkVkZsF)4CMP}>NWTr~gE~wQuo6zMw>+SsS&mMfbnv*~0?^!mlP4#|` zo4SL0TV@HQTw1cgcipC?8c*_fsXk7rU8||8e(;*EyL`(1qRhXk-m2UGZCNT6wLK+& zS-ufxy^#9z6d{#PGp(r2BG)_C?*G<*ZCO?e&oh~%?4;^qJvOgCzJ#ZnQia@GOHZGy zP?Mff{6Q`Id}Po1jb~LYwAeiKl4`DcTv@jM<y6Zk{mlhw-{O+wmzu16>nmLxY_Z$s z<`zxGokecfHf$?n-gD&5Ea{g{e-}&6owMYpqi5c1tzGq!TFY8~2j|U8`lhus@+yng z(G*R!{Xb`J4*4DGdq2ragwHR&dGE^0=9iA9rhJ<I>dV>0GrpC{o5OSKLQHc_kE!+V zH=QkhYt?OQtGBZz<>hR+^2F{GTa4+CGiQ6<^8Wf}78fdK>ztLpS}n;LKL0ESTf(<x zJ7$*jwv-mvixqSIuAjJPWsZz(oR3D{j}4Xv>dgAPyo-!(du@yJjGmk`$5+Gf`O`I5 zXZOrr`R>z>wwrH`v{_4AzE1Of!)BnTw#%@<CE^adr4;Yi8;>(`vnF&~u3*Vh={lJy z#QnS5wX`H&pi6I?rot2XGm1xI@6F0d`SkFccTvU{-}QIwW+|RkF*{MOqvASepP^vC zx#60lXVd?_?cI4WDSy%}kN1ghu1wgp<dR!d7^hfbmR98EVxv&gZ~v}cRbJ4$kj=Vt zuOzeSv{^O`Hw3P$oI5FUIp@bJ^QjkRt(k3k?%Bg-OA~Xh1@f!>&X{w<AngBRwf=6U zf9Dsu9hIHMn;x2V=CAK9kKd9^)`j)bqDjt{kxbkv2CG$Bsz2Y?Wsgw!Szc^WZR!~< z$1{y-&&A{E-$F9&oxL@l$$yKQZF+ZelluhE<or3&i}!aWFMPYU@Y6&`YxVS1=S~_& zXY4(5Ri~Ie+@@mPrZo5SFOQz^yK30)`|6d$(I<+hpUp8$V>hlSI3_c9M)avkjl#w1 z^<Apl_PxD2*V^TI*zDKVF1pX&T#ejtyij5J1=a5cy<X=I`3Py61b_MU=*PzC!rI(@ z^Sdv5vs8<1lX`e(j^0wS*0mCmyGrivasK9VC{J*;$j*mZ>*pO_b9HCoX1488%k0hw z<*Q`MJxy)5xovUcU({XxHS;0_ELjc;E!b<O61)0J{lqo*yv}y<xp}Q~_|lbXx#^;* z(aMTbU3}@EY9wxU^}M{T`{?UN(X(oCS#^i5T6bjMankPmc{DtJZ_W45%j@^neZBnJ z-+rclo4_i2U5hi1oxbjG`X>Lu*IA)D?A8A0+21#pX`ersbMM!s{&<J?Tfb-C?^$>9 z*2{&uwfVJ7b=K$Wub*4}_2Ie8$FEjQVEuc`;)Ci3)t=0fE&Y{O|Lt9(cUf=q_um^Y ze|W#!@4?NCU%N}B^pby1lm8`?TCl6v&ndo%XJNnO{eGkK7D7)dub$tSQ^jAoQ2sgl z{>5jU|I1#N=X-p6hq-?I?D{{CpRRwuzxw~D=l7@oYB$f1+xPR|;n(`}>wop==iJ{{ z^ZDUd`){Y8#eI8ycJ_T=xvA|(!*0n3$V|JpwcfTOtY!OOgI_+Ao<5lL_vv$f`Pm7+ zQ>O2)zhAfY=gaN-^;Q2@d;WD_6w5e&rJTryHT$(0ypA^gb>QSG_cHvt?*6{In*Xoc z<>Tyc{n=3a@7@0Yb*6IvYibozJJ<66sed}zw5BF|>Y2Lz)`AnfnJSeIG#`jw9rZ2i z^WlFB{(1bJ_<Qje_qY7-_+R$7^_{)(YjN<&xnA!=ik45Zo_c5H6ThX=wXY>^&slG8 zHTBZUlBe6(9ol`~RPXD$V@nI`zkm9wzkkpFFB|nW<o=l*t8XcM(en3x-M@<ouQyG8 z_hPDE{mc4K*Y)bZcdwPcuU7l_V&Dqd)?1oa`<&i}WGz25m#bXs&dLHP<9MOGdhMJq zg_n+dLK!=~pX<%-D$%;NGGqCoxm{&iyEZk(-Cj_a$83AEA+dS;t<(#8&8^z=1pN;g zKb-kdry|V8&@QRw$d8VXf{&Gtx%c!-$k$8y9~Az=fdn6DOmygX=y%|E6c;QNOcWO^ zH(cA$_tNZ=;oJq&^vl2J$;G?!m-l!4>e$fV@w?+df5)GW3;i8`Z#373tx#`V>SU#P z<?=Ddg>u=x8Y%r9Uj!%GD+zhLu{wLkd*@l1ozD;0)LG6F>@@y1=li=PlX`i#%gH7m zT;gu~?(?qJVhhyUyVUQg%C{{A>(n)B%{?yUYnL`Gk(<)x%=vIDgF}MqftZWCE{dz1 zsulXlDa#S({=w+G$E%5-^TeJ?oiplI+I+nCW~=DJclTO;IcXTQa5-xjwn#Z^7`13Q zYZ$j!Icu1-csXmBwnRB=m>pTrysF+=!@6acvxdzT?elAD);nyU^4|3I3Y+`f+t0r> zy28)Dd%*`mE%}9C1heE9{t#RxzwnRXD|t<YK!;1&_t&h7J9l^&C*LZi?Q$Vk6Q8#z z%?Mx-?n-bH^hpd=30hG;bGd;yC!hZV9cJ#oYhO$(jgp?3!hig(d|9KR_t6qzQM;pt z^|`DTD?VthE2{09?zzDFFXI%8=fC9md^voWg?djK&A2p4^KQDA`m&$%RIA=Ba$z}h z=6BAr$8Ah=Cj_VoR_Exr&S^4Qct*zMj&YEan%9QZCe2`3ZuT`Y6FP;A0-e;nPPlN+ z)KC;wjeB(J>9z|sho;UyFtzQ+$42c*iB3j79&PoUCk+%O)qD<5)(M@M9r`R`>SV2c zAH`(PZ6=%Ae*2^;dsi^&v&98XSGD|_vrA~j;xd61>JRuVC*=iA2+vrXtZFrFQAGE* zJ(de69?pHXQ~i#z)E5@16{?<}gMSKcG?-Jp{gz$<vwE`Xl#N2CPOw_8iBUT4J$-^r zb3sw(#)7)p^%F~sr-e$MUL|vSlIHz1spmKMU8z2CI`Pol!vfD6gu_ZCSK3^@v9Uob z;$mu)=yjjzM?))u8lOGVN@h)ay(-j5<9cPTTAW{{?-$OR4X4hw-(AqOC+tBAYvtN6 zE(YB?(?1uh%xynWaIO7>)wO{9nPC%8O?fAjK1(_D<>`+aC!$^J<%}!Wtv;!9{q)H- ze%#9IKBt6zUT6MFX|bNsE2aM41sjD;wly7#yKsX?YPaK_F7vc~x+>>CE_-_VWAdA( z0$u-9D@kF8DVr0Y$3D>R(v<T!rhIafzutEpDfY?D69czY?ksxvdTO`d*UA3c;&;1E zlGh%L$Tpag9BcKzwAaS)>dE?_mUnb+?QJ+zk*xnQNxwmV`%jA_kqbUGgdG=qdSmes zHB~XwCfDACK;;uRo2t}Sq&HQmMX+;RV-z~RO#Q_|6;7{7M?&SMS42y8rn*g^=OE7Q zZue#>=cV-vKvEZO9B9?j@ND`Zlw-uTR&0JzCC7opt}4ZOp|^u4C$tA`aIV+P%u#oi zkm2Px$Hvmm+~liw&~0JD;(!f&f;l2yajmnS)I|T7llJiR^xLi*9%{Gi)*j?+O^NGT zF<t3eq{~d#JKuM+R!`Yvb8SLUzOknI|0(JP2OjoJDKIWomQ^^fbjtn5n{T&R-<^20 z#ibxdsnm4kgsQ2(Ec{C2U(NaT$Zq9?`lx9~e%gJs65cQV^G>nwgrjP^uKYQ`_%$}* zKC7!|g``N0q(~tj*SuyWJEd927xJ?_x_Zh%<xcuC<ISH~>}GuCu<vTqdA;F;DPM8G z3C?!+C%uQ)|NX+vl<?Nt@a@%~VwdAC^!q&Jv^n;1uFQu6-xe?E;s`sm=}z60({J7T zth#OL!x?V*hl)&%61*f8=5}$yd!x$+(yfn#e<XN^<>i~#O<P$phv$<8*OS6;?2Y$J zpK4DzCMdB?Rw~SI(Z@@k8C+7mn<rn8TgWxB#4`QjYs=F!PsRwpNK3ht=(KJ|Q)bPZ zgBdZZyh~3nar`V;FlREG?YV~Ow^vl{?5$F>%U^7CQn<b<*>Ay@8)gAgxgVHio@g!e z?8=<9tT1k0h-&O=BX;jup`QIGe7u#P6wLpT(;_ne0O##Rv*bkMJ_o(8Sy?`-?2zgF zFZZ_JH`V{D_t5U+<a<9k_ZqfdjhTPS;qf_!es3n5JXVJXeJXraTNStp=PZ33AXluZ zd%7n?-#BPi^Rjc2^_sRyLejswcx#Wg?Yp)sMeF;_bFJ!kdqP?QwzH^RjN;$%G0ShI z&-6uS4<5YiCi>j{N#bGGjpD0k1Z(!s7Bb)}J1Zj1t+m>8pVuzkDQAT5%FI8&{n_v7 z@q6u$e)t*c2KjW0Tvn33-gIp5f~RGzae3hd^O`?wiJd4fxNpvd7hhZIpZU~$TRms~ z0Z!|{UpF?@OCSDZad6gp)A@dj*Sz=q`j_WyzQ($jr^PSWXP)=Z_`joN>U^()%qLq5 zJv)xCRp_YM+3z0yyTam?Wbi>-<@bvYyBX>j_DsJx|M_Y=#d8ni<-~gr6{U$C{(5E2 z5#hg;d0{Uc;*ae$k2P9UF<<a(<=!Rr)#oPgUw&J*UrtGOU1MwDkwZIviXFSU-QZM| z#Ps`zcKj7{TgaW6ySyZG`A@6mUu|!$v?=g$US+aG%1`o`?iz!2n_3?(ON>e5ery&k z(I@?>?qfl~x#l9dDbs(uUR(2hs?}SGslR&8X6)CS$!8{g{gKncr3;=GX@*ybZ8?*@ z^KV`K!g`sGDUGF)5!1KE$NPt$TjT$E>Z0=rCVJd$LGNOZKhB$DSa;rqIZQ76vx0Ge z{P*ZXJMIg;s>>{W5W?<P`XHp;|C2zmOiW9mf=orgv(m6fr`Lq|pKN-*CWJpSQ^tZ_ zF6g9Hoqj*FxXkm<4l+~z)*C-M$8{#4+@x<o|KcSI^{Kiqp6Vso9$j+gcEi^R87T@z zeXE-ItY2E4GP$3=ws^|bUp#I`GOkY=CcZ0Q*8aUW_RfOermqV7tKPhRXTI_K>Kngf z-~2WDRwr%URyen+l3VfE>1+-QLE8ku=hYk*I<~RZM`hnvyU0gN$Fr>9^L_m5QsxoX zPfG==gdRQExg%4v&Z+B#o$V~;*Uz@@J3qDN&cuH6@>_QP6F7d}U0?pEd}jNx6LJ5U zH%%;<zEM(Kc>3<mG8*;9riRFU=GaO8-OUC9N8i_V$&^QSxvkx%;PhHvVB77b+uq!K z^@7XP>x%RKzgclF5}5_-W}44@o^nQ`+xVj2nLpENXI?(?DlBBuvASuh8?8;(8tgc` zYTF!>mH9VCn-krZC;iZ}N_zIQ%<jL8y`BH`ecCMF&Be3opSdfVZ_hqu8y3j>^{b`8 zX4CY-e=_Q?i~_&waPS;Eqq<gB{bx#k`>Oqye^-@F6FnJb^5(7B(^o3<+aEg0c6LU( zNvwKp@n&kR>*IhaD%=+*2u7UdikzUQZQ>E~|IxPQE!DCA#EPbV&X^cI?fBuTIqWIT zeG2STG>T#ax+G3)bj*vM(Dznkr`0z0w+@0H;T?{K8i8B32I#XE9x>V3RpUL8eJTHS zxhc^*z6IR9zJ>kZ*7hp9nBTwrcGw+AZ{pIdQF|p{@k%!(x@LXUn(Ccq)pI9ZpD<<f zl+%+}1_mA8urFHsg=wy{{hG+E|BMz}*H4+QD9$7@U2~g^TD_U21xmnAjm^JhAkq5% zr|8Z%CZR|ClEgU`TWfqgvdyP{V-GOkS;->uVA21&Bj*FnO@%!ClYZMif6{BaPVDQV z+wqe=zW=u)uFZSX-SXLXbNa8>$xhn7;dZ%l^5nC1wSq_ge@!fv>Ro;O>dVYhj*}Jt zK7C2PSYP-5=Z_kjHCD;*=O2FeYu~H)@$pfQC;8qm`t|g&h>&*NmDBy7Rb|BPew*R5 ze6fn;{bg^@PyeU9Q``Lb_7Ax`zOTODQg{FDq}|uEB;V_-Uw*mTqUGJBC5vzB=%r8C zZkKoH=a#7Ux~p#wWz4#_F48DB|9XzduCvphtNG6SzAg5D<k$Mc6~_B}{V(4+qZB%E z&WgU2Se0za%!NG@7qxpFm6_#W8e*j1yyCgbmD64xU$s^w#_?@E(`<BjGn3Oy;e|TY z4MiNfGn3`|jLzE#${DR~YWMm2<e>8>g-L!_C;Msm7rK0nS*1Q9q&r~lWS71yb*&1w zU6yilIQT7RKCLKFS{YVazfx>s%{>Q|_bwKv0>U0B<}2D*2+A4#T6*Acu9J#Qg`k|y zPLYZYs~Xt7Ke5W`L~+@OtZHD_5Bl!GeNwz+iSt(Rg}WBKmRYseL-x?^k{4%QaH`J@ zDR@;>b?BmET+2D1>_x`Gr6poNic{XYro^sjvI)3*y4geS!po<QOP+XM*RHP=l(UJf z-lX?Jr(an===|qnH7nOY{>=Tcd3Bjxj?t^A`2W(2t<UbaE_uiz&Kv3Dk>;1Bnx&;R zZAIpStctYuTy>$7CO>j7h6Qd;J*zg!^W@6Tc|8wn&G;|atjkO)UA!+lY57b}$!i;% zG%M3}m8CP}exKVSxjH0(@9Ko+MPjpkCS^!!-`MdxqFH(M+(&A4H&$*{PLKbVzB+bM z-_|u{onbD&-ah#++7?@HvChta_1CTM^V8jJE<ajnBBStIuSTwV`QywPqV@HRFK$n- zge2>X9WrY5rfB8Kl-TZD4kB&uKWjfL@{T<7yoXyU!^dGoZsgY1dq-2YG@5c6#{GCd z`%H1cLdI70V!L~L(k(WZ?7nICbwQf_?`?N(JI;N*?A6<~d%rIYRj*ztt<Mn}I=y+q zZ~gVI&(B_py;!TiF6=Dd{=WLU_xtK@@2%f{eG%uO>!rT~_sa2CE(lFM-y$bBH+12L zvd#5(*sAZEJrC0rn-{eC`^HbXFXUgPhHh2=om%yM@%o&2bMdc5KHuM+{dcca{#({; z$Dj9#UY=sj(7t`@-mXPkYA?pD+5X{p`bx2%KXhzwhy0&AyJO4coqwXg1Xpa3J6vne zH?1$oU8<hT`J9u+BcF_;kt~6(+<~f5j*=4%rwDVpGNyC7*z3CN&)~~cGEM0anI)`Q znLnXKU@n``T&G1oRvktf-(*{*JxcaDE(+FY`*BNRZWZrBV?V``EX6=IS(ljte8(iW zJoMqXDtK48<d|iPpKi;!j!d;5mTDGGTLqmWJ=$4x-ReJmP)&R{tIn;Xj<fjs7h|WA zjt^BbtCD);nuBB5_)m*YvdJk8Z7I;4G)tp<iM5{Unb^mZ1ck1CF<unq5wiG9N0wq? zXLQ05RmBkLIp$}~65qAu8#ooQ7hYfUWSd?7nwvHI7T)Um)6*mJRdQC*r(mUGn-emu zjQi4xGm2EcFh92ln~;6NwXJA>ak=r~8Sl>oZ&yo^_u)>CDn73pe(!f(jCG#)u2!?R z^LA}KUwU)v-6>D&{xbygTfB!PA=_P`B!s%zK6Xlc_hJK)qxb)cRL)71{4+a+%e5ef zHF5WDA8YvoS+_)wX{@Y$u|58*<(I@(vATP+tNqWJa-OaVzg;KxP~Lo-yK%R7zIA%u z<GWkk=A7NS-EmIGy8QG>|MT0^xDI`~;In_$!Hx|UbNo_2K7RhNSVpQ|T0Q^kotp1& zZ(m>8HTA_A)|1PRr?@z+D?ffb*UULrfANhxX2nD2mwwAF<Np{`^7!VSb?@tTpWAUS z?&#_8$}jnS-!p%iHE-P9(PZ=eY0`@9<LB-yTV}d$W4Lh6;-@E%Zi|{{W3cVF{<<I? z>-byyd!sKu?pL+#+GO!Pq$+5Eila_F<I;|aTt|WgR%u+4+sG55$mW%NM1@0Egj4oX z`2?qBOqnT@%ub~EW?fXsQVitI4&v76wo$bfn40Sl;?}fj4TI+eb`C31POHsAU-~3E zt#0;Pc^25+ZZ7L+R4GXl1xp3{_&7b^bRhVd=i~)e2k)tdsNb01qA#>L^u=<|`WNbk z(XDl}TKF{gguR%M<i=G!ea6H?M@%^VmaJh?5Bk<DEOfu6NqAOErq`R;K+|8DtJDHb zr(~{DyQpfh@TCyvzKkD>41GIyX20>6{Db#U?Agwh&&`7ss{1QiZQq&yi}>_sEqlq{ zh<V?=s>|~%pZ)vxQT#;Jwd(A7;#W-kUTd-c|IO~nBC{EiBIfUwQL8sGKx?GrXEz%N z9J~Kp^HWi>i0Q^{tx7+{bxO3ePcL}CCeC`HTjw{|{eLG}rypnPfB3VqeCLGCk8Mt- z+8R_Zzg5J~y!*<gpbOi}Lz%1(Z=E*nbY$rC!!JHWo4Kan{J8DKy>7M{doABCx_tdM zTbqaI);HVN*5{<pFW7sZ%hX!V=z6+njK<>+FB(2xe17uZMg9v<K3&@M^;XiEYni3? zE7+?!SAXMK-&VVVD@1qwo2L@*C%$<fTi(p}<baGe$A&rHy3=x5Ys053;HqTJe)~dn zL+P^cgvK@h{yv{ly3gkDbE`XrI~JVf<$1zV+c*1p(#rcPcA}d5>$#U6-Wl=2;@ytZ z40k8p;ks*NlDBTRllbJvFTymft~-nWdXn_G#p8IJjJt}*o{2x)Jf0<AUKr+<vd1^Y zMMY_ngyKh8rI#U<dzLHOs6P6u=>JOi?3tM^htwDHiRlRm`dt;jH#y);mzBUqLBUnZ zlQgxLY;Jiu$*=!~TKA2N8o?Sx#?NQc+?EUKzV~{Wc+l~fp^0#?_l&f?+18U=e=%xJ zIBx`rE6cqypi{(5?CiLTONvqxbGa&R#ZL6iK5W3#_Wq}+RawuZ{$(%O6gMo@X1P^s zqI>)5)~RPM+&JdR_w#%A(@Te0%xosbMc2trySgo?sNuuqthmPvy&;E^*1Mk;)Vtv& zdW4hXWV`gmbJl518*B_dpR;QDP#yobCRhG@`{H*qv}V41oKabSq->ATZkzdKg=|dH z>n(iQ6n7SGUAw&Qz`CH`HXDA1Ly>B~5BhDW5d77|ulGHXHELy4#GKQ!jJ{@^5w#9s zc5w{6P`FWkVs_)+L>b*+UA9UScgCN2eM%0h|E`+Hm1h3X-@MLR@A*58Q;!Y>Zu&Gu zV6D+2lh0pXWlJwI`S`_Wi*}uo*S!uS|JPI0cHDiMR_J!G_Q~R{pSw@wemZ6At+l7V z<KnTE8GjjnrM29LgxZUJGV1llC`ata1|95cG7#ANS=4sdO$m*TA_WzWNeS2P_P$`h zVx-VHW!aSG`u(|y2XC;PsQ!HKj6tyV$;)$0g>LR&w3yW+#B`0wh4SVF4S50PXAbFU zNo%R6+}omhXVYZihxeDTrp)j6tg)!86TG=0IJ_xAUFrR6<16)tn>)UKo%B#wYoV0w zbanP8eir`S>G})LMqXWLuw}xjWnN!`Y%Xf)?Ut^|c;~)i4e#oUuV#s~X|kP@zrZy4 z#KuJ@mK;u=9J2L7v6G`fShJ|rD;JG3S2}ePo<`r1j@{mMuk%7yO+eQ1kC!}@^$kzl z@6YJ@x$>k*<%jyVr3q;%7V&2C-wjqCulNvFF!}8i9bOxIUmJTPpG^iE(`tIs(<b+x zS@coecbCDk*!!jFX|FTV#NUfPessg)o8y9syE)_P-TOWAE8+}fTLPNRt{+$v;J-W3 z;J(Pc!na1}<!$xXDMLbf`2iXA=?Qyfl<JMR?;gvE|CTm6Tm6cP%kK;I_Gf)}Z**uW zE_(N|Zl`PPwMFwgelJwbPEd-~-_aHrXTn_6609%tO8DO9lS-dcomb0jzp?ezTG@sj zPoHhQS7)1-c&hYvccFS~%=1rYuD92^CLdbp{PW+ch96?rQ;TKQC9*DhPFlvN`0n`| zJHKCE^<mO_{U0_Iyr0$l?r7&4KG)<K&lX*gWD^knI7i30OyqO&q{Azs*mjAk7X;<o zNqVmSnZn2M@4fAj70Ji<Mekkl^7NW-dlDu~hA5um{iNLN)V0FpOHR#N=C65e`~U0r zoO4e8&)K`u(Zpes%W;;#zGIA&%vuFJ&!}`vJR+hbfAUqxw0VkwlD8~Ej>%10(epvq zEwyEypqB8Lo&d?k>630pZM66w|GDYNvZ?o@#GXWW2kCszUpy^P$GhadV%fzixfM4} zHfx;@sb>718WN-%`0O7;!^eGl!C}m3I(^|KX|;NDl$qGrOXu^O3`E#JSl7Gu>vcbD zzi_T)g2E{$v+b@W?RPiW$aabZeSA=F|6=<`10fH)J>Ryjugwcv!+n+K%->6Mbutr{ zyIq~N?yj$QlDn1psgKNI=0zKf;%|oSeVlfC)&CVyN$<W#&)fIUW`BNpY_#V6+3V|f zdB^fxT{`jeVY}~^t6#Qo{;u}d*`Rmr>0hgW=oP`oAKgeibGP^B`sRI`BcsaQt7iSH zeKo6O@wuF`6JDQ}@A>+-H7bbt^Bfh!mo;w!%1mQ_drew*W#*h4((_x6{`{fBxAIqf zP2zG{|4-X5T`s6M<@>(pf`5;ZG9N2r65|$!Gg|eoIgE<j+ixj|IawxMV6v=a;p}iW zTi%f4r}3qy$uwoNjw0XM1>zdbIeymXpKWp4`j9P3na$O1iu1yWA9^glDHRCGC@Wt% zx6wFpYfFIj@hZWr=Mnx952q;2X>o96`pOxi5>&kO+q-3_=SqFPIQ`SIuQ!yIRr`MS zt-YjCWm0jU>+5Bm&;J-b_8ijzN6U2YLoz(mz1MO{*PEbrJA(rAn+yc%o`-+Am}=<Y z_)N%2NrAIFFKxy9tupI6xA-1p|NnPEd)`LR+co#^mY2VsJ9}!SrmO#*xq*9{=9xHM zW3wtXl{vwA&dJJ7b?bw_EpJXnFOxODZS?nKl)}5h&DMEc*ZE%rA8vWG&1+TV&CT8Q z4?Z8>_dz+xxw+}DFY`iSz0a?%eZ4SkQ=m$ptka$Mignj#OV3=JRoXOt;%_5U3B~g% zWhb;whlH=yztHri^SMeV@AKr=n5!2uj~z6qWK;jvHg&=diLgfvYv#XUT;<36KQZmg zvVRZWRyxj$a1mUq%XM+viQFZgoA<c?@ZPZ@@80gLy=@KCd~`pBd+dw6bbf-4!D*r5 zMRT5g;|laspDu9n$|T1Ym0MyW-8>gqpLR2OmUMn#479Rk@LuL$FVGUqdT{SAg+qHv zYVZHAPxy1SP)UyY;QC`cdp9O0@3u4Z@Tl;a7FHE<^Dp<|wk=;FA^-Y}49|2P0a*hU zBQqoO>D`B9Wb412+i}!AyfS0!x^3>O*F|x4aD=>O<`7`4d~#Bmi-kjClBW}g#{mHr z#S_jf8%5WOe!LreZSB{MZ{KCzU%TyY)ZMW67hcO-JLcZK{I2Z#9NYBtXLn{AfB*P* z-~I2qrni6mDbas?w$Nk&;mvtB*Q|K4^^{EIyE&|i*`hBiZx;2gFRoXWK4N#YgOS@{ z+M|t2<h_4y4*q#U@teK+v-{j`%#Ka2_B~wl4jIJVtcb7v!8uLvf7@>%<-!f`-S<~W zwf#=C@oBQ{42&@NCR^73{JU|c_vI;?T^%N_>-2(`&zF{xv&-KZwDfw)vh)`(c0PP~ z{@k~%+%HoXemVW=icV^ynfByq_0N}G)Nj9Zap9M&RL1Y-ljp5Gvou&l^3xmLEk)e2 z>m&T1XNpSc&RrMyY~_~oEtft@&WzgSu=3=ho!i|euAPuAnpqN;H_OTSwUNk|RV_Oz zs+JmsySt|@(<<7^Wu?-xY%3S*+=Z7{inX@B{B+5A>Z~stbni&yMtuA0c+24ao(WS8 z>sLQ^UZgZ_eT3|GrI7Fyi??f-mdtWeKY!+0+rJebvzDs4&+9D=7x-pk#?5{7(1x8i zgmNUm35j*OCTDMm(2?^#_9TL9TIbUQt2M&Tdv^bmX}x1AIs1+B<o=r#68f#>=khz_ zxBut)U-V!2kJG>Mrs*tm4?S;@{oyt-VoTtcU&(Ft4bPeWNm$6elRmCix|cP$ZGF|B zn=R*;EdP@I@v2s`Cs%Qez=4E6Hk;$^7{29t-ka&UZ-bdtlK1qT%M$(H-urgwSMD-d zF>leYWv4mM*L}KiatUjQ(7t1Ts*_{-G_;)muX5V<<MW<}lb!D_k9M4toBvATrqP`r z;#_C#)aHuM75QJE74?7Oy0(YLwhuCnpL``ZJ3}TqyJU0m-GH0=J1w`=vD|X+cpqtc zX4;|7;(c@E=58_7Wk0amf=fqq#mCL1Q>9l{->>>`uDi*1Zu_Ql6Yk&pCBhasF--GT z1C!U*hK^HyC38<M@|rC<+nvq)f!wisH<-@x&M7jP99w_CFKK1roBaA-xf@j<yWBVB zv-s^4u{;!`^y)^ZfkRa8#_*5`9aXgr9(%Vb%<PG&5j(e}gU90csgs+T)43i;J1(4b zGT@z|S-_Eo&6oH6f3!-td-=IaHeZ+EeLVYl)k~cB%#$+T)%UTFt*Wx%6NmQhNA_02 zb!x2}I~s~FGBxO}Y88Jq)8*B@dPbX#QzAL9d{E+h?yNb7^Ll`{`ofi(+1#ND(YwtO z%{qS^3fa7PdQ$(xy=KQ98Gat(PdLGL#jn>e{fpVx!|N@+?Rix<-|U^D)4?qD%8#Z` zP2DxWvCk>6KP01dP<GjriLOt!%zT((RQ1X2hPgcNymG4*sTLD?)ISw}(TZhMm}6N# zbEY-d$vex-4_fSy>x#Lj{P)!t+Yo2F;HA^=F4xZwpD3+Y?rr6kaMYl1>eNG7FW<JD zpHT3s>1Bq^tS?vBSWmF8Sbj7!Wd>LG%><^^pB@=spLp_QZnKtFb%*8eHXb=4p^{S5 z<lCCw8$3EIQbZ0VJpXOWezLsJMQPvF<w}oJU)Hm~x+~R|dH6``wuWH+OCh!nj?8u; z-x#?fW=L(k%Ag~_)w$pHmHOQshqfpSttgDXt?*cNZ@Xl%^w)wso4UVOTFcj8am!&j z@xz<>xTCeY&4kH3^LMEI{E&4;;3D7lUn@+ne+gV8pzf!9NBvF6+WuSaEwV|sPHwv{ z@ma2G#-7H#^{TnrIj64YX`i`lmY<!Oot4L$?A`xs+O#`zO1~EVTIjZzY0i!h`k@)> zdz+I_xJe(I@V4Oo^OkBgHo^QpF<YlI8$a;}K3L^DTlmWXr9Ej8k2{s)JtF5uxkTo1 zcCL<D@#lr`{zF0^pRND!WxlXg+S&OD!gKA-pGvqrI9%~?|G^veKeHFPU*1;jHvjvF zzCFja?thk_%b)MDQ08pI!VJNvo~A$xFDK6eE3U@#hgCmhO7NLCs`3VfbaFg7e%Hx_ zkt<PBr`7R#{@upO>5G#NJPlafKKJ>vLc<G|kIw70NAFxB`b+nbV%!TJJ!Ox)Gfg%p zc7HUT(r_XwbC#vsR>7PwwR&-_6TT~}*-NH8E4aGS@#gDokMA8$xc{zkp5mtujJ|Ht zSNC>yo_NNzR&4F(LqGE>?p}Vr_Jc<r-{E6|NzeYi(U|$YwBStJ+Lc}flIrj5UKv~d z?^`1gbMNP_tRIQ@ws=f5F#6K^Wy>=2A_q_H;K$#do^e~2x<Fol@oL|_b;(bj7S})Y zIMI4I_89lX*&lDN|1F!w@#wvP@Pp%TR5Jaqy*r~CJw0toq2UQ(p}8Jkx~EwmYJ4e^ zbVgQ2;?dNnY|ji>#UI7*|MqkK96#@=!UmP1Su?lo%$dIW>dxuO+sk&Bn=I)qf1<%- z#dR>S-i+7HqhDN3=PScck44#wS0Bntdn6?+RbT4o+wO5Q_S$9T--kbT%ip#9uT+&J ze&P07G4;sfH)d<hXsOn@cFJq>$~!DYN-XN48{Y;#+0xp*EY*5))zgsw&;B0U|EyfH zf9e~PPQUEkNsm%aU)P`Ke%^xpCD(&(5o<)3Tujnj5TLYfdsNmOGxu`k4YwqtKQjg% z*~s7BKWW1E`hVi(7Lz7i<c-fxxnq7;wRh4tyHI(Z7s`ts94}}p@wgiJh{^J<q+jJ) zjeA=cebk+~{o|9hyG@NZ<s`IUP26bjaQb*Br`;a4?xiOfR{1<l4OJ7oczgELjJs}1 z|F7J*VY&UYwf4&G-ci1~Re{Y5P4#2duB)}2J#F`YrJO)rZ)i{bRS%&*zh^WbH?UrF zEs9;CN4A}1)!pA$m!Ft@SpDCd&05b7AK+fht#Y5|wXHx!$NPttd~Y*rW%dPajhr`o z*Kcly-wJPCO?r-X^6b4JGsp0`<>m})znFh4U%9v?kF+n^yf=N_kDjzQsm#AClNsOH zi``G2%JHvZ@$vdkUDH3ZcAl=Ernjczvqi&oxi2zr5`xx>bRCaRnzYv|;L?S4`&{a_ zybto$P30BsOa9t3{iD_13+K6?7sLx`&-O3r@vPW-;@aA!6L|D?^SS=!lPTbjT3+!{ zG_6r<_QsbQrhXk#XSb#vHL8t#*~hiP<Vj=)_o>&Cvz?#a+PV28SBG=loi)B`CiP3S zx;H*8H1^x!W0@;*<f1Xt?3;m+s>Wv*dv`k~9a5WoN-5~^`&%r#cgDQ=xbxF2uh(U_ z<z_D5w(lIP-HyMULL6D%v96+<l9~&5vkE-r&vtU>PtJRKDM9G=RQ|<WD*R;$N8bP2 zA8nAdgGX+HQP0{%d<u*_VmnUx@G(cmBxz{XZ=D^xRAf%$GLC;M-_#qn{jYnw|I7Xr ze>d8%{@ZfnfZl|6T7{z0KGr;`GDadgD>Ty2^sKqZkbXduDSYqUF#X3_n$k1*<98lw z=Dzc<K=k+2Emvz&W8)GhM%|6M5_LVL{5oUw%Bx#^#g=yZdNZm`-g!#JICS=^x#IU* z>k{U?Pce3BR6Tlm=Vwl{`Pp*v`ZwRDP2ag-)3%GcER26Dmi{nwlX=1Wf#uz%sI`2n z&xR$xUoG5iD>waa*y9a1SFM(Pbo@W#-iypm;MOIRnaOm=wOp#x^-E>>rz@V7F=jNI zt~f*1YI^@!nVR~rU1w(7m)}@)^fWW`ou|n%?mFK;aego7-*{(^_7|~V4S8!02r;P( z&G2h#j(CyXJZE<&f63;|`AubCr?u>Hm}JMI7__&$zC7ypzJleq+kdS8$i3_9_LzuU zxeShFN-iz79~ln{{_TwKEDKz2f5z;zaY6U>8h`!D8`m~y9G|$@y}rMgkEe_4=Bvlj z&mLG*eYx>)+WpD0bKI<S3ci2f4r%$7TUs!^+Db>_<%WtS&E5-`;_tpPun2g!;ppk> zckka;yl^{l>Gi1g4*}~Z1hCJaaNxs&3yR9JVZZWtO9NQiepo)ZE}&np|2;t8zrA4R z^6(Dl8SAGX-V>@FW_5;lO1q^_{jFCIRr$XbNf;hFsCeb{>4WAvIvJ-{1SUSTQ)YIq zajSf6xNz|wYqr+DO*MH(?x^Z%yX(w)Z*x5L=$wg(6BGIFH7fGWi%WbL{ny$3-@c^j z2PQC-*E7`{y5uk7|EPGeU&4n+u}$c3$HOBWNh*e263!Mv$(@BqSdx?sJ7@U#DAq3% zy4)#w#3xDYp^Js^=1$8aF-dYC4L3GKc<3mJ3F{pRN|M|-C&F=!N|@m4PSYb%ho(mO z=P2CiINM^qvGs$>9*+D&({Fg?DF5N8S8A9b+~^`8=+h#w&_zPfQKQ2{sjEXRsl!5P zo`GPii|Ik(^p5i#;w*=*DF_=bGF{|zQLp}@@Wu6uo-f*8^6E~e({jnVbF3`OqjZjG z9gE-BvflNkSxZogcGX4AjhE{?e|IeJD!+B(hR?>%?LQqKDgJb_@~vvCnckzmf4lD1 z+Ix|gRrjopy?$n0&Gr2y(bsa1Tif2Z%zvI=e&gNI-IDKhYu|tRt$i<lt9;J-jr$#Z z7y6Yi-(Ams^4RIHFBR+EPqEwD?YMY(>GSyN(C<zqYPFp+52$>XySIDEdF$Fgzm9yV zJhrQlr~H`X)$*eI+4A3h8$3De{<rL#y~Tmr1D_k0GVAjN@yJ<LynJxl*{SUo&sF}{ zwmD}uY)SNQXXmlEPrB8yOVHol)9tSG-qfB7pJ~e7|4zTNtAFq?EiPiUz*gP&2Pbnc za!8hGf07&Inb)Of+t+zHGucGuQ&zpmc2$Flh5M$@smYlVBG0(Xt55wduVU)e5-WpQ zpKdsBn9ee5iTVYJPEE!aTS^W@2^>1*nf#MC;A}`d>#ia`#s~%HjX@dQ`zPPX{PBZh zM%1Ri*RFH@zB~W0u6T6)*^reA|KrMxYFKyLm}s8kHWA-&VP+0v_1$k9tZU7m?lzn( zzBWohzf*g?hSsW#FN_=S?E9pAw0frV^1a6j<Wz30m}^*Q<$HF{H|G;K{rTV71|15z zDt)Q!$D8z1eoyPqF6=y>>O5y#ZrR<Sa+Yr`my2KbtdV^qb?|U{4I}?+(Qoy=YZqL7 zzh#~19JaI@OGR(ZS~=ltu5?SI(L9+olUa0Gjv4s*y<6SK>BIPHii+Pu*)5tW-RF(! z*Nga;++?_sto$Y|I`Z#f|LZSvY`4sPW0ZciU3$~A-1(<xEmEDryYOm8iIv#I7qy(B z##UBA8_zb&l~;c}?4ABY`S^_wZ=Z+Novx3u|9*12n_i5S^Y$CJrxxD5QgLOjbxqdy zmygS{&riF0-|&VKOKb|aT7M@;s^(s!M<I{W*<Z}&-CC-C>6qq?Q{Q54ZaS)WvM8<S z!QRbNGk>poW$FCtqrcJSZ+-ttPPE?KR^}V=db;;RyL)n*)*5URy%Sq9e^c(}cJ5U3 zx%=E=Ki5aB`WX1}Dfji4?~mPeli%<{ymIB2tW~FGXRlY=yHzVaOi_H7=SuN_viIkb z`EDM{Px*Y^$0<pSx54eDUh*+Uv0L8rul2?s&2`_N8XS|xn;2NWa<*QwID6%emYO>z zg;we25usW=TCLIFZ-sAf`rIA0aOKobqCOYm*;WeLD}6jw&#U+@I<lg7$u|W*&54ue zr>gBPdfR^{<*sXI`Omub+&n7vbxf&uc$(iNPpw|T|9bt05Any>d|JD<>)E5z4pD-< z+b3MPlaz2qGv&1w-v{@Zvz~KisHR`{TXf}@c;8p0jA;F~l^UU8_Fq~bPp)$LuRE>g zah`ZhxyZiXN@5r9`TwhbW^rZqmfZpexA#7B)#Y!w;8i%Axo7IrhLWXT>pjyh-f&5= zPS-GIUwea{|4?ng%f{8`>kC|*y?3%GUwCHpQ(^0rX01&UGeWZV`Ylb1UGC|ZH!J-0 znFXyU1ncwN<O*b@c%L8k<WI1_(Ye`qo|f^G{H-%wx2`R?oV(FLq-<)cYCUuAqPW=$ zQq$Ylb4488;gi{R_~Dd%>Df|#N2;b3bKXnv&Il}Vt@O03&pbC#bH(QqbtmLX>up%P z63$EA&^^t>RKXPL?@~Um<DpXHq|nx>ttUhi6&Y_UpI&_?^{URU<j?KdVg+e#2SWW_ zF6<29xxVDYIoCHIr?|JVvrlcgF7l*4WyYnOS3;B-4oECtD9)x|c>Bb%jIX;yqLMGo z*c7$DK_&aU%!gc|IF{dc1gh?cZ$H~!o?0N9WN;-o;>(-<Z*22DABK1wURYpgeoG;G zq5Q@gvDf=@PfqJR(=OYl`bK%}wC^!hzk~aK_TD*oGhqRHuA$LUxrN)Wo=Gs?W_;n+ z-M;!R@uI>#v!_ofoFZJOe1C(Uh|ed%+1arYDb^VruliQFJ0~o^#_X&5^G=LVkXfLE zwD`H8t@{>6KY2YP!6oJJ)$ro)v&svty}rN8NIG{luj}NqqQ#ARUE8#e_m#;V7u|F2 zp83Mnl6>Z~&m_Ich}=}5DJ3gqC0%=D!99K1#eeL6)>|B}w@GhneR%1k*Z;&f87pdE z`tDs)aG|esMLlEsG`7P5p4E@v3xxiAH%a#rpZCoOCa(ult+l?|K348?McWdyJ+CiW zIl08*#|GhMd%oiIJM3YHBV#z%D6U+brmXR^@~ZO}zDa#=`|mm1)=P37-SFDcV@hFn zqQ9iqltYFy%e(7W&)mOc@xEx@Ik7HN6;?LP;`)8ed1CK|MTVaQp6ah@2~OE>A^+zE z$L)~Pw-?O6%<W8f<NbFc^UJk2Yp+J%oKw;KuWPmL*Pj=BU)z-}`u)%5zqm$S!D~xv z{(oA<g~hSYjw{^`<J_ukcY5(BjoOc!k9mjduPIDB`*upsu`i~<k*DhGnlA6W9ba4Y zFNv4^{!F!%J$6stJ3aoud$Y=7N!*o7*TU~?W3!ty)ulON+h6O<7?F-H9VXT}ALg3u zmk=pFarBx0`<qJ>Vof9K*6fPPZ2Nom?tW1@uGuMJdshGJ*nTDAqwR{stoKZ^=RYz& zv53u+W$!IN*?#l3T3JTnqO98-W%W8|>Q)~8zI22AeyOi#kL&$q`QVf;7pCPBQ1b5| zuVKxVH2u}zA6`E{b6XZew^hB$f3CYK=9&kYyv5eqHKwonb!U=mCF{#2rw<z6Z4i>1 zxWTyc{e^|c&M?ijn(lkCUFFov4TolY>N<3YOYF7gi@ejZJNAeaU7vo3ca2x@jsG!U zx75G7K0D-lTB6_`jpo?p|Gqpd+CJexf>_mrkaVTI`n7iLjgwYy|9rVb&D6bA$$`tm zC(${4&2=_oi{`WU17=B{3_N{mQt(!W3!V<LhZm|Dajhu!WpmCmyB$%xV^L@3x{}^= zPr7V)*TroSkC5BZx%8CT@0RMe9fqI9W%h_2ed+VEzDhVaWa{4CR+|h|v@9+bA4(V7 zJ^9ZUj-WZRVeF^57fQ@ip5N7~Td=A}USo~AcY~&$C%4d~h%1-gDNj6n=;D&?eos@b zy0c&Z@k`a~+^siN@9Zq+PhTja=_7b=;*Epf3)l5OZ#{VJf$i62JI*p^6=Yp!J<rP6 zbKfF?=g|}E6T4T|bK2c;67syr?s@R?g-OZ<{C!VO^Tq7^{94Im`J~W)l`88e@17%Z zZo$tC9jWF!g(~vh%0HXV=TD1Y@%&F$dG6^HBgZPm_RO>MOfIut<J&p?V5s^&?dD@f zzgI2ZIDO&g)Pj)GE6+8q)-Ds!;F&6VJoNXvk6*fblTS0(eBLv|Q2u=V?0tK#SzAwB zET<`)wD`%qFPm;n@ZsHUShx7RRMoq~Pd~)o_`3Yr>)Vt4^=}>wTNlfI%vkT_0+p`d zRP||7F1o&Sz4>#^|A%`O+IN<}+^oNPlGLBFqU!H5Y-(y}SxPcxOzW0uxh@X6RCtrK zb>>ku<L+gP{WfWAP_^oq>dv-8X~xF-2hTqxU5E%d`cc*NW-3o<T%|Y<&trv)_guG? z9BT_aJg2X2Qs$k@0Vki$-h4pxnc0+v!Z}k5;{Mnw$sOnVvE#UQDCgCb+N^J(+onu^ z<)qGRDQqAq;cQu{nOSPH#Ob)<t@`{EuS*(hKZ`w>IV;*B{Nrxj14$J!qWeob?k2qH zn^v!K@O0rU1wE(!?klDXC7ySbDlTw4f6(;_bAar&$#<3SPuMqA^8LmG_I;NR$1k}u z*?gtv&G&rKH=BGX=D$=p#Vvfmk#E<8^ZN5`%Ju5ka(4^eGrPbS+ju(4#nQl^NBe<M zB=@Ok*INt!>IbL3pPf{(lwIEMTutw_(rY=5NjBT=)i)G|X`FfT^?JaWl*78O|M0Q* z&$7N&`l#nT_qK|u6Kay`zn|>+e5Gu~wt)X4m*xC6D6aGm$Uj}Bm$I_Z=*~YY2HArV zPv<c0x+`<Fxb?&4HELT_ObnE4G;YYmMFs~oHuDxS2%695<lOV(hJV2g-i;fUy>;%+ zZ?#Bv&8>bKeLuRsX7%0Pk~<qpLXTWJ6U>;?yKLExzI7cp_nGQgoU8tJ^l16M$^y2s zB-Zlo{+L7jbxmS!Z|-S_M7Q3nsy_X5mpb?P;J6F9YkdMHWlV5=@H$eA^^1DAR=RHT zK{J7A=YzIQU3O-Y(yUFI{d&hje#Ur|guM7Q?ZM-4|M|Pm2YzeYR#%@N$@b=x)O$02 zp0lemE(_Z8wH~f!ZLNOA&0Xav_HE_5eTiF+c28Ds@b&p{sc+K)pZGZve#h0++uS$2 z5V2BfT>Ipr%m?0X_I;V_o|s!Qa7R1t(mLqEy(?cz+cJ=|ujoSOk(s?M-GRQdtaNX# zc$w;Bm~o|K0e{EFx<^v~TvCPWFI-L9yzzM4(}RcYY<RZbc)$MnO7$i&Z@DM@Qp}bv zhfPo3oOI>0?#!8Qo*J|Bq_TBC=}O2kIhbv&qJQbR+OZ2=9U2Fe&IqYGv3SN-?@mqj zK5(tY`@pO4X@8|FA3jMw;>D$8G^Ma4WRBV)qrBgN0Y~4MGu^E_ckaLGl0&N6za{IJ zbh(QZr5)R=lE3?;Rq{L8ZEVq-Yji%OGRfS3cY|p{RIY^mxkoD(eGaiT`BI_jA?+A6 z{lCkr#bPUG>jd3C*faf6f#{)4`aJO+x8?Szax4tIRIu01i1Yg4xAT>D7I+3tTEm{m zBlXo<)L?>R!r_9|;^xst{>AOP`Pti7TO{sptZ#X>zigt$<)F!%X6h_nsW7)$Gq+60 z`FH8d_l7I}WUq0*H*3?I2Rdtx$Nu?w-H_vd!ltU-x!>orF7kZmZIir1|8dw%aYN_5 zYMPTQ{u*n34Q}Tz7r52+Kh)>f^XBV+!>!f{91D4{<KDwR2Uj~P2=9=RXx=#0mPz_a z%<mc@ThVRa^`C^kwiU4TPVoMo&wesA=C@qXKlO}Ha{~O*)EHyKnjE&@e=j*b_d<Gt z$K@V2za2iG9(+)~CUo$>bw#~?!~SEhPVVQ|_Sr6#XREO{h)X}LLn{B^l;|X%uKbe= zByYw@bzAYuwpJ~g$A8S`@1liIBQ$sSx}4&Vo!+v}Z!K@)<)!tKyLNr4x+N1WBqJj% zyJyGAzkD_F`<SZ_GL${Cz3H+(F<G2dR@*ZrS?a*V<}aQFOEyhhtF`V?^bG$WrHMCV zR%*`>$bNWO@M-SlGh%g*KOb=FsGs1-Zz5x*q;4Y4>-g9}yRiB21&J3t&kr6f(7AJ> zPiMkHn=92<E-<cmo;-uKw0^?wzaP|3^tel1^Gg+brsc9@+KNn3?!1E8Jg3@hoVTsG z{bAp<qE9akG+JZl{o#0fQ!>&heuG5?^KQF><R#*d_pbb~Vh*>}3j4kNc?{|0GAZA~ z<u%r%etXmXY0aau9G31qnLeLe_Wof#^NC5nyLF;%MSam4vCA0`bt3tAxXd)_OXil> zyZKEsZ#*R&Q*HQiv9HAGU&+T;Rxy<s?v`VY6-{5e`CDj0QsPQ=e%l6N`3_c%j1>R2 zd#*g)@BVI_Q)6v^;XuE^{C}r==kJ_odxvpZy>R4_gKuTu{9P#G$KbI^vY2(ttoFrT ztZm`5-q!Es;ErDTJ#M?MOR~9+*TqfKPt=EBdEiyGN&5P}x9?|86P66R^Wx{OxfhvB z=bGp3+HbSo<zU;?<I}>TZ%L>gm=Js-=q~>?8Qsi;b@L^Aa|+(*J6sghe<ZR<KKjT9 z?I}v$tjAs`m0dWm{UBw>%(m71k2l>ED@)wGxxsL%-*t)LN9xx6g{jy1c#0j~U+Vk0 z;&marSbeE=ZMGxdv-)FS%;#|`e{{}X7<g?})BCjz+jQP+EBWNAI(gB>m0KOcMb6sF zRtWjJ&Cc9X#XPI4cM<n$uPr72uc*aF-CMibUM{u&ZxA2n4PNPIIzLKRCaqr-a;4~0 zP`vM!KkxqK-oCQUA#$FUt>@CKD<<9e$gQqYX*lum!SLW6^_x0Ayh%8g`Ay{t>&@7? zRbOA7tPVKy`jx2foa;v?OU+wpm3Zsw8ObkiPye@aUF3Hq({ziGwx;#zDH9WuSW9Pz zO`4bLV|sD>t^CspJO7+}^Z%pHw%Wx85!cG!_JkJtNnYSQw{KQl!J?Oo|E)1tUwh&9 zx@c)N*}Ib#*XK-2xbM7LzP=_mY?flA)*F-C+wZjZEiHKd_vLp@(Tm$0RZp`;u2PvW zXHELt$+6D0Gq)yw4R^A9wMa;)T|Ti~-v9r>aPvb4Gj!%`&n~YD6SZDokpIWFZPvP$ zxx5!FyQSIYpA4|y{x3LugYU)0<>CgfpUmFQ^3+{o>zy^H9Pc~UOGznye(<um{>MRs zCFvI(N+R8K)svY1OlqESc4M{Hk4<-Z=TFItn3$X>sDHMqC6c9oYg6}vt=0L8;%lev z-4gV0O4AoP&CHHZHipfPbAR<7xY$!=!_pPSmy^Hh@r6g*BQ3topKY{XqcTF`_1niw zdsEYNYCF33<c071`RLfbkJ%r#d_E{#ApNht<oCow`<{NAb({BD`m+yVSwf0D!g{C9 z?TUB*E4Z=boYVYOOPUsS-I4Nn>J*W+E@&-tm2CN)npKM=r>{P6GCMOQr9{O1yk^Z3 z?!9u;7i(HtDlDF{R$WuDaMz=E=dVX*ZQHbKP0{f}soEQH8moEC+1Xv%lHyjVFli}i zuR47ubWQ!;aKWW)a`SXr)hnuHd=eh?9$~ki7I-rEU3tn&1@DziSySi5E}F>x(@;9J zefDIFt6!fin=+Ttx=ORSX?2*`ji8J6Q|l}LdH>>^bjR&)WXYf0i_7l_)&97hAGXTk z-K|L>m*-WbCWvmo&Fyk#>GH-0%(HLaXsS(ApSk|iyD5by!s{i}rMD+4zB;HR9igDh zzB4s*jpAyyDMlg7XK%1}IIQ!p`|-o2dymS-7(6|8PCBIg$83j_Sxu|V{U`Kyg>0_U zm=<KS=>D`{_uiOJ2-)Q1rTZeoqDOK5o4x;2mkGYOd}GNJiBbVw{cy2q)1D>XVRQeG zo4iVA-QEvZ!j~U$l8I5Vu9q$|$Pj;BTM*orZuTnVZgK9tWy`p~Or89Ef79eM8Hb*g zm>uK@+B8!pLF?HAwQR+;zKkDFzA+O&x%2Di;=2+m^B!3w)J}}v%O3tZa`unPklah1 zJ8HJReYin(b=U>t@bmMwWEP&Q3opC*amwmnvD<$6h%#&u%2;Hvh4XfUn)Tg;`ZH$} z%I8k3xH9+tFInc?JiAS0A)AYp79<<$Xo$VF;#kbr^|09EWYo5|K4+3@%UG74KfjgN zqx_V;^Lq{J68^4B?!TmOsyMTGycPHszIu)4#D|?H-;~w=FR^Fa``EaCsn8FzA4S&8 z<?8ZYHVe;O&I`XGcKlf@`=!~=*ZSw~-}kUS(_(he8gnKq-|0+SeA?&iU0XDZr)`tc zwJD4}tgYLmrJ@`JKmYl$QhJVThrqk~eZt2d-Q0fEDPgupSl<<uD);H(lMc0d|Gmi8 z896IzPN|;$aWmV`RwvRItly$9rN{Y6rbBJvQVE{^W3>tXa<^R$DT-eB_CeJ<nqya( z%?hi~U-gIA>TY*vwSA^loOkrjqGQ^I@i%pv_qx^DpD4Wj#X&UM^-#%=clX3%yah{3 zPc;bjZBi84b3m+*>C}g&6Q|y~vi>PtpZvJs%Zttw4UW*mdENU{SDrRr_~M}Qjpo@o z6V|fMR@!^xtD@aSxigCzCZ~4BBrSdQLiCs0UH|WXAMQnS*WYl;-;igV+rCIC?ueF) z?xEjFiT6%#5m@irbNzwLKXdg?HMu1TZ`0JCK3SUfe96WS_qfwLHTjn?-g?KBHlO9( z|M`y=<*wNfCzhId%XXsM!hjzBk~8O5HTU@xnqEjPS{mi-BysoL<Y>n`0@v89AD>H4 z;NSc_e8KILAMKt9OxQoWUbv!Yx8Z7oUemNs3tAfcBJECGytG~WKuyQ9hf1w~H+Mfw zyK&pcw%z<e^(OyA;gil4m7lMC;3&vlesG`7t8P#Ar_y>?`#(sUMP;u(pn7$CM!QJo zevWLr{jcwYb}Q}se{n09-`a-vci6u>YrnDIZU5f!?B8YVQ(6wJnxXhR@!Hk;MAtWS z->R>#b-h2MChNt5NIgHDqi4R{m>3ce78tPE*u?&h5a-r6>Ad`noi|Gj%RH8pwbmGm zKiC#3y=41Rz3HqOsuzEW)GDntYE1ez;mhqd%flDgKi9-w_t*O$axReXh#zmicEPI1 zlkQX4+Sra)TGqX9*{uBZ0mJTld;c4o9jZV7u)96r&~5qJA5U{XTzG6YRY#}ka)Ipf zUcac7T^oIU;`&y5Zi$Ert^4Mb+N%4NiLaecz5l<9bJ3USGbC=DleVdQ%Qzt_EONtU zt4%5f8=YTFn&vD%Gr#}5oaw>RYoA(gWCpgVga}M5`(9|X(0Z54{?NVa)WRNSIqiG( zJxi&h-ub-86N8#h9jbr7Ii-ia`1k#{bD4@1L#};`$dkMS_xvLd_SyVaWjmU;A*(-O zcleb+i;lIW&85W*Tq>`ATX~#QR?nGbTfFI6fid^~%F5-U8M2lpQ(|~(vbJqJDB8<; ze8!@=4foG}eA>#}AlEG3Ts7M@S8>JmGk>m6DEK4i@}T}G<Gp=5at%#)ojtp2N1&DG z1*-&}gWA^1^f^K<WGx6jzA?jdH`iL>E|n`jzI{ip{8Za8cj+r#-B!tp*2d3PQC!ct z8r>P$AK$*MTBx>IZT?B~C1R-s1|d79Zr%IhKzLi6#o^~J9E&RhHwvhUnOw8=oomDQ z!+3IUh3xN=Welow>sMUP5W2yr!Tx-DRHs@zzfVajbK8kaCnA}fW+YDAsJ=P)PqF0< z{=FOgrkze%BCR|5YeRhc%<gaT2PPl<e`w-s^?wZdT2&9#>IAPWJaE?P!LbD0C|A4H z`rm>tNaaq_o9TM^_S1|e29;kSv1wYdmwB|-#7>T^=q#Gf*J}PedvQ_yj-DSp|83;2 ztgo%~H}SiWAgOy~+cSw3TWS<?+KxKK)h$@cQjusFd;7myr|HtADTXtbU11VtU(V55 zkX5a?FXK|0QDkQ3v~KU#e6IcvOMN50aa&m4dCs4-<d)3Q+|AY#xH=Dc_-<J9Z-Jh< z#w0ccP1mD+POQxdb6qB93ohCvS3f1Ph2u`sQn_TwTN9RdpMU7{>Q1g?7pKSVVu?F? z7oRXDOT}(wpAz91+wLfvDOs&!eN?}_`I|&YYE)Jc-{e#;U6Vrp#KXZ?6gm%XN;9-v zDQTH0qw>)A^H1huN;<DkZ@PWQ%>B+bx!G?o1q4VRTbTPnD&^s^MO^<5C_C$OfAXr| zFs*WH{oNI3xqFvQ)yyhYTJ|r)Ea?GTr<tzmVVCFAMXyCpoS$a6&Qf;Pu6b)eYCnD; z6w<s*F}9>*{&9)ZkqnRj$rSXg+;ziI^iJ=`+ubi@g59dbxY-@;Ef_OZUUst8a?KSG zeY<k|wzc~X?OFb-I9vPDt!=Xo92OMwKOr`0rA@t}sD47}l)`k4cDshnKiX<_Ra5u! znaZ8Jak50BKb?I|<u0dE3E8<TLew{MFR%H+b9&vmQwuKp9yMjtUXdLisrB_iM5i9d z>3fpB6C_GAvvk+~&FIjYR~r3v*_}1pj~bau9ISgb&+pLWg)22#f0iV=rIpE5e?6$n z?ipzD&CyD;UQ_LaR_)WkGugT>m5DCSt2e9(J$HM04Ey!OW2LA5@wR_TUKX)z-SyN~ z*GL(z*(VuNCI$SRD6u+zF250j@7gtMSeJ@LHpgx}%D1)VLCCUW_WjMyx2$)5W!*Jp zNgU%v$GF)N|4$?xXuP#0YL}9ce%Dg2Mam&X>#N>Bo80SuKD?;DV46W}(aKjF7Pf4> z%~H0dvvQ7u@X<q#5h*uQ-^`XV<kC&J;2yMa`G;`NG&zHm3qPd<PHxkmq-A|+u}boB zUyH`Z$4lPw)xTBZG=6b9^5E4?vpLQj;%Hsr^+HALSAtvne0ATRxc*&9`;=SveAuU= zeLU%m<w=EEuG2q!KKAJO-%0gxLHw>fTc$3ueOs#%=$4T7kXLh=QLZ0XV6yg^oUJBq z>rUon=l$BUY5R7I*|9TIH$R=cXXgReRYyA(w5M5IJ)4&PW~WTmoSm0T{)n8v8f*Tq zqHEqn?cWk-0(Na!5&UG4NBpsTM?(?UqEp5TzH-%a*92C~+8a`mbG&ZZ!;l+4gzEM3 zEoYeZZ!50bdbRDQflPtioc|BmR5|u<y?OdoP4>0Q3fI=Q4POsx``k#GaCX){8KwWn zpWS|a@8RmEziMCpT)u0W^=|cFOU?eA#Pm<QnSI&0KAGP7@_(m&JJa^lO(vcbH<pxy z#Wc?H?PUGvB~|KnFTm;Fr`*FcdzclP(ygVM>%;eRZrJkn{@=7y_l{qiS`k^dt9#bU zFVD8U3fB!d$Ts<~3a9C6$?KXs92T{iye_p8IKJRqfYRTmeurPaQU0~obj|K-@tW&9 z^dD(#+POoi{P;#*_T|M_&ZR9Eb!@DQS$k-2iL9~E#BAArmL_}tU2HH^DP8q5pz4np zU+CW46zjX!>fN6$yFE)}u59p%XJ1Y_i2El$6zr@qkl253b@t7`^<0{7Uwr=Cca&3G zh<T%*=HyGemjAyWFvD|?%fh}NyEXPWC78V0#3%Uw&ZLiBv!>RkyI#{(%_)m?Ra(92 z$oiw%${w{vEpBHM>{ffGe%|)0Sz_7z!>9iJ*WMtgZgE;C!&821z1*I#Y?hOvYuZB8 z)K(_FSaRjXBA0Jxjl%<E7}NLLRZhMCC*P{dbx+~9Q+NLG^Th`SJ+j^r-`4gx#!$xh zM0c}{ib6X_=iCGC4&tpI0$X{fi@J-u9A7zks;ADYuD01%)O>d>6PIDSKUw5iqm1z1 zUoy9!3l{7-H1F59|33@ORz0szwg_$e<v3HtIB@Q|B$11Of-C1ZCWnZvey}Cc*7s%R zkK5mTMgOElKKx(LoADq{@)cLRchRIPl7&7cB{@^rG`JrZsyV%1I{QPo)w1H)`sSxf zE83qXDe`BftmXDUJ9Agk!#SSeVevcazFi5|@e|8v{@J*5=i?=lYIC(?ZtVJFRxkQ} zzvY@MPoJ%r|9HnsmC{9t{&ViPEljXl&SUQVpQ*a(bbI);wU44aZm90&>e_VABIk4O zRknK;h0cE${NbOsb77Uxi{@?nPn_y8JSy1Zwbsw;QGmUQckuF+zOUj6ZasdKliYXk z%Ip2I=U!f@J<d5-`2UNRbNA|hw(womjg<J@U;p=+Z)Y4^%l`!)w;!I{zU$Zj;FxF5 z|K@M__CC?Kg=5bLvHc&8wFUn&&u9Hv_4?07QH|609{)dj?`Pt|S8EjxtZPzeIr-?5 zkWh%$7Phr7JFguwUG=8r&X1P3kA*uqZ)#=i-Nm*xbfwUTr*S_&?%a9vrU3uz%$-x$ zp7K3$`t8)|^C#4=KINAEAgV@m-N|$3j!v&G&3U}%TA{CY>Bsx~W;^?yYES={Qo2Ac z?8@QIT!Me1_wLB`Ej(_hd*m?JiRk`>$a}><Z0p#&7ArY!d8+s5<o*6EN4Zdif4c75 zFVrMn5Z>XXxGRin`Sd71qjeKQU1u>jJrZrWn*PGKvczsj<xiv8sr7f64Ksaa9m(80 zp`>u<@wk0QVon}<YWr{L$7z!GuPhiX*C(I)dg%M6;>2p(xVcShPHD5QQM|dJbNS-~ zQ+5{Lba}n4<153HUi}4EjGpc{k&C{+TJ!m%pE3Wh{(SST$?8RjI?syD$Ln`oJt}|g znyTzKo0`3Re5)4E%gvk3D1Y)nkV!pLpM&>BBNL{`_>a2<3nXK>K9=t2`TDZa&Z+jp zcaziFZ<y_yE<bp`e%k9d23NwTab3EaHDOWO_N>LpN;4Bmul9-f?X_>cF6J)&eUX*$ ztDYN7`*m*nf8x6)yTt#Ty-}yD@#5m8y>6u}?S7LVTAdX$Q;f<wVa>!fbCI&c{Nth% z>qFF?G?%7n-z`-$W@nF8I(_<zVQY-1g~x{l=1n(F1(+FbR;m*(Hdw4V-MP#la+}_X zYPH=Ae3OH=xyYS3aro!CHiH>m4tm8exKCHA#Hh-5Z<u0nNa5iIpU%y8S;s?t^gZW& zNt|}_Psd43mMY=ttBqBTUwok@$vA1+riT|VJ#VXjUKJxd$=gwFo$mTctZu<!TDLzw zabNa9aORu@x2c;Ju@r6AyPG4KXtwNqdU3a#*W<4WjFTtuUvR#{Y&Ypi2E((Z${$~S zm%jQ?#>(?p!-1zcCYc&{7`t@ls?;*Z{V58F?btcLv4#28Ta}Y;$zE2;MoZF`78We{ zFptGn_3+m$^Lp)!pY9GDMYq(vOO1b>df?R!(fvR2-{l1^{?7R|zw}q1+`Wy~(_&(( zpFg+$y?Vv@|Ci_5WLf;;-KV{}OM{EQGo+<$s@AF1U1w5tVs1U=zaF=UdH3Co3Bpy+ zZ_S<2edYQ8yo$EPjfc9obC|sIXWf;5w(-AV=}xZQ{|ni+{8@aZ+L!5aZi0N1!m_A; zUo$7yy3BkK!@#`R`1Fz-@!3-w?^-qI#s1V2-#tyDN3B`W_H4qP=nHFS@6@_KBhSlJ z%JAXaZ+!yy_r7Jm`JXYEv3ECk!55?1^ukhE)#=AS%Op(i<(K7|u02E6px(^V$Ow7Y z-O(!ch>+{ozDYhj<9Os^flO2JmpKQ!_TIaZeB7%ksk@ZzW$uJVMwhC&H+ekXdk8za zZ8Y4*(&;9gd_|)7`!S)*Jv%#}x-EYFVBVeQw~Z@;^NaSs|G)qFPnSfS)c0GjNBxd{ zzgt}B)V+C=JXG{nUt3cjxBpu4m7?=gXBm|KXz5ITmg!Wxwp^@}`AFl5PVq`F5f!ED z&LOut|GxQHqrSV_@7pwvJ9Z9MNezF^suWy35B-|(-c}|~=>Id5jvA>uhci3AGCeh! zGRaG&_7`u#Z};o#m(O^;`s2swN3X@@L`6i+3*Y?sIQe<D(j%p2CZ@$xgzJy@&o{aC zt9Dk=y@;nlU#|)H_L!-7tmOM1swcbpi_Gd8Ut#BUY?^mXA9~5}cPL%4Kj`uLn5WzQ zB-eiJzM{pfWO`BXmSFPK)lAJ>PD%KtbWHlw^M(6saQ5GtsTUvatDAUgg@gUmMOW{w zo+3BvgT~WO3)a>>jIw_^!_aH#we$Xx67`~@hP8Kgta#C|an^~3!hcUB-|o2Zu6@hn zHSc>rR{Y%>nmkQ^=Kc?+?^}}>CoP`xZ<fc>_3=}zG(xPuEq@yHgx{Ta0b5}6%86Gr zvP?{;NxAzjPz##8B7BABm5?kc)48)8_j;XO_AH=yW#tv7Q_WE>y33{oonG;DiuzZn zr><)kgw+S#yP}mPyS4F_(@G7~r_Miv>ZaI>dawo_4B-&<Y7LaqYP#j-8Wg3~bt%v= zL`T#;ce&7tv{y!7=NuB+nbPnivj3*-v)h3}t7E-aF10<OUad8+N{@5GotF#Wee~;> ze;amt?soaac;D~Kw_g-ry7E&0jDmJmKKClVca~e1Z+mW8f1I;#d-d1XTen<S_xrfF z`g`Ad-BUFw?y3C0E55vZ^EooUe_wfg)Q?NS&%L&ZN1up$_56~*?((NmKkvs*+hwx% z&f}*}*9F%t|E>T2e`C@PCBMRMZ>a|c3rZiHX?*`NYoB+4&@_(cQ|!c4cDI}{xTllX zH?gF2#|(Gl9Xq_;!k53UFVEWPQJWUCtD#uu{H4be<0jv=w>IK-EiTkrS@?bTikaEF z+P-{kn%ViySyf7LJBMU%<=h94xVB#U{;{Hpr*hp_JF630>-xX+GVSA-Su{tXbzVWs zw1-c4f?XzCTzGPar|bc<(6<>C8~oyCcM1J?YPn)l9OJ?>dn=!BoNZoqX3nDeyx#1r z%yqUAljHX8ZP7O}T_E-Dli>c$Lt$+GM<#De*!}T=z~_he@8#I<@=mz^Q~9d>55CM? z#Z|%|qF!jq8>{N2?CpQ~<GRD!+6|MZhfWOLpW0NlnWfE1{)Y_PjZ)X<<$rFklz(*3 z)rKeYR`KtaNB5@8t}x1<xvnZ}=lf+s*FEbKZ>?RwPxwQ~kC1&A%I)5rd@LBi@4ciy zJAJR>n}ge*oNiv0+;;r*L){w=VNtCs&o=S+pE2m<lRc;warfb$C!A9ngjb8$v#yn4 z>)YAQ{^^bG`reI-c1&|pKHM>hIyy(+VPDfz`L{lyzM;NP_1aBkmrv#|K48C>*_rjt z6y^IpVf9&mfATJr4tCn%`cM6}5Q|2_4Mp|u^H=3PU!Z^JjgaHDNhxg;Brd#CIHqIC zpO@sfJ2sr_$f?yvMP*BtEJ$JQcVC|L^A_iwOP*KXS93SAJNq%OuLvl7dqnczuU7Y? z>N{Uwi0&2N!m;w0Qpl;R%E`?P4}EM;^*(!kX1RZre%_4J^$$&K#Q2Z?yTR@z(Ej2e zv&4i(<;cotx7k06W<OD|IH**xMVQ%B$7^z+*PeqDrkp&!%w0$Bc%nJW;{Lg(8>c^f z+Eo0@C*{IxUZ=9MM|~cxRrkLgyVabko|mjvZ~85wL)M^~y~dia?QqN92LT68>m1~0 zJ5V8^w3FHSjY3$-1o?W-d#_(h%e;D=%w=10V#{}qe(SgO<-TRiGmrjO`RCjq${z8! zUgF&;$98vT`8P+Sm+j^FWum!;seF?1K_<Bg%ExWX*YMssk<S$)W7Bw8`RH$hpkGI) zF4)T6k~V+V*NAl+T&)l3SWU{99V&b7+S2Efzr<<Py-P~7xqMO4QAG0EpZacx$7g+f zzf4Qx=i`?$<JA86pnbi=|I6xGKJ6`Ad90t$w7vahR#j{gL;G)~1pRpq`B!B{&b_gn z9)DieQfm8Al@n%@OY+Q}m)@MIb6j-U*25>hJt_NEd0lG7^wmo%TF%vr%{%_^<AplE zU$Gm{=PZ<sx^l@<^Hty;@sL9mn$;}F>Ss(#s%*WW$J;J)>l1V2e_QiVaoyDF69u(y z(iP^1SF1hWn__$T-NNcO_m5-<o#~R*P`)=|?u>)_celB0Z#?YGdtk2MgIvwu&b4+~ zIiCCXy==L#?wek;<Ffixjk05>jz3Nm>9P8@#Y=+y?^BD=ESpKiE4H0oxHYYQ?#$}2 zmbv%pPY9-XwjW)8OGQ2J&~Ed$M}#8u*iXj$t+{=8|JL7U8vRB3kINnvx>JAf&BWES z<Nn{6e*BB{M!9U!8I@0bWgh%H>Ra%j{g8Ume2c5666Cb=FBq!Ms+#=hnQ`*pbaiw6 zhp%<~K1muYJ>Okjes4$Fn;$3D<bKTDqIqpi?D7d`)&AwwZ~Hg(#vjX-vQysvwR<h4 zS9LP?+|O0FErXJcJuWix?fJSz@_YNU%V)}4qo0*pm&e_j7WhXiqwQeOj4KxW-}S^( zrlqDlc%F7)mWqS@PcE4^M_xYa|D??Lmit(;wY^Wyyw$%X?7s&X9{cq=ga3LB_e*J( z&nXprLB{XC&ZsQfcqybl$>hc7pR$@OZ<lthU0b;O^)0QwPe<bA4|<>GKfLDf!DaOf zwkN)*9Ftt}cmZShHOokoLu!^Mmen<~=iQwkw&+nJ%i&wWnZIWRupYk^$oqbQ^7NLy zrpx=TYL_j#q#~EPc#6-wy*DKHXVz{q-(KYGdDZRUjCr|do=plkRmLcvniN?7X<bsX zU!h`r+^w=N#_!~$jEn80dVc@V*RNOiNSGRue)FMK<J%>-wweBHXFZ-frzV-}%cIDr zG7{DQwO?qT=&)Y0?NPEWqpQM3;n^`~lpU+?+XT%yZ6fta>G78gccK3G(Q(T|3mCjN zw)|N3Q!(rDH(QrqYK;x&+$`OK96ku@*8gU2+{2r8@#Y(!4}4|Jjbh<pZ+7wAewyaC zK6H@)U$x{(k345d*-JUSPlS`5g0I~1`u-_<UekNSx781pRK%1%jd;HQsQskN|8-gR zlq_EKxkF&nd)ZvQ@UAXx)&N7JJu5}k?(M$EbvxSh_nhzd;(m%evpu{2tW`kLZVQ)t z0@qj7hy8r<sKn;AkLiyeVrw58?0<E&b>UIFw~mLt-Pmz}p>@^0{buvh<yEqcZ5D@V z?XipCIi2`x?)LTdI~Q4Qnv#EG1CQ?`rR@vm_&A16DB0i^I3qYP=vcmWWt)rSkIVJD zFA3h87NTPkZuTTpQg)N^=FLK)yFT5xyZdx@R^=P>pnaV6l|IjII%OIC`tYOh%R}*a zg??YA8_~Z`Ff)fIgwKne&=bpiPG-*syHx@XT6@b>3)d>__J34yhUcpOx6{4_TVL;b zn^Y$J-d;72KYS5`o<nEP!=_i7>yDW({8c`EZG`uuUp+^*zLmUW&Yfm%!Djw(<NX-5 z4_#{<%73!%5&ERic($G;e!uAZ-7{<#O!|54x$m9i8^2f+IrlKidDORVnYMY`+|sFU z*4W;Ca+JAAVnJS6oJGLuxo00QyMJeTq}$=9>PbN_wlwo6H2#r$Cv*IS&Xw+4hBI_R zYHl9wdF!dTK|PyGqVLL_Dhnev4y{L9f8UtbbNw5~*5bGQ6ZZLTn5J#qaisp!`NR(6 zmCtTG<h;$XRxi!JP~`Bw=J>6*s?LRpuDg-*Q^2&aS}!87p|sZdk7J!m#`^jG9vjx5 z-*=(eJ<7M;gEgkjeAbcgxytJpkDDjHSfKvKRO6<O_+^PbH>?suWiN$ultyX<F5j@j zc=qJDT3s{4^D|DpKXW(q=Aw+-Ve&E}^(%Q}3hmy!nw#%u`z-SN9KG%J#-eeJXY6Dz zT<7s#^V=tNsc}wc#ng~(KP0A1)=_zq_Ec^9V@ZKmT<7jzKDt!ZRlewm{_Ug*_S?@& zOD<*+4ZbyD?zE{BmtN<t(3ErQ)@n2TW9IQ@&by_XxBANO<CxO4QfIBk>eX%cD)wkw zFIVWTcbL-T>({9`<>EJ|!>+HnPs%>^xUY9&iv88{Nj-eqtX@o%^S|*Z$<K4q)%!X} zS+@P%_~ki^$a$k}3=_YvS?Ow@$bUd_QfMsG;kqBcO@4LwT>mmr*Z0AJ?wf7%1?CGZ z`n>0d>$k@WZqvI;Rx<f*e{=lhqq<#YQ~%6A?3i-O`%*@8ePXoO`u=XiBZYxW=3S{z z^4%-FP1M~`uxiR`(L<kkEK9jQmhdt6PD?NObned-t#w-accd(5(2ccyA+!2rQ1WHr zE&aE@AL;5el5pR&=A=lDT}q!x>HCSgcmMw~eDn0V^X~Ffw)cZ?)ZIAds`&9w`p0gq zX@!fgRpnjaWP72Q+W)9N(*E;g?f-e#H%xaddVS?L`>RFif9vj-ykBj<FW<H2-HSN_ z#(n}DUR2%Wx)8W|LfhptTb6p-UQThj$?H@c)~6ViSlPOfM`&w_XP2US+u_^)mftfr zOq%sn+G?fB@qlBd3;t9&?m2qp>616-9`|0|U9@UvUP9)t*5hkd1bxvCnfbn6(n7ss z`_JdI|G$}^UEikd*)DzH;}*_;H=oroMR2s#&0w8Y>o?<E?oU;gR13M!%4rW8BYx!Z zS!~@O`Y}*j{+y0Wg{7RlR6xYa$Fo0YXGe?X3Vv0*-LySFvZCs4veAVb{tH`<|CKu- z-nQGn(0#jHP5VBEldZp|o~*RVj+aUMQqL21;+(qdn^(8fCbM`SJiBhS+`fs<3eOTH z`i?{yJui@HV0P%dtI$-V>8Z*4U}N;oJGPatq~&S?o@iaw$$R-}@B1H|((6+H{hjq_ z?;UG*z0cu&ak)0f?^cCx-5F`IVbPW19Zqg9_8(H&Sad9?K<TKgNzsF2wnv0NOgY)S zk-P3^{XK~p48i*<IL_IWX-)HYZFzWlBX`rh?VRV=W<KV>F1y;S`27~wj8!eMj2Um) zSQUAb*8OC9$iwMyyVH=Rj(t*s+3P@#{W*Hul!Z*gLY42{pBY~kvEfQ$lf{N(9;byo zYP9*B(#@Z@3tyYMUNHEHL+?Kx|HrzEcRM=#nynSWxW3-V;PLG9a@;r0rgF||I{q=D z!B1dG%5>l8l(iley^?K0o$1%MSlTPjob1mMcR#Q3c>iCn;<(pIPTM{$m-zNi-*L%@ z?~$9kI`eF#e(JF^&#&b=+;OS+p!4(f(aVCa&gFQzmTUd}lgx9cw(sCSSD6^TF#7kN z3%23)`qdmU`!~F4t!FvCU1-huk5W5tI@dfnzh<UaIm^2ISf`3(5B5KBtoX1v{J_@) z_lL8Wcc}dAEv(RsnQ}g)T9vK%beuiA4A1Y^oyGHIX7BTyFxS)Q<(Yy5EV*Vs4+=HD zzs8c6<9j{+{mIpriiDGSUv{$n>pc@Nw=H^F-OIRH6E4pDXSmFV@4(iX_3QSntuT4P z_w9-9mRBpM@YWn;nHQ1#;c&NvOheq6hu4<mmO6P0bj7WS=&7-4s@SId;YzNv?DyK2 zcZ(RecO^ev%`^EUkKFebvlptZnmaG=@u>KhwR%TNxP9d(37L*h^K^|q^=+*-JHzuS zAlkEO?vw?;uiVdj9)I!uQl8g&S`D7{7bg3A_}!OV{=qOeKgT3Aa<0w9f^#?1BB~{9 z_`J{EXI;PhZTZ_H#VynR-TkaL&E!+XgScCJ^?qmVTy(hP-M_#3W{;+4SH|iYT`AbA zu|1AKe;J$T8;|p5OO||E^|d7TiFCVLQN@QhoDrLL<R(`(6=c1g*P|ZTzsUP*sa5-? zBWd+#ty;azg>U;Ga^mLke!QAj!@TYC!Z#X>)q-*J;sPg34h}gpeTv9bQ!}d^t7_|s zDp!AW`_C7uzjNB4aS<!qwwen{mKBnZ^lx`6J4~2=C#`Gcv)XU0PuJ^}MTC8-I_Y_o zJ$_--hSTv9nNNg^xj6rCo%ws`*;_oeUUv_sr>ZYcuTQfM$@=q|d53|GP~vpQ3+7e% z%O>1RId$SO-*UOW5bZeG{*u?z!tY)Gu-k~o@^-w$sS@cdm#Mpd+%+wEuyK2!X}MIK zR_ni}H6H5k*pG*8I=Of4bGEm!>xyI)e2*)aNlk7!VN=_=?}no;@3D@&=|ZeUOIICH z-2Wmt<m5pi%|?Ox?MHqD=(Fp;nP8Q;H>r?aD@R9PTjRlLt-zOotUa3SzrU~lY#=0d z(e>zwj35CUwwx+yneR6~%t$a4^j5h4i)m8rlLazA4d01w=GnVxYJSqa)3*Dc=kD9P z?(qfo7~kl!l;#K1Mb~!*u$Z`ReP<RbTU-9Ry7_~5#WkIneG(73JnA3b-2C9z1K|L! z8D}T%UM$%>-F08=jHBu^E}T_j{qoYL^qt}?!#OFzbKd>zlQ>yf*g1E`)u;OF{WSb~ z&U$&Bc%bX|e~wSO+CrWs9oqhyt50gLJn`Ih`SZyy=PuQd*Gyq+>W&vG_}yagAu#Nc zu(sax;{rQ>Jub-P@l)(m5?cMixL)GW-Ay%}?kkrFq_r5VE|OKPtDM}Z*cx2WuQW-4 zpCijS?L%MTKRK0GWiRfYyC*KYaQ&X(z0)Fv#N>Wi?Fu=6*iItpnDc??vl4gAckE8L zW|=&zocsOMU3dF-{rY&(SU%eHrQ(BwmH%a5T+b_ABmIuiwyf#4;tNN+of|D?T9i+$ z|8w?4{>L3^|4uLae(rui%>4g$VjKRNtbds=({=yup8d}%YESL!W&Jbp+i8vYzqu+~ zT2phmJ_>GQ&At5l<zybiHl4lBZf0KRgL2Nh@BT44XoGvRd5&A&j7z#F?{0TA5D$Hm z8z{q>|Lx(;FP5)96nx#`zIq|Q&+d<3m6aS13hFu3|L5EMgy##p{)=??EkzuO-8XlY zte4f~dzrcU0v})hWTBkbuFZFsPq*F|+_3nQ@|&)g6HmLXH+;Y1{_U{pJ+@oSO#1EX zb{Mapw!6IK+@HwoXTMjl$h0NDm=dz2KR8ExxzVQEo@s$^(w072@VG2?dYxxY+F$EO zpM{#)`J)?UKmMuL37GTr=*s=q{e&gn{F-7>B3yBgv29Aw#{2m@d%yaeT4r7M%xv|V zJI{`GPO&{aYs2yL0z3L<?)|wnvUrn}|K~N@HODuc-M?q{A)fsr|JFQAE;)VXxzF@X z#VOOhN@Kk?FL|Bxy~yeLViUj33ueE&F6(fzy5$VZnr$qP0t{RK9n-m5-`?X?7t>*F z<i@pXH;>8x8{K`HT1Fv7Q;)9L=FyP#k$snr{rVrtNq@S$=2~3R5!CN;Ufaz6Vj}-{ zaivEym+d-J((+}dCeypl?u|0vE-pWLBal0gMSLHV<aW+g-z6gw3YR5!_ssknle(}_ zT(Vl~k4L!36VZL=Pad(m+s41)`mK7M<3hHwcKniC!)AU`^>Wa#?k@N~bK2C3i4tD* z*;{LLHrkXdc{|hkjG)iMMlr7H3A^jn%MZIxIMC9wZS8A5=9TtV7jAzpzWjQ}t~*Vq zY8an&X3fYCy!>%nx2g5#EH0J~;r+{3bNBo#w}|xq9<_Vc?(0(XJlZ~cZh7gs?1k?X zkNRn|rz-IrN}bWz{KY!OZLN6ZTY*P?#Xfnr&K=nk(tf8WDR-HYcBa|N{~}jz%<GDB zna6drp(l~4Qs7ub+@i-^pE@{Imu7@7{4m9%D8|!We5$~d^{3CSR}159eO?mkn0GMp z+%1(2o4&3qk3F+kVh+E5qS%YB)1P{l-TAk3_vZlP`t7%^j`K`9vT$;4cDmPn7f)R# zxwh*M1s{0Vd%a`tQEcQ^GVB)!`7YUUMErwV%<NfH=E}~v8!taI^Fo1Om{@&x$i2Pu zqpR7{)GB4Qc*PGe2PGPwTe>`|nyY_}ZR_!Czs(%E&U@y?6dUTNe9#GKWd5@Jv{x6G zz3Q%Fna*WglJ%xX=FN(lq&;(`ONpP{L%zK)ztvl+=4^f2*e@Z`A1>r&HOJ4x%YXi< zl{4~tN{X#7y;n>-@~TWsAw@?+M2_(w!<ma&NuGyQlQO-Re-+feuB7#cdGnHUUYp{U zWCdK?A0#^0rL*hJ8y;t~h3XaR@7Q&>#az`>vg7`~>FFz0HXGe~XXD92hm0rx%D>iH zq4Q+Zq=33j31>1jZC4m%W*>Iix@$qN`_=dN>V7|7yt{%!=xRx2UED)fKQk#=@%?t| zjI8I2+b3A>mRWeU>ceeg-Dx3*d1d6(MB6*!FSjnuNN-%E$NRFvd!5P6Fwu?^vLQdN z2R}G;kYQzN$5Xkv(^@tKiPi_QuILlbUSf2o?beaFmSf$Q-yA93FpuZWG_kk6b9a6W z$`D*?a#AXJ-y${Eqo01vPq|{5awY%s>%J!0^6;+jQ4&_Bk}ofd8oIK~KN=SlImxpo zW0H*O6qAEm+@~I{`eV%^IYXkQ;Ma*j4s}N(mFEZg+Fit^oGSd(*RsLDPEAdz-t}~A z#_6o&mJ`Q*czFcHIEr)mf8;;CUhGQY+UMmyn&Ms87QS4snKI+=%N1Ww3V+xtyRD3M zuSE`T>{QWh^X_jiWxaJyFhy3Zp_=n>on7VM$Q#0b|72?Z&*w`iJg!(-ly>Hufon`% zO{G!4q|BEN##ilK!M~+1ZQ}l!cl76-HCFYdymQ)S<wtR98BSTdxs1!^$VQ%dvpqMT z-uyw}lN4{?(RS}!0Y2RFvnH*$yDZ`NFZ0arAK#>2p7*PHx%qtAwxty%0`LB+zm7Oz z@=ThEwdU{k<>L0HkMmw6l%DaI-MQ@l-o81<>tCJNxQ=ay!f_Lx1>8nLs}}7r@QsM5 zs7;F8#ZbR^*@geFR3dL{UO$-0Y~jn~{%!XEFniC0-?yT?Y+nC9?yEZQZFhD2e{PGT zAB!cfCH`-mvSF?8MJLDQdE3i$?p}D?XIdT3xt3>7$kyME`yM@?cG_3=OwZ5K`%hm# z`S18R)%@%6x#C(gOP79Fuul5ZwnZJa|6*dCg3{U=EOpj?ZLil%KUHof_V&)@|Ke|F zzGL`zWwGV=`Bf(6|Myp!tjXSZ;&il$Zek$k?aRg$K93oF4;sAUiwz5izqaOwy~!I> zi;wCzSya_Hh0fpVOke1dw`mUVwt2rh_m*xrwrsijZO3gDu62e#wtSz~k#N7^ScCA{ ztD>!~d+NeAEdQR?e#N9&vEF-P)T~MI|NhFpIRAfAeC+ju*JjN3yw(*zc}<(WQslX? zNumFjt8|xI>6@MY==9+T_r~;66Q3Fm;kz&6{r>UpxUo!*UC*KMbWBo1_^0){89x7% zg?|NxNlUG?H*HF)4y>5=Bc@KF#DBtmHJuClT{pjXC_Y^$7Zh7p?wj^kcKSX)rROF& z3a)|1Yxi$?^k`0qR+Z?%X|YF_2Hm?@H}%*`^`cj)Wh|cSpWT^r=Z;LWU!vp5QuXEE z_B>u{-RsJ_^VlMr<@X-#{<}-+$$wU+J=`kbnYL*HvOLq@xJXD%-^?%TH{DZDmK!|R zHr+-*R=7SwB>h_6)(BmxD=e2fLuP6%3QYdATWwZ`+4dv6o!sxVtxsIK;IR4f@1Vb- z<(IXs&njKu;AnC=Vw-$K*YM&I-B~W5{U@C)QlEL|O!(aXJJtKyCeQe@*`oOU|35Z1 z2QHVCUjII?_}+Kh=UX}??B)n`x;z$J*VPlV=flenq1j7U2G(b8PV<kRCpvYK$m9R< zEe3HFJS>Jx&Kzqz7PNCFG9G$-c;;<wrbYk#FBojG(0Gt=;X~us73nsTADjDYdK6sR zHvV|N!I1ypqy?Nm)~g?9vwc|aAY;-gVb~)e$S>G0z+*V^hj63IqWk+^9*W2;x%279 zjxB4Jtl4w(a{9TNvW+IT_5RbQOqd~RR{iWu`oF{fi{oxAdYP!bC~4AC%b6!V69Y3h zCTcHhUpq@qO!4f&ezjIxO<(TrKJOl{PX5Wq+Fg(3a-BZcGdZ<Q^~92!FJ}fXZ+BHw zOKp4Vk$N)m$95e(RXr_ZJu@9^T{AziX;US{x0U?ebz;NyC7F?l4?PVFGiTNpCSG3F z+M0UoXsc>k>eBP`4VAU66L*D7Gf<YZS1)!ubz!nm`j7RqzukH*IPvnK>H2l1Nq1LY z-dwc#(4(cBHr&{;X2p^zXI|RNTR3TX_j)OQ5clm-S4(i1r!-G(nXqw3<dK|5l1X|W zWeodg`0sJp<Fm&}M?p-eyW{AQ)km_A1l1==ZfuJ1Y!P1FarKB)lJ3U74wY-d(j9Y; z=z&jV=(JFp=%G|5eA0z$qSq3^Af>q{6jEH&Cc2*Jlu?>~Lb;1WzmciH<->KRq(*zQ z!<|7FRW6=P)NbD^Z=k*)`-fYR-AloK@p=;{xgS{z@|RSGJYsI-*Qr=woKY9>JLCI| z`Wc4v`(pn;XlZxhuWUZt{GH{ulaTYjPap2J*H2kf@#LbrO#iytFNby<DZJl$El{L% zido-$tABSt+S^R~e`EWZKr{24*N+#=*C!vk!#UqS<_F8~Bg-duCES*XH~Mf$WBmq0 z_b0Q%bqli{KZ@<$J2AQJ7t_h8$tQzc#3f6)bi4EF`S192PD#tX)~@9%6>PUui?ty$ z!{~kHr=s31cX_ksNW~pbo7L@=y`so{=H^M2@?IVh8fA+uYZ@(Ur)qBT;4KQ(OGv$K zb>?mE+ZgR!ZPu$gv)C;;y@U>L{a|M4X0Yq&zu!Nf<up8K5?1vyHPG-`rX%~g#xHNt zlyldvUkizNUB6cJP4$MUTXr~dF1Rym)1H)Eodh4XP5S05P3F2OnK1b}Pfq{d8gEmu zU}L$x^uu?dS1-rPt>50W_Evb+DW`?5Hz)DjeO-M0g7l8pOWmU%t~izVEhqW?M)MbS zzjJi6b(D_(n3m9R@9P1%^&UIQv=4k2@tGbIU;9K={PXo&{`s|D^?SuD89OCPLgqZT zpDlakO(q+wRl<`JovNG%1~XS&%T#)Cu-?i+mHWQ%;o}cDH2!hVX3h7WS6gT#Wc(uV zV`PTvck8zcdfSwbny(6T-?;iB`y|fdWp?KlY<y%Q{C*qL=B+aFJ14iS?^u6*?X4qy zf@Ujh4)OGJboC$pQp|X$>V|Ut&dq-hWzSxm%*8dsdqcO$?aJ=fqO6}x!p5$?Vl%HS zv*Eh$@iTBi*h|Z`p67k!W_Ya<c4(XQtN-xC^oIo=hh`QiHM=c(Iw@Ru@lwq%eTydB z#=d*E>;7i3={HjgS<7~wi?Mbrzj7o$VtR|*sm`S1Kf+G$-6t6*So6uP!C!67ggNz% zZj-iu&~teBfsyS+L)h6h6^%A?_pD51?JZm2GNm=-MXE)P6i?$K>FaO#zMXq}>i*;B z*$sZl1}l4cW^H5ct;w{qExuQ2vF|2t{7<Q%H@lD9?fziNtGcw~ZsdtnN$$w699x;E z>^M`ibn3wgJDz@cGqt?PrQk-TM7gcQjeqH#vGtEHNcyU6ZHwHK*jOUGS99<8FALc$ z*1Q$DeZOwWU*20~OgXygsmtEn@$m{<UcSpJ_xSHcR>~J7M0(`h{r#*y|7!nmF#7&9 z<K&v62VW<~P0T+yl|f$Mkm`q%mGO%Vd92FzOI}cKTm3+421oHt*13~RgG|)_WIlW9 ztG{NppS__(eP;X3#BG}=2=+agvZ1l;m$adXZ0$o$nS#f68-#b5+0-vLJLNS?H&thj z!W{L=**AajA6joHIpeB_?>4cMdv?EDpCtCo<I>jk=YL9z79TUaYY}4T|G3NYdFxz> zC6*Ud3RgA+=CimdA1<6Fv)4!<aN@=6iy>0IJJmPdZ>>IQ{iwWNhV_!o+9{VeG+dU{ zv=5*1>6#JuXKM}RO6~m3LI0))&**V=dp32>o->tSKJO^2D4Kuy-1bW!6b*Tb+}&3= z_Swz6TC8Qew4`ZLP{PV>2D~3aFC~>l7(_PIq$Mo2_@C!-k40*#U_qOb*hS{M`+KJg zXn*@q)7tx2WZA?p^$iSJ8|ptSIKv$O>H0m(75V>XXKstBUHo;y-kVpCmUVnTc$I<e z`?2@&wt^ccUzl|AxOlzMjKCb3E#8MN)J!;Y;^>E&@A6}=mXz-`IVqo0IXOS4`NeAI z_cG1;`yww3D?B+Maq=lk{*l0EPQS(f#s^+Mw0pYm45QLZtB$={9LOWJx9;WU^MUo} z_iz5F{6j(Sv4h2&m5uS9VR@0i?)atsQw@50X7!r|dhzz(|6OE0xq4<R^TA2a)AoIN zb7{uDf6?#%KcB1jEQsai&fU8b*iDa#_cT{r`LA2`L-@XtV(=&FA7OXcYwDK0e`EIE z{sY@}U+axdJ4_ZdT<uH_Zb;X7^?YIXpNN`sp&IqN7nVv-)mg6gm$7)Z?o+X6x+_%b zyS6n(PKZ{ho>v!G!#M4~$Xmfj_U23Urb>S9iPQ;av3P8IQI6Sv!PHNG!&#<^+f}br zcb`(n8@EqPVa-=trI%f6`|G0G<UB7K6{#p4uD9c=j@px=;PBCExn2iHZ;;kD)eCHr z@v&#hZmrd==UcVx#MJpyr*602X8iiVSvv`y=WkNa9XkD_v~VhSNb=h=>G6Ww52c@I z_WOR(@75;vCt({rqhfbWI;9&Pdi8qv_QW=$MXg0U&O|@iTHU(7sLA<I%M7E=(CB5R zOv1~Poy=Z-db*1zYCYqgdA2O!lcojPcZO@kxZYxNp4fI#Ol@Jk=d34>CN0^dl%0^7 z#CT%SXUl}3&F*~jt$#Dh2>;-%S;nqc7O0n7xh_Oq+r;1!XW@&5(=RU0o<GYvw_RsL zM0CW8WlmPTeMz&|o_VX4`o?eiW0BZ!Mv>n))V5x!w5m2=bX-!T%5t5edts?>WMwYr zWk&VMirhYC>KiUr|2}=%p#F1lk-pA1F8^OA{~u<U&o<3lCTjCMProN+$K7T>&e-}% zZ%5h3e`OPrPt1&(aW2m{UhKct-i$|%7Qfx3=X}0c{zm=%-FyGv-B<ng`^seTf1gBT zuK)i1$$R<Dl6LijuF<+;4URne*5^JS{~0j->celZ)oz6{hhOCg&f4IUpe4FjufFkc zOGot?m#~dC^OJoZRZU$}YyH=P%VqL~Cz9^h_tY->KH=^;wZ-lyL{jgZ{+yXA^!{AJ z>p6b@mZ8hmojEn}srvC!(U{-wPPIzQEen;<yxA8vX}77M{@Uf&lh4`QVLEy0@0**p zdyn&9`rDUYdSJ=ZD{m$U?lw3vEB|*6<G$1T((6_8OfMLBevEOdnPb^_O`~30|KSO@ zMQMfhS0=ypoBdcP_UVz#4*jJ62VM7HRjHr&?zKsINlD@FjN<_l#nv(Nsb{a-!E)Q< zhE81Dt9P%t*y9h){(GqO$GqP=-M8k+thX**pC?(Eq_*;M`r5_Zrr&<CeUEEz&#l@2 zw|n~v;Yjzm`Z!6^`6{XF4oqHh^Vt7dN#g=7o#c#92YfF@<Q$R-coPz0dRyvk+A)2e zuiGXYJkkCoaAVH?EOo9^_YbW~W!pOE)-Lm}2gKJFXno`P;9u~z@S?f^%K`s{g-85@ zc%rn=J#4siqR1+C-MRm1Q+Z;vzs+d8eP~whHYw?_#*5Bj57vCBcVgHRq+FQkxXy$( z<YvRoHz^O2o#b!6E4calWfc1{4_2O>8Xa+Y@$A0u?W+En?4ipW!#Ep`1w43u&d<nk z?Pa~C-67?U?_L;{zkC18irq2Ia51k`vc<dC2@*wbUVNO8{oz&qhBGs^P7BlWl9D=Y zy{do1@`o{(b{>DTVp-qYysrAW8>MYmhX3ZAw0%nS%rN)I;`tX#6~bpOJbnGyM*RgL zL6dpAu3nj?S9$w+^M#fcQ%=rF&*og3bHyYxsw%h8w|o0a*5Vo5C+vTRT&Qxb|D)va z<8#0&sTogL^2&X-SYC_&)O<Wy_R%{t1@j+s*}C0$mrPp!bbWQItgQI;f{5d@bn4R* zmfy~bewEFA>S<eV!o^F;g@5PY-TALjm)o85<&(Jf!`Gar@A~8U<nq0*v8S_DEQCdT zxZ>XgY+2O)Q2zKq4vWu|z2}y#SG{u3`lr^ZW!qoPc*CQoZF+N#Sp;)d`^i(&X2$$V z((+$;<&}hT`k|9a2dZ)n6c}Zt%Z1~9zh9x$UcdM$!<^HHIt#wczgV})h0#KH>Z}8r zTeO1b{Wn^+_3oXrm2);<*mh9kf6lAwU;0UVz5Y%;9UVPIdSmyw;2qzuF>WrFj}Bs9 zllSV>om+4Djzzy*`TiZZ&5et9i#xtqOqDsW_R@5dlULlzl`Gb-&&)lOdvj;i^R~Ae z&+JOIoMm%%eoOt#$N%nLvf@iV!S;A-Q|c7Cg!xBb6gTYah$=GJym|A&ja$1`X6pZr z<<t|rA8@7Red5NJ?K5)4POaOVF;#7{&)GBHw_D{Lj9*lK-*xZfA;wLYGt1+azI9%; zic!i;t*g7U_h8hg^UQ`BH`6+^D`VPsr0C@Be9>*roS;1Cfqu?j$9nFP8P|K;oEBRZ zco+VA?fHLF`o3<D4-EcAS&KJKxOHJ(#frPZ_hZh5Y@ZsxAt1R<fOqbXc8mJZ1n&lG z&5d_BxI%P(B|X^t^^oPJKI4xwO{D&Amuhoov-x>?ThYpx6>`syCtNdoZ(1Gwt?1st zKN4>?23M}!JGUrGn}Inq(f(w2{e7t)jb}_}_bx42xpc{ygIvlrhd&<9ICQ{z|G6OU z+xHUhUBB45`O3fZGjEqCtPuU)`S;9Q>-za;_GT43r7#r-ZeLrcy*JJK)H9ZC*JoVX zIQQJCfVY!2@BDalHN#TPhja4gt>13ATszBe`{iB*--+2Lj_DN%zEb6NJ&>|MgwM4! zvwrE_<aEA+p{k|ZZcW;C!SDL)f+ylL&YO!qd9eKX#?yhKnITNJ5?eICu6w1mKic3f z|Ht2^<r9MS{vS!W6r!hV%39o3)?xf6XZgv+K1;9MXn7@JQllWWR$$f%uDzYpFMIqc zW|`~j5dQr9(R=l}RgYWPB&<K!uH5j+qAZU)J~j1W{o_M7Pi?mS=2yJp>e=u_w-?e~ zO#&t>=D)w2FS1Sb&5g5vexLZylq%cy>0v$7(x|xi)f@d-)b9%ktz-Xjs&%W7MW&vL zVDq-cb3J;wE(mYGSa9Nit^t>r6YJ-o=`6V}I#vzS&c_vV_gMz>&)?7KZctzGJnekt zuf^S`FD`y_{;)!Qy?K0<ox_ELVJE+9-;eqboZi<_el5N&d4u?T4s~Pg@7`spN=BBG zB8B#PPV;bAEsfc8`^EhCHrFnB%4gr%cJ2S71KKBMJye#synJ>0su1Nkra4O)ZmboZ zv8HwV`?A?#i+xv{&lJg0%kq8l%=MN7Yx`~ao`n~0-U)tYdtd=On^FA<mENeoTx%u0 z*wqi1h~=~i^&PS8-{19zx6q%ttX%2-joFO*Vx4wBS^V_*A&D!c^2W{ePtNN-_{Qlc ze7OC=j{JujWp&Le{<gW7t&U~f*jcL9+jLYs@$%h`mt;S#U3Yi=@AG|T6%TtHI|ZlB z<rd&6Z+Ckr9iH{|j9{r#?4{Zz_1$*@PAC;67|&dE@ztXY)onUb*5QZDs?PfAuKib{ zfAr2;=E|Fr3l5#U{X4-zyZEi=o5c$``Wh}jRQWcK^Rm|6=?9vg9z6K%plQUn^LMH~ zhd)+*$T>y-|3Z%C2Pd~PvCP(wXKHX>8nr$7aTr_cVqNI~<D`|L>#m9hp4s%vJZ$Ra z`fEb>_!>f=r+l7W7Sp8jHF38A@3q5D$DTf_Jac*fo+s{m84ocZDmxi(yfEXSsarcM zJ418q$$2&B{#~ic%DZzQcm>x}BQBkTZd@Ov+;85T94pIHBdJ%-KkcyVj_7-O-#^6t zu;#B3&Yt@?==)lR`^V1zoy^~S>Bz%prOAyZh30eX&s5HiextsoIx^r=sNdZFd)pV! zYUHo7|Mw#K)#29nKbCu3`+cV4+us>SzyH79vx7t0!=ocVB)3EVf=XuUny^)U=NHCV zsayX{JpJ7-ZJmJr$;*qcW~du`{xMrqwB?qrpWT(5d`8nRH{Tz)Eb%6?{AJp!s|<?K z91~@tv!>_upT1WwaehwN`&AzQ%}*|2D=++aZ|{{$+{f#DrkgY`vf6fGLbQgoiN;mm zRM{I5-%jq`7wN0C<Ec)Mm9WAU=c!NJeBM9vdZwvA^Ua;Gy4GE_kIx-9;8^fb^Qgl8 z3C9W~R2&kIym@!f@1sSJ>d%9Yt--7f7dfU#r5%6$Wa*Dqh5lof<~;S^iyUu0d(juM z&1`kl|GaZE_Y~T?UfpQDVy3>W;peBSvG;eL@!iJORzATmM`FsHl?=!Ek4{okUTzqa zCGMv^PruY~@86V?;QUX#QhjZQA0GZ7SU+#q(+`h+p0-@XzwYo<cczy1hdd|Ws!ol* z>$6Mu;6-oKYq5JO4`};uGv;K|yISv{`POybuT`(UIUD{CU$o$e=k7<@Py9rKLjxAq zJB#jculEu3T$*mz+@_kN_deLD{p<r?hpW#lyG%E>o#+Vee1B*|v%!NU^{W`398x^r z`B}-r(}PE#W}l}J`@Y((C#S@pIg;`wYH#m3vni!gH*4M2na;Ym!&KF9;@#q|lB`1Y z`m>Ery2iY&6RVcW`|#%No@*1|ID5v#zvk8T?%}t$ynLF|cX{gTrP<kY!r1%XotSb} zQkv=cg7767Yoz2=wr@OqujItpEr&0x4&Xd~_{M=#RSDmw&kDS!V)O9lw<3RM1DR5` zd3)pv)lwLOf694=o5?h`>EGU&I(<sx-S>w+&NJIpe{{89;f8374ct6^zFt)aZf=%7 zwfOoO56Av<DbE&c+?jFEEz8w3Z1O{&6P7%GGb}{y4lcTwvCw5@_pI+mdkvSbe}7ro zfY+`_a!-uR^tPr{=|90)YreCjCB}J7-g4mSlAEk&cHIB|`G13_&U1&xdA$w~{{>{T zFYg!g5tCzQUM^R^HoM{R%d$dSgN)KT<2U&?zD@p^)tjZa_DAOr*&9x?9;)<}?0kQ& zS>(|lrh735p3MraQ4MXfb{2p9eaE-7=+47Eug`I>dTGsGvVLinnIw0FpQjdk`n+jg z|2bY;tvfO^ZU^J$D;haT`}eN?Gb4CPm71%dbt!9XL`uH&t+trP<Mk)|>t?#_)p*yo z+2h`s-Hc_MMRyvNnr-9Wm?35v{%3RWKFzouz6m$>X!Bh8wrqv@eoL<TIv>*~-(l|L zS9opvywOwcqWrA&Cbh42{wY)5Chy)Vc5<n2dfMUxn!?ZWvb8eq)Ngp);r=pIatoWR zn%|wuo81+EsyIC_mAqNIdi~$$_1EvqSj^bF#iLj0VvSn#ob?Ca=N&$ELq%^t!?S0a z>2B*&x2vr=-?!8}C-;AYEgxT#?M>BJx(a)KY~8nY`-A3!H}MZv)Sfb4zjZ^vmj6$} z-}9<nt=!HYR*}%JE@5|{rP-z+DEQZHMSCs=JM)wY4fCtaMP1f*EeIB#yUpjC=-j;e z(+j>HJ+LCNzxG?A{(^P;HZI?@aMePsFL#A&_y3;rOY6_xn;ECNGoE+dO}$iWzU$$Q z+O4bh+RL6@l>Vl*X5qw1YKsyd?mTvCRr$U4><2gQHSdl;^L*a@Egd(vCH>phbI9S# zmCc+Pt7ZjRH=I2?`|ggD#bMjFT-d>S`s1dZzGr{_eo;RmF`!03ukeSv{fsXf>pAjv zOMK`S_4R+a<jX4)<AnOxu9mFJlhYQ<dzdKYo;q^!%dN9_x4&MycAM3={zFUZ7q-u} zIxt~Y%7kc-g@NYN|I3A6G<c)pRyFhf;s3Ff>yCfxW?Z{F`_Qtvt1RUdzWh79^p5Hc zRlH@!kN<{S;`T~mMJgpQl73WJy5d6%b0)bo~?uc*HL>w9fv{k+mE)2CFfcz5P+ zbeh^i&0X=wgmwFl>EB=EefO8oOfBbqZNBqj_h?R=RciIw<Gh`Jxwi1@d)oKEufEH2 zOmO2_rTb!ECLBq;cH87j|H-7aZp$A=@P;qie0g8W#>0ulGuYd6i|!ZC;HdxiV779h zCPTue%RAS6F)3zSE6udKW$VmuMVV8af>W*-zc|8hLnEZ{YRqLxyDg8@bIR3=JWqN) zn{u$b;OB0>=q;II+v*><8=cQFn{qKVjXUqyga1PJzRTr(*q6y&`jKy6m(-mgUM8!* zAzuqEeuXtm(C(Qgb6WHC>8VfCR-Ua|Q_uMI<+LA6TFKU0uFB@3vTy2E|Ly)|+_U(h z-N!CR#x@pB)0bI}{B!C#{@pmy^HVYJ#TEOSF8|!?(Iq{Br(3;)&jv*;XQ<TLee#%< z&)s8pr#LM)%8&@LnxHCfG5PqG=SuRgO76-gJq&)oEdKP7&Xv-$-b^c<mht)Qno7+~ zlMJ7FndU9bf|gAeL(;P<X7iWse7ESSJjdnJmp+zO9eq%-;*G+ElutR2`<0CP+1t46 zV?-s^g&hpFPEancOjxtvZCSv}l!vSjv%a&>y=GOsqPF0W@v-B7SRO`)9=Eq-ot|{s zl*vm)l)dV~l)6{>iITHr!X(bGnXaCH*X6fh?l$wOvi0e=A6Q)4cD!~&ibniaqcf5d zJ>0T_eP>Fo(s;V_YxWfNTl`^j^M21+X^~KRSNzxRbj|Im0m1es?5^F&d;LBkZoT#5 z>_zL#_7?B#{JZpROoVdb%Eqj{2cKRv(%^_|)IV@y`+AwJWiy;*_Z)q>WKPz-6DdoI zUVh;*wv<qj-Z1+{RQ=+`5sso7Tp?a;XC1ts9X1K~?OlAXru^U2e&NYe8a5jXrY|pB z@o9Bml<3Z~Z|7IYsw%vFl{&F4M=vBb=y4fa`@WXUoP*c)@<x9@7`v~FeNEf>EpHZT zX|H+{!F2u5mGgq`pXNw<FOHkLIr#hvAGfVl1)j%$i2qvq`w#cu-Of7O>uc_(uGn>H zma<hD@4P)#=M}gMepaQetciXiX604BV%N2cQB^H#|M%<(d%W|S|MV+Oi?Yn3!{<!@ zyjlNEcggZxzfM2>lv`6Yf16znHd}l_#{S2QXl?HstG~AM%P)HUntNN?$|Mub9Ftk@ zYMQC9%P;)O37B`hO7>gZrGrm>-TcbxtIizU^Nx9~uWhN%vc-k&_J7YBO1wH)uH(Af z=J-APSNT0nh8N%3@%6QT;q;eMjpx3yx5aFRLidHlJ3o)CiT?iIEj543mC!JwRdc(1 zJ7+VMtEit4ep!+kxqKS0W$BGG$*aQ`>YTrLtRUO0^sU{uzjOE3+-%tTGke2z@rK(y zw*%_cH}3fJ`$W9i8aKcB*#WGJ4z#>@ezDkOmX?@T?O~7EccUIHlCcUnz|$jo+E?vO zvC>7aNtb7pBwTntg{gRJ@6T;p-`85Sw)J<jd)2FWqzVQkm}f9g?fEdHp8J*jN>2Y3 zzc#*_R;~5R^$@p#&!Y=7O}*xDx}{}4yCtJJH$Fq#yFOievZ#Zj^wfsSn_}Cms;YN0 z@Bj0}jAzZVKifi5jYP9&=DuuowJd2owNJf&t-i)5mCN0Wmp@N>u;I;&*syI!@5Vh| zY8#p*Yc@Yt@4-UjATI7uEfYpxiR~pX`&y;Engh!i_gy(>5@PZ;e|c=G!p^>_p;Mo~ zUHZR3sO<`W+3%wI`$}g-8kaw;%t=UkuzAw8?|g?@<AcsJv@H}^!X@7kvuBqP&m{Bp z^PBkRrG<rimWjS|`EvQox+#5|&Fvb}@9j7>@2y45eLr(q&8oUz+ABh)zm`AqV9v^Y zMVFO(z8_kCFaIOU@_6R!iC1T*uWSEP@o1jo+4ZHHZbjv;P0BxTddcN_dBG(D)>f6< zH=BRR_P=RqF>Bom_RQ)VB73#=&d@3oyK?>d^)0bZNfSDccqa+WJ@>@#@7Hrh7Y}&2 zR(uqTEz9U~+xT_=JDr&m^q%H_o3^GtpVRz)^8Y`R&p2A9zB~2u?#0vbPYZngKA5LF zpZjyZUP?XXnc)lt!|005_daUPG2*MwINi<lS!74$MG>nI)nDraKUgToCvCZ;y0ol) z>fZFg`t%PH&bNO}IREee`q$3K?lwMG5$(EkXwf320}DDcxK>{KQGQ8k`L-ijn<I31 zYQ)$kf16|!&T4w>f8l<1R;!Fp$t;d%KGqlHCvDgh7V)NO=Cf5%hQ?VHOH49UII0d< zzf%0cY<lC^<7Jm`#lCye+;r=Q)}05_KGaC&^Gf}#XOvZ+w0gRtIFksY`E<kcQmWJQ z^kf~U3wcYaPM=mPt2g~-k}UUjUVYg!#?u)EWUZ%*B+E+Gzn1NbYF#E#R`C6k^P!f1 z3^O~q7Hw#JAYpHo(D~5)`n_9DJ8!>RCz)Wj>{8m@t=s!H9^AGgu-YN_hR?B042l_I ze~-&cI5200c&N2W2%GAhKfAi~`j6?I=jG4;-sitBf8L(?&(De<=U_TqSo84SE8VZw z+TkJjw^e06ew42Dy`)vYK3iP8$E_wQFkq?v1#vAiw{(NKM@x6PxQo>aChBaC)Vtkr z$TK;q@oW43chTZW67y<S&DdNlcUx?>^rG9_wp7S%vF#32mFPQrI3tI1n+)@u1K$6) zKg?!a*mzs$L4~D`eDvFIRo8PwX7zPGOz?19z4zYpaIw$b8O_qUUw`s**Xv$-Xz=MH z<Cd$v+ja)_UPuZ%oU!x3Vm7@e-6l#41+Nx<)zB(j)Y7y_Aa~NKyDRiWrUi5>$hke! zDiS=WUdSl&lzC3a6M=TK_v_X=&t{2pyP9Z!+*_t-r@$l&zSfkTFID^9``GR_NqjMx zC3RBxXShmb*Y}v&+pb^PxoUgPnpG?7*A|_2Prahip>g2kz5<t`|Ie?QHdP!EKX@i0 zp{SCvTJm<o)nvu)&Qm>+H`XYbFl8Gzo>c9dB&%9;vb^Bry7LFDc<b^Gx*y;+EjX~~ z{@mq(Ti-8nza8;7w6?v}K<s_q@@V0W+bps}M8dY3%ifQlJ3~KcrH|gsh4pVXWKGe( zYFJ;iYmK{SuaDsab>pqq=1trDFk+@aNT0Ei>DnmwV?uKyuURlu&pB51N$|*;vcK~d z9gLRb$g-GH$NBNS?yt&(Iq`c8cP{JSY5U>iRR7a<tAE`&Aero<lD{mOH>Yul)T52p zB?Z+qH{AL4N^G}C(7A-qZK^$v2ckX|Maibtsmk-Msh@l!QTgee`i#xfHPxL9zZ!8{ zKd^lDul1|lHM`CJC%MHRM#-&v_WaN*&Ho}5CJ`$wU!{w^%(r6gh~hR^j{Fq2%JziV zxxj-izqNZ@tZpe!SsWz$H%xM|?9Y$wUdP*W{t0Xiva~+s^j!JXcH@a$Va?xNHa&7# zGN;hd{AEF$*W6w8#}3p8*@%}*XI#j6mvc2?FWdF4JI&<|9BHmCmznxYf5X+4ft}9( z&ZSxH2o7{!W8ri6ZPxeA?i$BMBPaebx-7;!|H(_K<d>=(%?#RlG5>!p-`kelVLQ|7 zSXJin$D6&XI$BGwEV%T!Y>n~9Z@YaK+_Sp3Lp|7C`sp#7#a9X>pBmI3-_TtCW%idR z61S^<HG9a{M!l3wIOx?|T3UbPMq<##FAbK0uliWo&dv{z^!MLj<><TQ@^;ByqYl32 zfVE1c*0S~|#5i6h*u-V_Nt{_E`%dHXk1tzTo#d^HgQh)K?R>sDNN@VtXA-~9u&S<? zu9T^p-}I&-by?*4ayiq;|9^QZ>#uY~nF?L|#y`J3^h<!B=a)@0`JT4Kgq;XVTv}@Q zxPQW{AM&R{f4!RTb=+e1_u%fS{{+L%2ff!$H`1E?>a3=-NyT|n>FnQ;)fcnpUCX>} zblGS_*P_}v^QF(esQr83OKG~tvMDQsbNn^7-Hdv9<xS5lAGP3<!7IP?#?AJ9EoXO~ zZ~3aM@ad~=&HKZCec|64aPh@tVKQAYicxj?yL4Hz>71po6)^D`pcOE|;oJOqJj+ab z*JfJzELE3`md$2m&2nG0R^gg?Xk*gqPaFaYHbTBl5)PaXMK_(`c5-l0un}oy^>Ufu z)!4Q5npNqoOSi15vbR2X@iwAr>+c62zs;82c{%^tz5IW>?wdbXvHtljdF|KVYxmau zmN7ehy!~j}X4Q$(hY!cy|M4iTerDLho&eR;S5I-wG&^e_G;h{i&EV?gISc;2NOyF& zDAGM`!^@q<8Jg|iz9yD&TF5n?*LVN(j`L62|0myn=)T*mBlf%b=Do64p8F%8HdQ`Z zAD~uo@3yh#jPsAqCTxt{w<bOEbEM-N@tfNJTQ6@&30+j<yeVd7Xhx}F(N?#GL0-)D z%udr<TUM97zS4EYWUWa?X2OL1_L=dMmaVvQ$$i?A%gdI;MPJgrn7y>q>g6kjmu`_k zZCdV=7e?sZl~U-vw5s^&OwXOWcvkw%eDn6^stKC%z24$N_MM+hBGbA;rYiML+pl`| zn!xu<AzQVow?AuT$Sj%Vq<l7TrSXy{;kxIioHnWdl#;n^(vGQFm!DiJ&3AM4zP@To z)XOy2Nii!YdjI{qRBC6;tYuf<)uo;k$}P)k@S3|zrPb%6&dE9R7DqmceYU^swDiS) zv&~!f|8u+Yn(<ccE%zOho<_}73KsrQ|6$_^)7f8HUVC1Xnbz@D#QRLutgq6C-sVT1 z-=J~L>sq$mjpvH>-#ypKe~)};Q+HfPxjn#NFMis3b56T8m1`=lnZLQek^fwT;o`2% zZN|@pUlq5mem3vHy{BiN$3CC$A}xR0^7GD_wwsk$^$nAqo@wtmzprk7^WyfSZ)b@u z4O$$i6>akNt*-9dDFp{-%GE4vcg~+3)HRo_eV&m+;mVC1hLiWZ6#LdcO=u~)V9n!K z;IQ;;Q0s>$%^7*Ek~#@)hgff}(~KA2{ak9@u44;@KZqyo2&z)e)%oUkLQyiO@oKdY zv(dF_`?$0fu1HlRT|F7T?}R092Ft#zSG(^Pp8RH7(>(2ZhoZ=}m*!9P`_6PVr`)); zYWHG$cHs|-F%8|J%DffVruT(8)E|GiXkB7rsmPk9vqwyKyv#F~elPd<LVd-pxd-`8 ztaht@iLB$Eu{Gq#vV;>1Q%>fqgtgteaM-GD)kcL0r%pU6joQb|zjJ@H-{R|MQfuDd z>wjn2{Jr4Mj$NT8{dL0Y#a34?jXe6X_2*GnX$5J4&2sPl9}&G+p}Fi_?}6Bs%EoYs zdd0)M(Ly4o9MgWCn<bpPYn#ccjt!|Mru9abYQ>H{e4;JDq<t?=QnqnMhT7cK*C!|P zF8XP6=+4FU2JH6t+kV>5%b$C>yEbm#5pA`wzbcEqmgvN(wymDMziu68r^L0Z%IW`I zDt1ZLJUhy|dfOVW^0(RL=DTjOmpj@$wX5B@joYvO0Q*e=4%Vl)za2?`8zOOanbPEC zdnCGij;d+6{PJ3{{8z=I_Ft>-zK%=yb4}~9DyKly{BMcrD{r&DU$pLSub1z!e?OLP zH%l;UZGHTBvXK74ACgWVKBUW7F}HWz-M_qC$m(rnO1s3u6%2;Y<+K!p%^CI_@zuTF z9$0N$sjlOE!MpxlqD7+1yS;xl6s1ppV*O8Q`wT-SvrGMjdry4qk^hh;{_pHo%jWvK zFOU7s>#9>*bG+;0nhCpkx^HoER<6wC$bW7=O-BD6LrePq%stogwupK+?9elPCQ<fe zO}k3R+B;W6QZ$(vLO5J2g`Szjv%9jd^fHKEQ}%q}yNULP1-2XutAEM2bjIX|xgO2B zQZv;oQ~h-oTotgK^LydZ6hlkKPC1$N`MH@VbA9j650lyb=91DI<%1cY_{2Q-Fkb#V zYkhCE$1JsiM@Npmcjfo!5;_tgQquk~;I+cjwR7gKXzhRdqjTN&m0~Y+3pFRaNURe& zlDh55Za&%KFLS!<^DRG%7*7|hH?E%H)^qL7q=a*C_b0@6zHm%vl_)!Od*{l?=p^s0 z8zeWKn|kFX+XF6{w)NKU>iF9qi0n|l@KB_JyKI7O_AT%D{dXoFw!0j4wW_Yk`Sr4z zqdt=Tf=-pWk<3BPR+DdV#hg|=etfIx)Nkt-PAizf(!(!&gg52cGGn0`{u15RrCjyD zR<Hd2^F!m)=2e2(pAWvSeJ(h!TX|=nl!5c)?Fah(&Z_NT-&(t4t-rN~l<JA_u7%$B z_21vUJ|%qb$!3@7_V4X%S;Q~8TzGNm{(d1bhsJX<*LR<eys$R!tm~rLx2K$5l%V+Q z?vr2DBG2ya`?lGoq>^`@h;z!PbGn%wm5;d0zeUvFv<~RE`?ch|@vCm`+lN&b&GzL# z`e?(2w~D6^osVDqAm?~%KKlu`imBBl_Z`IceAL*ouJeD!via%{Yxfs2srxT~x=LcV z#J}Z^AtrAws2)*0mYM1jH$y#tPebhkWs8fqYs6AN%w#@)G;eXyL*LKu$|t;dzHimH zs_o14to2V%*i%=p@-doIELri}VaZ9V!jGPIxgHFWJL2^0c*^`2yAlQb4s-CBl*&ui zY~MEd$+I1c?AECr-X)ndQQ-fzW@ei=D@AI`qx}ERK7Lu6r)qth*Rl$m<%b_mF)+0I zU)1x$H2I@V#G9GTl@)Tv=aqknS<kqWnY_qbkzXwSY3IJLeqX<NNYp>n{~7UP|MXoS z_Ncr+^t8wIkHUPxPxYnByGp)JKdN}-(0W@Z85gg=i@3k<cz)q~{?eZAJYUI|aUXBA zarZPN<$d}l>eP3Sk$1_jSqt|4DcE_Kg?+)96cZuAif0e4?;LvaY0=b%qUFzJr#;Y| z_rhJKCH>J%dyfa7bJN8wFV>shk*;sP?NO4wGE`<yj-m3B8LS0z;RUjD(@uMCvOl^< z+Bf>K>LU5YGxU#gH;Wk>YaZ+0K3^lv(>1YmBh#uq>3wevcC}c4Fne$>lfzqKqkGEk zk9Fp@_s`17ESK&tUZ%CotW)>tRJKzbYLnyo<LY~}EhK)c9#%A3m$=FE=TqZ@GY)^K z|9E<m-HY;)tGs4rCbD@YD{cp^I>?r$-EcGJ@4B^|rZLZ=Ugv(jR+V1gTDgVk<{VMp zsY|aZb&741+InQ(l|!Z?0vAFbC_RyBe)h?1@mY@(hA$p-1&5sBd6ro#wTI)g8{_Zh z-BRs$4*M^j=>Pxo;{AtIYJNx=a7^lPS-kK9XIN1EvVI1xnE`vdzm-3n68G(Z<(mI< zoY^1yeXKaMR5V0KMQgLsMG3iwOcwkBQ4z6QmhU;S#JrJD)MCLq+u}k+)}w5$FXKcG z)g0EX*sa5V>B6Ij9fp(oZ~kEYV<UP`y>0DFo_KZtc=_40c(^?5nUXIs@V48zt>avG zmo=^Z^B48MrS-WNSlu@z2;aPZT<++Ry!_?I&s~j`usAexSLb};@X3c8v{W|5%$hGh zd83+C(ZU^4vld>x_^7~?=W7yQ&mncsy$c(h9<Kc{MIw0ZN7>NsU7ClNskvY4^WAyt zQsB*v7C~{pC-GV>@wVPDHKQhxSMY1riWM7nzp~G+S>NrE5G!~hv3`AEeS-C^V^0cu zf2u}lu-<iamc4S|;i^-|xQfp<>=oU)PyOTV*llSc)+g2$^Y`Cxt1DRIV6~z<)HTxM zs6t+1*UBRk;-)1B{JGmA{bp^b><byahf!JW8yPk~RIw19z%|jRZMtysg()u;+26kM zk^bRr9v9%s>0AGtncx4jWBsrC^EFS_c=zA>c)o_``y<JgetWfwLyUj<e;IeayW#$V zyR@?FZ}h@9@&^}Ze(6=Y%5va8ckL0rXDj!xG+zs0_*H-8;Ez|ahs{46+8Dgf(s?^y z&m-5xhSOcYzkE7F?7RA$h@(H2o#|ix;OfRd--H&`JGVMlb+p;uvNvG5!N0z-?8n{u zOV^SML`<JweRFs6R&%`~lb2R?JK62;`8!_UcdcpGUH7TmD%geY`mgm`rSfpg_L>sr zsKgCB^deJFoovh5a)09cMKQWxZG{wdOWz$mD)%XI{>KaU6&C!5Hn{S9Gm2hmxk>Tf z<Xh`s-MXDFp;0apD%K>&!**$g)~SOntCDAx%S^A|8In6I*|Njqb(^`nUYv~NPK}Qr z>ZYDni7Tk6DERRFq4}Ps*;6;WPhRUaJ+oZon7~#Aw`KE7S1(+3=}iHT$yeF8PO*P$ z=Urr*eKU*MdS&y4$?yI5+;`je##r}D2zR=dTfRv6v|C*(g*3Fa_0Mwmo{yNHtza7I zGS4E(TG(pa_xhaIeF}kMGq`#(D*duT{1~*Ji{JLr*0jE{Ms%BV{I}9S8}B8qTU9V& z@zao7Cwmq?*{u28Gc8+dj#$asjjw$k>mJdl{U@8(a?kv@`iq@StWTcyi$1FrJTuSu z>Iad(%@(&^+pj09TJ(RKafHjx^s;)CYQ>r$17ViUHpa1hv#&-;CvWCvnHMSd+i~^T zysfw1P7OQwSV7<)Z=}|rTj0*i^ny}Zwds1LvQA8v2GbkcxK*c5FO}7qE<Zz-XZ!h5 z*+8Y~dMhA38e>ND>G3mU)#~-aF0Rs$a|nr<pt`2fL1<b_i-VBIjC>&lMV&<c#QT8) z%2Cm4!?Lqi-}O7c_tw03SHJzTe*Vhb;^*9A^#!r#a;wk%{Q9K-<R7*7KKtHR-uqrT zzr3QOpa0O~kI&q5@9xM8{<3)C?L$jnZj{sxXW6SVRV63vh*!{~z5Ck@KhI=6P~V@x z(V|$%W7jMAab~66k>$}p3hTemKBo8a@%*o!KU&<_{F#;e+3zQdxdmFnO-@(WB=gOA zxqX85?CDRo->81L<i2x9!*Ssx?&<e_{nr2ca2HGFoQmQm3+IW80@iWGZG6=E^^(t0 z9aYUp#i*@GM<4fB_Mh*F;}Xm5?De1g?9}C;dY6rooQrf1F3LT)=<TJLcUfH-GfkXD z)cyLVs&p;sT;%aFFK}Co&gAY%DVN^({5*Vc(TOJ_J2k?!yoC$z8*Oxv(H2+l*kmkp z#Au>Yq|U7^#!5k30%t80XkB)s+xSURV88?q74dG@lU%OPW<5PEdeie@P~@dgE_!bJ zVvIyp;@{Qp)z3)2@$JNd3uj+DZ*y;9(f%Z|$YrI^6os%O%RHVOw9k=xXlG$0AK9Vf zB<CpS+BEU$39ToYDZHO_J}G??+9X&hd9x|U)oEhx3Hb>gPZWf@k0@$(uz0#J@!*?u z+`ZyndWXP8lXqv>S3Y0+V6U}q-mU9@-u@}C?W)OJROUG2L4E)CGdq``Gr#x!ZMF5X z?6fs=3U9to+`roR`!Dw2^0U6)Sks@L{rt?V;*583H(uKpa_@NPoaZ*_bT$9A59)no zT+$&9z9JkYKO3%1jxu(gZe?aXufc5c$w__b;*2wAefeN>UtEiO>g$yby<8~_3vyI; z|JJp2Zue>4v6i#MOrvpLJ&Wg-J(GUucPtLjE!d!RWyW;Zr;lz1mv5PHyf6CL@jJ^5 z@7!as^1Q|*+?un6VO{Ip751NJ)-`ZSJc!+WG(BR6Pee4sm7=amk{uy?KOGf`$=+Zo zeRkU>t53NvTu#dzh-tG7?G2jh6(8X6Wtr-f^oMV5Eqx;;mYg2b`}+fLxqouK_RKpL z)9ib8$JY9qrrh>8yV9uV>U+^P`JPbk0#~oMFT;O7T(gSrQ`P<KKC?ahm96)6-8m>W zO{$^u68kUzJ?9cl%@|(a-P36xabSK%%gsanPJH&+st=mBZU6Vj@Y`GAc5$J3H<_ji zrD(ivY|ar3*%}yPdQ$Jxp5!Y5QzmgO*;4;=irD#ohHa5L4G-fFvhP#8e#pN?|4q$= zxsDr_Jdjxu=q~A7{`do<<K@Z^Jdy|F1lHX>elFp;(3@taxr`UsJ{j3G9h%N^u3Mqw zOS+Z1V{@W<#f9fmQwnc<J!q&n=i`@$;(RJv-Jd#*HwY{}eOB~o#NtVp0$8k9OXw~s za%5YUQ_nE<D({`B&ZF~=2gVAW&^mNuX1K8aVex&BH8>S+D10+~_-KjjE}I(Z9Rat) zFNS?*%aq=*Yt7wjW(nKEe}3B{Tg3bDoSpBFb17wE3#WXUzhgy_KgS)LA0|hB3db8f zJQN)8Fm*Lg!qzCgv-9q>#PQVfohZ0=c3rZj+05P+Z|4V_>c9VcV)I?_=gFhf&TAX$ zf6bD;Fq5O~Y23GevDqKDT<AJ%_~f5p!8%Fl;)5s7D>%i}KHv2^_s{Re=UFGdT$aSV zY#o!Yo^ghj`nyAicC%I*2>tpz^PYd}wma99CJRdN9C=mh-5}LJrDVR`yM}*n*H4(< ze%^A|hgD@-+b7;xyyV+#gZiz$Mn;#e+FQvP@0!J1KcTj3?|;eflM6C$TNYnlePs37 z!-ucV_@B$NW9IptS2S8b|JeTi={GLt8#|xhyxDU6{e2$}dB&W^en(*&hfSZ^TCI=1 zIsH3cCG35a>}HYplJ<%n9Xo5(?e~es>{3i;KC#>N@zej$bR#&ne^$S6e~qk0QhnU- z<v#_EE?X>{>6zN~zrwMyv+*JGhn0+SbJzqk_I=>KlkuUW=bo|N>w;AIN{<3DH)fAH zy%G_}pPuIV#%MOf^<JIixtDgynKq7ofg1(4afxsCZ+`3Ywy-)py+1$x_{3dyHAiO7 zJeIg+hONPYIi=1w8T9$jwTM6TvAb-4P<&VY_pdo=>FFEx+_iH0X|U^$yPchAOT{x0 z*QsJ+Z#Y9{n*^@3IKeI@eK9)!^}55iilr}4o}_Ac@%ZKQJaL(Ar|-C&&8S@b_C(~5 zK!!PLEAnSdapv9Wkx;z-(9dg8_h%Kkm+Hoac}r%U%vl?xchqS1r(M6;cOB#SfBXB& zI|b`!&#bNAp7oDyb&Ke+S2ap{$3&zh^E!`gt-Nzc%0c(0`U*R?uHLSx%an|qwwjho z@2f2@&Q_awah~-LHM47MhyVRn`*?Jz^g8Yz@or)Ee#>U|{F*OvZ2h%If@QYZDXKXV zF+2F!_I_NL{KqutqM6e6M^~Sn%Hn?6CO9q1c*CW}XREXVTI;u8EBtkK<4HyC>pTXV z*(=ibtax`ztA#_jY1&mr=@}u<&m3}^+m~_PW3&3hH=p}AoZoPWUH|>BMayqryWzgd zY{9`#AA06iEIX8RanjkZ*S1NWnR;Ev)9;kUhPTOoe-}L4DqNqZxb5KCLn(Lr{#Jin zG3n#9>%ShJxmEYc>piF5;ayerpORPYoVupz_5O#oto<KnN`7eAu;$#g)Ps9u1afvc zcum#n@;ntFl7HxvR6}!vW|Q8nOHq!$oYOYd*)@1SKh%&Ndi~w+j)U*6_{VW-7zjoF zI&=KcM<Lma6&rVD82@CwvQV^CY&Ns?*4^dL7iEZ@zj%egJ=t=Frt+<vxA*5AJFQ*c zxaokxVy}}^*YN3{Gk<wC;z;L}@c&kPAJZP$1?o=Lcyr=q=k59r2|iJ)OHSAprA+xT zb5i`SQ10}PGe6sh6-{frvGCm8*)6ZR&e$@T+^q80d^cx%vb^2Pn0#fnTff-OZh7A> z?rv$hErfY(YmfFxFVCYXy_R?9y3e}*>QYa;yGy-#&MmJa$5)vYeJy?Vuc3Y!)0?F8 z?kfU$y}WlE*SJ0VcDB{34#ORiZ?!C^%ePK#5DHcdT(#JXYvYE=8^!a!98NVmBro^; z8>9b+eR~eJhu7~H+34gin{|f0Eh*>q%`3r^cRBmK?EC-r`tmQ|eQz9}|327$W74S; z8x}I{oOkNlgg5oy=RLdXBYP`N$1MHPn{)9OQYJp%66h;w+|BIGUF>6IGr!v)%H->l z2a2aJeCWvJ*lt>MbPbc#I{RBsRbme82#oqL^*OW2@t}422V+Ic+UKT-8Qi}h;$7kQ zuj!C@$kdRD?#FfCB_H=a{^6AMdF9Qlt}CA<$>^o%O|#6{by23GuiowT>%FC=)rUiV z&+^!DZ2#OJ+COjP<gb3IoXvjx!I#T7rpm@<&%Y}_dy-SljJ-@x9$3ykc<k(xmv=V2 zGO3xbqq@D}OqXtlLDIdL+@+b*r@q)~T63X2Jo;<bo}j&k^Y0wsyQ>&|X;tpFzFF}r z75B6)xm@+?wf@IIg>#c7LtEKTM%0(-M(OBxnfn|I<)1!(h2p&i5%Kb0ul3a)ANsa= z^AvWExo1MYTt4!BzwLYWT{C9Nq;B6TlN@T5tvFF4Ur7B(<dGeA<&zfNI>i|9L`nXO z&1tC_6<hq=FUDx!`lej}wka?mi)m@qDVI&3Z5RKSYv(sud*SWQhE=&HSDUO)GcIQ- zsOKzhU3~CTq+rCm9A>jUWs^ENle##c{mlN;DgHlHP3@xkzs)cHORXx;-F*F(g<}8t z8dmn!`kMuf*;6li-%P)0*{z@3X#8NFbOG;^m?y$-gb!Wl>9}&Y;?uof-iLE9950<@ zbH8%ccb0qgK3f$PyT49!t*m90e%kir%01ILtN;9}U$^?sK7Cz(zc0^aS9t#r|9;Hx z`;x_3%C1WvXXOc8xYezFvQN%C{eQzs{_RDJo%eR>T`Jh@&S=Rr-+ieqvzt2K^?&@^ z6ME)+S<t`4W!2^nDVe7iI!*e#IZb=Rg>45eFIMh*H-Dyo+p3d^*NU|HzE<rs{_y_L zWNY>~q4(N06%$_6haI(ET+c2ozL2{#tf%&aUffl$r{)uX7q5tTyksBW*RKV!HBAqC z-ha8cGoXgs?e3Y~mGMT88&eOZ8BDWq^I%iGwzhQkE9Q{Y-C5_7-TCXeE9K{SMR+}t zcsl3i8n)7NC;!#(xGkC{bt~tf4C{g&909+SlEQhoG;U=mR!vTRb*R3;?1`kAhQ`Tx z*XB5u9hcLRx?U!EW`X<j>iC}<&aJ)M@wP8jP^|Xn#cTi98e5-|Vaa6_J&?W9v@2*r zxYL`&?+ZgXQyFF~6Pt1~^H!K=$!;N)=W!o>UsuL{G~{!(YhL}pgzwy+l~;bX82d)A z|14=3qnl&+MYT*w(l4@d%3brl^-AZ=Iv773pZ$$dp<F0Q)WfK7#*^JK&AyM<yM9?$ zt7jR!RwZcZ&Oo6zEB!<79zCM%s^0yr_`A)iNvyves<jfg_L#^WZM&4S>d2Fx7Z<oa zuUp?+(jKQ8Cz)e)zx$`LQ=Xtk`h=p&_(SYJ&Rj0<GMK&S)7K-LZe*m2t-E|FHrTfQ zX>A41-^mA7FPbd1+wsB=!>ruZR!Or>lvy7=s*O_WjBQ#cs1aJe<;f<6mbW`ECpq~q zpVRt%59`S)zjXmqXYV{&xrxVu{~zzSPx<Np7KC$7uA15)UAHX!w2jgfQB`}9Q+|gp z2e18lbIFy=H)V;nPkFEDJ!1R(;e6@7WgGTP=($&)duy}xsZH$qr+&BJ`!eCV;Fc=^ zN~a&SZOS)0q*`#iyx<?Nc;VcGb)G9Kf@2(Q)kC`LHoxD;yj$(~^P)A;adU$w1nhD5 z&Pn;*<8?}7Dw|kF%FmZS<^`3XzPayw^!dqC*L`~R>%N(_Wt8W}HlOOCU3N^-g^EAD zj(hyPSor8aKUe)f;q9l2)WrOqs#x<H%>KPq;R}l1xVOQ>-_-NS$7x4)PY8?Jr5USz zQtrD-UgD(-n~vq(YBay=n)_ZZxa3UT>4PiV9-1BtWvUik@FvAqllRQ4)${hVrA%#{ z6u0Ln-<&%&rtLphEt<6K>@$b(zZS9W*G+tWT{n*Vzw1?B-MKZpj@74sVS8x$?BDzc z!7|RSq5`jPCQiP#!f!gO)R&^EPrg4aUa|SwJB6@kxzYb@)&*bKx^v0lTUTvbcs+AY z{n&D)IZ!?LUVE|P|J|?G&e@lpUG!k>!tR|m$2jFhtxOyiYq7Pex|BW1d!?BboOvM5 zvHSAVs_$Q&ZIAPB-~Mx+UFj#Mx%JoYKYtz+GO;lr>nUee%(Tk^^PR0OZ+<)Thww!0 z%cgt*ms8lTil$U9UAyP{n`+Mo5@yyP(j2!rsd4{wuDLaD#~GdbwZEOrpCn58Etr+D zYg5yUj5jY{9gF47Dixl2_u?G;2Iu+Z59Ziiy8oN2(5(5lZe)YPiQs$XjX#S+zn;mP zWg@*>XG_D3cfy)qcZ>fxD>0)k_n3p^^1>~x+b+Gg{PX8r<gV3cu9mn)TF$xp#{Bbt zhL?Je&Okc*-793(rU$Q(wVd8qB%ucB>7Rck%d`E}3RzZNMw96uuF9%Tf3rYFrryNF zz!dqc?6Wc1{le~If8WJlye}r=8}t4+mm=?(Ne&7roQ<M!^#y5Xj$BGuyzwUQ|GM)# z@8)j5eYg2GOXftI*x3H)?eA=#Upt(-#cW$ZYu`ojlj2dcBc2>64}P&^W=CtG&c<B^ z2aVN5uW3JPImEV7nCtlst(EnMvc)V_c)AsoR~(QDXOWGx6c3aXyQ##c>BYL+u}?e5 zVdA%C9v6*{i`-P-)?|>nL^3PuX+(FgX{gtVBoS-AAIV$3^aLp<pFFYI(d*)wppY{^ z9=kX=M2j!^9h33?rn}pH$IVm9INFv<<}O}VwrKUjs+nOySNdgD!^BoERav^Ce!6Dd z<t>uT?(_6}7D)+Kx=C+4`lEN@%}GtYyw=w*9F6ERIv92=$h4Q~@sumU9)TH7qL1fJ zITUE;p{c_D>x{-n$<W{oY1z==700zST=y<<wq%(cC|UW!JX<o%q08AL;H;L_t&Hvv zPTtsvx5}TDf@D&iqO<q($Y`!!y4IO%eZ7>j&YH=Ahf=SlW+m7xbm7&wd0DgbQ`7Vy z4^Brf#+@%#HoESWaA97cZ}}~8LHxC#u5B|lJYVoGTU6Jl>HD`tZ$U%qN>?q9mF`-b zuIxB8Ght?Xm4Vo2pN9*?ZYw?Q+0xtkImw>qYUM`xJ1?4U@T(O%zDalJQuwxcRYBmJ zcKdbpOT=!lum>?0oKoE=e~f$c2L7H)+PX_6H5aKwvgc*KVo$5cIBCN?OY;@GUX|Da z6Q!w3L^P!{suM2VcDWrLU*RsLenT!HJ$jO9$6p3b`6G23X7wl8JDhhv9T>GFBVvkE zv&$dJ9T(H1lp7z|abIollW<m%o)8z%^Fe?`)gef*zGs@)MvgT-7n&X<Z1wo&!8!9m z>w~5#YD-SsYT3Y?vEYi6C&TP(tkq5*l7g2k5<6zxYH!70qL}z&#k`ZZm7<D_4_>@z zoz-^ZaKV%Z(nkbuaU?y=7jRUR@!W3^vB+t`4!upMRB|TDM$SxlAamkHi^MGBU+xwz zYc}P0^lKdFn8;CYB$~lAE0p!vMwh7}i>|7qD2OrLFR}UIqiirkA!*~@BeoGMC!A<g zIFjgb=G=k6MXU!5Upa0S(1<v<fVIWZRdae&XW(hA?A0$abtlfgA)nE?>5Kwr`^Br% zssz9L9h3>Vp80--Nl=F*>)z%Ec`L%F%*a~EBQ0RZl<t0Ip?=8&qxv3UN8Y!YZ5}Di zSK0CcCpl?4^omq7KiR4f`{B8y?&8T+0d`g^(`TwLtw`5M<(jm2%Avm(yG0hLRcW#= zOA^q0(m0K!O~>ej?@GVP?kn{|CPh6mJRPF;Z}E~7oE?n3o%OmaTWrp$_Dr|))?D*M z^2T1nGn0c3+ju30aC>=mCaTs4$$VZig(F;v^;*q`gg;sP;%ay8owMFDp55pE`eW<u z>*w^>&y4+i{%y@p&Gdq4HgUS<CnEd<t{bOY*~ROH&n{IIa5{FlU0F;`Q)cUv!@9>$ zpU?fdZxa8)XwGbtpDdiq6ur7v%oht+a@(SHU1>`At90L~*}2;n?F+wnAxvaPR=uWF zdE17K(RFeP_FJDW59UcMwS98Ipyl%1UzWF5$LGC%?&H0GN!jD_ebIF?3iex`z79V2 zKE$-{`K-t1=l-g^yFA{CVO4nUUn!RlcYl1UYxrZfZ<2N9pOsSk&A<NGeQSB_?@g{( z_a(g$TNoXlTe?o?)o#J})q?Z+1m557@aJ`Ft<O8cR=wv>LBkDY$*DD$7wt1*dERjM zhqL)3XZ=T)86P=If82R+#f9D*EBdF)-|jg3YsyFV@P2#KWAeKN<*Nnf^9#t|?l{lu zcJ$p!)s>8&ZU=jpE$`W%*3x%&<x-`?jdkn7?eAY(&!gb`_fXy+)j9l6mot7!j;^yw z{j+jj;HftU>jhP>HmY20RJm@bc3<=2tF<Q{%y!h<6%`avI^j~O`o4!tCIzs&tyxf% z;qq=`w409QW@Dx8x1-gkHdsxOXFKsd_vbSU^{0EDFFB>O>q&s^KR+SKrBz=yv;TU! ztuD{HZn4kyn({3*i*us)*{A+d-E#VJ_uC)6Tz7vhjr)73v2Nqq`ulm49{u#5UX$B5 zeLeq&seTgsHP?pCJNo9>`q=Gte}9}||F!kw%FyILcYhdVfkJnSUFx4*QU5=uyxgHM zb++RwrDw39&DtfHUnRJnUm*Wh$8}z}nR!QMnK;x*Z~SH9wv=nzR99coz}`%kkmTKh z`PE=$w>z%$*1O%zJ95jw;U8ntWzWa!l~!%sX8AAg$nLl!ubGeBHhbjT9Jo$8{+z7- z{jDEUzi2+*Ug}bMw&T^Vk1wk}W}a!R%dMGpchmVFc{P>Adur|<n_jrQ=l)f}t4}8@ zdC5-HYRQY;dUfZf74O~lym#GW>98kX`JRcy)7^s7R~UY>ci2t}tY5Zsg2}$Vi~BZC zFk2}7aiRFfXAB<~_Ey|Z2zlX_<H7u7yI}TL&By$uF1%+uq`+~W503NgylzMHYK|H> z)Jex*n``pVYSFPYm$&y`%)Hkdx9Ok5elxqbdCIA~%(Ir2FTSQ|FZ)1yp3%Pu_bW^M zyEK;ZseHXM<<;l2UeD`KExH@+etCDP&o_pTZ`URl@wz?DTANbD`{GXS<2QZp4Y%jM z>3cFG_tuFeR$0rRt<r6ex_D!4#{HF{MeHdjR<3=~mlGB$w(-=J&U3{=tN&cIje2^^ zc2}^^<l41Ck7Z7;ig>=vDsbWHtWb5U^N-eS+nbybd?M?z+~K}OVZZZ!7B<xXxiC%M zf5XJJ;(x=;{rcCwv+3UK_WjlLTfZc)UekYnEPt0_(jSJOxjhx7r+$?3G9~+Q1#au} zS=Z<D)o9hFo!{3S|1$UMlc*)@TxUfs*&D2)Hpk2DL+IrI_NEB=$;W4%(|;D;eRJ{E z`NFr(rvJCSX3^nze|gNw`Wox`xnbM+@13u|zd!s`td{7OpnDHremuf=Nn>f!foi?e zPhzLOG&tT~deQ7g`{V1~XV31Lmb$8@X3^?f&VDU-3Vs&U{LB1&eBI++heCg*G-sSL zu@*Tx!(Q87(O%}i$^Sq1ufDyy>!y6ElM2VmEA}yAe;1#L30oBK%))G$;-!~;M$vV5 ze!JZiKlZu)^xIdjE<gSA?cV(G|B*F&s{TJb|LFdAp4m!5e}4b_d+AE|)lW&=X5QcZ zW4B1+^c7n!U8`OG=KhplxBp(!*0(=5{rU7YHkyksPClBZWl*tk*R1~f==1S)x9;dn zb2$3>=BHoxe&61F-2UEluJh^p&*xv8@bU9<{@0yOkFI|_dboX=-+}t~kLRb$d$`80 zot7PWM$=KN;dWw}!;gw>Gw-fhcQSXf+PUW|zY4GadgW$kaN?^&E%C+1$F)y#hMjVr zk-%)yyR7DiXHS~c;wh@8jrm+&-hM?zGa~fATUT(Wt(yAWdR}DLRzBhBe?r=W*xz(7 z(O>WN@v?5_JcXW~`oCX(yG^ODsy|pRw&LUBn^k&C_3NvDetNt3{k;7ZTYniuzpD6_ zRrmL0TG{DW`|INJpUKbDyT4wgE>{2A?AzzRpIaZc|NQ&@_<M0@^TiGRT-KgYz42#_ zylw5D3giC{>$GRg_@w{r_37J3-7l=(6YLlqx9929#UF2fx_7ir=XSoaU3`2{R8ZZS znEGYsOTImhUwB=5OS`+>Ka2R7|AE&m|DXSQ`{>nY{fAa-ERvh}J$;XA>9M1ew@v%L zzGr^l{6mwwPk(;;_3WO2$Li*rUzZ9hd^bMvo8esix@(`=SN(f__1^yWt1mbf)p2h+ zHu>n;7`+)G#r8c`=>>eZCo2l8@43k!C1yBdW$EMtzgg<f`OckHu=xOg;L{BvclIft z@|<e(aH@vbRVEvjh`8IQCWWS{+buun5x(a|(#9uS?sXZQzn!q+oVTZ3u(7_5<fF^J zLC>B}54dtxqqX8_LDs`J@hVAgPxG(dT&lM^a6xmF<P7uF-c4l;^A1k*;$qEy+G4k6 zbLiezGyFY2oAEUDM$|7k#h`epg;h>*zgcVlqEjO0<^?dUT{?HRhx@(h=QnKq8}i(z zcDdV8&Xk6bRc5-ELgUuVJLy-%^3$=J@2aMDu52??%Fdiq<tIu^MDIEkEm~(@B{XSn zRZEM^hn_|9^H!FfyRuxTvbp2Wi?8SHZE82QF8sO7<r}+8pSzHyN#`4_dL{P#?oTc# zY`Uv#B&MH!$06(VYM&bwf2X><+xkFmqI36&m5wRv&hF_}F+4w)nW@)USWaT$eWue{ z=LC9KgP0B|%2ZAh;t>7Oc~v2DPl}rB1KstDSnu`s>{&R&RqT*`mjB{e6%on__s_>{ z2-Du7>|A!Y%gG^H?`GCb!RoTCi3;^BYd0+u*fd4kHf~F@wfm)prKQTJ1gELpYw@vm zW#r(x95vlc;C;dznX0LQo2GOn?e;3(koZB>d8y$s=f@KpHN@G%*o2;)oNTPp%W4*w zyQw|5_RJ@lBQvh&*HwT2=6d*kf0%jr{T98QzSCFiZ_|t5`0`OT!7t|n>kJFyqMtqG z^<THVec1g_)aR=AtP=LjUA;F_d_sQrbS|^}I@818#1{6LgomET5^`hJoI4qoo|@Tb zo-=jNDV^zDr<WX9+7Xxc=#)x0*VO8lV$9F?&3M6?AY;ZeMUcTKva50B3de0;+VSV| zQ}sV3uCLkkNm+R2v)07Zw<f8IXs!;QJmb;T=W99YC-#)vC08cyc<?n?=ltvP#CGPL z&R3_Ncy#Bek&&}RW9z*OtoMF)Utcdj-&`hy=|S{^JvM)DAKv+2YEJcKd)*ebGaH}k zCFa#$|Mkvi_xq{5Qi>PDJNjQO(Oh(XMs-EG?w<Vf&IXkVOi45S>mU70wVyRte*WIy zPcQD?e&2R>zTDmVb7H5zc3&;pYVQ1Yw^H8JA6DvzXEvm~JQH%dX78_uFOPQLJYIPB zO}E@RgCExpyRGr(Uw-3*!Rt3RbBYfio+Vy;z9L4{;&<}lo3ba8mWTKLl8rlCkyVp& zdH3_H*1o$xCrcj94*&e>%ezG?VRamun`C{2<|?JDAJI{tZNJ*b^76C#tbaU*J^p<A zdAa`Y=S9b4eYRbD6|MK-(m_Ano9h#cb|oL$<g1qM7qN%oedSxp#;@yR9^B15s@58u zy?t8Q{l~vK_g`P3{9ADT%A++xmrV-Hr(4*5Jh;Bh;B1Oo(}PC$8^Y-ml0#=r$Y~62 zxO!tV%af$d1}7y?FMeZq*wvcHVg0;%Tf6_qH@}~E-mF{oyno(w{j}Nk`!rklzHz)< z{f)!#tCPl#v=sq-vsqR%JrA_F^vi(5#myn5+VKmk_q&5DwuW2mSX$+BW531!k1scu zuf4G)Hu-I|&Ht^2|JU<;smkx(F8=c7)wm_)y&mhQ?n^$os`_xP(~j-75BJ?)674@V zzU6KG(O+*xqi??WctJV)=8KOH4ocm8F;lD4H%>=8f&Z|KoJGM(uB6ZEK_@sDY%Mb~ zPv93hon<4>ax|5@{b)#=<`3sN2SPQ?Got)BHqQ}A;#T4In4VPWbVAtCjql&FOD~G_ z#hiA&<zoBTx?Hy^;zq^i%acFL-^;yj?RDnMTd@gOzt*31J7clqhP6i8lMB+uImT%f zb0v&^e3tqtIH5Z}#(}BcZTIADKIM{ICG9rd<(I$7&o7@p@BgP~KPQV_ldgR`+y2jg zwh8~HCRx|9#2(}SS^N5+*GHY}-mbNmqCV<1zq1kLKYV=d#{Vare{R0jm2Thnf8(B* z*n`}U-QqI0ua?{uTYqwU`_=G-_2K(<#aGxpzusQepj7Lg<Se>!zslX<BRm01KF>(p zAhyhz+uEUf-rM^Dwn;B89Ok|7_#E%)zymAv?cc9_z`mm3dQ{a4+f~0AbaM|e<i3lW z!u!qtRZ)P<0{{O)k7xYT&f4-zUdZ9yjHEUx<#Mgb?Ha}ICv3RZ?Ao^~^<IeLmFj$* zAD>THn{%o4FY;eJ!NzFj2F<=T$Jx6VP4r9?$vvUGX1CiP!*?7zq#xd`@Y$-IT>Mq5 z(`fQ^+mFY4dN!9m2@O&H*UzKezSchISZ~adjP%DH`@gu(`*xx`^Nao4M$_})Q5hyn zOVGHB1fQX?vA$boQE`cap@E6PbVUJK*?M#2F&Nt^rxR5bd05`NIC8w;|Ea$1YH~II zw-u~Hti0>be!E$FZ{6Ln+X7;@m)t8`d9&}+jmDzeil){}v(&Y6ri=J4`QhyPW?EJC zk~Ds;<oJ+V`+_#l4|&_Jm0WuAc(|0*LlKKdnxB|fJ?zf=<dpSlOWI^{k=6CHR<!Ne zFw3fN<37%u6~Z?sh~ElO-{u`xFx~26?59J@W*==I+bk*7yR<d7M*oM`<o0~N&kv-Z z?a2Nvlkh~&@7Ci_sdmo|tRnmpO3ppCzVy@V{vE#bCr?kW+|2&|^z=Ul{g!;jcNKll z-OGQUqFR6HiM-X5>0cge+gdAlgz-5iJJ#<oshqw}_KR0c$Ao2iOHZora#8wg*L0-y z!IR*YUbVi7YWA0|boR$|@QXXu%qi*M7Z0l0G2v0NyQW=?$H$dnAkJadx2F4Tz4qtx zcXDgm#RybCa_V}2_IOCUO-*TC1ebZylGo9T_n9uee|>j>(L?Q+Am4|6vM+x=6MMhl zLB00&`}UvoVt0Sx+h?EoD#)<%2bcY-C0{+3tQ3~7oASdXyyi#Xqr?3|^Rte$%d6V` z(fIh#y_?@Ys^-VVM~C~x=I8DBVNq@y{53Dm`^C`$Y2`oFvp+?xH`+0Ct@QIsakaTm zW6~C_OwCV|Jo04LMeD9}$y?+vn(WM2B<=F<^iH$xdgZ`(hVS>q$W2>)Zs#iB(z4!7 z$DBWX%1YcZ(Ky}Y>P@GKT3)do6%z$M@J%~A_db`N{#@TP*N-kb$CL15`>ZmR6FKpP zX?Lq7e5RR|3F^H6esTHvO^>r@oZtPEt;>CbQqxnlF#h0YX={GJFy%jW#jLV!<Dogc z=L1d}M;_GtaQ>=oeMZvRjlREDMeqEvbxHNa!*S1KWmUIN>j?X!U=kQ`I=8uai{9cr zQ{#-~t*=ekt*uwaYu?Tw-DZ6-PA~gQuB+>jJ^SaBRc)2b{nH)gZ5C&8_!RHN7`b5A zyZb8_^U9sw{r`H!`}K<~%BOCP+Nt(g*``ZjMu0fq@~aH>A7`)KyK<sHD)+1y$FCo% zof2NlpXksRoc=I}QJC4%z+n2tSF(D3#ztvoM#iRQrbedbW~NC-mPv-jCW+=L$!5mM ziDu@Bb~Xf6#OeoUR;6+oS{fKm_kAs^UT=w<<xFpt7RZ#(I`*+L)qB$#$%7dVvm|HE zoGF=-cKXbjX^v?#Rg6!cIkWA|nLV>l$9*gETlZ?xuCqs{zKKgPpPur1Qp~ra#qWQA zv!7q}>gD|}Uwr=WTE1I#`st^?-fou&zY`z3x*+w+&UHeMid1*U7_R&Aa-EoAy<Yg9 z)2i=|><*0mXx_axN_`c}Z?XQ)eXq=tU1Gj#MHh$1F#n3!r#$K2?IJt5gIg;^%pVv| ztYhzXce^fjc-j;Z$%?zPgiH#bOp@rnbtGBS=fI^I9eH08gw&F`mMs#$e4)LLCqdw{ zA+xi@u?~;2BioE8zrB*H(VV(bX4-MC2*G;o#MCuSp&O;bj!Q)dXD8;aX)gWw&FpdE ztf~lk=>+GTmfnq=W=GR*$dvYPKN5CB>UKhOj=IsBp4xlgYU2LRvrce-(=ykPdv`+k zo3^_*pXF9GEo1+7B<_av?}Yd_?SBgy_>Sbrv@{oT@EuLGka2(DA=A3Jkf-lxp@p1! zN6+s1{Q2cd^TX3Gs?6yLF3|Ej{L+Fsz3a@6d)ExQO<&xZ-D_#V{``^6#5w9_b#{+S z)1EzIis|q!oam94D!pG~`h%hvwN1&rx@QlE?r?gNH|?vo>%K@4+jYryxk+cU&P<=- zKkLTF>i%U8NuPw)?9?|r$Tm&hqtjvc3n{NDwdvUrhwG=kzPLs1x>sk>>YSHWcUq(i zl;0hAyMx#Ku~?_>pM!C`Lm$P}rd5iIJ@UKLy<7F2ucq{7cK*kTHXXkU_N!c3m8i_` z@$&Rq-T5waXI7=i9$Xx>>xH;<v5!~1-HA_<Hm%D)+RU4J>HVjiGnRXrTq`8?AGq#O z>14IP{o{2-sL*w*`s^KT<{y@+?CYI(RQ2QPN5;jE@||<e=<fUJu;u5)S+`9b3wOIk z7q`2ePcA<?_raN#>Mw$yYHJ$!KML9%Q~x0{|6y@Wqy9(HeaFlV^**|8H;(uo_p#b_ za{|w_1Cu1W3m>gBIpcP0b7<<xr3Q@N$x6E}Hha$K(VWp0S9tx$jcYUOk6E3bT>IiU z1Dj#&ozi=^e()R%S8F%u5j=CmC?f2R@2Z=tPkmgqN=CW0BIr)8->sn9?_3dr+MU1W z+_-dV&o;K5T493a7sbE5-s5%Wz3sL=vzA`nIBUoK^PBDB@BH6-zNm4>{&(rw>lEL; zUmbbh<Bt87O?PH2-MV4fj{2OeTH%jJ>g)1$YI?s;$o+VPf8)NH6-v@N=HmV{JNAah zehitJx>Ihx$MtwfLfpmc8*qQMq}g$?8$!{Y%YX4k7iV9KnSO`uc9L~Yzw8F(G9mxP zOx3yRajS1nZjC*1dD)3+WvQ9YA4_!7ea)rro_lwLxjISzO>gan{4ZN)zuEe?Vr^ah zw0{;1>`B`ys&qC@Y?fF#zr=v=;6e)@o91UXPdx0o;&033{zyZnH@RR<#j!7&!h0Ww zzCAMe|G95bUw+T|WPMuq=;vSIr*n@KZ|Z(}?a@!o%SB(d#_vntxmJbMEc%^-C#SmZ z_UTKi7VDHxTEca1&1(%$+ooxoRaSoeJ<Zzt(vSJ|y5&=sIM#2w<2vbD=hJtSOstO= znS1Vfo8#>7Y4z;PF}X=!JXKHcRed@CdGtF~&->>$-3gzx&mwtezlyrdhCA_-{yp4y z$A6Oc^-VSblWI$K`6oPilQ@mtvuJtvw9TrOy_<QRRVx1}oNiYA`AqcmVU?d(zE5lS z`t<y_ZvTWQ{QEc6+r$LjIam5a!?Un9t#Zi{lY)K!4JQRXjXu3tHPu7-^kbE!;d`EL zoV01r)~B44jLt_sukf@qz4J-M^Je_*PcEL7`qw{+cvfCI_bJ8mXWqQ0nUg-bR-X=5 zHQjLg6OX6wo2<%ROSVNNS58}UO+Ke`*^<8Ea~_tHtSVMKy*X*uzd29qcTSqM{l+I5 zPu-$@w|`EmDq8-ua?-DFd!DjR`t>_>TCwWa>941Wd%n7F78$2;uSh;JPAP8xW__{l z?cS@NrasDjd1m`k8D-&uJr&3Q9sXtWab3Z;>qXQ24s||?-FoPk=p)<T_osz-eRn$1 zx8vla+HZG0iS*goiu)eTw2)2j_<oeV-mFMX*}D7tTdUpIs#NZMpC47Haqs-As5+&4 z{dHUaMC|!*e(#g<$A3RAd<ypDe!uCD)1^J<zTPhO%)WQ!leTB~x}eYAp3*hfK1qAN zetYNa-f3HYO20MkTH@=!@y(<yvc0;~Cu}MGpJwTHN$+@M-_$L^?7GvZY;nIi?Xl|H zW74M!>nDACf6j2WLgxRVdqtX_zvpL86IOkDd;2u+?(^jbH@Vkzp8NP(EWY{cw8=-q z*RFl4^6_hQnq_EBtlfq=O8aisoz8qT`^6dm^*_w4KcCXy_lI*@?IY{@^F;wQ$LCyU zJMuki%Tu0@wpMADu{HHY&mtmf<lk?Q5xT$r-1nK9`{bpf>iatE4_ls}B3i%6xczj; z{*A?YTKfNPaZWqkxxbwMwCK_KrALZbKl;~Z?A-Lj-8!6O>XH5DEc;e<)$jbgH&pQd z%EQxEcmH2d91|}5e{;vvS&#NVo>To*E7k0r(Er;tud_S<pFTG&dvgijvyT7g&t3JF z<(yLXZR@|L^M`i|6`bF?uYMkj(*LZ;`jy3n`&dquY~I(%vg-fQB4^GkISK9;m^inb z+P-JP;+3meZoSz!v&N4});-Ejzj2M!G<}Z+(f+5!RWE$bpQi7*Am9A-^vLH)F)EF3 zcwTp_7-aW6)z-QC`J@o%6P2j?P$unb(ff{FvWZb^oLax}-!7KEBa!<KUJ~6=AH(Fn zf78EZEO~NUYP^}YpT40UtJ#=-b6WVvm0zP=*NcAM$Z-8ZR80HpLgu_9zCslr&s^I! zbL-cM2ju-DH@h;;58JXQl<EGOjeB}0{=Kp7Zbes}^}7R3cQhO2Z{1v7_Hh-X&=1w) zv+kPQd}6yp{QJW?n+Eoe0&>TcD@6Jq7TPq{s|Rj>WiqdG-+T3M`_e1p_r9}gfBumv z?uhpa<Aofh{qa*1a`vo!F7;Z{ZC~Fm^ZZA;dwR=1=-oT~`v-&kBjp;MgHtxF{m=RO z`s#hlfA};#G~4#Y()+8`2iEFD{a4RxH4kdp=04GO>r>x<>_u#J=ZlMq3+M0G-&g+n z$eA9qLnk`xpGa_i%T3*Dw{o_VUgt)M_K!j`moB<ZOL}5b#5C=g3#VU3Uh<uunV#P~ z43<y+>iK2!$&)jhR=$|}V3U*d%JRzMlXhQ{8JdM+ezQx@Ja^*f6CR$#h^E#;GqpoA zT%Y*pG^cKy!@_TU-?`FFPci&JmynJ1;b~z>nQ}WfvFP8~ysw_?FBhlS&$TPH4xZPG zTzBl!)hDkan6r~~*YuWdSjTez=#A{J=T<v3#fNWNwr|Prz0;&Ol+0bSTz|{5g-g;c zqpx->l~&nX9h)uX{p-)dX|p$!a2vm3n71&$>+A;0Z3m{^@VX>!T^;=X?zV}bhD-Zf z)!MV_W}BFmxlhWf)*jz}t-gHGeb;wAkvCX(Cz-$Lv)!<KiTtm#*DiFMzES;t%<hKx z@5FkU24>a2HOAGsX6x_jzcd$GBdH?!v^-kw%q8bZfjeiJI;$j?&wIL1$5u)5ckMNv z$vykOZ(37crhZac<?-_NYyC^?edSaaPD)-Y?^{33hV8hQ#>!URtJeFtpM12aXZ)%$ zuVr#z|NWH~zD^4xq7Ro`E9kUg{(56hYn9Ej2QpV4=gGaAIJKL*K=IYZEfG$lbNB9S zDc|W7*L7MY<o?X<l{$Of;`+1;RM$-kIL)8)B+Kod((`1-bqBZZ;Jf~q?M}z+0^_`c zYlU8Y@!yvAH+Hx4y*}#=0Zx18MsA#J`2A$Pm2tUuhKG0buJ)z;C#_z8dst_qu<+y7 zoF|TMc8c<c4p*@BKQgrGQxAB4M)OMLBKM`|dW(f-6<)knKkuvk)C+&KuEi{<Jh!oi z<GkB+tMn_~I<=nrR2J^hU%UT|$5~gQsQs5diT;xK6v`=Dm;2YW>Tl_eK690ljGelB zPhP6{q+8E9_g(tm+^WAzcPKAB-M@Cf_j|SblP|1QzIK24_4^&{LRFh?{%Zg7tNNpd z)BfGrf0L{J_Esn@<e&TZ>l8bWI<<xVbKhRf_pH~9^LTOk?X~?&`X|JDzSv!UZU3_C z_q)x7{2s)uN%_(jp_H9>Gc=}BYT}0cKHc7h>s|B|A8smLqhIeC-zua1P-^bl{>AG( z`=%Exu8)ZC+Gl3zcqo@YGJe)RIm^I9wqg<Qm*qQr^RTGi@YVB6@5z%wa#yeY68W|4 zNeHL^y41bX_pw^~9<n_5?Z=DgiGPLS{>Wcre{p+avyfgyX025%dr@1<cFV`kU*?`n z<dnaYTidda+cNl2dh#0mdguFdW5N!ZZ;OiW+o!&BPm8>GWPIa3{+)|j>g&(`^7``k z#8lNk6EBA^Jg*i$^+Wx?gTJ!AG@rbx`se!VYu6XZyRFlFINyHTKC!<XMY)|v{$2cK z^=0wNQq@Vjj{K_nl6>;3s?g6%zu3MApWsyu`kMY)`l7#*`81E_S=Y=L&Ueexs-Jj` ze@(udee)fe()rt_cuZ%KzT9QF`Q+M-y)M7*Zd#ffY1O{w_jcQ|2`4t}HCv{f{A{xI z!gn`yuI#-Ts`U8z?H_qP@ec3wCQ6>G{<<LE=bh%nJL}iJcilhbPPCHt{7Ct``wI^~ zdj28s>+V<H*B(C={I+;yduhh6$J#Z%@$+pM*y}Hu9B4DS`NZwXaf^;+tlO4cl>F3o ztkubwrTvo65s6uePbNut8_$tx|7fCoV(A9aSN9}47iS1<Fgcr1q_pdzvwhngwo?8+ z)$PYu&2X{jJN}sESBlTli*Nl83!GIcVt?adEII!{@vp!qnif;twj28x_sSgfnf3CC z;gii4&C9G_)&DyG*k?|w_y?s|KKojx8?twQ;CfZFuj_h5armd0IqsKbzuqyLe}}tz z@x17wkBYwWpO`kC+x2h7=PX6NLr1?@X@8N~)M7K|k5K8h{R^%uXGrdp{^nqN?{k4= zZ(a4TvuhO29}}51HRZ2a-UF>Yo!dW{tvgn;r@4G1!~2KKF^8>A*C$!d+WLemf>ZnQ z`omvMLN`dAW!p6UPtTgq1<E`1ero0|y13Z?`J{Q7=8whhc+GG9RlU9Uj^tOL9dqw+ zW?y)t@Ve$&e4}whhxN<a70+MAKACu9TAKMz$!QC2Hb2i`TYT>7-W~k@mtVhsU$;q4 z^ZG}IvlTf`#S>!WPA{1MPe5+j#d_lz^D6r$d_7Y?Uq(S*mECaeGYLyj`TOf}1(W|H z%}$Yd+c)2lS*M$PqByW$);6vvu)m{q2M2dRKhxZw-ht^Aa<6KxS<dOVst$jcb*IT{ zaf#fkJJIb{>r2F5p1Ij09`O96-4)42o1M~~6kpX{uU-4Qod2Ec-S}U=ujXCaTU^gk z8vo+^`ulGSZMxMzsLXSk%b6bV{7mJQ&6i#GG)@0tB=#_L&$)d9pLoHcckkft3jWeC z8wcBd+e62Hu*_d1H@hnA`sYjDHLbtAf3@Xy#7WN=+ie!-xVZdv+?D^l9j>);OZ=yK zC2Lg~NNO*V|2nh(-}Pz#YVCVOH}JfQ|4=`BkzM1(<>tTEEHeu`K5NDKpjQj*N-wIb z{1REJzU@%j4W_U5E5CSpM4xf0eYEhrc~ye=mHm$L$2Z=PuTGA?vR{GUrFPPS^GaW4 z9+r@4TwK8D=TsYJ!1#4ty^-HhnK_NW<b8LpIR4(|PK$To{9XEPf9(&a?vVLv-}*(e z)GqJH*7_ZC{SV8oJU<^DIG^Xe!`{bs4OR7f`TG~$bC*vOd--oyqxuJ#d54TEB)`6k zcwhOoL*vluA5!lh`Cj?IrLyJMeiQx=l6G#jr&jqVT@IK(Yv05({#Lhb#IO7|-Fy0S zwH3cwg3_zKQ}0cD`FHxg)E9dv-AjD=H$*KhLE`H^xA$#d?$x{h4_>MicI@d5wy*n~ z--ms<w?y$(z2Y_Zz3vyRx%c*G^q$?Q%IC26+;!`wZ#P7(6UAO_-4*xn_1BvEH@&rm zTzm%`EjZjC1<3S0E)eNEc+x^nJxT7|k(Cy*&mZZWIoN8!UtB1ucSu!er{%^UcS@}{ z-l%?;B(J0S?c&^|`8nF(>N7tUe?9TJ_vpTyxHqf+Z?z0im}u^<vwqr%_FUcd-D%JB zH)X4Qx_n<Zf69sT-n#3j``oua9j$WN{=_G>lQ}Qe6kF#_J>#aj`2Fmg85_P@s}_67 zp0-vgPFwcW_Tru!pY%?~7@hjGFQYDYPutRS_xJO8J$o2)`nT%mqQ<9(FaD|gD0E`c nv7>dLmnZFi{h;WtJ;Ph+71I;`%F1&a8JHSysj9mAyKw;kQR(Np delta 122255 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 z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
<t+@2jFet{dZXe1#;{24b$RCRlH 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	N4Uz_pYt@_lw{Prv7wPvq5?ydQ4@yR1q zCVxL#?pu)WAXneOoGF#0Jj?OPu_x>nGnT1tTXa$KlTiG_Y?&r!NlV7k)9n+L4ZG4T zcFIg!F6r2J?AnUzbd|nED;q>J-6kg+h&_IBe8TNT?+$K!!Z)Mw<Cn(;HqS0u8#KCY zx91GbP@80(q&}<sgQDF+dDnR@lQT=KgEN;+_$#sCq;kLF{DUh^>P-W$*YhoZSfX?6 z^9tjiOmRnMR&eSsKKER^VybDm^7F?zv*cDhpJw^w-VOGzcZ|f}Urw3)d}8UfukLfh zKNm9UEx8`K@c9JSCl8;buh{%obFZAE_ldh3)n9$wCo=uwi{;DbpDFspQ*vpI!t3RQ zvf+<-_jGPA5M6idb_F~42fcfTP3zYf^J-sQqZ)o}RYY%{tk|WH<5DKCPj)^zo-(&x z`o!0h{RPUsa<x{|zxeFtG=D7iOXte_-D{udtw=wV`{Z0icbawN^UZbKbB@XGm~1Ec zHD+(OjnM6jZ`91)7v5}6&nyaf{wnTH`|=lGf0x@w_D{*KXh^d$TWaaycU)oD3;smG z`rdg5znm$au_pbW(5BfnEpHt4&jxPd&rX*8m0Tg?|G<+o@9{q+lQgmG6J~u5?3cBT zd$veU@N*%f*aA6LtIy(#&wW_B;&bHl4_Q}k?iLDvn07^S>F0pw_pGi|F5T>reojrt zZLa$7fb@=YTyr_C1HSKmmwk7Cb%Fk?f0z7&zE62qKi7H1Zzucuzd8L6C2jiDKd8L& zvFNo*Keuq++;fjp_cVxq6pA~T{X=T~V^G+AFuQkf_lnJr<X%;-5s`o3T+>pO^C~j- zy!ZJJmaoiTde^8Pe0=_`RE4Fn%lm7>8*N^#KlG(?qFv;w4o-=7zBNt1<m+pn2|LKY zs{i)Y{;T7fmin^+^AEhZEL|HGES{Z|dnH}-Yry<nFNB3^yDo7@Cl}{*$_C7D*>YIt zin`pdn#Jm6u7Bmf7|L}2-N>J|_#b<v!mG(FwPFj;%N%>aA=CQn_oB`f=eddk-~amh z-EVSW{Z13n<&R^oJT5oOJ92b||6TD#|F#uy>K!&+aehVkW44&?`qm1O?F;Sd?=}5O zsjz+}`<?O1@7J{zEMM(*bwn=t{n|?I_~r^B|Hb#tzq-5e-siZ(-W9Cz3;r#7#&+*e z(3SgFU#!oNd(3=g`I=uUW}IJFzVxoq&7A)yVRP*J>tFQz-@kmcf$7+Sd(kgtXWpxS z8QXSG`=#u(d;Y8!+E=dlZdzr&r2f0zuh&zwB6z1KMql~Ow>SD?^<=jQ`LEyGtNIs| zi&e>AWQ$JFmT9P(yS|)7c7t@;F`X;frF#!ufBo~{4ff52LVO1sEhO9@1<3S0E)eNE zSYBY`cVMXnuX?iFv&SWKIzJbhoja<!gF)Q$L)OjwIZfBSPVea~&zcr#wDQdF+*3OB zwn5Jhi>2EA+IB`gJ?Fi+$A?J&)2mf}#Qpfc^R>#4e+;LyRen61@swBSkLKZ`g-cX( zw(YT;@;|Y1@siZG|K)plx3|plUbuhuw4bZLTC3`Q|2}QI_pK)%{`-9QxHaX&|J-uV zTYoZ6|8}ZOyD9a|e(SRZOJqGZ?}@+E^*TzA>uGPQuyVJ(_GkOgr~mx>+tKl#U3I3^ W=IPg&<m9;x%uJ2BR8?L5-M9c~02#3W diff --git a/doc/rapport.tex b/doc/rapport.tex deleted file mode 100644 index 19a3c6b..0000000 --- a/doc/rapport.tex +++ /dev/null @@ -1,5085 +0,0 @@ -% Options for packages loaded elsewhere -\PassOptionsToPackage{unicode}{hyperref} -\PassOptionsToPackage{hyphens}{url} -% -\documentclass[ - 12pt, - french, - a4paper, -]{memoir} -\usepackage{lmodern} -\usepackage{amssymb,amsmath} -\usepackage{ifxetex,ifluatex} -\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex - \usepackage[T1]{fontenc} - \usepackage[utf8]{inputenc} - \usepackage{textcomp} % provide euro and other symbols -\else % if luatex or xetex - \usepackage{unicode-math} - \defaultfontfeatures{Scale=MatchLowercase} - \defaultfontfeatures[\rmfamily]{Ligatures=TeX,Scale=1} - \setmonofont[]{JetBrains Mono} -\fi -% Use upquote if available, for straight quotes in verbatim environments -\IfFileExists{upquote.sty}{\usepackage{upquote}}{} -\IfFileExists{microtype.sty}{% use microtype if available - \usepackage[]{microtype} - \UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts -}{} -\makeatletter -\@ifundefined{KOMAClassName}{% if non-KOMA class - \IfFileExists{parskip.sty}{% - \usepackage{parskip} - }{% else - \setlength{\parindent}{0pt} - \setlength{\parskip}{6pt plus 2pt minus 1pt}} -}{% if KOMA class - \KOMAoptions{parskip=half}} -\makeatother -\usepackage{xcolor} -\IfFileExists{xurl.sty}{\usepackage{xurl}}{} % add URL line breaks if available -\IfFileExists{bookmark.sty}{\usepackage{bookmark}}{\usepackage{hyperref}} -\hypersetup{ - pdftitle={Bootiful}, - pdfauthor={Dimitri Lizzi}, - pdflang={fr-CH}, - pdfkeywords={Bachelor, HEPIA, HESSO, Bootiful}, - hidelinks, - pdfcreator={LaTeX via pandoc}} -\urlstyle{same} % disable monospaced font for URLs -\usepackage[includeheadfoot,margin=2.5cm]{geometry} -\usepackage{color} -\usepackage{fancyvrb} -\newcommand{\VerbBar}{|} -\newcommand{\VERB}{\Verb[commandchars=\\\{\}]} -\DefineVerbatimEnvironment{Highlighting}{Verbatim}{commandchars=\\\{\}} -% Add ',fontsize=\small' for more characters per line -\newenvironment{Shaded}{}{} -\newcommand{\AlertTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}} -\newcommand{\AnnotationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}} -\newcommand{\AttributeTok}[1]{\textcolor[rgb]{0.49,0.56,0.16}{#1}} -\newcommand{\BaseNTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}} -\newcommand{\BuiltInTok}[1]{#1} -\newcommand{\CharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}} -\newcommand{\CommentTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textit{#1}}} -\newcommand{\CommentVarTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}} -\newcommand{\ConstantTok}[1]{\textcolor[rgb]{0.53,0.00,0.00}{#1}} -\newcommand{\ControlFlowTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}} -\newcommand{\DataTypeTok}[1]{\textcolor[rgb]{0.56,0.13,0.00}{#1}} -\newcommand{\DecValTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}} -\newcommand{\DocumentationTok}[1]{\textcolor[rgb]{0.73,0.13,0.13}{\textit{#1}}} -\newcommand{\ErrorTok}[1]{\textcolor[rgb]{1.00,0.00,0.00}{\textbf{#1}}} -\newcommand{\ExtensionTok}[1]{#1} -\newcommand{\FloatTok}[1]{\textcolor[rgb]{0.25,0.63,0.44}{#1}} -\newcommand{\FunctionTok}[1]{\textcolor[rgb]{0.02,0.16,0.49}{#1}} -\newcommand{\ImportTok}[1]{#1} -\newcommand{\InformationTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}} -\newcommand{\KeywordTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{\textbf{#1}}} -\newcommand{\NormalTok}[1]{#1} -\newcommand{\OperatorTok}[1]{\textcolor[rgb]{0.40,0.40,0.40}{#1}} -\newcommand{\OtherTok}[1]{\textcolor[rgb]{0.00,0.44,0.13}{#1}} -\newcommand{\PreprocessorTok}[1]{\textcolor[rgb]{0.74,0.48,0.00}{#1}} -\newcommand{\RegionMarkerTok}[1]{#1} -\newcommand{\SpecialCharTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}} -\newcommand{\SpecialStringTok}[1]{\textcolor[rgb]{0.73,0.40,0.53}{#1}} -\newcommand{\StringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}} -\newcommand{\VariableTok}[1]{\textcolor[rgb]{0.10,0.09,0.49}{#1}} -\newcommand{\VerbatimStringTok}[1]{\textcolor[rgb]{0.25,0.44,0.63}{#1}} -\newcommand{\WarningTok}[1]{\textcolor[rgb]{0.38,0.63,0.69}{\textbf{\textit{#1}}}} -\usepackage{longtable,booktabs} -% Correct order of tables after \paragraph or \subparagraph -\usepackage{etoolbox} -\makeatletter -\patchcmd\longtable{\par}{\if@noskipsec\mbox{}\fi\par}{}{} -\makeatother -% Allow footnotes in longtable head/foot -\IfFileExists{footnotehyper.sty}{\usepackage{footnotehyper}}{\usepackage{footnote}} -\makesavenoteenv{longtable} -\usepackage{graphicx} -\makeatletter -\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi} -\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi} -\makeatother -% Scale images if necessary, so that they will not overflow the page -% margins by default, and it is still possible to overwrite the defaults -% using explicit options in \includegraphics[width, height, ...]{} -\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio} -% Set default figure placement to htbp -\makeatletter -\def\fps@figure{htbp} -\makeatother -\setlength{\emergencystretch}{3em} % prevent overfull lines -\providecommand{\tightlist}{% - \setlength{\itemsep}{0pt}\setlength{\parskip}{0pt}} -\setcounter{secnumdepth}{5} -\usepackage{pdfpages} -\usepackage{fancyhdr} -\usepackage{graphicx} -\usepackage{float} -\usepackage{lastpage} -\usepackage{fvextra} -\DefineVerbatimEnvironment{Highlighting}{Verbatim}{frame=single,breaklines,commandchars=\\\{\},fontsize=\footnotesize} - -\pagestyle{fancy} -\setlength{\headheight}{14pt} - -\renewcommand{\headrulewidth}{0.4pt} -\renewcommand{\footrulewidth}{0.4pt} - -\fancyhead[LO,LE]{Bootiful} -\fancyhead[CO,CE]{Déploiement d'OS à choix durant le processus de boot} -\fancyhead[RO,RE]{Dimitri Lizzi} -\fancyfoot[LO,LE]{août 2020} -\fancyfoot[CO,CE]{} -\fancyfoot[RE,RO]{\thepage /\pageref{LastPage}} - -\setcounter{tocdepth}{4} - -\setlength{\parindent}{0pt} -\setlength{\parskip}{9pt} -\setlength{\beforechapskip}{-10pt} - -\OnehalfSpacing -\ifxetex - % Load polyglossia as late as possible: uses bidi with RTL langages (e.g. Hebrew, Arabic) - \usepackage{polyglossia} - \setmainlanguage[]{french} -\else - \usepackage[shorthands=off,main=french]{babel} -\fi -\newlength{\cslhangindent} -\setlength{\cslhangindent}{1.5em} -\newenvironment{cslreferences}% - {}% - {\par} - -\title{Bootiful} -\usepackage{etoolbox} -\makeatletter -\providecommand{\subtitle}[1]{% add subtitle to \maketitle - \apptocmd{\@title}{\par {\large #1 \par}}{}{} -} -\makeatother -\subtitle{Déploiement d'OS à choix durant le processus de boot} -\author{Dimitri Lizzi} -\date{Août 2020} - -\begin{document} -% Nom conformes des tables -\renewcommand*\listfigurename{Liste des illustrations} -\renewcommand*\listtablename{Liste des tableaux} -% Sets the page numbering style to roman -%\pagestyle{headings} -%\setcounter{page}{1} -%\pagenumbering{roman} - -% Hides the page number for the cover page -\thispagestyle{empty} -\addtolength{\voffset}{-5pt} -% Hides the header for the cover page -% Cover page -\begin{figure} - \vspace*{-5cm} - \begin{sffamily} - \begin{minipage}{.4\textwidth} - \centering - \hspace*{-3cm}\includegraphics[height=1.25cm]{images/logo_hepia.pdf} - \end{minipage}\qquad - \begin{minipage}{.4\textwidth} - \centering - \hspace*{5cm}\includegraphics[height=1.25cm]{images/logo-hesso-geneve.pdf} - \end{minipage} - \end{sffamily} -\end{figure} - -\begin{center} - \vspace{1.5cm} - \includegraphics[height=5cm]{images/bootiful_logo_final.pdf}\\ - \vspace{5mm} - - \huge{Déploiement d'OS à choix durant le processus de boot}\\ - \vspace{2cm} - - \large{Thèse de Bachelor présentée par}\\ - \vspace{5mm} - \textbf{\Large{Dimitri Lizzi}}\\ - \vspace{5mm} - - \large{pour l’obtention du titre Bachelor of Science HES-SO en}\\ - \vspace{5mm} - \textbf{\Large{Ingénierie des technologies de l’information \\avec orientation en \\logiciels -et systèmes complexes}} - - \vspace{5mm} - \textbf{Août 2020\\} - \vspace{8mm} - \begin{tabular}{ p{6cm} } - \multicolumn{1}{c}{Professeur-e HES responsable}\\ - \multicolumn{1}{c}{\textbf{Florent Glück}}\\ - \end{tabular} -\end{center} - - -\mainmatter -\tableofcontents -\newpage - -\chapter*{Remerciements} -\addcontentsline{toc}{chapter}{Remerciements} - -\textbf{TODO: remerciements} - -\addcontentsline{toc}{chapter}{Résumé} -\includepdf{abstract.pdf} - -\addcontentsline{toc}{chapter}{Énoncé} -\includepdf{statement.pdf} - -\chapter*{Liste des acronymes} -\addcontentsline{toc}{chapter}{Liste des acronymes} - -\begin{description} -\tightlist -\item[BIOS \protect\hypertarget{acronym__BIOS}{}{}] -\emph{Basic Input Output System}: système de base d'entrée sortie -\item[DHCP \protect\hypertarget{acronym__DHCP}{}{}] -\emph{Dynamic Host Configuration Protocol}: protocole de configuration -dynamique des hôtes -\item[EFI \protect\hypertarget{acronym__EFI}{}{}] -\emph{Extensible Firmware Interface}: interface micrologicielle -extensible unifiée -\item[ESP \protect\hypertarget{acronym__ESP}{}{}] -\emph{EFI System Partition}: partition système EFI -\item[FOG \protect\hypertarget{acronym__FOG}{}{}] -\emph{Free Open-source Ghost} -\item[FTP \protect\hypertarget{acronym__FTP}{}{}] -\emph{File Transfer Protocol}: protocole de transfert de fichier -\item[GPT \protect\hypertarget{acronym__GPT}{}{}] -\emph{GUID Partition Table}: table de partitionnement GUID -\item[GRUB \protect\hypertarget{acronym__GRUB}{}{}] -\emph{GRand Unified Bootloader} -\item[HEPIA \protect\hypertarget{acronym__HEPIA}{}{}] -Haute école du paysage, d'ingénierie et d'architecture de Genève -\item[HTTPS \protect\hypertarget{acronym__HTTPS}{}{}] -\emph{HyperText Transfer Protocol Secure}: protocole de transfert -hypertexte sécurisé -\item[HTTP \protect\hypertarget{acronym__HTTP}{}{}] -\emph{HyperText Transfer Protocol}: protocole de transfert hypertexte -\item[IBM \protect\hypertarget{acronym__IBM}{}{}] -\emph{International Business Machines corporation} -\item[IPFS \protect\hypertarget{acronym__IPFS}{}{}] -\emph{InterPlanetary File System}: système de fichier inter-planétaire -\item[IP \protect\hypertarget{acronym__IP}{}{}] -\emph{Internet Protocol}: protocole internet -\item[LDAP \protect\hypertarget{acronym__LDAP}{}{}] -\emph{Lightweight Directory Access Protocol}: protocole léger d'accès à -un annuaire -\item[MAC \protect\hypertarget{acronym__MAC}{}{}] -\emph{Media Access Control (address)}: adresse physique -\item[MBR \protect\hypertarget{acronym__MBR}{}{}] -\emph{Master Boot Record}: enregistrement d'amorcage maître -\item[NAT \protect\hypertarget{acronym__NAT}{}{}] -\emph{Network Address Translation}: traduction d'adresse réseau -\item[NFS \protect\hypertarget{acronym__NFS}{}{}] -\emph{Network File System}: système de fichiers en réseau -\item[NVRAM \protect\hypertarget{acronym__NVRAM}{}{}] -\emph{Non-Volatile Random Access Memory}: mémoire vive non volatile -\item[OS \protect\hypertarget{acronym__OS}{}{}] -\emph{Operating System}: système d'exploitation -\item[PC \protect\hypertarget{acronym__PC}{}{}] -\emph{Personal Computer}: ordinateur personnel -\item[PXE \protect\hypertarget{acronym__PXE}{}{}] -\emph{Pre-boot eXecution Environment}: environnement d'exécution -pré-démarrage -\item[SCP \protect\hypertarget{acronym__SCP}{}{}] -\emph{Secure CoPy}: protocole de copie sécurisée sur le réseau -\item[SI \protect\hypertarget{acronym__SI}{}{}] -Système d'Information -\item[SMB \protect\hypertarget{acronym__SMB}{}{}] -\emph{Server Message Block} -\item[SSH \protect\hypertarget{acronym__SSH}{}{}] -\emph{Secure SHell}: protocole de terminal à distance securisé -\item[TFTP \protect\hypertarget{acronym__TFTP}{}{}] -\emph{Trivial File Transfer Protocol}: protocole simplifié de transfert -de fichiers -\item[UEFI \protect\hypertarget{acronym__UEFI}{}{}] -\emph{Unified Extensible Firmware Interface}: interface micrologicielle -extensible unifiée -\item[WWW \protect\hypertarget{acronym__WWW}{}{}] -\emph{World Wide Web}: toile mondiale / réseau mondial -\end{description} - -\newpage - -\listoffigures -\newpage - -\listoftables - -\hypertarget{introduction}{% -\chapter{Introduction}\label{introduction}} - -\hypertarget{contexte}{% -\section{Contexte}\label{contexte}} - -Aujourd'hui les machines des salles de cours à -\protect\hyperlink{acronym__HEPIA}{HEPIA} sont installées avec une image -spécifique d'un système d'exploitation. Dans le cadre de certains cours, -on désirerait pouvoir utiliser un autre système d'exploitation -(\protect\hyperlink{acronym__OS}{OS}) et aussi avoir la possibilité -d'être administrateur sur la machine physique. En effet, utiliser une -machine virtuelle n'est pas toujours souhaitable, surtout lorsqu'il y a -interaction avec du matériel, typiquement lors du développement pour -l'embarqué. Le but de ce projet est de développer un système de -déploiement répondant à ces besoins. Lors de la mise sous tension d'une -machine, le système proposerait à l'utilisateur un choix d'OSes et -celui-ci s'installerait à la volée (distributions Linux, différentes -versions de Windows, etc.). Afin de minimiser le temps d'attente lors de -l'installation de l'\protect\hyperlink{acronym__OS}{OS}, un mécanisme de -cache évitant le téléchargement des images préalablement téléchargées -sera mis en place. On désire aussi que le système de déploiement -permette de customiser certains aspects de l'image choisie. Ce travail -ce base sur une ébauche d'un travail déjà existant. - -\hypertarget{objectifs}{% -\section{Objectifs}\label{objectifs}} - -\begin{itemize} -\tightlist -\item - Etude du travail existant. -\item - Mise en place d'un déploiement automatisé et reproductible du travail - existant. -\item - Ajout du support d'images Windows. -\item - Optimisation du format d'image afin d'en accélérer sensiblement la - vitesse de téléchargement. -\item - Mise en place d'un mécanisme de personnalisation des images en - post-installation. -\item - Implémenter une gestion administrative aisée du système de déploiement - - \begin{itemize} - \tightlist - \item - Il doit être aisé de créer des images et configurer les opérations à - effectuer en post-installation. - \end{itemize} -\item - Le système doit pouvoir supporter l'authentification des utilisateurs - via un serveur \protect\hyperlink{acronym__LDAP}{LDAP} (Linux - seulement) - - \begin{itemize} - \tightlist - \item - Les OS déployés (Linux), doivent pouvoir s'intégrer au processus - d'authentification utilisé dans les salles de laboratoires ITI. - \end{itemize} -\item - Gestion du système aussi simple et aisée que possible. -\item - Si le temps le permet: optimisation de la bande passante du réseau - dans le cas de nombreux téléchargements effectués en parallèle. -\end{itemize} - -\hypertarget{duxe9roulement}{% -\section{Déroulement}\label{duxe9roulement}} - -Ce projet n'a pas n'a pas été réalisé dans les locaux -d'\protect\hyperlink{acronym__HEPIA}{HEPIA} mais à distance, depuis la -maison, en partie à cause de la situation sanitaire due au COVID-19 mais -aussi parce qu'il est effectué dans le cadre d'un bachelor en cours du -soir, en parallèle à une activité professionnelle à 80\%. - -Des rendez-vous hebdomadaires avec le professeur responsable Florent -Glück ainsi que l'assistant Sébastien Chassot ont été organisés tous les -mercredis, afin d'assurer un suivi du projet. - -\hypertarget{matuxe9riel-uxe0-disposition}{% -\section{Matériel à disposition}\label{matuxe9riel-uxe0-disposition}} - -Deux mini-ordinateurs ont étés prêtés par -\protect\hyperlink{acronym__HEPIA}{HEPIA} pour la durée du projet, afin -d'effectuer des tests sur du matériel réel. Les spécifications de ces -ordinateurs sont définies dans la table \ref{mini_pc_specs}. - -\begin{longtable}[]{@{}ll@{}} -\caption{Spécifications techniques des ordinateurs mis à disposition -\label{mini_pc_specs}}\tabularnewline -\toprule -\begin{minipage}[b]{0.19\columnwidth}\raggedright -Caractéristique\strut -\end{minipage} & \begin{minipage}[b]{0.75\columnwidth}\raggedright -Description\strut -\end{minipage}\tabularnewline -\midrule -\endfirsthead -\toprule -\begin{minipage}[b]{0.19\columnwidth}\raggedright -Caractéristique\strut -\end{minipage} & \begin{minipage}[b]{0.75\columnwidth}\raggedright -Description\strut -\end{minipage}\tabularnewline -\midrule -\endhead -\begin{minipage}[t]{0.19\columnwidth}\raggedright -Constructeur\strut -\end{minipage} & \begin{minipage}[t]{0.75\columnwidth}\raggedright -\emph{DELL}\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.19\columnwidth}\raggedright -Modèle\strut -\end{minipage} & \begin{minipage}[t]{0.75\columnwidth}\raggedright -\emph{Optiplex 7060 micro}\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.19\columnwidth}\raggedright -Processeur\strut -\end{minipage} & \begin{minipage}[t]{0.75\columnwidth}\raggedright -\emph{Intel® Core™ i7-8700 3.20GHz}\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.19\columnwidth}\raggedright -Mémoire vive\strut -\end{minipage} & \begin{minipage}[t]{0.75\columnwidth}\raggedright -8 GiB (2 barettes 4GiB \emph{SODIMM DDR4 Synchronous} 2666 MHz (0.4 -ns))\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.19\columnwidth}\raggedright -Disque\strut -\end{minipage} & \begin{minipage}[t]{0.75\columnwidth}\raggedright -\emph{TOSHIBA KSG60ZMV} SSD 476GiB (512GB)\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.19\columnwidth}\raggedright -Réseau\strut -\end{minipage} & \begin{minipage}[t]{0.75\columnwidth}\raggedright -\emph{Intel e1000e Gigabit Ethernet}\strut -\end{minipage}\tabularnewline -\bottomrule -\end{longtable} - -\hypertarget{muxe9thodologie}{% -\section{Méthodologie}\label{muxe9thodologie}} - -Le travail a été découpé en plusieurs parties, dont la durée a été -estimée en semaines de travail. Un planning a été effectué sous la forme -d'un diagramme de Gantt. Ce diagramme est visible dans la figure -\ref{planning_gantt}. - -\begin{figure} -\centering -\includegraphics{images/planning.pdf} -\caption{Diagramme de Gantt du planning\label{planning_gantt}} -\end{figure} - -\hypertarget{analyse}{% -\section{Analyse}\label{analyse}} - -\hypertarget{cas-dutilisation}{% -\section{Cas d'utilisation}\label{cas-dutilisation}} - -L'aspect fonctionnel du système à réaliser est décrit avec un diagramme -de cas d'utilisations dans la figure \ref{diagram_usecases}. - -\begin{figure} -\centering -\includegraphics{images/diagram_usecases.svg} -\caption{Diagramme des cas d'utilisation du -système.\label{diagram_usecases}} -\end{figure} - -\hypertarget{uxe9tude-des-solutions-existantes}{% -\section{Étude des solutions -existantes}\label{uxe9tude-des-solutions-existantes}} - -De nombreux systèmes de déploiement -d'\protect\hyperlink{acronym__OS}{OS} existent, mais aucun d'entre eux -ne répond précisément aux objectifs précis du cahier des charges de ce -projet. - -Les sous-sections qui suivent décrivent quelques-uns de ces systèmes, -leurs points forts et points faibles et pourquoi ils ne sont pas adaptés -tels-quel pour ce projet. - -\hypertarget{bpbatch-rembo-ibm-tivoli}{% -\subsection{\texorpdfstring{BpBatch / Rembo / -\protect\hyperlink{acronym__IBM}{IBM} -Tivoli}{BpBatch / Rembo / IBM Tivoli}}\label{bpbatch-rembo-ibm-tivoli}} - -Ce système est l'inspiration directe de ce projet. Son développement a -commencé en 1996 au département informatique de l'université de Genève -par Marc Vuilleumier Stückelberg et David Clerc. - -Les fonctionnalités de ce projet sont similaires à celles visée par le -projet \emph{Bootiful}. Il permet aux postes clients de lancer un mini -système d'exploitation via \protect\hyperlink{acronym__PXE}{PXE} au -démarrage de la machine. Ce mini-système permet de télécharger et -déployer des images de système d'exploitation sur la machine, tout en -créant une copie en cache à la fin du disque pour éviter de la -télécharger plusieurs fois. - -La première version, nommée \emph{BpBatch} fut distribuée gratuitement -sur internet. Une entreprise nommée \emph{Rembo Technology Sàrl} a -ensuite été fondée en 1999 pour continuer un développement commercial de -ce projet sous le nom de \emph{Rembo}. En 2006, la société a été -rachetée par IBM et le projet a été intégré à leur solution \emph{Tivoli -Provisionning Manager}. - -Ce système réponde aux besoins de -\protect\hyperlink{acronym__HEPIA}{HEPIA}, et il a même déjà été utilisé -au sein de l'institution par le passé. Il a cependant été abandonné à -cause de sa licence devenue très couteuse et de sa complexité devenue -trop grande pour les besoins simple de l'école. - -Le développement d'une solution alternative \emph{open-source} plus -simple et se basant sur des briques logicielles existantes serait donc -très intéressante. - -\hypertarget{fog-project}{% -\subsection{\texorpdfstring{\protect\hyperlink{acronym__FOG}{FOG} -project}{FOG project}}\label{fog-project}} - -\protect\hyperlink{acronym__FOG}{FOG} est une solution open-source -gratuite permettant de déployer des images de systèmes d'exploitation -sur des postes clients. - -Elle fonctionne avec une architecture client-serveur. Le serveur est -accédé par une interface web, où un administrateur peut gérer ses images -et les déployer sur des clients qui démarrent un logiciel de déploiement -avec \protect\hyperlink{acronym__PXE}{PXE}. - -Cette solution est utilisées dans certaines classes à -\protect\hyperlink{acronym__HEPIA}{HEPIA} pour déployer des images sur -certains postes, notemment pour les travaux de laboratoire de réseau. - -Malheureusement, ce système ne répond pas exactement au cahier des -charges de ce projet: il est plutôt conçu pour ``pousser'' des images -sur des clients, depuis le serveur, après une initiation du déploiement -par un administrateur. Nous souhaitons plutôt un système ne nécessitant -pas d'intervention d'un administrateur pour initier un déploiement. - -De plus,\protect\hyperlink{acronym__FOG}{FOG} ne dispose pas de -mécanisme de cache sur les clients permettant de ne pas télécharger les -images plusieurs fois. À chaque fois qu'un image doit être déployée, -elle doit être téléchargée à nouveau depuis le serveur, ce qui peut -prendre beaucoup de temps et doit être planifié à l'avance. - -\hypertarget{clonezilla}{% -\subsection{Clonezilla}\label{clonezilla}} - -\emph{Clonezilla} est une solution open-source et gratuite de création -et de restauration d'images. - -Cet outil peut être utilisé de deux manières: - -\begin{itemize} -\tightlist -\item - En faisant démarrer les clients sur le réseau. Ils chargent un petit - système d'exploitation de déploiement depuis un un serveur - \protect\hyperlink{acronym__PXE}{PXE}. Ils peuvent ensuite initier le - déploiement ou la restauration d'une image depuis/vers ce serveur. -\item - En faisant démarrer les clients sur un CD ou une clé USB. Ils peuvent - ensuite initier le déploiement ou la restauration d'une image - d'\protect\hyperlink{acronym__OS}{OS} depuis/vers sur un autre disque - ou un serveur distant. -\end{itemize} - -Un avantage de \emph{Clonezilla} est le format utilisé pour la -sauvegarde des images. L'outil \emph{Partclone}, développé par la même -équipe, est utilisé. Il permet de créer des images de partitions en ne -copiant que les blocs utilisés dans le système de fichiers. Les parties -non utilisées de la partition ne sont pas comprises dans l'image créée, -ce qui permet de réduire sa taille et d'accélérer le processus de -sauvegarde et de restauration. - -Malheureusement, comme pour \protect\hyperlink{acronym__FOG}{FOG}, -\emph{Clonezilla} ne dispose pas de mécanisme de cache sur les clients -permettant de ne pas télécharger les images depuis un serveur distant -plusieurs fois. À chaque fois qu'un image doit être déployée, elle doit -être téléchargée à nouveau depuis le serveur, ce qui peut prendre -beaucoup de temps et doit être planifié à l'avance. - -\emph{Clonezilla} ne peut donc pas être utilisé tel-quel. Cependant, il -est possible de l'utiliser uniquement pour la création d'images et -d'intégrer son mécanisme de restauration à un autre système de -déploiement. Cette possibilité sera étudiée plus tard dans ce document. - -\hypertarget{architecture-initiale-du-projet}{% -\chapter{Architecture initiale du -projet}\label{architecture-initiale-du-projet}} - -Le projet \emph{Bootiful} n'a pas été initié dans le cadre de ce travail -de bachelor: une implémentation basique -(\protect\hyperlink{ref-venkatesh_remote_imaging}{1}) avait déjà été -réalisée afin de prouver que l'idée fonctionne. Cette version initiale a -été créée par Abhilash Venkatesh, un étudiant indien qui est venu à -\protect\hyperlink{acronym__HEPIA}{HEPIA} effectuer un stage pendant la -période de mai à juillet 2019. - -Les premières étapes de ce travail diplôme ont été de reproduire le -système réalisé dans le projet initial afin de valider son -fonctionnement, d'analyser en détail son fonctionnement et sa structure -et de documenter son architecture. - -Ce chapitre est l'aboutissement de cette étude. Il décrit les détails de -l'architecture du projet initial qui a été reproduite, afin d'apporter -un contexte aux chapitres suivants qui décrivent les ajouts et -modifications de cette architecture. - -\hypertarget{composants-initiaux}{% -\section{Composants initiaux}\label{composants-initiaux}} - -Le système est composé de multiples clients qui communiquent avec un -serveur central à travers un réseau \protect\hyperlink{acronym__IP}{IP}. - -\hypertarget{postes-clients}{% -\subsection{Postes clients}\label{postes-clients}} - -Les postes clients supportés par le système sont des ordinateurs -compatibles \protect\hyperlink{acronym__PC}{PC} x86. - -Ils doivent nécessairement être équipés d'une carte réseau et d'un -micrologiciel \protect\hyperlink{acronym__BIOS}{BIOS} ou -\protect\hyperlink{acronym__UEFI}{UEFI} capables et configurés pour -amorcer un système d'exploitation à partir du réseau à chaque démarrage -en utilisant le standard \protect\hyperlink{acronym__PXE}{PXE}. - -Ils doivent aussi disposer d'un disque dur sur lequel les images de -système d'exploitation seront déployées et mises en cache. L'espace -disque est subdivisé en trois parties distinctes ayant chacune un rôle -précis. - -La première partie du disque est l'espace dédié au déploiement d'un -\protect\hyperlink{acronym__OS}{OS}. Elle prend 80\% de l'espace total -disponible, au début du disque. Au tout début de cette partie du disque, -dans le premier secteur addressable du disque, se trouve le secteur -d'amorçage au format \protect\hyperlink{acronym__MBR}{MBR}. Ce premier -secteur contient deux informations nécessaires pour le chargement d'un -système d'exploitation: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\item - \textbf{La routine d'amorcage}: c'est le premier programme exécuté - lors du démarrage sur le disque. Sa taille est très limitée: 440 - octets. Il sert généralement à initier un chargeur d'amorcage ou - \emph{bootloader} présent un peu plus loin sur le disque, qui est un - petit programme qui va initier un système d'exploitation. -\item - \textbf{La table des partitions}: définit une liste de partitions, qui - sont des subdivisions logiques de l'espace du disque. Selon le système - d'exploitation installé et la manière dont il a été configuré lors de - son installation initiale les partitions peuvent varier en nombre et - en taille. Les données à l'intérieur de chaque partition sont - généralement structurées en utilisant un système de fichiers. Les - partitions vont varier en nombre, taille, et format selon l'image - déployée. -\end{enumerate} - -La seconde partie du disque est l'espace dédié à la mise en cache -d'images d'\protect\hyperlink{acronym__OS}{OS}, qui prend 20\% de -l'espace total disponible, moins 4096 octets, à la fin du disque. Ce -cache permet de stocker des images disques compressées qui peuvent être -décompressées sur la première partie du disque. Lors du premier -déploiement d'une image disque compressée disponible sur le serveur, -cette dernière est transmise depuis le serveur jusqu'au client en -version compressée à travers le réseau. Au fur et à mesure que les -données compressées de l'image sont réceptionnées par le client, elles -sont simultanément copiées dans le cache et décompressées sur la -première partie du disque. - -Ce mécanisme de cache permet de ne plus avoir à télécharger à nouveau -l'image lors des prochains déploiements car elle sera disponible -localement. Il suffira de décompresser le fichier présent dans le cache -et d'écrire les données extraites séquentiellement sur la première -partie du disque. Cela permet d'éviter de surcharger la bande passante -du réseau et les ressources du serveur, en particulier quand un grand -nombre de clients vont fréquemment déployer la même image en même temps, -comme cela sera souvent le cas dans le contexte d'une école -d'informatique où les élèves déploient la même image au début de chaque -session d'un même cours. - -Enfin, les 4096 octets restants à la fin du disque sont dédiés à -l'écriture d'une signature servant à signaler si une image vient d'être -deployée sur le disque. La présence cette signature est verifiée à -chaque démarrage pour déterminer s'il faut démarrer une image -fraichement déployée ou si au contraire l'image déployée a déjà été -utilisée et qu'il faut lancer un nouveau déploiement. Ainsi, le système -peut s'assurer qu'une image disque déployée n'est exécutée qu'une seule -fois, ce qui laisse la liberté à l'utilisateur du poste client de faire -ce qu'il veut sur le système déployé sans se soucier de rendre le -système inutilisable, car il suffit de redémarrer la machine pour -repartir sur une base propre. - -Le mécanisme de signature est nécessaire à cause du moyen choisi pour -déployer les images: un système d'exploitation Linux minimaliste est est -chargé en mémoire depuis le réseau afin de lancer le processus de choix -d'une image et de la déployer. Une fois le déploiement terminé, la -machine redémarre. La signature à la fin du disque est un moyen simple -et efficace de faire persister l'information qu'une image vient d'être -déployée et de la vérifier au démarrage. - -\hypertarget{serveur}{% -\subsection{Serveur}\label{serveur}} - -Le composant central du système est un \emph{serveur} linux qui -inter-agit avec les postes clients pour leur permettre d'effectuer -plusieurs actions: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - Recevoir une configuration IP et un chargeur d'amorcage - \protect\hyperlink{acronym__GRUB}{GRUB} à exécuter pour démarrer sur - le réseau en utilisant le standard PXE. -\item - Analyser la signature présente sur le disque dur depuis le chargeur - d'amorçage chargeur d'amorcage - \protect\hyperlink{acronym__GRUB}{GRUB}. - - \begin{itemize} - \tightlist - \item - Si elle n'est pas présente, amorcer un système d'exploitation - minimaliste servant à effectuer le choix d'une image et - d'automatiser son déploiement et sa mise en cache. - \item - Si elle est présente, l'effacer et démarrer sur le disque dur pour - initier l'amorçage de l'\protect\hyperlink{acronym__OS}{OS} déployé. - \end{itemize} -\item - Lister les images disponible et les méta-données de chacune d'entre - elle: - - \begin{itemize} - \tightlist - \item - Le nom de l'image, pour permettre aux utilisateurs d'effectuer un - choix. - \item - La taille de l'image décompressée, pour pouvoir vérifier que la - taille du disque client est suffisante pour déployer l'image. - \item - La taille de l'image compressée, pour pouvoir vérifier que l'image - puisse être mise en cache. - \item - Un \emph{hash} de l'image pour pouvoir l'identifier de manière - unique et vérifier si elle est déjà présente dans le cache ou s'il - faut la télécharger. - \end{itemize} -\item - Télécharger une image choisie. -\item - Sauvegarder et charger une copie du - \protect\hyperlink{acronym__MBR}{MBR} contenant la table des - partitions qui contient la partition cachée, afin de pouvoir le - restaurer et remonter cette partition. -\item - Sauvegarder un log du déploiement afin de pouvoir garder une trace des - temps de déploiement et des éventuelles erreurs rencontrées. -\end{enumerate} - -Trois protocoles réseau standard sont utilisés pour permettre au client -d'effectuer ces actions: - -\begin{itemize} -\item - \protect\hyperlink{acronym__DHCP}{DHCP}: fournit aux clients initiant - un démarrage sur le réseau une configuration IP, et l'adresse d'un - serveur TFTP et le nom du fichier exécutable du chargeur d'amorçage à - récupérer sur ce dernier -\item - \protect\hyperlink{acronym__TFTP}{TFTP}: permet au clients de - télécharger: - - \begin{itemize} - \tightlist - \item - le fichier exécutable du chargeur d'amorçage - \item - la configuration du chargeur d'amorçage - \item - les modules optionels du chargeur d'amorçage, téléchargés selon la - configuration - \item - l'image initrd permettant d'initialiser le système linux de - déploiement - \item - le noyeau linux de l'OS de déploiement - \item - l'image du système de fichier racine de l'OS de déploiement - \end{itemize} -\item - \protect\hyperlink{acronym__NFS}{NFS}: permet au système linux de - monter un partage distant qui contient: - - \begin{itemize} - \tightlist - \item - les scripts permettant d'effectuer le déploiement automatique - \item - un dossier contenant les images et leurs métadonnées - \item - un dossier dans lequel enregistrer une copie du MBR - \item - un dossier dans lequel enregistrer les logs du déploiement - \end{itemize} -\end{itemize} - -\hypertarget{diagramme-des-composants-du-serveur}{% -\subsection{Diagramme des composants du -serveur}\label{diagramme-des-composants-du-serveur}} - -La figure \ref{diagram_components} est un diagramme qui détaille les -différents composants et leurs interactions. - -\begin{figure} -\centering -\includegraphics{images/diagram_components.svg} -\caption{Diagramme des composants du système\label{diagram_components}} -\end{figure} - -\hypertarget{processus-de-duxe9ploiement-initial}{% -\section{Processus de déploiement -initial}\label{processus-de-duxe9ploiement-initial}} - -\textbf{TODO: décrire pas à pas les différentes étapes du processus de -déploiement telles que montrées sur le diagramme.} - -Les différentes étapes du processus de déploiement d'images sont -décrites dans la figure \ref{diagram_activity_deployment} qui est un -diagrame d'activité détaillant les différentes étapes du processus de -déploiement d'images. - -\begin{figure} -\centering -\includegraphics{images/diagram_activity_deployment.svg} -\caption{Diagramme d'activité du processus de déploiement -initial\label{diagram_activity_deployment}} -\end{figure} - -\hypertarget{architecture-ruxe9seau-initiale}{% -\section{Architecture réseau -initiale}\label{architecture-ruxe9seau-initiale}} - -Pour faire fonctionner le système, il faut que les machines clientes et -le serveur puissent communiquer à travers un réseau local. - -Les tests ont été effectués dans un réseau domestique classique: une -\emph{box} internet sert à la fois de passerelle internet et de routeur -DHCP dans le réseau local. - -Il y a un problème pour tester le système dans ce réseau local: le -serveur de déploiement doit aussi jouer le rôle de serveur DHCP et il y -aura des collisions entre les deux. La solution choisie pour palier à ce -problème, est d'utiliser deux interfaces réseau sur le serveur pour le -connecter à deux réseaux locaux distincts. - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\item - L'interface \texttt{eth0} du serveur de déploiement est connectée au - réseau \texttt{192.168.1.0/24}, dont les adresses IP sont distribuées - par la box internet, qui sert aussi de passerelle vers internet. -\item - L'interface \texttt{eth1} du serveur de déploiement est connectée au - réseau \texttt{192.168.56.0/24}, dont les adresses IP sont distribuées - par le serveur de déploiement d'images. Il n'y a pas de passerelle - vers internet. -\end{enumerate} - -Le serveur étant une machine virtuelle \emph{VirtualBox} créée par -l'outil \emph{Vagrant}, ses interfaces réseau sont aussi virtuelles. Ces -interfaces virtuelles ont été ratachées aux interfaces de la machine -hôte de la manière suivante: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - L'interface \texttt{eth0} de la machine virtuelle est ratachée à - l'interface \texttt{wlan0} de la machine hôte en utilisant le mode - \protect\hyperlink{acronym__NAT}{NAT}. -\item - L'interface \texttt{eth1} de la machine virtuelle est ratachée à - l'interface \texttt{eth0} de la machine hôte en utilisant le mode - \texttt{bridged}. -\end{enumerate} - -La figure \ref{diagram_home_network} illustre les détails de la -configuration réseau décrite ci-dessus. - -\begin{figure} -\centering -\includegraphics{images/diagram_home_network.svg} -\caption{Diagramme montrant la configuration des équipements réseaux -utilisée pendant le test du système -initial.\label{diagram_home_network}} -\end{figure} - -\hypertarget{mise-en-opuxe9ration-du-projet-initial}{% -\section{Mise en opération du projet -initial}\label{mise-en-opuxe9ration-du-projet-initial}} - -La mise en fonctionnement du système initial à partir de la -documentation et des fichiers du dépôt git a été fastidieuse car il -contient des fichiers de configuration, des binaires et des sources et -des scripts non documentés. Il faut parcourir les différents fichiers -\texttt{readme} éparpillés dans les dossiers pour tenter de comprendre -comment installer un serveur. Aussi, certaines configurations ne -semblaient pas être à jour et ne fonctionnaient pas en étant utilisées -telles quel. - -La configuration du serveur \protect\hyperlink{acronym__DHCP}{DHCP} a du -être modifiée pour qu'en plus du -\texttt{option\ tftp-server-name\ "192.168.56.100"}, le paramètre -\texttt{next-server\ 192.168.56.100} soit aussi envoyé aux clients. Le -premier paramètre sert au client à savoir sur quel serveur TFTP -l'exécutable d'amorçage (dans ce cas, -\protect\hyperlink{acronym__GRUB}{GRUB}) doit être téléchargé. -Cependant, une fois \protect\hyperlink{acronym__GRUB}{GRUB} démarré, il -n'était pas capable de trouver l'image du système linux de déploiement. -L'option \texttt{next-server} a permis de renseigner -\protect\hyperlink{acronym__GRUB}{GRUB} sur le fait qu'il doit par -défaut rechercher les fichiers mentionnés dans la configuration dans le -serveur \protect\hyperlink{acronym__TFTP}{TFTP} accessible par l'adresse -IP mentionnée. - -Ensuite, une fois capable de démarrer l'OS de déploiement, il a fallu -résoudre de nombreux petits bugs dans les scripts de déploiement, qui ne -s'exécutaient pas complètement à cause d'erreurs dans certaines -commandes. Une fois les scripts corrigés, le démarrage de l'image -déployée ne fonctionnait pas. Pour des raisons non documentées, -\protect\hyperlink{acronym__GRUB}{GRUB} était configuré pour lancer le -programme \texttt{ipxe} depuis le serveur -\protect\hyperlink{acronym__TFTP}{TFTP}, qui lui même initie le -démarrage depuis le premier disque. Ce système ne fonctionnait pas: -\texttt{ipxe} ne se lançait même pas à cause d'un chemin invalide. De -plus ce système rajoutait une étape inutile: -\protect\hyperlink{acronym__GRUB}{GRUB} est tout à fait capable de -démarrer sur le premier disque. Le fichier de configuration de -\protect\hyperlink{acronym__GRUB}{GRUB} a donc été modifié pour -directement démarrer sur le disque quand la signature est détectée à la -fin du disque. Enfin, le système était fonctionnel. - -Pour faciliter l'utilisation et le développement du système dans le -futur, il a été décidé d'automatiser la création d'une machine virtuelle -du serveur, afin que la mise en fonctionnement d'un nouveau serveur de -déploiement d'images soit le plus simple possible nécessite le moins -d'intervention possible. Le programme \emph{Vagrant} a été utilisé dans -un premier temps pour automatiser la création d'une machine virtuelle à -partir d'un fichier \texttt{Vagrantfile} définissant la configuration de -la machine et les commandes à lancer pour l'installer et la configurer. -Une fois ce fichier de configuration créé, une seule commande est -nécessaire pour créer, configurer et lancer un serveur fonctionnel dans -une machine virtuelle: \texttt{vagrant\ up}. - -\begin{figure} -\centering -\includegraphics{images/vagrant_logo.svg} -\caption{Logo du logiciel \emph{Vagrant} utilisé pour automatiser la -création du serveur du système initial.} -\end{figure} - -La distribution \emph{Linux} \emph{Debian} a été choisie comme -\protect\hyperlink{acronym__OS}{OS} de base de cette machine virtuelle, -car elle est \emph{open-source}, populaire, stable et dispose de -nombreux paquets. Elle est utilisée dans la version \emph{Buster}, qui -est la version stable au moment de ce travail. - -\begin{figure} -\centering -\includegraphics{images/debian_logo.svg} -\caption{Logo de la distribution \emph{Linux} \emph{Debian} utilisée -comme base du serveur.} -\end{figure} - -\hypertarget{limitations-du-projet-initial}{% -\section{Limitations du projet -initial}\label{limitations-du-projet-initial}} - -Bien que le système du projet initial ait pu être mis en fonctionnement, -il comporte de nombreuses limitations auxquelles il faudrait palier: - -\begin{itemize} -\tightlist -\item - Les systèmes EFI ne sont pas supportés. -\item - Les images prennent beaucoup de place et sont longues à transférer. -\item - Les grosses images prennent beaucoup de temps à être déployées. -\item - La création d'images nécessite plusieurs opérations en ligne de - commande, ce n'est pas très facile à utiliser. -\item - Les scripts de déploiement sont fragiles et gèrent mal les erreurs. -\item - Il n'y a pas de système de personnalisation d'image. Si on veut faire - \(n\) personnalisation partant sur la base du même - \protect\hyperlink{acronym__OS}{OS}, il faut faire \(n\) images: une - pour chaque personnalisation. -\item - L'installation de nouveaux outils sur le système d'exploitation de - l'\protect\hyperlink{acronym__OS}{OS} de déploiement créé avec - \emph{Buildroot} peut être compliqué si l'outil a beaucoup de - dépendances. -\item - Les dépendances du projet sont difficile à reproduire: il faut - disposer des bonnes dépendances et du bon environnement. -\item - Les scripts de déploiement ne fonctionnent que si le client utilise - une interface réseau nommée \texttt{eth0}. -\item - Les logs sauvés sur le serveur ne sont pas très complets et il est - difficile de diagnostiquer les erreurs et les timings des différentes - étapes à partir de ceux-ci. -\item - Le système de déploiement doit sauver et restaurer un - \protect\hyperlink{acronym__MBR}{MBR} sur le serveur pour utiliser sa - partition cachée de cache des images. Cela implique des - lectures/écritures sur le disque et sur le partage NFS du serveur qui - prennent du temps et rajoutent de la complexité. Étant donné que la - position du cache est fixe (elle est calculée à partir de la taille du - disque, qui ne devrait pas changer), le client devrait être capable de - détecter et monter la partition sans dépendre du serveur. -\end{itemize} - -\hypertarget{recherche-et-duxe9veloppement}{% -\chapter{Recherche et -développement}\label{recherche-et-duxe9veloppement}} - -\hypertarget{compatibilituxe9-efi}{% -\section{\texorpdfstring{Compatibilité -\protect\hyperlink{acronym__EFI}{EFI}}{Compatibilité EFI}}\label{compatibilituxe9-efi}} - -Lors des tests du système initial sur les PC fournis par l'école (DELL -Optiplex 7060 micro), il s'est avéré que bien que le système de -déploiement était fonctionnel, l'initialisation des images -d'\protect\hyperlink{acronym__OS}{OS} qui venaient d'être déployées par -le logiciel d'amorçage \protect\hyperlink{acronym__GRUB}{GRUB} ne -fonctionnait pas: un écran noir était affiché, avec parfois une suite de -caractères étranges affichée à l'écran, parfois non, alors que sur des -machines virtuelles \emph{VirtualBox}, le démarrage des mêmes images ne -posait aucun problème. - -Ces mini-ordinateurs sont capables de démarrer sur le réseau avec le -protocole \protect\hyperlink{acronym__PXE}{PXE} en mode émulation -\emph{legacy} ou en mode natif \protect\hyperlink{acronym__EFI}{EFI}. Le -système initial fonctionne uniquement en mode \emph{legacy} et il est -soupçonné que c'est un bug ou une limitation dans l'émulation du mode -\emph{legacy} sur ces machines qui empêchait le démarrage de -l'\protect\hyperlink{acronym__OS}{OS} déployé, bien qu'il n'ait pas été -possible de le prouver avec certitude. - -Cela a conduit à effectuer un autre test sur un ordinateur portable -personnel à disposition (Lenovo U530), sur lequel il s'est avéré que le -boot \protect\hyperlink{acronym__PXE}{PXE} \emph{legacy} n'était même -pas supporté: seul le démarrage en mode -\protect\hyperlink{acronym__EFI}{EFI} était possible. - -À ce moment, il a été décidé de modifier le système pour le rendre -compatible -\protect\hyperlink{acronym__EFI}{EFI}/\protect\hyperlink{acronym__UEFI}{UEFI}, -en partant du principe qu'il serait utilisé sur des -\protect\hyperlink{acronym__PC}{PC} récents qui sont compatibles avec ce -mode de démarrage. - -La première étape de cette transition vers -\protect\hyperlink{acronym__EFI}{EFI} a été de recompiler le logiciel -d'amorçage \protect\hyperlink{acronym__GRUB}{GRUB} dans sa version -\protect\hyperlink{acronym__EFI}{EFI} pour une architecture x86 64 bits. -Jusqu'à présent, l'exécutable déjà compilé de -\protect\hyperlink{acronym__GRUB}{GRUB} présent dans les dossiers du -projet initial avait été utilisé. Il avait été compilé pour une -architecture x86 32 bits en mode \protect\hyperlink{acronym__PC}{PC} -\emph{legacy} uniquement. La compilation du système est nécessaire car -le système de déploiement initial comporte un module -\protect\hyperlink{acronym__GRUB}{GRUB} développé spécifiquement pour le -projet, qui permet d'effectuer la vérification et l'effacement de la -signature à la fin du disque et de changer l'option de démarrage par -défaut en fonction de sa présence. Il n'est donc pas possible d'utiliser -un exécutable déjà compilé de \protect\hyperlink{acronym__GRUB}{GRUB} -car il faut que ce module soit aussi compilé. - -Dans le projet initial, le code source de -\protect\hyperlink{acronym__GRUB}{GRUB} dans sa version 2.02 avait -simplement été recopié dans un dossier du dépôt git, le fichier source -du module de vérification de la signature \texttt{isign.c} avait été -rajouté au code source et les fichiers de \texttt{Makefile} avaient été -modifiés pour que le nouveau module soit compilé. Le problème avec cette -approche est qu'il est difficile de mettre à jour -\protect\hyperlink{acronym__GRUB}{GRUB} sur une nouvelle version. - -Une nouvelle approche a été choisie pour intégrer le module -\texttt{isign} à \protect\hyperlink{acronym__GRUB}{GRUB}, qui permet de -mettre à jour plus facilement \protect\hyperlink{acronym__GRUB}{GRUB}, -qui a d'ailleurs été utilisé en version 2.04, la dernière version sortie -au moment où cela a été fait. La nouvelle approche est la suivante: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - Un clone du dépôt officiel de \protect\hyperlink{acronym__GRUB}{GRUB} - a été créé sur le serveur git de - \protect\hyperlink{acronym__HEPIA}{HEPIA}. Il a été nommé - \texttt{bootiful-grub}. -\item - Un commit a été fait sur ce clone du dépôt git, contenant l'ajout du - fichier source \texttt{isign.c} et la modification du fichier générant - le \texttt{Makefile} pour prendre en compte ce module lors de la - compilation. -\item - Le dépôt git cloné a été rajouté comme sous module du dépôt principal - du projet \emph{Bootiful} dans le sous dossier - \texttt{grub/bootiful-grub}. -\end{enumerate} - -L'avantage de cette nouvelle approche est qu'il est maintenant facile -d'intégrer les changements survenus dans le dépôt git officiel sur son -clone pour bénéficier des dernières mises à jour de -\protect\hyperlink{acronym__GRUB}{GRUB}. - -\textbf{TODO: expliquer les problèmes rencontrés sans -\protect\hyperlink{acronym__EFI}{EFI} avec lesmachines récentes, des -modifications nécessaires pour supporter ce nouveau système et des -limitations que cela apporte.} - -\hypertarget{amuxe9lioration-de-la-vitesse-de-transfert-des-images}{% -\section{Amélioration de la vitesse de transfert des -images}\label{amuxe9lioration-de-la-vitesse-de-transfert-des-images}} - -Le protocole \protect\hyperlink{acronym__NFS}{NFS} est utilisé dans le -système initial pour transférer une image depuis le client vers le -serveur. Peut-être que la vitesse de transfert des images à travers le -réseau pourrait être améliorée en utilisant un autre protocole. Pour -décider si le choix de ce protocole est adapté ou si au contraire il -serait bénéfique d'en utiliser un autre, la vitesse de transfert d'une -grosse image a été mesurée sur différents protocoles de transfert de -fichier. - -\hypertarget{protocoles-considuxe9ruxe9s}{% -\subsection{Protocoles considérés}\label{protocoles-considuxe9ruxe9s}} - -Les différents protocoles qui ont été mesurés sont: - -\begin{itemize} -\tightlist -\item - \protect\hyperlink{acronym__SCP}{SCP}: ce protocole, utilisable avec - le programme éponyme \texttt{scp}, permet le transfert de fichiers - sécurisé entre un client et un serveur utilisant le protocole d'accès - à distance sécurisé \protect\hyperlink{acronym__SSH}{SSH}. Bien que le - chiffrage de la communication n'est pas nécessaire dans notre cas, il - est intéressant d'observer si ce dernier a un impact sur le temps de - transfert. -\item - \protect\hyperlink{acronym__HTTP}{HTTP}: c'est le protocole - client-serveur utilisé sur le World Wide Web - (\protect\hyperlink{acronym__WWW}{WWW}) pour la communication entre en - les navigateurs (client) et les serveurs. Il est souvent utilisé pour - le téléchargement de fichiers sur internet et offre probablement des - performances acceptables. Il existe aussi une version chiffrée de ce - protocole, \protect\hyperlink{acronym__HTTPS}{HTTPS}, mais uniquement - la version non-chiffrée sera testée ici, car le chiffrement de la - communication ne semble pas nécessaire et pourrait impacter les - performances. -\item - \protect\hyperlink{acronym__FTP}{FTP}: ce protocole standard fait - exactement ce que nous avons besoin: transférer des fichiers à travers - le réseau. Il y a de forte chances qu'il offre de très bonnes - performances. -\item - \protect\hyperlink{acronym__NFS}{NFS}: le protocole standard pour - monter à distance des dossiers partagés entre des - \protect\hyperlink{acronym__OS}{OS} Linux. C'est ce système qui est - utilisé par le projet initial, mais ce n'est probablement pas le plus - rapide, car permet de faire plus qu'un simple transfert de fichiers. -\item - \protect\hyperlink{acronym__SMB}{SMB}: le protocole standard pour - monter à distance des dossier partagés entre des - \protect\hyperlink{acronym__OS}{OS} Windows. Une implémentation existe - sous linux, \emph{Samba}, et elle est courremment utilisée pour une - meilleure compatiblité avec les systèmes Windows que sont équivalent - \protect\hyperlink{acronym__NFS}{NFS}. -\item - \protect\hyperlink{acronym__IPFS}{IPFS}: ce protocole pair à pair - décentralisé permet à chacun de des pairs de mettre à disposition ou - de télécharger des fichiers. Il pourrait être intéressant d'utiliser - ce protocole pour soulager la charge du serveur, car tous les clients - connectés peuvent se partager des parties d'images qu'ils ont déjà. Le - serveur de déploiement ne serait qu'un pair de plus, qui dispose de - toutes les images. Il est cependant possible que ce protocole ne soit - pas le plus performant à cause de sa jeunesse et de son mode de - fonctionnement complexe qui apporte un surcout à l'échange, en tout - cas dans le cas ou il n'y a que deux pairs. -\end{itemize} - -\hypertarget{environnement-des-tests-de-performance-des-protocoles-de-transfert-de-fichiers}{% -\subsection{Environnement des tests de performance des protocoles de -transfert de -fichiers}\label{environnement-des-tests-de-performance-des-protocoles-de-transfert-de-fichiers}} - -Deux machines de test identiques ont été utilisées: il s'agit de mini-PC -DELL Optiplex 7060 micro avec les spécifications suivantes: - -\begin{itemize} -\tightlist -\item - Processeur: Intel® Core™ i7-8700 CPU cadencé à 3.20GHz, -\item - Mémoire vive: 8 GiB (2 barettes 4GiB SODIMM DDR4 Synchronous 2666 MHz - (0.4 ns)) -\item - Disque: TOSHIBA KSG60ZMV SSD 476GiB (512GB) -\item - Réseau: Intel e1000e Gigabit Ethernet -\end{itemize} - -Les deux machines de test sont connectées en réseau avec un switch -Gigabit Ethernet. Le système d'exploitation Debian 10.4.0 (nom de code -\emph{buster}) AMD64 a été installé sur deux machines de test, sans -interface graphique. La première machine est nommée \texttt{debian1} et -la seconde \texttt{debian2}. Les noms \texttt{debian1.home} et -\texttt{debian2.home} permettent aux deux machines de communiquer entre -elles en faisant abstraction de leur adresse -\protect\hyperlink{acronym__IP}{IP}. L'utilisateur \texttt{debian} avec -le mot de passe \texttt{debian} est utilisé sur chacune des deux -machines. - -Le fichier à copier, \texttt{win10.tar.gz} est une image brute de -windows 10 compressée avec \texttt{gzip}, qui fait une taille totale de -13743592907 B (12.8 GiB). Il est présent dans le dossier -\texttt{/home/debian} de la machine \texttt{debian1}. - -La commande \texttt{perf} est utilisée pour tester 4 exécutions d'une -commande de copie lancée depuis la machine \texttt{debian2}. Elle est -installée à l'aide de la commande suivante: - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{apt}\NormalTok{ install linux{-}perf} -\end{Highlighting} -\end{Shaded} - -Pour faire fonctionner la commande sans être root, le kernel doit être -configuré avec la commande suivante: - -\begin{Shaded} -\begin{Highlighting}[] -\BuiltInTok{echo}\NormalTok{ 1 }\OperatorTok{\textgreater{}}\NormalTok{ /proc/sys/kernel/perf\_event\_paranoid} -\end{Highlighting} -\end{Shaded} - -Les sections suivantes détaillent les configurations spécifiques à -chaque protocole effectuées sur chacune des machines et les résultats du -test. La dernière section récapitule les résultats et explique quel -protocole est choisi pour la suite du travail et pourquoi. - -\hypertarget{tests-de-performance-du-protocole-de-transfert-de-fichiers-scp}{% -\subsection{\texorpdfstring{Tests de performance du protocole de -transfert de fichiers -\protect\hyperlink{acronym__SCP}{SCP}}{Tests de performance du protocole de transfert de fichiers SCP}}\label{tests-de-performance-du-protocole-de-transfert-de-fichiers-scp}} - -Tout d'abord, des clés SSH ont été générées sur chaque machine avec la -commande suivante: - -\begin{Shaded} -\begin{Highlighting}[] -\FunctionTok{ssh{-}keygen} -\end{Highlighting} -\end{Shaded} - -Ensuite, les clés ont été échangées. Sur \texttt{debian1}, la commande -suivante a été utilisée: - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{ssh{-}copy{-}id}\NormalTok{ debian2.home} -\end{Highlighting} -\end{Shaded} - -Sur \texttt{debian2}, la commande suivante a été utilisée: - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{ssh{-}copy{-}id}\NormalTok{ debian1.home} -\end{Highlighting} -\end{Shaded} - -Finalement, le benchmark de la copie a été lancé sur \texttt{debian2}: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\ExtensionTok{perf}\NormalTok{ stat {-}r 4 {-}d scp debian1.home:/home/debian/win10.tar.gz /home/debian/win10.tar.gz} -\ExtensionTok{win10.tar.gz}\NormalTok{ 100\% 13GB 109.6MB/s 01:59 } -\ExtensionTok{win10.tar.gz}\NormalTok{ 100\% 13GB 109.6MB/s 01:59 } -\ExtensionTok{win10.tar.gz}\NormalTok{ 100\% 13GB 109.7MB/s 01:59 } -\ExtensionTok{win10.tar.gz}\NormalTok{ 100\% 13GB 109.6MB/s 01:59 } - - \ExtensionTok{Performance}\NormalTok{ counter stats for }\StringTok{\textquotesingle{}scp debian1.home:/home/debian/win10.tar.gz /home/debian/win10.tar.gz\textquotesingle{}}\NormalTok{ (4 runs)}\BuiltInTok{:} - - \ExtensionTok{60}\NormalTok{,349.20 msec task{-}clock \# 0.504 CPUs utilized ( +{-} 3.61\% )} - \ExtensionTok{808}\NormalTok{,243 context{-}switches \# 0.013 M/sec ( +{-} 0.26\% )} - \ExtensionTok{16}\NormalTok{ cpu{-}migrations \# 0.000 K/sec ( +{-} 14.73\% )} - \ExtensionTok{16}\NormalTok{,862 page{-}faults \# 0.279 K/sec ( +{-} 18.95\% )} - \ExtensionTok{191}\NormalTok{,612,352,176 cycles \# 3.175 GHz ( +{-} 0.33\% ) }\KeywordTok{(}\ExtensionTok{50.09\%}\KeywordTok{)} - \ExtensionTok{406}\NormalTok{,400,076,305 instructions \# 2.12 insn per cycle ( +{-} 0.25\% ) }\KeywordTok{(}\ExtensionTok{62.64\%}\KeywordTok{)} - \ExtensionTok{13}\NormalTok{,334,327,547 branches \# 220.953 M/sec ( +{-} 1.42\% ) }\KeywordTok{(}\ExtensionTok{62.43\%}\KeywordTok{)} - \ExtensionTok{246}\NormalTok{,499,018 branch{-}misses \# 1.85\% of all branches ( +{-} 3.10\% ) }\KeywordTok{(}\ExtensionTok{62.36\%}\KeywordTok{)} - \ExtensionTok{64}\NormalTok{,653,696,732 L1{-}dcache{-}loads \# 1071.326 M/sec ( +{-} 0.44\% ) }\KeywordTok{(}\ExtensionTok{62.40\%}\KeywordTok{)} - \ExtensionTok{4}\NormalTok{,559,992,550 L1{-}dcache{-}load{-}misses \# 7.05\% of all L1{-}dcache hits ( +{-} 0.41\% ) }\KeywordTok{(}\ExtensionTok{62.43\%}\KeywordTok{)} - \ExtensionTok{784}\NormalTok{,218,339 LLC{-}loads \# 12.995 M/sec ( +{-} 0.64\% ) }\KeywordTok{(}\ExtensionTok{50.01\%}\KeywordTok{)} - \ExtensionTok{121}\NormalTok{,317,304 LLC{-}load{-}misses \# 15.47\% of all LL{-}cache hits ( +{-} 0.52\% ) }\KeywordTok{(}\ExtensionTok{50.29\%}\KeywordTok{)} - - \ExtensionTok{119.8094}\NormalTok{ +{-} 0.0182 seconds time elapsed ( +{-} 0.02\% )} -\end{Highlighting} -\end{Shaded} - -\hypertarget{tests-de-performance-du-protocole-de-transfert-de-fichiers-http}{% -\subsection{\texorpdfstring{Tests de performance du protocole de -transfert de fichiers -\protect\hyperlink{acronym__HTTP}{HTTP}}{Tests de performance du protocole de transfert de fichiers HTTP}}\label{tests-de-performance-du-protocole-de-transfert-de-fichiers-http}} - -Le serveur \protect\hyperlink{acronym__HTTP}{HTTP} \emph{Apache} a été -installé sur la machine \texttt{debian1} et le fichier a été mis à -disposition sur ce serveur avec les commandes suivantes: - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{apt}\NormalTok{ install apache2} -\FunctionTok{cp}\NormalTok{ win10.tar.gz /var/www/html/} -\end{Highlighting} -\end{Shaded} - -Finalement, le benchmark du téléchargement du fichier avec la commande -\texttt{wget} a été lancé sur \texttt{debian2}: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\ExtensionTok{perf}\NormalTok{ stat {-}r 4 {-}d wget http://debian1.home/win10.tar.gz} -\ExtensionTok{{-}{-}2020{-}05{-}20}\NormalTok{ 09:53:53{-}{-} http://debian1.home/win10.tar.gz} -\ExtensionTok{Resolving}\NormalTok{ debian1.home (debian1.home)}\ExtensionTok{...}\NormalTok{ 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29} -\ExtensionTok{Connecting}\NormalTok{ to debian1.home (debian1.home)}\KeywordTok{|}\ExtensionTok{2a02}\NormalTok{:120b:c3e2:cab0:e6b9:7aff:feed:e0cd}\KeywordTok{|}\NormalTok{:}\ExtensionTok{80...}\NormalTok{ connected.} -\ExtensionTok{HTTP}\NormalTok{ request sent, awaiting response... 200 OK} -\ExtensionTok{Length}\NormalTok{: 13743592907 (13G) [}\ExtensionTok{application}\NormalTok{/}\ExtensionTok{x{-}gzip}\NormalTok{]} -\ExtensionTok{Saving}\NormalTok{ to: ‘win10.tar.gz.2’} - -\ExtensionTok{win10.tar.gz.2}\NormalTok{ 100\%[==============================================}\OperatorTok{\textgreater{}}\NormalTok{] 12.80G 110MB/s in 2m 0s } - -\ExtensionTok{2020{-}05{-}20}\NormalTok{ 09:55:53 (110 MB/s) }\ExtensionTok{{-}}\NormalTok{ ‘win10.tar.gz.2’ saved [13743592907/13743592907]} - -\ExtensionTok{{-}{-}2020{-}05{-}20}\NormalTok{ 09:55:53{-}{-} http://debian1.home/win10.tar.gz} -\ExtensionTok{Resolving}\NormalTok{ debian1.home (debian1.home)}\ExtensionTok{...}\NormalTok{ 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29} -\ExtensionTok{Connecting}\NormalTok{ to debian1.home (debian1.home)}\KeywordTok{|}\ExtensionTok{2a02}\NormalTok{:120b:c3e2:cab0:e6b9:7aff:feed:e0cd}\KeywordTok{|}\NormalTok{:}\ExtensionTok{80...}\NormalTok{ connected.} -\ExtensionTok{HTTP}\NormalTok{ request sent, awaiting response... 200 OK} -\ExtensionTok{Length}\NormalTok{: 13743592907 (13G) [}\ExtensionTok{application}\NormalTok{/}\ExtensionTok{x{-}gzip}\NormalTok{]} -\ExtensionTok{Saving}\NormalTok{ to: ‘win10.tar.gz.3’} - -\ExtensionTok{win10.tar.gz.3}\NormalTok{ 100\%[==============================================}\OperatorTok{\textgreater{}}\NormalTok{] 12.80G 108MB/s in 2m 0s } - -\ExtensionTok{2020{-}05{-}20}\NormalTok{ 09:57:52 (109 MB/s) }\ExtensionTok{{-}}\NormalTok{ ‘win10.tar.gz.3’ saved [13743592907/13743592907]} - -\ExtensionTok{{-}{-}2020{-}05{-}20}\NormalTok{ 09:57:52{-}{-} http://debian1.home/win10.tar.gz} -\ExtensionTok{Resolving}\NormalTok{ debian1.home (debian1.home)}\ExtensionTok{...}\NormalTok{ 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29} -\ExtensionTok{Connecting}\NormalTok{ to debian1.home (debian1.home)}\KeywordTok{|}\ExtensionTok{2a02}\NormalTok{:120b:c3e2:cab0:e6b9:7aff:feed:e0cd}\KeywordTok{|}\NormalTok{:}\ExtensionTok{80...}\NormalTok{ connected.} -\ExtensionTok{HTTP}\NormalTok{ request sent, awaiting response... 200 OK} -\ExtensionTok{Length}\NormalTok{: 13743592907 (13G) [}\ExtensionTok{application}\NormalTok{/}\ExtensionTok{x{-}gzip}\NormalTok{]} -\ExtensionTok{Saving}\NormalTok{ to: ‘win10.tar.gz.4’} - -\ExtensionTok{win10.tar.gz.4}\NormalTok{ 100\%[==============================================}\OperatorTok{\textgreater{}}\NormalTok{] 12.80G 108MB/s in 2m 1s } - -\ExtensionTok{2020{-}05{-}20}\NormalTok{ 09:59:53 (109 MB/s) }\ExtensionTok{{-}}\NormalTok{ ‘win10.tar.gz.4’ saved [13743592907/13743592907]} - -\ExtensionTok{{-}{-}2020{-}05{-}20}\NormalTok{ 09:59:53{-}{-} http://debian1.home/win10.tar.gz} -\ExtensionTok{Resolving}\NormalTok{ debian1.home (debian1.home)}\ExtensionTok{...}\NormalTok{ 2a02:120b:c3e2:cab0:e6b9:7aff:feed:e0cd, 192.168.1.29} -\ExtensionTok{Connecting}\NormalTok{ to debian1.home (debian1.home)}\KeywordTok{|}\ExtensionTok{2a02}\NormalTok{:120b:c3e2:cab0:e6b9:7aff:feed:e0cd}\KeywordTok{|}\NormalTok{:}\ExtensionTok{80...}\NormalTok{ connected.} -\ExtensionTok{HTTP}\NormalTok{ request sent, awaiting response... 200 OK} -\ExtensionTok{Length}\NormalTok{: 13743592907 (13G) [}\ExtensionTok{application}\NormalTok{/}\ExtensionTok{x{-}gzip}\NormalTok{]} -\ExtensionTok{Saving}\NormalTok{ to: ‘win10.tar.gz.5’} - -\ExtensionTok{win10.tar.gz.5}\NormalTok{ 100\%[==============================================}\OperatorTok{\textgreater{}}\NormalTok{] 12.80G 110MB/s in 2m 0s } - -\ExtensionTok{2020{-}05{-}20}\NormalTok{ 10:01:52 (110 MB/s) }\ExtensionTok{{-}}\NormalTok{ ‘win10.tar.gz.5’ saved [13743592907/13743592907]} - - - \ExtensionTok{Performance}\NormalTok{ counter stats for }\StringTok{\textquotesingle{}wget http://debian1.home/win10.tar.gz\textquotesingle{}}\NormalTok{ (4 runs)}\BuiltInTok{:} - - \ExtensionTok{46}\NormalTok{,792.73 msec task{-}clock \# 0.390 CPUs utilized ( +{-} 0.64\% )} - \ExtensionTok{417}\NormalTok{,641 context{-}switches \# 0.009 M/sec ( +{-} 0.31\% )} - \ExtensionTok{18}\NormalTok{ cpu{-}migrations \# 0.000 K/sec ( +{-} 8.25\% )} - \ExtensionTok{292}\NormalTok{ page{-}faults \# 0.006 K/sec ( +{-} 0.30\% )} - \ExtensionTok{61}\NormalTok{,311,321,905 cycles \# 1.310 GHz ( +{-} 0.25\% ) }\KeywordTok{(}\ExtensionTok{49.71\%}\KeywordTok{)} - \ExtensionTok{55}\NormalTok{,652,602,418 instructions \# 0.91 insn per cycle ( +{-} 0.20\% ) }\KeywordTok{(}\ExtensionTok{61.93\%}\KeywordTok{)} - \ExtensionTok{10}\NormalTok{,835,524,321 branches \# 231.564 M/sec ( +{-} 0.14\% ) }\KeywordTok{(}\ExtensionTok{62.04\%}\KeywordTok{)} - \ExtensionTok{229}\NormalTok{,073,690 branch{-}misses \# 2.11\% of all branches ( +{-} 1.03\% ) }\KeywordTok{(}\ExtensionTok{62.77\%}\KeywordTok{)} - \ExtensionTok{16}\NormalTok{,218,621,768 L1{-}dcache{-}loads \# 346.606 M/sec ( +{-} 0.16\% ) }\KeywordTok{(}\ExtensionTok{62.94\%}\KeywordTok{)} - \ExtensionTok{1}\NormalTok{,767,713,664 L1{-}dcache{-}load{-}misses \# 10.90\% of all L1{-}dcache hits ( +{-} 0.17\% ) }\KeywordTok{(}\ExtensionTok{62.78\%}\KeywordTok{)} - \ExtensionTok{392}\NormalTok{,258,789 LLC{-}loads \# 8.383 M/sec ( +{-} 1.79\% ) }\KeywordTok{(}\ExtensionTok{50.19\%}\KeywordTok{)} - \ExtensionTok{113}\NormalTok{,116,138 LLC{-}load{-}misses \# 28.84\% of all LL{-}cache hits ( +{-} 0.25\% ) }\KeywordTok{(}\ExtensionTok{49.57\%}\KeywordTok{)} - - \ExtensionTok{119.871}\NormalTok{ +{-} 0.235 seconds time elapsed ( +{-} 0.20\% )} -\end{Highlighting} -\end{Shaded} - -\hypertarget{tests-de-performance-du-protocole-de-transfert-de-fichiers-ftp}{% -\subsection{\texorpdfstring{Tests de performance du protocole de -transfert de fichiers -\protect\hyperlink{acronym__FTP}{FTP}}{Tests de performance du protocole de transfert de fichiers FTP}}\label{tests-de-performance-du-protocole-de-transfert-de-fichiers-ftp}} - -Le serveur \protect\hyperlink{acronym__FTP}{FTP} \texttt{vsftpd} a été -installé sur la machine \texttt{debian1} avec la commande suivante: - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{apt}\NormalTok{ install vsftpd} -\end{Highlighting} -\end{Shaded} - -Le client \protect\hyperlink{acronym__FTP}{FTP} \texttt{ftp} a été -installé sur la machine \texttt{debian2} avec la commande suivante: - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{apt}\NormalTok{ install ftp} -\end{Highlighting} -\end{Shaded} - -Par défaut, un utilisateur se connecte sur son dossier \texttt{home} sur -le serveur, donc il n'y a pas besoin de créer de configuration spéciale -car le fichier à \texttt{win10.tar.gz} est déjà présent dans le dossier -\texttt{/home/debian}. La commande suivante est lancée pour mesurer le -temps de transfert: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\ExtensionTok{perf}\NormalTok{ stat {-}r 4 {-}d lftp {-}u debian,debian {-}e }\StringTok{"get {-}e win10.tar.gz;quit"}\NormalTok{ debian1.home} -\ExtensionTok{13743592907}\NormalTok{ bytes transferred in 120 seconds (109.61 MiB/s) } -\ExtensionTok{13743592907}\NormalTok{ bytes transferred in 120 seconds (109.11 MiB/s) } -\ExtensionTok{13743592907}\NormalTok{ bytes transferred in 120 seconds (108.81 MiB/s) } -\ExtensionTok{13743592907}\NormalTok{ bytes transferred in 120 seconds (109.01 MiB/s) } - - \ExtensionTok{Performance}\NormalTok{ counter stats for }\StringTok{\textquotesingle{}lftp {-}u debian,debian {-}e get {-}e win10.tar.gz;quit debian1.home\textquotesingle{}}\NormalTok{ (4 runs)}\BuiltInTok{:} - - \ExtensionTok{43}\NormalTok{,760.05 msec task{-}clock \# 0.364 CPUs utilized ( +{-} 3.19\% )} - \ExtensionTok{416}\NormalTok{,480 context{-}switches \# 0.010 M/sec ( +{-} 0.21\% )} - \ExtensionTok{20}\NormalTok{ cpu{-}migrations \# 0.000 K/sec ( +{-} 17.44\% )} - \ExtensionTok{768}\NormalTok{ page{-}faults \# 0.018 K/sec ( +{-} 1.76\% )} - \ExtensionTok{50}\NormalTok{,319,107,200 cycles \# 1.150 GHz ( +{-} 1.87\% ) }\KeywordTok{(}\ExtensionTok{49.42\%}\KeywordTok{)} - \ExtensionTok{41}\NormalTok{,925,907,326 instructions \# 0.83 insn per cycle ( +{-} 2.58\% ) }\KeywordTok{(}\ExtensionTok{61.97\%}\KeywordTok{)} - \ExtensionTok{8}\NormalTok{,345,354,967 branches \# 190.707 M/sec ( +{-} 2.51\% ) }\KeywordTok{(}\ExtensionTok{62.63\%}\KeywordTok{)} - \ExtensionTok{192}\NormalTok{,939,322 branch{-}misses \# 2.31\% of all branches ( +{-} 3.57\% ) }\KeywordTok{(}\ExtensionTok{62.66\%}\KeywordTok{)} - \ExtensionTok{12}\NormalTok{,148,795,763 L1{-}dcache{-}loads \# 277.623 M/sec ( +{-} 2.11\% ) }\KeywordTok{(}\ExtensionTok{63.06\%}\KeywordTok{)} - \ExtensionTok{1}\NormalTok{,646,404,955 L1{-}dcache{-}load{-}misses \# 13.55\% of all L1{-}dcache hits ( +{-} 0.76\% ) }\KeywordTok{(}\ExtensionTok{62.79\%}\KeywordTok{)} - \ExtensionTok{516}\NormalTok{,891,020 LLC{-}loads \# 11.812 M/sec ( +{-} 0.79\% ) }\KeywordTok{(}\ExtensionTok{49.87\%}\KeywordTok{)} - \ExtensionTok{112}\NormalTok{,961,435 LLC{-}load{-}misses \# 21.85\% of all LL{-}cache hits ( +{-} 0.29\% ) }\KeywordTok{(}\ExtensionTok{49.56\%}\KeywordTok{)} - - \ExtensionTok{120.151}\NormalTok{ +{-} 0.213 seconds time elapsed ( +{-} 0.18\% )} -\end{Highlighting} -\end{Shaded} - -\hypertarget{tests-de-performance-du-protocole-de-transfert-de-fichiers-nfs}{% -\subsection{\texorpdfstring{Tests de performance du protocole de -transfert de fichiers -\protect\hyperlink{acronym__NFS}{NFS}}{Tests de performance du protocole de transfert de fichiers NFS}}\label{tests-de-performance-du-protocole-de-transfert-de-fichiers-nfs}} - -Le serveur \protect\hyperlink{acronym__NFS}{NFS} est installé et -configuré avec les commandes suivantes sur \texttt{debian1}: - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{apt}\NormalTok{ install nfs{-}kernel{-}server} -\FunctionTok{mkdir}\NormalTok{ /nfsroot} -\FunctionTok{cp}\NormalTok{ win10.tar.gz /nfsroot/} -\BuiltInTok{echo} \StringTok{\textquotesingle{}/nfsroot/ *(rw,fsid=0,no\_root\_squash,no\_subtree\_check,async,insecure)\textquotesingle{}} \OperatorTok{\textgreater{}\textgreater{}}\NormalTok{ /etc/exports} -\ExtensionTok{systemctl}\NormalTok{ restart nfs{-}server} -\end{Highlighting} -\end{Shaded} - -Le client partage est monté sur le client \texttt{debian2} avec les -commandes suivantes: - -\begin{Shaded} -\begin{Highlighting}[] -\FunctionTok{su} -\ExtensionTok{apt}\NormalTok{ install nfs{-}common} -\FunctionTok{mkdir}\NormalTok{ /nfsroot} -\FunctionTok{mount}\NormalTok{ {-}t nfs debian1.home:/nfsroot /nfsroot} -\BuiltInTok{exit} -\end{Highlighting} -\end{Shaded} - -Finalement, le benchmark de la copie a été lancé sur \texttt{debian2}: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\ExtensionTok{perf}\NormalTok{ stat {-}r 4 {-}d cp {-}f /nfsroot/win10.tar.gz \textasciitilde{}/win10.tar.gz} - - \ExtensionTok{Performance}\NormalTok{ counter stats for }\StringTok{\textquotesingle{}cp {-}f /nfsroot/win10.tar.gz /home/debian/win10.tar.gz\textquotesingle{}}\NormalTok{ (4 runs)}\BuiltInTok{:} - - \ExtensionTok{17}\NormalTok{,076.43 msec task{-}clock \# 0.142 CPUs utilized ( +{-} 7.26\% )} - \ExtensionTok{13}\NormalTok{,716 context{-}switches \# 0.803 K/sec ( +{-} 3.93\% )} - \ExtensionTok{3}\NormalTok{ cpu{-}migrations \# 0.000 K/sec ( +{-} 22.88\% )} - \ExtensionTok{360}\NormalTok{ page{-}faults \# 0.021 K/sec ( +{-} 0.24\% )} - \ExtensionTok{29}\NormalTok{,329,681,962 cycles \# 1.718 GHz ( +{-} 0.84\% ) }\KeywordTok{(}\ExtensionTok{50.10\%}\KeywordTok{)} - \ExtensionTok{39}\NormalTok{,303,308,222 instructions \# 1.34 insn per cycle ( +{-} 0.27\% ) }\KeywordTok{(}\ExtensionTok{62.64\%}\KeywordTok{)} - \ExtensionTok{7}\NormalTok{,592,336,916 branches \# 444.609 M/sec ( +{-} 0.28\% ) }\KeywordTok{(}\ExtensionTok{62.68\%}\KeywordTok{)} - \ExtensionTok{79}\NormalTok{,751,186 branch{-}misses \# 1.05\% of all branches ( +{-} 0.28\% ) }\KeywordTok{(}\ExtensionTok{62.46\%}\KeywordTok{)} - \ExtensionTok{10}\NormalTok{,749,309,904 L1{-}dcache{-}loads \# 629.482 M/sec ( +{-} 0.40\% ) }\KeywordTok{(}\ExtensionTok{62.54\%}\KeywordTok{)} - \ExtensionTok{1}\NormalTok{,097,825,933 L1{-}dcache{-}load{-}misses \# 10.21\% of all L1{-}dcache hits ( +{-} 1.45\% ) }\KeywordTok{(}\ExtensionTok{62.44\%}\KeywordTok{)} - \ExtensionTok{230}\NormalTok{,105,352 LLC{-}loads \# 13.475 M/sec ( +{-} 1.25\% ) }\KeywordTok{(}\ExtensionTok{49.92\%}\KeywordTok{)} - \ExtensionTok{13}\NormalTok{,665,720 LLC{-}load{-}misses \# 5.94\% of all LL{-}cache hits ( +{-} 8.55\% ) }\KeywordTok{(}\ExtensionTok{49.87\%}\KeywordTok{)} - - \ExtensionTok{120.417}\NormalTok{ +{-} 0.119 seconds time elapsed ( +{-} 0.10\% )} -\end{Highlighting} -\end{Shaded} - -\hypertarget{tests-de-performance-du-protocole-de-transfert-de-fichiers-smb}{% -\subsection{\texorpdfstring{Tests de performance du protocole de -transfert de fichiers -\protect\hyperlink{acronym__SMB}{SMB}}{Tests de performance du protocole de transfert de fichiers SMB}}\label{tests-de-performance-du-protocole-de-transfert-de-fichiers-smb}} - -Le serveur \protect\hyperlink{acronym__SMB}{SMB} \texttt{samba} est -installé et configuré avec les commandes suivantes sur \texttt{debian1}: - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{apt}\NormalTok{ install samba} -\ExtensionTok{smbpasswd}\NormalTok{ {-}a debian } -\FunctionTok{cat} \StringTok{\textquotesingle{}[debian]} -\StringTok{path = /home/debian} -\StringTok{valid users = debian} -\StringTok{read only = no\textquotesingle{}} \OperatorTok{\textgreater{}\textgreater{}}\NormalTok{ /etc/samba/smb.conf} -\ExtensionTok{systemctl}\NormalTok{ restart smbd} -\end{Highlighting} -\end{Shaded} - -Le client \protect\hyperlink{acronym__SMB}{SMB} \texttt{samba} est -installé sur le client avec la commande suivante: - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{apt}\NormalTok{ install samba{-}client} -\end{Highlighting} -\end{Shaded} - -Finalement, le benchmark de la copie est lancé sur \texttt{debian2}: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\ExtensionTok{perf}\NormalTok{ stat {-}r 4 {-}d smbclient {-}U debian\%debian //debian1.home/debian {-}c }\StringTok{\textquotesingle{}get win10.tar.gz\textquotesingle{}} -\ExtensionTok{Unable}\NormalTok{ to initialize messaging context} -\ExtensionTok{getting}\NormalTok{ file \textbackslash{}win10.tar.gz of size 13743592907 as win10.tar.gz (109684.9 KiloBytes/sec) }\KeywordTok{(}\ExtensionTok{average}\NormalTok{ 109684.9 KiloBytes/sec}\KeywordTok{)} -\ExtensionTok{Unable}\NormalTok{ to initialize messaging context} -\ExtensionTok{getting}\NormalTok{ file \textbackslash{}win10.tar.gz of size 13743592907 as win10.tar.gz (109443.4 KiloBytes/sec) }\KeywordTok{(}\ExtensionTok{average}\NormalTok{ 109443.4 KiloBytes/sec}\KeywordTok{)} -\ExtensionTok{Unable}\NormalTok{ to initialize messaging context} -\ExtensionTok{getting}\NormalTok{ file \textbackslash{}win10.tar.gz of size 13743592907 as win10.tar.gz (110095.1 KiloBytes/sec) }\KeywordTok{(}\ExtensionTok{average}\NormalTok{ 110095.1 KiloBytes/sec}\KeywordTok{)} -\ExtensionTok{Unable}\NormalTok{ to initialize messaging context} -\ExtensionTok{getting}\NormalTok{ file \textbackslash{}win10.tar.gz of size 13743592907 as win10.tar.gz (109244.7 KiloBytes/sec) }\KeywordTok{(}\ExtensionTok{average}\NormalTok{ 109244.7 KiloBytes/sec}\KeywordTok{)} - - \ExtensionTok{Performance}\NormalTok{ counter stats for }\StringTok{\textquotesingle{}smbclient {-}U debian\%debian //debian1.home/debian {-}c get win10.tar.gz\textquotesingle{}}\NormalTok{ (4 runs)}\BuiltInTok{:} - - \ExtensionTok{35}\NormalTok{,488.67 msec task{-}clock \# 0.290 CPUs utilized ( +{-} 0.49\% )} - \ExtensionTok{352}\NormalTok{,535 context{-}switches \# 0.010 M/sec ( +{-} 0.24\% )} - \ExtensionTok{14}\NormalTok{ cpu{-}migrations \# 0.000 K/sec ( +{-} 19.12\% )} - \ExtensionTok{3}\NormalTok{,915 page{-}faults \# 0.110 K/sec ( +{-} 3.20\% )} - \ExtensionTok{35}\NormalTok{,420,663,303 cycles \# 0.998 GHz ( +{-} 0.45\% ) }\KeywordTok{(}\ExtensionTok{50.50\%}\KeywordTok{)} - \ExtensionTok{35}\NormalTok{,124,728,140 instructions \# 0.99 insn per cycle ( +{-} 2.40\% ) }\KeywordTok{(}\ExtensionTok{62.99\%}\KeywordTok{)} - \ExtensionTok{6}\NormalTok{,843,251,403 branches \# 192.829 M/sec ( +{-} 2.43\% ) }\KeywordTok{(}\ExtensionTok{62.60\%}\KeywordTok{)} - \ExtensionTok{115}\NormalTok{,346,267 branch{-}misses \# 1.69\% of all branches ( +{-} 1.05\% ) }\KeywordTok{(}\ExtensionTok{62.27\%}\KeywordTok{)} - \ExtensionTok{9}\NormalTok{,922,177,546 L1{-}dcache{-}loads \# 279.587 M/sec ( +{-} 1.82\% ) }\KeywordTok{(}\ExtensionTok{61.98\%}\KeywordTok{)} - \ExtensionTok{1}\NormalTok{,307,137,276 L1{-}dcache{-}load{-}misses \# 13.17\% of all L1{-}dcache hits ( +{-} 0.23\% ) }\KeywordTok{(}\ExtensionTok{62.22\%}\KeywordTok{)} - \ExtensionTok{437}\NormalTok{,456,998 LLC{-}loads \# 12.327 M/sec ( +{-} 4.03\% ) }\KeywordTok{(}\ExtensionTok{50.00\%}\KeywordTok{)} - \ExtensionTok{159}\NormalTok{,643,085 LLC{-}load{-}misses \# 36.49\% of all LL{-}cache hits ( +{-} 8.69\% ) }\KeywordTok{(}\ExtensionTok{50.44\%}\KeywordTok{)} - - \ExtensionTok{122.565}\NormalTok{ +{-} 0.215 seconds time elapsed ( +{-} 0.18\% )} -\end{Highlighting} -\end{Shaded} - -\hypertarget{tests-de-performance-du-protocole-de-transfert-de-fichiers-ipfs}{% -\subsection{\texorpdfstring{Tests de performance du protocole de -transfert de fichiers -\protect\hyperlink{acronym__IPFS}{IPFS}}{Tests de performance du protocole de transfert de fichiers IPFS}}\label{tests-de-performance-du-protocole-de-transfert-de-fichiers-ipfs}} - -Sur chacune des machines, le langage \emph{Go} doit être installé avec -les commandes suivantes: - -\begin{Shaded} -\begin{Highlighting}[] -\FunctionTok{wget}\NormalTok{ https://dl.google.com/go/go1.14.3.linux{-}amd64.tar.gz} -\FunctionTok{tar}\NormalTok{ {-}C /usr/local {-}xzf go1.14.3.linux{-}amd64.tar.gz} -\BuiltInTok{echo} \StringTok{\textquotesingle{}export PATH=$PATH:/usr/local/go/bin\textquotesingle{}} \OperatorTok{\textgreater{}\textgreater{}}\NormalTok{ /etc/profile} -\BuiltInTok{export} \VariableTok{PATH=$PATH}\NormalTok{:/usr/local/go/bin} -\end{Highlighting} -\end{Shaded} - -Ensuite, \protect\hyperlink{acronym__IPFS}{IPFS} est installé sur -chacune des machines: - -\begin{Shaded} -\begin{Highlighting}[] -\FunctionTok{wget}\NormalTok{ https://dist.ipfs.io/go{-}ipfs/v0.5.1/go{-}ipfs\_v0.5.1\_linux{-}amd64.tar.gz} -\FunctionTok{tar}\NormalTok{ xvzf go{-}ipfs\_v0.5.1\_linux{-}amd64.tar.gz} -\FunctionTok{mv}\NormalTok{ go{-}ipfs/ipfs /usr/local/bin/ipfs} -\end{Highlighting} -\end{Shaded} - -Un noeud \protect\hyperlink{acronym__IPFS}{IPFS} est ensuite initialisé -sur chacune des machines: - -\begin{Shaded} -\begin{Highlighting}[] -\VariableTok{IPFS\_PATH=}\NormalTok{\textasciitilde{}/.ipfs }\ExtensionTok{ipfs}\NormalTok{ init} -\end{Highlighting} -\end{Shaded} - -Pour avoir un réseau IPFS privé, on génère une clé de \emph{swarm} sur -\texttt{debian1} et on la copie sur \texttt{debian2}, en lançant les -commandes suivantes sur la machine \texttt{debian1}: - -\begin{Shaded} -\begin{Highlighting}[] -\BuiltInTok{echo}\NormalTok{ {-}e }\StringTok{"/key/swarm/psk/1.0.0/\textbackslash{}n/base16/\textbackslash{}n}\KeywordTok{\textasciigrave{}}\FunctionTok{tr}\NormalTok{ {-}dc }\StringTok{\textquotesingle{}a{-}f0{-}9\textquotesingle{}} \OperatorTok{\textless{}}\NormalTok{ /dev/urandom }\KeywordTok{|} \FunctionTok{head}\NormalTok{ {-}c64}\KeywordTok{\textasciigrave{}}\StringTok{"} \OperatorTok{\textgreater{}}\NormalTok{ \textasciitilde{}/.ipfs/swarm.key} -\FunctionTok{scp}\NormalTok{ /home/debian/.ipfs/swarm.key debian2.home:/home/debian/.ipfs/swarm.key} -\end{Highlighting} -\end{Shaded} - -Maintenant, il faut configurer un noeud d'amorçage (\emph{bootstrap -node}) sur \texttt{debian1}, qui sera utilisé par \texttt{debian2} pour -se connecter au réseau \protect\hyperlink{acronym__IPFS}{IPFS} privé -séparé du réseau public qui utilise d'autres noeuds d'amorçage. Pour -faire cela, il faut commencer par supprimer la liste des noeuds -d'amorçage publics sur les deux machines avec la commande suivante: - -\begin{Shaded} -\begin{Highlighting}[] -\VariableTok{IPFS\_PATH=}\NormalTok{\textasciitilde{}/.ipfs }\ExtensionTok{ipfs}\NormalTok{ bootstrap rm {-}{-}all} -\end{Highlighting} -\end{Shaded} - -Ensuite, il faut récupérer l'identifiant unique \texttt{PeerID} de -\texttt{debian1} pour pouvoir le configurer comme un noeud d'amorçage -dans \texttt{debian2}. La commande suivante est lancée sur -\texttt{debian1}: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\VariableTok{IPFS\_PATH=}\NormalTok{\textasciitilde{}/.ipfs }\ExtensionTok{ipfs}\NormalTok{ config show }\KeywordTok{|} \FunctionTok{grep} \StringTok{"PeerID"} - \StringTok{"PeerID"}\NormalTok{: }\StringTok{"QmX9MYUQhjKxua6HQMtpzaZd9ui4gGT75FJgAxeQJC47Ei"} -\end{Highlighting} -\end{Shaded} - -L'identitfiant unique \texttt{PeerID} de \texttt{debian1} retourné par -la commande est: - -\texttt{QmX9MYUQhjKxua6HQMtpzaZd9ui4gGT75FJgAxeQJC47Ei} - -On peutmaintenant le rajouter dans la configuration des noeuds -d'amorçage des deux machines en lançant la commande suivante sur chacune -d'entre elle: - -\begin{Shaded} -\begin{Highlighting}[] -\VariableTok{IPFS\_PATH=}\NormalTok{\textasciitilde{}/.ipfs }\ExtensionTok{ipfs}\NormalTok{ bootstrap add /dnsaddr/debian1.home/p2p/QmX9MYUQhjKxua6HQMtpzaZd9ui4gGT75FJgAxeQJC47Ei} -\end{Highlighting} -\end{Shaded} - -Maintenant, le \emph{daemon} \protect\hyperlink{acronym__IPFS}{IPFS} -peut être lancé sur chacune des machines. La variable d'environnement -\texttt{LIBP2P\_FORCE\_PNET=1} est définie pour forcer les échanges à se -faire sur un réseau privé. - -\begin{Shaded} -\begin{Highlighting}[] -\BuiltInTok{export} \VariableTok{LIBP2P\_FORCE\_PNET=}\NormalTok{1} -\VariableTok{IPFS\_PATH=}\NormalTok{\textasciitilde{}/.ipfs }\ExtensionTok{ipfs}\NormalTok{ daemon} -\end{Highlighting} -\end{Shaded} - -Dans ce cas, le \emph{daemon} a été exécuté en avant plan et un second -terminal sera ouvert pour la suite des commandes. Dans une configuration -plus durable, il faudrait le faire tourner en arrière plan, par exemple -avec une unité systemd. - -Maintenant on peut partager l'image sur le réseau avec la commande -suivante sur \texttt{debian1}: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\VariableTok{IPFS\_PATH=}\NormalTok{\textasciitilde{}/.ipfs }\ExtensionTok{ipfs}\NormalTok{ add win10.tar.gz } -\ExtensionTok{added}\NormalTok{ QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv win10.tar.gz} - \ExtensionTok{12.80}\NormalTok{ GiB / 12.80 GiB [==============================================================================] 100.00\%} -\end{Highlighting} -\end{Shaded} - -Le temps d'ajout de l'image a pris plus de trois minutes. À la fin, la -référence du fichier, qui l'identifie de manière unique sur le réseau, -est affichée: \texttt{QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv}. - -On peut maintenant tenter de récupérer le fichier depuis -\texttt{debian2}: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{$ }\VariableTok{IPFS\_PATH=}\NormalTok{\textasciitilde{}/.ipfs }\ExtensionTok{ipfs}\NormalTok{ get QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv} -\ExtensionTok{Saving}\NormalTok{ file(s) }\ExtensionTok{to}\NormalTok{ QmRm8As8ECuQoLq3UWowsxJ8mh89txLvpUh7A2mgw5pMhv} - \ExtensionTok{12.80}\NormalTok{ GiB / 12.80 GiB [==============================================================================] 100.00\% 7m27s} -\end{Highlighting} -\end{Shaded} - -Le transfert a pris \(7m27s = 447s\). C'est beaucoup trop long pour nos -besoins. Le benchmark avec \texttt{perf} n'a même pas été effectué au vu -de ce résultat. - -\hypertarget{choix-du-protocole-de-transfert-de-fichiers}{% -\subsection{Choix du protocole de transfert de -fichiers}\label{choix-du-protocole-de-transfert-de-fichiers}} - -La table \ref{table_protocols} ainsi que la figure \ref{chart_protocols} -récapitulent les résultats mesurés pour chacun des protocoles testés. On -peut remarquer que pour tous les protocoles, sauf -\protect\hyperlink{acronym__IPFS}{IPFS}, les résultats sont proches de -120 secondes. Cette durée montre que pour ces protocoles, on est proches -de la limite théorique de gigabit ethernet: - -\[ \frac{13743592907 [B]}{120 [s]} = \frac{109948743256 [b]}{120 [s]} \approx 916239527 [b/s] \approx 0.916 [Gb/s] \approx 1 [Gb/s] \] - -On peut donc conclure que le choix du protocole -\protect\hyperlink{acronym__NFS}{NFS} est approprié car les autres -protocole n'accélèrent pas considérablement la vitesse de transfert -d'une image. - -\clearpage - -\begin{longtable}[]{@{}llll@{}} -\caption{Table des mesures de la durée de la copie d'un fichier avec -différents protocoles \label{table_protocols}}\tabularnewline -\toprule -\begin{minipage}[b]{0.22\columnwidth}\raggedright -Protocole\strut -\end{minipage} & \begin{minipage}[b]{0.22\columnwidth}\raggedright -Durée (secondes)\strut -\end{minipage} & \begin{minipage}[b]{0.22\columnwidth}\raggedright -Écart entre les mesures (± secondes)\strut -\end{minipage} & \begin{minipage}[b]{0.22\columnwidth}\raggedright -Nombre de mesures\strut -\end{minipage}\tabularnewline -\midrule -\endfirsthead -\toprule -\begin{minipage}[b]{0.22\columnwidth}\raggedright -Protocole\strut -\end{minipage} & \begin{minipage}[b]{0.22\columnwidth}\raggedright -Durée (secondes)\strut -\end{minipage} & \begin{minipage}[b]{0.22\columnwidth}\raggedright -Écart entre les mesures (± secondes)\strut -\end{minipage} & \begin{minipage}[b]{0.22\columnwidth}\raggedright -Nombre de mesures\strut -\end{minipage}\tabularnewline -\midrule -\endhead -\begin{minipage}[t]{0.22\columnwidth}\raggedright -SCP\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -119.8094\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -0.0182\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -4\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.22\columnwidth}\raggedright -HTTP\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -119.871\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -0.235\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -4\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.22\columnwidth}\raggedright -FTP\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -120.151\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -0.213\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -4\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.22\columnwidth}\raggedright -NFS\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -120.417\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -0.119\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -4\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.22\columnwidth}\raggedright -SMB\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -122.565\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -0.215\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -4\strut -\end{minipage}\tabularnewline -\begin{minipage}[t]{0.22\columnwidth}\raggedright -IPFS\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -447\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -0\strut -\end{minipage} & \begin{minipage}[t]{0.22\columnwidth}\raggedright -1\strut -\end{minipage}\tabularnewline -\bottomrule -\end{longtable} - -\begin{figure} -\centering -\includegraphics{charts/chart_protocols.svg} -\caption{Graphique des mesures de la durée de la copie d'un fichier avec -différents protocoles\label{chart_protocols}} -\end{figure} - -\clearpage - -\hypertarget{ruxe9duction-de-la-taille-des-images}{% -\section{Réduction de la taille des -images}\label{ruxe9duction-de-la-taille-des-images}} - -Dans le système initial, une image prend beaucoup de place. Chaque image -est une copie exacte des partitions d'un système effectuée avec l'outil -\texttt{dd}, qui est ensuite compressée avec \texttt{gzip}. Cette taille -massive a plusieurs impacts négatifs: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - Ralentissement de la vitesse de déploiement: il y a plus de données à - transmettre à travers le réseau et à copier sur le disque à chaque - déploiement. -\item - Réduction du nombre d'images pouvant être mise en cache en même temps. -\item - Réduction du nombre d'images pouvant être stockées sur le serveur. -\end{enumerate} - -L'outil \emph{Clonezilla} a été considéré pour créer des images de -taille plus réduites. Les images clonezilla sont créées avec l'outil -\emph{Partclone}. Cet outil utilise une approche différente de -\texttt{dd}: seuls les blocs utilisés sur les partitions sont copiés -dans le fichier de l'image et seuls les blocs utilisés sont ensuite -restaurés. Les images contentant uniquement les blocs utilisés sont -ensuite compressées avec \texttt{gzip}. - -La taille des images créées avec clonezilla a été comparée à la taille -des images déployées et à la taille des images juste compressées avec -\texttt{gzip}, avec trois images: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - Une petite image (environ 3.2 GB) du système \emph{Debian}, dont les - tailles sont comparées dans le tableau \ref{table_image_sizes_debian} - et la figure \ref{chart_image_sizes_debian} -\item - Une image moyenne (environ 200GB) du système \emph{Xubuntu}, dont les - tailles sont comparées dans le tableau \ref{table_image_sizes_xubuntu} - et la figure \ref{chart_image_sizes_xubuntu} -\item - Une grande image (environ 512GB) du système \emph{Windows 10}, dont - les tailles sont comparées dans le tableau - \ref{table_image_sizes_win10} et la figure - \ref{chart_image_sizes_win10} -\end{enumerate} - -\clearpage - -\begin{longtable}[]{@{}ll@{}} -\caption{Table des tailles d'une petite image \emph{Debian} dans -plusieurs formats \label{table_image_sizes_debian}}\tabularnewline -\toprule -Type & Taille (GB)\tabularnewline -\midrule -\endfirsthead -\toprule -Type & Taille (GB)\tabularnewline -\midrule -\endhead -Déployé & 3.220176384\tabularnewline -Gzip & 0.496763976\tabularnewline -Clonezilla & 0.29615293\tabularnewline -\bottomrule -\end{longtable} - -\begin{figure} -\centering -\includegraphics{charts/chart_image_sizes_debian.svg} -\caption{Graphique des tailles d'une petite image \emph{Debian} dans -plusieurs formats\label{chart_image_sizes_debian}} -\end{figure} - -\clearpage - -\begin{longtable}[]{@{}ll@{}} -\caption{Table des tailles d'une image \emph{Xubuntu} moyenne dans -plusieurs formats \label{table_image_sizes_xubuntu}}\tabularnewline -\toprule -Type & Taille (GB)\tabularnewline -\midrule -\endfirsthead -\toprule -Type & Taille (GB)\tabularnewline -\midrule -\endhead -Déployé & 200.511847936\tabularnewline -Gzip & 2.031040094\tabularnewline -Clonezilla & 1.840064982\tabularnewline -\bottomrule -\end{longtable} - -\begin{figure} -\centering -\includegraphics{charts/chart_image_sizes_xubuntu.svg} -\caption{Graphique des tailles d'une image \emph{Xubuntu} moyenne dans -plusieurs formats\label{chart_image_sizes_xubuntu}} -\end{figure} - -\clearpage - -\begin{longtable}[]{@{}ll@{}} -\caption{Table des tailles d'une grande image \emph{Windows 10} dans -plusieurs formats \label{table_image_sizes_win10}}\tabularnewline -\toprule -Type & Taille (GB)\tabularnewline -\midrule -\endfirsthead -\toprule -Type & Taille (GB)\tabularnewline -\midrule -\endhead -Déployé & 512.09515776\tabularnewline -Gzip & 31.9568621077\tabularnewline -Clonezilla & 12.855020882\tabularnewline -\bottomrule -\end{longtable} - -\begin{figure} -\centering -\includegraphics{charts/chart_image_sizes_win10.svg} -\caption{Graphique des tailles d'une grande image \emph{Windows 10} dans -plusieurs formats\label{chart_image_sizes_win10}} -\end{figure} - -On peut voir que les images créées avec \emph{Clonezilla} prennent -environ la moitié de la taille des images simplement compressées avec -\texttt{gzip}. Les résultats de ces mesures de tailles ont donc motivé -la modification du système de déploiement pour que des images -\emph{Clonezilla} puissent être utilisées. - -\hypertarget{amuxe9lioration-de-los-de-duxe9ploiement}{% -\section{Amélioration de l'OS de -déploiement}\label{amuxe9lioration-de-los-de-duxe9ploiement}} - -\hypertarget{buildroot-loutil-de-construction-de-los-de-duxe9ploiement-initial}{% -\subsection{\texorpdfstring{\emph{Buildroot}: l'outil de construction de -l'\protect\hyperlink{acronym__OS}{OS} de déploiement -initial}{Buildroot: l'outil de construction de l'OS de déploiement initial}}\label{buildroot-loutil-de-construction-de-los-de-duxe9ploiement-initial}} - -L'image du système d'exploitation \emph{Linux} servant à l'exécution des -scripts de déploiement dans le système initial est construit avec -\emph{Buildroot}. Cet outil permet de générer compiler un noyau linux, -de créer un système de fichier racine minimal et de générer un chargeur -d'amorçage (\emph{bootloader}). Cet outil est principalement utilisé -pour générer des systèmes embarqués. Il avait été choisi dans le système -initial car il permettait de créer une image -d'\protect\hyperlink{acronym__OS}{OS} très petite qui peut être -téléchargée très rapidement sur le réseau. - -\hypertarget{probluxe8mes-avec_buildroot_-pour-construire-los-de-duxe9ploiement}{% -\subsection{\texorpdfstring{Problèmes avec\_Buildroot\_ pour construire -l'\protect\hyperlink{acronym__OS}{OS} de -déploiement}{Problèmes avec\_Buildroot\_ pour construire l'OS de déploiement}}\label{probluxe8mes-avec_buildroot_-pour-construire-los-de-duxe9ploiement}} - -Buildroot permet d'installer facilement les paquets de nombreuses -applications dans le système de fichiers de l'image. Malheureusement, -aucun paquet n'existe pour \emph{Clonezilla}. L'idée de créer un paquet -pour ce logiciel a été étudiée, mais n'a pas été retenue, car il -nécessite de nombreuses dépendances, et bien que cela aurait été -possible de le faire, le temps à investir dans cette tâche aurait été -considérable, et le résultat n'aurait été testable qu'une fois cette -tâche accomplie. De plus, pour chaque mise à jour de \emph{Clonezilla} -que l'on souhaiterait utiliser, par exemple pour profiter de -l'implémentation d'un nouveau système de fichier ou des résolutions de -bugs, il faudrait remettre à jour ce paquet. - -\hypertarget{choix-de-debian-pour-remplauxe7er-buildroot}{% -\subsection{\texorpdfstring{Choix de \emph{Debian} pour remplaçer -\emph{Buildroot}}{Choix de Debian pour remplaçer Buildroot}}\label{choix-de-debian-pour-remplauxe7er-buildroot}} - -Pour simplifier l'utilisation de \emph{Clonezilla} et de nombreux autres -outils, le passsage à une solution alternative à \emph{Buildroot} a été -décidé. De nombreuses distributions Linux proposent des paquets pour -\emph{Clonezilla}. Les plus intéressantes sont \emph{Debian} et -\emph{Ubuntu} car l'équipe de \emph{Clonezilla} les utilise pour la -version \emph{live-CD} de l'outil. Ils développent et distribuent -eux-mêmes des paquets au format \texttt{deb} pour ces deux -distributions. Un travail a donc été entrepris pour remplacer -l'\protect\hyperlink{acronym__OS}{OS} de déploiement basé sur -\emph{Buildroot} par un \protect\hyperlink{acronym__OS}{OS} basé sur -\emph{Debian}. Ce choix permettra d'utiliser facilement les nombreux -paquets disponibles pour cette distribution si il y en a besoin dans les -versions futures du système de déploiement. - -Le problème avec l'utilisation d'une distribution telle que -\emph{Debian} est que la taille du système de fichiers racine n'est pas -aussi réduite que ce que l'on peut obtenir avec \emph{Buildroot}. La -stratégie d'exécution du système d'exploitation a donc été modifiée pour -tenir compte de ce changement de taille. Le système initial chargeait à -chaque fois une image entière du système de fichiers racine (environ -100MB) en mémoire. Sur le nouveau système, seul le noyau linux est -téléchargé, ainsi que l'image \emph{initrd}. Le sytème de fichier racine -est monté à partir d'un partage \protect\hyperlink{acronym__NFS}{NFS}. -Cela permet d'avoir un système de fichiers racine contenant beaucoup -plus de données, mais de ne télécharger à travers le réseau que ceux qui -sont utilisés, au moment où ils sont utilisés. - -\hypertarget{cruxe9ation-du-systuxe8me-de-fichiers-racine-debian-avec-multistrap}{% -\subsection{\texorpdfstring{Création du système de fichiers racine -\emph{Debian} avec -\emph{multistrap}}{Création du système de fichiers racine Debian avec multistrap}}\label{cruxe9ation-du-systuxe8me-de-fichiers-racine-debian-avec-multistrap}} - -Le système de fichiers racine accessible via un partage -\protect\hyperlink{acronym__NFS}{NFS} est créé en utilisant l'outil -\emph{multistrap} fourni par Debian. Cet outil permet de générer un -système de fichiers racine pour une architecture donnée, et d'y -installer une liste de paquets choisie. Une fois le sytème de fichiers -racine créé, certains fichiers de configurations doivent sont créés -manuellement: - -\begin{itemize} -\tightlist -\item - \texttt{/etc/hostname}: le nom d'hôte de la machine. Dans notre cas, - la valeur \texttt{bootiful-deployer} a été entrée. -\item - \texttt{/etc/hosts}: la liste des hôtes connus. Dans notre cas, une - seule entrée est nécessaire: \texttt{127.0.0.1\ \ localhost} -\item - \texttt{/etc/fstab}: la liste de systèmes de fichiers à monter au - démarrage. Pour palier au fait que le système de fichiers racine sera - en lecture seule, plusieurs dossiers ont été montés en \texttt{tmpfs} - (système de fichier temporaire chargé en mémoire) afin de permettre - aux processus du système d'y écrire des fichiers: \texttt{/tmp}, - \texttt{/dev}, \texttt{/var/run}, \texttt{/var/lock}, - \texttt{/var/tmp}, \texttt{/var/log}, \texttt{/var/lib/clonezilla}, - \texttt{/bootiful} -\item - \texttt{/etc/mtab}: ce fichier contient la liste des volumes - actuellement montés. Au début, il n'avait pas été créé et cela causait - une erreur fatale dans \emph{Partclone}, qui n'arrivait pas à détecter - si une partition était montée ou non. Cela a été résolu en créant ce - fichier comme un lien symbolique vers le fichier \texttt{/proc/mounts} - qui est un faux fichier généré en mémoire par le noyau \emph{Linux} et - qui contient la liste des points des volumes actuellement montés. -\end{itemize} - -Quelques autres fichiers sont rajoutés/remplacés dans le système de -fichiers racine: - -\begin{itemize} -\tightlist -\item - \texttt{/etc/initramfs.conf}: configuration pour générer une image - \emph{initramfs} qui va initialiser montage du système de fichiers - racine depuis un partage NFS -\item - \texttt{/etc/systemd/system/bootiful-deploy-log.service}: - configuration d'unité \emph{Systemd} qui permet de lancer le script - d'initialisation du déploiement d'images au démarrage -\item - \texttt{/usr/bin/bootiful-deploy-init}: script d'initialisation du - déploiement d'images. Lance le script de déploiement d'images et - affiche permet de choisir quelle action effectuer si le déploiement ne - se termine pas avec succès. -\item - \texttt{/usr/bin/bootiful-common}: script contenant des fonctions - communes aux différents script de déploiement \texttt{bootiful-*}. Il - n'est pas conçu pour être exécuté directement, mais à être chargé par - les autres scripts avec la commande \texttt{source}. -\item - \texttt{/usr/bin/bootiful-deploy}: script permettant le choix de - l'image, des configurations (si applicable), et d'effectuer le - déploiement de l'image choisie. -\item - \texttt{/usr/bin/bootiful-save-image}: script utilitaire permettant de - construire une image avec \emph{dd}. Il a été utilisé pour construire - les images des benchmarks, mais il vaut mieux utiliser le live-cd - \emph{Clonezilla} pour la création d'une nouvelle image. -\item - \texttt{/usr/bin/bootiful-reset-cache}: script utilitaire permettant - de réinitialiser le cache des images. Il a été utilisé pour pouvoir - facilement réinitialiser le cache lors des benchmarks. -\end{itemize} - -Ensuite, la commande \texttt{chroot} est utilisée pour remplacer -temporairement le système de fichier racine actuel de la machine (celle -qui a lancé \emph{multistrap}) par celui qui vient d'être créé. -Plusieurs commandes sont lancées dans cet environnement pour initialiser -le système: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - \texttt{dpkg\ -\/-configure\ -a}: lance la configuration - post-installation de tous les paquets \emph{Debian}. -\item - \texttt{apt-get\ autoremove\ -\/-purge\ \&\&\ apt-get\ clean}: - désinstalle les dépendances inutiles et vide le cache des paquets. -\item - \texttt{update-initramfs\ -u}: regénère une image \emph{initramfs} qui - va initialiser montage du système de fichiers racine depuis un partage - NFS en utilisant la configuration rajoutée précédemment dans - \texttt{/etc/initramfs.conf}. -\item - \texttt{systemctl\ enable\ bootiful-deploy-log.service}: active - l'unité \emph{Systemd} de lancement automatique du script de - déploiement décrite dans le fichier - \texttt{/etc/systemd/system/bootiful-deploy-log.service} ajouté - précédemment. -\end{enumerate} - -\hypertarget{automatisation-de-la-cruxe9ation-du-systuxe8me-de-duxe9ploiement-avec-docker}{% -\subsection{\texorpdfstring{Automatisation de la création du système de -déploiement avec -\emph{Docker}}{Automatisation de la création du système de déploiement avec Docker}}\label{automatisation-de-la-cruxe9ation-du-systuxe8me-de-duxe9ploiement-avec-docker}} - -Pour utiliser l'outil \emph{multistrap} afin de créer un système de -fichier racine \emph{Debian}, il faut que le programme -\texttt{multistrap} soit lancé depuis un système d'exploitation -\emph{Debian}. Pour rendre la création de ce système de fichiers -possible depuis d'autres distributions Linux, un conteneur \emph{Docker} -a été créé. - -Le processus de création du système décrit dans la section précédente a -été automatisé et est décrit dans un fichier \texttt{Dockerfile} (le -code-souce de ce fichier peut être consulté dans la section -\ref{deployer_dockerfile}). La fonctionnalité de Docker de construction -en plusieurs ``étages'' (\emph{multi-stage build}) a été utilisée. Trois -``étages'' sont définis: - -\begin{itemize} -\tightlist -\item - \texttt{build-stage}: depuis une image \texttt{debian:bullseye} - construit une image de système de fichier racine \emph{Debian} et le - configure comme décrit dans la section précédente. Le dossier - \texttt{/boot/} est sorti du dossier du système de fichiers racine - nouvellement créé et déplacé dans \texttt{/multistrap/boot}. Le reste - du système de fichier racine (tout sauf \texttt{/boot/} est compressé - dans une archive \texttt{/multistrap/nfsroot.tar.gz}. Cette étape est - un pré-requis des étapes suivantes et n'est normalement pas exécutée - directement. -\item - \texttt{nfs-export-stage}: dans une image vide - (\texttt{FROM\ scratch}), copie le fichier - \texttt{/multistrap/nfsroot.tar.gz} depuis l'étape - \texttt{build-stage}. L'image de cette étape contient donc uniquement - un fichier à sa racine, \texttt{nfsroot.tar.gz}, qui pourra être - exporté et extrait dans le serveur - \protect\hyperlink{acronym__NFS}{NFS} pour être partagé. -\item - \texttt{tftp-export-stage}: dans une image vide - (\texttt{FROM\ scratch}), copie le contenu du dossier - \texttt{/multistrap/boot} depuis l'étape \texttt{build-stage}. L'image - de cette étape contient donc uniquement le contenu de la du dossier - \texttt{/boot/} de la partition racine, c'est à dire les fichiers - \texttt{initrd.img} (image \emph{initrd} initialisant le système de - fichier racine depuis \protect\hyperlink{acronym__NFS}{NFS}) et - \texttt{vmlinuz} (le noyau \emph{Linux}). Le contenu de cette image - pourra être exporté dans le dossier partagé du serveur - \protect\hyperlink{acronym__TFTP}{TFTP}, afin d'être téléchargé depuis - le logiciel d'amorçage \protect\hyperlink{acronym__GRUB}{GRUB} pour - lancer le système de déploiement. -\end{itemize} - -Le fichier \texttt{Makefile} à la racine du projet définit des cibles et -des recettes pour exécuter \texttt{docker\ build} exporter les données -des deux derniers étages dans leurs dossiers respectifs: - -\begin{itemize} -\tightlist -\item - le contenu de l'étage \texttt{nfs-export-stage}, c'est à dire - l'archive \texttt{nfsroot.tar.gz}, est exportée dans le dossier - \texttt{nfs/}. Elle sera extraite dans le serveur - \protect\hyperlink{acronym__NFS}{NFS}. -\item - le contenu de l'étage \texttt{tftp-export-stage}, c'est à dire - \texttt{initrd.img} et \texttt{vmlinuz} sont exportés dans le dossier - \texttt{tftp/tftpboot/boot/deployer} qui contient le système de - déploiement d'image servi par le serveur - \protect\hyperlink{acronym__TFTP}{TFTP}. -\end{itemize} - -\hypertarget{duxe9ploiement-dimage-windows}{% -\section{Déploiement d'image -Windows}\label{duxe9ploiement-dimage-windows}} - -Une image \emph{Windows 10} a été créée avec \emph{Clonezilla}, à partir -du système présent par défaut sur les mini-pc DELL que l'école avait mis -à disposition. Les PC étant neufs il s'agit du système d'exploitation -par défaut installé pour le constructeur. L'image qui a été créée a déjà -été mentionnée dans la section \emph{Réduction de la taille des images}. -Elle a la particularité d'être très grande car elle prend l'espace -entier du disque. - -Un problème a été rencontré lors du premier déploiement de l'image: le -script de déploiement ne gérait pas une image qui est tellement grande -qu'elle écrase la partition de cache et plantait. Une vérification a -donc été rajoutée sur la taille de l'image. Quand une image va écraser -la partition de cache, un message d'avertissement est affiché et -l'utilisateur doit confirmer qu'il souhaite continuer. Si l'utilisateur -accepte, le déploiment se fait sans mise en cache de l'image et la -partition cachée de cache est détruite. - -Une fois ce système mis en place, le déploiement de l'image s'est -déroulé sans problème particulier, et a confirmé que le déploiement -d'une image \emph{Windows} est faisable avec ce système. - -\hypertarget{ruxe9duction-du-temps-de-duxe9ploiement-total}{% -\section{Réduction du temps de déploiement -total}\label{ruxe9duction-du-temps-de-duxe9ploiement-total}} - -Théoriquement, le déploiement d'images avec clonezilla devrait être plus -court que le déploiement d'images \emph{raw}. Des mesures ont été -effectuées avec les trois images dont les différences de taille ont déjà -étudiées précédemment dans la section \emph{Réduction de la taille des -images}: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - Une petite image (environ 3.2 GB) du système \emph{Debian}, dont les - temps de déploiement sont comparés dans le tableau - \ref{table_deploy_time_debian} et la figure - \ref{chart_deploy_time_debian} -\item - Une image moyenne (environ 200GB) du système \emph{Xubuntu}, dont les - temps de déploiement sont comparés dans le tableau - \ref{table_deploy_time_xubuntu} et la figure - \ref{chart_deploy_time_xubuntu} -\item - Une grande image (environ 512GB) du système \emph{Windows 10}, dont - les temps de déploiement sont comparés dans le tableau - \ref{table_deploy_time_win10} et la figure - \ref{chart_deploy_time_win10} -\end{enumerate} - -\clearpage - -\begin{longtable}[]{@{}ll@{}} -\caption{Table des temps de déploiement d'une petite image \emph{Debian} -dans plusieurs formats \label{table_deploy_time_debian}}\tabularnewline -\toprule -Type & Temps de déploiement (secondes)\tabularnewline -\midrule -\endfirsthead -\toprule -Type & Temps de déploiement (secondes)\tabularnewline -\midrule -\endhead -Gzip (sans cache) & 14\tabularnewline -Gzip (avec cache) & 13\tabularnewline -Clonezilla (sans cache) & 39\tabularnewline -Clonezilla (avec cache) & 39\tabularnewline -\bottomrule -\end{longtable} - -\begin{figure} -\centering -\includegraphics{charts/chart_deploy_time_debian.svg} -\caption{Graphique des temps de déploiement d'une petite image -\emph{Debian} dans plusieurs formats\label{chart_deploy_time_debian}} -\end{figure} - -\clearpage - -\begin{longtable}[]{@{}ll@{}} -\caption{Table des temps de déploiement d'une image \emph{Xubuntu} -moyenne dans plusieurs formats -\label{table_deploy_time_xubuntu}}\tabularnewline -\toprule -Type & Temps de déploiement (secondes)\tabularnewline -\midrule -\endfirsthead -\toprule -Type & Temps de déploiement (secondes)\tabularnewline -\midrule -\endhead -Gzip (sans cache) & 623\tabularnewline -Gzip (avec cache) & 630\tabularnewline -Clonezilla (sans cache) & 109\tabularnewline -Clonezilla (avec cache) & 85\tabularnewline -\bottomrule -\end{longtable} - -\begin{figure} -\centering -\includegraphics{charts/chart_deploy_time_xubuntu.svg} -\caption{Graphique des temps de déploiement d'une image \emph{Xubuntu} -moyenne dans plusieurs formats\label{chart_deploy_time_xubuntu}} -\end{figure} - -\clearpage - -\begin{longtable}[]{@{}ll@{}} -\caption{Table des temps de déploiement d'une grande image \emph{Windows -10} dans plusieurs formats -\label{table_deploy_time_win10}}\tabularnewline -\toprule -Type & Temps de déploiement (secondes)\tabularnewline -\midrule -\endfirsthead -\toprule -Type & Temps de déploiement (secondes)\tabularnewline -\midrule -\endhead -Gzip (sans cache) & 3433\tabularnewline -Clonezilla (sans cache) & 371\tabularnewline -\bottomrule -\end{longtable} - -\begin{figure} -\centering -\includegraphics{charts/chart_deploy_time_win10.svg} -\caption{Graphique des temps de déploiement d'une grande image -\emph{Windows 10} dans plusieurs formats\label{chart_deploy_time_win10}} -\end{figure} - -\clearpage - -Ces mesures permettent de se rendre contre de plusieurs faits -remarquables, qui ne sont pas forcément intuitifs. - -Sur des très petites images le déploiement au format \emph{raw} -compressé avec \emph{gzip} est plus rapide que le déploiement avec -\emph{Clonezilla}. Ceci peut s'expliquer par le fait que -\emph{Clonezilla} prend du temps pour créer une table des partitions, un -système de fichiers pour chacune de ces partitions et copie ensuite les -blocs un à un sur chaque système de fichiers. Sur une grande image, ce -mode de fonctionnement est ``rentable'' car il y a beaucoup de blocs qui -n'auront pas à être copiés, alors qu'une image \emph{raw} devra passer -du temps à copier les données de chacun de ces blocs. Sur une très -petite image comme l'image \emph{Debian} mesurée ici, presque tous les -blocs du système de fichiers sont déjà utilisés, donc la copie brute des -données des partitions est plus rapide car tout le temps est passé à -copier les données. - -Sur les plus grosses images, cependant, \emph{Clonezilla} a clairement -l'avantage, car de nombreux blocs vides n'ont pas besoin d'être copiés. -Ainsi, avec les images plus larges utilisées dans les mesures, le temps -de déploiement des images plus larges au format \emph{raw} prend environ -5 à 9 fois plus de temps que le temps de déploiement avec -\emph{Clonezilla}. - -Un autre fait remarquable est que le déploiement d'une image \emph{raw} -déjà mise en cache prend plus de temps que le déploiement avec une copie -simultanée dans le cache. Cela s'explique peut être par le fait que dans -le premier cas, des données doivent être lues depuis le disque et -écrites sur le même disque, tandis que dans le second cas, seule de -l'écriture est effectuée. - -Par contre, dans le cas des images \emph{Clonezilla}, le déploiement -d'une image déjà présente en cache s'effectue plus rapidement que le -déploiement d'une image présente en cache. C'est l'inverse de ce qui se -passe avec les images \emph{raw}. Cela s'explique par le fait que les -images \emph{Clonezilla} sont copiées avant d'être déployées, alors que -les images \emph{raw} sont copiées et déployées simultanément. - -Il est important de se rappeller que les mesures montrées ici sont -effectuées dans des circonstances idéales: il n'y a qu'un seul client -qui télécharge l'image, seul un switch réseau sépare le client du -serveur et le client et le serveur sont les appareils connectés à ce -réseau local. Dans des conditions réelles, plusieurs machines seront -fréquemment en train de télécharger des images depuis le serveur en même -temps. Dans ce cas, le temps de déploiement d'une image non présente en -cache risque de prendre beaucoup plus de temps. Au contraire, le -déploiement d'une image déjà mise en cache devrait théoriquement prendre -le même temps que dans ces circonstances idéales. - -\hypertarget{amuxe9lioration-des-scripts-de-duxe9ploiement}{% -\section{Amélioration des scripts de -déploiement}\label{amuxe9lioration-des-scripts-de-duxe9ploiement}} - -De très nombreuses améliorations ont été apportées aux scripts de -déploiement, au point qu'ils sont presque complètement différents des -scripts initiaux. - -\hypertarget{gestion-des-erreurs}{% -\subsection{Gestion des erreurs}\label{gestion-des-erreurs}} - -Premièrement, la gestion des erreurs, inexistante dans le script initial -a été rajoutée. Les codes de retour des commandes sont vérifiés et les -données récupérées depuis la sortie de ces commandes sont validées avant -utilisation. Si un code de retour ou une donnée récupérée n'est pas au -format attendu, une fonction spéciale \texttt{fatal\_error} est appelée -avec comme argument un message d'erreur adapté à la situation. Cette -fonction va afficher le message d'erreur, ainsi qu'une trace de la pile -des appels (\emph{stack trace} en anglais). Cette trace permet -d'identifier précisément à quelle ligne de quel fonction et dans quel -fichier une erreur a eu lieu. - -Finalement, le script de déploiement \texttt{bootiful-deploy} sera -quitté avec un code d'erreur, ce qui permet au script parent, -\texttt{bootiful-init}, de détecter qu'une erreur a eu lieu et de -proposer à l'utilisateur quelle action il souhaite effectuer parmi les -choix suivants: - -\begin{itemize} -\tightlist -\item - Recommencer le déploiement -\item - Redémarrer la machine -\item - Éteindre la machine -\item - Ouvrir un \emph{shell} interactif (\texttt{/bin/bash}) pour étudier la - cause de l'erreur. Une fois le \emph{shell} terminé, l'utilisateur - peut à nouveau choisir ce qu'il souhaite faire. -\end{itemize} - -Le mécanisme de gestion d'erreurs a été très utile lors du développement -et du test des scripts de déploiement pour comprendre pourquoi certaines -erreurs arrivaient et adapter les scripts pour les éviter. Ce mécanisme -sera aussi utile pour aider un futur administrateur du système à -comprendre ce qu'il se passe si un déploiement ne se déroule pas comme -prévu. - -\hypertarget{mesure-du-temps-uxe9couluxe9}{% -\subsection{Mesure du temps écoulé}\label{mesure-du-temps-uxe9couluxe9}} - -Un système permettant de mesurer et d'afficher le temps passé dans -chaque section du script de déploiement a été créé. Il permet de mesurer -chacune des parties et d'afficher le temps passé dans chaque partie à la -fin du script. Les parties mesurées sont classées en deux catégories: -\emph{batch} et \emph{interactive}. Les parties \emph{batch} sont celles -qui sont exécutées automatiquement, sans intervention de l'utilisateur, -tandis que les parties \emph{interactive} sont celles où le système -attend un choix de l'utilisateur, comme par exemple le choix de l'image -à déployer. Cette catégorisation des parties permet d'afficher à la fin -du script combien de temps a été passé dans les parties \emph{batch} -sans prendre en compte le temps passé à attendre un choix de -l'utilisateur. - -\hypertarget{amuxe9lioration-des-logs}{% -\subsection{Amélioration des logs}\label{amuxe9lioration-des-logs}} - -Plusieurs améliorations ont été apportées au mécanisme de logging. Dans -le système initial, les flux \texttt{stdin} et \texttt{stdout} du script -de déploiement étaient redirigés vers un fichier de log sur le serveur. -Cela permet d'étudier à \emph{posteriori} comment le déploiement s'est -effectué, et de vérifier la durée d'exécution. Cela permet aussi de -comprendre ce qui s'est mal passé en cas d'erreur. - -Dans le système initial, étant donné que les flux sont redirigés vers un -fichier, un écran noir est affiché sur l'écran du poste client. Cela a -l'inconvénient de ne pas permettre à l'utilisateur du poste client de -savoir ce qu'il est en train de se passer. Il n'est pas possible pour -l'utilisateur de savoir si le déploiement est en cours ou s'il est -bloqué sur une étape. La première modification apportée au système de -logging a été d'utiliser la commande \texttt{tee} pour écrire dans les -fichiers de log, au lieu d'une simple redirection. Cela permet aux -sorties d'être simultanément affichées sur l'écran du client et -sauvegardée dans les logs. - -De nombreux textes informatifs ont aussi été rajoutés dans la sortie du -script pour expliquer ce qu'il est en train de se passer petit à petit. -Cela permet de mieux contextualiser chaque ligne de log. Une barre de -progression a aussi été rajoutée lors du déploiement d'une image au -format \emph{raw} pour que l'utilisateur puisse suivre la progression du -déploiement et qu'il puisse voir le temps écoulé ainsi qu'une estimation -du temps restant. - -Le mécanisme initial de logging créait un fichier de log par poste -client, en le nommant avec l'adresse -\protect\hyperlink{acronym__MAC}{MAC} du poste. Chaque déploiement -successif était loggué dans ce même fichier. Pour bien différencier le -début et la fin d'un log, une ligne facilement reconnaissable contenant -la date et l'heure était affichée. Il y a plusieurs problèmes avec ce -système: - -\begin{itemize} -\tightlist -\item - Les fichiers de log peuvent devenir très gros après de nombreux - déploiements. -\item - Le nettoyage du dossier de logs pour ne garder que les plus récents - est compliqué, car chaque fichier contient les logs de plusieurs - déploiements. -\item - La manipulation avec des commandes standard telles que \texttt{grep}, - \texttt{awk}, \texttt{tail} du log d'un déploiement précis est - compliqué. -\item - La comparaison de deux logs de déploiement sur la même machine est - difficile car il faut trouver où les déploiements commencent et se - terminent dans le même fichier. -\end{itemize} - -Le système de log a donc été modifié pour qu'un fichier par déploiement -soit créé par déploiement. Chaque fichier de log est nommé selon -l'adresse mac de la machine ainsi que la date et l'heure du début du -déploiement. - -\hypertarget{intuxe9gration-de-clonezilla-comme-type-dimage}{% -\subsection{\texorpdfstring{Intégration de \emph{Clonezilla} comme type -d'image}{Intégration de Clonezilla comme type d'image}}\label{intuxe9gration-de-clonezilla-comme-type-dimage}} - -Le script de déploiement a été modifié pour pouvoir détecter si une -image est au format \emph{raw} ou s'il s'agit d'une image -\emph{Clonezilla}. Selon le type d'image, des stratégies différentes -sont utilisées pour différentes étapes du déploiement: - -\begin{itemize} -\tightlist -\item - Détermination de la place nécessaire sur le disque pour déployer - l'image -\item - Commandes utilisées pour le déploiement -\item - Détermination du point d'entrée EFI. -\end{itemize} - -\hypertarget{duxe9tection-automatique-du-point-dentruxe9e-efi}{% -\subsection{\texorpdfstring{Détection automatique du point d'entrée -\protect\hyperlink{acronym__EFI}{EFI}}{Détection automatique du point d'entrée EFI}}\label{duxe9tection-automatique-du-point-dentruxe9e-efi}} - -Si l'image est au format \emph{Clonezilla}, le script de déploiement est -capable de déterminer automatiquement quel sera le programme -\protect\hyperlink{acronym__EFI}{EFI} qui sera exécuté au prochain -démarrage pour démarrer l'\protect\hyperlink{acronym__OS}{OS} déployé. - -En effet, les images \emph{Clonezilla} de systèmes -\protect\hyperlink{acronym__EFI}{EFI} contiennent un fichier spécial, -\texttt{efi-nvram.dat}, qui contient les variables contenues dans la -\protect\hyperlink{acronym__NVRAM}{NVRAM} du système -\protect\hyperlink{acronym__EFI}{EFI} au moment de la création de -l'image. Cette mémoire contient notemment l'ordre des entrées de boot et -les programmes \protect\hyperlink{acronym__EFI}{EFI} à exécuter pour -chacune de ces entrées, si applicable. - -Par exemple, voici le contenu du fichier \texttt{nvram.dat} de l'image -\emph{Windows 10} mentionnée dans les sections précédentes: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{BootCurrent: 0001} -\NormalTok{Timeout: 0 seconds} -\NormalTok{BootOrder: 0000,0001} -\NormalTok{Boot0000* Windows Boot Manager HD(1,GPT,0cccfd69{-}e584{-}4e2d{-}8a5d{-}6afa7130fcab,0x800,0x15e000) /File(\textbackslash{}EFI\textbackslash{}Microsoft\textbackslash{}Boot\textbackslash{}bootmgfw.efi) WINDOWS.........x...B.C.D.O.B.J.E.C.T.=.\{.9.d.e.a.8.6.2.c.{-}.5.c.d.d.{-}.4.e.7.0.{-}.a.c.c.1.{-}.f.3.2.b.3.4.4.d.4.7.9.5.\}....................} -\NormalTok{Boot0001* UEFI: USB DISK 3.0 PMAP PciRoot(0x0)/Pci(0x14,0x0)/USB(16,0)/CDROM(1,0x344,0x5e00)..BO} -\end{Highlighting} -\end{Shaded} - -Le script de déploiement est capable de lire ce fichier, de trouver la -première entrée contenant un chemin vers un exécutable -\protect\hyperlink{acronym__EFI}{EFI}, et transformer ce chemin en un -chemin \emph{Unix}, c'est à dire avec le caractère \texttt{/} au lieu de -\texttt{\textbackslash{}} et des noms de dossiers et fichiers sensibles -à la casse, qui correspondent à des dossiers et fichiers présents sur la -partition \protect\hyperlink{acronym__ESP}{ESP} qui vient d'être -déployée. Cette conversion est importante car ce chemin devra être passé -à \protect\hyperlink{acronym__GRUB}{GRUB}, qui ne sait lire que des -chemins au format \emph{Unix}. - -Une fois le point d'entrée déterminé un fichier \texttt{efi\_entrypoint} -est écrit à la racine de la partition -\protect\hyperlink{acronym__ESP}{ESP}. Il sera ensuite lu par -\protect\hyperlink{acronym__GRUB}{GRUB} au prochain démarrage pour -trouver le point d'entrée à exécuter. Le contenu de ce fichier -ressemblera à ceci: - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{set} \VariableTok{efi\_entrypoint=}\NormalTok{/efi/Microsoft/Boot/bootmgfw.efi} -\end{Highlighting} -\end{Shaded} - -Si l'image est au format \emph{raw}, ou alors qu'il est souhaité -d'outrepasser la lecture automatique du point d'entrée d'une image -\emph{Clonezilla}, il suffit de rajouter un fichier -\texttt{efi\_entrypoint} dans le dossier de l'image. Ce fichier sera -directement copié dans l'\protect\hyperlink{acronym__ESP}{ESP}, sans -qu'une tentative de détermination automatique du point d'entrée à partir -du fichier \texttt{nvram.dat} soit effectuée. - -\hypertarget{personnalisation-dimages-post-duxe9ploiement}{% -\section{Personnalisation d'images -post-déploiement}\label{personnalisation-dimages-post-duxe9ploiement}} - -Un système a été conçu pour que l'utilisateur puisse choisir des -personnalisations post-déploiement pour une image parmi un ensemble -prédéfini. Ces personnalisations peuvent être implémentées de plusieurs -manières: il ne s'agit que de fichiers qui seront copiés dans un dossier -présent dans un répertoire de la machine déployée. - -Une image supportant les personnalisation post-déploiement peut par -exemple être configurée pour exécuter des scripts qui auront été copiés -dans un répertoire. Par exemple, sur une image dont -l'\protect\hyperlink{acronym__OS}{OS} est une distribution \emph{Linux} -utilisant \emph{Systemd}, une unité peut être configurée pour être -exécutée au démarrage. Cette unité peut lancer au démarrage un script -servant à exécuter séquentiellement des scripts présents dans un dossier -prédéfini, ou alors exécuter des \emph{playbooks} \emph{Ansible}. - -Des personnalisations peuvent aussi être ``passives'' et ne pas -nécessiter de configuration particulière du côté du client. Par exemple, -si elle consiste uniquement à copier/remplacer un fichier de -configuration à un endroit précis. - -Après le choix d'une image, le script de déploiement va chercher si un -sous dossier \texttt{customizations} existe. Ce dossier contient un -sous-dossier par personnalisation que l'utilisateur peut choisir. Chaque -sous dossier personnalisation doit contenir une arborescence de dossiers -et de fichiers dont le premier niveau contient uniquement des dossier -correspondant à des noms de partitions existant dans l'image déployée. À -l'intérieur de ce dossier, une arborescence des fichiers copiés sur la -machine depuis laS - -Étudions une arborescence fictive de personnalisations pour mieux -comprendre ce système. Voici l'arborescence du dossier -\texttt{customizations} d'une image: - -\begin{Shaded} -\begin{Highlighting}[] -\NormalTok{customizations} -\NormalTok{├── C language development environment} -\NormalTok{│ └── sda2} -\NormalTok{│ └── etc} -\NormalTok{│ └── bootiful} -\NormalTok{│ └── postdeploy{-}playbooks} -\NormalTok{│ └── 002{-}install{-}c{-}dev.yml} -\NormalTok{├── Custom bashrc} -\NormalTok{│ └── sda2} -\NormalTok{│ └── etc} -\NormalTok{│ └── bash.bashrc} -\NormalTok{└── Join LDAP domain} -\NormalTok{ └── sda2} -\NormalTok{ └── etc} -\NormalTok{ └── bootiful} -\NormalTok{ └── postdeploy{-}playbooks} -\NormalTok{ └── 001{-}join{-}ldap.yml} -\end{Highlighting} -\end{Shaded} - -Cette arborescence définit les personnalisations suivantes, qui peuvent -être choisies par l'utilisateur: - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - \texttt{C\ language\ development\ environment}: copie un - \emph{playbook} \emph{Ansible} servant à installer un environnement de - développement C dans le dossier - \texttt{/etc/bootiful/postdeploy-playbooks} de la partition - \texttt{sda2} -\item - \texttt{Custom\ bashrc}: remplace le ficher \texttt{/etc/bash.bashrc} - de la partition \texttt{sda2} par un fichier personnalisé. -\item - \texttt{Join\ LDAP\ domain}: copie un \emph{playbook} \emph{Ansible} - servant à rejoindre un domaine \protect\hyperlink{acronym__LDAP}{LDAP} - dans le dossier \texttt{/etc/bootiful/postdeploy-playbooks} de la - partition \texttt{sda2} -\end{enumerate} - -Les personnalisations \textbf{1} et \textbf{3} nécessitent que l'image -soit équipée d'un mécanisme qui va exécuter les \emph{playbooks Ansible} -présents dans \texttt{/etc/bootiful/postdeploy-playbooks} au démarrage. -Des exemples d'un tel script et de l'unité \emph{systemd} servant à le -lancer au démarrage sont consultables dans les sections -\ref{source_ansible_run} et \ref{source_ansible_init}.'w'\,'\,'\,' - -La personnalisation \textbf{2} est passive: elle remplace juste un -fichier mais ne nécessite pas de mécanisme spécial sur la machine de -déploiement pour l'exécuter. - -\hypertarget{architecture-finale-du-projet}{% -\chapter{Architecture finale du -projet}\label{architecture-finale-du-projet}} - -\hypertarget{composants}{% -\section{Composants}\label{composants}} - -\textbf{TODO: diagramme des composants du projet et description} - -\hypertarget{processus-de-duxe9ploiement}{% -\section{Processus de déploiement}\label{processus-de-duxe9ploiement}} - -\textbf{TODO: diagramme du processus de déploiement et description -complète de ce dernier. Explication détaillées de la structure des -scripts de déploiement, de leurs possibilités et de leurs limitations.} - -\hypertarget{architecture-ruxe9seau}{% -\section{Architecture réseau}\label{architecture-ruxe9seau}} - -\textbf{TODO: description de l'architecture réseau finale utilisée pour -développer et tester le système avec diagramme. Expliquer comment cette -architecture de test peut être transposée à une architecture de -production.} - -\hypertarget{processus-de-build}{% -\section{Processus de build}\label{processus-de-build}} - -\textbf{TODO: expliquer comment sont construites les différentes parties -du projet. Expliquer les différentes parties du makefile et les -différentes images docker utilisées pour construire les différents -composants.} - -\hypertarget{duxe9ploiement-du-serveur}{% -\section{Déploiement du serveur}\label{duxe9ploiement-du-serveur}} - -\textbf{TODO: expliquer comment le serveur peut fonctionner à l'aide -d'un \texttt{docker-compose} réunissant les serveurs TFTP, NFS et DHCP. -Expliquer comment ces différentes parties sont utilisés dans un -environnement de développement, les limitations, et comment adapter -cette configuration à un environnement de production.} - -\hypertarget{structure-des-images}{% -\section{Structure des images}\label{structure-des-images}} - -\textbf{TODO: expliquer exactement comment sont structurées les données -des images (raw et clonezilla).} - -\hypertarget{utilisation-du-systuxe8me-duxe9ployuxe9}{% -\chapter{Utilisation du système -déployé}\label{utilisation-du-systuxe8me-duxe9ployuxe9}} - -\hypertarget{duxe9ployer-une-image-sur-un-poste}{% -\section{Déployer une image sur un -poste}\label{duxe9ployer-une-image-sur-un-poste}} - -Cette section contient une marche à suivre qui décrit les étapes pour -déployer une image sur un poste client quand un serveur est déjà -installé et configuré, que la machine est configurée pour démarrer sur -le réseau. - -\begin{enumerate} -\def\labelenumi{\arabic{enumi}.} -\tightlist -\item - Démarrer la machine et attendre qu'elle -\end{enumerate} - -\textbf{TODO: expliquer pas à pas comment utiliser l'interface pour -déployer une image sur un client et les différentes inter-actions de -l'utilisateur, avec des captures d'écran, etc.} - -\hypertarget{cruxe9ation-dune-image-clonezilla}{% -\section{Création d'une image -clonezilla}\label{cruxe9ation-dune-image-clonezilla}} - -\textbf{TODO: expliquer pas à pas comment créer une image avec -clonezilla et comment l'ajouter au serveur de déploiement.} - -\hypertarget{cruxe9ation-dune-image-dd}{% -\section{Création d'une image dd}\label{cruxe9ation-dune-image-dd}} - -\textbf{TODO: expliquer pas à pas comment créer une image avec -clonezilla et comment l'ajouter au serveur de déploiement.} - -\hypertarget{pruxe9paration-dune-image-pour-quelle-supporte-le-systuxe8me-de-personnalisation}{% -\section{Préparation d'une image pour qu'elle supporte le système de -personnalisation}\label{pruxe9paration-dune-image-pour-quelle-supporte-le-systuxe8me-de-personnalisation}} - -\textbf{TODO: expliquer comment préparer un système pour qu'il supporte -le système de personnalisation avec ansible, et comment créer les -scripts de personnalisation, avec un exemple type simple.} - -\hypertarget{conclusion}{% -\chapter{Conclusion}\label{conclusion}} - -\hypertarget{synthuxe8se-du-travail-effectuuxe9}{% -\section{Synthèse du travail -effectué}\label{synthuxe8se-du-travail-effectuuxe9}} - -Le travail initial a été récupéré, analysé, documenté et remis en -fonctionnement en corrigeant quelques problèmes dans les fichiers de -configuration et les scripts de déploiement. L'outil \emph{Vagrant} a -été utilisé pour automatiser la création d'un serveur virtuel qui -exécute les différents services du système. - -Le système a été ensuite modifié pour le rendre compatible avec les -ordinateurs modernes utilisant le standard -\protect\hyperlink{acronym__UEFI}{UEFI} au lieu d'un -\protect\hyperlink{acronym__BIOS}{BIOS}. - -Des mesures ont été effectuées pour déterminer si le choix du protocole -\protect\hyperlink{acronym__NFS}{NFS}, le protocole réseau utilisé pour -transférer les images, était pertinent. Il été comparé aux protocoles -\protect\hyperlink{acronym__SCP}{SCP}, -\protect\hyperlink{acronym__HTTP}{HTTP}, -\protect\hyperlink{acronym__FTP}{FTP}, -\protect\hyperlink{acronym__NFS}{NFS}, -\protect\hyperlink{acronym__SMB}{SMB} et -\protect\hyperlink{acronym__IPFS}{IPFS} en mesurant le temps de -transfert d'une image. Ces mesures ont montré que les temps de -déploiement avec ces différents protocoles étaient similaires, à -l'exception d'\protect\hyperlink{acronym__IPFS}{IPFS} qui prenait -beaucoup plus de temps. Le protocole -\protect\hyperlink{acronym__NFS}{NFS} a donc été gardé car les mesures -ont prouvé que ses performances étaient similaires à ses alternatives. - -Un format d'images alternatif aux images brutes compressées a été -recherché. Une solution produisant des images plus petites et -déployables plus rapidement a été trouvée: utiliser des images produites -avec l'outil \emph{Clonezilla}. Cet outil permet aussi de faciliter la -création d'images en utilisant sa version \emph{live}. Des mesures -prouvant que ce système de déploiement d'images offre un réel avantage -en espace utilisé et en temps de déploiement par rapport aux images -brutes compressées. - -Le système d'exploitation utilisé pour effectuer le déploiement a été -complètement remplacé. Initialement construit avec \emph{Buildroot}, -avec un système de fichiers racine chargé entièrement en mémoire, il a -été remplacé par un système \emph{Debian} dont le système de fichiers -racine est monté depuis un partage \protect\hyperlink{acronym__NFS}{NFS} -en lecture seule. Ce système permet une installation aisée de tous les -paquets \emph{Debian}, notamment \emph{Clonezilla} qui était compliqué à -installer sur un système construit avec \emph{Buildroot}. La création de -ce système d'exploitation a été automatisée et encapsulée dans un -conteneur \emph{Docker} pour rendre sa modification et reconstruction -très simple, indépendamment du système d'exploitation utilisé. - -Les scripts de déploiement du système initial ont été réécrits. Une -gestion avancée des erreurs a été implémentée. Un système de mesure et -d'affichage du temps d'exécution de chaque partie du déploiement a été -développé. La génération de fichiers de log a été améliorée pour qu'ils -fournissent plus d'informations utiles et qu'ils soient structurés de -manière à rendre leur gestion et leur consultation plus aisée. Le -déploiement d'images avec \emph{Clonezilla} a été implémenté, tout en -gardant la possibilité d'utiliser des images brutes compressées pour -offrir plus de flexibilité et permettre de comparer les deux systèmes. -Le support des images de systèmes d'exploitations compatibles -\protect\hyperlink{acronym__UEFI}{UEFI} a aussi été implémenté, -notamment en permettant de déterminer automatiquement l'exécutable -\protect\hyperlink{acronym__EFI}{EFI} qui devra être lancé pour démarrer -le système déployé. - -Enfin, un système de personnalisation d'un système après son déploiement -a été conçu, permettant de définir des configurations que l'utilisateur -peut choisir de copier ou non sur le système déployé. Une image de -système d'exploitation peut être conçue pour exécuter les fichiers -copiés par ces personnalisations dans un dossier spécifique, pour -permettre des configurations complexes exécutées lors du démarrage avec -un outil choisi, par exemple \emph{Ansible}. Ce système offre beaucoup -de flexibilité et permet de définir des configurations avancées tout en -gardant le système de déploiement indépendant de ce qui est utilisé pour -les exécuter, car le seul mécanisme présent dans le système de -déploiement est la copie de fichiers sur une partition donnée. - -\hypertarget{points-damuxe9lioration}{% -\section{Points d'amélioration}\label{points-damuxe9lioration}} - -Bien que le système à la fin de ce projet soit parfaitement fonctionnel, -il existe des points qui devraient ou pourraient être étudiés, améliorés -ou implémentés pour que le système soit prêt à une utilisation dans un -cadre réel. - -\hypertarget{amuxe9lioration-des-performances-de-tuxe9luxe9chargement-des-images-sur-un-ruxe9seau-ruxe9el-avec-de-nombreux-clients-simultanuxe9s}{% -\subsection{Amélioration des performances de téléchargement des images -sur un réseau réel avec de nombreux clients -simultanés}\label{amuxe9lioration-des-performances-de-tuxe9luxe9chargement-des-images-sur-un-ruxe9seau-ruxe9el-avec-de-nombreux-clients-simultanuxe9s}} - -Le protocole réseau utilisé pour le téléchargement des images a été -testé avec un client unique, sur un réseau minimal ne comprenant que le -client et le serveur. Il est très probable que le temps de -téléchargement des images soit beaucoup plus long que celui mesuré dans -le cadre de ce travail si de nombreux clients téléchargent des images en -même temps, dans un réseau plus complexe tel que celui de l'école. - -L'étude et la mitigation de cette problématique a volontairement été -mise de côté dans le cadre de ce travail car il était difficile de -simuler les conditions réelles du système déployé dans une école alors -que tout le travail a été effectué hors de l'école, dans un petit réseau -local domestique avec une quantité limitée d'ordinateurs à disposition -pour faire des tests. - -Différentes approches pourraient être utilisées pour améliorer ces -performances, telles que la copie en \emph{multicast} des images, la -redondance des serveurs mettant à disposition les images ou encore -l'utilisation d'un protocole \emph{pair à pair} tel que -\emph{Bittorrent} ou \emph{IPFS} pour permettre de distribuer le -transfert des images sur tous les clients connectés plutôt que -d'utiliser uniquement le serveur central comme source du fichiers. - -\hypertarget{amuxe9lioration-du-systuxe8me-de-personnalisation-des-images}{% -\subsection{Amélioration du système de personnalisation des -images}\label{amuxe9lioration-du-systuxe8me-de-personnalisation-des-images}} - -Le système de personnalisation des images a été implémenté tardivement -dans le travail. Bien qu'il soit fonctionnel, il n'a pas été testé -extensivement. Il faudrait passer un peu de temps à créer des -configurations post-déploiement complexes qui sont exécutées au -démarrage par le système déployé et de valider leur fonctionnement. - -Par exemple, il était prévu de tester l'exécution de \emph{playbooks} -\emph{Ansible} au démarrage du système, copiés selon les choix de -personnalisation de l'utilisateur. Ces \emph{playbooks} pourraient étre -utilisés pour effectuer de nombreuses actions, telles que l'installation -de groupes de paquets choisis, la génération d'un nom d'hôte unique pour -la machine et la connexion à un domaine \emph{Active Directory} pour -permettre aux élèves de se connecter avec le même nom d'utilisateur et -d'avoir accès à leur dossier \emph{home} depuis un partage -\protect\hyperlink{acronym__NFS}{NFS}, comme sur les postes de travail -standards présents de l'école. - -\hypertarget{amuxe9lioration-de-la-suxe9curituxe9}{% -\subsection{Amélioration de la -sécurité}\label{amuxe9lioration-de-la-suxe9curituxe9}} - -Sur le système actuel, un utilisateur mal intentionné peut détruire ou -modifier les images présentes sur le serveur distant, car elles sont -récupérées sur un partage \protect\hyperlink{acronym__NFS}{NFS} avec des -droits de lecture-écriture. La raison de ce partage en lecture et -écriture est que les logs sont écrits sur le même partage. Une manière -simple de résoudre ce problème serait de séparer ce partage en deux: le -premier en lecture seule contiendrait les images et le second -contiendrait les logs uniquement. - -Il faudrait ensuite trouver une solution pour empêcher une machine -d'aller modifier ou supprimer les logs d'une autre machine, ce qui est -compliqué à mettre en oeuvre avec un partage -\protect\hyperlink{acronym__NFS}{NFS}. Peut être que les logs pourraient -être transmis au serveur en utilisant un autre canal de communication et -de déléguer la création et le nommage du fichier au serveur, pour que -les clients ne soient plus capables d'accéder directement aux fichiers -des logs, mais que ce soit le serveur qui ait la responsabilité de les -créer et de les gérer. - -\hypertarget{ruxe9trospection-sur-le-duxe9roulement-du-travail}{% -\section{Rétrospection sur le déroulement du -travail}\label{ruxe9trospection-sur-le-duxe9roulement-du-travail}} - -J'ai eu beaucoup d'intérêt à travailler sur ce sujet. Cela m'a permis de -mettre en pratique de nombreuses compétences acquises lors des cours -suivis les quatre années précédentes, dont en particulier les cours de -programmation des systèmes (\emph{sIT\_242}), systèmes d'exploitation -(\emph{sIT\_244}), réseaux et protocoles informatiques (sIT\_362), -réseaux avancés (\emph{sIT\_384}), programmation avancée des systèmes -(\emph{sIT\_632}) et virtualisation des -\protect\hyperlink{acronym__SI}{SI} (\emph{sIT\_632}). - -\hypertarget{ruxe9fuxe9rences}{% -\chapter{Références}\label{ruxe9fuxe9rences}} - -\appendix - -\hypertarget{appendix_source}{% -\chapter{Codes sources notables}\label{appendix_source}} - -Cette annexe contient les listings des codes sources les plus importants -du projet. - -\hypertarget{makefile-configuration-gnu-make-du-projet}{% -\section{\texorpdfstring{\texttt{Makefile}: configuration \emph{GNU -Make} du -projet}{Makefile: configuration GNU Make du projet}}\label{makefile-configuration-gnu-make-du-projet}} - -\begin{Shaded} -\begin{Highlighting}[] -\DataTypeTok{SHELL }\CharTok{:=}\StringTok{ /bin/bash} -\DataTypeTok{MAKEFLAGS }\CharTok{+=}\StringTok{ "{-}j 4"} - -\DataTypeTok{DOCKER\_BUILDKIT\_BUILD }\CharTok{=}\StringTok{ DOCKER\_BUILDKIT=1 docker build {-}{-}progress=plain} - -\DataTypeTok{GRUB\_SRC }\CharTok{:=}\StringTok{ }\CharTok{$(}\KeywordTok{shell}\StringTok{ find grub/bootiful{-}grub/ {-}type f {-}regex ".*\textbackslash{}.[c|h|sh|py|cfg|conf]"}\CharTok{)} -\DataTypeTok{GRUB\_I386\_PC\_BIN }\CharTok{=}\StringTok{ tftp/tftpboot/boot/grub/i386{-}pc/core.0} -\DataTypeTok{GRUB\_I386\_EFI\_BIN }\CharTok{=}\StringTok{ tftp/tftpboot/boot/grub/i386{-}efi/core.efi} -\DataTypeTok{GRUB\_X86\_64\_EFI\_BIN }\CharTok{=}\StringTok{ tftp/tftpboot/boot/grub/x86\_64{-}efi/core.efi} -\DataTypeTok{DEPLOYER\_SRC }\CharTok{:=}\StringTok{ }\CharTok{$(}\KeywordTok{wildcard}\StringTok{ deployer/*}\CharTok{)} -\DataTypeTok{TFTP\_DEPLOYER\_DIR }\CharTok{=}\StringTok{ tftp/tftpboot/boot/deployer} -\DataTypeTok{TFTP\_DEPLOYER\_VMLINUZ }\CharTok{:=}\StringTok{ }\CharTok{$(}\DataTypeTok{TFTP\_DEPLOYER\_DIR}\CharTok{)}\StringTok{/vmlinuz} -\DataTypeTok{TFTP\_DEPLOYER\_INITRD }\CharTok{:=}\StringTok{ }\CharTok{$(}\DataTypeTok{TFTP\_DEPLOYER\_DIR}\CharTok{)}\StringTok{/initrd.img} -\DataTypeTok{NFS\_DEPLOYER\_ROOT }\CharTok{:=}\StringTok{ nfs/nfsroot.tar.gz} -\DataTypeTok{LATEST\_LOG }\CharTok{:=}\StringTok{ }\CharTok{$(}\KeywordTok{shell}\StringTok{ ls {-}1 nfs/nfsshared/log/*.log | tail {-}n 1}\CharTok{)} - -\OtherTok{.PHONY:}\DataTypeTok{ doc grub deployer start{-}server reprovision{-}server clean print\_last\_log help} - -\CommentTok{\# Builds everything} -\DecValTok{all:}\DataTypeTok{ doc grub deployer} - -\CommentTok{\# Builds PDF and markdown documents} -\DecValTok{doc:} - \CharTok{$(}\DataTypeTok{MAKE}\CharTok{)}\NormalTok{ {-}C doc} - -\DecValTok{grub/bootiful{-}grub/bootstrap partclone/bootiful{-}partclone/Makefile.am:}\DataTypeTok{ .gitmodules} -\NormalTok{ git submodule init \&\& git submodule update} - -\CommentTok{\# Bootstraps GRUB dependencies and configuration script} -\DecValTok{grub/bootiful{-}grub/configure:}\DataTypeTok{ grub/bootiful{-}grub/bootstrap} -\NormalTok{ (pushd grub/bootiful{-}grub \&\& ./bootstrap; popd)} - -\CommentTok{\# Builds GRUB for i386{-}pc} -\DecValTok{$(GRUB\_I386\_PC\_BIN):}\DataTypeTok{ grub/Dockerfile grub/bootiful{-}grub/configure }\CharTok{$(}\DataTypeTok{GRUB\_SRC}\CharTok{)} - \CharTok{$(}\DataTypeTok{DOCKER\_BUILDKIT\_BUILD}\CharTok{)}\NormalTok{ ./grub }\CharTok{\textbackslash{}} -\NormalTok{ {-}{-}output ./tftp/tftpboot }\CharTok{\textbackslash{}} -\NormalTok{ {-}{-}build{-}arg PLATFORM=pc }\CharTok{\textbackslash{}} -\NormalTok{ {-}{-}build{-}arg TARGET=i386} - -\CommentTok{\# Builds GRUB for i386{-}efi} -\DecValTok{$(GRUB\_I386\_EFI\_BIN):}\DataTypeTok{ grub/Dockerfile grub/bootiful{-}grub/configure }\CharTok{$(}\DataTypeTok{GRUB\_SRC}\CharTok{)} - \CharTok{$(}\DataTypeTok{DOCKER\_BUILDKIT\_BUILD}\CharTok{)}\NormalTok{ ./grub }\CharTok{\textbackslash{}} -\NormalTok{ {-}{-}output ./tftp/tftpboot }\CharTok{\textbackslash{}} -\NormalTok{ {-}{-}build{-}arg PLATFORM=efi }\CharTok{\textbackslash{}} -\NormalTok{ {-}{-}build{-}arg TARGET=i386} - -\CommentTok{\# Builds GRUB for x86\_64{-}efi} -\DecValTok{$(GRUB\_X86\_64\_EFI\_BIN):}\DataTypeTok{ grub/Dockerfile grub/bootiful{-}grub/configure }\CharTok{$(}\DataTypeTok{GRUB\_SRC}\CharTok{)} - \CharTok{$(}\DataTypeTok{DOCKER\_BUILDKIT\_BUILD}\CharTok{)}\NormalTok{ ./grub }\CharTok{\textbackslash{}} -\NormalTok{ {-}{-}output ./tftp/tftpboot }\CharTok{\textbackslash{}} -\NormalTok{ {-}{-}build{-}arg PLATFORM=efi }\CharTok{\textbackslash{}} -\NormalTok{ {-}{-}build{-}arg TARGET=x86\_64} - -\CommentTok{\# Builds GRUB for all platforms} -\DecValTok{grub:}\DataTypeTok{ }\CharTok{$(}\DataTypeTok{GRUB\_I386\_PC\_BIN}\CharTok{)}\DataTypeTok{ }\CharTok{$(}\DataTypeTok{GRUB\_I386\_EFI\_BIN}\CharTok{)}\DataTypeTok{ }\CharTok{$(}\DataTypeTok{GRUB\_X86\_64\_EFI\_BIN}\CharTok{)} - -\CommentTok{\# Builds the deployer OS} -\DecValTok{deployer:}\DataTypeTok{ }\CharTok{$(}\DataTypeTok{TFTP\_DEPLOYER\_VMLINUZ}\CharTok{)}\DataTypeTok{ }\CharTok{$(}\DataTypeTok{TFTP\_DEPLOYER\_INITRD}\CharTok{)}\DataTypeTok{ }\CharTok{$(}\DataTypeTok{NFS\_DEPLOYER\_ROOT}\CharTok{)} - -\DecValTok{$(TFTP\_DEPLOYER\_VMLINUZ) $(TFTP\_DEPLOYER\_INITRD) \&:}\DataTypeTok{ }\CharTok{$(}\DataTypeTok{DEPLOYER\_SRC}\CharTok{)} - \CharTok{$(}\DataTypeTok{DOCKER\_BUILDKIT\_BUILD}\CharTok{)}\NormalTok{ ./deployer {-}{-}target tftp{-}export{-}stage {-}{-}output }\CharTok{$(}\DataTypeTok{TFTP\_DEPLOYER\_DIR}\CharTok{)}\NormalTok{ \&\& }\CharTok{\textbackslash{}} -\NormalTok{ touch {-}c }\CharTok{$(}\DataTypeTok{TFTP\_DEPLOYER\_VMLINUZ}\CharTok{)} \CharTok{$(}\DataTypeTok{TFTP\_DEPLOYER\_INITRD}\CharTok{)} - -\DecValTok{$(NFS\_DEPLOYER\_ROOT):}\DataTypeTok{ }\CharTok{$(}\DataTypeTok{DEPLOYER\_SRC}\CharTok{)} - \CharTok{$(}\DataTypeTok{DOCKER\_BUILDKIT\_BUILD}\CharTok{)}\NormalTok{ ./deployer {-}{-}target nfs{-}export{-}stage {-}{-}output nfs/ \&\& }\CharTok{\textbackslash{}} -\NormalTok{ touch {-}c }\CharTok{$(}\DataTypeTok{NFS\_DEPLOYER\_ROOT}\CharTok{)} - -\CommentTok{\# Starts bootiful services in docker containers} -\DecValTok{start{-}server:}\DataTypeTok{ grub deployer} -\NormalTok{ docker{-}compose up {-}{-}build {-}{-}remove{-}orphans {-}{-}abort{-}on{-}container{-}exit} - -\CommentTok{\# Removes all generated files} -\DecValTok{clean:} -\NormalTok{ rm {-}rf deployer/rootfs} - \CharTok{$(}\DataTypeTok{MAKE}\CharTok{)}\NormalTok{ {-}C doc clean} - -\CommentTok{\# Prints the latest deployment log file} -\DecValTok{print{-}latest{-}log:} -\NormalTok{ cat }\CharTok{$(}\DataTypeTok{LATEST\_LOG}\CharTok{)} - -\CommentTok{\# Show this help.} -\DecValTok{help:} -\NormalTok{ printf }\StringTok{"Usage: make \textless{}target\textgreater{}\textbackslash{}n\textbackslash{}nTargets:\textbackslash{}n"} -\NormalTok{ awk }\StringTok{\textquotesingle{}/\^{}\#/\{c=substr(}\CharTok{$$}\StringTok{0,3);next\}c\&\&/\^{}[[:alpha:]][[:alnum:]\_{-}]+:/\{print " " substr(}\CharTok{$$}\StringTok{1,1,index(}\CharTok{$$}\StringTok{1,":")),c\}1\{c=0\}\textquotesingle{}} \CharTok{$(}\DataTypeTok{MAKEFILE\_LIST}\CharTok{)}\NormalTok{ | column {-}s: {-}t} -\end{Highlighting} -\end{Shaded} - -\hypertarget{docker-compose.yml-configuration-docker-compose-du-serveur-de-duxe9ploiement}{% -\section{\texorpdfstring{\texttt{docker-compose.yml}: configuration -\emph{docker-compose} du serveur de -déploiement}{docker-compose.yml: configuration docker-compose du serveur de déploiement}}\label{docker-compose.yml-configuration-docker-compose-du-serveur-de-duxe9ploiement}} - -\begin{Shaded} -\begin{Highlighting}[] -\FunctionTok{version}\KeywordTok{:}\AttributeTok{ }\StringTok{"3.8"} - -\FunctionTok{services}\KeywordTok{:} -\AttributeTok{ }\FunctionTok{bootiful{-}dhcp}\KeywordTok{:} -\AttributeTok{ }\FunctionTok{build}\KeywordTok{:}\AttributeTok{ ./dhcp} -\AttributeTok{ }\FunctionTok{network\_mode}\KeywordTok{:}\AttributeTok{ host} -\AttributeTok{ }\FunctionTok{bootiful{-}tftp}\KeywordTok{:} -\AttributeTok{ }\FunctionTok{build}\KeywordTok{:}\AttributeTok{ ./tftp} -\AttributeTok{ }\FunctionTok{network\_mode}\KeywordTok{:}\AttributeTok{ host} -\AttributeTok{ }\FunctionTok{volumes}\KeywordTok{:} -\AttributeTok{ }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{type}\KeywordTok{:}\AttributeTok{ bind} -\AttributeTok{ }\FunctionTok{source}\KeywordTok{:}\AttributeTok{ ./tftp/tftpboot} -\AttributeTok{ }\FunctionTok{target}\KeywordTok{:}\AttributeTok{ /tftpboot} -\AttributeTok{ }\FunctionTok{read\_only}\KeywordTok{:}\AttributeTok{ }\CharTok{yes} -\AttributeTok{ }\FunctionTok{bootiful{-}nfs}\KeywordTok{:} -\AttributeTok{ }\FunctionTok{build}\KeywordTok{:}\AttributeTok{ ./nfs} -\AttributeTok{ }\FunctionTok{network\_mode}\KeywordTok{:}\AttributeTok{ host} -\AttributeTok{ }\FunctionTok{privileged}\KeywordTok{:}\AttributeTok{ }\CharTok{yes} -\AttributeTok{ }\FunctionTok{volumes}\KeywordTok{:} -\AttributeTok{ }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{type}\KeywordTok{:}\AttributeTok{ tmpfs} -\AttributeTok{ }\FunctionTok{target}\KeywordTok{:}\AttributeTok{ /nfsroot} -\AttributeTok{ }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{type}\KeywordTok{:}\AttributeTok{ bind} -\AttributeTok{ }\FunctionTok{source}\KeywordTok{:}\AttributeTok{ /run/media/araxor/bigdata/nfsshared} -\AttributeTok{ }\FunctionTok{target}\KeywordTok{:}\AttributeTok{ /nfsshared} -\AttributeTok{ }\KeywordTok{{-}}\AttributeTok{ }\FunctionTok{type}\KeywordTok{:}\AttributeTok{ bind} -\AttributeTok{ }\FunctionTok{source}\KeywordTok{:}\AttributeTok{ /lib/modules} -\AttributeTok{ }\FunctionTok{target}\KeywordTok{:}\AttributeTok{ /lib/modules} -\AttributeTok{ }\FunctionTok{read\_only}\KeywordTok{:}\AttributeTok{ }\CharTok{yes} -\AttributeTok{ }\FunctionTok{environment}\KeywordTok{:} -\AttributeTok{ }\FunctionTok{NFS\_LOG\_LEVEL}\KeywordTok{:}\AttributeTok{ DEBUG} -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployer_dockerfile}{% -\section{\texorpdfstring{\texttt{deployer/Dockerfile}: configuration -\emph{Docker} pour la construction de l'OS de -déploiement}{deployer/Dockerfile: configuration Docker pour la construction de l'OS de déploiement}}\label{deployer_dockerfile}} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{FROM}\NormalTok{ debian:bullseye as build{-}stage} -\KeywordTok{RUN}\NormalTok{ apt{-}get update \&\& apt{-}get install {-}y multistrap} - -\KeywordTok{WORKDIR}\NormalTok{ /multistrap} - -\KeywordTok{ADD}\NormalTok{ ./multistrap.config ./} -\KeywordTok{RUN}\NormalTok{ multistrap {-}{-}arch amd64 {-}{-}file ./multistrap.config {-}{-}dir ./rootfs {-}{-}tidy{-}up} - -\KeywordTok{ADD}\NormalTok{ ./hostname ./rootfs/etc/hostname} -\KeywordTok{ADD}\NormalTok{ ./hosts ./rootfs/etc/hosts} -\KeywordTok{ADD}\NormalTok{ ./fstab ./rootfs/etc/fstab} -\KeywordTok{ADD}\NormalTok{ ./initramfs.conf ./rootfs/etc/initramfs{-}tools/initramfs.conf} -\KeywordTok{ADD}\NormalTok{ ./bootiful{-}deploy{-}log.service ./rootfs/etc/systemd/system/bootiful{-}deploy{-}log.service} - -\KeywordTok{ADD}\NormalTok{ ./configure.sh ./rootfs/} -\KeywordTok{RUN}\NormalTok{ chroot /multistrap/rootfs ./configure.sh} - -\KeywordTok{RUN}\NormalTok{ mkdir ./boot ./rootfs/bootiful ./rootfs/var/lib/clonezilla ./rootfs/home/partimag} -\KeywordTok{RUN}\NormalTok{ ln {-}s /proc/mounts rootfs/etc/mtab} -\KeywordTok{RUN}\NormalTok{ cp ./rootfs/vmlinuz ./rootfs/initrd.img ./boot/ \&\& \textbackslash{}} -\NormalTok{ rm {-}rf ./rootfs/configure.sh ./rootfs/vmlinuz* ./rootfs/initrd.img* ./rootfs/boot} - -\KeywordTok{ADD}\NormalTok{ ./bootiful{-}deploy{-}init ./rootfs/usr/bin/} -\KeywordTok{ADD}\NormalTok{ ./bootiful{-}common ./rootfs/usr/bin/} -\KeywordTok{ADD}\NormalTok{ ./bootiful{-}deploy ./rootfs/usr/bin/} -\KeywordTok{ADD}\NormalTok{ ./bootiful{-}save{-}image ./rootfs/usr/bin/} -\KeywordTok{ADD}\NormalTok{ ./bootiful{-}reset{-}cache ./rootfs/usr/bin/} -\KeywordTok{RUN}\NormalTok{ tar {-}czf nfsroot.tar.gz rootfs {-}{-}hard{-}dereference \&\& rm {-}rf ./rootfs} - -\KeywordTok{FROM}\NormalTok{ scratch AS nfs{-}export{-}stage} -\KeywordTok{COPY}\NormalTok{ {-}{-}from=build{-}stage /multistrap/nfsroot.tar.gz /} - -\KeywordTok{FROM}\NormalTok{ scratch AS tftp{-}export{-}stage} -\KeywordTok{COPY}\NormalTok{ {-}{-}from=build{-}stage /multistrap/boot /} - -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployerbootiful-deploy-log.service-configuration-de-lunituxe9-systemd-des-script-de-duxe9ploiement}{% -\section{\texorpdfstring{\texttt{deployer/bootiful-deploy-log.service}: -configuration de l'unité \emph{Systemd} des script de -déploiement}{deployer/bootiful-deploy-log.service: configuration de l'unité Systemd des script de déploiement}}\label{deployerbootiful-deploy-log.service-configuration-de-lunituxe9-systemd-des-script-de-duxe9ploiement}} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{[Unit]} -\DataTypeTok{Description}\OtherTok{=}\StringTok{Bootiful interactive remote image deployment} -\DataTypeTok{Conflicts}\OtherTok{=}\StringTok{gettytty1.service} -\DataTypeTok{Before}\OtherTok{=}\StringTok{getty.target} - -\KeywordTok{[Service]} -\DataTypeTok{Type}\OtherTok{=}\StringTok{oneshot} -\DataTypeTok{RemainAfterExit}\OtherTok{=}\KeywordTok{yes} -\DataTypeTok{ExecStartPre}\OtherTok{=}\StringTok{/bin/sleep }\DecValTok{2} -\DataTypeTok{ExecStart}\OtherTok{=}\StringTok{/usr/bin/bootiful{-}deploy{-}init} -\DataTypeTok{StandardInput}\OtherTok{=}\StringTok{tty} -\DataTypeTok{StandardOutput}\OtherTok{=}\StringTok{tty} -\DataTypeTok{StandardError}\OtherTok{=}\StringTok{tty} -\DataTypeTok{ } -\KeywordTok{[Install]} -\DataTypeTok{WantedBy}\OtherTok{=}\StringTok{multi{-}user.target} -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployerinitramfs.conf-configuration-pour-cruxe9ation-dun-initramfs-pour-duxe9marrer-avec-nfs}{% -\section{\texorpdfstring{\texttt{deployer/initramfs.conf}: configuration -pour création d'un \emph{initramfs} pour démarrer avec -\protect\hyperlink{acronym__NFS}{NFS}}{deployer/initramfs.conf: configuration pour création d'un initramfs pour démarrer avec NFS}}\label{deployerinitramfs.conf-configuration-pour-cruxe9ation-dun-initramfs-pour-duxe9marrer-avec-nfs}} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\#} -\CommentTok{\# initramfs.conf} -\CommentTok{\# Configuration file for mkinitramfs(8). See initramfs.conf(5).} -\CommentTok{\#} -\CommentTok{\# Note that configuration options from this file can be overridden} -\CommentTok{\# by config files in the /etc/initramfs{-}tools/conf.d directory.} - -\CommentTok{\#} -\CommentTok{\# MODULES: [ most | netboot | dep | list ]} -\CommentTok{\#} -\CommentTok{\# most {-} Add most filesystem and all harddrive drivers.} -\CommentTok{\#} -\CommentTok{\# dep {-} Try and guess which modules to load.} -\CommentTok{\#} -\CommentTok{\# netboot {-} Add the base modules, network modules, but skip block devices.} -\CommentTok{\#} -\CommentTok{\# list {-} Only include modules from the \textquotesingle{}additional modules\textquotesingle{} list} -\CommentTok{\#} - -\VariableTok{MODULES=}\NormalTok{netboot} - -\CommentTok{\#} -\CommentTok{\# BUSYBOX: [ y | n | auto ]} -\CommentTok{\#} -\CommentTok{\# Use busybox shell and utilities. If set to n, klibc utilities will be used.} -\CommentTok{\# If set to auto (or unset), busybox will be used if installed and klibc will} -\CommentTok{\# be used otherwise.} -\CommentTok{\#} - -\VariableTok{BUSYBOX=}\NormalTok{auto} - -\CommentTok{\#} -\CommentTok{\# KEYMAP: [ y | n ]} -\CommentTok{\#} -\CommentTok{\# Load a keymap during the initramfs stage.} -\CommentTok{\#} - -\VariableTok{KEYMAP=}\NormalTok{n} - -\CommentTok{\#} -\CommentTok{\# COMPRESS: [ gzip | bzip2 | lz4 | lzma | lzop | xz ]} -\CommentTok{\#} - -\VariableTok{COMPRESS=}\NormalTok{xz} - -\CommentTok{\#} -\CommentTok{\# NFS Section of the config.} -\CommentTok{\#} - -\CommentTok{\#} -\CommentTok{\# DEVICE: ...} -\CommentTok{\#} -\CommentTok{\# Specify a specific network interface, like eth0} -\CommentTok{\# Overridden by optional ip= or BOOTIF= bootarg} -\CommentTok{\#} - -\VariableTok{DEVICE=} - -\CommentTok{\#} -\CommentTok{\# NFSROOT: [ auto | HOST:MOUNT ]} -\CommentTok{\#} - -\VariableTok{NFSROOT=}\NormalTok{auto} - -\CommentTok{\#} -\CommentTok{\# RUNSIZE: ...} -\CommentTok{\#} -\CommentTok{\# The size of the /run tmpfs mount point, like 256M or 10\%} -\CommentTok{\# Overridden by optional initramfs.runsize= bootarg} -\CommentTok{\#} - -\VariableTok{RUNSIZE=}\NormalTok{10}\ExtensionTok{\%} -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployermultistrap.config-configuration-multistrap-pour-la-cruxe9ation-du-systuxe8me-de-fichiers-racine}{% -\section{\texorpdfstring{\texttt{deployer/multistrap.config}: -configuration \emph{multistrap} pour la création du système de fichiers -racine}{deployer/multistrap.config: configuration multistrap pour la création du système de fichiers racine}}\label{deployermultistrap.config-configuration-multistrap-pour-la-cruxe9ation-du-systuxe8me-de-fichiers-racine}} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{[General]} -\DataTypeTok{unpack}\OtherTok{=}\KeywordTok{true} -\DataTypeTok{bootstrap}\OtherTok{=}\StringTok{DRBL Debian} -\DataTypeTok{aptsources}\OtherTok{=}\StringTok{Debian} -\DataTypeTok{addimportant}\OtherTok{=}\KeywordTok{true} - -\KeywordTok{[Debian]} -\DataTypeTok{packages}\OtherTok{=}\StringTok{nfs{-}common linux{-}image{-}amd64 parted systemd udev strace zstd dialog lolcat gdisk gawk pigz pv clonezilla partclone partimage cifs{-}utils} -\DataTypeTok{source}\OtherTok{=}\StringTok{http://http.debian.net/debian} -\DataTypeTok{keyring}\OtherTok{=}\StringTok{debian{-}archive{-}keyring} -\DataTypeTok{suite}\OtherTok{=}\StringTok{bullseye} -\DataTypeTok{components}\OtherTok{=}\StringTok{main contrib non{-}free} -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployerconfigure.sh-script-de-configuration-du-systuxe8me-de-fichier-racine-uxe0-exuxe9cuter-en-chroot}{% -\section{\texorpdfstring{\texttt{deployer/configure.sh}: script de -configuration du système de fichier racine à exécuter en -\texttt{chroot}}{deployer/configure.sh: script de configuration du système de fichier racine à exécuter en chroot}}\label{deployerconfigure.sh-script-de-configuration-du-systuxe8me-de-fichier-racine-uxe0-exuxe9cuter-en-chroot}} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\#!/bin/bash} - -\KeywordTok{set} \ExtensionTok{{-}e} - -\BuiltInTok{export} \VariableTok{DEBIAN\_FRONTEND=}\NormalTok{noninteractive }\VariableTok{DEBCONF\_NONINTERACTIVE\_SEEN=}\NormalTok{true} -\BuiltInTok{export} \VariableTok{LC\_ALL=}\NormalTok{C }\VariableTok{LANGUAGE=}\NormalTok{C }\VariableTok{LANG=}\NormalTok{C} - -\ExtensionTok{dpkg}\NormalTok{ {-}{-}configure {-}a} - -\ExtensionTok{apt{-}get}\NormalTok{ autoremove {-}{-}purge} -\ExtensionTok{apt{-}get}\NormalTok{ clean} - -\ExtensionTok{update{-}initramfs}\NormalTok{ {-}u} - -\ExtensionTok{systemctl}\NormalTok{ enable bootiful{-}deploy{-}log.service} - -\BuiltInTok{echo} \StringTok{"root:bootiful"} \KeywordTok{|} \ExtensionTok{chpasswd} -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployerbootiful-deploy-init-script-dinitialisation-du-duxe9ploiement}{% -\section{\texorpdfstring{\texttt{deployer/bootiful-deploy-init}: script -d'initialisation du -déploiement}{deployer/bootiful-deploy-init: script d'initialisation du déploiement}}\label{deployerbootiful-deploy-init-script-dinitialisation-du-duxe9ploiement}} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\#!/bin/bash} - -\BuiltInTok{umask}\NormalTok{ {-}S 0000 }\OperatorTok{\&\textgreater{}}\NormalTok{/dev/null} -\FunctionTok{clear} -\ExtensionTok{/usr/games/lolcat}\NormalTok{ {-}a {-}d 6 {-}s 20 {-}F 0.5 }\OperatorTok{\textless{}\textless{}\textquotesingle{}EOF\textquotesingle{}} -\NormalTok{ .o8 . o8o .o88o. oooo} -\NormalTok{"888 .o8 \textasciigrave{}"\textquotesingle{} 888 \textasciigrave{}" \textasciigrave{}888} -\NormalTok{ 888oooo. .ooooo. .ooooo. .o888oo oooo o888oo oooo oooo 888} -\NormalTok{ d88\textquotesingle{} \textasciigrave{}88b d88\textquotesingle{} \textasciigrave{}88b d88\textquotesingle{} \textasciigrave{}88b 888 \textasciigrave{}888 888 \textasciigrave{}888 \textasciigrave{}888 888} -\NormalTok{ 888 888 888 888 888 888 888 888 888 888 888 888} -\NormalTok{ 888 888 888 888 888 888 888 . 888 888 888 888 888} -\NormalTok{ \textasciigrave{}Y8bod8P\textquotesingle{} \textasciigrave{}Y8bod8P\textquotesingle{} \textasciigrave{}Y8bod8P\textquotesingle{} "888" o888o o888o \textasciigrave{}V88V"V8P\textquotesingle{} o888o} -\OperatorTok{EOF} -\BuiltInTok{declare} \VariableTok{logo\_pressed\_key} -\BuiltInTok{read}\NormalTok{ {-}t 0.001 {-}n 1 {-}s {-}r }\VariableTok{logo\_pressed\_key} -\BuiltInTok{readonly} \VariableTok{logo\_pressed\_key} - -\FunctionTok{select\_next\_action()} \KeywordTok{\{} - \BuiltInTok{local} \VariableTok{next\_action\_pressed\_key} - \KeywordTok{while} \FunctionTok{true}\KeywordTok{;} \KeywordTok{do} - \BuiltInTok{echo} - \BuiltInTok{echo} \StringTok{"Press \textquotesingle{}d\textquotesingle{} to restart deployment"} - \BuiltInTok{echo} \StringTok{"Press \textquotesingle{}s\textquotesingle{} to start an interactive command{-}line shell"} - \BuiltInTok{echo} \StringTok{"Press \textquotesingle{}r\textquotesingle{} to reboot"} - \BuiltInTok{echo} \StringTok{"Press \textquotesingle{}p\textquotesingle{} to power off"} - - \BuiltInTok{read}\NormalTok{ {-}n 1 {-}s {-}r }\VariableTok{next\_action\_pressed\_key} - \KeywordTok{case} \StringTok{"}\VariableTok{$next\_action\_pressed\_key}\StringTok{"}\KeywordTok{ in} -\NormalTok{ [dD]}\KeywordTok{)} - \BuiltInTok{echo} \StringTok{"Restarting deployment..."} - \BuiltInTok{break} - \KeywordTok{;;} -\NormalTok{ [sS]}\KeywordTok{)} - \BuiltInTok{echo} \StringTok{"Starting an interactive command{-}line shell..."} - \ExtensionTok{/bin/bash}\NormalTok{ {-}i} - \KeywordTok{;;} -\NormalTok{ [rR]}\KeywordTok{)} - \BuiltInTok{echo} \StringTok{"Rebooting..."} - \ExtensionTok{reboot} - \KeywordTok{;;} -\NormalTok{ [pP]}\KeywordTok{)} - \BuiltInTok{echo} \StringTok{"Powering off..."} - \ExtensionTok{poweroff} - \KeywordTok{;;} -\NormalTok{ *}\KeywordTok{)} - \BuiltInTok{echo} \StringTok{"Error: No action defined for key \textquotesingle{}}\VariableTok{$next\_action\_pressed\_key}\StringTok{\textquotesingle{}"} - \KeywordTok{;;} - \KeywordTok{esac} - \KeywordTok{done} -\KeywordTok{\}} - -\KeywordTok{if [[} \StringTok{"}\VariableTok{$logo\_pressed\_key}\StringTok{"}\NormalTok{ =\textasciitilde{} \^{}[sS]$}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Skipping deployment...."} - \ExtensionTok{/bin/bash}\NormalTok{ {-}i} - \ExtensionTok{select\_next\_action} -\KeywordTok{fi} - -\KeywordTok{while}\NormalTok{ ! }\ExtensionTok{bootiful{-}deploy}\KeywordTok{;} \KeywordTok{do} - \BuiltInTok{echo} \StringTok{"Error in deployment."} - \ExtensionTok{select\_next\_action} -\KeywordTok{done} - -\BuiltInTok{echo} \StringTok{"Deployment successful. Rebooting..."} -\ExtensionTok{reboot} - -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployerbootiful-common-script-de-duxe9finition-des-fonctions-communes-aux-scripts-bootiful-}{% -\section{\texorpdfstring{\texttt{deployer/bootiful-common}: script de -définition des fonctions communes aux scripts -\texttt{bootiful-*}}{deployer/bootiful-common: script de définition des fonctions communes aux scripts bootiful-*}}\label{deployerbootiful-common-script-de-duxe9finition-des-fonctions-communes-aux-scripts-bootiful-}} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\#!/bin/bash} - -\KeywordTok{if [[} \StringTok{"}\VariableTok{$\{BASH\_SOURCE[0]\}}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$0}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \OperatorTok{\textgreater{}\&2} \StringTok{"Error: script \textquotesingle{}}\VariableTok{$0}\StringTok{\textquotesingle{} must be sourced, not executed."} - \BuiltInTok{return}\NormalTok{ 1} -\KeywordTok{fi} - -\KeywordTok{if [[} \OtherTok{{-}n} \StringTok{"}\VariableTok{$BOOTIFUL\_COMMON\_SOURCED}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \OperatorTok{\textgreater{}\&2} \StringTok{"Warning: script \textquotesingle{}}\VariableTok{$0}\StringTok{\textquotesingle{} sourced more than once."} - \BuiltInTok{return}\NormalTok{ 0} -\KeywordTok{fi} - -\BuiltInTok{readonly} \VariableTok{BOOTIFUL\_COMMON\_SOURCED=}\NormalTok{true} - -\FunctionTok{echo\_err()} \KeywordTok{\{} - \BuiltInTok{echo} \OperatorTok{\textgreater{}\&2} \StringTok{"$"} -\KeywordTok{\}} - -\CommentTok{\# Writes an error message and a stack trace to stderr, then exits the current} -\CommentTok{\# shell with the error status code 1.} -\CommentTok{\#} -\CommentTok{\# Warning: if called in a sub{-}shell, the error messages are written to stderr} -\CommentTok{\# but only the sub{-}shell is exited. The parent shell should always} -\CommentTok{\# check the sub{-}shells exit status codes and call \textasciigrave{}fatal\_error\textasciigrave{} if a} -\CommentTok{\# non{-}0 exit status is returned.} -\FunctionTok{fatal\_error()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{message=}\StringTok{"}\VariableTok{$\{1:{-}}\NormalTok{unknown reason}\VariableTok{\}}\StringTok{"} - - \ExtensionTok{echo\_err} \StringTok{"Fatal error: }\VariableTok{$message}\StringTok{"} - - \ExtensionTok{echo\_err} \StringTok{"Stack trace:"} - \BuiltInTok{local} \VariableTok{frame=}\NormalTok{0} - \KeywordTok{while} \OperatorTok{\textgreater{}\&2} \BuiltInTok{caller} \VariableTok{$frame}\KeywordTok{;} \KeywordTok{do} - \KeywordTok{((}\NormalTok{frame++}\KeywordTok{))} - \KeywordTok{done} - - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{\}} - -\CommentTok{\# If the INT signal (ctrl+c) is received, a fatal error is thrown} -\FunctionTok{fatal\_error\_on\_sigint()} \KeywordTok{\{} - \ExtensionTok{fatal\_error} \StringTok{"SIGINT received"} -\KeywordTok{\}} -\BuiltInTok{trap}\NormalTok{ fatal\_error\_on\_sigint INT} - -\BuiltInTok{declare}\NormalTok{ {-}a }\VariableTok{exit\_callbacks=()} -\FunctionTok{execute\_exit\_callbacks()} \KeywordTok{\{} - \KeywordTok{for} \ExtensionTok{exit\_callback}\NormalTok{ in }\StringTok{"}\VariableTok{$\{exit\_callbacks[]\}}\StringTok{"}\KeywordTok{;} \KeywordTok{do} - \StringTok{"}\VariableTok{$exit\_callback}\StringTok{"} - \KeywordTok{done} -\KeywordTok{\}} -\BuiltInTok{trap} \StringTok{\textquotesingle{}execute\_exit\_callbacks\textquotesingle{}}\NormalTok{ EXIT} - -\FunctionTok{add\_exit\_callback()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{exit\_callback\_function=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \VariableTok{exit\_callbacks+=(}\StringTok{"}\VariableTok{$exit\_callback\_function}\StringTok{"}\VariableTok{)} -\KeywordTok{\}} - -\BuiltInTok{declare}\NormalTok{ {-}a }\VariableTok{step\_names=()} -\BuiltInTok{declare}\NormalTok{ {-}a }\VariableTok{step\_timestamps=()} -\BuiltInTok{declare}\NormalTok{ {-}a }\VariableTok{step\_durations=()} -\BuiltInTok{declare}\NormalTok{ {-}a }\VariableTok{step\_types=()} - -\BuiltInTok{readonly} \VariableTok{STEP\_TYPE\_BATCH=}\StringTok{"batch"} -\BuiltInTok{readonly} \VariableTok{STEP\_TYPE\_INTERACTIVE=}\StringTok{"interactive"} - -\FunctionTok{timestamp\_now()} \KeywordTok{\{} - \FunctionTok{date}\NormalTok{ +\%s} -\KeywordTok{\}} - -\FunctionTok{finish\_step()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{step\_name=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{step\_start\_timestamp=}\StringTok{"}\VariableTok{$2}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{step\_finish\_timestamp=}\StringTok{"}\VariableTok{$3}\StringTok{"} - - \VariableTok{step\_durations+=($((}\StringTok{"}\VariableTok{$step\_finish\_timestamp}\StringTok{"}\NormalTok{ {-} }\StringTok{"}\VariableTok{$\{step\_start\_timestamp\}}\StringTok{"}\VariableTok{)))} - \ExtensionTok{echo\_err} \StringTok{"Finished }\VariableTok{$step\_name}\StringTok{ (duration: }\VariableTok{$\{step\_durations[{-}1]\}}\StringTok{s)"} -\KeywordTok{\}} - -\FunctionTok{print\_step\_durations()} \KeywordTok{\{} - - \KeywordTok{if [[} \StringTok{"$\{\#step\_timestamps[]\}"} \OtherTok{{-}gt}\NormalTok{ 1}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{finish\_step} \StringTok{"}\VariableTok{$\{step\_names[{-}1]\}}\StringTok{"} \KeywordTok{\textbackslash{}} - \StringTok{"}\VariableTok{$\{step\_timestamps[{-}1]\}}\StringTok{"} \KeywordTok{\textbackslash{}} - \StringTok{"}\VariableTok{$(}\ExtensionTok{timestamp\_now}\VariableTok{)}\StringTok{"} - \KeywordTok{fi} - - \BuiltInTok{local} \VariableTok{total\_batch\_duration=}\NormalTok{0} - \BuiltInTok{local} \VariableTok{total\_interactive\_duration=}\NormalTok{0} - \BuiltInTok{local} \VariableTok{total\_duration=}\NormalTok{0} - \BuiltInTok{local} \VariableTok{step\_name} - \BuiltInTok{local} \VariableTok{step\_type} - \BuiltInTok{local} \VariableTok{step\_duration} - \BuiltInTok{local} \VariableTok{step\_number} - - \ExtensionTok{echo\_err} - \ExtensionTok{echo\_err} \StringTok{"Steps duration summary:"} - - \KeywordTok{for} \ExtensionTok{i}\NormalTok{ in }\StringTok{"$\{!step\_durations[]\}"}\KeywordTok{;} \KeywordTok{do} - \VariableTok{step\_name=}\StringTok{"}\VariableTok{$\{step\_names[$i]\}}\StringTok{"} - \VariableTok{step\_duration=}\StringTok{"}\VariableTok{$\{step\_durations[$i]\}}\StringTok{"} - \VariableTok{step\_type=}\StringTok{"}\VariableTok{$\{step\_types[$i]\}}\StringTok{"} - \VariableTok{step\_number=$((}\NormalTok{i + 1}\VariableTok{))} - - \ExtensionTok{echo\_err} \StringTok{"}\VariableTok{$step\_number}\StringTok{ {-} }\VariableTok{$step\_name}\StringTok{ took }\VariableTok{$\{step\_duration\}}\StringTok{ seconds (}\VariableTok{$step\_type}\StringTok{)"} - - \KeywordTok{case} \StringTok{"}\VariableTok{$step\_type}\StringTok{"}\KeywordTok{ in} - \StringTok{"}\VariableTok{$STEP\_TYPE\_BATCH}\StringTok{"}\KeywordTok{)} - \KeywordTok{((}\NormalTok{total\_batch\_duration += }\StringTok{"}\VariableTok{$step\_duration}\StringTok{"}\KeywordTok{))} - \KeywordTok{;;} - \StringTok{"}\VariableTok{$STEP\_TYPE\_INTERACTIVE}\StringTok{"}\KeywordTok{)} - \KeywordTok{((}\NormalTok{total\_interactive\_duration += }\StringTok{"}\VariableTok{$step\_duration}\StringTok{"}\KeywordTok{))} - \KeywordTok{;;} - \KeywordTok{esac} - - \KeywordTok{((}\NormalTok{total\_duration += }\StringTok{"}\VariableTok{$step\_duration}\StringTok{"}\KeywordTok{))} - \KeywordTok{done} - - \ExtensionTok{echo\_err} - \ExtensionTok{echo\_err} \StringTok{"Total batch duration: }\VariableTok{$\{total\_batch\_duration\}}\StringTok{s"} - \ExtensionTok{echo\_err} \StringTok{"Total interactive duration: }\VariableTok{$\{total\_interactive\_duration\}}\StringTok{s"} - \ExtensionTok{echo\_err} \StringTok{"Total duration: }\VariableTok{$\{total\_duration\}}\StringTok{s"} -\KeywordTok{\}} - -\FunctionTok{start\_step()} \KeywordTok{\{} - \VariableTok{step\_timestamps+=(}\StringTok{"}\VariableTok{$(}\ExtensionTok{timestamp\_now}\VariableTok{)}\StringTok{"}\VariableTok{)} - \VariableTok{step\_names+=(}\StringTok{"}\VariableTok{$1}\StringTok{"}\VariableTok{)} - \VariableTok{step\_types+=(}\StringTok{"}\VariableTok{$2}\StringTok{"}\VariableTok{)} - - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{steps\_count=}\StringTok{"$\{\#step\_timestamps[]\}"} - - \KeywordTok{if [[} \VariableTok{$steps\_count} \OtherTok{{-}eq}\NormalTok{ 1}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{add\_exit\_callback} \StringTok{"print\_step\_durations"} - \KeywordTok{elif [[} \StringTok{"$\{\#step\_timestamps[]\}"} \OtherTok{{-}gt}\NormalTok{ 1}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{finish\_step} \StringTok{"}\VariableTok{$\{step\_names[{-}2]\}}\StringTok{"} \KeywordTok{\textbackslash{}} - \StringTok{"}\VariableTok{$\{step\_timestamps[{-}2]\}}\StringTok{"} \KeywordTok{\textbackslash{}} - \StringTok{"}\VariableTok{$\{step\_timestamps[{-}1]\}}\StringTok{"} - \KeywordTok{fi} - - \ExtensionTok{echo\_err} \StringTok{"Started }\VariableTok{$\{step\_names[{-}1]\}}\StringTok{"} -\KeywordTok{\}} - -\FunctionTok{start\_step\_batch()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{step\_name=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \ExtensionTok{start\_step} \StringTok{"}\VariableTok{$step\_name}\StringTok{"} \StringTok{"}\VariableTok{$STEP\_TYPE\_BATCH}\StringTok{"} -\KeywordTok{\}} - -\FunctionTok{start\_step\_interactive()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{step\_name=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \ExtensionTok{start\_step} \StringTok{"}\VariableTok{$step\_name}\StringTok{"} \StringTok{"}\VariableTok{$STEP\_TYPE\_INTERACTIVE}\StringTok{"} -\KeywordTok{\}} - -\FunctionTok{warning()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{message=}\StringTok{"}\VariableTok{$1}\StringTok{"} - - \ExtensionTok{echo\_err} - \ExtensionTok{echo\_err} \StringTok{"Warning: }\VariableTok{$message}\StringTok{"} - - \BuiltInTok{local} \VariableTok{pressed\_key} - \KeywordTok{while} \FunctionTok{true}\KeywordTok{;} \KeywordTok{do} - \ExtensionTok{echo\_err} - \ExtensionTok{echo\_err} \StringTok{"Continue? (y/n) "} - - \BuiltInTok{read}\NormalTok{ {-}n 1 {-}s {-}r }\VariableTok{pressed\_key} - \KeywordTok{case} \StringTok{"}\VariableTok{$pressed\_key}\StringTok{"}\KeywordTok{ in} -\NormalTok{ [yY]}\KeywordTok{)} - \ExtensionTok{echo\_err} \StringTok{"Continuing..."} - \BuiltInTok{return}\NormalTok{ 0} - \KeywordTok{;;} -\NormalTok{ [nN]}\KeywordTok{)} - \ExtensionTok{echo\_err} \StringTok{"Aborting..."} - \BuiltInTok{exit}\NormalTok{ 1} - \KeywordTok{;;} -\NormalTok{ *}\KeywordTok{)} - \ExtensionTok{echo\_err} \StringTok{"Invalid key \textquotesingle{}}\VariableTok{$pressed\_key}\StringTok{\textquotesingle{}"} - \KeywordTok{;;} - \KeywordTok{esac} - \KeywordTok{done} -\KeywordTok{\}} - -\FunctionTok{validation\_error()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{value=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{validation\_error\_message=}\StringTok{"}\VariableTok{$2}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{fatal\_error\_message=}\StringTok{"}\VariableTok{$3}\StringTok{"} - \ExtensionTok{echo\_err} \StringTok{"Validation error: value \textquotesingle{}}\VariableTok{$value}\StringTok{\textquotesingle{} }\VariableTok{$validation\_error\_message}\StringTok{."} - \ExtensionTok{fatal\_error} \StringTok{"}\VariableTok{$fatal\_error\_message}\StringTok{"} -\KeywordTok{\}} - -\FunctionTok{validate\_not\_empty()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{value=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{error\_message=}\StringTok{"}\VariableTok{$2}\StringTok{"} - - \KeywordTok{if [[} \OtherTok{{-}z} \StringTok{"}\VariableTok{$value}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{validation\_error} \StringTok{"}\VariableTok{$value}\StringTok{"} \StringTok{"is empty"} \StringTok{"}\VariableTok{$error\_message}\StringTok{"} - \KeywordTok{fi} -\KeywordTok{\}} - -\FunctionTok{validate\_with\_regex()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{value=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{regex\_pattern=}\StringTok{"}\VariableTok{$2}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{fatal\_error\_message=}\StringTok{"}\VariableTok{$3}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{validation\_error\_message=}\StringTok{"}\VariableTok{$\{4:{-}}\StringTok{"does not match regex pattern \textquotesingle{}}\VariableTok{$regex\_pattern}\StringTok{\textquotesingle{}"}\VariableTok{\}}\StringTok{"} - - \KeywordTok{if [[} \OtherTok{!} \StringTok{"}\VariableTok{$value}\StringTok{"}\NormalTok{ =\textasciitilde{} }\VariableTok{$regex\_pattern}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{validation\_error} \StringTok{"}\VariableTok{$value}\StringTok{"} \StringTok{"}\VariableTok{$validation\_error\_message}\StringTok{"} \StringTok{"}\VariableTok{$fatal\_error\_message}\StringTok{"} - \KeywordTok{fi} -\KeywordTok{\}} - -\FunctionTok{validate\_uint()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{value=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{error\_message=}\StringTok{"}\VariableTok{$2}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{regex\_pattern=}\StringTok{\textquotesingle{}\^{}[0{-}9]+$\textquotesingle{}} - - \ExtensionTok{validate\_with\_regex} \StringTok{"}\VariableTok{$value}\StringTok{"} \StringTok{"}\VariableTok{$regex\_pattern}\StringTok{"} \StringTok{"}\VariableTok{$error\_message}\StringTok{"} \StringTok{"is not a positive integer"} -\KeywordTok{\}} - -\FunctionTok{validate\_nonzero\_uint()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{value=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{error\_message=}\StringTok{"}\VariableTok{$2}\StringTok{"} - - \ExtensionTok{validate\_uint} \StringTok{"}\VariableTok{$value}\StringTok{"} \StringTok{"}\VariableTok{$error\_message}\StringTok{"} - - \KeywordTok{if [[} \StringTok{"}\VariableTok{$value}\StringTok{"} \OtherTok{{-}le}\NormalTok{ 0}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{validation\_error} \StringTok{"}\VariableTok{$value}\StringTok{"} \StringTok{"is not bigger than zero"} \StringTok{"}\VariableTok{$error\_message}\StringTok{"} - \KeywordTok{fi} -\KeywordTok{\}} - -\FunctionTok{validate\_file\_exists()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{value=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{error\_message=}\StringTok{"}\VariableTok{$\{2:{-}}\NormalTok{File does not exist}\VariableTok{\}}\StringTok{"} - - \KeywordTok{if [[} \OtherTok{!} \OtherTok{{-}f} \StringTok{"}\VariableTok{$value}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{validation\_error} \StringTok{"}\VariableTok{$value}\StringTok{"} \StringTok{"is not the path of an existing regular file"} \StringTok{"}\VariableTok{$error\_message}\StringTok{"} - \KeywordTok{fi} -\KeywordTok{\}} - -\CommentTok{\# Validates that the given file exists but do not test if it\textquotesingle{}s a regular file} -\CommentTok{\# like \textasciigrave{}validate\_file\_exists\textasciigrave{}.} -\FunctionTok{validate\_exists()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{value=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{error\_message=}\StringTok{"}\VariableTok{$2}\StringTok{"} - - \KeywordTok{if [[} \OtherTok{!} \OtherTok{{-}e} \StringTok{"}\VariableTok{$value}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{validation\_error} \StringTok{"}\VariableTok{$value}\StringTok{"} \StringTok{"is not an existing path"} \StringTok{"}\VariableTok{$error\_message}\StringTok{"} - \KeywordTok{fi} -\KeywordTok{\}} - -\CommentTok{\# Usage:} -\CommentTok{\# ensure\_variable VARIABLE\_NAME COMPUTATION\_FUNCTION VALIDATION\_FUNCTION} -\CommentTok{\#} -\CommentTok{\# Description:} -\CommentTok{\# Ensures that a readonly global variable named VARIABLE\_NAME is declared,} -\CommentTok{\# that it\textquotesingle{}s value is initialized using COMPUTATION\_FUNCTION and validated} -\CommentTok{\# using VALIDATION\_FUNCTION.} -\CommentTok{\#} -\CommentTok{\# The value is computed, validated and set to a readonly global variable} -\CommentTok{\# during the first call to this function. Nothing more is done on} -\CommentTok{\# subsequent calls if the variable is already set.} -\CommentTok{\#} -\CommentTok{\# If this function returns, the variable VARIABLE\_NAME should be safe to} -\CommentTok{\# use without any further validation. The variable can be accessed from} -\CommentTok{\# it\textquotesingle{}s name, or using an expression like \textasciigrave{}$\{!VARIABLE\_NAME\}\textasciigrave{}.} -\CommentTok{\#} -\CommentTok{\# Arguments:} -\CommentTok{\# VARIABLE\_NAME} -\CommentTok{\# The name of the variable to ensure.} -\CommentTok{\#} -\CommentTok{\# COMPUTATION\_FUNCTION} -\CommentTok{\# A function that takes 0 arguments, writes the computed value to} -\CommentTok{\# standard output and returns 0 if the computation is successful.} -\CommentTok{\#} -\CommentTok{\# VALIDATION\_FUNCTION} -\CommentTok{\# A function that takes the computed value and returns 0 if the value} -\CommentTok{\# is valid.} -\CommentTok{\#} -\CommentTok{\# Exit status code:} -\CommentTok{\# 0 when no error is encountered. If any error is encountered during} -\CommentTok{\# declaration, computation, validation or assignation, the current shell} -\CommentTok{\# will be exited by a call to \textasciigrave{}fatal\_error\textasciigrave{} so the function will never} -\CommentTok{\# return.} -\FunctionTok{ensure\_variable()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{variable\_name=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{computation\_function=}\StringTok{"}\VariableTok{$2}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{validation\_function=}\StringTok{"}\VariableTok{$3}\StringTok{"} - - \KeywordTok{if [[}\NormalTok{ {-}v }\StringTok{"}\VariableTok{$variable\_name}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{return}\NormalTok{ 0} - \KeywordTok{fi} - - \BuiltInTok{local} \VariableTok{computed\_value} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot declare local variable \textquotesingle{}computed\_value\textquotesingle{}"} - - \VariableTok{computed\_value=}\StringTok{"}\VariableTok{$(}\StringTok{"}\VariableTok{$computation\_function}\StringTok{"}\VariableTok{)}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot compute value of \textquotesingle{}}\VariableTok{$variable\_name}\StringTok{\textquotesingle{} with \textquotesingle{}}\VariableTok{$computation\_function}\StringTok{\textquotesingle{}"} - - \StringTok{"}\VariableTok{$validation\_function}\StringTok{"} \StringTok{"}\VariableTok{$computed\_value}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot validate value of \textquotesingle{}}\VariableTok{$variable\_name}\StringTok{\textquotesingle{} with \textquotesingle{}}\VariableTok{$validation\_function}\StringTok{\textquotesingle{}"} - - \BuiltInTok{declare}\NormalTok{ {-}g {-}r }\StringTok{"}\VariableTok{$variable\_name}\StringTok{"}\VariableTok{=}\StringTok{"}\VariableTok{$computed\_value}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot initialize global readonly variable \textquotesingle{}}\VariableTok{$variable\_name}\StringTok{\textquotesingle{} with value \textquotesingle{}}\VariableTok{$computed\_value}\StringTok{\textquotesingle{}"} - - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{log\_variable\_name=}\StringTok{"}\VariableTok{$(}\BuiltInTok{echo} \StringTok{"}\VariableTok{$\{variable\_name\^{}\}}\StringTok{"} \KeywordTok{|} \FunctionTok{tr} \StringTok{\textquotesingle{}\_\textquotesingle{}} \StringTok{\textquotesingle{} \textquotesingle{}}\VariableTok{)}\StringTok{"} - \ExtensionTok{echo\_err} \StringTok{"}\VariableTok{$log\_variable\_name}\StringTok{: }\VariableTok{$\{!variable\_name\}}\StringTok{"} - - \BuiltInTok{return}\NormalTok{ 0} -\KeywordTok{\}} - -\CommentTok{\# Ensures $remote\_address is declared, initialized and valid.} -\FunctionTok{ensure\_remote\_address()} \KeywordTok{\{} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{remote\_address} - - \FunctionTok{get\_remote\_address()} \KeywordTok{\{} - \FunctionTok{mount}\NormalTok{ {-}t nfs }\KeywordTok{|} \FunctionTok{cut}\NormalTok{ {-}d}\StringTok{\textquotesingle{}:\textquotesingle{}}\NormalTok{ {-}f1 }\KeywordTok{|} \FunctionTok{head}\NormalTok{ {-}1 }\KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot retrieve remote server address."} - \KeywordTok{\}} - - \FunctionTok{validate\_remote\_address()} \KeywordTok{\{} - \ExtensionTok{validate\_not\_empty} \StringTok{"}\VariableTok{$1}\StringTok{"} \StringTok{"no valid remote server address has not been found."} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"remote\_address"} \StringTok{"get\_remote\_address"} \StringTok{"validate\_remote\_address"} -\KeywordTok{\}} - -\CommentTok{\# Ensures $net\_interface is declared, initialized and valid.} -\FunctionTok{ensure\_net\_interface()} \KeywordTok{\{} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{net\_interface} - - \ExtensionTok{ensure\_remote\_address} - - \FunctionTok{get\_net\_interface()} \KeywordTok{\{} - \ExtensionTok{ip}\NormalTok{ route get }\StringTok{"}\VariableTok{$remote\_address}\StringTok{"} \KeywordTok{|} \FunctionTok{head}\NormalTok{ {-}1 }\KeywordTok{|} \FunctionTok{sed}\NormalTok{ {-}n }\StringTok{\textquotesingle{}s/.* dev \textbackslash{}([\^{} ]*\textbackslash{}).*/\textbackslash{}1/p\textquotesingle{}} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot retrieve network interface with route to \textquotesingle{}}\VariableTok{$remote\_address}\StringTok{\textquotesingle{}."} - \KeywordTok{\}} - - \FunctionTok{validate\_net\_interface()} \KeywordTok{\{} - \ExtensionTok{validate\_not\_empty} \StringTok{"}\VariableTok{$1}\StringTok{"} \StringTok{"no valid network interface has been found."} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"net\_interface"} \StringTok{"get\_net\_interface"} \StringTok{"validate\_net\_interface"} -\KeywordTok{\}} - -\CommentTok{\# Ensures $mac\_address is declared, initialized and valid.} -\FunctionTok{ensure\_mac\_address()} \KeywordTok{\{} - \CommentTok{\# shellcheck disable=SC2034 \# the variable is declared for parent scripts that source this one} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{mac\_address} - - \ExtensionTok{ensure\_net\_interface} - - \FunctionTok{get\_mac\_address()} \KeywordTok{\{} - \FunctionTok{tr} \StringTok{"[:upper:]:"} \StringTok{"[:lower:]{-}"} \OperatorTok{\textless{}} \StringTok{"/sys/class/net/}\VariableTok{$net\_interface}\StringTok{/address"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"failed to retrieve and convert mac address of network interface \textquotesingle{}}\VariableTok{$net\_interface}\StringTok{\textquotesingle{}"} - \KeywordTok{\}} - - \FunctionTok{validate\_mac\_address()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{value=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{regex\_pattern=}\StringTok{\textquotesingle{}\^{}([0{-}9a{-}f]\{2\}{-})\{5\}[0{-}9a{-}f]\{2\}$\textquotesingle{}} - - \ExtensionTok{validate\_with\_regex} \KeywordTok{\textbackslash{}} - \StringTok{"}\VariableTok{$value}\StringTok{"} \StringTok{"}\VariableTok{$regex\_pattern}\StringTok{"} \KeywordTok{\textbackslash{}} - \StringTok{"mac address does not match required format."} \KeywordTok{\textbackslash{}} - \StringTok{"is not a mac address formatted as lower{-}case hexadecimal bytes separated by hyphens."} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"mac\_address"} \StringTok{"get\_mac\_address"} \StringTok{"validate\_mac\_address"} -\KeywordTok{\}} - -\BuiltInTok{readonly} \VariableTok{mounting\_point\_remote=}\StringTok{"/bootiful/shared"} -\BuiltInTok{readonly} \VariableTok{deployment\_disk=}\StringTok{"/dev/sda"} - -\CommentTok{\# Ensures the kernel is informed of the latest partition table changes} -\FunctionTok{refresh\_partition\_table()} \KeywordTok{\{} - \ExtensionTok{echo\_err} \StringTok{"Refreshing partition table on disk \textquotesingle{}}\VariableTok{$deployment\_disk}\StringTok{\textquotesingle{}..."} - \ExtensionTok{partprobe} \StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"} -\KeywordTok{\}} - -\CommentTok{\# Checks if something is currently mounted on the given mount point} -\FunctionTok{is\_mounted()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{mount\_point=}\StringTok{"}\VariableTok{$1}\StringTok{"} - - \ExtensionTok{refresh\_partition\_table} - \ExtensionTok{findmnt}\NormalTok{ {-}{-}mountpoint }\StringTok{"}\VariableTok{$mount\_point}\StringTok{"} -\KeywordTok{\}} - -\CommentTok{\# Ensures that the given directory exists or create it. If the directory does} -\CommentTok{\# not exist and cannot be created, \textasciigrave{}fatal\_error\textasciigrave{} is called.} -\FunctionTok{ensure\_directory()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{directory=}\StringTok{"}\VariableTok{$1}\StringTok{"} - - \ExtensionTok{echo\_err} \StringTok{"Ensuring directory \textquotesingle{}}\VariableTok{$directory}\StringTok{\textquotesingle{} exists..."} - \KeywordTok{if [[} \OtherTok{{-}d} \StringTok{"}\VariableTok{$directory}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{echo\_err} \StringTok{"Directory \textquotesingle{}}\VariableTok{$directory}\StringTok{\textquotesingle{} already exists."} - \BuiltInTok{return}\NormalTok{ 0} - \KeywordTok{fi} - - \ExtensionTok{echo\_err} \StringTok{"Directory \textquotesingle{}}\VariableTok{$directory}\StringTok{\textquotesingle{} does not exist. Attempting to create it..."} - \FunctionTok{mkdir}\NormalTok{ {-}p }\StringTok{"}\VariableTok{$directory}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot create directory }\VariableTok{$directory}\StringTok{."} - \ExtensionTok{echo\_err} \StringTok{"Directory \textquotesingle{}}\VariableTok{$directory}\StringTok{\textquotesingle{} created."} -\KeywordTok{\}} - -\CommentTok{\# Mounts a device to a mount point if it\textquotesingle{}s not already mounted} -\FunctionTok{ensure\_mounted()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{source\_device=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{mount\_point=}\StringTok{"}\VariableTok{$2}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{mount\_fstype=}\StringTok{"}\VariableTok{$3}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{mount\_options=}\StringTok{"}\VariableTok{$4}\StringTok{"} - - \ExtensionTok{echo\_err} \StringTok{"Ensuring device \textquotesingle{}}\VariableTok{$source\_device}\StringTok{\textquotesingle{} is mounted on \textquotesingle{}}\VariableTok{$mount\_point}\StringTok{\textquotesingle{}..."} - - \KeywordTok{if} \ExtensionTok{is\_mounted} \StringTok{"}\VariableTok{$mount\_point}\StringTok{"}\KeywordTok{;} \KeywordTok{then} - \ExtensionTok{echo\_err} \StringTok{"Mount point \textquotesingle{}}\VariableTok{$mount\_point}\StringTok{\textquotesingle{} is already mounted."} - \BuiltInTok{return}\NormalTok{ 0} - \KeywordTok{fi} - - \ExtensionTok{echo\_err} \StringTok{"Nothing is mounted on mount point \textquotesingle{}}\VariableTok{$mount\_point}\StringTok{\textquotesingle{}."} - - \ExtensionTok{ensure\_directory} \StringTok{"}\VariableTok{$mount\_point}\StringTok{"} - - \ExtensionTok{echo\_err} \StringTok{"Attempting to mount \textquotesingle{}}\VariableTok{$source\_device}\StringTok{\textquotesingle{} on \textquotesingle{}}\VariableTok{$mount\_point}\StringTok{\textquotesingle{} as \textquotesingle{}}\VariableTok{$mount\_fstype}\StringTok{\textquotesingle{} with options \textquotesingle{}}\VariableTok{$mount\_options}\StringTok{\textquotesingle{}."} - - \FunctionTok{mount}\NormalTok{ {-}t }\StringTok{"}\VariableTok{$mount\_fstype}\StringTok{"}\NormalTok{ {-}o }\StringTok{"}\VariableTok{$mount\_options}\StringTok{"} \StringTok{"}\VariableTok{$source\_device}\StringTok{"} \StringTok{"}\VariableTok{$mount\_point}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Failed to mount device \textquotesingle{}}\VariableTok{$source\_device}\StringTok{\textquotesingle{} on \textquotesingle{}}\VariableTok{$mount\_point}\StringTok{\textquotesingle{}"}\NormalTok{.} - - \ExtensionTok{echo\_err} \StringTok{"Mount successful."} -\KeywordTok{\}} - -\CommentTok{\# Mounts the remote shared data if it\textquotesingle{}s not already mounted} -\FunctionTok{ensure\_remote\_shared\_mounted()} \KeywordTok{\{} - \ExtensionTok{ensure\_remote\_address} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{remote\_nfs\_share=}\StringTok{"}\VariableTok{$remote\_address}\StringTok{:/nfsshared"} - \ExtensionTok{ensure\_mounted} \StringTok{"}\VariableTok{$remote\_nfs\_share}\StringTok{"} \StringTok{"}\VariableTok{$mounting\_point\_remote}\StringTok{"} \StringTok{"nfs"} \StringTok{"nolock"} -\KeywordTok{\}} - -\CommentTok{\# Ensures $total\_disk\_size is declared, initialized and valid.} -\FunctionTok{ensure\_total\_disk\_size()} \KeywordTok{\{} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{total\_disk\_size} - - \FunctionTok{get\_total\_disk\_size()} \KeywordTok{\{} - \ExtensionTok{parted}\NormalTok{ {-}{-}script }\StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"}\NormalTok{ unit B print }\KeywordTok{|} - \FunctionTok{sed}\NormalTok{ {-}En }\StringTok{\textquotesingle{}s\#\^{}Disk\textbackslash{}s*\textquotesingle{}"}\VariableTok{$deployment\_disk}\StringTok{"\textquotesingle{}:\textbackslash{}s*([0{-}9]+)B$\#\textbackslash{}1\#p\textquotesingle{}} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot retrieve total disk size"} - \KeywordTok{\}} - - \FunctionTok{validate\_total\_disk\_size()} \KeywordTok{\{} - \ExtensionTok{validate\_nonzero\_uint} \StringTok{"}\VariableTok{$1}\StringTok{"} \StringTok{"retrieved disk size format is invalid."} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"total\_disk\_size"} \StringTok{"get\_total\_disk\_size"} \StringTok{"validate\_total\_disk\_size"} -\KeywordTok{\}} - -\CommentTok{\# Ensures $sector\_sizes is declared, initialized and valid} -\FunctionTok{ensure\_sector\_sizes()} \KeywordTok{\{} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{sector\_sizes} - - \FunctionTok{get\_sector\_sizes()} \KeywordTok{\{} - \ExtensionTok{parted}\NormalTok{ {-}{-}script }\StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"}\NormalTok{ print }\KeywordTok{|} - \FunctionTok{sed}\NormalTok{ {-}En }\StringTok{\textquotesingle{}s\#\^{}Sector size \textbackslash{}(logical/physical\textbackslash{}):\textbackslash{}s*([0{-}9]+)B/([0{-}9]+)B$\#\textbackslash{}1\textbackslash{}t\textbackslash{}2\#p\textquotesingle{}} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot retrieve sector size"} - \KeywordTok{\}} - - \FunctionTok{validate\_sector\_sizes()} \KeywordTok{\{} - \ExtensionTok{validate\_with\_regex} \KeywordTok{\textbackslash{}} - \StringTok{"}\VariableTok{$1}\StringTok{"} \KeywordTok{\textbackslash{}} - \StringTok{\textquotesingle{}\^{}[0{-}9]+\textbackslash{}s+[0{-}9]+$\textquotesingle{}} \KeywordTok{\textbackslash{}} - \StringTok{\textquotesingle{}retrieved sector sizes are invalid\textquotesingle{}} \KeywordTok{\textbackslash{}} - \StringTok{\textquotesingle{}does not contain two unsigned integers separated by spaces\textquotesingle{}} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"sector\_sizes"} \StringTok{"get\_sector\_sizes"} \StringTok{"validate\_sector\_sizes"} -\KeywordTok{\}} - -\CommentTok{\# Ensures $logical\_sector\_size is declared, initialized and valid} -\FunctionTok{ensure\_logical\_sector\_size()} \KeywordTok{\{} - \CommentTok{\# shellcheck disable=SC2034 \# the variable is declared for parent scripts that source this one} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{logical\_sector\_size} - - \ExtensionTok{ensure\_sector\_sizes} - - \FunctionTok{extract\_logical\_sector\_size()} \KeywordTok{\{} - \BuiltInTok{echo} \StringTok{"}\VariableTok{$sector\_sizes}\StringTok{"} \KeywordTok{|} \FunctionTok{cut}\NormalTok{ {-}f 1 }\KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot extract logical sector size from sector sizes"} - \KeywordTok{\}} - - \FunctionTok{validate\_logical\_sector\_size()} \KeywordTok{\{} - \ExtensionTok{validate\_nonzero\_uint} \StringTok{"}\VariableTok{$1}\StringTok{"} \StringTok{"retrieved logical sector size is invalid"} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"logical\_sector\_size"} \StringTok{"extract\_logical\_sector\_size"} \StringTok{"validate\_logical\_sector\_size"} -\KeywordTok{\}} - -\CommentTok{\# Ensures $physical\_sector\_size is declared, initialized and valid} -\FunctionTok{ensure\_physical\_sector\_size()} \KeywordTok{\{} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{physical\_sector\_size} - - \ExtensionTok{ensure\_sector\_sizes} - - \FunctionTok{extract\_physical\_sector\_size()} \KeywordTok{\{} - \BuiltInTok{echo} \StringTok{"}\VariableTok{$sector\_sizes}\StringTok{"} \KeywordTok{|} \FunctionTok{cut}\NormalTok{ {-}f 2 }\KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot extract physical sector size from sector sizes"} - \KeywordTok{\}} - - \FunctionTok{validate\_physical\_sector\_size()} \KeywordTok{\{} - \ExtensionTok{validate\_nonzero\_uint} \StringTok{"}\VariableTok{$1}\StringTok{"} \StringTok{"retrieved physical sector size is invalid"} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"physical\_sector\_size"} \StringTok{"extract\_physical\_sector\_size"} \StringTok{"validate\_physical\_sector\_size"} -\KeywordTok{\}} - -\CommentTok{\# Ensures $image\_cache\_partition\_size is declared, initialized and valid} -\FunctionTok{ensure\_image\_cache\_partition\_size()} \KeywordTok{\{} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{image\_cache\_partition\_size} - - \ExtensionTok{ensure\_total\_disk\_size} - \ExtensionTok{ensure\_physical\_sector\_size} - - \FunctionTok{calculate\_image\_cache\_partition\_size()} \KeywordTok{\{} - \BuiltInTok{echo} \StringTok{"}\VariableTok{$((}\NormalTok{(20 * total\_disk\_size / 100) / physical\_sector\_size * physical\_sector\_size}\VariableTok{))}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot calculate image partition size"} - \KeywordTok{\}} - - \FunctionTok{validate\_image\_cache\_partition\_size()} \KeywordTok{\{} - \ExtensionTok{validate\_nonzero\_uint} \StringTok{"}\VariableTok{$1}\StringTok{"} \StringTok{"calculated image cache partition size is invalid"} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"image\_cache\_partition\_size"} \KeywordTok{\textbackslash{}} - \StringTok{"calculate\_image\_cache\_partition\_size"} \KeywordTok{\textbackslash{}} - \StringTok{"validate\_image\_cache\_partition\_size"} -\KeywordTok{\}} - -\CommentTok{\# Ensures $image\_cache\_partition\_start is declared, initialized and valid} -\FunctionTok{ensure\_image\_cache\_partition\_start()} \KeywordTok{\{} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{image\_cache\_partition\_start} - - \ExtensionTok{ensure\_total\_disk\_size} - \ExtensionTok{ensure\_physical\_sector\_size} - \ExtensionTok{ensure\_image\_cache\_partition\_size} - - \FunctionTok{calculate\_image\_cache\_partition\_start()} \KeywordTok{\{} - \BuiltInTok{echo} \StringTok{"}\VariableTok{$((}\NormalTok{(total\_disk\_size {-} image\_cache\_partition\_size) / physical\_sector\_size * physical\_sector\_size {-} 4096}\VariableTok{))}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot calculate image cache partition start"} - \KeywordTok{\}} - - \FunctionTok{validate\_image\_cache\_partition\_start()} \KeywordTok{\{} - \ExtensionTok{validate\_nonzero\_uint} \StringTok{"}\VariableTok{$1}\StringTok{"} \StringTok{"calculated image cache partition start is invalid"} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"image\_cache\_partition\_start"} \KeywordTok{\textbackslash{}} - \StringTok{"calculate\_image\_cache\_partition\_start"} \KeywordTok{\textbackslash{}} - \StringTok{"validate\_image\_cache\_partition\_start"} -\KeywordTok{\}} - -\CommentTok{\# Ensures $image\_cache\_partition\_end is declared, initialized and valid} -\FunctionTok{ensure\_image\_cache\_partition\_end()} \KeywordTok{\{} - \CommentTok{\# shellcheck disable=SC2034 \# the variable is declared for parent scripts that source this one} - \BuiltInTok{declare}\NormalTok{ {-}g }\VariableTok{image\_cache\_partition\_end} - - \ExtensionTok{ensure\_image\_cache\_partition\_size} - \ExtensionTok{ensure\_image\_cache\_partition\_start} - - \FunctionTok{calculate\_image\_cache\_partition\_end()} \KeywordTok{\{} - \BuiltInTok{echo} \StringTok{"}\VariableTok{$((}\NormalTok{image\_cache\_partition\_start + image\_cache\_partition\_size}\VariableTok{))}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"cannot calculate image cache partition end"} - \KeywordTok{\}} - - \FunctionTok{validate\_image\_cache\_partition\_end()} \KeywordTok{\{} - \ExtensionTok{validate\_nonzero\_uint} \StringTok{"}\VariableTok{$1}\StringTok{"} \StringTok{"calculated image cache partition start is invalid"} - \KeywordTok{\}} - - \ExtensionTok{ensure\_variable} \StringTok{"image\_cache\_partition\_end"} \KeywordTok{\textbackslash{}} - \StringTok{"calculate\_image\_cache\_partition\_end"} \KeywordTok{\textbackslash{}} - \StringTok{"validate\_image\_cache\_partition\_end"} -\KeywordTok{\}} - -\FunctionTok{parse\_last\_partition\_end()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{gawk\_input\_data=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{input\_size\_unit=}\StringTok{"}\VariableTok{$2}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{start\_parse\_token=}\StringTok{"}\VariableTok{$3}\StringTok{"} - - \BuiltInTok{local} \VariableTok{gawk\_program} - \BuiltInTok{read}\NormalTok{ {-}r {-}d }\StringTok{\textquotesingle{}\textquotesingle{}} \VariableTok{gawk\_program} \OperatorTok{\textless{}\textless{} \textquotesingle{}EOF\textquotesingle{}} -\NormalTok{ $0 \textasciitilde{} start\_parse\_regex\_pattern \{} -\NormalTok{ parsing=1;} -\NormalTok{ max\_part\_end=0;} -\NormalTok{ next;} -\NormalTok{ \}} -\NormalTok{ parsing \&\& $3 \textasciitilde{} disk\_end\_regex\_pattern \{} -\NormalTok{ part\_end=substr($3, 1, length($3){-}length(size\_unit)) + 0;} -\NormalTok{ if(part\_end\textgreater{}max\_part\_end) \{} -\NormalTok{ max\_part\_end=part\_end;} -\NormalTok{ \}} -\NormalTok{ \}} -\NormalTok{ END \{} -\NormalTok{ printf "\%d", max\_part\_end;} -\NormalTok{ \}} -\OperatorTok{EOF} - - \BuiltInTok{echo} \StringTok{"}\VariableTok{$gawk\_input\_data}\StringTok{"} \KeywordTok{|} \FunctionTok{gawk} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}v}\NormalTok{ start\_parse\_regex\_pattern=}\StringTok{"\^{}}\VariableTok{$start\_parse\_token}\StringTok{"} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}v}\NormalTok{ disk\_end\_regex\_pattern=}\StringTok{"\^{}[0{-}9]+}\VariableTok{$input\_size\_unit}\StringTok{$"} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}v}\NormalTok{ size\_unit=}\StringTok{"}\VariableTok{$input\_size\_unit}\StringTok{"} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}M} \StringTok{"}\VariableTok{$gawk\_program}\StringTok{"} \KeywordTok{\textbackslash{}} - \KeywordTok{||} \ExtensionTok{fatal\_error} \StringTok{"cannot extract image size"} -\KeywordTok{\}} - -\CommentTok{\# Print the end offset of the last partition of a parted output} -\FunctionTok{parse\_parted\_last\_partition\_end()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{parted\_output=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{parted\_unit=}\StringTok{"}\VariableTok{$2}\StringTok{"} - - \ExtensionTok{parse\_last\_partition\_end} \StringTok{"}\VariableTok{$parted\_output}\StringTok{"} \StringTok{"}\VariableTok{$parted\_unit}\StringTok{"} \StringTok{\textquotesingle{}Number\textquotesingle{}} -\KeywordTok{\}} - -\FunctionTok{parse\_parted\_last\_partition\_end\_sector()} \KeywordTok{\{} - \ExtensionTok{parse\_parted\_last\_partition\_end} \StringTok{"}\VariableTok{$1}\StringTok{"} \StringTok{"s"} -\KeywordTok{\}} - -\FunctionTok{parse\_fdisk\_last\_partition\_end\_sector()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{fdisk\_output=}\StringTok{"}\VariableTok{$1}\StringTok{"} - - \ExtensionTok{parse\_last\_partition\_end} \StringTok{"}\VariableTok{$fdisk\_output}\StringTok{"} \StringTok{\textquotesingle{}\textquotesingle{}} \StringTok{\textquotesingle{}Device\textquotesingle{}} -\KeywordTok{\}} - -\FunctionTok{create\_hidden\_partition()} \KeywordTok{\{} - \BuiltInTok{echo} \StringTok{"Erasing MBR..."} - \FunctionTok{dd}\NormalTok{ if=/dev/zero bs=512 count=1 of=}\StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"} - \BuiltInTok{echo} \StringTok{"MBR erased."} - - \BuiltInTok{echo} \StringTok{"Creating new partition table with hidden partition..."} - \ExtensionTok{ensure\_image\_cache\_partition\_start} - \ExtensionTok{ensure\_image\_cache\_partition\_end} - \ExtensionTok{parted}\NormalTok{ {-}s {-}a opt }\StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"}\NormalTok{ mklabel msdos mkpart primary ext2 }\StringTok{"}\VariableTok{$\{image\_cache\_partition\_start\}}\StringTok{B"} \StringTok{"}\VariableTok{$\{image\_cache\_partition\_end\}}\StringTok{B"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"parted exited with error code }\VariableTok{$?}\StringTok{"} - \BuiltInTok{echo} \StringTok{"New partition table with hidden partition created."} - - \ExtensionTok{refresh\_partition\_table} - - \BuiltInTok{echo} \StringTok{"Creating file system in hidden partition..."} - \ExtensionTok{mke2fs}\NormalTok{ {-}t ext2 }\StringTok{"}\VariableTok{$\{deployment\_disk\}}\StringTok{1"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"mke2fs exited with error code }\VariableTok{$?}\StringTok{"} - \BuiltInTok{echo} \StringTok{"File system in hidden partition created."} - - \ExtensionTok{refresh\_partition\_table} -\KeywordTok{\}} -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployerbootiful-deploy-script-de-duxe9ploiement-dimages}{% -\section{\texorpdfstring{\texttt{deployer/bootiful-deploy}: script de -déploiement -d'images}{deployer/bootiful-deploy: script de déploiement d'images}}\label{deployerbootiful-deploy-script-de-duxe9ploiement-dimages}} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\#!/bin/bash} - -\BuiltInTok{shopt}\NormalTok{ {-}s nullglob} - -\BuiltInTok{readonly} \VariableTok{SCRIPT\_NAME=}\StringTok{"}\VariableTok{$(}\FunctionTok{basename} \StringTok{"}\VariableTok{$0}\StringTok{"}\VariableTok{)}\StringTok{"} -\BuiltInTok{readonly} \VariableTok{SCRIPT\_DIR=}\StringTok{"}\VariableTok{$(}\FunctionTok{readlink}\NormalTok{ {-}m }\StringTok{"}\VariableTok{$(}\FunctionTok{dirname} \StringTok{"}\VariableTok{$0}\StringTok{"}\VariableTok{)}\StringTok{"}\VariableTok{)}\StringTok{"} - -\FunctionTok{usage()} \KeywordTok{\{} - \FunctionTok{cat} \OperatorTok{\textless{}\textless{} EOF} -\NormalTok{Usage:} - \VariableTok{$SCRIPT\_DIR}\NormalTok{ [{-}h | {-}{-}help]} - -\NormalTok{Description:} -\NormalTok{ Deploys an operating system image on the disk.} - -\NormalTok{ The image is retrieved from the NFS server that already provides the root file} -\NormalTok{ system. The NFS shared directory /nfsshared is mounted on /bootiful/shared and} -\NormalTok{ contains multiple images that can be deployed.} - -\NormalTok{ The available images from the server are scanned from /bootiful/shared/images} -\NormalTok{ and displayed in an interactive menu that allows to choose which particular} -\NormalTok{ image will be deployed.} - -\NormalTok{ All the data written in the standard input and standard error during the} -\NormalTok{ deployment is also written in a log file in /bootiful/shared/logs.} - -\NormalTok{ If there is enough disk space available, the image is cached in a hidden} -\NormalTok{ partition to avoid downloading it again over the network during a future} -\NormalTok{ deployment. This hidden partition takes 20\% of the disk.} - -\NormalTok{ If the image to deploy overlaps the image cache partition (i.e. the image} -\NormalTok{ takes more than 80\% of the disk size), a warning message is shown and an} -\NormalTok{ interactive menu allows to choose whether to abort or continue the deployment} -\NormalTok{ without using the cache.} - -\NormalTok{Options:} -\NormalTok{ {-}h, {-}{-}help Shows this help} - -\NormalTok{Exit status:} -\NormalTok{ 0 if an image has been deployed successfully} -\NormalTok{ 1 if some error has occured during deployment} - -\NormalTok{Example:} - \VariableTok{$SCRIPT\_NAME} -\OperatorTok{EOF} -\KeywordTok{\}} - -\KeywordTok{if [[} \StringTok{"}\VariableTok{$1}\StringTok{"} \OtherTok{==} \StringTok{"{-}h"}\NormalTok{ || }\StringTok{"}\VariableTok{$1}\StringTok{"} \OtherTok{==} \StringTok{"{-}{-}help"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{usage} - \BuiltInTok{exit}\NormalTok{ 0} -\KeywordTok{fi} - -\CommentTok{\# Loads declarations from the \textquotesingle{}bootiful{-}common\textquotesingle{} script, which is a "library"} -\CommentTok{\# of functions and constants shared by multiple bootiful{-}* scripts.} -\BuiltInTok{readonly} \VariableTok{bootiful\_common\_script\_file=}\StringTok{"}\VariableTok{$SCRIPT\_DIR}\StringTok{/bootiful{-}common"} -\KeywordTok{if [[} \OtherTok{!} \OtherTok{{-}f} \StringTok{"}\VariableTok{$bootiful\_common\_script\_file}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \OperatorTok{\textgreater{}\&2} \StringTok{"Fatal error: cannot find required script file \textquotesingle{}}\VariableTok{$bootiful\_common\_script\_file}\StringTok{\textquotesingle{}."} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} -\CommentTok{\# shellcheck source=./bootiful{-}common} -\BuiltInTok{.} \StringTok{"}\VariableTok{$SCRIPT\_DIR}\StringTok{/bootiful{-}common"} - -\ExtensionTok{start\_step\_batch} \StringTok{"remote shared data mount initialization"} -\VariableTok{start\_timestamp=}\StringTok{"}\VariableTok{$\{step\_timestamps[0]\}}\StringTok{"} - -\ExtensionTok{ensure\_remote\_shared\_mounted} - -\ExtensionTok{start\_step\_batch} \StringTok{"log file initialization"} -\BuiltInTok{readonly} \VariableTok{log\_dir=}\StringTok{"}\VariableTok{$mounting\_point\_remote}\StringTok{/log"} - -\ExtensionTok{ensure\_mac\_address} -\ExtensionTok{ensure\_directory} \StringTok{"}\VariableTok{$log\_dir}\StringTok{"} -\BuiltInTok{readonly} \VariableTok{logfile\_date=$(}\FunctionTok{date}\NormalTok{ {-}{-}date }\StringTok{"}\VariableTok{$start\_timestamp}\StringTok{"}\NormalTok{ {-}{-}universal +\%Y{-}\%m{-}\%d\_\%H{-}\%M{-}\%S}\VariableTok{)} -\BuiltInTok{readonly} \VariableTok{log\_file\_prefix=}\StringTok{"}\VariableTok{$log\_dir}\StringTok{/}\VariableTok{$\{mac\_address\}}\StringTok{\_}\VariableTok{$logfile\_date}\StringTok{"} - -\BuiltInTok{readonly} \VariableTok{log\_file=}\StringTok{"}\VariableTok{$log\_file\_prefix}\StringTok{.log"} -\BuiltInTok{echo} \StringTok{"Starting logging stdout and stderr to }\VariableTok{$log\_file}\StringTok{..."} - -\KeywordTok{\{} - \ExtensionTok{start\_step\_batch} \StringTok{"hardware log files creation"} - - \FunctionTok{log\_command\_to\_file()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{prefix=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{extension=}\StringTok{"}\VariableTok{$2}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{command=}\StringTok{"}\VariableTok{$3}\StringTok{"} - - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{hardware\_log\_file=}\StringTok{"}\VariableTok{$prefix}\StringTok{.}\VariableTok{$extension}\StringTok{"} - - \BuiltInTok{echo} \StringTok{"Writing }\VariableTok{$extension}\StringTok{ log file }\VariableTok{$hardware\_log\_file}\StringTok{..."} - - \CommentTok{\# shellcheck disable=SC2086 \# we need to expand args} - \FunctionTok{bash}\NormalTok{ {-}c }\StringTok{"}\VariableTok{$command}\StringTok{"} \OperatorTok{\textgreater{}} \StringTok{"}\VariableTok{$hardware\_log\_file}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot write }\VariableTok{$extension}\StringTok{ log file }\VariableTok{$hardware\_log\_file}\StringTok{."} - - \BuiltInTok{echo} \StringTok{"Wrote }\VariableTok{$extension}\StringTok{ log file }\VariableTok{$hardware\_log\_file}\StringTok{."} - \KeywordTok{\}} - - \ExtensionTok{log\_command\_to\_file} \StringTok{"}\VariableTok{$log\_file\_prefix}\StringTok{"}\NormalTok{ cpuinfo }\StringTok{\textquotesingle{}cat /proc/cpuinfo\textquotesingle{}} - \ExtensionTok{log\_command\_to\_file} \StringTok{"}\VariableTok{$log\_file\_prefix}\StringTok{"}\NormalTok{ meminfo }\StringTok{\textquotesingle{}cat /proc/meminfo\textquotesingle{}} - \ExtensionTok{log\_command\_to\_file} \StringTok{"}\VariableTok{$log\_file\_prefix}\StringTok{"}\NormalTok{ parted }\StringTok{\textquotesingle{}parted {-}{-}script {-}{-}list\textquotesingle{}} - - \ExtensionTok{start\_step\_batch} \StringTok{"remote images search"} - - \VariableTok{remote\_images\_dir=}\StringTok{"}\VariableTok{$mounting\_point\_remote}\StringTok{/images"} - - \BuiltInTok{echo} \StringTok{"Finding remote images..."} - \BuiltInTok{declare} \VariableTok{count=}\NormalTok{0} - \BuiltInTok{declare}\NormalTok{ {-}A }\VariableTok{images} - \BuiltInTok{declare} \VariableTok{found\_image\_name} - \KeywordTok{for} \ExtensionTok{image\_folder}\NormalTok{ in }\StringTok{"}\VariableTok{$remote\_images\_dir}\StringTok{"}\NormalTok{/*}\KeywordTok{;} \KeywordTok{do} - \VariableTok{found\_image\_name=$(}\FunctionTok{basename} \StringTok{"}\VariableTok{$image\_folder}\StringTok{"}\VariableTok{)} - \BuiltInTok{echo} \StringTok{"Image \textquotesingle{}}\VariableTok{$found\_image\_name}\StringTok{\textquotesingle{} found"} - \VariableTok{options=(}\StringTok{"}\VariableTok{$\{options[]\}}\StringTok{"} \StringTok{"}\VariableTok{$((}\NormalTok{++count}\VariableTok{))}\StringTok{"} \StringTok{"}\VariableTok{$found\_image\_name}\StringTok{"}\VariableTok{)} - \VariableTok{images[$count]=}\StringTok{"}\VariableTok{$found\_image\_name}\StringTok{"} - \KeywordTok{done} - \BuiltInTok{echo} \StringTok{"}\VariableTok{$count}\StringTok{ remote images found."} - - \KeywordTok{if [[} \VariableTok{$count} \OtherTok{{-}eq}\NormalTok{ 0}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{fatal\_error} \StringTok{"No image found in remote images directory }\VariableTok{$remote\_images\_dir}\StringTok{"} - \KeywordTok{fi} - - \ExtensionTok{start\_step\_interactive} \StringTok{"image selection"} - - \BuiltInTok{declare} \VariableTok{tty} - \VariableTok{tty=$(}\ExtensionTok{tty}\VariableTok{)} - \BuiltInTok{readonly} \VariableTok{tty} - - \BuiltInTok{declare} \VariableTok{choice} - \VariableTok{choice=$(}\ExtensionTok{dialog} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}clear} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}title} \StringTok{"Image selection"} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}menu} \StringTok{"Select an image to deploy"} \KeywordTok{\textbackslash{}} - \ExtensionTok{0}\NormalTok{ 0 0 }\KeywordTok{\textbackslash{}} - \StringTok{"}\VariableTok{$\{options[]\}}\StringTok{"} \KeywordTok{\textbackslash{}} - \OperatorTok{2\textgreater{}\&1} \OperatorTok{\textgreater{}} \StringTok{"}\VariableTok{$tty}\StringTok{"}\VariableTok{)} - \BuiltInTok{readonly} \VariableTok{choice} - - \ExtensionTok{validate\_not\_empty} \StringTok{"}\VariableTok{$choice}\StringTok{"} \StringTok{"No image has been chosen"} - - \BuiltInTok{readonly} \VariableTok{image\_name=$\{images[$choice]\}} - - \BuiltInTok{echo} \StringTok{"Chosen image is }\VariableTok{$image\_name}\StringTok{"} - - \BuiltInTok{readonly} \VariableTok{remote\_image\_dir=}\StringTok{"}\VariableTok{$remote\_images\_dir}\StringTok{/}\VariableTok{$image\_name}\StringTok{"} - \BuiltInTok{readonly} \VariableTok{remote\_image\_gzip\_file=}\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{/}\VariableTok{$image\_name}\StringTok{.img.gz"} - \BuiltInTok{readonly} \VariableTok{remote\_image\_clonezilla\_id\_file=}\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{/Info{-}img{-}id.txt"} - - \BuiltInTok{readonly} \VariableTok{IMAGE\_TYPE\_RAW=}\StringTok{"raw"} - \BuiltInTok{readonly} \VariableTok{IMAGE\_TYPE\_CLONEZILLA=}\StringTok{"clonezilla"} - - \KeywordTok{if [[} \OtherTok{{-}f} \StringTok{"}\VariableTok{$remote\_image\_gzip\_file}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{readonly} \VariableTok{image\_type=}\StringTok{"}\VariableTok{$IMAGE\_TYPE\_RAW}\StringTok{"} - \BuiltInTok{readonly} \VariableTok{remote\_image\_md5\_file=}\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{/}\VariableTok{$image\_name}\StringTok{.md5"} - \BuiltInTok{readonly} \VariableTok{remote\_image\_size\_file=}\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{/}\VariableTok{$image\_name}\StringTok{.partition"} - \BuiltInTok{readonly} \VariableTok{parse\_end\_sector\_function=}\NormalTok{parse\_fdisk\_last\_partition\_end\_sector} - \KeywordTok{elif [[} \OtherTok{{-}f} \StringTok{"}\VariableTok{$remote\_image\_clonezilla\_id\_file}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{readonly} \VariableTok{image\_type=}\StringTok{"}\VariableTok{$IMAGE\_TYPE\_CLONEZILLA}\StringTok{"} - \BuiltInTok{readonly} \VariableTok{remote\_image\_size\_file=}\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{/sda{-}pt.parted"} - \BuiltInTok{readonly} \VariableTok{parse\_end\_sector\_function=}\NormalTok{parse\_parted\_last\_partition\_end\_sector} - \KeywordTok{else} - \ExtensionTok{fatal\_error} \StringTok{"Cannot find type of image \textquotesingle{}}\VariableTok{$image\_name}\StringTok{\textquotesingle{} in \textquotesingle{}}\VariableTok{$remote\_image\_dir}\StringTok{\textquotesingle{}"} - \KeywordTok{fi} - - \ExtensionTok{start\_step\_batch} \StringTok{"image size verification"} - - \ExtensionTok{validate\_file\_exists} \KeywordTok{\textbackslash{}} - \StringTok{"}\VariableTok{$remote\_image\_size\_file}\StringTok{"} \KeywordTok{\textbackslash{}} - \StringTok{"cannot retrieve size of image because parted/fdisk dump file does not exist."} - - \BuiltInTok{readonly} \VariableTok{remote\_image\_size\_file\_content=}\StringTok{"}\OperatorTok{$(\textless{}} \StringTok{"}\VariableTok{$remote\_image\_size\_file}\StringTok{"}\OperatorTok{)}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot read parted/fdisk dump file \textquotesingle{}}\VariableTok{$remote\_image\_size\_file}\StringTok{\textquotesingle{}"} - - \BuiltInTok{declare} \VariableTok{image\_end\_sector} - \VariableTok{image\_end\_sector=$(}\StringTok{"}\VariableTok{$parse\_end\_sector\_function}\StringTok{"} \StringTok{"}\VariableTok{$remote\_image\_size\_file\_content}\StringTok{"}\VariableTok{)} - \BuiltInTok{readonly} \VariableTok{image\_end\_sector} - \ExtensionTok{validate\_nonzero\_uint} \StringTok{"}\VariableTok{$image\_end\_sector}\StringTok{"} \StringTok{"Invalid image end sector"} - - \ExtensionTok{ensure\_logical\_sector\_size} - \KeywordTok{((}\NormalTok{image\_size = image\_end\_sector * logical\_sector\_size}\KeywordTok{))} - \ExtensionTok{validate\_nonzero\_uint} \StringTok{"}\VariableTok{$image\_size}\StringTok{"} \StringTok{"Retrieved image size is invalid"} - - \BuiltInTok{echo} \StringTok{"Image type: }\VariableTok{$image\_type}\StringTok{"} - \BuiltInTok{echo} \StringTok{"Image size: }\VariableTok{$image\_size}\StringTok{ B"} - - \ExtensionTok{ensure\_total\_disk\_size} - \BuiltInTok{echo} \StringTok{"Available space in disk without image cache partition: }\VariableTok{$total\_disk\_size}\StringTok{ B"} - \ExtensionTok{ensure\_image\_cache\_partition\_size} - \BuiltInTok{echo} \StringTok{"Available space before image cache partition partition: }\VariableTok{$image\_cache\_partition\_size}\StringTok{ B"} - - \KeywordTok{if [[} \StringTok{"}\VariableTok{$image\_size}\StringTok{"} \OtherTok{{-}gt} \StringTok{"}\VariableTok{$total\_disk\_size}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{fatal\_error} \StringTok{"Insufficient disk space for imaging. Image size: }\VariableTok{$image\_size}\StringTok{ B Disk size: }\VariableTok{$total\_disk\_size}\StringTok{ B"} - \KeywordTok{fi} - - \VariableTok{mounting\_point\_hidden=}\StringTok{"/mnt"} - \VariableTok{DEPLOY\_MODE\_ALREADY\_CACHED=}\StringTok{\textquotesingle{}cached\textquotesingle{}} - \VariableTok{DEPLOY\_MODE\_CACHED\_NOW=}\StringTok{\textquotesingle{}cached\_now\textquotesingle{}} - \VariableTok{DEPLOY\_MODE\_NOT\_CACHED=}\StringTok{\textquotesingle{}not\_cached\textquotesingle{}} - - \ExtensionTok{ensure\_image\_cache\_partition\_start} - \KeywordTok{if [[} \StringTok{"}\VariableTok{$image\_size}\StringTok{"} \OtherTok{{-}gt} \StringTok{"}\VariableTok{$image\_cache\_partition\_start}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{start\_step\_interactive} \StringTok{"hidden partition destruction confirmation"} - - \ExtensionTok{warning} \StringTok{"Image overlaps with local image cache."} \KeywordTok{\textbackslash{}} - \StringTok{"It can be deployed from network but the image cache will be destroyed."} \KeywordTok{\textbackslash{}} - \StringTok{"Continue?"} - - \BuiltInTok{echo} \StringTok{"Sufficient disk space for imaging, but image cache partition will be destroyed if it exists."} - \VariableTok{deploy\_mode=}\StringTok{"}\VariableTok{$DEPLOY\_MODE\_NOT\_CACHED}\StringTok{"} - \KeywordTok{else} - \BuiltInTok{echo} \StringTok{"Sufficient disk space for imaging with cache. Image cache partition will be restored or created."} - - \BuiltInTok{readonly} \VariableTok{hidden\_partition\_dev=}\StringTok{"/dev/loop0"} - - \BuiltInTok{readonly} \VariableTok{HIDDEN\_PARTITION\_STATUS\_UNKNOWN=}\StringTok{\textquotesingle{}unknown\textquotesingle{}} - \BuiltInTok{readonly} \VariableTok{HIDDEN\_PARTITION\_STATUS\_CREATED=}\StringTok{\textquotesingle{}created\textquotesingle{}} - \BuiltInTok{readonly} \VariableTok{HIDDEN\_PARTITION\_STATUS\_RESTORED=}\StringTok{\textquotesingle{}restored\textquotesingle{}} - \BuiltInTok{declare} \VariableTok{hidden\_partition\_status=}\StringTok{"}\VariableTok{$HIDDEN\_PARTITION\_STATUS\_UNKNOWN}\StringTok{"} - - \CommentTok{\# Mounts the hidden partition.} - \CommentTok{\# If there is a mount error and the partition was restored, the partition will be} - \CommentTok{\# recreated and there will be another tentative to mount it.} - \FunctionTok{mount\_hidden\_partition()} \KeywordTok{\{} - \ExtensionTok{start\_step\_batch} \StringTok{"image cache partition mount tentative"} - - \BuiltInTok{echo} \StringTok{"Creating loopback node for }\VariableTok{$deployment\_disk}\StringTok{ (offset=}\VariableTok{$image\_cache\_partition\_start}\StringTok{) on }\VariableTok{$hidden\_partition\_dev}\StringTok{"} - - \ExtensionTok{losetup}\NormalTok{ {-}o }\StringTok{"}\VariableTok{$image\_cache\_partition\_start}\StringTok{"} \StringTok{"}\VariableTok{$hidden\_partition\_dev}\StringTok{"} \StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Failed to create loopback node for }\VariableTok{$deployment\_disk}\StringTok{ on }\VariableTok{$hidden\_partition\_dev}\StringTok{"} - \BuiltInTok{echo} \StringTok{"Created loopback node for }\VariableTok{$deployment\_disk}\StringTok{ on }\VariableTok{$hidden\_partition\_dev}\StringTok{"} - - \BuiltInTok{echo} \StringTok{"Mounting hidden partition from }\VariableTok{$hidden\_partition\_dev}\StringTok{ on }\VariableTok{$mounting\_point\_hidden}\StringTok{..."} - \KeywordTok{if}\NormalTok{ ! }\FunctionTok{mount}\NormalTok{ {-}t ext2 }\StringTok{"}\VariableTok{$hidden\_partition\_dev}\StringTok{"} \StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{"}\KeywordTok{;} \KeywordTok{then} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{error\_message=}\StringTok{"Cannot mount }\VariableTok{$hidden\_partition\_status}\StringTok{ hidden partition from }\VariableTok{$hidden\_partition\_dev}\StringTok{ on }\VariableTok{$mounting\_point\_hidden}\StringTok{"} - - \KeywordTok{if [[} \StringTok{"}\VariableTok{$hidden\_partition\_status}\StringTok{"} \OtherTok{!=} \StringTok{"}\VariableTok{$HIDDEN\_PARTITION\_STATUS\_CREATED}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"}\VariableTok{$error\_message}\StringTok{"} - - \ExtensionTok{losetup}\NormalTok{ {-}d }\StringTok{"}\VariableTok{$hidden\_partition\_dev}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot detach loopback device }\VariableTok{$hidden\_partition\_dev}\StringTok{"} - - \ExtensionTok{start\_step\_batch} \StringTok{"image cache partition creation"} - \ExtensionTok{create\_hidden\_partition} - \ExtensionTok{mount\_hidden\_partition} - \VariableTok{hidden\_partition\_status=}\StringTok{"}\VariableTok{$HIDDEN\_PARTITION\_STATUS\_CREATED}\StringTok{"} - \KeywordTok{else} - \ExtensionTok{fatal\_error} \StringTok{"}\VariableTok{$error\_message}\StringTok{"} - \KeywordTok{fi} - \KeywordTok{fi} - - \KeywordTok{if [[} \StringTok{"}\VariableTok{$hidden\_partition\_status}\StringTok{"} \OtherTok{!=} \StringTok{"}\VariableTok{$HIDDEN\_PARTITION\_STATUS\_CREATED}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \VariableTok{hidden\_partition\_status=}\StringTok{"}\VariableTok{$HIDDEN\_PARTITION\_STATUS\_RESTORED}\StringTok{"} - \KeywordTok{fi} - - \BuiltInTok{echo} \StringTok{"Hidden partition mounted on }\VariableTok{$mounting\_point\_hidden}\StringTok{"} - \KeywordTok{\}} - - \ExtensionTok{mount\_hidden\_partition} - - \FunctionTok{read\_raw\_image\_id\_file()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{image\_id\_file=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \FunctionTok{head}\NormalTok{ {-}n 1 }\StringTok{"}\VariableTok{$image\_id\_file}\StringTok{"} \KeywordTok{|} \FunctionTok{cut}\NormalTok{ {-}d }\StringTok{" "}\NormalTok{ {-}f 1} - \KeywordTok{\}} - - \FunctionTok{read\_clonezilla\_image\_id\_file()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{image\_id\_file=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \FunctionTok{awk}\NormalTok{ {-}F }\StringTok{\textquotesingle{}=\textquotesingle{}} \StringTok{\textquotesingle{}/IMG\_ID/ \{print $2\}\textquotesingle{}} \StringTok{"}\VariableTok{$image\_id\_file}\StringTok{"} - \KeywordTok{\}} - - \CommentTok{\# Check if the selected image exists in cache by comparing its id file to the one stored in cache.} - \CommentTok{\# Return value: 0 if the image is cached, 1 if it\textquotesingle{}s not} - \FunctionTok{is\_image\_cached()} \KeywordTok{\{} - \KeywordTok{if [[}\NormalTok{ hidden\_partition\_status }\OtherTok{==} \StringTok{"}\VariableTok{$HIDDEN\_PARTITION\_STATUS\_CREATED}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{return}\NormalTok{ 1} - \KeywordTok{fi} - - \KeywordTok{if [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_RAW}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{remote\_image\_id\_file=}\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{/}\VariableTok{$image\_name}\StringTok{.md5"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{cached\_image\_id\_file=}\StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{/}\VariableTok{$image\_name}\StringTok{.md5"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{read\_image\_id\_file=}\NormalTok{read\_raw\_image\_id\_file} - \KeywordTok{elif [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_CLONEZILLA}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{remote\_image\_id\_file=}\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{/Info{-}img{-}id.txt"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{cached\_image\_id\_file=}\StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{/}\VariableTok{$image\_name}\StringTok{/Info{-}img{-}id.txt"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{read\_image\_id\_file=}\NormalTok{read\_clonezilla\_image\_id\_file} - \KeywordTok{else} - \ExtensionTok{fatal\_error} \StringTok{"Unhandled image type: }\VariableTok{$image\_type}\StringTok{"} - \KeywordTok{fi} - - \KeywordTok{if [[} \OtherTok{{-}f} \StringTok{"}\VariableTok{$cached\_image\_id\_file}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{cached\_image\_id=$($read\_image\_id\_file} \StringTok{"}\VariableTok{$cached\_image\_id\_file}\StringTok{"}\VariableTok{)} - \KeywordTok{if [[} \OtherTok{{-}z} \StringTok{"}\VariableTok{$cached\_image\_id}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{return}\NormalTok{ 1} - \KeywordTok{fi} - - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{remote\_image\_id=$($read\_image\_id\_file} \StringTok{"}\VariableTok{$remote\_image\_id\_file}\StringTok{"}\VariableTok{)} - \KeywordTok{if [[} \StringTok{"}\VariableTok{$cached\_image\_id}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$remote\_image\_id}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{return}\NormalTok{ 0} - \KeywordTok{fi} - \KeywordTok{fi} - \BuiltInTok{return}\NormalTok{ 1} - \KeywordTok{\}} - - \ExtensionTok{start\_step\_batch} \StringTok{"cached image search"} - \BuiltInTok{echo} \StringTok{"Checking if image is cached..."} - \KeywordTok{if} \ExtensionTok{is\_image\_cached}\KeywordTok{;} \KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Image found in cache."} - \VariableTok{deploy\_mode=}\StringTok{"}\VariableTok{$DEPLOY\_MODE\_ALREADY\_CACHED}\StringTok{"} - \KeywordTok{else} - \BuiltInTok{echo} \StringTok{"Image not found in cache."} - - \ExtensionTok{start\_step\_batch} \StringTok{"image cache space availability check"} - - \VariableTok{cache\_available\_size\_bytes=$(}\FunctionTok{df}\NormalTok{ {-}{-}block{-}size=1 {-}{-}output=avail }\StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{"} \KeywordTok{|} \FunctionTok{tail}\NormalTok{ {-}n 1}\VariableTok{)} - - \KeywordTok{if [[} \OtherTok{{-}z} \StringTok{"}\VariableTok{$cache\_available\_size\_bytes}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{fatal\_error} \StringTok{"Cannot retrieve available size in cache."} - \KeywordTok{fi} - - \KeywordTok{((}\NormalTok{cache\_available\_size\_bytes = cache\_available\_size\_bytes {-} 4096}\KeywordTok{))} - - \BuiltInTok{echo} \StringTok{"Available size in cache: }\VariableTok{$cache\_available\_size\_bytes}\StringTok{ B"} - - \KeywordTok{if [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_RAW}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \VariableTok{image\_size\_bytes=$(}\FunctionTok{stat}\NormalTok{ {-}c \%s }\StringTok{"}\VariableTok{$remote\_image\_gzip\_file}\StringTok{"}\VariableTok{)} - \KeywordTok{elif [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_CLONEZILLA}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \VariableTok{image\_size\_bytes=$(}\FunctionTok{du}\NormalTok{ {-}b {-}c }\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{"} \KeywordTok{|} \FunctionTok{tail}\NormalTok{ {-}n1 }\KeywordTok{|} \FunctionTok{cut}\NormalTok{ {-}f1}\VariableTok{)} - \KeywordTok{else} - \ExtensionTok{fatal\_error} \StringTok{"Unhandled image type: }\VariableTok{$image\_type}\StringTok{"} - \KeywordTok{fi} - - \BuiltInTok{echo} \StringTok{"Size of image to download: }\VariableTok{$image\_size\_bytes}\StringTok{ B"} - - \CommentTok{\# Check enough space available in hidden partition for caching} - \KeywordTok{if [[} \StringTok{"}\VariableTok{$image\_size\_bytes}\StringTok{"} \OtherTok{{-}lt} \StringTok{"}\VariableTok{$cache\_available\_size\_bytes}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Enough space for caching. Image will be cached and deployed simultaneously."} - \VariableTok{deploy\_mode=}\StringTok{"}\VariableTok{$DEPLOY\_MODE\_CACHED\_NOW}\StringTok{"} - \KeywordTok{else} - \BuiltInTok{echo} \StringTok{"Not enough space for caching. Image will be deployed without caching."} - \VariableTok{deploy\_mode=}\StringTok{"}\VariableTok{$DEPLOY\_MODE\_NOT\_CACHED}\StringTok{"} - \KeywordTok{fi} - \KeywordTok{fi} - \KeywordTok{fi} - - \FunctionTok{deploy\_image\_with\_clonezilla()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{clonezilla\_images\_dir=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{echo} \StringTok{"Starting deployment of image }\VariableTok{$image\_name}\StringTok{ from }\VariableTok{$clonezilla\_images\_dir}\StringTok{ with clonezilla..."} - \CommentTok{\# yes \textquotesingle{}\textquotesingle{} 2\textgreater{}/dev/null |} - \ExtensionTok{ocs{-}sr} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}ignore{-}update{-}efi{-}nvram} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}ocsroot} \StringTok{"}\VariableTok{$clonezilla\_images\_dir}\StringTok{"} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}skip{-}check{-}restorable{-}r} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}nogui} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}batch} \KeywordTok{\textbackslash{}} - \ExtensionTok{restoredisk} \StringTok{"}\VariableTok{$image\_name}\StringTok{"}\NormalTok{ sda} - - \BuiltInTok{echo} \StringTok{"Checking for error during clonezilla deployment..."} - - \KeywordTok{if} \FunctionTok{grep} \StringTok{"Failed to restore partition image file"}\NormalTok{ /var/log/clonezilla.log}\KeywordTok{;} \KeywordTok{then} - \ExtensionTok{fatal\_error} \StringTok{"Error while deploying image with clonezilla."} - \KeywordTok{fi} - - \BuiltInTok{echo} \StringTok{"Image deployed with clonezilla."} - \KeywordTok{\}} - - \FunctionTok{print\_progress()} \KeywordTok{\{} - \ExtensionTok{pv}\NormalTok{ {-}ptebar {-}{-}size }\StringTok{"}\VariableTok{$image\_size}\StringTok{"} \OperatorTok{2\textgreater{}}\StringTok{"}\VariableTok{$tty}\StringTok{"} - \KeywordTok{\}} - - \ExtensionTok{start\_step\_batch} \StringTok{"image deployment"} - \KeywordTok{if [[} \StringTok{"}\VariableTok{$deploy\_mode}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$DEPLOY\_MODE\_CACHED\_NOW}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Saving image to cache and deploying it..."} - \KeywordTok{if [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_RAW}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \FunctionTok{cp} \StringTok{"}\VariableTok{$remote\_image\_md5\_file}\StringTok{"} \StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{/"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot copy hash of image to }\VariableTok{$mounting\_point\_hidden}\StringTok{"} - - \FunctionTok{tee} \StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{/}\VariableTok{$image\_name}\StringTok{.img.gz"} \OperatorTok{\textless{}} \StringTok{"}\VariableTok{$remote\_image\_gzip\_file}\StringTok{"} \KeywordTok{|} - \FunctionTok{gunzip}\NormalTok{ {-}c }\KeywordTok{|} - \ExtensionTok{print\_progress} \KeywordTok{|} - \FunctionTok{dd}\NormalTok{ bs=128k of=}\StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot copy image to cache and disk."} - \KeywordTok{elif [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_CLONEZILLA}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Starting copy of clonezilla image to cache..."} - \FunctionTok{rm}\NormalTok{ {-}rf }\StringTok{"}\VariableTok{$\{mounting\_point\_hidden:?\}}\StringTok{/}\VariableTok{$image\_name}\StringTok{"} - \FunctionTok{cp}\NormalTok{ {-}r }\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{"} \StringTok{"}\VariableTok{$\{mounting\_point\_hidden:?\}}\StringTok{/"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Error while copying remote image to cache."} - \BuiltInTok{echo} \StringTok{"Clonezilla image copied to cache."} - \BuiltInTok{echo} \StringTok{"Content of cache:"} - \FunctionTok{ls}\NormalTok{ {-}als }\StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{"} - - \ExtensionTok{deploy\_image\_with\_clonezilla} \StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{"} - \KeywordTok{else} - \ExtensionTok{fatal\_error} \StringTok{"Unhandled image type: }\VariableTok{$image\_type}\StringTok{"} - \KeywordTok{fi} - - \BuiltInTok{echo} \StringTok{"Image deployed and cached."} - \KeywordTok{elif [[} \StringTok{"}\VariableTok{$deploy\_mode}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$DEPLOY\_MODE\_ALREADY\_CACHED}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Deploying image from cache..."} - - \KeywordTok{if [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_RAW}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \FunctionTok{gunzip}\NormalTok{ {-}c }\StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{/}\VariableTok{$image\_name}\StringTok{.img.gz"} \KeywordTok{|} - \ExtensionTok{print\_progress} \KeywordTok{|} - \FunctionTok{dd}\NormalTok{ bs=1M of=}\StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot copy image from cache to disk."} - \KeywordTok{elif [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_CLONEZILLA}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{deploy\_image\_with\_clonezilla} \StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{"} - \KeywordTok{else} - \ExtensionTok{fatal\_error} \StringTok{"Unhandled image type: }\VariableTok{$image\_type}\StringTok{"} - \KeywordTok{fi} - - \BuiltInTok{echo} \StringTok{"Image deployed from cache."} - \KeywordTok{elif [[} \StringTok{"}\VariableTok{$deploy\_mode}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$DEPLOY\_MODE\_NOT\_CACHED}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Deploying image without caching..."} - - \KeywordTok{if [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_RAW}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \FunctionTok{gunzip}\NormalTok{ {-}c }\StringTok{"}\VariableTok{$remote\_image\_gzip\_file}\StringTok{"} \KeywordTok{|} - \ExtensionTok{print\_progress} \KeywordTok{|} - \FunctionTok{dd}\NormalTok{ of=}\StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"}\NormalTok{ bs=128k }\KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot copy image without caching."} - \KeywordTok{elif [[} \StringTok{"}\VariableTok{$image\_type}\StringTok{"} \OtherTok{==} \StringTok{"}\VariableTok{$IMAGE\_TYPE\_CLONEZILLA}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{deploy\_image\_with\_clonezilla} \StringTok{"}\VariableTok{$remote\_images\_dir}\StringTok{"} - \KeywordTok{else} - \ExtensionTok{fatal\_error} \StringTok{"Unhandled image type: }\VariableTok{$image\_type}\StringTok{"} - \KeywordTok{fi} - - \BuiltInTok{echo} \StringTok{"Image deployed without caching."} - \KeywordTok{else} - \ExtensionTok{fatal\_error} \StringTok{"Unhandled deploy mode: }\VariableTok{$deploy\_mode}\StringTok{"} - \KeywordTok{fi} - - \BuiltInTok{echo} \StringTok{"Deployment of image }\VariableTok{$image\_name}\StringTok{ (}\VariableTok{$image\_size}\StringTok{ B) done."} - - \KeywordTok{if} \ExtensionTok{findmnt}\NormalTok{ {-}{-}mountpoint }\StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{"}\KeywordTok{;} \KeywordTok{then} - \ExtensionTok{start\_step\_batch} \StringTok{"image cache partition unmount"} - \BuiltInTok{echo} \StringTok{"Unmounting hidden partition from }\VariableTok{$mounting\_point\_hidden}\StringTok{"} - \FunctionTok{umount} \StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot unmount hidden partition from }\VariableTok{$mounting\_point\_hidden}\StringTok{"} - \BuiltInTok{echo} \StringTok{"Unmounted hidden partition from }\VariableTok{$mounting\_point\_hidden}\StringTok{"} - - \ExtensionTok{start\_step\_batch} \StringTok{"image cache partition check"} - \ExtensionTok{fsck}\NormalTok{ {-}y }\StringTok{"}\VariableTok{$hidden\_partition\_dev}\StringTok{"} - \KeywordTok{fi} - - \ExtensionTok{start\_step\_batch} \StringTok{"EFI entrypoint file creation"} - - \BuiltInTok{readonly} \VariableTok{remote\_image\_efi\_entrypoint\_file=}\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{/efi\_entrypoint"} - \BuiltInTok{readonly} \VariableTok{remote\_image\_efi\_nvram\_file=}\StringTok{"}\VariableTok{$remote\_image\_dir}\StringTok{/efi{-}nvram.dat"} - \BuiltInTok{readonly} \VariableTok{mounting\_point\_esp=}\StringTok{"/bootiful/esp"} - \BuiltInTok{readonly} \VariableTok{esp\_partition=}\StringTok{"}\VariableTok{$\{deployment\_disk\}}\StringTok{1"} - - \FunctionTok{mount\_esp()} \KeywordTok{\{} - \BuiltInTok{echo} \StringTok{"Mounting ESP partition..."} - \ExtensionTok{ensure\_directory} \StringTok{"}\VariableTok{$mounting\_point\_esp}\StringTok{"} - \ExtensionTok{refresh\_partition\_table} - \FunctionTok{mount} \StringTok{"}\VariableTok{$esp\_partition}\StringTok{"} \StringTok{"}\VariableTok{$mounting\_point\_esp}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot mount }\VariableTok{$esp\_partition}\StringTok{ on }\VariableTok{$mounting\_point\_esp}\StringTok{"} - \BuiltInTok{echo} \StringTok{"ESP partition mounted."} - \KeywordTok{\}} - - \FunctionTok{write\_efi\_entrypoint\_file()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{efi\_entrypoint\_file\_content=}\StringTok{"}\VariableTok{$1}\StringTok{"} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{target\_efi\_entrypoint\_file=}\StringTok{"}\VariableTok{$mounting\_point\_esp}\StringTok{/efi\_entrypoint"} - - \BuiltInTok{echo} \StringTok{"Writing efi entrypoint file \textquotesingle{}}\VariableTok{$target\_efi\_entrypoint\_file}\StringTok{\textquotesingle{}"} - - \BuiltInTok{echo} \StringTok{"}\VariableTok{$efi\_entrypoint\_file\_content}\StringTok{"} \OperatorTok{\textgreater{}} \StringTok{"}\VariableTok{$target\_efi\_entrypoint\_file}\StringTok{"} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot write EFI entrypoint file \textquotesingle{}}\VariableTok{$target\_efi\_entrypoint\_file}\StringTok{\textquotesingle{}."} - - \BuiltInTok{echo} \StringTok{"EFI entrypoint file \textquotesingle{}}\VariableTok{$target\_efi\_entrypoint\_file}\StringTok{\textquotesingle{} written."} - - \FunctionTok{umount} \StringTok{"}\VariableTok{$mounting\_point\_esp}\StringTok{"} - \KeywordTok{\}} - - \KeywordTok{if [[} \OtherTok{{-}e} \StringTok{"}\VariableTok{$remote\_image\_efi\_entrypoint\_file}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"EFI entrypoint file detected. Copying it to ESP root..."} - \ExtensionTok{mount\_esp} - \ExtensionTok{write\_efi\_entrypoint\_file} \StringTok{"}\VariableTok{$(}\FunctionTok{cat} \StringTok{"}\VariableTok{$remote\_image\_efi\_entrypoint\_file}\StringTok{"}\VariableTok{)}\StringTok{"} - \KeywordTok{elif [[} \OtherTok{{-}e} \StringTok{"}\VariableTok{$remote\_image\_efi\_nvram\_file}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Trying to find boot entry from efi nvram file }\VariableTok{$remote\_image\_efi\_nvram\_file}\StringTok{..."} - - \VariableTok{boot\_order\_entries=}\StringTok{"}\VariableTok{$(}\FunctionTok{sed}\NormalTok{ {-}nr }\StringTok{\textquotesingle{}s/\^{}BootOrder: ([0{-}9]+(,[0{-}9]+)*)$/\textbackslash{}1/p\textquotesingle{}} \StringTok{"}\VariableTok{$remote\_image\_efi\_nvram\_file}\StringTok{"} \KeywordTok{|} - \FunctionTok{head}\NormalTok{ {-}n 1 }\KeywordTok{|} - \FunctionTok{tr} \StringTok{\textquotesingle{},\textquotesingle{}} \StringTok{\textquotesingle{} \textquotesingle{}}\VariableTok{)}\StringTok{"} - - \KeywordTok{if [[} \OtherTok{{-}n} \StringTok{"}\VariableTok{$boot\_order\_entries}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Boot order entries found: }\VariableTok{$boot\_order\_entries}\StringTok{"} - \VariableTok{written\_boot\_order\_entry=}\StringTok{""} - \KeywordTok{for} \ExtensionTok{boot\_order\_entry}\NormalTok{ in }\VariableTok{$boot\_order\_entries}\KeywordTok{;} \KeywordTok{do} - \BuiltInTok{echo} \StringTok{"Trying to find boot file path for boot order entry }\VariableTok{$boot\_order\_entry}\StringTok{..."} - \VariableTok{boot\_file\_path=}\StringTok{"}\VariableTok{$(}\FunctionTok{sed}\NormalTok{ {-}nr }\StringTok{"s|\^{}Boot}\VariableTok{$boot\_order\_entry}\StringTok{.*\textbackslash{}tHD\textbackslash{}(1.*\textbackslash{})/File\textbackslash{}((.*)\textbackslash{}).*$|\textbackslash{}1|p"} \StringTok{"}\VariableTok{$remote\_image\_efi\_nvram\_file}\StringTok{"}\VariableTok{)}\StringTok{"} - - \KeywordTok{if [[} \OtherTok{{-}z} \StringTok{"}\VariableTok{$boot\_file\_path}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Boot file path not found for boot entry }\VariableTok{$boot\_order\_entry}\StringTok{"} - \BuiltInTok{continue} - \KeywordTok{fi} - - \BuiltInTok{echo} \StringTok{"Boot file path found for boot entry }\VariableTok{$boot\_order\_entry}\StringTok{: }\VariableTok{$boot\_file\_path}\StringTok{"} - - \ExtensionTok{mount\_esp} - - \KeywordTok{if [[} \StringTok{"}\VariableTok{$boot\_file\_path}\StringTok{"}\NormalTok{ =\textasciitilde{} \^{}}\DataTypeTok{\textbackslash{}\textbackslash{}}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Boot file path looks like a windows{-}like path. Converting it to a unix{-}like path..."} - \VariableTok{unix\_boot\_file\_path=}\StringTok{"}\VariableTok{$(}\BuiltInTok{echo} \StringTok{"}\VariableTok{$boot\_file\_path}\StringTok{"} \KeywordTok{|} \FunctionTok{tr} \DataTypeTok{\textbackslash{}\textbackslash{}\textbackslash{}\textbackslash{}}\NormalTok{ /}\VariableTok{)}\StringTok{"} - \BuiltInTok{echo} \StringTok{"Windows{-}like path \textquotesingle{}}\VariableTok{$boot\_file\_path}\StringTok{\textquotesingle{} converted to unix{-}like path \textquotesingle{}}\VariableTok{$unix\_boot\_file\_path}\StringTok{\textquotesingle{}"} - - \BuiltInTok{echo} \StringTok{"Trying to find the case sensitive path for \textquotesingle{}}\VariableTok{$unix\_boot\_file\_path}\StringTok{\textquotesingle{} in EFI..."} - \VariableTok{boot\_file\_path=}\StringTok{"}\VariableTok{$(} - \FunctionTok{find} \StringTok{"}\VariableTok{$mounting\_point\_esp}\StringTok{"} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}type}\NormalTok{ f }\KeywordTok{\textbackslash{}} - \ExtensionTok{{-}ipath} \StringTok{"}\VariableTok{$mounting\_point\_esp$unix\_boot\_file\_path}\StringTok{"} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}printf} \StringTok{\textquotesingle{}/\%P\textbackslash{}n\textquotesingle{}} \KeywordTok{|} - \FunctionTok{head}\NormalTok{ {-}n 1} - \VariableTok{)}\StringTok{"} - - \KeywordTok{if [[} \OtherTok{{-}z} \StringTok{"}\VariableTok{$boot\_file\_path}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{fatal\_error} \StringTok{"Cannot find a case insensitive match for efi boot file \textquotesingle{}}\VariableTok{$unix\_boot\_file\_path}\StringTok{\textquotesingle{}"} - \KeywordTok{fi} - - \BuiltInTok{echo} \StringTok{"Case insensitive EFI boot file path found: \textquotesingle{}}\VariableTok{$boot\_file\_path}\StringTok{\textquotesingle{}."} - \KeywordTok{fi} - - \ExtensionTok{write\_efi\_entrypoint\_file} \StringTok{"set efi\_entrypoint=}\VariableTok{$boot\_file\_path}\StringTok{"} - \VariableTok{written\_boot\_order\_entry=}\StringTok{"}\VariableTok{$boot\_order\_entry}\StringTok{"} - \BuiltInTok{break} - \KeywordTok{done} - - \KeywordTok{if [[} \OtherTok{{-}z} \StringTok{"}\VariableTok{$written\_boot\_order\_entry}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{fatal\_error} \StringTok{"No bootfile found in \textquotesingle{}}\VariableTok{$remote\_image\_efi\_nvram\_file}\StringTok{\textquotesingle{}."} - \KeywordTok{fi} - \KeywordTok{else} - \ExtensionTok{fatal\_error} \StringTok{"Boot order entries not found in \textquotesingle{}}\VariableTok{$remote\_image\_efi\_nvram\_file}\StringTok{\textquotesingle{}."} - \KeywordTok{fi} - \KeywordTok{else} - \BuiltInTok{echo} \StringTok{"No EFI entrypoint file or EFI nvram file found."} - \KeywordTok{fi} - - \ExtensionTok{start\_step\_batch} \StringTok{"signature creation"} - - \KeywordTok{((}\NormalTok{signature\_offset = total\_disk\_size {-} 200}\KeywordTok{))} - \VariableTok{signature=}\StringTok{"hepia2015"} - - \BuiltInTok{echo} \StringTok{"Writing signature \textquotesingle{}}\VariableTok{$signature}\StringTok{\textquotesingle{} on offset }\VariableTok{$signature\_offset}\StringTok{ B..."} - \BuiltInTok{echo}\NormalTok{ {-}ne }\StringTok{"}\VariableTok{$signature}\StringTok{"} \KeywordTok{|} \FunctionTok{dd}\NormalTok{ of=}\StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"}\NormalTok{ seek=}\StringTok{"}\VariableTok{$signature\_offset}\StringTok{"}\NormalTok{ bs=1 iflag=skip\_bytes }\KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"Cannot write signature at the end of the disk"} - \BuiltInTok{echo} \StringTok{"Signature written."} - - \BuiltInTok{echo} \StringTok{"Image deployment process successful."} - - \ExtensionTok{print\_step\_durations} - -\KeywordTok{\}} \OperatorTok{2\textgreater{}\&1} \KeywordTok{|} \FunctionTok{tee} \StringTok{"}\VariableTok{$log\_file}\StringTok{"} - -\BuiltInTok{exit} \StringTok{"}\VariableTok{$\{PIPESTATUS[0]\}}\StringTok{"} -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployerbootiful-save-image-script-utilitaire-de-cruxe9ation-dimage-raw}{% -\section{\texorpdfstring{\texttt{deployer/bootiful-save-image}: script -utilitaire de création d'image -raw}{deployer/bootiful-save-image: script utilitaire de création d'image raw}}\label{deployerbootiful-save-image-script-utilitaire-de-cruxe9ation-dimage-raw}} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\#!/bin/bash} -\BuiltInTok{readonly} \VariableTok{SCRIPT\_NAME=}\StringTok{"}\VariableTok{$(}\FunctionTok{basename} \StringTok{"}\VariableTok{$0}\StringTok{"}\VariableTok{)}\StringTok{"} -\BuiltInTok{readonly} \VariableTok{SCRIPT\_DIR=}\StringTok{"}\VariableTok{$(}\FunctionTok{readlink}\NormalTok{ {-}m }\StringTok{"}\VariableTok{$(}\FunctionTok{dirname} \StringTok{"}\VariableTok{$0}\StringTok{"}\VariableTok{)}\StringTok{"}\VariableTok{)}\StringTok{"} - -\FunctionTok{usage()} \KeywordTok{\{} - \FunctionTok{cat} \OperatorTok{\textless{}\textless{} EOF} -\NormalTok{Usage:} - \VariableTok{$SCRIPT\_DIR}\NormalTok{ IMAGE\_NAME} - \VariableTok{$SCRIPT\_DIR}\NormalTok{ [{-}h | {-}{-}help]} - -\NormalTok{Description:} -\NormalTok{ Saves a raw dd image of the /dev/sda device to the remote server shared images} -\NormalTok{ folder.} - -\NormalTok{Parameters:} -\NormalTok{ IMAGE\_NAME Name of the image to create} - -\NormalTok{Options:} -\NormalTok{ {-}h {-}{-}help Shows this help} - -\NormalTok{Example:} -\NormalTok{ ./}\VariableTok{$SCRIPT\_NAME}\NormalTok{ debian{-}buster{-}x86\_64{-}efi} -\OperatorTok{EOF} -\KeywordTok{\}} - -\KeywordTok{if [[} \StringTok{"}\VariableTok{$1}\StringTok{"} \OtherTok{==} \StringTok{"{-}h"}\NormalTok{ || }\StringTok{"}\VariableTok{$1}\StringTok{"} \OtherTok{==} \StringTok{"{-}{-}help"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{usage} - \BuiltInTok{exit}\NormalTok{ 0} -\KeywordTok{fi} - -\BuiltInTok{readonly} \VariableTok{image\_name=}\StringTok{"}\VariableTok{$1}\StringTok{"} -\KeywordTok{if [[} \OtherTok{{-}z} \StringTok{"}\VariableTok{$image\_name}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{usage} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} - -\CommentTok{\# Loads declarations from the \textquotesingle{}bootiful{-}common\textquotesingle{} script, which is a "library"} -\CommentTok{\# of functions and constants shared by multiple bootiful{-}* scripts.} -\BuiltInTok{readonly} \VariableTok{bootiful\_common\_script\_file=}\StringTok{"}\VariableTok{$SCRIPT\_DIR}\StringTok{/bootiful{-}common"} -\KeywordTok{if [[} \OtherTok{!} \OtherTok{{-}f} \StringTok{"}\VariableTok{$bootiful\_common\_script\_file}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \OperatorTok{\textgreater{}\&2} \BuiltInTok{echo} \StringTok{"Fatal error: cannot find required script file \textquotesingle{}}\VariableTok{$bootiful\_common\_script\_file}\StringTok{\textquotesingle{}."} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} -\CommentTok{\# shellcheck source=./bootiful{-}common} -\BuiltInTok{.} \StringTok{"}\VariableTok{$bootiful\_common\_script\_file}\StringTok{"} - -\ExtensionTok{ensure\_remote\_shared\_mounted} - -\BuiltInTok{echo} \StringTok{"Finding size of the image to create..."} -\BuiltInTok{readonly} \VariableTok{parted\_unit=}\StringTok{"B"} - -\BuiltInTok{declare} \VariableTok{parted\_output} -\VariableTok{parted\_output=$(}\ExtensionTok{parted}\NormalTok{ {-}{-}script }\StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"}\NormalTok{ unit }\StringTok{"}\VariableTok{$parted\_unit}\StringTok{"}\NormalTok{ print}\VariableTok{)} \KeywordTok{||} - \ExtensionTok{fatal\_error} \StringTok{"failed to save parted output"} -\BuiltInTok{readonly} \VariableTok{parted\_output} - -\BuiltInTok{declare} \VariableTok{image\_size} -\VariableTok{image\_size=$(}\ExtensionTok{parse\_parted\_last\_partition\_end} \StringTok{"}\VariableTok{$parted\_output}\StringTok{"} \StringTok{"}\VariableTok{$parted\_unit}\StringTok{"}\VariableTok{)} -\BuiltInTok{readonly} \VariableTok{image\_size} - -\BuiltInTok{echo} \StringTok{"Image size: }\VariableTok{$image\_size}\StringTok{"} - -\BuiltInTok{readonly} \VariableTok{image\_folder=}\StringTok{"}\VariableTok{$mounting\_point\_hidden}\StringTok{/images/}\VariableTok{$image\_name}\StringTok{"} - -\KeywordTok{if [[} \OtherTok{{-}d} \StringTok{"}\VariableTok{$image\_folder}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Image folder \textquotesingle{}}\VariableTok{$image\_folder}\StringTok{\textquotesingle{} already exists."} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} - -\KeywordTok{if}\NormalTok{ ! }\FunctionTok{mkdir} \StringTok{"}\VariableTok{$image\_folder}\StringTok{"}\KeywordTok{;} \KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Cannot create image folder \textquotesingle{}}\VariableTok{$image\_folder}\StringTok{\textquotesingle{}"} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} - -\BuiltInTok{readonly} \VariableTok{image\_file=}\StringTok{"}\VariableTok{$image\_folder}\StringTok{/}\VariableTok{$image\_name}\StringTok{.img.gz"} -\KeywordTok{if}\NormalTok{ ! }\ExtensionTok{pv}\NormalTok{ {-}{-}size }\StringTok{"}\VariableTok{$image\_size}\StringTok{"}\NormalTok{ {-}{-}stop{-}at{-}size /dev/sda }\KeywordTok{|} - \ExtensionTok{pigz}\NormalTok{ {-}c }\OperatorTok{\textgreater{}} \StringTok{"}\VariableTok{$image\_file}\StringTok{"} -\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Cannot create image file \textquotesingle{}}\VariableTok{$image\_file}\StringTok{\textquotesingle{}"} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} - -\CommentTok{\# }\AlertTok{TODO}\CommentTok{: Rename md5 files to uuid because creating md5 hashes takes too much time} -\BuiltInTok{readonly} \VariableTok{md5\_file=}\StringTok{"}\VariableTok{$image\_folder}\StringTok{/}\VariableTok{$image\_name}\StringTok{.md5"} -\KeywordTok{if}\NormalTok{ ! }\FunctionTok{cat}\NormalTok{ /proc/sys/kernel/random/uuid }\OperatorTok{\textgreater{}} \StringTok{"}\VariableTok{$md5\_file}\StringTok{"}\KeywordTok{;} \KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Cannot create md5 file \textquotesingle{}}\VariableTok{$md5\_file}\StringTok{\textquotesingle{}"} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} - -\BuiltInTok{readonly} \VariableTok{partition\_file=}\StringTok{"}\VariableTok{$image\_folder}\StringTok{/}\VariableTok{$image\_name}\StringTok{.partition"} -\KeywordTok{if}\NormalTok{ ! }\ExtensionTok{fdisk}\NormalTok{ {-}l /dev/sda }\OperatorTok{\textgreater{}} \StringTok{"}\VariableTok{$partition\_file}\StringTok{"}\KeywordTok{;} \KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Cannot create partition file }\VariableTok{$partition\_file}\StringTok{"} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} - -\BuiltInTok{readonly} \VariableTok{size\_file=}\StringTok{"}\VariableTok{$image\_folder}\StringTok{/}\VariableTok{$image\_name}\StringTok{.size"} -\KeywordTok{if}\NormalTok{ ! }\FunctionTok{du} \StringTok{"}\VariableTok{$image\_file}\StringTok{"} \OperatorTok{\textgreater{}} \StringTok{"}\VariableTok{$size\_file}\StringTok{"}\KeywordTok{;} \KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Cannot create size file }\VariableTok{$size\_file}\StringTok{"} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} - -\BuiltInTok{echo} \StringTok{"Image creation successful."} -\BuiltInTok{exit}\NormalTok{ 0} - -\end{Highlighting} -\end{Shaded} - -\hypertarget{deployerbootiful-reset-cache-script-utilitaire-de-ruxe9initialisation-du-cache}{% -\section{\texorpdfstring{\texttt{deployer/bootiful-reset-cache}: script -utilitaire de réinitialisation du -cache}{deployer/bootiful-reset-cache: script utilitaire de réinitialisation du cache}}\label{deployerbootiful-reset-cache-script-utilitaire-de-ruxe9initialisation-du-cache}} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\#!/bin/bash} - -\BuiltInTok{readonly} \VariableTok{SCRIPT\_NAME=}\StringTok{"}\VariableTok{$(}\FunctionTok{basename} \StringTok{"}\VariableTok{$0}\StringTok{"}\VariableTok{)}\StringTok{"} -\BuiltInTok{readonly} \VariableTok{SCRIPT\_DIR=}\StringTok{"}\VariableTok{$(}\FunctionTok{readlink}\NormalTok{ {-}m }\StringTok{"}\VariableTok{$(}\FunctionTok{dirname} \StringTok{"}\VariableTok{$0}\StringTok{"}\VariableTok{)}\StringTok{"}\VariableTok{)}\StringTok{"} - -\FunctionTok{usage()} \KeywordTok{\{} - \FunctionTok{cat} \OperatorTok{\textless{}\textless{} EOF} -\NormalTok{Usage:} - \VariableTok{$SCRIPT\_DIR}\NormalTok{ [{-}h | {-}{-}help]} - -\NormalTok{Description:} -\NormalTok{ Clears the bootiful image cache by re{-}creating the hidden partition} - -\NormalTok{Options:} -\NormalTok{ {-}h {-}{-}help Shows this help} - -\NormalTok{Example:} -\NormalTok{ ./}\VariableTok{$SCRIPT\_NAME} -\OperatorTok{EOF} -\KeywordTok{\}} - -\KeywordTok{if [[} \StringTok{"}\VariableTok{$1}\StringTok{"} \OtherTok{==} \StringTok{"{-}h"}\NormalTok{ || }\StringTok{"}\VariableTok{$1}\StringTok{"} \OtherTok{==} \StringTok{"{-}{-}help"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{usage} - \BuiltInTok{exit}\NormalTok{ 0} -\KeywordTok{fi} - -\CommentTok{\# Loads declarations from the \textquotesingle{}bootiful{-}common\textquotesingle{} script, which is a "library"} -\CommentTok{\# of functions and constants shared by multiple bootiful{-}* scripts.} -\BuiltInTok{readonly} \VariableTok{bootiful\_common\_script\_file=}\StringTok{"}\VariableTok{$SCRIPT\_DIR}\StringTok{/bootiful{-}common"} -\KeywordTok{if [[} \OtherTok{!} \OtherTok{{-}f} \StringTok{"}\VariableTok{$bootiful\_common\_script\_file}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \OperatorTok{\textgreater{}\&2} \BuiltInTok{echo} \StringTok{"Fatal error: cannot find required script file \textquotesingle{}}\VariableTok{$bootiful\_common\_script\_file}\StringTok{\textquotesingle{}."} - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{fi} -\CommentTok{\# shellcheck source=./bootiful{-}common} -\BuiltInTok{.} \StringTok{"}\VariableTok{$bootiful\_common\_script\_file}\StringTok{"} - -\ExtensionTok{validate\_exists} \StringTok{"}\VariableTok{$deployment\_disk}\StringTok{"} -\ExtensionTok{create\_hidden\_partition} -\end{Highlighting} -\end{Shaded} - -\hypertarget{dhcpdockerfile-configuration-docker-du-serveur-dhcp}{% -\section{\texorpdfstring{\texttt{dhcp/Dockerfile}: configuration -\emph{Docker} du serveur -\protect\hyperlink{acronym__DHCP}{DHCP}}{dhcp/Dockerfile: configuration Docker du serveur DHCP}}\label{dhcpdockerfile-configuration-docker-du-serveur-dhcp}} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{FROM}\NormalTok{ alpine:3.12} -\KeywordTok{RUN}\NormalTok{ apk add dhcp{-}server{-}vanilla \&\& touch /var/lib/dhcp/dhcpd.leases} -\KeywordTok{COPY}\NormalTok{ dhcpd.conf /etc/dhcp/dhcpd.conf} -\KeywordTok{EXPOSE}\NormalTok{ 67} -\KeywordTok{ENTRYPOINT}\NormalTok{ [}\StringTok{"dhcpd"}\NormalTok{, }\StringTok{"{-}f"}\NormalTok{]} -\end{Highlighting} -\end{Shaded} - -\hypertarget{dhcpdhcpd.conf-configuration-du-serveur-dhcp}{% -\section{\texorpdfstring{\texttt{dhcp/dhcpd.conf}: configuration du -serveur -\protect\hyperlink{acronym__DHCP}{DHCP}}{dhcp/dhcpd.conf: configuration du serveur DHCP}}\label{dhcpdhcpd.conf-configuration-du-serveur-dhcp}} - -\begin{Shaded} -\begin{Highlighting}[] -\ExtensionTok{allow}\NormalTok{ bootp}\KeywordTok{;} - -\ExtensionTok{subnet}\NormalTok{ 192.168.56.0 netmask 255.255.255.0 \{} - \ExtensionTok{range}\NormalTok{ 192.168.56.10 192.168.56.80}\KeywordTok{;} - \ExtensionTok{default{-}lease{-}time}\NormalTok{ 600}\KeywordTok{;} - \ExtensionTok{max{-}lease{-}time}\NormalTok{ 7200}\KeywordTok{;} - -\CommentTok{\# option domain{-}name{-}servers 10.136.132.100;} -\CommentTok{\# option routers 192.168.56.100;} - - \ExtensionTok{class} \StringTok{"pxeclient"}\NormalTok{ \{} - \ExtensionTok{match}\NormalTok{ if substring (option vendor{-}class{-}identifier, 0, 9) = }\StringTok{"PXEClient"}\NormalTok{;} - \ExtensionTok{next{-}server}\NormalTok{ 192.168.56.100}\KeywordTok{;} - \ExtensionTok{option}\NormalTok{ tftp{-}server{-}name }\StringTok{"192.168.56.100"}\KeywordTok{;} - - \KeywordTok{if} \ExtensionTok{substring}\NormalTok{ (option vendor{-}class{-}identifier, 15, 5) = }\StringTok{"00000"} \KeywordTok{\{} - \ExtensionTok{option}\NormalTok{ bootfile{-}name }\StringTok{"/boot/grub/i386{-}pc/core.0"}\KeywordTok{;} - \KeywordTok{\}} - \ExtensionTok{elsif}\NormalTok{ substring (option vendor{-}class{-}identifier, 15, 5) = }\StringTok{"00006"} \KeywordTok{\{} - \ExtensionTok{option}\NormalTok{ bootfile{-}name }\StringTok{"/boot/grub/i386{-}efi/core.efi"}\KeywordTok{;} - \KeywordTok{\}} - \KeywordTok{else} \KeywordTok{\{} - \ExtensionTok{option}\NormalTok{ bootfile{-}name }\StringTok{"/boot/grub/x86\_64{-}efi/core.efi"}\KeywordTok{;} - \KeywordTok{\}} -\NormalTok{ \}} - - \ExtensionTok{class} \StringTok{"normalclient"}\NormalTok{ \{} - \ExtensionTok{match}\NormalTok{ if substring (option vendor{-}class{-}identifier, 0, 9) != }\StringTok{"PXEClient"}\NormalTok{;} -\NormalTok{ \}} -\NormalTok{\}} - -\end{Highlighting} -\end{Shaded} - -\hypertarget{grubdockerfile-configuration-docker-pour-la-compilation-de-grub}{% -\section{\texorpdfstring{\texttt{grub/Dockerfile}: configuration -\emph{Docker} pour la compilation de -\protect\hyperlink{acronym__GRUB}{GRUB}}{grub/Dockerfile: configuration Docker pour la compilation de GRUB}}\label{grubdockerfile-configuration-docker-pour-la-compilation-de-grub}} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{FROM}\NormalTok{ debian:buster AS build{-}stage} -\KeywordTok{RUN}\NormalTok{ apt{-}get update \&\& apt{-}get install {-}y {-}{-}no{-}install{-}recommends \textbackslash{}} -\NormalTok{ gcc \textbackslash{}} -\NormalTok{ make \textbackslash{}} -\NormalTok{ bison \textbackslash{}} -\NormalTok{ gettext \textbackslash{}} -\NormalTok{ binutils \textbackslash{}} -\NormalTok{ flex \textbackslash{}} -\NormalTok{ pkg{-}config \textbackslash{}} -\NormalTok{ libdevmapper{-}dev \textbackslash{}} -\NormalTok{ libfreetype6{-}dev \textbackslash{}} -\NormalTok{ unifont \textbackslash{}} -\NormalTok{ python \textbackslash{}} -\NormalTok{ automake \textbackslash{}} -\NormalTok{ autoconf} - -\KeywordTok{WORKDIR}\NormalTok{ /bootiful{-}grub} -\KeywordTok{ADD}\NormalTok{ ./bootiful{-}grub ./} - -\KeywordTok{ARG}\NormalTok{ PLATFORM} -\KeywordTok{ARG}\NormalTok{ TARGET} -\KeywordTok{RUN}\NormalTok{ ./configure {-}{-}with{-}platform=$\{PLATFORM\} {-}{-}target=$\{TARGET\}} -\KeywordTok{RUN}\NormalTok{ make} -\KeywordTok{RUN}\NormalTok{ make install} - -\KeywordTok{RUN}\NormalTok{ grub{-}mknetdir {-}{-}net{-}directory=./netdir {-}{-}subdir=./boot/grub} - -\KeywordTok{FROM}\NormalTok{ scratch AS export{-}stage} -\KeywordTok{COPY}\NormalTok{ {-}{-}from=build{-}stage ./bootiful{-}grub/netdir /} -\end{Highlighting} -\end{Shaded} - -\hypertarget{nfsdockerfile-configuration-docker-du-serveur-nfs}{% -\section{\texorpdfstring{\texttt{nfs/Dockerfile}: configuration -\emph{Docker} du serveur -\protect\hyperlink{acronym__NFS}{NFS}}{nfs/Dockerfile: configuration Docker du serveur NFS}}\label{nfsdockerfile-configuration-docker-du-serveur-nfs}} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{FROM}\NormalTok{ erichough/nfs{-}server} -\KeywordTok{ADD}\NormalTok{ nfsroot.tar.gz /nfsrootsrc/} -\KeywordTok{COPY}\NormalTok{ exports /etc/exports} -\KeywordTok{VOLUME}\NormalTok{ /nfsroot} -\KeywordTok{VOLUME}\NormalTok{ /nfsshared} -\KeywordTok{ENTRYPOINT}\NormalTok{ cp {-}a nfsrootsrc/rootfs/. /nfsroot/ \&\& entrypoint.sh} -\end{Highlighting} -\end{Shaded} - -\hypertarget{nfsexports-configuration-des-partages-du-serveur-nfs}{% -\section{\texorpdfstring{\texttt{nfs/exports}: configuration des -partages du serveur -\protect\hyperlink{acronym__NFS}{NFS}}{nfs/exports: configuration des partages du serveur NFS}}\label{nfsexports-configuration-des-partages-du-serveur-nfs}} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\# /etc/exports: the access control list for filesystems which may be exported} -\CommentTok{\# to NFS clients. See exports(5).} -\CommentTok{\#} -\CommentTok{\# Example for NFSv2 and NFSv3:} -\CommentTok{\# /srv/homes hostname1(rw,sync,no\_subtree\_check) hostname2(ro,sync,no\_subtree\_check)} -\CommentTok{\#} -\CommentTok{\# Example for NFSv4:} -\CommentTok{\# /srv/nfs4 gss/krb5i(rw,sync,fsid=0,crossmnt,no\_subtree\_check)} -\CommentTok{\# /srv/nfs4/homes gss/krb5i(rw,sync,no\_subtree\_check)} -\CommentTok{\#} -\ExtensionTok{/nfsroot}\NormalTok{ *(ro,fsid=0,no\_root\_squash,no\_subtree\_check,async,insecure)} -\ExtensionTok{/nfsshared}\NormalTok{ *(rw,fsid=1,no\_root\_squash,no\_subtree\_check,async,insecure)} -\end{Highlighting} -\end{Shaded} - -\hypertarget{tftpdockerfile-configuration-docker-du-serveur-tftp}{% -\section{\texorpdfstring{\texttt{tftp/Dockerfile}: configuration -\emph{Docker} du serveur -\protect\hyperlink{acronym__TFTP}{TFTP}}{tftp/Dockerfile: configuration Docker du serveur TFTP}}\label{tftpdockerfile-configuration-docker-du-serveur-tftp}} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{FROM}\NormalTok{ alpine:3.12} -\KeywordTok{RUN}\NormalTok{ apk add tftp{-}hpa} -\KeywordTok{VOLUME}\NormalTok{ /tftpboot} -\KeywordTok{EXPOSE}\NormalTok{ 69/udp} -\KeywordTok{ENTRYPOINT}\NormalTok{ [}\StringTok{"in.tftpd"}\NormalTok{, }\StringTok{"{-}{-}foreground"}\NormalTok{, }\StringTok{"{-}{-}address"}\NormalTok{, }\StringTok{":69"}\NormalTok{, }\StringTok{"{-}{-}secure"}\NormalTok{, }\StringTok{"{-}{-}verbose"}\NormalTok{, }\StringTok{"/tftpboot"}\NormalTok{]} -\end{Highlighting} -\end{Shaded} - -\hypertarget{tftptftpd-hpa-configuration-du-serveur-tftp}{% -\section{\texorpdfstring{\texttt{tftp/tftpd-hpa}: configuration du -serveur -\protect\hyperlink{acronym__TFTP}{TFTP}}{tftp/tftpd-hpa: configuration du serveur TFTP}}\label{tftptftpd-hpa-configuration-du-serveur-tftp}} - -\begin{Shaded} -\begin{Highlighting}[] -\VariableTok{TFTP\_USERNAME=}\StringTok{"tftp"} -\VariableTok{TFTP\_DIRECTORY=}\StringTok{"/tftpboot"} -\VariableTok{TFTP\_ADDRESS=}\StringTok{":69"} -\VariableTok{TFTP\_OPTIONS=}\StringTok{"{-}s {-}c"} -\VariableTok{RUN\_DAEMON=}\StringTok{"yes"} -\end{Highlighting} -\end{Shaded} - -\hypertarget{tftptftpbootbootgrubgrub.cfg-configuration-de-grub-servie-par-tftp}{% -\section{\texorpdfstring{\texttt{tftp/tftpboot/boot/grub/grub.cfg}: -configuration de \protect\hyperlink{acronym__GRUB}{GRUB} servie par -\protect\hyperlink{acronym__TFTP}{TFTP}}{tftp/tftpboot/boot/grub/grub.cfg: configuration de GRUB servie par TFTP}}\label{tftptftpbootbootgrubgrub.cfg-configuration-de-grub-servie-par-tftp}} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{set} \VariableTok{timeout=}\NormalTok{3} - -\ExtensionTok{insmod}\NormalTok{ part\_msdos} -\ExtensionTok{insmod}\NormalTok{ part\_gpt} -\ExtensionTok{insmod}\NormalTok{ isign} -\ExtensionTok{insmod}\NormalTok{ all\_video} - -\ExtensionTok{isign}\NormalTok{ {-}c hepia2015 (hd0)} -\KeywordTok{set} \VariableTok{check1=$?} -\KeywordTok{if}\BuiltInTok{ [} \VariableTok{$check1} \OtherTok{==}\NormalTok{ 101}\BuiltInTok{ ]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{isign}\NormalTok{ {-}w 000000000 (hd0)} - - \ExtensionTok{menuentry} \StringTok{"Local HDD"}\NormalTok{ \{} - \KeywordTok{set} \VariableTok{root=(}\NormalTok{hd0,1}\VariableTok{)} - - \KeywordTok{if}\BuiltInTok{ [} \OtherTok{{-}e}\NormalTok{ /efi\_entrypoint}\BuiltInTok{ ]}\NormalTok{; }\KeywordTok{then} - \BuiltInTok{echo} \StringTok{"Reading EFI entry point from (hd0,1)/efi\_entrypoint file..."} - \BuiltInTok{source}\NormalTok{ /efi\_entrypoint} - - \BuiltInTok{echo} \StringTok{"Chainloading to }\VariableTok{$efi\_entrypoint}\StringTok{"} - \ExtensionTok{chainloader} \VariableTok{$efi\_entrypoint} - \KeywordTok{else} - \BuiltInTok{echo} \StringTok{"Legacy chainloading to (hd0,1)+1..."} - \ExtensionTok{chainloader}\NormalTok{ +1} - \KeywordTok{fi} -\NormalTok{ \}} -\KeywordTok{fi} - -\ExtensionTok{menuentry} \StringTok{"Bootiful deployer"}\NormalTok{ \{} - \BuiltInTok{echo} \StringTok{"Loading vmlinuz..."} - \ExtensionTok{linux}\NormalTok{ boot/deployer/vmlinuz root=/dev/nfs nfsroot=}\VariableTok{$net\_default\_server}\NormalTok{:/nfsroot ro} - \ExtensionTok{initrd}\NormalTok{ boot/deployer/initrd.img} -\NormalTok{\}} - -\end{Highlighting} -\end{Shaded} - -\hypertarget{source_ansible_run}{% -\section{\texorpdfstring{\texttt{postdeploy/bootiful-postdeploy}: script -de post-déploiement qui exécute les playbooks \emph{Ansible} présents -dans un -dossier}{postdeploy/bootiful-postdeploy: script de post-déploiement qui exécute les playbooks Ansible présents dans un dossier}}\label{source_ansible_run}} - -\begin{Shaded} -\begin{Highlighting}[] -\CommentTok{\#!/bin/bash} - -\KeywordTok{function}\FunctionTok{ log()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{log\_message=}\StringTok{"}\VariableTok{$0}\StringTok{"} - \OperatorTok{\textgreater{}\&2} \BuiltInTok{echo} \StringTok{"}\VariableTok{$log\_message}\StringTok{"} -\KeywordTok{\}} - -\KeywordTok{function}\FunctionTok{ fatal\_error()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{error\_message=}\StringTok{"}\VariableTok{$0}\StringTok{"} - \ExtensionTok{log} \StringTok{"Fatal error: }\VariableTok{$error\_message}\StringTok{"} - - \ExtensionTok{log} \StringTok{"Stack trace:"} - \BuiltInTok{local} \VariableTok{frame=}\NormalTok{0} - \KeywordTok{while} \OperatorTok{\textgreater{}\&2} \BuiltInTok{caller} \VariableTok{$frame}\KeywordTok{;} \KeywordTok{do} - \KeywordTok{((}\NormalTok{frame++}\KeywordTok{))} - \KeywordTok{done} - - \BuiltInTok{exit}\NormalTok{ 1} -\KeywordTok{\}} - -\ExtensionTok{log} \StringTok{"Starting bootiful post{-}deployment script..."} -\BuiltInTok{readonly} \VariableTok{playbooks\_dir=}\StringTok{"/etc/bootiful/postdeploy{-}playbooks"} -\KeywordTok{[[} \OtherTok{{-}d} \StringTok{"}\VariableTok{$playbooks\_dir}\StringTok{"}\KeywordTok{ ]]} \KeywordTok{||} \ExtensionTok{fatal\_error} \StringTok{"playbooks directory \textquotesingle{}}\VariableTok{$playbooks\_dir}\StringTok{\textquotesingle{} not found."} - -\BuiltInTok{readonly} \VariableTok{playbook\_files=}\StringTok{"}\VariableTok{$()}\StringTok{"} - -\KeywordTok{if [[} \OtherTok{{-}z} \StringTok{"}\VariableTok{$playbook\_files}\StringTok{"}\KeywordTok{ ]]}\NormalTok{; }\KeywordTok{then} - \ExtensionTok{log} \StringTok{"no story found in directory \textquotesingle{}}\VariableTok{$playbooks\_dir}\StringTok{\textquotesingle{}. Exiting."} - \BuiltInTok{exit}\NormalTok{ 0} -\KeywordTok{fi} - -\FunctionTok{run\_playbook()} \KeywordTok{\{} - \BuiltInTok{local}\NormalTok{ {-}r }\VariableTok{playbook\_file=}\StringTok{"}\VariableTok{$0}\StringTok{"} - \ExtensionTok{log} \StringTok{"Executing playbook file \textquotesingle{}}\VariableTok{$playbook\_file}\StringTok{\textquotesingle{}..."} -\NormalTok{ [[ }\ExtensionTok{{-}f} \StringTok{"}\VariableTok{$playbook\_file}\StringTok{"}\NormalTok{ ]] }\KeywordTok{||} \ExtensionTok{fatal\_error} \StringTok{"playbook file }\VariableTok{$playbook\_file}\StringTok{ not found."} - - \ExtensionTok{ansible{-}playbook} \KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}connection}\NormalTok{=local }\KeywordTok{\textbackslash{}} - \ExtensionTok{{-}{-}inventory}\NormalTok{=127.0.0.1, }\KeywordTok{\textbackslash{}} - \StringTok{"}\VariableTok{$playbook\_file}\StringTok{"} \KeywordTok{\textbackslash{}} - \KeywordTok{||} \ExtensionTok{fatal\_error} \StringTok{"error while executing playbook file "} - - \ExtensionTok{log} \StringTok{"Execution of playbook file \textquotesingle{}}\VariableTok{$playbook\_file}\StringTok{\textquotesingle{} successful."} -\KeywordTok{\}} -\BuiltInTok{export}\NormalTok{ {-}f }\VariableTok{run\_playbook} - -\CommentTok{\# shellcheck disable=SC2016 \# we do not want to expand $1 in bash command} -\FunctionTok{find} \StringTok{"}\VariableTok{$playbooks\_dir}\StringTok{"}\NormalTok{ {-}maxdepth 1 {-}type f {-}name }\StringTok{\textquotesingle{}*.yml\textquotesingle{}}\NormalTok{ {-}print0 }\KeywordTok{|} - \FunctionTok{sort}\NormalTok{ {-}z }\KeywordTok{|} - \FunctionTok{xargs}\NormalTok{ {-}n1 {-}0 bash {-}c }\StringTok{$\textquotesingle{}trap }\DataTypeTok{\textbackslash{}\textquotesingle{}}\StringTok{[[ $? == 0 ]] || exit 255}\DataTypeTok{\textbackslash{}\textquotesingle{}}\StringTok{ EXIT; run\_playbook "$1"\textquotesingle{}}\NormalTok{ {-}{-}} -\end{Highlighting} -\end{Shaded} - -\hypertarget{source_ansible_init}{% -\section{\texorpdfstring{\texttt{postdeploy/bootiful-postdeploy.service}: -configuration de l'unité \emph{Systemd} pour exécuter des scripts de -post-déploiement sur un -client}{postdeploy/bootiful-postdeploy.service: configuration de l'unité Systemd pour exécuter des scripts de post-déploiement sur un client}}\label{source_ansible_init}} - -\begin{Shaded} -\begin{Highlighting}[] -\KeywordTok{[Unit]} -\DataTypeTok{Description}\OtherTok{=}\StringTok{Runs bootiful post{-}deployment script }\KeywordTok{on}\StringTok{ boot} -\DataTypeTok{After}\OtherTok{=}\StringTok{network.target} - -\KeywordTok{[Service]} -\DataTypeTok{ExecStart}\OtherTok{=}\StringTok{/usr/local/bin/bootiful{-}postdeploy} -\DataTypeTok{Type}\OtherTok{=}\StringTok{oneshot} - -\KeywordTok{[Install]} -\DataTypeTok{WantedBy}\OtherTok{=}\StringTok{multi{-}user.target} -\end{Highlighting} -\end{Shaded} - -\hypertarget{refs}{} -\begin{cslreferences} -\leavevmode\hypertarget{ref-venkatesh_remote_imaging}{}% -\textbf{1}. VENKATESH, Abhilash. Remote imaging. GitLab. {[}en~ligne{]}. -{[}Consulté~le~16~août~2020{]}. Disponible à l'adresse~: -\url{https://githepia.hesge.ch/abhilash.venkates/remote-imaging} -\end{cslreferences} - -\backmatter -\end{document} -- GitLab