From 73a5bcf116ae6e8e95acdceafb8ffaaa2ed77c10 Mon Sep 17 00:00:00 2001 From: maxluli Date: Wed, 7 Jun 2023 12:51:59 +0200 Subject: [PATCH] Added to the performance tab of the doc --- docs/Images/Figma/ZonesStuctureDiagram.png | Bin 0 -> 80871 bytes .../ZonesStuctureDiagram.png:Zone.Identifier | 0 docs/Images/Photos/PCThermals.jpg | Bin 0 -> 110696 bytes docs/Images/Screens/CPUUsage.png | Bin 0 -> 164322 bytes docs/Images/Screens/MemoryUtilisation.png | Bin 0 -> 18353 bytes docs/index.md | 59 +- docs/jdb.md | 84 + site/Images/Figma/TimeRepartition.png | Bin 0 -> 16423 bytes .../TimeRepartition.png:Zone.Identifier} | 0 site/Images/Screens/FigmaLogo.png | Bin 0 -> 13872 bytes ...entifier => FigmaLogo.png:Zone.Identifier} | 0 site/Images/Screens/MaterialsLogo.png | Bin 0 -> 2302 bytes site/Images/Screens/Vs2022logo.png | Bin 0 -> 25651 bytes site/Images/Screens/logo.png:Zone.Identifier | 4 + site/Images/Screens/vsCodelogo.png | Bin 0 -> 38531 bytes site/Planning/PlanningEffectif.pdf | Bin 0 -> 62713 bytes site/Planning/PlanningEffectif.xlsx | Bin 0 -> 11714 bytes .../PlanningEffectif.xlsx:Zone.Identifier | 0 site/index.html | 226 +- site/jdb.html | 67 + site/pdf/document.pdf | 35168 ++++++++-------- site/search/search_index.json | 2 +- site/sitemap.xml.gz | Bin 127 -> 127 bytes temp_annexes/Code/ConfigurationTool.md | 266 + temp_annexes/Code/DataWrapper.md | 384 + temp_annexes/Code/DriverData.md | 110 + temp_annexes/Code/DriverDrsWindow.md | 119 + temp_annexes/Code/DriverGapToLeaderWindow.md | 37 + temp_annexes/Code/DriverLapTimeWindow.md | 37 + temp_annexes/Code/DriverNameWindow.md | 62 + temp_annexes/Code/DriverPositionWindow.md | 47 + temp_annexes/Code/DriverSectorWindow.md | 37 + temp_annexes/Code/DriverTyresWindow.md | 151 + temp_annexes/Code/F1TVEmulator.md | 334 + temp_annexes/Code/Form1.md | 427 + temp_annexes/Code/OcrImage.md | 678 + temp_annexes/Code/Program.md | 27 + temp_annexes/Code/Reader.md | 343 + temp_annexes/Code/Settings.Designer.md | 498 + temp_annexes/Code/Settings.md | 482 + temp_annexes/Code/SqliteStorage.md | 267 + temp_annexes/Code/Window.md | 681 + temp_annexes/Code/Zone.md | 190 + temp_annexes/Code/recoverCookiesCSV.md | 88 + 44 files changed, 24171 insertions(+), 16704 deletions(-) create mode 100644 docs/Images/Figma/ZonesStuctureDiagram.png rename site/Images/Screens/AWSExample1.jpg:Zone.Identifier => docs/Images/Figma/ZonesStuctureDiagram.png:Zone.Identifier (100%) create mode 100644 docs/Images/Photos/PCThermals.jpg create mode 100644 docs/Images/Screens/CPUUsage.png create mode 100644 docs/Images/Screens/MemoryUtilisation.png create mode 100644 site/Images/Figma/TimeRepartition.png rename site/Images/{Screens/AWSExample2.jpg:Zone.Identifier => Figma/TimeRepartition.png:Zone.Identifier} (100%) create mode 100644 site/Images/Screens/FigmaLogo.png rename site/Images/Screens/{ChromiumLogo.png:Zone.Identifier => FigmaLogo.png:Zone.Identifier} (100%) create mode 100644 site/Images/Screens/MaterialsLogo.png create mode 100644 site/Images/Screens/Vs2022logo.png create mode 100644 site/Images/Screens/logo.png:Zone.Identifier create mode 100644 site/Images/Screens/vsCodelogo.png create mode 100644 site/Planning/PlanningEffectif.pdf create mode 100644 site/Planning/PlanningEffectif.xlsx create mode 100644 site/Planning/PlanningEffectif.xlsx:Zone.Identifier create mode 100644 temp_annexes/Code/ConfigurationTool.md create mode 100644 temp_annexes/Code/DataWrapper.md create mode 100644 temp_annexes/Code/DriverData.md create mode 100644 temp_annexes/Code/DriverDrsWindow.md create mode 100644 temp_annexes/Code/DriverGapToLeaderWindow.md create mode 100644 temp_annexes/Code/DriverLapTimeWindow.md create mode 100644 temp_annexes/Code/DriverNameWindow.md create mode 100644 temp_annexes/Code/DriverPositionWindow.md create mode 100644 temp_annexes/Code/DriverSectorWindow.md create mode 100644 temp_annexes/Code/DriverTyresWindow.md create mode 100644 temp_annexes/Code/F1TVEmulator.md create mode 100644 temp_annexes/Code/Form1.md create mode 100644 temp_annexes/Code/OcrImage.md create mode 100644 temp_annexes/Code/Program.md create mode 100644 temp_annexes/Code/Reader.md create mode 100644 temp_annexes/Code/Settings.Designer.md create mode 100644 temp_annexes/Code/Settings.md create mode 100644 temp_annexes/Code/SqliteStorage.md create mode 100644 temp_annexes/Code/Window.md create mode 100644 temp_annexes/Code/Zone.md create mode 100644 temp_annexes/Code/recoverCookiesCSV.md diff --git a/docs/Images/Figma/ZonesStuctureDiagram.png b/docs/Images/Figma/ZonesStuctureDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a125caa56986078d28a1dbe66fe9a8d483085d GIT binary patch literal 80871 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

DbKl-vL$~r!kQmKx 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 W`bw4x_YRN4_2)U`KMKy+-}xU2^;Zi3 literal 0 HcmV?d00001 diff --git a/site/Images/Screens/AWSExample1.jpg:Zone.Identifier b/docs/Images/Figma/ZonesStuctureDiagram.png:Zone.Identifier similarity index 100% rename from site/Images/Screens/AWSExample1.jpg:Zone.Identifier rename to docs/Images/Figma/ZonesStuctureDiagram.png:Zone.Identifier diff --git a/docs/Images/Photos/PCThermals.jpg b/docs/Images/Photos/PCThermals.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ce36eb98b2d2f8a46fbd26fc47e2b4e87ed729cc GIT binary patch literal 110696 zcmeFY1ymi)mOpxMcXxL?xVyV+aCdhI5Zv9}-Cctp+%-T1w?GJx1Of^FL%!tBH#2wE zyf^QyHEX?hH>-O8w$!fL)!o&7s+yopC;M!1AQ=(>4fY0dZ~&pe__<|AaCPY4 zI0TF#Qs9310H7ctU{n9fCLOFt{EhR$I4~6s@Dm)U9E<_Qzhklkfe^+2mI35%90E=m z>NoxX_J=P2D`qJ;EAnzk00lTiEf_!3KkM~B(^-Ojp9>baAc6}LcntoE$_j1`@;Byr zZuvJB0b}UjSO$z?eq$9dhW(9oz!(l(`?*KPU=05oKWBjOe8#{Tmx3`O7(6HbT>gIU z!6HBotbEq9{pKcM{M=J~aJ^@J)o=X|Fn*SS{|y07{u>7%;0gkO44?+bdL}M#*yn5X zIr?*a2mmA`1VHRr@eewgDV0=U{j2?F4kie_Ukvhh9U*Y$V!t&1IMDOU{PqQGw3SP0 z0RO6=>5?r8{GF2!KmW6pEeYH91}>ggL;SXx=z*xK29czSvJ z`1<*Wg-1k2MaRUZrln_OW@YE(mX?)QR902j)V8*@cXW1j_wDB;gmK=khH__J;vN+ zADfgz5nk8h_og3@Pk?hRP2Y+tiO3zmOR^_GgNET<3$n+AbL&SQ6Eo?zx^s_7qRWUcnRR{}+y?CfZrKlHqaHc*sez!;l;#FS)5!+59bGYu=2z*LBH zRItq9*U4}?cgJ?k6zmwhg7z2;Zot5eH;0f99~t8DtgxY`vhFL>3p?r;w#8kseAHsN zbb1+XVaiwoFNWE%;Dnv<)wn<07vcm{dVu0vfWJqOaCZryB;NCaI5_*F%2 z*-?Z*aYcvM`<-?t=6tKBGL6T-ZQLFWB5z#@WC?KasyPEH(D>obztOas^nL7ip;t&* zJ*EPnBk5dZ#kVuucC&mj(g+}-dw_djH7(V#aCL2zsJ4XBv_saVRuK3QF}#u6d)WK4 zKap^=XUVDC$VB-GFnN?*=Y4%{e*V^ITcT(t5AaSb|&Rz*B^i?}nq-a1fAD zae&I1l(AVoWC%lk>6klcMe29~zMpcR0E|;>x7F=~l%gFjy}stTa{aA1Qq|PT z4Mll~Gkp}UDzLkAp12s+Bb!fv74DzfCm(9*J0Fug7!r=zB-Z-1J!XbZrQ7}Xaa>2d zZyS|V7+2bCmSuQkUQ8?~#4K8ndl;Y*5bV{p`{6g{^2NoB6;Dl8ywOn#Y7b>~XxnBY zxXuW5(&foxfEZ0+OXBaBT*+a|Ybx^0g+G;E}^sKfv+`wihUg0`iTu5=#->U1{ zTqdwiegXNyyxOVWEfrRl4nP`!xal=#;Sj>oOfu)c>31Vf6-EMmA~&8Y7ttLFV_MQB z*mAhQw_gnKJ~$}!1K7+U30}e$T9K0}#oA`4t;C)MHpv7A9N5o>7dr+{qxIBi>yNqy7{s7DhXxr zlb5Jy2r5|vIM&O!%gEh(?YZv{PBq>bJf4r+%{WDW*9BR$iN2>!oZu=*G}iOuR^B_V za9%(~*sE!$f*lBC6_ohK5wGPZ)07?QuhxQi8`M`^uYuvAQx=ljOhK%@9pE|?!W4y- zZNQ5XTjz4^S%1GjiV=JIdZv?V+`>@&rjRL%ZK7uG3}I)=@@u2VSVH?)Y45i;sBVgv*jNXad=l9muZ=xf&UO?zYBts5o6CX6s17QY4Hg`m- zs`lhz;zww@Q`Wj7rIXo+4<%ov^5gSU=ex}?jjbhhBsR6|Y0v7m2gw$`laeH5;@^Pm z6V{aI)h9x4AsuP9S!UH0?FpXl1$I{`yK61o7rrG{<{#%;ij?JoA`M+_6+Kko z>WhB@)R^7r)_pl+2$XwYC_F9KBh2I=-@(zdR~9GNO&xSP$avoVl2EF{yn-svZgZLS z1Dd&vjBKaudVjq&gO2fhTAvLq8xEq@c29)+SM;4Yy1ocjeWP&455$y_E|oZ87Au7z z>)LZ+%u$pBa0=*808@h*KOg4>l-`Ef*A_TB(xV51vq16rOBw#77FHIPiuOcBVCmAD z!CMI&O5rksDUk!uA#!wh?)hC!==_y)7nAEpRbII49@R`E70f+IGWCc;mALuc(Ttfsb!%eQt@_^zw&5*AEgnOfk~L6ZU&F(ltEZVbwOl7oehNZr zQ6*#RCl5Z*JC8~TLzf?J9Nk5_4-)A-{scpIk1Mc;7khmbGeKhX?cgz|;@)of`%mj~ z#la^)y@QLw^74_k4)wtYfJ0V7^oc|76-l0Q5G%DPrRPF}OP+Zl5sXHwcdM`?^gh2n z=(x;oi`l?9g)n0HhLTS7Q-gl$#p8bSu6WfMuh<(#hJz_G)ok9~hbG~xb&PZC z^_SbhCEF;LhwQjSgPdNKCBnIKhlhG2&E~S&$ncu^q_AlG1pEzs0W;B9GciSsAO3}gpIJn`1&HrgF1wrCp zz#Dfg=HT=o2O0NkA{Ec(2>M%K*IMCwwLbw^20wVg#Mf*dqjXF|-T}PFb^KT@i1hL| z6drU$+$B+kYa?bEN6jAICiwZrleOOIuPI{9{y6YRQ)EaJEW$tZDX2oFcd|^j|4|*n^3<0$6mL)eXVZC*d{4gJ1*-T|J@vhsP7PGr=1B=3&hDK@$0bZO! z>7be*C-u)A`}A{_UV}&n*N-o&{M%caeo8CsZ!~y50njY39|OvQJNzJ@00&x)PO{wL z3|s9L@7~vN_*B818MKBkaL5ek?F~4LemCvvNI<_?-RqxFmXX0k9jIIC=k{QByYv=K z2z&zI%G3=%q%L`0zJ%3P%*@Nu@xmM>m!gjMYx(>HfWqm3H)ZdJbSUT%iX$4l*U3tRq6o%vT9#!B@Gb;Fpo{%~uQMI9oC#A{CH zGY2JBBn*wq+|48Xz*h@r>v-s(O^%y3HaxU)YFV!p z(ZM!G${K5QBvzZHD=UJKcXSNTdj!^kFJL{UDm&g!OTWY=Vr!6?JXM%HdX%>6ks9)N z*F$GW__3)GIU=POUD~}%-OnAvq~rtk8VaQeah2qHdBsCTDlmTvv!3;P%8px}8MLDDtkPQ{14>J2PQK_UctC{Ax{adugq4g@AA}-uK zqRg4E58H~WoHj)s*e_ZN`tp(Y2MyvbL@%_JX+N`gH3;l^Ga>W3PEncWGxnys@}DrK z&ITM`bMFURgFt5{13p_bU)W4ca9&0Ff7X}xbX%`G)1^C9FPg4l-Y4D|cr{~&NaW0* zqoC8%%o>CJshw~N4}jWUdi<`-7ym1oV_)ujTdD!rgT2=AIkqin$)SnnAGMcuM6qT) z^*18^n#f<=hNV=%nh95V%EA}iX~<820mw$qe7Bq*qLKD}K+v1=%2M-@uucSZatbFus9yTMR{Ul&!JXQ1qaBJ7Rn(o%$h9ZXs6^cGPV;Q%#`|fq*=h zzOiPPel>6V-E*g7rA*+RkA@o-ZN72#&jiU#^t14U2UhV zG>s$;tz{?x5hkB%IhIklL-ojPx)13q-$3;Pw(+XE;`Z84(?g@Mk8S~)%K6kw(ue~l z&mPDR#Pr({DmY?i^rh_{=~?~5)Sc)Nr0FASKG^C8nhD=yQiPUj9!AO>CZqi6n5pV3l_n4B(M$YuSIXL!jVKR7`%iJ)`PcSe%Vp` z!Tj0x7e&RDe+OHkz=9RHfc?|2GZ^C${Y6D!=JRXc>{)&uHUNN=(?b*h z2odE>OO^anp50|(x5`>%+P zp9{#&0t9bY{pIm2137s(z#ApMh>L?2$ofb4t^0q2J@;EiRq1!D|MQ6A?m7}1Wv+i4 zw||Sp^J}N=*Tw#C%73B%b_CAuo}NgOtAsWY9kc&iXRt#E1NZ=*ZJy65cpVxB4h|j; z9tjc5;9Ugs8OPuEsMz2A|090RQ%h6a>(Bi2 zY=0h$2rz%nUrSTM#mxPA>i&!V*q+BlOH;z7T#%;%5!kL_93`uElT zQSaI2ZslR+DP!m8Y31(mEdRaUv-~gm-yZ>aEjuSG?O&(of4?*T!yXLrnTX2D{^!cd z|5*i4`X{=7ss6t|0wDl$@ZZ0u55L6PkPwcL5Xnt*2IniwkPu7fE3g{!pS|s{J--OC zd3m_AS$SHp*}1zov$~pr-+=#+JXrGw|1*wm6^~()h-sICWuJ!an1SP*jq93==bn%6 zSxDerOz2xmW8 zgE6I(DXoh+y^A@snGn0)7mcE)+X29D&Ntf(Alim z*`(CfsNCJ4(p|6GQ>WHjtKM6q(O0e6U#Zn!p*>KpGf<}cxsK^8ATWMCjDwi-Sn>Z?+G$NHe zB9Ss8o;oa=HY}1pER-=Mm^mbnHOQAe$eT0Bllz)G_cdqU07w1+dqF?2u%E4{kF~gu zrKFd+w3n%@hq1hyp`x3|tpwx)xowu7dwow~k_x}lA#v6ZT+g|fMYvZa}_ zwTYswiK4xcqN9PLv!0@>o}#;sqNkRkw}zsxnxem&a-fRxbtUCs1=UbF)o>a0NEyv& zDa}|3?RYUAsEB@|kYTcbaVno_I*)lKk7YKObuI@upUu9I#krWtwUoiLl+L%DCa{t! zw3;HamMpfOB(aewwV5FECSHCkPH{U{WhX}MZM5dQD4q9_`X3@*?1q`_g_`fbvN{N{ zJq&g{3UWDq>2VV1eH!3@<{xzK7y9?FshGj9V$c9+@MZj8e@*2H5Cr`7mI8o)|K(Lez|i7nE&$s&%crW{oN9yrXq`iNcj9=2a3F$lm?g=gNyH9KXmo|!8a&5Kwe5* z%NIg;050EHyWlB!{`Q@NHSLsTsytl;wHAVQY;j{~EM;#r`*&O<==9YTyk=Ip1wW2`%=_zedKrP@rmL64NH*=|8WcvZdPP25I0gn`UL*o zOo%J$JNk%JHi~o!P%9#Jae+>-n{c!x+0{i^kN6Vxlfr9ko(P6Z#FDJ4%6o>Af*iFx z5fd2)ni2-3Wf^r__;Dd46*icDrbL)_;i&=662Yn6H^z;!jnpN1s%Mf6KjJwf!=ENj ztn%NF2QDwXuT92FT-M~L%0c9RJcv>-AUyJS#xMRxamo1MOY0&YtX)NjpatJpJ)W7IgTkz$u)CB6S*(EPv*2Uwn*MMgMHSF zR$a2LY)5mJWW_8z==z?lhbLF=EBf{Rl4Zzgg1hX8LOCP?0+Nr+``L0$sKAdSw=Y?B zX$j7;zkP9=%X~O(2?=-^6zLtvk+qb?IqfE=G3g-cBQoC{UgQSKK8El1$qkUXD_}XH zZaAp=rYbhcf6F^=!_uBP@kDGef0zhqtlTE%*HAwLghJf;c%583 zG2zEuc)j818{?3c++OrxV_O~j4V4|3J>;77`8|c!wGYolx8ST|6c9>&=45jUcZ^ts zACEs@Sc?X?tXLeSgZRM;h}KyNnOE#O?9|ywmZObNo-NAV}57_5q>B z3^y0DBEhA}0D{sGx;T7YNr5tXWBDP+r9O?)a8E7>My{1T^~}!nb4<}F_QS;>k_%Kf zT^g;>!-Gmh)^BbWW_(KD8l_-(FZNq5U8(J&WmD~qQC2?CkIkaFAhAW>n<3397IMfn zxuUhSat0bqXAA-3Y-=zmnb0qG2=2JD$l$Of_3L+UDDG5IwY945<$b^7`y{#_n(T3@ zh+c!BoxZsZU~14?s~q4LNpIzq_(-=U+q4D06P|f;2eE7%ySkt*)Y2yc^H9G}?^Z#3 zaTH8W(6rMuMc%$6xcr2=oh>cAptUl;s}+M&>ES9~=lfl6vX3XF!D_}W@(P_$>Q(KB z$UqTNB=9nAj^P5`Srld?ad8cVjw>`|lKVh-07Yn6OMYY}`YXDVZe+j7;sJWndemE?M-HQoB}aBNGVA8FWIG-Lb4Uv=47=*=r-$V} z>yZ&(h1$f!0)$>I50%ACe|Or$Wa!}xHXNglx^Nkc3HzWrRz?Xd>iYQ6lQBv9h|yCm ztrN|_Tv?M^RB5Bv#5O}Jf^ek_9~0tzgQhbWk)LV`V)2KuRf)}3b5Uc?wB_sgYd);F zPvK`|5r~LOQ!^6HS*Cu?Rb->8S@NT}2*|wW<#=s=)Ry+}O=6P}H|sv#6P4P6%ZQNl zmDGMo+*6pD)#f}P&Mr{U=nF9V)Kl$Y4mQvQ5?Xdlrbm?SV#18MImd!nX=D|c`d5HK|S8efyFh}Vf-k}Wj#-ycC z&HAz`3XzODhtn2@3x~y+a$Ov=apA0=vfaxnqHw-d7i-3{Ahmf9zY^M`DxYc$Itg8l z`Hm^idnt0(F?cGXy)V#I*>YLV7#<8&(#_I4S*s!X(Em9P}82Gtok}* z4gsl(pheU}+AH7o7nUS_mU>xJ+Y}mqhNnC$LR)f4a?ryV1g!ycYa*94RN{$2*yEAP zuC&}HM=4s+ODUMN5!=^9qrl*lF8d-SZ7oszQ7K{+0YLY)B;~=d!g(Qr3>a#s zH(kLL21PYs|2aRe)`H>{F=HN`G)_67{g{W|n7EhnoY3aune!d66~X zYNVeV@KG3L? zrxGaRAukp0sFT*Mef>FJinQI<77PFvGq2w7-l$0*=tGwfnR0%X^s`N@nC;5Bk4W~B zZH*?n9w{0%8MQF8fi#FyZ8ja>Stcu#Hu}lumvV$NhS6JVg>EoDFvals&=OeNFy@M| z5#ETZyp%x(LdqqyiihILq;_yxD9J8!& zFc-_o+FCd7Lvw#S+ZO^X1yKTV0LAO|~Dj++5UZ9)&yv8}v&F}H{rqznAgsyBi)p1k-~;jTYf zwbIW$T(?wGIg6Ujy7*qn7IuE)+MyhJ2(d|Xqjh@&+vkY=Na5!+9pdXuku19F`@9Lc zamY?LY*Oq3R!h5yp0e=cG52fkP~un0dKPYD^cQ%`duqOnJ1GZLNhrGq&0IVqQv9}B zS@H@jQ98GSMJ67_O+plw*tH6*84fIi9U3(Cp@c0VWEs5FF^VngxtaP>y@D5;;tXRj zHQw%e?t6Tn6qZ79)LT#5h{N&`TTHjC2;_^_&rKPq#7OH5#XoT-_tSm;2~n8d=V2=^ zoxV(|#^+Lp3b`*U=Z zwr-iPAzOt9@mRV@#t^RhP$x;pI?BNM65UaKu6*wqOEN|<8>zyoM26Cm_Sy|rQ0ADt zl$bMP5{svBlIk^q5?c`iGo$m{(qR2jp+ZISZJ<-;k|gWk4aFBB+WM5m>FEg6m!X|9 ze!0?dv9)q;nGc>LT0c^$Uilo>ax^Nt&s8M97+?x}yVhRjq#F>odSLUV)7Xc7Mt7zv zQGuQ&rp>A_lG6yJuV+q)bHgA~^WluI`BF}AZj&~_NC53XrUO?!TE~eW!qof8C*0IeD zPtLk3j#nwici)p+5;GF0Ql>p_1Mf}z3huB8q1!z6_zNtu2R%r@>5Of+E7~QwqR1SA z@y>2<8oNkwof4!6EqdNRb%QAsC6C7rSJKfYq`>smgannE2EN;%CCg#X_oQu+iprSE z)E2eqw2EtN*pm0LD^D;W8-vFLiflB0lQ<|LgD@l%#UJ4+Pi%kyMVW{iU zUb$dPx2A&QSzg3G)*R6m3Ugl?a|F|HHio&?WQK{V_pb1;z>t!^65o?x#b=p6*)#m1 z7N3=nO@*2mu^YTnM__V+|NJ)+)LwSkK+qT(w56nn_rh z;`9#a6OEa>MAH(wUG{VZN^Ot^oa#QjM6q_3WwfecKWibYSmD>meq@E&5fa7h>rhwu zodgdnXo)TI^%fo1iog z{6L5XD`y?{4V0I2VzV5DwNX+q$r9U!#M`I)@GOi#$SC&WMuCs`0AJdrGSb}w8L5{r zY#7Lv{%(iHrygQ~`HDgCr<@!vSeGb_I&5q*N&cT~$kC8t5 z@Twt|Z%z-{Fd&1h&FHNKC%L>KOBRy8d=`DhwZJhZG8CV#TSd?(8F+;iK4dU(Yp|6f zR9=m9Q%0vY{VA|eDvdhu(glqX%X3Y$Jle$S@rj->DPW`?Hfp6#-jyLUwCAKvDa2d}Jeyexq%J3v zdpd3gPL^5ZR~WH`_WG5Ys2@_T8PztN``8r7K)*|XU5ydSr9=gk32UAwoEDB;=SvDzjw}nES zYH(lmS4vcn2NLdamLwTS}z7OmCyBCn;S2Gg|F3GV@qW_80OgFL$KSCVAn%j zSo4UA6t)XmUcoKDv$R}SHE6df5OoM=^-^nsF2XBmgi?q-Z3a$Hz&!xjHzV%uG@e7MM;N*Zjiu9Fu#%aGiooK_;vehS&|~1 zn?cM{2g~XE!7TB4;FP&BO4a7I9HN32N#baCQ>2vujXTDb!94ftvO-KrRM&C!)2KQf zWK?`vx0?LUD_QECQNGo1NWvfZKr-+K``M72wI;|zAeoRZ%bRWExO_hyMvE|Gr(((x zCGJjmF5VMr@s+IR*NnaK{>;%^uk8~B*=@B9169>^JA}H9mpx`Mz#EMAqVCz^pL}l- zEYECrOvQ0R7iYOI8r%q4w4jJf$Ja(w%x=(Dy38-MdMTQuFa&F3E-GSEPFfTwg(*iN zCVc4@b;e+5F`F{KdiW~zIm+qoERL+W=kz*5%*$94YkURT6yG{Y|`Wy!f=Fzq=xELe71ZWix;rrmA%eR*9}oq4MWi{XuXq*uH)Q{^{3^ECh_A*WA=0< z-otLASjS(B;IVS5?59e%7e{NtHAT89N(|iOE=tg!ZOD`O9JhK}E7F?1iax?FRIR$9 z5x{C1L24?Af-PK8B@8R4=8VR#^|q{1;LFWHBvU#)tv;tquWHH?kHqnGL05$3WzkZ# zKwRv1l@a3J!TAKAH6hIP=mw~+t0JvWuxh8o*BDw&8!3Q{+?+fHxhj74ycI-_M)Tk< z4o1Pwrf;yIMlAMMVq(Kju~~Jl#P&SAjX?H_QS8WLm51_Cj76NZ8dBWV4fc~x{%DC} zg&lUAJ4~Fa&8B#9zFf2K_`;~ZPeDfD-ltF($>*vpJ=P+sTQiYsZcSeBY)UAqiez~l zcMc(4yLM*z)m%k@hXab<4lJ=V#R$Rf&#NEZ44udM*st?Fsa$eH21A?JUUV+9 zSSL|^4BOj?XFvGM4$W+`9%4s|E58S-VpXH&AYsDiC)Prii0qfi8hR}4OGFFFMR93K zh;7tbq027XGqI=fl_4@J(xjx1)n~+z|##2Hlb9#+MJKW8wpUI z=)u4yL&Ie6TFRdoveb+(mEHuEKLO4{3VoyO?p<*&W6ab;u<|rKY)EoGvHKv=x9(V;Z96Jtm^Gt zI?;(cDsO&BQ+l=Yn0f&pCRSgYkkMn*B`o4&C`B2}@j!A`(SNJztzr zdd?cK#i?Ifw&Yef7ry^uD@oUYtLbs-kk_AS5k(M(K)wGa5(yiZeUKUpY0@GWm!BdI z*_t76AYG{;>n5J(J>8j}SXLRv(|B^@0g#)9jZMa_dQ_?!D!YmCveU{b#B;HV%=A^_ zaG22}H<2H8!5i#a&`8QLzM}BAlB99Iz3mC-n6H7W=$F}lfkcaDLocbbNzE=hSK zXnR(>Ugaq&(NSq#V_BmCscHM8Qyx1eBf(6XXLki_t9))OS!&fGjki*{_l5)Z*lz%R zcGKQN-_h$DlCyVsYfL7uI-+}RSfhsNUo{dchTHEc23&AN6F`$i@;R14lCYfRg&+`z z&6{yw@UX{nEs7~J!lxNo-_+-`FEHbLCn$l~AUt}BuHq=WfN%wOmlLv2oUl)DWGq{4 zctBG5ik8(jmR(HPaCxn~Pq>=m2eC>OYuJ+vk z6;BQo@s5VicvrTH${zMpYlbv#2t_VtrfG>qEfmK6JrHBwBFG<6KOc909lISeeJnXzhUb?cMp3y7Z}zPKPQ(DF{a zr_(jnU!V?oDZ|H`PqseBIFfWz#{UZB$}Zq!*UzU;JWY|rn%1aC6{hoO-)&9piaJ=w zF6PlKGG09H)T<2n3gWxS$iYL;B}b+NenG&!Y+e0=o%39G2SOe5SC*dJ9Lt!t9(8cElhD)caZgKunab63uk;eaXMH<$opTsv?Jw$pRqc;r1UZowNpstJsJ+|d(uP@t$sU%FW94Gr%iSCF+A5}yP2uQV3Q2vX zHoc}BrQ6#Wb=kAA`>G`r>D7h@@^T{`ZwKL<6bRaHhtbapa;reI_ISpA}mW|CgtcLJbNk*xrxE8AoJu1UAHt(x` zm^nE`*f8wM*-CVY8PkJ~?;I0rc?Qhv(0BG279mb#I#J$A#c~zRniKH9%k3=-Pi7q{ z7J(>5M+5AYDP9}0)oOjiMAJfIHOodZBrQYOw}@=$ijv)Jen0j;VlX^!KlSQOIeCrz z`eFV;IGW~!my8A}s{(Em9C|D*ELDAc@|*g4>oIR?FUfkFyAJdgtao`x6uLuxpzIgj z9%SdWv`jRNS~-j`d$iCp0Utue4b;#Gsx`_Lb7svdYyFy=WyQ7NIYr^Qp_j2u2<>=u zQZq97*d(bWh1N#txj7@JnRzfuYE8UII@%E{Cfk@Esf1+hEyz4iWGnRUY%*#O$*I~? zD)&y|CL~SP(9=#-4PG2}6)`rvakX>j`1&ov(&kR$(b(NzsHny#e8t)Xj(2@|jB|H% zS5?R_dY8d)f;{&qjYEe!2gCKOEg>m-ig^J!13!_|hzXayJ+I9ofyoT;#AgWciP1ASMUehyV+=hFrV zC<NNu>kfkGBbdr zlK8Rw#YzaF@dyc{&#odC61l09jS-GAhl!c`qe-fiPWTxbep1U8Tir0mhj^L}YOR>W z2h?m-Fl9Sn`O^qy_cqH}^a09Vza$q1$$G*|p04j2(|R~1#-}1X5GfE7_T^JEu|$PzFKVPY;IPj)v(T*H zpJv+4JdoJQ-3KyPJ_cc4D%S38r@^304ydCM2C|szk3Ian?ZWNKrJzZ!XJOq-)OnXB zzO3m6hsUww56>sI-LYfV<1F}ts1S4Zn}^Sc9y8kVTvLc*0j0Nyb=o*}at$Z+@Tm}PD)(~6kvhzwndqwJpRKMgb4>iI!$WrRc!{^d*CuCdOK;MBJL(cSL{ z4)9;8lrD9rVE5STY(E0$@`(!NMTnAYC}kI&AoYf;O}BRHFdWT1NP1gvw4IqZ=##8= z8E>3{gWQkqS%y2a0PQ359tgRWyz8d^nx|6M>qhsj4qC+B4m~(Idc!Lh zuc52_Y8boD28dZo$UiAe4{Kb1*iXKYonl-U4$s2a7fo~9#12a9CtYcdlZhLB|uR&9@it$cK8ojDpWg z)#*>Pr|pi4?1a*Z9W6lip_8nWy(NV-PlBq_1L|A7MxGd z!Ln{4#VVE2FbuJdHkpxNfxhi}#rtJc@ZL%7b<9FS^9wc#E{sI9l|1qO^qDevH7Hy5 z8gW$lY8Kub+u%JFBmqOE4nB4T{${dP?W=7CI%(*&$ zHlQ(#(&hb)P`!UI=!RQ0NarW@-#m=Bzm$%m_vE-t#`}O zX_5kPIS`!6A8mjpEgc~>k%mev!`%qwvY)CDV3y~FVfu|B5b8{k62z%|i3Z@dr0r z?~o#uXpWhxK5|d)UNw5Nj-p)@Ecry~=oB2rHE~x%;*@s7O{(KAY1)Dlall6__i#fSe|8)*pD5TODj!mhwQq31K4i9NJ2JtypdY>F39Z_yQG(WatOUDW$i`_2h^EASo&UWeI*J#on-+(K`PCF5Y< zcgIMtNVmsseS^iEjgOg#|H9Bq+a-w4W+itk3qu(JI8$*z#gj-h7b!qO{3zC_0JJAz z4iPt^xEjRlG&*svv;KbXWXlv4^sThJx7#ALGvTL|t1+2gC{e`Y6V~~mp=(v%mAY>+ z{y_y6t3>$@sVQ#4CM-46MBD(-c%eKf0zxlgUn|P2I+`qeX6vL9a*x|BOFU4K@~HG7 z6KFer!uPXLkz%$~FH&aP56&5By*@DYy0%*Q+w2@?Bux#snwff>|L( zNP>i+)2sD?{GfIWT==Xdg~~K;NgaOtP}=hMvna~I<}YO@XwLg=)OnJRpGtj&Q0Bs- zJEGr@`;JwOo$nFtb_^e|?GC%D1X2bf;y%H(h+m29nSW6rSzz6xTall+cNFRG<}eOJ z&?nihu~d`F8ZV+_!q>A2M3?gjq2OiLYbZTw!Khdy=G}Mtwo(bXsvMy6U^BV!Q3gXw zH;|iGA9C&RLASq&K+_z!%Qfl1{K$6~X#5D5$Y7ZW2e5vD?+4RHGGgSKDHA#CKbu6u zkiRs=DdPO-pZW8g!j7nn{l4y;S7JeGE@?lBa7GyCgh`<#PW}9>Na8l$Emht3c&<(097T}b?wf}5^%V_2VS(s12_>D(~tG!w(p&;8zGsv_aFd_8t8 z!eMN)UG>`8MsiypJC25&x4<;;;iU1v&!=y|`82WF!mZ_jzmV#=7J-YY-=>y^*iu0$ z&2Dx|xDt^)qm(&;TK@&;!dfJH6{<}NK?uRo<*)S7-4lmS>5NJ${PY*~Ht|OeZa_{9jlz#`aoZU5! zA5?T3AqtFdfcNM8oLx6U)G~xyti2pawxGL|2&&-W0e0M)|IQSzT7)UofAojAE zx`M7%q8HFd2FXfaz%t-}sziC)3>j`R#1)ghz`@?59M==&mdloo1TApnx)wUl+$%6; zM7*BbYgdQp-gLxivo|>|oW^-RWjc3x?Vv3OB+>wdAqR@7u z)Rbq}P{-UY0wuc(b|x7o+qnZ_vYlRqyLyS#Sy^e}lxM>s;7w$>Ug_^DwK6-LZiz|p zvLHiN1?PIY77e@oNYoB&MF=GXa!ekGELAAYjc`CId|$&!Zh^VZRn8j~<_itStJMQ4 zr)GB+=zMTkMjOJpZO?89sSsofV$z?gzb3y3l52$z)x%iDE>cdsnr7*V%8mdn3z^Yb zkc5QKgCx*ib%(qi!FpxFSp@MZK~D>0gxv+{*J9@F^{DbzQkMy-V2Gz? zH$3XqYQeAzeBOMITypHzL~vBKv@f_c&_#{AjnhI7LP@B%{q*)leT7S?)Se)ZQ8B|? z(Iz&>nshJg%hi>y4uAvz#({q#iTwaqh$c23rz=!Z?OTtLgcc^;aiVT^JUU#Ho_B3Dl(lyAj#~t}=;v7!q#G-bH*} zQHb4-6+#`%KQXcH*0BYv9|LmiS!6zSmecizB7seQ?42zWRh{wF~bXdh4vPkXp8TEG-qD@lpyAD&6?yoiJDW{ero~ql*=OkDIVh zIy&8sL|0Pe&7uW{+jrb8E1I4?`;YGw4CO)viqzgb(_QJ1pIg*cAQ?s49A05<((vb48*tQXthI$n! zLP@c3iDeb5Ju(_Prkd~uoP_~B%J3pSaKTc z;k*(#5)j#795y0W`~aU;6xIgkqC|$o+hwKc3dhN)t5aNpmyeV3QuL8ec3f0uaKTv8l4`cCnmnv(J5UU6^J(=&BQ#tCj`BxO zlP%!Fn}1`FwH>+Q9XO*R`{Lj|aclW%;!`puCKq=}HF;)8hA%7JY|Ud*#ETl$j6c5_ zlA)N7+7`y0AG$8)*atd9VF=IQ4)FKbg2kQ(q5H($L1{7bTMQKCYEIbqFn@D){JDnr zk?|JKPv>rDHV#=6v_&xx(qbF$fPc$oe=^DZumX}?Kn@Ifgx}XX6g2FS0Y3>fP6M_POaf)z&>WPjUTrTHw+5?)8}kU z1Lib8wKp7dC{{VbL;npXC`$%5MA2=VFiPe9YGW_!Dbhsujh?|6ak7SdATN~`(nKA} z@mhKYbod}{j460@8*>1D9aTM&_J{*2(gU8uB;1kya>rit&E8%A4IS_P#T}Y!eq_Q& z(gUQ-i0F;HHN`3tjH;LsWK53?vLW29efIgjkUa8Q20?@jJ#?e><`@`5Oi4ZgpTM>1g*nLI z2*zN_>nI-Ogfxg#X!Cwc8O>UisZO;WmB#?`#XJi)&Z*`i)&^#wOq8q5o#^er>(aXy zzPTw=r0?rKY0FA_qmq}gzH&a8-T2k=3&T82R1%s8B2lA1NlnlE2zn_uGZPf9cJ6)j_@uLXdoUBpgxXWq7gSz@cZLOI_6kLFPdVxb%J+Tv4f7Z91MhCYe+&$_Dc-p^Z z<#^-BR79{VuMQ)XCctoPt;5HjoVl^A--1wAFeBV=7jBI%4!Q-q4R%jIJ2Y5{-Ah9< zL92fx-18^e_q{HOKJe@jZN~(g{6Q$Dt#o&}3DQKfaZD*{aJB@WF#l~ztbk?MM9^1d zwSb7HFmMes@_6cw+V_Gnb!c>f6O8nN3?Fq&thY|^w-+WCc>~8zg19QWS$T-q06FvF z$~Q|-Rv+ehn5YiYgbLmEJ8{ju!a(uKMF;-|4wc*I*W$QHd^2cJYF_$ZL88YvHBaU& zfX)&sL2+jEb?E46f96gmV0d^ClA@M_!CbodN&_)(>FhfAns0mFe*3K@%)A@sabo~= zQ%It-k0^4BGxZd>bpXlYqi&ecRVi`XR?N8Sd?K&AUB_O%+yyr_Q|fL$ z*j-%+>>DVIzv7i$s7Rl^zl(RVcHwYATbs08`g_!sW`hIkVv!HktiP~2f--9q8v<;_$35`9hQ{=?@9XU&}Qe|=PJw=Z%m@2bvs~^R2+9;P&0Ot15fkg@$Ny4eXe~zfbsgQcdS~3TYLDWS{Vx9Z?(i zJ)sOO*EdgS;U(GjS%z{I_;@Xf?G;_B!{ z@?4YLqtcy4eH%7&reU^}MW2RGfIWVM=w_V9yP8pii(9&cV1qs#jFWFyc9gEm zCcOR_c7Lhf%>tRCRe_Ji_L>SP3Q??82el(8pqKHhNZ{=wGmf}Z%z;K4 zgjdXLjU)E_Dw;j+n2N5C+7uspbBNF~et!r)5LiBteH01^co7dOue#$FOe!VPZSuP- z_gV;&r!n**J|i<;z;c%44_=7IbVEZKD|5l|+o{QJLtIY$n9X?DMNM9cCatqzbib9MyPrd0nDDDRNt{<^d=HW(XB1-!v4ZL93sbRQ- zDXZ9;b`%0l4Q=@wYbLHW*%m5{JZ?yL9Avm5j?b=c_bkH#CIgW^{ZbUbqOv3y_DA;$ zm#zn+Oi-CmGI!lHOZ1V7%MFoTz?!BD>J;H>pFLV2l)6yfpPAh7iFn=8yk1&p;rWH= z5-Nk3oBFhgX7>0GimdEIJId>DjATPcJT`OQVA!uDuuM=xDpNlpb<~hwSWb=%MV6n% zJ#b7&sg0~3JXtk4U;(mAZ^@N03I=G>Ga*$%qkpg`<{ObIxG-g!@Z=hKb5d@9J!x_^ zfmJymUA$A74g5GQ9`(XLlWFL{vi1V$sK>m}01N6$jn?bz36G`d9#G82t1`ZsUD$OguTq~ER7)KVDHB0&>K12*9>L3`as2K z34UPIDbd5|_%Vk2hTsC&Q8P^elQk1Qk&Jj7`gD$IgKBwI&cVF=%kr3xb|2?XY~m!- zkTx}*h77G-LlYvuGx5Q|1UMGlEshsBv6a+X*4iL^mV|#l*@ktDnamir288HLN7`>z zn8g6CYQIW1lplNqhHZ2?7&Wm1y(`tm($-7et*GnHX@gjKffSHTJ?;7wsS=A_398*t z>|K!}K63&$c#mZzg-k$9Kv$yg|cl9v+Q-f4|%s>1Nh*>s;*TW4v<04D#V!mL+(_c)DR7 z|C@J)(UIFclK>^bm7RQQDY=WkiElJY;V@k8LW%rGv^GI(}qHgF_Kf@OU z0+a<%@pAkwYz_S{O~o1O&qA+; zymX~g#(=G>eJj|oz2J{dSW>JS7RZByQ`)CS&_yQ(?`^~vDsd$|Z|Mb1v)CEMHm70L zbi4B&4pO|V{CJaoWrtHkwh>cf3Au(Cbl=%pEsp4e1e5`#VeOw`RnEAee$b2C%yUicrDxu2QZLN=65=c~sGFZXK1^hh4~^KG46 zZjS-4v!kjqz4Qzvy2)J@qC9?N=uH85Wjr!n2Y;EtTA`V{c?e`>VbG7$56W76uJQ6A z608BJ<;8Vsw(Ccd6@nkZes09tCj*w#9(JTU5jyT+sTZZ~u={hHDP{O(mL<&1eKr_4hJ@Kap3 z0)lqmbAQ*i6HOqE{S@a7Q*aDYI``9uzpWUmoLj`%^}qT%h08Uy7U<;}&7`4BPtDmI z+H!z&MpBvEVr#4ee#C_=%yGN%l8$$`fVgY%MssTSeheVmQcsI}oeHQRK4O;iwRXf9 zE!~GZ*|;Jq1+NA(e9zcv(dn3*WaZoKhJE_<+zG5gVi zLS!BXv;c4ArJiXGoxEGu5RHa`AE0q0Mi1BgqFMaK^KG zFzAU?md59NjHc9$B{pt5U5jk>-&<&d+1d?CJehdAJ$?6%JN_A@v~csa8$@>#_LAuO zo-XB~ra>Uc+yRE@&;e}{*j5R_eoMC@M*vd}sB4=ZWBVZCa-lTAHNES%;6#LVIRxVR z^t7=bz59xkit}Qi3u4Dx2CoXL(Z8SmK^MjhfW|m$Hy*Ep+=UC4Rja4JP{HLLLpX1} zegsEj$j?`&tPzg?8%;@81D`n^=-W%7sZkMk27&dpATG?WOX4=1E-wI2T1)Y_uld{^ z5D9{%UND6UeA2((=Nf;xFg{&U)#&f#igs!VlN}pQSPb&o9rhcbRYI;3EMdhS76$hr z5I>c%s3mE6$s}up?2SFFWlKfDTSXCwF6Lv^k+JTM?Dm^the_B|}v9u5}=OoQL2Hk;+kO$W(MH25Ywa0bxy& zysY;o8c*5MF&o8O(@rx0V-62#D*9ujzwn1S=+#BKYQ0`Tf&xsvns?6h1P zc!{lmQxBH6G+2-JX=Y53roZ-JU1G54v#&zVj6KVgC@^q@H9ubnu}PU)0^1k3LROR`r_zR+au{FS@S2i?KUIO8*T90l9zEH|n7kzQ(1 zer>9<5vH$avNHQX@#oYU_WQBSa^o=!x5f*6SF_2#x^i7Bb=K+c!8Z-X7XTrSHqXS5dBsT+@#||EB$9D?6N7QKj z>A*AxRM>?mbR5A|(a820qLZ$@Sm5(_M^IiH&pvM_M4Jp9CXE^sIuO@)h>?rG{2lse z;nNngSe~0k7<`0!8RvzWy4$^5d?QBOHQbxaHCV3{m{cfY3kF{g}q#x;r;f&Y;?R^nf{IASpksfdAvM;@2XIo8j)7%bkJeKwXBo;i zJ<|FEe=K9)8^1B8hDPyV-ZUe_-(I+@zk$zY22uG!n!RE7d4qATCWM1Ab#kM}rcp{s zk~D;(;|b2L$*~8hvI`79J~0SMKYsY&eZ28XZ0Sjzs#E$#_)@NYSe2}X5W53AUA|>Z zB?{Yy>w^dR(xH(P3O;cLPB1`I?yg4}J2ODsy``mX@LYZ09IoRHrlpKZT_qrnzLQHa z;-oQw|8*d7wF#oLz@wqnL1J>`vBQ9OIbLUT*o@o8R=J?{xQ+jlTTkfa6Cz9%RB_Q8 z7*=WS+)oES-jvkV%o*BTlEMqSvelTc7D+`Hh!54@THXU1D*yfT5?F}9isy!j8?qD& z`N}or0+zctHR?&X%QHm?rRjElrCPa4ktYHV9f)ZEayMAHk9?6GD6fON8F-Oth&mV! zT==8m=je`*rW``C5kuBuQ$Wm{@&@ql$Zev19>)iSUQ;~?J#-#*A?F+$vhj_k?&^qp zAfe2$AU+Pl3)l9SVU7K)BJs*8c2-Gi{BP8Z5Pe;Wr;F?Ee~*;!QutbCu38m&kp-= z6F5P1`MwOE~owH zWDHO3FH$_+4veEcZlKFrChQbH*oQ~(XdCVoj_bQBNY{o)iYM+l?#{1Xv~>^$#mi&a z3xfxSOMZUb;r7-5J@r5`zUQ(CdQLaePK7Eaq(O5n&yy;^MF;z?u(d^>^5qjqXzP}0Z?~10J!)6!DnYt$%+COGuYz?8VBI|G<&AH}9 z69GkrnQA1ADox0zhJ6H+mZfy=QMdr3_YbX0xT6#E0k%H*yb%MZ#~&boYp_I7JjBZ= zVI;XQWqju)Fi}rMF(LIU@b@++UpLcP;ZzgLVt5GSk>klE(h>fd9wLw!_J zzU;v1V*6#V?fcQ@#Ifzh!{d7wd{a9V007VRpSS>{k5h%+axjJE*Si`C7xwg5E1g~` z4WB%%v9DOmWF$O-LvEBZRpz$GFM4D`S{63z5}UCxbp1UY{%(h;j!ptyhC51man)I? zEx-FfEyq}brZcR13(AdmF-rcDm%et>SMlR&v~gUBZ^5}%83pHUI zg}gxfU4YfTzgW_ruS&I8;%ORd%W`6~4Q3`h1k=az12a`LMDRKi+?}`$s z`bhqg`e_XfNUQY0GyhTY{JkI+e;YO(a0LqC*kqG6@ILZLVcxr)yYrseVxFNWLP^R7 z`dwsX+baloQCKq^cHSu{@K{lVGUg6Mvb;82dd2AF*sIu0=x3 zsNWxD)MhLv>36L9ryCB0?1?6yk5ovAcv&X^>eV@dqB_DHx095}o?JoueR*7$Cn0f1 z2*?Mk*#(k1-ltT0^T-Q%tOh{~W<_<)6%}dP(ugB$WA0$($Nou#`D3TuAH*cHt67;p~xMzk1*pRO!d# ztMm3ss0}5vXu!hNi#YLmk2~kI4>I;7!(5j?>0Qm7?l=Gyp^6%Xeff>7eqFKQ=!u)` zo482uLd*Xk-=GAnAf-;f!&erAcIP})m9(aI9R$E}f;A&fcdfR*$(I_-ib3pz`{yi; z6F0~XJL!cSS%c3YGCRbo{g4{GkQ&;7cEl+1jx@juhrqDXYzVM|>^w$z1~KW+`Yqgv z&zm*~vOZI?r}_9JI#4e$lYlobFT?A*^)Oi5U1IZ0jG)B84g$|IO^tu1m&Jf5e`2uf zzPK`as#^bq za7O*I);g-4=@EgX4e(Y+hnB}hq+$>g(zA{c>&hh7swEEzYjp^}$^lyR0g%lD{nQO8 z=N+GY>o!Rn^L6@ZOK=pF%Xcb*COuCGJ2zR2$Z|$8G!KmRxVv#ca)u=ESB!GO%~*b# z=1^QQdm3|pq9lsf244r;kH75GyBwl6uIWWc5tQK@LT{aBZG@xbf#FWhygo0jyZOiliHOsMyPSH^e?3qp0m}4!A)f`A}UvdOT> z3Jd*>#Hr{Zol7zUe&{$wnW1Dpn^b1rrs>+6E_ej0hi}sR@?16HCZU?(xD4Av(xmAJ zQ<-}+R>n&;14_C>^E9QqHLWz#gf9O`HH8TvuwUTPg8T)96tgqp)ed^CC0m$td#|;+K>+m9dcfh!#TZGhXH#KQGD_ zhx}DuH&+;^cG&ZdxwD}SuGa$|1+Hyq^`vq{0*M>yM2B^;*Lbf7MU>JWVOyeJk69d5 z82QM4bi^|iA|jZwy1jZHw!>hSWy8Vx!-erOm~N6qT8!`>9o4TQO8qV)9l&kO8o!+kxX*l$oD)`z$HLPdxwvHO~;jy?paZss}L zj`3x#3x)YVraP@5S)kna4V_RrBF#Hy8xFlRaymO)5B-XXa$NUwR3?d<)#f9xjK^V# z`VbQc1@~UvA5rp7&@VQ@l1U`n=fF~gRgEUf|og?+io z3_M{Y-;r2wgd64vFF379C=P8COdDK)1q)!gnOG+WioK~>8rkH}bIkm#j9M$yUFzL% z6W2kJ(jYTLNNAX}UzrA(IX@}` zQT-NQnXw7|=Zx)ll#ueZE9i5_K_0@`VA48K;>rsHHJ&hmJUJPqwXv|x44Pa#}7B!WR(qWe5>Xq{D{%>@=JjW z$7Wp%xhPo5A}Yeu9KEOaz5yRR!RPWz9Ps2L8}CsheD@*jq^_$+aEA2yAf{1l7*V@x zKOTRviG`{ayfOH;lI>2jN;CmjtiqTjvgldk-r{Ry^2-N7MK$G0OzHDD7%{u(fR!7G zG0>49&eF#}{@s{THfdfi%V<-e+RUjYywJ^Za(-ojzGh2eWc)_OTs-o%1C61t-XkJm zn8RbOByWBoo4D#LtodwcivLDNt91~&Z}7d6pfunwtucP^H?M7Yo3z@Q9mMWeg=kgD z-ivRQs)YONXRZU`pY-yJkdnt{N|Q-RZXsAv_fs`jYj{IO$1zo{RV9hRS$q5nM2}%g zAg!4OWNEnGR+JkQs_7pKOv~I zX^76htEHM$xsgRQR`Q0lSySHLNKZ|lWMggjGr2HEx&}0qQNm@q0d71JVokm??dNvJ zNpl@o7SITWBld$lZkM?U<@Cq(*=Sy9{ze%V>D`O+!gyk;$#yMm}suKQf$(K5U(qV@B2fce&2E3 zlF^*_#gaE3@qAa8JHVC+Ypz>BV+DQm7{IoF!3izsO=4a}c-8gixA=_F|?`DQ8e%@&b zo;tace8rg`|NbnKI`wp;1U!vFQwU{tK19awDJ+qhkKSY8VV3;9}DV&M9%Hbt+Cp`8)RG#iI6 z$RgQp`=lH$Dab8+p+4NomNOK>g^jT|0Ax<(%KtuJ;{X6DZ;4a*;b&>fD`V!^sef7HglVq}Cn z3kX(hg4pv9yi)TYC0trUZy;>FMmX1aQ5o(mJ$nsLx@~wyvDK8$?ve?r@}Xg>n8rkR zMzZ9lp{7=?gGML^lV{Ma@B%_Ue}q!4x7=x+V;@>4To_zPt9DVWi zyZXufHvC1~K&5TSAvA zagHSE(!WQ9;AbP3ueXL4U;MOxjV)zL_d{Q9OmM{+@O!ppqNg$ zgB?@hAB1Ay7ZUxqZFjZmCq^)pUteIMA)^Qf*#~9Y#<rrNdj)nTbjf0lXTDnf(ZMnGX%&plhd;uCmB85hi)zjl zBSICZJ0~-Pf)rohPtyi^a}R>}0rlW=^u`tx`BbGoub|1<+Q3#R0d(Ps!nETbXseit zps;&_ZlKgOIUrm4;gA?FPeygpbs+snRe@hGv`*yUCw@E?8bS)696XI+v8oW-ID7;J z8T2nhmis38WjqOx8vXoX1{02I_ZP&xP!^MtI_PfEJ-XOi=&k90)qO9_X<~+MvG!Ul zS9(@N>bxaC(cF^rB8L?jQZmg6qV?s-yd7Q$;M96palXYqEsHryZOnLUh?qsR_olxrU4?GcbF4XnGUw|3<`0|3^D9#b#kk%Yi~Z)(btY8CGWLG{eYN{NSEKXN*3PME;afVYvt)vBw27BE#X4%a z`$^`=q#Ck2Q}aNx?NCpOnmX(`^6-fcsi)&9(1s?#NXkPw=m;}UYot_{1M+0&gk6fn zI99y)J_>xd&kbL#TXg_+&48-fpeRm;z4WFfDoUn8T(o&TEgL<6B9<(-6hT*VVgqw_ zGKkdn?GY{}#bP-Y_xE_g@7TcCMjIaNm{Upx50*AO6N-h5*>^ZIOkA{$Ke|rGrUW9( za)_($Gu}=^@H;f?5{Md)-@WGjRIc}=j6HObbP$Dn8US`&`_(L3n7rjy%S zqIV-xTbpvto3=Fn8bds?9BI~OuE>^cJ8+%gQ0`+t3nSIz=BNxP#pzfV zx(NNoMrcfYnSyJ&-Z{gAmrMORUiuN+ob_u{smgX$UVjWL5}}kF)aO3_T|+-lZh@>V zTjm%U+6&7a-dU;9aw%#0TOSmOl2C4GAl*PY4?9m7kMW}sP!;a6@#fL{rd$6IInr>w zL^b3n!9)nvs$AE))Gn1GmrVpFIG>ge_dd%(ln?%rPjq>j6RXRksc`h|Xz`~^xWG{ngu;1NXCKG%>yrIXyOk$7|x5jw!3-LFlo9rRoFM$ zoAYWM2c@r>Cku9G-0*INp;hQoGp@Dh@tp3aB(FR7ax=NNYJ+u3&b51HMfL9!!tS9J zRXu8b3CL|32pV zJ&95gMjo8H?^ufKFNzdpjnOEAJ6ltch1>O>#S9wXk;;|PbI4oPzJP2Kf$FM9usRL+1XHlAjHFr3un{<5g9>YPoux$Jd^1fo(7q8${kKCmqFw2ZV_u9 zt!@7%E4eG=TA&Oot26hbtq;wKfInHR6zXZ9+)JZy(>@)WIae7rlAq6R%2@6R6dl8s z5_t%<0H~JZq$G>s{uOXZRb)qv2|kWAWh@HTa+_~(=y`#J9!zmyDxe-MkuG*~j}F4t zzMEcxdjP@W4CA$8N1=?Gi+|ofn#mVR{r zp4)q}Sbw+D@VKz;5?VHd^0Do;9X7XL6cmRF!JojIxG@+lqO+V@%HmBVFfO=x0Gfc% z8o5YG=)SnCZ2wHlgz^M?U-OMTPY;qySE$&)CNJ4+XN1oA*L2e4t4Gd_W0B1LE_>>C zWmEllYpwZojZK;(*LHR(hl~3>K}3y*yK!{l$)WYReILWg^D6S6nlc1;KQ!iC)D0J| z{4i!EgR#iakVOkD6uY`m|01w!Ijuq||IgFq9KXvwfSQ7^=}M zO`rgqC#K$DzlJzM)a1_|hMr;@`bKe7Z!K(_7TN3%_>sHuE5lnR8v9tI2o|a%CXB`c z4CvL>GU*;w0WeMZxR){>V$L;^Si84rp;|s`cHVKF_7T-@`Lhdh_6J0{&*wQ5xDBPc z0|d8AOiL(V+l5sli{_Ou#O0$F_r(z@x%=FQp6A}G!-*WWKs?8Yf4yO(h&UVMP0(Nw zCn4mGWxwB=eD4-m4pVsG1<@jC@636-%g;~rU&_OVfW=u8IHodl2>jd?oCLWfhyMgNU6 z1O+n}?`4O}*<-|VP(s5cj>uDMDY!Z*UZv$L5JX@`&#w|6q<@8>D!r<&u?VVt1?V-N z40IL*kR>*>8Q2!H86W+1A^iq<#cT4N+n(QtKFUwWG-Y1+8|I)|?ndXu0W$tiS2LFk zm|dqE=0342&cSew&Jc}7*6*9`)eFrs9+WAT(DxbRryJR9<+6c;veIuu(=td)l3Dj) zp(DPQfH#UN-lSf!q~!Bp$z5Ql`BFP>2es$JG!e!OAD)vXCyzmSSaC(T?Js+oWCAJI zk{a0ZW;uQDZy}4iv4D2CoPcPU2oyXi$ykct0j(f<=rN3;a5?9{%;QycG|P-2qNdR~ z+o*?(qo`kv;H1o%@)I7|;us30g&Flp+SeD?T4AUNG$f%(aV*%ue<)ZV_>OImBHB!L ziS~dJw2s~@>BE?363r8#QtvHs2ZzLc!#gtr>Bb*s3Us{%;ugc@Xu%UrF`=AKV;pSE zaeMN65xFwwVrebK%lE)Q>{9oU+?T?vffCZnSCz$+zJ<^ilHPjgRjQA8QBo4zYsmLk zwiy*HoR`ImOM~)in}MV?g%e~dhbWGl5}Hn}h@c0HrDxR3PU2)fr>a-(!HJ-*eoxFi zP*zDuo&}wxeCW$}V0!?zZmJ%O3&t|sU1_ivE=cY$qoH+Q*MqhYMU#+nwf5MJX5ptY zEHU%`a!FnCZUjmECj6>5-QzCZN@7i+jF zxmMz?MUWv>KI2J|)f{b-taC*z?Ojtk0z!L1f^LgoUs!#bG=I+%n#xV?y7fTLeNWhg zb*i-ya!A@z1giw_ohc6;U z`&5QZ(QIFua_hT>)q>|ZuY$gtAJN!x^H*NbpHe_t*xJ0|Pqsy&;|h^Oq9?VmsbQ@! z6VO9TiWZ@Md44=+qprCBC-1o{h*EOi>i2+naVHy40^$T|ZFlRSzi-kIc34RoRRr(h3d%W zf!I^%BUmRV+fH7rMt0c&AF+qoM1A7aq5(NPHMcHlkgHSNKA}b04J1;7`&71p%Q;vr z5W;3m>dt%W-Hba=qO^E)A07b~b;5S;I$>;)70h7tKC$y!Q-yuUoo2*0VivNKfj{swv3>P&GV20 ze@iHMU1-rhPre*+{$ytvN4Lk9*qyG__xd3^*eU54?QLA7$Z0MFgHg#gbw$E`%(F>ZVjzg}m*AH#ZuqEIt;V1zW-o4F0%GC@Dp_I)CL+5M&v@=8NF6gtZPy_h z?!6U|bl<9eE@f@xC$&--#Aq~)sFcp(&*h46^}k$v?fqMcoL1Vu+V`x+MgP7(8C+E4 zzoiHg!#n!eo3}Y$oHji#Zsiy?A67HqE(bShP#U>S3F;I=@bYG*KZn15KDS}~#M~{v z_+C;{Gyve2HZ%Yc1oU5&D$lPP(wF>?jfk&|0s{75ws5|XV*l8U`^vcgmeamus(c(^#940pR&Pd3>3sW0SdtJbrsG(#`FHI!_344lK0;GGZ{~t2K|B(OV zIso9GkoAC7s4ootfBb`gP(}Z{UTpX>{-3?r@g@JyUi<>o|EukRuj8Qqmh1nyQD5ml z`{qB(uRFX75CH(c@JNslz%Nb`G&B$f4hU@fh=h(5 z508qInvRK?jg5_vlADiOsJeK|TingkO&U#Mi_8&-4861Of^M4)Mi!f`)h_hvkij8{nITbxl%Nb9 zP)S()foQ_<`M-OiNm-Sz(2X3YVKB(pw#l#maqVB8{a}b7xDwoUUG_>b7cMg1b9E&+!|AP;30IMt4$=Gy_m?pq|r=Mko4dx=opxj*6=zy z=^|&A1&&6#6~T+h)zy1t&V|f_df4&bk@+GiGa*u5?NnLh!2OQn@)~O-bC&DypX6Ut z6K&3jkd(I-32;hShAf?B#|*Hy?SD2WN}-&Mpi6Vip7s7Vb77Wod=Hy9D}7U|oCj$} z=jA+Fes68VDn4sQoIPGWkhY_VOGyR*68X;(1if2lHeE9;{YhOZJ^chMmK_8LpzEw2 z&y0(T8>~Tc<7!9kKJV1;J1p$Vmj7DSsidZF&tXk1dweqXBSDBV+2Kudz5INo4 z$z)w{CnT)%TQV5l@%V(b_YV*Dsiz!lc3eaOg?V}#ET5C@Vw&hjsqbT8zw7#mqPAn@ zLl1o6pK^A^ujz0q4JmFOO|knfz>#B9{TG|jk1>5Qjaz0ZoA~iW8BvK$+JEfDcKPV1 zhw9`wep^t}F0jpP$1i(gmD8qeW#BcmvA^nD#5g_x=w_1bVUQihe0NkRtL)?-df4#- zLR^Pen<4dMuYqQ-iu*2)PD*cGTvRjEY~1S!W4rFSZY&+~+p_lDRj7SXbcK$_to`yp zAPbkc;&22CsJuihu%oGlBzWdTDep?nk+v{Gu3G!17ezzH=RS$gl-ZXE!CUK;GMKjLj6)w}(2W!xEiHsZ8qI89(E+ z{Kahb{(w+;w8f|y}GBKb`68fD$W6gE<0POgN zAk^QF#rjX)JX={|bTyF&(k_5wMqa|(YxjzO`K*BupFAa=Kik}5Iwff=H7)@JfZl@_ zr#|O0+(|QUdUlR48BOJMyQ!akauq4=7v^F#T@dnTyoibqn)G*X>57KdanmKu-|I4n zBGlQpT{%*^AitcVlw z9tLY=pIW5hnr#I}A!+B6Vx#L;_KsnUyr?#skX}~vHykRC`i)I?3YCjXdy?S@}RITxCQp+Fyfgg`L3r9s^7CmU#mv%svu($DAff$dI5p=)uDa07OO>( z>Wv9E#+>P3C2y5pLfooEOjt(lfB8HSBxKZpM)A51e-gM})b67aG}eY)?6{>0ZASWk ze*zFTb~3d+`CMTCh%8o4~++WFmVKK&4*AoQQ#*Ynl82nvGG&8fDC=iZXW{cit`Gt0?!V#&dFW6j)CWyI$|`bcu-@Kx*os#VM) zN?YOofv)1K%+((mPX2=B_WZwW!~(Jf>i7STSpGE<`~Uoi<-uVGR^(0OHt#89+!yKX zG!VqosHiVKO06TP#EtMOUenjx$2s>Ze%aUSzM9%N>Y*G1>-N#o5j}s2GmOqeT=-qg z-FHC7-M1;_W-TBgx+qpjFCt!CAfy!$$Fl4Pg|jk@kx zY#{RIZ>J{lu|g*j3pqjNHJ)LPKdDa~HY0wMDCM}9R)fCI(X6RV?Ut9saoWfLZjY7A z|MLB+%ULd8qyeF*9)Trx+9*=AhdNan>X|z!#ltC+sHN3WEW**vY@dr4yywk%=%1n4@$Zl4|yoMrh*hxE&GD>eru%?iaO=6zl;$+8=EQS|>m$I+w zJyn2h%A-G)E^fcehl*c*;u%yvQVA=DIM>)u0vU99=%SuY)RW1iB5P*BllqI?)%e$& zvunnn@a!C z+Hopk6b|S6&T6o6@beRUY_(ZGW2ya!WzsjGKR`~ENboWY7b-$h7_2btiM>jUq!!iiM=z&`7(>b(cv?}5m5pI;hq8Dr zoFlBUI=q8tnf#tX6+J8A(o&Zn#nQz62_VUy)rwG3aQt5YkU($0;^{ilNaR|hMLzhLLA@>4k^0@&V6oY zR}8aA2p9x01b#I$UtLJJd#TtS#zKFsRXFQOy9S+zZ@D_V1CU5Q)bTWjgCl-*Szp$l zoD9*_XttM9p%`<)$gMHreP0}E6aIC9y!NAc9q7;-X8!>EB-**_s89KdL*iXqAMy~N z{`#yjE=3`Hni@pAn_uve>ZkrH=8ZcN@7(J^^{Euq!wRtEb4V?gu(`S+ zQ_V~bO1A4y5Dd}+H8n$8fK6yg85kh_D_vk(W!0#b)z{jD!Kf~wpiB90V+*1DB0MXI>fx*V(?7rl;UJ8|z_W}TznSxB-l z+@q)!eCzgXybhf{TG-OHCBKZQUW3xIty-lxb0}zQ6g~@ES>p~<2flcxn;27+1MxLG z+eXX|G3`g$qXU71UQ4d;er9TtDNm;tjGJ<~J({`gS4q4`@=;uO;+J0W4E`LMU5?<* zfgks)E^mq!(!kN3GHkHxykfeeh^a}Xeq=k?%o-t_NK7HmU6{pk+P;r&jKV+NxaxCYxFp?PJvA=YiGmS2*;ljT7$SO?5|W z9N^PDsLAMSl2u~NXJ@g>nBPBi{#1fFJ0pHo)_F;cZ9knTg+IFAooCLB+Gi{xk(Y#T z%7ubrND)8%@@uYGll!Ohr-)FWxPLla!DEp79mzaHC;jqi;?CLfpfb>cMX<^HuO zjR#1-T2~HImxa75bFLYe%}6AV8&*St-%9Fqy#jaDTE}11FCmsKt7k7PnC>!o^sK9Q zHuEgdsYwvz5PDX%_PKYeDy`C^g*gXq2sK>V0*l(`Y#0S-dc03NTC*?}OGJmT<@3x)YgOKCDv2MC;U;F4&#*K79%BTJIE1;g% z>Q&tmu1BKODQBs4C_e?GQP{=)#JN4=AMi0x{=vBa0G^Q#_#JM2iukC=+It)da@gOV zcMd+3^$t@SJqm1r=Ecu#)n$A+bO+u;`PRf*b@+8~;~?i4AK_gsoEK6-mQYHJoKa>z zQv%n*QC(Rbl9jj$I{n<$2JpSoNKu(`4mbw8i+JUc_DA=<1zt@y<%V`2%8f&m^Z5KN za#SBPp5tk*!@>5y*}u7$c1!OE9CRPyTHo2zC*A}T?N5%u&vR1KV>rJWcv@{{`W9IT zRor-7=QW*Y;K|{OVROL8-LFuOOfS@$vYJAUtZG|P(T>NN4+qG4yJP839ttG#@A_A$ z4K5MXwLEFi4$b+}bx>II5BNeC`|pp!o;(nnzVqYjUY+(BKe~T9QDp%B57v)thhxo$ zf#T!lfBWjRbiWNImv!gFq4>cM&OVjheU=aT<|%&72>$?P)G6A`IWSZ}O&lmRvFOe7b1s>TB#xaX^x-RdS4}6ctnIgL(QbuvZ zbD!s1ow&F53Z0Gc*tX?RMUOz5I894=1^*J>C;JJG9!Qg&UA(kAK3mB+)e( zWK=eCg5P)L>p+=Xe>AzlqI-Gmq}e=88+F4B8jK!kG$KrZ)gWQEpy!%lIHrb)nek06 zQD-8PaTPs6#JkNnK58t|gT*!$CEc1$-1Vk({+*Bc70RZDSOQ%BRq7rp zv-7Q)fXOTR_N*I8bX{J~I7*E+=>h%Y5>fuXm8@0Pk5NKHpqZmq0=} zE%}P{O(Rv(8r%CLQbi$2kI!6fVYuLf^fgvXiysf_4H8?!duck2#jsfjEDqCJa=zt# zVjswk9drn@_mAgNu7hrv$Ulo$S9fuw+XQHg?#;kHKr7kf)g5StT>ZdeUUqL@Q1@CTA+?{gie~ z;)_j%83`WARIc@_Y2;FXfI0%T&U22Gywmp5Z*o;;o{1eI>+m9gQIF9@T(j|y*xVS> zO~2j1u0K3tm2*=mIV(4y{;=Oe(MQCX0^zjzOM34BR7c`RKP`tI?_3hAJ75f+!ko~^ zga$&S^vJ9g2ybG2tc_m~_?>K)$jw@@ zycV59^RFnE|ibCN7{WC^ri&x%LTNiCsdL=@cVfb^_B=G-xygD zx`H}Y31luo2z~gbt4aOS`BD+kEY@x^sGk1-B}W46k=h7M(GFY{&f3e0Nh3K3ed^pg zjm5mBqm1Fc@IA#Q*`=e)zNUoDZ#A)hD5_@x!gr|cWG`K3DlWqEgiX7 zk2^8Y)NyJP+sb5$CIOG{BO~QuS7SStZLU7YIZc^}^YadBX*GLgY^t37D>CBs<&oJf znN**Yb=y@XS!8VaY(ENXVy9&N-HnIUZKN9t9CkjG*rr#;zz?-!EEE3#&ofpcis4Q| zkVi^s5Nt&=ZwglcoD7QAvzBPffVjZPQaaWOHNgrQG6(ak$#HaJK+0Lv@Z|G~Z6RHn zvChpno-iZl81${Ebw?*_FU$vA^{!D~<)$)Y1oa)N)L&`Bf_ii{4k_-3cXOm|P)NHT zF`r!0!zSa$ddNkU+jC;CLXI&>M%p3V)Q(-PgI5)|4Axq!wkrGqg7aMUptl@ZH5A{Q zH0tIpFrtbm7*RzO08vbL3rXgRe5_X_rZlRgf@(LIRe2eDgIdCs_a(@ysLjC{%~eK{ zJ7#6wz{v+^HD6YjY)}5}dEM@}ePwjf!6*nh`IH*ywX_SKk!`KnTn5`K2U1nhl`;)W z{i9^~Uo~)f0LHx6jNRQycX0F05W5_mtAY7c86)nTeJHnKT=sT*SNqeWAmUC5H08OtT;h2^_H+I;Y6+guUI`;)V*`%k%OH>Os*{D9 z%0)@wV!v^Q;7QGSFu%NwgDuqIhe9Md{&exGY8|g99r$u7j^>W3s?R!`TdQ>QQ|0qc zcX8kG#bj?F(`K4kH0|wPyuKXMSEamv_rR$Jg7hQPMF^7FNTgVvFoV=yPoB&n?#_vbv6EbTHkg00Ds9 z)jK^r&k!LLb#9@cfc|$hbb4 z6q;?M7WbiU(Lepd~Gjs0qG_(Ve}c=Zj+!y^hm#Zx$gOtJYt^KLOJ8|h(uI;TDVHig1+t#!Eq3chWISE4B z`U+jP{(_)}}Nc+8;5dW>HNut_@}zj1Emi zZg6_lDlrwy(p-(y(>TRtwZ>bmFQ3O+)kPs(xbySYqcdkYs-|E^T8z#)8LGGt-tC?C zJb@LsEP4v(H7^P-<1)x3Q~lpcx2;?l;AZ!(0sK`wax_bEC{-kF+;A#yVVlRp@e#vR z)?N}@>&WfaV4Kh0J*$`=B5(QVe>#;sM#G;l=RUPu=vF&N_+@wYw~9NMyr8?5N6#nI zipzfkUq^F14#*lFMstY=s?|pLfvPpEHsbRO8Qd6SarP#ksCer0Q)pUA)qJ8#>;N8d zSzcV%ZCIsiSX&PUYFd)cVMQKK1z6yd?ND2ITTr<&1dC}*=W)j)wNGv13)nRScOA|d zj$J_EzN0l}l^*nE5WYH!^dt?dwojQDXm*R zS}z+%VM}Y{2rld-v(>E8;!&8qztDYYr3+oJ#KpNMZO$p|XO16cz7(e<4tcA;#`a~b&t(r|r2^!BGosOXng zFw1dnn6|?JtBv^WSzY!vNp(EIqF}iwYCVV0iuHThyfd%p%^_&4-9aPe3c!KrI@g%C zGeXx=dX>T-N^*ib9Ms)gr8r<7M>GkZgemKc(^FBg)Z%F&Un)`6dsa-^z_*a2j1gSQ z<(Bme)_{3&{r2uFIV|okTbW-c(AG|)t)ks|p4~~vI1}= zQhhT+Tt=fMhAYQ4tyb+WR(olsOg2bgO5f7_LibjIW^!8}d)AYiO5)~AbI?uPA$M;W zs1B)XyJ(bW(z$DUgCaWaIQrK&tGtk0msW4ihdUIHPCAqe{9>AQi)HHKyrp&NJiVmk zk9vjmsSkhFi_5UNqI%KSZ3q0cADuM#g3N!*LHXB^onl_bnA)_by*tmaxuSaM@g11{ zG5OO^iY&+RkIuY+>XT!wH0pDD=8Mm;`J>$RR1d8()A1eXcq-|BDQms{d%!7m0oK(7lv)Go?X(Sa>&w7_? zr2haZ>)X<+TDR|xKs7Y)wqSP-y(@pRVS7yKY&2!Ogd@6_f9cy=l;5%> zx`d=>Kdos;a?)F8p{IL{(@Wh&K?3BEdE{oPPiprww6ZtO$DCGcU&^dTPZWbul%A%Q z(2M5DqWP56(Q9{>h$Bbfdh=E7?p{S9x#p_Qese%F{MyaM!vf?IJAsO4_KcY8S@dTV z0e|~KUs_M?8GUMw>NCX`8F=b4`qC}@g!S!N?9{O~Smv0GKkaLz0aj-KcFk6kQn+@@ z$XNQ5RT=(zMmeAhUv8JyfqO6avsAYbaZ9_J0MHk*=Nqbc?qom3SVnOI z)}AKF>q@|B$0;V2sN-GJB*BTNOa4Pcv=vdNUa+<#c0E%-OD1xv1QzVIjJ>W9`{3) zBfo^iTxCyCN7jY7`yEe#JS}Od+RJ%%zH@Kc9Axk~87K3u!(Z@Dk9DNGTcTOqL@=(u zb&sL{02=ep3HYl207AJdW`g1w4rGLmzeCv9VXAoJ?KZ5-V{omEq-8KVbtb0nNi@-J;Qhw`0KQFA6^D7!WBp;L ziRJ_EnusG{@JF$w0e~YE4{~97IQ}k_@3+s9^9q9;Q%arOPzBMcOrx(KTA6iwfQ5G* zr?yTjEP_Qj6ylA9X$@LTV2&x{Rz2etoG?u(9Cj338KeEIq>^GEl}wtXBw?Xn`{uDQ z!1Oem+dK*wG!+2)vrco5h-R5+6Ob zA4cO9=FbsQF6nA^PJ}M?(8Rp(t<}UNs9o#G8S7DKS{3!&&1hkDm3tL9{OhdKyh)^L zE*1;8nX~tI4A*(5+*-UUu#{HEBcZCLim4{lm5i!UgjM6I!`l2ix_lY#V~BbIlUp{w z5A?`@^W~aj_1Y_~qPiVv_c2jMJRTO&V8+`R$sOA!uE(Wm@qNoHasL2p#ap7G%1?GX zBD3k%GA-QHQWp$0V40fq?>(Q*pmhkEBeBN?pGLyQXZR8!RL;8u0w$sre(J7$QFnloBLtl{x8B?!x8GTX#3w-d&3>b19L zHI4o}nU{C>Nx}VVpN%xVNa2(0^NyoCYG3$8?@!HaM1XQKcAw6zVjP{DX^B!%SGCTr zO*d-p+JB`&BZwR_42tJr)wSIkK?}&>5BXYQ&{!ftD`czq+C2{0+$Lm@)%$`BVBhsnKqh4F8nIkG2p*3RG7mW%x zdJ+vt_N20vMBK-q6ck9v4;fSM#W`TPg5*mRZDlzOD^`2yZ|znq$OF2L92^|cYk^AE zNXQ{@2&(rd5+AKe4YZLGNaCTo;zLc0Xlg=fxuZ0$Ax$RYDGO5=&;yz2sQ&;xMqZk& z^UyM8VZWL}_~>d0ADU+4ns)+n%z`xReG07kx+WD4vE9@O-Z`qom&cXg{# z$?r%^&{u5!MV10~*1IjGAW*r?2)o(4Us1A@crK#bja%R=g;ZpJH;w~rG9Bb?&8ZEo2v zvc73Y&jcFhG;KQdd_f#jGdz5d$Dyt{Yco}`(^~1wVh0s*bjLrzT~(HvzEXlaRG4tNM zQrB9%vAT}x(szn@+j6>|L9d}cANcOy#yWAfyb-3S68`oqe6kPkFZC6hlTQ5xhUr=& zn{>=PZ5_MfwFZR&>jM5&(yFSAC;)m2T3*}8XEQH`>{>F-Z5hD+=&l3A2T8S&?cUWO zk-6Thoc{oYdm|`xDtZxvTz;+K4L?-6GRX3dI034oR{MpKCA^WGtoR3awR1+UD(~H2 zd8MiMIhF7Y^9+cj!RSjU{s;;kfi)W$4Az$x_sUN(+^ER^0D)Hv zAHAXL4YjC40 zac04nKT5Zu_>)l3t|PM57FU4r9MY*%`qsz8FB05pG0$szF_qx?zHaJj{{W5k`zUR~ zURtE8ctzWgJ?d2?m6=XWtDT;aswK>7Rzk{02Q|13Mr*`85#n9f2HB3#NhmYh(!GaI zx)R0#H4;{5BxK<|OY~7iBd{wYSBHEoG1|52o$_vo(q}FqY|k%PLh3R`d*-U@QEcGV z?N!B|ue^>kNvTFIEtW*@+O?;!=|6PjB$5kB8e52b*udlgSeF<2GG3*`cCPGy<(x~? z>s>A7ubT-A)YcuXmHn;THMxn`zU~bvC39%DX()$KwE`O^UBjL0(ywWLABGeQI_5l$wI@)%b`ulQQ(duO?lG!l;disax%f=?~Fjn3sP>kcunB`r@){V@z5=x{r z=v0n{I)1fO>7B*EBmLUxLTQAb-DLY7MJkOm%LmIC4UFgc)}F<8{=V{7CSS_VX*BGd zG~gfiYH_5lGA?uNwz?Djm@&E`ljv%l^tLvO<`u$vQ-uX5YySXWc%_Sy*O8eL>FOYD zlIB7DCyM4TM%hR{wbje1X}2+$)qr9+HOguj6E+SdO z{{UKerEoV_NRftopCp82V5y)45ARQj zvnUlrKfPJEf8J-X6rRA1&+L19>vi*^1mhr%4Ogk( zy`|(=k#3CgI3V=~tW*IN%%U52bJ$i!ixHA%xINDqqgcE1C0j_3B=cH2d>%!x9<`>? z0^Jl*S%6VR6an$qiES3k#F~w|t^!WmN1!Jo^feZrD9*xbf8u3}*?7|Iu=!=fgZN&S;g8;<_GtrucJQ(_xQN`#S|z2WUSwJ;i%ZhHu5? zj7|yNjzQ`TZAYbBNn&FI8-_DnzL^tgI`r0zM%Fvm6`Y!Any}L6a~p17dVNJ7Kt)Sg zl}2|~VNqNz=*>$_ag{U8m8YznwCC|cGzE4UuobGTzCiqNvtW4Qs0YEP|n`o5DCfaC%_Yd=p^wVTQxG3*6X zvo~9kL80tjz?J-JPwe}~a3b5Vbu2p88&-ZD3=mK$a;LNdHUB2rncMtxW-R& zUGzE|PY{t>7Z~aoR%$%1$l41{3kO}WBp;alGsQ{$zhDS-2R#mRk}E0f)+Z{+0Up$% z2(kA?JxvW%*L2;u3hSQS)?NOnOP{k%lt02(r{_u_i$8Qz#1VgVQq*Ql4BmJ+t-Ea| z;{G2pHI0`z<*-FYA&>i_pnJKj*gP&&jP#<`5c#y%w~(Zf0K%gCCO?2wGV6C!aU<@> zsH@i2x0iO_d{+=2IbGb3!j^+7wV?jsrW;@O2jx{~zPW}%kCh^zZBk+0o`7HbANvdW zP%Q}PtNB%1Ys-tN84^TR3%GA=XV`n!M-PYYri4lM|_0t zJym}y4UhXH@~zu{3|>nbvA&Nu%PNj~_O4@4n)6P%Xk~7M;DgqcEKM4ZmJd*IXtVYs z=szl7v7bTtR#*0%?fgczH0xn~0CT9KN!~IJMRY3?0?_+@RQ0s_RfDAA8*ZkBfZ%OB z{F&dJ^H7@cyQn@6`-1Vu1*x=P=kP2{c$BHgVrm`Wn z!9A-cNe1(SSJo*ekIRjBF&!$iX*bBGN4JnD>%~4+_Cj-tc5I1XG!l1Jn@v9I=?g;< zU^uH1=$G+D<}@U)eZ1m@32$OuNGEHRBkC%4!CIEzOuUq3A|QM5Rc;bkC1~UrVZour zrFJzqw`9N^p0#q^WgLDLo~JA-*pS6+&z|)UV?<@%Xfn++m6^~U=)_lV;Ohsm)8mcV zn1P(J$u(Zm6~3?%E;2`2)YI;TviWY9BZ|ouj;`2rtu_0iuq`!M1~+6@yjS+p0f|8R z)^%>}VU}p7tE+w12k2?lfWnF>paPjJG0eMUK*QdjMF4qUj(jR@ZiUs7hmPQ#(G$ou z=gIw};mhx}*h@W>!1V*=Z(=$TUj40UQtC*300%CkV`jBtJ=ILRPgN3H=giq z4bB&!HQ)Fa>M5;*z}qkF*JP;YB30~tzxve<2|I>|ZDXafKb>*Rjmh?{P%tr2+uX-< z9^^cZ8Bb7ZYRXb?a0)1*kOdS`Kp!LPI+gE;q){nriI8w{mLjQJ=sKK^0$5xUf7mrn z%KCdd#JG%*%5pvH**rhvi+Ny&%(q;RzsElHw4Y)jP08qTdPjqG%iyq!84#ZCF^cw2 z1$Zg63ove`5=h+b1BI@WN4T`Sv5w-`Zq^y%v}zpN8ikmE05Apxa=s|EFkC~ZMn3C& z*!1sRT~pO<*5^)|Hva8Oc40Mi8hpZgRB(G$%H{kmd%7pKcFRP?Yp9`|)bx;0dQn9q zrdq`3_1HYf908M#E0)o0rCZkD9v3}px71_YhlG z{0P2cdr%`qHSJz7F{sW*yHr;i&ZBaKOL;2~tvW3t=1!m}_oXFbGDz`BBt1xu#6QMrqq`1sTsjLyEB-=A9&FSk_iuxhv)zkJ7k=BN#Qiqv4@( zo_4nt6Kz_?k<`$eT+%i&DU~F~0W8O9`eL&q)uaXfb1G*7ML7K{4^a7Uo~5$p7w3>_ zg>$5Ba@JKKc-6 zx4Cv5ia6<6Z6kWsBqIH+Qr$U@CEVdlb;km_dp{0qlEkt@bOO4o{o+qOtBto4OCVTP znZPFt*NW=wBk@O)uWs$J)mcf941b?W%A~1B_>FwZSLj@W!0Iuu z73^0}75OGqBnCalu6x$%#p0{Q^AU1ME5qRD^R91Iy1sjZ7504Cvb@yOl^IL-cDOY9 zl(0vBD??1Nn)%&gnGmS{CdO+h7Cq|zpJRD;S?z%(2+j^MT^1zLyU}lK;1fK`;PnXE zEA_0WLdPYEKIXJ|qqmZ~Id0!v*7Q2Atpr7+)7ayyi1Cs6Qw>O=)h%KlKAeOOgvZvYU9?vd`H(>A zxa6+h2hz0W)-Ug(+S+?EoDf3(U8=ilxAvd8nk}q5Fu|kL4A5|Kj8(LecJeBe_a?h9}zjlOECtaDO_B7q$ylg-+D3hkl_P-G63!sv{C);^WnMBgB; z>I(2YY<$0YVbR*d3lkbDgU$frrN|wro9Vl&RTgpc4%&kxC>6tNt{(K_yLWs>Pqlge ztsr~WK9!CmNFDeUdEBTyYSDq`)8q-s3RJoW-^Y~Q1Xd|euWi=T`@fwtB4tknSG3+yauEO>e zQsY%~vSwkvMWOtaLi^C}I)f@qbJ z)M)18@y(P{CBiI`IpO1K>hzx!=^Db~-t7dv;&Zi!_|{$DfUGVuQ0+fT=dV560%HQ4F?CP`xpe*@b}2Q7@D z`g&A2v`vlrDmbnonR6Vd-b2W7_C@ zisY{D{ON+mhjHKm-kkS6Ts&jRqCFeHz9N>*-qg5cWAcJ}8uYzCP@3sWOBU7aab9uY z9|YVLOZ`AHWbR1+0I9E6iY10HiZ~TbB(*qeN<7UZJ0sSS)H*Vrgkq{l?;O=_7_tII zOGi1uh^5hdR#fp6{XVtcM%$we>sUT2uxac?)I;~s9m+?wXlU2zsA+KAE;(LDp{i=? z<~*MD%>r>zEyQmpmZvN_;+4O7l^ic~OB_iM!YCC5^2@k1YX1OuX1OmAYcB=Cwu)4Q zblgrWu&!fY@O`eeGRo}0gPa3Z9mA0=k2Ud9Ts^Ou2CmJGv;Mjpi1 zrudh^R+@Cy^SOVsf&=9A8LMB|x4IpmyVKD%EkExVzvZHjW8Sqv)bZnGeQzKSX)7=L zrl$`Z9Nb&FfIozE{43WX*0fzh&D}Oe$-~DY;gtGfxZO(G_02#-r$MwS``~n@x3C=A zY8qX-@eyP0D>Cx((n-YDsL;wguK?F?C&TSRWc}0NYQ1Jpjm*ADn~TU><7VRPO;2BXN#89xF*~R{GfwniYV>Yds_?KLRsEiViX>Ye=|Q zj$DAG9#5t!u<-u?{X7rKw7$siYOu*75R0`)7{ILMX=rO53=L4LUJ|^5Gew&Xt{CGz zJ?l{DD#t!}&(fq#6eck+T9Eow^)Kb1u$705YC4^cq0`lf_)M)HP@jECN{h@6y=jP~tWI;N>Ur!ae*d5fMv z!9QA)WZk46l|?0)kma0y0-}u=!d%>`3NonOq*7KR`X5TWWG^0IEjJlQASYUkY3x6b z^s5j-ED{HfW=9y+NRr(@vHO>I@V9ldCxVqb8&ff9?9nO7q(ZCRKCZ9 z%OA>}z_n-`+n`g1>~oBBTd_yt5fV85?bYpOPsmTCz`gl`Amb&XGGhXdGF0>D}@7^kQuSlsijg$9Ms2d+~+l2apnvj^a$y+ z9&V0nwT%3tyuI&bv|#YbwD)9ZB3b%3gRHO!lBzcy7c+F^b;c(KV+mT^UHRxUo)4tPhEbNHN7%$97Jv04l&m!f3?_Rs$i1v7YclYIE z{D<_eDz4Ex;&T2q(m%5GOHE!l&ypMo0`&a*S78Q`4A$|$ZPs+0AZWmn&>R&nxC%l932BSIzXQYkzrEgJD z?O0gnj(`VASMdZ>PK5se!sve*=;){ISXk!HiEugv{{X(JpV?O{{{SqB`d3Y~dI~m= zNh7fr1BhfMjwTA`v<@0M&I_E^QY}X$1&xR+L+5-L5Lo>KTr)Y+ac<) zpZEnoXoANi(VXWMt)a+LcZl?1k@c-ZV*?+W82Y1TEGiKkyM!Q9uxVj@TTCP#l+HIIicwJ}!&Hmr{$lae38&T(A?I)$agB3LdXl@CIU4r`sJAh?XPt}4Qe zC=|%af1LgTl*!H)ll-Z^!V+~?h0%sX3}e=~Z4Pm!_@aF_Sy^Lmo-{o(-n+G2a(Ok% zc+X6cppR3u7`V4>*#oXBpw;Xr-0MfR6^G%?avfgAITgNaVTW*iD{`T$F{TtzMIn{1 ztS$8$SGTx8$ioJ_>hHk1=9M%50ATBK$8N_yM4vDf>C}V+)K$h-6Gw;Y9}ji8!`{s- za@;S>LN3zcyDtb^*u9E~;StEZI-a4s=DV{Jka(^d`V*n}on()QZciX|&1j{41!Jui zXh%U#`wV#dqNcWQG8J!Hl35lQ+1!Ajbu}(d_8K@(A6Z+SIZ&dO?Zt0t7KplhM5x>p zcJ{7kQn)@K@eFqHazwcu@mqcxl$XF z76p`1k=+Otp0+MY0x`$9ts=*6<>2@EYP9bkl+7fYJ03AZMU>=(LZz8U9kW$_*={XUxF4St=-&|m5!$fGA-E!vm%Nb7-|TCU$Nd)AejFOd)qFiYtY+iM zP@Tf|s1sP!Q35RT5CpUZ|l&5YnxzwArE!A-x+ zdvRGWc_oVZ(J@vX!Npg97~QcOo%rvX6}pJnyVGtgvG#}xXQpbV7tmEH{9AK%9?3~{ z{{U*Lwz0RJlmV}W^b~|CJq2TbZGW*yb(8(d0_KI^m5?RkJ~wUaig%TwHKroEm`RL{ z#BhD;qg@FRC204K2}9nWE#{igsa-t8$FE*}sR)@DN!y2-Q`r37Yd-O9)>Gt2S~7S9 z@+(5$P_YLmOALK6z^t2@Av2bRSRpyV?Mw&T;5R0&G^@9RRFQ|JI2`t=VlJfWS8uI4 zGCaZcs?nTwt1#fVJ!t_Q{FnoptdksZOQ^P3eJZ?oz@dn-ycRySBEC&m00WwpF}vEO zfoV?_G7=3}TAevGATHbE&0np1KZRrRyfk3dhc>G@Y(QQTX_b#EoS=pHE)t10dcVHt9=hT7c6 zd2Ex!a;!fuYMQv1Zmv8dsf$ap(pb!K48Eh#{{XZ}V) zL8?~=SAb?OE^+t+O-B7hYSCB&Qr1)bW}L_9x&E}j+t+G8d8SM;{>i88*jV18x&Hw8 zN%8lrC0(IOE^YDZoL4<@;LjPm`PUO~BcGa1DSI%v>(lt}Mugx<@9wHibDHOg^sQpz z*&v)ND*|`%it`CC{6}eYEEj9HOrqpf{X4_AJ|ew%ZzuA6r3INl9M!1XVs3jX_@hj) zu?6l?h#i`_o9_`{c#X_Dcrn}O4Kr|~>FZqi(KI~=XqHyHm~;|8?tYa%t95w}oMl9K zBLk0@0*w}>Zf?P;X&xA~A?Dv9<=Z^5t2RFoyg6|Ad%+WbwlFKfbqo1!Cu20`Odh21 zRK)B3@%hnlT>6qf6KNA5Xm4S0{>uuZf8y;v$Yx1b9>%_AI**ipbtcyKsTWwflx=5u z2chPZW4Y)aKi8~vsiS*YRgU3N*~V7RF*chE{G$>E>s$}o8KhFmSL!P2U);jGW1ZD~ z0j;S@#Iv@ME!jwIDlCz~+$%dx2@UxQg;zZdWZUa87|6O=8Na-)f0bF%F1KHdNX)t5 zvB9mbfgPLj6^9&k=BeLKk=yPuhV{X#rzJ)kf;%-)y|!s$Dz3bq=9?MKNb1f?j1Nj? zaB6F-H?|;_Rvq!$s_y2XXxGps^0oawLHsu{pZs`Nt$afTY^~)3m2rykdl`JY=p+a3 z$fxo(?OzbSZ3ZVF-Ug@b$L2nVBAS)jMwrvra_|UFwO00Ptw8`fe$&ttTvUlBu9hK| zMUo6|2O~979bZyAwoQZF8rTfk;F{gG%Nrr|VTzADXEkq7zq*`-xM0M0#b@rRdJO4w z``tzxP$RSwMnJ*a)Khgki|4fe07-bG8&>8`k$DT5INCkyN#)k0j4YNMsmM4TYbGz900=?%z9K;&k2o92#w%ScH6Vb0 zYr_OKDrCVrkWOEzpG4OCQ->pM*mzI&M zi`9`&P^UPc3X!_(+C~_6p`3w=s;tDha|HtHMqjx&R_az6^`qLF5aBtw;T3=grdKDpDZ z?)aJnZ1=_uZRnTjrP)Pd+nxyW5sAwIoa5fKjxv@)hk6|kdtVX%{ zS>}asmEww1gkL8tq^i9=&&#hQ>!Rb`3EsmK~ zeB82DXofi@VTlyvdex}hk%Lv9SqE&dr7D(@3q;vH)wnd>t!6~wb$yGOsy8~dt)A~9G>iAtgXvaOl08L3jgEQKaomDUM%F0AlS$V_XlNRb>jGXN(2>h#@yLXYqfNTNp<-s1+?4J!a{{Xb<%Vi-u;v8qvyg8-Z+eakVrTjnB zH3%-Ey-lrb>4w4N9M#8Lm2=uW%Au<3f7y21z{{Q#REXu2del0Phu2%PXdJTVqbcN4 zu|*3lKUeV|?{04z8+Pc4!6WNk4VQzon_M$N=E>cpJCEyJt)7MBod9`yexq-BY&cZ7 zOfVl>(~D5?;rV6LY=QL>AMm1A`z#UH$75>{0U$sJprw&*qFlbj9_JOztX?j<7?N9i zeD&HhK=6&#({9u?Nu>2vJ4Hpiv6gi|5@{A7fhc)9Dsx=avg@89eU|aHt*QPd7$kiw zud?vAmt%sK>d*b=H& zqdh=4+-vAR7U}7Ipw6d)6p(A?Tc`{-b4J}&h|N3SQdxKHcT&hDl2$SUkV)uj#-rm6 zb?lnirAZ;i2xZN4@=Y{cqo1MXslKN&@an87ww~awP?lLsu^{qlJ@S8a)x&pe=Pw&6 zsiQVhAN8Ppc&V~|MnR`t$z^mV`#f`hvmnT>o?UZIyMO_u{hDs~8Rw2w80rlKWD0!t%CQy$rEKW-5nkEk`CGxp8L&?kq!zXkS1^5RM@D_O zYxS)=ohmp2mX16g;ktclsf8@%5(Q8*)Ecy`#&*d$^1sR{{T9hg@jYF!+IL` z4;mjg!LUi{ihn^~BxknopU%2l&xn&<=qsh%LX4=PQb2HUJ!o5}*sD7hBesOt?~72w z<33s9v7Omm{M^<#*CQNl{c1MXWB%{!ROE$bZ5J)n=9`+t{@#zW{wk;sJ#WE!jXt7HEF zEdKynE`ran)AvCK>M1fn_NhMAY=`|`e;Qx5TH~0F7hS`Z_9I_faQail<*4Z$JYHL# zkyA|zmR*bS2)wxd(YwmP-LtJ(Xta+k`8QLB$IG6Tnl&hP?J1S?pj}%YkkQP8mR*fF zW6}>YPdKo(c4!Zf(c>vZsrfNBpw=Dcn|U{D#pl#4q50M9Me zV!>Ev+LYP8M+TM0%Pz$@)w7Db8fOBYwy)V6j`*n--a-5=`BXMONp>9?;MK^gxcfj9#mAD_Ya1(o!6TmB+SE!q5N+$8d;p@}n#c3t8Ixx5yLJE;hXfoTE3siLN zGUrW2jV}DyM^thAk80G#ZOqRqPnKTmxWOOyuxUa7ax+aZMtXz)0DT%kZxHCesi$?^ zj%G_mAXQ#~3Qz#(Dg=BqwlcG06?z*)fkQ|^Zo;gXrvo?&JJoq*h9Q#snzl(J5Rrxn zJbG0&xjEXk9M>j8*8-sp*+yzx)Dd)JjX+=#T5SCM+2{`KL(g04>uQ`=o# ztboNdvHt+N#8pOC(04wwv1FZw9AoQUJ-lfgV+3dGUm)A-daNL9)NWM!NNVzUqg@>} zd(Zp%P3o*QBz>r0XAUneh%HR1mNF?+xJ?w&kbub=shUH<^zbw1C`e8<()SITSR z&k!$7V(fpw>QUoA5dr@IA)BxJ=zoPC&&)Z`spzkkm&V>C9W{%S_>b_Z&yM^`iJ3K- z{)ZW)>G_8_^cRb6KF^>|bAm=Ig-;0SdY**~T)?Y4pe9A&7zpw`gX)mSjDf z6-9h;t)wCt?&JtK0G#5fd#b^?-fF)KHbl}{YAOEgzvEtQs%W!mw@nqvT!X_Y$Ta!< zMXcO{B)*#muxibDCYAR|BRhJr%_h?o$YyBc;I4kPnInS79V=;>;$;HM3{h?E``;FhW zTMpl)DZ94pwSo45nm*D2qW2fqs&-#-yw|q>0NtyJrrliW=K32c9@qkRg~;Qra;D); zbhoE(v+=H*%{W%aWReQMK)Csmxs+;XDOY#w(*}ziKE6z zw{AN8w2*kB;@KsNJ-$?pxT6k+rGFUS$sd;fQw(6`dWxAw7txzXGOcZw+*Zta{{U6` zQv9Fu$2CyuA)6!tliHK*+>ZqU0?kI!2*B zo&BK}mvJSg2{NK&01gdV(0q5P_KGspV2n`b?oFBg#^VyIJv z+({$#qNEop_HSP?!!xaS&2PBM5Xtr>y%vsb+c=O8I5?@HvAVd^pHPOvSG7;QBCbHF zVb<KKBHp`!sjs|@_D#n?vUTM(H z3{ry}xymre=DT4}3gVobzf%Zic)oV0Yjn_9bnCga=`{%KBx`8-X9J-1spHb`UrGMd zTL}%AI5K03j>}xstu3XuisKNuIaAPPu2^`3Q?b&d)1$fu(m;Q9!ysp^Mjo9fC+&9V zZCf#@lJ-vh?uyH0a{76`TQ@fA)xgLVV&6}=dj`H+HZU(Gy|awdwC!&G$4-*LXI8a* z-5o6 zRW{1juiaP@KMIc1TDyk9ti07Q5r7EfRF?X+b|e_`lzl2UMPgfbQ<@Sr!8@unC+jsknwIxc z`H@6nMQmVi9965QpUhZ|v_Y74Tw<~oQl(pYC3 zXNq@-)+VaiooB<4C)MumHsfqKABq0}>sO?ap0(mSF28r-+lPBkErfsvR~g73%D2Da zW$GCJ0FOuq;%l05ZRlj=E0eqNrS;T>H%*Fe4q*jMj4`=qCrN`B7p>lE7E4XG{$0E1T)Vr(CnQmZh%FGDv4O_PH1?|2TMiMXkLz-%R$#Lv< zrK!2}tUF&4K{SgT(U{8|WO6I7v$cRmC1%`uk4mfDMQAMKpPX%9Q(6&26}aGKy-hu( z&k8UqrN!hn$X-VS>r0=a0_k#k@G6$0<`_U#Jf07&a~h9|%E`9e@()^v{uA9%p)k0L zMI#3*UWOk5Df`tlFrFnr=z3m+g>=;{FvRm(Rpk~wI@GO3-`%=r?y%|j)${QZ{{R^l zw*LT`uU-^fV`Om7T+Or6D6cm^5iha-03Of}&X|58>Hv&e!TQyEDH3{J73Ra@HSp_g z2j*$R;x*^|`osB}J(P!I(de%^{{V%BdyM^_AJ&lkLA@i0VF&S}*+@sr^J;R+2+692 z+0P`^hOv-+(hVdrO%#E`0zv3%T5QVX8yguQ&{T0+s+{$v zqAQ{p;%S@~;8pmd001dfK1oa!zVNPoReZ-ki9k1R7j(MZj=l zk7`}nrh)}HV9}@!iI;fXYAMcGmN}%APCir8o4?LdIymb}<13SqkxY{e1c*MOm4QQo zIjD|7+@}VkaiVl!SDJVL)nOv%<^@emujoOiagt*chcw}nLZdPCrUYaPVFI+QbjdXf z=xrmG7}{3a8dut*>S=Xd67NaAdt0SY>)lR64^V0HJ97oq>}SUSa7pMY7mNnr)$lyD z#Z{9XYHU&~-~-J#s3VNfc@-M(4Y*_F^`rv%XVlZYv;E^v`&yN8Bno#AybcQeDzZ$- z;ep8=GtB^436EMrfbq_0lgwSRRY5)0ql#yaK)~`nd7-c-36AvdFFnmgG=-ZxKqvdO zTinS6o0kOoFwF|UOXOtrG`>Lfrd�gKbq~&&kr86z>T*!Ou`eXc02Pr>Q@kNG;d4 ze>#G2Q)_TH4E&~@4eXG{$TpR3pp4TQIJe_DrhUlTgN)G;rgncSL!KazL8)MkgXUyfFq%&bOo_( zCcxjqdK}b?Z7Qx#KjYnC9j- z{{U1#0P<>at{FjDqDNEeFh|mzz`m(C`A=W1NESxpc@5i|&$7FaNb+F#2e+18FtKK&j*p3 z)n#GMC{|(}{h=&U1GumUkZSyTfR;du8{~|Gjw>C`Pc_+T{ynshLQNx3(UNIkj4i#) zKn57&=KLxo+SsM3nVDPuSuy-6Hq1{Dwkmei{eYnU|3)t^;SZ;SNl#| zJDrLoPH;;0<2@@**Tj;QB4`>w4l<(z_u{fApHaHGGOEQIxWfW7+Z5>S?>xPabH;Ku zs03COFw|;%NVryJBLh)Q8>FB?sS{ z;(2W@jhzb@E~wG5MK`gDI8b@bdPTM6v~VaAt}*LgXJ>nG4%@bT_H^ezfu~D*d?fwE z>$B02S3mY_T&$a4BTub6U8A|wyh{zTm5hdJ<8SqQi`fq5IP|JddwrjtD``E-;-fl) z1N+@JHupy>UD$jLI$G|`DqAN!0Np0|2yb)IOy>!e5e zS9(V|I=>$D;UUE`KeEgIs`>`@Ewui%FtwDAlWTvvz|#S~Z8XWA)U5==IgP(6jH?cy zieerl^{0jeR2}^D#^21Ky#}dR`48Pbu@F+xLg(O!L#GMP;mPdenj-F_T=p z#MsdjE;u5jS(mvLm%S8Ysi@41dQ;{EjiEAw!4&Z*$E{&5@^~h+EoC;UOJRu^!KS1Z zGz5Uu%0V1fQp#EQ;2zbZ5cx)Gl&%EBtvjV6ug#i!eQLH9!~?x1I@0GosN#!^LJ1WU zCvm~4PE9a^c%;xF1d3N|sknNIX@UpkCE9%r1XEdaNMbddowl(0)JD=wfw2A*@}wRK zAB`uODxMv`I$8}1EawOBl@%hS(eb@nqc@id2*_;uih$nEKZPl1GVUc|)oJ16{x;8H z&q|>U-NcdswQ=6B6YEVd5s0WC6!)l`ng&Acjt5#LX<>)Tk{}0Ad(>_lImb#_t|XZi z91oYF0;EJ6^V)@NtQd71(TYwf0R8012p=)*DP0~J12PpoKq8|DX#{m04NE=5vxM`Q zwgv${lnhk5bev3~LyvAL_c6|nC6*SCcOxr+YN)_9VoR%;p;VGbc-Mir=M=ze+%w1| zINUqppD>h#nd88IK?8$TxXoIE>Uj2$Jjm1dTy6r84VLAm+rJqD83PpIZz;C>K#9Dp z<9}?_4$9IN186p;og@#eRV88B8p7mh&mqTV;Sa~w!nuumR>pmo}IkVASJd{P)+ zbZp4ppwa3gQ7I7lFZWdE2eGAwBRlzVM$Y6C0PDp^DzM8sur1t-W|j$jmRCn~k$DWK z2B>AxcX4TLCY>_=?{-Qs=-#5MERh`iwCN=C*`;#q-PqJI>>1yh1ZYEdKAGp*I$>nu zNZ56#R#;e^NBYr&aHYtWO@jpW!1px_LN#(*JAJ9%!m+OdUg&IINLeGCW9AtQKgp;C z%o0dPlt;E{P3v63usqXA8vWHLII3gITadt=l~)5sJ6nrQx875Io$?j2$E7M=LH3kT zn+u$7Ex^yMShVwREGJkD&u<19({}?t)k!q@FNBg=#?R!9&O73&_Sg&Z=@%B4GF-;d zpCInqt`1k!Rd&CGN#>Z!zH^XkM$=Unmjc->V|k`eEUwTuW7E*pO;*lnEmr02o-nQD zGi}Es*WQhl(2Cd4hj^|R7;(FUpTeAGv=QZ?eET&rJBS6UMJa8=xD|5s1+B5NxP+r; zdNVI0KK_(>jI5H`umnQbKkZepUTDJzCz3z94&p^)p-5qE*(4q@=~iI9xP~&Y%<7HF zPJLFo+B#yGG;hJ>&k9JRh8d}Rq1v)^n~y41wqwI`m9x@;4D!IG3MxU# zq#y&*ivVmMw0UD0rBRbo1moI^0EnryhFtm|N=A$hL8TlXl;WV$u*eyGKPrjSHDS)v z(t(ERIi>|qFCSV2S?UE@BLn9*P4C@tv9_UF$ku1r&CF!n8d|2fJHyGF|sKE8z40qkJ_d*BIT)W zJC24RgE;1-ElHj*DGf1*$29}KJ8@Gv3Y7{vsSH4D9Fglt2K}I{PZq#K9ORB_v8z`S zM)DR#2oGRtxyP+5jE}7$N`5)3cP@q)(IgTm91^%A+JprSxZU+YkY$n9N>E6zunJD zgbpYHg=)>U+}5b;6Ai8~z>Mako@gbvg%aFHDhxA&_x=90Q)$mMZLk3u=BBop?d0<# za;=PJogA?XSBav`gym%Zl?Ky54{x2BiR94{XyjK$+Ui3o^dhFSnJumZ%>vGtAfp_9 zH5`~{WYgS!>0CGD)*O4~M`t8$pzaE;d< zqw}B$V7X{*rGPl{<@>;o^XpY!A;#9tMpTSe&XcHG*~IbPX|dgIC6$T6UNKE-12pYI zeLu|mH0rA=?U5NlRvh*G%~W`U24!)a^rp^$$n6ppjIr9J( z+GL(NL~^0yBQ*PkONpeHd`Qf4RR#uqg)-t7Gcgz-^OYFQK@@J%GJs7#AT%^fi0p1< z`$T(@(5^!jBiv%G>C)R+-n5RwSlLSBc~$`T%b};SFQTo;`ub8n(69wACfXSYIy{eqB z$f`+Gimg%t#-|()Cz)yjt8!2r?LOYsp>sX8{*`766uE(RF=ohd>(4{_Ry;AuBw>|F zr~R65`R3o1D}pac4Xf$leo=6Q{J{P2dl6M_Aq7f1g(IeWieR^&{&~OUPY_NI`nLS3 z{DBu{)66QY(#As!f(}8dZiWklkw`e|MNMj23z+1Z*v%5QS|gAcdQo}X)k)|E1K-cIOu3Dg?jT)==PeY zh$eV+`$IDz%MfrBdz$GX_+#QJ@ML>?eDw_`@8wC!C%E-zI?^hhyi-lYW1$ASyHA8~ z!M)YF^oBq2t;+QtBW`^4OR^-K`s4I_~6w3=%m%-BN4U?L0A} z*yHT_Yzlo@cOTZZ5;To=qAHI?7^!u84#&dt!xBfs9o1eq+1LOLO&afPlap4q+-p|rna_epE&tx@1PBW*v$DoD`pr(U<^~Cwh^xa zr3;?bqK&sE;09^<<20L3QYbu%pbqq>7^5DPoSK#bV~S4n-Krh<8(^rGV$ zPhm}`brhW{Kxv`ezb6!ileHm;PHI&cT4Et4q}ph=Qjl#YnoXqBfMH5OCfeaX3G z1QF|6A7eq(AI`4o627Nv95O_K;}{YFf=9hmR|^=6Gwm2+D%IV*_Q?}Git);!m65U! z{{X6pEOtk>RV0q;depySj~K(_t}{in0)Uazgl)Mz^NQ1o%J4cl!=^zYWdkGYQOT#P zp$WN9y(|_=v0_mBhxbnggn-Z%9%bs`=Ze_~VmI&_g&1pR$!HA8Et+akwikW8Zm(}3SmRM1$(`%J&{(Z4#gc^&19fhS@E z466pnVeDyOupUrZO9mdCgHLNTI8!8>M?sF2I)Oq7e5<8w{p#A;y+H=Erm#|9-~;vV;*FpP{Yr*yt!Ecz$tHG(@0rRoCX~IjPoGRoXceAQ)t7kvB-VH4!}fRIsoO zfN*FXz#|65IgsFvL8OtNehBZ_ZTKf|8H2e>H ztypS8`%Ncejj|~jSqJw>{=KW-v@a0a>yUh(y1GI8+jc)P{XIv$aNZ5Kv5!QGT|Pv( zfT-L*iA`R=(|1a@))F)~F`TQX1Xe9v)h!P~qPcws#cOvW*lJ;5zUZydCHi_FYUyQZ z6+wF$H%CPX%S|@b5$AIL%EGBxskUqIP|IQ?Ty0>0v4q!oa`-a zUT5R(*4#GYH5)*u+rY4rY}cieNlaU>P2q(+SUNaqmbv;*iE|q`>b_G{?ZDafos2O(z}c38oWC zv5IM+WYB6z)4fR1Dvhg4nkfY_hiXGk#UT^`+A&VXDJZxNB9Mx8H>scm#U(ow0nH#2 zZ7$qX@kdGkg{0a@#UPj3nEbYB1prE9IL#-W$4ZWq6u^{DM`}|sJ%vL{iUvw1Be10t zpFvSl_Mk-GdCx&k6QAyifK!JwY6Rlo{{VDTg~89=61e$+6x>L9o{?woI&-J72 zDn|)}^{RrM#%bIO(Knc&nwxJtRVzcu8LO&s$E^bw98ztiJ!qg~aYivtz{MdHz)Vnj z(o=KICIj<8BfT>}g&D}C1M}!_4221ij#(wK(yIUE|?vAFZ11pVQ`tWrAE_Lm++ z!#{NJXcITdr3WLeL>oMgML2chn1`MRCX+eo){|+*L7*Oapa(O)LCL2ig_{r4)|zR= z3}%lYEhKs6SQ>Fcr#wTf#eY;7QV;)`;_ayu~8t(Kz6I$!2LjM4x-zO5l{BvBI?R@&xORGK7Eb%dp zbo;U|1b_9ts%0CF_B;JT#v9}zmu!Rc2CQhlET2k|Y_*1IE&3(TR$uqMN4;`-H;PQ| zwi>VQu7?rKI!XS0D{kcyblV^YJrAv9*K+h{rpF>p8p#{0qYSGl$ReFyRix`z-Ws1` zW_uETXjuK4TwY>$h!k}WE zYiuEm3{{|*0Gi%0vCYg!v;pr;Ds$4ORP~{NTDC5vA#q4XJ5&1RkSXs=aqbGV?W4Us zCmm^r=}D~zagru_RAl4pQ?zflap-CnLIzDs1T#ERWPUV+kw_bwTY#kCRAlCro0Cl^ ziXP=5tZ*rtsZB8TseVHq2Ii^99V$52XsJ6=DGQo9QAaeu252XmD4+!EMK4iFiU3MV zbre_xr0-5NVvq_2B%dnNfvBcz@k|I$G}>{bpai27w78@K0Y)itOF#xGam^I8z%fb% z08-Nc6yePjpim)2EdrENKq#jHno3bjWQ&?`IHm*5JmZWU(*bCt!90pSw7`-E+c(y) zhCORE95SCnS_*On14H+5OOk1W)|?GHjD0TNDYW2y{{T7wXz>og5an7piyQOs=0M&lOt(!-0+}(}8 zM;$+?{Hi9j8g?vQY4RZ`=y>(2HpcHsycafd7~FOAVdzJC^!wd98^k-52kh0#U+C{{ z4o)eX zO-fEFoOh*Q8b(bp)TD}qk2$Fr!gx3oBIM?drvj!$+O;<*T2ajyrR_k#b)z($=%xr- zN?Irwbfc{lcA*F;#wenI3MpxEKna?!AU;Yq5;-jEG6Q@c@$U^f)FrNtP{02ET< zmlOb$xS$GJ06S8O0HFpmiYakGg~cr(7^S8HfldN|IHdxZ#R8lbkOQ7+;(!cd zj`ZRQ0}m={(lh49YqOr>9DflhD)D5;^NkLxwSfM?I;%DN(`W6oxrvAmCG(&vg{jjQqS)!V)vVphOQV zH_8VT_$O#3NmP*N!Ib(D(wxziJt@l=C+4BBJ-bHKlUC9#uT%b7C(Jz{Vk$4JqL!G$6rze+ z1T8K&q^AmK08)x6K&POai2~J7r<(%`@?(jP038@5LZS zhiWm$y*Lg(`t-YLlrtIp>2Zp99{oGg0)RcK_~YBKq{mQy6H}@vy{F7b^3OQw^sN%7jw=ldMIyTO9fzfK5i-dd zpHZCEUc@vteKAfkwlmtMNW-3KN!oB}rU?~PVUB8L_7vtoc@%+2>DHK7jDwy=C{b2G z5AvQ3M$j_2$4UiZHk?$d1_z}yf^ae3tw$1(MaN>h5C#oMq%g=8W9(q_QTZiK1ue$V zio>B5e%o5rEfZzE^vIxK4cPsp0yhgDpnqq6Dg@<*oCRcv<1nh;~dnokfM&XQPPmWQ-`%6 zAC)ZwLDq~?_oA2vF-u4~b4x%l;*?TThe`kl&q`cSDQE!2E;!9DDSJ>Nll;tSxT|Ia zW1LcbojvFRsHGznXYA?knqMJLu4n?S9qQlNI+50@!D6i#tD@O`O*~qse9>UBNk|8!FRfh`tJ8PmOZG+Q z2AzV;r9*Lp+#0xTMn^nTzQ_t=B8IdYM5sYg{(m}t2o%IXi;koD)4?3%{b(8&9C6$9 zqZsY@deFVG*RZ4Nc=g9$@S|ai!TfsCvHGTlgh#APYMC)Mxk(N+;*mY zsq@~YBQ(JlO*e7e1=D&{zSMhzPFONJRD#j(*af)}@c=}Oc-4%TH^=bs~o~>3* zwmWl4_IfNL4?X=_lkGBRt5t(<&q@p(IHJS3U+pi~CXcl?KJ!%O-=`FxX7-_h58Bv& z6H|re7;fB0wMcEoI#Uh5wH6DKeX<|=Yx-1+eQ*3;X#A?Uw)Urem=Y+|cP*{;o;eeK zLY?;85)KUD`--Y9c&9C)^r}sY=(i2knQz`nE$t|ju} ziJkCH)fqfi{kMZP3(X_#)~V)fBuf@B>Fm9hS?epK-*5&p1q?Mx7JQZ2uFrEs|Qk&pbeU&@}Yf9I;x zLeTE+^Pd0La_i zW}WsK2t1By;vy0IrbRCJpUR z5-=DwSW0O`f|y*K%D~cw&IzbmPCD^TE^|u3eM^e?JXDHmqBlKiUHBcvO^0)qZ0FEZ z2qb#fdj9|nwO-Rge>$$;4Yif&>;Z z8mm8mHT5Spc|Oc4{=0{7NuhfwE{7sljN_#-h6ez1U0Zl3TtI)&A3t2x8GI+LCtW&Y z^ckyIsxN6Tyk5>)XmgG*Fb7(MsV5yPdQS~&E7wlA{{X&f2hepe0X8$Q)hd;0cKDax zH3@byJic&fC_7e*={KvvwU{6G4Occ-2y)O$Ki~$BX%6G%eTpoYsGEw=dwB>X#>48S zsmT)#cDLn6I%4H2niT=fIh5zq>rEUJlS62s-cK1ABAC(Obg7gR(9-OD^rS15#CSa^ z#y&HOva$Np!UNP&8BJg=aZh_pE=5}ksne}HJC>LkzEM+yPgt_uD({uKhH7ND9YLhK z1P1>ulyXH%hyv#|NecQDS^ztC?@@%!(FCKwj!n&xh_>#If$aRbG;oNgU)*0+PUjLu83NW@jS7&RiGJw-U5dQ>1{ zw7CO<4#K1xdx}7L;+JSW=-dUu5mG2hhzuH#5kU4N0X-?zLdSp{G`O}aZIt9m;2kTA6N}*YKAB`}m9q2BJ3Z2OyGKdpAH@asuGc1f4=s?vNkuz$OAAo_t)@VIC8P$^XIa?9~2Rv&s8 zPv=e_6SWXNdnix1WBwJo{{Rc2CnO{nvrN;8ia#!oRcljaI6K9}?}4FQlKt zZ6ENmbjSPpOa4n$AK|9558R1|vsGz69cxN|=n8LukaoU4z@cLc}gZ}!jIc)<~LCu{10QbSDn@H3<+D*s%29wJzwMl*B_TERP zCXwJ7KIE`|5>vn78t^o{iQ^whE6abguGI5wC*p>m_8Y7d_ILLA4IkOl=~aTNzm)Y6 z;NJ$n-MU}<`Ah!*2q%P_?%reRAg?X^70z?zIQ%M9wwQzRFu?8zG`^u*rB**{ALTtb zd_VBPBNy%e0DlEL{uR%M+wN*EKkcBeFE-aJ$nyu{X-C@>03Kia=+X5m>uRh$tRLAu zKmHY-j(Tcs{{VdoKjByDjJRD*zcF5Fl3$~LuAG0s&01T{K}Y<2PmgI2_|f$|SN#3_ z1KLCRPX7S@6ibZ_yc{?ydh{$6f>@8P5B zn9uq9_y;{c$80_l0N*aC5BvmB-w9aqH8uYLzH5s9+0}*u-rSG)8KnN+)>H%b+o7JH zH6K>Tf6w2*IqCL06Yz#?ll`QJ{sT=P2(HIXLO;s6RPhG5!{yX2bM>c>66@$l{?NGn zKf;>BkpBP*J%(ZY>+b&mfGgAJY#)UBusmGbpTyKp@UL4vCAU9`stMy?5QXCX^X{~x z$6h2;gL}`qQucX|^C8}uXZ{slxDVchk7H3u@Vj2^97pKXi{t+Q5dbrGzxT)g0A8Fv zBKUJb83) zVStYLtc$-I-CRk$TEv9&!yoXiY0Da)zZLh1#+|fhIi+ed=-PtaMH;pNM@Q(&MhLEk z-^Er*ZzL;YGDRrEsBw~W!3MGKFP8d3@>`-g?zK;74PEh0O6^$A_B*?Oh!*jzXx4HR zUz7}tg~mGi(~pg`?<^^bSJ-nIk#fn#FbM5j5ynL*1J;^^K}oZ{UmNL-EROc`E65Xj z0iDH8L8DahR+p<;h?mSs70FOg?I8O48sO9gH1#7ido^+M4w(;{UM@mG6$p9%o zL0fuusb^~%quY9JJ#u|(sL}je;p;wUu|8qow#?TxY(-dnG}|gLi`|?EiO2A_nvnQA!t#CA1O3^mmT6C_e~0;tk)BX}X+a{r zQ~nSy54YW#Vf2_9L-6lLZ@Y6i{{Vr5RI@r>V&puu4*Ba#&OK|>{{Z1!X@p>1&-sH) zZ-%yK?%&Km-~iPu#*d%eEL@;~4({8e#ZoowXMHWB&l_)qQ@C zclQsJ^NeJ3)|?lSo|Wh);hTRBpudcC!|>AJecSkt)lFB|sQ3IBxf#L{=}j3OtGoXI zg>QN~UfZ9*)NSzNQO_4v=ku!i^$!04m~u0TIW)qgo|W4lhgzUKPjC5}Y504q4vzu< z0D(}kv_F_!tm4X$DKJ6Jc1Pj%t~z-q{s&BN0Bc#{BL4utf{(6I{$xHza$uYs8V4g8 zuB-kK9c!VABk$%42Y~gUc!D$k0Br?7t|d(Ek9I3I70n zib3GLX?XiGpZFM|V<`2K4n}iWBdDWjuABZ4&1W3ikNfCT4}*2A{{Y9QSy; z8ME}JpAYJw^J6#t^H1B-{$=-)>AuIZQAHJjpixB>08vF008vF008vF008(uSu%)7a zu+thJ;2)JV!x8Hm{#7Lu?!{z9_GnN1vQNsIZ0*ljQ2zkHYI-QU3nIC&v^{O({{X&e zzuDG*^X(V?^H!*$>@13(*;WVsT_XPgzG;U?(@$F{fA5;TMHgXYP&y`YLc_KkFOQOv@~<0yw|_0LLrSXrrBl zk1TJ5SkBw!{{X&fyZj=$0Qq;ZANPT;TcVF>!pDz~gm?Uta|u0&CZazHwLpK@K*Rmx zUdu&4Xu`*d$?&ULQ}P&_-*rZQ80)GsB3$}!748&K?HH_hZ~QAwfBtw6`|MK>!+#J4 z$C3DgE8S?L+A-MhmiT+(1R47)AEiWm6|bqs*k$9s+V{FC`$1UnU-(1y*V z_t|G(*WTx^v#x7k;#qOuYd!aK_m6f~3A(}xU!t5EPq6$4wte|U?wmIfa^wzl81uJR z0YV*m0~&)`FBd&8dv_mNW&UQ&g1#fht`R2&L}T;EsnsSy+<#BVU@4M;Q8P32LGy{# zmZFCiw!@7Oh&KuW4lbE6+`7n=c+#40!8&?d)Ut8I6HC`KHhTUTYQa^%%3TKtz_c z^6YP@jbG=cZ6>tCx&o{F_l<^jXcYh5>O(F$6-6x&78Vvz2g&^q-NVr=K{g6pdyM&w zPl_*HE=dqJbXlkQ8^fjk0+&7Qo1>Ork{hM+nAtnf*zsUx3L7-dS5T#(2Mh;&0El(-_kxux)~~ z4gTVw0lXxEt#9ViQPXFXAoZWne(4q*!bIi$l50r>u&2r>Nw~ z!{vV3!L~aP(A-ROC2C#OKCRoN9qgu; zXt@Jr0ZTmI_%w3b>#{WWhH9$r=GhboTAm=Oe3>l_StogX$M%Oc=7|dg;tBB4!knh-4CgndT`0D${`CR^_NIpg% zTR?T>S~{-jfg)=_U_cQnx2{A$B5%7KH&S0=Ac84V?a#X@`x zx1lcoh-pvD_vSf8QO0Tj+}svs4nNLicYc3S8qjhgc%Hl{4DQ0s8_hyLMua~;^^lBu zf;FM_j{d9G7zjW!{{O=ZJIdZoL`RkBd|R8r$G-c+37v1ge(D{l@k-|qKnomZL2)t*3dl$gYn6Q348dVI$JOe(XwxwUxe3hrO?-0N(lPpy(Vfbkpb%YYP7UvAR5=2h~b(?=AVUsBDSGNO1H30h|bJsSRl=FVKo#*q6#dL=5z3Te($pc{L* z6C_IfL$3gPbJsk)+{Rfw2cuKqn^m8cBw1SCarH~YwRF2|?CPI|rKiZk$4u&1N2}wy2}iP$V+E#i zz;cs6(gab}FSrW*5jQnz^7F4z%nbmC=wFGS>hV$mVA2q9dupM#KK^rAuAd)f&{2Hh zCsb$f|Bbm1HH!0iDc|IY_|v6*9=p$N&Fc*7p~**E5LVy!2`5JDY(qaTI<4I>0~)UO zR*dUs@Ht;$vDLo+dFP>zS3_b9`dl&y-*4Azbd!|7o?Q- zy(j=glw~Ws#_TSX{k{lHbqRT#zw_pwhV(e(TJNx7Aftbx+y9G~&=xA^J(3PW(WH;4 zyQz5qaO!J`I^fXGsb9n|*=?=g)@52)e5qMkYK~SsJ%&zmZvl|57RI+e);n5%bc_om zye{}@CpZ@}A$;hNuB@}|%P~6VE`TQ;|Ez9_Q`?Dojmd^p8dX-s8AgMrsgfer4thw8 z5%-onbM23L+3cl>_a!fP3B2N*kJgPXQ+htP*}*TAwD=h$r2E-S5=gP6N&uR zm+V#`2RamM))RqrzG&ZLFp32ujpECNfTpwLJ~|d8OL^y45OswJ` zCijSy1YmAO`7i8#5X{tXOGVjx!e2>k%YKRMLDalzs}UGiaNkzyeEte%8KxUO(Lu<8 zh4qz0v!=?kggJe*9uCU0i1jSEbo0@j5-vE)SID;6Y^`St{JRCNF4?V3W&o;DMsVAH@kzlMqO^*}&iA}XBWSKj$#js-=KPH! zcfOEV)*>Phe5T~SZ?WD;66&%)9>k#JL1901_Pl0B%@1ssQ>}z>lZL%0(JWfH2mGtP z{-Whf-6Q*wFQ-nI-2c#FQMUJt{DXaq(UsO$4L2O_r3XQUIk1|c2`O1}?FnF)Tn)*) zSr7oA3b_VKtfDPNfk6%Dg zNLWPXt*o59f})bPj;@}*fuWK0JDc~mcJ>bLA3Z!jd3pN;eGLu?4GV|GCnP3)OHN6J z=j7()7a$6YihovB*VNY4H~i}8?CS18_V)FUjZaKYP0!5Et)kY}H#WEaZ2vtvJ~=%* zzd&DJ{X-WP2>UDe01tY4bh6z|j^7s%k+0Z4Nv4S4mub%)!|HyJ zD;>g9z=IGpk`^k{Oc_26EfYJ^%&f`z#1h4tq{ktY!dswt|~^_s_~(;G;c&S;bx~W@^N(|*I_VdGv3mI z&Oz45j&^)v1@*mFi`)aT#kcT2kwDL}n(hT_MkEY^FJ(z}q!|w$1Sh$^t$mPW57sM+ zS7$I9tD?mpj4895tEZ|Ee3DTuvd#PUMIO>YHr6Vm>9hVwUmtIUR6mX+d0XdPCSJL> zFnJKURU-WhYeUmW6%8EFc(=s+CqgkbSw<3b?o*W#lLw0D6+X9YGcuJ&6?~?{h8wn4 z!-`gJiU+FP8p#Ez94Bc^D~rzS*M$py4y~zrHOhp_O7+H0S{?g6o>4Xi`<8YyK)NNU zjV=$sCzGWi+Y33k$o11Zd2#aM7iAr%^F^+Q-ii3OSU*?r-hgqD;OEH?gR^rF+xptJ zRZqa~&p*3Ot;+o^+0+WLdI*XYIU0+8$L(ym0G2B5KNBJQVqd2ETsy^&9N!(R9dh5# zK8-Nj1IS0ycp{p?mw=e(rA;7>hhphD)B<|_vmNs*R93HU@$G|z+XX+8D;DBad0ZKT53CW^M9*~?04mOwHcU80XCAZ`IVXl#wN0l6fR2jE=<=OeWysk_r+bUZAgd} zq6Q&>M0N876xF&b>~!NR&~U)jPB+OH+>K>ZtDk3UM%%aPl37+;rOSe}>UW=^(sTK6 zhQzqopMsy)=P|+ko_gn{>AlJ8aB_>s2-Lp*UkO@_Hi@$uS z0d%ogOPb|$rhi$aqgcV`F~IQkYr2gdxPs5SBbL3(9jCm!b5*d5PR3-CPxK}B&;(x= z+uo1cpI95-#b%NzEl=4WuB3nJcJ~)KM20nymB{9!;hnpb@oikBk|M&q)bBNB<(P_p z^tg9F9IfC|7!sWOyBUZ4y}1!N{(0_?lqaqa;h(btG()EZ(@||1SJG;fO#{Mv}y{BZ!F{Nfhh{8F<9pu8pvB^eAQ zy%Dr`IB>r+ zJl)p%^uU?x=HcgZ`z7}Ak9i7wQAR>AhgZh3k z#xh*RBi-o2UzrK_WGI4LazdD%cJO>9ji!3?S7;dP8QOH^<>!@=@HKS85vvd%6`x&! zpG1dp{oIargWV#j&?r?#gJTsf0kO2gX5!+(M8ekYDEu$xx!1MPQQuFI?t&PXb8g;# z%*c37&0?$bCr9j03sfU&evrfiK#(%+Gmv{7ASH<~)HmF}{pq~`OmE6MiKii38d24K z<(ZO;vehWo`!RoP zZ-H!Qrp=Ei*N{l32Y!_D%{5T$nxuGdfw&o}!K28W#)oyJ5?VatLEX;&vqerQ;?OJt z3C4xlc1Zb-kHz(;Z;ieyRF~B(&Nz`O6sxF@Y~Z)$g^#vZSW> zig}fO7x8zXC%4ze1z1*sWC@u`QP)oBPj7xs_&!A~vMGkjwj6P#Op8Qkk$xrVz3)g> zh)v+zqxIpnwzxaoyy_0rX-cN_o4CgumQr(=nLdBI!)DS~toCq@f_TZaGhj4KxFdvZ zsD=0D?UV!?djFv7s%}3iG|ASXEUESjsoty4nTl);%tycZYJL;x%h7mG?)H?97i2m= zHsu3R-!~39&OS7DcFjCHg@#MoUmRkJEOUM74mZ>Cy_ANT)qk4K#0YG+M)*&OdG?Bi z_c3o_Z!U@qA81azJiUJ8?d-g7V_*@&!g(zEm_mmrFCIj(10}?;qO(?l2bbt3S{VMs zFLnFW0UU5N5LuRKAj6M|)o{}2+z_i2|GVJKRD4@4Cb%j|bfb5;iLl8-BIHX9y1k3H zzx6*ZB7HnaZo%>DKCK1m*E8m6`J>!!BSL^52jrdZYm#_7aKhC(z?|feAActMYy8z; zwKKdjJdzMCs*I)C_VrdLbwXpHA8Y55_|K-+cw#Dh)XDBe6*Y6Mjlpo6`g4Ka6tgY? zp*DI#N{6XL;rLGi1vL_xXmh8W8>ZU~YjmeXluZd5Vbml57o2BWrpqSyOC(Aw%S0;7 z-~Z>N{3xHot{(;+v4hic77*j-2HPn{oRU!HUwW6sVQizDNW z>nzV0;gRpslHChOxrL zw5l+*;$x7zy2*I$%6K4bbTEmeAmx_b3LGtz|AdetY%?yD0&M0WKru?`E)drH-Co^D zmm+^~7f}Cp)EE8t#Vwl;W#p zH%}EjW!wN?NyaWxEAl*-g0W2SIkWt*eVcaeiQ2r@x>neNkMcrOr2lm|-l5HI>&qB>|cZC5Rq3@S@MOpQw z$!Y6sC`Q30v~_Rm4y0sLu8&fWY2o)$*b%AnlJDGE9pET1;M#B+{+;UicCf^?k&PoO z(c=$C$!$vOdZ^cD%o6mp!050w8cOA>Sgef7y0 z6EgR-v32)==Vj72o}a?87CdY@(YNkq+SeWm14j@w-K~K`l*&?X)kwk>>_E~or97%G zg4=A$pv+dlYDu5!#Pjm+%HgjbyBpg+BA1X#V+5=s=V_K zKAX5b8-lN7Z3Nl-&(;s|Hi60P5Q6Mc55yMBdMt=ZG}J|L^prak%iB`A+~B0jQ?s8n zm#9jNjQ4L9`+k@Z)6T!)n&Q5ppj&{Sn#s>TnVK-^br-WdqSjkHezN=F_2>6L??AR0 z#whyAl~2FWQHbX9Y%Xf2If(21H5<>bt4`u%1 zEr>k!@rsS`61QkDY2hl7MSO=te{K9+_DA$(RsXdYV4xL~amsz!fy-54OKPiueJnaA7W@wEw64&ConANMwLl^RraZIxiL?qb#B}8FBoTFznU;7`Mo#TAPWM0 z_^6^3E2Tunk@}wG$^p62tdUpHihoAoyaDTg0_zkn?V~TRV9z=ZK`S3Y`bjrN=zx`0 zN_#!MOe(Z-ftQFE+v_1$r%#*J1JzMqy&(Y!nYSE6g#|_3j=0&rdgyQjx}rx!KV0nP zDxqZiYy01FMMUX+L9Z2tSud^MJdG7$_$6GS*nFGQ#DaQXIVthnmwMD!9`#gc66eZ{ z>WNdcAabKt-t3`eUmG3AmV;5n`;_5>HTACB&nQF$naNac;1q|~*C(EOm&avm!ykD2 ztkjf0t!0CVUUN;}1A0;NH<21KIT&Xa9onuD6&+r6YW(Ipjo>Chn`>{LC^QSnIf4v{ z@U-55)*pWm>b>tV1lV1&hx-vw`@_1`Z)q#H(imRyxwu9_UPk)9r2CJ(shQtl*EW&Z zcO)R5><_S%P8QnOlO(FMiWlArk^c%X69cyM6iTOc>JM+q(lB1ymD;RkqtF zE;qGYt?1(8p%)Ch^Xh=%e1%uyRZ$UQlumXY;{s$)9kVTr_Kzbd_gL!e{`r&(U_KEa z#@>O3fUwqp)y^FV2E=m+50fzw+!$j@^BZ07dMX6Wh0FW|pmx3WCcL;`|K=unkpc7e zkFV?M0iHeU2!)uB2dAPQg{zr|o%WyT-W5A2*uX$0 zGix}V)9MuC;Uuf@q#i-#$!|cz(64b#V3su;SIP+dkVBfXqr{$N*+fXZ!AsM_t-hrK z5kk6b8L0>r8bZp`!7U*!*fN(YClJbf!QIL$-8$MaobnpEWNWs-?>G4ZwJ~F{#>nj} zc=e7#Nw@v3y(i^F;T;HUzB_uQZ8RsTRI8U(TcnvgW3H8Zlh5ly@8e$`<;0M00v=I< zASiNjrvGo!BDW|Kf7r=W-Z>@UBC9xZLW4I zI_GOmglYm`+W;p|cUq$>ws^tBnmoDfNnA9F(Q1vO#?WZGFd%lcgYzHBbdF&(Z zlZKl7v&z`#k=xoys3d)uSx545=)ae00(^Hhu0j&MTxMibu)7&79b<8o!LY$m_KSX! zeO?}@#?MzEtx94ShZ)dF_Uk^WywVQN^G~v4<7e!FP)o=EvHQU%nOMNNcAC5Ex|MIo z`H||f)F^+ZqEG{)l~Nr>lo&V#FjgPtsyZ7z$)3UX8>$KLPTQUmaZ)(1BG4_~EpMq^O%Q4`Ce7saMeg3|728|XU8z-rRVuv|!F9R0cV~uGk<}Y7WH-0y0t+X`p1%uQ|4qVWjLa+KBliCWaBRHHtP@ zGpQ(ePT~|Barl}I21ecy^ixkw58-DG%wuM7GUGCq)$mGfzaXSZi`SRgou{H}jeXfh^gFMOv=nDg{opejKz=D5@OX@8sZQRQqd2a? zm78;mf3+2#u7o^|O9=|Z+WLO4%2ymk2ko3DHL;`FMC7TmJH{(NtqaI-Pbd9K$~#x; z)zR%#Gk;t6>oeAey$zt1ee-3s|GxOGj~$nNdS(PhtHTko40X0Ry?sQn^VDTAe~j4r%42njUXBD%ZiAucsm)u8&oq z%;DGj{CtzL+9Jf_%QFddAc3E8xFOjHOX_nEgJ0eQWN7DMd&yGuK4w-vd zA2puWNGT*nHcnS>8=j93OY^D9`DPwoB5e>RRWJYP_oWi-MOmq9FvSHiOzhKIRw$GJ zL-|LNSd7{U^=Lkeu+zOzZtmT*`s3rAIajiKuX|Jg=fQ~}(i~>SiH<8WkU=dzRT*=x zh6=C*j!h|0QF7FaG*aRpcp{i&$GF<%>@yAeTuJ{;+6CHAER4m{h$kJFPK zl|S_HD1cTHkJlKIjIZ z3>GR5Wbb;nA#eZ}a=J&`ww6IR?eq^>z8tDdS^e14H);=WICe*3mdW_DzAP~wE(c(q z+R?~ne&zeKpDvC_aY^a@qnq+rvE!bBZ&!=^Sh1FUUM$lZmi99-+7FOF(0TRF7V_Wz zFT8-h&|}u)(3)NArpeR!4}dGcG7THVOW3c_qeM25V7yG@tNY#jM&d|C(2Vymx*>b% zsryP9gG#`Y9hJ@^(Fw-tXL8gER-ZoGQfL-^gd4-#|N3?`gV!m9Y@S`iuJl(uY9kI~ z&OKt*aC%~F|I^BsoLl>!to-T!wDR}=U#$Fb;&d*#4{}6rcHqvrlleKK)q^=AV45KRW8! ze?MY=ih*JN=9kIcQ3u{>P_){rPgr$`;Y zf|J~iHi?3cRJ=FWS}c zgwpCYuVSQ5ns**!k%Ar*lJCq2w3*dS^d`3B1vUkngWZny;EVxYHaFifSU+=;$i{%e z!A9w=2|R_HVn8cDiZKLdGZU9@rFz3?D@l6n@k`P7_J3>G3x_$rd6a6&x}|FieAeyA z$*~+__egsht~-_s9x`-QVQhS^n_B&5Kr^X?#et2gJWS>^X(Q&34*XU|8;a5W{@6Ntwh$c1$}Y2OlpyY8^QFMmMjBfgXcL1~QS zG(CaGu=;VKbR&Z%s?}!n)QhNA2;$#tx`+|4DfBm@0ri;estz-p3;|#fJXbIje?A)+ z?aiPEovmf44@DJSDD!fz`ES|AWl|mu`Ec)^6xW5eu+DqMR_uQ)c{(3%ayxTjtVsIg z{DfHwJtf9Ke4`bO)Ej^I+amJ8Hz$Lq8Zc-Cgm71KQLh`=`+^~~#yrxD=1@0L{d4Ys z2g}fHSFU|aJRWmA|D4EMYOFc;^dEiqx3VboNWKe9PG$`mo9}!-L6=IqCeaX`__d6r z?XCZ+>g9(7ee&a<#qqr~Q$-X9y5X*l6~W;<#Tb4p{&I@ecNJTgRlmQh@f8)y+aMNX zcvhyIkV|D?c?xNp0X?t8S!9IjPaMPpK1aTllyd$DwL*!^Dn{uQ-ETWm)Hrf8k?Nvv zg-eViz6&Ik%>J*u-@3dCkk$DH!YsX;XXtndRG-6Ksj&1-A~e z67}>$i(QYDSgh-O^ze)MRSwB0UkFPJoRcxG)Y0rCB;vCFb)Fqeu}A&oZ(_%_)vLc4 zFuE7L)#W+YKHk#4Za-Bkp`W$6e{5xNvE^{PYfH5zuIioScICmrUV47mBn9iVKm-Oi z*!VdWx18UBLWsl6B&M3&9HT4kbLVd(29H~-PXCmBa+%MV2Q6Ma;2qC0+IW%Ed_P&H zQz8%@akREp8zd2tyENAtFxTHFmZq>v@ZPIO)AZ|nI0Kk!yB$?0>DX0wgxk3s!a&01 zxKcA+)6D1BIAGfHf#>bY+NiRCcsfzXkC#w8Q)1IYOp@i1{HlN2n&>Sn4@G&73t>}f z5UqlM0Lpblhz$)1LT?-y8={LUj7*nijkkT?XFLp29e0Yhu9b;A3HT96R5Esgzu|Dtcs-qwSXw@_}kyq@@22=F+; zjEdQV3MExpM;4j+L0uFQh+aO@H$)>)kBoP&MV$oI#!;{A=R7J0Jx9}R(+Mg&0zW(; z2R&fV#T~5vF(!0?Z+GGq)J>xnbiasTE@@Z5wf7F>K_id%@EoUP$2`KEs$2rsE9foS zHv5m>((}5*+fr_p^QHs-PTm*Kq}u|h9(}>PPxOVb>E`GNg1oYg6f-Q?S)w`g&swRn zc8m+-+tesyZxl-7ps{Sg{x11qvzhDUJnRq&vl>5;V7_@aCZ=9KBgbSa#Z6eBh#gBO zARwnGs>l)l;eo5}3t_`*Em`$>rcS+`Vxae(ZqojDmewdvoUK`x_pkdL+8Lc-NVGtI zHn$a`66E!oDCrNwQw%#Ki=s)!30h<{zkM#iL-p}iVwqL+BeQM7WHcok$Tt^cRnH=` z4FFO_YQ6svA(4*$5>td}$2|D;Q=8rXs)5qj`#5ALZ@|ZQFbH#B9MakH6wPLa4nTc8 zJP3UbGu{f{yxrNA)um>xbME{r>%s8ApZjkXarLdto2D_&CizuAmH)xKHu*2}`ugpE zSl5lKng5e@ZE^fsp%>T5=0I+nseoNmmDww#3Ne!JaPiBuFA7mrAHSsi)LFW>TaDN? zuD!%_`S{*{ER=?ByrNIub9SxAyD64LxNq2>%sY-`)oqR}&bgx}mG-+;1+DAG^f4@Y z(6e^QQxg3*{0|}}QJS`QAQQ4XkQ9Xr#rf&RzWnc7WujIOhPQH*toc!39&LGTE!(#m zh3S)pdTBI(PFS-sUHnnjAc1ao4xTaa$O1wSxg4OP{sm()RW`O!5t$Vmt*$Kq zK1Qp<{BBy6I*wVt`@T-MaGp(hmR;Be$LkXyAA$BajyZqd4;mGBHNKQhpudBGP8hEm zSbNBF<_nSi2X@sIzDDojE$JU^)$CD|jAbv>++ibg#EJOp8ini{LirDeEdEmVGuvx_ z%@5|$rYL7miXvBdvzcB5_c8-=9JVqb{R9Ro7&p+l?nJB;ag*sm63D@A~l|$AJ}|wzW+I$Hh?qui$vQY$0XGH z;8Ljd5p;eT6E|e0fa9@@+XUQK{0o#oG750FFYj^x@LvA21WnlVj%|WMA=Xb%exD+n z-BH^jDL!$5lLalFV(8Ie5odB#{BE^yT6qb2La4|&h66oeF=+|?+5%1E59xAjD5Rl< zR|B1!<}_7Or4&lmueB~ECf@@<5^$!OZgMJD-SrXzui|5RNMMP=i9_RK7$LcS*B4D$ z<4L|Dd8GzpCvEk{%8WHdJ<${+fft?ZZLfef*pGckl-hK z0!l?f>nk4-oXqElcTp6qz0%`>lX-R4bBO4{%t_KRy#1kEslN=eU|Ps@Z#n~MiM zzkk+eQRztc6o|TC$D32ryRDVxNR*Vv2-0RzAwbo)w1Rm(s8XF%3Wtm`yo>kq)ukrN&AdJ<%He|dbMEM=CBW|p?yC#H(3GNZchVijy;0(9-C2^n zy{~&)a~7MC-Ap|BYUe`p^sSVG!8Dvg&EcI9EQvEZtm_*;s`PCQtra4Me{DKr2o=8e zAYV!~Oy^J2bf{5&RQzLnPj*=)t(s2u-jc__Tv0Wg*R1Ey7x^-(Ih6)WZ7+CLj#i0h zn#zsU>9&vL_?g~kS1NHP7NDfRxh=<0)<APAo(&Ll%e^U{T<=#57%)$@A-b47{6@BteBN|G05+xt|X1;8> zQIe8^^PEO~5h#~-TClplM+j9Sv|08FmF+s@BCTg-W2pBX8(#GSl?`ZIr}^I#q+r%M zc{)zUa{6S?Jo*aLb#vGSO-{?}b$DH$ZBZEQ(gDEbx{&S;n!maF+U#)`hJAk*chXZZ zhttX>cOVLPK?dLH#+PxIOD=g`3ojPf8+ph(+4vKRtUEm%?M>@WkrO-}JyzDVMtD>fECxDc-0-#7pblXzt%!_GJ8=mbb6!Gwo`$E~0; zjCq`U5`U@F>B)lJ_Lyo!I{m}#Xk@!fc*GGy$8-z9G#8&Zn>h?^wjEBp)G#8VW>+&o)DR7oK5j}^~a2`#g<;) zo~Bv<9mq4o<<n4M!Kb5!;wJa_K0_-nGtJNaGbqYG?G5jJalX!_-X1A)pVB*7T$HhgkPV5Aak|O{ zaqg;tuqP7Ce41+{zQIk^^J)&}Ue9-Qs{F=0`lBbJ9_nOaF7C1`pW)7>AbMWe+h(37 z8qUU=b6Y7UncWUuB_`XR(`|_<@(NNB6iNE3L^j|nCqn_U4F9C{fwyX!zuOBN=?_MO z{ao`LGO@>)o8SifsUD5Elsp6$-nP%OCF=R-Fw;h+H3MiFlxgWjn^&V6C8^<}n$0zs zq-RwlGa}rF2|QF-zu@@T0(9^O#~{|xUaFHyFD#_S{%p<@NvmyG{-kLg|WlhGLO||5(7x> z!$*q-!&O~XT~S5mnHGDN!7FY zPiFWJ%&RybuD0Iux{z$GZ?R6)P;etBKhbKrjI%IXl*GwzeO}gd zDdW*^(=72`3hSP2Exs)*bCRc?alZpR5-v?9at!s z7aCLGd-=^Fbx>=_C%V1n=D|2wck2E@SQjpR7eP#!6x)J&Pr(%5ayNB=w za*vag;%%Dm#npRBLNRlhj1}w#i7EY#N!S(qIY+L#OCn1lEU$PM?b96A<51siD)cfw zay+IeG;r7JpCD?Qc4E)53u>l9ByGl)c@}>)2u_AuYHG)+a=@1;6e}MZ*&C&l;c(b! z;&=PHs~xC=hn~s6r{|s?i6voAtIj)gkQTffE73h_B`L(+VXd#S{J2h3OM0 zk+l-j=Xr0Rz-0|MRNj>`>GC8k2j~L+_$065!KUfl(0Gql!NoV%M1HRhhO@w{I;oqhd0%vXN2%e z-4LUOftV(UyQZ*bU#a1Ag1I`&e(s6m=!r`H^Fktb?O(?ZjKbx@48nZ#Y%M|$(UTVF zl21Dw{`?9-@Qv>ts=jw1Ucrx&&}P9;d{$qYruKd`zWV|2LPT z>W6uHeBkTdLNuQG4S5=86z?b3L%g;^({@hHcjc)m@0xd7z3YbN?kV>!{DJww33re^d~+rs_7WIeNo{ zK$}rHJ;AN5;`k{?F!)YXQ~3FpKR!edd1Z7a-$B4tMW@h5%?zbeQ{_UxlDLrY+RM*= zjM$=$(@8AIX3>$0a@(N7G{3%c*P4h5mN&#h3}vgy`?-HwpMM9mex4z5 zS$Cb{k9i{eMWfz%QS4q*P4Ke_1^A+O8J>1Pw_dH9ti5!){=nK14#7h$yuUW;4z5Or zTjBSrdU$kMRA@#mb=Os<)o7YisDHwOr^<&@3YDfC<$jRQ=s4Cmjpe>WHB;%o(dHQ9 zPljhClP}i%kuG9!1LwKwQ9B5j=)ZL^(PNtLeopa%JQyOYq4%6)=!LmMY#EkU$$3sC ziIE1oG?+(sPu{YAtA+|;m586L!6`^?l~p|+s3Q^%O!Upn2<6&**&$14rA#nB8PWsU_A*39V1kUA;DXvL{|IJe6?`c2|Eh(1*s`wRY6{8qcr^O`2xY^ zx8k2C`dcQt^0d>Yaki0%JxSAdy(_1?&hjtN$rEQx*R?;c8o_E zQmonCRg>0tG)aaeWQN`v!#5Jd>}%X6FAn|rjqeq-xHOhu)lXa?g$hbT1bg!GQ|3W`&PHK_rs$hJ$9NsTOhb3+e`lvbpbRD^|^afnoENqFZBPl64VS zK%bSoI}oZw;6z~*34V`zTLV2RH}tsGc*VN)feywEAm095ct;OGyzI27q+N)e|7Cut zuJlb1J6t_JUhjZh-&9bUFbMFH#y!1pnDBWYEiYh=!L*_$S(7)5a#E(tIO_=RKpS({ zapZ{5<_w|R-g>?aN(>-bkAbNb^(fB{I6X28BMUt$01|~B3hx+-RS@1p?2Ar(Xg%4N zbmKPuBSN0x*!u5qGxJAwDw1o+I}np3dQw$FyUE@3C1QxG;?b)Ptz3w#AF?R4!;+nQ zRes-m{ap;co#e?XaA{dUxW2IZfZ$J+G>!7hu8+4nSGSOydEHZwq1MYY{#BiIEj^i{ z76h~K=e&yTRqTVtEYgF+(D~B51F~@optwI`2(U1@lsq`amd{(I9fkB2s zL*~(>w^nrqdvzaxxh31LGLXTmkyuj2@@By7mZqD+(1Fd2M=!&H&FFMn?_L@kKN%OH ziRF-VUxHaa`(j78uh#3yz;qoO@A8x>6}{(=q9?5KITT|YCUq&olr%^Sx~YoKOF7?a z#c%;{`I<|ltmqQIKVa7?NaUvAs-g?49j~28Q?r-OQVKQTl&Rxqd?^Nmwpj_SMdomV zbbz1mR<_MD;C=a?$&ZJNsH-O;h3I5S}Xg{7Iy*HK?`-(AI~!hyn(6}DCOoPtNq zUI3WtK!Ac)%Nm|u_Ns!vls!1i#MNXgoQTO```xOl8-``LXR~=1p*JE)yZ7M3r_hTs zU9-}~J5Z@Z>Eu~6asLs`P*R>Y5V~?W3DC_mgTV9D1xg=sU$L#}ex5A3K}jO7be+$T zp%|J=jIGd^eZyu_l`3enEOz!8Yiy>-Z=Cy|bsh9_tKK*$ffwwPs?4emp(|`rK%~nG zO5){nAX`@zxK~DHwjkzgs!0_~L1j%OdN$)s0UC-P;Ut|1LM(W-a z$b0sFaH*(FWlo?|ikFjYZv0`wF{H>5y}uQ@`RiNqQiIsEd_DZCg&x{<>5o7J6s`>& zvl0&}{lwB0q!EN)sad!1H>l#&BYiYK@J>~I;z6+PO}Iamr{>KWN8F-LOruji$w?%& zZEt*yFr5lfjPg%fv30%BJi8Rv=i7&{yXx}k-ht%rKoSKNk*K0Stw(zpKUH5k#m3AU z^$VDP{OzM_9AVOcz9MT1q*kuH!yBfecy?V1E0z(56Aly&)y!Inro1w(hXY^5BQhA) z`RIw!x6vbAC+l^+vL;{s-c70m>i!PAZ597X8|}G71jR~|azjv|Z69TgPNtY%b%f47 zxw}~iCFwrop-FEl`-A9;!So4&n$tv%G**p|g?UQ#J44a~W;N{Hp9> zO+Xl(Dkw6#Wt24A7>INWIC>zlAuZkA`TXwZ`@a9}zIT0K+vmE^IIiP74t~Z!T>cvh ztRY&G6qWcEAN2h?WyN;VBORwdMM<|BAEb+uikpChu5u)lzbs zzM9Kd;5fwH@7S;m4A8KxGUg{hGGxg(URHsq!Cm)$;y zBKW?`rFg=i|bX;?QRVdwD)tZpqX z6x@Cs*K`nQsk~*ryT=c^MdzX91IHQF=kB2kI?$)Ua}mTlXQQqBs4yAuZg3D3N5LYB zXn=x2=fGQ!9l3+GWf{qO9<=da9}ty&k4GlIg(yuqHbVR2in8>6!E8}MF%Pwq7b#01 zr3VX1&B^I4hE_PSU#rxmJHPjRXXK-&VAem=X;oo*1FyfhR*ae02K=fIY_x9rVX>up}K01hqkSZw|TA&RMx!E|YITJX`iqI!*CV3TCS3ecUo?iX+*WcJq zBX=U7Zi9Wy6?W{AMG-(fVo6gUukcdY^;jjzm4#I(%?IUr((Lt0?* zQo3ATYwso7i`AaLzj;&oYDA;IMg4$qg|-G?>HBCoO~$XlI^(LTYAyO@~QvgY)^I0@)~|sO18Z+5N9dlpEe%; zgvVxbGD7sc3kTzAE?st;RLxoQ%lw++v@n6s7;5FQ41$iS%yj)dMfX8?D-ELZ=DYR0 z86MOf3vtJuW3`c@gv`nfm{$@#g^M17+=FDWrXOE(9X<^R5jq{uI5j(v{<5z=id@L* z&P`Cs(B(r6|6|56_ZmBLf4p|)hO6$ERrUHI#nKC_eCK{?3m$`@8Qgux!TEr&-I84@ z6V2U^m9K}sy;js8Oy)&_s4TgMI{A6t8Oy%>e7!^vGbG%Q2Pzp0K>VhBe%tW9U@Kwg z7MUDY8rISp)~XsUko-m583;b`+ZWjA&{TjJsaVjUK4KOPNKZHxt~~u+7jD>IQIurQ zha>)aV<2}k$KU8{e3G7hu`;WVPox?Ztx?fnGQ$OSLT`Vz$(t_XaTz&oR~m0Z7oB8D zW>bd0e0U9YqUFV#n(m1;iLyB?lnC&^As*7lu!H8$v~`pam{b8H#-Rk*kSe4gx{*Z~ z!Rk?9r&t)kK-8GSQduPzUG7o~UVOv*E!Cc@6LURa zn7lJ@^a<5uUnS5>AadNEn=N>SNq!2CvniD=;91nk)*rfBzL_9{Pl-YG*G1QDn|yM| z^euAtdcJ_*{qw*YYHRD;CTYTbi4J0hUPc|!sS6|3clEj>D~JuG_ULbMA_#1f{|Ac^ zo*X-Zsa=8CNTBRDhpB4|=$Qr;U82Rp@i<+e;QJkBJ9N|B=V`IHS^Lf3(q~ys@N!i7 zJ4K|?ALt)&_DNEpZTCj{kpIvG#C-9)AB))UN>urE1$2Dg{!1~~g_*7#cfH66F#MOoCHNG2FTne-oqa9K_)xSN zT<2YRC_QH^f1ci`+keH$6;PUQ-kCGV|MXw;V|BcP6G$h0jkSf6i>cW!150b!@Ipei z2Wl9$6nOAL%B6g8dxfwEv-&&5KHc*>&F!V8W2v`)mbA6`!OBY(N|o5<*=Sk%(u3v$ z*{<;v8bU!wESG72Bjh3@_)n?gwZb{9KaqUzL^68f($P?bLnwVq8u4rA5xNsgn0TPQ>vV=K>zPQ}BRF z1%Be6{s|u%8hsBjZqiNhcLa*a6|h;j5I9{~&fP?vu(UYwG+{Z?f^yu}%3R9Imv zkJ>~NpPl8Dff4U&f0mfj-0v>8dx4E3o)~4!0APZ$d~iB?(rzi=?$`~97&@OH8G1>- zpj|z02fdih%4>eH?zU%aqv5A&*q%vR93hymF@+mj>o|b~dhZZ@{zR&TR_R_ha%Whn z8ra7(JnoY&O(M)j!;*xAE6h(X4-|+BeuJIzcmBjb~FPBX&(h^(|@uV?Gs}o;f z8NMqp9061qR>~^bzf*5gJ9468qn!%sA)ESCls1$}1kq2PhOzhWqnzju3*v~Lgo)c@ z@9z};T})xXvlL%{h15``U%!gfAxMdEv=B9N(R%!UDf>L1T)m>f??Yr*{QmaV6&*b% z;B*MUQZnAtBaJt1nm{N8Hsb9*`I^*)zX}&OAj^M%J`fPf=>!$BHmPbHzts-**%LHg zumgpSWz1)344DPV8hlm2g^$QsKI)2pB5Ul~8|YK=*-_DuU^n@41hv)%Etlmp)=obd zbccr&f-60#bv1H@6iEli@&;=AbHKDwYQc%;yH=#O=zYsyZko0E-D12TV|}8NMh!^A zXw5S7L1nuk+zBLJD$#B!I990dc+(hjiD^n&%6xRTVHu8#d@-%Dhxb`jDIGXAGwIw$ zrfjlQ{yd2?hSy7aje10&;32tH@Mp^-!KO>lFA*>bnq&cCVLoeRNCuR#jG7vMt1 z(#mJ~d*|Ju9*mkOQKGO%l66fUK@nw4MSVx-{%i_IY@f_#(dE{xWrUgs+6@Fz>#P4MR6O;=eq`dB#*k7k;~j8w^*)`}Sv~ z6V;PJHy-Qj3+0kC7O$D^mMa?5J{mWXZS};H-znRy<~|z9Pf>4IRi-LHik0>v#M|zq zy}a~CkHrNcO`GV=$JqBKMwVks;WYCeMwbdos;5lwBnh`+%mZDGGI~YQ9F&mfQT3wi z%n0Xm0^)dSY#k9t@Hviz*&AepziiNZQKtIO48PwNL@l;OCuTO(e+a~ zSDO~hm(|`j8dd?Gu(7JBW>$gv@x8%vkG#maFDeq-=Y^=wh6u*ly41fX08RJY!Uvl- zVOf~{snpB;NWBXyRtOubk4P{b;)NY;SFQ(wm{L?;VUc>@aeF*+M(Pim;y)oW;_QrB zh8Q5lGI<2QxK#C|alFcb93N5n5ol6JEr)IYbA}qCOoS0_Is7KY6{P)*c`&7tf@SD^ z!F=rPih@YP_lr3O&!}`eB#J7w8%88nAKky9k%P`fCq1ZHh0w86E>^5_oP2^*X~mg6 z_$Q+cbu!U*zdPEm{0DfQT@RIQgAYOf1? zLZDTH>9CG}>Y9Ae))a9zCOKA(5LZ%&7$E2gxtf&KiLtahB6Bsju5yiF81jO=as6sf+xANMy~qd3KsdhdJ6NH&`A5>+ z6lAkky~BefqdgI858SZN_MS8OCa{t`fAdpeo6LYd_T$Uk6rV9tEw-{aDxpm+^7Np zz&Ioo)@(MzYQy=nuZbSHNAs2B4RW#W!V<0C4xC&#u0De-CQ`4OLvVEO=$Z zi389>cpGK22SD1Oe-LteF+LG3`0k$}r*^d8Aa_K~kULyqID1v*%Tn!8|9b10k^}qA zy^)RSQ&Zum8>$BH)$;8IN?<^x3<8aEF6P)ol)QCL* zIzL)UrQx!z+RPN^;CmOBnN#6hVD4F}6l1P`ZnK9YkL}I}9PF4((Gr?}&}yi9FS@l9 z_=YJU(yPe>?|Ud~9~9CB|8u^!2%k4WKb`tOnOe5QG8o>u1>vlZYW@=Bu_wS53cdSX zM~VLBXwK4@F5a*)<(-5J!EZJFSkSZic-`mbq|(R$_1U!c@?-CO zGld*c6*BmSD|fWg0{ZR)_6;`KfV_X;PuZU%XM-QE{7XUO%sN*g60u<&`?o@_D$nXg zoA5^U$2*{PONN0BiF$^&#otVn5RwtfuN4|bhEzck(T$!a$~bU)7OaJSIBS`*D#KwxTVX0H0$Ie7$4Sb?2J zXYGWwu8$a_31N}W|6JpeN_IjBQqM3wd3dqZ|9hmom#H84=Gn&n-zP&PZi#xH_y6RpSSFDN^=fFvm!b%6<7n9Vn)`%cieEK4byN|t>9K2d_=ctrI4g} zq$#^NPU%w;tQT^9$AUm=?gm~PRIL#L3Y4x1C{Pzacxo8d5XLzBgI9~rLMQv?o!Rdt z*)8%=Nw)k7#pXM(WkQA+JiRNLgcC9+IlUnU-ejkZTYKTy?QvMtO%9DcgJ|FLmnc)4 z6jx}!_iR-iH~0#$nsMB*%olngELJe4U1^IK$@fyJY=2&rD6B=BPB(@bx!Tk_RQ0Cd zj%HQ%2vt%maAb?QiZr-Qe6@4?$*Ww@BlF=1ko>Da!DN#!M?CWy>7*|Wi8iWWwF;!4=;n;k%Kta|`6E_Q;RHxVmXopRij!Q>G)URERK*jMwP%dVI zkms1mrjnB1VRHcLSd+8FS@d#)A4!$(hHl=MjJP;v63qNy7 z>$a_-It+e_;kzldOC5;I<>*?qH~BiGsm;6#Rd4=vJP`y|mU36R;V5Q7^bW>Wc#Gjj z&(v?Z>-sW|Eh)@>XnRTf_jPWkdmn?Bu=9rLG$m;M*k;Ce0gzD28`l+|+v?mAtY>%c z)t$3=9HD?C6IXgb;fa}XFl7&Y7*~w!Cmppvy=Nl(Sih1O&_NweyiG!T(QM+?v-mqV z-!1!#bR9m5eSSTpiQ};Fw!17eOY@4XyJ1KI>!XvP6%TWODalxphVL zE8yILO$x3Br(+kDazBbaOO+d|_GNl%-l-An`dK}^W6#^mpFCb8_80Uj_rbtX zJW>#v?}PVh2Wni4S3w83!%Ny~uHt}0Bv$2BZh}!d63V@0#8q1E&^7{#Eh}(9BON4K zWr|bVcuZ>LQ6XUA5uwhTnp}mKzqOkWkvr8FH9!LKg#KmTxJWyv+PcX8mm)vj z@KP3NY)3~r*rtJrj#E?CU@-5$6wCtCK!TZYsAdRmg{Nd)P6b$954>j;0sjCYwcd|qQ z`2!)7tn@p3O^ajG%}3Z@vT2yJgZ?{Ct#9PWVl9Ko%WKhgT%K_Vmu3PKUwOpPb6NRI zs6zp6n;w0zMDEw z+Mq_NLOu{w?>>7|+WKO)Nuv_V^KMp9hOWhhS{lnHM^0%~q;A@||Knk^EilK2Ts-kV z>ckvZ zXx8J#jX{Y%O`8|^HIOv<;izgU-~ZrK5ku*N!GovADou)T@(6X=m`~;)RZV*7J+3 zlJP80__ZF9{or3zVOATj4nPOriDF^&wJ~3P;75NFOv|gY)ap=+piDZthf#GR*Q755 zmvl!{W<#im4`&d|IR@pHS1?q)f9;)q?jCxbHTzGGH73k@M+u)l{Trxj>N^)T6Z*9} z^5f)(Lk011u+?9-l&4`q_m6|M8dRd^e~yT&%-v%qa%$jBrm)R+H6*c zF^KmN8$%VlEO7VW@jZ-yEY$qKP-*9eedS$20l*w(g8GKbo!BG#LYwIJ^7eTXA=^N5 z3{NsoK9BDdCcmcdL2W%zQY$NQq{ITI%&R9THmCNX;#e6t*zefHjL7nZT zLdeG;SRr=;K;dhIEj|CTL}6@uO7AOuwJE6JAzhePydvtezm6(eAvf6To4@gXscOP= zt4$R4lAYzeQiK5cyp(-+F>Teiw+eqThU3OLY>woq&m8O*F}L+x3|J)Yh285bTHLSC zba&1=s~Cb`CN1Mty%Noo^1ZYEP+g2EeW$o&3j4)pHI`VPE(@#9*Qg3p5d6XP zh`mkMg5DwDTIg`rH$yyD^W}{`R5_a?Ut~h$|D_YRoDDo;iB~&Q)cg3ju(MQcQJl_2`&!1e%Y@5&AmkhajAXQRK zZ?D!-wI+{mY3%IV4yp(Y!*B1%hXVT+K`!fuV(SVpmtC{3DWbOMzRYQv*(#n#36RD1 zdjXL=Ly84aDv@##K@G+hy_`JNC7p{up6K#41_+ySjb@X)^BW;?>OfT?09)(@gAC>bN*F-E(F9R|6q$bc-8 zYv19HG=aIROi?cm1*hAE_qFlrjxIV*js%9h=T;Ip@>gxj3GzdklS;+eW2W){vfGt2 zAh`X9&?Evtr)$>eP)E@JPhiH!Jby0I8m|3I;l_R;6rZt^QGOL`DZ8bDVW81tWfWsV~h&hcAt|k=HoR3p+`ft4UT}X{4i4nJv!qN2u>bHQVYsJ z^q~&UEG%h)1gh%i(8m>VUrw~0S5E!XZJ{pvaM<8gd|8HNyfO;fEySpZiT!_WL%FzVLwaikOC5+sE%7hh>+dJif#;CpchD z)eoZ-*By?4K|Pivh1;k1J3(nP?BUM$T9?^Gtk$FKABQYe{VC8tcU+?E*~(Tu7Nzojt)7j$1v?XyJ{NzBTNSeZ(>n^zh;B!P6!l`QMYKql6Qsfn{W|ysxiq zNi)9L^0Eq1Q#ov@X;Si!3`+m&1m;Rul^+?33UJ8xv1jBWm*$p>7P%*|7C+y-WuWkm zTCnYsGeEk|&^~~wVB*RCSBnotEDrOdG2r7%rTRF#eYz0+%vD)%2;80SpybA&=%gGhlSvGv< zV$usqF9NB_fv&tE+S*XgEhy_@0WV(bi5V-r@RxMgxdHE)K)RQz-dM6f$-BO*m_B3A z5Z_WFo0Om?*3>#g!PbG;|-NirqWt;evI^r$)03iv?fO@cCPXz&y_j)j@alMBCc@l3C>&f zyk9>0L5d@)rHeLxAJJE9b=QELoG>(|rl2(D7>$6}O!#D;f{4ey#mS4iQE{9}Y)K5U zF75C;>5I7rzZO43oK`S-Kd$IXJvPQXnH6CE_|u5L;zdqgPqTB|JGgC=^cg9XWw8J% zUD(e(JZR#G?hgPQ+bl&d1$upNgBZRpX30a1E zT0g-EkQYMEyRoFu&Igbz$_yr(Ik4qSb8SkKPqP;LxwZMC0_;<#K1&cMNRr5ISd2ts z8pfU994hFXcMa{y2a1YDusfYIJ2#hmxBW|T79PA}Gk9+8JY60J0PLI0K+h4b7r-6( z-`mr{8&5BU{1k;1w?^w{A66f_UM6z~%L06x_O?ZUN_hDv5FT^>2pMd}xYJrjG>KZp zGQ~1o#z!c+r=y>?KPTvjnquc61HI4J%-S8d3N1XJeA>svGT~X~P?hvO#%Q_aZW@dP zoMg`prqp^58JOVa>9>q2x6q7LtwE8?s#sWzwHsTn%7Dt8yxvnQ`${hvOs#BMXGjfC zeAoI%u=uxgWMl)BKVR)f=Qp5>)A-FAiaNK6bSu3_pHE)G2%zrEI#YMRF$9mp9cO)l za$zfmc4w@#2z0&|`Ae3>?9lTDSKH}mPC4IjyTv2ye^I*W<);$5mLD5~R@?tl{6<%` zsT{+a$}V)ImHR3b?LX%}F^MF5`vvxX$^+AeSa{5I#}wsLt3_WeZUY?Nl{Fb;K;px^ z7*7>AB!VaRgF3+iGFww9$ReKfk^5>PV^JJ6yjKm8skM;CSba<4e21L5!vcB3LsVIW zY9X$6paR~}!buI+=THsF&e2Kg>g#s0tFnwcErX@cZ5k-cKxwvau)_yok*M{y*9%5t z9a&%6-SLd6Y#ALI!G}IXk1X3(Tgvz28Iyuz$uFg0I}>}s6)bgMcUF|^?TdNhA-1Tg zvan&J(MJYhSDRvPwTj?xJ?Q|M4?6u>Q2zch5@Kk=7<09%uuAUKC{56M0-B*3<^Xe% z{4;2BX`%Dh=?0VwqU})42^!OMDG;M5PQ_F25fG`{dEXlvut$`PX&C?XU8l$nX`JXv z4WppNjrsF|API_7LY|-np&Xrn zAI6fWlSxA&)QN8C5Oys zO9fk|9L@rvMMCXDPmLU2qRID|Th*|gaIxFC57I>iG0}oX;y(S^IyP}ers`n(SC7y! zEF)SLaU-{EjbAIjSPz8H;|K;{nbvYPJq*1cc^wtm!cFho%&{-EOcKX)G`4_M455Yd z#sQ;?O(8cEz~Ri54%1H-z;1OU-_OrW^I9r()RX%j{wfpcx>|#4?e4wj=T(nrlALYW zGp!P>ceAS8K9mH18?jju_tQ;YURp#Z7)`GJ>hxwRUbE5`%(`WUo-64WG$NYRv*4eb zn^?^NF{6)RU4?WX5N*&;TC9kF+o$%-=}zINyitwbG%=w8w3a@qw|i-nor)bWkJ;Xu zKGOw23$_@PcKxCAarnjsApiJZ#E=9chHG0^@P_V%5Zo&KUNi76pv(5I`9cVGPV)x{ z8E*amRdp3-I#$Q+r5C~foZJx5gM$hq7n{Fv^v6b&@#WM1cKS*FGAg<{G2FRC#$7YW z#zjbmjykGMRqV%oSkt?v!-{y-S2G;gGoUrfLjF{-6-TsbpFoj^Y{b-ZK_IlAb7uR^ z;`C~{(i`o2TD7Gv+l@792`Heqzw*cV&!1AuffQS~;7Qo8^mcGQh%H6&N8_9}t8n#g zfxtf?9o|-Ir$rsX9d&sBRXyjJnv~m!{s3;NbIo*z^95W*eWJ7c$c-85x6J29@I#UN z|5DiDf_5&nxA)`mR4138>vxA2=oeym3QT+o`E$pRYEjCXjEkAc^XPKc>^W4s(f!C( zWm+>N>bEjOk?^+`(6`tfb1+xh?>#{X^by0YeAD+=pAiJcvoxv^u6vY3p3yFYytfL@ zEn2fVyFo!o#jy(_{KiA+vvtW#x;FhL5iZ6RU#?2yzq~PM6cF@(eH+h^d&SL?eC_)B zrtfjO^3NNB+BF3QC-4(<#qY4ku-(Yp()oyL1EW-%|or;?mVYw-NaQ8LX zuob+XCLa|lXI?Lb8zQnRhJ`|FmD}AQJvZP3sn22AT)bXR_WQgKA6_@QQ|O;yrnt#J zavx*hra#UzL^SytRfEZWXqIjRhq)r!Y!T5L=f|JWv)Yqs{+LTo^HV?Wlk*x+rF?^tS$kNa*_)z9=b*UB{`*VN*wk%(Qwqw zY&KGN;uwcY?m=Q>5h^qA&~C(3D^a|Pdbwl?tm8&5`GLmBj?{m45{DQDRWeiaZ?zQA zS-sTFwxe2Zd(2Ss@YkWw#Iw@p>9$Num20oJ%LswZ)N>b+_=yFAz7fZ!ulAtx8-d7= z)t(6V_-ar%Ukmtjo||~RpIA1W&eLu|tqfIw6Q}i!VqgmZs~14bBz;yKMGgv%3h%2& zBMc=!Mh>W>D8lGJ=Lzb6FNT$c7%SFoQvuLq5Hrx)!GW?te{N*@Oe#R_@UjOu2_s-H z?*?W8F+ewX!|J~n!0;b#Sw9P{K7?K-3kQiF1Rr-d76PLMn(Qtq=WqU{7&$*z)Pudt zW91h^T2)$h5Z2XX4N#8xAiDy2$~ZU}%t6X^q!m`HAb=zg39wx3ogXF-g#=5tD`PSQ zSfDc2Z!MK)8#!AJ%_M0BTl&kUjdKnr#n;5%@`A@zzxn9&Dl@rRkTU7-LV5F~!yi=R zOTw;!&*Og4VZLC;H~X`H873x0f8c68$n&ki-g!rPP|$D!+Rf}RBpxzF*QUp-AX2u~ zh#^7jM4V3s(d6>F*2>0luw1{I__VPBytI%rN_U)Qz?$@LM&1hLsJ>6Ja#2Vxm5bOi(?rT&Z zhHLFZIC4ESIVe)GVwx3ku*mG3;)ukPD2J~tL+ZbZSD%<)Xh{`O)CH zwdr{-#|U+>M@af2<6zY*t(!0;G-aDGV z0kIDt13qi$TrOUodQ44b6fbRBHJDjZpbcoY{+Y}7Hgt1%3$ruLTQlO0HNx0{RXiV! zRDX(O>oBL~jDK!q_ZAheHB2+uI7UAxsfK$Bi$tXoUXeBj<6ep3?ct)Ek*L8qYk>_h(NsQbMsDNyPns+h0>r<*Z;vAC80=33!F@LFSxQz!#|0X0sZug{6{_caO1C3c7` z10UzAAma4h=1pMuCI52_t>k~*f$K$U^Zs`TljizGx*~%=K*PF^xp>QtP0sd-*$9B|M287Vs#b>F<0}R z>thxRGzNLLUlj=u>lQveXIQMP=&|97AeiUnJ{VoK=9lR*8QZ?d`nu|7ne@%f*R2%v zVJ1onjuEtIjA|k=fKF%_97Hp6Qcs`UqQ<6-(od@sXbH8%^w@cPuhNImY#KD$woaFx#A>Rx!M{_7;KE_#(nZEKs9QT(Xi zojWd-`FDXc6nnFF_-drEv=nQ!>_CLw=emBz92xgXc$%PneznSkpxSVP{gZS9DPflP z_sslbQa~!xk8e7D%_MCa{OU{ea7Yz^8w{rryVi^!*`zQ2_?cZWi z9j@l)lqX9Zb@a-UdK!{A%6P-86AV-5aN6AN+li0yJ=#9HegV+8a^!a^{TfLiTt_rd z{*fHF#shHj_FRI_LkDtsBGWtLlFm7Vx6I`2hvelYyxNl(yo2-G!ID+7^lA@=I`kfU z1r6-pbT*b9EU}1NJAmr@-!6Z-;Xp=@$jGDnd+cMAi;@*_lZi#Inp}3Ka-|9t;2{Zm zW$<>B(?+6ASa^|Z_?DJb=0RG5dNR@BU=_dGZQ_{g*S(clX}`MW?pdt)LfIr!cQO+g zqD>`*GSzm-OPGJy{5(hGn7n&X9G)-NFA>h)58IiN3>c9kgG`p^>UskalB@GB^24J2 zq4MOw3BcvcTu0W3mgh5w|KX?Kx9}QIJ_}}vXH3HF(&zAQ0=ufV-@nxRzoSI|%KYmB z1`q$jES4=HYX(t=F^0`lVd@W+e-ah!Z~l;Py{Apzbl?&`DsbbZbKG?Bdl&8=A3uaQ zNZW!hMdccowO;KliBWd+mqxGFG`YDe30FQMB$pWRjLaP6E_EYiA9R*1I1)+5Dg;=N zwoxi#^*edhBj*H^=3Bx8~(aM5i`;!hZBinzu1A;X_-UmnU> z3VU64wZ8V@BUCFH@BMhTX^pG>jMrr;E2<4!HoTYC+5Z)u_7q%R)D~_Pos`1y7k&1Y ztpeJ==deg}+-i!=nQ_>qY$hOcaq+8mjFL)tGz9Ye0`F{c|wi9{oKv-|cH zQ!5f2)~C0tr_Zc_jLp{=_%B7dH{q%4dd!6ocKi?s0FiHg7eS0$Kj>jNJi{e`O#xm(H?FUsLt7sJKE5OiJBJwn;Q3JfdG6U?Nb;4lfIE zvkdQ)a#WyX`Be>wb#|Y;f*zDjb*q(F=|+g*{T_aflbbwDE4r+Vl2vk z3^*Iz2WXIEj|s@rz;240%C3LND`ujss~y9i0lr;OwCe%2T7zX97j(*U0(m1YZM#H|PZ6>(@zNazWY-AOUmAzTU-j zTgP_n4UKQc?h|Lj7-T;zZ=grOK!R4p7c*xBGGJ`MWWIg~Zs3YGRe_edZcyd|2ex`g zpijR36zIhRe<_NQfW#2M18e7)<36Tx#TIHL{%&E=B>>Oc&D=tAc8G%v7OZ_j8} z4W&|3h9PgeRt4`=Dji~ZhySG*!ysL=^WGUsMLh8v@-Er}{#fnVa1_Sv2NX0h|ue=2bu#Js=L738lUhH7avV@J% zr{?khfr6QtY`OujEWVOs{kS29?{V7#Q7uGui4Zcjiw7~%rsp^%T1K}GXXM|NF0!>o z9XS%v*%>RPg9+Xep^J@tEjeGf8L`vw~VGjJZDI>Q523DSf%MTVj04T0%Mv(zY5isJ5AL`)W1G z|5SOsTQj2|BKvgCjnVBNu$nWC{L@%fPvijlaIOIHN9ov*Y&& zzWmVjSWjskpxfprngEpA(YD#%81f0%@Vd4_SoD?AzDp{Tj-xy2WN8jCWeDMq5z_sf|*=?~qzrPsvknItEw#hQ0 zpKD1AMem*6lnVosmqX7RMiv7!lLqwu9Ia@k!u=GJ+-j&1?lR9|^ByUW{(E%{6!?4S z*C#yd?jyNgPN_HeVvU2-wscGb*E$Y`mJYeM#HVVvu513k9G+)?R7`VIJ>upP(BD@@ zJv@N_2lT-cg9B-@mOX>q`eAXviY>9sAO0hBIUaR9=m~aMk^?yL2a;S6t#yt-+u(>O7rcyqudQ%a^+=* zeU?%9@4)h`MvbS`ej{>+xtSGPm1nJbVG+pQGR2EFP zDhsvD(1XfDAE;yn*eDaodCwB(C$($FIrVdR_cvk~;W*ly)E`6s z!!*(d*n6HGFbsI4QGgMWcS!H}X8^rSePB^?u_oYO>W4j2B{xneY6g8?MXU5o?vZo- zn`FtH7AyxvV_VUct3#a)s0EdV>X+nfDT>U>*dwmYiY!OYMn93RT0iP`oOS~F>!7W% z-vm;3Z%udoh%H3eWiiFO(O^%R4m`e}}a9>2p3jV;L#(S&lVKM5^WF zKPSReUvavdK)HC$G7s!PDWlvkBi+LY#F_FNhwd{SsW42MJ3HbwkNPek0RD7(P68g1Nc>Q0V1BJkL>~@8v=0kN!ts z`JK#)7`G4Pa{1G{we&*eom9Fcd*Ik z^;fbFL)HxNfGzG*V&NSp-T&6SnVU*4KO;lawlsK;itUo0{6yTjSeXWPtzF*b{+v{! zwNQ1Zkky&G!b%i!3nD*eqi&`u90R$rr_^{)i4`H=Mc_??6*qcaJsP9I%k?W(W-KB# z7s)YCE#Cj$tIZSNBbSf4^UJS3u$sRalL5F9#`yKq8Qz^Zz($+R-%J3$TF}sz>7_Go z8fw69VEra~!hd*Y!k^5SHkGG-vSvc+9$LORJtn;=J*`$f}Tb>PVor zz0MzSzIP@<>@RfmwLw`M1VeRsXc@?t?gFBBpi@6K>{@J;X9@Od3Qk?H&R79p^WOSD zKJv!$U7x`NlO+(caIX(fqgs6?n_XCWo%mNn%Hh)C;a7X=S#lCaIjCE(U$Y8n9WmvH z?~awWE`TQ|KSK5W^ndv@Wc-W{$fr!W08OCcp4moDpCN(k2Qi=HT`$suM9+e)f$VDo zP3XUDbKL@t=nQq8&te>wPBYbR@X>!W97bB!J&P?8=;eM3qm;(!cMu(9Q5~b!@22`VekJ*l<>LTyoG&;Z@j%p4Qv7~*3@njq z%)>ldFt?l;VhsNH8Z{dFm-2i_4!bHo@UbkAWwsz{H6E-LLkMt&J@kKILA$4#Y9zIo z&JOC_&MC8%;rS6D_UDJvQY|h=2O-!NbNTr{Vz??bNhTm#19y=F41&G%4wmo@Bjau@ zempmJrJ48q^PO9ur;Yrt+w&~;6qcWEK^lfKE1FyzU$#`R5OSvWKb))? zo%j1a=T^c=JQQ}3$lewxOF-$06|VL^F%|P4+)}JG41AiZyE^sU{f|2h%qL+AbBF&` zQu_C%m$k^=>`d$(-+VDQz3nQhWT~^khtk+~4J%1JVEv=puo!iDVAY$qCvaK($Gp4_ zZHYTcAA)J*f3og{O#+UccYN~1jEcqA9}2mCYc$%E`POCpy>(HDQD#l!hY=^Q#6beO z`qR+s#izH9zLgP-P5H<7%=>AqCt}eyYycZ1fft9@<{5;o?Np z0$1pBpx!C&4?NE!wM$n5T2SeW@g*WJYA%K&eE?FcA#{DcbwM)|A^8^xlVV*By+BO1 zEF&S}_k#m@XAG_rxopHWk0C$(p@p9^Fu?Zr^--IOKe>F1m+*yk*M~69R-@*P1UqZw zp`J{Qw+Yt6vq(DCkMMF~z)U%E$8@t{#89<;)^S&jn3F<(#e6BsX1GaMv46DfZ-4XQ z7I3c2euq7HeQqah{EP*NZg7?e#gJ^=gY6AfM&YFjp$qE65WYR?# z&|@BP_bX_h1zD!Z_fq=t6Db88M}!2|1{I24tfR*`OpG@YmH4Ew#v-;MsHuv`>nqCY zySb}B8n~1Gl$G2RHT)HNm=D3}l?e9YVI6}*@2i%PgO$PwD7?$J%%uFQuPIM@+y3zy zii+^cWxy@_fHc@djg5YmMi2@mJ#sqVdIM8eeg(Gqw9qsmL7OKh=?554IYhqOuLrf1 zd4K=v;wIwT@$2aw#|Do;rE;L8&R$F0!{r?V(D#l*gCB6O8MyUUk+H;8^+fzvpQ3=$ zY|LfKwYy40%Iw0jyr^_fYlT4g>Zj-nzxm0B!3smQ$ljoVj%k!4ty7ku}}dFANK z+neu8gQdECi`8v=GT{KiVu^Uvl?*;gHKvK@1*<2=Tlx*R?7|bZb)SZi8~J~0ed5@> zK?nd2PM+!xh`fjKx8>J;SkStGJaTYBKxyvgK#o-is@iav6}5b|Qaeuc^wB3C2~!(Od@vQFs~1g9OI zJSUfZ6HLDLdlw>yp)!Qra3h?o>Hc3&R~`s;_w`AoNFoYZ60(KY7L%Bytl7qlbdTe#Wy9V8<1RZ?8y8{?yfwPDex^LkRVaWL+Inw|RXo`UM3s^E7%dd<@ZFoKRy7tsA|Q6mMQzjc>Kx9#>uU&gULgDVnUM zjm(>NAJf23ZC6V#`Or3qVqwgBf?Dl<5s+>hi63S~J}$IB1x>VQ3>l5e}VhFO}>bx*c*{_bJ)qQwwg@bZo6T`G|z zwWrFhHV>w7U~cGaT01G5-Kq$4xDW>^jr(2RiJvBj+Di0^mbb1(`Fvy{&V2DNX|8!2 z>2p%iNpvi!Ngi7ume}-q0UKrJ9unKVac#2{_M<)-_Mor4>M!D!G6ez!>xL|-a!n;KDrthqM7_r)=?PK#d}qty z*wgA4cZ?&IPW(#whETdXFHRX{Xgy z**?5**+EId7oOSv5PTqlN=-m1b`-zsn`qAauqz;AYNk(8y7^Jo6 zZfBG3Ha)s`H(J0I6?v*9+oeA%{uKSohRMe($m90*& zU2{V=W>o+ao+#O4pxJF7x!lm(jvlUrK--Lx2+-g`m zY-}4FRCT1+-#V4vUN_Pz7csRuTGSJIxb~5!K@o~@ZIg8We=?j+hdOslZoOMOZguGa zDLg;n>BUdwR*QMd)73F}-k|9^pPGgTXudkGZ z!SP^j1Ou&t+uM%z-c~WOLd7JQ<`$bru5;Y%2~BNs6tG-hc>1$de)rUe={@_6{v~#= zqn*ZBzpO=w7&5!@IIqH;+`nW~Xjz(?N#nGM#!;qu8>LmX?K4IgWw)wp!FES~C6>i( znqdvi58b1fj3#0=%_efyVLuLdMH@qK9b}ag?>4c&_@7+5h@Hu(GCvHUFT_ZtDeD?MJP4}9Cdj>6;}vi&0MVx*n)g|KipB1vyp6w&i$_~Kh@vqsJT1S z8$|s}u~-W;ur4442-&-C)ptXQ11t^)e3s!P>SfqH*b{{GqdAZEW#Y$yoQ-+x8SK61 zmib%xj1{fx3IK!yTtvhueVXK^r*PXhfJ!h5yYw%ckr4tQ$v_{vK6be&kPVC}386sC zJq(He>o5=%ouI!MQ&?yUF{Sm2vi?0NzGk-XQTm{31Zscy2yU2ln0gzQqW#-+#B3g@$0ShoJeHeEA#5^QGw z)fIp?wETx7g$g33eT;$~k{|OoqwwdB4ozL?UqNsJmY{|}c!&IrNQKCWM%FIN_MRE= zib|xjpv%PdF*~6Gbk)8r77J`^5}(8W$>LBz6gGs}{ozmng#r@XnJa)%LY~vUFmYQ6 z#Ld<9>*QabGZXXmZhkaf4?4T#iJJ* z*?Ja}fYX5<`+pnxXOTY{u`xTav&#C*c5YuGfFWT3G>qiG;(F8wbYCH?tUeHREBXqS3V$=F7q4c$;YKzk!ugcv&4nxX8^6N zbrVamE%d@9J=sRLA-VBY+<6-~dCbwEnam=PC% z!6Poj3n4CmQ6Mf{k7^jqvIjjb3!NY*lW?U$wC*K4620DOGCJSO0)L&ECxoxM@+(Bf zoGI~;!Fdex1$rYCXfwqjhu6%6)e0DAxLD*ffce#XD6s$UNk1?LyivE-Vz08n#4*lq z2|W}EI1Yk3rGxIkdf1}&gviSZ1V@fFThM|;*bZnl1j9N}FVKbD~DAiL4wuQw7E z@dC_2y#s7r#jasLCUc*0D{l|GBTV-@Qej}Zcn z&p7ks+Bsip4o-m~RYMen=7cz5N+VR+NK27y;qB8uR!f3;J12RhoG1pe!J1aEuIO2u98{hR+SxeRVrDbLxrR z353B-$gFtHJ7`?B_8iY>X+>r(zK?)hP7G=oC^FCpF71*OWT=(0#Miu9PREz%xTA)( zb)nRj2a^q^vg#^zug)G6l}*QJuX9JU^h?84K3{h7o^j#byJPcqqv|iy?U3Qb-GP5< z=4v<8_P6>UkS*n|h)6U}wRhH}wTrN{>ej8}hU_u)xTh>gkXLZYYpPoKvlr?~x(oB% z^D~co-GY}RA&lxSG5#)n{;Aa`+QlPj{Zr#hp}9r^7UvyTU`P30gs+)$!aZ_l7N+HN zwT((v%b2P^N0)xf^i}gEX{87V)v0%IwT1aVM+`-WNuj#X8^77(dnRS`#Rm!<4pPgz zo|Rx;UlkyWa16axEKZ`1Cmo#!F<*6S=NBEqK0yio1=tTcQQwYHG$_&L0nW%HrX)FY zW1p6gN};E>s9Z4-Db1F+N&<_E+)6Qc7cM>Nne2esh}FkNlfS{I5@r;aoKI><7~H6~n82 zCGU;W4&I5#*sv?yoSTbYvb-wxVM#!SoMnqXi5&z93_t$BmcJ2KEl!lK6)OH66#mlrB zxIpr@-JDFHyC7!HbNF% zN(2^fY#jcXX-mHLT}H@7%3N#|m^A(=W5Ke z!3`TldbZLP<)5j{%Qoc@{ByWb<&6@&gwSUtL8YF1fx`qm-ewd2h?1H3`F+4}g^BX< zt?PVN$+imT!-P4EMDy>8)bo0Sa(c}p z2WtefjBxf|vks6|JKp@z?vy*ruxFS`kZyXLoEhl8g4`+vk9&MRg$}(4Ty|=$l0lG3 zO$WE|X#vZQME*WZqpcb;Rc8~E{JbcOd$KWW1~&=@7fFJ$z|_qO*)d)n{d6o?~|(*Urap;cw7q$`GGRP-TR|KN!z$FC22WHZ+)L#2&d|2LtER^ zI6*kLK5J`!r7ZkYfVulbe%*6q2*>Bgwtgh(G(7A%GUM@$4zeb?P1+Y{b+t+NKyu+L zC*6WRl4Sp_hxVjv9Vc)2DC!IkzLHgb)hkkPyU@FYnb}-)Ue&{q{(|r<7`N%`CVA^) zqBu+(Zr~}MhPySZbMB!}G1cY!q=FgY^1rFUPH2?qr literal 0 HcmV?d00001 diff --git a/docs/Images/Screens/CPUUsage.png b/docs/Images/Screens/CPUUsage.png new file mode 100644 index 0000000000000000000000000000000000000000..9cbbb25e1b23c124b515cd1442f71c2b5bbd1197 GIT binary patch literal 164322 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/ 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%0AX^(HW3}pOevj9lgP`hmiZ1AbcLB(%zOz98*RVB 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

(oZ+5uXlJ8giTW};L?kcQ`+q-g6z#lmktXI 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 literal 0 HcmV?d00001 diff --git a/docs/Images/Screens/MemoryUtilisation.png b/docs/Images/Screens/MemoryUtilisation.png new file mode 100644 index 0000000000000000000000000000000000000000..e88efbc4089c42a66e1fa846214f82031c285a5d GIT binary patch literal 18353 zcmdSAWm{b_7cE*g?!Iv-P~6?!-HN-rySuv-DGo(i+#NRVPH}hFvT-=P?~&);=iEPV zKV&6YAChOyWF>QqF=w>0q7*U$KEjtTUyx;_#Z^D+>(BBE2lM%q$)Gv;tRP%fr9{6} zPZ9p717#_qAoAr)T_WPEG4y92-bq^9^~)CwxBnD~O$!pQFJGi2WyD3kdl_8hBD$sB z=RWi#B?UuKqDk+wqM5--qhX^dETl`*{c4KR=LFYB*%n{W{JY0$7f^6r?Z2(28hX(0 zZD6qTr|{vdU(;^@m)o@nSM+&sR037$epTV>Qs~LInvaB!-oN<=PP4VK$XHOOj>_MD z9QT{$d0XVIeY||=zh_v=`}p__=kT~*-wc!V8!-<6O)oSdn=8cmL`YFzW4-Qj4*D`@Q!jo6F?+ z7RSHo0x0=d-@^&K{li0(yTeJa&d0*L2MM^V6E$+PBHUDi^ETGA5Y%l<4k2ZM(!3n# znVi@pr*_d(jH6@FJ{}CZXcZu4>?@_G`txqehhW$uXv=+%&cB#{y}(hZZ&0yWBl_1H z#8d1Ut{;m)gZg417&aD*@@umlLJ3QkjOj%Zeyq!3-@gWKrG01yhZM2(_iuR1>AXQP zRDrP9S3h6-Ew4Y#CTE^4yR$v5kZY(*^#kNb+2kMuMB+rOwSkh6C*zvCl}?!P90Pc! zPH@a|D9e>_dJEV3yQ5$>grzC80Rwf51|IR&*}8%CxlN%KEP97zFE_}1=j1Jli# zz_&B476+oC1msK0u>`*Y4)@baj$21T*~AzE_kY;@FKo`E10}rAA?^fhT$iBtmPF5X zo#Cy`MEz{Gdp45lnoAH}Pjh$K_$-c!QJ{tYmcd8l9{2Md(eie~vmB@KQgAW%JM7j2 z*mU^q6%^jIW;meBPr3DAaD7GWsp<_-zfEZ)Gwiv>@Vm4vGuv7mTmFmdv7u9ZC2lH7QB-@Vj&T#tvK@wgQ&?Mn(DmiYXEmY zm`*YTng`+%CM3vRzg~XvSi8beNbh5pWE|`fh?@LRwXZ==O60$;Pv~%gCetlxPg`1m z@LU898M9+H2Gxv6IM~|un3a;rChA9(;1MbUJ`ac9Q}5d@|Bkx1->gr0kn^}hj+?<$-R)RYatF(2 zF9u`6d40xd9|i`%1EaItMf_h!rYis*DVlwf9|u{v2e>dy(_^j$G=BYch2N zn^`t*FmNFH{9gN-Fu8Wm|Mz97nMuFU`Ea^!7xfm^k@pnhaOdBVkLC+A7?&E@wo&GN#l{(lu5u~pE=pI$2U;j|RoEoTU?ts!w z&R?PeWAC4fu$-b(QKI?4Ak$qN0q_^%Wi<$z(~OOyv=+?s;txB`V=7$-RheH5V%$kf&N#84+>?A-%}bMMXMt4iAdl<>S`l4MpAp{x}cL9C-Ij5<0R9Eh4FV9pvypz|LT13 zP<4C}8vg}c`nv>KlWEm4DS~?u(q8ib&MqdAOo>)HpUcS}L&-$1`a_)tL8Gkb`F`Uu zK;_|9IiVfK+nM{nW~&WiGU$XWn~$c-_rq{KVnxIwyu4qG_bcH>&59=ep6)Qb$aR4l zT?V60Yfuk!seQZq^hL^`elh8^ObBgdT)>@`B`r~Y;}92xf8%Wk^X0|aq$%KlPS{aP zdx|>}>mLSTK%%oP_2PrRvx}u`Y=@)@1HthDg-g2?;3io@%P9*N=ONrl$+P!Bo9FNgywatbW?H)A{8mqtB}qE!CcXHjCPLkV z6SmDD^yK>-XXoRcaD8Ei3OGTU)}2Ko@XA(;HsnwB^4b9g_^>#%D?u)uxQDPa^P@^+{I#k zQ2$V%*11f&YA9wSz_B$Q0$Tn?F<+2KLPA1XQL%XmCXorT>mC;4uFJCKJQcEBkcnyP zY2*~x)7C9um?Ke#k7KRrw?;oS=D@Yl_mG8n$=$JgtT&)KR?|8+=)c*Zu6K0M>Z?T2 z>HJ%(nby#R_36Be)h_TGj_3L#HA)^PVzZI9u(Q@mU=CUb8RMB|Lo)5m*K0qqMxj&x1PyM!Ne}v_x)^a{3F;4%c?^AQtf`wWO#c;W z#T1+x9F9eVP?80RGgM9-mP`NLXsUCLcVi1)zwf4=+B}PXOawe@TcB7vIsrtULu`}IPt6zS$Dwcqz~u? z$N8K_uY5JT>c8dFH!kN|Tb>&S!nf8#HPdtYDqajE?EkdB#QlJ50x$_hl5dTnYw8DF zJPa$(;bFLyLA?Z|CZ4PBZhqJa>Cvv5wX!xO>3PEvKL&ScD?@p7z4l%vbFJU36#PuF zVd5k=2fJ}+u!-4q>}3R3IN#$6Q4r{keS5F^^W#xhS~h&mk#Riw>BAG&W5h6ZU3xWHUtGlY#K||5x<9pBdg2nMGM^Hq( zZ5``;@XtN@&4umGrRb6e$G&C~hrU&46CBjb0gYzsyp(4_0a$|W21s2_i~do62fBaQ z^AOa-30umi2H!io^%MI^%(uLt_)s-^_ngR&Fr;WB_os*+iAe0g zLk~y6hpY0Wu~F}Nd^blU+xIub<>yYqP$}9uXouD|c~6jQHA1AU9J|{InR>O*)r!u( z8SjpNAW8F)<9X*)b^Le|-jT#XVJ;XyRA|BoCbVdSrsoBVkca{N)AnQ*=jVnrVuQ-d zoaFv9uWML5KmUscy30@0-PxQ;W-;n#N{8G1(ZKQLbOrH59>@iIj$Pyl-^PYxV%7wzyiw4*bFF3zj+K3El&}&Iw zw0}9ANDb?hq;ouDZ)=t-s>I(r-By8<07l==IRierL zp25n>PQsQc)=PVFY5dt~esM8a?taqd&9`4RtlB-+&NRv&z_diM+}dfGH8nyl*@kuY z$Iv6*mzZ9R(kO;?iA$tG`F0!P`%~`w5Q)UdIAH9f>A`F}ScKGDyga@OLwiCLHJnb) zT6I8=*XNDD%B6x(($VqjPZ>AGp~qh`U_LQV81?E{o(*H3v3CDYN6s86=c5n5Rjjsq zqiyah;PS^v5#3rwHUUa&PkM7+k5a~lp(H;(E}I4Ykdm9pm>Z6T1$~6?Q?8cVkq!OC zJ5qHI1>(HLbVCa}60!5|E9c0+&nYADtzLNRG9lMH{*W`R}W&jz5RL zHy`q%-mb~(*v7``Iufi<1ep#@gta3^C$FQR z9jsEkGR9I$^pW<|>%zpWgA?=r6&#vOAARk5T8n*rv`c++c$ATw2Gy_gSNa^UjjUYv zIGy2ihdj{>t!=Y~m~)^u>0* z*-Ogghc@kFm)VITFL%)oGr!~KzVYGCwTvb0;#=i!B&HsRlkeQ&pH*Vy+?(`d+7)^~ zBMeaU#`}0%LtKqxXTNPK@7f%sFsY~DK=xqtAD{eB zcOXt=!I5UIa*$f-^pLwNjxb%9+18k0<-#;|b zHk1s_lSERCYY-k+)u2yP{*AbEH?JMlm_zDS_f>E3txk_VT_iwf)38%Jl;rI!-|5hA zYlDs)THi4yDzujP}Y=XtyHGeX2NA6WqJ2)72$ z@}Zs&JwNH|E;4=LP#AD;`*-!(JqHk%fD4F8NojgH*Ren;biUIU?a~R%R?!)G;Th%?SKG~ZmfrjJ9XCUiR`DfKjg7G z1{b3U{mM7&H{0ne;Wr9FKN`O(}Nt9d|RaN8~UC+rR-1wkq@0Y_OUhX!UB)Oujm) z(6LatwzZDB{u0G2!=8Uq3l!a;DjOWE32)hvRsOLc4TAGZ`lk33X$hHYZ_&4>l87V% z|ETe7!2A{I@^QRoG$pZ;NiZy1$Wt4>Ksj{OuX;hiWE& zNW7M+h3++euJ-;)d1@_vuRQ#v1cMulPumH5reB($<{&jTHUAlGy?iEE$VH)Yo6M5% zVCs?Eu(-_7Cp}^HA!u8$U8@HFLLiqnnT58*nFxbxo#C%Z%W_>%&tnl%dstatC_loN zhVf=Mfm%nkd$oKaW$TO{rTGbM9>HaQ3Aj+3SWXRO3+}^>Tl8G)qu@nK3}?}*d>izn zEX`C`z_jHfH)WYCaWT?m49w`Wj};Cs{ZR~kc*AVWxp2`twQz!wuuisgO<9$c8D;B$ z!1%e)AJH+wuc4ZAfXrydpC;0N2YEMEGH(=ER-JndDwIO{q%A`f=;t=Lb$T z-eQbBlhKQOwYSmdn}e@N(UeFGXBd%Q1sh;vqrG}Ffs z!hz@+*5ppwpWBHQjmYGhtDf#&9w(avl<1CcC1PO#JJbUFb~6zkMcuEJ)(4VYe={ zu{U;&>+-6JDL6;xuUF6{FpY%M3Cl<-NdGrBsKYMjx2oBj#Z04(_z+Kb^>+X{T)wxy zuON0JS+qTHMXBRE#?RJh=Ej7Zgc~1}`;6&+HQ&YeUyfb^C%-9MO_$|%SXJRytZK^N@1;^Lu ziWeoLT8nFW`o#mC5pnJ>3@ZMhz8QF)E>JD1F|2Bn@~LwaBaOs%k)pqh179ZuWsjM0z3a#Z#nZ-95kwZ~Wo*ZaiE#7@04V}iExbe3gM4{#N0ZI;w zL>!BnIbt<=$(!~enR7+d@TG{QIFq7>xzl@_BH3x(b?divG-h&15WTRB>d2fp68-1J zN^5$^Y1-!UMNTaq5{KprkSDvs^K{g0bcdO|ia_(;S{v9a_VdQe-?t83m-FBrPz z$Y_@6!RRt&t?>?)j`R?)oI88E=q2JSQ)ihO0i%ld%$pmxu&F9G8s$_-qliG^e^d2| z)cDQTpJ^rxI`yb*Ob;_}zOBjQRm@TB3%g@?YDI*%)XaqpCjjzR*^Hgl{4dfP-wo>M z6*N!Xwg`2zy_fKFxfA-=s}~I=`%CU}HE48<*A?n+wWj?aVf8a|c-8pQ=-bbT+cxtx zV&z)0Lcbn&>G6C-U)1R}@&7P*^r>>*?p0=;(?8BsGU>XT;^Xy;BQvWHXQa3FBtpUA zLUG10t+O6-?S={Td5E%zYa_yxY>dES9qi9+-chZ38xM_~6tMFtqNsklllg77`%82* zZ4a|W1w0sDgrZq*QJ%%`-%NS98TgXa-p>^Xj{WIWOnvP9XyR^oz>&lef8>s%bAXRT zK^cubSljHj(T=b**&(uFHdL|+6RnQN<-#6MpDsL9{vw6L7v8`!#wxPQ17vS^itEK) zn^TQMT%89u1DpCZUai`0@a4w48|Njy07-R>2QL$jOm@cqMmSnwenEt;JWL-BTsMI6Ut^^!H?=cpP9|EMz!xB2JzYbX=_FLd@-C7j`yQ=+{g8q_-e z)^!zL;cFn^uyvfTh@rD2_l4j{$Mb7t4q9B)_ zCr?BsNiJGcgs~{2#L`QYujzWOQ$f^E|Ke3;K zJgb0h!#{g~Eg1>@Zi>u5#U9PvuF{F*Fbz)#Hh)2iFfN1odlbB&y`i8WsA0jYqP}A* z5=}o#x_yMY7d9N@O0{<)W$xn35z=*X*Q{eEHLfbLNdBh>wGY>FJf?&juOrh-l-%Vq5CpkI9&$&Yr z1)t$QCj#q)_A)OZ>42)Ls>*-=?oFdn`=tCv*IOZLUZ1HGK6<&bw`2$dJFv1JNvRMT zmfZcDN%%M|PCaGb5v9z#dhou)*5+^FSpmn@>o;yvc~$b{-p2zE(WLH@&PPdN%SXK3!1Kgn) zwbQqU|4Y?d-BhM`+!-XPmN;~y>OA_Rd@q<`9V_=xJbIkx|@KPG{oPD((nG@=80@YFphPrgt*iYcyH0AsG`4w(QlWQQsxNw0#OD2 zq21oS5XW3Sa}K5;43{9J`H@48ySgO%GG%nsy$|3iT6=ssTbyh)H5iQrS#)4qJ^e5oyA%ElB6`?mf3?6a`AxO-;!!Mj+c8(C-i z@|}%{!a*PnvlLj754!;q7cD&_g8S> zC?&S%1?=t0AEM=E4DQG8q~{DTmZLD|kKQe{+m9;eTTSq%kG5LML3U-Y7ZZ}fewTrH zXLfep7D5RzzBN6)7XjUn1fuR+{*2&{$>D~`1l^ve$i4q5m`V};-So)UNxf9y+ zyS9N257R4jp7x$VNUFeQ=u6j^+Lwgl2h_d48K{MSR5oL4cX592AjAH@}rw*DnmfyeQ(c-Hmzey)!!^kY( z4rpfddH*K#&0kH}sFAtP=`)-hO32l%^~pQ;$bajiLy@0Pll?kumYNs;L={uVNDkQs z{q|ORJuCPGrTOw-Q7JZHntypu~uiJ{#E;nv-;ltfh+@9n-0+TqY1ji za6H}7SH<0|R;o=dCYjH$B25 zM0kOCGohoWUR&>D(#uFJ8cT=9NZWh))&jmc@Bz+-8>*=ZM(P{;a`$k)K2z^d4qxph zI?V#pmE=x(|Ec${DFYjSLfW3KSlEB9#1faLFaNmo<+!50wO@BO;AG2P$PS{gJ$AW2 z2>vOYD1Hclg)J%I16K7uT&3AxZj}NCPeLCTiO#Oe?HcaU;UkHYea!-Uz)mbKTvr2| z`B=NbfxIw@kAkt9vGTahBT8QHkA%%1;@0b z(MT!Uh)G}LTm_+?-)Y6wA_l*VYEPrh0l@3QSezX<-kbeYC6mkbHt^~f=Wh?x-2OWg zw91}G$j(*uYF*|2{#4DE^+HH^QwMYp4<XLXF)|xQ-((PKu^=@#B)4z>9?f@furEv_hzv_JIjbqtV zxExv)#k%l6qM@ds;ajEN(i^qEA7l=Rvl0b2y#Xu+TXNtw_vZ5oquo=;dFZC<*Wvx* z;m+N+*HVSQ5>K5E{B|rOL4eES;~6h53JT~%p?B_5#ax>}47dYsbvmX7*5swG=5t6x zpwHI0@1W@6Zh~W)+h*%e$+j1lc?(N0?IwY~PihzO z9<&Pi@pb#B_i9MhXe_b^y6|P+R)nT#2eUwH0)yAKAMlJ%XYR|7`-0zd?#SFnZS0<3 zaBj}O=8v$4RXq6MOCzxs1kr4s%$F6Hm&1*Yj)GT(S0V%7ksX^6D_XAbnOXM6 zMIGNRJ<{2J_+C$gzXUsj?x)E<7H!hr z;++oBnMs1%hR~6&m8x`imt}-UDlo`PPBR}cdvXMgMUtRnFHH9Ieh@Yorp?# zX9fXo@H*u3E2Q(oF2=%NLi#D|jRaeN;Ncxv^bZW0r%1NYu~pmwtlDA{Xw$K@>G()^}Rkh=NpqMvrQ#7i(Kd1DwQ3h$@UfK_-I0auSO*gD4etJxw^_92QRzn(vR}{gPEAbHj9wG4vrWJt2;wvvgi(c zV!tPx4<>M#XLDWHA0F%s_qgmx4|;o*nZ@WDP&!`=68f?e@PHpsl^YdtfLmE{n4bJW zeU6vCbaIM2fBkEUI5|+W;#B?uszqjn>_Ly727?t>5aSM>*3cUMIz=l-6)=L7J)alY zH-8R2)mfjd3M5)C%y=ZL;1gcMRwofYyMHZS{KOmJ)yjXQSk>NN)(oq~?L(tH@(3=W z>wn3y{6NHSMO2HB>Zv1o*?a(H@7D*Iwl6a}cgP`d7X6B3_N{;EDS=71qIy{qxR3;abu{@ymZck)XBKcutDguw=BC{8DV)RhJI;I?rua(?~Kx&FQux|Hu?mSBtZ`X_H+8r`(?i*GAJ$AwK78vBUr& z$32++s>z76IoR@TO{G!J6Q1SkT%zTA6_Y(V?B$LsW!hoAmd}Fecob|dpT3|l&Fv?p=7n4KB_7UhPyY(Y6f{W#<`v_* zy*}5K7_kr=ynX|Fwxs?YE-CM;&InzHlumhaTN~v5$29O@A^N9Bm`Bh31-pTrlhJPeH3I(hSSZjeHr1F5$`w6krWD}lkTiE`Co?4ho)baM` zL%|+&SV1?kmvON5s7y_kW_UeEcXBVq^5Zxycf)Oa?&C-V&}#yhCew8ID=CXixLs>H zceE>wNxm06gR`F~0Aq-1)ixr95duik#u;kx@4#+*#KF#Q(?CTz!X=Tw*3Oi@02uO3 z9sulRmDSlx{k#xWvNguf=_=!*;ikM&+ri&opsfQ`!D4Ee4%Ty1 z8-*HXmKOz8JuVd$7c0~lhIp}vDUrGix_BVe!ag}EoN+8=TJ1TNl)3usLo}g%+er+r z>D`jK{}!lWQzJ7fNfPJVgeS9ZCABNg@GHVLn&c?SmJN7eukkAP=&2V%E(*9rRV+CE zFIHY+{5Vw;sgCfK1@L zOZ(taxVE;6Mk0i=N46^(IU)??9Kd6Z)C56JAuJo(bGjG>H?A@dMd>#Ert@lrweH+(9v(b_I`ysqnm){Iv7+H*M zuE_~u@4a&mqDm>P?sQkrm#xA0s*HNoW4WYKRp1a7Ex9-a~$}*$H zknALGonmvoJ>LFUL9LrOCb$zcN7%L!w9#u7tzj_iGVyLBFsjO=uT_k?76 zH~L~C)f?XZjAv)T^_OggDCObX%>D58UUyUqT_`*R-Qk{wzIcJp_J&G6a7=sRl?_1p zUgVX0_3>e?gszzPJ*mLh#ls4)hS;?G64QV_D*qpWz66qIp7+YT;V5rkA zi)GOUztDCBmnmSKTcA|B5XjAfZa-`X?1~Y(Ujqd zYmb2zdG^8nJWYBRePF9X zwkw%=u=nO3#!&3Ny^5w=->*@f-{RzZ=ft)b8$Xlb8XoZz;_8FHN`g2$pBh1Aq~qZU zNkMH}H)I;LT2)b4;s{wq37J6$op>)T(JyvwGtnw*Sz>F!2S4wdLH`VvQdkcxd8qWoZp0dY~49+b>>dD-1a(`ISHF=nxH$@%d?$&eq?I1_y6O;=0_E z_l%%{SvO6+z58T$*z*6}rBbzAP&x7oG@aaxpzMlSY8iBfwDo-Y`+C7cH1n2`lcEjG zbI*0VRya30K-^XGI7Z`d*KIRcOtvW+SLz!NP?q&w68}JF)xg#a#7S8xXnv#((Hl-6FHWprlcdRaq50ooUl5BOnM2b={hLgTETN$J4K@y&HPCCR zGacBggi^IX^_BjSllhzhfG4lU(D7^ z7xnZ+fwKC)m?c>eClTmG=y9MY?kv?XHcoFai)R398x+2}M(%|rtlwL<{s&qLk__ zmOlxy7Pei89@QECtlDux`^@dw9j?GF2jFr*)@0=Zbo1_OGCR0C?fAE6D<>zMjfYsYDwLx4oVO06_t zW@!IP+=3d&Z+d!fpy`({UIKUQq&OCW{vsoUt^>P-1cVe>p6TGgFQQZ}GDH6Z9@bqR5wIYf=fbg}f#@11qh_u>+8} zKK~~A5qUlB`G#8M2fMzkuQy*|aT_^(IaW;DT0?CQ>*$?!Ie_7gcsRO@FEa?4#9yZS zm%_}9C#NMuz9}e1Yq3@dwbL_aC;1pKk+@ZHKv3s}qF+;s*?OTPA_nP@tcBnAhREA4 z?Al{EdowuSV|dqIzbxtv(I;&nmi$cvEo$vRtS%@s{_2MdK=Kh2(N;$$mQd! zRr2*;S(67=SYA0S!!ZR=ql4Xr{kYtA-P&Me)Ji2K_^rLA<%!3#1?icW?l4V*rAV>p zH`HUKs4`Lkdlfg<@hfaG+RE)SSYG`4(;~V?(ZLi3cN|-8!%M&kQNFZVL<%a2tK5|X z-}WiYvR{(nxV-vS>a~G>)%Ri1-KE{hiRiVc?Gq-^%QAV3iA8@sq-dBYge!j7II1nB zYnwLDqbvgMoQoRk?b=UwfMfYsXbhvuh?$I?9!W_E#e7(h5+L}kVo^{h$u2{!$vu1% zSGxfa1uA+$x_V~_Zdp>_0{dIGb7e9^4&U^6W^Mec79^iSQ@DM6`k!TgplAp?fIwMvS^`=JQys!!Z z8i=+XBezW9gCSojr1Y$!A@_!2bk{1w2W)ohej18~GxE|Qch}E2_vDTUE`+C>;#Ou0 zqG5&S@pZU@i@HM9&h`E((u)zrqJ|xa>SB_NKsRWBi{=4rE7;J^zTcPuKx#4tRThHE zgHYh|DPkofWhCBeU&+Mr=3Fj;ycCKC8kSmQJBgnSdD}RGVj~;cSvuER-ZDM2R|`z?wo->&r5DJWu-9 z{G>W*i*~qpHzw_Qfe2!?KJda_pnxOUpJ(1;`#IZT_|sJpc}~IR&0*1-kv$<)Gudbt zy6Hxw)039X`?HIuF@R}8(P#U&4AGv1>58Q0!st?|(g=z^E}1~Vw!E62;}3B8=gv$P z?}n_y@7AimeyuEMA7=abxZfNsrCIhLUIYZpJnk@uHIM8Lt$W1uT6L^;rfwXiza%iv zsza{#(p|a`ykun)4Xpbi5;eQN5Ub?_niI0-_v(=Y%R34sAtgbgdS!@{qIPY@^vgN^ zC>0Jv2gsR6q!*P)ezDjqevBKk&x(6*}73e4_V5c z|Ii*6hITv(y&=33#k={LeRG8>UxO*XM79#xuz!Aw(=uUIVY}gNUb@$LCO5hhtE$Ds z;)A|S9wSSGKl^v|dEQ!#ZNZn2^k1{C=>G|#(XPB%e&mja?uTH&H}%`SWAqWzOdAHB zF)v)qLiV1yHSNU2G>||}tdV1+zqiVu9Lw{o$QU-l+AbC1#Hq(X+RJYFs| z%PIcI(+UIrT#5w{pHjA3f#9@i>t~vSv_oU9*d+;tL=YMFzK{QH+Tm2KUAbrdzLau9 zg@{+R9yH>7v+NbeUtRmPuSxPk8vR%bEr%hMy!Lpgf=&qOTE{s?H?LiN=iapwKqqiP z#(VDYF=GlvUk+_ye?d3WT)y0u!pJ(frfa1qHIDYjb`-3sxKr$(^um;QTW9w*JSDo> z2|lxjEw9+)*X`+a{83?@8hqJ&Zf1%_RU9*xNs*RO`(3y1Je3QoHiT3WiT8i3ul(yY z&m%PaCw$H)3SWxKD3_Cih}4qKG%GYep?g0M#*!TeMAj%QV>s2n8w3IlyR!!Y4O}|6 z?rf1I{y&y%LcB!nQo(=g-bAjVHfY@0SKx->w63+cFE8;vN~Jm8@71iRZ77RGfy`^c zdzkF$C{V;ou&~3-$VET?fyeCb}( zfA|U*j-)yy$@q$KLC{U0ch){tja41$T3bZq!GVxL3an$FhOFYi8@FLu>fb^A#?aQm zB|)fG!O>9>2_3Gd?$X)W##OOjk+^UJTbjI@cF$1*rVym2Y2;5rtcL!(a_O0Vs$DvU zk#d$wy=&jET7u^BYq`?@3UPU98PC{XB@>>(;uG5kmJ$#F5hsq|v{3!o7iQrwatKovfpy46mteq$*e*|sZ5Y?8n`V(Y>sq1?D} zcp>P`Sw~wAw50QBTlZ6n9)}l6A4;N?_n|50N?0S_iB)LmtkR1NAyEzLTv~SS+oCWd zyO4RdKq4Fc63rM30NB17+<|RI!%a_@ldqj-UvnO^WsEVhgh$4`Tw#^tF#$&%Z7zly z4D_mHVXk7TN*zkOa7lrT3b8sMeX%IPmhr0AsNsl&%Y+nyDYx6#TdvWqsX@O!4&u^D z)xuBI313;_T*ujr@X0mM$o2{u7^94ZQ|E&~$V^WGCPBLXNPmo#k`;n#9JPS zu$-Wc!xdq^$RMpxEPnCb5Y{S$5g;VrRtcU4R8-hyU{HEmIluPnbh`^DKR{y|#?87h zR({zrzIp815oL48=ieylYZ~CIW&d>2o=yv%;flm~hpB7;bV+;roJirBJtoy(>EU~* zKUZs8p_JNd&tD>JlJ0H84``(`mjp!*C?Xh_{fc|MTLDe{3sFJj*FZ@Bs2fLfKc2Q*L#KGH6MqV{Ep*q@scq0cfH z@^%i2sBQpX5Xw`dtPWlS1YoN@SLDHMQO-^rC}M%JaFt{3o5@plnK%!@t0p#v+>v&% z@of@(rU3bh`LVn>B^Ke^e2yg-mwk}&KVsqayO60+fi2Y>urmTpOy(4l+R2pkJX2oT$YO)p<`@)fQQl#EuZqukcq zsc|X_>m2A+IbrK`T9o{m*t>2995Q0-3uC0{AvpI_v0F3SL0SdG95+TL6S|hqJiGk- zI@Aq`igXO$Vi`Wz*4Ien8#Nn~kcW`piWXL(^iOBha~KcD$E-iQ61aR-8TV$Yy^W@4 zMU&b1Dl)jP`c*rMM*(T?Ub!~mFX<0qe*9C$F-I7~;M%^q;VN+u;4ENY&t35HYn@M3 zJYu^`JV#s*jS)>8Q2-?;30fTzy-{xh-@U+}Z(0?iy=s1i?K5#*M1I#9ISqd$*rgHe zG`R`038GOju$Zru3d9&Y`e#jSg2~r!zRls{{Ji+%Rv7AL3C~uKg_%m<3%dAgkLr?- zHKSDrDn!UcwJw&}{RZ6|lVLUTwI*jjVOVIvX&*CHS>y--Djyofz16bPh~6n@8W8!_ z2q6Z@J)*ODDvReQg;Jp$v6*aYGR7X?v+_=WQ0YYNt0+Z)4zV`Ba@!d?_~$$micO{x zJsu&%1c8gD$)Yk97=K=DCRJHxr;cF~Yx;~S(C{FXW-ZvJ zMzQI2R-(&HcwOS0Dsj2P6tP1VZ%vRx@e0LuP6ZD*%D(||XwuyB#oP;@GQV>|AWMQK z;B5IkqJBs-JCX7ENRtkNd>lVfYLt|z5oMZaEePxDAjxqh;e?0o;*!To=qgpi%(?6+ z9#2S*J^h4CYT56XYWT{eB-8Edeh>n^(Z-@A(5J z+XPFZ0TMF)OU~#*Z{ki5v0#HT@#Y`858-$RMzdkruTx2crZ?}^F8|5QC23wlg;XKm zE`o#}5j2d5i$l_mQ4wT7l`#h`gwBBxUG!A)-FV|(A(U5 z`s>;*XBSQSD_b3zyCi&2LwNToZDpe=>&9Xj@fy?OjnHx75NSrWKpaoquGW`@j-I|A>GJP0= zn8bv?%a8=Rd4Vz-4ck1&I|}EWKe7$>S|iz<%uU3Xp(o5T`5(F%dPOx{-L3~|{Jr13 z{8Lev*bBgJ(QkQa+fF60Q|v8og7xCzL3frVfTM~7RdHg$t*ERi6JnILqZq64y!@!2AD${E&pOVPaaVeA5 z=~AWWEvLn#ps@~oy? z(D*A0GXHl-R_~I>xf0)1y4`x~tpWY>g3W|}Js_2%(6n&Rc2M+W5(QrlgjMXASMk0b z;Pwrb3vsqy>wole=KoAE032o#9~5tx3NMw{)Oe?%sh81^%$cIiF@}a$)8@z#dFO17 zj}Vb-$Pr`YK2jSa39B|oj+|?*D7m%w-TS`3ynn&_Z#>`U`8paAgg099p5;Y$DFz@a zelu`$1Vq>)D0NY_EI|D@h~}peV-)$2dmTar?yGRx{QAYF^V6ZSt<+jqY9v7Aci1-T(9?(OuwL*lKVBCqAh+Ey!3>gx9y zJ3)17fc+-XWg3K|sK8_Th5ENgb*u?{gAR$q0RR`I0Wf@03wx&!MF*KH6$YGBqGfHQlyzqsLI zp7eURWVE{r(Z9Vi@CfQxqomOY(_dbWkq3GbMv9%a{bmLn4U~+Z#FOc%TYS3kB#sM7CUA6HQ7)@ISN553E%V za)*a5;^Q;xtdG+o({hd+?VkK1xfSan_G4-i2C}v^=}F9N*&vzM8Nj5Ij54b*VrE%T z&nBm7`UAQcZH}`CZVBR^saExWjfoo{!LuS`OVDI_2>4Y0!s9vR8>Jtx4tJHbfIwl9 zIQiRC6KqaciN5rhhB=z_1I{qDkaCGm>8~DCbX>~z6OWR~7)T;W) zbIF_#$V=IqiZsf#t;y59G7`xoP^nA#2gY7DH1dLA;`2qrOIORU;|6$7Wxc-`Y64U%9obD1+SN}&z1PoVMwA@A>WIJhp;DS(1(>ZGB`rhNo&+pIht*?K6U7DBc|V$N zeR`s;6thtd?_T?JpW>J&Vx7-^VZ{UxGeEZd@%ec#Hit7-<&hwe@{9Da#qj2=;+%_7 zb?Oz_LcadL*Gk|EXB(&O^ptCW9y8n$$RhH68?hnP@?5HKP1reApwAu87v0kt3)$(7 zDgko~NzZ94Ey>i(I$dxD*&c0`h4d(k6<)!clGevst8|f0h?mJId+PCVCCsVFKHC82r zj}Ia9x8vnS!0)P_qg*Za<8LkflN0bjT&?wBw3{8cauQeOXm8+kBs64E4-TJkSJw>7N5T0A z?ajp5k$q-mVV%*YEfqbTtswY@@lXCkAdi|pNY`wjyNiqd{~|L^m~Z6ArY-lb0d@p8 PJ3X1Jxz literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index 2418746..11d01d4 100644 --- a/docs/index.md +++ b/docs/index.md @@ -2278,7 +2278,64 @@ Voila. Ce fut une petite liste non exhaustive de quelques difficultés technique ---- -[A remplir à la fin du projet pour parler des différentes methodes d'optimisation] +Ici je vais parler des techniques que j'ai utilisé pour réduire le temps de traitement de chaques images de 50 secondes à un peu moins de 3 sur le processeur de mon laptop. En effet, dans les premières version du projet, traiter l'intégralité d'une image pouvait prendre presque une minute. + +Ce qui est compliqué dans ce projet c'est qu'il y a un certain nombres de choses que je ne contrôle pas. En utilisant Tesseract, je me retrouve avec des incompressibles. En imaginant que l'OCR sur une image prenne 300ms, même si j'avais 180 threads capables de faire cette tâche en même temps, le temps de traitement sera toujours d'au moins 300ms. Créer une instance de Tesseract prend également du temps. Ma mission n'est donc pas d'arriver à des temps de quelques dixaines de milisecondes mais plutôt de rajouter le moins de temps possible pendant le traitement et de tenter de faire le plus du choses possible en paralelle. + +Voici la liste des choses qui prennent du temps : + +- Lancement du navigateur et navigation +- Création des instances de Tesseract +- Filtrage des images +- OCR + +Ce sont les quatres gros postes qui coutent le plus cher en ressources. + +Mais par chance, deux de ces postes ne sont appelés qu'une seule fois au démarrage ce qui fait que ce n'est pas catastrophique si ils prennent du temps. Tandis que l'OCR et le filtrage est fait à chaque détection. + +Pour ce qui est du démarrage malheureusment on ne peut pas faire grand chose. Lancer le browser et naviguer à travers la F1TV prend du temps surtout si la connection du client est mauvaise. Pour certaines actions, j'ai fait un système qui essaie pendant 10 secondes de cliquer sur un bouton plutôt que d'attendre 10 secondes et cliquer pour tenter d'économiser un peu mais malheureusment, c'est lent et on ne peut pas y faire grand chose. + +Pour la génération des instances de Tesseract c'est un peu pareil mais pour d'autres raisons. Comme Tesseract n'est pas "Thread Safe" (Ce qui veut dire qu'il n'est pas paralellisable), si on veut faire plusieurs reconnaissances à la foix il faut plusieurs instances de Tesseract loadées en mémoire. J'ai donc décidé pour une question de simplicité et de performances de faire en sorte que chaque fenêtre de donnée ou "Window" aie sa propre instance de Tesseract. + +Vous qui lisez ces lignes êtes peut-être en train de vous dire "Oulala mais ca doit beaucoup de mémoire son truc la " et vous auriez parfaitement raison ! + +!["Consommation de mémoire peu après avoir commencé la détection"](./Images/Screens/MemoryUtilisation.png) + +Ce programme consomme en effet une quantité absolument catastrophique de mémoire vive. Mais si je l'ai fait c'est pour une bonne raison. Cela prend juste beaucoup trop de temps de créer une nouvelle instance à chaque boucle de Tesseract et c'est encore plus long de faire toutes les opérations d'OCR les unes après les autres pour n'avoir qu'un seul Tessreact de loadé. + +On peut parfois arriver à des chiffres qui approchent les 4GB de ram ce qui est absolument RIDICULE. Cependant c'est un compromis que j'étais prêt à faire pour avoir une application qui soit plus rapide. + +Je suis absolument certain que cette solution et les autres solutions que j'ai trouvé pour ce projet ne sont pas les meilleures ou les plus efficaces. Mais ce sont les solutions que j'ai trouvé pour faire en sorte que le projet avance et fonctionne à peu près vite. + +Ensuite pour ce qui est de ce qui se passe à chaque boucle, la le mot magique c'est "Parallel". Le traitement de toutes les zones est fait en même temps. + +La structure du projet en zones, sous zones et fenêtres de données fait qu'il est assez facile de venir paralleliser le processus si on les implémente correctement. + +![Diagramme qui montre comment les zones et fenêtres intéragissent](./Images/Figma/ZonesStuctureDiagram.png) + +On peut voir sur ce diagramme que la zone principale demande à toutes les sous zones de décoder leur contenu. Ces dernières font l'exacte même chose avec les fenêtres de données qui retournent chacunes ce qu'elles contiennent après un coup d'OCR et ensuite les zones recombinent les informations et les envoient à la zone principale. + +Tout cela est très bien mais quel rapport avec la paralellisation ? Et bien comme chaque zone de pilote est indépendante, on peut tout simplement faire une boucle for parallelle qui appèle toutes les zones pilotes. + +On passe de 15 à 20 secondes de traitement à un peu plus de 3 juste avec cette technique. Alors ca n'était pas facile à implémenter car il a fallu programmer les zones de sorte à ce qu'elles soient toutes indépendantes les unes des autres. Mais une fois que le travail en amont a été effectué il est très simple de paralelliser. + +Les filtres fonctionnent de la même facon sauf que la on paralellise le traitement de chaque ligne dans une image. L'impact est moindre qu'avec les zones mais si on teste avec une machine assez puissante cela pourrait faire la différence. + +Seul soucis avec cette methode, cela feut dire que le processeur est particulièrement solicité '^^... + +!["Utilisation du processeur pendant le fonctionnement de l'application"](./Images/Screens/CPUUsage.png) + +Mon laptop ne possède malheureusement que six coeurs ce qui limite pas mal la puissance de la paralellisation. Mais je suis convaincu qu'avec un CPU avec plus de coeurs on pourrait arriver à d'encore meilleurs résultats. + +Mais cette utilisation du processeur a aussi un inconvénient... + +!["Températures du laptop pendant le fonctionnement de l'application"](./Images/Photos/PCThermals.jpg); + +Donc si je veux commenter la F1 avec cet outil, note à moi même, je ne dois pas utiliser le laptop si je ne veux pas me cramer les doigts. + +Si je pouvais utiliser le GPU pour accèlérer le processus on pourrait peut-être avoir de meilleurs résultats mais de ce que j'ai pu lire, l'OCR n'est pas spécialement un bon use case pour les GPU. + +Pour conclure, je dirais que ce projet est loin d'être un exemple de performances et clairement il y a des choix discutables qui ont été faits et d'une manière générale si je devais refaire tout le projet avec la performance en premier objectif, j'aurais sûrement fait différemment. Maintenant avec le temps que j'ai eu je suis déja content d'avoir pu faire quelque chose qui fonctionne et qui ne prenne pas une minute à traiter une image. ## Ethique du projet diff --git a/docs/jdb.md b/docs/jdb.md index 62eff8a..30b86ff 100644 --- a/docs/jdb.md +++ b/docs/jdb.md @@ -3111,3 +3111,87 @@ J'ai fait un manuel qui décrit à peu près tout ce qui'il faut savoir pour bie Aujourd'hui je vais continuer à documenter... Ma methode pour l'instant c'est juste de remplir les titres que j'ai prévu au départ. Ensuite à partir de jeudi (je pense que c'est à partir de cette date que j'aurai un peu tout rempli) j'aimerais bien relire la grille d'évaluation et ensuite faire une lecture de mon journal de bord pour vérifier que je n'ai rien oublié. Et le but c'est de finir la doc Vendredi soir pour faire une dernière release doc + projet. Un collègue M.Briard m'a pas mal aidé avec la configuration de mon mkdocs et il a développé une extension pour ajouter le code source au PDF final. La il est en train de regarder si il peut trouver un moyen de faire une table des figures qui nous est demandée. (j'ai plus de 200 images dans ma documentation alors si c'est possible de ne pas avoir à faire une table des figures à la main je prends) + +## Mercredi 7 Juin + +La je suis en train de parler de l'optimisation de mon application et je viens de me rappeller qu'il manquait des methodes avec de la paralellisation alors je vais les convertir avant de continuer la doc. + +En fait je viens de me rendre compte qu'aucunes de mes methodes de filtres n'étaient en parralel... Je ne sais pas si jaurai le temps de le faire aujourd'hui en fait + + +Voici le code avant la paralellisation : + +```Csharp +public static Bitmap VanishOxyAction(Bitmap inputBitmap) + { + Rectangle rect = new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height); + BitmapData bmpData = inputBitmap.LockBits(rect, ImageLockMode.ReadWrite, inputBitmap.PixelFormat); + int bytesPerPixel = Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8; + + unsafe + { + byte* ptr = (byte*)bmpData.Scan0.ToPointer(); + for (int y = 0; y < inputBitmap.Height; y++) + { + byte* currentLine = ptr + (y * bmpData.Stride); + for (int x = 0; x < inputBitmap.Width; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + int blue = (int)pixel[0]; + int green = (int)pixel[1]; + int red = (int)pixel[2]; + + int max = Math.Max(Math.Max(blue, green), red); + + if (max > 255 / 3) + max = 255; + + pixel[0] = pixel[1] = pixel[2] = (byte)max; + } + } + } + inputBitmap.UnlockBits(bmpData); + + return inputBitmap; + } +``` + +Et voici à quoi ca ressemble avec la paralellisation : + +```Csharp +public Bitmap VanishOxyAction(Bitmap inputBitmap) + { + unsafe + { + BitmapData bitmapData = inputBitmap.LockBits(new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height), ImageLockMode.ReadWrite, inputBitmap.PixelFormat); + + int bytesPerPixel = System.Drawing.Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8; + int heightInPixels = bitmapData.Height; + int widthInBytes = bitmapData.Width * bytesPerPixel; + byte* PtrFirstPixel = (byte*)bitmapData.Scan0; + + Parallel.For(0, heightInPixels, y => + { + byte* currentLine = PtrFirstPixel + (y * bitmapData.Stride); + for (int x = 0; x < widthInBytes; x = x + bytesPerPixel) + { + int blue = currentLine[x]; + int green = currentLine[x + 1]; + int red = currentLine[x + 2]; + + int max = Math.Max(Math.Max(blue, green), red); + + if (max > 255 / 3) + max = 255; + + currentLine[x] = currentLine[x + 1] = currentLine[x + 2] = (byte)max; + } + }); + inputBitmap.UnlockBits(bitmapData); + } + return inputBitmap; + } +``` + +Les performances n'ont pas beaucoup augmenté mais au moins comme ca c'est fait \ No newline at end of file diff --git a/site/Images/Figma/TimeRepartition.png b/site/Images/Figma/TimeRepartition.png new file mode 100644 index 0000000000000000000000000000000000000000..a9c7125defb5ae05cc5b398efb70cc7460298b49 GIT binary patch literal 16423 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 Ws@zHVqoZ-T)~A~K8ugFtqy7hVUIknL literal 0 HcmV?d00001 diff --git a/site/Images/Screens/AWSExample2.jpg:Zone.Identifier b/site/Images/Figma/TimeRepartition.png:Zone.Identifier similarity index 100% rename from site/Images/Screens/AWSExample2.jpg:Zone.Identifier rename to site/Images/Figma/TimeRepartition.png:Zone.Identifier diff --git a/site/Images/Screens/FigmaLogo.png b/site/Images/Screens/FigmaLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..0eda24a6b1ebae23b6aec0a02bc0186c376cc871 GIT binary patch literal 13872 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 literal 0 HcmV?d00001 diff --git a/site/Images/Screens/ChromiumLogo.png:Zone.Identifier b/site/Images/Screens/FigmaLogo.png:Zone.Identifier similarity index 100% rename from site/Images/Screens/ChromiumLogo.png:Zone.Identifier rename to site/Images/Screens/FigmaLogo.png:Zone.Identifier diff --git a/site/Images/Screens/MaterialsLogo.png b/site/Images/Screens/MaterialsLogo.png new file mode 100644 index 0000000000000000000000000000000000000000..29f1b104ab16b20fceddd3e6d2556acaa9c34c69 GIT binary patch literal 2302 zcma);eK^zWAIE1N&M;41wX>Gkggmr1x+dz#651GHg{GEK)Fxti`0f0hOk*BT7&TIe z%^8hDjZ=}1<)M?DTH{2~5pfMak%t)S_x-xg|G(cK_kDjppZooJeZJRyf9~u0X8HRa zHPA!pK_CzVGRY$lSbM+$(*b5_Nd0YK(Y-`E$%a5MSa4`yoIOqf!R?nlLoQQeBQGa0 z;?F^nl9Kjbh+(lK7?;lNjg61GIr{?&0)gd_Jq{mFF8j~0YfkkEvyAyQTt{lQa}V;M zpYusulBr=$LGINXWmLD_)ZM8Y0pESl{1OgBBZSkdtCRT{ttBK%W0 zx9cSbmRifcus19k->R-I5+>_srX3O|loxSy>hZvR7kmqdg%#O)-E$5D91PKSvk%O&< zajI|KBMlOwAusN$H5n%yeB1ZnOpd9c?;HKGYHO%2&tWOGI?Af8eEQV+ZUw%zR!U?wR*))jJWR#Z>S|Y@f3JSSmUXtX@lzGLq|{7x3_F zk`q}&@;QXI;u4Zdk*3jfE3ac@pfOjldyhhK}8l9&YD3%Ul(tQKWy|8b+Dt zghn*Kar1tztbI8Wk#{rw+Uue>0LkuN66;;)it`Kdd^nsU)w{%cS}@h`Eu?A3v7QR- zjKx73?@;rif4A9-gS?_zx^{mU$h2G1?{JW9dHaZP+wNc2%|wPgN%7~aY?kGXF)Pm! zT0tCZTrf>Y0<5wW)0jL;ymp6jNUhO3Tlxb(J9L+ztYN56NmI=X{Jn-Gc+Z4V~Waxo9&x~W;ugM@*JBSCc(CWK$*ofNV_w&Nz3GH(hBJyEt?L~GAkxQnbQ647@-ZLlgke7{vh~ zErd}G$`B}!hSNJV_XjaX+p+0DDy*tv@|ax@S{?Ri9(ul=09^x1as6- zD;{_l-y8RMQn06p=%jGws43U9OPOW~b;*!ulWR0r?Vj6CJyp6p8&AG_UHJ8v;rC9v z!kGrM<4@!JQfA8@i5!jqFC}IbZ8P2VIGm4c&K!m zjKl$H>WhYQpRdOSen5$STN;wyJQ<#V(4*GveI=i3ay!{r1(f?}r7yQ%jvn!IXE2Kk zetD0lGNe{t&ayUc`0Vc`r0utC zvsINg^8+s;>1=NDHojs_$ssE4^*t~zV>etlZPU*mCG5xyzF^aKOgbHz=v#=$P*9Nc z1#WV2I?&&o-+TA2UWv0Pn&_D8bqQ9($-+Sca_spp6-`BM_On+9ht`K(zI?6RFC5%P z#(Asj*t6ZO-Ptv7iLD)#>ozJ}A!nm}#)3$}50sNJF2cr~q;{O|?h&owTSqnL z9n%%+U|EK)d{@3}){zSdOoQ(;j-roR!bKtpAsT7MEz7ql8mbwXV`-Iy8OL;u^qxJqQ#)Gcb~))sc%9$Yk!37DuYE> zLCI$sHWD#{5$%D_!osX3loq)pn5CekG8%xIZ0DX$v?!7R&@GsJcWC9F5*n`n$=#Z0 zSwsbbj+lJ!ne_N*rioXiR$vL)rhRG|0Jy`d10$Eqs`-{1zKZ?4039wwL*6=L^ebp+ lLA8uw#zZs`^1qyQLq5(Z#+lCw0RCMdWKTbjdiSuj{{km(`?df8 literal 0 HcmV?d00001 diff --git a/site/Images/Screens/Vs2022logo.png b/site/Images/Screens/Vs2022logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8b83beb926c369f2bac23905048a1c4d0142a457 GIT binary patch literal 25651 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

uo$B8>8R_db!#KjXRA+tIS z1s5m0III{CHb-!qr+!Y_*zg?*(m1$R-9sSTmy& zc|Ct5y_oDX{r$U&0YWq`R+0HLaCkuK@fzw&YnLo&SiAbE3|&s=&%$FbFOi=4*e(WX z-f}V_tqCepnkFIg^9?Ii-g14>ko|rfUC!^0p6fDQaqVCPYye$Y$70owSQSID*?OdO z5s2)TvQX9vMlqLQR|MVSUq2n`E%O@cKPb> zlK!i#aBC~j?R)QG^U#A#n&@65WvA!g+*TC^fv`@f)UMKkH-;2@xx6<`GejiLf$9v! zCW9w!nFZOys@$!Fz&(caL_plG9nApWd7}Y^sY8;~&(Y}tCxsS{rw?jh!y}_X&F;k- zL?(FDZJrrf^_IxJ#Uuy&p;4`U+|4|wW`|^N|oWk8GJt`X>xm``!F=V z7%!h4G(|wNdo-QbSEt<1LyV3l^{eM&Pnn2r1^7M=N`~NUhjVKhYjykkvEZq|8#U8l zbNg2He~q`_&xnZb->yD6iMqjZ5g6zyTHnJOUB%Au(%-8~s&rX^(%Lu7*;CmYoIK0H z*f*o+?&@Fb3$P>@LO!vqw;t&gPwmm8d3XK1?4!H&ZU?I4^mX+%o6FO_|14x(BYq

  • @@ -624,6 +648,25 @@ Résumé des difficultés techniques +
  • @@ -655,6 +698,11 @@ Notes de code
  • +
  • + + Glossaire + +
  • @@ -1009,6 +1057,30 @@ Outils utilisés +
  • @@ -1314,6 +1386,25 @@ Résumé des difficultés techniques +
  • @@ -1345,6 +1436,11 @@ Notes de code
  • +
  • + + Glossaire + +
  • @@ -1500,7 +1596,51 @@ La raison la plus probable étant qu'Amazon avec son service AWS propose exactem

    Différences sur le cahier des charges


    -

    [À remplir dans les dernières semaines du travail de diplôme]

    +

    Ici je vais parler de l'étât du projet à la date du 12 Juin 2023.

    +

    A cette date, le projet est fonctionel mais comporte quelques différences avec le cahier des charges original. Je vais expliquer non seulement ces différences mais aussi les raisons qui font qu'elles sont la.

    +

    Pour bien comprendre les différences il faut s'en réfèrer au cahier des charges original.

    +

    L'application doit être "Un outil de style compagnon sous forme d'application C# Windows Form qui récupère en temps réel les informations de la course et affiche les informations les plus importantes". C'est ca la phrase la plus importante dans tout le CDC. Et je pense que très honnêtement, ce cahier des charges est rempli !

    +

    L'application actuellement disponible sur le répo GIT est une application de style compagnion Windows Forms qui récupère les infos de la F1TV en temps réel et elle affiche les informations qu'elle trouve importante. Donc je dirais que l'objectif général est remplis.

    +

    Maintenant c'est dans les détails que cela pêche.

    +

    Il est mentionné trois exemples d'infos à suivre je cite :

    +
      +
    • "Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre)."
    • +
    • "Les pilotes qui améliorent leur temps au tour et ceux qui perdent le plus de temps"
    • +
    • "Le classement pondéré tenant compte des futurs arrêts au stand"
    • +
    +

    résultats :

    +
      +
    1. Dans l'application on peut effectivement voir les pilotes proches (Ce sont ceux qui sont à moins de 3 secondes dans le version finale)
    2. +
    3. Dans l'application on peut aussi voir un affichage qui permet de voir les pilotes les plus rapides et les plus lents sur le circuit.
    4. +
    5. On ne peut en revanche pas voir de classement pondéré selon les arrêts aux stands car l'application a du mal à detecter des arrêts.
    6. +
    +

    Ensuite pour ce qui est des prédictions il n'y en a aucunes comme ca c'est simple.

    +

    Si on ne regarde que de très loin le CDC et le projet final on pourrait dire que c'est plutôt décevant car il manque beaucoup de choses comme les prédictions et certains affichages.

    +

    On peut aussi se dire ca en comparant la maquette du CDC et le résultat final.

    +
    + +
    "Maquette originale du projet faite sur Figma"
    +
    +
    + +
    "Maquette originale du projet faite sur Figma"
    +
    +

    Clairement un oeuil non avisé pourrait être très décu et pourrait dire que c'est un echec.

    +

    Et moi je vais vous expliquer pourquoi au contraire c'est un total succès.

    +

    Déja, la beauté de l'interface est très difficile a répliquer en Windows Forms et il faudrait plus d'une semaine de travail pour arriver à quelque chose qui pourrait ressembler un tout petit peu à la maquette.

    +

    Ensuite, si on regarde bien, on a quand même une application qui nous permet de suivre les informations de la course et qui calcule des choses à notre place. C'est déja une grosse plus-value par rapport à la page Data de la F1TV.

    +

    Et finalement, les prédictions, les affichages et le style ce sont les choses les moins compliquées du projet. On ne se rends pas compte que pour simplement afficher les 20 pilotes dans le bon ordre il faut énormément de travail.

    +

    Voici une petite représentation graphique de la quantité de travail nescessaire pour en arriver à l'étât actuel du projet :

    +
    + +
    "Graphique représentant la quantité de travail requise"
    +
    +

    Pour en arriver à un affichage il a fallu récupèrer automatiquement les images en utilisant un browser headless ce qui a pris un temps fou à mettre en place et il a fallu surtout lire les informations que l'on recevait des images.

    +

    J'ai passé presque 90% du temps de mon projet à développer des choses qui permettront ensuite de faire de l'affichage.

    +

    Le fait qu'il y aie quoi que ce soit de logique qui s'affiche cela veut dire que TOUT LE RESTE fonctionne ! Le moindre soucis à la récupération des images, ou surtout à la reconnaissance de texte et de chiffres et l'affichage est ruiné.

    +

    Si j'avais passé ne serait-ce qu'une semaine de plus juste sur l'affichage le résultat final n'aurait rien à voir.

    +

    Le soucis c'est simplement que le cahier des charges ne parle pas du tout du reste du projet et ne parle que du résultat final.

    +

    Pour toutes ces raisons je dirais que le CDC était trop superficiel mais que l'application est conforme à l'idée générale de ce dernier et qu'il serait très facile de la rendre parfaitement conforme maintenant que tout le travail de fond a été fait et fonctionne et je pense donc que c'est un succès.

    Planning prévisionnel


    Mes suiveurs m'ont demandé un planning de type GANTT pour ce travail de diplôme

    @@ -1570,14 +1710,62 @@ La raison la plus probable étant qu'Amazon avec son service AWS propose exactem

    J'ai mis une durée arbitraire de deux jours, mais je ne sais pas vraiment combien de temps cela va vraiment durer. Elle est évidemment à effectuer une fois que tout est à peu près terminé.

    Planning effectif et différences


    -

    [A remplir dans les dernières semaines du travail de diplôme]

    +

    Alors !

    +

    Ces lignes sont écrites dans les derniers jours du travail de diplôme et j'ai des choses à dire.

    +

    Premièrement je suis plutôt content de mon estimation du travail. Je trouve que j'ai bien estimé la quantité de travail et combien de temps les différentes tâches allaient prendre. La plupart des dépassements sont des imprévus et/ou des allers et retours entre d'autres tâches.

    +

    La raison pour laquelle je suis plutôt content de ma planification, c'est que malgré l'usine à Gaz que représente ce projet et le nombre de soucis que j'ai eu, j'ai quand même pu arriver à un projet qui fonctionne en suivant plutôt fidèlement le planning. Une chose dont je suis plutôt fier c'est la documentation. En ayant développé le squelette de l'app dès le début du projet ca m'a permis d'avancer au fur et à mesure du projet la conscience tranquille.

    +

    Bon c'est bien joli les fleurs mais clairement c'est loin d'être parfait. Au moment de la planification je n'avais pas prévu de faire des allers et retours entre plusieurs tâches. Dans le planning effectif on peut voir que un jour je suis sur la PT3 (Stockage) et la PT5 (regroupement des mini projets en un seul gros). J'aurais peut-être du inverser l'ordre.

    +

    Mais il y a deux gros soucis dans mon planning :

    +
      +
    • L'ordre des tâches n'était pas bon (mais il a été décidé comme ca pour que les plus grosse difficultées soient faites en premier) ce qui a créé pas mal de soucis. Ex : L'émulateur de la F1TV a été fait très tard et au final les images récupèrées n'étaient pas de la même qualité que ce que j'avais prévu en développant l'OCR en premier.
    • +
    • Les Tests ont été négligés et utilisés comme des jours tampons. Ca c'est la plus grosse erreur de planning. Autant les autres sont pénibles etc... mais n'ont pas forcément compromis la bonne réalisation du projet alors que la les tests ont été mal placés et ont au final été balayés alors que si ils avaient été mieux planifiés ca ne serait pas arrivé.
    • +
    +

    Solutions :

    +

    L'ordre des tâches a été décidé exprès de cette facon pour éviter de prendre trop de risques. L'idée était qu'en faisant le plus dur au début, je pourrai facilement changer le cahier des charges. J'ai envie de dire que j'aurais dû être plus confiant mais pour être honnête je pense que c'était un mal pour un bien. Je ne pense pas avoir "bien" fait mais je pense que c'est une erreur qui était rentable pour mon niveau de stress dans le projet.

    +

    Par contre les Tests c'est tout simplement une erreur. J'en parle plus en détail dans la partie test de la documentation mais je vais résumer un peu ici. +La documentation a été faite dès le début du projet. J'ai mis en place le squelette pour qu'ensuite il soit simple d'y ajouter au fur et à mesure. J'aurais dur faire exactement pareil avec les tests. Si j'avais fait au moins le squelette des tests au début du projet j'aurais pu beaucoup plus facilement en faire et cela m'aurait fait gagner un temps fou et j'aurais même pu faire du TDD (Test Driven Developpement). Je suis persuadé que cette bête erreur de planification m'a côuté très chère car ne pas avoir une bonne stratégie de tests a du me faire perdre un temps fou.

    +

    Pour conclure je suis content car j'ai réussi à rendre un projet qui marche en suivant assez bien le planning mais il y a des choses que je vais devoir changer dans mes prochains projets.

    Analyse fonctionnelle


    -

    [A remplir au fur et à mesure dans la seconde moitié du travail de diplôme]

    +

    Voir "Manuel Utilisateur" tout y est indiqué

    Analyse Organique


    Outils utilisés

    -

    [A Remplir]

    +

    Visual Studio 2022

    +
    + +
    "Logo de Visual Studio 2022"
    +
    +

    C'est l'application que j'ai le plus utilisé je pense. Visual Studio 2022 est l'IDE officiel de Microsoft pour coder en C#.

    +

    C'est l'outil que j'utilise depuis maintenant 6 ans au CFPT et franchement il fait tout ce que je pourrais vouloir. C'est aussi un outil pratique pour utiliser Windows Forms et faire des applications natives Windows.

    +

    Pas grand chose à dire à ce sujet à part que c'est un outil qui marche bien et qui est gratuit si on prend la community edition.

    +

    Visual Studio Code

    +
    + +
    "Logo de Visual Studio Code"
    +
    +

    Cet outil est déja un peu plus intéressant. C'est le second outil que j'ai le plus utilisé. J'en ai surtout eu besoin pour écrire de la doc, mais aussi pour coder en python et pour contrôler mkdocs.

    +

    Visual Studio est un IDE absolument génial qui est très puissant avec les bonnes extensions. Je l'utilise au quotidien pour tout ce qui est développement WEB, Mobile ou pour éditer des fichiers de configs pour mes drones ou imprimantes 3D. Je peux même compiler le firmware pour ces dernières en utilisant une extension faite pour.

    +

    Les possibilités de customisation sont presques infinies et c'est un plaisir d'utiliser ce logiciel gratuit fournis par Microsoft mais qui est amélioré constamment par des développeurs indépendants.

    +

    Je conseille à nimporte quel développeur de l'essayer à moins qu'il soit uniquement sur C# ou il serait plus intéressant d'utiliser visual studio 2022

    +

    Material/Mkdocs/Markdown

    +
    + +
    "Logo de Mkdocs Materials"
    +
    +

    Pendant ce projet j'ai utilisé exclusivement du markdown avec l'aide de Mkdocs et Materials.

    +

    Le choix de Markdown a été plutôt simple, c'est une facon facile et efficace de créer de la documentation et on n'avait pas le choix de l'utiliser.

    +

    On avait également l'obligation (Ou au moins un très forte incitation) par nos professeurs d'utiliser mkdocs et materials pour que notre documentation ne soit pas simplement une liste de fichiers mais un joli site dans lequel il est agréable de chercher des informations.

    +

    Mkdocs et Materials sont deux outils vraiment fantastiques mais je dois avouer que je n'ai pas assez mis de temps pour apprendre tout leur potentiel. Pour moi ce sont simplement des outils et je veux qu'ils marchent. Je ne suis pas forcément du genre à aller changer toutes les couleurs et polices pour avoir la doc parfaite, j'ai préféré passer du temps sur mon app. Mais même si ces outils offrent une customisation très avancée, il est très facile de créer un projet simple et j'aime beaucoup cette simplicité.

    +

    J'ai eu pas mal d'aide de la part de M.Briard pour implémenter certaines features et je l'en remercie très chaudement car sans son aide ce document serait sûrement un peu moins facile à lire (Oui oui ca aurait pu être pire, je sais c'est dur à imaginer)

    +

    Figma

    +
    + +
    "Logo de Figma"
    +
    +

    Figma est l'outil que j'ai utilisé pour créer mon poster et un certain nombre des diagrammes de cette documentation.

    +

    J'utilise aussi cet outil dès que je vais faire des maquettes de sites ou d'applications. D'ailleurs les maquettes dans le cahier des charges ont été faites avec.

    +

    C'est un outil en ligne parfaitement gratuit qui conserve tout dans le cloud. Franchement je n'ai rien à dire, je n'ai pas utilisé plus de 15% des features que cet outil propose et je suis déja conquis.

    Technologies utilisées

    Dans ce projet différents choix ont été faits pour ce qui est des technologies.

    Certaines ont été choisies car elles étaient les plus simples, les plus pratiques, les plus efficaces ou encore les plus connues et donc ayant le meilleur support. Je vais tenter de résumer ici ces choix mais je reviendrai sur la plupart d'entre eux plus tard quand j'explique ce que je fais avec.

    @@ -3127,10 +3315,33 @@ Si je vois que un certain nombre est souvent mal reconnu je peux faire exprès d

    Ecrire des tests c'est jamais marrant et c'est encore moins marrant quand ils nous empêchent d'avancer. Mais je suis convaincu que au final c'est un gain de temps et de sérénité incontournable.

    Résumé des difficultés techniques


    -

    [A remplir au fur et à mesure dans la seconde moitié du travail de diplôme]

    +

    Ici je vais parler très rapidement des difficultées techniques rencontrées. Si vous voulez tout savoir à propos des difficultées vous pouvez aller lire le journal de bord. C'est aussi pour éviter de me répèter par rapport aux explications des différents points dans l'analyse organique.

    +

    Je vais pas non plus parler des difficultées rencontrée avec des choses que je n'ai pas gardé dans le programme final donc il est normal que vous vous disiez qu'il n'y a pas eu tant de difficultés que ca.

    +

    Browser Headless

    +

    Il y avait plusieurs difficultées techniques avec cette histoire de Browser Headless.

    +

    Deja pouvoir lancer un browser headless et le contrôler. C'est difficile car il faut trouver la bonne librairie et ensuite il faut trouver le bon exectuable de geckoDriver qui permette de faire fonctionner l'application même si l'utilisateur n'a pas Firefox sur sa machine.

    +

    Ensuite la seconde difficulté est celle de ne pas se faire chopper comme un bot par le site de la F1TV. Il faut savoir qu'à ce jour je n'ai toujours pas réussi à faire croire à la page de login de la F1TV que j'étais un user normal en utilisant Selnnium mais au moins maintenant je peux accèder aux vidéos tranquillement.

    +

    Ce soucis de ne pas pouvoir se connecter avec la page de login à la plus grosse difficulté technique de cette partie du projet : la connexion automatique. Pour me connecter à la F1TV avec un browser headless la seule solution que j'ai trouvé a été d'utiliser des cookies. Et pour que l'utilisateur n'aie pas à aller chercher les siens dans son navigateur il a fallut trouver une technique pour aller les chercher directement sans lui demander son avis.

    +

    Autre difficutlé, comme on travaille avec un site web que l'on ne contrôle pas, il faut trouver un moyen de gèrer les erreurs et de réessayer parfois et attendre quand il faut dans les cas ou le chargement est long etc...

    +

    Ensuite après tout ca la dernière difficulté a été de pouvoir contrôler le firefox Headless assez bien pour qu'il puisse non seulement naviguer les pages mais aussi qu'il puisse cliquer sur des boutons qui ne s'affichent pas tout le temps.

    +

    (Je ne vais pas mentioner la difficulté que ca a été de mettre le browser en 4K pour des raison de santé mentale)

    +

    OCR

    +

    Les difficultées ici sont dans un autre niveau. Chaque type de donnée représentait sa difficulté à lui tout seul sans compter l'optimisation.

    +

    Pour commencer on a le texte pour les noms de pilotes. Il a fallu trouver un système qui puisse reconnaitre le texte et qui puisse comparer le résultat avec les pilotes que l'on connait.

    +

    Ensuite il a fallu trouver un moyen de detecter la différence entre les fenêtres de DRS où il est ouvert ou fermé. Il fallait également faire attention à ne pas faire de faux positifs.

    +

    Pour les temps par secteurs il a fallu trouver des filtres qui permettent de bien différencier les '1' et les '4' sans les confondre et il a aussi fallut trouver un moyen de filter l'image pour que dans le cas ou le texte serait en couleur ca fonctionne quand même. (Car oui un filtre de nuances de gris ne marche pas super avec des couleurs sombres)

    +

    Pour les pneus (le plus dur) il a fallut trouver un moyen de trouver sur toute la longeur de la zone la partie intéressante. Ensuite il a fallut trouver une technique pour savoir quel type de pneu c'est en fonction de la couleur moyenne et ensuite le plus dur a été d'isoler le chiffre du dessin autour car Tesseract aime pas les formes, le tout automatiquement.

    +

    Pour les temps au tour il a fallut trouver un moyen de ne pas confondre les ponctuations avec des chiffres tout en ne les ratant pas. Et il a fallu trouver un moyen de detecter quand inévitablement cela arrive quand même.

    +

    Et la dernière difficulté (la plus pénible) a été de detecter les écarts entre les pilotes. Il a fallut trouver une facon de decoder le texte en temps mais aussi de faire tout un système qui détecte et règle les cas ou un ':' a été oublié ou confondu tout en ne sachant pas si il était scensé y en avoir à la base car les valeurs peuvent varier entre '1_23.657' et '0.452'.

    +

    Stockage

    +

    Pour ce qui est du stockage la grande difficulté a été de savoir quand un pilote avait avait finit un tour car chaque pilote finit son tour à un moment différent. Il a également fallut trouver un moyen de savoir les données d'un pilote étaient logiques.

    +

    Une difficulté qui n'a pas été complêtement dépassée est de savoir quand un pilote a fait un arrêt aux stands car la detection de l'age des pneus est plus que mauvaise.

    +

    Voila. Ce fut une petite liste non exhaustive de quelques difficultés techniques que j'ai rencontré pendant ce projet.

    Optimisation du programme


    -

    [A remplir à la fin du projet pour parler des différentes methodes d'optimisation]

    +

    Ici je vais parler des techniques que j'ai utilisé pour réduire le temps de traitement de chaques images de 50 secondes à un peu moins de 3 sur le processeur de mon laptop. En effet, dans les premières version du projet, traiter l'intégralité d'une image pouvait prendre presque une minute.

    +

    Ce qui est compliqué dans ce projet c'est qu'il y a un certain nombres de choses que je ne contrôle pas. En utilisant Tesseract, je me retrouve avec des incompressibles. En imaginant que l'OCR sur une image prenne 300ms, même si j'avais 180 threads capables de faire cette tâche en même temps, le temps de traitement sera toujours d'au moins 300ms. Créer une instance de Tesseract prend également du temps. Ma mission n'est donc pas d'arriver à des temps de quelques dixaines de milisecondes mais plutôt de rajouter le moins de temps possible pendant le traitement et de tenter de faire le plus du choses possible en paralelle.

    +

    I

    Ethique du projet


    [A remplir à la fin du projet pour parler des questions ethiques du projet (Ex: Utilisation potentiellement abusive de la F1Tv ou L'histoire des cookies)]

    @@ -3144,6 +3355,9 @@ Si je vois que un certain nombre est souvent mal reconnu je peux faire exprès d

    [A remplir la dernière semaine du travail de diplôme]

    Notes de code

    +
    +

    Glossaire

    +
    diff --git a/site/jdb.html b/site/jdb.html index fc29ffe..2d20465 100644 --- a/site/jdb.html +++ b/site/jdb.html @@ -327,6 +327,16 @@ Lundi 5 Juin 2023 +
  • + + Mardi 6 Juin 2023 + +
  • +
  • + + Mercredi 7 Juin + +
  • @@ -659,6 +669,16 @@ Lundi 5 Juin 2023 +
  • + + Mardi 6 Juin 2023 + +
  • +
  • + + Mercredi 7 Juin + +
  • @@ -3284,6 +3304,53 @@ Pour detecter un arrêt je pense que la meilleure manière est de regarder si le

    J'ai essayé de règler le problème en Live, le soucis c'est que j'ai un commentaire à fournir pendant la course et donc je n'ai pas eu le temps de plus me pencher sur le cas. Le weekend du prochain Grand Prix je vais essayer de tester sur les scéances d'essais libres.le click du bouton et j'amenerai mon cable chez moi.

    Bon sinon aujourd'hui, comme d'hab, Doc... Je vais faire le manuel utilisateur.

    +

    J'ai fait un manuel qui décrit à peu près tout ce qui'il faut savoir pour bien utiliser l'app. Cela fait un document un peu long mais je pense que c'est nescessaire car c'est vraiment pas une app facile à comprendre quand on ne vient pas du milieu de la F1 (et même la...)

    +

    Mardi 6 Juin 2023

    +

    Aujourd'hui je vais continuer à documenter... Ma methode pour l'instant c'est juste de remplir les titres que j'ai prévu au départ. Ensuite à partir de jeudi (je pense que c'est à partir de cette date que j'aurai un peu tout rempli) j'aimerais bien relire la grille d'évaluation et ensuite faire une lecture de mon journal de bord pour vérifier que je n'ai rien oublié. Et le but c'est de finir la doc Vendredi soir pour faire une dernière release doc + projet.

    +

    Un collègue M.Briard m'a pas mal aidé avec la configuration de mon mkdocs et il a développé une extension pour ajouter le code source au PDF final. La il est en train de regarder si il peut trouver un moyen de faire une table des figures qui nous est demandée. (j'ai plus de 200 images dans ma documentation alors si c'est possible de ne pas avoir à faire une table des figures à la main je prends)

    +

    Mercredi 7 Juin

    +

    La je suis en train de parler de l'optimisation de mon application et je viens de me rappeller qu'il manquait des methodes avec de la paralellisation alors je vais les convertir avant de continuer la doc.

    +

    En fait je viens de me rendre compte qu'aucunes de mes methodes de filtres n'étaient en parralel... Je ne sais pas si jaurai le temps de le faire aujourd'hui en fait

    +
    public static Bitmap Grayscale(Bitmap inputBitmap)
    +        {
    +            Rectangle rect = new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height);
    +            BitmapData bmpData = inputBitmap.LockBits(rect, ImageLockMode.ReadWrite, inputBitmap.PixelFormat);
    +            int bytesPerPixel = Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8;
    +
    +            unsafe
    +            {
    +                byte* ptr = (byte*)bmpData.Scan0.ToPointer();
    +                for (int y = 0; y < inputBitmap.Height; y++)
    +                {
    +                    byte* currentLine = ptr + (y * bmpData.Stride);
    +                    for (int x = 0; x < inputBitmap.Width; x++)
    +                    {
    +                        byte* pixel = currentLine + (x * bytesPerPixel);
    +
    +                        byte blue = pixel[0];
    +                        byte green = pixel[1];
    +                        byte red = pixel[2];
    +
    +                        //Those a specific values to correct the weights so its more pleasing to the human eye
    +                        int gray = (int)(red * 0.3 + green * 0.59 + blue * 0.11);
    +
    +                        //This is not a proper treshold method but it is helping the sobel edge detection
    +                        if(gray <= F1TV_BACKGROUND_TRESHOLD.R)
    +                        {
    +                            pixel[0] = pixel[1] = pixel[2] = 0;
    +                        }
    +                        else
    +                        {
    +                            pixel[0] = pixel[1] = pixel[2] = (byte)gray;
    +                        }
    +                    }
    +                }
    +            }
    +            inputBitmap.UnlockBits(bmpData);
    +
    +            return inputBitmap;
    +        }
    +
    diff --git a/site/pdf/document.pdf b/site/pdf/document.pdf index dbcc456..eb3bffb 100644 --- a/site/pdf/document.pdf +++ b/site/pdf/document.pdf @@ -3,8 +3,8 @@ 1 0 obj << /Type /Pages -/Kids [ 6 0 R 8 0 R 83 0 R 158 0 R 250 0 R 348 0 R 449 0 R 484 0 R 487 0 R 490 0 R 496 0 R 498 0 R 500 0 R 505 0 R 508 0 R 512 0 R 514 0 R 516 0 R 518 0 R 520 0 R 523 0 R 527 0 R 530 0 R 534 0 R 539 0 R 544 0 R 547 0 R 551 0 R 554 0 R 559 0 R 564 0 R 569 0 R 573 0 R 575 0 R 577 0 R 582 0 R 584 0 R 589 0 R 594 0 R 596 0 R 598 0 R 600 0 R 602 0 R 604 0 R 606 0 R 612 0 R 616 0 R 625 0 R 629 0 R 631 0 R 633 0 R 635 0 R 641 0 R 645 0 R 648 0 R 652 0 R 669 0 R 674 0 R 683 0 R 691 0 R 698 0 R 712 0 R 715 0 R 725 0 R 736 0 R 741 0 R 755 0 R 764 0 R 778 0 R 789 0 R 802 0 R 804 0 R 810 0 R 814 0 R 816 0 R 819 0 R 824 0 R 829 0 R 833 0 R 842 0 R 849 0 R 854 0 R 860 0 R 864 0 R 866 0 R 868 0 R 873 0 R 878 0 R 883 0 R 888 0 R 894 0 R 898 0 R 900 0 R 902 0 R 905 0 R 909 0 R 911 0 R 913 0 R 918 0 R 922 0 R 925 0 R 929 0 R 934 0 R 936 0 R 938 0 R 942 0 R 947 0 R 953 0 R 958 0 R 962 0 R 968 0 R 973 0 R 977 0 R 981 0 R 985 0 R 993 0 R 999 0 R 1004 0 R 1009 0 R 1016 0 R 1025 0 R 1030 0 R 1035 0 R 1040 0 R 1045 0 R 1050 0 R 1055 0 R 1062 0 R 1065 0 R 1068 0 R 1071 0 R 1074 0 R 1078 0 R 1080 0 R 1082 0 R 1084 0 R 1086 0 R 1089 0 R 1099 0 R 1102 0 R 1107 0 R 1112 0 R 1117 0 R 1125 0 R 1129 0 R 1132 0 R 1137 0 R 1142 0 R 1146 0 R 1152 0 R 1157 0 R 1161 0 R 1166 0 R 1174 0 R 1177 0 R 1181 0 R 1183 0 R 1185 0 R 1190 0 R 1199 0 R 1207 0 R 1214 0 R 1216 0 R 1227 0 R 1233 0 R 1240 0 R 1245 0 R 1248 0 R 1252 0 R 1254 0 R 1257 0 R 1268 0 R 1273 0 R 1277 0 R 1279 0 R 1281 0 R 1283 0 R 1295 0 R 1306 0 R 1319 0 R 1324 0 R 1326 0 R 1335 0 R 1339 0 R 1345 0 R 1349 0 R 1351 0 R 1362 0 R 1370 0 R 1372 0 R 1374 0 R 1376 0 R 1378 0 R 1381 0 R 1384 0 R 1388 0 R 1391 0 R 1394 0 R 1396 0 R 1398 0 R 1400 0 R 1402 0 R 1404 0 R 1410 0 R 1423 0 R 1425 0 R 1430 0 R 1433 0 R 1438 0 R 1442 0 R 1444 0 R 1446 0 R 1448 0 R 1450 0 R 1453 0 R 1460 0 R 1466 0 R 1470 0 R 1473 0 R 1478 0 R 1481 0 R 1485 0 R 1488 0 R 1492 0 R 1495 0 R 1499 0 R 1502 0 R 1506 0 R 1509 0 R 1515 0 R 1517 0 R 1520 0 R 1523 0 R 1527 0 R 1530 0 R 1536 0 R 1538 0 R 1540 0 R 1542 0 R 1544 0 R 1549 0 R 1551 0 R 1553 0 R 1555 0 R 1557 0 R 1559 0 R 1561 0 R 1566 0 R 1568 0 R 1573 0 R 1575 0 R 1578 0 R 1583 0 R 1590 0 R 1593 0 R 1598 0 R 1603 0 R 1608 0 R 1613 0 R 1617 0 R 1622 0 R 1624 0 R 1627 0 R 1632 0 R 1636 0 R 1638 0 R 1643 0 R 1654 0 R 1662 0 R 1665 0 R 1669 0 R 1675 0 R 1680 0 R 1684 0 R 1690 0 R 1694 0 R 1696 0 R 1698 0 R 1700 0 R 1702 0 R 1704 0 R 1706 0 R 1708 0 R 1710 0 R 1712 0 R 1714 0 R 1716 0 R 1718 0 R 1720 0 R 1722 0 R 1724 0 R 1726 0 R 1728 0 R 1730 0 R 1732 0 R 1734 0 R 1736 0 R 1738 0 R 1740 0 R 1742 0 R 1744 0 R 1746 0 R 1748 0 R 1750 0 R 1752 0 R 1754 0 R 1756 0 R 1758 0 R 1760 0 R 1762 0 R 1764 0 R 1766 0 R 1768 0 R 1770 0 R 1772 0 R 1774 0 R 1776 0 R 1778 0 R 1780 0 R 1782 0 R 1784 0 R 1786 0 R 1788 0 R 1790 0 R 1792 0 R 1794 0 R 1796 0 R 1798 0 R 1800 0 R 1802 0 R 1804 0 R 1806 0 R 1808 0 R 1810 0 R 1812 0 R 1814 0 R 1816 0 R 1818 0 R 1820 0 R 1822 0 R 1824 0 R 1826 0 R 1828 0 R 1830 0 R 1832 0 R 1834 0 R 1836 0 R 1838 0 R 1840 0 R 1842 0 R 1844 0 R 1846 0 R 1848 0 R 1850 0 R 1852 0 R 1854 0 R 1856 0 R 1858 0 R 1860 0 R 1862 0 R 1864 0 R 1866 0 R 1868 0 R 1870 0 R 1872 0 R 1874 0 R 1876 0 R 1878 0 R 1880 0 R 1882 0 R 1884 0 R 1886 0 R 1888 0 R 1890 0 R 1892 0 R 1894 0 R 1896 0 R 1898 0 R 1900 0 R 1902 0 R 1904 0 R 1906 0 R 1908 0 R 1910 0 R 1912 0 R 1914 0 R 1916 0 R 1918 0 R 1920 0 R 1922 0 R 1924 0 R 1926 0 R 1928 0 R 1930 0 R 1932 0 R 1934 0 R 1936 0 R 1938 0 R ] -/Count 398 +/Kids [ 6 0 R 8 0 R 83 0 R 156 0 R 246 0 R 344 0 R 442 0 R 510 0 R 513 0 R 516 0 R 522 0 R 524 0 R 526 0 R 531 0 R 534 0 R 538 0 R 540 0 R 546 0 R 551 0 R 555 0 R 557 0 R 559 0 R 561 0 R 563 0 R 566 0 R 571 0 R 575 0 R 581 0 R 585 0 R 590 0 R 593 0 R 597 0 R 602 0 R 607 0 R 610 0 R 614 0 R 617 0 R 622 0 R 627 0 R 632 0 R 636 0 R 638 0 R 640 0 R 645 0 R 647 0 R 652 0 R 657 0 R 659 0 R 661 0 R 663 0 R 665 0 R 667 0 R 669 0 R 675 0 R 679 0 R 688 0 R 692 0 R 694 0 R 696 0 R 698 0 R 704 0 R 708 0 R 711 0 R 715 0 R 732 0 R 737 0 R 746 0 R 754 0 R 761 0 R 775 0 R 778 0 R 788 0 R 799 0 R 804 0 R 818 0 R 827 0 R 841 0 R 852 0 R 865 0 R 867 0 R 873 0 R 877 0 R 879 0 R 882 0 R 887 0 R 892 0 R 896 0 R 905 0 R 912 0 R 917 0 R 923 0 R 927 0 R 929 0 R 931 0 R 936 0 R 941 0 R 946 0 R 951 0 R 957 0 R 961 0 R 963 0 R 965 0 R 968 0 R 972 0 R 974 0 R 976 0 R 978 0 R 980 0 R 985 0 R 989 0 R 992 0 R 996 0 R 1001 0 R 1003 0 R 1005 0 R 1009 0 R 1014 0 R 1020 0 R 1025 0 R 1029 0 R 1035 0 R 1040 0 R 1044 0 R 1048 0 R 1052 0 R 1060 0 R 1066 0 R 1071 0 R 1076 0 R 1083 0 R 1092 0 R 1097 0 R 1102 0 R 1107 0 R 1112 0 R 1117 0 R 1122 0 R 1129 0 R 1132 0 R 1135 0 R 1138 0 R 1141 0 R 1145 0 R 1147 0 R 1149 0 R 1151 0 R 1153 0 R 1156 0 R 1166 0 R 1169 0 R 1174 0 R 1179 0 R 1184 0 R 1192 0 R 1196 0 R 1199 0 R 1204 0 R 1209 0 R 1213 0 R 1219 0 R 1224 0 R 1228 0 R 1233 0 R 1241 0 R 1244 0 R 1248 0 R 1250 0 R 1252 0 R 1257 0 R 1266 0 R 1274 0 R 1281 0 R 1283 0 R 1294 0 R 1300 0 R 1307 0 R 1312 0 R 1315 0 R 1319 0 R 1321 0 R 1324 0 R 1335 0 R 1340 0 R 1344 0 R 1346 0 R 1348 0 R 1350 0 R 1362 0 R 1373 0 R 1386 0 R 1391 0 R 1393 0 R 1402 0 R 1406 0 R 1412 0 R 1416 0 R 1418 0 R 1429 0 R 1437 0 R 1439 0 R 1441 0 R 1443 0 R 1445 0 R 1448 0 R 1451 0 R 1455 0 R 1458 0 R 1461 0 R 1463 0 R 1465 0 R 1467 0 R 1469 0 R 1471 0 R 1477 0 R 1490 0 R 1492 0 R 1497 0 R 1500 0 R 1505 0 R 1509 0 R 1511 0 R 1513 0 R 1515 0 R 1517 0 R 1520 0 R 1527 0 R 1533 0 R 1537 0 R 1540 0 R 1545 0 R 1548 0 R 1552 0 R 1555 0 R 1559 0 R 1562 0 R 1566 0 R 1569 0 R 1573 0 R 1576 0 R 1582 0 R 1584 0 R 1587 0 R 1590 0 R 1594 0 R 1597 0 R 1603 0 R 1605 0 R 1607 0 R 1609 0 R 1611 0 R 1616 0 R 1618 0 R 1620 0 R 1622 0 R 1624 0 R 1626 0 R 1628 0 R 1633 0 R 1635 0 R 1640 0 R 1642 0 R 1645 0 R 1650 0 R 1657 0 R 1660 0 R 1665 0 R 1670 0 R 1675 0 R 1680 0 R 1684 0 R 1689 0 R 1691 0 R 1694 0 R 1699 0 R 1703 0 R 1705 0 R 1710 0 R 1721 0 R 1729 0 R 1732 0 R 1736 0 R 1742 0 R 1747 0 R 1751 0 R 1757 0 R 1761 0 R 1763 0 R 1765 0 R 1767 0 R 1769 0 R 1771 0 R 1773 0 R 1775 0 R 1777 0 R 1779 0 R 1781 0 R 1783 0 R 1785 0 R 1787 0 R 1789 0 R 1791 0 R 1793 0 R 1795 0 R 1797 0 R 1799 0 R 1801 0 R 1803 0 R 1805 0 R 1807 0 R 1809 0 R 1811 0 R 1813 0 R 1815 0 R 1817 0 R 1819 0 R 1821 0 R 1823 0 R 1825 0 R 1827 0 R 1829 0 R 1831 0 R 1833 0 R 1835 0 R 1837 0 R 1839 0 R 1841 0 R 1843 0 R 1845 0 R 1847 0 R 1849 0 R 1851 0 R 1853 0 R 1855 0 R 1857 0 R 1859 0 R 1861 0 R 1863 0 R 1865 0 R 1867 0 R 1869 0 R 1871 0 R 1873 0 R 1875 0 R 1877 0 R 1879 0 R 1881 0 R 1883 0 R 1885 0 R 1887 0 R 1889 0 R 1891 0 R 1893 0 R 1895 0 R 1897 0 R 1899 0 R 1901 0 R 1903 0 R 1905 0 R 1907 0 R 1909 0 R 1911 0 R 1913 0 R 1915 0 R 1917 0 R 1919 0 R 1921 0 R 1923 0 R 1925 0 R 1927 0 R 1929 0 R 1931 0 R 1933 0 R 1935 0 R 1937 0 R 1939 0 R 1941 0 R 1943 0 R 1945 0 R 1947 0 R 1949 0 R 1951 0 R 1953 0 R 1955 0 R 1957 0 R 1959 0 R 1961 0 R 1963 0 R 1965 0 R 1967 0 R 1969 0 R 1971 0 R 1973 0 R 1975 0 R 1977 0 R 1979 0 R 1981 0 R 1983 0 R 1985 0 R 1987 0 R 1989 0 R 1991 0 R 1993 0 R 1995 0 R 1997 0 R 1999 0 R 2001 0 R 2003 0 R 2005 0 R 2007 0 R 2009 0 R ] +/Count 410 >> endobj 2 0 obj @@ -19,10 +19,10 @@ endobj << /Type /Catalog /Pages 1 0 R -/Outlines 2119 0 R +/Outlines 2200 0 R /Names << /Dests << -/Names [ (.:) [ 484 0 R /XYZ 39.386457 771.023622 0 ] (.:__span-0-1) [ 594 0 R /XYZ 60.307257 407.980122 0 ] (.:__span-0-2) [ 594 0 R /XYZ 60.307257 381.179418 0 ] (.:__span-1-1) [ 598 0 R /XYZ 60.307257 202.470522 0 ] (.:__span-1-10) [ 600 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-1-11) [ 600 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-1-12) [ 600 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-1-13) [ 600 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-1-2) [ 598 0 R /XYZ 60.307257 189.070170 0 ] (.:__span-1-3) [ 598 0 R /XYZ 60.307257 175.669818 0 ] (.:__span-1-4) [ 598 0 R /XYZ 60.307257 162.269466 0 ] (.:__span-1-5) [ 598 0 R /XYZ 60.307257 148.869114 0 ] (.:__span-1-6) [ 598 0 R /XYZ 60.307257 135.468762 0 ] (.:__span-1-7) [ 598 0 R /XYZ 60.307257 122.068410 0 ] (.:__span-1-8) [ 598 0 R /XYZ 60.307257 108.668058 0 ] (.:__span-1-9) [ 598 0 R /XYZ 60.307257 95.267706 0 ] (.:__span-10-1) [ 878 0 R /XYZ 60.307257 140.764186 0 ] (.:__span-10-10) [ 883 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-10-11) [ 883 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-10-12) [ 883 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-10-13) [ 883 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-10-14) [ 883 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-10-15) [ 883 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-10-16) [ 883 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-10-17) [ 883 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-10-18) [ 883 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-10-19) [ 883 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-10-2) [ 878 0 R /XYZ 60.307257 113.963482 0 ] (.:__span-10-20) [ 883 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-10-21) [ 883 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-10-22) [ 883 0 R /XYZ 60.307257 529.817286 0 ] (.:__span-10-23) [ 883 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-10-24) [ 883 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-10-25) [ 883 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-10-26) [ 883 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-10-27) [ 883 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-10-28) [ 883 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-10-29) [ 883 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-10-3) [ 878 0 R /XYZ 60.307257 100.563130 0 ] (.:__span-10-4) [ 878 0 R /XYZ 60.307257 87.162778 0 ] (.:__span-10-5) [ 883 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-10-6) [ 883 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-10-7) [ 883 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-10-8) [ 883 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-10-9) [ 883 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-11-1) [ 894 0 R /XYZ 60.307257 186.718980 0 ] (.:__span-11-10) [ 898 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-11-11) [ 898 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-11-12) [ 898 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-11-13) [ 898 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-11-14) [ 898 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-11-15) [ 898 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-11-16) [ 898 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-11-2) [ 894 0 R /XYZ 60.307257 159.918276 0 ] (.:__span-11-3) [ 894 0 R /XYZ 60.307257 133.117572 0 ] (.:__span-11-4) [ 894 0 R /XYZ 60.307257 119.717220 0 ] (.:__span-11-5) [ 894 0 R /XYZ 60.307257 106.316868 0 ] (.:__span-11-6) [ 898 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-11-7) [ 898 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-11-8) [ 898 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-11-9) [ 898 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-12-1) [ 900 0 R /XYZ 60.307257 186.377322 0 ] (.:__span-12-10) [ 902 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-12-11) [ 902 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-12-12) [ 902 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-12-13) [ 902 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-12-14) [ 902 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-12-15) [ 902 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-12-16) [ 902 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-12-17) [ 902 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-12-18) [ 902 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-12-19) [ 902 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-12-2) [ 900 0 R /XYZ 60.307257 172.976970 0 ] (.:__span-12-20) [ 902 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-12-21) [ 902 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-12-22) [ 902 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-12-23) [ 902 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-12-24) [ 902 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-12-25) [ 902 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-12-26) [ 902 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-12-27) [ 902 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-12-28) [ 902 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-12-29) [ 902 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-12-3) [ 900 0 R /XYZ 60.307257 159.576618 0 ] (.:__span-12-30) [ 902 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-12-31) [ 902 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-12-32) [ 902 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-12-33) [ 902 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-12-34) [ 902 0 R /XYZ 60.307257 382.413414 0 ] (.:__span-12-35) [ 902 0 R /XYZ 60.307257 369.013062 0 ] (.:__span-12-36) [ 902 0 R /XYZ 60.307257 355.612710 0 ] (.:__span-12-4) [ 900 0 R /XYZ 60.307257 146.176266 0 ] (.:__span-12-5) [ 900 0 R /XYZ 60.307257 132.775914 0 ] (.:__span-12-6) [ 900 0 R /XYZ 60.307257 119.375562 0 ] (.:__span-12-7) [ 900 0 R /XYZ 60.307257 105.975210 0 ] (.:__span-12-8) [ 900 0 R /XYZ 60.307257 92.574858 0 ] (.:__span-12-9) [ 902 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-2-1) [ 600 0 R /XYZ 60.307257 422.999214 0 ] (.:__span-2-10) [ 600 0 R /XYZ 60.307257 302.396046 0 ] (.:__span-2-11) [ 600 0 R /XYZ 60.307257 275.595342 0 ] (.:__span-2-12) [ 600 0 R /XYZ 60.307257 262.194990 0 ] (.:__span-2-13) [ 600 0 R /XYZ 60.307257 248.794638 0 ] (.:__span-2-14) [ 600 0 R /XYZ 60.307257 235.394286 0 ] (.:__span-2-15) [ 600 0 R /XYZ 60.307257 221.993934 0 ] (.:__span-2-16) [ 600 0 R /XYZ 60.307257 208.593582 0 ] (.:__span-2-17) [ 600 0 R /XYZ 60.307257 195.193230 0 ] (.:__span-2-18) [ 600 0 R /XYZ 60.307257 181.792878 0 ] (.:__span-2-19) [ 600 0 R /XYZ 60.307257 168.392526 0 ] (.:__span-2-2) [ 600 0 R /XYZ 60.307257 409.598862 0 ] (.:__span-2-20) [ 600 0 R /XYZ 60.307257 154.992174 0 ] (.:__span-2-21) [ 600 0 R /XYZ 60.307257 141.591822 0 ] (.:__span-2-22) [ 600 0 R /XYZ 60.307257 128.191470 0 ] (.:__span-2-23) [ 600 0 R /XYZ 60.307257 114.791118 0 ] (.:__span-2-24) [ 600 0 R /XYZ 60.307257 101.390766 0 ] (.:__span-2-25) [ 600 0 R /XYZ 60.307257 87.990414 0 ] (.:__span-2-26) [ 602 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-2-27) [ 602 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-2-28) [ 602 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-2-3) [ 600 0 R /XYZ 60.307257 396.198510 0 ] (.:__span-2-4) [ 600 0 R /XYZ 60.307257 382.798158 0 ] (.:__span-2-5) [ 600 0 R /XYZ 60.307257 369.397806 0 ] (.:__span-2-6) [ 600 0 R /XYZ 60.307257 355.997454 0 ] (.:__span-2-7) [ 600 0 R /XYZ 60.307257 342.597102 0 ] (.:__span-2-8) [ 600 0 R /XYZ 60.307257 329.196750 0 ] (.:__span-2-9) [ 600 0 R /XYZ 60.307257 315.796398 0 ] (.:__span-3-1) [ 602 0 R /XYZ 60.307257 678.506766 0 ] (.:__span-3-10) [ 602 0 R /XYZ 60.307257 557.903598 0 ] (.:__span-3-11) [ 602 0 R /XYZ 60.307257 544.503246 0 ] (.:__span-3-12) [ 602 0 R /XYZ 60.307257 531.102894 0 ] (.:__span-3-2) [ 602 0 R /XYZ 60.307257 665.106414 0 ] (.:__span-3-3) [ 602 0 R /XYZ 60.307257 651.706062 0 ] (.:__span-3-4) [ 602 0 R /XYZ 60.307257 638.305710 0 ] (.:__span-3-5) [ 602 0 R /XYZ 60.307257 624.905358 0 ] (.:__span-3-6) [ 602 0 R /XYZ 60.307257 611.505006 0 ] (.:__span-3-7) [ 602 0 R /XYZ 60.307257 598.104654 0 ] (.:__span-3-8) [ 602 0 R /XYZ 60.307257 584.704302 0 ] (.:__span-3-9) [ 602 0 R /XYZ 60.307257 571.303950 0 ] (.:__span-4-1) [ 602 0 R /XYZ 60.307257 491.661942 0 ] (.:__span-4-10) [ 602 0 R /XYZ 60.307257 371.058774 0 ] (.:__span-4-11) [ 602 0 R /XYZ 60.307257 344.258070 0 ] (.:__span-4-12) [ 602 0 R /XYZ 60.307257 330.857718 0 ] (.:__span-4-13) [ 602 0 R /XYZ 60.307257 317.457366 0 ] (.:__span-4-14) [ 602 0 R /XYZ 60.307257 304.057014 0 ] (.:__span-4-15) [ 602 0 R /XYZ 60.307257 290.656662 0 ] (.:__span-4-16) [ 602 0 R /XYZ 60.307257 277.256310 0 ] (.:__span-4-17) [ 602 0 R /XYZ 60.307257 250.455606 0 ] (.:__span-4-18) [ 602 0 R /XYZ 60.307257 237.055254 0 ] (.:__span-4-19) [ 602 0 R /XYZ 60.307257 223.654902 0 ] (.:__span-4-2) [ 602 0 R /XYZ 60.307257 478.261590 0 ] (.:__span-4-20) [ 602 0 R /XYZ 60.307257 210.254550 0 ] (.:__span-4-21) [ 602 0 R /XYZ 60.307257 196.854198 0 ] (.:__span-4-22) [ 602 0 R /XYZ 60.307257 183.453846 0 ] (.:__span-4-23) [ 602 0 R /XYZ 60.307257 170.053494 0 ] (.:__span-4-24) [ 602 0 R /XYZ 60.307257 156.653142 0 ] (.:__span-4-25) [ 602 0 R /XYZ 60.307257 143.252790 0 ] (.:__span-4-26) [ 602 0 R /XYZ 60.307257 129.852438 0 ] (.:__span-4-27) [ 602 0 R /XYZ 60.307257 116.452086 0 ] (.:__span-4-28) [ 602 0 R /XYZ 60.307257 103.051734 0 ] (.:__span-4-29) [ 602 0 R /XYZ 60.307257 89.651382 0 ] (.:__span-4-3) [ 602 0 R /XYZ 60.307257 464.861238 0 ] (.:__span-4-30) [ 604 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-4-31) [ 604 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-4-32) [ 604 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-4-33) [ 604 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-4-34) [ 604 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-4-35) [ 604 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-4-36) [ 604 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-4-37) [ 604 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-4-4) [ 602 0 R /XYZ 60.307257 451.460886 0 ] (.:__span-4-5) [ 602 0 R /XYZ 60.307257 438.060534 0 ] (.:__span-4-6) [ 602 0 R /XYZ 60.307257 424.660182 0 ] (.:__span-4-7) [ 602 0 R /XYZ 60.307257 411.259830 0 ] (.:__span-4-8) [ 602 0 R /XYZ 60.307257 397.859478 0 ] (.:__span-4-9) [ 602 0 R /XYZ 60.307257 384.459126 0 ] (.:__span-5-1) [ 612 0 R /XYZ 60.307257 671.460194 0 ] (.:__span-5-10) [ 612 0 R /XYZ 60.307257 537.456674 0 ] (.:__span-5-11) [ 612 0 R /XYZ 60.307257 524.056322 0 ] (.:__span-5-12) [ 612 0 R /XYZ 60.307257 510.655970 0 ] (.:__span-5-13) [ 612 0 R /XYZ 60.307257 497.255618 0 ] (.:__span-5-14) [ 612 0 R /XYZ 60.307257 483.855266 0 ] (.:__span-5-15) [ 612 0 R /XYZ 60.307257 470.454914 0 ] (.:__span-5-16) [ 612 0 R /XYZ 60.307257 457.054562 0 ] (.:__span-5-17) [ 612 0 R /XYZ 60.307257 443.654210 0 ] (.:__span-5-18) [ 612 0 R /XYZ 60.307257 416.853506 0 ] (.:__span-5-19) [ 612 0 R /XYZ 60.307257 403.453154 0 ] (.:__span-5-2) [ 612 0 R /XYZ 60.307257 658.059842 0 ] (.:__span-5-20) [ 612 0 R /XYZ 60.307257 390.052802 0 ] (.:__span-5-21) [ 612 0 R /XYZ 60.307257 376.652450 0 ] (.:__span-5-22) [ 612 0 R /XYZ 60.307257 363.252098 0 ] (.:__span-5-23) [ 612 0 R /XYZ 60.307257 349.851746 0 ] (.:__span-5-24) [ 612 0 R /XYZ 60.307257 323.051042 0 ] (.:__span-5-25) [ 612 0 R /XYZ 60.307257 309.650690 0 ] (.:__span-5-26) [ 612 0 R /XYZ 60.307257 296.250338 0 ] (.:__span-5-27) [ 612 0 R /XYZ 60.307257 269.449634 0 ] (.:__span-5-28) [ 612 0 R /XYZ 60.307257 256.049282 0 ] (.:__span-5-29) [ 612 0 R /XYZ 60.307257 229.248578 0 ] (.:__span-5-3) [ 612 0 R /XYZ 60.307257 644.659490 0 ] (.:__span-5-30) [ 612 0 R /XYZ 60.307257 202.447874 0 ] (.:__span-5-31) [ 612 0 R /XYZ 60.307257 189.047522 0 ] (.:__span-5-32) [ 612 0 R /XYZ 60.307257 175.647170 0 ] (.:__span-5-33) [ 612 0 R /XYZ 60.307257 162.246818 0 ] (.:__span-5-34) [ 612 0 R /XYZ 60.307257 135.446114 0 ] (.:__span-5-35) [ 612 0 R /XYZ 60.307257 122.045762 0 ] (.:__span-5-36) [ 612 0 R /XYZ 60.307257 108.645410 0 ] (.:__span-5-37) [ 612 0 R /XYZ 60.307257 95.245058 0 ] (.:__span-5-38) [ 616 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-5-39) [ 616 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-5-4) [ 612 0 R /XYZ 60.307257 631.259138 0 ] (.:__span-5-40) [ 616 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-5-41) [ 616 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-5-42) [ 616 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-5-43) [ 616 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-5-44) [ 616 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-5-45) [ 616 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-5-46) [ 616 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-5-47) [ 616 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-5-48) [ 616 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-5-49) [ 616 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-5-5) [ 612 0 R /XYZ 60.307257 617.858786 0 ] (.:__span-5-50) [ 616 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-5-51) [ 616 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-5-52) [ 616 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-5-53) [ 616 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-5-54) [ 616 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-5-55) [ 616 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-5-56) [ 616 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-5-57) [ 616 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-5-58) [ 616 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-5-59) [ 616 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-5-6) [ 612 0 R /XYZ 60.307257 604.458434 0 ] (.:__span-5-60) [ 616 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-5-61) [ 616 0 R /XYZ 60.307257 409.214118 0 ] (.:__span-5-62) [ 616 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-5-7) [ 612 0 R /XYZ 60.307257 577.657730 0 ] (.:__span-5-8) [ 612 0 R /XYZ 60.307257 564.257378 0 ] (.:__span-5-9) [ 612 0 R /XYZ 60.307257 550.857026 0 ] (.:__span-6-1) [ 625 0 R /XYZ 60.307257 458.116602 0 ] (.:__span-6-10) [ 625 0 R /XYZ 60.307257 337.513434 0 ] (.:__span-6-100) [ 631 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-6-101) [ 631 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-6-102) [ 631 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-6-103) [ 631 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-6-104) [ 631 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-6-105) [ 631 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-6-106) [ 631 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-6-107) [ 631 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-6-108) [ 631 0 R /XYZ 60.307257 409.214118 0 ] (.:__span-6-109) [ 631 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-6-11) [ 625 0 R /XYZ 60.307257 324.113082 0 ] (.:__span-6-110) [ 631 0 R /XYZ 60.307257 382.413414 0 ] (.:__span-6-111) [ 631 0 R /XYZ 60.307257 369.013062 0 ] (.:__span-6-112) [ 631 0 R /XYZ 60.307257 355.612710 0 ] (.:__span-6-113) [ 631 0 R /XYZ 60.307257 342.212358 0 ] (.:__span-6-114) [ 631 0 R /XYZ 60.307257 328.812006 0 ] (.:__span-6-115) [ 631 0 R /XYZ 60.307257 315.411654 0 ] (.:__span-6-116) [ 631 0 R /XYZ 60.307257 302.011302 0 ] (.:__span-6-117) [ 631 0 R /XYZ 60.307257 288.610950 0 ] (.:__span-6-118) [ 631 0 R /XYZ 60.307257 275.210598 0 ] (.:__span-6-119) [ 631 0 R /XYZ 60.307257 261.810246 0 ] (.:__span-6-12) [ 625 0 R /XYZ 60.307257 310.712730 0 ] (.:__span-6-120) [ 631 0 R /XYZ 60.307257 248.409894 0 ] (.:__span-6-121) [ 631 0 R /XYZ 60.307257 235.009542 0 ] (.:__span-6-122) [ 631 0 R /XYZ 60.307257 221.609190 0 ] (.:__span-6-123) [ 631 0 R /XYZ 60.307257 208.208838 0 ] (.:__span-6-124) [ 631 0 R /XYZ 60.307257 194.808486 0 ] (.:__span-6-125) [ 631 0 R /XYZ 60.307257 181.408134 0 ] (.:__span-6-126) [ 631 0 R /XYZ 60.307257 168.007782 0 ] (.:__span-6-127) [ 631 0 R /XYZ 60.307257 154.607430 0 ] (.:__span-6-128) [ 631 0 R /XYZ 60.307257 141.207078 0 ] (.:__span-6-129) [ 631 0 R /XYZ 60.307257 127.806726 0 ] (.:__span-6-13) [ 625 0 R /XYZ 60.307257 297.312378 0 ] (.:__span-6-130) [ 631 0 R /XYZ 60.307257 114.406374 0 ] (.:__span-6-131) [ 631 0 R /XYZ 60.307257 101.006022 0 ] (.:__span-6-132) [ 631 0 R /XYZ 60.307257 87.605670 0 ] (.:__span-6-133) [ 633 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-6-134) [ 633 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-6-135) [ 633 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-6-136) [ 633 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-6-137) [ 633 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-6-138) [ 633 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-6-139) [ 633 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-6-14) [ 625 0 R /XYZ 60.307257 283.912026 0 ] (.:__span-6-140) [ 633 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-6-141) [ 633 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-6-142) [ 633 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-6-143) [ 633 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-6-144) [ 633 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-6-145) [ 633 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-6-146) [ 633 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-6-147) [ 633 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-6-148) [ 633 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-6-149) [ 633 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-6-15) [ 625 0 R /XYZ 60.307257 270.511674 0 ] (.:__span-6-150) [ 633 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-6-151) [ 633 0 R /XYZ 60.307257 529.817286 0 ] (.:__span-6-152) [ 633 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-6-153) [ 633 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-6-154) [ 633 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-6-155) [ 633 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-6-156) [ 633 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-6-157) [ 633 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-6-158) [ 633 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-6-159) [ 633 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-6-16) [ 625 0 R /XYZ 60.307257 257.111322 0 ] (.:__span-6-160) [ 633 0 R /XYZ 60.307257 409.214118 0 ] (.:__span-6-161) [ 633 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-6-162) [ 633 0 R /XYZ 60.307257 382.413414 0 ] (.:__span-6-163) [ 633 0 R /XYZ 60.307257 369.013062 0 ] (.:__span-6-17) [ 625 0 R /XYZ 60.307257 243.710970 0 ] (.:__span-6-18) [ 625 0 R /XYZ 60.307257 230.310618 0 ] (.:__span-6-19) [ 625 0 R /XYZ 60.307257 216.910266 0 ] (.:__span-6-2) [ 625 0 R /XYZ 60.307257 444.716250 0 ] (.:__span-6-20) [ 625 0 R /XYZ 60.307257 203.509914 0 ] (.:__span-6-21) [ 625 0 R /XYZ 60.307257 190.109562 0 ] (.:__span-6-22) [ 625 0 R /XYZ 60.307257 176.709210 0 ] (.:__span-6-23) [ 625 0 R /XYZ 60.307257 163.308858 0 ] (.:__span-6-24) [ 625 0 R /XYZ 60.307257 149.908506 0 ] (.:__span-6-25) [ 625 0 R /XYZ 60.307257 136.508154 0 ] (.:__span-6-26) [ 625 0 R /XYZ 60.307257 123.107802 0 ] (.:__span-6-27) [ 625 0 R /XYZ 60.307257 109.707450 0 ] (.:__span-6-28) [ 625 0 R /XYZ 60.307257 96.307098 0 ] (.:__span-6-29) [ 629 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-6-3) [ 625 0 R /XYZ 60.307257 431.315898 0 ] (.:__span-6-30) [ 629 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-6-31) [ 629 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-6-32) [ 629 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-6-33) [ 629 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-6-34) [ 629 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-6-35) [ 629 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-6-36) [ 629 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-6-37) [ 629 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-6-38) [ 629 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-6-39) [ 629 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-6-4) [ 625 0 R /XYZ 60.307257 417.915546 0 ] (.:__span-6-40) [ 629 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-6-41) [ 629 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-6-42) [ 629 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-6-43) [ 629 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-6-44) [ 629 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-6-45) [ 629 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-6-46) [ 629 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-6-47) [ 629 0 R /XYZ 60.307257 529.817286 0 ] (.:__span-6-48) [ 629 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-6-49) [ 629 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-6-5) [ 625 0 R /XYZ 60.307257 404.515194 0 ] (.:__span-6-50) [ 629 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-6-51) [ 629 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-6-52) [ 629 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-6-53) [ 629 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-6-54) [ 629 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-6-55) [ 629 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-6-56) [ 629 0 R /XYZ 60.307257 409.214118 0 ] (.:__span-6-57) [ 629 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-6-58) [ 629 0 R /XYZ 60.307257 382.413414 0 ] (.:__span-6-59) [ 629 0 R /XYZ 60.307257 369.013062 0 ] (.:__span-6-6) [ 625 0 R /XYZ 60.307257 391.114842 0 ] (.:__span-6-60) [ 629 0 R /XYZ 60.307257 355.612710 0 ] (.:__span-6-61) [ 629 0 R /XYZ 60.307257 342.212358 0 ] (.:__span-6-62) [ 629 0 R /XYZ 60.307257 328.812006 0 ] (.:__span-6-63) [ 629 0 R /XYZ 60.307257 315.411654 0 ] (.:__span-6-64) [ 629 0 R /XYZ 60.307257 302.011302 0 ] (.:__span-6-65) [ 629 0 R /XYZ 60.307257 288.610950 0 ] (.:__span-6-66) [ 629 0 R /XYZ 60.307257 275.210598 0 ] (.:__span-6-67) [ 629 0 R /XYZ 60.307257 261.810246 0 ] (.:__span-6-68) [ 629 0 R /XYZ 60.307257 248.409894 0 ] (.:__span-6-69) [ 629 0 R /XYZ 60.307257 235.009542 0 ] (.:__span-6-7) [ 625 0 R /XYZ 60.307257 377.714490 0 ] (.:__span-6-70) [ 629 0 R /XYZ 60.307257 221.609190 0 ] (.:__span-6-71) [ 629 0 R /XYZ 60.307257 208.208838 0 ] (.:__span-6-72) [ 629 0 R /XYZ 60.307257 194.808486 0 ] (.:__span-6-73) [ 629 0 R /XYZ 60.307257 181.408134 0 ] (.:__span-6-74) [ 629 0 R /XYZ 60.307257 168.007782 0 ] (.:__span-6-75) [ 629 0 R /XYZ 60.307257 154.607430 0 ] (.:__span-6-76) [ 629 0 R /XYZ 60.307257 141.207078 0 ] (.:__span-6-77) [ 629 0 R /XYZ 60.307257 127.806726 0 ] (.:__span-6-78) [ 629 0 R /XYZ 60.307257 114.406374 0 ] (.:__span-6-79) [ 629 0 R /XYZ 60.307257 101.006022 0 ] (.:__span-6-8) [ 625 0 R /XYZ 60.307257 364.314138 0 ] (.:__span-6-80) [ 629 0 R /XYZ 60.307257 87.605670 0 ] (.:__span-6-81) [ 631 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-6-82) [ 631 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-6-83) [ 631 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-6-84) [ 631 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-6-85) [ 631 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-6-86) [ 631 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-6-87) [ 631 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-6-88) [ 631 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-6-89) [ 631 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-6-9) [ 625 0 R /XYZ 60.307257 350.913786 0 ] (.:__span-6-90) [ 631 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-6-91) [ 631 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-6-92) [ 631 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-6-93) [ 631 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-6-94) [ 631 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-6-95) [ 631 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-6-96) [ 631 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-6-97) [ 631 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-6-98) [ 631 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-6-99) [ 631 0 R /XYZ 60.307257 529.817286 0 ] (.:__span-7-1) [ 866 0 R /XYZ 60.307257 428.812602 0 ] (.:__span-7-2) [ 866 0 R /XYZ 60.307257 415.412250 0 ] (.:__span-7-3) [ 866 0 R /XYZ 60.307257 402.011898 0 ] (.:__span-7-4) [ 866 0 R /XYZ 60.307257 388.611546 0 ] (.:__span-7-5) [ 866 0 R /XYZ 60.307257 375.211194 0 ] (.:__span-7-6) [ 866 0 R /XYZ 60.307257 361.810842 0 ] (.:__span-7-7) [ 866 0 R /XYZ 60.307257 348.410490 0 ] (.:__span-8-1) [ 868 0 R /XYZ 60.307257 381.602202 0 ] (.:__span-8-2) [ 868 0 R /XYZ 60.307257 368.201850 0 ] (.:__span-8-3) [ 868 0 R /XYZ 60.307257 354.801498 0 ] (.:__span-8-4) [ 868 0 R /XYZ 60.307257 341.401146 0 ] (.:__span-8-5) [ 868 0 R /XYZ 60.307257 328.000794 0 ] (.:__span-8-6) [ 868 0 R /XYZ 60.307257 314.600442 0 ] (.:__span-9-1) [ 873 0 R /XYZ 60.307257 458.458122 0 ] (.:__span-9-2) [ 873 0 R /XYZ 60.307257 445.057770 0 ] (.:__span-9-3) [ 873 0 R /XYZ 60.307257 431.657418 0 ] (.:__span-9-4) [ 873 0 R /XYZ 60.307257 418.257066 0 ] (.:__span-9-5) [ 873 0 R /XYZ 60.307257 404.856714 0 ] (.:__span-9-6) [ 873 0 R /XYZ 60.307257 391.456362 0 ] (.:__span-9-7) [ 873 0 R /XYZ 60.307257 378.056010 0 ] (.:abstract) [ 496 0 R /XYZ 39.386457 771.023622 0 ] (.:affichage-calcule) [ 878 0 R /XYZ 42.836457 716.541222 0 ] (.:affichage-des-donnees) [ 873 0 R /XYZ 39.386457 722.226822 0 ] (.:affichage-direct) [ 873 0 R /XYZ 42.836457 580.332822 0 ] (.:affichage-hybride) [ 878 0 R /XYZ 42.836457 667.744422 0 ] (.:affichage-predictif) [ 898 0 R /XYZ 42.836457 595.529850 0 ] (.:affichage-totalement-calcule) [ 888 0 R /XYZ 42.836457 353.735622 0 ] (.:ameliorations-futures) [ 911 0 R /XYZ 39.386457 771.023622 0 ] (.:analyse-fonctionnelle) [ 520 0 R /XYZ 39.386457 428.499402 0 ] (.:analyse-organique) [ 520 0 R /XYZ 39.386457 339.155502 0 ] (.:base-de-donnee) [ 860 0 R /XYZ 42.836457 353.394469 0 ] (.:cahier-des-charges) [ 498 0 R /XYZ 39.386457 550.499622 0 ] (.:calibration) [ 604 0 R /XYZ 42.836457 579.426906 0 ] (.:cas-dutilisation) [ 508 0 R /XYZ 39.386457 412.926066 0 ] (.:chiffres) [ 712 0 R /XYZ 42.836457 460.413222 0 ] (.:comment-ca-aurait-du-se-passer) [ 905 0 R /XYZ 39.386457 250.947249 0 ] (.:comment-ca-cest-passe) [ 900 0 R /XYZ 39.386457 682.814022 0 ] (.:comment-faire) [ 582 0 R /XYZ 42.836457 735.309222 0 ] (.:conclusion) [ 911 0 R /XYZ 39.386457 681.679722 0 ] (.:controler-le-navigateur) [ 589 0 R /XYZ 42.836457 387.800022 0 ] (.:csharp) [ 534 0 R /XYZ 42.836457 487.571622 0 ] (.:description-du-besoin) [ 496 0 R /XYZ 39.386457 343.911222 0 ] (.:differences-sur-le-cahier-des-charges) [ 512 0 R /XYZ 39.386457 368.746422 0 ] (.:difficultes-techniques) [ 512 0 R /XYZ 39.386457 638.709222 0 ] (.:drs) [ 802 0 R /XYZ 42.836457 584.282022 0 ] (.:dt) [ 514 0 R /XYZ 42.836457 404.984502 0 ] (.:dt1-creation-du-poster-1) [ 514 0 R /XYZ 42.836457 341.173302 0 ] (.:dt2-documentation-analyse-de-lexistant-2) [ 514 0 R /XYZ 42.836457 225.937782 0 ] (.:dt3-documentation-analyse-organique-5) [ 514 0 R /XYZ 42.836457 140.731062 0 ] (.:dt4-documentation-analyse-fonctionnelle-2) [ 516 0 R /XYZ 42.836457 692.198022 0 ] (.:dt5-documentation-tests-1) [ 516 0 R /XYZ 42.836457 552.564102 0 ] (.:dt6-documentation-reste-2) [ 516 0 R /XYZ 42.836457 476.741382 0 ] (.:ethique-du-projet) [ 909 0 R /XYZ 39.386457 299.414622 0 ] (.:filtres-et-methodes-sur-les-images) [ 802 0 R /XYZ 42.836457 523.473702 0 ] (.:filtres-et-traitement) [ 669 0 R /XYZ 42.836457 237.136277 0 ] (.:firefox) [ 544 0 R /XYZ 42.836457 389.978022 0 ] (.:fonctionnement-general) [ 551 0 R /XYZ 39.386457 435.021222 0 ] (.:fonctionnement-general_1) [ 635 0 R /XYZ 42.836457 771.023622 0 ] (.:introduction) [ 490 0 R /XYZ 39.386457 723.165222 0 ] (.:lecons) [ 909 0 R /XYZ 39.386457 613.372422 0 ] (.:les-briques-principales) [ 551 0 R /XYZ 42.836457 326.909622 0 ] (.:les-chiffres-2) [ 736 0 R /XYZ 42.836457 569.267622 0 ] (.:liste-des-pilotes) [ 606 0 R /XYZ 42.836457 771.023622 0 ] (.:notes-de-code) [ 911 0 R /XYZ 39.386457 592.335822 0 ] (.:ocr) [ 554 0 R /XYZ 42.836457 95.795299 0 ] (.:ocr_1) [ 633 0 R /XYZ 39.386457 303.179610 0 ] (.:optimisation-du-programme) [ 909 0 R /XYZ 39.386457 388.758522 0 ] (.:outils-utilises) [ 520 0 R /XYZ 39.386457 283.594002 0 ] (.:petit-point-resolution) [ 816 0 R /XYZ 42.836457 371.265222 0 ] (.:planning-effectif-et-differences) [ 520 0 R /XYZ 39.386457 517.843302 0 ] (.:planning-previsionnel) [ 512 0 R /XYZ 39.386457 279.402522 0 ] (.:pneus) [ 736 0 R /XYZ 42.836457 523.473702 0 ] (.:projet) [ 498 0 R /XYZ 39.386457 435.818922 0 ] (.:pt) [ 514 0 R /XYZ 42.836457 580.332822 0 ] (.:pt1-preparation-au-travail-de-diplome-2) [ 514 0 R /XYZ 42.836457 531.536022 0 ] (.:pt1-programmation-recuperation-des-images-3) [ 516 0 R /XYZ 42.836457 310.777062 0 ] (.:pt2-programmation-ocr-5) [ 518 0 R /XYZ 42.836457 771.023622 0 ] (.:pt3-programmation-stockage-et-modele-5) [ 518 0 R /XYZ 42.836457 625.759302 0 ] (.:pt4-programmation-vue-de-lapp-5) [ 518 0 R /XYZ 42.836457 495.509382 0 ] (.:pt5-programmation-mise-en-commun-3) [ 518 0 R /XYZ 42.836457 365.259462 0 ] (.:pt_1) [ 516 0 R /XYZ 42.836457 374.588262 0 ] (.:python) [ 539 0 R /XYZ 42.836457 517.600422 0 ] (.:quand-remplir-la-base) [ 864 0 R /XYZ 42.836457 256.212822 0 ] (.:quand-un-pilote-a-fait-un-arret-aux-stands) [ 868 0 R /XYZ 42.836457 771.023622 0 ] (.:quand-un-pilote-a-finit-un-tour) [ 866 0 R /XYZ 42.836457 746.625222 0 ] (.:rapport-track-trends-v10) [ 484 0 R /XYZ 39.386457 757.223622 0 ] (.:realisation) [ 500 0 R /XYZ 39.386457 771.023622 0 ] (.:recuperation-des-images) [ 573 0 R /XYZ 39.386457 253.026822 0 ] (.:recuperation-dimages) [ 551 0 R /XYZ 42.836457 263.098422 0 ] (.:recuperer-les-cookies) [ 596 0 R /XYZ 42.836457 409.684422 0 ] (.:resume) [ 490 0 R /XYZ 39.386457 667.603722 0 ] (.:resume-des-difficultes-techniques) [ 909 0 R /XYZ 39.386457 478.102422 0 ] (.:resume-du-fonctionnement-general) [ 564 0 R /XYZ 42.836457 187.703299 0 ] (.:selenium) [ 520 0 R /XYZ 42.836457 104.962002 0 ] (.:simuler-un-navigateur) [ 582 0 R /XYZ 42.836457 106.526022 0 ] (.:stockage) [ 625 0 R /XYZ 42.836457 646.430022 0 ] (.:stockage-des-donnees) [ 854 0 R /XYZ 39.386457 572.502822 0 ] (.:taches) [ 514 0 R /XYZ 39.386457 771.023622 0 ] (.:technologies-utilisees) [ 520 0 R /XYZ 39.386457 222.457602 0 ] (.:tesseract) [ 551 0 R /XYZ 42.836457 611.440422 0 ] (.:tests) [ 898 0 R /XYZ 39.386457 211.724250 0 ] (.:texte) [ 691 0 R /XYZ 42.836457 369.234822 0 ] (.:traitement-des-donnees) [ 842 0 R /XYZ 39.386457 195.312822 0 ] (.:traitement-et-affichage) [ 559 0 R /XYZ 42.836457 122.598958 0 ] (.:tt) [ 518 0 R /XYZ 42.836457 238.707942 0 ] (.:tt1-tests-ocr-2) [ 518 0 R /XYZ 42.836457 174.896742 0 ] (.:tt2-tests-finaux-2) [ 520 0 R /XYZ 42.836457 662.169222 0 ] (.:utilisation-de-chat-gpt) [ 909 0 R /XYZ 39.386457 195.056322 0 ] (.:windows-pilotes) [ 616 0 R /XYZ 42.836457 363.762714 0 ] (.:zone-principale) [ 606 0 R /XYZ 42.836457 640.773702 0 ] (.:zones-pilotes) [ 606 0 R /XYZ 42.836457 316.153201 0 ] (CahierDesCharges/:) [ 913 0 R /XYZ 39.386457 771.023622 0 ] (CahierDesCharges/:cahier-des-charges) [ 913 0 R /XYZ 39.386457 757.223622 0 ] (CahierDesCharges/:cas-dutilisation) [ 934 0 R /XYZ 39.386457 771.023622 0 ] (CahierDesCharges/:contexte) [ 913 0 R /XYZ 39.386457 669.390822 0 ] (CahierDesCharges/:difficultes-techniques) [ 936 0 R /XYZ 39.386457 771.023622 0 ] (CahierDesCharges/:projet) [ 918 0 R /XYZ 39.386457 124.199039 0 ] (CahierDesCharges/:realisation) [ 922 0 R /XYZ 39.386457 436.953222 0 ] (Code/ConfigurationTool/:) [ 1694 0 R /XYZ 39.386457 707.865222 0 ] (Code/ConfigurationTool/:__span-0-1) [ 1694 0 R /XYZ 60.307257 667.937022 0 ] (Code/ConfigurationTool/:__span-0-10) [ 1694 0 R /XYZ 60.307257 533.933502 0 ] (Code/ConfigurationTool/:__span-0-100) [ 1698 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-101) [ 1698 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-102) [ 1698 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-103) [ 1698 0 R /XYZ 60.307257 596.819046 0 ] (Code/ConfigurationTool/:__span-0-104) [ 1698 0 R /XYZ 60.307257 583.418694 0 ] (Code/ConfigurationTool/:__span-0-105) [ 1698 0 R /XYZ 60.307257 570.018342 0 ] (Code/ConfigurationTool/:__span-0-106) [ 1698 0 R /XYZ 60.307257 556.617990 0 ] (Code/ConfigurationTool/:__span-0-107) [ 1698 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-108) [ 1698 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-109) [ 1698 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-11) [ 1694 0 R /XYZ 60.307257 520.533150 0 ] (Code/ConfigurationTool/:__span-0-110) [ 1698 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-111) [ 1698 0 R /XYZ 60.307257 489.616230 0 ] (Code/ConfigurationTool/:__span-0-112) [ 1698 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-113) [ 1698 0 R /XYZ 60.307257 462.815526 0 ] (Code/ConfigurationTool/:__span-0-114) [ 1698 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-115) [ 1698 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-116) [ 1698 0 R /XYZ 60.307257 422.614470 0 ] (Code/ConfigurationTool/:__span-0-117) [ 1698 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-118) [ 1698 0 R /XYZ 60.307257 395.813766 0 ] (Code/ConfigurationTool/:__span-0-119) [ 1698 0 R /XYZ 60.307257 382.413414 0 ] (Code/ConfigurationTool/:__span-0-12) [ 1694 0 R /XYZ 60.307257 507.132798 0 ] (Code/ConfigurationTool/:__span-0-120) [ 1698 0 R /XYZ 60.307257 369.013062 0 ] (Code/ConfigurationTool/:__span-0-121) [ 1698 0 R /XYZ 60.307257 355.612710 0 ] (Code/ConfigurationTool/:__span-0-122) [ 1698 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-123) [ 1698 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-124) [ 1698 0 R /XYZ 60.307257 315.411654 0 ] (Code/ConfigurationTool/:__span-0-125) [ 1698 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-126) [ 1698 0 R /XYZ 60.307257 288.610950 0 ] (Code/ConfigurationTool/:__span-0-127) [ 1698 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-128) [ 1698 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-129) [ 1698 0 R /XYZ 60.307257 248.409894 0 ] (Code/ConfigurationTool/:__span-0-13) [ 1694 0 R /XYZ 60.307257 493.732446 0 ] (Code/ConfigurationTool/:__span-0-130) [ 1698 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-131) [ 1698 0 R /XYZ 60.307257 221.609190 0 ] (Code/ConfigurationTool/:__span-0-132) [ 1698 0 R /XYZ 60.307257 208.208838 0 ] (Code/ConfigurationTool/:__span-0-133) [ 1698 0 R /XYZ 60.307257 194.808486 0 ] (Code/ConfigurationTool/:__span-0-134) [ 1698 0 R /XYZ 60.307257 181.408134 0 ] (Code/ConfigurationTool/:__span-0-135) [ 1698 0 R /XYZ 60.307257 168.007782 0 ] (Code/ConfigurationTool/:__span-0-136) [ 1698 0 R /XYZ 60.307257 154.607430 0 ] (Code/ConfigurationTool/:__span-0-137) [ 1698 0 R /XYZ 60.307257 141.207078 0 ] (Code/ConfigurationTool/:__span-0-138) [ 1698 0 R /XYZ 60.307257 127.806726 0 ] (Code/ConfigurationTool/:__span-0-139) [ 1698 0 R /XYZ 60.307257 114.406374 0 ] (Code/ConfigurationTool/:__span-0-14) [ 1694 0 R /XYZ 60.307257 480.332094 0 ] (Code/ConfigurationTool/:__span-0-140) [ 1698 0 R /XYZ 60.307257 101.006022 0 ] (Code/ConfigurationTool/:__span-0-141) [ 1698 0 R /XYZ 60.307257 87.605670 0 ] (Code/ConfigurationTool/:__span-0-142) [ 1700 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-143) [ 1700 0 R /XYZ 60.307257 744.222918 0 ] (Code/ConfigurationTool/:__span-0-144) [ 1700 0 R /XYZ 60.307257 730.822566 0 ] (Code/ConfigurationTool/:__span-0-145) [ 1700 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-146) [ 1700 0 R /XYZ 60.307257 704.021862 0 ] (Code/ConfigurationTool/:__span-0-147) [ 1700 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-148) [ 1700 0 R /XYZ 60.307257 677.221158 0 ] (Code/ConfigurationTool/:__span-0-149) [ 1700 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-15) [ 1694 0 R /XYZ 60.307257 466.931742 0 ] (Code/ConfigurationTool/:__span-0-150) [ 1700 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:__span-0-151) [ 1700 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-152) [ 1700 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-153) [ 1700 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-154) [ 1700 0 R /XYZ 60.307257 596.819046 0 ] (Code/ConfigurationTool/:__span-0-155) [ 1700 0 R /XYZ 60.307257 583.418694 0 ] (Code/ConfigurationTool/:__span-0-156) [ 1700 0 R /XYZ 60.307257 570.018342 0 ] (Code/ConfigurationTool/:__span-0-157) [ 1700 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-158) [ 1700 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-159) [ 1700 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-16) [ 1694 0 R /XYZ 60.307257 453.531390 0 ] (Code/ConfigurationTool/:__span-0-160) [ 1700 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-161) [ 1700 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-162) [ 1700 0 R /XYZ 60.307257 462.815526 0 ] (Code/ConfigurationTool/:__span-0-163) [ 1700 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-164) [ 1700 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-165) [ 1700 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-166) [ 1700 0 R /XYZ 60.307257 395.813766 0 ] (Code/ConfigurationTool/:__span-0-167) [ 1700 0 R /XYZ 60.307257 382.413414 0 ] (Code/ConfigurationTool/:__span-0-168) [ 1700 0 R /XYZ 60.307257 369.013062 0 ] (Code/ConfigurationTool/:__span-0-169) [ 1700 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-17) [ 1694 0 R /XYZ 60.307257 440.131038 0 ] (Code/ConfigurationTool/:__span-0-170) [ 1700 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-171) [ 1700 0 R /XYZ 60.307257 315.411654 0 ] (Code/ConfigurationTool/:__span-0-172) [ 1700 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-173) [ 1700 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-174) [ 1700 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-175) [ 1700 0 R /XYZ 60.307257 248.409894 0 ] (Code/ConfigurationTool/:__span-0-176) [ 1700 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-177) [ 1700 0 R /XYZ 60.307257 208.208838 0 ] (Code/ConfigurationTool/:__span-0-178) [ 1700 0 R /XYZ 60.307257 194.808486 0 ] (Code/ConfigurationTool/:__span-0-179) [ 1700 0 R /XYZ 60.307257 181.408134 0 ] (Code/ConfigurationTool/:__span-0-18) [ 1694 0 R /XYZ 60.307257 426.730686 0 ] (Code/ConfigurationTool/:__span-0-180) [ 1700 0 R /XYZ 60.307257 168.007782 0 ] (Code/ConfigurationTool/:__span-0-181) [ 1700 0 R /XYZ 60.307257 141.207078 0 ] (Code/ConfigurationTool/:__span-0-182) [ 1700 0 R /XYZ 60.307257 127.806726 0 ] (Code/ConfigurationTool/:__span-0-183) [ 1700 0 R /XYZ 60.307257 114.406374 0 ] (Code/ConfigurationTool/:__span-0-184) [ 1700 0 R /XYZ 60.307257 101.006022 0 ] (Code/ConfigurationTool/:__span-0-185) [ 1702 0 R /XYZ 60.307257 771.023622 0 ] (Code/ConfigurationTool/:__span-0-186) [ 1702 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-187) [ 1702 0 R /XYZ 60.307257 744.222918 0 ] (Code/ConfigurationTool/:__span-0-188) [ 1702 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-189) [ 1702 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-19) [ 1694 0 R /XYZ 60.307257 413.330334 0 ] (Code/ConfigurationTool/:__span-0-190) [ 1702 0 R /XYZ 60.307257 677.221158 0 ] (Code/ConfigurationTool/:__span-0-191) [ 1702 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-192) [ 1702 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:__span-0-193) [ 1702 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-194) [ 1702 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-195) [ 1702 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-196) [ 1702 0 R /XYZ 60.307257 583.418694 0 ] (Code/ConfigurationTool/:__span-0-197) [ 1702 0 R /XYZ 60.307257 556.617990 0 ] (Code/ConfigurationTool/:__span-0-198) [ 1702 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-199) [ 1702 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-2) [ 1694 0 R /XYZ 60.307257 654.536670 0 ] (Code/ConfigurationTool/:__span-0-20) [ 1694 0 R /XYZ 60.307257 399.929982 0 ] (Code/ConfigurationTool/:__span-0-200) [ 1702 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-201) [ 1702 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-202) [ 1702 0 R /XYZ 60.307257 489.616230 0 ] (Code/ConfigurationTool/:__span-0-203) [ 1702 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-204) [ 1702 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-205) [ 1702 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-206) [ 1702 0 R /XYZ 60.307257 422.614470 0 ] (Code/ConfigurationTool/:__span-0-207) [ 1702 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-208) [ 1702 0 R /XYZ 60.307257 395.813766 0 ] (Code/ConfigurationTool/:__span-0-209) [ 1702 0 R /XYZ 60.307257 369.013062 0 ] (Code/ConfigurationTool/:__span-0-21) [ 1694 0 R /XYZ 60.307257 386.529630 0 ] (Code/ConfigurationTool/:__span-0-210) [ 1702 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-211) [ 1702 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-212) [ 1702 0 R /XYZ 60.307257 315.411654 0 ] (Code/ConfigurationTool/:__span-0-213) [ 1702 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-214) [ 1702 0 R /XYZ 60.307257 288.610950 0 ] (Code/ConfigurationTool/:__span-0-215) [ 1702 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-216) [ 1702 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-217) [ 1702 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-218) [ 1702 0 R /XYZ 60.307257 221.609190 0 ] (Code/ConfigurationTool/:__span-0-219) [ 1702 0 R /XYZ 60.307257 208.208838 0 ] (Code/ConfigurationTool/:__span-0-22) [ 1694 0 R /XYZ 60.307257 373.129278 0 ] (Code/ConfigurationTool/:__span-0-220) [ 1702 0 R /XYZ 60.307257 194.808486 0 ] (Code/ConfigurationTool/:__span-0-221) [ 1702 0 R /XYZ 60.307257 181.408134 0 ] (Code/ConfigurationTool/:__span-0-222) [ 1702 0 R /XYZ 60.307257 154.607430 0 ] (Code/ConfigurationTool/:__span-0-223) [ 1702 0 R /XYZ 60.307257 141.207078 0 ] (Code/ConfigurationTool/:__span-0-224) [ 1702 0 R /XYZ 60.307257 127.806726 0 ] (Code/ConfigurationTool/:__span-0-225) [ 1702 0 R /XYZ 60.307257 101.006022 0 ] (Code/ConfigurationTool/:__span-0-226) [ 1702 0 R /XYZ 60.307257 87.605670 0 ] (Code/ConfigurationTool/:__span-0-227) [ 1704 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-228) [ 1704 0 R /XYZ 60.307257 730.822566 0 ] (Code/ConfigurationTool/:__span-0-229) [ 1704 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-23) [ 1694 0 R /XYZ 60.307257 359.728926 0 ] (Code/ConfigurationTool/:__span-0-230) [ 1704 0 R /XYZ 60.307257 704.021862 0 ] (Code/ConfigurationTool/:__span-0-231) [ 1704 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-232) [ 1704 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-233) [ 1704 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:__span-0-234) [ 1704 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-235) [ 1704 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-236) [ 1704 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-237) [ 1704 0 R /XYZ 60.307257 596.819046 0 ] (Code/ConfigurationTool/:__span-0-238) [ 1704 0 R /XYZ 60.307257 583.418694 0 ] (Code/ConfigurationTool/:__span-0-239) [ 1704 0 R /XYZ 60.307257 570.018342 0 ] (Code/ConfigurationTool/:__span-0-24) [ 1694 0 R /XYZ 60.307257 346.328574 0 ] (Code/ConfigurationTool/:__span-0-240) [ 1704 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-241) [ 1704 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-242) [ 1704 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-243) [ 1704 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-244) [ 1704 0 R /XYZ 60.307257 489.616230 0 ] (Code/ConfigurationTool/:__span-0-245) [ 1704 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-246) [ 1704 0 R /XYZ 60.307257 462.815526 0 ] (Code/ConfigurationTool/:__span-0-247) [ 1704 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-248) [ 1704 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-249) [ 1704 0 R /XYZ 60.307257 422.614470 0 ] (Code/ConfigurationTool/:__span-0-25) [ 1694 0 R /XYZ 60.307257 332.928222 0 ] (Code/ConfigurationTool/:__span-0-250) [ 1704 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-251) [ 1704 0 R /XYZ 60.307257 382.413414 0 ] (Code/ConfigurationTool/:__span-0-252) [ 1704 0 R /XYZ 60.307257 355.612710 0 ] (Code/ConfigurationTool/:__span-0-253) [ 1704 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-254) [ 1704 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-255) [ 1704 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-256) [ 1704 0 R /XYZ 60.307257 288.610950 0 ] (Code/ConfigurationTool/:__span-0-257) [ 1704 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-258) [ 1704 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-259) [ 1704 0 R /XYZ 60.307257 248.409894 0 ] (Code/ConfigurationTool/:__span-0-26) [ 1694 0 R /XYZ 60.307257 319.527870 0 ] (Code/ConfigurationTool/:__span-0-260) [ 1704 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-261) [ 1704 0 R /XYZ 60.307257 221.609190 0 ] (Code/ConfigurationTool/:__span-0-27) [ 1694 0 R /XYZ 60.307257 306.127518 0 ] (Code/ConfigurationTool/:__span-0-28) [ 1694 0 R /XYZ 60.307257 279.326814 0 ] (Code/ConfigurationTool/:__span-0-29) [ 1694 0 R /XYZ 60.307257 265.926462 0 ] (Code/ConfigurationTool/:__span-0-3) [ 1694 0 R /XYZ 60.307257 641.136318 0 ] (Code/ConfigurationTool/:__span-0-30) [ 1694 0 R /XYZ 60.307257 239.125758 0 ] (Code/ConfigurationTool/:__span-0-31) [ 1694 0 R /XYZ 60.307257 212.325054 0 ] (Code/ConfigurationTool/:__span-0-32) [ 1694 0 R /XYZ 60.307257 198.924702 0 ] (Code/ConfigurationTool/:__span-0-33) [ 1694 0 R /XYZ 60.307257 185.524350 0 ] (Code/ConfigurationTool/:__span-0-34) [ 1694 0 R /XYZ 60.307257 172.123998 0 ] (Code/ConfigurationTool/:__span-0-35) [ 1694 0 R /XYZ 60.307257 158.723646 0 ] (Code/ConfigurationTool/:__span-0-36) [ 1694 0 R /XYZ 60.307257 145.323294 0 ] (Code/ConfigurationTool/:__span-0-37) [ 1694 0 R /XYZ 60.307257 131.922942 0 ] (Code/ConfigurationTool/:__span-0-38) [ 1694 0 R /XYZ 60.307257 118.522590 0 ] (Code/ConfigurationTool/:__span-0-39) [ 1694 0 R /XYZ 60.307257 105.122238 0 ] (Code/ConfigurationTool/:__span-0-4) [ 1694 0 R /XYZ 60.307257 627.735966 0 ] (Code/ConfigurationTool/:__span-0-40) [ 1694 0 R /XYZ 60.307257 91.721886 0 ] (Code/ConfigurationTool/:__span-0-41) [ 1696 0 R /XYZ 60.307257 771.023622 0 ] (Code/ConfigurationTool/:__span-0-42) [ 1696 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-43) [ 1696 0 R /XYZ 60.307257 744.222918 0 ] (Code/ConfigurationTool/:__span-0-44) [ 1696 0 R /XYZ 60.307257 730.822566 0 ] (Code/ConfigurationTool/:__span-0-45) [ 1696 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-46) [ 1696 0 R /XYZ 60.307257 704.021862 0 ] (Code/ConfigurationTool/:__span-0-47) [ 1696 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-48) [ 1696 0 R /XYZ 60.307257 677.221158 0 ] (Code/ConfigurationTool/:__span-0-49) [ 1696 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-5) [ 1694 0 R /XYZ 60.307257 600.935262 0 ] (Code/ConfigurationTool/:__span-0-50) [ 1696 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:__span-0-51) [ 1696 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-52) [ 1696 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-53) [ 1696 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-54) [ 1696 0 R /XYZ 60.307257 570.018342 0 ] (Code/ConfigurationTool/:__span-0-55) [ 1696 0 R /XYZ 60.307257 556.617990 0 ] (Code/ConfigurationTool/:__span-0-56) [ 1696 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-57) [ 1696 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-58) [ 1696 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-59) [ 1696 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-6) [ 1694 0 R /XYZ 60.307257 587.534910 0 ] (Code/ConfigurationTool/:__span-0-60) [ 1696 0 R /XYZ 60.307257 489.616230 0 ] (Code/ConfigurationTool/:__span-0-61) [ 1696 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-62) [ 1696 0 R /XYZ 60.307257 462.815526 0 ] (Code/ConfigurationTool/:__span-0-63) [ 1696 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-64) [ 1696 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-65) [ 1696 0 R /XYZ 60.307257 422.614470 0 ] (Code/ConfigurationTool/:__span-0-66) [ 1696 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-67) [ 1696 0 R /XYZ 60.307257 395.813766 0 ] (Code/ConfigurationTool/:__span-0-68) [ 1696 0 R /XYZ 60.307257 382.413414 0 ] (Code/ConfigurationTool/:__span-0-69) [ 1696 0 R /XYZ 60.307257 369.013062 0 ] (Code/ConfigurationTool/:__span-0-7) [ 1694 0 R /XYZ 60.307257 574.134558 0 ] (Code/ConfigurationTool/:__span-0-70) [ 1696 0 R /XYZ 60.307257 355.612710 0 ] (Code/ConfigurationTool/:__span-0-71) [ 1696 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-72) [ 1696 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-73) [ 1696 0 R /XYZ 60.307257 315.411654 0 ] (Code/ConfigurationTool/:__span-0-74) [ 1696 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-75) [ 1696 0 R /XYZ 60.307257 288.610950 0 ] (Code/ConfigurationTool/:__span-0-76) [ 1696 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-77) [ 1696 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-78) [ 1696 0 R /XYZ 60.307257 248.409894 0 ] (Code/ConfigurationTool/:__span-0-79) [ 1696 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-8) [ 1694 0 R /XYZ 60.307257 560.734206 0 ] (Code/ConfigurationTool/:__span-0-80) [ 1696 0 R /XYZ 60.307257 221.609190 0 ] (Code/ConfigurationTool/:__span-0-81) [ 1696 0 R /XYZ 60.307257 208.208838 0 ] (Code/ConfigurationTool/:__span-0-82) [ 1696 0 R /XYZ 60.307257 194.808486 0 ] (Code/ConfigurationTool/:__span-0-83) [ 1696 0 R /XYZ 60.307257 181.408134 0 ] (Code/ConfigurationTool/:__span-0-84) [ 1696 0 R /XYZ 60.307257 168.007782 0 ] (Code/ConfigurationTool/:__span-0-85) [ 1696 0 R /XYZ 60.307257 154.607430 0 ] (Code/ConfigurationTool/:__span-0-86) [ 1696 0 R /XYZ 60.307257 141.207078 0 ] (Code/ConfigurationTool/:__span-0-87) [ 1696 0 R /XYZ 60.307257 127.806726 0 ] (Code/ConfigurationTool/:__span-0-88) [ 1696 0 R /XYZ 60.307257 101.006022 0 ] (Code/ConfigurationTool/:__span-0-89) [ 1696 0 R /XYZ 60.307257 87.605670 0 ] (Code/ConfigurationTool/:__span-0-9) [ 1694 0 R /XYZ 60.307257 547.333854 0 ] (Code/ConfigurationTool/:__span-0-90) [ 1698 0 R /XYZ 60.307257 771.023622 0 ] (Code/ConfigurationTool/:__span-0-91) [ 1698 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-92) [ 1698 0 R /XYZ 60.307257 744.222918 0 ] (Code/ConfigurationTool/:__span-0-93) [ 1698 0 R /XYZ 60.307257 730.822566 0 ] (Code/ConfigurationTool/:__span-0-94) [ 1698 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-95) [ 1698 0 R /XYZ 60.307257 704.021862 0 ] (Code/ConfigurationTool/:__span-0-96) [ 1698 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-97) [ 1698 0 R /XYZ 60.307257 677.221158 0 ] (Code/ConfigurationTool/:__span-0-98) [ 1698 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-99) [ 1698 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:configurationtoolcs) [ 1694 0 R /XYZ 39.386457 707.865222 0 ] (Code/DataWrapper/:) [ 1802 0 R /XYZ 39.386457 747.563622 0 ] (Code/DataWrapper/:__span-0-1) [ 1802 0 R /XYZ 60.307257 707.635422 0 ] (Code/DataWrapper/:__span-0-10) [ 1802 0 R /XYZ 60.307257 560.231550 0 ] (Code/DataWrapper/:__span-0-100) [ 1806 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-101) [ 1806 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-102) [ 1806 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-103) [ 1806 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-104) [ 1806 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-105) [ 1806 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-106) [ 1806 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-107) [ 1806 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-108) [ 1806 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-109) [ 1806 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-11) [ 1802 0 R /XYZ 60.307257 546.831198 0 ] (Code/DataWrapper/:__span-0-110) [ 1806 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-111) [ 1806 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-112) [ 1806 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-113) [ 1806 0 R /XYZ 60.307257 194.808486 0 ] (Code/DataWrapper/:__span-0-114) [ 1806 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-115) [ 1806 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-116) [ 1806 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-117) [ 1806 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-118) [ 1806 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-119) [ 1806 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-12) [ 1802 0 R /XYZ 60.307257 533.430846 0 ] (Code/DataWrapper/:__span-0-120) [ 1806 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-121) [ 1808 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-122) [ 1808 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-123) [ 1808 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-124) [ 1808 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-125) [ 1808 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-126) [ 1808 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-127) [ 1808 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-128) [ 1808 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-129) [ 1808 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-13) [ 1802 0 R /XYZ 60.307257 520.030494 0 ] (Code/DataWrapper/:__span-0-130) [ 1808 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-131) [ 1808 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-132) [ 1808 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-133) [ 1808 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-134) [ 1808 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-135) [ 1808 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-136) [ 1808 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-137) [ 1808 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-138) [ 1808 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-139) [ 1808 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-14) [ 1802 0 R /XYZ 60.307257 506.630142 0 ] (Code/DataWrapper/:__span-0-140) [ 1808 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-141) [ 1808 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-142) [ 1808 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-143) [ 1808 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-144) [ 1808 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-145) [ 1808 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-146) [ 1808 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-147) [ 1808 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-148) [ 1808 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-149) [ 1808 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-15) [ 1802 0 R /XYZ 60.307257 493.229790 0 ] (Code/DataWrapper/:__span-0-150) [ 1808 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-151) [ 1808 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-152) [ 1808 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-153) [ 1808 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-154) [ 1808 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-155) [ 1808 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-156) [ 1808 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-157) [ 1808 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-158) [ 1808 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-159) [ 1808 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-16) [ 1802 0 R /XYZ 60.307257 479.829438 0 ] (Code/DataWrapper/:__span-0-160) [ 1808 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-161) [ 1808 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-162) [ 1808 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-163) [ 1808 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-164) [ 1808 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-165) [ 1810 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-166) [ 1810 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-167) [ 1810 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-168) [ 1810 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-169) [ 1810 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-17) [ 1802 0 R /XYZ 60.307257 466.429086 0 ] (Code/DataWrapper/:__span-0-170) [ 1810 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-171) [ 1810 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-172) [ 1810 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-173) [ 1810 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-174) [ 1810 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-175) [ 1810 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-176) [ 1810 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-177) [ 1810 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-178) [ 1810 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-179) [ 1810 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-18) [ 1802 0 R /XYZ 60.307257 453.028734 0 ] (Code/DataWrapper/:__span-0-180) [ 1810 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-181) [ 1810 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-182) [ 1810 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-183) [ 1810 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-184) [ 1810 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-185) [ 1810 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-186) [ 1810 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-187) [ 1810 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-188) [ 1810 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-189) [ 1810 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-19) [ 1802 0 R /XYZ 60.307257 439.628382 0 ] (Code/DataWrapper/:__span-0-190) [ 1810 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-191) [ 1810 0 R /XYZ 60.307257 355.612710 0 ] (Code/DataWrapper/:__span-0-192) [ 1810 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-193) [ 1810 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-194) [ 1810 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-195) [ 1810 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-196) [ 1810 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-197) [ 1810 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-198) [ 1810 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-199) [ 1810 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-2) [ 1802 0 R /XYZ 60.307257 694.235070 0 ] (Code/DataWrapper/:__span-0-20) [ 1802 0 R /XYZ 60.307257 426.228030 0 ] (Code/DataWrapper/:__span-0-200) [ 1810 0 R /XYZ 60.307257 221.609190 0 ] (Code/DataWrapper/:__span-0-201) [ 1810 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-202) [ 1810 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-203) [ 1810 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-204) [ 1810 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-205) [ 1810 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-206) [ 1810 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-207) [ 1812 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-208) [ 1812 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-209) [ 1812 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-21) [ 1802 0 R /XYZ 60.307257 412.827678 0 ] (Code/DataWrapper/:__span-0-210) [ 1812 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-211) [ 1812 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-212) [ 1812 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-213) [ 1812 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-214) [ 1812 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-215) [ 1812 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-216) [ 1812 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-217) [ 1812 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-218) [ 1812 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-219) [ 1812 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-22) [ 1802 0 R /XYZ 60.307257 399.427326 0 ] (Code/DataWrapper/:__span-0-220) [ 1812 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-221) [ 1812 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-222) [ 1812 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-223) [ 1812 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-224) [ 1812 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-225) [ 1812 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-226) [ 1812 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-227) [ 1812 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-228) [ 1812 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-229) [ 1812 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-23) [ 1802 0 R /XYZ 60.307257 372.626622 0 ] (Code/DataWrapper/:__span-0-230) [ 1812 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-231) [ 1812 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-232) [ 1812 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-233) [ 1812 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-234) [ 1812 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-235) [ 1812 0 R /XYZ 60.307257 355.612710 0 ] (Code/DataWrapper/:__span-0-236) [ 1812 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-237) [ 1812 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-238) [ 1812 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-239) [ 1812 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-24) [ 1802 0 R /XYZ 60.307257 359.226270 0 ] (Code/DataWrapper/:__span-0-240) [ 1812 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-241) [ 1812 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-242) [ 1812 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-243) [ 1812 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-244) [ 1812 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-245) [ 1812 0 R /XYZ 60.307257 194.808486 0 ] (Code/DataWrapper/:__span-0-246) [ 1812 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-247) [ 1812 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-248) [ 1812 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-249) [ 1812 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-25) [ 1802 0 R /XYZ 60.307257 332.425566 0 ] (Code/DataWrapper/:__span-0-250) [ 1812 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-251) [ 1812 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-252) [ 1812 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-253) [ 1814 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-254) [ 1814 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-255) [ 1814 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-256) [ 1814 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-257) [ 1814 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-258) [ 1814 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-259) [ 1814 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-26) [ 1802 0 R /XYZ 60.307257 319.025214 0 ] (Code/DataWrapper/:__span-0-260) [ 1814 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-261) [ 1814 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-262) [ 1814 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-263) [ 1814 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-264) [ 1814 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-265) [ 1814 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-266) [ 1814 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-267) [ 1814 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-268) [ 1814 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-269) [ 1814 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-27) [ 1802 0 R /XYZ 60.307257 292.224510 0 ] (Code/DataWrapper/:__span-0-270) [ 1814 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-271) [ 1814 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-272) [ 1814 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-273) [ 1814 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-274) [ 1814 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-275) [ 1814 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-276) [ 1814 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-277) [ 1814 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-278) [ 1814 0 R /XYZ 60.307257 355.612710 0 ] (Code/DataWrapper/:__span-0-279) [ 1814 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-28) [ 1802 0 R /XYZ 60.307257 278.824158 0 ] (Code/DataWrapper/:__span-0-280) [ 1814 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-281) [ 1814 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-282) [ 1814 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-283) [ 1814 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-284) [ 1814 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-285) [ 1814 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-286) [ 1814 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-287) [ 1814 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-288) [ 1814 0 R /XYZ 60.307257 221.609190 0 ] (Code/DataWrapper/:__span-0-289) [ 1814 0 R /XYZ 60.307257 194.808486 0 ] (Code/DataWrapper/:__span-0-29) [ 1802 0 R /XYZ 60.307257 265.423806 0 ] (Code/DataWrapper/:__span-0-290) [ 1814 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-291) [ 1814 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-292) [ 1814 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-293) [ 1814 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-294) [ 1814 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-295) [ 1814 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-296) [ 1814 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-297) [ 1816 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-298) [ 1816 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-299) [ 1816 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-3) [ 1802 0 R /XYZ 60.307257 680.834718 0 ] (Code/DataWrapper/:__span-0-30) [ 1802 0 R /XYZ 60.307257 252.023454 0 ] (Code/DataWrapper/:__span-0-300) [ 1816 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-301) [ 1816 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-302) [ 1816 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-303) [ 1816 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-304) [ 1816 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-305) [ 1816 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-306) [ 1816 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-307) [ 1816 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-308) [ 1816 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-309) [ 1816 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-31) [ 1802 0 R /XYZ 60.307257 238.623102 0 ] (Code/DataWrapper/:__span-0-310) [ 1816 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-311) [ 1816 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-312) [ 1816 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-313) [ 1816 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-314) [ 1816 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-315) [ 1816 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-316) [ 1816 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-317) [ 1816 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-318) [ 1816 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-319) [ 1816 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-32) [ 1802 0 R /XYZ 60.307257 185.021694 0 ] (Code/DataWrapper/:__span-0-320) [ 1816 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-321) [ 1816 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-322) [ 1816 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-323) [ 1816 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-324) [ 1816 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-325) [ 1816 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-326) [ 1816 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-327) [ 1816 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-328) [ 1816 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-329) [ 1816 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-33) [ 1802 0 R /XYZ 60.307257 171.621342 0 ] (Code/DataWrapper/:__span-0-330) [ 1816 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-331) [ 1816 0 R /XYZ 60.307257 221.609190 0 ] (Code/DataWrapper/:__span-0-332) [ 1816 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-333) [ 1816 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-334) [ 1816 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-335) [ 1816 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-336) [ 1816 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-337) [ 1816 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-338) [ 1816 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-339) [ 1818 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-34) [ 1802 0 R /XYZ 60.307257 158.220990 0 ] (Code/DataWrapper/:__span-0-340) [ 1818 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-341) [ 1818 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-342) [ 1818 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-343) [ 1818 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-344) [ 1818 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-345) [ 1818 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-346) [ 1818 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-347) [ 1818 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-348) [ 1818 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-349) [ 1818 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-35) [ 1802 0 R /XYZ 60.307257 144.820638 0 ] (Code/DataWrapper/:__span-0-350) [ 1818 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-351) [ 1818 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-352) [ 1818 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-353) [ 1818 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-354) [ 1818 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-355) [ 1818 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-356) [ 1818 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-357) [ 1818 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-358) [ 1818 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-359) [ 1818 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-36) [ 1802 0 R /XYZ 60.307257 104.619582 0 ] (Code/DataWrapper/:__span-0-360) [ 1818 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-361) [ 1818 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-362) [ 1818 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-363) [ 1818 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-364) [ 1818 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-365) [ 1818 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-366) [ 1818 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-367) [ 1818 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-368) [ 1818 0 R /XYZ 60.307257 355.612710 0 ] (Code/DataWrapper/:__span-0-369) [ 1818 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-37) [ 1802 0 R /XYZ 60.307257 91.219230 0 ] (Code/DataWrapper/:__span-0-370) [ 1818 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-371) [ 1818 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-372) [ 1818 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-373) [ 1818 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-374) [ 1818 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-375) [ 1818 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-376) [ 1818 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-377) [ 1818 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-378) [ 1818 0 R /XYZ 60.307257 221.609190 0 ] (Code/DataWrapper/:__span-0-379) [ 1818 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-38) [ 1804 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-39) [ 1804 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-4) [ 1802 0 R /XYZ 60.307257 667.434366 0 ] (Code/DataWrapper/:__span-0-40) [ 1804 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-41) [ 1804 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-42) [ 1804 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-43) [ 1804 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-44) [ 1804 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-45) [ 1804 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-46) [ 1804 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-47) [ 1804 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-48) [ 1804 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-49) [ 1804 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-5) [ 1802 0 R /XYZ 60.307257 627.233310 0 ] (Code/DataWrapper/:__span-0-50) [ 1804 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-51) [ 1804 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-52) [ 1804 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-53) [ 1804 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-54) [ 1804 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-55) [ 1804 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-56) [ 1804 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-57) [ 1804 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-58) [ 1804 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-59) [ 1804 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-6) [ 1802 0 R /XYZ 60.307257 613.832958 0 ] (Code/DataWrapper/:__span-0-60) [ 1804 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-61) [ 1804 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-62) [ 1804 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-63) [ 1804 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-64) [ 1804 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-65) [ 1804 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-66) [ 1804 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-67) [ 1804 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-68) [ 1804 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-69) [ 1804 0 R /XYZ 60.307257 194.808486 0 ] (Code/DataWrapper/:__span-0-7) [ 1802 0 R /XYZ 60.307257 600.432606 0 ] (Code/DataWrapper/:__span-0-70) [ 1804 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-71) [ 1804 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-72) [ 1804 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-73) [ 1804 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-74) [ 1804 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-75) [ 1804 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-76) [ 1804 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-77) [ 1804 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-78) [ 1806 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-79) [ 1806 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-8) [ 1802 0 R /XYZ 60.307257 587.032254 0 ] (Code/DataWrapper/:__span-0-80) [ 1806 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-81) [ 1806 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-82) [ 1806 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-83) [ 1806 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-84) [ 1806 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-85) [ 1806 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-86) [ 1806 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-87) [ 1806 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-88) [ 1806 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-89) [ 1806 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-9) [ 1802 0 R /XYZ 60.307257 573.631902 0 ] (Code/DataWrapper/:__span-0-90) [ 1806 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-91) [ 1806 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-92) [ 1806 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-93) [ 1806 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-94) [ 1806 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-95) [ 1806 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-96) [ 1806 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-97) [ 1806 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-98) [ 1806 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-99) [ 1806 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:datawrappercs) [ 1802 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverData/:) [ 1706 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverData/:__span-0-1) [ 1706 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverData/:__span-0-10) [ 1706 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverData/:__span-0-100) [ 1710 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverData/:__span-0-101) [ 1710 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverData/:__span-0-102) [ 1710 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverData/:__span-0-103) [ 1710 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverData/:__span-0-104) [ 1710 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverData/:__span-0-105) [ 1710 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverData/:__span-0-11) [ 1706 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverData/:__span-0-12) [ 1706 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverData/:__span-0-13) [ 1706 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverData/:__span-0-14) [ 1706 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverData/:__span-0-15) [ 1706 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverData/:__span-0-16) [ 1706 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverData/:__span-0-17) [ 1706 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverData/:__span-0-18) [ 1706 0 R /XYZ 60.307257 466.429086 0 ] (Code/DriverData/:__span-0-19) [ 1706 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverData/:__span-0-2) [ 1706 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverData/:__span-0-20) [ 1706 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverData/:__span-0-21) [ 1706 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverData/:__span-0-22) [ 1706 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverData/:__span-0-23) [ 1706 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverData/:__span-0-24) [ 1706 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverData/:__span-0-25) [ 1706 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverData/:__span-0-26) [ 1706 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverData/:__span-0-27) [ 1706 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverData/:__span-0-28) [ 1706 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverData/:__span-0-29) [ 1706 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverData/:__span-0-3) [ 1706 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverData/:__span-0-30) [ 1706 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverData/:__span-0-31) [ 1706 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverData/:__span-0-32) [ 1706 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverData/:__span-0-33) [ 1706 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverData/:__span-0-34) [ 1706 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverData/:__span-0-35) [ 1706 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverData/:__span-0-36) [ 1706 0 R /XYZ 60.307257 211.822398 0 ] (Code/DriverData/:__span-0-37) [ 1706 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverData/:__span-0-38) [ 1706 0 R /XYZ 60.307257 185.021694 0 ] (Code/DriverData/:__span-0-39) [ 1706 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverData/:__span-0-4) [ 1706 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverData/:__span-0-40) [ 1706 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverData/:__span-0-41) [ 1706 0 R /XYZ 60.307257 144.820638 0 ] (Code/DriverData/:__span-0-42) [ 1706 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverData/:__span-0-43) [ 1706 0 R /XYZ 60.307257 118.019934 0 ] (Code/DriverData/:__span-0-44) [ 1706 0 R /XYZ 60.307257 104.619582 0 ] (Code/DriverData/:__span-0-45) [ 1706 0 R /XYZ 60.307257 91.219230 0 ] (Code/DriverData/:__span-0-46) [ 1708 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverData/:__span-0-47) [ 1708 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverData/:__span-0-48) [ 1708 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverData/:__span-0-49) [ 1708 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverData/:__span-0-5) [ 1706 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverData/:__span-0-50) [ 1708 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverData/:__span-0-51) [ 1708 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverData/:__span-0-52) [ 1708 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverData/:__span-0-53) [ 1708 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverData/:__span-0-54) [ 1708 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverData/:__span-0-55) [ 1708 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverData/:__span-0-56) [ 1708 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverData/:__span-0-57) [ 1708 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverData/:__span-0-58) [ 1708 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverData/:__span-0-59) [ 1708 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverData/:__span-0-6) [ 1706 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverData/:__span-0-60) [ 1708 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverData/:__span-0-61) [ 1708 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverData/:__span-0-62) [ 1708 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverData/:__span-0-63) [ 1708 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverData/:__span-0-64) [ 1708 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverData/:__span-0-65) [ 1708 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverData/:__span-0-66) [ 1708 0 R /XYZ 60.307257 489.616230 0 ] (Code/DriverData/:__span-0-67) [ 1708 0 R /XYZ 60.307257 476.215878 0 ] (Code/DriverData/:__span-0-68) [ 1708 0 R /XYZ 60.307257 449.415174 0 ] (Code/DriverData/:__span-0-69) [ 1708 0 R /XYZ 60.307257 436.014822 0 ] (Code/DriverData/:__span-0-7) [ 1706 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverData/:__span-0-70) [ 1708 0 R /XYZ 60.307257 422.614470 0 ] (Code/DriverData/:__span-0-71) [ 1708 0 R /XYZ 60.307257 409.214118 0 ] (Code/DriverData/:__span-0-72) [ 1708 0 R /XYZ 60.307257 382.413414 0 ] (Code/DriverData/:__span-0-73) [ 1708 0 R /XYZ 60.307257 369.013062 0 ] (Code/DriverData/:__span-0-74) [ 1708 0 R /XYZ 60.307257 355.612710 0 ] (Code/DriverData/:__span-0-75) [ 1708 0 R /XYZ 60.307257 342.212358 0 ] (Code/DriverData/:__span-0-76) [ 1708 0 R /XYZ 60.307257 315.411654 0 ] (Code/DriverData/:__span-0-77) [ 1708 0 R /XYZ 60.307257 302.011302 0 ] (Code/DriverData/:__span-0-78) [ 1708 0 R /XYZ 60.307257 275.210598 0 ] (Code/DriverData/:__span-0-79) [ 1708 0 R /XYZ 60.307257 261.810246 0 ] (Code/DriverData/:__span-0-8) [ 1706 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverData/:__span-0-80) [ 1708 0 R /XYZ 60.307257 235.009542 0 ] (Code/DriverData/:__span-0-81) [ 1708 0 R /XYZ 60.307257 221.609190 0 ] (Code/DriverData/:__span-0-82) [ 1708 0 R /XYZ 60.307257 208.208838 0 ] (Code/DriverData/:__span-0-83) [ 1708 0 R /XYZ 60.307257 194.808486 0 ] (Code/DriverData/:__span-0-84) [ 1708 0 R /XYZ 60.307257 181.408134 0 ] (Code/DriverData/:__span-0-85) [ 1708 0 R /XYZ 60.307257 168.007782 0 ] (Code/DriverData/:__span-0-86) [ 1708 0 R /XYZ 60.307257 154.607430 0 ] (Code/DriverData/:__span-0-87) [ 1708 0 R /XYZ 60.307257 141.207078 0 ] (Code/DriverData/:__span-0-88) [ 1708 0 R /XYZ 60.307257 127.806726 0 ] (Code/DriverData/:__span-0-89) [ 1708 0 R /XYZ 60.307257 114.406374 0 ] (Code/DriverData/:__span-0-9) [ 1706 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverData/:__span-0-90) [ 1708 0 R /XYZ 60.307257 101.006022 0 ] (Code/DriverData/:__span-0-91) [ 1708 0 R /XYZ 60.307257 87.605670 0 ] (Code/DriverData/:__span-0-92) [ 1710 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverData/:__span-0-93) [ 1710 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverData/:__span-0-94) [ 1710 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverData/:__span-0-95) [ 1710 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverData/:__span-0-96) [ 1710 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverData/:__span-0-97) [ 1710 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverData/:__span-0-98) [ 1710 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverData/:__span-0-99) [ 1710 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverData/:driverdatacs) [ 1706 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverDrsWindow/:) [ 1820 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverDrsWindow/:__span-0-1) [ 1820 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverDrsWindow/:__span-0-10) [ 1820 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverDrsWindow/:__span-0-100) [ 1824 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverDrsWindow/:__span-0-101) [ 1824 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverDrsWindow/:__span-0-102) [ 1824 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverDrsWindow/:__span-0-103) [ 1824 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverDrsWindow/:__span-0-104) [ 1824 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverDrsWindow/:__span-0-105) [ 1824 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverDrsWindow/:__span-0-106) [ 1824 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverDrsWindow/:__span-0-107) [ 1824 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverDrsWindow/:__span-0-108) [ 1824 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverDrsWindow/:__span-0-109) [ 1824 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverDrsWindow/:__span-0-11) [ 1820 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverDrsWindow/:__span-0-110) [ 1824 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverDrsWindow/:__span-0-111) [ 1824 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverDrsWindow/:__span-0-112) [ 1824 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverDrsWindow/:__span-0-113) [ 1824 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverDrsWindow/:__span-0-114) [ 1824 0 R /XYZ 60.307257 503.016582 0 ] (Code/DriverDrsWindow/:__span-0-12) [ 1820 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverDrsWindow/:__span-0-13) [ 1820 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverDrsWindow/:__span-0-14) [ 1820 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverDrsWindow/:__span-0-15) [ 1820 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverDrsWindow/:__span-0-16) [ 1820 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverDrsWindow/:__span-0-17) [ 1820 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverDrsWindow/:__span-0-18) [ 1820 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverDrsWindow/:__span-0-19) [ 1820 0 R /XYZ 60.307257 466.429086 0 ] (Code/DriverDrsWindow/:__span-0-2) [ 1820 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverDrsWindow/:__span-0-20) [ 1820 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverDrsWindow/:__span-0-21) [ 1820 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverDrsWindow/:__span-0-22) [ 1820 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverDrsWindow/:__span-0-23) [ 1820 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverDrsWindow/:__span-0-24) [ 1820 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverDrsWindow/:__span-0-25) [ 1820 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverDrsWindow/:__span-0-26) [ 1820 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverDrsWindow/:__span-0-27) [ 1820 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverDrsWindow/:__span-0-28) [ 1820 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverDrsWindow/:__span-0-29) [ 1820 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverDrsWindow/:__span-0-3) [ 1820 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverDrsWindow/:__span-0-30) [ 1820 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverDrsWindow/:__span-0-31) [ 1820 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverDrsWindow/:__span-0-32) [ 1820 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverDrsWindow/:__span-0-33) [ 1820 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverDrsWindow/:__span-0-34) [ 1820 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverDrsWindow/:__span-0-35) [ 1820 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverDrsWindow/:__span-0-36) [ 1820 0 R /XYZ 60.307257 211.822398 0 ] (Code/DriverDrsWindow/:__span-0-37) [ 1820 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverDrsWindow/:__span-0-38) [ 1820 0 R /XYZ 60.307257 185.021694 0 ] (Code/DriverDrsWindow/:__span-0-39) [ 1820 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverDrsWindow/:__span-0-4) [ 1820 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverDrsWindow/:__span-0-40) [ 1820 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverDrsWindow/:__span-0-41) [ 1820 0 R /XYZ 60.307257 144.820638 0 ] (Code/DriverDrsWindow/:__span-0-42) [ 1820 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverDrsWindow/:__span-0-43) [ 1820 0 R /XYZ 60.307257 118.019934 0 ] (Code/DriverDrsWindow/:__span-0-44) [ 1820 0 R /XYZ 60.307257 104.619582 0 ] (Code/DriverDrsWindow/:__span-0-45) [ 1820 0 R /XYZ 60.307257 91.219230 0 ] (Code/DriverDrsWindow/:__span-0-46) [ 1822 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverDrsWindow/:__span-0-47) [ 1822 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverDrsWindow/:__span-0-48) [ 1822 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverDrsWindow/:__span-0-49) [ 1822 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverDrsWindow/:__span-0-5) [ 1820 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverDrsWindow/:__span-0-50) [ 1822 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverDrsWindow/:__span-0-51) [ 1822 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverDrsWindow/:__span-0-52) [ 1822 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverDrsWindow/:__span-0-53) [ 1822 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverDrsWindow/:__span-0-54) [ 1822 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverDrsWindow/:__span-0-55) [ 1822 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverDrsWindow/:__span-0-56) [ 1822 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverDrsWindow/:__span-0-57) [ 1822 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverDrsWindow/:__span-0-58) [ 1822 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverDrsWindow/:__span-0-59) [ 1822 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverDrsWindow/:__span-0-6) [ 1820 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverDrsWindow/:__span-0-60) [ 1822 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverDrsWindow/:__span-0-61) [ 1822 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverDrsWindow/:__span-0-62) [ 1822 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverDrsWindow/:__span-0-63) [ 1822 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverDrsWindow/:__span-0-64) [ 1822 0 R /XYZ 60.307257 503.016582 0 ] (Code/DriverDrsWindow/:__span-0-65) [ 1822 0 R /XYZ 60.307257 489.616230 0 ] (Code/DriverDrsWindow/:__span-0-66) [ 1822 0 R /XYZ 60.307257 476.215878 0 ] (Code/DriverDrsWindow/:__span-0-67) [ 1822 0 R /XYZ 60.307257 462.815526 0 ] (Code/DriverDrsWindow/:__span-0-68) [ 1822 0 R /XYZ 60.307257 449.415174 0 ] (Code/DriverDrsWindow/:__span-0-69) [ 1822 0 R /XYZ 60.307257 436.014822 0 ] (Code/DriverDrsWindow/:__span-0-7) [ 1820 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverDrsWindow/:__span-0-70) [ 1822 0 R /XYZ 60.307257 422.614470 0 ] (Code/DriverDrsWindow/:__span-0-71) [ 1822 0 R /XYZ 60.307257 409.214118 0 ] (Code/DriverDrsWindow/:__span-0-72) [ 1822 0 R /XYZ 60.307257 395.813766 0 ] (Code/DriverDrsWindow/:__span-0-73) [ 1822 0 R /XYZ 60.307257 382.413414 0 ] (Code/DriverDrsWindow/:__span-0-74) [ 1822 0 R /XYZ 60.307257 369.013062 0 ] (Code/DriverDrsWindow/:__span-0-75) [ 1822 0 R /XYZ 60.307257 355.612710 0 ] (Code/DriverDrsWindow/:__span-0-76) [ 1822 0 R /XYZ 60.307257 342.212358 0 ] (Code/DriverDrsWindow/:__span-0-77) [ 1822 0 R /XYZ 60.307257 328.812006 0 ] (Code/DriverDrsWindow/:__span-0-78) [ 1822 0 R /XYZ 60.307257 315.411654 0 ] (Code/DriverDrsWindow/:__span-0-79) [ 1822 0 R /XYZ 60.307257 302.011302 0 ] (Code/DriverDrsWindow/:__span-0-8) [ 1820 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverDrsWindow/:__span-0-80) [ 1822 0 R /XYZ 60.307257 288.610950 0 ] (Code/DriverDrsWindow/:__span-0-81) [ 1822 0 R /XYZ 60.307257 275.210598 0 ] (Code/DriverDrsWindow/:__span-0-82) [ 1822 0 R /XYZ 60.307257 261.810246 0 ] (Code/DriverDrsWindow/:__span-0-83) [ 1822 0 R /XYZ 60.307257 248.409894 0 ] (Code/DriverDrsWindow/:__span-0-84) [ 1822 0 R /XYZ 60.307257 235.009542 0 ] (Code/DriverDrsWindow/:__span-0-85) [ 1822 0 R /XYZ 60.307257 221.609190 0 ] (Code/DriverDrsWindow/:__span-0-86) [ 1822 0 R /XYZ 60.307257 208.208838 0 ] (Code/DriverDrsWindow/:__span-0-87) [ 1822 0 R /XYZ 60.307257 194.808486 0 ] (Code/DriverDrsWindow/:__span-0-88) [ 1822 0 R /XYZ 60.307257 181.408134 0 ] (Code/DriverDrsWindow/:__span-0-89) [ 1822 0 R /XYZ 60.307257 168.007782 0 ] (Code/DriverDrsWindow/:__span-0-9) [ 1820 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverDrsWindow/:__span-0-90) [ 1822 0 R /XYZ 60.307257 154.607430 0 ] (Code/DriverDrsWindow/:__span-0-91) [ 1822 0 R /XYZ 60.307257 141.207078 0 ] (Code/DriverDrsWindow/:__span-0-92) [ 1822 0 R /XYZ 60.307257 127.806726 0 ] (Code/DriverDrsWindow/:__span-0-93) [ 1822 0 R /XYZ 60.307257 114.406374 0 ] (Code/DriverDrsWindow/:__span-0-94) [ 1822 0 R /XYZ 60.307257 101.006022 0 ] (Code/DriverDrsWindow/:__span-0-95) [ 1822 0 R /XYZ 60.307257 87.605670 0 ] (Code/DriverDrsWindow/:__span-0-96) [ 1824 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverDrsWindow/:__span-0-97) [ 1824 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverDrsWindow/:__span-0-98) [ 1824 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverDrsWindow/:__span-0-99) [ 1824 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverDrsWindow/:driverdrswindowcs) [ 1820 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverGapToLeaderWindow/:) [ 1712 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverGapToLeaderWindow/:__span-0-1) [ 1712 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverGapToLeaderWindow/:__span-0-10) [ 1712 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverGapToLeaderWindow/:__span-0-11) [ 1712 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverGapToLeaderWindow/:__span-0-12) [ 1712 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverGapToLeaderWindow/:__span-0-13) [ 1712 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverGapToLeaderWindow/:__span-0-14) [ 1712 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverGapToLeaderWindow/:__span-0-15) [ 1712 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverGapToLeaderWindow/:__span-0-16) [ 1712 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverGapToLeaderWindow/:__span-0-17) [ 1712 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverGapToLeaderWindow/:__span-0-18) [ 1712 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverGapToLeaderWindow/:__span-0-19) [ 1712 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverGapToLeaderWindow/:__span-0-2) [ 1712 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverGapToLeaderWindow/:__span-0-20) [ 1712 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverGapToLeaderWindow/:__span-0-21) [ 1712 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverGapToLeaderWindow/:__span-0-22) [ 1712 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverGapToLeaderWindow/:__span-0-23) [ 1712 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverGapToLeaderWindow/:__span-0-24) [ 1712 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverGapToLeaderWindow/:__span-0-25) [ 1712 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverGapToLeaderWindow/:__span-0-26) [ 1712 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverGapToLeaderWindow/:__span-0-27) [ 1712 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverGapToLeaderWindow/:__span-0-28) [ 1712 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverGapToLeaderWindow/:__span-0-29) [ 1712 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverGapToLeaderWindow/:__span-0-3) [ 1712 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverGapToLeaderWindow/:__span-0-30) [ 1712 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverGapToLeaderWindow/:__span-0-31) [ 1712 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverGapToLeaderWindow/:__span-0-32) [ 1712 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverGapToLeaderWindow/:__span-0-4) [ 1712 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverGapToLeaderWindow/:__span-0-5) [ 1712 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverGapToLeaderWindow/:__span-0-6) [ 1712 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverGapToLeaderWindow/:__span-0-7) [ 1712 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverGapToLeaderWindow/:__span-0-8) [ 1712 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverGapToLeaderWindow/:__span-0-9) [ 1712 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverGapToLeaderWindow/:drivergaptoleaderwindowcs) [ 1712 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverLapTimeWindow/:) [ 1826 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverLapTimeWindow/:__span-0-1) [ 1826 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverLapTimeWindow/:__span-0-10) [ 1826 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverLapTimeWindow/:__span-0-11) [ 1826 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverLapTimeWindow/:__span-0-12) [ 1826 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverLapTimeWindow/:__span-0-13) [ 1826 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverLapTimeWindow/:__span-0-14) [ 1826 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverLapTimeWindow/:__span-0-15) [ 1826 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverLapTimeWindow/:__span-0-16) [ 1826 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverLapTimeWindow/:__span-0-17) [ 1826 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverLapTimeWindow/:__span-0-18) [ 1826 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverLapTimeWindow/:__span-0-19) [ 1826 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverLapTimeWindow/:__span-0-2) [ 1826 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverLapTimeWindow/:__span-0-20) [ 1826 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverLapTimeWindow/:__span-0-21) [ 1826 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverLapTimeWindow/:__span-0-22) [ 1826 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverLapTimeWindow/:__span-0-23) [ 1826 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverLapTimeWindow/:__span-0-24) [ 1826 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverLapTimeWindow/:__span-0-25) [ 1826 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverLapTimeWindow/:__span-0-26) [ 1826 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverLapTimeWindow/:__span-0-27) [ 1826 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverLapTimeWindow/:__span-0-28) [ 1826 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverLapTimeWindow/:__span-0-29) [ 1826 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverLapTimeWindow/:__span-0-3) [ 1826 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverLapTimeWindow/:__span-0-30) [ 1826 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverLapTimeWindow/:__span-0-31) [ 1826 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverLapTimeWindow/:__span-0-32) [ 1826 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverLapTimeWindow/:__span-0-4) [ 1826 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverLapTimeWindow/:__span-0-5) [ 1826 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverLapTimeWindow/:__span-0-6) [ 1826 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverLapTimeWindow/:__span-0-7) [ 1826 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverLapTimeWindow/:__span-0-8) [ 1826 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverLapTimeWindow/:__span-0-9) [ 1826 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverLapTimeWindow/:driverlaptimewindowcs) [ 1826 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverNameWindow/:) [ 1714 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverNameWindow/:__span-0-1) [ 1714 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverNameWindow/:__span-0-10) [ 1714 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverNameWindow/:__span-0-11) [ 1714 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverNameWindow/:__span-0-12) [ 1714 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverNameWindow/:__span-0-13) [ 1714 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverNameWindow/:__span-0-14) [ 1714 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverNameWindow/:__span-0-15) [ 1714 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverNameWindow/:__span-0-16) [ 1714 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverNameWindow/:__span-0-17) [ 1714 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverNameWindow/:__span-0-18) [ 1714 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverNameWindow/:__span-0-19) [ 1714 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverNameWindow/:__span-0-2) [ 1714 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverNameWindow/:__span-0-20) [ 1714 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverNameWindow/:__span-0-21) [ 1714 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverNameWindow/:__span-0-22) [ 1714 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverNameWindow/:__span-0-23) [ 1714 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverNameWindow/:__span-0-24) [ 1714 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverNameWindow/:__span-0-25) [ 1714 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverNameWindow/:__span-0-26) [ 1714 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverNameWindow/:__span-0-27) [ 1714 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverNameWindow/:__span-0-28) [ 1714 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverNameWindow/:__span-0-29) [ 1714 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverNameWindow/:__span-0-3) [ 1714 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverNameWindow/:__span-0-30) [ 1714 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverNameWindow/:__span-0-31) [ 1714 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverNameWindow/:__span-0-32) [ 1714 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverNameWindow/:__span-0-33) [ 1714 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverNameWindow/:__span-0-34) [ 1714 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverNameWindow/:__span-0-35) [ 1714 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverNameWindow/:__span-0-36) [ 1714 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverNameWindow/:__span-0-37) [ 1714 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverNameWindow/:__span-0-38) [ 1714 0 R /XYZ 60.307257 144.820638 0 ] (Code/DriverNameWindow/:__span-0-39) [ 1714 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverNameWindow/:__span-0-4) [ 1714 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverNameWindow/:__span-0-40) [ 1714 0 R /XYZ 60.307257 118.019934 0 ] (Code/DriverNameWindow/:__span-0-41) [ 1714 0 R /XYZ 60.307257 104.619582 0 ] (Code/DriverNameWindow/:__span-0-42) [ 1714 0 R /XYZ 60.307257 91.219230 0 ] (Code/DriverNameWindow/:__span-0-43) [ 1716 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverNameWindow/:__span-0-44) [ 1716 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverNameWindow/:__span-0-45) [ 1716 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverNameWindow/:__span-0-46) [ 1716 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverNameWindow/:__span-0-47) [ 1716 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverNameWindow/:__span-0-48) [ 1716 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverNameWindow/:__span-0-49) [ 1716 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverNameWindow/:__span-0-5) [ 1714 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverNameWindow/:__span-0-50) [ 1716 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverNameWindow/:__span-0-51) [ 1716 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverNameWindow/:__span-0-52) [ 1716 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverNameWindow/:__span-0-53) [ 1716 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverNameWindow/:__span-0-54) [ 1716 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverNameWindow/:__span-0-55) [ 1716 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverNameWindow/:__span-0-56) [ 1716 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverNameWindow/:__span-0-57) [ 1716 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverNameWindow/:__span-0-6) [ 1714 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverNameWindow/:__span-0-7) [ 1714 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverNameWindow/:__span-0-8) [ 1714 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverNameWindow/:__span-0-9) [ 1714 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverNameWindow/:drivernamewindowcs) [ 1714 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverPositionWindow/:) [ 1828 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverPositionWindow/:__span-0-1) [ 1828 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverPositionWindow/:__span-0-10) [ 1828 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverPositionWindow/:__span-0-11) [ 1828 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverPositionWindow/:__span-0-12) [ 1828 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverPositionWindow/:__span-0-13) [ 1828 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverPositionWindow/:__span-0-14) [ 1828 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverPositionWindow/:__span-0-15) [ 1828 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverPositionWindow/:__span-0-16) [ 1828 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverPositionWindow/:__span-0-17) [ 1828 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverPositionWindow/:__span-0-18) [ 1828 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverPositionWindow/:__span-0-19) [ 1828 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverPositionWindow/:__span-0-2) [ 1828 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverPositionWindow/:__span-0-20) [ 1828 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverPositionWindow/:__span-0-21) [ 1828 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverPositionWindow/:__span-0-22) [ 1828 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverPositionWindow/:__span-0-23) [ 1828 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverPositionWindow/:__span-0-24) [ 1828 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverPositionWindow/:__span-0-25) [ 1828 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverPositionWindow/:__span-0-26) [ 1828 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverPositionWindow/:__span-0-27) [ 1828 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverPositionWindow/:__span-0-28) [ 1828 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverPositionWindow/:__span-0-29) [ 1828 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverPositionWindow/:__span-0-3) [ 1828 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverPositionWindow/:__span-0-30) [ 1828 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverPositionWindow/:__span-0-31) [ 1828 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverPositionWindow/:__span-0-32) [ 1828 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverPositionWindow/:__span-0-33) [ 1828 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverPositionWindow/:__span-0-34) [ 1828 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverPositionWindow/:__span-0-35) [ 1828 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverPositionWindow/:__span-0-36) [ 1828 0 R /XYZ 60.307257 211.822398 0 ] (Code/DriverPositionWindow/:__span-0-37) [ 1828 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverPositionWindow/:__span-0-38) [ 1828 0 R /XYZ 60.307257 185.021694 0 ] (Code/DriverPositionWindow/:__span-0-39) [ 1828 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverPositionWindow/:__span-0-4) [ 1828 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverPositionWindow/:__span-0-40) [ 1828 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverPositionWindow/:__span-0-41) [ 1828 0 R /XYZ 60.307257 144.820638 0 ] (Code/DriverPositionWindow/:__span-0-42) [ 1828 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverPositionWindow/:__span-0-5) [ 1828 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverPositionWindow/:__span-0-6) [ 1828 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverPositionWindow/:__span-0-7) [ 1828 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverPositionWindow/:__span-0-8) [ 1828 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverPositionWindow/:__span-0-9) [ 1828 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverPositionWindow/:driverpositionwindowcs) [ 1828 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverSectorWindow/:) [ 1718 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverSectorWindow/:__span-0-1) [ 1718 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverSectorWindow/:__span-0-10) [ 1718 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverSectorWindow/:__span-0-11) [ 1718 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverSectorWindow/:__span-0-12) [ 1718 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverSectorWindow/:__span-0-13) [ 1718 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverSectorWindow/:__span-0-14) [ 1718 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverSectorWindow/:__span-0-15) [ 1718 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverSectorWindow/:__span-0-16) [ 1718 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverSectorWindow/:__span-0-17) [ 1718 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverSectorWindow/:__span-0-18) [ 1718 0 R /XYZ 60.307257 466.429086 0 ] (Code/DriverSectorWindow/:__span-0-19) [ 1718 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverSectorWindow/:__span-0-2) [ 1718 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverSectorWindow/:__span-0-20) [ 1718 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverSectorWindow/:__span-0-21) [ 1718 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverSectorWindow/:__span-0-22) [ 1718 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverSectorWindow/:__span-0-23) [ 1718 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverSectorWindow/:__span-0-24) [ 1718 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverSectorWindow/:__span-0-25) [ 1718 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverSectorWindow/:__span-0-26) [ 1718 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverSectorWindow/:__span-0-27) [ 1718 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverSectorWindow/:__span-0-28) [ 1718 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverSectorWindow/:__span-0-29) [ 1718 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverSectorWindow/:__span-0-3) [ 1718 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverSectorWindow/:__span-0-30) [ 1718 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverSectorWindow/:__span-0-31) [ 1718 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverSectorWindow/:__span-0-32) [ 1718 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverSectorWindow/:__span-0-4) [ 1718 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverSectorWindow/:__span-0-5) [ 1718 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverSectorWindow/:__span-0-6) [ 1718 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverSectorWindow/:__span-0-7) [ 1718 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverSectorWindow/:__span-0-8) [ 1718 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverSectorWindow/:__span-0-9) [ 1718 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverSectorWindow/:driversectorwindowcs) [ 1718 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverTyresWindow/:) [ 1830 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverTyresWindow/:__span-0-1) [ 1830 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverTyresWindow/:__span-0-10) [ 1830 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverTyresWindow/:__span-0-100) [ 1834 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverTyresWindow/:__span-0-101) [ 1834 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverTyresWindow/:__span-0-102) [ 1834 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverTyresWindow/:__span-0-103) [ 1834 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverTyresWindow/:__span-0-104) [ 1834 0 R /XYZ 60.307257 503.016582 0 ] (Code/DriverTyresWindow/:__span-0-105) [ 1834 0 R /XYZ 60.307257 489.616230 0 ] (Code/DriverTyresWindow/:__span-0-106) [ 1834 0 R /XYZ 60.307257 476.215878 0 ] (Code/DriverTyresWindow/:__span-0-107) [ 1834 0 R /XYZ 60.307257 462.815526 0 ] (Code/DriverTyresWindow/:__span-0-108) [ 1834 0 R /XYZ 60.307257 449.415174 0 ] (Code/DriverTyresWindow/:__span-0-109) [ 1834 0 R /XYZ 60.307257 422.614470 0 ] (Code/DriverTyresWindow/:__span-0-11) [ 1830 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverTyresWindow/:__span-0-110) [ 1834 0 R /XYZ 60.307257 395.813766 0 ] (Code/DriverTyresWindow/:__span-0-111) [ 1834 0 R /XYZ 60.307257 382.413414 0 ] (Code/DriverTyresWindow/:__span-0-112) [ 1834 0 R /XYZ 60.307257 369.013062 0 ] (Code/DriverTyresWindow/:__span-0-113) [ 1834 0 R /XYZ 60.307257 355.612710 0 ] (Code/DriverTyresWindow/:__span-0-114) [ 1834 0 R /XYZ 60.307257 342.212358 0 ] (Code/DriverTyresWindow/:__span-0-115) [ 1834 0 R /XYZ 60.307257 328.812006 0 ] (Code/DriverTyresWindow/:__span-0-116) [ 1834 0 R /XYZ 60.307257 315.411654 0 ] (Code/DriverTyresWindow/:__span-0-117) [ 1834 0 R /XYZ 60.307257 302.011302 0 ] (Code/DriverTyresWindow/:__span-0-118) [ 1834 0 R /XYZ 60.307257 288.610950 0 ] (Code/DriverTyresWindow/:__span-0-119) [ 1834 0 R /XYZ 60.307257 275.210598 0 ] (Code/DriverTyresWindow/:__span-0-12) [ 1830 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverTyresWindow/:__span-0-120) [ 1834 0 R /XYZ 60.307257 261.810246 0 ] (Code/DriverTyresWindow/:__span-0-121) [ 1834 0 R /XYZ 60.307257 248.409894 0 ] (Code/DriverTyresWindow/:__span-0-122) [ 1834 0 R /XYZ 60.307257 221.609190 0 ] (Code/DriverTyresWindow/:__span-0-123) [ 1834 0 R /XYZ 60.307257 208.208838 0 ] (Code/DriverTyresWindow/:__span-0-124) [ 1834 0 R /XYZ 60.307257 194.808486 0 ] (Code/DriverTyresWindow/:__span-0-125) [ 1834 0 R /XYZ 60.307257 181.408134 0 ] (Code/DriverTyresWindow/:__span-0-126) [ 1834 0 R /XYZ 60.307257 168.007782 0 ] (Code/DriverTyresWindow/:__span-0-127) [ 1834 0 R /XYZ 60.307257 154.607430 0 ] (Code/DriverTyresWindow/:__span-0-128) [ 1834 0 R /XYZ 60.307257 141.207078 0 ] (Code/DriverTyresWindow/:__span-0-129) [ 1834 0 R /XYZ 60.307257 127.806726 0 ] (Code/DriverTyresWindow/:__span-0-13) [ 1830 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverTyresWindow/:__span-0-130) [ 1834 0 R /XYZ 60.307257 114.406374 0 ] (Code/DriverTyresWindow/:__span-0-131) [ 1834 0 R /XYZ 60.307257 101.006022 0 ] (Code/DriverTyresWindow/:__span-0-132) [ 1834 0 R /XYZ 60.307257 87.605670 0 ] (Code/DriverTyresWindow/:__span-0-133) [ 1836 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverTyresWindow/:__span-0-134) [ 1836 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverTyresWindow/:__span-0-135) [ 1836 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverTyresWindow/:__span-0-136) [ 1836 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverTyresWindow/:__span-0-137) [ 1836 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverTyresWindow/:__span-0-138) [ 1836 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverTyresWindow/:__span-0-139) [ 1836 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverTyresWindow/:__span-0-14) [ 1830 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverTyresWindow/:__span-0-140) [ 1836 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverTyresWindow/:__span-0-141) [ 1836 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverTyresWindow/:__span-0-142) [ 1836 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverTyresWindow/:__span-0-143) [ 1836 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverTyresWindow/:__span-0-144) [ 1836 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverTyresWindow/:__span-0-145) [ 1836 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverTyresWindow/:__span-0-146) [ 1836 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverTyresWindow/:__span-0-15) [ 1830 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverTyresWindow/:__span-0-16) [ 1830 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverTyresWindow/:__span-0-17) [ 1830 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverTyresWindow/:__span-0-18) [ 1830 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverTyresWindow/:__span-0-19) [ 1830 0 R /XYZ 60.307257 466.429086 0 ] (Code/DriverTyresWindow/:__span-0-2) [ 1830 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverTyresWindow/:__span-0-20) [ 1830 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverTyresWindow/:__span-0-21) [ 1830 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverTyresWindow/:__span-0-22) [ 1830 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverTyresWindow/:__span-0-23) [ 1830 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverTyresWindow/:__span-0-24) [ 1830 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverTyresWindow/:__span-0-25) [ 1830 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverTyresWindow/:__span-0-26) [ 1830 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverTyresWindow/:__span-0-27) [ 1830 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverTyresWindow/:__span-0-28) [ 1830 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverTyresWindow/:__span-0-29) [ 1830 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverTyresWindow/:__span-0-3) [ 1830 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverTyresWindow/:__span-0-30) [ 1830 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverTyresWindow/:__span-0-31) [ 1830 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverTyresWindow/:__span-0-32) [ 1830 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverTyresWindow/:__span-0-33) [ 1830 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverTyresWindow/:__span-0-34) [ 1830 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverTyresWindow/:__span-0-35) [ 1830 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverTyresWindow/:__span-0-36) [ 1830 0 R /XYZ 60.307257 211.822398 0 ] (Code/DriverTyresWindow/:__span-0-37) [ 1830 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverTyresWindow/:__span-0-38) [ 1830 0 R /XYZ 60.307257 185.021694 0 ] (Code/DriverTyresWindow/:__span-0-39) [ 1830 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverTyresWindow/:__span-0-4) [ 1830 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverTyresWindow/:__span-0-40) [ 1830 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverTyresWindow/:__span-0-41) [ 1830 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverTyresWindow/:__span-0-42) [ 1830 0 R /XYZ 60.307257 118.019934 0 ] (Code/DriverTyresWindow/:__span-0-43) [ 1830 0 R /XYZ 60.307257 104.619582 0 ] (Code/DriverTyresWindow/:__span-0-44) [ 1830 0 R /XYZ 60.307257 91.219230 0 ] (Code/DriverTyresWindow/:__span-0-45) [ 1832 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverTyresWindow/:__span-0-46) [ 1832 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverTyresWindow/:__span-0-47) [ 1832 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverTyresWindow/:__span-0-48) [ 1832 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverTyresWindow/:__span-0-49) [ 1832 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverTyresWindow/:__span-0-5) [ 1830 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverTyresWindow/:__span-0-50) [ 1832 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverTyresWindow/:__span-0-51) [ 1832 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverTyresWindow/:__span-0-52) [ 1832 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverTyresWindow/:__span-0-53) [ 1832 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverTyresWindow/:__span-0-54) [ 1832 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverTyresWindow/:__span-0-55) [ 1832 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverTyresWindow/:__span-0-56) [ 1832 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverTyresWindow/:__span-0-57) [ 1832 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverTyresWindow/:__span-0-58) [ 1832 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverTyresWindow/:__span-0-59) [ 1832 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverTyresWindow/:__span-0-6) [ 1830 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverTyresWindow/:__span-0-60) [ 1832 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverTyresWindow/:__span-0-61) [ 1832 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverTyresWindow/:__span-0-62) [ 1832 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverTyresWindow/:__span-0-63) [ 1832 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverTyresWindow/:__span-0-64) [ 1832 0 R /XYZ 60.307257 503.016582 0 ] (Code/DriverTyresWindow/:__span-0-65) [ 1832 0 R /XYZ 60.307257 462.815526 0 ] (Code/DriverTyresWindow/:__span-0-66) [ 1832 0 R /XYZ 60.307257 449.415174 0 ] (Code/DriverTyresWindow/:__span-0-67) [ 1832 0 R /XYZ 60.307257 436.014822 0 ] (Code/DriverTyresWindow/:__span-0-68) [ 1832 0 R /XYZ 60.307257 422.614470 0 ] (Code/DriverTyresWindow/:__span-0-69) [ 1832 0 R /XYZ 60.307257 409.214118 0 ] (Code/DriverTyresWindow/:__span-0-7) [ 1830 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverTyresWindow/:__span-0-70) [ 1832 0 R /XYZ 60.307257 395.813766 0 ] (Code/DriverTyresWindow/:__span-0-71) [ 1832 0 R /XYZ 60.307257 382.413414 0 ] (Code/DriverTyresWindow/:__span-0-72) [ 1832 0 R /XYZ 60.307257 369.013062 0 ] (Code/DriverTyresWindow/:__span-0-73) [ 1832 0 R /XYZ 60.307257 355.612710 0 ] (Code/DriverTyresWindow/:__span-0-74) [ 1832 0 R /XYZ 60.307257 328.812006 0 ] (Code/DriverTyresWindow/:__span-0-75) [ 1832 0 R /XYZ 60.307257 315.411654 0 ] (Code/DriverTyresWindow/:__span-0-76) [ 1832 0 R /XYZ 60.307257 302.011302 0 ] (Code/DriverTyresWindow/:__span-0-77) [ 1832 0 R /XYZ 60.307257 288.610950 0 ] (Code/DriverTyresWindow/:__span-0-78) [ 1832 0 R /XYZ 60.307257 275.210598 0 ] (Code/DriverTyresWindow/:__span-0-79) [ 1832 0 R /XYZ 60.307257 261.810246 0 ] (Code/DriverTyresWindow/:__span-0-8) [ 1830 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverTyresWindow/:__span-0-80) [ 1832 0 R /XYZ 60.307257 248.409894 0 ] (Code/DriverTyresWindow/:__span-0-81) [ 1832 0 R /XYZ 60.307257 235.009542 0 ] (Code/DriverTyresWindow/:__span-0-82) [ 1832 0 R /XYZ 60.307257 208.208838 0 ] (Code/DriverTyresWindow/:__span-0-83) [ 1832 0 R /XYZ 60.307257 168.007782 0 ] (Code/DriverTyresWindow/:__span-0-84) [ 1832 0 R /XYZ 60.307257 154.607430 0 ] (Code/DriverTyresWindow/:__span-0-85) [ 1832 0 R /XYZ 60.307257 127.806726 0 ] (Code/DriverTyresWindow/:__span-0-86) [ 1832 0 R /XYZ 60.307257 114.406374 0 ] (Code/DriverTyresWindow/:__span-0-87) [ 1832 0 R /XYZ 60.307257 101.006022 0 ] (Code/DriverTyresWindow/:__span-0-88) [ 1832 0 R /XYZ 60.307257 87.605670 0 ] (Code/DriverTyresWindow/:__span-0-89) [ 1834 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverTyresWindow/:__span-0-9) [ 1830 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverTyresWindow/:__span-0-90) [ 1834 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverTyresWindow/:__span-0-91) [ 1834 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverTyresWindow/:__span-0-92) [ 1834 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverTyresWindow/:__span-0-93) [ 1834 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverTyresWindow/:__span-0-94) [ 1834 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverTyresWindow/:__span-0-95) [ 1834 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverTyresWindow/:__span-0-96) [ 1834 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverTyresWindow/:__span-0-97) [ 1834 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverTyresWindow/:__span-0-98) [ 1834 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverTyresWindow/:__span-0-99) [ 1834 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverTyresWindow/:drivertyreswindowcs) [ 1830 0 R /XYZ 39.386457 747.563622 0 ] (Code/F1TVEmulator/:) [ 1720 0 R /XYZ 39.386457 747.563622 0 ] (Code/F1TVEmulator/:__span-0-1) [ 1720 0 R /XYZ 60.307257 707.635422 0 ] (Code/F1TVEmulator/:__span-0-10) [ 1720 0 R /XYZ 60.307257 573.631902 0 ] (Code/F1TVEmulator/:__span-0-100) [ 1724 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-101) [ 1724 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-102) [ 1724 0 R /XYZ 60.307257 637.020102 0 ] (Code/F1TVEmulator/:__span-0-103) [ 1724 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-104) [ 1724 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-105) [ 1724 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-106) [ 1724 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-107) [ 1724 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-108) [ 1724 0 R /XYZ 60.307257 556.617990 0 ] (Code/F1TVEmulator/:__span-0-109) [ 1724 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-11) [ 1720 0 R /XYZ 60.307257 560.231550 0 ] (Code/F1TVEmulator/:__span-0-110) [ 1724 0 R /XYZ 60.307257 529.817286 0 ] (Code/F1TVEmulator/:__span-0-111) [ 1724 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-112) [ 1724 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-113) [ 1724 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-114) [ 1724 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-115) [ 1724 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-116) [ 1724 0 R /XYZ 60.307257 436.014822 0 ] (Code/F1TVEmulator/:__span-0-117) [ 1724 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-118) [ 1724 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-119) [ 1724 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-12) [ 1720 0 R /XYZ 60.307257 546.831198 0 ] (Code/F1TVEmulator/:__span-0-120) [ 1724 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-121) [ 1724 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-122) [ 1724 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-123) [ 1724 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-124) [ 1724 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-125) [ 1724 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-126) [ 1724 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-127) [ 1724 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-128) [ 1724 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-129) [ 1724 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-13) [ 1720 0 R /XYZ 60.307257 533.430846 0 ] (Code/F1TVEmulator/:__span-0-130) [ 1724 0 R /XYZ 60.307257 221.609190 0 ] (Code/F1TVEmulator/:__span-0-131) [ 1724 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-132) [ 1724 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-133) [ 1724 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-134) [ 1724 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-135) [ 1724 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-136) [ 1724 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-137) [ 1724 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-138) [ 1724 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-139) [ 1724 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-14) [ 1720 0 R /XYZ 60.307257 520.030494 0 ] (Code/F1TVEmulator/:__span-0-140) [ 1724 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-141) [ 1726 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-142) [ 1726 0 R /XYZ 60.307257 757.623270 0 ] (Code/F1TVEmulator/:__span-0-143) [ 1726 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-144) [ 1726 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-145) [ 1726 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-146) [ 1726 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-147) [ 1726 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-148) [ 1726 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-149) [ 1726 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-15) [ 1720 0 R /XYZ 60.307257 506.630142 0 ] (Code/F1TVEmulator/:__span-0-150) [ 1726 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-151) [ 1726 0 R /XYZ 60.307257 637.020102 0 ] (Code/F1TVEmulator/:__span-0-152) [ 1726 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-153) [ 1726 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-154) [ 1726 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-155) [ 1726 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-156) [ 1726 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-157) [ 1726 0 R /XYZ 60.307257 529.817286 0 ] (Code/F1TVEmulator/:__span-0-158) [ 1726 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-159) [ 1726 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-16) [ 1720 0 R /XYZ 60.307257 493.229790 0 ] (Code/F1TVEmulator/:__span-0-160) [ 1726 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-161) [ 1726 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-162) [ 1726 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-163) [ 1726 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-164) [ 1726 0 R /XYZ 60.307257 436.014822 0 ] (Code/F1TVEmulator/:__span-0-165) [ 1726 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-166) [ 1726 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-167) [ 1726 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-168) [ 1726 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-169) [ 1726 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-17) [ 1720 0 R /XYZ 60.307257 479.829438 0 ] (Code/F1TVEmulator/:__span-0-170) [ 1726 0 R /XYZ 60.307257 355.612710 0 ] (Code/F1TVEmulator/:__span-0-171) [ 1726 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-172) [ 1726 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-173) [ 1726 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-174) [ 1726 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-175) [ 1726 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-176) [ 1726 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-177) [ 1726 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-178) [ 1726 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-179) [ 1726 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-18) [ 1720 0 R /XYZ 60.307257 466.429086 0 ] (Code/F1TVEmulator/:__span-0-180) [ 1726 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-181) [ 1726 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-182) [ 1726 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-183) [ 1726 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-184) [ 1726 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-185) [ 1726 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-186) [ 1726 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-187) [ 1726 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-188) [ 1726 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-189) [ 1726 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-19) [ 1720 0 R /XYZ 60.307257 453.028734 0 ] (Code/F1TVEmulator/:__span-0-190) [ 1728 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-191) [ 1728 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-192) [ 1728 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-193) [ 1728 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-194) [ 1728 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-195) [ 1728 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-196) [ 1728 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-197) [ 1728 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-198) [ 1728 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-199) [ 1728 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-2) [ 1720 0 R /XYZ 60.307257 694.235070 0 ] (Code/F1TVEmulator/:__span-0-20) [ 1720 0 R /XYZ 60.307257 439.628382 0 ] (Code/F1TVEmulator/:__span-0-200) [ 1728 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-201) [ 1728 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-202) [ 1728 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-203) [ 1728 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-204) [ 1728 0 R /XYZ 60.307257 529.817286 0 ] (Code/F1TVEmulator/:__span-0-205) [ 1728 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-206) [ 1728 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-207) [ 1728 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-208) [ 1728 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-209) [ 1728 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-21) [ 1720 0 R /XYZ 60.307257 426.228030 0 ] (Code/F1TVEmulator/:__span-0-210) [ 1728 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-211) [ 1728 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-212) [ 1728 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-213) [ 1728 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-214) [ 1728 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-215) [ 1728 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-216) [ 1728 0 R /XYZ 60.307257 355.612710 0 ] (Code/F1TVEmulator/:__span-0-217) [ 1728 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-218) [ 1728 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-219) [ 1728 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-22) [ 1720 0 R /XYZ 60.307257 412.827678 0 ] (Code/F1TVEmulator/:__span-0-220) [ 1728 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-221) [ 1728 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-222) [ 1728 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-223) [ 1728 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-224) [ 1728 0 R /XYZ 60.307257 221.609190 0 ] (Code/F1TVEmulator/:__span-0-225) [ 1728 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-226) [ 1728 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-227) [ 1728 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-228) [ 1728 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-229) [ 1728 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-23) [ 1720 0 R /XYZ 60.307257 399.427326 0 ] (Code/F1TVEmulator/:__span-0-230) [ 1728 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-231) [ 1728 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-232) [ 1728 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-233) [ 1730 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-234) [ 1730 0 R /XYZ 60.307257 757.623270 0 ] (Code/F1TVEmulator/:__span-0-235) [ 1730 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-236) [ 1730 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-237) [ 1730 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-238) [ 1730 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-239) [ 1730 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-24) [ 1720 0 R /XYZ 60.307257 386.026974 0 ] (Code/F1TVEmulator/:__span-0-240) [ 1730 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-241) [ 1730 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-242) [ 1730 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-243) [ 1730 0 R /XYZ 60.307257 637.020102 0 ] (Code/F1TVEmulator/:__span-0-244) [ 1730 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-245) [ 1730 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-246) [ 1730 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-247) [ 1730 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-248) [ 1730 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-249) [ 1730 0 R /XYZ 60.307257 556.617990 0 ] (Code/F1TVEmulator/:__span-0-25) [ 1720 0 R /XYZ 60.307257 372.626622 0 ] (Code/F1TVEmulator/:__span-0-250) [ 1730 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-251) [ 1730 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-252) [ 1730 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-253) [ 1730 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-254) [ 1730 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-255) [ 1730 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-256) [ 1730 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-257) [ 1730 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-258) [ 1730 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-259) [ 1730 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-26) [ 1720 0 R /XYZ 60.307257 359.226270 0 ] (Code/F1TVEmulator/:__span-0-260) [ 1730 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-261) [ 1730 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-262) [ 1730 0 R /XYZ 60.307257 355.612710 0 ] (Code/F1TVEmulator/:__span-0-263) [ 1730 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-264) [ 1730 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-265) [ 1730 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-266) [ 1730 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-267) [ 1730 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-268) [ 1730 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-269) [ 1730 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-27) [ 1720 0 R /XYZ 60.307257 332.425566 0 ] (Code/F1TVEmulator/:__span-0-270) [ 1730 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-271) [ 1730 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-272) [ 1730 0 R /XYZ 60.307257 221.609190 0 ] (Code/F1TVEmulator/:__span-0-273) [ 1730 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-274) [ 1730 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-275) [ 1730 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-276) [ 1730 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-277) [ 1730 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-278) [ 1730 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-279) [ 1730 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-28) [ 1720 0 R /XYZ 60.307257 305.624862 0 ] (Code/F1TVEmulator/:__span-0-280) [ 1730 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-281) [ 1730 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-282) [ 1730 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-283) [ 1732 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-284) [ 1732 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-285) [ 1732 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-286) [ 1732 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-287) [ 1732 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-288) [ 1732 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-289) [ 1732 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-29) [ 1720 0 R /XYZ 60.307257 278.824158 0 ] (Code/F1TVEmulator/:__span-0-290) [ 1732 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-291) [ 1732 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-292) [ 1732 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-293) [ 1732 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-294) [ 1732 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-295) [ 1732 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-296) [ 1732 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-297) [ 1732 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-298) [ 1732 0 R /XYZ 60.307257 529.817286 0 ] (Code/F1TVEmulator/:__span-0-299) [ 1732 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-3) [ 1720 0 R /XYZ 60.307257 680.834718 0 ] (Code/F1TVEmulator/:__span-0-30) [ 1720 0 R /XYZ 60.307257 265.423806 0 ] (Code/F1TVEmulator/:__span-0-300) [ 1732 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-301) [ 1732 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-302) [ 1732 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-303) [ 1732 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-304) [ 1732 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-305) [ 1732 0 R /XYZ 60.307257 436.014822 0 ] (Code/F1TVEmulator/:__span-0-306) [ 1732 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-307) [ 1732 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-308) [ 1732 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-309) [ 1732 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-31) [ 1720 0 R /XYZ 60.307257 252.023454 0 ] (Code/F1TVEmulator/:__span-0-310) [ 1732 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-311) [ 1732 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-312) [ 1732 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-313) [ 1732 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-314) [ 1732 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-315) [ 1732 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-316) [ 1732 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-317) [ 1732 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-318) [ 1732 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-319) [ 1732 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-32) [ 1720 0 R /XYZ 60.307257 238.623102 0 ] (Code/F1TVEmulator/:__span-0-320) [ 1732 0 R /XYZ 60.307257 221.609190 0 ] (Code/F1TVEmulator/:__span-0-321) [ 1732 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-322) [ 1732 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-323) [ 1732 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-324) [ 1732 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-325) [ 1732 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-326) [ 1732 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-327) [ 1732 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-328) [ 1732 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-329) [ 1732 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-33) [ 1720 0 R /XYZ 60.307257 225.222750 0 ] (Code/F1TVEmulator/:__span-0-34) [ 1720 0 R /XYZ 60.307257 211.822398 0 ] (Code/F1TVEmulator/:__span-0-35) [ 1720 0 R /XYZ 60.307257 198.422046 0 ] (Code/F1TVEmulator/:__span-0-36) [ 1720 0 R /XYZ 60.307257 171.621342 0 ] (Code/F1TVEmulator/:__span-0-37) [ 1720 0 R /XYZ 60.307257 158.220990 0 ] (Code/F1TVEmulator/:__span-0-38) [ 1720 0 R /XYZ 60.307257 144.820638 0 ] (Code/F1TVEmulator/:__span-0-39) [ 1720 0 R /XYZ 60.307257 131.420286 0 ] (Code/F1TVEmulator/:__span-0-4) [ 1720 0 R /XYZ 60.307257 667.434366 0 ] (Code/F1TVEmulator/:__span-0-40) [ 1720 0 R /XYZ 60.307257 118.019934 0 ] (Code/F1TVEmulator/:__span-0-41) [ 1720 0 R /XYZ 60.307257 104.619582 0 ] (Code/F1TVEmulator/:__span-0-42) [ 1720 0 R /XYZ 60.307257 91.219230 0 ] (Code/F1TVEmulator/:__span-0-43) [ 1722 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-44) [ 1722 0 R /XYZ 60.307257 757.623270 0 ] (Code/F1TVEmulator/:__span-0-45) [ 1722 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-46) [ 1722 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-47) [ 1722 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-48) [ 1722 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-49) [ 1722 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-5) [ 1720 0 R /XYZ 60.307257 640.633662 0 ] (Code/F1TVEmulator/:__span-0-50) [ 1722 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-51) [ 1722 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-52) [ 1722 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-53) [ 1722 0 R /XYZ 60.307257 637.020102 0 ] (Code/F1TVEmulator/:__span-0-54) [ 1722 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-55) [ 1722 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-56) [ 1722 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-57) [ 1722 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-58) [ 1722 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-59) [ 1722 0 R /XYZ 60.307257 556.617990 0 ] (Code/F1TVEmulator/:__span-0-6) [ 1720 0 R /XYZ 60.307257 627.233310 0 ] (Code/F1TVEmulator/:__span-0-60) [ 1722 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-61) [ 1722 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-62) [ 1722 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-63) [ 1722 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-64) [ 1722 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-65) [ 1722 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-66) [ 1722 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-67) [ 1722 0 R /XYZ 60.307257 436.014822 0 ] (Code/F1TVEmulator/:__span-0-68) [ 1722 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-69) [ 1722 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-7) [ 1720 0 R /XYZ 60.307257 613.832958 0 ] (Code/F1TVEmulator/:__span-0-70) [ 1722 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-71) [ 1722 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-72) [ 1722 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-73) [ 1722 0 R /XYZ 60.307257 355.612710 0 ] (Code/F1TVEmulator/:__span-0-74) [ 1722 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-75) [ 1722 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-76) [ 1722 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-77) [ 1722 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-78) [ 1722 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-79) [ 1722 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-8) [ 1720 0 R /XYZ 60.307257 600.432606 0 ] (Code/F1TVEmulator/:__span-0-80) [ 1722 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-81) [ 1722 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-82) [ 1722 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-83) [ 1722 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-84) [ 1722 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-85) [ 1722 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-86) [ 1722 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-87) [ 1722 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-88) [ 1722 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-89) [ 1722 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-9) [ 1720 0 R /XYZ 60.307257 587.032254 0 ] (Code/F1TVEmulator/:__span-0-90) [ 1722 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-91) [ 1722 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-92) [ 1724 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-93) [ 1724 0 R /XYZ 60.307257 757.623270 0 ] (Code/F1TVEmulator/:__span-0-94) [ 1724 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-95) [ 1724 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-96) [ 1724 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-97) [ 1724 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-98) [ 1724 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-99) [ 1724 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:f1tvemulatorcs) [ 1720 0 R /XYZ 39.386457 747.563622 0 ] (Code/Form1/:) [ 1734 0 R /XYZ 39.386457 747.563622 0 ] (Code/Form1/:__span-0-1) [ 1734 0 R /XYZ 60.307257 707.635422 0 ] (Code/Form1/:__span-0-10) [ 1734 0 R /XYZ 60.307257 587.032254 0 ] (Code/Form1/:__span-0-100) [ 1738 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-101) [ 1738 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-102) [ 1738 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-103) [ 1738 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-104) [ 1738 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-105) [ 1738 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-106) [ 1738 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-107) [ 1738 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-108) [ 1738 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-109) [ 1738 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-11) [ 1734 0 R /XYZ 60.307257 573.631902 0 ] (Code/Form1/:__span-0-110) [ 1738 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-111) [ 1738 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-112) [ 1738 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-113) [ 1738 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-114) [ 1738 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-115) [ 1738 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-116) [ 1738 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-117) [ 1738 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-118) [ 1738 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-119) [ 1738 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-12) [ 1734 0 R /XYZ 60.307257 560.231550 0 ] (Code/Form1/:__span-0-120) [ 1738 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-121) [ 1738 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-122) [ 1738 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-123) [ 1738 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-124) [ 1738 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-125) [ 1738 0 R /XYZ 60.307257 328.812006 0 ] (Code/Form1/:__span-0-126) [ 1738 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-127) [ 1738 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-128) [ 1738 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-129) [ 1738 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-13) [ 1734 0 R /XYZ 60.307257 546.831198 0 ] (Code/Form1/:__span-0-130) [ 1738 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-131) [ 1738 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-132) [ 1738 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-133) [ 1738 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-134) [ 1738 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-135) [ 1738 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-136) [ 1740 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-137) [ 1740 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-138) [ 1740 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-139) [ 1740 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-14) [ 1734 0 R /XYZ 60.307257 533.430846 0 ] (Code/Form1/:__span-0-140) [ 1740 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-141) [ 1740 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-142) [ 1740 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-143) [ 1740 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-144) [ 1740 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-145) [ 1740 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-146) [ 1740 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-147) [ 1740 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-148) [ 1740 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-149) [ 1740 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-15) [ 1734 0 R /XYZ 60.307257 520.030494 0 ] (Code/Form1/:__span-0-150) [ 1740 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-151) [ 1740 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-152) [ 1740 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-153) [ 1740 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-154) [ 1740 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-155) [ 1740 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-156) [ 1740 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-157) [ 1740 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-158) [ 1740 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-159) [ 1740 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-16) [ 1734 0 R /XYZ 60.307257 506.630142 0 ] (Code/Form1/:__span-0-160) [ 1740 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-161) [ 1740 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-162) [ 1740 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-163) [ 1740 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-164) [ 1740 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-165) [ 1740 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-166) [ 1740 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-167) [ 1740 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-168) [ 1740 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-169) [ 1740 0 R /XYZ 60.307257 328.812006 0 ] (Code/Form1/:__span-0-17) [ 1734 0 R /XYZ 60.307257 493.229790 0 ] (Code/Form1/:__span-0-170) [ 1740 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-171) [ 1740 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-172) [ 1740 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-173) [ 1740 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-174) [ 1740 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-175) [ 1740 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-176) [ 1740 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-177) [ 1740 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-178) [ 1740 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-179) [ 1740 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-18) [ 1734 0 R /XYZ 60.307257 479.829438 0 ] (Code/Form1/:__span-0-180) [ 1740 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-181) [ 1740 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-182) [ 1740 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-183) [ 1740 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-184) [ 1740 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-185) [ 1740 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-186) [ 1740 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-187) [ 1740 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-188) [ 1742 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-189) [ 1742 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-19) [ 1734 0 R /XYZ 60.307257 466.429086 0 ] (Code/Form1/:__span-0-190) [ 1742 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-191) [ 1742 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-192) [ 1742 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-193) [ 1742 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-194) [ 1742 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-195) [ 1742 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-196) [ 1742 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-197) [ 1742 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-198) [ 1742 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-199) [ 1742 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-2) [ 1734 0 R /XYZ 60.307257 694.235070 0 ] (Code/Form1/:__span-0-20) [ 1734 0 R /XYZ 60.307257 453.028734 0 ] (Code/Form1/:__span-0-200) [ 1742 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-201) [ 1742 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-202) [ 1742 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-203) [ 1742 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-204) [ 1742 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-205) [ 1742 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-206) [ 1742 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-207) [ 1742 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-208) [ 1742 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-209) [ 1742 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-21) [ 1734 0 R /XYZ 60.307257 439.628382 0 ] (Code/Form1/:__span-0-210) [ 1742 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-211) [ 1742 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-212) [ 1742 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-213) [ 1742 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-214) [ 1742 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-215) [ 1742 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-216) [ 1742 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-217) [ 1742 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-218) [ 1742 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-219) [ 1742 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-22) [ 1734 0 R /XYZ 60.307257 426.228030 0 ] (Code/Form1/:__span-0-220) [ 1742 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-221) [ 1742 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-222) [ 1742 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-223) [ 1742 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-224) [ 1742 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-225) [ 1742 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-226) [ 1742 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-227) [ 1742 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-228) [ 1742 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-229) [ 1742 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-23) [ 1734 0 R /XYZ 60.307257 412.827678 0 ] (Code/Form1/:__span-0-230) [ 1742 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-231) [ 1742 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-232) [ 1742 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-233) [ 1742 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-234) [ 1742 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-235) [ 1742 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-236) [ 1742 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-237) [ 1742 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-238) [ 1744 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-239) [ 1744 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-24) [ 1734 0 R /XYZ 60.307257 399.427326 0 ] (Code/Form1/:__span-0-240) [ 1744 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-241) [ 1744 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-242) [ 1744 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-243) [ 1744 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-244) [ 1744 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-245) [ 1744 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-246) [ 1744 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-247) [ 1744 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-248) [ 1744 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-249) [ 1744 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-25) [ 1734 0 R /XYZ 60.307257 386.026974 0 ] (Code/Form1/:__span-0-250) [ 1744 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-251) [ 1744 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-252) [ 1744 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-253) [ 1744 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-254) [ 1744 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-255) [ 1744 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-256) [ 1744 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-257) [ 1744 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-258) [ 1744 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-259) [ 1744 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-26) [ 1734 0 R /XYZ 60.307257 372.626622 0 ] (Code/Form1/:__span-0-260) [ 1744 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-261) [ 1744 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-262) [ 1744 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-263) [ 1744 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-264) [ 1744 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-265) [ 1744 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-266) [ 1744 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-267) [ 1744 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-268) [ 1744 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-269) [ 1744 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-27) [ 1734 0 R /XYZ 60.307257 359.226270 0 ] (Code/Form1/:__span-0-270) [ 1744 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-271) [ 1744 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-272) [ 1744 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-273) [ 1744 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-274) [ 1744 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-275) [ 1744 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-276) [ 1744 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-277) [ 1744 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-278) [ 1744 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-279) [ 1744 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-28) [ 1734 0 R /XYZ 60.307257 345.825918 0 ] (Code/Form1/:__span-0-280) [ 1744 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-281) [ 1746 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-282) [ 1746 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-283) [ 1746 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-284) [ 1746 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-285) [ 1746 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-286) [ 1746 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-287) [ 1746 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-288) [ 1746 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-289) [ 1746 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-29) [ 1734 0 R /XYZ 60.307257 332.425566 0 ] (Code/Form1/:__span-0-290) [ 1746 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-291) [ 1746 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-292) [ 1746 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-293) [ 1746 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-294) [ 1746 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-295) [ 1746 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-296) [ 1746 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-297) [ 1746 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-298) [ 1746 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-299) [ 1746 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-3) [ 1734 0 R /XYZ 60.307257 680.834718 0 ] (Code/Form1/:__span-0-30) [ 1734 0 R /XYZ 60.307257 319.025214 0 ] (Code/Form1/:__span-0-300) [ 1746 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-301) [ 1746 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-302) [ 1746 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-303) [ 1746 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-304) [ 1746 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-305) [ 1746 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-306) [ 1746 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-307) [ 1746 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-308) [ 1746 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-309) [ 1746 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-31) [ 1734 0 R /XYZ 60.307257 305.624862 0 ] (Code/Form1/:__span-0-310) [ 1746 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-311) [ 1746 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-312) [ 1746 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-313) [ 1746 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-314) [ 1746 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-315) [ 1746 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-316) [ 1746 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-317) [ 1746 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-318) [ 1746 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-319) [ 1746 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-32) [ 1734 0 R /XYZ 60.307257 292.224510 0 ] (Code/Form1/:__span-0-320) [ 1746 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-321) [ 1746 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-322) [ 1746 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-323) [ 1746 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-324) [ 1746 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-325) [ 1746 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-326) [ 1746 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-327) [ 1746 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-328) [ 1746 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-329) [ 1748 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-33) [ 1734 0 R /XYZ 60.307257 278.824158 0 ] (Code/Form1/:__span-0-330) [ 1748 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-331) [ 1748 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-332) [ 1748 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-333) [ 1748 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-334) [ 1748 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-335) [ 1748 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-336) [ 1748 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-337) [ 1748 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-338) [ 1748 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-339) [ 1748 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-34) [ 1734 0 R /XYZ 60.307257 265.423806 0 ] (Code/Form1/:__span-0-340) [ 1748 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-341) [ 1748 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-342) [ 1748 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-343) [ 1748 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-344) [ 1748 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-345) [ 1748 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-346) [ 1748 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-347) [ 1748 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-348) [ 1748 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-349) [ 1748 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-35) [ 1734 0 R /XYZ 60.307257 252.023454 0 ] (Code/Form1/:__span-0-350) [ 1748 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-351) [ 1748 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-352) [ 1748 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-353) [ 1748 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-354) [ 1748 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-355) [ 1748 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-356) [ 1748 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-357) [ 1748 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-358) [ 1748 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-359) [ 1748 0 R /XYZ 60.307257 328.812006 0 ] (Code/Form1/:__span-0-36) [ 1734 0 R /XYZ 60.307257 238.623102 0 ] (Code/Form1/:__span-0-360) [ 1748 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-361) [ 1748 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-362) [ 1748 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-363) [ 1748 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-364) [ 1748 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-365) [ 1748 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-366) [ 1748 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-367) [ 1748 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-368) [ 1748 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-369) [ 1748 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-37) [ 1734 0 R /XYZ 60.307257 225.222750 0 ] (Code/Form1/:__span-0-370) [ 1748 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-371) [ 1748 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-372) [ 1748 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-373) [ 1748 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-374) [ 1748 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-375) [ 1748 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-376) [ 1750 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-377) [ 1750 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-378) [ 1750 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-379) [ 1750 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-38) [ 1734 0 R /XYZ 60.307257 211.822398 0 ] (Code/Form1/:__span-0-380) [ 1750 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-381) [ 1750 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-382) [ 1750 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-383) [ 1750 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-384) [ 1750 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-385) [ 1750 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-386) [ 1750 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-387) [ 1750 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-388) [ 1750 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-389) [ 1750 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-39) [ 1734 0 R /XYZ 60.307257 198.422046 0 ] (Code/Form1/:__span-0-390) [ 1750 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-391) [ 1750 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-392) [ 1750 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-393) [ 1750 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-394) [ 1750 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-395) [ 1750 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-396) [ 1750 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-397) [ 1750 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-398) [ 1750 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-399) [ 1750 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-4) [ 1734 0 R /XYZ 60.307257 667.434366 0 ] (Code/Form1/:__span-0-40) [ 1734 0 R /XYZ 60.307257 185.021694 0 ] (Code/Form1/:__span-0-400) [ 1750 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-401) [ 1750 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-402) [ 1750 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-403) [ 1750 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-404) [ 1750 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-405) [ 1750 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-406) [ 1750 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-407) [ 1750 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-408) [ 1750 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-409) [ 1750 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-41) [ 1734 0 R /XYZ 60.307257 171.621342 0 ] (Code/Form1/:__span-0-410) [ 1750 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-411) [ 1750 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-412) [ 1750 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-413) [ 1750 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-414) [ 1750 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-415) [ 1752 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-416) [ 1752 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-417) [ 1752 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-418) [ 1752 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-419) [ 1752 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-42) [ 1734 0 R /XYZ 60.307257 158.220990 0 ] (Code/Form1/:__span-0-420) [ 1752 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-421) [ 1752 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-422) [ 1752 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-43) [ 1734 0 R /XYZ 60.307257 144.820638 0 ] (Code/Form1/:__span-0-44) [ 1734 0 R /XYZ 60.307257 131.420286 0 ] (Code/Form1/:__span-0-45) [ 1734 0 R /XYZ 60.307257 118.019934 0 ] (Code/Form1/:__span-0-46) [ 1734 0 R /XYZ 60.307257 104.619582 0 ] (Code/Form1/:__span-0-47) [ 1734 0 R /XYZ 60.307257 91.219230 0 ] (Code/Form1/:__span-0-48) [ 1736 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-49) [ 1736 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-5) [ 1734 0 R /XYZ 60.307257 654.034014 0 ] (Code/Form1/:__span-0-50) [ 1736 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-51) [ 1736 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-52) [ 1736 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-53) [ 1736 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-54) [ 1736 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-55) [ 1736 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-56) [ 1736 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-57) [ 1736 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-58) [ 1736 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-59) [ 1736 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-6) [ 1734 0 R /XYZ 60.307257 640.633662 0 ] (Code/Form1/:__span-0-60) [ 1736 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-61) [ 1736 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-62) [ 1736 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-63) [ 1736 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-64) [ 1736 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-65) [ 1736 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-66) [ 1736 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-67) [ 1736 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-68) [ 1736 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-69) [ 1736 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-7) [ 1734 0 R /XYZ 60.307257 627.233310 0 ] (Code/Form1/:__span-0-70) [ 1736 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-71) [ 1736 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-72) [ 1736 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-73) [ 1736 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-74) [ 1736 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-75) [ 1736 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-76) [ 1736 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-77) [ 1736 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-78) [ 1736 0 R /XYZ 60.307257 328.812006 0 ] (Code/Form1/:__span-0-79) [ 1736 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-8) [ 1734 0 R /XYZ 60.307257 613.832958 0 ] (Code/Form1/:__span-0-80) [ 1736 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-81) [ 1736 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-82) [ 1736 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-83) [ 1736 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-84) [ 1736 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-85) [ 1736 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-86) [ 1736 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-87) [ 1736 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-88) [ 1736 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-89) [ 1736 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-9) [ 1734 0 R /XYZ 60.307257 600.432606 0 ] (Code/Form1/:__span-0-90) [ 1736 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-91) [ 1736 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-92) [ 1736 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-93) [ 1736 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-94) [ 1736 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-95) [ 1736 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-96) [ 1738 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-97) [ 1738 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-98) [ 1738 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-99) [ 1738 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:form1cs) [ 1734 0 R /XYZ 39.386457 747.563622 0 ] (Code/OcrImage/:) [ 1838 0 R /XYZ 39.386457 747.563622 0 ] (Code/OcrImage/:__span-0-1) [ 1838 0 R /XYZ 60.307257 707.635422 0 ] (Code/OcrImage/:__span-0-10) [ 1838 0 R /XYZ 60.307257 587.032254 0 ] (Code/OcrImage/:__span-0-100) [ 1842 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-101) [ 1842 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-102) [ 1842 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-103) [ 1842 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-104) [ 1842 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-105) [ 1842 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-106) [ 1842 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-107) [ 1842 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-108) [ 1842 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-109) [ 1842 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-11) [ 1838 0 R /XYZ 60.307257 573.631902 0 ] (Code/OcrImage/:__span-0-110) [ 1842 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-111) [ 1842 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-112) [ 1842 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-113) [ 1842 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-114) [ 1842 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-115) [ 1842 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-116) [ 1842 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-117) [ 1842 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-118) [ 1842 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-119) [ 1842 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-12) [ 1838 0 R /XYZ 60.307257 560.231550 0 ] (Code/OcrImage/:__span-0-120) [ 1842 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-121) [ 1842 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-122) [ 1842 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-123) [ 1842 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-124) [ 1842 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-125) [ 1842 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-126) [ 1842 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-127) [ 1842 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-128) [ 1842 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-129) [ 1844 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-13) [ 1838 0 R /XYZ 60.307257 546.831198 0 ] (Code/OcrImage/:__span-0-130) [ 1844 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-131) [ 1844 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-132) [ 1844 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-133) [ 1844 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-134) [ 1844 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-135) [ 1844 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-136) [ 1844 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-137) [ 1844 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-138) [ 1844 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-139) [ 1844 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-14) [ 1838 0 R /XYZ 60.307257 533.430846 0 ] (Code/OcrImage/:__span-0-140) [ 1844 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-141) [ 1844 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-142) [ 1844 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-143) [ 1844 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-144) [ 1844 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-145) [ 1844 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-146) [ 1844 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-147) [ 1844 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-148) [ 1844 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-149) [ 1844 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-15) [ 1838 0 R /XYZ 60.307257 520.030494 0 ] (Code/OcrImage/:__span-0-150) [ 1844 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-151) [ 1844 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-152) [ 1844 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-153) [ 1844 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-154) [ 1844 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-155) [ 1844 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-156) [ 1844 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-157) [ 1844 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-158) [ 1844 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-159) [ 1844 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-16) [ 1838 0 R /XYZ 60.307257 506.630142 0 ] (Code/OcrImage/:__span-0-160) [ 1844 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-161) [ 1844 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-162) [ 1844 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-163) [ 1844 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-164) [ 1844 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-165) [ 1844 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-166) [ 1844 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-167) [ 1844 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-168) [ 1844 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-169) [ 1844 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-17) [ 1838 0 R /XYZ 60.307257 493.229790 0 ] (Code/OcrImage/:__span-0-170) [ 1844 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-171) [ 1844 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-172) [ 1844 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-173) [ 1844 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-174) [ 1846 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-175) [ 1846 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-176) [ 1846 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-177) [ 1846 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-178) [ 1846 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-179) [ 1846 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-18) [ 1838 0 R /XYZ 60.307257 479.829438 0 ] (Code/OcrImage/:__span-0-180) [ 1846 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-181) [ 1846 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-182) [ 1846 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-183) [ 1846 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-184) [ 1846 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-185) [ 1846 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-186) [ 1846 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-187) [ 1846 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-188) [ 1846 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-189) [ 1846 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-19) [ 1838 0 R /XYZ 60.307257 453.028734 0 ] (Code/OcrImage/:__span-0-190) [ 1846 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-191) [ 1846 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-192) [ 1846 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-193) [ 1846 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-194) [ 1846 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-195) [ 1846 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-196) [ 1846 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-197) [ 1846 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-198) [ 1846 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-199) [ 1846 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-2) [ 1838 0 R /XYZ 60.307257 694.235070 0 ] (Code/OcrImage/:__span-0-20) [ 1838 0 R /XYZ 60.307257 426.228030 0 ] (Code/OcrImage/:__span-0-200) [ 1846 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-201) [ 1846 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-202) [ 1846 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-203) [ 1846 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-204) [ 1846 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-205) [ 1846 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-206) [ 1846 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-207) [ 1846 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-208) [ 1846 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-209) [ 1846 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-21) [ 1838 0 R /XYZ 60.307257 399.427326 0 ] (Code/OcrImage/:__span-0-210) [ 1846 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-211) [ 1846 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-212) [ 1846 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-213) [ 1846 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-214) [ 1846 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-215) [ 1846 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-216) [ 1846 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-217) [ 1848 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-218) [ 1848 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-219) [ 1848 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-22) [ 1838 0 R /XYZ 60.307257 386.026974 0 ] (Code/OcrImage/:__span-0-220) [ 1848 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-221) [ 1848 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-222) [ 1848 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-223) [ 1848 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-224) [ 1848 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-225) [ 1848 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-226) [ 1848 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-227) [ 1848 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-228) [ 1848 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-229) [ 1848 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-23) [ 1838 0 R /XYZ 60.307257 372.626622 0 ] (Code/OcrImage/:__span-0-230) [ 1848 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-231) [ 1848 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-232) [ 1848 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-233) [ 1848 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-234) [ 1848 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-235) [ 1848 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-236) [ 1848 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-237) [ 1848 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-238) [ 1848 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-239) [ 1848 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-24) [ 1838 0 R /XYZ 60.307257 359.226270 0 ] (Code/OcrImage/:__span-0-240) [ 1848 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-241) [ 1848 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-242) [ 1848 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-243) [ 1848 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-244) [ 1848 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-245) [ 1848 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-246) [ 1848 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-247) [ 1848 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-248) [ 1848 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-249) [ 1848 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-25) [ 1838 0 R /XYZ 60.307257 345.825918 0 ] (Code/OcrImage/:__span-0-250) [ 1848 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-251) [ 1848 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-252) [ 1848 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-253) [ 1848 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-254) [ 1848 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-255) [ 1848 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-256) [ 1848 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-257) [ 1848 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-258) [ 1848 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-259) [ 1848 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-26) [ 1838 0 R /XYZ 60.307257 332.425566 0 ] (Code/OcrImage/:__span-0-260) [ 1848 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-261) [ 1848 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-262) [ 1848 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-263) [ 1848 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-264) [ 1850 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-265) [ 1850 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-266) [ 1850 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-267) [ 1850 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-268) [ 1850 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-269) [ 1850 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-27) [ 1838 0 R /XYZ 60.307257 319.025214 0 ] (Code/OcrImage/:__span-0-270) [ 1850 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-271) [ 1850 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-272) [ 1850 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-273) [ 1850 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-274) [ 1850 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-275) [ 1850 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-276) [ 1850 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-277) [ 1850 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-278) [ 1850 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-279) [ 1850 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-28) [ 1838 0 R /XYZ 60.307257 305.624862 0 ] (Code/OcrImage/:__span-0-280) [ 1850 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-281) [ 1850 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-282) [ 1850 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-283) [ 1850 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-284) [ 1850 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-285) [ 1850 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-286) [ 1850 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-287) [ 1850 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-288) [ 1850 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-289) [ 1850 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-29) [ 1838 0 R /XYZ 60.307257 292.224510 0 ] (Code/OcrImage/:__span-0-290) [ 1850 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-291) [ 1850 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-292) [ 1850 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-293) [ 1850 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-294) [ 1850 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-295) [ 1850 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-296) [ 1850 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-297) [ 1850 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-298) [ 1850 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-299) [ 1850 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-3) [ 1838 0 R /XYZ 60.307257 680.834718 0 ] (Code/OcrImage/:__span-0-30) [ 1838 0 R /XYZ 60.307257 278.824158 0 ] (Code/OcrImage/:__span-0-300) [ 1850 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-301) [ 1850 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-302) [ 1850 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-303) [ 1850 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-304) [ 1850 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-305) [ 1850 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-306) [ 1850 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-307) [ 1850 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-308) [ 1850 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-309) [ 1850 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-31) [ 1838 0 R /XYZ 60.307257 265.423806 0 ] (Code/OcrImage/:__span-0-310) [ 1852 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-311) [ 1852 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-312) [ 1852 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-313) [ 1852 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-314) [ 1852 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-315) [ 1852 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-316) [ 1852 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-317) [ 1852 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-318) [ 1852 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-319) [ 1852 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-32) [ 1838 0 R /XYZ 60.307257 252.023454 0 ] (Code/OcrImage/:__span-0-320) [ 1852 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-321) [ 1852 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-322) [ 1852 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-323) [ 1852 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-324) [ 1852 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-325) [ 1852 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-326) [ 1852 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-327) [ 1852 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-328) [ 1852 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-329) [ 1852 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-33) [ 1838 0 R /XYZ 60.307257 238.623102 0 ] (Code/OcrImage/:__span-0-330) [ 1852 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-331) [ 1852 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-332) [ 1852 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-333) [ 1852 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-334) [ 1852 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-335) [ 1852 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-336) [ 1852 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-337) [ 1852 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-338) [ 1852 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-339) [ 1852 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-34) [ 1838 0 R /XYZ 60.307257 225.222750 0 ] (Code/OcrImage/:__span-0-340) [ 1852 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-341) [ 1852 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-342) [ 1852 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-343) [ 1852 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-344) [ 1852 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-345) [ 1852 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-346) [ 1852 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-347) [ 1852 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-348) [ 1852 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-349) [ 1852 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-35) [ 1838 0 R /XYZ 60.307257 211.822398 0 ] (Code/OcrImage/:__span-0-350) [ 1852 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-351) [ 1852 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-352) [ 1852 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-353) [ 1852 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-354) [ 1852 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-355) [ 1854 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-356) [ 1854 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-357) [ 1854 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-358) [ 1854 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-359) [ 1854 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-36) [ 1838 0 R /XYZ 60.307257 198.422046 0 ] (Code/OcrImage/:__span-0-360) [ 1854 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-361) [ 1854 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-362) [ 1854 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-363) [ 1854 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-364) [ 1854 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-365) [ 1854 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-366) [ 1854 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-367) [ 1854 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-368) [ 1854 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-369) [ 1854 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-37) [ 1838 0 R /XYZ 60.307257 185.021694 0 ] (Code/OcrImage/:__span-0-370) [ 1854 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-371) [ 1854 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-372) [ 1854 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-373) [ 1854 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-374) [ 1854 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-375) [ 1854 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-376) [ 1854 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-377) [ 1854 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-378) [ 1854 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-379) [ 1854 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-38) [ 1838 0 R /XYZ 60.307257 171.621342 0 ] (Code/OcrImage/:__span-0-380) [ 1854 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-381) [ 1854 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-382) [ 1854 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-383) [ 1854 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-384) [ 1854 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-385) [ 1854 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-386) [ 1854 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-387) [ 1854 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-388) [ 1854 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-389) [ 1854 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-39) [ 1838 0 R /XYZ 60.307257 158.220990 0 ] (Code/OcrImage/:__span-0-390) [ 1854 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-391) [ 1854 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-392) [ 1854 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-393) [ 1854 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-394) [ 1854 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-395) [ 1854 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-396) [ 1854 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-397) [ 1854 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-398) [ 1854 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-399) [ 1854 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-4) [ 1838 0 R /XYZ 60.307257 667.434366 0 ] (Code/OcrImage/:__span-0-40) [ 1838 0 R /XYZ 60.307257 144.820638 0 ] (Code/OcrImage/:__span-0-400) [ 1854 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-401) [ 1854 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-402) [ 1854 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-403) [ 1854 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-404) [ 1854 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-405) [ 1856 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-406) [ 1856 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-407) [ 1856 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-408) [ 1856 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-409) [ 1856 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-41) [ 1838 0 R /XYZ 60.307257 131.420286 0 ] (Code/OcrImage/:__span-0-410) [ 1856 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-411) [ 1856 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-412) [ 1856 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-413) [ 1856 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-414) [ 1856 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-415) [ 1856 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-416) [ 1856 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-417) [ 1856 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-418) [ 1856 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-419) [ 1856 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-42) [ 1838 0 R /XYZ 60.307257 118.019934 0 ] (Code/OcrImage/:__span-0-420) [ 1856 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-421) [ 1856 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-422) [ 1856 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-423) [ 1856 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-424) [ 1856 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-425) [ 1856 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-426) [ 1856 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-427) [ 1856 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-428) [ 1856 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-429) [ 1856 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-43) [ 1838 0 R /XYZ 60.307257 91.219230 0 ] (Code/OcrImage/:__span-0-430) [ 1856 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-431) [ 1856 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-432) [ 1856 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-433) [ 1856 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-434) [ 1856 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-435) [ 1856 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-436) [ 1856 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-437) [ 1856 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-438) [ 1856 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-439) [ 1856 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-44) [ 1840 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-440) [ 1856 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-441) [ 1856 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-442) [ 1856 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-443) [ 1856 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-444) [ 1856 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-445) [ 1856 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-446) [ 1856 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-447) [ 1856 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-448) [ 1856 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-449) [ 1856 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-45) [ 1840 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-450) [ 1856 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-451) [ 1858 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-452) [ 1858 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-453) [ 1858 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-454) [ 1858 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-455) [ 1858 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-456) [ 1858 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-457) [ 1858 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-458) [ 1858 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-459) [ 1858 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-46) [ 1840 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-460) [ 1858 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-461) [ 1858 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-462) [ 1858 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-463) [ 1858 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-464) [ 1858 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-465) [ 1858 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-466) [ 1858 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-467) [ 1858 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-468) [ 1858 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-469) [ 1858 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-47) [ 1840 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-470) [ 1858 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-471) [ 1858 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-472) [ 1858 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-473) [ 1858 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-474) [ 1858 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-475) [ 1858 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-476) [ 1858 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-477) [ 1858 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-478) [ 1858 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-479) [ 1858 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-48) [ 1840 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-480) [ 1858 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-481) [ 1858 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-482) [ 1858 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-483) [ 1858 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-484) [ 1858 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-485) [ 1858 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-486) [ 1858 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-487) [ 1858 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-488) [ 1858 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-489) [ 1858 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-49) [ 1840 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-490) [ 1858 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-491) [ 1858 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-492) [ 1858 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-493) [ 1858 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-494) [ 1858 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-495) [ 1858 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-496) [ 1860 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-497) [ 1860 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-498) [ 1860 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-499) [ 1860 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-5) [ 1838 0 R /XYZ 60.307257 654.034014 0 ] (Code/OcrImage/:__span-0-50) [ 1840 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-500) [ 1860 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-501) [ 1860 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-502) [ 1860 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-503) [ 1860 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-504) [ 1860 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-505) [ 1860 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-506) [ 1860 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-507) [ 1860 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-508) [ 1860 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-509) [ 1860 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-51) [ 1840 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-510) [ 1860 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-511) [ 1860 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-512) [ 1860 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-513) [ 1860 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-514) [ 1860 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-515) [ 1860 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-516) [ 1860 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-517) [ 1860 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-518) [ 1860 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-519) [ 1860 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-52) [ 1840 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-520) [ 1860 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-521) [ 1860 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-522) [ 1860 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-523) [ 1860 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-524) [ 1860 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-525) [ 1860 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-526) [ 1860 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-527) [ 1860 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-528) [ 1860 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-529) [ 1860 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-53) [ 1840 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-530) [ 1860 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-531) [ 1860 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-532) [ 1860 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-533) [ 1860 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-534) [ 1860 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-535) [ 1860 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-536) [ 1860 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-537) [ 1860 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-538) [ 1860 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-539) [ 1860 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-54) [ 1840 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-540) [ 1860 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-541) [ 1860 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-542) [ 1860 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-543) [ 1862 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-544) [ 1862 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-545) [ 1862 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-546) [ 1862 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-547) [ 1862 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-548) [ 1862 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-549) [ 1862 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-55) [ 1840 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-550) [ 1862 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-551) [ 1862 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-552) [ 1862 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-553) [ 1862 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-554) [ 1862 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-555) [ 1862 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-556) [ 1862 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-557) [ 1862 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-558) [ 1862 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-559) [ 1862 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-56) [ 1840 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-560) [ 1862 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-561) [ 1862 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-562) [ 1862 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-563) [ 1862 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-564) [ 1862 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-565) [ 1862 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-566) [ 1862 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-567) [ 1862 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-568) [ 1862 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-569) [ 1862 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-57) [ 1840 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-570) [ 1862 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-571) [ 1862 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-572) [ 1862 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-573) [ 1862 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-574) [ 1862 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-575) [ 1862 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-576) [ 1862 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-577) [ 1862 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-578) [ 1862 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-579) [ 1862 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-58) [ 1840 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-580) [ 1862 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-581) [ 1862 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-582) [ 1862 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-583) [ 1862 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-584) [ 1862 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-585) [ 1862 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-586) [ 1862 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-587) [ 1862 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-588) [ 1862 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-589) [ 1862 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-59) [ 1840 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-590) [ 1864 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-591) [ 1864 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-592) [ 1864 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-593) [ 1864 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-594) [ 1864 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-595) [ 1864 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-596) [ 1864 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-597) [ 1864 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-598) [ 1864 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-599) [ 1864 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-6) [ 1838 0 R /XYZ 60.307257 640.633662 0 ] (Code/OcrImage/:__span-0-60) [ 1840 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-600) [ 1864 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-601) [ 1864 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-602) [ 1864 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-603) [ 1864 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-604) [ 1864 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-605) [ 1864 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-606) [ 1864 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-607) [ 1864 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-608) [ 1864 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-609) [ 1864 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-61) [ 1840 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-610) [ 1864 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-611) [ 1864 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-612) [ 1864 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-613) [ 1864 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-614) [ 1864 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-615) [ 1864 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-616) [ 1864 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-617) [ 1864 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-618) [ 1864 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-619) [ 1864 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-62) [ 1840 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-620) [ 1864 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-621) [ 1864 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-622) [ 1864 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-623) [ 1864 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-624) [ 1864 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-625) [ 1864 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-626) [ 1864 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-627) [ 1864 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-628) [ 1864 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-629) [ 1864 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-63) [ 1840 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-630) [ 1864 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-631) [ 1864 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-632) [ 1864 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-633) [ 1864 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-634) [ 1864 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-635) [ 1864 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-636) [ 1864 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-637) [ 1864 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-638) [ 1866 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-639) [ 1866 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-64) [ 1840 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-640) [ 1866 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-641) [ 1866 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-642) [ 1866 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-643) [ 1866 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-644) [ 1866 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-645) [ 1866 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-646) [ 1866 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-647) [ 1866 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-648) [ 1866 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-649) [ 1866 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-65) [ 1840 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-650) [ 1866 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-651) [ 1866 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-652) [ 1866 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-653) [ 1866 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-654) [ 1866 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-655) [ 1866 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-656) [ 1866 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-657) [ 1866 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-658) [ 1866 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-659) [ 1866 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-66) [ 1840 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-660) [ 1866 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-661) [ 1866 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-662) [ 1866 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-663) [ 1866 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-664) [ 1866 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-665) [ 1866 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-666) [ 1866 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-667) [ 1866 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-668) [ 1866 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-669) [ 1866 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-67) [ 1840 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-670) [ 1866 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-671) [ 1866 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-672) [ 1866 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-673) [ 1866 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-68) [ 1840 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-69) [ 1840 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-7) [ 1838 0 R /XYZ 60.307257 627.233310 0 ] (Code/OcrImage/:__span-0-70) [ 1840 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-71) [ 1840 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-72) [ 1840 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-73) [ 1840 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-74) [ 1840 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-75) [ 1840 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-76) [ 1840 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-77) [ 1840 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-78) [ 1840 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-79) [ 1840 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-8) [ 1838 0 R /XYZ 60.307257 613.832958 0 ] (Code/OcrImage/:__span-0-80) [ 1840 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-81) [ 1840 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-82) [ 1840 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-83) [ 1840 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-84) [ 1842 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-85) [ 1842 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-86) [ 1842 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-87) [ 1842 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-88) [ 1842 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-89) [ 1842 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-9) [ 1838 0 R /XYZ 60.307257 600.432606 0 ] (Code/OcrImage/:__span-0-90) [ 1842 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-91) [ 1842 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-92) [ 1842 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-93) [ 1842 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-94) [ 1842 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-95) [ 1842 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-96) [ 1842 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-97) [ 1842 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-98) [ 1842 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-99) [ 1842 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:ocrimagecs) [ 1838 0 R /XYZ 39.386457 747.563622 0 ] (Code/Program/:) [ 1754 0 R /XYZ 39.386457 747.563622 0 ] (Code/Program/:__span-0-1) [ 1754 0 R /XYZ 60.307257 707.635422 0 ] (Code/Program/:__span-0-10) [ 1754 0 R /XYZ 60.307257 587.032254 0 ] (Code/Program/:__span-0-11) [ 1754 0 R /XYZ 60.307257 573.631902 0 ] (Code/Program/:__span-0-12) [ 1754 0 R /XYZ 60.307257 560.231550 0 ] (Code/Program/:__span-0-13) [ 1754 0 R /XYZ 60.307257 546.831198 0 ] (Code/Program/:__span-0-14) [ 1754 0 R /XYZ 60.307257 533.430846 0 ] (Code/Program/:__span-0-15) [ 1754 0 R /XYZ 60.307257 520.030494 0 ] (Code/Program/:__span-0-16) [ 1754 0 R /XYZ 60.307257 506.630142 0 ] (Code/Program/:__span-0-17) [ 1754 0 R /XYZ 60.307257 493.229790 0 ] (Code/Program/:__span-0-18) [ 1754 0 R /XYZ 60.307257 479.829438 0 ] (Code/Program/:__span-0-19) [ 1754 0 R /XYZ 60.307257 466.429086 0 ] (Code/Program/:__span-0-2) [ 1754 0 R /XYZ 60.307257 694.235070 0 ] (Code/Program/:__span-0-20) [ 1754 0 R /XYZ 60.307257 453.028734 0 ] (Code/Program/:__span-0-21) [ 1754 0 R /XYZ 60.307257 439.628382 0 ] (Code/Program/:__span-0-22) [ 1754 0 R /XYZ 60.307257 426.228030 0 ] (Code/Program/:__span-0-3) [ 1754 0 R /XYZ 60.307257 680.834718 0 ] (Code/Program/:__span-0-4) [ 1754 0 R /XYZ 60.307257 667.434366 0 ] (Code/Program/:__span-0-5) [ 1754 0 R /XYZ 60.307257 654.034014 0 ] (Code/Program/:__span-0-6) [ 1754 0 R /XYZ 60.307257 640.633662 0 ] (Code/Program/:__span-0-7) [ 1754 0 R /XYZ 60.307257 627.233310 0 ] (Code/Program/:__span-0-8) [ 1754 0 R /XYZ 60.307257 613.832958 0 ] (Code/Program/:__span-0-9) [ 1754 0 R /XYZ 60.307257 600.432606 0 ] (Code/Program/:programcs) [ 1754 0 R /XYZ 39.386457 747.563622 0 ] (Code/Reader/:) [ 1868 0 R /XYZ 39.386457 747.563622 0 ] (Code/Reader/:__span-0-1) [ 1868 0 R /XYZ 60.307257 707.635422 0 ] (Code/Reader/:__span-0-10) [ 1868 0 R /XYZ 60.307257 587.032254 0 ] (Code/Reader/:__span-0-100) [ 1872 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-101) [ 1872 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-102) [ 1872 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-103) [ 1872 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-104) [ 1872 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-105) [ 1872 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-106) [ 1872 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-107) [ 1872 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-108) [ 1872 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-109) [ 1872 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-11) [ 1868 0 R /XYZ 60.307257 573.631902 0 ] (Code/Reader/:__span-0-110) [ 1872 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-111) [ 1872 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-112) [ 1872 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-113) [ 1872 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-114) [ 1872 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-115) [ 1872 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-116) [ 1872 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-117) [ 1872 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-118) [ 1872 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-119) [ 1872 0 R /XYZ 60.307257 235.009542 0 ] (Code/Reader/:__span-0-12) [ 1868 0 R /XYZ 60.307257 560.231550 0 ] (Code/Reader/:__span-0-120) [ 1872 0 R /XYZ 60.307257 221.609190 0 ] (Code/Reader/:__span-0-121) [ 1872 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-122) [ 1872 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-123) [ 1872 0 R /XYZ 60.307257 181.408134 0 ] (Code/Reader/:__span-0-124) [ 1872 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-125) [ 1872 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-126) [ 1872 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-127) [ 1872 0 R /XYZ 60.307257 127.806726 0 ] (Code/Reader/:__span-0-128) [ 1872 0 R /XYZ 60.307257 101.006022 0 ] (Code/Reader/:__span-0-129) [ 1872 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-13) [ 1868 0 R /XYZ 60.307257 546.831198 0 ] (Code/Reader/:__span-0-130) [ 1874 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-131) [ 1874 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-132) [ 1874 0 R /XYZ 60.307257 744.222918 0 ] (Code/Reader/:__span-0-133) [ 1874 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-134) [ 1874 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-135) [ 1874 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-136) [ 1874 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-137) [ 1874 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-138) [ 1874 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-139) [ 1874 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-14) [ 1868 0 R /XYZ 60.307257 533.430846 0 ] (Code/Reader/:__span-0-140) [ 1874 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-141) [ 1874 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-142) [ 1874 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-143) [ 1874 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-144) [ 1874 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-145) [ 1874 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-146) [ 1874 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-147) [ 1874 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-148) [ 1874 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-149) [ 1874 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-15) [ 1868 0 R /XYZ 60.307257 520.030494 0 ] (Code/Reader/:__span-0-150) [ 1874 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-151) [ 1874 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-152) [ 1874 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-153) [ 1874 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-154) [ 1874 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-155) [ 1874 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-156) [ 1874 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-157) [ 1874 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-158) [ 1874 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-159) [ 1874 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-16) [ 1868 0 R /XYZ 60.307257 506.630142 0 ] (Code/Reader/:__span-0-160) [ 1874 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-161) [ 1874 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-162) [ 1874 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-163) [ 1874 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-164) [ 1874 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-165) [ 1874 0 R /XYZ 60.307257 261.810246 0 ] (Code/Reader/:__span-0-166) [ 1874 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-167) [ 1874 0 R /XYZ 60.307257 235.009542 0 ] (Code/Reader/:__span-0-168) [ 1874 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-169) [ 1874 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-17) [ 1868 0 R /XYZ 60.307257 493.229790 0 ] (Code/Reader/:__span-0-170) [ 1874 0 R /XYZ 60.307257 181.408134 0 ] (Code/Reader/:__span-0-171) [ 1874 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-172) [ 1874 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-173) [ 1874 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-174) [ 1874 0 R /XYZ 60.307257 127.806726 0 ] (Code/Reader/:__span-0-175) [ 1874 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-176) [ 1874 0 R /XYZ 60.307257 101.006022 0 ] (Code/Reader/:__span-0-177) [ 1874 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-178) [ 1876 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-179) [ 1876 0 R /XYZ 60.307257 744.222918 0 ] (Code/Reader/:__span-0-18) [ 1868 0 R /XYZ 60.307257 479.829438 0 ] (Code/Reader/:__span-0-180) [ 1876 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-181) [ 1876 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-182) [ 1876 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-183) [ 1876 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-184) [ 1876 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-185) [ 1876 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-186) [ 1876 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-187) [ 1876 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-188) [ 1876 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-189) [ 1876 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-19) [ 1868 0 R /XYZ 60.307257 466.429086 0 ] (Code/Reader/:__span-0-190) [ 1876 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-191) [ 1876 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-192) [ 1876 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-193) [ 1876 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-194) [ 1876 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-195) [ 1876 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-196) [ 1876 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-197) [ 1876 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-198) [ 1876 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-199) [ 1876 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-2) [ 1868 0 R /XYZ 60.307257 694.235070 0 ] (Code/Reader/:__span-0-20) [ 1868 0 R /XYZ 60.307257 453.028734 0 ] (Code/Reader/:__span-0-200) [ 1876 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-201) [ 1876 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-202) [ 1876 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-203) [ 1876 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-204) [ 1876 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-205) [ 1876 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-206) [ 1876 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-207) [ 1876 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-208) [ 1876 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-209) [ 1876 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-21) [ 1868 0 R /XYZ 60.307257 439.628382 0 ] (Code/Reader/:__span-0-210) [ 1876 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-211) [ 1876 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-212) [ 1876 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-213) [ 1876 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-214) [ 1876 0 R /XYZ 60.307257 261.810246 0 ] (Code/Reader/:__span-0-215) [ 1876 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-216) [ 1876 0 R /XYZ 60.307257 235.009542 0 ] (Code/Reader/:__span-0-217) [ 1876 0 R /XYZ 60.307257 221.609190 0 ] (Code/Reader/:__span-0-218) [ 1876 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-219) [ 1876 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-22) [ 1868 0 R /XYZ 60.307257 426.228030 0 ] (Code/Reader/:__span-0-220) [ 1876 0 R /XYZ 60.307257 181.408134 0 ] (Code/Reader/:__span-0-221) [ 1876 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-222) [ 1876 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-223) [ 1876 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-224) [ 1876 0 R /XYZ 60.307257 127.806726 0 ] (Code/Reader/:__span-0-225) [ 1876 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-226) [ 1876 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-227) [ 1878 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-228) [ 1878 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-229) [ 1878 0 R /XYZ 60.307257 744.222918 0 ] (Code/Reader/:__span-0-23) [ 1868 0 R /XYZ 60.307257 412.827678 0 ] (Code/Reader/:__span-0-230) [ 1878 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-231) [ 1878 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-232) [ 1878 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-233) [ 1878 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-234) [ 1878 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-235) [ 1878 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-236) [ 1878 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-237) [ 1878 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-238) [ 1878 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-239) [ 1878 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-24) [ 1868 0 R /XYZ 60.307257 399.427326 0 ] (Code/Reader/:__span-0-240) [ 1878 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-241) [ 1878 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-242) [ 1878 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-243) [ 1878 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-244) [ 1878 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-245) [ 1878 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-246) [ 1878 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-247) [ 1878 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-248) [ 1878 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-249) [ 1878 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-25) [ 1868 0 R /XYZ 60.307257 386.026974 0 ] (Code/Reader/:__span-0-250) [ 1878 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-251) [ 1878 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-252) [ 1878 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-253) [ 1878 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-254) [ 1878 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-255) [ 1878 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-256) [ 1878 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-257) [ 1878 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-258) [ 1878 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-259) [ 1878 0 R /XYZ 60.307257 221.609190 0 ] (Code/Reader/:__span-0-26) [ 1868 0 R /XYZ 60.307257 372.626622 0 ] (Code/Reader/:__span-0-260) [ 1878 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-261) [ 1878 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-262) [ 1878 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-263) [ 1878 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-264) [ 1878 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-265) [ 1878 0 R /XYZ 60.307257 101.006022 0 ] (Code/Reader/:__span-0-266) [ 1878 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-267) [ 1880 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-268) [ 1880 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-269) [ 1880 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-27) [ 1868 0 R /XYZ 60.307257 345.825918 0 ] (Code/Reader/:__span-0-270) [ 1880 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-271) [ 1880 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-272) [ 1880 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-273) [ 1880 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-274) [ 1880 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-275) [ 1880 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-276) [ 1880 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-277) [ 1880 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-278) [ 1880 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-279) [ 1880 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-28) [ 1868 0 R /XYZ 60.307257 332.425566 0 ] (Code/Reader/:__span-0-280) [ 1880 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-281) [ 1880 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-282) [ 1880 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-283) [ 1880 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-284) [ 1880 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-285) [ 1880 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-286) [ 1880 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-287) [ 1880 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-288) [ 1880 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-289) [ 1880 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-29) [ 1868 0 R /XYZ 60.307257 319.025214 0 ] (Code/Reader/:__span-0-290) [ 1880 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-291) [ 1880 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-292) [ 1880 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-293) [ 1880 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-294) [ 1880 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-295) [ 1880 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-296) [ 1880 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-297) [ 1880 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-298) [ 1880 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-299) [ 1880 0 R /XYZ 60.307257 235.009542 0 ] (Code/Reader/:__span-0-3) [ 1868 0 R /XYZ 60.307257 680.834718 0 ] (Code/Reader/:__span-0-30) [ 1868 0 R /XYZ 60.307257 292.224510 0 ] (Code/Reader/:__span-0-300) [ 1880 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-301) [ 1880 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-302) [ 1880 0 R /XYZ 60.307257 181.408134 0 ] (Code/Reader/:__span-0-303) [ 1880 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-304) [ 1880 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-305) [ 1880 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-306) [ 1880 0 R /XYZ 60.307257 127.806726 0 ] (Code/Reader/:__span-0-307) [ 1880 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-308) [ 1880 0 R /XYZ 60.307257 101.006022 0 ] (Code/Reader/:__span-0-309) [ 1880 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-31) [ 1868 0 R /XYZ 60.307257 278.824158 0 ] (Code/Reader/:__span-0-310) [ 1882 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-311) [ 1882 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-312) [ 1882 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-313) [ 1882 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-314) [ 1882 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-315) [ 1882 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-316) [ 1882 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-317) [ 1882 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-318) [ 1882 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-319) [ 1882 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-32) [ 1868 0 R /XYZ 60.307257 265.423806 0 ] (Code/Reader/:__span-0-320) [ 1882 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-321) [ 1882 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-322) [ 1882 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-323) [ 1882 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-324) [ 1882 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-325) [ 1882 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-326) [ 1882 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-327) [ 1882 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-328) [ 1882 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-329) [ 1882 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-33) [ 1868 0 R /XYZ 60.307257 252.023454 0 ] (Code/Reader/:__span-0-330) [ 1882 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-331) [ 1882 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-332) [ 1882 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-333) [ 1882 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-334) [ 1882 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-335) [ 1882 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-336) [ 1882 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-337) [ 1882 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-338) [ 1882 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-34) [ 1868 0 R /XYZ 60.307257 238.623102 0 ] (Code/Reader/:__span-0-35) [ 1868 0 R /XYZ 60.307257 225.222750 0 ] (Code/Reader/:__span-0-36) [ 1868 0 R /XYZ 60.307257 211.822398 0 ] (Code/Reader/:__span-0-37) [ 1868 0 R /XYZ 60.307257 198.422046 0 ] (Code/Reader/:__span-0-38) [ 1868 0 R /XYZ 60.307257 171.621342 0 ] (Code/Reader/:__span-0-39) [ 1868 0 R /XYZ 60.307257 158.220990 0 ] (Code/Reader/:__span-0-4) [ 1868 0 R /XYZ 60.307257 667.434366 0 ] (Code/Reader/:__span-0-40) [ 1868 0 R /XYZ 60.307257 131.420286 0 ] (Code/Reader/:__span-0-41) [ 1868 0 R /XYZ 60.307257 104.619582 0 ] (Code/Reader/:__span-0-42) [ 1868 0 R /XYZ 60.307257 91.219230 0 ] (Code/Reader/:__span-0-43) [ 1870 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-44) [ 1870 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-45) [ 1870 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-46) [ 1870 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-47) [ 1870 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-48) [ 1870 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-49) [ 1870 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-5) [ 1868 0 R /XYZ 60.307257 654.034014 0 ] (Code/Reader/:__span-0-50) [ 1870 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-51) [ 1870 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-52) [ 1870 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-53) [ 1870 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-54) [ 1870 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-55) [ 1870 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-56) [ 1870 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-57) [ 1870 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-58) [ 1870 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-59) [ 1870 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-6) [ 1868 0 R /XYZ 60.307257 640.633662 0 ] (Code/Reader/:__span-0-60) [ 1870 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-61) [ 1870 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-62) [ 1870 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-63) [ 1870 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-64) [ 1870 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-65) [ 1870 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-66) [ 1870 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-67) [ 1870 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-68) [ 1870 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-69) [ 1870 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-7) [ 1868 0 R /XYZ 60.307257 627.233310 0 ] (Code/Reader/:__span-0-70) [ 1870 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-71) [ 1870 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-72) [ 1870 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-73) [ 1870 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-74) [ 1870 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-75) [ 1870 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-76) [ 1870 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-77) [ 1870 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-78) [ 1870 0 R /XYZ 60.307257 261.810246 0 ] (Code/Reader/:__span-0-79) [ 1870 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-8) [ 1868 0 R /XYZ 60.307257 613.832958 0 ] (Code/Reader/:__span-0-80) [ 1870 0 R /XYZ 60.307257 221.609190 0 ] (Code/Reader/:__span-0-81) [ 1870 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-82) [ 1870 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-83) [ 1870 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-84) [ 1870 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-85) [ 1870 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-86) [ 1870 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-87) [ 1872 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-88) [ 1872 0 R /XYZ 60.307257 744.222918 0 ] (Code/Reader/:__span-0-89) [ 1872 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-9) [ 1868 0 R /XYZ 60.307257 600.432606 0 ] (Code/Reader/:__span-0-90) [ 1872 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-91) [ 1872 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-92) [ 1872 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-93) [ 1872 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-94) [ 1872 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-95) [ 1872 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-96) [ 1872 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-97) [ 1872 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-98) [ 1872 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-99) [ 1872 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:readercs) [ 1868 0 R /XYZ 39.386457 747.563622 0 ] (Code/Settings.Designer/:) [ 1756 0 R /XYZ 39.386457 747.563622 0 ] (Code/Settings.Designer/:__span-0-1) [ 1756 0 R /XYZ 60.307257 707.635422 0 ] (Code/Settings.Designer/:__span-0-10) [ 1756 0 R /XYZ 60.307257 587.032254 0 ] (Code/Settings.Designer/:__span-0-100) [ 1760 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-101) [ 1760 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-102) [ 1760 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-103) [ 1760 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-104) [ 1760 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-105) [ 1760 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-106) [ 1760 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-107) [ 1760 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-108) [ 1760 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-109) [ 1760 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-11) [ 1756 0 R /XYZ 60.307257 573.631902 0 ] (Code/Settings.Designer/:__span-0-110) [ 1760 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-111) [ 1760 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-112) [ 1760 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-113) [ 1760 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-114) [ 1760 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-115) [ 1760 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-116) [ 1760 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-117) [ 1760 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-118) [ 1760 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-119) [ 1760 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-12) [ 1756 0 R /XYZ 60.307257 560.231550 0 ] (Code/Settings.Designer/:__span-0-120) [ 1760 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-121) [ 1760 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-122) [ 1760 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-123) [ 1760 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-124) [ 1760 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-125) [ 1760 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-126) [ 1760 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-127) [ 1760 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-128) [ 1760 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-129) [ 1760 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-13) [ 1756 0 R /XYZ 60.307257 546.831198 0 ] (Code/Settings.Designer/:__span-0-130) [ 1760 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-131) [ 1760 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-132) [ 1760 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-133) [ 1762 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-134) [ 1762 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-135) [ 1762 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-136) [ 1762 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-137) [ 1762 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-138) [ 1762 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-139) [ 1762 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-14) [ 1756 0 R /XYZ 60.307257 520.030494 0 ] (Code/Settings.Designer/:__span-0-140) [ 1762 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-141) [ 1762 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-142) [ 1762 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-143) [ 1762 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-144) [ 1762 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-145) [ 1762 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-146) [ 1762 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-147) [ 1762 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-148) [ 1762 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-149) [ 1762 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-15) [ 1756 0 R /XYZ 60.307257 506.630142 0 ] (Code/Settings.Designer/:__span-0-150) [ 1762 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-151) [ 1762 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-152) [ 1762 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-153) [ 1762 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-154) [ 1762 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-155) [ 1762 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-156) [ 1762 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-157) [ 1762 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-158) [ 1762 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-159) [ 1762 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-16) [ 1756 0 R /XYZ 60.307257 493.229790 0 ] (Code/Settings.Designer/:__span-0-160) [ 1762 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-161) [ 1762 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-162) [ 1762 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-163) [ 1762 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-164) [ 1762 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-165) [ 1762 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-166) [ 1762 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-167) [ 1762 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-168) [ 1762 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-169) [ 1762 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-17) [ 1756 0 R /XYZ 60.307257 479.829438 0 ] (Code/Settings.Designer/:__span-0-170) [ 1762 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-171) [ 1762 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-172) [ 1762 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-173) [ 1762 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-174) [ 1764 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-175) [ 1764 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-176) [ 1764 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-177) [ 1764 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-178) [ 1764 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-179) [ 1764 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-18) [ 1756 0 R /XYZ 60.307257 466.429086 0 ] (Code/Settings.Designer/:__span-0-180) [ 1764 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-181) [ 1764 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-182) [ 1764 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-183) [ 1764 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-184) [ 1764 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-185) [ 1764 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-186) [ 1764 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-187) [ 1764 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-188) [ 1764 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-189) [ 1764 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-19) [ 1756 0 R /XYZ 60.307257 453.028734 0 ] (Code/Settings.Designer/:__span-0-190) [ 1764 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-191) [ 1764 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-192) [ 1764 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-193) [ 1764 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-194) [ 1764 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-195) [ 1764 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-196) [ 1764 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-197) [ 1764 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-198) [ 1764 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-199) [ 1764 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-2) [ 1756 0 R /XYZ 60.307257 694.235070 0 ] (Code/Settings.Designer/:__span-0-20) [ 1756 0 R /XYZ 60.307257 439.628382 0 ] (Code/Settings.Designer/:__span-0-200) [ 1764 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-201) [ 1764 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-202) [ 1764 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-203) [ 1764 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-204) [ 1764 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-205) [ 1764 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-206) [ 1764 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-207) [ 1764 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-208) [ 1764 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-209) [ 1764 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-21) [ 1756 0 R /XYZ 60.307257 426.228030 0 ] (Code/Settings.Designer/:__span-0-210) [ 1764 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-211) [ 1764 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-212) [ 1764 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-213) [ 1764 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-214) [ 1764 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-215) [ 1764 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-216) [ 1764 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-217) [ 1764 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-218) [ 1764 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-219) [ 1766 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-22) [ 1756 0 R /XYZ 60.307257 412.827678 0 ] (Code/Settings.Designer/:__span-0-220) [ 1766 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-221) [ 1766 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-222) [ 1766 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-223) [ 1766 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-224) [ 1766 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-225) [ 1766 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-226) [ 1766 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-227) [ 1766 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-228) [ 1766 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-229) [ 1766 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-23) [ 1756 0 R /XYZ 60.307257 399.427326 0 ] (Code/Settings.Designer/:__span-0-230) [ 1766 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-231) [ 1766 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-232) [ 1766 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-233) [ 1766 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-234) [ 1766 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-235) [ 1766 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-236) [ 1766 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-237) [ 1766 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-238) [ 1766 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-239) [ 1766 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-24) [ 1756 0 R /XYZ 60.307257 386.026974 0 ] (Code/Settings.Designer/:__span-0-240) [ 1766 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-241) [ 1766 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-242) [ 1766 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-243) [ 1766 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-244) [ 1766 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-245) [ 1766 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-246) [ 1766 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-247) [ 1766 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-248) [ 1766 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-249) [ 1766 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-25) [ 1756 0 R /XYZ 60.307257 372.626622 0 ] (Code/Settings.Designer/:__span-0-250) [ 1766 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-251) [ 1766 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-252) [ 1766 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-253) [ 1766 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-254) [ 1766 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-255) [ 1766 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-256) [ 1766 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-257) [ 1766 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-258) [ 1766 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-259) [ 1766 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-26) [ 1756 0 R /XYZ 60.307257 359.226270 0 ] (Code/Settings.Designer/:__span-0-260) [ 1766 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-261) [ 1766 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-262) [ 1766 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-263) [ 1768 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-264) [ 1768 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-265) [ 1768 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-266) [ 1768 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-267) [ 1768 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-268) [ 1768 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-269) [ 1768 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-27) [ 1756 0 R /XYZ 60.307257 345.825918 0 ] (Code/Settings.Designer/:__span-0-270) [ 1768 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-271) [ 1768 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-272) [ 1768 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-273) [ 1768 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-274) [ 1768 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-275) [ 1768 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-276) [ 1768 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-277) [ 1768 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-278) [ 1768 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-279) [ 1768 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-28) [ 1756 0 R /XYZ 60.307257 332.425566 0 ] (Code/Settings.Designer/:__span-0-280) [ 1768 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-281) [ 1768 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-282) [ 1768 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-283) [ 1768 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-284) [ 1768 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-285) [ 1768 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-286) [ 1768 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-287) [ 1768 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-288) [ 1768 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-289) [ 1768 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-29) [ 1756 0 R /XYZ 60.307257 319.025214 0 ] (Code/Settings.Designer/:__span-0-290) [ 1768 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-291) [ 1768 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-292) [ 1768 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-293) [ 1768 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-294) [ 1768 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-295) [ 1768 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-296) [ 1768 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-297) [ 1768 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-298) [ 1768 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-299) [ 1768 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-3) [ 1756 0 R /XYZ 60.307257 680.834718 0 ] (Code/Settings.Designer/:__span-0-30) [ 1756 0 R /XYZ 60.307257 305.624862 0 ] (Code/Settings.Designer/:__span-0-300) [ 1768 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-301) [ 1768 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-302) [ 1768 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-303) [ 1768 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-304) [ 1768 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-305) [ 1768 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-306) [ 1768 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-307) [ 1768 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-308) [ 1768 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-309) [ 1770 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-31) [ 1756 0 R /XYZ 60.307257 292.224510 0 ] (Code/Settings.Designer/:__span-0-310) [ 1770 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-311) [ 1770 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-312) [ 1770 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-313) [ 1770 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-314) [ 1770 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-315) [ 1770 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-316) [ 1770 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-317) [ 1770 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-318) [ 1770 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-319) [ 1770 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-32) [ 1756 0 R /XYZ 60.307257 278.824158 0 ] (Code/Settings.Designer/:__span-0-320) [ 1770 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-321) [ 1770 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-322) [ 1770 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-323) [ 1770 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-324) [ 1770 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-325) [ 1770 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-326) [ 1770 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-327) [ 1770 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-328) [ 1770 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-329) [ 1770 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-33) [ 1756 0 R /XYZ 60.307257 265.423806 0 ] (Code/Settings.Designer/:__span-0-330) [ 1770 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-331) [ 1770 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-332) [ 1770 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-333) [ 1770 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-334) [ 1770 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-335) [ 1770 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-336) [ 1770 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-337) [ 1770 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-338) [ 1770 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-339) [ 1770 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-34) [ 1756 0 R /XYZ 60.307257 252.023454 0 ] (Code/Settings.Designer/:__span-0-340) [ 1770 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-341) [ 1770 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-342) [ 1770 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-343) [ 1770 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-344) [ 1770 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-345) [ 1770 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-346) [ 1770 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-347) [ 1770 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-348) [ 1770 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-349) [ 1770 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-35) [ 1756 0 R /XYZ 60.307257 238.623102 0 ] (Code/Settings.Designer/:__span-0-350) [ 1772 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-351) [ 1772 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-352) [ 1772 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-353) [ 1772 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-354) [ 1772 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-355) [ 1772 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-356) [ 1772 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-357) [ 1772 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-358) [ 1772 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-359) [ 1772 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-36) [ 1756 0 R /XYZ 60.307257 225.222750 0 ] (Code/Settings.Designer/:__span-0-360) [ 1772 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-361) [ 1772 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-362) [ 1772 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-363) [ 1772 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-364) [ 1772 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-365) [ 1772 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-366) [ 1772 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-367) [ 1772 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-368) [ 1772 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-369) [ 1772 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-37) [ 1756 0 R /XYZ 60.307257 211.822398 0 ] (Code/Settings.Designer/:__span-0-370) [ 1772 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-371) [ 1772 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-372) [ 1772 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-373) [ 1772 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-374) [ 1772 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-375) [ 1772 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-376) [ 1772 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-377) [ 1772 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-378) [ 1772 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-379) [ 1772 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-38) [ 1756 0 R /XYZ 60.307257 198.422046 0 ] (Code/Settings.Designer/:__span-0-380) [ 1772 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-381) [ 1772 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-382) [ 1772 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-383) [ 1772 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-384) [ 1772 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-385) [ 1772 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-386) [ 1772 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-387) [ 1772 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-388) [ 1772 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-389) [ 1772 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-39) [ 1756 0 R /XYZ 60.307257 185.021694 0 ] (Code/Settings.Designer/:__span-0-390) [ 1772 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-391) [ 1772 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-392) [ 1772 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-393) [ 1774 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-394) [ 1774 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-395) [ 1774 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-396) [ 1774 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-397) [ 1774 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-398) [ 1774 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-399) [ 1774 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-4) [ 1756 0 R /XYZ 60.307257 667.434366 0 ] (Code/Settings.Designer/:__span-0-40) [ 1756 0 R /XYZ 60.307257 171.621342 0 ] (Code/Settings.Designer/:__span-0-400) [ 1774 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-401) [ 1774 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-402) [ 1774 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-403) [ 1774 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-404) [ 1774 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-405) [ 1774 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-406) [ 1774 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-407) [ 1774 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-408) [ 1774 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-409) [ 1774 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-41) [ 1756 0 R /XYZ 60.307257 158.220990 0 ] (Code/Settings.Designer/:__span-0-410) [ 1774 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-411) [ 1774 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-412) [ 1774 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-413) [ 1774 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-414) [ 1774 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-415) [ 1774 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-416) [ 1774 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-417) [ 1774 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-418) [ 1774 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-419) [ 1774 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-42) [ 1756 0 R /XYZ 60.307257 144.820638 0 ] (Code/Settings.Designer/:__span-0-420) [ 1774 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-421) [ 1774 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-422) [ 1774 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-423) [ 1774 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-424) [ 1774 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-425) [ 1774 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-426) [ 1774 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-427) [ 1774 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-428) [ 1774 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-429) [ 1774 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-43) [ 1756 0 R /XYZ 60.307257 131.420286 0 ] (Code/Settings.Designer/:__span-0-430) [ 1774 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-431) [ 1774 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-432) [ 1774 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-433) [ 1774 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-434) [ 1774 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-435) [ 1774 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-436) [ 1774 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-437) [ 1776 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-438) [ 1776 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-439) [ 1776 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-44) [ 1756 0 R /XYZ 60.307257 118.019934 0 ] (Code/Settings.Designer/:__span-0-440) [ 1776 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-441) [ 1776 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-442) [ 1776 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-443) [ 1776 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-444) [ 1776 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-445) [ 1776 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-446) [ 1776 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-447) [ 1776 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-448) [ 1776 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-449) [ 1776 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-45) [ 1756 0 R /XYZ 60.307257 104.619582 0 ] (Code/Settings.Designer/:__span-0-450) [ 1776 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-451) [ 1776 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-452) [ 1776 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-453) [ 1776 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-454) [ 1776 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-455) [ 1776 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-456) [ 1776 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-457) [ 1776 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-458) [ 1776 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-459) [ 1776 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-46) [ 1756 0 R /XYZ 60.307257 91.219230 0 ] (Code/Settings.Designer/:__span-0-460) [ 1776 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-461) [ 1776 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-462) [ 1776 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-463) [ 1776 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-464) [ 1776 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-465) [ 1776 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-466) [ 1776 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-467) [ 1776 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-468) [ 1776 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-469) [ 1776 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-47) [ 1758 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-470) [ 1776 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-471) [ 1776 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-472) [ 1776 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-473) [ 1776 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-474) [ 1776 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-475) [ 1776 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-476) [ 1776 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-477) [ 1776 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-478) [ 1776 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-479) [ 1776 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-48) [ 1758 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-480) [ 1776 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-481) [ 1776 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-482) [ 1776 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-483) [ 1776 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-484) [ 1776 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-485) [ 1778 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-486) [ 1778 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-487) [ 1778 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-488) [ 1778 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-489) [ 1778 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-49) [ 1758 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-490) [ 1778 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-491) [ 1778 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-492) [ 1778 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-493) [ 1778 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-494) [ 1778 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-5) [ 1756 0 R /XYZ 60.307257 654.034014 0 ] (Code/Settings.Designer/:__span-0-50) [ 1758 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-51) [ 1758 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-52) [ 1758 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-53) [ 1758 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-54) [ 1758 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-55) [ 1758 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-56) [ 1758 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-57) [ 1758 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-58) [ 1758 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-59) [ 1758 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-6) [ 1756 0 R /XYZ 60.307257 640.633662 0 ] (Code/Settings.Designer/:__span-0-60) [ 1758 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-61) [ 1758 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-62) [ 1758 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-63) [ 1758 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-64) [ 1758 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-65) [ 1758 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-66) [ 1758 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-67) [ 1758 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-68) [ 1758 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-69) [ 1758 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-7) [ 1756 0 R /XYZ 60.307257 627.233310 0 ] (Code/Settings.Designer/:__span-0-70) [ 1758 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-71) [ 1758 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-72) [ 1758 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-73) [ 1758 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-74) [ 1758 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-75) [ 1758 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-76) [ 1758 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-77) [ 1758 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-78) [ 1758 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-79) [ 1758 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-8) [ 1756 0 R /XYZ 60.307257 613.832958 0 ] (Code/Settings.Designer/:__span-0-80) [ 1758 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-81) [ 1758 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-82) [ 1758 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-83) [ 1758 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-84) [ 1758 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-85) [ 1758 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-86) [ 1758 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-87) [ 1758 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-88) [ 1758 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-89) [ 1758 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-9) [ 1756 0 R /XYZ 60.307257 600.432606 0 ] (Code/Settings.Designer/:__span-0-90) [ 1758 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-91) [ 1758 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-92) [ 1758 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-93) [ 1760 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-94) [ 1760 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-95) [ 1760 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-96) [ 1760 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-97) [ 1760 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-98) [ 1760 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-99) [ 1760 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:settingsdesignercs) [ 1756 0 R /XYZ 39.386457 747.563622 0 ] (Code/Settings/:) [ 1884 0 R /XYZ 39.386457 747.563622 0 ] (Code/Settings/:__span-0-1) [ 1884 0 R /XYZ 60.307257 707.635422 0 ] (Code/Settings/:__span-0-10) [ 1884 0 R /XYZ 60.307257 587.032254 0 ] (Code/Settings/:__span-0-100) [ 1888 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-101) [ 1888 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-102) [ 1888 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-103) [ 1888 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-104) [ 1888 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-105) [ 1888 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-106) [ 1888 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-107) [ 1888 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-108) [ 1888 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-109) [ 1888 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-11) [ 1884 0 R /XYZ 60.307257 573.631902 0 ] (Code/Settings/:__span-0-110) [ 1888 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-111) [ 1888 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-112) [ 1888 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-113) [ 1888 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-114) [ 1888 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-115) [ 1888 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-116) [ 1888 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-117) [ 1888 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-118) [ 1888 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-119) [ 1888 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-12) [ 1884 0 R /XYZ 60.307257 560.231550 0 ] (Code/Settings/:__span-0-120) [ 1888 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-121) [ 1888 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-122) [ 1888 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-123) [ 1888 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-124) [ 1888 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-125) [ 1888 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-126) [ 1888 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-127) [ 1888 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-128) [ 1888 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-129) [ 1888 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-13) [ 1884 0 R /XYZ 60.307257 546.831198 0 ] (Code/Settings/:__span-0-130) [ 1888 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-131) [ 1888 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-132) [ 1888 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-133) [ 1888 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-134) [ 1888 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-135) [ 1888 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-136) [ 1888 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-137) [ 1888 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-138) [ 1888 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-139) [ 1890 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-14) [ 1884 0 R /XYZ 60.307257 533.430846 0 ] (Code/Settings/:__span-0-140) [ 1890 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-141) [ 1890 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-142) [ 1890 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-143) [ 1890 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-144) [ 1890 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-145) [ 1890 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-146) [ 1890 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-147) [ 1890 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-148) [ 1890 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-149) [ 1890 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-15) [ 1884 0 R /XYZ 60.307257 520.030494 0 ] (Code/Settings/:__span-0-150) [ 1890 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-151) [ 1890 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-152) [ 1890 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-153) [ 1890 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-154) [ 1890 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-155) [ 1890 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-156) [ 1890 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-157) [ 1890 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-158) [ 1890 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-159) [ 1890 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-16) [ 1884 0 R /XYZ 60.307257 506.630142 0 ] (Code/Settings/:__span-0-160) [ 1890 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-161) [ 1890 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-162) [ 1890 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-163) [ 1890 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-164) [ 1890 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-165) [ 1890 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-166) [ 1890 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-167) [ 1890 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-168) [ 1890 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-169) [ 1890 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-17) [ 1884 0 R /XYZ 60.307257 493.229790 0 ] (Code/Settings/:__span-0-170) [ 1890 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-171) [ 1890 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-172) [ 1890 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-173) [ 1890 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-174) [ 1890 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-175) [ 1890 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-176) [ 1890 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-177) [ 1890 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-178) [ 1890 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-179) [ 1890 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-18) [ 1884 0 R /XYZ 60.307257 479.829438 0 ] (Code/Settings/:__span-0-180) [ 1890 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-181) [ 1890 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-182) [ 1890 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-183) [ 1890 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-184) [ 1890 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-185) [ 1890 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-186) [ 1890 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-187) [ 1890 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-188) [ 1890 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-189) [ 1890 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-19) [ 1884 0 R /XYZ 60.307257 466.429086 0 ] (Code/Settings/:__span-0-190) [ 1890 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-191) [ 1892 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-192) [ 1892 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-193) [ 1892 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-194) [ 1892 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-195) [ 1892 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-196) [ 1892 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-197) [ 1892 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-198) [ 1892 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-199) [ 1892 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-2) [ 1884 0 R /XYZ 60.307257 694.235070 0 ] (Code/Settings/:__span-0-20) [ 1884 0 R /XYZ 60.307257 453.028734 0 ] (Code/Settings/:__span-0-200) [ 1892 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-201) [ 1892 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-202) [ 1892 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-203) [ 1892 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-204) [ 1892 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-205) [ 1892 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-206) [ 1892 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-207) [ 1892 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-208) [ 1892 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-209) [ 1892 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-21) [ 1884 0 R /XYZ 60.307257 439.628382 0 ] (Code/Settings/:__span-0-210) [ 1892 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-211) [ 1892 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-212) [ 1892 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-213) [ 1892 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-214) [ 1892 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-215) [ 1892 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-216) [ 1892 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-217) [ 1892 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-218) [ 1892 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-219) [ 1892 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-22) [ 1884 0 R /XYZ 60.307257 426.228030 0 ] (Code/Settings/:__span-0-220) [ 1892 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-221) [ 1892 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-222) [ 1892 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-223) [ 1892 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-224) [ 1892 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-225) [ 1892 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-226) [ 1892 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-227) [ 1892 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-228) [ 1892 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-229) [ 1892 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-23) [ 1884 0 R /XYZ 60.307257 412.827678 0 ] (Code/Settings/:__span-0-230) [ 1892 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-231) [ 1892 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-232) [ 1892 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-233) [ 1892 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-234) [ 1892 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-235) [ 1892 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-236) [ 1892 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-237) [ 1892 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-238) [ 1894 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-239) [ 1894 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-24) [ 1884 0 R /XYZ 60.307257 399.427326 0 ] (Code/Settings/:__span-0-240) [ 1894 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-241) [ 1894 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-242) [ 1894 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-243) [ 1894 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-244) [ 1894 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-245) [ 1894 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-246) [ 1894 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-247) [ 1894 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-248) [ 1894 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-249) [ 1894 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-25) [ 1884 0 R /XYZ 60.307257 386.026974 0 ] (Code/Settings/:__span-0-250) [ 1894 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-251) [ 1894 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-252) [ 1894 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-253) [ 1894 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-254) [ 1894 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-255) [ 1894 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-256) [ 1894 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-257) [ 1894 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-258) [ 1894 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-259) [ 1894 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-26) [ 1884 0 R /XYZ 60.307257 372.626622 0 ] (Code/Settings/:__span-0-260) [ 1894 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-261) [ 1894 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-262) [ 1894 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-263) [ 1894 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-264) [ 1894 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-265) [ 1894 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-266) [ 1894 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-267) [ 1894 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-268) [ 1894 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-269) [ 1894 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-27) [ 1884 0 R /XYZ 60.307257 359.226270 0 ] (Code/Settings/:__span-0-270) [ 1894 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-271) [ 1894 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-272) [ 1894 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-273) [ 1894 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-274) [ 1894 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-275) [ 1894 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-276) [ 1894 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-277) [ 1894 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-278) [ 1894 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-279) [ 1894 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-28) [ 1884 0 R /XYZ 60.307257 345.825918 0 ] (Code/Settings/:__span-0-280) [ 1894 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-281) [ 1894 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-282) [ 1894 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-283) [ 1894 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-284) [ 1894 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-285) [ 1894 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-286) [ 1896 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-287) [ 1896 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-288) [ 1896 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-289) [ 1896 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-29) [ 1884 0 R /XYZ 60.307257 332.425566 0 ] (Code/Settings/:__span-0-290) [ 1896 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-291) [ 1896 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-292) [ 1896 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-293) [ 1896 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-294) [ 1896 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-295) [ 1896 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-296) [ 1896 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-297) [ 1896 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-298) [ 1896 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-299) [ 1896 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-3) [ 1884 0 R /XYZ 60.307257 680.834718 0 ] (Code/Settings/:__span-0-30) [ 1884 0 R /XYZ 60.307257 319.025214 0 ] (Code/Settings/:__span-0-300) [ 1896 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-301) [ 1896 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-302) [ 1896 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-303) [ 1896 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-304) [ 1896 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-305) [ 1896 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-306) [ 1896 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-307) [ 1896 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-308) [ 1896 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-309) [ 1896 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-31) [ 1884 0 R /XYZ 60.307257 305.624862 0 ] (Code/Settings/:__span-0-310) [ 1896 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-311) [ 1896 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-312) [ 1896 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-313) [ 1896 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-314) [ 1896 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-315) [ 1896 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-316) [ 1896 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-317) [ 1896 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-318) [ 1896 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-319) [ 1896 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-32) [ 1884 0 R /XYZ 60.307257 292.224510 0 ] (Code/Settings/:__span-0-320) [ 1896 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-321) [ 1896 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-322) [ 1896 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-323) [ 1896 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-324) [ 1896 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-325) [ 1896 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-326) [ 1896 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-327) [ 1896 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-328) [ 1896 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-329) [ 1896 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-33) [ 1884 0 R /XYZ 60.307257 278.824158 0 ] (Code/Settings/:__span-0-330) [ 1896 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-331) [ 1896 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-332) [ 1896 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-333) [ 1896 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-334) [ 1896 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-335) [ 1898 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-336) [ 1898 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-337) [ 1898 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-338) [ 1898 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-339) [ 1898 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-34) [ 1884 0 R /XYZ 60.307257 265.423806 0 ] (Code/Settings/:__span-0-340) [ 1898 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-341) [ 1898 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-342) [ 1898 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-343) [ 1898 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-344) [ 1898 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-345) [ 1898 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-346) [ 1898 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-347) [ 1898 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-348) [ 1898 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-349) [ 1898 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-35) [ 1884 0 R /XYZ 60.307257 238.623102 0 ] (Code/Settings/:__span-0-350) [ 1898 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-351) [ 1898 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-352) [ 1898 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-353) [ 1898 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-354) [ 1898 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-355) [ 1898 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-356) [ 1898 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-357) [ 1898 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-358) [ 1898 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-359) [ 1898 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-36) [ 1884 0 R /XYZ 60.307257 211.822398 0 ] (Code/Settings/:__span-0-360) [ 1898 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-361) [ 1898 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-362) [ 1898 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-363) [ 1898 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-364) [ 1898 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-365) [ 1898 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-366) [ 1898 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-367) [ 1898 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-368) [ 1898 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-369) [ 1898 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-37) [ 1884 0 R /XYZ 60.307257 185.021694 0 ] (Code/Settings/:__span-0-370) [ 1898 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-371) [ 1898 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-372) [ 1898 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-373) [ 1898 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-374) [ 1898 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-375) [ 1898 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-376) [ 1898 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-377) [ 1898 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-378) [ 1900 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-379) [ 1900 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-38) [ 1884 0 R /XYZ 60.307257 171.621342 0 ] (Code/Settings/:__span-0-380) [ 1900 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-381) [ 1900 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-382) [ 1900 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-383) [ 1900 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-384) [ 1900 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-385) [ 1900 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-386) [ 1900 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-387) [ 1900 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-388) [ 1900 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-389) [ 1900 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-39) [ 1884 0 R /XYZ 60.307257 158.220990 0 ] (Code/Settings/:__span-0-390) [ 1900 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-391) [ 1900 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-392) [ 1900 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-393) [ 1900 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-394) [ 1900 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-395) [ 1900 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-396) [ 1900 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-397) [ 1900 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-398) [ 1900 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-399) [ 1900 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-4) [ 1884 0 R /XYZ 60.307257 667.434366 0 ] (Code/Settings/:__span-0-40) [ 1884 0 R /XYZ 60.307257 144.820638 0 ] (Code/Settings/:__span-0-400) [ 1900 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-401) [ 1900 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-402) [ 1900 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-403) [ 1900 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-404) [ 1900 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-405) [ 1900 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-406) [ 1900 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-407) [ 1900 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-408) [ 1900 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-409) [ 1900 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-41) [ 1884 0 R /XYZ 60.307257 131.420286 0 ] (Code/Settings/:__span-0-410) [ 1900 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-411) [ 1900 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-412) [ 1900 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-413) [ 1900 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-414) [ 1900 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-415) [ 1900 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-416) [ 1900 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-417) [ 1900 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-418) [ 1900 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-419) [ 1900 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-42) [ 1884 0 R /XYZ 60.307257 118.019934 0 ] (Code/Settings/:__span-0-420) [ 1900 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-421) [ 1900 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-422) [ 1900 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-423) [ 1900 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-424) [ 1900 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-425) [ 1900 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-426) [ 1900 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-427) [ 1902 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-428) [ 1902 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-429) [ 1902 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-43) [ 1884 0 R /XYZ 60.307257 104.619582 0 ] (Code/Settings/:__span-0-430) [ 1902 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-431) [ 1902 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-432) [ 1902 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-433) [ 1902 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-434) [ 1902 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-435) [ 1902 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-436) [ 1902 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-437) [ 1902 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-438) [ 1902 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-439) [ 1902 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-44) [ 1884 0 R /XYZ 60.307257 91.219230 0 ] (Code/Settings/:__span-0-440) [ 1902 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-441) [ 1902 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-442) [ 1902 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-443) [ 1902 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-444) [ 1902 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-445) [ 1902 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-446) [ 1902 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-447) [ 1902 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-448) [ 1902 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-449) [ 1902 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-45) [ 1886 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-450) [ 1902 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-451) [ 1902 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-452) [ 1902 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-453) [ 1902 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-454) [ 1902 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-455) [ 1902 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-456) [ 1902 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-457) [ 1902 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-458) [ 1902 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-459) [ 1902 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-46) [ 1886 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-460) [ 1902 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-461) [ 1902 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-462) [ 1902 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-463) [ 1902 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-464) [ 1902 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-465) [ 1902 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-466) [ 1902 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-467) [ 1902 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-468) [ 1902 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-469) [ 1902 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-47) [ 1886 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-470) [ 1902 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-471) [ 1902 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-472) [ 1904 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-473) [ 1904 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-474) [ 1904 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-475) [ 1904 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-476) [ 1904 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-477) [ 1904 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-48) [ 1886 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-49) [ 1886 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-5) [ 1884 0 R /XYZ 60.307257 654.034014 0 ] (Code/Settings/:__span-0-50) [ 1886 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-51) [ 1886 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-52) [ 1886 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-53) [ 1886 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-54) [ 1886 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-55) [ 1886 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-56) [ 1886 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-57) [ 1886 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-58) [ 1886 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-59) [ 1886 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-6) [ 1884 0 R /XYZ 60.307257 640.633662 0 ] (Code/Settings/:__span-0-60) [ 1886 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-61) [ 1886 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-62) [ 1886 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-63) [ 1886 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-64) [ 1886 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-65) [ 1886 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-66) [ 1886 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-67) [ 1886 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-68) [ 1886 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-69) [ 1886 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-7) [ 1884 0 R /XYZ 60.307257 627.233310 0 ] (Code/Settings/:__span-0-70) [ 1886 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-71) [ 1886 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-72) [ 1886 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-73) [ 1886 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-74) [ 1886 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-75) [ 1886 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-76) [ 1886 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-77) [ 1886 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-78) [ 1886 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-79) [ 1886 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-8) [ 1884 0 R /XYZ 60.307257 613.832958 0 ] (Code/Settings/:__span-0-80) [ 1886 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-81) [ 1886 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-82) [ 1886 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-83) [ 1886 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-84) [ 1886 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-85) [ 1886 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-86) [ 1886 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-87) [ 1886 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-88) [ 1888 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-89) [ 1888 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-9) [ 1884 0 R /XYZ 60.307257 600.432606 0 ] (Code/Settings/:__span-0-90) [ 1888 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-91) [ 1888 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-92) [ 1888 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-93) [ 1888 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-94) [ 1888 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-95) [ 1888 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-96) [ 1888 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-97) [ 1888 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-98) [ 1888 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-99) [ 1888 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:settingscs) [ 1884 0 R /XYZ 39.386457 747.563622 0 ] (Code/SqliteStorage/:) [ 1780 0 R /XYZ 39.386457 747.563622 0 ] (Code/SqliteStorage/:__span-0-1) [ 1780 0 R /XYZ 60.307257 707.635422 0 ] (Code/SqliteStorage/:__span-0-10) [ 1780 0 R /XYZ 60.307257 587.032254 0 ] (Code/SqliteStorage/:__span-0-100) [ 1784 0 R /XYZ 60.307257 704.021862 0 ] (Code/SqliteStorage/:__span-0-101) [ 1784 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-102) [ 1784 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-103) [ 1784 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-104) [ 1784 0 R /XYZ 60.307257 650.420454 0 ] (Code/SqliteStorage/:__span-0-105) [ 1784 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-106) [ 1784 0 R /XYZ 60.307257 623.619750 0 ] (Code/SqliteStorage/:__span-0-107) [ 1784 0 R /XYZ 60.307257 610.219398 0 ] (Code/SqliteStorage/:__span-0-108) [ 1784 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-109) [ 1784 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-11) [ 1780 0 R /XYZ 60.307257 573.631902 0 ] (Code/SqliteStorage/:__span-0-110) [ 1784 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-111) [ 1784 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-112) [ 1784 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-113) [ 1784 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-114) [ 1784 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-115) [ 1784 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-116) [ 1784 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-117) [ 1784 0 R /XYZ 60.307257 462.815526 0 ] (Code/SqliteStorage/:__span-0-118) [ 1784 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-119) [ 1784 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-12) [ 1780 0 R /XYZ 60.307257 560.231550 0 ] (Code/SqliteStorage/:__span-0-120) [ 1784 0 R /XYZ 60.307257 409.214118 0 ] (Code/SqliteStorage/:__span-0-121) [ 1784 0 R /XYZ 60.307257 395.813766 0 ] (Code/SqliteStorage/:__span-0-122) [ 1784 0 R /XYZ 60.307257 382.413414 0 ] (Code/SqliteStorage/:__span-0-123) [ 1784 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-124) [ 1784 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-125) [ 1784 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-126) [ 1784 0 R /XYZ 60.307257 328.812006 0 ] (Code/SqliteStorage/:__span-0-127) [ 1784 0 R /XYZ 60.307257 315.411654 0 ] (Code/SqliteStorage/:__span-0-128) [ 1784 0 R /XYZ 60.307257 302.011302 0 ] (Code/SqliteStorage/:__span-0-129) [ 1784 0 R /XYZ 60.307257 288.610950 0 ] (Code/SqliteStorage/:__span-0-13) [ 1780 0 R /XYZ 60.307257 546.831198 0 ] (Code/SqliteStorage/:__span-0-130) [ 1784 0 R /XYZ 60.307257 275.210598 0 ] (Code/SqliteStorage/:__span-0-131) [ 1784 0 R /XYZ 60.307257 261.810246 0 ] (Code/SqliteStorage/:__span-0-132) [ 1784 0 R /XYZ 60.307257 248.409894 0 ] (Code/SqliteStorage/:__span-0-133) [ 1784 0 R /XYZ 60.307257 235.009542 0 ] (Code/SqliteStorage/:__span-0-134) [ 1784 0 R /XYZ 60.307257 221.609190 0 ] (Code/SqliteStorage/:__span-0-135) [ 1784 0 R /XYZ 60.307257 208.208838 0 ] (Code/SqliteStorage/:__span-0-136) [ 1784 0 R /XYZ 60.307257 194.808486 0 ] (Code/SqliteStorage/:__span-0-137) [ 1784 0 R /XYZ 60.307257 168.007782 0 ] (Code/SqliteStorage/:__span-0-138) [ 1784 0 R /XYZ 60.307257 154.607430 0 ] (Code/SqliteStorage/:__span-0-139) [ 1784 0 R /XYZ 60.307257 141.207078 0 ] (Code/SqliteStorage/:__span-0-14) [ 1780 0 R /XYZ 60.307257 533.430846 0 ] (Code/SqliteStorage/:__span-0-140) [ 1784 0 R /XYZ 60.307257 127.806726 0 ] (Code/SqliteStorage/:__span-0-141) [ 1784 0 R /XYZ 60.307257 114.406374 0 ] (Code/SqliteStorage/:__span-0-142) [ 1784 0 R /XYZ 60.307257 101.006022 0 ] (Code/SqliteStorage/:__span-0-143) [ 1786 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-144) [ 1786 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-145) [ 1786 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-146) [ 1786 0 R /XYZ 60.307257 717.422214 0 ] (Code/SqliteStorage/:__span-0-147) [ 1786 0 R /XYZ 60.307257 704.021862 0 ] (Code/SqliteStorage/:__span-0-148) [ 1786 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-149) [ 1786 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-15) [ 1780 0 R /XYZ 60.307257 520.030494 0 ] (Code/SqliteStorage/:__span-0-150) [ 1786 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-151) [ 1786 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-152) [ 1786 0 R /XYZ 60.307257 623.619750 0 ] (Code/SqliteStorage/:__span-0-153) [ 1786 0 R /XYZ 60.307257 610.219398 0 ] (Code/SqliteStorage/:__span-0-154) [ 1786 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-155) [ 1786 0 R /XYZ 60.307257 583.418694 0 ] (Code/SqliteStorage/:__span-0-156) [ 1786 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-157) [ 1786 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-158) [ 1786 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-159) [ 1786 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-16) [ 1780 0 R /XYZ 60.307257 506.630142 0 ] (Code/SqliteStorage/:__span-0-160) [ 1786 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-161) [ 1786 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-162) [ 1786 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-163) [ 1786 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-164) [ 1786 0 R /XYZ 60.307257 462.815526 0 ] (Code/SqliteStorage/:__span-0-165) [ 1786 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-166) [ 1786 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-167) [ 1786 0 R /XYZ 60.307257 422.614470 0 ] (Code/SqliteStorage/:__span-0-168) [ 1786 0 R /XYZ 60.307257 409.214118 0 ] (Code/SqliteStorage/:__span-0-169) [ 1786 0 R /XYZ 60.307257 382.413414 0 ] (Code/SqliteStorage/:__span-0-17) [ 1780 0 R /XYZ 60.307257 493.229790 0 ] (Code/SqliteStorage/:__span-0-170) [ 1786 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-171) [ 1786 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-172) [ 1786 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-173) [ 1786 0 R /XYZ 60.307257 328.812006 0 ] (Code/SqliteStorage/:__span-0-174) [ 1786 0 R /XYZ 60.307257 315.411654 0 ] (Code/SqliteStorage/:__span-0-175) [ 1786 0 R /XYZ 60.307257 302.011302 0 ] (Code/SqliteStorage/:__span-0-176) [ 1786 0 R /XYZ 60.307257 288.610950 0 ] (Code/SqliteStorage/:__span-0-177) [ 1786 0 R /XYZ 60.307257 275.210598 0 ] (Code/SqliteStorage/:__span-0-178) [ 1786 0 R /XYZ 60.307257 261.810246 0 ] (Code/SqliteStorage/:__span-0-179) [ 1786 0 R /XYZ 60.307257 221.609190 0 ] (Code/SqliteStorage/:__span-0-18) [ 1780 0 R /XYZ 60.307257 479.829438 0 ] (Code/SqliteStorage/:__span-0-180) [ 1786 0 R /XYZ 60.307257 194.808486 0 ] (Code/SqliteStorage/:__span-0-181) [ 1786 0 R /XYZ 60.307257 181.408134 0 ] (Code/SqliteStorage/:__span-0-182) [ 1786 0 R /XYZ 60.307257 168.007782 0 ] (Code/SqliteStorage/:__span-0-183) [ 1786 0 R /XYZ 60.307257 141.207078 0 ] (Code/SqliteStorage/:__span-0-184) [ 1786 0 R /XYZ 60.307257 114.406374 0 ] (Code/SqliteStorage/:__span-0-185) [ 1786 0 R /XYZ 60.307257 101.006022 0 ] (Code/SqliteStorage/:__span-0-186) [ 1786 0 R /XYZ 60.307257 87.605670 0 ] (Code/SqliteStorage/:__span-0-187) [ 1788 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-188) [ 1788 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-189) [ 1788 0 R /XYZ 60.307257 744.222918 0 ] (Code/SqliteStorage/:__span-0-19) [ 1780 0 R /XYZ 60.307257 466.429086 0 ] (Code/SqliteStorage/:__span-0-190) [ 1788 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-191) [ 1788 0 R /XYZ 60.307257 717.422214 0 ] (Code/SqliteStorage/:__span-0-192) [ 1788 0 R /XYZ 60.307257 704.021862 0 ] (Code/SqliteStorage/:__span-0-193) [ 1788 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-194) [ 1788 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-195) [ 1788 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-196) [ 1788 0 R /XYZ 60.307257 650.420454 0 ] (Code/SqliteStorage/:__span-0-197) [ 1788 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-198) [ 1788 0 R /XYZ 60.307257 623.619750 0 ] (Code/SqliteStorage/:__span-0-199) [ 1788 0 R /XYZ 60.307257 610.219398 0 ] (Code/SqliteStorage/:__span-0-2) [ 1780 0 R /XYZ 60.307257 694.235070 0 ] (Code/SqliteStorage/:__span-0-20) [ 1780 0 R /XYZ 60.307257 453.028734 0 ] (Code/SqliteStorage/:__span-0-200) [ 1788 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-201) [ 1788 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-202) [ 1788 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-203) [ 1788 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-204) [ 1788 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-205) [ 1788 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-206) [ 1788 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-207) [ 1788 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-208) [ 1788 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-209) [ 1788 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-21) [ 1780 0 R /XYZ 60.307257 439.628382 0 ] (Code/SqliteStorage/:__span-0-210) [ 1788 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-211) [ 1788 0 R /XYZ 60.307257 422.614470 0 ] (Code/SqliteStorage/:__span-0-212) [ 1788 0 R /XYZ 60.307257 409.214118 0 ] (Code/SqliteStorage/:__span-0-213) [ 1788 0 R /XYZ 60.307257 395.813766 0 ] (Code/SqliteStorage/:__span-0-214) [ 1788 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-215) [ 1788 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-216) [ 1788 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-217) [ 1788 0 R /XYZ 60.307257 328.812006 0 ] (Code/SqliteStorage/:__span-0-218) [ 1788 0 R /XYZ 60.307257 315.411654 0 ] (Code/SqliteStorage/:__span-0-219) [ 1788 0 R /XYZ 60.307257 288.610950 0 ] (Code/SqliteStorage/:__span-0-22) [ 1780 0 R /XYZ 60.307257 426.228030 0 ] (Code/SqliteStorage/:__span-0-220) [ 1788 0 R /XYZ 60.307257 275.210598 0 ] (Code/SqliteStorage/:__span-0-221) [ 1788 0 R /XYZ 60.307257 261.810246 0 ] (Code/SqliteStorage/:__span-0-222) [ 1788 0 R /XYZ 60.307257 248.409894 0 ] (Code/SqliteStorage/:__span-0-223) [ 1788 0 R /XYZ 60.307257 235.009542 0 ] (Code/SqliteStorage/:__span-0-224) [ 1788 0 R /XYZ 60.307257 221.609190 0 ] (Code/SqliteStorage/:__span-0-225) [ 1788 0 R /XYZ 60.307257 208.208838 0 ] (Code/SqliteStorage/:__span-0-226) [ 1788 0 R /XYZ 60.307257 194.808486 0 ] (Code/SqliteStorage/:__span-0-227) [ 1788 0 R /XYZ 60.307257 168.007782 0 ] (Code/SqliteStorage/:__span-0-228) [ 1788 0 R /XYZ 60.307257 154.607430 0 ] (Code/SqliteStorage/:__span-0-229) [ 1788 0 R /XYZ 60.307257 141.207078 0 ] (Code/SqliteStorage/:__span-0-23) [ 1780 0 R /XYZ 60.307257 399.427326 0 ] (Code/SqliteStorage/:__span-0-230) [ 1788 0 R /XYZ 60.307257 127.806726 0 ] (Code/SqliteStorage/:__span-0-231) [ 1788 0 R /XYZ 60.307257 114.406374 0 ] (Code/SqliteStorage/:__span-0-232) [ 1788 0 R /XYZ 60.307257 101.006022 0 ] (Code/SqliteStorage/:__span-0-233) [ 1788 0 R /XYZ 60.307257 87.605670 0 ] (Code/SqliteStorage/:__span-0-234) [ 1790 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-235) [ 1790 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-236) [ 1790 0 R /XYZ 60.307257 744.222918 0 ] (Code/SqliteStorage/:__span-0-237) [ 1790 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-238) [ 1790 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-239) [ 1790 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-24) [ 1780 0 R /XYZ 60.307257 386.026974 0 ] (Code/SqliteStorage/:__span-0-240) [ 1790 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-241) [ 1790 0 R /XYZ 60.307257 650.420454 0 ] (Code/SqliteStorage/:__span-0-242) [ 1790 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-243) [ 1790 0 R /XYZ 60.307257 623.619750 0 ] (Code/SqliteStorage/:__span-0-244) [ 1790 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-245) [ 1790 0 R /XYZ 60.307257 583.418694 0 ] (Code/SqliteStorage/:__span-0-246) [ 1790 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-247) [ 1790 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-248) [ 1790 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-249) [ 1790 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-25) [ 1780 0 R /XYZ 60.307257 372.626622 0 ] (Code/SqliteStorage/:__span-0-250) [ 1790 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-251) [ 1790 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-252) [ 1790 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-253) [ 1790 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-254) [ 1790 0 R /XYZ 60.307257 462.815526 0 ] (Code/SqliteStorage/:__span-0-255) [ 1790 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-256) [ 1790 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-257) [ 1790 0 R /XYZ 60.307257 422.614470 0 ] (Code/SqliteStorage/:__span-0-258) [ 1790 0 R /XYZ 60.307257 395.813766 0 ] (Code/SqliteStorage/:__span-0-259) [ 1790 0 R /XYZ 60.307257 382.413414 0 ] (Code/SqliteStorage/:__span-0-26) [ 1780 0 R /XYZ 60.307257 359.226270 0 ] (Code/SqliteStorage/:__span-0-260) [ 1790 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-261) [ 1790 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-262) [ 1790 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-27) [ 1780 0 R /XYZ 60.307257 345.825918 0 ] (Code/SqliteStorage/:__span-0-28) [ 1780 0 R /XYZ 60.307257 332.425566 0 ] (Code/SqliteStorage/:__span-0-29) [ 1780 0 R /XYZ 60.307257 319.025214 0 ] (Code/SqliteStorage/:__span-0-3) [ 1780 0 R /XYZ 60.307257 680.834718 0 ] (Code/SqliteStorage/:__span-0-30) [ 1780 0 R /XYZ 60.307257 305.624862 0 ] (Code/SqliteStorage/:__span-0-31) [ 1780 0 R /XYZ 60.307257 292.224510 0 ] (Code/SqliteStorage/:__span-0-32) [ 1780 0 R /XYZ 60.307257 278.824158 0 ] (Code/SqliteStorage/:__span-0-33) [ 1780 0 R /XYZ 60.307257 265.423806 0 ] (Code/SqliteStorage/:__span-0-34) [ 1780 0 R /XYZ 60.307257 252.023454 0 ] (Code/SqliteStorage/:__span-0-35) [ 1780 0 R /XYZ 60.307257 238.623102 0 ] (Code/SqliteStorage/:__span-0-36) [ 1780 0 R /XYZ 60.307257 225.222750 0 ] (Code/SqliteStorage/:__span-0-37) [ 1780 0 R /XYZ 60.307257 211.822398 0 ] (Code/SqliteStorage/:__span-0-38) [ 1780 0 R /XYZ 60.307257 198.422046 0 ] (Code/SqliteStorage/:__span-0-39) [ 1780 0 R /XYZ 60.307257 185.021694 0 ] (Code/SqliteStorage/:__span-0-4) [ 1780 0 R /XYZ 60.307257 667.434366 0 ] (Code/SqliteStorage/:__span-0-40) [ 1780 0 R /XYZ 60.307257 171.621342 0 ] (Code/SqliteStorage/:__span-0-41) [ 1780 0 R /XYZ 60.307257 158.220990 0 ] (Code/SqliteStorage/:__span-0-42) [ 1780 0 R /XYZ 60.307257 144.820638 0 ] (Code/SqliteStorage/:__span-0-43) [ 1780 0 R /XYZ 60.307257 131.420286 0 ] (Code/SqliteStorage/:__span-0-44) [ 1780 0 R /XYZ 60.307257 118.019934 0 ] (Code/SqliteStorage/:__span-0-45) [ 1780 0 R /XYZ 60.307257 104.619582 0 ] (Code/SqliteStorage/:__span-0-46) [ 1780 0 R /XYZ 60.307257 91.219230 0 ] (Code/SqliteStorage/:__span-0-47) [ 1782 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-48) [ 1782 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-49) [ 1782 0 R /XYZ 60.307257 744.222918 0 ] (Code/SqliteStorage/:__span-0-5) [ 1780 0 R /XYZ 60.307257 654.034014 0 ] (Code/SqliteStorage/:__span-0-50) [ 1782 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-51) [ 1782 0 R /XYZ 60.307257 717.422214 0 ] (Code/SqliteStorage/:__span-0-52) [ 1782 0 R /XYZ 60.307257 704.021862 0 ] (Code/SqliteStorage/:__span-0-53) [ 1782 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-54) [ 1782 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-55) [ 1782 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-56) [ 1782 0 R /XYZ 60.307257 650.420454 0 ] (Code/SqliteStorage/:__span-0-57) [ 1782 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-58) [ 1782 0 R /XYZ 60.307257 610.219398 0 ] (Code/SqliteStorage/:__span-0-59) [ 1782 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-6) [ 1780 0 R /XYZ 60.307257 640.633662 0 ] (Code/SqliteStorage/:__span-0-60) [ 1782 0 R /XYZ 60.307257 583.418694 0 ] (Code/SqliteStorage/:__span-0-61) [ 1782 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-62) [ 1782 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-63) [ 1782 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-64) [ 1782 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-65) [ 1782 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-66) [ 1782 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-67) [ 1782 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-68) [ 1782 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-69) [ 1782 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-7) [ 1780 0 R /XYZ 60.307257 627.233310 0 ] (Code/SqliteStorage/:__span-0-70) [ 1782 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-71) [ 1782 0 R /XYZ 60.307257 422.614470 0 ] (Code/SqliteStorage/:__span-0-72) [ 1782 0 R /XYZ 60.307257 409.214118 0 ] (Code/SqliteStorage/:__span-0-73) [ 1782 0 R /XYZ 60.307257 395.813766 0 ] (Code/SqliteStorage/:__span-0-74) [ 1782 0 R /XYZ 60.307257 382.413414 0 ] (Code/SqliteStorage/:__span-0-75) [ 1782 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-76) [ 1782 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-77) [ 1782 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-78) [ 1782 0 R /XYZ 60.307257 328.812006 0 ] (Code/SqliteStorage/:__span-0-79) [ 1782 0 R /XYZ 60.307257 315.411654 0 ] (Code/SqliteStorage/:__span-0-8) [ 1780 0 R /XYZ 60.307257 613.832958 0 ] (Code/SqliteStorage/:__span-0-80) [ 1782 0 R /XYZ 60.307257 302.011302 0 ] (Code/SqliteStorage/:__span-0-81) [ 1782 0 R /XYZ 60.307257 288.610950 0 ] (Code/SqliteStorage/:__span-0-82) [ 1782 0 R /XYZ 60.307257 275.210598 0 ] (Code/SqliteStorage/:__span-0-83) [ 1782 0 R /XYZ 60.307257 261.810246 0 ] (Code/SqliteStorage/:__span-0-84) [ 1782 0 R /XYZ 60.307257 248.409894 0 ] (Code/SqliteStorage/:__span-0-85) [ 1782 0 R /XYZ 60.307257 235.009542 0 ] (Code/SqliteStorage/:__span-0-86) [ 1782 0 R /XYZ 60.307257 208.208838 0 ] (Code/SqliteStorage/:__span-0-87) [ 1782 0 R /XYZ 60.307257 194.808486 0 ] (Code/SqliteStorage/:__span-0-88) [ 1782 0 R /XYZ 60.307257 181.408134 0 ] (Code/SqliteStorage/:__span-0-89) [ 1782 0 R /XYZ 60.307257 168.007782 0 ] (Code/SqliteStorage/:__span-0-9) [ 1780 0 R /XYZ 60.307257 600.432606 0 ] (Code/SqliteStorage/:__span-0-90) [ 1782 0 R /XYZ 60.307257 154.607430 0 ] (Code/SqliteStorage/:__span-0-91) [ 1782 0 R /XYZ 60.307257 141.207078 0 ] (Code/SqliteStorage/:__span-0-92) [ 1782 0 R /XYZ 60.307257 114.406374 0 ] (Code/SqliteStorage/:__span-0-93) [ 1782 0 R /XYZ 60.307257 101.006022 0 ] (Code/SqliteStorage/:__span-0-94) [ 1782 0 R /XYZ 60.307257 87.605670 0 ] (Code/SqliteStorage/:__span-0-95) [ 1784 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-96) [ 1784 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-97) [ 1784 0 R /XYZ 60.307257 744.222918 0 ] (Code/SqliteStorage/:__span-0-98) [ 1784 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-99) [ 1784 0 R /XYZ 60.307257 717.422214 0 ] (Code/SqliteStorage/:sqlitestoragecs) [ 1780 0 R /XYZ 39.386457 747.563622 0 ] (Code/Window/:) [ 1906 0 R /XYZ 39.386457 747.563622 0 ] (Code/Window/:__span-0-1) [ 1906 0 R /XYZ 60.307257 707.635422 0 ] (Code/Window/:__span-0-10) [ 1906 0 R /XYZ 60.307257 587.032254 0 ] (Code/Window/:__span-0-100) [ 1910 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-101) [ 1910 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-102) [ 1910 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-103) [ 1910 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-104) [ 1910 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-105) [ 1910 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-106) [ 1910 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-107) [ 1910 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-108) [ 1910 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-109) [ 1910 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-11) [ 1906 0 R /XYZ 60.307257 573.631902 0 ] (Code/Window/:__span-0-110) [ 1910 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-111) [ 1910 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-112) [ 1910 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-113) [ 1910 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-114) [ 1910 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-115) [ 1910 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-116) [ 1910 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-117) [ 1910 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-118) [ 1910 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-119) [ 1910 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-12) [ 1906 0 R /XYZ 60.307257 560.231550 0 ] (Code/Window/:__span-0-120) [ 1910 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-121) [ 1910 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-122) [ 1910 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-123) [ 1910 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-124) [ 1910 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-125) [ 1910 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-126) [ 1910 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-127) [ 1910 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-128) [ 1910 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-129) [ 1910 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-13) [ 1906 0 R /XYZ 60.307257 546.831198 0 ] (Code/Window/:__span-0-130) [ 1910 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-131) [ 1910 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-132) [ 1910 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-133) [ 1910 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-134) [ 1910 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-135) [ 1910 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-136) [ 1910 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-137) [ 1910 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-138) [ 1910 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-139) [ 1910 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-14) [ 1906 0 R /XYZ 60.307257 533.430846 0 ] (Code/Window/:__span-0-140) [ 1912 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-141) [ 1912 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-142) [ 1912 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-143) [ 1912 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-144) [ 1912 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-145) [ 1912 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-146) [ 1912 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-147) [ 1912 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-148) [ 1912 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-149) [ 1912 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-15) [ 1906 0 R /XYZ 60.307257 520.030494 0 ] (Code/Window/:__span-0-150) [ 1912 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-151) [ 1912 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-152) [ 1912 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-153) [ 1912 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-154) [ 1912 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-155) [ 1912 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-156) [ 1912 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-157) [ 1912 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-158) [ 1912 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-159) [ 1912 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-16) [ 1906 0 R /XYZ 60.307257 506.630142 0 ] (Code/Window/:__span-0-160) [ 1912 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-161) [ 1912 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-162) [ 1912 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-163) [ 1912 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-164) [ 1912 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-165) [ 1912 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-166) [ 1912 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-167) [ 1912 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-168) [ 1912 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-169) [ 1912 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-17) [ 1906 0 R /XYZ 60.307257 493.229790 0 ] (Code/Window/:__span-0-170) [ 1912 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-171) [ 1912 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-172) [ 1912 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-173) [ 1912 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-174) [ 1912 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-175) [ 1912 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-176) [ 1912 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-177) [ 1912 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-178) [ 1912 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-179) [ 1912 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-18) [ 1906 0 R /XYZ 60.307257 479.829438 0 ] (Code/Window/:__span-0-180) [ 1912 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-181) [ 1912 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-182) [ 1912 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-183) [ 1912 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-184) [ 1912 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-185) [ 1912 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-186) [ 1912 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-187) [ 1912 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-188) [ 1912 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-189) [ 1912 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-19) [ 1906 0 R /XYZ 60.307257 466.429086 0 ] (Code/Window/:__span-0-190) [ 1914 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-191) [ 1914 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-192) [ 1914 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-193) [ 1914 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-194) [ 1914 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-195) [ 1914 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-196) [ 1914 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-197) [ 1914 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-198) [ 1914 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-199) [ 1914 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-2) [ 1906 0 R /XYZ 60.307257 694.235070 0 ] (Code/Window/:__span-0-20) [ 1906 0 R /XYZ 60.307257 453.028734 0 ] (Code/Window/:__span-0-200) [ 1914 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-201) [ 1914 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-202) [ 1914 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-203) [ 1914 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-204) [ 1914 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-205) [ 1914 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-206) [ 1914 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-207) [ 1914 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-208) [ 1914 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-209) [ 1914 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-21) [ 1906 0 R /XYZ 60.307257 439.628382 0 ] (Code/Window/:__span-0-210) [ 1914 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-211) [ 1914 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-212) [ 1914 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-213) [ 1914 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-214) [ 1914 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-215) [ 1914 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-216) [ 1914 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-217) [ 1914 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-218) [ 1914 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-219) [ 1914 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-22) [ 1906 0 R /XYZ 60.307257 426.228030 0 ] (Code/Window/:__span-0-220) [ 1914 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-221) [ 1914 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-222) [ 1914 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-223) [ 1914 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-224) [ 1914 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-225) [ 1914 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-226) [ 1914 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-227) [ 1914 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-228) [ 1914 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-229) [ 1914 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-23) [ 1906 0 R /XYZ 60.307257 412.827678 0 ] (Code/Window/:__span-0-230) [ 1914 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-231) [ 1914 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-232) [ 1914 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-233) [ 1914 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-234) [ 1914 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-235) [ 1914 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-236) [ 1914 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-237) [ 1914 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-238) [ 1916 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-239) [ 1916 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-24) [ 1906 0 R /XYZ 60.307257 399.427326 0 ] (Code/Window/:__span-0-240) [ 1916 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-241) [ 1916 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-242) [ 1916 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-243) [ 1916 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-244) [ 1916 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-245) [ 1916 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-246) [ 1916 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-247) [ 1916 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-248) [ 1916 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-249) [ 1916 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-25) [ 1906 0 R /XYZ 60.307257 386.026974 0 ] (Code/Window/:__span-0-250) [ 1916 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-251) [ 1916 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-252) [ 1916 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-253) [ 1916 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-254) [ 1916 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-255) [ 1916 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-256) [ 1916 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-257) [ 1916 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-258) [ 1916 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-259) [ 1916 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-26) [ 1906 0 R /XYZ 60.307257 372.626622 0 ] (Code/Window/:__span-0-260) [ 1916 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-261) [ 1916 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-262) [ 1916 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-263) [ 1916 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-264) [ 1916 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-265) [ 1916 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-266) [ 1916 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-267) [ 1916 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-268) [ 1916 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-269) [ 1916 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-27) [ 1906 0 R /XYZ 60.307257 359.226270 0 ] (Code/Window/:__span-0-270) [ 1916 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-271) [ 1916 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-272) [ 1916 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-273) [ 1916 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-274) [ 1916 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-275) [ 1916 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-276) [ 1916 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-277) [ 1916 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-278) [ 1916 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-279) [ 1916 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-28) [ 1906 0 R /XYZ 60.307257 345.825918 0 ] (Code/Window/:__span-0-280) [ 1916 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-281) [ 1916 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-282) [ 1916 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-283) [ 1916 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-284) [ 1916 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-285) [ 1918 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-286) [ 1918 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-287) [ 1918 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-288) [ 1918 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-289) [ 1918 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-29) [ 1906 0 R /XYZ 60.307257 332.425566 0 ] (Code/Window/:__span-0-290) [ 1918 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-291) [ 1918 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-292) [ 1918 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-293) [ 1918 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-294) [ 1918 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-295) [ 1918 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-296) [ 1918 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-297) [ 1918 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-298) [ 1918 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-299) [ 1918 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-3) [ 1906 0 R /XYZ 60.307257 680.834718 0 ] (Code/Window/:__span-0-30) [ 1906 0 R /XYZ 60.307257 319.025214 0 ] (Code/Window/:__span-0-300) [ 1918 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-301) [ 1918 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-302) [ 1918 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-303) [ 1918 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-304) [ 1918 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-305) [ 1918 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-306) [ 1918 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-307) [ 1918 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-308) [ 1918 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-309) [ 1918 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-31) [ 1906 0 R /XYZ 60.307257 305.624862 0 ] (Code/Window/:__span-0-310) [ 1918 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-311) [ 1918 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-312) [ 1918 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-313) [ 1918 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-314) [ 1918 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-315) [ 1918 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-316) [ 1918 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-317) [ 1918 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-318) [ 1918 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-319) [ 1918 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-32) [ 1906 0 R /XYZ 60.307257 292.224510 0 ] (Code/Window/:__span-0-320) [ 1918 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-321) [ 1918 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-322) [ 1918 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-323) [ 1918 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-324) [ 1918 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-325) [ 1918 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-326) [ 1918 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-327) [ 1920 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-328) [ 1920 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-329) [ 1920 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-33) [ 1906 0 R /XYZ 60.307257 278.824158 0 ] (Code/Window/:__span-0-330) [ 1920 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-331) [ 1920 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-332) [ 1920 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-333) [ 1920 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-334) [ 1920 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-335) [ 1920 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-336) [ 1920 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-337) [ 1920 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-338) [ 1920 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-339) [ 1920 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-34) [ 1906 0 R /XYZ 60.307257 265.423806 0 ] (Code/Window/:__span-0-340) [ 1920 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-341) [ 1920 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-342) [ 1920 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-343) [ 1920 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-344) [ 1920 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-345) [ 1920 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-346) [ 1920 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-347) [ 1920 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-348) [ 1920 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-349) [ 1920 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-35) [ 1906 0 R /XYZ 60.307257 252.023454 0 ] (Code/Window/:__span-0-350) [ 1920 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-351) [ 1920 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-352) [ 1920 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-353) [ 1920 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-354) [ 1920 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-355) [ 1920 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-356) [ 1920 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-357) [ 1920 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-358) [ 1920 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-359) [ 1920 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-36) [ 1906 0 R /XYZ 60.307257 238.623102 0 ] (Code/Window/:__span-0-360) [ 1920 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-361) [ 1920 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-362) [ 1920 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-363) [ 1920 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-364) [ 1920 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-365) [ 1920 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-366) [ 1920 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-367) [ 1920 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-368) [ 1920 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-369) [ 1922 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-37) [ 1906 0 R /XYZ 60.307257 225.222750 0 ] (Code/Window/:__span-0-370) [ 1922 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-371) [ 1922 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-372) [ 1922 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-373) [ 1922 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-374) [ 1922 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-375) [ 1922 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-376) [ 1922 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-377) [ 1922 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-378) [ 1922 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-379) [ 1922 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-38) [ 1906 0 R /XYZ 60.307257 211.822398 0 ] (Code/Window/:__span-0-380) [ 1922 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-381) [ 1922 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-382) [ 1922 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-383) [ 1922 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-384) [ 1922 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-385) [ 1922 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-386) [ 1922 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-387) [ 1922 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-388) [ 1922 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-389) [ 1922 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-39) [ 1906 0 R /XYZ 60.307257 198.422046 0 ] (Code/Window/:__span-0-390) [ 1922 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-391) [ 1922 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-392) [ 1922 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-393) [ 1922 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-394) [ 1922 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-395) [ 1922 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-396) [ 1922 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-397) [ 1922 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-398) [ 1922 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-399) [ 1922 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-4) [ 1906 0 R /XYZ 60.307257 667.434366 0 ] (Code/Window/:__span-0-40) [ 1906 0 R /XYZ 60.307257 171.621342 0 ] (Code/Window/:__span-0-400) [ 1922 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-401) [ 1922 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-402) [ 1922 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-403) [ 1922 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-404) [ 1922 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-405) [ 1922 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-406) [ 1922 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-407) [ 1924 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-408) [ 1924 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-409) [ 1924 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-41) [ 1906 0 R /XYZ 60.307257 158.220990 0 ] (Code/Window/:__span-0-410) [ 1924 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-411) [ 1924 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-412) [ 1924 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-413) [ 1924 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-414) [ 1924 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-415) [ 1924 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-416) [ 1924 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-417) [ 1924 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-418) [ 1924 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-419) [ 1924 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-42) [ 1906 0 R /XYZ 60.307257 144.820638 0 ] (Code/Window/:__span-0-420) [ 1924 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-421) [ 1924 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-422) [ 1924 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-423) [ 1924 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-424) [ 1924 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-425) [ 1924 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-426) [ 1924 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-427) [ 1924 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-428) [ 1924 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-429) [ 1924 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-43) [ 1906 0 R /XYZ 60.307257 131.420286 0 ] (Code/Window/:__span-0-430) [ 1924 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-431) [ 1924 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-432) [ 1924 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-433) [ 1924 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-434) [ 1924 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-435) [ 1924 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-436) [ 1924 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-437) [ 1924 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-438) [ 1924 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-439) [ 1924 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-44) [ 1906 0 R /XYZ 60.307257 118.019934 0 ] (Code/Window/:__span-0-440) [ 1924 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-441) [ 1924 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-442) [ 1924 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-443) [ 1924 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-444) [ 1924 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-445) [ 1924 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-446) [ 1924 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-447) [ 1924 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-448) [ 1924 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-449) [ 1924 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-45) [ 1906 0 R /XYZ 60.307257 104.619582 0 ] (Code/Window/:__span-0-450) [ 1924 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-451) [ 1924 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-452) [ 1924 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-453) [ 1924 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-454) [ 1924 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-455) [ 1926 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-456) [ 1926 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-457) [ 1926 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-458) [ 1926 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-459) [ 1926 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-46) [ 1906 0 R /XYZ 60.307257 91.219230 0 ] (Code/Window/:__span-0-460) [ 1926 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-461) [ 1926 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-462) [ 1926 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-463) [ 1926 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-464) [ 1926 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-465) [ 1926 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-466) [ 1926 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-467) [ 1926 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-468) [ 1926 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-469) [ 1926 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-47) [ 1908 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-470) [ 1926 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-471) [ 1926 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-472) [ 1926 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-473) [ 1926 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-474) [ 1926 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-475) [ 1926 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-476) [ 1926 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-477) [ 1926 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-478) [ 1926 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-479) [ 1926 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-48) [ 1908 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-480) [ 1926 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-481) [ 1926 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-482) [ 1926 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-483) [ 1926 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-484) [ 1926 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-485) [ 1926 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-486) [ 1926 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-487) [ 1926 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-488) [ 1926 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-489) [ 1926 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-49) [ 1908 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-490) [ 1926 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-491) [ 1926 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-492) [ 1926 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-493) [ 1926 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-494) [ 1926 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-495) [ 1926 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-496) [ 1926 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-497) [ 1926 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-498) [ 1926 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-499) [ 1928 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-5) [ 1906 0 R /XYZ 60.307257 654.034014 0 ] (Code/Window/:__span-0-50) [ 1908 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-500) [ 1928 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-501) [ 1928 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-502) [ 1928 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-503) [ 1928 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-504) [ 1928 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-505) [ 1928 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-506) [ 1928 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-507) [ 1928 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-508) [ 1928 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-509) [ 1928 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-51) [ 1908 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-510) [ 1928 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-511) [ 1928 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-512) [ 1928 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-513) [ 1928 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-514) [ 1928 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-515) [ 1928 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-516) [ 1928 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-517) [ 1928 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-518) [ 1928 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-519) [ 1928 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-52) [ 1908 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-520) [ 1928 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-521) [ 1928 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-522) [ 1928 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-523) [ 1928 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-524) [ 1928 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-525) [ 1928 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-526) [ 1928 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-527) [ 1928 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-528) [ 1928 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-529) [ 1928 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-53) [ 1908 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-530) [ 1928 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-531) [ 1928 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-532) [ 1928 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-533) [ 1928 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-534) [ 1928 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-535) [ 1928 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-536) [ 1928 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-537) [ 1928 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-538) [ 1928 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-539) [ 1930 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-54) [ 1908 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-540) [ 1930 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-541) [ 1930 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-542) [ 1930 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-543) [ 1930 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-544) [ 1930 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-545) [ 1930 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-546) [ 1930 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-547) [ 1930 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-548) [ 1930 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-549) [ 1930 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-55) [ 1908 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-550) [ 1930 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-551) [ 1930 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-552) [ 1930 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-553) [ 1930 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-554) [ 1930 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-555) [ 1930 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-556) [ 1930 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-557) [ 1930 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-558) [ 1930 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-559) [ 1930 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-56) [ 1908 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-560) [ 1930 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-561) [ 1930 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-562) [ 1930 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-563) [ 1930 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-564) [ 1930 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-565) [ 1930 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-566) [ 1930 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-567) [ 1930 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-568) [ 1930 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-569) [ 1930 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-57) [ 1908 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-570) [ 1930 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-571) [ 1930 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-572) [ 1930 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-573) [ 1930 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-574) [ 1930 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-575) [ 1930 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-576) [ 1930 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-577) [ 1930 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-578) [ 1930 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-579) [ 1930 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-58) [ 1908 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-580) [ 1930 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-581) [ 1930 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-582) [ 1930 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-583) [ 1930 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-584) [ 1930 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-585) [ 1930 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-586) [ 1932 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-587) [ 1932 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-588) [ 1932 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-589) [ 1932 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-59) [ 1908 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-590) [ 1932 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-591) [ 1932 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-592) [ 1932 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-593) [ 1932 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-594) [ 1932 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-595) [ 1932 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-596) [ 1932 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-597) [ 1932 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-598) [ 1932 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-599) [ 1932 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-6) [ 1906 0 R /XYZ 60.307257 640.633662 0 ] (Code/Window/:__span-0-60) [ 1908 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-600) [ 1932 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-601) [ 1932 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-602) [ 1932 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-603) [ 1932 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-604) [ 1932 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-605) [ 1932 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-606) [ 1932 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-607) [ 1932 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-608) [ 1932 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-609) [ 1932 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-61) [ 1908 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-610) [ 1932 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-611) [ 1932 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-612) [ 1932 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-613) [ 1932 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-614) [ 1932 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-615) [ 1932 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-616) [ 1932 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-617) [ 1932 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-618) [ 1932 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-619) [ 1932 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-62) [ 1908 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-620) [ 1932 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-621) [ 1932 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-622) [ 1932 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-623) [ 1932 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-624) [ 1932 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-625) [ 1932 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-626) [ 1932 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-627) [ 1932 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-628) [ 1932 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-629) [ 1932 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-63) [ 1908 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-630) [ 1932 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-631) [ 1932 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-632) [ 1934 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-633) [ 1934 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-634) [ 1934 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-635) [ 1934 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-636) [ 1934 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-637) [ 1934 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-638) [ 1934 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-639) [ 1934 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-64) [ 1908 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-640) [ 1934 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-641) [ 1934 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-642) [ 1934 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-643) [ 1934 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-644) [ 1934 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-645) [ 1934 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-646) [ 1934 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-647) [ 1934 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-648) [ 1934 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-649) [ 1934 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-65) [ 1908 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-650) [ 1934 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-651) [ 1934 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-652) [ 1934 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-653) [ 1934 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-654) [ 1934 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-655) [ 1934 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-656) [ 1934 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-657) [ 1934 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-658) [ 1934 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-659) [ 1934 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-66) [ 1908 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-660) [ 1934 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-661) [ 1934 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-662) [ 1934 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-663) [ 1934 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-664) [ 1934 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-665) [ 1934 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-666) [ 1934 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-667) [ 1934 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-668) [ 1934 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-669) [ 1934 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-67) [ 1908 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-670) [ 1934 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-671) [ 1934 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-672) [ 1934 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-673) [ 1934 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-674) [ 1934 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-675) [ 1934 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-676) [ 1934 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-68) [ 1908 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-69) [ 1908 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-7) [ 1906 0 R /XYZ 60.307257 627.233310 0 ] (Code/Window/:__span-0-70) [ 1908 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-71) [ 1908 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-72) [ 1908 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-73) [ 1908 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-74) [ 1908 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-75) [ 1908 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-76) [ 1908 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-77) [ 1908 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-78) [ 1908 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-79) [ 1908 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-8) [ 1906 0 R /XYZ 60.307257 613.832958 0 ] (Code/Window/:__span-0-80) [ 1908 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-81) [ 1908 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-82) [ 1908 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-83) [ 1908 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-84) [ 1908 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-85) [ 1908 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-86) [ 1908 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-87) [ 1908 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-88) [ 1908 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-89) [ 1908 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-9) [ 1906 0 R /XYZ 60.307257 600.432606 0 ] (Code/Window/:__span-0-90) [ 1908 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-91) [ 1908 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-92) [ 1908 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-93) [ 1908 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-94) [ 1910 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-95) [ 1910 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-96) [ 1910 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-97) [ 1910 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-98) [ 1910 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-99) [ 1910 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:windowcs) [ 1906 0 R /XYZ 39.386457 747.563622 0 ] (Code/Zone/:) [ 1792 0 R /XYZ 39.386457 747.563622 0 ] (Code/Zone/:__span-0-1) [ 1792 0 R /XYZ 60.307257 707.635422 0 ] (Code/Zone/:__span-0-10) [ 1792 0 R /XYZ 60.307257 573.631902 0 ] (Code/Zone/:__span-0-100) [ 1796 0 R /XYZ 60.307257 623.619750 0 ] (Code/Zone/:__span-0-101) [ 1796 0 R /XYZ 60.307257 610.219398 0 ] (Code/Zone/:__span-0-102) [ 1796 0 R /XYZ 60.307257 583.418694 0 ] (Code/Zone/:__span-0-103) [ 1796 0 R /XYZ 60.307257 570.018342 0 ] (Code/Zone/:__span-0-104) [ 1796 0 R /XYZ 60.307257 556.617990 0 ] (Code/Zone/:__span-0-105) [ 1796 0 R /XYZ 60.307257 543.217638 0 ] (Code/Zone/:__span-0-106) [ 1796 0 R /XYZ 60.307257 516.416934 0 ] (Code/Zone/:__span-0-107) [ 1796 0 R /XYZ 60.307257 503.016582 0 ] (Code/Zone/:__span-0-108) [ 1796 0 R /XYZ 60.307257 489.616230 0 ] (Code/Zone/:__span-0-109) [ 1796 0 R /XYZ 60.307257 476.215878 0 ] (Code/Zone/:__span-0-11) [ 1792 0 R /XYZ 60.307257 560.231550 0 ] (Code/Zone/:__span-0-110) [ 1796 0 R /XYZ 60.307257 462.815526 0 ] (Code/Zone/:__span-0-111) [ 1796 0 R /XYZ 60.307257 449.415174 0 ] (Code/Zone/:__span-0-112) [ 1796 0 R /XYZ 60.307257 436.014822 0 ] (Code/Zone/:__span-0-113) [ 1796 0 R /XYZ 60.307257 422.614470 0 ] (Code/Zone/:__span-0-114) [ 1796 0 R /XYZ 60.307257 409.214118 0 ] (Code/Zone/:__span-0-115) [ 1796 0 R /XYZ 60.307257 395.813766 0 ] (Code/Zone/:__span-0-116) [ 1796 0 R /XYZ 60.307257 382.413414 0 ] (Code/Zone/:__span-0-117) [ 1796 0 R /XYZ 60.307257 369.013062 0 ] (Code/Zone/:__span-0-118) [ 1796 0 R /XYZ 60.307257 355.612710 0 ] (Code/Zone/:__span-0-119) [ 1796 0 R /XYZ 60.307257 342.212358 0 ] (Code/Zone/:__span-0-12) [ 1792 0 R /XYZ 60.307257 546.831198 0 ] (Code/Zone/:__span-0-120) [ 1796 0 R /XYZ 60.307257 328.812006 0 ] (Code/Zone/:__span-0-121) [ 1796 0 R /XYZ 60.307257 315.411654 0 ] (Code/Zone/:__span-0-122) [ 1796 0 R /XYZ 60.307257 302.011302 0 ] (Code/Zone/:__span-0-123) [ 1796 0 R /XYZ 60.307257 288.610950 0 ] (Code/Zone/:__span-0-124) [ 1796 0 R /XYZ 60.307257 275.210598 0 ] (Code/Zone/:__span-0-125) [ 1796 0 R /XYZ 60.307257 261.810246 0 ] (Code/Zone/:__span-0-126) [ 1796 0 R /XYZ 60.307257 248.409894 0 ] (Code/Zone/:__span-0-127) [ 1796 0 R /XYZ 60.307257 235.009542 0 ] (Code/Zone/:__span-0-128) [ 1796 0 R /XYZ 60.307257 221.609190 0 ] (Code/Zone/:__span-0-129) [ 1796 0 R /XYZ 60.307257 208.208838 0 ] (Code/Zone/:__span-0-13) [ 1792 0 R /XYZ 60.307257 533.430846 0 ] (Code/Zone/:__span-0-130) [ 1796 0 R /XYZ 60.307257 194.808486 0 ] (Code/Zone/:__span-0-131) [ 1796 0 R /XYZ 60.307257 181.408134 0 ] (Code/Zone/:__span-0-132) [ 1796 0 R /XYZ 60.307257 168.007782 0 ] (Code/Zone/:__span-0-133) [ 1796 0 R /XYZ 60.307257 154.607430 0 ] (Code/Zone/:__span-0-134) [ 1796 0 R /XYZ 60.307257 141.207078 0 ] (Code/Zone/:__span-0-135) [ 1796 0 R /XYZ 60.307257 127.806726 0 ] (Code/Zone/:__span-0-136) [ 1796 0 R /XYZ 60.307257 114.406374 0 ] (Code/Zone/:__span-0-137) [ 1796 0 R /XYZ 60.307257 101.006022 0 ] (Code/Zone/:__span-0-138) [ 1796 0 R /XYZ 60.307257 87.605670 0 ] (Code/Zone/:__span-0-139) [ 1798 0 R /XYZ 60.307257 771.023622 0 ] (Code/Zone/:__span-0-14) [ 1792 0 R /XYZ 60.307257 520.030494 0 ] (Code/Zone/:__span-0-140) [ 1798 0 R /XYZ 60.307257 757.623270 0 ] (Code/Zone/:__span-0-141) [ 1798 0 R /XYZ 60.307257 744.222918 0 ] (Code/Zone/:__span-0-142) [ 1798 0 R /XYZ 60.307257 730.822566 0 ] (Code/Zone/:__span-0-143) [ 1798 0 R /XYZ 60.307257 717.422214 0 ] (Code/Zone/:__span-0-144) [ 1798 0 R /XYZ 60.307257 690.621510 0 ] (Code/Zone/:__span-0-145) [ 1798 0 R /XYZ 60.307257 677.221158 0 ] (Code/Zone/:__span-0-146) [ 1798 0 R /XYZ 60.307257 663.820806 0 ] (Code/Zone/:__span-0-147) [ 1798 0 R /XYZ 60.307257 650.420454 0 ] (Code/Zone/:__span-0-148) [ 1798 0 R /XYZ 60.307257 623.619750 0 ] (Code/Zone/:__span-0-149) [ 1798 0 R /XYZ 60.307257 596.819046 0 ] (Code/Zone/:__span-0-15) [ 1792 0 R /XYZ 60.307257 506.630142 0 ] (Code/Zone/:__span-0-150) [ 1798 0 R /XYZ 60.307257 583.418694 0 ] (Code/Zone/:__span-0-151) [ 1798 0 R /XYZ 60.307257 570.018342 0 ] (Code/Zone/:__span-0-152) [ 1798 0 R /XYZ 60.307257 556.617990 0 ] (Code/Zone/:__span-0-153) [ 1798 0 R /XYZ 60.307257 529.817286 0 ] (Code/Zone/:__span-0-154) [ 1798 0 R /XYZ 60.307257 516.416934 0 ] (Code/Zone/:__span-0-155) [ 1798 0 R /XYZ 60.307257 503.016582 0 ] (Code/Zone/:__span-0-156) [ 1798 0 R /XYZ 60.307257 489.616230 0 ] (Code/Zone/:__span-0-157) [ 1798 0 R /XYZ 60.307257 476.215878 0 ] (Code/Zone/:__span-0-158) [ 1798 0 R /XYZ 60.307257 462.815526 0 ] (Code/Zone/:__span-0-159) [ 1798 0 R /XYZ 60.307257 449.415174 0 ] (Code/Zone/:__span-0-16) [ 1792 0 R /XYZ 60.307257 493.229790 0 ] (Code/Zone/:__span-0-160) [ 1798 0 R /XYZ 60.307257 436.014822 0 ] (Code/Zone/:__span-0-161) [ 1798 0 R /XYZ 60.307257 422.614470 0 ] (Code/Zone/:__span-0-162) [ 1798 0 R /XYZ 60.307257 409.214118 0 ] (Code/Zone/:__span-0-163) [ 1798 0 R /XYZ 60.307257 395.813766 0 ] (Code/Zone/:__span-0-164) [ 1798 0 R /XYZ 60.307257 382.413414 0 ] (Code/Zone/:__span-0-165) [ 1798 0 R /XYZ 60.307257 369.013062 0 ] (Code/Zone/:__span-0-166) [ 1798 0 R /XYZ 60.307257 355.612710 0 ] (Code/Zone/:__span-0-167) [ 1798 0 R /XYZ 60.307257 342.212358 0 ] (Code/Zone/:__span-0-168) [ 1798 0 R /XYZ 60.307257 328.812006 0 ] (Code/Zone/:__span-0-169) [ 1798 0 R /XYZ 60.307257 315.411654 0 ] (Code/Zone/:__span-0-17) [ 1792 0 R /XYZ 60.307257 479.829438 0 ] (Code/Zone/:__span-0-170) [ 1798 0 R /XYZ 60.307257 302.011302 0 ] (Code/Zone/:__span-0-171) [ 1798 0 R /XYZ 60.307257 288.610950 0 ] (Code/Zone/:__span-0-172) [ 1798 0 R /XYZ 60.307257 261.810246 0 ] (Code/Zone/:__span-0-173) [ 1798 0 R /XYZ 60.307257 248.409894 0 ] (Code/Zone/:__span-0-174) [ 1798 0 R /XYZ 60.307257 235.009542 0 ] (Code/Zone/:__span-0-175) [ 1798 0 R /XYZ 60.307257 221.609190 0 ] (Code/Zone/:__span-0-176) [ 1798 0 R /XYZ 60.307257 181.408134 0 ] (Code/Zone/:__span-0-177) [ 1798 0 R /XYZ 60.307257 168.007782 0 ] (Code/Zone/:__span-0-178) [ 1798 0 R /XYZ 60.307257 154.607430 0 ] (Code/Zone/:__span-0-179) [ 1798 0 R /XYZ 60.307257 141.207078 0 ] (Code/Zone/:__span-0-18) [ 1792 0 R /XYZ 60.307257 466.429086 0 ] (Code/Zone/:__span-0-180) [ 1798 0 R /XYZ 60.307257 127.806726 0 ] (Code/Zone/:__span-0-181) [ 1798 0 R /XYZ 60.307257 114.406374 0 ] (Code/Zone/:__span-0-182) [ 1798 0 R /XYZ 60.307257 101.006022 0 ] (Code/Zone/:__span-0-183) [ 1798 0 R /XYZ 60.307257 87.605670 0 ] (Code/Zone/:__span-0-184) [ 1800 0 R /XYZ 60.307257 771.023622 0 ] (Code/Zone/:__span-0-185) [ 1800 0 R /XYZ 60.307257 757.623270 0 ] (Code/Zone/:__span-0-19) [ 1792 0 R /XYZ 60.307257 453.028734 0 ] (Code/Zone/:__span-0-2) [ 1792 0 R /XYZ 60.307257 694.235070 0 ] (Code/Zone/:__span-0-20) [ 1792 0 R /XYZ 60.307257 439.628382 0 ] (Code/Zone/:__span-0-21) [ 1792 0 R /XYZ 60.307257 426.228030 0 ] (Code/Zone/:__span-0-22) [ 1792 0 R /XYZ 60.307257 412.827678 0 ] (Code/Zone/:__span-0-23) [ 1792 0 R /XYZ 60.307257 399.427326 0 ] (Code/Zone/:__span-0-24) [ 1792 0 R /XYZ 60.307257 386.026974 0 ] (Code/Zone/:__span-0-25) [ 1792 0 R /XYZ 60.307257 372.626622 0 ] (Code/Zone/:__span-0-26) [ 1792 0 R /XYZ 60.307257 359.226270 0 ] (Code/Zone/:__span-0-27) [ 1792 0 R /XYZ 60.307257 345.825918 0 ] (Code/Zone/:__span-0-28) [ 1792 0 R /XYZ 60.307257 332.425566 0 ] (Code/Zone/:__span-0-29) [ 1792 0 R /XYZ 60.307257 319.025214 0 ] (Code/Zone/:__span-0-3) [ 1792 0 R /XYZ 60.307257 680.834718 0 ] (Code/Zone/:__span-0-30) [ 1792 0 R /XYZ 60.307257 305.624862 0 ] (Code/Zone/:__span-0-31) [ 1792 0 R /XYZ 60.307257 292.224510 0 ] (Code/Zone/:__span-0-32) [ 1792 0 R /XYZ 60.307257 265.423806 0 ] (Code/Zone/:__span-0-33) [ 1792 0 R /XYZ 60.307257 252.023454 0 ] (Code/Zone/:__span-0-34) [ 1792 0 R /XYZ 60.307257 238.623102 0 ] (Code/Zone/:__span-0-35) [ 1792 0 R /XYZ 60.307257 225.222750 0 ] (Code/Zone/:__span-0-36) [ 1792 0 R /XYZ 60.307257 211.822398 0 ] (Code/Zone/:__span-0-37) [ 1792 0 R /XYZ 60.307257 198.422046 0 ] (Code/Zone/:__span-0-38) [ 1792 0 R /XYZ 60.307257 185.021694 0 ] (Code/Zone/:__span-0-39) [ 1792 0 R /XYZ 60.307257 171.621342 0 ] (Code/Zone/:__span-0-4) [ 1792 0 R /XYZ 60.307257 667.434366 0 ] (Code/Zone/:__span-0-40) [ 1792 0 R /XYZ 60.307257 158.220990 0 ] (Code/Zone/:__span-0-41) [ 1792 0 R /XYZ 60.307257 131.420286 0 ] (Code/Zone/:__span-0-42) [ 1792 0 R /XYZ 60.307257 118.019934 0 ] (Code/Zone/:__span-0-43) [ 1792 0 R /XYZ 60.307257 104.619582 0 ] (Code/Zone/:__span-0-44) [ 1792 0 R /XYZ 60.307257 91.219230 0 ] (Code/Zone/:__span-0-45) [ 1794 0 R /XYZ 60.307257 771.023622 0 ] (Code/Zone/:__span-0-46) [ 1794 0 R /XYZ 60.307257 757.623270 0 ] (Code/Zone/:__span-0-47) [ 1794 0 R /XYZ 60.307257 744.222918 0 ] (Code/Zone/:__span-0-48) [ 1794 0 R /XYZ 60.307257 730.822566 0 ] (Code/Zone/:__span-0-49) [ 1794 0 R /XYZ 60.307257 717.422214 0 ] (Code/Zone/:__span-0-5) [ 1792 0 R /XYZ 60.307257 640.633662 0 ] (Code/Zone/:__span-0-50) [ 1794 0 R /XYZ 60.307257 704.021862 0 ] (Code/Zone/:__span-0-51) [ 1794 0 R /XYZ 60.307257 690.621510 0 ] (Code/Zone/:__span-0-52) [ 1794 0 R /XYZ 60.307257 677.221158 0 ] (Code/Zone/:__span-0-53) [ 1794 0 R /XYZ 60.307257 650.420454 0 ] (Code/Zone/:__span-0-54) [ 1794 0 R /XYZ 60.307257 637.020102 0 ] (Code/Zone/:__span-0-55) [ 1794 0 R /XYZ 60.307257 610.219398 0 ] (Code/Zone/:__span-0-56) [ 1794 0 R /XYZ 60.307257 596.819046 0 ] (Code/Zone/:__span-0-57) [ 1794 0 R /XYZ 60.307257 583.418694 0 ] (Code/Zone/:__span-0-58) [ 1794 0 R /XYZ 60.307257 570.018342 0 ] (Code/Zone/:__span-0-59) [ 1794 0 R /XYZ 60.307257 556.617990 0 ] (Code/Zone/:__span-0-6) [ 1792 0 R /XYZ 60.307257 627.233310 0 ] (Code/Zone/:__span-0-60) [ 1794 0 R /XYZ 60.307257 543.217638 0 ] (Code/Zone/:__span-0-61) [ 1794 0 R /XYZ 60.307257 529.817286 0 ] (Code/Zone/:__span-0-62) [ 1794 0 R /XYZ 60.307257 503.016582 0 ] (Code/Zone/:__span-0-63) [ 1794 0 R /XYZ 60.307257 489.616230 0 ] (Code/Zone/:__span-0-64) [ 1794 0 R /XYZ 60.307257 476.215878 0 ] (Code/Zone/:__span-0-65) [ 1794 0 R /XYZ 60.307257 462.815526 0 ] (Code/Zone/:__span-0-66) [ 1794 0 R /XYZ 60.307257 449.415174 0 ] (Code/Zone/:__span-0-67) [ 1794 0 R /XYZ 60.307257 436.014822 0 ] (Code/Zone/:__span-0-68) [ 1794 0 R /XYZ 60.307257 422.614470 0 ] (Code/Zone/:__span-0-69) [ 1794 0 R /XYZ 60.307257 395.813766 0 ] (Code/Zone/:__span-0-7) [ 1792 0 R /XYZ 60.307257 613.832958 0 ] (Code/Zone/:__span-0-70) [ 1794 0 R /XYZ 60.307257 382.413414 0 ] (Code/Zone/:__span-0-71) [ 1794 0 R /XYZ 60.307257 369.013062 0 ] (Code/Zone/:__span-0-72) [ 1794 0 R /XYZ 60.307257 355.612710 0 ] (Code/Zone/:__span-0-73) [ 1794 0 R /XYZ 60.307257 342.212358 0 ] (Code/Zone/:__span-0-74) [ 1794 0 R /XYZ 60.307257 328.812006 0 ] (Code/Zone/:__span-0-75) [ 1794 0 R /XYZ 60.307257 315.411654 0 ] (Code/Zone/:__span-0-76) [ 1794 0 R /XYZ 60.307257 302.011302 0 ] (Code/Zone/:__span-0-77) [ 1794 0 R /XYZ 60.307257 288.610950 0 ] (Code/Zone/:__span-0-78) [ 1794 0 R /XYZ 60.307257 275.210598 0 ] (Code/Zone/:__span-0-79) [ 1794 0 R /XYZ 60.307257 261.810246 0 ] (Code/Zone/:__span-0-8) [ 1792 0 R /XYZ 60.307257 600.432606 0 ] (Code/Zone/:__span-0-80) [ 1794 0 R /XYZ 60.307257 248.409894 0 ] (Code/Zone/:__span-0-81) [ 1794 0 R /XYZ 60.307257 235.009542 0 ] (Code/Zone/:__span-0-82) [ 1794 0 R /XYZ 60.307257 221.609190 0 ] (Code/Zone/:__span-0-83) [ 1794 0 R /XYZ 60.307257 208.208838 0 ] (Code/Zone/:__span-0-84) [ 1794 0 R /XYZ 60.307257 194.808486 0 ] (Code/Zone/:__span-0-85) [ 1794 0 R /XYZ 60.307257 181.408134 0 ] (Code/Zone/:__span-0-86) [ 1794 0 R /XYZ 60.307257 168.007782 0 ] (Code/Zone/:__span-0-87) [ 1794 0 R /XYZ 60.307257 154.607430 0 ] (Code/Zone/:__span-0-88) [ 1794 0 R /XYZ 60.307257 141.207078 0 ] (Code/Zone/:__span-0-89) [ 1794 0 R /XYZ 60.307257 127.806726 0 ] (Code/Zone/:__span-0-9) [ 1792 0 R /XYZ 60.307257 587.032254 0 ] (Code/Zone/:__span-0-90) [ 1794 0 R /XYZ 60.307257 101.006022 0 ] (Code/Zone/:__span-0-91) [ 1794 0 R /XYZ 60.307257 87.605670 0 ] (Code/Zone/:__span-0-92) [ 1796 0 R /XYZ 60.307257 757.623270 0 ] (Code/Zone/:__span-0-93) [ 1796 0 R /XYZ 60.307257 730.822566 0 ] (Code/Zone/:__span-0-94) [ 1796 0 R /XYZ 60.307257 717.422214 0 ] (Code/Zone/:__span-0-95) [ 1796 0 R /XYZ 60.307257 704.021862 0 ] (Code/Zone/:__span-0-96) [ 1796 0 R /XYZ 60.307257 690.621510 0 ] (Code/Zone/:__span-0-97) [ 1796 0 R /XYZ 60.307257 677.221158 0 ] (Code/Zone/:__span-0-98) [ 1796 0 R /XYZ 60.307257 663.820806 0 ] (Code/Zone/:__span-0-99) [ 1796 0 R /XYZ 60.307257 650.420454 0 ] (Code/Zone/:zonecs) [ 1792 0 R /XYZ 39.386457 747.563622 0 ] (Code/recoverCookiesCSV/:) [ 1936 0 R /XYZ 39.386457 747.563622 0 ] (Code/recoverCookiesCSV/:__span-0-1) [ 1936 0 R /XYZ 60.307257 707.635422 0 ] (Code/recoverCookiesCSV/:__span-0-10) [ 1936 0 R /XYZ 60.307257 546.831198 0 ] (Code/recoverCookiesCSV/:__span-0-11) [ 1936 0 R /XYZ 60.307257 533.430846 0 ] (Code/recoverCookiesCSV/:__span-0-12) [ 1936 0 R /XYZ 60.307257 520.030494 0 ] (Code/recoverCookiesCSV/:__span-0-13) [ 1936 0 R /XYZ 60.307257 506.630142 0 ] (Code/recoverCookiesCSV/:__span-0-14) [ 1936 0 R /XYZ 60.307257 493.229790 0 ] (Code/recoverCookiesCSV/:__span-0-15) [ 1936 0 R /XYZ 60.307257 479.829438 0 ] (Code/recoverCookiesCSV/:__span-0-16) [ 1936 0 R /XYZ 60.307257 466.429086 0 ] (Code/recoverCookiesCSV/:__span-0-17) [ 1936 0 R /XYZ 60.307257 453.028734 0 ] (Code/recoverCookiesCSV/:__span-0-18) [ 1936 0 R /XYZ 60.307257 439.628382 0 ] (Code/recoverCookiesCSV/:__span-0-19) [ 1936 0 R /XYZ 60.307257 426.228030 0 ] (Code/recoverCookiesCSV/:__span-0-2) [ 1936 0 R /XYZ 60.307257 694.235070 0 ] (Code/recoverCookiesCSV/:__span-0-20) [ 1936 0 R /XYZ 60.307257 412.827678 0 ] (Code/recoverCookiesCSV/:__span-0-21) [ 1936 0 R /XYZ 60.307257 399.427326 0 ] (Code/recoverCookiesCSV/:__span-0-22) [ 1936 0 R /XYZ 60.307257 386.026974 0 ] (Code/recoverCookiesCSV/:__span-0-23) [ 1936 0 R /XYZ 60.307257 372.626622 0 ] (Code/recoverCookiesCSV/:__span-0-24) [ 1936 0 R /XYZ 60.307257 359.226270 0 ] (Code/recoverCookiesCSV/:__span-0-25) [ 1936 0 R /XYZ 60.307257 345.825918 0 ] (Code/recoverCookiesCSV/:__span-0-26) [ 1936 0 R /XYZ 60.307257 332.425566 0 ] (Code/recoverCookiesCSV/:__span-0-27) [ 1936 0 R /XYZ 60.307257 319.025214 0 ] (Code/recoverCookiesCSV/:__span-0-28) [ 1936 0 R /XYZ 60.307257 305.624862 0 ] (Code/recoverCookiesCSV/:__span-0-29) [ 1936 0 R /XYZ 60.307257 292.224510 0 ] (Code/recoverCookiesCSV/:__span-0-3) [ 1936 0 R /XYZ 60.307257 680.834718 0 ] (Code/recoverCookiesCSV/:__span-0-30) [ 1936 0 R /XYZ 60.307257 278.824158 0 ] (Code/recoverCookiesCSV/:__span-0-31) [ 1936 0 R /XYZ 60.307257 265.423806 0 ] (Code/recoverCookiesCSV/:__span-0-32) [ 1936 0 R /XYZ 60.307257 252.023454 0 ] (Code/recoverCookiesCSV/:__span-0-33) [ 1936 0 R /XYZ 60.307257 238.623102 0 ] (Code/recoverCookiesCSV/:__span-0-34) [ 1936 0 R /XYZ 60.307257 225.222750 0 ] (Code/recoverCookiesCSV/:__span-0-35) [ 1936 0 R /XYZ 60.307257 211.822398 0 ] (Code/recoverCookiesCSV/:__span-0-36) [ 1936 0 R /XYZ 60.307257 198.422046 0 ] (Code/recoverCookiesCSV/:__span-0-37) [ 1936 0 R /XYZ 60.307257 185.021694 0 ] (Code/recoverCookiesCSV/:__span-0-38) [ 1936 0 R /XYZ 60.307257 171.621342 0 ] (Code/recoverCookiesCSV/:__span-0-39) [ 1936 0 R /XYZ 60.307257 158.220990 0 ] (Code/recoverCookiesCSV/:__span-0-4) [ 1936 0 R /XYZ 60.307257 654.034014 0 ] (Code/recoverCookiesCSV/:__span-0-40) [ 1936 0 R /XYZ 60.307257 144.820638 0 ] (Code/recoverCookiesCSV/:__span-0-41) [ 1936 0 R /XYZ 60.307257 131.420286 0 ] (Code/recoverCookiesCSV/:__span-0-42) [ 1936 0 R /XYZ 60.307257 118.019934 0 ] (Code/recoverCookiesCSV/:__span-0-43) [ 1936 0 R /XYZ 60.307257 104.619582 0 ] (Code/recoverCookiesCSV/:__span-0-44) [ 1936 0 R /XYZ 60.307257 91.219230 0 ] (Code/recoverCookiesCSV/:__span-0-45) [ 1938 0 R /XYZ 60.307257 771.023622 0 ] (Code/recoverCookiesCSV/:__span-0-46) [ 1938 0 R /XYZ 60.307257 757.623270 0 ] (Code/recoverCookiesCSV/:__span-0-47) [ 1938 0 R /XYZ 60.307257 744.222918 0 ] (Code/recoverCookiesCSV/:__span-0-48) [ 1938 0 R /XYZ 60.307257 730.822566 0 ] (Code/recoverCookiesCSV/:__span-0-49) [ 1938 0 R /XYZ 60.307257 717.422214 0 ] (Code/recoverCookiesCSV/:__span-0-5) [ 1936 0 R /XYZ 60.307257 613.832958 0 ] (Code/recoverCookiesCSV/:__span-0-50) [ 1938 0 R /XYZ 60.307257 704.021862 0 ] (Code/recoverCookiesCSV/:__span-0-51) [ 1938 0 R /XYZ 60.307257 690.621510 0 ] (Code/recoverCookiesCSV/:__span-0-52) [ 1938 0 R /XYZ 60.307257 677.221158 0 ] (Code/recoverCookiesCSV/:__span-0-53) [ 1938 0 R /XYZ 60.307257 663.820806 0 ] (Code/recoverCookiesCSV/:__span-0-54) [ 1938 0 R /XYZ 60.307257 637.020102 0 ] (Code/recoverCookiesCSV/:__span-0-55) [ 1938 0 R /XYZ 60.307257 623.619750 0 ] (Code/recoverCookiesCSV/:__span-0-56) [ 1938 0 R /XYZ 60.307257 610.219398 0 ] (Code/recoverCookiesCSV/:__span-0-57) [ 1938 0 R /XYZ 60.307257 596.819046 0 ] (Code/recoverCookiesCSV/:__span-0-58) [ 1938 0 R /XYZ 60.307257 583.418694 0 ] (Code/recoverCookiesCSV/:__span-0-59) [ 1938 0 R /XYZ 60.307257 570.018342 0 ] (Code/recoverCookiesCSV/:__span-0-6) [ 1936 0 R /XYZ 60.307257 600.432606 0 ] (Code/recoverCookiesCSV/:__span-0-60) [ 1938 0 R /XYZ 60.307257 556.617990 0 ] (Code/recoverCookiesCSV/:__span-0-61) [ 1938 0 R /XYZ 60.307257 543.217638 0 ] (Code/recoverCookiesCSV/:__span-0-62) [ 1938 0 R /XYZ 60.307257 529.817286 0 ] (Code/recoverCookiesCSV/:__span-0-63) [ 1938 0 R /XYZ 60.307257 516.416934 0 ] (Code/recoverCookiesCSV/:__span-0-64) [ 1938 0 R /XYZ 60.307257 503.016582 0 ] (Code/recoverCookiesCSV/:__span-0-65) [ 1938 0 R /XYZ 60.307257 489.616230 0 ] (Code/recoverCookiesCSV/:__span-0-66) [ 1938 0 R /XYZ 60.307257 462.815526 0 ] (Code/recoverCookiesCSV/:__span-0-67) [ 1938 0 R /XYZ 60.307257 449.415174 0 ] (Code/recoverCookiesCSV/:__span-0-68) [ 1938 0 R /XYZ 60.307257 436.014822 0 ] (Code/recoverCookiesCSV/:__span-0-69) [ 1938 0 R /XYZ 60.307257 422.614470 0 ] (Code/recoverCookiesCSV/:__span-0-7) [ 1936 0 R /XYZ 60.307257 587.032254 0 ] (Code/recoverCookiesCSV/:__span-0-70) [ 1938 0 R /XYZ 60.307257 409.214118 0 ] (Code/recoverCookiesCSV/:__span-0-71) [ 1938 0 R /XYZ 60.307257 395.813766 0 ] (Code/recoverCookiesCSV/:__span-0-72) [ 1938 0 R /XYZ 60.307257 382.413414 0 ] (Code/recoverCookiesCSV/:__span-0-73) [ 1938 0 R /XYZ 60.307257 369.013062 0 ] (Code/recoverCookiesCSV/:__span-0-74) [ 1938 0 R /XYZ 60.307257 355.612710 0 ] (Code/recoverCookiesCSV/:__span-0-75) [ 1938 0 R /XYZ 60.307257 342.212358 0 ] (Code/recoverCookiesCSV/:__span-0-76) [ 1938 0 R /XYZ 60.307257 328.812006 0 ] (Code/recoverCookiesCSV/:__span-0-77) [ 1938 0 R /XYZ 60.307257 315.411654 0 ] (Code/recoverCookiesCSV/:__span-0-78) [ 1938 0 R /XYZ 60.307257 302.011302 0 ] (Code/recoverCookiesCSV/:__span-0-79) [ 1938 0 R /XYZ 60.307257 288.610950 0 ] (Code/recoverCookiesCSV/:__span-0-8) [ 1936 0 R /XYZ 60.307257 573.631902 0 ] (Code/recoverCookiesCSV/:__span-0-80) [ 1938 0 R /XYZ 60.307257 275.210598 0 ] (Code/recoverCookiesCSV/:__span-0-81) [ 1938 0 R /XYZ 60.307257 261.810246 0 ] (Code/recoverCookiesCSV/:__span-0-82) [ 1938 0 R /XYZ 60.307257 248.409894 0 ] (Code/recoverCookiesCSV/:__span-0-83) [ 1938 0 R /XYZ 60.307257 235.009542 0 ] (Code/recoverCookiesCSV/:__span-0-9) [ 1936 0 R /XYZ 60.307257 560.231550 0 ] (Code/recoverCookiesCSV/:recovercookiescsvpy) [ 1936 0 R /XYZ 39.386457 747.563622 0 ] (INXWIZI/) [ 1694 0 R /XYZ 39.386457 757.223622 0 ] (INXWIZI/:) [ 1694 0 R /XYZ 39.386457 771.023622 0 ] (ManuelUtilisateur/:) [ 938 0 R /XYZ 39.386457 771.023622 0 ] (ManuelUtilisateur/:a-quoi-sert-lapp) [ 938 0 R /XYZ 39.386457 608.700522 0 ] (ManuelUtilisateur/:ajout-du-nom-des-pilotes) [ 1016 0 R /XYZ 42.836457 166.651302 0 ] (ManuelUtilisateur/:battles) [ 1045 0 R /XYZ 39.386457 234.880422 0 ] (ManuelUtilisateur/:boutons) [ 958 0 R /XYZ 39.386457 309.260718 0 ] (ManuelUtilisateur/:calibration) [ 977 0 R /XYZ 39.386457 771.023622 0 ] (ManuelUtilisateur/:comment-creer-son-preset) [ 977 0 R /XYZ 39.386457 269.144922 0 ] (ManuelUtilisateur/:comprendre-les-donnees) [ 1035 0 R /XYZ 39.386457 322.349771 0 ] (ManuelUtilisateur/:creation-des-zones-et-des-windows) [ 993 0 R /XYZ 42.836457 587.042022 0 ] (ManuelUtilisateur/:driver-infos) [ 1050 0 R /XYZ 39.386457 294.880422 0 ] (ManuelUtilisateur/:erreurs) [ 1068 0 R /XYZ 39.386457 634.955622 0 ] (ManuelUtilisateur/:installation) [ 938 0 R /XYZ 39.386457 707.865222 0 ] (ManuelUtilisateur/:last-five-laps) [ 1040 0 R /XYZ 39.386457 206.972850 0 ] (ManuelUtilisateur/:live-ranking) [ 1062 0 R /XYZ 39.386457 771.023622 0 ] (ManuelUtilisateur/:load-un-preset-existant) [ 1030 0 R /XYZ 39.386457 189.089256 0 ] (ManuelUtilisateur/:manuel-utilisateur) [ 938 0 R /XYZ 39.386457 757.223622 0 ] (ManuelUtilisateur/:overtakes) [ 1040 0 R /XYZ 39.386457 307.522050 0 ] (ManuelUtilisateur/:pourquoi-calibrer-lapplication-et-creer-un-preset) [ 977 0 R /XYZ 39.386457 661.536522 0 ] (ManuelUtilisateur/:recuperer-le-lien-vers-le-flux) [ 947 0 R /XYZ 39.386457 347.470422 0 ] (ManuelUtilisateur/:sauvegarder-le-nouveau-preset) [ 1030 0 R /XYZ 42.836457 341.110056 0 ] (ManuelUtilisateur/:utilisation-simple) [ 938 0 R /XYZ 39.386457 391.297422 0 ] (__codelineno-0-1) [ 594 0 R /XYZ 60.307257 407.980122 0 ] (__codelineno-0-10) [ 1071 0 R /XYZ 60.307257 384.489054 0 ] (__codelineno-0-100) [ 1698 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-101) [ 1698 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-102) [ 1698 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-103) [ 1698 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-104) [ 1698 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-105) [ 1698 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-106) [ 1698 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-107) [ 1698 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-108) [ 1698 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-109) [ 1698 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-11) [ 1071 0 R /XYZ 60.307257 371.088702 0 ] (__codelineno-0-110) [ 1698 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-111) [ 1698 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-112) [ 1698 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-113) [ 1698 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-114) [ 1698 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-115) [ 1698 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-116) [ 1698 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-117) [ 1698 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-118) [ 1698 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-119) [ 1698 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-12) [ 1071 0 R /XYZ 60.307257 357.688350 0 ] (__codelineno-0-120) [ 1698 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-121) [ 1698 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-122) [ 1698 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-123) [ 1698 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-124) [ 1698 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-125) [ 1698 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-126) [ 1698 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-127) [ 1698 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-128) [ 1698 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-129) [ 1698 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-13) [ 1071 0 R /XYZ 60.307257 344.287998 0 ] (__codelineno-0-130) [ 1698 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-131) [ 1698 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-132) [ 1698 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-133) [ 1698 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-134) [ 1698 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-135) [ 1698 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-136) [ 1698 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-137) [ 1698 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-138) [ 1698 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-139) [ 1698 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-14) [ 1071 0 R /XYZ 60.307257 330.887646 0 ] (__codelineno-0-140) [ 1698 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-141) [ 1698 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-142) [ 1700 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-143) [ 1700 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-144) [ 1700 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-145) [ 1700 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-146) [ 1700 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-147) [ 1700 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-148) [ 1700 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-149) [ 1700 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-15) [ 1071 0 R /XYZ 60.307257 317.487294 0 ] (__codelineno-0-150) [ 1700 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-151) [ 1700 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-152) [ 1700 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-153) [ 1700 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-154) [ 1700 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-155) [ 1700 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-156) [ 1700 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-157) [ 1700 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-158) [ 1700 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-159) [ 1700 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-16) [ 1071 0 R /XYZ 60.307257 304.086942 0 ] (__codelineno-0-160) [ 1700 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-161) [ 1700 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-162) [ 1700 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-163) [ 1700 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-164) [ 1700 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-165) [ 1700 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-166) [ 1700 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-167) [ 1700 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-168) [ 1700 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-169) [ 1700 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-17) [ 1071 0 R /XYZ 60.307257 290.686590 0 ] (__codelineno-0-170) [ 1700 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-171) [ 1700 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-172) [ 1700 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-173) [ 1700 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-174) [ 1700 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-175) [ 1700 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-176) [ 1700 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-177) [ 1700 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-178) [ 1700 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-179) [ 1700 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-18) [ 1071 0 R /XYZ 60.307257 277.286238 0 ] (__codelineno-0-180) [ 1700 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-181) [ 1700 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-182) [ 1700 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-183) [ 1700 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-184) [ 1700 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-185) [ 1702 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-186) [ 1702 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-187) [ 1702 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-188) [ 1702 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-189) [ 1702 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-19) [ 1071 0 R /XYZ 60.307257 263.885886 0 ] (__codelineno-0-190) [ 1702 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-191) [ 1702 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-192) [ 1702 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-193) [ 1702 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-194) [ 1702 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-195) [ 1702 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-196) [ 1702 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-197) [ 1702 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-198) [ 1702 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-199) [ 1702 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-2) [ 594 0 R /XYZ 60.307257 381.179418 0 ] (__codelineno-0-20) [ 1071 0 R /XYZ 60.307257 250.485534 0 ] (__codelineno-0-200) [ 1702 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-201) [ 1702 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-202) [ 1702 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-203) [ 1702 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-204) [ 1702 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-205) [ 1702 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-206) [ 1702 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-207) [ 1702 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-208) [ 1702 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-209) [ 1702 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-21) [ 1071 0 R /XYZ 60.307257 237.085182 0 ] (__codelineno-0-210) [ 1702 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-211) [ 1702 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-212) [ 1702 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-213) [ 1702 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-214) [ 1702 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-215) [ 1702 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-216) [ 1702 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-217) [ 1702 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-218) [ 1702 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-219) [ 1702 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-22) [ 1071 0 R /XYZ 60.307257 223.684830 0 ] (__codelineno-0-220) [ 1702 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-221) [ 1702 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-222) [ 1702 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-223) [ 1702 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-224) [ 1702 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-225) [ 1702 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-226) [ 1702 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-227) [ 1704 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-228) [ 1704 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-229) [ 1704 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-23) [ 1071 0 R /XYZ 60.307257 210.284478 0 ] (__codelineno-0-230) [ 1704 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-231) [ 1704 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-232) [ 1704 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-233) [ 1704 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-234) [ 1704 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-235) [ 1704 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-236) [ 1704 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-237) [ 1704 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-238) [ 1704 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-239) [ 1704 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-24) [ 1694 0 R /XYZ 60.307257 346.328574 0 ] (__codelineno-0-240) [ 1704 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-241) [ 1704 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-242) [ 1704 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-243) [ 1704 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-244) [ 1704 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-245) [ 1704 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-246) [ 1704 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-247) [ 1704 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-248) [ 1704 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-249) [ 1704 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-25) [ 1694 0 R /XYZ 60.307257 332.928222 0 ] (__codelineno-0-250) [ 1704 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-251) [ 1704 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-252) [ 1704 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-253) [ 1704 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-254) [ 1704 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-255) [ 1704 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-256) [ 1704 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-257) [ 1704 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-258) [ 1704 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-259) [ 1704 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-26) [ 1694 0 R /XYZ 60.307257 319.527870 0 ] (__codelineno-0-260) [ 1704 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-261) [ 1704 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-262) [ 1730 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-263) [ 1730 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-264) [ 1730 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-265) [ 1730 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-266) [ 1730 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-267) [ 1730 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-268) [ 1730 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-269) [ 1730 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-27) [ 1694 0 R /XYZ 60.307257 306.127518 0 ] (__codelineno-0-270) [ 1730 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-271) [ 1730 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-272) [ 1730 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-273) [ 1730 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-274) [ 1730 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-275) [ 1730 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-276) [ 1730 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-277) [ 1730 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-278) [ 1730 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-279) [ 1730 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-28) [ 1694 0 R /XYZ 60.307257 279.326814 0 ] (__codelineno-0-280) [ 1730 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-281) [ 1730 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-282) [ 1730 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-283) [ 1732 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-284) [ 1732 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-285) [ 1732 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-286) [ 1732 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-287) [ 1732 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-288) [ 1732 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-289) [ 1732 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-29) [ 1694 0 R /XYZ 60.307257 265.926462 0 ] (__codelineno-0-290) [ 1732 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-291) [ 1732 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-292) [ 1732 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-293) [ 1732 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-294) [ 1732 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-295) [ 1732 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-296) [ 1732 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-297) [ 1732 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-298) [ 1732 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-299) [ 1732 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-3) [ 1071 0 R /XYZ 60.307257 478.291518 0 ] (__codelineno-0-30) [ 1694 0 R /XYZ 60.307257 239.125758 0 ] (__codelineno-0-300) [ 1732 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-301) [ 1732 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-302) [ 1732 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-303) [ 1732 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-304) [ 1732 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-305) [ 1732 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-306) [ 1732 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-307) [ 1732 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-308) [ 1732 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-309) [ 1732 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-31) [ 1694 0 R /XYZ 60.307257 212.325054 0 ] (__codelineno-0-310) [ 1732 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-311) [ 1732 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-312) [ 1732 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-313) [ 1732 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-314) [ 1732 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-315) [ 1732 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-316) [ 1732 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-317) [ 1732 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-318) [ 1732 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-319) [ 1732 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-32) [ 1694 0 R /XYZ 60.307257 198.924702 0 ] (__codelineno-0-320) [ 1732 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-321) [ 1732 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-322) [ 1732 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-323) [ 1732 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-324) [ 1732 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-325) [ 1732 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-326) [ 1732 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-327) [ 1732 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-328) [ 1732 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-329) [ 1732 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-33) [ 1694 0 R /XYZ 60.307257 185.524350 0 ] (__codelineno-0-330) [ 1748 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-331) [ 1748 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-332) [ 1748 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-333) [ 1748 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-334) [ 1748 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-335) [ 1748 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-336) [ 1748 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-337) [ 1748 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-338) [ 1748 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-339) [ 1748 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-34) [ 1694 0 R /XYZ 60.307257 172.123998 0 ] (__codelineno-0-340) [ 1748 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-341) [ 1748 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-342) [ 1748 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-343) [ 1748 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-344) [ 1748 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-345) [ 1748 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-346) [ 1748 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-347) [ 1748 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-348) [ 1748 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-349) [ 1748 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-35) [ 1694 0 R /XYZ 60.307257 158.723646 0 ] (__codelineno-0-350) [ 1748 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-351) [ 1748 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-352) [ 1748 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-353) [ 1748 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-354) [ 1748 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-355) [ 1748 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-356) [ 1748 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-357) [ 1748 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-358) [ 1748 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-359) [ 1748 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-36) [ 1694 0 R /XYZ 60.307257 145.323294 0 ] (__codelineno-0-360) [ 1748 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-361) [ 1748 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-362) [ 1748 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-363) [ 1748 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-364) [ 1748 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-365) [ 1748 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-366) [ 1748 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-367) [ 1748 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-368) [ 1748 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-369) [ 1748 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-37) [ 1694 0 R /XYZ 60.307257 131.922942 0 ] (__codelineno-0-370) [ 1748 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-371) [ 1748 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-372) [ 1748 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-373) [ 1748 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-374) [ 1748 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-375) [ 1748 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-376) [ 1750 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-377) [ 1750 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-378) [ 1750 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-379) [ 1750 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-38) [ 1694 0 R /XYZ 60.307257 118.522590 0 ] (__codelineno-0-380) [ 1750 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-381) [ 1750 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-382) [ 1750 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-383) [ 1750 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-384) [ 1750 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-385) [ 1750 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-386) [ 1750 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-387) [ 1750 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-388) [ 1750 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-389) [ 1750 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-39) [ 1694 0 R /XYZ 60.307257 105.122238 0 ] (__codelineno-0-390) [ 1750 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-391) [ 1750 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-392) [ 1750 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-393) [ 1750 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-394) [ 1750 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-395) [ 1750 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-396) [ 1750 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-397) [ 1750 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-398) [ 1750 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-399) [ 1750 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-4) [ 1071 0 R /XYZ 60.307257 464.891166 0 ] (__codelineno-0-40) [ 1694 0 R /XYZ 60.307257 91.721886 0 ] (__codelineno-0-400) [ 1750 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-401) [ 1750 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-402) [ 1750 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-403) [ 1750 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-404) [ 1750 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-405) [ 1750 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-406) [ 1750 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-407) [ 1750 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-408) [ 1750 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-409) [ 1750 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-41) [ 1696 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-410) [ 1750 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-411) [ 1750 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-412) [ 1750 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-413) [ 1750 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-414) [ 1750 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-415) [ 1752 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-416) [ 1752 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-417) [ 1752 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-418) [ 1752 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-419) [ 1752 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-42) [ 1696 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-420) [ 1752 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-421) [ 1752 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-422) [ 1752 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-423) [ 1774 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-424) [ 1774 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-425) [ 1774 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-426) [ 1774 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-427) [ 1774 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-428) [ 1774 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-429) [ 1774 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-43) [ 1696 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-430) [ 1774 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-431) [ 1774 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-432) [ 1774 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-433) [ 1774 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-434) [ 1774 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-435) [ 1774 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-436) [ 1774 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-437) [ 1776 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-438) [ 1776 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-439) [ 1776 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-44) [ 1696 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-440) [ 1776 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-441) [ 1776 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-442) [ 1776 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-443) [ 1776 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-444) [ 1776 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-445) [ 1776 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-446) [ 1776 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-447) [ 1776 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-448) [ 1776 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-449) [ 1776 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-45) [ 1696 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-450) [ 1776 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-451) [ 1776 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-452) [ 1776 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-453) [ 1776 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-454) [ 1776 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-455) [ 1776 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-456) [ 1776 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-457) [ 1776 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-458) [ 1776 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-459) [ 1776 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-46) [ 1696 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-460) [ 1776 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-461) [ 1776 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-462) [ 1776 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-463) [ 1776 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-464) [ 1776 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-465) [ 1776 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-466) [ 1776 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-467) [ 1776 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-468) [ 1776 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-469) [ 1776 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-47) [ 1696 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-470) [ 1776 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-471) [ 1776 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-472) [ 1776 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-473) [ 1776 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-474) [ 1776 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-475) [ 1776 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-476) [ 1776 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-477) [ 1776 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-478) [ 1776 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-479) [ 1776 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-48) [ 1696 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-480) [ 1776 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-481) [ 1776 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-482) [ 1776 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-483) [ 1776 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-484) [ 1776 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-485) [ 1778 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-486) [ 1778 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-487) [ 1778 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-488) [ 1778 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-489) [ 1778 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-49) [ 1696 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-490) [ 1778 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-491) [ 1778 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-492) [ 1778 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-493) [ 1778 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-494) [ 1778 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-495) [ 1858 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-496) [ 1860 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-497) [ 1860 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-498) [ 1860 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-499) [ 1860 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-5) [ 1071 0 R /XYZ 60.307257 451.490814 0 ] (__codelineno-0-50) [ 1696 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-500) [ 1860 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-501) [ 1860 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-502) [ 1860 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-503) [ 1860 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-504) [ 1860 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-505) [ 1860 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-506) [ 1860 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-507) [ 1860 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-508) [ 1860 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-509) [ 1860 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-51) [ 1696 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-510) [ 1860 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-511) [ 1860 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-512) [ 1860 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-513) [ 1860 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-514) [ 1860 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-515) [ 1860 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-516) [ 1860 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-517) [ 1860 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-518) [ 1860 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-519) [ 1860 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-52) [ 1696 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-520) [ 1860 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-521) [ 1860 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-522) [ 1860 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-523) [ 1860 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-524) [ 1860 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-525) [ 1860 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-526) [ 1860 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-527) [ 1860 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-528) [ 1860 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-529) [ 1860 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-53) [ 1696 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-530) [ 1860 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-531) [ 1860 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-532) [ 1860 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-533) [ 1860 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-534) [ 1860 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-535) [ 1860 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-536) [ 1860 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-537) [ 1860 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-538) [ 1860 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-539) [ 1860 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-54) [ 1696 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-540) [ 1860 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-541) [ 1860 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-542) [ 1860 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-543) [ 1862 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-544) [ 1862 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-545) [ 1862 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-546) [ 1862 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-547) [ 1862 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-548) [ 1862 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-549) [ 1862 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-55) [ 1696 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-550) [ 1862 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-551) [ 1862 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-552) [ 1862 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-553) [ 1862 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-554) [ 1862 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-555) [ 1862 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-556) [ 1862 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-557) [ 1862 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-558) [ 1862 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-559) [ 1862 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-56) [ 1696 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-560) [ 1862 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-561) [ 1862 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-562) [ 1862 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-563) [ 1862 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-564) [ 1862 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-565) [ 1862 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-566) [ 1862 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-567) [ 1862 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-568) [ 1862 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-569) [ 1862 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-57) [ 1696 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-570) [ 1862 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-571) [ 1862 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-572) [ 1862 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-573) [ 1862 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-574) [ 1862 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-575) [ 1862 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-576) [ 1862 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-577) [ 1862 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-578) [ 1862 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-579) [ 1862 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-58) [ 1696 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-580) [ 1862 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-581) [ 1862 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-582) [ 1862 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-583) [ 1862 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-584) [ 1862 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-585) [ 1862 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-586) [ 1862 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-587) [ 1862 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-588) [ 1862 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-589) [ 1862 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-59) [ 1696 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-590) [ 1864 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-591) [ 1864 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-592) [ 1864 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-593) [ 1864 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-594) [ 1864 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-595) [ 1864 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-596) [ 1864 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-597) [ 1864 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-598) [ 1864 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-599) [ 1864 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-6) [ 1071 0 R /XYZ 60.307257 438.090462 0 ] (__codelineno-0-60) [ 1696 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-600) [ 1864 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-601) [ 1864 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-602) [ 1864 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-603) [ 1864 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-604) [ 1864 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-605) [ 1864 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-606) [ 1864 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-607) [ 1864 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-608) [ 1864 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-609) [ 1864 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-61) [ 1696 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-610) [ 1864 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-611) [ 1864 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-612) [ 1864 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-613) [ 1864 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-614) [ 1864 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-615) [ 1864 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-616) [ 1864 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-617) [ 1864 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-618) [ 1864 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-619) [ 1864 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-62) [ 1696 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-620) [ 1864 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-621) [ 1864 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-622) [ 1864 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-623) [ 1864 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-624) [ 1864 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-625) [ 1864 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-626) [ 1864 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-627) [ 1864 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-628) [ 1864 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-629) [ 1864 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-63) [ 1696 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-630) [ 1864 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-631) [ 1864 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-632) [ 1864 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-633) [ 1864 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-634) [ 1864 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-635) [ 1864 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-636) [ 1864 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-637) [ 1864 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-638) [ 1866 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-639) [ 1866 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-64) [ 1696 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-640) [ 1866 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-641) [ 1866 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-642) [ 1866 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-643) [ 1866 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-644) [ 1866 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-645) [ 1866 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-646) [ 1866 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-647) [ 1866 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-648) [ 1866 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-649) [ 1866 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-65) [ 1696 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-650) [ 1866 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-651) [ 1866 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-652) [ 1866 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-653) [ 1866 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-654) [ 1866 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-655) [ 1866 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-656) [ 1866 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-657) [ 1866 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-658) [ 1866 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-659) [ 1866 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-66) [ 1696 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-660) [ 1866 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-661) [ 1866 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-662) [ 1866 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-663) [ 1866 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-664) [ 1866 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-665) [ 1866 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-666) [ 1866 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-667) [ 1866 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-668) [ 1866 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-669) [ 1866 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-67) [ 1696 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-670) [ 1866 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-671) [ 1866 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-672) [ 1866 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-673) [ 1866 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-674) [ 1934 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-675) [ 1934 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-676) [ 1934 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-68) [ 1696 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-69) [ 1696 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-7) [ 1071 0 R /XYZ 60.307257 424.690110 0 ] (__codelineno-0-70) [ 1696 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-71) [ 1696 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-72) [ 1696 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-73) [ 1696 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-74) [ 1696 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-75) [ 1696 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-76) [ 1696 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-77) [ 1696 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-78) [ 1696 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-79) [ 1696 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-8) [ 1071 0 R /XYZ 60.307257 411.289758 0 ] (__codelineno-0-80) [ 1696 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-81) [ 1696 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-82) [ 1696 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-83) [ 1696 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-84) [ 1696 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-85) [ 1696 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-86) [ 1696 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-87) [ 1696 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-88) [ 1696 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-89) [ 1696 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-9) [ 1071 0 R /XYZ 60.307257 397.889406 0 ] (__codelineno-0-90) [ 1698 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-91) [ 1698 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-92) [ 1698 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-93) [ 1698 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-94) [ 1698 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-95) [ 1698 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-96) [ 1698 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-97) [ 1698 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-98) [ 1698 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-99) [ 1698 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-1-1) [ 598 0 R /XYZ 60.307257 202.470522 0 ] (__codelineno-1-10) [ 600 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-1-11) [ 600 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-1-12) [ 600 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-1-13) [ 600 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-1-2) [ 598 0 R /XYZ 60.307257 189.070170 0 ] (__codelineno-1-3) [ 598 0 R /XYZ 60.307257 175.669818 0 ] (__codelineno-1-4) [ 598 0 R /XYZ 60.307257 162.269466 0 ] (__codelineno-1-5) [ 598 0 R /XYZ 60.307257 148.869114 0 ] (__codelineno-1-6) [ 598 0 R /XYZ 60.307257 135.468762 0 ] (__codelineno-1-7) [ 598 0 R /XYZ 60.307257 122.068410 0 ] (__codelineno-1-8) [ 598 0 R /XYZ 60.307257 108.668058 0 ] (__codelineno-1-9) [ 598 0 R /XYZ 60.307257 95.267706 0 ] (__codelineno-10-1) [ 878 0 R /XYZ 60.307257 140.764186 0 ] (__codelineno-10-10) [ 883 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-10-11) [ 883 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-10-12) [ 883 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-10-13) [ 883 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-10-14) [ 883 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-10-15) [ 883 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-10-16) [ 883 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-10-17) [ 883 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-10-18) [ 883 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-10-19) [ 883 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-10-2) [ 878 0 R /XYZ 60.307257 113.963482 0 ] (__codelineno-10-20) [ 883 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-10-21) [ 883 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-10-22) [ 883 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-10-23) [ 883 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-10-24) [ 883 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-10-25) [ 883 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-10-26) [ 883 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-10-27) [ 883 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-10-28) [ 883 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-10-29) [ 883 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-10-3) [ 878 0 R /XYZ 60.307257 100.563130 0 ] (__codelineno-10-4) [ 878 0 R /XYZ 60.307257 87.162778 0 ] (__codelineno-10-5) [ 883 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-10-6) [ 883 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-10-7) [ 883 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-10-8) [ 883 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-10-9) [ 883 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-11-1) [ 894 0 R /XYZ 60.307257 186.718980 0 ] (__codelineno-11-10) [ 898 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-11-11) [ 898 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-11-12) [ 898 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-11-13) [ 898 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-11-14) [ 898 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-11-15) [ 898 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-11-16) [ 898 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-11-17) [ 1277 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-11-18) [ 1277 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-11-19) [ 1277 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-11-2) [ 894 0 R /XYZ 60.307257 159.918276 0 ] (__codelineno-11-20) [ 1277 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-11-21) [ 1277 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-11-22) [ 1277 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-11-3) [ 894 0 R /XYZ 60.307257 133.117572 0 ] (__codelineno-11-4) [ 894 0 R /XYZ 60.307257 119.717220 0 ] (__codelineno-11-5) [ 894 0 R /XYZ 60.307257 106.316868 0 ] (__codelineno-11-6) [ 898 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-11-7) [ 898 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-11-8) [ 898 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-11-9) [ 898 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-12-1) [ 900 0 R /XYZ 60.307257 186.377322 0 ] (__codelineno-12-10) [ 902 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-12-11) [ 902 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-12-12) [ 902 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-12-13) [ 902 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-12-14) [ 902 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-12-15) [ 902 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-12-16) [ 902 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-12-17) [ 902 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-12-18) [ 902 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-12-19) [ 902 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-12-2) [ 900 0 R /XYZ 60.307257 172.976970 0 ] (__codelineno-12-20) [ 902 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-12-21) [ 902 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-12-22) [ 902 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-12-23) [ 902 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-12-24) [ 902 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-12-25) [ 902 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-12-26) [ 902 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-12-27) [ 902 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-12-28) [ 902 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-12-29) [ 902 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-12-3) [ 900 0 R /XYZ 60.307257 159.576618 0 ] (__codelineno-12-30) [ 902 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-12-31) [ 902 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-12-32) [ 902 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-12-33) [ 902 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-12-34) [ 902 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-12-35) [ 902 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-12-36) [ 902 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-12-4) [ 900 0 R /XYZ 60.307257 146.176266 0 ] (__codelineno-12-5) [ 900 0 R /XYZ 60.307257 132.775914 0 ] (__codelineno-12-6) [ 900 0 R /XYZ 60.307257 119.375562 0 ] (__codelineno-12-7) [ 900 0 R /XYZ 60.307257 105.975210 0 ] (__codelineno-12-8) [ 900 0 R /XYZ 60.307257 92.574858 0 ] (__codelineno-12-9) [ 902 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-13-1) [ 1281 0 R /XYZ 60.307257 722.344122 0 ] (__codelineno-13-2) [ 1281 0 R /XYZ 60.307257 708.943770 0 ] (__codelineno-13-3) [ 1281 0 R /XYZ 60.307257 695.543418 0 ] (__codelineno-13-4) [ 1281 0 R /XYZ 60.307257 682.143066 0 ] (__codelineno-13-5) [ 1281 0 R /XYZ 60.307257 668.742714 0 ] (__codelineno-13-6) [ 1281 0 R /XYZ 60.307257 655.342362 0 ] (__codelineno-13-7) [ 1281 0 R /XYZ 60.307257 641.942010 0 ] (__codelineno-13-8) [ 1281 0 R /XYZ 60.307257 628.541658 0 ] (__codelineno-13-9) [ 1281 0 R /XYZ 60.307257 615.141306 0 ] (__codelineno-14-1) [ 1281 0 R /XYZ 60.307257 510.012354 0 ] (__codelineno-14-2) [ 1281 0 R /XYZ 60.307257 496.612002 0 ] (__codelineno-14-3) [ 1281 0 R /XYZ 60.307257 483.211650 0 ] (__codelineno-14-4) [ 1281 0 R /XYZ 60.307257 469.811298 0 ] (__codelineno-14-5) [ 1281 0 R /XYZ 60.307257 456.410946 0 ] (__codelineno-14-6) [ 1281 0 R /XYZ 60.307257 443.010594 0 ] (__codelineno-14-7) [ 1281 0 R /XYZ 60.307257 429.610242 0 ] (__codelineno-14-8) [ 1281 0 R /XYZ 60.307257 416.209890 0 ] (__codelineno-14-9) [ 1281 0 R /XYZ 60.307257 402.809538 0 ] (__codelineno-15-1) [ 1319 0 R /XYZ 60.307257 512.569722 0 ] (__codelineno-15-10) [ 1319 0 R /XYZ 60.307257 391.966554 0 ] (__codelineno-15-11) [ 1319 0 R /XYZ 60.307257 378.566202 0 ] (__codelineno-15-12) [ 1319 0 R /XYZ 60.307257 365.165850 0 ] (__codelineno-15-13) [ 1319 0 R /XYZ 60.307257 351.765498 0 ] (__codelineno-15-14) [ 1319 0 R /XYZ 60.307257 338.365146 0 ] (__codelineno-15-15) [ 1319 0 R /XYZ 60.307257 324.964794 0 ] (__codelineno-15-16) [ 1319 0 R /XYZ 60.307257 311.564442 0 ] (__codelineno-15-17) [ 1319 0 R /XYZ 60.307257 298.164090 0 ] (__codelineno-15-18) [ 1319 0 R /XYZ 60.307257 284.763738 0 ] (__codelineno-15-2) [ 1319 0 R /XYZ 60.307257 499.169370 0 ] (__codelineno-15-3) [ 1319 0 R /XYZ 60.307257 485.769018 0 ] (__codelineno-15-4) [ 1319 0 R /XYZ 60.307257 472.368666 0 ] (__codelineno-15-5) [ 1319 0 R /XYZ 60.307257 458.968314 0 ] (__codelineno-15-6) [ 1319 0 R /XYZ 60.307257 445.567962 0 ] (__codelineno-15-7) [ 1319 0 R /XYZ 60.307257 432.167610 0 ] (__codelineno-15-8) [ 1319 0 R /XYZ 60.307257 418.767258 0 ] (__codelineno-15-9) [ 1319 0 R /XYZ 60.307257 405.366906 0 ] (__codelineno-16-1) [ 1324 0 R /XYZ 60.307257 422.361822 0 ] (__codelineno-16-10) [ 1324 0 R /XYZ 60.307257 301.758654 0 ] (__codelineno-16-11) [ 1324 0 R /XYZ 60.307257 288.358302 0 ] (__codelineno-16-12) [ 1324 0 R /XYZ 60.307257 274.957950 0 ] (__codelineno-16-13) [ 1324 0 R /XYZ 60.307257 261.557598 0 ] (__codelineno-16-14) [ 1324 0 R /XYZ 60.307257 248.157246 0 ] (__codelineno-16-15) [ 1324 0 R /XYZ 60.307257 234.756894 0 ] (__codelineno-16-16) [ 1324 0 R /XYZ 60.307257 221.356542 0 ] (__codelineno-16-17) [ 1324 0 R /XYZ 60.307257 207.956190 0 ] (__codelineno-16-18) [ 1324 0 R /XYZ 60.307257 194.555838 0 ] (__codelineno-16-2) [ 1324 0 R /XYZ 60.307257 408.961470 0 ] (__codelineno-16-3) [ 1324 0 R /XYZ 60.307257 395.561118 0 ] (__codelineno-16-4) [ 1324 0 R /XYZ 60.307257 382.160766 0 ] (__codelineno-16-5) [ 1324 0 R /XYZ 60.307257 368.760414 0 ] (__codelineno-16-6) [ 1324 0 R /XYZ 60.307257 355.360062 0 ] (__codelineno-16-7) [ 1324 0 R /XYZ 60.307257 341.959710 0 ] (__codelineno-16-8) [ 1324 0 R /XYZ 60.307257 328.559358 0 ] (__codelineno-16-9) [ 1324 0 R /XYZ 60.307257 315.159006 0 ] (__codelineno-17-1) [ 1335 0 R /XYZ 60.307257 363.601105 0 ] (__codelineno-17-10) [ 1335 0 R /XYZ 60.307257 242.997937 0 ] (__codelineno-17-11) [ 1335 0 R /XYZ 60.307257 229.597585 0 ] (__codelineno-17-12) [ 1335 0 R /XYZ 60.307257 202.796881 0 ] (__codelineno-17-13) [ 1335 0 R /XYZ 60.307257 189.396529 0 ] (__codelineno-17-14) [ 1335 0 R /XYZ 60.307257 175.996177 0 ] (__codelineno-17-15) [ 1335 0 R /XYZ 60.307257 162.595825 0 ] (__codelineno-17-16) [ 1335 0 R /XYZ 60.307257 149.195473 0 ] (__codelineno-17-17) [ 1335 0 R /XYZ 60.307257 135.795121 0 ] (__codelineno-17-18) [ 1335 0 R /XYZ 60.307257 122.394769 0 ] (__codelineno-17-19) [ 1335 0 R /XYZ 60.307257 108.994417 0 ] (__codelineno-17-2) [ 1335 0 R /XYZ 60.307257 350.200753 0 ] (__codelineno-17-20) [ 1335 0 R /XYZ 60.307257 95.594065 0 ] (__codelineno-17-21) [ 1339 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-17-22) [ 1339 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-17-23) [ 1339 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-17-24) [ 1339 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-17-3) [ 1335 0 R /XYZ 60.307257 336.800401 0 ] (__codelineno-17-4) [ 1335 0 R /XYZ 60.307257 323.400049 0 ] (__codelineno-17-5) [ 1335 0 R /XYZ 60.307257 309.999697 0 ] (__codelineno-17-6) [ 1335 0 R /XYZ 60.307257 296.599345 0 ] (__codelineno-17-7) [ 1335 0 R /XYZ 60.307257 283.198993 0 ] (__codelineno-17-8) [ 1335 0 R /XYZ 60.307257 269.798641 0 ] (__codelineno-17-9) [ 1335 0 R /XYZ 60.307257 256.398289 0 ] (__codelineno-18-1) [ 1370 0 R /XYZ 60.307257 236.252922 0 ] (__codelineno-18-10) [ 1372 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-18-11) [ 1372 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-18-12) [ 1372 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-18-13) [ 1372 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-18-14) [ 1372 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-18-15) [ 1372 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-18-16) [ 1372 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-18-17) [ 1372 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-18-18) [ 1372 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-18-2) [ 1370 0 R /XYZ 60.307257 222.852570 0 ] (__codelineno-18-3) [ 1370 0 R /XYZ 60.307257 209.452218 0 ] (__codelineno-18-4) [ 1370 0 R /XYZ 60.307257 169.251162 0 ] (__codelineno-18-5) [ 1370 0 R /XYZ 60.307257 142.450458 0 ] (__codelineno-18-6) [ 1370 0 R /XYZ 60.307257 129.050106 0 ] (__codelineno-18-7) [ 1370 0 R /XYZ 60.307257 115.649754 0 ] (__codelineno-18-8) [ 1370 0 R /XYZ 60.307257 88.849050 0 ] (__codelineno-18-9) [ 1372 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-19-1) [ 1372 0 R /XYZ 60.307257 464.101134 0 ] (__codelineno-19-2) [ 1372 0 R /XYZ 60.307257 450.700782 0 ] (__codelineno-19-3) [ 1372 0 R /XYZ 60.307257 437.300430 0 ] (__codelineno-19-4) [ 1372 0 R /XYZ 60.307257 423.900078 0 ] (__codelineno-2-1) [ 600 0 R /XYZ 60.307257 422.999214 0 ] (__codelineno-2-10) [ 600 0 R /XYZ 60.307257 302.396046 0 ] (__codelineno-2-11) [ 600 0 R /XYZ 60.307257 275.595342 0 ] (__codelineno-2-12) [ 600 0 R /XYZ 60.307257 262.194990 0 ] (__codelineno-2-13) [ 600 0 R /XYZ 60.307257 248.794638 0 ] (__codelineno-2-14) [ 600 0 R /XYZ 60.307257 235.394286 0 ] (__codelineno-2-15) [ 600 0 R /XYZ 60.307257 221.993934 0 ] (__codelineno-2-16) [ 600 0 R /XYZ 60.307257 208.593582 0 ] (__codelineno-2-17) [ 600 0 R /XYZ 60.307257 195.193230 0 ] (__codelineno-2-18) [ 600 0 R /XYZ 60.307257 181.792878 0 ] (__codelineno-2-19) [ 600 0 R /XYZ 60.307257 168.392526 0 ] (__codelineno-2-2) [ 600 0 R /XYZ 60.307257 409.598862 0 ] (__codelineno-2-20) [ 600 0 R /XYZ 60.307257 154.992174 0 ] (__codelineno-2-21) [ 600 0 R /XYZ 60.307257 141.591822 0 ] (__codelineno-2-22) [ 600 0 R /XYZ 60.307257 128.191470 0 ] (__codelineno-2-23) [ 600 0 R /XYZ 60.307257 114.791118 0 ] (__codelineno-2-24) [ 600 0 R /XYZ 60.307257 101.390766 0 ] (__codelineno-2-25) [ 600 0 R /XYZ 60.307257 87.990414 0 ] (__codelineno-2-26) [ 602 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-2-27) [ 602 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-2-28) [ 602 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-2-3) [ 600 0 R /XYZ 60.307257 396.198510 0 ] (__codelineno-2-4) [ 600 0 R /XYZ 60.307257 382.798158 0 ] (__codelineno-2-5) [ 600 0 R /XYZ 60.307257 369.397806 0 ] (__codelineno-2-6) [ 600 0 R /XYZ 60.307257 355.997454 0 ] (__codelineno-2-7) [ 600 0 R /XYZ 60.307257 342.597102 0 ] (__codelineno-2-8) [ 600 0 R /XYZ 60.307257 329.196750 0 ] (__codelineno-2-9) [ 600 0 R /XYZ 60.307257 315.796398 0 ] (__codelineno-20-1) [ 1372 0 R /XYZ 60.307257 333.785526 0 ] (__codelineno-20-2) [ 1372 0 R /XYZ 60.307257 320.385174 0 ] (__codelineno-20-3) [ 1372 0 R /XYZ 60.307257 306.984822 0 ] (__codelineno-20-4) [ 1372 0 R /XYZ 60.307257 293.584470 0 ] (__codelineno-21-1) [ 1372 0 R /XYZ 60.307257 227.868318 0 ] (__codelineno-21-2) [ 1372 0 R /XYZ 60.307257 214.467966 0 ] (__codelineno-21-3) [ 1372 0 R /XYZ 60.307257 201.067614 0 ] (__codelineno-21-4) [ 1372 0 R /XYZ 60.307257 187.667262 0 ] (__codelineno-21-5) [ 1372 0 R /XYZ 60.307257 174.266910 0 ] (__codelineno-21-6) [ 1372 0 R /XYZ 60.307257 160.866558 0 ] (__codelineno-21-7) [ 1372 0 R /XYZ 60.307257 134.065854 0 ] (__codelineno-21-8) [ 1372 0 R /XYZ 60.307257 120.665502 0 ] (__codelineno-22-1) [ 1374 0 R /XYZ 60.307257 697.945722 0 ] (__codelineno-22-2) [ 1374 0 R /XYZ 60.307257 684.545370 0 ] (__codelineno-22-3) [ 1374 0 R /XYZ 60.307257 671.145018 0 ] (__codelineno-22-4) [ 1374 0 R /XYZ 60.307257 644.344314 0 ] (__codelineno-22-5) [ 1374 0 R /XYZ 60.307257 630.943962 0 ] (__codelineno-23-1) [ 1391 0 R /XYZ 60.307257 422.056122 0 ] (__codelineno-23-2) [ 1391 0 R /XYZ 60.307257 381.855066 0 ] (__codelineno-23-3) [ 1391 0 R /XYZ 60.307257 368.454714 0 ] (__codelineno-23-4) [ 1391 0 R /XYZ 60.307257 355.054362 0 ] (__codelineno-23-5) [ 1391 0 R /XYZ 60.307257 341.654010 0 ] (__codelineno-24-1) [ 1396 0 R /XYZ 60.307257 520.588122 0 ] (__codelineno-24-10) [ 1396 0 R /XYZ 60.307257 373.184250 0 ] (__codelineno-24-2) [ 1396 0 R /XYZ 60.307257 480.387066 0 ] (__codelineno-24-3) [ 1396 0 R /XYZ 60.307257 466.986714 0 ] (__codelineno-24-4) [ 1396 0 R /XYZ 60.307257 453.586362 0 ] (__codelineno-24-5) [ 1396 0 R /XYZ 60.307257 440.186010 0 ] (__codelineno-24-6) [ 1396 0 R /XYZ 60.307257 426.785658 0 ] (__codelineno-24-7) [ 1396 0 R /XYZ 60.307257 413.385306 0 ] (__codelineno-24-8) [ 1396 0 R /XYZ 60.307257 399.984954 0 ] (__codelineno-24-9) [ 1396 0 R /XYZ 60.307257 386.584602 0 ] (__codelineno-25-1) [ 1398 0 R /XYZ 60.307257 342.292122 0 ] (__codelineno-25-10) [ 1398 0 R /XYZ 60.307257 221.688954 0 ] (__codelineno-25-11) [ 1398 0 R /XYZ 60.307257 208.288602 0 ] (__codelineno-25-12) [ 1398 0 R /XYZ 60.307257 194.888250 0 ] (__codelineno-25-13) [ 1398 0 R /XYZ 60.307257 181.487898 0 ] (__codelineno-25-14) [ 1398 0 R /XYZ 60.307257 168.087546 0 ] (__codelineno-25-15) [ 1398 0 R /XYZ 60.307257 154.687194 0 ] (__codelineno-25-16) [ 1398 0 R /XYZ 60.307257 141.286842 0 ] (__codelineno-25-17) [ 1398 0 R /XYZ 60.307257 127.886490 0 ] (__codelineno-25-18) [ 1398 0 R /XYZ 60.307257 114.486138 0 ] (__codelineno-25-19) [ 1398 0 R /XYZ 60.307257 101.085786 0 ] (__codelineno-25-2) [ 1398 0 R /XYZ 60.307257 328.891770 0 ] (__codelineno-25-20) [ 1398 0 R /XYZ 60.307257 87.685434 0 ] (__codelineno-25-21) [ 1400 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-25-22) [ 1400 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-25-23) [ 1400 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-25-24) [ 1400 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-25-25) [ 1400 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-25-26) [ 1400 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-25-27) [ 1400 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-25-28) [ 1400 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-25-29) [ 1400 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-25-3) [ 1398 0 R /XYZ 60.307257 315.491418 0 ] (__codelineno-25-30) [ 1400 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-25-31) [ 1400 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-25-32) [ 1400 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-25-33) [ 1400 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-25-34) [ 1400 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-25-35) [ 1400 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-25-36) [ 1400 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-25-37) [ 1400 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-25-38) [ 1400 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-25-39) [ 1400 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-25-4) [ 1398 0 R /XYZ 60.307257 302.091066 0 ] (__codelineno-25-40) [ 1400 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-25-41) [ 1400 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-25-42) [ 1400 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-25-43) [ 1400 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-25-44) [ 1400 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-25-45) [ 1400 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-25-46) [ 1400 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-25-47) [ 1400 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-25-48) [ 1400 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-25-49) [ 1400 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-25-5) [ 1398 0 R /XYZ 60.307257 288.690714 0 ] (__codelineno-25-50) [ 1400 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-25-51) [ 1400 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-25-52) [ 1400 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-25-53) [ 1400 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-25-54) [ 1400 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-25-55) [ 1400 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-25-56) [ 1400 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-25-57) [ 1400 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-25-58) [ 1400 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-25-59) [ 1400 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-25-6) [ 1398 0 R /XYZ 60.307257 275.290362 0 ] (__codelineno-25-60) [ 1400 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-25-61) [ 1400 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-25-62) [ 1400 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-25-63) [ 1400 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-25-64) [ 1400 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-25-65) [ 1400 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-25-66) [ 1400 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-25-67) [ 1400 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-25-68) [ 1400 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-25-7) [ 1398 0 R /XYZ 60.307257 261.890010 0 ] (__codelineno-25-8) [ 1398 0 R /XYZ 60.307257 248.489658 0 ] (__codelineno-25-9) [ 1398 0 R /XYZ 60.307257 235.089306 0 ] (__codelineno-26-1) [ 1402 0 R /XYZ 60.307257 412.672122 0 ] (__codelineno-26-2) [ 1402 0 R /XYZ 60.307257 385.871418 0 ] (__codelineno-26-3) [ 1402 0 R /XYZ 60.307257 372.471066 0 ] (__codelineno-26-4) [ 1402 0 R /XYZ 60.307257 345.670362 0 ] (__codelineno-26-5) [ 1402 0 R /XYZ 60.307257 332.270010 0 ] (__codelineno-26-6) [ 1402 0 R /XYZ 60.307257 305.469306 0 ] (__codelineno-27-1) [ 1442 0 R /XYZ 60.307257 292.862622 0 ] (__codelineno-27-10) [ 1442 0 R /XYZ 60.307257 158.859102 0 ] (__codelineno-27-2) [ 1442 0 R /XYZ 60.307257 279.462270 0 ] (__codelineno-27-3) [ 1442 0 R /XYZ 60.307257 266.061918 0 ] (__codelineno-27-4) [ 1442 0 R /XYZ 60.307257 252.661566 0 ] (__codelineno-27-5) [ 1442 0 R /XYZ 60.307257 239.261214 0 ] (__codelineno-27-6) [ 1442 0 R /XYZ 60.307257 225.860862 0 ] (__codelineno-27-7) [ 1442 0 R /XYZ 60.307257 212.460510 0 ] (__codelineno-27-8) [ 1442 0 R /XYZ 60.307257 185.659806 0 ] (__codelineno-27-9) [ 1442 0 R /XYZ 60.307257 172.259454 0 ] (__codelineno-28-1) [ 1446 0 R /XYZ 60.307257 722.344122 0 ] (__codelineno-28-10) [ 1446 0 R /XYZ 60.307257 548.139546 0 ] (__codelineno-28-11) [ 1446 0 R /XYZ 60.307257 534.739194 0 ] (__codelineno-28-12) [ 1446 0 R /XYZ 60.307257 521.338842 0 ] (__codelineno-28-13) [ 1446 0 R /XYZ 60.307257 507.938490 0 ] (__codelineno-28-14) [ 1446 0 R /XYZ 60.307257 467.737434 0 ] (__codelineno-28-15) [ 1446 0 R /XYZ 60.307257 454.337082 0 ] (__codelineno-28-16) [ 1446 0 R /XYZ 60.307257 440.936730 0 ] (__codelineno-28-17) [ 1446 0 R /XYZ 60.307257 427.536378 0 ] (__codelineno-28-2) [ 1446 0 R /XYZ 60.307257 708.943770 0 ] (__codelineno-28-3) [ 1446 0 R /XYZ 60.307257 668.742714 0 ] (__codelineno-28-4) [ 1446 0 R /XYZ 60.307257 655.342362 0 ] (__codelineno-28-5) [ 1446 0 R /XYZ 60.307257 641.942010 0 ] (__codelineno-28-6) [ 1446 0 R /XYZ 60.307257 628.541658 0 ] (__codelineno-28-7) [ 1446 0 R /XYZ 60.307257 601.740954 0 ] (__codelineno-28-8) [ 1446 0 R /XYZ 60.307257 588.340602 0 ] (__codelineno-28-9) [ 1446 0 R /XYZ 60.307257 574.940250 0 ] (__codelineno-29-1) [ 1446 0 R /XYZ 60.307257 361.820226 0 ] (__codelineno-29-2) [ 1446 0 R /XYZ 60.307257 348.419874 0 ] (__codelineno-29-3) [ 1446 0 R /XYZ 60.307257 335.019522 0 ] (__codelineno-29-4) [ 1446 0 R /XYZ 60.307257 321.619170 0 ] (__codelineno-29-5) [ 1446 0 R /XYZ 60.307257 308.218818 0 ] (__codelineno-3-1) [ 602 0 R /XYZ 60.307257 678.506766 0 ] (__codelineno-3-10) [ 602 0 R /XYZ 60.307257 557.903598 0 ] (__codelineno-3-11) [ 602 0 R /XYZ 60.307257 544.503246 0 ] (__codelineno-3-12) [ 602 0 R /XYZ 60.307257 531.102894 0 ] (__codelineno-3-13) [ 1099 0 R /XYZ 60.307257 504.302190 0 ] (__codelineno-3-14) [ 1099 0 R /XYZ 60.307257 477.501486 0 ] (__codelineno-3-15) [ 1099 0 R /XYZ 60.307257 464.101134 0 ] (__codelineno-3-16) [ 1099 0 R /XYZ 60.307257 437.300430 0 ] (__codelineno-3-17) [ 1099 0 R /XYZ 60.307257 423.900078 0 ] (__codelineno-3-18) [ 1099 0 R /XYZ 60.307257 410.499726 0 ] (__codelineno-3-19) [ 1099 0 R /XYZ 60.307257 397.099374 0 ] (__codelineno-3-2) [ 602 0 R /XYZ 60.307257 665.106414 0 ] (__codelineno-3-20) [ 1099 0 R /XYZ 60.307257 383.699022 0 ] (__codelineno-3-21) [ 1099 0 R /XYZ 60.307257 370.298670 0 ] (__codelineno-3-22) [ 1099 0 R /XYZ 60.307257 356.898318 0 ] (__codelineno-3-3) [ 602 0 R /XYZ 60.307257 651.706062 0 ] (__codelineno-3-4) [ 602 0 R /XYZ 60.307257 638.305710 0 ] (__codelineno-3-5) [ 602 0 R /XYZ 60.307257 624.905358 0 ] (__codelineno-3-6) [ 602 0 R /XYZ 60.307257 611.505006 0 ] (__codelineno-3-7) [ 602 0 R /XYZ 60.307257 598.104654 0 ] (__codelineno-3-8) [ 602 0 R /XYZ 60.307257 584.704302 0 ] (__codelineno-3-9) [ 602 0 R /XYZ 60.307257 571.303950 0 ] (__codelineno-30-1) [ 1450 0 R /XYZ 60.307257 763.633722 0 ] (__codelineno-30-2) [ 1450 0 R /XYZ 60.307257 750.233370 0 ] (__codelineno-31-1) [ 1515 0 R /XYZ 60.307257 525.280122 0 ] (__codelineno-31-10) [ 1515 0 R /XYZ 60.307257 404.676954 0 ] (__codelineno-31-11) [ 1515 0 R /XYZ 60.307257 391.276602 0 ] (__codelineno-31-12) [ 1515 0 R /XYZ 60.307257 377.876250 0 ] (__codelineno-31-13) [ 1515 0 R /XYZ 60.307257 364.475898 0 ] (__codelineno-31-14) [ 1515 0 R /XYZ 60.307257 351.075546 0 ] (__codelineno-31-15) [ 1515 0 R /XYZ 60.307257 337.675194 0 ] (__codelineno-31-16) [ 1515 0 R /XYZ 60.307257 324.274842 0 ] (__codelineno-31-17) [ 1515 0 R /XYZ 60.307257 310.874490 0 ] (__codelineno-31-18) [ 1515 0 R /XYZ 60.307257 297.474138 0 ] (__codelineno-31-19) [ 1515 0 R /XYZ 60.307257 284.073786 0 ] (__codelineno-31-2) [ 1515 0 R /XYZ 60.307257 511.879770 0 ] (__codelineno-31-20) [ 1515 0 R /XYZ 60.307257 270.673434 0 ] (__codelineno-31-21) [ 1515 0 R /XYZ 60.307257 257.273082 0 ] (__codelineno-31-22) [ 1515 0 R /XYZ 60.307257 243.872730 0 ] (__codelineno-31-23) [ 1515 0 R /XYZ 60.307257 230.472378 0 ] (__codelineno-31-24) [ 1515 0 R /XYZ 60.307257 217.072026 0 ] (__codelineno-31-25) [ 1515 0 R /XYZ 60.307257 203.671674 0 ] (__codelineno-31-26) [ 1515 0 R /XYZ 60.307257 190.271322 0 ] (__codelineno-31-27) [ 1515 0 R /XYZ 60.307257 176.870970 0 ] (__codelineno-31-28) [ 1515 0 R /XYZ 60.307257 163.470618 0 ] (__codelineno-31-29) [ 1515 0 R /XYZ 60.307257 150.070266 0 ] (__codelineno-31-3) [ 1515 0 R /XYZ 60.307257 498.479418 0 ] (__codelineno-31-30) [ 1515 0 R /XYZ 60.307257 136.669914 0 ] (__codelineno-31-31) [ 1515 0 R /XYZ 60.307257 123.269562 0 ] (__codelineno-31-32) [ 1515 0 R /XYZ 60.307257 109.869210 0 ] (__codelineno-31-33) [ 1515 0 R /XYZ 60.307257 96.468858 0 ] (__codelineno-31-34) [ 1517 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-31-35) [ 1517 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-31-36) [ 1517 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-31-37) [ 1517 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-31-38) [ 1517 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-31-39) [ 1517 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-31-4) [ 1515 0 R /XYZ 60.307257 485.079066 0 ] (__codelineno-31-40) [ 1517 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-31-41) [ 1517 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-31-42) [ 1517 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-31-43) [ 1517 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-31-44) [ 1517 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-31-45) [ 1517 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-31-46) [ 1517 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-31-47) [ 1517 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-31-48) [ 1517 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-31-49) [ 1517 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-31-5) [ 1515 0 R /XYZ 60.307257 471.678714 0 ] (__codelineno-31-50) [ 1517 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-31-6) [ 1515 0 R /XYZ 60.307257 458.278362 0 ] (__codelineno-31-7) [ 1515 0 R /XYZ 60.307257 444.878010 0 ] (__codelineno-31-8) [ 1515 0 R /XYZ 60.307257 431.477658 0 ] (__codelineno-31-9) [ 1515 0 R /XYZ 60.307257 418.077306 0 ] (__codelineno-32-1) [ 1536 0 R /XYZ 60.307257 737.358522 0 ] (__codelineno-32-10) [ 1536 0 R /XYZ 60.307257 603.355002 0 ] (__codelineno-32-11) [ 1536 0 R /XYZ 60.307257 589.954650 0 ] (__codelineno-32-12) [ 1536 0 R /XYZ 60.307257 576.554298 0 ] (__codelineno-32-13) [ 1536 0 R /XYZ 60.307257 563.153946 0 ] (__codelineno-32-14) [ 1536 0 R /XYZ 60.307257 549.753594 0 ] (__codelineno-32-15) [ 1536 0 R /XYZ 60.307257 536.353242 0 ] (__codelineno-32-16) [ 1536 0 R /XYZ 60.307257 522.952890 0 ] (__codelineno-32-17) [ 1536 0 R /XYZ 60.307257 509.552538 0 ] (__codelineno-32-18) [ 1536 0 R /XYZ 60.307257 482.751834 0 ] (__codelineno-32-19) [ 1536 0 R /XYZ 60.307257 455.951130 0 ] (__codelineno-32-2) [ 1536 0 R /XYZ 60.307257 723.958170 0 ] (__codelineno-32-20) [ 1536 0 R /XYZ 60.307257 442.550778 0 ] (__codelineno-32-21) [ 1536 0 R /XYZ 60.307257 429.150426 0 ] (__codelineno-32-22) [ 1536 0 R /XYZ 60.307257 415.750074 0 ] (__codelineno-32-23) [ 1536 0 R /XYZ 60.307257 402.349722 0 ] (__codelineno-32-24) [ 1536 0 R /XYZ 60.307257 388.949370 0 ] (__codelineno-32-25) [ 1536 0 R /XYZ 60.307257 362.148666 0 ] (__codelineno-32-26) [ 1536 0 R /XYZ 60.307257 335.347962 0 ] (__codelineno-32-27) [ 1536 0 R /XYZ 60.307257 321.947610 0 ] (__codelineno-32-28) [ 1536 0 R /XYZ 60.307257 308.547258 0 ] (__codelineno-32-29) [ 1536 0 R /XYZ 60.307257 295.146906 0 ] (__codelineno-32-3) [ 1536 0 R /XYZ 60.307257 710.557818 0 ] (__codelineno-32-30) [ 1536 0 R /XYZ 60.307257 281.746554 0 ] (__codelineno-32-31) [ 1536 0 R /XYZ 60.307257 268.346202 0 ] (__codelineno-32-32) [ 1536 0 R /XYZ 60.307257 254.945850 0 ] (__codelineno-32-33) [ 1536 0 R /XYZ 60.307257 241.545498 0 ] (__codelineno-32-34) [ 1536 0 R /XYZ 60.307257 214.744794 0 ] (__codelineno-32-35) [ 1536 0 R /XYZ 60.307257 201.344442 0 ] (__codelineno-32-36) [ 1536 0 R /XYZ 60.307257 174.543738 0 ] (__codelineno-32-37) [ 1536 0 R /XYZ 60.307257 147.743034 0 ] (__codelineno-32-38) [ 1536 0 R /XYZ 60.307257 120.942330 0 ] (__codelineno-32-39) [ 1536 0 R /XYZ 60.307257 107.541978 0 ] (__codelineno-32-4) [ 1536 0 R /XYZ 60.307257 697.157466 0 ] (__codelineno-32-40) [ 1536 0 R /XYZ 60.307257 94.141626 0 ] (__codelineno-32-41) [ 1538 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-32-42) [ 1538 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-32-43) [ 1538 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-32-44) [ 1538 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-32-45) [ 1538 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-32-46) [ 1538 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-32-47) [ 1538 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-32-48) [ 1538 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-32-49) [ 1538 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-32-5) [ 1536 0 R /XYZ 60.307257 670.356762 0 ] (__codelineno-32-50) [ 1538 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-32-51) [ 1538 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-32-52) [ 1538 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-32-53) [ 1538 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-32-54) [ 1538 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-32-55) [ 1538 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-32-56) [ 1538 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-32-57) [ 1538 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-32-58) [ 1538 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-32-59) [ 1538 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-32-6) [ 1536 0 R /XYZ 60.307257 656.956410 0 ] (__codelineno-32-60) [ 1538 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-32-61) [ 1538 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-32-62) [ 1538 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-32-63) [ 1538 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-32-64) [ 1538 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-32-65) [ 1538 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-32-66) [ 1538 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-32-67) [ 1538 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-32-68) [ 1538 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-32-69) [ 1538 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-32-7) [ 1536 0 R /XYZ 60.307257 643.556058 0 ] (__codelineno-32-70) [ 1538 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-32-71) [ 1538 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-32-72) [ 1538 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-32-73) [ 1538 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-32-74) [ 1538 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-32-8) [ 1536 0 R /XYZ 60.307257 630.155706 0 ] (__codelineno-32-9) [ 1536 0 R /XYZ 60.307257 616.755354 0 ] (__codelineno-33-1) [ 1538 0 R /XYZ 60.307257 195.568590 0 ] (__codelineno-33-2) [ 1538 0 R /XYZ 60.307257 182.168238 0 ] (__codelineno-34-1) [ 1540 0 R /XYZ 60.307257 682.931322 0 ] (__codelineno-34-10) [ 1540 0 R /XYZ 60.307257 535.527450 0 ] (__codelineno-34-11) [ 1540 0 R /XYZ 60.307257 522.127098 0 ] (__codelineno-34-12) [ 1540 0 R /XYZ 60.307257 508.726746 0 ] (__codelineno-34-13) [ 1540 0 R /XYZ 60.307257 495.326394 0 ] (__codelineno-34-14) [ 1540 0 R /XYZ 60.307257 468.525690 0 ] (__codelineno-34-15) [ 1540 0 R /XYZ 60.307257 455.125338 0 ] (__codelineno-34-16) [ 1540 0 R /XYZ 60.307257 428.324634 0 ] (__codelineno-34-17) [ 1540 0 R /XYZ 60.307257 414.924282 0 ] (__codelineno-34-18) [ 1540 0 R /XYZ 60.307257 388.123578 0 ] (__codelineno-34-19) [ 1540 0 R /XYZ 60.307257 374.723226 0 ] (__codelineno-34-2) [ 1540 0 R /XYZ 60.307257 669.530970 0 ] (__codelineno-34-20) [ 1540 0 R /XYZ 60.307257 361.322874 0 ] (__codelineno-34-21) [ 1540 0 R /XYZ 60.307257 347.922522 0 ] (__codelineno-34-22) [ 1540 0 R /XYZ 60.307257 334.522170 0 ] (__codelineno-34-23) [ 1540 0 R /XYZ 60.307257 307.721466 0 ] (__codelineno-34-24) [ 1540 0 R /XYZ 60.307257 294.321114 0 ] (__codelineno-34-25) [ 1540 0 R /XYZ 60.307257 267.520410 0 ] (__codelineno-34-26) [ 1540 0 R /XYZ 60.307257 254.120058 0 ] (__codelineno-34-27) [ 1540 0 R /XYZ 60.307257 227.319354 0 ] (__codelineno-34-28) [ 1540 0 R /XYZ 60.307257 213.919002 0 ] (__codelineno-34-29) [ 1540 0 R /XYZ 60.307257 200.518650 0 ] (__codelineno-34-3) [ 1540 0 R /XYZ 60.307257 656.130618 0 ] (__codelineno-34-30) [ 1540 0 R /XYZ 60.307257 173.717946 0 ] (__codelineno-34-31) [ 1540 0 R /XYZ 60.307257 160.317594 0 ] (__codelineno-34-32) [ 1540 0 R /XYZ 60.307257 146.917242 0 ] (__codelineno-34-4) [ 1540 0 R /XYZ 60.307257 642.730266 0 ] (__codelineno-34-5) [ 1540 0 R /XYZ 60.307257 629.329914 0 ] (__codelineno-34-6) [ 1540 0 R /XYZ 60.307257 615.929562 0 ] (__codelineno-34-7) [ 1540 0 R /XYZ 60.307257 602.529210 0 ] (__codelineno-34-8) [ 1540 0 R /XYZ 60.307257 575.728506 0 ] (__codelineno-34-9) [ 1540 0 R /XYZ 60.307257 562.328154 0 ] (__codelineno-35-1) [ 1542 0 R /XYZ 60.307257 519.649722 0 ] (__codelineno-35-10) [ 1542 0 R /XYZ 60.307257 385.646202 0 ] (__codelineno-35-11) [ 1542 0 R /XYZ 60.307257 372.245850 0 ] (__codelineno-35-12) [ 1542 0 R /XYZ 60.307257 358.845498 0 ] (__codelineno-35-13) [ 1542 0 R /XYZ 60.307257 332.044794 0 ] (__codelineno-35-14) [ 1542 0 R /XYZ 60.307257 318.644442 0 ] (__codelineno-35-15) [ 1542 0 R /XYZ 60.307257 305.244090 0 ] (__codelineno-35-16) [ 1542 0 R /XYZ 60.307257 291.843738 0 ] (__codelineno-35-17) [ 1542 0 R /XYZ 60.307257 278.443386 0 ] (__codelineno-35-18) [ 1542 0 R /XYZ 60.307257 265.043034 0 ] (__codelineno-35-19) [ 1542 0 R /XYZ 60.307257 251.642682 0 ] (__codelineno-35-2) [ 1542 0 R /XYZ 60.307257 506.249370 0 ] (__codelineno-35-20) [ 1542 0 R /XYZ 60.307257 238.242330 0 ] (__codelineno-35-21) [ 1542 0 R /XYZ 60.307257 224.841978 0 ] (__codelineno-35-22) [ 1542 0 R /XYZ 60.307257 198.041274 0 ] (__codelineno-35-23) [ 1542 0 R /XYZ 60.307257 171.240570 0 ] (__codelineno-35-24) [ 1542 0 R /XYZ 60.307257 157.840218 0 ] (__codelineno-35-25) [ 1542 0 R /XYZ 60.307257 144.439866 0 ] (__codelineno-35-26) [ 1542 0 R /XYZ 60.307257 131.039514 0 ] (__codelineno-35-27) [ 1542 0 R /XYZ 60.307257 104.238810 0 ] (__codelineno-35-28) [ 1542 0 R /XYZ 60.307257 90.838458 0 ] (__codelineno-35-29) [ 1544 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-35-3) [ 1542 0 R /XYZ 60.307257 492.849018 0 ] (__codelineno-35-30) [ 1544 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-35-31) [ 1544 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-35-32) [ 1544 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-35-4) [ 1542 0 R /XYZ 60.307257 479.448666 0 ] (__codelineno-35-5) [ 1542 0 R /XYZ 60.307257 452.647962 0 ] (__codelineno-35-6) [ 1542 0 R /XYZ 60.307257 439.247610 0 ] (__codelineno-35-7) [ 1542 0 R /XYZ 60.307257 425.847258 0 ] (__codelineno-35-8) [ 1542 0 R /XYZ 60.307257 412.446906 0 ] (__codelineno-35-9) [ 1542 0 R /XYZ 60.307257 399.046554 0 ] (__codelineno-36-1) [ 1549 0 R /XYZ 60.307257 619.120122 0 ] (__codelineno-36-10) [ 1549 0 R /XYZ 60.307257 498.516954 0 ] (__codelineno-36-11) [ 1549 0 R /XYZ 60.307257 485.116602 0 ] (__codelineno-36-12) [ 1549 0 R /XYZ 60.307257 471.716250 0 ] (__codelineno-36-13) [ 1549 0 R /XYZ 60.307257 458.315898 0 ] (__codelineno-36-14) [ 1549 0 R /XYZ 60.307257 444.915546 0 ] (__codelineno-36-15) [ 1549 0 R /XYZ 60.307257 431.515194 0 ] (__codelineno-36-16) [ 1549 0 R /XYZ 60.307257 418.114842 0 ] (__codelineno-36-17) [ 1549 0 R /XYZ 60.307257 404.714490 0 ] (__codelineno-36-18) [ 1549 0 R /XYZ 60.307257 391.314138 0 ] (__codelineno-36-19) [ 1549 0 R /XYZ 60.307257 377.913786 0 ] (__codelineno-36-2) [ 1549 0 R /XYZ 60.307257 605.719770 0 ] (__codelineno-36-20) [ 1549 0 R /XYZ 60.307257 364.513434 0 ] (__codelineno-36-21) [ 1549 0 R /XYZ 60.307257 351.113082 0 ] (__codelineno-36-22) [ 1549 0 R /XYZ 60.307257 337.712730 0 ] (__codelineno-36-23) [ 1549 0 R /XYZ 60.307257 324.312378 0 ] (__codelineno-36-24) [ 1549 0 R /XYZ 60.307257 310.912026 0 ] (__codelineno-36-25) [ 1549 0 R /XYZ 60.307257 297.511674 0 ] (__codelineno-36-26) [ 1549 0 R /XYZ 60.307257 284.111322 0 ] (__codelineno-36-27) [ 1549 0 R /XYZ 60.307257 270.710970 0 ] (__codelineno-36-28) [ 1549 0 R /XYZ 60.307257 257.310618 0 ] (__codelineno-36-29) [ 1549 0 R /XYZ 60.307257 243.910266 0 ] (__codelineno-36-3) [ 1549 0 R /XYZ 60.307257 592.319418 0 ] (__codelineno-36-30) [ 1549 0 R /XYZ 60.307257 230.509914 0 ] (__codelineno-36-31) [ 1549 0 R /XYZ 60.307257 217.109562 0 ] (__codelineno-36-32) [ 1549 0 R /XYZ 60.307257 203.709210 0 ] (__codelineno-36-33) [ 1549 0 R /XYZ 60.307257 190.308858 0 ] (__codelineno-36-34) [ 1549 0 R /XYZ 60.307257 176.908506 0 ] (__codelineno-36-35) [ 1549 0 R /XYZ 60.307257 163.508154 0 ] (__codelineno-36-36) [ 1549 0 R /XYZ 60.307257 150.107802 0 ] (__codelineno-36-37) [ 1549 0 R /XYZ 60.307257 136.707450 0 ] (__codelineno-36-38) [ 1549 0 R /XYZ 60.307257 123.307098 0 ] (__codelineno-36-39) [ 1549 0 R /XYZ 60.307257 109.906746 0 ] (__codelineno-36-4) [ 1549 0 R /XYZ 60.307257 578.919066 0 ] (__codelineno-36-40) [ 1549 0 R /XYZ 60.307257 96.506394 0 ] (__codelineno-36-41) [ 1551 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-36-42) [ 1551 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-36-43) [ 1551 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-36-44) [ 1551 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-36-45) [ 1551 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-36-46) [ 1551 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-36-47) [ 1551 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-36-48) [ 1551 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-36-49) [ 1551 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-36-5) [ 1549 0 R /XYZ 60.307257 565.518714 0 ] (__codelineno-36-50) [ 1551 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-36-51) [ 1551 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-36-52) [ 1551 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-36-53) [ 1551 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-36-54) [ 1551 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-36-55) [ 1551 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-36-56) [ 1551 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-36-57) [ 1551 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-36-58) [ 1551 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-36-59) [ 1551 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-36-6) [ 1549 0 R /XYZ 60.307257 552.118362 0 ] (__codelineno-36-60) [ 1551 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-36-61) [ 1551 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-36-62) [ 1551 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-36-63) [ 1551 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-36-64) [ 1551 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-36-65) [ 1551 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-36-66) [ 1551 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-36-67) [ 1551 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-36-68) [ 1551 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-36-69) [ 1551 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-36-7) [ 1549 0 R /XYZ 60.307257 538.718010 0 ] (__codelineno-36-70) [ 1551 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-36-71) [ 1551 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-36-72) [ 1551 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-36-73) [ 1551 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-36-74) [ 1551 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-36-75) [ 1551 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-36-76) [ 1551 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-36-77) [ 1551 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-36-78) [ 1551 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-36-79) [ 1551 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-36-8) [ 1549 0 R /XYZ 60.307257 525.317658 0 ] (__codelineno-36-80) [ 1551 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-36-81) [ 1551 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-36-82) [ 1551 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-36-83) [ 1551 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-36-84) [ 1551 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-36-85) [ 1551 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-36-86) [ 1551 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-36-87) [ 1551 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-36-88) [ 1551 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-36-89) [ 1551 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-36-9) [ 1549 0 R /XYZ 60.307257 511.917306 0 ] (__codelineno-37-1) [ 1553 0 R /XYZ 60.307257 658.532922 0 ] (__codelineno-37-10) [ 1553 0 R /XYZ 60.307257 537.929754 0 ] (__codelineno-37-11) [ 1553 0 R /XYZ 60.307257 524.529402 0 ] (__codelineno-37-12) [ 1553 0 R /XYZ 60.307257 511.129050 0 ] (__codelineno-37-13) [ 1553 0 R /XYZ 60.307257 497.728698 0 ] (__codelineno-37-14) [ 1553 0 R /XYZ 60.307257 484.328346 0 ] (__codelineno-37-15) [ 1553 0 R /XYZ 60.307257 470.927994 0 ] (__codelineno-37-16) [ 1553 0 R /XYZ 60.307257 457.527642 0 ] (__codelineno-37-17) [ 1553 0 R /XYZ 60.307257 444.127290 0 ] (__codelineno-37-18) [ 1553 0 R /XYZ 60.307257 430.726938 0 ] (__codelineno-37-19) [ 1553 0 R /XYZ 60.307257 417.326586 0 ] (__codelineno-37-2) [ 1553 0 R /XYZ 60.307257 645.132570 0 ] (__codelineno-37-20) [ 1553 0 R /XYZ 60.307257 403.926234 0 ] (__codelineno-37-21) [ 1553 0 R /XYZ 60.307257 390.525882 0 ] (__codelineno-37-22) [ 1553 0 R /XYZ 60.307257 377.125530 0 ] (__codelineno-37-23) [ 1553 0 R /XYZ 60.307257 363.725178 0 ] (__codelineno-37-24) [ 1553 0 R /XYZ 60.307257 350.324826 0 ] (__codelineno-37-25) [ 1553 0 R /XYZ 60.307257 336.924474 0 ] (__codelineno-37-26) [ 1553 0 R /XYZ 60.307257 323.524122 0 ] (__codelineno-37-27) [ 1553 0 R /XYZ 60.307257 310.123770 0 ] (__codelineno-37-28) [ 1553 0 R /XYZ 60.307257 296.723418 0 ] (__codelineno-37-29) [ 1553 0 R /XYZ 60.307257 283.323066 0 ] (__codelineno-37-3) [ 1553 0 R /XYZ 60.307257 631.732218 0 ] (__codelineno-37-30) [ 1553 0 R /XYZ 60.307257 269.922714 0 ] (__codelineno-37-31) [ 1553 0 R /XYZ 60.307257 256.522362 0 ] (__codelineno-37-32) [ 1553 0 R /XYZ 60.307257 243.122010 0 ] (__codelineno-37-33) [ 1553 0 R /XYZ 60.307257 229.721658 0 ] (__codelineno-37-34) [ 1553 0 R /XYZ 60.307257 216.321306 0 ] (__codelineno-37-35) [ 1553 0 R /XYZ 60.307257 202.920954 0 ] (__codelineno-37-36) [ 1553 0 R /XYZ 60.307257 189.520602 0 ] (__codelineno-37-37) [ 1553 0 R /XYZ 60.307257 176.120250 0 ] (__codelineno-37-38) [ 1553 0 R /XYZ 60.307257 162.719898 0 ] (__codelineno-37-39) [ 1553 0 R /XYZ 60.307257 149.319546 0 ] (__codelineno-37-4) [ 1553 0 R /XYZ 60.307257 618.331866 0 ] (__codelineno-37-40) [ 1553 0 R /XYZ 60.307257 135.919194 0 ] (__codelineno-37-41) [ 1553 0 R /XYZ 60.307257 122.518842 0 ] (__codelineno-37-42) [ 1553 0 R /XYZ 60.307257 109.118490 0 ] (__codelineno-37-43) [ 1553 0 R /XYZ 60.307257 95.718138 0 ] (__codelineno-37-44) [ 1555 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-37-45) [ 1555 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-37-46) [ 1555 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-37-47) [ 1555 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-37-48) [ 1555 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-37-49) [ 1555 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-37-5) [ 1553 0 R /XYZ 60.307257 604.931514 0 ] (__codelineno-37-50) [ 1555 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-37-51) [ 1555 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-37-52) [ 1555 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-37-53) [ 1555 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-37-54) [ 1555 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-37-55) [ 1555 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-37-56) [ 1555 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-37-57) [ 1555 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-37-58) [ 1555 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-37-59) [ 1555 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-37-6) [ 1553 0 R /XYZ 60.307257 591.531162 0 ] (__codelineno-37-60) [ 1555 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-37-61) [ 1555 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-37-62) [ 1555 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-37-63) [ 1555 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-37-64) [ 1555 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-37-65) [ 1555 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-37-66) [ 1555 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-37-67) [ 1555 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-37-68) [ 1555 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-37-69) [ 1555 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-37-7) [ 1553 0 R /XYZ 60.307257 578.130810 0 ] (__codelineno-37-70) [ 1555 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-37-71) [ 1555 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-37-72) [ 1555 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-37-73) [ 1555 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-37-74) [ 1555 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-37-75) [ 1555 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-37-76) [ 1555 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-37-77) [ 1555 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-37-78) [ 1555 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-37-79) [ 1555 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-37-8) [ 1553 0 R /XYZ 60.307257 564.730458 0 ] (__codelineno-37-80) [ 1555 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-37-81) [ 1555 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-37-9) [ 1553 0 R /XYZ 60.307257 551.330106 0 ] (__codelineno-38-1) [ 1557 0 R /XYZ 60.307257 174.624222 0 ] (__codelineno-38-10) [ 1559 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-38-11) [ 1559 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-38-12) [ 1559 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-38-13) [ 1559 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-38-14) [ 1559 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-38-15) [ 1559 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-38-16) [ 1559 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-38-17) [ 1559 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-38-18) [ 1559 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-38-19) [ 1559 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-38-2) [ 1557 0 R /XYZ 60.307257 161.223870 0 ] (__codelineno-38-20) [ 1559 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-38-21) [ 1559 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-38-22) [ 1559 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-38-23) [ 1559 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-38-24) [ 1559 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-38-25) [ 1559 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-38-26) [ 1559 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-38-27) [ 1559 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-38-28) [ 1559 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-38-29) [ 1559 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-38-3) [ 1557 0 R /XYZ 60.307257 147.823518 0 ] (__codelineno-38-30) [ 1559 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-38-31) [ 1559 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-38-32) [ 1559 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-38-33) [ 1559 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-38-34) [ 1559 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-38-35) [ 1559 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-38-36) [ 1559 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-38-37) [ 1559 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-38-38) [ 1559 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-38-4) [ 1557 0 R /XYZ 60.307257 134.423166 0 ] (__codelineno-38-5) [ 1557 0 R /XYZ 60.307257 121.022814 0 ] (__codelineno-38-6) [ 1557 0 R /XYZ 60.307257 94.222110 0 ] (__codelineno-38-7) [ 1559 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-38-8) [ 1559 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-38-9) [ 1559 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-4-1) [ 602 0 R /XYZ 60.307257 491.661942 0 ] (__codelineno-4-10) [ 602 0 R /XYZ 60.307257 371.058774 0 ] (__codelineno-4-11) [ 602 0 R /XYZ 60.307257 344.258070 0 ] (__codelineno-4-12) [ 602 0 R /XYZ 60.307257 330.857718 0 ] (__codelineno-4-13) [ 602 0 R /XYZ 60.307257 317.457366 0 ] (__codelineno-4-14) [ 602 0 R /XYZ 60.307257 304.057014 0 ] (__codelineno-4-15) [ 602 0 R /XYZ 60.307257 290.656662 0 ] (__codelineno-4-16) [ 602 0 R /XYZ 60.307257 277.256310 0 ] (__codelineno-4-17) [ 602 0 R /XYZ 60.307257 250.455606 0 ] (__codelineno-4-18) [ 602 0 R /XYZ 60.307257 237.055254 0 ] (__codelineno-4-19) [ 602 0 R /XYZ 60.307257 223.654902 0 ] (__codelineno-4-2) [ 602 0 R /XYZ 60.307257 478.261590 0 ] (__codelineno-4-20) [ 602 0 R /XYZ 60.307257 210.254550 0 ] (__codelineno-4-21) [ 602 0 R /XYZ 60.307257 196.854198 0 ] (__codelineno-4-22) [ 602 0 R /XYZ 60.307257 183.453846 0 ] (__codelineno-4-23) [ 602 0 R /XYZ 60.307257 170.053494 0 ] (__codelineno-4-24) [ 602 0 R /XYZ 60.307257 156.653142 0 ] (__codelineno-4-25) [ 602 0 R /XYZ 60.307257 143.252790 0 ] (__codelineno-4-26) [ 602 0 R /XYZ 60.307257 129.852438 0 ] (__codelineno-4-27) [ 602 0 R /XYZ 60.307257 116.452086 0 ] (__codelineno-4-28) [ 602 0 R /XYZ 60.307257 103.051734 0 ] (__codelineno-4-29) [ 602 0 R /XYZ 60.307257 89.651382 0 ] (__codelineno-4-3) [ 602 0 R /XYZ 60.307257 464.861238 0 ] (__codelineno-4-30) [ 604 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-4-31) [ 604 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-4-32) [ 604 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-4-33) [ 604 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-4-34) [ 604 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-4-35) [ 604 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-4-36) [ 604 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-4-37) [ 604 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-4-4) [ 602 0 R /XYZ 60.307257 451.460886 0 ] (__codelineno-4-5) [ 602 0 R /XYZ 60.307257 438.060534 0 ] (__codelineno-4-6) [ 602 0 R /XYZ 60.307257 424.660182 0 ] (__codelineno-4-7) [ 602 0 R /XYZ 60.307257 411.259830 0 ] (__codelineno-4-8) [ 602 0 R /XYZ 60.307257 397.859478 0 ] (__codelineno-4-9) [ 602 0 R /XYZ 60.307257 384.459126 0 ] (__codelineno-5-1) [ 612 0 R /XYZ 60.307257 671.460194 0 ] (__codelineno-5-10) [ 612 0 R /XYZ 60.307257 537.456674 0 ] (__codelineno-5-11) [ 612 0 R /XYZ 60.307257 524.056322 0 ] (__codelineno-5-12) [ 612 0 R /XYZ 60.307257 510.655970 0 ] (__codelineno-5-13) [ 612 0 R /XYZ 60.307257 497.255618 0 ] (__codelineno-5-14) [ 612 0 R /XYZ 60.307257 483.855266 0 ] (__codelineno-5-15) [ 612 0 R /XYZ 60.307257 470.454914 0 ] (__codelineno-5-16) [ 612 0 R /XYZ 60.307257 457.054562 0 ] (__codelineno-5-17) [ 612 0 R /XYZ 60.307257 443.654210 0 ] (__codelineno-5-18) [ 612 0 R /XYZ 60.307257 416.853506 0 ] (__codelineno-5-19) [ 612 0 R /XYZ 60.307257 403.453154 0 ] (__codelineno-5-2) [ 612 0 R /XYZ 60.307257 658.059842 0 ] (__codelineno-5-20) [ 612 0 R /XYZ 60.307257 390.052802 0 ] (__codelineno-5-21) [ 612 0 R /XYZ 60.307257 376.652450 0 ] (__codelineno-5-22) [ 612 0 R /XYZ 60.307257 363.252098 0 ] (__codelineno-5-23) [ 612 0 R /XYZ 60.307257 349.851746 0 ] (__codelineno-5-24) [ 612 0 R /XYZ 60.307257 323.051042 0 ] (__codelineno-5-25) [ 612 0 R /XYZ 60.307257 309.650690 0 ] (__codelineno-5-26) [ 612 0 R /XYZ 60.307257 296.250338 0 ] (__codelineno-5-27) [ 612 0 R /XYZ 60.307257 269.449634 0 ] (__codelineno-5-28) [ 612 0 R /XYZ 60.307257 256.049282 0 ] (__codelineno-5-29) [ 612 0 R /XYZ 60.307257 229.248578 0 ] (__codelineno-5-3) [ 612 0 R /XYZ 60.307257 644.659490 0 ] (__codelineno-5-30) [ 612 0 R /XYZ 60.307257 202.447874 0 ] (__codelineno-5-31) [ 612 0 R /XYZ 60.307257 189.047522 0 ] (__codelineno-5-32) [ 612 0 R /XYZ 60.307257 175.647170 0 ] (__codelineno-5-33) [ 612 0 R /XYZ 60.307257 162.246818 0 ] (__codelineno-5-34) [ 612 0 R /XYZ 60.307257 135.446114 0 ] (__codelineno-5-35) [ 612 0 R /XYZ 60.307257 122.045762 0 ] (__codelineno-5-36) [ 612 0 R /XYZ 60.307257 108.645410 0 ] (__codelineno-5-37) [ 612 0 R /XYZ 60.307257 95.245058 0 ] (__codelineno-5-38) [ 616 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-5-39) [ 616 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-5-4) [ 612 0 R /XYZ 60.307257 631.259138 0 ] (__codelineno-5-40) [ 616 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-5-41) [ 616 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-5-42) [ 616 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-5-43) [ 616 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-5-44) [ 616 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-5-45) [ 616 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-5-46) [ 616 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-5-47) [ 616 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-5-48) [ 616 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-5-49) [ 616 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-5-5) [ 612 0 R /XYZ 60.307257 617.858786 0 ] (__codelineno-5-50) [ 616 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-5-51) [ 616 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-5-52) [ 616 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-5-53) [ 616 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-5-54) [ 616 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-5-55) [ 616 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-5-56) [ 616 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-5-57) [ 616 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-5-58) [ 616 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-5-59) [ 616 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-5-6) [ 612 0 R /XYZ 60.307257 604.458434 0 ] (__codelineno-5-60) [ 616 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-5-61) [ 616 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-5-62) [ 616 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-5-7) [ 612 0 R /XYZ 60.307257 577.657730 0 ] (__codelineno-5-8) [ 612 0 R /XYZ 60.307257 564.257378 0 ] (__codelineno-5-9) [ 612 0 R /XYZ 60.307257 550.857026 0 ] (__codelineno-6-1) [ 625 0 R /XYZ 60.307257 458.116602 0 ] (__codelineno-6-10) [ 625 0 R /XYZ 60.307257 337.513434 0 ] (__codelineno-6-100) [ 631 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-6-101) [ 631 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-6-102) [ 631 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-6-103) [ 631 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-6-104) [ 631 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-6-105) [ 631 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-6-106) [ 631 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-6-107) [ 631 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-6-108) [ 631 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-6-109) [ 631 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-6-11) [ 625 0 R /XYZ 60.307257 324.113082 0 ] (__codelineno-6-110) [ 631 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-6-111) [ 631 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-6-112) [ 631 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-6-113) [ 631 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-6-114) [ 631 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-6-115) [ 631 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-6-116) [ 631 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-6-117) [ 631 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-6-118) [ 631 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-6-119) [ 631 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-6-12) [ 625 0 R /XYZ 60.307257 310.712730 0 ] (__codelineno-6-120) [ 631 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-6-121) [ 631 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-6-122) [ 631 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-6-123) [ 631 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-6-124) [ 631 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-6-125) [ 631 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-6-126) [ 631 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-6-127) [ 631 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-6-128) [ 631 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-6-129) [ 631 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-6-13) [ 625 0 R /XYZ 60.307257 297.312378 0 ] (__codelineno-6-130) [ 631 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-6-131) [ 631 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-6-132) [ 631 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-6-133) [ 633 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-6-134) [ 633 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-6-135) [ 633 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-6-136) [ 633 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-6-137) [ 633 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-6-138) [ 633 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-6-139) [ 633 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-6-14) [ 625 0 R /XYZ 60.307257 283.912026 0 ] (__codelineno-6-140) [ 633 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-6-141) [ 633 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-6-142) [ 633 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-6-143) [ 633 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-6-144) [ 633 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-6-145) [ 633 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-6-146) [ 633 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-6-147) [ 633 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-6-148) [ 633 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-6-149) [ 633 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-6-15) [ 625 0 R /XYZ 60.307257 270.511674 0 ] (__codelineno-6-150) [ 633 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-6-151) [ 633 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-6-152) [ 633 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-6-153) [ 633 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-6-154) [ 633 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-6-155) [ 633 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-6-156) [ 633 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-6-157) [ 633 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-6-158) [ 633 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-6-159) [ 633 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-6-16) [ 625 0 R /XYZ 60.307257 257.111322 0 ] (__codelineno-6-160) [ 633 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-6-161) [ 633 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-6-162) [ 633 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-6-163) [ 633 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-6-17) [ 625 0 R /XYZ 60.307257 243.710970 0 ] (__codelineno-6-18) [ 625 0 R /XYZ 60.307257 230.310618 0 ] (__codelineno-6-19) [ 625 0 R /XYZ 60.307257 216.910266 0 ] (__codelineno-6-2) [ 625 0 R /XYZ 60.307257 444.716250 0 ] (__codelineno-6-20) [ 625 0 R /XYZ 60.307257 203.509914 0 ] (__codelineno-6-21) [ 625 0 R /XYZ 60.307257 190.109562 0 ] (__codelineno-6-22) [ 625 0 R /XYZ 60.307257 176.709210 0 ] (__codelineno-6-23) [ 625 0 R /XYZ 60.307257 163.308858 0 ] (__codelineno-6-24) [ 625 0 R /XYZ 60.307257 149.908506 0 ] (__codelineno-6-25) [ 625 0 R /XYZ 60.307257 136.508154 0 ] (__codelineno-6-26) [ 625 0 R /XYZ 60.307257 123.107802 0 ] (__codelineno-6-27) [ 625 0 R /XYZ 60.307257 109.707450 0 ] (__codelineno-6-28) [ 625 0 R /XYZ 60.307257 96.307098 0 ] (__codelineno-6-29) [ 629 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-6-3) [ 625 0 R /XYZ 60.307257 431.315898 0 ] (__codelineno-6-30) [ 629 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-6-31) [ 629 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-6-32) [ 629 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-6-33) [ 629 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-6-34) [ 629 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-6-35) [ 629 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-6-36) [ 629 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-6-37) [ 629 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-6-38) [ 629 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-6-39) [ 629 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-6-4) [ 625 0 R /XYZ 60.307257 417.915546 0 ] (__codelineno-6-40) [ 629 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-6-41) [ 629 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-6-42) [ 629 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-6-43) [ 629 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-6-44) [ 629 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-6-45) [ 629 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-6-46) [ 629 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-6-47) [ 629 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-6-48) [ 629 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-6-49) [ 629 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-6-5) [ 625 0 R /XYZ 60.307257 404.515194 0 ] (__codelineno-6-50) [ 629 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-6-51) [ 629 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-6-52) [ 629 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-6-53) [ 629 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-6-54) [ 629 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-6-55) [ 629 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-6-56) [ 629 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-6-57) [ 629 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-6-58) [ 629 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-6-59) [ 629 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-6-6) [ 625 0 R /XYZ 60.307257 391.114842 0 ] (__codelineno-6-60) [ 629 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-6-61) [ 629 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-6-62) [ 629 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-6-63) [ 629 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-6-64) [ 629 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-6-65) [ 629 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-6-66) [ 629 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-6-67) [ 629 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-6-68) [ 629 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-6-69) [ 629 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-6-7) [ 625 0 R /XYZ 60.307257 377.714490 0 ] (__codelineno-6-70) [ 629 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-6-71) [ 629 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-6-72) [ 629 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-6-73) [ 629 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-6-74) [ 629 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-6-75) [ 629 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-6-76) [ 629 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-6-77) [ 629 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-6-78) [ 629 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-6-79) [ 629 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-6-8) [ 625 0 R /XYZ 60.307257 364.314138 0 ] (__codelineno-6-80) [ 629 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-6-81) [ 631 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-6-82) [ 631 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-6-83) [ 631 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-6-84) [ 631 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-6-85) [ 631 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-6-86) [ 631 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-6-87) [ 631 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-6-88) [ 631 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-6-89) [ 631 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-6-9) [ 625 0 R /XYZ 60.307257 350.913786 0 ] (__codelineno-6-90) [ 631 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-6-91) [ 631 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-6-92) [ 631 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-6-93) [ 631 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-6-94) [ 631 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-6-95) [ 631 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-6-96) [ 631 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-6-97) [ 631 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-6-98) [ 631 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-6-99) [ 631 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-7-1) [ 866 0 R /XYZ 60.307257 428.812602 0 ] (__codelineno-7-10) [ 1207 0 R /XYZ 60.307257 240.520223 0 ] (__codelineno-7-11) [ 1207 0 R /XYZ 60.307257 227.119871 0 ] (__codelineno-7-12) [ 1207 0 R /XYZ 60.307257 213.719519 0 ] (__codelineno-7-13) [ 1207 0 R /XYZ 60.307257 200.319167 0 ] (__codelineno-7-14) [ 1207 0 R /XYZ 60.307257 186.918815 0 ] (__codelineno-7-15) [ 1207 0 R /XYZ 60.307257 173.518463 0 ] (__codelineno-7-16) [ 1207 0 R /XYZ 60.307257 160.118111 0 ] (__codelineno-7-17) [ 1207 0 R /XYZ 60.307257 146.717759 0 ] (__codelineno-7-18) [ 1207 0 R /XYZ 60.307257 119.917055 0 ] (__codelineno-7-19) [ 1207 0 R /XYZ 60.307257 106.516703 0 ] (__codelineno-7-2) [ 866 0 R /XYZ 60.307257 415.412250 0 ] (__codelineno-7-20) [ 1207 0 R /XYZ 60.307257 93.116351 0 ] (__codelineno-7-21) [ 1214 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-7-22) [ 1214 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-7-23) [ 1214 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-7-24) [ 1214 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-7-25) [ 1214 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-7-26) [ 1214 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-7-27) [ 1214 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-7-28) [ 1214 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-7-29) [ 1214 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-7-3) [ 866 0 R /XYZ 60.307257 402.011898 0 ] (__codelineno-7-30) [ 1214 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-7-31) [ 1214 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-7-32) [ 1214 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-7-33) [ 1214 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-7-34) [ 1214 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-7-35) [ 1214 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-7-36) [ 1214 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-7-37) [ 1214 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-7-38) [ 1214 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-7-39) [ 1214 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-7-4) [ 866 0 R /XYZ 60.307257 388.611546 0 ] (__codelineno-7-40) [ 1214 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-7-41) [ 1214 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-7-42) [ 1214 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-7-43) [ 1214 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-7-44) [ 1214 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-7-45) [ 1214 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-7-46) [ 1214 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-7-47) [ 1214 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-7-48) [ 1214 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-7-49) [ 1214 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-7-5) [ 866 0 R /XYZ 60.307257 375.211194 0 ] (__codelineno-7-50) [ 1214 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-7-51) [ 1214 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-7-52) [ 1214 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-7-53) [ 1214 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-7-54) [ 1214 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-7-55) [ 1214 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-7-6) [ 866 0 R /XYZ 60.307257 361.810842 0 ] (__codelineno-7-7) [ 866 0 R /XYZ 60.307257 348.410490 0 ] (__codelineno-7-8) [ 1207 0 R /XYZ 60.307257 267.320927 0 ] (__codelineno-7-9) [ 1207 0 R /XYZ 60.307257 253.920575 0 ] (__codelineno-8-1) [ 868 0 R /XYZ 60.307257 381.602202 0 ] (__codelineno-8-10) [ 1245 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-8-11) [ 1245 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-8-12) [ 1245 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-8-13) [ 1245 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-8-14) [ 1245 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-8-15) [ 1245 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-8-16) [ 1245 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-8-17) [ 1245 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-8-18) [ 1245 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-8-19) [ 1245 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-8-2) [ 868 0 R /XYZ 60.307257 368.201850 0 ] (__codelineno-8-20) [ 1245 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-8-21) [ 1245 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-8-22) [ 1245 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-8-23) [ 1245 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-8-24) [ 1245 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-8-25) [ 1245 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-8-26) [ 1245 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-8-27) [ 1245 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-8-28) [ 1245 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-8-29) [ 1245 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-8-3) [ 868 0 R /XYZ 60.307257 354.801498 0 ] (__codelineno-8-4) [ 868 0 R /XYZ 60.307257 341.401146 0 ] (__codelineno-8-5) [ 868 0 R /XYZ 60.307257 328.000794 0 ] (__codelineno-8-6) [ 868 0 R /XYZ 60.307257 314.600442 0 ] (__codelineno-8-7) [ 1240 0 R /XYZ 60.307257 97.879717 0 ] (__codelineno-8-8) [ 1240 0 R /XYZ 60.307257 84.479365 0 ] (__codelineno-8-9) [ 1245 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-9-1) [ 873 0 R /XYZ 60.307257 458.458122 0 ] (__codelineno-9-10) [ 1252 0 R /XYZ 60.307257 643.030554 0 ] (__codelineno-9-11) [ 1252 0 R /XYZ 60.307257 629.630202 0 ] (__codelineno-9-12) [ 1252 0 R /XYZ 60.307257 616.229850 0 ] (__codelineno-9-13) [ 1252 0 R /XYZ 60.307257 602.829498 0 ] (__codelineno-9-14) [ 1252 0 R /XYZ 60.307257 589.429146 0 ] (__codelineno-9-15) [ 1252 0 R /XYZ 60.307257 576.028794 0 ] (__codelineno-9-16) [ 1252 0 R /XYZ 60.307257 562.628442 0 ] (__codelineno-9-17) [ 1252 0 R /XYZ 60.307257 549.228090 0 ] (__codelineno-9-18) [ 1252 0 R /XYZ 60.307257 535.827738 0 ] (__codelineno-9-19) [ 1252 0 R /XYZ 60.307257 522.427386 0 ] (__codelineno-9-2) [ 873 0 R /XYZ 60.307257 445.057770 0 ] (__codelineno-9-20) [ 1252 0 R /XYZ 60.307257 509.027034 0 ] (__codelineno-9-21) [ 1252 0 R /XYZ 60.307257 495.626682 0 ] (__codelineno-9-22) [ 1252 0 R /XYZ 60.307257 482.226330 0 ] (__codelineno-9-23) [ 1252 0 R /XYZ 60.307257 468.825978 0 ] (__codelineno-9-24) [ 1252 0 R /XYZ 60.307257 455.425626 0 ] (__codelineno-9-25) [ 1252 0 R /XYZ 60.307257 442.025274 0 ] (__codelineno-9-26) [ 1252 0 R /XYZ 60.307257 428.624922 0 ] (__codelineno-9-27) [ 1252 0 R /XYZ 60.307257 415.224570 0 ] (__codelineno-9-28) [ 1252 0 R /XYZ 60.307257 401.824218 0 ] (__codelineno-9-29) [ 1252 0 R /XYZ 60.307257 388.423866 0 ] (__codelineno-9-3) [ 873 0 R /XYZ 60.307257 431.657418 0 ] (__codelineno-9-30) [ 1252 0 R /XYZ 60.307257 375.023514 0 ] (__codelineno-9-31) [ 1252 0 R /XYZ 60.307257 361.623162 0 ] (__codelineno-9-32) [ 1252 0 R /XYZ 60.307257 348.222810 0 ] (__codelineno-9-33) [ 1252 0 R /XYZ 60.307257 334.822458 0 ] (__codelineno-9-34) [ 1252 0 R /XYZ 60.307257 321.422106 0 ] (__codelineno-9-35) [ 1252 0 R /XYZ 60.307257 308.021754 0 ] (__codelineno-9-36) [ 1252 0 R /XYZ 60.307257 294.621402 0 ] (__codelineno-9-37) [ 1252 0 R /XYZ 60.307257 281.221050 0 ] (__codelineno-9-38) [ 1252 0 R /XYZ 60.307257 267.820698 0 ] (__codelineno-9-39) [ 1252 0 R /XYZ 60.307257 254.420346 0 ] (__codelineno-9-4) [ 873 0 R /XYZ 60.307257 418.257066 0 ] (__codelineno-9-40) [ 1252 0 R /XYZ 60.307257 241.019994 0 ] (__codelineno-9-41) [ 1252 0 R /XYZ 60.307257 227.619642 0 ] (__codelineno-9-42) [ 1252 0 R /XYZ 60.307257 214.219290 0 ] (__codelineno-9-43) [ 1252 0 R /XYZ 60.307257 200.818938 0 ] (__codelineno-9-5) [ 873 0 R /XYZ 60.307257 404.856714 0 ] (__codelineno-9-6) [ 873 0 R /XYZ 60.307257 391.456362 0 ] (__codelineno-9-7) [ 873 0 R /XYZ 60.307257 378.056010 0 ] (__codelineno-9-8) [ 1252 0 R /XYZ 60.307257 669.831258 0 ] (__codelineno-9-9) [ 1252 0 R /XYZ 60.307257 656.430906 0 ] (author) [ 6 0 R /XYZ 55.946457 113.701342 0 ] (copyright) [ 6 0 R /XYZ 55.946457 84.997342 0 ] (doc-cover) [ 6 0 R /XYZ 28.346457 771.023622 0 ] (doc-toc) [ 8 0 R /XYZ 39.386457 771.023622 0 ] (jdb/:) [ 1071 0 R /XYZ 39.386457 771.023622 0 ] (jdb/:26-avril-2023) [ 1423 0 R /XYZ 39.386457 222.365322 0 ] (jdb/:__span-0-1) [ 1071 0 R /XYZ 60.307257 505.092222 0 ] (jdb/:__span-0-10) [ 1071 0 R /XYZ 60.307257 384.489054 0 ] (jdb/:__span-0-11) [ 1071 0 R /XYZ 60.307257 371.088702 0 ] (jdb/:__span-0-12) [ 1071 0 R /XYZ 60.307257 357.688350 0 ] (jdb/:__span-0-13) [ 1071 0 R /XYZ 60.307257 344.287998 0 ] (jdb/:__span-0-14) [ 1071 0 R /XYZ 60.307257 330.887646 0 ] (jdb/:__span-0-15) [ 1071 0 R /XYZ 60.307257 317.487294 0 ] (jdb/:__span-0-16) [ 1071 0 R /XYZ 60.307257 304.086942 0 ] (jdb/:__span-0-17) [ 1071 0 R /XYZ 60.307257 290.686590 0 ] (jdb/:__span-0-18) [ 1071 0 R /XYZ 60.307257 277.286238 0 ] (jdb/:__span-0-19) [ 1071 0 R /XYZ 60.307257 263.885886 0 ] (jdb/:__span-0-2) [ 1071 0 R /XYZ 60.307257 491.691870 0 ] (jdb/:__span-0-20) [ 1071 0 R /XYZ 60.307257 250.485534 0 ] (jdb/:__span-0-21) [ 1071 0 R /XYZ 60.307257 237.085182 0 ] (jdb/:__span-0-22) [ 1071 0 R /XYZ 60.307257 223.684830 0 ] (jdb/:__span-0-23) [ 1071 0 R /XYZ 60.307257 210.284478 0 ] (jdb/:__span-0-3) [ 1071 0 R /XYZ 60.307257 478.291518 0 ] (jdb/:__span-0-4) [ 1071 0 R /XYZ 60.307257 464.891166 0 ] (jdb/:__span-0-5) [ 1071 0 R /XYZ 60.307257 451.490814 0 ] (jdb/:__span-0-6) [ 1071 0 R /XYZ 60.307257 438.090462 0 ] (jdb/:__span-0-7) [ 1071 0 R /XYZ 60.307257 424.690110 0 ] (jdb/:__span-0-8) [ 1071 0 R /XYZ 60.307257 411.289758 0 ] (jdb/:__span-0-9) [ 1071 0 R /XYZ 60.307257 397.889406 0 ] (jdb/:__span-1-1) [ 1089 0 R /XYZ 60.307257 292.693722 0 ] (jdb/:__span-1-2) [ 1089 0 R /XYZ 60.307257 265.893018 0 ] (jdb/:__span-1-3) [ 1089 0 R /XYZ 60.307257 252.492666 0 ] (jdb/:__span-1-4) [ 1089 0 R /XYZ 60.307257 239.092314 0 ] (jdb/:__span-1-5) [ 1089 0 R /XYZ 60.307257 225.691962 0 ] (jdb/:__span-1-6) [ 1089 0 R /XYZ 60.307257 212.291610 0 ] (jdb/:__span-10-1) [ 1254 0 R /XYZ 60.307257 697.945722 0 ] (jdb/:__span-10-10) [ 1254 0 R /XYZ 60.307257 577.342554 0 ] (jdb/:__span-10-11) [ 1254 0 R /XYZ 60.307257 563.942202 0 ] (jdb/:__span-10-12) [ 1254 0 R /XYZ 60.307257 550.541850 0 ] (jdb/:__span-10-13) [ 1254 0 R /XYZ 60.307257 537.141498 0 ] (jdb/:__span-10-14) [ 1254 0 R /XYZ 60.307257 523.741146 0 ] (jdb/:__span-10-15) [ 1254 0 R /XYZ 60.307257 510.340794 0 ] (jdb/:__span-10-16) [ 1254 0 R /XYZ 60.307257 496.940442 0 ] (jdb/:__span-10-17) [ 1254 0 R /XYZ 60.307257 483.540090 0 ] (jdb/:__span-10-18) [ 1254 0 R /XYZ 60.307257 470.139738 0 ] (jdb/:__span-10-19) [ 1254 0 R /XYZ 60.307257 456.739386 0 ] (jdb/:__span-10-2) [ 1254 0 R /XYZ 60.307257 684.545370 0 ] (jdb/:__span-10-20) [ 1254 0 R /XYZ 60.307257 443.339034 0 ] (jdb/:__span-10-21) [ 1254 0 R /XYZ 60.307257 429.938682 0 ] (jdb/:__span-10-22) [ 1254 0 R /XYZ 60.307257 416.538330 0 ] (jdb/:__span-10-23) [ 1254 0 R /XYZ 60.307257 403.137978 0 ] (jdb/:__span-10-3) [ 1254 0 R /XYZ 60.307257 671.145018 0 ] (jdb/:__span-10-4) [ 1254 0 R /XYZ 60.307257 657.744666 0 ] (jdb/:__span-10-5) [ 1254 0 R /XYZ 60.307257 644.344314 0 ] (jdb/:__span-10-6) [ 1254 0 R /XYZ 60.307257 630.943962 0 ] (jdb/:__span-10-7) [ 1254 0 R /XYZ 60.307257 617.543610 0 ] (jdb/:__span-10-8) [ 1254 0 R /XYZ 60.307257 604.143258 0 ] (jdb/:__span-10-9) [ 1254 0 R /XYZ 60.307257 590.742906 0 ] (jdb/:__span-11-1) [ 1273 0 R /XYZ 60.307257 129.981873 0 ] (jdb/:__span-11-10) [ 1277 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-11-11) [ 1277 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-11-12) [ 1277 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-11-13) [ 1277 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-11-14) [ 1277 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-11-15) [ 1277 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-11-16) [ 1277 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-11-17) [ 1277 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-11-18) [ 1277 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-11-19) [ 1277 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-11-2) [ 1273 0 R /XYZ 60.307257 116.581521 0 ] (jdb/:__span-11-20) [ 1277 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-11-21) [ 1277 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-11-22) [ 1277 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-11-3) [ 1273 0 R /XYZ 60.307257 103.181169 0 ] (jdb/:__span-11-4) [ 1273 0 R /XYZ 60.307257 89.780817 0 ] (jdb/:__span-11-5) [ 1277 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-11-6) [ 1277 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-11-7) [ 1277 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-11-8) [ 1277 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-11-9) [ 1277 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-12-1) [ 1277 0 R /XYZ 60.307257 477.501486 0 ] (jdb/:__span-12-10) [ 1277 0 R /XYZ 60.307257 356.898318 0 ] (jdb/:__span-12-11) [ 1277 0 R /XYZ 60.307257 343.497966 0 ] (jdb/:__span-12-12) [ 1277 0 R /XYZ 60.307257 330.097614 0 ] (jdb/:__span-12-13) [ 1277 0 R /XYZ 60.307257 316.697262 0 ] (jdb/:__span-12-14) [ 1277 0 R /XYZ 60.307257 303.296910 0 ] (jdb/:__span-12-15) [ 1277 0 R /XYZ 60.307257 289.896558 0 ] (jdb/:__span-12-16) [ 1277 0 R /XYZ 60.307257 276.496206 0 ] (jdb/:__span-12-17) [ 1277 0 R /XYZ 60.307257 263.095854 0 ] (jdb/:__span-12-18) [ 1277 0 R /XYZ 60.307257 249.695502 0 ] (jdb/:__span-12-19) [ 1277 0 R /XYZ 60.307257 236.295150 0 ] (jdb/:__span-12-2) [ 1277 0 R /XYZ 60.307257 464.101134 0 ] (jdb/:__span-12-20) [ 1277 0 R /XYZ 60.307257 222.894798 0 ] (jdb/:__span-12-21) [ 1277 0 R /XYZ 60.307257 209.494446 0 ] (jdb/:__span-12-22) [ 1277 0 R /XYZ 60.307257 196.094094 0 ] (jdb/:__span-12-3) [ 1277 0 R /XYZ 60.307257 450.700782 0 ] (jdb/:__span-12-4) [ 1277 0 R /XYZ 60.307257 437.300430 0 ] (jdb/:__span-12-5) [ 1277 0 R /XYZ 60.307257 423.900078 0 ] (jdb/:__span-12-6) [ 1277 0 R /XYZ 60.307257 410.499726 0 ] (jdb/:__span-12-7) [ 1277 0 R /XYZ 60.307257 397.099374 0 ] (jdb/:__span-12-8) [ 1277 0 R /XYZ 60.307257 383.699022 0 ] (jdb/:__span-12-9) [ 1277 0 R /XYZ 60.307257 370.298670 0 ] (jdb/:__span-13-1) [ 1281 0 R /XYZ 60.307257 722.344122 0 ] (jdb/:__span-13-2) [ 1281 0 R /XYZ 60.307257 708.943770 0 ] (jdb/:__span-13-3) [ 1281 0 R /XYZ 60.307257 695.543418 0 ] (jdb/:__span-13-4) [ 1281 0 R /XYZ 60.307257 682.143066 0 ] (jdb/:__span-13-5) [ 1281 0 R /XYZ 60.307257 668.742714 0 ] (jdb/:__span-13-6) [ 1281 0 R /XYZ 60.307257 655.342362 0 ] (jdb/:__span-13-7) [ 1281 0 R /XYZ 60.307257 641.942010 0 ] (jdb/:__span-13-8) [ 1281 0 R /XYZ 60.307257 628.541658 0 ] (jdb/:__span-13-9) [ 1281 0 R /XYZ 60.307257 615.141306 0 ] (jdb/:__span-14-1) [ 1281 0 R /XYZ 60.307257 510.012354 0 ] (jdb/:__span-14-2) [ 1281 0 R /XYZ 60.307257 496.612002 0 ] (jdb/:__span-14-3) [ 1281 0 R /XYZ 60.307257 483.211650 0 ] (jdb/:__span-14-4) [ 1281 0 R /XYZ 60.307257 469.811298 0 ] (jdb/:__span-14-5) [ 1281 0 R /XYZ 60.307257 456.410946 0 ] (jdb/:__span-14-6) [ 1281 0 R /XYZ 60.307257 443.010594 0 ] (jdb/:__span-14-7) [ 1281 0 R /XYZ 60.307257 429.610242 0 ] (jdb/:__span-14-8) [ 1281 0 R /XYZ 60.307257 416.209890 0 ] (jdb/:__span-14-9) [ 1281 0 R /XYZ 60.307257 402.809538 0 ] (jdb/:__span-15-1) [ 1319 0 R /XYZ 60.307257 512.569722 0 ] (jdb/:__span-15-10) [ 1319 0 R /XYZ 60.307257 391.966554 0 ] (jdb/:__span-15-11) [ 1319 0 R /XYZ 60.307257 378.566202 0 ] (jdb/:__span-15-12) [ 1319 0 R /XYZ 60.307257 365.165850 0 ] (jdb/:__span-15-13) [ 1319 0 R /XYZ 60.307257 351.765498 0 ] (jdb/:__span-15-14) [ 1319 0 R /XYZ 60.307257 338.365146 0 ] (jdb/:__span-15-15) [ 1319 0 R /XYZ 60.307257 324.964794 0 ] (jdb/:__span-15-16) [ 1319 0 R /XYZ 60.307257 311.564442 0 ] (jdb/:__span-15-17) [ 1319 0 R /XYZ 60.307257 298.164090 0 ] (jdb/:__span-15-18) [ 1319 0 R /XYZ 60.307257 284.763738 0 ] (jdb/:__span-15-2) [ 1319 0 R /XYZ 60.307257 499.169370 0 ] (jdb/:__span-15-3) [ 1319 0 R /XYZ 60.307257 485.769018 0 ] (jdb/:__span-15-4) [ 1319 0 R /XYZ 60.307257 472.368666 0 ] (jdb/:__span-15-5) [ 1319 0 R /XYZ 60.307257 458.968314 0 ] (jdb/:__span-15-6) [ 1319 0 R /XYZ 60.307257 445.567962 0 ] (jdb/:__span-15-7) [ 1319 0 R /XYZ 60.307257 432.167610 0 ] (jdb/:__span-15-8) [ 1319 0 R /XYZ 60.307257 418.767258 0 ] (jdb/:__span-15-9) [ 1319 0 R /XYZ 60.307257 405.366906 0 ] (jdb/:__span-16-1) [ 1324 0 R /XYZ 60.307257 422.361822 0 ] (jdb/:__span-16-10) [ 1324 0 R /XYZ 60.307257 301.758654 0 ] (jdb/:__span-16-11) [ 1324 0 R /XYZ 60.307257 288.358302 0 ] (jdb/:__span-16-12) [ 1324 0 R /XYZ 60.307257 274.957950 0 ] (jdb/:__span-16-13) [ 1324 0 R /XYZ 60.307257 261.557598 0 ] (jdb/:__span-16-14) [ 1324 0 R /XYZ 60.307257 248.157246 0 ] (jdb/:__span-16-15) [ 1324 0 R /XYZ 60.307257 234.756894 0 ] (jdb/:__span-16-16) [ 1324 0 R /XYZ 60.307257 221.356542 0 ] (jdb/:__span-16-17) [ 1324 0 R /XYZ 60.307257 207.956190 0 ] (jdb/:__span-16-18) [ 1324 0 R /XYZ 60.307257 194.555838 0 ] (jdb/:__span-16-2) [ 1324 0 R /XYZ 60.307257 408.961470 0 ] (jdb/:__span-16-3) [ 1324 0 R /XYZ 60.307257 395.561118 0 ] (jdb/:__span-16-4) [ 1324 0 R /XYZ 60.307257 382.160766 0 ] (jdb/:__span-16-5) [ 1324 0 R /XYZ 60.307257 368.760414 0 ] (jdb/:__span-16-6) [ 1324 0 R /XYZ 60.307257 355.360062 0 ] (jdb/:__span-16-7) [ 1324 0 R /XYZ 60.307257 341.959710 0 ] (jdb/:__span-16-8) [ 1324 0 R /XYZ 60.307257 328.559358 0 ] (jdb/:__span-16-9) [ 1324 0 R /XYZ 60.307257 315.159006 0 ] (jdb/:__span-17-1) [ 1335 0 R /XYZ 60.307257 363.601105 0 ] (jdb/:__span-17-10) [ 1335 0 R /XYZ 60.307257 242.997937 0 ] (jdb/:__span-17-11) [ 1335 0 R /XYZ 60.307257 229.597585 0 ] (jdb/:__span-17-12) [ 1335 0 R /XYZ 60.307257 202.796881 0 ] (jdb/:__span-17-13) [ 1335 0 R /XYZ 60.307257 189.396529 0 ] (jdb/:__span-17-14) [ 1335 0 R /XYZ 60.307257 175.996177 0 ] (jdb/:__span-17-15) [ 1335 0 R /XYZ 60.307257 162.595825 0 ] (jdb/:__span-17-16) [ 1335 0 R /XYZ 60.307257 149.195473 0 ] (jdb/:__span-17-17) [ 1335 0 R /XYZ 60.307257 135.795121 0 ] (jdb/:__span-17-18) [ 1335 0 R /XYZ 60.307257 122.394769 0 ] (jdb/:__span-17-19) [ 1335 0 R /XYZ 60.307257 108.994417 0 ] (jdb/:__span-17-2) [ 1335 0 R /XYZ 60.307257 350.200753 0 ] (jdb/:__span-17-20) [ 1335 0 R /XYZ 60.307257 95.594065 0 ] (jdb/:__span-17-21) [ 1339 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-17-22) [ 1339 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-17-23) [ 1339 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-17-24) [ 1339 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-17-3) [ 1335 0 R /XYZ 60.307257 336.800401 0 ] (jdb/:__span-17-4) [ 1335 0 R /XYZ 60.307257 323.400049 0 ] (jdb/:__span-17-5) [ 1335 0 R /XYZ 60.307257 309.999697 0 ] (jdb/:__span-17-6) [ 1335 0 R /XYZ 60.307257 296.599345 0 ] (jdb/:__span-17-7) [ 1335 0 R /XYZ 60.307257 283.198993 0 ] (jdb/:__span-17-8) [ 1335 0 R /XYZ 60.307257 269.798641 0 ] (jdb/:__span-17-9) [ 1335 0 R /XYZ 60.307257 256.398289 0 ] (jdb/:__span-18-1) [ 1370 0 R /XYZ 60.307257 236.252922 0 ] (jdb/:__span-18-10) [ 1372 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-18-11) [ 1372 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-18-12) [ 1372 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-18-13) [ 1372 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-18-14) [ 1372 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-18-15) [ 1372 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-18-16) [ 1372 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-18-17) [ 1372 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-18-18) [ 1372 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-18-2) [ 1370 0 R /XYZ 60.307257 222.852570 0 ] (jdb/:__span-18-3) [ 1370 0 R /XYZ 60.307257 209.452218 0 ] (jdb/:__span-18-4) [ 1370 0 R /XYZ 60.307257 169.251162 0 ] (jdb/:__span-18-5) [ 1370 0 R /XYZ 60.307257 142.450458 0 ] (jdb/:__span-18-6) [ 1370 0 R /XYZ 60.307257 129.050106 0 ] (jdb/:__span-18-7) [ 1370 0 R /XYZ 60.307257 115.649754 0 ] (jdb/:__span-18-8) [ 1370 0 R /XYZ 60.307257 88.849050 0 ] (jdb/:__span-18-9) [ 1372 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-19-1) [ 1372 0 R /XYZ 60.307257 464.101134 0 ] (jdb/:__span-19-2) [ 1372 0 R /XYZ 60.307257 450.700782 0 ] (jdb/:__span-19-3) [ 1372 0 R /XYZ 60.307257 437.300430 0 ] (jdb/:__span-19-4) [ 1372 0 R /XYZ 60.307257 423.900078 0 ] (jdb/:__span-2-1) [ 1089 0 R /XYZ 60.307257 131.561058 0 ] (jdb/:__span-2-2) [ 1089 0 R /XYZ 60.307257 118.160706 0 ] (jdb/:__span-2-3) [ 1089 0 R /XYZ 60.307257 104.760354 0 ] (jdb/:__span-2-4) [ 1089 0 R /XYZ 60.307257 91.360002 0 ] (jdb/:__span-2-5) [ 1099 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-2-6) [ 1099 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-2-7) [ 1099 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-2-8) [ 1099 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-20-1) [ 1372 0 R /XYZ 60.307257 333.785526 0 ] (jdb/:__span-20-2) [ 1372 0 R /XYZ 60.307257 320.385174 0 ] (jdb/:__span-20-3) [ 1372 0 R /XYZ 60.307257 306.984822 0 ] (jdb/:__span-20-4) [ 1372 0 R /XYZ 60.307257 293.584470 0 ] (jdb/:__span-21-1) [ 1372 0 R /XYZ 60.307257 227.868318 0 ] (jdb/:__span-21-2) [ 1372 0 R /XYZ 60.307257 214.467966 0 ] (jdb/:__span-21-3) [ 1372 0 R /XYZ 60.307257 201.067614 0 ] (jdb/:__span-21-4) [ 1372 0 R /XYZ 60.307257 187.667262 0 ] (jdb/:__span-21-5) [ 1372 0 R /XYZ 60.307257 174.266910 0 ] (jdb/:__span-21-6) [ 1372 0 R /XYZ 60.307257 160.866558 0 ] (jdb/:__span-21-7) [ 1372 0 R /XYZ 60.307257 134.065854 0 ] (jdb/:__span-21-8) [ 1372 0 R /XYZ 60.307257 120.665502 0 ] (jdb/:__span-22-1) [ 1374 0 R /XYZ 60.307257 697.945722 0 ] (jdb/:__span-22-2) [ 1374 0 R /XYZ 60.307257 684.545370 0 ] (jdb/:__span-22-3) [ 1374 0 R /XYZ 60.307257 671.145018 0 ] (jdb/:__span-22-4) [ 1374 0 R /XYZ 60.307257 644.344314 0 ] (jdb/:__span-22-5) [ 1374 0 R /XYZ 60.307257 630.943962 0 ] (jdb/:__span-23-1) [ 1391 0 R /XYZ 60.307257 422.056122 0 ] (jdb/:__span-23-2) [ 1391 0 R /XYZ 60.307257 381.855066 0 ] (jdb/:__span-23-3) [ 1391 0 R /XYZ 60.307257 368.454714 0 ] (jdb/:__span-23-4) [ 1391 0 R /XYZ 60.307257 355.054362 0 ] (jdb/:__span-23-5) [ 1391 0 R /XYZ 60.307257 341.654010 0 ] (jdb/:__span-24-1) [ 1396 0 R /XYZ 60.307257 520.588122 0 ] (jdb/:__span-24-10) [ 1396 0 R /XYZ 60.307257 373.184250 0 ] (jdb/:__span-24-2) [ 1396 0 R /XYZ 60.307257 480.387066 0 ] (jdb/:__span-24-3) [ 1396 0 R /XYZ 60.307257 466.986714 0 ] (jdb/:__span-24-4) [ 1396 0 R /XYZ 60.307257 453.586362 0 ] (jdb/:__span-24-5) [ 1396 0 R /XYZ 60.307257 440.186010 0 ] (jdb/:__span-24-6) [ 1396 0 R /XYZ 60.307257 426.785658 0 ] (jdb/:__span-24-7) [ 1396 0 R /XYZ 60.307257 413.385306 0 ] (jdb/:__span-24-8) [ 1396 0 R /XYZ 60.307257 399.984954 0 ] (jdb/:__span-24-9) [ 1396 0 R /XYZ 60.307257 386.584602 0 ] (jdb/:__span-25-1) [ 1398 0 R /XYZ 60.307257 342.292122 0 ] (jdb/:__span-25-10) [ 1398 0 R /XYZ 60.307257 221.688954 0 ] (jdb/:__span-25-11) [ 1398 0 R /XYZ 60.307257 208.288602 0 ] (jdb/:__span-25-12) [ 1398 0 R /XYZ 60.307257 194.888250 0 ] (jdb/:__span-25-13) [ 1398 0 R /XYZ 60.307257 181.487898 0 ] (jdb/:__span-25-14) [ 1398 0 R /XYZ 60.307257 168.087546 0 ] (jdb/:__span-25-15) [ 1398 0 R /XYZ 60.307257 154.687194 0 ] (jdb/:__span-25-16) [ 1398 0 R /XYZ 60.307257 141.286842 0 ] (jdb/:__span-25-17) [ 1398 0 R /XYZ 60.307257 127.886490 0 ] (jdb/:__span-25-18) [ 1398 0 R /XYZ 60.307257 114.486138 0 ] (jdb/:__span-25-19) [ 1398 0 R /XYZ 60.307257 101.085786 0 ] (jdb/:__span-25-2) [ 1398 0 R /XYZ 60.307257 328.891770 0 ] (jdb/:__span-25-20) [ 1398 0 R /XYZ 60.307257 87.685434 0 ] (jdb/:__span-25-21) [ 1400 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-25-22) [ 1400 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-25-23) [ 1400 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-25-24) [ 1400 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-25-25) [ 1400 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-25-26) [ 1400 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-25-27) [ 1400 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-25-28) [ 1400 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-25-29) [ 1400 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-25-3) [ 1398 0 R /XYZ 60.307257 315.491418 0 ] (jdb/:__span-25-30) [ 1400 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-25-31) [ 1400 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-25-32) [ 1400 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-25-33) [ 1400 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-25-34) [ 1400 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-25-35) [ 1400 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-25-36) [ 1400 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-25-37) [ 1400 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-25-38) [ 1400 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-25-39) [ 1400 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-25-4) [ 1398 0 R /XYZ 60.307257 302.091066 0 ] (jdb/:__span-25-40) [ 1400 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-25-41) [ 1400 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-25-42) [ 1400 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-25-43) [ 1400 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-25-44) [ 1400 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-25-45) [ 1400 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-25-46) [ 1400 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-25-47) [ 1400 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-25-48) [ 1400 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-25-49) [ 1400 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-25-5) [ 1398 0 R /XYZ 60.307257 288.690714 0 ] (jdb/:__span-25-50) [ 1400 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-25-51) [ 1400 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-25-52) [ 1400 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-25-53) [ 1400 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-25-54) [ 1400 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-25-55) [ 1400 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-25-56) [ 1400 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-25-57) [ 1400 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-25-58) [ 1400 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-25-59) [ 1400 0 R /XYZ 60.307257 235.009542 0 ] (jdb/:__span-25-6) [ 1398 0 R /XYZ 60.307257 275.290362 0 ] (jdb/:__span-25-60) [ 1400 0 R /XYZ 60.307257 221.609190 0 ] (jdb/:__span-25-61) [ 1400 0 R /XYZ 60.307257 208.208838 0 ] (jdb/:__span-25-62) [ 1400 0 R /XYZ 60.307257 194.808486 0 ] (jdb/:__span-25-63) [ 1400 0 R /XYZ 60.307257 181.408134 0 ] (jdb/:__span-25-64) [ 1400 0 R /XYZ 60.307257 168.007782 0 ] (jdb/:__span-25-65) [ 1400 0 R /XYZ 60.307257 154.607430 0 ] (jdb/:__span-25-66) [ 1400 0 R /XYZ 60.307257 141.207078 0 ] (jdb/:__span-25-67) [ 1400 0 R /XYZ 60.307257 127.806726 0 ] (jdb/:__span-25-68) [ 1400 0 R /XYZ 60.307257 114.406374 0 ] (jdb/:__span-25-7) [ 1398 0 R /XYZ 60.307257 261.890010 0 ] (jdb/:__span-25-8) [ 1398 0 R /XYZ 60.307257 248.489658 0 ] (jdb/:__span-25-9) [ 1398 0 R /XYZ 60.307257 235.089306 0 ] (jdb/:__span-26-1) [ 1402 0 R /XYZ 60.307257 412.672122 0 ] (jdb/:__span-26-2) [ 1402 0 R /XYZ 60.307257 385.871418 0 ] (jdb/:__span-26-3) [ 1402 0 R /XYZ 60.307257 372.471066 0 ] (jdb/:__span-26-4) [ 1402 0 R /XYZ 60.307257 345.670362 0 ] (jdb/:__span-26-5) [ 1402 0 R /XYZ 60.307257 332.270010 0 ] (jdb/:__span-26-6) [ 1402 0 R /XYZ 60.307257 305.469306 0 ] (jdb/:__span-27-1) [ 1442 0 R /XYZ 60.307257 292.862622 0 ] (jdb/:__span-27-10) [ 1442 0 R /XYZ 60.307257 158.859102 0 ] (jdb/:__span-27-2) [ 1442 0 R /XYZ 60.307257 279.462270 0 ] (jdb/:__span-27-3) [ 1442 0 R /XYZ 60.307257 266.061918 0 ] (jdb/:__span-27-4) [ 1442 0 R /XYZ 60.307257 252.661566 0 ] (jdb/:__span-27-5) [ 1442 0 R /XYZ 60.307257 239.261214 0 ] (jdb/:__span-27-6) [ 1442 0 R /XYZ 60.307257 225.860862 0 ] (jdb/:__span-27-7) [ 1442 0 R /XYZ 60.307257 212.460510 0 ] (jdb/:__span-27-8) [ 1442 0 R /XYZ 60.307257 185.659806 0 ] (jdb/:__span-27-9) [ 1442 0 R /XYZ 60.307257 172.259454 0 ] (jdb/:__span-28-1) [ 1446 0 R /XYZ 60.307257 722.344122 0 ] (jdb/:__span-28-10) [ 1446 0 R /XYZ 60.307257 548.139546 0 ] (jdb/:__span-28-11) [ 1446 0 R /XYZ 60.307257 534.739194 0 ] (jdb/:__span-28-12) [ 1446 0 R /XYZ 60.307257 521.338842 0 ] (jdb/:__span-28-13) [ 1446 0 R /XYZ 60.307257 507.938490 0 ] (jdb/:__span-28-14) [ 1446 0 R /XYZ 60.307257 467.737434 0 ] (jdb/:__span-28-15) [ 1446 0 R /XYZ 60.307257 454.337082 0 ] (jdb/:__span-28-16) [ 1446 0 R /XYZ 60.307257 440.936730 0 ] (jdb/:__span-28-17) [ 1446 0 R /XYZ 60.307257 427.536378 0 ] (jdb/:__span-28-2) [ 1446 0 R /XYZ 60.307257 708.943770 0 ] (jdb/:__span-28-3) [ 1446 0 R /XYZ 60.307257 668.742714 0 ] (jdb/:__span-28-4) [ 1446 0 R /XYZ 60.307257 655.342362 0 ] (jdb/:__span-28-5) [ 1446 0 R /XYZ 60.307257 641.942010 0 ] (jdb/:__span-28-6) [ 1446 0 R /XYZ 60.307257 628.541658 0 ] (jdb/:__span-28-7) [ 1446 0 R /XYZ 60.307257 601.740954 0 ] (jdb/:__span-28-8) [ 1446 0 R /XYZ 60.307257 588.340602 0 ] (jdb/:__span-28-9) [ 1446 0 R /XYZ 60.307257 574.940250 0 ] (jdb/:__span-29-1) [ 1446 0 R /XYZ 60.307257 361.820226 0 ] (jdb/:__span-29-2) [ 1446 0 R /XYZ 60.307257 348.419874 0 ] (jdb/:__span-29-3) [ 1446 0 R /XYZ 60.307257 335.019522 0 ] (jdb/:__span-29-4) [ 1446 0 R /XYZ 60.307257 321.619170 0 ] (jdb/:__span-29-5) [ 1446 0 R /XYZ 60.307257 308.218818 0 ] (jdb/:__span-3-1) [ 1099 0 R /XYZ 60.307257 665.106414 0 ] (jdb/:__span-3-10) [ 1099 0 R /XYZ 60.307257 544.503246 0 ] (jdb/:__span-3-11) [ 1099 0 R /XYZ 60.307257 531.102894 0 ] (jdb/:__span-3-12) [ 1099 0 R /XYZ 60.307257 517.702542 0 ] (jdb/:__span-3-13) [ 1099 0 R /XYZ 60.307257 504.302190 0 ] (jdb/:__span-3-14) [ 1099 0 R /XYZ 60.307257 477.501486 0 ] (jdb/:__span-3-15) [ 1099 0 R /XYZ 60.307257 464.101134 0 ] (jdb/:__span-3-16) [ 1099 0 R /XYZ 60.307257 437.300430 0 ] (jdb/:__span-3-17) [ 1099 0 R /XYZ 60.307257 423.900078 0 ] (jdb/:__span-3-18) [ 1099 0 R /XYZ 60.307257 410.499726 0 ] (jdb/:__span-3-19) [ 1099 0 R /XYZ 60.307257 397.099374 0 ] (jdb/:__span-3-2) [ 1099 0 R /XYZ 60.307257 651.706062 0 ] (jdb/:__span-3-20) [ 1099 0 R /XYZ 60.307257 383.699022 0 ] (jdb/:__span-3-21) [ 1099 0 R /XYZ 60.307257 370.298670 0 ] (jdb/:__span-3-22) [ 1099 0 R /XYZ 60.307257 356.898318 0 ] (jdb/:__span-3-3) [ 1099 0 R /XYZ 60.307257 638.305710 0 ] (jdb/:__span-3-4) [ 1099 0 R /XYZ 60.307257 624.905358 0 ] (jdb/:__span-3-5) [ 1099 0 R /XYZ 60.307257 611.505006 0 ] (jdb/:__span-3-6) [ 1099 0 R /XYZ 60.307257 598.104654 0 ] (jdb/:__span-3-7) [ 1099 0 R /XYZ 60.307257 584.704302 0 ] (jdb/:__span-3-8) [ 1099 0 R /XYZ 60.307257 571.303950 0 ] (jdb/:__span-3-9) [ 1099 0 R /XYZ 60.307257 557.903598 0 ] (jdb/:__span-30-1) [ 1450 0 R /XYZ 60.307257 763.633722 0 ] (jdb/:__span-30-2) [ 1450 0 R /XYZ 60.307257 750.233370 0 ] (jdb/:__span-31-1) [ 1515 0 R /XYZ 60.307257 525.280122 0 ] (jdb/:__span-31-10) [ 1515 0 R /XYZ 60.307257 404.676954 0 ] (jdb/:__span-31-11) [ 1515 0 R /XYZ 60.307257 391.276602 0 ] (jdb/:__span-31-12) [ 1515 0 R /XYZ 60.307257 377.876250 0 ] (jdb/:__span-31-13) [ 1515 0 R /XYZ 60.307257 364.475898 0 ] (jdb/:__span-31-14) [ 1515 0 R /XYZ 60.307257 351.075546 0 ] (jdb/:__span-31-15) [ 1515 0 R /XYZ 60.307257 337.675194 0 ] (jdb/:__span-31-16) [ 1515 0 R /XYZ 60.307257 324.274842 0 ] (jdb/:__span-31-17) [ 1515 0 R /XYZ 60.307257 310.874490 0 ] (jdb/:__span-31-18) [ 1515 0 R /XYZ 60.307257 297.474138 0 ] (jdb/:__span-31-19) [ 1515 0 R /XYZ 60.307257 284.073786 0 ] (jdb/:__span-31-2) [ 1515 0 R /XYZ 60.307257 511.879770 0 ] (jdb/:__span-31-20) [ 1515 0 R /XYZ 60.307257 270.673434 0 ] (jdb/:__span-31-21) [ 1515 0 R /XYZ 60.307257 257.273082 0 ] (jdb/:__span-31-22) [ 1515 0 R /XYZ 60.307257 243.872730 0 ] (jdb/:__span-31-23) [ 1515 0 R /XYZ 60.307257 230.472378 0 ] (jdb/:__span-31-24) [ 1515 0 R /XYZ 60.307257 217.072026 0 ] (jdb/:__span-31-25) [ 1515 0 R /XYZ 60.307257 203.671674 0 ] (jdb/:__span-31-26) [ 1515 0 R /XYZ 60.307257 190.271322 0 ] (jdb/:__span-31-27) [ 1515 0 R /XYZ 60.307257 176.870970 0 ] (jdb/:__span-31-28) [ 1515 0 R /XYZ 60.307257 163.470618 0 ] (jdb/:__span-31-29) [ 1515 0 R /XYZ 60.307257 150.070266 0 ] (jdb/:__span-31-3) [ 1515 0 R /XYZ 60.307257 498.479418 0 ] (jdb/:__span-31-30) [ 1515 0 R /XYZ 60.307257 136.669914 0 ] (jdb/:__span-31-31) [ 1515 0 R /XYZ 60.307257 123.269562 0 ] (jdb/:__span-31-32) [ 1515 0 R /XYZ 60.307257 109.869210 0 ] (jdb/:__span-31-33) [ 1515 0 R /XYZ 60.307257 96.468858 0 ] (jdb/:__span-31-34) [ 1517 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-31-35) [ 1517 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-31-36) [ 1517 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-31-37) [ 1517 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-31-38) [ 1517 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-31-39) [ 1517 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-31-4) [ 1515 0 R /XYZ 60.307257 485.079066 0 ] (jdb/:__span-31-40) [ 1517 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-31-41) [ 1517 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-31-42) [ 1517 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-31-43) [ 1517 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-31-44) [ 1517 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-31-45) [ 1517 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-31-46) [ 1517 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-31-47) [ 1517 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-31-48) [ 1517 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-31-49) [ 1517 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-31-5) [ 1515 0 R /XYZ 60.307257 471.678714 0 ] (jdb/:__span-31-50) [ 1517 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-31-6) [ 1515 0 R /XYZ 60.307257 458.278362 0 ] (jdb/:__span-31-7) [ 1515 0 R /XYZ 60.307257 444.878010 0 ] (jdb/:__span-31-8) [ 1515 0 R /XYZ 60.307257 431.477658 0 ] (jdb/:__span-31-9) [ 1515 0 R /XYZ 60.307257 418.077306 0 ] (jdb/:__span-32-1) [ 1536 0 R /XYZ 60.307257 737.358522 0 ] (jdb/:__span-32-10) [ 1536 0 R /XYZ 60.307257 603.355002 0 ] (jdb/:__span-32-11) [ 1536 0 R /XYZ 60.307257 589.954650 0 ] (jdb/:__span-32-12) [ 1536 0 R /XYZ 60.307257 576.554298 0 ] (jdb/:__span-32-13) [ 1536 0 R /XYZ 60.307257 563.153946 0 ] (jdb/:__span-32-14) [ 1536 0 R /XYZ 60.307257 549.753594 0 ] (jdb/:__span-32-15) [ 1536 0 R /XYZ 60.307257 536.353242 0 ] (jdb/:__span-32-16) [ 1536 0 R /XYZ 60.307257 522.952890 0 ] (jdb/:__span-32-17) [ 1536 0 R /XYZ 60.307257 509.552538 0 ] (jdb/:__span-32-18) [ 1536 0 R /XYZ 60.307257 482.751834 0 ] (jdb/:__span-32-19) [ 1536 0 R /XYZ 60.307257 455.951130 0 ] (jdb/:__span-32-2) [ 1536 0 R /XYZ 60.307257 723.958170 0 ] (jdb/:__span-32-20) [ 1536 0 R /XYZ 60.307257 442.550778 0 ] (jdb/:__span-32-21) [ 1536 0 R /XYZ 60.307257 429.150426 0 ] (jdb/:__span-32-22) [ 1536 0 R /XYZ 60.307257 415.750074 0 ] (jdb/:__span-32-23) [ 1536 0 R /XYZ 60.307257 402.349722 0 ] (jdb/:__span-32-24) [ 1536 0 R /XYZ 60.307257 388.949370 0 ] (jdb/:__span-32-25) [ 1536 0 R /XYZ 60.307257 362.148666 0 ] (jdb/:__span-32-26) [ 1536 0 R /XYZ 60.307257 335.347962 0 ] (jdb/:__span-32-27) [ 1536 0 R /XYZ 60.307257 321.947610 0 ] (jdb/:__span-32-28) [ 1536 0 R /XYZ 60.307257 308.547258 0 ] (jdb/:__span-32-29) [ 1536 0 R /XYZ 60.307257 295.146906 0 ] (jdb/:__span-32-3) [ 1536 0 R /XYZ 60.307257 710.557818 0 ] (jdb/:__span-32-30) [ 1536 0 R /XYZ 60.307257 281.746554 0 ] (jdb/:__span-32-31) [ 1536 0 R /XYZ 60.307257 268.346202 0 ] (jdb/:__span-32-32) [ 1536 0 R /XYZ 60.307257 254.945850 0 ] (jdb/:__span-32-33) [ 1536 0 R /XYZ 60.307257 241.545498 0 ] (jdb/:__span-32-34) [ 1536 0 R /XYZ 60.307257 214.744794 0 ] (jdb/:__span-32-35) [ 1536 0 R /XYZ 60.307257 201.344442 0 ] (jdb/:__span-32-36) [ 1536 0 R /XYZ 60.307257 174.543738 0 ] (jdb/:__span-32-37) [ 1536 0 R /XYZ 60.307257 147.743034 0 ] (jdb/:__span-32-38) [ 1536 0 R /XYZ 60.307257 120.942330 0 ] (jdb/:__span-32-39) [ 1536 0 R /XYZ 60.307257 107.541978 0 ] (jdb/:__span-32-4) [ 1536 0 R /XYZ 60.307257 697.157466 0 ] (jdb/:__span-32-40) [ 1536 0 R /XYZ 60.307257 94.141626 0 ] (jdb/:__span-32-41) [ 1538 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-32-42) [ 1538 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-32-43) [ 1538 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-32-44) [ 1538 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-32-45) [ 1538 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-32-46) [ 1538 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-32-47) [ 1538 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-32-48) [ 1538 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-32-49) [ 1538 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-32-5) [ 1536 0 R /XYZ 60.307257 670.356762 0 ] (jdb/:__span-32-50) [ 1538 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-32-51) [ 1538 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-32-52) [ 1538 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-32-53) [ 1538 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-32-54) [ 1538 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-32-55) [ 1538 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-32-56) [ 1538 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-32-57) [ 1538 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-32-58) [ 1538 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-32-59) [ 1538 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-32-6) [ 1536 0 R /XYZ 60.307257 656.956410 0 ] (jdb/:__span-32-60) [ 1538 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-32-61) [ 1538 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-32-62) [ 1538 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-32-63) [ 1538 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-32-64) [ 1538 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-32-65) [ 1538 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-32-66) [ 1538 0 R /XYZ 60.307257 355.612710 0 ] (jdb/:__span-32-67) [ 1538 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-32-68) [ 1538 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-32-69) [ 1538 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-32-7) [ 1536 0 R /XYZ 60.307257 643.556058 0 ] (jdb/:__span-32-70) [ 1538 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-32-71) [ 1538 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-32-72) [ 1538 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-32-73) [ 1538 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-32-74) [ 1538 0 R /XYZ 60.307257 235.009542 0 ] (jdb/:__span-32-8) [ 1536 0 R /XYZ 60.307257 630.155706 0 ] (jdb/:__span-32-9) [ 1536 0 R /XYZ 60.307257 616.755354 0 ] (jdb/:__span-33-1) [ 1538 0 R /XYZ 60.307257 195.568590 0 ] (jdb/:__span-33-2) [ 1538 0 R /XYZ 60.307257 182.168238 0 ] (jdb/:__span-34-1) [ 1540 0 R /XYZ 60.307257 682.931322 0 ] (jdb/:__span-34-10) [ 1540 0 R /XYZ 60.307257 535.527450 0 ] (jdb/:__span-34-11) [ 1540 0 R /XYZ 60.307257 522.127098 0 ] (jdb/:__span-34-12) [ 1540 0 R /XYZ 60.307257 508.726746 0 ] (jdb/:__span-34-13) [ 1540 0 R /XYZ 60.307257 495.326394 0 ] (jdb/:__span-34-14) [ 1540 0 R /XYZ 60.307257 468.525690 0 ] (jdb/:__span-34-15) [ 1540 0 R /XYZ 60.307257 455.125338 0 ] (jdb/:__span-34-16) [ 1540 0 R /XYZ 60.307257 428.324634 0 ] (jdb/:__span-34-17) [ 1540 0 R /XYZ 60.307257 414.924282 0 ] (jdb/:__span-34-18) [ 1540 0 R /XYZ 60.307257 388.123578 0 ] (jdb/:__span-34-19) [ 1540 0 R /XYZ 60.307257 374.723226 0 ] (jdb/:__span-34-2) [ 1540 0 R /XYZ 60.307257 669.530970 0 ] (jdb/:__span-34-20) [ 1540 0 R /XYZ 60.307257 361.322874 0 ] (jdb/:__span-34-21) [ 1540 0 R /XYZ 60.307257 347.922522 0 ] (jdb/:__span-34-22) [ 1540 0 R /XYZ 60.307257 334.522170 0 ] (jdb/:__span-34-23) [ 1540 0 R /XYZ 60.307257 307.721466 0 ] (jdb/:__span-34-24) [ 1540 0 R /XYZ 60.307257 294.321114 0 ] (jdb/:__span-34-25) [ 1540 0 R /XYZ 60.307257 267.520410 0 ] (jdb/:__span-34-26) [ 1540 0 R /XYZ 60.307257 254.120058 0 ] (jdb/:__span-34-27) [ 1540 0 R /XYZ 60.307257 227.319354 0 ] (jdb/:__span-34-28) [ 1540 0 R /XYZ 60.307257 213.919002 0 ] (jdb/:__span-34-29) [ 1540 0 R /XYZ 60.307257 200.518650 0 ] (jdb/:__span-34-3) [ 1540 0 R /XYZ 60.307257 656.130618 0 ] (jdb/:__span-34-30) [ 1540 0 R /XYZ 60.307257 173.717946 0 ] (jdb/:__span-34-31) [ 1540 0 R /XYZ 60.307257 160.317594 0 ] (jdb/:__span-34-32) [ 1540 0 R /XYZ 60.307257 146.917242 0 ] (jdb/:__span-34-4) [ 1540 0 R /XYZ 60.307257 642.730266 0 ] (jdb/:__span-34-5) [ 1540 0 R /XYZ 60.307257 629.329914 0 ] (jdb/:__span-34-6) [ 1540 0 R /XYZ 60.307257 615.929562 0 ] (jdb/:__span-34-7) [ 1540 0 R /XYZ 60.307257 602.529210 0 ] (jdb/:__span-34-8) [ 1540 0 R /XYZ 60.307257 575.728506 0 ] (jdb/:__span-34-9) [ 1540 0 R /XYZ 60.307257 562.328154 0 ] (jdb/:__span-35-1) [ 1542 0 R /XYZ 60.307257 519.649722 0 ] (jdb/:__span-35-10) [ 1542 0 R /XYZ 60.307257 385.646202 0 ] (jdb/:__span-35-11) [ 1542 0 R /XYZ 60.307257 372.245850 0 ] (jdb/:__span-35-12) [ 1542 0 R /XYZ 60.307257 358.845498 0 ] (jdb/:__span-35-13) [ 1542 0 R /XYZ 60.307257 332.044794 0 ] (jdb/:__span-35-14) [ 1542 0 R /XYZ 60.307257 318.644442 0 ] (jdb/:__span-35-15) [ 1542 0 R /XYZ 60.307257 305.244090 0 ] (jdb/:__span-35-16) [ 1542 0 R /XYZ 60.307257 291.843738 0 ] (jdb/:__span-35-17) [ 1542 0 R /XYZ 60.307257 278.443386 0 ] (jdb/:__span-35-18) [ 1542 0 R /XYZ 60.307257 265.043034 0 ] (jdb/:__span-35-19) [ 1542 0 R /XYZ 60.307257 251.642682 0 ] (jdb/:__span-35-2) [ 1542 0 R /XYZ 60.307257 506.249370 0 ] (jdb/:__span-35-20) [ 1542 0 R /XYZ 60.307257 238.242330 0 ] (jdb/:__span-35-21) [ 1542 0 R /XYZ 60.307257 224.841978 0 ] (jdb/:__span-35-22) [ 1542 0 R /XYZ 60.307257 198.041274 0 ] (jdb/:__span-35-23) [ 1542 0 R /XYZ 60.307257 171.240570 0 ] (jdb/:__span-35-24) [ 1542 0 R /XYZ 60.307257 157.840218 0 ] (jdb/:__span-35-25) [ 1542 0 R /XYZ 60.307257 144.439866 0 ] (jdb/:__span-35-26) [ 1542 0 R /XYZ 60.307257 131.039514 0 ] (jdb/:__span-35-27) [ 1542 0 R /XYZ 60.307257 104.238810 0 ] (jdb/:__span-35-28) [ 1542 0 R /XYZ 60.307257 90.838458 0 ] (jdb/:__span-35-29) [ 1544 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-35-3) [ 1542 0 R /XYZ 60.307257 492.849018 0 ] (jdb/:__span-35-30) [ 1544 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-35-31) [ 1544 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-35-32) [ 1544 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-35-4) [ 1542 0 R /XYZ 60.307257 479.448666 0 ] (jdb/:__span-35-5) [ 1542 0 R /XYZ 60.307257 452.647962 0 ] (jdb/:__span-35-6) [ 1542 0 R /XYZ 60.307257 439.247610 0 ] (jdb/:__span-35-7) [ 1542 0 R /XYZ 60.307257 425.847258 0 ] (jdb/:__span-35-8) [ 1542 0 R /XYZ 60.307257 412.446906 0 ] (jdb/:__span-35-9) [ 1542 0 R /XYZ 60.307257 399.046554 0 ] (jdb/:__span-36-1) [ 1549 0 R /XYZ 60.307257 619.120122 0 ] (jdb/:__span-36-10) [ 1549 0 R /XYZ 60.307257 498.516954 0 ] (jdb/:__span-36-11) [ 1549 0 R /XYZ 60.307257 485.116602 0 ] (jdb/:__span-36-12) [ 1549 0 R /XYZ 60.307257 471.716250 0 ] (jdb/:__span-36-13) [ 1549 0 R /XYZ 60.307257 458.315898 0 ] (jdb/:__span-36-14) [ 1549 0 R /XYZ 60.307257 444.915546 0 ] (jdb/:__span-36-15) [ 1549 0 R /XYZ 60.307257 431.515194 0 ] (jdb/:__span-36-16) [ 1549 0 R /XYZ 60.307257 418.114842 0 ] (jdb/:__span-36-17) [ 1549 0 R /XYZ 60.307257 404.714490 0 ] (jdb/:__span-36-18) [ 1549 0 R /XYZ 60.307257 391.314138 0 ] (jdb/:__span-36-19) [ 1549 0 R /XYZ 60.307257 377.913786 0 ] (jdb/:__span-36-2) [ 1549 0 R /XYZ 60.307257 605.719770 0 ] (jdb/:__span-36-20) [ 1549 0 R /XYZ 60.307257 364.513434 0 ] (jdb/:__span-36-21) [ 1549 0 R /XYZ 60.307257 351.113082 0 ] (jdb/:__span-36-22) [ 1549 0 R /XYZ 60.307257 337.712730 0 ] (jdb/:__span-36-23) [ 1549 0 R /XYZ 60.307257 324.312378 0 ] (jdb/:__span-36-24) [ 1549 0 R /XYZ 60.307257 310.912026 0 ] (jdb/:__span-36-25) [ 1549 0 R /XYZ 60.307257 297.511674 0 ] (jdb/:__span-36-26) [ 1549 0 R /XYZ 60.307257 284.111322 0 ] (jdb/:__span-36-27) [ 1549 0 R /XYZ 60.307257 270.710970 0 ] (jdb/:__span-36-28) [ 1549 0 R /XYZ 60.307257 257.310618 0 ] (jdb/:__span-36-29) [ 1549 0 R /XYZ 60.307257 243.910266 0 ] (jdb/:__span-36-3) [ 1549 0 R /XYZ 60.307257 592.319418 0 ] (jdb/:__span-36-30) [ 1549 0 R /XYZ 60.307257 230.509914 0 ] (jdb/:__span-36-31) [ 1549 0 R /XYZ 60.307257 217.109562 0 ] (jdb/:__span-36-32) [ 1549 0 R /XYZ 60.307257 203.709210 0 ] (jdb/:__span-36-33) [ 1549 0 R /XYZ 60.307257 190.308858 0 ] (jdb/:__span-36-34) [ 1549 0 R /XYZ 60.307257 176.908506 0 ] (jdb/:__span-36-35) [ 1549 0 R /XYZ 60.307257 163.508154 0 ] (jdb/:__span-36-36) [ 1549 0 R /XYZ 60.307257 150.107802 0 ] (jdb/:__span-36-37) [ 1549 0 R /XYZ 60.307257 136.707450 0 ] (jdb/:__span-36-38) [ 1549 0 R /XYZ 60.307257 123.307098 0 ] (jdb/:__span-36-39) [ 1549 0 R /XYZ 60.307257 109.906746 0 ] (jdb/:__span-36-4) [ 1549 0 R /XYZ 60.307257 578.919066 0 ] (jdb/:__span-36-40) [ 1549 0 R /XYZ 60.307257 96.506394 0 ] (jdb/:__span-36-41) [ 1551 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-36-42) [ 1551 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-36-43) [ 1551 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-36-44) [ 1551 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-36-45) [ 1551 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-36-46) [ 1551 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-36-47) [ 1551 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-36-48) [ 1551 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-36-49) [ 1551 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-36-5) [ 1549 0 R /XYZ 60.307257 565.518714 0 ] (jdb/:__span-36-50) [ 1551 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-36-51) [ 1551 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-36-52) [ 1551 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-36-53) [ 1551 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-36-54) [ 1551 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-36-55) [ 1551 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-36-56) [ 1551 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-36-57) [ 1551 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-36-58) [ 1551 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-36-59) [ 1551 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-36-6) [ 1549 0 R /XYZ 60.307257 552.118362 0 ] (jdb/:__span-36-60) [ 1551 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-36-61) [ 1551 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-36-62) [ 1551 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-36-63) [ 1551 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-36-64) [ 1551 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-36-65) [ 1551 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-36-66) [ 1551 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-36-67) [ 1551 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-36-68) [ 1551 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-36-69) [ 1551 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-36-7) [ 1549 0 R /XYZ 60.307257 538.718010 0 ] (jdb/:__span-36-70) [ 1551 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-36-71) [ 1551 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-36-72) [ 1551 0 R /XYZ 60.307257 355.612710 0 ] (jdb/:__span-36-73) [ 1551 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-36-74) [ 1551 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-36-75) [ 1551 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-36-76) [ 1551 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-36-77) [ 1551 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-36-78) [ 1551 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-36-79) [ 1551 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-36-8) [ 1549 0 R /XYZ 60.307257 525.317658 0 ] (jdb/:__span-36-80) [ 1551 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-36-81) [ 1551 0 R /XYZ 60.307257 235.009542 0 ] (jdb/:__span-36-82) [ 1551 0 R /XYZ 60.307257 221.609190 0 ] (jdb/:__span-36-83) [ 1551 0 R /XYZ 60.307257 208.208838 0 ] (jdb/:__span-36-84) [ 1551 0 R /XYZ 60.307257 194.808486 0 ] (jdb/:__span-36-85) [ 1551 0 R /XYZ 60.307257 181.408134 0 ] (jdb/:__span-36-86) [ 1551 0 R /XYZ 60.307257 168.007782 0 ] (jdb/:__span-36-87) [ 1551 0 R /XYZ 60.307257 154.607430 0 ] (jdb/:__span-36-88) [ 1551 0 R /XYZ 60.307257 141.207078 0 ] (jdb/:__span-36-89) [ 1551 0 R /XYZ 60.307257 127.806726 0 ] (jdb/:__span-36-9) [ 1549 0 R /XYZ 60.307257 511.917306 0 ] (jdb/:__span-37-1) [ 1553 0 R /XYZ 60.307257 658.532922 0 ] (jdb/:__span-37-10) [ 1553 0 R /XYZ 60.307257 537.929754 0 ] (jdb/:__span-37-11) [ 1553 0 R /XYZ 60.307257 524.529402 0 ] (jdb/:__span-37-12) [ 1553 0 R /XYZ 60.307257 511.129050 0 ] (jdb/:__span-37-13) [ 1553 0 R /XYZ 60.307257 497.728698 0 ] (jdb/:__span-37-14) [ 1553 0 R /XYZ 60.307257 484.328346 0 ] (jdb/:__span-37-15) [ 1553 0 R /XYZ 60.307257 470.927994 0 ] (jdb/:__span-37-16) [ 1553 0 R /XYZ 60.307257 457.527642 0 ] (jdb/:__span-37-17) [ 1553 0 R /XYZ 60.307257 444.127290 0 ] (jdb/:__span-37-18) [ 1553 0 R /XYZ 60.307257 430.726938 0 ] (jdb/:__span-37-19) [ 1553 0 R /XYZ 60.307257 417.326586 0 ] (jdb/:__span-37-2) [ 1553 0 R /XYZ 60.307257 645.132570 0 ] (jdb/:__span-37-20) [ 1553 0 R /XYZ 60.307257 403.926234 0 ] (jdb/:__span-37-21) [ 1553 0 R /XYZ 60.307257 390.525882 0 ] (jdb/:__span-37-22) [ 1553 0 R /XYZ 60.307257 377.125530 0 ] (jdb/:__span-37-23) [ 1553 0 R /XYZ 60.307257 363.725178 0 ] (jdb/:__span-37-24) [ 1553 0 R /XYZ 60.307257 350.324826 0 ] (jdb/:__span-37-25) [ 1553 0 R /XYZ 60.307257 336.924474 0 ] (jdb/:__span-37-26) [ 1553 0 R /XYZ 60.307257 323.524122 0 ] (jdb/:__span-37-27) [ 1553 0 R /XYZ 60.307257 310.123770 0 ] (jdb/:__span-37-28) [ 1553 0 R /XYZ 60.307257 296.723418 0 ] (jdb/:__span-37-29) [ 1553 0 R /XYZ 60.307257 283.323066 0 ] (jdb/:__span-37-3) [ 1553 0 R /XYZ 60.307257 631.732218 0 ] (jdb/:__span-37-30) [ 1553 0 R /XYZ 60.307257 269.922714 0 ] (jdb/:__span-37-31) [ 1553 0 R /XYZ 60.307257 256.522362 0 ] (jdb/:__span-37-32) [ 1553 0 R /XYZ 60.307257 243.122010 0 ] (jdb/:__span-37-33) [ 1553 0 R /XYZ 60.307257 229.721658 0 ] (jdb/:__span-37-34) [ 1553 0 R /XYZ 60.307257 216.321306 0 ] (jdb/:__span-37-35) [ 1553 0 R /XYZ 60.307257 202.920954 0 ] (jdb/:__span-37-36) [ 1553 0 R /XYZ 60.307257 189.520602 0 ] (jdb/:__span-37-37) [ 1553 0 R /XYZ 60.307257 176.120250 0 ] (jdb/:__span-37-38) [ 1553 0 R /XYZ 60.307257 162.719898 0 ] (jdb/:__span-37-39) [ 1553 0 R /XYZ 60.307257 149.319546 0 ] (jdb/:__span-37-4) [ 1553 0 R /XYZ 60.307257 618.331866 0 ] (jdb/:__span-37-40) [ 1553 0 R /XYZ 60.307257 135.919194 0 ] (jdb/:__span-37-41) [ 1553 0 R /XYZ 60.307257 122.518842 0 ] (jdb/:__span-37-42) [ 1553 0 R /XYZ 60.307257 109.118490 0 ] (jdb/:__span-37-43) [ 1553 0 R /XYZ 60.307257 95.718138 0 ] (jdb/:__span-37-44) [ 1555 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-37-45) [ 1555 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-37-46) [ 1555 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-37-47) [ 1555 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-37-48) [ 1555 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-37-49) [ 1555 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-37-5) [ 1553 0 R /XYZ 60.307257 604.931514 0 ] (jdb/:__span-37-50) [ 1555 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-37-51) [ 1555 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-37-52) [ 1555 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-37-53) [ 1555 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-37-54) [ 1555 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-37-55) [ 1555 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-37-56) [ 1555 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-37-57) [ 1555 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-37-58) [ 1555 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-37-59) [ 1555 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-37-6) [ 1553 0 R /XYZ 60.307257 591.531162 0 ] (jdb/:__span-37-60) [ 1555 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-37-61) [ 1555 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-37-62) [ 1555 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-37-63) [ 1555 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-37-64) [ 1555 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-37-65) [ 1555 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-37-66) [ 1555 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-37-67) [ 1555 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-37-68) [ 1555 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-37-69) [ 1555 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-37-7) [ 1553 0 R /XYZ 60.307257 578.130810 0 ] (jdb/:__span-37-70) [ 1555 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-37-71) [ 1555 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-37-72) [ 1555 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-37-73) [ 1555 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-37-74) [ 1555 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-37-75) [ 1555 0 R /XYZ 60.307257 355.612710 0 ] (jdb/:__span-37-76) [ 1555 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-37-77) [ 1555 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-37-78) [ 1555 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-37-79) [ 1555 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-37-8) [ 1553 0 R /XYZ 60.307257 564.730458 0 ] (jdb/:__span-37-80) [ 1555 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-37-81) [ 1555 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-37-9) [ 1553 0 R /XYZ 60.307257 551.330106 0 ] (jdb/:__span-38-1) [ 1557 0 R /XYZ 60.307257 174.624222 0 ] (jdb/:__span-38-10) [ 1559 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-38-11) [ 1559 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-38-12) [ 1559 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-38-13) [ 1559 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-38-14) [ 1559 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-38-15) [ 1559 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-38-16) [ 1559 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-38-17) [ 1559 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-38-18) [ 1559 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-38-19) [ 1559 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-38-2) [ 1557 0 R /XYZ 60.307257 161.223870 0 ] (jdb/:__span-38-20) [ 1559 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-38-21) [ 1559 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-38-22) [ 1559 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-38-23) [ 1559 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-38-24) [ 1559 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-38-25) [ 1559 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-38-26) [ 1559 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-38-27) [ 1559 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-38-28) [ 1559 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-38-29) [ 1559 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-38-3) [ 1557 0 R /XYZ 60.307257 147.823518 0 ] (jdb/:__span-38-30) [ 1559 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-38-31) [ 1559 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-38-32) [ 1559 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-38-33) [ 1559 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-38-34) [ 1559 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-38-35) [ 1559 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-38-36) [ 1559 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-38-37) [ 1559 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-38-38) [ 1559 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-38-4) [ 1557 0 R /XYZ 60.307257 134.423166 0 ] (jdb/:__span-38-5) [ 1557 0 R /XYZ 60.307257 121.022814 0 ] (jdb/:__span-38-6) [ 1557 0 R /XYZ 60.307257 94.222110 0 ] (jdb/:__span-38-7) [ 1559 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-38-8) [ 1559 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-38-9) [ 1559 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-4-1) [ 1129 0 R /XYZ 60.307257 763.633722 0 ] (jdb/:__span-4-10) [ 1129 0 R /XYZ 60.307257 643.030554 0 ] (jdb/:__span-4-11) [ 1129 0 R /XYZ 60.307257 629.630202 0 ] (jdb/:__span-4-12) [ 1129 0 R /XYZ 60.307257 602.829498 0 ] (jdb/:__span-4-13) [ 1129 0 R /XYZ 60.307257 589.429146 0 ] (jdb/:__span-4-14) [ 1129 0 R /XYZ 60.307257 576.028794 0 ] (jdb/:__span-4-15) [ 1129 0 R /XYZ 60.307257 562.628442 0 ] (jdb/:__span-4-16) [ 1129 0 R /XYZ 60.307257 549.228090 0 ] (jdb/:__span-4-17) [ 1129 0 R /XYZ 60.307257 535.827738 0 ] (jdb/:__span-4-18) [ 1129 0 R /XYZ 60.307257 522.427386 0 ] (jdb/:__span-4-19) [ 1129 0 R /XYZ 60.307257 509.027034 0 ] (jdb/:__span-4-2) [ 1129 0 R /XYZ 60.307257 750.233370 0 ] (jdb/:__span-4-20) [ 1129 0 R /XYZ 60.307257 495.626682 0 ] (jdb/:__span-4-21) [ 1129 0 R /XYZ 60.307257 482.226330 0 ] (jdb/:__span-4-22) [ 1129 0 R /XYZ 60.307257 468.825978 0 ] (jdb/:__span-4-23) [ 1129 0 R /XYZ 60.307257 455.425626 0 ] (jdb/:__span-4-3) [ 1129 0 R /XYZ 60.307257 736.833018 0 ] (jdb/:__span-4-4) [ 1129 0 R /XYZ 60.307257 723.432666 0 ] (jdb/:__span-4-5) [ 1129 0 R /XYZ 60.307257 710.032314 0 ] (jdb/:__span-4-6) [ 1129 0 R /XYZ 60.307257 696.631962 0 ] (jdb/:__span-4-7) [ 1129 0 R /XYZ 60.307257 683.231610 0 ] (jdb/:__span-4-8) [ 1129 0 R /XYZ 60.307257 669.831258 0 ] (jdb/:__span-4-9) [ 1129 0 R /XYZ 60.307257 656.430906 0 ] (jdb/:__span-5-1) [ 1181 0 R /XYZ 60.307257 763.633722 0 ] (jdb/:__span-5-10) [ 1181 0 R /XYZ 60.307257 643.030554 0 ] (jdb/:__span-5-11) [ 1181 0 R /XYZ 60.307257 629.630202 0 ] (jdb/:__span-5-12) [ 1181 0 R /XYZ 60.307257 616.229850 0 ] (jdb/:__span-5-13) [ 1181 0 R /XYZ 60.307257 602.829498 0 ] (jdb/:__span-5-14) [ 1181 0 R /XYZ 60.307257 589.429146 0 ] (jdb/:__span-5-15) [ 1181 0 R /XYZ 60.307257 576.028794 0 ] (jdb/:__span-5-16) [ 1181 0 R /XYZ 60.307257 562.628442 0 ] (jdb/:__span-5-17) [ 1181 0 R /XYZ 60.307257 535.827738 0 ] (jdb/:__span-5-18) [ 1181 0 R /XYZ 60.307257 522.427386 0 ] (jdb/:__span-5-19) [ 1181 0 R /XYZ 60.307257 509.027034 0 ] (jdb/:__span-5-2) [ 1181 0 R /XYZ 60.307257 750.233370 0 ] (jdb/:__span-5-20) [ 1181 0 R /XYZ 60.307257 495.626682 0 ] (jdb/:__span-5-21) [ 1181 0 R /XYZ 60.307257 482.226330 0 ] (jdb/:__span-5-22) [ 1181 0 R /XYZ 60.307257 468.825978 0 ] (jdb/:__span-5-23) [ 1181 0 R /XYZ 60.307257 455.425626 0 ] (jdb/:__span-5-24) [ 1181 0 R /XYZ 60.307257 442.025274 0 ] (jdb/:__span-5-25) [ 1181 0 R /XYZ 60.307257 428.624922 0 ] (jdb/:__span-5-26) [ 1181 0 R /XYZ 60.307257 415.224570 0 ] (jdb/:__span-5-27) [ 1181 0 R /XYZ 60.307257 401.824218 0 ] (jdb/:__span-5-28) [ 1181 0 R /XYZ 60.307257 388.423866 0 ] (jdb/:__span-5-29) [ 1181 0 R /XYZ 60.307257 375.023514 0 ] (jdb/:__span-5-3) [ 1181 0 R /XYZ 60.307257 736.833018 0 ] (jdb/:__span-5-30) [ 1181 0 R /XYZ 60.307257 361.623162 0 ] (jdb/:__span-5-31) [ 1181 0 R /XYZ 60.307257 348.222810 0 ] (jdb/:__span-5-32) [ 1181 0 R /XYZ 60.307257 334.822458 0 ] (jdb/:__span-5-33) [ 1181 0 R /XYZ 60.307257 321.422106 0 ] (jdb/:__span-5-34) [ 1181 0 R /XYZ 60.307257 308.021754 0 ] (jdb/:__span-5-35) [ 1181 0 R /XYZ 60.307257 294.621402 0 ] (jdb/:__span-5-36) [ 1181 0 R /XYZ 60.307257 281.221050 0 ] (jdb/:__span-5-37) [ 1181 0 R /XYZ 60.307257 267.820698 0 ] (jdb/:__span-5-38) [ 1181 0 R /XYZ 60.307257 254.420346 0 ] (jdb/:__span-5-39) [ 1181 0 R /XYZ 60.307257 241.019994 0 ] (jdb/:__span-5-4) [ 1181 0 R /XYZ 60.307257 723.432666 0 ] (jdb/:__span-5-40) [ 1181 0 R /XYZ 60.307257 227.619642 0 ] (jdb/:__span-5-41) [ 1181 0 R /XYZ 60.307257 214.219290 0 ] (jdb/:__span-5-42) [ 1181 0 R /XYZ 60.307257 200.818938 0 ] (jdb/:__span-5-43) [ 1181 0 R /XYZ 60.307257 187.418586 0 ] (jdb/:__span-5-44) [ 1181 0 R /XYZ 60.307257 174.018234 0 ] (jdb/:__span-5-45) [ 1181 0 R /XYZ 60.307257 160.617882 0 ] (jdb/:__span-5-46) [ 1181 0 R /XYZ 60.307257 147.217530 0 ] (jdb/:__span-5-47) [ 1181 0 R /XYZ 60.307257 133.817178 0 ] (jdb/:__span-5-48) [ 1181 0 R /XYZ 60.307257 120.416826 0 ] (jdb/:__span-5-49) [ 1181 0 R /XYZ 60.307257 107.016474 0 ] (jdb/:__span-5-5) [ 1181 0 R /XYZ 60.307257 710.032314 0 ] (jdb/:__span-5-50) [ 1183 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-5-51) [ 1183 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-5-52) [ 1183 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-5-53) [ 1183 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-5-54) [ 1183 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-5-55) [ 1183 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-5-56) [ 1183 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-5-57) [ 1183 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-5-58) [ 1183 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-5-6) [ 1181 0 R /XYZ 60.307257 696.631962 0 ] (jdb/:__span-5-7) [ 1181 0 R /XYZ 60.307257 683.231610 0 ] (jdb/:__span-5-8) [ 1181 0 R /XYZ 60.307257 669.831258 0 ] (jdb/:__span-5-9) [ 1181 0 R /XYZ 60.307257 656.430906 0 ] (jdb/:__span-6-1) [ 1183 0 R /XYZ 60.307257 466.465902 0 ] (jdb/:__span-6-10) [ 1183 0 R /XYZ 60.307257 345.862734 0 ] (jdb/:__span-6-11) [ 1183 0 R /XYZ 60.307257 332.462382 0 ] (jdb/:__span-6-12) [ 1183 0 R /XYZ 60.307257 319.062030 0 ] (jdb/:__span-6-13) [ 1183 0 R /XYZ 60.307257 305.661678 0 ] (jdb/:__span-6-14) [ 1183 0 R /XYZ 60.307257 292.261326 0 ] (jdb/:__span-6-15) [ 1183 0 R /XYZ 60.307257 278.860974 0 ] (jdb/:__span-6-16) [ 1183 0 R /XYZ 60.307257 265.460622 0 ] (jdb/:__span-6-17) [ 1183 0 R /XYZ 60.307257 252.060270 0 ] (jdb/:__span-6-18) [ 1183 0 R /XYZ 60.307257 238.659918 0 ] (jdb/:__span-6-19) [ 1183 0 R /XYZ 60.307257 225.259566 0 ] (jdb/:__span-6-2) [ 1183 0 R /XYZ 60.307257 453.065550 0 ] (jdb/:__span-6-20) [ 1183 0 R /XYZ 60.307257 211.859214 0 ] (jdb/:__span-6-21) [ 1183 0 R /XYZ 60.307257 198.458862 0 ] (jdb/:__span-6-22) [ 1183 0 R /XYZ 60.307257 185.058510 0 ] (jdb/:__span-6-23) [ 1183 0 R /XYZ 60.307257 171.658158 0 ] (jdb/:__span-6-24) [ 1183 0 R /XYZ 60.307257 144.857454 0 ] (jdb/:__span-6-25) [ 1183 0 R /XYZ 60.307257 131.457102 0 ] (jdb/:__span-6-26) [ 1183 0 R /XYZ 60.307257 118.056750 0 ] (jdb/:__span-6-27) [ 1183 0 R /XYZ 60.307257 104.656398 0 ] (jdb/:__span-6-28) [ 1183 0 R /XYZ 60.307257 91.256046 0 ] (jdb/:__span-6-29) [ 1185 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-6-3) [ 1183 0 R /XYZ 60.307257 439.665198 0 ] (jdb/:__span-6-30) [ 1185 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-6-31) [ 1185 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-6-32) [ 1185 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-6-33) [ 1185 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-6-34) [ 1185 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-6-35) [ 1185 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-6-36) [ 1185 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-6-37) [ 1185 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-6-4) [ 1183 0 R /XYZ 60.307257 426.264846 0 ] (jdb/:__span-6-5) [ 1183 0 R /XYZ 60.307257 412.864494 0 ] (jdb/:__span-6-6) [ 1183 0 R /XYZ 60.307257 399.464142 0 ] (jdb/:__span-6-7) [ 1183 0 R /XYZ 60.307257 386.063790 0 ] (jdb/:__span-6-8) [ 1183 0 R /XYZ 60.307257 372.663438 0 ] (jdb/:__span-6-9) [ 1183 0 R /XYZ 60.307257 359.263086 0 ] (jdb/:__span-7-1) [ 1207 0 R /XYZ 60.307257 374.523743 0 ] (jdb/:__span-7-10) [ 1207 0 R /XYZ 60.307257 240.520223 0 ] (jdb/:__span-7-11) [ 1207 0 R /XYZ 60.307257 227.119871 0 ] (jdb/:__span-7-12) [ 1207 0 R /XYZ 60.307257 213.719519 0 ] (jdb/:__span-7-13) [ 1207 0 R /XYZ 60.307257 200.319167 0 ] (jdb/:__span-7-14) [ 1207 0 R /XYZ 60.307257 186.918815 0 ] (jdb/:__span-7-15) [ 1207 0 R /XYZ 60.307257 173.518463 0 ] (jdb/:__span-7-16) [ 1207 0 R /XYZ 60.307257 160.118111 0 ] (jdb/:__span-7-17) [ 1207 0 R /XYZ 60.307257 146.717759 0 ] (jdb/:__span-7-18) [ 1207 0 R /XYZ 60.307257 119.917055 0 ] (jdb/:__span-7-19) [ 1207 0 R /XYZ 60.307257 106.516703 0 ] (jdb/:__span-7-2) [ 1207 0 R /XYZ 60.307257 361.123391 0 ] (jdb/:__span-7-20) [ 1207 0 R /XYZ 60.307257 93.116351 0 ] (jdb/:__span-7-21) [ 1214 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-7-22) [ 1214 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-7-23) [ 1214 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-7-24) [ 1214 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-7-25) [ 1214 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-7-26) [ 1214 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-7-27) [ 1214 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-7-28) [ 1214 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-7-29) [ 1214 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-7-3) [ 1207 0 R /XYZ 60.307257 347.723039 0 ] (jdb/:__span-7-30) [ 1214 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-7-31) [ 1214 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-7-32) [ 1214 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-7-33) [ 1214 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-7-34) [ 1214 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-7-35) [ 1214 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-7-36) [ 1214 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-7-37) [ 1214 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-7-38) [ 1214 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-7-39) [ 1214 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-7-4) [ 1207 0 R /XYZ 60.307257 334.322687 0 ] (jdb/:__span-7-40) [ 1214 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-7-41) [ 1214 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-7-42) [ 1214 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-7-43) [ 1214 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-7-44) [ 1214 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-7-45) [ 1214 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-7-46) [ 1214 0 R /XYZ 60.307257 355.612710 0 ] (jdb/:__span-7-47) [ 1214 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-7-48) [ 1214 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-7-49) [ 1214 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-7-5) [ 1207 0 R /XYZ 60.307257 320.922335 0 ] (jdb/:__span-7-50) [ 1214 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-7-51) [ 1214 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-7-52) [ 1214 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-7-53) [ 1214 0 R /XYZ 60.307257 235.009542 0 ] (jdb/:__span-7-54) [ 1214 0 R /XYZ 60.307257 221.609190 0 ] (jdb/:__span-7-55) [ 1214 0 R /XYZ 60.307257 208.208838 0 ] (jdb/:__span-7-6) [ 1207 0 R /XYZ 60.307257 307.521983 0 ] (jdb/:__span-7-7) [ 1207 0 R /XYZ 60.307257 280.721279 0 ] (jdb/:__span-7-8) [ 1207 0 R /XYZ 60.307257 267.320927 0 ] (jdb/:__span-7-9) [ 1207 0 R /XYZ 60.307257 253.920575 0 ] (jdb/:__span-8-1) [ 1240 0 R /XYZ 60.307257 178.281829 0 ] (jdb/:__span-8-10) [ 1245 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-8-11) [ 1245 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-8-12) [ 1245 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-8-13) [ 1245 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-8-14) [ 1245 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-8-15) [ 1245 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-8-16) [ 1245 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-8-17) [ 1245 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-8-18) [ 1245 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-8-19) [ 1245 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-8-2) [ 1240 0 R /XYZ 60.307257 164.881477 0 ] (jdb/:__span-8-20) [ 1245 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-8-21) [ 1245 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-8-22) [ 1245 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-8-23) [ 1245 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-8-24) [ 1245 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-8-25) [ 1245 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-8-26) [ 1245 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-8-27) [ 1245 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-8-28) [ 1245 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-8-29) [ 1245 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-8-3) [ 1240 0 R /XYZ 60.307257 151.481125 0 ] (jdb/:__span-8-4) [ 1240 0 R /XYZ 60.307257 138.080773 0 ] (jdb/:__span-8-5) [ 1240 0 R /XYZ 60.307257 124.680421 0 ] (jdb/:__span-8-6) [ 1240 0 R /XYZ 60.307257 111.280069 0 ] (jdb/:__span-8-7) [ 1240 0 R /XYZ 60.307257 97.879717 0 ] (jdb/:__span-8-8) [ 1240 0 R /XYZ 60.307257 84.479365 0 ] (jdb/:__span-8-9) [ 1245 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-9-1) [ 1252 0 R /XYZ 60.307257 763.633722 0 ] (jdb/:__span-9-10) [ 1252 0 R /XYZ 60.307257 643.030554 0 ] (jdb/:__span-9-11) [ 1252 0 R /XYZ 60.307257 629.630202 0 ] (jdb/:__span-9-12) [ 1252 0 R /XYZ 60.307257 616.229850 0 ] (jdb/:__span-9-13) [ 1252 0 R /XYZ 60.307257 602.829498 0 ] (jdb/:__span-9-14) [ 1252 0 R /XYZ 60.307257 589.429146 0 ] (jdb/:__span-9-15) [ 1252 0 R /XYZ 60.307257 576.028794 0 ] (jdb/:__span-9-16) [ 1252 0 R /XYZ 60.307257 562.628442 0 ] (jdb/:__span-9-17) [ 1252 0 R /XYZ 60.307257 549.228090 0 ] (jdb/:__span-9-18) [ 1252 0 R /XYZ 60.307257 535.827738 0 ] (jdb/:__span-9-19) [ 1252 0 R /XYZ 60.307257 522.427386 0 ] (jdb/:__span-9-2) [ 1252 0 R /XYZ 60.307257 750.233370 0 ] (jdb/:__span-9-20) [ 1252 0 R /XYZ 60.307257 509.027034 0 ] (jdb/:__span-9-21) [ 1252 0 R /XYZ 60.307257 495.626682 0 ] (jdb/:__span-9-22) [ 1252 0 R /XYZ 60.307257 482.226330 0 ] (jdb/:__span-9-23) [ 1252 0 R /XYZ 60.307257 468.825978 0 ] (jdb/:__span-9-24) [ 1252 0 R /XYZ 60.307257 455.425626 0 ] (jdb/:__span-9-25) [ 1252 0 R /XYZ 60.307257 442.025274 0 ] (jdb/:__span-9-26) [ 1252 0 R /XYZ 60.307257 428.624922 0 ] (jdb/:__span-9-27) [ 1252 0 R /XYZ 60.307257 415.224570 0 ] (jdb/:__span-9-28) [ 1252 0 R /XYZ 60.307257 401.824218 0 ] (jdb/:__span-9-29) [ 1252 0 R /XYZ 60.307257 388.423866 0 ] (jdb/:__span-9-3) [ 1252 0 R /XYZ 60.307257 736.833018 0 ] (jdb/:__span-9-30) [ 1252 0 R /XYZ 60.307257 375.023514 0 ] (jdb/:__span-9-31) [ 1252 0 R /XYZ 60.307257 361.623162 0 ] (jdb/:__span-9-32) [ 1252 0 R /XYZ 60.307257 348.222810 0 ] (jdb/:__span-9-33) [ 1252 0 R /XYZ 60.307257 334.822458 0 ] (jdb/:__span-9-34) [ 1252 0 R /XYZ 60.307257 321.422106 0 ] (jdb/:__span-9-35) [ 1252 0 R /XYZ 60.307257 308.021754 0 ] (jdb/:__span-9-36) [ 1252 0 R /XYZ 60.307257 294.621402 0 ] (jdb/:__span-9-37) [ 1252 0 R /XYZ 60.307257 281.221050 0 ] (jdb/:__span-9-38) [ 1252 0 R /XYZ 60.307257 267.820698 0 ] (jdb/:__span-9-39) [ 1252 0 R /XYZ 60.307257 254.420346 0 ] (jdb/:__span-9-4) [ 1252 0 R /XYZ 60.307257 723.432666 0 ] (jdb/:__span-9-40) [ 1252 0 R /XYZ 60.307257 241.019994 0 ] (jdb/:__span-9-41) [ 1252 0 R /XYZ 60.307257 227.619642 0 ] (jdb/:__span-9-42) [ 1252 0 R /XYZ 60.307257 214.219290 0 ] (jdb/:__span-9-43) [ 1252 0 R /XYZ 60.307257 200.818938 0 ] (jdb/:__span-9-5) [ 1252 0 R /XYZ 60.307257 710.032314 0 ] (jdb/:__span-9-6) [ 1252 0 R /XYZ 60.307257 696.631962 0 ] (jdb/:__span-9-7) [ 1252 0 R /XYZ 60.307257 683.231610 0 ] (jdb/:__span-9-8) [ 1252 0 R /XYZ 60.307257 669.831258 0 ] (jdb/:__span-9-9) [ 1252 0 R /XYZ 60.307257 656.430906 0 ] (jdb/:grand-prix-de-monaco) [ 1632 0 R /XYZ 39.386457 164.992922 0 ] (jdb/:jeudi-1-juin-2023) [ 1636 0 R /XYZ 39.386457 270.835122 0 ] (jdb/:jeudi-11-mai-2023) [ 1544 0 R /XYZ 39.386457 562.440762 0 ] (jdb/:jeudi-18-mai-2023) [ 1583 0 R /XYZ 39.386457 459.588513 0 ] (jdb/:jeudi-25-mai-2023) [ 1624 0 R /XYZ 39.386457 446.337222 0 ] (jdb/:jeudi-27-avril-2023) [ 1430 0 R /XYZ 39.386457 584.282022 0 ] (jdb/:jeudi-30-mars-2023) [ 1074 0 R /XYZ 39.386457 263.492343 0 ] (jdb/:jeudi-6-avril) [ 1281 0 R /XYZ 39.386457 238.444086 0 ] (jdb/:journal-de-bord) [ 1071 0 R /XYZ 39.386457 757.223622 0 ] (jdb/:lundi-1-mai-2023) [ 1444 0 R /XYZ 39.386457 501.702822 0 ] (jdb/:lundi-15-mai-2023) [ 1566 0 R /XYZ 39.386457 584.282022 0 ] (jdb/:lundi-22-mai-2023) [ 1590 0 R /XYZ 39.386457 649.970022 0 ] (jdb/:lundi-24-avril-2023) [ 1404 0 R /XYZ 39.386457 266.404302 0 ] (jdb/:lundi-29-mai-2023) [ 1636 0 R /XYZ 39.386457 771.023622 0 ] (jdb/:lundi-3-avril) [ 1161 0 R /XYZ 39.386457 717.534822 0 ] (jdb/:lundi-5-juin-2023) [ 1680 0 R /XYZ 39.386457 229.986499 0 ] (jdb/:lundi-8-mai-2023) [ 1473 0 R /XYZ 39.386457 314.866514 0 ] (jdb/:mardi-16-mai-2023) [ 1566 0 R /XYZ 39.386457 273.038922 0 ] (jdb/:mardi-2-mai-2023) [ 1450 0 R /XYZ 39.386457 595.251918 0 ] (jdb/:mardi-23-mai-2023) [ 1617 0 R /XYZ 39.386457 234.994819 0 ] (jdb/:mardi-25-avril-2023) [ 1423 0 R /XYZ 39.386457 693.136422 0 ] (jdb/:mardi-30-mai-2023) [ 1636 0 R /XYZ 39.386457 547.990122 0 ] (jdb/:mardi-4-avril) [ 1227 0 R /XYZ 39.386457 305.202822 0 ] (jdb/:mardi-9-mai-2023) [ 1509 0 R /XYZ 39.386457 146.799010 0 ] (jdb/:mercredi-10-mai-2023) [ 1530 0 R /XYZ 39.386457 659.354022 0 ] (jdb/:mercredi-17-mai-2023) [ 1575 0 R /XYZ 39.386457 771.023622 0 ] (jdb/:mercredi-24-mai-2023) [ 1622 0 R /XYZ 39.386457 629.325222 0 ] (jdb/:mercredi-29-mars-2023) [ 1071 0 R /XYZ 39.386457 707.865222 0 ] (jdb/:mercredi-31-mai-2023) [ 1636 0 R /XYZ 39.386457 339.971022 0 ] (jdb/:mercredi-5-avril) [ 1254 0 R /XYZ 39.386457 293.199726 0 ] (jdb/:recrutement-payerne-mai-2023) [ 1470 0 R /XYZ 39.386457 526.101222 0 ] (jdb/:vacances) [ 1349 0 R /XYZ 39.386457 355.144422 0 ] (jdb/:vendredi-12-mai-2023) [ 1557 0 R /XYZ 39.386457 623.694822 0 ] (jdb/:vendredi-2-juin-2023) [ 1662 0 R /XYZ 39.386457 608.680422 0 ] (jdb/:vendredi-26-mai-2023) [ 1632 0 R /XYZ 39.386457 249.143222 0 ] (jdb/:vendredi-28-avril-2023) [ 1442 0 R /XYZ 39.386457 717.534822 0 ] (jdb/:vendredi-31032023) [ 1086 0 R /XYZ 39.386457 347.805222 0 ] (jdb/:vendredi-5-mai-2023) [ 1470 0 R /XYZ 39.386457 426.936522 0 ] (jdb/:vendredi-6-avril-2023) [ 1324 0 R /XYZ 39.386457 565.514022 0 ] ] +/Names [ (.:) [ 510 0 R /XYZ 39.386457 771.023622 0 ] (.:__span-0-1) [ 657 0 R /XYZ 60.307257 407.980122 0 ] (.:__span-0-2) [ 657 0 R /XYZ 60.307257 381.179418 0 ] (.:__span-1-1) [ 661 0 R /XYZ 60.307257 202.470522 0 ] (.:__span-1-10) [ 663 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-1-11) [ 663 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-1-12) [ 663 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-1-13) [ 663 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-1-2) [ 661 0 R /XYZ 60.307257 189.070170 0 ] (.:__span-1-3) [ 661 0 R /XYZ 60.307257 175.669818 0 ] (.:__span-1-4) [ 661 0 R /XYZ 60.307257 162.269466 0 ] (.:__span-1-5) [ 661 0 R /XYZ 60.307257 148.869114 0 ] (.:__span-1-6) [ 661 0 R /XYZ 60.307257 135.468762 0 ] (.:__span-1-7) [ 661 0 R /XYZ 60.307257 122.068410 0 ] (.:__span-1-8) [ 661 0 R /XYZ 60.307257 108.668058 0 ] (.:__span-1-9) [ 661 0 R /XYZ 60.307257 95.267706 0 ] (.:__span-10-1) [ 941 0 R /XYZ 60.307257 140.764186 0 ] (.:__span-10-10) [ 946 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-10-11) [ 946 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-10-12) [ 946 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-10-13) [ 946 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-10-14) [ 946 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-10-15) [ 946 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-10-16) [ 946 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-10-17) [ 946 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-10-18) [ 946 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-10-19) [ 946 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-10-2) [ 941 0 R /XYZ 60.307257 113.963482 0 ] (.:__span-10-20) [ 946 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-10-21) [ 946 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-10-22) [ 946 0 R /XYZ 60.307257 529.817286 0 ] (.:__span-10-23) [ 946 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-10-24) [ 946 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-10-25) [ 946 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-10-26) [ 946 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-10-27) [ 946 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-10-28) [ 946 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-10-29) [ 946 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-10-3) [ 941 0 R /XYZ 60.307257 100.563130 0 ] (.:__span-10-4) [ 941 0 R /XYZ 60.307257 87.162778 0 ] (.:__span-10-5) [ 946 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-10-6) [ 946 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-10-7) [ 946 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-10-8) [ 946 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-10-9) [ 946 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-11-1) [ 957 0 R /XYZ 60.307257 186.718980 0 ] (.:__span-11-10) [ 961 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-11-11) [ 961 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-11-12) [ 961 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-11-13) [ 961 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-11-14) [ 961 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-11-15) [ 961 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-11-16) [ 961 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-11-2) [ 957 0 R /XYZ 60.307257 159.918276 0 ] (.:__span-11-3) [ 957 0 R /XYZ 60.307257 133.117572 0 ] (.:__span-11-4) [ 957 0 R /XYZ 60.307257 119.717220 0 ] (.:__span-11-5) [ 957 0 R /XYZ 60.307257 106.316868 0 ] (.:__span-11-6) [ 961 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-11-7) [ 961 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-11-8) [ 961 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-11-9) [ 961 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-12-1) [ 963 0 R /XYZ 60.307257 186.377322 0 ] (.:__span-12-10) [ 965 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-12-11) [ 965 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-12-12) [ 965 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-12-13) [ 965 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-12-14) [ 965 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-12-15) [ 965 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-12-16) [ 965 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-12-17) [ 965 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-12-18) [ 965 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-12-19) [ 965 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-12-2) [ 963 0 R /XYZ 60.307257 172.976970 0 ] (.:__span-12-20) [ 965 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-12-21) [ 965 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-12-22) [ 965 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-12-23) [ 965 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-12-24) [ 965 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-12-25) [ 965 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-12-26) [ 965 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-12-27) [ 965 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-12-28) [ 965 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-12-29) [ 965 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-12-3) [ 963 0 R /XYZ 60.307257 159.576618 0 ] (.:__span-12-30) [ 965 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-12-31) [ 965 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-12-32) [ 965 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-12-33) [ 965 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-12-34) [ 965 0 R /XYZ 60.307257 382.413414 0 ] (.:__span-12-35) [ 965 0 R /XYZ 60.307257 369.013062 0 ] (.:__span-12-36) [ 965 0 R /XYZ 60.307257 355.612710 0 ] (.:__span-12-4) [ 963 0 R /XYZ 60.307257 146.176266 0 ] (.:__span-12-5) [ 963 0 R /XYZ 60.307257 132.775914 0 ] (.:__span-12-6) [ 963 0 R /XYZ 60.307257 119.375562 0 ] (.:__span-12-7) [ 963 0 R /XYZ 60.307257 105.975210 0 ] (.:__span-12-8) [ 963 0 R /XYZ 60.307257 92.574858 0 ] (.:__span-12-9) [ 965 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-2-1) [ 663 0 R /XYZ 60.307257 422.999214 0 ] (.:__span-2-10) [ 663 0 R /XYZ 60.307257 302.396046 0 ] (.:__span-2-11) [ 663 0 R /XYZ 60.307257 275.595342 0 ] (.:__span-2-12) [ 663 0 R /XYZ 60.307257 262.194990 0 ] (.:__span-2-13) [ 663 0 R /XYZ 60.307257 248.794638 0 ] (.:__span-2-14) [ 663 0 R /XYZ 60.307257 235.394286 0 ] (.:__span-2-15) [ 663 0 R /XYZ 60.307257 221.993934 0 ] (.:__span-2-16) [ 663 0 R /XYZ 60.307257 208.593582 0 ] (.:__span-2-17) [ 663 0 R /XYZ 60.307257 195.193230 0 ] (.:__span-2-18) [ 663 0 R /XYZ 60.307257 181.792878 0 ] (.:__span-2-19) [ 663 0 R /XYZ 60.307257 168.392526 0 ] (.:__span-2-2) [ 663 0 R /XYZ 60.307257 409.598862 0 ] (.:__span-2-20) [ 663 0 R /XYZ 60.307257 154.992174 0 ] (.:__span-2-21) [ 663 0 R /XYZ 60.307257 141.591822 0 ] (.:__span-2-22) [ 663 0 R /XYZ 60.307257 128.191470 0 ] (.:__span-2-23) [ 663 0 R /XYZ 60.307257 114.791118 0 ] (.:__span-2-24) [ 663 0 R /XYZ 60.307257 101.390766 0 ] (.:__span-2-25) [ 663 0 R /XYZ 60.307257 87.990414 0 ] (.:__span-2-26) [ 665 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-2-27) [ 665 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-2-28) [ 665 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-2-3) [ 663 0 R /XYZ 60.307257 396.198510 0 ] (.:__span-2-4) [ 663 0 R /XYZ 60.307257 382.798158 0 ] (.:__span-2-5) [ 663 0 R /XYZ 60.307257 369.397806 0 ] (.:__span-2-6) [ 663 0 R /XYZ 60.307257 355.997454 0 ] (.:__span-2-7) [ 663 0 R /XYZ 60.307257 342.597102 0 ] (.:__span-2-8) [ 663 0 R /XYZ 60.307257 329.196750 0 ] (.:__span-2-9) [ 663 0 R /XYZ 60.307257 315.796398 0 ] (.:__span-3-1) [ 665 0 R /XYZ 60.307257 678.506766 0 ] (.:__span-3-10) [ 665 0 R /XYZ 60.307257 557.903598 0 ] (.:__span-3-11) [ 665 0 R /XYZ 60.307257 544.503246 0 ] (.:__span-3-12) [ 665 0 R /XYZ 60.307257 531.102894 0 ] (.:__span-3-2) [ 665 0 R /XYZ 60.307257 665.106414 0 ] (.:__span-3-3) [ 665 0 R /XYZ 60.307257 651.706062 0 ] (.:__span-3-4) [ 665 0 R /XYZ 60.307257 638.305710 0 ] (.:__span-3-5) [ 665 0 R /XYZ 60.307257 624.905358 0 ] (.:__span-3-6) [ 665 0 R /XYZ 60.307257 611.505006 0 ] (.:__span-3-7) [ 665 0 R /XYZ 60.307257 598.104654 0 ] (.:__span-3-8) [ 665 0 R /XYZ 60.307257 584.704302 0 ] (.:__span-3-9) [ 665 0 R /XYZ 60.307257 571.303950 0 ] (.:__span-4-1) [ 665 0 R /XYZ 60.307257 491.661942 0 ] (.:__span-4-10) [ 665 0 R /XYZ 60.307257 371.058774 0 ] (.:__span-4-11) [ 665 0 R /XYZ 60.307257 344.258070 0 ] (.:__span-4-12) [ 665 0 R /XYZ 60.307257 330.857718 0 ] (.:__span-4-13) [ 665 0 R /XYZ 60.307257 317.457366 0 ] (.:__span-4-14) [ 665 0 R /XYZ 60.307257 304.057014 0 ] (.:__span-4-15) [ 665 0 R /XYZ 60.307257 290.656662 0 ] (.:__span-4-16) [ 665 0 R /XYZ 60.307257 277.256310 0 ] (.:__span-4-17) [ 665 0 R /XYZ 60.307257 250.455606 0 ] (.:__span-4-18) [ 665 0 R /XYZ 60.307257 237.055254 0 ] (.:__span-4-19) [ 665 0 R /XYZ 60.307257 223.654902 0 ] (.:__span-4-2) [ 665 0 R /XYZ 60.307257 478.261590 0 ] (.:__span-4-20) [ 665 0 R /XYZ 60.307257 210.254550 0 ] (.:__span-4-21) [ 665 0 R /XYZ 60.307257 196.854198 0 ] (.:__span-4-22) [ 665 0 R /XYZ 60.307257 183.453846 0 ] (.:__span-4-23) [ 665 0 R /XYZ 60.307257 170.053494 0 ] (.:__span-4-24) [ 665 0 R /XYZ 60.307257 156.653142 0 ] (.:__span-4-25) [ 665 0 R /XYZ 60.307257 143.252790 0 ] (.:__span-4-26) [ 665 0 R /XYZ 60.307257 129.852438 0 ] (.:__span-4-27) [ 665 0 R /XYZ 60.307257 116.452086 0 ] (.:__span-4-28) [ 665 0 R /XYZ 60.307257 103.051734 0 ] (.:__span-4-29) [ 665 0 R /XYZ 60.307257 89.651382 0 ] (.:__span-4-3) [ 665 0 R /XYZ 60.307257 464.861238 0 ] (.:__span-4-30) [ 667 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-4-31) [ 667 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-4-32) [ 667 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-4-33) [ 667 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-4-34) [ 667 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-4-35) [ 667 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-4-36) [ 667 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-4-37) [ 667 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-4-4) [ 665 0 R /XYZ 60.307257 451.460886 0 ] (.:__span-4-5) [ 665 0 R /XYZ 60.307257 438.060534 0 ] (.:__span-4-6) [ 665 0 R /XYZ 60.307257 424.660182 0 ] (.:__span-4-7) [ 665 0 R /XYZ 60.307257 411.259830 0 ] (.:__span-4-8) [ 665 0 R /XYZ 60.307257 397.859478 0 ] (.:__span-4-9) [ 665 0 R /XYZ 60.307257 384.459126 0 ] (.:__span-5-1) [ 675 0 R /XYZ 60.307257 671.460194 0 ] (.:__span-5-10) [ 675 0 R /XYZ 60.307257 537.456674 0 ] (.:__span-5-11) [ 675 0 R /XYZ 60.307257 524.056322 0 ] (.:__span-5-12) [ 675 0 R /XYZ 60.307257 510.655970 0 ] (.:__span-5-13) [ 675 0 R /XYZ 60.307257 497.255618 0 ] (.:__span-5-14) [ 675 0 R /XYZ 60.307257 483.855266 0 ] (.:__span-5-15) [ 675 0 R /XYZ 60.307257 470.454914 0 ] (.:__span-5-16) [ 675 0 R /XYZ 60.307257 457.054562 0 ] (.:__span-5-17) [ 675 0 R /XYZ 60.307257 443.654210 0 ] (.:__span-5-18) [ 675 0 R /XYZ 60.307257 416.853506 0 ] (.:__span-5-19) [ 675 0 R /XYZ 60.307257 403.453154 0 ] (.:__span-5-2) [ 675 0 R /XYZ 60.307257 658.059842 0 ] (.:__span-5-20) [ 675 0 R /XYZ 60.307257 390.052802 0 ] (.:__span-5-21) [ 675 0 R /XYZ 60.307257 376.652450 0 ] (.:__span-5-22) [ 675 0 R /XYZ 60.307257 363.252098 0 ] (.:__span-5-23) [ 675 0 R /XYZ 60.307257 349.851746 0 ] (.:__span-5-24) [ 675 0 R /XYZ 60.307257 323.051042 0 ] (.:__span-5-25) [ 675 0 R /XYZ 60.307257 309.650690 0 ] (.:__span-5-26) [ 675 0 R /XYZ 60.307257 296.250338 0 ] (.:__span-5-27) [ 675 0 R /XYZ 60.307257 269.449634 0 ] (.:__span-5-28) [ 675 0 R /XYZ 60.307257 256.049282 0 ] (.:__span-5-29) [ 675 0 R /XYZ 60.307257 229.248578 0 ] (.:__span-5-3) [ 675 0 R /XYZ 60.307257 644.659490 0 ] (.:__span-5-30) [ 675 0 R /XYZ 60.307257 202.447874 0 ] (.:__span-5-31) [ 675 0 R /XYZ 60.307257 189.047522 0 ] (.:__span-5-32) [ 675 0 R /XYZ 60.307257 175.647170 0 ] (.:__span-5-33) [ 675 0 R /XYZ 60.307257 162.246818 0 ] (.:__span-5-34) [ 675 0 R /XYZ 60.307257 135.446114 0 ] (.:__span-5-35) [ 675 0 R /XYZ 60.307257 122.045762 0 ] (.:__span-5-36) [ 675 0 R /XYZ 60.307257 108.645410 0 ] (.:__span-5-37) [ 675 0 R /XYZ 60.307257 95.245058 0 ] (.:__span-5-38) [ 679 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-5-39) [ 679 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-5-4) [ 675 0 R /XYZ 60.307257 631.259138 0 ] (.:__span-5-40) [ 679 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-5-41) [ 679 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-5-42) [ 679 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-5-43) [ 679 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-5-44) [ 679 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-5-45) [ 679 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-5-46) [ 679 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-5-47) [ 679 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-5-48) [ 679 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-5-49) [ 679 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-5-5) [ 675 0 R /XYZ 60.307257 617.858786 0 ] (.:__span-5-50) [ 679 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-5-51) [ 679 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-5-52) [ 679 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-5-53) [ 679 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-5-54) [ 679 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-5-55) [ 679 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-5-56) [ 679 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-5-57) [ 679 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-5-58) [ 679 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-5-59) [ 679 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-5-6) [ 675 0 R /XYZ 60.307257 604.458434 0 ] (.:__span-5-60) [ 679 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-5-61) [ 679 0 R /XYZ 60.307257 409.214118 0 ] (.:__span-5-62) [ 679 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-5-7) [ 675 0 R /XYZ 60.307257 577.657730 0 ] (.:__span-5-8) [ 675 0 R /XYZ 60.307257 564.257378 0 ] (.:__span-5-9) [ 675 0 R /XYZ 60.307257 550.857026 0 ] (.:__span-6-1) [ 688 0 R /XYZ 60.307257 458.116602 0 ] (.:__span-6-10) [ 688 0 R /XYZ 60.307257 337.513434 0 ] (.:__span-6-100) [ 694 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-6-101) [ 694 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-6-102) [ 694 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-6-103) [ 694 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-6-104) [ 694 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-6-105) [ 694 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-6-106) [ 694 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-6-107) [ 694 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-6-108) [ 694 0 R /XYZ 60.307257 409.214118 0 ] (.:__span-6-109) [ 694 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-6-11) [ 688 0 R /XYZ 60.307257 324.113082 0 ] (.:__span-6-110) [ 694 0 R /XYZ 60.307257 382.413414 0 ] (.:__span-6-111) [ 694 0 R /XYZ 60.307257 369.013062 0 ] (.:__span-6-112) [ 694 0 R /XYZ 60.307257 355.612710 0 ] (.:__span-6-113) [ 694 0 R /XYZ 60.307257 342.212358 0 ] (.:__span-6-114) [ 694 0 R /XYZ 60.307257 328.812006 0 ] (.:__span-6-115) [ 694 0 R /XYZ 60.307257 315.411654 0 ] (.:__span-6-116) [ 694 0 R /XYZ 60.307257 302.011302 0 ] (.:__span-6-117) [ 694 0 R /XYZ 60.307257 288.610950 0 ] (.:__span-6-118) [ 694 0 R /XYZ 60.307257 275.210598 0 ] (.:__span-6-119) [ 694 0 R /XYZ 60.307257 261.810246 0 ] (.:__span-6-12) [ 688 0 R /XYZ 60.307257 310.712730 0 ] (.:__span-6-120) [ 694 0 R /XYZ 60.307257 248.409894 0 ] (.:__span-6-121) [ 694 0 R /XYZ 60.307257 235.009542 0 ] (.:__span-6-122) [ 694 0 R /XYZ 60.307257 221.609190 0 ] (.:__span-6-123) [ 694 0 R /XYZ 60.307257 208.208838 0 ] (.:__span-6-124) [ 694 0 R /XYZ 60.307257 194.808486 0 ] (.:__span-6-125) [ 694 0 R /XYZ 60.307257 181.408134 0 ] (.:__span-6-126) [ 694 0 R /XYZ 60.307257 168.007782 0 ] (.:__span-6-127) [ 694 0 R /XYZ 60.307257 154.607430 0 ] (.:__span-6-128) [ 694 0 R /XYZ 60.307257 141.207078 0 ] (.:__span-6-129) [ 694 0 R /XYZ 60.307257 127.806726 0 ] (.:__span-6-13) [ 688 0 R /XYZ 60.307257 297.312378 0 ] (.:__span-6-130) [ 694 0 R /XYZ 60.307257 114.406374 0 ] (.:__span-6-131) [ 694 0 R /XYZ 60.307257 101.006022 0 ] (.:__span-6-132) [ 694 0 R /XYZ 60.307257 87.605670 0 ] (.:__span-6-133) [ 696 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-6-134) [ 696 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-6-135) [ 696 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-6-136) [ 696 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-6-137) [ 696 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-6-138) [ 696 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-6-139) [ 696 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-6-14) [ 688 0 R /XYZ 60.307257 283.912026 0 ] (.:__span-6-140) [ 696 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-6-141) [ 696 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-6-142) [ 696 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-6-143) [ 696 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-6-144) [ 696 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-6-145) [ 696 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-6-146) [ 696 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-6-147) [ 696 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-6-148) [ 696 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-6-149) [ 696 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-6-15) [ 688 0 R /XYZ 60.307257 270.511674 0 ] (.:__span-6-150) [ 696 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-6-151) [ 696 0 R /XYZ 60.307257 529.817286 0 ] (.:__span-6-152) [ 696 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-6-153) [ 696 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-6-154) [ 696 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-6-155) [ 696 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-6-156) [ 696 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-6-157) [ 696 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-6-158) [ 696 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-6-159) [ 696 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-6-16) [ 688 0 R /XYZ 60.307257 257.111322 0 ] (.:__span-6-160) [ 696 0 R /XYZ 60.307257 409.214118 0 ] (.:__span-6-161) [ 696 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-6-162) [ 696 0 R /XYZ 60.307257 382.413414 0 ] (.:__span-6-163) [ 696 0 R /XYZ 60.307257 369.013062 0 ] (.:__span-6-17) [ 688 0 R /XYZ 60.307257 243.710970 0 ] (.:__span-6-18) [ 688 0 R /XYZ 60.307257 230.310618 0 ] (.:__span-6-19) [ 688 0 R /XYZ 60.307257 216.910266 0 ] (.:__span-6-2) [ 688 0 R /XYZ 60.307257 444.716250 0 ] (.:__span-6-20) [ 688 0 R /XYZ 60.307257 203.509914 0 ] (.:__span-6-21) [ 688 0 R /XYZ 60.307257 190.109562 0 ] (.:__span-6-22) [ 688 0 R /XYZ 60.307257 176.709210 0 ] (.:__span-6-23) [ 688 0 R /XYZ 60.307257 163.308858 0 ] (.:__span-6-24) [ 688 0 R /XYZ 60.307257 149.908506 0 ] (.:__span-6-25) [ 688 0 R /XYZ 60.307257 136.508154 0 ] (.:__span-6-26) [ 688 0 R /XYZ 60.307257 123.107802 0 ] (.:__span-6-27) [ 688 0 R /XYZ 60.307257 109.707450 0 ] (.:__span-6-28) [ 688 0 R /XYZ 60.307257 96.307098 0 ] (.:__span-6-29) [ 692 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-6-3) [ 688 0 R /XYZ 60.307257 431.315898 0 ] (.:__span-6-30) [ 692 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-6-31) [ 692 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-6-32) [ 692 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-6-33) [ 692 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-6-34) [ 692 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-6-35) [ 692 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-6-36) [ 692 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-6-37) [ 692 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-6-38) [ 692 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-6-39) [ 692 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-6-4) [ 688 0 R /XYZ 60.307257 417.915546 0 ] (.:__span-6-40) [ 692 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-6-41) [ 692 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-6-42) [ 692 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-6-43) [ 692 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-6-44) [ 692 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-6-45) [ 692 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-6-46) [ 692 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-6-47) [ 692 0 R /XYZ 60.307257 529.817286 0 ] (.:__span-6-48) [ 692 0 R /XYZ 60.307257 516.416934 0 ] (.:__span-6-49) [ 692 0 R /XYZ 60.307257 503.016582 0 ] (.:__span-6-5) [ 688 0 R /XYZ 60.307257 404.515194 0 ] (.:__span-6-50) [ 692 0 R /XYZ 60.307257 489.616230 0 ] (.:__span-6-51) [ 692 0 R /XYZ 60.307257 476.215878 0 ] (.:__span-6-52) [ 692 0 R /XYZ 60.307257 462.815526 0 ] (.:__span-6-53) [ 692 0 R /XYZ 60.307257 449.415174 0 ] (.:__span-6-54) [ 692 0 R /XYZ 60.307257 436.014822 0 ] (.:__span-6-55) [ 692 0 R /XYZ 60.307257 422.614470 0 ] (.:__span-6-56) [ 692 0 R /XYZ 60.307257 409.214118 0 ] (.:__span-6-57) [ 692 0 R /XYZ 60.307257 395.813766 0 ] (.:__span-6-58) [ 692 0 R /XYZ 60.307257 382.413414 0 ] (.:__span-6-59) [ 692 0 R /XYZ 60.307257 369.013062 0 ] (.:__span-6-6) [ 688 0 R /XYZ 60.307257 391.114842 0 ] (.:__span-6-60) [ 692 0 R /XYZ 60.307257 355.612710 0 ] (.:__span-6-61) [ 692 0 R /XYZ 60.307257 342.212358 0 ] (.:__span-6-62) [ 692 0 R /XYZ 60.307257 328.812006 0 ] (.:__span-6-63) [ 692 0 R /XYZ 60.307257 315.411654 0 ] (.:__span-6-64) [ 692 0 R /XYZ 60.307257 302.011302 0 ] (.:__span-6-65) [ 692 0 R /XYZ 60.307257 288.610950 0 ] (.:__span-6-66) [ 692 0 R /XYZ 60.307257 275.210598 0 ] (.:__span-6-67) [ 692 0 R /XYZ 60.307257 261.810246 0 ] (.:__span-6-68) [ 692 0 R /XYZ 60.307257 248.409894 0 ] (.:__span-6-69) [ 692 0 R /XYZ 60.307257 235.009542 0 ] (.:__span-6-7) [ 688 0 R /XYZ 60.307257 377.714490 0 ] (.:__span-6-70) [ 692 0 R /XYZ 60.307257 221.609190 0 ] (.:__span-6-71) [ 692 0 R /XYZ 60.307257 208.208838 0 ] (.:__span-6-72) [ 692 0 R /XYZ 60.307257 194.808486 0 ] (.:__span-6-73) [ 692 0 R /XYZ 60.307257 181.408134 0 ] (.:__span-6-74) [ 692 0 R /XYZ 60.307257 168.007782 0 ] (.:__span-6-75) [ 692 0 R /XYZ 60.307257 154.607430 0 ] (.:__span-6-76) [ 692 0 R /XYZ 60.307257 141.207078 0 ] (.:__span-6-77) [ 692 0 R /XYZ 60.307257 127.806726 0 ] (.:__span-6-78) [ 692 0 R /XYZ 60.307257 114.406374 0 ] (.:__span-6-79) [ 692 0 R /XYZ 60.307257 101.006022 0 ] (.:__span-6-8) [ 688 0 R /XYZ 60.307257 364.314138 0 ] (.:__span-6-80) [ 692 0 R /XYZ 60.307257 87.605670 0 ] (.:__span-6-81) [ 694 0 R /XYZ 60.307257 771.023622 0 ] (.:__span-6-82) [ 694 0 R /XYZ 60.307257 757.623270 0 ] (.:__span-6-83) [ 694 0 R /XYZ 60.307257 744.222918 0 ] (.:__span-6-84) [ 694 0 R /XYZ 60.307257 730.822566 0 ] (.:__span-6-85) [ 694 0 R /XYZ 60.307257 717.422214 0 ] (.:__span-6-86) [ 694 0 R /XYZ 60.307257 704.021862 0 ] (.:__span-6-87) [ 694 0 R /XYZ 60.307257 690.621510 0 ] (.:__span-6-88) [ 694 0 R /XYZ 60.307257 677.221158 0 ] (.:__span-6-89) [ 694 0 R /XYZ 60.307257 663.820806 0 ] (.:__span-6-9) [ 688 0 R /XYZ 60.307257 350.913786 0 ] (.:__span-6-90) [ 694 0 R /XYZ 60.307257 650.420454 0 ] (.:__span-6-91) [ 694 0 R /XYZ 60.307257 637.020102 0 ] (.:__span-6-92) [ 694 0 R /XYZ 60.307257 623.619750 0 ] (.:__span-6-93) [ 694 0 R /XYZ 60.307257 610.219398 0 ] (.:__span-6-94) [ 694 0 R /XYZ 60.307257 596.819046 0 ] (.:__span-6-95) [ 694 0 R /XYZ 60.307257 583.418694 0 ] (.:__span-6-96) [ 694 0 R /XYZ 60.307257 570.018342 0 ] (.:__span-6-97) [ 694 0 R /XYZ 60.307257 556.617990 0 ] (.:__span-6-98) [ 694 0 R /XYZ 60.307257 543.217638 0 ] (.:__span-6-99) [ 694 0 R /XYZ 60.307257 529.817286 0 ] (.:__span-7-1) [ 929 0 R /XYZ 60.307257 428.812602 0 ] (.:__span-7-2) [ 929 0 R /XYZ 60.307257 415.412250 0 ] (.:__span-7-3) [ 929 0 R /XYZ 60.307257 402.011898 0 ] (.:__span-7-4) [ 929 0 R /XYZ 60.307257 388.611546 0 ] (.:__span-7-5) [ 929 0 R /XYZ 60.307257 375.211194 0 ] (.:__span-7-6) [ 929 0 R /XYZ 60.307257 361.810842 0 ] (.:__span-7-7) [ 929 0 R /XYZ 60.307257 348.410490 0 ] (.:__span-8-1) [ 931 0 R /XYZ 60.307257 381.602202 0 ] (.:__span-8-2) [ 931 0 R /XYZ 60.307257 368.201850 0 ] (.:__span-8-3) [ 931 0 R /XYZ 60.307257 354.801498 0 ] (.:__span-8-4) [ 931 0 R /XYZ 60.307257 341.401146 0 ] (.:__span-8-5) [ 931 0 R /XYZ 60.307257 328.000794 0 ] (.:__span-8-6) [ 931 0 R /XYZ 60.307257 314.600442 0 ] (.:__span-9-1) [ 936 0 R /XYZ 60.307257 458.458122 0 ] (.:__span-9-2) [ 936 0 R /XYZ 60.307257 445.057770 0 ] (.:__span-9-3) [ 936 0 R /XYZ 60.307257 431.657418 0 ] (.:__span-9-4) [ 936 0 R /XYZ 60.307257 418.257066 0 ] (.:__span-9-5) [ 936 0 R /XYZ 60.307257 404.856714 0 ] (.:__span-9-6) [ 936 0 R /XYZ 60.307257 391.456362 0 ] (.:__span-9-7) [ 936 0 R /XYZ 60.307257 378.056010 0 ] (.:abstract) [ 522 0 R /XYZ 39.386457 771.023622 0 ] (.:affichage-calcule) [ 941 0 R /XYZ 42.836457 716.541222 0 ] (.:affichage-des-donnees) [ 936 0 R /XYZ 39.386457 722.226822 0 ] (.:affichage-direct) [ 936 0 R /XYZ 42.836457 580.332822 0 ] (.:affichage-hybride) [ 941 0 R /XYZ 42.836457 667.744422 0 ] (.:affichage-predictif) [ 961 0 R /XYZ 42.836457 595.529850 0 ] (.:affichage-totalement-calcule) [ 951 0 R /XYZ 42.836457 353.735622 0 ] (.:ameliorations-futures) [ 976 0 R /XYZ 39.386457 265.576722 0 ] (.:analyse-fonctionnelle) [ 563 0 R /XYZ 39.386457 335.606022 0 ] (.:analyse-organique) [ 563 0 R /XYZ 39.386457 246.262122 0 ] (.:base-de-donnee) [ 923 0 R /XYZ 42.836457 353.394469 0 ] (.:browser-headless) [ 972 0 R /XYZ 39.386457 324.008922 0 ] (.:cahier-des-charges) [ 524 0 R /XYZ 39.386457 550.499622 0 ] (.:calibration) [ 667 0 R /XYZ 42.836457 579.426906 0 ] (.:cas-dutilisation) [ 534 0 R /XYZ 39.386457 412.926066 0 ] (.:chiffres) [ 775 0 R /XYZ 42.836457 460.413222 0 ] (.:comment-ca-aurait-du-se-passer) [ 968 0 R /XYZ 39.386457 250.947249 0 ] (.:comment-ca-cest-passe) [ 963 0 R /XYZ 39.386457 682.814022 0 ] (.:comment-faire) [ 645 0 R /XYZ 42.836457 735.309222 0 ] (.:conclusion) [ 976 0 R /XYZ 39.386457 176.232822 0 ] (.:controler-le-navigateur) [ 652 0 R /XYZ 42.836457 387.800022 0 ] (.:csharp) [ 597 0 R /XYZ 42.836457 487.571622 0 ] (.:description-du-besoin) [ 522 0 R /XYZ 39.386457 343.911222 0 ] (.:differences-sur-le-cahier-des-charges) [ 538 0 R /XYZ 39.386457 368.746422 0 ] (.:difficultes-techniques) [ 538 0 R /XYZ 39.386457 638.709222 0 ] (.:drs) [ 865 0 R /XYZ 42.836457 584.282022 0 ] (.:dt) [ 555 0 R /XYZ 42.836457 404.984502 0 ] (.:dt1-creation-du-poster-1) [ 555 0 R /XYZ 42.836457 341.173302 0 ] (.:dt2-documentation-analyse-de-lexistant-2) [ 555 0 R /XYZ 42.836457 225.937782 0 ] (.:dt3-documentation-analyse-organique-5) [ 555 0 R /XYZ 42.836457 140.731062 0 ] (.:dt4-documentation-analyse-fonctionnelle-2) [ 557 0 R /XYZ 42.836457 692.198022 0 ] (.:dt5-documentation-tests-1) [ 557 0 R /XYZ 42.836457 552.564102 0 ] (.:dt6-documentation-reste-2) [ 557 0 R /XYZ 42.836457 476.741382 0 ] (.:ethique-du-projet) [ 976 0 R /XYZ 39.386457 459.278922 0 ] (.:figma) [ 575 0 R /XYZ 42.836457 270.006822 0 ] (.:filtres-et-methodes-sur-les-images) [ 865 0 R /XYZ 42.836457 523.473702 0 ] (.:filtres-et-traitement) [ 732 0 R /XYZ 42.836457 237.136277 0 ] (.:firefox) [ 607 0 R /XYZ 42.836457 389.978022 0 ] (.:fonctionnement-general) [ 614 0 R /XYZ 39.386457 435.021222 0 ] (.:fonctionnement-general_1) [ 698 0 R /XYZ 42.836457 771.023622 0 ] (.:glossaire) [ 978 0 R /XYZ 39.386457 710.770122 0 ] (.:introduction) [ 516 0 R /XYZ 39.386457 723.165222 0 ] (.:lecons) [ 972 0 R /XYZ 39.386457 613.372422 0 ] (.:les-briques-principales) [ 614 0 R /XYZ 42.836457 326.909622 0 ] (.:les-chiffres-2) [ 799 0 R /XYZ 42.836457 569.267622 0 ] (.:liste-des-pilotes) [ 669 0 R /XYZ 42.836457 771.023622 0 ] (.:materialmkdocsmarkdown) [ 575 0 R /XYZ 42.836457 771.023622 0 ] (.:notes-de-code) [ 978 0 R /XYZ 39.386457 771.023622 0 ] (.:ocr) [ 617 0 R /XYZ 42.836457 95.795299 0 ] (.:ocr_1) [ 696 0 R /XYZ 39.386457 303.179610 0 ] (.:ocr_2) [ 974 0 R /XYZ 39.386457 613.372422 0 ] (.:optimisation-du-programme) [ 976 0 R /XYZ 39.386457 717.534822 0 ] (.:outils-utilises) [ 563 0 R /XYZ 39.386457 190.700622 0 ] (.:petit-point-resolution) [ 879 0 R /XYZ 42.836457 371.265222 0 ] (.:planning-effectif-et-differences) [ 561 0 R /XYZ 39.386457 517.843302 0 ] (.:planning-previsionnel) [ 551 0 R /XYZ 39.386457 268.716368 0 ] (.:pneus) [ 799 0 R /XYZ 42.836457 523.473702 0 ] (.:projet) [ 524 0 R /XYZ 39.386457 435.818922 0 ] (.:pt) [ 555 0 R /XYZ 42.836457 580.332822 0 ] (.:pt1-preparation-au-travail-de-diplome-2) [ 555 0 R /XYZ 42.836457 531.536022 0 ] (.:pt1-programmation-recuperation-des-images-3) [ 557 0 R /XYZ 42.836457 310.777062 0 ] (.:pt2-programmation-ocr-5) [ 559 0 R /XYZ 42.836457 771.023622 0 ] (.:pt3-programmation-stockage-et-modele-5) [ 559 0 R /XYZ 42.836457 625.759302 0 ] (.:pt4-programmation-vue-de-lapp-5) [ 559 0 R /XYZ 42.836457 495.509382 0 ] (.:pt5-programmation-mise-en-commun-3) [ 559 0 R /XYZ 42.836457 365.259462 0 ] (.:pt_1) [ 557 0 R /XYZ 42.836457 374.588262 0 ] (.:python) [ 602 0 R /XYZ 42.836457 517.600422 0 ] (.:quand-remplir-la-base) [ 927 0 R /XYZ 42.836457 256.212822 0 ] (.:quand-un-pilote-a-fait-un-arret-aux-stands) [ 931 0 R /XYZ 42.836457 771.023622 0 ] (.:quand-un-pilote-a-finit-un-tour) [ 929 0 R /XYZ 42.836457 746.625222 0 ] (.:rapport-track-trends-v10) [ 510 0 R /XYZ 39.386457 757.223622 0 ] (.:realisation) [ 526 0 R /XYZ 39.386457 771.023622 0 ] (.:recuperation-des-images) [ 636 0 R /XYZ 39.386457 253.026822 0 ] (.:recuperation-dimages) [ 614 0 R /XYZ 42.836457 263.098422 0 ] (.:recuperer-les-cookies) [ 659 0 R /XYZ 42.836457 409.684422 0 ] (.:resume) [ 516 0 R /XYZ 39.386457 667.603722 0 ] (.:resume-des-difficultes-techniques) [ 972 0 R /XYZ 39.386457 478.102422 0 ] (.:resume-du-fonctionnement-general) [ 627 0 R /XYZ 42.836457 187.703299 0 ] (.:selenium) [ 585 0 R /XYZ 42.836457 653.528022 0 ] (.:simuler-un-navigateur) [ 645 0 R /XYZ 42.836457 106.526022 0 ] (.:stockage) [ 688 0 R /XYZ 42.836457 646.430022 0 ] (.:stockage-des-donnees) [ 917 0 R /XYZ 39.386457 572.502822 0 ] (.:stockage_1) [ 974 0 R /XYZ 39.386457 195.644022 0 ] (.:taches) [ 555 0 R /XYZ 39.386457 771.023622 0 ] (.:technologies-utilisees) [ 585 0 R /XYZ 39.386457 771.023622 0 ] (.:tesseract) [ 614 0 R /XYZ 42.836457 611.440422 0 ] (.:tests) [ 961 0 R /XYZ 39.386457 211.724250 0 ] (.:texte) [ 754 0 R /XYZ 42.836457 369.234822 0 ] (.:traitement-des-donnees) [ 905 0 R /XYZ 39.386457 195.312822 0 ] (.:traitement-et-affichage) [ 622 0 R /XYZ 42.836457 122.598958 0 ] (.:tt) [ 559 0 R /XYZ 42.836457 238.707942 0 ] (.:tt1-tests-ocr-2) [ 559 0 R /XYZ 42.836457 174.896742 0 ] (.:tt2-tests-finaux-2) [ 561 0 R /XYZ 42.836457 662.169222 0 ] (.:utilisation-de-chat-gpt) [ 976 0 R /XYZ 39.386457 354.920622 0 ] (.:visual-studio-2022) [ 563 0 R /XYZ 42.836457 163.346622 0 ] (.:visual-studio-code) [ 566 0 R /XYZ 42.836457 298.274022 0 ] (.:windows-pilotes) [ 679 0 R /XYZ 42.836457 363.762714 0 ] (.:zone-principale) [ 669 0 R /XYZ 42.836457 640.773702 0 ] (.:zones-pilotes) [ 669 0 R /XYZ 42.836457 316.153201 0 ] (CahierDesCharges/:) [ 980 0 R /XYZ 39.386457 771.023622 0 ] (CahierDesCharges/:cahier-des-charges) [ 980 0 R /XYZ 39.386457 757.223622 0 ] (CahierDesCharges/:cas-dutilisation) [ 1001 0 R /XYZ 39.386457 771.023622 0 ] (CahierDesCharges/:contexte) [ 980 0 R /XYZ 39.386457 669.390822 0 ] (CahierDesCharges/:difficultes-techniques) [ 1003 0 R /XYZ 39.386457 771.023622 0 ] (CahierDesCharges/:projet) [ 985 0 R /XYZ 39.386457 124.199039 0 ] (CahierDesCharges/:realisation) [ 989 0 R /XYZ 39.386457 436.953222 0 ] (Code/ConfigurationTool/:) [ 1765 0 R /XYZ 39.386457 707.865222 0 ] (Code/ConfigurationTool/:__span-0-1) [ 1765 0 R /XYZ 60.307257 667.937022 0 ] (Code/ConfigurationTool/:__span-0-10) [ 1765 0 R /XYZ 60.307257 533.933502 0 ] (Code/ConfigurationTool/:__span-0-100) [ 1769 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-101) [ 1769 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-102) [ 1769 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-103) [ 1769 0 R /XYZ 60.307257 596.819046 0 ] (Code/ConfigurationTool/:__span-0-104) [ 1769 0 R /XYZ 60.307257 583.418694 0 ] (Code/ConfigurationTool/:__span-0-105) [ 1769 0 R /XYZ 60.307257 570.018342 0 ] (Code/ConfigurationTool/:__span-0-106) [ 1769 0 R /XYZ 60.307257 556.617990 0 ] (Code/ConfigurationTool/:__span-0-107) [ 1769 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-108) [ 1769 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-109) [ 1769 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-11) [ 1765 0 R /XYZ 60.307257 520.533150 0 ] (Code/ConfigurationTool/:__span-0-110) [ 1769 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-111) [ 1769 0 R /XYZ 60.307257 489.616230 0 ] (Code/ConfigurationTool/:__span-0-112) [ 1769 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-113) [ 1769 0 R /XYZ 60.307257 462.815526 0 ] (Code/ConfigurationTool/:__span-0-114) [ 1769 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-115) [ 1769 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-116) [ 1769 0 R /XYZ 60.307257 422.614470 0 ] (Code/ConfigurationTool/:__span-0-117) [ 1769 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-118) [ 1769 0 R /XYZ 60.307257 395.813766 0 ] (Code/ConfigurationTool/:__span-0-119) [ 1769 0 R /XYZ 60.307257 382.413414 0 ] (Code/ConfigurationTool/:__span-0-12) [ 1765 0 R /XYZ 60.307257 507.132798 0 ] (Code/ConfigurationTool/:__span-0-120) [ 1769 0 R /XYZ 60.307257 369.013062 0 ] (Code/ConfigurationTool/:__span-0-121) [ 1769 0 R /XYZ 60.307257 355.612710 0 ] (Code/ConfigurationTool/:__span-0-122) [ 1769 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-123) [ 1769 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-124) [ 1769 0 R /XYZ 60.307257 315.411654 0 ] (Code/ConfigurationTool/:__span-0-125) [ 1769 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-126) [ 1769 0 R /XYZ 60.307257 288.610950 0 ] (Code/ConfigurationTool/:__span-0-127) [ 1769 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-128) [ 1769 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-129) [ 1769 0 R /XYZ 60.307257 248.409894 0 ] (Code/ConfigurationTool/:__span-0-13) [ 1765 0 R /XYZ 60.307257 493.732446 0 ] (Code/ConfigurationTool/:__span-0-130) [ 1769 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-131) [ 1769 0 R /XYZ 60.307257 221.609190 0 ] (Code/ConfigurationTool/:__span-0-132) [ 1769 0 R /XYZ 60.307257 208.208838 0 ] (Code/ConfigurationTool/:__span-0-133) [ 1769 0 R /XYZ 60.307257 194.808486 0 ] (Code/ConfigurationTool/:__span-0-134) [ 1769 0 R /XYZ 60.307257 181.408134 0 ] (Code/ConfigurationTool/:__span-0-135) [ 1769 0 R /XYZ 60.307257 168.007782 0 ] (Code/ConfigurationTool/:__span-0-136) [ 1769 0 R /XYZ 60.307257 154.607430 0 ] (Code/ConfigurationTool/:__span-0-137) [ 1769 0 R /XYZ 60.307257 141.207078 0 ] (Code/ConfigurationTool/:__span-0-138) [ 1769 0 R /XYZ 60.307257 127.806726 0 ] (Code/ConfigurationTool/:__span-0-139) [ 1769 0 R /XYZ 60.307257 114.406374 0 ] (Code/ConfigurationTool/:__span-0-14) [ 1765 0 R /XYZ 60.307257 480.332094 0 ] (Code/ConfigurationTool/:__span-0-140) [ 1769 0 R /XYZ 60.307257 101.006022 0 ] (Code/ConfigurationTool/:__span-0-141) [ 1769 0 R /XYZ 60.307257 87.605670 0 ] (Code/ConfigurationTool/:__span-0-142) [ 1771 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-143) [ 1771 0 R /XYZ 60.307257 744.222918 0 ] (Code/ConfigurationTool/:__span-0-144) [ 1771 0 R /XYZ 60.307257 730.822566 0 ] (Code/ConfigurationTool/:__span-0-145) [ 1771 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-146) [ 1771 0 R /XYZ 60.307257 704.021862 0 ] (Code/ConfigurationTool/:__span-0-147) [ 1771 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-148) [ 1771 0 R /XYZ 60.307257 677.221158 0 ] (Code/ConfigurationTool/:__span-0-149) [ 1771 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-15) [ 1765 0 R /XYZ 60.307257 466.931742 0 ] (Code/ConfigurationTool/:__span-0-150) [ 1771 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:__span-0-151) [ 1771 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-152) [ 1771 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-153) [ 1771 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-154) [ 1771 0 R /XYZ 60.307257 596.819046 0 ] (Code/ConfigurationTool/:__span-0-155) [ 1771 0 R /XYZ 60.307257 583.418694 0 ] (Code/ConfigurationTool/:__span-0-156) [ 1771 0 R /XYZ 60.307257 570.018342 0 ] (Code/ConfigurationTool/:__span-0-157) [ 1771 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-158) [ 1771 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-159) [ 1771 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-16) [ 1765 0 R /XYZ 60.307257 453.531390 0 ] (Code/ConfigurationTool/:__span-0-160) [ 1771 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-161) [ 1771 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-162) [ 1771 0 R /XYZ 60.307257 462.815526 0 ] (Code/ConfigurationTool/:__span-0-163) [ 1771 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-164) [ 1771 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-165) [ 1771 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-166) [ 1771 0 R /XYZ 60.307257 395.813766 0 ] (Code/ConfigurationTool/:__span-0-167) [ 1771 0 R /XYZ 60.307257 382.413414 0 ] (Code/ConfigurationTool/:__span-0-168) [ 1771 0 R /XYZ 60.307257 369.013062 0 ] (Code/ConfigurationTool/:__span-0-169) [ 1771 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-17) [ 1765 0 R /XYZ 60.307257 440.131038 0 ] (Code/ConfigurationTool/:__span-0-170) [ 1771 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-171) [ 1771 0 R /XYZ 60.307257 315.411654 0 ] (Code/ConfigurationTool/:__span-0-172) [ 1771 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-173) [ 1771 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-174) [ 1771 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-175) [ 1771 0 R /XYZ 60.307257 248.409894 0 ] (Code/ConfigurationTool/:__span-0-176) [ 1771 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-177) [ 1771 0 R /XYZ 60.307257 208.208838 0 ] (Code/ConfigurationTool/:__span-0-178) [ 1771 0 R /XYZ 60.307257 194.808486 0 ] (Code/ConfigurationTool/:__span-0-179) [ 1771 0 R /XYZ 60.307257 181.408134 0 ] (Code/ConfigurationTool/:__span-0-18) [ 1765 0 R /XYZ 60.307257 426.730686 0 ] (Code/ConfigurationTool/:__span-0-180) [ 1771 0 R /XYZ 60.307257 168.007782 0 ] (Code/ConfigurationTool/:__span-0-181) [ 1771 0 R /XYZ 60.307257 141.207078 0 ] (Code/ConfigurationTool/:__span-0-182) [ 1771 0 R /XYZ 60.307257 127.806726 0 ] (Code/ConfigurationTool/:__span-0-183) [ 1771 0 R /XYZ 60.307257 114.406374 0 ] (Code/ConfigurationTool/:__span-0-184) [ 1771 0 R /XYZ 60.307257 101.006022 0 ] (Code/ConfigurationTool/:__span-0-185) [ 1773 0 R /XYZ 60.307257 771.023622 0 ] (Code/ConfigurationTool/:__span-0-186) [ 1773 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-187) [ 1773 0 R /XYZ 60.307257 744.222918 0 ] (Code/ConfigurationTool/:__span-0-188) [ 1773 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-189) [ 1773 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-19) [ 1765 0 R /XYZ 60.307257 413.330334 0 ] (Code/ConfigurationTool/:__span-0-190) [ 1773 0 R /XYZ 60.307257 677.221158 0 ] (Code/ConfigurationTool/:__span-0-191) [ 1773 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-192) [ 1773 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:__span-0-193) [ 1773 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-194) [ 1773 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-195) [ 1773 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-196) [ 1773 0 R /XYZ 60.307257 583.418694 0 ] (Code/ConfigurationTool/:__span-0-197) [ 1773 0 R /XYZ 60.307257 556.617990 0 ] (Code/ConfigurationTool/:__span-0-198) [ 1773 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-199) [ 1773 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-2) [ 1765 0 R /XYZ 60.307257 654.536670 0 ] (Code/ConfigurationTool/:__span-0-20) [ 1765 0 R /XYZ 60.307257 399.929982 0 ] (Code/ConfigurationTool/:__span-0-200) [ 1773 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-201) [ 1773 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-202) [ 1773 0 R /XYZ 60.307257 489.616230 0 ] (Code/ConfigurationTool/:__span-0-203) [ 1773 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-204) [ 1773 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-205) [ 1773 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-206) [ 1773 0 R /XYZ 60.307257 422.614470 0 ] (Code/ConfigurationTool/:__span-0-207) [ 1773 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-208) [ 1773 0 R /XYZ 60.307257 395.813766 0 ] (Code/ConfigurationTool/:__span-0-209) [ 1773 0 R /XYZ 60.307257 369.013062 0 ] (Code/ConfigurationTool/:__span-0-21) [ 1765 0 R /XYZ 60.307257 386.529630 0 ] (Code/ConfigurationTool/:__span-0-210) [ 1773 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-211) [ 1773 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-212) [ 1773 0 R /XYZ 60.307257 315.411654 0 ] (Code/ConfigurationTool/:__span-0-213) [ 1773 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-214) [ 1773 0 R /XYZ 60.307257 288.610950 0 ] (Code/ConfigurationTool/:__span-0-215) [ 1773 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-216) [ 1773 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-217) [ 1773 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-218) [ 1773 0 R /XYZ 60.307257 221.609190 0 ] (Code/ConfigurationTool/:__span-0-219) [ 1773 0 R /XYZ 60.307257 208.208838 0 ] (Code/ConfigurationTool/:__span-0-22) [ 1765 0 R /XYZ 60.307257 373.129278 0 ] (Code/ConfigurationTool/:__span-0-220) [ 1773 0 R /XYZ 60.307257 194.808486 0 ] (Code/ConfigurationTool/:__span-0-221) [ 1773 0 R /XYZ 60.307257 181.408134 0 ] (Code/ConfigurationTool/:__span-0-222) [ 1773 0 R /XYZ 60.307257 154.607430 0 ] (Code/ConfigurationTool/:__span-0-223) [ 1773 0 R /XYZ 60.307257 141.207078 0 ] (Code/ConfigurationTool/:__span-0-224) [ 1773 0 R /XYZ 60.307257 127.806726 0 ] (Code/ConfigurationTool/:__span-0-225) [ 1773 0 R /XYZ 60.307257 101.006022 0 ] (Code/ConfigurationTool/:__span-0-226) [ 1773 0 R /XYZ 60.307257 87.605670 0 ] (Code/ConfigurationTool/:__span-0-227) [ 1775 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-228) [ 1775 0 R /XYZ 60.307257 730.822566 0 ] (Code/ConfigurationTool/:__span-0-229) [ 1775 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-23) [ 1765 0 R /XYZ 60.307257 359.728926 0 ] (Code/ConfigurationTool/:__span-0-230) [ 1775 0 R /XYZ 60.307257 704.021862 0 ] (Code/ConfigurationTool/:__span-0-231) [ 1775 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-232) [ 1775 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-233) [ 1775 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:__span-0-234) [ 1775 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-235) [ 1775 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-236) [ 1775 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-237) [ 1775 0 R /XYZ 60.307257 596.819046 0 ] (Code/ConfigurationTool/:__span-0-238) [ 1775 0 R /XYZ 60.307257 583.418694 0 ] (Code/ConfigurationTool/:__span-0-239) [ 1775 0 R /XYZ 60.307257 570.018342 0 ] (Code/ConfigurationTool/:__span-0-24) [ 1765 0 R /XYZ 60.307257 346.328574 0 ] (Code/ConfigurationTool/:__span-0-240) [ 1775 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-241) [ 1775 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-242) [ 1775 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-243) [ 1775 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-244) [ 1775 0 R /XYZ 60.307257 489.616230 0 ] (Code/ConfigurationTool/:__span-0-245) [ 1775 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-246) [ 1775 0 R /XYZ 60.307257 462.815526 0 ] (Code/ConfigurationTool/:__span-0-247) [ 1775 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-248) [ 1775 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-249) [ 1775 0 R /XYZ 60.307257 422.614470 0 ] (Code/ConfigurationTool/:__span-0-25) [ 1765 0 R /XYZ 60.307257 332.928222 0 ] (Code/ConfigurationTool/:__span-0-250) [ 1775 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-251) [ 1775 0 R /XYZ 60.307257 382.413414 0 ] (Code/ConfigurationTool/:__span-0-252) [ 1775 0 R /XYZ 60.307257 355.612710 0 ] (Code/ConfigurationTool/:__span-0-253) [ 1775 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-254) [ 1775 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-255) [ 1775 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-256) [ 1775 0 R /XYZ 60.307257 288.610950 0 ] (Code/ConfigurationTool/:__span-0-257) [ 1775 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-258) [ 1775 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-259) [ 1775 0 R /XYZ 60.307257 248.409894 0 ] (Code/ConfigurationTool/:__span-0-26) [ 1765 0 R /XYZ 60.307257 319.527870 0 ] (Code/ConfigurationTool/:__span-0-260) [ 1775 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-261) [ 1775 0 R /XYZ 60.307257 221.609190 0 ] (Code/ConfigurationTool/:__span-0-27) [ 1765 0 R /XYZ 60.307257 306.127518 0 ] (Code/ConfigurationTool/:__span-0-28) [ 1765 0 R /XYZ 60.307257 279.326814 0 ] (Code/ConfigurationTool/:__span-0-29) [ 1765 0 R /XYZ 60.307257 265.926462 0 ] (Code/ConfigurationTool/:__span-0-3) [ 1765 0 R /XYZ 60.307257 641.136318 0 ] (Code/ConfigurationTool/:__span-0-30) [ 1765 0 R /XYZ 60.307257 239.125758 0 ] (Code/ConfigurationTool/:__span-0-31) [ 1765 0 R /XYZ 60.307257 212.325054 0 ] (Code/ConfigurationTool/:__span-0-32) [ 1765 0 R /XYZ 60.307257 198.924702 0 ] (Code/ConfigurationTool/:__span-0-33) [ 1765 0 R /XYZ 60.307257 185.524350 0 ] (Code/ConfigurationTool/:__span-0-34) [ 1765 0 R /XYZ 60.307257 172.123998 0 ] (Code/ConfigurationTool/:__span-0-35) [ 1765 0 R /XYZ 60.307257 158.723646 0 ] (Code/ConfigurationTool/:__span-0-36) [ 1765 0 R /XYZ 60.307257 145.323294 0 ] (Code/ConfigurationTool/:__span-0-37) [ 1765 0 R /XYZ 60.307257 131.922942 0 ] (Code/ConfigurationTool/:__span-0-38) [ 1765 0 R /XYZ 60.307257 118.522590 0 ] (Code/ConfigurationTool/:__span-0-39) [ 1765 0 R /XYZ 60.307257 105.122238 0 ] (Code/ConfigurationTool/:__span-0-4) [ 1765 0 R /XYZ 60.307257 627.735966 0 ] (Code/ConfigurationTool/:__span-0-40) [ 1765 0 R /XYZ 60.307257 91.721886 0 ] (Code/ConfigurationTool/:__span-0-41) [ 1767 0 R /XYZ 60.307257 771.023622 0 ] (Code/ConfigurationTool/:__span-0-42) [ 1767 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-43) [ 1767 0 R /XYZ 60.307257 744.222918 0 ] (Code/ConfigurationTool/:__span-0-44) [ 1767 0 R /XYZ 60.307257 730.822566 0 ] (Code/ConfigurationTool/:__span-0-45) [ 1767 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-46) [ 1767 0 R /XYZ 60.307257 704.021862 0 ] (Code/ConfigurationTool/:__span-0-47) [ 1767 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-48) [ 1767 0 R /XYZ 60.307257 677.221158 0 ] (Code/ConfigurationTool/:__span-0-49) [ 1767 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-5) [ 1765 0 R /XYZ 60.307257 600.935262 0 ] (Code/ConfigurationTool/:__span-0-50) [ 1767 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:__span-0-51) [ 1767 0 R /XYZ 60.307257 637.020102 0 ] (Code/ConfigurationTool/:__span-0-52) [ 1767 0 R /XYZ 60.307257 623.619750 0 ] (Code/ConfigurationTool/:__span-0-53) [ 1767 0 R /XYZ 60.307257 610.219398 0 ] (Code/ConfigurationTool/:__span-0-54) [ 1767 0 R /XYZ 60.307257 570.018342 0 ] (Code/ConfigurationTool/:__span-0-55) [ 1767 0 R /XYZ 60.307257 556.617990 0 ] (Code/ConfigurationTool/:__span-0-56) [ 1767 0 R /XYZ 60.307257 543.217638 0 ] (Code/ConfigurationTool/:__span-0-57) [ 1767 0 R /XYZ 60.307257 529.817286 0 ] (Code/ConfigurationTool/:__span-0-58) [ 1767 0 R /XYZ 60.307257 516.416934 0 ] (Code/ConfigurationTool/:__span-0-59) [ 1767 0 R /XYZ 60.307257 503.016582 0 ] (Code/ConfigurationTool/:__span-0-6) [ 1765 0 R /XYZ 60.307257 587.534910 0 ] (Code/ConfigurationTool/:__span-0-60) [ 1767 0 R /XYZ 60.307257 489.616230 0 ] (Code/ConfigurationTool/:__span-0-61) [ 1767 0 R /XYZ 60.307257 476.215878 0 ] (Code/ConfigurationTool/:__span-0-62) [ 1767 0 R /XYZ 60.307257 462.815526 0 ] (Code/ConfigurationTool/:__span-0-63) [ 1767 0 R /XYZ 60.307257 449.415174 0 ] (Code/ConfigurationTool/:__span-0-64) [ 1767 0 R /XYZ 60.307257 436.014822 0 ] (Code/ConfigurationTool/:__span-0-65) [ 1767 0 R /XYZ 60.307257 422.614470 0 ] (Code/ConfigurationTool/:__span-0-66) [ 1767 0 R /XYZ 60.307257 409.214118 0 ] (Code/ConfigurationTool/:__span-0-67) [ 1767 0 R /XYZ 60.307257 395.813766 0 ] (Code/ConfigurationTool/:__span-0-68) [ 1767 0 R /XYZ 60.307257 382.413414 0 ] (Code/ConfigurationTool/:__span-0-69) [ 1767 0 R /XYZ 60.307257 369.013062 0 ] (Code/ConfigurationTool/:__span-0-7) [ 1765 0 R /XYZ 60.307257 574.134558 0 ] (Code/ConfigurationTool/:__span-0-70) [ 1767 0 R /XYZ 60.307257 355.612710 0 ] (Code/ConfigurationTool/:__span-0-71) [ 1767 0 R /XYZ 60.307257 342.212358 0 ] (Code/ConfigurationTool/:__span-0-72) [ 1767 0 R /XYZ 60.307257 328.812006 0 ] (Code/ConfigurationTool/:__span-0-73) [ 1767 0 R /XYZ 60.307257 315.411654 0 ] (Code/ConfigurationTool/:__span-0-74) [ 1767 0 R /XYZ 60.307257 302.011302 0 ] (Code/ConfigurationTool/:__span-0-75) [ 1767 0 R /XYZ 60.307257 288.610950 0 ] (Code/ConfigurationTool/:__span-0-76) [ 1767 0 R /XYZ 60.307257 275.210598 0 ] (Code/ConfigurationTool/:__span-0-77) [ 1767 0 R /XYZ 60.307257 261.810246 0 ] (Code/ConfigurationTool/:__span-0-78) [ 1767 0 R /XYZ 60.307257 248.409894 0 ] (Code/ConfigurationTool/:__span-0-79) [ 1767 0 R /XYZ 60.307257 235.009542 0 ] (Code/ConfigurationTool/:__span-0-8) [ 1765 0 R /XYZ 60.307257 560.734206 0 ] (Code/ConfigurationTool/:__span-0-80) [ 1767 0 R /XYZ 60.307257 221.609190 0 ] (Code/ConfigurationTool/:__span-0-81) [ 1767 0 R /XYZ 60.307257 208.208838 0 ] (Code/ConfigurationTool/:__span-0-82) [ 1767 0 R /XYZ 60.307257 194.808486 0 ] (Code/ConfigurationTool/:__span-0-83) [ 1767 0 R /XYZ 60.307257 181.408134 0 ] (Code/ConfigurationTool/:__span-0-84) [ 1767 0 R /XYZ 60.307257 168.007782 0 ] (Code/ConfigurationTool/:__span-0-85) [ 1767 0 R /XYZ 60.307257 154.607430 0 ] (Code/ConfigurationTool/:__span-0-86) [ 1767 0 R /XYZ 60.307257 141.207078 0 ] (Code/ConfigurationTool/:__span-0-87) [ 1767 0 R /XYZ 60.307257 127.806726 0 ] (Code/ConfigurationTool/:__span-0-88) [ 1767 0 R /XYZ 60.307257 101.006022 0 ] (Code/ConfigurationTool/:__span-0-89) [ 1767 0 R /XYZ 60.307257 87.605670 0 ] (Code/ConfigurationTool/:__span-0-9) [ 1765 0 R /XYZ 60.307257 547.333854 0 ] (Code/ConfigurationTool/:__span-0-90) [ 1769 0 R /XYZ 60.307257 771.023622 0 ] (Code/ConfigurationTool/:__span-0-91) [ 1769 0 R /XYZ 60.307257 757.623270 0 ] (Code/ConfigurationTool/:__span-0-92) [ 1769 0 R /XYZ 60.307257 744.222918 0 ] (Code/ConfigurationTool/:__span-0-93) [ 1769 0 R /XYZ 60.307257 730.822566 0 ] (Code/ConfigurationTool/:__span-0-94) [ 1769 0 R /XYZ 60.307257 717.422214 0 ] (Code/ConfigurationTool/:__span-0-95) [ 1769 0 R /XYZ 60.307257 704.021862 0 ] (Code/ConfigurationTool/:__span-0-96) [ 1769 0 R /XYZ 60.307257 690.621510 0 ] (Code/ConfigurationTool/:__span-0-97) [ 1769 0 R /XYZ 60.307257 677.221158 0 ] (Code/ConfigurationTool/:__span-0-98) [ 1769 0 R /XYZ 60.307257 663.820806 0 ] (Code/ConfigurationTool/:__span-0-99) [ 1769 0 R /XYZ 60.307257 650.420454 0 ] (Code/ConfigurationTool/:configurationtoolcs) [ 1765 0 R /XYZ 39.386457 707.865222 0 ] (Code/DataWrapper/:) [ 1873 0 R /XYZ 39.386457 747.563622 0 ] (Code/DataWrapper/:__span-0-1) [ 1873 0 R /XYZ 60.307257 707.635422 0 ] (Code/DataWrapper/:__span-0-10) [ 1873 0 R /XYZ 60.307257 560.231550 0 ] (Code/DataWrapper/:__span-0-100) [ 1877 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-101) [ 1877 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-102) [ 1877 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-103) [ 1877 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-104) [ 1877 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-105) [ 1877 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-106) [ 1877 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-107) [ 1877 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-108) [ 1877 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-109) [ 1877 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-11) [ 1873 0 R /XYZ 60.307257 546.831198 0 ] (Code/DataWrapper/:__span-0-110) [ 1877 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-111) [ 1877 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-112) [ 1877 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-113) [ 1877 0 R /XYZ 60.307257 194.808486 0 ] (Code/DataWrapper/:__span-0-114) [ 1877 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-115) [ 1877 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-116) [ 1877 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-117) [ 1877 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-118) [ 1877 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-119) [ 1877 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-12) [ 1873 0 R /XYZ 60.307257 533.430846 0 ] (Code/DataWrapper/:__span-0-120) [ 1877 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-121) [ 1879 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-122) [ 1879 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-123) [ 1879 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-124) [ 1879 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-125) [ 1879 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-126) [ 1879 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-127) [ 1879 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-128) [ 1879 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-129) [ 1879 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-13) [ 1873 0 R /XYZ 60.307257 520.030494 0 ] (Code/DataWrapper/:__span-0-130) [ 1879 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-131) [ 1879 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-132) [ 1879 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-133) [ 1879 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-134) [ 1879 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-135) [ 1879 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-136) [ 1879 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-137) [ 1879 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-138) [ 1879 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-139) [ 1879 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-14) [ 1873 0 R /XYZ 60.307257 506.630142 0 ] (Code/DataWrapper/:__span-0-140) [ 1879 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-141) [ 1879 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-142) [ 1879 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-143) [ 1879 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-144) [ 1879 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-145) [ 1879 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-146) [ 1879 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-147) [ 1879 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-148) [ 1879 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-149) [ 1879 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-15) [ 1873 0 R /XYZ 60.307257 493.229790 0 ] (Code/DataWrapper/:__span-0-150) [ 1879 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-151) [ 1879 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-152) [ 1879 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-153) [ 1879 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-154) [ 1879 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-155) [ 1879 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-156) [ 1879 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-157) [ 1879 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-158) [ 1879 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-159) [ 1879 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-16) [ 1873 0 R /XYZ 60.307257 479.829438 0 ] (Code/DataWrapper/:__span-0-160) [ 1879 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-161) [ 1879 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-162) [ 1879 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-163) [ 1879 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-164) [ 1879 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-165) [ 1881 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-166) [ 1881 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-167) [ 1881 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-168) [ 1881 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-169) [ 1881 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-17) [ 1873 0 R /XYZ 60.307257 466.429086 0 ] (Code/DataWrapper/:__span-0-170) [ 1881 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-171) [ 1881 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-172) [ 1881 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-173) [ 1881 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-174) [ 1881 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-175) [ 1881 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-176) [ 1881 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-177) [ 1881 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-178) [ 1881 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-179) [ 1881 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-18) [ 1873 0 R /XYZ 60.307257 453.028734 0 ] (Code/DataWrapper/:__span-0-180) [ 1881 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-181) [ 1881 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-182) [ 1881 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-183) [ 1881 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-184) [ 1881 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-185) [ 1881 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-186) [ 1881 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-187) [ 1881 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-188) [ 1881 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-189) [ 1881 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-19) [ 1873 0 R /XYZ 60.307257 439.628382 0 ] (Code/DataWrapper/:__span-0-190) [ 1881 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-191) [ 1881 0 R /XYZ 60.307257 355.612710 0 ] (Code/DataWrapper/:__span-0-192) [ 1881 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-193) [ 1881 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-194) [ 1881 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-195) [ 1881 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-196) [ 1881 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-197) [ 1881 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-198) [ 1881 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-199) [ 1881 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-2) [ 1873 0 R /XYZ 60.307257 694.235070 0 ] (Code/DataWrapper/:__span-0-20) [ 1873 0 R /XYZ 60.307257 426.228030 0 ] (Code/DataWrapper/:__span-0-200) [ 1881 0 R /XYZ 60.307257 221.609190 0 ] (Code/DataWrapper/:__span-0-201) [ 1881 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-202) [ 1881 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-203) [ 1881 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-204) [ 1881 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-205) [ 1881 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-206) [ 1881 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-207) [ 1883 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-208) [ 1883 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-209) [ 1883 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-21) [ 1873 0 R /XYZ 60.307257 412.827678 0 ] (Code/DataWrapper/:__span-0-210) [ 1883 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-211) [ 1883 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-212) [ 1883 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-213) [ 1883 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-214) [ 1883 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-215) [ 1883 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-216) [ 1883 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-217) [ 1883 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-218) [ 1883 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-219) [ 1883 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-22) [ 1873 0 R /XYZ 60.307257 399.427326 0 ] (Code/DataWrapper/:__span-0-220) [ 1883 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-221) [ 1883 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-222) [ 1883 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-223) [ 1883 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-224) [ 1883 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-225) [ 1883 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-226) [ 1883 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-227) [ 1883 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-228) [ 1883 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-229) [ 1883 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-23) [ 1873 0 R /XYZ 60.307257 372.626622 0 ] (Code/DataWrapper/:__span-0-230) [ 1883 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-231) [ 1883 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-232) [ 1883 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-233) [ 1883 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-234) [ 1883 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-235) [ 1883 0 R /XYZ 60.307257 355.612710 0 ] (Code/DataWrapper/:__span-0-236) [ 1883 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-237) [ 1883 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-238) [ 1883 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-239) [ 1883 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-24) [ 1873 0 R /XYZ 60.307257 359.226270 0 ] (Code/DataWrapper/:__span-0-240) [ 1883 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-241) [ 1883 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-242) [ 1883 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-243) [ 1883 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-244) [ 1883 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-245) [ 1883 0 R /XYZ 60.307257 194.808486 0 ] (Code/DataWrapper/:__span-0-246) [ 1883 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-247) [ 1883 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-248) [ 1883 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-249) [ 1883 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-25) [ 1873 0 R /XYZ 60.307257 332.425566 0 ] (Code/DataWrapper/:__span-0-250) [ 1883 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-251) [ 1883 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-252) [ 1883 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-253) [ 1885 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-254) [ 1885 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-255) [ 1885 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-256) [ 1885 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-257) [ 1885 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-258) [ 1885 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-259) [ 1885 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-26) [ 1873 0 R /XYZ 60.307257 319.025214 0 ] (Code/DataWrapper/:__span-0-260) [ 1885 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-261) [ 1885 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-262) [ 1885 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-263) [ 1885 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-264) [ 1885 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-265) [ 1885 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-266) [ 1885 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-267) [ 1885 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-268) [ 1885 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-269) [ 1885 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-27) [ 1873 0 R /XYZ 60.307257 292.224510 0 ] (Code/DataWrapper/:__span-0-270) [ 1885 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-271) [ 1885 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-272) [ 1885 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-273) [ 1885 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-274) [ 1885 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-275) [ 1885 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-276) [ 1885 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-277) [ 1885 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-278) [ 1885 0 R /XYZ 60.307257 355.612710 0 ] (Code/DataWrapper/:__span-0-279) [ 1885 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-28) [ 1873 0 R /XYZ 60.307257 278.824158 0 ] (Code/DataWrapper/:__span-0-280) [ 1885 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-281) [ 1885 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-282) [ 1885 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-283) [ 1885 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-284) [ 1885 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-285) [ 1885 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-286) [ 1885 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-287) [ 1885 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-288) [ 1885 0 R /XYZ 60.307257 221.609190 0 ] (Code/DataWrapper/:__span-0-289) [ 1885 0 R /XYZ 60.307257 194.808486 0 ] (Code/DataWrapper/:__span-0-29) [ 1873 0 R /XYZ 60.307257 265.423806 0 ] (Code/DataWrapper/:__span-0-290) [ 1885 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-291) [ 1885 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-292) [ 1885 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-293) [ 1885 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-294) [ 1885 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-295) [ 1885 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-296) [ 1885 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-297) [ 1887 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-298) [ 1887 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-299) [ 1887 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-3) [ 1873 0 R /XYZ 60.307257 680.834718 0 ] (Code/DataWrapper/:__span-0-30) [ 1873 0 R /XYZ 60.307257 252.023454 0 ] (Code/DataWrapper/:__span-0-300) [ 1887 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-301) [ 1887 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-302) [ 1887 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-303) [ 1887 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-304) [ 1887 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-305) [ 1887 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-306) [ 1887 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-307) [ 1887 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-308) [ 1887 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-309) [ 1887 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-31) [ 1873 0 R /XYZ 60.307257 238.623102 0 ] (Code/DataWrapper/:__span-0-310) [ 1887 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-311) [ 1887 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-312) [ 1887 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-313) [ 1887 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-314) [ 1887 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-315) [ 1887 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-316) [ 1887 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-317) [ 1887 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-318) [ 1887 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-319) [ 1887 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-32) [ 1873 0 R /XYZ 60.307257 185.021694 0 ] (Code/DataWrapper/:__span-0-320) [ 1887 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-321) [ 1887 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-322) [ 1887 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-323) [ 1887 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-324) [ 1887 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-325) [ 1887 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-326) [ 1887 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-327) [ 1887 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-328) [ 1887 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-329) [ 1887 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-33) [ 1873 0 R /XYZ 60.307257 171.621342 0 ] (Code/DataWrapper/:__span-0-330) [ 1887 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-331) [ 1887 0 R /XYZ 60.307257 221.609190 0 ] (Code/DataWrapper/:__span-0-332) [ 1887 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-333) [ 1887 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-334) [ 1887 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-335) [ 1887 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-336) [ 1887 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-337) [ 1887 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-338) [ 1887 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-339) [ 1889 0 R /XYZ 60.307257 771.023622 0 ] (Code/DataWrapper/:__span-0-34) [ 1873 0 R /XYZ 60.307257 158.220990 0 ] (Code/DataWrapper/:__span-0-340) [ 1889 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-341) [ 1889 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-342) [ 1889 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-343) [ 1889 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-344) [ 1889 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-345) [ 1889 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-346) [ 1889 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-347) [ 1889 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-348) [ 1889 0 R /XYZ 60.307257 637.020102 0 ] (Code/DataWrapper/:__span-0-349) [ 1889 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-35) [ 1873 0 R /XYZ 60.307257 144.820638 0 ] (Code/DataWrapper/:__span-0-350) [ 1889 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-351) [ 1889 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-352) [ 1889 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-353) [ 1889 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-354) [ 1889 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-355) [ 1889 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-356) [ 1889 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-357) [ 1889 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-358) [ 1889 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-359) [ 1889 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-36) [ 1873 0 R /XYZ 60.307257 104.619582 0 ] (Code/DataWrapper/:__span-0-360) [ 1889 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-361) [ 1889 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:__span-0-362) [ 1889 0 R /XYZ 60.307257 436.014822 0 ] (Code/DataWrapper/:__span-0-363) [ 1889 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-364) [ 1889 0 R /XYZ 60.307257 409.214118 0 ] (Code/DataWrapper/:__span-0-365) [ 1889 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-366) [ 1889 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-367) [ 1889 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-368) [ 1889 0 R /XYZ 60.307257 355.612710 0 ] (Code/DataWrapper/:__span-0-369) [ 1889 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-37) [ 1873 0 R /XYZ 60.307257 91.219230 0 ] (Code/DataWrapper/:__span-0-370) [ 1889 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-371) [ 1889 0 R /XYZ 60.307257 315.411654 0 ] (Code/DataWrapper/:__span-0-372) [ 1889 0 R /XYZ 60.307257 302.011302 0 ] (Code/DataWrapper/:__span-0-373) [ 1889 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-374) [ 1889 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-375) [ 1889 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-376) [ 1889 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-377) [ 1889 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-378) [ 1889 0 R /XYZ 60.307257 221.609190 0 ] (Code/DataWrapper/:__span-0-379) [ 1889 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-38) [ 1875 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-39) [ 1875 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-4) [ 1873 0 R /XYZ 60.307257 667.434366 0 ] (Code/DataWrapper/:__span-0-40) [ 1875 0 R /XYZ 60.307257 730.822566 0 ] (Code/DataWrapper/:__span-0-41) [ 1875 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-42) [ 1875 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-43) [ 1875 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-44) [ 1875 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-45) [ 1875 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-46) [ 1875 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-47) [ 1875 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-48) [ 1875 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-49) [ 1875 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-5) [ 1873 0 R /XYZ 60.307257 627.233310 0 ] (Code/DataWrapper/:__span-0-50) [ 1875 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-51) [ 1875 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-52) [ 1875 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-53) [ 1875 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-54) [ 1875 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-55) [ 1875 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-56) [ 1875 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-57) [ 1875 0 R /XYZ 60.307257 422.614470 0 ] (Code/DataWrapper/:__span-0-58) [ 1875 0 R /XYZ 60.307257 395.813766 0 ] (Code/DataWrapper/:__span-0-59) [ 1875 0 R /XYZ 60.307257 382.413414 0 ] (Code/DataWrapper/:__span-0-6) [ 1873 0 R /XYZ 60.307257 613.832958 0 ] (Code/DataWrapper/:__span-0-60) [ 1875 0 R /XYZ 60.307257 369.013062 0 ] (Code/DataWrapper/:__span-0-61) [ 1875 0 R /XYZ 60.307257 342.212358 0 ] (Code/DataWrapper/:__span-0-62) [ 1875 0 R /XYZ 60.307257 328.812006 0 ] (Code/DataWrapper/:__span-0-63) [ 1875 0 R /XYZ 60.307257 288.610950 0 ] (Code/DataWrapper/:__span-0-64) [ 1875 0 R /XYZ 60.307257 275.210598 0 ] (Code/DataWrapper/:__span-0-65) [ 1875 0 R /XYZ 60.307257 261.810246 0 ] (Code/DataWrapper/:__span-0-66) [ 1875 0 R /XYZ 60.307257 248.409894 0 ] (Code/DataWrapper/:__span-0-67) [ 1875 0 R /XYZ 60.307257 235.009542 0 ] (Code/DataWrapper/:__span-0-68) [ 1875 0 R /XYZ 60.307257 208.208838 0 ] (Code/DataWrapper/:__span-0-69) [ 1875 0 R /XYZ 60.307257 194.808486 0 ] (Code/DataWrapper/:__span-0-7) [ 1873 0 R /XYZ 60.307257 600.432606 0 ] (Code/DataWrapper/:__span-0-70) [ 1875 0 R /XYZ 60.307257 181.408134 0 ] (Code/DataWrapper/:__span-0-71) [ 1875 0 R /XYZ 60.307257 168.007782 0 ] (Code/DataWrapper/:__span-0-72) [ 1875 0 R /XYZ 60.307257 154.607430 0 ] (Code/DataWrapper/:__span-0-73) [ 1875 0 R /XYZ 60.307257 141.207078 0 ] (Code/DataWrapper/:__span-0-74) [ 1875 0 R /XYZ 60.307257 127.806726 0 ] (Code/DataWrapper/:__span-0-75) [ 1875 0 R /XYZ 60.307257 114.406374 0 ] (Code/DataWrapper/:__span-0-76) [ 1875 0 R /XYZ 60.307257 101.006022 0 ] (Code/DataWrapper/:__span-0-77) [ 1875 0 R /XYZ 60.307257 87.605670 0 ] (Code/DataWrapper/:__span-0-78) [ 1877 0 R /XYZ 60.307257 757.623270 0 ] (Code/DataWrapper/:__span-0-79) [ 1877 0 R /XYZ 60.307257 744.222918 0 ] (Code/DataWrapper/:__span-0-8) [ 1873 0 R /XYZ 60.307257 587.032254 0 ] (Code/DataWrapper/:__span-0-80) [ 1877 0 R /XYZ 60.307257 717.422214 0 ] (Code/DataWrapper/:__span-0-81) [ 1877 0 R /XYZ 60.307257 704.021862 0 ] (Code/DataWrapper/:__span-0-82) [ 1877 0 R /XYZ 60.307257 690.621510 0 ] (Code/DataWrapper/:__span-0-83) [ 1877 0 R /XYZ 60.307257 677.221158 0 ] (Code/DataWrapper/:__span-0-84) [ 1877 0 R /XYZ 60.307257 663.820806 0 ] (Code/DataWrapper/:__span-0-85) [ 1877 0 R /XYZ 60.307257 650.420454 0 ] (Code/DataWrapper/:__span-0-86) [ 1877 0 R /XYZ 60.307257 623.619750 0 ] (Code/DataWrapper/:__span-0-87) [ 1877 0 R /XYZ 60.307257 610.219398 0 ] (Code/DataWrapper/:__span-0-88) [ 1877 0 R /XYZ 60.307257 596.819046 0 ] (Code/DataWrapper/:__span-0-89) [ 1877 0 R /XYZ 60.307257 583.418694 0 ] (Code/DataWrapper/:__span-0-9) [ 1873 0 R /XYZ 60.307257 573.631902 0 ] (Code/DataWrapper/:__span-0-90) [ 1877 0 R /XYZ 60.307257 570.018342 0 ] (Code/DataWrapper/:__span-0-91) [ 1877 0 R /XYZ 60.307257 556.617990 0 ] (Code/DataWrapper/:__span-0-92) [ 1877 0 R /XYZ 60.307257 543.217638 0 ] (Code/DataWrapper/:__span-0-93) [ 1877 0 R /XYZ 60.307257 529.817286 0 ] (Code/DataWrapper/:__span-0-94) [ 1877 0 R /XYZ 60.307257 516.416934 0 ] (Code/DataWrapper/:__span-0-95) [ 1877 0 R /XYZ 60.307257 503.016582 0 ] (Code/DataWrapper/:__span-0-96) [ 1877 0 R /XYZ 60.307257 489.616230 0 ] (Code/DataWrapper/:__span-0-97) [ 1877 0 R /XYZ 60.307257 476.215878 0 ] (Code/DataWrapper/:__span-0-98) [ 1877 0 R /XYZ 60.307257 462.815526 0 ] (Code/DataWrapper/:__span-0-99) [ 1877 0 R /XYZ 60.307257 449.415174 0 ] (Code/DataWrapper/:datawrappercs) [ 1873 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverData/:) [ 1777 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverData/:__span-0-1) [ 1777 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverData/:__span-0-10) [ 1777 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverData/:__span-0-100) [ 1781 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverData/:__span-0-101) [ 1781 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverData/:__span-0-102) [ 1781 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverData/:__span-0-103) [ 1781 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverData/:__span-0-104) [ 1781 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverData/:__span-0-105) [ 1781 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverData/:__span-0-11) [ 1777 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverData/:__span-0-12) [ 1777 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverData/:__span-0-13) [ 1777 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverData/:__span-0-14) [ 1777 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverData/:__span-0-15) [ 1777 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverData/:__span-0-16) [ 1777 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverData/:__span-0-17) [ 1777 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverData/:__span-0-18) [ 1777 0 R /XYZ 60.307257 466.429086 0 ] (Code/DriverData/:__span-0-19) [ 1777 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverData/:__span-0-2) [ 1777 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverData/:__span-0-20) [ 1777 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverData/:__span-0-21) [ 1777 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverData/:__span-0-22) [ 1777 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverData/:__span-0-23) [ 1777 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverData/:__span-0-24) [ 1777 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverData/:__span-0-25) [ 1777 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverData/:__span-0-26) [ 1777 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverData/:__span-0-27) [ 1777 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverData/:__span-0-28) [ 1777 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverData/:__span-0-29) [ 1777 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverData/:__span-0-3) [ 1777 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverData/:__span-0-30) [ 1777 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverData/:__span-0-31) [ 1777 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverData/:__span-0-32) [ 1777 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverData/:__span-0-33) [ 1777 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverData/:__span-0-34) [ 1777 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverData/:__span-0-35) [ 1777 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverData/:__span-0-36) [ 1777 0 R /XYZ 60.307257 211.822398 0 ] (Code/DriverData/:__span-0-37) [ 1777 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverData/:__span-0-38) [ 1777 0 R /XYZ 60.307257 185.021694 0 ] (Code/DriverData/:__span-0-39) [ 1777 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverData/:__span-0-4) [ 1777 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverData/:__span-0-40) [ 1777 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverData/:__span-0-41) [ 1777 0 R /XYZ 60.307257 144.820638 0 ] (Code/DriverData/:__span-0-42) [ 1777 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverData/:__span-0-43) [ 1777 0 R /XYZ 60.307257 118.019934 0 ] (Code/DriverData/:__span-0-44) [ 1777 0 R /XYZ 60.307257 104.619582 0 ] (Code/DriverData/:__span-0-45) [ 1777 0 R /XYZ 60.307257 91.219230 0 ] (Code/DriverData/:__span-0-46) [ 1779 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverData/:__span-0-47) [ 1779 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverData/:__span-0-48) [ 1779 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverData/:__span-0-49) [ 1779 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverData/:__span-0-5) [ 1777 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverData/:__span-0-50) [ 1779 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverData/:__span-0-51) [ 1779 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverData/:__span-0-52) [ 1779 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverData/:__span-0-53) [ 1779 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverData/:__span-0-54) [ 1779 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverData/:__span-0-55) [ 1779 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverData/:__span-0-56) [ 1779 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverData/:__span-0-57) [ 1779 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverData/:__span-0-58) [ 1779 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverData/:__span-0-59) [ 1779 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverData/:__span-0-6) [ 1777 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverData/:__span-0-60) [ 1779 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverData/:__span-0-61) [ 1779 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverData/:__span-0-62) [ 1779 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverData/:__span-0-63) [ 1779 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverData/:__span-0-64) [ 1779 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverData/:__span-0-65) [ 1779 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverData/:__span-0-66) [ 1779 0 R /XYZ 60.307257 489.616230 0 ] (Code/DriverData/:__span-0-67) [ 1779 0 R /XYZ 60.307257 476.215878 0 ] (Code/DriverData/:__span-0-68) [ 1779 0 R /XYZ 60.307257 449.415174 0 ] (Code/DriverData/:__span-0-69) [ 1779 0 R /XYZ 60.307257 436.014822 0 ] (Code/DriverData/:__span-0-7) [ 1777 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverData/:__span-0-70) [ 1779 0 R /XYZ 60.307257 422.614470 0 ] (Code/DriverData/:__span-0-71) [ 1779 0 R /XYZ 60.307257 409.214118 0 ] (Code/DriverData/:__span-0-72) [ 1779 0 R /XYZ 60.307257 382.413414 0 ] (Code/DriverData/:__span-0-73) [ 1779 0 R /XYZ 60.307257 369.013062 0 ] (Code/DriverData/:__span-0-74) [ 1779 0 R /XYZ 60.307257 355.612710 0 ] (Code/DriverData/:__span-0-75) [ 1779 0 R /XYZ 60.307257 342.212358 0 ] (Code/DriverData/:__span-0-76) [ 1779 0 R /XYZ 60.307257 315.411654 0 ] (Code/DriverData/:__span-0-77) [ 1779 0 R /XYZ 60.307257 302.011302 0 ] (Code/DriverData/:__span-0-78) [ 1779 0 R /XYZ 60.307257 275.210598 0 ] (Code/DriverData/:__span-0-79) [ 1779 0 R /XYZ 60.307257 261.810246 0 ] (Code/DriverData/:__span-0-8) [ 1777 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverData/:__span-0-80) [ 1779 0 R /XYZ 60.307257 235.009542 0 ] (Code/DriverData/:__span-0-81) [ 1779 0 R /XYZ 60.307257 221.609190 0 ] (Code/DriverData/:__span-0-82) [ 1779 0 R /XYZ 60.307257 208.208838 0 ] (Code/DriverData/:__span-0-83) [ 1779 0 R /XYZ 60.307257 194.808486 0 ] (Code/DriverData/:__span-0-84) [ 1779 0 R /XYZ 60.307257 181.408134 0 ] (Code/DriverData/:__span-0-85) [ 1779 0 R /XYZ 60.307257 168.007782 0 ] (Code/DriverData/:__span-0-86) [ 1779 0 R /XYZ 60.307257 154.607430 0 ] (Code/DriverData/:__span-0-87) [ 1779 0 R /XYZ 60.307257 141.207078 0 ] (Code/DriverData/:__span-0-88) [ 1779 0 R /XYZ 60.307257 127.806726 0 ] (Code/DriverData/:__span-0-89) [ 1779 0 R /XYZ 60.307257 114.406374 0 ] (Code/DriverData/:__span-0-9) [ 1777 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverData/:__span-0-90) [ 1779 0 R /XYZ 60.307257 101.006022 0 ] (Code/DriverData/:__span-0-91) [ 1779 0 R /XYZ 60.307257 87.605670 0 ] (Code/DriverData/:__span-0-92) [ 1781 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverData/:__span-0-93) [ 1781 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverData/:__span-0-94) [ 1781 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverData/:__span-0-95) [ 1781 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverData/:__span-0-96) [ 1781 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverData/:__span-0-97) [ 1781 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverData/:__span-0-98) [ 1781 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverData/:__span-0-99) [ 1781 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverData/:driverdatacs) [ 1777 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverDrsWindow/:) [ 1891 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverDrsWindow/:__span-0-1) [ 1891 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverDrsWindow/:__span-0-10) [ 1891 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverDrsWindow/:__span-0-100) [ 1895 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverDrsWindow/:__span-0-101) [ 1895 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverDrsWindow/:__span-0-102) [ 1895 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverDrsWindow/:__span-0-103) [ 1895 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverDrsWindow/:__span-0-104) [ 1895 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverDrsWindow/:__span-0-105) [ 1895 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverDrsWindow/:__span-0-106) [ 1895 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverDrsWindow/:__span-0-107) [ 1895 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverDrsWindow/:__span-0-108) [ 1895 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverDrsWindow/:__span-0-109) [ 1895 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverDrsWindow/:__span-0-11) [ 1891 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverDrsWindow/:__span-0-110) [ 1895 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverDrsWindow/:__span-0-111) [ 1895 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverDrsWindow/:__span-0-112) [ 1895 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverDrsWindow/:__span-0-113) [ 1895 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverDrsWindow/:__span-0-114) [ 1895 0 R /XYZ 60.307257 503.016582 0 ] (Code/DriverDrsWindow/:__span-0-12) [ 1891 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverDrsWindow/:__span-0-13) [ 1891 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverDrsWindow/:__span-0-14) [ 1891 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverDrsWindow/:__span-0-15) [ 1891 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverDrsWindow/:__span-0-16) [ 1891 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverDrsWindow/:__span-0-17) [ 1891 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverDrsWindow/:__span-0-18) [ 1891 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverDrsWindow/:__span-0-19) [ 1891 0 R /XYZ 60.307257 466.429086 0 ] (Code/DriverDrsWindow/:__span-0-2) [ 1891 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverDrsWindow/:__span-0-20) [ 1891 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverDrsWindow/:__span-0-21) [ 1891 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverDrsWindow/:__span-0-22) [ 1891 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverDrsWindow/:__span-0-23) [ 1891 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverDrsWindow/:__span-0-24) [ 1891 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverDrsWindow/:__span-0-25) [ 1891 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverDrsWindow/:__span-0-26) [ 1891 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverDrsWindow/:__span-0-27) [ 1891 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverDrsWindow/:__span-0-28) [ 1891 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverDrsWindow/:__span-0-29) [ 1891 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverDrsWindow/:__span-0-3) [ 1891 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverDrsWindow/:__span-0-30) [ 1891 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverDrsWindow/:__span-0-31) [ 1891 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverDrsWindow/:__span-0-32) [ 1891 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverDrsWindow/:__span-0-33) [ 1891 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverDrsWindow/:__span-0-34) [ 1891 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverDrsWindow/:__span-0-35) [ 1891 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverDrsWindow/:__span-0-36) [ 1891 0 R /XYZ 60.307257 211.822398 0 ] (Code/DriverDrsWindow/:__span-0-37) [ 1891 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverDrsWindow/:__span-0-38) [ 1891 0 R /XYZ 60.307257 185.021694 0 ] (Code/DriverDrsWindow/:__span-0-39) [ 1891 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverDrsWindow/:__span-0-4) [ 1891 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverDrsWindow/:__span-0-40) [ 1891 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverDrsWindow/:__span-0-41) [ 1891 0 R /XYZ 60.307257 144.820638 0 ] (Code/DriverDrsWindow/:__span-0-42) [ 1891 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverDrsWindow/:__span-0-43) [ 1891 0 R /XYZ 60.307257 118.019934 0 ] (Code/DriverDrsWindow/:__span-0-44) [ 1891 0 R /XYZ 60.307257 104.619582 0 ] (Code/DriverDrsWindow/:__span-0-45) [ 1891 0 R /XYZ 60.307257 91.219230 0 ] (Code/DriverDrsWindow/:__span-0-46) [ 1893 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverDrsWindow/:__span-0-47) [ 1893 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverDrsWindow/:__span-0-48) [ 1893 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverDrsWindow/:__span-0-49) [ 1893 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverDrsWindow/:__span-0-5) [ 1891 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverDrsWindow/:__span-0-50) [ 1893 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverDrsWindow/:__span-0-51) [ 1893 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverDrsWindow/:__span-0-52) [ 1893 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverDrsWindow/:__span-0-53) [ 1893 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverDrsWindow/:__span-0-54) [ 1893 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverDrsWindow/:__span-0-55) [ 1893 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverDrsWindow/:__span-0-56) [ 1893 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverDrsWindow/:__span-0-57) [ 1893 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverDrsWindow/:__span-0-58) [ 1893 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverDrsWindow/:__span-0-59) [ 1893 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverDrsWindow/:__span-0-6) [ 1891 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverDrsWindow/:__span-0-60) [ 1893 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverDrsWindow/:__span-0-61) [ 1893 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverDrsWindow/:__span-0-62) [ 1893 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverDrsWindow/:__span-0-63) [ 1893 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverDrsWindow/:__span-0-64) [ 1893 0 R /XYZ 60.307257 503.016582 0 ] (Code/DriverDrsWindow/:__span-0-65) [ 1893 0 R /XYZ 60.307257 489.616230 0 ] (Code/DriverDrsWindow/:__span-0-66) [ 1893 0 R /XYZ 60.307257 476.215878 0 ] (Code/DriverDrsWindow/:__span-0-67) [ 1893 0 R /XYZ 60.307257 462.815526 0 ] (Code/DriverDrsWindow/:__span-0-68) [ 1893 0 R /XYZ 60.307257 449.415174 0 ] (Code/DriverDrsWindow/:__span-0-69) [ 1893 0 R /XYZ 60.307257 436.014822 0 ] (Code/DriverDrsWindow/:__span-0-7) [ 1891 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverDrsWindow/:__span-0-70) [ 1893 0 R /XYZ 60.307257 422.614470 0 ] (Code/DriverDrsWindow/:__span-0-71) [ 1893 0 R /XYZ 60.307257 409.214118 0 ] (Code/DriverDrsWindow/:__span-0-72) [ 1893 0 R /XYZ 60.307257 395.813766 0 ] (Code/DriverDrsWindow/:__span-0-73) [ 1893 0 R /XYZ 60.307257 382.413414 0 ] (Code/DriverDrsWindow/:__span-0-74) [ 1893 0 R /XYZ 60.307257 369.013062 0 ] (Code/DriverDrsWindow/:__span-0-75) [ 1893 0 R /XYZ 60.307257 355.612710 0 ] (Code/DriverDrsWindow/:__span-0-76) [ 1893 0 R /XYZ 60.307257 342.212358 0 ] (Code/DriverDrsWindow/:__span-0-77) [ 1893 0 R /XYZ 60.307257 328.812006 0 ] (Code/DriverDrsWindow/:__span-0-78) [ 1893 0 R /XYZ 60.307257 315.411654 0 ] (Code/DriverDrsWindow/:__span-0-79) [ 1893 0 R /XYZ 60.307257 302.011302 0 ] (Code/DriverDrsWindow/:__span-0-8) [ 1891 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverDrsWindow/:__span-0-80) [ 1893 0 R /XYZ 60.307257 288.610950 0 ] (Code/DriverDrsWindow/:__span-0-81) [ 1893 0 R /XYZ 60.307257 275.210598 0 ] (Code/DriverDrsWindow/:__span-0-82) [ 1893 0 R /XYZ 60.307257 261.810246 0 ] (Code/DriverDrsWindow/:__span-0-83) [ 1893 0 R /XYZ 60.307257 248.409894 0 ] (Code/DriverDrsWindow/:__span-0-84) [ 1893 0 R /XYZ 60.307257 235.009542 0 ] (Code/DriverDrsWindow/:__span-0-85) [ 1893 0 R /XYZ 60.307257 221.609190 0 ] (Code/DriverDrsWindow/:__span-0-86) [ 1893 0 R /XYZ 60.307257 208.208838 0 ] (Code/DriverDrsWindow/:__span-0-87) [ 1893 0 R /XYZ 60.307257 194.808486 0 ] (Code/DriverDrsWindow/:__span-0-88) [ 1893 0 R /XYZ 60.307257 181.408134 0 ] (Code/DriverDrsWindow/:__span-0-89) [ 1893 0 R /XYZ 60.307257 168.007782 0 ] (Code/DriverDrsWindow/:__span-0-9) [ 1891 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverDrsWindow/:__span-0-90) [ 1893 0 R /XYZ 60.307257 154.607430 0 ] (Code/DriverDrsWindow/:__span-0-91) [ 1893 0 R /XYZ 60.307257 141.207078 0 ] (Code/DriverDrsWindow/:__span-0-92) [ 1893 0 R /XYZ 60.307257 127.806726 0 ] (Code/DriverDrsWindow/:__span-0-93) [ 1893 0 R /XYZ 60.307257 114.406374 0 ] (Code/DriverDrsWindow/:__span-0-94) [ 1893 0 R /XYZ 60.307257 101.006022 0 ] (Code/DriverDrsWindow/:__span-0-95) [ 1893 0 R /XYZ 60.307257 87.605670 0 ] (Code/DriverDrsWindow/:__span-0-96) [ 1895 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverDrsWindow/:__span-0-97) [ 1895 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverDrsWindow/:__span-0-98) [ 1895 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverDrsWindow/:__span-0-99) [ 1895 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverDrsWindow/:driverdrswindowcs) [ 1891 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverGapToLeaderWindow/:) [ 1783 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverGapToLeaderWindow/:__span-0-1) [ 1783 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverGapToLeaderWindow/:__span-0-10) [ 1783 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverGapToLeaderWindow/:__span-0-11) [ 1783 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverGapToLeaderWindow/:__span-0-12) [ 1783 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverGapToLeaderWindow/:__span-0-13) [ 1783 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverGapToLeaderWindow/:__span-0-14) [ 1783 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverGapToLeaderWindow/:__span-0-15) [ 1783 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverGapToLeaderWindow/:__span-0-16) [ 1783 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverGapToLeaderWindow/:__span-0-17) [ 1783 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverGapToLeaderWindow/:__span-0-18) [ 1783 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverGapToLeaderWindow/:__span-0-19) [ 1783 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverGapToLeaderWindow/:__span-0-2) [ 1783 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverGapToLeaderWindow/:__span-0-20) [ 1783 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverGapToLeaderWindow/:__span-0-21) [ 1783 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverGapToLeaderWindow/:__span-0-22) [ 1783 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverGapToLeaderWindow/:__span-0-23) [ 1783 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverGapToLeaderWindow/:__span-0-24) [ 1783 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverGapToLeaderWindow/:__span-0-25) [ 1783 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverGapToLeaderWindow/:__span-0-26) [ 1783 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverGapToLeaderWindow/:__span-0-27) [ 1783 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverGapToLeaderWindow/:__span-0-28) [ 1783 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverGapToLeaderWindow/:__span-0-29) [ 1783 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverGapToLeaderWindow/:__span-0-3) [ 1783 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverGapToLeaderWindow/:__span-0-30) [ 1783 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverGapToLeaderWindow/:__span-0-31) [ 1783 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverGapToLeaderWindow/:__span-0-32) [ 1783 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverGapToLeaderWindow/:__span-0-4) [ 1783 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverGapToLeaderWindow/:__span-0-5) [ 1783 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverGapToLeaderWindow/:__span-0-6) [ 1783 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverGapToLeaderWindow/:__span-0-7) [ 1783 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverGapToLeaderWindow/:__span-0-8) [ 1783 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverGapToLeaderWindow/:__span-0-9) [ 1783 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverGapToLeaderWindow/:drivergaptoleaderwindowcs) [ 1783 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverLapTimeWindow/:) [ 1897 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverLapTimeWindow/:__span-0-1) [ 1897 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverLapTimeWindow/:__span-0-10) [ 1897 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverLapTimeWindow/:__span-0-11) [ 1897 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverLapTimeWindow/:__span-0-12) [ 1897 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverLapTimeWindow/:__span-0-13) [ 1897 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverLapTimeWindow/:__span-0-14) [ 1897 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverLapTimeWindow/:__span-0-15) [ 1897 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverLapTimeWindow/:__span-0-16) [ 1897 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverLapTimeWindow/:__span-0-17) [ 1897 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverLapTimeWindow/:__span-0-18) [ 1897 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverLapTimeWindow/:__span-0-19) [ 1897 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverLapTimeWindow/:__span-0-2) [ 1897 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverLapTimeWindow/:__span-0-20) [ 1897 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverLapTimeWindow/:__span-0-21) [ 1897 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverLapTimeWindow/:__span-0-22) [ 1897 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverLapTimeWindow/:__span-0-23) [ 1897 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverLapTimeWindow/:__span-0-24) [ 1897 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverLapTimeWindow/:__span-0-25) [ 1897 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverLapTimeWindow/:__span-0-26) [ 1897 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverLapTimeWindow/:__span-0-27) [ 1897 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverLapTimeWindow/:__span-0-28) [ 1897 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverLapTimeWindow/:__span-0-29) [ 1897 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverLapTimeWindow/:__span-0-3) [ 1897 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverLapTimeWindow/:__span-0-30) [ 1897 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverLapTimeWindow/:__span-0-31) [ 1897 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverLapTimeWindow/:__span-0-32) [ 1897 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverLapTimeWindow/:__span-0-4) [ 1897 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverLapTimeWindow/:__span-0-5) [ 1897 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverLapTimeWindow/:__span-0-6) [ 1897 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverLapTimeWindow/:__span-0-7) [ 1897 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverLapTimeWindow/:__span-0-8) [ 1897 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverLapTimeWindow/:__span-0-9) [ 1897 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverLapTimeWindow/:driverlaptimewindowcs) [ 1897 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverNameWindow/:) [ 1785 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverNameWindow/:__span-0-1) [ 1785 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverNameWindow/:__span-0-10) [ 1785 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverNameWindow/:__span-0-11) [ 1785 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverNameWindow/:__span-0-12) [ 1785 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverNameWindow/:__span-0-13) [ 1785 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverNameWindow/:__span-0-14) [ 1785 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverNameWindow/:__span-0-15) [ 1785 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverNameWindow/:__span-0-16) [ 1785 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverNameWindow/:__span-0-17) [ 1785 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverNameWindow/:__span-0-18) [ 1785 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverNameWindow/:__span-0-19) [ 1785 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverNameWindow/:__span-0-2) [ 1785 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverNameWindow/:__span-0-20) [ 1785 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverNameWindow/:__span-0-21) [ 1785 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverNameWindow/:__span-0-22) [ 1785 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverNameWindow/:__span-0-23) [ 1785 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverNameWindow/:__span-0-24) [ 1785 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverNameWindow/:__span-0-25) [ 1785 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverNameWindow/:__span-0-26) [ 1785 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverNameWindow/:__span-0-27) [ 1785 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverNameWindow/:__span-0-28) [ 1785 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverNameWindow/:__span-0-29) [ 1785 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverNameWindow/:__span-0-3) [ 1785 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverNameWindow/:__span-0-30) [ 1785 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverNameWindow/:__span-0-31) [ 1785 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverNameWindow/:__span-0-32) [ 1785 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverNameWindow/:__span-0-33) [ 1785 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverNameWindow/:__span-0-34) [ 1785 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverNameWindow/:__span-0-35) [ 1785 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverNameWindow/:__span-0-36) [ 1785 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverNameWindow/:__span-0-37) [ 1785 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverNameWindow/:__span-0-38) [ 1785 0 R /XYZ 60.307257 144.820638 0 ] (Code/DriverNameWindow/:__span-0-39) [ 1785 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverNameWindow/:__span-0-4) [ 1785 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverNameWindow/:__span-0-40) [ 1785 0 R /XYZ 60.307257 118.019934 0 ] (Code/DriverNameWindow/:__span-0-41) [ 1785 0 R /XYZ 60.307257 104.619582 0 ] (Code/DriverNameWindow/:__span-0-42) [ 1785 0 R /XYZ 60.307257 91.219230 0 ] (Code/DriverNameWindow/:__span-0-43) [ 1787 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverNameWindow/:__span-0-44) [ 1787 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverNameWindow/:__span-0-45) [ 1787 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverNameWindow/:__span-0-46) [ 1787 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverNameWindow/:__span-0-47) [ 1787 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverNameWindow/:__span-0-48) [ 1787 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverNameWindow/:__span-0-49) [ 1787 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverNameWindow/:__span-0-5) [ 1785 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverNameWindow/:__span-0-50) [ 1787 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverNameWindow/:__span-0-51) [ 1787 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverNameWindow/:__span-0-52) [ 1787 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverNameWindow/:__span-0-53) [ 1787 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverNameWindow/:__span-0-54) [ 1787 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverNameWindow/:__span-0-55) [ 1787 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverNameWindow/:__span-0-56) [ 1787 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverNameWindow/:__span-0-57) [ 1787 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverNameWindow/:__span-0-6) [ 1785 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverNameWindow/:__span-0-7) [ 1785 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverNameWindow/:__span-0-8) [ 1785 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverNameWindow/:__span-0-9) [ 1785 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverNameWindow/:drivernamewindowcs) [ 1785 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverPositionWindow/:) [ 1899 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverPositionWindow/:__span-0-1) [ 1899 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverPositionWindow/:__span-0-10) [ 1899 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverPositionWindow/:__span-0-11) [ 1899 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverPositionWindow/:__span-0-12) [ 1899 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverPositionWindow/:__span-0-13) [ 1899 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverPositionWindow/:__span-0-14) [ 1899 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverPositionWindow/:__span-0-15) [ 1899 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverPositionWindow/:__span-0-16) [ 1899 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverPositionWindow/:__span-0-17) [ 1899 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverPositionWindow/:__span-0-18) [ 1899 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverPositionWindow/:__span-0-19) [ 1899 0 R /XYZ 60.307257 453.028734 0 ] (Code/DriverPositionWindow/:__span-0-2) [ 1899 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverPositionWindow/:__span-0-20) [ 1899 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverPositionWindow/:__span-0-21) [ 1899 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverPositionWindow/:__span-0-22) [ 1899 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverPositionWindow/:__span-0-23) [ 1899 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverPositionWindow/:__span-0-24) [ 1899 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverPositionWindow/:__span-0-25) [ 1899 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverPositionWindow/:__span-0-26) [ 1899 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverPositionWindow/:__span-0-27) [ 1899 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverPositionWindow/:__span-0-28) [ 1899 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverPositionWindow/:__span-0-29) [ 1899 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverPositionWindow/:__span-0-3) [ 1899 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverPositionWindow/:__span-0-30) [ 1899 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverPositionWindow/:__span-0-31) [ 1899 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverPositionWindow/:__span-0-32) [ 1899 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverPositionWindow/:__span-0-33) [ 1899 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverPositionWindow/:__span-0-34) [ 1899 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverPositionWindow/:__span-0-35) [ 1899 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverPositionWindow/:__span-0-36) [ 1899 0 R /XYZ 60.307257 211.822398 0 ] (Code/DriverPositionWindow/:__span-0-37) [ 1899 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverPositionWindow/:__span-0-38) [ 1899 0 R /XYZ 60.307257 185.021694 0 ] (Code/DriverPositionWindow/:__span-0-39) [ 1899 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverPositionWindow/:__span-0-4) [ 1899 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverPositionWindow/:__span-0-40) [ 1899 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverPositionWindow/:__span-0-41) [ 1899 0 R /XYZ 60.307257 144.820638 0 ] (Code/DriverPositionWindow/:__span-0-42) [ 1899 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverPositionWindow/:__span-0-5) [ 1899 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverPositionWindow/:__span-0-6) [ 1899 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverPositionWindow/:__span-0-7) [ 1899 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverPositionWindow/:__span-0-8) [ 1899 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverPositionWindow/:__span-0-9) [ 1899 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverPositionWindow/:driverpositionwindowcs) [ 1899 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverSectorWindow/:) [ 1789 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverSectorWindow/:__span-0-1) [ 1789 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverSectorWindow/:__span-0-10) [ 1789 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverSectorWindow/:__span-0-11) [ 1789 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverSectorWindow/:__span-0-12) [ 1789 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverSectorWindow/:__span-0-13) [ 1789 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverSectorWindow/:__span-0-14) [ 1789 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverSectorWindow/:__span-0-15) [ 1789 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverSectorWindow/:__span-0-16) [ 1789 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverSectorWindow/:__span-0-17) [ 1789 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverSectorWindow/:__span-0-18) [ 1789 0 R /XYZ 60.307257 466.429086 0 ] (Code/DriverSectorWindow/:__span-0-19) [ 1789 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverSectorWindow/:__span-0-2) [ 1789 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverSectorWindow/:__span-0-20) [ 1789 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverSectorWindow/:__span-0-21) [ 1789 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverSectorWindow/:__span-0-22) [ 1789 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverSectorWindow/:__span-0-23) [ 1789 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverSectorWindow/:__span-0-24) [ 1789 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverSectorWindow/:__span-0-25) [ 1789 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverSectorWindow/:__span-0-26) [ 1789 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverSectorWindow/:__span-0-27) [ 1789 0 R /XYZ 60.307257 332.425566 0 ] (Code/DriverSectorWindow/:__span-0-28) [ 1789 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverSectorWindow/:__span-0-29) [ 1789 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverSectorWindow/:__span-0-3) [ 1789 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverSectorWindow/:__span-0-30) [ 1789 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverSectorWindow/:__span-0-31) [ 1789 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverSectorWindow/:__span-0-32) [ 1789 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverSectorWindow/:__span-0-4) [ 1789 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverSectorWindow/:__span-0-5) [ 1789 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverSectorWindow/:__span-0-6) [ 1789 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverSectorWindow/:__span-0-7) [ 1789 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverSectorWindow/:__span-0-8) [ 1789 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverSectorWindow/:__span-0-9) [ 1789 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverSectorWindow/:driversectorwindowcs) [ 1789 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverTyresWindow/:) [ 1901 0 R /XYZ 39.386457 747.563622 0 ] (Code/DriverTyresWindow/:__span-0-1) [ 1901 0 R /XYZ 60.307257 707.635422 0 ] (Code/DriverTyresWindow/:__span-0-10) [ 1901 0 R /XYZ 60.307257 587.032254 0 ] (Code/DriverTyresWindow/:__span-0-100) [ 1905 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverTyresWindow/:__span-0-101) [ 1905 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverTyresWindow/:__span-0-102) [ 1905 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverTyresWindow/:__span-0-103) [ 1905 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverTyresWindow/:__span-0-104) [ 1905 0 R /XYZ 60.307257 503.016582 0 ] (Code/DriverTyresWindow/:__span-0-105) [ 1905 0 R /XYZ 60.307257 489.616230 0 ] (Code/DriverTyresWindow/:__span-0-106) [ 1905 0 R /XYZ 60.307257 476.215878 0 ] (Code/DriverTyresWindow/:__span-0-107) [ 1905 0 R /XYZ 60.307257 462.815526 0 ] (Code/DriverTyresWindow/:__span-0-108) [ 1905 0 R /XYZ 60.307257 449.415174 0 ] (Code/DriverTyresWindow/:__span-0-109) [ 1905 0 R /XYZ 60.307257 422.614470 0 ] (Code/DriverTyresWindow/:__span-0-11) [ 1901 0 R /XYZ 60.307257 573.631902 0 ] (Code/DriverTyresWindow/:__span-0-110) [ 1905 0 R /XYZ 60.307257 395.813766 0 ] (Code/DriverTyresWindow/:__span-0-111) [ 1905 0 R /XYZ 60.307257 382.413414 0 ] (Code/DriverTyresWindow/:__span-0-112) [ 1905 0 R /XYZ 60.307257 369.013062 0 ] (Code/DriverTyresWindow/:__span-0-113) [ 1905 0 R /XYZ 60.307257 355.612710 0 ] (Code/DriverTyresWindow/:__span-0-114) [ 1905 0 R /XYZ 60.307257 342.212358 0 ] (Code/DriverTyresWindow/:__span-0-115) [ 1905 0 R /XYZ 60.307257 328.812006 0 ] (Code/DriverTyresWindow/:__span-0-116) [ 1905 0 R /XYZ 60.307257 315.411654 0 ] (Code/DriverTyresWindow/:__span-0-117) [ 1905 0 R /XYZ 60.307257 302.011302 0 ] (Code/DriverTyresWindow/:__span-0-118) [ 1905 0 R /XYZ 60.307257 288.610950 0 ] (Code/DriverTyresWindow/:__span-0-119) [ 1905 0 R /XYZ 60.307257 275.210598 0 ] (Code/DriverTyresWindow/:__span-0-12) [ 1901 0 R /XYZ 60.307257 560.231550 0 ] (Code/DriverTyresWindow/:__span-0-120) [ 1905 0 R /XYZ 60.307257 261.810246 0 ] (Code/DriverTyresWindow/:__span-0-121) [ 1905 0 R /XYZ 60.307257 248.409894 0 ] (Code/DriverTyresWindow/:__span-0-122) [ 1905 0 R /XYZ 60.307257 221.609190 0 ] (Code/DriverTyresWindow/:__span-0-123) [ 1905 0 R /XYZ 60.307257 208.208838 0 ] (Code/DriverTyresWindow/:__span-0-124) [ 1905 0 R /XYZ 60.307257 194.808486 0 ] (Code/DriverTyresWindow/:__span-0-125) [ 1905 0 R /XYZ 60.307257 181.408134 0 ] (Code/DriverTyresWindow/:__span-0-126) [ 1905 0 R /XYZ 60.307257 168.007782 0 ] (Code/DriverTyresWindow/:__span-0-127) [ 1905 0 R /XYZ 60.307257 154.607430 0 ] (Code/DriverTyresWindow/:__span-0-128) [ 1905 0 R /XYZ 60.307257 141.207078 0 ] (Code/DriverTyresWindow/:__span-0-129) [ 1905 0 R /XYZ 60.307257 127.806726 0 ] (Code/DriverTyresWindow/:__span-0-13) [ 1901 0 R /XYZ 60.307257 546.831198 0 ] (Code/DriverTyresWindow/:__span-0-130) [ 1905 0 R /XYZ 60.307257 114.406374 0 ] (Code/DriverTyresWindow/:__span-0-131) [ 1905 0 R /XYZ 60.307257 101.006022 0 ] (Code/DriverTyresWindow/:__span-0-132) [ 1905 0 R /XYZ 60.307257 87.605670 0 ] (Code/DriverTyresWindow/:__span-0-133) [ 1907 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverTyresWindow/:__span-0-134) [ 1907 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverTyresWindow/:__span-0-135) [ 1907 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverTyresWindow/:__span-0-136) [ 1907 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverTyresWindow/:__span-0-137) [ 1907 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverTyresWindow/:__span-0-138) [ 1907 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverTyresWindow/:__span-0-139) [ 1907 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverTyresWindow/:__span-0-14) [ 1901 0 R /XYZ 60.307257 533.430846 0 ] (Code/DriverTyresWindow/:__span-0-140) [ 1907 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverTyresWindow/:__span-0-141) [ 1907 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverTyresWindow/:__span-0-142) [ 1907 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverTyresWindow/:__span-0-143) [ 1907 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverTyresWindow/:__span-0-144) [ 1907 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverTyresWindow/:__span-0-145) [ 1907 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverTyresWindow/:__span-0-146) [ 1907 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverTyresWindow/:__span-0-15) [ 1901 0 R /XYZ 60.307257 520.030494 0 ] (Code/DriverTyresWindow/:__span-0-16) [ 1901 0 R /XYZ 60.307257 506.630142 0 ] (Code/DriverTyresWindow/:__span-0-17) [ 1901 0 R /XYZ 60.307257 493.229790 0 ] (Code/DriverTyresWindow/:__span-0-18) [ 1901 0 R /XYZ 60.307257 479.829438 0 ] (Code/DriverTyresWindow/:__span-0-19) [ 1901 0 R /XYZ 60.307257 466.429086 0 ] (Code/DriverTyresWindow/:__span-0-2) [ 1901 0 R /XYZ 60.307257 694.235070 0 ] (Code/DriverTyresWindow/:__span-0-20) [ 1901 0 R /XYZ 60.307257 439.628382 0 ] (Code/DriverTyresWindow/:__span-0-21) [ 1901 0 R /XYZ 60.307257 426.228030 0 ] (Code/DriverTyresWindow/:__span-0-22) [ 1901 0 R /XYZ 60.307257 412.827678 0 ] (Code/DriverTyresWindow/:__span-0-23) [ 1901 0 R /XYZ 60.307257 399.427326 0 ] (Code/DriverTyresWindow/:__span-0-24) [ 1901 0 R /XYZ 60.307257 386.026974 0 ] (Code/DriverTyresWindow/:__span-0-25) [ 1901 0 R /XYZ 60.307257 372.626622 0 ] (Code/DriverTyresWindow/:__span-0-26) [ 1901 0 R /XYZ 60.307257 359.226270 0 ] (Code/DriverTyresWindow/:__span-0-27) [ 1901 0 R /XYZ 60.307257 345.825918 0 ] (Code/DriverTyresWindow/:__span-0-28) [ 1901 0 R /XYZ 60.307257 319.025214 0 ] (Code/DriverTyresWindow/:__span-0-29) [ 1901 0 R /XYZ 60.307257 305.624862 0 ] (Code/DriverTyresWindow/:__span-0-3) [ 1901 0 R /XYZ 60.307257 680.834718 0 ] (Code/DriverTyresWindow/:__span-0-30) [ 1901 0 R /XYZ 60.307257 292.224510 0 ] (Code/DriverTyresWindow/:__span-0-31) [ 1901 0 R /XYZ 60.307257 278.824158 0 ] (Code/DriverTyresWindow/:__span-0-32) [ 1901 0 R /XYZ 60.307257 265.423806 0 ] (Code/DriverTyresWindow/:__span-0-33) [ 1901 0 R /XYZ 60.307257 252.023454 0 ] (Code/DriverTyresWindow/:__span-0-34) [ 1901 0 R /XYZ 60.307257 238.623102 0 ] (Code/DriverTyresWindow/:__span-0-35) [ 1901 0 R /XYZ 60.307257 225.222750 0 ] (Code/DriverTyresWindow/:__span-0-36) [ 1901 0 R /XYZ 60.307257 211.822398 0 ] (Code/DriverTyresWindow/:__span-0-37) [ 1901 0 R /XYZ 60.307257 198.422046 0 ] (Code/DriverTyresWindow/:__span-0-38) [ 1901 0 R /XYZ 60.307257 185.021694 0 ] (Code/DriverTyresWindow/:__span-0-39) [ 1901 0 R /XYZ 60.307257 171.621342 0 ] (Code/DriverTyresWindow/:__span-0-4) [ 1901 0 R /XYZ 60.307257 667.434366 0 ] (Code/DriverTyresWindow/:__span-0-40) [ 1901 0 R /XYZ 60.307257 158.220990 0 ] (Code/DriverTyresWindow/:__span-0-41) [ 1901 0 R /XYZ 60.307257 131.420286 0 ] (Code/DriverTyresWindow/:__span-0-42) [ 1901 0 R /XYZ 60.307257 118.019934 0 ] (Code/DriverTyresWindow/:__span-0-43) [ 1901 0 R /XYZ 60.307257 104.619582 0 ] (Code/DriverTyresWindow/:__span-0-44) [ 1901 0 R /XYZ 60.307257 91.219230 0 ] (Code/DriverTyresWindow/:__span-0-45) [ 1903 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverTyresWindow/:__span-0-46) [ 1903 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverTyresWindow/:__span-0-47) [ 1903 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverTyresWindow/:__span-0-48) [ 1903 0 R /XYZ 60.307257 730.822566 0 ] (Code/DriverTyresWindow/:__span-0-49) [ 1903 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverTyresWindow/:__span-0-5) [ 1901 0 R /XYZ 60.307257 654.034014 0 ] (Code/DriverTyresWindow/:__span-0-50) [ 1903 0 R /XYZ 60.307257 704.021862 0 ] (Code/DriverTyresWindow/:__span-0-51) [ 1903 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverTyresWindow/:__span-0-52) [ 1903 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverTyresWindow/:__span-0-53) [ 1903 0 R /XYZ 60.307257 663.820806 0 ] (Code/DriverTyresWindow/:__span-0-54) [ 1903 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverTyresWindow/:__span-0-55) [ 1903 0 R /XYZ 60.307257 623.619750 0 ] (Code/DriverTyresWindow/:__span-0-56) [ 1903 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverTyresWindow/:__span-0-57) [ 1903 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverTyresWindow/:__span-0-58) [ 1903 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverTyresWindow/:__span-0-59) [ 1903 0 R /XYZ 60.307257 570.018342 0 ] (Code/DriverTyresWindow/:__span-0-6) [ 1901 0 R /XYZ 60.307257 640.633662 0 ] (Code/DriverTyresWindow/:__span-0-60) [ 1903 0 R /XYZ 60.307257 556.617990 0 ] (Code/DriverTyresWindow/:__span-0-61) [ 1903 0 R /XYZ 60.307257 543.217638 0 ] (Code/DriverTyresWindow/:__span-0-62) [ 1903 0 R /XYZ 60.307257 529.817286 0 ] (Code/DriverTyresWindow/:__span-0-63) [ 1903 0 R /XYZ 60.307257 516.416934 0 ] (Code/DriverTyresWindow/:__span-0-64) [ 1903 0 R /XYZ 60.307257 503.016582 0 ] (Code/DriverTyresWindow/:__span-0-65) [ 1903 0 R /XYZ 60.307257 462.815526 0 ] (Code/DriverTyresWindow/:__span-0-66) [ 1903 0 R /XYZ 60.307257 449.415174 0 ] (Code/DriverTyresWindow/:__span-0-67) [ 1903 0 R /XYZ 60.307257 436.014822 0 ] (Code/DriverTyresWindow/:__span-0-68) [ 1903 0 R /XYZ 60.307257 422.614470 0 ] (Code/DriverTyresWindow/:__span-0-69) [ 1903 0 R /XYZ 60.307257 409.214118 0 ] (Code/DriverTyresWindow/:__span-0-7) [ 1901 0 R /XYZ 60.307257 627.233310 0 ] (Code/DriverTyresWindow/:__span-0-70) [ 1903 0 R /XYZ 60.307257 395.813766 0 ] (Code/DriverTyresWindow/:__span-0-71) [ 1903 0 R /XYZ 60.307257 382.413414 0 ] (Code/DriverTyresWindow/:__span-0-72) [ 1903 0 R /XYZ 60.307257 369.013062 0 ] (Code/DriverTyresWindow/:__span-0-73) [ 1903 0 R /XYZ 60.307257 355.612710 0 ] (Code/DriverTyresWindow/:__span-0-74) [ 1903 0 R /XYZ 60.307257 328.812006 0 ] (Code/DriverTyresWindow/:__span-0-75) [ 1903 0 R /XYZ 60.307257 315.411654 0 ] (Code/DriverTyresWindow/:__span-0-76) [ 1903 0 R /XYZ 60.307257 302.011302 0 ] (Code/DriverTyresWindow/:__span-0-77) [ 1903 0 R /XYZ 60.307257 288.610950 0 ] (Code/DriverTyresWindow/:__span-0-78) [ 1903 0 R /XYZ 60.307257 275.210598 0 ] (Code/DriverTyresWindow/:__span-0-79) [ 1903 0 R /XYZ 60.307257 261.810246 0 ] (Code/DriverTyresWindow/:__span-0-8) [ 1901 0 R /XYZ 60.307257 613.832958 0 ] (Code/DriverTyresWindow/:__span-0-80) [ 1903 0 R /XYZ 60.307257 248.409894 0 ] (Code/DriverTyresWindow/:__span-0-81) [ 1903 0 R /XYZ 60.307257 235.009542 0 ] (Code/DriverTyresWindow/:__span-0-82) [ 1903 0 R /XYZ 60.307257 208.208838 0 ] (Code/DriverTyresWindow/:__span-0-83) [ 1903 0 R /XYZ 60.307257 168.007782 0 ] (Code/DriverTyresWindow/:__span-0-84) [ 1903 0 R /XYZ 60.307257 154.607430 0 ] (Code/DriverTyresWindow/:__span-0-85) [ 1903 0 R /XYZ 60.307257 127.806726 0 ] (Code/DriverTyresWindow/:__span-0-86) [ 1903 0 R /XYZ 60.307257 114.406374 0 ] (Code/DriverTyresWindow/:__span-0-87) [ 1903 0 R /XYZ 60.307257 101.006022 0 ] (Code/DriverTyresWindow/:__span-0-88) [ 1903 0 R /XYZ 60.307257 87.605670 0 ] (Code/DriverTyresWindow/:__span-0-89) [ 1905 0 R /XYZ 60.307257 771.023622 0 ] (Code/DriverTyresWindow/:__span-0-9) [ 1901 0 R /XYZ 60.307257 600.432606 0 ] (Code/DriverTyresWindow/:__span-0-90) [ 1905 0 R /XYZ 60.307257 757.623270 0 ] (Code/DriverTyresWindow/:__span-0-91) [ 1905 0 R /XYZ 60.307257 744.222918 0 ] (Code/DriverTyresWindow/:__span-0-92) [ 1905 0 R /XYZ 60.307257 717.422214 0 ] (Code/DriverTyresWindow/:__span-0-93) [ 1905 0 R /XYZ 60.307257 690.621510 0 ] (Code/DriverTyresWindow/:__span-0-94) [ 1905 0 R /XYZ 60.307257 677.221158 0 ] (Code/DriverTyresWindow/:__span-0-95) [ 1905 0 R /XYZ 60.307257 650.420454 0 ] (Code/DriverTyresWindow/:__span-0-96) [ 1905 0 R /XYZ 60.307257 637.020102 0 ] (Code/DriverTyresWindow/:__span-0-97) [ 1905 0 R /XYZ 60.307257 610.219398 0 ] (Code/DriverTyresWindow/:__span-0-98) [ 1905 0 R /XYZ 60.307257 596.819046 0 ] (Code/DriverTyresWindow/:__span-0-99) [ 1905 0 R /XYZ 60.307257 583.418694 0 ] (Code/DriverTyresWindow/:drivertyreswindowcs) [ 1901 0 R /XYZ 39.386457 747.563622 0 ] (Code/F1TVEmulator/:) [ 1791 0 R /XYZ 39.386457 747.563622 0 ] (Code/F1TVEmulator/:__span-0-1) [ 1791 0 R /XYZ 60.307257 707.635422 0 ] (Code/F1TVEmulator/:__span-0-10) [ 1791 0 R /XYZ 60.307257 573.631902 0 ] (Code/F1TVEmulator/:__span-0-100) [ 1795 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-101) [ 1795 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-102) [ 1795 0 R /XYZ 60.307257 637.020102 0 ] (Code/F1TVEmulator/:__span-0-103) [ 1795 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-104) [ 1795 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-105) [ 1795 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-106) [ 1795 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-107) [ 1795 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-108) [ 1795 0 R /XYZ 60.307257 556.617990 0 ] (Code/F1TVEmulator/:__span-0-109) [ 1795 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-11) [ 1791 0 R /XYZ 60.307257 560.231550 0 ] (Code/F1TVEmulator/:__span-0-110) [ 1795 0 R /XYZ 60.307257 529.817286 0 ] (Code/F1TVEmulator/:__span-0-111) [ 1795 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-112) [ 1795 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-113) [ 1795 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-114) [ 1795 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-115) [ 1795 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-116) [ 1795 0 R /XYZ 60.307257 436.014822 0 ] (Code/F1TVEmulator/:__span-0-117) [ 1795 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-118) [ 1795 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-119) [ 1795 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-12) [ 1791 0 R /XYZ 60.307257 546.831198 0 ] (Code/F1TVEmulator/:__span-0-120) [ 1795 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-121) [ 1795 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-122) [ 1795 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-123) [ 1795 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-124) [ 1795 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-125) [ 1795 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-126) [ 1795 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-127) [ 1795 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-128) [ 1795 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-129) [ 1795 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-13) [ 1791 0 R /XYZ 60.307257 533.430846 0 ] (Code/F1TVEmulator/:__span-0-130) [ 1795 0 R /XYZ 60.307257 221.609190 0 ] (Code/F1TVEmulator/:__span-0-131) [ 1795 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-132) [ 1795 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-133) [ 1795 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-134) [ 1795 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-135) [ 1795 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-136) [ 1795 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-137) [ 1795 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-138) [ 1795 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-139) [ 1795 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-14) [ 1791 0 R /XYZ 60.307257 520.030494 0 ] (Code/F1TVEmulator/:__span-0-140) [ 1795 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-141) [ 1797 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-142) [ 1797 0 R /XYZ 60.307257 757.623270 0 ] (Code/F1TVEmulator/:__span-0-143) [ 1797 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-144) [ 1797 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-145) [ 1797 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-146) [ 1797 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-147) [ 1797 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-148) [ 1797 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-149) [ 1797 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-15) [ 1791 0 R /XYZ 60.307257 506.630142 0 ] (Code/F1TVEmulator/:__span-0-150) [ 1797 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-151) [ 1797 0 R /XYZ 60.307257 637.020102 0 ] (Code/F1TVEmulator/:__span-0-152) [ 1797 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-153) [ 1797 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-154) [ 1797 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-155) [ 1797 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-156) [ 1797 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-157) [ 1797 0 R /XYZ 60.307257 529.817286 0 ] (Code/F1TVEmulator/:__span-0-158) [ 1797 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-159) [ 1797 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-16) [ 1791 0 R /XYZ 60.307257 493.229790 0 ] (Code/F1TVEmulator/:__span-0-160) [ 1797 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-161) [ 1797 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-162) [ 1797 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-163) [ 1797 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-164) [ 1797 0 R /XYZ 60.307257 436.014822 0 ] (Code/F1TVEmulator/:__span-0-165) [ 1797 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-166) [ 1797 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-167) [ 1797 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-168) [ 1797 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-169) [ 1797 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-17) [ 1791 0 R /XYZ 60.307257 479.829438 0 ] (Code/F1TVEmulator/:__span-0-170) [ 1797 0 R /XYZ 60.307257 355.612710 0 ] (Code/F1TVEmulator/:__span-0-171) [ 1797 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-172) [ 1797 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-173) [ 1797 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-174) [ 1797 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-175) [ 1797 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-176) [ 1797 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-177) [ 1797 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-178) [ 1797 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-179) [ 1797 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-18) [ 1791 0 R /XYZ 60.307257 466.429086 0 ] (Code/F1TVEmulator/:__span-0-180) [ 1797 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-181) [ 1797 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-182) [ 1797 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-183) [ 1797 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-184) [ 1797 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-185) [ 1797 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-186) [ 1797 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-187) [ 1797 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-188) [ 1797 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-189) [ 1797 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-19) [ 1791 0 R /XYZ 60.307257 453.028734 0 ] (Code/F1TVEmulator/:__span-0-190) [ 1799 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-191) [ 1799 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-192) [ 1799 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-193) [ 1799 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-194) [ 1799 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-195) [ 1799 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-196) [ 1799 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-197) [ 1799 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-198) [ 1799 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-199) [ 1799 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-2) [ 1791 0 R /XYZ 60.307257 694.235070 0 ] (Code/F1TVEmulator/:__span-0-20) [ 1791 0 R /XYZ 60.307257 439.628382 0 ] (Code/F1TVEmulator/:__span-0-200) [ 1799 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-201) [ 1799 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-202) [ 1799 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-203) [ 1799 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-204) [ 1799 0 R /XYZ 60.307257 529.817286 0 ] (Code/F1TVEmulator/:__span-0-205) [ 1799 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-206) [ 1799 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-207) [ 1799 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-208) [ 1799 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-209) [ 1799 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-21) [ 1791 0 R /XYZ 60.307257 426.228030 0 ] (Code/F1TVEmulator/:__span-0-210) [ 1799 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-211) [ 1799 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-212) [ 1799 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-213) [ 1799 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-214) [ 1799 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-215) [ 1799 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-216) [ 1799 0 R /XYZ 60.307257 355.612710 0 ] (Code/F1TVEmulator/:__span-0-217) [ 1799 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-218) [ 1799 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-219) [ 1799 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-22) [ 1791 0 R /XYZ 60.307257 412.827678 0 ] (Code/F1TVEmulator/:__span-0-220) [ 1799 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-221) [ 1799 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-222) [ 1799 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-223) [ 1799 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-224) [ 1799 0 R /XYZ 60.307257 221.609190 0 ] (Code/F1TVEmulator/:__span-0-225) [ 1799 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-226) [ 1799 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-227) [ 1799 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-228) [ 1799 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-229) [ 1799 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-23) [ 1791 0 R /XYZ 60.307257 399.427326 0 ] (Code/F1TVEmulator/:__span-0-230) [ 1799 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-231) [ 1799 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-232) [ 1799 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-233) [ 1801 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-234) [ 1801 0 R /XYZ 60.307257 757.623270 0 ] (Code/F1TVEmulator/:__span-0-235) [ 1801 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-236) [ 1801 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-237) [ 1801 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-238) [ 1801 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-239) [ 1801 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-24) [ 1791 0 R /XYZ 60.307257 386.026974 0 ] (Code/F1TVEmulator/:__span-0-240) [ 1801 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-241) [ 1801 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-242) [ 1801 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-243) [ 1801 0 R /XYZ 60.307257 637.020102 0 ] (Code/F1TVEmulator/:__span-0-244) [ 1801 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-245) [ 1801 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-246) [ 1801 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-247) [ 1801 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-248) [ 1801 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-249) [ 1801 0 R /XYZ 60.307257 556.617990 0 ] (Code/F1TVEmulator/:__span-0-25) [ 1791 0 R /XYZ 60.307257 372.626622 0 ] (Code/F1TVEmulator/:__span-0-250) [ 1801 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-251) [ 1801 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-252) [ 1801 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-253) [ 1801 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-254) [ 1801 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-255) [ 1801 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-256) [ 1801 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-257) [ 1801 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-258) [ 1801 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-259) [ 1801 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-26) [ 1791 0 R /XYZ 60.307257 359.226270 0 ] (Code/F1TVEmulator/:__span-0-260) [ 1801 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-261) [ 1801 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-262) [ 1801 0 R /XYZ 60.307257 355.612710 0 ] (Code/F1TVEmulator/:__span-0-263) [ 1801 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-264) [ 1801 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-265) [ 1801 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-266) [ 1801 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-267) [ 1801 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-268) [ 1801 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-269) [ 1801 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-27) [ 1791 0 R /XYZ 60.307257 332.425566 0 ] (Code/F1TVEmulator/:__span-0-270) [ 1801 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-271) [ 1801 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-272) [ 1801 0 R /XYZ 60.307257 221.609190 0 ] (Code/F1TVEmulator/:__span-0-273) [ 1801 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-274) [ 1801 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-275) [ 1801 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-276) [ 1801 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-277) [ 1801 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-278) [ 1801 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-279) [ 1801 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-28) [ 1791 0 R /XYZ 60.307257 305.624862 0 ] (Code/F1TVEmulator/:__span-0-280) [ 1801 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-281) [ 1801 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-282) [ 1801 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-283) [ 1803 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-284) [ 1803 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-285) [ 1803 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-286) [ 1803 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-287) [ 1803 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-288) [ 1803 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-289) [ 1803 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-29) [ 1791 0 R /XYZ 60.307257 278.824158 0 ] (Code/F1TVEmulator/:__span-0-290) [ 1803 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-291) [ 1803 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-292) [ 1803 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-293) [ 1803 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-294) [ 1803 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-295) [ 1803 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-296) [ 1803 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-297) [ 1803 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-298) [ 1803 0 R /XYZ 60.307257 529.817286 0 ] (Code/F1TVEmulator/:__span-0-299) [ 1803 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-3) [ 1791 0 R /XYZ 60.307257 680.834718 0 ] (Code/F1TVEmulator/:__span-0-30) [ 1791 0 R /XYZ 60.307257 265.423806 0 ] (Code/F1TVEmulator/:__span-0-300) [ 1803 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-301) [ 1803 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-302) [ 1803 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-303) [ 1803 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-304) [ 1803 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-305) [ 1803 0 R /XYZ 60.307257 436.014822 0 ] (Code/F1TVEmulator/:__span-0-306) [ 1803 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-307) [ 1803 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-308) [ 1803 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-309) [ 1803 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-31) [ 1791 0 R /XYZ 60.307257 252.023454 0 ] (Code/F1TVEmulator/:__span-0-310) [ 1803 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-311) [ 1803 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-312) [ 1803 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-313) [ 1803 0 R /XYZ 60.307257 315.411654 0 ] (Code/F1TVEmulator/:__span-0-314) [ 1803 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-315) [ 1803 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-316) [ 1803 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-317) [ 1803 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-318) [ 1803 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-319) [ 1803 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-32) [ 1791 0 R /XYZ 60.307257 238.623102 0 ] (Code/F1TVEmulator/:__span-0-320) [ 1803 0 R /XYZ 60.307257 221.609190 0 ] (Code/F1TVEmulator/:__span-0-321) [ 1803 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-322) [ 1803 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-323) [ 1803 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-324) [ 1803 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-325) [ 1803 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-326) [ 1803 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-327) [ 1803 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-328) [ 1803 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-329) [ 1803 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-33) [ 1791 0 R /XYZ 60.307257 225.222750 0 ] (Code/F1TVEmulator/:__span-0-34) [ 1791 0 R /XYZ 60.307257 211.822398 0 ] (Code/F1TVEmulator/:__span-0-35) [ 1791 0 R /XYZ 60.307257 198.422046 0 ] (Code/F1TVEmulator/:__span-0-36) [ 1791 0 R /XYZ 60.307257 171.621342 0 ] (Code/F1TVEmulator/:__span-0-37) [ 1791 0 R /XYZ 60.307257 158.220990 0 ] (Code/F1TVEmulator/:__span-0-38) [ 1791 0 R /XYZ 60.307257 144.820638 0 ] (Code/F1TVEmulator/:__span-0-39) [ 1791 0 R /XYZ 60.307257 131.420286 0 ] (Code/F1TVEmulator/:__span-0-4) [ 1791 0 R /XYZ 60.307257 667.434366 0 ] (Code/F1TVEmulator/:__span-0-40) [ 1791 0 R /XYZ 60.307257 118.019934 0 ] (Code/F1TVEmulator/:__span-0-41) [ 1791 0 R /XYZ 60.307257 104.619582 0 ] (Code/F1TVEmulator/:__span-0-42) [ 1791 0 R /XYZ 60.307257 91.219230 0 ] (Code/F1TVEmulator/:__span-0-43) [ 1793 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-44) [ 1793 0 R /XYZ 60.307257 757.623270 0 ] (Code/F1TVEmulator/:__span-0-45) [ 1793 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-46) [ 1793 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-47) [ 1793 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-48) [ 1793 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-49) [ 1793 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-5) [ 1791 0 R /XYZ 60.307257 640.633662 0 ] (Code/F1TVEmulator/:__span-0-50) [ 1793 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:__span-0-51) [ 1793 0 R /XYZ 60.307257 663.820806 0 ] (Code/F1TVEmulator/:__span-0-52) [ 1793 0 R /XYZ 60.307257 650.420454 0 ] (Code/F1TVEmulator/:__span-0-53) [ 1793 0 R /XYZ 60.307257 637.020102 0 ] (Code/F1TVEmulator/:__span-0-54) [ 1793 0 R /XYZ 60.307257 623.619750 0 ] (Code/F1TVEmulator/:__span-0-55) [ 1793 0 R /XYZ 60.307257 610.219398 0 ] (Code/F1TVEmulator/:__span-0-56) [ 1793 0 R /XYZ 60.307257 596.819046 0 ] (Code/F1TVEmulator/:__span-0-57) [ 1793 0 R /XYZ 60.307257 583.418694 0 ] (Code/F1TVEmulator/:__span-0-58) [ 1793 0 R /XYZ 60.307257 570.018342 0 ] (Code/F1TVEmulator/:__span-0-59) [ 1793 0 R /XYZ 60.307257 556.617990 0 ] (Code/F1TVEmulator/:__span-0-6) [ 1791 0 R /XYZ 60.307257 627.233310 0 ] (Code/F1TVEmulator/:__span-0-60) [ 1793 0 R /XYZ 60.307257 543.217638 0 ] (Code/F1TVEmulator/:__span-0-61) [ 1793 0 R /XYZ 60.307257 516.416934 0 ] (Code/F1TVEmulator/:__span-0-62) [ 1793 0 R /XYZ 60.307257 503.016582 0 ] (Code/F1TVEmulator/:__span-0-63) [ 1793 0 R /XYZ 60.307257 489.616230 0 ] (Code/F1TVEmulator/:__span-0-64) [ 1793 0 R /XYZ 60.307257 476.215878 0 ] (Code/F1TVEmulator/:__span-0-65) [ 1793 0 R /XYZ 60.307257 462.815526 0 ] (Code/F1TVEmulator/:__span-0-66) [ 1793 0 R /XYZ 60.307257 449.415174 0 ] (Code/F1TVEmulator/:__span-0-67) [ 1793 0 R /XYZ 60.307257 436.014822 0 ] (Code/F1TVEmulator/:__span-0-68) [ 1793 0 R /XYZ 60.307257 422.614470 0 ] (Code/F1TVEmulator/:__span-0-69) [ 1793 0 R /XYZ 60.307257 409.214118 0 ] (Code/F1TVEmulator/:__span-0-7) [ 1791 0 R /XYZ 60.307257 613.832958 0 ] (Code/F1TVEmulator/:__span-0-70) [ 1793 0 R /XYZ 60.307257 395.813766 0 ] (Code/F1TVEmulator/:__span-0-71) [ 1793 0 R /XYZ 60.307257 382.413414 0 ] (Code/F1TVEmulator/:__span-0-72) [ 1793 0 R /XYZ 60.307257 369.013062 0 ] (Code/F1TVEmulator/:__span-0-73) [ 1793 0 R /XYZ 60.307257 355.612710 0 ] (Code/F1TVEmulator/:__span-0-74) [ 1793 0 R /XYZ 60.307257 342.212358 0 ] (Code/F1TVEmulator/:__span-0-75) [ 1793 0 R /XYZ 60.307257 328.812006 0 ] (Code/F1TVEmulator/:__span-0-76) [ 1793 0 R /XYZ 60.307257 302.011302 0 ] (Code/F1TVEmulator/:__span-0-77) [ 1793 0 R /XYZ 60.307257 288.610950 0 ] (Code/F1TVEmulator/:__span-0-78) [ 1793 0 R /XYZ 60.307257 275.210598 0 ] (Code/F1TVEmulator/:__span-0-79) [ 1793 0 R /XYZ 60.307257 261.810246 0 ] (Code/F1TVEmulator/:__span-0-8) [ 1791 0 R /XYZ 60.307257 600.432606 0 ] (Code/F1TVEmulator/:__span-0-80) [ 1793 0 R /XYZ 60.307257 248.409894 0 ] (Code/F1TVEmulator/:__span-0-81) [ 1793 0 R /XYZ 60.307257 235.009542 0 ] (Code/F1TVEmulator/:__span-0-82) [ 1793 0 R /XYZ 60.307257 208.208838 0 ] (Code/F1TVEmulator/:__span-0-83) [ 1793 0 R /XYZ 60.307257 194.808486 0 ] (Code/F1TVEmulator/:__span-0-84) [ 1793 0 R /XYZ 60.307257 181.408134 0 ] (Code/F1TVEmulator/:__span-0-85) [ 1793 0 R /XYZ 60.307257 168.007782 0 ] (Code/F1TVEmulator/:__span-0-86) [ 1793 0 R /XYZ 60.307257 154.607430 0 ] (Code/F1TVEmulator/:__span-0-87) [ 1793 0 R /XYZ 60.307257 141.207078 0 ] (Code/F1TVEmulator/:__span-0-88) [ 1793 0 R /XYZ 60.307257 127.806726 0 ] (Code/F1TVEmulator/:__span-0-89) [ 1793 0 R /XYZ 60.307257 114.406374 0 ] (Code/F1TVEmulator/:__span-0-9) [ 1791 0 R /XYZ 60.307257 587.032254 0 ] (Code/F1TVEmulator/:__span-0-90) [ 1793 0 R /XYZ 60.307257 101.006022 0 ] (Code/F1TVEmulator/:__span-0-91) [ 1793 0 R /XYZ 60.307257 87.605670 0 ] (Code/F1TVEmulator/:__span-0-92) [ 1795 0 R /XYZ 60.307257 771.023622 0 ] (Code/F1TVEmulator/:__span-0-93) [ 1795 0 R /XYZ 60.307257 757.623270 0 ] (Code/F1TVEmulator/:__span-0-94) [ 1795 0 R /XYZ 60.307257 744.222918 0 ] (Code/F1TVEmulator/:__span-0-95) [ 1795 0 R /XYZ 60.307257 730.822566 0 ] (Code/F1TVEmulator/:__span-0-96) [ 1795 0 R /XYZ 60.307257 717.422214 0 ] (Code/F1TVEmulator/:__span-0-97) [ 1795 0 R /XYZ 60.307257 704.021862 0 ] (Code/F1TVEmulator/:__span-0-98) [ 1795 0 R /XYZ 60.307257 690.621510 0 ] (Code/F1TVEmulator/:__span-0-99) [ 1795 0 R /XYZ 60.307257 677.221158 0 ] (Code/F1TVEmulator/:f1tvemulatorcs) [ 1791 0 R /XYZ 39.386457 747.563622 0 ] (Code/Form1/:) [ 1805 0 R /XYZ 39.386457 747.563622 0 ] (Code/Form1/:__span-0-1) [ 1805 0 R /XYZ 60.307257 707.635422 0 ] (Code/Form1/:__span-0-10) [ 1805 0 R /XYZ 60.307257 587.032254 0 ] (Code/Form1/:__span-0-100) [ 1809 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-101) [ 1809 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-102) [ 1809 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-103) [ 1809 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-104) [ 1809 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-105) [ 1809 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-106) [ 1809 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-107) [ 1809 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-108) [ 1809 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-109) [ 1809 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-11) [ 1805 0 R /XYZ 60.307257 573.631902 0 ] (Code/Form1/:__span-0-110) [ 1809 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-111) [ 1809 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-112) [ 1809 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-113) [ 1809 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-114) [ 1809 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-115) [ 1809 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-116) [ 1809 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-117) [ 1809 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-118) [ 1809 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-119) [ 1809 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-12) [ 1805 0 R /XYZ 60.307257 560.231550 0 ] (Code/Form1/:__span-0-120) [ 1809 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-121) [ 1809 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-122) [ 1809 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-123) [ 1809 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-124) [ 1809 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-125) [ 1809 0 R /XYZ 60.307257 328.812006 0 ] (Code/Form1/:__span-0-126) [ 1809 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-127) [ 1809 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-128) [ 1809 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-129) [ 1809 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-13) [ 1805 0 R /XYZ 60.307257 546.831198 0 ] (Code/Form1/:__span-0-130) [ 1809 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-131) [ 1809 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-132) [ 1809 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-133) [ 1809 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-134) [ 1809 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-135) [ 1809 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-136) [ 1811 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-137) [ 1811 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-138) [ 1811 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-139) [ 1811 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-14) [ 1805 0 R /XYZ 60.307257 533.430846 0 ] (Code/Form1/:__span-0-140) [ 1811 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-141) [ 1811 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-142) [ 1811 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-143) [ 1811 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-144) [ 1811 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-145) [ 1811 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-146) [ 1811 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-147) [ 1811 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-148) [ 1811 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-149) [ 1811 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-15) [ 1805 0 R /XYZ 60.307257 520.030494 0 ] (Code/Form1/:__span-0-150) [ 1811 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-151) [ 1811 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-152) [ 1811 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-153) [ 1811 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-154) [ 1811 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-155) [ 1811 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-156) [ 1811 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-157) [ 1811 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-158) [ 1811 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-159) [ 1811 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-16) [ 1805 0 R /XYZ 60.307257 506.630142 0 ] (Code/Form1/:__span-0-160) [ 1811 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-161) [ 1811 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-162) [ 1811 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-163) [ 1811 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-164) [ 1811 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-165) [ 1811 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-166) [ 1811 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-167) [ 1811 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-168) [ 1811 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-169) [ 1811 0 R /XYZ 60.307257 328.812006 0 ] (Code/Form1/:__span-0-17) [ 1805 0 R /XYZ 60.307257 493.229790 0 ] (Code/Form1/:__span-0-170) [ 1811 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-171) [ 1811 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-172) [ 1811 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-173) [ 1811 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-174) [ 1811 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-175) [ 1811 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-176) [ 1811 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-177) [ 1811 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-178) [ 1811 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-179) [ 1811 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-18) [ 1805 0 R /XYZ 60.307257 479.829438 0 ] (Code/Form1/:__span-0-180) [ 1811 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-181) [ 1811 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-182) [ 1811 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-183) [ 1811 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-184) [ 1811 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-185) [ 1811 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-186) [ 1811 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-187) [ 1811 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-188) [ 1813 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-189) [ 1813 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-19) [ 1805 0 R /XYZ 60.307257 466.429086 0 ] (Code/Form1/:__span-0-190) [ 1813 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-191) [ 1813 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-192) [ 1813 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-193) [ 1813 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-194) [ 1813 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-195) [ 1813 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-196) [ 1813 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-197) [ 1813 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-198) [ 1813 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-199) [ 1813 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-2) [ 1805 0 R /XYZ 60.307257 694.235070 0 ] (Code/Form1/:__span-0-20) [ 1805 0 R /XYZ 60.307257 453.028734 0 ] (Code/Form1/:__span-0-200) [ 1813 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-201) [ 1813 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-202) [ 1813 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-203) [ 1813 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-204) [ 1813 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-205) [ 1813 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-206) [ 1813 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-207) [ 1813 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-208) [ 1813 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-209) [ 1813 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-21) [ 1805 0 R /XYZ 60.307257 439.628382 0 ] (Code/Form1/:__span-0-210) [ 1813 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-211) [ 1813 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-212) [ 1813 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-213) [ 1813 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-214) [ 1813 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-215) [ 1813 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-216) [ 1813 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-217) [ 1813 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-218) [ 1813 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-219) [ 1813 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-22) [ 1805 0 R /XYZ 60.307257 426.228030 0 ] (Code/Form1/:__span-0-220) [ 1813 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-221) [ 1813 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-222) [ 1813 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-223) [ 1813 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-224) [ 1813 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-225) [ 1813 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-226) [ 1813 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-227) [ 1813 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-228) [ 1813 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-229) [ 1813 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-23) [ 1805 0 R /XYZ 60.307257 412.827678 0 ] (Code/Form1/:__span-0-230) [ 1813 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-231) [ 1813 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-232) [ 1813 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-233) [ 1813 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-234) [ 1813 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-235) [ 1813 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-236) [ 1813 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-237) [ 1813 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-238) [ 1815 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-239) [ 1815 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-24) [ 1805 0 R /XYZ 60.307257 399.427326 0 ] (Code/Form1/:__span-0-240) [ 1815 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-241) [ 1815 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-242) [ 1815 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-243) [ 1815 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-244) [ 1815 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-245) [ 1815 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-246) [ 1815 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-247) [ 1815 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-248) [ 1815 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-249) [ 1815 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-25) [ 1805 0 R /XYZ 60.307257 386.026974 0 ] (Code/Form1/:__span-0-250) [ 1815 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-251) [ 1815 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-252) [ 1815 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-253) [ 1815 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-254) [ 1815 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-255) [ 1815 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-256) [ 1815 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-257) [ 1815 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-258) [ 1815 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-259) [ 1815 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-26) [ 1805 0 R /XYZ 60.307257 372.626622 0 ] (Code/Form1/:__span-0-260) [ 1815 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-261) [ 1815 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-262) [ 1815 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-263) [ 1815 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-264) [ 1815 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-265) [ 1815 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-266) [ 1815 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-267) [ 1815 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-268) [ 1815 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-269) [ 1815 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-27) [ 1805 0 R /XYZ 60.307257 359.226270 0 ] (Code/Form1/:__span-0-270) [ 1815 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-271) [ 1815 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-272) [ 1815 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-273) [ 1815 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-274) [ 1815 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-275) [ 1815 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-276) [ 1815 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-277) [ 1815 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-278) [ 1815 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-279) [ 1815 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-28) [ 1805 0 R /XYZ 60.307257 345.825918 0 ] (Code/Form1/:__span-0-280) [ 1815 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-281) [ 1817 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-282) [ 1817 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-283) [ 1817 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-284) [ 1817 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-285) [ 1817 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-286) [ 1817 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-287) [ 1817 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-288) [ 1817 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-289) [ 1817 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-29) [ 1805 0 R /XYZ 60.307257 332.425566 0 ] (Code/Form1/:__span-0-290) [ 1817 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-291) [ 1817 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-292) [ 1817 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-293) [ 1817 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-294) [ 1817 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-295) [ 1817 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-296) [ 1817 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-297) [ 1817 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-298) [ 1817 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-299) [ 1817 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-3) [ 1805 0 R /XYZ 60.307257 680.834718 0 ] (Code/Form1/:__span-0-30) [ 1805 0 R /XYZ 60.307257 319.025214 0 ] (Code/Form1/:__span-0-300) [ 1817 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-301) [ 1817 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-302) [ 1817 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-303) [ 1817 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-304) [ 1817 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-305) [ 1817 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-306) [ 1817 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-307) [ 1817 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-308) [ 1817 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-309) [ 1817 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-31) [ 1805 0 R /XYZ 60.307257 305.624862 0 ] (Code/Form1/:__span-0-310) [ 1817 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-311) [ 1817 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-312) [ 1817 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-313) [ 1817 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-314) [ 1817 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-315) [ 1817 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-316) [ 1817 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-317) [ 1817 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-318) [ 1817 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-319) [ 1817 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-32) [ 1805 0 R /XYZ 60.307257 292.224510 0 ] (Code/Form1/:__span-0-320) [ 1817 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-321) [ 1817 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-322) [ 1817 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-323) [ 1817 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-324) [ 1817 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-325) [ 1817 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-326) [ 1817 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-327) [ 1817 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-328) [ 1817 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-329) [ 1819 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-33) [ 1805 0 R /XYZ 60.307257 278.824158 0 ] (Code/Form1/:__span-0-330) [ 1819 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-331) [ 1819 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-332) [ 1819 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-333) [ 1819 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-334) [ 1819 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-335) [ 1819 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-336) [ 1819 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-337) [ 1819 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-338) [ 1819 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-339) [ 1819 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-34) [ 1805 0 R /XYZ 60.307257 265.423806 0 ] (Code/Form1/:__span-0-340) [ 1819 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-341) [ 1819 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-342) [ 1819 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-343) [ 1819 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-344) [ 1819 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-345) [ 1819 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-346) [ 1819 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-347) [ 1819 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-348) [ 1819 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-349) [ 1819 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-35) [ 1805 0 R /XYZ 60.307257 252.023454 0 ] (Code/Form1/:__span-0-350) [ 1819 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-351) [ 1819 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-352) [ 1819 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-353) [ 1819 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-354) [ 1819 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-355) [ 1819 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-356) [ 1819 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-357) [ 1819 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-358) [ 1819 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-359) [ 1819 0 R /XYZ 60.307257 328.812006 0 ] (Code/Form1/:__span-0-36) [ 1805 0 R /XYZ 60.307257 238.623102 0 ] (Code/Form1/:__span-0-360) [ 1819 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-361) [ 1819 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-362) [ 1819 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-363) [ 1819 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-364) [ 1819 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-365) [ 1819 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-366) [ 1819 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-367) [ 1819 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-368) [ 1819 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-369) [ 1819 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-37) [ 1805 0 R /XYZ 60.307257 225.222750 0 ] (Code/Form1/:__span-0-370) [ 1819 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-371) [ 1819 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-372) [ 1819 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-373) [ 1819 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-374) [ 1819 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-375) [ 1819 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-376) [ 1821 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-377) [ 1821 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-378) [ 1821 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-379) [ 1821 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-38) [ 1805 0 R /XYZ 60.307257 211.822398 0 ] (Code/Form1/:__span-0-380) [ 1821 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-381) [ 1821 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-382) [ 1821 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-383) [ 1821 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-384) [ 1821 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-385) [ 1821 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-386) [ 1821 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-387) [ 1821 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-388) [ 1821 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-389) [ 1821 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-39) [ 1805 0 R /XYZ 60.307257 198.422046 0 ] (Code/Form1/:__span-0-390) [ 1821 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-391) [ 1821 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-392) [ 1821 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-393) [ 1821 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-394) [ 1821 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-395) [ 1821 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-396) [ 1821 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-397) [ 1821 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-398) [ 1821 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-399) [ 1821 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-4) [ 1805 0 R /XYZ 60.307257 667.434366 0 ] (Code/Form1/:__span-0-40) [ 1805 0 R /XYZ 60.307257 185.021694 0 ] (Code/Form1/:__span-0-400) [ 1821 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-401) [ 1821 0 R /XYZ 60.307257 382.413414 0 ] (Code/Form1/:__span-0-402) [ 1821 0 R /XYZ 60.307257 355.612710 0 ] (Code/Form1/:__span-0-403) [ 1821 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-404) [ 1821 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-405) [ 1821 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-406) [ 1821 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-407) [ 1821 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-408) [ 1821 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-409) [ 1821 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-41) [ 1805 0 R /XYZ 60.307257 171.621342 0 ] (Code/Form1/:__span-0-410) [ 1821 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-411) [ 1821 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-412) [ 1821 0 R /XYZ 60.307257 141.207078 0 ] (Code/Form1/:__span-0-413) [ 1821 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-414) [ 1821 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-415) [ 1823 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-416) [ 1823 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-417) [ 1823 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-418) [ 1823 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-419) [ 1823 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-42) [ 1805 0 R /XYZ 60.307257 158.220990 0 ] (Code/Form1/:__span-0-420) [ 1823 0 R /XYZ 60.307257 663.820806 0 ] (Code/Form1/:__span-0-421) [ 1823 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-422) [ 1823 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-43) [ 1805 0 R /XYZ 60.307257 144.820638 0 ] (Code/Form1/:__span-0-44) [ 1805 0 R /XYZ 60.307257 131.420286 0 ] (Code/Form1/:__span-0-45) [ 1805 0 R /XYZ 60.307257 118.019934 0 ] (Code/Form1/:__span-0-46) [ 1805 0 R /XYZ 60.307257 104.619582 0 ] (Code/Form1/:__span-0-47) [ 1805 0 R /XYZ 60.307257 91.219230 0 ] (Code/Form1/:__span-0-48) [ 1807 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-49) [ 1807 0 R /XYZ 60.307257 757.623270 0 ] (Code/Form1/:__span-0-5) [ 1805 0 R /XYZ 60.307257 654.034014 0 ] (Code/Form1/:__span-0-50) [ 1807 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-51) [ 1807 0 R /XYZ 60.307257 730.822566 0 ] (Code/Form1/:__span-0-52) [ 1807 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-53) [ 1807 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:__span-0-54) [ 1807 0 R /XYZ 60.307257 690.621510 0 ] (Code/Form1/:__span-0-55) [ 1807 0 R /XYZ 60.307257 677.221158 0 ] (Code/Form1/:__span-0-56) [ 1807 0 R /XYZ 60.307257 650.420454 0 ] (Code/Form1/:__span-0-57) [ 1807 0 R /XYZ 60.307257 637.020102 0 ] (Code/Form1/:__span-0-58) [ 1807 0 R /XYZ 60.307257 623.619750 0 ] (Code/Form1/:__span-0-59) [ 1807 0 R /XYZ 60.307257 610.219398 0 ] (Code/Form1/:__span-0-6) [ 1805 0 R /XYZ 60.307257 640.633662 0 ] (Code/Form1/:__span-0-60) [ 1807 0 R /XYZ 60.307257 596.819046 0 ] (Code/Form1/:__span-0-61) [ 1807 0 R /XYZ 60.307257 583.418694 0 ] (Code/Form1/:__span-0-62) [ 1807 0 R /XYZ 60.307257 570.018342 0 ] (Code/Form1/:__span-0-63) [ 1807 0 R /XYZ 60.307257 556.617990 0 ] (Code/Form1/:__span-0-64) [ 1807 0 R /XYZ 60.307257 543.217638 0 ] (Code/Form1/:__span-0-65) [ 1807 0 R /XYZ 60.307257 529.817286 0 ] (Code/Form1/:__span-0-66) [ 1807 0 R /XYZ 60.307257 516.416934 0 ] (Code/Form1/:__span-0-67) [ 1807 0 R /XYZ 60.307257 503.016582 0 ] (Code/Form1/:__span-0-68) [ 1807 0 R /XYZ 60.307257 489.616230 0 ] (Code/Form1/:__span-0-69) [ 1807 0 R /XYZ 60.307257 476.215878 0 ] (Code/Form1/:__span-0-7) [ 1805 0 R /XYZ 60.307257 627.233310 0 ] (Code/Form1/:__span-0-70) [ 1807 0 R /XYZ 60.307257 462.815526 0 ] (Code/Form1/:__span-0-71) [ 1807 0 R /XYZ 60.307257 449.415174 0 ] (Code/Form1/:__span-0-72) [ 1807 0 R /XYZ 60.307257 436.014822 0 ] (Code/Form1/:__span-0-73) [ 1807 0 R /XYZ 60.307257 422.614470 0 ] (Code/Form1/:__span-0-74) [ 1807 0 R /XYZ 60.307257 409.214118 0 ] (Code/Form1/:__span-0-75) [ 1807 0 R /XYZ 60.307257 395.813766 0 ] (Code/Form1/:__span-0-76) [ 1807 0 R /XYZ 60.307257 369.013062 0 ] (Code/Form1/:__span-0-77) [ 1807 0 R /XYZ 60.307257 342.212358 0 ] (Code/Form1/:__span-0-78) [ 1807 0 R /XYZ 60.307257 328.812006 0 ] (Code/Form1/:__span-0-79) [ 1807 0 R /XYZ 60.307257 315.411654 0 ] (Code/Form1/:__span-0-8) [ 1805 0 R /XYZ 60.307257 613.832958 0 ] (Code/Form1/:__span-0-80) [ 1807 0 R /XYZ 60.307257 302.011302 0 ] (Code/Form1/:__span-0-81) [ 1807 0 R /XYZ 60.307257 288.610950 0 ] (Code/Form1/:__span-0-82) [ 1807 0 R /XYZ 60.307257 275.210598 0 ] (Code/Form1/:__span-0-83) [ 1807 0 R /XYZ 60.307257 261.810246 0 ] (Code/Form1/:__span-0-84) [ 1807 0 R /XYZ 60.307257 248.409894 0 ] (Code/Form1/:__span-0-85) [ 1807 0 R /XYZ 60.307257 235.009542 0 ] (Code/Form1/:__span-0-86) [ 1807 0 R /XYZ 60.307257 221.609190 0 ] (Code/Form1/:__span-0-87) [ 1807 0 R /XYZ 60.307257 208.208838 0 ] (Code/Form1/:__span-0-88) [ 1807 0 R /XYZ 60.307257 194.808486 0 ] (Code/Form1/:__span-0-89) [ 1807 0 R /XYZ 60.307257 181.408134 0 ] (Code/Form1/:__span-0-9) [ 1805 0 R /XYZ 60.307257 600.432606 0 ] (Code/Form1/:__span-0-90) [ 1807 0 R /XYZ 60.307257 168.007782 0 ] (Code/Form1/:__span-0-91) [ 1807 0 R /XYZ 60.307257 154.607430 0 ] (Code/Form1/:__span-0-92) [ 1807 0 R /XYZ 60.307257 127.806726 0 ] (Code/Form1/:__span-0-93) [ 1807 0 R /XYZ 60.307257 114.406374 0 ] (Code/Form1/:__span-0-94) [ 1807 0 R /XYZ 60.307257 101.006022 0 ] (Code/Form1/:__span-0-95) [ 1807 0 R /XYZ 60.307257 87.605670 0 ] (Code/Form1/:__span-0-96) [ 1809 0 R /XYZ 60.307257 771.023622 0 ] (Code/Form1/:__span-0-97) [ 1809 0 R /XYZ 60.307257 744.222918 0 ] (Code/Form1/:__span-0-98) [ 1809 0 R /XYZ 60.307257 717.422214 0 ] (Code/Form1/:__span-0-99) [ 1809 0 R /XYZ 60.307257 704.021862 0 ] (Code/Form1/:form1cs) [ 1805 0 R /XYZ 39.386457 747.563622 0 ] (Code/OcrImage/:) [ 1909 0 R /XYZ 39.386457 747.563622 0 ] (Code/OcrImage/:__span-0-1) [ 1909 0 R /XYZ 60.307257 707.635422 0 ] (Code/OcrImage/:__span-0-10) [ 1909 0 R /XYZ 60.307257 587.032254 0 ] (Code/OcrImage/:__span-0-100) [ 1913 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-101) [ 1913 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-102) [ 1913 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-103) [ 1913 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-104) [ 1913 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-105) [ 1913 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-106) [ 1913 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-107) [ 1913 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-108) [ 1913 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-109) [ 1913 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-11) [ 1909 0 R /XYZ 60.307257 573.631902 0 ] (Code/OcrImage/:__span-0-110) [ 1913 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-111) [ 1913 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-112) [ 1913 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-113) [ 1913 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-114) [ 1913 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-115) [ 1913 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-116) [ 1913 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-117) [ 1913 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-118) [ 1913 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-119) [ 1913 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-12) [ 1909 0 R /XYZ 60.307257 560.231550 0 ] (Code/OcrImage/:__span-0-120) [ 1913 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-121) [ 1913 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-122) [ 1913 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-123) [ 1913 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-124) [ 1913 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-125) [ 1913 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-126) [ 1913 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-127) [ 1913 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-128) [ 1913 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-129) [ 1915 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-13) [ 1909 0 R /XYZ 60.307257 546.831198 0 ] (Code/OcrImage/:__span-0-130) [ 1915 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-131) [ 1915 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-132) [ 1915 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-133) [ 1915 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-134) [ 1915 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-135) [ 1915 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-136) [ 1915 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-137) [ 1915 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-138) [ 1915 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-139) [ 1915 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-14) [ 1909 0 R /XYZ 60.307257 533.430846 0 ] (Code/OcrImage/:__span-0-140) [ 1915 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-141) [ 1915 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-142) [ 1915 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-143) [ 1915 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-144) [ 1915 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-145) [ 1915 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-146) [ 1915 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-147) [ 1915 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-148) [ 1915 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-149) [ 1915 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-15) [ 1909 0 R /XYZ 60.307257 520.030494 0 ] (Code/OcrImage/:__span-0-150) [ 1915 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-151) [ 1915 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-152) [ 1915 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-153) [ 1915 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-154) [ 1915 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-155) [ 1915 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-156) [ 1915 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-157) [ 1915 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-158) [ 1915 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-159) [ 1915 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-16) [ 1909 0 R /XYZ 60.307257 506.630142 0 ] (Code/OcrImage/:__span-0-160) [ 1915 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-161) [ 1915 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-162) [ 1915 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-163) [ 1915 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-164) [ 1915 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-165) [ 1915 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-166) [ 1915 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-167) [ 1915 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-168) [ 1915 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-169) [ 1915 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-17) [ 1909 0 R /XYZ 60.307257 493.229790 0 ] (Code/OcrImage/:__span-0-170) [ 1915 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-171) [ 1915 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-172) [ 1915 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-173) [ 1915 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-174) [ 1917 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-175) [ 1917 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-176) [ 1917 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-177) [ 1917 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-178) [ 1917 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-179) [ 1917 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-18) [ 1909 0 R /XYZ 60.307257 479.829438 0 ] (Code/OcrImage/:__span-0-180) [ 1917 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-181) [ 1917 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-182) [ 1917 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-183) [ 1917 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-184) [ 1917 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-185) [ 1917 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-186) [ 1917 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-187) [ 1917 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-188) [ 1917 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-189) [ 1917 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-19) [ 1909 0 R /XYZ 60.307257 453.028734 0 ] (Code/OcrImage/:__span-0-190) [ 1917 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-191) [ 1917 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-192) [ 1917 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-193) [ 1917 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-194) [ 1917 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-195) [ 1917 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-196) [ 1917 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-197) [ 1917 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-198) [ 1917 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-199) [ 1917 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-2) [ 1909 0 R /XYZ 60.307257 694.235070 0 ] (Code/OcrImage/:__span-0-20) [ 1909 0 R /XYZ 60.307257 426.228030 0 ] (Code/OcrImage/:__span-0-200) [ 1917 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-201) [ 1917 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-202) [ 1917 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-203) [ 1917 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-204) [ 1917 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-205) [ 1917 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-206) [ 1917 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-207) [ 1917 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-208) [ 1917 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-209) [ 1917 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-21) [ 1909 0 R /XYZ 60.307257 399.427326 0 ] (Code/OcrImage/:__span-0-210) [ 1917 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-211) [ 1917 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-212) [ 1917 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-213) [ 1917 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-214) [ 1917 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-215) [ 1917 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-216) [ 1917 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-217) [ 1919 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-218) [ 1919 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-219) [ 1919 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-22) [ 1909 0 R /XYZ 60.307257 386.026974 0 ] (Code/OcrImage/:__span-0-220) [ 1919 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-221) [ 1919 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-222) [ 1919 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-223) [ 1919 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-224) [ 1919 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-225) [ 1919 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-226) [ 1919 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-227) [ 1919 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-228) [ 1919 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-229) [ 1919 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-23) [ 1909 0 R /XYZ 60.307257 372.626622 0 ] (Code/OcrImage/:__span-0-230) [ 1919 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-231) [ 1919 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-232) [ 1919 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-233) [ 1919 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-234) [ 1919 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-235) [ 1919 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-236) [ 1919 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-237) [ 1919 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-238) [ 1919 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-239) [ 1919 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-24) [ 1909 0 R /XYZ 60.307257 359.226270 0 ] (Code/OcrImage/:__span-0-240) [ 1919 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-241) [ 1919 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-242) [ 1919 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-243) [ 1919 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-244) [ 1919 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-245) [ 1919 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-246) [ 1919 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-247) [ 1919 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-248) [ 1919 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-249) [ 1919 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-25) [ 1909 0 R /XYZ 60.307257 345.825918 0 ] (Code/OcrImage/:__span-0-250) [ 1919 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-251) [ 1919 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-252) [ 1919 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-253) [ 1919 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-254) [ 1919 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-255) [ 1919 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-256) [ 1919 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-257) [ 1919 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-258) [ 1919 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-259) [ 1919 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-26) [ 1909 0 R /XYZ 60.307257 332.425566 0 ] (Code/OcrImage/:__span-0-260) [ 1919 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-261) [ 1919 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-262) [ 1919 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-263) [ 1919 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-264) [ 1921 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-265) [ 1921 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-266) [ 1921 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-267) [ 1921 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-268) [ 1921 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-269) [ 1921 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-27) [ 1909 0 R /XYZ 60.307257 319.025214 0 ] (Code/OcrImage/:__span-0-270) [ 1921 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-271) [ 1921 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-272) [ 1921 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-273) [ 1921 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-274) [ 1921 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-275) [ 1921 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-276) [ 1921 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-277) [ 1921 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-278) [ 1921 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-279) [ 1921 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-28) [ 1909 0 R /XYZ 60.307257 305.624862 0 ] (Code/OcrImage/:__span-0-280) [ 1921 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-281) [ 1921 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-282) [ 1921 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-283) [ 1921 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-284) [ 1921 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-285) [ 1921 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-286) [ 1921 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-287) [ 1921 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-288) [ 1921 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-289) [ 1921 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-29) [ 1909 0 R /XYZ 60.307257 292.224510 0 ] (Code/OcrImage/:__span-0-290) [ 1921 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-291) [ 1921 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-292) [ 1921 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-293) [ 1921 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-294) [ 1921 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-295) [ 1921 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-296) [ 1921 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-297) [ 1921 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-298) [ 1921 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-299) [ 1921 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-3) [ 1909 0 R /XYZ 60.307257 680.834718 0 ] (Code/OcrImage/:__span-0-30) [ 1909 0 R /XYZ 60.307257 278.824158 0 ] (Code/OcrImage/:__span-0-300) [ 1921 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-301) [ 1921 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-302) [ 1921 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-303) [ 1921 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-304) [ 1921 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-305) [ 1921 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-306) [ 1921 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-307) [ 1921 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-308) [ 1921 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-309) [ 1921 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-31) [ 1909 0 R /XYZ 60.307257 265.423806 0 ] (Code/OcrImage/:__span-0-310) [ 1923 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-311) [ 1923 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-312) [ 1923 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-313) [ 1923 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-314) [ 1923 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-315) [ 1923 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-316) [ 1923 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-317) [ 1923 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-318) [ 1923 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-319) [ 1923 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-32) [ 1909 0 R /XYZ 60.307257 252.023454 0 ] (Code/OcrImage/:__span-0-320) [ 1923 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-321) [ 1923 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-322) [ 1923 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-323) [ 1923 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-324) [ 1923 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-325) [ 1923 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-326) [ 1923 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-327) [ 1923 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-328) [ 1923 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-329) [ 1923 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-33) [ 1909 0 R /XYZ 60.307257 238.623102 0 ] (Code/OcrImage/:__span-0-330) [ 1923 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-331) [ 1923 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-332) [ 1923 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-333) [ 1923 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-334) [ 1923 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-335) [ 1923 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-336) [ 1923 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-337) [ 1923 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-338) [ 1923 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-339) [ 1923 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-34) [ 1909 0 R /XYZ 60.307257 225.222750 0 ] (Code/OcrImage/:__span-0-340) [ 1923 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-341) [ 1923 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-342) [ 1923 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-343) [ 1923 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-344) [ 1923 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-345) [ 1923 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-346) [ 1923 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-347) [ 1923 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-348) [ 1923 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-349) [ 1923 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-35) [ 1909 0 R /XYZ 60.307257 211.822398 0 ] (Code/OcrImage/:__span-0-350) [ 1923 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-351) [ 1923 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-352) [ 1923 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-353) [ 1923 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-354) [ 1923 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-355) [ 1925 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-356) [ 1925 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-357) [ 1925 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-358) [ 1925 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-359) [ 1925 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-36) [ 1909 0 R /XYZ 60.307257 198.422046 0 ] (Code/OcrImage/:__span-0-360) [ 1925 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-361) [ 1925 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-362) [ 1925 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-363) [ 1925 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-364) [ 1925 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-365) [ 1925 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-366) [ 1925 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-367) [ 1925 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-368) [ 1925 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-369) [ 1925 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-37) [ 1909 0 R /XYZ 60.307257 185.021694 0 ] (Code/OcrImage/:__span-0-370) [ 1925 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-371) [ 1925 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-372) [ 1925 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-373) [ 1925 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-374) [ 1925 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-375) [ 1925 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-376) [ 1925 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-377) [ 1925 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-378) [ 1925 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-379) [ 1925 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-38) [ 1909 0 R /XYZ 60.307257 171.621342 0 ] (Code/OcrImage/:__span-0-380) [ 1925 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-381) [ 1925 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-382) [ 1925 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-383) [ 1925 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-384) [ 1925 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-385) [ 1925 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-386) [ 1925 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-387) [ 1925 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-388) [ 1925 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-389) [ 1925 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-39) [ 1909 0 R /XYZ 60.307257 158.220990 0 ] (Code/OcrImage/:__span-0-390) [ 1925 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-391) [ 1925 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-392) [ 1925 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-393) [ 1925 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-394) [ 1925 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-395) [ 1925 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-396) [ 1925 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-397) [ 1925 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-398) [ 1925 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-399) [ 1925 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-4) [ 1909 0 R /XYZ 60.307257 667.434366 0 ] (Code/OcrImage/:__span-0-40) [ 1909 0 R /XYZ 60.307257 144.820638 0 ] (Code/OcrImage/:__span-0-400) [ 1925 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-401) [ 1925 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-402) [ 1925 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-403) [ 1925 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-404) [ 1925 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-405) [ 1927 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-406) [ 1927 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-407) [ 1927 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-408) [ 1927 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-409) [ 1927 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-41) [ 1909 0 R /XYZ 60.307257 131.420286 0 ] (Code/OcrImage/:__span-0-410) [ 1927 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-411) [ 1927 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-412) [ 1927 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-413) [ 1927 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-414) [ 1927 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-415) [ 1927 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-416) [ 1927 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-417) [ 1927 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-418) [ 1927 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-419) [ 1927 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-42) [ 1909 0 R /XYZ 60.307257 118.019934 0 ] (Code/OcrImage/:__span-0-420) [ 1927 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-421) [ 1927 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-422) [ 1927 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-423) [ 1927 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-424) [ 1927 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-425) [ 1927 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-426) [ 1927 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-427) [ 1927 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-428) [ 1927 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-429) [ 1927 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-43) [ 1909 0 R /XYZ 60.307257 91.219230 0 ] (Code/OcrImage/:__span-0-430) [ 1927 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-431) [ 1927 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-432) [ 1927 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-433) [ 1927 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-434) [ 1927 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-435) [ 1927 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-436) [ 1927 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-437) [ 1927 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-438) [ 1927 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-439) [ 1927 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-44) [ 1911 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-440) [ 1927 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-441) [ 1927 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-442) [ 1927 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-443) [ 1927 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-444) [ 1927 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-445) [ 1927 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-446) [ 1927 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-447) [ 1927 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-448) [ 1927 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-449) [ 1927 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-45) [ 1911 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-450) [ 1927 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-451) [ 1929 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-452) [ 1929 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-453) [ 1929 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-454) [ 1929 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-455) [ 1929 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-456) [ 1929 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-457) [ 1929 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-458) [ 1929 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-459) [ 1929 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-46) [ 1911 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-460) [ 1929 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-461) [ 1929 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-462) [ 1929 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-463) [ 1929 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-464) [ 1929 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-465) [ 1929 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-466) [ 1929 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-467) [ 1929 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-468) [ 1929 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-469) [ 1929 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-47) [ 1911 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-470) [ 1929 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-471) [ 1929 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-472) [ 1929 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-473) [ 1929 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-474) [ 1929 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-475) [ 1929 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-476) [ 1929 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-477) [ 1929 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-478) [ 1929 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-479) [ 1929 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-48) [ 1911 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-480) [ 1929 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-481) [ 1929 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-482) [ 1929 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-483) [ 1929 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-484) [ 1929 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-485) [ 1929 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-486) [ 1929 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-487) [ 1929 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-488) [ 1929 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-489) [ 1929 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-49) [ 1911 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-490) [ 1929 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-491) [ 1929 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-492) [ 1929 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-493) [ 1929 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-494) [ 1929 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-495) [ 1929 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-496) [ 1931 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-497) [ 1931 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-498) [ 1931 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-499) [ 1931 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-5) [ 1909 0 R /XYZ 60.307257 654.034014 0 ] (Code/OcrImage/:__span-0-50) [ 1911 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-500) [ 1931 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-501) [ 1931 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-502) [ 1931 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-503) [ 1931 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-504) [ 1931 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-505) [ 1931 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-506) [ 1931 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-507) [ 1931 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-508) [ 1931 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-509) [ 1931 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-51) [ 1911 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-510) [ 1931 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-511) [ 1931 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-512) [ 1931 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-513) [ 1931 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-514) [ 1931 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-515) [ 1931 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-516) [ 1931 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-517) [ 1931 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-518) [ 1931 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-519) [ 1931 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-52) [ 1911 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-520) [ 1931 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-521) [ 1931 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-522) [ 1931 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-523) [ 1931 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-524) [ 1931 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-525) [ 1931 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-526) [ 1931 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-527) [ 1931 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-528) [ 1931 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-529) [ 1931 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-53) [ 1911 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-530) [ 1931 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-531) [ 1931 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-532) [ 1931 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-533) [ 1931 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-534) [ 1931 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-535) [ 1931 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-536) [ 1931 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-537) [ 1931 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-538) [ 1931 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-539) [ 1931 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-54) [ 1911 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-540) [ 1931 0 R /XYZ 60.307257 114.406374 0 ] (Code/OcrImage/:__span-0-541) [ 1931 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-542) [ 1931 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-543) [ 1933 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-544) [ 1933 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-545) [ 1933 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-546) [ 1933 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-547) [ 1933 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-548) [ 1933 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-549) [ 1933 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-55) [ 1911 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-550) [ 1933 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-551) [ 1933 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-552) [ 1933 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-553) [ 1933 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-554) [ 1933 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-555) [ 1933 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-556) [ 1933 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-557) [ 1933 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-558) [ 1933 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-559) [ 1933 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-56) [ 1911 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-560) [ 1933 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-561) [ 1933 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-562) [ 1933 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-563) [ 1933 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-564) [ 1933 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-565) [ 1933 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-566) [ 1933 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-567) [ 1933 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-568) [ 1933 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-569) [ 1933 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-57) [ 1911 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-570) [ 1933 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-571) [ 1933 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-572) [ 1933 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-573) [ 1933 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-574) [ 1933 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-575) [ 1933 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-576) [ 1933 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-577) [ 1933 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-578) [ 1933 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-579) [ 1933 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-58) [ 1911 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-580) [ 1933 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-581) [ 1933 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-582) [ 1933 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-583) [ 1933 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-584) [ 1933 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-585) [ 1933 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-586) [ 1933 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-587) [ 1933 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-588) [ 1933 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-589) [ 1933 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-59) [ 1911 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-590) [ 1935 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-591) [ 1935 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-592) [ 1935 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-593) [ 1935 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-594) [ 1935 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-595) [ 1935 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-596) [ 1935 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-597) [ 1935 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-598) [ 1935 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-599) [ 1935 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-6) [ 1909 0 R /XYZ 60.307257 640.633662 0 ] (Code/OcrImage/:__span-0-60) [ 1911 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-600) [ 1935 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-601) [ 1935 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-602) [ 1935 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-603) [ 1935 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-604) [ 1935 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-605) [ 1935 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-606) [ 1935 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-607) [ 1935 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-608) [ 1935 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-609) [ 1935 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-61) [ 1911 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-610) [ 1935 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-611) [ 1935 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-612) [ 1935 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-613) [ 1935 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-614) [ 1935 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-615) [ 1935 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-616) [ 1935 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-617) [ 1935 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-618) [ 1935 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-619) [ 1935 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-62) [ 1911 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-620) [ 1935 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-621) [ 1935 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-622) [ 1935 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-623) [ 1935 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-624) [ 1935 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-625) [ 1935 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-626) [ 1935 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-627) [ 1935 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-628) [ 1935 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-629) [ 1935 0 R /XYZ 60.307257 221.609190 0 ] (Code/OcrImage/:__span-0-63) [ 1911 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-630) [ 1935 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-631) [ 1935 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-632) [ 1935 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-633) [ 1935 0 R /XYZ 60.307257 168.007782 0 ] (Code/OcrImage/:__span-0-634) [ 1935 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-635) [ 1935 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-636) [ 1935 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-637) [ 1935 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-638) [ 1937 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-639) [ 1937 0 R /XYZ 60.307257 757.623270 0 ] (Code/OcrImage/:__span-0-64) [ 1911 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-640) [ 1937 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-641) [ 1937 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-642) [ 1937 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-643) [ 1937 0 R /XYZ 60.307257 704.021862 0 ] (Code/OcrImage/:__span-0-644) [ 1937 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-645) [ 1937 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-646) [ 1937 0 R /XYZ 60.307257 650.420454 0 ] (Code/OcrImage/:__span-0-647) [ 1937 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-648) [ 1937 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-649) [ 1937 0 R /XYZ 60.307257 596.819046 0 ] (Code/OcrImage/:__span-0-65) [ 1911 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-650) [ 1937 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-651) [ 1937 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-652) [ 1937 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-653) [ 1937 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-654) [ 1937 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-655) [ 1937 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:__span-0-656) [ 1937 0 R /XYZ 60.307257 503.016582 0 ] (Code/OcrImage/:__span-0-657) [ 1937 0 R /XYZ 60.307257 489.616230 0 ] (Code/OcrImage/:__span-0-658) [ 1937 0 R /XYZ 60.307257 476.215878 0 ] (Code/OcrImage/:__span-0-659) [ 1937 0 R /XYZ 60.307257 462.815526 0 ] (Code/OcrImage/:__span-0-66) [ 1911 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-660) [ 1937 0 R /XYZ 60.307257 449.415174 0 ] (Code/OcrImage/:__span-0-661) [ 1937 0 R /XYZ 60.307257 436.014822 0 ] (Code/OcrImage/:__span-0-662) [ 1937 0 R /XYZ 60.307257 422.614470 0 ] (Code/OcrImage/:__span-0-663) [ 1937 0 R /XYZ 60.307257 409.214118 0 ] (Code/OcrImage/:__span-0-664) [ 1937 0 R /XYZ 60.307257 395.813766 0 ] (Code/OcrImage/:__span-0-665) [ 1937 0 R /XYZ 60.307257 382.413414 0 ] (Code/OcrImage/:__span-0-666) [ 1937 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-667) [ 1937 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-668) [ 1937 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-669) [ 1937 0 R /XYZ 60.307257 328.812006 0 ] (Code/OcrImage/:__span-0-67) [ 1911 0 R /XYZ 60.307257 369.013062 0 ] (Code/OcrImage/:__span-0-670) [ 1937 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-671) [ 1937 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-672) [ 1937 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-673) [ 1937 0 R /XYZ 60.307257 275.210598 0 ] (Code/OcrImage/:__span-0-68) [ 1911 0 R /XYZ 60.307257 355.612710 0 ] (Code/OcrImage/:__span-0-69) [ 1911 0 R /XYZ 60.307257 342.212358 0 ] (Code/OcrImage/:__span-0-7) [ 1909 0 R /XYZ 60.307257 627.233310 0 ] (Code/OcrImage/:__span-0-70) [ 1911 0 R /XYZ 60.307257 315.411654 0 ] (Code/OcrImage/:__span-0-71) [ 1911 0 R /XYZ 60.307257 302.011302 0 ] (Code/OcrImage/:__span-0-72) [ 1911 0 R /XYZ 60.307257 288.610950 0 ] (Code/OcrImage/:__span-0-73) [ 1911 0 R /XYZ 60.307257 261.810246 0 ] (Code/OcrImage/:__span-0-74) [ 1911 0 R /XYZ 60.307257 248.409894 0 ] (Code/OcrImage/:__span-0-75) [ 1911 0 R /XYZ 60.307257 235.009542 0 ] (Code/OcrImage/:__span-0-76) [ 1911 0 R /XYZ 60.307257 208.208838 0 ] (Code/OcrImage/:__span-0-77) [ 1911 0 R /XYZ 60.307257 194.808486 0 ] (Code/OcrImage/:__span-0-78) [ 1911 0 R /XYZ 60.307257 181.408134 0 ] (Code/OcrImage/:__span-0-79) [ 1911 0 R /XYZ 60.307257 154.607430 0 ] (Code/OcrImage/:__span-0-8) [ 1909 0 R /XYZ 60.307257 613.832958 0 ] (Code/OcrImage/:__span-0-80) [ 1911 0 R /XYZ 60.307257 141.207078 0 ] (Code/OcrImage/:__span-0-81) [ 1911 0 R /XYZ 60.307257 127.806726 0 ] (Code/OcrImage/:__span-0-82) [ 1911 0 R /XYZ 60.307257 101.006022 0 ] (Code/OcrImage/:__span-0-83) [ 1911 0 R /XYZ 60.307257 87.605670 0 ] (Code/OcrImage/:__span-0-84) [ 1913 0 R /XYZ 60.307257 771.023622 0 ] (Code/OcrImage/:__span-0-85) [ 1913 0 R /XYZ 60.307257 744.222918 0 ] (Code/OcrImage/:__span-0-86) [ 1913 0 R /XYZ 60.307257 730.822566 0 ] (Code/OcrImage/:__span-0-87) [ 1913 0 R /XYZ 60.307257 717.422214 0 ] (Code/OcrImage/:__span-0-88) [ 1913 0 R /XYZ 60.307257 690.621510 0 ] (Code/OcrImage/:__span-0-89) [ 1913 0 R /XYZ 60.307257 677.221158 0 ] (Code/OcrImage/:__span-0-9) [ 1909 0 R /XYZ 60.307257 600.432606 0 ] (Code/OcrImage/:__span-0-90) [ 1913 0 R /XYZ 60.307257 663.820806 0 ] (Code/OcrImage/:__span-0-91) [ 1913 0 R /XYZ 60.307257 637.020102 0 ] (Code/OcrImage/:__span-0-92) [ 1913 0 R /XYZ 60.307257 623.619750 0 ] (Code/OcrImage/:__span-0-93) [ 1913 0 R /XYZ 60.307257 610.219398 0 ] (Code/OcrImage/:__span-0-94) [ 1913 0 R /XYZ 60.307257 583.418694 0 ] (Code/OcrImage/:__span-0-95) [ 1913 0 R /XYZ 60.307257 570.018342 0 ] (Code/OcrImage/:__span-0-96) [ 1913 0 R /XYZ 60.307257 556.617990 0 ] (Code/OcrImage/:__span-0-97) [ 1913 0 R /XYZ 60.307257 543.217638 0 ] (Code/OcrImage/:__span-0-98) [ 1913 0 R /XYZ 60.307257 529.817286 0 ] (Code/OcrImage/:__span-0-99) [ 1913 0 R /XYZ 60.307257 516.416934 0 ] (Code/OcrImage/:ocrimagecs) [ 1909 0 R /XYZ 39.386457 747.563622 0 ] (Code/Program/:) [ 1825 0 R /XYZ 39.386457 747.563622 0 ] (Code/Program/:__span-0-1) [ 1825 0 R /XYZ 60.307257 707.635422 0 ] (Code/Program/:__span-0-10) [ 1825 0 R /XYZ 60.307257 587.032254 0 ] (Code/Program/:__span-0-11) [ 1825 0 R /XYZ 60.307257 573.631902 0 ] (Code/Program/:__span-0-12) [ 1825 0 R /XYZ 60.307257 560.231550 0 ] (Code/Program/:__span-0-13) [ 1825 0 R /XYZ 60.307257 546.831198 0 ] (Code/Program/:__span-0-14) [ 1825 0 R /XYZ 60.307257 533.430846 0 ] (Code/Program/:__span-0-15) [ 1825 0 R /XYZ 60.307257 520.030494 0 ] (Code/Program/:__span-0-16) [ 1825 0 R /XYZ 60.307257 506.630142 0 ] (Code/Program/:__span-0-17) [ 1825 0 R /XYZ 60.307257 493.229790 0 ] (Code/Program/:__span-0-18) [ 1825 0 R /XYZ 60.307257 479.829438 0 ] (Code/Program/:__span-0-19) [ 1825 0 R /XYZ 60.307257 466.429086 0 ] (Code/Program/:__span-0-2) [ 1825 0 R /XYZ 60.307257 694.235070 0 ] (Code/Program/:__span-0-20) [ 1825 0 R /XYZ 60.307257 453.028734 0 ] (Code/Program/:__span-0-21) [ 1825 0 R /XYZ 60.307257 439.628382 0 ] (Code/Program/:__span-0-22) [ 1825 0 R /XYZ 60.307257 426.228030 0 ] (Code/Program/:__span-0-3) [ 1825 0 R /XYZ 60.307257 680.834718 0 ] (Code/Program/:__span-0-4) [ 1825 0 R /XYZ 60.307257 667.434366 0 ] (Code/Program/:__span-0-5) [ 1825 0 R /XYZ 60.307257 654.034014 0 ] (Code/Program/:__span-0-6) [ 1825 0 R /XYZ 60.307257 640.633662 0 ] (Code/Program/:__span-0-7) [ 1825 0 R /XYZ 60.307257 627.233310 0 ] (Code/Program/:__span-0-8) [ 1825 0 R /XYZ 60.307257 613.832958 0 ] (Code/Program/:__span-0-9) [ 1825 0 R /XYZ 60.307257 600.432606 0 ] (Code/Program/:programcs) [ 1825 0 R /XYZ 39.386457 747.563622 0 ] (Code/Reader/:) [ 1939 0 R /XYZ 39.386457 747.563622 0 ] (Code/Reader/:__span-0-1) [ 1939 0 R /XYZ 60.307257 707.635422 0 ] (Code/Reader/:__span-0-10) [ 1939 0 R /XYZ 60.307257 587.032254 0 ] (Code/Reader/:__span-0-100) [ 1943 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-101) [ 1943 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-102) [ 1943 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-103) [ 1943 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-104) [ 1943 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-105) [ 1943 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-106) [ 1943 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-107) [ 1943 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-108) [ 1943 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-109) [ 1943 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-11) [ 1939 0 R /XYZ 60.307257 573.631902 0 ] (Code/Reader/:__span-0-110) [ 1943 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-111) [ 1943 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-112) [ 1943 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-113) [ 1943 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-114) [ 1943 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-115) [ 1943 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-116) [ 1943 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-117) [ 1943 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-118) [ 1943 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-119) [ 1943 0 R /XYZ 60.307257 235.009542 0 ] (Code/Reader/:__span-0-12) [ 1939 0 R /XYZ 60.307257 560.231550 0 ] (Code/Reader/:__span-0-120) [ 1943 0 R /XYZ 60.307257 221.609190 0 ] (Code/Reader/:__span-0-121) [ 1943 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-122) [ 1943 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-123) [ 1943 0 R /XYZ 60.307257 181.408134 0 ] (Code/Reader/:__span-0-124) [ 1943 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-125) [ 1943 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-126) [ 1943 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-127) [ 1943 0 R /XYZ 60.307257 127.806726 0 ] (Code/Reader/:__span-0-128) [ 1943 0 R /XYZ 60.307257 101.006022 0 ] (Code/Reader/:__span-0-129) [ 1943 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-13) [ 1939 0 R /XYZ 60.307257 546.831198 0 ] (Code/Reader/:__span-0-130) [ 1945 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-131) [ 1945 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-132) [ 1945 0 R /XYZ 60.307257 744.222918 0 ] (Code/Reader/:__span-0-133) [ 1945 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-134) [ 1945 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-135) [ 1945 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-136) [ 1945 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-137) [ 1945 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-138) [ 1945 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-139) [ 1945 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-14) [ 1939 0 R /XYZ 60.307257 533.430846 0 ] (Code/Reader/:__span-0-140) [ 1945 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-141) [ 1945 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-142) [ 1945 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-143) [ 1945 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-144) [ 1945 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-145) [ 1945 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-146) [ 1945 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-147) [ 1945 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-148) [ 1945 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-149) [ 1945 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-15) [ 1939 0 R /XYZ 60.307257 520.030494 0 ] (Code/Reader/:__span-0-150) [ 1945 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-151) [ 1945 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-152) [ 1945 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-153) [ 1945 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-154) [ 1945 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-155) [ 1945 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-156) [ 1945 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-157) [ 1945 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-158) [ 1945 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-159) [ 1945 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-16) [ 1939 0 R /XYZ 60.307257 506.630142 0 ] (Code/Reader/:__span-0-160) [ 1945 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-161) [ 1945 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-162) [ 1945 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-163) [ 1945 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-164) [ 1945 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-165) [ 1945 0 R /XYZ 60.307257 261.810246 0 ] (Code/Reader/:__span-0-166) [ 1945 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-167) [ 1945 0 R /XYZ 60.307257 235.009542 0 ] (Code/Reader/:__span-0-168) [ 1945 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-169) [ 1945 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-17) [ 1939 0 R /XYZ 60.307257 493.229790 0 ] (Code/Reader/:__span-0-170) [ 1945 0 R /XYZ 60.307257 181.408134 0 ] (Code/Reader/:__span-0-171) [ 1945 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-172) [ 1945 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-173) [ 1945 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-174) [ 1945 0 R /XYZ 60.307257 127.806726 0 ] (Code/Reader/:__span-0-175) [ 1945 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-176) [ 1945 0 R /XYZ 60.307257 101.006022 0 ] (Code/Reader/:__span-0-177) [ 1945 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-178) [ 1947 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-179) [ 1947 0 R /XYZ 60.307257 744.222918 0 ] (Code/Reader/:__span-0-18) [ 1939 0 R /XYZ 60.307257 479.829438 0 ] (Code/Reader/:__span-0-180) [ 1947 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-181) [ 1947 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-182) [ 1947 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-183) [ 1947 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-184) [ 1947 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-185) [ 1947 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-186) [ 1947 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-187) [ 1947 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-188) [ 1947 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-189) [ 1947 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-19) [ 1939 0 R /XYZ 60.307257 466.429086 0 ] (Code/Reader/:__span-0-190) [ 1947 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-191) [ 1947 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-192) [ 1947 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-193) [ 1947 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-194) [ 1947 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-195) [ 1947 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-196) [ 1947 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-197) [ 1947 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-198) [ 1947 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-199) [ 1947 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-2) [ 1939 0 R /XYZ 60.307257 694.235070 0 ] (Code/Reader/:__span-0-20) [ 1939 0 R /XYZ 60.307257 453.028734 0 ] (Code/Reader/:__span-0-200) [ 1947 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-201) [ 1947 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-202) [ 1947 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-203) [ 1947 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-204) [ 1947 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-205) [ 1947 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-206) [ 1947 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-207) [ 1947 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-208) [ 1947 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-209) [ 1947 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-21) [ 1939 0 R /XYZ 60.307257 439.628382 0 ] (Code/Reader/:__span-0-210) [ 1947 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-211) [ 1947 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-212) [ 1947 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-213) [ 1947 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-214) [ 1947 0 R /XYZ 60.307257 261.810246 0 ] (Code/Reader/:__span-0-215) [ 1947 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-216) [ 1947 0 R /XYZ 60.307257 235.009542 0 ] (Code/Reader/:__span-0-217) [ 1947 0 R /XYZ 60.307257 221.609190 0 ] (Code/Reader/:__span-0-218) [ 1947 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-219) [ 1947 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-22) [ 1939 0 R /XYZ 60.307257 426.228030 0 ] (Code/Reader/:__span-0-220) [ 1947 0 R /XYZ 60.307257 181.408134 0 ] (Code/Reader/:__span-0-221) [ 1947 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-222) [ 1947 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-223) [ 1947 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-224) [ 1947 0 R /XYZ 60.307257 127.806726 0 ] (Code/Reader/:__span-0-225) [ 1947 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-226) [ 1947 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-227) [ 1949 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-228) [ 1949 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-229) [ 1949 0 R /XYZ 60.307257 744.222918 0 ] (Code/Reader/:__span-0-23) [ 1939 0 R /XYZ 60.307257 412.827678 0 ] (Code/Reader/:__span-0-230) [ 1949 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-231) [ 1949 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-232) [ 1949 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-233) [ 1949 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-234) [ 1949 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-235) [ 1949 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-236) [ 1949 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-237) [ 1949 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-238) [ 1949 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-239) [ 1949 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-24) [ 1939 0 R /XYZ 60.307257 399.427326 0 ] (Code/Reader/:__span-0-240) [ 1949 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-241) [ 1949 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-242) [ 1949 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-243) [ 1949 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-244) [ 1949 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-245) [ 1949 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-246) [ 1949 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-247) [ 1949 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-248) [ 1949 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-249) [ 1949 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-25) [ 1939 0 R /XYZ 60.307257 386.026974 0 ] (Code/Reader/:__span-0-250) [ 1949 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-251) [ 1949 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-252) [ 1949 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-253) [ 1949 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-254) [ 1949 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-255) [ 1949 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-256) [ 1949 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-257) [ 1949 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-258) [ 1949 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-259) [ 1949 0 R /XYZ 60.307257 221.609190 0 ] (Code/Reader/:__span-0-26) [ 1939 0 R /XYZ 60.307257 372.626622 0 ] (Code/Reader/:__span-0-260) [ 1949 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-261) [ 1949 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-262) [ 1949 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-263) [ 1949 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-264) [ 1949 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-265) [ 1949 0 R /XYZ 60.307257 101.006022 0 ] (Code/Reader/:__span-0-266) [ 1949 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-267) [ 1951 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-268) [ 1951 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-269) [ 1951 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-27) [ 1939 0 R /XYZ 60.307257 345.825918 0 ] (Code/Reader/:__span-0-270) [ 1951 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-271) [ 1951 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-272) [ 1951 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-273) [ 1951 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-274) [ 1951 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-275) [ 1951 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-276) [ 1951 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-277) [ 1951 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-278) [ 1951 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-279) [ 1951 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-28) [ 1939 0 R /XYZ 60.307257 332.425566 0 ] (Code/Reader/:__span-0-280) [ 1951 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-281) [ 1951 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-282) [ 1951 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-283) [ 1951 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-284) [ 1951 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-285) [ 1951 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-286) [ 1951 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-287) [ 1951 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-288) [ 1951 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-289) [ 1951 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-29) [ 1939 0 R /XYZ 60.307257 319.025214 0 ] (Code/Reader/:__span-0-290) [ 1951 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-291) [ 1951 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-292) [ 1951 0 R /XYZ 60.307257 342.212358 0 ] (Code/Reader/:__span-0-293) [ 1951 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-294) [ 1951 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-295) [ 1951 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-296) [ 1951 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-297) [ 1951 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-298) [ 1951 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-299) [ 1951 0 R /XYZ 60.307257 235.009542 0 ] (Code/Reader/:__span-0-3) [ 1939 0 R /XYZ 60.307257 680.834718 0 ] (Code/Reader/:__span-0-30) [ 1939 0 R /XYZ 60.307257 292.224510 0 ] (Code/Reader/:__span-0-300) [ 1951 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-301) [ 1951 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-302) [ 1951 0 R /XYZ 60.307257 181.408134 0 ] (Code/Reader/:__span-0-303) [ 1951 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-304) [ 1951 0 R /XYZ 60.307257 154.607430 0 ] (Code/Reader/:__span-0-305) [ 1951 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-306) [ 1951 0 R /XYZ 60.307257 127.806726 0 ] (Code/Reader/:__span-0-307) [ 1951 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-308) [ 1951 0 R /XYZ 60.307257 101.006022 0 ] (Code/Reader/:__span-0-309) [ 1951 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-31) [ 1939 0 R /XYZ 60.307257 278.824158 0 ] (Code/Reader/:__span-0-310) [ 1953 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-311) [ 1953 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-312) [ 1953 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-313) [ 1953 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-314) [ 1953 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-315) [ 1953 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-316) [ 1953 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-317) [ 1953 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-318) [ 1953 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-319) [ 1953 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-32) [ 1939 0 R /XYZ 60.307257 265.423806 0 ] (Code/Reader/:__span-0-320) [ 1953 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-321) [ 1953 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-322) [ 1953 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-323) [ 1953 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-324) [ 1953 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-325) [ 1953 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-326) [ 1953 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-327) [ 1953 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-328) [ 1953 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-329) [ 1953 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-33) [ 1939 0 R /XYZ 60.307257 252.023454 0 ] (Code/Reader/:__span-0-330) [ 1953 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-331) [ 1953 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-332) [ 1953 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-333) [ 1953 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-334) [ 1953 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-335) [ 1953 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-336) [ 1953 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-337) [ 1953 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-338) [ 1953 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-34) [ 1939 0 R /XYZ 60.307257 238.623102 0 ] (Code/Reader/:__span-0-35) [ 1939 0 R /XYZ 60.307257 225.222750 0 ] (Code/Reader/:__span-0-36) [ 1939 0 R /XYZ 60.307257 211.822398 0 ] (Code/Reader/:__span-0-37) [ 1939 0 R /XYZ 60.307257 198.422046 0 ] (Code/Reader/:__span-0-38) [ 1939 0 R /XYZ 60.307257 171.621342 0 ] (Code/Reader/:__span-0-39) [ 1939 0 R /XYZ 60.307257 158.220990 0 ] (Code/Reader/:__span-0-4) [ 1939 0 R /XYZ 60.307257 667.434366 0 ] (Code/Reader/:__span-0-40) [ 1939 0 R /XYZ 60.307257 131.420286 0 ] (Code/Reader/:__span-0-41) [ 1939 0 R /XYZ 60.307257 104.619582 0 ] (Code/Reader/:__span-0-42) [ 1939 0 R /XYZ 60.307257 91.219230 0 ] (Code/Reader/:__span-0-43) [ 1941 0 R /XYZ 60.307257 757.623270 0 ] (Code/Reader/:__span-0-44) [ 1941 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-45) [ 1941 0 R /XYZ 60.307257 717.422214 0 ] (Code/Reader/:__span-0-46) [ 1941 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-47) [ 1941 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-48) [ 1941 0 R /XYZ 60.307257 677.221158 0 ] (Code/Reader/:__span-0-49) [ 1941 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-5) [ 1939 0 R /XYZ 60.307257 654.034014 0 ] (Code/Reader/:__span-0-50) [ 1941 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-51) [ 1941 0 R /XYZ 60.307257 637.020102 0 ] (Code/Reader/:__span-0-52) [ 1941 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-53) [ 1941 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-54) [ 1941 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-55) [ 1941 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-56) [ 1941 0 R /XYZ 60.307257 570.018342 0 ] (Code/Reader/:__span-0-57) [ 1941 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-58) [ 1941 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:__span-0-59) [ 1941 0 R /XYZ 60.307257 529.817286 0 ] (Code/Reader/:__span-0-6) [ 1939 0 R /XYZ 60.307257 640.633662 0 ] (Code/Reader/:__span-0-60) [ 1941 0 R /XYZ 60.307257 516.416934 0 ] (Code/Reader/:__span-0-61) [ 1941 0 R /XYZ 60.307257 503.016582 0 ] (Code/Reader/:__span-0-62) [ 1941 0 R /XYZ 60.307257 489.616230 0 ] (Code/Reader/:__span-0-63) [ 1941 0 R /XYZ 60.307257 476.215878 0 ] (Code/Reader/:__span-0-64) [ 1941 0 R /XYZ 60.307257 462.815526 0 ] (Code/Reader/:__span-0-65) [ 1941 0 R /XYZ 60.307257 449.415174 0 ] (Code/Reader/:__span-0-66) [ 1941 0 R /XYZ 60.307257 436.014822 0 ] (Code/Reader/:__span-0-67) [ 1941 0 R /XYZ 60.307257 422.614470 0 ] (Code/Reader/:__span-0-68) [ 1941 0 R /XYZ 60.307257 409.214118 0 ] (Code/Reader/:__span-0-69) [ 1941 0 R /XYZ 60.307257 395.813766 0 ] (Code/Reader/:__span-0-7) [ 1939 0 R /XYZ 60.307257 627.233310 0 ] (Code/Reader/:__span-0-70) [ 1941 0 R /XYZ 60.307257 382.413414 0 ] (Code/Reader/:__span-0-71) [ 1941 0 R /XYZ 60.307257 369.013062 0 ] (Code/Reader/:__span-0-72) [ 1941 0 R /XYZ 60.307257 355.612710 0 ] (Code/Reader/:__span-0-73) [ 1941 0 R /XYZ 60.307257 328.812006 0 ] (Code/Reader/:__span-0-74) [ 1941 0 R /XYZ 60.307257 315.411654 0 ] (Code/Reader/:__span-0-75) [ 1941 0 R /XYZ 60.307257 302.011302 0 ] (Code/Reader/:__span-0-76) [ 1941 0 R /XYZ 60.307257 288.610950 0 ] (Code/Reader/:__span-0-77) [ 1941 0 R /XYZ 60.307257 275.210598 0 ] (Code/Reader/:__span-0-78) [ 1941 0 R /XYZ 60.307257 261.810246 0 ] (Code/Reader/:__span-0-79) [ 1941 0 R /XYZ 60.307257 248.409894 0 ] (Code/Reader/:__span-0-8) [ 1939 0 R /XYZ 60.307257 613.832958 0 ] (Code/Reader/:__span-0-80) [ 1941 0 R /XYZ 60.307257 221.609190 0 ] (Code/Reader/:__span-0-81) [ 1941 0 R /XYZ 60.307257 208.208838 0 ] (Code/Reader/:__span-0-82) [ 1941 0 R /XYZ 60.307257 194.808486 0 ] (Code/Reader/:__span-0-83) [ 1941 0 R /XYZ 60.307257 168.007782 0 ] (Code/Reader/:__span-0-84) [ 1941 0 R /XYZ 60.307257 141.207078 0 ] (Code/Reader/:__span-0-85) [ 1941 0 R /XYZ 60.307257 114.406374 0 ] (Code/Reader/:__span-0-86) [ 1941 0 R /XYZ 60.307257 87.605670 0 ] (Code/Reader/:__span-0-87) [ 1943 0 R /XYZ 60.307257 771.023622 0 ] (Code/Reader/:__span-0-88) [ 1943 0 R /XYZ 60.307257 744.222918 0 ] (Code/Reader/:__span-0-89) [ 1943 0 R /XYZ 60.307257 730.822566 0 ] (Code/Reader/:__span-0-9) [ 1939 0 R /XYZ 60.307257 600.432606 0 ] (Code/Reader/:__span-0-90) [ 1943 0 R /XYZ 60.307257 704.021862 0 ] (Code/Reader/:__span-0-91) [ 1943 0 R /XYZ 60.307257 690.621510 0 ] (Code/Reader/:__span-0-92) [ 1943 0 R /XYZ 60.307257 663.820806 0 ] (Code/Reader/:__span-0-93) [ 1943 0 R /XYZ 60.307257 650.420454 0 ] (Code/Reader/:__span-0-94) [ 1943 0 R /XYZ 60.307257 623.619750 0 ] (Code/Reader/:__span-0-95) [ 1943 0 R /XYZ 60.307257 610.219398 0 ] (Code/Reader/:__span-0-96) [ 1943 0 R /XYZ 60.307257 596.819046 0 ] (Code/Reader/:__span-0-97) [ 1943 0 R /XYZ 60.307257 583.418694 0 ] (Code/Reader/:__span-0-98) [ 1943 0 R /XYZ 60.307257 556.617990 0 ] (Code/Reader/:__span-0-99) [ 1943 0 R /XYZ 60.307257 543.217638 0 ] (Code/Reader/:readercs) [ 1939 0 R /XYZ 39.386457 747.563622 0 ] (Code/Settings.Designer/:) [ 1827 0 R /XYZ 39.386457 747.563622 0 ] (Code/Settings.Designer/:__span-0-1) [ 1827 0 R /XYZ 60.307257 707.635422 0 ] (Code/Settings.Designer/:__span-0-10) [ 1827 0 R /XYZ 60.307257 587.032254 0 ] (Code/Settings.Designer/:__span-0-100) [ 1831 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-101) [ 1831 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-102) [ 1831 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-103) [ 1831 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-104) [ 1831 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-105) [ 1831 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-106) [ 1831 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-107) [ 1831 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-108) [ 1831 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-109) [ 1831 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-11) [ 1827 0 R /XYZ 60.307257 573.631902 0 ] (Code/Settings.Designer/:__span-0-110) [ 1831 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-111) [ 1831 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-112) [ 1831 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-113) [ 1831 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-114) [ 1831 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-115) [ 1831 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-116) [ 1831 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-117) [ 1831 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-118) [ 1831 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-119) [ 1831 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-12) [ 1827 0 R /XYZ 60.307257 560.231550 0 ] (Code/Settings.Designer/:__span-0-120) [ 1831 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-121) [ 1831 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-122) [ 1831 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-123) [ 1831 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-124) [ 1831 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-125) [ 1831 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-126) [ 1831 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-127) [ 1831 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-128) [ 1831 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-129) [ 1831 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-13) [ 1827 0 R /XYZ 60.307257 546.831198 0 ] (Code/Settings.Designer/:__span-0-130) [ 1831 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-131) [ 1831 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-132) [ 1831 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-133) [ 1833 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-134) [ 1833 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-135) [ 1833 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-136) [ 1833 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-137) [ 1833 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-138) [ 1833 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-139) [ 1833 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-14) [ 1827 0 R /XYZ 60.307257 520.030494 0 ] (Code/Settings.Designer/:__span-0-140) [ 1833 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-141) [ 1833 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-142) [ 1833 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-143) [ 1833 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-144) [ 1833 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-145) [ 1833 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-146) [ 1833 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-147) [ 1833 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-148) [ 1833 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-149) [ 1833 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-15) [ 1827 0 R /XYZ 60.307257 506.630142 0 ] (Code/Settings.Designer/:__span-0-150) [ 1833 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-151) [ 1833 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-152) [ 1833 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-153) [ 1833 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-154) [ 1833 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-155) [ 1833 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-156) [ 1833 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-157) [ 1833 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-158) [ 1833 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-159) [ 1833 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-16) [ 1827 0 R /XYZ 60.307257 493.229790 0 ] (Code/Settings.Designer/:__span-0-160) [ 1833 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-161) [ 1833 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-162) [ 1833 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-163) [ 1833 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-164) [ 1833 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-165) [ 1833 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-166) [ 1833 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-167) [ 1833 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-168) [ 1833 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-169) [ 1833 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-17) [ 1827 0 R /XYZ 60.307257 479.829438 0 ] (Code/Settings.Designer/:__span-0-170) [ 1833 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-171) [ 1833 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-172) [ 1833 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-173) [ 1833 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-174) [ 1835 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-175) [ 1835 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-176) [ 1835 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-177) [ 1835 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-178) [ 1835 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-179) [ 1835 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-18) [ 1827 0 R /XYZ 60.307257 466.429086 0 ] (Code/Settings.Designer/:__span-0-180) [ 1835 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-181) [ 1835 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-182) [ 1835 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-183) [ 1835 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-184) [ 1835 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-185) [ 1835 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-186) [ 1835 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-187) [ 1835 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-188) [ 1835 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-189) [ 1835 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-19) [ 1827 0 R /XYZ 60.307257 453.028734 0 ] (Code/Settings.Designer/:__span-0-190) [ 1835 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-191) [ 1835 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-192) [ 1835 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-193) [ 1835 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-194) [ 1835 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-195) [ 1835 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-196) [ 1835 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-197) [ 1835 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-198) [ 1835 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-199) [ 1835 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-2) [ 1827 0 R /XYZ 60.307257 694.235070 0 ] (Code/Settings.Designer/:__span-0-20) [ 1827 0 R /XYZ 60.307257 439.628382 0 ] (Code/Settings.Designer/:__span-0-200) [ 1835 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-201) [ 1835 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-202) [ 1835 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-203) [ 1835 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-204) [ 1835 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-205) [ 1835 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-206) [ 1835 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-207) [ 1835 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-208) [ 1835 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-209) [ 1835 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-21) [ 1827 0 R /XYZ 60.307257 426.228030 0 ] (Code/Settings.Designer/:__span-0-210) [ 1835 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-211) [ 1835 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-212) [ 1835 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-213) [ 1835 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-214) [ 1835 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-215) [ 1835 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-216) [ 1835 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-217) [ 1835 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-218) [ 1835 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-219) [ 1837 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-22) [ 1827 0 R /XYZ 60.307257 412.827678 0 ] (Code/Settings.Designer/:__span-0-220) [ 1837 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-221) [ 1837 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-222) [ 1837 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-223) [ 1837 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-224) [ 1837 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-225) [ 1837 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-226) [ 1837 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-227) [ 1837 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-228) [ 1837 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-229) [ 1837 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-23) [ 1827 0 R /XYZ 60.307257 399.427326 0 ] (Code/Settings.Designer/:__span-0-230) [ 1837 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-231) [ 1837 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-232) [ 1837 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-233) [ 1837 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-234) [ 1837 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-235) [ 1837 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-236) [ 1837 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-237) [ 1837 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-238) [ 1837 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-239) [ 1837 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-24) [ 1827 0 R /XYZ 60.307257 386.026974 0 ] (Code/Settings.Designer/:__span-0-240) [ 1837 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-241) [ 1837 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-242) [ 1837 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-243) [ 1837 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-244) [ 1837 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-245) [ 1837 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-246) [ 1837 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-247) [ 1837 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-248) [ 1837 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-249) [ 1837 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-25) [ 1827 0 R /XYZ 60.307257 372.626622 0 ] (Code/Settings.Designer/:__span-0-250) [ 1837 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-251) [ 1837 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-252) [ 1837 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-253) [ 1837 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-254) [ 1837 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-255) [ 1837 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-256) [ 1837 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-257) [ 1837 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-258) [ 1837 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-259) [ 1837 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-26) [ 1827 0 R /XYZ 60.307257 359.226270 0 ] (Code/Settings.Designer/:__span-0-260) [ 1837 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-261) [ 1837 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-262) [ 1837 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-263) [ 1839 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-264) [ 1839 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-265) [ 1839 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-266) [ 1839 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-267) [ 1839 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-268) [ 1839 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-269) [ 1839 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-27) [ 1827 0 R /XYZ 60.307257 345.825918 0 ] (Code/Settings.Designer/:__span-0-270) [ 1839 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-271) [ 1839 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-272) [ 1839 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-273) [ 1839 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-274) [ 1839 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-275) [ 1839 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-276) [ 1839 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-277) [ 1839 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-278) [ 1839 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-279) [ 1839 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-28) [ 1827 0 R /XYZ 60.307257 332.425566 0 ] (Code/Settings.Designer/:__span-0-280) [ 1839 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-281) [ 1839 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-282) [ 1839 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-283) [ 1839 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-284) [ 1839 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-285) [ 1839 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-286) [ 1839 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-287) [ 1839 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-288) [ 1839 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-289) [ 1839 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-29) [ 1827 0 R /XYZ 60.307257 319.025214 0 ] (Code/Settings.Designer/:__span-0-290) [ 1839 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-291) [ 1839 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-292) [ 1839 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-293) [ 1839 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-294) [ 1839 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-295) [ 1839 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-296) [ 1839 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-297) [ 1839 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-298) [ 1839 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-299) [ 1839 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-3) [ 1827 0 R /XYZ 60.307257 680.834718 0 ] (Code/Settings.Designer/:__span-0-30) [ 1827 0 R /XYZ 60.307257 305.624862 0 ] (Code/Settings.Designer/:__span-0-300) [ 1839 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-301) [ 1839 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-302) [ 1839 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-303) [ 1839 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-304) [ 1839 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-305) [ 1839 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-306) [ 1839 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-307) [ 1839 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-308) [ 1839 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-309) [ 1841 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-31) [ 1827 0 R /XYZ 60.307257 292.224510 0 ] (Code/Settings.Designer/:__span-0-310) [ 1841 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-311) [ 1841 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-312) [ 1841 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-313) [ 1841 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-314) [ 1841 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-315) [ 1841 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-316) [ 1841 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-317) [ 1841 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-318) [ 1841 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-319) [ 1841 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-32) [ 1827 0 R /XYZ 60.307257 278.824158 0 ] (Code/Settings.Designer/:__span-0-320) [ 1841 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-321) [ 1841 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-322) [ 1841 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-323) [ 1841 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-324) [ 1841 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-325) [ 1841 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-326) [ 1841 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-327) [ 1841 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-328) [ 1841 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-329) [ 1841 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-33) [ 1827 0 R /XYZ 60.307257 265.423806 0 ] (Code/Settings.Designer/:__span-0-330) [ 1841 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-331) [ 1841 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-332) [ 1841 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-333) [ 1841 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-334) [ 1841 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-335) [ 1841 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-336) [ 1841 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-337) [ 1841 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-338) [ 1841 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-339) [ 1841 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-34) [ 1827 0 R /XYZ 60.307257 252.023454 0 ] (Code/Settings.Designer/:__span-0-340) [ 1841 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-341) [ 1841 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-342) [ 1841 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-343) [ 1841 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-344) [ 1841 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-345) [ 1841 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-346) [ 1841 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-347) [ 1841 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-348) [ 1841 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-349) [ 1841 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-35) [ 1827 0 R /XYZ 60.307257 238.623102 0 ] (Code/Settings.Designer/:__span-0-350) [ 1843 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-351) [ 1843 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-352) [ 1843 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-353) [ 1843 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-354) [ 1843 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-355) [ 1843 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-356) [ 1843 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-357) [ 1843 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-358) [ 1843 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-359) [ 1843 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-36) [ 1827 0 R /XYZ 60.307257 225.222750 0 ] (Code/Settings.Designer/:__span-0-360) [ 1843 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-361) [ 1843 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-362) [ 1843 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-363) [ 1843 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-364) [ 1843 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-365) [ 1843 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-366) [ 1843 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-367) [ 1843 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-368) [ 1843 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-369) [ 1843 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-37) [ 1827 0 R /XYZ 60.307257 211.822398 0 ] (Code/Settings.Designer/:__span-0-370) [ 1843 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-371) [ 1843 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-372) [ 1843 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-373) [ 1843 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-374) [ 1843 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-375) [ 1843 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-376) [ 1843 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-377) [ 1843 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-378) [ 1843 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-379) [ 1843 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-38) [ 1827 0 R /XYZ 60.307257 198.422046 0 ] (Code/Settings.Designer/:__span-0-380) [ 1843 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-381) [ 1843 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-382) [ 1843 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-383) [ 1843 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-384) [ 1843 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-385) [ 1843 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-386) [ 1843 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-387) [ 1843 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-388) [ 1843 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-389) [ 1843 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-39) [ 1827 0 R /XYZ 60.307257 185.021694 0 ] (Code/Settings.Designer/:__span-0-390) [ 1843 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-391) [ 1843 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-392) [ 1843 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-393) [ 1845 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-394) [ 1845 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-395) [ 1845 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-396) [ 1845 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-397) [ 1845 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-398) [ 1845 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-399) [ 1845 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-4) [ 1827 0 R /XYZ 60.307257 667.434366 0 ] (Code/Settings.Designer/:__span-0-40) [ 1827 0 R /XYZ 60.307257 171.621342 0 ] (Code/Settings.Designer/:__span-0-400) [ 1845 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-401) [ 1845 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-402) [ 1845 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-403) [ 1845 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-404) [ 1845 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-405) [ 1845 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-406) [ 1845 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-407) [ 1845 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-408) [ 1845 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-409) [ 1845 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-41) [ 1827 0 R /XYZ 60.307257 158.220990 0 ] (Code/Settings.Designer/:__span-0-410) [ 1845 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-411) [ 1845 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-412) [ 1845 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-413) [ 1845 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-414) [ 1845 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-415) [ 1845 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-416) [ 1845 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-417) [ 1845 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-418) [ 1845 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-419) [ 1845 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-42) [ 1827 0 R /XYZ 60.307257 144.820638 0 ] (Code/Settings.Designer/:__span-0-420) [ 1845 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-421) [ 1845 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-422) [ 1845 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-423) [ 1845 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-424) [ 1845 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-425) [ 1845 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-426) [ 1845 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-427) [ 1845 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-428) [ 1845 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-429) [ 1845 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-43) [ 1827 0 R /XYZ 60.307257 131.420286 0 ] (Code/Settings.Designer/:__span-0-430) [ 1845 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-431) [ 1845 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-432) [ 1845 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-433) [ 1845 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-434) [ 1845 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-435) [ 1845 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-436) [ 1845 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-437) [ 1847 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-438) [ 1847 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-439) [ 1847 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-44) [ 1827 0 R /XYZ 60.307257 118.019934 0 ] (Code/Settings.Designer/:__span-0-440) [ 1847 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-441) [ 1847 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-442) [ 1847 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-443) [ 1847 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-444) [ 1847 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-445) [ 1847 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-446) [ 1847 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-447) [ 1847 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-448) [ 1847 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-449) [ 1847 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-45) [ 1827 0 R /XYZ 60.307257 104.619582 0 ] (Code/Settings.Designer/:__span-0-450) [ 1847 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings.Designer/:__span-0-451) [ 1847 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-452) [ 1847 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-453) [ 1847 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings.Designer/:__span-0-454) [ 1847 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-455) [ 1847 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-456) [ 1847 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-457) [ 1847 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-458) [ 1847 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-459) [ 1847 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-46) [ 1827 0 R /XYZ 60.307257 91.219230 0 ] (Code/Settings.Designer/:__span-0-460) [ 1847 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings.Designer/:__span-0-461) [ 1847 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-462) [ 1847 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-463) [ 1847 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-464) [ 1847 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-465) [ 1847 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-466) [ 1847 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-467) [ 1847 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-468) [ 1847 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-469) [ 1847 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-47) [ 1829 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-470) [ 1847 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-471) [ 1847 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-472) [ 1847 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings.Designer/:__span-0-473) [ 1847 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-474) [ 1847 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-475) [ 1847 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-476) [ 1847 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-477) [ 1847 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-478) [ 1847 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-479) [ 1847 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-48) [ 1829 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-480) [ 1847 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-481) [ 1847 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-482) [ 1847 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-483) [ 1847 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings.Designer/:__span-0-484) [ 1847 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings.Designer/:__span-0-485) [ 1849 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-486) [ 1849 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings.Designer/:__span-0-487) [ 1849 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-488) [ 1849 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-489) [ 1849 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-49) [ 1829 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-490) [ 1849 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-491) [ 1849 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-492) [ 1849 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-493) [ 1849 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-494) [ 1849 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-5) [ 1827 0 R /XYZ 60.307257 654.034014 0 ] (Code/Settings.Designer/:__span-0-50) [ 1829 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-51) [ 1829 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-52) [ 1829 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings.Designer/:__span-0-53) [ 1829 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings.Designer/:__span-0-54) [ 1829 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-55) [ 1829 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-56) [ 1829 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:__span-0-57) [ 1829 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings.Designer/:__span-0-58) [ 1829 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings.Designer/:__span-0-59) [ 1829 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings.Designer/:__span-0-6) [ 1827 0 R /XYZ 60.307257 640.633662 0 ] (Code/Settings.Designer/:__span-0-60) [ 1829 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings.Designer/:__span-0-61) [ 1829 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings.Designer/:__span-0-62) [ 1829 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings.Designer/:__span-0-63) [ 1829 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings.Designer/:__span-0-64) [ 1829 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings.Designer/:__span-0-65) [ 1829 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings.Designer/:__span-0-66) [ 1829 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings.Designer/:__span-0-67) [ 1829 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings.Designer/:__span-0-68) [ 1829 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings.Designer/:__span-0-69) [ 1829 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings.Designer/:__span-0-7) [ 1827 0 R /XYZ 60.307257 627.233310 0 ] (Code/Settings.Designer/:__span-0-70) [ 1829 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings.Designer/:__span-0-71) [ 1829 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings.Designer/:__span-0-72) [ 1829 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings.Designer/:__span-0-73) [ 1829 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings.Designer/:__span-0-74) [ 1829 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings.Designer/:__span-0-75) [ 1829 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings.Designer/:__span-0-76) [ 1829 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings.Designer/:__span-0-77) [ 1829 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings.Designer/:__span-0-78) [ 1829 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings.Designer/:__span-0-79) [ 1829 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings.Designer/:__span-0-8) [ 1827 0 R /XYZ 60.307257 613.832958 0 ] (Code/Settings.Designer/:__span-0-80) [ 1829 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings.Designer/:__span-0-81) [ 1829 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings.Designer/:__span-0-82) [ 1829 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings.Designer/:__span-0-83) [ 1829 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings.Designer/:__span-0-84) [ 1829 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings.Designer/:__span-0-85) [ 1829 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings.Designer/:__span-0-86) [ 1829 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings.Designer/:__span-0-87) [ 1829 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings.Designer/:__span-0-88) [ 1829 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings.Designer/:__span-0-89) [ 1829 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings.Designer/:__span-0-9) [ 1827 0 R /XYZ 60.307257 600.432606 0 ] (Code/Settings.Designer/:__span-0-90) [ 1829 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings.Designer/:__span-0-91) [ 1829 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings.Designer/:__span-0-92) [ 1829 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings.Designer/:__span-0-93) [ 1831 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings.Designer/:__span-0-94) [ 1831 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings.Designer/:__span-0-95) [ 1831 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings.Designer/:__span-0-96) [ 1831 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings.Designer/:__span-0-97) [ 1831 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings.Designer/:__span-0-98) [ 1831 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings.Designer/:__span-0-99) [ 1831 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings.Designer/:settingsdesignercs) [ 1827 0 R /XYZ 39.386457 747.563622 0 ] (Code/Settings/:) [ 1955 0 R /XYZ 39.386457 747.563622 0 ] (Code/Settings/:__span-0-1) [ 1955 0 R /XYZ 60.307257 707.635422 0 ] (Code/Settings/:__span-0-10) [ 1955 0 R /XYZ 60.307257 587.032254 0 ] (Code/Settings/:__span-0-100) [ 1959 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-101) [ 1959 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-102) [ 1959 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-103) [ 1959 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-104) [ 1959 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-105) [ 1959 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-106) [ 1959 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-107) [ 1959 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-108) [ 1959 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-109) [ 1959 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-11) [ 1955 0 R /XYZ 60.307257 573.631902 0 ] (Code/Settings/:__span-0-110) [ 1959 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-111) [ 1959 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-112) [ 1959 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-113) [ 1959 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-114) [ 1959 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-115) [ 1959 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-116) [ 1959 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-117) [ 1959 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-118) [ 1959 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-119) [ 1959 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-12) [ 1955 0 R /XYZ 60.307257 560.231550 0 ] (Code/Settings/:__span-0-120) [ 1959 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-121) [ 1959 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-122) [ 1959 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-123) [ 1959 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-124) [ 1959 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-125) [ 1959 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-126) [ 1959 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-127) [ 1959 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-128) [ 1959 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-129) [ 1959 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-13) [ 1955 0 R /XYZ 60.307257 546.831198 0 ] (Code/Settings/:__span-0-130) [ 1959 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-131) [ 1959 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-132) [ 1959 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-133) [ 1959 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-134) [ 1959 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-135) [ 1959 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-136) [ 1959 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-137) [ 1959 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-138) [ 1959 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-139) [ 1961 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-14) [ 1955 0 R /XYZ 60.307257 533.430846 0 ] (Code/Settings/:__span-0-140) [ 1961 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-141) [ 1961 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-142) [ 1961 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-143) [ 1961 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-144) [ 1961 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-145) [ 1961 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-146) [ 1961 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-147) [ 1961 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-148) [ 1961 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-149) [ 1961 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-15) [ 1955 0 R /XYZ 60.307257 520.030494 0 ] (Code/Settings/:__span-0-150) [ 1961 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-151) [ 1961 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-152) [ 1961 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-153) [ 1961 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-154) [ 1961 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-155) [ 1961 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-156) [ 1961 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-157) [ 1961 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-158) [ 1961 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-159) [ 1961 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-16) [ 1955 0 R /XYZ 60.307257 506.630142 0 ] (Code/Settings/:__span-0-160) [ 1961 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-161) [ 1961 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-162) [ 1961 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-163) [ 1961 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-164) [ 1961 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-165) [ 1961 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-166) [ 1961 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-167) [ 1961 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-168) [ 1961 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-169) [ 1961 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-17) [ 1955 0 R /XYZ 60.307257 493.229790 0 ] (Code/Settings/:__span-0-170) [ 1961 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-171) [ 1961 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-172) [ 1961 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-173) [ 1961 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-174) [ 1961 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-175) [ 1961 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-176) [ 1961 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-177) [ 1961 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-178) [ 1961 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-179) [ 1961 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-18) [ 1955 0 R /XYZ 60.307257 479.829438 0 ] (Code/Settings/:__span-0-180) [ 1961 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-181) [ 1961 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-182) [ 1961 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-183) [ 1961 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-184) [ 1961 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-185) [ 1961 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-186) [ 1961 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-187) [ 1961 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-188) [ 1961 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-189) [ 1961 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-19) [ 1955 0 R /XYZ 60.307257 466.429086 0 ] (Code/Settings/:__span-0-190) [ 1961 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-191) [ 1963 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-192) [ 1963 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-193) [ 1963 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-194) [ 1963 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-195) [ 1963 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-196) [ 1963 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-197) [ 1963 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-198) [ 1963 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-199) [ 1963 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-2) [ 1955 0 R /XYZ 60.307257 694.235070 0 ] (Code/Settings/:__span-0-20) [ 1955 0 R /XYZ 60.307257 453.028734 0 ] (Code/Settings/:__span-0-200) [ 1963 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-201) [ 1963 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-202) [ 1963 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-203) [ 1963 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-204) [ 1963 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-205) [ 1963 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-206) [ 1963 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-207) [ 1963 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-208) [ 1963 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-209) [ 1963 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-21) [ 1955 0 R /XYZ 60.307257 439.628382 0 ] (Code/Settings/:__span-0-210) [ 1963 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-211) [ 1963 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-212) [ 1963 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-213) [ 1963 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-214) [ 1963 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-215) [ 1963 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-216) [ 1963 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-217) [ 1963 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-218) [ 1963 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-219) [ 1963 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-22) [ 1955 0 R /XYZ 60.307257 426.228030 0 ] (Code/Settings/:__span-0-220) [ 1963 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-221) [ 1963 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-222) [ 1963 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-223) [ 1963 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-224) [ 1963 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-225) [ 1963 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-226) [ 1963 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-227) [ 1963 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-228) [ 1963 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-229) [ 1963 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-23) [ 1955 0 R /XYZ 60.307257 412.827678 0 ] (Code/Settings/:__span-0-230) [ 1963 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-231) [ 1963 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-232) [ 1963 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-233) [ 1963 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-234) [ 1963 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-235) [ 1963 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-236) [ 1963 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-237) [ 1963 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-238) [ 1965 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-239) [ 1965 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-24) [ 1955 0 R /XYZ 60.307257 399.427326 0 ] (Code/Settings/:__span-0-240) [ 1965 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-241) [ 1965 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-242) [ 1965 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-243) [ 1965 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-244) [ 1965 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-245) [ 1965 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-246) [ 1965 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-247) [ 1965 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-248) [ 1965 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-249) [ 1965 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-25) [ 1955 0 R /XYZ 60.307257 386.026974 0 ] (Code/Settings/:__span-0-250) [ 1965 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-251) [ 1965 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-252) [ 1965 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-253) [ 1965 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-254) [ 1965 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-255) [ 1965 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-256) [ 1965 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-257) [ 1965 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-258) [ 1965 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-259) [ 1965 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-26) [ 1955 0 R /XYZ 60.307257 372.626622 0 ] (Code/Settings/:__span-0-260) [ 1965 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-261) [ 1965 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-262) [ 1965 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-263) [ 1965 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-264) [ 1965 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-265) [ 1965 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-266) [ 1965 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-267) [ 1965 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-268) [ 1965 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-269) [ 1965 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-27) [ 1955 0 R /XYZ 60.307257 359.226270 0 ] (Code/Settings/:__span-0-270) [ 1965 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-271) [ 1965 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-272) [ 1965 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-273) [ 1965 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-274) [ 1965 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-275) [ 1965 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-276) [ 1965 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-277) [ 1965 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-278) [ 1965 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-279) [ 1965 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-28) [ 1955 0 R /XYZ 60.307257 345.825918 0 ] (Code/Settings/:__span-0-280) [ 1965 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-281) [ 1965 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-282) [ 1965 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-283) [ 1965 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-284) [ 1965 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-285) [ 1965 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-286) [ 1967 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-287) [ 1967 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-288) [ 1967 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-289) [ 1967 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-29) [ 1955 0 R /XYZ 60.307257 332.425566 0 ] (Code/Settings/:__span-0-290) [ 1967 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-291) [ 1967 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-292) [ 1967 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-293) [ 1967 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-294) [ 1967 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-295) [ 1967 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-296) [ 1967 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-297) [ 1967 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-298) [ 1967 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-299) [ 1967 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-3) [ 1955 0 R /XYZ 60.307257 680.834718 0 ] (Code/Settings/:__span-0-30) [ 1955 0 R /XYZ 60.307257 319.025214 0 ] (Code/Settings/:__span-0-300) [ 1967 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-301) [ 1967 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-302) [ 1967 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-303) [ 1967 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-304) [ 1967 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-305) [ 1967 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-306) [ 1967 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-307) [ 1967 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-308) [ 1967 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-309) [ 1967 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-31) [ 1955 0 R /XYZ 60.307257 305.624862 0 ] (Code/Settings/:__span-0-310) [ 1967 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-311) [ 1967 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-312) [ 1967 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-313) [ 1967 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-314) [ 1967 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-315) [ 1967 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-316) [ 1967 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-317) [ 1967 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-318) [ 1967 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-319) [ 1967 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-32) [ 1955 0 R /XYZ 60.307257 292.224510 0 ] (Code/Settings/:__span-0-320) [ 1967 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-321) [ 1967 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-322) [ 1967 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-323) [ 1967 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-324) [ 1967 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-325) [ 1967 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-326) [ 1967 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-327) [ 1967 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-328) [ 1967 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-329) [ 1967 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-33) [ 1955 0 R /XYZ 60.307257 278.824158 0 ] (Code/Settings/:__span-0-330) [ 1967 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-331) [ 1967 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-332) [ 1967 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-333) [ 1967 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-334) [ 1967 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-335) [ 1969 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-336) [ 1969 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-337) [ 1969 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-338) [ 1969 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-339) [ 1969 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-34) [ 1955 0 R /XYZ 60.307257 265.423806 0 ] (Code/Settings/:__span-0-340) [ 1969 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-341) [ 1969 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-342) [ 1969 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-343) [ 1969 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-344) [ 1969 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-345) [ 1969 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-346) [ 1969 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-347) [ 1969 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-348) [ 1969 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-349) [ 1969 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-35) [ 1955 0 R /XYZ 60.307257 238.623102 0 ] (Code/Settings/:__span-0-350) [ 1969 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-351) [ 1969 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-352) [ 1969 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-353) [ 1969 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-354) [ 1969 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-355) [ 1969 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-356) [ 1969 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-357) [ 1969 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-358) [ 1969 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-359) [ 1969 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-36) [ 1955 0 R /XYZ 60.307257 211.822398 0 ] (Code/Settings/:__span-0-360) [ 1969 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-361) [ 1969 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-362) [ 1969 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-363) [ 1969 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-364) [ 1969 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-365) [ 1969 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-366) [ 1969 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-367) [ 1969 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-368) [ 1969 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-369) [ 1969 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-37) [ 1955 0 R /XYZ 60.307257 185.021694 0 ] (Code/Settings/:__span-0-370) [ 1969 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-371) [ 1969 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-372) [ 1969 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-373) [ 1969 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-374) [ 1969 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-375) [ 1969 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-376) [ 1969 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-377) [ 1969 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-378) [ 1971 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-379) [ 1971 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-38) [ 1955 0 R /XYZ 60.307257 171.621342 0 ] (Code/Settings/:__span-0-380) [ 1971 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-381) [ 1971 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-382) [ 1971 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-383) [ 1971 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-384) [ 1971 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-385) [ 1971 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-386) [ 1971 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-387) [ 1971 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-388) [ 1971 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-389) [ 1971 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-39) [ 1955 0 R /XYZ 60.307257 158.220990 0 ] (Code/Settings/:__span-0-390) [ 1971 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-391) [ 1971 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-392) [ 1971 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-393) [ 1971 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-394) [ 1971 0 R /XYZ 60.307257 556.617990 0 ] (Code/Settings/:__span-0-395) [ 1971 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-396) [ 1971 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-397) [ 1971 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-398) [ 1971 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-399) [ 1971 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-4) [ 1955 0 R /XYZ 60.307257 667.434366 0 ] (Code/Settings/:__span-0-40) [ 1955 0 R /XYZ 60.307257 144.820638 0 ] (Code/Settings/:__span-0-400) [ 1971 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-401) [ 1971 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-402) [ 1971 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-403) [ 1971 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-404) [ 1971 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-405) [ 1971 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-406) [ 1971 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-407) [ 1971 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-408) [ 1971 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-409) [ 1971 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-41) [ 1955 0 R /XYZ 60.307257 131.420286 0 ] (Code/Settings/:__span-0-410) [ 1971 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-411) [ 1971 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-412) [ 1971 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-413) [ 1971 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-414) [ 1971 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-415) [ 1971 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-416) [ 1971 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-417) [ 1971 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-418) [ 1971 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-419) [ 1971 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-42) [ 1955 0 R /XYZ 60.307257 118.019934 0 ] (Code/Settings/:__span-0-420) [ 1971 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-421) [ 1971 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-422) [ 1971 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-423) [ 1971 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-424) [ 1971 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-425) [ 1971 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-426) [ 1971 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-427) [ 1973 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-428) [ 1973 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-429) [ 1973 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-43) [ 1955 0 R /XYZ 60.307257 104.619582 0 ] (Code/Settings/:__span-0-430) [ 1973 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-431) [ 1973 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-432) [ 1973 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-433) [ 1973 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-434) [ 1973 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-435) [ 1973 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-436) [ 1973 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-437) [ 1973 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-438) [ 1973 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-439) [ 1973 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-44) [ 1955 0 R /XYZ 60.307257 91.219230 0 ] (Code/Settings/:__span-0-440) [ 1973 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-441) [ 1973 0 R /XYZ 60.307257 529.817286 0 ] (Code/Settings/:__span-0-442) [ 1973 0 R /XYZ 60.307257 516.416934 0 ] (Code/Settings/:__span-0-443) [ 1973 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-444) [ 1973 0 R /XYZ 60.307257 489.616230 0 ] (Code/Settings/:__span-0-445) [ 1973 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-446) [ 1973 0 R /XYZ 60.307257 462.815526 0 ] (Code/Settings/:__span-0-447) [ 1973 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-448) [ 1973 0 R /XYZ 60.307257 436.014822 0 ] (Code/Settings/:__span-0-449) [ 1973 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-45) [ 1957 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-450) [ 1973 0 R /XYZ 60.307257 409.214118 0 ] (Code/Settings/:__span-0-451) [ 1973 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-452) [ 1973 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-453) [ 1973 0 R /XYZ 60.307257 369.013062 0 ] (Code/Settings/:__span-0-454) [ 1973 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-455) [ 1973 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-456) [ 1973 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-457) [ 1973 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-458) [ 1973 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-459) [ 1973 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-46) [ 1957 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-460) [ 1973 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-461) [ 1973 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-462) [ 1973 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-463) [ 1973 0 R /XYZ 60.307257 221.609190 0 ] (Code/Settings/:__span-0-464) [ 1973 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-465) [ 1973 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-466) [ 1973 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-467) [ 1973 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-468) [ 1973 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-469) [ 1973 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-47) [ 1957 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-470) [ 1973 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-471) [ 1973 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-472) [ 1975 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-473) [ 1975 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-474) [ 1975 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-475) [ 1975 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-476) [ 1975 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-477) [ 1975 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-48) [ 1957 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-49) [ 1957 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-5) [ 1955 0 R /XYZ 60.307257 654.034014 0 ] (Code/Settings/:__span-0-50) [ 1957 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-51) [ 1957 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-52) [ 1957 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-53) [ 1957 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-54) [ 1957 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-55) [ 1957 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-56) [ 1957 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:__span-0-57) [ 1957 0 R /XYZ 60.307257 610.219398 0 ] (Code/Settings/:__span-0-58) [ 1957 0 R /XYZ 60.307257 596.819046 0 ] (Code/Settings/:__span-0-59) [ 1957 0 R /XYZ 60.307257 583.418694 0 ] (Code/Settings/:__span-0-6) [ 1955 0 R /XYZ 60.307257 640.633662 0 ] (Code/Settings/:__span-0-60) [ 1957 0 R /XYZ 60.307257 570.018342 0 ] (Code/Settings/:__span-0-61) [ 1957 0 R /XYZ 60.307257 543.217638 0 ] (Code/Settings/:__span-0-62) [ 1957 0 R /XYZ 60.307257 503.016582 0 ] (Code/Settings/:__span-0-63) [ 1957 0 R /XYZ 60.307257 476.215878 0 ] (Code/Settings/:__span-0-64) [ 1957 0 R /XYZ 60.307257 449.415174 0 ] (Code/Settings/:__span-0-65) [ 1957 0 R /XYZ 60.307257 422.614470 0 ] (Code/Settings/:__span-0-66) [ 1957 0 R /XYZ 60.307257 395.813766 0 ] (Code/Settings/:__span-0-67) [ 1957 0 R /XYZ 60.307257 382.413414 0 ] (Code/Settings/:__span-0-68) [ 1957 0 R /XYZ 60.307257 355.612710 0 ] (Code/Settings/:__span-0-69) [ 1957 0 R /XYZ 60.307257 342.212358 0 ] (Code/Settings/:__span-0-7) [ 1955 0 R /XYZ 60.307257 627.233310 0 ] (Code/Settings/:__span-0-70) [ 1957 0 R /XYZ 60.307257 328.812006 0 ] (Code/Settings/:__span-0-71) [ 1957 0 R /XYZ 60.307257 315.411654 0 ] (Code/Settings/:__span-0-72) [ 1957 0 R /XYZ 60.307257 302.011302 0 ] (Code/Settings/:__span-0-73) [ 1957 0 R /XYZ 60.307257 288.610950 0 ] (Code/Settings/:__span-0-74) [ 1957 0 R /XYZ 60.307257 275.210598 0 ] (Code/Settings/:__span-0-75) [ 1957 0 R /XYZ 60.307257 261.810246 0 ] (Code/Settings/:__span-0-76) [ 1957 0 R /XYZ 60.307257 248.409894 0 ] (Code/Settings/:__span-0-77) [ 1957 0 R /XYZ 60.307257 235.009542 0 ] (Code/Settings/:__span-0-78) [ 1957 0 R /XYZ 60.307257 208.208838 0 ] (Code/Settings/:__span-0-79) [ 1957 0 R /XYZ 60.307257 194.808486 0 ] (Code/Settings/:__span-0-8) [ 1955 0 R /XYZ 60.307257 613.832958 0 ] (Code/Settings/:__span-0-80) [ 1957 0 R /XYZ 60.307257 181.408134 0 ] (Code/Settings/:__span-0-81) [ 1957 0 R /XYZ 60.307257 168.007782 0 ] (Code/Settings/:__span-0-82) [ 1957 0 R /XYZ 60.307257 154.607430 0 ] (Code/Settings/:__span-0-83) [ 1957 0 R /XYZ 60.307257 141.207078 0 ] (Code/Settings/:__span-0-84) [ 1957 0 R /XYZ 60.307257 127.806726 0 ] (Code/Settings/:__span-0-85) [ 1957 0 R /XYZ 60.307257 114.406374 0 ] (Code/Settings/:__span-0-86) [ 1957 0 R /XYZ 60.307257 101.006022 0 ] (Code/Settings/:__span-0-87) [ 1957 0 R /XYZ 60.307257 87.605670 0 ] (Code/Settings/:__span-0-88) [ 1959 0 R /XYZ 60.307257 771.023622 0 ] (Code/Settings/:__span-0-89) [ 1959 0 R /XYZ 60.307257 757.623270 0 ] (Code/Settings/:__span-0-9) [ 1955 0 R /XYZ 60.307257 600.432606 0 ] (Code/Settings/:__span-0-90) [ 1959 0 R /XYZ 60.307257 744.222918 0 ] (Code/Settings/:__span-0-91) [ 1959 0 R /XYZ 60.307257 730.822566 0 ] (Code/Settings/:__span-0-92) [ 1959 0 R /XYZ 60.307257 717.422214 0 ] (Code/Settings/:__span-0-93) [ 1959 0 R /XYZ 60.307257 704.021862 0 ] (Code/Settings/:__span-0-94) [ 1959 0 R /XYZ 60.307257 690.621510 0 ] (Code/Settings/:__span-0-95) [ 1959 0 R /XYZ 60.307257 677.221158 0 ] (Code/Settings/:__span-0-96) [ 1959 0 R /XYZ 60.307257 663.820806 0 ] (Code/Settings/:__span-0-97) [ 1959 0 R /XYZ 60.307257 650.420454 0 ] (Code/Settings/:__span-0-98) [ 1959 0 R /XYZ 60.307257 637.020102 0 ] (Code/Settings/:__span-0-99) [ 1959 0 R /XYZ 60.307257 623.619750 0 ] (Code/Settings/:settingscs) [ 1955 0 R /XYZ 39.386457 747.563622 0 ] (Code/SqliteStorage/:) [ 1851 0 R /XYZ 39.386457 747.563622 0 ] (Code/SqliteStorage/:__span-0-1) [ 1851 0 R /XYZ 60.307257 707.635422 0 ] (Code/SqliteStorage/:__span-0-10) [ 1851 0 R /XYZ 60.307257 587.032254 0 ] (Code/SqliteStorage/:__span-0-100) [ 1855 0 R /XYZ 60.307257 704.021862 0 ] (Code/SqliteStorage/:__span-0-101) [ 1855 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-102) [ 1855 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-103) [ 1855 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-104) [ 1855 0 R /XYZ 60.307257 650.420454 0 ] (Code/SqliteStorage/:__span-0-105) [ 1855 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-106) [ 1855 0 R /XYZ 60.307257 623.619750 0 ] (Code/SqliteStorage/:__span-0-107) [ 1855 0 R /XYZ 60.307257 610.219398 0 ] (Code/SqliteStorage/:__span-0-108) [ 1855 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-109) [ 1855 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-11) [ 1851 0 R /XYZ 60.307257 573.631902 0 ] (Code/SqliteStorage/:__span-0-110) [ 1855 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-111) [ 1855 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-112) [ 1855 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-113) [ 1855 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-114) [ 1855 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-115) [ 1855 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-116) [ 1855 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-117) [ 1855 0 R /XYZ 60.307257 462.815526 0 ] (Code/SqliteStorage/:__span-0-118) [ 1855 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-119) [ 1855 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-12) [ 1851 0 R /XYZ 60.307257 560.231550 0 ] (Code/SqliteStorage/:__span-0-120) [ 1855 0 R /XYZ 60.307257 409.214118 0 ] (Code/SqliteStorage/:__span-0-121) [ 1855 0 R /XYZ 60.307257 395.813766 0 ] (Code/SqliteStorage/:__span-0-122) [ 1855 0 R /XYZ 60.307257 382.413414 0 ] (Code/SqliteStorage/:__span-0-123) [ 1855 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-124) [ 1855 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-125) [ 1855 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-126) [ 1855 0 R /XYZ 60.307257 328.812006 0 ] (Code/SqliteStorage/:__span-0-127) [ 1855 0 R /XYZ 60.307257 315.411654 0 ] (Code/SqliteStorage/:__span-0-128) [ 1855 0 R /XYZ 60.307257 302.011302 0 ] (Code/SqliteStorage/:__span-0-129) [ 1855 0 R /XYZ 60.307257 288.610950 0 ] (Code/SqliteStorage/:__span-0-13) [ 1851 0 R /XYZ 60.307257 546.831198 0 ] (Code/SqliteStorage/:__span-0-130) [ 1855 0 R /XYZ 60.307257 275.210598 0 ] (Code/SqliteStorage/:__span-0-131) [ 1855 0 R /XYZ 60.307257 261.810246 0 ] (Code/SqliteStorage/:__span-0-132) [ 1855 0 R /XYZ 60.307257 248.409894 0 ] (Code/SqliteStorage/:__span-0-133) [ 1855 0 R /XYZ 60.307257 235.009542 0 ] (Code/SqliteStorage/:__span-0-134) [ 1855 0 R /XYZ 60.307257 221.609190 0 ] (Code/SqliteStorage/:__span-0-135) [ 1855 0 R /XYZ 60.307257 208.208838 0 ] (Code/SqliteStorage/:__span-0-136) [ 1855 0 R /XYZ 60.307257 194.808486 0 ] (Code/SqliteStorage/:__span-0-137) [ 1855 0 R /XYZ 60.307257 168.007782 0 ] (Code/SqliteStorage/:__span-0-138) [ 1855 0 R /XYZ 60.307257 154.607430 0 ] (Code/SqliteStorage/:__span-0-139) [ 1855 0 R /XYZ 60.307257 141.207078 0 ] (Code/SqliteStorage/:__span-0-14) [ 1851 0 R /XYZ 60.307257 533.430846 0 ] (Code/SqliteStorage/:__span-0-140) [ 1855 0 R /XYZ 60.307257 127.806726 0 ] (Code/SqliteStorage/:__span-0-141) [ 1855 0 R /XYZ 60.307257 114.406374 0 ] (Code/SqliteStorage/:__span-0-142) [ 1855 0 R /XYZ 60.307257 101.006022 0 ] (Code/SqliteStorage/:__span-0-143) [ 1857 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-144) [ 1857 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-145) [ 1857 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-146) [ 1857 0 R /XYZ 60.307257 717.422214 0 ] (Code/SqliteStorage/:__span-0-147) [ 1857 0 R /XYZ 60.307257 704.021862 0 ] (Code/SqliteStorage/:__span-0-148) [ 1857 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-149) [ 1857 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-15) [ 1851 0 R /XYZ 60.307257 520.030494 0 ] (Code/SqliteStorage/:__span-0-150) [ 1857 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-151) [ 1857 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-152) [ 1857 0 R /XYZ 60.307257 623.619750 0 ] (Code/SqliteStorage/:__span-0-153) [ 1857 0 R /XYZ 60.307257 610.219398 0 ] (Code/SqliteStorage/:__span-0-154) [ 1857 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-155) [ 1857 0 R /XYZ 60.307257 583.418694 0 ] (Code/SqliteStorage/:__span-0-156) [ 1857 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-157) [ 1857 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-158) [ 1857 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-159) [ 1857 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-16) [ 1851 0 R /XYZ 60.307257 506.630142 0 ] (Code/SqliteStorage/:__span-0-160) [ 1857 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-161) [ 1857 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-162) [ 1857 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-163) [ 1857 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-164) [ 1857 0 R /XYZ 60.307257 462.815526 0 ] (Code/SqliteStorage/:__span-0-165) [ 1857 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-166) [ 1857 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-167) [ 1857 0 R /XYZ 60.307257 422.614470 0 ] (Code/SqliteStorage/:__span-0-168) [ 1857 0 R /XYZ 60.307257 409.214118 0 ] (Code/SqliteStorage/:__span-0-169) [ 1857 0 R /XYZ 60.307257 382.413414 0 ] (Code/SqliteStorage/:__span-0-17) [ 1851 0 R /XYZ 60.307257 493.229790 0 ] (Code/SqliteStorage/:__span-0-170) [ 1857 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-171) [ 1857 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-172) [ 1857 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-173) [ 1857 0 R /XYZ 60.307257 328.812006 0 ] (Code/SqliteStorage/:__span-0-174) [ 1857 0 R /XYZ 60.307257 315.411654 0 ] (Code/SqliteStorage/:__span-0-175) [ 1857 0 R /XYZ 60.307257 302.011302 0 ] (Code/SqliteStorage/:__span-0-176) [ 1857 0 R /XYZ 60.307257 288.610950 0 ] (Code/SqliteStorage/:__span-0-177) [ 1857 0 R /XYZ 60.307257 275.210598 0 ] (Code/SqliteStorage/:__span-0-178) [ 1857 0 R /XYZ 60.307257 261.810246 0 ] (Code/SqliteStorage/:__span-0-179) [ 1857 0 R /XYZ 60.307257 221.609190 0 ] (Code/SqliteStorage/:__span-0-18) [ 1851 0 R /XYZ 60.307257 479.829438 0 ] (Code/SqliteStorage/:__span-0-180) [ 1857 0 R /XYZ 60.307257 194.808486 0 ] (Code/SqliteStorage/:__span-0-181) [ 1857 0 R /XYZ 60.307257 181.408134 0 ] (Code/SqliteStorage/:__span-0-182) [ 1857 0 R /XYZ 60.307257 168.007782 0 ] (Code/SqliteStorage/:__span-0-183) [ 1857 0 R /XYZ 60.307257 141.207078 0 ] (Code/SqliteStorage/:__span-0-184) [ 1857 0 R /XYZ 60.307257 114.406374 0 ] (Code/SqliteStorage/:__span-0-185) [ 1857 0 R /XYZ 60.307257 101.006022 0 ] (Code/SqliteStorage/:__span-0-186) [ 1857 0 R /XYZ 60.307257 87.605670 0 ] (Code/SqliteStorage/:__span-0-187) [ 1859 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-188) [ 1859 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-189) [ 1859 0 R /XYZ 60.307257 744.222918 0 ] (Code/SqliteStorage/:__span-0-19) [ 1851 0 R /XYZ 60.307257 466.429086 0 ] (Code/SqliteStorage/:__span-0-190) [ 1859 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-191) [ 1859 0 R /XYZ 60.307257 717.422214 0 ] (Code/SqliteStorage/:__span-0-192) [ 1859 0 R /XYZ 60.307257 704.021862 0 ] (Code/SqliteStorage/:__span-0-193) [ 1859 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-194) [ 1859 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-195) [ 1859 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-196) [ 1859 0 R /XYZ 60.307257 650.420454 0 ] (Code/SqliteStorage/:__span-0-197) [ 1859 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-198) [ 1859 0 R /XYZ 60.307257 623.619750 0 ] (Code/SqliteStorage/:__span-0-199) [ 1859 0 R /XYZ 60.307257 610.219398 0 ] (Code/SqliteStorage/:__span-0-2) [ 1851 0 R /XYZ 60.307257 694.235070 0 ] (Code/SqliteStorage/:__span-0-20) [ 1851 0 R /XYZ 60.307257 453.028734 0 ] (Code/SqliteStorage/:__span-0-200) [ 1859 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-201) [ 1859 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-202) [ 1859 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-203) [ 1859 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-204) [ 1859 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-205) [ 1859 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-206) [ 1859 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-207) [ 1859 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-208) [ 1859 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-209) [ 1859 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-21) [ 1851 0 R /XYZ 60.307257 439.628382 0 ] (Code/SqliteStorage/:__span-0-210) [ 1859 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-211) [ 1859 0 R /XYZ 60.307257 422.614470 0 ] (Code/SqliteStorage/:__span-0-212) [ 1859 0 R /XYZ 60.307257 409.214118 0 ] (Code/SqliteStorage/:__span-0-213) [ 1859 0 R /XYZ 60.307257 395.813766 0 ] (Code/SqliteStorage/:__span-0-214) [ 1859 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-215) [ 1859 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-216) [ 1859 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-217) [ 1859 0 R /XYZ 60.307257 328.812006 0 ] (Code/SqliteStorage/:__span-0-218) [ 1859 0 R /XYZ 60.307257 315.411654 0 ] (Code/SqliteStorage/:__span-0-219) [ 1859 0 R /XYZ 60.307257 288.610950 0 ] (Code/SqliteStorage/:__span-0-22) [ 1851 0 R /XYZ 60.307257 426.228030 0 ] (Code/SqliteStorage/:__span-0-220) [ 1859 0 R /XYZ 60.307257 275.210598 0 ] (Code/SqliteStorage/:__span-0-221) [ 1859 0 R /XYZ 60.307257 261.810246 0 ] (Code/SqliteStorage/:__span-0-222) [ 1859 0 R /XYZ 60.307257 248.409894 0 ] (Code/SqliteStorage/:__span-0-223) [ 1859 0 R /XYZ 60.307257 235.009542 0 ] (Code/SqliteStorage/:__span-0-224) [ 1859 0 R /XYZ 60.307257 221.609190 0 ] (Code/SqliteStorage/:__span-0-225) [ 1859 0 R /XYZ 60.307257 208.208838 0 ] (Code/SqliteStorage/:__span-0-226) [ 1859 0 R /XYZ 60.307257 194.808486 0 ] (Code/SqliteStorage/:__span-0-227) [ 1859 0 R /XYZ 60.307257 168.007782 0 ] (Code/SqliteStorage/:__span-0-228) [ 1859 0 R /XYZ 60.307257 154.607430 0 ] (Code/SqliteStorage/:__span-0-229) [ 1859 0 R /XYZ 60.307257 141.207078 0 ] (Code/SqliteStorage/:__span-0-23) [ 1851 0 R /XYZ 60.307257 399.427326 0 ] (Code/SqliteStorage/:__span-0-230) [ 1859 0 R /XYZ 60.307257 127.806726 0 ] (Code/SqliteStorage/:__span-0-231) [ 1859 0 R /XYZ 60.307257 114.406374 0 ] (Code/SqliteStorage/:__span-0-232) [ 1859 0 R /XYZ 60.307257 101.006022 0 ] (Code/SqliteStorage/:__span-0-233) [ 1859 0 R /XYZ 60.307257 87.605670 0 ] (Code/SqliteStorage/:__span-0-234) [ 1861 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-235) [ 1861 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-236) [ 1861 0 R /XYZ 60.307257 744.222918 0 ] (Code/SqliteStorage/:__span-0-237) [ 1861 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-238) [ 1861 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-239) [ 1861 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-24) [ 1851 0 R /XYZ 60.307257 386.026974 0 ] (Code/SqliteStorage/:__span-0-240) [ 1861 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-241) [ 1861 0 R /XYZ 60.307257 650.420454 0 ] (Code/SqliteStorage/:__span-0-242) [ 1861 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-243) [ 1861 0 R /XYZ 60.307257 623.619750 0 ] (Code/SqliteStorage/:__span-0-244) [ 1861 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-245) [ 1861 0 R /XYZ 60.307257 583.418694 0 ] (Code/SqliteStorage/:__span-0-246) [ 1861 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-247) [ 1861 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-248) [ 1861 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-249) [ 1861 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-25) [ 1851 0 R /XYZ 60.307257 372.626622 0 ] (Code/SqliteStorage/:__span-0-250) [ 1861 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-251) [ 1861 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-252) [ 1861 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-253) [ 1861 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-254) [ 1861 0 R /XYZ 60.307257 462.815526 0 ] (Code/SqliteStorage/:__span-0-255) [ 1861 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-256) [ 1861 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-257) [ 1861 0 R /XYZ 60.307257 422.614470 0 ] (Code/SqliteStorage/:__span-0-258) [ 1861 0 R /XYZ 60.307257 395.813766 0 ] (Code/SqliteStorage/:__span-0-259) [ 1861 0 R /XYZ 60.307257 382.413414 0 ] (Code/SqliteStorage/:__span-0-26) [ 1851 0 R /XYZ 60.307257 359.226270 0 ] (Code/SqliteStorage/:__span-0-260) [ 1861 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-261) [ 1861 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-262) [ 1861 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-27) [ 1851 0 R /XYZ 60.307257 345.825918 0 ] (Code/SqliteStorage/:__span-0-28) [ 1851 0 R /XYZ 60.307257 332.425566 0 ] (Code/SqliteStorage/:__span-0-29) [ 1851 0 R /XYZ 60.307257 319.025214 0 ] (Code/SqliteStorage/:__span-0-3) [ 1851 0 R /XYZ 60.307257 680.834718 0 ] (Code/SqliteStorage/:__span-0-30) [ 1851 0 R /XYZ 60.307257 305.624862 0 ] (Code/SqliteStorage/:__span-0-31) [ 1851 0 R /XYZ 60.307257 292.224510 0 ] (Code/SqliteStorage/:__span-0-32) [ 1851 0 R /XYZ 60.307257 278.824158 0 ] (Code/SqliteStorage/:__span-0-33) [ 1851 0 R /XYZ 60.307257 265.423806 0 ] (Code/SqliteStorage/:__span-0-34) [ 1851 0 R /XYZ 60.307257 252.023454 0 ] (Code/SqliteStorage/:__span-0-35) [ 1851 0 R /XYZ 60.307257 238.623102 0 ] (Code/SqliteStorage/:__span-0-36) [ 1851 0 R /XYZ 60.307257 225.222750 0 ] (Code/SqliteStorage/:__span-0-37) [ 1851 0 R /XYZ 60.307257 211.822398 0 ] (Code/SqliteStorage/:__span-0-38) [ 1851 0 R /XYZ 60.307257 198.422046 0 ] (Code/SqliteStorage/:__span-0-39) [ 1851 0 R /XYZ 60.307257 185.021694 0 ] (Code/SqliteStorage/:__span-0-4) [ 1851 0 R /XYZ 60.307257 667.434366 0 ] (Code/SqliteStorage/:__span-0-40) [ 1851 0 R /XYZ 60.307257 171.621342 0 ] (Code/SqliteStorage/:__span-0-41) [ 1851 0 R /XYZ 60.307257 158.220990 0 ] (Code/SqliteStorage/:__span-0-42) [ 1851 0 R /XYZ 60.307257 144.820638 0 ] (Code/SqliteStorage/:__span-0-43) [ 1851 0 R /XYZ 60.307257 131.420286 0 ] (Code/SqliteStorage/:__span-0-44) [ 1851 0 R /XYZ 60.307257 118.019934 0 ] (Code/SqliteStorage/:__span-0-45) [ 1851 0 R /XYZ 60.307257 104.619582 0 ] (Code/SqliteStorage/:__span-0-46) [ 1851 0 R /XYZ 60.307257 91.219230 0 ] (Code/SqliteStorage/:__span-0-47) [ 1853 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-48) [ 1853 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-49) [ 1853 0 R /XYZ 60.307257 744.222918 0 ] (Code/SqliteStorage/:__span-0-5) [ 1851 0 R /XYZ 60.307257 654.034014 0 ] (Code/SqliteStorage/:__span-0-50) [ 1853 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-51) [ 1853 0 R /XYZ 60.307257 717.422214 0 ] (Code/SqliteStorage/:__span-0-52) [ 1853 0 R /XYZ 60.307257 704.021862 0 ] (Code/SqliteStorage/:__span-0-53) [ 1853 0 R /XYZ 60.307257 690.621510 0 ] (Code/SqliteStorage/:__span-0-54) [ 1853 0 R /XYZ 60.307257 677.221158 0 ] (Code/SqliteStorage/:__span-0-55) [ 1853 0 R /XYZ 60.307257 663.820806 0 ] (Code/SqliteStorage/:__span-0-56) [ 1853 0 R /XYZ 60.307257 650.420454 0 ] (Code/SqliteStorage/:__span-0-57) [ 1853 0 R /XYZ 60.307257 637.020102 0 ] (Code/SqliteStorage/:__span-0-58) [ 1853 0 R /XYZ 60.307257 610.219398 0 ] (Code/SqliteStorage/:__span-0-59) [ 1853 0 R /XYZ 60.307257 596.819046 0 ] (Code/SqliteStorage/:__span-0-6) [ 1851 0 R /XYZ 60.307257 640.633662 0 ] (Code/SqliteStorage/:__span-0-60) [ 1853 0 R /XYZ 60.307257 583.418694 0 ] (Code/SqliteStorage/:__span-0-61) [ 1853 0 R /XYZ 60.307257 570.018342 0 ] (Code/SqliteStorage/:__span-0-62) [ 1853 0 R /XYZ 60.307257 556.617990 0 ] (Code/SqliteStorage/:__span-0-63) [ 1853 0 R /XYZ 60.307257 543.217638 0 ] (Code/SqliteStorage/:__span-0-64) [ 1853 0 R /XYZ 60.307257 529.817286 0 ] (Code/SqliteStorage/:__span-0-65) [ 1853 0 R /XYZ 60.307257 516.416934 0 ] (Code/SqliteStorage/:__span-0-66) [ 1853 0 R /XYZ 60.307257 503.016582 0 ] (Code/SqliteStorage/:__span-0-67) [ 1853 0 R /XYZ 60.307257 489.616230 0 ] (Code/SqliteStorage/:__span-0-68) [ 1853 0 R /XYZ 60.307257 476.215878 0 ] (Code/SqliteStorage/:__span-0-69) [ 1853 0 R /XYZ 60.307257 449.415174 0 ] (Code/SqliteStorage/:__span-0-7) [ 1851 0 R /XYZ 60.307257 627.233310 0 ] (Code/SqliteStorage/:__span-0-70) [ 1853 0 R /XYZ 60.307257 436.014822 0 ] (Code/SqliteStorage/:__span-0-71) [ 1853 0 R /XYZ 60.307257 422.614470 0 ] (Code/SqliteStorage/:__span-0-72) [ 1853 0 R /XYZ 60.307257 409.214118 0 ] (Code/SqliteStorage/:__span-0-73) [ 1853 0 R /XYZ 60.307257 395.813766 0 ] (Code/SqliteStorage/:__span-0-74) [ 1853 0 R /XYZ 60.307257 382.413414 0 ] (Code/SqliteStorage/:__span-0-75) [ 1853 0 R /XYZ 60.307257 369.013062 0 ] (Code/SqliteStorage/:__span-0-76) [ 1853 0 R /XYZ 60.307257 355.612710 0 ] (Code/SqliteStorage/:__span-0-77) [ 1853 0 R /XYZ 60.307257 342.212358 0 ] (Code/SqliteStorage/:__span-0-78) [ 1853 0 R /XYZ 60.307257 328.812006 0 ] (Code/SqliteStorage/:__span-0-79) [ 1853 0 R /XYZ 60.307257 315.411654 0 ] (Code/SqliteStorage/:__span-0-8) [ 1851 0 R /XYZ 60.307257 613.832958 0 ] (Code/SqliteStorage/:__span-0-80) [ 1853 0 R /XYZ 60.307257 302.011302 0 ] (Code/SqliteStorage/:__span-0-81) [ 1853 0 R /XYZ 60.307257 288.610950 0 ] (Code/SqliteStorage/:__span-0-82) [ 1853 0 R /XYZ 60.307257 275.210598 0 ] (Code/SqliteStorage/:__span-0-83) [ 1853 0 R /XYZ 60.307257 261.810246 0 ] (Code/SqliteStorage/:__span-0-84) [ 1853 0 R /XYZ 60.307257 248.409894 0 ] (Code/SqliteStorage/:__span-0-85) [ 1853 0 R /XYZ 60.307257 235.009542 0 ] (Code/SqliteStorage/:__span-0-86) [ 1853 0 R /XYZ 60.307257 208.208838 0 ] (Code/SqliteStorage/:__span-0-87) [ 1853 0 R /XYZ 60.307257 194.808486 0 ] (Code/SqliteStorage/:__span-0-88) [ 1853 0 R /XYZ 60.307257 181.408134 0 ] (Code/SqliteStorage/:__span-0-89) [ 1853 0 R /XYZ 60.307257 168.007782 0 ] (Code/SqliteStorage/:__span-0-9) [ 1851 0 R /XYZ 60.307257 600.432606 0 ] (Code/SqliteStorage/:__span-0-90) [ 1853 0 R /XYZ 60.307257 154.607430 0 ] (Code/SqliteStorage/:__span-0-91) [ 1853 0 R /XYZ 60.307257 141.207078 0 ] (Code/SqliteStorage/:__span-0-92) [ 1853 0 R /XYZ 60.307257 114.406374 0 ] (Code/SqliteStorage/:__span-0-93) [ 1853 0 R /XYZ 60.307257 101.006022 0 ] (Code/SqliteStorage/:__span-0-94) [ 1853 0 R /XYZ 60.307257 87.605670 0 ] (Code/SqliteStorage/:__span-0-95) [ 1855 0 R /XYZ 60.307257 771.023622 0 ] (Code/SqliteStorage/:__span-0-96) [ 1855 0 R /XYZ 60.307257 757.623270 0 ] (Code/SqliteStorage/:__span-0-97) [ 1855 0 R /XYZ 60.307257 744.222918 0 ] (Code/SqliteStorage/:__span-0-98) [ 1855 0 R /XYZ 60.307257 730.822566 0 ] (Code/SqliteStorage/:__span-0-99) [ 1855 0 R /XYZ 60.307257 717.422214 0 ] (Code/SqliteStorage/:sqlitestoragecs) [ 1851 0 R /XYZ 39.386457 747.563622 0 ] (Code/Window/:) [ 1977 0 R /XYZ 39.386457 747.563622 0 ] (Code/Window/:__span-0-1) [ 1977 0 R /XYZ 60.307257 707.635422 0 ] (Code/Window/:__span-0-10) [ 1977 0 R /XYZ 60.307257 587.032254 0 ] (Code/Window/:__span-0-100) [ 1981 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-101) [ 1981 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-102) [ 1981 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-103) [ 1981 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-104) [ 1981 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-105) [ 1981 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-106) [ 1981 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-107) [ 1981 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-108) [ 1981 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-109) [ 1981 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-11) [ 1977 0 R /XYZ 60.307257 573.631902 0 ] (Code/Window/:__span-0-110) [ 1981 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-111) [ 1981 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-112) [ 1981 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-113) [ 1981 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-114) [ 1981 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-115) [ 1981 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-116) [ 1981 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-117) [ 1981 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-118) [ 1981 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-119) [ 1981 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-12) [ 1977 0 R /XYZ 60.307257 560.231550 0 ] (Code/Window/:__span-0-120) [ 1981 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-121) [ 1981 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-122) [ 1981 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-123) [ 1981 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-124) [ 1981 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-125) [ 1981 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-126) [ 1981 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-127) [ 1981 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-128) [ 1981 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-129) [ 1981 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-13) [ 1977 0 R /XYZ 60.307257 546.831198 0 ] (Code/Window/:__span-0-130) [ 1981 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-131) [ 1981 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-132) [ 1981 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-133) [ 1981 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-134) [ 1981 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-135) [ 1981 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-136) [ 1981 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-137) [ 1981 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-138) [ 1981 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-139) [ 1981 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-14) [ 1977 0 R /XYZ 60.307257 533.430846 0 ] (Code/Window/:__span-0-140) [ 1983 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-141) [ 1983 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-142) [ 1983 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-143) [ 1983 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-144) [ 1983 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-145) [ 1983 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-146) [ 1983 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-147) [ 1983 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-148) [ 1983 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-149) [ 1983 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-15) [ 1977 0 R /XYZ 60.307257 520.030494 0 ] (Code/Window/:__span-0-150) [ 1983 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-151) [ 1983 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-152) [ 1983 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-153) [ 1983 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-154) [ 1983 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-155) [ 1983 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-156) [ 1983 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-157) [ 1983 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-158) [ 1983 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-159) [ 1983 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-16) [ 1977 0 R /XYZ 60.307257 506.630142 0 ] (Code/Window/:__span-0-160) [ 1983 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-161) [ 1983 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-162) [ 1983 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-163) [ 1983 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-164) [ 1983 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-165) [ 1983 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-166) [ 1983 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-167) [ 1983 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-168) [ 1983 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-169) [ 1983 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-17) [ 1977 0 R /XYZ 60.307257 493.229790 0 ] (Code/Window/:__span-0-170) [ 1983 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-171) [ 1983 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-172) [ 1983 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-173) [ 1983 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-174) [ 1983 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-175) [ 1983 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-176) [ 1983 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-177) [ 1983 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-178) [ 1983 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-179) [ 1983 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-18) [ 1977 0 R /XYZ 60.307257 479.829438 0 ] (Code/Window/:__span-0-180) [ 1983 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-181) [ 1983 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-182) [ 1983 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-183) [ 1983 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-184) [ 1983 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-185) [ 1983 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-186) [ 1983 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-187) [ 1983 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-188) [ 1983 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-189) [ 1983 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-19) [ 1977 0 R /XYZ 60.307257 466.429086 0 ] (Code/Window/:__span-0-190) [ 1985 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-191) [ 1985 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-192) [ 1985 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-193) [ 1985 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-194) [ 1985 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-195) [ 1985 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-196) [ 1985 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-197) [ 1985 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-198) [ 1985 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-199) [ 1985 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-2) [ 1977 0 R /XYZ 60.307257 694.235070 0 ] (Code/Window/:__span-0-20) [ 1977 0 R /XYZ 60.307257 453.028734 0 ] (Code/Window/:__span-0-200) [ 1985 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-201) [ 1985 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-202) [ 1985 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-203) [ 1985 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-204) [ 1985 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-205) [ 1985 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-206) [ 1985 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-207) [ 1985 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-208) [ 1985 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-209) [ 1985 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-21) [ 1977 0 R /XYZ 60.307257 439.628382 0 ] (Code/Window/:__span-0-210) [ 1985 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-211) [ 1985 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-212) [ 1985 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-213) [ 1985 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-214) [ 1985 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-215) [ 1985 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-216) [ 1985 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-217) [ 1985 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-218) [ 1985 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-219) [ 1985 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-22) [ 1977 0 R /XYZ 60.307257 426.228030 0 ] (Code/Window/:__span-0-220) [ 1985 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-221) [ 1985 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-222) [ 1985 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-223) [ 1985 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-224) [ 1985 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-225) [ 1985 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-226) [ 1985 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-227) [ 1985 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-228) [ 1985 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-229) [ 1985 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-23) [ 1977 0 R /XYZ 60.307257 412.827678 0 ] (Code/Window/:__span-0-230) [ 1985 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-231) [ 1985 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-232) [ 1985 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-233) [ 1985 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-234) [ 1985 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-235) [ 1985 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-236) [ 1985 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-237) [ 1985 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-238) [ 1987 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-239) [ 1987 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-24) [ 1977 0 R /XYZ 60.307257 399.427326 0 ] (Code/Window/:__span-0-240) [ 1987 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-241) [ 1987 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-242) [ 1987 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-243) [ 1987 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-244) [ 1987 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-245) [ 1987 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-246) [ 1987 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-247) [ 1987 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-248) [ 1987 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-249) [ 1987 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-25) [ 1977 0 R /XYZ 60.307257 386.026974 0 ] (Code/Window/:__span-0-250) [ 1987 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-251) [ 1987 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-252) [ 1987 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-253) [ 1987 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-254) [ 1987 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-255) [ 1987 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-256) [ 1987 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-257) [ 1987 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-258) [ 1987 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-259) [ 1987 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-26) [ 1977 0 R /XYZ 60.307257 372.626622 0 ] (Code/Window/:__span-0-260) [ 1987 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-261) [ 1987 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-262) [ 1987 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-263) [ 1987 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-264) [ 1987 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-265) [ 1987 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-266) [ 1987 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-267) [ 1987 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-268) [ 1987 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-269) [ 1987 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-27) [ 1977 0 R /XYZ 60.307257 359.226270 0 ] (Code/Window/:__span-0-270) [ 1987 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-271) [ 1987 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-272) [ 1987 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-273) [ 1987 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-274) [ 1987 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-275) [ 1987 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-276) [ 1987 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-277) [ 1987 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-278) [ 1987 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-279) [ 1987 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-28) [ 1977 0 R /XYZ 60.307257 345.825918 0 ] (Code/Window/:__span-0-280) [ 1987 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-281) [ 1987 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-282) [ 1987 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-283) [ 1987 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-284) [ 1987 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-285) [ 1989 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-286) [ 1989 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-287) [ 1989 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-288) [ 1989 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-289) [ 1989 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-29) [ 1977 0 R /XYZ 60.307257 332.425566 0 ] (Code/Window/:__span-0-290) [ 1989 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-291) [ 1989 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-292) [ 1989 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-293) [ 1989 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-294) [ 1989 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-295) [ 1989 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-296) [ 1989 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-297) [ 1989 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-298) [ 1989 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-299) [ 1989 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-3) [ 1977 0 R /XYZ 60.307257 680.834718 0 ] (Code/Window/:__span-0-30) [ 1977 0 R /XYZ 60.307257 319.025214 0 ] (Code/Window/:__span-0-300) [ 1989 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-301) [ 1989 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-302) [ 1989 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-303) [ 1989 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-304) [ 1989 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-305) [ 1989 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-306) [ 1989 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-307) [ 1989 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-308) [ 1989 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-309) [ 1989 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-31) [ 1977 0 R /XYZ 60.307257 305.624862 0 ] (Code/Window/:__span-0-310) [ 1989 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-311) [ 1989 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-312) [ 1989 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-313) [ 1989 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-314) [ 1989 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-315) [ 1989 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-316) [ 1989 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-317) [ 1989 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-318) [ 1989 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-319) [ 1989 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-32) [ 1977 0 R /XYZ 60.307257 292.224510 0 ] (Code/Window/:__span-0-320) [ 1989 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-321) [ 1989 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-322) [ 1989 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-323) [ 1989 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-324) [ 1989 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-325) [ 1989 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-326) [ 1989 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-327) [ 1991 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-328) [ 1991 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-329) [ 1991 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-33) [ 1977 0 R /XYZ 60.307257 278.824158 0 ] (Code/Window/:__span-0-330) [ 1991 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-331) [ 1991 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-332) [ 1991 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-333) [ 1991 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-334) [ 1991 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-335) [ 1991 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-336) [ 1991 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-337) [ 1991 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-338) [ 1991 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-339) [ 1991 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-34) [ 1977 0 R /XYZ 60.307257 265.423806 0 ] (Code/Window/:__span-0-340) [ 1991 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-341) [ 1991 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-342) [ 1991 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-343) [ 1991 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-344) [ 1991 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-345) [ 1991 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-346) [ 1991 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-347) [ 1991 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-348) [ 1991 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-349) [ 1991 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-35) [ 1977 0 R /XYZ 60.307257 252.023454 0 ] (Code/Window/:__span-0-350) [ 1991 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-351) [ 1991 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-352) [ 1991 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-353) [ 1991 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-354) [ 1991 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-355) [ 1991 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-356) [ 1991 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-357) [ 1991 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-358) [ 1991 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-359) [ 1991 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-36) [ 1977 0 R /XYZ 60.307257 238.623102 0 ] (Code/Window/:__span-0-360) [ 1991 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-361) [ 1991 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-362) [ 1991 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-363) [ 1991 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-364) [ 1991 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-365) [ 1991 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-366) [ 1991 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-367) [ 1991 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-368) [ 1991 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-369) [ 1993 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-37) [ 1977 0 R /XYZ 60.307257 225.222750 0 ] (Code/Window/:__span-0-370) [ 1993 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-371) [ 1993 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-372) [ 1993 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-373) [ 1993 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-374) [ 1993 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-375) [ 1993 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-376) [ 1993 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-377) [ 1993 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-378) [ 1993 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-379) [ 1993 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-38) [ 1977 0 R /XYZ 60.307257 211.822398 0 ] (Code/Window/:__span-0-380) [ 1993 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-381) [ 1993 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-382) [ 1993 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-383) [ 1993 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-384) [ 1993 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-385) [ 1993 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-386) [ 1993 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-387) [ 1993 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-388) [ 1993 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-389) [ 1993 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-39) [ 1977 0 R /XYZ 60.307257 198.422046 0 ] (Code/Window/:__span-0-390) [ 1993 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-391) [ 1993 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-392) [ 1993 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-393) [ 1993 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-394) [ 1993 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-395) [ 1993 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-396) [ 1993 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-397) [ 1993 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-398) [ 1993 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-399) [ 1993 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-4) [ 1977 0 R /XYZ 60.307257 667.434366 0 ] (Code/Window/:__span-0-40) [ 1977 0 R /XYZ 60.307257 171.621342 0 ] (Code/Window/:__span-0-400) [ 1993 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-401) [ 1993 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-402) [ 1993 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-403) [ 1993 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-404) [ 1993 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-405) [ 1993 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-406) [ 1993 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-407) [ 1995 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-408) [ 1995 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-409) [ 1995 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-41) [ 1977 0 R /XYZ 60.307257 158.220990 0 ] (Code/Window/:__span-0-410) [ 1995 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-411) [ 1995 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-412) [ 1995 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-413) [ 1995 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-414) [ 1995 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-415) [ 1995 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-416) [ 1995 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-417) [ 1995 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-418) [ 1995 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-419) [ 1995 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-42) [ 1977 0 R /XYZ 60.307257 144.820638 0 ] (Code/Window/:__span-0-420) [ 1995 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-421) [ 1995 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-422) [ 1995 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-423) [ 1995 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-424) [ 1995 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-425) [ 1995 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-426) [ 1995 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-427) [ 1995 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-428) [ 1995 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-429) [ 1995 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-43) [ 1977 0 R /XYZ 60.307257 131.420286 0 ] (Code/Window/:__span-0-430) [ 1995 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-431) [ 1995 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-432) [ 1995 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-433) [ 1995 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-434) [ 1995 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-435) [ 1995 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-436) [ 1995 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-437) [ 1995 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-438) [ 1995 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-439) [ 1995 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-44) [ 1977 0 R /XYZ 60.307257 118.019934 0 ] (Code/Window/:__span-0-440) [ 1995 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-441) [ 1995 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-442) [ 1995 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-443) [ 1995 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-444) [ 1995 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-445) [ 1995 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-446) [ 1995 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-447) [ 1995 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-448) [ 1995 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-449) [ 1995 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-45) [ 1977 0 R /XYZ 60.307257 104.619582 0 ] (Code/Window/:__span-0-450) [ 1995 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-451) [ 1995 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-452) [ 1995 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-453) [ 1995 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-454) [ 1995 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-455) [ 1997 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-456) [ 1997 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-457) [ 1997 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-458) [ 1997 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-459) [ 1997 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-46) [ 1977 0 R /XYZ 60.307257 91.219230 0 ] (Code/Window/:__span-0-460) [ 1997 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-461) [ 1997 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-462) [ 1997 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-463) [ 1997 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-464) [ 1997 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-465) [ 1997 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-466) [ 1997 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-467) [ 1997 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-468) [ 1997 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-469) [ 1997 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-47) [ 1979 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-470) [ 1997 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-471) [ 1997 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-472) [ 1997 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-473) [ 1997 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-474) [ 1997 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-475) [ 1997 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-476) [ 1997 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-477) [ 1997 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-478) [ 1997 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-479) [ 1997 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-48) [ 1979 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-480) [ 1997 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-481) [ 1997 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-482) [ 1997 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-483) [ 1997 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-484) [ 1997 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-485) [ 1997 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-486) [ 1997 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-487) [ 1997 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-488) [ 1997 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-489) [ 1997 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-49) [ 1979 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-490) [ 1997 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-491) [ 1997 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-492) [ 1997 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-493) [ 1997 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-494) [ 1997 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-495) [ 1997 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-496) [ 1997 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-497) [ 1997 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-498) [ 1997 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-499) [ 1999 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-5) [ 1977 0 R /XYZ 60.307257 654.034014 0 ] (Code/Window/:__span-0-50) [ 1979 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-500) [ 1999 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-501) [ 1999 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-502) [ 1999 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-503) [ 1999 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-504) [ 1999 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-505) [ 1999 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-506) [ 1999 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-507) [ 1999 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-508) [ 1999 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-509) [ 1999 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-51) [ 1979 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-510) [ 1999 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-511) [ 1999 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-512) [ 1999 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-513) [ 1999 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-514) [ 1999 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-515) [ 1999 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-516) [ 1999 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-517) [ 1999 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-518) [ 1999 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-519) [ 1999 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-52) [ 1979 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-520) [ 1999 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-521) [ 1999 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-522) [ 1999 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-523) [ 1999 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-524) [ 1999 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-525) [ 1999 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-526) [ 1999 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-527) [ 1999 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-528) [ 1999 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-529) [ 1999 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-53) [ 1979 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-530) [ 1999 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-531) [ 1999 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-532) [ 1999 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-533) [ 1999 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-534) [ 1999 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-535) [ 1999 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-536) [ 1999 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-537) [ 1999 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-538) [ 1999 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-539) [ 2001 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-54) [ 1979 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-540) [ 2001 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-541) [ 2001 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-542) [ 2001 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-543) [ 2001 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-544) [ 2001 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-545) [ 2001 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-546) [ 2001 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-547) [ 2001 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-548) [ 2001 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-549) [ 2001 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-55) [ 1979 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-550) [ 2001 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-551) [ 2001 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-552) [ 2001 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-553) [ 2001 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-554) [ 2001 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-555) [ 2001 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-556) [ 2001 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-557) [ 2001 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-558) [ 2001 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-559) [ 2001 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-56) [ 1979 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-560) [ 2001 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-561) [ 2001 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-562) [ 2001 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-563) [ 2001 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-564) [ 2001 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-565) [ 2001 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-566) [ 2001 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-567) [ 2001 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-568) [ 2001 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-569) [ 2001 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-57) [ 1979 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-570) [ 2001 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-571) [ 2001 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-572) [ 2001 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-573) [ 2001 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-574) [ 2001 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-575) [ 2001 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-576) [ 2001 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-577) [ 2001 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-578) [ 2001 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-579) [ 2001 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-58) [ 1979 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-580) [ 2001 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-581) [ 2001 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-582) [ 2001 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-583) [ 2001 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-584) [ 2001 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-585) [ 2001 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-586) [ 2003 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-587) [ 2003 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-588) [ 2003 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-589) [ 2003 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-59) [ 1979 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-590) [ 2003 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-591) [ 2003 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-592) [ 2003 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-593) [ 2003 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-594) [ 2003 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-595) [ 2003 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-596) [ 2003 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-597) [ 2003 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-598) [ 2003 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-599) [ 2003 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-6) [ 1977 0 R /XYZ 60.307257 640.633662 0 ] (Code/Window/:__span-0-60) [ 1979 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-600) [ 2003 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-601) [ 2003 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-602) [ 2003 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-603) [ 2003 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-604) [ 2003 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-605) [ 2003 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-606) [ 2003 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-607) [ 2003 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-608) [ 2003 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-609) [ 2003 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-61) [ 1979 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-610) [ 2003 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-611) [ 2003 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-612) [ 2003 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-613) [ 2003 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-614) [ 2003 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-615) [ 2003 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-616) [ 2003 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-617) [ 2003 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-618) [ 2003 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-619) [ 2003 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-62) [ 1979 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-620) [ 2003 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-621) [ 2003 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-622) [ 2003 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-623) [ 2003 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-624) [ 2003 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-625) [ 2003 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-626) [ 2003 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-627) [ 2003 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-628) [ 2003 0 R /XYZ 60.307257 127.806726 0 ] (Code/Window/:__span-0-629) [ 2003 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-63) [ 1979 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-630) [ 2003 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-631) [ 2003 0 R /XYZ 60.307257 87.605670 0 ] (Code/Window/:__span-0-632) [ 2005 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-633) [ 2005 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-634) [ 2005 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-635) [ 2005 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-636) [ 2005 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-637) [ 2005 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:__span-0-638) [ 2005 0 R /XYZ 60.307257 690.621510 0 ] (Code/Window/:__span-0-639) [ 2005 0 R /XYZ 60.307257 677.221158 0 ] (Code/Window/:__span-0-64) [ 1979 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-640) [ 2005 0 R /XYZ 60.307257 663.820806 0 ] (Code/Window/:__span-0-641) [ 2005 0 R /XYZ 60.307257 650.420454 0 ] (Code/Window/:__span-0-642) [ 2005 0 R /XYZ 60.307257 637.020102 0 ] (Code/Window/:__span-0-643) [ 2005 0 R /XYZ 60.307257 623.619750 0 ] (Code/Window/:__span-0-644) [ 2005 0 R /XYZ 60.307257 610.219398 0 ] (Code/Window/:__span-0-645) [ 2005 0 R /XYZ 60.307257 596.819046 0 ] (Code/Window/:__span-0-646) [ 2005 0 R /XYZ 60.307257 583.418694 0 ] (Code/Window/:__span-0-647) [ 2005 0 R /XYZ 60.307257 570.018342 0 ] (Code/Window/:__span-0-648) [ 2005 0 R /XYZ 60.307257 556.617990 0 ] (Code/Window/:__span-0-649) [ 2005 0 R /XYZ 60.307257 543.217638 0 ] (Code/Window/:__span-0-65) [ 1979 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-650) [ 2005 0 R /XYZ 60.307257 529.817286 0 ] (Code/Window/:__span-0-651) [ 2005 0 R /XYZ 60.307257 516.416934 0 ] (Code/Window/:__span-0-652) [ 2005 0 R /XYZ 60.307257 503.016582 0 ] (Code/Window/:__span-0-653) [ 2005 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-654) [ 2005 0 R /XYZ 60.307257 476.215878 0 ] (Code/Window/:__span-0-655) [ 2005 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-656) [ 2005 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-657) [ 2005 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-658) [ 2005 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-659) [ 2005 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-66) [ 1979 0 R /XYZ 60.307257 489.616230 0 ] (Code/Window/:__span-0-660) [ 2005 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-661) [ 2005 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-662) [ 2005 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-663) [ 2005 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-664) [ 2005 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-665) [ 2005 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-666) [ 2005 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-667) [ 2005 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-668) [ 2005 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-669) [ 2005 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-67) [ 1979 0 R /XYZ 60.307257 462.815526 0 ] (Code/Window/:__span-0-670) [ 2005 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-671) [ 2005 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-672) [ 2005 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-673) [ 2005 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-674) [ 2005 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-675) [ 2005 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-676) [ 2005 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-68) [ 1979 0 R /XYZ 60.307257 449.415174 0 ] (Code/Window/:__span-0-69) [ 1979 0 R /XYZ 60.307257 436.014822 0 ] (Code/Window/:__span-0-7) [ 1977 0 R /XYZ 60.307257 627.233310 0 ] (Code/Window/:__span-0-70) [ 1979 0 R /XYZ 60.307257 422.614470 0 ] (Code/Window/:__span-0-71) [ 1979 0 R /XYZ 60.307257 409.214118 0 ] (Code/Window/:__span-0-72) [ 1979 0 R /XYZ 60.307257 395.813766 0 ] (Code/Window/:__span-0-73) [ 1979 0 R /XYZ 60.307257 382.413414 0 ] (Code/Window/:__span-0-74) [ 1979 0 R /XYZ 60.307257 369.013062 0 ] (Code/Window/:__span-0-75) [ 1979 0 R /XYZ 60.307257 355.612710 0 ] (Code/Window/:__span-0-76) [ 1979 0 R /XYZ 60.307257 342.212358 0 ] (Code/Window/:__span-0-77) [ 1979 0 R /XYZ 60.307257 328.812006 0 ] (Code/Window/:__span-0-78) [ 1979 0 R /XYZ 60.307257 315.411654 0 ] (Code/Window/:__span-0-79) [ 1979 0 R /XYZ 60.307257 302.011302 0 ] (Code/Window/:__span-0-8) [ 1977 0 R /XYZ 60.307257 613.832958 0 ] (Code/Window/:__span-0-80) [ 1979 0 R /XYZ 60.307257 288.610950 0 ] (Code/Window/:__span-0-81) [ 1979 0 R /XYZ 60.307257 275.210598 0 ] (Code/Window/:__span-0-82) [ 1979 0 R /XYZ 60.307257 261.810246 0 ] (Code/Window/:__span-0-83) [ 1979 0 R /XYZ 60.307257 248.409894 0 ] (Code/Window/:__span-0-84) [ 1979 0 R /XYZ 60.307257 235.009542 0 ] (Code/Window/:__span-0-85) [ 1979 0 R /XYZ 60.307257 221.609190 0 ] (Code/Window/:__span-0-86) [ 1979 0 R /XYZ 60.307257 208.208838 0 ] (Code/Window/:__span-0-87) [ 1979 0 R /XYZ 60.307257 194.808486 0 ] (Code/Window/:__span-0-88) [ 1979 0 R /XYZ 60.307257 181.408134 0 ] (Code/Window/:__span-0-89) [ 1979 0 R /XYZ 60.307257 168.007782 0 ] (Code/Window/:__span-0-9) [ 1977 0 R /XYZ 60.307257 600.432606 0 ] (Code/Window/:__span-0-90) [ 1979 0 R /XYZ 60.307257 154.607430 0 ] (Code/Window/:__span-0-91) [ 1979 0 R /XYZ 60.307257 141.207078 0 ] (Code/Window/:__span-0-92) [ 1979 0 R /XYZ 60.307257 114.406374 0 ] (Code/Window/:__span-0-93) [ 1979 0 R /XYZ 60.307257 101.006022 0 ] (Code/Window/:__span-0-94) [ 1981 0 R /XYZ 60.307257 771.023622 0 ] (Code/Window/:__span-0-95) [ 1981 0 R /XYZ 60.307257 757.623270 0 ] (Code/Window/:__span-0-96) [ 1981 0 R /XYZ 60.307257 744.222918 0 ] (Code/Window/:__span-0-97) [ 1981 0 R /XYZ 60.307257 730.822566 0 ] (Code/Window/:__span-0-98) [ 1981 0 R /XYZ 60.307257 717.422214 0 ] (Code/Window/:__span-0-99) [ 1981 0 R /XYZ 60.307257 704.021862 0 ] (Code/Window/:windowcs) [ 1977 0 R /XYZ 39.386457 747.563622 0 ] (Code/Zone/:) [ 1863 0 R /XYZ 39.386457 747.563622 0 ] (Code/Zone/:__span-0-1) [ 1863 0 R /XYZ 60.307257 707.635422 0 ] (Code/Zone/:__span-0-10) [ 1863 0 R /XYZ 60.307257 573.631902 0 ] (Code/Zone/:__span-0-100) [ 1867 0 R /XYZ 60.307257 623.619750 0 ] (Code/Zone/:__span-0-101) [ 1867 0 R /XYZ 60.307257 610.219398 0 ] (Code/Zone/:__span-0-102) [ 1867 0 R /XYZ 60.307257 583.418694 0 ] (Code/Zone/:__span-0-103) [ 1867 0 R /XYZ 60.307257 570.018342 0 ] (Code/Zone/:__span-0-104) [ 1867 0 R /XYZ 60.307257 556.617990 0 ] (Code/Zone/:__span-0-105) [ 1867 0 R /XYZ 60.307257 543.217638 0 ] (Code/Zone/:__span-0-106) [ 1867 0 R /XYZ 60.307257 516.416934 0 ] (Code/Zone/:__span-0-107) [ 1867 0 R /XYZ 60.307257 503.016582 0 ] (Code/Zone/:__span-0-108) [ 1867 0 R /XYZ 60.307257 489.616230 0 ] (Code/Zone/:__span-0-109) [ 1867 0 R /XYZ 60.307257 476.215878 0 ] (Code/Zone/:__span-0-11) [ 1863 0 R /XYZ 60.307257 560.231550 0 ] (Code/Zone/:__span-0-110) [ 1867 0 R /XYZ 60.307257 462.815526 0 ] (Code/Zone/:__span-0-111) [ 1867 0 R /XYZ 60.307257 449.415174 0 ] (Code/Zone/:__span-0-112) [ 1867 0 R /XYZ 60.307257 436.014822 0 ] (Code/Zone/:__span-0-113) [ 1867 0 R /XYZ 60.307257 422.614470 0 ] (Code/Zone/:__span-0-114) [ 1867 0 R /XYZ 60.307257 409.214118 0 ] (Code/Zone/:__span-0-115) [ 1867 0 R /XYZ 60.307257 395.813766 0 ] (Code/Zone/:__span-0-116) [ 1867 0 R /XYZ 60.307257 382.413414 0 ] (Code/Zone/:__span-0-117) [ 1867 0 R /XYZ 60.307257 369.013062 0 ] (Code/Zone/:__span-0-118) [ 1867 0 R /XYZ 60.307257 355.612710 0 ] (Code/Zone/:__span-0-119) [ 1867 0 R /XYZ 60.307257 342.212358 0 ] (Code/Zone/:__span-0-12) [ 1863 0 R /XYZ 60.307257 546.831198 0 ] (Code/Zone/:__span-0-120) [ 1867 0 R /XYZ 60.307257 328.812006 0 ] (Code/Zone/:__span-0-121) [ 1867 0 R /XYZ 60.307257 315.411654 0 ] (Code/Zone/:__span-0-122) [ 1867 0 R /XYZ 60.307257 302.011302 0 ] (Code/Zone/:__span-0-123) [ 1867 0 R /XYZ 60.307257 288.610950 0 ] (Code/Zone/:__span-0-124) [ 1867 0 R /XYZ 60.307257 275.210598 0 ] (Code/Zone/:__span-0-125) [ 1867 0 R /XYZ 60.307257 261.810246 0 ] (Code/Zone/:__span-0-126) [ 1867 0 R /XYZ 60.307257 248.409894 0 ] (Code/Zone/:__span-0-127) [ 1867 0 R /XYZ 60.307257 235.009542 0 ] (Code/Zone/:__span-0-128) [ 1867 0 R /XYZ 60.307257 221.609190 0 ] (Code/Zone/:__span-0-129) [ 1867 0 R /XYZ 60.307257 208.208838 0 ] (Code/Zone/:__span-0-13) [ 1863 0 R /XYZ 60.307257 533.430846 0 ] (Code/Zone/:__span-0-130) [ 1867 0 R /XYZ 60.307257 194.808486 0 ] (Code/Zone/:__span-0-131) [ 1867 0 R /XYZ 60.307257 181.408134 0 ] (Code/Zone/:__span-0-132) [ 1867 0 R /XYZ 60.307257 168.007782 0 ] (Code/Zone/:__span-0-133) [ 1867 0 R /XYZ 60.307257 154.607430 0 ] (Code/Zone/:__span-0-134) [ 1867 0 R /XYZ 60.307257 141.207078 0 ] (Code/Zone/:__span-0-135) [ 1867 0 R /XYZ 60.307257 127.806726 0 ] (Code/Zone/:__span-0-136) [ 1867 0 R /XYZ 60.307257 114.406374 0 ] (Code/Zone/:__span-0-137) [ 1867 0 R /XYZ 60.307257 101.006022 0 ] (Code/Zone/:__span-0-138) [ 1867 0 R /XYZ 60.307257 87.605670 0 ] (Code/Zone/:__span-0-139) [ 1869 0 R /XYZ 60.307257 771.023622 0 ] (Code/Zone/:__span-0-14) [ 1863 0 R /XYZ 60.307257 520.030494 0 ] (Code/Zone/:__span-0-140) [ 1869 0 R /XYZ 60.307257 757.623270 0 ] (Code/Zone/:__span-0-141) [ 1869 0 R /XYZ 60.307257 744.222918 0 ] (Code/Zone/:__span-0-142) [ 1869 0 R /XYZ 60.307257 730.822566 0 ] (Code/Zone/:__span-0-143) [ 1869 0 R /XYZ 60.307257 717.422214 0 ] (Code/Zone/:__span-0-144) [ 1869 0 R /XYZ 60.307257 690.621510 0 ] (Code/Zone/:__span-0-145) [ 1869 0 R /XYZ 60.307257 677.221158 0 ] (Code/Zone/:__span-0-146) [ 1869 0 R /XYZ 60.307257 663.820806 0 ] (Code/Zone/:__span-0-147) [ 1869 0 R /XYZ 60.307257 650.420454 0 ] (Code/Zone/:__span-0-148) [ 1869 0 R /XYZ 60.307257 623.619750 0 ] (Code/Zone/:__span-0-149) [ 1869 0 R /XYZ 60.307257 596.819046 0 ] (Code/Zone/:__span-0-15) [ 1863 0 R /XYZ 60.307257 506.630142 0 ] (Code/Zone/:__span-0-150) [ 1869 0 R /XYZ 60.307257 583.418694 0 ] (Code/Zone/:__span-0-151) [ 1869 0 R /XYZ 60.307257 570.018342 0 ] (Code/Zone/:__span-0-152) [ 1869 0 R /XYZ 60.307257 556.617990 0 ] (Code/Zone/:__span-0-153) [ 1869 0 R /XYZ 60.307257 529.817286 0 ] (Code/Zone/:__span-0-154) [ 1869 0 R /XYZ 60.307257 516.416934 0 ] (Code/Zone/:__span-0-155) [ 1869 0 R /XYZ 60.307257 503.016582 0 ] (Code/Zone/:__span-0-156) [ 1869 0 R /XYZ 60.307257 489.616230 0 ] (Code/Zone/:__span-0-157) [ 1869 0 R /XYZ 60.307257 476.215878 0 ] (Code/Zone/:__span-0-158) [ 1869 0 R /XYZ 60.307257 462.815526 0 ] (Code/Zone/:__span-0-159) [ 1869 0 R /XYZ 60.307257 449.415174 0 ] (Code/Zone/:__span-0-16) [ 1863 0 R /XYZ 60.307257 493.229790 0 ] (Code/Zone/:__span-0-160) [ 1869 0 R /XYZ 60.307257 436.014822 0 ] (Code/Zone/:__span-0-161) [ 1869 0 R /XYZ 60.307257 422.614470 0 ] (Code/Zone/:__span-0-162) [ 1869 0 R /XYZ 60.307257 409.214118 0 ] (Code/Zone/:__span-0-163) [ 1869 0 R /XYZ 60.307257 395.813766 0 ] (Code/Zone/:__span-0-164) [ 1869 0 R /XYZ 60.307257 382.413414 0 ] (Code/Zone/:__span-0-165) [ 1869 0 R /XYZ 60.307257 369.013062 0 ] (Code/Zone/:__span-0-166) [ 1869 0 R /XYZ 60.307257 355.612710 0 ] (Code/Zone/:__span-0-167) [ 1869 0 R /XYZ 60.307257 342.212358 0 ] (Code/Zone/:__span-0-168) [ 1869 0 R /XYZ 60.307257 328.812006 0 ] (Code/Zone/:__span-0-169) [ 1869 0 R /XYZ 60.307257 315.411654 0 ] (Code/Zone/:__span-0-17) [ 1863 0 R /XYZ 60.307257 479.829438 0 ] (Code/Zone/:__span-0-170) [ 1869 0 R /XYZ 60.307257 302.011302 0 ] (Code/Zone/:__span-0-171) [ 1869 0 R /XYZ 60.307257 288.610950 0 ] (Code/Zone/:__span-0-172) [ 1869 0 R /XYZ 60.307257 261.810246 0 ] (Code/Zone/:__span-0-173) [ 1869 0 R /XYZ 60.307257 248.409894 0 ] (Code/Zone/:__span-0-174) [ 1869 0 R /XYZ 60.307257 235.009542 0 ] (Code/Zone/:__span-0-175) [ 1869 0 R /XYZ 60.307257 221.609190 0 ] (Code/Zone/:__span-0-176) [ 1869 0 R /XYZ 60.307257 181.408134 0 ] (Code/Zone/:__span-0-177) [ 1869 0 R /XYZ 60.307257 168.007782 0 ] (Code/Zone/:__span-0-178) [ 1869 0 R /XYZ 60.307257 154.607430 0 ] (Code/Zone/:__span-0-179) [ 1869 0 R /XYZ 60.307257 141.207078 0 ] (Code/Zone/:__span-0-18) [ 1863 0 R /XYZ 60.307257 466.429086 0 ] (Code/Zone/:__span-0-180) [ 1869 0 R /XYZ 60.307257 127.806726 0 ] (Code/Zone/:__span-0-181) [ 1869 0 R /XYZ 60.307257 114.406374 0 ] (Code/Zone/:__span-0-182) [ 1869 0 R /XYZ 60.307257 101.006022 0 ] (Code/Zone/:__span-0-183) [ 1869 0 R /XYZ 60.307257 87.605670 0 ] (Code/Zone/:__span-0-184) [ 1871 0 R /XYZ 60.307257 771.023622 0 ] (Code/Zone/:__span-0-185) [ 1871 0 R /XYZ 60.307257 757.623270 0 ] (Code/Zone/:__span-0-19) [ 1863 0 R /XYZ 60.307257 453.028734 0 ] (Code/Zone/:__span-0-2) [ 1863 0 R /XYZ 60.307257 694.235070 0 ] (Code/Zone/:__span-0-20) [ 1863 0 R /XYZ 60.307257 439.628382 0 ] (Code/Zone/:__span-0-21) [ 1863 0 R /XYZ 60.307257 426.228030 0 ] (Code/Zone/:__span-0-22) [ 1863 0 R /XYZ 60.307257 412.827678 0 ] (Code/Zone/:__span-0-23) [ 1863 0 R /XYZ 60.307257 399.427326 0 ] (Code/Zone/:__span-0-24) [ 1863 0 R /XYZ 60.307257 386.026974 0 ] (Code/Zone/:__span-0-25) [ 1863 0 R /XYZ 60.307257 372.626622 0 ] (Code/Zone/:__span-0-26) [ 1863 0 R /XYZ 60.307257 359.226270 0 ] (Code/Zone/:__span-0-27) [ 1863 0 R /XYZ 60.307257 345.825918 0 ] (Code/Zone/:__span-0-28) [ 1863 0 R /XYZ 60.307257 332.425566 0 ] (Code/Zone/:__span-0-29) [ 1863 0 R /XYZ 60.307257 319.025214 0 ] (Code/Zone/:__span-0-3) [ 1863 0 R /XYZ 60.307257 680.834718 0 ] (Code/Zone/:__span-0-30) [ 1863 0 R /XYZ 60.307257 305.624862 0 ] (Code/Zone/:__span-0-31) [ 1863 0 R /XYZ 60.307257 292.224510 0 ] (Code/Zone/:__span-0-32) [ 1863 0 R /XYZ 60.307257 265.423806 0 ] (Code/Zone/:__span-0-33) [ 1863 0 R /XYZ 60.307257 252.023454 0 ] (Code/Zone/:__span-0-34) [ 1863 0 R /XYZ 60.307257 238.623102 0 ] (Code/Zone/:__span-0-35) [ 1863 0 R /XYZ 60.307257 225.222750 0 ] (Code/Zone/:__span-0-36) [ 1863 0 R /XYZ 60.307257 211.822398 0 ] (Code/Zone/:__span-0-37) [ 1863 0 R /XYZ 60.307257 198.422046 0 ] (Code/Zone/:__span-0-38) [ 1863 0 R /XYZ 60.307257 185.021694 0 ] (Code/Zone/:__span-0-39) [ 1863 0 R /XYZ 60.307257 171.621342 0 ] (Code/Zone/:__span-0-4) [ 1863 0 R /XYZ 60.307257 667.434366 0 ] (Code/Zone/:__span-0-40) [ 1863 0 R /XYZ 60.307257 158.220990 0 ] (Code/Zone/:__span-0-41) [ 1863 0 R /XYZ 60.307257 131.420286 0 ] (Code/Zone/:__span-0-42) [ 1863 0 R /XYZ 60.307257 118.019934 0 ] (Code/Zone/:__span-0-43) [ 1863 0 R /XYZ 60.307257 104.619582 0 ] (Code/Zone/:__span-0-44) [ 1863 0 R /XYZ 60.307257 91.219230 0 ] (Code/Zone/:__span-0-45) [ 1865 0 R /XYZ 60.307257 771.023622 0 ] (Code/Zone/:__span-0-46) [ 1865 0 R /XYZ 60.307257 757.623270 0 ] (Code/Zone/:__span-0-47) [ 1865 0 R /XYZ 60.307257 744.222918 0 ] (Code/Zone/:__span-0-48) [ 1865 0 R /XYZ 60.307257 730.822566 0 ] (Code/Zone/:__span-0-49) [ 1865 0 R /XYZ 60.307257 717.422214 0 ] (Code/Zone/:__span-0-5) [ 1863 0 R /XYZ 60.307257 640.633662 0 ] (Code/Zone/:__span-0-50) [ 1865 0 R /XYZ 60.307257 704.021862 0 ] (Code/Zone/:__span-0-51) [ 1865 0 R /XYZ 60.307257 690.621510 0 ] (Code/Zone/:__span-0-52) [ 1865 0 R /XYZ 60.307257 677.221158 0 ] (Code/Zone/:__span-0-53) [ 1865 0 R /XYZ 60.307257 650.420454 0 ] (Code/Zone/:__span-0-54) [ 1865 0 R /XYZ 60.307257 637.020102 0 ] (Code/Zone/:__span-0-55) [ 1865 0 R /XYZ 60.307257 610.219398 0 ] (Code/Zone/:__span-0-56) [ 1865 0 R /XYZ 60.307257 596.819046 0 ] (Code/Zone/:__span-0-57) [ 1865 0 R /XYZ 60.307257 583.418694 0 ] (Code/Zone/:__span-0-58) [ 1865 0 R /XYZ 60.307257 570.018342 0 ] (Code/Zone/:__span-0-59) [ 1865 0 R /XYZ 60.307257 556.617990 0 ] (Code/Zone/:__span-0-6) [ 1863 0 R /XYZ 60.307257 627.233310 0 ] (Code/Zone/:__span-0-60) [ 1865 0 R /XYZ 60.307257 543.217638 0 ] (Code/Zone/:__span-0-61) [ 1865 0 R /XYZ 60.307257 529.817286 0 ] (Code/Zone/:__span-0-62) [ 1865 0 R /XYZ 60.307257 503.016582 0 ] (Code/Zone/:__span-0-63) [ 1865 0 R /XYZ 60.307257 489.616230 0 ] (Code/Zone/:__span-0-64) [ 1865 0 R /XYZ 60.307257 476.215878 0 ] (Code/Zone/:__span-0-65) [ 1865 0 R /XYZ 60.307257 462.815526 0 ] (Code/Zone/:__span-0-66) [ 1865 0 R /XYZ 60.307257 449.415174 0 ] (Code/Zone/:__span-0-67) [ 1865 0 R /XYZ 60.307257 436.014822 0 ] (Code/Zone/:__span-0-68) [ 1865 0 R /XYZ 60.307257 422.614470 0 ] (Code/Zone/:__span-0-69) [ 1865 0 R /XYZ 60.307257 395.813766 0 ] (Code/Zone/:__span-0-7) [ 1863 0 R /XYZ 60.307257 613.832958 0 ] (Code/Zone/:__span-0-70) [ 1865 0 R /XYZ 60.307257 382.413414 0 ] (Code/Zone/:__span-0-71) [ 1865 0 R /XYZ 60.307257 369.013062 0 ] (Code/Zone/:__span-0-72) [ 1865 0 R /XYZ 60.307257 355.612710 0 ] (Code/Zone/:__span-0-73) [ 1865 0 R /XYZ 60.307257 342.212358 0 ] (Code/Zone/:__span-0-74) [ 1865 0 R /XYZ 60.307257 328.812006 0 ] (Code/Zone/:__span-0-75) [ 1865 0 R /XYZ 60.307257 315.411654 0 ] (Code/Zone/:__span-0-76) [ 1865 0 R /XYZ 60.307257 302.011302 0 ] (Code/Zone/:__span-0-77) [ 1865 0 R /XYZ 60.307257 288.610950 0 ] (Code/Zone/:__span-0-78) [ 1865 0 R /XYZ 60.307257 275.210598 0 ] (Code/Zone/:__span-0-79) [ 1865 0 R /XYZ 60.307257 261.810246 0 ] (Code/Zone/:__span-0-8) [ 1863 0 R /XYZ 60.307257 600.432606 0 ] (Code/Zone/:__span-0-80) [ 1865 0 R /XYZ 60.307257 248.409894 0 ] (Code/Zone/:__span-0-81) [ 1865 0 R /XYZ 60.307257 235.009542 0 ] (Code/Zone/:__span-0-82) [ 1865 0 R /XYZ 60.307257 221.609190 0 ] (Code/Zone/:__span-0-83) [ 1865 0 R /XYZ 60.307257 208.208838 0 ] (Code/Zone/:__span-0-84) [ 1865 0 R /XYZ 60.307257 194.808486 0 ] (Code/Zone/:__span-0-85) [ 1865 0 R /XYZ 60.307257 181.408134 0 ] (Code/Zone/:__span-0-86) [ 1865 0 R /XYZ 60.307257 168.007782 0 ] (Code/Zone/:__span-0-87) [ 1865 0 R /XYZ 60.307257 154.607430 0 ] (Code/Zone/:__span-0-88) [ 1865 0 R /XYZ 60.307257 141.207078 0 ] (Code/Zone/:__span-0-89) [ 1865 0 R /XYZ 60.307257 127.806726 0 ] (Code/Zone/:__span-0-9) [ 1863 0 R /XYZ 60.307257 587.032254 0 ] (Code/Zone/:__span-0-90) [ 1865 0 R /XYZ 60.307257 101.006022 0 ] (Code/Zone/:__span-0-91) [ 1865 0 R /XYZ 60.307257 87.605670 0 ] (Code/Zone/:__span-0-92) [ 1867 0 R /XYZ 60.307257 757.623270 0 ] (Code/Zone/:__span-0-93) [ 1867 0 R /XYZ 60.307257 730.822566 0 ] (Code/Zone/:__span-0-94) [ 1867 0 R /XYZ 60.307257 717.422214 0 ] (Code/Zone/:__span-0-95) [ 1867 0 R /XYZ 60.307257 704.021862 0 ] (Code/Zone/:__span-0-96) [ 1867 0 R /XYZ 60.307257 690.621510 0 ] (Code/Zone/:__span-0-97) [ 1867 0 R /XYZ 60.307257 677.221158 0 ] (Code/Zone/:__span-0-98) [ 1867 0 R /XYZ 60.307257 663.820806 0 ] (Code/Zone/:__span-0-99) [ 1867 0 R /XYZ 60.307257 650.420454 0 ] (Code/Zone/:zonecs) [ 1863 0 R /XYZ 39.386457 747.563622 0 ] (Code/recoverCookiesCSV/:) [ 2007 0 R /XYZ 39.386457 747.563622 0 ] (Code/recoverCookiesCSV/:__span-0-1) [ 2007 0 R /XYZ 60.307257 707.635422 0 ] (Code/recoverCookiesCSV/:__span-0-10) [ 2007 0 R /XYZ 60.307257 546.831198 0 ] (Code/recoverCookiesCSV/:__span-0-11) [ 2007 0 R /XYZ 60.307257 533.430846 0 ] (Code/recoverCookiesCSV/:__span-0-12) [ 2007 0 R /XYZ 60.307257 520.030494 0 ] (Code/recoverCookiesCSV/:__span-0-13) [ 2007 0 R /XYZ 60.307257 506.630142 0 ] (Code/recoverCookiesCSV/:__span-0-14) [ 2007 0 R /XYZ 60.307257 493.229790 0 ] (Code/recoverCookiesCSV/:__span-0-15) [ 2007 0 R /XYZ 60.307257 479.829438 0 ] (Code/recoverCookiesCSV/:__span-0-16) [ 2007 0 R /XYZ 60.307257 466.429086 0 ] (Code/recoverCookiesCSV/:__span-0-17) [ 2007 0 R /XYZ 60.307257 453.028734 0 ] (Code/recoverCookiesCSV/:__span-0-18) [ 2007 0 R /XYZ 60.307257 439.628382 0 ] (Code/recoverCookiesCSV/:__span-0-19) [ 2007 0 R /XYZ 60.307257 426.228030 0 ] (Code/recoverCookiesCSV/:__span-0-2) [ 2007 0 R /XYZ 60.307257 694.235070 0 ] (Code/recoverCookiesCSV/:__span-0-20) [ 2007 0 R /XYZ 60.307257 412.827678 0 ] (Code/recoverCookiesCSV/:__span-0-21) [ 2007 0 R /XYZ 60.307257 399.427326 0 ] (Code/recoverCookiesCSV/:__span-0-22) [ 2007 0 R /XYZ 60.307257 386.026974 0 ] (Code/recoverCookiesCSV/:__span-0-23) [ 2007 0 R /XYZ 60.307257 372.626622 0 ] (Code/recoverCookiesCSV/:__span-0-24) [ 2007 0 R /XYZ 60.307257 359.226270 0 ] (Code/recoverCookiesCSV/:__span-0-25) [ 2007 0 R /XYZ 60.307257 345.825918 0 ] (Code/recoverCookiesCSV/:__span-0-26) [ 2007 0 R /XYZ 60.307257 332.425566 0 ] (Code/recoverCookiesCSV/:__span-0-27) [ 2007 0 R /XYZ 60.307257 319.025214 0 ] (Code/recoverCookiesCSV/:__span-0-28) [ 2007 0 R /XYZ 60.307257 305.624862 0 ] (Code/recoverCookiesCSV/:__span-0-29) [ 2007 0 R /XYZ 60.307257 292.224510 0 ] (Code/recoverCookiesCSV/:__span-0-3) [ 2007 0 R /XYZ 60.307257 680.834718 0 ] (Code/recoverCookiesCSV/:__span-0-30) [ 2007 0 R /XYZ 60.307257 278.824158 0 ] (Code/recoverCookiesCSV/:__span-0-31) [ 2007 0 R /XYZ 60.307257 265.423806 0 ] (Code/recoverCookiesCSV/:__span-0-32) [ 2007 0 R /XYZ 60.307257 252.023454 0 ] (Code/recoverCookiesCSV/:__span-0-33) [ 2007 0 R /XYZ 60.307257 238.623102 0 ] (Code/recoverCookiesCSV/:__span-0-34) [ 2007 0 R /XYZ 60.307257 225.222750 0 ] (Code/recoverCookiesCSV/:__span-0-35) [ 2007 0 R /XYZ 60.307257 211.822398 0 ] (Code/recoverCookiesCSV/:__span-0-36) [ 2007 0 R /XYZ 60.307257 198.422046 0 ] (Code/recoverCookiesCSV/:__span-0-37) [ 2007 0 R /XYZ 60.307257 185.021694 0 ] (Code/recoverCookiesCSV/:__span-0-38) [ 2007 0 R /XYZ 60.307257 171.621342 0 ] (Code/recoverCookiesCSV/:__span-0-39) [ 2007 0 R /XYZ 60.307257 158.220990 0 ] (Code/recoverCookiesCSV/:__span-0-4) [ 2007 0 R /XYZ 60.307257 654.034014 0 ] (Code/recoverCookiesCSV/:__span-0-40) [ 2007 0 R /XYZ 60.307257 144.820638 0 ] (Code/recoverCookiesCSV/:__span-0-41) [ 2007 0 R /XYZ 60.307257 131.420286 0 ] (Code/recoverCookiesCSV/:__span-0-42) [ 2007 0 R /XYZ 60.307257 118.019934 0 ] (Code/recoverCookiesCSV/:__span-0-43) [ 2007 0 R /XYZ 60.307257 104.619582 0 ] (Code/recoverCookiesCSV/:__span-0-44) [ 2007 0 R /XYZ 60.307257 91.219230 0 ] (Code/recoverCookiesCSV/:__span-0-45) [ 2009 0 R /XYZ 60.307257 771.023622 0 ] (Code/recoverCookiesCSV/:__span-0-46) [ 2009 0 R /XYZ 60.307257 757.623270 0 ] (Code/recoverCookiesCSV/:__span-0-47) [ 2009 0 R /XYZ 60.307257 744.222918 0 ] (Code/recoverCookiesCSV/:__span-0-48) [ 2009 0 R /XYZ 60.307257 730.822566 0 ] (Code/recoverCookiesCSV/:__span-0-49) [ 2009 0 R /XYZ 60.307257 717.422214 0 ] (Code/recoverCookiesCSV/:__span-0-5) [ 2007 0 R /XYZ 60.307257 613.832958 0 ] (Code/recoverCookiesCSV/:__span-0-50) [ 2009 0 R /XYZ 60.307257 704.021862 0 ] (Code/recoverCookiesCSV/:__span-0-51) [ 2009 0 R /XYZ 60.307257 690.621510 0 ] (Code/recoverCookiesCSV/:__span-0-52) [ 2009 0 R /XYZ 60.307257 677.221158 0 ] (Code/recoverCookiesCSV/:__span-0-53) [ 2009 0 R /XYZ 60.307257 663.820806 0 ] (Code/recoverCookiesCSV/:__span-0-54) [ 2009 0 R /XYZ 60.307257 637.020102 0 ] (Code/recoverCookiesCSV/:__span-0-55) [ 2009 0 R /XYZ 60.307257 623.619750 0 ] (Code/recoverCookiesCSV/:__span-0-56) [ 2009 0 R /XYZ 60.307257 610.219398 0 ] (Code/recoverCookiesCSV/:__span-0-57) [ 2009 0 R /XYZ 60.307257 596.819046 0 ] (Code/recoverCookiesCSV/:__span-0-58) [ 2009 0 R /XYZ 60.307257 583.418694 0 ] (Code/recoverCookiesCSV/:__span-0-59) [ 2009 0 R /XYZ 60.307257 570.018342 0 ] (Code/recoverCookiesCSV/:__span-0-6) [ 2007 0 R /XYZ 60.307257 600.432606 0 ] (Code/recoverCookiesCSV/:__span-0-60) [ 2009 0 R /XYZ 60.307257 556.617990 0 ] (Code/recoverCookiesCSV/:__span-0-61) [ 2009 0 R /XYZ 60.307257 543.217638 0 ] (Code/recoverCookiesCSV/:__span-0-62) [ 2009 0 R /XYZ 60.307257 529.817286 0 ] (Code/recoverCookiesCSV/:__span-0-63) [ 2009 0 R /XYZ 60.307257 516.416934 0 ] (Code/recoverCookiesCSV/:__span-0-64) [ 2009 0 R /XYZ 60.307257 503.016582 0 ] (Code/recoverCookiesCSV/:__span-0-65) [ 2009 0 R /XYZ 60.307257 489.616230 0 ] (Code/recoverCookiesCSV/:__span-0-66) [ 2009 0 R /XYZ 60.307257 462.815526 0 ] (Code/recoverCookiesCSV/:__span-0-67) [ 2009 0 R /XYZ 60.307257 449.415174 0 ] (Code/recoverCookiesCSV/:__span-0-68) [ 2009 0 R /XYZ 60.307257 436.014822 0 ] (Code/recoverCookiesCSV/:__span-0-69) [ 2009 0 R /XYZ 60.307257 422.614470 0 ] (Code/recoverCookiesCSV/:__span-0-7) [ 2007 0 R /XYZ 60.307257 587.032254 0 ] (Code/recoverCookiesCSV/:__span-0-70) [ 2009 0 R /XYZ 60.307257 409.214118 0 ] (Code/recoverCookiesCSV/:__span-0-71) [ 2009 0 R /XYZ 60.307257 395.813766 0 ] (Code/recoverCookiesCSV/:__span-0-72) [ 2009 0 R /XYZ 60.307257 382.413414 0 ] (Code/recoverCookiesCSV/:__span-0-73) [ 2009 0 R /XYZ 60.307257 369.013062 0 ] (Code/recoverCookiesCSV/:__span-0-74) [ 2009 0 R /XYZ 60.307257 355.612710 0 ] (Code/recoverCookiesCSV/:__span-0-75) [ 2009 0 R /XYZ 60.307257 342.212358 0 ] (Code/recoverCookiesCSV/:__span-0-76) [ 2009 0 R /XYZ 60.307257 328.812006 0 ] (Code/recoverCookiesCSV/:__span-0-77) [ 2009 0 R /XYZ 60.307257 315.411654 0 ] (Code/recoverCookiesCSV/:__span-0-78) [ 2009 0 R /XYZ 60.307257 302.011302 0 ] (Code/recoverCookiesCSV/:__span-0-79) [ 2009 0 R /XYZ 60.307257 288.610950 0 ] (Code/recoverCookiesCSV/:__span-0-8) [ 2007 0 R /XYZ 60.307257 573.631902 0 ] (Code/recoverCookiesCSV/:__span-0-80) [ 2009 0 R /XYZ 60.307257 275.210598 0 ] (Code/recoverCookiesCSV/:__span-0-81) [ 2009 0 R /XYZ 60.307257 261.810246 0 ] (Code/recoverCookiesCSV/:__span-0-82) [ 2009 0 R /XYZ 60.307257 248.409894 0 ] (Code/recoverCookiesCSV/:__span-0-83) [ 2009 0 R /XYZ 60.307257 235.009542 0 ] (Code/recoverCookiesCSV/:__span-0-9) [ 2007 0 R /XYZ 60.307257 560.231550 0 ] (Code/recoverCookiesCSV/:recovercookiescsvpy) [ 2007 0 R /XYZ 39.386457 747.563622 0 ] (INXWIZI/) [ 1765 0 R /XYZ 39.386457 757.223622 0 ] (INXWIZI/:) [ 1765 0 R /XYZ 39.386457 771.023622 0 ] (ManuelUtilisateur/:) [ 1005 0 R /XYZ 39.386457 771.023622 0 ] (ManuelUtilisateur/:a-quoi-sert-lapp) [ 1005 0 R /XYZ 39.386457 608.700522 0 ] (ManuelUtilisateur/:ajout-du-nom-des-pilotes) [ 1083 0 R /XYZ 42.836457 166.651302 0 ] (ManuelUtilisateur/:battles) [ 1112 0 R /XYZ 39.386457 234.880422 0 ] (ManuelUtilisateur/:boutons) [ 1025 0 R /XYZ 39.386457 309.260718 0 ] (ManuelUtilisateur/:calibration) [ 1044 0 R /XYZ 39.386457 771.023622 0 ] (ManuelUtilisateur/:comment-creer-son-preset) [ 1044 0 R /XYZ 39.386457 269.144922 0 ] (ManuelUtilisateur/:comprendre-les-donnees) [ 1102 0 R /XYZ 39.386457 322.349771 0 ] (ManuelUtilisateur/:creation-des-zones-et-des-windows) [ 1060 0 R /XYZ 42.836457 587.042022 0 ] (ManuelUtilisateur/:driver-infos) [ 1117 0 R /XYZ 39.386457 294.880422 0 ] (ManuelUtilisateur/:erreurs) [ 1135 0 R /XYZ 39.386457 634.955622 0 ] (ManuelUtilisateur/:installation) [ 1005 0 R /XYZ 39.386457 707.865222 0 ] (ManuelUtilisateur/:last-five-laps) [ 1107 0 R /XYZ 39.386457 206.972850 0 ] (ManuelUtilisateur/:live-ranking) [ 1129 0 R /XYZ 39.386457 771.023622 0 ] (ManuelUtilisateur/:load-un-preset-existant) [ 1097 0 R /XYZ 39.386457 189.089256 0 ] (ManuelUtilisateur/:manuel-utilisateur) [ 1005 0 R /XYZ 39.386457 757.223622 0 ] (ManuelUtilisateur/:overtakes) [ 1107 0 R /XYZ 39.386457 307.522050 0 ] (ManuelUtilisateur/:pourquoi-calibrer-lapplication-et-creer-un-preset) [ 1044 0 R /XYZ 39.386457 661.536522 0 ] (ManuelUtilisateur/:recuperer-le-lien-vers-le-flux) [ 1014 0 R /XYZ 39.386457 347.470422 0 ] (ManuelUtilisateur/:sauvegarder-le-nouveau-preset) [ 1097 0 R /XYZ 42.836457 341.110056 0 ] (ManuelUtilisateur/:utilisation-simple) [ 1005 0 R /XYZ 39.386457 391.297422 0 ] (__codelineno-0-1) [ 657 0 R /XYZ 60.307257 407.980122 0 ] (__codelineno-0-10) [ 1138 0 R /XYZ 60.307257 384.489054 0 ] (__codelineno-0-100) [ 1769 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-101) [ 1769 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-102) [ 1769 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-103) [ 1769 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-104) [ 1769 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-105) [ 1769 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-106) [ 1769 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-107) [ 1769 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-108) [ 1769 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-109) [ 1769 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-11) [ 1138 0 R /XYZ 60.307257 371.088702 0 ] (__codelineno-0-110) [ 1769 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-111) [ 1769 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-112) [ 1769 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-113) [ 1769 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-114) [ 1769 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-115) [ 1769 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-116) [ 1769 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-117) [ 1769 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-118) [ 1769 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-119) [ 1769 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-12) [ 1138 0 R /XYZ 60.307257 357.688350 0 ] (__codelineno-0-120) [ 1769 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-121) [ 1769 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-122) [ 1769 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-123) [ 1769 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-124) [ 1769 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-125) [ 1769 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-126) [ 1769 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-127) [ 1769 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-128) [ 1769 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-129) [ 1769 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-13) [ 1138 0 R /XYZ 60.307257 344.287998 0 ] (__codelineno-0-130) [ 1769 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-131) [ 1769 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-132) [ 1769 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-133) [ 1769 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-134) [ 1769 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-135) [ 1769 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-136) [ 1769 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-137) [ 1769 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-138) [ 1769 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-139) [ 1769 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-14) [ 1138 0 R /XYZ 60.307257 330.887646 0 ] (__codelineno-0-140) [ 1769 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-141) [ 1769 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-142) [ 1771 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-143) [ 1771 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-144) [ 1771 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-145) [ 1771 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-146) [ 1771 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-147) [ 1771 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-148) [ 1771 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-149) [ 1771 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-15) [ 1138 0 R /XYZ 60.307257 317.487294 0 ] (__codelineno-0-150) [ 1771 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-151) [ 1771 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-152) [ 1771 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-153) [ 1771 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-154) [ 1771 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-155) [ 1771 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-156) [ 1771 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-157) [ 1771 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-158) [ 1771 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-159) [ 1771 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-16) [ 1138 0 R /XYZ 60.307257 304.086942 0 ] (__codelineno-0-160) [ 1771 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-161) [ 1771 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-162) [ 1771 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-163) [ 1771 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-164) [ 1771 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-165) [ 1771 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-166) [ 1771 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-167) [ 1771 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-168) [ 1771 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-169) [ 1771 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-17) [ 1138 0 R /XYZ 60.307257 290.686590 0 ] (__codelineno-0-170) [ 1771 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-171) [ 1771 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-172) [ 1771 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-173) [ 1771 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-174) [ 1771 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-175) [ 1771 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-176) [ 1771 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-177) [ 1771 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-178) [ 1771 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-179) [ 1771 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-18) [ 1138 0 R /XYZ 60.307257 277.286238 0 ] (__codelineno-0-180) [ 1771 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-181) [ 1771 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-182) [ 1771 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-183) [ 1771 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-184) [ 1771 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-185) [ 1773 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-186) [ 1773 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-187) [ 1773 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-188) [ 1773 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-189) [ 1773 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-19) [ 1138 0 R /XYZ 60.307257 263.885886 0 ] (__codelineno-0-190) [ 1773 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-191) [ 1773 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-192) [ 1773 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-193) [ 1773 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-194) [ 1773 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-195) [ 1773 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-196) [ 1773 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-197) [ 1773 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-198) [ 1773 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-199) [ 1773 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-2) [ 657 0 R /XYZ 60.307257 381.179418 0 ] (__codelineno-0-20) [ 1138 0 R /XYZ 60.307257 250.485534 0 ] (__codelineno-0-200) [ 1773 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-201) [ 1773 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-202) [ 1773 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-203) [ 1773 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-204) [ 1773 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-205) [ 1773 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-206) [ 1773 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-207) [ 1773 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-208) [ 1773 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-209) [ 1773 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-21) [ 1138 0 R /XYZ 60.307257 237.085182 0 ] (__codelineno-0-210) [ 1773 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-211) [ 1773 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-212) [ 1773 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-213) [ 1773 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-214) [ 1773 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-215) [ 1773 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-216) [ 1773 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-217) [ 1773 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-218) [ 1773 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-219) [ 1773 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-22) [ 1138 0 R /XYZ 60.307257 223.684830 0 ] (__codelineno-0-220) [ 1773 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-221) [ 1773 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-222) [ 1773 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-223) [ 1773 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-224) [ 1773 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-225) [ 1773 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-226) [ 1773 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-227) [ 1775 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-228) [ 1775 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-229) [ 1775 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-23) [ 1138 0 R /XYZ 60.307257 210.284478 0 ] (__codelineno-0-230) [ 1775 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-231) [ 1775 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-232) [ 1775 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-233) [ 1775 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-234) [ 1775 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-235) [ 1775 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-236) [ 1775 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-237) [ 1775 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-238) [ 1775 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-239) [ 1775 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-24) [ 1765 0 R /XYZ 60.307257 346.328574 0 ] (__codelineno-0-240) [ 1775 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-241) [ 1775 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-242) [ 1775 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-243) [ 1775 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-244) [ 1775 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-245) [ 1775 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-246) [ 1775 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-247) [ 1775 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-248) [ 1775 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-249) [ 1775 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-25) [ 1765 0 R /XYZ 60.307257 332.928222 0 ] (__codelineno-0-250) [ 1775 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-251) [ 1775 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-252) [ 1775 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-253) [ 1775 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-254) [ 1775 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-255) [ 1775 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-256) [ 1775 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-257) [ 1775 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-258) [ 1775 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-259) [ 1775 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-26) [ 1765 0 R /XYZ 60.307257 319.527870 0 ] (__codelineno-0-260) [ 1775 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-261) [ 1775 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-262) [ 1801 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-263) [ 1801 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-264) [ 1801 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-265) [ 1801 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-266) [ 1801 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-267) [ 1801 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-268) [ 1801 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-269) [ 1801 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-27) [ 1765 0 R /XYZ 60.307257 306.127518 0 ] (__codelineno-0-270) [ 1801 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-271) [ 1801 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-272) [ 1801 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-273) [ 1801 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-274) [ 1801 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-275) [ 1801 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-276) [ 1801 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-277) [ 1801 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-278) [ 1801 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-279) [ 1801 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-28) [ 1765 0 R /XYZ 60.307257 279.326814 0 ] (__codelineno-0-280) [ 1801 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-281) [ 1801 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-282) [ 1801 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-283) [ 1803 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-284) [ 1803 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-285) [ 1803 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-286) [ 1803 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-287) [ 1803 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-288) [ 1803 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-289) [ 1803 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-29) [ 1765 0 R /XYZ 60.307257 265.926462 0 ] (__codelineno-0-290) [ 1803 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-291) [ 1803 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-292) [ 1803 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-293) [ 1803 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-294) [ 1803 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-295) [ 1803 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-296) [ 1803 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-297) [ 1803 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-298) [ 1803 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-299) [ 1803 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-3) [ 1138 0 R /XYZ 60.307257 478.291518 0 ] (__codelineno-0-30) [ 1765 0 R /XYZ 60.307257 239.125758 0 ] (__codelineno-0-300) [ 1803 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-301) [ 1803 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-302) [ 1803 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-303) [ 1803 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-304) [ 1803 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-305) [ 1803 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-306) [ 1803 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-307) [ 1803 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-308) [ 1803 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-309) [ 1803 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-31) [ 1765 0 R /XYZ 60.307257 212.325054 0 ] (__codelineno-0-310) [ 1803 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-311) [ 1803 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-312) [ 1803 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-313) [ 1803 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-314) [ 1803 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-315) [ 1803 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-316) [ 1803 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-317) [ 1803 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-318) [ 1803 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-319) [ 1803 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-32) [ 1765 0 R /XYZ 60.307257 198.924702 0 ] (__codelineno-0-320) [ 1803 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-321) [ 1803 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-322) [ 1803 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-323) [ 1803 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-324) [ 1803 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-325) [ 1803 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-326) [ 1803 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-327) [ 1803 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-328) [ 1803 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-329) [ 1803 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-33) [ 1765 0 R /XYZ 60.307257 185.524350 0 ] (__codelineno-0-330) [ 1819 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-331) [ 1819 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-332) [ 1819 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-333) [ 1819 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-334) [ 1819 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-335) [ 1819 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-336) [ 1819 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-337) [ 1819 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-338) [ 1819 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-339) [ 1819 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-34) [ 1765 0 R /XYZ 60.307257 172.123998 0 ] (__codelineno-0-340) [ 1819 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-341) [ 1819 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-342) [ 1819 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-343) [ 1819 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-344) [ 1819 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-345) [ 1819 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-346) [ 1819 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-347) [ 1819 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-348) [ 1819 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-349) [ 1819 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-35) [ 1765 0 R /XYZ 60.307257 158.723646 0 ] (__codelineno-0-350) [ 1819 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-351) [ 1819 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-352) [ 1819 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-353) [ 1819 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-354) [ 1819 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-355) [ 1819 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-356) [ 1819 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-357) [ 1819 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-358) [ 1819 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-359) [ 1819 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-36) [ 1765 0 R /XYZ 60.307257 145.323294 0 ] (__codelineno-0-360) [ 1819 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-361) [ 1819 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-362) [ 1819 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-363) [ 1819 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-364) [ 1819 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-365) [ 1819 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-366) [ 1819 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-367) [ 1819 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-368) [ 1819 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-369) [ 1819 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-37) [ 1765 0 R /XYZ 60.307257 131.922942 0 ] (__codelineno-0-370) [ 1819 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-371) [ 1819 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-372) [ 1819 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-373) [ 1819 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-374) [ 1819 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-375) [ 1819 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-376) [ 1821 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-377) [ 1821 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-378) [ 1821 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-379) [ 1821 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-38) [ 1765 0 R /XYZ 60.307257 118.522590 0 ] (__codelineno-0-380) [ 1821 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-381) [ 1821 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-382) [ 1821 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-383) [ 1821 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-384) [ 1821 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-385) [ 1821 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-386) [ 1821 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-387) [ 1821 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-388) [ 1821 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-389) [ 1821 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-39) [ 1765 0 R /XYZ 60.307257 105.122238 0 ] (__codelineno-0-390) [ 1821 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-391) [ 1821 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-392) [ 1821 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-393) [ 1821 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-394) [ 1821 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-395) [ 1821 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-396) [ 1821 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-397) [ 1821 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-398) [ 1821 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-399) [ 1821 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-4) [ 1138 0 R /XYZ 60.307257 464.891166 0 ] (__codelineno-0-40) [ 1765 0 R /XYZ 60.307257 91.721886 0 ] (__codelineno-0-400) [ 1821 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-401) [ 1821 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-402) [ 1821 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-403) [ 1821 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-404) [ 1821 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-405) [ 1821 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-406) [ 1821 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-407) [ 1821 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-408) [ 1821 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-409) [ 1821 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-41) [ 1767 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-410) [ 1821 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-411) [ 1821 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-412) [ 1821 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-413) [ 1821 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-414) [ 1821 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-415) [ 1823 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-416) [ 1823 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-417) [ 1823 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-418) [ 1823 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-419) [ 1823 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-42) [ 1767 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-420) [ 1823 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-421) [ 1823 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-422) [ 1823 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-423) [ 1845 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-424) [ 1845 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-425) [ 1845 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-426) [ 1845 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-427) [ 1845 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-428) [ 1845 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-429) [ 1845 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-43) [ 1767 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-430) [ 1845 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-431) [ 1845 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-432) [ 1845 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-433) [ 1845 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-434) [ 1845 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-435) [ 1845 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-436) [ 1845 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-437) [ 1847 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-438) [ 1847 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-439) [ 1847 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-44) [ 1767 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-440) [ 1847 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-441) [ 1847 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-442) [ 1847 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-443) [ 1847 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-444) [ 1847 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-445) [ 1847 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-446) [ 1847 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-447) [ 1847 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-448) [ 1847 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-449) [ 1847 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-45) [ 1767 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-450) [ 1847 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-451) [ 1847 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-452) [ 1847 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-453) [ 1847 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-454) [ 1847 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-455) [ 1847 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-456) [ 1847 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-457) [ 1847 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-458) [ 1847 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-459) [ 1847 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-46) [ 1767 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-460) [ 1847 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-461) [ 1847 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-462) [ 1847 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-463) [ 1847 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-464) [ 1847 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-465) [ 1847 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-466) [ 1847 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-467) [ 1847 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-468) [ 1847 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-469) [ 1847 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-47) [ 1767 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-470) [ 1847 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-471) [ 1847 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-472) [ 1847 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-473) [ 1847 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-474) [ 1847 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-475) [ 1847 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-476) [ 1847 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-477) [ 1847 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-478) [ 1847 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-479) [ 1847 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-48) [ 1767 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-480) [ 1847 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-481) [ 1847 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-482) [ 1847 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-483) [ 1847 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-484) [ 1847 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-485) [ 1849 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-486) [ 1849 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-487) [ 1849 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-488) [ 1849 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-489) [ 1849 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-49) [ 1767 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-490) [ 1849 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-491) [ 1849 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-492) [ 1849 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-493) [ 1849 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-494) [ 1849 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-495) [ 1929 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-496) [ 1931 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-497) [ 1931 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-498) [ 1931 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-499) [ 1931 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-5) [ 1138 0 R /XYZ 60.307257 451.490814 0 ] (__codelineno-0-50) [ 1767 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-500) [ 1931 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-501) [ 1931 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-502) [ 1931 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-503) [ 1931 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-504) [ 1931 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-505) [ 1931 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-506) [ 1931 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-507) [ 1931 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-508) [ 1931 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-509) [ 1931 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-51) [ 1767 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-510) [ 1931 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-511) [ 1931 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-512) [ 1931 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-513) [ 1931 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-514) [ 1931 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-515) [ 1931 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-516) [ 1931 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-517) [ 1931 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-518) [ 1931 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-519) [ 1931 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-52) [ 1767 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-520) [ 1931 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-521) [ 1931 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-522) [ 1931 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-523) [ 1931 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-524) [ 1931 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-525) [ 1931 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-526) [ 1931 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-527) [ 1931 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-528) [ 1931 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-529) [ 1931 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-53) [ 1767 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-530) [ 1931 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-531) [ 1931 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-532) [ 1931 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-533) [ 1931 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-534) [ 1931 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-535) [ 1931 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-536) [ 1931 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-537) [ 1931 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-538) [ 1931 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-539) [ 1931 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-54) [ 1767 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-540) [ 1931 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-0-541) [ 1931 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-542) [ 1931 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-543) [ 1933 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-544) [ 1933 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-545) [ 1933 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-546) [ 1933 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-547) [ 1933 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-548) [ 1933 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-549) [ 1933 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-55) [ 1767 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-550) [ 1933 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-551) [ 1933 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-552) [ 1933 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-553) [ 1933 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-554) [ 1933 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-555) [ 1933 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-556) [ 1933 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-557) [ 1933 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-558) [ 1933 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-559) [ 1933 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-56) [ 1767 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-560) [ 1933 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-561) [ 1933 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-562) [ 1933 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-563) [ 1933 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-564) [ 1933 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-565) [ 1933 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-566) [ 1933 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-567) [ 1933 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-568) [ 1933 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-569) [ 1933 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-57) [ 1767 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-570) [ 1933 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-571) [ 1933 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-572) [ 1933 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-573) [ 1933 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-574) [ 1933 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-575) [ 1933 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-576) [ 1933 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-577) [ 1933 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-578) [ 1933 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-579) [ 1933 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-58) [ 1767 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-580) [ 1933 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-581) [ 1933 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-582) [ 1933 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-583) [ 1933 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-584) [ 1933 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-585) [ 1933 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-586) [ 1933 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-587) [ 1933 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-588) [ 1933 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-589) [ 1933 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-59) [ 1767 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-590) [ 1935 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-591) [ 1935 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-592) [ 1935 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-593) [ 1935 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-594) [ 1935 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-595) [ 1935 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-596) [ 1935 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-597) [ 1935 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-598) [ 1935 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-599) [ 1935 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-6) [ 1138 0 R /XYZ 60.307257 438.090462 0 ] (__codelineno-0-60) [ 1767 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-600) [ 1935 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-0-601) [ 1935 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-602) [ 1935 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-603) [ 1935 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-604) [ 1935 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-605) [ 1935 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-606) [ 1935 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-607) [ 1935 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-608) [ 1935 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-609) [ 1935 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-61) [ 1767 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-610) [ 1935 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-611) [ 1935 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-612) [ 1935 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-613) [ 1935 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-614) [ 1935 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-615) [ 1935 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-616) [ 1935 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-617) [ 1935 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-618) [ 1935 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-619) [ 1935 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-62) [ 1767 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-620) [ 1935 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-621) [ 1935 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-622) [ 1935 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-623) [ 1935 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-624) [ 1935 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-625) [ 1935 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-626) [ 1935 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-627) [ 1935 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-628) [ 1935 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-629) [ 1935 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-63) [ 1767 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-630) [ 1935 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-631) [ 1935 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-632) [ 1935 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-633) [ 1935 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-634) [ 1935 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-635) [ 1935 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-636) [ 1935 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-637) [ 1935 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-638) [ 1937 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-639) [ 1937 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-64) [ 1767 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-640) [ 1937 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-641) [ 1937 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-642) [ 1937 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-643) [ 1937 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-644) [ 1937 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-645) [ 1937 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-646) [ 1937 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-0-647) [ 1937 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-0-648) [ 1937 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-0-649) [ 1937 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-0-65) [ 1767 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-650) [ 1937 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-0-651) [ 1937 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-0-652) [ 1937 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-0-653) [ 1937 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-0-654) [ 1937 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-0-655) [ 1937 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-0-656) [ 1937 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-0-657) [ 1937 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-0-658) [ 1937 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-0-659) [ 1937 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-0-66) [ 1767 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-660) [ 1937 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-0-661) [ 1937 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-0-662) [ 1937 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-0-663) [ 1937 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-0-664) [ 1937 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-665) [ 1937 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-666) [ 1937 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-667) [ 1937 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-668) [ 1937 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-669) [ 1937 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-67) [ 1767 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-0-670) [ 1937 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-671) [ 1937 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-672) [ 1937 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-673) [ 1937 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-674) [ 2005 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-675) [ 2005 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-676) [ 2005 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-68) [ 1767 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-0-69) [ 1767 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-0-7) [ 1138 0 R /XYZ 60.307257 424.690110 0 ] (__codelineno-0-70) [ 1767 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-0-71) [ 1767 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-0-72) [ 1767 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-0-73) [ 1767 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-0-74) [ 1767 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-0-75) [ 1767 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-0-76) [ 1767 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-0-77) [ 1767 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-0-78) [ 1767 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-0-79) [ 1767 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-0-8) [ 1138 0 R /XYZ 60.307257 411.289758 0 ] (__codelineno-0-80) [ 1767 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-0-81) [ 1767 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-0-82) [ 1767 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-0-83) [ 1767 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-0-84) [ 1767 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-0-85) [ 1767 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-0-86) [ 1767 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-0-87) [ 1767 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-0-88) [ 1767 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-0-89) [ 1767 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-0-9) [ 1138 0 R /XYZ 60.307257 397.889406 0 ] (__codelineno-0-90) [ 1769 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-0-91) [ 1769 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-0-92) [ 1769 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-0-93) [ 1769 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-0-94) [ 1769 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-0-95) [ 1769 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-0-96) [ 1769 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-0-97) [ 1769 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-0-98) [ 1769 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-0-99) [ 1769 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-1-1) [ 661 0 R /XYZ 60.307257 202.470522 0 ] (__codelineno-1-10) [ 663 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-1-11) [ 663 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-1-12) [ 663 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-1-13) [ 663 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-1-2) [ 661 0 R /XYZ 60.307257 189.070170 0 ] (__codelineno-1-3) [ 661 0 R /XYZ 60.307257 175.669818 0 ] (__codelineno-1-4) [ 661 0 R /XYZ 60.307257 162.269466 0 ] (__codelineno-1-5) [ 661 0 R /XYZ 60.307257 148.869114 0 ] (__codelineno-1-6) [ 661 0 R /XYZ 60.307257 135.468762 0 ] (__codelineno-1-7) [ 661 0 R /XYZ 60.307257 122.068410 0 ] (__codelineno-1-8) [ 661 0 R /XYZ 60.307257 108.668058 0 ] (__codelineno-1-9) [ 661 0 R /XYZ 60.307257 95.267706 0 ] (__codelineno-10-1) [ 941 0 R /XYZ 60.307257 140.764186 0 ] (__codelineno-10-10) [ 946 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-10-11) [ 946 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-10-12) [ 946 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-10-13) [ 946 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-10-14) [ 946 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-10-15) [ 946 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-10-16) [ 946 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-10-17) [ 946 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-10-18) [ 946 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-10-19) [ 946 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-10-2) [ 941 0 R /XYZ 60.307257 113.963482 0 ] (__codelineno-10-20) [ 946 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-10-21) [ 946 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-10-22) [ 946 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-10-23) [ 946 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-10-24) [ 946 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-10-25) [ 946 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-10-26) [ 946 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-10-27) [ 946 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-10-28) [ 946 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-10-29) [ 946 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-10-3) [ 941 0 R /XYZ 60.307257 100.563130 0 ] (__codelineno-10-4) [ 941 0 R /XYZ 60.307257 87.162778 0 ] (__codelineno-10-5) [ 946 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-10-6) [ 946 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-10-7) [ 946 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-10-8) [ 946 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-10-9) [ 946 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-11-1) [ 957 0 R /XYZ 60.307257 186.718980 0 ] (__codelineno-11-10) [ 961 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-11-11) [ 961 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-11-12) [ 961 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-11-13) [ 961 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-11-14) [ 961 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-11-15) [ 961 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-11-16) [ 961 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-11-17) [ 1344 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-11-18) [ 1344 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-11-19) [ 1344 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-11-2) [ 957 0 R /XYZ 60.307257 159.918276 0 ] (__codelineno-11-20) [ 1344 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-11-21) [ 1344 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-11-22) [ 1344 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-11-3) [ 957 0 R /XYZ 60.307257 133.117572 0 ] (__codelineno-11-4) [ 957 0 R /XYZ 60.307257 119.717220 0 ] (__codelineno-11-5) [ 957 0 R /XYZ 60.307257 106.316868 0 ] (__codelineno-11-6) [ 961 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-11-7) [ 961 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-11-8) [ 961 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-11-9) [ 961 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-12-1) [ 963 0 R /XYZ 60.307257 186.377322 0 ] (__codelineno-12-10) [ 965 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-12-11) [ 965 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-12-12) [ 965 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-12-13) [ 965 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-12-14) [ 965 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-12-15) [ 965 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-12-16) [ 965 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-12-17) [ 965 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-12-18) [ 965 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-12-19) [ 965 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-12-2) [ 963 0 R /XYZ 60.307257 172.976970 0 ] (__codelineno-12-20) [ 965 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-12-21) [ 965 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-12-22) [ 965 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-12-23) [ 965 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-12-24) [ 965 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-12-25) [ 965 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-12-26) [ 965 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-12-27) [ 965 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-12-28) [ 965 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-12-29) [ 965 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-12-3) [ 963 0 R /XYZ 60.307257 159.576618 0 ] (__codelineno-12-30) [ 965 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-12-31) [ 965 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-12-32) [ 965 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-12-33) [ 965 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-12-34) [ 965 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-12-35) [ 965 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-12-36) [ 965 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-12-4) [ 963 0 R /XYZ 60.307257 146.176266 0 ] (__codelineno-12-5) [ 963 0 R /XYZ 60.307257 132.775914 0 ] (__codelineno-12-6) [ 963 0 R /XYZ 60.307257 119.375562 0 ] (__codelineno-12-7) [ 963 0 R /XYZ 60.307257 105.975210 0 ] (__codelineno-12-8) [ 963 0 R /XYZ 60.307257 92.574858 0 ] (__codelineno-12-9) [ 965 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-13-1) [ 1348 0 R /XYZ 60.307257 722.344122 0 ] (__codelineno-13-2) [ 1348 0 R /XYZ 60.307257 708.943770 0 ] (__codelineno-13-3) [ 1348 0 R /XYZ 60.307257 695.543418 0 ] (__codelineno-13-4) [ 1348 0 R /XYZ 60.307257 682.143066 0 ] (__codelineno-13-5) [ 1348 0 R /XYZ 60.307257 668.742714 0 ] (__codelineno-13-6) [ 1348 0 R /XYZ 60.307257 655.342362 0 ] (__codelineno-13-7) [ 1348 0 R /XYZ 60.307257 641.942010 0 ] (__codelineno-13-8) [ 1348 0 R /XYZ 60.307257 628.541658 0 ] (__codelineno-13-9) [ 1348 0 R /XYZ 60.307257 615.141306 0 ] (__codelineno-14-1) [ 1348 0 R /XYZ 60.307257 510.012354 0 ] (__codelineno-14-2) [ 1348 0 R /XYZ 60.307257 496.612002 0 ] (__codelineno-14-3) [ 1348 0 R /XYZ 60.307257 483.211650 0 ] (__codelineno-14-4) [ 1348 0 R /XYZ 60.307257 469.811298 0 ] (__codelineno-14-5) [ 1348 0 R /XYZ 60.307257 456.410946 0 ] (__codelineno-14-6) [ 1348 0 R /XYZ 60.307257 443.010594 0 ] (__codelineno-14-7) [ 1348 0 R /XYZ 60.307257 429.610242 0 ] (__codelineno-14-8) [ 1348 0 R /XYZ 60.307257 416.209890 0 ] (__codelineno-14-9) [ 1348 0 R /XYZ 60.307257 402.809538 0 ] (__codelineno-15-1) [ 1386 0 R /XYZ 60.307257 512.569722 0 ] (__codelineno-15-10) [ 1386 0 R /XYZ 60.307257 391.966554 0 ] (__codelineno-15-11) [ 1386 0 R /XYZ 60.307257 378.566202 0 ] (__codelineno-15-12) [ 1386 0 R /XYZ 60.307257 365.165850 0 ] (__codelineno-15-13) [ 1386 0 R /XYZ 60.307257 351.765498 0 ] (__codelineno-15-14) [ 1386 0 R /XYZ 60.307257 338.365146 0 ] (__codelineno-15-15) [ 1386 0 R /XYZ 60.307257 324.964794 0 ] (__codelineno-15-16) [ 1386 0 R /XYZ 60.307257 311.564442 0 ] (__codelineno-15-17) [ 1386 0 R /XYZ 60.307257 298.164090 0 ] (__codelineno-15-18) [ 1386 0 R /XYZ 60.307257 284.763738 0 ] (__codelineno-15-2) [ 1386 0 R /XYZ 60.307257 499.169370 0 ] (__codelineno-15-3) [ 1386 0 R /XYZ 60.307257 485.769018 0 ] (__codelineno-15-4) [ 1386 0 R /XYZ 60.307257 472.368666 0 ] (__codelineno-15-5) [ 1386 0 R /XYZ 60.307257 458.968314 0 ] (__codelineno-15-6) [ 1386 0 R /XYZ 60.307257 445.567962 0 ] (__codelineno-15-7) [ 1386 0 R /XYZ 60.307257 432.167610 0 ] (__codelineno-15-8) [ 1386 0 R /XYZ 60.307257 418.767258 0 ] (__codelineno-15-9) [ 1386 0 R /XYZ 60.307257 405.366906 0 ] (__codelineno-16-1) [ 1391 0 R /XYZ 60.307257 422.361822 0 ] (__codelineno-16-10) [ 1391 0 R /XYZ 60.307257 301.758654 0 ] (__codelineno-16-11) [ 1391 0 R /XYZ 60.307257 288.358302 0 ] (__codelineno-16-12) [ 1391 0 R /XYZ 60.307257 274.957950 0 ] (__codelineno-16-13) [ 1391 0 R /XYZ 60.307257 261.557598 0 ] (__codelineno-16-14) [ 1391 0 R /XYZ 60.307257 248.157246 0 ] (__codelineno-16-15) [ 1391 0 R /XYZ 60.307257 234.756894 0 ] (__codelineno-16-16) [ 1391 0 R /XYZ 60.307257 221.356542 0 ] (__codelineno-16-17) [ 1391 0 R /XYZ 60.307257 207.956190 0 ] (__codelineno-16-18) [ 1391 0 R /XYZ 60.307257 194.555838 0 ] (__codelineno-16-2) [ 1391 0 R /XYZ 60.307257 408.961470 0 ] (__codelineno-16-3) [ 1391 0 R /XYZ 60.307257 395.561118 0 ] (__codelineno-16-4) [ 1391 0 R /XYZ 60.307257 382.160766 0 ] (__codelineno-16-5) [ 1391 0 R /XYZ 60.307257 368.760414 0 ] (__codelineno-16-6) [ 1391 0 R /XYZ 60.307257 355.360062 0 ] (__codelineno-16-7) [ 1391 0 R /XYZ 60.307257 341.959710 0 ] (__codelineno-16-8) [ 1391 0 R /XYZ 60.307257 328.559358 0 ] (__codelineno-16-9) [ 1391 0 R /XYZ 60.307257 315.159006 0 ] (__codelineno-17-1) [ 1402 0 R /XYZ 60.307257 363.601105 0 ] (__codelineno-17-10) [ 1402 0 R /XYZ 60.307257 242.997937 0 ] (__codelineno-17-11) [ 1402 0 R /XYZ 60.307257 229.597585 0 ] (__codelineno-17-12) [ 1402 0 R /XYZ 60.307257 202.796881 0 ] (__codelineno-17-13) [ 1402 0 R /XYZ 60.307257 189.396529 0 ] (__codelineno-17-14) [ 1402 0 R /XYZ 60.307257 175.996177 0 ] (__codelineno-17-15) [ 1402 0 R /XYZ 60.307257 162.595825 0 ] (__codelineno-17-16) [ 1402 0 R /XYZ 60.307257 149.195473 0 ] (__codelineno-17-17) [ 1402 0 R /XYZ 60.307257 135.795121 0 ] (__codelineno-17-18) [ 1402 0 R /XYZ 60.307257 122.394769 0 ] (__codelineno-17-19) [ 1402 0 R /XYZ 60.307257 108.994417 0 ] (__codelineno-17-2) [ 1402 0 R /XYZ 60.307257 350.200753 0 ] (__codelineno-17-20) [ 1402 0 R /XYZ 60.307257 95.594065 0 ] (__codelineno-17-21) [ 1406 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-17-22) [ 1406 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-17-23) [ 1406 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-17-24) [ 1406 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-17-3) [ 1402 0 R /XYZ 60.307257 336.800401 0 ] (__codelineno-17-4) [ 1402 0 R /XYZ 60.307257 323.400049 0 ] (__codelineno-17-5) [ 1402 0 R /XYZ 60.307257 309.999697 0 ] (__codelineno-17-6) [ 1402 0 R /XYZ 60.307257 296.599345 0 ] (__codelineno-17-7) [ 1402 0 R /XYZ 60.307257 283.198993 0 ] (__codelineno-17-8) [ 1402 0 R /XYZ 60.307257 269.798641 0 ] (__codelineno-17-9) [ 1402 0 R /XYZ 60.307257 256.398289 0 ] (__codelineno-18-1) [ 1437 0 R /XYZ 60.307257 236.252922 0 ] (__codelineno-18-10) [ 1439 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-18-11) [ 1439 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-18-12) [ 1439 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-18-13) [ 1439 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-18-14) [ 1439 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-18-15) [ 1439 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-18-16) [ 1439 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-18-17) [ 1439 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-18-18) [ 1439 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-18-2) [ 1437 0 R /XYZ 60.307257 222.852570 0 ] (__codelineno-18-3) [ 1437 0 R /XYZ 60.307257 209.452218 0 ] (__codelineno-18-4) [ 1437 0 R /XYZ 60.307257 169.251162 0 ] (__codelineno-18-5) [ 1437 0 R /XYZ 60.307257 142.450458 0 ] (__codelineno-18-6) [ 1437 0 R /XYZ 60.307257 129.050106 0 ] (__codelineno-18-7) [ 1437 0 R /XYZ 60.307257 115.649754 0 ] (__codelineno-18-8) [ 1437 0 R /XYZ 60.307257 88.849050 0 ] (__codelineno-18-9) [ 1439 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-19-1) [ 1439 0 R /XYZ 60.307257 464.101134 0 ] (__codelineno-19-2) [ 1439 0 R /XYZ 60.307257 450.700782 0 ] (__codelineno-19-3) [ 1439 0 R /XYZ 60.307257 437.300430 0 ] (__codelineno-19-4) [ 1439 0 R /XYZ 60.307257 423.900078 0 ] (__codelineno-2-1) [ 663 0 R /XYZ 60.307257 422.999214 0 ] (__codelineno-2-10) [ 663 0 R /XYZ 60.307257 302.396046 0 ] (__codelineno-2-11) [ 663 0 R /XYZ 60.307257 275.595342 0 ] (__codelineno-2-12) [ 663 0 R /XYZ 60.307257 262.194990 0 ] (__codelineno-2-13) [ 663 0 R /XYZ 60.307257 248.794638 0 ] (__codelineno-2-14) [ 663 0 R /XYZ 60.307257 235.394286 0 ] (__codelineno-2-15) [ 663 0 R /XYZ 60.307257 221.993934 0 ] (__codelineno-2-16) [ 663 0 R /XYZ 60.307257 208.593582 0 ] (__codelineno-2-17) [ 663 0 R /XYZ 60.307257 195.193230 0 ] (__codelineno-2-18) [ 663 0 R /XYZ 60.307257 181.792878 0 ] (__codelineno-2-19) [ 663 0 R /XYZ 60.307257 168.392526 0 ] (__codelineno-2-2) [ 663 0 R /XYZ 60.307257 409.598862 0 ] (__codelineno-2-20) [ 663 0 R /XYZ 60.307257 154.992174 0 ] (__codelineno-2-21) [ 663 0 R /XYZ 60.307257 141.591822 0 ] (__codelineno-2-22) [ 663 0 R /XYZ 60.307257 128.191470 0 ] (__codelineno-2-23) [ 663 0 R /XYZ 60.307257 114.791118 0 ] (__codelineno-2-24) [ 663 0 R /XYZ 60.307257 101.390766 0 ] (__codelineno-2-25) [ 663 0 R /XYZ 60.307257 87.990414 0 ] (__codelineno-2-26) [ 665 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-2-27) [ 665 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-2-28) [ 665 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-2-3) [ 663 0 R /XYZ 60.307257 396.198510 0 ] (__codelineno-2-4) [ 663 0 R /XYZ 60.307257 382.798158 0 ] (__codelineno-2-5) [ 663 0 R /XYZ 60.307257 369.397806 0 ] (__codelineno-2-6) [ 663 0 R /XYZ 60.307257 355.997454 0 ] (__codelineno-2-7) [ 663 0 R /XYZ 60.307257 342.597102 0 ] (__codelineno-2-8) [ 663 0 R /XYZ 60.307257 329.196750 0 ] (__codelineno-2-9) [ 663 0 R /XYZ 60.307257 315.796398 0 ] (__codelineno-20-1) [ 1439 0 R /XYZ 60.307257 333.785526 0 ] (__codelineno-20-2) [ 1439 0 R /XYZ 60.307257 320.385174 0 ] (__codelineno-20-3) [ 1439 0 R /XYZ 60.307257 306.984822 0 ] (__codelineno-20-4) [ 1439 0 R /XYZ 60.307257 293.584470 0 ] (__codelineno-21-1) [ 1439 0 R /XYZ 60.307257 227.868318 0 ] (__codelineno-21-2) [ 1439 0 R /XYZ 60.307257 214.467966 0 ] (__codelineno-21-3) [ 1439 0 R /XYZ 60.307257 201.067614 0 ] (__codelineno-21-4) [ 1439 0 R /XYZ 60.307257 187.667262 0 ] (__codelineno-21-5) [ 1439 0 R /XYZ 60.307257 174.266910 0 ] (__codelineno-21-6) [ 1439 0 R /XYZ 60.307257 160.866558 0 ] (__codelineno-21-7) [ 1439 0 R /XYZ 60.307257 134.065854 0 ] (__codelineno-21-8) [ 1439 0 R /XYZ 60.307257 120.665502 0 ] (__codelineno-22-1) [ 1441 0 R /XYZ 60.307257 697.945722 0 ] (__codelineno-22-2) [ 1441 0 R /XYZ 60.307257 684.545370 0 ] (__codelineno-22-3) [ 1441 0 R /XYZ 60.307257 671.145018 0 ] (__codelineno-22-4) [ 1441 0 R /XYZ 60.307257 644.344314 0 ] (__codelineno-22-5) [ 1441 0 R /XYZ 60.307257 630.943962 0 ] (__codelineno-23-1) [ 1458 0 R /XYZ 60.307257 422.056122 0 ] (__codelineno-23-2) [ 1458 0 R /XYZ 60.307257 381.855066 0 ] (__codelineno-23-3) [ 1458 0 R /XYZ 60.307257 368.454714 0 ] (__codelineno-23-4) [ 1458 0 R /XYZ 60.307257 355.054362 0 ] (__codelineno-23-5) [ 1458 0 R /XYZ 60.307257 341.654010 0 ] (__codelineno-24-1) [ 1463 0 R /XYZ 60.307257 520.588122 0 ] (__codelineno-24-10) [ 1463 0 R /XYZ 60.307257 373.184250 0 ] (__codelineno-24-2) [ 1463 0 R /XYZ 60.307257 480.387066 0 ] (__codelineno-24-3) [ 1463 0 R /XYZ 60.307257 466.986714 0 ] (__codelineno-24-4) [ 1463 0 R /XYZ 60.307257 453.586362 0 ] (__codelineno-24-5) [ 1463 0 R /XYZ 60.307257 440.186010 0 ] (__codelineno-24-6) [ 1463 0 R /XYZ 60.307257 426.785658 0 ] (__codelineno-24-7) [ 1463 0 R /XYZ 60.307257 413.385306 0 ] (__codelineno-24-8) [ 1463 0 R /XYZ 60.307257 399.984954 0 ] (__codelineno-24-9) [ 1463 0 R /XYZ 60.307257 386.584602 0 ] (__codelineno-25-1) [ 1465 0 R /XYZ 60.307257 342.292122 0 ] (__codelineno-25-10) [ 1465 0 R /XYZ 60.307257 221.688954 0 ] (__codelineno-25-11) [ 1465 0 R /XYZ 60.307257 208.288602 0 ] (__codelineno-25-12) [ 1465 0 R /XYZ 60.307257 194.888250 0 ] (__codelineno-25-13) [ 1465 0 R /XYZ 60.307257 181.487898 0 ] (__codelineno-25-14) [ 1465 0 R /XYZ 60.307257 168.087546 0 ] (__codelineno-25-15) [ 1465 0 R /XYZ 60.307257 154.687194 0 ] (__codelineno-25-16) [ 1465 0 R /XYZ 60.307257 141.286842 0 ] (__codelineno-25-17) [ 1465 0 R /XYZ 60.307257 127.886490 0 ] (__codelineno-25-18) [ 1465 0 R /XYZ 60.307257 114.486138 0 ] (__codelineno-25-19) [ 1465 0 R /XYZ 60.307257 101.085786 0 ] (__codelineno-25-2) [ 1465 0 R /XYZ 60.307257 328.891770 0 ] (__codelineno-25-20) [ 1465 0 R /XYZ 60.307257 87.685434 0 ] (__codelineno-25-21) [ 1467 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-25-22) [ 1467 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-25-23) [ 1467 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-25-24) [ 1467 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-25-25) [ 1467 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-25-26) [ 1467 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-25-27) [ 1467 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-25-28) [ 1467 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-25-29) [ 1467 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-25-3) [ 1465 0 R /XYZ 60.307257 315.491418 0 ] (__codelineno-25-30) [ 1467 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-25-31) [ 1467 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-25-32) [ 1467 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-25-33) [ 1467 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-25-34) [ 1467 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-25-35) [ 1467 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-25-36) [ 1467 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-25-37) [ 1467 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-25-38) [ 1467 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-25-39) [ 1467 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-25-4) [ 1465 0 R /XYZ 60.307257 302.091066 0 ] (__codelineno-25-40) [ 1467 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-25-41) [ 1467 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-25-42) [ 1467 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-25-43) [ 1467 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-25-44) [ 1467 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-25-45) [ 1467 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-25-46) [ 1467 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-25-47) [ 1467 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-25-48) [ 1467 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-25-49) [ 1467 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-25-5) [ 1465 0 R /XYZ 60.307257 288.690714 0 ] (__codelineno-25-50) [ 1467 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-25-51) [ 1467 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-25-52) [ 1467 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-25-53) [ 1467 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-25-54) [ 1467 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-25-55) [ 1467 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-25-56) [ 1467 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-25-57) [ 1467 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-25-58) [ 1467 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-25-59) [ 1467 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-25-6) [ 1465 0 R /XYZ 60.307257 275.290362 0 ] (__codelineno-25-60) [ 1467 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-25-61) [ 1467 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-25-62) [ 1467 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-25-63) [ 1467 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-25-64) [ 1467 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-25-65) [ 1467 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-25-66) [ 1467 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-25-67) [ 1467 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-25-68) [ 1467 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-25-7) [ 1465 0 R /XYZ 60.307257 261.890010 0 ] (__codelineno-25-8) [ 1465 0 R /XYZ 60.307257 248.489658 0 ] (__codelineno-25-9) [ 1465 0 R /XYZ 60.307257 235.089306 0 ] (__codelineno-26-1) [ 1469 0 R /XYZ 60.307257 412.672122 0 ] (__codelineno-26-2) [ 1469 0 R /XYZ 60.307257 385.871418 0 ] (__codelineno-26-3) [ 1469 0 R /XYZ 60.307257 372.471066 0 ] (__codelineno-26-4) [ 1469 0 R /XYZ 60.307257 345.670362 0 ] (__codelineno-26-5) [ 1469 0 R /XYZ 60.307257 332.270010 0 ] (__codelineno-26-6) [ 1469 0 R /XYZ 60.307257 305.469306 0 ] (__codelineno-27-1) [ 1509 0 R /XYZ 60.307257 292.862622 0 ] (__codelineno-27-10) [ 1509 0 R /XYZ 60.307257 158.859102 0 ] (__codelineno-27-2) [ 1509 0 R /XYZ 60.307257 279.462270 0 ] (__codelineno-27-3) [ 1509 0 R /XYZ 60.307257 266.061918 0 ] (__codelineno-27-4) [ 1509 0 R /XYZ 60.307257 252.661566 0 ] (__codelineno-27-5) [ 1509 0 R /XYZ 60.307257 239.261214 0 ] (__codelineno-27-6) [ 1509 0 R /XYZ 60.307257 225.860862 0 ] (__codelineno-27-7) [ 1509 0 R /XYZ 60.307257 212.460510 0 ] (__codelineno-27-8) [ 1509 0 R /XYZ 60.307257 185.659806 0 ] (__codelineno-27-9) [ 1509 0 R /XYZ 60.307257 172.259454 0 ] (__codelineno-28-1) [ 1513 0 R /XYZ 60.307257 722.344122 0 ] (__codelineno-28-10) [ 1513 0 R /XYZ 60.307257 548.139546 0 ] (__codelineno-28-11) [ 1513 0 R /XYZ 60.307257 534.739194 0 ] (__codelineno-28-12) [ 1513 0 R /XYZ 60.307257 521.338842 0 ] (__codelineno-28-13) [ 1513 0 R /XYZ 60.307257 507.938490 0 ] (__codelineno-28-14) [ 1513 0 R /XYZ 60.307257 467.737434 0 ] (__codelineno-28-15) [ 1513 0 R /XYZ 60.307257 454.337082 0 ] (__codelineno-28-16) [ 1513 0 R /XYZ 60.307257 440.936730 0 ] (__codelineno-28-17) [ 1513 0 R /XYZ 60.307257 427.536378 0 ] (__codelineno-28-2) [ 1513 0 R /XYZ 60.307257 708.943770 0 ] (__codelineno-28-3) [ 1513 0 R /XYZ 60.307257 668.742714 0 ] (__codelineno-28-4) [ 1513 0 R /XYZ 60.307257 655.342362 0 ] (__codelineno-28-5) [ 1513 0 R /XYZ 60.307257 641.942010 0 ] (__codelineno-28-6) [ 1513 0 R /XYZ 60.307257 628.541658 0 ] (__codelineno-28-7) [ 1513 0 R /XYZ 60.307257 601.740954 0 ] (__codelineno-28-8) [ 1513 0 R /XYZ 60.307257 588.340602 0 ] (__codelineno-28-9) [ 1513 0 R /XYZ 60.307257 574.940250 0 ] (__codelineno-29-1) [ 1513 0 R /XYZ 60.307257 361.820226 0 ] (__codelineno-29-2) [ 1513 0 R /XYZ 60.307257 348.419874 0 ] (__codelineno-29-3) [ 1513 0 R /XYZ 60.307257 335.019522 0 ] (__codelineno-29-4) [ 1513 0 R /XYZ 60.307257 321.619170 0 ] (__codelineno-29-5) [ 1513 0 R /XYZ 60.307257 308.218818 0 ] (__codelineno-3-1) [ 665 0 R /XYZ 60.307257 678.506766 0 ] (__codelineno-3-10) [ 665 0 R /XYZ 60.307257 557.903598 0 ] (__codelineno-3-11) [ 665 0 R /XYZ 60.307257 544.503246 0 ] (__codelineno-3-12) [ 665 0 R /XYZ 60.307257 531.102894 0 ] (__codelineno-3-13) [ 1166 0 R /XYZ 60.307257 504.302190 0 ] (__codelineno-3-14) [ 1166 0 R /XYZ 60.307257 477.501486 0 ] (__codelineno-3-15) [ 1166 0 R /XYZ 60.307257 464.101134 0 ] (__codelineno-3-16) [ 1166 0 R /XYZ 60.307257 437.300430 0 ] (__codelineno-3-17) [ 1166 0 R /XYZ 60.307257 423.900078 0 ] (__codelineno-3-18) [ 1166 0 R /XYZ 60.307257 410.499726 0 ] (__codelineno-3-19) [ 1166 0 R /XYZ 60.307257 397.099374 0 ] (__codelineno-3-2) [ 665 0 R /XYZ 60.307257 665.106414 0 ] (__codelineno-3-20) [ 1166 0 R /XYZ 60.307257 383.699022 0 ] (__codelineno-3-21) [ 1166 0 R /XYZ 60.307257 370.298670 0 ] (__codelineno-3-22) [ 1166 0 R /XYZ 60.307257 356.898318 0 ] (__codelineno-3-3) [ 665 0 R /XYZ 60.307257 651.706062 0 ] (__codelineno-3-4) [ 665 0 R /XYZ 60.307257 638.305710 0 ] (__codelineno-3-5) [ 665 0 R /XYZ 60.307257 624.905358 0 ] (__codelineno-3-6) [ 665 0 R /XYZ 60.307257 611.505006 0 ] (__codelineno-3-7) [ 665 0 R /XYZ 60.307257 598.104654 0 ] (__codelineno-3-8) [ 665 0 R /XYZ 60.307257 584.704302 0 ] (__codelineno-3-9) [ 665 0 R /XYZ 60.307257 571.303950 0 ] (__codelineno-30-1) [ 1517 0 R /XYZ 60.307257 763.633722 0 ] (__codelineno-30-2) [ 1517 0 R /XYZ 60.307257 750.233370 0 ] (__codelineno-31-1) [ 1582 0 R /XYZ 60.307257 525.280122 0 ] (__codelineno-31-10) [ 1582 0 R /XYZ 60.307257 404.676954 0 ] (__codelineno-31-11) [ 1582 0 R /XYZ 60.307257 391.276602 0 ] (__codelineno-31-12) [ 1582 0 R /XYZ 60.307257 377.876250 0 ] (__codelineno-31-13) [ 1582 0 R /XYZ 60.307257 364.475898 0 ] (__codelineno-31-14) [ 1582 0 R /XYZ 60.307257 351.075546 0 ] (__codelineno-31-15) [ 1582 0 R /XYZ 60.307257 337.675194 0 ] (__codelineno-31-16) [ 1582 0 R /XYZ 60.307257 324.274842 0 ] (__codelineno-31-17) [ 1582 0 R /XYZ 60.307257 310.874490 0 ] (__codelineno-31-18) [ 1582 0 R /XYZ 60.307257 297.474138 0 ] (__codelineno-31-19) [ 1582 0 R /XYZ 60.307257 284.073786 0 ] (__codelineno-31-2) [ 1582 0 R /XYZ 60.307257 511.879770 0 ] (__codelineno-31-20) [ 1582 0 R /XYZ 60.307257 270.673434 0 ] (__codelineno-31-21) [ 1582 0 R /XYZ 60.307257 257.273082 0 ] (__codelineno-31-22) [ 1582 0 R /XYZ 60.307257 243.872730 0 ] (__codelineno-31-23) [ 1582 0 R /XYZ 60.307257 230.472378 0 ] (__codelineno-31-24) [ 1582 0 R /XYZ 60.307257 217.072026 0 ] (__codelineno-31-25) [ 1582 0 R /XYZ 60.307257 203.671674 0 ] (__codelineno-31-26) [ 1582 0 R /XYZ 60.307257 190.271322 0 ] (__codelineno-31-27) [ 1582 0 R /XYZ 60.307257 176.870970 0 ] (__codelineno-31-28) [ 1582 0 R /XYZ 60.307257 163.470618 0 ] (__codelineno-31-29) [ 1582 0 R /XYZ 60.307257 150.070266 0 ] (__codelineno-31-3) [ 1582 0 R /XYZ 60.307257 498.479418 0 ] (__codelineno-31-30) [ 1582 0 R /XYZ 60.307257 136.669914 0 ] (__codelineno-31-31) [ 1582 0 R /XYZ 60.307257 123.269562 0 ] (__codelineno-31-32) [ 1582 0 R /XYZ 60.307257 109.869210 0 ] (__codelineno-31-33) [ 1582 0 R /XYZ 60.307257 96.468858 0 ] (__codelineno-31-34) [ 1584 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-31-35) [ 1584 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-31-36) [ 1584 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-31-37) [ 1584 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-31-38) [ 1584 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-31-39) [ 1584 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-31-4) [ 1582 0 R /XYZ 60.307257 485.079066 0 ] (__codelineno-31-40) [ 1584 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-31-41) [ 1584 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-31-42) [ 1584 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-31-43) [ 1584 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-31-44) [ 1584 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-31-45) [ 1584 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-31-46) [ 1584 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-31-47) [ 1584 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-31-48) [ 1584 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-31-49) [ 1584 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-31-5) [ 1582 0 R /XYZ 60.307257 471.678714 0 ] (__codelineno-31-50) [ 1584 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-31-6) [ 1582 0 R /XYZ 60.307257 458.278362 0 ] (__codelineno-31-7) [ 1582 0 R /XYZ 60.307257 444.878010 0 ] (__codelineno-31-8) [ 1582 0 R /XYZ 60.307257 431.477658 0 ] (__codelineno-31-9) [ 1582 0 R /XYZ 60.307257 418.077306 0 ] (__codelineno-32-1) [ 1603 0 R /XYZ 60.307257 737.358522 0 ] (__codelineno-32-10) [ 1603 0 R /XYZ 60.307257 603.355002 0 ] (__codelineno-32-11) [ 1603 0 R /XYZ 60.307257 589.954650 0 ] (__codelineno-32-12) [ 1603 0 R /XYZ 60.307257 576.554298 0 ] (__codelineno-32-13) [ 1603 0 R /XYZ 60.307257 563.153946 0 ] (__codelineno-32-14) [ 1603 0 R /XYZ 60.307257 549.753594 0 ] (__codelineno-32-15) [ 1603 0 R /XYZ 60.307257 536.353242 0 ] (__codelineno-32-16) [ 1603 0 R /XYZ 60.307257 522.952890 0 ] (__codelineno-32-17) [ 1603 0 R /XYZ 60.307257 509.552538 0 ] (__codelineno-32-18) [ 1603 0 R /XYZ 60.307257 482.751834 0 ] (__codelineno-32-19) [ 1603 0 R /XYZ 60.307257 455.951130 0 ] (__codelineno-32-2) [ 1603 0 R /XYZ 60.307257 723.958170 0 ] (__codelineno-32-20) [ 1603 0 R /XYZ 60.307257 442.550778 0 ] (__codelineno-32-21) [ 1603 0 R /XYZ 60.307257 429.150426 0 ] (__codelineno-32-22) [ 1603 0 R /XYZ 60.307257 415.750074 0 ] (__codelineno-32-23) [ 1603 0 R /XYZ 60.307257 402.349722 0 ] (__codelineno-32-24) [ 1603 0 R /XYZ 60.307257 388.949370 0 ] (__codelineno-32-25) [ 1603 0 R /XYZ 60.307257 362.148666 0 ] (__codelineno-32-26) [ 1603 0 R /XYZ 60.307257 335.347962 0 ] (__codelineno-32-27) [ 1603 0 R /XYZ 60.307257 321.947610 0 ] (__codelineno-32-28) [ 1603 0 R /XYZ 60.307257 308.547258 0 ] (__codelineno-32-29) [ 1603 0 R /XYZ 60.307257 295.146906 0 ] (__codelineno-32-3) [ 1603 0 R /XYZ 60.307257 710.557818 0 ] (__codelineno-32-30) [ 1603 0 R /XYZ 60.307257 281.746554 0 ] (__codelineno-32-31) [ 1603 0 R /XYZ 60.307257 268.346202 0 ] (__codelineno-32-32) [ 1603 0 R /XYZ 60.307257 254.945850 0 ] (__codelineno-32-33) [ 1603 0 R /XYZ 60.307257 241.545498 0 ] (__codelineno-32-34) [ 1603 0 R /XYZ 60.307257 214.744794 0 ] (__codelineno-32-35) [ 1603 0 R /XYZ 60.307257 201.344442 0 ] (__codelineno-32-36) [ 1603 0 R /XYZ 60.307257 174.543738 0 ] (__codelineno-32-37) [ 1603 0 R /XYZ 60.307257 147.743034 0 ] (__codelineno-32-38) [ 1603 0 R /XYZ 60.307257 120.942330 0 ] (__codelineno-32-39) [ 1603 0 R /XYZ 60.307257 107.541978 0 ] (__codelineno-32-4) [ 1603 0 R /XYZ 60.307257 697.157466 0 ] (__codelineno-32-40) [ 1603 0 R /XYZ 60.307257 94.141626 0 ] (__codelineno-32-41) [ 1605 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-32-42) [ 1605 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-32-43) [ 1605 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-32-44) [ 1605 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-32-45) [ 1605 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-32-46) [ 1605 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-32-47) [ 1605 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-32-48) [ 1605 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-32-49) [ 1605 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-32-5) [ 1603 0 R /XYZ 60.307257 670.356762 0 ] (__codelineno-32-50) [ 1605 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-32-51) [ 1605 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-32-52) [ 1605 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-32-53) [ 1605 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-32-54) [ 1605 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-32-55) [ 1605 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-32-56) [ 1605 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-32-57) [ 1605 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-32-58) [ 1605 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-32-59) [ 1605 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-32-6) [ 1603 0 R /XYZ 60.307257 656.956410 0 ] (__codelineno-32-60) [ 1605 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-32-61) [ 1605 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-32-62) [ 1605 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-32-63) [ 1605 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-32-64) [ 1605 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-32-65) [ 1605 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-32-66) [ 1605 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-32-67) [ 1605 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-32-68) [ 1605 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-32-69) [ 1605 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-32-7) [ 1603 0 R /XYZ 60.307257 643.556058 0 ] (__codelineno-32-70) [ 1605 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-32-71) [ 1605 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-32-72) [ 1605 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-32-73) [ 1605 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-32-74) [ 1605 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-32-8) [ 1603 0 R /XYZ 60.307257 630.155706 0 ] (__codelineno-32-9) [ 1603 0 R /XYZ 60.307257 616.755354 0 ] (__codelineno-33-1) [ 1605 0 R /XYZ 60.307257 195.568590 0 ] (__codelineno-33-2) [ 1605 0 R /XYZ 60.307257 182.168238 0 ] (__codelineno-34-1) [ 1607 0 R /XYZ 60.307257 682.931322 0 ] (__codelineno-34-10) [ 1607 0 R /XYZ 60.307257 535.527450 0 ] (__codelineno-34-11) [ 1607 0 R /XYZ 60.307257 522.127098 0 ] (__codelineno-34-12) [ 1607 0 R /XYZ 60.307257 508.726746 0 ] (__codelineno-34-13) [ 1607 0 R /XYZ 60.307257 495.326394 0 ] (__codelineno-34-14) [ 1607 0 R /XYZ 60.307257 468.525690 0 ] (__codelineno-34-15) [ 1607 0 R /XYZ 60.307257 455.125338 0 ] (__codelineno-34-16) [ 1607 0 R /XYZ 60.307257 428.324634 0 ] (__codelineno-34-17) [ 1607 0 R /XYZ 60.307257 414.924282 0 ] (__codelineno-34-18) [ 1607 0 R /XYZ 60.307257 388.123578 0 ] (__codelineno-34-19) [ 1607 0 R /XYZ 60.307257 374.723226 0 ] (__codelineno-34-2) [ 1607 0 R /XYZ 60.307257 669.530970 0 ] (__codelineno-34-20) [ 1607 0 R /XYZ 60.307257 361.322874 0 ] (__codelineno-34-21) [ 1607 0 R /XYZ 60.307257 347.922522 0 ] (__codelineno-34-22) [ 1607 0 R /XYZ 60.307257 334.522170 0 ] (__codelineno-34-23) [ 1607 0 R /XYZ 60.307257 307.721466 0 ] (__codelineno-34-24) [ 1607 0 R /XYZ 60.307257 294.321114 0 ] (__codelineno-34-25) [ 1607 0 R /XYZ 60.307257 267.520410 0 ] (__codelineno-34-26) [ 1607 0 R /XYZ 60.307257 254.120058 0 ] (__codelineno-34-27) [ 1607 0 R /XYZ 60.307257 227.319354 0 ] (__codelineno-34-28) [ 1607 0 R /XYZ 60.307257 213.919002 0 ] (__codelineno-34-29) [ 1607 0 R /XYZ 60.307257 200.518650 0 ] (__codelineno-34-3) [ 1607 0 R /XYZ 60.307257 656.130618 0 ] (__codelineno-34-30) [ 1607 0 R /XYZ 60.307257 173.717946 0 ] (__codelineno-34-31) [ 1607 0 R /XYZ 60.307257 160.317594 0 ] (__codelineno-34-32) [ 1607 0 R /XYZ 60.307257 146.917242 0 ] (__codelineno-34-4) [ 1607 0 R /XYZ 60.307257 642.730266 0 ] (__codelineno-34-5) [ 1607 0 R /XYZ 60.307257 629.329914 0 ] (__codelineno-34-6) [ 1607 0 R /XYZ 60.307257 615.929562 0 ] (__codelineno-34-7) [ 1607 0 R /XYZ 60.307257 602.529210 0 ] (__codelineno-34-8) [ 1607 0 R /XYZ 60.307257 575.728506 0 ] (__codelineno-34-9) [ 1607 0 R /XYZ 60.307257 562.328154 0 ] (__codelineno-35-1) [ 1609 0 R /XYZ 60.307257 519.649722 0 ] (__codelineno-35-10) [ 1609 0 R /XYZ 60.307257 385.646202 0 ] (__codelineno-35-11) [ 1609 0 R /XYZ 60.307257 372.245850 0 ] (__codelineno-35-12) [ 1609 0 R /XYZ 60.307257 358.845498 0 ] (__codelineno-35-13) [ 1609 0 R /XYZ 60.307257 332.044794 0 ] (__codelineno-35-14) [ 1609 0 R /XYZ 60.307257 318.644442 0 ] (__codelineno-35-15) [ 1609 0 R /XYZ 60.307257 305.244090 0 ] (__codelineno-35-16) [ 1609 0 R /XYZ 60.307257 291.843738 0 ] (__codelineno-35-17) [ 1609 0 R /XYZ 60.307257 278.443386 0 ] (__codelineno-35-18) [ 1609 0 R /XYZ 60.307257 265.043034 0 ] (__codelineno-35-19) [ 1609 0 R /XYZ 60.307257 251.642682 0 ] (__codelineno-35-2) [ 1609 0 R /XYZ 60.307257 506.249370 0 ] (__codelineno-35-20) [ 1609 0 R /XYZ 60.307257 238.242330 0 ] (__codelineno-35-21) [ 1609 0 R /XYZ 60.307257 224.841978 0 ] (__codelineno-35-22) [ 1609 0 R /XYZ 60.307257 198.041274 0 ] (__codelineno-35-23) [ 1609 0 R /XYZ 60.307257 171.240570 0 ] (__codelineno-35-24) [ 1609 0 R /XYZ 60.307257 157.840218 0 ] (__codelineno-35-25) [ 1609 0 R /XYZ 60.307257 144.439866 0 ] (__codelineno-35-26) [ 1609 0 R /XYZ 60.307257 131.039514 0 ] (__codelineno-35-27) [ 1609 0 R /XYZ 60.307257 104.238810 0 ] (__codelineno-35-28) [ 1609 0 R /XYZ 60.307257 90.838458 0 ] (__codelineno-35-29) [ 1611 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-35-3) [ 1609 0 R /XYZ 60.307257 492.849018 0 ] (__codelineno-35-30) [ 1611 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-35-31) [ 1611 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-35-32) [ 1611 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-35-4) [ 1609 0 R /XYZ 60.307257 479.448666 0 ] (__codelineno-35-5) [ 1609 0 R /XYZ 60.307257 452.647962 0 ] (__codelineno-35-6) [ 1609 0 R /XYZ 60.307257 439.247610 0 ] (__codelineno-35-7) [ 1609 0 R /XYZ 60.307257 425.847258 0 ] (__codelineno-35-8) [ 1609 0 R /XYZ 60.307257 412.446906 0 ] (__codelineno-35-9) [ 1609 0 R /XYZ 60.307257 399.046554 0 ] (__codelineno-36-1) [ 1616 0 R /XYZ 60.307257 619.120122 0 ] (__codelineno-36-10) [ 1616 0 R /XYZ 60.307257 498.516954 0 ] (__codelineno-36-11) [ 1616 0 R /XYZ 60.307257 485.116602 0 ] (__codelineno-36-12) [ 1616 0 R /XYZ 60.307257 471.716250 0 ] (__codelineno-36-13) [ 1616 0 R /XYZ 60.307257 458.315898 0 ] (__codelineno-36-14) [ 1616 0 R /XYZ 60.307257 444.915546 0 ] (__codelineno-36-15) [ 1616 0 R /XYZ 60.307257 431.515194 0 ] (__codelineno-36-16) [ 1616 0 R /XYZ 60.307257 418.114842 0 ] (__codelineno-36-17) [ 1616 0 R /XYZ 60.307257 404.714490 0 ] (__codelineno-36-18) [ 1616 0 R /XYZ 60.307257 391.314138 0 ] (__codelineno-36-19) [ 1616 0 R /XYZ 60.307257 377.913786 0 ] (__codelineno-36-2) [ 1616 0 R /XYZ 60.307257 605.719770 0 ] (__codelineno-36-20) [ 1616 0 R /XYZ 60.307257 364.513434 0 ] (__codelineno-36-21) [ 1616 0 R /XYZ 60.307257 351.113082 0 ] (__codelineno-36-22) [ 1616 0 R /XYZ 60.307257 337.712730 0 ] (__codelineno-36-23) [ 1616 0 R /XYZ 60.307257 324.312378 0 ] (__codelineno-36-24) [ 1616 0 R /XYZ 60.307257 310.912026 0 ] (__codelineno-36-25) [ 1616 0 R /XYZ 60.307257 297.511674 0 ] (__codelineno-36-26) [ 1616 0 R /XYZ 60.307257 284.111322 0 ] (__codelineno-36-27) [ 1616 0 R /XYZ 60.307257 270.710970 0 ] (__codelineno-36-28) [ 1616 0 R /XYZ 60.307257 257.310618 0 ] (__codelineno-36-29) [ 1616 0 R /XYZ 60.307257 243.910266 0 ] (__codelineno-36-3) [ 1616 0 R /XYZ 60.307257 592.319418 0 ] (__codelineno-36-30) [ 1616 0 R /XYZ 60.307257 230.509914 0 ] (__codelineno-36-31) [ 1616 0 R /XYZ 60.307257 217.109562 0 ] (__codelineno-36-32) [ 1616 0 R /XYZ 60.307257 203.709210 0 ] (__codelineno-36-33) [ 1616 0 R /XYZ 60.307257 190.308858 0 ] (__codelineno-36-34) [ 1616 0 R /XYZ 60.307257 176.908506 0 ] (__codelineno-36-35) [ 1616 0 R /XYZ 60.307257 163.508154 0 ] (__codelineno-36-36) [ 1616 0 R /XYZ 60.307257 150.107802 0 ] (__codelineno-36-37) [ 1616 0 R /XYZ 60.307257 136.707450 0 ] (__codelineno-36-38) [ 1616 0 R /XYZ 60.307257 123.307098 0 ] (__codelineno-36-39) [ 1616 0 R /XYZ 60.307257 109.906746 0 ] (__codelineno-36-4) [ 1616 0 R /XYZ 60.307257 578.919066 0 ] (__codelineno-36-40) [ 1616 0 R /XYZ 60.307257 96.506394 0 ] (__codelineno-36-41) [ 1618 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-36-42) [ 1618 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-36-43) [ 1618 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-36-44) [ 1618 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-36-45) [ 1618 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-36-46) [ 1618 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-36-47) [ 1618 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-36-48) [ 1618 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-36-49) [ 1618 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-36-5) [ 1616 0 R /XYZ 60.307257 565.518714 0 ] (__codelineno-36-50) [ 1618 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-36-51) [ 1618 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-36-52) [ 1618 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-36-53) [ 1618 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-36-54) [ 1618 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-36-55) [ 1618 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-36-56) [ 1618 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-36-57) [ 1618 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-36-58) [ 1618 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-36-59) [ 1618 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-36-6) [ 1616 0 R /XYZ 60.307257 552.118362 0 ] (__codelineno-36-60) [ 1618 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-36-61) [ 1618 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-36-62) [ 1618 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-36-63) [ 1618 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-36-64) [ 1618 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-36-65) [ 1618 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-36-66) [ 1618 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-36-67) [ 1618 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-36-68) [ 1618 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-36-69) [ 1618 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-36-7) [ 1616 0 R /XYZ 60.307257 538.718010 0 ] (__codelineno-36-70) [ 1618 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-36-71) [ 1618 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-36-72) [ 1618 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-36-73) [ 1618 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-36-74) [ 1618 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-36-75) [ 1618 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-36-76) [ 1618 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-36-77) [ 1618 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-36-78) [ 1618 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-36-79) [ 1618 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-36-8) [ 1616 0 R /XYZ 60.307257 525.317658 0 ] (__codelineno-36-80) [ 1618 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-36-81) [ 1618 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-36-82) [ 1618 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-36-83) [ 1618 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-36-84) [ 1618 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-36-85) [ 1618 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-36-86) [ 1618 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-36-87) [ 1618 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-36-88) [ 1618 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-36-89) [ 1618 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-36-9) [ 1616 0 R /XYZ 60.307257 511.917306 0 ] (__codelineno-37-1) [ 1620 0 R /XYZ 60.307257 658.532922 0 ] (__codelineno-37-10) [ 1620 0 R /XYZ 60.307257 537.929754 0 ] (__codelineno-37-11) [ 1620 0 R /XYZ 60.307257 524.529402 0 ] (__codelineno-37-12) [ 1620 0 R /XYZ 60.307257 511.129050 0 ] (__codelineno-37-13) [ 1620 0 R /XYZ 60.307257 497.728698 0 ] (__codelineno-37-14) [ 1620 0 R /XYZ 60.307257 484.328346 0 ] (__codelineno-37-15) [ 1620 0 R /XYZ 60.307257 470.927994 0 ] (__codelineno-37-16) [ 1620 0 R /XYZ 60.307257 457.527642 0 ] (__codelineno-37-17) [ 1620 0 R /XYZ 60.307257 444.127290 0 ] (__codelineno-37-18) [ 1620 0 R /XYZ 60.307257 430.726938 0 ] (__codelineno-37-19) [ 1620 0 R /XYZ 60.307257 417.326586 0 ] (__codelineno-37-2) [ 1620 0 R /XYZ 60.307257 645.132570 0 ] (__codelineno-37-20) [ 1620 0 R /XYZ 60.307257 403.926234 0 ] (__codelineno-37-21) [ 1620 0 R /XYZ 60.307257 390.525882 0 ] (__codelineno-37-22) [ 1620 0 R /XYZ 60.307257 377.125530 0 ] (__codelineno-37-23) [ 1620 0 R /XYZ 60.307257 363.725178 0 ] (__codelineno-37-24) [ 1620 0 R /XYZ 60.307257 350.324826 0 ] (__codelineno-37-25) [ 1620 0 R /XYZ 60.307257 336.924474 0 ] (__codelineno-37-26) [ 1620 0 R /XYZ 60.307257 323.524122 0 ] (__codelineno-37-27) [ 1620 0 R /XYZ 60.307257 310.123770 0 ] (__codelineno-37-28) [ 1620 0 R /XYZ 60.307257 296.723418 0 ] (__codelineno-37-29) [ 1620 0 R /XYZ 60.307257 283.323066 0 ] (__codelineno-37-3) [ 1620 0 R /XYZ 60.307257 631.732218 0 ] (__codelineno-37-30) [ 1620 0 R /XYZ 60.307257 269.922714 0 ] (__codelineno-37-31) [ 1620 0 R /XYZ 60.307257 256.522362 0 ] (__codelineno-37-32) [ 1620 0 R /XYZ 60.307257 243.122010 0 ] (__codelineno-37-33) [ 1620 0 R /XYZ 60.307257 229.721658 0 ] (__codelineno-37-34) [ 1620 0 R /XYZ 60.307257 216.321306 0 ] (__codelineno-37-35) [ 1620 0 R /XYZ 60.307257 202.920954 0 ] (__codelineno-37-36) [ 1620 0 R /XYZ 60.307257 189.520602 0 ] (__codelineno-37-37) [ 1620 0 R /XYZ 60.307257 176.120250 0 ] (__codelineno-37-38) [ 1620 0 R /XYZ 60.307257 162.719898 0 ] (__codelineno-37-39) [ 1620 0 R /XYZ 60.307257 149.319546 0 ] (__codelineno-37-4) [ 1620 0 R /XYZ 60.307257 618.331866 0 ] (__codelineno-37-40) [ 1620 0 R /XYZ 60.307257 135.919194 0 ] (__codelineno-37-41) [ 1620 0 R /XYZ 60.307257 122.518842 0 ] (__codelineno-37-42) [ 1620 0 R /XYZ 60.307257 109.118490 0 ] (__codelineno-37-43) [ 1620 0 R /XYZ 60.307257 95.718138 0 ] (__codelineno-37-44) [ 1622 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-37-45) [ 1622 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-37-46) [ 1622 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-37-47) [ 1622 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-37-48) [ 1622 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-37-49) [ 1622 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-37-5) [ 1620 0 R /XYZ 60.307257 604.931514 0 ] (__codelineno-37-50) [ 1622 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-37-51) [ 1622 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-37-52) [ 1622 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-37-53) [ 1622 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-37-54) [ 1622 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-37-55) [ 1622 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-37-56) [ 1622 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-37-57) [ 1622 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-37-58) [ 1622 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-37-59) [ 1622 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-37-6) [ 1620 0 R /XYZ 60.307257 591.531162 0 ] (__codelineno-37-60) [ 1622 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-37-61) [ 1622 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-37-62) [ 1622 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-37-63) [ 1622 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-37-64) [ 1622 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-37-65) [ 1622 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-37-66) [ 1622 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-37-67) [ 1622 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-37-68) [ 1622 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-37-69) [ 1622 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-37-7) [ 1620 0 R /XYZ 60.307257 578.130810 0 ] (__codelineno-37-70) [ 1622 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-37-71) [ 1622 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-37-72) [ 1622 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-37-73) [ 1622 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-37-74) [ 1622 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-37-75) [ 1622 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-37-76) [ 1622 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-37-77) [ 1622 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-37-78) [ 1622 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-37-79) [ 1622 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-37-8) [ 1620 0 R /XYZ 60.307257 564.730458 0 ] (__codelineno-37-80) [ 1622 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-37-81) [ 1622 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-37-9) [ 1620 0 R /XYZ 60.307257 551.330106 0 ] (__codelineno-38-1) [ 1624 0 R /XYZ 60.307257 174.624222 0 ] (__codelineno-38-10) [ 1626 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-38-11) [ 1626 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-38-12) [ 1626 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-38-13) [ 1626 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-38-14) [ 1626 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-38-15) [ 1626 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-38-16) [ 1626 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-38-17) [ 1626 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-38-18) [ 1626 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-38-19) [ 1626 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-38-2) [ 1624 0 R /XYZ 60.307257 161.223870 0 ] (__codelineno-38-20) [ 1626 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-38-21) [ 1626 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-38-22) [ 1626 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-38-23) [ 1626 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-38-24) [ 1626 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-38-25) [ 1626 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-38-26) [ 1626 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-38-27) [ 1626 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-38-28) [ 1626 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-38-29) [ 1626 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-38-3) [ 1624 0 R /XYZ 60.307257 147.823518 0 ] (__codelineno-38-30) [ 1626 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-38-31) [ 1626 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-38-32) [ 1626 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-38-33) [ 1626 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-38-34) [ 1626 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-38-35) [ 1626 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-38-36) [ 1626 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-38-37) [ 1626 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-38-38) [ 1626 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-38-4) [ 1624 0 R /XYZ 60.307257 134.423166 0 ] (__codelineno-38-5) [ 1624 0 R /XYZ 60.307257 121.022814 0 ] (__codelineno-38-6) [ 1624 0 R /XYZ 60.307257 94.222110 0 ] (__codelineno-38-7) [ 1626 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-38-8) [ 1626 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-38-9) [ 1626 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-39-1) [ 1761 0 R /XYZ 60.307257 529.339422 0 ] (__codelineno-39-10) [ 1761 0 R /XYZ 60.307257 368.535198 0 ] (__codelineno-39-11) [ 1761 0 R /XYZ 60.307257 355.134846 0 ] (__codelineno-39-12) [ 1761 0 R /XYZ 60.307257 341.734494 0 ] (__codelineno-39-13) [ 1761 0 R /XYZ 60.307257 328.334142 0 ] (__codelineno-39-14) [ 1761 0 R /XYZ 60.307257 314.933790 0 ] (__codelineno-39-15) [ 1761 0 R /XYZ 60.307257 301.533438 0 ] (__codelineno-39-16) [ 1761 0 R /XYZ 60.307257 288.133086 0 ] (__codelineno-39-17) [ 1761 0 R /XYZ 60.307257 274.732734 0 ] (__codelineno-39-18) [ 1761 0 R /XYZ 60.307257 261.332382 0 ] (__codelineno-39-19) [ 1761 0 R /XYZ 60.307257 247.932030 0 ] (__codelineno-39-2) [ 1761 0 R /XYZ 60.307257 515.939070 0 ] (__codelineno-39-20) [ 1761 0 R /XYZ 60.307257 234.531678 0 ] (__codelineno-39-21) [ 1761 0 R /XYZ 60.307257 221.131326 0 ] (__codelineno-39-22) [ 1761 0 R /XYZ 60.307257 194.330622 0 ] (__codelineno-39-23) [ 1761 0 R /XYZ 60.307257 180.930270 0 ] (__codelineno-39-24) [ 1761 0 R /XYZ 60.307257 167.529918 0 ] (__codelineno-39-25) [ 1761 0 R /XYZ 60.307257 140.729214 0 ] (__codelineno-39-26) [ 1761 0 R /XYZ 60.307257 127.328862 0 ] (__codelineno-39-27) [ 1761 0 R /XYZ 60.307257 113.928510 0 ] (__codelineno-39-28) [ 1761 0 R /XYZ 60.307257 100.528158 0 ] (__codelineno-39-29) [ 1761 0 R /XYZ 60.307257 87.127806 0 ] (__codelineno-39-3) [ 1761 0 R /XYZ 60.307257 502.538718 0 ] (__codelineno-39-30) [ 1763 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-39-31) [ 1763 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-39-32) [ 1763 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-39-33) [ 1763 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-39-34) [ 1763 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-39-35) [ 1763 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-39-36) [ 1763 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-39-37) [ 1763 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-39-38) [ 1763 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-39-39) [ 1763 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-39-4) [ 1761 0 R /XYZ 60.307257 475.738014 0 ] (__codelineno-39-5) [ 1761 0 R /XYZ 60.307257 448.937310 0 ] (__codelineno-39-6) [ 1761 0 R /XYZ 60.307257 422.136606 0 ] (__codelineno-39-7) [ 1761 0 R /XYZ 60.307257 408.736254 0 ] (__codelineno-39-8) [ 1761 0 R /XYZ 60.307257 395.335902 0 ] (__codelineno-39-9) [ 1761 0 R /XYZ 60.307257 381.935550 0 ] (__codelineno-4-1) [ 665 0 R /XYZ 60.307257 491.661942 0 ] (__codelineno-4-10) [ 665 0 R /XYZ 60.307257 371.058774 0 ] (__codelineno-4-11) [ 665 0 R /XYZ 60.307257 344.258070 0 ] (__codelineno-4-12) [ 665 0 R /XYZ 60.307257 330.857718 0 ] (__codelineno-4-13) [ 665 0 R /XYZ 60.307257 317.457366 0 ] (__codelineno-4-14) [ 665 0 R /XYZ 60.307257 304.057014 0 ] (__codelineno-4-15) [ 665 0 R /XYZ 60.307257 290.656662 0 ] (__codelineno-4-16) [ 665 0 R /XYZ 60.307257 277.256310 0 ] (__codelineno-4-17) [ 665 0 R /XYZ 60.307257 250.455606 0 ] (__codelineno-4-18) [ 665 0 R /XYZ 60.307257 237.055254 0 ] (__codelineno-4-19) [ 665 0 R /XYZ 60.307257 223.654902 0 ] (__codelineno-4-2) [ 665 0 R /XYZ 60.307257 478.261590 0 ] (__codelineno-4-20) [ 665 0 R /XYZ 60.307257 210.254550 0 ] (__codelineno-4-21) [ 665 0 R /XYZ 60.307257 196.854198 0 ] (__codelineno-4-22) [ 665 0 R /XYZ 60.307257 183.453846 0 ] (__codelineno-4-23) [ 665 0 R /XYZ 60.307257 170.053494 0 ] (__codelineno-4-24) [ 665 0 R /XYZ 60.307257 156.653142 0 ] (__codelineno-4-25) [ 665 0 R /XYZ 60.307257 143.252790 0 ] (__codelineno-4-26) [ 665 0 R /XYZ 60.307257 129.852438 0 ] (__codelineno-4-27) [ 665 0 R /XYZ 60.307257 116.452086 0 ] (__codelineno-4-28) [ 665 0 R /XYZ 60.307257 103.051734 0 ] (__codelineno-4-29) [ 665 0 R /XYZ 60.307257 89.651382 0 ] (__codelineno-4-3) [ 665 0 R /XYZ 60.307257 464.861238 0 ] (__codelineno-4-30) [ 667 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-4-31) [ 667 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-4-32) [ 667 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-4-33) [ 667 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-4-34) [ 667 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-4-35) [ 667 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-4-36) [ 667 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-4-37) [ 667 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-4-4) [ 665 0 R /XYZ 60.307257 451.460886 0 ] (__codelineno-4-5) [ 665 0 R /XYZ 60.307257 438.060534 0 ] (__codelineno-4-6) [ 665 0 R /XYZ 60.307257 424.660182 0 ] (__codelineno-4-7) [ 665 0 R /XYZ 60.307257 411.259830 0 ] (__codelineno-4-8) [ 665 0 R /XYZ 60.307257 397.859478 0 ] (__codelineno-4-9) [ 665 0 R /XYZ 60.307257 384.459126 0 ] (__codelineno-5-1) [ 675 0 R /XYZ 60.307257 671.460194 0 ] (__codelineno-5-10) [ 675 0 R /XYZ 60.307257 537.456674 0 ] (__codelineno-5-11) [ 675 0 R /XYZ 60.307257 524.056322 0 ] (__codelineno-5-12) [ 675 0 R /XYZ 60.307257 510.655970 0 ] (__codelineno-5-13) [ 675 0 R /XYZ 60.307257 497.255618 0 ] (__codelineno-5-14) [ 675 0 R /XYZ 60.307257 483.855266 0 ] (__codelineno-5-15) [ 675 0 R /XYZ 60.307257 470.454914 0 ] (__codelineno-5-16) [ 675 0 R /XYZ 60.307257 457.054562 0 ] (__codelineno-5-17) [ 675 0 R /XYZ 60.307257 443.654210 0 ] (__codelineno-5-18) [ 675 0 R /XYZ 60.307257 416.853506 0 ] (__codelineno-5-19) [ 675 0 R /XYZ 60.307257 403.453154 0 ] (__codelineno-5-2) [ 675 0 R /XYZ 60.307257 658.059842 0 ] (__codelineno-5-20) [ 675 0 R /XYZ 60.307257 390.052802 0 ] (__codelineno-5-21) [ 675 0 R /XYZ 60.307257 376.652450 0 ] (__codelineno-5-22) [ 675 0 R /XYZ 60.307257 363.252098 0 ] (__codelineno-5-23) [ 675 0 R /XYZ 60.307257 349.851746 0 ] (__codelineno-5-24) [ 675 0 R /XYZ 60.307257 323.051042 0 ] (__codelineno-5-25) [ 675 0 R /XYZ 60.307257 309.650690 0 ] (__codelineno-5-26) [ 675 0 R /XYZ 60.307257 296.250338 0 ] (__codelineno-5-27) [ 675 0 R /XYZ 60.307257 269.449634 0 ] (__codelineno-5-28) [ 675 0 R /XYZ 60.307257 256.049282 0 ] (__codelineno-5-29) [ 675 0 R /XYZ 60.307257 229.248578 0 ] (__codelineno-5-3) [ 675 0 R /XYZ 60.307257 644.659490 0 ] (__codelineno-5-30) [ 675 0 R /XYZ 60.307257 202.447874 0 ] (__codelineno-5-31) [ 675 0 R /XYZ 60.307257 189.047522 0 ] (__codelineno-5-32) [ 675 0 R /XYZ 60.307257 175.647170 0 ] (__codelineno-5-33) [ 675 0 R /XYZ 60.307257 162.246818 0 ] (__codelineno-5-34) [ 675 0 R /XYZ 60.307257 135.446114 0 ] (__codelineno-5-35) [ 675 0 R /XYZ 60.307257 122.045762 0 ] (__codelineno-5-36) [ 675 0 R /XYZ 60.307257 108.645410 0 ] (__codelineno-5-37) [ 675 0 R /XYZ 60.307257 95.245058 0 ] (__codelineno-5-38) [ 679 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-5-39) [ 679 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-5-4) [ 675 0 R /XYZ 60.307257 631.259138 0 ] (__codelineno-5-40) [ 679 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-5-41) [ 679 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-5-42) [ 679 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-5-43) [ 679 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-5-44) [ 679 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-5-45) [ 679 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-5-46) [ 679 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-5-47) [ 679 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-5-48) [ 679 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-5-49) [ 679 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-5-5) [ 675 0 R /XYZ 60.307257 617.858786 0 ] (__codelineno-5-50) [ 679 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-5-51) [ 679 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-5-52) [ 679 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-5-53) [ 679 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-5-54) [ 679 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-5-55) [ 679 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-5-56) [ 679 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-5-57) [ 679 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-5-58) [ 679 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-5-59) [ 679 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-5-6) [ 675 0 R /XYZ 60.307257 604.458434 0 ] (__codelineno-5-60) [ 679 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-5-61) [ 679 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-5-62) [ 679 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-5-7) [ 675 0 R /XYZ 60.307257 577.657730 0 ] (__codelineno-5-8) [ 675 0 R /XYZ 60.307257 564.257378 0 ] (__codelineno-5-9) [ 675 0 R /XYZ 60.307257 550.857026 0 ] (__codelineno-6-1) [ 688 0 R /XYZ 60.307257 458.116602 0 ] (__codelineno-6-10) [ 688 0 R /XYZ 60.307257 337.513434 0 ] (__codelineno-6-100) [ 694 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-6-101) [ 694 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-6-102) [ 694 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-6-103) [ 694 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-6-104) [ 694 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-6-105) [ 694 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-6-106) [ 694 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-6-107) [ 694 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-6-108) [ 694 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-6-109) [ 694 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-6-11) [ 688 0 R /XYZ 60.307257 324.113082 0 ] (__codelineno-6-110) [ 694 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-6-111) [ 694 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-6-112) [ 694 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-6-113) [ 694 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-6-114) [ 694 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-6-115) [ 694 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-6-116) [ 694 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-6-117) [ 694 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-6-118) [ 694 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-6-119) [ 694 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-6-12) [ 688 0 R /XYZ 60.307257 310.712730 0 ] (__codelineno-6-120) [ 694 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-6-121) [ 694 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-6-122) [ 694 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-6-123) [ 694 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-6-124) [ 694 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-6-125) [ 694 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-6-126) [ 694 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-6-127) [ 694 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-6-128) [ 694 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-6-129) [ 694 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-6-13) [ 688 0 R /XYZ 60.307257 297.312378 0 ] (__codelineno-6-130) [ 694 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-6-131) [ 694 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-6-132) [ 694 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-6-133) [ 696 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-6-134) [ 696 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-6-135) [ 696 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-6-136) [ 696 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-6-137) [ 696 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-6-138) [ 696 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-6-139) [ 696 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-6-14) [ 688 0 R /XYZ 60.307257 283.912026 0 ] (__codelineno-6-140) [ 696 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-6-141) [ 696 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-6-142) [ 696 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-6-143) [ 696 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-6-144) [ 696 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-6-145) [ 696 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-6-146) [ 696 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-6-147) [ 696 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-6-148) [ 696 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-6-149) [ 696 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-6-15) [ 688 0 R /XYZ 60.307257 270.511674 0 ] (__codelineno-6-150) [ 696 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-6-151) [ 696 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-6-152) [ 696 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-6-153) [ 696 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-6-154) [ 696 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-6-155) [ 696 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-6-156) [ 696 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-6-157) [ 696 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-6-158) [ 696 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-6-159) [ 696 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-6-16) [ 688 0 R /XYZ 60.307257 257.111322 0 ] (__codelineno-6-160) [ 696 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-6-161) [ 696 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-6-162) [ 696 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-6-163) [ 696 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-6-17) [ 688 0 R /XYZ 60.307257 243.710970 0 ] (__codelineno-6-18) [ 688 0 R /XYZ 60.307257 230.310618 0 ] (__codelineno-6-19) [ 688 0 R /XYZ 60.307257 216.910266 0 ] (__codelineno-6-2) [ 688 0 R /XYZ 60.307257 444.716250 0 ] (__codelineno-6-20) [ 688 0 R /XYZ 60.307257 203.509914 0 ] (__codelineno-6-21) [ 688 0 R /XYZ 60.307257 190.109562 0 ] (__codelineno-6-22) [ 688 0 R /XYZ 60.307257 176.709210 0 ] (__codelineno-6-23) [ 688 0 R /XYZ 60.307257 163.308858 0 ] (__codelineno-6-24) [ 688 0 R /XYZ 60.307257 149.908506 0 ] (__codelineno-6-25) [ 688 0 R /XYZ 60.307257 136.508154 0 ] (__codelineno-6-26) [ 688 0 R /XYZ 60.307257 123.107802 0 ] (__codelineno-6-27) [ 688 0 R /XYZ 60.307257 109.707450 0 ] (__codelineno-6-28) [ 688 0 R /XYZ 60.307257 96.307098 0 ] (__codelineno-6-29) [ 692 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-6-3) [ 688 0 R /XYZ 60.307257 431.315898 0 ] (__codelineno-6-30) [ 692 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-6-31) [ 692 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-6-32) [ 692 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-6-33) [ 692 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-6-34) [ 692 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-6-35) [ 692 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-6-36) [ 692 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-6-37) [ 692 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-6-38) [ 692 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-6-39) [ 692 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-6-4) [ 688 0 R /XYZ 60.307257 417.915546 0 ] (__codelineno-6-40) [ 692 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-6-41) [ 692 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-6-42) [ 692 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-6-43) [ 692 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-6-44) [ 692 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-6-45) [ 692 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-6-46) [ 692 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-6-47) [ 692 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-6-48) [ 692 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-6-49) [ 692 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-6-5) [ 688 0 R /XYZ 60.307257 404.515194 0 ] (__codelineno-6-50) [ 692 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-6-51) [ 692 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-6-52) [ 692 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-6-53) [ 692 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-6-54) [ 692 0 R /XYZ 60.307257 436.014822 0 ] (__codelineno-6-55) [ 692 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-6-56) [ 692 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-6-57) [ 692 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-6-58) [ 692 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-6-59) [ 692 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-6-6) [ 688 0 R /XYZ 60.307257 391.114842 0 ] (__codelineno-6-60) [ 692 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-6-61) [ 692 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-6-62) [ 692 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-6-63) [ 692 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-6-64) [ 692 0 R /XYZ 60.307257 302.011302 0 ] (__codelineno-6-65) [ 692 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-6-66) [ 692 0 R /XYZ 60.307257 275.210598 0 ] (__codelineno-6-67) [ 692 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-6-68) [ 692 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-6-69) [ 692 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-6-7) [ 688 0 R /XYZ 60.307257 377.714490 0 ] (__codelineno-6-70) [ 692 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-6-71) [ 692 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-6-72) [ 692 0 R /XYZ 60.307257 194.808486 0 ] (__codelineno-6-73) [ 692 0 R /XYZ 60.307257 181.408134 0 ] (__codelineno-6-74) [ 692 0 R /XYZ 60.307257 168.007782 0 ] (__codelineno-6-75) [ 692 0 R /XYZ 60.307257 154.607430 0 ] (__codelineno-6-76) [ 692 0 R /XYZ 60.307257 141.207078 0 ] (__codelineno-6-77) [ 692 0 R /XYZ 60.307257 127.806726 0 ] (__codelineno-6-78) [ 692 0 R /XYZ 60.307257 114.406374 0 ] (__codelineno-6-79) [ 692 0 R /XYZ 60.307257 101.006022 0 ] (__codelineno-6-8) [ 688 0 R /XYZ 60.307257 364.314138 0 ] (__codelineno-6-80) [ 692 0 R /XYZ 60.307257 87.605670 0 ] (__codelineno-6-81) [ 694 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-6-82) [ 694 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-6-83) [ 694 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-6-84) [ 694 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-6-85) [ 694 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-6-86) [ 694 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-6-87) [ 694 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-6-88) [ 694 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-6-89) [ 694 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-6-9) [ 688 0 R /XYZ 60.307257 350.913786 0 ] (__codelineno-6-90) [ 694 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-6-91) [ 694 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-6-92) [ 694 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-6-93) [ 694 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-6-94) [ 694 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-6-95) [ 694 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-6-96) [ 694 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-6-97) [ 694 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-6-98) [ 694 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-6-99) [ 694 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-7-1) [ 929 0 R /XYZ 60.307257 428.812602 0 ] (__codelineno-7-10) [ 1274 0 R /XYZ 60.307257 240.520223 0 ] (__codelineno-7-11) [ 1274 0 R /XYZ 60.307257 227.119871 0 ] (__codelineno-7-12) [ 1274 0 R /XYZ 60.307257 213.719519 0 ] (__codelineno-7-13) [ 1274 0 R /XYZ 60.307257 200.319167 0 ] (__codelineno-7-14) [ 1274 0 R /XYZ 60.307257 186.918815 0 ] (__codelineno-7-15) [ 1274 0 R /XYZ 60.307257 173.518463 0 ] (__codelineno-7-16) [ 1274 0 R /XYZ 60.307257 160.118111 0 ] (__codelineno-7-17) [ 1274 0 R /XYZ 60.307257 146.717759 0 ] (__codelineno-7-18) [ 1274 0 R /XYZ 60.307257 119.917055 0 ] (__codelineno-7-19) [ 1274 0 R /XYZ 60.307257 106.516703 0 ] (__codelineno-7-2) [ 929 0 R /XYZ 60.307257 415.412250 0 ] (__codelineno-7-20) [ 1274 0 R /XYZ 60.307257 93.116351 0 ] (__codelineno-7-21) [ 1281 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-7-22) [ 1281 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-7-23) [ 1281 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-7-24) [ 1281 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-7-25) [ 1281 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-7-26) [ 1281 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-7-27) [ 1281 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-7-28) [ 1281 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-7-29) [ 1281 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-7-3) [ 929 0 R /XYZ 60.307257 402.011898 0 ] (__codelineno-7-30) [ 1281 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-7-31) [ 1281 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-7-32) [ 1281 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-7-33) [ 1281 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-7-34) [ 1281 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-7-35) [ 1281 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-7-36) [ 1281 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-7-37) [ 1281 0 R /XYZ 60.307257 489.616230 0 ] (__codelineno-7-38) [ 1281 0 R /XYZ 60.307257 476.215878 0 ] (__codelineno-7-39) [ 1281 0 R /XYZ 60.307257 462.815526 0 ] (__codelineno-7-4) [ 929 0 R /XYZ 60.307257 388.611546 0 ] (__codelineno-7-40) [ 1281 0 R /XYZ 60.307257 449.415174 0 ] (__codelineno-7-41) [ 1281 0 R /XYZ 60.307257 422.614470 0 ] (__codelineno-7-42) [ 1281 0 R /XYZ 60.307257 409.214118 0 ] (__codelineno-7-43) [ 1281 0 R /XYZ 60.307257 395.813766 0 ] (__codelineno-7-44) [ 1281 0 R /XYZ 60.307257 382.413414 0 ] (__codelineno-7-45) [ 1281 0 R /XYZ 60.307257 369.013062 0 ] (__codelineno-7-46) [ 1281 0 R /XYZ 60.307257 355.612710 0 ] (__codelineno-7-47) [ 1281 0 R /XYZ 60.307257 342.212358 0 ] (__codelineno-7-48) [ 1281 0 R /XYZ 60.307257 328.812006 0 ] (__codelineno-7-49) [ 1281 0 R /XYZ 60.307257 315.411654 0 ] (__codelineno-7-5) [ 929 0 R /XYZ 60.307257 375.211194 0 ] (__codelineno-7-50) [ 1281 0 R /XYZ 60.307257 288.610950 0 ] (__codelineno-7-51) [ 1281 0 R /XYZ 60.307257 261.810246 0 ] (__codelineno-7-52) [ 1281 0 R /XYZ 60.307257 248.409894 0 ] (__codelineno-7-53) [ 1281 0 R /XYZ 60.307257 235.009542 0 ] (__codelineno-7-54) [ 1281 0 R /XYZ 60.307257 221.609190 0 ] (__codelineno-7-55) [ 1281 0 R /XYZ 60.307257 208.208838 0 ] (__codelineno-7-6) [ 929 0 R /XYZ 60.307257 361.810842 0 ] (__codelineno-7-7) [ 929 0 R /XYZ 60.307257 348.410490 0 ] (__codelineno-7-8) [ 1274 0 R /XYZ 60.307257 267.320927 0 ] (__codelineno-7-9) [ 1274 0 R /XYZ 60.307257 253.920575 0 ] (__codelineno-8-1) [ 931 0 R /XYZ 60.307257 381.602202 0 ] (__codelineno-8-10) [ 1312 0 R /XYZ 60.307257 757.623270 0 ] (__codelineno-8-11) [ 1312 0 R /XYZ 60.307257 744.222918 0 ] (__codelineno-8-12) [ 1312 0 R /XYZ 60.307257 730.822566 0 ] (__codelineno-8-13) [ 1312 0 R /XYZ 60.307257 717.422214 0 ] (__codelineno-8-14) [ 1312 0 R /XYZ 60.307257 704.021862 0 ] (__codelineno-8-15) [ 1312 0 R /XYZ 60.307257 690.621510 0 ] (__codelineno-8-16) [ 1312 0 R /XYZ 60.307257 677.221158 0 ] (__codelineno-8-17) [ 1312 0 R /XYZ 60.307257 663.820806 0 ] (__codelineno-8-18) [ 1312 0 R /XYZ 60.307257 650.420454 0 ] (__codelineno-8-19) [ 1312 0 R /XYZ 60.307257 637.020102 0 ] (__codelineno-8-2) [ 931 0 R /XYZ 60.307257 368.201850 0 ] (__codelineno-8-20) [ 1312 0 R /XYZ 60.307257 623.619750 0 ] (__codelineno-8-21) [ 1312 0 R /XYZ 60.307257 610.219398 0 ] (__codelineno-8-22) [ 1312 0 R /XYZ 60.307257 596.819046 0 ] (__codelineno-8-23) [ 1312 0 R /XYZ 60.307257 583.418694 0 ] (__codelineno-8-24) [ 1312 0 R /XYZ 60.307257 570.018342 0 ] (__codelineno-8-25) [ 1312 0 R /XYZ 60.307257 556.617990 0 ] (__codelineno-8-26) [ 1312 0 R /XYZ 60.307257 543.217638 0 ] (__codelineno-8-27) [ 1312 0 R /XYZ 60.307257 529.817286 0 ] (__codelineno-8-28) [ 1312 0 R /XYZ 60.307257 516.416934 0 ] (__codelineno-8-29) [ 1312 0 R /XYZ 60.307257 503.016582 0 ] (__codelineno-8-3) [ 931 0 R /XYZ 60.307257 354.801498 0 ] (__codelineno-8-4) [ 931 0 R /XYZ 60.307257 341.401146 0 ] (__codelineno-8-5) [ 931 0 R /XYZ 60.307257 328.000794 0 ] (__codelineno-8-6) [ 931 0 R /XYZ 60.307257 314.600442 0 ] (__codelineno-8-7) [ 1307 0 R /XYZ 60.307257 97.879717 0 ] (__codelineno-8-8) [ 1307 0 R /XYZ 60.307257 84.479365 0 ] (__codelineno-8-9) [ 1312 0 R /XYZ 60.307257 771.023622 0 ] (__codelineno-9-1) [ 936 0 R /XYZ 60.307257 458.458122 0 ] (__codelineno-9-10) [ 1319 0 R /XYZ 60.307257 643.030554 0 ] (__codelineno-9-11) [ 1319 0 R /XYZ 60.307257 629.630202 0 ] (__codelineno-9-12) [ 1319 0 R /XYZ 60.307257 616.229850 0 ] (__codelineno-9-13) [ 1319 0 R /XYZ 60.307257 602.829498 0 ] (__codelineno-9-14) [ 1319 0 R /XYZ 60.307257 589.429146 0 ] (__codelineno-9-15) [ 1319 0 R /XYZ 60.307257 576.028794 0 ] (__codelineno-9-16) [ 1319 0 R /XYZ 60.307257 562.628442 0 ] (__codelineno-9-17) [ 1319 0 R /XYZ 60.307257 549.228090 0 ] (__codelineno-9-18) [ 1319 0 R /XYZ 60.307257 535.827738 0 ] (__codelineno-9-19) [ 1319 0 R /XYZ 60.307257 522.427386 0 ] (__codelineno-9-2) [ 936 0 R /XYZ 60.307257 445.057770 0 ] (__codelineno-9-20) [ 1319 0 R /XYZ 60.307257 509.027034 0 ] (__codelineno-9-21) [ 1319 0 R /XYZ 60.307257 495.626682 0 ] (__codelineno-9-22) [ 1319 0 R /XYZ 60.307257 482.226330 0 ] (__codelineno-9-23) [ 1319 0 R /XYZ 60.307257 468.825978 0 ] (__codelineno-9-24) [ 1319 0 R /XYZ 60.307257 455.425626 0 ] (__codelineno-9-25) [ 1319 0 R /XYZ 60.307257 442.025274 0 ] (__codelineno-9-26) [ 1319 0 R /XYZ 60.307257 428.624922 0 ] (__codelineno-9-27) [ 1319 0 R /XYZ 60.307257 415.224570 0 ] (__codelineno-9-28) [ 1319 0 R /XYZ 60.307257 401.824218 0 ] (__codelineno-9-29) [ 1319 0 R /XYZ 60.307257 388.423866 0 ] (__codelineno-9-3) [ 936 0 R /XYZ 60.307257 431.657418 0 ] (__codelineno-9-30) [ 1319 0 R /XYZ 60.307257 375.023514 0 ] (__codelineno-9-31) [ 1319 0 R /XYZ 60.307257 361.623162 0 ] (__codelineno-9-32) [ 1319 0 R /XYZ 60.307257 348.222810 0 ] (__codelineno-9-33) [ 1319 0 R /XYZ 60.307257 334.822458 0 ] (__codelineno-9-34) [ 1319 0 R /XYZ 60.307257 321.422106 0 ] (__codelineno-9-35) [ 1319 0 R /XYZ 60.307257 308.021754 0 ] (__codelineno-9-36) [ 1319 0 R /XYZ 60.307257 294.621402 0 ] (__codelineno-9-37) [ 1319 0 R /XYZ 60.307257 281.221050 0 ] (__codelineno-9-38) [ 1319 0 R /XYZ 60.307257 267.820698 0 ] (__codelineno-9-39) [ 1319 0 R /XYZ 60.307257 254.420346 0 ] (__codelineno-9-4) [ 936 0 R /XYZ 60.307257 418.257066 0 ] (__codelineno-9-40) [ 1319 0 R /XYZ 60.307257 241.019994 0 ] (__codelineno-9-41) [ 1319 0 R /XYZ 60.307257 227.619642 0 ] (__codelineno-9-42) [ 1319 0 R /XYZ 60.307257 214.219290 0 ] (__codelineno-9-43) [ 1319 0 R /XYZ 60.307257 200.818938 0 ] (__codelineno-9-5) [ 936 0 R /XYZ 60.307257 404.856714 0 ] (__codelineno-9-6) [ 936 0 R /XYZ 60.307257 391.456362 0 ] (__codelineno-9-7) [ 936 0 R /XYZ 60.307257 378.056010 0 ] (__codelineno-9-8) [ 1319 0 R /XYZ 60.307257 669.831258 0 ] (__codelineno-9-9) [ 1319 0 R /XYZ 60.307257 656.430906 0 ] (author) [ 6 0 R /XYZ 55.946457 113.701342 0 ] (copyright) [ 6 0 R /XYZ 55.946457 84.997342 0 ] (doc-cover) [ 6 0 R /XYZ 28.346457 771.023622 0 ] (doc-toc) [ 8 0 R /XYZ 39.386457 771.023622 0 ] (jdb/:) [ 1138 0 R /XYZ 39.386457 771.023622 0 ] (jdb/:26-avril-2023) [ 1490 0 R /XYZ 39.386457 222.365322 0 ] (jdb/:__span-0-1) [ 1138 0 R /XYZ 60.307257 505.092222 0 ] (jdb/:__span-0-10) [ 1138 0 R /XYZ 60.307257 384.489054 0 ] (jdb/:__span-0-11) [ 1138 0 R /XYZ 60.307257 371.088702 0 ] (jdb/:__span-0-12) [ 1138 0 R /XYZ 60.307257 357.688350 0 ] (jdb/:__span-0-13) [ 1138 0 R /XYZ 60.307257 344.287998 0 ] (jdb/:__span-0-14) [ 1138 0 R /XYZ 60.307257 330.887646 0 ] (jdb/:__span-0-15) [ 1138 0 R /XYZ 60.307257 317.487294 0 ] (jdb/:__span-0-16) [ 1138 0 R /XYZ 60.307257 304.086942 0 ] (jdb/:__span-0-17) [ 1138 0 R /XYZ 60.307257 290.686590 0 ] (jdb/:__span-0-18) [ 1138 0 R /XYZ 60.307257 277.286238 0 ] (jdb/:__span-0-19) [ 1138 0 R /XYZ 60.307257 263.885886 0 ] (jdb/:__span-0-2) [ 1138 0 R /XYZ 60.307257 491.691870 0 ] (jdb/:__span-0-20) [ 1138 0 R /XYZ 60.307257 250.485534 0 ] (jdb/:__span-0-21) [ 1138 0 R /XYZ 60.307257 237.085182 0 ] (jdb/:__span-0-22) [ 1138 0 R /XYZ 60.307257 223.684830 0 ] (jdb/:__span-0-23) [ 1138 0 R /XYZ 60.307257 210.284478 0 ] (jdb/:__span-0-3) [ 1138 0 R /XYZ 60.307257 478.291518 0 ] (jdb/:__span-0-4) [ 1138 0 R /XYZ 60.307257 464.891166 0 ] (jdb/:__span-0-5) [ 1138 0 R /XYZ 60.307257 451.490814 0 ] (jdb/:__span-0-6) [ 1138 0 R /XYZ 60.307257 438.090462 0 ] (jdb/:__span-0-7) [ 1138 0 R /XYZ 60.307257 424.690110 0 ] (jdb/:__span-0-8) [ 1138 0 R /XYZ 60.307257 411.289758 0 ] (jdb/:__span-0-9) [ 1138 0 R /XYZ 60.307257 397.889406 0 ] (jdb/:__span-1-1) [ 1156 0 R /XYZ 60.307257 292.693722 0 ] (jdb/:__span-1-2) [ 1156 0 R /XYZ 60.307257 265.893018 0 ] (jdb/:__span-1-3) [ 1156 0 R /XYZ 60.307257 252.492666 0 ] (jdb/:__span-1-4) [ 1156 0 R /XYZ 60.307257 239.092314 0 ] (jdb/:__span-1-5) [ 1156 0 R /XYZ 60.307257 225.691962 0 ] (jdb/:__span-1-6) [ 1156 0 R /XYZ 60.307257 212.291610 0 ] (jdb/:__span-10-1) [ 1321 0 R /XYZ 60.307257 697.945722 0 ] (jdb/:__span-10-10) [ 1321 0 R /XYZ 60.307257 577.342554 0 ] (jdb/:__span-10-11) [ 1321 0 R /XYZ 60.307257 563.942202 0 ] (jdb/:__span-10-12) [ 1321 0 R /XYZ 60.307257 550.541850 0 ] (jdb/:__span-10-13) [ 1321 0 R /XYZ 60.307257 537.141498 0 ] (jdb/:__span-10-14) [ 1321 0 R /XYZ 60.307257 523.741146 0 ] (jdb/:__span-10-15) [ 1321 0 R /XYZ 60.307257 510.340794 0 ] (jdb/:__span-10-16) [ 1321 0 R /XYZ 60.307257 496.940442 0 ] (jdb/:__span-10-17) [ 1321 0 R /XYZ 60.307257 483.540090 0 ] (jdb/:__span-10-18) [ 1321 0 R /XYZ 60.307257 470.139738 0 ] (jdb/:__span-10-19) [ 1321 0 R /XYZ 60.307257 456.739386 0 ] (jdb/:__span-10-2) [ 1321 0 R /XYZ 60.307257 684.545370 0 ] (jdb/:__span-10-20) [ 1321 0 R /XYZ 60.307257 443.339034 0 ] (jdb/:__span-10-21) [ 1321 0 R /XYZ 60.307257 429.938682 0 ] (jdb/:__span-10-22) [ 1321 0 R /XYZ 60.307257 416.538330 0 ] (jdb/:__span-10-23) [ 1321 0 R /XYZ 60.307257 403.137978 0 ] (jdb/:__span-10-3) [ 1321 0 R /XYZ 60.307257 671.145018 0 ] (jdb/:__span-10-4) [ 1321 0 R /XYZ 60.307257 657.744666 0 ] (jdb/:__span-10-5) [ 1321 0 R /XYZ 60.307257 644.344314 0 ] (jdb/:__span-10-6) [ 1321 0 R /XYZ 60.307257 630.943962 0 ] (jdb/:__span-10-7) [ 1321 0 R /XYZ 60.307257 617.543610 0 ] (jdb/:__span-10-8) [ 1321 0 R /XYZ 60.307257 604.143258 0 ] (jdb/:__span-10-9) [ 1321 0 R /XYZ 60.307257 590.742906 0 ] (jdb/:__span-11-1) [ 1340 0 R /XYZ 60.307257 129.981873 0 ] (jdb/:__span-11-10) [ 1344 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-11-11) [ 1344 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-11-12) [ 1344 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-11-13) [ 1344 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-11-14) [ 1344 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-11-15) [ 1344 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-11-16) [ 1344 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-11-17) [ 1344 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-11-18) [ 1344 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-11-19) [ 1344 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-11-2) [ 1340 0 R /XYZ 60.307257 116.581521 0 ] (jdb/:__span-11-20) [ 1344 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-11-21) [ 1344 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-11-22) [ 1344 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-11-3) [ 1340 0 R /XYZ 60.307257 103.181169 0 ] (jdb/:__span-11-4) [ 1340 0 R /XYZ 60.307257 89.780817 0 ] (jdb/:__span-11-5) [ 1344 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-11-6) [ 1344 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-11-7) [ 1344 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-11-8) [ 1344 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-11-9) [ 1344 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-12-1) [ 1344 0 R /XYZ 60.307257 477.501486 0 ] (jdb/:__span-12-10) [ 1344 0 R /XYZ 60.307257 356.898318 0 ] (jdb/:__span-12-11) [ 1344 0 R /XYZ 60.307257 343.497966 0 ] (jdb/:__span-12-12) [ 1344 0 R /XYZ 60.307257 330.097614 0 ] (jdb/:__span-12-13) [ 1344 0 R /XYZ 60.307257 316.697262 0 ] (jdb/:__span-12-14) [ 1344 0 R /XYZ 60.307257 303.296910 0 ] (jdb/:__span-12-15) [ 1344 0 R /XYZ 60.307257 289.896558 0 ] (jdb/:__span-12-16) [ 1344 0 R /XYZ 60.307257 276.496206 0 ] (jdb/:__span-12-17) [ 1344 0 R /XYZ 60.307257 263.095854 0 ] (jdb/:__span-12-18) [ 1344 0 R /XYZ 60.307257 249.695502 0 ] (jdb/:__span-12-19) [ 1344 0 R /XYZ 60.307257 236.295150 0 ] (jdb/:__span-12-2) [ 1344 0 R /XYZ 60.307257 464.101134 0 ] (jdb/:__span-12-20) [ 1344 0 R /XYZ 60.307257 222.894798 0 ] (jdb/:__span-12-21) [ 1344 0 R /XYZ 60.307257 209.494446 0 ] (jdb/:__span-12-22) [ 1344 0 R /XYZ 60.307257 196.094094 0 ] (jdb/:__span-12-3) [ 1344 0 R /XYZ 60.307257 450.700782 0 ] (jdb/:__span-12-4) [ 1344 0 R /XYZ 60.307257 437.300430 0 ] (jdb/:__span-12-5) [ 1344 0 R /XYZ 60.307257 423.900078 0 ] (jdb/:__span-12-6) [ 1344 0 R /XYZ 60.307257 410.499726 0 ] (jdb/:__span-12-7) [ 1344 0 R /XYZ 60.307257 397.099374 0 ] (jdb/:__span-12-8) [ 1344 0 R /XYZ 60.307257 383.699022 0 ] (jdb/:__span-12-9) [ 1344 0 R /XYZ 60.307257 370.298670 0 ] (jdb/:__span-13-1) [ 1348 0 R /XYZ 60.307257 722.344122 0 ] (jdb/:__span-13-2) [ 1348 0 R /XYZ 60.307257 708.943770 0 ] (jdb/:__span-13-3) [ 1348 0 R /XYZ 60.307257 695.543418 0 ] (jdb/:__span-13-4) [ 1348 0 R /XYZ 60.307257 682.143066 0 ] (jdb/:__span-13-5) [ 1348 0 R /XYZ 60.307257 668.742714 0 ] (jdb/:__span-13-6) [ 1348 0 R /XYZ 60.307257 655.342362 0 ] (jdb/:__span-13-7) [ 1348 0 R /XYZ 60.307257 641.942010 0 ] (jdb/:__span-13-8) [ 1348 0 R /XYZ 60.307257 628.541658 0 ] (jdb/:__span-13-9) [ 1348 0 R /XYZ 60.307257 615.141306 0 ] (jdb/:__span-14-1) [ 1348 0 R /XYZ 60.307257 510.012354 0 ] (jdb/:__span-14-2) [ 1348 0 R /XYZ 60.307257 496.612002 0 ] (jdb/:__span-14-3) [ 1348 0 R /XYZ 60.307257 483.211650 0 ] (jdb/:__span-14-4) [ 1348 0 R /XYZ 60.307257 469.811298 0 ] (jdb/:__span-14-5) [ 1348 0 R /XYZ 60.307257 456.410946 0 ] (jdb/:__span-14-6) [ 1348 0 R /XYZ 60.307257 443.010594 0 ] (jdb/:__span-14-7) [ 1348 0 R /XYZ 60.307257 429.610242 0 ] (jdb/:__span-14-8) [ 1348 0 R /XYZ 60.307257 416.209890 0 ] (jdb/:__span-14-9) [ 1348 0 R /XYZ 60.307257 402.809538 0 ] (jdb/:__span-15-1) [ 1386 0 R /XYZ 60.307257 512.569722 0 ] (jdb/:__span-15-10) [ 1386 0 R /XYZ 60.307257 391.966554 0 ] (jdb/:__span-15-11) [ 1386 0 R /XYZ 60.307257 378.566202 0 ] (jdb/:__span-15-12) [ 1386 0 R /XYZ 60.307257 365.165850 0 ] (jdb/:__span-15-13) [ 1386 0 R /XYZ 60.307257 351.765498 0 ] (jdb/:__span-15-14) [ 1386 0 R /XYZ 60.307257 338.365146 0 ] (jdb/:__span-15-15) [ 1386 0 R /XYZ 60.307257 324.964794 0 ] (jdb/:__span-15-16) [ 1386 0 R /XYZ 60.307257 311.564442 0 ] (jdb/:__span-15-17) [ 1386 0 R /XYZ 60.307257 298.164090 0 ] (jdb/:__span-15-18) [ 1386 0 R /XYZ 60.307257 284.763738 0 ] (jdb/:__span-15-2) [ 1386 0 R /XYZ 60.307257 499.169370 0 ] (jdb/:__span-15-3) [ 1386 0 R /XYZ 60.307257 485.769018 0 ] (jdb/:__span-15-4) [ 1386 0 R /XYZ 60.307257 472.368666 0 ] (jdb/:__span-15-5) [ 1386 0 R /XYZ 60.307257 458.968314 0 ] (jdb/:__span-15-6) [ 1386 0 R /XYZ 60.307257 445.567962 0 ] (jdb/:__span-15-7) [ 1386 0 R /XYZ 60.307257 432.167610 0 ] (jdb/:__span-15-8) [ 1386 0 R /XYZ 60.307257 418.767258 0 ] (jdb/:__span-15-9) [ 1386 0 R /XYZ 60.307257 405.366906 0 ] (jdb/:__span-16-1) [ 1391 0 R /XYZ 60.307257 422.361822 0 ] (jdb/:__span-16-10) [ 1391 0 R /XYZ 60.307257 301.758654 0 ] (jdb/:__span-16-11) [ 1391 0 R /XYZ 60.307257 288.358302 0 ] (jdb/:__span-16-12) [ 1391 0 R /XYZ 60.307257 274.957950 0 ] (jdb/:__span-16-13) [ 1391 0 R /XYZ 60.307257 261.557598 0 ] (jdb/:__span-16-14) [ 1391 0 R /XYZ 60.307257 248.157246 0 ] (jdb/:__span-16-15) [ 1391 0 R /XYZ 60.307257 234.756894 0 ] (jdb/:__span-16-16) [ 1391 0 R /XYZ 60.307257 221.356542 0 ] (jdb/:__span-16-17) [ 1391 0 R /XYZ 60.307257 207.956190 0 ] (jdb/:__span-16-18) [ 1391 0 R /XYZ 60.307257 194.555838 0 ] (jdb/:__span-16-2) [ 1391 0 R /XYZ 60.307257 408.961470 0 ] (jdb/:__span-16-3) [ 1391 0 R /XYZ 60.307257 395.561118 0 ] (jdb/:__span-16-4) [ 1391 0 R /XYZ 60.307257 382.160766 0 ] (jdb/:__span-16-5) [ 1391 0 R /XYZ 60.307257 368.760414 0 ] (jdb/:__span-16-6) [ 1391 0 R /XYZ 60.307257 355.360062 0 ] (jdb/:__span-16-7) [ 1391 0 R /XYZ 60.307257 341.959710 0 ] (jdb/:__span-16-8) [ 1391 0 R /XYZ 60.307257 328.559358 0 ] (jdb/:__span-16-9) [ 1391 0 R /XYZ 60.307257 315.159006 0 ] (jdb/:__span-17-1) [ 1402 0 R /XYZ 60.307257 363.601105 0 ] (jdb/:__span-17-10) [ 1402 0 R /XYZ 60.307257 242.997937 0 ] (jdb/:__span-17-11) [ 1402 0 R /XYZ 60.307257 229.597585 0 ] (jdb/:__span-17-12) [ 1402 0 R /XYZ 60.307257 202.796881 0 ] (jdb/:__span-17-13) [ 1402 0 R /XYZ 60.307257 189.396529 0 ] (jdb/:__span-17-14) [ 1402 0 R /XYZ 60.307257 175.996177 0 ] (jdb/:__span-17-15) [ 1402 0 R /XYZ 60.307257 162.595825 0 ] (jdb/:__span-17-16) [ 1402 0 R /XYZ 60.307257 149.195473 0 ] (jdb/:__span-17-17) [ 1402 0 R /XYZ 60.307257 135.795121 0 ] (jdb/:__span-17-18) [ 1402 0 R /XYZ 60.307257 122.394769 0 ] (jdb/:__span-17-19) [ 1402 0 R /XYZ 60.307257 108.994417 0 ] (jdb/:__span-17-2) [ 1402 0 R /XYZ 60.307257 350.200753 0 ] (jdb/:__span-17-20) [ 1402 0 R /XYZ 60.307257 95.594065 0 ] (jdb/:__span-17-21) [ 1406 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-17-22) [ 1406 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-17-23) [ 1406 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-17-24) [ 1406 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-17-3) [ 1402 0 R /XYZ 60.307257 336.800401 0 ] (jdb/:__span-17-4) [ 1402 0 R /XYZ 60.307257 323.400049 0 ] (jdb/:__span-17-5) [ 1402 0 R /XYZ 60.307257 309.999697 0 ] (jdb/:__span-17-6) [ 1402 0 R /XYZ 60.307257 296.599345 0 ] (jdb/:__span-17-7) [ 1402 0 R /XYZ 60.307257 283.198993 0 ] (jdb/:__span-17-8) [ 1402 0 R /XYZ 60.307257 269.798641 0 ] (jdb/:__span-17-9) [ 1402 0 R /XYZ 60.307257 256.398289 0 ] (jdb/:__span-18-1) [ 1437 0 R /XYZ 60.307257 236.252922 0 ] (jdb/:__span-18-10) [ 1439 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-18-11) [ 1439 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-18-12) [ 1439 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-18-13) [ 1439 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-18-14) [ 1439 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-18-15) [ 1439 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-18-16) [ 1439 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-18-17) [ 1439 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-18-18) [ 1439 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-18-2) [ 1437 0 R /XYZ 60.307257 222.852570 0 ] (jdb/:__span-18-3) [ 1437 0 R /XYZ 60.307257 209.452218 0 ] (jdb/:__span-18-4) [ 1437 0 R /XYZ 60.307257 169.251162 0 ] (jdb/:__span-18-5) [ 1437 0 R /XYZ 60.307257 142.450458 0 ] (jdb/:__span-18-6) [ 1437 0 R /XYZ 60.307257 129.050106 0 ] (jdb/:__span-18-7) [ 1437 0 R /XYZ 60.307257 115.649754 0 ] (jdb/:__span-18-8) [ 1437 0 R /XYZ 60.307257 88.849050 0 ] (jdb/:__span-18-9) [ 1439 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-19-1) [ 1439 0 R /XYZ 60.307257 464.101134 0 ] (jdb/:__span-19-2) [ 1439 0 R /XYZ 60.307257 450.700782 0 ] (jdb/:__span-19-3) [ 1439 0 R /XYZ 60.307257 437.300430 0 ] (jdb/:__span-19-4) [ 1439 0 R /XYZ 60.307257 423.900078 0 ] (jdb/:__span-2-1) [ 1156 0 R /XYZ 60.307257 131.561058 0 ] (jdb/:__span-2-2) [ 1156 0 R /XYZ 60.307257 118.160706 0 ] (jdb/:__span-2-3) [ 1156 0 R /XYZ 60.307257 104.760354 0 ] (jdb/:__span-2-4) [ 1156 0 R /XYZ 60.307257 91.360002 0 ] (jdb/:__span-2-5) [ 1166 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-2-6) [ 1166 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-2-7) [ 1166 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-2-8) [ 1166 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-20-1) [ 1439 0 R /XYZ 60.307257 333.785526 0 ] (jdb/:__span-20-2) [ 1439 0 R /XYZ 60.307257 320.385174 0 ] (jdb/:__span-20-3) [ 1439 0 R /XYZ 60.307257 306.984822 0 ] (jdb/:__span-20-4) [ 1439 0 R /XYZ 60.307257 293.584470 0 ] (jdb/:__span-21-1) [ 1439 0 R /XYZ 60.307257 227.868318 0 ] (jdb/:__span-21-2) [ 1439 0 R /XYZ 60.307257 214.467966 0 ] (jdb/:__span-21-3) [ 1439 0 R /XYZ 60.307257 201.067614 0 ] (jdb/:__span-21-4) [ 1439 0 R /XYZ 60.307257 187.667262 0 ] (jdb/:__span-21-5) [ 1439 0 R /XYZ 60.307257 174.266910 0 ] (jdb/:__span-21-6) [ 1439 0 R /XYZ 60.307257 160.866558 0 ] (jdb/:__span-21-7) [ 1439 0 R /XYZ 60.307257 134.065854 0 ] (jdb/:__span-21-8) [ 1439 0 R /XYZ 60.307257 120.665502 0 ] (jdb/:__span-22-1) [ 1441 0 R /XYZ 60.307257 697.945722 0 ] (jdb/:__span-22-2) [ 1441 0 R /XYZ 60.307257 684.545370 0 ] (jdb/:__span-22-3) [ 1441 0 R /XYZ 60.307257 671.145018 0 ] (jdb/:__span-22-4) [ 1441 0 R /XYZ 60.307257 644.344314 0 ] (jdb/:__span-22-5) [ 1441 0 R /XYZ 60.307257 630.943962 0 ] (jdb/:__span-23-1) [ 1458 0 R /XYZ 60.307257 422.056122 0 ] (jdb/:__span-23-2) [ 1458 0 R /XYZ 60.307257 381.855066 0 ] (jdb/:__span-23-3) [ 1458 0 R /XYZ 60.307257 368.454714 0 ] (jdb/:__span-23-4) [ 1458 0 R /XYZ 60.307257 355.054362 0 ] (jdb/:__span-23-5) [ 1458 0 R /XYZ 60.307257 341.654010 0 ] (jdb/:__span-24-1) [ 1463 0 R /XYZ 60.307257 520.588122 0 ] (jdb/:__span-24-10) [ 1463 0 R /XYZ 60.307257 373.184250 0 ] (jdb/:__span-24-2) [ 1463 0 R /XYZ 60.307257 480.387066 0 ] (jdb/:__span-24-3) [ 1463 0 R /XYZ 60.307257 466.986714 0 ] (jdb/:__span-24-4) [ 1463 0 R /XYZ 60.307257 453.586362 0 ] (jdb/:__span-24-5) [ 1463 0 R /XYZ 60.307257 440.186010 0 ] (jdb/:__span-24-6) [ 1463 0 R /XYZ 60.307257 426.785658 0 ] (jdb/:__span-24-7) [ 1463 0 R /XYZ 60.307257 413.385306 0 ] (jdb/:__span-24-8) [ 1463 0 R /XYZ 60.307257 399.984954 0 ] (jdb/:__span-24-9) [ 1463 0 R /XYZ 60.307257 386.584602 0 ] (jdb/:__span-25-1) [ 1465 0 R /XYZ 60.307257 342.292122 0 ] (jdb/:__span-25-10) [ 1465 0 R /XYZ 60.307257 221.688954 0 ] (jdb/:__span-25-11) [ 1465 0 R /XYZ 60.307257 208.288602 0 ] (jdb/:__span-25-12) [ 1465 0 R /XYZ 60.307257 194.888250 0 ] (jdb/:__span-25-13) [ 1465 0 R /XYZ 60.307257 181.487898 0 ] (jdb/:__span-25-14) [ 1465 0 R /XYZ 60.307257 168.087546 0 ] (jdb/:__span-25-15) [ 1465 0 R /XYZ 60.307257 154.687194 0 ] (jdb/:__span-25-16) [ 1465 0 R /XYZ 60.307257 141.286842 0 ] (jdb/:__span-25-17) [ 1465 0 R /XYZ 60.307257 127.886490 0 ] (jdb/:__span-25-18) [ 1465 0 R /XYZ 60.307257 114.486138 0 ] (jdb/:__span-25-19) [ 1465 0 R /XYZ 60.307257 101.085786 0 ] (jdb/:__span-25-2) [ 1465 0 R /XYZ 60.307257 328.891770 0 ] (jdb/:__span-25-20) [ 1465 0 R /XYZ 60.307257 87.685434 0 ] (jdb/:__span-25-21) [ 1467 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-25-22) [ 1467 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-25-23) [ 1467 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-25-24) [ 1467 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-25-25) [ 1467 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-25-26) [ 1467 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-25-27) [ 1467 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-25-28) [ 1467 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-25-29) [ 1467 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-25-3) [ 1465 0 R /XYZ 60.307257 315.491418 0 ] (jdb/:__span-25-30) [ 1467 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-25-31) [ 1467 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-25-32) [ 1467 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-25-33) [ 1467 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-25-34) [ 1467 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-25-35) [ 1467 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-25-36) [ 1467 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-25-37) [ 1467 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-25-38) [ 1467 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-25-39) [ 1467 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-25-4) [ 1465 0 R /XYZ 60.307257 302.091066 0 ] (jdb/:__span-25-40) [ 1467 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-25-41) [ 1467 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-25-42) [ 1467 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-25-43) [ 1467 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-25-44) [ 1467 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-25-45) [ 1467 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-25-46) [ 1467 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-25-47) [ 1467 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-25-48) [ 1467 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-25-49) [ 1467 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-25-5) [ 1465 0 R /XYZ 60.307257 288.690714 0 ] (jdb/:__span-25-50) [ 1467 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-25-51) [ 1467 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-25-52) [ 1467 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-25-53) [ 1467 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-25-54) [ 1467 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-25-55) [ 1467 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-25-56) [ 1467 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-25-57) [ 1467 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-25-58) [ 1467 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-25-59) [ 1467 0 R /XYZ 60.307257 235.009542 0 ] (jdb/:__span-25-6) [ 1465 0 R /XYZ 60.307257 275.290362 0 ] (jdb/:__span-25-60) [ 1467 0 R /XYZ 60.307257 221.609190 0 ] (jdb/:__span-25-61) [ 1467 0 R /XYZ 60.307257 208.208838 0 ] (jdb/:__span-25-62) [ 1467 0 R /XYZ 60.307257 194.808486 0 ] (jdb/:__span-25-63) [ 1467 0 R /XYZ 60.307257 181.408134 0 ] (jdb/:__span-25-64) [ 1467 0 R /XYZ 60.307257 168.007782 0 ] (jdb/:__span-25-65) [ 1467 0 R /XYZ 60.307257 154.607430 0 ] (jdb/:__span-25-66) [ 1467 0 R /XYZ 60.307257 141.207078 0 ] (jdb/:__span-25-67) [ 1467 0 R /XYZ 60.307257 127.806726 0 ] (jdb/:__span-25-68) [ 1467 0 R /XYZ 60.307257 114.406374 0 ] (jdb/:__span-25-7) [ 1465 0 R /XYZ 60.307257 261.890010 0 ] (jdb/:__span-25-8) [ 1465 0 R /XYZ 60.307257 248.489658 0 ] (jdb/:__span-25-9) [ 1465 0 R /XYZ 60.307257 235.089306 0 ] (jdb/:__span-26-1) [ 1469 0 R /XYZ 60.307257 412.672122 0 ] (jdb/:__span-26-2) [ 1469 0 R /XYZ 60.307257 385.871418 0 ] (jdb/:__span-26-3) [ 1469 0 R /XYZ 60.307257 372.471066 0 ] (jdb/:__span-26-4) [ 1469 0 R /XYZ 60.307257 345.670362 0 ] (jdb/:__span-26-5) [ 1469 0 R /XYZ 60.307257 332.270010 0 ] (jdb/:__span-26-6) [ 1469 0 R /XYZ 60.307257 305.469306 0 ] (jdb/:__span-27-1) [ 1509 0 R /XYZ 60.307257 292.862622 0 ] (jdb/:__span-27-10) [ 1509 0 R /XYZ 60.307257 158.859102 0 ] (jdb/:__span-27-2) [ 1509 0 R /XYZ 60.307257 279.462270 0 ] (jdb/:__span-27-3) [ 1509 0 R /XYZ 60.307257 266.061918 0 ] (jdb/:__span-27-4) [ 1509 0 R /XYZ 60.307257 252.661566 0 ] (jdb/:__span-27-5) [ 1509 0 R /XYZ 60.307257 239.261214 0 ] (jdb/:__span-27-6) [ 1509 0 R /XYZ 60.307257 225.860862 0 ] (jdb/:__span-27-7) [ 1509 0 R /XYZ 60.307257 212.460510 0 ] (jdb/:__span-27-8) [ 1509 0 R /XYZ 60.307257 185.659806 0 ] (jdb/:__span-27-9) [ 1509 0 R /XYZ 60.307257 172.259454 0 ] (jdb/:__span-28-1) [ 1513 0 R /XYZ 60.307257 722.344122 0 ] (jdb/:__span-28-10) [ 1513 0 R /XYZ 60.307257 548.139546 0 ] (jdb/:__span-28-11) [ 1513 0 R /XYZ 60.307257 534.739194 0 ] (jdb/:__span-28-12) [ 1513 0 R /XYZ 60.307257 521.338842 0 ] (jdb/:__span-28-13) [ 1513 0 R /XYZ 60.307257 507.938490 0 ] (jdb/:__span-28-14) [ 1513 0 R /XYZ 60.307257 467.737434 0 ] (jdb/:__span-28-15) [ 1513 0 R /XYZ 60.307257 454.337082 0 ] (jdb/:__span-28-16) [ 1513 0 R /XYZ 60.307257 440.936730 0 ] (jdb/:__span-28-17) [ 1513 0 R /XYZ 60.307257 427.536378 0 ] (jdb/:__span-28-2) [ 1513 0 R /XYZ 60.307257 708.943770 0 ] (jdb/:__span-28-3) [ 1513 0 R /XYZ 60.307257 668.742714 0 ] (jdb/:__span-28-4) [ 1513 0 R /XYZ 60.307257 655.342362 0 ] (jdb/:__span-28-5) [ 1513 0 R /XYZ 60.307257 641.942010 0 ] (jdb/:__span-28-6) [ 1513 0 R /XYZ 60.307257 628.541658 0 ] (jdb/:__span-28-7) [ 1513 0 R /XYZ 60.307257 601.740954 0 ] (jdb/:__span-28-8) [ 1513 0 R /XYZ 60.307257 588.340602 0 ] (jdb/:__span-28-9) [ 1513 0 R /XYZ 60.307257 574.940250 0 ] (jdb/:__span-29-1) [ 1513 0 R /XYZ 60.307257 361.820226 0 ] (jdb/:__span-29-2) [ 1513 0 R /XYZ 60.307257 348.419874 0 ] (jdb/:__span-29-3) [ 1513 0 R /XYZ 60.307257 335.019522 0 ] (jdb/:__span-29-4) [ 1513 0 R /XYZ 60.307257 321.619170 0 ] (jdb/:__span-29-5) [ 1513 0 R /XYZ 60.307257 308.218818 0 ] (jdb/:__span-3-1) [ 1166 0 R /XYZ 60.307257 665.106414 0 ] (jdb/:__span-3-10) [ 1166 0 R /XYZ 60.307257 544.503246 0 ] (jdb/:__span-3-11) [ 1166 0 R /XYZ 60.307257 531.102894 0 ] (jdb/:__span-3-12) [ 1166 0 R /XYZ 60.307257 517.702542 0 ] (jdb/:__span-3-13) [ 1166 0 R /XYZ 60.307257 504.302190 0 ] (jdb/:__span-3-14) [ 1166 0 R /XYZ 60.307257 477.501486 0 ] (jdb/:__span-3-15) [ 1166 0 R /XYZ 60.307257 464.101134 0 ] (jdb/:__span-3-16) [ 1166 0 R /XYZ 60.307257 437.300430 0 ] (jdb/:__span-3-17) [ 1166 0 R /XYZ 60.307257 423.900078 0 ] (jdb/:__span-3-18) [ 1166 0 R /XYZ 60.307257 410.499726 0 ] (jdb/:__span-3-19) [ 1166 0 R /XYZ 60.307257 397.099374 0 ] (jdb/:__span-3-2) [ 1166 0 R /XYZ 60.307257 651.706062 0 ] (jdb/:__span-3-20) [ 1166 0 R /XYZ 60.307257 383.699022 0 ] (jdb/:__span-3-21) [ 1166 0 R /XYZ 60.307257 370.298670 0 ] (jdb/:__span-3-22) [ 1166 0 R /XYZ 60.307257 356.898318 0 ] (jdb/:__span-3-3) [ 1166 0 R /XYZ 60.307257 638.305710 0 ] (jdb/:__span-3-4) [ 1166 0 R /XYZ 60.307257 624.905358 0 ] (jdb/:__span-3-5) [ 1166 0 R /XYZ 60.307257 611.505006 0 ] (jdb/:__span-3-6) [ 1166 0 R /XYZ 60.307257 598.104654 0 ] (jdb/:__span-3-7) [ 1166 0 R /XYZ 60.307257 584.704302 0 ] (jdb/:__span-3-8) [ 1166 0 R /XYZ 60.307257 571.303950 0 ] (jdb/:__span-3-9) [ 1166 0 R /XYZ 60.307257 557.903598 0 ] (jdb/:__span-30-1) [ 1517 0 R /XYZ 60.307257 763.633722 0 ] (jdb/:__span-30-2) [ 1517 0 R /XYZ 60.307257 750.233370 0 ] (jdb/:__span-31-1) [ 1582 0 R /XYZ 60.307257 525.280122 0 ] (jdb/:__span-31-10) [ 1582 0 R /XYZ 60.307257 404.676954 0 ] (jdb/:__span-31-11) [ 1582 0 R /XYZ 60.307257 391.276602 0 ] (jdb/:__span-31-12) [ 1582 0 R /XYZ 60.307257 377.876250 0 ] (jdb/:__span-31-13) [ 1582 0 R /XYZ 60.307257 364.475898 0 ] (jdb/:__span-31-14) [ 1582 0 R /XYZ 60.307257 351.075546 0 ] (jdb/:__span-31-15) [ 1582 0 R /XYZ 60.307257 337.675194 0 ] (jdb/:__span-31-16) [ 1582 0 R /XYZ 60.307257 324.274842 0 ] (jdb/:__span-31-17) [ 1582 0 R /XYZ 60.307257 310.874490 0 ] (jdb/:__span-31-18) [ 1582 0 R /XYZ 60.307257 297.474138 0 ] (jdb/:__span-31-19) [ 1582 0 R /XYZ 60.307257 284.073786 0 ] (jdb/:__span-31-2) [ 1582 0 R /XYZ 60.307257 511.879770 0 ] (jdb/:__span-31-20) [ 1582 0 R /XYZ 60.307257 270.673434 0 ] (jdb/:__span-31-21) [ 1582 0 R /XYZ 60.307257 257.273082 0 ] (jdb/:__span-31-22) [ 1582 0 R /XYZ 60.307257 243.872730 0 ] (jdb/:__span-31-23) [ 1582 0 R /XYZ 60.307257 230.472378 0 ] (jdb/:__span-31-24) [ 1582 0 R /XYZ 60.307257 217.072026 0 ] (jdb/:__span-31-25) [ 1582 0 R /XYZ 60.307257 203.671674 0 ] (jdb/:__span-31-26) [ 1582 0 R /XYZ 60.307257 190.271322 0 ] (jdb/:__span-31-27) [ 1582 0 R /XYZ 60.307257 176.870970 0 ] (jdb/:__span-31-28) [ 1582 0 R /XYZ 60.307257 163.470618 0 ] (jdb/:__span-31-29) [ 1582 0 R /XYZ 60.307257 150.070266 0 ] (jdb/:__span-31-3) [ 1582 0 R /XYZ 60.307257 498.479418 0 ] (jdb/:__span-31-30) [ 1582 0 R /XYZ 60.307257 136.669914 0 ] (jdb/:__span-31-31) [ 1582 0 R /XYZ 60.307257 123.269562 0 ] (jdb/:__span-31-32) [ 1582 0 R /XYZ 60.307257 109.869210 0 ] (jdb/:__span-31-33) [ 1582 0 R /XYZ 60.307257 96.468858 0 ] (jdb/:__span-31-34) [ 1584 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-31-35) [ 1584 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-31-36) [ 1584 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-31-37) [ 1584 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-31-38) [ 1584 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-31-39) [ 1584 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-31-4) [ 1582 0 R /XYZ 60.307257 485.079066 0 ] (jdb/:__span-31-40) [ 1584 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-31-41) [ 1584 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-31-42) [ 1584 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-31-43) [ 1584 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-31-44) [ 1584 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-31-45) [ 1584 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-31-46) [ 1584 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-31-47) [ 1584 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-31-48) [ 1584 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-31-49) [ 1584 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-31-5) [ 1582 0 R /XYZ 60.307257 471.678714 0 ] (jdb/:__span-31-50) [ 1584 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-31-6) [ 1582 0 R /XYZ 60.307257 458.278362 0 ] (jdb/:__span-31-7) [ 1582 0 R /XYZ 60.307257 444.878010 0 ] (jdb/:__span-31-8) [ 1582 0 R /XYZ 60.307257 431.477658 0 ] (jdb/:__span-31-9) [ 1582 0 R /XYZ 60.307257 418.077306 0 ] (jdb/:__span-32-1) [ 1603 0 R /XYZ 60.307257 737.358522 0 ] (jdb/:__span-32-10) [ 1603 0 R /XYZ 60.307257 603.355002 0 ] (jdb/:__span-32-11) [ 1603 0 R /XYZ 60.307257 589.954650 0 ] (jdb/:__span-32-12) [ 1603 0 R /XYZ 60.307257 576.554298 0 ] (jdb/:__span-32-13) [ 1603 0 R /XYZ 60.307257 563.153946 0 ] (jdb/:__span-32-14) [ 1603 0 R /XYZ 60.307257 549.753594 0 ] (jdb/:__span-32-15) [ 1603 0 R /XYZ 60.307257 536.353242 0 ] (jdb/:__span-32-16) [ 1603 0 R /XYZ 60.307257 522.952890 0 ] (jdb/:__span-32-17) [ 1603 0 R /XYZ 60.307257 509.552538 0 ] (jdb/:__span-32-18) [ 1603 0 R /XYZ 60.307257 482.751834 0 ] (jdb/:__span-32-19) [ 1603 0 R /XYZ 60.307257 455.951130 0 ] (jdb/:__span-32-2) [ 1603 0 R /XYZ 60.307257 723.958170 0 ] (jdb/:__span-32-20) [ 1603 0 R /XYZ 60.307257 442.550778 0 ] (jdb/:__span-32-21) [ 1603 0 R /XYZ 60.307257 429.150426 0 ] (jdb/:__span-32-22) [ 1603 0 R /XYZ 60.307257 415.750074 0 ] (jdb/:__span-32-23) [ 1603 0 R /XYZ 60.307257 402.349722 0 ] (jdb/:__span-32-24) [ 1603 0 R /XYZ 60.307257 388.949370 0 ] (jdb/:__span-32-25) [ 1603 0 R /XYZ 60.307257 362.148666 0 ] (jdb/:__span-32-26) [ 1603 0 R /XYZ 60.307257 335.347962 0 ] (jdb/:__span-32-27) [ 1603 0 R /XYZ 60.307257 321.947610 0 ] (jdb/:__span-32-28) [ 1603 0 R /XYZ 60.307257 308.547258 0 ] (jdb/:__span-32-29) [ 1603 0 R /XYZ 60.307257 295.146906 0 ] (jdb/:__span-32-3) [ 1603 0 R /XYZ 60.307257 710.557818 0 ] (jdb/:__span-32-30) [ 1603 0 R /XYZ 60.307257 281.746554 0 ] (jdb/:__span-32-31) [ 1603 0 R /XYZ 60.307257 268.346202 0 ] (jdb/:__span-32-32) [ 1603 0 R /XYZ 60.307257 254.945850 0 ] (jdb/:__span-32-33) [ 1603 0 R /XYZ 60.307257 241.545498 0 ] (jdb/:__span-32-34) [ 1603 0 R /XYZ 60.307257 214.744794 0 ] (jdb/:__span-32-35) [ 1603 0 R /XYZ 60.307257 201.344442 0 ] (jdb/:__span-32-36) [ 1603 0 R /XYZ 60.307257 174.543738 0 ] (jdb/:__span-32-37) [ 1603 0 R /XYZ 60.307257 147.743034 0 ] (jdb/:__span-32-38) [ 1603 0 R /XYZ 60.307257 120.942330 0 ] (jdb/:__span-32-39) [ 1603 0 R /XYZ 60.307257 107.541978 0 ] (jdb/:__span-32-4) [ 1603 0 R /XYZ 60.307257 697.157466 0 ] (jdb/:__span-32-40) [ 1603 0 R /XYZ 60.307257 94.141626 0 ] (jdb/:__span-32-41) [ 1605 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-32-42) [ 1605 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-32-43) [ 1605 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-32-44) [ 1605 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-32-45) [ 1605 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-32-46) [ 1605 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-32-47) [ 1605 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-32-48) [ 1605 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-32-49) [ 1605 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-32-5) [ 1603 0 R /XYZ 60.307257 670.356762 0 ] (jdb/:__span-32-50) [ 1605 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-32-51) [ 1605 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-32-52) [ 1605 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-32-53) [ 1605 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-32-54) [ 1605 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-32-55) [ 1605 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-32-56) [ 1605 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-32-57) [ 1605 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-32-58) [ 1605 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-32-59) [ 1605 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-32-6) [ 1603 0 R /XYZ 60.307257 656.956410 0 ] (jdb/:__span-32-60) [ 1605 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-32-61) [ 1605 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-32-62) [ 1605 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-32-63) [ 1605 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-32-64) [ 1605 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-32-65) [ 1605 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-32-66) [ 1605 0 R /XYZ 60.307257 355.612710 0 ] (jdb/:__span-32-67) [ 1605 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-32-68) [ 1605 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-32-69) [ 1605 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-32-7) [ 1603 0 R /XYZ 60.307257 643.556058 0 ] (jdb/:__span-32-70) [ 1605 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-32-71) [ 1605 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-32-72) [ 1605 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-32-73) [ 1605 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-32-74) [ 1605 0 R /XYZ 60.307257 235.009542 0 ] (jdb/:__span-32-8) [ 1603 0 R /XYZ 60.307257 630.155706 0 ] (jdb/:__span-32-9) [ 1603 0 R /XYZ 60.307257 616.755354 0 ] (jdb/:__span-33-1) [ 1605 0 R /XYZ 60.307257 195.568590 0 ] (jdb/:__span-33-2) [ 1605 0 R /XYZ 60.307257 182.168238 0 ] (jdb/:__span-34-1) [ 1607 0 R /XYZ 60.307257 682.931322 0 ] (jdb/:__span-34-10) [ 1607 0 R /XYZ 60.307257 535.527450 0 ] (jdb/:__span-34-11) [ 1607 0 R /XYZ 60.307257 522.127098 0 ] (jdb/:__span-34-12) [ 1607 0 R /XYZ 60.307257 508.726746 0 ] (jdb/:__span-34-13) [ 1607 0 R /XYZ 60.307257 495.326394 0 ] (jdb/:__span-34-14) [ 1607 0 R /XYZ 60.307257 468.525690 0 ] (jdb/:__span-34-15) [ 1607 0 R /XYZ 60.307257 455.125338 0 ] (jdb/:__span-34-16) [ 1607 0 R /XYZ 60.307257 428.324634 0 ] (jdb/:__span-34-17) [ 1607 0 R /XYZ 60.307257 414.924282 0 ] (jdb/:__span-34-18) [ 1607 0 R /XYZ 60.307257 388.123578 0 ] (jdb/:__span-34-19) [ 1607 0 R /XYZ 60.307257 374.723226 0 ] (jdb/:__span-34-2) [ 1607 0 R /XYZ 60.307257 669.530970 0 ] (jdb/:__span-34-20) [ 1607 0 R /XYZ 60.307257 361.322874 0 ] (jdb/:__span-34-21) [ 1607 0 R /XYZ 60.307257 347.922522 0 ] (jdb/:__span-34-22) [ 1607 0 R /XYZ 60.307257 334.522170 0 ] (jdb/:__span-34-23) [ 1607 0 R /XYZ 60.307257 307.721466 0 ] (jdb/:__span-34-24) [ 1607 0 R /XYZ 60.307257 294.321114 0 ] (jdb/:__span-34-25) [ 1607 0 R /XYZ 60.307257 267.520410 0 ] (jdb/:__span-34-26) [ 1607 0 R /XYZ 60.307257 254.120058 0 ] (jdb/:__span-34-27) [ 1607 0 R /XYZ 60.307257 227.319354 0 ] (jdb/:__span-34-28) [ 1607 0 R /XYZ 60.307257 213.919002 0 ] (jdb/:__span-34-29) [ 1607 0 R /XYZ 60.307257 200.518650 0 ] (jdb/:__span-34-3) [ 1607 0 R /XYZ 60.307257 656.130618 0 ] (jdb/:__span-34-30) [ 1607 0 R /XYZ 60.307257 173.717946 0 ] (jdb/:__span-34-31) [ 1607 0 R /XYZ 60.307257 160.317594 0 ] (jdb/:__span-34-32) [ 1607 0 R /XYZ 60.307257 146.917242 0 ] (jdb/:__span-34-4) [ 1607 0 R /XYZ 60.307257 642.730266 0 ] (jdb/:__span-34-5) [ 1607 0 R /XYZ 60.307257 629.329914 0 ] (jdb/:__span-34-6) [ 1607 0 R /XYZ 60.307257 615.929562 0 ] (jdb/:__span-34-7) [ 1607 0 R /XYZ 60.307257 602.529210 0 ] (jdb/:__span-34-8) [ 1607 0 R /XYZ 60.307257 575.728506 0 ] (jdb/:__span-34-9) [ 1607 0 R /XYZ 60.307257 562.328154 0 ] (jdb/:__span-35-1) [ 1609 0 R /XYZ 60.307257 519.649722 0 ] (jdb/:__span-35-10) [ 1609 0 R /XYZ 60.307257 385.646202 0 ] (jdb/:__span-35-11) [ 1609 0 R /XYZ 60.307257 372.245850 0 ] (jdb/:__span-35-12) [ 1609 0 R /XYZ 60.307257 358.845498 0 ] (jdb/:__span-35-13) [ 1609 0 R /XYZ 60.307257 332.044794 0 ] (jdb/:__span-35-14) [ 1609 0 R /XYZ 60.307257 318.644442 0 ] (jdb/:__span-35-15) [ 1609 0 R /XYZ 60.307257 305.244090 0 ] (jdb/:__span-35-16) [ 1609 0 R /XYZ 60.307257 291.843738 0 ] (jdb/:__span-35-17) [ 1609 0 R /XYZ 60.307257 278.443386 0 ] (jdb/:__span-35-18) [ 1609 0 R /XYZ 60.307257 265.043034 0 ] (jdb/:__span-35-19) [ 1609 0 R /XYZ 60.307257 251.642682 0 ] (jdb/:__span-35-2) [ 1609 0 R /XYZ 60.307257 506.249370 0 ] (jdb/:__span-35-20) [ 1609 0 R /XYZ 60.307257 238.242330 0 ] (jdb/:__span-35-21) [ 1609 0 R /XYZ 60.307257 224.841978 0 ] (jdb/:__span-35-22) [ 1609 0 R /XYZ 60.307257 198.041274 0 ] (jdb/:__span-35-23) [ 1609 0 R /XYZ 60.307257 171.240570 0 ] (jdb/:__span-35-24) [ 1609 0 R /XYZ 60.307257 157.840218 0 ] (jdb/:__span-35-25) [ 1609 0 R /XYZ 60.307257 144.439866 0 ] (jdb/:__span-35-26) [ 1609 0 R /XYZ 60.307257 131.039514 0 ] (jdb/:__span-35-27) [ 1609 0 R /XYZ 60.307257 104.238810 0 ] (jdb/:__span-35-28) [ 1609 0 R /XYZ 60.307257 90.838458 0 ] (jdb/:__span-35-29) [ 1611 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-35-3) [ 1609 0 R /XYZ 60.307257 492.849018 0 ] (jdb/:__span-35-30) [ 1611 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-35-31) [ 1611 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-35-32) [ 1611 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-35-4) [ 1609 0 R /XYZ 60.307257 479.448666 0 ] (jdb/:__span-35-5) [ 1609 0 R /XYZ 60.307257 452.647962 0 ] (jdb/:__span-35-6) [ 1609 0 R /XYZ 60.307257 439.247610 0 ] (jdb/:__span-35-7) [ 1609 0 R /XYZ 60.307257 425.847258 0 ] (jdb/:__span-35-8) [ 1609 0 R /XYZ 60.307257 412.446906 0 ] (jdb/:__span-35-9) [ 1609 0 R /XYZ 60.307257 399.046554 0 ] (jdb/:__span-36-1) [ 1616 0 R /XYZ 60.307257 619.120122 0 ] (jdb/:__span-36-10) [ 1616 0 R /XYZ 60.307257 498.516954 0 ] (jdb/:__span-36-11) [ 1616 0 R /XYZ 60.307257 485.116602 0 ] (jdb/:__span-36-12) [ 1616 0 R /XYZ 60.307257 471.716250 0 ] (jdb/:__span-36-13) [ 1616 0 R /XYZ 60.307257 458.315898 0 ] (jdb/:__span-36-14) [ 1616 0 R /XYZ 60.307257 444.915546 0 ] (jdb/:__span-36-15) [ 1616 0 R /XYZ 60.307257 431.515194 0 ] (jdb/:__span-36-16) [ 1616 0 R /XYZ 60.307257 418.114842 0 ] (jdb/:__span-36-17) [ 1616 0 R /XYZ 60.307257 404.714490 0 ] (jdb/:__span-36-18) [ 1616 0 R /XYZ 60.307257 391.314138 0 ] (jdb/:__span-36-19) [ 1616 0 R /XYZ 60.307257 377.913786 0 ] (jdb/:__span-36-2) [ 1616 0 R /XYZ 60.307257 605.719770 0 ] (jdb/:__span-36-20) [ 1616 0 R /XYZ 60.307257 364.513434 0 ] (jdb/:__span-36-21) [ 1616 0 R /XYZ 60.307257 351.113082 0 ] (jdb/:__span-36-22) [ 1616 0 R /XYZ 60.307257 337.712730 0 ] (jdb/:__span-36-23) [ 1616 0 R /XYZ 60.307257 324.312378 0 ] (jdb/:__span-36-24) [ 1616 0 R /XYZ 60.307257 310.912026 0 ] (jdb/:__span-36-25) [ 1616 0 R /XYZ 60.307257 297.511674 0 ] (jdb/:__span-36-26) [ 1616 0 R /XYZ 60.307257 284.111322 0 ] (jdb/:__span-36-27) [ 1616 0 R /XYZ 60.307257 270.710970 0 ] (jdb/:__span-36-28) [ 1616 0 R /XYZ 60.307257 257.310618 0 ] (jdb/:__span-36-29) [ 1616 0 R /XYZ 60.307257 243.910266 0 ] (jdb/:__span-36-3) [ 1616 0 R /XYZ 60.307257 592.319418 0 ] (jdb/:__span-36-30) [ 1616 0 R /XYZ 60.307257 230.509914 0 ] (jdb/:__span-36-31) [ 1616 0 R /XYZ 60.307257 217.109562 0 ] (jdb/:__span-36-32) [ 1616 0 R /XYZ 60.307257 203.709210 0 ] (jdb/:__span-36-33) [ 1616 0 R /XYZ 60.307257 190.308858 0 ] (jdb/:__span-36-34) [ 1616 0 R /XYZ 60.307257 176.908506 0 ] (jdb/:__span-36-35) [ 1616 0 R /XYZ 60.307257 163.508154 0 ] (jdb/:__span-36-36) [ 1616 0 R /XYZ 60.307257 150.107802 0 ] (jdb/:__span-36-37) [ 1616 0 R /XYZ 60.307257 136.707450 0 ] (jdb/:__span-36-38) [ 1616 0 R /XYZ 60.307257 123.307098 0 ] (jdb/:__span-36-39) [ 1616 0 R /XYZ 60.307257 109.906746 0 ] (jdb/:__span-36-4) [ 1616 0 R /XYZ 60.307257 578.919066 0 ] (jdb/:__span-36-40) [ 1616 0 R /XYZ 60.307257 96.506394 0 ] (jdb/:__span-36-41) [ 1618 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-36-42) [ 1618 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-36-43) [ 1618 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-36-44) [ 1618 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-36-45) [ 1618 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-36-46) [ 1618 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-36-47) [ 1618 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-36-48) [ 1618 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-36-49) [ 1618 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-36-5) [ 1616 0 R /XYZ 60.307257 565.518714 0 ] (jdb/:__span-36-50) [ 1618 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-36-51) [ 1618 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-36-52) [ 1618 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-36-53) [ 1618 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-36-54) [ 1618 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-36-55) [ 1618 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-36-56) [ 1618 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-36-57) [ 1618 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-36-58) [ 1618 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-36-59) [ 1618 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-36-6) [ 1616 0 R /XYZ 60.307257 552.118362 0 ] (jdb/:__span-36-60) [ 1618 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-36-61) [ 1618 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-36-62) [ 1618 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-36-63) [ 1618 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-36-64) [ 1618 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-36-65) [ 1618 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-36-66) [ 1618 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-36-67) [ 1618 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-36-68) [ 1618 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-36-69) [ 1618 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-36-7) [ 1616 0 R /XYZ 60.307257 538.718010 0 ] (jdb/:__span-36-70) [ 1618 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-36-71) [ 1618 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-36-72) [ 1618 0 R /XYZ 60.307257 355.612710 0 ] (jdb/:__span-36-73) [ 1618 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-36-74) [ 1618 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-36-75) [ 1618 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-36-76) [ 1618 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-36-77) [ 1618 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-36-78) [ 1618 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-36-79) [ 1618 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-36-8) [ 1616 0 R /XYZ 60.307257 525.317658 0 ] (jdb/:__span-36-80) [ 1618 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-36-81) [ 1618 0 R /XYZ 60.307257 235.009542 0 ] (jdb/:__span-36-82) [ 1618 0 R /XYZ 60.307257 221.609190 0 ] (jdb/:__span-36-83) [ 1618 0 R /XYZ 60.307257 208.208838 0 ] (jdb/:__span-36-84) [ 1618 0 R /XYZ 60.307257 194.808486 0 ] (jdb/:__span-36-85) [ 1618 0 R /XYZ 60.307257 181.408134 0 ] (jdb/:__span-36-86) [ 1618 0 R /XYZ 60.307257 168.007782 0 ] (jdb/:__span-36-87) [ 1618 0 R /XYZ 60.307257 154.607430 0 ] (jdb/:__span-36-88) [ 1618 0 R /XYZ 60.307257 141.207078 0 ] (jdb/:__span-36-89) [ 1618 0 R /XYZ 60.307257 127.806726 0 ] (jdb/:__span-36-9) [ 1616 0 R /XYZ 60.307257 511.917306 0 ] (jdb/:__span-37-1) [ 1620 0 R /XYZ 60.307257 658.532922 0 ] (jdb/:__span-37-10) [ 1620 0 R /XYZ 60.307257 537.929754 0 ] (jdb/:__span-37-11) [ 1620 0 R /XYZ 60.307257 524.529402 0 ] (jdb/:__span-37-12) [ 1620 0 R /XYZ 60.307257 511.129050 0 ] (jdb/:__span-37-13) [ 1620 0 R /XYZ 60.307257 497.728698 0 ] (jdb/:__span-37-14) [ 1620 0 R /XYZ 60.307257 484.328346 0 ] (jdb/:__span-37-15) [ 1620 0 R /XYZ 60.307257 470.927994 0 ] (jdb/:__span-37-16) [ 1620 0 R /XYZ 60.307257 457.527642 0 ] (jdb/:__span-37-17) [ 1620 0 R /XYZ 60.307257 444.127290 0 ] (jdb/:__span-37-18) [ 1620 0 R /XYZ 60.307257 430.726938 0 ] (jdb/:__span-37-19) [ 1620 0 R /XYZ 60.307257 417.326586 0 ] (jdb/:__span-37-2) [ 1620 0 R /XYZ 60.307257 645.132570 0 ] (jdb/:__span-37-20) [ 1620 0 R /XYZ 60.307257 403.926234 0 ] (jdb/:__span-37-21) [ 1620 0 R /XYZ 60.307257 390.525882 0 ] (jdb/:__span-37-22) [ 1620 0 R /XYZ 60.307257 377.125530 0 ] (jdb/:__span-37-23) [ 1620 0 R /XYZ 60.307257 363.725178 0 ] (jdb/:__span-37-24) [ 1620 0 R /XYZ 60.307257 350.324826 0 ] (jdb/:__span-37-25) [ 1620 0 R /XYZ 60.307257 336.924474 0 ] (jdb/:__span-37-26) [ 1620 0 R /XYZ 60.307257 323.524122 0 ] (jdb/:__span-37-27) [ 1620 0 R /XYZ 60.307257 310.123770 0 ] (jdb/:__span-37-28) [ 1620 0 R /XYZ 60.307257 296.723418 0 ] (jdb/:__span-37-29) [ 1620 0 R /XYZ 60.307257 283.323066 0 ] (jdb/:__span-37-3) [ 1620 0 R /XYZ 60.307257 631.732218 0 ] (jdb/:__span-37-30) [ 1620 0 R /XYZ 60.307257 269.922714 0 ] (jdb/:__span-37-31) [ 1620 0 R /XYZ 60.307257 256.522362 0 ] (jdb/:__span-37-32) [ 1620 0 R /XYZ 60.307257 243.122010 0 ] (jdb/:__span-37-33) [ 1620 0 R /XYZ 60.307257 229.721658 0 ] (jdb/:__span-37-34) [ 1620 0 R /XYZ 60.307257 216.321306 0 ] (jdb/:__span-37-35) [ 1620 0 R /XYZ 60.307257 202.920954 0 ] (jdb/:__span-37-36) [ 1620 0 R /XYZ 60.307257 189.520602 0 ] (jdb/:__span-37-37) [ 1620 0 R /XYZ 60.307257 176.120250 0 ] (jdb/:__span-37-38) [ 1620 0 R /XYZ 60.307257 162.719898 0 ] (jdb/:__span-37-39) [ 1620 0 R /XYZ 60.307257 149.319546 0 ] (jdb/:__span-37-4) [ 1620 0 R /XYZ 60.307257 618.331866 0 ] (jdb/:__span-37-40) [ 1620 0 R /XYZ 60.307257 135.919194 0 ] (jdb/:__span-37-41) [ 1620 0 R /XYZ 60.307257 122.518842 0 ] (jdb/:__span-37-42) [ 1620 0 R /XYZ 60.307257 109.118490 0 ] (jdb/:__span-37-43) [ 1620 0 R /XYZ 60.307257 95.718138 0 ] (jdb/:__span-37-44) [ 1622 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-37-45) [ 1622 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-37-46) [ 1622 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-37-47) [ 1622 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-37-48) [ 1622 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-37-49) [ 1622 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-37-5) [ 1620 0 R /XYZ 60.307257 604.931514 0 ] (jdb/:__span-37-50) [ 1622 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-37-51) [ 1622 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-37-52) [ 1622 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-37-53) [ 1622 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-37-54) [ 1622 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-37-55) [ 1622 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-37-56) [ 1622 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-37-57) [ 1622 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-37-58) [ 1622 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-37-59) [ 1622 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-37-6) [ 1620 0 R /XYZ 60.307257 591.531162 0 ] (jdb/:__span-37-60) [ 1622 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-37-61) [ 1622 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-37-62) [ 1622 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-37-63) [ 1622 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-37-64) [ 1622 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-37-65) [ 1622 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-37-66) [ 1622 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-37-67) [ 1622 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-37-68) [ 1622 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-37-69) [ 1622 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-37-7) [ 1620 0 R /XYZ 60.307257 578.130810 0 ] (jdb/:__span-37-70) [ 1622 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-37-71) [ 1622 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-37-72) [ 1622 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-37-73) [ 1622 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-37-74) [ 1622 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-37-75) [ 1622 0 R /XYZ 60.307257 355.612710 0 ] (jdb/:__span-37-76) [ 1622 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-37-77) [ 1622 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-37-78) [ 1622 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-37-79) [ 1622 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-37-8) [ 1620 0 R /XYZ 60.307257 564.730458 0 ] (jdb/:__span-37-80) [ 1622 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-37-81) [ 1622 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-37-9) [ 1620 0 R /XYZ 60.307257 551.330106 0 ] (jdb/:__span-38-1) [ 1624 0 R /XYZ 60.307257 174.624222 0 ] (jdb/:__span-38-10) [ 1626 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-38-11) [ 1626 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-38-12) [ 1626 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-38-13) [ 1626 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-38-14) [ 1626 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-38-15) [ 1626 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-38-16) [ 1626 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-38-17) [ 1626 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-38-18) [ 1626 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-38-19) [ 1626 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-38-2) [ 1624 0 R /XYZ 60.307257 161.223870 0 ] (jdb/:__span-38-20) [ 1626 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-38-21) [ 1626 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-38-22) [ 1626 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-38-23) [ 1626 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-38-24) [ 1626 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-38-25) [ 1626 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-38-26) [ 1626 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-38-27) [ 1626 0 R /XYZ 60.307257 436.014822 0 ] (jdb/:__span-38-28) [ 1626 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-38-29) [ 1626 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-38-3) [ 1624 0 R /XYZ 60.307257 147.823518 0 ] (jdb/:__span-38-30) [ 1626 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-38-31) [ 1626 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-38-32) [ 1626 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-38-33) [ 1626 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-38-34) [ 1626 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-38-35) [ 1626 0 R /XYZ 60.307257 302.011302 0 ] (jdb/:__span-38-36) [ 1626 0 R /XYZ 60.307257 275.210598 0 ] (jdb/:__span-38-37) [ 1626 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-38-38) [ 1626 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-38-4) [ 1624 0 R /XYZ 60.307257 134.423166 0 ] (jdb/:__span-38-5) [ 1624 0 R /XYZ 60.307257 121.022814 0 ] (jdb/:__span-38-6) [ 1624 0 R /XYZ 60.307257 94.222110 0 ] (jdb/:__span-38-7) [ 1626 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-38-8) [ 1626 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-38-9) [ 1626 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-39-1) [ 1761 0 R /XYZ 60.307257 529.339422 0 ] (jdb/:__span-39-10) [ 1761 0 R /XYZ 60.307257 368.535198 0 ] (jdb/:__span-39-11) [ 1761 0 R /XYZ 60.307257 355.134846 0 ] (jdb/:__span-39-12) [ 1761 0 R /XYZ 60.307257 341.734494 0 ] (jdb/:__span-39-13) [ 1761 0 R /XYZ 60.307257 328.334142 0 ] (jdb/:__span-39-14) [ 1761 0 R /XYZ 60.307257 314.933790 0 ] (jdb/:__span-39-15) [ 1761 0 R /XYZ 60.307257 301.533438 0 ] (jdb/:__span-39-16) [ 1761 0 R /XYZ 60.307257 288.133086 0 ] (jdb/:__span-39-17) [ 1761 0 R /XYZ 60.307257 274.732734 0 ] (jdb/:__span-39-18) [ 1761 0 R /XYZ 60.307257 261.332382 0 ] (jdb/:__span-39-19) [ 1761 0 R /XYZ 60.307257 247.932030 0 ] (jdb/:__span-39-2) [ 1761 0 R /XYZ 60.307257 515.939070 0 ] (jdb/:__span-39-20) [ 1761 0 R /XYZ 60.307257 234.531678 0 ] (jdb/:__span-39-21) [ 1761 0 R /XYZ 60.307257 221.131326 0 ] (jdb/:__span-39-22) [ 1761 0 R /XYZ 60.307257 194.330622 0 ] (jdb/:__span-39-23) [ 1761 0 R /XYZ 60.307257 180.930270 0 ] (jdb/:__span-39-24) [ 1761 0 R /XYZ 60.307257 167.529918 0 ] (jdb/:__span-39-25) [ 1761 0 R /XYZ 60.307257 140.729214 0 ] (jdb/:__span-39-26) [ 1761 0 R /XYZ 60.307257 127.328862 0 ] (jdb/:__span-39-27) [ 1761 0 R /XYZ 60.307257 113.928510 0 ] (jdb/:__span-39-28) [ 1761 0 R /XYZ 60.307257 100.528158 0 ] (jdb/:__span-39-29) [ 1761 0 R /XYZ 60.307257 87.127806 0 ] (jdb/:__span-39-3) [ 1761 0 R /XYZ 60.307257 502.538718 0 ] (jdb/:__span-39-30) [ 1763 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-39-31) [ 1763 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-39-32) [ 1763 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-39-33) [ 1763 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-39-34) [ 1763 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-39-35) [ 1763 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-39-36) [ 1763 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-39-37) [ 1763 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-39-38) [ 1763 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-39-39) [ 1763 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-39-4) [ 1761 0 R /XYZ 60.307257 475.738014 0 ] (jdb/:__span-39-5) [ 1761 0 R /XYZ 60.307257 448.937310 0 ] (jdb/:__span-39-6) [ 1761 0 R /XYZ 60.307257 422.136606 0 ] (jdb/:__span-39-7) [ 1761 0 R /XYZ 60.307257 408.736254 0 ] (jdb/:__span-39-8) [ 1761 0 R /XYZ 60.307257 395.335902 0 ] (jdb/:__span-39-9) [ 1761 0 R /XYZ 60.307257 381.935550 0 ] (jdb/:__span-4-1) [ 1196 0 R /XYZ 60.307257 763.633722 0 ] (jdb/:__span-4-10) [ 1196 0 R /XYZ 60.307257 643.030554 0 ] (jdb/:__span-4-11) [ 1196 0 R /XYZ 60.307257 629.630202 0 ] (jdb/:__span-4-12) [ 1196 0 R /XYZ 60.307257 602.829498 0 ] (jdb/:__span-4-13) [ 1196 0 R /XYZ 60.307257 589.429146 0 ] (jdb/:__span-4-14) [ 1196 0 R /XYZ 60.307257 576.028794 0 ] (jdb/:__span-4-15) [ 1196 0 R /XYZ 60.307257 562.628442 0 ] (jdb/:__span-4-16) [ 1196 0 R /XYZ 60.307257 549.228090 0 ] (jdb/:__span-4-17) [ 1196 0 R /XYZ 60.307257 535.827738 0 ] (jdb/:__span-4-18) [ 1196 0 R /XYZ 60.307257 522.427386 0 ] (jdb/:__span-4-19) [ 1196 0 R /XYZ 60.307257 509.027034 0 ] (jdb/:__span-4-2) [ 1196 0 R /XYZ 60.307257 750.233370 0 ] (jdb/:__span-4-20) [ 1196 0 R /XYZ 60.307257 495.626682 0 ] (jdb/:__span-4-21) [ 1196 0 R /XYZ 60.307257 482.226330 0 ] (jdb/:__span-4-22) [ 1196 0 R /XYZ 60.307257 468.825978 0 ] (jdb/:__span-4-23) [ 1196 0 R /XYZ 60.307257 455.425626 0 ] (jdb/:__span-4-3) [ 1196 0 R /XYZ 60.307257 736.833018 0 ] (jdb/:__span-4-4) [ 1196 0 R /XYZ 60.307257 723.432666 0 ] (jdb/:__span-4-5) [ 1196 0 R /XYZ 60.307257 710.032314 0 ] (jdb/:__span-4-6) [ 1196 0 R /XYZ 60.307257 696.631962 0 ] (jdb/:__span-4-7) [ 1196 0 R /XYZ 60.307257 683.231610 0 ] (jdb/:__span-4-8) [ 1196 0 R /XYZ 60.307257 669.831258 0 ] (jdb/:__span-4-9) [ 1196 0 R /XYZ 60.307257 656.430906 0 ] (jdb/:__span-5-1) [ 1248 0 R /XYZ 60.307257 763.633722 0 ] (jdb/:__span-5-10) [ 1248 0 R /XYZ 60.307257 643.030554 0 ] (jdb/:__span-5-11) [ 1248 0 R /XYZ 60.307257 629.630202 0 ] (jdb/:__span-5-12) [ 1248 0 R /XYZ 60.307257 616.229850 0 ] (jdb/:__span-5-13) [ 1248 0 R /XYZ 60.307257 602.829498 0 ] (jdb/:__span-5-14) [ 1248 0 R /XYZ 60.307257 589.429146 0 ] (jdb/:__span-5-15) [ 1248 0 R /XYZ 60.307257 576.028794 0 ] (jdb/:__span-5-16) [ 1248 0 R /XYZ 60.307257 562.628442 0 ] (jdb/:__span-5-17) [ 1248 0 R /XYZ 60.307257 535.827738 0 ] (jdb/:__span-5-18) [ 1248 0 R /XYZ 60.307257 522.427386 0 ] (jdb/:__span-5-19) [ 1248 0 R /XYZ 60.307257 509.027034 0 ] (jdb/:__span-5-2) [ 1248 0 R /XYZ 60.307257 750.233370 0 ] (jdb/:__span-5-20) [ 1248 0 R /XYZ 60.307257 495.626682 0 ] (jdb/:__span-5-21) [ 1248 0 R /XYZ 60.307257 482.226330 0 ] (jdb/:__span-5-22) [ 1248 0 R /XYZ 60.307257 468.825978 0 ] (jdb/:__span-5-23) [ 1248 0 R /XYZ 60.307257 455.425626 0 ] (jdb/:__span-5-24) [ 1248 0 R /XYZ 60.307257 442.025274 0 ] (jdb/:__span-5-25) [ 1248 0 R /XYZ 60.307257 428.624922 0 ] (jdb/:__span-5-26) [ 1248 0 R /XYZ 60.307257 415.224570 0 ] (jdb/:__span-5-27) [ 1248 0 R /XYZ 60.307257 401.824218 0 ] (jdb/:__span-5-28) [ 1248 0 R /XYZ 60.307257 388.423866 0 ] (jdb/:__span-5-29) [ 1248 0 R /XYZ 60.307257 375.023514 0 ] (jdb/:__span-5-3) [ 1248 0 R /XYZ 60.307257 736.833018 0 ] (jdb/:__span-5-30) [ 1248 0 R /XYZ 60.307257 361.623162 0 ] (jdb/:__span-5-31) [ 1248 0 R /XYZ 60.307257 348.222810 0 ] (jdb/:__span-5-32) [ 1248 0 R /XYZ 60.307257 334.822458 0 ] (jdb/:__span-5-33) [ 1248 0 R /XYZ 60.307257 321.422106 0 ] (jdb/:__span-5-34) [ 1248 0 R /XYZ 60.307257 308.021754 0 ] (jdb/:__span-5-35) [ 1248 0 R /XYZ 60.307257 294.621402 0 ] (jdb/:__span-5-36) [ 1248 0 R /XYZ 60.307257 281.221050 0 ] (jdb/:__span-5-37) [ 1248 0 R /XYZ 60.307257 267.820698 0 ] (jdb/:__span-5-38) [ 1248 0 R /XYZ 60.307257 254.420346 0 ] (jdb/:__span-5-39) [ 1248 0 R /XYZ 60.307257 241.019994 0 ] (jdb/:__span-5-4) [ 1248 0 R /XYZ 60.307257 723.432666 0 ] (jdb/:__span-5-40) [ 1248 0 R /XYZ 60.307257 227.619642 0 ] (jdb/:__span-5-41) [ 1248 0 R /XYZ 60.307257 214.219290 0 ] (jdb/:__span-5-42) [ 1248 0 R /XYZ 60.307257 200.818938 0 ] (jdb/:__span-5-43) [ 1248 0 R /XYZ 60.307257 187.418586 0 ] (jdb/:__span-5-44) [ 1248 0 R /XYZ 60.307257 174.018234 0 ] (jdb/:__span-5-45) [ 1248 0 R /XYZ 60.307257 160.617882 0 ] (jdb/:__span-5-46) [ 1248 0 R /XYZ 60.307257 147.217530 0 ] (jdb/:__span-5-47) [ 1248 0 R /XYZ 60.307257 133.817178 0 ] (jdb/:__span-5-48) [ 1248 0 R /XYZ 60.307257 120.416826 0 ] (jdb/:__span-5-49) [ 1248 0 R /XYZ 60.307257 107.016474 0 ] (jdb/:__span-5-5) [ 1248 0 R /XYZ 60.307257 710.032314 0 ] (jdb/:__span-5-50) [ 1250 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-5-51) [ 1250 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-5-52) [ 1250 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-5-53) [ 1250 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-5-54) [ 1250 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-5-55) [ 1250 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-5-56) [ 1250 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-5-57) [ 1250 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-5-58) [ 1250 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-5-6) [ 1248 0 R /XYZ 60.307257 696.631962 0 ] (jdb/:__span-5-7) [ 1248 0 R /XYZ 60.307257 683.231610 0 ] (jdb/:__span-5-8) [ 1248 0 R /XYZ 60.307257 669.831258 0 ] (jdb/:__span-5-9) [ 1248 0 R /XYZ 60.307257 656.430906 0 ] (jdb/:__span-6-1) [ 1250 0 R /XYZ 60.307257 466.465902 0 ] (jdb/:__span-6-10) [ 1250 0 R /XYZ 60.307257 345.862734 0 ] (jdb/:__span-6-11) [ 1250 0 R /XYZ 60.307257 332.462382 0 ] (jdb/:__span-6-12) [ 1250 0 R /XYZ 60.307257 319.062030 0 ] (jdb/:__span-6-13) [ 1250 0 R /XYZ 60.307257 305.661678 0 ] (jdb/:__span-6-14) [ 1250 0 R /XYZ 60.307257 292.261326 0 ] (jdb/:__span-6-15) [ 1250 0 R /XYZ 60.307257 278.860974 0 ] (jdb/:__span-6-16) [ 1250 0 R /XYZ 60.307257 265.460622 0 ] (jdb/:__span-6-17) [ 1250 0 R /XYZ 60.307257 252.060270 0 ] (jdb/:__span-6-18) [ 1250 0 R /XYZ 60.307257 238.659918 0 ] (jdb/:__span-6-19) [ 1250 0 R /XYZ 60.307257 225.259566 0 ] (jdb/:__span-6-2) [ 1250 0 R /XYZ 60.307257 453.065550 0 ] (jdb/:__span-6-20) [ 1250 0 R /XYZ 60.307257 211.859214 0 ] (jdb/:__span-6-21) [ 1250 0 R /XYZ 60.307257 198.458862 0 ] (jdb/:__span-6-22) [ 1250 0 R /XYZ 60.307257 185.058510 0 ] (jdb/:__span-6-23) [ 1250 0 R /XYZ 60.307257 171.658158 0 ] (jdb/:__span-6-24) [ 1250 0 R /XYZ 60.307257 144.857454 0 ] (jdb/:__span-6-25) [ 1250 0 R /XYZ 60.307257 131.457102 0 ] (jdb/:__span-6-26) [ 1250 0 R /XYZ 60.307257 118.056750 0 ] (jdb/:__span-6-27) [ 1250 0 R /XYZ 60.307257 104.656398 0 ] (jdb/:__span-6-28) [ 1250 0 R /XYZ 60.307257 91.256046 0 ] (jdb/:__span-6-29) [ 1252 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-6-3) [ 1250 0 R /XYZ 60.307257 439.665198 0 ] (jdb/:__span-6-30) [ 1252 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-6-31) [ 1252 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-6-32) [ 1252 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-6-33) [ 1252 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-6-34) [ 1252 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-6-35) [ 1252 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-6-36) [ 1252 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-6-37) [ 1252 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-6-4) [ 1250 0 R /XYZ 60.307257 426.264846 0 ] (jdb/:__span-6-5) [ 1250 0 R /XYZ 60.307257 412.864494 0 ] (jdb/:__span-6-6) [ 1250 0 R /XYZ 60.307257 399.464142 0 ] (jdb/:__span-6-7) [ 1250 0 R /XYZ 60.307257 386.063790 0 ] (jdb/:__span-6-8) [ 1250 0 R /XYZ 60.307257 372.663438 0 ] (jdb/:__span-6-9) [ 1250 0 R /XYZ 60.307257 359.263086 0 ] (jdb/:__span-7-1) [ 1274 0 R /XYZ 60.307257 374.523743 0 ] (jdb/:__span-7-10) [ 1274 0 R /XYZ 60.307257 240.520223 0 ] (jdb/:__span-7-11) [ 1274 0 R /XYZ 60.307257 227.119871 0 ] (jdb/:__span-7-12) [ 1274 0 R /XYZ 60.307257 213.719519 0 ] (jdb/:__span-7-13) [ 1274 0 R /XYZ 60.307257 200.319167 0 ] (jdb/:__span-7-14) [ 1274 0 R /XYZ 60.307257 186.918815 0 ] (jdb/:__span-7-15) [ 1274 0 R /XYZ 60.307257 173.518463 0 ] (jdb/:__span-7-16) [ 1274 0 R /XYZ 60.307257 160.118111 0 ] (jdb/:__span-7-17) [ 1274 0 R /XYZ 60.307257 146.717759 0 ] (jdb/:__span-7-18) [ 1274 0 R /XYZ 60.307257 119.917055 0 ] (jdb/:__span-7-19) [ 1274 0 R /XYZ 60.307257 106.516703 0 ] (jdb/:__span-7-2) [ 1274 0 R /XYZ 60.307257 361.123391 0 ] (jdb/:__span-7-20) [ 1274 0 R /XYZ 60.307257 93.116351 0 ] (jdb/:__span-7-21) [ 1281 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-7-22) [ 1281 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-7-23) [ 1281 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-7-24) [ 1281 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-7-25) [ 1281 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-7-26) [ 1281 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-7-27) [ 1281 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-7-28) [ 1281 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-7-29) [ 1281 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-7-3) [ 1274 0 R /XYZ 60.307257 347.723039 0 ] (jdb/:__span-7-30) [ 1281 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-7-31) [ 1281 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-7-32) [ 1281 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-7-33) [ 1281 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-7-34) [ 1281 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-7-35) [ 1281 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-7-36) [ 1281 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-7-37) [ 1281 0 R /XYZ 60.307257 489.616230 0 ] (jdb/:__span-7-38) [ 1281 0 R /XYZ 60.307257 476.215878 0 ] (jdb/:__span-7-39) [ 1281 0 R /XYZ 60.307257 462.815526 0 ] (jdb/:__span-7-4) [ 1274 0 R /XYZ 60.307257 334.322687 0 ] (jdb/:__span-7-40) [ 1281 0 R /XYZ 60.307257 449.415174 0 ] (jdb/:__span-7-41) [ 1281 0 R /XYZ 60.307257 422.614470 0 ] (jdb/:__span-7-42) [ 1281 0 R /XYZ 60.307257 409.214118 0 ] (jdb/:__span-7-43) [ 1281 0 R /XYZ 60.307257 395.813766 0 ] (jdb/:__span-7-44) [ 1281 0 R /XYZ 60.307257 382.413414 0 ] (jdb/:__span-7-45) [ 1281 0 R /XYZ 60.307257 369.013062 0 ] (jdb/:__span-7-46) [ 1281 0 R /XYZ 60.307257 355.612710 0 ] (jdb/:__span-7-47) [ 1281 0 R /XYZ 60.307257 342.212358 0 ] (jdb/:__span-7-48) [ 1281 0 R /XYZ 60.307257 328.812006 0 ] (jdb/:__span-7-49) [ 1281 0 R /XYZ 60.307257 315.411654 0 ] (jdb/:__span-7-5) [ 1274 0 R /XYZ 60.307257 320.922335 0 ] (jdb/:__span-7-50) [ 1281 0 R /XYZ 60.307257 288.610950 0 ] (jdb/:__span-7-51) [ 1281 0 R /XYZ 60.307257 261.810246 0 ] (jdb/:__span-7-52) [ 1281 0 R /XYZ 60.307257 248.409894 0 ] (jdb/:__span-7-53) [ 1281 0 R /XYZ 60.307257 235.009542 0 ] (jdb/:__span-7-54) [ 1281 0 R /XYZ 60.307257 221.609190 0 ] (jdb/:__span-7-55) [ 1281 0 R /XYZ 60.307257 208.208838 0 ] (jdb/:__span-7-6) [ 1274 0 R /XYZ 60.307257 307.521983 0 ] (jdb/:__span-7-7) [ 1274 0 R /XYZ 60.307257 280.721279 0 ] (jdb/:__span-7-8) [ 1274 0 R /XYZ 60.307257 267.320927 0 ] (jdb/:__span-7-9) [ 1274 0 R /XYZ 60.307257 253.920575 0 ] (jdb/:__span-8-1) [ 1307 0 R /XYZ 60.307257 178.281829 0 ] (jdb/:__span-8-10) [ 1312 0 R /XYZ 60.307257 757.623270 0 ] (jdb/:__span-8-11) [ 1312 0 R /XYZ 60.307257 744.222918 0 ] (jdb/:__span-8-12) [ 1312 0 R /XYZ 60.307257 730.822566 0 ] (jdb/:__span-8-13) [ 1312 0 R /XYZ 60.307257 717.422214 0 ] (jdb/:__span-8-14) [ 1312 0 R /XYZ 60.307257 704.021862 0 ] (jdb/:__span-8-15) [ 1312 0 R /XYZ 60.307257 690.621510 0 ] (jdb/:__span-8-16) [ 1312 0 R /XYZ 60.307257 677.221158 0 ] (jdb/:__span-8-17) [ 1312 0 R /XYZ 60.307257 663.820806 0 ] (jdb/:__span-8-18) [ 1312 0 R /XYZ 60.307257 650.420454 0 ] (jdb/:__span-8-19) [ 1312 0 R /XYZ 60.307257 637.020102 0 ] (jdb/:__span-8-2) [ 1307 0 R /XYZ 60.307257 164.881477 0 ] (jdb/:__span-8-20) [ 1312 0 R /XYZ 60.307257 623.619750 0 ] (jdb/:__span-8-21) [ 1312 0 R /XYZ 60.307257 610.219398 0 ] (jdb/:__span-8-22) [ 1312 0 R /XYZ 60.307257 596.819046 0 ] (jdb/:__span-8-23) [ 1312 0 R /XYZ 60.307257 583.418694 0 ] (jdb/:__span-8-24) [ 1312 0 R /XYZ 60.307257 570.018342 0 ] (jdb/:__span-8-25) [ 1312 0 R /XYZ 60.307257 556.617990 0 ] (jdb/:__span-8-26) [ 1312 0 R /XYZ 60.307257 543.217638 0 ] (jdb/:__span-8-27) [ 1312 0 R /XYZ 60.307257 529.817286 0 ] (jdb/:__span-8-28) [ 1312 0 R /XYZ 60.307257 516.416934 0 ] (jdb/:__span-8-29) [ 1312 0 R /XYZ 60.307257 503.016582 0 ] (jdb/:__span-8-3) [ 1307 0 R /XYZ 60.307257 151.481125 0 ] (jdb/:__span-8-4) [ 1307 0 R /XYZ 60.307257 138.080773 0 ] (jdb/:__span-8-5) [ 1307 0 R /XYZ 60.307257 124.680421 0 ] (jdb/:__span-8-6) [ 1307 0 R /XYZ 60.307257 111.280069 0 ] (jdb/:__span-8-7) [ 1307 0 R /XYZ 60.307257 97.879717 0 ] (jdb/:__span-8-8) [ 1307 0 R /XYZ 60.307257 84.479365 0 ] (jdb/:__span-8-9) [ 1312 0 R /XYZ 60.307257 771.023622 0 ] (jdb/:__span-9-1) [ 1319 0 R /XYZ 60.307257 763.633722 0 ] (jdb/:__span-9-10) [ 1319 0 R /XYZ 60.307257 643.030554 0 ] (jdb/:__span-9-11) [ 1319 0 R /XYZ 60.307257 629.630202 0 ] (jdb/:__span-9-12) [ 1319 0 R /XYZ 60.307257 616.229850 0 ] (jdb/:__span-9-13) [ 1319 0 R /XYZ 60.307257 602.829498 0 ] (jdb/:__span-9-14) [ 1319 0 R /XYZ 60.307257 589.429146 0 ] (jdb/:__span-9-15) [ 1319 0 R /XYZ 60.307257 576.028794 0 ] (jdb/:__span-9-16) [ 1319 0 R /XYZ 60.307257 562.628442 0 ] (jdb/:__span-9-17) [ 1319 0 R /XYZ 60.307257 549.228090 0 ] (jdb/:__span-9-18) [ 1319 0 R /XYZ 60.307257 535.827738 0 ] (jdb/:__span-9-19) [ 1319 0 R /XYZ 60.307257 522.427386 0 ] (jdb/:__span-9-2) [ 1319 0 R /XYZ 60.307257 750.233370 0 ] (jdb/:__span-9-20) [ 1319 0 R /XYZ 60.307257 509.027034 0 ] (jdb/:__span-9-21) [ 1319 0 R /XYZ 60.307257 495.626682 0 ] (jdb/:__span-9-22) [ 1319 0 R /XYZ 60.307257 482.226330 0 ] (jdb/:__span-9-23) [ 1319 0 R /XYZ 60.307257 468.825978 0 ] (jdb/:__span-9-24) [ 1319 0 R /XYZ 60.307257 455.425626 0 ] (jdb/:__span-9-25) [ 1319 0 R /XYZ 60.307257 442.025274 0 ] (jdb/:__span-9-26) [ 1319 0 R /XYZ 60.307257 428.624922 0 ] (jdb/:__span-9-27) [ 1319 0 R /XYZ 60.307257 415.224570 0 ] (jdb/:__span-9-28) [ 1319 0 R /XYZ 60.307257 401.824218 0 ] (jdb/:__span-9-29) [ 1319 0 R /XYZ 60.307257 388.423866 0 ] (jdb/:__span-9-3) [ 1319 0 R /XYZ 60.307257 736.833018 0 ] (jdb/:__span-9-30) [ 1319 0 R /XYZ 60.307257 375.023514 0 ] (jdb/:__span-9-31) [ 1319 0 R /XYZ 60.307257 361.623162 0 ] (jdb/:__span-9-32) [ 1319 0 R /XYZ 60.307257 348.222810 0 ] (jdb/:__span-9-33) [ 1319 0 R /XYZ 60.307257 334.822458 0 ] (jdb/:__span-9-34) [ 1319 0 R /XYZ 60.307257 321.422106 0 ] (jdb/:__span-9-35) [ 1319 0 R /XYZ 60.307257 308.021754 0 ] (jdb/:__span-9-36) [ 1319 0 R /XYZ 60.307257 294.621402 0 ] (jdb/:__span-9-37) [ 1319 0 R /XYZ 60.307257 281.221050 0 ] (jdb/:__span-9-38) [ 1319 0 R /XYZ 60.307257 267.820698 0 ] (jdb/:__span-9-39) [ 1319 0 R /XYZ 60.307257 254.420346 0 ] (jdb/:__span-9-4) [ 1319 0 R /XYZ 60.307257 723.432666 0 ] (jdb/:__span-9-40) [ 1319 0 R /XYZ 60.307257 241.019994 0 ] (jdb/:__span-9-41) [ 1319 0 R /XYZ 60.307257 227.619642 0 ] (jdb/:__span-9-42) [ 1319 0 R /XYZ 60.307257 214.219290 0 ] (jdb/:__span-9-43) [ 1319 0 R /XYZ 60.307257 200.818938 0 ] (jdb/:__span-9-5) [ 1319 0 R /XYZ 60.307257 710.032314 0 ] (jdb/:__span-9-6) [ 1319 0 R /XYZ 60.307257 696.631962 0 ] (jdb/:__span-9-7) [ 1319 0 R /XYZ 60.307257 683.231610 0 ] (jdb/:__span-9-8) [ 1319 0 R /XYZ 60.307257 669.831258 0 ] (jdb/:__span-9-9) [ 1319 0 R /XYZ 60.307257 656.430906 0 ] (jdb/:grand-prix-de-monaco) [ 1699 0 R /XYZ 39.386457 164.992922 0 ] (jdb/:jeudi-1-juin-2023) [ 1703 0 R /XYZ 39.386457 270.835122 0 ] (jdb/:jeudi-11-mai-2023) [ 1611 0 R /XYZ 39.386457 562.440762 0 ] (jdb/:jeudi-18-mai-2023) [ 1650 0 R /XYZ 39.386457 459.588513 0 ] (jdb/:jeudi-25-mai-2023) [ 1691 0 R /XYZ 39.386457 446.337222 0 ] (jdb/:jeudi-27-avril-2023) [ 1497 0 R /XYZ 39.386457 584.282022 0 ] (jdb/:jeudi-30-mars-2023) [ 1141 0 R /XYZ 39.386457 263.492343 0 ] (jdb/:jeudi-6-avril) [ 1348 0 R /XYZ 39.386457 238.444086 0 ] (jdb/:journal-de-bord) [ 1138 0 R /XYZ 39.386457 757.223622 0 ] (jdb/:lundi-1-mai-2023) [ 1511 0 R /XYZ 39.386457 501.702822 0 ] (jdb/:lundi-15-mai-2023) [ 1633 0 R /XYZ 39.386457 584.282022 0 ] (jdb/:lundi-22-mai-2023) [ 1657 0 R /XYZ 39.386457 649.970022 0 ] (jdb/:lundi-24-avril-2023) [ 1471 0 R /XYZ 39.386457 266.404302 0 ] (jdb/:lundi-29-mai-2023) [ 1703 0 R /XYZ 39.386457 771.023622 0 ] (jdb/:lundi-3-avril) [ 1228 0 R /XYZ 39.386457 717.534822 0 ] (jdb/:lundi-5-juin-2023) [ 1747 0 R /XYZ 39.386457 229.986499 0 ] (jdb/:lundi-8-mai-2023) [ 1540 0 R /XYZ 39.386457 314.866514 0 ] (jdb/:mardi-16-mai-2023) [ 1633 0 R /XYZ 39.386457 273.038922 0 ] (jdb/:mardi-2-mai-2023) [ 1517 0 R /XYZ 39.386457 595.251918 0 ] (jdb/:mardi-23-mai-2023) [ 1684 0 R /XYZ 39.386457 234.994819 0 ] (jdb/:mardi-25-avril-2023) [ 1490 0 R /XYZ 39.386457 693.136422 0 ] (jdb/:mardi-30-mai-2023) [ 1703 0 R /XYZ 39.386457 547.990122 0 ] (jdb/:mardi-4-avril) [ 1294 0 R /XYZ 39.386457 305.202822 0 ] (jdb/:mardi-6-juin-2023) [ 1757 0 R /XYZ 39.386457 150.125803 0 ] (jdb/:mardi-9-mai-2023) [ 1576 0 R /XYZ 39.386457 146.799010 0 ] (jdb/:mercredi-10-mai-2023) [ 1597 0 R /XYZ 39.386457 659.354022 0 ] (jdb/:mercredi-17-mai-2023) [ 1642 0 R /XYZ 39.386457 771.023622 0 ] (jdb/:mercredi-24-mai-2023) [ 1689 0 R /XYZ 39.386457 629.325222 0 ] (jdb/:mercredi-29-mars-2023) [ 1138 0 R /XYZ 39.386457 707.865222 0 ] (jdb/:mercredi-31-mai-2023) [ 1703 0 R /XYZ 39.386457 339.971022 0 ] (jdb/:mercredi-5-avril) [ 1321 0 R /XYZ 39.386457 293.199726 0 ] (jdb/:mercredi-7-juin) [ 1761 0 R /XYZ 39.386457 648.093222 0 ] (jdb/:recrutement-payerne-mai-2023) [ 1537 0 R /XYZ 39.386457 526.101222 0 ] (jdb/:vacances) [ 1416 0 R /XYZ 39.386457 355.144422 0 ] (jdb/:vendredi-12-mai-2023) [ 1624 0 R /XYZ 39.386457 623.694822 0 ] (jdb/:vendredi-2-juin-2023) [ 1729 0 R /XYZ 39.386457 608.680422 0 ] (jdb/:vendredi-26-mai-2023) [ 1699 0 R /XYZ 39.386457 249.143222 0 ] (jdb/:vendredi-28-avril-2023) [ 1509 0 R /XYZ 39.386457 717.534822 0 ] (jdb/:vendredi-31032023) [ 1153 0 R /XYZ 39.386457 347.805222 0 ] (jdb/:vendredi-5-mai-2023) [ 1537 0 R /XYZ 39.386457 426.936522 0 ] (jdb/:vendredi-6-avril-2023) [ 1391 0 R /XYZ 39.386457 565.514022 0 ] ] >> >> >> @@ -41,221 +41,226 @@ endobj >> >> /XObject << -/i83e8d47bdf7867037eaedcf9b3ba91c5 2151 0 R -/i3b497ccb2cc72102529af416dabfdc79 2153 0 R -/i6d29f3061def42a6d984946e7bf957bb 2155 0 R -/i862acd95fd3b7c98ae07759a85e97bb4 2157 0 R -/i74ee81867abd69ec488abb7ef10985ae 2159 0 R -/ib7ba3e880fd0e12a34ed481fb6f9ce5c 2161 0 R -/i23b03f0d6de89592a85131d5cc5f53d5 2163 0 R -/i47dd0e4f8ad5e2db299605011ff1f791 2165 0 R -/ibc4ec9ddd67180f1dff7f3a2a7496013 2167 0 R -/i57b2d7c51196448691e0fde3678a24b6 2169 0 R -/ibdba7ecb0da824c6b03d5f4bc7d9a6fc 2171 0 R -/ia236b62eb8d6175949bee2bc38f50b0f 2173 0 R -/i12200a7e1b7cc677f13d4cf3967fd977 2175 0 R -/ieb9f461ea42dd450637413a739caf3e2 2177 0 R -/i95354e0ced090a84ad5029bc54cfca25 2178 0 R -/if03219818b9488dfcaa735c637892233 2179 0 R -/i483b48f68c365836d5538b7b2428e26c 2180 0 R -/idfec847ea3aa6025b1e2952efcd456c5 2182 0 R -/i864ecd1f04e13a5e2e05b34e05efb5e8 2184 0 R -/idf8fc4e68ed1a33ad823ad667a0f68b2 2186 0 R -/i697f03ebf6060d61aee540142fbc9866 2188 0 R -/i456fc3b8c9506626329986ad2a6165cb 2190 0 R -/i4bffedf109758ad04d67bde2f542c422 2192 0 R -/i4e5041030b7abb6f99d9953487f6523d 2194 0 R -/ibbad9b91af3faa229b8648d050a4979f 2196 0 R -/id64e468e5c9063255b0cbcd967af36fb 2198 0 R -/ifeb68a942f3d59c6d6c0492b04369c72 2200 0 R -/ifd045f27144497870f6754b815faf42d 2202 0 R -/id9ea2680132a7ada299a6ccd6eb4721d 2204 0 R -/idbbed2f6cd12f34d2e6d79fc9264704e 2206 0 R -/i5753d0cb39836c974aeb4d3e181c73f9 2208 0 R -/i4df9917b14b40c6938ccbe418deb9311 2210 0 R -/i56ebb8aaf4dabde9b21e2f3c398d3d2a 2212 0 R -/ieabc84d1373def37e713cb81d92ead72 2214 0 R -/i1864b403764fce5ca0f52759b1d746da 2216 0 R -/i0b08055253198904c9e5e3d17751a27b 2218 0 R -/id05b28f6c40c771eaa05a88211e94946 2220 0 R -/i9709e3d755f4e3e4b72cba138dd67a33 2222 0 R -/i9ce7d04a1a468903e102e54b467a8794 2224 0 R -/i5c81c682a716b2574c0d25abb24f2299 2226 0 R -/i415d130bf16a4f457995458e1fd54a24 2228 0 R -/i980b0c2608fcb02021172158435b33d0 2230 0 R -/ide208052fad45aa250cfb9ff02c56a24 2232 0 R -/i4578e049f08c54f0b208221322d4af40 2234 0 R -/i1490d2d06018026d86032b98446daac4 2236 0 R -/i118a90245cba588084cf533bb078c9ba 2238 0 R -/i46fb1d6ec7ef17435e8c70cddf76e1e8 2240 0 R -/i592319d66ce72d58b8fbcd4fcd595090 2242 0 R -/ib6da13f7cbd6ea9cfb728bbe653974fe 2244 0 R -/ie88d0360fc428391dccbfb474e640d0f 2246 0 R -/i28bfe17ffb6c7dc803ab5f0c8a765947 2248 0 R -/i537e253324baa41ff1b737c064429ade 2250 0 R -/i2a382b5b92ab4a00fce5007637b78832 2252 0 R -/i91be234c88e16692309a3cd72c739d08 2254 0 R -/i67da3ed2201c45af09c71bdb7ba05f4d 2256 0 R -/i269c5dad91493a1dc1d485a1196a8250 2258 0 R -/ie434869461a294629a802947e9cde65e 2260 0 R -/i48c3a07e2c82d5cbd8423c214a04b083 2262 0 R -/ibc8c79593eebf4502cc03c8ed510cc7e 2264 0 R -/i8aca4212570ed49b69bf0d61cbecb6d4 2266 0 R -/i01572a2fb14977d7bba1a9a5cc853862 2268 0 R -/i20ce8e4546d289f37dc98ac5683994c0 2270 0 R -/icb9a987068776512d1cd8c31d9940aef 2271 0 R -/i9632cb825142a03f242e3843f07417a3 2272 0 R -/ic04167c903cb799760037987b6953254 2273 0 R -/i1728bb6fe8b5e256820f39a8fccf896f 2274 0 R -/i7a6f9b89d58c4fec179ba918c226e361 2275 0 R -/i808299d0a4329db339a1104fac2fb606 2277 0 R -/i2ed673ddfa0469c0a69c11b733250254 2279 0 R -/i3e2b42479801ec6a20b405a84becb4ad 2281 0 R -/i20df846d588849cbe396d64f8ca7b963 2283 0 R -/ic51bc7c2fdb169027209668212e9cebc 2285 0 R -/iba7c7eb6e996b2d9ec38553fe62f0c0e 2287 0 R -/ibaae51bd69d9821c6ff16fcce238a791 2289 0 R -/i2041e55dce885f95d00a60cc00eab449 2291 0 R -/i0922cc635b0c76ca2b0c4aad2027b3b4 2293 0 R -/ib0a8953323de770ca31a57a01177b649 2295 0 R -/iaed4b4c279cff1018ba52a2e46296de7 2297 0 R -/id206e1a26dabce4e53ebebccdc2a441f 2299 0 R -/i4ffdcf687ebb4c2e10d91e48bca55ea3 2301 0 R -/ibbc23b7a94f1a271e1b12c9f95760dcc 2303 0 R -/i274c74455d786244597d823a9a5a533f 2305 0 R -/i4a5444515cf7bd52270ad2584e4c8de0 2307 0 R -/i1646202a5d28980f8d400607061a89d4 2309 0 R -/i6c3e8d1203f65ec1a9fc90d5b05d8fe1 2311 0 R -/ieec8bf67d15d883938065d4272a2acaf 2313 0 R -/ib633e06dc1ea72624e9c0f4814c5e3cf 2315 0 R -/i73bce7ce5054ede41f7800fda5d4108b 2317 0 R -/ice8bbdff965da0ada1e4438b50112394 2319 0 R -/i24e80b7dbef9643edb92f56f64127a32 2321 0 R -/i225cdd0b25500d1e4935a6db59c95c67 2323 0 R -/if1f78de152482b62b26deb08cbc22601 2325 0 R -/i7af0c5a971f95c822ce42184565706a9 2327 0 R -/i729cf5d1bcd3923b626627334bd13c80 2329 0 R -/ib6ec25664f40d60cdb3715e1e648ccbd 2331 0 R -/i44484ef29c184b2ade063992d78d895c 2333 0 R -/i6931910c9154eb60eff4634e0d52e721 2335 0 R -/i8e3543cfd5ad1aca0a38f5227c9eca96 2337 0 R -/i3b67f948ed22f9ef5aa525f61e25fdb7 2339 0 R -/i5f3a2a6833875acc60d05412d2072241 2341 0 R -/ide1f3da74f05f5edd597d46e9014af6a 2343 0 R -/ib40baa213d4ae8b6935a9710738a03d6 2345 0 R -/id92d7e79cfbae48ca2044a5fcaacf2e6 2347 0 R -/iaf287c0ce18656c5ad30fdc1831f345a 2349 0 R -/i333ca0847cd43bf04fab1eaa3021f55a 2351 0 R -/id54c72b68043111c244e60aee9b0b407 2353 0 R -/icb89dd755780b1b3b5609f88231866a4 2355 0 R -/id5a65e7a228d493a9e30536122432a38 2357 0 R -/i69a3d2e2aa39a9aa89691865bfe087b7 2359 0 R -/i16e63abf761e5e49028def0764d5fc01 2361 0 R -/i28e63526d9b0dab84592ba43edec1bbc 2362 0 R -/idf92a68daa3cb2352d343132c5327258 2363 0 R -/ie47e3ccc7158c83f627c5fdbacca0b01 2365 0 R -/i016f5a1345314db3ad10eae1790b4f1c 2367 0 R -/ic6f361c3184e5ab67e17e3506d5d80d8 2369 0 R -/ia64748b5466fee915378fccf5c7a1b47 2371 0 R -/i1f75ecd3cdea65c723059e748dfb4d86 2373 0 R -/i93aa95fe267034962c6a8cf1c6e1a97c 2375 0 R -/i38d424149caf0ede6ac6f1785736db7b 2377 0 R -/if977c8a66a7b56abf4971466d44c94ad 2379 0 R -/i271db94350f76791c3ea696f9e1e2071 2381 0 R -/ib36bfe1d2070f0d8e1278878549c85a9 2383 0 R -/i0cdd3aa0068844a5910435ea46c7ebab 2385 0 R -/ib1f594f771c011faa047b1fc33398489 2387 0 R -/i29c1e0a342594acb8a37494fb09aaeac 2389 0 R -/i49a427ed1e41991b547dd37f3a5a968a 2391 0 R -/ib6c959bc47025eb9e97c7ffe143b83e0 2393 0 R -/i5c1fba789549d426899a38b1df2bf165 2395 0 R -/i1b87f5817ee048a6e58ae68c7c648590 2397 0 R -/i144d9afaad5db5ba25a482aa868b5309 2399 0 R -/ie2bc4160dd648fa132f79285a13ddbf6 2401 0 R -/i49558b02479b930cc9f0044ee5ae5854 2403 0 R -/i1466d35bb8bb81058e39171cf3f175e7 2405 0 R -/ib770143957879744018ff6c0742d739f 2407 0 R -/i44b99004acfb76f0f80ced0851d1fa22 2409 0 R -/ie98cebf629d52cedf854f75ccd8a3948 2411 0 R -/iebd158e6cffc746d0fea2fe798c40b0a 2413 0 R -/i3380ccf226f8f9ac934d4b4bbd547ebb 2415 0 R -/ie828749a19dddf3ea0dba96ddcaa47fc 2417 0 R -/i59d462a4ebc54ddc0dc1d694d8b152cf 2419 0 R -/i1ffc17e32362c2641f0d85f333cc69ed 2421 0 R -/ic2456a56e464f0d1acb55f84beaee6d3 2423 0 R -/i28fa2200dc4e7542a868e4a9da99aca9 2425 0 R -/i8a3b58d053c54439cdc19422af794da3 2427 0 R -/i17b8b9937f6e4599ff6db9f73f823096 2429 0 R -/i7c71fef6e7f50ada1dc3021f9bac6bba 2431 0 R -/i65221d140fd8ba236765a749aa48f9b6 2433 0 R -/i127689757da4e743ab7a9b9b9e0ccf8f 2435 0 R -/i21577e8bc1d8d0af76417ee7724edb84 2437 0 R -/ie38f9dbb3359324964f4e9171fb664b1 2439 0 R -/i5ff01cda45d74112993c7d72fb873f01 2441 0 R -/ibb0d13191f889a5aeb4134aa1b6935d2 2443 0 R -/i3accb128fcf1262e5b20f23a21d5bc61 2445 0 R -/icfed19ccda34e8dc2e3905610222faa9 2447 0 R -/i85c62db712f20b31b81ad2e6413309da 2449 0 R -/ic2a9a88bbf715284567f72f381668df2 2451 0 R -/ib9f9f07787c80c06641932388c3bdb74 2453 0 R -/i8a6f2d2f5a28c0af2c38024ae0081658 2455 0 R -/i225d8b520d32dd86767c2dcc61d0fba4 2457 0 R -/ia54d20fa729a8068718b8c7d510ad027 2459 0 R -/iad2faaa5ca488113e9074ac5402d7efe 2461 0 R -/ifd92504eb5e8bf7df66b70cf4ce57dd5 2463 0 R -/id109e171ec05f9ad15797b8d83229356 2465 0 R -/iab5e53595722b1f5258144979d9f2ac3 2467 0 R -/i05f15b48a6e23194831c567df021af3f 2468 0 R -/i6c02b2a0d8bd39c599dd34ae7158267c 2470 0 R -/ib904c5ff40856935e447b3ddd76306c8 2472 0 R -/i69c3f44e5bd21a489ea8fcf335f7c44f 2474 0 R -/i2718fd348fdb22b641539ca636a9ed06 2476 0 R -/ief51d1e924220581210ee50401220d6b 2478 0 R -/i2e64122b51e48609e16d295e21626056 2480 0 R -/i3de64d04d5d6ec0507edeb9881576677 2482 0 R -/i0c483fc6885782fea1d33432172fcc18 2484 0 R -/if6b2541f2fea69bec681b5326e2cb236 2486 0 R -/i8646a456c3049dc41308c7715ce69f8b 2488 0 R -/i9a58a9c98de07135b36b09a7194fa17d 2490 0 R -/if49ae9e180658fe14ee6ba818d9aa65a 2492 0 R -/i9df4cb3e557d5ca5fa480b1257d28838 2494 0 R -/i307658129ace4da16ce8e4d3bc2182c4 2496 0 R -/i5bc9aa345ebaa493ffa10f273970179e 2498 0 R -/i8705a48d8dbb4086afc34aaf93e995b9 2500 0 R -/i95fc521c77451596e6cea9e4878808f3 2502 0 R -/ic63e75e4660311e5e6282859b1220ffd 2504 0 R -/i3cb63d24a6d374f2471e18ca1df497c5 2506 0 R -/i65752d24f4a428052ecdb19d1f8d0c19 2508 0 R -/iac56279099050bf3f6660dc50d5fae15 2510 0 R -/i57f5883427bd603b0769e87f2691de4b 2512 0 R -/i93e09802d69c40bc9e388d83c59814c0 2514 0 R -/i7ad22ed2e653a4178ce918640f691141 2516 0 R -/i22107632178e4640c254f12ebf16a74a 2518 0 R -/i47e10b9ff132a8ff72e3a61e313922d6 2520 0 R -/i0b6a51cbf995f68a09d7c74358aa0366 2522 0 R -/i165c54a14c2eb6fee597a70aa4b725c6 2524 0 R -/i3fcec7c62958d6070e26e01727739aab 2526 0 R -/id5e97f26b06893171d21db14a843fdba 2528 0 R -/idccad07c8f0fb3f5b30bb5c66c13f82b 2530 0 R -/i1cd7847ff916665780fdb47a11af1ac1 2532 0 R -/id36e505104ea8e40d130f1988753b751 2534 0 R -/i5fd79da729d211f9b270c3e1b62369d5 2536 0 R -/i645b5b03a88bc339133adf2fd95da424 2538 0 R -/i5ebfc514d255c194c6861dbe09487844 2540 0 R -/i27abfd0303e0141dccb979fac23a574e 2542 0 R -/i4b07f0f347ca4297bf221493ede2113d 2544 0 R -/ic5acaf2e398777f4bb397031135c857d 2546 0 R -/i262682edb16dc603780595daf5706aa7 2548 0 R -/i7ceb8b76dd6d5960359e35b3ef6bf94d 2550 0 R -/i7023f54b4ed46bf526f2392363e81d21 2552 0 R -/i7896b4f5fdd3988876d2dbcb141ce241 2554 0 R -/i7677843b9dcb81c59a103c0b338ea62e 2556 0 R +/i83e8d47bdf7867037eaedcf9b3ba91c5 2232 0 R +/i3b497ccb2cc72102529af416dabfdc79 2234 0 R +/i6d29f3061def42a6d984946e7bf957bb 2236 0 R +/i862acd95fd3b7c98ae07759a85e97bb4 2238 0 R +/i27abfd0303e0141dccb979fac23a574e 2240 0 R +/i5aebc9b808f7515e2e4825807e68944c 2242 0 R +/i46916a757dec6b77593d8d242edd9466 2244 0 R +/i321a69e82376330c7a8c37d5fc1babd8 2246 0 R +/ic99a8bf88abf9e8e86b2daef9015e919 2248 0 R +/i7e859d27407165aac821175cb74264a6 2250 0 R +/i74ee81867abd69ec488abb7ef10985ae 2252 0 R +/ib7ba3e880fd0e12a34ed481fb6f9ce5c 2254 0 R +/i23b03f0d6de89592a85131d5cc5f53d5 2256 0 R +/i47dd0e4f8ad5e2db299605011ff1f791 2258 0 R +/ibc4ec9ddd67180f1dff7f3a2a7496013 2260 0 R +/i57b2d7c51196448691e0fde3678a24b6 2262 0 R +/ibdba7ecb0da824c6b03d5f4bc7d9a6fc 2264 0 R +/ia236b62eb8d6175949bee2bc38f50b0f 2266 0 R +/i12200a7e1b7cc677f13d4cf3967fd977 2268 0 R +/ieb9f461ea42dd450637413a739caf3e2 2270 0 R +/i95354e0ced090a84ad5029bc54cfca25 2271 0 R +/if03219818b9488dfcaa735c637892233 2272 0 R +/i483b48f68c365836d5538b7b2428e26c 2273 0 R +/idfec847ea3aa6025b1e2952efcd456c5 2275 0 R +/i864ecd1f04e13a5e2e05b34e05efb5e8 2277 0 R +/idf8fc4e68ed1a33ad823ad667a0f68b2 2279 0 R +/i697f03ebf6060d61aee540142fbc9866 2281 0 R +/i456fc3b8c9506626329986ad2a6165cb 2283 0 R +/i4bffedf109758ad04d67bde2f542c422 2285 0 R +/i4e5041030b7abb6f99d9953487f6523d 2287 0 R +/ibbad9b91af3faa229b8648d050a4979f 2289 0 R +/id64e468e5c9063255b0cbcd967af36fb 2291 0 R +/ifeb68a942f3d59c6d6c0492b04369c72 2293 0 R +/ifd045f27144497870f6754b815faf42d 2295 0 R +/id9ea2680132a7ada299a6ccd6eb4721d 2297 0 R +/idbbed2f6cd12f34d2e6d79fc9264704e 2299 0 R +/i5753d0cb39836c974aeb4d3e181c73f9 2301 0 R +/i4df9917b14b40c6938ccbe418deb9311 2303 0 R +/i56ebb8aaf4dabde9b21e2f3c398d3d2a 2305 0 R +/ieabc84d1373def37e713cb81d92ead72 2307 0 R +/i1864b403764fce5ca0f52759b1d746da 2309 0 R +/i0b08055253198904c9e5e3d17751a27b 2311 0 R +/id05b28f6c40c771eaa05a88211e94946 2313 0 R +/i9709e3d755f4e3e4b72cba138dd67a33 2315 0 R +/i9ce7d04a1a468903e102e54b467a8794 2317 0 R +/i5c81c682a716b2574c0d25abb24f2299 2319 0 R +/i415d130bf16a4f457995458e1fd54a24 2321 0 R +/i980b0c2608fcb02021172158435b33d0 2323 0 R +/ide208052fad45aa250cfb9ff02c56a24 2325 0 R +/i4578e049f08c54f0b208221322d4af40 2327 0 R +/i1490d2d06018026d86032b98446daac4 2329 0 R +/i118a90245cba588084cf533bb078c9ba 2331 0 R +/i46fb1d6ec7ef17435e8c70cddf76e1e8 2333 0 R +/i592319d66ce72d58b8fbcd4fcd595090 2335 0 R +/ib6da13f7cbd6ea9cfb728bbe653974fe 2337 0 R +/ie88d0360fc428391dccbfb474e640d0f 2339 0 R +/i28bfe17ffb6c7dc803ab5f0c8a765947 2341 0 R +/i537e253324baa41ff1b737c064429ade 2343 0 R +/i2a382b5b92ab4a00fce5007637b78832 2345 0 R +/i91be234c88e16692309a3cd72c739d08 2347 0 R +/i67da3ed2201c45af09c71bdb7ba05f4d 2349 0 R +/i269c5dad91493a1dc1d485a1196a8250 2351 0 R +/ie434869461a294629a802947e9cde65e 2353 0 R +/i48c3a07e2c82d5cbd8423c214a04b083 2355 0 R +/ibc8c79593eebf4502cc03c8ed510cc7e 2357 0 R +/i8aca4212570ed49b69bf0d61cbecb6d4 2359 0 R +/i01572a2fb14977d7bba1a9a5cc853862 2361 0 R +/i20ce8e4546d289f37dc98ac5683994c0 2363 0 R +/icb9a987068776512d1cd8c31d9940aef 2364 0 R +/i9632cb825142a03f242e3843f07417a3 2365 0 R +/ic04167c903cb799760037987b6953254 2366 0 R +/i1728bb6fe8b5e256820f39a8fccf896f 2367 0 R +/i7a6f9b89d58c4fec179ba918c226e361 2368 0 R +/i808299d0a4329db339a1104fac2fb606 2370 0 R +/i2ed673ddfa0469c0a69c11b733250254 2372 0 R +/i3e2b42479801ec6a20b405a84becb4ad 2374 0 R +/i20df846d588849cbe396d64f8ca7b963 2376 0 R +/ic51bc7c2fdb169027209668212e9cebc 2378 0 R +/iba7c7eb6e996b2d9ec38553fe62f0c0e 2380 0 R +/ibaae51bd69d9821c6ff16fcce238a791 2382 0 R +/i2041e55dce885f95d00a60cc00eab449 2384 0 R +/i0922cc635b0c76ca2b0c4aad2027b3b4 2386 0 R +/ib0a8953323de770ca31a57a01177b649 2388 0 R +/iaed4b4c279cff1018ba52a2e46296de7 2390 0 R +/id206e1a26dabce4e53ebebccdc2a441f 2392 0 R +/i4ffdcf687ebb4c2e10d91e48bca55ea3 2394 0 R +/ibbc23b7a94f1a271e1b12c9f95760dcc 2396 0 R +/i274c74455d786244597d823a9a5a533f 2398 0 R +/i4a5444515cf7bd52270ad2584e4c8de0 2400 0 R +/i1646202a5d28980f8d400607061a89d4 2402 0 R +/i6c3e8d1203f65ec1a9fc90d5b05d8fe1 2404 0 R +/ieec8bf67d15d883938065d4272a2acaf 2406 0 R +/ib633e06dc1ea72624e9c0f4814c5e3cf 2408 0 R +/i73bce7ce5054ede41f7800fda5d4108b 2410 0 R +/ice8bbdff965da0ada1e4438b50112394 2412 0 R +/i24e80b7dbef9643edb92f56f64127a32 2414 0 R +/i225cdd0b25500d1e4935a6db59c95c67 2416 0 R +/if1f78de152482b62b26deb08cbc22601 2418 0 R +/i7af0c5a971f95c822ce42184565706a9 2420 0 R +/i729cf5d1bcd3923b626627334bd13c80 2422 0 R +/ib6ec25664f40d60cdb3715e1e648ccbd 2424 0 R +/i44484ef29c184b2ade063992d78d895c 2426 0 R +/i6931910c9154eb60eff4634e0d52e721 2428 0 R +/i8e3543cfd5ad1aca0a38f5227c9eca96 2430 0 R +/i3b67f948ed22f9ef5aa525f61e25fdb7 2432 0 R +/i5f3a2a6833875acc60d05412d2072241 2434 0 R +/ide1f3da74f05f5edd597d46e9014af6a 2436 0 R +/ib40baa213d4ae8b6935a9710738a03d6 2438 0 R +/id92d7e79cfbae48ca2044a5fcaacf2e6 2440 0 R +/iaf287c0ce18656c5ad30fdc1831f345a 2442 0 R +/i333ca0847cd43bf04fab1eaa3021f55a 2444 0 R +/id54c72b68043111c244e60aee9b0b407 2446 0 R +/icb89dd755780b1b3b5609f88231866a4 2448 0 R +/id5a65e7a228d493a9e30536122432a38 2450 0 R +/i69a3d2e2aa39a9aa89691865bfe087b7 2452 0 R +/i16e63abf761e5e49028def0764d5fc01 2454 0 R +/i28e63526d9b0dab84592ba43edec1bbc 2455 0 R +/idf92a68daa3cb2352d343132c5327258 2456 0 R +/ie47e3ccc7158c83f627c5fdbacca0b01 2458 0 R +/i016f5a1345314db3ad10eae1790b4f1c 2460 0 R +/ic6f361c3184e5ab67e17e3506d5d80d8 2462 0 R +/ia64748b5466fee915378fccf5c7a1b47 2464 0 R +/i1f75ecd3cdea65c723059e748dfb4d86 2466 0 R +/i93aa95fe267034962c6a8cf1c6e1a97c 2468 0 R +/i38d424149caf0ede6ac6f1785736db7b 2470 0 R +/if977c8a66a7b56abf4971466d44c94ad 2472 0 R +/i271db94350f76791c3ea696f9e1e2071 2474 0 R +/ib36bfe1d2070f0d8e1278878549c85a9 2476 0 R +/i0cdd3aa0068844a5910435ea46c7ebab 2478 0 R +/ib1f594f771c011faa047b1fc33398489 2480 0 R +/i29c1e0a342594acb8a37494fb09aaeac 2482 0 R +/i49a427ed1e41991b547dd37f3a5a968a 2484 0 R +/ib6c959bc47025eb9e97c7ffe143b83e0 2486 0 R +/i5c1fba789549d426899a38b1df2bf165 2488 0 R +/i1b87f5817ee048a6e58ae68c7c648590 2490 0 R +/i144d9afaad5db5ba25a482aa868b5309 2492 0 R +/ie2bc4160dd648fa132f79285a13ddbf6 2494 0 R +/i49558b02479b930cc9f0044ee5ae5854 2496 0 R +/i1466d35bb8bb81058e39171cf3f175e7 2498 0 R +/ib770143957879744018ff6c0742d739f 2500 0 R +/i44b99004acfb76f0f80ced0851d1fa22 2502 0 R +/ie98cebf629d52cedf854f75ccd8a3948 2504 0 R +/iebd158e6cffc746d0fea2fe798c40b0a 2506 0 R +/i3380ccf226f8f9ac934d4b4bbd547ebb 2508 0 R +/ie828749a19dddf3ea0dba96ddcaa47fc 2510 0 R +/i59d462a4ebc54ddc0dc1d694d8b152cf 2512 0 R +/i1ffc17e32362c2641f0d85f333cc69ed 2514 0 R +/ic2456a56e464f0d1acb55f84beaee6d3 2516 0 R +/i28fa2200dc4e7542a868e4a9da99aca9 2518 0 R +/i8a3b58d053c54439cdc19422af794da3 2520 0 R +/i17b8b9937f6e4599ff6db9f73f823096 2522 0 R +/i7c71fef6e7f50ada1dc3021f9bac6bba 2524 0 R +/i65221d140fd8ba236765a749aa48f9b6 2526 0 R +/i127689757da4e743ab7a9b9b9e0ccf8f 2528 0 R +/i21577e8bc1d8d0af76417ee7724edb84 2530 0 R +/ie38f9dbb3359324964f4e9171fb664b1 2532 0 R +/i5ff01cda45d74112993c7d72fb873f01 2534 0 R +/ibb0d13191f889a5aeb4134aa1b6935d2 2536 0 R +/i3accb128fcf1262e5b20f23a21d5bc61 2538 0 R +/icfed19ccda34e8dc2e3905610222faa9 2540 0 R +/i85c62db712f20b31b81ad2e6413309da 2542 0 R +/ic2a9a88bbf715284567f72f381668df2 2544 0 R +/ib9f9f07787c80c06641932388c3bdb74 2546 0 R +/i8a6f2d2f5a28c0af2c38024ae0081658 2548 0 R +/i225d8b520d32dd86767c2dcc61d0fba4 2550 0 R +/ia54d20fa729a8068718b8c7d510ad027 2552 0 R +/iad2faaa5ca488113e9074ac5402d7efe 2554 0 R +/ifd92504eb5e8bf7df66b70cf4ce57dd5 2556 0 R +/id109e171ec05f9ad15797b8d83229356 2558 0 R +/iab5e53595722b1f5258144979d9f2ac3 2560 0 R +/i05f15b48a6e23194831c567df021af3f 2561 0 R +/i6c02b2a0d8bd39c599dd34ae7158267c 2563 0 R +/ib904c5ff40856935e447b3ddd76306c8 2565 0 R +/i69c3f44e5bd21a489ea8fcf335f7c44f 2567 0 R +/i2718fd348fdb22b641539ca636a9ed06 2569 0 R +/ief51d1e924220581210ee50401220d6b 2571 0 R +/i2e64122b51e48609e16d295e21626056 2573 0 R +/i3de64d04d5d6ec0507edeb9881576677 2575 0 R +/i0c483fc6885782fea1d33432172fcc18 2577 0 R +/if6b2541f2fea69bec681b5326e2cb236 2579 0 R +/i8646a456c3049dc41308c7715ce69f8b 2581 0 R +/i9a58a9c98de07135b36b09a7194fa17d 2583 0 R +/if49ae9e180658fe14ee6ba818d9aa65a 2585 0 R +/i9df4cb3e557d5ca5fa480b1257d28838 2587 0 R +/i307658129ace4da16ce8e4d3bc2182c4 2589 0 R +/i5bc9aa345ebaa493ffa10f273970179e 2591 0 R +/i8705a48d8dbb4086afc34aaf93e995b9 2593 0 R +/i95fc521c77451596e6cea9e4878808f3 2595 0 R +/ic63e75e4660311e5e6282859b1220ffd 2597 0 R +/i3cb63d24a6d374f2471e18ca1df497c5 2599 0 R +/i65752d24f4a428052ecdb19d1f8d0c19 2601 0 R +/iac56279099050bf3f6660dc50d5fae15 2603 0 R +/i57f5883427bd603b0769e87f2691de4b 2605 0 R +/i93e09802d69c40bc9e388d83c59814c0 2607 0 R +/i7ad22ed2e653a4178ce918640f691141 2609 0 R +/i22107632178e4640c254f12ebf16a74a 2611 0 R +/i47e10b9ff132a8ff72e3a61e313922d6 2613 0 R +/i0b6a51cbf995f68a09d7c74358aa0366 2615 0 R +/i165c54a14c2eb6fee597a70aa4b725c6 2617 0 R +/i3fcec7c62958d6070e26e01727739aab 2619 0 R +/id5e97f26b06893171d21db14a843fdba 2621 0 R +/idccad07c8f0fb3f5b30bb5c66c13f82b 2623 0 R +/i1cd7847ff916665780fdb47a11af1ac1 2625 0 R +/id36e505104ea8e40d130f1988753b751 2627 0 R +/i5fd79da729d211f9b270c3e1b62369d5 2629 0 R +/i645b5b03a88bc339133adf2fd95da424 2631 0 R +/i5ebfc514d255c194c6861dbe09487844 2633 0 R +/i4b07f0f347ca4297bf221493ede2113d 2635 0 R +/ic5acaf2e398777f4bb397031135c857d 2637 0 R +/i262682edb16dc603780595daf5706aa7 2639 0 R +/i7ceb8b76dd6d5960359e35b3ef6bf94d 2641 0 R +/i7023f54b4ed46bf526f2392363e81d21 2643 0 R +/i7896b4f5fdd3988876d2dbcb141ce241 2645 0 R +/i7677843b9dcb81c59a103c0b338ea62e 2647 0 R >> /Pattern << >> /Shading << >> -/Font 2150 0 R +/Font 2231 0 R >> endobj 5 0 obj @@ -282,7 +287,7 @@ endobj 7 0 obj << /Filter /FlateDecode -/Length 49454 +/Length 49459 >> stream xͮe;ϧȶ񟋀 X (C 7R*u2 H~c9'O^KYY;x"X_YQ5~]ڳ^{]_̶S]ZKx9z/~~K}}z3I?_~wO6ZZ9k}뙋7Voc/{/;g}^y~1z{yѿƮJ\~8oq%)H??3,{yRU&޳10O/dqԻ!#[ mnnߙU@~翨~ jGg_/3o/|ۻ\gi𻅖>`kdvr)O7ӟR 枵2{]𡕶{dU4T j yܻL>tkMi4at 41̻໹5{4R7g/]jA{ӶyZQTcz;M.>h,h3~-ױjE*Ot0]1hBO6q\ m^4G ]Ǿڼ3{=Ն6ﳷ駵ý홻Ag>iN;uuW;|*}-Ξ˽_)`ؘ`8 fe{Y:.cmN>A[m}fBnU&61hs_:mƬmꮯ"Dܾhˆw} UD`_Av|?}}5]_E @@ -397,13 +402,13 @@ E Ä\a+ rd.0!W& Ä\a+4raB0L 0!Wh& Ä\a+ raBL 0!W& -Ä\+$Wg ıAeo%WLކs+f$Aѡ64g[%ƃ 6u \xМaT7@Qy_M(0A kǰ͝ifblsvNT;NQJ}(wpkRj]8E)Ż]vߘaGtv2yʹ6A.abl)s'Һki2+7:mv21;99X?[56s?v219s](zk3sk}>UǵOyC/ˍS*qJ倛8rMnR9)ۍS*^nR9?q ܖT:>7N {TX6qJ97k3s_nR9@N7Ntth7N T:ȍS*+L7N^^A>a]S`Ô]S`ӎS 6߭3ar0wMM;NN;NL;N(8eVa=8e58e98eV4wMߚچZZI ;N-sMtT0T^|>TzAkJp}^hZap8rh.9nR9@ ?8r)~tA;}qJ堝68rNnR9h|֑A.Źqp#T(vqJqǝk3rQ8rnR9h]6)nd)9mާql8EATݎS q8]l3:mnݎ6nfK9%a;N Վv9v"1%v>lv>l3fd>lsvv;N\ЎS``)r3))LT`8rcf"Q9hڽHT܍S*5) 9YTv?v?tAC)TИ)dj~~$*H ~qAGrGro)|v?֛ݏDj#Q9ݏDGrv21J8ee#Q9@4t2;N8eql(T\HTxE8eGr)qGr߼qD8en#Q9hHT@HT0~$*Uk)s^k3sl4~$*LA+GrJ qJ]qJ堕b#9v?ҫGz~W98Gz3rpݏ*>*|樻TbwM)n~qQݏQݏ|X?Sߖ3WnZG{#ox/|Io?߫?:oXXۨ姽2o/|ۻ\=ᷧ+t$ro+Gf:uI O3{zfLgNޟdAooz8h|?Bk:f3L1vuw{̥ǠHs3ݵHYZkfqע֏kQzvVY_p#һgF33ylw-{\Z3._'H2^j{6#ykr|Z}kG;fъ|Ws-{E3s/|?/-Jv`9>p=rkb] &6G9cozL] >Z G# `rKյ98x޵98x‘A\馫|,ݵ@Yt ^_C3CuU>p] *?nGnG>Bѵ98nGAnGӽrU>,9Z rp#t{t (0sϺ*OWkGOy0ׂ|v|?fWWItumF"7_#1nGOĩWLVk3rp| rpq98s|G/,nG] *OsU>+W;rp1f G)*nyjGy$f9:N3h3 - 7_E] prpQxv9w-nӮ*|i`nڥՁeULl:::yx;W'GU]yxv}up /7_<W'iZ|upW'ۮ&:ݮoW'_ˮ||u9B2<ǟk1>ǖ|ov}u~=뫓G=NۮmW'|+ŮNV]_ǵGiWkW'>ծN}櫓GmW{Ǒq\ѧˮN}:]_ѧ|>]v}uG櫋3z6iW>EqU$ 뫋G"0|uS>U?GE6f}N櫋GmWߞ[| =w-{]_~RpU]yMmv}Gܵo1|u7_]o=N@3vѵGnW߾9HZȷs{Ͳ#in>6>N>⟛͵xO\m|iӴ}?~a>|\wv}oϣ8Lyˮo?]_}c~{>]`WruwYَu~=~oo_g}?gƉHW~{aes~_yo>o3x(??rx@ﯷ|\W/+B~.+?opHKI'h7GOw eKͼ2cT56W xq یwỔ}\Jr) upỔ[,%-KI!͜wr)im!ֳm?RC.%!m?RC.%^l?R;m?RҞ6jd>6?6s!1\+%;D ڴpV6mflwǰac6c~>Çˌ|U͠>åяz.~Ͱͫ~[*76#gȭ\\v[OAc>Cn5?.]?Vs1!Ss[1!cz\?VS!*r9]?VNZs[Ol Gw[1r|}mCN_yW}]6߶.֕fl^c!r"O6vdwpKCRiӓ4å~tyJGϐTzJCRc~CR<1l޶J[*TF9 -2>g H3-j{KeVyK퇼B}}2n!o<' -jCyK;4gȭ|j[Ergȭʃ ~ȭg!ل 1(᭫Z\?VZu[1ir6E2G ۼj~n23]?Vp5ge~<'19Exl?dr? )22yҎ Om2m?d.2>C gd>C -0(l?d8Vc!s23d}A~Iϐ9>C :s qb>}~GɯrvG9]?ݹsC>ڽqv/Af>C>ڽp hR$Ǡ͵hw4!J~Gsg|{3gȭ~+n-೫gȭ(]? Fւl?|mỵ ǎac!χu ϐ[ 0q[ :nz,j!"ڋlzs/tTx[9cm%1?Q#'<뇫5촠Nyig0i.װӂ1W|vZ4@w_OimSz}?,} ;-'c|vZW|vZPzӂNJװӂ_OiRN N_wg'zJO~/)=]}\+}JÞvJ=={}ϒ=^)=[|=ݷxv<)==^vߎ#} =zJOo_Oi~[aOo#vVz@y\J_>g|=ݷ~Hy)=Ky2>)=^vW|=ݷkt]zJO<`ڧa=u_OiSσ||y+5|wSzڽk<`yX1n;[G Tk؉]}Nw|=GzJO?[|=G|=6(zJO?Nz{r|===x\2={ѻk؉_O|S:5} <طσwyS:5ϑ}\G|=N_OS:a_OScܩy}>FIީ񊯧ܩyׄ᝚omx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx4c+>m`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`[h+>m`ϭx6ފF[h+>ms}nųV|0ڊF[h+>s+؊F[h+>ms}nųV|0ڊF[h+>s+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+؊F[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx4c+>m`x+>m`x+>m`[m`[m`[m`[h+>m`fl`V<o`V<o`V<o`V<oţVV_<}]{?>?/g|oߗ1V<o`V<o`V<o`V<o`V<o`V<o`V<o`V<o`V<o`V<V|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[hV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mų>^>Co`fl|o`x+>V|0ڊF[h+y~n`x+>V|0ڊF[h+y~n`x+>V|0ڊF[h+y~n`x+>V|0ڊF[h+y~n`x+>,{SV|0ڊF[hV|0}z؊F[h+y~n`x+>V|0ڊF[h+y~n`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`ь`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊG3V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+/{$OlŃey}|Vڿo.|o¿ݾ?y;=m_kvk^,} _̙5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\qNfl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\qNfl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;gj?ֿf?o믪U/N߻N2}^׏0ws?Y׷߾޿\]* b__y?_}y7`Tijq`T">l\">FE<FE|0*QE|0*Q`Tijq`T">l\">FE<FE|0*QE|0*Q`Tijq`T">hF`T">l\">FE<FE|0*QE|0*Q`Tijq`T">l\">FE<FE|0*QE|0*Q`Tijq`T">l\">FEFE<FE|0*QE|0*Q`Tijq`T">l\">FE<FE|0*QE|0*Q`Tijq`T">l\">FE<FE|0*ь">FE|0*ٸFE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx4FE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx6.Q`T"(Q`T"`T">g">FE|0*ٸFE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx6.Q`T"`T">G3`T">g">FE|0*ٸFE|0*Qx6.Q`T"x4?ykY_*U_X߶>sOw׹{ݏZ?/|~ -xg,ٸG3 +Ä\+$Wg ıAeo%WLކ"@?MM-OHoHj%Gzx +!_?_?o{j$T%u~򟾽orӹ%Ͼo ?6 JyڜD#Aʳ454pGA\hAsAQ2>5Zsʨ6y9ð͝i cf\s5QB)6jdKاqRjp(ՎSRe)JyT;Nc V8lsvn6cza)J)n~-8;N1G;NE<܋mnŎ6baK1q)nbf7Nŕ7Nrp`*)B(n6) =ǰ͵qo0B0%ic \1״1q8mA6ڵ9ik3spic"N8mAQqژF8m9ƍV6cV)sicv8mB_6O c)sklqҮA> fv2y"A)srêcfl)sC;Ny;NZ3l3gac)sh;N<ٵ9g63 6,c)sǍD*qڙe>nv }7N;sǍ>t RǍ,kڑzv#~k3rߘǍfT6?n6ckfH];M&Aė|@7N;r?{qڑp9 6qmlG یoEwM'ی +]6c)r;N'l;N}ɶ9v.m5]l3R̵yͨ\7}A%#Ǡv"BQ)r9mF>mo>mnˎ6#5=l3]S ˎS 9':|`l,7N \S*ˍS*?uASu\!>|>T8r)TS*)JnR9(8r)>ǰmqJpgqJeTs63)dtAGv{qJ8rtAuqeqf5e6Li5e=8ebql:-wsOopה9ڴ99ʴ9ݎS`EY>`ӎS`]ӎS`ӎS`EOsה9Xmquqeq,k,ϰ9X02הAO`LCpqJ൫CTP7Nߧ镏 7NpɍS*|)ÍS*nR9G7NӇTiÍS*)gkR7qJbTwܹ6#ݍS*܉) 5lsnR9hOvNc}jَS`ۻqD8E"Nmݎ6sc8lsvnt;N\9Pqlkw;Nmn)rSn6n6cF6nakͥql8E6|v"1mnR9hnR9qJ ƍS*+:mnv+6݋D!8r[nR9hpq%qJn#Q9`#Q9hA7N4jnR9` +qJinR9hHGr~$*(/~$*VnR9l#Q9hHTZv?|HTpA~$* k)sԎS`[v?tAC'9ȎS zBŵ9؊ݏDWԎS`}~$* ~$*ͫA؎S`v?VݏDݏDGr[v263˶KGrʴ2~$*tTUTZ)v?ҫc#y~W98Gz~W98q*gHrMrgkJ倏*vהyG9x`H`H?o χ3%m *7Sz[L>*D97{_/|Io?߫?:oXXۨ姽2o/|ۻ\=ᷧ+t$ro+Gf:uI O3{zfLgNޟdAooz8h|?Bk:f3L1vuw{̥ǠHs3ݵHYZkfqע֏kQzvVY_p#һgF33ylw-{\Z3._'H2^j{6#ykr|Z}kG;fъ|Ws-{E3s/|?/-Jv`9>p=rkb] &6G9cozL] >Z G# `rKյ98x޵98x‘A\馫|,ݵ@Yt ^_C3CuU>p] *?nGnG>Bѵ98nGAnGӽrU>,9Z rp#t{t (0sϺ*OWkGOy0ׂ|v|?fWWItumF"7_#1nGOĩWLVk3rp| rpq98s|G/,nG] *OsU>+W;rp1f G)*nyjGy$f9:N3h3 + 7_E] prpQxv9w-nӮ*|i`nڥՁeULl:::yx;W'GU]yxv}up /7_<W'iZ|upW'ۮ&:ݮoW'_ˮ||u9B2<ǟk1>ǖ|ov}u~=뫓G=NۮmW'|+ŮNV]_ǵGiWkW'>ծN}櫓GmW{Ǒq\ѧˮN}:]_ѧ|>]v}uG櫋3z6iW>EqU$ 뫋G"0|uS>U?GE6f}N櫋GmWߞ[| =w-{]_~RpU]yMmv}Gܵo1|u7_]o=N@3vѵGnW߾9HZȷs{Ͳ#in>6>N>⟛͵xO\m|iӴ}?~a>|\wv}oϣ8Lyˮo?]_}c~{>]`WruwYَu~=~oo_g}?gƉHW~{aes~_yo>o3x(??rx@ﯷ|\W/+B~.+?opHKI'h7GOw eKͼ2cT56W xq یwỔ}\Jr) upỔ[,%-KI!͜wr)im!ֳm?RC.%!m?RC.%^l?R;m?RҞ6jd>6?6s!1\+%;|spqɮM7auAl?lܶnvw ۼ9>l33| +AGY 3<\G ۼ퇼rx#1l3|je<3VSr[OiCn5r9u9Hr9&Cn5?)r9!syCn5?\?l5_p ztӻ!g=m?w5gemyyo]ippټ="k!r4L~g8fT3lw~[*szfԏ.>CR\JoCR}~[*}L{{b~[*G;mCRc{K<(CRSFgR,i潥Rm?|oj!obTOϐTm?->CRAmh!op ՜pt[yCn5?|" Py0!}\?V310!9E3uUj~Vr96Cn5?ܦ>C@aWw[>Czj~ ,:޶9c!sp`1ǼAr!sp?C>C Oq!sCӺ%ۚC SgB ,bgDf!sŃAg>ފ}l?dr>C }A~ѻϐ9/)29gD9xN?a>\6gxxOhw>C>\(|;w~G<;gGn]6!^*!΃]?Q5hwvv/|r >C>ڽ|%í|v E|{ȱZЗւm?|p1lzl?ւac!@`rk&nrkA(9r3K{b60i@*z &/:VX[IOĈ$@ d:װӂ:aL K_N '^yiAkx G|=ݷ_Oi5촠yi_yiA}N :)I_N w|={H=>;-?K8} ߝ<)=q|޿wYypzJO+={}+Kz{fvlvksj񌯧v[z{]Sz};zJO%@zv)=W|=ݷm=zJOo3Zy[gksSzwo?:*} yݹ_Oi΃ +azʺ=nS'Pa'v#>;v)=xlv<v+zJO?Ѣl: )=:yuvrqSN>+ҩ5`">a_O<%kx+r^wj^N͏#r᝚;=)wj~>)wj~>)wj~)wj~;5?W|=Nig|=#5S>R=C!_Rܗͪ.cOQoWݷ~QWQ[v=>?c]חQ/T5i}Gpnŏϭ~>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx4c+>m`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`ь`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0V<o`⃹>x+>m`[h+>m`ϭx4c+>m`[h+>m`ϭx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx4c+>m`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`x+>m`ь`V|0ڊg`V|0ڊg`V<o܊F[h+>mųV|0ϭ`V<o܊F[h+>mųV|0ϭ`V<o܊F[h+>mųV|0ϭ`V<o`V<V|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[l[^2[Uk϶wV~ǿ|߿bb?~_؊F[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[lV|0ڊF[hV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mųV|0ڊF[h+>mţ[h+>m`[h+>m`[h+>m`[h+>m`[h+>m`[h+>m`[h+>m`[h+>m`[h+>m`x8>V<LV|0ڊg`[h+>mx6ފV|0ڊg`[h+>mx6ފV|0ڊg`[h+>mx6ފV|0ڊg`[h+>mx6ފV|0ڊg`z_O[h+>mţ[1)c+>mx6ފV|0ڊg`[h+>mx6ފV|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊg`V|0ڊG3V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+V|0ڊF[h+؊F[h+>mx6ފF[h+>mx6ފF[h+>mx6ފF[h+>mx6ފGC??jM[j kwޟ75{/g|'3gl\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Yq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Yq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\q5;Qq5;l\5;l\qNfl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\qNfl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\qNfl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fl\q5;hF5;l\qNfl\q5;hF5;l\q͎fl\q5;hF5;l\q͎fd~֮X=f'W@:}:{^?ܵ:_g_~yswE|]~)Ojg(QE|0*Q`Tijq`T">l\">FE<FE|0*QE|0*Q`Tijq`T">l\">FE<FE|0*QE|0*Q`TģE|0*Q`Tijq`T">l\">FE<FE|0*QE|0*Q`Tijq`T">l\">FE<FE|0*QE|0*Q`Tijq`T">hF`T">l\">FE<FE|0*QE|0*Q`Tijq`T">l\">FE<FE|0*QE|0*Q`Tijq`T">l\">G3`T">g">FE|0*ٸFE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx6.Q`T"`T">g">FE|0*ь">FE|0*ٸFE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx4FE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx6.Q`T"`T">g">FE|0*ٸFE|0*Qx6.Q`T"(Q`T"`T">g">FE|0*ٸFE|0*Qx6.8m?SeE|'Wadoϱ{>]_u?b_ xky(_mg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6. x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6. x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x2g x6.ٸG3 x6.ٸg x4g x6.ٸG3 x6.ٸg x4g x6.ٸG3 x6.ٸg x4g x6.ٸG3 @@ -418,15 +423,13 @@ x6. x6.ٸg x4g x6.ٸG3 x6.ٸg x4g x6.ٸG3 x6.ٸg x4g x6.ٸG3 -x6.ٸg,ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg,ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg,ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg,ٸg x6.ь x6.ٸg(ٸg x6.ь x6.ٸg(8߭-?QU|?O -> -&e?~Y|~"~3>Óʿ7x6(ь"x6.ٸgsvE<l\ijqRfl\ijqEÿ4v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjg㪝̬ٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjg㪝̬ٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸjgͨٸjg㪝v6ьv6ٸj'3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸj'3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸj'3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸj'3v6ٸjg㪝v4jg㪝v6ٸjG3v6ٸjg㪝v4jg㪝v6ٸjG3v2?NrkTY~^믪U_j__N{]QޏǵSƇOgSN S:q[][?w22ڒ#ε=9Wxԕ -(s V\~%u@1o3󣎹wY?X\x1[z,c~+V1U:W^?NǢ7B]7:掕cc^[fS꒸/jc^uiyc^n$S\?ŭXuui}b1׷3=|>;jNG[z,V.cq1RM}{z,:k{XuWI|1_uɖgX2uεQgd2zǢNq,1A[uHŻߡc`X;nMUs1kscQ^Fz,<طkVx,:.ck$%:n1w7~lyuEuW|Wr㝮Wu<7a^ߎzպN/{bK׫u-8; ΃iLyu_W:%[y.u<]x~V_zSҊW:M(]:z!]u<_W:u6M׫{Ϻ`M׫{ϵ3S3__>L>F Jx6.Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`T(Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>G3J`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>g>F%F%<F%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q fF%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T£%|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T³q J`T>hF J`T>l\>F%<F%|0*Q %|0*Q J`T³q om*Yο'W N7ݯ|ӎsu>SG?,}-{]_>Żkl\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Yq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Yq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\qNfl\q;hF;l\qfl\q;hF;l\qfl\q;hw6.ٸxg❍w4xg❍w6.ٸxG3w6.ٸxg❍w4xg❍w6.ٸxG3w6.ٸxg❍w2xg❍w6.ٸxG3w6.ٸxg❍w4xg❍w6.ٸxG3w6.ٸxg❍w4xg❍w6.ٸxG\q;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;❍w6.ٸxg(ٸxg❍w6.ь❍w6.ٸxg(ٸxg❍w6.ь❍w6.ٸxg,ٸxg❍w6.ь❍w6.ٸxg(ٸxg❍w6.ь❍w6.ٸxg(8׭?Qe{_U䓫x^kw;okw_\9}ݏǵwç?峌O?gU'u׏\EI;Wum_ɜ}<^\ejmx9ؼ\~%jë(~əQ\Pt>XogаǢ~>6u̯~U+:1_ccGXy3'SASz,^ukorUu|_c^uyc^w$S\?Xuu}b1׷3=|>ϏMs]oXutNQj6:y8꘯cq1_['Q|e]z,Ƿ~l`*oJ۱?cQPWjK=󻎹]\X똟:: NŻX\?Wkߟ阯9+=u|`Ǣ΃}KgǢ#W7#<Vc^ȇcHhcё~h_ŃxXt:cё~:]Hu~ܤdSܯOckXy~ԅX2uHE_: Ǣ΃ua#ﳧc`}occQ}{鱨ྭJE|]r%?I\cjGhtڑ܏tڑfϦEfU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;Wl\U;Wl\qU;QqU;WdfU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WdfU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WdfU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WdfU;Wl\qՎfTl\qU;WhFU;Wl\qՎfTl\qU;WhFNIn{/zUUO>kUki+:V?{|,S~ x\g#n Ww}cR?}kNUf][2u׹G2W2W[<e~*Wگdַy(:-vc~1;<?+=:`KE{>A0u̯~*:1_ccXY&SܱRz,^uklwU]EM0u̫.1u̫Ӎd맸.X:}b1;=VyG1hKŪc~eqz,:^W1sOQ|m:阏:.cq>U.cqֹv;̛YZX)U{:ws=h+󻎹x1?;t2uwsǭ鱸_#=:׾?1_}MsWz,4HEv +E~Ex,:흤$S\-W8F6<׏]<: Ec=<'_}2:~9s_umNE_G]%SޟXy`z,]v_)W::H׫w'1D1ny2ukM=]c>x\^dW:@Z?ս΃G 8sk(yuv;cQsպ/s{~D::b;1y~4W:-_Qʼպ.s{1 XO`q lt=LROtz0I}j`zm;~7M:~#v_v߭Z^=7d?~CW W^{݁y0F=_{j۾%m7Ek^zXxxS5_;tv֏_hW;w~=j{W;k;R[~ /]v_W{wo3]~?Vz#l^#_~|3x_gzW?;;_xB;];?+_J׫w>Vj ߴx#ՏK/DOu]_{𩌯o>>/g|oW1ރ;o`ރ;o`ރ;o`ރ;o`ރ;o`ރ;o`ރ;o`ރ;o`ރ;o`ރ;ރ{0zF[lރ{0zF[lރ{0zF[lރ{0zF[lރ{0zF[lރ{0zF[lރ{0zF[lރ{0zF[lރ{0zF[lރ{0zF[h{0zF[h=m{0zF[h=m{0zF[h=m{0zF[h=m{0zF[h=m{0zF[h=m{0zF[h=m{0zF[h=m{0zF[h=m{0zF[hzF[h=mw6zF[h=mw6zF[h=mw6zF[h=mw6 [h=m`[h=m`[h=m`[h=m`[h=m`[h=m`fl`ރ;o`ރ;o`ރ;o`ރ;`ރ{0zg`ރ{0zg`ރ{0zg`ރ{0zg`ރ{0zg`ރ{0zG3ރ{0zF[h띍ރ{0zF[h띍ރ{0zF[h띍ރ{0zF[hͮ`ރ{0zg`ރ{0zg`ރ{0zg`ރ{0zg`ރ{0zg`ރ{0zG3ރ{0zF[h띍ރ{0zF[h띍ރ{0zF[h띍ރ{0zF[hͮw4? [Yl^_:q5[?f{_{>6_>_κ.Gk-{_>O.g,ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x2g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x2g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2,ٸg2x6.ь2x6.ٸg2(ٸg2x6.ь2x6.ٸg2Mg2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x2g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x2g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x2g2x6.ٸG3x6.ٸg2x4g2x6.ٸG3x6.ٸg2x4'33e_VI2'\e|'2W5%{I^+dǿǿ| ůϚYqɎfl\q%;hF%;l\qɎfl\q%;hF%;l\qɎfl\q%;hF%;l\qɎfl\q%;hF%;l\qɎfl\q%;df%;l\qɎfl\q%;hF%;l\qɎfl\q%;hF%;l\qɎfl\q%;hF%;l\qɎfl\q%;hF%;l\qɎfl\q%;df%;l\qɎfl\q%;hF%;l\qɎfl\q%;hF%;l\qɎfl\q%;hF%;l\qɎfl\q%;hF%;l\qɎfl\q%;Yq%;l\%;l\q%;Qq%;l\%;l\q%;Qq%;l\%;l\q%;Qq%;l\%;l\q%;Qq%;l\%;l\q%;Yq%;l\%;l\q%;Qq%;l\%;l\q%;Qq%;l\%;l\q%;Qq%;l\%;l\q%;Qq%;l\%;l\q%;Yq%;l\%;l\q%;Qq%;l\%;l\q%;Qq%;l\%;l\q%;Qq%;l\%;l\q%;Qq%;l\%;l\q%;Yq%;l\%;l\q%;Qq%;l\%;l\q%;Qq[dcJ<'\%-d?_׽{an}ݟ+GK ?>_>L>F Jx6.Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`T(Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>G3J`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>g>F%|0*ٸF%|0*Q Jx6.Q J`TK`T>g>F%F%<F%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q fF%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T£%|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T³q J`T>l\>F%<F%|0*Q %|0*Q J`T³q J`T>hF J`T>l\>F%<F%|0*Q %|0*Q J`T³q om*Yο'W N7ݯ|ӎsu>SG?,}-{]_>Żkl\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Yq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Yq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\qNfl\q;hF;l\qfl\q;hF;l\qfl\q;hw6.ٸxg❍w4xg❍w6.ٸxG3w6.ٸxg❍w4xg❍w6.ٸxG3w6.ٸxg❍w2xg❍w6.ٸxG3w6.ٸxg❍w4xg❍w6.ٸxG3w6.ٸxg❍w4xg❍w6.ٸxG\q;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;Qq;l\;l\q;❍w6.ٸxg(ٸxg❍w6.ь❍w6.ٸxg(ٸxg❍w6.ь❍w6.ٸxg,ٸxg❍w6.ь❍w6.ٸxg(ٸxg❍w6.ь❍w6.ٸxg(8׭?Qe{_U䓫x^kw;okw_\9}ݏǵwç?峌O?gU'u׏\EI;Wum_ɜ}<^\ejmx9ؼ\~%jë(~əQ\Pt>XogаǢ~>6u̯~U+:1_ccGXy3'SASz,^ukorUu|_c^uyc^w$S\?Xuu}b1׷3=|>ϏMs]oXutNQj6:y8꘯cq1_['Q|e]z,Ƿ~l`*oJ۱?cQPWjK=󻎹]\X똟:: NŻX\?Wkߟ阯9+=u|`Ǣ΃}KgǢ#W7#<Vc^ȇcHhcё~h_ŃxXt:cё~:]Hu~ܤdSܯOckXy~ԅX2uHE_: Ǣ΃ua#ﳧc`}occQ}{鱨ྭJE|]r%?I\cjGhtڑ܏tڑ:֕VyoBz~3zuYtyi^#^#_]= ϟ#^#sxVzīp#^lN׫Gg^]=՝qz,~7_2gGﯮ{kWt#_]u#^<1W=Sﯮz?#^ﯮI׫G=sx]{z:owbB7mogM]c7m?^7m?xuMMoJ׫ߴ]$]9:{>Woڮ K/W=^rߴ]WWԗ9]/YWz.7A.]=^rQ2=|pv=Gx:q'Gxx#3sԓ,]=^R_tڑ~Xz#~^Hێx#q߬xo+_=7m?~WMW^H{}Dl{ڑ:Վ}W;үKx#ͻoVtڑ~]wx#m]jGW;үjڑvz#1vx#zDՎv_?ov#~^^H~oޑWH;;߮g^#:u;xGtzGGzG=_#g4_g8;x-_#ޑ~w_?|?1wׅv^#uw<;?VzGWH|ޑ~;=G+_}m"F%mz_~_s>!&:?7H|@^OH3 i'>s(>!-:?\|@ދOH i1>s2>!mf:?wp|@^OH i;>s<>!3 &|BOH+ 3 iGOHK iJ>!m'1&Ҟ|BOHyR>!m'Q*f|BOH iZ>!mq.Ҿ|B ib>!m'2g|BOHK ij> o'6|@OH ir>!m':f|BOH|BڞOH i}>!4@}Bڠ# i>!'4D}BڢOHc i> '=4H$}@ޤOH i>!']!'}4PD}BڨOH# i>!4TT=UZ}BOH{y>!-'YFj}BOH i>!-]z}B i>!-' a҈}BZOH3 i>! %4eҘ}BZs i>! 'E4i7Ҩ}BZOH i> 'e4mҸ=nҾ}BOH y>!m'rf}BOHK i>!mv}Bȋ i>!m'zg}BOH i> o'~}@OH i?!m'f~BOHKy -?!m'1=4$~Bȣ i?!']44~BOH i? '}4D~@OH# i%?!'<T~BOHcy-?!'4d~BOH i5?!4t~B i=?!'4h,' FҊ~@OH; iH?!-')Қ~BOH{yP?!-'IF>fgfXf%]~uoߗ{מ] KIW/o' u u k[pog|ޯ_s/џ0|>_uUM -v|9x|<>KYW4{Ƿ;z/~F_~Iy`:x?~|ς_b +?!m'1=4$~Bȣ i?!']44~BOH i? '}4D~@OH# i%?!'<T~BOHcy-?!'4d~BOH i5?!4t~B i=?!'4h,' FҊ~@OH; iH?!-')Қ~BOH{yP?!-'IF>fgfXf%]~/4};ߋ޿b_Jڼu_ok{W7Zߺϵq73>xׯ9O>o~m~x¿q:*&zz]uJ;}<>@qp]_˪w"󀎿???!g&Izނ) endstream endobj 8 0 obj @@ -1247,75 +1250,101 @@ endobj 82 0 obj << /Filter /FlateDecode -/Length 55001 +/Length 51612 >> stream -xͮ&I5FOx0jAi#` -n&@ŗ2`جM߄8v\Hucז9q繞ݳ'm9Gb9p6_G_il:;1l}t aC6:HװWGǕaG1[mNװ55֊pp@q~8u>Ny#É6q~85'|Ny/^lc?^h3E|C_.W쇋m+6_w쇋mƓ=]Ûmoyb?Ot oig7ڌ~h(>lc?|5b?|fTp 6?3v8sW u9J>(Nwda;Il}~NK_@7]>]CA<{쇨ONu !njbb+6bQ5\ls~: <65D|->>c> t oj>lj>lc?|f5D|1b?D|&b -=?\:8agˇkY\vyݩv;l"\:xGꇝu:;!svk;u;Fꇝu;]C w#]Cu\.5d\x -k:! İuY}~:0Iאu>Y~:x!;!=F쇬|! _k:ElX~:C쇬ϱb?dĤ-CAN85ddLאut YJאu,]CAtYiu9b?|.t 3q5mW`8R?|ߩbƂ_k8N3lj6Hphُlj6n6Ē(]Cy>hl6=f5h36cќh3FNmnxRkftlja;6'6Om ]É6cD1Qpt 'ڌ"d9 6cB6c26kxOOڌL mgO,_hq?e,1Å6~S62w*m~~ʸy q?euYS&3~d|2Yu QO|!yq?#0~:cO'&>l)Xx~|S6q?e>lS.<~ʅ:xgOP1)y2 f\q?:Sm~uOO1aY:/ ul-\'Z(q?jl)WgruywO: uKQq~ -S.Q>~ -&`S6q?lS.Qz#Cs u?]Ëmq?+`fkwOl S.]#CA"uuY1up^q?b+\('\S.A~bϸXS~bGO,3OA\Cy;~^|Mm@Ozi)O/_OqNÿjo|]o?~'/>\ Y^,k _c53ͯ{?_AsKhh>뷏lwWϧG/~&8J8GhzΆP@(w;B?|-bќh#+gS5 ξZB^}mWf'9WfNJ21̾ȼ2ZyeuGs2 +c"{d^#0b8ޑ+2bfL4"6_3àZ~77<6?O +P ?qM gFbxPf\<6Dmgf2qDُ32ÏEf{ .p-àQC}WdyȰRdu<ؼALRY{sƠ. -[gl :<1O Ŗ1p732lR{ƽATޠhqoСjt茰&mf\81ÏjtM5 :pGS{cTޠƽATޠhqoTޠx=2ϸ|{XK5 :`jt*/ո70{XK5 :`jtR/ո7耵^q+utZ/ո7耵^qokTޠuutĜqoЁȼ~\ǽAR{XK5 :P+utXW\ǽAR{X(D2qokTޠzƽAR{|!yutW\ǽAR{qo9: :`jt/ո7耉KqoE7ո7耂jtjt L5 :pR[82ϸ[K5SZ/ոNkT:OȰW\u -X)xbj'utZoD2qokTޠzƽAR{X+ޠ]PZ/ոO7耵^qokTޠjƽA,R{X0O5 :+ޠz}w\}O\ǽAR{XK5 :`jt]O5 :qoС_q :{ƽATޠzqow=ո7耵^qoЁyPSޠOqÊOO70{XK5 :`jtZ/ո70g\}W\}+>A;>A#C7耵^qXK5 :`D u'pu':t:tx: :`jtXg\ǽA: :`jtZ/ոOau'pu':t:tx: :`jtZ/ո7耵^qoqK5t:tXq :q :AqqÊOO8WIx1耥L\1pbj'0:tq :\q :{@ƽAR{<*2 FK5tq :\q :ޠqGd(qK5 :0|z\}Kİ3>A+>AqqqokTޠzƽARz\}#>AqqÊOO7耞jt@H5thq :F\}3>A+>AqqqoTޠ&ȩ}->AqÈOau'pu':t:tx: :`j'pu':tq :f\}W\}+~T~:G!~:G!~T~:G!~:G!~O!~:G!~:CqÌ_:֯~݂sv7gly~Ly ٿ<Ɵ~#i !|'|>|O"(c[B Qw>e~CBQ![" +xMlI]7_Qc|W==|99z{=Y}}8rύ5އ#|އ#|/އ3|kǁ5p暯ÙkއWx^}xŚc}xŚ,>bOx/X3.\>s׃kWvz\}'ƫ4=Om'އO9Vk~G07|u\=>|sѝ9lGt{E|E|v}آQ>+x>lgyt3|t3t30~Ia>f}m ݇`zE @\tk&݇a5Grs}Ě}}0vއXއbzg:>p暟Ùks}qs}0^;އ6=0>>1>r5_އw>sѽ9saw=zxF|8>>8`s䚯kއoxs}0;؅w><=݇=?<<=7݇={yt3vq}س^Aa>xE0gzF'gfgNa>x݃Þ}7=f w9>xǫ=}}7d5q0xfcwCa8>> Oxf|s}f +=z!q0`>>7އcӆaps}0%=󅞞"Ea,0źa}w>އ;vO>>;#-tG5kC<݇ǚL{+==<އ#לokG~>pĚ{<@5 kއ3pE5GpsS ̕k =W96^h^?OW9^`>cSb?hyʸcq3}xǚx>s?OOSƳ>SƓk~Ě灟0?Ooy68_}ny>xI>x?O ?O?O?Ow}}=}=}mއcׂaw)3;}}0xf%އxq)' +5Ɓ?O}'~`.;Z<>x?O6St̅\gS3)יk~+=8V}xE)W5<>xVhJ o>M}0 +;u)wtɦ>xyʝ}>;?O?O?O;})wS?O>'~rg|~rg|:~rg|~kyYfޯ|0<)|o/+oczO{to-_??cI/8gu]/?Yo7|Fl>qZ/pfƈg?}eYO~IE*_w1EsI'!R"/G-6B cHc'l\n YFy/,=^UY:Y6z"Kf_kǒDI̒ %72Kfd~s@% ސ%?cR odR υL#?1h kwA~drp3mȤ~ w\R{'2)B&eO3h:䚯Kf?d~Ȥ~ { :Z&oEL㸐5F&?B&|/4t-txߓZi>e!I-o~bNL-G?eO35ϓ[pR{;Sl9bNL +Өe!xptx3̽xq)xQˠ{F=nѨǭCܩǭC:ǭC܌V!.>t'z +:z +:/uq+LLqD&<;thW-DĤٞA=nZۑI1VС^ļKq+Wz +:qEǭC'ta%&לqabR ?&t+J=nR[AVaI=nF5_z +:qEǭCǭC:2)x|[A8Q[A8Q[A8Q[A8Q[AynG=nG=nG=nG=n⬇=]>V!zV!zV!zV=1\Ff x[A8Q[A8Q[A8Q[AY>Vq֣q֣) 2tttt7D5O<ǭs9nG=nq+x[A@S[AQ[AظP[AhV!tHz +:DR[AǭCAqËtttttN=ns +: qÍOs'9nS[AV!:tN=nG=n2=ePn<}>Aq+0<ǭCǭCǭCǭCǭÜx.<}7>AqCIs +:Y{\8Q[A8Q[A8Ȭ>A qÍOs'9nG=nq+p7<ǭCǭC}qÅOs'9txq֣q֣q֣Os +:Yz'p9t :AqËt'z +:Yz +:+d24 :F=tx.<}7tx :} tt2xF5O<}>AqÃOs +:Yz +:Yz +:Yz' : <}qÅOs'9txqgP[A3} qCs'0 :L<}>AqÃOs +:Ćz +:z' :t<}qs'p9t :AOС9tx&>A qÍAz=A<}:<=A<}:9{|xts#@=txuft=0k?#?ϿcKow\={VBA/翴O`b|L$%??[???'t!Η_BzK"Z=_UٯP(,EpBQ" QXD! -(Da((,EBQ!{3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ1{3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ1{3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBQ2[3 -QxF! -(D(,(<gBBQ3 -QxF! -(Da-D(<gBCQ3 -QxF! -(Da-D(<gBBQ3 -QxF! -(Da-D(<gBBQ3 -QxF! -(Da-D(<gBBQ3 -QxF! -(Da-D(<gBBQ3 -QxF! -(Da-D(<gBCQ3 -QxF! -(Da-D(<gBBQ3 -QxF! -(Da-D(<gBBQ3 -QxF! -(Da-D(<gBBQ3 -QxF! -(Da-D(<g +l! +(Da(,EpBQ3 QxF! l! -(D(?$ޟ ߾? BO'Q tA PޒDaW񩏿}9{8ӓP89"787qH6 \ AsGpsA4crXN=&C<[Km>憋7"M,`n'_y'z`vef [Gj3Jxq>6e:ی˓igM |$m3 P,AgxAOK'sibYfibkİ͓mFKgNtOt98iJK)N݊KL <8N/q.q.Hjb);$mt"S,(;qSoqbĝ8NQql88~qa#Ӈm>8NQ?8EzqI uqq'S0Hls?8EqdUSO0]A<8m|{X9x=mi6A6:uSfў4N iz8mXqXL㴱qXI㴱vT6cV)`Ou':?ʨgf<2SY?H >KfϠm=qu'SA8elu8NY~鞲6tOYO -Aqq:")Q=6sqb) f-qbѳRY<6a<;ScivAT4N; ivA8G8鬃:ivӟpO; iv0̺[j3 wXwX{~qیQig1#Mml3Ġ7W>iv~iGZ `  S:N00ba8eӺ)# 4N1 ]11ls*#mEbĠqʈ&8eĠa•)# 4N1@u>#ĈACLZ -qʈ8eĠ2fDT#1bx1h>#X^D##1b/F<}Ĉnh1h(qbq:خ#1b}$F :Yjq6,TRY}$F xG8e<#1bp8e<#1b) Z)٣ĈA;[1}$F 0Ĉj8ed7uXGb#1bЎ}$F 1ĈA;z1Ht#SF qD޿߈|~o`Zǟ>?SOܠI0H½Rg?Pc|>}_=y'(=Y[~8'0y<3@Y|n^5yY-s+:p3 Jz -+|8wiw(K'݋9C1L\,}Wߟjzfs=s\^;z{Os^`T0ѹ>Zj|_Lb<|\^̓x ˴;9}wvHb>|8[3vݯL;;{{q-~{Nb|>^}Lp3}3݋^4݋p'^3d=ot/Pz=pY9νRQWӽ@Hu|p/0[pp/x; egOh3V Ej~{ }w3~ϻI^`MOWj3`_#>0}Nuߜ&fұkgFLuCa?݃L'}b&ѵҽuXt/P1ߌeP^Uڌ:8ݟڌ:8NL%ҽ@ݚiPGWVb -ENՆ:8'ᙇى3Wt/P=W1G`ejC0||4_mcΕ upNU5VV1KvjC!^65޽|Lfg|@|YfG4_ży#W iϛNՆ:|N:^`~LՎ:ĕupb櫨Lڿˠ~3h3 -fbf4_EAzvALFb.;upJUW|:PW;UQ*f`~uX|u3~u򇼧*:_k~u.i:P׸Ձ:0aMՁ:WfՁ:߯bXWUKmF\ f@\ҧ{:lb}fupw|ޛ ڌab W3_E!3ŮWcD~:xW|"'_wkDĬ._Ś|uX`ͨwD1|u~߯?'_O?W*}}A=W+yo{1Uw|>*}},U&iJ~>b*}c>*}j*}gp{qĠ͋vn`ڼf|J_Xw|J_{ W<1F߯?xR<*}*}U4_-_3_R^D6U' mv,>C3aO}}&i<4 WW__4_}}i-|}5_+_G|{|KZgǿ㻯\nݯ_~Xs}$c̋q߾/ZƼGʘf12SƼgd12SƼgd12SƼgd12SƼgd12SƼgd12SƼgd12SƼgd12SƼgd12SƼgd12SƼe6c>0e12=#c>0e12=#c>0e12=#c>0e12=#c>0e12=#c>0e12=#c>0e12=#c>0e12=#c>0e12=#c>0e12-)c>0e1)c>0e1)c>0e1)c>0e1)c>0e1)c>0e1)c>0e1)c>0e1)c>0e1)c>0e1o͘L)c>0eyȘL)c>0eyȘL)c>0eyȘL)c>0eyȘL)c>0eyȘL)c>0eyȘL)c>0eyȘL)c>0eyȘL)c>0eyȘL)c>0eyl|`ʘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e{F|`|`ʘL)c326S|`ʘL112S|`ʘ12SƼe6c>0gc>0e1?)c>0eyȘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e{F|`ʘL)c>0e[f3S|`ʘL)c32S|`ʘL)c32S|`ʘL)c32S|`ʘL)c32-wQ1eÚ0?=pb}37S۶?lҔ׾͔Ly즼gd{Fgd{Fe6S32=#S32=#S2)))o͔LyȔLyȔf{Fgd{Fgd[f3=#S32=#S32-))LyȔLyȔLylgd{Fgd{Fe6S32=#S32=#S1)))o͔LyȔLyȔf{Fgd{Fgd[f3=#S32=#S32-))LyȔLyȔLylgd{Fgd{Fe6S32=#S32=#S2)))o͔LyȔLyȔwn{Fgd{Fgd[f3=#S32=#S32-))LyȔLyȔLy ?LyȔLyȔLylgd{Fgd{Fe6S32=#S32=#S2)))o͔LyȔLyȔf{Fgd{Fgd;f7=#S32=#S32-))LyȔLyȔLylgd{Fgd{FeLyȔLyȔLylgd{Fgd{Fe6S32=#S32=#S2)))o͔LyȔLyȔf{Fgd{Fgd;f7=#S32=#S32-))LyȔLyȔLylgd{Fgd{FeLyȔLyȔLylgd{Fgd{Fe6S32=#S32=#S2)))o͔LyȔLyȔf{Fgd{Fgd;f7=#S32=#S32-))LyȔLyȔf{Fgd{Fgd[f3=#S32=#S32-))LyȔLyȔLylgd{Fgd{Fe6S32=#S32=#S2)))ݔLyȔLyȔf{Fgd{Fgd[f3=#S32=#S32-))LyݹuoLyN0)߻˷my`ly}͖ǒ>޿/>oEd;d=#[3=#[3---lyȖlyȖlylgd{Fgd{FelyȖlyȖlylgd{Fgd{Fe6[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd;f=#[3=#[3---lyȖlyȖlylgd{Fgd{FelyȖlyȖlylgd{Fgd{Fe6[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd;f=#[3=#[3---lyȖlyȖlylgd{Fgd{Fe---o͖lyȖlyȖf{Fgd{Fgd[f=#[3=#[3---lyȖlyȖly춼gd{Fgd{Fe6[3=#[3=#[2---o͖lyȖlyȖ̐---o͖lyȖlyȖf{Fgd{Fgd[f=#[3=#[3---lyȖlyȖly춼gd{Fgd{Fe6[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd[f=#[3=#[3---lyȖlyȖlylgd{Fgd{Fe6[3=#[3=#[1---o͖lyȖlyȖf{Fgd{Fe6[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd[f=#[3=#[3---lyȖlyȖly춼gd{Fgd{Fe6[3=#[3=#[2---o͖lyȖlyȖf;&c[͖m_inX#?Γ7y~<7g{-Z}lkf[DCv[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd[f=#[3=#[3---lyȖlyȖlylgd{Fgd{Fe6[3=#[3=#[2---ݖlyȖlyȖf{Fgd{Fgd[f=#[3=#[3---lyȖlyȖlylgd{Fgd{Fe6[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd;f=#[3=#[3---lyȖlyȖlylgd{Fgd{Fe6[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd[f=#[3=#[3---myȖlyȖlylgd{Fgd{Fe6[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd[f=#[3=#[3---lyȖlyȖlylgd{Fgd{Fcv[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd[f=#[3=#[3---lyȖlyȖlylgd{Fgd{Fe6[3=#[3=#[2---ݖlyȖlyȖf{Fgd{Fgd[f=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd[f=#[3=#[3---lyȖlyȖlylgd{Fgd{Fcv[3=#[3=#[2---o͖lyȖlyȖf{Fgd{Fgd[fKZǜÿ-P [OJ[7w_?}Lymߴg+|aߎ'<'F&#߾{/wb(ݟ{G<UEG &YijG\LBsu1Gn  x| l  ɣ`Om>憋7"dvy>`'0x6NYHmP"80l8tOCOmI͸vFT`fn냇5P/!ANLc"gLE8(= dl3zlm"'S,r?8"g`)9ca -ڌEVgX'fbqqztt@R|qb30ۏULX 8"#St7<8Noq>+q6G(tOQ:80OK/(i6N(`Ƒ)>ӏ4NQp(imFWMm>ft}XO㴱ic ƧqXf܁aۓicD9M㴱 tOYqXqXz8mz8m}>i6YIktOY{{8mq:&67qk,17CO=elu38NY[8e9S_ e'S[y8e0SA8NYOja9L 8NY7AZ8eĢg6xl:xwǺ844N; ivivw-\:ig<;SP@>84N;`!us>tX{~qیQigH ی)d>(q+SC4N;`J㴣Zix pi63"4N`TLtXA{:fL=E4!S^-07Ù+S)`_sqzXɥ{z_ی*ڼ7bIuS8NQѦ)`Nu)`aj6s͘{(>l3OH`uuOA`Ju pOQpuw,Sv0J0),`gbʟ``A\4N i xF_iA,88iA4N :luImfă5:.`DNtRHu(:Ltt}X+mnXV{:0Mu) imRl ی:u)`c?1l18e=S˂t}X58e<)9g'zZ+mn#SqLju?Sql{:YQ.8iNOp}& pO' NiNis}5R(`):2!iNAG4`Ht h&mFKmnlsi6#cq:Q*.SL#Ӊ:58 Ӗ4N' JAOty4N1`_3m>{m>zm==Srm) V=SA66cV|ͭqfea) _ q:ذډuGq:خq:)IfGf1#Kf[a6-S0S ) f- uæq悙-`GKVȀ}`U$,PEN2:8h#]ai^ q0#1 x\Xq0` 4:RY}$xD /}$Z0GbO3SZGb$t}X}$>Gbq: `0:Ohdqq:^)`B%uGbw4S>8e<#1 ) Z) ϱLׇulGbD@>ܪu8NY}$Ј>Gb1)Gb#SU4Nh}7 xxF0ӣ}7 nx#a98}{[`XG#B Nqg{7+ W l"o}N߸v=}9ǁǿs?cL!޲~߾/$׾NtxG~lL:?0uxgtx`S{FL:?0uxgtx`S{FL:?0uxgtx`S{FL:?0uxgtx`S{FL:?0uxgtx`S[f;?0ux`=SL:3:?0ux`=SL:3:?0ux`=SL:3:?0ux`=SL:3:?0ux`=SL:2SL:?0ux`SL:?0ux`SLYL:?0uxgtx`S{FL:?0uxgtx`S{FL:?0uxeSL:3:?0ux`=SL:3:?0ux`=SL:3SL:?0ux`~SL:?0ux`~Svx`S{FL:?0uxgtx`S{FL:?0uxgtx`S{fSL:?0ux`SL:?0ux`SLoSL:?0ux`~S{FL:?0uxgtx`S{FL:?0uxgtx`S{FL:?0uxgtx`S{FL:?0uxeSL:3:?0ux`=SL:3:?0ux`=-KZg|}}_{~0is-h ^~|=|>oĮ&B})gX|t S6C!_O]k~S׽b?)z -56C„ CZ<1lc?f1NKU$m~>1ZϠʹ5|sg |Mps21l3S:CρeTןR?m~H}9J!kc~H}9#CuR?l4?G _k!uLG5lv2]_?0Uy~8*ݱn쇨O6]6cd|M>?3>@Oא4%7]Cn6b?6M#Cn1c?-+Cn4}MQ5|i;Cnӌ4<$]wZ36MFܦ*5C%S??<0\CcR_u~H}I31אs}~4gvR_v~H}S!c'^R_xx=S?\upaV!S(]CYYbm'CA:^up=g쇬?gun=Cewt~:ȗ)E@\Ħk:X쇬X<~:zwY9Hאu2]CA>5dC*]CAt Y9b?d|ْ9b?|t nI!y<~y~\y@yA+-\C7Pא'qJ |#C~!J~i~ȳƑ!u1l -S?qUt Y׌)u Ƹ2_moj{3Wۻ~ -?q7%QOqy7gOq7qj8~ -?yg߾lz`\2Sz`\2Sz`\2Sz`\2Sz`\2Sz`\2Sz`\2Sz`\2Sz`\2Sz`\f2Sgd2Sgd2Sgd2Sgd2Sgd2Sgd2Sgd2Sgd2Sgd2Se6s=0e2=#s=0e2=#s=0e2=#s=0e2=#s=0e2=#s=0e2=#s=0e2=#s=0e2=#s=0e2=#s=0en\L)s=0eu\L)s=0eu\L)s=0eu\L)s=0eu\L)s=0eu\L)s=0eu\L)s=0eu\L)s=0eu\L)s=0eu\L)s=0eulz`\L)s=0e{Fz`\L)s=0e{Fz`\L)s=0e{Fz`\L)s=0e{Fz`\L)s=0e{Fz`\L)s=0e{Fz`\L)s=0e{Fz`\L)s=0e{Fz`\L)s=0e{Fz`\L)s=0e[f3Sz`\L)s32Sz`\L)s32Sz`\L)s32Sz`\L)s32Sz`\L)s32Sz`\L)s32Sz`\L)s32Sz`\L)s32Sz`\L)s32Sz`\L)s22Sz`\L랑2Sz`\L랑2Sz`\L랑2Sz`\L랑n3u?b:{xXgsJsyo)^K4qYxw\7?ogs}ݍs8f{Fƹgd{Fƹgd[f3=#32=#32-瞑q瞑qٌs8s8slƹgd{Fƹgd{Fƹe632=#32=#2q瞑q瞑qn8s8s8f{Fƹgd{Fƹgd;f7=#32=#32-瞑q瞑qٌs8s8slƹgd{Fƹgd{Fƹe632=#32=#2q瞑q瞑qn8s8s8f{Fƹgd{Fƹgd[f3=#32=#32-瞑q瞑qٍs8s8slƹgd{Fƹgd{Fƹe632=#32=#2q瞑q瞑qn8s8s8f{Fƹgd{Fƹgd[f3=#32=#32-瞑q瞑qٌs8s8slƹgd{Fƹgd;f7=#32=#32-瞑q瞑qٌs8s8slƹgd{Fƹgd{Fƹe632=#32=#2q瞑q瞑qn8s8s8f{Fƹgd{Fƹgd[f3=#32=#32-瞑q瞑qٍs8s8slƹgd{Fƹgd{Fƹe632=#32=#2q瞑q瞑qn8s8s8f{Fƹgd{Fƹgd[f3=#32=#32-瞑q瞑qٌs8s8slƹgd{Fƹgd{Fƹcv32=#32=#2q瞑q瞑qn8s8s8f{Fƹgd{Fƹgd[f3=#32=#32-瞑q瞑qٌs8s8slƹgd{Fƹgd{Fƹe632=#32=#2q瞑q瞑q8s8s8f{Fƹgd{Fƹgd[f3=#32=#32-瞑q瞑qٌsqu?`w3 kg}\ǿg_h_-z~z&q߾{X\n,v,gLj_Gu'9?kgbu<`0뚁9O0׻9yƓ?l6h3wO mHC{mܝJ =R;3ӽh9 <61h3Ťt/:Æ{AKt<:د6Z5}*s{AپFϠgNmF st/P}bLu(^bb3z?f6 0 Oxcʕ5Nܑfq~dNϠXդ*e{ܭGWRm4_l?q*eǑڌ:ƙ櫔ThiJ~O3^#W)iJٞ4_l?(9{:8}*eXR<|=-W)ۏu4_l?3up5|=WRX*e{U4_l?HU W)2|=WOUK4_lLUI\iJ~/y <:8HUОiJ~*e櫔1iJOw3hs4_lϭ4_l?1KHUs0[櫔mvȲ1'H%EvW=90%qdw!KZ{hl86W~3ǸJdQCJZ{QyP{i*پbʃF4^l?nTTo͌SmAUiFm<8t/*~h*پzFU6vJ?xUYJ?㸩͕xU}ʋƫd{xUNqSm>͕zd4^zxqxW|xWMsQy jE:Wk^́GFl4^ -Ls6W<Wk_̃GQy8Z<8zT<\y|ί](J?.t/*^ہ5/գʃ-\y^q~p~u0.m{1tWfUN%_{v Zjί0 Wa\4^a\'ί0a\W.j㪞JաøWίu_:ZCաø60աø W6_kw(݋C WeIm;ίmO_{@ ίm?ƫC ^.|l4^|]/4^!$;ί!$8:CH._|]{B2:ίBRƫCW!W!9:ԑBІCp~!$׍!Ks@Sί{֨::WOBRƫ%exUxU8*~j6 W%׿dmp~|7_7_=Wwi*~<3|d_8*~;6_l_CZ_ln¥Mg5hddzdm<8*~;ίJS^'1ڐX_fm:ίJ߮W%8*~_l_/D8*~{BpGU8*~{_}e+o'ί4}n>p~ƫlv_}ev+۷z6}Oh+W_پ_8džlt_}eWFml?ί} iW?ί9p~ϻx}[ڠMp~#o8;ίֶof@dTfD?~~z+oۦt|צ>\}{w~ _ᅳF~=xC7QQA?[>ͦK:~܅{kEɛh-QskͭQn-!9|(HJ2&CMmQweFmwsp;J'g.FITP^٨͕4$mJ5Rx'36Cݯ=js{weFm+@T[]LY t}*iLE(3hĮbt;i &9vP>Cm.FgcYgSm^z8㪡vt\zb6;6RێqzͅP/y1NСt}ЁtO騷>zyqqZ t[m>6[m鳽b)66oiCh sm`!DžUQfANmVAGypS} buSvM1MnӮ<ܕ~Sv\`WyQʃR(N6k1js(N6h/`ڬsXQkN U -`Vi7T׸0NO0NOGT+Qqz*CקZMi~K5SU$= `ׂ$V?k26oFVkDQQu*16UE_qRD>Iq+OST'W̟:ѿ8Չ|9)Nu:ѿe'ũNG`]SśT'38ՉR)Nu僓T'k]T'`S&S_y=/3{ũN*DTy*fFm>ũNE`oT'wAGyT30NjSmn8U08Ulf36W(>0ND(6@ڼ S]9u8Uܯq<TypTypFTypQہq0Nl=Չ:,T'W:ѿ S߷Ǫ8Չ}LqHMq5DqT<؞8ՉPDz:ѿ=AqSYvPDũNovP(EMQDvũNׁ:ѿհT';ũNo)Nu{8Չbj1Nڼuʃo1>[-cVl1N+[n8ʃ{CI @I *G&-b*nv6oHdP @/)NɠiWSm2h[GI T{T ndж }wn2xnMυ>һ9Gz7r/Y }wGz7< }wAuCw9(N?'ˌ6\#}6#V D}Ol -l28MH>꯽ƀϟ?UdNE}ߺMuB~ݾnE8_fA | -Ol- -|o_۷,fY\ #(@D̢̢̢̢qQ`fQ`fQ`fQ`fQ̸(0(0(0(0(@f\YYYY 3. -, -, -, -, -ffffȌ3333dEEEEE2̢̢̢̢qQ`fQ`fQ`fQ`fQ,EEEEE2̢̢̢̢qQ`fQ`fQ`fQ`fQ̸(0(0(0(0(@f\YYYY 3. -, -, -, -, -ffffȌ3333dEEEEE2̢̢̢̢Y333Z 3. -, -, -, -kQ̸(0(0(0(0ϯE2̢̢̢h- -fff(@f\YYYעqQ`fQ`fQ`fQ`fQ̸(0(0(0(0(@f\YYYY 3. -, -, -, -, -(0(0(0(0(@f\YYYY 3. -, -, -, -, -ffffȌ3333dEEEEE2̢̢̢̢qQ`fQ`fQ`fQ`fQ̸(0(0(0(0(@f\YYYY 2KQ`fQ`fQ`fQ`fQ̸(0(0(0(0(@f\YYYY 3. -, -, -, -, -ffffȌ3333dEEEEE2̢̢̢̢qQ`fQ`fQ`fQ`fQ̸(0(0(0(0(@d̢̢̢̢qQ`fQ`fQ`fQ`fQ̸(0(0(0(@f\YYYY 3. -, -, -, -, -ffffȌ3333dEEEEE2̢̢̢̢qQ`fQ`fQ`fQ`fQ,EEEEE2̢̢̢̢qQ`fQ`fQ`fQ`fQ̸(0(0(0(0(@f\ 2- -DQ?*__;=?v~[8e h mz~solzͦ۷,֦ϾŦm6}flg6}flg6}d>33c>33c>2MMMŦόmئόmئbg6}flg6}flGf3c>33c>3#MMYlئόmئόm,6}flg6}flg6}d>33c>33c>1MMMŦόmئόmئbg6}flg6}flGf3c>33c>3#MMYlئόmئόm,6}flg6}flg6}d>33c>33c>2MMMŦόmئόmئOjg6}flg6}flGf3c>33c>3#MMYlئόmئόm,6}flg6}flg6}d>33c>33c>2MMMŦόmئόmئbg6}flg6}flGf3c>33c>3MMYlئόmئόm,6}flg6}flg6}d>33c>33c>2MMMŦόmئόmئbg6}flg6}flGf3c>33c>3#MMYlئόmئόmĬ6}flg6}flg6}d>33c>33c>2MMMŦόmئόmئbg6}flg6}flGf3c>33c>3#MMYlئόmئόm,6}flg6}flg6}d>33c>33c>1MMMŦόmئόmئbg6}flg6}d>33c>33c>2MMMŦόmئόmئbg6}flg6}flGf3c>33c>3#MMYlئόmئόmĬ6}flg6}flg6}d>33c>33c>2MMMŦόmئόmئb'wgcn/K6O>{^geԏ5?nY?=/v)l^o?f۫˯{?YlضOjgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضbgƶ}flgƶ}flGf3c>33c>3mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضbgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόmĬ}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضbgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>1mmmŶόmضόmضbgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضOjgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضbgƶ}flgƶ}flGf3c>33c>3mmYlضόmضόm,}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضOjgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}b~w<&O e}{klߴeuyl{=낯7^[~翽~mնόmضόmضbgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضbgƶ}flgƶ}fl'f3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضbgƶ}flgƶ}flGf3c>33c>3#mmYmضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضbgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}bV>33c>33c>2mmmŶόmضόmضbgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmymնόmضόm<Ӷbgƶ}flgƶ}fiGf3c>33c>3ϴ#mmgYlضόmض3m,}flgƶ}flgƶ}d>33c>33c>2mmmŶόmضόmضbgƶ}flgƶ}fl'f3c>33c>3#mmYlضόmضbgƶ}flgƶ}flGf3c>33c>3#mmYlضόmضόm,}flgƶ}flgƶ}d>33c>33c>2mmmնόmضόmضbgƶ}flgƶ}flGf3c>33c>3#mmYllyLlz4H}M'߭_me_>_|uu϶WG{>oY>_~ضȴ#Li3m{`mLi3m{`mLi3m{`mLi3m{`mLi3m{`mLi3m{`mLi3m{`mLi3m{`mLi3m{`mLi3m{`mŶfLi3mضfLi3mضfLi3mضfLi3mضfLi3mضfLi3mضfLi3mضfLi3mضfLi3mضfLi3m,=0ӶfLigƶ=0ӶfLigƶ=0ӶfLigƶ=0ӶfLigƶ=0ӶfLigƶ=0ӶfLigƶ=0ӶfLigƶ=0ӶfLigƶ=0ӶfLigƶ=0ӶfLiGf큙=0ӶfL>3큙=0ӶfL>3큙=0ӶfL>3큙=0ӶfL>3큙=0ӶfL>3큙=0ӶfL>3큙=0ӶfL>3큙=0ӶfL>3큙=0ӶfL>3큙=0ӶfL>2m̴큙=0Ӷfm̴큙=0Ӷfm̴큙=0Ӷfm̴큙=0Ӷfm̴큙=0Ӷfm̴큙=0Ӷfm̴큙=0Ӷfm̴큙=0Ӷfm̴큙=0Ӷfm̴큙=0ӶfYl{`m̴큙=0Ӷόm{`m̴큙=0Ӷόm{`m̴큙}fl3m{`m̴큙}fl3m{`m̴큙}fl3m{`m̴큙}fl3m{`m̴큙}fl3m{`m̴큙}fl3m{`m̴큙}fl3m{`m̴큙}di3m{`m̴3ci3m{`m̴3ci3m{`m̴3ci3m{`m̴3c>2}LmU}um߳:^ҿ6ezV=(5{?~o߳|?t+[/>S)>3.="馱_O#^aMG̼S7mQeFMZϾQk@nBPM2 jEtS{'2n:MQ;APMua?ty_5T9*gb?tS%x쇚n=CM7c?js5js=jݱj&KѴv`?<5Wii6^zK~xUoyĨ~x5kx׍V6᭩H=Sm~ڎ6˒khh|NdFm>;C-Dy]vK`5ԲKUc?ԲX5ԲqwZv9귧ke"tJ˃tt-'Q?^~(Ѷџq?zJGF&JGNk}~(9+}5T%f쇏9m5|c~hᱩ~xljyQ?<6|kR^kY|{Fث{ߨ{yokش_Dt g~xH?t w~xH?DPAS?<K3CAEW?'W?8.쇯~cb~(R_T[a?~P%CD\5~PIA-0z J?x6za?<_Sǎ)fb?~PxJ?G/CNJ?(5zJ GjJCypt\O9GE]C1p=x^S`ԩCyp<2 SzP< بUp=e(' P?ʃ)Cy|p=e(VXP?ʃ׎)Cyj2>At )Cy:q=e(^ A-k~o74 |ow=GrygՂ&/"zl5bփ}lI)"nǓz,jV#띘jȌ|Mwbzk]mncfp7=p;=G e^03w1wO1t6sxu\]6C"@{Q -=js=q\aNZ"Eh݋lLoѵS֘SxzU6jsR\]P=jV^6_ώqZ7cq\7cqI|wKmn;6Bmm8CSt}6~Smi‰qZ "7[m>6[m6 Q2=}m84x= Ty]Ʃ`;S6Sc*`*TyЏ`S - STyFʃ1Nkq< Lʃ_0Q*jڈڬ<(eڬ58j~b>js%kzbVzbV:+\8)NqRj@Iq}^ T*OSc?)N/'ũhOq},;)NIq}<)N׋7ũ38>^/EP8>^T*&S<:6kie=UsV26Tz}ũXaPj@8U8Ul8Ul:jsƩ`)Ʃ`ZNGyӅ`x(Ql8Ul8UܵCj^t}k`*8U8Uܫ=UImVہq<(y஝ T8UTypST*SwƒT9/*3js;(N@'&QjI8>M#Qj@V>sPũc8>hF8>ũg;(N@Sq8>ijBq}:T}tShw)N>Cm:iw ]ʃޖ1N+-cVt1NO;6qz{8cVԔ0iVo;yuʃ<;it[m>:6׈6q{8}aVlbVlu0N+HQj@Kq}M)Sh8>UW$Fmn"i@DGq}8ũhiTZ (N(T*}}8G>V/j,Hq}՘Fq}FbAI*[}}#i@^}T)N.2HzCIZG>z}uCG>V?8U(8Ul'HP}$h0Na*jSAHmVlH;q<=FtO*c*'HPq>T }Z8U>{3Sm.#iɠ8>#i@:HK(NFq}mGz<H>F\#}w6ksx:H< }w@uCwl}Fqpp[+KӲm?]˼ J.Ww׮^?7T~}6&)MG6і0ij@ m!֡|x߾ehȮgs(k׼ k$Čw]b{q]?^Uhݦ^w#ɑk]>^Cl&ڠ!feisƫ:gWr^z4^958iṣ瑙ʃcc6W¤NisGWu~ z0`;A1ίO6WIաk|kPݵh:TwzxuGsjLաkRHq~u|x^8:Twm{"3PѺ4^?:_?Z 9?z016[WOn_=U.W} ?[&߁>ίʯEU*GUvME3ͪ77___p~| _=ߺkwz`ίʯxU~} iq~U~[Ԡƫ!kԋ)l8*~әt/ToOQ-"ٴ5p~U~v8*(ίʯW ίʯt"Yuמ7{DBuמWs9ۉ9h7_}ίK6{񞳯p/sہ9:.^9dž_t_}ׯa W_4^}z?JB~p~Jׯ?NׯAn׫6݋Տ_ǯ8z9ll__o?'~W:wC9h_gՆz}0*A۾^˟VZX~ QYS`4mif4=5v5^Mt ;գXQOmɌ}6*k -)0,]CMOջAjrFf>S']wzJR1j{|0]CMOׅPS}a?T|AX쇚CMO]:MCMO]c~8s~8a?0nlȌ|vZy8IڬeF&J_~(}gkCϦ=T J_??۽Q?^FPJ_ꝍa{qQ?m83>:C5d<J_@װ~~ߩ ᡩ]ˌᡩvc?hba P PxvZio&`|ifLP4LP4w~e~Lӯ i}c?|iiF4:LV̻Lc?|iƎP4P4ڒIP4ݱjF5jflC-k(}]@R?'*Pmp ?㼩J_P?~(}9R*h9lߨJ_ζS?^CFP -\S?^T~(}9NP*~(}9APzeൟva?TPyRq2be/ʃ׽a?T5T5LLn*]*=*j2&*%`a?Tʃ*@zwoʃp5TTk<=]CA=***V~xxKP׿u<|^u*S^}}\x*S^}p=!PyP5|zʫD^DS^}n>W_Mׯ S^}q=ׯ)~u\OyW_zS?|W_n\OyW_7\Ozx)}zG_?p=w?udOCu"4n|lJ tY?Ǘ~َrrB?}Meg+TF]HW=T>SFNS59e}Ħ:ZikLBjjv0:|.2&*U)3̨u#nֻW1J9s(Q]8rv;m:r6W.8j(ijRNQӮ67WfFmU y{]LY[\ {"?t'^A3v -s5*唙6W3}8jVk6_ώqZDc;q];iՋՎqZDǥ'&1jcjs1N/ڼڼJX>SD=wz0NH1N+֛qzdžqz}8}cGm7Gm6Jv=`WyQʃ:j -b6jjf|QkN `Vi.O~ T TtOORM\2t}*jqZytaVgT=GsGFy.ũz8ށzF;v)NwIq:mT{TnT{Dq^ 3[T{r=U쟳Y26T{z}ũXaPj@WMG>ʃsjfʃMSmn8U08UlZNGyq<>Jdj6oTyp׮bbNʃ50Ns`*c`**#26TyP]]9T28UTypSP WS<(Nw S猩̨8DqZ8M#Qj@ӆX>s;Pũc8ށũ8ށũg;(Nw@Sq;8;jBq:QT{}tShw;ϱj1Nڼuʃ?>[-cVl1N+[n8}$>JʃMQl'H;P}$h0Na*jSAImVlH;;q<}ItO*c*'H;Pq>T Z8U>3Sm.w#i֠8ށZpOwm}$)';P]u8ށm#{}wsx.޽ω>һw@gQw9Gz<}wGzT78}<HFq;)eG8G@Cԕ%iYց΁=.[˯>];hFή߾Ovmo%]m{Ye?gwވj(utI_ƣp~]~uo4>*Ԫ? f_~Y7_nſz-\J{VO[z7+zSO%yo_#o?v4ӰV2ݿ6i٨״3)pw_. +l! +(D(߲=gpN1ˁy-&1H $ 8`rgH,7{H\`h gKĊ[DG8[5O21p5Lrqxv^0O;1.hhilhKO5kr}–xz\sv5K9Zxޓ +4 <'UhiҞcA0"-0yV!&Ikc\s5Ӹ4N#-qt}b)?:Ӹ\8N\s?N\s;N\s ;ל1N`)eG8:e 4NI#i4F'<'77|Xo8N :>8bAu`4^;T:&8Nۑki4`bg ״Uig9!=?Ee -`\Ӗ}0.5g-(9h/i>47zN[8Pq:mRq:m{T5Ǯi_Ӗ}ee3xɤ5gl192{&4`^mXcu}4`잱N5>آ5>xJL9:>CN3ikiDcf] i8ܴGl}xPѕN{8Sq֧:PӳFס:5GoyFk>iio85mPk*ksͱ#5\sJ%Ěh_D +:sT=`YtM@k8КGL9^\s \slFmi iSX}X=o+'9W9C5G5߹8њ\szĚ k4`PM4`o 5 '2z~\sN\s4oo9]胱]NzaF3nVx~2bqQfĠπf :͈AqfĠZk>/ӌEuSf %ӌNu 9SfĠ4#}QfĠǡ4#.ӌxN3b:͈AN3b}nJu詓4#=nhӌDT1N3b{Iuωu}4`Nk}ŖivOQX\grͱrz~[X9Ncbf;i3dxu}<iX5>x<4-15g JpPf`ɈA?5͈A?iF ey&| ӌHT1hT'`{Au8ӌؠ:͈AڎT1hoT1hoT1h9N3br]ViF 4#:͈AKÎ[uG:}rͱ#k[:}sg:}sG:>:> :Mif31hqRf u4#-^`N3b;57T2b.RF Z4pӌGT1h:͈A]iF GʈA6Hu5ӌd:͈A,QfĠEgjE)#-GʈAGʈAH1H1WՓ4#$H1xA)#qAGʈAu}04`GʈA<#eĠMu}0~u}0B-*@)#yENH1h,cf }_ Ο]"^-~"9e߽E oE &oXQXXq3{ ʿc cuIs32G"9Zdn}Z>5bA"GEW[x>Lp-rM9`ϯ5G>t-'ytI"` ҵ>|_s`+=13k}0ՇEq̕!LxƓ}p#EZ9tKGoگs1wfV3of#Nگҵ>8F_͑c\9?I?r"9j_͑͢jWrZD9!Eqr3=}zNگWsWs@_گ@گ~5Ggޗ94v9"GϜ "GNjqj>iˌh#cC{~5Gh_͑39?9?^UCk>dH?~5G%~5Gq_͑3.WsWLyƟE9A/9~w=kίk}p9XSZsگ3Ws|Yk}p>נjϔWs|-}pfE>/Ws܅Wsuŵ~5G_@}:xhs/W_-c̴_n-_io~GgDgbUr5=  $ҵ>xe E+2е>ۍf໫#`N1jT+n گ>=﯎Wh{|~uD_|sĚ3">[6|uDWL̋﯎cFLj\o9&lj﯎1s#`~q Wk3=k>o|uDہ[jm_u0:W-ӚN _sW _~uDǃ﯎wlXi:sqf +WG; +E-jոۿwhsXKk>xǂh:k}0S_Y0_W|:{&_s0:_WG~#x~K]J_9<>JWg~%xk̯o:+h:+uҚ+Wg~%xWg~%xʹ_t-+Ǎ;$گJX1Wg~%|uu̯.|uWKWg~% Wסӵ1\_ Jp|uՙ_ AkչWg~q3̯;n|uW|Zs~yPWg~3.M_U~uWhj5Wg}M.:Plj*Ըh:PǍU e_Jb}*s}j?h:W^굾 +m_>aױ_P_MW~j4 گ^U9|ud5WMF+ +SʢjGfZjW֜_}s6|5}jO2h>~:WpzW |Z_w㧞KcKﯦn|5}#6_My2vǫ>1_|5}jjGؠk_}sQJL~SڷW_M|5}j3@ﯦXFZs~񏜓D"}5?ϑ _]#~u?F_]#SNkFg8F;X k^#s8\5?X#ǁ.t|up,?3Ӛǟ _]>~li|WJעW/_]>ߝML~M9-\>=7|w|׶fïΖ㫏SwS9-}:>)_~=ݬ󳵮hקq']ϥ__o}]ݮzȮzȮf{Fvgd{Fvgd[f=#3=#3-]]zȮzȮzlvgd{Fvgd{Fve63=#3=#2]]]oͮzȮzȮf{Fvgd{Fvgd;f=#3=#3-]]zȮzȮzlvgd{Fvgd{Fve63=#3=#2]]]oͮzȮzȮf{Fvgd{Fvgd[f=#3=#3-]]zȮzȮzlvgd{Fvgd{Fve63=#3=#2]]]oͮzȮzȮf{Fvgd{Fvgd[f=#3=#3-]]zȮzȮzlvgd{Fvgd{Fvcv3=#3=#2]]]oͮzȮzȮf{Fvgd{Fvgd[f=#3=#3-]]zȮzȮzlvgd{Fvgd{Fve63=#3=#2]]]ݮzȮzȮf{Fvgd{Fvgd[f=#3=#3-]]zȮzȮzlvgd{Fvgd{Fve63=#3=#2]]]oͮzȮzȮf{Fvgd{Fvgd;f=#3=#3-]]zȮzȮf{Fvgd{Fvgd[f=#3=#3-]]zȮzȮzlvgd{Fvgd{Fve63=#3=#2]]]ݮzȮzȮf{Fvgd{Fvgd[f=#3=#3-]]z, nv},O_iwCv}~E}^p_~z]oͮz`ʮz`ʮz`ʮz`ʮzȮz`ʮz`ʮz`ʮz`ʮzȮz`ʮz`ʮz`ʮz`ʮzȮz`ʮz`ʮz`ʮz`ʮzȮz`ʮz`ʮz`ʮz`ʮzlv=0eSv=0eSvgdSv=0eSv=0e{Fv=0eSv=0eSvgdSv=0eSv=0e{Fv=0eSv=0eSvgdSv=0eSv=0e{Fv=0eSv=0eSvgdSv=0eSv=0e{Fv=0eSv=0eSvgdSv=0eSv=0e[f))=#))3))=#))3))=#))3))=#))3))=#))2]L]L]]L]L]L]L]]L]L]L]L]]L]L]L]L]]L]L]L]L]]L]Lz`ʮz`ʮzȮz`ʮz`ʮz`ʮz`ʮzȮz`ʮz`ʮz`ʮz`ʮzȮz`ʮz`ʮz`)=#îz`ʮzȮ))3?z`ʮz`ʮf]L]v=0eSv=0e{Fv=0eSv=0e{Fv=0eSv=0eSvgdSv=0eSv=0e{Fv=0eSv=0eSvgdSv=0eSv=0e{Fv=0eSv=0eSvgdSv=0eSv=0e{Fv=0eSv=0eSve6))3))=#))3))=#27˼Ƣvoÿ]ߣ_{=ŸϏ~`ǒ=N\y`:68rcK4HAܢؓQ NN[15&8Nۑki4xvV5 bӖ}0_Ycf!ihXTT5N\sNeƮ4`znZs#^6y׷=X:Ti*zN{#vа}i3DuڳFס::7iGPM=`'`OQio85mPk*ks͙ &[Hz~FN]@}?Muڣ纩NsCjoT}3DLT}U5 56i&`FGj̓A4`4`uz$G5^bXAU;Gz~V 4`:>د8T5>4` iOvL9~Lϓk ]7͛kIČ :_X~NfgWd:L@pM3.N.Gs^Tg &샱:sQ#&[&`<=T#`NG84Rq(:: :RqRќ^Zsxa::ㆦ:Sk}0~>ۤ:s=?G"Lűi[Z=NFbflsI5>:>:>2OLXu}c=?{bfx4y GlfxAu:>\ә}0CpMgT3q ӸHTnyi9phPqTQ4Au:[y F䐤Au:[ s:=| }0ߊ:Q0Ϡ:s}ŶtFVЩN5Nu۾`{5援ek>;54`ߎu}i4`u}0N4`ӎuzG:rͱ+5_ֱN\sjd䚏u}0:>ⴃu}0dz`FlձNƖc>ѱN\s>ֱN\ٱN\ѰNNxNNQ^[ܰT`f:\hTqh+L\sC)("]g@>8^iTW%P^cLu#rf]qP:M? i-cњ'Zs}:M?#>Rq@)xU=Nx'}[N'`?GJ?^}GJ?.(H)hX[>.R}[dX :>w!iZsv^Q>RcfR>R#24vtR4UqEi>}%HKAuw N#-y%?AnIF#_#Z jSw)?.w`?u3?W{3a??}8C{ >.?~pAȹPc]/AZ-㿎g_#&۠~hPCAѠ~hPg43omPg43 [f {F=A{F=AѠ~hPe{F=AѠ~hPeAѠ~hPg43omPg43 [f {F=A{F=AѠ~hPeAѠ~hPg43}Pg43 [f {F=A{F=AѠ~hPeAѠ~hPg43oAѠ~hPg43omPg43 [f {F=A{F=AѠ~hPeAѠ~hPg43omPg43 ;f {F=A{F=AѠ~hPeAѠ~hPg43omPg43 [&'t|w=AѠ~hPg42۠~hPg43 63 {F- {F=AѠ~l=AѠ~hPg42۠~hPg43 w>3 {F- {F=AѠ~l=AѠ~hPg42۠~hPg43 Р~hPg43 63 {F- {F=AѠ~l=AѠ~hPg42۠~hPg43 63 {F{F=AѠ~l=AѠ~hPg42۠~hPg43 63 {F- {F=AѠ~l=AѠ~hPg42۠~hPg43 63 {F- {F=AѠ~l=AѠ~hPg41~hPg43 63 {F- {F=A{F=AѠ~hPeAѠ~hPg43omPg43 [f {F=A{F=AѠ~hPeAѠ~hPg43omPg43 ;f {F=A{F=AѠ~hPeAѠ~hPg43omPg43 [f_֚ mwԠ-}:ݯ_[ws>A|Qߎ_<<߲=k뵖12-1L1L1L1L11L1L1L1L11L1L1L1L11L1L1L1L11L1L1L1L1o͘y`ʘy`ʘy`ʘy`ʘyȘy`ʘy`ʘy`ʘy`ʘyȘy`ʘy`ʘy`ʘy`ʘyȘy`ʘy`ʘy`ʘy`ʘyȘy`ʘy`ʘy`ʘy`ʘyl<0eS<0eSƼgdS<0eS<0e{F<0eS<0eSƼgdS<0eS<0e{F<0eS<0eSƼgdS<0eS<0e{F<0eS<0eSƼgdS<0eS<0e{F<0eS<0eSƼgdS<0eS<0e[f3)c2)c2=#c2)c2)c32)c2)c2=#c2)c2)c32)c2)c2=#c2)c2)c32)c2)c2=#c2)c2)c32)c2)c2=#c2)c2)c21L1L11L1L1L1L11L1L1L1L11L1L1L1L11L1L1L1L11L1Lٌy`ʘy`ʘyȘy`ʘy`ʘy`ʘy`ʘy`ʘy`ʘyȘy`ʘy`ʘy`ʘy`ʘyȘy`ʘy`ʘy`ʘy`ʘyȘy`ʘy`ʘy`ʘy`ʘyl<0eS<0eSƼgdS<0eS<0e{F<0eS<0eSƼgdS<0eS<0e{FƼen>y:߆/c>d3ݚϹ2:Ѽk=Y_Ly=ŔϷ~q0bSW?ݽYǖ3_5ێly`ʖly`ʖa[f)[)[--L-Öly`ʖly`ʖa{F<0eS<0eSgdS<0eS<0e{F<0eS<0eSgdS<0eS<0e{F<0eS<0eSgdS<0eS<0e{F<0eS<0eSe6[)[)[3)[)[=#[)[)[3)[)[=#[)[)[3)[)[=#[)[)[3)[)[=#[)[)[3)[)[--L-L-L-L--L-L-L-L--L-L-L-L--L-L-L-L--L-L-L-L-o͖ly`ʖly`ʖly`ʖly`ʖlyȖly`ʖly`ʖly`ʖly`ʖlyȖly`ʖly`ʖly`ʖly`ʖlyȖly`ʖly`ʖly`ʖly`ʖlyȖly`ʖly`ʖly`ʖly`ʖlyl<0eS<0eSgdS<0eS<0e{F<0eS<0e{F<0eS<0eSgdS<0eS<0e{F<0eS<0eSgdS<0eS<0e{F<0eS<0eSgdS<0eS<0e{F<0eS<0eSe6[)[)[3)[)[=#[)[)[3)[)[=#[25l|kfΖ??}L_뿧=?|Fs𲞼/3*"7#z_zo_7#QJK޷p=/К=e/5kڞ%tM{9=]{<kTпgTQ)`Tgr3O*h~NZ5-F5KtC49q?N3buq8IXqwbk'k'kn'k|皏49#vXqq:Ĉirby`Fq:}r:}r:}%b:}sǁumpfiEO:oP#;Ti;r:RAu\sܪ3"Nuڲ \Ӗ}0i>eEӚ\s{N[hT-rk?Kuڲ:mRzN[>_Ӗ}Ǯi_Ӗ}e- i"&~>!OĚ[~4F̓4`wtMbf:i_샱{:>bG4`C4Xa샱;:>M4*1ikiȱLص`fCMk>x=?:>xi>xGLˠCuڳٟg[-胱4`PM4\4`iOL9d<5}sѼ难Au}0 4`i{&zE/K4z`0:~4z{0:}D0Eu{`H >[~ӑ}p<>8>eCu:tdC#>"ӑ}0@ӑ}0ӑ}0.,>7,>5gVӑ}0n1ӑ}0nhӑ}0Q샽Mӑ}0\}2Ě[+flk}4`)i6\s샭O샭M-䚏u}0X8}'iX9Nq5>x~$:>x4y GlfxAu:O~Sk:f>xtfcFlqZ:>cFSn:>c^ѱN\sJhWu;לj1cF̷N8`F̑-Xuu胱%XOyt';2Ou7|v7|4-@-胱mTW7,i,7٨N#<irX +{&PEJ0'Hיk>PFm+x}0v TW Sf 2 r]qP:0@vA Ek>h>Rri>RZG0@/G0@TiAƓ>RZN"'`?G0@a#eE:>2bLvayG0@ 4`Bk>2 W4aϱNH?u}0Vu}0X}l#e 2 >RZs`f +/H+ >#0{> +:]awoGiކ> +mHu> +uR*m~>_eS۬:G[?W-h=zLd2>T8T,1*CO]9PlW:?~PS~:?;"Iǡgt*_ђCeCO}fK^m[:?'fǞCuxPikp6hފqxV>c[C;5n<k|MphvڇC|85zL}Vtbuȧ}4{ i1;8c}?q41qxVb>Yq>i1M} +ǡ+i1q8c1ӌǡӨ P&Lǡu=~JǡG}|(>TԟP3'ןt*_,l8l]q|95fKǡGcڇ׋h=(8Tj}qZxj>CW }qxjY2c'x}qxj5Oڇuǡ{qq{*|88)ijԍ5ClڇX<5ևxj i^;uA ij}ڇ&A`ij#gy$G#fڇI#n^w\qtj8xPͫJǡ_Nǡ_T}aje$N6CM7qޖCM7Z<n~li*WX=n~Y?S Q>TPq:sq +7W8xn'm>x*WxMF|?8Ti*W x*W5a]2J,Uڇjǡrw]`+uAOF|x*WriohXM7h+C +PBP2+w|5{<+h}o,k|"s<5=>Ot˨,Cc)n^W:5RW8tKtj:M7K|sS4rny_cIǡOt3Se<5Chy_4_ڇ+>Otu)h~yOow)n~7x*[Ot󫦄Pͯhy}Lǡ_5sڇ->OQn{||}ݎ~)וphPOykS|:7_F|=o~]yʛ_w|)<3|=>OG|SO6}]ohˀKƝW'^u?V+?_rs}/=O(`\gr=.׃r=.׃r`\`\u6.׃r=.׃r=.ٸ\`\`\gr=.׃r=.׃r`\`\u6.׃r=.׃r=.ٸ\`\`\gr=.׃r=.׃rTz0]z0]qLtLtz0]z0]:tLtLl\z0]z0]qLtLtz0]z0]:tLtLl\z0]z0]qLtLtf*׃r=.׃r=.ٸ\`\`\gr=.׃r=.׃r`\`\u6.׃r=.׃r=.ٸ\`\`\gr=.׃r=.׃r`\`\u6.׃r=.׃r=.ٸ\`\u4SLtLtz0]z0]:tLtLl\z0]z0]qLtLtz0]z0]:tLtLl\z0]z0]qLtLtz0]z0]:\`\`\gr=.׃r=.׃r`\`\u6.׃r=.׃r=.ٸ\`\`\gr=.׃r=.׃r`\`\u6.׃r=.׃r=.ٸ\`\`\gr=.׃r=.׃rTz0]z0]qLtLtz0]z0]:tLtLl\z0]z0]qLtLtz0]z0]:tLtLl\z0]z0]qLtLtf*׃r=.׃r=.ٸ\`\`\gr=.׃r=.׃r`\`\u6.T{Ruu$b,MO%?Z5G~Sq?9h✍s6.ٸ8gTqq9l\s6.ٸ8g✍s4Sq9l\qqf*ٸ8g✍s6.L9l\qq98g✍s6.ٸ8G3l\qq9h✍s6.ٸ8g\qq9l\s6.ٸ8g✍s4Sq9l\qqf*ٸ8g✍s6.L9l\qq98g✍s6.ٸ8G3l\qq9h✍s6.ٸ8gTqq9l\s6.ٸ8g✍s2sq9l\qqf*ٸ8g✍s6.L9l\qq98g✍s6.ٸ8G3l\qq9h✍s6.ٸ8gTqq9l\s6.ٸ8g✍s4Sq9l\qqf*ٸ8g✍s2sq9l\qqf*ٸ8g✍s6.L9l\qq98g✍s6.ٸ8G3l\qq9h✍s6.ٸ8gTqq9l\s6.ٸ8g✍s4Sq9l\qqf*ٸ8g✍s6.9l\qq98g✍s6.ٸ8G3l\qq9h✍s6.ٸ8gTqq9l\s6.ٸ8g✍s4Sq9l\qqf*ٸ8g✍s6.L9l\qq98g✍s6.ٸ8'3l\qq9h✍s6.ٸ8gTqq9l\s6.ٸ8g✍s4Sq9l\qqf*ٸ8g✍s6.L9l\qq98g✍s6.ٸ8G3l\qq9h✍s6.ٸ8g\qq9l\s6.ٸ8g✍s4Sq9l\qqf*ٸ8g✍s6.L9Bq+v8-y߹ϯs/;G=c?FL{3tx&5X?׻x05g]B~qB^2Gx-f#f=gN\~յvz-j.֒mmME]`z-j cǏb{ݿ968XP 6s]鵨qXNE2'5֛|]r%;zE68xMms}IWrU}]ݟzU]W^Ul˝WƱmq6tؾ>*lzUq|τ鵨qH׫tP^qzUQoczUq5]*-]*?uO׫8FzU}}<UYI׫gYbttؾ=]*KPl_`Ug]սVj2L׫{u4_zuq.7tZexwq0]֙(]uz#_=j<-]ֵR&dLL\yj]yգdW _exq7~68x>#_W0R^Wr5^rDkXδ5Gxqږx>պ.sG9[:胩qգބj}QUtz8xhW`M׫G8TWkԉWʧ2gZG7}0]ZM\UWWg߮{WY5M׫5|mwtZex$$d9CԡWMB22l$$~aGzCOq]Z MƵmd\Mƥ5gh2md\W&gk14Wzuh2zL׫CqN;;X:4׸NƵd\zuqx'zt:4׵]WfMUGj^աɸ-_d\5zuh2}md\M\ЗZw"xu}Zxf}zա/_g:wxuoJ׫C_.WNrNBR?O|C_zuLB﯎w+_u٧աIHMBR9]MB2xuhH׫CtzjSS +%I}m>w҆x$$ﯞt :0IH+_=w2eK۬IH K׫&!W+J׫t~YxUoΤm֗-_Ul_*_'_=/_o~z{O׫їxU_bXUuI*}.ZbW׻X~O~9xU}bEWf}`xU}b>U(_Ul<˙B]^Ul_{~yx=_}cW~yt5t7_G6]ol_W~Oa~a~?7߯x%_}ccW87[fcWؾ.ۏ'_}csW۟WZGj ^_N~A _KxgG6],_[_,!^I/~>et|/oM}~,9Oy-ޟS(3zB/zuEO?>u Ǐ"{fDSB{,1};Gr7}:"mMĦ6.֨QX$"MoBD)gS\WA`s(*yg`M>=lhmKۼjw16z!«e[˹֠q<;s0&Sƕ%ms 5hԕ{Xn%=5ݵ 665ݵMm$STLgh](|3tIkMZ{$2ǚ6H<",ms}xOk</ᩮkxxԧxcmޗx>6KAmtf'gmޞtnk8Mq=IqptnIqp?tnt8UIzM5M=<4%IOdjqPg`:Oy8ӽA%v<mzyyfM6kdu^u&TyZ`gB,/jo=wUO}]AV;|ˏo~ljk{&]#j`k`k{6>>ٸk`k`g>>ڞk`k`k{6>>ٸk`k`g>>ڞk`k`k{6>>L}0]ӵ}0]ӵ=tmLtmLl\ӵ}0]ӵ}0]۳qmLtmLtmƵ}0]ӵ}0]ӵ=tmLtmLl\ӵ}0]ӵ}0]۳qmLtmLtmƵ}0]ӵ}0]ӵ=tmLtmLh>>ڞk`k`k{6>>ٸk`k`g>>ڞk`k`k{6>>ٸk`k`g>>ڞk`k`k{4SmLtmLtmƵ}0]ӵ}0]ӵ=tmLtmLl\ӵ}0]ӵ}0]۳qmLtmLtmƵ}0]ӵ}0]ӵ=tmLtmLl\ӵ}0]ӵ}0]۳qmLtmLtmƵ}0]ӵ}0]ӵ=k`k`g>>ڞk`k`k{6>>ٸk`k`g>>ڞk`k`k{6>>ٸk`k`g>>Tӵ}0]ӵ}0]۳qmLtmLtmƵ}0]ӵ}0]۳qmLtmLtmƵ}0]ӵ}0]ӵ=tmLtmLl\ӵ}0]ӵ}0]۳qmLtmLtmƵ}0]ӵ}0]ӵ=tmLtmLh>>ڞڵ}0]ӵ}0]ӵ=tmLtmLl\ӵ}0]ӵ}0]۳qm槹{P9j&ѣ\Tۿ8W{ojwWӟz_j{Km_2q2H\k{6ٸgڞk{4SmƵ=l\۳qmfٸgڞk{6L=l\۳qmƵ=gڞk{6ٸG3l\۳qmƵ=hڞk{6ٸgT۳qmƵ=l\ۣj{6ٸgڞk{4SmƵ=l\۳qmOfٸgڞk{6L=l\۳qmƵ=gڞk{6ٸG3l\۳qmƵ=hڞk{6ٸgT۳qmƵ=l\ۣj{6ٸgڞk{4SmƵ=l\۳qmfٸgڞk{6L=l\۳qmƵ=gڞk{6ٸG3l\۳qmƵ=hڞk{6ٸgT۳qmƵ=l\ۣj{6ٸgڞk{4SmƵ=l\۳qmfٸgڞS۳qmfٸgڞյ=hڞk{6\]۳qmfٸgڞյ=dڞk{6\]۳qmfٸgڞյ=hڞk{6\]۳qmfٸgڞk{6L=l\۳qmƵ=gڞk{6ٸG3l\۳qmƵ=hڞk{6ٸgT۳qmƵ=l\ۣj{6ٸgڞk{2smƵ=l\۳qmfٸgڞk{6L=l\۳qmƵ=gڞk{6ٸG3l\۳qmƵ=hڞk{6ٸgT۳qmƵ=l\ۣj{6ٸgڞk{4SmƵ=l\۳qmfٸgڞk{6̵=l\۳qmƵ=gڞk{6ٸG3l\۳qmƵ=gڞk{6ٸG3l\۳qmƵ=hڞk{6ٸgT۳qmƵ=l\ۣj{6ٸgڞk{4SmƵ=l\۳qmfٸgڞk{6̵=l\۳qmƵ=gڞk{6ٸG3l\۳qmƵ=hڞk{6ٸgTۓinG?Vkw/~׼oMb~|/Uc=|w]B=|_~^K>SC<Y.ݡ^ϖL}<'[76ﭛGmla +Fu+Rm~5wm*>=xmP]=lLF\S؇u:џ>}Y +:Cϲ]8TԈCO]P9m>T^O:?˽P9zt*G-t*G3X:lqY?0ݦ>t*GK#]ӧ}k]\eڇ{k[xnw<Zx88q5ámOimX8c(C=vOP]r>cvڇzG<e?F<C=v3z_W<e;sP]zHP]=NF]>ؼ]x]FڇzRq.eڇzr{<娿}ڇz2#z좊3C5,t*Gt*GJǡrG_P93;џq=8TP9sv2z.8T5|}q5*eLPmP9z}2?q9CYFڇǡ>8xջPڇǡK8$>F|qqPVڇ{ǡn>8x/k<5޺yLm88=}Gs>xj͔5F@ڇ!6C,C<5>}\{P.8>82CzOPޤ>8,CupP"91G<ʹ=bG:e;8<m8qx,Jh+ǢmtFY؇Ǫ˓ccmI6cm^뷥}Q~}$JPzn8<hvCԇtCs:u3o~p\8|8NF|8T~P8sǡpǡPǡ>\}x*?uQ.>T~~'?m=qqxG|r(?8T~P09i*?K|RWeO%>O5>O->OcIX(>O3>O Cy)C)C`85>O->O}phTZk)Cu)Cu)C㠾[S7P`}ǡ:qq>qy8xy8x_y8xy8x?y8,y8y8lg<5UK<5>G|24>#>Oכ)C`}ǡAiJږOow)C^qPr)C)2uSNex˛)2uSNexI oS^]aT>yʩ >V1>OQn[|}OQ[|}xJG|}OQ֡u(qq6qq.qqpyʛ+>OysxqqpOys{S^7G<哣y'G?eO$~jMKkcE~w_}/W} __s׼o^-chjw~-zϿ?ïG\qf*ٸTgRKu6.L:l\qƥ:TgRKu6.ٸTG3l\qƥ:hRKu6.ٸTgRTqƥ:l\Ju6.ٸTgRKu4Sƥ:l\qf*ٸTgRKu6.̥:l\qƥ:TgRKu6.ٸTG3l\qƥ:hRKu6.ٸTgRTqƥ:l\Ju6.ٸTgRKu4Sƥ:l\qf*ٸTgRKu6.L:l\qƥ:TgRKu6.ٸT'3l\qƥ:hRKu6.ٸTgRTqƥ:l\Ju6.ٸTgRKu4Sƥ:l\qf*ٸTgRKu6.L:l\qƥ:TgRKu6.ٸTG3l\qƥ:hl\qƥ:TgRKu6.ٸTG3l\qƥ:hRKu6.ٸTgRTqƥ:l\Ju6.ٸTgRKu4Sƥ:l\qf*ٸTgRKu6.L:l\qƥ:TgRKu6.ٸTG3l\qƥ:dRKu6.ٸTgRTqƥ:l\Ju6.ٸTgRKu4Sƥ:l\qf*ٸTgRKu6.L:l\qƥ:TgRKu6.ٸTG3l\qƥ:hRKu6.ٸTgRTqƥ:l\Ku6.ٸTgRKu4Sƥ:l\qf*ٸTgRKu6.L:l\qƥ:TgRKu6.ٸTG3l\qƥ:hRKu6.ٸTgRTqƥ:l\Ju6.ٸTgRKu4Sƥ:l\qNf.ٸTgRKu6.L:l\qƥ:TgRKu6.ٸTG3l\qƥ:hRlTs.7J_[ύJ]U;~~4 +g[/="Oh +`PgB=.ԃB=.ԃB `P `P u6.ԃB=.ԃB=.ٸP `P `PgB=.ԃB=.ԃB `P `P u6.ԃB=.ԃB=.ٸP `P `PgB=.ԃB=.ԃBTӅz0]Ӆz0]qLtLtƅz0]Ӆz0]Ӆ:tLtLl\Ӆz0]Ӆz0]qLtLtƅz0]Ӆz0]Ӆ:tLtLl\Ӆz0]Ӆz0]qLtLtf*ԃB=.ԃB=.ٸP `P `PgB=.ԃB=.ԃB `P `P u6.ԃB=.ԃB=.ٸP `P `PgB=.ԃB=.ԃB `P `P u6.ԃB=.ԃB=.<]Ӆz0]Ӆ:P `P `PgB=.ԃB=.ԃBօz0]Ӆz0]Ӆ:tLtLl\Ӆz0]Ӆz0]qLtLtƅz0]Ӆz0]Ӆ:tLtLl\Ӆz0]Ӆz0]qLtLtf*ԃB=.ԃB=.ٸP `P `PguLtLtƅz0]Ӆz0]Ӆ:tLtLl\Ӆz0]Ӆz0]qLtLtƅz0]Ӆz0]Ӆ:tLtLl\Ӆz0]Ӆz0] +`P `P u6.ԃB=.ԃB=.l]Ӆz0]Ӆz0]qLtLtƅz0]Ӆz0]Ӆ:tLtLl\Ӆz0]Ӆz0]qLtLtƅz0]Ӆz0]Ӆ:tLtLhB=.ԃB=.ԃB `P `P u6[tLtLl\Ӆz0]Ӆz0]q{R +z')X͝^kO~-e?{Tse:Lg2t6.ٸLG3l\qe:h2t6.ٸLg2Tqe:l\t6.ٸLg2t4Se:l\qf*ٸLg2t6.Le:l\qe:Lg2t6.ٸL'3l\qe:h2t6.ٸLg2Tqe:l\t6.ٸLg2t4Se:l\qf*ٸLg2t6.Le:l\qe:Lg2t6.ٸLG3l\qe:h2t6.ٸLg2\qe:l\t6.ٸLg2t4Se:l\qf*ٸLg2t6.Le:l\qe:Lg2t6.ٸLG3l\qe:h2t6.ٸLg2Tqe:l\t6.ٸLg2\qe:l\t6.ٸLg2t4t6.ٸLg2t4Se:l\qf*ٸLg2t6.Le:l\qe:Lg2t6.ٸLG3l\qe:h2t6.ٸLg2Tqe:l\t6.ٸLg2t4Se:l\qf*ٸLg2t6.Le:l\qe:Lg2t6.ٸLG3l\qe:h2t6.ٸLg2Tqe:l\t6.ٸLg2t4Se:l\qNf.ٸLg2t6.Le:l\qe:Lg2t6.ٸLG3l\qe:h2t6.ٸLg2Tqe:l\t6.ٸLg2t4Se:l\qf*ٸLg2t6.Le:l\qe:Lg2t6.ٸLG3l\qe:h2t6.ٸLg2Tqe:l\t2?Ost2?V ~,([zizxKߖJƍcyJ?Z_?{Bsƕ:RgJ+u6WWl\*u6ٸRgsuƕ:RgJ+u6WWl\*u6ٸRgsuƕ:RgJ+u6WWl\*u6ٸRgsuƕ:RgJ+u6WWl\*u6ٸRgsuƕ:RgJ+u6WWl\+u6ٸRgJ+u4Sƕ:Wl\qfٸRgJ+u6L:Wl\qƕ:RgJ+u6ٸRG3Ul\qƕ:WhJ+u6ٸRgJTqƕ:Wl\*u6ٸRgJ+u4Sƕ:Wl\qNfٸRgJ+u6L:Wl\qƕ:RgJ+u6ٸRG3Ul\qƕ:WhJ+u6ٸRgJTqƕ:Wl\*u6ٸRgJ+u4Sƕ:Wl\qfٸRgJ+u6L:Wl\qNfٸRgJ+u6L:Wl\qƕ:RgJ+u6ٸRG3Ul\qƕ:WhJ+u6ٸRgJTqƕ:Wl\*u6ٸRgJ+u4Sƕ:Wl\qfٸRgJ+u6L:Wl\qƕ:RgJ+u6ٸRG3Ul\qƕ:WhJ+u6ٸRgJTqƕ:Wl\*u6ٸRgJ+u4Sƕ:Wl\qfٸRgJ+u6L:Wl\qƕ:RgJ+u6ٸRG3Ul\qƕ:WdJ+u6ٸRgJTqƕ:Wl\*u6ٸRgJ+u4Sƕ:Wl\qfٸRgJ+u6L:Wl\qƕ:RgJ+u6ٸRG3Ul\qƕ:WhJ+u6ٸRgJTqƕ:Wl\+u6ٸRgJ+u4Sƕ:Wl\qfٸRgJ+u6L:Wl\qƕ:R'=__\c>hΕw+_{~?O˿vFmYƟ˼?W;_W 59oS;^5ȫ=lǽ-F㮷nvO CsDxݖ.zң1=|a3Ava{ް.lNrL endstream endobj 83 0 obj @@ -1462,7 +1484,7 @@ endobj /MediaBox [ 0 0 595.275591 841.889764 ] /Contents 82 0 R /Resources 4 0 R -/Annots [ 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R ] +/Annots [ 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R 121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R 151 0 R 152 0 R 153 0 R 154 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> @@ -1625,36 +1647,25 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 667.673622 555.889134 647.003622 ] +/Rect [ 71.386457 667.673622 555.889134 647.003622 ] /BS << /W 0 >> -/Dest (.:technologies-utilisees) +/Dest (.:visual-studio-2022) >> endobj 99 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 662.153622 93.647199 647.753622 ] -/BS << -/W 0 ->> -/Dest (.:technologies-utilisees) ->> -endobj -100 0 obj -<< -/Type /Annot -/Subtype /Link /Rect [ 544.436985 662.153622 555.889134 647.753622 ] /BS << /W 0 >> -/Dest (.:technologies-utilisees) +/Dest (.:visual-studio-2022) >> endobj -101 0 obj +100 0 obj << /Type /Annot /Subtype /Link @@ -1662,10 +1673,10 @@ endobj /BS << /W 0 >> -/Dest (.:selenium) +/Dest (.:visual-studio-code) >> endobj -102 0 obj +101 0 obj << /Type /Annot /Subtype /Link @@ -1673,10 +1684,10 @@ endobj /BS << /W 0 >> -/Dest (.:selenium) +/Dest (.:visual-studio-code) >> endobj -103 0 obj +102 0 obj << /Type /Annot /Subtype /Link @@ -1684,10 +1695,10 @@ endobj /BS << /W 0 >> -/Dest (.:csharp) +/Dest (.:materialmkdocsmarkdown) >> endobj -104 0 obj +103 0 obj << /Type /Annot /Subtype /Link @@ -1695,10 +1706,10 @@ endobj /BS << /W 0 >> -/Dest (.:csharp) +/Dest (.:materialmkdocsmarkdown) >> endobj -105 0 obj +104 0 obj << /Type /Annot /Subtype /Link @@ -1706,10 +1717,10 @@ endobj /BS << /W 0 >> -/Dest (.:python) +/Dest (.:figma) >> endobj -106 0 obj +105 0 obj << /Type /Annot /Subtype /Link @@ -1717,18 +1728,29 @@ endobj /BS << /W 0 >> -/Dest (.:python) +/Dest (.:figma) +>> +endobj +106 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 584.993622 555.889134 564.323622 ] +/BS << +/W 0 +>> +/Dest (.:technologies-utilisees) >> endobj 107 0 obj << /Type /Annot /Subtype /Link -/Rect [ 71.386457 584.993622 555.889134 564.323622 ] +/Rect [ 63.386457 579.473622 93.647199 565.073622 ] /BS << /W 0 >> -/Dest (.:firefox) +/Dest (.:technologies-utilisees) >> endobj 108 0 obj @@ -1739,7 +1761,7 @@ endobj /BS << /W 0 >> -/Dest (.:firefox) +/Dest (.:technologies-utilisees) >> endobj 109 0 obj @@ -1750,7 +1772,7 @@ endobj /BS << /W 0 >> -/Dest (.:tesseract) +/Dest (.:selenium) >> endobj 110 0 obj @@ -1761,43 +1783,32 @@ endobj /BS << /W 0 >> -/Dest (.:tesseract) +/Dest (.:selenium) >> endobj 111 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 543.653622 555.889134 522.983622 ] +/Rect [ 71.386457 543.653622 555.889134 522.983622 ] /BS << /W 0 >> -/Dest (.:fonctionnement-general) +/Dest (.:csharp) >> endobj 112 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 538.133622 93.647199 523.733622 ] -/BS << -/W 0 ->> -/Dest (.:fonctionnement-general) ->> -endobj -113 0 obj -<< -/Type /Annot -/Subtype /Link /Rect [ 544.436985 538.133622 555.889134 523.733622 ] /BS << /W 0 >> -/Dest (.:fonctionnement-general) +/Dest (.:csharp) >> endobj -114 0 obj +113 0 obj << /Type /Annot /Subtype /Link @@ -1805,10 +1816,10 @@ endobj /BS << /W 0 >> -/Dest (.:les-briques-principales) +/Dest (.:python) >> endobj -115 0 obj +114 0 obj << /Type /Annot /Subtype /Link @@ -1816,21 +1827,21 @@ endobj /BS << /W 0 >> -/Dest (.:les-briques-principales) +/Dest (.:python) >> endobj -116 0 obj +115 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 502.313622 555.889134 481.643622 ] +/Rect [ 71.386457 502.313622 555.889134 481.643622 ] /BS << /W 0 >> -/Dest (.:recuperation-dimages) +/Dest (.:firefox) >> endobj -117 0 obj +116 0 obj << /Type /Annot /Subtype /Link @@ -1838,21 +1849,21 @@ endobj /BS << /W 0 >> -/Dest (.:recuperation-dimages) +/Dest (.:firefox) >> endobj -118 0 obj +117 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 481.643622 555.889134 460.973622 ] +/Rect [ 71.386457 481.643622 555.889134 460.973622 ] /BS << /W 0 >> -/Dest (.:ocr) +/Dest (.:tesseract) >> endobj -119 0 obj +118 0 obj << /Type /Annot /Subtype /Link @@ -1860,18 +1871,29 @@ endobj /BS << /W 0 >> -/Dest (.:ocr) +/Dest (.:tesseract) +>> +endobj +119 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 460.973622 555.889134 440.303622 ] +/BS << +/W 0 +>> +/Dest (.:fonctionnement-general) >> endobj 120 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 460.973622 555.889134 440.303622 ] +/Rect [ 63.386457 455.453622 93.647199 441.053622 ] /BS << /W 0 >> -/Dest (.:traitement-et-affichage) +/Dest (.:fonctionnement-general) >> endobj 121 0 obj @@ -1882,7 +1904,7 @@ endobj /BS << /W 0 >> -/Dest (.:traitement-et-affichage) +/Dest (.:fonctionnement-general) >> endobj 122 0 obj @@ -1893,7 +1915,7 @@ endobj /BS << /W 0 >> -/Dest (.:resume-du-fonctionnement-general) +/Dest (.:les-briques-principales) >> endobj 123 0 obj @@ -1904,54 +1926,43 @@ endobj /BS << /W 0 >> -/Dest (.:resume-du-fonctionnement-general) +/Dest (.:les-briques-principales) >> endobj 124 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 419.633622 555.889134 398.963622 ] +/Rect [ 79.386457 419.633622 555.889134 398.963622 ] /BS << /W 0 >> -/Dest (.:recuperation-des-images) +/Dest (.:recuperation-dimages) >> endobj 125 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 414.113622 93.647199 399.713622 ] -/BS << -/W 0 ->> -/Dest (.:recuperation-des-images) ->> -endobj -126 0 obj -<< -/Type /Annot -/Subtype /Link /Rect [ 544.436985 414.113622 555.889134 399.713622 ] /BS << /W 0 >> -/Dest (.:recuperation-des-images) +/Dest (.:recuperation-dimages) >> endobj -127 0 obj +126 0 obj << /Type /Annot /Subtype /Link -/Rect [ 71.386457 398.963622 555.889134 378.293622 ] +/Rect [ 79.386457 398.963622 555.889134 378.293622 ] /BS << /W 0 >> -/Dest (.:comment-faire) +/Dest (.:ocr) >> endobj -128 0 obj +127 0 obj << /Type /Annot /Subtype /Link @@ -1959,21 +1970,21 @@ endobj /BS << /W 0 >> -/Dest (.:comment-faire) +/Dest (.:ocr) >> endobj -129 0 obj +128 0 obj << /Type /Annot /Subtype /Link -/Rect [ 71.386457 378.293622 555.889134 357.623622 ] +/Rect [ 79.386457 378.293622 555.889134 357.623622 ] /BS << /W 0 >> -/Dest (.:simuler-un-navigateur) +/Dest (.:traitement-et-affichage) >> endobj -130 0 obj +129 0 obj << /Type /Annot /Subtype /Link @@ -1981,10 +1992,10 @@ endobj /BS << /W 0 >> -/Dest (.:simuler-un-navigateur) +/Dest (.:traitement-et-affichage) >> endobj -131 0 obj +130 0 obj << /Type /Annot /Subtype /Link @@ -1992,10 +2003,10 @@ endobj /BS << /W 0 >> -/Dest (.:controler-le-navigateur) +/Dest (.:resume-du-fonctionnement-general) >> endobj -132 0 obj +131 0 obj << /Type /Annot /Subtype /Link @@ -2003,18 +2014,29 @@ endobj /BS << /W 0 >> -/Dest (.:controler-le-navigateur) +/Dest (.:resume-du-fonctionnement-general) +>> +endobj +132 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 336.953622 555.889134 316.283622 ] +/BS << +/W 0 +>> +/Dest (.:recuperation-des-images) >> endobj 133 0 obj << /Type /Annot /Subtype /Link -/Rect [ 71.386457 336.953622 555.889134 316.283622 ] +/Rect [ 63.386457 331.433622 93.647199 317.033622 ] /BS << /W 0 >> -/Dest (.:recuperer-les-cookies) +/Dest (.:recuperation-des-images) >> endobj 134 0 obj @@ -2025,7 +2047,7 @@ endobj /BS << /W 0 >> -/Dest (.:recuperer-les-cookies) +/Dest (.:recuperation-des-images) >> endobj 135 0 obj @@ -2036,7 +2058,7 @@ endobj /BS << /W 0 >> -/Dest (.:calibration) +/Dest (.:comment-faire) >> endobj 136 0 obj @@ -2047,18 +2069,18 @@ endobj /BS << /W 0 >> -/Dest (.:calibration) +/Dest (.:comment-faire) >> endobj 137 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 295.613622 555.889134 274.943622 ] +/Rect [ 71.386457 295.613622 555.889134 274.943622 ] /BS << /W 0 >> -/Dest (.:liste-des-pilotes) +/Dest (.:simuler-un-navigateur) >> endobj 138 0 obj @@ -2069,18 +2091,18 @@ endobj /BS << /W 0 >> -/Dest (.:liste-des-pilotes) +/Dest (.:simuler-un-navigateur) >> endobj 139 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 274.943622 555.889134 254.273622 ] +/Rect [ 71.386457 274.943622 555.889134 254.273622 ] /BS << /W 0 >> -/Dest (.:zone-principale) +/Dest (.:controler-le-navigateur) >> endobj 140 0 obj @@ -2091,18 +2113,18 @@ endobj /BS << /W 0 >> -/Dest (.:zone-principale) +/Dest (.:controler-le-navigateur) >> endobj 141 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 254.273622 555.889134 233.603622 ] +/Rect [ 71.386457 254.273622 555.889134 233.603622 ] /BS << /W 0 >> -/Dest (.:zones-pilotes) +/Dest (.:recuperer-les-cookies) >> endobj 142 0 obj @@ -2113,18 +2135,18 @@ endobj /BS << /W 0 >> -/Dest (.:zones-pilotes) +/Dest (.:recuperer-les-cookies) >> endobj 143 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 233.603622 555.889134 212.933622 ] +/Rect [ 71.386457 233.603622 555.889134 212.933622 ] /BS << /W 0 >> -/Dest (.:windows-pilotes) +/Dest (.:calibration) >> endobj 144 0 obj @@ -2135,7 +2157,7 @@ endobj /BS << /W 0 >> -/Dest (.:windows-pilotes) +/Dest (.:calibration) >> endobj 145 0 obj @@ -2146,7 +2168,7 @@ endobj /BS << /W 0 >> -/Dest (.:stockage) +/Dest (.:liste-des-pilotes) >> endobj 146 0 obj @@ -2157,54 +2179,43 @@ endobj /BS << /W 0 >> -/Dest (.:stockage) +/Dest (.:liste-des-pilotes) >> endobj 147 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 192.263622 555.889134 171.593622 ] +/Rect [ 79.386457 192.263622 555.889134 171.593622 ] /BS << /W 0 >> -/Dest (.:ocr_1) +/Dest (.:zone-principale) >> endobj 148 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 186.743622 93.647199 172.343622 ] -/BS << -/W 0 ->> -/Dest (.:ocr_1) ->> -endobj -149 0 obj -<< -/Type /Annot -/Subtype /Link /Rect [ 544.436985 186.743622 555.889134 172.343622 ] /BS << /W 0 >> -/Dest (.:ocr_1) +/Dest (.:zone-principale) >> endobj -150 0 obj +149 0 obj << /Type /Annot /Subtype /Link -/Rect [ 71.386457 171.593622 555.889134 150.923622 ] +/Rect [ 79.386457 171.593622 555.889134 150.923622 ] /BS << /W 0 >> -/Dest (.:fonctionnement-general_1) +/Dest (.:zones-pilotes) >> endobj -151 0 obj +150 0 obj << /Type /Annot /Subtype /Link @@ -2212,10 +2223,10 @@ endobj /BS << /W 0 >> -/Dest (.:fonctionnement-general_1) +/Dest (.:zones-pilotes) >> endobj -152 0 obj +151 0 obj << /Type /Annot /Subtype /Link @@ -2223,10 +2234,10 @@ endobj /BS << /W 0 >> -/Dest (.:filtres-et-traitement) +/Dest (.:windows-pilotes) >> endobj -153 0 obj +152 0 obj << /Type /Annot /Subtype /Link @@ -2234,163 +2245,245 @@ endobj /BS << /W 0 >> -/Dest (.:filtres-et-traitement) +/Dest (.:windows-pilotes) +>> +endobj +153 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 79.386457 130.253622 555.889134 109.583622 ] +/BS << +/W 0 +>> +/Dest (.:stockage) >> endobj 154 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 130.253622 555.889134 109.583622 ] -/BS << -/W 0 ->> -/Dest (.:traitement-des-donnees) ->> -endobj -155 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 124.733622 93.647199 110.333622 ] -/BS << -/W 0 ->> -/Dest (.:traitement-des-donnees) ->> -endobj -156 0 obj -<< -/Type /Annot -/Subtype /Link /Rect [ 544.436985 124.733622 555.889134 110.333622 ] /BS << /W 0 >> -/Dest (.:traitement-des-donnees) +/Dest (.:stockage) >> endobj -157 0 obj +155 0 obj << /Filter /FlateDecode -/Length 56603 +/Length 58783 >> stream -xM%ɑ_Qk*;hbB3z 6i?0 -,=I%̛Oiv/E?ƥw~q~?u͟w]*W)Wm[_/?ݾu{\J_ygן~Rԟ~tw|q)P\_{o?SHr iu9/!爟Q^u@[^½wK^AfE|1!1Z)☫21YYcj,e~k,R/1^&y߳^sUbn={41iLc1mYOƴ9,){JDZbWUrtBIZctp̚b|c֌1*C1]0Ob^wʙa5V@ĬS,lW+Wi,js5'#fTMr;N14ysM6:Usά4m{/ eV!yE>+܇w$,X( Aٓb\b4BIp;;9K/k8*,<'9Ӽz93{' b -tXH}Zi,Xʷ@51}XhbGƵ!f9J̶cEH۬&g=7gFsXh}ObՕHZۥ1îZh, XHUGZj9uϙfWvEc!kkvi,|,tbRB:TV`}R*m~QN*3*ޝիܹҩ^AUTV`cQZ}7ի5Nի*wWtP_UIիU:W?93}8^UnIjv@^U1nMw^TV;n^Us:^AWzI]0ܱ=^mAU&Z`Q*%uoI(QLWUgU ը^mAUbbڸ)fhsRzM̾^m6R@j>/W%bvzEVWtpSڤ2T6VU;Z_H1ߊy7_Ch,nż7ڡ_vkڕU;Kj~)W/+Xء_.ca~W/~l~iZ|Bv軧U;_caTq8{WC߯kWC_6իǡ7Xء?+\^=y7WCA_WC-_8/_8mo?BޢCwkeGzMׂH;'}|~cx9S$vL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI1o'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&vL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI1o'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&vL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI2/'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9N '}ʼ9N '}΄>gI1o'}΄>gI3ϙpҧI3ϙpL8s&)rL8s&9Ny9s&9N '}΄>e^N '}΄>gI3O>gI3ϙpL8SϙpL8s&9Ny9s&9N '}΄>e^N '}΄>gI3O>gI3ϙ8s&vL8s&93'}΄>e^N '}΄>gϙpҧI3ϙpI2/'}΄>gI3qL8SϘyo -IW ;׿Im̸9o?_AY˯nZm_Ţ8f|yϿ9 SE*}OqxZux{j+1Z;#1i[_G-qW]䌷|}U63>$1Kھ k}i}ghyh<}}KiھƦyhM}C]4m_5C׷l4)jyh.6 {yhJN5=yԒa;[ aV0`_n[y(.Cv(=ᘵ¦g8*89>(8}LS=C4Myz>i\z>i<1Mk硏iZ898}LycC47=sLo>ڠgcJӜm%`1Myxigcq- }L4]{z>Wyc>ھ.Y4m_Cץm m_c4m_cmj[kiY.)gh*Zm}gh<C׵24m_4m_SA::T3.} 3v<._H9v8x3yh\nZ<l&F1ߵ<~93Qiyhf -=C7Zgh uP}-8.8Z- gh=CuPup۬I<>.MzGmF6^| Q̥]4{QE?aѿD mW(<+m mW(wymW - -Z4<+(spB8]/ǮcbqڮbiT<]g mWPvމB+z+Hqڮ\cBSAFvOcCp[tznL+h2<]v}<]6zy t=Cƅ) ŔpR<[Gn2z1upl'ᱯa<)z__/~d;oοcw3+UnG ~x`?>}v¿qۿl]g4w߻z_>>w{3nϙpݞ3nϙpLs&)rLs&9 w{ʼ9 w{΄=gݞ2/w{΄=gݞ3nϙpݞ3nϙpLs&)rLs&9 w{ʼ9 w{΄=gݞ2/w{΄=gݞ3nϙpݞ3nϙpLs&vLs&9 w{ʼ9 w{΄=gݞ2/w{΄=gݞ3nϙpݞ3nϙpLs&)rLs&9 w{ʼ9 w{΄=gݞ2/w{΄=gݞ3nϙpݞ3nϙpLs&)rLs&9 w{ʼ9 w{΄=gݞ1ow{΄=gݞ3nϙpݞ3nϙpLs&)rLs&9 w{ʼ9 w{΄=gݞ2/w{΄=gݞ3nϙpݞ3nϙpLs&)rLs&9 w{ʼ9 w{΄=gݞ2/w{΄=gݞ3nϙpݞ3nϙpL3nϙpLs&9ys&9 w{΄=e^ w{΄=gݞ3nO=gݞ3nϙpLSnϙpLs&9ys&9 w{΄=e^ w{΄=gݞ3nO=gݞ3nϙpLSnϙpLs&9ys&9 w{΄=c w{΄=gݞ3nO=gݞ3nϙpLSnϙpLs&9ys&9 w{΄=e^ w{΄=gݞ3nO=gݞ3nϙpLSnϙpLs&9ys&9 w{΄=e^ w{΄=gݞ3nO=gݞ3nϙpL3nϙpLs&9ys&9 w{΄=e^ w{΄=gݞ3nO=gݞ3nϙpLSnϙpLs&9ys&9 w{΄=e^ w{΄=gݞ3nO=gݞ3nϙpLSnϙpLs&9ys&9 w{΄=c w{΄=gݞ3nO=gݞ3nϙpLSnϙpLs&9ys&9 w{΄=e^Ws?; {m79n|5wn??|Ëo_nx\$mY;>>?7d.Gϴ r iu9"Q^BwpUCq}R)p#1r&` -~H8^V+\s=g950ZωjzK%=-Ʒ#} ,}[YUlz>1iLcւƴ9z7gis̗/*F1Bhz>;B(C]ᔢJr1*hL(hB1wǬ5<=5ciLc 01yyr`j՗8Y,- -Y} ṱ`.\ rB(嘯yuV$=hL<:ky*j<s0Oo.ys0Oc.S`eH4TuQY̼(O]}vE1 1T#^8fMU82g)Ou_@0:1A y9f-eH]jaJ<E5tPy*lXbscߌUјn\&vSՉy*|64YA1)OݏƘGPNS#3mIy~}LS#oS`aR:X<k`Z;QEz>úyj,c`ZfuKq̵cZm"c, F1_cZ/uRc~:ZvS#ުq̵Son2~0OZ6SaNṱaN\r̥a.|5S頷1OUS`aJ T:aގ71"1sm1yU1OU tPY1OP ,&,0GH6Nj٭~ߎCwF܍mA-'e?o- zfZj[p_ֆ^Pxn9P_xg㎗3~|/sd;1m_ ?}U1|5eJ_F4V k"faQef7 P 6Em$ ט9gk`wl4ysM6:sά4m{y޻2*})^̜i^J1}1JBbQ{?ע]3G,՝4ӍxLw^=h,/W -*޿??ș6ČsQh,:S}e50wyL=i,h,Z~j>34AebXހ"`,|o@~&1þkC̾7 YϹM4zyo ;2sfӤyto `]3쭫B:n tPMo0tWQtY:oEc4~[2=t[by/u,;U7@5\I)ZTހޮUۧ#g{& -ի7{B:_TU^kqTlQ{UJ >g}s3=ճzI ZP{2TwS{wK p0ի7@ը^^  zTހQ>ș/2Q>:9%Tހ!9z %ի7@%@z[,gsU෴Q{W}olPP{ƨU0f41N ЗzoQ~tQ{WCի7`~41ۻsF1~1ރU0v=XHǾ7ի7@zkW}oJ JzM1KJcW}oۛ^z:O Ҥ#-cRի7`QB:8ݨHc!nNB:rzU5]:8 cL@TNqK*6WU `Pڥ1LJ3m 0l_Alڥ -zUk1Wtp2Y:8UW%_XHqU徘]:|,Z3ƜQejz(_QZ.\u1_zHUij.} QΗozK@WtpIM^.\LbvTWUiu_UkbTR^z 頻e^L.Ʃ^|s#1Y߆Ttsj}WTjjP}_ 1ߧZe |u⾢ Z`{5^W\_T+WX{}1.t_W|,_wt_:+N8O_^=^W|K2W\3{׍m4W:|zu^q-;{w{{|8w=r{{ȕȕcvqu9IT#'ձνqS:w=rZR:}W>U_>ՅȍOoe>pu>U=fWSWSUA}ZQ:}}Uk}/}Nj~_esߟU*U}Uq>kV_O7h,|δ)߭dW.0?g _OZ7ڧq>jDj5R̾Gn7_Oh,nqp5_=\WϽ׮T{Jso@z i so@z ; so@b>0/_=>pK)fGWM=4ϊǧ/WWOލ_e}E;wǧǧpnxgQ6">¿O__{{߮sO~^OzPO~oG|q)5Ư~.>GG}gQq8y9z`G=0Qϙp8ygQq8y9z`G=0Qϙp8ygQq8y)r8ygQq8y9z`G=0Qϙp8ygQq8y9z`G=0Qϙp8ygQq8y9z`G=0QOQq8s&9zjP^8 %mym(i)CoCIqzjQbu/ކZ<ynhZBg8pNMbwu}?z}u<\(~ebX8cVMp9u<qގY5=[> F1s0iz۪=`i<ClBݢ3{cmr mRe 6}E6-EyhVE@64CUnhڦ?yhiڦ6yXOV+Cw؃s׽c<=Ch1v>iP564C,Cm*m*CԷ- F3y6keiڦ=hڦFup]upgh\gh\yhT5ō:h/=C/ꆞu -CMeb]C7K|s$qZB:zA/bZyhup_ :Ǹ7C zA%=C렿Z%E:ghyh6e?G8Kyjs4u*1I_y.rkQжږ m Wc+W mK<-ƶm W|% <upl'ᱩa<<6uyʱ)Ǧ*jxrlyʱ)Ǧ;cS_ SM}xrlkyʱ]<)zMyߘol{>ӿQE迣Qw{U >ӷTz>O{z|S}sޟ`o~?+N zʼ9N z΄S=g©2/z΄S=g©3Tϙp˩3TϙpL8s&)é3TϙpL8s&)rL8s&9N zʼ9N z΄S=g©2/z΄S=g©3Tϙp˩3TϙpL8s&)rL8s&9N zƼ9N z΄S=g©2/z΄S=g©3Tϙp˩3TϙpL8s&)rL8s&9N zpL8s&9N zʼ9N z΄S=g©2/z΄S=g©3Tϙp˩3TϙpL8s&)rL8s&9N zʼ9N z΄S=g©1oz΄S=g©3Tϙp˩3TϙpL8s&)rL8s&9N zʼ9N z΄S=g©2=9N z΄S=g©2/z΄S=g©3Tϙp˩3TϙpL8s&)rL8s&9N zʼ9N z΄S=g©2/z΄S=g©3TϘS=g©3TϙpL8STϙpL8s&9Ny9s&9N z΄S=e^N z΄S=g©3TOS=g©3TϙpL8STϙpL8s&9Ny9s&9N z΄S=e^N z΄S=g©3TOS=g©3TϙpL8STϙpL8s&9Ny;s&9N z΄S=e^N z΄S=g©3TOS=g©3TϙpL8STϙpL8s&9Ny9s&9N z΄S=e^N z΄S=g©3TOS=g©3TϙpL8STϙpL8s&9Ny9s&9N z΄S=e^N z΄S=g©3TϘS=g©3TϙpL8STϙpL8s&9Ny9s&9N z΄S=e^N z΄S=g©3TOS=g©3TϙpL8STϙpL8s&9Ny9s&9N z΄S=e^N z΄S=g©3TOS=g©3TϙpL8STϙpL8s&9Ny;s&9N z΄S=e^N z΄S=g©3TOS=g©3TϙpL8STϙpL8s&9Ny93o_q69g;7զN?ouNu.}~ޭ׷.x/gz|񌏿)yG_?r[!2D /Vib"g^7h҈bڹu7eJ3ϡU41 -3Kks+D(f)ܢbV{P؄_4U1kQpX(kϢ gs+VQ̭[!R)hkIMc'έ9mXhy\g;eU*Oa3ysn(a1Y+AcIc1P̫[wsF19gjb(滜[wSf*滟[wsF1ܺ3y_ݜQ̻[wsF1om4|l&Lέ9#u7g=*_MaoŬAE?i,n\˹u7g즱 4[1rnu7g\׬h,$k0h,޲067^X؄>bܺ3>Y t׷806u7gݜQZ} lBb3,lK58tܺ3XH۽έ9unMu:,oQ{Ec|SR=3έ)#ԗu7gW/ܺ3C3YVmh *WmW?^ ׵^ z&/bkPj U{4bSjAMnwz&n3tz&|OFM}BMTڄWiTڄW?b^kPzn+IM]+WmvSj~EM]R@M]U&ի6Kի6-^ _ AM$&ի6ِə-[wSF:8}Qj -BMCrJMCAM*:ի6[ bnsRj<^ Jz&EMCCAMcJMcoFc!Tڄ/AyOCWm>UݜQ̪^ Wz&3Uǽի6]ϭ)#[әB:8^ _z&yBw]uWWmŸJz&Yu7gJcWm—T.Wm78ի6,U4iH}4)fUcWt۹TG7ƤzIճ*1zU5]:8T*ӿ&իt_U_s].ԏ9b^WUٸڥ*pKUb6vt'0,[JHc!UrWtp]WUYڥMtPjqMY:9vj"k1WtpՍZ|j#T]:%D:_~Mի]:RڥKjJj.TvWfpK:GLUL_lr!ի*ĨKQڥkm_g_뮸]:h.իuތ@bַ!ի*ܸrjI/'Ԡz$vLB/')mvyH2qut=0/W_U'0_ҥV6pu%]n~If3ի/'ի/鲏⼤zĜKq^u.WyIq^ҵ'ի/Zu-/Lzu%]tW_u_~Izu%]Zvw/W_ҵ7ekbpSpu)rM٥pSv:yq 7eOzu)[իc,Wy9>y -7ekQH8/'):>/'q^Npu)[_Td4_~93ի/'W_Nrᗓh!GI_5D_Pۀu^/'Y7NDK,:r{,%WrM2W_NDM6dQj{^ &ڄbv3Zj~6_e&'|L1᷅DŽ/_=&pcR6ᏊDŽBcW V_=&9pݨ^=&Uy ߍ44DŽDŽpnxQ6"¿ G,o9ہ]Mzo<#^廏Oy}~7 U}xx2E!%fot%GeORdwɯ*U9o_"y<&G{ך"noMĜ-590=FG~iɑ3G޽{+27d{U3޾ dּ#Y-븂;w hGwp9x7nEqP1^uܹc@k=ҸsǀzqHs:1`91qy=ZƝ;#;w hGw9ǥ;w sǀzqH~#2~sǀzqHޕEGqHuܹc@k=Ҹsqw"414141…41 %;w H0H~2hʹc`/\ǹakƝ;H㚏#k>{Aw#k>Z4Ok=Ҹc<62qVZ4Z}ظ;w hב{ ZƝ;#;w hGwZ41P&~ 81~rqc`:1iܹc@k=Ҹsǀjq-HZ7JҸsǀc^1p:suܹc@k=Ҹsǀzq玁VqwZ41Q';w s@1pcu玁sǀF41Q';w hIuҸs@︎;w 8Дsǀi玁7>w l\ǝ;ƅsǀzqcZ41iܹc` \}1pcuUt:1~Jdsǀzq62Ǟq;>w ܸ1qwZ41 -:1iܹc./Дq;&>w ,\}qc`:1p_;w hGwZ41p7\ǝ;#10qc`:sq玁}:1;9uܹc@k=Ҹsǀzq;>w L\}X1p:su(wd-ep;?Ҹq;>w L\}X1p:suܹc\;w hGw=pcWҸq;&>w ,\}qc`:1#7\}Z>w L\}X1p:suܹc@k=Ҹs@+;w hGc:s@u玁q;cu玁sǀfiܹc@34s@u玁q;>w L\}X1p:suܹc@;iܹc@2i玁 q;:>w \}1pcu玁ޠi玁q;>w t\}10qc`:7iܷ;p\}cquܷ;nҸow :v1ow N\}cquܷ;pq__寧s?o߱e>?_- -׵k~ͶyvF1A n79+|HS<}|q)ϨsD7S!1 )r iFH -: /zVqZ4A}W~d;G4bN20 -XKJK`tW#{mbZsqס50ZSK<%O-HwQ̒.Ym}˦1y1m*`8oF1g|$ eR1kҘQkS-]X4Z -橖C>=<v-1Oo/1 t_Mؘ1 t;< vwҘJ^ 1W`WyBy//)OtD@=$1T㷛_8fMU8Xy.0o1V4uPiyj_r1+rz>A:X<V_kHcuPwS`Ѳuyj,s`ZFcj,m81OtS`:uROcjyjTlmRm@))O6p:mM0nhmZc:Dy궁z>W+h?s:__~|,?^?SLg+,򾞉^umo'g%R{9>韑w]@t_3>%R{==:yZk| N+:2>G|=gzD\/o9_[4uε9*wluε9׫M}LzE|}~yL|97>{{UL+thϹhsh*IιlDSoZs7?FKU\ohM>qG|=^9ߟAzeKLZ풿_3-lZzvejL-Lk[giqL[y,s=V?)Soדy92-pf[oW2*)~U0/TfWہ2ߓI77[ZjV&\[d}ί=qq/S7s"::XZZWx}Ok\̱5n7۹5n=q\ۢd>.ߒs~ioLkV{ij|oK$S{_5JιѴ2ָsmG}5n;k?MLkV`-;gZZ5nuѴmMk\]e3q)SsδmWn{s~`mhkָ5nuxizc>cGױãziءbιziء%q;#q;cZv>cG"=:vGJk\Kk\5czq;>Q{u^Z:v7qױz}\5cGױã6^kָjq;ԕq;:v=q{XiQ{uPo3>cGױC>c69>cGױwױC Kk\{Q+:vx^/q;[Cs^\j|^/q;cg_/y^/q;?:v+#:vx^/q;cZ>cgANk\zCָe5:vxGuP;ءY{u^Z:vx^/q;Y{u^\z^Z:vx֓5q;<ɑָu15cgOU4}εmJKk\f,>C->C#>CjָOP{}bCuziKkqc-{}θ+djk5v-b]*/c_w;?Fqugr'z<_3z>9W33Z? Ǐ3q>n≣1Ǎ1ŵ׹~/1?Sw~eW˕JLB 1%PBLB 1b -#KLB 1b -%F֘ 1b -7n),1b -7n)SYb -7n)S!Pn)S!pCLf)S!pCLᆘBS!pCLᆘ 1%pCLᆘ 1b -5KLᆘ 1b -7j 1b -7n),1b -7n)SYc -7n)S!Pn)S!pCLf)S!pCLᆘBS!pCLᆘ 1%pCLᆘ 1b -5KLᆘ 1b -7j 1b -7n),1b -7n)SYb -7n)S!Pn)S!pCLaf)S!pCLᆘBS!pCLᆘ 1%pCLᆘ 1b -5KLᆘ 1b -7j 1b -7n),1b -7n)SYb -7n)S!Pn)S!Pn[c -7n),1wǭ1b -7f֘61b -7n),1mb -7n)SYb -7n)S!Pn)S!pCLf)lS!pCLᆘBS&pCLᆘ 1%pMLᆘ 1b -5KLf 1b -7j61b -7n),1mb -7n)SYc -7n)S!Pn)S!pCLf)lS!pCLᆘBS&pCLᆘ 1%pMLᆘ 1b -5KLf 1b -7j61b -7n),1b -7n)SYb -7n)S!Pn)S!pCLaf)S!pCLᆘBS!pCLᆘ 1%pCLᆘ 1b -5KLᆘ 1b -7j 1b -7n),1b -7n)SYb -7n)S!Pn)S!pCLf)S!pCLᆘBS!pCLᆘ 15pCLᆘ 1b -5KLᆘ 1b -7j 1b -7n),1b -7n)SYb -30cBLo)>PLc)? *zgt^X'E :xxBLVt '~?D4~ؾDK4z/?^׫?$PB4hM(!PB4hB ф%PB4hB ф #k4h ф 7Djh ф 7Dn&,ф 7Dn&MY 7Dn&M!PDn&M!pC4f&M!pC4hBM!pC4h ф%pC4h ф 5K4h ф 7Djh ф 7Dn&̬ф 7Dn&MY 7Dn&M!PDn&M!pC4f&M!pC4hBM!pC4h ф%pC4h ф 5K4h ф 7Djh ф 7Dn&,ф 7Dn&MY 7Dn&M!0Fn&M!pC4f&M!pC4hBM!pC4h ф%pC4h ф 5K4h ф 7Djh ф 7Dn&,ф 7Dn&MY 7Dn&MY 7}5pC4hBMs~}M!pC4af&lM!pC4hBM&pC4h ф%pM4h ф 5K4fh ф 7Djh6ф 7Dn&,фm 7Dn&MY 7Dn&M!PDn&M!pC4f&lM!pC4hBM&pC4h ф5pM4h ф 5K4fh ф 7Djh6ф 7Dn&,ф 7Dn&MY 7Dn&M!PDn&M!pC4f&M!pC4hBM!pC4h ф%pC4h ф 5K4h ф 7Dfh ф 7Dn&,ф 7Dn&MY 7Dn&M!PDn&M!pC4f&M!pC4hBM!pC4h ф%pC4h ф 5K4h ф 7Djh ф 7Dn&,ф 7Dn&MY 7Dn&M!PDn&M!pC4f&M!pC4hBM!pC4h ф%03n/Dh_ζP4cDw&魧A'E:%"$;Eߊ~5X~/?GY~U/WDN&p2Q'E8(DN&PBd'E8(DJ(""(""( QD0E3QD0E3Q`&f`&f7DLDLDn"(""(""E3QD0E3QD0E!f`&f`&pCDLDL(""(""( QD0E3QD0E3Q%f`&f`&pCDLDL(""(""( QD0E3QD0E3Q`&f`&f7DLDLDn"(""(""E3QD0E3QD0E!f`&f`&pCDLDLf"(""(""E3QD0E3QD0E!f`&f`&pCDLDL(""(""( QD0E3QD0E3Q`&f`&f7DLDL(""(""( QD0E3QD0E3Q%f`&f`&pCDLDL(""(""( QD0E3QD0E3Q`&f`&f7DLDLDn"(""(""E3QD0E3QD0E!f`&f`&pCDLDLf"(""(""E3QD0E3QD0E!f`&f`&pCDLDL(""(""( QD0E3QD0E3Q`&f`&f7DLDLDn"(""(""E3QD0E3QD0EY`&f`&f7DLDLDn"(""(""E3QD0E3QD0E!f`&f`&pCDLDL(""(""( QD0E3QD0E3Q`&f`&f7DLDLDj(""(""( QD0E3QD0E3Q`&f`&f7DLDLDn"E0N/D(z>Փ?EkBXI?:m`b~?g18o_b ~%7?x=_c +XB b #K,XB b %FXB b %J%b 7n%KYb 7n%K!Pn%K!pC,f%K!pC,XBK!pC,X %pC,X b 5K,X b 7jX b 7n%,b 7n%KYb 7n%K!0n%K!pC,f%K!pC,XBK!pC,X %pC,X b 5K,X b 7jX b 7n%,b 7n%KYb 7n%K!Pn%K!pC,f%K!pC,XK!pC,X %pC,X b 5K,X b 7jX b 7n%,b 7n%KYb 7n%K!Pn%K!pC,f%K!pC,f%K!pC,XBK!pC,X 5pC,X b 5K,X b 7jX b 7n%,b 7n%KYb 7n%K!Pn%K!pC,f%K!pC,XBK!pC,X %pC,X b 5K,X b 7fX b 7n%,b 7n%KYb 7n%K!Pn%K!pC,f%K!pC,XBK!pC,X %pC,X b 5K,X b 7jX b 7n%,b 7n%KYc 7n%K!Pn%K!pC,f%K!pC,XBK!pC,X %pC,X b 5K,X b 7jX b 7n%,b 7n%KYb 7n%K!Pn%K!pC,af%K!pC,XBK!pC,X %pC,X b 5K,X b 7jXf̘Xbێ7c{%6_ ѡCC%8`Dm?&J\1ӗH$jQzg\DJ$IY" %DJ$I(!0DJ$I(!PB$ad$I!pC$HBI!pC$H %pC$H " 5K$H " 7DjH " 7Dn$," 7Dn$IY" 7Dn$I!PDn$I!pC$f$I!pC$HBI!pC$H 5pC$H " 5K$H " 7DjH " 7Dn$," 7Dn$IY" 7Dn$I!PDn$I!pC$f$I!pC$HBI!pC$H %pC$H " 5K$H " 7DfH " 7Dn$," 7Dn$IY" 7Dn$I!PDn$I!pC$f$I!pC$HBI!pC$H %pC$H " 5K$H " 5K$H " 7DjH " 7Dn$̬" 7Dn$IY" 7Dn$I!PDn$I!pC$f$I!pC$HBI!pC$H %pC$H " 5K$H " 7DjH " 7Dn$," 7Dn$IY" 7Dn$I!0Fn$I!pC$f$I!pC$HBI!pC$H %pC$H " 5K$H " 7DjH " 7Dn$," 7Dn$IY" 7Dn$I!PDn$I!pC$f$I!pC$HI!pC$H %pC$H " 5K$H " 7DjH " 7Dn$," 7Dn$IY" 7Dn$I!PDn$I!pC$f$I!pC$HBI!pC$H %pC$H " 3k$H " 7DjH " 7Dn$," 7Dn$IY" 7Dn$I!PDf0` HIԒPL$cgC$I⸾Z>K_Ç_‡E>?J~>(!|0J>(!|PB`d >(!|PB>!|pC ლ%|pC 5K 7j 7n,7n>Y7n>!|Pn>!|pCf >!|pCA>!|pC ლ%|pC 3k 7j 7n,7n>Y7n>!|Pn>!|pCf >!|pCA>!|pC ლ%|pC 5K 7j 7n̬7n>Y7n>!|Pn>!|pCf >!|pCA>!|pC ლ%|pC 5K 7j 7j 7n,7n>Y7n>!|Pn>!|pCf >!|pCA>!|pC ლ%|pC 5K 7j 7n,7n>Y7n>!|Pn>!|pC`f >!|pCA>!|pC ლ%|pC 5K 7j 7n,7n>Y7n>!|Pn>!|pCf >!|pCA>!|pC კ5|pC 5K 7j 7n,7n>Y7n>!|Pn>!|pCf >!|pCA>!|pC ლ%|pC 5K 7f 7n,7n>Y7n>!|Pn>!|pCf {gd_mC4(|ݱ×c?ćߧ?ϟGg1w>u|_sU?WOw E|r_w:[^{8]_g uZr@tߟ5qr[(@Yu zԆꝎr93N^&띓:]ɻNw7́#Nw{InmjAsR>3mmw8L7 Evx'S|S|'<_+]XllZp볛-ιMqꜯ.n62k[qk:qpu[:uui8{^|q_+^c{UkG<^z|ZxgSp>{Vk;]o_86n9Sق?83]Ԗ"Zz"ukVgVk2LG8N7N'\clnj7Vxd0uמn6GKf/slxLqokwV8Lǩuhǩsbf_pvqlߡtSQ/tZzXG=pvq9S`Hj<}kWx:羧S|֎"]c%s.3zukZ8qjIkyo>^uջx:6${>^`lOR{2WS\h5VM|>7 -u6yVt[=q^>I[w8^?UYƎZkI}tpeWzYoõZoR$GA߱J{)9t^>} ~x9S9ι^85V`=X{Or:x٤$Go=l)ZzpԾL{x}#^crZqꜯ;aZ;^cZuWOr:x(s~wn#'9j_;'}𷻗x:wǩsWtr{}ӭ*t '9;#'9vOnnY[xTi{5 t۟> vnw>sHInk]6QKIAt\\t9]6[]6wOr~˦2gﲹYes;t?߱r$gͽ]_Iﲹeڎtz|#~wټ^˦d.\c=[OrwټY7.;tuQԟ>I7qY7]_kok4iY7zknC +'> ?> t[}n6 }n6-O{n6.<^c.֛tzE8}n6}&<vO$l<%<'fq?gl?fq[OUWbVn6o8ݵ>I7R>}n6LIx_OO}Ogv1~i6+'4|}}3~i6Oا+'4#~i6=~i6j'Otl[lgl-p}y$f^6}OQo6lԛt}Z}OQ/T>ɧٸOqZ`3wV?FƎf?ltL;22l]4i6J7>fFG!~Ψ8>k_s7now<"_fX}x=_BZadfX8yaNfadfX8yaNfadfX8yada̰ffX33,ya `fE03"na̰ffX33,ya `fE03"na̰ffX33,ya `fE03"na̰ffX33,ya `fE03"a `fE03"a `fE03"afa̰ffX33,na̰ffX33,na̰ffX33,na̰ffX33,na̰ffX33,na̰ffX33,na̰ffX33,na̰ffX33,na̰ffX33,na̰ffX33,j `fE03"a `fE03"a `fE03"a `fE03"a `fE03"a `fE03"a `fE03"a `fE03 3, `fE03 3, `fE03B2"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,,3, `fE03 3, `fE03 3, `fE03 3, `fE03 3, `fE03 3, `fE03 3, `fE03 3, `fE03 3, `fE03 3, `fE03B2"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,0"a̰ffX33,,3, `fE03 3, `fE03 3, `fE03 3, `fE03 3, > [_1C,j;gXq~EFrg_s,~Fkc}KP ?^G?J"vPB전;(!vPB전A %vPB전A b#k b7j b7n,b7n;Yb7n;!vPn;!vpCf;!vpCA;!vpC %vpC b5K b7j b7n̬b7n;Yb7n;!vPn;!vpCf;!vpCA;!vpC %vpC b5K b7j b7n,b7n;Yb7n;!v0n;!vpCf;!vpCA;!vpC %vpC b5K b7j b7n,b7n;Yb7n;Yb7n;!vPn;!vpC`f;!vpCA;!vpC %vpC b5K b7j b7n,b7n;Yb7n;!vPn;!vpCf;!vpCA;!vpC 5vpC b5K b7j b7n,b7n;Yb7n;!vPn;!vpCf;!vpCA;!vpC %vpC b5K b7f b7n,b7n;Yb7n;!vPn;!vpCf;!vpCA;!vpC %vpC b5K b7j b7n,b7n;Yc7n;!vPn;!vpCf;!vpCA;!vpC %v01!vsݷ,sfc>B8O3͡9Ͼk__~X~e/g\A98DJLd"'98A Ld"'9(Y"`&rf"`&rf"7DLDLDn!!93C093C09!rf"`&rf"`&rpCDLDL!! C093C093"`&rf"`&rf"7DLDLDj!! C093C093"`&rf"`&rf"7DLDLDn!!93C093C09!rf"`&rf"`&rpCDLDL!! C093C093%rf"`&rf"`&rpCDLDL!! C093C093"`&rf"`&rf"7DLDLDn!!93C093"`&rf"`&rf"7DLDLDj!!M!! C093C093"`&rf"`&rf"7DLDLDn!!93C093C09!rf"`&rf"`&rpCDLDL!!A93C093C09?93C093C09!rf"`&rf"`&rpCDLDL!! C093C093"`&rf"`&rf"7DLDLDn!!93C093C09Y"`&rf"`&rf"7ω!!93C093C09!rf"`&rf"`&rpCDLDL!! C093C093"`&rf"`&rf"7DLDLDn!!,C093C093DLDLDn!!93C093C09!rP!rsjE=mGn=СmC8СWmh w="3!u [?/~/?^?"~PB?(!~PBA %~PBA #k 7j 7n,7n?Y7n?!~Pn?!~pCf?!~pCA?!~pC %~pC 5K 7j 7n̬7n?Y7n?!~Pn?!~pCf?!~pCA?!~pC %~pC 5K 7j 7n,7n?Y7n?!~0n?!~pCf?!~pCA?!~pC %~pC 5K 7j 7n,7n?Y7n?Y7n?!~Pn?!~pC`f?!~pCAMz#~pC 5K 7j 7n,7n?Y7n?!~Pn?!~pCf?!~pCA?!~pC %~pC 3k 7j 7n,7n?Y7n?!~Pn?!~pCf?!~pCA?!~pC %~pC 5K 7j 7n̬7n?Y7n?!~Pn?!~pCf?!~pCA?!~pC %~pC 5K 7j 7n,7n?Y7n?!~0n?!~pCf?!~pCA?!~pC %~pC 5K`I>~}7gP1~r''ϟiQD/aE/Qu.?^׫?#PB(E(!PB(B Q%PB(B Q#k( Q7Dj( Q7Dn",Q7Dn"EY7Dn"E!PDn"E!pCf"E!pC(BE!pC( Q%pC( Q5K( Q7Dj( Q7Dn"̬Q7Dn"EY7Dn"E!PDn"E!pCf"E!pC(BE!pC( Q%pC( Q5K( Q7Dj( Q7Dn",Q7Dn"EY7Dn"E!0Fn"E!pCf"E!pC(BE!pC( Q%pC( Q5K( Q7Dj( Q7Dn",Q7Dn"EY7Dn"EY7Dn"E!PDn"E!pCaf"E!pC(BE!pC( Q%pC( Q5K( Q7Dj( Q7Dn",Q7Dn"EY7Dn"E!PDn"E!pCf"E!pC(BE!pC( Q5pC( Q5K( Q7Dj( Q7Dn",Q7Dn"EY7Dn"E!PDn"E!pCf"E!pC(BE!pC( Q%pC( Q5K( Q7Df( Q7Dn",Q7Dn"EY7Dn"E!PDn"E!pCf"E!pC(BE!pC( Q%pC( Q5K( Q7Dj( Q7Dn",Q7Dn"EY7Dn"E!PDn"E!pCf"E!pC(BE!pC( Q%03N/D(|QoF;(Qė|s@WBt"~8tHqH?s_~/?,?\5Uk]Dz߁EםV{ryWJtߵ$_龿.j ]{0zy]¥dVr93N^F:]ɻNw7ԁ$Nw{SInm {SR>4mmw8L7IEMvx'S|S|'<_+]Xtlp볛-ιmqꜯ.n:Rkz{qkA;qZMvo9ץquίzǩs~xuzיս]/8*[+ؿj,nj!Ԯ6]^q緽xu;ӵz98us{9oMUݟn羥:?N?$SꙮZzӵZK~Իx:~_8u㽧kVzy~ӵZ_S~_[Ikyo>^uջx:6${>^`fmOR{2WS\h5VM|\M|=lm|7u+'2/}gߺ:KQ`-)wOr:xJ{أY5v:x?|VkStuX=l#]cGOR{o^x:~*9 gjkOIZ:tu=eZ5V]o}.s<}wi[oxk_ӵZݹ|_ϴ=ޞu|ɼGOrإ={o,$Gvn> -9;g[NVo}t|;GÞoHv>omqVto?'9w}'![}k|v$;+'9[|뷇|q$;3'9;˭q;ηZ }>}|Wqƿ>ٍŎǹ?[-^cHInWw??|#'9 zOrwF-'9w -{妿z$ggﺹ}]7 wI7qY7[Z>|=~Mǣkƾ~{JIOO߫w2ݞ?ttnG Xf!'馣^tG߶4GƺmS>I7z OIxY7uxtxՕn_{G-\M|$ot5i:JI>M} kt3'4?4?4} 6\c|>ɧ騗ttԛʹ4#]ct^}Oqg2vZ4};g{q<5o3 k[5 믿t7M׿e79e8_PON9>\~3%MQY\,?ח?GY~KY_LKD4s.̜ '3B s.̜ '3̹p2s.0̹p2s.̜ '3B2"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.,s.9̜`fE03 s.9̜`fE03 s.9̜`fE03 s.9̜`fE03 s.9̜`fE03 s.9̜`fE03 s.9̜`fE03 s.9̜`fE03 s.9̜`fE03 s.9̜`fE03B2"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\3s.0"s̹f\aE03"s̹f\aE03"s̹f\Y\3s.9̜`f΅\3s.9̜`f΅m\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅eE03"s̹f\aE03"s̹f\fE03"s̹f\aE03"s̹f\aE03"s̹f\aE03"s̹f\aE03"s̹f\aE03"s̹f\aE03"s̹f\aE03"s̹f\Y\3s.9̜`f΅\3s.9̜`f΅m\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅\3s.9̜`f΅eE03"s̹f\aE03"s̹f\fE03"s̹f\aE03"s̹f\a΅_\0/̹sw5d_&bGwҜ̹ءoq>?.֢N/?@/Ώף,?5~ @(!0J @(!PBad @(!PB@!pC %pC 5K 7j 7n ,7n @Y7n @!Pn @!pCf @!pCB@!pC %pC 3k 7j 7n ,7n @Y7n @!Pn @!pCf @!pCB@!pC %pC 5K 7j 7n ̬7n @Y7n @!Pn @!pCf @!pCB@!pC %pC 5K 7j 7j 7n ,7n @Y7n @!Pn @!pCf#pC 5K 7j 7n ,7n @Y7n @!Pn @!pCf @!pCB@!pC 5pC 5K 7j 7n ,7n @Y7n @!Pn @!pCf @!pCB@!pC %pC 5K 7f 7n ,7n @Y7n @!Pn @!pCf @!pCB@!pC %pC 5K 7j 7n ,7n @Y7n @!Pn @!pCf @!pCB@!pC %0 mD-?@?ė|O2QB=a<|~vPGqZ~jϗ8#sz^-/Wq{%F8B q%J#,q%J#GY7n#G!Pn#G'pCf#G!psO8BG!pC8 q%pC8=q5K8 q{7j8 q7n#,q7n#GY7n#G!Pn#G!pCaf#G!pC8BG!pC8 q%pC8 q5K8 q7j8 q7n#,q7n#GY7n#G!Pn#G!pCf#G!pC8BG!pC8 q5pC8 q5K8 q7j8 q7n#,q7n#GY7n#G!Pn#G!pCf#G!pC8BG!pC8BG!pC8 q%pC8 q3k8 q7j8 q7n#,q7n#GY7n#G!Pn#G!pCf#G!pC8BG!pC8 q%pC8 q5K8 q7j8 q7n#̬q7n#GY7n#G!Pn#G!pCf#G!pC8BG!pC8 q%pC8 q5K8 q7j8 q7n#,q7n#GY7n#G!0n#G!pCf#G!pC8BG!pC8 q%pC8 q5K8 q7j8 q7n#,q7n#GY7n#G!Pn#G!pCf#G!pC8G!pC8 q%pC8 q5K8 q7j8 q7n#,q?!s\#6_Ï = OQc~`#Ǚ:@yY R]{?z>W͟SHx_^c0W`j59S#L/~$\;tεԾ};dk'x?)T/RgDuֵ7=iQo >jQmğ}[uG'^IzhkWY=c[[o=Ӄ[B%x,]x⵴O[|x)>{xo#RQOڱz=s^c w]t|kut O7Ҕ'^\{:"'^M|kug~מ_pm~gp mqjD}3?>wOL3'xgp-~gpzgp)t?3^ j+gg+g@x땳Sz >^9vyl z%8>^9#:Pg+gn3xsY; z;OW}g+羽3xsfjB}OWέQٜ'T' s+v3Wzrn;?{w+V +VT|{|FT'^?^9]f~Yo3W7 ޔgp'?{ OWGĿ -^+~g+g8_w^9+>^9w -+gQOk kJG*txr+>k]|g~#>[}g_|>zsO|_rNU]{ʹ;>Z9ʹQ?k7OA +g|>ژ7`gp{Ugpvgp}\+~w~_}W'^/>Wxz>Tw?"|Nz\+~>>r_ÝrW≿k'^}^}ە>Ze*>r[+?kKZ9QD=c *b?Kz^]~֣zOPh3ˈC(=uQ/?W|w 8">Ǐ#:Ў#gpZ~gp{3Z: Fb HV+>MY|w&Q '+ggpܥ^y|w*QJu Xeܵľ? s+g=N|{q|{3?{'p~ʹ? ǿ^9 (+綝+<3Wqgpr>kz|g~z;ܨa(ߨsXB.?9YvBP^l+sV =8gj 9k4`sҼq΢`+,ZH W8٬)3 "u0(*"E^U04)*ö9U0@Eȧ!*45` -ҝV01YUČf U6`<'rN -ZVW -_ -p9\#+ZCW.ӷ(<*"^,ڋT, ̽1Fz9N`9,8; -N^D^kz -/,yW3 -sF,+XΩLz+xpl<)W^rЕ^rP;x9 ` -0A/BU0셖}" -ǂ<E/$*#f -/A0*, ]3Y@! -0M`8 V!# [8Ιg@1,>,`3YڶL8j ,,3Y |& &C3Y@! -9_`3deh0L`Fhyj(`S+ ml8gɂΠ{qκL|Fq}& BC PqNs, 3YPg4qɂg`s3YR|& V#3YQdAkDI V54zU0F3Yؘg1wZ>}&kQs+V ۘga78v0'>hݘ*7b|g|Lև$fTy3ߘ7۟_{ǡ1~8RnRF\g^lxEX_mBo~{D_ Ϯ_vԵ0n\mHk@\[j^9rP*jwpVύ_i*X@bSdRO=]1T^U\/>7-ᴟ"֗GAΫR:*HX_I1ڝ^GwӿO +xO%Gz f!@Z`fS%`F9qh?v5lN޴t7cnv,\TQ5~~?=F|Cg~>k\Wϻ^_a_s^??ӿv)?׬g]ӈK*?刺Qlל/(5e9?=3e#k 2nm]9AZӲQm6#siD斫Cje1 #jF&Mɵ\ms"6k#`7kͥUZ8UϪ/Z [!V< +1ZfG=6zhOmОv۬=M6w|JZu?(B׮ +raVY)HͣRa=Y.F3mƩy̓qjTqjl`=cR?S`ОA}qjTvqjc`3M~aDc`udyAc,ׅqj9ⴛAZAٴ1NŃ}PM{*callN>mߌJhOmyӞ,=*]]A8)gWũxI`OŁtN۬= ũa8U"԰> yqjlub[A1N̓UZ` +,PӢ0 H4$ZBy,o=~aץ?&nڿ(OurZL_JJǵ~_T0O?{ߪ_YfV; Yoz``{әX~}{h3J޺9ҺVQC7aB,0O9sԽ)V1ݬt܍1L*ofds=4[VED] :f;SG3kͽ:?w>ʢӧ;1>ڋ~|ZBQӫ>MF6ӽٮ6( s\8bVWlʦ$a+Zw"lWFh/Vu1k^Yd:r+̮+R P:Byw%*_PbwmtUE29u-ڋkv6ŵ3sܩ'R̩BNhdXНN{!t{^^(C@a 炽jrf0j=#ݖӭƹ9fZ&NZi"0h/ărFiE\~i/ăJlFZxwsLROzL+<Zqz^GD@i/ă.VY<8ܜ'Ń*j&M<8Xۭߔ*J|GLgIJjWVi/ăcNrO WxPIO,Wxp̹)_m1U*O~UWxPF(Ǔq&{ܝ3=98)_UIEj@(_U2ICOWxӲ*w)_mAW|ʏ(_9V|U$ ̩vaFoF{!v.?9F6}QŃsCj*(J'ŃS:~M31*^r/,Qź+pUQ#.\ul.ƔP2b/?)_U^e;]<,/#ZLf.\.^Ǜi/ă˯W*ݸ(_U..Om^(ҿU RFry'C<9F6{b.V|ua}u=GHPadX_.sa}U4K2t_!ܵW_T1nn:|YFkaWxpUcrzia}uBGnR:ă[ +C=odWQP?b5rJc\6)ۿN1.OͺO#NzszۼalZûC9F6[UMkx\n [?96~6qs0Ykh 䇖+%X䇖R맴M~h)}Z~Z~t&?|]I!?|Z?Z5Gg6vqZ~G6c\u3a{v,5w)~1. p.C ӔN۬6ͻλ}PݦirryZCi(m4Ciny,CiZnݦboZûMs.CiF9n=%wSV1wm0h ݦ)mdM3~6o5tf~6U䇖D~h;a -_?5|uZ~>䇖l>j!?|,yp)}54ZHkh\cW'?|ߴuMCnwY<54~_@x̓xU̓TC54^̓?)fݭҁ~ht15\A +ݯ#%:\Z G?\0+t%d+3D?\ [4ZCAZG/ +^w)~9_Ŏ~ho#5,eO}2ypve*h ̓sb?/7}E:__-~9)~9|Y)~9|Y)~9|Y )~9|YJ±×; ?˺×u__v~__v~__v~9|<'Sr˧h ̓{c?//E54D?4T~hǣ/=i ̓~__.>ZC൱+~__ޕACߋOkh<)~9gVuG?4ZyMkxYW{P-u/g#Ln)d/s!o]N9_CdnM989D"=j +\/r]M 0"Smss0Y09fU(8NlՔl ֧ዜsݯ<67s%`lsENů]lh}VoP*(D~hU.̬Tdr1Zik8Z}*ƩD::TSTg"*ƩDcI<*;06qms6qDd|H3D:S|u=ƩP'ςqzQ0N/ )1Nm(8 vҞ_Q67݅T/yԉP +Dq*ƅ ^(NE8~u8m6Bq'00˯.<i3:x`OyPOq̃6l6倱P6ⴙ<ϡ8m~fP6)<8m<8mi3InƢ8@sQzv@q(N=;pKaO=;_辟dzz,S88쀞eԳ}ܯ1A-ũg3zQzv/إ8`Qzvoۢ8쀯ۣ8쀏MYWԳݣ~0yLSt}ũg+LStHckT#ۙF6=1N̓ +SS` m>'Ʃyڕcl0LS`T1a'Ʃyqjsb<G6HhƩyB9B=g^{=oտϊA}781 qiuo׷Aoy}w/{? )$RH? 9&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?09&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?09&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?09&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?09&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?09&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?H19&rL?09&rL?H19&rL?H19&rL?H19&rL?H1 w^ ?|]Fmw֏ 1gq`_mOg ߘ>o=|{ez]+"{:YO!iJgNp9~v߽Sdnn;ii>Aw~z Bڋ֝ω 3_3l绻(q} Ϥgh/Λs̾x9}=oQT +}&_l5Qak +BP΢ui/fwJC]1uQh/F{Lz1uk^Yd:+S̮Dtf޽J{-7ǽsUnM]՝M{qm;;9s:<|ݟAxЗQN jbt{5:uX#"(a5+zFź/~mڿ vc\dxp)5|UȗG)_| N/)_u_J٬^dxpAj. ^i/ăCҴ4^n\*f`uuga/_KDtaWxp)c|U!#={|_!Tʆ!D :s:ă"Angb}U ̅U.C<}a6Wxpr(_CqslC<[(_QZ!`}U/-0AeZX_:|Ѱ:ă[ C<ŦVJ930C<(2a:Wufa}Uzdxpoedxp Wxp{|Bfb}uua}U=cd*uy_WX_ +3*KX_YeR:ŃWkS>V|[^zog}।O! o%} %} %} %} %}y)sL(sL(sL(sL(SKIcBIcBIcBIcBIb^JJJJJRPPPPҧ>DŽ>DŽ>DŽ>DŽ>ż9&9&9&9&)楤1111O1/%} %} %} %} %}y)sL(sL(sL(sL(3[IcBIcBIcBIcBIb^JJJJJRPPPPҧ>DŽ>DŽ>DŽ>DŽ>ż9&9&9&9&)楤1111O1/%} %} %} %} %}y)sL(sL(sL(sL(SKIcBIcBIcBIcBIb^JJJJJ VPPPPҧ>DŽ>DŽ>DŽ>DŽ>ż9&9&9&9&)楤1111O1/%} %} %} %} %}y)sL(sL(sL(sL(SKIcBIcBIcBIcBIb^JJJJJRPPPPҧ>DŽ>DŽ>DŽ>DŽ>ü9&9&9&9&)楤1111O1/%} %} %} %} %}y)sL(sL(sL(sL(SKIcBIcBIcBIcBIb^JJJJJRPPPPҧ>DŽ>DŽ>DŽ>DŽ>ż9&9&9&9&)楤11110o%} %} %} %} %}y)sL(sL(sL(sL(SKIcBIcBIcBIcBIb^JJJJJRPPPPҧ>DŽ>DŽ>DŽ>DŽ>ż9&9&9&9&)楤1111O1/%} %} %} %} %}y)sL(sL(sL(sL(3[IcBIcBIcBIcBIb^JJJJJRPPPҧ>DŽ>DŽ>DŽ>DŽ>ż9&9&9&9&)楤1111O1/%} %} %} %} %}y)sL(sL(sL(sL(SKIcBIcBIcBIcBIb^JJJJJ VPPPPҧ>DŽ>DŽ>DŽ>DŽ>ż9&9&9&9&)楤1111O1/%}?@W()X=odW_~\k1(a\6)[1.OͺO#Nz0wG~.rS_Jh ٴ.OY@k..O53)O-ZûǬU:̓.]54Kkh <y~~htAkh4Y54!Ekhtc`Χ%~xܒFl%'(SQl\䇣G{bP~-o5mrGuW F6^GUFkבr\o5\^pX`  +r +[-W+pLۼ.COr2h -WP~hBuB+ZCD臖+t'\+!5\'m& +z[a¨O+(D?\AΈ~hr=z-WLrqa?eX`sh -W) ORa)<8e92-~4*S'?A} 4΃i\)<*Syp5Lp[2i\ )<pׅi\)< ?]2̓a?ew-_b]rw~-_ )|}w=r~-_[/}rׯ[~Ua?#_OS~-^~x|m~]yl#`_-/OU{y?nWN3۽wu_m/n~=DŽ=ż9&9&9&9&)n1n1n1n1nO1/u{ u{ u{ u{ u{ysLsLsLsLSKݞcBݞcBݞcBݞcBݞb^RPPPP=DŽ=DŽ=DŽ=DŽ=ż9&9&9&9&n1QPPP=GݞcBݞcBݞcBݞb^u{ u{ u{ u{ysL9&9&9&)n1QPPP=GݞcBݞcBݞcBݞb^u{ u{ u{ u{ysL9&9&9&)n1QPPP=GݞcBݞcBݞcBݞau{ u{ u{ u{ysL9&9&9&)n1.|9&9&9&)n1n1n1n1nO1/u{鏺=DŽ=DŽ=DŽ=ż9?RsLsLsLSKݞcn1n1n1nO1/u{鏺=DŽ=DŽ=DŽ=ż9&9&9&n1n1n1n1nO1/u{ u{ u{ u{ u{ysLsLsLsLSKݞcBݞcBݞcBݞcBݞb^RPPPP=DŽ=DŽ=DŽ=DŽ=ż9&9&9&9&)n1n1n1n1nO1/u{ u{ u{ u{ u{ysLsLsLsLSKݞcBݞcBݞcBݞcBݞb^RPPPP=DŽ=DŽ=DŽ=DŽ=ż9&9&9&9&)n1n1n1n1nO1/u{ u{ u{ u{ u{ysLsLsLsLSKݞcBݞcBݞcBݞcBݞaRPPPP=DŽ=DŽ=DŽ=DŽ=ż9&9&9&9&)n1n1n1n1nO1/u{ u{ u{ u{ u{ysLsLsLsLSKݞcBݞcBݞcBݞcBݞb^RPPPPg=DŽ=DŽ=DŽ=DŽ=ż9&9&9&9&)n1n1n1n1nO1/u{ u{ u{ u{ u{y3߿yBݞ0u{nVu|jzL~ 3~O?~/{B5τ׽{Iܠ}x-owS&s:zXf*u +cdA04A+\,T +vC)ܗ3Fe0|!9& y\ms{96k#`7u +۩ܗR[c.a|+ `/qt!/CɡiyC{l$6sm +Оv\|Q1`d/XB3ė +U TqJA^Yau&mL,=`}*ƩY:TSVG6뜥Z89kl?1 cG8]Wm[8ݶYyR1Nu.I5<@{sT笡/ƩPقqr(mV0NmR0NE×!ўS%BBq0P6PZDq*^(NE8´Bqڪm649F6!Nq̃~6i7e`s7~QzO7u(Nyԕ#?)Nx8~f񠞘ũN̋7۬i86+hOmVFJ6wl5ad%:)Nx_{Sv`֦857iY'y)NnLffW cӞ&`=ъq*jcB>8]yleb1yfmu:8ʦq*KjST<}4|0N/۬\Y ua,=*]]A8)gu9ߎZ9fea#l,킭ʡstt"ALsywA63SE>Wݹs9^sޝ911]'fn $q,ڋY])bvעD;]ϗck^Zݧ1ݵ[ߑckפX۵fqS~t^OPbCy7*_btUݏ69?v-ڋk_w6ŵcssgR̩Chdw^3Aeb^ހ"`/|o@~&au;7~7 4FU}N6XN#C!Ob}u~SSX_Gn~f+SSj)_OuNߧtTu|u>ۑ '[`*X_]Ou_X_]OUK]X_]OկY~WU-Ȣ|:}UKYX_NԆUKZ_kX_]=rGꔯZ_9 Z_fX_N_)-Wӿ#9JZ)_RY/WS yj~Y {,+M 㻕_'W/uQZ_Uu uůk$}X_NIGހzPN|76ԉa/{<4{qW{<7 6~i}o(X_uc}鏅[6φ[D[^XWo:uuWoNw^~t~ٜ:a:cN:Tߟw!{Qߊ񈏿}_g}!9Qԧ0000>DŽ0000>DŽ0000>DŽ0000>DŽ0000>DŽ0000>DŽ0000>DŽ0000>DŽ0000>DŽ0000>żyyyy9&yyyy9&yyyy9&yyyy9&yyyy9&yyyy9&yyyy9&yyyy9&yyyy9&yyyy)楨̣̣̣̣1̣̣̣̣1̣̣̣̣1̣̣̣̣1̣̣̣̣1̣̣̣̣1̣̣̣̣1̣̣̣̣1̣̣̣̣1̣̣̣̣O1/E=`E=`E=`E=`E} E=`E=`E=`E=`E} E=`E=`E=`E=`E} E=`E=`E=`E=`E} E=`E=`E=`E=`E} E=`E=`E=`E=`E} E=`E=`E=`E=`E} E=`E=`E=`E=`E} E=`E=`E=`E=`E} E=`E=`E=`E=`E}y)((((sL(((((sL(((((sL(((((sL(((((sL(((((sL(((((sL(((((sL(((((sL(((((SKQGQGQGQGQcBQGQGQGQGQcBQGQGQGQcBQGQGQGQGQcBQGQGQGQGQcBQGQGQGQGQcBQGQGQGQGQcBQGQGQGQGQcBQGQGQGQGQcBQGQGQGQGQb^zSVOU g"ݎ9nB6` -Swa2St\5Leְ6eGB~hQF@~hY2u%2SB~hB~hK䇖۝F~hypqztCԕCԏs}ZnD?YlIkF?.c\rpɽ]ApŃ͂~8mNҴ6~86AE?t;"ZCc\.ʥ5t;~vL>&[ 혾1}oCc؛nǜ 혡1+n|G9nTû1:mKZCcݎ3@?t;NXCE˓2u-SnCԏ%` -S?s]䇖eg*5L,M~hYZ~V䇖+i䇖Ki ̓3Fcl䇖d>-S?䇖ݠ54̓[Y=yp)DkhB?4*G?w{54ZCU*yrQ0jOAIA*̓xC52̓~4^ )U-¯(_"YδP%߯j<wr"|]_ѝ"u"*a|];wVp3]w"cWE߯Ҙl&i.O|.?~]~]{u"|\8߯~/g߯zڍM6MDk.;ғXN?Y??q1//yE`?>>LO]5{x_7)" z/! Fˣ4!ڟ}_ 7?daDí,!.Bw?kIȻ&Mn& dyۊW̼32^%f޽;2^dw/yy|"K~̻EF0+KFdjm_3y5-BF0Y"yFFc~-2zXu`=~潽ƌ *-HM^a%|hU^^w/e^aVDz#}ٷw + T15"v}eFc\hy _"Rƽ}bLjhϞ23PqoĘ%)>۾{ h[hcO=eg`b(1_yqo*h_HصDbwqo}?Rƽ}HuFSƽ}ꌦ{ M323p#egUd4s{ M3235WL˹GF{ɯ|{ T2NXd+@Uy)>5g@k~w*3 62{ T3*ougjqoRƽ}K8Xǽ}<1}>wXǽ}KZ/egjqo+Xǽ}3qoRƽ}K>^K>U륌{ T237׼G>U륌{ W>U륌{ O>U{ :eg&)>5qIMH!S>븷@]@)> J<&oU^z)v}W^ʸ]_U2nWyU=y:nU륌۵rz)>}Xǽ};"Xǽ}KZ/egjqoRƽ}3qomޱxbZ/egjqo*Rƽ}0JB$eg&)>-"2O;q>O>U륌{ T23o{ T23Pg=eg`{ g㎷O;q>O>uSƽ}꬧{ YO23p{ ]\Ȕ@q>W>}X} <{ %qoRƽ}'F9X^ʸ@z)>c:guܧO;q>5;-{ ȩbZ/egj'2XiֆyuܧO'qoRƽ}5qokugjqo +30b3p:guܧO'qOZ/egjqo{ugjq>g>}X} ܱxbxXǽ}G:2{ T23P^ʸOO3q>W>}X} #q>g>}X} ܱxbXXǽ}KPhiOcK30b3p:guܧOg?"K>븷πc3pOd4O3q>W>}X} <{ T23{ T2g`uܧOO3q>W>}X} <{ ԕ23PWFʸO-q>{>}X} X} b3p:gug&)>5AN3:g`uܧOO3q>W>}X} <{R} b3:guܧuܧO+q}q}bg q}bg q}q}bg q}bg q}#1>3>3? (#q.wyi6a{$U?_15,ؾzdk8'0(:W%:c|Te=,VP+a|/C.d4 `k# 6|ܔhU8VTխ~_}r=EHb>6235*+ S-!\eg11јDY`1UYev p>+F`@Bܒ\QXKsEwgf4c}9w7']cԒ'0h˻335f퀖~?G=ZϪ/mnѺɵ#њ3tT јu1.s]YMSc5ާUZiDu>[xVIt\zb&Fc>xҘ5ާ\H1kCbjR~?UicO$* bO+*}zk[cޗx>˻#vOy]}hӊCo:v c*_}UR. +b%ݧۢ1KO+pm՘RMc^5eIxO7@nAݔtrnόƼ=>ݔ>ݔxHL*tn*})O:%ݧrp}f%*Iܷ'ݧrp,eFcVKԘO+fjۧfV'ާADΩrpOO5Srp۟x*kSVStN[N:y}}aO>U%h̚i&Fc~[DFct(AF9i*z4fRQ.Sr>ݕ+N̦+wOw`>ݕ~tWj^JtIOA=}Wh_Tڅ'~*w&iUsi}Ә.Ktטb"1$|W|Ot}]>+w!iN~hꙒ01Wy`ƬƲјki堦 >ܯοVurp+ާWOO}zj霞sXݼ}ziZ/)Y(1]>*9n;yrpNji̷Œ\51WxshjgCxVzrpuo>:9:PS3Ωԁ]1zT@=_tJД?ݧR8!ݧRX=ݧR$/T^wO3LSgOhCtJPGtJPٔSsIcVk|(Kԁ.tJصf::POྍtJ3~g]fj)&SVStN5}4ާmK`јk. *mT9ab4eT9X{Ok\Szx*1}\JKT9~vEdFcގx*rp]x*s\#ާ&[JPtJ[Hԁג +v4T|JؗnŌƼ>:H>:@H}\GOT T@=ƎtJ*tJ؞HԁَtJ؞HԁM{sZ9Wq>:9>: A#ݧR6Kc(}*u@+J}*u`+9=4ζ y}:4fx1_xVn׵r=ާ=ާ|>=5fMƼ>4fy}Z9W>ܪډizrp;=ާ5%}zk[cY:Ƽ>}4u1/[O+}Z9/ ާ5}*u`T@MtJS5c{;21oq)ԁmq-ԁ<ݧRDOlǽTVtJPtJ( G:U TVZO(}*u`S 4f:d1+'G:>:PIq=ԁ*/z$T]}*u~q=ԁmz$۾HR#I#I*t}s00둤#I"r~A>UUSVJrp[z$:>Uw\$u@T9q=ԁ>Uֈ}\Inq=ԁ"z$u#HRUmOsӘ#IF\$u`[F\$u`S;pNl#IԒSu.>:-K\#sH:\q=ҫ>LW3urNikB[|i0rTM/. [pB4GýN {_kB4R=kOH nccV835sԈ]\~d4zu/ј'ј{LwLD\2"Sc'u%Fc|!k׳DFc52l1לmL?S5-Y1sF\+2xh\s=#1,ILYԘ5qL&@l!s֘k"5"Sc~wɌ<+2ܑјWB@Ҙ5ڪ{5ZU_k^S~u֔lUSsT=˾l[+C +bƚҭ&Ŝk'ј-\M‹yp5R"bjZ2r;}KW%A1myl)㪄+FhUf$f՘=e\|325f1RmuFqu‹qub=e\/)Mc>qۦ1Wi]c9RoKgʸr#eV9hDb*]ˍSc32-Ō#evh2n;4kۆ\@d4g*+vFʸr32nMU>uFS%X1RUSL"1#evjW,ݶKcc]M9XsUx)6`x)6`x)68b)K)kM9Xu^ʸM9X^ʸM9X^ʸM9X^ʸM9X^8`z)v:nWV2nWV2nWgvy:nWORuܮZ/eܮZ/eܮZ/eܮZ/eܮZ/eܮFvu:nWV2nWV2nWV2nWV2nWkv`z)v`z)v`z)v`z)v}:nWV2nWpdjUە5N+k2nW%eܮ|X +qrv)v`݄)v`]@)v`RIxX827RIx38 Kz)$<߮Od43qbujqRIx6GdjU륌PRIx38 Kz)$<,U륌g$<!qU8 :NR^8 u:NRZ8 U:NCXIxX8 v:NC=Tc'Af8 :NNLy_c'aZ/ec'Ag=ez8 K=SIx̔qRIxX꬧YO'YO'A{8 uc'aZ/eE.Ud4+qj8 Kz)$<:NCN$<,U륌P{$c'aтhw$<,U륌D"Z/e+븏0brwo&<|^ODzN\ּqOuN˧W$,;?ӇgZޞ pY8ݻởQ?~TGO'?>q_{2g?՛'"@ԓd@=qODܓ'3{20 ̸'2SOfܓd`=qOd ̸'3{20 L=qOfܓd`=z20 ̸'3{2 3d`=qOfܓd@f{20 ̸'3ɀԓd`=qOfܓ'3{20 ̸'2SOfܓd`=qOb ̸'3{20 L=qOfܓd`=z20 ̸'3{2 3d`=qOfܓd@f{20 ̸'3ɀԓd`=qOfܓ'3{20 ̸'2SOfܓd`=qOd ̸'3{20 L=qOfܓd`={20 ̸'3{2 3d`=qOfܓd@f{20 ̸'3ɀԓd`=qOfܓ'3{20 ̸'2SOfܓd`=qOd ̸'3{20 L=qOfܓd`=z20 ̸'3{2 3d`=qOfܓd f{20 ̸'3ɀԓd`=qOfܓ'3{20 ̸'2SOfܓd`=qOd ̸'3{20 L=qOfܓd`=z20 ̸'3{2 3d`=qOfܓd@f{20 ̸'3ɀԓd`=qOfܓ'3{20 ̸'2SOfܓd`=qOd lݓd`=qOd lݓd`=qOd lݓd`=qOd lݓd`=qOd lݓd`=qOd lݓd`=qOd lݓd`=qOd lݓd`=qOb lݓd`=qOd lݓd`=qOd #G{20 ̸'2SOfOOfܓd`=z20uOfܓd`=z20uOfܓd`=z20uOfܓd`=z20uOfܓd`=z20uOfܓd`=z20uOfܓd`={20uOfܓd`=z20uOfܓd`=z20 ̸'3{2 3d`=qOfܓd@f@̯ Ƚ_doS*;Vh/?>U_5X5 dR jUD bՀY5`ƪ3V jUd&ՀX5`ƪ3V Tf0cՀX5@fR jUf0cI5`ƪ3V jUd&ՀX5`ƪ3V Tf0cՀX5@fR jUf0cI5`ƪ3V jUd&ՀX5`ƪ3V Uf0cՀX5@fR jUf0cI5`ƪ3V jUd&ՀX5`ƪ3V Tf0cՀX5@fR jUf0cI5`ƪ3V jUd&ՀX5`ƪ3V Tf0cՀX5@fR jUf0cՀY5`ƪ3V jUd&ՀX5`ƪ3V Tf0cՀX5@fR jUf0cI5`ƪ3V jUd&ՀX5`ƪ3V Tf0cՀX5@fR jUf0cI5`ƪ3V jUd&ՀX5`ƪ3V Uf0cՀX5@fR jUf0cI5`ƪ3V jUd&ՀX5`ƪ3V Tf0cՀX5@fR jUf0cI5`ƪ3V jUd&ՀX5`ƪ3V Tf0cՀX5@fR jUf0cՀY5`ƪ3V jUd&ՀX5`ƪ3V TfV jUf 3X5`ƪ3V j̤0cՀX5`ƪ2jUf0cՀL3V jUf 3X5`ƪ3V j̤0cՀX5`ƪ2jUf0cՀ̪3V jUf 3X5`ƪ3V j̤0cՀX5`ƪ2jUf0cՀL3V jUf 3X5`ƪ3V j̤0cՀX5`ƪ2jUf0cՀL3V jUf 3X5`ƪ3V j@̬0cՀX5`ƪ2jUf0cՀL3V jUf 3X5`ƪ3V j̤/{9zUtjp/U9P ~튰ia#Dm@Ce>am6Hk6Hk6Ȥ 63@`ZLkimkim 0 66@`Z`@`ZLkim 0 0cm 0 66@`ZLkXLkim 0 f 63@`ZLkimILkim 0 f 63@`ZLkimkim 0 66@`Z`@`ZLkim 0 0cm 0 66@`ZLkXLkim 0 f 626@`ZLkXLkim 0 f 63@`ZLkimkim 0 66@`Z`@`ZLkim 0 0cm 0 66@`ZLkXLkim 0 d&m 0 66@`ZLkXLkim 0 f 63@`ZLkimkim 0 66@`Z`@`ZLkim 0 0cm 0 66@`ZLkL@`ZLkim 0 0cm 0 66@`ZLkXLkim 0 f 63@`ZLkimkim 0 66@`Z`@`ZLkim 0 0cm 0 66@`Z`@`ZLkim 0 0cm 0 66@`ZLkXLkim 0 f 63@`ZLkimkim 0 66@`Z`@`ZLkim 0 3iim 0 66@`Z`@`ZLkim 0 0cm 0 66̯ Ƚ_k]@Mߧ gmڀ: \Z xNQ%<1}<eTc\U5 +y5!׭E yXBKH wPpVDí":!~Hȣ^uGDý5!sm ˵'{ױ1R r_gdj. `FC?2y={`Vhwͺ1?s%s=#0uߕ0#25z1_G_b4qߑјw!2|=Kd4Y#1?sԘ30Xҥ?gdj"1玌|>1YIbj̚xDƬ Ldj5Ҥ \sNf4\ј厌|22|)VE)תb_m𫳵d꼘$Y5eZRU3֔n5,\S'=1|o)j2^̳JqUdSӫ)]@[ʸ* hcKW\1 &Fcr#1|)㪈/村tqSmO,eV9XgtO}OW{ʸ:_2CSm|)Mc)1, .1s̗jДq[೯GʸrʉT>%\g4e\[GʸИ#evhH hH32n|ꌦ*uFSmOєqu sqUShHKҘXmmSVG\^ʸM9X%^ʸM9X5^ʸM98XmRmqnSV2nSV2nSV2nSV2nSV3N9X^ʸ]9xەU륌ەU륌ە]9x^ەU륌ە]9X^ʸ]9X^ʸ]9X^ʸ]9X^ʸ]9X^ʸ]9xXuܮZ/eܮZ/eܮZ/eܮZ/eܮXRRRRuܮZ/eܮԘI+k2nW/eܮKʸ]9ە)v`=R SRrd/M'ApPg4qRI|]hg$>8Kz)$>,U륌ԘK'A{Pg4qRI|XK'aYXI|B$>+qućjqRuć +qzuć:뱎l#qućz:N\̔quć] :NR^8U:Nz8KqzHe)$>,U륌YO'a2NC=2c'a2N⃪q:NR^8hW$> qRI|ućXI|XK'XI|~8Kz)$>,U륌PXI|XK'aZ/ećjqRI|=qF<јG$>,U륌T2NCMDc'a9XI|XK'aZ/ećEjZ/ećc'񡮌XI|XK'aZ/eć:N4q&+ećjqj8Kz)$>T8}:Nâ7јXI|XK'ayXI|qj8Kz)$>T8uc'ayXI|XK'aZ/em]2NgŬPL$>5K'XI|Xr(dć ećU{DFcc'Nh$>3eJD#ScZ/f\Z^8kz)$>T8ue:NZ^8n2eć)#25mućjq8kz)$>U=јG$>HH'aZ/ećU[bSakz)$>U륌Pj$>U륌P~$>ԕ8kz)$>U륌PXI|XH'a~1ו2NZWF8kz)$>O'AWF8k])$>ڰ"1:NC`$>5AN'a i8XućuP~$>ԕ8kz)$>U륌V2NCM$b'aZ/ećjqRi!Z7k8k)$>u1jϪhU6%F9Xqj2W|Z/e+>\[^jqp{ŇRƽCz)^jqp}6DF9X^ʸW|Z/eG|XcX}ć=qa:ބ3G~ŭ:z$v|~.QBceq}_ CЮ|_$엫"'8A$N bqX@!8 D,N bq3'8 f,N 3X`3'8$N0cqX`28 f,N0cqL3'8 f,N 3X`3'8$N0cqX`28 f,N0cqL3'8 f,N 3X`3'8A,N0cqX`28 f,N0cqL3'8 f,N 3X`3'8$N0cqX`28 f,N0cqL3'8 f,N 3X`3'8$N0cqX`28 f,N0cq3'8 f,N 3X`3'8$N0cqX`28 f,N0cqL3'8 f,N 3X`3'8$N0cqX`28 f,N0cqI`3'8 d&qX`3' f,N0cqX@f'8 f,N0cqI`3'8 d&qX`3' f,N0cqX@f'8 f,N0cqI`3'8 d&qX`3' f,N0cqX@f'8 f,N0cqY`3'8 d&qX`3' f,N0cqX@f'8 f,N0cqI`3'8 d&qX`3' f,N0cqX@f'8 f,N0cqI`3'8 d&qX`3' f,N0cqX@f'8 f,N0cqI`3'8 d&qX`3' f,N0cqX@f'8 f,N0cqI`3'8 d&qX`3' f,N0cqX@f'8 f,N0cqY`3'8 d&qX`3' f,N0cqX@f'8 f,N0cqI _tˁ'ĉ+8;C8X{-HHzU.Y?̸q^{b?|LG>J~Ub#-F0b"#i1#i1#HH$Fň#b3#bD`ZLi1i1"0-Fňň#bD`Z`bD`ZLi1"0-F0c1"0-Fň##bD`ZLXLi1"0-Ff,Fň#b3#bD`ZLi1ILi1"0-Ff,Fň#b3#bD`ZLi1i1"0-Fňň#bD`Z`bD`ZLi1"0-F0c1"0-Fň##bD`ZLXLi1"0-Ff,Fň#b2#bD`ZLXLi1"0-Ff,Fň#b3#bD`ZLi1i1"0-Fňň#bD`Z`bD`ZLi1"0-F0c1"0-Fňň#bD`Z`bD`ZLi1"0-F 3i1"0-Fň~#bD`ZLi1i1"0-Fňň#bD`Z`bD`ZLi1"0-F0c1"0-Fň##bD`ZLXLi1"0-Ff,Fň#b3#bD`ZLi1ILi1"0-Ff#bD`ZLXLi1"0-Ff,Fň#b3#bD`ZLi1i1"0-Fňň#bD`Z`bD`ZLi1"0-F0c1"0-Fň##bD`ZLLbD`ZLi1"0-F0#bD`ZLXLi1"0-Ff,Fň#b3#bD`ZLi1i1"0-Fňň#bD`Z`bD`ZLi1"0-F0c1"0-Fň##bD`ZLLbD`ZLi1"0-F0#bD`ZLXLi1"0-Ff,Fň#b3#>R7Ĉ?.1۬61ⷎ&Ayb_{$&[fQ (LeSk„?!L|_ 엫"&0A$L ba X@!0 D,L ba 3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0A,L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca 3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0$L0ca X`20 f,L0caI`3&0 d&a X`3& f,L0ca X@F| X`3&0$L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0A,L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca 3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0$L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0A,L0ca X`20 f,L0ca L3&0 f,L 3 X`3&0$L/?Ċ&ۄ 0;CП8 ?vP?c&$H?&ߩĉ*Ƿl,qFQBy(>2}rZ@Ģ"%D D,J bQX d%(E D,J bQY`Ƣ3%(E d&QX`Ƣ3%D f,J0cQX@f%(E f,J0cQI`Ƣ3%(E d&QX`Ƣ3%D f,J0cQX@f%(E f,J0cQI`Ƣ3%(E d&QX`Ƣ3%E f,J0cQX@f%(E f,J0cQI`Ƣ3%(E d&QX`Ƣ3%D f,J0cQX@f%(E f,J0cQI`Ƣ3%(E d&QX`Ƣ3%D f,J0cQX@f%(E f,J0cQY`Ƣ3%(E d&QX`Ƣ3%D f,J0cQX@f%(E f,J0cQI`Ƣ3%(E d&QX`Ƣ3%D f,J0cQX@f%(E f,J 3X`Ƣ3%($J0cQX`Ƣ1(E f,J0cQL3%(E f,J 3X`Ƣ3%($J0cQX`Ƣ2(E f,J0cQL3%(E f,J 3X`Ƣ3%($J0cQX`Ƣ2(E f,J0cQL3%(E f,J3X`Ƣ3%($J0cQX`Ƣ2(E f,J0cQL3%(E f,J 3X`Ƣ3%($J0cQX`Ƣ2(E f,J0cQL3%(E f,J 3X`Ƣ3%($J0cQX`Ƣ1(E f,J0cQL3%(E f,J 3X`Ƣ3%($J0cQX`Ƣ2(E f,J0cQL3%(E f,J 3X`Ƣ3%($J0cQX`Ƣ2(E f,J0cQL3%(E f,J3X`Ƣ3%($J0cQX`Ƣ2(E f,J0cQL3%(E f,J 3K_n1ğ(1L}QDzE!AGxŇs$uC~?z(^ /WD,? bI~@"B&X~@"f,?0cX~@ff,?0cI~`3d&X~`3f,?0cX~@ff,?0cI~`3d&X~`3f,?0cX~@ff,?0cY~`3d&X~`3f,?0cX~@ff,?0cI~`3d&X~`3f,?0cX~@ff,?0cI~`3d&X~`3f,?0cX~@ff,?0cI~`3d&X~`3f,?0cX~@ff,?0cI~`3d&X~`2f,?0cL3f,?3X~`3$?0cX~`2f,?0cL3f,? 3X~`3$?0cX~`2f,?0cL3f,? 3X~`3$?0cX~`1f,?0cL3f,? 3X~`3$?0cX~`2f,?0cL3f,? 3X~`3$?0cX~`2f,?0cL3f,?3X~`3$?0cX~`2f,?0cL3f,? 3X~`3$?0cX~`2f,?0cL3f,? 3X~`3$?0cX~`1f,?0cL3f,? 3X~`3$?0cX~`2@̿m~C~soo_s?{ÏcAG-H|>K"ijuT"?|LG>ʘ~U"#-B0""!i!i!HH$BE!"3!"D`ZLii"0-BEE!"D`Z`"D`ZLi"0-B0c"0-BE!!"D`ZLXLi"0-BEf,BE!"3!"D`ZLiILi"0-BEf,BE!"3!"D`ZLii"0-BEE!"D`Z`"D`ZLi"0-B0c"0-BE!!"D`ZLXLi"0-BEf,BE!"2!"D`ZLXLi"0-BEf,BE!"3!"D`ZLii"0-BEE!"D`Z`"D`ZLi"0-B0c"0-BEE!"D`Z`"D`ZLi"0-B 3i"0-BEE!"D`Z`fk"0-BE!!"D`ZLXLi"0-BEf,BE!"3!"D`ZLii"0-BEE!"D`Z`"D`ZLi"0-B 3i"0-BEE!"D`Z`fk"0-BE!!"D`ZLXLi"0-BEf,BE!"3!"D`ZLii"0-BEE!"D`Z`"D`ZLi"0-B 3i"0-BEE!"D`Z`fk"0-BE!!"D`ZLXLi"0-BEf,BE!"3!"D`ZLii"0-BEE!"D`Z`"D`ZLi"0-B 3i"0-BEE!"D`Z`fk"0-BE!!"D`ZLX@_!B9wO]!~U&. u _5aW5'z/eS13(n+ W!}<_;pRS1{|֗ r}mV)BS#D*BǓ2 +9HG֣Q%DjZ|0p7MRURݞ]3IDjU)U[{aiTὥJvuSC>*qjCߢf1+]X4p}qj5~qjKv4)\4O85 +Sc;]`4K+sKb7g1ZqB^c~j&ս璎SO᭦g:αU~xup^Ry:X:5#]Ƭqjۺ85 +t5z Ԙ}LyחՉy'A1Zko?4OHL3"1?1yǢvً9'gS]&$rPE5V9xukrTǩ1=Z#^cUeV+ptSczL%|=1kHV+-Nǩ<$Ԙs[ҵZ9xJjt֎8c3]f{V+GM6xsM:R*OJԘzkrpl}LYoqjzkLƨ+ת]c&=I9b5հUx}]kr0]xy?=*kfkrҚtV^u$Gu/wa-fR {T^5HI~KSc~jSc'ozOrhe=ɡۖc$6p[jC;6/1O1ޓMҥhS {h6n{CmE 㶯[aqvƆq WzO2[ozO2۱/8t vnڰ*G=1VIޓ yd^]!o{]ޓ yb\^TCjט"{!od]=q{-=ɐ_zzO2Mj=ɸ}wCws=55[|{_]+}U]5ڿ欙]Vw_ޓ _sk3~jFN_soGzOr.~Sw5X.\cvwqg$x/\e鯇zI:!h43nΓ<ϯyZ4Ne3g;VR?yiVp~>ENcWvNQr>n9^_ii)gbIGk_fVO~<4O#$X=} :*\+/<4G'Yi9:cW*;O:nIVqzuWqڶ'Ye?X]UN~ԛjY_vdu3ΓNc5vdutGx}$GqzdzWkGqy8_v_iO}4fOGfouMy{d[ӇlW<-~M8gW]7خXÒ7[o]iAݮ@eI+ +$ݮ@ +$[+tخ@ +$ݮ@eI+ +6ݮ` +6[+tخ` +6ݮ`eM+Ќ +6ݮ` +6[+tخ` +6ݮ`eM+Ќ +6ݮ` +6[+tخ` +6ݮ`eM+Ќ +6ݮ` +6[+tخ` +6ݮ` +6ݮ@3+tM+tM+Ќ +6ݮ` +6ݮ` +2sM+tM+tخ` +6ݮ` +6ݮ@3+tM+tM+Ќ +6ݮ` +6ݮ` +4cM+tM+tخ` +6ݮ` +6ݮ@3+tM+tM+Ќ +6ݮ` +6ݮ` +4cM+tM+tخ` +6ݮ` +6ݮ 3+tM+tM+Ќ +6ݮ` +6ݮ` +4cM+tM+tخ` +6ݮ` +6ݮ@3+tM+tM+Ќ +6ݮ` +6ݮ` +4cM+tM+tخ` +6ݮ` +4cM+tM+tخ` +6ݮ` +6ݮ 3+tM+tM+Ќ +6ݮ` +6ݮ` +4nWvnWvnWl]l]hvnWvnWv]l]l]flWvnWvnWl]l]hvnWvnWv]l]l]AfnWvnWvnWl]l]hvnWvnWv]l]l]flWvnWvnWl]l]hvnWvnWv]l]l]flWvnWvnWl]l]dvnWvnWv]l]l]flWvnWvnWl]l]hvnWvnWv]l]l]flWvnWvnWl]l]hvnWvnWv]l]l]AfnWvnWvnWl]l]hvnWvnWv]l]l]flW?~/k"wDn8uӇy#͊OC￷a:9|?2;>Tb=Iიb>I &b?I &lFa( DRAJ!RBJ +a(-RCJa(=ZDJa(MDREja(]RFJ!mRGJa(}RHJ"a(DZIJ&a(RJj*a(RKJ.!RLJ2a(MJ5a(لtNj9a(鄡OJ=!PJAa( 6QJEa(tRJIa()SjMa(9TJQ!I4UJUa(YvVJYa(iWJ]a(yXjaa(4YJehdYJha(ZJla([jpa(Ņ$\Jt!Յd]Jxa(兠^J|a(_Ja($`ja(daJ!%bJ!5cJa(E&dJa(UdFa(afJ!qgJa(hJa(TiJa(jja(kJ!lJa(цVmJa(ᆡnJa(oja(pJ!TqJa(!QrJa(-Rsja(=RtJ!MDRuJa(]RvJa(mZwJa(}Rxja(DRyJ!RzJa(R{Ja(Z|Ja(͇DR}ja(݇R~JhJa(Jb( 4 jb(t J ") J b(9 Jb(I4!Jb(Yt!jb(i!J"y!J!b(6"J%b(t"J)b("0"ҋJ0b(ň&#ҌJ4b(Ոd#ڍJ8b(刡#Ҏj^lS !Gk?۶mc-xyhc}\_bmE!|ݏsZ{8~;c ___^?Wkkܱ;[,ty}_tyw~z endstream endobj -158 0 obj +156 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 157 0 R +/Contents 155 0 R /Resources 4 0 R -/Annots [ 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R ] +/Annots [ 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R 241 0 R 242 0 R 243 0 R 244 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -159 0 obj +157 0 obj << /Type /Annot /Subtype /Link @@ -2398,10 +2491,10 @@ endobj /BS << /W 0 >> -/Dest (.:stockage-des-donnees) +/Dest (.:ocr_1) >> endobj -160 0 obj +158 0 obj << /Type /Annot /Subtype /Link @@ -2409,10 +2502,10 @@ endobj /BS << /W 0 >> -/Dest (.:stockage-des-donnees) +/Dest (.:ocr_1) >> endobj -161 0 obj +159 0 obj << /Type /Annot /Subtype /Link @@ -2420,10 +2513,10 @@ endobj /BS << /W 0 >> -/Dest (.:stockage-des-donnees) +/Dest (.:ocr_1) >> endobj -162 0 obj +160 0 obj << /Type /Annot /Subtype /Link @@ -2431,10 +2524,10 @@ endobj /BS << /W 0 >> -/Dest (.:base-de-donnee) +/Dest (.:fonctionnement-general_1) >> endobj -163 0 obj +161 0 obj << /Type /Annot /Subtype /Link @@ -2442,21 +2535,21 @@ endobj /BS << /W 0 >> -/Dest (.:base-de-donnee) +/Dest (.:fonctionnement-general_1) >> endobj -164 0 obj +162 0 obj << /Type /Annot /Subtype /Link -/Rect [ 71.386457 729.683622 555.889134 709.013622 ] +/Rect [ 79.386457 729.683622 555.889134 709.013622 ] /BS << /W 0 >> -/Dest (.:quand-remplir-la-base) +/Dest (.:filtres-et-traitement) >> endobj -165 0 obj +163 0 obj << /Type /Annot /Subtype /Link @@ -2464,21 +2557,32 @@ endobj /BS << /W 0 >> -/Dest (.:quand-remplir-la-base) +/Dest (.:filtres-et-traitement) >> endobj -166 0 obj +164 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 709.013622 555.889134 688.343622 ] +/Rect [ 63.386457 709.013622 555.889134 688.343622 ] /BS << /W 0 >> -/Dest (.:quand-un-pilote-a-finit-un-tour) +/Dest (.:traitement-des-donnees) >> endobj -167 0 obj +165 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 703.493622 93.647199 689.093622 ] +/BS << +/W 0 +>> +/Dest (.:traitement-des-donnees) +>> +endobj +166 0 obj << /Type /Annot /Subtype /Link @@ -2486,18 +2590,29 @@ endobj /BS << /W 0 >> -/Dest (.:quand-un-pilote-a-finit-un-tour) +/Dest (.:traitement-des-donnees) +>> +endobj +167 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 688.343622 555.889134 667.673622 ] +/BS << +/W 0 +>> +/Dest (.:stockage-des-donnees) >> endobj 168 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 688.343622 555.889134 667.673622 ] +/Rect [ 63.386457 682.823622 93.647199 668.423622 ] /BS << /W 0 >> -/Dest (.:quand-un-pilote-a-fait-un-arret-aux-stands) +/Dest (.:stockage-des-donnees) >> endobj 169 0 obj @@ -2508,43 +2623,32 @@ endobj /BS << /W 0 >> -/Dest (.:quand-un-pilote-a-fait-un-arret-aux-stands) +/Dest (.:stockage-des-donnees) >> endobj 170 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 667.673622 555.889134 647.003622 ] +/Rect [ 71.386457 667.673622 555.889134 647.003622 ] /BS << /W 0 >> -/Dest (.:affichage-des-donnees) +/Dest (.:base-de-donnee) >> endobj 171 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 662.153622 93.647199 647.753622 ] -/BS << -/W 0 ->> -/Dest (.:affichage-des-donnees) ->> -endobj -172 0 obj -<< -/Type /Annot -/Subtype /Link /Rect [ 544.436985 662.153622 555.889134 647.753622 ] /BS << /W 0 >> -/Dest (.:affichage-des-donnees) +/Dest (.:base-de-donnee) >> endobj -173 0 obj +172 0 obj << /Type /Annot /Subtype /Link @@ -2552,10 +2656,10 @@ endobj /BS << /W 0 >> -/Dest (.:affichage-direct) +/Dest (.:quand-remplir-la-base) >> endobj -174 0 obj +173 0 obj << /Type /Annot /Subtype /Link @@ -2563,21 +2667,21 @@ endobj /BS << /W 0 >> -/Dest (.:affichage-direct) +/Dest (.:quand-remplir-la-base) >> endobj -175 0 obj +174 0 obj << /Type /Annot /Subtype /Link -/Rect [ 71.386457 626.333622 555.889134 605.663622 ] +/Rect [ 79.386457 626.333622 555.889134 605.663622 ] /BS << /W 0 >> -/Dest (.:affichage-calcule) +/Dest (.:quand-un-pilote-a-finit-un-tour) >> endobj -176 0 obj +175 0 obj << /Type /Annot /Subtype /Link @@ -2585,10 +2689,10 @@ endobj /BS << /W 0 >> -/Dest (.:affichage-calcule) +/Dest (.:quand-un-pilote-a-finit-un-tour) >> endobj -177 0 obj +176 0 obj << /Type /Annot /Subtype /Link @@ -2596,10 +2700,10 @@ endobj /BS << /W 0 >> -/Dest (.:affichage-hybride) +/Dest (.:quand-un-pilote-a-fait-un-arret-aux-stands) >> endobj -178 0 obj +177 0 obj << /Type /Annot /Subtype /Link @@ -2607,18 +2711,29 @@ endobj /BS << /W 0 >> -/Dest (.:affichage-hybride) +/Dest (.:quand-un-pilote-a-fait-un-arret-aux-stands) +>> +endobj +178 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 584.993622 555.889134 564.323622 ] +/BS << +/W 0 +>> +/Dest (.:affichage-des-donnees) >> endobj 179 0 obj << /Type /Annot /Subtype /Link -/Rect [ 79.386457 584.993622 555.889134 564.323622 ] +/Rect [ 63.386457 579.473622 93.647199 565.073622 ] /BS << /W 0 >> -/Dest (.:affichage-totalement-calcule) +/Dest (.:affichage-des-donnees) >> endobj 180 0 obj @@ -2629,7 +2744,7 @@ endobj /BS << /W 0 >> -/Dest (.:affichage-totalement-calcule) +/Dest (.:affichage-des-donnees) >> endobj 181 0 obj @@ -2640,7 +2755,7 @@ endobj /BS << /W 0 >> -/Dest (.:affichage-predictif) +/Dest (.:affichage-direct) >> endobj 182 0 obj @@ -2651,98 +2766,65 @@ endobj /BS << /W 0 >> -/Dest (.:affichage-predictif) +/Dest (.:affichage-direct) >> endobj 183 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 543.653622 555.889134 522.983622 ] +/Rect [ 71.386457 543.653622 555.889134 522.983622 ] /BS << /W 0 >> -/Dest (.:tests) +/Dest (.:affichage-calcule) >> endobj 184 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 538.133622 77.060285 523.733622 ] -/BS << -/W 0 ->> -/Dest (.:tests) ->> -endobj -185 0 obj -<< -/Type /Annot -/Subtype /Link /Rect [ 544.436985 538.133622 555.889134 523.733622 ] /BS << /W 0 >> -/Dest (.:tests) +/Dest (.:affichage-calcule) +>> +endobj +185 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 79.386457 522.983622 555.889134 502.313622 ] +/BS << +/W 0 +>> +/Dest (.:affichage-hybride) >> endobj 186 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 522.983622 555.889134 502.313622 ] -/BS << -/W 0 ->> -/Dest (.:comment-ca-cest-passe) ->> -endobj -187 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 517.463622 93.647199 503.063622 ] -/BS << -/W 0 ->> -/Dest (.:comment-ca-cest-passe) ->> -endobj -188 0 obj -<< -/Type /Annot -/Subtype /Link /Rect [ 544.436985 517.463622 555.889134 503.063622 ] /BS << /W 0 >> -/Dest (.:comment-ca-cest-passe) +/Dest (.:affichage-hybride) >> endobj -189 0 obj +187 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 502.313622 555.889134 481.643622 ] +/Rect [ 79.386457 502.313622 555.889134 481.643622 ] /BS << /W 0 >> -/Dest (.:comment-ca-aurait-du-se-passer) +/Dest (.:affichage-totalement-calcule) >> endobj -190 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 496.793622 93.647199 482.393622 ] -/BS << -/W 0 ->> -/Dest (.:comment-ca-aurait-du-se-passer) ->> -endobj -191 0 obj +188 0 obj << /Type /Annot /Subtype /Link @@ -2750,43 +2832,32 @@ endobj /BS << /W 0 >> -/Dest (.:comment-ca-aurait-du-se-passer) +/Dest (.:affichage-totalement-calcule) >> endobj -192 0 obj +189 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 481.643622 555.889134 460.973622 ] +/Rect [ 71.386457 481.643622 555.889134 460.973622 ] /BS << /W 0 >> -/Dest (.:lecons) +/Dest (.:affichage-predictif) >> endobj -193 0 obj +190 0 obj << /Type /Annot /Subtype /Link -/Rect [ 63.386457 476.123622 93.647199 461.723622 ] +/Rect [ 538.710911 476.123622 555.889134 461.723622 ] /BS << /W 0 >> -/Dest (.:lecons) +/Dest (.:affichage-predictif) >> endobj -194 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 476.123622 555.889134 461.723622 ] -/BS << -/W 0 ->> -/Dest (.:lecons) ->> -endobj -195 0 obj +191 0 obj << /Type /Annot /Subtype /Link @@ -2794,10 +2865,10 @@ endobj /BS << /W 0 >> -/Dest (.:resume-des-difficultes-techniques) +/Dest (.:tests) >> endobj -196 0 obj +192 0 obj << /Type /Annot /Subtype /Link @@ -2805,1243 +2876,10 @@ endobj /BS << /W 0 >> -/Dest (.:resume-des-difficultes-techniques) +/Dest (.:tests) >> endobj -197 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 455.453622 555.889134 441.053622 ] -/BS << -/W 0 ->> -/Dest (.:resume-des-difficultes-techniques) ->> -endobj -198 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 440.303622 555.889134 419.633622 ] -/BS << -/W 0 ->> -/Dest (.:optimisation-du-programme) ->> -endobj -199 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 434.783622 82.786359 420.383622 ] -/BS << -/W 0 ->> -/Dest (.:optimisation-du-programme) ->> -endobj -200 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 434.783622 555.889134 420.383622 ] -/BS << -/W 0 ->> -/Dest (.:optimisation-du-programme) ->> -endobj -201 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 419.633622 555.889134 398.963622 ] -/BS << -/W 0 ->> -/Dest (.:ethique-du-projet) ->> -endobj -202 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 414.113622 82.786359 399.713622 ] -/BS << -/W 0 ->> -/Dest (.:ethique-du-projet) ->> -endobj -203 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 414.113622 555.889134 399.713622 ] -/BS << -/W 0 ->> -/Dest (.:ethique-du-projet) ->> -endobj -204 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 398.963622 555.889134 378.293622 ] -/BS << -/W 0 ->> -/Dest (.:utilisation-de-chat-gpt) ->> -endobj -205 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 393.443622 82.786359 379.043622 ] -/BS << -/W 0 ->> -/Dest (.:utilisation-de-chat-gpt) ->> -endobj -206 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 393.443622 555.889134 379.043622 ] -/BS << -/W 0 ->> -/Dest (.:utilisation-de-chat-gpt) ->> -endobj -207 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 378.293622 555.889134 357.623622 ] -/BS << -/W 0 ->> -/Dest (.:ameliorations-futures) ->> -endobj -208 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 372.773622 82.786359 358.373622 ] -/BS << -/W 0 ->> -/Dest (.:ameliorations-futures) ->> -endobj -209 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 372.773622 555.889134 358.373622 ] -/BS << -/W 0 ->> -/Dest (.:ameliorations-futures) ->> -endobj -210 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 357.623622 555.889134 336.953622 ] -/BS << -/W 0 ->> -/Dest (.:conclusion) ->> -endobj -211 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 352.103622 82.786359 337.703622 ] -/BS << -/W 0 ->> -/Dest (.:conclusion) ->> -endobj -212 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 352.103622 555.889134 337.703622 ] -/BS << -/W 0 ->> -/Dest (.:conclusion) ->> -endobj -213 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 336.953622 555.889134 316.283622 ] -/BS << -/W 0 ->> -/Dest (.:notes-de-code) ->> -endobj -214 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 331.433622 82.786359 317.033622 ] -/BS << -/W 0 ->> -/Dest (.:notes-de-code) ->> -endobj -215 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 331.433622 555.889134 317.033622 ] -/BS << -/W 0 ->> -/Dest (.:notes-de-code) ->> -endobj -216 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 47.386457 316.283622 555.889134 295.613622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:cahier-des-charges) ->> -endobj -217 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 47.386457 310.763622 63.334211 296.363622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:cahier-des-charges) ->> -endobj -218 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 310.763622 555.889134 296.363622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:cahier-des-charges) ->> -endobj -219 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 295.613622 555.889134 274.943622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:contexte) ->> -endobj -220 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 290.093622 77.060285 275.693622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:contexte) ->> -endobj -221 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 290.093622 555.889134 275.693622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:contexte) ->> -endobj -222 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 274.943622 555.889134 254.273622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:projet) ->> -endobj -223 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 269.423622 77.060285 255.023622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:projet) ->> -endobj -224 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 544.436985 269.423622 555.889134 255.023622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:projet) ->> -endobj -225 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 254.273622 555.889134 233.603622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:realisation) ->> -endobj -226 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 248.753622 77.060285 234.353622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:realisation) ->> -endobj -227 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 248.753622 555.889134 234.353622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:realisation) ->> -endobj -228 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 233.603622 555.889134 212.933622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:cas-dutilisation) ->> -endobj -229 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 228.083622 77.060285 213.683622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:cas-dutilisation) ->> -endobj -230 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 228.083622 555.889134 213.683622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:cas-dutilisation) ->> -endobj -231 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 212.933622 555.889134 192.263622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:difficultes-techniques) ->> -endobj -232 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 207.413622 77.060285 193.013622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:difficultes-techniques) ->> -endobj -233 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 207.413622 555.889134 193.013622 ] -/BS << -/W 0 ->> -/Dest (CahierDesCharges/:difficultes-techniques) ->> -endobj -234 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 47.386457 192.263622 555.889134 171.593622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:manuel-utilisateur) ->> -endobj -235 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 47.386457 186.743622 63.334211 172.343622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:manuel-utilisateur) ->> -endobj -236 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 186.743622 555.889134 172.343622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:manuel-utilisateur) ->> -endobj -237 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 171.593622 555.889134 150.923622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:installation) ->> -endobj -238 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 166.073622 77.060285 151.673622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:installation) ->> -endobj -239 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 166.073622 555.889134 151.673622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:installation) ->> -endobj -240 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 150.923622 555.889134 130.253622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:a-quoi-sert-lapp) ->> -endobj -241 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 145.403622 77.060285 131.003622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:a-quoi-sert-lapp) ->> -endobj -242 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 145.403622 555.889134 131.003622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:a-quoi-sert-lapp) ->> -endobj -243 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 130.253622 555.889134 109.583622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:utilisation-simple) ->> -endobj -244 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 124.733622 77.060285 110.333622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:utilisation-simple) ->> -endobj -245 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 124.733622 555.889134 110.333622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:utilisation-simple) ->> -endobj -246 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 109.583622 555.889134 88.913622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:recuperer-le-lien-vers-le-flux) ->> -endobj -247 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 104.063622 93.647199 89.663622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:recuperer-le-lien-vers-le-flux) ->> -endobj -248 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 104.063622 555.889134 89.663622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:recuperer-le-lien-vers-le-flux) ->> -endobj -249 0 obj -<< -/Filter /FlateDecode -/Length 49300 ->> -stream -xM.I_QkLgD80jAi#` -MsMdy25 Y̧k~"Z_=~<ϺKgėyK?5}x_|ZZ{r]ܿǬz&+/O__ύg~ 3br/˗U?S>Zc=\\@F[@ ]GV~Ϩ-m.,6{@ZYC7 Z[s֌7XW+i saOG]6וiI״s kڹR5? Z~(Z5mQlr0WM{~Κ6i\i5w|frxMtrͥ}:{ոO'|?5 k5Wšo~b&k5Ӌk5ӛkn5ӛk|sͥ}zc*qXOKܧ|]%Sฐ>\(q>\3N糸V>]\3~r)bpU>EOrp̻}f0WI!Dʅk3Jڧpͽ}Jڧrx5WA~>A|}ژ -״1y5mA\OsNkfQ>mVڧ98M1{Vڧ9؟ic{}ژZi6`+8k}}ژOsGOi/$knϊ9)s]+S`+S Nq2[_q2qz9pKה9;2->eq2q:99Kܧʓfb}!:S N-q2Qia9:=D*}ڙe>iv ig}ڙW-|:sig5A~<}ڑ}=Oڧ9f >1OQOڧqNkOڧqev'Ҵ5~>ADܝiGr}ڑO;r?םiGgi5Ik\s>kƧbkwܧk1<]S q";~q">E>E{q^\3*tM/I⚑bi7׌/QʤrGOX)r_(5E}kF~>׌?Y<\3@.ᝮ<"q\>Ez}oAVOK`k <1\3Xv0J0Jg0(g0qOt0s}:>Ax>Ai ƴOsEQڧ90 ąMt0Mt0N+9ִOsoOsoOs# }:ʹOs)s)sLה9pMה9)s4S`s53V~>OtM͸OθO̸O(>eV9X)s)s❖)sS39Xۈ9X9Xˈ9XpOה9X)sd".>2Gڧ9X~>9XN`i#,N`)#S>x)S-g}72{}:Gڧ4` pͼ)ܸ6>k#ٹ2>AފK#0Ht"sO'rؒD" -zڧspͣ}cwkn=9>\sq"۽zܧj9S`)rUn98q^\q^\3N%izܧ7\{ܧ7\zܧA9P}l>Eq"q$q>\q>\3Nd>\sq.O\Zܧ0S` S N- 9M3[ڧWGKE4Ú5؊LHWKlF8}z1qJb┐9Ӌ9Nb">(>HO/ -O/ 53Hs?bS>Ӌ9د؏t1ɛ'fڧs؏t1{Hs؏t1q9OOݸOإq2.`bM)s?Ox}l(TҚ~9XWGHs?OHs19}=#]b?5#]Zb?,+#]OH7s\fn`fn`Ӛ}z3KH7rn > c?Q؏t#b?ҍćjIi f~q=#t~s5#4 ~9OQ}yJڧ7raP-b? jgHÒaK=/nvz?R݅ݯJsO?_ _ϿP_???۞JǟnoJߵ_Vo?_GSl+ˊ?]:/_~/r|}? 4&xNQS5ukŞ WgQbf\єq#e\\5RƵ53e\\3pT5㊦k+2!yES5M 1SơUdkk|ҭ\kvs+o9GkF21Q⥌kAx)spX5 q98X5 꼔q9B/e\cKט(R5 jqAz):s걎Az):s^ʸXuu:3Q륌k:3Q륌Az):s^ʸD23Q륌{:3+q9Z/e\gKיRu jq9Xu jq9Z/e\gKיRus:3Q륌A ֌"$e\g23qKי85bיq9q9M23JיPx82'p+8*^8*ۺ"5_7s<z)<z)qT(nqTXQy13qT -jqTP:CyXQy(l :CA2CA2;RQy1Oa:vw=~n>HW&=mu[']vye|\3>Wd~~)@D - - _*}e -, -hE4A!hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A2hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A2hg4A3MP1A3MP&(xFsNP&(xF< -< -hg4A2hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A2hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A1hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A2hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A2hg4A3MP1A3MP&(xFsNP&(xF< -< -hg4A2hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A2hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A1hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A2hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A2hg4A3MP1A3MP&(xFsNP&(xF< -< -hg4A2hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A2hg4A3MP1A3MP&(xF,sLP&(xF< -< -hg4A1hg4A3MP1A3MP̵'(xF,sLP&(xF1}L~^RsU]b?߷ZVۧμ[=g&3 JxiOi6ab﫬+]Yy/Z{SL+{x潻Qҵ0[1z^{Ly/z]is^sWNMLpI|Qӵ@-Z܋BSog:_\Z<[w9gr,u,*''1#-)Yt-H9^(\ c`b:{ji֌J}#@ǂO xg&jJkF{`9{=Z ã`b&{ZM9`AlF~.3Od}kd/듮rpAZ yK5#֌Gt-Z3Wrpq*w:'WrpO3EMՆgrpyg,#WrLU#\ڐc;WrpIU5^+Wqt^mZ ֌xI'q*,t$t^m -$WqCyz%Wrn:zڐΫ98;Gg:v NW:vDΫHR?bଟy<5#0y,0*y#q鼊>fוΫ8YO:vJ)!W;rp*B̪鼊O9[KUOrpgjGpjGo=̞IՎwYڑ5#'N鼊cΫ8cO)] |Ϋx#ІJUC?jo?eJΫ8~]Xy#?]}LKUDDžt^5#/y鼊4'x:\Vt^}"Kbfl+9xHՎ(k(.k(Nkt-8n<鼊38E<\ ot^9̈Wr‰-Wq/f: ^K L!\ xu qdWr`:&ՁDyxWy1q|.#_q]JU`;G`Wrn%_Et^V:?@I+_AOU:h@@WrƁ5Wr#_EWr\*R/9x85#o,(WrRrl:>3Ձ'_E|{h`4LU<*꼏xA -fX ;_E-2yu"گՉ|yu"y`F:ՉJUԯ\q:N >4Չo UԸ`z7 Չ|ΫHn[m v{:x8t-3UC-9&K 9ﯲoXʾB0]vx}દ5QjWٷWٷ_Wٷt^e~7WٷQOU^ǝx}t^e%N*)ﯲoﯲo\-_e~8ҵI |K707|x}~U/ψWٷ(_e~Ӛyx}SJ׊Wٷ_KWٷ_ﯲoy}x}x}MZoRׂ}x} kf~(>ÚٷO2Wٷ_p-طx=_}ﯾ}|sZ3gW߾}ysMӵ`շo_OOշo3}W߾W?Kٷ 7x)_ -Q}lz_ogW -p_^~~}?7^ ;__ҝ_*|{_WGwEԝ;3=|Ϩ;2Gwgԝu{FQwe|Ϩ;3=|#[wgԝu{FQwe|Ϩ;3=|Qwgԝu{F9=|Ϩ;3-st{FQwgԝu[=|Ϩ;3ηѝu{FQwgԝ;3=|Ϩ;2Gwgԝu{FQwe|Ϩ;3=|tu{FQwgԝu[=|Ϩ;3ηѝu{FQwgԝo;3=|Ϩ;2Gwgԝu{FQwe|Ϩ;3=|Qwgԝu{F9=|Ϩ;3-st{FQwgԝu[=|Ϩ;3ηLWwgԝu{FQwe|Ϩ;3=|Qwgԝu{F9=|Ϩ;3-st{FQwgԝu[=|Ϩ;3ηѝu{FQwgԝ;3=|Ϩ;2Gwgԝu{FQwe|Ϩ;3=|tu{FQwgԝu[=|Ϩ;3ηѝu{FQwgԝo;3=|Ϩ;2Gwgԝu{FQwe|Ϩ;3=|Qwgԝu{F9=|Ϩ;3-st{FQwgԝu[=|Ϩ;3ηѝu{FQwgԝo;3=|Ϩ;2Gwgԝu{FQwe|Ϩ;3=|Qwgԝu{F9=|Ϩ;3-st{FQwgԝu;=|Ϩ;3ηѝu{FQwgԝo;3=|Qwgԝu{F9=|Ϩ;3-st{FQwgԝu[=|Ϩ;3ηѝu{FQwgԝo;3=|Ϩ;2Gwgԝu{FQwc|Ϩ;3=|Qwgԝu{F9=|Ϩ;3-st{FQwgԝu[w< }?Vwt6u;CgwO^n﫞[vݏ?c=4u/GW9@~9-{]Q׽guu{F]9={Ϩ3-st{F]Q׽guu[={Ϩ3꺷uu{F]Q׽guo3={Ϩ2G׽guu{F]Q׽e{Ϩ3={]Q׽guu{F]9={Ϩ3sv{F]Q׽guu[={Ϩ3꺷uu{F]Q׽guo3={Ϩ2G׽guu{F]Q׽e{Ϩ3={]Q׽guu{F]9={Ϩ3-st{F]Q׽guu[={Ϩ3wuu{F]Q׽guo3={Ϩ2G׽guu{F]Q׽e{Ϩ3={]Q׽guu{F]9={Ϩ3-st{F]Q׽guu[={Ϩ3꺷uu{F]Q׽guo3={Ϩ1g׽guu{F]Q׽e{Ϩ3={]Q׽guu{F]9={Ϩ3-st{F]Q׽guu[={Ϩ3꺷uu{F]Q׽guo3={Ϩ2G׽guu{F]Q׽e{Ϩ3={ǜ]Q׽guu{F]9={Ϩ3-st{F]Q׽guu[={Ϩ3꺷uu{F]Q׽guo3={Ϩ2G׽guu{F]Q׽e{Ϩ3={]Q׽guu{F]9={Ϩ3sv{F]Q׽guu[={Ϩ3꺷uu{F]Q׽e{Ϩ3={]Q׽guu{F]9={Ϩ3-st{F]Q׽guu[={Ϩ3꺷uu{F]Q׽guo3={Ϩ1g׽guu{F]Q׽e{Ϩ3={]Q׽guu{F]9={Ϩ3-st;oq;ú񱸮u?ή~= ][~a?utP~^[3S'>2X{1 >'v7Ǘ]_*o3|5ǸG *+h8y_!S<mHw^>V>f i7\jܧ(OQ4 TEq"OQ4<[>ETqtu5*oCiܧk%5)bp)rp $0wImImk[5r͜M%P9ic§}ژ\tZ3spJ1iRſj}ژ}Os?+J1>m>Wڧ9q*Iה9J1{[i6 $q2_#+1Xs{`͍jKCIa}d#_ATq2qR99sܧ_Iה9X+\JVܧA>e">eV&kI31\s>eW sO(zf`F)sOڧ9X5~ڧ9z?,I3 Zt R',I7iG9#ڧ98+og}:(>Ai Os`ڧ9@ڧ9 ` `"VZ3si bi i I5e>fڧ9ȧfsjtM GtMq2M>eFpXy0[q2[q2̸O(>eV9X)s)s❖)sMۈ9X9Xˈ9XpOה9X)sd".>2Gڧ9X~>9ȆpM'sb{9XHt2KiHi"n<#_{}:Gڧ4`Ht6w45#ҚFڧsu}:HUFڧ9[qixG#OggS=>cKڧs1}:Eq"QO55T|qͭ}zslUK \zܧA9P}#`>Eq"q$q>\q>\3Nd>\sq.O\Zܧ0S` S N- 9M3[ڧWGKE~Ha?0\sH(P؋tUf98VF&gbi^A>\ #Q.h|.]AjiR.` -}J \iA>`*9WG\gK}J؏D+#Q.@y(S}ʮJc?'s؏D>r.hG\q20((4>e)s¸O JZ3s؏DW4S`}b?}WG\?y9}s1χ9X[G\"#Q.FH ڸO)q2(C##Q.he~$6Q Zr>Jڧ V-iR.h~W.X+#rzb?+;#rb?+Y>}5b?+^`؏x}~W.xVI aq\p~OH?4OgJӲQ3:傟\_?X.8S c?]\mC=ȟ}\@W7I1*@~0i YCg#!;/_ǗW9~ʂ9&~(L,>T>3"O0!X.]>rQ'˽":dq7vs@ rGT'˽=G8oyq_S5T.yOd^=0| -N[%2\[b`H> $ t@Oԑpۄf>qWKjdZdzd+O{3=5?|~vbĕ6z}z"5_k݁W/i$O\AE]gfx`ŧtd\bާļUpͳܑᚯDk_27kUSq"6҄p|)8aənȀ\Sq"oO\)8'O\)OKlj X.D\3O\S-É |O8NdXKpVd'qTDŇFkƙ52|P)8aY|QOlj 2V=e'2*Mlj ]=e'2*1kAyq5e'2^G8NdXHز1pHlj W4e'2~ϔqȰ:pkDLlj W4e{^єqȰpESq"cD>P-e'23Sq"Mlj fid7Nd@tc%kF2pEcƉ S"5+8NdXRf2Oc'=kV,8aɫ)S'Xǵc-q}Xu'2,z)8aKlj 8: jqwV8CRq"[Sq"jXq"罥DZ/e'2{:P:jqȰP륌DuXq"B2pTu'2zu t>.qȰP륌D>s6e'2,z)8ardf!)8[8Nd@e8Ndu'25blj 2>Rq".D8a 2~@)(Mk8Jo22h(Mz)(MoXQ9q& -jq& -DO,,ogfz)(My*)(M:DA2DA2DW(M!q&.2D+q& -jq&VuB-e Tﱎ48JXQ(nu z)(MbGiĉާb4g^4=q}ux9c7'p^4ϔq& -jq& -z8JW=e |d:DUOGi{8J걎4QP륌4QcEkcGiXQ(RQ:b'q& -'&9Z/e \+e KGiKGiKGiXQ(RQ(RQ(Ou Tﱎ4AbE}l(Mz)(Mz)(Mɴ)(Mk:DA2Dk(M&9Z/eӆL4wF(Mz)&s^8J8:q&ϕ2DA24QP륌4 -?q&s:DaNd'q&8;6e>21|puA%ydXQ@8J걎4Q8J^8J^8J|Q8Jm4Jq&P:D/e Tﱎ4Qy2DE4QpO$8J M>:nOn{(MTz)(Mu 3bGiKGiLGi%q&j4s(MTz)(MTz+2\u ")(MTz)(MTqa(MŐ)&*jq&j4j(MT:da(jq&P:4QQ륌4QQ륌4XQxg4Q-q&q&*jq&X᧌4>=2\8JH5XQ@:D9ei8JXu:G(Mu 3bGi;qDz)މ RƽP륌{'2KNd@39Z/e;5e;n"5_{'2yWQ6%91!Sމ xq4Z/e+M-q4a#q4Z/e+MKJRƽI0Q륌{ z)>Oi:S豎&f~lwhy_4S&޲wH׿E8x?{;EGY7>yn:,AɁx%N1~LO響?,R}נ/p-}|?kj9Ǽh^Cy Ѽh^E4"s^g43k5Xk5xFzpՃ?ԃo)Ǽ/WT7u+>sa ֍{_t}N/r|w]sNC'tH'tH'pȩxF:gxF:gX <#3 <#3 ,sNN9tH'tH't:gxF:gxF:e3 <#3 <#2NNN`C'tH'tH'̡xF:gxF:gX <#3 <#3 sNN9tH'tH't:gxF:gxF:e3 <#3 <#2NNN`C'tH'tH'̡xF:gxF:gX <#3 <#3 ,sNN9tH'tH'tǜ:gxF:gxF:e3 <#3 <#2NNN`C'tH'tH'̡xF:gxF:gX <#3 <#3 ,sNN9tH'tH't:gxF:gxF:e3 <#3 <#1NNN`C'tH'tH'̡xF:gxF:gX <#3 <#3 ,sNN9tH'tH't:gxF:gxF:e3 <#3 <#2NNN`C'tH'tH'p̩xF:gxF:gX <#3 <#3 ,sNN9tH'tH't:gxF:gxF:e3 <#3 <#2NNN`C'tH'tH'̡xF:gxF:gX <#3 <#3 sNN9tH'tH't:gxF:gxF:e3 <#3 <#2NNN`C'tH'tH'̡xF:gxF:gX <#3 <#3 ,sNN9tH'tH'tǜ:gxF:gxF:e3 <#3 <#2NNN`C'tH'tH'̡8r=w a:t:NމJIzH3x?S F(%9/y?C}}'I1V ,"#[1V <l"bf+يA`b)يA`bf+bf+يA`b)يA`bf+bf+يA`b)يA`bf+bf+يA`b)يA`bf+bf+يA`b)يA`bf+9l 0[1V H1V l 0[1l 0[1V H1V l 0[1l 0[1V H1V l 0[1l 0[1V H1V l 0[1l 0[1V H1V l 0[1̡f+يA`bxFA`bf+يgf+يA`bxFA`bf+يgf+يA`bxFA`bf+يgf+يA`bxFA`bf+يgf+يA`bxFA`bf+يe 0[1V l3R l 0[1V <# 0[1V l3R l 0[1V <# 0[1V l3R l 0[1V <# 0[1V l3R l 0[1V <# 0[1V l3R l 0[1V ,s(يA`bf+bf|W l3R A`bxFA`b]1V H1V 3+يA`b)يA`w 0[1V <# 0[1f+يgf+l 0[1l 0bf+bf|W l2bf|W l3R A`bxFA`b]1V H1V 3+يA`b)يA`w 0[1V <# 0[1f+يgf+l 0[1l 0bf+bf|W l3R +#A`b`C1V o؏t(يgf+يA`bxFA`bf+يgf+يA`bxFeqC1mR x ~b}O_Gʊ{MM+Tؿh`V}˫_Q#["rhF`iF`i95H#4H#4gxFgxFe3<#3<#2FiFiF`C#4H#4H#̡xFgxFgX<#3<#3,shFiFi94H#4H#4gxFgxFcN3<#3<#2FiFiF`C#4H#4H#̡xFgxFgX<#3<#3,shFiFi94H#4H#4gxFgxFe3<#3<#2FiFiFS#4H#4H#̡xFgxFgX<#3<#3,shFiFi94H#4H#4gxFgxFe3<#3<#2FiFiF`C#4H#4H#̡xFgxFg8<#3<#3,shFiFi94H#4H#4gxFgxFe3<#3<#2FiFiF`C#4H#4H#̡xFgxFgX<#3<#3,shFiFi95H#4H#4gxfl3<#2Fi[#4H#̡xFgxFgX<#3<#3,shFiFi94H#4H#4gxFgxFe3<#3<#2FiFiFS#4H#4H#̡xFgxFgX<#3<#3,shFiFi94H#4H#4gxFgxFe3<#3<#2FiFiF`C#4H#4H#̡xFgxFg8<#3<#3,shFiFi94H#4H#4gxFgxFe1Hk4ފmC#XFQ#|yW#>0N&s:5qLZ[_}Zp/}|?3C-jEXDjEXDjCN3R <#3R <#2ZZZ`C-H-H-̡xFjgxFjgXP <#3R <#3R ,sZZ9H-H-jgxFjgxFje3R <#3R <#2ZZZS-H-H-̡xFjgxFjgXP <#3R <#3R ,sZZ9H-H-jgxFjgxFje3R <#3R <#2ZZZ`C-H-H-̡xFjgxFjg8T <#3R <#3R ,sZZ9H-H-jgxFjgxFje3R <#3R <#2ZZZ`C-H-H-̡xFjgxFjgXP <#3R <#3R ,sZZ9H-H-jgxFjgxFje3R <#3R <#2ZZZ`C-H-H-̡xFjgxFjgXP <#3R <#3R ,sZZ9H-H-jgxFjgxFjcN3R <#3R <#2ZZZ`C-H-H-̡xFjgxFjgXP <#3R <#3R ,sZZ9H-H-jgxFjgxFje3R <#3R <#2ZZZS-H-H-̡xFjgxFjgXP <#3R <#3R ,sZZ9H-H-jgxFjgxFje3R <#3R <#2ZZZ`C-H-H-̡xFjgxFjg8T <#3R <#3R ,sZZ9H-H-jgxFjgxFje1lߡ6wxߡߩT _^U U+R?zxJ~,7/_U|u||7\9oo d]5!X;>ؖOde\Jdgp %wbUV cL32X ֌;2\\Odk;0kFDkv`q!J] QP륌 jhCj)hCzum\Xц(m:6DiWhCC5q!(h Qڊum'k5q! -jq!P:6z8W=emq!ػ26DA2m,)hC\q!8W=emV)hC:6DA26DhumbGKG8Xц(Rц@8W8eXц(Rц(Rц!*q! -jq! -jq! -jqAz)hCzum -+2\uQP륌 QP륌 hhCk:6DA26DA26DambRц@8xg:6DA26DA26󱎣 A7>em6j QP륌 cfhCz)hCum\ Q؍umZ/em6$kF26ᱎ QP륌 =q!pcG+q! -jq! -jq!cWeCRlCXl!Pω|ׂ6P0'_qzF˗C_*߫ %4M;OȢ,ć6Zt&E:U"fכa)!9载<eN+p*Un:'$,*YF)\LG"6r/UfЎ͠Tt3hޤE%J`j_nFgޟt35-'/)ՁY|Jo.(Gf4!:Oxf|OynFٍ^{O~K|'\=o>gbs:n|gz$ccOVZ:IOW|>yיO=6;'fIa[mO|j(^{š0w` X^Eu|D^Eu>%?S_S#,>Y齊c^zZ|ɧg)3W|*kK t>齊}^E ,b11O#݌\3f{nF_H:7RS{zwTL>O ͧ1+WfA3rpML> ~^1geArC|J7cu>3G$ޫ1_tYsrL4LN3iC3ǐ×{91 Vŧ,DObyޫA :sZz"Nwz"' 'V^98S^EN$zz"'+֌CG\fp\KUħޫ{3X3^&Ut3fwz7ޫt3&;m51fUW/B7c=F7cg[#t3*#rp^O{nn͘wo |V}f驆kb*r? ft#TâKU 2}dlO ~u}RX`懦gPWggTâ`͋J ּƓ 'հ>h@"Rtd o{O̺R ;w3r59}$2 X21{ > j ߧ]kg|!qzO295)uNn ֌CvO0Q}wrkaQx}ܜxc齊Y|2J5@d{ 9x;W}?>@OyR LS ;7*r~֝)uf57'|d[3'|f[3'|h[gaVHIVHIѥꩆ|rb9'|t[-'|v[^Xzm|v=66}tdmH d o宠D8z/m;?_HIP:IG3POEEvZ^{=>5v9vLkrܻf縣|erܻӺ.ǽێAq^η{佬I.ǽێ{}^vzrwi=Oryw|銗uxYϓ\nn{I.ǽێTn{8myqn -mTsR?oTqUF6*Qa6*Q -%lT(aHmT(aB JبPFިpF6*ܰQᆍ -5Qᆍ -7lTa jj nبpF6*F6*ܰQᆍ -7lT -7lTa nبPSnبpF6*ܰQ6*ܰQᆍ -7lTaBMmTa nبpFڨpF6*ܰQᆍ -5Qᆍ -7lTa fz nبpF6*F6*ܰQᆍ -7lT -7lTa nبPSnبpF6*ܰQ6*ܰQᆍ -7lTaBMmTa nبpFڨpF6*ܰQᆍ -5Qᆍ -7lTa jj nبpF6*F6*ܰQᆍ -7lT -7lTa nبPSnبpF6*ܰQ6*ܰQᆍ -7lTaBMmTa nبpFڨpF6*ܰQᆍ -5Qᆍ -7lTa jj nبpF6*F6*ܰQᆍ -5Qxq~nبpFڨps<: -7lTaLoT9g nبpFڨpsF6*ܰQᆍ -5Q服 -7lTa jj9nبpF6*Fs6*ܰQᆍ -7lT -7lTa nبPSn٨pF6*ܰQ6*ܜQᆍ -7lTaBMmT9g nبpFڨpsF6*ܰQᆍ -3Q服 -7lTa jj9nبpF6*Fs6*ܰQᆍ -7lT -7lTa nبPSn٨pF6*ܰQ6*ܜQᆍ -7lTaBMmT9g nبpFڨpF6*ܰQᆍ -5Qᆍ -7lTa jj nبpF6*F6*ܰQᆍ -7lT -7lTa nبPSnبpF6*ܰQ6*ܰQᆍ -7lTaBMmTa nبpFڨpF6*ܰQᆍ -5Qᆍ -7lTa jj nبpF6*F6*ܰQᆍ -7lT -7lTa nب0nبpF6*ܰQ6*ܰQᆍ -7lTaBMmTa nبpFڨpF6*ܰQᆍ -5Qa3xFA\7 ;w9om#px:eAtO@E=޶U|z0E$\pjxH$HB $I(!PB$HHEJ$I(!PB$a# 7Dn$I!PS" 7Dn$IH " 7Dn$T$H " 7Dj*pC$H " 5I!pC$H $I!pC$HBMEn$I!pC$" 7Dn$I!PS" 7Dn$IH " 7Dn$T$H " 7Dj*pC$H " 5I!pC$H $I!pC$HBMEn$I!pC$" 7Dn$I!PS" 7Dn$IH " 7Dn$T$H " 7Df:pC$H " 5I!pC$H $I!pC$HBMEn$I!pC$" 7Dn$I!PS" 7Dn$IH " 7Dn$T$H " 5I9u$H $o># 7Dn$t$H " 7Dj*psN$H " 5I9'pC$H $ܜI!pC$HBMEnΉ$I!pC$" 7Dn$I!PSs" 7Dn$IH9" 7Dn$T$H " 7Dj*psN$H " 3I9'pC$H $ܜI!pC$HBMEnΉ$I!pC$" 7Dn$I!PS" 7Dn$IH " 7Dn$T$H " 7Dj*pC$H " 5I!pC$H $I!pC$HLGn$I!pC$" 7Dn$I!PS" 7Dn$IH " 7Dn$T$H " 7Dj*pC$H " 5I!pC$H $I!pC$HBMEn$I!pC$" 7Dn$I!0ӑ" 7Dn$IH " 7Dn$T$H " 7Dj*pC$H " 5In ?IH#I\3;b-F<0ۇÈ:߻uR?])ا.aNF(!p0I' #$PB$aNF8IˆaF 0b$pC1LˆaF 0bn#I1LˆaF 0 a0 #I1LˆaF!&a0 #I1L7$&a0 #I0b$&a0 #F 0b$&aˆaF 0b$pC1LˆaF 0bj*&a0 #I1L7$&a0 #I0b$&a0 #F 0b$&aˆaF 0b$pC1LˆaF 0bn#I1LˆaF 0 a0 #I1LˆaF!&a0 #I1L7$&a0 #IˆaF 0b$pC1LˆaF 0bn#I1LˆaF 0 a0 #I1LˆaF!&a0 #I1L7$&a0 #I0b$&a0 #F 0b$pC1LˆaF 0bn#I1LˆaF 0BM$&a0 #I0b$&a0 #F 0b$&aˆaF 0b$pC1LˆaF 0bn#I1LˆaF 0 a0 #I1LˆaF!&a0 #I1L7$&a0 #I0b$&a0 #T1LˆaF 0bn#I1LˆaF 0 a0 #I1LˆaF!&a0 #I1L7$&a0 #I0b$&a0 #F 0b$&aˆaF 0b$pC1LˆaF 0bn#I1LˆaF 0BM$&a0 #I0b$&a0 #F 0b$&aˆaF 0b$pC1LˆaF 0bn#I1LˆaF 0 a0 #I1LˆaF!&a0 #I1L7$&a0 #I0b$&a0 #T1LˆaF 0bn#I1LˆaF 0 a0 #I1LˆaF!&a0 #I1L7j>L -Dcˆ?%:ˆ/Fܲ#s[xq[?=xz$/?)] q}:9OW %F*PB @B  #H(!PB @B $H!pC @BMn$H!pC  7n$H!PS 7n$H@  7n$T @  7j*pC @  5H!pC @ -$H!pC @BMn$H!pC a 7n$H!PS 7n$H@  7n$T @  7j*pC @  5H!pC @ -$H!pC @BMn$H!pC  7n$H!PS 7n$H@  7n$T @  7j*pC @  5H!pC @ -$H!pC @BMn$H!pC  7n$H!PS 7n$T @  7j*pC @  3H!pC @ -$H!pC @BMn$H!pC  7n$H!PS 7n$H@  7n$T @  7j*pC @  5H!pC @ -$H!pC @Ln$H!pC  7n$H!PS 7n$H@  7n$T @  7j*pC @  5H!pC @ -$H!pC @BMn$H!pC  7n$H!0Ӂ 7n$H@  7n$T @  7j*pC @  5H!pC @ -$H!pC @BMn$H!pC  7n$H!PS 7n$H@  7n$t @  7j*pC @  5H!pC @ -$H!pC @BMfȴׁH|{E _#:ܖ#sF|D|<]pfq} !8|B\?qR?_<*#PBHJ!B(!PBaB%J!B(!0!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!t !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B3B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC ! -!B!pCBMn!B!pCaC7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7f:pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC !!B!pCBMn!B!pCB7n!B!PS!B7n!BwτO?ƿ-~J~sC1!iw-E\[w:x>bqr}(:w!9\!D|eاB !B#B(!PBB ! -!B(!PBHn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!0!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!t !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7j*pC !B5B!pC !!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCaC7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7f:pC !B5B!pC ! -!B!pCBMn!B!pCB3??BW÷/B׮~1![Bܝ'!ıqDO￾|"^NE\/oO]~}:*>]q"$pE(!p(I'"~DJ"$p(I'Q"I1LaE E!&Q0"I1G(bD$&Q0QaE (bDü~Dn"I1LaE E!&Q0"I1G(bD$&Q0QaE (bD$pC1LaE (bDn"I1LaE (BME$&Q0"I(bD$&Q0"E (bD$&QaE (bD$pC1LaE (bDn"I1LaE ( Q0"I1LaE!&Q0"I1L7D$&Q0"I(bD$&Q0"T1LaE (bDn"I1LaE ( Q0"I1LaE!&Q0"I1L7D$&Q0"I(bD$&Q0"E (bD$&QaE (bDn"I1LaE ( Q0"I1LaE(bD$&Q0"E (bD$&QaE (bD$pC1LaE (bDn"I1LaE ( Q0"I1LaE!&Q0"I1L7D$&Q0"I(bD$&Q0"E (bD$&Q"I1LaE ( Q0"I1LaE!&Q0"I1L7D$&Q0"I(bD$&Q0"E (bD$&QaE (bD$pC1LaE (bDn"I1LaE ( Q0"I1LaE(bD$&Q0"E (bD$&QaE (bD$pC1LaE (bDn"I1LaE ( Q0"I1LaE!&Q0"I1L7D$&Q0"I(bD$&Q0"E (bD$&Q"I1LaE ( Q0"I1LaE!&Q0"I1L7D$&Q0"I(BwgN(B"o?JQE_#+?oE|!^OB/uow!Y+>]eJ!BB !B%J!TB !B%F:pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC !!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCaC7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!PS!B7n!B !B7n!t !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B3B!pC ! -!B!pCBMn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCLn!B!pCB7n!B!PS!B7n!B !B7n!T !B7j*pC !B5B!pC ! -!B!pCBMn!B!pCB7n!B!0!B7n!B !B7n!T !B7j*pC !B5B<|BCB\Bܝ?c 3x7չ_f,v>\wb'Y竇>]J%KXB b %J%T,XB b %F:pC,X b 5K!pC,X %K!pC,XBMn%K!pC,b 7n%K!PSb 7n%KX b 7n%T,X b 7j*pC,X b 5K!pC,X %K!pC,XBMn%K!pC,b 7n%K!PSb 7n%KX b 7n%T,X b 7j*pC,X b 5K!pC,X %K!pC,XBMn%K!pC,ac 7n%K!PSb 7n%KX b 7n%T,X b 7j*pC,X b 5K!pC,X %K!pC,XBMn%K!PSb 7n%KX b 7n%t,X b 7j*pC,X b 5K!pC,X %K!pC,XBMn%K!pC,b 7n%K!PSb 7n%KX b 7n%T,X b 7j*pC,X b 3K!pC,X %K!pC,XBMn%K!pC,b 7n%K!PSb 7n%KX b 7n%T,X b 7j*pC,X b 5K!pC,X %K!pC,XLn%K!pC,b 7n%K!PSb 7n%KX b 7n%T,X b 7j*pC,X b 5K!pC,X %K!pC,XBMn%K!pC,b 7n%K!0ӱb 7n%KX b 7n%T,X b 7j*pC,X b 5Kn 3?KXxXWW#:G,qKF,qwX>>z&=<<Oip -OWT'$zPB$уDN=8II'$zpAIE$z&0IaD$z&0= aD$z&уa= aD$zpC0La= aDnI0La= 0I0La=!z&0I0L7D$z&0IaD$z&0T0La= aDnI0La= 0I0La=!z&0I0L7D$z&0IaD$z&0= aD$z&уa= aD$zpC0La= aDnI0La= AME$z&0IaD$z&0= aD$z&уa= aD$zpC0La= aDnI0La= 0I0La=!z&0IaD$z&0= aD$z&уI0La= [0La= aDnI0La= 0I0La=!z&0I0L7D$z&0IaD$z&0= aD$z&уa= aD$zpC0La= aDj*z&0I0L7o0I0La=!z&0I0L7D$z&0IaD$z&0= aD$z&уa= aD$zpC0La= aDnI0La= 0I0La=aD$z&0<$z&0I0L7D$z&0IaD$z&0= aD$z&уa= aD$zpC0La= aDnI0La= 0I0La=!z&0I0L5= aD$z&уD$z&0IaD$z&0= aD$z&у5?s?=_뗥%|l']iJ!CB 1b%J!T B 1b%F:pC  1b5C!pC  1!C!pC BMn!C!pC b7n!C!PS1b7n!C 1b7n!T  1b7j*pC  1b5C!pC  1!C!pC BMn!C!pC b7n!C!PS1b7n!C 1b7n!T  1b7j*pC  1b5C!pC  1!C!pC BMn!C!pC ac7n!C!PS1b7n!C 1b7n!T  1b7j*pC  1b5C!pC  1!C!pC BMn!C!PS1b7n!C 1b7n!t  1b7j*pC  1b5C!pC  1!C!pC BMn!C!pC b7n!C!PS1b7n!C 1b7n!T  1b7j*pC  1b3C!pC  1!C!pC BMn!C!pC b7n!C!PS1b7n!C 1b7n!T  1b7j*pC  1b5C!pC  1!C!pC Ln!C!pC b7n!C!PS1b7n!C 1b7n!T  1b7j*pC  1b5C!pC  1!C!pC BMn!C!pC b7n!C!01b7n!C 1b7n!T  1b7j*pC  1b5C/_!:ǟxw:oh,Fu#}:;|}:骩>]$$pHB DNI8I$$" '$$pHI" %I HbD$&"aI HbD$pC$1L"aI HbDn$I$1L"aI H 0$I$1L"aI!&0$I$1L" 7D$&0$I$HbD$&0$I HbD$&"aI HbD$PS0$I$1L"aI!&0$I$1L" 7D$&0$I$HbD$&0$I HbD$&"aI HbD$pC$1L"aI HbDn$I$1L"aI H 0$I$1L"aI!&0$I$1L" 5I HbD$&"aI HbD$pC$1L"aI HbDn$I$1L"aI H 0$I$1L"aI!&0$I$1L" 7D$&0$I$HbD$&"aI HbD$pC$1L"aI HbDj*&0$I$1L" 7D$&0$I$HbD$&0$I HbD$&"aI HbD$pC$1L"aI HbDn$I$1L"aI H 0$I$1L"aI!&0$I$1L" 7D$&0$I$"aI HbD$pC$1L"aI HbDnΉ$I$1L"aI H 0$I$1L"aI!&0$I$1L" 7D$&0$I$HbD$&0$I HbD$&"aI HbD$pC$1L"aI HbDj*&0$I$1L" 7D$&0$I$HbD$&0$I HbD$&"aI HbD$pC$1L"aI HbDn$I$1L"aI H 0$I$1L"aI!&0$I$1L" 7D$&0$I$"aI HbD$pC$1L"aI HbDnΉ$I$1L"aI H 0$I$1L"aI!P&@~"1]}y"8oI|y$"s?_J<G?Og4qrG<>lw|sR?G<$PB4hHEJ&M(!PB4a %DJ&M(!0ф 7Dn&Mh ф 7Dn&T4h ф 7Dj*pC4h ф 5M!pC4h ф&M!pC4hBMEn&M!pC4 7Dn&M!PSф 7Dn&Mh ф 7Dn&t4h ф 7Dj*pC4h ф 5M!pC4h ф&M!pC4hBMEn&M!pC4 7Dn&M!PSф 7Dn&Mh ф 7Dn&T4h ф 7Dj*pC4h ф 3M!pC4h ф&M!pC4hBMEn&M!pC4 7Dn&M!PSф 7Dn&Mh ф 7Dn&T4h ф 7Dj*pC4h ф&M!pC4hBMEn&M!pC4a 7Dn&M!PSф 7Dn&M9M!pC4h ф&M!pC4hBMEn&M!pC4 7Dn&M!PSф 7Dn&Mh ф 7Dn&T4h ф 7Dj*pC4h ф 3M!pC4h ф&M!pC4hBMEn&M!pC4 7Dn&M!PSф 7Dn&Mh ф 7Dn&T4h ф 7Dj*pC4h ф 5M!pC4h ф&M!pC4hLGn&M!pC4 7Dn&M!PSф 7Dn&Mh ф 7Dn&T4h ф 7Dj*pC4h ф 5M!pC4h ф&M!pC4hBMEn&M!pC4 7Dn&M!0ф 7Dn&Mh ф 7Dn&T4h ф 7Dj*pC4h ф 5Mn# s_G[4qxhiGw-Kt[&I-Gtt{\NT|RO]ʈaF 6 q0#I1LaH&0i$I$1L* 7I,Nb X(@ %X(B%J/1B)&J2PM D5PM,pbN,vb X(@ %X(BI(JC1B(JFP:R DIPRR,bS,b X(I@4 %X(UB*JWŠRV,b %b X(B),"X(B,JeP2,JhPJZ,b bR[,b %b$ X(B."X(B /JyPҋh/J|Pꋅ_,b R`,c4 % -cd X(!B)1UPZc,cc, c %X(M@D X(YB2J1eBI3JP⌅Rg DPh,Bc$h,HcT %X(@ X(Bi5J1B5JP(6JPm,jc m,pc %pTB7JPo DP -p,cDQq,ct %X(%@ X(1B9J1=B :JѱPt DԱPu,cQv,c %X(u@ X(B)<J1B<JP2y DPJz,cX(B=JPH>JPR},c ~,c c %X(B @Y( Bi@JP*@JPBR,d Z,d  d! % Y(MBB -Y(YBBJPʐHCJP␅R,_s^W?o>?ǟ?Տ꧷7'}36/>) ߌǧ{zL?>اw3ǻ=^~]W[ {xr}3 G:~y\_ȫ[ -endstream -endobj -250 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 249 0 R -/Resources 4 0 R -/Annots [ 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R 345 0 R 346 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -251 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 771.023622 555.889134 750.353622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:boutons) ->> -endobj -252 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 765.503622 93.647199 751.103622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:boutons) ->> -endobj -253 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 765.503622 555.889134 751.103622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:boutons) ->> -endobj -254 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 750.353622 555.889134 729.683622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:calibration) ->> -endobj -255 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 744.833622 77.060285 730.433622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:calibration) ->> -endobj -256 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 744.833622 555.889134 730.433622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:calibration) ->> -endobj -257 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 729.683622 555.889134 709.013622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:pourquoi-calibrer-lapplication-et-creer-un-preset) ->> -endobj -258 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 724.163622 93.647199 709.763622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:pourquoi-calibrer-lapplication-et-creer-un-preset) ->> -endobj -259 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 724.163622 555.889134 709.763622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:pourquoi-calibrer-lapplication-et-creer-un-preset) ->> -endobj -260 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 709.013622 555.889134 688.343622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:comment-creer-son-preset) ->> -endobj -261 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 703.493622 93.647199 689.093622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:comment-creer-son-preset) ->> -endobj -262 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 703.493622 555.889134 689.093622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:comment-creer-son-preset) ->> -endobj -263 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 71.386457 688.343622 555.889134 667.673622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:creation-des-zones-et-des-windows) ->> -endobj -264 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 682.823622 555.889134 668.423622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:creation-des-zones-et-des-windows) ->> -endobj -265 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 71.386457 667.673622 555.889134 647.003622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:ajout-du-nom-des-pilotes) ->> -endobj -266 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 662.153622 555.889134 647.753622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:ajout-du-nom-des-pilotes) ->> -endobj -267 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 71.386457 647.003622 555.889134 626.333622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:sauvegarder-le-nouveau-preset) ->> -endobj -268 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 641.483622 555.889134 627.083622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:sauvegarder-le-nouveau-preset) ->> -endobj -269 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 626.333622 555.889134 605.663622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:load-un-preset-existant) ->> -endobj -270 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 620.813622 93.647199 606.413622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:load-un-preset-existant) ->> -endobj -271 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 620.813622 555.889134 606.413622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:load-un-preset-existant) ->> -endobj -272 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 605.663622 555.889134 584.993622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:comprendre-les-donnees) ->> -endobj -273 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 600.143622 77.060285 585.743622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:comprendre-les-donnees) ->> -endobj -274 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 600.143622 555.889134 585.743622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:comprendre-les-donnees) ->> -endobj -275 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 584.993622 555.889134 564.323622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:overtakes) ->> -endobj -276 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 579.473622 93.647199 565.073622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:overtakes) ->> -endobj -277 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 579.473622 555.889134 565.073622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:overtakes) ->> -endobj -278 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 564.323622 555.889134 543.653622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:last-five-laps) ->> -endobj -279 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 558.803622 93.647199 544.403622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:last-five-laps) ->> -endobj -280 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 558.803622 555.889134 544.403622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:last-five-laps) ->> -endobj -281 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 543.653622 555.889134 522.983622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:battles) ->> -endobj -282 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 538.133622 93.647199 523.733622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:battles) ->> -endobj -283 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 538.133622 555.889134 523.733622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:battles) ->> -endobj -284 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 522.983622 555.889134 502.313622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:driver-infos) ->> -endobj -285 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 517.463622 93.647199 503.063622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:driver-infos) ->> -endobj -286 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 517.463622 555.889134 503.063622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:driver-infos) ->> -endobj -287 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 502.313622 555.889134 481.643622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:live-ranking) ->> -endobj -288 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 63.386457 496.793622 93.647199 482.393622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:live-ranking) ->> -endobj -289 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 496.793622 555.889134 482.393622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:live-ranking) ->> -endobj -290 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 481.643622 555.889134 460.973622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:erreurs) ->> -endobj -291 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 476.123622 77.060285 461.723622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:erreurs) ->> -endobj -292 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 476.123622 555.889134 461.723622 ] -/BS << -/W 0 ->> -/Dest (ManuelUtilisateur/:erreurs) ->> -endobj -293 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 47.386457 460.973622 555.889134 440.303622 ] -/BS << -/W 0 ->> -/Dest (jdb/:journal-de-bord) ->> -endobj -294 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 47.386457 455.453622 63.334211 441.053622 ] -/BS << -/W 0 ->> -/Dest (jdb/:journal-de-bord) ->> -endobj -295 0 obj +193 0 obj << /Type /Annot /Subtype /Link @@ -4049,32 +2887,32 @@ endobj /BS << /W 0 >> -/Dest (jdb/:journal-de-bord) +/Dest (.:tests) >> endobj -296 0 obj +194 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 440.303622 555.889134 419.633622 ] +/Rect [ 63.386457 440.303622 555.889134 419.633622 ] /BS << /W 0 >> -/Dest (jdb/:mercredi-29-mars-2023) +/Dest (.:comment-ca-cest-passe) >> endobj -297 0 obj +195 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 434.783622 77.060285 420.383622 ] +/Rect [ 63.386457 434.783622 93.647199 420.383622 ] /BS << /W 0 >> -/Dest (jdb/:mercredi-29-mars-2023) +/Dest (.:comment-ca-cest-passe) >> endobj -298 0 obj +196 0 obj << /Type /Annot /Subtype /Link @@ -4082,32 +2920,32 @@ endobj /BS << /W 0 >> -/Dest (jdb/:mercredi-29-mars-2023) +/Dest (.:comment-ca-cest-passe) >> endobj -299 0 obj +197 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 419.633622 555.889134 398.963622 ] +/Rect [ 63.386457 419.633622 555.889134 398.963622 ] /BS << /W 0 >> -/Dest (jdb/:jeudi-30-mars-2023) +/Dest (.:comment-ca-aurait-du-se-passer) >> endobj -300 0 obj +198 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 414.113622 77.060285 399.713622 ] +/Rect [ 63.386457 414.113622 93.647199 399.713622 ] /BS << /W 0 >> -/Dest (jdb/:jeudi-30-mars-2023) +/Dest (.:comment-ca-aurait-du-se-passer) >> endobj -301 0 obj +199 0 obj << /Type /Annot /Subtype /Link @@ -4115,32 +2953,32 @@ endobj /BS << /W 0 >> -/Dest (jdb/:jeudi-30-mars-2023) +/Dest (.:comment-ca-aurait-du-se-passer) >> endobj -302 0 obj +200 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 398.963622 555.889134 378.293622 ] +/Rect [ 63.386457 398.963622 555.889134 378.293622 ] /BS << /W 0 >> -/Dest (jdb/:vendredi-31032023) +/Dest (.:lecons) >> endobj -303 0 obj +201 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 393.443622 77.060285 379.043622 ] +/Rect [ 63.386457 393.443622 93.647199 379.043622 ] /BS << /W 0 >> -/Dest (jdb/:vendredi-31032023) +/Dest (.:lecons) >> endobj -304 0 obj +202 0 obj << /Type /Annot /Subtype /Link @@ -4148,10 +2986,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:vendredi-31032023) +/Dest (.:lecons) >> endobj -305 0 obj +203 0 obj << /Type /Annot /Subtype /Link @@ -4159,10 +2997,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:lundi-3-avril) +/Dest (.:resume-des-difficultes-techniques) >> endobj -306 0 obj +204 0 obj << /Type /Annot /Subtype /Link @@ -4170,10 +3008,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:lundi-3-avril) +/Dest (.:resume-des-difficultes-techniques) >> endobj -307 0 obj +205 0 obj << /Type /Annot /Subtype /Link @@ -4181,32 +3019,32 @@ endobj /BS << /W 0 >> -/Dest (jdb/:lundi-3-avril) +/Dest (.:resume-des-difficultes-techniques) >> endobj -308 0 obj +206 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 357.623622 555.889134 336.953622 ] +/Rect [ 63.386457 357.623622 555.889134 336.953622 ] /BS << /W 0 >> -/Dest (jdb/:mardi-4-avril) +/Dest (.:browser-headless) >> endobj -309 0 obj +207 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 352.103622 77.060285 337.703622 ] +/Rect [ 63.386457 352.103622 93.647199 337.703622 ] /BS << /W 0 >> -/Dest (jdb/:mardi-4-avril) +/Dest (.:browser-headless) >> endobj -310 0 obj +208 0 obj << /Type /Annot /Subtype /Link @@ -4214,32 +3052,32 @@ endobj /BS << /W 0 >> -/Dest (jdb/:mardi-4-avril) +/Dest (.:browser-headless) >> endobj -311 0 obj +209 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 336.953622 555.889134 316.283622 ] +/Rect [ 63.386457 336.953622 555.889134 316.283622 ] /BS << /W 0 >> -/Dest (jdb/:mercredi-5-avril) +/Dest (.:ocr_2) >> endobj -312 0 obj +210 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 331.433622 77.060285 317.033622 ] +/Rect [ 63.386457 331.433622 93.647199 317.033622 ] /BS << /W 0 >> -/Dest (jdb/:mercredi-5-avril) +/Dest (.:ocr_2) >> endobj -313 0 obj +211 0 obj << /Type /Annot /Subtype /Link @@ -4247,32 +3085,32 @@ endobj /BS << /W 0 >> -/Dest (jdb/:mercredi-5-avril) +/Dest (.:ocr_2) >> endobj -314 0 obj +212 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 316.283622 555.889134 295.613622 ] +/Rect [ 63.386457 316.283622 555.889134 295.613622 ] /BS << /W 0 >> -/Dest (jdb/:jeudi-6-avril) +/Dest (.:stockage_1) >> endobj -315 0 obj +213 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 310.763622 77.060285 296.363622 ] +/Rect [ 63.386457 310.763622 93.647199 296.363622 ] /BS << /W 0 >> -/Dest (jdb/:jeudi-6-avril) +/Dest (.:stockage_1) >> endobj -316 0 obj +214 0 obj << /Type /Annot /Subtype /Link @@ -4280,10 +3118,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:jeudi-6-avril) +/Dest (.:stockage_1) >> endobj -317 0 obj +215 0 obj << /Type /Annot /Subtype /Link @@ -4291,21 +3129,21 @@ endobj /BS << /W 0 >> -/Dest (jdb/:vendredi-6-avril-2023) +/Dest (.:optimisation-du-programme) >> endobj -318 0 obj +216 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 290.093622 77.060285 275.693622 ] +/Rect [ 55.386457 290.093622 82.786359 275.693622 ] /BS << /W 0 >> -/Dest (jdb/:vendredi-6-avril-2023) +/Dest (.:optimisation-du-programme) >> endobj -319 0 obj +217 0 obj << /Type /Annot /Subtype /Link @@ -4313,10 +3151,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:vendredi-6-avril-2023) +/Dest (.:optimisation-du-programme) >> endobj -320 0 obj +218 0 obj << /Type /Annot /Subtype /Link @@ -4324,21 +3162,21 @@ endobj /BS << /W 0 >> -/Dest (jdb/:vacances) +/Dest (.:ethique-du-projet) >> endobj -321 0 obj +219 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 269.423622 77.060285 255.023622 ] +/Rect [ 55.386457 269.423622 82.786359 255.023622 ] /BS << /W 0 >> -/Dest (jdb/:vacances) +/Dest (.:ethique-du-projet) >> endobj -322 0 obj +220 0 obj << /Type /Annot /Subtype /Link @@ -4346,10 +3184,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:vacances) +/Dest (.:ethique-du-projet) >> endobj -323 0 obj +221 0 obj << /Type /Annot /Subtype /Link @@ -4357,10 +3195,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:lundi-24-avril-2023) +/Dest (.:utilisation-de-chat-gpt) >> endobj -324 0 obj +222 0 obj << /Type /Annot /Subtype /Link @@ -4368,10 +3206,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:lundi-24-avril-2023) +/Dest (.:utilisation-de-chat-gpt) >> endobj -325 0 obj +223 0 obj << /Type /Annot /Subtype /Link @@ -4379,10 +3217,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:lundi-24-avril-2023) +/Dest (.:utilisation-de-chat-gpt) >> endobj -326 0 obj +224 0 obj << /Type /Annot /Subtype /Link @@ -4390,10 +3228,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:mardi-25-avril-2023) +/Dest (.:ameliorations-futures) >> endobj -327 0 obj +225 0 obj << /Type /Annot /Subtype /Link @@ -4401,10 +3239,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:mardi-25-avril-2023) +/Dest (.:ameliorations-futures) >> endobj -328 0 obj +226 0 obj << /Type /Annot /Subtype /Link @@ -4412,10 +3250,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:mardi-25-avril-2023) +/Dest (.:ameliorations-futures) >> endobj -329 0 obj +227 0 obj << /Type /Annot /Subtype /Link @@ -4423,10 +3261,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:26-avril-2023) +/Dest (.:conclusion) >> endobj -330 0 obj +228 0 obj << /Type /Annot /Subtype /Link @@ -4434,10 +3272,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:26-avril-2023) +/Dest (.:conclusion) >> endobj -331 0 obj +229 0 obj << /Type /Annot /Subtype /Link @@ -4445,10 +3283,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:26-avril-2023) +/Dest (.:conclusion) >> endobj -332 0 obj +230 0 obj << /Type /Annot /Subtype /Link @@ -4456,10 +3294,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:jeudi-27-avril-2023) +/Dest (.:notes-de-code) >> endobj -333 0 obj +231 0 obj << /Type /Annot /Subtype /Link @@ -4467,10 +3305,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:jeudi-27-avril-2023) +/Dest (.:notes-de-code) >> endobj -334 0 obj +232 0 obj << /Type /Annot /Subtype /Link @@ -4478,10 +3316,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:jeudi-27-avril-2023) +/Dest (.:notes-de-code) >> endobj -335 0 obj +233 0 obj << /Type /Annot /Subtype /Link @@ -4489,10 +3327,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:vendredi-28-avril-2023) +/Dest (.:glossaire) >> endobj -336 0 obj +234 0 obj << /Type /Annot /Subtype /Link @@ -4500,10 +3338,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:vendredi-28-avril-2023) +/Dest (.:glossaire) >> endobj -337 0 obj +235 0 obj << /Type /Annot /Subtype /Link @@ -4511,32 +3349,32 @@ endobj /BS << /W 0 >> -/Dest (jdb/:vendredi-28-avril-2023) +/Dest (.:glossaire) >> endobj -338 0 obj +236 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 150.923622 555.889134 130.253622 ] +/Rect [ 47.386457 150.923622 555.889134 130.253622 ] /BS << /W 0 >> -/Dest (jdb/:lundi-1-mai-2023) +/Dest (CahierDesCharges/:cahier-des-charges) >> endobj -339 0 obj +237 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 145.403622 82.786359 131.003622 ] +/Rect [ 47.386457 145.403622 63.334211 131.003622 ] /BS << /W 0 >> -/Dest (jdb/:lundi-1-mai-2023) +/Dest (CahierDesCharges/:cahier-des-charges) >> endobj -340 0 obj +238 0 obj << /Type /Annot /Subtype /Link @@ -4544,10 +3382,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:lundi-1-mai-2023) +/Dest (CahierDesCharges/:cahier-des-charges) >> endobj -341 0 obj +239 0 obj << /Type /Annot /Subtype /Link @@ -4555,1183 +3393,10 @@ endobj /BS << /W 0 >> -/Dest (jdb/:mardi-2-mai-2023) +/Dest (CahierDesCharges/:contexte) >> endobj -342 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 124.733622 82.786359 110.333622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-2-mai-2023) ->> -endobj -343 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 124.733622 555.889134 110.333622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-2-mai-2023) ->> -endobj -344 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 109.583622 555.889134 88.913622 ] -/BS << -/W 0 ->> -/Dest (jdb/:recrutement-payerne-mai-2023) ->> -endobj -345 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 104.063622 82.786359 89.663622 ] -/BS << -/W 0 ->> -/Dest (jdb/:recrutement-payerne-mai-2023) ->> -endobj -346 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 104.063622 555.889134 89.663622 ] -/BS << -/W 0 ->> -/Dest (jdb/:recrutement-payerne-mai-2023) ->> -endobj -347 0 obj -<< -/Filter /FlateDecode -/Length 42649 ->> -stream -xM\Y^y ef>B HuOȆhhP$K@UqFk%T2xf;??=_q;~O~>|>]u8>ݮqzoe8ǯv~ݟ]ӯ}Pߏuv;_~78]>8>=5/<2_tnm%%O~ik%s=3֒uqdv?Z{?[{ΞqSKqsKq_KKqђuqxr>/[mց^u>>}-)yy:>*g~X;z\;ٷm[ֹM~Fy8v^up[~5sn>e+y\|[7X w^S𵿖:Bθ5_k6oh5ǥ͸˚f|w93LGqx5ϣ͸yu^_͸˚u6.kgh3n=96-Vs=ڌ[jnGq>h3rg~\ی[/լ6̯kqOym38_ی9kq5rm3nzm3n}ܮm]kq>ڣZsg^@m՚uwYs6.kg͸˚^ڌ[ jև>feYg^^q=׊fewsp-ym]\[^q=o]\{^q=עfewspzm]\^q{]͸cw9v6=׮fܱ^cw9v6=׮fܱڌ;\^qǞkk3spzm{]͸cw9=spzm{]͸cw9v6=׮fܱڌ;\^qǞkk3spzm{>u;\^qǞkk3sp-!m{/ی;\_w9pi3sp 6=h3sp}k3sp%l3spڌ;\@mƭ/Bmq~~{<u;k6}G>qkUμvkm֙׮fZg^^q:ڌ֙׮f|{|{{{{μv6u^=zYg^Qq?UE͸eVe^lQ{g~=z3]͸μv6֟j.u^י׮fμ6}[oh5ǭG㮷}g㮷}W㮷u]oYo3z_g^zqޮuou[Oz^u>u>_u9v6{]͸랃kk3ڌ9v6{nu9v6{]͸랃kk3ڌ9v6{]θ=׮fmwspz3wspzm\^q=׮fmwspzm\^q=׮fmwspzm|wspzm\^q=׮fmwspzm\^q=׮fmwspzm|wspzm\^q=׮fmwspzm\^q=׮fmwspzm|wspzm\^q=׮fmZڌ9x^KHq5*SEjǭϨ=g=g=g~=n}Qggռw[spTq5kk3:^ǭ髹^ڌouuuu[kV:Ygw_sp=X돹q}okk3yz3w3w3?w3?6ռw_sv6k׮f}R{}ڌ[[Զw3w3w3?w3?ռw_s^mou|#tKǯp}_{i+z/ݷ|gcJ_οC꺬Eg*ηO}sZt?__~Oz|c'Z~:Ju}?|˾N븾wx;H$ߞwDR.G"c^ M @$,DB& M @$,DB& M @$,D7 o @$D7 o @$@$Hx" DBA$Hx" DBA$Hx" DBA$Hx" DBA$Hx" DBA$Hx" DBA$Hx" DBA$Hx" DšI$Hx" DBA$Hx" DB D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$@$Hx" DBA$Hx" DBA$Hx" DBA$Hx" DBA$Hx" DBA$Hx" @$Hx" @$Hx"a$@$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx"a$@$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx"a$@$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx" @$Hx"a$@$Hx" @$Hx" @$Hx" @$Hx" |yso _ 'x I՗ga?~E<~Zޡ.C{H˸Uc^qM@",(BP&M@",(BP&M@",(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7K&fo@ހ"<7Q6Ex=(P6Ex=(P6Ex=(P6EX{E|=i(b}*_/"n?"uQo\wz{gnEGg2Qĸwqye\*}xExIP&O"< $(“M@ExIP'A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(B"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEh3PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQEx(MPDi"JQo@ (MPDi"J@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"(4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP6E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A fE&(4A QE&(4Aހ"JQE&(PDi"JQEx |zPk7P:Qķ?QQĻ{Ew(ۏ@;!$^/~! .Cy\w?"  -Ih$a@$4Ih$a@$4Ih$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$aDހ$Ix$@ހ$Ix$@ހ$Ix$$ H7 m$ H7 m$ H7 m$ H7 m$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6IX{$$YHb $!ǐ7?OCC_ӏˆ-׷;=]Fhaɀ#4Fhaɀ#4FhaɄ#Fx̀#Fx̀#Fx 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#FX3a7o#Fh3`7o#Fh3`7o#Fhs#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx̀#Fx̀#Fxä́#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fxä́#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fxä́#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fxä́#Fx̀#Fx̀#Fx̀#Fx̀|>yK_#y #wڿ F?}G>IpX.W }x$4Ihd M@$4Ihd M@$4Ihd" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ih37 o@ހ$Ih37 o@ހ$IX37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$IX37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$IX37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$IX37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih37 o@ހ$Ih35_'@^;㟆$֧;ğ 'X\Ļ{{_Oo;x#+-0b\ۻǸ<2x>#< $0B`'FxI`&O#< $0“M(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J̀ (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 0404 (M`6Ff?p{܀ (M`7^u04 QwQF&0`DiaDi#JQo9~ (M`Di#FF&04 QwQF&0`Di#JQo (M`Di#J 04 (M`Di#04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`6F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 fF&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo|>yK_8_#y #(Èڿwa0b}ys=5` <2qFx̀#Fxfoo#FhsFxsFx 0B#9#Fx̀#Fxfo#Fh3`7o#Fh3`7o#FX3a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#FX3a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#FX3a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#FX3a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`5_@R0B#oF|FQ#+0bcĆ~|~IG^oO;$wH] -Ih$a@$4Ih$a@$4Ih$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@L$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@\Aހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$$ H7 o@ $ H7 o@ $ H7 o@ $ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m |zӐ"o"7PĻ{_}ߐ`ğO? -#^ޞw0`yq+>#4FX2`&M#4FX2`&M#4FX2a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#FX3a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#FX3a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0š[ -|z`r0[02^o0⯧7q;1xoÖ́].Wxë.0“O#4FxI`'Fh$0“O#< dF&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0B#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&0`Di#JQFx(M`Di#JQm(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J̀ (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`6F&04 (M`7F&04 QF&04#JQF&0`6_@R;`#>wtOc00.8xGK/a0b}=5`y\w?Fhaɀ#4Fhaɀ#4FhaɄ#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fxä́#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fx̀#Fxä́#Fx̀#Fx̀#Fx̀#Fx̀#Fx  0`7o  0`7o  0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m[ -|FH`;`ˆowq*xwF$8(Xc-iz$I<^˼Uc^ M@$,HB& M@$,HB& M@$,H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ Hš$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HBH7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$$Ix$ HB$Ix$ HB$Ix$@ހ$Ix$@ހ$Ix$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@|y{@_'y~A$O$q=u$^W_7$5< o5=5F{w>.ϻ^)O#< I`'Fx 0“O#< $0B#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFh3`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQm(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQo (M`Di#J 04 (M`Di#04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`6F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 fF&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo|w? FNOw߼c5^o~8BAuQ(q{A .Eyq#B&@ M ( PB&@ M ( PB&@ ML( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ oL( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ oL( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ o ( P7@ m( P7@ m( P7@ k&( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ k&( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ k&( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ k&( P7@ m( P7@ m( P7@ m( P7@ m[ |JHӠ~+G(O( J;H3%0*֝ϿfyEc}췧;$\w?jx+$ HB%Ih$ HB%Ih$ HB%Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ HB$\77 o@ $~U$Ixf" o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf" o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o.Aހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf kxOw ? II< 'x#Iz;I{=b}]_;|.W -}x#4FhdM#4FhdM#4Fhdo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fxfo#Fh3`7=no#0›}W& 0š #Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0š #Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0š #Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0B#Fx 0š #Fx 0B#Fx 0B#Fx 0B#Fx 0B#}#4?]0[0 -xwGo1a3~1ѷfˆqo.?yq+e~@\~$=\w?"  -Ih$a@$4Ih$a@$4Ih$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$aDހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ix$@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf kxO? IOI|Iө#wڿϿ!07{l]O0b6GO;w0b <.ϻ_)yK_X#a-߆0[0ϧ##^:o8G|$n Pbj{ޞ %wPb|.(1|؇W!PB&@ K( PB&@ K( PB&@ K&( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ k&( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ k&( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P7@ m( P6Jx( P6Jx{9+]9- f~K*=ɘcc'*TIvJ!pC(afn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(afn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(afn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(afn%J!pC(fn%J!pC(fn%J!pC(fn%J!pC(ff~ J=mzkJCB϶?CwPBOzO>|D #En^輪i+Jqq(h[y}Y}kc\GE'kw_0|/d'N_.:Zg JEfd}ZYcq]ol7'}]}Ҷv3M'kw:9Y{]מe+\G8օ-q\nnfm v>Sbk-q\齬q\֪}^gد۫-q\4q\Ƴng:u;k+eؿSuZ8}~>u]>֙f[{v?w:}ܮ_kv,sŬ/֕lk߶s\c?G[Y|y} ݶk/}>Q>27?n}N Y|]G϶VבޢmCf>{qz]Z]G|m;w=^KαOu\1 hkueF1x]o϶u>nu>s[0eօe3kV;sNYcWhVwq}#a}ϯ絭qN^3enWα̺y|Ovq[WY㸭7mgok]v>svDZŎVwq:֛mgo u蹬qQÒbqp:I]c8x=Vqvwź>[c]Q5Uv>Q:[c]| v~\u;k6mzYu_nYێv>S[8x[gϏVqؿ8ضǾoYv;u9ͬ}^϶Vq^e1k/rnfhklwZaVwqngmVN3kb[c8ﳕ;c]~"87]Xjklw[#8*mgzoYc]55;uumGvq˦v于W8}:ߦmI52[Xy5jܬeޟ%y5z58vdYgm;8x=v]}٥Y[cu\GOr[:$n׽]qq^geqq^e/;lIn U]Wnm2[O<»ng\yq5umIn8X{qp.v]S.mcd$;ev .FOr[hIu>}~3ߺ띷'ǻGOrw;ݎvvzvޟ67ZzkInoum;!o׵]Sa'Ǽ]KOrۿpYly/y['m9o넫'9sց'9snS=snS[c~ujI}jSw9o©c?m$~qoIy9osnGOr8}c?m?Ъmg?u5>ɱz}~W]5'9v׿OvgUkx?cRhI_v]^??vyGv]@oI|usg~vs$~U??ϷϷy$6箜g~V??m̮+GOrGfvo~~$O+hIvDZ{v ;: kld'zG8}qmw}kl}qY8ւx\}qk%~ֿ;~\n]_vdwHynIvDZvdw׳~8NZ}WO8NYkX?w˳'yw;}ng7kYXKwqy}wq=Z?wJwq}>ɻ]gvǾ[ػ8ηvqvqv 8IG[cc}wDZި}wq/ۓu]طvvq8nƾ|& ߙa)]H_8^/,~ut>Mfowx\ϚbiF/˷xhg|m/eF̨pQN2IfT8Ɍ -'JQ$3*dF̨pQd̨(&3*Ɍb2nj -7̨(&3*Ɍb2nj -7̨(&3*Ɍb2nj -7̨(&3*Ɍb2nj -7̨(&3*Ɍb2nj -7̨(&3*Ɍb2nj -7̨(&3*Ɍb2nj -7̨(&3*Ɍb2̨pÌb2̨(&3*Ɍ -7̨(&3*Ɍb2̨P3fTdFE1QQLfTaFE1QQLfTdFfTdFE1QQLfTaFE1QQLfTdFfTdFE1QQLfTaFE1QQLfTdFfTdFE1QQLfTaFE1QQLfTdFfTdFE1QQLfTaFE1QQLfTdF1̨(&3*Ɍb2 3*Ɍb2̨(&3*0̨(&3*Ɍb2 3*Ɍb2̨(&3*0̨(&3*Ɍb2 3*Ɍb2̨(&3*0̨(&3*Ɍb2 3*Ɍb2̨pÌb2̨(&3*Ɍ -7̨(&3*Ɍb2̨P3fTdFE1QQLfTaFE1QQLfTdFfTdFE1QQLfTaFE1QQLfTdFfTdFE1QQLfTaFE1QQLfTdFfTdFE1QQLfTaFE1QQLfTdFfTdFE1QQLfTaFE1QQLfTdF1̨(&3*Ɍb2 3*Ɍb2̨(&3*0̨(&3*Ɍb2 3*Ɍb2̨(&3*0̨(&3*Ɍb2 3*Ɍb2̨(&3*0̨(&3*Ɍb2 3*Ɍb2̨(&3*0̨(&3*Ɍb2 3*Ɍb2̨(&3*ԌdFE1QQLfTnQQLfTdFE1QdFE1QQLfTnQQLfTdFE1QdFE1QQLfTnQQLfTdFE1QdFE1QQLfTnQQLfTdFE1QdFE1QQLfTnQQLfTdFE1Qf̨(&3*Ɍb2̨pÌb2̨(&3*Ɍ -7̨(&3*Ɍb2̨pÌb2̨(&3*Ɍ -7̨P33*a?.ng6ÇXϛ>mgv{^~mf7.x<0?_ɷ>y]S ˟u幕+}$H(!02 %J$H(!02 %J$H(!02 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!03 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!03 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H!P3 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$H 7n$Hd/[ x[=Hl@vށzy;x_~_ Ź 3/˧xU1 -K$DJ $pI"' A8I$DNA(D1 IQL"bA!(&D1 IQL"7D$(&D1 ID$(&D1 AD$(&"bAD$pCQL"bADn IQL"bA D1 IQL"bA!(&D1 IQL"5#(&D1 IQL"7D$(&D1 ID$(&D1 AD$(&"bAD$pCQL"bADn IQL"bA D1 IQL"bA!(&D1 IQL"7D$(&D1 IfD$(&D1 ID$(&D1 AD$(&"bAD$pCQL"bADn IQL"bA D1 IQL"bA!(&D1 ID$(&D1 AD$(&AD$(&D1 IQL"bA!(&D1 IQL"7D$(&D1 ID$(&D1 AD$(&"bAD$pCQL"bADn IQL"bA D1 IQL"bAD1 IQL"bA_AD$(&"bAD$pCQL"bADn IQL"bA D1 IQL"bA!(&D1 IQL"7D$(&D1 ID$(&D1 AD$(&AD$(&s"bAD$pCQL"bADn IQL"bA D1 IQL"bA!(&D1 IQL"7D$(&D1 ID$(&D1 AD$(&"bAD$P3"bAD$psNQL"bADn IQL"bA D1 IQL"bA!P33>"ǿ+xfE?G%A-~ qWv{q潝ׯ'IrE:?O/(x}D(PQ(02* -%TJ(PQ(02* -%TJ(PQ(02+ -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQ03+ -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQ03+ -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQP3* -7Tn(PQ* -7Tn(PQ* -7Tn(PQ* -7Tn(PQ}(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊ̬(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊ̬(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊ̬(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(PQpCEᆊBͨ(04Q[*BE϶QQZQ|N(okJb;ӧJ?Uc<2^~ * %TFF%JB * %TFF%JB * %TFf%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7Tff%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7Tff%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 7TjF%J * 5pC%J * 5pC%J * 3pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 3pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 3pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 5pC%J * 3pC%J * 5pC%J * 5pC%J * 5pC%J * 50PJo$חL~^IV?G%VS+;|("3%^׵#קZ?ݙV/RPB-ZȨ%PK(PB-ZȨ%PK(PB-ZȬ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-Z̬%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-Z̬%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-ZBͨ%PKpC-fn%PKpC-fn%PKpC-afn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-afn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-afn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-afn%PKpC-fn%PKpC-fn%PKpC-fn%PKpC-ff~9PK=m/Zg%֥i%>m]Kߞ/_XݵR?Jc]Or?3Ex^>V-[')"PB$ENRD8I"I')"p"B("IQLbRD" ED1)"IQLbRD(&ED1)"IQL7Ť(&ED1)"I"Ť(&ED1)"PD"Ť(&EbRD"ŤpCQLbRD"n("IQLbRD" ED1)"IQLbRDED1)"IQLbRD(&ED1)"IQL7Ť(&ED1)"I"Ť(&ED1)"PD"Ť(&EbRD"ŤpCQLbRD"n("IQLbRD" ED1)"IQLbRD(&ED1)"IQL5(&ED1)"IQL7Ť(&ED1)"I"Ť(&ED1)"PD"Ť(&EbRD"ŤpCQLbRD"n("IQLbRD" ED1)"IQL7Ť(&ED1)"I"Ť(&ED1)"Ԍ"Ť(&ED1)"PD"Ť(&EKbRD"ŤpCQLbRD"n("IQLbRD" ED1)"IQLbRD(&ED1)"IQL7Ť(&ED1)"I"Ť(&ED1)"PD"Ť(&EQD"Ť(&EbRD"ŤpsIQLbRD"n("IQLbRD" ED1)"IQLbRD(&ED1)"IQL7Ť(&ED1)"I"Ť(&ED1)"PD"Ť(&EbRD"ŤP3bRD"ŤpCQLbRD"n.)"IQLbRD" ED1)"IQLbRD(&ED1)"IQL7Ť(&ED1)"I"Ť(&ED1)"PD"Ť(&EbRD"ŤpCQLbRD"jFQLbRD"n("IQLbRD"%ED1)"IQLbRD(&ED1)"IQL7j~YPD=]Ek-'E_XgEOQDyE|-"8n?Cb=Ӊ)zO%ݼ<2^>zk߭(%DJA у%DJA у%DJ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7Dn у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7Dn у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DnԌ у7DjF у7DjF у7Dff у7DjF у7Dj.Dn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpC`fFn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpC`fFn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDn=!zpC`fFn=!zpCfDn=!zpCfDn=!zpCfDn=!zpCfDf~x(y$|PB`dJ>(y$|PB`dJ>(y$|PB`dn>y$|pCfn>y$|pCfn>y$|pCfn>y$|pCfn>y$|pCfn>y$|pCfn>y$|pCfn>!|pCfn>!|pCfn>!|pC`fn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|pC`fn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|pCfn>!|P37n>!|P37n>!|037n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|037n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|037n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|P37n>!|037n>!|P37n>!|P37n>!|P37n>!|P33?JQGCI?JP⏆R8GC?JP -DP"R4 t 4 i(1HA %i(=HC BJRIHCiBJPDPR44!4:! i(HA" %i(HCDJ%RHCDJ(PJD+PbR4\"F0P4fD#Q4lt# %i(HA# i(HCGJ>RHC HJAPҐDDP*4$Q4$ %&i(5IA$ 'i(AIC)JJRRMICJJUPҕDXPʒ4%Q4% %0i(4ƤD& 2i(IAt& %4i(ICIMJkRICMJnPzDqPҜ4褡T'8aB&6Bwu'O;.v'?Gwrڷ؞٣->m=Yu':G2c7'f&}9Nu~>{NYn6.OZ??o{v|<e#DޣD5~y{?X cݯZ_?%;}ݹ{->&/v:uj]{~{Yqy}r]߯__w'ןnT -endstream -endobj -348 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 347 0 R -/Resources 4 0 R -/Annots [ 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -349 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 771.023622 555.889134 750.353622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-5-mai-2023) ->> -endobj -350 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 765.503622 82.786359 751.103622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-5-mai-2023) ->> -endobj -351 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 765.503622 555.889134 751.103622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-5-mai-2023) ->> -endobj -352 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 750.353622 555.889134 729.683622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-8-mai-2023) ->> -endobj -353 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 744.833622 82.786359 730.433622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-8-mai-2023) ->> -endobj -354 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 744.833622 555.889134 730.433622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-8-mai-2023) ->> -endobj -355 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 729.683622 555.889134 709.013622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-9-mai-2023) ->> -endobj -356 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 724.163622 82.786359 709.763622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-9-mai-2023) ->> -endobj -357 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 724.163622 555.889134 709.763622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-9-mai-2023) ->> -endobj -358 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 709.013622 555.889134 688.343622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-10-mai-2023) ->> -endobj -359 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 703.493622 82.786359 689.093622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-10-mai-2023) ->> -endobj -360 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 703.493622 555.889134 689.093622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-10-mai-2023) ->> -endobj -361 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 688.343622 555.889134 667.673622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-11-mai-2023) ->> -endobj -362 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 682.823622 82.786359 668.423622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-11-mai-2023) ->> -endobj -363 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 682.823622 555.889134 668.423622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-11-mai-2023) ->> -endobj -364 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 667.673622 555.889134 647.003622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-12-mai-2023) ->> -endobj -365 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 662.153622 82.786359 647.753622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-12-mai-2023) ->> -endobj -366 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 662.153622 555.889134 647.753622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-12-mai-2023) ->> -endobj -367 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 647.003622 555.889134 626.333622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-15-mai-2023) ->> -endobj -368 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 641.483622 82.786359 627.083622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-15-mai-2023) ->> -endobj -369 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 641.483622 555.889134 627.083622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-15-mai-2023) ->> -endobj -370 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 626.333622 555.889134 605.663622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-16-mai-2023) ->> -endobj -371 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 620.813622 82.786359 606.413622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-16-mai-2023) ->> -endobj -372 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 620.813622 555.889134 606.413622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-16-mai-2023) ->> -endobj -373 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 605.663622 555.889134 584.993622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-17-mai-2023) ->> -endobj -374 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 600.143622 82.786359 585.743622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-17-mai-2023) ->> -endobj -375 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 600.143622 555.889134 585.743622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-17-mai-2023) ->> -endobj -376 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 584.993622 555.889134 564.323622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-18-mai-2023) ->> -endobj -377 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 579.473622 82.786359 565.073622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-18-mai-2023) ->> -endobj -378 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 579.473622 555.889134 565.073622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-18-mai-2023) ->> -endobj -379 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 564.323622 555.889134 543.653622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-22-mai-2023) ->> -endobj -380 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 558.803622 82.786359 544.403622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-22-mai-2023) ->> -endobj -381 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 558.803622 555.889134 544.403622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-22-mai-2023) ->> -endobj -382 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 543.653622 555.889134 522.983622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-23-mai-2023) ->> -endobj -383 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 538.133622 82.786359 523.733622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-23-mai-2023) ->> -endobj -384 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 538.133622 555.889134 523.733622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-23-mai-2023) ->> -endobj -385 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 522.983622 555.889134 502.313622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-24-mai-2023) ->> -endobj -386 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 517.463622 82.786359 503.063622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-24-mai-2023) ->> -endobj -387 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 517.463622 555.889134 503.063622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-24-mai-2023) ->> -endobj -388 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 502.313622 555.889134 481.643622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-25-mai-2023) ->> -endobj -389 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 496.793622 82.786359 482.393622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-25-mai-2023) ->> -endobj -390 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 496.793622 555.889134 482.393622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-25-mai-2023) ->> -endobj -391 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 481.643622 555.889134 460.973622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-26-mai-2023) ->> -endobj -392 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 476.123622 82.786359 461.723622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-26-mai-2023) ->> -endobj -393 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 476.123622 555.889134 461.723622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-26-mai-2023) ->> -endobj -394 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 460.973622 555.889134 440.303622 ] -/BS << -/W 0 ->> -/Dest (jdb/:grand-prix-de-monaco) ->> -endobj -395 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 455.453622 82.786359 441.053622 ] -/BS << -/W 0 ->> -/Dest (jdb/:grand-prix-de-monaco) ->> -endobj -396 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 455.453622 555.889134 441.053622 ] -/BS << -/W 0 ->> -/Dest (jdb/:grand-prix-de-monaco) ->> -endobj -397 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 440.303622 555.889134 419.633622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-29-mai-2023) ->> -endobj -398 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 434.783622 82.786359 420.383622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-29-mai-2023) ->> -endobj -399 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 434.783622 555.889134 420.383622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-29-mai-2023) ->> -endobj -400 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 419.633622 555.889134 398.963622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-30-mai-2023) ->> -endobj -401 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 414.113622 82.786359 399.713622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-30-mai-2023) ->> -endobj -402 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 414.113622 555.889134 399.713622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mardi-30-mai-2023) ->> -endobj -403 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 398.963622 555.889134 378.293622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-31-mai-2023) ->> -endobj -404 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 393.443622 82.786359 379.043622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-31-mai-2023) ->> -endobj -405 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 393.443622 555.889134 379.043622 ] -/BS << -/W 0 ->> -/Dest (jdb/:mercredi-31-mai-2023) ->> -endobj -406 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 378.293622 555.889134 357.623622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-1-juin-2023) ->> -endobj -407 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 372.773622 82.786359 358.373622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-1-juin-2023) ->> -endobj -408 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 372.773622 555.889134 358.373622 ] -/BS << -/W 0 ->> -/Dest (jdb/:jeudi-1-juin-2023) ->> -endobj -409 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 357.623622 555.889134 336.953622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-2-juin-2023) ->> -endobj -410 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 352.103622 82.786359 337.703622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-2-juin-2023) ->> -endobj -411 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 352.103622 555.889134 337.703622 ] -/BS << -/W 0 ->> -/Dest (jdb/:vendredi-2-juin-2023) ->> -endobj -412 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 336.953622 555.889134 316.283622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-5-juin-2023) ->> -endobj -413 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 331.433622 82.786359 317.033622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-5-juin-2023) ->> -endobj -414 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 331.433622 555.889134 317.033622 ] -/BS << -/W 0 ->> -/Dest (jdb/:lundi-5-juin-2023) ->> -endobj -415 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 47.386457 316.283622 555.889134 295.613622 ] -/BS << -/W 0 ->> -/Dest (INXWIZI/) ->> -endobj -416 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 47.386457 310.763622 63.334211 296.363622 ] -/BS << -/W 0 ->> -/Dest (INXWIZI/) ->> -endobj -417 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 310.763622 555.889134 296.363622 ] -/BS << -/W 0 ->> -/Dest (INXWIZI/) ->> -endobj -418 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 295.613622 555.889134 274.943622 ] -/BS << -/W 0 ->> -/Dest (Code/ConfigurationTool/:configurationtoolcs) ->> -endobj -419 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 290.093622 77.060285 275.693622 ] -/BS << -/W 0 ->> -/Dest (Code/ConfigurationTool/:configurationtoolcs) ->> -endobj -420 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 290.093622 555.889134 275.693622 ] -/BS << -/W 0 ->> -/Dest (Code/ConfigurationTool/:configurationtoolcs) ->> -endobj -421 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 274.943622 555.889134 254.273622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverData/:driverdatacs) ->> -endobj -422 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 269.423622 77.060285 255.023622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverData/:driverdatacs) ->> -endobj -423 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 269.423622 555.889134 255.023622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverData/:driverdatacs) ->> -endobj -424 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 254.273622 555.889134 233.603622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverGapToLeaderWindow/:drivergaptoleaderwindowcs) ->> -endobj -425 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 248.753622 77.060285 234.353622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverGapToLeaderWindow/:drivergaptoleaderwindowcs) ->> -endobj -426 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 248.753622 555.889134 234.353622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverGapToLeaderWindow/:drivergaptoleaderwindowcs) ->> -endobj -427 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 233.603622 555.889134 212.933622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverNameWindow/:drivernamewindowcs) ->> -endobj -428 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 228.083622 77.060285 213.683622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverNameWindow/:drivernamewindowcs) ->> -endobj -429 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 228.083622 555.889134 213.683622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverNameWindow/:drivernamewindowcs) ->> -endobj -430 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 212.933622 555.889134 192.263622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverSectorWindow/:driversectorwindowcs) ->> -endobj -431 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 207.413622 77.060285 193.013622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverSectorWindow/:driversectorwindowcs) ->> -endobj -432 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 207.413622 555.889134 193.013622 ] -/BS << -/W 0 ->> -/Dest (Code/DriverSectorWindow/:driversectorwindowcs) ->> -endobj -433 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 192.263622 555.889134 171.593622 ] -/BS << -/W 0 ->> -/Dest (Code/F1TVEmulator/:f1tvemulatorcs) ->> -endobj -434 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 186.743622 77.060285 172.343622 ] -/BS << -/W 0 ->> -/Dest (Code/F1TVEmulator/:f1tvemulatorcs) ->> -endobj -435 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 186.743622 555.889134 172.343622 ] -/BS << -/W 0 ->> -/Dest (Code/F1TVEmulator/:f1tvemulatorcs) ->> -endobj -436 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 171.593622 555.889134 150.923622 ] -/BS << -/W 0 ->> -/Dest (Code/Form1/:form1cs) ->> -endobj -437 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 166.073622 77.060285 151.673622 ] -/BS << -/W 0 ->> -/Dest (Code/Form1/:form1cs) ->> -endobj -438 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 166.073622 555.889134 151.673622 ] -/BS << -/W 0 ->> -/Dest (Code/Form1/:form1cs) ->> -endobj -439 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 150.923622 555.889134 130.253622 ] -/BS << -/W 0 ->> -/Dest (Code/Program/:programcs) ->> -endobj -440 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 145.403622 77.060285 131.003622 ] -/BS << -/W 0 ->> -/Dest (Code/Program/:programcs) ->> -endobj -441 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 538.710911 145.403622 555.889134 131.003622 ] -/BS << -/W 0 ->> -/Dest (Code/Program/:programcs) ->> -endobj -442 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 55.386457 130.253622 555.889134 109.583622 ] -/BS << -/W 0 ->> -/Dest (Code/Settings.Designer/:settingsdesignercs) ->> -endobj -443 0 obj +240 0 obj << /Type /Annot /Subtype /Link @@ -5739,10 +3404,10 @@ endobj /BS << /W 0 >> -/Dest (Code/Settings.Designer/:settingsdesignercs) +/Dest (CahierDesCharges/:contexte) >> endobj -444 0 obj +241 0 obj << /Type /Annot /Subtype /Link @@ -5750,10 +3415,10 @@ endobj /BS << /W 0 >> -/Dest (Code/Settings.Designer/:settingsdesignercs) +/Dest (CahierDesCharges/:contexte) >> endobj -445 0 obj +242 0 obj << /Type /Annot /Subtype /Link @@ -5761,21 +3426,21 @@ endobj /BS << /W 0 >> -/Dest (Code/SqliteStorage/:sqlitestoragecs) +/Dest (CahierDesCharges/:projet) >> endobj -446 0 obj +243 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 104.063622 82.786359 89.663622 ] +/Rect [ 55.386457 104.063622 77.060285 89.663622 ] /BS << /W 0 >> -/Dest (Code/SqliteStorage/:sqlitestoragecs) +/Dest (CahierDesCharges/:projet) >> endobj -447 0 obj +244 0 obj << /Type /Annot /Subtype /Link @@ -5783,34 +3448,187 @@ endobj /BS << /W 0 >> -/Dest (Code/SqliteStorage/:sqlitestoragecs) +/Dest (CahierDesCharges/:projet) >> endobj -448 0 obj +245 0 obj << /Filter /FlateDecode -/Length 14914 +/Length 53024 >> stream -xOiv_^"#A/$ '8@EOrt-uƠ[<4o?뿞/?>]ǭy+Qv}^:?Oy>^mtv>?ktnx?|\_>O>~ϿvY?>o}Oy^}w}\$4uy:s}Lf|Ħ|ݞ[l+ף3_[ݍ3_{'5u:B3_[l֙{l֙_GlkMygh>?^GluƦ\ج3gl֙ -ͱu:v{Ħԙ_.4gݎԙ_:Q05u -~3?i{ik|O^ï{l~F۽l{{n59iݟ5HKi T|w3ik -kԙTq5_(͸U=Ҍ{|Gq:H3q[gEa4ukO3Ԋuמf\3Sfܣki=j#9X Ȟf\{qTsi=usO33cج3+5uzDӌ{|#fܣzDӌ{|#f\=ُ4j~ج3GqsZg~q3Xs-6uҌ{9X+^q5kK3`-yi=-/͸ǚwǚXs4k֦fcZҌ{9X^qk֮fܶ`zimk֮fܶ`zimkg5kK3n[sv45kK3n[sv45kK3n[sv45kK3n[sv45kK3n[s:9X^qۚ9X^qۚ9X^qۚ9X^qۚ9X^qۚ+qۚ9X\qۚ9X/ӌimk 45k9X#͸mdfܶ`}9XO45J3^ӌۮ~~{v=珸m[|{|Ջqf{\g֙q^̯m:sz{l̵̵̵̵֙u3qm{~_g~=n3̵̵WjquZҌ_U"fXg>?֙ϸգY}[g~=n֙_q۷:szi[v4ꞩ}3׮fܾיQO3nי3qTs=n?֙qۏuW\zquG4\zqm{~3q8WN]q=n֙qۯuW5kK3n_sv45kK3n_sv45kK3n_s89X^q9X^q9X^q`zik֮fܱ`zج3q;]/͸cҌ;]/͸cҌ;]/͸cҌ;]/͸cҌ;]/͸c{ܱ`zik֮fܱ`zik֮fܱ`zik֮fܱ`zik֮fܱ`zik>ϸk֮fܱ`zik֮fܱ`zik֮fܱ`zik֮fܱ`zik֮fܱ{ܱ`zik֮fܱ`zi5ȥwfQsVՋjgju#qs{\gW/jy=>;U{Qsp}TqG{zi5PZ_=>ҫiƝu#qm{y[gw֙qj^:`]`q;׽ծfYs^+6G:|=|3?W{5ǝ5w׮fYsq;kkK3Oojӌ;u#q|=יǝ:3qXT{Ys^ό4ΚzfwjբS\g>wgs{\Zy=\s^w9X/ӌ;iƝk 45=q皃w9X^q皃w9X^q皃w9X^q皃w9X^qk֮fܵ`}w9Xi]k֓1͸kzӌ;;͸kåw9X7fܵ`zi]k֮f׮fܵ=Zsv45kK3Zsv45kS`zi]k֮fܵ`zi]k֮fܵ`zi]k>}|!y^yiXwa}>ƹF{[_\W~}W6oWVzk?ܿBzԢS(]/o_?ԟmݟ?o{_7UW~Ym_m--Ϸ׉in.w\QI${Glחo[zGzީ .~&xʸ[5u<%Q&4AMX2Ԅ& MP&4AMX2Ԅ& MP&4AMX2Մ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMX3Մ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMX3Մ7 oPޠ&AMh3Ԅ7 oPޠ&AMh3Ԅ7 oPޠ&AMh&AMx5 jB&AMx5 jB&AMx5 jB&AMx5 jB&AMx5Pޠ&AMx5Pޠ&AMx5aTޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5aTޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5aTޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5aTޠ&AMx5Pޠ&AMx5Pޠ&AMx5Pޠ&AMx5PM&$j}j⻷?D8Ķ7 q~Xvzb}\NO+.2.u<5'4AOX2& M'4AOX2& M'4AOX27 oޠ'AOh37 oޠ'AOh37 oޠ'AOh'AOx= zB'AOx= zB'AOx= zB'AOx= zB'AOx= zB'AOx= zB'AOx= zš'AOx= zB'AOx= zB'AOx= zB = z7 o = z7 o = z7 o = z7 o = z7 o = z7 o = z7 oL= z7 o = z7 o = z7 ol oޠ'AOxf oޠ'AOxf oޠ'AOxf oޠ'AOxf oޠ'AOh37 oޠ'AOh37 oޠ'AOX37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOX37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOX37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOX37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh37 oޠ'AOh35z~߁az>߻'j=zmE=.uo%Wz%IV>}"ZB&h K- ZB&h K- ZB&h K- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h k- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h k- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z7h m- Z6CKx- Z6CKx- Z5SKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z5SKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z5SKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z6CKx- Z5SKx- Z6CKx- Z6CKx- Z6CKx- Z6CKX7-%-ߩ%wSK|Zm_=z|KA uKϟďzE=@۸xʸgĸgWO@xB' Hz]~;~y>th~05osVwP2ٯz<{خ7Qwľh|w|=y]}}狟 ;Nr_񱖺|wzhï41=roqu|'Ϻ[VUm`ϯ:ӟ>?܏ۺǿ|>N_B۷Z< +xM&Y_Qk +/w -(m@5#67H@fndYȚf"|f8{_8q~sq__q=]g|>?h_cޏ~?_O㺯_ϳy>$_ǯ/}\Xyy_x_/ۗWپqcrky֙j ykqef[3!Xk%˝c] ry:י.ZBu\=!X:"5cOFk~:p&k:~ywdu?30k#2\᚟EkGkgo홑`x"5 ׼ +oBb8#5?"5?ёfaO?fdg+2\D&k^:65g)rWtkA #e~`H 9RƵ52 uTb&׌z 2\3`͸)rMא)rM[̘)P*2\)⚯Xkc.[cQ᥌kAx)s5^ʸD21Q奌kb טR5 +q9J/e\cKטb1Q륌Az):s^ʸD23׊u\gKיRu jq9Z/e\gKיRu jq9Z/e\gKי׊u\gKיRu jq9Z/e\gKיRu jq9Z/e\gKיD23QȥA!):sq9_ʸ%e\g"tSu #e\g.e\gbA@):s?q8ϔqZ3q-q>=qn8|"5Xkbu\'qQ`ͨRkF2nX3jqQ륌XDE>XDE>8dS,""R,""RH}H}4H}H}lg>xFg>xFe63R<#3R<#2`M}H}H}̦>xFg>xFg>XfS<#3R<#3RH}H}4H}H}lg>xFg>xFe63R<#3R<#2`M}H}H}̦>xFg>xFg>XfS<#3R<#3RH}H}4H}H}lg>xFg>xFe63R<#3R<#2`M}H}lg>xFg>xFe63R<#3R<#1`M}H}H}̦>xFg>xFg>XfS<#3R<#3R,H}H}lg>xFg>xFe63R<#3R<#2`M}H}H}p̮>xFg>xFg>XfS<#3R<#3R,H}H}lg>xFg>xFe63R<#3R<#2`M}H}H}̦>xFg>xFg>XfS<#3R<#3RH}H}lg>xFg>xFe63R<#3R<#2`M}H}H}̦>xFg>xFg>XfS<#3R<#3R,H}H}g>xFg>xFe63R<#3R<#2`M}H}H}̦>8w_C~>OF^(?|y]tx |Q)EЗH *K8IaI٤HHlRE$EXDRE$EXDRCv)3"<#)3"<#)2IIaMHH&ExFRg$ExFRg$EXf"<#)3"<#)3",III٤HHlRg$ExFRg$ExFRe6)3"<#)3"<#)2II]HH&ExFRg$ExFRg$EXf"<#)3"<#)3",III٤HHlRg$ExFRg$ExFRe6)3"<#)3"<#)2IIaMHH&ExFRg$ExFRg$E8f"<#)3"<#)3",III٤HHlRg$ExFRg$ExFRe6)3"<#)3"<#)2IIaMHH&ExFRg$ExFRe6)3"<#)3"<#)2II]HH&ExFRg$ExFRg$EXf"<#)3"<#)3",III٤HHlRg$ExFRg$ExFRe6)3"<#)3"<#)2IIaMHH&ExFRg$ExFRg$E8f"<#)3"<#)3",III٤HHlRg$ExFRg$ExFRe6)3"<#)3"<#)2IIaMHH&ExFRg$ExfI٤HϬ"<#)2IURg$E8f"<#)3"Q=^E5UD`_8Avuk{)دk^E ,"31XCXN VkWWtI_k~疁{N8/1hO| _|cࠞ1:{NLZ|gt *K :7x!U:5J&A$c1J*rpL+-rpjJT_==1:x{n1qLy3="ӁLHtLΩ1raq$t:5?|c|l>C i$t:_ga!;1Xs10xI uPI s39萦AQ]zNґk5m5='5j؎\,ݫA{zN6$9NufM9IG3='Av֦$G_kƉ6cuӰ *05I5,<0gk~;=' NuTâ>uD\9@^5gv 'p u8UyT-sTâR7H߸FzNZ(`ufq{ 9sd jEM 1CvzN0q$;\gaQx}\8=vUE]>ּ'հ91t"sn6Y&kj؁pHIr+='Aq1R`Nuf$v3='cdގkvN~_b0}$K|;jO|C,$fKI? +3olő8=6o8p$MI&?m#հ6֑|ϑL~6uI#f3P8{l3pOIf{?[NI&?󍟓_\g+='g͕|7=~ۘ9|?9gí3ߞ>=|C$<#='\I=ct+sIǟG:U1: sIǿ3='tۊt?9HGzN2@OI&?ZzN23'?fW`ƎC㌿t:Ƒi;ctӜtc;oc?P?ͭ8dPx͹13* qs}_|n__e=LDTs. +EZoE7L rpͽkn!'kƅW%$r<p=Q.(:0fD;fDxOkڸat?tM;71\4J |?gڠ(IgڡxOEfi%1\s[O`&׌[,|&׌;6]5#B5E)5`W(uqo>E)5.c&kgܧkgܧθO/HZ5!1X3qbcܧbZpqo>Eq̵5#ӇknGܧ|q>\q}DA}>>u}7>HDʅk3O5#Szq5\30|xO1icrkژi6 598ړic"N>wՓicJ1Q}ژz>mA7i6`tM?i6`oOڧ9pxLkf6~!1Xs{K`z>e}D)s'O?q2qz9pKה9;2O6&kƗ>et)s!)s|[5q2q9SKܧA=WZ3sF<;Sqiv R9PXN [Z3rwڧ;޸fT6i5ckڹfHӚ;&`7+|܁iv`+ӎtMEb&Q5o~>7Vܧ׌N<"q\]q"qO}f ?*+S*} +הJAb") ?*xYiR9?S*ljH>r@9S*wڧT>rQ}Jy>rHg}JeSڧTsIkf5S*ԙ):S*)J +3S*3S`?fܧA~L#mv͸Oئq2dL`f<|tM͸Oq21>e|9x,H?y͸Oq29>e5exLkfm}<)se8lkJ'kr-8>rUCHpMiR9ǫik>FڧT)S*BFڧTPÏOml}JݏiR9hOiR9hOiR9h9>rYG"(.S*lIŎO4vܥ5~/k=S*Fzk:>r}:fJ|}l>Eq"QOGtqM zܧ|O/q"H8S`C)r}lkO8OoyOo'tMoOq>\>E6q"~q"qmiR9ha>rc]KALڧTpbíV$*mAC}J倿HAÁ+S* O c?AC }J堡PKS0S*XLKAC2f`b?EGrxGrHTP^~$*xW=>rrGrzHTZ?c?~$*AC}.9VGr'#Q9h>e)swaܧB%9؎؏DW4Sy~$* ?OHT7?>ebq2~$* b?l؏D倿9H79x\4b?v؏D##Q9hGHTu}J)vU'#s~W9x؏*ϊHr#W9xFGz~eP9gkJU)~qri~*rp~O`~ȷgJAU9)g)9N?W~([3^Sz{x8~`#;3g1|pzA~0mݟ|QOhr~/z`}˫l_QOޅ` HOHOzg'xFzg'xFze6=3<#=3<#=2  `MOHOHO̦'xFzg'xFzg'Xf<#=3<#=3,   HOHOlzg'xFzg'xFze6=3<#=3<#=1  `MOHOHO̦'xFzg'xFzg'Xf<#=3<#=3,   HOHOlzg'xFzg'xFze6=3<#=3<#=2  `MOHOHOp̮'xFzg'xFzg'Xf<#=3<#=3,   HOHOlzg'xFzg'xFze6=3<#=3<#=2  `MOHOHO̦'xFzg'xFzg'Xf<#=3<#=3   HOHOlzg'xFzg'xFze6=3<#=3<#=2  `MOHOHO̦'xFzg'xFzg'Xf<#=3<#=3,   HOHOzg'xFzg'xFze6=3<#=3<#=2  `MOHOHO̦'xFzg'xFzg'Xf<#=3<#=3,   HOHOlzg'xFzg'xFze6=3<#=3<#=1  `MOHOHO̦'xFzg'xFzg'Xf<#=3<#=3,   HOHOlzg'xFzg'xFze6=3<#=3<#=2  `MOHOHOp̮'xFzg'xFzg'Xf<#=3<#=3,   HOHOlzc~Q? COQO?_oMH>apͧؾپblaptG y>}<'ƹErgd,w4 \"p-C."p7'y}8#X:8#X:S9SZLv"pΔl3EjF0Lv"nz0LC$uxW\-^R i)p`"R > + B`zĶ:yq($)sq22~)p~IאOp`͍ riK=eДqqͫkkF8܀`h%k~F8d>XkTʸ|5rW4e-`H׼Fʸ6kkkg8\r0Lא2!\єq+2!\єq29SƵ52-[;n⚟X5 +^ʸD21Q㥌k9bטRp5\cKט(R5 *q9R/e\c֋D23Wu\gKיRuZu:3Q륌P'q9Z/e\gKיRu jq9Z/e\g^3q9xXu jq9Z/e\gKיRu}:3Q륌N\Xu jq9Z/e\gW:s^ʸ`(BRu ):sq9Kʸ|F:s23f23 Snq9P8J3e>MG遟2h(=RQz?Od8JcG@2ÁZ/e~ ֌Z/e~J8JpKG@2qXQzB(=)(=8Jjqp:ÁB-eTﱎ8JGp8JxSuz)(=uN XQz8P륌=qxSQz8pSQz8&2[4SQz8P륌pધpધXQz8pSQz`2z(=RQz8SEkbGXQz8P륌uN(=RQz@8J+ecXQz8P륌pKGXQz8P륌pKG@39Z/eTﱎ@/ eco78J8f:ÁZ/eTp+q6DkcG@2~dbfz)(=8JjqP:z(=ϊu^8JjqE)(=|6$f9cGL(=8=qNv Lp" RQz8GkcG4qN~gO ֌Z/frD2ÉZ/eT;#qNz)(=&SQz#2Xs;bGD2~̱pKGDDk@#e^8J'İٓaJ'jqNz)(=VuXbZ/eT;#qNz)(=RQzs(=3RQz8YqgpHGD2+qxgpHGU$⚟XQz@:Ér8J')(=m5q9bG~(=Έu^8J'jqNz)(= 8J'jqNz1㘃RQz8YSQz89RQz8q3p"5lJ sqpu+=KJWu+=KJ׈u+=KJRƽjqp}~HeRƽjqO:Sz豎f~lwudP}~ +i,=LJ ao{޲s:? +(?kD PЗPd}˫l_Q2 hC + hE4C"}g4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +g(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3}g4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +g(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3}g4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +g(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mg4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3}g4C3Pf(XfPf(xF3< +f(xF3< + he + hg4C3`mc~l 3to?yM'xGZ6Czqá9 + +Ʒ}j8۟y|훒?[#U۟6?}w=޷[KhoӼ]va_|y_^eww`)#?x`ML)!0?HL)!0?HL)!0?HL)!0?HL)!0?HL)!0?HL)!0?HL)!0?HL)!0?HL)!0?lC`JL)!0?xFC`JL)!0?xFC`JL)!0?xFC`JL)!0?xFC`JL)!0?xFC`JL)!0?xFC`JL)!0?xFC`JL)!0?xFC`JL)!0?xFC`JL)!0?XfSC`JL)3SC`JL)3SC`JL)3SC`JL)3SC`JL)3SC`JL)3SC`JL)3SC`JL)3SC`JL)3SC`JL)2SC`JLSC`JLSC`JLSC`JLSC`JLSC`JLSC`JLSC`JLSC`JLSC`JLSC`J]L)3SC`w!0?HL<#!0?f|SC`J]L)3SC`w!0?HL<#!0?f|SC`J]L)23)!0?xFC`J?)!0Sg?C`JL3)!0?xFC`J?)!0Sg?C`JL3)!0?xFC`J ~ML~c~MLSC`JLSC`JLSC`JL`}~~}ߡ?1g|~O_Gaf}7:0U%^w~/y;N>Y~841G@ZAlp?OLCL_LOTuy~2'ix33%z WZ p)xOPL\<_==8LI'kgk;ck',t-:tZ`W.gZWKk 01<+] |wk1;M!3}♋Ƒ| kN>|ogog&3]uYҚ8:<;51_A'1}Ǚu}-Z\2;0O7}ٽҵ'\Z=w[ddQ$wģ5#;랮bCZ  k?{ pLLgsk}֌J}#@AvZ7dњZ~VZ3r_;>0~]ϝr< +&f׮Z L9A7]g:{5NJ9^;] 8X98Xk#398kf #VrWkj7P`t^EJUjC}xCqjC>M98F鼊3}Ϋ 9`*}V:6JՆygJU\*:eg:6t-wKkFk̤8yg:+WrpIUf>鼊s #Wrn:zڐΫ98;Gg:v N+W;rpJU$) rpy<5#0y,0*y#q鼊>fk*k`;W;%ᔐΫ98:y!9yrsΫk,] HՎěLՎz=5NՎjGbS=98qHUTs: ?t-^#Wq#ІJUC?~r '=t-t^YwΫ9Z qt^E,%jGs;9p4NUK>;*鼊s[y#,WZ3rpHՎ\ҵ@r n:%̕Ϋ9 ZY: Wq3Ձ\õNXyt0#>_[:,_ t^AۗZC8yՁđ->_AZ鼊 BG`όWq>80=Wq9x#>_quO:39zk>|u v竨Q>Ϋ8]Y@^WQ|>0H::Ϋu>Ձt^k@^8@^s竨\@"uU|7V|P5# ߴf@^Tӵ@ҞMUg`f|:}竈z鼊3;>_Eqg| 3UcDg_#y"s竨_+W'rݜΫx33ՉDEN 0t^EDM#>_A{|LWq!>_oQ鼊ՖAb9x_w|疮rg|c(;>_H`ψWQsՉ|#>_*r0W|:y:U`V|:9cf|:rNՉ|fw'9ȧu鼊ېΫ94Wq3Չ|N3?]K qTW'r|u"9ฑΫx 0+>_]AZ:z5/  *t`| ty).ÏB|ZZ3rMΫ 9E=Wٷs\ikǝomʾ}iUWٷКΫlĩ7>_e>UWٷogqkN |K70k?;>_e>h|ʾ*Q?i7|}?O)]k~|}UNJWٷOKUgWٷ3>_e&p-طRׂ}g*O~&^X3ώ3}4-y}'?'\ M5>_}GW߾շo̾շot^}Zo|Ǜk:}_Lo5շoϾ#>_ 7x9*5}_'z7R7a׿ ^^/їWٿ}|;!{wgԝu{FQwe|Ϩ;3=|lQwgԝu{Fٺ=|Ϩ;3-u{FQwgԝu[f;3=|Ϩ;2[wgԝu{FQwe|Ϩ;3=|lQwgԝu{Fٺ=|Ϩ;3w{FQwgԝu[f=|Ϩ;3η֝u{FQwgԝo;3=|Ϩ;2[wgԝu{FQwe=|Ϩ;3-u{FQwgԝu[f=|Ϩ;3η֝u{FQwgԝo;3=|Ϩ;1{wgԝu{FQwe|Ϩ;3=|lQwgԝu{Fٺ=|Ϩ;3-u{FQwgԝu[f;3=|Ϩ;2[wgԝu{FQwe|Ϩ;3=|lQwgԝu{Fٺ=|Ϩ;3w{FQwgԝu[f=|Ϩ;3η֝u{FQwgԝo;3=|Ϩ;2[wgԝu{FQwe+oQwgԝu{Fٺ=|Ϩ;3-u{FQwgԝu[f=|Ϩ;3η֝u{FQwgԝ;3=|Ϩ;2[wgԝu{FQwe|Ϩ;3=|lQwgԝu{Fٺ=|Ϩ;3-u{FQwgԝu[f=|Ϩ;3η֝u{FQwgԝo;3=|Ϩ;2[wgԝu{FQwc|Ϩ;3=|lQwgԝu{Fٺ=|Ϩ;3η֝u{FQwgԝo;3=|Ϩ;2[wgԝu{FQwe|Ϩ;3=|lQwgԝu{Fٺ=|Ϩ;3-u{FQwgԝu;f=|Ϩ;3η֝u{FQwgԝo;3=|Ϩ;2[wgԝu{FQwe|c?|"(Asw>? ?w]~?Q]/߸~~߾/_^Wپ}}{T׽ET}`>0uS]T}`3LuS]{Ϩ>0uLu=T}`>0uS]T}`3LuS]{Ϩ>0uLuuuS]|_t-uLu|ﺷuLu|S]T}`]Q}`>0u3LuS]{Ϩ>0uLu=T}`>0uS]T}`3LuS]{Ϩ>0uLu=T}`>0u꺷uLuS]Q}`>0uLu{F]T}`>0uuS]T׽guLuS]Q}`>0uLu{F]T}`>0uuS]T׽guLuS]Q}`>0uLu[fLuS]{Ϩ>0uLu=T}`>0uS]T}`3LuS]{Ϩ>0uLu=T}`>0uS]T}`3LuS]{Ϩ>0uLu-uS]T׽guLuS]Q}`>0uLu{F]T}`>0uuS]T׽guLuS]Q}`>0uLu{F]T}`>0uuS]T׽guLuS]ٺS]T}`3LuS]{Ϩ>0uLu{F]T}`>0uuS]T׽guLuS]Q}`>0uLu{F]T}`>0uuS]T׽guLuS]ٺS]T}`3LuS]{Ϩ>0uLu=T}`>0u-c׽>.c磙1o%|vˏ߾}mn[_>K7g{:??3?vw6мo~bp/˗UXlBdsoƪ! f~LbX.[1-ry!`>qa3$oGa5ҚO~:W<棝r<  O`i 6i ˞kI״skڹf57Ŗgf1|i[N[ ]gڣ'q3mR"3spi͓k-~>k隢hs}ipEӸp$KkFфEӸyq.q^\s;>f i|qh>E4P}@)&gOyܧ7P5Gܧ|q""@šqsi-i6'Sq}i"p$|}NjZ5s:RbOso@6 7O9 icri=i6 4y>m~?i6`Os'I1;N%2{>mޞOsGO|}JՖ)s|2|>e)s'S Nq2~2b']Sa)sEϕ<~>>eםiglKLt}ڙ>iv~>9I3N#iG>)0·l״7I״qN7,]5H ׌#d+ӎL#}]iv`וiG.>f*Gi\35\3*tM'׌cxA>Eq37e+S`)r_tqͨ5]\3⚑biʰq^\3JA)rk>E:]S>^9ȴkj<5o~>7׌P׌Ni WܧAܯ+S` rJP@0c}l>Ei+S#+SY?đ?Jt0ge}:(>Ai Os`ڧ9@ڧ9 `Mt0NOZ3soi nOs7tڧ9ftMxOs`S3χ9?<57225>eb}lm ׌s)s)s53S O'ʂa׌9x)s3S;-]STO9>eLj9xП)sGܧpM'sqds}:χl t2)k:9>icO`/k}:Gڧ4`Ht6yOq1OgHtvi5#S~>=>MHt"-iN }:]\q.55U-1\>Epܧj'S ?&S`[}đ}zsͣ}zs8kzsͭ}pgᚏ)r99hKt!nشO\0}yOQ4_a3\sH(Pi\sp<i1>]A>]A>\ #Q.h\tM(>\LrA'p53Si~$lO)/(b?rUϴOUrG\ɆgG\w؏D4#Q.hݸO~`m~$yb?傆,S ~@q2q}l(TҚH xE>ewG\~OH 7?>ebq2<[G\"#Q.FH ڸO}}<؏DorA;fG\hkJ=#Q.ԑ)ܪGڧ q~W.x؏^b?+<+#r3O_ ^i_oȕY RujԥͩaIė176kk<mq?t%9=aqn:.x#}y?@ΩJwZHX\p_W}yL?k?~>|{s(s\Bпvxr֧;CuE=|[gYwџw:eoǏ;(y^.L#k&RG&U'T˭ x"}F>}%H_uK>IOdT3>Uq~M_zG|u%O\W[h;Z4}͟-ZI ׳S'tD'>kSy}:M_>q\:M_sM^R/+L7=NO\yLusyGtɨO\K4}]$'ZͫOw9_ kQMͳO_hSbnG4};2y5iY ֵЇ('2|DzxMK[Od\NtsvPiu '\e2}}K \Od\>D.%'2W׸>quJ'5'2|~n[Zz"گ$kJ2}J>M_sfO>|D{Zz"v5'2|n{Zz"CWi ָ*{_st5i Mk\OdܯDO"GYJx5'2(k~>>בָ~ ϑָPΑָhZz"CE>Mk\Od<GZz"CָP/~DO}E>]FPKM]s+o=<+>wp=SD> ,qWΓqw;Om\OdɫiM9O}Kk\Odq>}Z~2^/q=}\Od^i Dڻ}\Odyoi 5'2|^GD}\Od^/q=S{Dq=S{Dzq=vq>}L4}*#z"çzi }lZz"çzi ~c9ڄ5'2tָP; <>'2|jHk\Od7DB}\Od ָߠu4QMk\GqZ:3<D}E>KDybau4Q7su4QqM\zI4}b5>O%qMW4:^/qM\jָ&.gu4Q>@Z:\?qĥzihnոhRu4Qhqv}\GnM_+:3qM\nhr~8y*fZ:3D>qyqg=5KĥihR_u4Q2>K}DD}>Kĥ{h_qD&.Kk\GwqD-;qĥ'&`D}՟ihǥ5Kĥzih^D}\G5KĥG@E`>ڽ}\GU|9O&.Kk\G5>6qM\hR{u4qy]>K&7^kָ&.}0mXS:;#:^/qM\jָ&|u4 }Z*yu4Q}\G23:^/qM?:qĥ?M_;:ٱih}\Gٺu4qA%Ѽd㸏hvqwB&.Kk\G5>(qMDHk\G&/qM=:'šĵu4qk~}qD&}lhZSΓqw'Q>8O}\G5}\Gug}\G5>2qM#>=qM\o׸h~>kĵzhhsu4q^Z:vLXKŰt4q^Z:ޯqDݪqĵdâKk\GÏ&Έ&Kk\G5qM\Hk\G>4>YqM ihZ{u4;u4qM_+:aɼ?qD-qĵ^ 5k Mk\Gm5:hvqDqx}9zi;'2^/qD5P{Ɲj׸^kָs"CaMk9Ds"CwM_smuǬ5POָ3^Zhu3:z}M^/qg4Q{ƝDwFC&:X{ƝDM\>+}W4qh?竏y_ߢ_,8B4&ֿޯh✢s,Q'^-_7}{3ȡ1Wbׯxs_}Cw,AX=_?ýϏt̅+9Wz`=ox۳֯}k LNN&'p29 9A039A039r`&'fr`&'fr7LNLNn ܐ39A039A0!'fr`&'fr`&'pCNLNLN 9A039A03939A039A0!'fr`&'fr`&'pCNLNLN 9A039A039r`&'fr`&'fr7LNLNn ܐ39A039A0!'fr`&'fr`&'Pr`&'fr`&'fr7LNLNn ܐ39A039A0!'fr`&'fr`&'pCNLNLN 9A039A039r`&'fr`&'fr7LNLNjVNLNLN 9A039A039r`&'fr`&'fr7LNLNn ܐ39A039A0!'fr`&'fr`&'pCNLNLN @ ܐ39A039A0!'fr`&'fr`&'pCNLNLN 9A039A039r`&'fr`&'fr7LNLNn ܐ39A039A0Y9A039A039r`&'fr`&'fr7LNLNn ܐ39A039A0!'fr`&'fr`&'pCNLNLN 9A039A039r`&'fr`&'fr5+'fr`&'fr`&'pCNLNLN 9A039A039r5?mr?TN^o{|s#ߟh__@~uJГ +nO2%Ġ^ߞe=sb}VbJ (!1PBbN ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCbN ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCbN ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCbN ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCbN ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCbN ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCbN ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J ܐ!1pCb@J 9׉,1˯L ~?'_$ߞL ǴK +^~9ڿ2bߞe=]}[VF(!#PBFܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCFܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCFܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCFܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCF@ܐ!#pCFܐ!#pCF@ܐ!#pCF@&#pCF MF 25+#ps 27djVF627dnԬm27dnܐYdnܐ!#P27ܐ!#pCFfenn!#pCF&#pCF MF 25+#pӿp# 25+#pӿ!#pCF@&#pCF MF 25+#ps 27djVF627dnԬm27dnܐYdnܐ!#037ܐ!#pCFfenn!#pCF@ܐ!#pCF@ܐ!#pCF@9/dMuFA5|Q˔_}9;-XK >i~;_~@ i(!-PBZ@ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ i!-pCZ iMZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i3;-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i3;-pCZ i5+-pCZ i5+-pCZ i5+-pCZ i5+-09҂~҂ii} +:)nn ~y~=O uzx?z=S_V;|D^M/.N"K.O@rkgH_<ӗ?_Dr?7uO.y}=nNj1bL]zFSW|K>^h=k_}]/Œko5ײ|M=M]s}FSz%|5?en}ͯ%M_5 {4uZԷ<M]yFS\^5w4}͵9k5dH4u&zuT0-q(SҚR +oiB 5we%b2}͵I5veh4u^DS\Oָ[5eSyW_:Mk5vk}S2Nk<W34qZ?#qZ?qdjH5W4qO)s<w{5?i=_GZnG_ski:XΑָ[5V`EwuS_Ѵ-Xq568eM_Hk[۫nW_'nnM]swuxi:X{z<qwuvyi:x<`wu6zi:X;z^Zn^/q^/q^:X{{^Z>qwu{Kkܽ'^/q^kָ{Kkܽ5`wuu}ܽ3^/q^kָ{Kkܽ5q^kָ{Kkܽ5`wu{Kkܽ~8ڄ5`Nkܽzָ{%q^?:X FZ7{?i:X7PZoPZ㺆5k~C8q]Ciq5ĥziq]Cq]C\jָ!.Kk\}#5k>(%q]CW4㺆^/q]C\jָ!.gu Q>k@Z㺆\?q5ĥzinոRu Qq5v}\3㺆oq5Dir}\#5߯q5ĥzivq5D5ĥiRߤ5Dv3q]C\jָ!.UOk\5kq]C\꫞ָ!zָ!q]C\jָ!.ZE!@u q^Z㺆!jى!.Kk\{!Lk\!.Kk\5kzq]C\jָ!.Kk\55kڽ}\L|k>>kK5ĥzi^}\'㺆^/q]C\jָ!.adz^Z㺆~u QwFu q^Z㺆^/q]Cԋu Jk\5kzq]C\jָ!jq]C\ϸҟƉq]C\jָ!.Fk^Z㺆q5ĥzivq5D}>kq]C\jָ!.Kk\}QZ㺆O5kkmB5Dme>kkKk\{!}iXSbָ!}0@4}️q5ĵMkJ>V45k5ĵzivq5Dq5ĵziϠLk\v!Kk\q]C\kָ!D|}\݁5kk5ĵdS 5kk5ĵzinոqX2)5k}\ug}\5kk5D}s!ug5kkbM]siZwFZ㺆^/q]C?q]Cָ!ug5kkb̫q]C"q]C\rZ㺆 Ҵu QV>k!jq]Cԝq]C\kָ!Kk\5kz!qk5ĵzquziZX5ĵp5kk݌iYE\ۦdzu Q/>!jָx>!jָx=>!jָ^Zzi;kyz^kָ^Zjk}!qUCq9|35^CS5(/jW^CD}xշu~1PǙ6z|{~gY_?]RkWE+W9}OB}h׵ۥwtJRˮs SЬV@>ݽQVN],GGǑѯ|:|7g#k8{}{{zTܜ)t|g6Wxn3N7U]_½mFyO'A|mY/=mƭ^C}rD6OsI+GzO~y]}3cWS[d>}R󒞧 <{dt{q'+}ҽx'==|Γnykuq`>)~n<>IOv;_#Isn>`>]}/twoQtwS}JէF |'ݫ'yj->O]s>^} u{zۧ5:O/ ާ>t*xt2Xej̧O>y͸GǺ]+ܫf?y)n>}j=cf<.N]2>Us)}M0>un3h|½mFzuQ7->ѧ_=mF;½mYI5wzZ{Cj pv/+>ϧ'pnj|#\+ݫ>Yj̧<=V`n=M9zqy#c/{8:xԿ`VէY$i^kWk4<>:s|M_KjzJjG0=OGV<ӽZQ$^u|k^ɼ~=V೏fIj]IxezL]_d'S:ݟim|=l'6yo5s0>MS`U':|$S\V$ZZG)Kj|OԿv-OruCejKj>ɽlzLe0>O]<),w2nj_UCn'ak׃?o'2wzQz=l~z,cZkIyIjyOZ_>#7qIj['}GUNZ˼} _}Gyu0u3c'y:z5)y`Evz~<}wy]6^zij|t:=>O]I{GZ_9t:z}G-s=WJj'}o^R5`=One9On-On}vzK{أn;z'9Zx$G_Kǎ>G{M|>mqJg@pwz<}Fg!Uy>V>g}>>8??տxu_*$G_byO=qF=֭~>ѭ~MߞgGOY<3Ink'9̚ڨIy6PYg?5j{gּo>r3kgYӇɅ{y=˸I}fmƥy5cf+kzیKGfyL[Y]Y{ی|p>VII5ی͸^>Iw݉^V}?6ǻ~sMtQ+5OmFw}n3.wYf\ӽz6Ozl3.W;Or'9ی~0>Owhͨ[>cgq{=$gqğm=5cgq}x6qğmF8>fԷ>fԋʹ=یzёͨ*Or*OrOYfd7ݓ;ܫgoc6f<.L5832zfcmFڌM~?2?),]$'Ǹ~ͤxTџ"}hE qW6jSt+mFQQkgYk}JQF֌ +%̨PŒ +%̨PŒ +#kFfT(aFfT(aF= 3*0 3*0B͚QnQnQfͨpÌ +7̨pÌ +7̨PfTaFfTaFfTY3*0 3*0 3*ԬnQnQj֌ +7̨pÌ +7̨pÌ +5kFfTaFfTaF5 3*0 3*0B͚QnQnQafϨpÌ +7̨pÌ +7̨PfTaFfTaFfTY3*0 3*0 3*ԬnQnQj֌ +7̨pÌ +7̨pÌ +5kFfTaFfTaF5 3*0 3*0B͚QnQnQfͨpÌ +7̨pÌ +7̨PfTaFfTaFfT3*0 3*0 3*ԬnQnQj֌ +7̨pÌ +7̨pÌ +5kFfTaFfTaF5 3*0 3*0B͚QnQnQfͨpÌ +7̨pÌ +7̨PfTaFfTaF5 3*0 3*0B͚QnQnQafϨpÌ +7̨pÌ +7̨PfTaFfTaFfTY3*0 3*0 3*ԬnQnQj֌ +7̨pÌ +7̨pÌ +5kFfTaFfTaF5 3*0 3*0B͚QnQnQfͨpÌ +7̨pÌ +7̨PfTaFfTaFfT3*0 3*0 3*ԬnQnQj֌ +7̨pÌ +7̨pÌ +5kFfTaFfTaF5 3*0 3*0B͚QnQnQfͨpÌ +7̨pÌ +7̨PfTaFfTaFfTY3*0 3*0 3*ԬnQnQf +7̨pÌ +7̨pÌ +5kFfTaFfTaF5 3*0 3*0B͚QnQnQfͨpÌ +7̨pÌ +7̨PfTaFfTaFfTY3*0 3*0 3*ԬnQnQj֌ +7̨pÌ +7̨pÌ +5kFfTaFfTaF= 3*0 3*0B͚QnQnQfͨpÌ +7̨pÌ +7̨PfTaFfTaFfTY3*qw,;A?'Ψ<߼_~̦yYg?/'rOc~/ӎ$e=e=]~;p" 'I8HB $L$d" 'I(!p2$L$d" %+f"`&f"`&pC$DL$DL$H"$H"$H D0I3D0I3"`&f"`&f" 7DL$DL$Dn$H"$H"$I3D0I3D0I!f"`&f"`&pC$DL$DL$fEL$DL$Dn$H"$H"$I3D0I3D0I!f"`&f"`&pC$DL$DL$H"$H"$H D0I3D0I3"`&f"`&f" 7DL$DL$Dn$H"$H"$ԬH"$H"$H D0I3D0I3"`&f"`&f" 7DL$DL$Dn$H"$H"$I3D0I3D0I!f"`&f"`&pC$DL$Dn$H"$H"$I3D0I3D0IYD0I3D0I3H"$H"$H D0I3D0I3"`&f"`&f" 7DL$DL$Dn$H"$H"$I3D0I3D0I!f"`&f"`&pC$DL$DL$H"$H"$HB͊$H"$H"$/|EL$DL$Dn$H"$H"$I3D0I3D0I!f"`&f"`&pC$DL$DL$H"$H"$H D0I3D0I3"`&f"`&f" 7DL$DL$DjV$DL$DL$:D0I3D0I3"`&f"`&f" 7DL$DL$Dn$H"$H"$I3D0I3D0I!f"`&f"`&pC$DL$DL$H"$H"$H D0I3D0I3I3D0I3D0IN$DL$DL$H"$H"$H D0I3D0I3" 5 0B$$Ǭ^:8^$=I|'Fa+|o#F0ZgYFk?uJ#FYa%J#FYa%J#Fa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#Fa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#Fa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#FYa7n#Ԭ0 a7n#Ԭ0 a7n#0 a7n#Ov~n#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCafn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCafn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCfn#F!pCafn#F!pCfn#F!pCfn#F!pCfn#F!pCff0{@0B?Fo/aį0By\Ǐ8Gۏ ?@%H@yc> %J$@B  %J$@B  %J$@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7n$Ԭ@  7jV @  7jV @  7fv @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7fv @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7fv @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7jV @  7fv @  7jV @  7jV @  7jV @  7jV af_$cnH|?LH_c yu9FG z{R6_Db?R| !x[Qxyx?z;_.#PB +!B(!PB +!B(!PB!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pC!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pC!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCB +!B!pCfn!B!pCfn!B!pCafn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCafn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCafn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCfn!B!pCafn!B!pCfn!B!pCfn!B!pCfn!B!pCffp !ğ,x?"W +3B/9<礈/k3/!e=e=ӝ~lB'B8B ! !LdB'B(!p2! !LdB%+fB`&fB`&pC̄L̄L" !" ! !D0B3!D0B3!B`&fB`&fB7L̄L̄n!" !" !B3!D0B3!D0B!fB`&fB`&pC̄L̄LfL̄L̄n!" !" !B3!D0B3!D0B!fB`&fB`&pC̄L̄L" !" ! !D0B3!D0B3!B`&fB`&fB7L̄L̄n!" !" !Ԭ" !" ! !D0B3!D0B3!B`&fB`&fB7L̄L̄n!" !" !B3!D0B3!D0B!fB`&fB`&pC̄L̄n!" !" !B3!D0B3!D0BY!D0B3!D0B3!B`&fB`&fB7 !" !" !B3!D0B3!D0B!fB`&fB`&pC̄L̄L" !" ! !D0B3!D0B3!B`&fB`&fB7L̄L̄jV̄L̄L" !" !mB`&fB`&fB7L̄L̄n!" !" !B3!D0B3!D0B!fB`&fB`&pC̄L̄L" !" ! !D0B3!D0B3!B3!D0B3!D0B!fB`&fB`&ps" !" ! !D0B3!D0B3!B`&fB`&fB7L̄L̄n!" !" !B3!D0B3!D0B!fB`&fB`&pC̄L̄LfL̄L̄n!" !" !&fB`&fB`&pC̄L̄LB!sOeߏ_?{!/)<BD?)x_nQ/7_,ߢEx,~;(B Q#+PB(B Q#+PB(B Q#;pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q3;pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q3;pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( Q5+pC( QE!pC( QE!pC( QE!pC( QE!pC( QQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EQ7Dn"EYQ7Dn"EYQ7Dn"EYQ7Dn"EYQ?q"cQD-_">3E뒣oEB|.76Bu32B% !BY!B%J^B(!0B%J!&PBadn!ByMB +!B!p !B!pC5!B5+pCkB7jV !ׄn!Ԭ !B7 !BY!B7n^B!PB7n!B!PB7n!B!PB7n!B!0C7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!B!0C7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!B!PB7n!BY!B7n!BY!B7n!B!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!B!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!B!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!BY!B7n!B!B7n!BY!B7n!BY!B7n!BY!B7n!BY!??#B !s?3B%ߞ!_1ğNasO~bgί׮%m=/t_vb"I&f D0SM3D0M3ʉ`&fډ`&f 7+Hh&Hh +&"("(" BHhRHhb)")")*"Hh&Hh&" +"I+" ⊄Hh򊄦Hh(,"i,","Hh:&HhJ&"-"- +."I.".HhHh‹"i/"/" &Hh +&Hh0 +#0# 1HhRHhb#1 #)2$# &Hh&Hh32#I36#3Hh򌄦HhpHh"Hh24P#)5T#i5"Hhj&Hhz&b#I6f#6j# HhHhҍh7x#7|#7"Hh +&Hh&#8# 9HhRHhb#9#):j:#:#:"Hhʎ&Hhڎ&#;# <# Hh"Hh2<#)=#i="Hhj&Hhz&#I>#># HhHhҏh?#?#?"Ih +&Ih&q*&Ih:&IhJHA$A$AIhIh ($B,$B0$ ʐ& Ihڐ&IhꐀC>$ DB$IDIh"Ih2 P$)ET$iEX$ j&Ihz&IhHFf$Fj$Fn$ Gr$IGv$ ⑄Ih򑄦Ih(H$iH$H"#Ih:&$IhJ&% $I$I$ (Ih)IhJ$J$)K"-Ihڒ&.Ihꒄ&/ $ L$IL$ "2Ih23IhBG4IhR5Ihb6 $M$)N$ &:Ih&;IhO$IO$O>qi 3/'S_O_=|O +ϯG=#ߞߎz?a^`[ٽ]%U_7W?^߯ +]:v9 +~D3eB1߸飃v^iŏϯ[/6__Ws>~︰^߯ ߫c {~ARg?1䂀 endstream endobj -449 0 obj +246 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 448 0 R +/Contents 245 0 R /Resources 4 0 R -/Annots [ 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R ] +/Annots [ 247 0 R 248 0 R 249 0 R 250 0 R 251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R 301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -450 0 obj +247 0 obj << /Type /Annot /Subtype /Link @@ -5818,21 +3636,21 @@ endobj /BS << /W 0 >> -/Dest (Code/Zone/:zonecs) +/Dest (CahierDesCharges/:realisation) >> endobj -451 0 obj +248 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 765.503622 82.786359 751.103622 ] +/Rect [ 55.386457 765.503622 77.060285 751.103622 ] /BS << /W 0 >> -/Dest (Code/Zone/:zonecs) +/Dest (CahierDesCharges/:realisation) >> endobj -452 0 obj +249 0 obj << /Type /Annot /Subtype /Link @@ -5840,10 +3658,10 @@ endobj /BS << /W 0 >> -/Dest (Code/Zone/:zonecs) +/Dest (CahierDesCharges/:realisation) >> endobj -453 0 obj +250 0 obj << /Type /Annot /Subtype /Link @@ -5851,21 +3669,21 @@ endobj /BS << /W 0 >> -/Dest (Code/DataWrapper/:datawrappercs) +/Dest (CahierDesCharges/:cas-dutilisation) >> endobj -454 0 obj +251 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 744.833622 82.786359 730.433622 ] +/Rect [ 55.386457 744.833622 77.060285 730.433622 ] /BS << /W 0 >> -/Dest (Code/DataWrapper/:datawrappercs) +/Dest (CahierDesCharges/:cas-dutilisation) >> endobj -455 0 obj +252 0 obj << /Type /Annot /Subtype /Link @@ -5873,10 +3691,10 @@ endobj /BS << /W 0 >> -/Dest (Code/DataWrapper/:datawrappercs) +/Dest (CahierDesCharges/:cas-dutilisation) >> endobj -456 0 obj +253 0 obj << /Type /Annot /Subtype /Link @@ -5884,21 +3702,21 @@ endobj /BS << /W 0 >> -/Dest (Code/DriverDrsWindow/:driverdrswindowcs) +/Dest (CahierDesCharges/:difficultes-techniques) >> endobj -457 0 obj +254 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 724.163622 82.786359 709.763622 ] +/Rect [ 55.386457 724.163622 77.060285 709.763622 ] /BS << /W 0 >> -/Dest (Code/DriverDrsWindow/:driverdrswindowcs) +/Dest (CahierDesCharges/:difficultes-techniques) >> endobj -458 0 obj +255 0 obj << /Type /Annot /Subtype /Link @@ -5906,32 +3724,32 @@ endobj /BS << /W 0 >> -/Dest (Code/DriverDrsWindow/:driverdrswindowcs) +/Dest (CahierDesCharges/:difficultes-techniques) >> endobj -459 0 obj +256 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 709.013622 555.889134 688.343622 ] +/Rect [ 47.386457 709.013622 555.889134 688.343622 ] /BS << /W 0 >> -/Dest (Code/DriverLapTimeWindow/:driverlaptimewindowcs) +/Dest (ManuelUtilisateur/:manuel-utilisateur) >> endobj -460 0 obj +257 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 703.493622 82.786359 689.093622 ] +/Rect [ 47.386457 703.493622 63.334211 689.093622 ] /BS << /W 0 >> -/Dest (Code/DriverLapTimeWindow/:driverlaptimewindowcs) +/Dest (ManuelUtilisateur/:manuel-utilisateur) >> endobj -461 0 obj +258 0 obj << /Type /Annot /Subtype /Link @@ -5939,10 +3757,10 @@ endobj /BS << /W 0 >> -/Dest (Code/DriverLapTimeWindow/:driverlaptimewindowcs) +/Dest (ManuelUtilisateur/:manuel-utilisateur) >> endobj -462 0 obj +259 0 obj << /Type /Annot /Subtype /Link @@ -5950,21 +3768,21 @@ endobj /BS << /W 0 >> -/Dest (Code/DriverPositionWindow/:driverpositionwindowcs) +/Dest (ManuelUtilisateur/:installation) >> endobj -463 0 obj +260 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 682.823622 82.786359 668.423622 ] +/Rect [ 55.386457 682.823622 77.060285 668.423622 ] /BS << /W 0 >> -/Dest (Code/DriverPositionWindow/:driverpositionwindowcs) +/Dest (ManuelUtilisateur/:installation) >> endobj -464 0 obj +261 0 obj << /Type /Annot /Subtype /Link @@ -5972,10 +3790,10 @@ endobj /BS << /W 0 >> -/Dest (Code/DriverPositionWindow/:driverpositionwindowcs) +/Dest (ManuelUtilisateur/:installation) >> endobj -465 0 obj +262 0 obj << /Type /Annot /Subtype /Link @@ -5983,21 +3801,21 @@ endobj /BS << /W 0 >> -/Dest (Code/DriverTyresWindow/:drivertyreswindowcs) +/Dest (ManuelUtilisateur/:a-quoi-sert-lapp) >> endobj -466 0 obj +263 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 662.153622 82.786359 647.753622 ] +/Rect [ 55.386457 662.153622 77.060285 647.753622 ] /BS << /W 0 >> -/Dest (Code/DriverTyresWindow/:drivertyreswindowcs) +/Dest (ManuelUtilisateur/:a-quoi-sert-lapp) >> endobj -467 0 obj +264 0 obj << /Type /Annot /Subtype /Link @@ -6005,10 +3823,10 @@ endobj /BS << /W 0 >> -/Dest (Code/DriverTyresWindow/:drivertyreswindowcs) +/Dest (ManuelUtilisateur/:a-quoi-sert-lapp) >> endobj -468 0 obj +265 0 obj << /Type /Annot /Subtype /Link @@ -6016,21 +3834,21 @@ endobj /BS << /W 0 >> -/Dest (Code/OcrImage/:ocrimagecs) +/Dest (ManuelUtilisateur/:utilisation-simple) >> endobj -469 0 obj +266 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 641.483622 82.786359 627.083622 ] +/Rect [ 55.386457 641.483622 77.060285 627.083622 ] /BS << /W 0 >> -/Dest (Code/OcrImage/:ocrimagecs) +/Dest (ManuelUtilisateur/:utilisation-simple) >> endobj -470 0 obj +267 0 obj << /Type /Annot /Subtype /Link @@ -6038,32 +3856,32 @@ endobj /BS << /W 0 >> -/Dest (Code/OcrImage/:ocrimagecs) +/Dest (ManuelUtilisateur/:utilisation-simple) >> endobj -471 0 obj +268 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 626.333622 555.889134 605.663622 ] +/Rect [ 63.386457 626.333622 555.889134 605.663622 ] /BS << /W 0 >> -/Dest (Code/Reader/:readercs) +/Dest (ManuelUtilisateur/:recuperer-le-lien-vers-le-flux) >> endobj -472 0 obj +269 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 620.813622 82.786359 606.413622 ] +/Rect [ 63.386457 620.813622 93.647199 606.413622 ] /BS << /W 0 >> -/Dest (Code/Reader/:readercs) +/Dest (ManuelUtilisateur/:recuperer-le-lien-vers-le-flux) >> endobj -473 0 obj +270 0 obj << /Type /Annot /Subtype /Link @@ -6071,32 +3889,32 @@ endobj /BS << /W 0 >> -/Dest (Code/Reader/:readercs) +/Dest (ManuelUtilisateur/:recuperer-le-lien-vers-le-flux) >> endobj -474 0 obj +271 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 605.663622 555.889134 584.993622 ] +/Rect [ 63.386457 605.663622 555.889134 584.993622 ] /BS << /W 0 >> -/Dest (Code/Settings/:settingscs) +/Dest (ManuelUtilisateur/:boutons) >> endobj -475 0 obj +272 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 600.143622 82.786359 585.743622 ] +/Rect [ 63.386457 600.143622 93.647199 585.743622 ] /BS << /W 0 >> -/Dest (Code/Settings/:settingscs) +/Dest (ManuelUtilisateur/:boutons) >> endobj -476 0 obj +273 0 obj << /Type /Annot /Subtype /Link @@ -6104,10 +3922,10 @@ endobj /BS << /W 0 >> -/Dest (Code/Settings/:settingscs) +/Dest (ManuelUtilisateur/:boutons) >> endobj -477 0 obj +274 0 obj << /Type /Annot /Subtype /Link @@ -6115,21 +3933,21 @@ endobj /BS << /W 0 >> -/Dest (Code/Window/:windowcs) +/Dest (ManuelUtilisateur/:calibration) >> endobj -478 0 obj +275 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 579.473622 82.786359 565.073622 ] +/Rect [ 55.386457 579.473622 77.060285 565.073622 ] /BS << /W 0 >> -/Dest (Code/Window/:windowcs) +/Dest (ManuelUtilisateur/:calibration) >> endobj -479 0 obj +276 0 obj << /Type /Annot /Subtype /Link @@ -6137,32 +3955,32 @@ endobj /BS << /W 0 >> -/Dest (Code/Window/:windowcs) +/Dest (ManuelUtilisateur/:calibration) >> endobj -480 0 obj +277 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 564.323622 555.889134 543.653622 ] +/Rect [ 63.386457 564.323622 555.889134 543.653622 ] /BS << /W 0 >> -/Dest (Code/recoverCookiesCSV/:recovercookiescsvpy) +/Dest (ManuelUtilisateur/:pourquoi-calibrer-lapplication-et-creer-un-preset) >> endobj -481 0 obj +278 0 obj << /Type /Annot /Subtype /Link -/Rect [ 55.386457 558.803622 82.786359 544.403622 ] +/Rect [ 63.386457 558.803622 93.647199 544.403622 ] /BS << /W 0 >> -/Dest (Code/recoverCookiesCSV/:recovercookiescsvpy) +/Dest (ManuelUtilisateur/:pourquoi-calibrer-lapplication-et-creer-un-preset) >> endobj -482 0 obj +279 0 obj << /Type /Annot /Subtype /Link @@ -6170,13 +3988,2634 @@ endobj /BS << /W 0 >> -/Dest (Code/recoverCookiesCSV/:recovercookiescsvpy) +/Dest (ManuelUtilisateur/:pourquoi-calibrer-lapplication-et-creer-un-preset) +>> +endobj +280 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 543.653622 555.889134 522.983622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:comment-creer-son-preset) +>> +endobj +281 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 538.133622 93.647199 523.733622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:comment-creer-son-preset) +>> +endobj +282 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 538.133622 555.889134 523.733622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:comment-creer-son-preset) +>> +endobj +283 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 71.386457 522.983622 555.889134 502.313622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:creation-des-zones-et-des-windows) +>> +endobj +284 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 517.463622 555.889134 503.063622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:creation-des-zones-et-des-windows) +>> +endobj +285 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 71.386457 502.313622 555.889134 481.643622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:ajout-du-nom-des-pilotes) +>> +endobj +286 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 496.793622 555.889134 482.393622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:ajout-du-nom-des-pilotes) +>> +endobj +287 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 71.386457 481.643622 555.889134 460.973622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:sauvegarder-le-nouveau-preset) +>> +endobj +288 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 476.123622 555.889134 461.723622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:sauvegarder-le-nouveau-preset) +>> +endobj +289 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 460.973622 555.889134 440.303622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:load-un-preset-existant) +>> +endobj +290 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 455.453622 93.647199 441.053622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:load-un-preset-existant) +>> +endobj +291 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 455.453622 555.889134 441.053622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:load-un-preset-existant) +>> +endobj +292 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 440.303622 555.889134 419.633622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:comprendre-les-donnees) +>> +endobj +293 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 434.783622 77.060285 420.383622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:comprendre-les-donnees) +>> +endobj +294 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 434.783622 555.889134 420.383622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:comprendre-les-donnees) +>> +endobj +295 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 419.633622 555.889134 398.963622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:overtakes) +>> +endobj +296 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 414.113622 93.647199 399.713622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:overtakes) +>> +endobj +297 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 414.113622 555.889134 399.713622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:overtakes) +>> +endobj +298 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 398.963622 555.889134 378.293622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:last-five-laps) +>> +endobj +299 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 393.443622 93.647199 379.043622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:last-five-laps) +>> +endobj +300 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 393.443622 555.889134 379.043622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:last-five-laps) +>> +endobj +301 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 378.293622 555.889134 357.623622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:battles) +>> +endobj +302 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 372.773622 93.647199 358.373622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:battles) +>> +endobj +303 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 372.773622 555.889134 358.373622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:battles) +>> +endobj +304 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 357.623622 555.889134 336.953622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:driver-infos) +>> +endobj +305 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 352.103622 93.647199 337.703622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:driver-infos) +>> +endobj +306 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 352.103622 555.889134 337.703622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:driver-infos) +>> +endobj +307 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 336.953622 555.889134 316.283622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:live-ranking) +>> +endobj +308 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 63.386457 331.433622 93.647199 317.033622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:live-ranking) +>> +endobj +309 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 331.433622 555.889134 317.033622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:live-ranking) +>> +endobj +310 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 316.283622 555.889134 295.613622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:erreurs) +>> +endobj +311 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 310.763622 77.060285 296.363622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:erreurs) +>> +endobj +312 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 310.763622 555.889134 296.363622 ] +/BS << +/W 0 +>> +/Dest (ManuelUtilisateur/:erreurs) +>> +endobj +313 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 47.386457 295.613622 555.889134 274.943622 ] +/BS << +/W 0 +>> +/Dest (jdb/:journal-de-bord) +>> +endobj +314 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 47.386457 290.093622 63.334211 275.693622 ] +/BS << +/W 0 +>> +/Dest (jdb/:journal-de-bord) +>> +endobj +315 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 290.093622 555.889134 275.693622 ] +/BS << +/W 0 +>> +/Dest (jdb/:journal-de-bord) +>> +endobj +316 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 274.943622 555.889134 254.273622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-29-mars-2023) +>> +endobj +317 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 269.423622 77.060285 255.023622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-29-mars-2023) +>> +endobj +318 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 269.423622 555.889134 255.023622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-29-mars-2023) +>> +endobj +319 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 254.273622 555.889134 233.603622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-30-mars-2023) +>> +endobj +320 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 248.753622 77.060285 234.353622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-30-mars-2023) +>> +endobj +321 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 248.753622 555.889134 234.353622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-30-mars-2023) +>> +endobj +322 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 233.603622 555.889134 212.933622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-31032023) +>> +endobj +323 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 228.083622 77.060285 213.683622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-31032023) +>> +endobj +324 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 228.083622 555.889134 213.683622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-31032023) +>> +endobj +325 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 212.933622 555.889134 192.263622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-3-avril) +>> +endobj +326 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 207.413622 77.060285 193.013622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-3-avril) +>> +endobj +327 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 207.413622 555.889134 193.013622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-3-avril) +>> +endobj +328 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 192.263622 555.889134 171.593622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-4-avril) +>> +endobj +329 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 186.743622 77.060285 172.343622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-4-avril) +>> +endobj +330 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 186.743622 555.889134 172.343622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-4-avril) +>> +endobj +331 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 171.593622 555.889134 150.923622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-5-avril) +>> +endobj +332 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 166.073622 77.060285 151.673622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-5-avril) +>> +endobj +333 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 166.073622 555.889134 151.673622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-5-avril) +>> +endobj +334 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 150.923622 555.889134 130.253622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-6-avril) +>> +endobj +335 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 145.403622 77.060285 131.003622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-6-avril) +>> +endobj +336 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 145.403622 555.889134 131.003622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-6-avril) +>> +endobj +337 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 130.253622 555.889134 109.583622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-6-avril-2023) +>> +endobj +338 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 124.733622 77.060285 110.333622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-6-avril-2023) +>> +endobj +339 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 124.733622 555.889134 110.333622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-6-avril-2023) +>> +endobj +340 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 109.583622 555.889134 88.913622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vacances) +>> +endobj +341 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 104.063622 77.060285 89.663622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vacances) +>> +endobj +342 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 104.063622 555.889134 89.663622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vacances) +>> +endobj +343 0 obj +<< +/Filter /FlateDecode +/Length 39429 +>> +stream +xMdW^92k@!uOHA=ȬRj%?8wmzdH^[qDoI?z|?O/ixox|yn~>//_O//C?vop}q|y^k^qye\a?ft;!OJ^sK_ҒJɓzfn%븷~o:zdvd~=y>>O%z|Z_ڬߏǽ6Q}Y}]R>y>=Y}Ruyfyƿ^Kx>.5ؚuDZ~[f|f|Js3?^3?_3^ڬ3?O6z/'Vufy}{fzfz=Jsg~К}\ut:k:+}unYg~]O3>*g~X;z\;ٷ~m[ֹM~Fy8v^up[~5sn>e+y\|[7X w^S𵿖:Bθ5_k6Oh5ǥ͸˚f|w93LGqx5ϣ͸yu^_o͸˚u6.kgh3n=96-Vs=ڌ[jnGq>h3rg~\ی[/լ6̯kqWym38_ی9kq5rm3nzm3n}ܮm]kq>ڣZsg^@m՚uwYs6.kg͸˚^ڌ[ jև>feYg^^q=׊fewsp-ym]\[^q=o]\{^q=עfewspzm]\^q{]͸cw9v6=׮fܱ^cw9v6=׮fܱڌ;\^qǞkk3spzm{]͸cw9=spzm{]͸cw9v6=׮fܱڌ;\^qǞkk3spzm{>u;\^qǞkk3sp-!m{/ی;\_w9pi3sp 6=h3sp}k3sp&l3spڌ;\@mƭ/B?ی;KiQyY|{x>qsQ{g~=x3]Zuw֙׮fμv6㮧uw=3w=3w=3?w=3?w=3w=3]͸yyzmƭWj.u^֙bfuw3w3<w=u̯]uw=֙׮fYͥq:ڌ^י׳f|{ ^QV{{{μ6/z\my=m]Yo3zZ}Vu[zQcYcU랃kk3ڌ9v6{]͸랃kk3V랃kk3ڌ9v6{]͸랃kk3spzm\^q=׮>q=׮fmwspzm\^q=׮fmwspzm\^q=׮fmǭq=׮fmwspzm\^q=׮fmwspzm\^q=׮fmq=׮fmwspzm\^q=׮fmwspzm\^q=׮fm׽q=׮fmwspzmq>q>q>qks_ͫq5kk3yzm\/պ<]͸͸uVu^uQuYXUh3y2ڌ9~=n}9qkY͵q>q>q>q<ռwsp}f}rq=m\_wsv{}wspzm\^q=׮f}wspzm\^q=׮Wgܞkk3fc͸Ǟfcspbspڌ{9nfcspzmƽ}ڌ{9=ڌ{9v6{]͸Ǟk׻fspzm=\^q=׮fcsy{܇owǗc^:~^/ў2o}wb \c?7_]We}Q?㿮O?m15,Oߟ_/~}?c'|qrcl`^G_sa}b?]qS?~OjJf/o>HpX_pye\H$x" DB%Hh" DB%Hh" DB%Hx" D6Hx" D67 o @$Hh37 o @$Hh37 o @$Hh37 o @$Hh37 o @$Hh37 o @$Hh37 o @$Hh37 o @$HX37 o @$Hh37 o @$HhsHx" D6Hx" D6Hx" D6Hx" D6Hx" D6Hx" D6Hx" D6Hx" D5Hx" D6Hx" D67 o @$Hh37 o @$Hh37 o @$Hh37 o @$Hh37 o @$Hh37 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$D7 o @$Dš o.𹑐!$I|v$֟I[U\׏zo$id?M!=rye\@& M@ $ HB& M@ $ HB& M@L$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@L$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@L$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H›{7 m$ H›{7 m$ H›{7 k&$ H›{7 m$ H›{7 m$ H›{7 m$ H›{7 m$ H›{7 m$ H›{7 m$ H›{7 m$ H›{7 m$ H›{7 m$ H›qIX37 o@uHB$Ix$ HB$Ix$ HB$Ix$ HB$=߁$0$>ɿIUĻ{tӿ!O;를!忿|.Wx+-“`O!4Cx I0'Ch$“`O!< d`C&4  Q`C&4ހ!J Q`C&0Di!J Q`Cx(M0Di!J Q`o (M0Di!J 4 (M0Di!C&4 (M07`C&4  Q`C&4 Q`C&4ހ!J Q`C&0Di!J Q`Cx(M0Di!J Q`o (M0Di!J 4 (M0Di!C&4 (M07`C&4  Q`C&4ހ!J Q`C&B!J Q`C&0Di!J Q`Cx(M0Di!J Q`o (M0Di!J 4 (M0Di!C&4 (M07`C&4  Q`C&0Di!J Q`Cx(M0Di!J Q`m(M0Di!J Q`o (M0Di!J 4 (M0Di!C&4 (M07`C&4  Q`C&4ހ!J Q`C&0Di!J Q`Cx(M0Di!J Q`o (M0Di!J  (M0Di!J 4 (M0Di!C&4 (M07`C&4  Q`C&4ހ!J Q`C&0Di!J Q`Cx(M0Di!J Q`o (M0Di!J 4 (M0Di!4 (M0Di!C&4 (M07`C&4  Q`C&4ހ!J Q`C&0Di!J Q`Cx(M0Di!J Q`o (M0Di!J 4 (M0Di!C&4 (M06C&4 (M07`C&4  Q`C&4ހ!J Q`C&06_|v0kw`N '?!k?v=oc_NHb,o4C\~$<2D<$ H’$4Ih$ H’$4Ih$ H’$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ Hš$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ Hš$Ix$ HB$Ix$ HB$Ix$ HB$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m |$$QHb xI|z$7$^G?+8% ķ_Ohb{i{&M/<2|؇W$hBЄ& K4 hBЄ& K4 hBЄ& K&4 hЄ7 m4 hЄ7 m4 hЄ7 mЄ7 o@ހ&Mh3Є7 o@ހ&Mh3Є7 o@ހ&Mh3Є7 o@ހ&Mh3Є7 o@ހ&Mh3Є7 o@ހ&Mh3Є7 o@ހ&MX3ф7 o@ހ&Mh3Є7 o@ހ&Mh3Є7 o@ހ&Mhs&Mx4 hB&Mx4 hB&Mx4 hB&Mx4 hB&Mx4 hB&Mx4 hB&Mx4 hš&Mx4 hB&Mx4 hB&Mx4 hB4 hЄ7 o@ 4 hЄ7 o@ 4 hЄ7 o@ 4 hЄ7 o@ 4 hЄ7 m4 hЄ7 m4 hЄ7 k&4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 k&4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 k&4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 k&4 hЄ7 m4 hЄ7 m4 hЄ7 m4 hЄ7 m |vr=}N4'x:xww]%~A_{^?CXoO;w(b}˸Uc^qM@",(BP&M@",(BP&M@",(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@ aWiu(Oӊ"$Nw Eeq.˸U2 $(“M@ExIP'A"< $(“O"4(4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP6E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QqE&(4Aހ"Jx=nE&(PDiPDi"JQo@9~C (MPDi"E E&(4A Q7QE&(PDiPDi"JQo@ (MPDi"E&(4A (MP7E&(4A fE&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(B"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEh3PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"Eh{E|;Q(X=n@}(OSE"6x?ׯՆov_Eb_{CǟR㯏~iˡ|)Ryq#R &@ +M H B &@ +M H B &@ +MLH  7@ +o H  7@ +o H  7@ +o H  7@ +o H  7@ +o H  7@ +o H  7@ +o H  7@ +o HH  7@ +mH  5RxsRxH B)9)RxH̀)Rxf@ +o@ +o)Rh3 7G 7@ +o)›# 7@ +o HH  7@ +mH  6RxsRxH B)9)RxHä́UZ )Rxf@ +o_u 7@ +mH  6RxsRxH B+›# 7@ +o HH  7@ +mH  6RxH B)RxH B)RxH š )RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH š )RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH š )RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH B)RxH š )RxH B)RxH B)RxH B)RxH B)}C +x[!g⯧) R:`b7\1m#=ߞwH5._5<$ H’$4Ih$ H’$4Ih$ H’$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB+H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ Hš$Ix$ HB$Ix$ HB$Ix$ HB$Ix$ HB+H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ $ H7 o@ $ H7 o@L$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@L$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@L$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@L$ H7 o@ $ H7 o@ $ H7 o@ $ H7 o@ $aW $!eϑ?N$'x Iї~yEXoO;w(b}˸Uc^qM@",(BP&M@",(BP&M@",(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@ހ"(P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@  (P7o@L (P7o@  (P7o@  (P7o@  (P7o@ aowE|;a(ur9}"E|vPį\wz{/"&Eɾ>2Qĸw˸U2 $(“M@ExIP'A"< $(“O"4(4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP6E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A fE&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A QE&(4Aހ"JQE&(B"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEh3PDi"JQEx(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQm(MPDi"JQo@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A QE&(4Aހ"JQE&(PDi"JQEx(MPDi"JQo@ (MPDi"J@ (MPDi"J (4A (MPDi"E&(4A (MP7E&(4A WG?El}(Oq=U^A"6 q[!$lxߞwH<.ϻ}x$4Ihd M@$4Ihd M@$4Ihd" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ix$ H7 m$ H7 m$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H6Ix$ H5Ix$ H6Ix$ H6Ix$ H6Ix$ H6IX{>G0$FqIDxw#~C`Gaq[y#F%]0>#4FX2`&M#4FX2`&M#4FX2a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#FX3a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#FX3a7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#Fh3`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0š o)9kTag02^G5#x(=5`˸c^uM#,0B`&M#,0B`&M#,0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o#0`7o ~Z #FxfoM 0`5Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`5Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fxs  0`6Fx 0`6Fx 0`6Fx 0`5Fx 0`6Fx 0`6Fx 0`6Fx 0`6Fx 0`6Fx 0`6Fx 0`6Fx 0`6Fx 0`6Fx 0`5Fx 0`6Fx 0`6Fx 0`6Fx 0`6FX-F|;a0ⶏ ߧx0OF +xwFH/?$֧~! .C׸<2|؇W HB& K$ HB& K$ HB& K&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 k&$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H7 m$ H6Ixk&$ HB$g~=n" o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H›K7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$H7 o@ހ$Hš o/HC;w"?e(HݽӯH[0⯧?#~r0b\ˏqye\J}xFxI`&O#< $0“MFxI`' QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0B#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFh3`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQFx(M`Di#JQo (M`Di#J̀ (M`Di#J 04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#04 (M`Di#F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`6F&04 (M`7F&04 QF&04#JQF&0`Di#JQFx(M`Di#JQo (M`Di#J 04 (M`Di#F&04 (M`7F&04 fF&04 QF&04#JQF&0`Di#JQFx#-F|;Q0~>Y>#>oa{PF~ˆw0b}yq#:`&M  0B`&M  0B`&ML 0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7oL 0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7oL 0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m[ +|#$a0x}\?wˆ?a](0ݽ =/A맱>~j.kqye\J:`&M  0B`&M  0B`&ML 0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7oL 0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7oL 0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7o  0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7m 0`7k& 0`7m 0`7m 0`7m 0`7m[ +|v` kF\'/\ˆw +a׿>$?$iHb\~$7@W }x$4Ihd M@$4Ihd M@$4Ihd" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf" o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ixf o@ހ$Ih37 ;Z*-+ 4 E8/9'$ NܳvN*&$&$&$f! 7! 7! 7! 7! 5I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBFnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlppppP$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$l$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBj`$OCO_~ HD?#n$j[߯HG0F<-?\W0~X{5fcoV'#<~LNF8d`o0I0'# p F0Y0hFq4`` 8G30h7q4#f`<~nG30hFy##f` 8G F Fq4#p8G30hF7&q4#f` 8nG30hF&q4#f` 8l8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` `` 8G30hF Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4##f` 8G30M0hFq4#,q4#f` 8nG30hF&q4#f` 8nG30hF&q4#f` 8nG30hF&q4#f` 8nG30hF&q4#f` 8nG30hFfq4#f` p8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` p8G30hF6 Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4#f`` 8G30hFY0hFq4##f` 8G30M0hFq4##f` 8G30M0_woKxxU_ Ft #z=o+ ](/hxze]9{ +LLJ````P %%%%%,(&(&(&(&(fA 7A 7A 7A 7A 6 J J J J JYPMPMPMPMP͂nnnnlpppp`%%%%%,(&(&(&(&(fC 7A 7A 7A 7A 6 J J J J JYPMPMPMPMP͂nnnnlpppp`%%%%%,(&(&(&(&(fA 7A 7A 7A 7A 6 J J J J JPMPMPMPMP͂nnnnlpppp`%%%%%,(&(&(&(&(fA 7A 7A 7A 7A 6 J J J JYPMPMPMPMP͂nnnnj6pppp`%%%%%,(&(&(&(&(fA 7A 7A 7A 7A 6 J J J J JYPMPMPMPMP͂nnnnlpppp` %%%%%,(&(&(&(&(fA 7A 7A 7A 7A 6 J J J J JYPMPMPMPMP͂nnnnlpppp`%%%%%,(&(&(&(&(fC 7A 7A 7A 7A 6 J J J J JYPMPMPMPMP͂nnnnlpppp`%%%%%,(&(&(&(&(fA 7A 7A 7A 7A 6 J J J J JPMPMPMPMP͂nnnnlpppp`%|/l1 P%><"Jt/hxFe]5{CLBLBJ````P$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f# 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I IYHMHMHMHMHBnBnBnBnBj6pppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f# 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IHMHMHMHMHBnBnBnBnBlpppp`$|'l/ H$HD?#p Ws >]ī"~wo|i6Xz5n YYu# p20I0'# p20I0'# p20ɂG30hF&q4#f` 8nG30hF&q4#f` 8nG30hF&q4#f` 8nG30hF&q4#f` 8nG30hF&q4#f` 8l8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` `` 8G30hF Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4##f` 8G30M0hFq4#,q4#f` 8n|G30hF&q4#f` 8nG30hF&q4#f` 8nG30hF&q4#f` 8nG30hF&q4#f` 8nG30hFfq4#f` p| 8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` p8G30hF7q4#f` p8G30hF6 Fq4#f`Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4#f`` 8G30hF Fq4#f`#f` 8G30o#f` 8G30M0hFq4##f` 8G30M0w̖#~Y0_57x0\Ϸ^v0oˆ2Ҽ ?= #:f###,$$$$d&&&&%F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0B͆nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlppppPa````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlppp``````#####l&&&&';_a````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp`````` #####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77776 F F F F F0M0M0M0M0͂nnnnlpppp``````#|oa? F}\{5vt + I0 I0 I(YHIHIHIHIHBBLBLBLBLBJ6pppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f# 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$f! 7! 7! 7! 7! 6 I I I I IHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBj6pppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f! 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlpppp`$܄$܄$܄$܄$,$&$&$&$&$f# 7! 7! 7! 7! 6 I I I I IYHMHMHMHMHBnBnBnBnBlPݞ/ eC?#9īo"0+x>rio0{4`Dï`,kJ؛U``P`````#####l&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77775F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0B͆nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0͂nnnnlppppPa````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####l&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77775F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0B͆nnnnlpppp``````#####,}fK_?4_a0nj#_߾ J<_.Նk_߭=rֱ7pNJ0 J8(dNJ0 J8(dNJ0YPhJ@(q4%%f 8G3PMPhJ@(q4%%f 8G3PMPhJ@(q4%%f 8G3PMPhJ@(q4%%f 8G3PMPhJ@(q4%%f 8G3P͂G3PhJ@(&(q4%f 8nG3PhJ@(&(q4%f 8nG3PhJ@(&(q4%f 8nG3PhJ@(&(q4%f 8nG3PhJ@(&(q4%f 8l8G3PhJ@ 7A(q4%f p8G3PhJ@ 7A(q4%f p8G3PhJ@ 7A(q4%f p8G3PhJ@ 7A(q4%f 8G3PhJ J@(q4%f%f 8G3PMPhJ@(q4%ܼ(q4%f 8nG3PhJ@(&(q4%f 8nG3PhJ@(&(q4%f 8nG3PhJ@(&(q4%f 8nG3PhJ@(fA(q4%f p8G3PhJ@ 7J@(q4%f 8G3PhJ J@(q4%f 8G3PhJ J@(q4%f 8G3PhJ J@(q4%f 8G3PhJYPhJ@(q4%%f 8G3PG3PhJ@(&(q4%f 8nG3PhJ@(&(q4%f 8nG3PhJ@(&(q4%f 8nG3PhJ@(&(q4%f 8l8G3PhJ@ 7A(q4%f p~ 8G3PhJ J@(q4%f-~J8Ӓ'P_?C`(z$>|C#>OOҼ Ͽ;{5Ftͪ F0 F0 F(Y0I0I0I0I0BɂLLLLJ6pppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp`````` #####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&f77776 F F F F F0M0M0M0M0͂nnnnl#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp`````` #####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77776 F F F F F0M0M0M0M0͂nnnnlpppp``````#|l)sOO?ˆ F<| +'x5O7ݗ]#6x|Ozޠ>_W0W0޳+coV]0&% F0 F0 F0y$d&&&##l&&a``###< p````nlppp00M0͂nnnF FY0M0M076 F F Fy&f77776 F F F F FY0M0M0M0M0B͆nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlppppPa````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlppp``````#####l&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77775F F F F FY0M0M0M0M0͂nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0B͆nnnnlpppp``````#####,&&&&f77776 F F F F FY0M0M0M0M0͂nnnnlppppPa````#####,&&&&f77776 FnR`ď? F|zqa?Ènj;F<ÈO_?~~$HգSO~}%ȇu~?ǧ߷t|x>~9|9G˟?J?>G{!/A|/E{n{x_dĉ}z!֗{z@>o<=gs0/z +hAW +endstream +endobj +344 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 343 0 R +/Resources 4 0 R +/Annots [ 345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R 365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R 375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R 385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +345 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 771.023622 555.889134 750.353622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-24-avril-2023) +>> +endobj +346 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 765.503622 82.786359 751.103622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-24-avril-2023) +>> +endobj +347 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 765.503622 555.889134 751.103622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-24-avril-2023) +>> +endobj +348 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 750.353622 555.889134 729.683622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-25-avril-2023) +>> +endobj +349 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 744.833622 82.786359 730.433622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-25-avril-2023) +>> +endobj +350 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 744.833622 555.889134 730.433622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-25-avril-2023) +>> +endobj +351 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 729.683622 555.889134 709.013622 ] +/BS << +/W 0 +>> +/Dest (jdb/:26-avril-2023) +>> +endobj +352 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 724.163622 82.786359 709.763622 ] +/BS << +/W 0 +>> +/Dest (jdb/:26-avril-2023) +>> +endobj +353 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 724.163622 555.889134 709.763622 ] +/BS << +/W 0 +>> +/Dest (jdb/:26-avril-2023) +>> +endobj +354 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 709.013622 555.889134 688.343622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-27-avril-2023) +>> +endobj +355 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 703.493622 82.786359 689.093622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-27-avril-2023) +>> +endobj +356 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 703.493622 555.889134 689.093622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-27-avril-2023) +>> +endobj +357 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 688.343622 555.889134 667.673622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-28-avril-2023) +>> +endobj +358 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 682.823622 82.786359 668.423622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-28-avril-2023) +>> +endobj +359 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 682.823622 555.889134 668.423622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-28-avril-2023) +>> +endobj +360 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 667.673622 555.889134 647.003622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-1-mai-2023) +>> +endobj +361 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 662.153622 82.786359 647.753622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-1-mai-2023) +>> +endobj +362 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 662.153622 555.889134 647.753622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-1-mai-2023) +>> +endobj +363 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 647.003622 555.889134 626.333622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-2-mai-2023) +>> +endobj +364 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 641.483622 82.786359 627.083622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-2-mai-2023) +>> +endobj +365 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 641.483622 555.889134 627.083622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-2-mai-2023) +>> +endobj +366 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 626.333622 555.889134 605.663622 ] +/BS << +/W 0 +>> +/Dest (jdb/:recrutement-payerne-mai-2023) +>> +endobj +367 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 620.813622 82.786359 606.413622 ] +/BS << +/W 0 +>> +/Dest (jdb/:recrutement-payerne-mai-2023) +>> +endobj +368 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 620.813622 555.889134 606.413622 ] +/BS << +/W 0 +>> +/Dest (jdb/:recrutement-payerne-mai-2023) +>> +endobj +369 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 605.663622 555.889134 584.993622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-5-mai-2023) +>> +endobj +370 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 600.143622 82.786359 585.743622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-5-mai-2023) +>> +endobj +371 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 600.143622 555.889134 585.743622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-5-mai-2023) +>> +endobj +372 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 584.993622 555.889134 564.323622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-8-mai-2023) +>> +endobj +373 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 579.473622 82.786359 565.073622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-8-mai-2023) +>> +endobj +374 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 579.473622 555.889134 565.073622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-8-mai-2023) +>> +endobj +375 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 564.323622 555.889134 543.653622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-9-mai-2023) +>> +endobj +376 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 558.803622 82.786359 544.403622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-9-mai-2023) +>> +endobj +377 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 558.803622 555.889134 544.403622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-9-mai-2023) +>> +endobj +378 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 543.653622 555.889134 522.983622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-10-mai-2023) +>> +endobj +379 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 538.133622 82.786359 523.733622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-10-mai-2023) +>> +endobj +380 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 538.133622 555.889134 523.733622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-10-mai-2023) +>> +endobj +381 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 522.983622 555.889134 502.313622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-11-mai-2023) +>> +endobj +382 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 517.463622 82.786359 503.063622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-11-mai-2023) +>> +endobj +383 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 517.463622 555.889134 503.063622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-11-mai-2023) +>> +endobj +384 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 502.313622 555.889134 481.643622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-12-mai-2023) +>> +endobj +385 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 496.793622 82.786359 482.393622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-12-mai-2023) +>> +endobj +386 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 496.793622 555.889134 482.393622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-12-mai-2023) +>> +endobj +387 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 481.643622 555.889134 460.973622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-15-mai-2023) +>> +endobj +388 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 476.123622 82.786359 461.723622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-15-mai-2023) +>> +endobj +389 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 476.123622 555.889134 461.723622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-15-mai-2023) +>> +endobj +390 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 460.973622 555.889134 440.303622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-16-mai-2023) +>> +endobj +391 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 455.453622 82.786359 441.053622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-16-mai-2023) +>> +endobj +392 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 455.453622 555.889134 441.053622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-16-mai-2023) +>> +endobj +393 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 440.303622 555.889134 419.633622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-17-mai-2023) +>> +endobj +394 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 434.783622 82.786359 420.383622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-17-mai-2023) +>> +endobj +395 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 434.783622 555.889134 420.383622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-17-mai-2023) +>> +endobj +396 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 419.633622 555.889134 398.963622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-18-mai-2023) +>> +endobj +397 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 414.113622 82.786359 399.713622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-18-mai-2023) +>> +endobj +398 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 414.113622 555.889134 399.713622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-18-mai-2023) +>> +endobj +399 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 398.963622 555.889134 378.293622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-22-mai-2023) +>> +endobj +400 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 393.443622 82.786359 379.043622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-22-mai-2023) +>> +endobj +401 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 393.443622 555.889134 379.043622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-22-mai-2023) +>> +endobj +402 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 378.293622 555.889134 357.623622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-23-mai-2023) +>> +endobj +403 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 372.773622 82.786359 358.373622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-23-mai-2023) +>> +endobj +404 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 372.773622 555.889134 358.373622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-23-mai-2023) +>> +endobj +405 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 357.623622 555.889134 336.953622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-24-mai-2023) +>> +endobj +406 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 352.103622 82.786359 337.703622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-24-mai-2023) +>> +endobj +407 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 352.103622 555.889134 337.703622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-24-mai-2023) +>> +endobj +408 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 336.953622 555.889134 316.283622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-25-mai-2023) +>> +endobj +409 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 331.433622 82.786359 317.033622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-25-mai-2023) +>> +endobj +410 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 331.433622 555.889134 317.033622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-25-mai-2023) +>> +endobj +411 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 316.283622 555.889134 295.613622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-26-mai-2023) +>> +endobj +412 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 310.763622 82.786359 296.363622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-26-mai-2023) +>> +endobj +413 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 310.763622 555.889134 296.363622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-26-mai-2023) +>> +endobj +414 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 295.613622 555.889134 274.943622 ] +/BS << +/W 0 +>> +/Dest (jdb/:grand-prix-de-monaco) +>> +endobj +415 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 290.093622 82.786359 275.693622 ] +/BS << +/W 0 +>> +/Dest (jdb/:grand-prix-de-monaco) +>> +endobj +416 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 290.093622 555.889134 275.693622 ] +/BS << +/W 0 +>> +/Dest (jdb/:grand-prix-de-monaco) +>> +endobj +417 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 274.943622 555.889134 254.273622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-29-mai-2023) +>> +endobj +418 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 269.423622 82.786359 255.023622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-29-mai-2023) +>> +endobj +419 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 269.423622 555.889134 255.023622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-29-mai-2023) +>> +endobj +420 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 254.273622 555.889134 233.603622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-30-mai-2023) +>> +endobj +421 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 248.753622 82.786359 234.353622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-30-mai-2023) +>> +endobj +422 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 248.753622 555.889134 234.353622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-30-mai-2023) +>> +endobj +423 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 233.603622 555.889134 212.933622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-31-mai-2023) +>> +endobj +424 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 228.083622 82.786359 213.683622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-31-mai-2023) +>> +endobj +425 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 228.083622 555.889134 213.683622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-31-mai-2023) +>> +endobj +426 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 212.933622 555.889134 192.263622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-1-juin-2023) +>> +endobj +427 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 207.413622 82.786359 193.013622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-1-juin-2023) +>> +endobj +428 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 207.413622 555.889134 193.013622 ] +/BS << +/W 0 +>> +/Dest (jdb/:jeudi-1-juin-2023) +>> +endobj +429 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 192.263622 555.889134 171.593622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-2-juin-2023) +>> +endobj +430 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 186.743622 82.786359 172.343622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-2-juin-2023) +>> +endobj +431 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 186.743622 555.889134 172.343622 ] +/BS << +/W 0 +>> +/Dest (jdb/:vendredi-2-juin-2023) +>> +endobj +432 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 171.593622 555.889134 150.923622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-5-juin-2023) +>> +endobj +433 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 166.073622 82.786359 151.673622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-5-juin-2023) +>> +endobj +434 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 166.073622 555.889134 151.673622 ] +/BS << +/W 0 +>> +/Dest (jdb/:lundi-5-juin-2023) +>> +endobj +435 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 150.923622 555.889134 130.253622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-6-juin-2023) +>> +endobj +436 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 145.403622 82.786359 131.003622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-6-juin-2023) +>> +endobj +437 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 145.403622 555.889134 131.003622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mardi-6-juin-2023) +>> +endobj +438 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 130.253622 555.889134 109.583622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-7-juin) +>> +endobj +439 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 124.733622 82.786359 110.333622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-7-juin) +>> +endobj +440 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 124.733622 555.889134 110.333622 ] +/BS << +/W 0 +>> +/Dest (jdb/:mercredi-7-juin) +>> +endobj +441 0 obj +<< +/Filter /FlateDecode +/Length 29602 +>> +stream +xM#gg>|dj`=1p6`x*wna*'ϴ\-V\ %p_u=OO~Oyu>cطOO^v{?qױ?~~/O_/5}ym඿z𧭌W;L}=NΣ9OԿhqn-lYym=$<ϐ^sK[y~qǑR{G={r>}[8{Jڞn+m!ݎrn3l~tPo^wjj۩}>n-m^\Zkvj:DSS|֑S|W:y=1Z۩}~n#nyv>?3=mޓy۩}~x{㺟[:Vk?oi;.Ǚovcl?+s?vj?mlc}wc}GNx>?Gcy^;#kcf>&aNu췸뵥cy>[8V5vj5R4<c{ +zb7#m^#n19ŎpYV5u2Ssp7WNZ\9+zjdUsq;ϵ{N}?^935vja}>jE5G:Vkg>q>LXhhj~ܟr>6^'5ϯZc`-4ϴRS|[:VkuLjVTi;5'Vu;ӱZs3-5:ټvj#\|v]izW}c8^GNsm&^k|:]fXj{N~; +v9xb:mLEG-uQi [G:귯מ.8ZeYi;5Z5cl9X-]jG>RVs>Nӫ5.l5hk$[紆qq\[o945ϭĴR]N<}td9x-aQ?eX9X[NR\td9xu6S\˦td9x{N<{NRkj0nh1Vs|n:Iy\:^s|WZ"וZ{}+]'j/my=_i [%kHy${gtp\gZ^gk>u:ZU:ubְRf1V瞮Z;ny(>g_WZ5X|${JIְƭf{5^sYg:^s:I?k?=m53]'>^5_HIHkZOԛꞮԫYMIc`M=]'5w5זְxXNIHIj]^MUa;xmGZ)K5=cvñz|MI}5lTs1Vi{NR'ujS\ϴMT1v:OI:aMIj[??jD!cu|jȥ$G8u:U??ja:j']'9jjucݗrGzs1VspMt9=]'C`뾏tVC:ŎyVL#c5*u:Yf$G)gu~\㖮ԩF5՚5L۩}޷WNRo՜t9xW9nJkZLWsjpGL1v>j[NRˆۣ~v??:5V.9c~h>nۺ+'4{vϽy[;5ϵOIǸ7??: Q\' :y>HIΣy]۩}-cgsR:y>[xNr{k=]'jY-:ye?X}lWNr^՜UsQct~jWNr^aN?jOVx:Vg[DH^ՙK8V?k#~9x_`1]:I9WS'i;5'~9xt=kk@$ϚuHIj!X?\"c5M:ɳ}]Ǝy;gϚI7woLk~|{s?J%|!'+}gUqoc{om[O㿽w~:oKt۾l7Qo>f\C֥z5>ط9wGxV9!ïxR?:8~=lue輧d]r&Ϻɺy<#%zɺHϔ=WJo-YW/kzK󞒵Ruy%dɆ:~_}Eyf]Q۟ج]>ج}>ki\ֻ-6k'6k'>׈b{uFup{}~gl>&ެ}u[o>_#6b\gڼE:bSڮ36j~=cx:|X\"6kެ5?bOtlj%Bs+ͺBج}>w'yy듚͒ Zdk-Hbs|o= %պɶdõ.f]4ۖl%ج}>i-ٰv_W.o_jk\^4ljI&ܒ By\9͸%օ4lXWӌ[Z7OfsdUcqK6\dUi-P?[qK6\4lWtK3nɆQKجO<-͸%jli-p=-͸%sO3nɆkAج}%Alj۞fܒ vӌ[atfܒ ׶i-p+fܒ 54l/ xydõ49Mjޟ,i-p+fܒ M3nɆkߎ4ljfܒ ^Tl>oRnK6\+ݖl[4vnYmɆzEmɆxi=ޟq ^\=ޟq dU4lXdu\qdCuܒ %%ZdUk4ljfܒ ׺ #6kqdUk4ljfܒ u +qK6\جOJqdCqdUk4ljfܒ %sO3nɆzi-pZ/͸%ZdCuܒ z%U%ZdUk4l^ϸ[z:nɆuuܒ W-BҌ[2qdC:nɆzE:nɆnqK6\ج}>:nɆz!:nɆ4l7(͸m}Wk4 ^ҌqOYqW'3g\mW\mnۮu7n{\m׺[qu~}^qmqmqm3W\W\u-u'KҌם,PK3n_w(͸}R 4u'K;Yg\NZdyu}ɲ:n_w?#6;Y:nɲue}Rzqޤӌ_g\NZ;YUO3n_wԫfܾdW=͸}Rzq^4u'#b}ɲDol1fܾdW=͸}Rk45kfܾ`Ҍ^qK3n_szikG\kg\kZ/͸}qK3n_szikZ/θ}gV\kZ/͸cZ]Y|uܱ⍱YcZw9Xk45kfܱ`Ҍ;^qǚ-5v +3Xsyuܱ`Ҍ;;:XszikZ/͸cZw9Xk45kfܱ`Ҍ;^qk/5kfܱ`Ҍ;^qǚ-5kfܱ9)6N-5kfܱ`Ҍ;θ;^qǚK3Xsp +}OPjwGu\wG>:N"qWqw>qw<:x}G+/wtuq{\;:qw;:[\ǝZw;:G\ǝZw;:kfܹ謵^q纣z{l];MsҌ[^k4lZ#l?66kqdýzi-Po,qdýzi-p^qK6ԡqK6?.͸%'i-P+[aYfܒ Zdýzi-ٰPN3nɆ{i-p##͸%֝i-p##͸%K3nɆO3nɆuddý4l':nɆ{- Ҍ[`\-p4l iqz[%O 3eɆZu[6Z/͸l^qoPk4޲ziƽeCҌ{ˆGfݽ븷l^qoP?iƽeCp u0  f[6Կ\qoPK3-jf[6Z/͸lx?44k>{ˆZ K3-jf[6ZoO͚K3-^{ˆZ B,ٰupuܷ?Ofiw?6ۆywm[Pz~7LpoV _֎'J֎M-|׿_0_~}m@\o!%$xX[{7G@B& K @B& K @B& K& @7 m @7 m @7 m @7 m @7 m @7 m @7 m @7 m @7 m @7 k& @7 m @7 m @7 m @7 m @7 m @7 m @7 m @7 m @7 m @7 k& @7 m @7 m @7 m @7 m @7 m @7 m @7 m @6Hx @6Hx @5Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @5Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @5Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx @6Hx zqHX37 oެ'q76Hx @6Hx @6Hx @6HX $ꭼ $^= u"7w7X⽰"G!^ 6[sT9Ax“F zOCew=|o_n=|';x|fo>x|fo>x|fo>x|fo>x|fo>x|fo>x|fo>x|fo>x|fo>x|f>x| 6>x| 6>x| 6>x| 6>x| 6>x| 5>x| 6>x| 6>x| 6>x| 6;7o7o7o7o 7o 7oL 7o 7o 7o 7o 7o 7o 7o 7o 7o 7oL 7o 7o 7o 7o 7o 7o 7o 7o 7o 7oL 7o 7o 7o 7o 7o 7o 7o 7o 7o 7oL 7o 7o 7o 7o `oʀi>j>‡m+|-ÇOyÇs-fUx~k-_es_;Zk铒OJMyxne '֊[{87&zB& K= zB& K= zB& K= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z7 k= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z7 k= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z7 m= z6COx:n oޠ'z›qSOx=a<͡- Z’%4AKh- Z’%4AKh- Z’%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- Zš%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- Zš%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx- ZB%AKx-ެ{\M- Z6CKx븩%AKxfj o%AKx-mkWPc)^[$~ @|9|@xxne<1jIO@h' ~B@|?qz Q@W@n:x:C{ϟ՗vOx_) ~;Խxzy7c׼\޼/GͶ{:Ynzpxqu8_!t#o;t +endstream +endobj +442 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 441 0 R +/Resources 4 0 R +/Annots [ 443 0 R 444 0 R 445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R 455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R 465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R 508 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +443 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 47.386457 771.023622 555.889134 750.353622 ] +/BS << +/W 0 +>> +/Dest (INXWIZI/) +>> +endobj +444 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 47.386457 765.503622 63.334211 751.103622 ] +/BS << +/W 0 +>> +/Dest (INXWIZI/) +>> +endobj +445 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 765.503622 555.889134 751.103622 ] +/BS << +/W 0 +>> +/Dest (INXWIZI/) +>> +endobj +446 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 750.353622 555.889134 729.683622 ] +/BS << +/W 0 +>> +/Dest (Code/ConfigurationTool/:configurationtoolcs) +>> +endobj +447 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 744.833622 77.060285 730.433622 ] +/BS << +/W 0 +>> +/Dest (Code/ConfigurationTool/:configurationtoolcs) +>> +endobj +448 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 744.833622 555.889134 730.433622 ] +/BS << +/W 0 +>> +/Dest (Code/ConfigurationTool/:configurationtoolcs) +>> +endobj +449 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 729.683622 555.889134 709.013622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverData/:driverdatacs) +>> +endobj +450 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 724.163622 77.060285 709.763622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverData/:driverdatacs) +>> +endobj +451 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 724.163622 555.889134 709.763622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverData/:driverdatacs) +>> +endobj +452 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 709.013622 555.889134 688.343622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverGapToLeaderWindow/:drivergaptoleaderwindowcs) +>> +endobj +453 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 703.493622 77.060285 689.093622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverGapToLeaderWindow/:drivergaptoleaderwindowcs) +>> +endobj +454 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 703.493622 555.889134 689.093622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverGapToLeaderWindow/:drivergaptoleaderwindowcs) +>> +endobj +455 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 688.343622 555.889134 667.673622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverNameWindow/:drivernamewindowcs) +>> +endobj +456 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 682.823622 77.060285 668.423622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverNameWindow/:drivernamewindowcs) +>> +endobj +457 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 682.823622 555.889134 668.423622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverNameWindow/:drivernamewindowcs) +>> +endobj +458 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 667.673622 555.889134 647.003622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverSectorWindow/:driversectorwindowcs) +>> +endobj +459 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 662.153622 77.060285 647.753622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverSectorWindow/:driversectorwindowcs) +>> +endobj +460 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 662.153622 555.889134 647.753622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverSectorWindow/:driversectorwindowcs) +>> +endobj +461 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 647.003622 555.889134 626.333622 ] +/BS << +/W 0 +>> +/Dest (Code/F1TVEmulator/:f1tvemulatorcs) +>> +endobj +462 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 641.483622 77.060285 627.083622 ] +/BS << +/W 0 +>> +/Dest (Code/F1TVEmulator/:f1tvemulatorcs) +>> +endobj +463 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 641.483622 555.889134 627.083622 ] +/BS << +/W 0 +>> +/Dest (Code/F1TVEmulator/:f1tvemulatorcs) +>> +endobj +464 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 626.333622 555.889134 605.663622 ] +/BS << +/W 0 +>> +/Dest (Code/Form1/:form1cs) +>> +endobj +465 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 620.813622 77.060285 606.413622 ] +/BS << +/W 0 +>> +/Dest (Code/Form1/:form1cs) +>> +endobj +466 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 620.813622 555.889134 606.413622 ] +/BS << +/W 0 +>> +/Dest (Code/Form1/:form1cs) +>> +endobj +467 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 605.663622 555.889134 584.993622 ] +/BS << +/W 0 +>> +/Dest (Code/Program/:programcs) +>> +endobj +468 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 600.143622 77.060285 585.743622 ] +/BS << +/W 0 +>> +/Dest (Code/Program/:programcs) +>> +endobj +469 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 600.143622 555.889134 585.743622 ] +/BS << +/W 0 +>> +/Dest (Code/Program/:programcs) +>> +endobj +470 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 584.993622 555.889134 564.323622 ] +/BS << +/W 0 +>> +/Dest (Code/Settings.Designer/:settingsdesignercs) +>> +endobj +471 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 579.473622 77.060285 565.073622 ] +/BS << +/W 0 +>> +/Dest (Code/Settings.Designer/:settingsdesignercs) +>> +endobj +472 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 579.473622 555.889134 565.073622 ] +/BS << +/W 0 +>> +/Dest (Code/Settings.Designer/:settingsdesignercs) +>> +endobj +473 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 564.323622 555.889134 543.653622 ] +/BS << +/W 0 +>> +/Dest (Code/SqliteStorage/:sqlitestoragecs) +>> +endobj +474 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 558.803622 82.786359 544.403622 ] +/BS << +/W 0 +>> +/Dest (Code/SqliteStorage/:sqlitestoragecs) +>> +endobj +475 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 558.803622 555.889134 544.403622 ] +/BS << +/W 0 +>> +/Dest (Code/SqliteStorage/:sqlitestoragecs) +>> +endobj +476 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 543.653622 555.889134 522.983622 ] +/BS << +/W 0 +>> +/Dest (Code/Zone/:zonecs) +>> +endobj +477 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 538.133622 82.786359 523.733622 ] +/BS << +/W 0 +>> +/Dest (Code/Zone/:zonecs) +>> +endobj +478 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 538.133622 555.889134 523.733622 ] +/BS << +/W 0 +>> +/Dest (Code/Zone/:zonecs) +>> +endobj +479 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 522.983622 555.889134 502.313622 ] +/BS << +/W 0 +>> +/Dest (Code/DataWrapper/:datawrappercs) +>> +endobj +480 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 517.463622 82.786359 503.063622 ] +/BS << +/W 0 +>> +/Dest (Code/DataWrapper/:datawrappercs) +>> +endobj +481 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 517.463622 555.889134 503.063622 ] +/BS << +/W 0 +>> +/Dest (Code/DataWrapper/:datawrappercs) +>> +endobj +482 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 502.313622 555.889134 481.643622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverDrsWindow/:driverdrswindowcs) >> endobj 483 0 obj << +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 496.793622 82.786359 482.393622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverDrsWindow/:driverdrswindowcs) +>> +endobj +484 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 496.793622 555.889134 482.393622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverDrsWindow/:driverdrswindowcs) +>> +endobj +485 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 481.643622 555.889134 460.973622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverLapTimeWindow/:driverlaptimewindowcs) +>> +endobj +486 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 476.123622 82.786359 461.723622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverLapTimeWindow/:driverlaptimewindowcs) +>> +endobj +487 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 476.123622 555.889134 461.723622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverLapTimeWindow/:driverlaptimewindowcs) +>> +endobj +488 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 460.973622 555.889134 440.303622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverPositionWindow/:driverpositionwindowcs) +>> +endobj +489 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 455.453622 82.786359 441.053622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverPositionWindow/:driverpositionwindowcs) +>> +endobj +490 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 455.453622 555.889134 441.053622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverPositionWindow/:driverpositionwindowcs) +>> +endobj +491 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 440.303622 555.889134 419.633622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverTyresWindow/:drivertyreswindowcs) +>> +endobj +492 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 434.783622 82.786359 420.383622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverTyresWindow/:drivertyreswindowcs) +>> +endobj +493 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 434.783622 555.889134 420.383622 ] +/BS << +/W 0 +>> +/Dest (Code/DriverTyresWindow/:drivertyreswindowcs) +>> +endobj +494 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 419.633622 555.889134 398.963622 ] +/BS << +/W 0 +>> +/Dest (Code/OcrImage/:ocrimagecs) +>> +endobj +495 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 414.113622 82.786359 399.713622 ] +/BS << +/W 0 +>> +/Dest (Code/OcrImage/:ocrimagecs) +>> +endobj +496 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 414.113622 555.889134 399.713622 ] +/BS << +/W 0 +>> +/Dest (Code/OcrImage/:ocrimagecs) +>> +endobj +497 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 398.963622 555.889134 378.293622 ] +/BS << +/W 0 +>> +/Dest (Code/Reader/:readercs) +>> +endobj +498 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 393.443622 82.786359 379.043622 ] +/BS << +/W 0 +>> +/Dest (Code/Reader/:readercs) +>> +endobj +499 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 393.443622 555.889134 379.043622 ] +/BS << +/W 0 +>> +/Dest (Code/Reader/:readercs) +>> +endobj +500 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 378.293622 555.889134 357.623622 ] +/BS << +/W 0 +>> +/Dest (Code/Settings/:settingscs) +>> +endobj +501 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 372.773622 82.786359 358.373622 ] +/BS << +/W 0 +>> +/Dest (Code/Settings/:settingscs) +>> +endobj +502 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 372.773622 555.889134 358.373622 ] +/BS << +/W 0 +>> +/Dest (Code/Settings/:settingscs) +>> +endobj +503 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 357.623622 555.889134 336.953622 ] +/BS << +/W 0 +>> +/Dest (Code/Window/:windowcs) +>> +endobj +504 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 352.103622 82.786359 337.703622 ] +/BS << +/W 0 +>> +/Dest (Code/Window/:windowcs) +>> +endobj +505 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 352.103622 555.889134 337.703622 ] +/BS << +/W 0 +>> +/Dest (Code/Window/:windowcs) +>> +endobj +506 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 336.953622 555.889134 316.283622 ] +/BS << +/W 0 +>> +/Dest (Code/recoverCookiesCSV/:recovercookiescsvpy) +>> +endobj +507 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 55.386457 331.433622 82.786359 317.033622 ] +/BS << +/W 0 +>> +/Dest (Code/recoverCookiesCSV/:recovercookiescsvpy) +>> +endobj +508 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 538.710911 331.433622 555.889134 317.033622 ] +/BS << +/W 0 +>> +/Dest (Code/recoverCookiesCSV/:recovercookiescsvpy) +>> +endobj +509 0 obj +<< /Filter /FlateDecode -/Length 2867 +/Length 2865 >> stream xA+l@*V >9Drɗ(余vV<Fv-nw{,6"9' Vi:G<|}|>zuyZ}6#֧O~|_;6'1dׇoN=.twC9}~.72o^r6Vkgc տ7~ng9;ճptOoٱ7RxnxxV%B @@ -6190,22 +6629,22 @@ M EbДA;9ΪՋD2ԞBR{ E;980T \9k="N:Z@y'W 3Y rУwrБ.d"?K͘\PwrЖI䠵u"L)49hӕ&-]yorS K?1dr<ԞBf78{^ݩOlT;8ȏ9HԺzjR{ ==[zj6࠯Ժ:.ԞBzK/;8ȏu8XGs͓x8?VMeQ'+ ;P__x -a~O?}w0;xc|NZ{cwx}?]u)'Ϯ D{̼'Jg;ֽWs*"{{o7|/ryܹԾqW޺n{G:_;_^o_*5 *( nyU_7JL On)jx9ƹ|t|/q1r|}\ο/o-~}\c+܁Dg}nW0܅6ۑY3 {m=0|}pޯb>io\kwWlyBϬA^0 #FXό(~gvm7ls{{|jϣb/Pτ 7gm8Z& ߎ +a~O?}w0;xc|NZ{cwx}?]u)'Ϯ D{̼'Jg;ֽWs*"{{o7|/ryܹԾqW޺n{G:_;_^o_*5 *( nyU_7JL On)jx9ƹ|t|/q1r|}\ο/o-~}\c+܁Dg}nW0܅6ۑY3 {m=0|}pޯb>io\kwWlyBϬA^0 #FXό(~gvm7WQq=naQwJ( ㌏g՛Gqx{k/ԧ) endstream endobj -484 0 obj +510 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 483 0 R +/Contents 509 0 R /Resources 4 0 R -/Annots [ 485 0 R ] +/Annots [ 511 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -485 0 obj +511 0 obj << /Type /Annot /Subtype /Link @@ -6220,30 +6659,32 @@ endobj >> >> endobj -486 0 obj +512 0 obj << /Filter /FlateDecode -/Length 390 +/Length 391 >> stream -xRn0 )UHQ) ȡX{vab v؊zDS(|AFh& ErOwrVӸ'GpK -IxA ɄD?媽 - *1Xr@_|t7w@S+q5 UC)PH^b=ÖºcLyCi}~5#q7Cxm/tjd,_e݌:19 G/?=l} Ԗ1Z>\8d*Z6K`z`D5åTVg|o,z +xRn0 +UHQ) ȡX{vab v؊zDӶ(R||$z0y@{i Z$'?t'Al5M;lzr$A +GɾTQԀH8辺_K c %+WUGa|sK4 +אY5d +TQ%)6 l,+`y9~(OD2p(= ENLҮgYc7cdLAsNxwO/[_廃d#711ihj]ddWM;.LurM{L +Ah#lR)!O0ԊBAl,) ^~chEfps#l<o 6 r endstream endobj -487 0 obj +513 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 486 0 R +/Contents 512 0 R /Resources 4 0 R -/Annots [ 488 0 R ] +/Annots [ 514 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -488 0 obj +514 0 obj << /Type /Annot /Subtype /Link @@ -6258,45 +6699,40 @@ endobj >> >> endobj -489 0 obj +515 0 obj << /Filter /FlateDecode -/Length 4020 +/Length 4017 >> stream -x\]$|_1ϖϽJP>ϭv H3j$>{%fi/1'*)9Nd%S@JT2!*TANfŝ2@TbEH{z̊;OF_D[ :zQ#u0"SS.|&|H Qab%w`J]r"f ` -+_Pŝ:$w`d `t+_PcA!uiUr" %w`H+bN)_Pɝ:@ܩ()`=g :Ǯ:$-S!>M:r -H:Grpܩ(Hu0:}eP ɝ:h$w5!|AD:*ɝ:hhŝ:h T6ČY|ArKACQܡwH*C3%EqG\dČjT"DOh 1Ǫ#}&T=bF -HAElp57q:ܡn3&!fdŝ|-=3Y"3:PDƅUa'=qm%:&)_@S-h 0ל%w'fts*|C|90U:JU:D â|D2;t0%B޻E!fdqJCŽ3hŽs@lP(`F*,%w OHA>t( 1S;1#N̨ܔ/9|AVC;u[Uܝ:赪tUA4̊StQQ{ND!6:JA@;u⭖ԝ:9a̘;uYr"XղS1j30R NKA&;u0YVNDv:Wrܩ#(_P#dY!u0rQ6Scj]ݩѺSp`4ܩN ԺSC jO.UqHDg%SZ| `@$*_PCLjOͰNDfܩ];uZV{ -N4;u]N4Aה/d:hJAdy=S&2tgW!۰]qƇ"lM)@\V6eCI%@\ 6l j:Be̍͌B.\)d He=˽l#l4 1cˇK2X 0WJ#av:F% 131=*2|c 1Ց-acQ)d`= eD$Q|QU^]ވ9fv6(cNlEr܋DPպ:8 /d2t0"%N%N̩ub (A$rŽP!P{rg΀ԞBR{ -: -IrhܩZW/AG"|Qh$w ,$w [ Su -u0"SS{I:JU:3jOP*d!1&SQmuBD3 -ur:BSrܩx^PH;u^r"XպzjOPa -u+S#ZO uB -=B 5KPܩ*|A d/!Uɝ:.ŝ:ȲE>Khߕ/{TqH%w5ܩVMS{ -:h9(:hJD++uz :h!=J4K{ޓ ZWЫ=LCًZWSQ{ -53gD81*'b6Tqش*t0%w`h;tu2>ߩxl*> -Xݛ7oV|n᛫ D0=#^T{wTuvnopeT~~z'Ͼ|zw!=%;_/to?;~kCB~wPUP^x&>31iw.vxXC?sph M;03-ܒL4-QW&$*s>s bc\b3q/~[>SM6|6Ϳ8N -=Z؆;/3>='=ݿ F2k>9Ş6xV8B8T<@gOMNw =g{.AخaqrO_l|?mw|| z{gg)wNxύLG>{v_{ŹZ2Ɋq×gdW'¡(jIмknזB1z_\ws,\I-Yk:t?f5 m[P;a(G~L9ESu%rlƲD{k޲n˚^^G^':&@Ç񚰾viد:8=\֊e*,,8D6lNcR̨=kS'2.tTg0 uON`TI'N/qCR7i葋I2"G!yު`rZuu6mȘ"j܎v1j!SDSCatuCJ,<է T_t߷ -h,4PL\NU(]$KYEQ:qr>J T./csW SQs9v 塯~>9l5FQzn7u^csnlQVo=\(Ƕb`_8n~:.Q{uy:sRVV;{=6M|'H lz᠏DUP[7kPw=Ԫq8_[ctCWıw1 Rwov86iq쭱\|1&EG̞esl`w>(wf_Yum.JέAu+בY&vxl`]= m6֩rRe ({7>ȷckӼ.d,{"B&6־y\bD*rC퐱3.oR7жT>/V& F KWz>z!xp ˼Owh _@4 +x\]$|_1ϖ+KzNuU6c\!.npǛz*᜝{C'7Sh¤$IItcb0 U90\kfaV"]JQ+Z zuJ*ҕpcSVZ 3 BS1-7SZ&%$&" ף" 7,xc2C؄"ܰxpEϨw#H¦[PhĜ,8h;N +_P!*Q"ȄS9w Q::?"#uГ+:1+<"|n%_D`EqԊNLERE"%D:!ܩ)uɝ:/)|AL^w`2ܩ/ҭ|A5AUɝ:0ܩ#l9|AC$w MrFCl9/C N4 `5*_P* +ɝ:Mr ` 0C-$wuܩo*`u08"|$w!w%R3fu-S Gq!'zCGlljN"Δ"lrQܓ3Q=YV6 P)\"AqP(`U$w lLrB-+_DbΘʆ]w$DPgD@/1V NԞ$ĵɖ$w K|LV6\sܝ(N̩E&f E&PLV%w`*V `B/,tɰKTr 1{ŕ/*1# J̨J!fCul-8Ėܡ*^8|\v{Jml_7+bGFvoV\߼Y󹭇o2rwcØL{RN?Q_֙۹U{2mQiO7.gOO/?S 0?ϯ^_|@;shO9ϯ -W=s@UzBz~|F-:~8LgN/y;woTa|R>_c}{t]< ¡}CZ77#g|x&>pK3AӐDY_|rI:o?;r?f9.q/|ߛlpݗ~m?8N +=Z؆;/3>='o8e|dsw=mm6pp詄y?Ξ9fnAL7~{2,F6 \AخaqrO_l|?mw||J T./csW SQs9v 塯~>9l5FQz}^sR:Q9n7(+ѷbc.Ec[1^g7}ZR^p{ U=J}{xcg<_Z)U+Vyd흽_e^cQd m6@pfv_*-E͵MjոA-ıs:ūsXOλi7] +}8X.b VV#fM29pfu;jb3ϯ:6 H%렺[ȕȬwn<6vocc0Ԯ[W{{ֆ6T@9Re ({7>ȷckӼ.d,{"B&6־y\bD*rC퐱3.oR7жT>/V& y:gۻ'pmU^F)P\}ϵF3nw^< endstream endobj -490 0 obj +516 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 489 0 R +/Contents 515 0 R /Resources 4 0 R -/Annots [ 491 0 R 492 0 R 493 0 R 494 0 R ] +/Annots [ 517 0 R 518 0 R 519 0 R 520 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -491 0 obj +517 0 obj << /Type /Annot /Subtype /Link @@ -6311,7 +6747,7 @@ endobj >> >> endobj -492 0 obj +518 0 obj << /Type /Annot /Subtype /Link @@ -6326,7 +6762,7 @@ endobj >> >> endobj -493 0 obj +519 0 obj << /Type /Annot /Subtype /Link @@ -6341,7 +6777,7 @@ endobj >> >> endobj -494 0 obj +520 0 obj << /Type /Annot /Subtype /Link @@ -6356,10 +6792,10 @@ endobj >> >> endobj -495 0 obj +521 0 obj << /Filter /FlateDecode -/Length 2919 +/Length 2916 >> stream x[[,~_1φua q 0;_|v?DRO5RƘ2;-UI#O"A?-9]"6oE)O ߧ//o>Z)̈́ CBF?{/ggF򴀉s˳'̧:lz9ZI\Ŭf[KZXsz D/sɦ&91n\^YL7$?K;y2Lx-+DOTC,-n,\bR|V{x\e؞ͻ NX^- m TM]-IU@o1`bDq>Mk010wN]š@4g! yRM gUjt,Y/)zS,цc'& r)Bq (Ag]B@ A#uCu - mrPlfّ#PY*6Qs"C<\3gfGbHڟuvFm _l^Arrsu9RbEMj?2G4p|q@0jXİs D%*> endobj -497 0 obj +523 0 obj << /Filter /FlateDecode -/Length 6256 +/Length 6254 >> stream x[$ɕWԳ`S~pz^$CuZ/i?Ydqp3tupKXv<$[VKz~OV?+qOjˡniYҞ_n޻bbt}>[u.nٷdoO~7{ //9|-??e~/[+?^zumD& 0Vܽ- jwcc,÷ rsPе ,I/>F!4GSa.9p]1%,jQIWJQIWruQ 7$ @@ -6412,50 +6848,46 @@ Pn QBb!;woQ6^//s׀;6P95^w_zͥ'` ]ߑ׷ϸy޸|Lrb XzkyZ&7[u^=Ʊ0+Wk;^o! !y䴱ֳW>=.sg.j~[?7~zڹFh kl42\zyR9s sX3&ޚz;? ]Rȸ㽽ۨ~Y8NL or x}?wWסbXd[^MtO/[NЈCn6cCo a 8V~.qF}W+~;|ܶ8w{:5gƩIDy ;=ޅ"^^nS5E(b -lü}zv׽C=Хs{1[@rwxuQӶa kˮmSw}sǙ׼ݪ+ÔmrW5pLA_4i Xf6M{l5ƞ|vSmqz05bmyot}fpR𗭘=i!@K 㺜MKm(װ26ϙ_#՝1&=!jm<^^{>jK4va}qXh.;TTD&sXҿ?Ghxn 3>ut arXI 9Nߠ_`䗔|ٗʧ9Q}0/M:/vgqn~哯YM?c<ܡ#Ý:+s欍m!8hl<jd8aOFv6EXE٫-GVcgͽ_jEݷ.fv^xP=l]* luu,]wL1}I8cgt[O.7>?o|xu?aw3v6>ilq~ A%o}q]X r[j#탙I@pj_a?cVFy ôɊY8hfIC37tPwe1vgqtOoLg!tvg|0#/׽6;g Bv[?aE|A4}Jr8GYhSBu5r 9:vq\LǁjI5.??pb^nY fϞاv˩ц|묲?)ƥB}^*G`7z?PGXF|gƇ)뵡_}3Ο!r>N>zl7t͊'l%-%)Cێ6?^.yI)egcgۛ5?< /|_0wq/X~iaN/|a稩=\b}+gv/9dB'a0^[؏}ߘ -Q/{4ԚߔIx%!QrŻ[?Ւqۢ)b;{ʸ{MWWWZa`0ܲU|ޮݧU2 Qj{{~h_8 +Q/{4ԚߔIx%!QrŻ[?Ւqۢ)b;>nEpeHzS -{P˧}Z-ӰmQ" endstream endobj -498 0 obj +524 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 497 0 R +/Contents 523 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -499 0 obj +525 0 obj << /Filter /FlateDecode /Length 1830 >> stream -xYYF~_@} $$~paB4HQ-xRU}ui?^ }pV/Ӈgp?8>c.4 '<K7bF+)wA1ǹnBJfDbߏN/V 6[I7FHi'Jv x[4̺TLd Lei(ns>"f|SK0cry|z7?" :x;0gp6>:DN/9㫦CKt*{6 -ZIGj,d^R$\YCW\?BZ&+\(o5 -,/t)G3SI'._a2tru]ne(>3)h8i  3W4`uY%iɨK36-Aܣn@9)3e9euLJ7d-X+'i\KO.U ߯Azykgt}E7 W[ud " ׭X=EVm7L̥;2 -iCJZI\IK{, 3qL tD9hF]AĻnuPW5$Rd7)Rvz's{!$Ļf I:@p5+{;C if$wJ#yiEyH-vT_QpbHҊPT*%ZzImE^wRka#IY|o#ګ5[6hD2Pyk=Ij%syD=ǔ464c%JTd' awC]SX8.`;fʪ|c.4 '<K7bF+)wA1ǹnBJfDbN/V 6[I7FHi'Jv x[4̺TLd L+P:; l}< D`*o~|Efuvsal}0Bsku>_rߗWM`2(?Uly>S ιΞGMWa*pɹ:_jՁeÐk[y9;|9q4WkF'qN\{ dUrڲ\&cG=m̕LF֊cMqΖ{'e׾#]r$;Q2׎(Xomd}S +Ppv6"31d3 SeuL!Y/y$J%DTd2{!qAJpSn >keMag +KdYM/Eq[xz'丧Tۭ9ʘƻ H BtB<eK@oĭ>/ZMr զ'\Z7BL** 4r"JxK(hz0TY@(߅hQ)Dr:EHAnWBQc8n1=,xxO/ǙL3 PVd%$?\8@}j~17"|+kBr@ +S,\, *箅/E*-x81]X%0P:8(as\끂 FIq-Vr)I|5(,/%|HSThSp#52/)bc.ʬ+yj-]qA}^$ӓjd N/Wn[q}ik:h.`|wj4]qC`,ify4d̥]c GQ7 Ҕ2Ë &] +X%uF4`DoJGV%'*Jcנm χ3Q:"UsśA]٫ ww\ gv"ζ&!%|$i%=COZ8&~ZIWa:#zt@Wm:Cc)k k ;fԓf๽a*7 {]k$LvO=띡4~g;b<ڴ<;(ki81j`$iE(aw|O}jh-6"b50ʑ$,UJ Ub4X|"x&pMcaUl#I;UX~x6tPCR}e7bT6вbC \Bto*1yc܅&B;з] /y+yv5689M(Q&A q)w8EdD A.@c lJT ݯ0S%~瘝)rp3h0",@܂3\gA6(+Uyƿp6f7(pCiGTv/nr endstream endobj -500 0 obj +526 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 499 0 R +/Contents 525 0 R /Resources 4 0 R -/Annots [ 501 0 R 502 0 R 503 0 R ] +/Annots [ 527 0 R 528 0 R 529 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -501 0 obj +527 0 obj << /Type /Annot /Subtype /Link @@ -6470,7 +6902,7 @@ endobj >> >> endobj -502 0 obj +528 0 obj << /Type /Annot /Subtype /Link @@ -6485,7 +6917,7 @@ endobj >> >> endobj -503 0 obj +529 0 obj << /Type /Annot /Subtype /Link @@ -6500,35 +6932,42 @@ endobj >> >> endobj -504 0 obj +530 0 obj << /Filter /FlateDecode -/Length 1864 +/Length 1861 >> stream -xZ͎6)e8?C`(z8H@R-o6^k[8oGy >__R8#/~pL{ 9)<0Z)><{׻yw&a Xo8׷χw'-HSࠟ_@ FE#^{/__z(oKy~rBU-P;7xy?O'C_Qyr.=dy~FIN2Li&˺7}:oϏKk:9LƬw\OV=i\ձÖAzk9ZnBrH+e(@9Zi'0mL-<:_;KBs?H&05 y|<~NӎP~{|ÈhČ؂;g#o) 6H>y.5Zkf ߋoG*0}emyѢaTƒ;Z4(Is5yP$AhT)r uPŵQ0[*j)%t|vΟf<%kd*dHJ!ok!O)u+24UTj@Yg0K.8 i2Yμ",_uq  F?ɪjIֱФ}|l@UAls'%N!SU_33s) Exeⵌ5yX -5"&Zkgu0/83kt  -{XDnWlM# "A9 ./bQz!9vl!sDu3]NYgl]lZl1%u +ʵ&:2 - -<ҤǴ4cKi"zrSTܼSZԀȥR܉5^ۍe5);Kc _&M|ɋEEFt[ #La`FG.1 ofnXUqtUt{;cKA50 ,^P^S){Gh)vV<\ a^ -Fb` A{R NqSnYhZőQk0JRNum[:M9ZX-;+ +:po;F/bv+\A|`g>۾㹀3M{'c W+(q D@ɳ ygh!43qOnTU!NH.~.v+x|=\|M/OOIa$soܪ'؜jmt}{gr!li-{EP 6UܫVO;jm+=):.*qo zaTLrb3 Tڔ r.=;Wfcļq +xZ͎6)eHX@{H{ E =JS +$}CCP-o6^kK8o^?)!Dqrz[ y;ȗ?A{ᣝ;F#L*ģWA(%' 'h-ۧß~RJM*`uLoNJעC#L~~9(\B/)DB0~GMi)/ORN1RZo4|8o&3/ca =uY"/,26I2\0kE<XOzq-I@7i^v,sqv̝b] #01b \(B/^#˱X, hy,z|/~4clw&۾2{'# :U +*we&}dA m,1$[a'ʔ[I-*D +56ޭ۾Q}d0eDžjOu:GK 6%{FՕ$Aڛ8i5ؙ6B)oQI-r 4[mh]Ӿw+rV N +yzo4e7ykS6[&~MBŽk,u N;n GAwNZ”Q}ƝHP6W_oĵzjz +rk{rZ…smƕFb;~͙UpkUVRXP->pq>q3\?@<۹xx?^</:LJ=ų.y;xD?^<Hszqx|jM ++Ut0 }̍=TC{ %`[jٲT5 | +x*Sz·sqLo|U\j +%Lg:| \'r@4Ĕ ;?}XؤBف>e7?q` endstream endobj -505 0 obj +531 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 504 0 R +/Contents 530 0 R /Resources 4 0 R -/Annots [ 506 0 R ] +/Annots [ 532 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -506 0 obj +532 0 obj << /Type /Annot /Subtype /Link @@ -6543,7 +6982,7 @@ endobj >> >> endobj -507 0 obj +533 0 obj << /Filter /FlateDecode /Length 3757 @@ -6559,22 +6998,22 @@ H  eD^2/!B/Q)A̘)sU.E1[ܡ&CQ$ZW6z Y= F}}sj]1C/u\qoAި3g ZjOQQ=FD$SQJAE7c"|ѨIAXHAHZWoA: BC)4`Mr{I:XZuF, Y~ڐKܩ6Ժzb2ur:BSrܩxިШH;u^r"XպzjOQau+S3A0W:zU{ -:JPܩ *|AL*_PS ɝ:.ŝ:ȲE~1}WY!uܩMrZZWoAk:h5)A4O{P1QAd>LTԞBP͊4FܡitWL#\), d*:ȏ9Hu\SL('‰9^^R@S]&])t0;t0u:ȏub7=.KG+^M,+OV\[>25\zp?\I˳/څ13>T35as{0pSFޮoG<=\|9?qcͻgM^Q'TYDû燿ow_^X>7Mp"Jعź+Fdz/,Ix |O6x [=Ϳ8嶋!6}g[_ym[*>*47gG\Θ8Q-ތ%R^[k߅t>~>|L| rsfϒ|!Cmϯ\<! t&˰y|:M0چ2D:uXv~1٬ؖ['^ktqZy 7t"ze%5 īwsG_%,t?al> L_tJ~ Dr6o3s}WyPYDh) P_?!U_f[;ۭ.:gSEqz]Úv3v}.;~m|S-j;ymk`Pϟ֨;Me;s_;zԱ-M/C%jJSohܥx{5.In"휇i5z&юz~/zw>}'ݍþeҷogi[Y:.6=ڿti~ 2)qIN[bhMx%-fVr,dm\cN{e^q/vU7'n82a/d9rGzn_;]|߉%q xJn1+9S03<=6s󼳟JK[>u/3iz&;1}~EX{̷\{Tg}$Lph̉^͹:eA5 lu %y=vq/9pmnwo7wlD!)Xɹ777%MqoS}C7'm~NFC/kω@ɨۏc9=϶\X\_5ooy[?>ЏbSUE?Dܝvl ![t\e1^֕|zY;oꋈvlEf +:JPܩ *|AL*_PS ɝ:.ŝ:ȲE~1}WY!uܩMrZZWoAk:h5)A4O{P1QAd>LTԞBP͊4FܡitWL#\), d*:ȏ9Hu\SL('‰9^^R@S]&])t0;t0u:ȏub7=.KG+^M,+OV\[>25\zp?\I˳/څ13>T35as{0pSFޮoG<=\|9?qcͻgM^Q'TYDû燿ow_^X>7Mp"Jعź+Fdz/,Ix |O6x [=Ϳ8嶋!6}g[_ym[*>*47gG\Θ8Q-ތ%R^[k߅t>~>|L| rsfϒ|!Cmϯ\<! t&˰y|:M0چ2D:uXv~1٬ؖ['^ktqZy 7t"ze%5 īwsG_%,t?al> L_tJ~ Dr6o3s}WyPYDh) P_?!U_f[;ۭ.:gSEqz]Úv3v}.;~m|S-j;ymk`Pϟ֨;Me;s_;zԱ-M/C%jJSohܥx{5.In"휇i5z&юz~/zw>}'ݍþeҷogi[Y:.6=ڿti~ 2)qIN[bhMx%-fVr,dm\cN{e^q/vU7'n82a/d9rGzn_;]|߉%q xJn1+9S03<=6s󼳟JK[>u/3iz&;1}~EX{̷\{Tg}$Lph̉^͹:eA5 lu %y=vq/9pmnwo7wlD!)Xɹ777%MqoS}C7'm~NFC/kω@ɨۏc9=϶\X\_5ooy[?>ЏbSUE?Dܝvl ![t\jwY\'CI\@o}b+vD?0E endstream endobj -508 0 obj +534 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 507 0 R +/Contents 533 0 R /Resources 4 0 R -/Annots [ 509 0 R 510 0 R ] +/Annots [ 535 0 R 536 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -509 0 obj +535 0 obj << /Type /Annot /Subtype /Link @@ -6589,7 +7028,7 @@ endobj >> >> endobj -510 0 obj +536 0 obj << /Type /Annot /Subtype /Link @@ -6604,102 +7043,343 @@ endobj >> >> endobj -511 0 obj +537 0 obj << /Filter /FlateDecode -/Length 7530 +/Length 6460 >> stream -xŝ_KG)&*TI+-J >˽+~i#z~q12OwGTfedfS~/۶V^~k_WK^.e?]rNjR˺~z)?,U'}sE_5ijb_G]wx=}g.{ֶ5ev=!W`V/vM{ -rRkOu:pO2Kuzbڭ]a \ּ Yז YJ*1Ғ!;.Xib(ikZjO+ n{klCln34f%@#[dHO4 - ^3%{eww]*4@N&hk~gۘR9Y^(6KVaژ^34 ƴgkܳ\Zc^My+t@*es_;[WM(w+~F̽{^-<21R?X{ %1@+* A)w~1S^#R[xC[,^`Y x,KŮDh`I-C[,^׽Qukmxmx!a~xS{\s:hj:}:r:{\,dj nj K_2C6b^b^?xQ[xܽZGܽ.JXymS?:h4uЊFmu0׾P[x6:hM0w6!ݩ-洯^Z`^Ӟ0wi&1DmuІJu`M{L}%1]^rc^ ?o컕fb1ٌu~hK -nEcj1lbMjebQ[xAuk㽤upm՛Fj ͐iCy0w6۠}u3tOyrAM41w6ܽZ}u -Sh^mܽ{J5Sh^ { -렕\bKOj 97ytOy̽b^`*Omu0J`^;u0[sQ^}ڂz̶|:}~u0m;u0m s:z}u0DT3޽)uЖ2޽ԏC:JVʽ[bB޷B`{{ -W`r:9`\c^Slg|"cs_=ۗmtO[[1wyr:菊о`جܹI,oՊltJ.͊VwbxlVL?ӧLyV^Ho2 mseM)G:|}aĈ="#1R{$FdĈHr#1"{$FdȰGbDH#1"{$D=#GbDH#!2#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑐`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FHL0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$d&{#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=2=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{# F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`dd#{#FH {#F0Gbf#F0G=3F0G=쑘Hȼ|h>e:~h/e߮} ~g#sO9çO8^_H#!2=#GbDH aĈ=#GbDH {$FdĈ=#GBd#1"{$FdĈ="=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{# F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`dd#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0GBfG=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#!3#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑐`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FHL0G=`d̰G=`d#{$f=`d#{#13`d#{#a_rhWmo,ϯٱμoK|^}^mgc/ߌll@ϯ'~,f//:xI_I8㿟?_U } -e|'x ~' ?'K&/srf?^,[qx_# DZr~שKg-v~k WNyyO˞=>/([z~o'^ݥsɭd}j! a9b5>}|ILӸاitƯ]: J礩/ vǑu87cnn>v揬m]M'ֽt }QFks>-9tm-^Zr8->hw̚OF~KH4rݧ9?VzzNDI5iRǬNKhN K[.N=J. -w :6>4of `3O4xͯ,`DY0-4~n=鴀m:Fs8imw?M %3unc>ׁ qo~Oo״0f~?sc<ױr38†)_^.79q_4(#\h -SOyf-_VyFcVypfr485 r0)2wP'&d -pz]b++nݳM-5fܐ_iE=}˥k)>328/W.wirR4?}?z):I`5ؾ/6[K:KٹW PcOy.O~_Wlp;7ϟw?m1 7`wV|~YߓޟOipvj]1#sPa[[vF7%tǽߞKZJMcî>?[0liޕ$Nt,B+F毿#0Fs<7Îq_ KIëvlW+IǻGsxg.7E ~sXi"~'t̗\ږ9iy<}Yf-?1j|^Qe5ן"O~1u_O{?ן6!W>ߛO_%OSՆw$K#/oo2n9ѽŖƶQdK'[܋mӛz_] =?g-|9@o'Y)}xG^Q} -mz +x]MƑ賁}b^`uhazZ_FYE6+C&㑙Ɋ,ƴt<$[VKz|Vßqa=뭶jyl閖/ coչGCeʒ퓿ǿ~_~هǀ.FK :U3Twkn=WVXTo77=}Ϯ:N*95p}~H HH.!SBs]9]1uKY@`E9hgWr\BsSM"ƪ47,,45/A H!)t8tsTHQR^9hn +Fsc"fE`|L"&/-)ǽ[8#*ih`J{H=mN%HxOcYD(|͡Fd*}-k[Ex4E͵6{͵4{Lĸbi3.H*m(mX$ڌVHӗE=D;/8bKbKx,6,}/9EŢPE;T6*}ܪ̗R$ p_( G^i3B`ڜWXhstY! 0'}'Q*@JP rBT0+ILD X < =S@LxE,y0E,y0|;y0֚D,yE"1%V;y#\w .m]ł7iHKAEq`E)T_jC"BpoʉHx)nȂb7ZYQr#QY1pxWe]ܨ T| `~k5_|OUg|W!CL=2tb9$9#sGCL=2]=2zd1#sGS!CL=2tb9#sGSL!zD`L="0SG昮SG#c9G#c1zd1zD`L="0czD`L="0SG昮SG#c9G#c1zd1zD`L="0czD`L="0SG昮SG#c)fPG#c1#c1zD`L=2tzD`L="0S1]="0SG#sLWG#c1#c1zD`L=2tzD`L="0S1]="0SG#sLWG#c1#c1zD`L=2 1zD`L="0czD`L="0SG昮SG#c9G#c1zd1zD`L="0czD`L="0SG昮SG#c9G#c1zd1zD`L="0czD`L="0SGA="0SG#sLWG#c1#c1zD`L=2tzD`L="0S1]="0SG#sLWG#c1#c1zD`L=2tzD`L="0S1]="0SG#sLWG#c13G#c1zd1zD`L="0czD`L="0SG昮SG#c9G#c1zd1zD`L="0czD`L="0SG昮SG#c9G#c1zd1zD`L="0bzD`L="0S1]="0SG#sLWG#c1#c1zD`L=2tzD`L="0S1]="0SG#sLWG#c1#c1zD`L=2tzD`L="0S1]="0SG#S̠SG#c9G#c1zd1zD`L="0czD`L="0SG昮b^*NW#؏Ge=nKR)-ߢ^O=oD8Ko +=@ __`zkbv\vo?|߽E$ \opxS:A >cUү H>tp5~?:9Ł5}5瞗JQ\<=r;Zq;ܯKv}!QްilY[?mXy>O"o`>1'zzǷtIrs|f΃7g6@Km +Zj5><c?X<ɳ~>~+~k +#3 $j8L@3g~.L*geXܲ@Nۼ"ាhDv/:F&v+fϜ4g2d0 ΂F}8X&SWI= uXsO>|+ <ͧУΘhgLgwfl +ч5O2陧٭ř3Mϸԟ3uvC~O>jl^ fJ n|wN߸?'CŴMg c- +iԲv_О]5"!3>aNjj>\u9)LZC4rnC`vE_.jwC{UgK4&@˥ % +w$үwR4~y#P|1ó 뤽PM{|x΃ub!v=sz=]lU{'}m6ea[kL,~}gHRPosn9ɠ2cr} j/A3`۔%jװ0UC}X˱"5Yy/+([F1 dg!`ˉ'|wsA/|,y SC2ǥ{/sxD0G>?{fCvQ;4 ǖwp_^l=5Eu}zn_i=2P<=y^ʎi͉֛&J|e]_}^mI;O/N 7WN.=}mwwC 9Q`z8M>̯&F'O3a92A@#1Hgp>n*?ȡs~7Rz:p$~+Z.fAiO;+=@oR㰯{{Kش=N;.30)*ΰQgC}qJzaT?U/g#zQ;luh[,rә6E޺49&o  -ۻ> gOL }ً˱;;2Cj\_Ͼػ;cRڒbtD8}nSؖwevC̲gA<5y6 %^cW{j\o'b%[u|eh5ٲk{:?k7 :qІaЯ{eN'SNYqQ??[JnvD\/jц9ZFHc}Jj_k}ϰ):tFz_b`^ە_޾>bzgxꩫ`="t2 eaV)z#h䏫T6rB7<{[L4mS:U-Dܯ0o[ +c(+:eȢm3 {Qk<0qRBh~~ ySj$ Blo__B9*gǩ~Զ̿пm|^?voz?{wp+Vk[ߌ⢃(+b0s5/7VcUVk_\{ŶIV>KH~:$O!b<ޫ,E?ܫu縝sqlXb[q`i-Qm5+{/Ou51E| ! endstream endobj -512 0 obj +538 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 511 0 R +/Contents 537 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -513 0 obj +539 0 obj << /Filter /FlateDecode -/Length 2396 +/Length 1470 >> stream -x[[,5~_H/Ҩ%@+`jYxfxك 'kZ=Z89]IvNJ9|*?>89_}Io F:{ iG'<KbF+xs;BHɌ֛C>; ƏqxڏN7FHiڏI%fu qG= ƴuYui]R1m<ڗ3 ;?t;= dϿx>1۲3V ?WGaiÏO sO'1#4V[$Cm 2.eP~XCdWs:?sjȖ-j1ns>rN2oGMA"+|9:rU_<+K~ hTl~,}S[|.8u7>q{-">yy*mi%Z_Z?!ɢMJEb3ėeƓH@ d#.]&3,Dtqř@qN=e'YҨ,ew~T@DWrW>\sWZis?4.=v4{=5C{ݺ עL,bV%*񆷈A0WǽRTV1 "h <)&ɲaֶqkG*qxƪ"B?k/s?G;́c >6I]1aGl3d7֎,M4,9P+T-FKä|8 YLB{5R8X!Z8IM(Z. jM\=j䎔% ANMiI :nUlȎ!!Ol h?5kںIBV 69Sr/Fw_șD,p\Ks{6GȤB-4>ͭZЎ#!UpdD+Q@ &)y r߸!7~WҚg"\P^-GMfʧv7#a _ Lju+h%˜Xh% Bڮe720RLYbd jcB -IR5\˖1 -, -}o*]ĂyskkT[hiP~au|Yb&& -Eg_f˶Zr*6mJl'i,Y-EqdTdcwސՍ{F;2N}Ł`mg4 +S*0JК -{ϻ7%%Ֆ-vGJh]`N }wN(#vBF&ԁڑ)-7ZAwܞS80dC)+0XʴduGO+G+H`aˑVXptk[{YYtYOd18|T6 *m<ۀDxbS wy-[Uݗfmo&䓕ZhHRv,fH{ -v}&TV;!5) -Xf7a-9ﯳl`N؝L0RWQDNj:-+|Dg&06`,!GU.jETd`zdWC1}WMм lDWX]l|c;m%#e;ґoH7{7H!!]~S}EcN[e!$4/%^AV\ڸZ!"ł p-b~t 9k_߻EGc%Xb! fh+b@}J@EhyIeJ_&#,o˼.q?EYg#O`ޑ&=͂Pr,_}/t^X4ig@阅Π߼K4;uà2Y\V'*sQ0>wEc?9oO]9Bv”}9e_*Oy(,D0+M'N{ +xYn6 )% ȡh{@(zxöR~(ٞd &I>>qgykԸ|`VK|?σz-b9hcxSJ`/Oï_Cod:;r.>O3?3hSߛ q 0{x^Lnqp >0OT/9m^°0%z)8$X*:#Q8=Wոb2ƹsrΠN*A]3EtW4 Rվ޶lKyynxsyσb,3R J46Ff4@Q%8IOqh9Y!r92vMrh#5y+:t|Ymj{(' DyuT ')#99; Nz-.^#RJB7QyaV"(q Վy+\*E5JɐXRtBJ 1 +M*dB=+mz/ ++u˶:W-kg1p^$r )f'8w]VYN)A3aХ*IŜ!H6TfsZDu@ j>o!Yd2}W`p!]2? nj'-Rr͙6 %E՞w؜=ab E" :V+o&2Sƚ*kvg_ji۪ MR6N +8VLSK4<ʁݕ͸]@P)et-Qi=2:87ҝu9aٹ?< CM:,N336Iw-Jrl MWdf<#c q?(gx7=ON?y;jxvMzÜiq d1s G83+uAoyCAƒ? +z=5"U3-2LjB:^9ݙso972UQgnTv0qx2Lhs74isM0&s|`7(wA ?˖b<ǁ'[/w4ܭWC2R3aO2lWlWy$4*;?sii-NͰ4&Č=485rw`VS\4ƹlREEid ^[{ +zTv{O endstream endobj -514 0 obj +540 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 513 0 R +/Contents 539 0 R +/Resources 4 0 R +/Annots [ 541 0 R 542 0 R 543 0 R 544 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +541 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 461.351622 39.386457 446.337222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/Prototype.png) +>> +>> +endobj +542 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 461.351622 555.889134 170.818866 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/Prototype.png) +>> +>> +endobj +543 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 170.818866 297.637795 155.804466 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/Prototype.png) +>> +>> +endobj +544 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 112.638066 39.386457 97.623666 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPage2.png) +>> +>> +endobj +545 0 obj +<< +/Filter /FlateDecode +/Length 1403 +>> +stream +xX͎6)e8XP=آdyI(Iq!%F5$37?"L2~#8-^\pFƿ<ȏ?v +|x 7nv%wA 'nPJ֛4n!O\(h>&-ZuY(:yHB! l [`[H_rmK-܂ (=oX)њ_.qFꀓZ(iskO?ۇ *^~}czжP^,ᴇm<;:L8L_kM4D&%~6ݶG^5i-۾y^(kA֧uZ&=,F_FF'4- +0SR\/ +>0ʼ \Q2)?ߘ2ӜI\E`>#+$o.{c\ҳ4om paR638ClW Bv20ٜTtlp30C39N1J츗((Lט,b,)4F7~F3}™ KI6A28(JXYHyi~GHaH@Lδ*4g2YdSL+ Rd飃ox?tn%lTc7]hXHmJ)VCP:Pa)q OTCFevDrԮVoDDx3`2ym HaӟNT,+%?OIAuyRޮ*Zo*iC﻾ fǪug +endstream +endobj +546 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 545 0 R +/Resources 4 0 R +/Annots [ 547 0 R 548 0 R 549 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +547 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 415.240022 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPage2.png) +>> +>> +endobj +548 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 415.240022 297.637795 400.225622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPage2.png) +>> +>> +endobj +549 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 120.582422 39.386457 105.568022 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/TimeRepartition.png) +>> +>> +endobj +550 0 obj +<< +/Filter /FlateDecode +/Length 4360 +>> +stream +x\Mqϯ賀 ذu|5$wvG0 "fL#*2p}/{][1[,v,vmV/#_sK ń)]KNׯ/z^F6%% -….ߗ7~"j!rKaS wa;ko]S5\ZB,kjK73FW^vuzHǑ;޵8sv]f&9.L*LRAtlܤLBMeع () +^Z&k* pVEfInnY8njt#N7N6p@ՄI)ytSYΣ$4JPHM#ޘLx6!ewnXRrY֙s^@~M+A6HiT=sYx"bN WH̱%C#1[#0ыz4̭ =sCrO6/1#u)_$b!8Ĝ䞉9FSČVČ|b*kO;/WWZsQe ɽs.{%TE%XE%PJ$w_.IP\z>t`о\P#)#7bZNقE'dE!DܩdwJ XQA&Dŝ*SAtAq9e=Rs,{fDHVEQHLJZT[A(0Rх;u0!SUu01/ ՋNLf;u0u0B/Š:*S;u0 1ԕ/pNDIh()`|Aq8"IKAOWҢu0Rܩ($w +ҡ|A 6uj!SmNfȻ)_PC Gr"ZqZ- 1c+_Pܒ;uА~w`Ҭl*l:fʦæ$iJIQ1YM{2bF5*|&ʆcSܑa1# _$`_$ &(n 0:ܡn+ !fdŝ|==3Y"3f H{dO;tMRV1V6J31cfgbNՔ/ +1 / +1:Tb&CS)_@;Q:*_@ L ɽsC3E#fވUވ9`lP(`Ɣ18Ėܡ$CБ{`SPn)b LqČV1rSPuXM*yT=Sso{JzU:KW3uf=S1!T:CAj!SqCɝ:HrBՒze{N3N`ܩVh0R :ܩ(L$w`3ue(~%w zɝ:l9u0BUR#+eCQn!e` Cg`2u0I0Lrnj]=SC jO!S\:N +_P"Q:bR{ +:0Vܩ,;uFV:h=L4;u\ɝ:h(/)_P N!ubܩ{7 N n* n) +6u|ԞBneC\Q6Ĝ^R 2a;ʆ0l2O$:;';'3:jO$@'br/$bx+bLLʆ'0%;ZsBrDa#ژZW/=$+w%J1HCP%a=PLPܡ t0֚Ժ: B/1 +R1cVwbEc1'b*CcUrHhj]8 /d +t0"%AyHPՈ*'|QH{BJ0Ϝ3h=JD*OBܩ(Z%w`.IW`lER11ܩܩn^LuAPQS;u05T6^ C:P!˧ 9uɝ:jC׼<4:ԞBR.TRQhJA@;u+u£*uISrbKAZWA8C)T ԞBBr%w`S:j]RC/jORC+;u0w`+_PfN pNd"%fLߕ/6FTqH>$wuܩLWUS{ +:h%(:h9(:ZWoA~1dꠅu,) 'IrѳZWo0ZV{ +;Jqh#1[$T՞BČY>N̡IM%5`裫uu6= ::F"j] [fsIپBYl]JX^z g.x +4[ۃoܾ~~Ư(/1i_+zY^yjko$X~ n:9_ ] w?K Zv|?/~5Ar? )}̆H3KClx |M_->@y}ѱ$qHzB$v)(U\G?:0.>s\916&;999Ů}༹:w 7 +3f}DA +tF}Ȟ`K:mfavnsܟt)eHqAۚx9=8nI Ňc_]vv]`u6;D{IqҮƷu/wfwM3W2#>z[f}z,|x,Gnjȥ3=-QΈ*'HQ}ݟ;ֳ(_#c:kSW;{g/{mLEWTN, Ҷ^\YrQw箺$OO=YE'S)W+Jاq/ϩG3<栰C#ڽxx!&CҞ_fnrBAIméď5[ ̵?;:k χ} TRs 0H26̵7SoQe?g}G* +oM"y}]* Տ4;G-:9!)å1 CKҵ)JyfcLN;sV?v-j99JqW]5ϗ}?P-:XYWw{17nHoON=΋k~4.)[QaMkO!lUiscS}5A&3=@/AIYni~"Q+ۣ¾F ~/“aYz8i luk)'Ca}R:cD>ONkx8a}睭c>+Vޏu٤cyw [)е}6kykN״Y?3ޥeZFO1/?P߿cP՚Gg׼Q~1=%e;A.ijk/?q3 1秾T8O\~D > +endobj +552 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 622.493168 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/TimeRepartition.png) +>> +>> +endobj +553 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 622.493168 297.637795 607.478768 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/TimeRepartition.png) +>> +>> +endobj +554 0 obj +<< +/Filter /FlateDecode +/Length 2393 +>> +stream +x[]s55!ҨHe5] 7"_ɇ:Z.Qgړql~S>^>~;p ԣo F:{ iG'<KbF+xs;BHɌ֛C>; ƏqxگN7FHiڏI%fu qG= ƴuYui]R1m<ڗ3 oU^s_<DјmY|珇~04'΅9駓[-lw!붆`2(?!995vdd@7k S o9Z'ͷ_룈 >a9*^]ϥMu?D4*K?c->sW+?gw H#yy^DJ[ssy4!9֗OAh:Ǽ|l ޻xI2lĥ˄}&% 8Sh7ɹ$2K,5jJG]kzJ7_>Cl'Ac.Y/|?g;S3:׭;`-}-Z">h%zP)Qo)ox suk[\q(E@Hkc +"3xj,+kmf{ncerLB_\ǽ梗N +Bo?Y_)T)~˷zܲӋm--_?stZ8 cxfq6M_x3hRD; %BIb4L*ϐ$ZX#ӋŘy ԄZ1Yr٠$JN^IH(_r n[ĠIVņd˖S!+)n% Nn#a:k!G btpIhA:U4msL*BZh.zEj>X KFAOk~ `B;l78h-Gl!(o] ]rCwyU=,y&W׾_U<3l2S>뼁ԯ _*Op?F^D+1XǪD,(1]@ %v]e\/ ,LGF7I el κ#QwRhLaZDeyW`UTE%M~Va'̛[\ڲE+N% [#dς4WE61Q8v/=+<o"0]պS!mUb;I`,l-c%C%FVnK7ڑu+{n~?yd_\RهTZؼV{޽),\ l)Xk>O%<5Yc! 9pG8Wg=%.u c;'*sǔ +m-e`\%ڸ҇x ,7 +gnMG( }}-S)DC!ݻA ѷN^~pf/bsJ( !]T|)T>f +Ɲ +1(d0EWo͇kqY-:+ i1C\S* +F˗Te=n0mA~'|QY,wdIO`,o /t^X4ig@阅mAyߗivz;..Ae3γ`=NT2 +qQ0̴^>6l=c)Rxro2_(2fbM +endstream +endobj +555 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 554 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -515 0 obj +556 0 obj << /Filter /FlateDecode -/Length 2738 +/Length 2734 >> stream -x[ۊ4p[, '`~3_9`!Z%*!.=RJUJj~d 85rYI=)|~=HX5Gwh[8gB/\oo\,c#B,{t_Ž?p mCCÖ@"tD^gnq9o<'T^0&͙11'_9kmr<|T.<AG>>ф6-߫DZ"_t~,3įT6\*_&9*B?ӌmQ~M~:~3Ԧ 7mFEKf.Wqh:$ -4ዴ^TA V \B:lXVe+WL:+6*Hh6F|&̑ -)6 -%ciEHWcY XȂDV`$f8v. RnUlrAv)͵s*hu6PXM_UT -)E oBYwR3xmV&NzNj"Ƒ3|Ɠ-F?#NܓB0&Ztq15A=#!vmo'.&KʁTdNg'd&ѶoyFlZ!W[fW(Al7 -1S4Cs T`ka[#u|S~ -FǸD׌Bwk$0AV l +x[kt >b@N|2BBI Ral'RHe>-d=3eYGY?N9o:~=j~RMj^]šWr;-3!ÇR.ZI~8[/˘uȹ8{c×g>\DT%zqę[pN//߾#󉸔/̘^ɘRᕟ6} m|[>W x|ylYng_5lǻ5W3t|fMoڌΗ\&Т%1u1Ix[Ɉl8Zgs@텣eU (> +4ዴ^TA V Z\B:^lxk+ҲsyD{[zh<h1Ǥ9R<3F^d P:Hj,x^@V:+ @YpZ*$LvnAA M.Htk.EvV-P +Tꃊ!%waX +*z.1oPPq'e^Nza>0F nUh-la-q"bIOp=F'`$AOMb-qk@ zE vmo'.&KʁTdMg'd&ѶoyFlZ!w[fW(Al7 +1S4Cs T`ka[#u~S~ +FD׌Bwk$0AV l ѱ@ -&Dw`:.Pna0݂W 'UUum,m2K`obkL9'p=/f=Gq!ڽW -6W*hU+kG.I»77+'$cb>V sRkzGg$] `CU+ A4hTh 1Hr41ASy/IzIQ'0X*~Rh[MC+Co}nЈsLכ!tBdM==S k4 KD \RbIQ-+)a!'!B3eTh~BwOwijF2ʉ!7јUIAGD˼hJ}լ$c'Q<-eL4 -aUTZyk7. gD$M͂AI2]Pg\s}a]#"25sj $)B0Q(MDح!>2ֺwMa7f! -LJ8fqm3YZS̼ˉ-cYmsD.iLGr@S{;N $Jh >L6Jz>_3)dz>Sc|ȥ|O,iV p|H/!)"l+]ҳ&Ej"O=kvQmvxڝf۴tڠmik"n8_[A:JySuB-aϏSI=r]I9f8,k1*cge250A -QU)UZTwm;8ٞF_.uBo3+OA،1U$%YFs$R.ڹaޝpUf4 Pߟ*pJ.Yu8uAgV Fo6T -4TQ6`@QMRn4u9.Hvx0Ts: Ӛ1&l`!mA+)J+I(" N^ ?(6`2 :"9֢J㊱0U4uHzj2U'4t2m⣽4 8ܽa6{T@A,Y3vG'Wd؟2ȢXZ\yzxo J^eu|"$^ʢ@&(k# B?pȈ:0[ƣcxOgF0B§3𽫧>'ӊAR[N`~#BkNzlQ/f GC`u~ 7Vj0&`cX&8-Ud$!v(]S,ӻȋfܛܔa\8nQEY0~0<5)9^Fo8}K^Gά[|}ᓳÏ-p`&֒x>`x]|<20) s2S$c Ck_2zO +&Dw`:.Pna0݂W 'UUum,m2K`obkL9'F|%s”ctgbREkZKaIGYtgEsu~]3~/+2Z/7$+55Y]U3Ay"mTǤ@u% -փֵllI-?%[ Zdrqj䠧8=ŕpZM9ų] 7][C_…q˛&ҸG݀ܬ:4PP[*PAцtJjeMu8Vx&`01ę}L `NJapCjM\X(KQ}lj[5hU + $8IT3fx;h*᥶4ZA3)1Jf1K\/V +-~yk4B=vH=g9y"JW)@3x߮_NXiͭ(N]mKjYI 9 8\,mF{닭-x~i.rYE P_t J̋DW +I2xТX6.PMhvUIKUNpAD2:,xddO+ezŮ:KF+U*1.R+#[X;w@F1b(oPF1o%znֽ3l +w0?7v=V?ı7ӧ׎lҚ +fG]nd|lrh륜#rIc:ӥq/O QDer@W ?L5(Iq&#Cn{fOwK=0Qrq+jQRn!R2U/=kR,";DfwilvLKW, ږV&<OQq Qy {T +7UW0(D9F85)^J)6art]1f{`PςB\ꄆnM|fG";fܶ"2|7-b*#,=\YX ށ*%;|}o~~E +eQ &(k'#S ᢑa!t`zG( `/Og{WO}wlO+EJlzFu|%EuTK0B9~.0҆ةpÜ׃1-b jTv琄8vMSME^4vKM&ͅ5[A` ~ +3^Oe'hU|̺Ňg>9 !1(:3-2Y6#LEÜ唃kz;ڗ iC endstream endobj -516 0 obj +557 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 515 0 R +/Contents 556 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -517 0 obj +558 0 obj << /Filter /FlateDecode -/Length 2549 +/Length 2548 >> stream x[[,~_1u@Bp yOjJ*U=ӓ]|gݙiuKR4()9^~:|~͇~>h?hwh& eJE'k{QO^QJ&+ vC_~<|s8-C"CG@M|;H0xH @@ -6713,56 +7393,402 @@ Qf (ަ^<#lG܊nx\=@+FiLtK']`?3\_6y`Q*[sme -KwK\ܜJFgR\o9VP=;0Q'탪A1\?28%nY\;4;QVw| xEX;bxy؋KϜoqdTS W' <]6v\L Mi0wq=%)0k@3* El RI zFc&!ȱ`8~M)\vDW%c\)C8q1ߵ%+U#\@5-`=m(Y޿Tu(ҟr +}~YsMRl]sqל!X2Z.OJRE=CzFNHnEP0nSYy:bt wmg`JP(w~aK9Xz[(J֡/kfJT +rN endstream endobj -518 0 obj +559 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 517 0 R +/Contents 558 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -519 0 obj +560 0 obj << /Filter /FlateDecode -/Length 7627 +/Length 4893 >> stream -xѯܸuW;DJhP$)$AЇq^6@ϙH}AƮm73)곧d?Lֶ|tKW˿!KݖO[֦=թ])|YJΩ>O~??/54e-NLOo钞_>ݾԖeʚ.%O[ٞa3a|pc-] Y1Ld5$u2TbkR* n*bMےg@,ԖbᦺRMJIW 7-5e@IYҨ-Vy^gjcJpSܭLbVFmaN`+Vbs$݊_sW `\Dm<^9a^}&C{ zLm5ЊLmEDݫ_̔A^mAp:Xrge^(`+b:Xl:m1{J^s[1wm1{kmAf至A;7렍 A[m^^(w9%l!S[xtS[x=\-`aVl1mX=fũ-lݐr͢)1O%cN6!b%c~h/s:1wncb-bmxc0=#GB#1"{$FdĈ="#1"{$FdĈiGbDH#1"{$D=#GbDH#!2#F0G=3F0G=쑘0G=`dLG=`d#{$f=`d#{#1`d#{#n#{#FHt{#F0GbF0G=쑘0G=`d`#{#FHt{#F0Gb#F0G=3F0G=쑘0G=`dLG=`d#{$f=`d#{#1`d#{#&{#F0Gb#F0G=2=`d#{#1`d#{#n#{#FHt{#F0Gb#F0G=3F0G=쑘0G=`dLG=`d#{$f`d#{#n#{#FH 0G=`dLG=`d#{$f=`d#{#1`d#{#n#{#FHt{#F0Gb#F0G=3F0G=쑘iG=`d#{$f=`d#{#!3#F0G=3F0G=쑘0G=`dLG=`d#{$f=`d#{#1`d#{#n#{#FHt{#F0Gb#F0G=3F0G=쑐`d#{#n#{#FHt{#F0Gb#F0G=3F0G=쑘0G=`dLG=`d#{$f=`d#{#1`d#{#n#{#FH 0G=`dLG=`d#{$f=`d#{#1`d#{#n+zҹ7bj#Yp8\ç O޶GG98nS #1"{$D=#GbDH#!=#GbDH nĈ=#GbDHt{$FdĈ=#GBdG=`d#{$f=`d#{#1`d#{#n#{#FHt{#F0Gb#F0G=3F0G=쑘0G=`dLG=`d#{$f=`d#{#!3#F0G=3F0G=쑘0G=`dLG=`d#{$f=`d#{#1`d#{#n#{#FHt{#F0Gb#F0G=3F0G=L푐`d#{#n#{#Ht{#F0mGb#F0GHt{#F0n#{#Ht{#F0mGb#F0Gi=3F0G=L푘0G=`n`#{#Ht{#F0mGb#F0Gi=3F0G=L푘0G=`nLG=`dv{$f=`d#{#1`d#{#n#{#Ht{#F0mGBfG=`d#{$f=`d#{#1`d#{#n#{#FHt{#F0Gb#F0G=3F0G=쑘0G=`dLG=`d#{$f=`d#{#!3#F0G=3F0G=쑘0G=`dLG=`d#{$f=`d#{#1`d#{#n#{#FHt{#F0Gb#F0G=3F0G=쑐`d#{#n#{#FHt{#F0Gb#F0G=3 WAG{y(H;{K>X2?'Z{c4e7j+q9:t8OTmqS j-totiՏwou-{7nwW?/&˻w?[B}Ml_?ۯ?cr;m9{}kty?%6vsZ\?܏yށݏ=_k8z{m5q{l!?c1Oq竞i}~umm[zC.CdO|?/ac^i<$7rن_v8هꃎbǞd:{#]O=?{s;toyh1k,{C_ߗzÍn^n1bٿōi˙fs1[o껞; =T,jI߯qS{?nZ=Mh~"iCK3뗤Nr\V]\CWɏW -ݯDo0 s}XX+g?'c/Cg*|=cؘ6Ѿ>4 C~2!{OD{mrÓ4L'eHx,K5zUC_c#AU-9uW {|FWmp}=ny'04=s(^ {u]5v"j)R/mZ7/6+[Vտ~ݿۤ뒒OUn\lh32PJni^Ic._q1zOc6}E|} y}^N{?t"_AAzc>}ag4Io=ŏ{z?w,r] PǸ|c>?{k=Ɍ1}Ѹ}1C eF>e$vosӗޠ/Tqc1i^}p{OדFB(:1{ei28~oOhb缚ō:[ҫ¨r}UX?ψ`&x5<4bPqck9XOVU)ژڃ}hJOؠ%uހ缂?~Xj9ptOi==籮i>_Ӝ/]>qf=)0}[:LCZ`rR.0% t}{rǸ}YytOypkeqP?_>Q;;Ύx't/Ͻ/W/ N]烿/?Ma>8-Y-ERgIZ_ol{ҹw4q<x}/(K9zOJEOgS<֯&Ծ$'8fi ^ï5>a s[X?8zMG}'Bsp gU]jx׭xZ7׿[_8f| -8u_M׿>Word{+g~3ӏK;3nq)v8kIT%nAZ{'M _|~-YZgi>O~nQwsC-Hν7 ] -f +x]]%q}_ςd0^3B==zVsVVE:E3vUdDƉ^Kz~'wbqa#)[9-[ݼw!o9z<[u}{i߾{>AG+ϩ[S0/羿lb_oӼ'+˵ڭԅXX/7cẃo]÷?p_>plnpqná,#ӄII \6)UaB.!M0\rp]-t\W"]0!Tp@%XJ)ҍp}p] 3?'L +M"izst5`R|`B+ҝpSP;Ɛ#!l|L"ܰqQ[Ow8UgaSs=1''XpjH9Ab{ f$̵|05EZHt=&ڸ|K"s^a"%D!8DmDH_ &➁(CRy (^*%e H^´31,H)17B̡B̾T]!|Kծ||K5K>{%fiĜWh]VqHIT@V2;%z|A  NdV) D  _ 8 )d=PfE&:{Qu0"ScI"PcM"P@JNDVAtF]:Q(N |A n `8"JAN ieC16 "Sh;u084J}Y:α8"IKAOS\uУRܩ($w +Ү|AG Br$wk7 0Cޝu08"|$wCD+AHeC̘A(NtH?;t0|#T6 65GHs7Jf6(3Q9YV6 _)\"BcC+#|hrQ(`]$w lt|9c2+bFvQܹע#1C/"1U츰*l(GM(CYD `暳䞈➈9|C|ٗ0;t0^t0 AE:d%w`,KSŕ/*1# J̨J!fF3ZƤXbKkܡ}T =( 1S;1#N̨ܔ/|A̮Dԋ➨U=QSj%=QQDL):YqOA4j5=QѨ=DD!6uܩ($w [-'`\ 0cJALfɝ:`U:V L0R :ܩ(L$w`tY' e(~%w zɝ:l9u0@UR+eCAn!%`]'`p])p6Nr$woN'꠯^)$ꠇKURYIA_:ASHAfXq"HAדZWOAײSHAOq˕ܩukAd:Bܩ{:n:+p [&ʦv=CaԺzvjO!{bb!f(br/){b eC\P6T+*`nlf trԞBT#1'#1S 1SxM"f&MeC̘p 0WʁV6\i$l.CQȽ$x6NLɩ=$w%BKWȖqA)d`=  eDDQ|QU^]ވ9dv6(1'bvEr܋DPպ:8 /d2t0 %N̩KcW3TNPB@):i*Ϝ3h=BD +uND*SSj]PBDc$Sa!S!j]P/ Pɝ:K*XZW/|A,Osl;uՆZW/A43jOP)*(4%w + ɝ:W:Q{ +:xV3&NDuB3ԞBH) $WrAV՞B%w(AWztANpNd"3w =8%wkNru*ueWK^qA2j]RYcASA^x=JA[R:{MjOaAGRܡ< bNE@̱=<N̾JKAzSxlZS{ +:[;t7:ȣ"j]}A ڙI-3>~O,/[|>Cmy>[??@l?;֘o~fnkz6knF{CD߸7߳3z~mm^Nwl :({0YCz7`ɩ \= 4 @ZA0`󫣃q`y펳x@+;횙,kgm3yc2f2M64EFS_^.Qcv-__D } lz7?x#Ƃ2Oux5L_6=3 61@w3LpߑVbœ3ĭLP`t&JxdRwwuզ}:45\+=5/+\]q%o]/WW|7Ń%ϗBFwM5nwχ R5rZg~XF0rMC)6"jOC^Mm}@^-cD3{=xUy{xCyV:{8iµd ^ǭ?)\TA;RpN)Y9+WkF|枿,͡-ˣmX}99OKMU2xIi]L&} X{x?]`q\ZF'',` ?Ǥ>OY 5x񮭎aWB#)0}_/~w|Ek=*E+JIJW'W{ ~9Zx3]= \_I====/|%p {^#wkLҟ%:|.=$v,gJC+_uޭ_s|5wNVs7Ei-vfO҇mnܺе9>&~P@_t1_[n4r73vڬa{ӟ m0m:g~ǚ<{RgH99B! +vbd?}`#- ȯKIVn_AY.~ p[߱ 8pm*^Kgn!z~?7H7 endstream endobj -520 0 obj +561 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 519 0 R +/Contents 560 0 R /Resources 4 0 R -/Annots [ 521 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -521 0 obj +562 0 obj +<< +/Filter /FlateDecode +/Length 6462 +>> +stream +x]ێq|W̳րCaɠ - ? Eh H}NeU_2f_3q3+2;fZz-n5;!vl/![9-[ݼw!o9>_{UjOއp˾OgsO_F[X[>.ܭw , $E$ $$lHq)U.!Lz@\r"ZUu0$"T @2+ 9`o\= @.G ǜi!1Hu˄G=sƐI!: +}L$$";1J Y05{͂)Qs{؜J"6H(|͡F|=͵b!u=t,QlSߣ\Kb,"='cHYF"f)_,Il.2 Yl.-R߅RY,R))X% Ssc(9bQ`/aͮR߅R.̗rBO% ᾔGb %> +`srŢ2C`D'|Y,B*$| b23AHD P'A!y)&{0﮲?;.̇zĆzĆzĄL Q Q Q Q 2#6D#6D#6D#6D#&dGlGlGlGlGLȢ!UGF#3#Qz`T=bcz`T=B0!UGlTGF#QQz`T=B01S=B0!UGF#6fGF#QzLz`T=B0!Uؘ!UGF#3#Qz`T=bbz`T=B0!Uؘ!UGF#3#Qz`T=bcz`T=B0!UGlTGF#QQz`T=B01S=B0!UGF#6fGF#QzLz`T=B0!Uؘ!UGF#GF#QzLz`T=B0!Uؘ!UGF#3#Qz`T=bcz`T=B0!UGlTGF#QQz`T=B01S=B0!UGF#6fGF#QzLz`T=B0!UE=B0!UGF#6fGF#QzLz`T=B0!Uؘ!UGF#3#Qz`T=bcz`T=B0!UGlTGF#QQz`T=B01S=B0!UGF#6fGF#Qz, C=B0!UGlTLQz`T=bcz`PGF#3#z`T=B0!Uؘ!0#QzL!UGF#6fG& z`T=B01S=B0aGF#Q C=B0!UGlTLQz`T=bb!UGF#6fG& z`T=B01S=B0aGF#Q C=B0!UGlTLQz`T=bcz`'ؾ!UGlT NlQz`T=bcz`PGF#3#z`T=B0!Uؘ!0#Qz, C=B0!UGlTGF#QQz`T=B01S=B0!UGF#6fGLIpeܛkQ2KNYû,Ǐ+r8"^<{j{?O/NvZ Ŕ7p_0ް>o_?y؅1~~/_'h\Euz:>ǿR褃r_Ǟ,üݾewzx>mP\鿞>zz/\_= pq|7ba᜿_iq8s/wx~v1i=7=q=6czq,/ǎAXׯacy\~};=082j`{dcSa5~`Gз7`gA?]3,y$s|ۮ#c%z-70cbl?6xpLiD1vxͨ1χsl5l>&iV mDz3T8prwe 2[82 tۛ3`l779-n;qℹ²6]X+>qԸCVEehguh(?/[1uN]#Ck56MyLF=-#e;r{:՗*;"sy:pxG I~0133hnvs v Lo>3uMqv oiTa_8%[2AԼ#1)k3smu$Luee^%([1Vy~7u9lpw2$B1~Jy>yFevVft2qX5}١Cq=, ET4m[]E-8-EO&vt[mv$:ѴV+om<ݽ.ևc̺sx>ʤVܱY:>% dv?bejwq0eq_^vg4룐ei>r[3,ǻco޾y]>%۴}gw5xCOYC(W5o-UPrƲ=jEufU7bؤ$w&"gZ3sM?[25jm8<+KO<ϊQ);$(iN/ 1';1+/ T̾Hxh+'sZz1a *ȯba-Iq>4 Ţ-rza(ٛvRN?xu\k#XHZ i8I2S[fU $9E}%kJ 5Nƺ؂ԅ^dqru.\6l#МY\s\{7z>D\vվZ|ZKjaˮN+JzwvYg"1s^n.'|mQ+_HZg*ɻo|ƴυ|\uѥJ9/A-[r(oٜL.*aMĶJތ7|汍/?~ܓKx,|yyqkV7wVSX5;@,B?b ?pfQ㽸Ka:MmY?۠uUM]m^~(:Vcndxw8>JMra3N;0|x/pDZy:6X 3 5 +endstream +endobj +563 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 562 0 R +/Resources 4 0 R +/Annots [ 564 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +564 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 80.563602 39.386457 65.549202 ] +/Rect [ 39.386457 138.948222 39.386457 123.933822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/Vs2022logo.png) +>> +>> +endobj +565 0 obj +<< +/Filter /FlateDecode +/Length 1007 +>> +stream +xW6 SذC7`萡]8ɟbQ'Kq_&pHH8|A,ͧ cO_q2N9"ч١W 7zLMq F9݌b s9~?^,`~tCTr\1j,{ ~M+/$.dq0g֤@ )(qD~w(f%&XLW^{O4o?#0#zLv`̇W +0U*AYElD-F% {t"K'.e>2\у=f7,+d Űd \$p2. +Edx1c* ctnzl]^.Әo8Ϋ>ۏ2+Ռce1]1i8]tS^[^%s-d 219+.2*W( I'4%&`b*6|:nDr]sȁ:RE:FVvZ:Ŭƌ+gP+?8[B94ET) !Z] 3OٶzjCV.7^o=}+z,-:vesWfl2Fﰳg3ḃsE#Y m>~w0fO+gˆ=_,v:svu,rW?0YL*{<ݫVMtMv]WQj=DI0U_ ə2t&(ئԏpw{Fk)؈G33ak`441nd`yQq܆` 9?IA18XaCПEF H^aXLT!RT~6zaB I+?:݉3^tAS'u >EpRJ׃=w ]0ߥ=Ʒ|Ä Q +endstream +endobj +566 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 565 0 R +/Resources 4 0 R +/Annots [ 567 0 R 568 0 R 569 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +567 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 309.386457 501.023622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/Vs2022logo.png) +>> +>> +endobj +568 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 501.023622 297.637795 486.009222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/Vs2022logo.png) +>> +>> +endobj +569 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 273.875622 39.386457 258.861222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/vsCodelogo.png) +>> +>> +endobj +570 0 obj +<< +/Filter /FlateDecode +/Length 1265 +>> +stream +xXˮ6 +E=,i7h fE[R2)ъ}sgmYyͤJ)ӧV4~EN.0e|J&)s +s:N_N:1;)NX䐠0S~xz7nѺUBY2l?TfڛZᗹU?5s/ɺ紸 \s"Z-Qj o/-hQdS~?LfE/oOxοOBFۙ~Wu6aox@~^9է峉8/xWC*we,xy$`@Jl6_kC& $cYU.7+ۋeI-w>I'=&7"ѦN.`|u`i CW#iraլ;FlܐXǫeQ8&,#aي "6uT*icZJt<{ū9KǸ1-iFdUCU}|a2&5AG$;Qd Y3?lBF-_eQwgӫI<{vXVR;$&QTMG-)ޘ-k=&NVz G*EkZTyXG wt?veбv]l +O<&O!Q8`H9v8A2/faa"Wa$3_wZZHo+cr93n^orNJgYI7zP'A2&58A69@DE/0^ZQ6.]/K]GI6s|{}x:(lrO!F71|{2wXܺX\oHƀchzߝmB^Y,/r_3ӑ΃[4!l4J-\1 +TɇFP>)YDR= Tp9wRV]c7 +38cނ;O/ +endstream +endobj +571 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 570 0 R +/Resources 4 0 R +/Annots [ 572 0 R 573 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +572 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 499.886457 310.523622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/vsCodelogo.png) +>> +>> +endobj +573 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 310.523622 297.637795 295.509222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/vsCodelogo.png) +>> +>> +endobj +574 0 obj +<< +/Filter /FlateDecode +/Length 1703 +>> +stream +xYێ#5}W["" -LxX./Qv첻ɬ6L:[US$ଙNObv z4?R;|b)7'IœDR9#NNo~d\OEUӟBhy3QFXkgs~bh6u%G-h,GMCUaq1Ö{lpMoO="i!ncrA 'FadQs*;WE} a岆gE=-k ӷ&7zut4m$&ί?o#cBX9M)Ro !j[Hhy~6L$p>s5N" "1U CLfAvI*m$SGX0?'!; +\~kBnU5(mLo|&3 pr6l'2r\7 +z!w +J@f@D\lɐ2HE:l (~o`YԗրM?cgh= ]Jtw+O cgfbKe} !#/ s"<ܤ&Q +78|ɿLRFMJHc[oc% ,j=cv nk@t?C<vAE9Pq!Zrw8O!xX;Z )^$2B6<]mŰ#B3vCz}]K&u -i81&E@b`Ż1kexxza0/^Ân/qc࿐E<Ϣ_2}sHq]ʨe!O8 +HZf-Qxo@^C30Kq8<2; +EIwyC8рx 7 +ZT^&v5^zEľ~/2'4؅3JPOyX“TDz0=X1y,bQ@dt`]yPM[߶Iw3X|CG,ŌѪD +}cJ(W2`mL0{Ck׼NڣdEg{%{FGaA[F(Qe{7EdyTr^E; +Qi=ݱkkJw^>wGÝAD䠚 +m)g9#hhQaAcpX{j{9v{tWC(MՄ8Gyb}&Ig;hͦ וs N2+^(DDTyW)[ [֕`(;'*]t +8aYlQnDi/4? (iMv,n@,lrL(НudS ctc +]yxFlvJGCI.XxѐZ>M]~']3,ʿ>8+l  ~uz(Ddrߙ$VSmYB;x񜟃6zH_("6ж2tYǧQ8DOF8OB9mB ER);;G)(=z +endstream +endobj +575 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 574 0 R +/Resources 4 0 R +/Annots [ 576 0 R 577 0 R 578 0 R 579 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +576 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 746.625222 39.386457 731.610822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MaterialsLogo.png) +>> +>> +endobj +577 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 746.625222 189.386457 596.625222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MaterialsLogo.png) +>> +>> +endobj +578 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 596.625222 297.637795 581.610822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MaterialsLogo.png) +>> +>> +endobj +579 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 245.608422 39.386457 230.594022 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/FigmaLogo.png) +>> +>> +endobj +580 0 obj +<< +/Filter /FlateDecode +/Length 900 +>> +stream +xV0 +dĉiJ@B:; %iEIK +]d}]_4+IZ8J"1]"OVu=~PTdQ٩N݆y=vdNEOa$,S>ՓN@g^i6Lӳ&Xn f*F4q 7^*_JՈlQz +˭''1ld-xXE#VR)RF q7?Eϩt4ܼkpeWdx!ŷ27c +endstream +endobj +581 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 580 0 R +/Resources 4 0 R +/Annots [ 582 0 R 583 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +582 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 254.520945 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/FigmaLogo.png) +>> +>> +endobj +583 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 254.520945 297.637795 239.506545 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/FigmaLogo.png) +>> +>> +endobj +584 0 obj +<< +/Filter /FlateDecode +/Length 1045 +>> +stream +xWm6 _ʶd˰ \irnr=J?L3G۲&Nf]IzȒe=_iaԊ9x0<<\c'yW>n Ysf5+*Bk_!`GQczA+?3d> +endobj +586 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 629.129622 39.386457 614.115222 ] /BS << /W 0 >> @@ -6773,40 +7799,11 @@ endobj >> >> endobj -522 0 obj -<< -/Filter /FlateDecode -/Length 982 ->> -stream -xW͎0 )8cGZ4$ġ3;h%4iN.ff|[<9Q [YCh*{>t %tL`N=Lzo0xoy>v߻7d-1{>"FSl"`]3 -m`ꂇRa>~,K# ǻ'Q4tMù8=UFbh^/O0ZBώMp.ןuå|#?Q*< -XTDkF?(BMTa[/c>88e#$w.ge1o&%Oc|9@&oU*78%ʷ - -ݍa!.G}.cCQ"kuh,1E%F aTPmǠls[OLZq sP " ghJt#j@xK -N3X-A]o3 V"fO&whic"5 O\<%E\t8׌{ Љ!X]V -N.2VUՁ*@(FQw**K[4`ߠ:UeLVK*'1 -H0pT 5'728[ZdPWe[o"m zU/i4β%6Ȭ65טS#5Oj3-x\|k!A6"KUh;J -eIle/lK:VKc%\EQ!PuѵԼ%kN;u\݂}ƺ"438 I3m.vҧ oS;>utdաRr >8;KGk d|ˆ ^tKt3#3A`c#uTPi$)gF^UB\ |h-` ZA]p.&4'oR9iBT<餮}]Ƨ}:SQ -endstream -endobj -523 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 522 0 R -/Resources 4 0 R -/Annots [ 524 0 R 525 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -524 0 obj +587 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 231.326411 ] +/Rect [ 39.386457 629.129622 555.889134 89.432411 ] /BS << /W 0 >> @@ -6817,11 +7814,11 @@ endobj >> >> endobj -525 0 obj +588 0 obj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 231.326411 297.637795 216.312011 ] +/Rect [ 297.637795 89.432411 297.637795 74.418011 ] /BS << /W 0 >> @@ -6832,43 +7829,43 @@ endobj >> >> endobj -526 0 obj +589 0 obj << /Filter /FlateDecode -/Length 1841 +/Length 2264 >> stream -xZK6W,|(^lE7)CjRl‘,Q|8KA*c -ϟw_vR'_|)?6F>(EcȰq]~>$#!RZ .PQ QA?>)0ˊ"?~޽_^ey:x Ŏ')ߏuk6wpਗqyp x_/cG2&sfy{wKY'^./sH<>)d|{!)8ˬ6+9\g\i@ .ep,)O - >V&ո" E㘬-皍CӺأnA)).[Apű&QU,˞ ʋ<ԱIvUN:q8y`ZYy4eʐg6t}j;.*!l*5W<*8S>H\K16iy#'8X -l\_ޫ:<,7יd ܓ__䒮gۮkhyh.LR (V0s -*qC<הM=u,U,АKt Z[D9XԦVMI]ZπEk6m%1ЙҬJn_qz_D/lJM9_X94]^I?σ }VE?lӐ2tY"˓umz -cXH'l6A313ؾA4פhntm 5S]7^-QZv}($bo䕵f'ZG~͖b Ls |l^C:Q{ʦVo`sW(1Oo=1rϮNi -W^DNFkb)|X~=1HST=k˙A6i*c=`\s* Ǯl%Oo0>tN)SWa -YǼʵPz4Y "A %i~.c>GA|&7}7v^|{M7}爧HJޜ4?}N( ^ r?KG!|pkZl4q_ p1AT_(2qJ -\,P@eXt|7)6A QY\Ea)yrO/ +xZn,5We `b1ܹ+.mOw½D:UYN9o:_?yb,͇ϓZXsjQqϖs&d8(墕̞x)o\,c3B,{tOO0:61l ~:qZ:nSg."sJ~?}p4L(Zn_›2q /ᠺLFڬm}<^ëKf1ܘE:V+rb2иlP:7 :)<"`xZT<&yv,ZjCvL6VDZK#N9j5:ϙd`X}@'|vt4gŤ%8\@W@1'7IW@h8GvY i<:\Q w2oY+9'XN*p*_ fbM.EHh+q03&b!{.9!9:\# [^&<Ȳ>1`Qx *n*@DF"&^(Re*l /G8]"ޯua- +W&9ehZ<Ԟ  D! +9]:+<Asy-ӹ\!-a0t4@A*m䴜vѹ%2qX$sBmڨkG0# +@!H1HeXc* tKA4.-  T"XТH"Qe<+#~,*VȦ*hM+~2$aHp^L.Xwt^]=He +G +>ڳbhd%F] Me|> ܣ h@(u=®E"~V3Uhi4d_e4J"7I +ZGlFfQ53lY +Ϲuch؄:$o`?^d#I9 UӢzb'™[Xrk + G1lᣨlJqEGՍe6cwn[ Ys{~ jp j6-e>xEWjZ"~#f|F7}wM_o?}ӷ~4 soµ7okM01Ezx:R_G‘۸{|U9MיW3g1Y'g?,:kXHp93^/FzƅEc#c~/p)=1z)? ϶ endstream endobj -527 0 obj +590 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 526 0 R +/Contents 589 0 R /Resources 4 0 R -/Annots [ 528 0 R ] +/Annots [ 591 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -528 0 obj +591 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 326.222022 39.386457 311.207622 ] +/Rect [ 39.386457 183.585222 39.386457 168.570822 ] /BS << /W 0 >> @@ -6879,32 +7876,31 @@ endobj >> >> endobj -529 0 obj +592 0 obj << /Filter /FlateDecode -/Length 1814 +/Length 1812 >> stream xZn6߯^mi7\@хl]EPym'Ajù"*bx-Yl]>^8sǟ<ǿ F:ʹ‡ τRśJ1nt%=bs"̈`I3Ē~?}]ˇ/{TD&=B-%YQfPy4]W=Oڋj=mQy:kYHT*6S˼*Ũ8Az%?nI1,_~ZBim-*,e<;zC#.Uvվ\Gs*LɛHL=\C|<6L=q:'졔AJ|mܶ=z^,to__:VI~E5sEd'_h- SuHX^oa#6)%(gD{pЧnma=@~t|8&>ڴ`@$I4lgBoc" 0ȢfLwYg@hqqG#a f,R)ff=bXQfh`&8͑Ufpt/xCу a!Os>E٨Z7 ӼpX F]T0xco$ҠR'%΀TogQ2uټ^?j"N)BM *i;,\l%Nm-&]ڴ enk%-7T}۔lĬF|܁&:0h}h2@,G `[.AN={4J % Lzf(kk zQoy- 9?Gj0\`A(\j!fR ҇Lȩ5^pc݈Xe{TRG !F :$L&; Y%0wmKr'Ș"dƞ9!9wLrO{I`̓1RkHϞx@pRWm98l9QI&vPΏLсɞ zBӱ$"gGƅBn'rU>Isg -gMh>wV?t+Z;3܍6^Qފ>|L QB o7[,bg0(;{GoZc#f4yUzMit.x%Qcx#ﷸ&rF]fځnFp0Ahʴf}MgFoz[M,yjOUE4?Tc?<פL2Jg{3Eq~[iP;δ31pTwũ1Kh' ک' `G(E;fڥrfQ.γ`>g6Q^L)e - l0̪IHE0S΃RzW=5*۽p9E* +gMh>wV?t+Z;3܍6^Qފ>|L QB o7[,bg0(;{GoZc#f4yUzMit.x%Qcx#ﷸ&rF]fځnFp0Ahʴf}MgFoz[M,yjOUE4?Tc?<פL2Jg{3Eq~[iP;δ31pTwũ1Kh' ک' `G(E;fڥrfQ.γ`>g6Q^n:n@z]_C9 *r󠔽tOMv/faN??ܸ endstream endobj -530 0 obj +593 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 529 0 R +/Contents 592 0 R /Resources 4 0 R -/Annots [ 531 0 R 532 0 R ] +/Annots [ 594 0 R 595 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -531 0 obj +594 0 obj << /Type /Annot /Subtype /Link @@ -6919,7 +7915,7 @@ endobj >> >> endobj -532 0 obj +595 0 obj << /Type /Annot /Subtype /Link @@ -6934,35 +7930,30 @@ endobj >> >> endobj -533 0 obj +596 0 obj << /Filter /FlateDecode -/Length 1942 +/Length 1939 >> stream -xY4S|J @ТB\fłvyNvYicǞ7bL?>83g8͗4O1tv -i J1nS|λI)zg)>=ۿO+lmM43X&}r5Lm k=;IdTe=v\p5pxxGE\umL{|Fkx/۽k~׹Kܶ~uڑuDt*[nkuLzȤ|֎bXg\k&߉&6Jkl+1[|.O/z\ѹ8oS%ЙM;<'!5UYx5T2׻@p!ZZ j)}r f4@exs ~K oQsĥk %c6u^sE֦5/*at5V"ϓ$BO^W6nB1vU@WSX=% -c+;< -s4 sQNGFzEQ_*CZ1ZH8eI1Љ 0hqbB:A &Ґ̕䉹$zC[ᮮhp j291:^ݴ%81TX7{ M$ނA>-Qif^۬l]斡O`;bBItwoX =#ٖK -tv͑(9Wb:#E9<`HeBXqޜ[Jm7َnگvc(ͷB,V.o5oپ+CrOZ(Mj@:(]UP,u>7QnIzk556h|4L+QtԵ}_]f̱@n~@Ӏ)Xv O-0܀Ŝawq žE>iBo%Id[FX.gM͠A N<>am犢|0*(b1A@#! Y|I? -ΣPz93|HU20; +xY#5 S 0A*!@B~q1X./8IeO;$?۟3s5NOl_|ï$lL^9d9gBM)gdvSxz9[ƬB̚{tj3}` qa ˉ"F2IępNO}/N<'*/3cR^;(*j=դ1eས{9Ƿ Kٴ~u³ʒuxOw*[:L:wQvd(2t]ip-u6*}kf/Խ\si݂>|{ṄxWYژ*`7vyB =و*,*]8 8c- j)\u7rk2gwk {slֺGH6WCL꼸Ve 2ZZVcV&ZC)"ikx'ۅIp>E{e_ڸ ݢTzUunU L/1K y:I[$tdWp>*·-Z\kkdA9D80h1z:@L19!+K7Hd6$m]eQ4U2(_b4tiK@-qd^SCzr4 {xp,I=> ˹6>巼-=Je=LG:GBDBC5h(eҽ<Y|+rCRO.|u8pW$9y<*$UWtT=єz墰ZѦcq_-^C%&-5:/;JZrsFnN @Z^ͽI1p]U[-_|o)QU󼓋T,*綏uGe#gڦYДkL;(6GgQ02߰&<[wwI;p]E9ԝG9Jo 7ASMVi,2NМb,xC̷95@h|!QjgWV UaRv+_[iCKT6+kde. l50vGL(H<8 ˁ!;i)PHgGR o{H+F3rP3fm a`9ቌTQ-5c͹F}J,l7E3|+tȂ[UK^$XP?uҤlyU ~p>)Bo%IdSFX.gMM@ N<.ail6EYdxndcpHOA8 . +es.:=͇X5c y" endstream endobj -534 0 obj +597 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 533 0 R +/Contents 596 0 R /Resources 4 0 R -/Annots [ 535 0 R 536 0 R 537 0 R ] +/Annots [ 598 0 R 599 0 R 600 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -535 0 obj +598 0 obj << /Type /Annot /Subtype /Link @@ -6977,7 +7968,7 @@ endobj >> >> endobj -536 0 obj +599 0 obj << /Type /Annot /Subtype /Link @@ -6992,7 +7983,7 @@ endobj >> >> endobj -537 0 obj +600 0 obj << /Type /Annot /Subtype /Link @@ -7007,10 +7998,10 @@ endobj >> >> endobj -538 0 obj +601 0 obj << /Filter /FlateDecode -/Length 1469 +/Length 1465 >> stream xXێ7 }u -ڢH )H:CZ$FP3w^3EG,J`!zgˇ$,ȏdws†B @@ -7019,22 +8010,22 @@ r <(Ҟc[NE&ߡ&I>[)@9SBd!J[5vXLzMی`اwmȀ3ؓl{\LnYc2y30"0WZ!l -y.7Y ֝#' hY't3>9ڥ<#1uJ y{FUVt_E{>e{KgMhNOˎvW(+F$__zqoڰ6DsSk1-@_ۭ-<#[{/ʁH)+.GNL_]sVDb3!q CO6#&"zO+<룎!*uj|4qN&9BhJЀ8mPET‡&ݞ_Yjߖw>Zt8႟62Zz;htz_cR{:@(+jNhg{x"7~hѲY']uJ -^:*W*$:~ Te0EĐq)(x>?2@30K +^:*W+t@(5s31d.nJ72=OO1PLy? endstream endobj -539 0 obj +602 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 538 0 R +/Contents 601 0 R /Resources 4 0 R -/Annots [ 540 0 R 541 0 R 542 0 R ] +/Annots [ 603 0 R 604 0 R 605 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -540 0 obj +603 0 obj << /Type /Annot /Subtype /Link @@ -7049,7 +8040,7 @@ endobj >> >> endobj -541 0 obj +604 0 obj << /Type /Annot /Subtype /Link @@ -7064,7 +8055,7 @@ endobj >> >> endobj -542 0 obj +605 0 obj << /Type /Annot /Subtype /Link @@ -7079,10 +8070,10 @@ endobj >> >> endobj -543 0 obj +606 0 obj << /Filter /FlateDecode -/Length 1667 +/Length 1665 >> stream xY[7~ft`hҔ҇:O)$PIFZIvJlα7ܴ dhy>>`1 @@ -7093,22 +8084,22 @@ x r(XIΧUuŌYTH +ԅVƒP{Hڞ @[ɸA2kϝ?nܡ [Rjz,"[tϾ.,9M4Pìs/ܚ{YY&J+B Jf 8j^JmȺtz T?f䍇zdqX`GBzeZ K؋{YLBIۓcksHO[amr\&Iu ypcZCl2>*[ 锎O~ovrQaX}"w-˭p93X0և/Y[# -iǐ>Fs/ [nM\It>meɂ驛\֜=Jeyf.<- gJ]`e d=;Xh,/!vj4=J8B%='nOcǷ :04) +iǐ>Fs/ [nM\It>meɂ驛\֜=Jeyf.<- gJ]`e BR;O| SΆǤA8)WYJ.9w{^$mԁ))W endstream endobj -544 0 obj +607 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 543 0 R +/Contents 606 0 R /Resources 4 0 R -/Annots [ 545 0 R ] +/Annots [ 608 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -545 0 obj +608 0 obj << /Type /Annot /Subtype /Link @@ -7123,36 +8114,31 @@ endobj >> >> endobj -546 0 obj +609 0 obj << /Filter /FlateDecode /Length 938 >> stream -xWn0 )SIKP0l;tȰS;lCFITLɺMؒ(+ D&맟}&He #˓rBn/ݯ.ɚb&)K`wň?̆KyƨP#f lOm,Ψ݅>gOa<َ\dg۝`am&dpvlO^}{]+LC &Hso'|F{Y˼:&_/ -OX@Á7Uy |1 Q6;!'XINAr$O.=UrNw"8g0T0s^9\*KR: -c%b+ -qmCam9VOݪ$%$~4셫V {yZ0+xH%x _p`Ҵ̪$E )=bIڶ -h ܰ~'B -x_;0Ҧ<&hi1æ&4i'+bNWn/ܳACg/[#SZTi} lu66kKTj~Whd }Շ7/fLJc-[>膮GKm -R<أ=Ey1Hig|oqtfyXz=gҳL $899᫣bIB8h! p1>/L?\زWy'+ endstream endobj -547 0 obj +610 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 546 0 R +/Contents 609 0 R /Resources 4 0 R -/Annots [ 548 0 R 549 0 R ] +/Annots [ 611 0 R 612 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -548 0 obj +611 0 obj << /Type /Annot /Subtype /Link @@ -7167,7 +8153,7 @@ endobj >> >> endobj -549 0 obj +612 0 obj << /Type /Annot /Subtype /Link @@ -7182,7 +8168,7 @@ endobj >> >> endobj -550 0 obj +613 0 obj << /Filter /FlateDecode /Length 2224 @@ -7197,22 +8183,22 @@ B) F(XKY] ]מýe {_szN%kCc$E!O.ia׎Ťs̸m t!e_c`8 W5+3yVچY-T=ZTb46Yжt'̆f 'ST2c'F6dDchӫ12 u,{90J֌o!Cl̶@+s֏qτFC(Sw$̆ᾼv|t0"RH_%jiRSEpGܓ˅3L:Nd'{"Yt`oMM/U7n5׻REBlnֽV - uf~_ T쌍TW> endobj -552 0 obj +615 0 obj << /Type /Annot /Subtype /Link @@ -7227,34 +8213,34 @@ endobj >> >> endobj -553 0 obj +616 0 obj << /Filter /FlateDecode -/Length 1348 +/Length 1346 >> stream -xXێ4}uj -HhP!fSv*gfY:ʌu9uat}'"S8LZW(VOTH?$T#4 -@K/UaxxwdU:0$]!_?ތÕZ.teQG1hu]0lM,ʈ.\09 Oq4xgce"]I, Y&6=(8i_5# va!'qfQǎHHK7u:. |}G9rT4hR[E mR :ub#:iFa ,6=NuRa.؃dZpxY_?a|]Ji7pLmȔ;K =U1ovnJWohRg|_c"4"snL)iXOS"WEq]L44 .U0o6&;ϐlEIz~jm;=9\\W7JنmS=(m($}j-v\e>o-lnS/`Xl*pa+eDedooZ7gͮrlNZ1Bnj^fS3:gGřÒ -;59 -ї~OZirǓS:SP:K &_O崌*|$@gIy=XehGlUis{oTZA62pa `4D-NHRGmι\pR"ee˘ -!9Vyb>Qm.V=A p -\ _e, +xXێ4}\VK @hAB-Nx4KSq'=3Qf\˩mMD0*A5 +|~ +ۀC1`2F[G/SaxxwT:0c&a f4J9\iyyJ(ƨ0E=}uQS6Ģ]!Xhɏž7$6@dG =(J|ufY.^Q6% 0i_&KkoG„R0@̑lJƙE&Y23Lt#ϟ5̕8ӕ <]i<^}汮|<ϓJP!<.s@H=X3+{QdhAeZUj*Ĥ`(brva ʼnEČŌf߄J[dlZؔӲF+XLXE6-uX +װ%Ns)ڔX`ߋ| Q%caq܋]#CƦgG8 6|{B´89YP8?O3o`PcYt +DŽ4;qlY٢;L@gPpfYbH+шrdH4b +ƯKx+GH~.k5ftFZQ93Ȩ 3@TZSxܫpQ+vU4j,ʺd#h&#DUOɦu9h;ʓErȕ(jhjyCKg4 Hde ̑saZ'e" =Hw^lѥěvC8 rzg b{=Q6MZ @^,ouluWdF_WDNAi':n6%.|b]BFw]3W٘|:o-loS/@Xl*`ajY|7vYۛn+>ۥV$ P(گWmjԅ̭}Q;Dq氤ŽGo@C2Q`rݏ~y^+.*y~> endobj -555 0 obj +618 0 obj << /Type /Annot /Subtype /Link @@ -7269,7 +8255,7 @@ endobj >> >> endobj -556 0 obj +619 0 obj << /Type /Annot /Subtype /Link @@ -7284,7 +8270,7 @@ endobj >> >> endobj -557 0 obj +620 0 obj << /Type /Annot /Subtype /Link @@ -7299,32 +8285,29 @@ endobj >> >> endobj -558 0 obj +621 0 obj << /Filter /FlateDecode -/Length 1222 +/Length 1221 >> stream -xXݎ4 lNV@ -t@s=$ -iN& qz9IaI'~'_N -IY3y8?Yp@*/ZK;}z>}8y -kaNJ o0ӻ>}^DJsبZ*(h6L3tģYBwu*/SU ]q/M_N`Eg`_ٛ/F\{#Iq2 άkU|=zm:K(FZ`L(9`aƍo{W) KtaU~6i^|ϿoW~^<|} oϲStd9bș|4e,۪y1:xnH;kDXd' :9h  Uz@>[TOsɞH\'y42uڃ}evTŭ!ѾD\ Tb2MqЈ\ Zp,j:P2%C|jddCu4Uϲe.he0OpG ~.ĊPD9EHdG {Pgۓe'tUr_0!"G rUN [鐕{\FGZ^Aìf+P ^b5AzWIL]oYU~C]jhaR;i`nZ2h8B;HFhsQCXs͚fOJZN#PS-l/4|Z Cw2dMi;Q:G%}}=$@8Ѡy̆]Aum9QǿCpo4c9$#^G7]X(_pP/&2X&RW,o6tM<e!N[ޚrJwP }omduHˡڵ5E29ߨ,RτM%M\e= $x` <*h%_4ZoH!7L3 Y3 )~mf=h$.3rCE @ c5Rhz!-o 6?q0ҴA)_/$|[BTARiS -@._ -vKm%74 oOtQ Nu&>C7 ?qXaw.8.:\1ʬc*}ʧ-]Ǻ -S͝ +xXۊ6}V*]`0$$K„!vO/yȆ?t.mdnK:uJ1q hN/' r͏0DIfJ' MFX&^*f|zt)f87LBHP8m>g>wnN]mijh֡cۏ)Uak2)悕;Hԁv_2TU.\niTXc(K"oX˷2Yy'kK6%Kq0if *>Qǿ}p$m-4`NiMsۑZTۣK/qMSjlҗTF^2ĩ[UNN@U]O`]thV0PsYʥoťKPֹ*{̗ ķp`@ hX4/ + ?Ipƹ张쌏32H5JaJp<"q$#/冊"%&e,5pGW7oye GA #M2)7D͛^W HJ DYv>Ҷ%JRzI 4i Ss:}(y0 0˴rGO8Ktq˨gWf6|xÔmo endstream endobj -559 0 obj +622 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 558 0 R +/Contents 621 0 R /Resources 4 0 R -/Annots [ 560 0 R 561 0 R 562 0 R ] +/Annots [ 623 0 R 624 0 R 625 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -560 0 obj +623 0 obj << /Type /Annot /Subtype /Link @@ -7339,7 +8322,7 @@ endobj >> >> endobj -561 0 obj +624 0 obj << /Type /Annot /Subtype /Link @@ -7354,7 +8337,7 @@ endobj >> >> endobj -562 0 obj +625 0 obj << /Type /Annot /Subtype /Link @@ -7369,31 +8352,31 @@ endobj >> >> endobj -563 0 obj +626 0 obj << /Filter /FlateDecode /Length 1050 >> stream -xW#5 S IZТ"@| @7il6$8|@|ҌK~'χqҎ`}zH11/Qn@Zg\PM eS˗({%$ց7Pb=L#hT@O&"Fѿ0: -6׫'o#܆I3YPxչ`M` L3*;;ohu$|;~91.*0`$X8>H%`Zhge)1^~WmJ\ay[ 'J! 3IېT#ZludfM4l,:m`ߒ doM\U\o`&EiA  /\+nW;y!8vUm]mwVY Fkd#c n b.ni]źJMu"Nv]ݩv˼2g#u*Dds[Dϫz>Q(&Ax]e]~ ҭ6T^}oKӝ2-{99ef Kdd'RfXF9PF‰:#0~~< -A^hߜ-^@=M߮ˉX B8^p2SH^)ZbO kq؜b<}K3XA5 %{+?Ǐ ,:֥-a9"8]n-8_Ax:MK6:Iָse.SE_ +xWo4 ~O/@Ήc'I @@B!^m'^K8ڴ]vԭccIBˏZya'X=$;>)8U{WZAy">^>D}P9ݠ1t`OqÛV0pG򥨲q+v):թNpO1h'>ړoȰu/ՌLV +*|u.Xq <;0keB`gx#ZI?O 緋 @&X8>H%aFh\V|OY Gry\z/_2x*}ҋ\.PTE$$[\>F-"W06R .t3l\KHhcIazG^f1&ê!'X~IP0+u^h$tDǴfJ1:Ѕ&mZ^VcrVJZ2eypO*hc*(R=Dn`]~DIB"!z&5bJq$B{NL̉pREXma[ҷə6mLۢh:$2H"QU3l{qꍺ}[Edejw-Ԡ8~(d`1@-A6]! ^Rǣv'yw WP> endobj -565 0 obj +628 0 obj << /Type /Annot /Subtype /Link @@ -7408,7 +8391,7 @@ endobj >> >> endobj -566 0 obj +629 0 obj << /Type /Annot /Subtype /Link @@ -7423,7 +8406,7 @@ endobj >> >> endobj -567 0 obj +630 0 obj << /Type /Annot /Subtype /Link @@ -7438,29 +8421,30 @@ endobj >> >> endobj -568 0 obj +631 0 obj << /Filter /FlateDecode -/Length 522 +/Length 519 >> stream -xTM0 W൓8NpX4$a]qx(3eHuVc\rʹXn:=NL,6JL2P@C`sOӇT2fD'V qu?=L7G!v?z[Ҕ3%kIsڔ˚Tlqrl\y7>Bu<|d9-q^BI{dbP+yyX8)+]ɅD7oT~XO;an/!$+Eoߞ'19:sq"*s 9us\_Aa^\ͯF!g15/3sen,yĬSZ2 >MI9S`ۥBI~㸏|kuʀϗl++J`PT$˄242W܁`6.J -# J=>Usloܶ > endobj -570 0 obj +633 0 obj << /Type /Annot /Subtype /Link @@ -7475,7 +8459,7 @@ endobj >> >> endobj -571 0 obj +634 0 obj << /Type /Annot /Subtype /Link @@ -7490,37 +8474,37 @@ endobj >> >> endobj -572 0 obj +635 0 obj << /Filter /FlateDecode -/Length 2861 +/Length 2859 >> stream -x[[#~Bzup fY !>} C$JZj<"W F.!Du|"oEW辔?obB!^ BtP志|zBR*X] -yz&q{hjIRDs4Caaqt]sH[ι.eaJ/$8Œ]uKV:I6svћeZ@P!s*\*~!T„t@w}ɮVLzݶs>_m|O xs/^L/ֱW7TQ uyMhnZ}~umm-k]?]nXv׏?-E5Eh0(OP2ykMV`@쪐`dR2][`ۮll)zD - 3ֵ'cpb:G;1Is^|0IF2Gtlz܂p4Z_' -q{qoUPBFrThF^A3T4敛qޛH#}E@9vf@ ]!݂(!#S>mhp-n y q{\m>nn[kBo.ׯ#y% ZUH0s#dDna"XA!en{0pn>8hV ,]X 9Zh'JBL\#h'<kɺ97OF d00bRʀ -i^w814"dbpR`+)cиȺS) $pGqK?Z\Aa"7Eqf .^wx^ À3XtQi\EdV <]d, ,̈M)݉D0qVd%JrzEy2zt -tJn'Ep'*G"sȋ3UF RfV=`R\1.(8(xXUd؀@4 dMQ{$d:Fh8}9j#dTX۵0;QȌXEԨ%E!Zcpoǜ\UQXw!&S՜jnLmAC,-!֤'bj"xq`!1#t,·J!?<k@A`̉@(r h-'-Wjw*&3JXZ,9Dkom+DA Bfu0;N<7OX@d [2 &;ԙ5N -(UĎ "hG40dN jyg 2](`!jTוK>7JT]UpkXaqA:¬tl,0Zx%odo2KF*׾SzQ{YZS8s."93VGqX*"0dAwo}ώ9#i7$wralɚΌu@ɠKwh "',9 _=b7{*ĜP߮I3Qȳ19t\@h"&Ut|elxuj8UG EndpH [_H`Fk9uup'խ/Bgn6xmAܐ& hf:Y5Jd"z<|.C#9vۡfkUN -tߵNAۗ-ר8!R3gIטI:m܉(@ٻަ"(vą< 7F su]eAx'Nkյ1:bAKBGxJ9]sbp#-f*BD{Bzx*&I}C!6Qfât!Vw؆O-o(F"s+BdX.8 -scPXh3 C*Ug,?ןU@l"Jb>EJ+B.]>g^0;sXCB[öb|1~63fvf>Oo5LlTDz:ݓ2 )1,hd#?ObLn~=~VuqqK{b1ަ ~EeKMw>u")ޡkO:B?}|-v+UjƄb>ʍ)?ZAKus[b u Yd}: ^_cKaܶ>O릢 +x[[+~Bzu0@a,L؄s/9V?UKm9g}JuR[ELK;s}>v"+IG;Gdg/"P:zFkϿ:r)^>J-VFlB￞E&Z~}Tk:\6MdPE8pXF|.Җs.|YҋqE!I'.b$MҲWubIJvd3g*_1ϧ~ǏgRy޷_/B$ N&Z߶|>fj{Ҹ֯mX+|urz_cRu*G7sSב~ 7v棹i6ֵvuƲk8JM׬ƣHnT*r/e9Du>LX5EO'ȹ}2b%RtQHsЈIa$ߏE0C 뺎6N`&% -hqBQ@ixFBƹUO5\pqlx%Π&cEۦqfw:[-[7t4&0#6JJwt'BQA(MNƐףSP%P w? Fv.l\ }U +a&]P B_XԆ`NBcn@ h9)hgEǾ PV5!Q +ŒCD61Hq<(_A(r6L#m2ύp7 "@Q0-0~^iVao7"_k *܀.0h W +c`V62$-IGa gyIVtpA}9E&0b8YCT-tzd_GX~+_ +߭C%ӗlbMkA&~9ʖd}DRCמt:/:)[V> W|׭SZA¹jCC:`.Y_N@Bk#cli24gv)?_gD endstream endobj -573 0 obj +636 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 572 0 R +/Contents 635 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -574 0 obj +637 0 obj << /Filter /FlateDecode /Length 1257 @@ -7531,21 +8515,22 @@ x g =ۻY+>s[IP/섆U"FTI@dƢ]!XGx~<C贝Ѧe^L]@Wce@ͷ YܦրL$hM6z=ؗߧI^yT -BeQa&Z!/ yl릾tƽ8 voh{xmC5><#Єd*{$Ĺo2B!C{kR/W}SfEc)X2} tmF7#BBt:bWVfNkLMugm!܍nAYJ#`zj_ ]j<[ڞ|"d`8oalسx+LJ]Nd9!l"3P6e8.!;QN]Yan9pZ4ӷldLus6V|_tpʖRG{fVZ5Yf< kGQpT˶AD9Idd-s[YtI "Kiˢ+GtYrٕ(Џ(cZG|Ŧlw+C EfkzrMxsƉ|훰2)W㻭?pߪl(2O(+CS `+t<@2,Uֻ',$BxlOW1Eڨn+Cs,,xGU` '/,p?.&!Pr/Ӗ;|c]:V&FݳCY[wY[aخr0@'f{'gY )T0h?yPTaGU` '/,p?.&!Pr/Ӗ;|c]:V&FݳCY[wY[aخr0@'f{'gY )T0h?yPTa> endobj -576 0 obj +639 0 obj << /Filter /FlateDecode /Length 2033 @@ -7557,22 +8542,22 @@ x Cm[ŶYo-rSܼ-m~L?h7!dCZx.d輍73+."=sI& %~ 4fNTe4÷ {\-NN"2ep ffw`IhzdesD2b! 9,2KMf zYZBk ;T*cC*N&{MU'@ 4k,h2s+S/,ڮ{H+«ܖen9شIFuX,5A Fn=ŚZa]yMj`Y6O"ĽQ\4a;01 -,(+ѩ+C[pM5()X6 #RX"j֠qE"y?U;nݤ84 mVW^Ʊ2+=P}N0kƽ g?)HYvghC]w,H=YBV"7=_xJ U.Du7Nvfl9(. L"=` ׳?UʅQΑRfIhgg^mD=*qs}G +,(+ѩ+C[pM5()X6 #RX"j֠qE"y?U;nݤ84 mVW^Ʊ2+=P}N0kƽ g?)HYvghC]w,H=YBV"7=_xJ U.Du7Nvfl9(. J`FsB9lwOUr!hsY/yR3WQJ\$\"klG endstream endobj -577 0 obj +640 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 576 0 R +/Contents 639 0 R /Resources 4 0 R -/Annots [ 578 0 R 579 0 R 580 0 R ] +/Annots [ 641 0 R 642 0 R 643 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -578 0 obj +641 0 obj << /Type /Annot /Subtype /Link @@ -7587,7 +8572,7 @@ endobj >> >> endobj -579 0 obj +642 0 obj << /Type /Annot /Subtype /Link @@ -7602,7 +8587,7 @@ endobj >> >> endobj -580 0 obj +643 0 obj << /Type /Annot /Subtype /Link @@ -7617,10 +8602,10 @@ endobj >> >> endobj -581 0 obj +644 0 obj << /Filter /FlateDecode -/Length 2749 +/Length 2745 >> stream x[]}BR @"-Pآ)>8O)%%u۽^[93gF>;VO1闓S2Y.9a @@ -7632,46 +8617,46 @@ j Ish.`wkհh GwjSUQW0'X .dFVJ|Ns(ñ1C2FOAG'50.VG)=ځ^yJ652c,EFOyrvEgVlI 9`GU~>XH}oY4!\-jR%m& T {CX;xsC֞N"]I6DkAЌk$]jNBRAbdʩ"u4LtdLKbq CC^# -}ԬBfg;#' PVub޳ɯUlݹQVn}-Јf=Qv{N!l|\g{xH r?Mf`0MxQ*A<4/?P*N~dC=QOsav;%V~HKD}o<;c˻)9JO./@+++d(q(}LMN?Khe*Mx٩aEHӼQ_+QF zG/fZ8'S _hU+M<\'79"\B0" 寯˹ǬCS TO|?ÞK +}ԬBfg;#' PVub޳ɯUlݹQVn}-Јf=Qv{N!l|\g{xH r?Mf`0MxQ*A<4/?P*N~dC=QOsav;%V~HKD}o<;c˻)9JO./@+++d(q(}LMN?Khe*Mx٩aEHӼQ_+QF zG/fZ8'S _hUkkQ\'79"\B0" 寯˹,*QS} endstream endobj -582 0 obj +645 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 581 0 R +/Contents 644 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -583 0 obj +646 0 obj << /Filter /FlateDecode -/Length 1491 +/Length 1493 >> stream xXK4Xi5.#  qH2+fe*.;InuqzW}Ih1oE$|ʊ<~O i * 60ip/_/_R&N%]^qVBN_\Qeվ.oA "1UEl5m,ʰ`?h`u`MIkc)BWce]API^D'M.:==_~>O*Kџ?<1=}n$t"(UV-`$jpQRZ ~3ރ665czsϯן\W8g*ym4yz'LQ&U,Ghc!PT=93Ei ]T?+ sR嵱 c5"z(3Kz*MHE 队L[ʷ{{x)植BgE1s42)E 9%f(b`rgF@29Tڢ]s;9;Z{Cg1ńΟ:+#:(3r٧ɹ3EaٞlVY eZ{v7LuK>b9c~x-L*AEϿSpbk :)u h>ƻhs&.aV(X/MwZ(3S5{j[ q|"Q@MV^9XezK]*p>t݌);/sj5ǒeCk/Th6-f tjCZ4Nd[QλƻdEmӓGtr&)P;) XtQD!(U"8CKm9B YY ;C'eǂ^xLAvhGޡ9+&YY-YEJwrWʼlXS8fz*PIاe\$ƱoXҁ_H +qAUvXu)Θ{ z>[nd;dQ%>D!\z!~VjX}'Iiٝp1Ӟ9uF`}͔#q'fڳt@~+yn{Bu|Ё*†Xʬ%?u|:w^Ee  9R㸞40AvqCNx+(sx]Y c{ >˃7=/~d}G^pNTKX@fGNn_YZIhz8):͔64P3^ ءX@+}Ub>^Ybo:MQK`2YgM -?aS;@QYJ7)7Y8 ;" ,9Mx"pv +?aS;`9hz)!ONxb~ÛP.P~ysϘZI݄>a.bWn)$ endstream endobj -584 0 obj +647 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 583 0 R +/Contents 646 0 R /Resources 4 0 R -/Annots [ 585 0 R 586 0 R 587 0 R ] +/Annots [ 648 0 R 649 0 R 650 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -585 0 obj +648 0 obj << /Type /Annot /Subtype /Link @@ -7686,7 +8671,7 @@ endobj >> >> endobj -586 0 obj +649 0 obj << /Type /Annot /Subtype /Link @@ -7701,7 +8686,7 @@ endobj >> >> endobj -587 0 obj +650 0 obj << /Type /Annot /Subtype /Link @@ -7716,39 +8701,35 @@ endobj >> >> endobj -588 0 obj +651 0 obj << /Filter /FlateDecode /Length 1927 >> stream -xYۊ7}@B;c;)UZ evuSWx-Y=-NO9'{|>)\0)h>LNx& -bF+vpy7 !%3"Xo -1/Og.Zߕ38}{9 dVKﵞ.N{7x\?p.0s= -aL/0gX1XgL^gm>=u^9~Oa|tL۝qg˭tsJB%VzW<χkA@HsNd\#~c0ܓ^3ÅVҚ>݇4|=ӓDFA|~ȆQg9d8~d jlDoHiFu- A-ZF4(ݑYΥZ7ġ$𥱞0 h_M-7Oi{ l%yV:?Q)DB@bWU@DBY8bx,1lETL5hnkGb -J_#6>%k:;mY5gJW#{/5x-hNqnc <*ިuʬnj ~-|Xa -m0e lٯ9bFq͑&[˒n> miqF-w #6k@B2l&ـYEv]x 6; ۱b.ڝ31@ Uj>߄ Z - -_6s80.3f"F -MJ "&aN)+Φin(tϺwn,Thc)n!oKԭk6 %ʒ5i Z!>b#M ZEe &V (r(,kV6K"Ou/~[vYͳ\MoIR Q2o -zZ2UAUR Lir")s60NR5CY7X]*EnB[TkI b[Pl9ziк -yo eC[v%L #A>3Ԍ -SfV./eϥXx4uה;Ǒƥ>6D"1ͤM 4i< =_7S.v˫6٠[2 ;0yPn<%c5/˗t*So#ik@S=,8ۼ*wc/x-KVΫ{vh)7^h@hk5=O bMeuEAZS -|U46oY . Kj}` /q6ǾL3 EST3ub2U&&b/VO. Y|< k[)8FJX,}Y`UǷ8&BVy$^9um*vi0 Ӕ +xYۊ7}@B;c;)UZ ev[:u8kit|?iFI9悑NA3ar3!TR)fRM_nOq 9ΝwR2#&SzO=(]iHs8-`ҷ@FajHpϼ^w~ 3snQ>>޹B#`>18&3&S{m<=u\>|Oa|tL۝qg9˭tsJB%VzW<ϛkA@HcNd\#~c0^3ÅVҚyd8~d jlDoHiFu- A-ZF4(YZ7WIKc=-`D +о>Z^ nڟbtǽJt`q}eR^~!Ӊ+Ӆp^&R(dT9EoP2蛢%!*(yK|ؤZ딬HPqnk̪S _8>hRӈbhXf9 cZG_F}πג٩͇`PZz^#fi,0fa4r0kơ ď.D0 Yo< بUdGߕ-N`+ /ُ`+9PMY۠Հpe3M܇2XnK-b +"jz@Qឲbmo6&+@!9H{ƉB6v] +DFnR,ޡZKy"B#P~ cAtx{ĊaPEle*11uzIU\zmVl4Wq }y.fT=({T |}PpՀT`69vH`, LTPdVj-%DWJD霍'ܺV +C05yRx~<1း?ĩu -R-#m(+E;/yԕuc4F /, 6FcW<)Nr>tjxNSFCؘmof0B˛qH{ +z92](69Y07|06~/ֈ;7gW'3`ւc֩#r8#,e·#:_݆,B0pp:"z1B"=,xMZs+m:"m Kr[ײes?3q9?-VIuQ=ꔽcu'B4@ӤF̯hM`uމURL%()g Z&n[U  +X51-a6I 4xh]^ü6Ui򌲡-A J f_jU@٩T3+ZRv,g6(_  ì +>G Y({=/ֵڥM7`4#f)T> endstream endobj -589 0 obj +652 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 588 0 R +/Contents 651 0 R /Resources 4 0 R -/Annots [ 590 0 R 591 0 R 592 0 R ] +/Annots [ 653 0 R 654 0 R 655 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -590 0 obj +653 0 obj << /Type /Annot /Subtype /Link @@ -7763,7 +8744,7 @@ endobj >> >> endobj -591 0 obj +654 0 obj << /Type /Annot /Subtype /Link @@ -7778,7 +8759,7 @@ endobj >> >> endobj -592 0 obj +655 0 obj << /Type /Annot /Subtype /Link @@ -7793,10 +8774,10 @@ endobj >> >> endobj -593 0 obj +656 0 obj << /Filter /FlateDecode -/Length 2948 +/Length 2949 >> stream xɎ} @@ -7814,58 +8795,52 @@ u ǡp} q9 =usG9h>qK~>w=hq[~f|+H0P 'SzrDa\wI<3DksNF8Yj7GaCaCd.G7ڰ!І .FX4aӼa 7N1ŝ@m9<8[/nfMX)uqVsCŝ]  +Z`hHc`t*q[W4د8d0 ^TÕgtHEs׹/8%]oc%@ʖru69sp&և]oVܐx;w}c`0ކ~f <6>(a9L , #CՐq&wDQZ ky ~&Z*vtQٚ|=qۘ«wsxV:x؊?[UfVLw A笴Rq;u}"w_ht'繚6'rTJ3]!ڶ;Q -|E*Q /rr/GD - 9Hs3;=;XA1.2 +|E*}Xs =9 U#"NjG9k`tNu垝Mfl, Ӡr endstream endobj -594 0 obj +657 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 593 0 R +/Contents 656 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -595 0 obj +658 0 obj << /Filter /FlateDecode -/Length 2440 +/Length 2438 >> stream -x[ۊ+7}WR!3 I $tH8OH!J[Znc/k_,朷Fo8jҌG>8IY5g6wl8gBRnZION=e:{\Mso39oN@h'E4ma?Ob&w8s)u~|>HOĥ?=+V}Nz4s[dS2Xtw{:u ݓ5*}ǂwst~ȋN v 0p-]H$5qc7#x8FJZ EL<< UτnIuZ0+230tMтo< -1+' jU7r"y.ø>&"mP4fpZa$hw /Ʌ& -"Y7?W!@o!٨?*xYDf"[ƶAX#Q1,ʼUʳAy+>v5 ^8O`Ds{WK|YV -nѽ69Z[x g\>*AJAR+Mffl28QJŲb"bKi uhX"XMn/W ?\٫DN*&TO~>t+?b{7֭<]JZ:r'na]jwE=]t9C1FyF>-G]hыO3baMȬF͖ؒK]Y -aM@p#ye#ŰeXbk}:&^: ю*>wme{\AסI;$9 ֚TAcYSLAOYImMPwzT)cC ,MJDtfa}M`3WlasR v<A\ZYMt @q4uArc,o&fB Y -cJ/r*8䑕Iûmkg .k<w@i|Ђ ,v3ש J۬Tjbz#ƚFA$ JՕ;D&ZMLVf*lރP)zeM?{j*e>kЭ|2W <tPJ`+# tM *#:w.AF7ǛW)aSXAӬ9uӻ!Q(0tXOƓUOa'g)]+Q%6E4 -H,CMl zMj~9rHo -E=km1p=bM"̰LD5N,vZA % *` hZ?>z>5EB̀6"uVz:)8.cdb)",J>Amr>̘˥ f˴=%P]Ag nu7ZoQ50\zI ·OIveۚyY9ESvʛ ޺5 +%k0D<=r`AxP6, I0W[vJקKwޛ{>,rt; -}o;6 - _mJKhZl9QO)?ԝK䛌LIRWG"WE͡ȏ'p!Ə'exaÏ'1p!lӌ{=|At7#2XM?H*':[!/G -$`s-UJ.m8eurgBT\ qS$񎳿j5һ "s! aSkx^EFXҁXJSK/c5 +x[[k,7~_1 /`˒BC|8IY5g6wl8gBRnZION=筗e:{\Mso39+N~wWIx>qZћ9mN8ӗ?~~#=|?1hn7| {Z&]ח~|gzӻwN37~D?y(s~/%L^]}Sg3i,c_/w,~~E^tZ@\[wE +$ᮉ1Pbf(jQ3&yx[!.yѵτn:8`E0x{b_`D ߨr!,$Dtڀ4E9U&kb~MX-@ϽQ  +VW\0c5zr 3(cZ`!f'uc){yQs#swv`1Y|\zΠ1՟z :3h1 lW0&5Im7-kx2 hq<f&HE D: 09@y/7@sH *Y9I/P[Q(!BDp-ø>&"mP41kL_\ܰxI&4Qyj|{XEV~PAu>W+B&0ɦIbf o +mFJmPI>¢'|`9ނNC-;eeU%tFk%ˠdg!M5Ean(z{ QŚBL4*UNvϳb + +\1X z,Wi٦(s"`h]]T{kj}P={Mu{]}m'DX8ʼUʳAy+>v5 ^8OwJ{WK|YV +FlspзA>ri%W֠T +)J(T,+ bk!6o4Pg,aE*մV.e:٫DtN*&TO~N}(Vr8^ݾn8Rfײ Pʝ\umZ{M_zaҿ3t)MQv5E/FԒ^\5!aK4[.uMg)5rc#Fȍ+aPIޫ)V﫧4]6B:4i$DwZ*h`,k)1B7?$}{~%UjRI,l{|j*lJV- qN`3AyNA.%5Y%w3|rxYM\%3d$_Tp(#Iûmke &k<{@i h>vhA-v3ש J۬Tjbz#ƚFA$ J^){9wD&ZML(Cwƺ*QIwO᪩RC <(s3"?)}5A):ǿ27t*#:w.AF7ǛW)aS1+Ѓ:OׅNoJFdK7Eozhm1p=bM"̰LD5hN,CvZA CU lY?}~j`>"kIIpA+%<􈥈D XZ}nV[3c.&0[|)9ޤ t >#sx-Bo9!)}8 p[#++>^~;M ޺5MѕVTPn"SfEa9BV( 51KBRl~Dg!Lñҝ3Eѳ}zFr@Xv9kn kKoR ^—-74)Es>s|1i: @H䪣h}b@9cN=䛣O9l#N=tmqo» <Dg~3( yC \Df-uא{sv0A* 7}H y{6o2:9Lelg*.-"_GX\l]p0)rɵf<"~P,^}bZR CM endstream endobj -596 0 obj +659 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 595 0 R +/Contents 658 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -597 0 obj +660 0 obj << /Filter /FlateDecode -/Length 4308 +/Length 4309 >> stream x]I#W$`Aꚑ/=@Y\YdU8>dm*[ȒٕoJFuFBQ+?߯aq}uHkuW,arB%/Pj29Qi~ݍz?;,.~V5po?^XbD+"Vrk~rg)wF\Ⱥ1* f[Iea/_?Ƥc,o㘉kx z=>zijv7 ]u\qF>~ާkM׵o^>Ǯ9hY5JķU ſP26 "^ʊTNJgQ ##y|rOӼR*!1'h+S2HȊ'`b{ȲN{bPFfR3>CؘY-@Sfk$f$X`_e ,k[@y#)a2ܣjKV4%AQyKۣ=H#kn Ӎ7)#A,I-bd1 La aĐ%o#@l@-4$/x^2m " qs:D~`ŏ7KP6V"% @@ -7887,58 +8862,65 @@ o E9^<,NܟԓxDPn׃j ppW['/lwϮ(\#EYB1C}=pu/G #=;%d32Ȭ\wSBKV8Gm|睏ip] J|Ch<'gҶOSFXZ4v&nW ,}4R:S”YV_*JOk^g]XDʴF:\zvpkB2iMktm.4؍} ؝vj2u 7>|REMhIA0!W&l2_u :-qRԄE ;}￳h/-'H ?祿 +HxG-4|Svzn%33/1Cxm@XK][Ɍ@z}qH? +"&ۇlIf0a"1ϼ endstream endobj -598 0 obj +661 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 597 0 R +/Contents 660 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -599 0 obj +662 0 obj << /Filter /FlateDecode -/Length 4139 +/Length 4137 >> stream -xɎ#9H 8!$1L2`\L. *ŌV_.wA1ǹ*̈`Gk77^^M8c8)B5LMIn:x囿d$_8츹 P/?+}1s:]k4f|qn:yoM+N8pVts3_x<]Ɩ1[IGZdZB|wIBQ2x|Lxh < :V!&DLJ!G)\FN\w5%!xCs<&οV+#4]|7Hm;k햙\Aw2^qh 3^$)GʹgWٿ'EHItg0C@޺H0=G~)MH;/:[Eb0,&$􅫕Lճy8SܪF..B3 4Qد抉6kffr|I#a_*aF]V,fIr5gS8IXVJ*Fg(NV~B.< 50m A.kzW7XcaA͙օ>r+} 裉Ζ W8xt[lЄ?7Y"QNHN`&yɁ e%*㼸q!f9x.gbIs6*Y2;g&Ej?+ڿ/d Ba -RYЬ,A奝aZj<pUl6lTO?~%SDQچ;kZ}I*y%=o_j3%Rg,QSd@ $f\x[Z?F]Adk ;\?6 FDhhz&30iJnmxqZ0 )lJ Y";͙2n5tS)muLD zIÕjθ79us:vO=m[@҅F) iZ0[K 3)#gW`^6m6bKS{}JvQB9!B7}@ nXJM O--te (6(CK`wP@眹홅o(Bjc0hf9jItl[@Ƹoo =xnD_ĪM~挹AĪGӅ_.0>$ ?ERL)lI8 No]=dFůH|,һ;Hodu$#? Ϡ?{k:ץN=yz̼v7ѻ`p"VTDebgV!'E -=Q ;#\yᙇ mw_hL}pYNp̧^1oHcG!{i<5^+6LPGD@v:+x)"JQ٫4lju1[nsO1RJAwpg-V+لM_Lw>PӃZe"98o0'îH/$pCcɇ\&pQ|)CZN*S5RAR iZ=HgS,8 -&W yp[lq;#ΊhּC6Nsg,辤b;X"GB0=YNGwMy;Ɲ1&4fq` a:ː)Mhum ቂC VL`A]]Txf&$O+9 ?\I/! ;,V^piE9^kײ#j_JY) -n 3Tx b@FK:ԷdV+$@$wolvrRKXC:u(xF ?;ErTg!cP_Ibvzmg*c=r -) te(27'f5{MdgܑH`6|&RĹ՗4!xs'5{Ǝ:"]9 -t. j9ֶVlD وp7;3 J սaOfp*XA,x'6p$pP#l4?c&X3pr# -85%[=b;xz,=r9q0Y;Y܌8Zo ^vԓ -hՌJڐVYܑ7ӗxiZ 6uݓH`.B=|]U0)(E؁'DfPN8 |VT%>g4xㅴmƱgk +JE - ;^ R\囯@eB5CG:L /DoGdj/;k8A_KDxʼnO795wp4XuJ+#l;mSzWFH -;n% -ن^P>id\HkGZ%}~Fy~or԰:Ue!J}:<6Jp80_5aDϨ?PfvZ̭pĵFo2ƃ<~l{4] -tը+XxۗReN;PaSpڲ}׻Z4Xmwt#PhˈpBŲEA:^'B -T 594Q>y^'T~0ƖzQòL!JiyCkhH-n\΀%m"ek~NW-8KJ,/(}\}ހ;,Qr^Y@M_;(% B@>v|P*PPKE-(#˼ELtjNq,̡ "FcaOP9`?rUx(Cv(n{| !š Qh_ޠ-YKxS; h $Dn!azֶDxڙv \E;sXi0m  -U K[ v3Z]5;-š8>"x) fC‡ ީK]m~g;#fWQk˘ >&Y>TNz333_oÂQl"1kpKfi՝,8h@i:Id&fYK"q]|cxzs_.8FiȜ:ڏ9'Ӣ' SO*2gwyOНJa -3|(o6q^3ʠ󋛇'7.[#ΊDP  Gcmשn&OHEcd~@+ٸImd/Hٗ{{DGDA)ѹ5ESA1Y+ +xɎ#9H 8!$1L2`\L. *ŌV_.wA1ǹ*̈`Gk77^^*M8c8)L5LMIn:x囿d$_8츹 P/?+}1s:]k4f|q}C3ӯ8nfx gpz@A89 xtL>s/3-B|wIBQr&|/~{P0eAx-1 &t ̿ BLTǙN!B^+!$TFN\w=kJB󸯚X~VF1Ninn6yY+oIΕq- 猖PB'N?┭>BkQ[S&0U"C|>hlB Jd]ʖbk!c ).dG,dnMW-КH+KUIWAa*´!abf/a&[*l!7b,+yp|,$j2~ÈYB oF$ߞ#{yL-h}̸A-n  }je6Sylg[H5e_hf9 +Eohg͜|;fR>&HC+} Įn+ + 3'sU)$,]Tv+}%Yp}xgN~B.\xŚf Un;֘dq%SܺGte}4z + Y`n &07x]$J15I)4o33s`Hzl8/n\.):cޅ)AQ,ɴd!iÝ2%%37/TY}!kr(/Mhʪfmd*/ RG?u^*w6hFT@6k-i %zm%6,ͭ@آ=j-%M`KKzH߾Q+fI%sfFlF@ prolGOqi*1ism)kXp9w>1[K)hr<>l,]"k鳯73sJ_-Wrk+Njӂ oh0}'N`CPX8͂qiΔqӨa +Li_cR%J׋LJT#pxvQ=DyoIR $i]T(ø?lV/%xΤ"b]{ +=gPۈ!wk.No?mlo;+.hUQB9!B7 +Ph(PY2w=P@ EHMx,JYQ ay`OǶl+vQqN=3F$Am(v "VM=.Ztq z3q[b@ &A pp}'qŴ8)m~y _z數NE+"(kDԒ$gY4-A56E_DZ&":-i/S&ڭC`@&I4,ZdJeKj Ipz&D0*/~ +QdΗR)HPwKB8@ x]DKГǔyc 'bJNT'vfa}R@ޱ3"ȵy v(Bkd +u2c>u&𚍈v4F {Ja챗SRqmKtuD dLSۻ(IMZGn + LyS6G{A#twVbM(t3 ++:=(aU!+Im-eÆ=vEza$CJDK>2C@KwrRB) +JHF:] *: S+^+_Uh3˞#tDΑR-dv7RGymޝ$0Y(}Iv.-Dxt`z (Vw ;c\MiHtFt0!S+Mhum ቂC VL`A]]Txf&>oIy6&?4ts%'$Ѓ $7[y}pSxv^*lw}1*e(<-JضgSۃ-ד2#MlYouC vPߢu[v +TܑnM>mHȹwH.a VP֡:G14(7Q$A}Vj_鵝y{fXvVw),zQLjHLr^s4YvNjsRsG"݃&LKmdV_r͝R;O t(ٺ46BZ[E7d#lXZ(&+5TƇ^s5 U DY&\s8tBDIvvs1tDts{ +^sIcUZ2<ʶ65yed4~_ mhu^Jƅvi,QN Yhh8M _UNܧc9mC + s$$xF7S;Ogbn}V#5]wNh}81c;pأa7*P(+F]|۾-CPpuށ + ҀK~ۼϿ˭E6ﲛe QBXFS,, +2}VzMm+R1`8FyiN@S]![Em*28b?c+i!jp9B :]sCΧ.)۳q}\xܲFye 6}'bΗs$9WA@]B/S̏,BZ@2ѩJ;ű0'9>A!HUD ١ p/hD6D}mDxvWd,^Nq'a4 "̆魯Zjg1pilgDwaݧ5d(T1,m6)htmפRp^f﬷D'@w^|A|h4΋D 4x/AXwݶ팈_EI".c6dZi8X!a4XP9`:O[D\δx\fS~ 2F`x.mVwqFA&`e.Ĺv YI$fU!sZKh?v.TNd&N8>Ƞ (>yKCw J+(Gyň>kFxCI͏GOgE{T⣏|16t?WR"ް-ˉĀٍ +~r6qR{G88$ 3R?>Q㠔܇ ӠpX endstream endobj -600 0 obj +663 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 599 0 R +/Contents 662 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -601 0 obj +664 0 obj << /Filter /FlateDecode -/Length 4517 +/Length 4515 >> stream x]ˮ#+i /"81`dqG8Rd?Xn]&),<4*VzȖgA"`BΜ/~?[AAO>Z9 C<{)tQ?O> ?K`et;9W/r_wzƮ=b&覿?əg=H?UYT"篅PAKZJ/3~zl+)Gn/ajԆqcwXظ6}Nmil:79w{UNAK\b?_/^xҺ$GnXZOcuoĠF:ث㬗˟N JLBJw2.>^E]yK5X)MNx1()4?+jV-Jh߽]B42 %_ :՚aH' -%:RD!)O+b,7&7:L GV+Ќ%>0d#iQFZgMҤrRGtXhɀ| 1_i3 IFo ΢D(F(7bv4id篯!h1*2NyPNuj>2GcT|].sa $el|)VKgE|Z/ӓ$Sh |nn,l<3H}6\$VFqrje W`D2@" vڛԮI!ɭ©$ʬ_CY5ԦxemShnBdY%$v@q @@ -7961,21 +8943,21 @@ Y& =o`7q{U$A]KY[P1Ȣ/bTQZ%]Q}ePctR$:UrBeDm^&>v^tNͿKٲ?'eX/>lo"?NIr%kv>%L]y 5-2:PBtp\``)fzv6`㺷ge|51ۯ2_%_ߩzKsYsA5M5kMף{ul!2!᪲1˺̙ $SFecⰂ>bYS HcV7) Q9`XWELOM ?ӊoߞ^ sk佬U}X{JͲ XbUZHwKy#Җ<38F-gN{{t:ՋʧSC, xXN0C9i)`Z'Kn\5vYJ-R҈gHjޕbwQ5V]u'TjKEKY*RQ`KEY GO,vԺ!blqPnꭚ+ӽwrRTb4Jr 3,/ѭߪ⼷lst0' `88Ay7atuRTKmy+L5J$'M煵V̞]|,cQnW#̹CSIv]J gZj=XyN˷ÀgadJ &#WwA]exNy<|X νՉ~sR̀!T endstream endobj -602 0 obj +665 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 601 0 R +/Contents 664 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -603 0 obj +666 0 obj << /Filter /FlateDecode /Length 2521 @@ -7992,24 +8974,24 @@ o% |XZLLJԤleVɉÎr.; MIAڣv﫚!":M'k?z˲:7oLMz)\R>w,j3*Ԧm0vYAKڠ9cUxP u}SP]ij8kM,"E͡so &YX+۾hSiPGN B kܜ ~^rɃ*X48>>4X&@Ӹ)(1& -]NXieO M7ν`mJpزy+|\Oya\/C8v+$85ҼZ),G{@ ht(~"bJz@j5ß7錄wZC9#!=?>Sz2 bQ:uFX2fc9rXzNzz~=H́@E}zEyoJokA1!q5#䏮QA8$NF75dJXG4&8mKpl1!B둮^L>!] 4=K[Ǎ5eh^.XzǑ)p_Q,ŀbu71xLd6Q GVN Q:ŶVVtqqI IP^w29.Dj&haD7ܨfbŒ[*9 {m\ޗ bwhQHŠX8oY{vjGՈn۷/}^7M['[@ÔXCڻ8]ls#SΤa6ٮdwpi<F@R10Cn,K?0*7 WrY{/!AqN7ąϏAt>Iun:,#&K?ikn +]NXieO M7ν`mJpزy+|\Oya\/C8v+$85ҼZ),G{@ ht(~"bJz@j5ß7錄wZC9#!=?>Sz2 bQ:uFX2fc9rXzNzz~=H́@E}zEyoJokA1!q5#䏮QA8$NF75dJXG4&8mKpl1!B둮^L>!] 4=K[Ǎ5eh^.XzǑ)p_Q,ŀbu71xLd6Q GVN Q:ŶVVtqqI IP^w29.Dj&haD7ܨfbŒ[*9 {m\ޗ bwhQHŠX8oY{vjGՈn۷/}^7M['[@ÔXCڻ8]ls#SΤa6ٮdwpi<F@R10Cn,K?0*7Tj:!UIUqh™R$'tC\(TH+t^ߨS2boRk endstream endobj -604 0 obj +667 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 603 0 R +/Contents 666 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -605 0 obj +668 0 obj << /Filter /FlateDecode -/Length 1915 +/Length 1912 >> stream xZm$5>}EENANVN?N~8Vҩt;[Ap}N'S5#x-Fz88|< WZQnFtvz '(HV @@ -8018,22 +9000,22 @@ x m;D9tSgѾlcL{p7wU{)c<)-:/TS&إk ̠,ئxT%UWy.?TmwdD(mWT=sf@X~Z3:dZS(Ć5wH!g0#V7љi5j`v֬z--w3XDfixs$i%W0#MI)97,}o 73g֮ixj I߭ [OVg8ͱW0@9Px,*9UK7=n۳YD0!RߢeaK78;zԠ= ܘZ7)+a:-&[i8S ZFB(ul05) %aYhDrQ 'y4ߠhΡoP[pW[ovpֵ{4N3U{j8g7j^iks}#rIX˘^j8P}{tk{"*.G_+(QGXJav|U^^襺)+FM7UYgj^ 8d!k[)`E!384%(ȱ,%V?m$=.?TmwdD(mWT=sf@X~Z3:dZS(Ć5wH!g0#V7љi5j`v֬z--w3XDfixs$i%W0#MI)97,}o 73g֮ixj I߭ [OVg8ͱW0@9Px,*9UK7=n۳YD0!RߢeaK78;zԠ= ܘZ7)+a:-&[i8S ZFB(ul05) %aYhDrQ 'y4ߠhΡoP[pW[ovpֵ{4N3U{j8g7j^iks}#rIX˘^j8P}{tk{"*.G_+(QGXJav|U^^襺)+FM7UYgj^ 8d!k[)`E!3XNl2%V?m$=> endobj -607 0 obj +670 0 obj << /Type /Annot /Subtype /Link @@ -8048,7 +9030,7 @@ endobj >> >> endobj -608 0 obj +671 0 obj << /Type /Annot /Subtype /Link @@ -8063,7 +9045,7 @@ endobj >> >> endobj -609 0 obj +672 0 obj << /Type /Annot /Subtype /Link @@ -8078,7 +9060,7 @@ endobj >> >> endobj -610 0 obj +673 0 obj << /Type /Annot /Subtype /Link @@ -8093,10 +9075,10 @@ endobj >> >> endobj -611 0 obj +674 0 obj << /Filter /FlateDecode -/Length 4155 +/Length 4152 >> stream x]_o$ /PE=m\҇6@HZ\Riͮ9#y9÷Q(GҊ?kׇ/9_cGsHgOA3gBpRh;~ϻywBJfD;)W}xBc#+{f]"*8s5\=SnKzx9s}97O $@=˟uk٠d%‡ H5^A{s>w0w8\ILL%i6M܏j!{$?ZǤJb1孔S)m@c_L` L @@ -8111,23 +9093,22 @@ d 6 =} "e}.dEu9&:B5s@N9}ImZ LHi KHPb_֢$U~dgB37&[C{dx7KG=Ķ%Bèlk~jۃgWC3BcqNDl^F`I"K^{4Q[AGfPoIb{m~D{qJg6z'J֩m >5|;u6iKZ|#̮st\0DDF%i_u3{5 $|:CTj۝ވHoBSsHDzr}bOέ||uZRnh!(zM+U6`tPa:ZGCY𘰦:M K@8ŷΘ[`Ran&_i: 0^DzE_9JaǑ=+ewmd@8JמP X%[(B֍ SeToN.(9h׆} Z0Ԟ 󌁧գ{,CA aaS (73 bh|o/jJ&UWunYA! z/أ -yB/QzczP42w֯%rG&_:վPU/Q}s5zYi0'z 4D?~7?}#IEV3wP,k;T. Ut]`?WS"ē*f4 -:!y~?Dm < Dg]RO_ +yB/QzczP42w֯%rG&_:վPU/Q}s5zYi0'z 4D?~7?}#IEV3wP,k;T. Ut]`?WSLe乀 =CFvS r9?ϏhmA5r+ O endstream endobj -612 0 obj +675 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 611 0 R +/Contents 674 0 R /Resources 4 0 R -/Annots [ 613 0 R 614 0 R ] +/Annots [ 676 0 R 677 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -613 0 obj +676 0 obj << /Type /Annot /Subtype /Link @@ -8142,7 +9123,7 @@ endobj >> >> endobj -614 0 obj +677 0 obj << /Type /Annot /Subtype /Link @@ -8157,10 +9138,10 @@ endobj >> >> endobj -615 0 obj +678 0 obj << /Filter /FlateDecode -/Length 3435 +/Length 3433 >> stream x]$9_OQ/;|H@X ?WH]_"<yUGճRMd:#>Y3CDgT)xw}wU@M?B䔋t&*c4X:hBg^N9딯ɪul B|œoO.F9Tjx(m4ut` #JDw~雳J?jmO*z33g[fy] wHOTG.0GeQ+tpOݯd]dK}!# ݍ޾GGش+痮{m?mc+}NAhgU3\{G(π<7517P6Ԙ;[֥<3:VR@*m VƊӬ˅ 8Ֆlsy,b5Dޖ_[^F0^.ODm eKVN',ZN,ƌ涸j kܪ1Zkϙ;#(xx4 @@ -8182,23 +9163,22 @@ C& 2zHIlM={)Rs*~GAt''ȗ6tyU{zUi%eߥ"uyV;ayvTyVfBZҳZg)6*2;WYV((dR ll5&mZ1H-Dc(GM}N"\͛D o~ 6 ogvnG)"|Qκ6: h&p#K!=`q xHV <2AQ*p衏0?#Qdܶ]7oo++u; /T~Ǧ˗f, Cy' 76fIxiއ)/UЇSnɓ2>-*Yɑ\"6eba?WI |~Y:) "Ɗ -'煨WolmM'Cnc7f&:q7snv~ g(B]lasV?#=`h-MBÜAbק/]yKV[ -X)GȷS\c3Gr*b +'煨WolmM'Cnc7f&:q7snv~ g(B]lʿ{T[к*[c|)Ch4`\ 3owKA 6<v*klf/ ) endstream endobj -616 0 obj +679 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 615 0 R +/Contents 678 0 R /Resources 4 0 R -/Annots [ 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R ] +/Annots [ 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R 685 0 R 686 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -617 0 obj +680 0 obj << /Type /Annot /Subtype /Link @@ -8213,7 +9193,7 @@ endobj >> >> endobj -618 0 obj +681 0 obj << /Type /Annot /Subtype /Link @@ -8228,7 +9208,7 @@ endobj >> >> endobj -619 0 obj +682 0 obj << /Type /Annot /Subtype /Link @@ -8243,7 +9223,7 @@ endobj >> >> endobj -620 0 obj +683 0 obj << /Type /Annot /Subtype /Link @@ -8258,7 +9238,7 @@ endobj >> >> endobj -621 0 obj +684 0 obj << /Type /Annot /Subtype /Link @@ -8273,7 +9253,7 @@ endobj >> >> endobj -622 0 obj +685 0 obj << /Type /Annot /Subtype /Link @@ -8288,7 +9268,7 @@ endobj >> >> endobj -623 0 obj +686 0 obj << /Type /Annot /Subtype /Link @@ -8303,10 +9283,10 @@ endobj >> >> endobj -624 0 obj +687 0 obj << /Filter /FlateDecode -/Length 2764 +/Length 2763 >> stream x\ !^-8iQ4P]'yCJG[EFѷLq5..Uf BqҢ+_K":%>(غalR!e]pZY ȓq hc2T$__=q_i"<~V>63Yd .\S+8]*`pG+*Bt˃clgDZ9*@K˷_4x761V`LHX*E8*[2ԽA$Q"&䬱]](;\R|"z+i}4Mm?JĖ1*}$$89FnhPl14)h"qX@u$-HelEDCԍL^$H 9LvtЬ\%ۼS  6 |R[ԉ:l;= >~q#fej/v]@`rEc@ C>6dZ&s# Yn}=H>1(5+\ixI&)]'9@S6Rrx;- JH вA|7l@̆kfP),72er`FEe<[jN/`ZP`LHlȗJڵ-1X uV]Ŷ6P)v2hIWPe}Oqwx2MQ*W=M轿'1QZ(Uumd{Eb&P3sD/;"yo2/$^lQE!ݓvPwZ+-u[+5KΞln M@/N|/*ܿ+Ѐ( bn,&"E]u' D -w*1mkRJ 6)T-)[fQ1^*-)[fQ1^*vĆڳ]*_ endstream endobj -625 0 obj +688 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 624 0 R +/Contents 687 0 R /Resources 4 0 R -/Annots [ 626 0 R 627 0 R ] +/Annots [ 689 0 R 690 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -626 0 obj +689 0 obj << /Type /Annot /Subtype /Link @@ -8348,7 +9327,7 @@ endobj >> >> endobj -627 0 obj +690 0 obj << /Type /Annot /Subtype /Link @@ -8363,122 +9342,120 @@ endobj >> >> endobj -628 0 obj +691 0 obj << /Filter /FlateDecode -/Length 2320 +/Length 2322 >> stream -x]Mo$ϯ?EX$`@b`(@${}ru?bO]f>Dh$L{G9Cר߿# -ֺr}pԯX>^霤^{ 5j*QLYss/?^qe^z4zm|[m̍ Qh 7/3#2pS;H?3 l eg5@ZڻYg OVބhk݌?C!}͟<vO౽Y-94.uB30[ Vz+P:^^.4+Qh+nXAZ@7ROnDy30߼PZeɋ?Cx K(}hPh &3FaCNag O&9kG3ٱ}g<vO౽>B;}fş1J^8ݶU]χ.ۉ5z*鄛$Qh+nXAZ3P -^m5H|(4OJ9{g('XB'0Bg`\77͟;''FT=V;(:rr {7miVxє(iךaziy4F,B9^hj E,ZH7 '3S٦Y¨}N0m -Ρ8ŻxNI#]'ҘbY{%׷]hQ_:ޙ:۩OԃVLN!^REYOQFn%։ZRYG])x HմY(D%~BDj"HIHnixr(U_gYf1`^NgityM#ݖ5QZuӡSjJKMz3L2t׺P)MP_QZFb5JC$f.ѴɦP8m56~8>i@eJBYukƈy}<ޞLc/J4̢EэGlV+d/y!o^N֮[=<=Qf5ruXI˧w3)ȻKk;o FAU_?9 +x]Wf, ,`6I &#'X՚f׻~b:d=3V+>QDרjBk]j>rpA8ϲŋ?,A:'^BiZ +@SO\~KAb&WSt~|uO!^^ L==~z.Ta3.L|^Ы\?}GP[H*n9rkSsJUmPJLTw\ﮔԔJ޽F[6+C)M2<-5i9kDl ,؈`^-:0vz> Xj$>˱U4v7!,KrN0,^pI2Qxt#.߈ZJ߃GȻ k$Uh̐bOpK/%A}Su&96$I +CGݩkYQt]@%21c +f˯PA cU'ؾ'$K@n F]h1ІspJ\VgO·0r +2?_fc ?6U& +<"9E]cM7=ߦPXctPL1qk =kg'₮y1ЮPXCݛXj50X~xK҄2k &i3flfy9٤@臧6+Y<+k6C]ڌҝ,h}JD%K BE]2І[ Vꢰ4O2PW$db+{Q, GV4Fft +J[5O]tepm U?л/Cx0^w ꚷ&i2 l e?Q 05臧&D[ųi2ԥť;v6&h-(y}{35 J^5>mpm%/ +3>ݑ5q ? BYhÏhda͜ψB"XNuS62~>Ca:ά/Cx8.D]g]7}7MHK{5 Sġ7WZZ7Px2ܷ>%%TQ, Vᶕ(>3װW'_5>m ,>C!xTzM "Q<h//3VYWeP(^ +kc45o}ugp +~Nְ!\0N3O}&9kG3ԥ/cζ<vp'J^p^LX?f!ו>3E6J^8ܶUUNۑ5z*鄋$Q, GV4FfjN #Q<h//3֓>;YPb p$ꚷ>3 l eHW(O\]1N3ЏRэ{v0\Q*\unZ^7Vlx(iך0\&9zZ=4tM;iL*80ju ڳ0jͬ!٣5%0vM:u1@K].k4.o?@I革ödO=HjŴHZЅ0Z6) +jHԭ$:Qk^5(,|m\MUD]8<Ų'"fÏhXDaݿ<('a /2V,,F2.SQl.ϢaQ۴& +}8t{Bxi SoIF.L숃ٵNTo BC=Ep֡Qt7Y𺉄K4-G1a6^E=6?|0wfC#ߏ yvӤ2-ZeDnn>=>,7Do>G{&++OuX]{ϋ#4t;>8nNs2f e&U:;cDzxr^?헄|D,^ԻqzmIQKFgJش_o|=\*P\a%p=]>I㕺z0.ǵ țDQ3W~ endstream endobj -629 0 obj +692 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 628 0 R +/Contents 691 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -630 0 obj +693 0 obj << /Filter /FlateDecode /Length 2301 >> stream -x]Mo#W"Y,X!@$9$p> RZV{fx*<Ć,ɖ+>ܤQC -u)_Wzr%H$K(Qgb˜Nsə(k -:_~:}H!}ߞ+%*a-oW}9רT&)L9rҫDl1ثƠ(~>}?/?))x~tڲÿO{ЊDdʒRTBri="* 4DNz1g~kP.. /3J4 O<%PN9' `.FܼNMIu%stTEUMB[rHSݱv4Q9:~ -\3]91&,/RRqHGoii磆w83$Ң#hg6D<+R,HtE -Ҫpr QQ&@+\Dz -B}:/Uw(FiiM˨һ0 /J7ᶞhAh|iipχx -I,_!6pw5%H.ޤ MuqrH05uDb -y_BnF)PfiZ:'̇}p6L怹jղ=GK9NZW, V鶕(-nJk!q2fi` ?6 -U&|JKZJ땼(4Otipm> |ȫ p[ LYW; n^ nWCi%W˱,M} @^-RV<+jWC!v^r,^<v\<7E4+yQhop+ytJ^6(v5i:z/ -~BEm*HkJK¡I^Bf`L9M͛x=Ox3p:2}%4(4ooufpؼJ~5AӛtQ͛7.::Y -80{uˋ"!K_EYO9hm%.Jl}>>tZ+wQh?+nXAZ3P -^m9&Zc186?*ۺFc('jеz-Ay10PZse1]>ic{2TuǢӀ B20[ Vꢴcn.x w:ƲHŗ1Ċ(Vy2@S[p3$ -ӗ1|~/Ci -񧉭 ('%-Ay{307PZÛɛġ7!} jɡqInƛ7mc ҄z{IR:-0-|GL4>8*z" >Ί'R4F*\Ba %J:{=І@sF4 +v7niii2'LKM'Z_EZ&!޹BWHM0#]M /ˁW}AS]i6; G~)XB^Ɨu>հY~,}غV 9u@,ƮA-e9`.:MJ^ś1J^8ݶ )]'x yE4^Bx30Pt +Қ9RphEW<oNFof(- %ܱL{}_o +ۛqݼ6oҲG+:sFMocP`of%]dTgEmf(ʹαN*`,BN7VbH+qQh/Sn[*si!(a+]ŏ1Ċ(V̹2@[en~ N͏ʶQ&JI)tzePh~ &1\\Ɣ~ 80@m~ 4|\n~/`Lcp'2^nuݱ4 , V鶕('XK@:^Ý3,!fe` ?65s %Юũ-n N͗nVxkl֒ˠм͛M`f(jЛ> ofи7n7PHÛѶ1^x+ xs$OT౽|Y:&Mz. +n.n[zdN a !Qh+nXAZ3Q +NmʍBg`LyN͟xagT;M.1n n?CiY+u?qx-$3kuwo@?QgMj]zfg` NEiQ&ϟtCB30Xt +zg('vmV)/!n2~?Cim'3?3pSZYp$ +۟q6ҲiEw{'ӟʡTuBz͟w~> endobj -632 0 obj +695 0 obj << /Filter /FlateDecode -/Length 2416 +/Length 2415 >> stream x[ݏ _)JbbkQa&{Reю38n cGDG>쎖?q/3)ep<}>|9XCh֘/@2z Rr)% C0!X:_Ҟr0d-%::AcR痟>;c?pfB!%DxKWQiV Y/oMц>)HU0 s0(w =]aw, 1A÷||;k5 }+UQ zq|14ȓm켵gi]M|I[D!UwG&9|wO66et`cˆ6 r4Bn׺OnZ٧VU\wҨeT`0⦪f&UIv3S7s@7Jh3c}lra;FP\0Y+JjʁgN+9 ?4/B;CB+yu>O7a;{W,+48ڜfZ ⱍt]K4WOkpb=7?9*=tJ q$Ͱk73{Ä̗zhcy<7 9ohS*ڰjr6=r=;;KnEg065Ahy;_]حtXIx7_y-"WaSҳ,eL_w+A 6FӠO'#Cf{r(s:Z( &prmHGTZ~%J>! xĎݭ0, oU>jNudHh(PpQbj%8^ެ_QD֏'7}3E%d 3g$Aǿ2o9noNn9cg9,TW$g.ɔsJjְڞիagA.!, @^xjCzz 4DN$,*sghWlʳӱ6U#o:-ޣH!6jqَ<`tAK7q3%xj1ˮ {I%l"LTGΧD֩W-KʾsR薂 dK XYtߩ%͖Bz}j)J{Ø G%U..ഞۂ~A8׌A^縏G\IM*ٖIotwB8X0-3֒.6[=^rl މtA\dZ{! eOKxSگ^qYUٴ%$NmhڴB$ rZKBk Bup$]eܱ+gh ND5MCbr m/m)i1>>iI6]Qbxo @B㣟}Лr -ͽЍh\9<>iI7hvrKn)"=>jI_vyKnLd&o鴤Ǚ<6^=ֹ^,&AG:-q{:ʚZthmK MDH%vŚŭΗF`StN N l;[sd-ݽҦ(w"$AN}b'mSnʙ[O܉X;nR$uMvӡ J:{mG&'rC0ZqRbA}; |? KR_a]\S?Y83~|30ܶxxqa Dc29&3e41fF -CIfȕs\,7p9;?c.M4oVZ+οL.xLI%mps? P!W +CTޭ/ =q40pg̥ɘ_[kɥ7 n_h!) endstream endobj -633 0 obj +696 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 632 0 R +/Contents 695 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -634 0 obj +697 0 obj << /Filter /FlateDecode -/Length 848 +/Length 845 >> stream xVm0_?`.LX Sm۬(t=3d赜@~<>8~:i9џ$롳N@qPC+mVZ]x}~tλESԀ>wJwʡ1$ą(vP!'"^9@oﻫ7<~!31ڌfh} @͌EDvĴ$6ik Z 6mL56M8^B5^/,cR6dXcL,OYf AY.wmcb3grC(KlO.q\Ft wA#3#}čSc!| k͓KaQEX\y -JTHF{إcS b_GNnLsiSW>ڡ(_}7ϓggd̑ w./9e+ORWA"=! 4H -ų 2m.5)+v^bo 4 Nv4e `0׼l'10.>RL^ŬX O̅᧫AU8g;ǧ1"uy}nե[n(ICгŮ >$&_g4&^v&s%lT"ScgEy/qZQ1M9>Ez NQAV([MGqƖX~i,-!GTˀ/R9d|ڡ(_}7ϓggd̑ w./9e+ORWA"=! 4H -ų 2m.5)+v^bo 4 Nv4e `0׼l'10.>RL^ŬX O̅᧫AU8g;ǧ1"uy}nե[n(ICгŮ >$&_g4&^v&s%lT"ScgEy/qZQ1M9>Ez NQAV([MGqƖX~i,-!GTˀ/R9d|> endobj -636 0 obj +699 0 obj << /Type /Annot /Subtype /Link @@ -8493,7 +9470,7 @@ endobj >> >> endobj -637 0 obj +700 0 obj << /Type /Annot /Subtype /Link @@ -8508,7 +9485,7 @@ endobj >> >> endobj -638 0 obj +701 0 obj << /Type /Annot /Subtype /Link @@ -8523,7 +9500,7 @@ endobj >> >> endobj -639 0 obj +702 0 obj << /Type /Annot /Subtype /Link @@ -8538,10 +9515,10 @@ endobj >> >> endobj -640 0 obj +703 0 obj << /Filter /FlateDecode -/Length 1608 +/Length 1604 >> stream xY͎6 )Ւ0CaS@уl=lݾ?PJdJ2d2E#?R2.@y^._N_O K#G~=)'\0%hG^ TtQ)aRoN:]P8D)`#poOV|ttZuiRPF_'Ť6.1&<OɀFPpvlo!\C0J{wFd z%BW @@ -8552,23 +9529,22 @@ o@ )ݐt;8DLIA.A ,wfՍ?әcAn%,:m4W׫ueo ̓XN~rpyAqX;gN~I~ fz4p^[PRa>Y~{VW&Ft*g #R= $Im SVz:yzZSSG/5qxps`6hqEkU2Gtn} lS{UC 8ZI4ΠTaASFV}f~cs-S(rHojRRN9$`CS@ m'.7k 5!ɌZ kGWFΰ]m',jqir}LQg-;jVyU\7)ǪTAeN|8:Mvp/m>M΁К#fT,u*0r&҃dUo^z2r_F`'wMmnH#<v8y7gkulҢ:^*q='v(:rڴ*q=7FЉnzoNc ƃ#4,Ώus*LW蒁3`з2w}F.5ޟ(RpZ_MғY$)J- Kgvk-k 3ZR=Pfu+/Mshy 4`q*4H/ ţII1. $0LҰ^PBtOtjf BiOhe/SxVpʸ'tܢm -D NmF]bXQsҥHJ>ۤ[Y}:6G@]Oɣ^zVEQ@ٗZ/G=y8vQPv$p{_n ͊yuR)xkyenTemPAh\˦&E 6zzHڔ%)u@`7":qr.?I*'|,i4{VŠ"XmnP[WMP|E_clf& -oU[TJr(ey\*{v;ɢ9 _t +D NmF]bXQsҥHJ>ۤ[Y}:6G@]Oɣ^zVEQ@ٗZ/G=y8vQPv$p{_n ͊yuR)xkyenTemPAh\˦&E 6zzHڔ%)u@`7":qr.?I*'|,i4{VŠ"XmnP[WM YIwPR*-*GM%F9_W.I-D*L=@d/Ɍ endstream endobj -641 0 obj +704 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 640 0 R +/Contents 703 0 R /Resources 4 0 R -/Annots [ 642 0 R 643 0 R ] +/Annots [ 705 0 R 706 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -642 0 obj +705 0 obj << /Type /Annot /Subtype /Link @@ -8583,7 +9559,7 @@ endobj >> >> endobj -643 0 obj +706 0 obj << /Type /Annot /Subtype /Link @@ -8598,10 +9574,10 @@ endobj >> >> endobj -644 0 obj +707 0 obj << /Filter /FlateDecode -/Length 1816 +/Length 1815 >> stream xZKo7W(|(^ @@ -8611,23 +9587,23 @@ x -1Iqs(LP j*q(L)(lBXq@;^t݇G UI;,0j|+iYU=*D1rI4, 艴X]zfGZF5.w^Z7'vS! ؞(;+I6@jtnBܦ$ʹ6<;=?&c^Fh)~Dqdqj>|-d&#l-DWGhkFN88.o"kJ;0Dgt>+#e:rbzCO釟I8@iilWG}x%I zCeOHio>JGr֔)&z0v|:7jjZ1W ݸET Z|#IyM]٥oہHɂk -7A\z1"~n5m( hݷjt8[4C&uZba;R0Ul*T1 tp t$&ś~B-̕t>'P %-|ʟ*!\->;Gn$,f3Q{V\'XA܈(oSluv 8g8XeUjx;'07bt/5`6PHsk5<Xx?2O'6Qw ZK͍f}zKn11b'>Mѝ`tC=QWzGt cg`锨 ZfDH,T?""^3t%޺jj4pyC#oZGTԜx?{7{BR78yݏo1w?TB>r<~لD@{~;c9buܞJ?~_,8 SS̫R. a< k%bvW9*YD8!G`ì ->~(2HȆ9LM/jzrLO:OncB%βO +7A\z1"~n5m( hݷjt8[4C&uZba;R0Ul*T1 tp t$&ś~B-̕t>'P %-|ʟ*!\->;Gn$,f3Q{V\'XA܈(oSluv 8g8XeUjx;'07bt/5`6PHsk5<Xx?2O'6Qw ZK͍f}zKn11b'>Mѝ`tC=QWzGt cg`锨 ZfDH,T?""^3t%޺jj4pyC#oZGTԜx?{7{BR78yݏo1w?TB>r<~لD@{~;c9buܞJ?~_,8 SS̫R. a< k%bvW9*!Y= ua`ì +>~(2HȆ9LM/RQOnIgmL(XYaˍQ endstream endobj -645 0 obj +708 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 644 0 R +/Contents 707 0 R /Resources 4 0 R -/Annots [ 646 0 R ] +/Annots [ 709 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -646 0 obj +709 0 obj << /Type /Annot /Subtype /Link @@ -8642,29 +9618,29 @@ endobj >> >> endobj -647 0 obj +710 0 obj << /Filter /FlateDecode -/Length 623 +/Length 621 >> stream -xT͎1 SI;R @Bfڝ@t.:91:$"sr isٕJq!DU)^OÏsX! K4܍=fM^.WIܒr)V$5)6؊]ݷiOe*8q$9 Tz!^kj^ 2KBKrēpfvwV~/;]WwBH>(vB-t%Dֆ9Uʨ*ZִlCuҤR׳d]cOma4;2i'&1CyO'-Uř|&c>΂XKm[z]H2]%[tu'd:<ּ3jXXe7Ln67%F{wݨ3ofvK0t;UѢWaw;loS<pJGf,: 't{X|lz 1*}htQEVeIʃuD| ,@*& -*uh˅|E 餺'+ ?%z`a',YZp7k5ђj{\%">sKʥ(Zפ`c+n|t!wߦi<8yC($' S27?腬V xUy}0,x, A,O™4}wXцJat_~ " TEZtԕt*eOԨ˗&]u?O65F1[F#{2*{8tҥvr8v${c'YKy#cdm{40WUF*-#ƨq|X8↫a]c s\2ܔt5Jwݨ3ofvK0t;UѢWaw;loS<pJGf,: 't{X|lz 1FQE?’eL30X6H8\XN +N p~JR3yvn:`n`6 endstream endobj -648 0 obj +711 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 647 0 R +/Contents 710 0 R /Resources 4 0 R -/Annots [ 649 0 R 650 0 R ] +/Annots [ 712 0 R 713 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -649 0 obj +712 0 obj << /Type /Annot /Subtype /Link @@ -8679,7 +9655,7 @@ endobj >> >> endobj -650 0 obj +713 0 obj << /Type /Annot /Subtype /Link @@ -8694,30 +9670,28 @@ endobj >> >> endobj -651 0 obj +714 0 obj << /Filter /FlateDecode -/Length 925 +/Length 923 >> stream -xVˎ6+v_$C ?&%y4,fmXhh6U&1?_2c̹rw;&Gxh#V$‘s\a_Ea"}j{+ Ĕ`,5C=?zv.Z DOA?;iAcN93_~k8w>3o&O3NmAHͲ,kQ <G4Am @ ϶lr>?O3 S: ~=̓rxOchT80J&]@ Rj`TyIѢ5 a!HL3d(=bmh L]ҲX*Gs]|Y)`=y4aOO9Ez5~]XȽr[L #k%v)}UiqԊ^f< t`x\o?@@{yM{(a"a -Iaį~ˢOtve,C`Ʃ3<ܯZ@*@`Q>*&ۯ48Xםa\T+]`j1zH v5 Am|0}4$eIG'1 eWT6}@)+\pKyռj/Pb<~\u@Ytic_bRSUWԁs#6^? -#%;Ֆw.sz@v1MMb,zM1}q}3HfX\;luW"cNhf(G9]"{%*2Y7Hg9Nڗ A!j=30XjB| pEFvk]( /m۳N4$Va>̭< +xVɎ6+T6!prprr2r;HInu<݃*= -3Ɯ)}h~4ɯY"43 sDDH§S{P4SET {1Bxo7@P۹l 76HKD93s8~ןxTs#;_# =-ߜ6!2JX'9G6d/bxgCt׽e|'OH d iÛr/EEcQ$7Z`8pTTsʋfI UD`|VڈIa]i%k/L?IsZրn1ֿJ{brd u| عktOsG>i>MSN~SfCn:,r/d+)Ț`q5t]R_}H7>rj:0<7]L$wSJBzY6=0 w (q*NL:3"̧0p5=˼++Iue%e4y ~*0Y@t];&j&❠l:Opi2ꤣ`2+2@FRx[wd ǔk F;W&`4i^9\oz X*OL< 5?# y,[lTPJ~JAH endstream endobj -652 0 obj +715 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 651 0 R +/Contents 714 0 R /Resources 4 0 R -/Annots [ 653 0 R 654 0 R 655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R ] +/Annots [ 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -653 0 obj +716 0 obj << /Type /Annot /Subtype /Link @@ -8732,7 +9706,7 @@ endobj >> >> endobj -654 0 obj +717 0 obj << /Type /Annot /Subtype /Link @@ -8747,7 +9721,7 @@ endobj >> >> endobj -655 0 obj +718 0 obj << /Type /Annot /Subtype /Link @@ -8762,7 +9736,7 @@ endobj >> >> endobj -656 0 obj +719 0 obj << /Type /Annot /Subtype /Link @@ -8777,7 +9751,7 @@ endobj >> >> endobj -657 0 obj +720 0 obj << /Type /Annot /Subtype /Link @@ -8792,7 +9766,7 @@ endobj >> >> endobj -658 0 obj +721 0 obj << /Type /Annot /Subtype /Link @@ -8807,7 +9781,7 @@ endobj >> >> endobj -659 0 obj +722 0 obj << /Type /Annot /Subtype /Link @@ -8822,7 +9796,7 @@ endobj >> >> endobj -660 0 obj +723 0 obj << /Type /Annot /Subtype /Link @@ -8837,7 +9811,7 @@ endobj >> >> endobj -661 0 obj +724 0 obj << /Type /Annot /Subtype /Link @@ -8852,7 +9826,7 @@ endobj >> >> endobj -662 0 obj +725 0 obj << /Type /Annot /Subtype /Link @@ -8867,7 +9841,7 @@ endobj >> >> endobj -663 0 obj +726 0 obj << /Type /Annot /Subtype /Link @@ -8882,7 +9856,7 @@ endobj >> >> endobj -664 0 obj +727 0 obj << /Type /Annot /Subtype /Link @@ -8897,7 +9871,7 @@ endobj >> >> endobj -665 0 obj +728 0 obj << /Type /Annot /Subtype /Link @@ -8912,7 +9886,7 @@ endobj >> >> endobj -666 0 obj +729 0 obj << /Type /Annot /Subtype /Link @@ -8927,7 +9901,7 @@ endobj >> >> endobj -667 0 obj +730 0 obj << /Type /Annot /Subtype /Link @@ -8942,10 +9916,10 @@ endobj >> >> endobj -668 0 obj +731 0 obj << /Filter /FlateDecode -/Length 2627 +/Length 2623 >> stream x[ێ#}W%w` FN` l#CKy ;dC6ْ],V:U3_S9QϧNYWz%vYk^1plcBER2Nߟ~9rn= ,L oOsӧU0~{h73!C߼-h&7w-)u~۟,|K\7Η Sç~2n֋oy>3a@nN߾aumf /sؤ%C/&iuÅG?/V(|P7 }_j8פ*0,,g\+#NtP;% O;!AK5k?^ @@ -8954,23 +9928,22 @@ x IP su}< 3%³C L|yQCҙ΀Х@O׮U.\J2J{dH0b$t`a^1|a`yE+ v&k!vjcD\ϣ䍝aVh\}FI)#,&s0&yQ`Tה~8KY&3%T" FkĨ/ڹ<*fWOz&ߨnRl˕;rBxn :PIƹ0lȂ۪m|wH>aG倎'.=•LKLeQU|v@- JVd ]KnTxÚg@1PLL3Q䨂nsnL17yQG݀" hh1JYv4X! 1Ʋ"ZiP }5lZQhj꠹AL0Ȃ,ք)(f\K[!+=Q0Ҹ#V4%j=> `VY =[/H !]݊|w;4JaCqy♆|]ˑ'= b%^ ! { EWs.VjxE7^(`U!M8tSJN̸VPpyG8UCo0T(1yxi9en]MYlTgm>M47U.=q)7U7i ݜ>h-YUDŽJC֠_knP#,vTYw:4A< rˤ‡j3euX=28d""SXXgi$B  - 5uL#W(]LE0UpA c{,!\l -,…t$F8GB%wXBfzHzg^5 + 5uL#W(]LE0U7" Ŧ`.(\HGbis$^r%-ni'w5" endstream endobj -669 0 obj +732 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 668 0 R +/Contents 731 0 R /Resources 4 0 R -/Annots [ 670 0 R 671 0 R 672 0 R ] +/Annots [ 733 0 R 734 0 R 735 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -670 0 obj +733 0 obj << /Type /Annot /Subtype /Link @@ -8985,7 +9958,7 @@ endobj >> >> endobj -671 0 obj +734 0 obj << /Type /Annot /Subtype /Link @@ -9000,7 +9973,7 @@ endobj >> >> endobj -672 0 obj +735 0 obj << /Type /Annot /Subtype /Link @@ -9015,31 +9988,30 @@ endobj >> >> endobj -673 0 obj +736 0 obj << /Filter /FlateDecode -/Length 963 +/Length 957 >> stream -xV͎6 )Ո%JbEöR@у#Njn(gd]4GȏG0k -*Hq4iENH/|,)ΐ#* B ʡϷ)hiMfc0iOU1X }{;❲蠂 q|~~}?Cg+m֌N;vߦzwwwi3ǾP xG/eαqSxlÓokK掻=/joZOMWޛ,|y?}DiCJC|C[kZ`~U( ՇO4Xв.&ŧ:WƿF6͎m -22 \#LUQ9:&G"[$k?`P|̡ ^u&`ce9E<(e ŠkkXe:;pڰ9e Xg!VH@$r)P]dqK{-b(m{^F DNH"=Nb D>\/wIz@(gzD(0^"l\+Gv,׭ -%=J_+Q?^YN퍆")O?5d!vC^o|ZlWs+-E ޾!G(_ܐMZ|ӟǧɒ 9 ę (m,OZZi|~zVh0F9>,s?PzFu~W EF+VB^&xlE:`B@/_ϐ3ٔ6NkFôg![Vy> endobj -675 0 obj +738 0 obj << /Type /Annot /Subtype /Link @@ -9054,7 +10026,7 @@ endobj >> >> endobj -676 0 obj +739 0 obj << /Type /Annot /Subtype /Link @@ -9069,7 +10041,7 @@ endobj >> >> endobj -677 0 obj +740 0 obj << /Type /Annot /Subtype /Link @@ -9084,7 +10056,7 @@ endobj >> >> endobj -678 0 obj +741 0 obj << /Type /Annot /Subtype /Link @@ -9099,7 +10071,7 @@ endobj >> >> endobj -679 0 obj +742 0 obj << /Type /Annot /Subtype /Link @@ -9114,7 +10086,7 @@ endobj >> >> endobj -680 0 obj +743 0 obj << /Type /Annot /Subtype /Link @@ -9129,7 +10101,7 @@ endobj >> >> endobj -681 0 obj +744 0 obj << /Type /Annot /Subtype /Link @@ -9144,28 +10116,32 @@ endobj >> >> endobj -682 0 obj +745 0 obj << /Filter /FlateDecode -/Length 573 +/Length 571 >> stream -xT1 WڱR JE !iKؙvvEDq~s@TXJ0}ND`i,&m{c4Dќȵb X#"$E$÷ϋRS 7;~ Gs4G8%mt7؀bj_[%RTxwyO8 5͑hH!E mwk$-f hb9l| Gt{>L簽H*1' ,Y#D66,ϵM.<^yۗ+٬3hCm+9L<{d Au_of<+?R*ʈ<2LENx`è|J+qTb~>j`Ρ\ry@i#tMTӵѩklssȁ% :gPOLMV2X0؏qMDAԁVrf^VkgҐmBGI -DEbvV@. \x_S KǾ\@zAqtHd̦L"KJOZ +x͎1 yvlDZT¥RHCgڮ8N&]vbۿ1Uc)u8 Ubi4I#łb0h? oCݯFQh@L) +Z.RW`napc8ԥH(AiwK~]ۮ>7o +a +ɔwt«hD#qԗnIc T +sغo߽xq?d%a)GծĿ\Zxڡ/RǎsUOwc U{%n~@%,> endobj -684 0 obj +747 0 obj << /Type /Annot /Subtype /Link @@ -9180,7 +10156,7 @@ endobj >> >> endobj -685 0 obj +748 0 obj << /Type /Annot /Subtype /Link @@ -9195,7 +10171,7 @@ endobj >> >> endobj -686 0 obj +749 0 obj << /Type /Annot /Subtype /Link @@ -9210,7 +10186,7 @@ endobj >> >> endobj -687 0 obj +750 0 obj << /Type /Annot /Subtype /Link @@ -9225,7 +10201,7 @@ endobj >> >> endobj -688 0 obj +751 0 obj << /Type /Annot /Subtype /Link @@ -9240,7 +10216,7 @@ endobj >> >> endobj -689 0 obj +752 0 obj << /Type /Annot /Subtype /Link @@ -9255,7 +10231,7 @@ endobj >> >> endobj -690 0 obj +753 0 obj << /Filter /FlateDecode /Length 1705 @@ -9271,22 +10247,22 @@ x S5[.w@2t3[0~#Hұ}:>@zIP&}coFA ּ8q ƒϩ3*:g;Vr>fII7 hv8h|mbqjw#d 5)ʚ>Sҡr6hCѯ Iq0-S"H1B) n41s=,ap F& -6KM)*•`ur\ m?l{xJm jhG@U%}o*i}GcΕC=W9~ \ow@rˤVsF;(LWb*?KKJhZI$<7NF/Xj0AD L[]IPx͌.FMsE)s9g-P-k5Qn E[ +6KM)*•`ur\ m?l{xJm jhG@U%}o*i}GcΕC=W9~ \ow@rˤVsF;(LWb*?KKJhZI$<7NF/Xj0>qYaϡ]1(9*Rr[Z2jX}sZ endstream endobj -691 0 obj +754 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 690 0 R +/Contents 753 0 R /Resources 4 0 R -/Annots [ 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R ] +/Annots [ 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -692 0 obj +755 0 obj << /Type /Annot /Subtype /Link @@ -9301,7 +10277,7 @@ endobj >> >> endobj -693 0 obj +756 0 obj << /Type /Annot /Subtype /Link @@ -9316,7 +10292,7 @@ endobj >> >> endobj -694 0 obj +757 0 obj << /Type /Annot /Subtype /Link @@ -9331,7 +10307,7 @@ endobj >> >> endobj -695 0 obj +758 0 obj << /Type /Annot /Subtype /Link @@ -9346,7 +10322,7 @@ endobj >> >> endobj -696 0 obj +759 0 obj << /Type /Annot /Subtype /Link @@ -9361,10 +10337,10 @@ endobj >> >> endobj -697 0 obj +760 0 obj << /Filter /FlateDecode -/Length 1724 +/Length 1726 >> stream xYK6W5$C`(ze+!-CctmxWy734 O)Jz͗}>_4 @@ -9376,23 +10352,22 @@ x @8UTUSVXT ' =9(YWׅ{=vfc`Y1*]A;N&C>!ؖ漫*B]>~?ҵAYZ*v}"ZIn:;s0dh=@eD#"L|*'PI\QMZ?IDT~T::EQpt0K'ܖ'|sԷ Lr0MOs'rkww|3Sے !^;3(7  k oqDiEU/̉u>iOgrr}01А̀TɎNp +!824 % -Mmh Ȕ\dxNW+j9a& H7!E q\ itVd!  B6)ȷ+> -PPEX:ډ"@@^< v? K +Mmh Ȕ\dxNW+j9a& H7!E q\ itVdA6Q\qAp.XtW(*F8_r.N$QxƳ  endstream endobj -698 0 obj +761 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 697 0 R +/Contents 760 0 R /Resources 4 0 R -/Annots [ 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R ] +/Annots [ 762 0 R 763 0 R 764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -699 0 obj +762 0 obj << /Type /Annot /Subtype /Link @@ -9407,7 +10382,7 @@ endobj >> >> endobj -700 0 obj +763 0 obj << /Type /Annot /Subtype /Link @@ -9422,7 +10397,7 @@ endobj >> >> endobj -701 0 obj +764 0 obj << /Type /Annot /Subtype /Link @@ -9437,7 +10412,7 @@ endobj >> >> endobj -702 0 obj +765 0 obj << /Type /Annot /Subtype /Link @@ -9452,7 +10427,7 @@ endobj >> >> endobj -703 0 obj +766 0 obj << /Type /Annot /Subtype /Link @@ -9467,7 +10442,7 @@ endobj >> >> endobj -704 0 obj +767 0 obj << /Type /Annot /Subtype /Link @@ -9482,7 +10457,7 @@ endobj >> >> endobj -705 0 obj +768 0 obj << /Type /Annot /Subtype /Link @@ -9497,7 +10472,7 @@ endobj >> >> endobj -706 0 obj +769 0 obj << /Type /Annot /Subtype /Link @@ -9512,7 +10487,7 @@ endobj >> >> endobj -707 0 obj +770 0 obj << /Type /Annot /Subtype /Link @@ -9527,7 +10502,7 @@ endobj >> >> endobj -708 0 obj +771 0 obj << /Type /Annot /Subtype /Link @@ -9542,7 +10517,7 @@ endobj >> >> endobj -709 0 obj +772 0 obj << /Type /Annot /Subtype /Link @@ -9557,7 +10532,7 @@ endobj >> >> endobj -710 0 obj +773 0 obj << /Type /Annot /Subtype /Link @@ -9572,10 +10547,10 @@ endobj >> >> endobj -711 0 obj +774 0 obj << /Filter /FlateDecode -/Length 2359 +/Length 2358 >> stream x[[,5~_1#(+*CϬsI:T=xuwzIU}uG>?^ }pV/>8syCpP`Ǡ^pt3!TRh;~CλR2#&E0~|ZUE\A"0J$g^z?}W|sǟQ5t-Rd|=޿zO-kʺiԿv횶e?U {7UƼZo IT5IoʈjgE5XoX~(x})UwH!Y 8:6x2xrײ`!KppxbX=b7`X;ȘuM~70g{FYsm:́D8D[cނd%. P&\x賔BLE iwp)DObG]:G4H4\q^Q3Tr@뺼<3x/01u3(rG, mHk) HPVFݱGge|26tZ1 ˬEL9TM6сPB}-bq\fnנs\8:ۜO=]@ݺO-TzY]5][Ԥoj60)$ΤfXkf:KsZu, i* o?Q (\PʘgG=}: k4A sX SaK$BsTewbݖPm86mGTђP˹QMW'1's(QE/[v0y p^۶ۗ{jeJ-۬犷 1Id1ykj? řr,Gå'-`?D~Lu&_T~l@A 7w%Nvh`+ķ+#b0G7_A DyxM6k3O\#k'J}(z$ -ͻj-%2i /xuhg6u!O޼Op>rqǔs";kUOK0#lɵ)UR)/]x]=x`P,&,Qe`U uA({>.Xy4fE0\f?4 +ͻj-%2i /xuhg6u!O޼Op>rqǔs";kUOK0#lɵ)UR)/]x]=x`e3f ì +>OI8#@D8BwSj k ׅ ?N endstream endobj -712 0 obj +775 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 711 0 R +/Contents 774 0 R /Resources 4 0 R -/Annots [ 713 0 R ] +/Annots [ 776 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -713 0 obj +776 0 obj << /Type /Annot /Subtype /Link @@ -9619,7 +10595,7 @@ endobj >> >> endobj -714 0 obj +777 0 obj << /Filter /FlateDecode /Length 1704 @@ -9632,22 +10608,22 @@ B) U()BIF te_3>Y-^o9ki|00Xiu[㐞c]iC7~ ;>&wKֵ܏tlP6c`- XˍIT5~*+6PP9UFtΥ-FlTȒG2*ǧ& 7: 3NXjǹɆ ϐ9$0 w ⃞Av^gmc|{B oޖ6BO :G w-mpHycM! USb.A'o]CFER) Xބ)0! 'Ku-Lq\2rGwC^F3zqyyf󭊌 QdQq_{ Ci VnY UEꑢX2`lUTk 5M{Hkb* C@aDX W(s ֎xvoh1-=j9악͑35;=4I:>DQ˙c&δYt4'͎bD[x.#CfIzqR;lczzl|p{ǒ,%y _ S>bSf@2IJz0sp6u˨q$= qJؠ%@,f3khC4guL%͝qa sD,7ۅ%BMzvo&9Qsy!Ȉ/)TF@JCIi2Y}!+skA7 +`OPGPy;90^zp H`PʹLE3Ex {9cM'ɳّksU"oZΗ2u*wJ(?:Yruvx{1Mk[^x`ag<|ۋ˼o.n Ic\k.{(n! Gn5߲j$njN `ce1FJ%IEITHASg#AFW~I9 J7RʟJJLAV_ZG] endstream endobj -715 0 obj +778 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 714 0 R +/Contents 777 0 R /Resources 4 0 R -/Annots [ 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R ] +/Annots [ 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -716 0 obj +779 0 obj << /Type /Annot /Subtype /Link @@ -9662,7 +10638,7 @@ endobj >> >> endobj -717 0 obj +780 0 obj << /Type /Annot /Subtype /Link @@ -9677,7 +10653,7 @@ endobj >> >> endobj -718 0 obj +781 0 obj << /Type /Annot /Subtype /Link @@ -9692,7 +10668,7 @@ endobj >> >> endobj -719 0 obj +782 0 obj << /Type /Annot /Subtype /Link @@ -9707,7 +10683,7 @@ endobj >> >> endobj -720 0 obj +783 0 obj << /Type /Annot /Subtype /Link @@ -9722,7 +10698,7 @@ endobj >> >> endobj -721 0 obj +784 0 obj << /Type /Annot /Subtype /Link @@ -9737,7 +10713,7 @@ endobj >> >> endobj -722 0 obj +785 0 obj << /Type /Annot /Subtype /Link @@ -9752,7 +10728,7 @@ endobj >> >> endobj -723 0 obj +786 0 obj << /Type /Annot /Subtype /Link @@ -9767,7 +10743,7 @@ endobj >> >> endobj -724 0 obj +787 0 obj << /Filter /FlateDecode /Length 1946 @@ -9780,22 +10756,22 @@ q5 .ƷN3֓Ʈ0e:!g֏F>} m&뗤YvuRj%)wRvHRSmEddK{nI=EFdzeS4:uٝJwL,0,ܸ;nڬ=8}z͜@-'+ܥvt1+/: d}!JH8.7ߓoV/NrD8AmY);<>,~Q!VH'TSo~? +C<_>=8}z͜@-'+ܥvt1+/: d}}BAP,8ߓoV/NrD8AmY);<>,~Q!VH'TSo~t? endstream endobj -725 0 obj +788 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 724 0 R +/Contents 787 0 R /Resources 4 0 R -/Annots [ 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R ] +/Annots [ 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 797 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -726 0 obj +789 0 obj << /Type /Annot /Subtype /Link @@ -9810,7 +10786,7 @@ endobj >> >> endobj -727 0 obj +790 0 obj << /Type /Annot /Subtype /Link @@ -9825,7 +10801,7 @@ endobj >> >> endobj -728 0 obj +791 0 obj << /Type /Annot /Subtype /Link @@ -9840,7 +10816,7 @@ endobj >> >> endobj -729 0 obj +792 0 obj << /Type /Annot /Subtype /Link @@ -9855,7 +10831,7 @@ endobj >> >> endobj -730 0 obj +793 0 obj << /Type /Annot /Subtype /Link @@ -9870,7 +10846,7 @@ endobj >> >> endobj -731 0 obj +794 0 obj << /Type /Annot /Subtype /Link @@ -9885,7 +10861,7 @@ endobj >> >> endobj -732 0 obj +795 0 obj << /Type /Annot /Subtype /Link @@ -9900,7 +10876,7 @@ endobj >> >> endobj -733 0 obj +796 0 obj << /Type /Annot /Subtype /Link @@ -9915,7 +10891,7 @@ endobj >> >> endobj -734 0 obj +797 0 obj << /Type /Annot /Subtype /Link @@ -9930,36 +10906,42 @@ endobj >> >> endobj -735 0 obj +798 0 obj << /Filter /FlateDecode /Length 1671 >> stream -xY[$5~_`{EEVAVsqVK%ՙ9ef3}:IU}#O0R36]Q̡P6O{x(sf[̥c?'y,W>gsZI<7V˴^B *{c*[E UAA4ľq@u.KS$Ȕq\F&Kڔ9=[X!8@lZL@>eeM<_gCT E>v@Z ǀ̋)ºu%DuUJh<σ"9ZJ]bur^(YAF6+j&)/,Mƺ)iAWn,5' hb]I]' |d\Q,ҽ((|{k1oDTVY矱<|Y%I@ƽ]A[YfsZcΫk/AɇlNk#ҭ ح̀77)c=Bx~Jz>vɍ -AhlBs Zϋl]Vsyʮ/~?1jOָ\A`PϿu׮8F[BEt=X\@"ܪҘ9<6z`e5S)_n0+4Y`c4E;>jR&%ZOg2])HLxjå&h(w&)[~ +-궮>_A^\kqK!Ub YesX :'n vb a>p>z~|bі܂"_2MUEc^1 bn] Qa]gղ,ཡ+A㴖R,кr2? eHƬ xB5 YO&}]Ҕ贠+7ܚٓl$.VU2.Tu(k^F}Ž5}qo}ۘ7"*?X V@D>E묒$ .ͭJmu915GPw![ڈtk|<vk3vFF}mMJ_V5˫"Ta[pqpU][ +ٍ`r#rV(UyXS*ٹWY,lu,/<F[rUY'޲myaJG"7OreS}e6pծFgbn{ 6+fl'l;ZB4_(n6ҾV"V$C[+-*\,/Pxpo},2XE&O +=@T8MkQX0zb(lU0H$ QY,'ڮ!˽:#,lip;o` +?zKmXkLC +⛤Fe,vz>q3t`P먱T)c/! $6R̈́ $;E/*D}9}OuW~qA endstream endobj -736 0 obj +799 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 735 0 R +/Contents 798 0 R /Resources 4 0 R -/Annots [ 737 0 R 738 0 R 739 0 R ] +/Annots [ 800 0 R 801 0 R 802 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -737 0 obj +800 0 obj << /Type /Annot /Subtype /Link @@ -9974,7 +10956,7 @@ endobj >> >> endobj -738 0 obj +801 0 obj << /Type /Annot /Subtype /Link @@ -9989,7 +10971,7 @@ endobj >> >> endobj -739 0 obj +802 0 obj << /Type /Annot /Subtype /Link @@ -10004,37 +10986,35 @@ endobj >> >> endobj -740 0 obj +803 0 obj << /Filter /FlateDecode /Length 1773 >> stream -xYݮ6 S\ .8 pE7{`-ٔl'YIY"i!*'P_ӌt>W>V0cP t=vhwZ+إ7=*{yyyb<A)3sT!X۽|8_~mi?DyO<rIN^ZVeyldĉ1#P# 1{AWu<$ Һ]-WV -YhOZ:ւIH.yۣYЌƉFF3<كL@ 5"K3n#q\+W -lacEN~eCB-' -KJA(q:|-p3)i)F9:{ Cg鶦SsH,29Gs 1y"UFgOۆa1n:bX,,^|h:[/~||RB5+-Xr,b{x1Ғ0Nbc2}Ie:zWdf01^T ])i=uTt"^~EލG9Fd}e_'B] W[D*wE`.rb/B]OƤS疒,*H*cC?J.J(-Prn]Xo7B+vxlf>v:C*PΦϴi`;m?<ĤC^Q}hrq2mD,N44 PǙ"5^Uձv[6 -' +KJA(qu&+i)F9x C'鶦SSH29G bDZI 6>{6 ig4w#*difsUŚx cIi*j\6|V[ lM'uc0buB9/GЖsO!@HƜϜ^w?3;YNb#hdʹL19[~"gde{t_ d޹[ס2h8< +{+xYmFk2Nks /p^ 2xq_G5 e87*.{"p8m'_^t^D|䅁]xCۈB2M.Fr.<:ppq_<&wl]j_mr_Td'_]H!ŏGbr|=WHQ]y8(d?6X3 䲹ypB;7guܫ)&_U€0@X M131>mԴ1ɣjj`<4eU/3ƚ Jͷ+W_sN,.mVZ̔2`\86 -NrýtiNFk'1m>$j͒'!h=::Y-dW<̕ jJA)vqEi])6հutY/ *F #>YqBa] WDV$6Ħ_ׅ.+5jN[Jh`DRV㰡fflbۜ -օpU{#z%/; n_GvH6Bq82|lyG3|+o1B.nȃeÉFq +{E;jkjձvW[6 +E 8z-t8 r;De~G( n +~Uۯ[NPȅkE26E@YOErL#`_ż+y0r<ŇT$=uV^qH˾*Zr endstream endobj -741 0 obj +804 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 740 0 R +/Contents 803 0 R /Resources 4 0 R -/Annots [ 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R ] +/Annots [ 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R 814 0 R 815 0 R 816 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -742 0 obj +805 0 obj << /Type /Annot /Subtype /Link @@ -10049,7 +11029,7 @@ endobj >> >> endobj -743 0 obj +806 0 obj << /Type /Annot /Subtype /Link @@ -10064,7 +11044,7 @@ endobj >> >> endobj -744 0 obj +807 0 obj << /Type /Annot /Subtype /Link @@ -10079,7 +11059,7 @@ endobj >> >> endobj -745 0 obj +808 0 obj << /Type /Annot /Subtype /Link @@ -10094,7 +11074,7 @@ endobj >> >> endobj -746 0 obj +809 0 obj << /Type /Annot /Subtype /Link @@ -10109,7 +11089,7 @@ endobj >> >> endobj -747 0 obj +810 0 obj << /Type /Annot /Subtype /Link @@ -10124,7 +11104,7 @@ endobj >> >> endobj -748 0 obj +811 0 obj << /Type /Annot /Subtype /Link @@ -10139,7 +11119,7 @@ endobj >> >> endobj -749 0 obj +812 0 obj << /Type /Annot /Subtype /Link @@ -10154,7 +11134,7 @@ endobj >> >> endobj -750 0 obj +813 0 obj << /Type /Annot /Subtype /Link @@ -10169,7 +11149,7 @@ endobj >> >> endobj -751 0 obj +814 0 obj << /Type /Annot /Subtype /Link @@ -10184,7 +11164,7 @@ endobj >> >> endobj -752 0 obj +815 0 obj << /Type /Annot /Subtype /Link @@ -10199,7 +11179,7 @@ endobj >> >> endobj -753 0 obj +816 0 obj << /Type /Annot /Subtype /Link @@ -10214,10 +11194,10 @@ endobj >> >> endobj -754 0 obj +817 0 obj << /Filter /FlateDecode -/Length 1967 +/Length 1965 >> stream xZˮ7 +Po "&-Zb @@ -10227,24 +11207,22 @@ x 7 ƽ*I %Ay^6NѲ9EC\FXҹJ,rNM36;[pL}ѝgt<OףWx87?5v"f2>T݁X7YDY٨y4ZPܲ!Ctj7] KhPf]D^;Hٌ57hՅ1αk#ѻ+w\zB('& ?]MȮ֩dpz2*(ϧz4\3\w!ݳ.h΄'\hȷz.DaB$^)M KsaUEhԊySH_SZSћJH֝"<#GT6fxWtnRFhCdw+oMvguϒdoYU@k f+y-Nr H0D Ow6V 3`"]\2,~ldle֠D#]-jOf٤ /xȯn2JY}]=s<)cWd[d3;w9DA od,> endobj -756 0 obj +819 0 obj << /Type /Annot /Subtype /Link @@ -10259,7 +11237,7 @@ endobj >> >> endobj -757 0 obj +820 0 obj << /Type /Annot /Subtype /Link @@ -10274,7 +11252,7 @@ endobj >> >> endobj -758 0 obj +821 0 obj << /Type /Annot /Subtype /Link @@ -10289,7 +11267,7 @@ endobj >> >> endobj -759 0 obj +822 0 obj << /Type /Annot /Subtype /Link @@ -10304,7 +11282,7 @@ endobj >> >> endobj -760 0 obj +823 0 obj << /Type /Annot /Subtype /Link @@ -10319,7 +11297,7 @@ endobj >> >> endobj -761 0 obj +824 0 obj << /Type /Annot /Subtype /Link @@ -10334,7 +11312,7 @@ endobj >> >> endobj -762 0 obj +825 0 obj << /Type /Annot /Subtype /Link @@ -10349,32 +11327,31 @@ endobj >> >> endobj -763 0 obj +826 0 obj << /Filter /FlateDecode -/Length 780 +/Length 777 >> stream -xQo6 )")R@bC7l@9{؊t%ى/ ;I(aߡc4+9 DYTҨEP8Z !7Ea"89;Z(*Ĕ`&C GxKdПulB1du.꯷;ٴQeʳ4Nlf)ᗯMQݔBuXw'M -2̘GS*,UK8|}J$,$GCY;-7?RI0mۄzymmֱk䉢,:d92P:Ub*H2:8ϫ`<'(5wg 1 lqd\t̜x{9 -(|9rRA -,9K~#/z,r la|O瑷8[W sJנٞ_#Yd*iGtR3JϩDm^KLbR4Q۠{ n3n!ǽ ;>3ν!ȋ5q4OA=tLijs.HY܂]بDmiqMżSYgpqWzɾ`>-uAXv!QOMrd\Wz߷ӈ{V4*I{bkU=3ž˪bJ ɉTE -gQ}£ B^ 橻 5w3"1Sz2|^mt}\U?yhy^^Lٛ,j +xn6 ~ +jI) aaK)Z`=l(eɉ' f3 H2e~cѬh03U⤲~ Z$i#hy#Q& ߎßÿCi@L) +lR-0~aqG-ɵ? B1dO},p-_owi9.˔g hdFRX/_WEĥ~8tN*9ve-1{S*,ՈK8|}J$,$GC}bv[?!o"{amڄZy]۴ױk䉢,d92P:Ub*HzrFzus pRH_C|g{fGeIIg̩ˑπB̗#-7Bb"g'k?GY^cS枾^ЃS +l$SIe>ͤQ}N%oSXb!g>gp+qK=mFoa8tnmKXGe5wgx6;b%:|iV*`#6*yG\bς)Ƭh788+}5=}Ta٥DbOmp Mn8o}F?]޳GTx@d?Hu6`Xc*А(AU0pU'< .  yu3ZLɬmh{qUKrITcתW}m}GyF], endstream endobj -764 0 obj +827 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 763 0 R +/Contents 826 0 R /Resources 4 0 R -/Annots [ 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R ] +/Annots [ 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -765 0 obj +828 0 obj << /Type /Annot /Subtype /Link @@ -10389,7 +11366,7 @@ endobj >> >> endobj -766 0 obj +829 0 obj << /Type /Annot /Subtype /Link @@ -10404,7 +11381,7 @@ endobj >> >> endobj -767 0 obj +830 0 obj << /Type /Annot /Subtype /Link @@ -10419,7 +11396,7 @@ endobj >> >> endobj -768 0 obj +831 0 obj << /Type /Annot /Subtype /Link @@ -10434,7 +11411,7 @@ endobj >> >> endobj -769 0 obj +832 0 obj << /Type /Annot /Subtype /Link @@ -10449,7 +11426,7 @@ endobj >> >> endobj -770 0 obj +833 0 obj << /Type /Annot /Subtype /Link @@ -10464,7 +11441,7 @@ endobj >> >> endobj -771 0 obj +834 0 obj << /Type /Annot /Subtype /Link @@ -10479,7 +11456,7 @@ endobj >> >> endobj -772 0 obj +835 0 obj << /Type /Annot /Subtype /Link @@ -10494,7 +11471,7 @@ endobj >> >> endobj -773 0 obj +836 0 obj << /Type /Annot /Subtype /Link @@ -10509,7 +11486,7 @@ endobj >> >> endobj -774 0 obj +837 0 obj << /Type /Annot /Subtype /Link @@ -10524,7 +11501,7 @@ endobj >> >> endobj -775 0 obj +838 0 obj << /Type /Annot /Subtype /Link @@ -10539,7 +11516,7 @@ endobj >> >> endobj -776 0 obj +839 0 obj << /Type /Annot /Subtype /Link @@ -10554,10 +11531,10 @@ endobj >> >> endobj -777 0 obj +840 0 obj << /Filter /FlateDecode -/Length 1790 +/Length 1787 >> stream xY͎6 )Ւ`Ce)Z$bT%lf cȏ7F᜷FO˟O' ROj>N @@ -10571,23 +11548,22 @@ x ~B3]lJ KUHqqO]l)_會Ktɣ=U dpF[o]l V(QΣs6Ն#ɜ3[{-P%7o(U ûUtgby *{T O-~(D=$t ÃcZ9%$M]Ujq "@~ -ҁ_mI yl-OPUQnsRFG(L։5\ėA6M f!pƓ0ʻ= -e#+Bs~N+=_1'Ɍ"aNF!_Bs' +ҁ_mI yl-OPUQnsRFG(L։5\ėA6͜?A Y`xFyGႷlsE(ri+$Q;H;d?  endstream endobj -778 0 obj +841 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 777 0 R +/Contents 840 0 R /Resources 4 0 R -/Annots [ 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R 784 0 R 785 0 R 786 0 R 787 0 R ] +/Annots [ 842 0 R 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -779 0 obj +842 0 obj << /Type /Annot /Subtype /Link @@ -10602,7 +11578,7 @@ endobj >> >> endobj -780 0 obj +843 0 obj << /Type /Annot /Subtype /Link @@ -10617,7 +11593,7 @@ endobj >> >> endobj -781 0 obj +844 0 obj << /Type /Annot /Subtype /Link @@ -10632,7 +11608,7 @@ endobj >> >> endobj -782 0 obj +845 0 obj << /Type /Annot /Subtype /Link @@ -10647,7 +11623,7 @@ endobj >> >> endobj -783 0 obj +846 0 obj << /Type /Annot /Subtype /Link @@ -10662,7 +11638,7 @@ endobj >> >> endobj -784 0 obj +847 0 obj << /Type /Annot /Subtype /Link @@ -10677,7 +11653,7 @@ endobj >> >> endobj -785 0 obj +848 0 obj << /Type /Annot /Subtype /Link @@ -10692,7 +11668,7 @@ endobj >> >> endobj -786 0 obj +849 0 obj << /Type /Annot /Subtype /Link @@ -10707,7 +11683,7 @@ endobj >> >> endobj -787 0 obj +850 0 obj << /Type /Annot /Subtype /Link @@ -10722,36 +11698,34 @@ endobj >> >> endobj -788 0 obj +851 0 obj << /Filter /FlateDecode /Length 1364 >> stream -xXM6 WT+J(9 l%^-fRdL`fb["HGfW@P!Dإ/דV4ʊEy?'K3仈 -C;|ZZM?U5Q..~>}AM[6N u*]^/gMN-cHt5)K%l߂pLAx86z;gbwf| c4y<_bx' l£^DYٱ&-g\z?zo\gx埞׻j;T{TKOk0M\6N٩` -5!LX6fG̮kڵ[y?j F ү|q4pEJ+FW񵤕}~9G߰eJO !墥wPlx/  M0rMza)qP2H -ixrsuU6nmjv'xȡMfz{Z{Vt -RQx9Q -i`Z[m %#:=Zg콇xxGIdH{he溺Jmź]? -N$jkj~TvlzDFN :s"L$(7P&M X4I^u"3Raɝz@`]#Qxʱ/z?{?88;A t%aEE:Ԥ6 -XtUWYçk&[)z8 |Ml]H(D}5P+)[F-M'ђ4ʭM AE6&5WJƴͨR<]4wg -y[ٲW ;eX}рaP ai_aQ3C);Qy2%沭r cT,B:P+3VW,..lqܡ +"NrznDUAq}c=lӭ9ByýNJR9 G^c'$MAdhwҌʖW̬;[_EkuB,M3).t ,e@C C}8hY(?wjyePgjtA  +/7d{I\\.MFc8@ )29(>C\pxm*8;m9&~ןduO +0 zDYٱ&'![vv"=޸A7?=wvLk0M\6N٩` D`rQ1D0F8Cevt^Q<ſ 4߱l\0~\ "h%ȃX#oXeJO !墥wPlx/  M0rp08 s(Zći^i2H +ixrsuU6nmjv'xmzZP@$㞖^+²s>o#Evp1P2ү3pilܣu{9{wD&^~ʪԶY%D6֪MeAͦNdD(J1I."IDO"b}mj}M\hlWLTDGr:rKޯI;}`aWqmwҍjЕte8Rrb(0WW`ѡV]-f  +>MZLSenqfI @t(D}5P+)[BͦhI` |mLun}mۄh"U@M%IcfTnxu5.Qfl NBz4004\/(փgv뙡CTff7ql+fˀNnvR+).j騸Gpda~}(A64¤G3C!}qwkIuH"EI$vD\Mdz3#х}]J$"BIC+"NrznDUAq1M_Vw֜Uua}˼sg^Y'%~y+'Oʰ5iq>v0:⥾_˿I6 HY"+YQjuG׿aZs}#*K|DLo +*~KE30˜qX3hWבLy^M8+ڬOS\rlsڗpv̾N? endstream endobj -789 0 obj +852 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 788 0 R +/Contents 851 0 R /Resources 4 0 R -/Annots [ 790 0 R 791 0 R 792 0 R 793 0 R 794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R ] +/Annots [ 853 0 R 854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -790 0 obj +853 0 obj << /Type /Annot /Subtype /Link @@ -10766,7 +11740,7 @@ endobj >> >> endobj -791 0 obj +854 0 obj << /Type /Annot /Subtype /Link @@ -10781,7 +11755,7 @@ endobj >> >> endobj -792 0 obj +855 0 obj << /Type /Annot /Subtype /Link @@ -10796,7 +11770,7 @@ endobj >> >> endobj -793 0 obj +856 0 obj << /Type /Annot /Subtype /Link @@ -10811,7 +11785,7 @@ endobj >> >> endobj -794 0 obj +857 0 obj << /Type /Annot /Subtype /Link @@ -10826,7 +11800,7 @@ endobj >> >> endobj -795 0 obj +858 0 obj << /Type /Annot /Subtype /Link @@ -10841,7 +11815,7 @@ endobj >> >> endobj -796 0 obj +859 0 obj << /Type /Annot /Subtype /Link @@ -10856,7 +11830,7 @@ endobj >> >> endobj -797 0 obj +860 0 obj << /Type /Annot /Subtype /Link @@ -10871,7 +11845,7 @@ endobj >> >> endobj -798 0 obj +861 0 obj << /Type /Annot /Subtype /Link @@ -10886,7 +11860,7 @@ endobj >> >> endobj -799 0 obj +862 0 obj << /Type /Annot /Subtype /Link @@ -10901,7 +11875,7 @@ endobj >> >> endobj -800 0 obj +863 0 obj << /Type /Annot /Subtype /Link @@ -10916,10 +11890,10 @@ endobj >> >> endobj -801 0 obj +864 0 obj << /Filter /FlateDecode -/Length 1636 +/Length 1634 >> stream xYm#7 _1|m@K[ʵPlk#;$ݐؖG#ހ>8kN @@ -10928,44 +11902,49 @@ x f}JrJƅS!Őȓemv]p4{K}C 37sF_KlrYw%JNme3b^Ȋ$/[d% k" b6EÕ>Gr-v&F&1ҌZ6 KCs3ᘱm<zeC0x^8;)=͖Q*l~ɇ*68Ʊ)|aV~,e%/=mN|+][Kcl3*SAY Ǥלپڒf9欐l9ߓ [9I^cI#@n+_Y],_}X.ɲR2cܫXޖi=ye sJx+c:^.**'潨0J2.e_uihWY*|=']uy@4%cv%(~8 +Vdެ=8D&s0em׈ s Ox\-ӌ5`6ٮ#rM5(1Z(Kֆz/KG@N,G}T_!TV oVr~=*N3ZC M - pGJf6ڂ ޚv+F[7ƍ6}J9Tb~yQ| "o,avNb4Y`oN__}sWߜT7纯=mͧ('g7U)W(A 8$~_+f)ҎCIfI,QpcHa㟫ɜH2bC9 -ȗ0vPǷ8Ǡ|1>sѪfzUN<9~ + pGJf6ڂ ޚv+F[7ƍ6}J9Tb~yQ| "o,avNb4Y`oN__}sWߜT7纯=mͧ('g7U)W(A 8$~_+f)ҎCIfI,QpcHa㟫ɜa"f:ɗ0vPǷ8Ǡ|1>sѪfzUN<} endstream endobj -802 0 obj +865 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 801 0 R +/Contents 864 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -803 0 obj +866 0 obj << /Filter /FlateDecode /Length 1736 >> stream -xYɎ6WLs_cA  A)R,HYtDWKଞϗ/ΜVTsHg^09\*3Z)/_.(8wMBHɌ֛BLY0>}AQaHk8G/ y~?O"'(w˕sႂF{ S/tF]WI{gK>{zl0q9?=W6?g֤xϙ19Ǒ\ -r}/ʃPLIvx<u˴zJIOM֕`]Y72LCzJ3Ш9&+J_qbX_|7% ĨhJX(qGu?f7~yq}|a!ZGCA9wRFÔRJQQV5RΌ3Y__#^%.6PM(hhWPJhj@mXT^TI9pu6Fϓ6&!@o(pЀtꋪ1!v7Sk3MKf̤4V=ۊV"N s sԨpw(œMI=8MXd̮"u+QP.@1 'ԮCvR^\mPv&癦ȇ;} J[q!$/zw v¨;p=n͕♖='lLin z?H `L@4Bqʺ#,Fzm#Z **{;S=a~}LEԩƑ<4 ˴ v=j;}k%6Ce9ݽ-'zFϨS:5>{>L{E;哵08JwF8q>@IxT1i7l`O{ۿk;g7-iN~g6epcб;qII&3&wy 3ɴt;_ `B^jf'*0:-!kg07R;vF6rc}H98vضMa''mhyu(:qNKFL%ڱQfW1Ijc\+lp]rsu2.k28dѼ|4pt'˪XOn!ƒbo !!AU31ׅrfxC _9' J?+yn%E9/B\Gh[ႚW\NYd1;l0B#8X!+pACH`f2LV`çr +xYɎ6WLs_cA  A)R,HYtKj8ki|r?iDu/ F:;ʹ‡ τRMJq7}x%wA1ǹnBJfDb_?]΂6ڶ C,~x6D{ZO/oןx?-|L}u>6&͍ז\|mv?]/&#uu~n:6&=}ϼlߍ( Gor-+5_(B1%ay& nϣPig'w+an4d2̛ 8gQsMVss au~% 0a*EScy0"SWƭ]e]U+DC W1O{ +JQKr2rLve-Z: qx퇠%w:e PALj16GmSF7"GMhM=#gn?9/Ãpñ%0HO\J[$qX p'͉ y0K3vxDPyB*Gb-L&= F^4{WNW7z.FtCk{vttyDB[v?Dbv*&h2Fv`dOK/%B@E_$24Y^~KF1i(]U  = CRR*P#jʑrd*iZ/,t!7 jGnG&EDqxz +&Զy΍ʋ*( 'ǵIx_ 9SZ8( qvb]E֐s5򙦥K#HfRVmIWcv'W9HpjT;$)aΏMI=8M Xd̮"u}+QPN@1 'Ԯ탿vB^򧵣\mXPvm{&}瑦ȇ+}tJ[q!$/i@6@Sm^wzݜ+)3M/zNN3%̃lP}'31n+ +ŝ*뎰wd;xh79^L%51C5a[- #wQۡ[(*c($n;֫{F^+ff(t|q g+Z%VO/ +0ǎ\M};q,󆫠']is(LzϜdr.0iz=Lˑs+ HK͌PzԘ%`7d FrN˦nTIg`6۲)섖qCeMQ'?.2)ɨߗD;6=m:uª:Q(%G?Ghۦ1wȶpYO_ДE:Q!ݝ/b +> endobj -805 0 obj +868 0 obj << /Type /Annot /Subtype /Link @@ -10980,7 +11959,7 @@ endobj >> >> endobj -806 0 obj +869 0 obj << /Type /Annot /Subtype /Link @@ -10995,7 +11974,7 @@ endobj >> >> endobj -807 0 obj +870 0 obj << /Type /Annot /Subtype /Link @@ -11010,7 +11989,7 @@ endobj >> >> endobj -808 0 obj +871 0 obj << /Type /Annot /Subtype /Link @@ -11025,30 +12004,33 @@ endobj >> >> endobj -809 0 obj +872 0 obj << /Filter /FlateDecode -/Length 738 +/Length 735 >> stream -xUn0 )SIPl;tȰS;lCFɒ8l8̿ - '2Sl6U4.6E|@$.xr -"8ҏDVy~>?lb0Yd 4~~nh<& 4Zo&>FC ʒ4>q l4/d:Gz|=yr):AvGɱ{4A` G2o3Y%fs{XqJFJl9hO>rg0u4|nu,{tjAdvQ`.lAHӼUaj'ROXz6p,>"YW\U6߲.&;/,JkrO";C-kiU˧v5t|!c\ E;FuK[d*ޯyf?m|?wz2TTBւn;qqmKtM]Nž. ح+ ך"""j{bl|i a6E >ZXJFiU\;uK+imtC4+ǎp菟~`B@=Q\?rqX5R&fArQQЏWzZ=J_B>_a LC,X II(f^*ev -}6WrU?sL +xU͎1 Sq'R +8,\V* qh;+vy '̤]Mϟ] +z1& ތ?0S4.6E|Jb'$o}!eOb!K"+ :gS5q9{4j}9lmsX`yɰ$Y>:S)O1zww=M Hz&$Vsln2N)@bwD4§3ѺLatAopp tj@B<(Z0cyy-Uaj\Yz6p,>"Y]lϲ.& + krO";C- +Uןֳ~!פZeq%<]72]ͯX"ذJjA.?X:\b[>s)cI5zAui-ngKm: +t.vw\mn·_ɹ( y J~)R-b+r+xo:.v+g mG|)Zka)bvKmT٭S]FKx;n zh +WXA ]?q>Sc24 dDW^ j* TjNBk2Bb(|gp:*J'jEvm,т endstream endobj -810 0 obj +873 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 809 0 R +/Contents 872 0 R /Resources 4 0 R -/Annots [ 811 0 R 812 0 R ] +/Annots [ 874 0 R 875 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -811 0 obj +874 0 obj << /Type /Annot /Subtype /Link @@ -11063,7 +12045,7 @@ endobj >> >> endobj -812 0 obj +875 0 obj << /Type /Annot /Subtype /Link @@ -11078,62 +12060,61 @@ endobj >> >> endobj -813 0 obj +876 0 obj << /Filter /FlateDecode /Length 942 >> stream -xWM0 Wu>H= pYiHC+vN4iāfڦd>^(!$Q@oE6< &?`PbpVZ"EA"hÃHgOÇ`$ PJkT䒅xzF%A<fjKf40*U4O9Wyk<&N px##ZHAr" 婄e:M`$IY+Nwo> -i>],NͅZa,.5ORgz^!]GSb-2l{nQw0K, ̒F/>BM{ܽf4&48S+FK FbHcY|#V5)S ȍaMt+@W%H/tw d;j$%B׸]iֱy>G6xxaMǛtt~{cm[~kSlN2Mq\7wYDk%(- eyFMU?bxe2K_mo+UJ(s-^ꔛ -Yi1?kv=C$[[~%`1z黺"c_:T0UY~},ٜ9ΛѪ1߰&|0yJŤΏ; PV'6r}]9oZYﳋ~/PDxv~{ɟP6rK+Ӯm%*<,kϕgop)>}p ,?iS pJ8Ѓ -O7 /U4yxl>0;SM +xWM8W)VYar.#j3A{`(;IG8QwRr٭G?"ܘ> O(b)4XT0F8&5˃*< }V!Z|c>|^LZp5T;|~r4kL l_R/Ay_)M3Ffb$Cx7\L8E26Elt397^8o޾zzɌ^_dV.5aO3RozY!_'E7bYZDzmyϯc#zjɽY|D9K,H̚_^.}V19,4GÄXlhIiWLP3d;'sbv=M|{ŶlWV6XÖWk`gF}umaB磒CL7;ؕf[*s|ȵ{Ļ[hB=|cjlϏ%$Ffr_9fnaWyµ/h)6D37*Irn_%UcXVB$C|6Z[)7 YiY0a?!-NGsҘJ]=ce٪Yz|5gfkd,4- [Rmq1pu<]\km S{M+}uo^*#q@9N{o/Sw$B&JOȃѱ\{^7`\Bi{"3x˭'dp\wGTV^ hRz.}@R< endstream endobj -814 0 obj +877 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 813 0 R +/Contents 876 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -815 0 obj +878 0 obj << /Filter /FlateDecode -/Length 2345 +/Length 2342 >> stream -xZێ#}WL~ A`0 8N8sǟL.U3Z)|>r)wA1ǹ,̈`I#9۫`NѶn21%⠿6K>v?;LGy}¹s񂊟!i΍nflǤ~?EKx6&m{ XhhD3Ѓ&{s,'* L%^:$7%y0g5(g ZjUL"7m. HgXL"6ʴ4o6fpKbyU(rD=X *B) -Pυ:T)`͒X8? IM۽q83wU?GOր":6q9̌CH3e,gk}(T -#sg^VdtfO{Br˹i]9J]4A@*TXDP^#oá5ѓ8\., hhT0ky#[ Y1"}$(2*4ȡנH$+\C cJfath.)(LVtlcAq+eWݐG -o^'8eTZgհ3 (W X(\x /((dKM ыGF7Sʪ3Ud̙ "xyHh K -aIۡ*\NZj&W+1-Eޚtr 9GNlndq[v Yg|%y.b`D-Z ={Cq:Q*dUG>r7Z̝ZXᾅttI'VGzc/b}Н[s"@[LFqFB1$PwJHk<>B=xЮ7EX^ynj -6бvfì`U2mf %sf:w>]ׇzTG~W|oH(y~k˩QD@P)~30'8Xd9 ǽ֗׹l]gP=i[e{kcO -aGNx';vy[/#Ae@zi83*Hb/ bĀT$tc*G]!jRۚ!{/ =,`bS,H/ `J_xC`ы9o;9\//@~UE,n}I2|y@vVwu)4U0}98gsPٷYya~kAyD#QMOcN.:,C.{uힱ^7jvEKx=6&r $,b,E[<`m$ LLhǵV + i4ai=h Қy3@]Xĺ8K2xV%eZFG!DV} ލ[-eʔeGAHg"g +0|!A]/Is۠^yb֨6V WР)Rw@y2ea@G7`I QCwmde>nZdP\2ɥJrS +{^} +Q@RjUL"7m. HgXL"6 ʴ35ozXA OV8U%1`ahR9j=3 ygame͒X8? IM۽q83wUe ȣEkt 3mr,947+̔8Ӆm[c:+CAP(9%;NaNfܿ'$|MRQ ҽTQދv`m`Yc=y5oAQQz»0I + M9~ވAa|HC( + *0rRUT$ğ+\C c +faph. (LVplcAp+aWِGo^8eTZgհ3(W X(j= B%,>_PlQɖ(n&UG1U:rNբꝉb6P̾PײCGR\bN/:׶+~\%蔂RA\"̪۵Bvy".]ȰJR1]{iq)H4O endstream endobj -816 0 obj +879 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 815 0 R +/Contents 878 0 R /Resources 4 0 R -/Annots [ 817 0 R ] +/Annots [ 880 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -817 0 obj +880 0 obj << /Type /Annot /Subtype /Link @@ -11148,30 +12129,32 @@ endobj >> >> endobj -818 0 obj +881 0 obj << /Filter /FlateDecode /Length 461 >> stream -xSnS1߯0؞¦RHErT,ĹvBoZV[8<93د^ZIabXG=LjdQx$'ΊKUE-=OӏiP2fsK"9Sh^I~vBMGv]BmԬmT0sQ%-YEw=V)xWl׎>a.A7?;!V'`z{5ye3e /wo,h"8}A7_fB\ -9T)7l+ - ;yܳ28]ó~{ /mSe4)^֍^KclfhSռV&H: #탎Z}.@$^ЖvKڲ0^0/p-*5 _S 8 p~KfHm^V#Egoj +xSn1 Wp8KA !ӝxIvl 3Ď{H`W'!j%01YfqяoaYJx &N"*[x +rw3JTz8F p~UK +Hq9if;3MH~Qqr endstream endobj -819 0 obj +882 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 818 0 R +/Contents 881 0 R /Resources 4 0 R -/Annots [ 820 0 R 821 0 R 822 0 R ] +/Annots [ 883 0 R 884 0 R 885 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -820 0 obj +883 0 obj << /Type /Annot /Subtype /Link @@ -11186,7 +12169,7 @@ endobj >> >> endobj -821 0 obj +884 0 obj << /Type /Annot /Subtype /Link @@ -11201,7 +12184,7 @@ endobj >> >> endobj -822 0 obj +885 0 obj << /Type /Annot /Subtype /Link @@ -11216,30 +12199,30 @@ endobj >> >> endobj -823 0 obj +886 0 obj << /Filter /FlateDecode -/Length 442 +/Length 441 >> stream -xSn0)33#U{@p$!ْlgKrBؚ8Ǟ@/\koDQ |xDzIZ<([d$%/ӇKT"5 )^ ?OW3G -?F߽-fj/ZcRT;lvw=vG<$_}5~GswϠ֥R ~tCN"hsPbd7o7~\Oxp!)#z6 KF+bAdL1bQҘ'!bp19,<{gQ@ŌUҞG̷2JVrQb3t -;qsŐ5}F\ħ!]_ziZU8ʸ .Kt4Ӄ*FsgoŪ- +xSn0)33#U{@CRiHCm*g{RN['8 akcz(j!qїohT/Ike̔"dt7}_]i`N)jeph~9R5(4JҶQŪhqIsQ9mc'A|Ȓ-Y.">n^CZJ5A: +6oG,P\F+$#SGO>rMM:}ċ쾅IјE8hX}ѳaX2\ "c>눒< #۸aqTwV';(oeߖFI3nTI[ߎx>6P +'sdJS`Ɉ.30:ʵ P%pKگQƕ8g'Pu]]ᨙT77_;{_ب endstream endobj -824 0 obj +887 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 823 0 R +/Contents 886 0 R /Resources 4 0 R -/Annots [ 825 0 R 826 0 R 827 0 R ] +/Annots [ 888 0 R 889 0 R 890 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -825 0 obj +888 0 obj << /Type /Annot /Subtype /Link @@ -11254,7 +12237,7 @@ endobj >> >> endobj -826 0 obj +889 0 obj << /Type /Annot /Subtype /Link @@ -11269,7 +12252,7 @@ endobj >> >> endobj -827 0 obj +890 0 obj << /Type /Annot /Subtype /Link @@ -11284,33 +12267,30 @@ endobj >> >> endobj -828 0 obj +891 0 obj << /Filter /FlateDecode -/Length 1032 +/Length 1034 >> stream -xWˮ$5 WtuX lFjbQ]}{ /elh$(So惹Xv7D9BPeNLkNEVΌ^//ü^ *}°le<@5QF:RKnjBzWsӵ R~sSQ Ѽb<uu|kK@Z_kcվ6gZ[k˶sQA${>[b*k04lg+eXpcoՇe+Ow|*8ILMZv1;aaqDA"c#40 >`ʤnl ]TD l~mS߳؆HGr3 -臀Fa(c~@'4>Da'8ODvuw]YDsq;h?yKl9lAP9q 5 ! -Y9tNE!МxGEyT2+ -Gl 1J1/< V8?lRV|0jD\(hv8o0DBɖuB\$1=paQ ,.-!0D*bO.d+ގjӴqWvFmz. h(\dwgp:Gb!, beṽ''/*R]5y1XO Ns^ʁ}dy! (&:tSý8k'eʋh19 LdI鮣c:0h' ,SD0'I1_28pt"חʋ(6|hdk/ЏU9M{P +xWɎ7W)$0C`0ŀrhFF1R\ZDBkR|^Th1ouy]@*#vJg|^dHN/6F*J@l4F:k |[ !ҩ#/ê$/-W\.5.ON 2Uhh$(SOr\.O9hgŻQe  ԟOmY$/ɨcVp_>~۳PΌȫ@a~s b<uu|kK@Z_kc־6gZ[k˶sەA'^{>[b*k4lg+%XcoՇ+e+Ow|*8QLZv1;!apDWֶ"P&x*溝JH>taS<N}c"YR[+`*?<$5S0atBMvSD.nWqWư;IEdX);i昃6\%7P"NHx@Yn~{?l҄AZឝ4EGme1F;ΡC/QɢB]G.W3=2Oi}IoRW +8H> endobj -830 0 obj +893 0 obj << /Type /Annot /Subtype /Link @@ -11325,7 +12305,7 @@ endobj >> >> endobj -831 0 obj +894 0 obj << /Type /Annot /Subtype /Link @@ -11340,10 +12320,10 @@ endobj >> >> endobj -832 0 obj +895 0 obj << /Filter /FlateDecode -/Length 2550 +/Length 2551 >> stream x[K#W0X!Hrpr10A9H,&%ͬ;k.}UlZm~P`!zg/'):1R􇗓8fH ӧǏJ鴔韟ԨR__oy,xP}l~VSc3Iϙ&/ݳО=Ek,zҸ*8_v=gIk.yXzhT{6W,c?W_ؼ$- ?UOʎaFHR, }̦\yaeA#ˏy9®l}a0H!,X΀ @@ -11361,22 +12341,22 @@ nީ V?.3߭B1xx_ 'Q8pU<#W`s`pZwek;~hJ(3j!E@YvnUyу脏n-磺yoma:}0\&.5dKO(+«娛qevrl6ڷ6CozĴ'Y˧18W=07BNhDwW:T:q h(ǧ<8g΂~^v;(߷`tLf 1h)Df{wXOVq3=RI tJf5'KCCXp3V&j͇->Ļmjc߾Xl]/4փX>v& _:fq!1bŰygD>L7׮=9<1L#Vi;n{l^Р/љ!x)Vtآ4z-5WEy;v 2Iw6f\%/ 5[AVޏ_}~xБv_v6lߛ?]Qa(2ap!RvVEnΟ#>7ʺ@)Uc,V/kb^(\d+ Yd3qȱX,+h' Fqp!0Zap-#4Q y5u`uv>S01>}ODwl3=—e^zaǂx5`0U![c=Ozl0̇2obMd'C -:.U1+ M6S]@B9A8wѕ |)[AҘtAu~X@?i< +:.U1+U%~!+lwPE ~]9Dt;)._ֳF4f.]Pk!PpO#<( endstream endobj -833 0 obj +896 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 832 0 R +/Contents 895 0 R /Resources 4 0 R -/Annots [ 834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R ] +/Annots [ 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -834 0 obj +897 0 obj << /Type /Annot /Subtype /Link @@ -11391,7 +12371,7 @@ endobj >> >> endobj -835 0 obj +898 0 obj << /Type /Annot /Subtype /Link @@ -11406,7 +12386,7 @@ endobj >> >> endobj -836 0 obj +899 0 obj << /Type /Annot /Subtype /Link @@ -11421,7 +12401,7 @@ endobj >> >> endobj -837 0 obj +900 0 obj << /Type /Annot /Subtype /Link @@ -11436,7 +12416,7 @@ endobj >> >> endobj -838 0 obj +901 0 obj << /Type /Annot /Subtype /Link @@ -11451,7 +12431,7 @@ endobj >> >> endobj -839 0 obj +902 0 obj << /Type /Annot /Subtype /Link @@ -11466,7 +12446,7 @@ endobj >> >> endobj -840 0 obj +903 0 obj << /Type /Annot /Subtype /Link @@ -11481,35 +12461,44 @@ endobj >> >> endobj -841 0 obj +904 0 obj << /Filter /FlateDecode -/Length 2128 +/Length 2125 >> stream -xي+_ρ(8nHr`B.c@NZ%Ԓ3913J}?^ }pV/'Μ {pR`KL{/|XL.,*ŌVxλE)z!_rl/}U}9Txc\[i'JĐߚe .7?2+0̺ĘTL$P9r|h$]/V@ERXFIQ<)Τٯm|6p$z)5l˶|g~6Q( H)#Q2o -zZ/OoꧯɒA<}]JWz\1گH`uV}Ϸ]}6v1y_aM>aMp:޽@෌e`Mjs{"qk SHJVf#`"F&)1ZhiZHڥ.Ҋtk[e845#3i4,uO-!=TK ;t6!o|jciH|nUVW(נ,iH`([HzP(܃)zN(}~tD/5LKv븖PҊF om -ge@";d֭fVyIJFwG꤯ -=c__*3(X9Zc,;SS4IcQ!2^Y!iy UZ!Az! }3gWnvTAd>sĬ\4޷g>eR?JTi ͪh F#RZ061U<3ސ 1h/;z4q؍i-O6; +xي+_ρ(8nHr`B.c@NZ%Ԓ3913ӖJ}?^ }pV/'Μ 7i=~8)\0%h>,Nx& +bF+SюP*1B.[ƭ4W%boͲa[䌕 {{f]bL*mPp(Pg9>4|خWW+Q"D,#Ȥ gAX͈6y{tke[3I~?( }٨`7\{'7~׋dw[WH%Y+HIW$h:V}zˍgWݟrL^7dXjX;woy?zG3-3FtXvZ0R{z<;ຯIdus>Z!Rv o:]Zof MMLE=F9a8KSK0xRAzŎ7p_Xj3[UDeFy?z=5(+Ky* X0VE"i1!$Tz2 + :cJkӄJ](K :e8TFkQ&[[9$>YȎ!;YV h$%# ⻣P +uW˱įx, +?Tpf +u1)UE{J +ä`d(P/ވ,Y<׊k *V-ʐ mh>tyݙ3+n;gAPW9@bVI}~.h3L߲Ii)ρwk4AifUXU#ӑr)?hB1U<3ސ 1h/;z4q؍i-O6; & NY}4xMV~3y\:$(a:/Ԓ&Quۉ7}@Q}/U;$m%5!ަ+Ɂ$M }$ ]ﻲЖ4J]$jQKHQX.73Z&U*KkUIKD2/t -T@GԺ> vC스Twڮ|9z+AAaR:m]=QgXk^0P4We*Vy'iLf'%9IfkJIn+%-jq.]Tjɵ +?ֲݝ8q\j03<,%j"8N WNE_2 VzL:tT8q0Z/<8kjDJ{RSy)Ʋ.a]_>5Vk48);4cgmzE>림1v~b[ ̊[L)G[\5,aP!6\tcs춧hR)Z's]9JƂKaXǎg ǿI<2cڻFN籰!Y6I0XOPUڔ8WK:ŵ2_sQHR{Qkw!tN P}ydݷlDS vC스Twڮ|9z+AAaR:m]=QgXk^0P4We*Vy'iLf'%9IfkJIn+%-jq.]Tjɵ +?ֲݝ8q\j03<,%j"8N WNE_2 VzL:tT8q0Z/<8kjDJ{RSy)Ʋ.a]_>5Vk48)X hF}j36wk"uSuZ__?cuJ1ϭ~fE-ZBJNJP0.v:xѱ9vSP4)}-XГ9Q%Dc0cG 񳈆NIt$O +1]#AXؐAѤf'JA*MmJ+%ZY[$)ǽ(쵻:' 2yZa6)"Y;&>]9ݹ:CQ!Ecr|WNP)l&َ3bg~Fٌ6 +ctgtjߠd!@4mI7kk谸P0O%CFz7943b-DIx$Vz@ʭN +TҜ5pUSHLFoMvɣ'N(`rXbו%7hqݨ}h'+ +cXd>y 2*|c(sB~7dBZA5j wڂ t֔ThsH^\&>,(ZX!"|p؇SLf̑4VPgTSśϮf*CA g!< :!}Ep,pxe͌ L;hR +L_BMKP^67r,}T,XmãW1_ N|. +>~*]Ȇ8D9d?;K*{+yBD endstream endobj -842 0 obj +905 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 841 0 R +/Contents 904 0 R /Resources 4 0 R -/Annots [ 843 0 R 844 0 R 845 0 R 846 0 R 847 0 R ] +/Annots [ 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -843 0 obj +906 0 obj << /Type /Annot /Subtype /Link @@ -11524,7 +12513,7 @@ endobj >> >> endobj -844 0 obj +907 0 obj << /Type /Annot /Subtype /Link @@ -11539,7 +12528,7 @@ endobj >> >> endobj -845 0 obj +908 0 obj << /Type /Annot /Subtype /Link @@ -11554,7 +12543,7 @@ endobj >> >> endobj -846 0 obj +909 0 obj << /Type /Annot /Subtype /Link @@ -11569,7 +12558,7 @@ endobj >> >> endobj -847 0 obj +910 0 obj << /Type /Annot /Subtype /Link @@ -11584,34 +12573,35 @@ endobj >> >> endobj -848 0 obj +911 0 obj << /Filter /FlateDecode -/Length 2097 +/Length 2101 >> stream -xZn7+2^mi7\@х$[Ai^C7 Y7IZ5Wr;XVΙK)Wdv|)^1¹8g%~xz{+[>sw!ak"LĉWQę[pN/?owIyxKu /3sMmsn=6_65 Η6m>=w0'Wb=*,d2$͉(MD,6 XVA9i# -ru $]Qp($A|蒤z%Ue(T!w{$:&`m+OqLy%Yry5ZR:KOҭ^KUn#̩<807q2^22n@ғdE!v˵olag]/1:IݷKIˬ׫5WL9'_pLL+)]<~=u뭗rn]XW7Nb_>ޞNpvn49-¤O1ɍ"ssJ-No{xYy~ǹ^wT2;;^"}6G<m>k_ڰ|kysSzsz,>S<=JP";<8,8Dg: QA1ʨ<=p̳sjʞY(RylpU̠H%&8dd( ]A~:+g; ծ_0G] 2fCu%n;6f@%Fw+Xʈ,f -8 ->p4'9SumQI4~ -F1)]廖eS3)Upѹ(I02c ~@U}2G( H#v .Jgo(V4=_R*x@:9&h0*u{oG%H5=N3E n&tJs7(]`q@]9ͷ vtKr#{v *yӟQnRL}Zp\g29K@KMgM*T*̦s4JQD[ %MȦgu4e ;F92 )1~9VW2>&kzgHףFYP>_~\n4h7EFFL&BDһ4_ O-: $ g<C 2 Ft |Iﵼf!K58>3xl>ù(NYÅ#dM) ΢U7~ԭ*4F]`ȇSe.17BJ.DqUu8TG.Xt0(tSFq3_ڕ|imPJm@+$+>Riǁ 2B1)mwz`ꀄ:YZjr CFȿ6ςZ5rYD3/2:0`2)b$uh'vn4o|hh}]$i N>㱯LL赮saaDPd^kj1\A3>3;5\8KDܝ,QuGݪNA01C>4~*sqAԴ3%i o:4zZGmͽ 0,. JOƜMœ,-]vlKE9ڝvW # bq`BE= +tAtM^qJ V=зw `&PNS?;s|, ]4õs4 Yﬕ)rS?<>t /E= T,éZN2|O}OjqVy._(cz|wgsnM|44aSEyr &HaY8Ǚ0+S^ckyMDr|#DHB(tfwhf^T!|K!ͭ9s&]u~u"d<އ*T2lD~_.`%NȯPrs o)(x0c <б +DYmL߂853һxm/BXe.!,J6'zz%zF endstream endobj -849 0 obj +912 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 848 0 R +/Contents 911 0 R /Resources 4 0 R -/Annots [ 850 0 R 851 0 R 852 0 R ] +/Annots [ 913 0 R 914 0 R 915 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -850 0 obj +913 0 obj << /Type /Annot /Subtype /Link @@ -11626,7 +12616,7 @@ endobj >> >> endobj -851 0 obj +914 0 obj << /Type /Annot /Subtype /Link @@ -11641,7 +12631,7 @@ endobj >> >> endobj -852 0 obj +915 0 obj << /Type /Annot /Subtype /Link @@ -11656,37 +12646,36 @@ endobj >> >> endobj -853 0 obj +916 0 obj << /Filter /FlateDecode -/Length 2038 +/Length 2037 >> stream -xZ[[7~8υ*_`1yHSh`KZJu(4-I?tF:Mˮu}- -`grpx?iE&M F:ʹ‡ τRRh[>=9.(8w-BHɌ֛B,ËU0pN7FEyńp0Tb KfqB~l=&4gg%b&w,e1gY$+_b%*T$e2*.OF=i#K=ɓٮ47קIM&8k?CmT^{G8ן^""[2x9%W)F"^N0[n<_kv*k_Zqa S#KJV&:jFj#\ۜ>91N6%<+,YK!$U>ng$yL{Զ&I%i}+@Ύυnt<c9Xߗt泼Yi2۸sZ0{VVqɰ(usrFd8앁I:i5zȻdcC 9ֳ#=y)FtՈ}TeH}(DP-qU'ѻȏބ&?# gLCeN{HT6QS5^S*cՀI=I^GiPR.[ϗ~NѤ.SG450pSkuqFNgN_sם jANT;܌Ga&SjIOqBMO520ϧfhlL0q#|̈́$:=_ƈ8`q9_r5K$3Zz ?ށ!kh*ARs%Q̇0.T rmSLHwt4-Lđu<7Ju`ZH =u{^l -O=fߥ~.bkNȉu)UR5u C$EyrJrCuQNXj]77*Z%*h[{(^pWHT+ߓ.qh0Maи.;fmSoB]F=xXg)nDM7USPekS%ީ|82[ੑ-#{ -5##\"+ - ҔB,c5+ϊ:y>fvMP_u-FF9V:渦9QD5B=pQF{4P*}H qQzB > )pȝ|yvNqSC%&"@&gk澞gبϧvmVMaB+F:Е>3h$&0CzqhFu|L_{/pf=okЯDX UL; uCo@9uzsYśwt)r0=EpY|h~\oS8oci l0̪㗊"sB6ydʞ[/^Cgt]!;gx +xZK7ϯs XbCx;RRZtR+y-Y?>8sOܤ7sHg^8\*x3Z)OOq 9ΝwR2#&Kb/;\`mSrQ^1m?L$!nKfqC< I֘ҘYi\19ɜRg_4rĮ~EPL"d8=֤_I.x.vY>=Oz}o6q X1o +nep"Lk<oْQP?W(aZ$WL6i6xq>rs636?h2'09ԞideBi$!6… sqtx-Z e\2i&!uv# tD(@ms"4_hlL0q#|̈́$:=_ƈ8`q9_r5K$3Zz ?ށ!kh*ARs%Q̇0.T rmSLHwt4-Lđu<7Ju`ZH =u{^l +O=fݥ~,bkNȉu)UR5u C$EyrJrCuQNXj]77*Z%*h[{(^pWHT+IpX4Nf^٦0t~4.D Y[PWQ4bi}zwkGAxw*oy,Ndo;L2xjdȞkFBnB4%~rtvI<@k)ѼNZ+)ZΤ D#txw-eZ@||`Utii>G)<+f y;N\eyviꗦӽN47cui5 +%J= J4y'2B$Xr|@RΑ;d8*JL:ELFt*O+7 >3h$&0CzqhF:?>=N83\ l.5W"T{ʪpaq`j[>kDNw]\tVj#gJ< ",>lCc?79 Bgx!`ì +>~(2(dÜGuPQ9tF endstream endobj -854 0 obj +917 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 853 0 R +/Contents 916 0 R /Resources 4 0 R -/Annots [ 855 0 R 856 0 R 857 0 R 858 0 R ] +/Annots [ 918 0 R 919 0 R 920 0 R 921 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -855 0 obj +918 0 obj << /Type /Annot /Subtype /Link @@ -11701,7 +12690,7 @@ endobj >> >> endobj -856 0 obj +919 0 obj << /Type /Annot /Subtype /Link @@ -11716,7 +12705,7 @@ endobj >> >> endobj -857 0 obj +920 0 obj << /Type /Annot /Subtype /Link @@ -11731,7 +12720,7 @@ endobj >> >> endobj -858 0 obj +921 0 obj << /Type /Annot /Subtype /Link @@ -11746,10 +12735,10 @@ endobj >> >> endobj -859 0 obj +922 0 obj << /Filter /FlateDecode -/Length 2123 +/Length 2121 >> stream xZmo7 _q L ذ C;`h{>8nhQ:D$q5|Q$DYby-Y=͟vw9_ N9悑NA3ar3!T@Twӗ݇_8λI)z9|ܽ ƧhQUL(3R%-(T$H6</la(߻ oNF/J`8曻l x\˼*I+ÔSJ4y3hN;~ut0xZD$n0y'Wg 4xgx>7--v @@ -11764,23 +12753,22 @@ OC qޯ @grk%6~ \Ac3$׋Z,9T.Yt2[uԆݻrƙЀ^Qab^zed`qr/0,I  ~Ws%=rrw -OvNzȔb`$,X-&8[3SĮ8 -IBK5dUOʢqz$b 9ܒty (iUMt 6t +OvNzȔb`$,X-&8[3S1g` 0ƓU|<)뙒Q6/2sK%5}Wa6_ţ endstream endobj -860 0 obj +923 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 859 0 R +/Contents 922 0 R /Resources 4 0 R -/Annots [ 861 0 R 862 0 R ] +/Annots [ 924 0 R 925 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -861 0 obj +924 0 obj << /Type /Annot /Subtype /Link @@ -11795,7 +12783,7 @@ endobj >> >> endobj -862 0 obj +925 0 obj << /Type /Annot /Subtype /Link @@ -11810,10 +12798,10 @@ endobj >> >> endobj -863 0 obj +926 0 obj << /Filter /FlateDecode -/Length 3461 +/Length 3460 >> stream x\[#~B_p 0LMB|<}9HjI]%vO3̜cY頋JdqDkg'@/_O1t4 Nx&*6*ŌVo?>{J]Pq; !%3"XoRqNE0~[|w!,$*kZ43/,dv rn:Z/?}J)"1 e Wҩ/2 Mm3,鵱emni_~y/-.ru*#/ϯ.?z/oE\Lb|I~׽ۀF/WK~eLݡ^waV=5<WWI50r24sAJ0=!Z-Q-kLf jѠ_(uɟctV!Ë9eb/E t'T{l^ whT$WЃB8Y o`JfO)Ƭg/7.AuqJCpp͙l|iO-%5[*)+5@V~H.^dWg5RVEqb:@Jum$4& קs$79Јdoļ ϭ ʇ80HUDpL5吊%H(ɿt_RNvu}68tjAW;*';`VD G] @+= !٠=N T"g6%uH#~Fߑ$J۝hȒjnSNX)Z`TC < [)!HPr|c98'I&B(Fq9PV߷ @@ -11828,88 +12816,90 @@ h 栐,-pi氐.-EL0 L&-qK>&nHڇ٭H hv%nCܒ[` I`Kܒ[a I`Kܒ[$ sXHddv$-}--- qҝ[` -I`Cҽ[a I`Cҽ[$ sXݡ9ۗBztp|LJL[W~_g!sP;^o8@q|:O϶#Nʒ ޏza)>GAt#0ot` ~CDQpH,GDӭ~)~W폸Ճ__mztvGz<>eD@K8*͗БA{שe4LH원`ٟ%$0(Esmj8uSirew4@Ƒպ%MɷʜQRwem/S!hLrQ#ܜP%kdyc)đ[o"ޡzS)5ߖ{ x_T" .Mc=Tܣ*\L &;S퉁Rv;rOz/NzcJn?w(zWsJ]SNHA9!X,5ݗkU[iKK.ի浪k:!Ճ]Ti_@"1 +I`Cҽ[a I`Cҽ[$ sXݡ9ۗBztp|LJL[W~_g!sP;^o8@q|:O϶#Nʒ ޏza)>GAt#0ot` ~CDQpH,GDӭ~)~W폸Ճ__mztvGz<>eD@K8*͗БA{שe4LH원`ٟ%$0(Esmj8uSirew4@Ƒպ%MɷʜQRwem/S!hLrQ#ܜP%kdyc)đ[o"ޡzS)5ߖ{ x_T" .Mc=Tܣ*\L &;S퉁Rv;rOz/NzcJn?w(zWsJ]SNHA9!X,5ݗkU[iKK.ի浪k:!Ճ]Ti_@> endobj -865 0 obj +928 0 obj << /Filter /FlateDecode /Length 3823 >> stream -x\Y~ׯ ` br!ȃdz/ E6"ؒFC<%WSdH ;RdZg<._EOQ'< vG'Yw4(@()5_~8A ƚ#cŜʏ`GχO'F`uPS<XD+"Vrk<>=|xd~=Ey~;3|TAPU -lJ t%\z _OqtJY|30>c\s_Ӑc۽>1;U<ʮ!{ -tdgӗvҗ-|y1}iM멤86RS1ĔN!5ŐƔBsΟҠCi6= )MŹsz_f}mR*DdH/i1u:7trϪG^ -PI.RsTƚxډ%$GHN7X\tQNR~kֱ$YhtY;6tQn12Qlԉ0:®} ]А!90 )M MUMA^(69%-mGg@D7Vd"|)htU",e@Dyhds0h -!OsH`:y9S04>)KKQDȜ)ag%Ex{l9Kh7TM|&6z>] % QilT*.DnNei0 j-&K4vӸO_\{+ohdMN2QeЊBHj1nM덩 %ܤ9lX+WP z)4P7eBo뗂߾qL6QrE)Y8ErgS9^/o FhDydf|\f&,iNQBHhDJc -Bupr*E}Rlj,)A9ْIv1v$"a\3pr0bO F9pWr/Ə)^zP%BML;XfCvj0?^ăj+w!-O/dѐK_'P9v߄T?NFqŇBY2 J[6% 6D ؼnQ5ROw55ِp}"WC'jDP4ZU 8J -QEʲ*[˼)*7Xm t#~~e'x5=\"rv9 -6Dx&aq q9z'Ε( -ZȘZCʝIȈGk ot!hpQ-f*٨G]<)38p pO}.ޒ*<>4b ti񈡰 -m֣^), D+UG #XoAFa1),woS[D?i2!E[i|j @6۴>bo-WXv;.JB|%@ra~E;G$FJL?\Dre< rT*z8bqB,RVFc -u)wkmtWrY+M !ڙgX8?7%Zx/D"if rƌV0 ox`|Dx*O?7^ Dƛoe ɞl1B:pn!J!X3-|!VY; AtjGn?Ƹp(ܙ\B\f+Z018J!A4|r(#`^D΢W,wY iRxL4-QIi܉ؓB|~oߴm/O1h 3&W{tȑNnO%B5]>>d퉴=^}󶕳"i(ֆۙGŦ= ơLW7Lk,]n4tjͭ ij^8L`9)9`ک`b>G Qe6h{tA rjܼlL-W[iT#N eMQ46l }=^UNϣ|ՍnЄmLi<WCL/K{խ-V5Qkcͩ%r#94sj4G+{uoK]*DGLΕ߁]atm .KL羑pExEZVjPJB4L51} }qŊsz罦gES}}ggOcMWCTy^mn$ ڹSڭ\JŪf-7}-wqM|z:ɐ%wkxSp91Ҽ6|S u|-ăKB(<7 cX#|݌1H_? QȷQ1f^etL&M;`zΡn"#: {l4 oF0Ui)5O_@KȞBPRAtcZk2 HF}kVnTXk+d eanDjhE? -P EE\Tn!Q+r,TYT}BByȤ$>`XZ90Lῤj6RlZƙ2\RSJ*Wc5LF#eRqz!Y9bä׭rp[.ӲަJoG:]|,Ey&E )oOa8Vyz{"q<@fOg|8I\&\}J -_ -`MH(&JXCȺBq3_tyv 9gei)M vs N ߑD~L{UThuX\ϑ8CKOG79-aM י.wȴܱ_0 Y ݳY=KW0x 7!v Z& -sk~0Bm]飐B2'F-YPBO"ii9nDk;E0bi!(ʺ nY# Fw" P&]ގ,?P3@fҙAAd(+E5cCs],&+[qbޞC܃,6}~b_^YLuxad1{1 ΄ƽkbC]5+sڗ,;vV f(3SOP3 zWAٹ a&|y==aϻAY{0 -Lrv73] afŚ?v)a l^ anq&af{OsCMCkswUva"3Mͬ;",57tre0".7u |;pk ֞((޼މ F]c_Y\v*^ 5[Í/_7ydMnK_{?Fw{0ԕ9WĔ~yn,oɘϥ&?8" +x\َ}WBs_H&$2lvK;'EJ,I-!nؒYys5;RdZg<._EOQ'< vG'Yw4((QRj|9qJ5G8'9m痟N=DTg!Ny>VD1jJy|z?w|ܫvgJB|AZW)+)-/MϕN_{ߣg -AebWx9\uJUܺZVX"JO`oBŲB=OPYV韸'z<|4'Tad8ϙцO3ITORّ}Pcki(Xױ^*D PeVzHNɎ6Ϧ&(U Ro63h"ohQ4k*P"Qe67ȣгqqN^mѰYA0D2:,8\4N3f2 'aa)딨 Lv&[RGQQDP97ə\vIp. {LkalT*.dn1ZLZvIw.32{m5iBi#'؊BLj2UnM  +SGGn`;3ʕT-^JM`@oM\ח2%CԨ p?5>`,O6g+ &Ήu)_703ɤfx9Ջ'F róc{d" N,+yʮQ#( 55R*"dشOdO&SYx?+Ta BQ0,X[\y^SJ(ސL+XbCvbFJYDbAVMȥo䨌]78ng)(PB(KOiiҦNcПᝈv,U +zH+͎ą:zGxy"P|3Y$_cnp3vG2ݽ2\ B5gfI3< Aw6M Ǘ,'#,w;m>رXExT!4 l5޼lLm풫Y-42LS{Yg*g 9[Ge,] + +_uc cG0 A_p1TBWz1rUSmm c9@Rb0ǻm/͘ft{Ž¿KC*dGǀHLΕC;,viڍcoCmZa"odE&\kFxFhVEҺTv`T;Xfإ^gR}{gGOcM7CT>x^m7\` v+"Xra"kxoI'I,߭M:ļZA%,9M6Y.M +p6`uvu |{/DNŜGzV14x{uue&cYxK5"HLˌIyd|Zz-҅:成 +F(ӴߚVD*u,k+d eal.ҷAZh-VYfj.&F,,BWY22Q͢BC&%1W_ ;ʁ`%U!Е:GӒ0Δ528X-fgBTbۯa2*/;`b]Ǽf@ b޶-s7ooL|ºw޶++IwaY}Pk{6M`Rߟp"D\}dOZ]Yä`, 5>—5VA+PX(4}k.ol@s6_F6Rh'ǴVe:JXIA 1ty8) n nr߻rGL  =;]!39e{ ӛjG0 HА|sXo@er;0p:73 Ha!6>Y &sob2[%T;+?/2 y&,AFf>\, +TKM GUyf$-VdL8Y0$69pgfd0],PV1)1j29,滎YL}Wf17#Žż?,&Yl:f1'>\YLuxTaf1{1} [L:>h8}]h#jw +ùYEaf~8(-3z4Ğ~?u8p6 _bwM{}<lxewV endstream endobj -866 0 obj +929 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 865 0 R +/Contents 928 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -867 0 obj +930 0 obj << /Filter /FlateDecode -/Length 3044 +/Length 3041 >> stream -x[Yo#~ׯX6H$As,<Ȳ0`6HMlRb[ݗиnu|uG9~#s[χ/,pOT_?AYf=Hk^3phcBppP)Z)n?v!̷^1˹u( 7~,?+nl3 2#`qH÷(d  3 HauO$w-'WHse ;Cȇg+6,Z*?F>XJ)/黧)QX#Y(D*\{k2R9_peIE8fb.R]VV5w*s3P͍9~3؅+N⌖jPQ ǝa}>EX\j\1X,$s(޸KϷxA dG}fESc qC5$Ӿ-T\lMY@7_j٘QBXWn!1u~0%( V#;@ -Ĝ=aHCRN!B˸^Q[?;>f'_%=i0̃rЂ|4He[撼&)Z +P }$Hf݊)rVW2+BFfӚWhќJbV1 cEɏBg[v&,e.|yq^}0I_'>ܶV0X#p`oDz4 8'D%sDy]c7D@ݪ)&,'Ek(y\vCj~9ez%.'T\""u>"l}Sn͵nKv|(Y3;U6e-#+I+wrr y/¤!Q2ϑfu"M$m"-٤U+֡bQFbKI{m;e6 --ADSKеjaT`rJjt+f "Vq9*BR^JD7^ݠ ,ȯŠj̝Zp!<*'mu`ki徫iXhoָvMHr.WH[K_8 LrWIJtNs#1Eq'`cרuz]P&OZ=[JZ,OG8V$^J̪ȍONUAiG岴i'5Ue\hpEm97[g^;oO:u-k9InQьhjNu-j9u#ө'1+镗̋&0ØigR ,2ehC{Z&yP^B'< 2{78SUu[ -~fa1N)]jb1 ]eIe?7=# -sM&h)+$9+Т% XPI}D& VN˾ʠ=7/*(W%+訂]9s$3{d(r=*WWAl6ˠQ՜6[x#fP$nbн_ol[ld3Ґ/h2: WZNVy-tj9fjKOkf،<>{9q+ -w6'b:Oӄ>2z!Oc0R08` -ÄOp{݌+K}!3p#0Ͻf<μq}^^?~q p&GEi%U%Nk_=[roj2nK߅5RҲ]'-.Bp2lIwhAzgw" / -D8;$] B -bZj$k=Wx?MNk'oK{[~v?IryzTmAuyJ3>%g:wc"KKIvo%k-\ E9"N{B酪FHGQ[Ï0d -SF -+aD;5-—×F8uδ/`r:|k^O” ~m0W[ȧaZ⎈Qx8Gսa@s}yo"@s)r2I,tTHѾ=;ԓwG0iU1igyU4Uf>^a-jҒ]kYE 3mav6yzrc$Byi~>56uI=ϡO2[O2I}*ׂƺ=LX^Ls49ڇbj_s4(nZE ~i-8"ZcXPgìz*w%rF;=ъxA |U_,qF&B~yaa=q$I^.Ϝ -GdeЯX% I/ᆏ$s\x0x5JެB3o 0jrs1x ]plZ@;!?uq7A ߞw7cI8S0ܺPiS&Ǯu!L}s8ӽ,c b F8tBVĹLy:p"K20*{a= '$|%_ +x[Yo#~ׯX6H$As,<Ȳ0`6HMlRb[ݗиd8rF?N 朷F/_Y慨ϗzf9 +DŽRIh=r߇YέG!d qӏg^B*.<{8.nAdA"ȑ÷Yƹ7(+80Apg<pş/I8 (9ZN02se<|HTufpɍ#k3w{C5C(wtfHgx|f[dEڭPljp'3`}Y71 +a k(0D*0?"D=($AW&~y&C/2]ωD#4X,t?c`/DeLk "]/5Ț%2xo^$F W?-&sz4qfV0FDd(%Vϟkdd] H +\nXmh9dUHœ ־|NӷcZ4G!uv5ߺ_1hdW5F0BTC_+u2Zl ]Ay%(oXB"'?׊)>hVOt) C=!ً; F^D<*ţ*%R +K)ccJ4fVt'I$**ڀ )T׭.\zRrQYyea㐕w-\܄ TsB pFpu((AFΰ>W",.uPtvNJD9oɥ#[|A dGcfSDx Cڵ$Ӿ-TZlM U@7_jٸ1BNXWa!qrK1~F!Jw)739{АVC$5zEmhh|Ub][t@6EZ/&W7h4!NM2^26^#)E]vL$TKR!\  +443\$BÜT/8]I;J~9BY^x`ZG<_^Wl5r~grn+ol807[,cYB̅ +VGP iI 9#d|i.sH!Fn nՈɋ5厼ff)5N2 *@M{WMiM`7m^%^謙s *H2$y7Zdh$=d^G+!0HFsfݶoK?Ix(K6e@-ƆuhXjwYNm['tzUصzz|جtAtk60gEHK0tUY^QS\Q5zDvV쁅V;ykƄ&XeZi`{LRsA)֌&Ν$>1 Fkႆ7]j R9f{J"BoDZ!PJgVCnbr +8*L'8ymEso$/jϡ9 +|뽹Y4҄Mrϡ!&-#T^*S7**z^yh3)x'܆6wG} zȳ"swc3%8IPմJG}Vw4+ӅV;Skv*L/g:'FDi 0|T=v\ +thu}'iJCl*I-iZ##`t^G$quoFX3nUVF h";CL+xLj( +œNo3;H=i)~wvzAa9o*sXU,QYv5 7Po(PXKB~i㗑v?_$y-~UKD +浕nyHU;GړFÞ4d=iU]JoKwG6, "5ə+hsԾ+ht PܴL AJ)Zp~G{Bư}u;rY/2ȵAt7P#N&B~ya᰼q$E.JGde0X% )/ᆏ$}z0x5NެB3o 0k$9BWb>.6@-@Pw"^8yqGof )'0ܺiS&ǮuaL`l6W{Ԏx¶Q`ås.3eN)H҇L;ʞ}Xwm%Ip endstream endobj -868 0 obj +931 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 867 0 R +/Contents 930 0 R /Resources 4 0 R -/Annots [ 869 0 R 870 0 R 871 0 R ] +/Annots [ 932 0 R 933 0 R 934 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -869 0 obj +932 0 obj << /Type /Annot /Subtype /Link @@ -11924,7 +12914,7 @@ endobj >> >> endobj -870 0 obj +933 0 obj << /Type /Annot /Subtype /Link @@ -11939,7 +12929,7 @@ endobj >> >> endobj -871 0 obj +934 0 obj << /Type /Annot /Subtype /Link @@ -11954,10 +12944,10 @@ endobj >> >> endobj -872 0 obj +935 0 obj << /Filter /FlateDecode -/Length 2781 +/Length 2782 >> stream x[[~s^)ڤ8M66 >uPCJ$GhSӾ>)^ff(j9oχgVs{,~,^KkrN8?X\60~y;p!:;!%C1/?>>qi(pZ 9 qOU3O,/PL2F{ufcF$0e" (uGg;saewl ߼D &wI^>>~rɰ[{\8&`ZN׵5kWG(':Kmla8~֓Rz%B"14ϛû`%3,r ]IRH,Bx#ʌzƌÑk%^OJ.);S2ɕv5')qCdبw97@x}=ֺ!і˕$c8cz1]v =}C]!\ɬODCY@znj{+v >$SkNjݵ\ A.F>7:qo_"5jXLM&l,n߲ N ޷e ; &gW; #aqk؉y׆{at>A'A{{,%9FשѽɪsQr=9S;ɣU՚YkH_q[!șn4$BVӧ v -@*0?s[\(Џh`-,tdtfߏ}  Vίdc%aws9akñ$-$/oRBp{gzǿ՘E .H`'FAFg!ߴ&3q'q?秇вlCz^4Cw% ½fLJbQINgƢ.> endobj -874 0 obj +937 0 obj << /Type /Annot /Subtype /Link @@ -12002,7 +12990,7 @@ endobj >> >> endobj -875 0 obj +938 0 obj << /Type /Annot /Subtype /Link @@ -12017,7 +13005,7 @@ endobj >> >> endobj -876 0 obj +939 0 obj << /Type /Annot /Subtype /Link @@ -12032,10 +13020,10 @@ endobj >> >> endobj -877 0 obj +940 0 obj << /Filter /FlateDecode -/Length 2539 +/Length 2541 >> stream x[ݮ SV#~[bڢgE, @@ -12045,22 +13033,22 @@ c Ţ%!1M\0Ʀ'(+1j(': $N&j,wҦ-(5&]C9.P(bP`<y2mF O0ySWK!{_Yl5*|Ia4/ Jt#ZaSZqoUɰ`@U/'_݇B[mQqj5+if܈;ayb41Q9Bni3d+d|ByEr6OՍv \=4fi+ -Ť\rXqɽJWcr֚;-j vpkvLYT8'G?Bk@aqVme o[c9+1Va@F4ҮS! cs@f,@a#6{#Qƿ CqrQ1wYLsBic>0/wy(* 4湞F 6Y;$cO G=vh-cy ߅%Y\XPU]O0/wy(* 4湞F 6Y;$cO G=vh-cy ߅%Y\XPU]O> endobj -879 0 obj +942 0 obj << /Type /Annot /Subtype /Link @@ -12075,7 +13063,7 @@ endobj >> >> endobj -880 0 obj +943 0 obj << /Type /Annot /Subtype /Link @@ -12090,7 +13078,7 @@ endobj >> >> endobj -881 0 obj +944 0 obj << /Type /Annot /Subtype /Link @@ -12105,10 +13093,10 @@ endobj >> >> endobj -882 0 obj +945 0 obj << /Filter /FlateDecode -/Length 3067 +/Length 3066 >> stream xي$񽾢~Iy0f>Tt-pH)"Xy~(%()-^H R/GR_ߍ߮%yT ײIy-^zZkkX`/vyD[(tem" DW!R=J}yIF<^ILB<%8HSkb)T`U8)b8aR"hz/ @@ -12122,22 +13110,22 @@ x 3j M~:y C`fցxr6#E%+j"Ry° 7tc*(<2xVH'o0C)Z2 !)&uXPuIpG{K3-6ebJ@_kdW75QĿס- 7V; ta!䒋IîoPZk'ގ%@ydoHXa\?\Z #pLJDDžDDDU]a_;àvD=.O ~{୛Y|m_L#Hx0ArGQKar noIMuF(ͣ"&e ڲaocֿ3o B}~*O}cg9S͓R`4Lٹ%i2$Ң=Ԩަ 2f>[3 g.]-R#rE8@N} k 8<ηdѓvA`3~FjsI'BXg):ˑeY3p9G$d@dn OK3(+Jo<~vnȠ 6ʏ}3wF;c@ThGIiWߏ_H.[Zlk0:P\LKG&/N Rᎉpv](b]wȃmIF6۷KcqZäWDŽv} R"(@D{FV+&R(澷bAUxp -?kN_=o՘8rO% wUs\Ti\|g'=ku=ut O>8vemf9M9=s ax+rz (aix̗ZQ*|0zCJc -xV\Rdz28cY{A6:="Wٹ1nZZg&*'򈨙is&[8s hD9C6htMNG̚$sY+ңxIF~\^Rc(Y6!^?AG>x"ƟX3WK,uY@bL -UmR"뎒M39 U==oRn[@Jh9BMm %pShrx so_7AI/rɉ9]G݆l𤾟ls5@G`^rI-BmW[fUkSㇶwl~ѩwOlƐG5>\f̣eVˑCPAGxzĴ to\nE *qh8cD5LwMZ:K ( Rh=}n4zRݽJq-S24l#v(v(Woi5qPcv kH ޠ<#zmF=cnF.)]Gf `^|83.le->k-m#V)2K^k9k}7DliJY!5G>y;b d6&K0b=:2Gt^[_`εgK2y (6?弝Cm UyG\~W|1mp.r){@~:|,]"|{Yo_5O9ҘMQN? -&,tX,}m)ϥ|jImVW{@ķpR1ڲhnVQG/?0({c*ͻt95f<4B$Kj#`䯟>/gѱR!N8rx|-]ߝ8 +UmR"뎒M39 U==oRn[@Jh9BMm %pShrx so_7AI/rɉ9]G݆l𤾟ls5@G`^rI-BmW[fUkSㇶwl~ѩwOlƐG5>\f̣eVˑCPAGxzĴ to\nE *qh8cD5LwMZ:K ( Rh=}n4zRݽJq-S24l#v(v(Woi5qPcv kH ޠ<#zmF=cnF.)]Gf `^|83.le->k-m#V)2K^k9k}7DliJY!5G>y;b d6&K0b=:2Gt^[_`εgK2y (6?弝Cm UyG\~W|1mp.r){@~:|,]"|{Yo_5O9ҘMQN? -&,tX,}m)ϥ|jImVW{@ķpR1ڲhnVQG/?0({TWD/V\'.A ~ؿEIm((;'?$w5~wj endstream endobj -883 0 obj +946 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 882 0 R +/Contents 945 0 R /Resources 4 0 R -/Annots [ 884 0 R 885 0 R 886 0 R ] +/Annots [ 947 0 R 948 0 R 949 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -884 0 obj +947 0 obj << /Type /Annot /Subtype /Link @@ -12152,7 +13140,7 @@ endobj >> >> endobj -885 0 obj +948 0 obj << /Type /Annot /Subtype /Link @@ -12167,7 +13155,7 @@ endobj >> >> endobj -886 0 obj +949 0 obj << /Type /Annot /Subtype /Link @@ -12182,40 +13170,36 @@ endobj >> >> endobj -887 0 obj +950 0 obj << /Filter /FlateDecode -/Length 2159 +/Length 2158 >> stream -xZێ#5}WloF@ ! @3Y]_vn3I'Uթ#7y-F'g0?|8 OQ?߇rtv~ ~hR/z78!7aw'1Z߅8F'}|Ĉ5Z(G/zx~xӷ}7?|ld#ϥ2{xx 9<Ƥ5t^Ҽb$m0xЎ#ygxkgxo pގ4$[ I`ڲXPxu!< -zBq5O4IFlq<'m$m %BiD(ͷ445am%!q:}45id&fU3wmf2Ig:1^*&D~Dsf:$ -@ @}{ t/chmPi5Ӆ>V@[ -o:Lpf y> f6RlLR;>ojWĨF,L$a,;MSے87A b̹#]nNk';[Tt~gJPY_jq*h]PL7Bs=.4x^MR &o`11cQ#$ s:L\sj hLzKk}fQjł0ĬbsUIGL-8~-)/16!e^3w?afR^p X0 -Z E~1r,OZ_ɎޠAOfD/ko$*KYFs -$=2 3a[!#u4ظtqrX0eϐVCIՙ2.7tiI) g:_(BV0sZEN@ݫqv6>^VΪqM%rZP,-Q$F(|{4%y"GhѹX4?ॣ]U}2*r˓yrP-?F9kq}rJ JGAe ^ǎD+^d"*j> -e5b}fVuT^`/m&@nbrm-hhkt*0[:8Gi Zɨ@H!6=8&˚rh'"ߥ]uH3> -_#onZk'(JD:3 - 'dL#7 :e(2xִ V]AeGw:U],tInUa",&TR C\ne|$CkAM.4iQUƖ\n$BaIy> fvSliLS;1ojWĨf,L$MX%3qnH '(F1 hsG.zO"w&<<(QҊsRIDZ 5ML~,xcy/г"Ȃեi/.`< x[cԈe]xx0qI.-/L 7 Z8//=mXǴgV,) ;UU|Q]XW%$}Rے" y!JjD~Bwc /97 a%?E}'i/_z92˓:|Wn~54Q=Ɍe tϜN!nDYŽL#iTTOb1I5Ō2/s=??CFIHSh ]k2u8B*iT͜ {tGZN _gʛPyE)vRTٽghB +V-ImAm"xBL" 4R5ߣ`aF*bp~LuUaʨLi[.9& V~Zlf]rKIi˚8#^Ɇ*j* sh6hv ;[`6A!o"P\k Z'h"!#D !9]'g֠ +r󏃀`)gi|s5ri+F.GqݑFuQN:wz#3QVIPqʕxyS PFkpWS`w;g+y.c[mCS\5, v7A`^({л9l<0byTtU3iX G͹{牉2$nj%]v"|T]&ɑ1XQ4;-!PkUk2uqs5f{uZQZ4ZS jk{ +;rK! *lrkn-#Uȯ^F#Up,')Mfʩ2)U^ N=-`- ES>66B"<򴗰Ar{W³Lrl9Wj] Q 'w)tW*Ҭ\OtLUٯUG|-z +}-JԢu,g-P72k$h}Ƴ l~25> endobj -889 0 obj +952 0 obj << /Type /Annot /Subtype /Link @@ -12230,7 +13214,7 @@ endobj >> >> endobj -890 0 obj +953 0 obj << /Type /Annot /Subtype /Link @@ -12245,7 +13229,7 @@ endobj >> >> endobj -891 0 obj +954 0 obj << /Type /Annot /Subtype /Link @@ -12260,7 +13244,7 @@ endobj >> >> endobj -892 0 obj +955 0 obj << /Type /Annot /Subtype /Link @@ -12275,7 +13259,7 @@ endobj >> >> endobj -893 0 obj +956 0 obj << /Filter /FlateDecode /Length 2582 @@ -12286,22 +13270,22 @@ x :˕Rj$]fuEà~WA=.btmT? ӷUtyy'[ wĀo '_Bj=KԂS:?_3#}?Ffp> A<ė2(Dhz6Cql`ls*;*mè wNcHdJӉn3&ѭSu1t+\}i")CL4M_/061x [a b d]ﶴaC{ԋe0pnx,kġ鰆,kZB{^Ǖ%B1h4z}="7}GtxoZ:G|㚊x|ĔC : GKw\tCg.u Oh{D#z#cQ@T9|T.~ iktT F%QS 9Ia$-wtuHI ɒ5+X5p,Wnq5 ti (:3m HiH!f*uS` ff{lβhS赹w̍OѝfEy}兵T;v4#SҲ)}(ZIr2ڸp}cN}m_QE K:'j@,x'*hM6^vz~B_?(S`SU;U}|GU=*W!>*驟4xzۋ7rk<0 7랋 x>(5+i3PET<ZEx->B[uنcT6W<BVgNǣ =b)[ 됃bn_e)sP 5z+1f=rQGM+2<:-+[]6c{fݔ5Z'ļ3lH?+ M];E&Se5)0Nߵsmwƒ{RSٴ.v_i [vR>UY__oRsc.[Z`fSpOeqKS7< -YZ3 iy| 'I?L?c\> endobj -895 0 obj +958 0 obj << /Type /Annot /Subtype /Link @@ -12316,7 +13300,7 @@ endobj >> >> endobj -896 0 obj +959 0 obj << /Type /Annot /Subtype /Link @@ -12331,61 +13315,53 @@ endobj >> >> endobj -897 0 obj +960 0 obj << /Filter /FlateDecode /Length 5270 >> stream -x]]oq}ׯгXp:Abc rl#Yo@3-H֩[oGOK~hגO?> 5;%V>:ԞC-= 5cmޅ19߾?P>z}/-S?g?ǿ+t~BSr᱕6x1X]?jkBϕֆRG`o -7# Sŝm9Xňjj¸^as/Ww1Ƿsnd ")&D -Db,^>$EO -l_꺞c"P׵\B]W]E!BuSMƪ@WݨoU8Q]׽p@C B@x)A&DLH={SNucQ!d|L"ܐqQ*pSq ϐ 7 7Cd3"{J:҄+|ΡF|uvMbй/Sй.G\Kc :#u)_DꜼWqs{Π:DamD/t.h -{ΥE -+_R))+_Ğs{17BC :RUKW̗r]|K5K>{d !Өsr^Q貊C`Nb'QIc r H%(_v Nd *_a.|ȃ#0SL -{ @Lh<\<{Qy0"cI"cM"@ %v`]b'"f `+_#<Ƀ*+_[<j*ɃH;ya(-dsM<HAN %%}YV<.<ȲEå+_]A!yе.]s;yU y*yeWK^aAteԸz%SːɃG5PɃE}QbޒWAkRs -;Jars*j\S:|+©{N%Uoqu<29 -v<ZR5~A {$x⦬7/TYq~e~O̫b29IO3힩gNk^v{g\ڻ[?SΩˮr3͓sz%s5s O 3/ {Y){N,74}}r/*d<_Hse(;cpӽyN8_ͶŔ{VϜgo1P#^FY)JٰؕQ}Yvf,@2c:C&IGR09OK_۶^5Q'):岑电ck>g}_F;2GM! -01jʤ>|0tm݉[MX4[j4nt+,q5D})wm앷e&{׿FD6ڼϧQ(!i{ u{qڍ]9b~tt5φ1Nڲ/D-;E6v3%o%1RaKǦ\%PoLnXB^! -mgP鼏l RsRYh3pd]d -wquELw8`νk7~q5 a3s!TZegcy~syM1#J4PWn[Wa@C:ݲ2~UUP{bq -p[ jKm̯Bwѵ߅+CCGe9|sL7KzKW:.Mp[.748Fb2|[/I.!Գ|(Yb@3p7ѯѹg_/->w {Ϩ*O4vGeA}ˌް׻jC']Ո(+GY9j:,JU3(w"`yᠱmF/`.gn\qVְMwhPt~9ݍl$N qx<>f t^9jR_%n2K;קl(l~VQ= l3?>补)7ZL{k콙bv2=~6OL<~vudr@QA5ic%Yiy~.44e4 -i\8iP^sgiz*_3+ -`ճrY$k4պ߀:Kӵu>_yw ^ +x]]oq}ׯг]B ױ / pa3ßQbxwCZV[RGuޅ19o?x8sV[_>=^󣖿M}هZꐛ?>djT;-WwP&!\u(6 6D 0L=wa#^چ` +rxϽ^ݥ;ŸsCkp KIW!R cB!/RD|J&DK}ZA@]We!uڠ+E6벹(Dn$`T7mT7TR]_M8R]׼p@E B@xj)A\h"G&ݨn + +t1doNx2>&wnȸp{kK +w83d,{fȔ,{\$vOSISXp9XH:I՛{jV@^OhN"Bg&GlI1QH/"uNޫ8L9z=QgPEΰEH_ :4B=CRK/x/@y Bb9eP瘫EΡB}1:;A|)7|)Wk>& p_ʨv_B؍:-LyJ*I98 JFa'/ȁ |AdBTɂl +;i|AE @L1)ٛsIU5@V5`A_IA_:v qS0ޓ%;7e}'{B7Xn/e_6c9i'~_}Z|ׇd7OW!d0rl+8g=cgNk^vi{g\ڻ[?SΩˮr3͓sz%s9ƅ~ ?_~ooXhA=,='jx\>t}g܋ǹ +<2xnttDޭ&,t5S݈V{Yk\roܵɳWunE&m>6?ΟGEiw`J%tOg.uM/Ģ%f\=s϶u&Ȓͬ:onsST}cϼ[ MmO};FШ⛨57!"]*"zurιPoSȍL4󲤏^'ѻM 71s GnRȼyX}u=v qoN?73]F,`Sc|e5ߝKЧJfB&sec^Z\vuӊ~E9&1J4}ǵƵ#K)^-}}҇dKi7v>+.uҖ}y&<ֳ^jcW:SrZV(k-WI,ϒ~áG[6.ݥfLwW_ѽSIw^C}?P.JW_+߷QLrxܧUʞ̾t"=-o+UrO`y  +#X_ܺT@x3:G68]5su*ŹG19^ɋA!6?BU{q:oԯ.oi1F_sDm WWțonxZoK6ʎ40Ts-؏,jο̭=oʣюޫ(V%^RՀ+'&5W:ǥ+}#O9;1Y 8Ν);}s}Dg˓N}뜯:}Kِ-b_ok]7ssP5˯_697sߖ'+g+;Y.N˱w3}wrFjpya+l9jesQ췱[pu7Y(Fiomq8 a\_7 qNM pcqc۶/k] W}ies/G7?=pJE]^.{˦YmxnMg1%XhΏj3r u +z,aWVqt'$\k<:~ X:lCLu)95vWnkWaI_/I.!Գ|(;Āf|/n_s2p}_A[|,TQU廟i{u W7'о^ {>tU~\(5ǍwGΈ]9(\6f/uY$:_V9ӵc͐MzjR0|695>42\ ? ʕ/SɇSw\0G"98?,]WZtW@sLih7[znyf8 +ߡU<+Tv3?>补)7{3soŤ52=~6OL<~vudr@QAݴx,ӴsZ</4ʌhq6*g5~o7rϻPF*\eg2IX)X/iwukk%} endstream endobj -898 0 obj +961 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 897 0 R +/Contents 960 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -899 0 obj +962 0 obj << /Filter /FlateDecode -/Length 3745 +/Length 3744 >> stream x\[,~_1φȺ_ఐ@lplHq;{/v8RRԥ[ff!gYϬ[{}UR[8N>}ę3;?' F:{ @@ -12410,64 +13386,54 @@ qd5v{b lMp'ځn%Zf;pEJŢ/C Ӣ::LJyE-w]0ju%Gpŷ!slq+H(dZuJZuhqAPV[6ncZOya[i= E0qhFY6I(; xU5iI$˥g^9aw鵕jOnmzUFWu& mXf>9hz\[ݢ#;{u^6-Əj]<ݓw٤ %U6Fwuv⃎W1+eY6/*9arݳDqeK`sƃAD },8$6e'[UcIEW^vU`qp =q["3K[uÀ>c@Ajn3v)xі<咁,foL>ƶ2{0?vlT)+ɀd屎O洀x͟RFDž~df2F< -TtTFi[b?W9 1 ΂Z0mā; -Y(asrJmeO70afh +PY|#Ҷ0]%f3v> Ђ#ZPmK +Y0ausJm-fPѷ0翎/h endstream endobj -900 0 obj +963 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 899 0 R +/Contents 962 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -901 0 obj +964 0 obj << /Filter /FlateDecode -/Length 3294 +/Length 3295 >> stream -x]ێ}WfI`rLHAMM9ʈw= - kmH黿tf҄O!oG]uM)+bymhל/zrǩ-ku=kgoh%LԾivƅ=_XT1=>|U:g" -Bunk+d --Sx/J;=>͑4ޤy^ !74 7PZ`ɧ"Wz=PUQ|uIff~wjS)Tё_o_/^x>Xm+}pB{+qaꅌ$az9 8aZˍkF_\v)7.6ݖ}OH9u{޾qK -` 荡IjRXAD+ ^kLdL|@9{MZ$R%|nmH#**O0ۛ{*GiW ̋"C@yyet -ZxT0=nEC'2IDH!$-"[N-4#?Mx"h*EY\jDCQ``ɛ32ahQC(b'҄QčҏQAQ648`:O#y{n*IޚѶLBA/h,*6PAu@(.&DdQ&QSFdWxVY2:Ь5NLOk4"g )d oR]463W g^}yK -jbHcCA6miefzchBrlFb|!ic)hnܸ|J\z{¦5z5ЫhTs#EYfl%%٬<K?F}KNSv[i'Q{8& Xjb;MaUNi{6-u@Ac8S8,R,,M6 C $SufosMY\ظ?O4)ӇɿUNrxzy9JӸ)%Xz7-tX /:yRV)3myajO,yU9.+[|+Mx_?ە|2a@(#:0 -*ظ=~TwkzX$?"s{?ٲnb  a-ֵ s -J˰ڢ+y -M0Y&LT:phhl5C#ae F v"FZHZ,u{$f5rR^#Mo[ukqʕ&r~+*ȁ: j~mXTcmSڊpP⬑Vz\% p9rE -XvYus`1Xcly -WbX^% ZfRL!J(ː@Do;æ?Fpt=B?CU5>gw`xj)u'c1:e^an tduB*Wl -P^vמvKM9J?k-1R> -_|=v<%Kv\(^ީjUZ^Eܭ;vE=begٿROȴZdGL}ǘԶJߗ~> ^YžY޳Փ#2Ia3 }ABave Rx:-59um3Z;ޗa^4؇ - m cG5rXxFÛXh|K+., u2={ye\7?VMoȶF~62X; KLdsЃ/6"O+2Yun*IaU9gW -49|8cmg(@a4v^f -T~CN+> Ԓ&(ϗqO2mɽiơ|:rmW!rүG5 vnhscm oԶtVuܹkBwڏ{t|soA2m|޽YDZlHZ,irjr:pP AgmE'drzCf -[WkgJ~'/uP*eK+ - !ذ'fKtHGQ3*ztv-kB^X,5R.Hڲy~_uSrZsV yPe~a`ǏVWY&P^rUHe˱ \TKqluT!U\7j) -c=\-fAPS kZ!!c* # -2lH# -gr%gjж<cKD5l=bfS0z㓗?FsYw\{J!($lN^\=] M zDA^9-;: -ep%ke`[Jl;Qοyw9MȺ}sorL'K6$[Lˑ|1f- l{/Z|K멙M|~_WLHAMM9ʈw= + kmH黿tf҄O!_G]uM)+bymhל/zrǩ-ku=kgJҗ};\|cwS,UV<~*k ׹گE\*Lȷ޷w*8|7GZH{΃z-$߈/B kn(%_@UEɏA5&ˢocMo@SEG.}x ` Uƅ2Nwf]z^hm.79~q妄޼^Lt[?!Mp^*4gR$Oy[#/V*xG㣃%7&}ԫv&Jae">JNvv&xm3gГ1 +5iep^KP-"Lʪ;TYP5Ku`\%yQ. *+ʪI"5 uY5Iţ mȱ䦍rȆ)suiN +ՠOCCQ[k}g 8\LdOd,U-9ipzOAxsoq$Z#\ ?G1\߃TkxcA檉4U;٦Mڴu z0Ng=`=3CS9"͐ǘ|>F(ZUs%C, Qp!a(!ER [x'\9̶xE3^QݶX5׍ݴk!t1Ɛ'Py^sod0Xe1$>$L/iXjܱTHG0\K t04AL614Oי%5f}p1bflH= .Lc$Σ;g'V%;5(!Njr,bNKpݴa1b V';I HX!{`Ϡe;<rTl@4}lW`A~txg+bQ=rBZCa` d d˺-pwtOv\PAnWf '/ G,[7{7ڷ5*f.~j)4dFsCl>$:BC0R~á QE,ٟ' jy CkyXML$ۗbʅK]{P F6v`3CAlnխd<$8qf1,G`(y^sEQG⭏[k)yb$[ޱx ]5C`kg7lz2Vf+Wp8 갂qcQO k+~V[CiFZaB q>HrB''5;[m{(b bɇf /ʞ`Mv*\ayL.hyOߛJ 3(D/CgUVh wY) + YVN*^D݁f&1ͧ0FO]ěm蔱{2Б +\q-(@y۽V_{-5qC(a-x3_$K @|+| B hHכBQ$K9Q9Zg%yҤ@lڍtMAR!ߌ6h I[DZOɼ^YLat,Qvd_t^s@zyUj{5s6?Iٗ)e"WkrtJ=9#Ӟ>˦k2cR*}_Q6{e {f%+{FWO;$v"(,a BG0.Fڕm6H錶xGԁ=hQHx_y`[+6,f;7,4;a oZ`Gt]/pPz'TxX5ZqX5m#۶ka`Y&,1rCFcȊp;?l7fչ=WR$lUy^v(XЎzB {])P 9M@PK<_FǕn>ɴJ'jj9O^:& HՀ۹{v鎵5hC?XdnhQ)[EusV ޽k?ѥ:*̽tTϋ=v`@ygj!j<* +\sw˩opmHB|dAod;S)lU^ `gݟ)]!ОA6Zc/*􎪇8s,cÞr7-]"Fds/#ّ k`xc92DK k:}-CM=wk!YTvpUC͂ov?Z]f@yU!B-7pzP-MBQxVq+|p1zbn8BCO|j%xX3[85J X3y3kkPq_GBۖY + FV/ac;l|? +MO^Afi Xp +*ﱊK+Ó:zs@v874Z)>x]#H0k+•|Wnnu+D :ſw4"ͽaʑJ8sVOX2n,20;a#ob0"/H[^>֗S3%7(91_&ܡוChצA +^u0.Sq]4,ltEw{^EWCg^ endstream endobj -902 0 obj +965 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 901 0 R +/Contents 964 0 R /Resources 4 0 R -/Annots [ 903 0 R ] +/Annots [ 966 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -903 0 obj +966 0 obj << /Type /Annot /Subtype /Link @@ -12482,36 +13448,42 @@ endobj >> >> endobj -904 0 obj +967 0 obj << /Filter /FlateDecode -/Length 2197 +/Length 2196 >> stream -xZ[,~_˺_0`q N~񘀝`CJjTRK=9;ݒJuJb^_/]8sO\E9悑.A3aq3!TpS)fR-tK\bs"̈`3*_~[_ -oiZ~H*1CnVxRY,4fg%b&/Le2gY_?KbWU2h!fY"YH,ndu2=!)=ſnM[~U: G0-O Wop.,󆫠ͣe@~yʨ域}[IH'!_qvi6ƹ5 -5112߷H+݋Mi9^餰=\ L`!me}Tڌ. ,@fAuدufR=KFa|]x%Ʋ?Rn<0HB5W-Ѽvi#NlLX 0F2gp&E"CT,CkI*7 -+2>Gqk$t4{8z3.ۂV"?74E ԤQԈ@l BgV(9~yMFǜ!tWhBJ -& M-#XuE[v -4΂ᢾ@S:;Y\"x"u.RP0Z843g,s;N~Fiu&k".9qjc R<;5M_mǛs>R(ֈm#/#MMԩFS7s0'WhR FdpR"pC<I2ME<2+faC=;}B%>VsAA]{&Cwcyc~CDi}ñd_ѿrzg@d7@<+(*ʀ)M #eDluC+3W>g`}8wphEYN,g|3Qvʚ4&kPn .ς6:ΔƅVuNS= ->a#Svi\!l*D}?k|fq ^ms @+u !2̑ؠEύ&!Wp`t+$x=]wDd h ytupfM@$1>k3I +F%f=<'W^NQXً[%!4P')]Cie.rWѠBIJ&ވFb ͘'8DLoR:,<Q7MT$)9l12%QVe@E,(.ʫ*nc&CB`DŽ"Q铚v$]u>^,%A{E3'e1wBLvjWcIUJ\yghwa*>eZDZ髗ůAvF񪵗D|l -iv6qO"aƌI "GH* DŽ]geԹ =Dj],D&) c4qh%gsϲYJwt~Piύx!pA,d` SI.Hk@M]mǛ> +gcmdM~Ko +dφʑR&i~&jTD\yId +tPZ;bߑ$dt+#h0@ Ywu 3XǗ,04օOWÄ0 +JqDNG;e\ʠ|Cnw5m`Gt##~6,NFR0Un5&LGU}CO|735ROvWМvzY٬_A4gFڇݻ\DWat?D֦@FR-ᝣ;HruJ)Qct{@ZPw +$AV2MiT-`b`z7ꐥ;GԈH?52{&$$4 mZd%(}5+gvRJ\D\PK]cxo4Yz"l.'1C0/AK0Y>s+ +*+W1x7;쥔"JɅ + xMg>{=^j ߲@ + +- + 3`J{[CeÑ0zء+o | +3E@ }|>ce;kb8Y4 L?a('n3s%CqF3.]ZߞFd)|Pʺ[|Ax׶?Wy饈C/x-?@NT'"`eB6z$ޮ&vU9XiHv endstream endobj -905 0 obj +968 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 904 0 R +/Contents 967 0 R /Resources 4 0 R -/Annots [ 906 0 R 907 0 R ] +/Annots [ 969 0 R 970 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -906 0 obj +969 0 obj << /Type /Annot /Subtype /Link @@ -12526,7 +13498,7 @@ endobj >> >> endobj -907 0 obj +970 0 obj << /Type /Annot /Subtype /Link @@ -12541,104 +13513,174 @@ endobj >> >> endobj -908 0 obj +971 0 obj << /Filter /FlateDecode -/Length 8634 +/Length 5388 >> stream -x_qG)s$6my_| UsnLI #F$KT]$_YZl/.]ו8p;j})}}ۥm[KΩTXei^zJ}/9rYn~!_˟gׯEe奖⇺3mns>6E/.vݷnv~MK['Ģ -x.vR_Ny5)%wT?6ti]m[.=D/?[\N/_ȱKN!DZ.m>e~n},fHyd55RZj1&Crk75#nڗZpӶ 7nZWJ[iޠ[;%=ܲQқ yi fYI]m%'Czڠv`5Wh{%Sһ -%{,9y&hɵAmLwN7J<ͫN -VKf>*n낹gpˊg Z"g4E.s:Wζ厹9m{-67ۜ-W;n1P[Tن.j16f̽y̥$j1٦h _b^"y*nܽz=hEP[xr*3e;"A;A;E:迠6ʽxle܋fW"E:Қ-{:Xs:X{o`]mQڐPv -1wAUj 5;j`M s:X,dj J7K~uІUuC`3M\Fmus:h s:X-v렭w^mܽZ٨-j f@^m{u&;JmuЪu0 s:6[oc1[yO^m8\z{L֣)wW1UOmu*7u0C[n՘VlB?a%rŢ1J}lڢ&bt݆ocrkmVfKhju6!b`VIA+i(b31.jܫlՙڢz̶s{X}{{[ܭԦR[X}01s_̽y̶2ܛ\Dmxv --9;cNs:X׽wj Ֆ;OWj 6.;zmߩ-VFqj1[7ܻlhʽ{ٖxf7X̶dls:X^1wncb-bmp=f[S[xL^zLێ{L[ܽu0)tiɔ{:ZܻA[}uЧ~+=S^S{:bV5ޭ7zp)v(w^<}^<3^s{>KVot_m=SVw`ܭ"t_A8IGʣS(T|Y3 -[c٬6xڜQw\5/##R}|q)c(ǾaĈ="#1"{$FdĈH#1"{$FdȰGbDH#1"{$D=#GbDH#!2#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑐`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FHL0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$d&{#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=2=L9`d#{#13`a#{#aS{#FH {r#F0Gbf#F0G=30G=쑘0G=`d̰G)=`d#{$f=L9`d#{#13`a#{# 0G=쑘0G=`d̰G)=`d#{$f=,iG=쑘0W`d#{$f=L9`d#{#13`a#{#aS{#FH {r#F0Gbf#F0G=2=L9`d#{#13`d#{#a#{#FH {#F0Gbf#! dObt;fŴ462mK&"~'w!DZcc(ǾaĈ="#1"{$FdĈH#1"{$FdȰGbDH#1"{$D=#GbDH#!2#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑐`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FHL0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$d&{#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=2=L9`d#{#13`a#{#aS{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{# F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`dd#{#FH {#F0Gbf#F0G=3F0G=쑘H<:Е=IF-۪lVLgby>ʼ.[i}_GGl~}O|:ʴ.iGbDH aĈ=#GbDH {$FdĈ=#GBd#1"{$FdĈ="#1"{$FdĈ`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FHL0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$d&{#F0Gb&F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑐`d#{#,{#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{#a#{#FH {#F0GBfG=`d#{$f`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$f=`d#{#13`d#{# F0G=쑘ɲG=`d#{$f=`d#{#13`d#{#a#{#FH {#F0Gbf#F0G=3F0G=쑘0G=`d̰G=`d#{$d&{#F0Gb&F0G=쑘0G=`d̰G=`d#{$f=2A/6vs{mNޥ 3?K_?~_W//~Ί)J%B"kAXA^mlzw^nC>NuoO7;?~gq?nsde2RG8r;r=/W>}>|)<|kfym]o뉚N|y'QO'ғ҉^Ou o3'Ϸl;o18t:sHSS~vLq ҧ 8qgs&ͨFPR>Qϒ6qvug9FWX+NҎc~z^u)t;׫e9}(UۦS.Bx֩Ѷ|}jjۗC5!Wljչz+Ǹ6\>|]}wC ЦW@G?ysc(|;S|VW 6s,tF8ϳNژϴ'] }\Udd J֪%_\Wſ淿|eb^޷/-ֵ)OoLac_/9\@K'ꥆ{JtH]оbqiw\= ڨ^ޱ8=w\#)#<}~K?q+α_E:<̂W+NG#]ߞ{dm$6a$| m+->7 HV{|*~DfAa =ȾvYq#~\~~+y_}xb5?`tۛocȺ_oIޢ|cƽSMH6_]Aנcmy mO_ޜ)j>>ۣ8>۠yʿ_& +x]]o$q|X, փ$p$~rz3 hvdtg.쮩̪&_KZ%='w2brOO^jϡ.5s cO/չ!\e=/o?BRr9v)W<̩a|e_AL.-Jìu%E!}.P +<2{נlAȀ-ȃHp$v 7<+[Qق<Ƀ;<M52ޝy0+?$}$vG+AH52c+[;y!(;Y)P1 cj."䢰o;Qa(sDPPvoUa2# [D`l(e-"xE.52c<1Nb]V9c11EagE/G vVE̎=d12%d;xMTZP1,'ʌ@aO9l)3Tl)/]a̮JXzr'([e a.ʜzW(Q\٢Rf^)3hRfrWٍQ2&A;x0%v lUc2-52S;eW+2#sS fy0S/ +{"VDLNz""Uʔa):3/ƀ/ҷ1k0H5 b cBgy~Cx3h^@Y= 2gx7P #Of[c잿:Is?ws#[!Kajo [pTh/ˌևP~]CMW{ÀCT+]=nCX[qmכ'/{o^zX/FûbGsVA?05 2̀;a>mU3~\VAY-'r3î+oƧq@wcwMRurm s#VdL68&H9DŽΒGsL:Wf *=wI ]_VԒSKg/ +*E/_Z(JINyg;^..ǰM<3}t;a6[sISs,hg|q5GW'+#N;*\{1e}fxt>&v& ~;tٲnq AGddc +Hf׽slIt7$43B\з3\#p; weGx$M6uq—s67f13&5.;;K(LyylmwƵӲ ;C¬c0<~alh4`+lJYᖕ35Ld&Mg֡cϮr7Ij5{[بw9;Ϩ{|s:rcQ6p6,*Pv/v:_ ꗜ΀&Ip6ذ՝9ȈLg*ny-Y@v;VYUyr呣Qʬ4]os-_nfd6ْ[DWC+uUE/5^Z0@ۇ15x3nםH]f'N)牗l n9j4li2747y$͟ުm8D˳K;vCcX},Y+, ےΝ/ӳe.aK.tڄy?5j0"=p}uvևo'0)p;)YV^1RF6譈[mIx:Qy=UP }guL{3Bl')د*qXm˸㖷bάKbY[`~]?nf6>=pNP[baYYhxmG;4DO4x=&jr t7P_܂x +ycI .Лc ,=ޖ  鑊&܀ =N!HPdq]|b<҃P-ų3"f}qeG̸o8/W Yad8K쮇]Q?+ &- +|{hY\J9i.Ϣ?ޜٗX6p9]HfOT7_F0j9}G`vPqcf5lyxO{SM޽`;}EJxk8Rغ{,cʁaw#okֳ-ao-ѩ6E =_{^[~SL/M`N;/뿣|36vR~RX*ʅwt?*FK៺ f PX]-/! UXbo%}N6+/_>:aXe>|h endstream endobj -909 0 obj +972 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 908 0 R +/Contents 971 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -910 0 obj +973 0 obj << /Filter /FlateDecode -/Length 4483 +/Length 2681 >> stream -xŝ]uEW̳ HC 0 "E -`ٻgx]!!^}N[oUm=G{??IěS{y[[+^=Ui^짯~_^l7RsZ1}yyc6'oսښ?U7rm~*ۿt[y5ք CH#IHnmrS3rrrTi jzj{3U@\n `:rˢk,vXH #nJNBfZ0xW=SBMo[K`t0ky-&U;'vsZ> 3 bF޳x}`5`$rvu,\\s&m剽ל^T܊bTvDcQU{yf&u袱L暱KI45ӦhY/vB꽫*kCX(X(v 콻ֱk_45Qh,kc<9M]ػ57Oj4ʾֵF~MG}f05i,kBϮq;Ckx/g d;ĸf_ F5/TS|BHj^>F9htO+Tޫknx/W&5;xiMb\vxrjĨ< Tn]9 K(It]wSЁ;p%c5Lu -S)t`Z&PA͞JջrQ麺V5b4Ch,k*zYgErͥuu."b4w`{`A-&]W Mz 堻{ -]9X4޷k䚕r099> -(}8wTڢ{ -9ESAwػsJՇslb8ub;E`AE7]WAh,tOa8ػsN4uL>UG ` -mޝZmu SACػsP 99{ -9&;5Ypj0p +x[K賁|8@|p &pÇm_l"?HfvfG-RT"[E#fILފ/h>/''?[y6 AeJǛZOh-O?-YO^YJ&+g2C_:}y8_H Ju*L>.K%b춤lr/"0 i̅O)=>0y. _$䔘pgv[mJX NNΥǬ'ղm1EÈrdNz3)TƜ_>?ߜBZr?$2Bh&^ &nw5gB\q=]_Z#ݓ_7ӺK񰮛 [Kt{.y͟3Oeͅ G¸cDյtYߙty"!iP×ny=/t=2RI/#fl*y= i[&0 +fCo|e0,J5un. .+ yW+=P{52s+D:@uq.x et +$A>t}+"ZH p/$Rt]sG+-Y.[sivו^X߭ŧ[ *Vd#w#vL%ddEKVtMu ɸZ oQ~*(Z%\_:Z"S4/_Xc pVIÒ߅.Ff;IVH}=8L^;W9p\!ey;<`˙J\#f&i`xbboz;)CBX0x/6m xy-9t +H{/ }|_:vnUq_̀͝> T,;i=,Ҡ`Vct?1C]HBfz#.-'ۍ3z=r߮}Aw'7bkz6χVBp&@BƝ5 +0`zÍ]m^]r`=Jnk65fU($Îb.vlDV.psy'#1'(/t2,eM9mHv~rD~C 5t-|!L$uF*|/OA#sX}T sU6j^ ͂֬}_ʈn%% +endstream +endobj +974 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 973 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +975 0 obj +<< +/Filter /FlateDecode +/Length 9639 +>> +stream +x]Hr`+lL@X?6}4-,0lDxUƑZn`K+L~;e|ck~w˶F<㿿X?ex8e]yyߎemޏ45}wǗw_⃾~TE㾮~ݚs9~8?MyyO[_Zy]~R<xHon^eosÿ<ᇳ\?xymx9h[3DfK <@湍L˰He$8^#p$H; +[wh͒"a݆Y wi-Ý7Kzpݒ3qߤ w8Fi={i t˱1 41Y c-#]&KpiwiE]t`y?K|MZ!`uf9jcknjyi8fsۥ))cY:`e7}ʘ]s"Wkח5k9b޶Cs#$3LsCŜ1/hpɘQs_2i-9Œ1emD-nB}>kQ[[D[Zbm%oBs_3e[41Y8-1{ܳàg"dkSnk6ưgngJ1nmu0Ds:Ms:8 P2&bu:+a5Q|vkMYǘY[d u0&n{Yᘭ-FܳǠgXo1Gy-pZ?:Gs:8Dܳs|1sYrkY~,qDi6NJИ=m0%rb0k!c٨>kQsj3[[Dac"m]5%cds-֌9.Ś1~fæG۱mQXLQszج-`xhQ{˘㰶hs[r2E[[KVHf}u͘)@O51O2q}-&{F35b`G3۾upjm}=b˘cdos,=cVWb01 Я9eCܣN41Il_=pD:Y35Qs?2܏y>l_ sT9iu0r˽eeyw"H˞)1 g +-`̐41iܳ.l-iu0F{ 4Qm_e̡"`t {в{ܳΛ>KjYپz:8amup~0cw=`6l_eŌ=ShY\X?:M=`L4Qm_ecZ45qkYھz:aZB:%Ws:8"`dn-ฯLeUs:8ܳQ-:8ΛupܳE1"pì~hY}ܳ`-{er߲hoYc)c[אl0[[8f=xoQc[18bܣ4)c^oS<7{MsLis<賤-LJLa:8ۡG;,UW%L/r.DezT͎PfEvq˯_͊_oY.ǟ}R{u=ryc?cY.ǟs=/O{FGj{D=R##5=R##5=R")nH`H`HGj{FGj{FGJb=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGJb=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGJb=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGJb=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGJb=" 0#=R3{DaGO{f=" 0#`Ht{DaGf?푚0#`="~#5aG{DGj#`=" 0iLG{Dan=" 0#=R3{DaGO{d.0#`="~#5aG{DGj#`=" 0iLG{Dan=" 0#=R3{DaGO{f=" 0#`Ht{DaGf?푚0#`="~#5aG{D|f{DaGnHt{DaG{f=" 0#`=R3{DaGn+`%mrߴGf{mK+~5+.y8ᇳ\?%+ܷG +GrDۆO99[?pk )nH`H`HGj{FGj{FGJ#5=R##5=R##%#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑒#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑒#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑒#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑒#`=" 0iLG{Dan=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaG)=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaG)=" 0#`=R3{DaGn=" 0#`LG{DaGj#%J8ȯݸo#o=ũhf/~,On^=R= Vsÿ<nY.ǟr0?H`H`Ht{FGj{FGj{D=R##5=R##5=R")=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaG)=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`N{D쑚0#`N{D쑚0#`N{D쑚0#`=" H\aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" H\aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" H\aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" H\aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" H\aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3)W7obqhV\pxr9辽o##q|c?gGj{FGJ#5=R##5=R##%H`HH`H#`="L;aGj#`="L;aGj#`="L=" Ht{DaGGn=" 0{f=" 0#´{f=" 0#´{f=" 0#´{f=" 0#´{f=" 0#´{d.0#`N{D쑚0#`N{D쑚0#`N{D쑚0#`N{D쑚0#`N{D쑚0#`N{D쑚0#`N{D쑚0#`N{D쑚0#`N{D쑚0#`=" H\aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" H\aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" H\aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" Hɴn=" 0#`LG{DaGj#`=" 0#5aG{D쑚0#`=" Ht{DaG{f=" 0#`=R3{DaGn=" 0#`LG{DaGJb=" 0#`LG{DaGj#`=" 0#5aG{D쑚Hɼn=6H~xxٷ<~J)#~X>?6Eyӟ +?O_8>c=qX>_e1,HL#n?/G^!o?usyX{<^w{8n.<.缞>9smw3d2[>s~ƬϽ真g?\rr͖r|mlho @t›Q61u?1xEXqަ|:&c:_ǯv2?ڰ?ƛo1L=y֨kpvoՇsy?Q;[ <ƛcN5XT -7.g^"_kBqqotSlL.9sr)/挗F?~; zFYz#V 쉗~2}= 4Nd>kp푡nqz=QwF3>~6府wNx 4.{d1sS{>[|sCRPZ~cj\+_͵Hoi?Mzl`4RϿ>UYiqY9}}Fbk~[?~겕<<_f<l!ʥ!^:?+HϭO=sZj^l<ٟ{·>[;b ?wl?0|>Fz[> ď S} RWG"(ZKJ=o7#۾l7qr?Fzã[뇞yNw=ȝ<򞘠ͿzU}-e oyN\f烾7Y"nyk>޹08':nEc^s`w5$Y곕]u#;p|Y跺v?_,=Zc?\uV*Cq}Ҷվ^#'[-۟}rj㲽XBZ~yFyk[`sܾۢ >r=k^ZHv3W'S 0EX_|5~>}?<]0M =sW+T +endstream +endobj +976 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 975 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +977 0 obj +<< +/Filter /FlateDecode +/Length 4222 +>> +stream +xˎ\uE5T@ X hC2 eKx,RdEM2k1]vtYĸ 1Y֡r[l]9XػrPt]1]-b\횵횵sY8{fiTZޜmM9ۜt%99ޛsP'{sꄐ7NTBsj#N7sP{wj;tI9ۍ)`TެػsPof9J՛sP/4LhAAt79ػsP9XS9eМbAmw`CbTsQ94 `Q,:t\qo!5`ɛ7`I)4`I {w杰w`^7`)4`Hi:uf;QޜY+f̥=:ޝ:`]Wo:ShY.L,ISY8vL9<ޝ7)}딘&7b޻rPL]9Dzv;Mkb\s{I=f_ f_!51y餚zWBbT 0AE{ +]9:^]s{If71Ls>h/.QӋ\st]]GK1=,zyBWmt]+kW#F+f1]vAt:+ޗk.tQ64ޕ+It]]'pbiAwErh1b5o\7]W5+`99> +(}86ů9Sj) 6AtOa8Cޝڴb+]Wp{wޝn>>,ZtOa8ػsN4uL>UGsj_mޝmu SAC6ػsP 99{ +9&{wju0p { -9ޝE4AuNՇs0Ns0ώ;>943Y `{wf uNcL{6L+a4]W4S3>e}:u*CէsK?s0Js0JO`޻bWS9ltOnlw堿怽]W5AfqZ><5牽Wל^Tjz1k=kn]9]9诊u|܃'k'ZR5+6fs6y_4cmc?.=o M#_߼/{=rF9#a9#=rF9#aGe9#aGH#GGHlGH#g$#r#g$3 {䌄=rD`&`&3s#=L#=L#gG {G {Ge0a0a&`&`93=L#=L#=rf.{G {G {\0a0aș`&`&3s#=L#=L#G&`&`93=L#=L#=rf.{G {G {\0a0aș`&`&3s#=L#=L#gG {G {Ge0a0a&`&`93=L#=L#=rd`&`&3s#=L#=L#gG {G {Ge0a0a&`&`93=L#=L#=rf.{G {G {\0a0aș`&`&3s#=L#=L#G&`&`93=L#=L#=rf.{G {G {\0a0aș`&`&3s#=L#=L#gG {G {Ge0a0a&`&`93=L#=L#=rd`&`&3s#=L#=L#gG {G {Ge0a0a&`&`93=L#=L#=rf.{G {G {\0a0aș`&`&3s#=L#=L#G&`&`93=L#=L#=rf.{G {G {\0a0aș`&`&3s#=L#=L#gG {G {Ge0a0a&`&`93=L#=L#=rd`&`&3s#=L#=L#gG {G {Ge0a0a92_ a$wG푿"HU:֬xUѨ3#oG^~}sO}11wEިw?9[A1?=7)}߲ւkwrd?R##*_ZmɼE~zOo8>'HGƻrzs-T#~9]_LݚHK}7sW&xNiVϞZ']oϷ/G52s^c_9{5~^~}=o>YuH=$ -Vz?$gOՎ W{iʗoc NO/SLS|;3Jt|k c -jW;/Vpg}swr*q4ڳ[3^(WL#M_z U&|+eG;̕oթWu>_3K/e?xxi_ب{pMqsQ;UFz^.߾S9y=H~9;~I޸ +9ޝE4 :9W{ +9gޝYJys0LfubqQAo[p]NiwuLkcL3uL#=L=S9ZާsP2t]}:/Cv\tT{W]9jt]}*)[G*]9/sދkn{ +fmaޫkNx/i*$b֢{ +S9ػr0/;w堿T%䇶< R~-T/ +{fp9xǿlTUy_xУxǿc_GH#w$+r;R>#w$; {{䎔 {䎄=rG"#=rG#aܑGȱGH#w$; {<#=L#=L#w#=L#=L#w#=L#=L#w#=L#=L#w#=L#=L#w#=L#=L#w#=L#=L#w#=L#=L#w#=L#=L#w#=L#=L#W&`&`3&`&`3&`&`3&`&`3&`&`3&`&`3&`&`3&`&`3&`&`3&`&`2O0a0aȝ90a0aȝ90a0aȝ90a0aȝ90a0aȝ90a0aȝ90a0aȝ90a0aȝ90a0aȝ90a0aȕyG {G {G̱G {G {G̱G {G {G̱G {G {G̱G {G {G̱G {G {G̱G {G {G̱G {G {G̱G {G {G̱G {G {G̓=L#=L#=rg=L#=L#=rg=L#=L#=rg=L#=L#=rg=L#=L#=rg=L#=L#=rg=L#=L#=rg=L#=L#=rg=L#=L#=rg=L#=L#=re`&`&;s`&`&;s`&`&;s`&`&;s`&`&;s`&`&;s`&`&;s`&`&;s`&`&;s`&`&+d0a0aܙc0a0aܙc0a0aܙc0a0aܙc\_G2S~pz[KBMUxW9Rum^~/^~o_훔rԾYC=_>r7>뷿GZq})W?~M>#7eT_-s}i o}I?+vI[몿+shۏxgPO\3^KoxFnk5>Ԯt1^[;/K籷ECpԽrZ|(p}.l|TQ'T%Os~Zul߿g\ߐ endstream endobj -911 0 obj +978 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 910 0 R +/Contents 977 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -912 0 obj +979 0 obj << /Filter /FlateDecode -/Length 3928 +/Length 3926 >> stream -x\MoW=B@;$7|Rv%qdtOW b_K>kIt`KоQ#)#WbZF\sD!`;N +_P!*A"ȄS9w Q::/:bRu0`HdŅ/u0`lErZERE"%:.ܩ1vɝ:/{WFT/;u0IV\!uiUr" %w``O+b)_Pɝ:@ܩ0QR6s/9vA$iɝ:iA5(_PuND&SQv [ANn;u!|AD:*ɝ:hhŝ:hT6ČQ|ArKACQܡwH)i*Cc\hČjT"1GL 1#}ƫ…/"t06Le/"t\7q:ܡn3!fdŝ|-|3PHba̵G=rmE:&*_@c-+`9K13P1bхtJXz/,tɰKXr 1ޕ/ -1#+_TbF*QE+]eC̆F3I!t%F:GrK3f`{'fDމu0{l%8^DL*:jU+:W$`MqOALDĄP' &*j!QQMD %w - ɝ:VK:6a;uYr"XղzfBH&$ \r0ܩѲZWOALՎBܩ(%w`8YVqH \ 1ZWO`])$`0ܩMrz3^])$å*YIA_:D ꠇu1Vܩ,;uzR:h-=D4;u\ɝ:)_P N!uBܩ{7MB֩I柲)]qAؘZWȦM)d'f.v+bꎲ!(3ȄM f.(b„I Be̍a\$ %HI%HoeCaIS3|+UseG+`46AHnܡ(l^@S9s2D8q'[r/\r/Ց-acA)d`@=  eDDQ|QU^"Žsj]Eؠ9:r/;tEBUA|$+(wbN]rZW/FP9BD"W u | AK) P$w Vɝ:rT:0[(AL$w ,$w [ Su -u0"Sc{I:KU:=/|ڐcܩ6Ժzb2 -ur:BSrܩx^PH;u^r"XպzjOPa -u+SA0W:-=B%wꠣwC/ucܩw)A-9\b]:hAk]rZ3ɝ:hԺzZ1P]qAKW 2j]RYǐQ)TYT+t{;t{Kj]Bפ7':2c{ TԺz SQ>'‰٫^RzM&iM)T蠷%w7:GEԺqޓ);wm}}BTb*uU/2p}A/`cW׷Kȓ߿>1O: @-1oo8qjAg7H9"]"8)Sq9~S''={?G[h+d|%o\ ц%L͸ _7]tIOv14k8z|hr>~G[rN(uN6?X|rQ8qq{5?0==6a9/7iK8mi1_>j{[0A!6*?lfp[;^>\k$;Az]̗k{<2gq vKζ~ pm_=/q֡\9،ցtsk=y!Qs1߼vؚ֬Ѯ׾ {5x٧CvӖ5n6mY|GNz1X}٧}G!Ŷ9\oٶLop :ݤѭseX~iޟs|x1|~8x =nnQ#0]#d78Zs=ʕѧ0Dz͖GBOO[;lO^gw&?9Š8u jۆ-5֑qut8yI!svG/~-[>wXWmOws}J̝~/OCN ɧxmfBu۽WLJ%X’?u=[èr55=>V_+j;AqYĹ‹|+ыpj[θl;8јCo=do;y7n=9{{*zQW9愱/ҾRakN?Fژfs;68Cy%-ېhCY/?7c]ɭAѵCIv w)X*kT[ri:>$k^Zs D1߻u"Dr-7.?<j:;U6kG#chyى.PR]Ex$jц#-ƼOaކ/]~>n(>_6/no\aiƩ+dg|:)'srxڒ8㘙L:C.UqeacTP*n2e\kv'`2tt>jR^?Tivev؟zS~Os?~n񗳨. =?޾j|FSY,bQ1nM4#1vM_FĖze{n?\~퍟EpHv ->`S͆?wCS9riJymrq0)^~>ǩV/!L{i~_z'WzoRo9{xSqۏ Ug<`XfbԙXԟ4NCpr"j8p2? +OwN` VSk|cvxDZ*#?t.0?{%fiĜ̕/1GS6LrQ)c j D%(_Pw 'Nd *_P1@]"PGa@L!+:0/u0Yq@(:[ܩ$|&|H Aab%w`]r"f `ޕ/ՋNf;u0u0@/WqHDZܩCɝ:8ʆclA8Dr"$w`0,M>g V]!uIZrB|us AG|AD#SQIA]:֣uj!SNfȻ)_PC Gr"ZqZ- 1c+_Pܒ;uА~w`Ҭl +lVʦ(in(X,&=1FeeC̡*H߰G'fp K"ōf\Er$w ۲E ɬlEqgE#1C/"1c|.6\{#{-JA6Q:krXsYrOČ➈9SČ!T쥫8lUrkU6[P<,A$.Cc]r/ĜzW(Č,|QaWbFWbv,w 1eX2&Aؒ;t0%w |U6喲!fN̈jŽ3*7 `ܕ/JTqHL(:ZUu0ժ::W$`MqOA,DĂPuu (&B→;uNxzyM3&NdܩVVOA LHA݄DKA&;u0ZV}DrY($ _ɝ:^r*`|A eEs[H:zjO!QNn;uЛzzu8be%SK| #/SHAbXq"HAIuZV{ +:h(w V;ugT_=Q ^SCꠅ*SL4n:+0έSe`?eS`S➡1WAM)d'f6 1l9ʽ 掲!f6& 07,w`h\*`n\ "= ,GbNr/)Gbx+bDLʆ1%\+ZsBrDa#ژLԞĝlɽspɽ#[ƂSQ{ +: +:艪j`QČ*HqČUވ9dWr6(cNlEr܋DPU_ 8 /d2t0 %N̩KcW}b (A$rŽP!P{rg΀ԞBR{ +: +Irhܩ)GW/ՊEba$Sa!S!ݪ^LuAS(؊NU%`,U u0"{(_P#*d!1&SQmzb1 +ur:BSrܩxW/AS(A$Mɝ: /S^pS(A=BJuU_PeP^NtNtuбUz;u.ŝ:ȲE>KX+_P:hKAk&SS{ +:hJ{b):O=L4jOR͢^{ܡ[R} +^SߜT;t9HSQ}9P1|OW=ɽ +֛&iM)T蠷%w7:GET_ u8 I#;wm}}BTb*uU/2p}A/`cW׷Kȓ߿>1O: @gc.ĥ) 3N>O))291870x"4ohkm%!9z9߿ᛋs!ڰ ѐ wfC\b6ip%b8zspu=x=\Y|~@yWnk9̨m8d8OǞEfx;j{[0A!6*?lfpyz?. Kp{ |> ՆSzw <~f\ŖA=ۍq[t/Äu_v>6N:Y#'q:ν7|{ з^He`4\7f5kožx ^le37|@[m5_nbk Vشi;Ggܜ^Yql[nj78wep Ljyn 2,4?ctio z{\"`wCEˆ{t1߼>l?sQv +BhGm ]87[r ==ma|>y|$07qΉVq[5W65oחu*Έ{sK +Y;zk9^a +>݉!*C2w<9%.$?v >n^` K+1lynʃC^zʙא:Xނ~<eM[> /APaiƥ+dxY%tQ:/4%q213YtjR^Ү{^o O)oswK/Ao΢;T.|fxOi1X^o3|;"a{l+o a*,9n])hM endstream endobj -913 0 obj +980 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 912 0 R +/Contents 979 0 R /Resources 4 0 R -/Annots [ 914 0 R 915 0 R 916 0 R ] +/Annots [ 981 0 R 982 0 R 983 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -914 0 obj +981 0 obj << /Type /Annot /Subtype /Link @@ -12653,7 +13695,7 @@ endobj >> >> endobj -915 0 obj +982 0 obj << /Type /Annot /Subtype /Link @@ -12668,7 +13710,7 @@ endobj >> >> endobj -916 0 obj +983 0 obj << /Type /Annot /Subtype /Link @@ -12683,48 +13725,51 @@ endobj >> >> endobj -917 0 obj +984 0 obj << /Filter /FlateDecode -/Length 3885 +/Length 3886 >> stream -x\ю|߯g7& $H`!. {^#H#L].0|gXd5IitOG4?˃,?,_Jc0轧>1%K9V/>ߏQa=)|i^_<~+nt74ZS>^yhqR'0.~*o?;G^εޏ-8X)T>\4dV#u#?]兦WOq h9bbbJiItd71C92MZf5f&lɶ0[ +*=\i\B=9wN̩Ң@qL4Ƙl;:n֕##H5jmY}sUi3Ŕ+LD#Ȋl~2euJ "Ԫ j$JTIst)4k -2Fp0)K)(mh -3Ȳ87)K!pOIfxI'Mޥ,N, SRP)EzRxUttMA%pFv)K#ܲxj!3Vu^ǐ,dw) +,I1:i -,*[t/Vef2+jDI=I5@YB))oK -hLM) D %KsL⒂L\%JLtkIɒe4IAs4tJL,-%91^d .5tRΉJY%!es>:g193pKY/esIf&Ή939A^J9Ή9a&)sfp,tN W3*7@3E99) 3a,es:gt:'2[ icdtN IӺi -&WӚ sZMs'IA91KAd)sZ*r$fERp4F9.WΙFY^$pN>С)MG&HdG92327 pGz L=Ι:ɧc79.[(7S޼r'8MoWQ/L/Ü.59坢tM |YiC%kDꇞxO(_FM{|b<+m?V;,=w_ђׇÇKXP8ps;]b<0Rgߗ t8ɥ9:y -$ ;R/E@]s~Zo{<95^Wĩ!KLj\:uOMti{zzvsS#+:ǔX<~A֨Y;kؘ>?O\{ |Q@e6y_l+q}|K ,cJAtBȅȼ?߇;E{y-Wm=m&{0`,XS&ւwMOܼ&NH}Qe5~C-f, W?gZע\Z3A;dm/]o uY`74]cf/<kڦLdvnן7o)Cƭ/7c±]MCBy|^ppd'no{|kfn2gc~]6e*cD=Q&CoWltXxnJggNL.JMa 2qt g9,[,좞 @Ǿzg؄LjY)RƱ:Tblov[Yƪ׽!sy2]^B̍=772!qFq=\dFjxz`z\jgs-{_:EknIse0w,{)Zlr -i} -ۆl?r.9nUhrld3$c&sN |yu2\׸Ke&y<pg(zSΙw6;q}hgK{'tɬGF< M'9PusxI]4ĔҒn.b!&!fsdfdkTM=Zm`VT 1{"l{s흘SE'fIii1vtdۇ!&+-FFLKEij$>ٳl 撫g)10V"(WGd݇'= 5)E0z#UMA3Ԧ)H͕()xi]2(*%:Sh +2[d8aRCSP<ge)K!p nRBL'4N9 KY1IYzxES,Hoͫ&,J^5KRFe)K#Bff#p MMk!eYRWYإctYTP'p$e^̤eVԈz& !IM..ekASR@d?8R:'JL%J +2E,֒%9hL,i +%•,YZt%Ksb*33\j +蜥 Mco9KCB,}$tb)sf93_B̑L:'_M)sfr..esBM)sf4LxJY蜘tN :'KY蜩F9*() ΉOS@Dm;,tdHYpMӆi +1A,tN Uf&)s\R@紂 Lj es5tN90t1AAQLG3R&)(F(l,`b.<MTH9͊ i)s]3p10I +|CS ܛ\L r\efdO)(nz,.Wq.7@Ιz M3uIO[orX]PoycNp߾^\^94]k1 rO;Ep˛Fst /K!=TP<卢ӛL ~;`~y:pOW~" wX{o_:$%E_M@;p"v]Qy`/?ZE5⯧A2霭q Ks>tu=NAGIIF>w\5vNby F)Wu)+vyQzwׄ1}~eǹ:{r%~.i/Il~VOki'z YX,׉x=;/k>ۅ y?~7v܋h/Zb{LaXⱰԧM0emy#Lڑxj([=,X5>2~ήӵE-fb-wD_>_ϧ2)ݳrohiI̬_ y& l;YM"?oS[__nDŽcE/p^oDO&ݞ%L=_4 d;m&vUo5.{LƇ$7PKz钝P2,fgNL.JMa 2qt g9,[,좞 @Ǿzg؄LjY)RƱ:Tblov[Yƪ׽!sy2]^B̍=772!qFq=\dFjxz`z\jgs-{_:EknIse0w,{)Zlr -i} +ۆl?r.9nUhrld3$c&sN |yu2\׸Ke&y<pg(zSΙw> endobj -919 0 obj +986 0 obj << /Type /Annot /Subtype /Link @@ -12739,7 +13784,7 @@ endobj >> >> endobj -920 0 obj +987 0 obj << /Type /Annot /Subtype /Link @@ -12754,7 +13799,7 @@ endobj >> >> endobj -921 0 obj +988 0 obj << /Filter /FlateDecode /Length 2113 @@ -12769,23 +13814,23 @@ x d`tԅn$R^IaDl8Ɂ~V\hED MI\vnԘ-N-=C$4cFF7\iLLJ&dݿ1DhBVh< :4P)Xv`eUO\#_DVE$%}Q76Q'Whd`BÎKeAGS.lں$t }Q=, mZ:P2#0,t5A0A`jVr9I-`PDOjZi'mw6m[bhoOK~oz DA0x[,ՅÃ~lcwzZ/?yǞS׬83\^S?kJH>rEL; OfnD%f?Bܼ@B ,mU.xD -l5U~dYHPU㒂F}8UNLY -Ę Ac. +l5U~ԁ: +ڸ*z\R0Ҩ)KBs$:a6.9 endstream endobj -922 0 obj +989 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 921 0 R +/Contents 988 0 R /Resources 4 0 R -/Annots [ 923 0 R ] +/Annots [ 990 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -923 0 obj +990 0 obj << /Type /Annot /Subtype /Link @@ -12800,33 +13845,32 @@ endobj >> >> endobj -924 0 obj +991 0 obj << /Filter /FlateDecode -/Length 1628 +/Length 1626 >> stream xYn6WV\A$$@Z9$LI"Em{ܐ[-Z(w"sZ05zZ|pf4n ǗzL^3p~1!TR RN_/]+f9NBH@x S||0 Ƨ] hU?tBs$T9 x Im1&&c2Oүj9'Vv~7)9+Y5Xc%x\yp=Dut$/?qQ[^x',!9e]Xc<1-Fdp4sM8n±n;.{7NLmUQ8,ת,q̾Ou9zM-,oqhT'8ǵko|Dp,("O䵁Y|Mumt/>̾ qk^ T5,CVbSjYU6NFuNsf"Z֥љ0y=1&FDatpE_|8oB<'<1JV@Qdwpg&ڳH:bTΩHs&=c;⤵&ijڙrə GM޲sj3fɁfE20I4p':P#0%(i E>[WsADHC (R,U)dTq6֠udА/Fy5"ͥ>eň7mDiqG#MuӼVC#d*0'փ,I6&v))XہTF!1x*tRp$:,ݓSQΕZP(@F/)h'eٚ }줔j^6}:KM?`HQO;XEN1UZQL^1/sN/n;b"iiH_ܟK{&P\aPj:kCA:jX8sm5bٝ a5 8$,%Z[ZhF|L'}=q.\jd0  -i7-FA,ϣTa+R}y+[5>D8)n,4/`'Esǔm߅ځCeg.<ɏ6F3O^䫁K6_E03qXΙJ}@MA|k`Axlov-k̓!5o.bMCI&kTH_߇&rTnI#=;S%};F=;=(2GtDNV]a10&nJMmd$?>.ˆ3oD1.x3,g*iIUBUhIpX@GF&٢p"A"('1BAc'rB6 -:TܮؚXPpR4}hQOn +i7-FA,ϣTa+R}y+[5>D8)n,4/`'Esǔm߅ځCeg.<ɏ6F3O^䫁K6_E03qXΙJ}@MA|k`Axlov-k̓!5o.bMCI&kTH_߇&rTnI#=;S%};F=;=(2GtDNV]a10&nJMmd$?>.ˆ3oD1.x3,g*iIUBUhIpX@GF&٢pB#($l> Jo19!*fnXlM,([8Ń>4(`)n endstream endobj -925 0 obj +992 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 924 0 R +/Contents 991 0 R /Resources 4 0 R -/Annots [ 926 0 R 927 0 R ] +/Annots [ 993 0 R 994 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -926 0 obj +993 0 obj << /Type /Annot /Subtype /Link @@ -12841,7 +13885,7 @@ endobj >> >> endobj -927 0 obj +994 0 obj << /Type /Annot /Subtype /Link @@ -12856,32 +13900,32 @@ endobj >> >> endobj -928 0 obj +995 0 obj << /Filter /FlateDecode -/Length 1405 +/Length 1402 >> stream -xY͎6 )K9m^dödɦd;:GD#bǯ{'^G#N{Uz(ԨFkoo?]^JPJXm}|= dDFQ=HASP^:(8+H_vO|!SєSG)ux@ߖ͑.7~KM' vK[R`nsYPoi> sǎWt<>)<LI5zql_G)뚱` &8nu]r*ݨ A>)$u<N eS6_1zrlKgXWdEl2x@"gGV;23݊.=Mx0]pi猤QV@(*)賚9%˙Q4ؼjɁ+M}Oy Y 8dfx5Nn.ʼnb`^ј(y>Jc/d=3Lo9Ы)nݢu @˒GaH"(6/E3tl( 7@ -y)W\ bQ;2ykKAse(L8oer}PI|SkʱhL2Zfj+ +Uȶ*MkOh.w<xcnFVShzUqBK22MYl2ѩ:-_ig(&XaLpsZkCʥSo9Ӈ+sGG{?GkTpfO6PlksY=V:U:~z;Fi[4! -F/'mA:2 b6R秿ѩU1&a@`Mup-xI؜=4-"HzJoi'0cՖ lmFaCTnj-Z[{OңC[@߾tO;QTR)hjKEgD +јk/ǧ<Uy9u~Ro9DatsK DI3Z\RGɂXԐY>ee'p&9uHV,# k[R82ޑa+X6t z1=.5H(,)ﳚ%˙Quԧظjrɀ+ئ<ފ,1oNa2i |S'7b`QЀ<➅3nަ0f^MIRt5x]qy xs!gF'fA +閼`Z XM=5Nm24o3%-Oq洭lqe&!Az%cMzoÀ-?6/l +Zq9+(uiDFI5ZyONdۘBǕ-4Rxjhզ-WWW KWk+W⫊vUvL ++!8{q_UoҐJj(SəA))3Bҥ4zyV&.D]h5%rsңs.~X#*@kGtdCƷ Ul*Xsܰ"T MT,c.s vaY endstream endobj -929 0 obj +996 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 928 0 R +/Contents 995 0 R /Resources 4 0 R -/Annots [ 930 0 R 931 0 R 932 0 R ] +/Annots [ 997 0 R 998 0 R 999 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -930 0 obj +997 0 obj << /Type /Annot /Subtype /Link @@ -12896,7 +13940,7 @@ endobj >> >> endobj -931 0 obj +998 0 obj << /Type /Annot /Subtype /Link @@ -12911,7 +13955,7 @@ endobj >> >> endobj -932 0 obj +999 0 obj << /Type /Annot /Subtype /Link @@ -12926,47 +13970,41 @@ endobj >> >> endobj -933 0 obj +1000 0 obj << /Filter /FlateDecode -/Length 3910 +/Length 3908 >> stream -x\]o|ׯs=3=_A@vb; E~@eG:&jgTx4}ZO?<`S͆b||T{מjV[} !)^ZEx俟9L^й -#/oyn[`Û ǿ`^*MμbR?g[tTܓ lGl.,7 7 =^o21;9;&B&&) LLIp„pqp Z5 Z -V"]qr$L׫ TMU"7*zhm^L"aὙ" &՚p@0)! p(NN)f`  &$q%; x$Ux65dfؔ,&\$@^\x"bN WH̱&LB#1[#0IP6i k{Z䞜6/1#u)_$bT:1 ;1hNm 'f/ Ag`.-I;uъ;uT6ČQ|ArKACQܡwH)i*Cc\dČjT"1'L 1Ǫ#}&T=bF -H0HALrQ(`]$w lLrB-+_Dbʆ]w$DPgD̘*_$b6. -`=Ik-IA6I'R-+`9KN̘(N̩E&ftE&PLV%w`*V `t'*_@Y aܡ.bޕ/ -1#+_TbF*QE+ʆ ՍfL]!t%L&:'rK3f`{'fDމu0ܕ/JRqH^wzSVATjALwbBVӝ:Cp -qA4(SQIAZRw`7 0cJA fɝ:`UNDGH&8u.SQHdY;ueA;uEN?T6G:!*!(:CWN՞SN $w`h՝:jP{ -N pC fV;ugպS"Q:bR{ -N +Adɝ:hպSeACS1˕ܩP:huАTR-Vɝ:,gqY)vn* 7MM{Ժzb>ljO!bb!f(bNr/)beC\P60VܡqBlq2#l W{ -:RYrOr/)'bx+b'f&MeC` Ve̕lH@!]r{ImLLnjOpN^9ɽsj]6՞BFtSXP&(ADOR:KIj]U l!Q)1+R1Ǭ1] FV$w`̽HA UctԞBFމٻމ9u^r:D Jq/AS0S(AAjOPQ!IA;usR:蘭_ &F;u;uҭ uN:P{ -:ZܩʽBLuBL -Y>mH̩IATj]P1Q{ -:HPqHD)SQIAZW/AS(A$Mɝ:/Sj]P P0R{ -:ɕܩSO uB -=B 5KPܩ*|A *_PC;u0];ue|1}WZQ!uZܩLrZ5^VL)T堸WyP+uS^,cA I)TYR+t0$w`պz^])otd*:$H^ԺzĜSQ>8C1KAmj]5P.CCPܡ|TD߼p&ޓ%a}͊+aZ?~K`W"R1x/}ϯ||}PS39OL;a26·נ飻59$7\y tx&Y2 ׯw_=|>!&;^?FB soH ~|{]mk.,6Y۫͂P]mr-?PZXxͨԗ|s{&$;;) m5w"v0zuD`"uU+x:қ pmx>>xv=, -x 9rz|?egCܹϭG;THn@}i |6!vk ]:շ_;'/!^ÚvƝ3v}.;ŻFs0;,&ǝŽa0y(OKԝB~{1/Q{/ێChc;K!Ch5+1wi!>ozMqx9L)P w鮷eM-GIBbH|p}VOl$r>v"L0q+ڦC)m zl̐@s=ƥVcJ˽T;KY>^fk:';1}7]as^sqPq$pu(qL{>6Ovt>mA% lql8O8T×k{wO; p1Oܡ!w\TQy)eex[hˢd\ve J+G3FL/{c\CѓLЛ6mÜE;s~RAgr!V'GB/洿,d2{Ds?s{B} '7|lh4ux\ -w*{c0č䣨y\X;ipTJ:ZxsP"BG+p^t_Cܐ/ߗd(^#}Oy~|rOtf?_pzZђhs?h~*ok޽*7{I7{ZݛTy7K_(z៕7?K S!?P3|k7qf^oVI_VuX$dlt~$jzi|nF -ꅈ-3 -:r~ #:qӇsr>2os_\g!D7~ +x\]o|ׯs=3=_A@vb; E~@eGi&jgTx4|>aj⏧~|fl0??>:՞c-'o-XCBp0){JV÷~VCqʡi_<+:7u@Z!>fxȼ f8p=p+T+)չ?smEGO=م];9z;g'Sh¤$IItcb0 U90\kfaV"]JQ+[ zuJ*ҕpcSVZ ńI)ޛ)`R pbAQbF1!lBrwnXRr뮈kLB^aSsn@fMɒ{`ErŅ'B TpEkȴ-T=5=se|.'`KicQ"3RE"fAšs +s|ČVpbFRp`.{ҒPϽJP>ϭv H:3j$>{%fi/1'*)9Nd%S@JT2!*TAfŝ2@TEKazr=R=f=R#Q"RJԋɝ:juHL6HDJ"#u](SS;uY5+_PS]:P(d&S# +_P#[:k *H;ua(S#{ZsJM:HANsVbUR%w ħ)_PCQ:P)_PQHAn;uiWI:ܩMrZ|S3ݔ/HY!u#S S-IeCA(N4:z4+i98D();&EqOF̨F/sdYs;7lBUS fpL S$ōfEr$w ۲E$lEq:_KArO uVHČE"f㲪ړ䞸6ْdi/p"Ղ鰲暳ČĜ)_dbF*_db8lUrkU&LwtaQ"v:J{!f]3E%f^U^9`lP(`ƔUBYbKkܡ}R =( 1cwbFT+Q)_Ps]:$AEqw꠷;ukU+NDի:)NĄYqw &j5ݩ=WND;uNx%uycJ3N`ܩVAtLp nS!;uNLպS1]V; +ND+SQKCep/:Y(br ɩ1th])8u0IMrfj]ݩ8bf%SqV;u0 /!&ɰNDfܩ];uZV{ +N4;u\ɝ:h(/)_P N!ubܩ{7Mb֩qpOԮg lLg ær f.v+bꎲ!$r f. H\Q6̅ e j:''3:p %D.r"f!f +qbfT6Č/.`U6\+ t%w +/Ժz'dKc 1Ց-acQ)d`D= eD$Q|QU^"Žsj]EؠPhlEr܋DPպ:&pA+_@J)d`D0JKSWň*'|QH{BB0Ϝ3h=BD +uND*S='^يEbb$Sa!S!j]P/ Pɝ:K*TZW/|ALӆĜND uP A;uNuB=BDҔܩ;u uP{ +:#P\ɝ:1TZW/вS(PN ŝ:u0*SܥSYpw URuɝ:h$wUS:hԞBZ{ŽR1Q:O=LԞB%ŽBCIr\W`՞AGRܡ|ArEH̩=峈9T=ɽ +ѦlZS{ +:Z;t04:GEԺ aB@= \o_o*߬82UGq~ f~U,"n/ݗOׇ0 ?<)Nj=C9c{δk̟+F9/SmXn|x >[;]C{5o靷`KgΙ%9 (\_~c`!R.`_ث@ߑ\~3v|l\k~5>k{uYJMX:|3*wdr>9={wAssG͝~;L^>Ǭ1fH] +67f;\?Ѿxy[$g\__^=|=q}z?wsN)Ҁ>)3P_n~ZB*otkHA{NKH{9װ,q]G_m>?o+\̧!0{ǝzN^ntz]I0<%N!门CmG! ː!4GUaz&8I&Ҕd(otۿ2Q$si!1$ >'6KxIvJ$8lk&}(m3r7XŪ/qCUqߗ9vEsaM m+ضYȱbOtu|u^q/vفWEkj7μ%\QNW;SP}H}_mSɡw=6fK`_9^{+۱y^,{p/3azܓFDE>ߛ.9n 88W~H: 8&{=s٧];: ۇ8F6w|~ϧ]~K\5=S;`Ý8' މ[һahryܔ`wH22s ٌaRx4eqd{.2zOv|~#vֽfAZmu k E6a΢ǝ9?)3OX#!ݗ}usD2~RJnv= Kq=>>6s:<.bjqeFGQ<.tFMO%- ?(WȣWmj݋hQRnK}R맼_?\rHc9f:{3DD}fhhI4Yz75vL߽$L߽m-o o~S%ͯo^7?K S!?P3|k7qfYoVI_VuX$dlt~$jzi|nF +ꅈ-3_~>i9oґRo|QV`ù_9/o9֙g endstream endobj -934 0 obj +1001 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 933 0 R +/Contents 1000 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -935 0 obj +1002 0 obj << /Filter /FlateDecode -/Length 3661 +/Length 3658 >> stream x\n$+t6q,H`! ⃝C l`AZ%`=Mچ J5ңNhÏvjX~XnJbq{O}|[W *;2e%5tp߭7 ؗ&ɂ+8C[vSʓw{#;3Id~F]Zh9^޶<5Y*K#-Uyv&[Ѯ:&0!8q.MXnSPQsGplv@9jot<]VGf٦\gz/*]$nZkT\򜩹=VԶv{n,s?wuIy g+<ؾF.e4^k윟W-ԟ߯$ؽne#Vo?~E</}2u2;7<<;wܯ**Mw{&;_ +855ŮE콹E+zEs.Gw 'OMXl{|3&H34e<m-l·A)6xs#u%H>|[W *;2e%5tp߭7 ؗ&ɂ+8C[vSʓw{#;3Id~F]Zh9^޶<5Y*K#-Uyv&[Ѯ:&0!8q.MXnSPQsGplv@9jot<]VGf٦\gz/*]$nZkT\򜩹=VԶv{n,s?wuIy g+<ؾF.e4^k윟W-ԟ߯$ؽne#Vo?~E</}2u2;7<> endobj -937 0 obj +1004 0 obj << /Filter /FlateDecode -/Length 1906 +/Length 1904 >> stream xZKo7W Z 9$=4$(z(@!wg- -Ԃ_3!%z 7 ΚN -2ݛ>~i'\@>aJF{滠yPJ 1}z}{u!_ٝIrQS`0tui i~qnV!^D5Pl^X ӱ_Dl`v&}tBڅUkss -irQ {{28Z%">lۨu*`#i~ܭB5H =n#3y6Z`pkss -ilj.|rawjv-p=H'_w~o -T&|{y#%9`$ > i 6HskvuQ&899DCj1unn<:vrl1cB;iA8eg0+p* $ъ6V yAOq5oҢSmbd7!"qmWJxq?gHE1KԞ2e\s{0uedVe@B >1XT}Q1ZF$?glJݦ1ATN`06#(8]w/t\Mam1n})bnU4WirHƈ5(5XAO{YiOP=XDzYwairXu0}繡M'YvzR@Lȯ}S\t5geAApXw#>WQv"kc +Ԇ_3!%o@x5ݷe#7}|}i'\@>aJF{滠yPJ 1}eB;GAEM#ڃq@Q2kƹ[x$s@EXa{a]6L~ *~t!!Cؙ"[HQ iV懮*}EB#*'nZhrmAokss +il EhU 6懮*}1!bFf69eީؑJзI F~ݽӻ_>+Ry獔怑4P`&ԣ#Y1Fsrh``W j ZzV{v1ͯosŌ[,Al 0D+h>Xu7Fx<ռzJBOeDPJ]ǻ||DlVǵe^)_:~ϐ)cEԞ2e\s{0uedVe@B >1XT}Q1ZF$?glJݦ1ATN`06#(8]w/t\Mam1n})bnU4WirHƈ5(5XAO{YiOP=XDzYwairXu0}繡M'YvzR@Lȯ}S\t5geAApXw#>WQv"kc Pk󍛝_uYs@ !T&ōzO|æK>nhs|mf/!\[lWwڨAxAl,hk P);Z;im'y7][ԝ[.̰>y, 3 9{[nMnk>T(κ$u\3I*[tLMFʀOfދ>zJO(=Mmya#cAȘi!*0ǹ_ű +s Hi҂Wg Ze;O.6Ɛ%0E ]QԪ\;YֆpЕʰ\ ]ˊg0XԊXUrǙC)0BA\RfO纎]գfn:]Qvxjy}I.:(Z~ α$^,]f+jFc -ѭyÙNԉQD*< WNL0m :xg,[cv#gChMB \5"zh!D9У$ejd.ήIǩ̬\`[iT^Sk@PW$sv.F G)AO\g|iq5nʙ> endobj -939 0 obj +1006 0 obj << /Type /Annot /Subtype /Link @@ -13039,7 +14075,7 @@ endobj >> >> endobj -940 0 obj +1007 0 obj << /Type /Annot /Subtype /Link @@ -13054,31 +14090,29 @@ endobj >> >> endobj -941 0 obj +1008 0 obj << /Filter /FlateDecode -/Length 658 +/Length 656 >> stream -xUn1 SH$NKE !݊pO'@(LsEBᄞ}zyTCŷ2X|Jv5Č\]Al)=MS/5P8Æ64˵, ." - .c ՖŸK$d2y Sʜ~βG^LsN8fSQ*ifdMG}5.6~06lub9ˆIg8{ǖ|,w a_6^ -XV@-oW-zk]jk N}605'Lka[ׇ~&IW]nED^xRB߳حSDKu>I0^>F;2hlECUԶ [zXjF,(vetrB=))P@c춞ɶs09ϱrcizW`kJ`үr_v\մӁd΍~| +xUn1 WH$NKE !݊pO'@(L???'^t +Nk-ߧ |!Gw}򭴇)_*]M>1#WW="(1zJ1BqwӧK.1OX3SہՌ$fr43\i*ѧ6 5Z `ēWL)%ZNp +@;po~*.^%{"ǚ=Ěqk>8llC}\ W`@t!t$,]"$m E2O}P[9* s&{3U984f{S_*-t|綺&iͮ=eV_*?x a |,'&[U<}tQV?$H9-4ހW%-,@weA8:m0 nOطlm>]rKZ^Z|H j5'\#I'zWYo7ڑAS+dgMyUآnR6EgQcD1V+K-rj|)OAA'ɚVӰطqA0W9Vn,\/ J,vT^:)ڗ])v5t =;~ endstream endobj -942 0 obj +1009 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 941 0 R +/Contents 1008 0 R /Resources 4 0 R -/Annots [ 943 0 R 944 0 R 945 0 R ] +/Annots [ 1010 0 R 1011 0 R 1012 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -943 0 obj +1010 0 obj << /Type /Annot /Subtype /Link @@ -13093,7 +14127,7 @@ endobj >> >> endobj -944 0 obj +1011 0 obj << /Type /Annot /Subtype /Link @@ -13108,7 +14142,7 @@ endobj >> >> endobj -945 0 obj +1012 0 obj << /Type /Annot /Subtype /Link @@ -13123,37 +14157,34 @@ endobj >> >> endobj -946 0 obj +1013 0 obj << /Filter /FlateDecode -/Length 1441 +/Length 1439 >> stream -xXY7~_φURX?8İ !sxL NXCJj5 ;#RO$41i8}=yŏ^>;LHlcFɢs9×w|HÀhaL>r!|ڽ>ӿE bdF; b?8*ʨ?5Nڲc4>ì3CD'8E^ݯ3ٿκa0gv,hp:Q -,hFBO-mL.Lx̌(xp -}{E|FsipT4q|uu):Rʹzz-W6^Uώ6W}HU~>Wlĺlo3_ -S;<'')HQY_}[j>t2t|T%܌o HxP-G5v[JWd^+Y6$Z`6*zN\;*Ú1<5[ǹd]:pnLq5u)i֫>e| b;6IٱS.N"w #;UVmZӾh -L(*/oѲΕR׶G+%6ϱrm*|N}4Ꜻ4Y+ -ì)v\Ѩ%Ufzkՙ -5t#LmQ֊t {[-]L6Dk^SBSZjQ~xʖWfd۷?̀l<0nr`{J>spohe̢`mrqe8yuݡN_= -ơ_zgkjWγ^ghpp~9qxQ'<åt֕s#" p9'SW3zu4KW3;v6^Kj3FSkZ_M?e 6^mD 7An<&/9{$8[I,?? S OjwzRM8 4fs!1o['EKYSX衡4:3$L,/`Ũ.y-sj١nO[7CVx&\5Γ5 Wg@!hKe&@'%x_uHA%r3.:+(iv`l^s ȳy.F ŪURӅ +xX݋6߿ρ*#iFp,yHShJZJPhZ.#YGwh~3|}O@Bp|x8K~z# +C!^5˃*Bk_>>>>Z|(JzHחOףV0|peAD .Y%VY1W3l 1)PT9r>fBZ?8Ġ)ݯ ſj*Xފ XZkA2bj΀bB p p1 "!k d/Jp8T 4 qg ͯo4I?[V&1 |s<ՕH)`Y;`48'UZ<.,%V8,plesLd0fϭ"֡ ƔXG:k<-N" +긒]Y^Zl@ic\_XIEoعbtE+VDf!G NԦz<&$3[ֹ~^h /4#7tX[΋MϹfd4;5Mւ=0V4"oѵ7EZ Agb-vf#Bghot;ZQVt{[-]=;Z+16GET:E-57pU{[>ozArwGAҌ%kЧo4iP$5:ma8p6.oWoIT97LhlĦ؆8f]s&6msB%.MAst-q-+4MDtN?!O%;i8dgl=,+=Q\c(MpSo9/VXQrhQj!cSgZoOxS.k{L_˻- +:>9C4ҦQ0TX<S"`UI&[) endstream endobj -947 0 obj +1014 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 946 0 R +/Contents 1013 0 R /Resources 4 0 R -/Annots [ 948 0 R 949 0 R 950 0 R 951 0 R ] +/Annots [ 1015 0 R 1016 0 R 1017 0 R 1018 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -948 0 obj +1015 0 obj << /Type /Annot /Subtype /Link @@ -13168,7 +14199,7 @@ endobj >> >> endobj -949 0 obj +1016 0 obj << /Type /Annot /Subtype /Link @@ -13183,7 +14214,7 @@ endobj >> >> endobj -950 0 obj +1017 0 obj << /Type /Annot /Subtype /Link @@ -13198,7 +14229,7 @@ endobj >> >> endobj -951 0 obj +1018 0 obj << /Type /Annot /Subtype /Link @@ -13213,32 +14244,29 @@ endobj >> >> endobj -952 0 obj +1019 0 obj << /Filter /FlateDecode /Length 990 >> stream -xWK0 W8iJ@B:-N4iة:MgBz,ww:E]4t] tO7YT(-u!(P}s,a]\RrhxR1+JL;dsrZ#KFH k=/=AocK4 +,+|,{'}dM$jm~II`#d/]&2\!pSql$Hc}Bv_}] KXj]r례fV"4a}QvfrCaw9M$'{FχVt`.,&(efkk@;1nƘٳQtH3*"/QcVaDOY>îz5]:uZJ)i%Fpg|(z洘Sh9e]ua\Tx0 LJd*s-rj#FHK]L v*cbι&¦3/ d, endstream endobj -953 0 obj +1020 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 952 0 R +/Contents 1019 0 R /Resources 4 0 R -/Annots [ 954 0 R 955 0 R 956 0 R ] +/Annots [ 1021 0 R 1022 0 R 1023 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -954 0 obj +1021 0 obj << /Type /Annot /Subtype /Link @@ -13253,7 +14281,7 @@ endobj >> >> endobj -955 0 obj +1022 0 obj << /Type /Annot /Subtype /Link @@ -13268,7 +14296,7 @@ endobj >> >> endobj -956 0 obj +1023 0 obj << /Type /Annot /Subtype /Link @@ -13283,35 +14311,38 @@ endobj >> >> endobj -957 0 obj +1024 0 obj << /Filter /FlateDecode -/Length 2098 +/Length 2096 >> stream -xZ7b?5zahiHhʵi)`ϡ\CGZ=Fڕ;ByՎf7o8ii{qfO|NYf=Hk&vN8?Y\*\TV]xz,I)ob -/w/㿻3U_9@*̈́ Y,+frCxlgg{9flL*MTr}f_6sJi}"]IWpVe#p˿fw<{prNy币Va>,v aEOq)oL녙_~|7ʠ;P?7tU\y6kk.Pw4?Xd ް@#~\g!;/E:s -GᦎkL-UL@4  LLe0/j3\5y.`YyQZ9ڬP>}Q (rG~lҋ4DmqdEwy"y%ϕë>kiT=eEI(wO|ftr뙷֞-IwV( +نhhz Lv ><$7똆>egrֈz -O)|{Hmo<䧺rW0/h\tɻ`c>'7ŭn $ȕ;ppZW5hJ :W K,+Dz嗀{dٻ*14fNN[r)s( " f%& -E\7CVFCa,N[ԳTuνp2]71enwUɔ{]Љv]wIkuROtظqXV+uun -bw뀶%]]N@y>EzzbԶ=]]„MQ&nky>biBXSЃFc dvw`YD/_yϯ dZ.3(ǸD@7S\epӗIm O&anh1ڛpG<3u' m2Fq{trr¸ Mi{am+H;\q<&I0sU`QZ`0< H=I0BIAUr'uPߘ,m+( قt.?7Ўf(x9su\!7(עhޔ3{3AW `qf3/em_>/NƠ#4cӮn鰄aPƩlbbȣMkN|\lY,zO#S^Sg\ cc"VLj d*M@ǽ꩑5A0rkSm,$iJ/.T|$+.J /AZVV{ σa#!@ }ras(KqLrH2vݮ-)ąv+Ef&\a->NU[Om!CL5OėIXR\\4o8׵n:ݎQ5V݌,NU KB|ӃB,Ŝhu*{hJVYMp1X E+|ƦCdkY0F"^TM͋_3}unU"nP -T/`#Pi\Ў:ױX2LJGM*EpjneSJpͦЖ M W0}z=.A}.FCq ˆ -'{{jȃ{NDpL.a(Gd7.3̦-*4 CW#:U  S ڬ .3f! A/w2!ڻwB:` +xZ7b?5zahiHhʵi)`ϡ\CGZ=Fڕ;B8^k7qZ05z?wYw4_~)ˬi5 '+KJ1Jq;}y} [:; !%ፃCLA0>}wwƃ"9YP9}A !˟eL^n/MLx8njIŴ +AofP)7/_D+_BYδܪ_փ7tn~gcON)7pʃ<̇?."!(w4. sד6Ic0=ˏo_f[4tqjtN3 + 4:/q7ڦR{ x5v +~qIJ&wXGi}&= yy. V]&\*+Lj4Nwoz5 `&('w{@͍ބ;rx9Ϙ;Gd=l5:ۋCM5hN+xk[Abw9۴5uBJqMy%Ywec,rͿkRN> endobj -959 0 obj +1026 0 obj << /Type /Annot /Subtype /Link @@ -13326,7 +14357,7 @@ endobj >> >> endobj -960 0 obj +1027 0 obj << /Type /Annot /Subtype /Link @@ -13341,31 +14372,31 @@ endobj >> >> endobj -961 0 obj +1028 0 obj << /Filter /FlateDecode -/Length 1248 +/Length 1249 >> stream xXK6W!!>ii/hYk9Etr$SIvֆlId&MW~BDI+t>bsdQat3)Lѳ*j>]O<B1d<+g.Q)}??^O7TDK[vB}cjQ+ Xji1#vgZ#.ګO.8q7VwmzWV8+J|Xu!UpF58=_N&i;'?N=Љ=>=,`!@;WXdj gpt@BGH\h-!cїD{ӚJo}IY{y?^XLÁ I.5_q묶d-k]wBa,Nk5ӄng|cY5v}L=w~/)cfC`9+Bѵoӿ"0cPꍁ@ +$ ZVcORґێ;C9G!Ή}y*mTd~o~(SK+= .-ZdF)?988FA>q- sT l4kN\GȹM/QC$kאJ9|?ⷶ-sMFF]EÃY85ݖRf QaDTuuj"3Ha`@f7 7QLW`FFNY7!%g?W>"Ypr oYa꘮;sP^n<\VCM+0A4k-(/V(g45@tD t3(:E"+Г(rjۏwNT^V+Oh^@ #&;T76痑KFQX'&b fMfmѲI$^!+֕(Z^vǃN-m sG^z3^(d%^_ПCbϳ "v@?#>BF +ţQ/zLb k *~є8I礔zuo(HuGyCzYA+/RT74'ww endstream endobj -962 0 obj +1029 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 961 0 R +/Contents 1028 0 R /Resources 4 0 R -/Annots [ 963 0 R 964 0 R 965 0 R 966 0 R ] +/Annots [ 1030 0 R 1031 0 R 1032 0 R 1033 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -963 0 obj +1030 0 obj << /Type /Annot /Subtype /Link @@ -13380,7 +14411,7 @@ endobj >> >> endobj -964 0 obj +1031 0 obj << /Type /Annot /Subtype /Link @@ -13395,7 +14426,7 @@ endobj >> >> endobj -965 0 obj +1032 0 obj << /Type /Annot /Subtype /Link @@ -13410,7 +14441,7 @@ endobj >> >> endobj -966 0 obj +1033 0 obj << /Type /Annot /Subtype /Link @@ -13425,971 +14456,14 @@ endobj >> >> endobj -967 0 obj -<< -/Filter /FlateDecode -/Length 804 ->> -stream -xVˊ0 +lٲrb--.r_CmCW'cIGGlT #"{R_ȕg,>Giσe*0D4"+jGu=$yV3VhfJp?w8bj]91CОQb1L4a$3 -l#~t{B[O]΀_śwEFR.MXo -ZH+yTyG2yE|K-S4>Qύ -"HWP}*O͡7q9N+S0Α덑/)u -ΝGj Mrpj RQwElgH߈zNg,B~At*U5S XC?贷1CU(5DV=ЀZF`Φ f^h&Ϣ΂ -endstream -endobj -968 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 967 0 R -/Resources 4 0 R -/Annots [ 969 0 R 970 0 R 971 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -969 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 415.840548 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/StartOfSimulation.png) ->> ->> -endobj -970 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 415.840548 297.637795 400.826148 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/StartOfSimulation.png) ->> ->> -endobj -971 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 254.435748 39.386457 239.421348 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/Stopeed.png) ->> ->> -endobj -972 0 obj -<< -/Filter /FlateDecode -/Length 1019 ->> -stream -xW͎8 )UEIPt0)ZqEEgXlډg:#SG~$%A -':P1]?~wZa~ *$4)# -@K*t?w|^tn"CY2L$gj,G!D W؂9.AX%.{#Ru8JhƪvP$c ڈl Ul }`guϤH`)'#p4ZɄMn KE" Xٟ#y6*VGۍ$ō N6-9$B~ˌTՙݞܲ|yұMoezɾ#tEOh%R6@&INVv=\W7vڕ^t+36<~#ۮm<֯"1jV++e"e - t L˴ߧtYe$]9J5)~ѷݢmLs0-0O%ϐ ު' 'iN6bBgŧAϫuh!#BZEV[/:skAxM:]Q)K]|"MV}h%)˟vp.<H<:I*:A: Z 3P]G0N@}BmRYW ?lL*,[rra)_b= -endstream -endobj -973 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 972 0 R -/Resources 4 0 R -/Annots [ 974 0 R 975 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -974 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 292.136457 339.023622 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/Stopeed.png) ->> ->> -endobj -975 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 339.023622 297.637795 324.009222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/Stopeed.png) ->> ->> -endobj -976 0 obj -<< -/Filter /FlateDecode -/Length 2651 ->> -stream -x[K$7ׯix>^ۘ=tU|YJJTd=<,2%/E|ʒG>`B/Hʈt>_|ʻc4 Ax2,R -S֋5Z Ï> ?Jbetś\iu2X+1?lY -1,{0 jDfBX/|)h_䑈56IЋ$b`-M4p? z<̂ ʈ҇֋q[ i︽g5dU4Kh&vªObpf)bI b݀64+&Y2_?o료]ˋҟ&^J#3uLO7qPҫHK+vic`yg{cI=N=Ol"svѫ/&.^`L?럾I^&iX! Kf1}ҷNP@eE!PCg e=9}Q3})ʗbZdD(}7"/0P5`x4Rh[V%]" (sW9d 5l)Ѭ_jݕ{ ;*{[dƃr.) x!0%\rMaEU@iX ,%YZe}§EU_S3wZ 6;ػstP*@xjspwbLKt, ) -3;=(Q X -v'Y(Ndzʓ-'y=:HqUXϯ ➱+~>!8ͯF )G(qF oہ׀=1> (BctWis75]`"q΀.d*pjc Y k)-T@ eNFiEX@ -s+Pd"Wt1*@-R t<3otb6,Nü{?i>K@&(v2'0BDSDQ`5J]닙ȸIb5SQծ'Ϙ3;_ D4NHZ t64y5>MH`Fy#s6y_5njY7%N3}þo@5(n1j1.%QN8ʒ2 JL`ZX(3eªK龕64)ܳCܼuR"' -YE$>lظP:!LCbb-4QCkֺtzI{Y*E,[2Zߥ,)6{jѼCRQ -}@ҊdVD0kmҶ6Zw,UH!`D -f5!sZ'&#H6g:{?j6LK8n&Gwsa@Mf[K(`pm<q.kb`"f#@[ nmB/NUor^|ݦWq w"7ݕ9[ hUW(+bZzg|~!7"un5ԗ?&922848$# cQwi1X ފn٦na|g"WbPD3K}ڟ=9g~nC[ *k<{Ch68^6&g@'Ьe%8@LRWIIqRlTDc0̀!5F u?4oj8|07 /XpYԵg\ hm[KFX\B޿('@u8 φB<P-3)RgiF*rn߹3fnm =XZ)qױ.pj˜{5ۙLH .8|~O52@\VJ%!o ir!di+j5|38( PӥLN-vˢHLU)m 4#"TPLbiL-tFݏBqb[~ -X!˿zlq5E8bBF6I/O=YV&c)|Xbbqol4 8'>.&cȿ&yH50w>)Ng9Q?yRIMWhfj -endstream -endobj -977 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 976 0 R -/Resources 4 0 R -/Annots [ 978 0 R 979 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -978 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 49.046457 431.488122 70.740793 416.473722 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (https://gitea.parano.ch/Maxluli/TrackTrends) ->> ->> -endobj -979 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 177.979722 39.386457 162.965322 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/EmptySettingsPage.png) ->> ->> -endobj -980 0 obj -<< -/Filter /FlateDecode -/Length 1395 ->> -stream -xXɎ6WB!Hrpr10A9##$@,%yp7Hd-^-"L wfZ|HO^ߧG&qToj-Z?G-> @)a!` -˻>wYQѦ}m2(u!Rϝ )l6L{3lwƃ\.~2/AFgj (?k5o6z+;#|\lAut"XaOϨן$kUyPQhcqn)l"j WcH3/$)g rY.ݷڝzQ:ݔuSMşY#T>elFuaa}g uyOYSeޛ-;/*_n{Mk&Z3g5|Ie+Ș"s=sѶY6AH vgIL86&Q)[~f8`6;em2v3:Zw…&d'ns\/47%;{?qA92 5[xcX`eOkE0Gź/=嗲&Pҽz['3tݏiuXZ:iL]@S-S<{ AsmF!Kgڽ8cyq-w; C}~P4W#vlgE7"n.UI=7 }k=#SƑ܁o\zѨT)-_WYV>$qдZkdIs^nϥ^͌<T.BK#L{A2a(~XGHS֬ky}q@-f>f> g3 d013I=gC^O U0ݸZOW`#V17vS^ʾ\ m^v泾)3lͲ:KS9QVBt?eN*h&+ae1%Y-gt,(&o%ь5| +=Χ]0p㫳r3 -L%UȂh1d @P sk9QqLi/?FF?? -endstream -endobj -981 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 980 0 R -/Resources 4 0 R -/Annots [ 982 0 R 983 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -982 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 431.538294 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/EmptySettingsPage.png) ->> ->> -endobj -983 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 431.538294 297.637795 416.523894 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/EmptySettingsPage.png) ->> ->> -endobj -984 0 obj -<< -/Filter /FlateDecode -/Length 1013 ->> -stream -xW͎6 )ђHI`ECS$@ zH%'&ûD}GGoQyq8|@9%%M?i0N@ޣCA4F5ix33.w#֊0(c>`pV:$P!B\0)5Bk/Gh6;d  /+c6?q{"+$9yߣlzv=+;c/CE߈ދ^=neO}9Cw7XTjC\0Z"*krDcëc֠j:}oH&/9u nĪIA4'/~ ludrkSILjGȫo -ֵݭ+F7n yOzATvz *ׯT|3YnX59 H]>(ޘY'+v02VY)+ąlކ-?5.d+/9ny_9Xyh*gDfmr 4ZJ;3DL?jVp /MJO|YV3Hv3Jᨣ-\qL='R)D-L:q֒l/- >UyJv{Pcs nR;5&K0-k>͖s!LxtDGc-YvV鵑)}ċ?ک9g\yzHd,.':f!O6&II4Y_ΓPa/I%;1xM-,w"(? %mE RW8y -r OTPJS>Z}U)\3rWN>tgNe)Y< -endstream -endobj -985 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 984 0 R -/Resources 4 0 R -/Annots [ 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -986 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 716.596422 39.386457 701.582022 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/SettingsPageWithCmdOpen.png) ->> ->> -endobj -987 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 716.596422 555.889134 573.839444 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/SettingsPageWithCmdOpen.png) ->> ->> -endobj -988 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 573.839444 297.637795 558.825044 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/SettingsPageWithCmdOpen.png) ->> ->> -endobj -989 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 476.245844 39.386457 461.231444 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/SettingsPageWithStartedF1TV.png) ->> ->> -endobj -990 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 476.245844 555.889134 138.918172 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/SettingsPageWithStartedF1TV.png) ->> ->> -endobj -991 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 138.918172 297.637795 123.903772 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/SettingsPageWithStartedF1TV.png) ->> ->> -endobj -992 0 obj -<< -/Filter /FlateDecode -/Length 2130 ->> -stream -xZ[$5~_Q`_iPTddeDE|^|Xe&$TM8Twrn߹DkrZ>>(1o>!)n$2&,ar()5ϧ?Oy1k&8'9mUX>}yB+)]yk([E_>+GZbRNOoo~y7@QnΔrKPAQ:Zk~KY矕6}6陴_^/ץg➉VuZu~Zu>O>=jǛ[%v"E*5 A5_+@\ -}(!^\sn}*{e]SmEY_s2KO؟%9j`Y>'flP j/ -FZ( M{T5UH@:'`πgm94ni.ƊֵR^Vd毅/܅yF։ah*|dL"EulZ"H JVފǬbEX/u =b.#\ I} %R5R*CRhoԺd/ɓj$ CFYހDPt_#ZNxqENg1~.)7 uı*1#XE}'%)ⱟ #J:g%W%u'q_{8 ?&;@I>Cσ#Fqn59qҾ'g/э,I1Oq?e.:Ȟ -p /DB؈Q[Z (Vg+D.a~#0@E}fkFIh?^8f5J*>6񆴆o 9$چᣂ}(b dl mKV@b :}2k& .$zW/wЇjB4IQ PAHXj:z2 -*/4fL抷5R$rtl/~촂")_h->ǽ֓=$p;;|q;T9p53TϘxv/umJ/XCwsݑg&Zc<!UWN>mV rƢ Mr+FAE:tf Ni|_jJh~Kzt?bRNEe:0c)1Dϴ0lI}&6!!%j/F+hrv2$2rZ뿭栩`k5P[%Sp̽V*~&AgDQD@7L0ba6h G5cgCԄpë" HPYȐ򨎮!fFy7*E1]k繗6֜l0+kqgdizX|&z<ȁ{1{!==E?WSgb0!E:(}{+0Y8&S9ƵgAGCZ]vgGe~Д&P 6K r7J ЬFވg A05ρ;DT"a{CM " 5F==PuRh +aUunB%~e{3rk4ϴ:2d/FrrNbpp,[/@c($n09 -hPK* UHثm6IWcKHT>"Az^;Qf4%XI6J=]0JeN70ʉob>Fy`򾯊?Y*˙Iom0)H[ݢU4V2=+E -muz3Qoiԕ>c4Uo2 s(vhlx/0cyyx$,bSed96y~bm -endstream -endobj -993 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 992 0 R -/Resources 4 0 R -/Annots [ 994 0 R 995 0 R 996 0 R 997 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -994 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 331.797222 39.386457 316.782822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/2PointsRemaining.png) ->> ->> -endobj -995 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 331.797222 244.136457 228.297222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/2PointsRemaining.png) ->> ->> -endobj -996 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 228.297222 297.637795 213.282822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/2PointsRemaining.png) ->> ->> -endobj -997 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 106.305222 39.386457 91.290822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/WhereToDrawMainZone.png) ->> ->> -endobj -998 0 obj -<< -/Filter /FlateDecode -/Length 659 ->> -stream -xUMo0Wx[z@p$ae+Zxl[J|ƞ_}E80z[a"RRv%3G@:IS$qߦOϩK!/!ΩZtGtD-vrs,4i5)lts4211_}Pc:90!i2M,#^*׻E>']E fûϷ+PE/B7_v }Xri!Z  5T1H:M5z׎m-U}4Vf[s_&rzc͛aYxZKg>c\'mq,ұ-/ 8yj{up -V @FzDi;N`%fvxۇn6׵>WsXl|] Ɠ/pm㌢ڎ<6E6~E/ y4wA] ۝QOM>y; D%Q{m -c+(Z;Zv}(qCo%hRШz?2%I/+j/B?k_4taoB J -P~Fyu<I;Z܈\77͵NOv~7 -endstream -endobj -999 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 998 0 R -/Resources 4 0 R -/Annots [ 1000 0 R 1001 0 R 1002 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1000 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 447.136976 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/WhereToDrawMainZone.png) ->> ->> -endobj -1001 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 447.136976 297.637795 432.122576 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/WhereToDrawMainZone.png) ->> ->> -endobj -1002 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 349.543376 39.386457 334.528976 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/ForbiddenZone.png) ->> ->> -endobj -1003 0 obj -<< -/Filter /FlateDecode -/Length 919 ->> -stream -xV͎0 )8DZ qΏ[3#b9a<KLJ9RoUb39hbFi 1B2yཌྷa>1{)L y2F[x#o]0x?Us{-zlMEf|!olcyqֵrZS ranߪsӫm92eP 4 q9th 0#l2@VJׁA@U,@Ծ_nĆ [$BKºƟϩ?uZ9lHLnt6_6v-`ߦJsѩd7'Gr`]avkuRY.Q+y3;tRvIOENMow旹jʮrNMxj&]Ev*-} j9*%b)+Lx5u9(`EU+zJk un+]W:!wuZjJj45AiH׵JɋnVTs{"R -rۺ{Tvc\Oe0/]\;yu}4d֠΍!NbzL97$ -endstream -endobj -1004 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1003 0 R -/Resources 4 0 R -/Annots [ 1005 0 R 1006 0 R 1007 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1005 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 447.136976 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/ForbiddenZone.png) ->> ->> -endobj -1006 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 447.136976 297.637795 432.122576 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/ForbiddenZone.png) ->> ->> -endobj -1007 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 295.116176 39.386457 280.101776 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/DriverZones.png) ->> ->> -endobj -1008 0 obj -<< -/Filter /FlateDecode -/Length 1268 ->> -stream -xX͎6 )ꇒ(`0aS@C$b)VNcKH~"KCp`Mx ?~!dK9  :,Cvh>Ll>_9͘7ѕpC}}tpt;\IѤjyźSMʬB4Rؔ:6 [P"G?/C8bS(ş3q_6z|%o[PhC!#X?<_?Z+t?."K"r6Φ4pU]7=Q'.kXuߓQNGy{ymV=8VeM+> ,>""t ž6HIY;)0exo\"4fz k51L6-$FxF|aB^ra;l*| Y%Ц{_jN% -_J%HlDY}Is!k5$pAXmLK&MlPkUBT9 *Y7(_uΟ'XTj6$zmHMhiDq䖉l(:* hM' QUq]pVm$h[ĆykkߢPal=Glnh5齧sBPWcXY9 -D)tN44viB>+V5N9cܴvG{ϠMx\(=l`#f!9Ęc-g1Zd}ǮlU kvO/t]6KB^QZ'wOXKܖ~0`ֲ8,;@`n@o73 -]( *&;IY$+JJJJarO#N+->Bw@y5`@c})B MqsBYDX%T+ΎE\ŞdO -$}|RhRD-'m>{'קM9㕮PoQh] Iof̽$H18zzSAM#nzԄvn>xMv -b@\4D`y7&"~ -e齹?UN$BCr$OtZ4 .˧`7UGӣFBO5 dLA/єֿcX_™ qz-TI`Hdž+NRL<cs~sWYo2;[2 -endstream -endobj -1009 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1008 0 R -/Resources 4 0 R -/Annots [ 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1010 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 444.213703 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/DriverZones.png) ->> ->> -endobj -1011 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 444.213703 297.637795 429.199303 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/DriverZones.png) ->> ->> -endobj -1012 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 213.367303 39.386457 198.352903 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/DriverZone.png) ->> ->> -endobj -1013 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 213.367303 555.889134 173.636328 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/DriverZone.png) ->> ->> -endobj -1014 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 173.636328 297.637795 158.621928 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/DriverZone.png) ->> ->> -endobj -1015 0 obj -<< -/Filter /FlateDecode -/Length 1631 ->> -stream -xYێ#5}W|)_Q$ E!z: %n]3ѐ2i.vF/o>8kCWA;*g`^08酔4=Z|!һp R*%P1Cvf*?ibA~I[ix!%SE&y[]3}\Nkvy'G[!PV`LϧYe?E>Oj}x4¨J)1Vx@z7^T1u D X%D=jpmO ʸBG Kix>Lvj -ѨE@mWcU}Rle_nl*9Ɯ>oZK19(!d?Tg^tՓd>xIJUJT`=gv-1B{2#/m<ƿgKR8n X`x4lFI\]"1w/5F7髃2n 7\-29rJqbo˯j\ LZްq]wtB)t̬º4! -i,wAF N_YcZ~nƟOJ<83>=[!*+ύ0P@y1ZXVr 49p7V?O(:?+-̂4nUIukͯoO+dyz 3]-LH)[f<E ZŒs$­_k2/.mV*k2I;ATOʶ8TAJMZ+8bR& bkUnZGy#,? 82`5*p`VÚV-1R(i&X -νGY ]ߣ[1]>7Tݕ=v9}M;v`_S^ׂ!KRSre(tiӔeWm_RWq^=7?m9;r({䅙b4] i-E#]Qm 9\N޻H)4Zc\?s.M= ףѫof滋ooFooFooFo[ė@ `](a)Z 8zS2Wz2_iJvΫ ];ŷik aע/T{IEV rX(cbh~CoE1t_L#jnJr3T 1];5 -endstream -endobj -1016 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1015 0 R -/Resources 4 0 R -/Annots [ 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1017 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 731.610822 39.386457 716.596422 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/9WindowsRemaining.png) ->> ->> -endobj -1018 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 731.610822 254.636457 645.360822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/9WindowsRemaining.png) ->> ->> -endobj -1019 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 645.360822 297.637795 630.346422 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/9WindowsRemaining.png) ->> ->> -endobj -1020 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 498.970422 39.386457 483.956022 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/Windows.png) ->> ->> -endobj -1021 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 498.970422 555.889134 457.610502 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/Windows.png) ->> ->> -endobj -1022 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 457.610502 297.637795 442.596102 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/Windows.png) ->> ->> -endobj -1023 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 93.456102 39.386457 78.441702 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/DriverListControls.png) ->> ->> -endobj -1024 0 obj -<< -/Filter /FlateDecode -/Length 1073 ->> -stream -xWˮ#5+T.?@b`3RHE߄X%jw';DI:~T: 7_ -!zg_O'P_yOO'㕏[U6 q"hÃ(ƀ_>q)(_VJ+pIOVT|tcEExS2)5@q9Z V'̪W ȢjZ[\'#*Lde:Mt*hkQ`rf ?_0Ӊ?ߗ!BWE2,Ee@W7 ȟy2漏n:uYŲ6c2ޟ7d6}LYfMwGu)CȞqW@X7`(Ȁi_Ě[gС֥EU 7,ؒOa@Jem(1Y^(Kc42ޫۃs ;f8wo."uͿ=y4,D=#ħ=A.>5)n'^jq0h}]G8jbxg7sQA^U GdO[.S^{Dt\mD_H01LFIJJ nOPwufCƣ;F8ȇ\pJQEI^UNNtG M{XqQ;; -y-jay cˠmv e}+tY(qqSl38-odr!/s rӎSs[/ɒ~]#П2.RRϠ,l}P"׊1㳈9C=zq<=r4VB;pvK}\=XEA+-hNfčQfhi&SEU%{3^ߟs/:$ -ɭS{-Sh4e#-;u)JAzR7Dn -EP:,kR|j:cඐ[Onu[K/ߍ-bhՕv';7ȭbRWr4ps,̽]D -endstream -endobj -1025 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1024 0 R -/Resources 4 0 R -/Annots [ 1026 0 R 1027 0 R 1028 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1026 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 280.136457 525.023622 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/DriverListControls.png) ->> ->> -endobj -1027 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 525.023622 297.637795 510.009222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/DriverListControls.png) ->> ->> -endobj -1028 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 299.807622 39.386457 284.793222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/SettingsReady.png) ->> ->> -endobj -1029 0 obj -<< -/Filter /FlateDecode -/Length 1629 ->> -stream -xYۊ7}gC䪖JXacBmqԒj{YvwFj~48|Tgppxh>7rFg`}zA ozrλqa8ğOO`xa歖ǚ'q𼭶`>(Jʈ?a|nXMƁ2ʺdب!<à)n4v?Kf/ -x# ſ"7:^)~'}=93MpRpWc9M4|wϜIPV6 'Vy@߲p;뗿0j;FO>>ܿZDpfi,"=͹9^?0s_'O||O3rĈU"ˤ k7;Y152ϗqsͲX6sq*oZ}$]=8dI氏-NBƸ-pe%H(Af lilM6;Έ&S#B`W1[Q0R|?fvG;R\>3f{Bo X"s~ -){* -}v Įo{BT}EgfÝ2B(U0{Ai.s\_:\rWsW+/MžMu;WMNN]2~Tk3kj!ooU7=6xf3*_Ⱥ,H`VI%L$ +3u_>7@!f3F/(O5s ĭQqF`2(quQeil唽* -\+RIKB?PvS_ -L#yKrp)_Y#̎v98떱7+v~$oҙ:6"#yeV "-:U2M -i]۱Hy[[mbLݖތ2n{ =%-.eQ)yK[()sZS*p-d%iqfVFm/ni.l{V +zx7jҼ{^HD -zgMw挭 l:W6>/ـȰ30-O=6GKwZu9tðs#?{2JtP\)DgȾ#|E6{Q! o -z -m%kI]P .>7EwI|rKϪȽj-Xb"vÑ4TO!k2E@;aÚRHD[%m=CІ>9!jR,ŭw/eAr0 =j$ I8Qu*c%%PհC tfɣF WyhfIK>hxdg:woNPu <^o \"PEf}{w!Sk}#Dw -ց9 -9fٹc>a`X?/GV5>Jm]j)xg-B媡0+ǰ bFBAw_QA.Y}Q̞]c ݒ11unͿN -endstream -endobj -1030 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1029 0 R -/Resources 4 0 R -/Annots [ 1031 0 R 1032 0 R 1033 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1031 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 435.005256 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/SettingsReady.png) ->> ->> -endobj -1032 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 435.005256 297.637795 419.990856 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/SettingsReady.png) ->> ->> -endobj -1033 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 92.293656 39.386457 77.279256 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/LoadedPreset.png) ->> ->> -endobj 1034 0 obj << /Filter /FlateDecode -/Length 986 +/Length 805 >> stream -xWM79PeFҌ$x19$=4~ -MK}ʊ@j5g>Er}gO hO qoX}$YE]4"+jrւWwKZф%Tay*# %QL747Rw/澆3CakCWC, ŗmpcl.swl'ҹ9shP[֭1D@/O_yrpZWphi۰?hñbu )" -:_k I>8^ߟd`]J(-Ii!+H1Jb02R$$͒+e4灟$LږnD3H0kk u㮝˸s[]u~w%D-dTÝ;MwakNt7Y/V<56Ou~P:Cp~[E+KR7߿%Ӂd/]D1Pl `Л8IT5)7}3Ii|")9Oz4=s3%xt?r$6K>bzHgSSO5j }!o>$} +xVKo1 ϯhj'NH= PTZ08jk&/U;N&ϟ'@;@CI~ hv b=5GgثHBcЈ` ZY ^9ZX!F\Z*=/O(qIĨA{F(3Yӌb`v|t*';8pt !l?t!+;Z|om*aFI`4O6b˧=(LhM"}sc?S!1CRIGTT0#4[.4/h,},uIJwږ{u g6#lWC(*Pz+(cs\]dq_C:\gkgiWu.%*)0uct'lwu :q1+X<'-%mT=uUsXB7N$Z;J~CȠ,X5廏TS|sDFszcKJs' cJ57Ձ |m#rc@_ +UkFJE|l{]: SmjIWmӲq?ct}8v8h-^tY͉_}gH&u윩d2yvZp6k4hr N砏b@3mS}(ӻ"6Wʳ oDi=;tJ6~rc!}*UT@淀B}[iocHPjܭz۵Hv6_5F;6??c endstream endobj 1035 0 obj @@ -14408,14 +14482,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 434.019371 ] +/Rect [ 39.386457 771.023622 555.889134 415.840548 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/LoadedPreset.png) +/URI (./Images/Manual/StartOfSimulation.png) >> >> endobj @@ -14423,14 +14497,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 434.019371 297.637795 419.004971 ] +/Rect [ 297.637795 415.840548 297.637795 400.826148 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/LoadedPreset.png) +/URI (./Images/Manual/StartOfSimulation.png) >> >> endobj @@ -14438,31 +14512,28 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 252.275471 39.386457 237.261071 ] +/Rect [ 39.386457 254.435748 39.386457 239.421348 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/Simulation.png) +/URI (./Images/Manual/Stopeed.png) >> >> endobj 1039 0 obj << /Filter /FlateDecode -/Length 1132 +/Length 1017 >> stream -xWM6W4,9)4%)w -IKɒ-{]zޑ49;PǏݧN+Z4c' Sg>8嘁C6V*tjuo?֞}`Bg@(ݿD,jh -Cmd#LE! -R>55` idQrh&eVϒٕu;S+YBߙʎbɏ^S<*KhT-L)ZNY^5?k0Wa.8܀8 dngJŹZIߞ.RG6b6)l"^|:OݯOaOW+ Aٞ7hgiKg#y{0A;?dm g?:yWߔ"M" 439y95uYLY?cXr;#(cI%s֐$q"IψA BQt{rkTo& yC[ ٻo3\sS -yR|^R -=PP5\8b#5ng6&Xյ!NXDcZ嚶YZ|e\0¯9[*T0qs*-U6Vj`DPA%vN] -$RN*[P^/1 ͸C*K)bU(A=Td1D\! c"IJ+a@9!jlK VL|('fV)^dմF jJaMÌto#@3,P.+о97-c6*TôMK(k[Ӛ%{JuG·{4ew.ckf[r6ZX|^tn"CY2L$gj,G!D W؂9.AX%.{#Ru8JhƪvP$c ڈl Ul }`guϤH`)'#p4ZɄMn KE" Xٟ#y6*VGۍ$ō N6-9$B~ˌTՙݞܲ|yұMoezɾ#tEOh%R6@&INVv=\W7vڕ^t+36<~#ۮm<֯"1jV++e"e + t L˴ߧtYe$]9J5)~ѷݢmLs0-0O%ϐ ު' 'iN6bBgŧAϫuh!#BZEV[/:skAxM:]Q)K]|"MV}h%)˟vp.<H<:I*:A: Z 3P]+ "P꘭*oṠ ʀκ`lx(ecRa$Sc~ w/=x endstream endobj 1040 0 obj @@ -14472,7 +14543,7 @@ endobj /MediaBox [ 0 0 595.275591 841.889764 ] /Contents 1039 0 R /Resources 4 0 R -/Annots [ 1041 0 R 1042 0 R 1043 0 R ] +/Annots [ 1041 0 R 1042 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> @@ -14481,14 +14552,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 414.499650 ] +/Rect [ 39.386457 771.023622 292.136457 339.023622 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/Simulation.png) +/URI (./Images/Manual/Stopeed.png) >> >> endobj @@ -14496,208 +14567,213 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 414.499650 297.637795 399.485250 ] +/Rect [ 297.637795 339.023622 297.637795 324.009222 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/Simulation.png) +/URI (./Images/Manual/Stopeed.png) >> >> endobj 1043 0 obj << +/Filter /FlateDecode +/Length 2651 +>> +stream +x[K$7ׯix>^ۘ=tU|YJJTd=<,2%/E|ʒG>`B/Hʈt>_|ʻc4 Ax2,R +S֋5Z Ï> ?Jbetś\iu2X+1?lY +1,{0 jDfBX/|)h_䑈56IЋ$b`-M4p? z<̂ ʈ҇֋q[ i︽g5dU4Kh&vªObpf)bI b݀64+&Y2_?o료]ˋҟ&^J#3uLO7qPҫHK+vic`yg{cI=N=Ol"svѫ/&.^`L?럾I^&iX! Kf1}ҷNP@eE!PCg e=9}Q3})ʗbZdD(}7"/0P5`x4Rh[V%]" (sW9d 5l)Ѭ_jݕ{ ;*{[dƃr.) x!0%\rMaEU@iX ,%YZe}§EU_S3wZ 6;ػstP*@xjspwbLKt, ) +3;=(Q X +v'Y(Ndzʓ-'y=:HqUXϯ ➱+~>!8ͯF )G(qF oہ׀=1> (BctWis75]`"q΀.d*pjc Y k)-T@ eNFiEX@ +s+Pd"Wt1*@-R t<3otb6,Nü{?i>K@&(v2'0BDSDQ`5J]닙ȸIb5SQծ'Ϙ3;_ D4NHZ t64y5>MH`Fy#s6y_5njY7%N3}þo@5(n1j1.%QN8ʒ2 JL`ZX(3eªK龕64)ܳCܼuR"' +YE$>lظP:!LCbb-4QCkֺtzI{Y*E,[2Zߥ,)6{jѼCRQ +}@ҊdVD0kmҶ6Zw,UH!`D +f5!sZ'&#H6g:{?j6LK8n&Gwsa@Mf[K(`pm<q.kb`"f#@[ nmB/NUor^|ݦWq w"7ݕ9[ hUW(+bZzg|~!7"un5ԗ?&922848$# cQwi1X ފn٦na|g"WbPD3K}ڟ=9g~nC[ *k<{Ch68^6&g@'Ьe%8@LRWIIqRlTDc0̀!5F u?4oj8|07 /XpYԵg\ hm[KFX\B޿('@u8 φB<P-3)RgiF*rn߹3fnm =XZ)qױ.pj˜{5ۙLH .8|~O52@\VJ%!o ir!di+j5|38( PӥLN-vˢHLU)m 4#"TPLbiL-tFݏBqb[~ -X!˿zlq5E8bBF6I/O=YV&c)|Xbbqol43je՜@OA 0o2IR  ̝O/rYNqTO޿}Ri7Z?!{ +endstream +endobj +1044 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1043 0 R +/Resources 4 0 R +/Annots [ 1045 0 R 1046 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1045 0 obj +<< /Type /Annot /Subtype /Link -/Rect [ 39.386457 179.618850 39.386457 164.604450 ] +/Rect [ 49.046457 431.488122 70.740793 416.473722 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/LastFiveLAps.png) +/URI (https://gitea.parano.ch/Maxluli/TrackTrends) >> >> endobj -1044 0 obj -<< -/Filter /FlateDecode -/Length 1395 ->> -stream -xXY7~_φȥt2q vyio@`CJjUt8Kf؝nu|uJr~#7Rx5!'h^[|N!a> Nz!%(MZ 4Z<:.hwJ z+_>^?ͬב#J5xbtH* Æle߽ 1B4g%Ŕ&@He1>Cv%]^ ڨL6d>Y9n_qw#O[#>h>k9ѓp f$w-yVx`(/?y `*8~{}}x|]I($s#Gk&V1(G*4ϧ08Žr9z4%q촳(#0UUNe!b.+:UҸdrXVAѪO9XEVƊE4^?ӋӫxSGm`u:׽ /qv1*s) kcS =i,Lc`zb59L;~btY\r= 0|F -_D f|~NqT$g!km{20j[ %LY?>El4SaωP-s>j9䋖Afъ%;Tki fM͂Nyf u[0@"C2TCX72>0.aVP:yqY s#r3L_VTW]yZ) lEjuU>%A_B3 p>Xi:GgyM;  -2+zjNz=Ṷ.uh˜K׺G 64^Rh2EuӨȨ)tnlQK$QBxj3Y #ԾuyVk'WZa=m#V[-Ȃt9G;v(/!ɷ4wdeZ㘼hx*TgsdL7{ hyZJqV+-PAg-rF9(iJK~ӛ_ Ʉ`Xh(DkMqFm΄س#ddTоa>8q-&'?<;r tzڀtAz0=_#ڹ5>fT%㻜n$J)uN:x$Pn)Aq0 F7 90Z|4H`|REyJ-[CmUb\J` -endstream -endobj -1045 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1044 0 R -/Resources 4 0 R -/Annots [ 1046 0 R 1047 0 R 1048 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj 1046 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 550.886457 514.523622 ] +/Rect [ 39.386457 177.979722 39.386457 162.965322 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/LastFiveLAps.png) +/URI (./Images/Manual/EmptySettingsPage.png) >> >> endobj 1047 0 obj << -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 514.523622 297.637795 499.509222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/LastFiveLAps.png) ->> ->> -endobj -1048 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 207.526422 39.386457 192.512022 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/Battles.png) ->> ->> -endobj -1049 0 obj -<< /Filter /FlateDecode -/Length 1415 +/Length 1395 >> stream -xXۊ7}gCde !@ 318CJjTnή]vgZ*Ino"蝙ΟRx+'Kty-}>h/|ʻ)aB'AHqPkaO_>:>jOJ $`J_>^ ZjBZZ~:شUÆ솕4߽@lByRyl3D}9#GG':I{P!3 $`*9v_5Bq -#she,n>?1]ƤO_]yNsfKטK#9BK<Q re/`4mɥ*k|p)h6\ i^0Yu`aib$kW KXd+r&yj 6NuT>NQesUs$΀Ϫ(# b8O3DcY|(pzp`~(WpY{sey2+f0F؁xQeEF;12:1$;zz&nF^QLjҚߣuK2G\(Y~ܞP! Vײ׭{:NDI+9fҺכU]a2`DX~7? ;ZX.Dms&43khF+rm G &0\3Aŧ \k9VgJ7}Q/IZx_%:7"Ɣ[D]$Qyno-smScI.CLti@"UG밃. -^T!P.J .bҭvc:ӱ4t -!h35G&os +xXK4]~H> pYiHC:=Yq]v'ٙv+3\ϯ6L2~gʹ}t¡Lȯ?E;*g`|x hnr%wA 'nPJ 1Q?^ mӒA^XҐPjô0Vg0R˛^`~߂ZѮրrVf7gecFk.D`GЂ0qsϿ *9yo=cHcXD"Sǀi}5#4s|;vo#i Uot9x0Z[zADq W&43Y%(4 +o=:ؔt~の3of +]^Sh*{vgeYˍ_2>?NӚ @k'~iv5_Cg^xR=Gcl=la<-sZvI 1߼pL)SpLq7mx,-Pxt~7ꂅ&d'‹nsb3K/46%;FAbr83xeԌ~)ͣNʞOo`.vыu]Zs+kp嗲$Pҳz,e:ak)pf-2YesG:+Wk:(JelV(l=GkdxaP9>;[/\SudӋUǡ-Vy ` 'U5 ǡCi^rgmd]t6x8|г~5L:'9 +olqlH@棝!aqL \QQ: NKKGVV8됓'cT/x!҃p^0~rDP\{uD^^wĝgG^Q!K>TY* ȧ(hA nDؠQuþa@$P)zT F6|;>0ԵFMtN*{lͲ&\Z&M:ԫ0>Q_ʅorizہi H m.O3hj1o`ͺWoT1țXXB;63`Bduʷ >jmkΆq^O U0ݸZOWqЃcFAt17vS^ʾ\ mNv泾)3lͲ:%S9Q(!h ?eV*ah&,e!ե2[@XP;Mw%ь5| +-֥y7㪱rS +fh6Z.PVo] +tTIչh +G endstream endobj -1050 0 obj +1048 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1049 0 R +/Contents 1047 0 R /Resources 4 0 R -/Annots [ 1051 0 R 1052 0 R 1053 0 R ] +/Annots [ 1049 0 R 1050 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1051 0 obj +1049 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 553.136457 574.523622 ] +/Rect [ 39.386457 771.023622 555.889134 431.538294 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/Battles.png) +/URI (./Images/Manual/EmptySettingsPage.png) >> >> endobj -1052 0 obj +1050 0 obj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 574.523622 297.637795 559.509222 ] +/Rect [ 297.637795 431.538294 297.637795 416.523894 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/Battles.png) +/URI (./Images/Manual/EmptySettingsPage.png) >> >> endobj +1051 0 obj +<< +/Filter /FlateDecode +/Length 1013 +>> +stream +xW͎6 )ђHI`ECS$@ zH%'&ûD}GGoQyq8|@9%%M?i0N@ޣCA4F5ix33.w#֊0(c>`pV:$P!B\0)5Bk/Gh6;d  /+c6?q{"+$9yߣlzv=+;c/CE߈ދ^=neO}9Cw7XTjC\0Z"*krDcëc֠j:}oH&/9u nĪIA4'/~ ludrkSILjGȫo +ֵݭ+F7n yOzATvz *ׯT|3YnX59 H]>(ޘY'+v02VY)+ąlކ-?5.d+/9ny_9Xyh*gDfmr 4ZJ;3DL?jVp /MJO|YV3Hv3Jᨣ-\qL='R)D-L:q֒l/- >UyJv{Pcs nR;5&K0-k>͖s!LxtDGc-YvV鵑)}ċ?ک9g\yzHd,.':f!O6&II4Y_ΓPa/I%;1xM-,w"(? %m6E8f< 9da'*()A*}Cq+'s21p +endstream +endobj +1052 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1051 0 R +/Resources 4 0 R +/Annots [ 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj 1053 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 267.526422 39.386457 252.512022 ] +/Rect [ 39.386457 716.596422 39.386457 701.582022 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/DriverInfos.png) +/URI (./Images/Manual/SettingsPageWithCmdOpen.png) >> >> endobj 1054 0 obj << -/Filter /FlateDecode -/Length 1026 +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 716.596422 555.889134 573.839444 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/SettingsPageWithCmdOpen.png) +>> >> -stream -xW6 WHIbACS@у9&%[g6iص-K#ߣLcr/z41>=͍>~ &$䍏cFɠssNy}HCh!L).?h4zP^s1ԡ5]u -[ 5f1=1؁#x_iK?di0`$V`&;oф~?>tڜtA.1l,KS6&tfә\(Џrcs.<'9u3?hɸY>%<x6S1lg &tQ`TBYW Kyl3?m|9xĻzV#}NkP͜qZ 7`/b!e(Ϧ+Y}bc!}VYD'#ynÊUmriq~Xbl@05+(Mk`t#L87]SVT3CY_w%jtkVP5ΒE08B>MBZ*(CYD$" RbaUx_zyo}x -{alpݭjei|eS/Qhqy!㺟ݞ3iInߠ`#ײPdvq JtUr?]6]{k,Fx5s 4 -t6YS - uB޿JҫTǯot1EK vMRxXnTXȣ?n$obVyC@2t9r.Zx,dz~5H;/6m[r9Nx R$=*CJXΥtmmIڞVáܠNCIQ4.3F>cD]K+/bܟsh_>j1k頀ǯU}l -endstream endobj 1055 0 obj << -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1054 0 R -/Resources 4 0 R -/Annots [ 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 573.839444 297.637795 558.825044 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/SettingsPageWithCmdOpen.png) +>> >> endobj 1056 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 536.316565 ] +/Rect [ 39.386457 476.245844 39.386457 461.231444 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/DriverInfos.png) +/URI (./Images/Manual/SettingsPageWithStartedF1TV.png) >> >> endobj @@ -14705,14 +14781,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 536.316565 297.637795 521.302165 ] +/Rect [ 39.386457 476.245844 555.889134 138.918172 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/DriverInfos.png) +/URI (./Images/Manual/SettingsPageWithStartedF1TV.png) >> >> endobj @@ -14720,193 +14796,188 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 359.897365 39.386457 344.882965 ] +/Rect [ 297.637795 138.918172 297.637795 123.903772 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/LapInfos.png) +/URI (./Images/Manual/SettingsPageWithStartedF1TV.png) >> >> endobj 1059 0 obj << -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 359.897365 236.636457 149.147365 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/LapInfos.png) ->> ->> -endobj -1060 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 149.147365 297.637795 134.132965 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Manual/LapInfos.png) ->> ->> -endobj -1061 0 obj -<< /Filter /FlateDecode -/Length 509 +/Length 2131 >> stream -xTQk0 ~sd[ G``n=z} \d73IH}%Gd/M%K{r0c3yr1C. IC4c)Fݻ!#f͞(`*\g]m ?rhjِ2SxmRʜL* cf^ -^!BAe.Ib͟V/(`F0w4L%j ?/o>~ iط?D]tlgè)H*R=)CJ?8T[ˤێTZA$nЌ94=mBvB*A`;1[&Rb9yLOo?q),tia8a.="w!TliRoW~\o+6M"@R[~a#:MX]?5JJEuWZح0u# -h$frތ'U|w<5 +xZ[$5~_Q`_iPTddeDE|^|Xe&$TM8tWrn߹DkrZ>>(1o>!)n$2&,ar/ +AӟqJ5cŜ*`SvfN><<5-/N ъ#F-Z)?}7Xǃ(ogJTyvT(Yn.VI?+mn3ip]/ץg➉VuZugֽOh1v}zxՎ7KVDEȋUX)kAjY$b~ ׁ*kQCJs뽸 2Ϫ s_ʞRwh-:XV~,1-U90cjoPx1hV0:Gahb,ݣ1B"09{H~(sA Uy!Z5hFTވ:A2=[!r #_a]}`'YrtxK(Cؐ5hR +A$,1޷-[f12p®чvÛ72Pk^ANت $aG%@!a@(|,Д3M+(K߇RP˝ұ_x +<_TxZ|Etf[OzT3bxP93]ԀP=c:F۽@engz* OxASQ{# +Q$2.8{*y-ީzQNN*+$BX&AWi|[O)a] 9XΗ'əJ{mM_A\Qc9Z҃/aY&%q(qh.ƜNl#f + ߜ;up<:yj b!%TyGA:v>A05ρ;DT"a{CM " 5F==PuRh +aUunB%~e{3rk4ϴ:2d/FrrNbpp,[/@c($n09 +hPK* UHثm6IWcKHT>"Az^;Qf4%XI6J=]0JeN7c{a=}"(}_ ɳT3&*`SEUhRDezV$ڄfN[+Y}*dai*( s$|&} jΆ>F1^1h1}WWL+&<p\VAcjb endstream endobj -1062 0 obj +1060 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1061 0 R +/Contents 1059 0 R /Resources 4 0 R -/Annots [ 1063 0 R ] +/Annots [ 1061 0 R 1062 0 R 1063 0 R 1064 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj +1061 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 331.797222 39.386457 316.782822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/2PointsRemaining.png) +>> +>> +endobj +1062 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 331.797222 244.136457 228.297222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/2PointsRemaining.png) +>> +>> +endobj 1063 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 743.669622 39.386457 728.655222 ] +/Rect [ 297.637795 228.297222 297.637795 213.282822 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/LiveRanking.png) +/URI (./Images/Manual/2PointsRemaining.png) >> >> endobj 1064 0 obj << -/Filter /FlateDecode -/Length 373 ->> -stream -xN1 'ڦB%%XQvib͵7^z 燏e1gJc]d#Y<~D;t -x k)GÄrH2d]ܒW7g&#p;@> (տA̫ɩ]|m{e$mGCBK@~1J-IZ{b x Ls_cd^Z^Nb\u݇ ;kTi -endstream -endobj -1065 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1064 0 R -/Resources 4 0 R -/Annots [ 1066 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1066 0 obj -<< /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 327.386457 84.023622 ] +/Rect [ 39.386457 106.305222 39.386457 91.290822 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/LiveRanking.png) +/URI (./Images/Manual/WhereToDrawMainZone.png) >> >> endobj -1067 0 obj +1065 0 obj << /Filter /FlateDecode -/Length 2136 +/Length 658 >> stream -xZK7ϯ!^, ;6!03%IJjikVn9-s8O9Iÿ;e Yf9bcBpEh]}}[:!%ፃxXϻ9ZE_4@EqͤQĩ2?eU/7^53"瘱0i!A7;rsp53|%4 -~N9 n -yR0\yi<~ٽoo>]DHƩϻ<#! G~:1G - 8I: ,c;Pc5;}gPN]y>7? tRz)Yk 4-쑃Rmd%_˪~EIZċ);_% eG"@0Pȉ҉XIZs(HiNa$'DSz Dr!N]14UN$CCz &"4͂m00~"N5-.B{GlA> h* Zgr -AJis $\0)ojTx1 BC,Q"$efVˈ6_+5:f2f;Ɖ4 `Rx/%8v6J -1yDݫ2^މ/Y{ԫv`62f`12KChǦާ)4 qO80$rs)7J!V+o9>yV *@ŁeݒxV -G=a-26[{05k"~׃(ZӗއFwJ7yыF͐#OBI#eja-ǣ -F,ۙIy(dJI& XZ,]Q~ﺧY4v:RSi|hVޠo>T_EX'Z$CR::#7w:~iR_Ȉ0{HQOj$L(lԱ -*Fdp!?'e,Ngc Sf-f.Y42S>!kmOT|6\8I NS9_P4[A搌U}VUecաzAy`@QԲDenuvm'”*ݴsStۺwчty]wt,q/ZgNp>3rz%W^ŷU_D"!X\67 W֧ۍ,n^\|K^^|C^\|_^|S8P&~ߨx'W!!>J?6afI68Y)cWrV#i'839(qJH3G(h<0YFCsQСb02(6 -0-` B0 +xUMo0Wx[z@p$ae+Zxl[J|ƞ_}E80z[a"RRv%3G@:IS$qߦOϩK!/!ΩZtGtD-vrs,4i5)lts4211_}Pc:90!i2M,#^*׻E>']E fûϷ+PE/B7_v }Xri!Z  5T1H:M5z׎m-U}4Vf[s_&rzc͛aYxZKg>c\'mq,ұ-/ 8yj{up +V @FzDi;N`%fvxۇn6׵>WsXl|] Ɠ/pm㌢ڎ<6E6~E/ y4wA] ۝QOM>y; D%Q{m +c+(Z;Zv}(qCo%hRШz?2%I/+j/BE݋/:G}@.3\?NUF +y(M3vLCnYo+';9O4 endstream endobj -1068 0 obj +1066 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1067 0 R +/Contents 1065 0 R /Resources 4 0 R -/Annots [ 1069 0 R ] +/Annots [ 1067 0 R 1068 0 R 1069 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj +1067 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 447.136976 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/WhereToDrawMainZone.png) +>> +>> +endobj +1068 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 447.136976 297.637795 432.122576 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/WhereToDrawMainZone.png) +>> +>> +endobj 1069 0 obj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 771.023622 297.637795 756.009222 ] +/Rect [ 39.386457 349.543376 39.386457 334.528976 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Manual/LiveRanking.png) +/URI (./Images/Manual/ForbiddenZone.png) >> >> endobj 1070 0 obj << /Filter /FlateDecode -/Length 4160 +/Length 920 >> stream -x\]o|ׯг=A@HK ȃ$rR%]N:; v^j=C~>wגOZ㇛oloؽw ?:՞C-=M5oz-Dlq)F?7|qf[콴L O?|q't=zSq7 6m(o?30,3TL,b!Qlf8 V'+Ww˶ywa% -t}7 uuvm0)Bሓ\8nwC62l8쳩w\`xބIIŅIIHMS„p-a Z1k&k(pEjQnI8nt%Fުp@#\.А0)41EEn0քzI(4۳+ҝpSP;Ɛ܈7D@$ #SH[*ՁM.ZɒSrܝSIK.&("W=5;R-+_ '\|.C"S-]r2ƂE$f.H]a"{"@6ČVHČ|,g`.-JT@^JIYpYHS 1ܔ/ -1/ -1{* 1[!|)*CRn+_@0-)_@RFC^j!l1'sFѲC -`&SY(@5/(L;UNd *_P1@]"POa@L!+q\/u0Yq@(:[ܩ$|&|H Aab%w`]r"f `ޕ/ՋNf;u0u0@/WqHDZܩCɝ:8ʆclA8Dr"$w`04J&Y:α8"IKAOSzA:言/(p$w -7ɝ:+_P+`ZHA&ST6 y7 aVqHDHACD+A8!f\A(N4:{4+P4E"M"lrQܣ3Qh,+bUqGW=:1# _D @T6e8IAHe@!fdŝ|-|E$ftڣ97٢di/kΒ{"ft{"XL"3P"0U:KU: â|D2;t0%B̩wB{%fTъ{%fGlP(`F˘TBYbK;tj6喲!ft`{'fDމu0{l%8^DL*:jU3:W$`MqOA4̊{!T:FE!$ -q8ND$S!jJ=Q&lN,SjZ=Q1j1!QaVu.SQHhYͫ' e(~%w zɝ:~l9u0@UR+eCA.!%`u0XWk -:$wwܩLͫ'WWk -:pC :+ɝ:h/HTzjM!QͰNDfܩ֓WOAkY)$ꠡSܩr%wꠡ\bF|AރC꠵.SNjj^PZSAˮW%W+uWA~6dyTk -:h -ޣޒWA55ɉLCy95^1Ǣj fpb*Gb6TzS8 lZSk -:v: W"j^ꁃ<8 I#m}~ -* :~;?pzjG7[`1;8ۧ1vQ'ȱpOt۷_ogmqbksV ;:A{r'IHπRvtc>ǣS<=s|* >_?#>ry0Dx,~^Qc4^r:zgKN7ͩ^v0xd1Gol9{ ۗc̑UOՈ njX1Eįϵ!'v9o ٧m:/Q5:Dр;6+Wpm\ȶQծtpҐ&EgLιoMe=!@wQW yuxqW#Jy 'G J /6^G6w$]2ϞHv%/=X|'. ֿrvMe/>>l?71׋NwDY̳|+ U(ۇ3rk+o86!"Ӎp-7*wϼ C8?Hxy}y[Wpy~:~Pls_m|˵rZ ;=|h|W_F-!s]ʥ5͹ٮ`>3eWh2ւJolMT؞zY+Dߧmm\t6h[/mdi]O*fT!KOdKA }IXj ,ˏPr* v¥l=ck,8NV;u\Y%3v̧*ie8EF)B{k ,$ LF >Z0!Xo_Z}9eW&gl?0i0c!rky!.GwɐĻW]T\9vy'2 P \6pIXg.~;׫?!'朣>_ =;?ZS=L$\j8_LQ[uH!lsw{YjaJQ%ˑ#^vyBš:>:̲.}:yGe.cՕz5 c*|GKRaw -3%$Xay5t~ 8#A;mV8 ~cX&b͢K8( +xV͎0 )8DZ qΏ[3#bƱ}vhyr0N߆5-fRsČ.Ҙ )Acd{{ǧ}(c&ZS3 ex~c/ 5Se(d(V3L F 㵍]P*ϿqrH`dGGxt_N7*k+yq0>Ih}#ca> @@ -14925,304 +14996,322 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 153.835026 39.386457 138.820626 ] +/Rect [ 39.386457 771.023622 555.889134 447.136976 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/MkdocsExample.png) +/URI (./Images/Manual/ForbiddenZone.png) >> >> endobj 1073 0 obj << -/Filter /FlateDecode -/Length 4056 +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 447.136976 297.637795 432.122576 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/ForbiddenZone.png) +>> >> -stream -x\ˎ$WY[I2l>H>Xa3cpDu=X=UvRwU6Lf$ɮyk˿~zk͆?t{)k9r~B5 SfOO?<牟=]YmBzi¿?[{zEGHC9D4կ\OMM`]n]+3f}WZ:4 @I6ccj;kѮ1#ȱ][?pٵw8tr9L<&L -LRsnn~nR & -5G0\kfaV"]JQ+Z zuJ*ҕpcSVZ 3 BS1-7SZ&%$&" ף" 7,xc2C؄"ܰx]֘ -/ ?æ ܀ %ً O@̩49$r-T=5=3d!+_ ;)_$`K k{rXTHČԥ|CPqĜ)_81c// &➁$C𼀼K|sL =gɽsMs,Qs(Ua!f;s;sC}l9>\n;ϑ}$JT aӈ-(_4bNURs4ɝ -JFqR/|AdBTܩ̊;e|AuH:HHtDHt+A"R*v=RS+;u0:Jm:EF Pr%w jVлu0zQܩLrF@VFHu0TRV%w PrF!攚uܩ4ɝ: %e̡|Aʱ8"IKAOS\u0Rܩ($w -Ү|A ֓uj!SNfȻ)_PC Gr"ZqZBʆ1/Pnɝ:hH?;t0iV66 +Be`Ssq4w(X,&=1HF eeC̱*H߰ UqO…/t05,e/t\7ъIAHeHY3}䞈|+PDƍUa̵'=qo%:&)_@S-X+`9KN̸;1b1C*31[ܡZ/ ˝|dyX/H]r^{W(Č,|QaWbFWbX*b6T7dtAؒ;t0$w |:rl2-eCX)Պ{'fR搻u0[I*ދAoUqwZ/:W8usSܝ:A,nSPQgND!:%w - ɝ:V[NLfLVɝ:,Sj[ݩhuAB%w -ɝ:,}ubN:Wrܩ#(_P#dY!u0rQ6Scj_ݩѺ:Sp`4ܩN ԾSC L.UqHJr,/|A 13,w 2Nj_ݩֲ:SpꠡSܩXJACy|A4xM:hHv*NDW3uxl5v* MM{Ծzb=lL!bf!f(bN,)b":7w 1scBsâZqŌB.\)d He=˳l#l4 1c/se*`he̕F:;tfަQ\5hidz*_vqo0NXX;{vth7^@?ζxk}grd6;[0Οmqp&L3-}Lw 0c_{>\ƣ|k3׍ܑ(ZH#jj|pFNޜA6B` >B`{Y5p:r^>msg?dwk#8k{~Gnwbf:msBpQ6:je#&}WFȆԲ:mvϏ9!dȂRl#)LeTcN xL;5=p΋=H3cX:(HecZ#7eۈh[ʘp-5 Gכo,n>I-_D0]/9q,SqG:C5F# a`9~erj~");<K4NQTChhZZ-_PI -;E\qU *zԶ met3=T." Zl(Eva!_^8uC9Efk]|̽/CC:XJqS<5j]YՆkc?J<~h83m.)c}Ѷ1wխ5=7yi Q98MMbݵzsK\R -+? ֲ -*wͻ| ![9;]>S>c3MÏgx?:ϴ|=sR8EOr>&vG|Nʖ<?pK*yHiv=ۮd\5/3ǥ(|ԐQ# -hz;kCv-ʥ?q9PMP WpեWϚ5WNU|kcզl砍I,= -];.o͜;'>?4nSή.EofR=F=kO/(3f{l9M8d{Mn"jaqe˽q]k9p1O{~mhQ(@9Jk%ӶT_/4>%4v-SW2605yXzɍQ"`s8`D@<- YK&"?T% -endstream endobj 1074 0 obj << -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1073 0 R -/Resources 4 0 R -/Annots [ 1075 0 R 1076 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 295.116176 39.386457 280.101776 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/DriverZones.png) +>> >> endobj 1075 0 obj << -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 517.798743 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MkdocsExample.png) ->> +/Filter /FlateDecode +/Length 1269 >> +stream +xX͎6 )ꇒ(`0aS@C$b)V-KH~Kw!8Xrar&GK`&0nOGgÕM+%҄hRfɐbĦԱnZΨՌa+V5N9cܴv[{Mx\(=l`#f!Ęc-g1Zd=cWfr,t]6KB^QZ'wOXKܖ~0`ֲ8,;@`n@o73 +]jQf$eaTdJb>&Y!VRRmWһsItZ)l\.8uT>ϫK;z_ߠ"*qܟ\qv,.z//%{wR}'B"Ro9hK?!>]o3^9:[j@|Rjs/Im=Ȯ˦ zԄvu}&>n)l"͠(%Mc=nHm1\/KH!FTN:&y5#ykp]JǥpYq0_(vhEGSW~ dLA/єֿcX_™09Ʃ{`X[J4)6Uip~e 6Qߗ 'b cv>Uśyd +endstream endobj 1076 0 obj << -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 517.798743 297.637795 502.784343 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MkdocsExample.png) ->> +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1075 0 R +/Resources 4 0 R +/Annots [ 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] >> endobj 1077 0 obj << -/Filter /FlateDecode -/Length 568 +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 444.213703 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/DriverZones.png) +>> >> -stream -xTn1 )qĎT KA !m" @(矀0c.=g%/OmVƳ䨤@t \,;ct cd_WT#I-h}eVq\a6b~10bCfDvcA^6Ge:ubM..S{Sӧtj‡fB]w߰gc!uꏻc{\z;?1V6ov0NMvֈK y) _]n.f7HvŦeW9׀9_ uG5X*@x+.(IdpJ8j69wUT!S'<3D UO8';od?,qGztb]##B(9;'} 52:Es@PClkF ?9#I^$b'.C`#Y@O-0r, -{yX>JF!j Z豍t mUE} U -endstream endobj 1078 0 obj << -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1077 0 R -/Resources 4 0 R -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 444.213703 297.637795 429.199303 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/DriverZones.png) +>> >> endobj 1079 0 obj << -/Filter /FlateDecode -/Length 385 +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 213.367303 39.386457 198.352903 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/DriverZone.png) +>> >> -stream -xRMO0 Wىc;$ām-h%A|4̎% E`E|4͝K( RE-^P"d)L)ݸW c  k諽=nBc/5[QV ,cQ#`-e7=f,xszX -Dp> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/DriverZone.png) +>> >> endobj 1081 0 obj << -/Filter /FlateDecode -/Length 402 +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 173.636328 297.637795 158.621928 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/DriverZone.png) +>> >> -stream -xj1 ~ -@%[2 {$$)-:%!g&%R{xMm YJDX2Cf~3(fRRoVÂrC==EU[_4 wFs {]23WwSŇŝ-{i[[>IYnFPZ,NrJDX≪ j.(t!*]9JzIiF7ܩ3BhtvX;}[и[TnDR:hvOK[ֽ]/q'D -endstream endobj 1082 0 obj << -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1081 0 R -/Resources 4 0 R -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] +/Filter /FlateDecode +/Length 1627 >> +stream +xY[4~X"* -I K;sƝhhL3}߹ؑ?H}p ç@4' A;*g`^08酔4=Z|!wA TJ c!vfb*E4I_?dQĢЋD{cǏwd䧢*!zX|te<==3s;/qΜ1_dr|/11eWy_Q̗֘~\xBᷕ5i.Wde^ >n |US߯:a3ݮy,άBeBPb>0Ba!dЫ*Q@.尻$C\.Nf˟54pk'~ii}hfy7bNQ.Sⴻ3`d &"t⺧L2rv]a 9{12'䀼(XmT-E&GNINlmS]-b׆vM5/ظ. Er`qZ ::*f{a]4 [ [,F.Bd?yqDg{zrBTV8[Kad$c (Phr86nq~B Pt~VK#0X_7 +=ޟV@8S[V=ЖbQ^Ly^- 8%%X(3I +[- h2׶%^\۬1C!eRZ +,g/mrPҥ/m,V1$p졥tz4@鶤Tkn Z[y#,uA{GHij~0bM)&&FA!`c9KFX)(64+fM1mM;WRRZP|#"_Az>ᬹWo8Yr!'H?ϗ_W(&ؘ +νG 5LotKmq[k6x>v-I;9},XVXM56EI^Vz$P۶~-UevW6ssm& ߏ.]NIyJ* +lvӅxqB=TF!ʡt?[ν˖더B53^ß r*g;?e??;)?%?!}yAK/n;(aZ 8|S0Oz2iJsrU;ҮmKZCsbرh54d^ y7U>}\UJ*+o86PZQ@0F@_O"Df:nQsQoP0ļu: +endstream endobj 1083 0 obj << -/Filter /FlateDecode -/Length 386 ->> -stream -xRMO0 WıiTvh%A|4̎% Evd">% Rr/b˔B@ݺW c  k諽=nkR_kʷXƢV?F.EF[b#3nz~YS y]zXz\bYo6{513K0g{MX#L L}gn..| mMR6*5)@IaGs݈,r2O<]/LKwQu=X C>&fFKYe{sh0AJUC'm,Ed1W 6s- -endstream -endobj -1084 0 obj -<< /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1083 0 R +/Contents 1082 0 R /Resources 4 0 R +/Annots [ 1084 0 R 1085 0 R 1086 0 R 1087 0 R 1088 0 R 1089 0 R 1090 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj +1084 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 731.610822 39.386457 716.596422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/9WindowsRemaining.png) +>> +>> +endobj 1085 0 obj << -/Filter /FlateDecode -/Length 2401 +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 731.610822 254.636457 645.360822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/9WindowsRemaining.png) +>> >> -stream -xZˎ,5W CjҰYEv5fH0/t8vvui*3wXxRy-Y>]p ͗|E9悑.A3aq3!TRh[?λE)zKW`|㿗{hjqSr1~D*3\ -\&19YuY0rY!7pT5|%}h"ʻ9_,)^9-݌ep"g^zO_[DH&oOkyH(Ϥ0VEDEF"?m-H7SjIEk]ajsU*b -1¶YflRwb4im7Ztg yVl wDs^!Y s*oO^t}=uW%~Հc2+1H8/XWPY]mwBuiOMrAm1>*sˍvu{U##!AV4`͡dGMoK*ƬmmW527FF!X&ѤAô73`); - =u#Ζ10.JPmM6}ޤȻ}ܠꤐaH9G@FS;@n+`oq&_֪s)r|W^3IsZ贳zB -RR^Q<C~|}?*CY5G:Rm" -Mwc;#u4P& 6MsLzsfA c,fCYZ4k;) QEh8H5'Qbd`R!HQR j<J|ہrT)^u uE)p -VǢ~0 0>p@.kϨd`t4AP ]!sԊ)8x;E es ]T~E;/_рY3bQ@ 0#nP4i( -Yim@~2|B=&2}xc>y>צ)AS2S1?Z^[:ȷU_{Jq1&'JD +kX0 s$C%1-i_"4Wt57#46tG^䎛}* X8:~hJ;lo#g{:6[cBw99z"LS 3w>Ϝ>5 b 7^ B,AwSP~Dz D@ZSM -'. nύd0d<<'5e0jefg3#øN@ZvxZ2FB̈~Cݵ]d -Z5u{17huX"􀳡I -R3ɕ!#SD:D'uͯxs~Q^Vplzٳ/{KVj1ig"S_m'!(>5C )*s. &cN)d8xޑ^F&M\&ual-̥QQ\R1haQ>&&UdcZ^qaǯTsOǤ$,3~SC -endstream endobj 1086 0 obj << -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1085 0 R -/Resources 4 0 R -/Annots [ 1087 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 645.360822 297.637795 630.346422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/9WindowsRemaining.png) +>> >> endobj 1087 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 135.094122 39.386457 120.079722 ] +/Rect [ 39.386457 498.970422 39.386457 483.956022 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/BlackToWhite0.png) +/URI (./Images/Manual/Windows.png) >> >> endobj 1088 0 obj << -/Filter /FlateDecode -/Length 2610 +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 498.970422 555.889134 457.610502 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/Windows.png) +>> >> -stream -x[[o+~ׯ( oᇠm{>Hk+(pK.g/O!kEqpKQoBÏ/g>̯/Gk;FRx6ȃǟ?0FY.4ߜ@=\Ȫt˂)8 d953Kg|#~K4'^O'yEB@3X4p8YLX ۗ”mѩ`5F:*/I,r9|'AIhtPI -37׉_!Q1g6e0~>|ћƢ"1M"$•H"8#WpIs.B*$!8^2=7H|GA(B}Ɏ<3-hrMcr0w/3dF Z`CKLGlaz#0xaxqz> I5RPvcX794G Y׉[XiX#5F~ Xg9qň 1:Ԍ4Z5 bOdWo7Q~qVjڇ5Ӥ&`obͲJj$!ɇhfߖN5E,g/*Ws$&mr&Do+>a񸈑<}L̫:&۩U8F -Q"R -Mڕy%a * GP4l$k3ATƆf왾ܡ4զ 12A{e4ҥӈHd)Ȍq WPXi&:U!{"ݨ&,#uD.:Q$]Qzh?{$%ƙ]"D:S \IKrh#mCn繼_KCUXf9o>0vExU* "*>Gxj0&'$Xso0Z+Jܜ)ͯ\. `BVf԰W'"mQMaGpԽ L|jdb.Wnx{M}sTddBkvz61E :VN6xez;\Kb3K[2tCgr>~̬^W9ST/y@^s8oDoh4ΌW8pf4N?S6w/f<nu\:*LǪzxO[AI3f]Kj.2W Ыce,V#=wcDd{4Hmu]=sO^^;앋&9w*g!CrhwDV6NwEG]lca ~Z~Վ429|NR\KsrWkPg=Èp=uϮSSi[;mݚ淺]%AtՖw`!N^~udC@cipX|{ˊeѝW) U{ʽt`e-D -h$f~92{3WwG"tx0njtf9|_PSq/.N˟W)_v/-xۋq1(j4*پ=p׮4R}r}N~{|Ϩ-T<oT^?Ù1=É)FoW~+~f(<겋ѹ۫n9`0=ʏ[u;YB̽14lkWհl>Z,|? cBbvd3 ZN6M&ЎP|pkz0.ޯ:qxhב!ZyzG:^-O dBFn{W|m=YtSJw>?ґ֬ׄ=uy|6$Vr;-(8Mtvxh*zЁt/"ę?%mHAXe "N嵐Y{[v}|<5`+&=I?B9;\ONΧgU*Vtmފ4Bnxq 2,f:zOJ"$E8WNў#t)"m? -5 -OsziO:ՌTkD̿x9 -endstream endobj 1089 0 obj << -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1088 0 R -/Resources 4 0 R -/Annots [ 1090 0 R 1091 0 R 1092 0 R 1093 0 R 1094 0 R 1095 0 R 1096 0 R 1097 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 457.610502 297.637795 442.596102 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/Windows.png) +>> >> endobj 1090 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 286.886457 720.773622 ] +/Rect [ 39.386457 93.456102 39.386457 78.441702 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/BlackToWhite0.png) +/URI (./Images/Manual/DriverListControls.png) >> >> endobj 1091 0 obj << -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 720.773622 297.637795 705.759222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BlackToWhite0.png) ->> +/Filter /FlateDecode +/Length 1071 >> +stream +xWˮ#5+T.?@b`3RHE߄X%jw';DI:~T:q~,wvut Wlt2^Hڻ%ZeCA!6QkE]nEO7VTT7-R? ~ZMO owͬzui\\,2DF + aߞZDvu.g?0=N=y}9"4y]$"\Ty5{ , ++^긯k(揫ci^5yQ,kӚ@ъG~(k0{!q~8d-d*dq`k1spS{W*yOqh^KiyM{G~[ +RP'ԍ%F<5/8.1𵐯| +mlEP.|7[k䫞bҭ8h˱0T8ױpN4C\HuC +endstream endobj 1092 0 obj << -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 638.194422 39.386457 623.180022 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BlackToWhite1.png) ->> +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1091 0 R +/Resources 4 0 R +/Annots [ 1093 0 R 1094 0 R 1095 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] >> endobj 1093 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 638.194422 273.386457 590.944422 ] +/Rect [ 39.386457 771.023622 280.136457 525.023622 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/BlackToWhite1.png) +/URI (./Images/Manual/DriverListControls.png) >> >> endobj @@ -15230,14 +15319,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 590.944422 297.637795 575.930022 ] +/Rect [ 297.637795 525.023622 297.637795 510.009222 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/BlackToWhite1.png) +/URI (./Images/Manual/DriverListControls.png) >> >> endobj @@ -15245,101 +15334,103 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 508.365222 39.386457 493.350822 ] +/Rect [ 39.386457 299.807622 39.386457 284.793222 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/BlackToWhite2.png) +/URI (./Images/Manual/SettingsReady.png) >> >> endobj 1096 0 obj << -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 508.365222 241.886457 463.365222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BlackToWhite2.png) ->> ->> -endobj -1097 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 463.365222 297.637795 448.350822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BlackToWhite2.png) ->> ->> -endobj -1098 0 obj -<< /Filter /FlateDecode -/Length 2990 +/Length 1628 >> stream -x\K#W&Y|9 lCIb ARdVY/V}U,:KQ"9_~9Iɛ_ j -UJI 8 ?O=K?+*`~E yW\hX 4k)?>TeYEZZ!O*+ϯ}STlq\g P^roc1-c~xm0-׏ywZrM~fk׊ڜ=vi?O>?\,$$0 -zX4/lą|-qBQ0?7*H2f -E:!tV+_QVZkTv,=]5X&A oɓB,D)u{bJШR+ٖDt[Us1 -}6ǚemjB_gWTdܦu[}:2devXGq\8}?c))5zRG0o'_cDc\m,%o2~aJd0=C߁C*Bt>7\|sou}$ HNg@!Vބo#F@@X -|CnX7TyW, 97ϋG`e]O@ȤA#=W 䤊I.={gnxC|=8c·aa` $*[d[l0B)=<*~^zVtAruTD}>e"㻧͵r&Lu#Wk,CvuoAtUD|)0YxzyTibah-O[ӎwedjax|v֥=\ wQS\qv+AW2SdH(Cv8$\]2:O L~ӱ,scZ 0|܌Shb""~_q؞!MehϐF(zdRFg[Cz2l~H`C$ƼI9!:m[tHc#tHc{Р-:e˱Y>u8v1]|ڥO1PWI}.uԬK9N#Qk^NDBgy󍧹L:0e[8ApKoIr_c%t0bMZ9~M*;ֻWfKmvD&Uഁaԉ[%drɕ|ߙE+0{ hwYX'|~ߙN+X6^;Nz 9CƩz|?(q0䭷$ڽR)!̤@~uǖÞ-UzHjI2Isz;s0xxf4X.c♲ؗw.4;'2]wm|_[7+'Bt=Pk[ާ8nLw [MxBO??2% v-ץ^#t+]=D0SBn`rP~oe:9NPvBb?_. +xYۊ7}gC䪖JXacBmqԒj{YvwFj~48|Tgppxh>7rFg`}zA ozrλqa8ğOO`xa歖ǚ'q𼭶`>(Jʈ?a|nXMƁ2ʺdب!<à)n4v?Kf/ +x# ſ"7:^)~'}=93MpRpWc9M4|wϜIPV6 'Vy@߲p;뗿0j;FO>>ܿZDpfi,"=͹9^?0s_'O||O3rĈU"ˤ k7;Y152ϗqsͲX6sq*oZ}$]=8dI氏-NBƸ-pe%H(Af lilM6;Έ&S#B`W1[Q0R|?fvG;R\>3f{Bo X"s~ +){* +}v Įo{BT}EgfÝ2B(U0{Ai.s\_:\rWsW+/MžMu;WMNN]2~Tk3kj!ooU7=6xf3*_Ⱥ,H`VI%L$ +3u_>7@!f3F/(O5s ĭQqF`2(quQeil唽* +\+RIKB?PvS_ +L#yKrp)_Y#̎v98떱7+v~$oҙ:6"#yeV "-:U2M +i]۱Hy[[mbLݖތ2n{ =%-.eQ)yK[()sZS*p-d%iqfVFm/ni.l{V +zx7jҼ{^HD +zgMw挭 l:W6>/ـȰ30-O=6GKwZu9tðs#?{2JtP\)DgȾ#|E6{Q! o +z +m%kI]P .>7EwI|rKϪȽj-Xb"vÑ4TO!k2E@;aÚRHD[%m=CІ>9!jR,ŭw/eAr0 =j$ I8Qu*c%%PհC tfɣF WyhfIK>hxdg:woNPu <^o \"PEf}{w!Sk}#Dw +ց9 +9fٹc>a`X?/GV5>Jm]j)xg-B媡0+ǰ;Mf_(hY|+*%c/1 Vi _A5[2&.M 5Q endstream endobj -1099 0 obj +1097 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1098 0 R +/Contents 1096 0 R /Resources 4 0 R -/Annots [ 1100 0 R ] +/Annots [ 1098 0 R 1099 0 R 1100 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj +1098 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 435.005256 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/SettingsReady.png) +>> +>> +endobj +1099 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 435.005256 297.637795 419.990856 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/SettingsReady.png) +>> +>> +endobj 1100 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 261.036066 39.386457 246.021666 ] +/Rect [ 39.386457 92.293656 39.386457 77.279256 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition1.png) +/URI (./Images/Manual/LoadedPreset.png) >> >> endobj 1101 0 obj << /Filter /FlateDecode -/Length 624 +/Length 984 >> stream -xUn0+a , -JXW*Z_b8sKY 9yslO_=4WɝCBj{kLQ*hvBD)!qOc(Kbr?= 7=FK4Zo*.WIYճԤ#jB OL]B>|; 'M:Y. g:k8{󳂞Īd7a11W -|HIeûw -XDߏ×[߭!"fOLى'<ֶ`!$kdS#VmIJd4_=7ZJN?olB?tsdžiMW vaRq\ /hW_H/gr+aİw}ZZ^hsgZ,ԵX3^F^Z%ų¨.&p/41tńӹO*+R`(d5bz'dА`eJl%YCSǥOm\޼aV/B{̉7 x.,4@4plLG @qgh03,z4Eىv;Xt|3v +xWM79PeFҌ$x19$=4~ +MK}ʊ@lf4̧@ߡ:٩'sGēyk*s;{V<O0xJ19RR.i a~J,|yy 0nLZCtk2VAgW'p Q p5;p>]Z=o{.5]=MG֋kͶSGw\FJR_Ij*gD-et 9 |#f9Q́&8n#,&xj3UMvJ)M)|@{F23qRڳ=ߢa +a{ӹ0uϜ3=u/.W*ӺyoSrF.kWҗ}ƖTao[?n-`Mv [e3Qu}ӂD%; {p_ cwV?lA4>N7q K [E\ns]FM)(LCƺoJDA rW6p8(it5[Hm %+CƧST HjlA"C-! endstream endobj 1102 0 obj @@ -15358,14 +15449,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 294.611709 ] +/Rect [ 39.386457 771.023622 555.889134 434.019371 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition1.png) +/URI (./Images/Manual/LoadedPreset.png) >> >> endobj @@ -15373,14 +15464,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 294.611709 297.637795 279.597309 ] +/Rect [ 297.637795 434.019371 297.637795 419.004971 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition1.png) +/URI (./Images/Manual/LoadedPreset.png) >> >> endobj @@ -15388,24 +15479,26 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 197.018109 39.386457 182.003709 ] +/Rect [ 39.386457 252.275471 39.386457 237.261071 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition0.png) +/URI (./Images/Manual/Simulation.png) >> >> endobj 1106 0 obj << /Filter /FlateDecode -/Length 744 +/Length 1128 >> stream -xVn1 }ڹ؉<^*- 03t+sdB*\cST W(CBdrj1=NكM? 1c{znfԠ~OGqT\O[ΜR8;% :"pܜbLf؝<1>cp\ף_yűz+.be2y}XDqI6:6jiP}UК$8}Im?86 %`4/}J(-/=ee=7{6Xsֲ?<=^se Ge-P-L2wE2*9_> ~cû$&[" 9 *h8wȯ%RY4^. Y2Fm+?]lxS(_fR+<q"CAYgS*LRz} PHZHֲJڥ;>H0XH#0}<|:Xh3V}><蘆L7<|>8akYxp DL3`H#;pQAfL@t&VYaEF+yť}j6kl&Pvj&dk)z +e%m#S V˕1Us.O94:ˆi;ݟ9[|Xt:򑌠1 (@ ~wHں߆W hy@@EeRE|_=sO]™-r"Z2+"NMh: NE w^k ,t(N‹R1p( b[NeC%18 LuUVK&4,H6t! +&Ӓ~3fvU5\Vcmǵ;N kEU>wګ=d=VE"1t6mȝvJhnR:#n6SW=]]N_pOy;^Oz@F=k[óV4FmGχ{4ew)cf6&.r^7zthG=:1KO`+}J_eCR͗q_(HQ붎g5zo=ŴӇGcDߟsC endstream endobj 1107 0 obj @@ -15424,14 +15517,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 297.840524 ] +/Rect [ 39.386457 771.023622 555.889134 414.499650 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition0.png) +/URI (./Images/Manual/Simulation.png) >> >> endobj @@ -15439,14 +15532,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 297.840524 297.637795 282.826124 ] +/Rect [ 297.637795 414.499650 297.637795 399.485250 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition0.png) +/URI (./Images/Manual/Simulation.png) >> >> endobj @@ -15454,27 +15547,29 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 151.450124 39.386457 136.435724 ] +/Rect [ 39.386457 179.618850 39.386457 164.604450 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition2.png) +/URI (./Images/Manual/LastFiveLAps.png) >> >> endobj 1111 0 obj << /Filter /FlateDecode -/Length 740 +/Length 1394 >> stream -xU1 WI'R @Big./a'&"(d8+\(E3&g ŠNq{Y*)mr18cci4d=`9d%e 0 -̟V2,ip&|\ynbU22WfzXXPBZ)GûϷweÝjv݅dC@4SsQyBr.rC7~7G<6/}Rh-Fns[_}DO-گDx( -G.8L)ȨQ H&w/0.dm tGy[tKˢZ?^i3dA?Ɍ] +xX[7~@etCB$ޜ %j$Ps7F?o>8kCOZѼpC0x/}BJPh7|y:;u]8)(W!~|<><$Б #)k&V1(G*4ϧ08Žr9z4%$q줳(#0UNe 1*4. ff\q, nJѪOOLYXV +Ƃ%A1џ2}[]uoҗzscT(Rn 6V3eJHcaf" Es .fU*N=_.ǚBH,iU>ɲ~b,9#ýlؓQj/ed)/>g {N(2Khd;dy-cYqp]Yti@$Sp'vBƖ +PbVCX72>0.aVtRU2 s#r3L_VTWѻyZ) lEjuH pQ+kE'VEA:Ggy ܋o=5n'{=*~̭.uh˜K׺wh^G/K_) +iTdT:S76(@apŕD_ +Tzj*eL=xo]iyɕ,tXOJu|Y04Z?g80vRsgyoɭX>+< +Ϝb U;!<7),%VMǣ. ɷ4wd1DvtqL^TZn<γQ92iBܪ{ hyZJqV+-PAg-rF9(iJK~ӛ_ Ʉ`Xh(DkMqFm΄س#ddTоa>8q-&'?<;r txڀtAz0=_#ڹ5>fT%㻜n~%Jm] 68%?n +30 :V;X.a`TK|D/-[jѹڪĸxax endstream endobj 1112 0 obj @@ -15493,14 +15588,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 291.606646 ] +/Rect [ 39.386457 771.023622 550.886457 514.523622 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition2.png) +/URI (./Images/Manual/LastFiveLAps.png) >> >> endobj @@ -15508,14 +15603,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 291.606646 297.637795 276.592246 ] +/Rect [ 297.637795 514.523622 297.637795 499.509222 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition2.png) +/URI (./Images/Manual/LastFiveLAps.png) >> >> endobj @@ -15523,28 +15618,27 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 160.230646 39.386457 145.216246 ] +/Rect [ 39.386457 207.526422 39.386457 192.512022 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/720PTsunoda.png) +/URI (./Images/Manual/Battles.png) >> >> endobj 1116 0 obj << /Filter /FlateDecode -/Length 752 +/Length 1413 >> stream -xUn0)gƖ= PTZn*Z_bmUȱc{~70N7Ƙ~BNcSo(Vya 1BLF ZQ'-D'4|~ Y^ZqN-AHy> W#Xg ֗ȅQѲu(<%Xt5 -W?cUCb?&>d2~k -gyoh10ItW ?~@۵po:z. (PvuL-jm2hCoy 6…E&ɆAISz~Fuh<űHun|3Yπv*H8>p/zc?ݾK0ñ~[$.lɓYv0 - s1ixq$ rx=s E}ފQ9寍g^ 69(vlEyhJ́csu=+,U薎. uYØV}RFΩug0z &M_=KޗDNkBz4kDMF"!j繁 -]fik]HC&]bso6ngy!K)j>kʹZ+mYΏA.)s.SMjc.A71>2 W%GQ-9庻Ds.#f. +xXۊ7}gCde !@ 318CJjTnή]vgZ*Ino"蝙ΟRx+'Kty-}>h/|ʻ)aB'AHqPkaO_>:>jOJ $`J_>^ ZjBZZ~:شUÆ솕4߽@lByRyl3D}9#GG':I{P!3 $`*9v_5Bq +#she,n>?1]ƤO_]yNsfKטK#9BK<Q re/`4mɥ*k|p)h6\ i^0Yu`aib$kW KXd+r&yj 6NuT>NQesUs$΀Ϫ(# b8O3DcY|(pzp`~(WpY{sey2+f0F؁xQeEF;12:1$;zz&nF^QLjҚߣuK2G\(Y~ܞP! Vײ׭{:NDI+9fҺכU]a2`DX~7? ;ZX.Dms&43khF+rm G &0\3Aŧ \k9VgJ7}Q/IZx_%:7"Ɣ[D]$Qyno-smScI.CLti@"UG밃. +^HL(t@1 u V;1P@X:ti4ԙwrD* endstream endobj 1117 0 obj @@ -15554,7 +15648,7 @@ endobj /MediaBox [ 0 0 595.275591 841.889764 ] /Contents 1116 0 R /Resources 4 0 R -/Annots [ 1118 0 R 1119 0 R 1120 0 R 1121 0 R 1122 0 R 1123 0 R ] +/Annots [ 1118 0 R 1119 0 R 1120 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> @@ -15563,14 +15657,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 659.238914 ] +/Rect [ 39.386457 771.023622 553.136457 574.523622 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/720PTsunoda.png) +/URI (./Images/Manual/Battles.png) >> >> endobj @@ -15578,14 +15672,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 659.238914 297.637795 644.224514 ] +/Rect [ 297.637795 574.523622 297.637795 559.509222 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/720PTsunoda.png) +/URI (./Images/Manual/Battles.png) >> >> endobj @@ -15593,99 +15687,99 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 576.659714 39.386457 561.645314 ] +/Rect [ 39.386457 267.526422 39.386457 252.512022 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/1080PTsunoda.png) +/URI (./Images/Manual/DriverInfos.png) >> >> endobj 1121 0 obj << -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 576.659714 555.889134 466.895272 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/1080PTsunoda.png) ->> +/Filter /FlateDecode +/Length 1023 >> +stream +xW6 WHIbACS@у9&%[g6iص-K$ߣLcr/z41>=͍>~ &$䍏cFɠssNy}HCh!L).?h4zP^s1ԡ5]u6v*f1=1؁#x_i ՠd)0UмX$..[4! E._~hmNe: WwИ@6%ɩf:[L^}[G9K1pr9q드:N噟xYɸY>%<5( lb'98;бFe,uq d0go_l''$#}N+|fθe-R7__BPMG;:W*Bn`OF\D? =5V%>l|N+9ĒحfKVK-Pqk`t# + x+q*06ۊja(kZ$TRYcCr_m +8K¼ڪТj Ew4 Vrkx{'fAV p^WªZ%00s2pc.5o͇?(M-v=#M5c2ДBu?E=?{=g +ܾAFRe2. +W{%*..5LLv]g#oy:]M8B74hPoo),+jLzRC6](ָ86ɛXկv^l -jFE x֯im[88#8' /d[_eU˹-Ij83r!Ȥ(#17#οs@ !./1W '2R_Z9@"M9?$ _>j1k頀ǯ +endstream endobj 1122 0 obj << -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 466.895272 297.637795 451.880872 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/1080PTsunoda.png) ->> +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1121 0 R +/Resources 4 0 R +/Annots [ 1123 0 R 1124 0 R 1125 0 R 1126 0 R 1127 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] >> endobj 1123 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 359.917672 39.386457 344.903272 ] +/Rect [ 39.386457 771.023622 555.889134 536.316565 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition3.png) +/URI (./Images/Manual/DriverInfos.png) >> >> endobj 1124 0 obj << -/Filter /FlateDecode -/Length 941 +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 536.316565 297.637795 521.302165 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/DriverInfos.png) +>> >> -stream -xV͎6 )UC0C`(zxꠇeɞmSdZ[6E~HQ N)c|^&1ݤ|~Oe1QeАMYMZ<^ޠ1{`Bes:S` az3[mԇJ~^r0S#UgՅA֌9!2Zdo?t%8c4J|,ĸQ`|tt٤.dᗟ~w2ZǤ_=p5Q )D"=D*4ӀD#ҔT[c"qm}n=G ~n'mAk==!\e@_;c= t[ۜ|hh9-x@ה -ZV5-RZ( -Rawf-eAfcو,g8,Af$:AM=c/-cMU[p̜zMxeͣLJDσ)1lܕ£ ˞&]a% {z 0:weݹв' Q9dncߍfh[ ǻ@w"w2x  -0|o$tg{mQ'K s;G>"w\RυSfhPKmw-F*D{VR#,^R4]#,X/$f -endstream endobj 1125 0 obj << -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1124 0 R -/Resources 4 0 R -/Annots [ 1126 0 R 1127 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 359.897365 39.386457 344.882965 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/LapInfos.png) +>> >> endobj 1126 0 obj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 293.426341 ] +/Rect [ 39.386457 359.897365 236.636457 149.147365 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition3.png) +/URI (./Images/Manual/LapInfos.png) >> >> endobj @@ -15693,33 +15787,25 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 293.426341 297.637795 278.411941 ] +/Rect [ 297.637795 149.147365 297.637795 134.132965 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Screens/TextRecognition3.png) +/URI (./Images/Manual/LapInfos.png) >> >> endobj 1128 0 obj << /Filter /FlateDecode -/Length 2942 +/Length 507 >> stream -x\͎),vpC'Y aFًRdniIɻ@xޝ&٫ "@N'$'c}Wƻyk2޷ur-_4~~3YKv?Qh\um,tT^\iqg@Z>q-^ӡ\,gpeN譴Yj.T撒 E蔹$**YEmr(J* -MהIFDQiy3YK]TEOϷ5byIi5T)^!)tf뵅SelV\I+eT_]SfWH-<ө|v[).Ry.V%Nۙblebz߲8q4M 5eigK$oXU5FCxа_Nc1:˟OH//{LV*LcQnʭ/::e:,u-:Y3HKWmpB.>9'erL;_n|WgRM:{+s6&`~Q+cK^7kiVBwڈ1CtoQ(p'S (ԏwAR5,K-0c(@2p2gqu !|q9Ƞ+0BE@s@y2 j>U8tG8 ^Dc{9lS986mRA#H2 ălymŮ& - #li* !#])9'O49O4#h` +H.MھVhjĵoˇH:Z"(u׮O4Lh+֌9rȕ+M oze޺ 6- lC(ZS:;$C> ٻȗ4 8`sWW$j^LQcɵ2?ﺧ_G6Ti&-eWtF[9+$ЖkoVj6#⻱gd"WFr|C<{3֫ОZf4-miٵG.W{[2V/Ԛ;yFr8P}ΣCjY@b{jSE`cHt -L0)MIs[o Fіn-ue1r] 39S/]րf'1U3x4vݓ13lJUI9+-\%^-:Vq%y;餴6[t>>3%v=ݶ+zAFN]+YS$}]lGPBa;Q-S;@]@0"s~=@#wDajaZ5C()&-7GD1Pނ;@_T/З }w(zT:MC 1\J>נ--Bra{K -Q \mndwzGbz#D9}`!A%Dwq,ȖM0fV<;M(-Go0 -S4-J6-B0X?z)A#7Aj`mrshk?:m<3ȾQ۞ȥd4rsRtrNQ$Gq aHΣ{EPgA=b7P -6]|*=EZ0֧1菱j#x:dmk˖,L*mpP#ao. FrXjGvm!ƮvavWߺ؝,/oTL^rMt)rp/CZ+#y]NHk`z{Ծ~gcdxerҝpIgW;v>losӫ+U1=Ihq]5PBҸ\>?vXJ:lԴa,T=?=B0,ȡ6Ze|{,bG2li9ݓg5ܟr?8}$¤3}ޤϖzl!.i$ C]{'#!pP/ cۈoV\0Kx5:=[{{e$,/;޿jUv=3gʭNJ5$o8?hQٳ"a)((~\:-gO|h݋y+W~Gpyyy 9 ^Hry?Z_@e㊐ZbH9 -ku!%99?]arI{;h&gjk$)K9>AuιNrP -Y88sɤkXLZD / 1veK#;O}b48/ǣZnZ~Ez~p [dܾsb@2n'iԍ - V[О{\x}w"Cl<Kа5o1d't͆Q[ }TV|X>LΑͮs퐓-X'Ƣx[ :{LX4Ha3w9oFq*l>+5: endstream endobj 1129 0 obj @@ -15738,6 +15824,954 @@ endobj << /Type /Annot /Subtype /Link +/Rect [ 39.386457 743.669622 39.386457 728.655222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/LiveRanking.png) +>> +>> +endobj +1131 0 obj +<< +/Filter /FlateDecode +/Length 370 +>> +stream +xAOC1V(hbv0az1yF97AOݛ:%}¯ّ7Z)/fLh\vwIJ&l +endstream +endobj +1132 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1131 0 R +/Resources 4 0 R +/Annots [ 1133 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1133 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 327.386457 84.023622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/LiveRanking.png) +>> +>> +endobj +1134 0 obj +<< +/Filter /FlateDecode +/Length 2135 +>> +stream +xZK7ϯ!^, ;6!03%IJjikVn9-s8O9Iÿ;e Yf9bcBpEh]}}[:!%ፃxXϻ9ZE_4@EqͤQĩ2?eU/7^53"瘱0i!A7;rsp53|%4 +~N9 n +yR0\yi<~ٽoo>]DHƩϻ<#! G~:1G + 8I: ,c;Pc5;}gPN]y>7? tRz)Yk 4-쑃Rmd%_˪~EIZċ);_% eG"@0Pȉ҉XIZs(HiNa$'DSz Dr!N]14UN$CCz &"4͂m00~"N5-.B{GlA> h* Zgr +AJis $\0)ojTx1 BC,Q"$efVˈ6_+5:f2f;Ɖ4 `Rx/%8v6J +1yDݫ2^މ/Y{ԫv`62f`12KChǦާ)4 qO80$rs)7J!V+o9>yV *@ŁeݒxV +G=a-26[{05k"~׃(ZӗއFwJ7yыF͐#OBI#eja-ǣ +F,ۙIy(dJI& XZ,]Q~ﺧY4v:RSi|hVޠo>T_EX'Z$CR::#7w:~iR_Ȉ0{HQOj$L(lԱ +*Fdp!?'e,Ngc Sf-f.Y42S>!kmOT|6\8I NS9_P4[A搌U}VUecաzAy`@QԲDenuvm'”*ݴsStۺwчty]wt,q/ZgNp>3rz%W^ŷU_D"!X\67 W֧ۍ,n^\|K^^|C^\|_^|S8P&~ߨx'W!!>J?6afI68Y)cWrV#i'839(qJc]9 +#4Q,9 +(P1swq I\o[?DK +endstream +endobj +1135 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1134 0 R +/Resources 4 0 R +/Annots [ 1136 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1136 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 771.023622 297.637795 756.009222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Manual/LiveRanking.png) +>> +>> +endobj +1137 0 obj +<< +/Filter /FlateDecode +/Length 4158 +>> +stream +x\]o|ׯг=A@HK ȃ$rR%]N:; v^j=C~>wגOZ㇛oloؽw ?:՞C-=M5oz-Dlq)F?7|qf[콴L O?|q'tORo9{T=n256mͻ ۿ 0xJkS3?jcpG'X\6m.ͻ /YUhS7n1XMNGzy1Q}60 Oћ0)00i0 ұI1xJU%l?6\9arpEHW\- +M5 TU"[hk݅&&HH" &՚p@0)f{vEn +t'phHD!acQvd*\IwkT:مS+YrwY.s*Ixci؄ER$S*b&cGe KӔ/"0%wHdKPFXPČԥ|98L]rO†1/0C% ̥E ++_@R))+_@. =sʒ{!昛E!PE!f/Ua!f;/^%w(_ʭv H% h_ʨw_B+1S-M#d|ш9ZVqH$w* +ŝH=VBTE Qq +bV) D  _ 8 )dŝ;NE&+.|=Pc+;u0֚/u0ڄ/u)!8 A NKAdլ|A޻u0zQܩLr@VHu0*H;ua(SGZsM:HAN FI9+_P9vA$iɝ:iA5(_PuND&SQv :}eP ɝ:h$w5!|AD:*ɝ:hhŝ:hT6Č^:ܩCcfeS`*CYM.{4bF5*|#eeC̡*H߰G'fpV[CqlGܡ1:鶬|9bV6Č좸sE#1C/"1Ul.6\{#&[ܡ,mt0ւvXsYrOČ@qO)_db*_dbUfb*Cc*_@#ڝ|dyX/H]rƒ^9|QY\3PqČ*Zqhw 1ehC Kl:CrQM#&R6ČLqČV;1rSf]:Dԋ➨U=QSj&=QQDL):YqOA4j6=QѨ5DD!u'ܩ($w [M'`ۄ 0bܩ%w UM' Z-&$ jBB%w +ɝ:-yDDVuůNDQ/S 0QȲC``l9%D ռzjM!QNn;uЛyDjM!Q.UqHDg%S-uAQ)$ꠣVܩ,;uzR:h-5D4;u]N4Aה/d:hJAdy=S&LsT$pOԮg lLͫg aSk +ىʆ9l9ʵ 2a;ʆ91lVܱ#46a\$ %HI%HoeCaIS3.xys 0WʁV6\i$l.CQȵ$x6s&djMpJ^9^]ͫ#[ƂZSQk +: +:j^=CC)Qͫ "D3 Ž3"Žsj^"lPۜي :"yu4pA+_@J)d`@0JS;1ǮՋ3TNPB@):Ts̠ +uEZS(ATH;uENL9yBLV/ +uNNtyBdS"4ԚBV$w`r-Pcj^P#u0Bwsl;uՆW/A43jMP)*(4%w + ɝ:W:Qk +:)SqKAW/A8C) ԚBBr%w`@|As5^޲ZS(A.ŝ:ŝ:Py ꠣUz;u.ŝ:ȲEއKhߕ/{PqH%w5ܩVMͫSk +:hJ{Q:O݆L4jMR͢^{ܡ[R:&0?9ёw os1k XԚB ČYN^%H&ג*t[oj^'MkjMB.CPܡUDͫ_=pg9 |$\?ST?YaJlB}Zeoc|xŰ^DNМps~8j#Ʀ~ʀI*?;#p>ϧ|^Mɼhή(*07o7 aW0;=.&g {u|bv:tMmx+,~M|eryۀ)kL<+/g4.yyyyϸ:D АI݇82+aOa0C#Lg̶Oa!#3=^GaHۈBr;ugLi |x˱a*Y>hڽ~r:zm3\%cț٩^vg a:zc?o2l_1GV=KW#6sƻūaNdZ<׆/ysgN>NJUsC X7yYי˱#Vՙ#ڕ6y* i^td}k-gۓ}7uՐ]7Wϙ*q~D)/=DCIAOMib<<Qhl8>=JCgz8Jl=>toxyƍ6g*w7 C8?Hxy}y[Wpy~:~Pls_m|˵rZ ;=|h|W_F-!g.ҚRBlW0o"L.=[@.[|!gp&GGz"QG_8gV:og'Rv1m:B03`[w50ы[uDh|f>'>AfkQ4[9|Џ Cu*نy'oӟϙߋ*Sn0FÒlշqwqHa._M:T"MQ-5HXYg[VW2' jf-}Kem*W7KHxZS^oK,=O% xl+pyf\G~cX&b͢K8@e +endstream +endobj +1138 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1137 0 R +/Resources 4 0 R +/Annots [ 1139 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1139 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 153.835026 39.386457 138.820626 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MkdocsExample.png) +>> +>> +endobj +1140 0 obj +<< +/Filter /FlateDecode +/Length 4054 +>> +stream +x\ˎ$WY[I2l>H>Xa3cpDu=X=UvRwU6Lf$ɮyk˿~zk͆?t{)k9r~B5 SfOO?<牟=]YmBzi¿?[{zEGHC9D4կ\OMM`]n]+3f}WZ:4 @I6ccj;kѮ1#ȱ][?pٵw8tr9L<&L +LRsnn~nR & +5G0\kfaV"]JQ+Z zuJ*ҕpcSVZ 3 BS1-7SZ&%$&" ף" 7,xc2C؄"ܰx]֘ +/ ?æ ܀ %ً O@̩49$r-T=5=3d!+_ ;)_$`K k{rXTHČԥ|CPqĜ)_81c// &➁$C𼀼K|sL =gɽsMs,Qs(Ua!f;s;sC}l9>\n;ϑ}$JT aӈ-(_4bNURs4ɝ +JFqR/|AdBTܩ̊;e|AuH:HHtDHt+A"R*v=RS+;u0:Jm:EF Pr%w jVлu0zQܩLrF@VFHu0TRV%w PrF!攚uܩ4ɝ: %e̡|Aʱ8"IKAOS\u0Rܩ($w +Ү|A ֓uj!SNfȻ)_PC Gr"ZqZBʆ1/Pnɝ:hH?;t0iV66 +Be`Ssq4w(X,&=1HF eeC̱*H߰ UqO…/t05,e/t\7ъIAHeHY3}䞈|+PDƍUa̵'=qo%:&)_@S-X+`9KN̸;1b1C*31[ܡZ/ ˝|dyX/H]r^{W(Č,|QaWbFWbX*b6T7dtAؒ;t0$w |:rl2-eCX)Պ{'fR搻u0[I*ދAoUqwZ/:W8usSܝ:A,nSPQgND!:%w + ɝ:V[NLfLVɝ:,Sj[ݩhuAB%w +ɝ:,}ubN:Wrܩ#(_P#dY!u0rQ6Scj_ݩѺ:Sp`4ܩN ԾSC L.UqHJr,/|A 13,w 2Nj_ݩֲ:SpꠡSܩXJACy|A4xM:hHv*NDW3uxl5v* MM{Ծzb=lL!bf!f(bN,)b":7w 1scBsâZqŌB.\)d He=˳l#l4 1c/se*`he̕F:;tfަQ\5hidz*_vqo0NXX;{vth7^@?ζxk}grd6;[0Οmqp&L3-}Lw 0c_{>\ƣ|k3׍ܑ(ZH#jj|pFNޜA6B` >B`{Y5p:r^>msg?dwk#8k{~Gnwbf:msBpQ6:je#&}WFȆԲ:mvϏ9!dȂRl#)LeTcN xL;5=p΋=H3cX:(HecZ#7eۈh[ʘp-5 Gכo,n>I-_D0]/9q,SqG:C5F# a`9~erj~");<K4NQTChhZZ-_PI +;E\qU *zԶ met3=T." Zl(Eva!_^8uC9Efk]|̽/CC:XJqS<5j]YՆkc?J<~h83m.)c}Ѷ1wխ5=7yi Q98MMbݵzsK\R ++? ֲ +*wͻ| ![9;]>S>c3MÏgx?:ϴ|=sR8EOr>&vG|Nʖ<?pK*yHiv=ۮd\5/3ǥ(|ԐQ# +hz;kCv-ʥ?q9PMP WpեWϚ5WNU|kcզl砍I,= +];.o͜;'>?4nSή.EofR=F=kO/(3f{l9M8d{Mn"jaqe˽q]k9p1O{~mhQ(@9Jk%ӶT_/4>%4v-SW26oKגz/ Jw> +endobj +1142 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 517.798743 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MkdocsExample.png) +>> +>> +endobj +1143 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 517.798743 297.637795 502.784343 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MkdocsExample.png) +>> +>> +endobj +1144 0 obj +<< +/Filter /FlateDecode +/Length 567 +>> +stream +xTMo1 WƉ;R$8.8춝%|dbF؞;`@ ewOxGU#v}+DrTRl :d.Q11z/i*ёdBp J`~y4W'p>2$j0d z40bCfD{|2W_>}Ƃ J帘އ{8y(Nmv}:wƫ?8 +Z| +=.wߩ#eV |}ƥӆ-=ӚTT[ik ]*'#f{Ux'+ _=\ +1mwu#G*nbT|%U j@x+n}A(IdpJHM5r{qZ3 +QS7qGztHj2w]!=;'} Uj*9jiS 56^;6$f󮰗3iyzJw0؉)?\@VRAr.yV r>DP muo7H*78#U< +endstream +endobj +1145 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1144 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1146 0 obj +<< +/Filter /FlateDecode +/Length 382 +>> +stream +xRN0 +dv؎v@apA* q`[8v7#E j&yv;A2h?}es)9 +BTQԀ1aJ!SJ w7|))xCškjonXrMVUXE(6KldfM0ςO= }@m? П6{513KcZG(!%9\_\߮| MR6*-)@Ixl3u#> +endobj +1148 0 obj +<< +/Filter /FlateDecode +/Length 396 +>> +stream +xJ1 }1i&eԋ0 >)&śNiI( Y&5'mX} ע-w1#Yɀ OfŒ?UzKq^;"i&**f5,(GxIw_>ӳ_4_YðApnt4%ZA7%X1k:<;?>` 6(T[Lnaq(\M>o7~:|&I|4WJk]&]rEOT-x\iQSuA3Pʉ", eun{4$Qs^XEo sXlBnQ!KiOv3WJQ>\RYb˺Uq㯊y? +endstream +endobj +1149 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1148 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1150 0 obj +<< +/Filter /FlateDecode +/Length 385 +>> +stream +xRMO0 WıiTvh%A|4̎% Evd">% Rr/b˔B@ݺW c  k諽=nkR_kʷXƢV?F.EF[b#3nz~YS y]zXz\bYo6{513K0g{MX#L L}gn..| mMR6*5)@IaGs݈,r2O<]/LKwQu=X C>&bfE?rɁS +@lrP_MhR I$KŨ;Y U>} +endstream +endobj +1151 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1150 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1152 0 obj +<< +/Filter /FlateDecode +/Length 2399 +>> +stream +xZK+5W CjEiX,@jh44a3w$/q}vMR.}s\by-Y>]p G1(\0%h>,Nx&*^Tw˟]~滠y!%3"XobI?| +ƗwǍ +o TŤ21p?e_nV?Ʉ93Y)~f7GQ37Yҗ/"e΢oMY*X WA/{Z/ϟ._?E$dZ~S^%gR+" Td["u-?M\[L4O]5*ȡۜ4.ҧv\DJ&UZ6DM*a~z[kin^ok!ѕ ^-knk9ͽb DOоC&B#rZ0mViCy"DoXԑ_! +<*PFU&ɋ]0BwQĺXhEeK{jNϗ+0jQ e]nkWC)W!3+(xE6q J}O?#]rDWQfݟosH^9֗eTvW,X-; Ɂ]!Y8|^:3?nHkTb޼.{.H" +̙D17ݪoG$ ᮱AA[sil8/:ջly˲;*`4(DZM'OZi+Ee ,2Z 3qB90A="?1biqYZ+3 HYPg!P%b]tJR"&)ov6F4X\V^1]rrx'Ѕyb Uo;Ma^+D&>HkC0׍jx8kl\fH;+]! f7HkXXq#{ qL{Dh2WdQQ4դ:ǘ-j;剛)NzT \;;3F&Bݤ7Z=d˾*a/K{+PF&CUR_)b[A{6V-Mc$i21B Ru +ycGP"bC_( f!WhH(t6ՍL~pC+,d\2jh͙ +ytֳ5IfaѬ + +$D~c לxI "yI] Tc T(PUPZϙNh}XhE%DQ"aEQ@]X:LDI]{pF>ђSKK랬USE\JAfNpn~TԢl@m_XC: ¯k5!Sv'nTIRuD+HGF X_AI-BҖM % ͤQOJڡNsPPY/5PN4|ˆ0"JVnqMcOt +eq|OHLh(wBs*I`4dQyzvA8.\Y**KCRKqYnI]Rfv638=4|/)8I,:}#רVϞt4ZC8V*ͺhݞ|B2{5i}Lre'y$CA+Tuɲ_ᬨQhI]+^7TU93\ÞPUZ gڙHTD9FUS9E\eS%"oad̉\}#e] 32k$8Ux!RB+T矃@ bAD`51"/ ;~E]{-&aapkC= +endstream +endobj +1153 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1152 0 R +/Resources 4 0 R +/Annots [ 1154 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1154 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 135.094122 39.386457 120.079722 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BlackToWhite0.png) +>> +>> +endobj +1155 0 obj +<< +/Filter /FlateDecode +/Length 2608 +>> +stream +x[[o+~ׯ( oᇠm{>Hk+(pK.g/O!kEqpKQoBÏ/g>̯/Gk;FRx6ȃǟ?0FY.4ߜ@=\Ȫt˂)8 d953Kg|#~K4'^O'yEB@3X4p8YLX ۗ”mѩ`5F:*/I,r9|'AIhtPI +37׉_!Q1g6e0~>|ћƢ"1M"$•H"8#WpIs.B*$!8^2=7H|GA(B}Ɏ<3-hrMcr0w/3dF Z`CKLGlaz#0xaxqz> I5RPvcX794G Y׉[XiX#5F~ Xg9qň 1:Ԍ4Z5 bOdWo7Q~qVjڇ5Ӥ&`obͲJj$!ɇhfߖN5E,g/*Ws$&mr&Do+>a񸈑<}L̫:&۩U8F +Q"R +Mڕy%a * GP4l$k3ATƆf왾ܡ4զ 12A{e4ҥӈHd)Ȍq WPXi&:U!{"ݨ&,#uD.:Q$]Qzh?{$%ƙ]"D:S \IKrh#mCn繼_KCUXf9o>0vExU* "*>Gxj0&'$Xso0Z+Jܜ)ͯ\. `BVf԰W'"mQMaGpԽ L|jdb.Wnx{M}sTddBkvz61E :VN6xez;\Kb3K[2tCgr>~̬^W9ST/y@^s8oDoh4ΌW8pf4N?S6w/f<nu\:*LǪzxO[AI3f]Kj.2W Ыce,V#=wcDd{4Hmu]=sO^^;앋&9w*g!CrhwDV6NwEG]lca ~Z~Վ429|NR\KsrWkPg=Èp=uϮSSi[;mݚ淺]%AtՖw`!N^~udC@cipX|{ˊeѝW) U{ʽt`e-D +h$f~92{3WwG"tx0njtf9|_PSq/.N˟W)_v/-xۋq1(j4*پ=p׮4R}r}N~{|Ϩ-T<oT^?Ù1=É)FoW~+~f(<겋ѹ۫n9`0=ʏ[u;YB̽14lkWհl>Z,|? cBbvd3 ZN6M&ЎP|pkz0.ޯ:qxhב!ZyzG:^-O dBFn{W|m=YtSJw>?ґ֬ׄ=uy|6$Vr;-(8Mtvxh*zЁt/"ę?%mHAXe "N嵐Y{[v}|<5`+&=I?B9;\ONΧgU*Vtmފ4Bnxq 2,f:zOJ"$E8_ƊA.%]G30TioX/Is@>ؙ39} +endstream +endobj +1156 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1155 0 R +/Resources 4 0 R +/Annots [ 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R 1162 0 R 1163 0 R 1164 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1157 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 286.886457 720.773622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BlackToWhite0.png) +>> +>> +endobj +1158 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 720.773622 297.637795 705.759222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BlackToWhite0.png) +>> +>> +endobj +1159 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 638.194422 39.386457 623.180022 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BlackToWhite1.png) +>> +>> +endobj +1160 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 638.194422 273.386457 590.944422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BlackToWhite1.png) +>> +>> +endobj +1161 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 590.944422 297.637795 575.930022 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BlackToWhite1.png) +>> +>> +endobj +1162 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 508.365222 39.386457 493.350822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BlackToWhite2.png) +>> +>> +endobj +1163 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 508.365222 241.886457 463.365222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BlackToWhite2.png) +>> +>> +endobj +1164 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 463.365222 297.637795 448.350822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BlackToWhite2.png) +>> +>> +endobj +1165 0 obj +<< +/Filter /FlateDecode +/Length 2990 +>> +stream +x\K#W&Y|9 lCIb ARdVY/V}U,:KQ"9_~9Iɛ_ j +UJI 8 ?O=K?+*`~E yW\hX 4k)?>TeYEZZ!O*+ϯ}STlq\g P^roc1-c~xm0-׏ywZrM~fk׊ڜ=vi?O>?\,$$0 +zX4/lą|-qBQ0?7*H2f +E:!tV+_QVZkTv,=]5X&A oɓB,D)u{bJШR+ٖDt[Us1 +}6ǚemjB_gWTdܦu[}:2devXGq\8}?c))5zRG0o'_cDc\m,%o2~aJd0=C߁C*Bt>7\|sou}$ HNg@!Vބo#F@@X +|CnX7TyW, 97ϋG`e]O@ȤA#=W 䤊I.={gnxC|=8c·aa` $*[d[l0B)=<*~^zVtAruTD}>e"㻧͵r&Lu#Wk,CvuoAtUD|)0YxzyTibah-O[ӎwedjax|v֥=\ wQS\qv+AW2SdH(Cv8$\]2:O L~ӱ,scZ 0|܌Shb""~_q؞!MehϐF(zdRFg[Cz2l~H`C$ƼI9!:m[tHc#tHc{Р-:e˱Y>u8v1]|ڥO1PWI}.uԬK9N#Qk^NDBgy󍧹L:0e[8ApKoIr_c%t0bMZ9~M*;ֻWfKmvD&Uഁaԉ[%drɕ|ߙE+0{ hwYX'|~ߙN+X6^;Nz 9CƩz|?(q0䭷$ڽR)!̤@~uǖÞ-UzHjI2Isz;s0xxf4X.c♲ؗw.4;'2]wm|_[7+'Bt=Pk[ާ8nLw [MxBO??2% 0x-2VLP#t+]=D0SBn`rP~oe:9NPvBb?iw +endstream +endobj +1166 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1165 0 R +/Resources 4 0 R +/Annots [ 1167 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1167 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 261.036066 39.386457 246.021666 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition1.png) +>> +>> +endobj +1168 0 obj +<< +/Filter /FlateDecode +/Length 624 +>> +stream +xUˎ0 +d8~D. X%4m; Dq$.`+&Y8q^(U=6F8x]N>f' Dbt> ?2_2z AT@ RW>_hTMeURV,5)#PaJ]B>9|; 'M:Y. g:k8{󳂞Īd7a11W +|HIeûw +XDߏ×[߭!"fOLى'<޶`!$kdS#VmIJde/şL-%k6?o+1¡x^džiMW vaR8P4uN30b +x>B-Xy3ozX3^G^Z%ų¨.&p/41tbyv_\``??l0Xi`t|I?c 2mhH02n_ۡ)PvS˛7ڜUho9咅T(6ix9mQdErPg`|3Vю RlDnr,:>vt +endstream +endobj +1169 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1168 0 R +/Resources 4 0 R +/Annots [ 1170 0 R 1171 0 R 1172 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1170 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 294.611709 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition1.png) +>> +>> +endobj +1171 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 294.611709 297.637795 279.597309 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition1.png) +>> +>> +endobj +1172 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 197.018109 39.386457 182.003709 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition0.png) +>> +>> +endobj +1173 0 obj +<< +/Filter /FlateDecode +/Length 742 +>> +stream +xVn1 }ڹ؉<^*- 03t+sdB*\cST W(CBdrj1=NكM? 1c{znfԠ~OGqT\O[ΜR8;% :"pܜbLf؝<1>cp\ף_yűz+.be2y}XDqI6:6jiP}UК$8}Im?86 %`4/}J(-/=ee=7{6Xsֲ?<=^se Ge-P-L2wE2*9_> ~cû$&[" 9 *h8wȯ%RY4^. Y2Fm+?]lxS(_fR+<q"CAYgS*LRz} ehe؜q_{n(KYfd +endstream +endobj +1174 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1173 0 R +/Resources 4 0 R +/Annots [ 1175 0 R 1176 0 R 1177 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1175 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 297.840524 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition0.png) +>> +>> +endobj +1176 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 297.840524 297.637795 282.826124 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition0.png) +>> +>> +endobj +1177 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 151.450124 39.386457 136.435724 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition2.png) +>> +>> +endobj +1178 0 obj +<< +/Filter /FlateDecode +/Length 740 +>> +stream +xUM1 ϯ ˎTe"vYqpOvavN2q^EDs4arX\ dbI)F"b8c6i1XExoLZti@-TR]r4ٌ4b95(l0Z(dբ,N1>}p0q9#e槀nb g+yS,x(RrDkK̎#||[ˆ;an Ar6ͅX\䖸}klZ֋s_; EQ5WX1^1ɆO>Q'9p\42\> +endobj +1180 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 291.606646 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition2.png) +>> +>> +endobj +1181 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 291.606646 297.637795 276.592246 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition2.png) +>> +>> +endobj +1182 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 160.230646 39.386457 145.216246 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/720PTsunoda.png) +>> +>> +endobj +1183 0 obj +<< +/Filter /FlateDecode +/Length 750 +>> +stream +xUn0)gƖ= PTZn*Z_bmUȱc{~70N7Ƙ~BNcSo(Vya 1BLF ZQ'-D'4|~ Y^ZqN-AHy> W#Xg ֗ȅQѲu(<%Xt5 +W?cUCb?&>d2~k +gyoh10ItW ?~@۵po:z. (PvuL-jm2hCoy 6…E&ɆAISz~Fuh<űHun|3Yπv*H8>p/zc?ݾK0ñ~[$.lɓYv0 + s1ixq$ rx=s E}ފQ9寍g^ 69(vlEyhJ́csu=+,U薎. uYØV}RFΩug0z &M_=KޗDNkBz4kDMF"!j繁 +]fik]HC&]bso6ngy!K)j>kʹZ+mYΏA.)b眬RpY {<;48Ƈ]f(K4\whezČۿJ +endstream +endobj +1184 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1183 0 R +/Resources 4 0 R +/Annots [ 1185 0 R 1186 0 R 1187 0 R 1188 0 R 1189 0 R 1190 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1185 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 659.238914 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/720PTsunoda.png) +>> +>> +endobj +1186 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 659.238914 297.637795 644.224514 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/720PTsunoda.png) +>> +>> +endobj +1187 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 576.659714 39.386457 561.645314 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/1080PTsunoda.png) +>> +>> +endobj +1188 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 576.659714 555.889134 466.895272 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/1080PTsunoda.png) +>> +>> +endobj +1189 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 466.895272 297.637795 451.880872 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/1080PTsunoda.png) +>> +>> +endobj +1190 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 359.917672 39.386457 344.903272 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition3.png) +>> +>> +endobj +1191 0 obj +<< +/Filter /FlateDecode +/Length 941 +>> +stream +xV͎6 )UC0C`(zxꠇeɞmSdZ[6E~HQ N)c|^&1ݤ|~Oe1QeАMYMZ<^ޠ1{`Bes:S` az3[mԇJ~^r0S#UgՅA֌9!2Zdo?t%8c4J|,ĸQ`|tt٤.dᗟ~w2ZǤ_=p5Q )D"=D*4ӀD#ҔT[c"qm}n=G ~n'mAk==!\e@_;c= t[ۜ|hh9-x@ה +ZV5-RZ( +Rawf-eAfcو,g8,Af$:AM=c/-cMU[p̜zMxeͣLJDσ)1lܕ£ ˞&]a% {z 0:weݹв' Q9dncߍfh[ ǻ@w"w2x  +0|o$tg{mQ'K s;G>"w\RυSfh8.-VnH%hO܊3@6u#ԀYrqe7yv- + +endstream +endobj +1192 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1191 0 R +/Resources 4 0 R +/Annots [ 1193 0 R 1194 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1193 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 293.426341 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition3.png) +>> +>> +endobj +1194 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 293.426341 297.637795 278.411941 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/TextRecognition3.png) +>> +>> +endobj +1195 0 obj +<< +/Filter /FlateDecode +/Length 2940 +>> +stream +x\͎),vpC'Y aFًRdniIɻ@xޝ&٫ "@N'$'c}Wƻyk2޷ur-_4~~3YKv?Qh\um,tT^\iqg@Z>q-^ӡ\,gpeN譴Yj.T撒 E蔹$**YEmr(J* +MהIFDQiy3YK]TEOϷ5byIi5T)^!)tf뵅SelV\I+eT_]SfWH-<ө|v[).Ry.V%Nۙblebz߲8q4M 5eigK$oXU5FCxа_Nc1:˟OH//{LV*LcQnʭ/::e:,u-:Y3HKWmpB.>9'erL;_n|WgRM:{+s6&`~Q+cK^7kiVBwڈ1CtoQ(p'S (ԏwAR5,K-0c(@2p2gqu !|q9Ƞ+0BE@s@y2 j>U8tG8 ^Dc{9lS986mRA#H2 ălymŮ& + #li* !#])9'O49O4#h` +H.MھVhjĵoˇH:Z"(u׮O4Lh+֌9rȕ+M oze޺ 6- lC(ZS:;$C> ٻȗ4 8`sWW$j^LQcɵ2?ﺧ_G6Ti&-eWtF[9+$ЖkoVj6#⻱gd"WFr|C<{3֫ОZf4-miٵG.W{[2V/Ԛ;yFr8P}ΣCjY@b{jSE`cHt +L0)MIs[o Fіn-ue1r] 39S/]րf'1U3x4vݓ13lJUI9+-\%^-:Vq%y;餴6[t>>3%v=ݶ+zAFN]+YS$}]lGPBa;Q-S;@]@0"s~=@#wDajaZ5C()&-7GD1Pނ;@_T/З }w(zT:MC 1\J>נ--Bra{K +Q \mndwzGbz#D9}`!A%Dwq,ȖM0fV<;M(-Go0 +S4-J6-B0X?z)A#7Aj`mrshk?:m<3ȾQ۞ȥd4rsRtrNQ$Gq aHΣ{EPgA=b7P +6]|*=EZ0֧1菱j#x:dmk˖,L*mpP#ao. FrXjGvm!ƮvavWߺ؝,/oTL^rMt)rp/CZ+#y]NHk`z{Ծ~gcdxerҝpIgW;v>losӫ+U1=Ihq]5PBҸ\>?vXJ:lԴa,T=?=B0,ȡ6Ze|{,bG2li9ݓg5ܟr?8}$¤3}ޤϖzl!.i$ C]{'#!pP/ cۈoV\0Kx5:=[{{e$,/;޿jUv=3gʭNJ5$o8?hQٳ"a)((~\:-gO|h݋y+W~Gpyyy 9 ^Hry?Z_@e㊐ZbH9 +ku!%99?]arI{;h&gjk$)K9>AuιNrP +Y88sɤkXLZD / 1veK#;O}b48/ǣZnZ~Ez~p [dܾsb@2n'iԍ + V[О{\x}w"Cl<Kа5o1d't͆Q[ }TV|X>> +endobj +1197 0 obj +<< +/Type /Annot +/Subtype /Link /Rect [ 39.386457 320.150574 39.386457 305.136174 ] /BS << /W 0 @@ -15749,29 +16783,29 @@ endobj >> >> endobj -1131 0 obj +1198 0 obj << /Filter /FlateDecode -/Length 792 +/Length 791 >> stream -xV͎1 SI'R "YqK8ɴ43vq|l΅R4,K$V))Ɯ!C-'CCpdOTKQ&E()cSf֙̎ƪr4l-!{S`R2c0F{,|J fJTNT\Np%[̕ټ)x(ftDCM9f>˭נ_&NG0%fB9a?MFբs#FΖu,<^L2w^JhC ϪĆ04#hq%k:\{ CC'vF8 X.9_[|-g&h$>RL) 3c÷JjTz>y\Z'D4N+WQ$jJ5HIa ? 0,${(ԎUvVy%.>UՎ +L=xpd(1fjG'.A^ WPhUA_ZUz>pHDE:z鑖6p5A"O%\uk yÿw-gq{4]mnl )s -xqx[Pc $m:P ^@w:dՆ_27an}L^縑EgRnN`Qpu+Yw/0\T0w`Kkoc![z^U?i +xVn0 )SEI% ȡvv)a4.v؆v)[NRljÑ-HJ \(Es1< :Db!< ,L6 l<#|>?O%Xr2-BIz??7{<Fv4Zn*gNS68M9 暢% cPb@7Rpڧrw/=K8\NpCI6 %Blʑ7;_ T}7_73v*>/O&DhK1~dX-:RLg) fq·JjTz9y\Z'D4N+UQ $jJ%HIС#߃ 0,$+ԆUvTy%.>`*2'.s+VZj'/_)>fj{/'.A^ wU`W*U ǃFU:W%,賎mrzedž9+\M|ڜ%Z%1hqY)!vr,:no!b`N/oKZ[؂" e[`|jqkH]ǴbBK&mri72h&T(8Z: +Z{H*@jǤtejoc![z^T| endstream endobj -1132 0 obj +1199 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1131 0 R +/Contents 1198 0 R /Resources 4 0 R -/Annots [ 1133 0 R 1134 0 R 1135 0 R ] +/Annots [ 1200 0 R 1201 0 R 1202 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1133 0 obj +1200 0 obj << /Type /Annot /Subtype /Link @@ -15786,7 +16820,7 @@ endobj >> >> endobj -1134 0 obj +1201 0 obj << /Type /Annot /Subtype /Link @@ -15801,7 +16835,7 @@ endobj >> >> endobj -1135 0 obj +1202 0 obj << /Type /Annot /Subtype /Link @@ -15816,28 +16850,28 @@ endobj >> >> endobj -1136 0 obj +1203 0 obj << /Filter /FlateDecode -/Length 664 +/Length 661 >> stream -xUn1 WH$KE !3NPKI]@He'qb=}_HB/R8'~'LO=q۷:Ȟ ή$DPc!0FO)F`t?}M%z`a',YNaу{1m꨹:d*N\.qw6)V2v`F{z] P*\ܫt V%^*ǎE#KBKr'$wT߾{ơ 6}I<|vǛ^8! 4&,l`BHYG5DL:컴fʓʩtUn 6|\ c`8ʅ90ҌR<9'sFp>Qj6ϛnn|'ڃ 7;,=is?'94=;!Ќ+w;y!f/-]k6å遘Ðuiw y0ث$ *ړ^zQY4E!W9]Xg▰z7@؅{6|ҾokLc9>!K;_3}N}m|֏hԮ| g{ d@}s!a0zUc(;7(PZ?*Pʸ u +xUn1 SH8KE !3NPK8?. $Č8}E@ш^5Kuz =٢nxHd\>f's$qOӇT%Qq!xƜ t}zf~L9jʅӤT% nNF;JfЮLh_}Y(-=XN1(|R{ndWcرX)'  = yxݛ7 P~\O6gwL'=Dfbm F.khrλN+5,݆{j=d ; 2.A10/8P&0]s0w`]cO}|M@oD{0cfmg>@t4J4 Fi@6@aȺC;KΆO2`lU`ԓEtQYkt|u*狳kqř%ͭgcie2v&FDGvk=gXFgJzG5=#|Tw49u3VȈ~zueo83N>GIE)M2{ ?ЮouUȭ*P/qIuL endstream endobj -1137 0 obj +1204 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1136 0 R +/Contents 1203 0 R /Resources 4 0 R -/Annots [ 1138 0 R 1139 0 R 1140 0 R ] +/Annots [ 1205 0 R 1206 0 R 1207 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1138 0 obj +1205 0 obj << /Type /Annot /Subtype /Link @@ -15852,7 +16886,7 @@ endobj >> >> endobj -1139 0 obj +1206 0 obj << /Type /Annot /Subtype /Link @@ -15867,7 +16901,7 @@ endobj >> >> endobj -1140 0 obj +1207 0 obj << /Type /Annot /Subtype /Link @@ -15882,34 +16916,31 @@ endobj >> >> endobj -1141 0 obj +1208 0 obj << /Filter /FlateDecode -/Length 1073 +/Length 1074 >> stream -xW͎6 )QDI%`1"!%-P",cgAxFDI0j TA+B͟ IU5QL3`L/(=~wXP1տDvF}S6y! #!*Ǔ_G;MZsFLO6'.dhktXq -mt#st$v~?ލКDu|5^ 7G)n[T0h?F,j +cyERCQS˓V` /%dw.UYMmEe}%i,2k;o(lسT7k+;R*z6$H䭕(+H *(]Lb|.7Rb mڪ%{R:Yt&9+G;.D,JŃTzy1X#5dlw=- -33t\k/nw0,svjvzD@} Ij-p^P" Ͻ@ -rѝʑpi]tC{Y±VŠ?/E׈QF`$X&Ĵ շ}lΠ}nj&>a=pg;){X[q; i&y:2 \uP'==m - K <h|󞨛+`R+QÈۧ5,MSZe:6Gyp4p/Cbs -"@n\Gμ Ra[J[̕ -N^롽_Z9lgg'1Ej~s添7K^b]ڴBͷ;}א=Ɛ. _^..H0L,tV1s;rw? bQ +xWK6 WD%QS@уǻzH(hAvǏ0j"y7σV͏<σ%E 1:BG) ގF܂6^"jT=w2P4SM[GRCr}0+seb]/ʭREĵa endstream endobj -1142 0 obj +1209 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1141 0 R +/Contents 1208 0 R /Resources 4 0 R -/Annots [ 1143 0 R 1144 0 R ] +/Annots [ 1210 0 R 1211 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1143 0 obj +1210 0 obj << /Type /Annot /Subtype /Link @@ -15924,7 +16955,7 @@ endobj >> >> endobj -1144 0 obj +1211 0 obj << /Type /Annot /Subtype /Link @@ -15939,31 +16970,33 @@ endobj >> >> endobj -1145 0 obj +1212 0 obj << /Filter /FlateDecode -/Length 1030 +/Length 1031 >> stream -xWˮ6 +%QbEEh _HzP53it  ;@ŘwqhPӯ85 ݟTHh_S.Fi 6:UaגׇdU:İg/ ^?PhE"hV@GMέ׏O޿ -Yɮ\g8MONtgG;}kӽҽ0u/롽'smboTǷ}+}aEk`P:0glύ/X-~!ylwŁ5?^WIzl1*JxgxeK!wW4K -?_`'FPnMё>tɫ&FJQ5Ǵ8i(uQf6\Bx>Sȑ&BNFB(72Id( $-0"4ot'd} u E!gc7#2e`4ᙩeʙ޲Ӏp"Cr{ۄ;-a]W2MOA-[M턅;xl? V - nYڝ Rk(Ygl.{R=Si٫ΥG&KoCoڇDR&#oSd7|;T1D:Zx r9ӆ܁jv(3ЉyrlIvY))C=d(E638:=䐼WB͵cSkjۉzew7͂pK o]{=mL^&4{eמQ69pzp(Lꔧp``yGө&+j0FI @آb%N žEnwl'#CH(OEΟ|]܇48_۸? WJ6 -}H#_/u2)PT曝`ea7x*LɊ +xWˮ6 +%QbEEh _HzP53it mYat|Sn?.jϋ *$4)#Ĵ +@K*t~cykC*hbXQG3`ǗJ^RTUQm(s"4GeE&FwvdW^+ F:VkwЙ}{{sa敱0d"50 h p?Sts<} L\ԫH=R%[3 +t۲ֻ+K%Biӟp`rGMm#Lhl֦HJKUDm[#xƨcN4R݉t( e.!<ā)H!j'e#A!$ dmzYJ7TmF>ۺrw΄⎱2EQԲMlLoيVi@8!yۄ;-a]W2MOA-[M턅;xl? V + nYڝ Rk(Ygl.{R=SiUΥ"XMކ2u LǴߦn&vb8AIa7> endobj -1147 0 obj +1214 0 obj << /Type /Annot /Subtype /Link @@ -15978,7 +17011,7 @@ endobj >> >> endobj -1148 0 obj +1215 0 obj << /Type /Annot /Subtype /Link @@ -15993,7 +17026,7 @@ endobj >> >> endobj -1149 0 obj +1216 0 obj << /Type /Annot /Subtype /Link @@ -16008,7 +17041,7 @@ endobj >> >> endobj -1150 0 obj +1217 0 obj << /Type /Annot /Subtype /Link @@ -16023,28 +17056,29 @@ endobj >> >> endobj -1151 0 obj +1218 0 obj << /Filter /FlateDecode -/Length 805 +/Length 804 >> stream -xVM1 ϯ k'NH.+8Lv._Lgg;T (Lc:8O^qv0٠Ct&xI3rTY#ZZ8}~LiVA!F.@͌$uiƨg>d޳#fۨmdYF]i߼ *>gA=z iculjZdtZgS[lFGBZ{\P!}OC sD`>4kE}kApyj\Xj53mdcI䗒X4A#`l?ls4U}X˟1 !wX,m-[ꑥZl>V_oôځPq1{}ZU4Iw&24(u>`= Z ڸ8t| LUjdMV?2>B;3N"}T'":r?RS";מ䠔rsvF&]=)EfBrz +xVM0WXB= pY$! ]+vر='@(Lc:8+8;=L6 ^EČU@ֈ`V;zmN1Fuma&3z &`'ofKE6P<EA2UؼW,^I 2c^<|x[ IOҰ/jMo4!3 B!ȳ%`6B6tQ~";Q}.e ,9Wm ,6z_~&ymm㚝3͝ #-4 NȜq8VbJGyrV" Fa+fPڥgta߼ *Z톙{P8@HC,sm}dO-HSvtZvP[låFGBߵ(}\Pa'b;? 4l3f͈ھ5p-6mG52lZZ3mdcI!嗲sGFG+ _iG5~iW7f;ZlI riҶiK=qOum-~XW"2kf+L+H ۨ%y[@Tw)"Cjr]ġe8dZ(R!75o[3V*"Ko -8I ++) XJJ?%DvN= |]*xX6-LtL9$/vo{ endstream endobj -1152 0 obj +1219 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1151 0 R +/Contents 1218 0 R /Resources 4 0 R -/Annots [ 1153 0 R 1154 0 R 1155 0 R ] +/Annots [ 1220 0 R 1221 0 R 1222 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1153 0 obj +1220 0 obj << /Type /Annot /Subtype /Link @@ -16059,7 +17093,7 @@ endobj >> >> endobj -1154 0 obj +1221 0 obj << /Type /Annot /Subtype /Link @@ -16074,7 +17108,7 @@ endobj >> >> endobj -1155 0 obj +1222 0 obj << /Type /Annot /Subtype /Link @@ -16089,34 +17123,32 @@ endobj >> >> endobj -1156 0 obj +1223 0 obj << /Filter /FlateDecode -/Length 1054 +/Length 1051 >> stream -xWˮ6 +UD""&-PtdI%A3s3uxIK0kT;?/V4pdwsD!@|ZEh)*~0FD(Y_?MoPzmDTKinRr>O,)]2l љBKl3~gL蟞؅dAod`X9O 3nS8{De/O1w&!e>y\dkǗ`;XmGf-DT{]Rp5%c!v/pE-SڎK]w2!;>U$K2쿒L՞B6$ž5LЅo>vZcZx[ u:rտ:61Fwz膘@+> 0 $~ .bCU'͵*0w~L-a"۲3sUQz +xWM6 WT%Q4S@уǻI?Je;_?MoPzmBRinQ}[2lMٙBKl泋3b3:zzt .2;hűr4? +fFjL)||~ϐКD2|z]`AD.(y\dk_ov9c]>7{m%2F*|'ۥع.qأ[m؜vc&q%#ٝEpKy#p<b?/k Y[LQI{wK:4@l\'u֗&9 b'X^{`Y!ee#p^/2k'] 6m!1/$cbA>hXH bu)TjGZ+YTIET /g!h!WwH8ц\:gh=")^<'I*r r*FQܺke,]wՊbޝʨ`8Tœdj%=lb_I}kD |*p^xŋǪEDs\D DrxV"Z4B`"_/U]+lWnRkއBfA.|6eL+p_2|TplQۮ /XvLF|/2 I-)L]!)=8ۂ  {{Vx7΅]W(dĵ q +oU~5etz +5ј@ۨ4`vFȳMT6գ ж|c;${9 }cO~_Fd=Ck |䣫ⓞCLOԂdP*c[#*=Su>\K+ðl⛶mgzU> endobj -1158 0 obj +1225 0 obj << /Type /Annot /Subtype /Link @@ -16131,7 +17163,7 @@ endobj >> >> endobj -1159 0 obj +1226 0 obj << /Type /Annot /Subtype /Link @@ -16146,32 +17178,31 @@ endobj >> >> endobj -1160 0 obj +1227 0 obj << /Filter /FlateDecode -/Length 1627 +/Length 1625 >> stream xY[[7~8ρju]Z<$}h`KRJ8-HG,ywfǺͧ|3N 朷F/3 _qD%vǝz,^3p~1!TبϻwaYέR28#_Vm"R\}AX*!5ͪ67o&c9sظ1iQ! FU37]fopc3g&l>L݌RԦus9ݯ~" V~s.Ϝk s@=623@Mm sz6>~ZoAFg ɊX */dJk¦۹y9_:7#M֏k6;Q5i;,EA 7dWƘl&*!@6B!M+q BfnoÎ*M;=;Bsc7G`3uDžXVOA:g@z|ls$^2 MaHj˧);v<8F>v33Hp9IqVG?1`ˬøjC i+\nysaR~M k@l8&m:QNW BY$7XHih1kb_>PS]3Vo_#{O8R+t_teFú |NrnNm$RΣƋǤn7H%1uаOxz*,$@i*R\;تTs7%½8F8+zo6ƛ# k=6ܣb2h쐢X-QB9T9VŔ:]uxwWַ_1_31Z3+SCf\t;><ӄX w;L*Z~)Bk\n9Zd:U-B:L= >c`kI^VfGIU=9}n8@EqμҚ0%bS('4mB(l_B'$&&idHh sm,Χn9BCu+=G hр&(HQ ܿ; Wefdple@2i#979bAwmF.y[]tuf{i}/O ,Y%V(s/m&5ySOGrAx"P9H5[ gW2=8Oh\?{J;{1 yxĽ9׋kmy}1τw`RۖaߢL=: {00܎ \)YOzf:ރW>pT|y`:Y7ʽa-ֲNVkUVh1+; Cz?_>pS?ЛFޚ*@- ~*7v(YV_IRziOcwH7>Du]pf<5V 0\h<0n(XaHU[Ln6frRn -E +ɩ>ܣb2h쐢X-QB9T9VŔ:]uxwWַ_1_31Z3+SCf\t;><ӄX w;L*Z~)Bk\n9Zd:U-B:L= >c`kI^VfGIU=9}n8@EqμҚ0%bS('4mB(l_B'$&&idHh sm,Χn9BCu+=G hр&(HQ ܿ; Wefdple@2i#979bAwmF.y[]tuf{i}/O ,Y%V(s/m&5ySOGrAx"P9H5[ gW2=8Oh\?{J;{1 yxĽ9׋kmy}1τw`RۖaߢL=: {00܎ \)YOzf:ރW>pT|y`:Y7ʽa-ֲNVkUVh1+; Cz?_>pS?ЛFޚ*@- ~*7v(YV_IRziOcwH7>Du]pf> endobj -1162 0 obj +1229 0 obj << /Type /Annot /Subtype /Link @@ -16186,7 +17217,7 @@ endobj >> >> endobj -1163 0 obj +1230 0 obj << /Type /Annot /Subtype /Link @@ -16201,7 +17232,7 @@ endobj >> >> endobj -1164 0 obj +1231 0 obj << /Type /Annot /Subtype /Link @@ -16216,34 +17247,31 @@ endobj >> >> endobj -1165 0 obj +1232 0 obj << /Filter /FlateDecode -/Length 1347 +/Length 1348 >> stream -xYKo6W!9|ECK-P VCZ$@/Jשy|f(c}iykt?}t ,G|/z^ :[tJ J>uvuaJXl( Q}~ԽP@nfEIU&,}aqĐP"'tNs~=}20wH@ȇჯg6O5(|)Nҥ^9altآ e7مd5;J}h&O~4?y;y~BF3)o#P^S@% VZ`TzIhTGR QF'4(=!e`QMk<=ҪHe!QJ\ -_瓢hDVg>t~sȳd]0'c'Ȭ.-~=W4L1C-^̭2I<(`g<#JI%@JJ|A3yLtop$ӢDyn<&**q1iyy?(7, ]p;9 -$"{M EH"^Ú2!b!#~30筊&n'g12؇U -pI^Zlj{P1mI$$Y,XVTd -(ɮs}Sݟ=R.y8ۓbF #Q(itgAC8RS=ڻ9t`(JN w'D"YȤ"xVFF'euNR:C&%.ds˘|o&X};Ҍbr4!#N~=V9Q &x 9*dfzbP!"^Ú2qCF8)筊&n'ce\xaHZlj{P1mIBˇ +Ĵ.@! ֕3Yo:7].#׋=RQ{ÕIQ(itQ#Jqg{twGsX2;p5Nt'̾"]Ȥ"mJ 7շշ*x{M]^}W05|P >;7O\>3=GaZ}P&,t#)l2c.ۚ [cѴU +֓mlGIrf0OFFlS0NTB6b=獳L܍I:ciܽswk +,> m endstream endobj -1166 0 obj +1233 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1165 0 R +/Contents 1232 0 R /Resources 4 0 R -/Annots [ 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R ] +/Annots [ 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R 1239 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1167 0 obj +1234 0 obj << /Type /Annot /Subtype /Link @@ -16258,7 +17286,7 @@ endobj >> >> endobj -1168 0 obj +1235 0 obj << /Type /Annot /Subtype /Link @@ -16273,7 +17301,7 @@ endobj >> >> endobj -1169 0 obj +1236 0 obj << /Type /Annot /Subtype /Link @@ -16288,7 +17316,7 @@ endobj >> >> endobj -1170 0 obj +1237 0 obj << /Type /Annot /Subtype /Link @@ -16303,7 +17331,7 @@ endobj >> >> endobj -1171 0 obj +1238 0 obj << /Type /Annot /Subtype /Link @@ -16318,7 +17346,7 @@ endobj >> >> endobj -1172 0 obj +1239 0 obj << /Type /Annot /Subtype /Link @@ -16333,35 +17361,33 @@ endobj >> >> endobj -1173 0 obj +1240 0 obj << /Filter /FlateDecode /Length 1622 >> stream -xYɎ6+p_$:H z4 0R܋)mt[(Ud  YɈhl_/.EF4_O" 1Nq'Yf c Q,?_~}'X09Qi/+#teAQT~GJ` -eC""jĨ%[+_~ 7yD*FO*z-j* tRq&ޓ:Jkm}s5{<[ -nC(4)Ӥ:௽pҗ+x?(]<7P~)Ph6w6D ŏB`I -dQ8 n):S(std05;71l$PD%qzCKTlmM &d&r]HǎåUt >?8E7RS0_+睹Uo@D< ʪd@@Kv*`dߵpÉF8c禍g3ϪG\1 ЃǷN^7"P:zNoD UR"t/+`΃ x -spMi*``3zyY%z"ݡ(b0=>ϱl?j:6ʡ1E $Ii ^HTx2gJց=d"#/ #9ڄKqꉖ>D" $;w1!Ǧa\wIA"|7o8M4xA+E+i/?丸mciS{ ʜ!uk*<ݷ#Qm#ӳz6q03=}<%T5옑9jt=^W\00 d; -'4s. hpQqS)! 4Z7M^L mRD,[eL1su˦k^0pIvBi9wmm 5qq]&ܓ҂:udXC1]HHn򜢜8m[M1'h/݇CELd8 vvsdSw=S{3:dģ QO8Ri@ -Wϑ8Hc۠ut]qmȪ4w֊ScybBZ;`2aˠw~P%5+QubV2w֡%̿/ޑ3r0eل,x.{nm |iA(þMՕQTӉcE(/5Ǩě!C -GmS\a'+Zzf{% QUw9ptSٻsZ#NS5S:\ձݲu2Da{&uepy>wo N`n47t |vkvd4;2.?oP_|sCχ(ʜ4949T,~g`wDW>d&29:JLz&\X@vj,q>Ѝ_(zl2Ge(^}_(4;TB mVL\ w~q9'_ -s5)T\: ӿ(p\ +xYɎ6+p_$:H z4 0RXden^*bA?>8ۅ3g8҈K ]c.4 &'<K?*ŌV/ys;&!dFM!aO_ hM43|h5Lm k==|_$<My^/>qa<9rB#5 Y_C/c[Ǭ2r$$ OFD)GIh`3uq{G'g):8Dnp-}a(fYVݞn_2~x)iq)[Z҂M1oǠ\5xoG6UqǚճHɘ|EHM/eHcƨx]q(/hЕ(J xRKc=2- 7P =Ainy{5-Ϝ@=x"%گg*c9ՍM`t!iM9wem 5%iqA.}iAhzdXC1]H'nc}[M>w'dů݇]E Gʻgw ŁQ~W2хQO8 GRi @ +Wk$тHc۠ut]qmȪv|w֊Rybp# Е!n!D A J:1d;k׌ߒ!jL]k2 2&6k{p=6JGiqb\ñMUTIR%(/5Ǥ亂)챇Z+MW +Fcw;7ܓ(yRG7+:=Q>o0 +à3:\향Dl n{&wehy>wo `n47xs>ڢ! > endobj -1175 0 obj +1242 0 obj << /Type /Annot /Subtype /Link @@ -16376,28 +17402,28 @@ endobj >> >> endobj -1176 0 obj +1243 0 obj << /Filter /FlateDecode -/Length 550 +/Length 553 >> stream -xK0 d6^ݤ`Q?+v|!sd)hEEDDHل9ZrO߆OYsd)ŊJR}O݈a6G먮)DUV$)6l Sll[>6&`k6}8ySI *EYW^ՂhZ42TZ*L`>}@M<|K BKbKrYl&{][qM]NU Mr#ψA("%e+@9eݝ灌U4om@Y[sQUOW.5ǹO+lK͋moKAP!k1k-4Zt4o]^" *f ;B$ΎϴHY9zPV0vO,OOBK=̻^I^}?T +xK0 d6^ݤ`Q?+v|!sd)hEEDDHل9ZrO߆OYsd)ŊJR}O݈a6G먮)DUV$)6l Sll[>6&`k6}8ySI *EYW^ՂhZ42TZ*L`>}@M<|K BKbKrYl&{][qM]NU Mr#ψA("%e+@9eݝ灌U4om@Y[sQUOW.5ǹO+lK͋moKAP!k1k-4Zt4o]^" *f ;B$Ύ  ˽HY9zPV0vOdXOߐRe=WWU!6u endstream endobj -1177 0 obj +1244 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1176 0 R +/Contents 1243 0 R /Resources 4 0 R -/Annots [ 1178 0 R 1179 0 R ] +/Annots [ 1245 0 R 1246 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1178 0 obj +1245 0 obj << /Type /Annot /Subtype /Link @@ -16412,7 +17438,7 @@ endobj >> >> endobj -1179 0 obj +1246 0 obj << /Type /Annot /Subtype /Link @@ -16427,10 +17453,10 @@ endobj >> >> endobj -1180 0 obj +1247 0 obj << /Filter /FlateDecode -/Length 3945 +/Length 3940 >> stream x]Ko#WX!@$9l0Ir^2f[V[,J =r*~f^ Q9N4}MW3Gz}۹R 6}lr'1:z9s:yw8N9퍱VSb @@ -16451,59 +17477,56 @@ A _K@$sVR*{-c=H3lEiQAzs/>9Sxs{L *Qn Q&:btUѝZcSZRk\lWV#<,=z# mٶete1o](^ lY0 p?ʩ7dLv}/n؁K΅kz .p%;YlO݋Y]a -W9{{^\ؖ;7svkLpQm}ק砅9l56Ebvou7VH )CB BXOأmQH Gt;}V-((lc*+*Dyl\HɰnE0%)zT$&o،e]ƒŊyS DF5p~~w?AH+庚k-ʧ@nz?y_;ZZbr^Mx}'O; ̼> )ܫ_7^?"#)BMa=) )ND +W9{{^\ؖ;7svkLpQm}ק砅9l56Ebvou7VH )CB BXOأmQH Gt;}V-((lc*+*Dyl\HɰnE0%)zT$&o،e]ƒŊyS DF5p~~w?AH+庚k-ʧ@nz?y_;ZZbr^Mx}'O; ̼> )ܫ_> endobj -1182 0 obj +1249 0 obj << /Filter /FlateDecode /Length 3347 >> stream -xɮ#D#4 t`ӞKw?VbU*C*qHg?'r t~;t&z;&i+] LRyxB?O=cF)3rH.`n 84XSM| !8!&KNO>sϷu7k)':_ӵnx^^{x[\0o|2a>?]\?ZI9ۖpďH W&A^7L%Ba;Biog Ňqnd4NG} S<.-w?? -G -l!\=KZ 0ɐ(fk;Q$Z gh 8c43LXVP~,D56u - w*r4DFF"uH:.בsz- ;&ɴbg'B=^ԍuznWasL\ej[m*Xx!a5 g :05G #܉ s+t嘹UvʻnJ*]A 9tԯ?|XgJo) Z& ݸ -qJ`]xy -cA.QQa!nH裸^/^җKF&%@Icoa$$1> \"&v%H֠(2#fgSaCz -8jN]W9uuT;vmuއ9onHxG8ۚxˋ`7RY> / 5dB!O6DA}/%!9Ux})E6һML3Ost Ec)i}k{; =ߢי/wYy",XXQ7rcjo5;#“v#F/ 1&K2$cݪIְL؊cgj#mL@rلG$>c1$XL J&LPOEj=4eNSĤ -}4iP6WD+3x_جtx{ّO/![d:|c`jLȬ /?[^-{GTXBFWR(¥SRuɝrHBeZ (w9`!\0)%GS#ښUDMfLةFfH&nY5dq6>ph#ȒeEIiH9251{0b\(ßIuK0-// Jt-rnA@XZ4yb(2y9&"okхK/ym8IĖBSYX$"-I`ʜ$D 0.^cw-+4aEx7-<j cwݮcS͊]~Yl4{?Ze@% Ô9hxRy9Zt`A2Dvԅ8&PW8=\:Ձy$PxO>HpV T@E]S?>|*=Jq%l`f=p(%> )2C k|io 3 ンh |ԂA`r -W0ÂuɺxP/Db}u},(A-C3,Rի=YZ0QFgP'J{+`pj'BJ(J*esVKGc&.n uv{rQs~wtձG4ڱ}{1øa oY;ե*7uDQ:3Ku(Lx)_lagPlK,@H-. ~>&׫#awRu(=jg y2>U)8 ^P]`W/҇*EXHmf"kfjP_;9\{UO$Ī)[9wyuUu"[WNo G.hW5$9mdb%ۧz=tg1Xny-ob%:Kɞe&;:941;үC#JiY$¥X;Vm< UuhSAK>d,C+3jQJ;d?+l/QyWiJn) JxO}qF=ot`r طl -^:MJ*@ᡄ7oro j%Ve ji=ctnZZ7ְ'b!'K`+lj-)YqQ&PyqZ{FP9XNqɖSybOrl㜈[(GiY()[=ғ̉~JE40o?I=\Kc0Q7 +xۮ_V)Q<hHۇXǍ%)J͕s DIqtЙ2E<_~:YC:S?}\s}i&l[n>bOD\GvHl{0-xØ=.! #pʵ9tHch?ajǥ6<;FH-+ߺaIV}F4%? +N!+4w G3~ILA0#τ%(o5X +eŒA8Zc3_pC}R(,!A82 \>HCqkI4=wL?;'x\kP7z8UpeܖL + /(xA@|LDܱw; {nez3jd{তU<%o CLÇu@kݍOSXShv\B]Dō4<t\(ĉhd[[yϑ1v"#] +c'$O8'ϗX @(0  )P"b4lxZnU}]Վ] zMR2#+.&Gb-MQ ,FDP2!J֠͑'sLB]}/%!= Q*"Kbhp,d9%->o-so'`b(u˽Vr -h)g \YMry89Zx.rq. 7#k+@j,469[5  [L-?ؖj!o0i_"BL@x֨CDendu(WI&1s;{( dxy"^mVPK_13 h"8Bz j%СsS`Bf gx"j8ʥzE`t.U+\;u.UKa_I))F^pr쬋G.;LJQԇ"r[,b {5ȌDD-,FZ+dsQRqn8yq˜Rr}1. ßIuY8Cs㴼 6,+ǷʹI_'cICj䉡 pzݭEtע '^,8ു'V[ +MeiG`\2I@Ԃ̉ XyvJ0~wݲܱ*M +3lMG OZx:0k}Ao"lWfMޏV 7H0e=T^VjeЁy 7Q=ua% }~*=gl@u` &{0&^S 8?\:Ձy*PtOIrB܇U%G ?Z0>7RC7'0B293pƧ.ڡp90!z}``X;=k{Ѱ`}|.Tŋy_G_K>J} 8T*$dvGgoI 1D)}uZq v~UR]H)]EI%l_jvihX]Vdߥmn]1jNѴ:۷3A]xsX]:^{MzSGJCK91TQTQˁ8q6s.̶t p˻Kp_18Gkja.T㢕GQML6Oا<yuU?PQ8U˹JV)4mrۤK`m,/~9kꉄXU Œ`+.N\`"p`B 9 ;9[NLf(/[CʠCxR0f!VR+QnícNC٣~WM+:enXcṬ_Y0痮k1^{^viy)QEj*Z-›"{[!/vr78dcvuoT:^GkGOP]p l̰E-bqz9~aE R_ҥ8Y`jۮD** ` W5?Zar'g|Ƕa3ָQqyp✔yR c)4^ *^ňZ{2@3M>@@[`(oQY' +%rbVuNvor^c›L̶jH5ys)nu9V38kI#XdòqOraC޸>uﲨ6H/jɈ<`Ů^I@sc-^N"A;@r|1|E uTZbӅ*1ܭŮ̹`c`SYuވ؅6u:zmTyvv0yBir:_q;S/0UO /FUqT[Hd0zzz!d]J#')9=}`CPxEzFڤ@t`,idՕ5jdgx\J+C6]^rfbX!û"-LQ}Pr樓+YKO DGkg18G̹b +k˗+dwQng=uߦr6 +vABC"SrTު8GCCm WQ8:&g@$s;?A0 !9edRt#чM҅ 0 endstream endobj -1183 0 obj +1250 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1182 0 R +/Contents 1249 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1184 0 obj +1251 0 obj << /Filter /FlateDecode -/Length 2325 +/Length 2323 >> stream -xn6^_6w,@grAeNy'*lOe\.E+_ D;3͟OV_'텏Vy7E#L!4j-ZӿNzR'M3`J?~>}8.hE}8.hE>㻿}$x*p9x'rRG6]387mq=/ϭ.q˕I7niK |Ә)4؞=}eNciq7;~y\p'$<`] z৵~Q+[wq(A iM`V& ,I 10BSC2F˳bi`gD1Z{W8{,LN6D$i mf5&23Ik ߣ4'҈IxsH4>l~6_tmπhxVSW^@ T{7C0!d6΅DBk7Oܵ0gF$bHp*p23̎`Hxd%qa @@ -16515,29 +17538,26 @@ X KgvF_3gIʕ  I (1V )}ɟQUJ|Ǿ0 3h4M+j-M/Uz͘w$}f{la>_ ^3CCj -Fu&佌'QJ&R] -U*Cq޴Ϡ`Cͺ`}^ o]|ԗSQZiy\ha /Om(^Ԏ1jyl^kv흄p w=sY qwi# 5SOvIy}k(8Yp@nȆ`_|2;n쉚++3\I21R 3PQÎǢ`~ut@L,flx7PoJ8&qo/k<(|rkL tr - 78>Xq4=:6h{1=c?RDfތN/PYBB7@P+A4HadtH/ -ۏߦ; +Ko:?TЁ]([r}A"Fjn]Ӫ4g2Q*'d\n4dG{73ZXA鎒  0\&32] -k#b`4h+)_٣ -FiJA.@NS -i0S7毠"<~`k(c>`& JBp cb+M:ܠc2; ކ/" "8  %HFR=J_&\~ϭ]QomR뛝Qî6\տW6Le"DyѢ9dFs GJ+Ѹf+7VWψq"aua\KߢXj}vW^[dV( GY#L] o>\a%DlnxQGoQUi5zW=PB1EMOvXơ2%Jzs%޷\Y/@+qڨzy/sFkG1p)Bo%( +\1o`Rh;ܠʡEhQߨc{oP@fzF@MsAvwS: +(Nu`U7 BP(_A{xg|>.G1^SӔj\XFB!5F+8JanKo|)_A%dE*y:NeP|+(siOxeM0(?NݿHR797)auAd*w3e _Ek+DTq?>@6KK(}v [ WAHo&v(LT"m D9hؼdFs ӕ&YVHqEVn`CT67{|Ebf ~5n;`B|E^ұx,.՗/ AD_ +P񾜃N_Ev&B1ȁ endstream endobj -1185 0 obj +1252 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1184 0 R +/Contents 1251 0 R /Resources 4 0 R -/Annots [ 1186 0 R 1187 0 R 1188 0 R ] +/Annots [ 1253 0 R 1254 0 R 1255 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1186 0 obj +1253 0 obj << /Type /Annot /Subtype /Link @@ -16552,7 +17572,7 @@ endobj >> >> endobj -1187 0 obj +1254 0 obj << /Type /Annot /Subtype /Link @@ -16567,7 +17587,7 @@ endobj >> >> endobj -1188 0 obj +1255 0 obj << /Type /Annot /Subtype /Link @@ -16582,30 +17602,29 @@ endobj >> >> endobj -1189 0 obj +1256 0 obj << /Filter /FlateDecode /Length 1144 >> stream -xWˎ6 +Ո(.n.."dJ}IM_"y$5}T)xçA4}3]TH?&T#4 -@K/Uanu8!Y1(G-` =l4>U1}2@M;e@GMˇᗟ~#LNe~]Hע$1ҏ=] )ig^g~ c ^H\iJʑdE$T"bx ]!? kiZ:y2nh)8S9""6y G[iQWRS}MHU65Wvl=S}?~fỡ̄"|xb|਼H6gOV<H 0[%CuӽZcVp7 xf +xWˎ6 +Ո(.n.."dJ}IM_<$5}T)xçA4}3]TH?&T#4 +@K/Uanu8!Y1(G-` =lhU;b _xtTĈ8|~{;Bgr*/֘B%~LwZNЧZn}T{m(*lA3ޓxS5oݑEL]!? kiZ:y2nh)8t_E4E(m*:mҨ*5!)BGy.[usfbd&_kKչbnmw*XyW~sp.(OM>hvR8r:=v5\W;WB݅"KU65W?itg@p;iZb\wEĢp/8qTyIHBe_?} i7~sqکir(]0ngrN~TΛy<J) ;:ΤH'e˧.Ygo|'ԏ߈ϼ)~Wщ;h'4۸$蓣6|(t6c'*E{m Ṵ).ngf. endstream endobj -1190 0 obj +1257 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1189 0 R +/Contents 1256 0 R /Resources 4 0 R -/Annots [ 1191 0 R 1192 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R ] +/Annots [ 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1191 0 obj +1258 0 obj << /Type /Annot /Subtype /Link @@ -16620,7 +17639,7 @@ endobj >> >> endobj -1192 0 obj +1259 0 obj << /Type /Annot /Subtype /Link @@ -16635,7 +17654,7 @@ endobj >> >> endobj -1193 0 obj +1260 0 obj << /Type /Annot /Subtype /Link @@ -16650,7 +17669,7 @@ endobj >> >> endobj -1194 0 obj +1261 0 obj << /Type /Annot /Subtype /Link @@ -16665,7 +17684,7 @@ endobj >> >> endobj -1195 0 obj +1262 0 obj << /Type /Annot /Subtype /Link @@ -16680,7 +17699,7 @@ endobj >> >> endobj -1196 0 obj +1263 0 obj << /Type /Annot /Subtype /Link @@ -16695,7 +17714,7 @@ endobj >> >> endobj -1197 0 obj +1264 0 obj << /Type /Annot /Subtype /Link @@ -16710,31 +17729,30 @@ endobj >> >> endobj -1198 0 obj +1265 0 obj << /Filter /FlateDecode -/Length 809 +/Length 807 >> stream -xVMo1 ϯ 8Nj8.8nw*Z5vATt3I;AzB=oߧ 0UF|[}&+1bLF0ZDpD=y1=8/i4x<ȑy󳐮*bVUz۸h)(yC68V>o˵ެ.\DxРsꢌ #9'#_ ˷cSCm~n6q}v62n~7`Lցss, 6V}#لuGx*K{p}siƃ]|N4428-8#Iz}0yk~<L~LnN XhVDuPD ]ˀ Uʅ ,fGtjr;Uo' ?--p 2X^-ڂ>;>jdP0ӌG!)[m! 'LFńX]\-|I}cXe!1zHyI}(qͧ%_[1s1_)%_:v_gYڇڳmv?=u‚˸K%H))y^yvJI -JNٹ-Y3ӒWM-+9aB$#RÄC'lȗ,䡑*YTb1A0$)|uqg$;z4Js-$u+ -  +xVn1 SH8KE !۝pf.N7ώ}_mI7V)+N:eVJb'$o} eObӧǔ%b)D+~ڡskP5EΌmbԅbJ܍b9Bf.TO_}9yIDp8wG͛tuV!V*ۆE=N)@Idj>h]vv\k6_fUB$Bƃ:Te #]ʂs2>ԞEu`h;ˮmC9YuO:n Iz=ٍ;%Y*O((9 oFzBdHK^5o<\ S|HQO/V/>`G!?N]vmH/?:9nuc\gN& /I6"w +pe endstream endobj -1199 0 obj +1266 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1198 0 R +/Contents 1265 0 R /Resources 4 0 R -/Annots [ 1200 0 R 1201 0 R 1202 0 R 1203 0 R 1204 0 R 1205 0 R ] +/Annots [ 1267 0 R 1268 0 R 1269 0 R 1270 0 R 1271 0 R 1272 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1200 0 obj +1267 0 obj << /Type /Annot /Subtype /Link @@ -16749,7 +17767,7 @@ endobj >> >> endobj -1201 0 obj +1268 0 obj << /Type /Annot /Subtype /Link @@ -16764,7 +17782,7 @@ endobj >> >> endobj -1202 0 obj +1269 0 obj << /Type /Annot /Subtype /Link @@ -16779,7 +17797,7 @@ endobj >> >> endobj -1203 0 obj +1270 0 obj << /Type /Annot /Subtype /Link @@ -16794,7 +17812,7 @@ endobj >> >> endobj -1204 0 obj +1271 0 obj << /Type /Annot /Subtype /Link @@ -16809,7 +17827,7 @@ endobj >> >> endobj -1205 0 obj +1272 0 obj << /Type /Annot /Subtype /Link @@ -16824,10 +17842,10 @@ endobj >> >> endobj -1206 0 obj +1273 0 obj << /Filter /FlateDecode -/Length 2730 +/Length 2728 >> stream x\Y~G$Y`6yH9 {fHQ"e> =Ⱥhw @@ -16840,22 +17858,22 @@ F )4ڲccW*{c ]] ʦ5v93_3in滿ik=KB򨤞8&8pkz9^Mi5.-FS;ԺH϶礠7vlqT _Yv۪ KVnKMn]GSRCl BW\Ci8B'Ǟ١sRIe7 hA, */E-PRB(N ˚iMMT[|mkm+C}g tһm ޽Qi+" \.z!K1&f#g꼡*^mߥ8S\ݧh׍ l;_J2('IdT^>kukM|8c$•uOBjdڲgZɒ-"hխ۸Xq;G7O*Lu@;bH7s=t>)ƛDZ?|.sV -;nL6f2z_vz/kkV4ĝ&Cm-m0ѥ_{18)~:PC% ')?.]Sx~PXb{EK/viZG-]HUQ`yFLu d{ֵKFtN]^M*`td.Gzjh^)_fϔrHVÎZs޶wzVdZ3lwkϤv˲=:)6n466o/k[4@%x.NUNo{@hRo.*q&QYgBg/$~ҲPLfӳ;rt1wAv ȏ,WץM[]|755 wzGzוŎg9<0#='$} +5NzvyjxkB6<`W+g3{|x+;DSzn9qt~,U}̰ơ&K/X[z}o}ݾ闻;A(-|[YV3nﻐR}_I.Wb^HnG6pnOAu}H"7K~``ˠ>uǬJP! ̠.G 1w~=| mIphڸ_T$E#s +;nL6f2z_vz/kkV4ĝ&Cm-m0ѥ_{18)~:PC% ')?.]Sx~PXb{EK/viZG-]HUQ`yFLu d{ֵKFtN]^M*`td.Gzjh^)_fϔrHVÎZs޶wzVdZ3lwkϤv˲=:)6n466o/k[4@%x.NUNo{@hRo.*q&QYgBg/$~ҲPLfӳ;rt1wAv ȏ,WץM[]|755 wzGzוŎg9<0#='$} +5NzvyjxkB6<`W+g3{|x+;DSzn9qt~,U}̰ơ&K/X[z}o}ݾ闻;A(-|[YV3nﻐR}_I.Wb^HnG6pnOAu}H"7K~``˨SEď{02Zw »1zS')k2SʎX̯> endstream endobj -1207 0 obj +1274 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1206 0 R +/Contents 1273 0 R /Resources 4 0 R -/Annots [ 1208 0 R 1209 0 R 1210 0 R 1211 0 R 1212 0 R ] +/Annots [ 1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1208 0 obj +1275 0 obj << /Type /Annot /Subtype /Link @@ -16870,7 +17888,7 @@ endobj >> >> endobj -1209 0 obj +1276 0 obj << /Type /Annot /Subtype /Link @@ -16885,7 +17903,7 @@ endobj >> >> endobj -1210 0 obj +1277 0 obj << /Type /Annot /Subtype /Link @@ -16900,7 +17918,7 @@ endobj >> >> endobj -1211 0 obj +1278 0 obj << /Type /Annot /Subtype /Link @@ -16915,7 +17933,7 @@ endobj >> >> endobj -1212 0 obj +1279 0 obj << /Type /Annot /Subtype /Link @@ -16930,10 +17948,10 @@ endobj >> >> endobj -1213 0 obj +1280 0 obj << /Filter /FlateDecode -/Length 4098 +/Length 4095 >> stream x]K#W{X;@HkbfkTlR;KjuŪř_k'Μ/1#}~R`砙^pv3!TpQ)fRܝO.(8wޝ7q?rE0~Ha p_?DfqW2N_,"=Yt;kΥ\k87=_ :|{ }Qv^m|vѴV9t͡/Ǜ 4HǓǔ;h^s>>́Ra$M80vqQ`rfF)[qEꙘR 2iKz۝Y1W"i6 @@ -16948,978 +17966,8 @@ U` Fxoyu΂YbeECYYaaxLoS,a D &UுB0'=A  rEɣ@W4aDΛ&{}ZobM%!UQuX Mtf'[n }w(wCVSq[kǔ)4u؜{ },Lq0yN H&p1A`l#D:Z5XeP3/F;4>mV"zsoia1-^bJqo#qtv{M,~}ϗMڨ {SZto*cekSb*h,.B rI&c;nʆI3,N!Q6JV{<0Q%'ғ;Zq!ڊm[c>Ho:HͽJuTrj:%UR?4U>R!럌D,( 2B؉H!:ȃ:MgtQFN!V<'fAJϜܣ*3JBDz8L*AiopAVd G=eXl'8X>R2}Sf%Lj^' qFo,IHƽS|tKʁ%qmbBU*9B }Cz.ZC @l!@> -!1yuO[- #|N[-+H/ >O 4$tOT-驜u=e8S9lGTfI#sgIqҍJf)sU/hyQ>:ǝ1DUˮCR͇Z3X!uݚ6s%r oJw ^4lg$rzڥAev]ͭԌwt:/R϶|L%TTlt=rUW i~sN*Šwqw_ӯL MP!Dɧ8Xy˓SI}>r$:go.D)m|qc%N"i**([>iHʹvQS:^!TUwSMEHG#S'(lfWTeimMcF[|5j-A0q"3uL6j䐷,t:q'y<žOsV6j=slDzfQu͢"6^tɊxuOCBoDzE"WP ږa,茣^|k FR9ܘ5{_j#Wc.(&MM'uӑDu t.VZ h3Ӕh7w]g?Ŧx]IAM:יfa:Ux,1v69J`E4&%ZDw|+0n )g_>D(c|Z9R}]lm ŤЖ -endstream -endobj -1214 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1213 0 R -/Resources 4 0 R -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1215 0 obj -<< -/Filter /FlateDecode -/Length 1410 ->> -stream -xX͎6 )Ո r(,0E =8va[RdQYtLlG0J|#8Ο/HKMz_ F9;=0:@*MZ ZK7~ q Z8)w#R@D i!O+--U> IF -RAB߿ P6bЛE {Ͽz*nexR-t3IHߙ5Ҙ%Soxk{e\̫2kփvlKØgf&Q,6&׺~MKj=ځy4Z[ҘfcŎU G ˟ˇwytlލOm/5&}NH E*8 -7_Bs[Ʈh(⣤O݂oժ5ߖ\O:'+HAv]PDt4"%).C, tS}uov^١]zzs*ʫr([CAGbx 皆 v7e_e+D.1GJ^Lp̐hTkkNʳv-s6ȼc{'x/$2V%XT>;ӑ3ѩ-'_4Ε4j#GFڵm8۵dL>7+k0bpZTXWK{<5uZI~bmF<gl)-ȑK[ܾ/lKD5$O>Fأ[t3k)SgC/p<Ω5pUg_*-; 5+%YOeˀ {%99SG醁2A{̨zN r̎cQsuoZ/ɼiޤx1a/+sp` ;7۫sFc=Bv 5Y*^Meץ 髁߹wy6p,v^*~D+; 9+^(E^Dqσ# $ü;*y$0=ko-~s!R.PoYrVK5X <9@xWsR +f޳q*KҴu*E  MVG[v *o{MNIs{3 ^Xh/E3 ΀lz\a:jG]9h\Bz}0X-GC\izS Uӏon-J+{sꈎ'^ #!X9k^9+!H t+ātOCS峬Mk"o\[OaE"$Us2Ga32z7aa FX|| VTc/%>ґik*cŹr'Ly -endstream -endobj -1216 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1215 0 R -/Resources 4 0 R -/Annots [ 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R 1222 0 R 1223 0 R 1224 0 R 1225 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1217 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 731.610822 39.386457 716.596422 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/data0Sainz.png) ->> ->> -endobj -1218 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 731.610822 167.636457 718.110822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/data0Sainz.png) ->> ->> -endobj -1219 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 718.110822 297.637795 703.096422 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/data0Sainz.png) ->> ->> -endobj -1220 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 659.930022 39.386457 644.915622 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/data0Perez.png) ->> ->> -endobj -1221 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 659.930022 167.636457 646.430022 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/data0Perez.png) ->> ->> -endobj -1222 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 646.430022 297.637795 631.415622 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/data0Perez.png) ->> ->> -endobj -1223 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 415.583622 39.386457 400.569222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/OCRTestingScreen.png) ->> ->> -endobj -1224 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 415.583622 555.889134 129.905421 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/OCRTestingScreen.png) ->> ->> -endobj -1225 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 129.905421 297.637795 114.891021 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/OCRTestingScreen.png) ->> ->> -endobj -1226 0 obj -<< -/Filter /FlateDecode -/Length 1868 ->> -stream -xYYG~ׯgC}?yaBFHQ= ->>1x}S|v[ӉV3#-?šɫY9ǝ,w3LHhrJJfOwOarYg'΅50Og6}Fi )wZs1Y%g_öO:,!5͢67w/@L2Ygv6*;ٰؑK796?<Ik8GsIcKy< 2hafrk:Kgq#VϡN>OSim6[%KO FIIq[J״O3.#Ġ00Iñ1Ä(e\hU~znia.:O;>,fҫI 'fSWZZϞZ Cm0wh&P!M݈?)0jbp*`;k Tlу]۾qK_k%Poq]C?v.2lmZIЏS/7Sl/OQ/<7Qk[L`ĉhgo, -IN(n]QHet c5AqDjA^=b (QAnp/H1F`D!1"Ic:{_#k1lLcӋwrK4{$ڇ -A%EMy8yƠ+őu)! 33l X#=UBy)Y 4FF)ig`IvLratG VlTj^fG'<} - Zw=/-oDWnVV.FEc })j(LxO'VCғfAP e~{qR$hcV}5Prilx8jL#;p&le5χ;pCL8Z# O\4:\J Ki>T\ !* -endstream -endobj -1227 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1226 0 R -/Resources 4 0 R -/Annots [ 1228 0 R 1229 0 R 1230 0 R 1231 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1228 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 731.610822 39.386457 716.596422 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/PerezFolder.png) ->> ->> -endobj -1229 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 731.610822 494.636457 535.110822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/PerezFolder.png) ->> ->> -endobj -1230 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 535.110822 297.637795 520.096422 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/PerezFolder.png) ->> ->> -endobj -1231 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 116.890122 39.386457 101.875722 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AutoCalibration6.png) ->> ->> -endobj -1232 0 obj -<< -/Filter /FlateDecode -/Length 1075 ->> -stream -xWK6 ϯ"J@!e)ZaF=$&(%A{n1vǣDR0i~~T;ҧI+O?eG~俧G2M!N򠵊ZϧG> E]|xzsN +ZURr(5)=خ -lX?-7Pљ ޮp.,<-/_ -YVsѩ@FG5Š3kad_o>=?2P{]_D0w ݎXuN[1}a]Cιuul,дCHٕ#`uv@JXl\YThfEj]sbN:oV/zw{ޢ2U<4H-=niZFKJK@Ǚ-b78 04`P{vðl_cqT KH1_U -endstream -endobj -1233 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1232 0 R -/Resources 4 0 R -/Annots [ 1234 0 R 1235 0 R 1236 0 R 1237 0 R 1238 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1234 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 571.465770 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AutoCalibration6.png) ->> ->> -endobj -1235 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 571.465770 297.637795 556.451370 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AutoCalibration6.png) ->> ->> -endobj -1236 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 395.046570 39.386457 380.032170 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AutoCalibration7.png) ->> ->> -endobj -1237 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 395.046570 555.889134 196.500785 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AutoCalibration7.png) ->> ->> -endobj -1238 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 196.500785 297.637795 181.486385 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AutoCalibration7.png) ->> ->> -endobj -1239 0 obj -<< -/Filter /FlateDecode -/Length 2307 ->> -stream -xZK#Wg{$` iFFou?"EVZjF}n٬W/v V{|>|9HĿ:!^#?>}4K?*p*Bpi:?>{"})p "A pdA`?Q%z:|=|$FVlҡNEiƥsʹ-Gbw]<9zK&r3:ͼ4鸲^Z?%K`r~.&cYc}^/T˜4?ɘne6gƗ<~ihY9eml - -K,,\C3c"?]$|^Cn3+Sd -$'ڮ(J ax\uYG@R6 -PKB[ap ^3 \"FCr?hP1J^qxgnLY, hjE.g_Ob'7 _i:L4]Tv!M{0U JCE^RJq - 4"/i`kj5ByV]7߷,*_Ln+ C( u $n%}wsGJ'5eV qbeW1nP)~Ո]qKKqtN:H}Fwא^!͐ۖ 3׀ ɱ*d#+oVy%Z9r6x)HE$}b:\3dr#z6ɬ%`R2nޝR@2ec\Ŕ˹1VXq~R^2U0\+ڠV<(LT(3,/%TLC/cyqu]۔jcX}Sf}#4v]HXJFq,{tRXy{I -ܞ]`3>B2yu);'I}G ʕÝ_osTc`9WhV;+f O[jΪy,$|ԝ\Ku]Zr -"Ř[oюfWj%qX۫KO:,kz+7Q-?8ߍ{ -e>(ˁ+2Fȋ/7|9L|=|m&O*?t/eb-rFH[M>"dX`al2B3Cݧ?ߥ Zۺ^kB#!t` z1@H}Z9i`"RFoңkʜR*UI&3kV -^DcS0-#:1kZOo`t,|f2ZYlS ZU^ Pky2z4|{ WZOGHbnZm PY1êq[8Gq`U;8){+'x! -0JqFګFHɴ<04-D|-G䗻*r9ٳ@ڼuG zU-~yWMUipU٩׶<>-2&;87ӮZ CzŠw%+Rܥ.)Sу`7Ҷ_bPODzJ .S{“ -V," -endstream -endobj -1240 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1239 0 R -/Resources 4 0 R -/Annots [ 1241 0 R 1242 0 R 1243 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1241 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 613.372422 39.386457 598.358022 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AutoCalibration8.png) ->> ->> -endobj -1242 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 613.372422 555.889134 409.010929 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AutoCalibration8.png) ->> ->> -endobj -1243 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 409.010929 297.637795 393.996529 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AutoCalibration8.png) ->> ->> -endobj -1244 0 obj -<< -/Filter /FlateDecode -/Length 2485 ->> -stream -x\ێ#}WBx+X̃:yH0I yh=~ `$H5gJӢ%x Zq8o9_{x&AZtHHA}<@1Y"HI/o㟿<My|>냔чKi%$dޒ񧧼/~ưͲ&}2h9vYylCd ۴"6_:q~f -fP10'eČ.n=Ϙ䟟Uڮ|}|8t"7x@tsh:ༀq!(| :=4XȟY:{ÇY,lYat]غⰺʕiʰKlPή:%{itb.7Xej<|r4s-.._2;PΈtLvLfugFxKpj"??Dwt)+5Ը Tspidx' -7⤘q]Y"++S -H1&ӬEVr5 yاY+Iplm{t܈@è-x*[+ \MUƦ++qJ:p knVFzXPˡn3q=ׅlVFa楺0LYM%#%y #&zT VvtS=9yټJqݞ0<]\ +H^(mR H1M\(gshs*s9Xa|0<\;r|ԂSQՂMrn-ئmirj -ce \jvp͏RL446 "Ce!+,u"ᩌ%u;y5rzgېcs&f/" \Omhks94sj9)W~ OIգΫ*ʵӚ2.R[} ׵HL컌E]z*iilvʉ]|qm,q  ơU5_Q+-rG][̆]&Zο8^; -k~nt> M-C[k&#p$yS"xkV9r45my> ,k2x%3B^P%4\ #]t2:KeʹuEbk_tʼaɭ'yQdyAK\5ẘ*[t,bۙiK]}+zFXT8 ?ȋ>u+^[WҦm+Y15U @,69*_䴎IIize0{_h@[<^_<DJLmOl T:B[\V*un|p(N焢ӵ˫L_}ήM1-=ݗފxgĺ2RGxft> -endobj -1246 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 140.648730 39.386457 125.634330 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/VerstappenFolder.png) ->> ->> -endobj -1247 0 obj -<< -/Filter /FlateDecode -/Length 1024 ->> -stream -xWK8WF}X R#2 D+Qw;NW.W̬OR1~&)~&U0gPIy&)cu8Dcv*jSVyC$af}^,FiCCԸ<-9 h"fLqD$_BE,ش-jc`#,ayY$1Jƻm7  6 B9@&<N./\@82``d` ' NVDz Y=aH_9]2 G=d6 -clw<ȁ̒ὴʝZ;*]RL*_qQ8c嬼6q`0 Hw<[CU6gZcų+g$dTJ56\Du|>lܻwz*#d~3Dlֽ&ݦ0{>5-udWdQE? ^rv]v}bw^#2H+҆ -Zs; u9 -9Kt0ctW[4n-ٕ;Sw#hKs\?xi -endstream -endobj -1248 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1247 0 R -/Resources 4 0 R -/Annots [ 1249 0 R 1250 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1249 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 494.636457 277.523622 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/VerstappenFolder.png) ->> ->> -endobj -1250 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 277.523622 297.637795 262.509222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/VerstappenFolder.png) ->> ->> -endobj -1251 0 obj -<< -/Filter /FlateDecode -/Length 2588 ->> -stream -x]Mo#WbE!@$9$|Af@-MZkCbU=fVG'y2)(~&?S;&7>%Jy)"X2m1DΙ@YR(-h_~yt5uX]h D) ӟ{*\aw:U{kC u9cԇM)MmJ0>{q{|*$s_m}popF':J#d#S/N}ȕ>Ɠ.Iz89zxrbҹ*|r}cv6]\h:ԾJ7$-JaW;3 x/7Lj93{*֞?G9Ԍ@3KBygۥp1*Ny3ݧQf46NLp3WO͊]xr -fEOsc_8uOkD9sR32x;?|Agir'lr&/Ky, -2R͢'E#U)_K9ʰOmӓ$]kHWq0:5|SjOVƩUg%l7N g+4q$]`"6(uBʣO=%HNrؤ0茐K0v6^d;FMBS(ΐcN4^DKWr w4zeamҩp2jHQIˑT񰕌qdDIFd !e"`(Bu@#$B!d-|h {LfA[f@P˨d#t_fI.ShDR )ƺl$)B{]>֌kE !( `So"j2Qka]%aIQ(HIYBTT% 5[")(sX$ 3!?7L/=3KOerApA1 sbhkۓ?@jI>Az[upi\<7Xq;qv ɚLѧ=e1=-XD!e!V;TFgJP!e [ a>@ -$JL0QyDYU'ٽ1qAW/)d#.N₰d qAuL= mܽR4I$ڈ$Cn@&u@amZz`f%9Q8H؜?3A,U4DKVal!d":sV_ \:X+-0ٝn؆KV;sFnevy߉cK=Pʅ1>2 2`yXr*vzvk`M92 9hՅVrv!E}b$|$l&\e_@-r=-h5@z֖AByG-zY%:&cQuG QD/Wji"LoLtb2N32{sSq 5uu<^]I9dypÆt Ʋ{$*k-@gN݌L]r\ IǾJLaCv&[v  Į1.B֙U\>#P/Pbm޾2SF2v[QX[(dco@!,#@؍}e -KMH^L_yYFrH;4_nB -dhʈSb6c;r3G !9f leˢPufQ X//kEʠЫaܐMɯ(Ğ1R6Fɑ]׆WNtȲ9lW6|] J]p0[|\KABO];r_0nBj|p9|}Q%a][`QD2!zf -N( ĞR1.sB֙9R!o(P(Bm{= - ĮR1: T*]'m YG -aƾRU2!`{ӝ821Lqӽ̘鞴ЙEG7n=neec}.ř aU9WĪ4FB{2cee,FS;`3,7SŎD=}3vsWPaYR62r)P(PWOa-7{JS)_wt{> -endobj -1253 0 obj -<< -/Filter /FlateDecode -/Length 2549 ->> -stream -x\[#~B*I  dfw! g/aɃz_fZjU}v -KWU':P1aqU@MeCA&}r1DAk:kuݿwy}HVC {cB >;T""}aay ~?}x +b0|ʇ" ʆɑM&U+]7"y=aHM4t0Ge*?}w˻=dLIkC\5'i;W=cqmv3~bݤ4㧸΃82!H껀Ugu`T(F 3[N!ۂTB>,uaBERňm7:XT?r2YG@&cu;ԏ8Ȅ,]qn\͖sYX)NM#łV Qf(^>R~YD17 ll4 t$ \JI,<+ Z+a:"m] b3W-\+5à *ztx@xpYEHA0:Bl;Xw%$hN!)v[BiW0nVMs{*OUVfC%s8|y!*–Gc!9ܦq$3~7Wt n -IsKxRW7v1!/QBJ꽣){b7 :EӚK/~{z~ 9*_:u{-d!7g9f?XA6=eS>:קIK -0Vmes~T9Ht[p.nf^b*Eez-Kg85zO4AB*O*)[DVS42[nzE6#wpIۥ= ?zC -C-E=1^P*̹z57s{>gYK < j -"f`ғ:&Lե X*mXc -endstream -endobj -1254 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1253 0 R -/Resources 4 0 R -/Annots [ 1255 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1255 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 129.285426 39.386457 114.271026 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/JsonDecodeResult.png) ->> ->> -endobj -1256 0 obj -<< -/Filter /FlateDecode -/Length 1604 ->> -stream -xYˮ6+ehH p((-?!ǐ_[9338 E -^iDwNjq.x|XB) 4F #ߗ8#λE)`=jO.߮JÿA)zhpBWѦjH^i)lhԷ\$ Ln -,<“̗#{FPM£4(`y% 󏿽]T4SG7üe"0R"hHh5$ƨ(FPӇn8foe - -s Mx - M$^GIv$*u͐t? ,/DZORILo8tV^=ڒ0eLԝe;?]vchҸO9[K+F7cowu"0 &~3@ʜ lVrc_NT}c 0 TǮC<1VX14F\AnΗRhM9HE@cH(Χ Y4*%[#`zst CE@,@3OXlL׾Ojt$sJBI 9Y%}! ck5C`/ X{2 }Nyb309ѣ/ BYNi[π4 B g4YWcHVHa.20%611%6 LUd]R!t3컽]>OwI$])[Xb-Ğ!ҥ!/g%3:fNL4b$xєJv)Wi*n,KkN+8NRj KE!ӆMM!6nsjO9vmUHp]7{ϧ3ZhmOQD,Zv>4Ӧޱ(g食O/lJyHZmͶ̈gp|ג#=122D-; πL?.է]F?J9` 4gT%1_8^Ӫ%}s@Z -igV^!\>Gf=I6UjTuUwY$0 -yЂf fi+p.cLMSEk;F:欲mG)m3t\U-{tn ))|+RU9@Dq5Xy^ ˦6I)2Z@!y?-؃ʄRհszvI{]ԶRYDtRKPݜZKKc‚Q֜aҫXa)g1Rj _VwO/ e") EzJ -_:"qZ7EJ~ m@aM#UJwbEQq`ci܋soZ%.'< -endstream -endobj -1257 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1256 0 R -/Resources 4 0 R -/Annots [ 1258 0 R 1259 0 R 1260 0 R 1261 0 R 1262 0 R 1263 0 R 1264 0 R 1265 0 R 1266 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1258 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 475.886457 585.773622 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/JsonDecodeResult.png) ->> ->> -endobj -1259 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 585.773622 297.637795 570.759222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/JsonDecodeResult.png) ->> ->> -endobj -1260 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 424.368822 39.386457 409.354422 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/CenteredDriver.png) ->> ->> -endobj -1261 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 424.368822 555.889134 402.046978 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/CenteredDriver.png) ->> ->> -endobj -1262 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 402.046978 297.637795 387.032578 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/CenteredDriver.png) ->> ->> -endobj -1263 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 319.467778 39.386457 304.453378 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/UncenteredDriver.png) ->> ->> -endobj -1264 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 319.467778 555.889134 303.475149 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/UncenteredDriver.png) ->> ->> -endobj -1265 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 303.475149 297.637795 288.460749 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/UncenteredDriver.png) ->> ->> -endobj -1266 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 102.657549 39.386457 87.643149 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/VerstappenFolder2.png) ->> ->> -endobj -1267 0 obj -<< -/Filter /FlateDecode -/Length 783 ->> -stream -xVn1 WHyI] `QT$bXj In2S(y89θ πDc -ez#,r{0萜 ^%#ĤD `,$vhz4NyH1!`v|tT~匿QߧWuy˅S.|sԞzdd+_}Z2]<CnN^& -h>?VL'&3H#mD޾~ fF;x7LJŠSkV!)ǎ-\Vӹ.i»w-@۝퇞\(ې/sבǖAإ[P2'A@i.{͹j_c`S̹x :9p\:QVš""b$B] ;X1,8c,fW6{]N_&twj- `LWtϹ;Y̭_Y/H^FH(d%IUfpmlbpSOA>C%I*ApT4,ZE+2q)@Duĕ7SpQd}RdˣTVv 3Zxo8&)=.Ύ"i -;T)!QCgjd뷧)H1 -ȅN~΁ -9!nL1dzTy>91GhK`lp]P -!\WU!nPd -endstream -endobj -1268 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1267 0 R -/Resources 4 0 R -/Annots [ 1269 0 R 1270 0 R 1271 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1269 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 494.636457 511.523622 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/VerstappenFolder2.png) ->> ->> -endobj -1270 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 511.523622 297.637795 496.509222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/VerstappenFolder2.png) ->> ->> -endobj -1271 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 365.133222 39.386457 350.118822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/ImageDecoding1.png) ->> ->> -endobj -1272 0 obj -<< -/Filter /FlateDecode -/Length 1247 ->> -stream -xXn6 +ՈdQ m-Ptq;(0"z$K}_q:p,yHIԥQ/:R18}kO *$6)#4H :_?<>$!Ŕ|܃|}|7ّ㻿 ͦyȑQeHIdm3J6gBK}ĉ=gwK{\z0~W=8|7_W,M^E61h~_FhMa {xUPnYhVQz#af*@syaiKjOܯB=}Pnؤ,ka1n)?ˑ<8F4OhwVĦJ.쇗gf%R[~%^^cB{6S)9Qxo+DJr76US?C 3'$Y 5a}xDW|Ao؅RB> -endobj -1274 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 325.051773 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/ImageDecoding1.png) ->> ->> -endobj -1275 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 325.051773 297.637795 310.037373 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/ImageDecoding1.png) ->> ->> -endobj -1276 0 obj -<< -/Filter /FlateDecode -/Length 2098 ->> -stream -x\͎7 )UD% ȡ@ m-?@î7KR 4Ҍ&@9d^{eY#R"=ȟ`bLpx{OqOyWyy6q'4#Ĵg:/B-?w?#3)D=`?=co=ET]0>4E BcrwgC*7[뢵^Xo-%yțxGXs;>#>Que\QxdӰPՇj69c,Ӥ5!0vJj0m¨S4O}l1Pfqz3j<bYe2]LɌ!lYoMOXЧ&A^`  ik!dnCmVCZIrG1I`!ZiG;qA(CR6nyR !ݎ8p;Ni}J٣DBf~9]2IRjyĘVB k= aA {sd hV"ۺ>/cݹ`N0uC8+j!uEx3kQ,0.yP Ŵ8z[l1yj'YǢk:ħ-XVW1?q&Zqڒi}󪝌V(sB8MJݹ5xL'%&ٮKK @v~ Ϗr[~Gl6%w>Җ\+w>1LBhU+wL+b!X PoN>zM.*VE)+gԻ xF!1'Cu0X5HˬS.SƠ^:?/>_kv}^2(Eo4)D Ƿ7'^6VİA`G{eG @,ܽNNxy|*_0?2w8G>"  -endstream -endobj -1277 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1276 0 R -/Resources 4 0 R -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1278 0 obj -<< -/Filter /FlateDecode -/Length 2463 ->> -stream -xZnWD7Ebd1f drjԽ!EngvW[*܇$"IV#u ޙox+O緋Vyw f1*pr]J/^Z\sI}Ћ¯*R6͐/6/&@{?i0ϸ_~Z|Es,{t!)Ĭ4ԲZkw-'҆VF+Sx4I7 FBtԣ7B1< sHH٩1g=`4_ʹ`\ -FW#^@\HE{- g5`701 /[okزBZ3m_gY6#ZU.xr I4]rC\t]͊dAPR$W Q aX8OXhd(wF9>g"_ Mv=&QB.F@*.Ocw ,_ 'bHbz R*DI15-{^8#jT -]|V70Um%\נ(^zML:GY2Zvm>Ĵ2u^3 -g~\蝕Rec3Y~.tz$lބQ2ݎL"u[eZmcYEȲ -1+A{0"< *h" $}dN~U 3n UjBd$>&A(>9uuxV1a. ^> 2ZM<̬8|$$c5ٴ\q**Nck#j(DP窐K6͐0Jh!O0O _͑ 0 +D%Z>`q:ù]j 1ZYx]Ą;(aRg3"&4~t&o-3Rbg7X܍ֲEz$edҤf]*Vr7W\MpnSYaq # Bע&ky/ K!_h[,0Ϟ2ՖQ[a6UKlAԃJUãES>_1ejtW$f=21%aMpS T&j5&m60*AÑ6<>02s]6O ->e]Ӥ" f@ʋhIX1 aÙ۲r4dX9!u=:> -jŐtfsuFJk=C&6 cB0CiW79=Ec]M,FC4R)CQ#8@6 A*%8nY3kO"c 6ҵjr#8fި9}8ćC4_Z@)0(jT4pc෠3E;G`a Gk]FZsf->`j* [q~Q-=4{şKE&c'=,=aY䣊Nh]ryмѫټMmeaRտzϩ+ q>Έ:sZ}QEC9m{i8:1h~ -P UmeN=ԗ/Hѿ) Wcĭ#~D"v;a~΄TZu&- #bOg"̫3S 1¹X$Nl&sd9isމS+#rѩR&xn7ݏoQ?Ao9(އ |uy+7\5+og1?RTҫ%3Kꎕ~ezهɿ>c9%.FWtkuFFh]aMoV'c$UCʄ+%՞$cPB⼴kQi -endstream -endobj -1279 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1278 0 R -/Resources 4 0 R -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1280 0 obj -<< -/Filter /FlateDecode -/Length 2501 ->> -stream -xZ[d~_φȺ_`hH 6cp$vyˮa)IG];Co#MU_8r>^>>8sӿ4n>1t4 Nx&J1Ï_ys;BHɌ֛8B߯?> Ə?vBR#+ɂR㇃S%f#Ff_ ̄tzϬKIǔK -!a0Y\tEnzNdHMDc|t35LmZ3/?7?9Ȑ3?^y\ѵpn}H/80oC?ntǧk<_Wy۞12c2M.K1\iise= Zx -mLAgG+:ߥȵ6#CJ! .[}4dV%yD'PelmEY2WZ1)M .TZ BA0km2_$61-/n J1 DEGWBVfl2Y=,I U)3-x;0q̔2-y_z~v6~ -ʝ{CyRR\ԒA͠7q]VmV'z1ϐfJ"|t18!#z(:$Z|CP&Ʈη6'ќx%&WJ&ob' HU3NAȆ]|405@vg3W yV-.+Ur,٥xyXq4A?;6v -X膐,f0)ş"xƐŐ3KrMxm{& ۦ:lF]|. -b+3_ʛ$6%)LLbs/)bT幵;TS%%FTğ'e68kĸ}5Q'7vgp׌%aLCx+o"0>r--I? }0"W:xG~|,腓a'witX-mzFJ?#I] -dVT"{a3βX#bՉ2vه j1 v69 bY YׁW{XY -S4T?{eGu]}Yv|>@N!oȼVm{AygJuF-{V'3D^jædJ߱9R -L@6d Cį;+`XGVqW;륛ﶦIRt~EM?6yG5F[ If3v=dіo@;{T;=B+^ðn͚0K<*"t׊'HI,v6B`~ìq1FUdԠbg͙ʈ&M% 7ri5HN;VoRB*#ܢrk0lr\ńN -!V~W5:`@)I9ԕ9\uv^>%C -ܭ%,>14,k9adף'lH|S,v"pppiN'@'):Rte H`|^WIϤTiJ&tX #Y ktxrHѼ퐰#Wb/\#NOB:SMĭs*^>>22tlMM (:mDǷvVJhբǪUDDj쏴gex 9l&x Lg}=io |u l.*[ _Du-8p=dL;2[Xav9Bc`{D"7~,V2DҨvkDќ,Šr,1 ,BTuL0i1pB;^hÛ ߁sʕ0zbɶ#H|QV(3лtZ)Q5#Eo[A[r;f)d*%#V8Hm*f c20XyÌUh=x%]tځ)ԡ +3x_ߺu6j7iI^ #D%ab6 ZI!>rOib}pPGMSPg#T$SG!֐LxPIy .7iEie;JG'xkoS+`((RTvT2!H7&)lbLm+K0hV|ANGv ˜}:b m1(%.&0x +!1yuO[- #|N[-+H/ >O 4$tOT-驜u=e8S9lGTfI#sgIqҍJf)sU/hyQ>:ǝ1DUˮCR͇Z3X!uݚ6s%r oJw ^4lg$rzڥAev]ͭԌwt:/R϶|L%TTlt=rUW i~sN*Šwqw_ӯL MP!Dɧ8Xy˓SI}>r$:go.D)m|qc%N"i**([>iHʹvQS:^!TUwSMEHG#S'(lfWTeimMcF[|5j-A0q"3uL6j䐷,t:q'y<žOsV6j=slDzfQu͢"6^tɊxuOCBoDzE"WP ږa,茣^|k FR9ܘ5{_j#Wc.(&MM'uӑDu t.VZ h3Ӕh7w]g?Ŧx]IAM:יfa:Ux,1v69J<ȍFF +Laqء4tVTs_[3C(q1da endstream endobj 1281 0 obj @@ -17936,15 +17984,12 @@ endobj 1282 0 obj << /Filter /FlateDecode -/Length 1835 +/Length 1409 >> stream -xYK4CJ@Bӝ%ʏˎ=p`Z$v\U_=r^ }pV/gpK#tO1tv i J1nr;r绠y!%3"Xoϗwg eHc8Go_N,y˧ӻ_/"'*/'΍\{|n@Y#to*zCg86^4N1x-2~mm|M+eek}KsYtN/e$˥#"sM h¼&nb4jx\J9 A B{Ko`2ynqtt| iu}Y: N\|ϋ:#v1HV0催 qI'cRCP// -D cgh@ 3Q"h4%p1t/z9)(3DT3I̠hT@{#ayn.4c`0fqg("Qh4nLo4*-]yн8TV -ł )sOE9W'^5|4u ě A6=֔b\׬/P0MxYY%ԾX[>"Tax2q"\|ƹuvsN_z?*X ]/KxTT6DA\%4 A:HƁC]sр+`0Wc{"nVB! [uW{"uh#Y1H -aY#936к=܁<s5+xƯ1`~+Izz sΤ*@iדq(Q=1T]WLd(S6YH)`0劾-qԳQv/rx=Y'cx]CjftyRja\i;%=UݦܔSZ )-J2d[^Ֆk_zs-eP2Egz mGa6a%GtUe}|;f̵Au/\`Ab8΀tg!0pcA`f IF +RAB߿ P6bЛE {Ͽz*nexR-t3IHߙ5Ҙ%Soxk{e\̫2kփvlKØgf&Q,6&׺~MKj=ځy4Z[ҘfcŎU G ˟ˇwytlލOm/5&}NH E*8 +7_Bs[Ʈh(⣤O݂oժ5ߖ\O:'+HAv]PDt4"%).C, tS}uov^١]zzs*ʫr([CAGbx 皆 v7e_e+D.1GJ^Lp̐hTkkNʳv-s6ȼc{'x/$2V%XT>;ӑ3ѩ-'_4Ε4j#GFڵm8۵dL>7+k0bpZTXWK{<5uZI~bmF<gl)-ȑK[ܾ/lKD5$O>Fأ[t3k)SgC/p<Ω5pUg_*-; 5+%YOeˀ {%99SG醁2A{̨zN r̎cQsuoZ/ɼiޤx1a/+sp` ;7۫sFc=Bv 5Y*^Meץ 髁߹wy6p,v^*~D+; 9+^(E^Dqσ# $ü;*y$0=ko-~s!R.PoYrVK5X <9@xWsR +f޳q*KҴu*E  MVG[v *o{MNIs{3 ^Xh/E3 ΀lz\a:jG]9h\Bz}0X-GC\izS Uӏon-J+{sꈎ'^ #!X9k^9+!H t+ātOCS峬Mk"o\[OaE"$Us2GfdnT? /3jj 0{GN:22]/Jby endstream endobj 1283 0 obj @@ -17954,7 +17999,7 @@ endobj /MediaBox [ 0 0 595.275591 841.889764 ] /Contents 1282 0 R /Resources 4 0 R -/Annots [ 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R 1293 0 R ] +/Annots [ 1284 0 R 1285 0 R 1286 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R 1292 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> @@ -17963,6 +18008,973 @@ endobj << /Type /Annot /Subtype /Link +/Rect [ 39.386457 731.610822 39.386457 716.596422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/data0Sainz.png) +>> +>> +endobj +1285 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 731.610822 167.636457 718.110822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/data0Sainz.png) +>> +>> +endobj +1286 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 718.110822 297.637795 703.096422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/data0Sainz.png) +>> +>> +endobj +1287 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 659.930022 39.386457 644.915622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/data0Perez.png) +>> +>> +endobj +1288 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 659.930022 167.636457 646.430022 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/data0Perez.png) +>> +>> +endobj +1289 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 646.430022 297.637795 631.415622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/data0Perez.png) +>> +>> +endobj +1290 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 415.583622 39.386457 400.569222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/OCRTestingScreen.png) +>> +>> +endobj +1291 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 415.583622 555.889134 129.905421 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/OCRTestingScreen.png) +>> +>> +endobj +1292 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 129.905421 297.637795 114.891021 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/OCRTestingScreen.png) +>> +>> +endobj +1293 0 obj +<< +/Filter /FlateDecode +/Length 1864 +>> +stream +xYYG~ׯgC}?yaBFHQ= +>>1x}S|v[ӉV3#-?šɫY9ǝ,w3LHhrJJfOwOarYg'΅50Og6}Fi )wZs1Y%g_öO:,!5͢67w/@L2Ygv6*;ٰؑK796?<Ik8GsIcKy< 2hafrk:Kgq#VϡN>OSim6[%KO FIIq[J״O3.#Ġ00Iñ1Ä(e\hU~znia.:O;>,fҫI 'fSWZZϞZ Cm0wh&P!M݈?)0jbp*`;k Tlу]۾qK_k%Poq]C?v.2lmZIЏS/7Sl/OQ/<7Qk[L`ĉhgo, +IN(n]QHet c5AqDjA^=b (QAnp/H1F`D!1"Ic:{_#k1lLcӋwrK4{$ڇ +A%EMy8yƠ+őu)! 33l X#=UBy)Y 4FF)ig`IvLratG VlTj^fG'<} + Zw=/-oDWnVV.FEc })j(LxO'VCғfAP e~{qR$hcV}5Prilx8jL#;p&le5#gh}  ޅA@. +f.tg%|`ID֥gk*zo +endstream +endobj +1294 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1293 0 R +/Resources 4 0 R +/Annots [ 1295 0 R 1296 0 R 1297 0 R 1298 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1295 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 731.610822 39.386457 716.596422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/PerezFolder.png) +>> +>> +endobj +1296 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 731.610822 494.636457 535.110822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/PerezFolder.png) +>> +>> +endobj +1297 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 535.110822 297.637795 520.096422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/PerezFolder.png) +>> +>> +endobj +1298 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 116.890122 39.386457 101.875722 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AutoCalibration6.png) +>> +>> +endobj +1299 0 obj +<< +/Filter /FlateDecode +/Length 1075 +>> +stream +xWM6 ϯ"J>`ECS@Ì<zHM?PJYgA,O 'A)}:=Sfl~Ǐt^Hƻ) CPXVZvh? gOo.iaGqQ^sBP9۝B s K0buCO~99"2^*hűr4?+fFiqU_{ 2ZI?/}{:&e؁P{/&lN= Ǵ#q}-aC>s8.:dD;[fiґF Ɂ1ٸaF6-25<ĸjt~5&,oq*LS^uŚFLefrVIV\ҞDĚNJ_~uYf75aW09\ +FB ~%$ٟSs0V !i;?Jr~Te$O^ÂN=04pv2[269V 5bk8y1nW2E(FAKz& ۚ>O)y)qoS[/],;4F^QQs6MY 7bb]u_UXV].Þ,=xY/`K `M5vR-&Zt$vL!+ոr> + ^jqilwb_҄P֦١HlhܶAMnO64XXfyI=Z)x_nwE+0p펍\쏶;@mUbnUuÁGVہ%]r5lﲵjwuIAj>(-{vޮj]z*!Stw#Ԝ'L$9 l4_U[-ıFbZ DnoFnfhwcpYۨjJ@Wgcȯn ']jn'yk\8[0 +endstream +endobj +1300 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1299 0 R +/Resources 4 0 R +/Annots [ 1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1301 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 571.465770 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AutoCalibration6.png) +>> +>> +endobj +1302 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 571.465770 297.637795 556.451370 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AutoCalibration6.png) +>> +>> +endobj +1303 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 395.046570 39.386457 380.032170 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AutoCalibration7.png) +>> +>> +endobj +1304 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 395.046570 555.889134 196.500785 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AutoCalibration7.png) +>> +>> +endobj +1305 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 196.500785 297.637795 181.486385 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AutoCalibration7.png) +>> +>> +endobj +1306 0 obj +<< +/Filter /FlateDecode +/Length 2305 +>> +stream +xZK#Wg{$` iFFou?"EVZjF}lQw + V{|>|9HĿb#_ r0^贇c†B?xpRBኄRYxk-p'‘AχOG$YAJ:㋔;KcZؖo\bYw]>-k<_78k1nw|HǕy-l]\Eeʏ^Y`{LS-k$c뮗ٜ_e5Z,MF)+, 0sa xtiytL)hW*=6pnb _ 4/jEt $ gp53ߘ)b<)3SBpTwH{M2uƆ"no05y˭nx^P8ĐZ hG +Xj}# \1z(\ (!¬o7b'YhUVFD)CrG9Y)cD.UQPN#b:eb*& +ѥj0-4μqy(\Cyӹ Uy}#b-U 9$]֤x)̐Y9N#6+3YN#}}OoZüyV?o0y許o[ +]k*zET~UQFѠ*ʲ_"$qc_(!O)ƻuacdZ2)OV%Jz-9eb֭7UD+5ks8,եJƧffl },{z+7Q-?8{ +e>,ˁ+2Fț/7}9L|=|o&O*?t/mc-rFH[M>"v0z,f:p?RX!Py9ӟ҉m=p5H@ [ :80p^bL.*RGvAN`"RFoңkʜR*UI!3kV +^DcS0-#:1 0:yRUuK`s-, v(*(ѼZSD6U!XV[t8tV谪+1j`d!V0xgN0N +I1FR6z`d!*/R2-|84XyuN k(!N"ez!Rm2V< +X<t] d\Bʁ3G@eUq3-V*( ބiqt 8)i6|mAa8# ".ڹT0H+Lyo m2ڼߗҦ- M ?{7}I9 ,@Ge!C?^Da_U_US|:z:A3\UN-b I tDj]ID3ʼݩ> +endobj +1308 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 613.372422 39.386457 598.358022 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AutoCalibration8.png) +>> +>> +endobj +1309 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 613.372422 555.889134 409.010929 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AutoCalibration8.png) +>> +>> +endobj +1310 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 409.010929 297.637795 393.996529 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AutoCalibration8.png) +>> +>> +endobj +1311 0 obj +<< +/Filter /FlateDecode +/Length 2478 +>> +stream +x[ێ#}WBx+X̃:yH0I yh=~ `$H5gv$Nu('}@g/_R/|IJ_{Th-χscDG།{1~ <3 ZDעCG +:! +hdA:MZ?~9|Oh_T4^JK-& ϖ?=~3om65ySA̙,ϲ5cʾ )Lئ<Ʒʊؼv~y)AdeX3\?c~Vhʋ{͊ܬѣƅ)z2c"#dZfen`ewaž{0B+W*.ua@9쥵Ӊ^`ir ^GV~0̵d`~ɠ B1"^:#11=ա-é9 Q|Sj/RqM90=N@p+܈bucXdLQ6+ LQxZՀcVg"$>±qq# $Dn߮D\2жs59Wot+9'EXYaB-qk^\a[ay0e}z6ӗUp&XQi/xZz5B[ӱNT:z2#:gf+mu{ÄZcstr-̯DB yTNNJ. 4q͡gnA`q pDYS KrN%FV 7|Zȹ`S`ֶi)%,s1!VB7?J10,>iʗHt\dԉ2ET4띑oCΙ5:RD,p=%^,Q̩s^:5H?%=rV:> *#Ok,\KmC^U7\"y32ju驤ճ)'v)qR?,喓3`lVEZ^Mum;bvh9u+^[WҦm+Y15U @,69*_䴎IIize0{_h@[<^_<DJLmOl T:B[\V*un|p(N焢ӵ˫L_}ήM1-=ݗފxgĺ2RGxatS@WŜ^{Z#gq 4z3>td$2-{IZ)BR-ɳ&3$Mحv}Y&!{A5~g"Opϐ4)c?"ϺN"Ou'M؋E=/FLI&e6ľFYyx +oPy2^Ӌb-{ZIKPos٤f/U+=~oFMͻ/LE.j(v'F:+MyPazW#S/>l->?TcAK e}:kC|4?J-?0 QDe e5kqa| +Z|jKt5S??ˬ) V٨r]|IqQPR$FA_IΥ8k\~ 0Ώ9cQ1~wJ +endstream +endobj +1312 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1311 0 R +/Resources 4 0 R +/Annots [ 1313 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1313 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 140.648730 39.386457 125.634330 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/VerstappenFolder.png) +>> +>> +endobj +1314 0 obj +<< +/Filter /FlateDecode +/Length 1022 +>> +stream +xWK8WF}X R#2 D+Qw;NW.W̬OR1~&)~&U0gPIy&)cu8Dcv*jSVyC$af}^,FiCCԸ<-9 h"fLqD$_BE,ش-jc`#,ayY$1Jƻm7  6 B9@&<N./\@82``d` ' NVDz Y=aH_9]2 G=d6 +clw<ȁ̒ὴʝZ;*]RL*_qQ8c嬼6q`0 Hw<[CU6gZcų+g$dTJ56\Du|>lܻwz*#d~3Dlֽ&ݦ0{>5-udWdQE? ^rv]v}bw^#1H+%(ǿѿZ,H;OwEkݒ]s:x7;S +endstream +endobj +1315 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1314 0 R +/Resources 4 0 R +/Annots [ 1316 0 R 1317 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1316 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 494.636457 277.523622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/VerstappenFolder.png) +>> +>> +endobj +1317 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 277.523622 297.637795 262.509222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/VerstappenFolder.png) +>> +>> +endobj +1318 0 obj +<< +/Filter /FlateDecode +/Length 2586 +>> +stream +x]n#}Wex Y`<$p.@۳ޗ []-&-{!KnYuUTE{+#=K~umgM +V~'LoUvL*/)}lc9lgiO&Yr9gCmAϻn=BfG3 7Hqo~}S*ݿ?XD $(o ^9.Cjϡ?L}>kzԦYwK^W.gߛc?4G9lYiq })fItO};/ldxlΝ#g>6΍P0+B k?fN9g5|Z?12=sj]Q<*w=9F9&lK\ \KpyhM-wpDOԱ:N&ǕțZ+{D8g)qQ7WE}zX)O37݇jdƟ&wM)|&wkJ~S3o-ϟdXgX%ʉD¢ϔa/ۏ5J9̰Omb׻%V  .`$tJ$yVj-ZT("3qJSK$IIbW Xd8 5E !sEI2⊓6)%9e n;/tq;FMBhS(1LF'CQ*yYJ]N6./M's%EaB8%A01 ٹ##B%V2b2Ƒ5k'AXb:k,KhCF2-"!A*![q[EK51}^Eͼ?X`X]&L  gI%-/IRT*|0ݵ&"( `So"j6Ij0F $E"&xM2 +*Ina63E~oT8_{f=eǨEk=9 $M2Pp BY;؊/KzLł1gkP,LJ>ga,K"Il:f +`W/ ء2:õTnؒOH*0,|V&Qf"!#ꢭM= zIA1: Š[ BD\&/IK\T1&PD^r-R֦f6%f'9: +g[#s&5 +E4Ldvb/y+ ++"ea H%UU+ +v&&Ԋm{ +,hJ`ߣ78ʜ'Y]fwؒz*T9za_bT,/KWNn,I5LwZq%Km"b +\tGK 1r$ +T. +q2KdTǖJ vۖ\HBc = kˠE! ʃ#OB\,GtmDa]0S)M5+ؽ|Pfoq`7n!n 1V>N$V#G:'TUܬ};E7Kաyݴ*BJ{2(XO:*orh^m`߫VF;Q0G$=rbC^-9}LCܻ}ڊpp> +endobj +1320 0 obj +<< +/Filter /FlateDecode +/Length 2545 +>> +stream +x\[#~B*p0$]݅$%>>} CJjU)=3rǶ,n_]Tkz hAŘӇǝVi+3&3U6Fi *m:m߻>$TA >;Ts`%v.oUa'ñOva?El5QP3Aa( +!ߜdRze{3+ws֊DyKcyp:訢?~7Cf䝟ϻ_6DF@]~1Mή88|vޅa|>㸯W\q_؞mWC)^핪 aFg}nnF8329踪Kpݢ = tUY`U9EXmh5g]eltP6 gqFW~XͲPǁ<%ӕdF/]Ȳ9WL`}֘ ;ui~65@U)eC΄A[t?ӄAn`AeY-)aXׅ0z,kCl WュHGep1+s>\uщCH~)3byVt_pxF~LaGFwtA_#D.>_ + piR͑cg +ӝPaL.v%* 0-#-&/V̑5w%!~^;[]]˝:zM;C'7n* GZ(.'WN5pOH3ĚT尐Y6so2;€ BASLBΠKJWiON—KD"`|!xRr&)iPt}1: +GJzFۜre Fn3tRv߀-В/UQ43rr + !b2"YQVF/R`I9Af:IiT,_ZR%GGJ8oF3(1_B2OQFc;0J b +F(ͳ W()d!]lׄne4(TwRdX,^ R2)RX@/t z 8|.1P9pdt*CTw5=:V{@*e#"Lf7x)d[JYȧ.=THsH*V1½q Rd LV2[?#q YtCwwu vC'0[Fc΅$A'ŦʂU`cʼW:G +ρ:O@m$)5Idn0=0$KI"lUG侭!^GrY "!GCuT@ InYbP Yަ]&Y*6=T,?WE[Kp$C z#sNY[Vw|l&v dGk67#!] 8 +]C~^HQp:)`nAJJ_"&>*RHXwt2{osƫ]] +i& VZXBF==Iބk/U~:=3Vo| |lyOhsڢV';iI<'-̾jaz[*eo)>˦[JQ!_o=> >xf ޓzRDڃ1)_ \; +h{>gY53a0i %SuKEu7a< {R +endstream +endobj +1321 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1320 0 R +/Resources 4 0 R +/Annots [ 1322 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1322 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 129.285426 39.386457 114.271026 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/JsonDecodeResult.png) +>> +>> +endobj +1323 0 obj +<< +/Filter /FlateDecode +/Length 1601 +>> +stream +xYˮ6+ehH p((-?!P_93CFM(A 0>ޤp(Ft?wx3N)S^(%c>z`y7)@8BMY 9}]U{crP^OUdF3qZ+ ~6 D" }U7>{xRwdw Vx&dLᗟ~񷷓fu.[&B{C^+.";M% +6x}w|_c|lf왦| + M$Bu̍IU!~6,Y^44>c$ILouV`]W>ڒ0eLԝe;?]vchҸO9kK+FwǦkuD$jaMbyfNbNlVr#/ŀp'j}cKbA@T/ؘ~ Ǫa־";K(m,\WJJӞU&ss/ `f&rKɅf}2 o}.ya3*dG_T Z%PIig4B g4aS(G $Rc^@2V[m;b滖\ˎU:\q-}|A~!*}OD;"vߕ^xY99LH?I.5S5G {X7*،=\9m-A1:gt}U{gd? 7 Xy6yr<^*?2#V`[\G@G{@1`re` _||i#CfXTc},&=Oih،ͺl+%ݦuLyWN_){ȷ"e?Ye^'RQ:Bt6VCs&w0Yf] (7ogi]s=ĨT&)I|ճL뢶 +E]~L(U?DZڼX&+GDYsIBc۹ +%de=)Ĵ@Je5d~ZIy?0DR<$m`;?6\uDf(Mj:;34ڀšFD UJwb]^Cr?0̱4Ź7bSxBû0> +endobj +1325 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 475.886457 585.773622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/JsonDecodeResult.png) +>> +>> +endobj +1326 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 585.773622 297.637795 570.759222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/JsonDecodeResult.png) +>> +>> +endobj +1327 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 424.368822 39.386457 409.354422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/CenteredDriver.png) +>> +>> +endobj +1328 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 424.368822 555.889134 402.046978 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/CenteredDriver.png) +>> +>> +endobj +1329 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 402.046978 297.637795 387.032578 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/CenteredDriver.png) +>> +>> +endobj +1330 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 319.467778 39.386457 304.453378 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/UncenteredDriver.png) +>> +>> +endobj +1331 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 319.467778 555.889134 303.475149 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/UncenteredDriver.png) +>> +>> +endobj +1332 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 303.475149 297.637795 288.460749 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/UncenteredDriver.png) +>> +>> +endobj +1333 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 102.657549 39.386457 87.643149 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/VerstappenFolder2.png) +>> +>> +endobj +1334 0 obj +<< +/Filter /FlateDecode +/Length 780 +>> +stream +xVn1 WHyI] `QT$bXj In2S(y89θ πDc +ez#,r{0萜 ^%#ĤD `,$vhz4NyH1!`v|tT~匿QߧWuy˅S.|sԞzdd+_}Z2]<CnN^& +h>?VL'&3H#mD޾~ fF;x7LJŠSkV!)ǎ-\Vӹ.i»w-@۝퇞\(ې/sבǖAإ[P2'A@i.{͹j_c`S̹x :9p\:QVš""b$B] ;X1,8c,fW6{]N_&twj- `LWtϹ;Y̭_Y/H^FH(d%IUfpmlbpSOA>C%I*ApT4,ZE+2q)@Duĕ7SpQd}RdˣTVv 3Zxo8&)=.Ύ"i +;T)!QCgjd뷧)H1 +ȅN~΁ +S.Cl 0a]7ON{L1ߑ0:\b> +endobj +1336 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 494.636457 511.523622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/VerstappenFolder2.png) +>> +>> +endobj +1337 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 511.523622 297.637795 496.509222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/VerstappenFolder2.png) +>> +>> +endobj +1338 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 365.133222 39.386457 350.118822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/ImageDecoding1.png) +>> +>> +endobj +1339 0 obj +<< +/Filter /FlateDecode +/Length 1247 +>> +stream +xXn6 +ՈdQ m-Ptq;(0"z$K}_q:p,yHIԥQ/:R18}kO *$6)#4H :_?<>$!Ŕ|܃|}|7ّ㻿 ͦyȑQeHIdm3J6gBK}ĉ=gwK{\z0~W=8|7_W,M^E61h~_FhMa {xUPnYhVQz#af*@syaiKjOܯB=}Pnؤ,ka1n)?ˑ<8F4OhwVĦJ.쇗gf%R[~%^^cB{6S)9Qxo+DJr76US?C 3'$Y 5a}xDW|Ao؅RB> +endobj +1341 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 325.051773 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/ImageDecoding1.png) +>> +>> +endobj +1342 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 325.051773 297.637795 310.037373 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/ImageDecoding1.png) +>> +>> +endobj +1343 0 obj +<< +/Filter /FlateDecode +/Length 2094 +>> +stream +x\͎7 )UD% ȡ@ m-?@î7KR 4Ҍ&@9d^{5GDڰȟ`bLpx{OqO<<N8b3D`F ^ [ˑ"Ͽ݂7D".Jkd"_!K1ͻݳǿ^!sYϭuZ/p<"܎򈵏EmבK}AƃL?WKe\Ĭ]Q~kphTyL{[}{Xq!e d42S*Om}mr +pĭ5a>tz6/qk~ 8O;/Wl =۪m;P/^ƺsxXaqWBhtgZXFa\Biql٤ qoX1%#džOGr;Ǡv2O '>A+U]d˙^~uhKβvlz&`cYHj!dia+Z*ta4ie<ˍEZFV%]~e48F1OUc^ adN+s˹$!y6Z#m2G,8F E˪aQ>R"hb\fV^(?q-ѕBZv(6yH-/yޮ0ut0lcJ#보2GX0*[7'fĉpZkgrG1-wD=—[670N atC+w3Lqb¨Q c>1uibś"O52GyJ7-ѵZd,X妅N}&#לiq b>ZgXõ8F1﬉4*N at}V(}4cX 37\V1;i +xb5B=[?:qZv6+Yd7i\XzES23x)͇(2ǐҞlevyn J92Ի4wZK^~KX&ȟ&m +N b>u30郗/3;p"wp鄧G' r.S?+ +endstream +endobj +1344 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1343 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1345 0 obj +<< +/Filter /FlateDecode +/Length 2463 +>> +stream +xZnWD7Ebd1f drjԽ!EngvW[*܇$"IV#u ޙox+O緋Vyw f1*pr]J/^Z\sI}Ћ¯*R6͐/6/&@{?i0ϸ_~Z|Es,{t!)Ĭ4ԲZkw-'҆VF+Sx4I7 FBtԣ7B1< sHH٩1g=`4_ʹ`\ +FW#^@\HE{- g5`701 /[okزBZ3m_gY6#ZU.xr I4]rC\t]͊dAPR$W Q aX8OXhd(wF9>g"_ Mv=&QB.F@*.Ocw ,_ 'bHbz R*DI15-{^8#jT +]|V70Um%\נ(^zML:GY2Zvm>Ĵ2u^3 +g~\蝕Rec3Y~.tz$lބQ2ݎL"u[eZmcYEȲ +1+A{0"< *h" $}dN~U 3n UjBd$>&A(>9uuxV1a. ^> 2ZM<̬8|$$c5ٴ\q**Nck#j(DP窐K6͐0Jh!O0O _͑ 0 +D%Z>`q:ù]j 1ZYx]Ą;(aRg3"&4~t&o-3Rbg7X܍ֲEz$edҤf]*Vr7W\MpnSYaq # Bע&ky/ K!_h[,0Ϟ2ՖQ[a6UKlAԃJUãES>_1ejtW$f=21%aMpS T&j5&m60*AÑ6<>02s]6O +>e]Ӥ" f@ʋhIX1 aÙ۲r4dX9!u=:> +jŐtfsuFJk=C&6 cB0CiW79=Ec]M,FC4R)CQ#8@6 A*%8nY3kO"c 6ҵjr#8fި9}8ćC4_Z@)0(jT4pc෠3E;G`a Gk]FZsf->`j* [q~Q-=4{şKE&c'=,=aY䣊Nh]ryмѫټMmeaRտzϩ+ q>Έ:sZ}QEC9m{i8:1h~ +P UmeN=ԗ/Hѿ) Wcĭ#~D"v;a~΄TZu&- #bOg"̫3S 1¹X$Nl&sd9isމS+#rѩR&xn7ݏoQ?Ao9(އ |uy+7\5+og1?RTҫ%3Kꎕ~ezهɿ>c9%.FWtkuF̍E7R`ÚެNrI sWJr=I^12yiiid +endstream +endobj +1346 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1345 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1347 0 obj +<< +/Filter /FlateDecode +/Length 2500 +>> +stream +xZ[d~_φȺ_`hH 6cp$vyˮa)IG];Co#MU_8r>^>>8sӿ4n>1t4 Nx&J1Ï_ys;BHɌ֛8B߯?> Ə?vBR#+ɂR㇃S%f#Ff_ ̄tzϬKIǔK +!a0Y\tEnzNdHMDc|t35LmZ3/?7?9Ȑ3?^y\ѵpn}H/80oC?ntǧk<_Wy۞12c2M.K1\iise= Zx +mLAgG+:ߥȵ6#CJ! .[}4dV%yD'PelmEY2WZ1)M .TZ BA0km2_$61-/n J1 DEGWBVfl2Y=,I U)3-x;0q̔2-y_z~v6~ +ʝ{CyRR\ԒA͠7q]VmV'z1ϐfJ"|t18!#z(:$Z|CP&Ʈη6'ќx%&WJ&ob' HU3NAȆ]|405@vg3W yV-.+Ur,٥xyXq4A?;6v +X膐,f0)ş"xƐŐ3KrMxm{& ۦ:lF]|. +b+3_ʛ$6%)LLbs/)bT幵;TS%%FTğ'e68kĸ}5Q'7vgp׌%aLCx+o"0>r--I? }0"W:xG~|,腓a'witX-mzFJ?#I] +dVT"{a3βX#bՉ2vه j1 v69 bY YׁW{XY +S4T?{eGu]}Yv|>@N!oȼVm{AygJuF-{V'3D^jædJ߱9R +L@6d Cį;+`XGVqW;륛ﶦIRt~EM?6yG5F[ If3v=dіo@;{T;=B+^ðn͚0K<*"t׊'HI,v6B`~ìq1FUdԠbg͙ʈ&M% 7ri5HN;VoRB*#ܢrk0lr\ńN +!V~W5:`@)I9ԕ9\uv^>%C +ܭ%,>14,k9adף'lH|S,v"pppiN'@'):Rte H`|^WIϤTiJ&tX #Y ktxrHѼ퐰#Wb/\#NOB:SMĭs*^>>22tlMM (:mDǷvVJhբǪUDDj쏴gex 9l&x Lg}=io |u l.*[ _Du-8p=dL;2[Xav9Bc`{D"7~,V2DҨvkDќ,Šr,1 ,BTuL0i1pB;^hÛ ߁sʕ0zbɶ#H|QV(3лtZ)Q5#Eo[A[r;f)d*%#V8Hm*f c20XyÌUh=x%]tځ)ԡ +3x_ߺu6j7iI^ #D%ab6 ZI!>rOib}pPGMSPg#T$SG!֐LxPIy .7iEie;JG'xkoS+`((RTvT2!H=mLS$.&^A# rJ>c)wch$F)u/79XL3Q +endstream +endobj +1348 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1347 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1349 0 obj +<< +/Filter /FlateDecode +/Length 1836 +>> +stream +xYK4CJ@Bӝ%ʏˎ=p`Z$v\U_=r^ }pV/gpK#tO1tv i J1nr;r绠y!%3"Xoϗwg eHc8Go_N,y˧ӻ_/"'*/'΍\{|n@Y#to*zCg86^4N1x-2~mm|M+eek}KsYtN/e$˥#"sM h¼&nb4jx\J9 A B{Ko`2ynqtt| iu}Y: N\|ϋ:#v1HV0催 qI'cRCP// +D cgh@ 3Q"h4%p1t/z9)(3DT3I̠hT@{#ayn.4c`0fqg("Qh4nLo4*-]yн8TV +ł )sOE9W'^5|4u ě A6=֔b\׬/P0MxYY%ԾX[>"Tax2q"\|ƹuvsN_z?*X ]/KxTT6DA\%4 A:HƁC]sр+`0Wc{"nVB! [uW{"uh#Y1H +aY#936к=܁<s5+xƯ1`~+Izz sΤ*@iדq(Q=1T]WLd(S6YH)`0劾-qԳQv/rx=Y'cx]CjftyRja\i;%=UݦܔSZ )-J2d[^Ֆk_zs-eP2Egz mGa6a%GtUe}|;f̵Au/\`Ab8΀tg!0pcA`f> +endobj +1351 0 obj +<< +/Type /Annot +/Subtype /Link /Rect [ 39.386457 667.799622 39.386457 652.785222 ] /BS << /W 0 @@ -17974,7 +18986,7 @@ endobj >> >> endobj -1285 0 obj +1352 0 obj << /Type /Annot /Subtype /Link @@ -17989,7 +19001,7 @@ endobj >> >> endobj -1286 0 obj +1353 0 obj << /Type /Annot /Subtype /Link @@ -18004,7 +19016,7 @@ endobj >> >> endobj -1287 0 obj +1354 0 obj << /Type /Annot /Subtype /Link @@ -18019,7 +19031,7 @@ endobj >> >> endobj -1288 0 obj +1355 0 obj << /Type /Annot /Subtype /Link @@ -18034,7 +19046,7 @@ endobj >> >> endobj -1289 0 obj +1356 0 obj << /Type /Annot /Subtype /Link @@ -18049,7 +19061,7 @@ endobj >> >> endobj -1290 0 obj +1357 0 obj << /Type /Annot /Subtype /Link @@ -18064,7 +19076,7 @@ endobj >> >> endobj -1291 0 obj +1358 0 obj << /Type /Annot /Subtype /Link @@ -18079,7 +19091,7 @@ endobj >> >> endobj -1292 0 obj +1359 0 obj << /Type /Annot /Subtype /Link @@ -18094,7 +19106,7 @@ endobj >> >> endobj -1293 0 obj +1360 0 obj << /Type /Annot /Subtype /Link @@ -18109,32 +19121,33 @@ endobj >> >> endobj -1294 0 obj +1361 0 obj << /Filter /FlateDecode -/Length 1096 +/Length 1094 >> stream -xWێ$5 }ﯨl۹Hy@J@B<ԥk]_Υ+=5j3UIl V@Dc -5|K(' &$v 1 0!0|~>yRkC s!:~tz?çO*/MP8Q ( O u|l*&BUr1x&7|WFT2Z#ߜkXI'&o"[L48],~0szAsI6X zk +<' XUJĕJxw.*ߖwlVdBc_/nM}}5wk·{\CQ|m_!`e/zիUτmTC~iIB>4EI\P\Lﰃ5^? -VpT&R`43o@xLQ -PrOuvr3>n.W +xWK$5 ?8Fs@aR#zt8KytfXMj:؁ȟH`bL0q|&O^?.!!!@4֡ "&D/ϧ?O*`map0$YW/NG0viCe1 jf ᩥ/͢2i $X%#ia yq÷eD%5@\J81yb b g?~ˇӈӯ򂏿  +Ll[[TՒ #lIH?Rʘ y"lJ9aSKJr:oқb% NИ`,DD9TcrYNƫxA.r_`JoDmȾ;Ti{ + Ua^:X6gg_*TM})tR'Mb3s&[D3=gX3lj‘w\=W3 =E9Teh5]V\6nm~emSgjc&-IEw]1,q+%9HƳ\|Gx[QbV+Ö6wMMy-?AMq4bG;W_Fƞխdkt +ۙ2Ha +MI,V-5^g"dU2Wy,y.q]zPqLd+lt))A +n_ᱲkk»4-& jvLH3ۓoo~{~e {/jy&iu ћOm|9γVV9RGn&x 9W%rA5r1%x+x[i;=Ux}b1E;+@i + Rr )FW# endstream endobj -1295 0 obj +1362 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1294 0 R +/Contents 1361 0 R /Resources 4 0 R -/Annots [ 1296 0 R 1297 0 R 1298 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R ] +/Annots [ 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1296 0 obj +1363 0 obj << /Type /Annot /Subtype /Link @@ -18149,7 +19162,7 @@ endobj >> >> endobj -1297 0 obj +1364 0 obj << /Type /Annot /Subtype /Link @@ -18164,7 +19177,7 @@ endobj >> >> endobj -1298 0 obj +1365 0 obj << /Type /Annot /Subtype /Link @@ -18179,7 +19192,7 @@ endobj >> >> endobj -1299 0 obj +1366 0 obj << /Type /Annot /Subtype /Link @@ -18194,7 +19207,7 @@ endobj >> >> endobj -1300 0 obj +1367 0 obj << /Type /Annot /Subtype /Link @@ -18209,7 +19222,7 @@ endobj >> >> endobj -1301 0 obj +1368 0 obj << /Type /Annot /Subtype /Link @@ -18224,7 +19237,7 @@ endobj >> >> endobj -1302 0 obj +1369 0 obj << /Type /Annot /Subtype /Link @@ -18239,7 +19252,7 @@ endobj >> >> endobj -1303 0 obj +1370 0 obj << /Type /Annot /Subtype /Link @@ -18254,7 +19267,7 @@ endobj >> >> endobj -1304 0 obj +1371 0 obj << /Type /Annot /Subtype /Link @@ -18269,31 +19282,31 @@ endobj >> >> endobj -1305 0 obj +1372 0 obj << /Filter /FlateDecode -/Length 1120 +/Length 1122 >> stream -xW6 +%%JAEöh/zh?PRbٓ vؖ%q=> ɜh:qQϗS`9zNC&G"(y`>hc.R×ӯO6sp .bNv||8E #ڐQ`'zֽxcj?%_&FxN?'Bu!_ -z8{Fː!ӀDN~4FrAoS7E. ^)bv!S -?%Z^g=GZiS:O;ˁ@Qz"0RJ]K{(ZHхU!DYjo"9LE{E mj S^)4 ̐T9 2IL< JepĔ!:*5JyZiڤkIi i|PAGy?Kؤ"QKfvuP3U\oRv(-6BOq6gޕj3U>nrv9{ We+NRǣ!Vif -4xZҀeXJYM)2RzCG~89}>3?t.qG:U@wŪj]Ľ`l$NMy߂,X|W}VZ\WsP鰮tҩPw㸩ӦNljsf;t`jT%vUcl7tۜp8m2}`}c82Y~Wvi˯"~&pKA֔*Yc),٠ty?X [iFm.1MeV#]R>""^Ὰw™8M ѶQ}ͬ;Hm/h/zh,Ų' vؖ%q=>I@'9azWzlg=_H\A8D ޻~=}c\Ĝ$ZqDZLG!;8j Nn,{\ǀ ֏J]Ό4= B8 &8Bq~wFK>CpB"! 'O?ۧ S7E. 1;)Jo z֪IO둖0)oӆ4q(~k]M4Q|YIg $OZt<6t'&(>mF¨Z$.B]K{Z)ZHEGYj_ncpI'[`7_(?9BI%=yɟUGcA .pWjS٪ڤ$5v}R+cBsI&g@rJ.agFF-١&NͼPZ>,J^d|HۡĖ +%>^dLVq}W͹q}˙T7J +\Y뗭8劋K*w蚻֯zm&_KhՒ<\ZqynܔrQJ)#7t!''#Sw +.׶XQ kK4Xa՜-9@rӔj s=^GD+77._8g۸ !"uglb QڅO5?Z7n<&&WMH.ُࡂИMAqڪV)G|2EJǺFHV֬(?< endstream endobj -1306 0 obj +1373 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1305 0 R +/Contents 1372 0 R /Resources 4 0 R -/Annots [ 1307 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R ] +/Annots [ 1374 0 R 1375 0 R 1376 0 R 1377 0 R 1378 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R 1384 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1307 0 obj +1374 0 obj << /Type /Annot /Subtype /Link @@ -18308,7 +19321,7 @@ endobj >> >> endobj -1308 0 obj +1375 0 obj << /Type /Annot /Subtype /Link @@ -18323,7 +19336,7 @@ endobj >> >> endobj -1309 0 obj +1376 0 obj << /Type /Annot /Subtype /Link @@ -18338,7 +19351,7 @@ endobj >> >> endobj -1310 0 obj +1377 0 obj << /Type /Annot /Subtype /Link @@ -18353,7 +19366,7 @@ endobj >> >> endobj -1311 0 obj +1378 0 obj << /Type /Annot /Subtype /Link @@ -18368,7 +19381,7 @@ endobj >> >> endobj -1312 0 obj +1379 0 obj << /Type /Annot /Subtype /Link @@ -18383,7 +19396,7 @@ endobj >> >> endobj -1313 0 obj +1380 0 obj << /Type /Annot /Subtype /Link @@ -18398,7 +19411,7 @@ endobj >> >> endobj -1314 0 obj +1381 0 obj << /Type /Annot /Subtype /Link @@ -18413,7 +19426,7 @@ endobj >> >> endobj -1315 0 obj +1382 0 obj << /Type /Annot /Subtype /Link @@ -18428,7 +19441,7 @@ endobj >> >> endobj -1316 0 obj +1383 0 obj << /Type /Annot /Subtype /Link @@ -18443,7 +19456,7 @@ endobj >> >> endobj -1317 0 obj +1384 0 obj << /Type /Annot /Subtype /Link @@ -18458,10 +19471,10 @@ endobj >> >> endobj -1318 0 obj +1385 0 obj << /Filter /FlateDecode -/Length 1880 +/Length 1881 >> stream xY_6 ϧN%Q0l+pZa)(Yhŀ%p,KHϏ7? @@ -18470,22 +19483,22 @@ x '@Lv7?_HLi椵܁|?S8Mi̙2ʘ:i>/i^nPƩ9}{sOb~XyuNGӺ4̆Jۏ[6x!QX鴉=\[ X #pfR3Iim&]q}M`/7zsnu5WEZkQ []OUT6­/ K)C q&{ pD ͛W_-<*o#\bWQdsz+wvY\{-]]%4{-ago.B8l&J'rU^P 0αng,Q> +ʒcȒYTKGjb,jgc.Lϊ9Ie1`!X?Cy ;[j)[U} =91'19[63CenKCt>ng,￞i endstream endobj -1319 0 obj +1386 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1318 0 R +/Contents 1385 0 R /Resources 4 0 R -/Annots [ 1320 0 R 1321 0 R 1322 0 R ] +/Annots [ 1387 0 R 1388 0 R 1389 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1320 0 obj +1387 0 obj << /Type /Annot /Subtype /Link @@ -18500,7 +19513,7 @@ endobj >> >> endobj -1321 0 obj +1388 0 obj << /Type /Annot /Subtype /Link @@ -18515,7 +19528,7 @@ endobj >> >> endobj -1322 0 obj +1389 0 obj << /Type /Annot /Subtype /Link @@ -18530,73 +19543,69 @@ endobj >> >> endobj -1323 0 obj +1390 0 obj << /Filter /FlateDecode -/Length 2183 +/Length 2184 >> stream -x]c5 f} - -* -*">g_v$'Mۙ]ҹLJ|_Ja#8yF#? - -q *68hp ?߼I!RBRZ .P^ }-RSzkdD7.İwݰk6 ̇ [`tܘVa溲3Ŗ2={lMţx\#]bZ gu<"\Ye5s2r - )Ӷ+F3,0MְaI)\!.c u=+BØ|J|L)iQٹIdNY齍>=;7yrZ=9FwگñqnL5~cٻ3τv:N8C^gQOY`5VXB^*fy]_PwX -yܳk(GeG\J%,=s)bo&YyP26tL=ܬ:4^c/`{tïjfUe}B(a {ճMY31wۤ}ۮ}I8f)Slĥ`('9lt'G9`C[zoR5-olS:[Zht2JX31 JL]h:k$e}A=EΚjf2f+降]# - + E "H}b?Avqz)E`>&ظS&(Ɨ{wUS`UJ>[ R X=c b~Ì&`v4`,ɠ7?Srt>[?o!].ԋxO <ؾpC~I,hͬZ1 -)y7nPvdnچ Iv糄c vgll/4@ ,x!Lo`}ǟ§? J(Y,+Đ:D[w"v7%VXC֬йPH̟t +xۊ7_@/ZhI m6)l7/Iait#hlo6i ]㝱F:4b^ }pVgpK3})\0}L{/|;\*Tw.(8w텐7qwG_{@4 +o{,@ag"D ~ :@!od XϬ̺ĘtL$dO&,a;9 s,sʲY{Zo?o_E$HFȷn8@#`Pq5|X|f48=\6xmzk\^28k"auNŸaymm*87D"c^ǐ̘ +#Q̳6} Tx<Ѕ8}U9Ŭ6=q&% dM$QQc`1$L*Jc1` X& +OvU?8*%ng P +0wU1@mH"Sykbnĥ,W&LgٻhGQ3V/nV2`F*j,H 6>[g4ԘVf皼3Oٖ#yȚ9Gxb \ #ѝcZ e<,XY +%q2t *f+zS$0 nvE֣R@B0GS e=S-V JdFMG4Բ'Vjf+>?ߧ +hZ +ְ)I]5 ,)~0DK\+SƢE6r0YX$>Ad*0q7$6^ +,X^FߊP&$i yN +|E4KfT2϶^w^flh[ %}HC m̺HCM,lM ҜI5OU\C fFcJXʠ6@Whp$sYuTX),Zr`žV?N|~Ofޥˆ@0sB? PDVz1+/UyXe=O[Q/7N1 +-z5EZ Ф6 Tܽ3xpfz9jf\Hl|6Gl~qGl^\AReԩtT`J2Ox8qr.F#iDOOR8GJ }dt"; Tp JZUV7ÅhUS:{` +\H]*_vY0˛mp@l!]4e.hl ")#W ▖_xkX2>8ay=WU>]}w?m1i()-/)͠_rQcfB,-S `Y ѮN@$,G5boN'9 `[zo55mlSN-Զtd`2h*hZi&:DQ gx,ϨѪpsZAZb#lm!!!ya"w0k"vx R^U&ؘm1,{sQA?Y3R {`㹆Kǃ[iic +5=:7oFLl劓d8}/$ endstream endobj -1324 0 obj +1391 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1323 0 R +/Contents 1390 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1325 0 obj +1392 0 obj << /Filter /FlateDecode -/Length 2271 +/Length 2272 >> stream -xZ͎#5)mi4J@B:6x n$s+9řssf54~Hˬš+/;9.Jɴϗ.~%مs!8G%,wBRː SA_]8*b4Ds9?/~~~q=Uy.] pMmZz{Va2kC4D.3GeI2ؑ]uk-opώh/0FD @{ -_1<5ـG}u1p/O^q>;^oQYt(*u lDO^6eI5mΎ}"sTXAˆI*@YT@ -.sd$h$P4YFB:EsA{2 `a\%e&}cߍM,#b :*E6 -P7]0>zt5gU-){5Ә|j )d1 bW&{?%UR!,$7)OIe4ꔽQ_k$0'[P@4lyzu@4B:ȡF9",#)(b\'+*`DFm= % |aAº |R5 ߾ʧ#gqtz 3]N G&'U=o qVbش7%߉>4H^< ;`UdV>,haH*@ہA;+͗C$ν'詰3F葑sV -:0.lVc=L-f3;3URI6:!yڍ'ߣ5)s"M5E:^u%9&zoz iބo|CzR3.bamzL?xNxRW_+O5A*0'-9FONore80lQ0jW2 #8/!]|3 -r3|(A5+/ՅU%2 +xZ͎#5)mi4J@B:6x n$r}U+9řssf54~Hˬš+/;9.Jɴϗ.~%مs!8G%,wBRː SA_]8nh&w88sJ-o^Ïz"nm vႄ&{5k5~u[ʄk{ yuy㽆7sgк_rWSQ:vyqy&p ץ!rldT$c^Oف[WQ FbJ6cS5+z#DZ&+y_'CKW כ{T ʿJt'/oeI5mN}҇"sTXAˊIn0*ZI ` lU\\SgHQOiD t"ƃ@)e@"K@NzOC2d7"o6U9&茪 &Yyz(@w`, +-ߠQ> +n )D90WýDSeL$25E2 #)b e!1 P !}H(+ح tOzbXz CVw' I=Tߪr,8yXc|wI +XAZ4?e[dlxsi_#IX.H$6E0(oŭ`\;i^̴r/Ñi+7Pmp8xzeAlZb?pN sW |Vy/N~eЪ 2+jBmԊ0$@z\!WkgT Q1zdUm¯ =HyTHu&yRiѓ*)sVq5s*\ļQKPRM>V4g0dF8iq;*\$\sM;ʡ>!Ho`O9 +D"o 44Ѵ:4q~j%_;a;Ʋ{J,B%|Syl݅Һ#5|g1#s*Ez2ܪጤjZ)P&Dr\ǧ5CpbCce"s+F0d]t!Sb onc1VKcADRwb 6$PiL&m 7i +>_ۡA} +4MnZVǞQug$,S.հMtD#VFcծ93ɛ,7 +L8aH(l[k[F}\fPT[pPP*~z]mvѓ5=.|rhh,lyJ.ƁfU3T$HX5nOYʽU#i#_D nl|cЧF:T@5ZzX*4VtB h˩NA[*%%(dκ'ɜk$]F?U !UDPmS5%ļQA}?J|uVU=HK9Q(BnvڣC.r>VCLuM$T"s4 {k C&6w]|]Y}ߜ/kCq!44E{l՛ +'TEA[PgٶdMFW)%Q$,7Hc@WI쏵/qݔSfZ"͘%m~Jŏ@>|O?ƃ9=M‡3W6rGdX * endstream endobj -1326 0 obj +1393 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1325 0 R +/Contents 1392 0 R /Resources 4 0 R -/Annots [ 1327 0 R 1328 0 R 1329 0 R 1330 0 R 1331 0 R 1332 0 R 1333 0 R ] +/Annots [ 1394 0 R 1395 0 R 1396 0 R 1397 0 R 1398 0 R 1399 0 R 1400 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1327 0 obj +1394 0 obj << /Type /Annot /Subtype /Link @@ -18611,7 +19620,7 @@ endobj >> >> endobj -1328 0 obj +1395 0 obj << /Type /Annot /Subtype /Link @@ -18626,7 +19635,7 @@ endobj >> >> endobj -1329 0 obj +1396 0 obj << /Type /Annot /Subtype /Link @@ -18641,7 +19650,7 @@ endobj >> >> endobj -1330 0 obj +1397 0 obj << /Type /Annot /Subtype /Link @@ -18656,7 +19665,7 @@ endobj >> >> endobj -1331 0 obj +1398 0 obj << /Type /Annot /Subtype /Link @@ -18671,7 +19680,7 @@ endobj >> >> endobj -1332 0 obj +1399 0 obj << /Type /Annot /Subtype /Link @@ -18686,7 +19695,7 @@ endobj >> >> endobj -1333 0 obj +1400 0 obj << /Type /Annot /Subtype /Link @@ -18701,39 +19710,37 @@ endobj >> >> endobj -1334 0 obj +1401 0 obj << /Filter /FlateDecode -/Length 2992 +/Length 2994 >> stream -x\[#9~ϯEV4HLzz K|vUŧ.I~`Z$9>K%~_JĘϧo')WZ̾׷ "$?'+l*sPQ(%EcpӿNRJi-J>B/?(!? B- >FC!j5wm&[7aE ICyyϗ]/ e&Oo]UB_yM":i_I8hއgP}:̭J||0qtᕰ9J8tQZ` ]e#|ORݢWle*hY;0vW?Bw?\R -[;#/xCr-mJ[|mvZq2^{gzifvnF^M߾9?Q<4icGO<.zlC# rOmqH#vi0o?f0"z'>| -& c^ƅPqlj8/m'r4&_:Tvo"O7Zj7}-m Y N<ǬX(p~t^+:3e9,:]k k y:clsq9^?\ ݥ mPELSbR#rH&A&{}/{|L%vJ%} 7|UÁkPi"FkF,䐠8 -z|!J6~@k#UrP)+&;"Ė[|RٰPQIrUd QzCHIO?(԰ELɻCL%*ahh͓ 9=hAʝAS 4 >hZ7H ?vCǤJv_n 3䝅mڒEֺfOх+AdwG1T!x|uj&8P2h?b>O|Rz*9d޺][9lmCL:Z)j"oG`,oB?b=| -̄XWz 9qt]V\.WWJB.9dDlh(g9 ӡM#/_ssER(T\crKhN|C#:l#j)2q![$hdS^l .u*c +?N_1R~^&1AE#񗯇:C2"Hb8*p*ux<˷̀ߵ:X!w~)$E_N;|M2Y_o]2#h52Et$ p/w|T[r'|0O8~LJXp^ cNQFC` Se!|ORylV TвNMa8| 3:Ry»+uL? u?̙M^ m"ADǟ$a?¸00TF~Y\M2| F?]>N_rMHirFBk3c*7}LCpW&PhyNT5]0 p F`rE@ӘHHP|îA럿A$x-83BvZ7o4 +.  \M +]+Th.E S9n9yqՕ\\v姫!*|Zm]HKI If.: UWnO>\1u.8HXlV#F3S)"A!%9Yu+uA TM;% +?b<=\2Wr ML|uQj hZR{+rI7rN9cSB<]ܜ]ʫ8']CR%XAZ=[_Q{&^ (Ĭ6*" rL,ȍ.,&OʅK%h$g5?RQA.wS@r1RPhdJq)fghش>raq1"pAs>xet%|^~,Lepҧ7jwUf.KˮUrt){H^O.|xޙ@J-#[nmY$T!^<'NYeLJEM|+!uHB+UlT{uiiYwb<rxSօ$R@Il Y:N."2 +*K!D:/C-B$ ɻBB *gLZ "ɖƯ ҃{/k몤es%p=n&SB]\ڂ7Ciၩِђ* ٢&Hf$\4<^.V%-Jy0B=-JU %յ3ev颏-Cfz9 2cހeKw@@1Qr /-V.]ԂLx[ +ĦOL<: 0E[t<t.\'lN}M ԷFw Rn R_)%rJE}- +&k@i$FkVf\rHPqzt!J6r.KYG<FT5sxpH47 ;"ĖЍ[tRٰv5(5䢋b N(dd> !&> endobj -1336 0 obj +1403 0 obj << /Type /Annot /Subtype /Link @@ -18748,7 +19755,7 @@ endobj >> >> endobj -1337 0 obj +1404 0 obj << /Type /Annot /Subtype /Link @@ -18763,30 +19770,34 @@ endobj >> >> endobj -1338 0 obj +1405 0 obj << /Filter /FlateDecode /Length 1815 >> stream -xZ͎6)e8C=m!(z@"HeKYz\"ΈW%Boi|oq}ܰ(ΈFlV(("mYf-O_7mYdKdr}pimߧwW;Rz@js jtP>qQ!eFT|v,NxHCC՟h{G?z}8Ã{vQWG+< y9zhZ4ph{l)ko0?woP$DfD^ 1v\ۀO'TS\`-ODŕ.Qsi;{,幺>LTZ3a\ L?Δ&Bqgz~)Ӹ4ֶ7ؕk þ!߫-vhtgݙoyS~̈́$Z7#&#J@2@UtoƱ1ZMUTsveMa4N &$&YDsnhSyrFY1Ȩ>'/7)0Dْxz-EgpPkrOkӃ܍ѴjDD"duqx|vga/{ׄca{k=?_sj#3lRZ4 ״Z -͋swc݈.N f֭R6%Bnɑâ/r{/ Z"tkŴR῔B`#FrffD2:!`5Z;_^SAbk1[Cd@eB+{CLȘgqf6*kpS$tG0̦[º"Uma89 h{/ZzamDOݮV$g^@ir-1 c`.ZGa.^i dB9kQvR[aA]eWE:v6O;#j63vWN'!) Z|w i526UE$؄3V%Oأ YNe -J_OBG])IWU!Mmy*5^v;feH3OVq;ݻ%)UJ%<KLJJGΚ#}~ARwف^^]2Q*_¬mvelJ/a׶ûL#2:a}2E]ą+ʔM?ϐ>\G+ڥ{_I|EءZ߂ae$L烟</?;X"Ã`1b @sLqȘ-|3t@B4&`=XkǢHCt7z9p׸0&c/| :a!zzQs.[P9~}*8 Ajf 1o3p5Vf*F>@K Z +xZ͎6)e8C=m!(z@"HeKYz\#ΈW%Boi|~ܰ(ΈFlV(("mYf-O_7mYdKdr}pimߧwW;Rz@js jtP>qQ!eFT|v,NxHCC՟h{G?z}8Ã{vQWG+< y9zhZ4ph{l)ko0?woP$DfD^ 1v|1WOxXZ0[o"B@|K /su}gvø2ƙ~(t)ceM&Wrʹt)Ӹ4ֶ7ؕk þ!_-vhtgݙoyS~̈́$Z7#&#J@2@UtoƱ1ZMUTsveMa4N &$&YDsnhSyrFY1Ȩ>'/7)0Dْxz-EgpPkrOkӃ܍ѴjDD"duqx|vga/k=ε9ZW6a-_kڏkiLŹ;nDQf3\tVKO!~h(ñIo# DSnɑâ/r{/ Z"tkŴR῔B`#FrffD2:!`5Z;_^SAbkcȀ.C˄5Wo%-1IQ -͠mTЯHR`Mu=E&'IMˆqps^pZ]H&6)ΞNF>[}#b@$"\O(b]xݲQ W@ +x, qlM9vz,!pydb;ԿK|҂Ʉzs֢yYk +v+fk :xʮ7t@WmP1:ߟNw5G4y mfNzC^Skdl>H gJG'lU!s6RRn B RuW!MmU4jčWv˂Iڇg;(w(ّwK(7͙Sޫ*&Kx?@ +5G 23/޳Zj;kۻ>)e +TYٔ_®m ևw]bGdt.:me@: W)!~!!wQ}^WK2HC_ iy;!1H?; +xyϏ^~vp |uE=jcR1[go逄iL +z#ELl#[osP=qaL3'H^tjB*3*N\=ep|_?>C F53ØCx8r+r3i w%ox endstream endobj -1339 0 obj +1406 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1338 0 R +/Contents 1405 0 R /Resources 4 0 R -/Annots [ 1340 0 R 1341 0 R 1342 0 R 1343 0 R ] +/Annots [ 1407 0 R 1408 0 R 1409 0 R 1410 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1340 0 obj +1407 0 obj << /Type /Annot /Subtype /Link @@ -18801,7 +19812,7 @@ endobj >> >> endobj -1341 0 obj +1408 0 obj << /Type /Annot /Subtype /Link @@ -18816,7 +19827,7 @@ endobj >> >> endobj -1342 0 obj +1409 0 obj << /Type /Annot /Subtype /Link @@ -18831,7 +19842,7 @@ endobj >> >> endobj -1343 0 obj +1410 0 obj << /Type /Annot /Subtype /Link @@ -18846,33 +19857,37 @@ endobj >> >> endobj -1344 0 obj +1411 0 obj << /Filter /FlateDecode /Length 1347 >> stream -xX͎6 SC`(zxAiR(Q=X6E>0I'!D̴||HOɷ?E{UM8y@*h-KZ^J]In!O]Vh۪}mZ2lj̿ dCa:'vw?@WHGں٢muT -tMVpDRG&TL7_~$Tm'tTX+dvRn*41v4,5vLKvgހs #jպ) R6^`ʓoF&z-scͲ~.2`rn*[l1Lwu6@y.r7ăl{9tBbW& Q1,lSalח͙lƑl .%9^{c3%P\Nr;(~-~GdȠia3 Pp h -1uͺmNٴ2  -tٱe-PH,PnnDpn#Uc +ʸ{sdhe0s}:]Dc mq'0΍AĨX3;CiDȹ$OOkbxZu&ϗƧ=佱TfA%(?> $=Y 0AX5;)dk,4X kgX/;tsy$ہUς@Fx"GXuDc)KϮzJ\cNP=t"p%F&0ˁ/'wkOG(|at7QN,"QC$RXMU)ݚ~"2nYKȓ -C^(e_n%fhmhTK)uG^Cf -X9<̾8tDa: sLw' plcΐ:Q ғ7PN$ hŶd)1HeAN =>`\HWe1lNB*l*_ A~]kd Tg` &0v:oSH_iM;MJ`w,?M2 +xX͎6 SC`(z=EJɤDi" f)džE?ɁJ)I5~O_N6aN %BRXhZOZc/OwgPzm[/KMG@5=j~o'/^t~|9^5Ycayoh[]- +AS|m16١ I%s /LJaDv O_{" lzSQ 1+ܥ(Qmrχ"?i^ rښ6uPӦKBy_~ Bޮe:G9>Rܤg;{yU=Άd{Mr2d_mOځ3*OT{-Fj1x3]Z*rDŰM冹]_7gl5e)pIx mr>;>"X-u,zy(qD +1 =um 1ܶ9c*nybc^o$ D:s@nu'd"coI\>pسS +A컫T K;A866'd@\=%e*5GdZ3{dĩp֦+vz4> F%e1K.A qrT + ;+hV`тfhq~ +T)to,4kς0Yv>2rOvVBFgdbGX̕uĊ`Hϡzg(H3gh({̞}8ʪI{>Ljɾ9amӑZQj\)Fl׷ hEsт(R]Ԍs}wr L& +xd@ӉkL +pXCb-8F\(<ȪAC@RXYX}醶Ƶޜ3_7y$;5hۆ@H{df녁8exwT,6 iR<\1V +8=eD=r.Y)w*U癄l{Y.+m&L endstream endobj -1345 0 obj +1412 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1344 0 R +/Contents 1411 0 R /Resources 4 0 R -/Annots [ 1346 0 R 1347 0 R ] +/Annots [ 1413 0 R 1414 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1346 0 obj +1413 0 obj << /Type /Annot /Subtype /Link @@ -18887,7 +19902,7 @@ endobj >> >> endobj -1347 0 obj +1414 0 obj << /Type /Annot /Subtype /Link @@ -18902,37 +19917,33 @@ endobj >> >> endobj -1348 0 obj +1415 0 obj << /Filter /FlateDecode -/Length 1816 +/Length 1815 >> stream -xYK6ϯPGG.-mI ܒ҅ɄBӒC%Y#Y8X`fӇNWѾUNR0',nۏ'KaHU**wNL2GЧqqRl`gYݖRoYV wkdJ΀74ȏX_ZԜpE^/~7X}vYN.dUA&_RNn^ݫ `+|=^YBZ \y[%hq`\gކ==Y~~*6;)R;+1F- UH^¦qC.AqvoO9^g6ȊwHPhdjBJ"٭ئEh{%eq-HMdFN - -'e>8dN軐w*"seYS>=9S:ոd$VD9crX8kƴa9E4w+:"Y'b$ԥQBq]ȞKނ؉z`V Gef>טZϯ -.޷Ff͈]ە#TԇT -O z7,wH+mcL EH30">=7TPyT|)!%`"~Bv#y%${WDVNUY^ΫHi Q*UDFYrPz#+2w!cQʧ2ТHA48HڝQRpjn(ݮ~Z-+}8߱;vb55;-)8qbʮ>⮊ ȱ9/E !IeP;5Vr@*[dY6VsqAR*NJH8A-k%2vJV@`hwTh֦)~?c +xYK7W̺Љ\ -mI ܒ8%J=4\X' L}HZixtbFˆG~㾟NB"jrƀ30.\3J!>?=sfL=p>#XeЏ>8X`fӇNWѾUh')DzJh0Yj;'&#lmSJŸ[_86d3nP)]зY +L2%g\I,Lu/ZV|-jW"GRZm/ʗML?{;f,'ݏq[2ª Vn})goy^0|xr,!.<ɭca80e3Ooe}cFoUlvR8=PvVb[@ M NR7{{4>~DV?CFf+$B +Aym*Z+Zخ\RעdJmDpR쓍C愾 y+2Wo;%ӓډ8%C]K6Krlej9@43v,wEchLJ]C_Dh,}" i B%{"MHB]5k--;сf03X)-ihm8tߎƭlʽ?5kǹ \(N\9&I>Tcj;#P19YؾIHw3js2clQԀtb*z`jj).!QC}\#ܒC w)3!r˞R_ Sc%_ tЬEec51W7Dlq(⤄Sd_:ҸM._,cd ]mm t +6ywXIQfm:#uu~::0& TF>pE(ld霌u*zՁ:ƿE)4qέ,DoԀUf6wڊN|bUqTHnShq:w0,EgGB>rbJv?Z?5l]`Wn.G2[:2-,pnHnrv(+))+c:û| w)eGļtC料h 3crTN/93V9d@{ɼo`UѤpXDZe%M';jtQdZ Z2_lRy*QkR% lDHWZDFbtVNEF]ȕB B??Wy%*U%d@_B|Jw„[ލyud*-$BZ'(DIRJl i3[WU%'Y?e$`iTϾ⬄5y x%I/ĹIj^BVҀo{Z endstream endobj -1349 0 obj +1416 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1348 0 R +/Contents 1415 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1350 0 obj +1417 0 obj << /Filter /FlateDecode -/Length 1940 +/Length 1939 >> stream xZK6 ϯB%`%-P"JɢLn3Y#QI+)Bޙi|r-'hNr^hwS4„ C BJP/j-KzG-<~R)aetrJ߯.f)`eŅɐǀ)pOI8+& @@ -18942,22 +19953,22 @@ x F:j(" ra Y[lSu#:6unuU3bcݴA9u&,X-ë uX$.Ӽxq7՗e+9cԗaHUAȩii+X,i|U+'.]h8DErrKN8=ȯ9,)]W4.d5_*w5Jx ^9dIxOx͚*dX;[ia6A#ɜ viȐfׁZQNaEB]#sдBU\ MtK7]M܎1gavQxM'Wkhd|k@B#;ݹ:9-=dF!sQYn;9rbse0CCG$ RmI'U>. s*tl|spݾDS_Ֆ~tii@ 8$w[aWlJU)z9¶^եn-|;+g -Fx(w02i5 -tc'vF-|Co9=qv 46eka!LM2Lwg쑭;J{V>Sn׮Ej;1owޮ/E0K{uP&]#l**ӒEQdK#{e4+rA'=y;$q¦=Z*P0~,)+:hޞdvjW_0ņmc7;,xYRvxw xWDFuƐ)M+U-#à&f4^D(ƌPt^n'a+A; n^Ȓ릚HyiWhf#GŬgcMѡMEx;bEn ./%QJ"}yXb@(k0v-~?.)AUP`+&Oi0 /{NǐB)TsLJ#+DN6D?z Ŵol +tc'vF-|Co9=qv 46eka!LM2Lwg쑭;J{V>Sn׮Ej;1owޮ/E0K{uP&]#l**ӒEQdK#{e4+rA'=y;$q¦=Z*P0~,)+:hޞdvjW_0ņmc7;,xYRvxw xWDFuƐ)M+U-#à&f4^D(ƌPt^n'a+A; n^Ȓ릚HyiWhf#GŬgcMѡMEx;bEn ./%QJ"}yXb@(k0v-~?.)AUP`+OYt6 !V8CI@@R5]6:ERdOÎn endstream endobj -1351 0 obj +1418 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1350 0 R +/Contents 1417 0 R /Resources 4 0 R -/Annots [ 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R 1358 0 R 1359 0 R 1360 0 R ] +/Annots [ 1419 0 R 1420 0 R 1421 0 R 1422 0 R 1423 0 R 1424 0 R 1425 0 R 1426 0 R 1427 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1352 0 obj +1419 0 obj << /Type /Annot /Subtype /Link @@ -18972,7 +19983,7 @@ endobj >> >> endobj -1353 0 obj +1420 0 obj << /Type /Annot /Subtype /Link @@ -18987,7 +19998,7 @@ endobj >> >> endobj -1354 0 obj +1421 0 obj << /Type /Annot /Subtype /Link @@ -19002,7 +20013,7 @@ endobj >> >> endobj -1355 0 obj +1422 0 obj << /Type /Annot /Subtype /Link @@ -19017,7 +20028,7 @@ endobj >> >> endobj -1356 0 obj +1423 0 obj << /Type /Annot /Subtype /Link @@ -19032,7 +20043,7 @@ endobj >> >> endobj -1357 0 obj +1424 0 obj << /Type /Annot /Subtype /Link @@ -19047,7 +20058,7 @@ endobj >> >> endobj -1358 0 obj +1425 0 obj << /Type /Annot /Subtype /Link @@ -19062,7 +20073,7 @@ endobj >> >> endobj -1359 0 obj +1426 0 obj << /Type /Annot /Subtype /Link @@ -19077,7 +20088,7 @@ endobj >> >> endobj -1360 0 obj +1427 0 obj << /Type /Annot /Subtype /Link @@ -19092,31 +20103,31 @@ endobj >> >> endobj -1361 0 obj +1428 0 obj << /Filter /FlateDecode -/Length 1409 +/Length 1411 >> stream xXKo6 ϯX(Q/`0Eö)Zċ"zYƞl,QǏ &I@<>8$3>iF#=~夝p(g&^HiPkaPk馯ϧNzpR:&`3`߯_NgriVkaSvBO 0HVeVrA4_6,zE|6'3~|@ iyl`TČI#*u%;lor0ja( ފ F-4KA`5(6aq"] \yʼnmܲq̊9ĵcZK"w-[(#],= \k<stE6p[07>8А)5B)\(ƹ2m\2A5HC`*k<#P!Nre 然Yy;z}梋D8s',ˊhJ^) 3~lds N"HX41lR@eeG{[ -3+cwUXHf,244[JH^v 8'Gdz?6:{qg-+ E(#oR m6$'5#mڧ> ;ꠁMӃ#: ylŚq=-n}g,\WN PX.wٞG3yQ~וfԞ V^cYSJ~wC ('(|m˳y8Br|yN;׊b^~pcծMkCV[/wߞn;#mڧ> ;ꠁMӃ#: ylŚq=-n}g,\WN PX.wٞG3yQ~וfԞ V^cYSJ~wC ('(|m˳y8Br|yN;׊b^~pcծMkCV[/wߞn;F)@u +^ιz+&T]\|'07~' endstream endobj -1362 0 obj +1429 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1361 0 R +/Contents 1428 0 R /Resources 4 0 R -/Annots [ 1363 0 R 1364 0 R 1365 0 R 1366 0 R 1367 0 R 1368 0 R ] +/Annots [ 1430 0 R 1431 0 R 1432 0 R 1433 0 R 1434 0 R 1435 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1363 0 obj +1430 0 obj << /Type /Annot /Subtype /Link @@ -19131,7 +20142,7 @@ endobj >> >> endobj -1364 0 obj +1431 0 obj << /Type /Annot /Subtype /Link @@ -19146,7 +20157,7 @@ endobj >> >> endobj -1365 0 obj +1432 0 obj << /Type /Annot /Subtype /Link @@ -19161,7 +20172,7 @@ endobj >> >> endobj -1366 0 obj +1433 0 obj << /Type /Annot /Subtype /Link @@ -19176,7 +20187,7 @@ endobj >> >> endobj -1367 0 obj +1434 0 obj << /Type /Annot /Subtype /Link @@ -19191,7 +20202,7 @@ endobj >> >> endobj -1368 0 obj +1435 0 obj << /Type /Annot /Subtype /Link @@ -19206,10 +20217,10 @@ endobj >> >> endobj -1369 0 obj +1436 0 obj << /Filter /FlateDecode -/Length 3189 +/Length 3187 >> stream x\KWhadIrH0yAz@)E.Y3mbLJZ9N^ }pVoΜ/h>o F:{ iG'<KbF+/sywBJfD~I0~ EQԆ3 @ajHpϼ^篇?៟"ʓq(/q.ε/|FE^Θx=^^ܦ}n?{f5W(.i@'2w01 @@ -19226,65 +20237,59 @@ M xSg?}:#]ź.LAվ%  JL%~&Pퟴ$P'G$ʠ<5V*Q^LO|~{ȋ:vH#cߵ|`ُ(hnF{ՂWU| r`6ѓS9vHV̓B][%L&u|6U^Wf^M`Σ hK(U5W61<f O^s]&ecpQ}sۣN?ɱ0yz.NH` 4߷\q3d\2ah|wIJ uoVMo qǴ3ݤz~\-0Miރx= FCKe]|*x&vm(zaT0s2 =A !}Q̞YA? ŞݹJ-#:0FE + 6D$` -ZK5e$j,,rh|wIJ uoVMo qǴ3ݤz~\-0Miރx= FCKe]|*x&vm(zaT0!d*H.3G;lE1{~g[x&@{w*{lEj endstream endobj -1370 0 obj +1437 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1369 0 R +/Contents 1436 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1371 0 obj +1438 0 obj << /Filter /FlateDecode -/Length 3849 +/Length 3845 >> stream -x]K#W, 6v ։#Ǘv?bXj`VUXU5g?ׂy˗'Μo8"cI9悑Ξf{ τRARh;ߧ.(8wޝ7q?~Y0~W4> p$fEajv 'O_NO,<UzRs_97h@IcCn<|ǿ1nUOe:M?x(øI΁?2çWsqM[+4ɨGB;6+)Q|%]o6VL:dD t-t3 c~?_-Acg[ t5-6,H+ usX;/I~u9!ȊJ:sZ!쬤 _QVpM#8P3I#o -67Nk4NydO 8Lo hx :8_XkB -.™2nlŰhS\^N1FgN2)U3rIn\vYj+2Du[g - GiPTz5-p,Go֢зL -ᬁND7 -&@a&9t&V _Tyɉ$h -{-:* z88ʃQ4h%@0Pd7L P]*)'bxT/H"Ej.8@@_]bIZʩ ym< _ǼL:,XmnXlHA[yY a;@ )ص&;RP L!"nm+vI"@ 5Nko߫.?^a>r64d[VAP;NZuqf~&ZED@7ZE׍VQ~V ܤUsݶ kh70R(cuArm4 -&:V( 1Ѕ`Jpp~8x%;H21G( -R+UfӺ m@.Bh&+d'+huT XV59V=u.#ϻ8ZEJ?ZEw ""FA -UZEc7Z%B-U4q7iUvhhMn2oUDtU@M%iQh)dȯZwo|sPi)To(/Pu:qFŒ-5DyQd4T2}bDR {%xcf}i:SEKqoZj;lEkdF{v!}یI4XFCx6ԌmCi75$7.}!U޲EoI\2Ѫ]3mƁv@EޜbE rDUɑ)R5 S43eˢP-K-i -$ kj,& 1)+bՊTۘXZHwK+4X \Vhڴexؿ%B)m8K^k췈u F3-M# Ϊ,@+Bfg#2lM،R;cY0[SjKv$yp4jŔ5cJѦIn\)5R-k^NV\fUϪA ДUGj,t9 "b("٬޼n:TsE<.&m)89L=k >)^'-4ՖmR]z'S‘*-AѸvӟ0 +x]K#W, 6v ։#Ǘv?bXj@UXU5g?ׂy˗'Μo8"csHgA3gBpQ)fRܝO|s;BHɌ֛x8ǟ??},?+E?cc8KAt"05H;ń\/~xQ|z=s9ׯh4wh7>t@\7pp=}q:^y<70ncsOƾ ]c?}\ + dvP#!m(|>7+~&2MzPs/gqz ^-sxpKBl^[_ giq:9W,ve| |0rR_]GN3ÜA;+&AiT0*y-;0o# #o-盄͍rjx=%9/'Sx57/~/d!nL7*pS)mZ/'TLo'k9$7.}ZmvǺ34(*p8 ǣ_֢зL +ᬁND_Lv/Lsyp1K&ǿ?D&଄09DW&Dw293kǪU}eiJ*%}/M$A6 IdCt_[tT0qphJ(80an`U dSN&^&E*]q')9S?Fx ;2:ty?s8}+T[Ycܰ`+ِ @0wD= SkMvBDlgV^"@ 5Nkoxau/wI0σ^9UhN2T*/[8@D#Ά ڤ#)h0t2G ,kb*@I^s1'mfE肪ny5.Be[h vv!gk<+HG7q~vKad*hrO -^m[Ӽ Ŷ qJYƒuJä)(B z(_'ʺ8ZEJ?ZEw ""FA +nҪn[Ȁwb5bp|C)qi̺ 9]6\Wdha%Q8 8?P $hP*o3i݅6IxZOE2@E T*WbJb;F$L2 &Sz'wa4hn4(DE@/D׋&MJn/_7hKV@k4.tIx&t) +mt ;ѱ.b#0)jeU5QXPҥ\t(o+N>զA6i6Xp:N6[%ZX>;T O&~R;ѧ{O4O4y'"'n +&WܰKAOU#R;uJ)Q}YiJ xŜΆj`!.j?:eb@h6SmJ=hiDy%mJ̫@ +z [f ^(SֽQ&UQ&c((M^7D Tpx6-jB7ӧީj;Qz';DIz'Ł:ā'މ(zwz'Mpk^DMNADM%;Q59V))#U\Fwahn(ZEE@/ZE׋VMJUO!ZU5` :`=iU^j'JjiLcݤU%UĞvU4y@0"ڦD jj,NAA:{Y;VЍVuUTߠUwӪuRV X "XWZEԱڇZZ Ms`**qn&o7^ +*mѪJYƒJ2aYʻ7Lk>N9BUR *7CQ:8taƃܖ@k(2\T{N*X|>r1"yҌ=irm^bYP[)rZE-ׂf6Ȣ5n2=Ppm؎$L GVoj洛}ې*oY7$.h}˶} @A}{C"oN`h1 +"eZmk9ܿ Hak)2eQ FNp%kvq\fOjAhf55ytbjEmL,-m$ʻZ_^U2}$gX?՞>4 0T˚I"c渒,t"h`x$bX1c,Vi.r+4m2<_h!6P g5[D:fmuRHܦݑmgU~@+Bfg#2lM،R;cY0[SjKv$yp4jŔ5cJѦIn\)5R-k^NV\fUϪA ДUGj,t9 "b("٬޼n:TsE<.&m)89L=k >)^'-4ՖmR]z'S‘*-AѸvӟ0 ( !̑ Lr8UjGL=L @[KcƠ&>5Z1\_C6LJCrphA^-yA:= ;IQ_ɛ>/MEG> -RAUbܓJ1Q~:Ow7ON.T/K}Q{vzd׭/4EX MA֞ɘpulGNh?ԊS_ԌS_Ԍ+ÍKpT/; C&ZsYXq ʣ0Nh*xqoP n-Ŵ1JVZV^K~U.]<>Xj˶ S j'$תJ%v1 ^(HVF)AP-):0H,/Lr{e4ܺWM.n +RAUbܓJ1Q~:Ow7ON.T/K}Q{vzd׭/4EX MA֞ɘpulGNh?ԊS_ԌS_Ԍ+ÍKpT/; C&ZsYXq ʣ0Nh*xqoP n-Ŵ1JVZV^K~U.]<>Xj˶ S j'$תJ%v1 ^(HVF)AP-):0H,/Lr{e4ܺWM.n t-)ޓ,YQƬ&d Cڳ^Y;-7-g -;@ӻp-T;m8Zz.H Q Aգh;-+P:@GsE(58fVkNO5kӍO8-Gՠ"Dyj1>}5<%q锚^O_K+sE7JEj[*nQ_w»u2tfSkh{ayiCL:T`@nykX mR:h AE''49eK0QD1#uۉdє}ƣiҸ&mwyR"#fPRZNPMmS;nC,Nqw9b{I(5ZC,7Kam -9p܃ *Hf{ As`=t.[EPe -OA|HAJzbGuY?-cv"/G7cT +;@ӻp-T;m8Zz.H Q Aգh;-+P:@GsE(58fVkNO5kӍO8-Gՠ"Dyj1>}5<%q锚އO_K+sE7JEj[*nQ_Vu:M S35[0U̼4uYtk!&Dj +r*0 7?5,v{6E4x o"ʓOa?Ӝ2%(d\PwDS2qh>4i\M6@ƻ<) V()-JmBզ)!'ɸ1B$š -!S͛6}P^dAv|bQ΍ e{ As`=t.[EP2ZI >$ֿTe % T#: ||T]۬vP疎q_)G7cT u/c]5e -=ݓsR[ĭ.?1X +=ݓsR[D.?00 endstream endobj -1372 0 obj +1439 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1371 0 R +/Contents 1438 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1373 0 obj +1440 0 obj << /Filter /FlateDecode -/Length 3215 +/Length 3211 >> stream x\I#9@"FnB,@ABSPI"??*~fsu~;}?jFC~v^ k^-9rp΄A)d˗?O9e:{\EsoWsx _nкT~4kBSE|Rę[pNo?OgϷӿ1^_ӓHd^gGn,Ogmg|<^yԅ>Qxæ{;k3iPt=osyM*,7)H>▞@ϟ? (HDŠ( M j`$&f+cE _.*JvʔkdE;DE$$]} EFa~Usʁ9)"+ s.:Mpn+Q H%-2m8VYNqc=4F/XL*,5SI\**1R+f$ Qm/%ZM<١!)*b@#|kE(&s; @@ -19297,24 +20302,24 @@ bר Ӥ0 5߻˒ICIFݸm%TJ9iC)B9F=Xw;OqJ+̕hI)#(ʃm swȶ*1vL.6Lߵ-9c]RHS69u찇NiQ^~uRY/- e'{ fQ(h7\~٩ݻxYNUX }jHf}n9O>0f懩.ZդU4G؉ah+V/6Ztˋ刟Ңa55=S4g׀^W&n6e͇ y𖔧h ЇK}AhRjTj^&8A1]+y 2ɻMp`fcr'%MWg7`g6<@d(Xfpy;瓆ն o廮] EIibw(e?|.gi󫱋|N,̊p~JO\דUlv6]: % Wd: nZqX1z` -ד m h*f] |wӔ;b}B!(ޑ#ȱb1ʏҡ|) lPN66X|(at]s)G>c T7UP]4.o/ U>UB"H .x>%$ӎ{E^]aLQB-vc[HT}ƣbH[>ܣAYqj䠵Y\osU|=oCo7c{4"A~{μcPQף׍)#z`&!C)B+Nvq@wt8C>,+&yk~رxKvlMFrXJ{~Y^r@}zshհODqᗋ\hnyW8[\8;1p<vc}3LhyTin.u;@bOU-֞A~?1yEd^k0rXlL9&2>rQVwE161ݥ SS4@464g):sfKņ΀g l%0žW~|];gA!iϵJ #@Wtcu SŐ 'd\7$[ +ד m h*f] |wӔ;b}B!(ޑ#ȱb1ʏҡ|) lPN66X|(at]s)G>c T7UP]4.o/ U>UB"H .x>%$ӎ{E^]aLQB-vc[HT}ƣbH[>ܣAYqj䠵Y\osU|=oCo7c{4"A~{μcPQף׍)#z`&!C)B+Nvq@wt8C>,+&yk~رxKvlMFrXJ{~Y^r@}zshհODqᗋ\hnyW8[\8;1p<vc}3LhyTin.u;@bOU-֞A~?1yEd^k0rXlL9&2>rQVwE161ݥ SS4@464g):sfKņ΀g l%0)8Ghusm! ?Gy endstream endobj -1374 0 obj +1441 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1373 0 R +/Contents 1440 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1375 0 obj +1442 0 obj << /Filter /FlateDecode -/Length 2110 +/Length 2106 >> stream xZɎ7+/`  AcvfdKぬ"k}řǿDkę3<+7sHgA3gBpJ1ӿ{s;BHɌ֛BOwk}^_rkyYKk.쓾ozy˺6 ~=!y}'OF.r^NOVnVIlln̛o<"0KK'&H񴦾3  ƻsf,`_W0ļuy߲>ہ9[˖r.bNuX˂]lQnXc ͝i3]3wCȡv:rx6)(1 rq* @@ -19323,53 +20328,46 @@ x \EEg(jndDH2bֲUZt{XmaHKw瑠bk1.,5f<%|{-C4Lz i `]4n%N w[#\#r5ABq$`i0+lB̶_kaC}d>`EaCpZ<4\Dnl hh|#ᰂ%1,DP (. VBĵ7~iv+U@6 s'DJPlIXD]Dd\ [ yjHN>Ԙ-DF* _` _`G27uyް :0u ^*0:z/^7G500@i&W`MH9'HG 6|w| ҡRFvǀ gfXC2(U0 oo@V&84L("6"F5,\֣O )Pʴ@x}v}ww45i} (LxU@{exmeo8A7Uut`p+#p Da?h 8OMr9ʩĊ}/|e/q!@>ҫQ+h` #>H;;; S C4Dj&:Pw)jfí7-ts}t٫TaC'罥i ߥ\ URݬ4J׵u-9"AF!y'l~s -DdQC!q\tiߊ(F?l#^3|=+5[px-3~CPx8s/|5~g-y*џt]}I7n]B^|ˀo~|{-oҽuo9nƽw/Ƹhq6igbfi}q{Q0n졶pO:CJJe]70hb< k)8韫r( -Ɏi~_*C@ *tb0!= fB+#I> endobj -1377 0 obj +1444 0 obj << /Filter /FlateDecode -/Length 1944 +/Length 1946 >> stream -xZɎ#7 +Jk>H\tA^s3 JXRLn/#IQ2ZN/ALΈF4A-fvI{/rtORY/VJO?| ;J9ϓ&$'q6Z*C#DA"LjH -?{o_~ןxq9v;"| NBh^ a]|ڇ2S8޸u~.:qn Yul.5mK}_{cf[eOUYF^'N2iIjiNl8*,{['l :Dor2d]3YӧB|^ÀE -j*sYVW/Sy4( ~/^BL5p*<'90zKܐ l]?? -;a6j -śIXj5$Z`.:#dL@@$ER0*MݖոF6fRy ).dQQ6ڐӣ .>4VCd$2 -* Q%C%7,ϕ/K.E,` ta՘dӨ\@jcɥ-ۏ뭼^}vߞ^/mNrvC cHA(v=ש{l%32>Dug2 ufcxi|V=,Y&aoð!'Aᕫh 'nN UȰDD@ou3@o*^"Ҹ+۽ii(YePːrֿ5K:۳@TZ4_7>C2{d$ibF ;9|YzezJR=y`Uʽ:" -yh@:}{CT)VOHv˩w;Jp0zsnڳRz]Â7^6hTD5 -=9#1.:d?Md%;T{I4E90(tƵ5y]-ʆ~i#&#b6o9ͯn}<1ig~eR~t#3Al.ΐ:gt%}RJe]N/R8\i)d+l* -C?l(.fjQQrn$=AEvNi6hb +xZɎ#7 +Jk>H\tA^s3 JXRL7m|#*yx-'g &gDI#o3;{\~9:')Ŭ—JMF+%ۧq[pzGc$'q6ZU4FLa0Ƿ$E*~Z߾>˯?(~sTvE>:.eO{k|9mq>UZgYy(S\;h93'o8څlXt:uѴc^}"=üjtYMp]) +V1!☴{uu4GTie t$C&;7r\'4 + "" Kr{O3k3")3g_{p$=kA/dUlLQ@ D<9!5L84; @m)/8&{BD]*p rS-mp6:Nt=d}"\6ցR,/1̲u֠Cf!'-Cv85}*5 X2%n5y*@2Wl]ϬQIZ X⥙* p)z[ {1sSY_, Z EcfP^֭^C~Xb3BNƴ [{ DMb@XD)yԱm)M^kt7=; u%9,}eC@ Fuj|JTݓ33 B#A/! !pNG0`R\N;Qb2F(3;I"Rqu$]2߉Xƛ@<*H&0 xvܓ@tBߏr`V޹/(GR;<7 Ğ\ _G!@=VR &jܮ랡6tDF`|yﲳ,Ǩ_dݢҰE YMoM> endobj -1379 0 obj +1446 0 obj << /Type /Annot /Subtype /Link @@ -19384,29 +20382,30 @@ endobj >> >> endobj -1380 0 obj +1447 0 obj << /Filter /FlateDecode /Length 367 >> stream -xKO0 ;?"u@_I7M.z0;A$cQ/n pkѢXߺāD&9d!&L) νϚG1TRo۸' 7nmP_V˷$Ǡ&aCPlslLO{vyX\1E0" C hML=V2ƄԸ!dӿDkH~fhKSG;E:؜GED\kbZEU2'BF@#li^?IKR -XrEgc4FP54xГ;٨]0!6б +xN1 yf[怀C4$āӊp2-LēeGFrI~3Zi;~խ 9p g m2F)Fdܝ{ul>%e3b=~.P5*e,qB?Aq${QaߧqPJ}lS> endobj -1382 0 obj +1449 0 obj << /Type /Annot /Subtype /Link @@ -19421,28 +20420,30 @@ endobj >> >> endobj -1383 0 obj +1450 0 obj << /Filter /FlateDecode -/Length 610 +/Length 612 >> stream -xTɎ1 +dq$8 \Fj =A%*5\Um;!t"91y6R}fSt<\'dP"!H!@/?WKIEE,H-ˣ;\Qs5ކʀS*`p2;2YqE}{š/Na' 'eB3Qj&mhHt.2R}e .vUO87.pYGߩ;|%C;[tstlT9r82p;ei}n2UWmS1L>I [+2y[5 _q}3kٿDD9\X=vi%`$jU9Z==T m@A\W@ vkfbff0%n; lj؏J ٬[pb4 p(M7̓$hcQ̽#P:0t8?>G=Yn m#,-.iY78'-@SE ,*,@q7eӾT4V|}J:JaBAd +xTKo1 Wډ8jHp(\*- qSZt13<؟?{}#N$Hd ĠOlAdz ɥ>EɑJ !zc +}i_O9$YDcEmy_檎6 UP#"/BdO˧[,}p5wp?(yR&PI-4U[yaOkV3RhHt.2R}e9 ._ =u܌4eͨQSwJC;[PAQfŮS \gۉ팮+E_Ի=jޏ+6:Dod37azE'%>XS˯ef=hpIb AATwk@S;0ķqC\K4^2ڝS\3[MUĽjLw +\2#O82Y3oK#á601hgQnsG.bF˥{Gv>u`*q}]z G!?Bq(tB,)M@] YJ/nORʏϥPH~)(U|?d# endstream endobj -1384 0 obj +1451 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1383 0 R +/Contents 1450 0 R /Resources 4 0 R -/Annots [ 1385 0 R 1386 0 R ] +/Annots [ 1452 0 R 1453 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1385 0 obj +1452 0 obj << /Type /Annot /Subtype /Link @@ -19457,7 +20458,7 @@ endobj >> >> endobj -1386 0 obj +1453 0 obj << /Type /Annot /Subtype /Link @@ -19472,30 +20473,29 @@ endobj >> >> endobj -1387 0 obj +1454 0 obj << /Filter /FlateDecode -/Length 369 +/Length 367 >> stream -xN1E -@L,"DjD( A/q =$ԭHO*'3W)%m6NMW.M-DyTL`j)e7WKR"59. ^-'PA,.A$/n<9Hfu{'?,s5!Y9d&y@l7l,`iϊ WqpSп8ETFC~JĐߡNo^+\w0͏8]/ӿP^K7苊&T'S7(-\Xvx~oI[: Ն& zԐ2J僞Q=]7 -ڰ +xN1 yŋTiH-ӊp2-LēeF2e~vk[85,Q"d)SݺWWϳ,c 6nݭJ=))IX6`&+`zm=ǁa/ Yt@zZ +}mEi ?hO=e1a&5n/psyuqR+_9&;NsJc_p?S;Bk.UL_hLf:DT j5\[$-J}lrMFZ!DCJUCC=c5 5#fK endstream endobj -1388 0 obj +1455 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1387 0 R +/Contents 1454 0 R /Resources 4 0 R -/Annots [ 1389 0 R ] +/Annots [ 1456 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1389 0 obj +1456 0 obj << /Type /Annot /Subtype /Link @@ -19510,7 +20510,7 @@ endobj >> >> endobj -1390 0 obj +1457 0 obj << /Filter /FlateDecode /Length 3108 @@ -19529,22 +20529,22 @@ D xMçv T $mSL/`09SR*mzqڗ\I蕱 ׍@'Kā˟O py^lѾ,fsw=Z}m'B*uI<]勵ӀRhBP(L>#J$B~f|Z|- dOfm'3A#UT;%'L)iau(Eٖpj؂ ]%%-GFf :;jO-QlʣAZKJ=a߭?0xxN*Vj[ V6VȨ\hҦPޡDms9r4a(P4*m:6}^( bQ>#zJKzT಩:9*@A l t0JxhΏbNۙ;~ҜbzTvOXe{_Av*Lu E`{;y)Z߶fPOn୍,4.uiqQ5NvAHT1ohGE%K1oG+GBơ"WL!,iGv !G8r;J7A f ژSza ,EjGM:d9;S><^hJfT-Ƞ=ZR>~ bҸ.Jh,6srZQzCQKal"%@ҞDI97* -O%ENY xC>g渌oHDOq5FDgvQ'{]E0S:\#ʭ? Iuɾ?w'?<>;?9ۍFYIё|~K_ŬT}raSR;4>a45uEOLBcT֧vbOJo\~ sH<3HOulS1! O!DGa# +O%ENY xC>g渌oHDOq5FDgvQ'{]E0S:\#ʭ? Iuɾ?w'?<>;?9ۍFYIё|~K_ŬT}raSR;4>a45uEOLBcT֧Lz3ԓ߂?<- R%t`dSbt@>S|b>Qna" endstream endobj -1391 0 obj +1458 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1390 0 R +/Contents 1457 0 R /Resources 4 0 R -/Annots [ 1392 0 R ] +/Annots [ 1459 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1392 0 obj +1459 0 obj << /Type /Annot /Subtype /Link @@ -19559,75 +20559,81 @@ endobj >> >> endobj -1393 0 obj +1460 0 obj << /Filter /FlateDecode -/Length 2840 +/Length 2841 >> stream -x[ˎ+W&.f^8 ,4W`lTli+w*Rt'Zĸo/_^~}QKp*MySń%ln ƨv :.ZդY5Fo~^%(bhӛ.З/].?6ڷߝ2F-i4o/n1;EZ%1Z{y廿?Nj?(&RUO432αֺ9_95s5e=><30>}ii,be|[5K4۽cq-uh~ɠ^~#6YPkpapVf޼-4L܉*D\me -3vBq"(2"0Nddw;ޗ*m?zwu -KC*kr&L~Ș+& -!N[l<L"jM*2n;\擡n`ױG!A+xtS۸yģ>μ aH0'@qu}׺4Af$U982"uJD$2i +7a^_"bBT Y `12^Ϭ0]t[W Mbb2J (2w>b?-)A!P}.֥dw|&BSݢ$ڒWP}dEq~2V=XL>)2g"a"D"J#b ~"ZmuZhXpM,ш@SSG5j|4m.Kc7rL+H$셠*H+qU4E`Y`1SW q%3U3HÍAiPD0XEnbֿÐ&ִ>mʎPX!<=# GeŐ@<l]Wҡw|)ۖߏazIyd͚Ɛla!(CO50 `e{ımb|#ZI=YF}Nxg'eu+ϭ˦b|2X3gVRdWͫuP4 {beCZn7+KLzX:wnH̪߅7USI%\. >sź0oB6uCE k*Jṵ}Fͩ5D [ҀF'4YD\QkRT`RXǬVnD} ގC25@oFMh'd%@dC2Dgȸj<DŽ;;_ƹ( u5$g" -M ",nƒ`&EVS vǰN)(59H\s%z:0 a7OM.&`ԛس!& 8s3 -Rg!fTk`;>P,(v>^ '&EOSX1rGtlC| g^ʒгdĸup6WM -+&Y(@@- sAG}o!Ac[=NtD~:ΟO^=.YMܖ3f,;Y[F(YҮ{S *f#$8!%j˜+pK -d'toLkUo+:1vc0<D_knAg}`ghF2#xpj|NJs!-Dv@@Ueb&aG`ldaM$$ BI8TsR -$ @3y7y.;\:W#c-'m`͢i(bn.:LCAEP'/CVQCBtR]R#`΃A=: -fYiI: '?ny;;QO -0<п -: Ov1=]ʨ~>W`L -dg՟е >`Asw0M.LR@F: P߰ l:m)*PH_*&kdz Ru#8&oC 2/華7W.>U4n {w3e89Ӌs"ש$BW$f5]!oi)tS΢e`r`;j#:6sTs%ƤĠ0!tMTVcP]VBY15²U2#ŁUV_4v|4j"xe/d18Hf؍<tT~iNB֋U4:S؊,uOߞ|S۳קooroϓoBGS)vɾ[%{obKI -S~諕B]]^7 7A}Ƈ-&G'B#Vc&V$G#[bk&0A2#_+\݁6a?. !Ԇ*ue@$ +x[ˎ+W&.f^8 ,4W`lTli#w*Rt/Zĸo/_^~}QKp*MyS KeQt\VI8k +a3KP*pz]7]/_E]~=moE; eZiП^41bvK\cw_Ǐ[3+o~QjMXOL>sikge\co=ussk}kZ{}Lyf`^}~}:Xރk:ؗh{Zk,A/|G2mxǡפDî̼y[h$U\0"kf~@iEPdD`2\v/U:~46u:ۗ94U MU1ѿ=WM +a=*=C0rغy8DԚ1Uev'C!Ac*BLW:qhG[yhM g @qV 86gOB̨'>[A%)j5v|NYQ2}br;O+rM\ e +cG(D;:lb%סgɞىqY1;rm0fWLҳQZ:ďZߔCƶ.zt? cA-z]ț;-geYw;PVg]A9TrGHp@SCJպ/1WN^Y.;TWt c!`x* ܂6-Ќ=ëe4FQQCZI섕LiLŽ*ÚIHKp2>)&&Hzngn\Kw&=E5?^Ȥcp̰)x@WFc?v#[R.bѷ|iv!u%Yh=?,ygOߞ#ߞOߞ'ߞlOߧTSzi~}rKũn-W+un @QEn&*[L"V!.3:sO*Fhu +:ke onf Dp%wrۄD3PTkin!? endstream endobj -1394 0 obj +1461 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1393 0 R +/Contents 1460 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1395 0 obj +1462 0 obj << /Filter /FlateDecode -/Length 3415 +/Length 3416 >> stream -xn#L h &pjk.z@Y|#(Kq.QD,#8q/ykqv~` ~Cg]šWr;-3!aPE+)=v_prYg ha?~=x ;mw!a ,~zHы0-N8ǿOx"z9c+ʘ6,(%]nۜ<iWϸVOo*;smݹys1`FKT"ua,-A\\]qq^B*CG0UKDִ& \[L$tދ\gX|O"aSA9*J{c [ "<\/a|̑EOTp^;2hy> -%h@Ay-ZJ+aHs16(JEҾ]0EX@m0N0iB6m~Uq'$dbL -7IyYR$j%] XnWB2_WB ObAb4<?;bGYurhSDv*jF2^|^Vt_5ޑ5de2ml^E|Q MмpEh #¼ety<ЃE텷/WqC')@4M+Lwƽ %M`mx|k$J,J5%G%D|1,0"FxV N0T6Lz*59sA71dJk)IL-V43rk"EEZ?cYE42'15V1A -Qz{kR+4\d#JUAC!Z{b^b[g3k0Ē-*(KZW UTf9;6B'fEkc3aX*4/BoBmwf5#ciZkB5tm$6,baA$U4vVRPISS~@cUqN"n:G7HS$o&)6#~*Wozi ШNs2^UW >ee?ޫD]&07x0(c!j$WuAmfsCõÝ 34Pvdm{~N}^^_h%%2iq6ǵ#o:]eo 0djNa0ʰ 8=?uMaZgjWcn:%Wv4ЅVTvņ'14ylV~Qmj|1c2ߐ!tp9UF6e 'YhA'&eP4` -mu{]"u9 U`t4i`NqHog]p%;`\nI2mU}۷"P+WwnQuԸuNlq@/R4qjetctjD_o-{~5v2[rCHa):`|m3nܥp5\ȸ1n1qmd܇sGa@4AgJ!_,Bft} 8:qu0!+.t`E]>jr^I7w8-:Nl_:P{\ZYl}ƮyVYo((Kj r\m*@bxn&n@fggFT٣' v0%P$x sB/RИc#] Ǵ)+ -  %ȓ`&m! "Z*qF,st~1+4Y8? Tf@Z> ͙Y QK<$-% wwiIg5⑨,@#@br^Q4 [݆iR:ٳ?9P0vfp@xyc;4>YAr|f n^X1U ˜p]XQ`FU2Ixs̹lMYYa3> W'Dd*x21lև2[)<ʙN+hמY@nYOq-![.F3$tE6ӒML%ez8a̓s&Os 7rB/7-zM¬'Cg?V۽A*p`/R +qPr_x?(RygcÏ'>\ +~W8wqv+FR+9~v~x|A,u" %_~R2Y_ϴVϮ; Bs㧏:/+u(.QIEBx\H" qCsz%\FƯy8Nk4y,u:,ÇBKd11N|2s &3_`><%Ng6ݛ ̡ *0HAP d/F| vlE$a_~ .kiqƹ*ATT?5 }4E\@u0MpyBR:?j8_#:3F{Kʣ")M25꒯h+}@J!Q/gF!J@y7"J[;9)s;U5xy/]X}d2d:ul^|Q MЂUh #²er!e<ԃE1 oWF%FNPƵy, AQJ,ݯn yϡanouJ.!)00%hhb53bnǰfn @,).LL 26HbW&vAMYȈUx\xPh ݬi3F#tS2r:13 *$+E + cvu=yġW)ىCM(f)Y`D0u&,OV5# i.Ul9k۫K Su^oUR^" |?<{- +Qܛܻ>]E8bU;2=?Jʾ^^_JJgVmkGu ͻUm_ +0`UӜ<-aapvLǴi}\y 'yX"nwu GARƌq|ǂP0kOfZԦ21X` frsho$Hn! k,-{ [YKҏ}>o-6(.t=e WһAʵmu>pĩBMj[wkqok[;7vԸw)RYѓ\uX:.s\ +Dn-{yu(3/!v[z#_9!}7G;罴f!; YbcgFzpnQJwì[[)_pc,9, t8KYsމ\Ģڀ2Zj8\\ (z>o)zp+x+%8t>ht^ED׍ '&mvY$:X-ќ{m Ɛog?jM= +ScE̐%&ٶ+-Wf1۰8%%}xsEQ^βY`m&*m6JAiHo`shr'RVPT2|Af BY<#|1h|a;r%,{4$*D:` ,;tNmn1-VnZΏn=`r˙jb Ǫȟ,q1ѝ/v)1/A ļ%юpЦDqc2ц=(sƻb]_DZ[˝Q;$&}2n wէ,7ffv<5F7MWV!&JZP0Kзc$V%J*V^fuhү``+iFWxK. Ej +$Rc}wӭsY$Fb}), 4X@y lݪxW >\٣' 605X$x sB&,ZИc-,bcZޕP +`Ƀ%$ |zC[HHj^X~NoX7 Zi_&[t72g܌y^ 4G. +@Pm%nLJu2Iwc=c4^P9秞(܌7Jsf'j. nZ@Ki6.A{DSc.q V;k<7pc'wݚ$z?~BO;t֞(~3o{7P\lߌw͢q!6 5}S1̀=]avބv/8J~ ue2 *Vӎ^Ny#>)`u:x\-"BAOחo3zs"xPCLv#c endstream endobj -1396 0 obj +1463 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1395 0 R +/Contents 1462 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1397 0 obj +1464 0 obj << /Filter /FlateDecode -/Length 4004 +/Length 4003 >> stream x]Kܸ?.Cd'9$pzx)Tc=dQK,)YHU"}}|HrFGv1At/ @@ -19642,24 +20648,25 @@ W pR2A;Had BQb#}FVZE5ްΑVER~q鋒~`WktK ǦI'KBfb.:N)Z 󔜒k+ 7ɲJ퉍ro`#})~g pQ[T#v% aI,$`F5Afl3P^u'ĥ7v)"ks! ,-x;_c 5QoabsX r'c\;xyh;pA";d;F͜.Ȁ(Fa1 h.\_NkW,wp (TPߛK Le|w.]n`4Q.Pt`;8vA Dp`Fw4Rq t6bdy*wONԆ4TMdI&IFC֟QsΥs(**+lT:oSD.poű^5QQ&iN̛YepR$'S,TO\FUaR΍F U. w-Z08n9#K,/LrCWy39VxA'@ia6Yi;\ ϖQ0$UYkUß@Q9+g=!ʈ͛AgT)zdvbE>vVLj] -~#oLxγ,$JU 3~mN`5\A =pҾ 7$>σ`Cϕk ༽)N%x#ٝy2Od~LMҪcz>Vo 7~-8:tDžȣM[&(~#|[KفJmC&`{F U _gZ-=qWayZau=%' Bl+锝Oyp?X\j1)~Chiw켯 d}^*ɷm=:I-9vy3|h-JFno[v@YPx|(\>,ɾK7^(P 0щ YkX_zW{XǤwn@Z(N,\5[Vl$v6/r;?rAP|r%_ƿox{ɖfiqsV^7;–#y51;Qkbvn?q=zjέ{GadO8ݱ|O=L}ONb^|{Cdhf=ۤrm{7z=٬%-`J=g$w\>;7 ]pYe ȕދ77mw$]kC`W3>r XSgsyVۀ b\g@8/wq|uP5!w3wBRZv0o{"{󙝉>?RnXZ~X_(SY }/39AqɤפGN<0KC~Ti+b.晷0MTby+_zܜSmJ1 0L} F{$gB1US,)1% +~#oLxγ,$JU 3~mN`5\A =pҾ 7$>σ`Cϕk ༽)N%x#ٝy2Od~LMҪcz>Vo 7~-8:tDžȣM[&(~#|[KفJmC&`{F U _gZ-=qWayZau=%' Bl+锝Oyp?X\j1)~Chiw켯 d}^*ɷm=:I-9vy3|h-JFno[v@YPx|(\>,ɾK7^(P 0щ YkX_zW{XǤwn@Z(N,\5[Vl$v6/r;?rAP|r%_ƿox{ɖfiqsV^7;–#y51;Qkbvn?q=zjέ{GadO8ݱ|O=L}ONb^|{Cdhf=ۤrm{7z=٬%-`J=g$w\>;7 ]pYe ȕދ77mw$]kC`W3>r XSgsyVۀ b\g@8/wq|uP5!w3wBRZv0o{"{󙝉>?RnXZ~X_(SY }/39AqɤפGN<0KC~Ti+b.晷0MTby+#{y70A&qbu?- +Ɯs+WMA0 endstream endobj -1398 0 obj +1465 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1397 0 R +/Contents 1464 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1399 0 obj +1466 0 obj << /Filter /FlateDecode -/Length 4134 +/Length 4131 >> stream x]nc+yypYHr;rMu@,lVI;UEy;I F!D/1x+/6?^\|ʻk4 Ax2 R @@ -19678,25 +20685,24 @@ X q5+\BVR1*|HԡK bH{rR`,CxӖTžeA>m+@hjrKAx{'Д? Q/k<\~DVJ'@*6T Qʍ'k-]pWycŶSGZۇq[p]neRw*4ik)Ih^eY;)Б}Qoa-Zd eD]c 0(, S P0}tTm_A6D}m F[X{gKF; 9`O$rm jgGcх_@wq`63T {[ =ZE5Q -zwxp?W[Ŧ<>`Twfa/>'!!F#]5 DiWYkĥYϡQ (rJs![ .=3JIOjۯ@QEؘ#,]fW].sĨ.$:n@*CW{TV`Di[湒ctxnĨ[D9` _/A\z6E={<HYfuNG2ã[K5a5FʆEk};;K@ɢ߾W;i7 Zӥ̓(w{k4m4rI?FA4.Ҹ~g>QЀv~ _HCӌnyHQ1!(wNtᄼ? }ut O -j`X]b%ijG& v?^ +zwxp?W[Ŧ<>`Twfa/>'!!F#]5 DiWYkĥYϡQ (rJs![ .=3JIOjۯ@QEؘ#,]fW].sĨ.$:n@*CW{TV`Di[湒ctxnĨ[D9` _/A\z6E={<HYfuNG2ã[K5a5FʆEk};;K@ɢ߾W;i7 Zӥ̓(w{k4m4rI?FA4.Ҹ~g>QЀv~ _HCӌnyHQ1!(fQxzMl1?!(ȿ au?L:ފxH(r,\ % endstream endobj -1400 0 obj +1467 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1399 0 R +/Contents 1466 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1401 0 obj +1468 0 obj << /Filter /FlateDecode -/Length 3191 +/Length 3190 >> stream x\MWˏ`!@8Ay;n?b7]d5חxM^zdS~?!z/)oiQ`jB] vRB FJ^8Q ~wJ^O!snOmڏ - ֿO[_˵tj\+k;v @@ -19709,52 +20715,53 @@ h L~t;4V!#ZCYM P8]IZfbLHy-U" dUF$FaT U-MkA}t3o[#aƄdvgaXPo`>?j#ËsLo͜#s1ٔ`k0յG\g<r皶A{Ndݐ&b gW-몼|Isdsh%r_ʴhO#c@n0#T xJ6 dcC4b4_osۘ6O*GKj0^6l dzlT(j=-E \\eօ 0{ cIVgtYf&#,K9\.79dQ0ڵbhva3ϓe.lzH9OwȲÊvZ$.`Mcc<&.i 1ĺ4 IjZ _[[ %̮׫K]QM~ZkIրJd=|a1^ivϟPKGm TF#񞿲abm҆=)]+I 0r:>N'ûW8PfcHMvBhC~vy„zg~ -#6_={}I87%xU3.3Oq]sa%A.b xQNzΚh |bė'_wݝytz訤K*;O|1T.߈w)s^b|a -@TJW2̽dN:kde\:le?J' +#6_={}I87%xU3.3Oq]sa%A.b xQNzΚh |bė'_wݝytz訤K*;O|1T*KzodX.aCX:xK2Uҕ s/edΚ_|:EN)[Jb& endstream endobj -1402 0 obj +1469 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1401 0 R +/Contents 1468 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1403 0 obj +1470 0 obj << /Filter /FlateDecode /Length 1749 >> stream -xYY7~_ku $$~ۄ<̱cلu?VI%4{;N*X8| -`grz=8s_ZHZďDZ(T.\(: u[(ݸ2=(3@8I(TWKH\Ϳ /LպˊJ -=GƎd֐PʴcCKxOG k=u/xR(d%-$b9Ut)0GIt@) &4ΒX&Z L<⸩ywPs/d\cCr`V:^2ܙJ(= ,S->?| PrgsORA˼9gW)#P0-lN(;4a03&4S v3C fˎֈe(4)tĘ>^Rd)^Qa']p,OZ*6t5.RYTLjRAPcƴ5mj5Uص0TʢLf͠tv'ҁDw: - ]u1eQJqۮͱ oWJ"hη %l 8/j0 -MPMQ=HW뱜꘦IQ<]IhU,uRN7WyG -# Vz"'Iid -B#J+/*}k/0:wmc <ʦ oO sݻ!<)T>@,J#5Ȫ{-Xj7xMygnJxhAy=hC0ur$^ɠ犔HH԰JuuZ/}$¢GipLFe:8A^H+ojkZVh0 ti`OrT J51"MKëgOp](ly [oף5Xug;޾Vb%.i]: #E&v43+s.uk͂֜!˨MDSđܟ^SGf%ٝU  -Mrb4ltnW)3ƪ9?1E:rlkb8VZe_$4FnjN(Z~k$0opJX(8x@Y^ۆ/0;066mPhUlzf|LOi7Jr)xgII,G-wFywXs/d\CCrrp+U/b%UHhpJ> 'dޟK.c]~'JOs@8W)#,@>.ZЂL093&4S 3@Vaf֘˔Q`]P"0] P-}^p& +LW뱜꘦IQ<]QhU,ubN7WE9K +<G@ho1A|$E( +(Xtf\/xֹkMCl`d~{>#J2҈G?z+=M0i4^r뙛5\4ZШCsD FIW4("%*RYR55lbx~KQZF8zw#xz^2SCjFU/{shl75-+I4Vza40˧9WFs͌65/Q1E<rlCz0r1ik+=St\"U#75,[~k$0pJZ(;`Kp8& ~Tޅ@tU!.>SpNd{kok -:> endstream endobj -1404 0 obj +1471 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1403 0 R +/Contents 1470 0 R /Resources 4 0 R -/Annots [ 1405 0 R 1406 0 R 1407 0 R 1408 0 R ] +/Annots [ 1472 0 R 1473 0 R 1474 0 R 1475 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1405 0 obj +1472 0 obj << /Type /Annot /Subtype /Link @@ -19769,7 +20776,7 @@ endobj >> >> endobj -1406 0 obj +1473 0 obj << /Type /Annot /Subtype /Link @@ -19784,7 +20791,7 @@ endobj >> >> endobj -1407 0 obj +1474 0 obj << /Type /Annot /Subtype /Link @@ -19799,7 +20806,7 @@ endobj >> >> endobj -1408 0 obj +1475 0 obj << /Type /Annot /Subtype /Link @@ -19814,30 +20821,35 @@ endobj >> >> endobj -1409 0 obj +1476 0 obj << /Filter /FlateDecode -/Length 1329 +/Length 1324 >> stream -xXM6 WTKJ>m/LE/zh,ٴg&3-|@ߡ&vL1t#/O=wdjr1d O3.v&'B222_0Ptcx9À߂q`# +!%o"KY6FY,/? f==VKb8W~?1 -A 뺹uY~s^Â?`7$% (+@!=do-Ia]籠7h]*\T6RkwQh)4{l6):U__i}kiq{v! J6X.r??]kZ0\Wmu2I_C!CՋp%+=+% [%1j-+:T6ZKJ6MS,y%Zh )VP4a)\-M&ӵ|]0˽z67~4"I#][v4:1z.71W"Y;,wK ȍ-{f-^i8`ۢW-UI>+j{eIU[,o8)*RVnD,In{5^6s3+2j{Yv:oq!gP9V:Ѫ]%[z*ѶenP"Gκ)\Ӄk(o6]9_*v;nJz&q{%&2t,T/6L^r9Ly%vɳ Z2|ګHV=,i|C-EW-Je\;gLQ^!DB0>ldGm$2-ƻd؀ôNʱ !םAȎ"0p) +xXM6 WTKJ>m/LE/zh,ٴg&3 qlK#);w(_ĘnrUFN'\0! Kd(F  "X'3LA辞9!9B 1yvS/F14Zޜl".YՌaݵ ʼn<L 89D;{<9Gb0`~`)k +Avɛud{ O0xA~?j C 'tb(%>$ $s {+F')U3菖 LOdzGv֟p̉s7.!pX9Wl$`Rq͋ۓLs'yx,~{4Nru\zztޠGGjƛ=N< piA;D} Ѕ3ϯ%uAy&=R3m9iHt!= +Z A}+Šg-,f4J~B ,XQ#.-m͚Yp la,V5 "BF2+FThu\pں +{u9 +aB~k0tlvj\XR ]Cěp.mxsp_)ӵ( 4Z}^=6tXb*܊/4 Fݿǵݻ~YJR5j-jR+Ƕ:׉Yٯj8ĕ͒-ޒrD_H%|u&)-PW 4r (bٰy.m&IQZ +.ZSy=HO 摮-T K=GŘ+ ݥF͖=qWmѫA[I[k =ϲפnj*-_h{y~X+cNo\$`V7ٽ l@}m,;ɷjR ++Hhޮk}snu-{oh2a7p(UgI {zGNv[zmns\=Bz` DZȈMMMj~L|o&/qkE]l;Cg+a*չe1:,Ey_#AniUR׎~;r>?Sb$y2+ϯ0; + UGm=*g@xb2B0||#Vs $[9v1Ӷ5?9o endstream endobj -1410 0 obj +1477 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1409 0 R +/Contents 1476 0 R /Resources 4 0 R -/Annots [ 1411 0 R 1412 0 R 1413 0 R 1414 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R 1420 0 R 1421 0 R ] +/Annots [ 1478 0 R 1479 0 R 1480 0 R 1481 0 R 1482 0 R 1483 0 R 1484 0 R 1485 0 R 1486 0 R 1487 0 R 1488 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1411 0 obj +1478 0 obj << /Type /Annot /Subtype /Link @@ -19852,7 +20864,7 @@ endobj >> >> endobj -1412 0 obj +1479 0 obj << /Type /Annot /Subtype /Link @@ -19867,7 +20879,7 @@ endobj >> >> endobj -1413 0 obj +1480 0 obj << /Type /Annot /Subtype /Link @@ -19882,7 +20894,7 @@ endobj >> >> endobj -1414 0 obj +1481 0 obj << /Type /Annot /Subtype /Link @@ -19897,7 +20909,7 @@ endobj >> >> endobj -1415 0 obj +1482 0 obj << /Type /Annot /Subtype /Link @@ -19912,7 +20924,7 @@ endobj >> >> endobj -1416 0 obj +1483 0 obj << /Type /Annot /Subtype /Link @@ -19927,7 +20939,7 @@ endobj >> >> endobj -1417 0 obj +1484 0 obj << /Type /Annot /Subtype /Link @@ -19942,7 +20954,7 @@ endobj >> >> endobj -1418 0 obj +1485 0 obj << /Type /Annot /Subtype /Link @@ -19957,7 +20969,7 @@ endobj >> >> endobj -1419 0 obj +1486 0 obj << /Type /Annot /Subtype /Link @@ -19972,7 +20984,7 @@ endobj >> >> endobj -1420 0 obj +1487 0 obj << /Type /Annot /Subtype /Link @@ -19987,7 +20999,7 @@ endobj >> >> endobj -1421 0 obj +1488 0 obj << /Type /Annot /Subtype /Link @@ -20002,62 +21014,67 @@ endobj >> >> endobj -1422 0 obj +1489 0 obj << /Filter /FlateDecode /Length 2848 >> stream -x[K#5Wd4*Ҍ4,HB,\қn$K.ˮ$wzf5}NR|GN9o:^?8j͗t bZsn .Jh%%?;x^.1s!ͽq:×gㇿкTR( SYtqD \\r3 \@f}{Hcc.&v08z1l%}h" 9D˄x˲^nf.t>OR̖` -^㣫Aղ8s)u|toꧯ<$̯// ǘ$]B5:|WrηcǦa ;*|+9Yynyc9yIc7э3y][T+weulۙZ~/º;u,__5ʅ9W'%uĀʓ"DTƭSYyy5ZkdDQarnD*=Mu$@Z' -/$ÃyQ$<@2C kG<ם vZMdP<. uPݡNuiC+ D^o]0!Yv;դII!C׳5hَQIDrriT}ZǴ2 K.oiCʸHymj QBR#\&(8Kmۍq;ֹXx՘{pPrիBKa -ex*ȰFAC -Gɳi.=W t|Hl])n$ 0c^xP`3Ͽ=R+Hh[)HK BK4k0)AJtW\V{؃:aP$QX ;Xhs y:v٭:VҩfLQoE/uX4soj<'[>6łTARay6-/GQ~apcufϠ0U6qK7ۅ0aXyke0Q*#Dl@/4u &4 g.ɸQA{QYw&`YV d"o(q9+qe*x;kcxI!$݄A> yC,QCiB7YƱYRnCTRP\E?6m+Άm]pOTAJG0]'Q_t;=}^aݒz<1 OZcwr-MqFMQv( h*;]{2 ;=>KA!ug⵽'FF;] -Aa^n?! s_bԦzBXLBoxd)ћa"y~ϕ"N;q,0!|O%Z(~,ٙ_Ta?~{Ќ$Pret+սv1¹ɁGp3Vƒ1as%#`CW"C>phLV<#hsfsr gin#iw|E' Ks 2ži5~͸7r\C8iCy킙5[Ձ3De~_O gJ% \! AG\Ico@cA-db?[c1Q"^X}׋F?r0s9埦!8D'k_j,u|7# +x[K+5Wd4iFF$M^$K.ˮ$=wf5շ*};.~d<_֨[f_|I]šWr;-3!E)do2f=r.Ģ7NpvZ?6Pʝ\0a*kò:N˺^nf?~Ȭp)=blbLE$@Q/ _$~:hpcsY,pq1q2iW[JL!\k|t5HZgnq9_ͷ_GDv1ӑku W[uoo1YiNΑ|߬"scuK4qKsnuBZy;.ׯd$Wג{y%޹Ec9?z|z`U.̹j>)٬$TU!2n.@#̫Z## +s ȈPql%:Q}!\ϋ*$OIRo@τ^; ?<{HOI3ge=iQ$֙;װS&MJ qFvLJ"dKTU +:1=m1/P5RyK:5ƦaJrA4h*8Lrc@C}(!bdְU MŸowD#z\ U%/(B=a٨JD{>0e%`%,% N湑^x76TƻFk/cL%\ GI/2(ŒDy]S0u +(z%$`mHM'֬Ű"X[N)$u!(~>_uxKsgzWuE4kPY~g4A)^on۱΍K܃cnw ^ZPUl=_aMס k4TΨpkQ+lYԁ^7ըAZk?W>i&v#}~ҾcZ,hH)Yar$f:V7Om&1X +SUjǺD;y]=ofQ52R@ϖdBSא)hBpŸ{+[z+|Pk, e @&G]l?HM4`ǹ7$U0(4x~a+Q%-&9AZ(ȥ_޻Au0%3b0)Km'I,x0A@$(nNFb /GN\y/ l3N\Jr7E7nH/!%[&@RPk#$7c%X <3jK?WJ0R 6> endobj -1424 0 obj +1491 0 obj << /Filter /FlateDecode -/Length 1613 +/Length 1611 >> stream -xYKo6WC h{H{ dN?Pr!:AXV"jF`y4=OR'< Bt:9Za9(JImMc0~~RRZ W9>%ڎ"H~x 0GJ `i_ݬy:p|+")]v5i5]K]غy}^ޏ~Z#5xٶރ =6-gpp|, AhyLƍ'|Pɶt_ûCdDch6+D:6#)-6C]R@"̅]6+JJ{;U>AY[@ S=dL;0ps+unT Q7jesE 0NJtM`#Շq)m0U\7ʷ!܃^!D1&%7Lqt,˦8\_RMAZKp6KpcdJ͢ޅC bHڴy̒:m` -&e(8(h i w $1` GY,h x[ }31 -Myl@ oq M(wrpH̢j4 5'ˢY(J,t]}4VfQ,EFDY,=5QeB"p G0C]ce)oƨ+Gb|0Xڜx%"Q܈.PdEj(1RyAxp^@?JM]MxN(Fg{mgWsYpC؄0\ O ɠƳDvsa^"z*!>!@0x8yE. uWBUR$ݰhthЏ(y[.M.eN ~82k: 09ԇ<{@o_ȘsH:7I0\kTz>K[ Q{VoUL`ve>koe fE3Yt WLsRXY@F0z#)cq@(7)YƎ c3yؕ];1ך&WW/$io|I==(\NjOX^1ֺƠqyQY'&Yb%AeAƺ$7] ڦY)CS"T^GK4}az\n -rF% (4P͛n|l;ѐ`Z|)>)I٧'qY[i jljhVWG XIe0.9:DIƗBB:Rdu4A9ؙ!&ȷ<2}?r<"*D{w~cIsVk\+0GU43q~Tu[Ƃqp}A~T/RO - fY*YUfJ~ }t›`Jw 1OX:nIЄ4p[Y̹|SnUU +xYKo6WC h{H{ dN?Pr!:AXVco^\5z?J~')Gt_~L!: +61Ycd??MOLy~F)Y)Sу#Ԝ_?NwrtIm[kHH~x)0DJ `i_ݬ~:p|+")]vI4i5]K]ظy~y^|#16ރ" 9mm[:\3YA^i>#7C\mYiwɢi͢xձQ E2KYe.lblM,=(w|yIY [H ݞr2eOѕ:7W„Q52D NH82X}&x +cQ[{Ջ" {> pzi +[}C,<E<ΎeX2g<S;Xuo\c'sWrwnF.TZ\EE׆>N K~BȷY(("—\E0^ަP SJbX5Y6@,ɶ*t31 +Myl@lq M,wrpH̢j4 5'ˢYoM:ai] +>+C`QL"z#*QGcF% rg: +L)p3uo= {2tLd"+ᏒզFtA +,w/t&(PCX@ ༀ?( `W^Yp~`[g{mgWs]pɽ#C؄0\ O ɠƳDvsa^"zM$L]N@ } K- К&Cx+9s.ߔ۱m endstream endobj -1425 0 obj +1492 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1424 0 R +/Contents 1491 0 R /Resources 4 0 R -/Annots [ 1426 0 R 1427 0 R 1428 0 R ] +/Annots [ 1493 0 R 1494 0 R 1495 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1426 0 obj +1493 0 obj << /Type /Annot /Subtype /Link @@ -20072,7 +21089,7 @@ endobj >> >> endobj -1427 0 obj +1494 0 obj << /Type /Annot /Subtype /Link @@ -20087,7 +21104,7 @@ endobj >> >> endobj -1428 0 obj +1495 0 obj << /Type /Annot /Subtype /Link @@ -20102,35 +21119,36 @@ endobj >> >> endobj -1429 0 obj +1496 0 obj << /Filter /FlateDecode /Length 1891 >> stream -xZM6 ϯ9@ɢ-`$(zx2t $@%Y(YN&%|$)9bXZg4L3#?$ 3NFOX+L>KSJ@JnoON|$3k&!)UaۗE0>}t mK -'iҠ_餂 wuەr+&ϴLhlZ?;ؒj%^Tn8^3nҊ u-~{$Bsx;|ߐ![+v{k+Z'9\A~[o(K*cJ"_.|u .zFYTkc3GSlE6_Y47Qhm>zy883MN$p"<9j-e+$ClD9.΅Ze-N/;H`$rA :0XFƎ8mq1"V !@ҧy&&3 -qe~a5)|/d%h+DW"Z$e* cҶx5S.)L) v0G9fș HEŒa,ėU3$ Q=@׋ Ma^쑖=5;P%zwQ8 'Yt- vSw4Q9",ReZm*D@blƘ#hztSU;LgSJv&'t[!LװפdcslEʘ96y?EK}Ex&D {O(9EhڠG=eΨ_WTvb*h$ln=acw?|3 Զ)I]gx8+P:%k N'Y 3zcf瘷h4y$H)sh\O./mV ZFPA?2g\}ƴs`wۊk=9a Z{<*m\ _EϪö0eVτs.-" l`f.kaZ3r=jYٝź5sMA;-?cɁVtEתm]d|u5"^PR2 lUzEG7Q/aFz ] Jm֠۱ύ -nz.ǝ -$b6s>a5]/:|;N8UE*E{丹^~ɚi-x9ym۬CuɡHa]ggS)J7N3&g>cw -ZQM{ܗC:Nm2:ք>%kZznM)ܖN8g}??3#G(H|H3G(lSp-`䓚ižSG-tLș;TtMy;Q$fC] o-4>ρIsQ6ƈꯏ=LqM}]$HgExo(=UqLƟ|ZO,3c[,46E 8ʲJj|teL 2K8܌a  -jMA_T\)hQ1}9ìc'C% ci&nݑ.q +xZK6 ϯ@=CClE3l.M$%KIdDȏQ朷ˉ3yI#?w,^Kk /V8&*TiP?8z,E)8G%~~:ƗOBRci-lP~>(*)Cnv#CPg9fl2LZ&EjfKh !ػ9x8uh6 ,O~oQ\oxA p۳t/_p_oP8I6?q:ϏfG;,~ue5zV~pr]󘧺vZOU$lF4d\/֢khfpdlG0qXJ +yW ־%;/RdہC4Ot}\Ե8 &Y6 DgL8+[RD !@2y&3 ΋ً|aަ1FS^ɘkэ]OxN"Qs`:FlBHS +#BSd&sHlR00ʪdDH2(#iщ9Ӽ{ZQ!y>(suUI{Ega,nJF1 auhD$(S!9tƎ+i=sM}\1Mt-09GWG:v6986Rqd %cI‰GBm?bH(9ދdy{xά_,WTvb*h$]i +=RozmS\paZ7OYO;{cfY4Mq&L)slԝhO.M.Iz _3/Kc{܎l;@+mŭ͞-#^תga[GKvk`B K}IeBkFG=tTwfA!u`25KhE(=6 0m?"[D-l- `x%v@YX좰{c/$\k{#k)s(-i?L(659 +0i%h5D$5i4v%YA۬I/\c](q޻Y([jKWDM?OO w8N[H`l,|Àk^| OTd/3R\o YS;ϡDv6u8>6/JQP#HX,Aj +Z*QM{ܗC:vkؙ%뀾zznm-nFq'\~tMbԟqc$?A+ #ÞQIn[1'51/ӷ#P:G:Z\!f.ic <,j2 4u.t o# >=wΛTD- i;2ҧ`t +ؽڟN9w +/ =62Wa\p+Z`!9u6g4 J)H}ЧC{NLS5(=3e'77. Bً6@2y#D{o=9޷>9ΣiIm8ph#nSyL=gn2/=7@y."?詊g*2e9[bqc azC(ߦ;R_.,%838Q6qR26s +^(P1s=,|b% *ce6mݑw,b endstream endobj -1430 0 obj +1497 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1429 0 R +/Contents 1496 0 R /Resources 4 0 R -/Annots [ 1431 0 R ] +/Annots [ 1498 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1431 0 obj +1498 0 obj << /Type /Annot /Subtype /Link @@ -20145,29 +21163,29 @@ endobj >> >> endobj -1432 0 obj +1499 0 obj << /Filter /FlateDecode -/Length 457 +/Length 458 >> stream -xS0 +dĉmi5.+83@KY:ɸ&޳ˁ0_1&\a0K?= YzIZK36)elLOÏWQ40 {<8x?\M)$ZS]yŪ=iqISR9b'؅}<8_}3~IrӜO+tL\7?;UN"qųhKPbdFdû7D557{M"(X`sp\X5A}ml*'KvP( -=3F@5bY:m`+@#!/+ewU: ݃~SOުHq}?V/>-s|3FvuMUk  +xSn0+33#U{@p쒊CZ_ɖ,儰w^g<[0hZ%ǁ?[55D1clRfαHΤixyHMsJW+-COwđaAYڑ?VX7-1{zn6dvFO4IN~s tei+GPWy=nXxPv JPLÈx&pC2|"fWrt١P=f"9"&*}1-gvRS,;AT'KvP( +RҞǙ PXuEN2芼3A#n坿d6=kO^bކ>F[eXkWjI` vV Z'h)mg=^K]/q ߯ endstream endobj -1433 0 obj +1500 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1432 0 R +/Contents 1499 0 R /Resources 4 0 R -/Annots [ 1434 0 R 1435 0 R 1436 0 R ] +/Annots [ 1501 0 R 1502 0 R 1503 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1434 0 obj +1501 0 obj << /Type /Annot /Subtype /Link @@ -20182,7 +21200,7 @@ endobj >> >> endobj -1435 0 obj +1502 0 obj << /Type /Annot /Subtype /Link @@ -20197,7 +21215,7 @@ endobj >> >> endobj -1436 0 obj +1503 0 obj << /Type /Annot /Subtype /Link @@ -20212,32 +21230,36 @@ endobj >> >> endobj -1437 0 obj +1504 0 obj << /Filter /FlateDecode -/Length 1005 +/Length 1007 >> stream -xW6 W%J`ECK)Z zh$(oז-#%dx/!2EP36= (N )OX&χ_8×Õ 5SEhLDF#yn*l VgtRa>O5_R~ -i/s8}Ǐt Vu,X8>G'J8 tf MPкoNhX0%@8ME sW0igxm1rBfh2) K"5we.t#V@"+z\"'2Uw9 <[m[i1nX|X *^:%~UΊ/Ntݧ#|-'< p*:(q*nX] Ibنmt㨥7_mk37zg<AVNoew@-u==]H]uA~W>RNɉkW -ƍ_`M,?Z7``*]F5/L,Q 4ԁA.wmmˆNBwx +xW7 +%JCE =gAmR5؞MRzg4Gd +_B0)e8->`SWlu=><Q2L RCM@-M>yސhp1zc_W6Lo("7FcJ&R5 `-vPaH:k< +SH ^|3Ź#L?~[3ְg98QrQN3[姟n֕ߏ|OLwJED)Qo*jNUH?Xo`|e +‚צ$,(y.t#V@"+z\"'2Uw9 mn64V{x ^lSt?JV*g'ӊ}~BJGBWq8Qt p 7z,.̤F^N g^Bc3e\~z +x{#mü"whMJZK{(MuӪRnjgsO24VgvSwZ)M` "Ms|\C= kRtpu\ +AM="կ#=fBxCv[ĺ@}kiGGO RT6~$46ޡzoWѻK%rS. ŕJ`U +zBo/}FB6mM`AdrT'zACϯfuLzzf{Y߄з]`"6/[&>bنmt㨥7z^mk3ϱ7dϲ<A~WNeO@-u==]H]u A~W>RyOɉm[ +ƍ_`M,Z +Lq3|u:o 1Kԩ) 0u`r:s˝Xo%0ӧ;X endstream endobj -1438 0 obj +1505 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1437 0 R +/Contents 1504 0 R /Resources 4 0 R -/Annots [ 1439 0 R 1440 0 R ] +/Annots [ 1506 0 R 1507 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1439 0 obj +1506 0 obj << /Type /Annot /Subtype /Link @@ -20252,7 +21274,7 @@ endobj >> >> endobj -1440 0 obj +1507 0 obj << /Type /Annot /Subtype /Link @@ -20267,115 +21289,108 @@ endobj >> >> endobj -1441 0 obj +1508 0 obj << /Filter /FlateDecode -/Length 2929 +/Length 2927 >> stream -x[Y#~ׯг<0u$$vAe7:H(jzrhël:JZ!z×JG x#Ax*6h`ǟ?~8hTJkaUt~~Y y?W$TH`Gdw~>شTf5MoVa?|l9Ί s A8^\`TpBys&lsZTLѺA᛿}opT!V~~=IJlҷ=)>;+l]x-ϩRuCK^\փkcʘ{+\GziE>N3xÄׁ_eNi΋Xi(d4j{,4|}êх-fNUB -*F.pQu5!*#d24I?*6 , 4s,Sںn4y@%E+P -PÈ7U9n㷈q N-*9.蓝j(P[ Ղv@qe6wR歄ˆ3ii{q"y6NY dCE}?1 EhТ#q+iZO9݈F q8"T~29赖Rr3nBhFN^c |-DCKV͊ #2lMh1>,VfZplk+kqku”{gƧ)e2=5_W<[B:gBυܐ őBXl5tb"r&Otn'ceL kYV1ⳖITM.{I+'=JUcD{(R){G]3y02*J{Jr^4xY8;`IPēGW^2o Ps6%r_vݵU鹥&x1W[ĔԙU`u]sؽ00m@)+i<t1t>xNu37C:gHkVc{݊7- -V\RdlfQdmiu-7@h\Ѽ`im%}[ˏ|@\EbAFX6U Aw\_11%[';4PLacnf+f7b xL{t:8G's42jKJu)j%ruOMiSJNft*Nԧm9ӡ;d{jޗL-u)}.k:c=™B]qCsȇ9E]5I->sTuL}e!:$0)r%FS?[xmn) )-qqȹܲv _FJ #>) B-S5?__aLV5F.Q -X0"aOV?;OvB]yڸu+hS2~)Q<f[ `g2~L* -*$eBPLg~U" >ѵi -L`(ŠjzۍfI漞,}B8g*ȿħNWC@,TYN9+lT/Y%[4 P:/oJue1D#Ι ۋDVz7ɛn M4T>dJi++J[^WK!XمlX}b½[wf RzVdåyxO8Oƒ38fx8TPӱn:vljTZ^2sw2!>^L tꮕ - -pY=gZ@̄o! ZZ+aԲbֻ6Z -5 j^0Ǩ(P]Nqvoy*,2 - -&?dNZ3C:TfE?<{&MlBɗL@6uԃvvk#7 zWRqDㅍ13hk2qXsBkhfqihnrwbLEzB_e +|,Wk0c%wHk W,,B;$Vw~^k{5+|^`wgX[gdrܒZh%R閘A8 zpЉ -pOETAj~ЯNafP r;SbE Q`{VVhchCHfp )=CX=ջF0R ;sz eI7:o[d4h7S XR%#1o׽.R,AqO뇇}9#;tvE`:Lg`/3ҡU}s -PLǨ<`, #{wh:^I }&&ѽ޶c3xr7H^v~nj,vu:%-+1Ue2>X&g[eD4i[ƴ~j -BC2uՕE]w)x +x[Y#~ׯг<0u$$vAe7:H(jzrhël:JZ?!z×J#?r_`jB>aB3'*\T! +V:u2 +ZΤe|SU9)rms7B .v^CŠS# +wW,v/@˘-yuY(^&D7g~`zOB=:A\ޣQ kZ%:9rbK] d%'3:B'_Ӷ=SHc5ulKkܖֺ>Su +`^xnֱeL8pU!pȜGm@9Q|Y&l>ײFnUwu)`H-[tG6v”bɸ8\nYx ;/S#Y|s}m)p⚟P&eV(,̰'zҁfu͏׼mm)?z]߀(RC3Dsh03DJM?BytqbTOH2B!?3E RIX &0`laEH\5F$`XbIs^O`>O!ԳBme_ S k! oNr,Ɂ|YZK^ޗ-sr72˜sgCEvOE"sPjMO&t*k鴉Lٕ?W^Pa%-+ᥐyqRBsW6>1zЭ TTQE+JWR <''c35߱ +`$Etۇ[GPWg AZ_K]>mr| cn玻3vZO9[nPH +U4KtK =8D"oT5{? W^ 039zh僝)d(0 ++ e1ze4g$N3 z۞QD!,ٞ]_bfpDa)9=ԍH2ޤށϷ-24ܩGNrh|c,XV]7^uzws~)ep?ԧH:i;"0&3EЪ9 rcT ?Aؑ=o4uqf$t>i}Io1vyn_$/ ;z?Tg7dy:햕ɘ2` ,2{-cKw_?5KT^GQBuRe:ʢC@? DAN>Jc1S=ܮqtݭ:U.-+7%FWA O7d -? fhe[_5eON<>v1{v_׼ R]ڗZCۛGCNIw [k=~?%>t7[.dE,~'k ~&zߎGޅ7O 'ݏ}eyCJeJz9roJ TFLU%V8C:L J|=01w9=yz٫!m5.o|8 +? fhe[_5eON<>v1{v_׼ R]ڗZCۛGCNIw [k=~gK6}3#n\ɢyX/ڧNi ~&zߎGޅ7O 'ݏ}eyCJeJz9r7A%cUP h313ĠDsS=׽'Vg1# endstream endobj -1442 0 obj +1509 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1441 0 R +/Contents 1508 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1443 0 obj +1510 0 obj << /Filter /FlateDecode /Length 2767 >> stream -x[I#Wle 0!: %Bȏ[I3F%Ƿ~ﱊYsu}>~b,K=OIz-9{)g924Ji%%?~=|)^n1s!6ͽq:o|c{ r5ga'J@fVYo0F-t86&&mbHag7v^Eo~w>f6?ġusJ_><$/??1&c: wR*|nױb_e'%qZ[66c{kAU'21yX_ b&vKyzBX4n8kffජLwF)`tn'ZL^PoE|; (iof\KD3HrĘ0"Jfe.uknG o#кޣp)ӗNYu~4SKkgMYRҞRf'HƵnk7yQ50pY:hbUR۵̊1 -a6?Α+ foT+AZR/sfHs%_eM -*/Be?Om= is@hdgɚ㽷Taevk$z &%aiuw$ -^kqgkn[7- -83f#)N0nwjb%zV-k!R!D[IaR~ Ry~/$@}'N07 d-cl3$@{ ;)æڂ탓ɰBX9~rb@W1N@!37-~l#$d /M.7-J=X0 -j).@ـz4j*%]㨏nj6@Qٴ06tkZ"Nm 7ql lA).wM* -1/*6{;de왐cJw M2kguuE羵\@><'Zǝ!r`t4"cX,`KFbh_닲Tdvf0WAQ,!g,Ut3x#Cu0PР <q#܅o.0Kh_ !:($?yТ -Ih718AOXGC|єVA_>2#MS`1F#"1 k țRt] pzO:G,jQADT^(`Ѱ&XR$FD,ҵUz3\ҪɆU+43͛+*O+F\CuhTۮ]i^B˔bk5T|@ js>u_ Ѱ-U%EJfL)o7OpCzYf\:K),t>'sSG`:#^A.{3wM<͡xiS`(`JY;ρ< - "b<%+ۮQP0݆j<-wb&,s6dcKDXUz9<8U\ñR084IJK7gy ̛ӽFiOt*i[K@ X^_L1" &/+Cñg)4C~ߧɦJY-amq-஬=rlphwu2Iw1g - -"LA"uE rBFxtNIuxm-<+6]^E Ok4eȊ; -°)g$WSG_1^ekT$p)Ro0;AxvK3&~a'Bpdכ, ESnjNs7)_=ui q1)@@'¥vA>H}7tm{Aա@Խs Ru>>0^w]aZPؗ:.2bef\PdOPccu°>3 drÔS%2.:%ndMڴa3D)ND@yfc=ϲ3bVcaosK}gbާ)/{B~Ts)Ԡ!`2i65>0jTo&Y<-0sN^[P5G"gکF]z[~Q #dUpN|_^ y<z5si:H.$$8N$,vEf -47; |yCMҞuؽFpy_T"8=EɪUvt:o]Hc<xlppGlbTHP> x]|(  3ޅc/Ŧ\EY\N, +x[K#Wlm`! ⃝C L`AK6dblif7;ЪXϯ,߷2ܼΚ/~?'6@9{f3KNMJtlzp?~=|)wAoNYJ6zH=9黫q}"Hu6^nq}~>A*C5B&I@܂uycmeDvsdfK6M,Ȧ4tM\o^yo黿,A*r? 1sro7~Nؖx=u-xqK&ߪ2筵ѾwZ3R?y}m41y#)/:0X[Xf!Ģi׽=_ 3# n +03@鋂Ҏز&a8w4SPLsšqNo>H3.K@!chBT޴`1&0V\K;BZ@spSН{/C~4kMYRC=K#ӚֺpqD3"T3+s#L$&5M:  zb߉+ev:^'>#]KG꼉 й߫b.RHIui+г/DAl +:.r&]K--JDBh; fʆ}<n+L9 8.KNʊpz +,xVNfGS|;``0CB spx + `8J1FwM8n҆f*bZ4vtkZ"l"(?Wb { VHljŃc\D. yCXQ]w0#*#hlAO+cQ1IR+Cd D) RѰ*~pုEF_Sj_̧ lR֚`uX ;0Jc4B2JwuQv>,Wcj'_rI|UGƸC@E?@ n2>{YCKv;.evB苪ވb|2LȁTҖ;Y)&huVƺsz ybIqg4M +j-DʾPu!Za Smt(/QUؙag$Gs*GCA0G/.V~K݄YLZ! +E!bY}.-:MF~P:;B@?] `/9-a1+Jlv4"sс+:|5E 1**A ,ZKvՈЛeWBL!&va L_jJݧ#kd)\aفg@2#ϋL-^XChOC:9hŖ+VU<㱤j88^ bLR7z Q!df"VIܵ\w>SbX3Rk(J "q^S.͘EFۿ8"Gvfi(5sKM3LUO!ȣ/>Fi']ןw`mu(:}9,up +NGgcߵEq }7y^Ueh)Ağbd> ̀2(y&kx1EǠA˸Ŕs;$k}ӈpۂ(E49J 7lZO!g2ҷ;iϾ nw5ӕ=|y= RlEJjT*Cd2m7'>0LT`æ]<-0sN!v3=vDH>)}sL!ԅMՀ~tn?Ta6°1Y'奼KYF9_+-NGvY_& #;'IXY_w67;}{Mڝ!A|tWJ/BZO)AA*r;3G=#? m]z'(v韫(ReI56Oo%cp##aRܻ +{V楻o(K  ? Dް endstream endobj -1444 0 obj +1511 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1443 0 R +/Contents 1510 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1445 0 obj +1512 0 obj << /Filter /FlateDecode -/Length 3802 +/Length 3799 >> stream -xɎ#!F$`Ajʹ/v#cJzȒ*}%FQ"9_:|[+/xޝ&٫ p@X /sJK?+*`%pHSEtRgL)D!s*ӉOo}'6R7)-Z$:XX΄,i*|ri4n|5~8ټ+/d_J\4Lp CzOCM%k<\8oәyd;i} ?]i|,%Qx$$%FDiRJ -Ɉ6/F~t&iϱ EԤW\IC/^hwh Ax*H>RJi-.t:_~<<@՟ |8^O'U qVA1O?~?WSx\\xRLR | L6^63# +0ʔ ڊ*DkmUa6yDW\'%utP}7"4G51O,.EcOEK>^: ODxur4ሟ!8]1$9#xܛy(ޯߦ{ta*%";~W *E%uI# -0iq5*)"e912F5PGOכ}l3_pkLXvo4҆!8M4y~$F 5,F%L"~&1̼חHe=kNqikY}nv4zU$;1eXd(HH0y+![dj| `ˑԷ΀yNFxU -#ם2XRcC2Pr9].Oҹ.0 40s4>M]JOiJt\\!~H?تf{Ij&ܚ& q=]fJrd= -h2 >TE:UM^ 4Ydfc\撺\ã`Uj%n}w^h* -! -0W:`lܛMW[Q%0Issq bGF2Ш5̆ 8:py{aI: 7;0¢E>_sg: -soÀ΢^oCpܜo?,5<~ՁoRh(( z8$FOHl^ oVS~Oi[+D X7u@Y%̯K[j0B}Цf(:Uư9%0&x\xƀW9^( &yd4T)E=ڪ䐊?1̈~[Vup\scCE$xʀLfrj)@aDTބ5kJ"1\LwՉ٤[3ʻvjDpj=fR6TqwRb DÅk66ʘ0.QL::|k{%Ԫb=}z?Fylb4M7]CocN!lRHo&o!b16cy \-1eMuY\-₪~߉Tmu K_-R]dpӪʡk7|[geL/fXgx~?@QL>Vmz-%$2ɞOmw֚E _9w6Z [y=6o7ކGp3):,gkB-o<)-6d !31ޗ#A![)7Q`oP9X2}䐅`D}T4F+@Cjpit!ϡn0R,q]9}gB:/RFկAB|c:~FDqdQy0*>tҵK[tI I,`-QSZ3-SOc`P+0m:)D{Tlw -ZqP݇L \NK 2grº>ú&uK-y% x3O۰hԊ=kZ"i?ێopo䩗 P7i= b$|$|„MW`2B[y5I&۞7-JPY7൫_P )̶ g:лlaC'mnP7Q˿$?\^5Ӹi1ҷ(O [\TM+nF -˽`͹M+L9IIRń\L-6_|-v7nBvjԮMzo\w$a[$<"[颇}FuqchT&:6^SG\LEWGno;"u9"<]ҫ[77P]7jguًbN=S] f_uٗx6Rz&0dwp!)1$Xⅷ`ͩђ[gJ[|Qw  :{+n[؇Snb_%gw5> -,hs%AsFh.l9G@SLsdDZ04”v xO(7 -B #C9B9(ۼu_Ξ+~=m)p]5|pPט7m$5ÙXt ,dC%6e\izע)udٮ 9<ڠS{vm([#^ˡy!wƑIDo^ԢYp|71WĘX5d;}9y/|/4B,N| Yt:m~"&; &n)}M`<M $0U։8'Ƶx\ȇ#+G($TZڭ&WpZ}cчH'i a\aWG͎!4.(V9,M5ʅE )+#D}!=zX 3P{l9K\g׻0}#R]:='ȶY1+vwna…z9f!O!la*' ΊAY/R7`«ꉎ6ћ\)bXbkdլufAzڷ|_?͡kʏq0.2NrtfT t1Eƅ08!_M#0.2L" 6a\p#,Zl@6Ʌ4ZHxOg4JSԃώ$^A2?6-aBFDsy`w ёB*HF$ȘJ]Wv<A7 ACk,Mát_/>5v,[ژha +0iq5*)"e912F5PGOכ}l3_pkLXvo4҆!8M4y~$F 5,F%L"~&1̼חHe=kNqikY}nv4zU$;1eXd(HH0y+![dj| `ˑԷ΀yNFxU +#ם2XRcC2Pr9].Oҹ.0 40s4>M]JOiJt\\!~H?تf{Ij&ܚ& q=]fJrd= +h2 >TE:UM^ 4Ydfc\撺\ã`Uj%n0U<&$2bYC`,t)ٸ7)!x 7J`F'2n`[&A'-B|5^ 9dɡQk wpt°untw`E|>tz>ކ)E ކ9߾Yjx\JygQPp=Hvټ8?>uӘS-WkWn#3"ꨥJJ_8M-\m` +%|.Mg͜Qu +YasJ waL(-ceR?;srcP4L+/Lph(["SxzU;7!'K}#b0j뎹 0 biYk}F&L~Hiۄ*h5@;goiwldx>$KϤ xʶmLķېɣ.dx_&Bl:6DI{CV~2P&b!:dCKQD[Gd uåqӵ>mZHiuQI qKUKK9^ +Q ;Q9 +~EPUHLj.>o1JkWT&C&c'L:wgcGLk ԶL=C}e QSQ9)ljSCv3-xRp9/99+s & O F-St`.tzvLzkmaN}}(͕v>V|`]M~0y^/iôh Sڵ&=H+ +1;{}k(Zԫbm[tA]c޴lZgkg gb{,_ &"F۔r]@\"ԑ]g6:kBNyٵYg ^doaxi.q8aG^'YI{q;SrLZ[{wd%B_cb/֐ LxP)\Lmw _:.d= <2ML~"&<{㦊5[`³7d45xs&oôVW['"|rVK3]zr5#`/Rk SCsh*\ z*KhD>W|4^ZiEB#͗1r]5;LLx[H6y(&?E[0Ӧha5@Qv/9'_s]FxPV徃F8[Hul"Rg, $':x\|&:?i $d;+-gHnL{ >.':bDovptMbOnV隅!hl^cW~<qqr7ZHȸ,0.o Ąjqaz&gPwptF"|a"odhaM.2w>WF:#-=~: p`e430_?&1OUօn, oo &2Ä*B>:)h.]ᦓY7QD4=v ` + i4Oip6"bxÅ[<0JV I]COԏL43"1-WݾY.Pur`zJ5 ˲TW=tvkG vw_ +GfiݸA! S_XvOJTl= ZchjC鯁cD;ڿaV endstream endobj -1446 0 obj +1513 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1445 0 R +/Contents 1512 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1447 0 obj +1514 0 obj << /Filter /FlateDecode -/Length 3008 +/Length 3007 >> stream x[ێ$9}EâVB=_AJDGGi;+c}w2}icoshwgW״={sǹP?ow ^?eMU#NoSǼoy*po^`S~nMMڤ16 EaSͦJƍ\(`W7oX>瑏3+~]U1 H?*ug^즳 WLBj^QVF$|WLօ9`XKX[i7Yؠ_6utÂ!+y.coٽf#S2}ص|C5.ǯ4vff,,Ar(% nϕ'kt{z1 ;G WF7.L. ׂ},&$趲< ]72[lsk vٞ+ՑR=FT#_#(B<`ypiH{^ǚMI&8X8օY~[ٛdઐo]'\^t/ҠP1߼dOCiiOj:sYZ!\E4W?3$e)aaC~TAĔ93c/x贗Y.;D+QM 1mz۪bjIx1'%!=ѭ SnIqғQ[[]K; \@Ny[Rr˼ϓ* [ͺ~^sIO@˽,| VɢDPٲ35j+Q\h%V*~lcWʨW-7=Ԭj`~^׬a !x"l @@ -20390,927 +21405,7 @@ Rs wcLmg2EU/.jw TR4 ƋajZ_!--h$KSó5e!t=,!WUT/v ǸyvJW9tv?=< #C5C8]!1*9WDH{+opuM!w =J xS[/Ȱ=mplT(N -0)U=S, ̵̞%ב[͹9H؅NQR 1Ӷ~G_hLL]]n{t)AErΠ@ Ff?V|6W)|K(7X~ gL - -endstream -endobj -1448 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1447 0 R -/Resources 4 0 R -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1449 0 obj -<< -/Filter /FlateDecode -/Length 2566 ->> -stream -xZK#Wl mB@ ؆e:Hbdx\])>/3X{47w|~*,&˰H)Fk_izBR*X]<ϯ?(ZE)a<~:4U&?6nknf 2a -K aq>3}QlIԋ,a wsn 򐆮rvѫԥ -:Jw|te"H?BBPJZ.LsY͕|K{IcS|e|4Ls]2--nZ)Fn+s>j7E -W&Eč@1}H.|TIH"]U$d¬IݦE&biD ,,h -e{IkH(ӽ(m2m&L5$iR)i` f=b/y-KỶ.fֹׄ9oCdY`Ɲ/Po<*t?mܡ[%V\ -Ԥ@#-(oJIźE~k‘(1=mSﹸs=AO+j,I^Z-‰mB>hΜpuf[aĖuW>gͱ4-Zl֤a0vr8Tgnmܪ[|8>Wj$Fc/* x*gni׶/_[N:rdrm"cB@hn*h3'3).vCp2N!ZΙu'v:<{"z .(-g;#ԓAa6<ޠwƣ{0׌S7,3#tvzyvGѠd9x]ڔD},9ͺI l/jp;LZz8ͧa*H6gyU<ڮ4V-%:y;В{$ƅMص޲.OrrҶ$(]Brmx^ Fea B_9zde5FjVLF#q AJRBFn36`;)ݓym -o8ՠ8BeQ3.&~KuOTC -ְ۴LlHϐwĬqKǓ7S*gඥoybNl$02wJ(]e.,@?Uv{1́ K[_q/5Ō-a̕HiV@EpaNŇ&36 -_,ArkV7Bn J1sѶV{n+[8UL^VW*6Tli\=* ?rrKM3cKp,*sZtWxbQ@zvZm\n]gE 뭕-!nS]]ЃucÍP! 8iMAhkB²[tLċǨ[A90$8H85\h_ߚ(.>S.dΫΐ%:j7`)^,JJ,GyC>J6FQx-ň/.j#M~ߤj)5k5;Tj$hY/)io) Zݻ&4Y&|ï_Q2^a-}^x"$2+<+Ll9.w1TO/u>ikP$5}ߚog5hx;Ӿs=0mDd7%m dК79D39C[;M|ƣ%zK%Zay1%K}D@9Ku;X -.4e:Z( m5|H+#11jnJ:JNǐ S"2!'$00ar*S8Wj= '߉ _q -endstream -endobj -1450 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1449 0 R -/Resources 4 0 R -/Annots [ 1451 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1451 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 243.657618 39.386457 228.643218 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/error105Loading.png) ->> ->> -endobj -1452 0 obj -<< -/Filter /FlateDecode -/Length 507 ->> -stream -xT0+xg<3XB= pTФ.I - ˥vL8+˕{-Y؝;eXM-ڹKTr՝) >DS*}Tx )EݚV=G -?MTk[rc.Sqb5_ÿ6dG=G<}s4?FГX# -6ov3(.5G7AN*5ӇnhS}w꾾@6~qIMZU%OGָdsKSOBĊzovөv+i.f͌REdIu?<Ğ^ -8VHnVL#nw;[Fzz1XUi5EE:ZZQr0dᄦNbn@XaFlwyFKK"_S̭DhF'YqFPus$ojI&+~ 0Y;)R#‹h̴% -endstream -endobj -1453 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1452 0 R -/Resources 4 0 R -/Annots [ 1454 0 R 1455 0 R 1456 0 R 1457 0 R 1458 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1454 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 481.835925 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/error105Loading.png) ->> ->> -endobj -1455 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 481.835925 297.637795 466.821525 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/error105Loading.png) ->> ->> -endobj -1456 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 423.655125 39.386457 408.640725 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/error105Loading2.png) ->> ->> -endobj -1457 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 423.655125 555.889134 134.467428 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/error105Loading2.png) ->> ->> -endobj -1458 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 134.467428 297.637795 119.453028 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/error105Loading2.png) ->> ->> -endobj -1459 0 obj -<< -/Filter /FlateDecode -/Length 1196 ->> -stream -xX͎6 )Պ~$hgIClAgX)GR\5}-Sv^?M')+2L -ədbD rQ U:0$]^s~8=,Fu+VH-4ª訢iz|7CdSNף梵4Z;Ÿ+g+ߡzgZc6yL{5y܌1):O籲ocjukrݹ57޳ͬn~/۲v6׀myo{66yOϧw7=lôz8;3o+a DZ(ݳXs9W8LCʐ6kwh!qh%UlMꮣ$Лpզ))w%`vślf( }7z1yx@m -G|a\+2A28ma_s1K0Y=iW"Γ㢷"⼈R 0AY 36RP  FQ&U5WCRƲ3|lr,Y;-r#y3n$Є ڻNF$sWlQ)7bR7U =좯y5DN(9]Ua%Q7K6L; 5C #6i8NPHG v0'T/@.|_PJ'#}sx2'!^~=TE=QrP(1*J[ uLۚj7,x@!dh)?kZ,6-70 !̿WBNcs#QfH_=$بA=Te%BrpFjᱵQ8eI RB-rBOb~sh'ObivZYz%ÀAǽrK~ -!w)'V_[?Z !Z(ӌ(XONyL1 +H ̠`d){0f\LSDOQ w -endstream -endobj -1460 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1459 0 R -/Resources 4 0 R -/Annots [ 1461 0 R 1462 0 R 1463 0 R 1464 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1461 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 540.177222 39.386457 525.162822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BEFOREFULLSCREEN.png) ->> ->> -endobj -1462 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 540.177222 555.889134 240.229053 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BEFOREFULLSCREEN.png) ->> ->> -endobj -1463 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 240.229053 297.637795 225.214653 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BEFOREFULLSCREEN.png) ->> ->> -endobj -1464 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 157.649853 39.386457 142.635453 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AFTERFULLSCREEN.png) ->> ->> -endobj -1465 0 obj -<< -/Filter /FlateDecode -/Length 1781 ->> -stream -xYۊ7}J* >$'yp\ 䡧c;ҥU=8>J2̖?_LJ"d e<~'C98sF)A3A2y74|;:5!k) c -2f||7X?ӑUU31%( $6 R(f|zCZ~g"LOp@r\=.19C]U}eo~lp}&3ȗ"Yogk8/k%S3صđ\Eќ0@|o9Wx72s5kqz3P]{߄`: AإKD.UV/rEgqtmw@~K~ףkJVncNc5\VKA}]EkR\3b2#p n ]Xhۥ*э.fH8%l ^ui̹Dl4*7]O(ztbГփW]Q6Iv1ΓbZlN:JL^NN}ę-hivO8Q'h.+QƽT Q&b2W#bQx~F6OgpqXG5 Le:pV#3}qVZcTt7U3qΟ*C7X7WN;x[)!,T&aH3X-d.J1x#d:Jn7X/W (fhWWܶNu9oG*{mccRK{۳'5?whz/cú7"gM-=qʮnoD︶0NYt$o7qF%!iq|k`RQ8fF.ۤUi9l2ގMr{*U$'<x6  %W[έoφ0"ehDsUt7PMfk2+Xqf&r崃7q$zYb$so{a#AԈgdUqEko{;Ǜ=ª0;ս͔7L\Olͪ ]+֫MvY@Pہ'B?8߽'酗ڜ,1quDŽqTUƈ3R!RIi[ 00Ih/r1z.TK,[B@7; -endstream -endobj -1466 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1465 0 R -/Resources 4 0 R -/Annots [ 1467 0 R 1468 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1467 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 480.632659 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AFTERFULLSCREEN.png) ->> ->> -endobj -1468 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 480.632659 297.637795 465.618259 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/AFTERFULLSCREEN.png) ->> ->> -endobj -1469 0 obj -<< -/Filter /FlateDecode -/Length 2930 ->> -stream -x[[$~_1ub:8lb9}l`)]Jn͜s@vLZ*>U}UY߯%'zgۧX'~?IůVyw^bBa={)$zFkϿ|G&M+`N*7͹gjޟ~fiD畾 MHZ.] &Hix%{O d6WmA:J !pvSeF@:,]e4̻=+cMski|<5|9BngيiX몘fkXYp$vٖZ'Ye>/)J6 j@\[CRVoOYbƷ038i=/)wHZx2ie(6>Pba|&"`8WlRA̠B#>_DTٔL1 @vn&MCœe_BV/xRmCoAy!V{Ӥ~-&lx%(7;#u%K3,`[!\Glj$-voY#ɫPt5& 4ʟI Ұ֚"I͢CjPN%*W”^xDJ$._"y1W7p(!yalyw!DJ+j%gVeoxG^26!LTAMFzHjFNiۍ)͍jPx|t>-W] gJxG_)8]cwĕ8 cW!S3RZh#J8+]75W^Mݰr0ٴԙ[Ana!Scm} k~:iAL=v7˗}GMK[Ce>6]+=i[TP"EP(9UdDQ}WPb,KFnfb,kAg.kܗ QWiwo -bS>`fh`exK=ej]&%yv }kEViG ws]w ,? m]|uRˍ13|_^)tTpbX8ڝKl Y;d5h0!N{=Z+zvY[S7O6;l軧hru#e[cF~/ZEs;82qX8\F;Y8}\Ȯ+rOu1b8\GF -*-6]^?D+#8_3}UWnIЙs`%ѷ -{{{q{tї~>b1 ~搎g\hg >FQ fxˠ(`=hܐ` +-KOL zQSerd[v&'v!&ު9í~TyBfTEo?&X)++:ʡ͆k> -endobj -1471 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 184.196622 39.386457 169.182222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/SettingsUI1.png) ->> ->> -endobj -1472 0 obj -<< -/Filter /FlateDecode -/Length 1320 ->> -stream -xX݋7 ߿bq%Ɇe!C҇$av6?Tcyvzǖ>,c͟oTӗ׃V2Ep^Ls -soS5V Q!}}>hު}`@qr$*vӺMwR Sh05 A!e,)G &qljzet -6ͰB@aMvw<&~GLDE|a>P:\1s@dZ?Y -*Q.S{z~}od#ac/AAEdjJ笵Qe~<,k4Ŀy-8^Sb^펠]&c!捽o0o6Mz{t\Ocky b((*_Tez;V y-c eO/ C,rd6L1]8\sgd f̾ N[yjqh䓰yOez7kT#ʻW"rrǠ6}}a]c'U6_9q9>e4HxVgB$]DrYHeZhω?}ǕU3Ϙ\Vl%ܒܹ'keLuͣ e.KݧRn֯Dv}ra5*fp'!9YyFՙѳr`LhPxjAy^jF,gMon[> -endobj -1474 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 505.361714 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/SettingsUI1.png) ->> ->> -endobj -1475 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 505.361714 297.637795 490.347314 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/SettingsUI1.png) ->> ->> -endobj -1476 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 195.995414 39.386457 180.981014 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV3.png) ->> ->> -endobj -1477 0 obj -<< -/Filter /FlateDecode -/Length 382 ->> -stream -xn1 y;#=¡iHCw8Ku;0 &/exEqs!pobqclyLl`ĝe#",P-?cyk hnkϠ!]`~xNK:ک14vkMo^$_};(VgQE&ŋ׶-,_qY1T/[o3ktDšD[גp{MnciI_#RX#IC˂X=fKyg\(Y&ݗ<ݤӿ`tӢ:ABpt@m?cD-`ŽFiA i,%ȑ}ǿ@ʷ -endstream -endobj -1478 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1477 0 R -/Resources 4 0 R -/Annots [ 1479 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1479 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 40.569523 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV3.png) ->> ->> -endobj -1480 0 obj -<< -/Filter /FlateDecode -/Length 705 ->> -stream -xUn1 WHI -J@BvlOEj 'L]@n'x Z"izrU|/'rp)LIIm !TO8Dl9 4~ynhPN ![_0-Jtr: )j{zC +lxYJ 䒨˕V"0[T!ւGlK/JHXRD; jp -endstream -endobj -1481 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1480 0 R -/Resources 4 0 R -/Annots [ 1482 0 R 1483 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1482 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 771.023622 297.637795 756.009222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV3.png) ->> ->> -endobj -1483 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 634.017222 39.386457 619.002822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV4.png) ->> ->> -endobj -1484 0 obj -<< -/Filter /FlateDecode -/Length 381 ->> -stream -xRN0 +;vbGBsXؽ u0ӡh '3e; :m'~9|2!0Z$a4qӗw%V1#Qɀ{0pBۯA4j2(6{~k/aBR--3(/ MEæNf8y_7Ie*S{qMI9gu13:Kcp)b<5fqsϛXn%uّ}^1b{\|]q"M]Vwq WXpjwRxBiC߈~R3.cN. lV>'#h9tЎuzȦA?U -endstream -endobj -1485 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1484 0 R -/Resources 4 0 R -/Annots [ 1486 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1486 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 40.569523 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV4.png) ->> ->> -endobj -1487 0 obj -<< -/Filter /FlateDecode -/Length 553 ->> -stream -xTMo0 WL%%J"ۡۥ@ vhҥhd ȦhGQ@wBE -gre g/u^sI+I8Fcbv?˯ž=C ',Yyiy@rD-ո^CH,KX! B͗O?~sh qٟw?n -R%PEWh!@I ΦQ_@6ߋ9Bɞ -p4'K؂ՠgl,fBjm1l5q[7O3Fk>oO;um9Mxk4?Nz:7 @ k!W|:^zpikf]"bY hm'7W'&TzWs3}I|P.Y$4Y^ː̨ >m̩o9l%vecgLElGQӂADvJ&0%Yi:(X>1Q:ZE1nj7H= -endstream -endobj -1488 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1487 0 R -/Resources 4 0 R -/Annots [ 1489 0 R 1490 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1489 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 771.023622 297.637795 756.009222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV4.png) ->> ->> -endobj -1490 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 673.430022 39.386457 658.415622 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV5.png) ->> ->> -endobj -1491 0 obj -<< -/Filter /FlateDecode -/Length 384 ->> -stream -xn1 y8#U{i*NT[_Ovf[O23 {'\ܛU08˟!Y+jlJ.ޢɜhl!| ?Bo-1[I{H.8> 3CҷScPԲ[% l8YzypxJ'^sIV^fNZ|<; 1 #Kj:"U¤п8O׷7Q-NsdH -Y}Ze43GǼb]O=jE]7t>L"WnQqB!L7`)ԁ-oX[Y `LH ]?v6fXWm?C {Q -endstream -endobj -1492 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1491 0 R -/Resources 4 0 R -/Annots [ 1493 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1493 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 40.569523 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV5.png) ->> ->> -endobj -1494 0 obj -<< -/Filter /FlateDecode -/Length 670 ->> -stream -xUn0 +UH( C`(zGS -$4z-KԐ3(4 ?&9E2eU,6eA'rp)LINm !k){' #@tsB 45bV 8a'sg2l1tO C\V#QE -QEd4byF^~Ymw1X_B]+(VҦKmk_qΡ jv}|ڱن\'ڍxx;y&`oh8-οpЪAh qzhڇXUot:Z(ֻu u%4&& R$LI4M8̛W>b O>MH>9U"jqDԓbԣ,Ҽ.$qqM\oA-$hx\Jv#DO'i@Zx,Ez -72['>u.DZ>f#gPǶOܼMa?xn - w0G>&=C2VN6"0jփc%փGleY7=x>h0\Ev>R] oV6 -endstream -endobj -1495 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1494 0 R -/Resources 4 0 R -/Annots [ 1496 0 R 1497 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1496 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 771.023622 297.637795 756.009222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV5.png) ->> ->> -endobj -1497 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 658.415622 39.386457 643.401222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV6.png) ->> ->> -endobj -1498 0 obj -<< -/Filter /FlateDecode -/Length 383 ->> -stream -xRMo1 WgjP Raw۩zjp;0 xq`w3fy=12~C"+֤ƅ[6"HTC~0Xkl30w{yL[,9 -K1[*EXԨ4rk62C>//{j ZL^^J~<@/vb -ǚtQR#, )|&BciNw^@#αΧ8xy&ͷ<ݤkXZu?:^Ӭg<a -L^;#<[&Ey ĝ\61׀QuZ=iG1u9rxA ŸV -endstream -endobj -1499 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1498 0 R -/Resources 4 0 R -/Annots [ 1500 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1500 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 40.569523 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV6.png) ->> ->> -endobj -1501 0 obj -<< -/Filter /FlateDecode -/Length 659 ->> -stream -xUMo0 WL%E (r] -d؀a'mzv)6̎ɦ#i - ڜ `"Q-Vɓ%S 9c.0[Dpzocȼ>N_-P&蜍XRbFקfF tbG͕Cl~? -%`.yowš-~6  D8x 0FV2K< - h} dxw(Adpl{+mBik'y"S'1幮wu:fl'] bp璨vk0רpE }:)+]G5uCf"p"qIp @Mw%cKVd  ?%z[@ 'll;V>0̸NqTZ1.~/>wkv'0`z5h%ugwZћiM,G"fLl⎗xD|צlnX`cL![L^#EfDihb>=ediUD )[EBZ@IZ@F.s 05aJL%KNrn$X:+m/,yJUL0 -endstream -endobj -1502 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1501 0 R -/Resources 4 0 R -/Annots [ 1503 0 R 1504 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1503 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 771.023622 297.637795 756.009222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV6.png) ->> ->> -endobj -1504 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 658.415622 39.386457 643.401222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV7.png) ->> ->> -endobj -1505 0 obj -<< -/Filter /FlateDecode -/Length 384 ->> -stream -xn0 z -TRD -(r(^a8"%ǫlS{|b,&̪(h&nqӷb]Ҡ5G-J3-0SLPD_r_k -J9Ɛ͂}Gw@M4z\>-fTSFKPؓYyzy0xt踟=wSӸs^؋ Y?>^ 'Vt>2]5>0DĂCQaB/ؗDVz4wÍ2Khu5贔> -endobj -1507 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 40.913981 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV7.png) ->> ->> -endobj -1508 0 obj -<< -/Filter /FlateDecode -/Length 1673 ->> -stream -xYK7ϯ!J@B생C r;RzJݭ$^Z-&I C3]>pVO=A;U`|x N5ZK7}xx绠y7(%,6)~txy!OfZ(/~i -ZPSVu`|QTVuuIa_lBAw@ SNhBZ?9سj26:_ϩ[ -r`[@zL/yo&(q>@ }}z|D)Cr=,"Xk}4ږXzk3恦AJ8ű+h)Z5ꚅDX;.@msԧJ`Q2ߟT:*_fY\M^zi&Y)z9aFSUmMv66:VQmLsl-%Ӡ}qkY>tjJ: YF]{c 6 CLٹE!J` jTEgeN[2˞:d-_/:hZ-Ѻ#U(ϧ)yW uPV%zU9lz2ɐ\ ~u^W, -\? ܟvXx! 0]QNU,--o:{ z>=IJ">\kɳÖ2cSB>9m>9+UBse>Kf ҘZC @ڃgrnAZA۔~Xv>{p ڀ8%K&;?!sUH3ԿLrॕaqgY s=[3]*E\1z$\=GcDSXw`'(~aꎶޜ2  - W1:Zq4Ќ8s2F n%b| mBKrPUۅ+-ΞYqhYU&ƚ`Ww!]*:NI9uaŵ.G@ -b&oN :"_xEjr`KCA[=LNwaTIn+}O@ 䄀sNKyFm񲇰jMe~\%?Ec+=;3Sk^,η`z - -,01+Ϊd'˼1v+o9Єf`V9m0qV?' ©F-}tF4u78cFo亐S #1ƎLIzCߑw̹Ǡt#27a3'wS_ 6^j[ꠚ:p9fq^l{<`E~ǫzU# y5tYDy|Goqxo0K;qA_m ܿkzOʵmqy\Z-d{4FxF6;\W\߇TM&h5<* Y!^PsqG9רd_`qr]_vwLc_dHa%_~/{{K:r@ Bev=8cW\,2;KB/)[ L;`i(3TTT- 4U}=,}lx/jD -endstream -endobj -1509 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1508 0 R -/Resources 4 0 R -/Annots [ 1510 0 R 1511 0 R 1512 0 R 1513 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1510 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 771.023622 297.637795 756.009222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/PosterV7.png) ->> ->> -endobj -1511 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 649.031622 39.386457 634.017222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BordelFigma.png) ->> ->> -endobj -1512 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 649.031622 555.889134 352.308610 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BordelFigma.png) ->> ->> -endobj -1513 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 352.308610 297.637795 337.294210 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/BordelFigma.png) ->> ->> -endobj -1514 0 obj -<< -/Filter /FlateDecode -/Length 2126 ->> -stream -xZY6~ׯ({H`ib{Elm@tHq$r@^͡U' -V"x{ )I;?~0 : !OPJjgpzusHC4'NE\ڡN⬄ |a{/[x:&Z׺s, %uHvo,LÃ-aq,znզu5ZNML/P$r>%E$ HG}0a<[' NdY9]8犮f#dZײuq֟ǐh@b}1)x-18$=C$E3j:hdJ*|xT^eą#9fk؍\9[zދ@ 2r;2a= /4FK)iU`3_(q 0mFhDlďRdH*dޤn{3kQs-]0g ?0O`X@ -`s oX87{x3 [e~Av yEU咳>I8ѫ3/c4hɫbвʼ{T2>캍֘G+ZQV)µ#f\4<.Yk([լ.6^90}L).N{,V#q^;4HO< th,óFUXi8f!*Vch}f]҇p!<`9s*{-ޛZgQJn -ՊM--قoJJlÌ *eQb~<橶AhY#0QoRuJPvj -eq`!g[srLr{YvScsoȰ;g#^Wو -iek`/k|A -ph0 Ǡ)V5ㄍAi2MkmsiegDcx;1\6X&J&;dMצ&0_T=P-t(VzGn,]$bdz?]~k?-hFH430;Lj*Z B=w 8,G D`t󕦆 L9VcB5r;'H -)=Hll8;d hDu@|P"Ed5ջ,1ŋl#g3FRAi=G%)aB'g;M92[3IKD09$kOYGTG}A'7Z&ssy1SzPǃt0 `6-n5kP9Tq_ ' J*,GF8<ׯf~T$ `E13Qiꢙ ,YecEfd:ҳ4K<(Or -ddt_쑰+r烸 -ܦNֶ3`Vגϲ!x>ZXiy:IKx;zo> H}*ҎZ$VL-Q&uR){}f؉[>1U.^ a.!w;L&]V^X ؎R%Cjhpخ"=.CTPF𗗙ٚ$(i -܀ֻ0yT!,@!#ѥ&}׶.!HR1ۻeQ6'?aG?\}=fA '^ bԆh<JE{X%ٓz]/OzRԑI$FDF,g|*d.ߑQup bW iDWa0cf}rsWX̯pw +0)U=S, ̵̞%ב[͹9H؅NQR 1Ӷ~G_hLa~u`0O0蓣HNPȌjy*o4v Ͽ"d endstream endobj 1515 0 obj @@ -21327,16 +21422,22 @@ endobj 1516 0 obj << /Filter /FlateDecode -/Length 1413 +/Length 2567 >> stream -xZ_o6 NHQ> m?mp%[N.nv7BI#Mac_D01&/5LV>GI_:φ9c6 X!][W9yr s H6z}}؂w20Trk4:@Q!h7׏݇_߯69}DžZB ek ~j#|:*W바yf0Sqi 86Lx7T6mw山J]'}[ڥ¿,ޔ>``ΓZ~(ni80hXyP0UQ؀]ؖ _&9 |5ZW js@qWY3Cp2'FYۤKO)a8ld -xR@Sv -x>9:m?W@imh-@4Lh};7 ć4}ˀXr4gL!FxJ1fGڡs~ 8wȍkl^R9H>0市RYGkR:n5^p яcW -^Dn6GkЦ h`~O98cypٍ@7fT'fis8~(j 臠UV#{8'yj`UN`Zmo'2ds/w׮rjhAAGYX2b (ʚ`Ak-&BBS;enwhf#S5؀ p]Rve1VW$-+^Co`R}I2pb8t,8'@3 ,Wo<ޮ7B3 hYDq5,klrɓ^9v$uY^UW֬I}[5lA^a1JJʝr&rx]9;M"bgNRvtx>9d"+vk|'s,;'tL6F0' x[ E 7m_\sѝ6D٤?%W4lR\C DmC*9:3ұa!6'Z oIiv=UVۅh3 -OpD\],c]眀+y -`N/INK-σX{P`=/LI]`$E{dvSU&)$}qr=&^{x fٳlIA<'baBI_])pS5 L) -hUpsy1<:afxWKqT˅[.A +xZK#Wl mB@ ؆e:H"?x\])>/3X{t7w|~*,&˰H)Fk_izBR*X]<ϯ?GRi懧OP1ԠCk \{s6_ǭƵ1~t1iy*s8:e]|mk2wjs'zʳBc<>W]ƸhݤHqDbrF@na$_cTIH"]U$d¬I]Ӣqx\LD +"ϋTI Vi42Vҽ5$u^t}Y6T44B@c/y-KỶ.fֹׄ97{Y`Ɲ/MBJ[:Ÿ>w(^bgg47(5)H +M 9>ɲذoU8?%05Ƽ1U90K9g42&Zɒd5lrL,\נ7IDsp愓t +#sm^UciZ#[h֤a0vr8Tg6VnU->s+5R`ѱFqXMUl37kߗ-'9om"cB@n*h3'3).vCp2N!ZΙu'v:<{"F .(-g;#ԓAa6<ޠwƣ{0׌S7,3#tvzyvGѡd9x]E},9vK \ -lVQ+I# +r;G^ϔg,xs}m61a;,gIq>피7Q!2Ķ {@XvMup ӽ1ډ#FyediA"xIs +0 sV)>v +_,Ark^7Bn J1smͭ +-rk[V\[8TLVVW*6Tli\W~s-Qtj7W4..xHlh{ +Ńҳ[jbt+hl1qmLutA.617B +&@a8քe-=oӃ2/NrnwmY'.A© Er @B֬Gɭͫ0JgoFo6@zDb4&zcbgזzyh >|~ttHP}3'Fh{^4a!LaU A88就FGlLt{'>.>S.dΫΐ%:j7?RXYҏ|.4mP[% +_\FZ?IռSkj 7HНf\RRFwMi(1L2Vu7,_ +eU<+Z:h4 ,E "IeWNyV$c$r)]2b6nWl/f2rvGKlK$j_b.K H@9KuX +.4e:Z( mu|H+#1U~M{g/[(Q;CL@ʄ˩O\2ğ'v$ endstream endobj 1517 0 obj @@ -21355,6 +21456,917 @@ endobj << /Type /Annot /Subtype /Link +/Rect [ 39.386457 243.657618 39.386457 228.643218 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/error105Loading.png) +>> +>> +endobj +1519 0 obj +<< +/Filter /FlateDecode +/Length 504 +>> +stream +xT1 WڱK"vڮ8Nf +3,H&dC xy-oe@Qjҗ.WbF橒f̠Œ5=PD3(y1mZ}|~p4Smi1RS65V/WaSNf8W?eQCe x%G(KVk +pqab-O=2"I[N}[IH]]|ǓTƓŀc&ˣ.(t3sK1>|=,(4O + ,,k XqFwe,Ԗn2H|)+PZNg:"@@+Msr/ Y;Zc=n %l?/%m +endstream +endobj +1520 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1519 0 R +/Resources 4 0 R +/Annots [ 1521 0 R 1522 0 R 1523 0 R 1524 0 R 1525 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1521 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 481.835925 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/error105Loading.png) +>> +>> +endobj +1522 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 481.835925 297.637795 466.821525 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/error105Loading.png) +>> +>> +endobj +1523 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 423.655125 39.386457 408.640725 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/error105Loading2.png) +>> +>> +endobj +1524 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 423.655125 555.889134 134.467428 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/error105Loading2.png) +>> +>> +endobj +1525 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 134.467428 297.637795 119.453028 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/error105Loading2.png) +>> +>> +endobj +1526 0 obj +<< +/Filter /FlateDecode +/Length 1194 +>> +stream +xX͎6 )Պ~$hgIClAgX)GR\5}-Sv^?M')+2L +ədbD rQ U:0$]^s~8=,Fu+VH-4ª訢iz|7CdSNף梵4Z;Ÿ+g+ߡzgZc6yL{5ycSt]f%<E +3*80^Fjа۽a>?P($PXs̓ a&=͹ל,b/%N\fwL%8Yk5VSqZC1Eucl}),c>"t%;C!r&+tЈ𚣼W(4cj:[%;ke9'j69cȚ$"ȍ~))737PA{W "IЈa.ܔ-*Fv^ԍ2k1sbj g1~woWrqXpY9{> +endobj +1528 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 540.177222 39.386457 525.162822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BEFOREFULLSCREEN.png) +>> +>> +endobj +1529 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 540.177222 555.889134 240.229053 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BEFOREFULLSCREEN.png) +>> +>> +endobj +1530 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 240.229053 297.637795 225.214653 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BEFOREFULLSCREEN.png) +>> +>> +endobj +1531 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 157.649853 39.386457 142.635453 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AFTERFULLSCREEN.png) +>> +>> +endobj +1532 0 obj +<< +/Filter /FlateDecode +/Length 1778 +>> +stream +xYۊ7}J* >$'yp\ 䡧c;ҥU=8>J2̖?_LJ"d e<~'C98sF)A3A2y74|;:5!k) c +2f||7X?ӑUU31%( $6 R(f|zCZ~g"LOp@r\=.19C]U}eo~lp}&3ȗ"Yogk8/k%S3صđ\Eќ0@|o9Wx72s5kqz3P]{߄`: AإKD.UV/rEgqtmw@~K~ףkJVncNc5\VKA}]EkR\3b2#p n ]Xhۥ*э.fH8%l ^ui̹Dl4*7]O(ztbГփW]Q6Iv1ΓbZlN:JL^NN}ę-hivO8Q'h.+QƽT Q&b2W#bQx~F6OgpqXG5 Le:pV#3}qVZcTt7U3qΟ*C7X7WN;x[)!,T&aH3X-d.J1x#d:Jn7X/W (fhWWܶNu9oG*{mccRK{۳'5?whz/cú7"gM-=qʮnoD︶0NYt$o7qF%!iq|k`RQ8fF.ۤUi9l2ގMr{*U$'<x6  %W[έoφ0"ehDsUt7PMfk2+Xqf&r崃7q$zYb$so{a#AԈgdUqEko{;Ǜ=ª0;ս͔7L\Olͪ ]+֫MvY@Pہ'B?8߽'酗ڜ,1quDŽqTUW*5 00Ih/r1z.TK,[B@7TS +endstream +endobj +1533 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1532 0 R +/Resources 4 0 R +/Annots [ 1534 0 R 1535 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1534 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 480.632659 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AFTERFULLSCREEN.png) +>> +>> +endobj +1535 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 480.632659 297.637795 465.618259 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/AFTERFULLSCREEN.png) +>> +>> +endobj +1536 0 obj +<< +/Filter /FlateDecode +/Length 2929 +>> +stream +x[ێ#}Wـۼ ,$@l`qy4+X/Exs2dxXu+~O0r abVOj}I_ń z2,R +IbxC|ޯzBR*X`c y|,q j4ZƬQRӰ6vs'M"5Etυ8&}2iqdʼnlK&U/hg\0G?wb]/ h^OqsXJbH Hg%EX +OoQFTwB'r\Z aW&6JƸ܆ 1ڔվ\i*?ۜ/[nڹ&R;_QY>~ 0'\3@PY "JWjuBҼKW/5 RZ-^^>OmiYX]j{=trB"r _]Hɫ,ƙ,ځ9m⁖GPuVN^af][_g}S:' 㲾̙:[+%w(o+t wAuq[Yd1iE{;зlQ͚៶AVEh.m6 ʥd6iG +ٙH,qe/cG3nnhjm2X:9(n7 r-^ڈL6isRzmáFNy`DvfxC7+UefT@MiHKԮ@%]^cm~999?V@?`b'>>%Jkn G{F)2AP \>bsiǼ'ds1V*'6DǬwT];lr\[u]Ov e>/)J6 j@\[]RV_oYbƷ03fܞ۔%H<2H@dǺX l`$&Na[X+6 fP!ؑv`/"ElJ^Dm F;INCœe_BV/xRnCoAy"VӤ~-&lx%(7;#u%K3,`[!\{lj$w-voYkG>W kL i?-Aa-5E\Ez@9%ZZ侫\- +Sz)>~MH^Ap +á܉af];o+XYLTnXl5<`)F}U "#Q4ur}:ޏX]^P|~j۰; DPjGDaR~{hm"6b.K+L:)l8b6CQ-Jh}i]G줰EP{Rm//}b-o(M,]nm/,wvf^!Dd8߯}Lb0R⧛3-~bTdR}A]SN_22.4tRMk?'LGk1 $X +CBA pmӷ.60ɼ;"av3wN3aMҬiSf񳡭Ywfk`Q׀L9 e(yPNRZQSvgJs)^o:9|3x٣WJf"NqŪ+IowUs-%F(Ա< +Ȣ +m++Ulð3ٴ{ԙ[Nna!Scm} k~:iALZ\k澣2cxCŴ-Z*(עia֪r2rо)Xe6%k#73O1p 5 \.kܗ QWiwo +bS>`fh`exK2g xyza{ؾ|rKl7|zr`A;Vm6pBNUu7foˋwm +-. _'wvBh L'AֽD-+z6YAmv6fO nFoN^ghuoȠ3ƃW*y0?(=z5ɧΩR8<1m|b$}}N) *=.w:\ ܈ >_HʜYo_ (>R=3]/vIdוrOu1b8\GF +*-6M^?D+#8^QgW]=N=ΜC/)TX>ڋܣoS^Ey3w>B7f0ˇǷ eF&=+W|QXi1=$Q_` ykF{&(Ō2AE Fz-и&'v!&Ѫ9[{}ͨN0cP;+[4MUa81?AZ/m@ `ѪspRZ:[2( B.obNyNjb1N?TeB++/\Ct__335>, usG P&~.pVb +MYC< +" kjMzH'Aވ " +endstream +endobj +1537 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1536 0 R +/Resources 4 0 R +/Annots [ 1538 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1538 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 184.196622 39.386457 169.182222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/SettingsUI1.png) +>> +>> +endobj +1539 0 obj +<< +/Filter /FlateDecode +/Length 1321 +>> +stream +xXݏ6 _UEQ>{Xb؃ `-Yc_n.Ab["?DR6KCcA+Mx=*L`1 +i@1:tNwN!cr +ƈ1*0)DfoFÅj_$&;#!(#u/Vs!FAM(*ٖSd6 +".53l17\R#ek&DORxØ|uǿ1s@0~ȟw EKAE.hpG+7&woGq߇B {4 +,)(mYkQB'\q4o̼Z=rs|'wd⎄a-q^(/ y{t\ױ |W1`Jc\/xδϥY>(0X,kzaRMvi3}uqk ` e/Z-,lœzLfjdo^yQc^Dn]`~M__hFlju zU}:'#G y9F^՞j\ADIlrsϿqeU3sUӊDݒ[xϝ QxIXPj}]p[{|}j/~%[;zQT 6eFݢ^k4\=[& Ջ~fIJW~־5ͳť|WF3g(|Jd +Iyϵ%L6q,Sm/޽f0Iϖē?V1:B'ؙ]WHSR= +)7döH{+ݛ= qf|Wlaw9<PQq7Z[d@x(ctz:0.hferg HGL:_evcΧٔ?ⱅl.3 +endstream +endobj +1540 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1539 0 R +/Resources 4 0 R +/Annots [ 1541 0 R 1542 0 R 1543 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1541 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 505.361714 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/SettingsUI1.png) +>> +>> +endobj +1542 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 505.361714 297.637795 490.347314 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/SettingsUI1.png) +>> +>> +endobj +1543 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 195.995414 39.386457 180.981014 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV3.png) +>> +>> +endobj +1544 0 obj +<< +/Filter /FlateDecode +/Length 381 +>> +stream +xRn1 +v؎ +A !ePж/,pxvPưW {3|xLDŽ`cpyLl`ĝe#",P-?cz5C4LT +TjGP 0?<% +JS~+v*j ݚҀMo&{豹EշluUdZxm5_vbV 䏏-7ӊ5:P"-W kSp{MnciI_#RH#IC˂X=fKe=lΣt~Kn_XZu?:i }O"+~VAy;@}30b-@ HeՎmg~ %bd)\@w⷗ +endstream +endobj +1545 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1544 0 R +/Resources 4 0 R +/Annots [ 1546 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1546 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 40.569523 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV3.png) +>> +>> +endobj +1547 0 obj +<< +/Filter /FlateDecode +/Length 704 +>> +stream +xUn1 WHI +J@BvlOEj 'L]@n'x Z"izrU|/'rp)LIIm !TO8Dl9 4~ynhPN ![_0-Jtr: )j{zC +lxYJ 䒨˕V"0SXsg.-(%#~ [`+YBrVIHNiҭ'Y0\T/C˘ +endstream +endobj +1548 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1547 0 R +/Resources 4 0 R +/Annots [ 1549 0 R 1550 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1549 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 771.023622 297.637795 756.009222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV3.png) +>> +>> +endobj +1550 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 634.017222 39.386457 619.002822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV4.png) +>> +>> +endobj +1551 0 obj +<< +/Filter /FlateDecode +/Length 382 +>> +stream +xN0 yƎؑp.+JL"_tޖIĩ?Et;!L̪K{}w%V1#Qɀ"3daFgx VETHdr) 0>}C}YnGZ̠>2T6vJd_|6ɺlYeJH6i;I1Nj}]3g ,=fVH1#Sua +g䒺H}Z1byu}iAźsY=:\m{+-(B(DpS9 wpv J;X٬|L4)ڱT}_\oq4#nm% +endstream +endobj +1552 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1551 0 R +/Resources 4 0 R +/Annots [ 1553 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1553 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 40.569523 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV4.png) +>> +>> +endobj +1554 0 obj +<< +/Filter /FlateDecode +/Length 553 +>> +stream +xTMo0 WL%%J"ۡۥ@ vhҥhd XhGQ@wBE +gre g/u^sI+I8Fcbv?˯ž=C ',Yyiy@rD-ո^CH,KX! B͗O?~sh qٟ:n7+[uqGa&eCO( E|lrdO8XqljPOl,fyo!nk5\qn縭ш'ڵuxfyyp'ߊ6[&5ό?O'=f Zǵ+>/B=45Yw ,J 6ȇ}[h*܌se!K.I1mV|2&3*> +endobj +1556 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 771.023622 297.637795 756.009222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV4.png) +>> +>> +endobj +1557 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 673.430022 39.386457 658.415622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV5.png) +>> +>> +endobj +1558 0 obj +<< +/Filter /FlateDecode +/Length 383 +>> +stream +xRn1 +vĎTj{(\8tw;Um%^0 $33~9N +7w08Ꮨd56%uoIS3g*3[|{Ke2fs")QV ŽaFc_VߊVwv,jZvk~**ĿdV_HxJ'^sIV^fNZ~OvbKejZ#U¤п8nFy8%@R΢;*38&.~w> +endobj +1560 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 40.569523 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV5.png) +>> +>> +endobj +1561 0 obj +<< +/Filter /FlateDecode +/Length 671 +>> +stream +xUn0 +UH( C`(zGS +$4z-KԐ3(4 ?&9E2eU,6eA'rp)LINm !k){' #@tsB 45bV 8a'sg2l1tO C\V#QE +QEd4byF^~Ymw1X_B]+(VҦKmk_qΡ jv}|ڱن\'ڍxx;y&`oh8-οpЪAh qzhڇXUot:Z(ֻu u%4&& R$LI4M8̛W>b O>MH>9U"jqDԓbԣ,Ҽ.$qqM\oA-$hx\Jv#DO'i@Zx,Ez +72['>u.DZ>f#gPǶOܼMa?xn + w0G>&=C2VN6"0kփ``FY9 PVuc e=\䑐\ΧCJԕjxF1 +endstream +endobj +1562 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1561 0 R +/Resources 4 0 R +/Annots [ 1563 0 R 1564 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1563 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 771.023622 297.637795 756.009222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV5.png) +>> +>> +endobj +1564 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 658.415622 39.386457 643.401222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV6.png) +>> +>> +endobj +1565 0 obj +<< +/Filter /FlateDecode +/Length 384 +>> +stream +xRMO1 W4؉c;j9JT0CKvxG\87S۟a(Y%q3_P,Y46Iޢ'fRRRC BϷV[d9UnGp֜(>ޥE=ZI5?G3Z೧jFQ\fUm:QvJ@Xv{1b"*2JIqoW2VA)h'*Dy&]77Y1d>u#NW/]>OILIߍB4=P[MZT%@? +{ HH]1-@Eݷ +endstream +endobj +1566 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1565 0 R +/Resources 4 0 R +/Annots [ 1567 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1567 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 40.569523 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV6.png) +>> +>> +endobj +1568 0 obj +<< +/Filter /FlateDecode +/Length 661 +>> +stream +xUMo0 WL%%J"ۡۥ@ vpҦhpd'ŰavH6ISh@w(DhS ,X&\/g98&0eØ,"8/69{ :g昂Ziтy5Quʡ؀1z 9g2&?O7_>}Π:te~;HEP!yD %yejA.Lxw(A:VP +c^-97j6uPuj>2 3⓯p]o:KI;VkpށgSuRVB󣸏r͍t t%%@XхoS-9֤nEST8|ƶanXt38]Z1.~/> +endobj +1570 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 771.023622 297.637795 756.009222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV6.png) +>> +>> +endobj +1571 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 658.415622 39.386457 643.401222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV7.png) +>> +>> +endobj +1572 0 obj +<< +/Filter /FlateDecode +/Length 382 +>> +stream +x0 yY;vbGZ RHtfh@Aܤcǟp$3ɽYx΁7?c-9%k%[Mh쉙@)ŧSxoM[d9nK19Q|ZC]~ ZS5INנ<9q$A`|GI?Ke7>ۀyq|l}>]Xё2 b!*9Nxͫ%#NKxO()NJBTzž^JҼ_HZp'~kRn RNlg}E6ڱ  +endstream +endobj +1573 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1572 0 R +/Resources 4 0 R +/Annots [ 1574 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1574 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 40.913981 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV7.png) +>> +>> +endobj +1575 0 obj +<< +/Filter /FlateDecode +/Length 1672 +>> +stream +xYY7~_φ:J% vb`9&'*ufדz=}H:?}QA C._R8+'nw`pjS+&PJjCn!w'nRJkaU@o5߯/OJ?K_G*oSV(ЩFQY1ǝ R(Ha CH'{6\-Pf_֋dosz,`[iLJz_ÛIEt8~{ s}z|D4P9neFS9kKb,dxy`_RؕdPH`}Bu\ᒯ3UjEŔ)IOEsʗYK\7#{EO3'lH5sj.kxTa4vbQǜZ!.ǟcsV2]tjJ: YF]{c 6JsBYLe9){lq˨.{꜒|l8i hF"Ч#u()yW uBDlfD 4؜uSlz2ɐ\ ~uހv+JsGfA]?y;DRGYDN@@ET lK˛Ch 'Z^K而IjTZƽos,^ 4[dƮ"0d T=xƹ!1O$Hò݃cA ĸ7/A\26 B e/l<ý̚eٚUѥmZdKJs4JRƺs?6h)o zEd(U6{hMGqN(Z/^z!.\mq̒D˪61mו l4R hlsꪃÊk\2{H[%+2$LBLuf3jEk%' 쭷6*z\¨LӒW֟ZAx tKyF xCn`&2?Weq͉Zώ̽~mXs|;` 3\uV%>Q^H_[yKC9X;`ˑqV?'>S+[`F>΁.$?jizH ؑR\eh\o;9tnwD7൐aǶ_{g1ba]y`KyͲE]W796D-F*VG'kd +4qxnsCF o{[#oem{r-zmovx+֠qeygdcuyJMTiRZa7dqx89\Y~YGpĕJ;>4Lc:_dHa +X_/_tI?nrTsp3uٲMYr]'xI;;bd`V6@h)(3TTXNA_1[J{YP}e7_% +endstream +endobj +1576 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1575 0 R +/Resources 4 0 R +/Annots [ 1577 0 R 1578 0 R 1579 0 R 1580 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1577 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 771.023622 297.637795 756.009222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/PosterV7.png) +>> +>> +endobj +1578 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 649.031622 39.386457 634.017222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BordelFigma.png) +>> +>> +endobj +1579 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 649.031622 555.889134 352.308610 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BordelFigma.png) +>> +>> +endobj +1580 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 352.308610 297.637795 337.294210 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/BordelFigma.png) +>> +>> +endobj +1581 0 obj +<< +/Filter /FlateDecode +/Length 2124 +>> +stream +xZY6~ׯ({H`ib{Elm@tHq$r@^͡U' +V"x{ )I;?~0 : !OPJjgpzusHC4'NE\ڡN⬄ |a{/[x:&Z׺s, %uHvo,LÃ-aq,znզu5ZNML/P$r>%E$ HG}0a<[' NdY9]8犮f#dZײuq֟ǐh@b}1)x-18$=C$E3j:hdJ*|xT^eą#9fk؍\9[zދ@ 2r;2a= /4FK)iU`3_(q 0mFhDlďRdH*dޤn{3kQs-]0g ?0O`X@ +`s oX87{x3 [e~Av yEU咳>I8ѫ3/c4hɫbвʼ{T2>캍֘G+ZQV)µ#f\4<.Yk([լ.6^90}L).N{,V#q^;4HO< th,óFUXi8f!*Vch}f]҇p!<`9s*{-ޛZgQJn +ՊM--قoJJlÌ *eQb~<橶AhY#0QoRuJPvj +eq`!g[srLr{YvScsoȰ;g#^Wو +iek`/k|A +ph0 Ǡ)V5ㄍAi2MkmsiegDcx;1\6X&J&;dMצ&0_T=P-t(VzGn,]$bdz?]~k?-hFH430;Lj*Z B=w 8,G D`t󕦆 L9VcB5r;'H +)=Hll8;d hDu@|P"Ed5ջ,1ŋl#g3FRAi=G%)aB'g;M92[3IKD09$kOYGTG}A'7Z&ssy1SzPǃt0 `6-n5kP9Tq_ ' J*,GF8<ׯf~T$ `E13Qiꢙ ,YecEfd:ҳ4K<(Or +ddt_쑰+r烸 +ܦNֶ3`Vגϲ!x>ZXiy:IKx;zo> H}*ҎZ$VL-Q&uR){}f؉[>1U.^ a.!w;L&]V^X ؎R%Cjhpخ"=.CTPF𗗙ٚ$(i +܀ֻ0yT!,@!#ѥ&}׶.!HR1ۻeQ6'?aG?\}=fA '^ bԆh<JE{X%ٓz]/OzRԑI$FDF,g|*d@aHvN qŐAD|1vk 7}p +endstream +endobj +1582 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1581 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1583 0 obj +<< +/Filter /FlateDecode +/Length 1410 +>> +stream +xZn6)r 9.P(^}3)QZ@8p 5?`c_D01&/5LV>GI_:φ9c6 X!][W9yr s H6z}}؂w20Trk4:@Q!h7׏݇_߯69}DžZB ek ~j#|:*W바yf0Sqi 86Lx7T6mw山J]'}[ڥ¿,ޔ>``ΓZ~(ni8Js`а*a(-}kz?2Lr\4vuպFYN0wO^ާiNc1IlHC~O>ط (%Gs`h'skxj ?8s~i8Ea/XZ~,WQ#K(bM +B>gK8$qJ(:h X6ՏI>ptT;#=،dYZ4쎟9QBuപ#q۪g/$Om}㬪 LQܖvAo%C{6ʩ>Q%dfu:PR!+5 ,45 +O^T^cܗiUaYLqWۧpb2ltgKٕ`F$-+^CogR}I2p۲qXqNzgXa19oc;HMy];n&+gDq5},1 6Wy:>I@« +ʚV7`ٗ퐺QW ;TTR4/}IFoR;_wv H&- α>3Izœ̽.mrl0ܴ}r͡KFwBzeKhxR\C DmC*9:3ұ!荮6' +4۪UIBw'h8Fs].sN`sv6AKaS0uRADz=;":X%x=;~{9, R8t~0|&d|;AIJYM}yH/}=> +endobj +1585 0 obj +<< +/Type /Annot +/Subtype /Link /Rect [ 39.386457 340.152570 39.386457 325.138170 ] /BS << /W 0 @@ -21366,29 +22378,29 @@ endobj >> >> endobj -1519 0 obj +1586 0 obj << /Filter /FlateDecode -/Length 375 +/Length 372 >> stream -xN1@ --=^Lhb)cR5ǧ c秛/$VhXբ&DJT$Ux_JD9!a=G/)[Ъ|JF*۠ر1ؓyz̎yyh WFhkR])yxҡ,Y:ȏy\=,+X,_r4Z>pnKeF!y? P\nwq|Zq8 _*^溓Bmg"0ӚodVR%v p;9-X].|Ύ Z<,D=l;]Hq +xRKN1 ؖPX6H@B, Z/g\eL&=~:$FĪ5!B&WD q +%x1J *1TЪ恱1cn)uQH+0ױ]Wooc^gwq/UPk+w> endobj -1521 0 obj +1588 0 obj << /Type /Annot /Subtype /Link @@ -21403,30 +22415,29 @@ endobj >> >> endobj -1522 0 obj +1589 0 obj << /Filter /FlateDecode -/Length 492 +/Length 494 >> stream -xSMo1 Wq> -J@Bvݞ%|tgXqAL6L<ɣw/"gJB}u8.Pj -%!T_H!3Ȍſ>2"jdm>#_z9:惠~q4p FO( A$FvӲ[_6!5IO[|0IIDrt2?s"XikЁmn-h#Ne}%s Dj!4G3|u@)+T_HC!qXۣ^/5BA,R +N7)$ 0VD~֓ e9׺_~]Ad.5IO[QIaZarW`sE130:۾[F$;<3Jf}~']ßqKc34RWMas5.u{zIR傐PJSY׺t2gQTZWN؞Y8,БјPXqyU\6@Aٞ.WdLZ,5AU ㆠLbwP:ZTJaJ1E5\ endstream endobj -1523 0 obj +1590 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1522 0 R +/Contents 1589 0 R /Resources 4 0 R -/Annots [ 1524 0 R 1525 0 R ] +/Annots [ 1591 0 R 1592 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1524 0 obj +1591 0 obj << /Type /Annot /Subtype /Link @@ -21441,7 +22452,7 @@ endobj >> >> endobj -1525 0 obj +1592 0 obj << /Type /Annot /Subtype /Link @@ -21456,30 +22467,32 @@ endobj >> >> endobj -1526 0 obj +1593 0 obj << /Filter /FlateDecode -/Length 376 +/Length 372 >> stream -xN0 y8#p\@BGmunig; mR Zn H䧩ݺ$AJ¾P U5 BLRȔ߭܃{s_J - *1Ɛjn&s 7nm$WoAY5J -T6[2#V0>ό'/2_ƸZ4'W \ {>ȶ3eiXVH !G̗=hdJ"l{dz؟ow3w%R{]oi<!D`CbqX(.= 8ec@=bjs4X⡖21u lhQS8Al ce +xRKN1 8#.(lX/Z/3e + $3E j&|u;A2h'fsI}@ j@LRȔ߯݃{s5^J + *1Ɛꁾ~&s nc$אoIY5J +TQl62V0Ϝ'/2_Ÿ^54'] *l z]+fciz&%B @}gongԆ6Vv@k&Ujdӑiy~mf R{]oi#~~/rKXe{c:6!3HqLEn2ZT +'|u{ endstream endobj -1527 0 obj +1594 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1526 0 R +/Contents 1593 0 R /Resources 4 0 R -/Annots [ 1528 0 R ] +/Annots [ 1595 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1528 0 obj +1595 0 obj << /Type /Annot /Subtype /Link @@ -21494,10 +22507,10 @@ endobj >> >> endobj -1529 0 obj +1596 0 obj << /Filter /FlateDecode -/Length 2165 +/Length 2162 >> stream xZ[o5~?bp=["H$!TH-(%^=^NZAl||3^&ߟ wf?NRx++~ӯt^hwS4„!NJ~{zs?(%,DlZSs"U()kAMC,"'HeanX @@ -21508,22 +22521,22 @@ x mɑ-v{3L܆Lh7flaCY2,2ؒdm:{[&;ɜܻ tmp1yc:BQ"f~ȵyUc;c]?[pt=wH1X 3Op?! yqno 47QсkDCH΀7MdLZ\~j=I4+!mʼ:NqřR{F2EIhƽ#(07(=s9TϧKͅ@XD;w?wD̏Yٚbjʚ+PC7GԔe-^EOJ(3d|-N K96LoK Gj|3с] FTv%Z9(FzߒΤ5v40jf\GqFb8:nxQa{XڹϜ4I8W,;Թl /Os"qa vnmV= mn?}"*@}Qb^ vN9E,`IK\6EE'7GuKFJ~_ F^v48Fn*OcEV2!\DMxI!Y3>cTaI%/AV&ԍ{QB#3F&_;}{jeu؍Vm6^yߍ79fm{zJm镑n)N}:ḙv)=D3>h Ƞ5"Qy*? n 5&o@(|'yP5+t T_Th1"lwe =ZP бF"r+>"0WL0I1:R&/_LWIy8/tb&ǐ0& ـP $-eÏ_-w/L/x +>}Qb^ vN9E,`IK\6EE'7GuKFJ~_ F^v48Fn*OcEV2!\DMxI!Y3>cTaI%/AV&ԍ{QB#3F&_;}{jeu؍Vm6^yߍ79fm{zJm镑n)N}:ḙv)=D3>h Ƞ5"Qy*? n 5&o@(|'yP5+t T_Th1"lwe =ZP бF"r+>"0WL0I1:R&/_L*<3Ah1cHl@]NԲ/Lٖ`W_ x6 endstream endobj -1530 0 obj +1597 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1529 0 R +/Contents 1596 0 R /Resources 4 0 R -/Annots [ 1531 0 R 1532 0 R 1533 0 R 1534 0 R ] +/Annots [ 1598 0 R 1599 0 R 1600 0 R 1601 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1531 0 obj +1598 0 obj << /Type /Annot /Subtype /Link @@ -21538,7 +22551,7 @@ endobj >> >> endobj -1532 0 obj +1599 0 obj << /Type /Annot /Subtype /Link @@ -21553,7 +22566,7 @@ endobj >> >> endobj -1533 0 obj +1600 0 obj << /Type /Annot /Subtype /Link @@ -21568,7 +22581,7 @@ endobj >> >> endobj -1534 0 obj +1601 0 obj << /Type /Annot /Subtype /Link @@ -21583,115 +22596,120 @@ endobj >> >> endobj -1535 0 obj +1602 0 obj << /Filter /FlateDecode -/Length 3967 +/Length 3964 >> stream -x]ێ#}WB~ ? @_?"[VK3j;Ўժb]yH(OVSx Ep;ח "$?&+l*cPQ(%gះC2"Hb8*p*~̓jPHMxP 3H(ǟQe~:_J?RZK7KH5]qx/3g]91qZ_La?4;&ZoYqO󽅮M*j7_ruA{iAz{PU}J~pJ)1/Eto%?|Kd0k &we -s[e" Ր퇜ڞs63T*xGtV荡4ufYsJ.%zrfRw1^ - 0GPJSRS(_PNv9Kayc)#_M7ni_IjcʭTfyM!L1ڢ PFkGD +x]ێ#}WB~}X;։#Y Evf՚wMUź,6Q_1A$+w,(D/DHNLVULǠPJjC#ÿ=dD2pTJkT;1%>3#&AfhQDQe~:oԟ)׉t$5]qx/3g]91qZ_La?4;&ZoYqO󽅮M*,T冘%3B -sI$gWX.O5jCu26xIMDuh8C!)8b.ZCJH%`{(mKmAJF~zIhd,9{H(M]tT -G8[ØN ̌<4w`)Uޏв&!PN4&m;M!*PކSKRgr>4E qVnTUF֌DTO2}"/u${,4g5yaX)TOL×no؎+#ys~=V+هӞc(\MwKՇ+8Te?ϽdhEJ)לGORy&r*>C&XC'`aې( 33VÞ;̴]L&za%@@.af5Eo$5E="q<ծ 6o&@!1urtYӶG'[W`L3+')v \72V4Ms} **uz7ԼjgJz^cx>h6:fu}6/mS}T.ߖZ~.O>>G݆K -}lpAڬp*˳ ST Fdwjhha(4DaUPp!mªhVt45cxOˌ=\VDzOkV*@9*`vTԡ*@~Uԁ*@~]u JƊ:gkEݒlwE:XQ=u# T:A)>N2٩Inf˹2=Uҍs605%_|[~^ X׳@е@ꙭ28MWeJ)y2rw}"a)^O$)tEgΥ2ضҳ.-d[*.VZ*Tk 26RSEw B -Q>W}|p A+}~p1} cy>(5Gm |`IRc&{/( }_h}P65Gaktܦʸ`= zsVqwª2= -ʸEaUjոA8OJJsFWm䪌#LU߯֞8Prva}lMB.B4JyqIйǙ7u(T YX)3g$JYlϜٻ[MJe2ӑIƹ鹳j4ǂr>w6}oagO<[XXnrOߢo&2G<ݎy6WcB\U4Y1"ljLnj\'OV{hEBc L]ny'9=:uYӍ}qYF7+\ral (CTWy bbgTI(7ZIDoRtQ޻e;g^Sf-Yc*Ykg$@WԵ4f(jضr.[C R]TfPYaHҐWP5l)t TϜ`ml-d ?VZ lvC=` -6Pyx؀ao@-@#ib2]QvvV몏iǣAU vFm!KvXnEp}E2}E,+ -}p3+Gm _I }/1~}Plp.<=Ep )՝@=Xc>Ưcy>(OA@΂ɪ1~ %G7)04y g8 I&/̛YL.oG}aOE5i|1rS +JMea-lJaN[TVe@IV98_Z*#e0ZTy&Kh\`j _@l>oS7w=nk̬FG23fRw\e2d'3 w'3y%~Gt<,i.d5Yeamuũ3fu >8o~g=ڧޓPb"΀ +n(%t]GbtSN>캮mX#Es| +8fKjh×5L4Ƹ<ԑMӜ8PcP>1_}Mc;\3&zXf>[L{PsmZ4-Uf0HďSydB>)_r=I ݫ*& `MioC4 X { +0R^t11ۆlÇrsMh + TƉ0[VtdۼP2ƌbɭeuOn5_:R6W"0 Ϭ"zk,rr ߬nX^Өw75] +(-L83SUMW끟GX-UۑծL$Ky4U/ăg!~.gb.ty8jkGc 206Wb$' +V"h7߾XY-8Ӥ;g +@V4t$g\NHO.c Ш7"=i}E}ZO:EnF2gd\@P;Dِ .ޮLq[V 3md$ Q ̥s4 m.: !]ioA-0vAPT\C3 .϶9Mݞ!%M5(M)Y46<[O/X}:*H@>\p?iv-M/5x]pEzfm+y>B>>o? >1ڼpM Qy~[j,&xL]lP%eF%EoVШ2[׺U&{Bdž= +oTZmnsӁӔ׌--3oJrZ1-YmE樨QQ檨VQguUԡ.(+@uKuh$cE]GtTԡo/gHP*7۬;aLN:do&N/^TI7Vd֔D.|aLu{`)^Bg8خ*@6]q(mUȰ![x= 9`^*[KϺTm ǺTZk Rc2ԇz@ڬKeTKe /1~}p Ay`p2q*Т3QXU% +8(*Ue* UX+룢 񦎁`0=(w}m|hid]L7iQgyެsFi>Vn-F Ծ:gUc;:OBztMNO'zb܎-۹8q&Nji3A gySOHGWe!^OΚBWg*]PtPAi3胰JۯW#a!^W$(EgΒ5ضKҳ-d+YV*YVꘫd 56kyض6:ovX6vYzâ.u;,ʇ (b+=(b)^_QY>j'Jz^cx>h6:fu}6/9( e&Oy.بtP /1~}p AyzaMaТ3QXmKV{أ{(â v,h"@9æD-Ym̱nǖ6זn[^@l[^@~][^P[^@[^d[^:g H=3$L[^3B}'EV^OOCd՛@ډcy +{ȥL?~c<ݰ]%{y#}i|>s[L2mxLQK9أ\_8 &ƄJ+> endobj -1537 0 obj +1604 0 obj << /Filter /FlateDecode -/Length 3819 +/Length 3815 >> stream -x]Kϯ? 6 ;rb avRdtN5U$av7b}$MqOZ0x|3;sHgA3gBpP)fRx|ˏ?}dd_\c -BŹ?}Oe'ộ> t$s=a*Oz,/4Ckgn8V.65GH&':/+z˃Jfs4~AJy=Чp+ --AX -TjT4.`sUksy ȘrJ}B >8G5)εT1BMTi^xxe0i+2nM,w3e\)!T`J:&U:XˤTŕkDm;Jj)3`S,uZ2 XYP/k濔9B8 _/ -:/Ea9BPyͥ o8+AN3wG 3mn%G7 ǯ'OS}9)K=]jAOVE#5)6Q[a[D}3ִaX0W-c3 :!pBv6t/\ L -5x l ?i-@oVͽa/ bLL҈i0Èy+5cFy Y=j:@b^=2D#,_^CX@h6P,:;XEq'8@;;NOhE }@no@fJ%K[yTޖ hd!#/%;W<$Qq>ʐyB^+A x>BeWS7qPPmN-_ &,&A#^:ɸ -k-TdX:պ>~Ώz?4Y]0nk/tc*7FwJOPO3pXOk8O70 'x'Pܧ=!T~Fm=&o=Zkukf'{75,ܧ5vܧ}"?S!:16%xhx^@ !kx!tNLzG{B#.[d~cqMnIӠ{h[f0-lƧU*yoRLKk%Sq˕7HD#޴M@.B0J#$JJN펵٣UY,JR -25Pz9#;A@gyQE]ϛ`g3; 1MND$Il 4CN5x޸vg'@8I6 u…HON@4/v@̎JsmCi𜧮UfKizϚwŲx|̿mNO9e=Ĝ`+RbθOc9%$SJd7{pmIMԺwMu"cA4NoAw82'ې ƚ &wiJ*GET7D 2uZm 8?Q[.(l]NCfKK -C+#Tvzh Pv|o"fp-nCZ43 -)461a?bZhu~[A=cԪ%Q8MkkI XЕ@n',@l"T-J {G%Pm'1XĀ2?6@[L9{ʴ@%w=1E@ו@{hbݑaywS0QyM`g0ΠQ֎)-Mn {]pQC'y(ܧ~,ܧpܧ Zi^e< m  l#3 -o6}k dʠnꎂDrƎ4z}pVXOgAy wS Zt:!-t0xG 6xL2!1 e1ƹ{0r,AKIo"I^ֽ/"IotBQLzy%wTz@w;t"MRk8 2yD֍JLz-NJu, Jx3$]@i|Jh3)ڸ~?9p@+!^++gŕs^n@A L=DcܳtF×Dd1Yͼ0&{a;Eރ̑h,]NWF7_{oEk@f`N -}W轈|' :)`v8%S M~=|-,8i=Ahpcr@F\B(ԐY^pLhMެX\r~"aHD Ad=uq" ku"A*;J%4wыCl(pi&|4Eb;eī! њsky<[\T1QT:,S -R(Q ҀQP)>sQ1:MÅs͈OM7:$hUS'VOPU~WCLj0n -C\ssE{)p"gA{fPz5Z~ɂ_n累 158mOIq-,JR7SZ\)@\(Ł _1e(q3c5&)e~4]#wAG#F il2H$Ƙ7"{\ۣ k}q +x]_ק(E +4!(bHP+Y\΍ .( D;s<:v[͇O*xTh-?9PJX.t=|s!&R߉|^qV‘5z$?=DytןT( ب4턟 ˜H{7}>O^gzc}0&_4{ҞePir?azY>\\x7!Aѝt |yMZףu4u!sxV-8/ΒRJMƅU }m;x][L9zA[\*Etn7RBx$o7CQ$BtH/ +L9߿?}9)eZYs)76-wBz}DWʓil+\KMs?U]fUHfVܳYU fxh(`̐A(pʔυ%+cB(l}of`ZWf]"oLp3Ɍ+F4~U0 + 'O- ܐqh`R& @8xyc`g\OW3ΨE&p~%zVrYl+Xńba5d" Up։ivߏ"#ڑuFB#^W$zwGqSm/'޸^:/V,4l̲C#V!RtY?R$GCZlP0Zm.Qΰ2MzMZ-eCl?2:4N㏸>ĎZz8O3?"!#{1/: +ݗ$`,î\2S$3 S@,|yq&hŦ5l(@/7W 6Zzƺ.Hm~(`r8 l0 \+Lz6:6>6}\yؾH[}@3c(PZ΀:hp]D=Ap0 }. h ۀp8~ +A^CPI-B)6xi?Wtx2A*X}_!_aZW& +clW} RAgD¤3 +[\eo>SC>׶+}>Xϴ0ϣ|papC]pXϔos@ c5>g~}>^=3 =p+.x)! FD ҩEg3GF; 2AB +fÈȏB(8ag\Z[.ly ߓIVpXJ6{˓ZD7V0$lDur1Lr9h)uƛ7[ϵ~)Y.Ԗӳ+PJSMiQ;' +cw}ȹ?d N!0fkC +b*jkQ`;$LNmJ3s& >hrwF|_TOuO Ӡuhhj S];E2ޥՅdH` 0rg+®$[x_)5]Kې&j&)'-<&#K1#fE.O+HӰy/L^`kzzx= +zY€C + `Z¨&g+ xTaׇz +}- .) `30`0\ܽJ1\r 0&fC € 輛ꀹ};뀹tB7uU}ppkc>qpGo,gZa{>0.{,gӳ-(mŔ; +3}7=SmlyotMu/tjtQH_$ +Iq($u/+x{eYlɹ[g֣^ꀑ[g):`&QA'O5# Lr Dq5t89 O7Ȏmf}+z@Iopg!4΢7]FIϥ mg\P,Ngdۍ+8!sF&nT `Gd ihR3RaPM ApꀀʓcTA%ֿILGL 1N:|Sů}TI#ⱼzVA䂈ʨ}H|pG_I=#͘EvW5i0iEp EZPXuPOEj (RA ABH*^tGs8Xz0>t9ʠх>ȵ=\OQenժ(:LsVZhC{ 2Cj'ji6fzn3i&)Wrq፞LD4/rCy}jwzl7r"}yN QbА?U]fqM7[2Rķ1[r e& &JL_mH2-JtQ}n6J]z4 ڲ̖M$CAu]O61ehAg6oy9ZrK{[M+=L+tMNkӴ\j\xxOTk7m[0E+iowVeF:(72(}<2!0-ekdKet-롼,ޠ6P?_{"uV! oTdp\5 tguIϙO,7!# ٣вY3> endobj -1539 0 obj +1606 0 obj << /Filter /FlateDecode -/Length 4218 +/Length 4215 >> stream -x]ˎW091dI?[ludwV H?LBBtΞt>yn~^ο]:sa~ ?t }7<||cesh΃f%g\Fly#E }@ g2-Y\#{]r(?> 3S[pE053 ZG>DGRK_H)kH+؄V!銌u.YKk>#?HcRf?`}N?WRJtuU\1Xu+{w&L Jݍ!CAڢ5ufwKImP:+ -Fkad-Ȧ Y;9p: .Ťp|ߣ GyLGm3 Ea|14z-{ܤ.=T>zYe>/'\ sŞLOD?&k1d@>ew KvX_젃^Qέ&Si`N[Rx%RiOXjಂSkI眰f6ÙgE5)ΨCY\FuFRԒ%sZ|Cleѕ#aYJAi(%ex ׊Ѿuypq^f36ZYӖ\\ͧ4} bW!f.32[vnȟjI;ͳԐ?-Z|<*n@i퐼˸UYz F)0yl|1tWQ2FdVlqtVR!u>{}nXxt&E$9Pع7c]%&uvK,\' 90Q'@:6!qelE*آ{t݇h}x*{Qݥ-2zmjhwdFox821FHo}Ku)u rUؒ^pjl r 9-\p#EmDA{x T}j>ɮ9#B貘(`m4.tl)һCHE]mZ'F:; r69o$wV#5; T q[lؠe x#+ hC9C[R:v'ZHo6S7/Xn eY -rv%kŦ&8Ho*8ʪP]PVm ?zJބFAbR7 s(Ba'l׻(;Pmpl1؁ѻ ;VCܖݰ-waF)pe1Nioxϱ^ۗ"y=%%;%+vda &,Nv桭E9- װ[" -Ho.e[b6(da=[6< -ԅ'[c'_U*Z<Λ! - -T5~wa5{a#XєC4|zWx) ޅE DkѠcK!-DBe/9h˽|jN#ٔ#*&$L׀`"PR1һTl[f!zw k,Nt쾅 -Az CaLR[Pjrl [[nwV#vvЖ{ɍT1oV< )P>*4B)<9ډP0E -C(e5BmٍPrl俺ת (NRId`v;(T`n;Tԁ!No [бJ]50ԇTPdJEnC[F* f`Hኛ}, LGڄTA[%J5$-ˬ0Yz(ZYz)$ZY - -0.٠9iڇV@% --V@zz rh-Vis{R6Fȼ*8z'X.z(One_Ǧ5;'z$<+IQ9zuJ?֘a0Kˠvc(1ze}MCCe7Xpn ?nDE^)n4~^[%CLD`G7Zj r(Uttl ̨LR{Q2jjr [{ow^#v|Ж;***%Xy.4곔Qy٢'}cA Ȳjб@ HOԬI5cQP`PѾԠ", -5kDA (]57nj Ԁ@ :uT&)P$ j݂&5 [vp#v5mW(k|ɝ5+V^ `4j@yA 1= cYԠi5b'jVA Ʊ,9n&PkX j2̹^fŞ,$5fL-C9P^ 5>P$j@A[pP=w &Ps-w -TҎ2 j֬i>Ԡ -*E=%Q?w}. b)9eZlb,earz7=ݡ\PՖ]9>jٱC*6mz.'忸3$ZC`0P xfPQio&f̖LM֒ޯ._sA" +x][~_/@M'}H>k;/Iqhmb--E͹_!I!{~WoO~*ߏQ ^|9C??~}>3xh:,H=sUIɹw?}?~g]"ʻOOV)dMA>/^O1ǼO HN>pw#{̼GZn:VylNhq2y>/L-:*c誯Y'n3/z,yeywow-iȒ%f b 4g!Fb(ʊ@~bjR OFX6 iǪ<V +6?LFF#'^8 + ;'1CO1!gŅmb9ر\aسb>0EhgFsv4S,??2zgc-ΦΣu'Mo).7\(!p[/ 1* =WR r*; ŕ/Cc[Fax.y?%|N;3oTC9%Ýּ.{OEne@5ihNs5Yqh̕p<7$ʒxDe^Tt]鹉Ƭq^yfLKK +|Y0ࢀ=[/j~ q0vQfPY[j~6yjߞSxNR}ybɫ9DZqj#)f/Lv01?F.(/rWbLEz~;,j]u$V/:U!:oZ5 +nP0Bfq 8Itʡf`r{׿{b0/ϸOYo%@,hIRzIMo,}!M hcJZYN憤+2 :d ,apc"eC9K r:\u[lhH*i!(VVs=ce} r,ݥOh3e2+v7 NVkһԙYڠtVG%Äp[2Mav6sBt\I>GfX5>r0ch꣕[I]<{;|t.E}^Ol9Ƌ=lLbj}@A[&Si`>*!uJN1h3/:ҟe>֒$%9arl3ϊjRQŝQq2$ѳ:ꪍ c%wG9K4 +ͅ,%ˬ+m%FF* +w -1QK܍}`(fmP-9O5izŮC\]{gd0Bܐ?-dwgO!Z2xT#!yq"9pϧ Rk7aL)+ bfdɬ3:CKx^+lte*$5FFd:QIIʙҳnobwл{s6^ +yZKϚvC}@wW͕ R:2KlR0 _e3 dƺ;~vg7j_uleuUn= +2U/9c]%4ѷn+|ux̪\ *LL6wSYHP}?s4w9r4=%ը]ʃG`cK`HoS5X32xiɅ:LVkλ~][:"aә r @>bu- +i:ڑ.p$jF۠2dB %`u6[G>GuG'QeݑM~.d} -y֥HE6ȭ.t;jT2gbKJz8f˝T^si8O3R5u 'b怎W;b֯[PȢꂵрбPHZ!زukgD\B\漍Yю".PR1+NT.ѳa%V$/ mUt,KEr؝hkAw qL`ɻP.e)*Te5*ʪG\0ʪR -ʪv(B#vmBY"&)U{w?bEH4̡4M_bȢ@;`F&X !;p[vÎc܅`;>zn_P +2\zؑ%r;Z;0^" +:vla( ~oa۠L"nb(RF@z[Blwמ|Uh8o,욲+Pzr݅+5{\4b FSP^aD㵦,bzR@% D-h@zz Ds-V):Eη_GgSDBƛ<0E_Y#`@I HS]"ZFZ:lٚr؇X1+aбZ*hG, 2ImeCe&l>-:nme-[َصs+A[$7*S+Ǽ[H:2 Bkdht~Dj'BXA(6Z[ `n""e7B9f]^w/[ w:J%RJ^ځRVȢLR9ѻXR!FS{0.; +C5lBC*u] +װ(SRw@eA*MHG-nq0"+n,0kR CmS((_,´fhe@he*+V¸DgziZY@+6 +:ZB+!$[C+[+u]KYT!l ^g bK,z/ǂe PkԠcKYj5 Ǣ-$}AE5Y +E j쉂Pr1Pһ +jn\R955tl)P5LRIԈ5Mnj@z@n5G jr@=P;jVh>ԀJ +Wcz3+A ƲAj@ FOԬHcYPsM#>NA +d2s95@͊=YPI.j0zWAf7Zj5rP-j0z}I Ԁ2Iiࠦ-z@ F&M]{A1[el'=ԬYyP|A5Tȇy>|e`=$ձƢpX ѱ6nm _!1-{7WB9 kׇJ"RH?!&;] +J*v*H&LkGֶZkk(R` וYH@rz`[@k0:QHoS8`T[x6`KX%?@4Ur G5Hb4!W+ ֲrţPA>3E7feћ7$ s + eOYCh=@OY1ȝkX*ɨ{畉jRLQi?r)vɃC2iY?zJ~y\V˿b)9eZlb,earz7ݡPՖgel(۴UN\ZBJҟqL1fTk>gk%`,̠5+Ls-tg%ٽ_G].Y endstream endobj -1540 0 obj +1607 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1539 0 R +/Contents 1606 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1541 0 obj +1608 0 obj << /Filter /FlateDecode /Length 4106 @@ -21714,24 +22732,24 @@ T fPІNl~9^?93<7@z&1~W[+Q!ʀ"Azkp[v!Xkcp:D+=CjW\3TotH:iP|xQ@1,ÞdBu3;O]СU}#$z@}Щ <y6]դ5<'xu5>ɟZ+O-}4h3rO5h+4PnM4TW/4h+6h4 _ B v (f hC:eޠa[SPT{~ ݾ*11GH_snB%gN,9CaZr]r6GszHm%gl}%g ͖l]eKP~^ƒb"juKZל-:'1[-7$$ȡ)Xd cɎ?f2LAt^YYnS ʩ'N@~ec; g6ɢ[lԂ#7rg1N׺l;,2a׶N繣a8q$!0Ap ĩE]euHǻ`Y3BM()C~w;iLt`cqF.م06* )|*|c޲C9jbd)f;WDP);v~ߝ0}/`ǝxAh15{KQ(~Vñl;a~ l{aJq˖V&gV*q7;>z{ۆ6MeFr Tw ʲYw nsyyNE=Lae99YIj/bفElqiq%jC74a[c>8m\xBn~wY9d8,c@Uٲ?'qZ®j%oyZ5֛ōm;I,8QZ^QbkuՑ#.I2dLo̵@>Z-Ij]wvfd}tb RNuO=VuSymKwڄ?ۄjAY6ka7kΛ6 ͚p_&B&fM8*VM8jCgp Mx/rTɦMr&ݴ q6oAMp&ݪ ?V7kQ+kՄ7wRքfM8XuNQ^z!Uؐm}'RHW],y爵G8gꇏ^> 6͓dZuA0}݄Np~o.?oRe]O[}5DԱۨ|'۟>>!> endobj -1543 0 obj +1610 0 obj << /Filter /FlateDecode -/Length 3011 +/Length 3008 >> stream x[[$~_k%]aHHlX'MЗiMXCTH%ը'KvutJ+~-s[Oά'Q?`ZZs)G+KAǟ_?u[rn= @@ -21745,22 +22763,22 @@ x RGj<.֪^[B]q)ץE{Jt0L(%&JUe,#ۺHEF )j3% bzdM"ca[̀ݺM3YGjfǑl:J#@@VF ˵QhG)W춒ScE.8ܻ]C PȢۈv"^~u\MN\U|{;v;LIӎDwѠxO@꙽],Q;Wv@3$sh]`>^vΆA7؛Њ=E̊}Т \zdUpn7>!J.N EwlSTU V8tPU鞲Y(lʘnƦp>etnv*VEmIzaFuBR7kѸóo!vw% J=H׷F1i!V5;7 &Sei+I)v) 8J,q<жZѶVMy!oikfmDec'{K?ae.7YQXG,&ItӜMFsf(eUn8x}}D8moP&2w&@ʛ5C; yP%‰ naxA6 xk7J}5J2_l$6ry^xUlY=QRYg㿀R[цA~?3 :YB"ڈYkӂ@ȡ)jKTQu9W#L g}8b0kIXT8?̒2l/z))3cx"vGg.17V3 xѣM;N!:n/z_I!i:^(8&H-ͥX^E{H3pZ AL7*Ӫ]^h4F΍҇pQʬ#ukp/]O.FHlf%1}łsi}I8}2Út<$af}G̛]>;db>t,Sh E.ޫ 0XUUP~{ՠ4=LaG<(<;qQaw HÄ0IB݁to:  ,Pƒ/g.KML c uh$X !n``96F;X4MI}66**4dnr jUZ) ?wxzwDC`yoBt>"H:ᘦ(r8o46+`*̯q 4'y -`q8/hibrgN73 f-pge m@Y1/1G\f4fKwut{jTc,Gz`m/Fc"%PO')f'o;OBϻO4cÖw> endobj -1545 0 obj +1612 0 obj << /Type /Annot /Subtype /Link @@ -21775,7 +22793,7 @@ endobj >> >> endobj -1546 0 obj +1613 0 obj << /Type /Annot /Subtype /Link @@ -21790,7 +22808,7 @@ endobj >> >> endobj -1547 0 obj +1614 0 obj << /Type /Annot /Subtype /Link @@ -21805,46 +22823,43 @@ endobj >> >> endobj -1548 0 obj +1615 0 obj << /Filter /FlateDecode -/Length 2783 +/Length 2780 >> stream -x]n#}We,^.0I8 ȃYN?b7-˞MZ5v VUTݔ$EG*;? -p)#t 6VZYן<UAÑŔ||ϯ?;ǟwxAga8G+BN& 5"U41:w|x,d(|E9`ךŌ5?qtɔsCy=U79n\9bx%/Go7/?1Ru- YZ}*zpz;c*bڹvx2F\L ӄ#1qb9_YOǫ^6egrv{, +~b'N!ie"pq?NŸkܧp\ف\"0f5 {yxR6$8pQ0]ch]r,LX. ="p:2fҤ8S_&Od?Zĭ2DEBݶh$)uJaدr)U1I?M:¨>!8,A*ED蓣Ii=R\W_v| zǷǮ :<*c/L{zKI=T#ճVqw|ZI; V= ˞&jtN q)_sO1ni9heg Nҏl$-;](]6_HEjT6+TϲEE4Lnvb/+ -+6^3S|.3AsuZ.ƱedFRWlC݃wbQy#d@p^bsnى=ϼ䱥հrF6|˺5 @H9`m RtZ)mF5P~cЊ OQz؅0)ۼ ݍI&&66ݲ; yźe@5|o=ƠMa/ߜp/T yr(eq[7/Tdet#;6ܦ!; --,oLvbrNELfk1_J8g +w B{H"ېe<GnDZiPH -=UiWvЮbӥ-7|D8.ߝ ݫQ<﷍@!~ -'A(Rq0v,)(ĖVэʭQ0zݐH_{nƶV6u/țD)&~g;r^d￲͇qmE֡j';tg1ٍ\ݷ'5acjBlش7z!~j -Pw(^7 -i'<}d#nlkPX\mC4Qajz\GAl2iڊ i j _GLݵc.D* '״ 2P@-([zBatTEUWFu#=ee#=F҃^q@a"{J*%w2 ~-Ɩ LeHx8ѳeHU0!t+qmERn8o՟kev`jݫuHl'nZĂBli@BatڲSP8n u@!~GHz}(^d0M7<ߘ Ğ([u@aMR?AQʫo;EQ ￷~o S,$'O 1X(jdN(cGcPL!ؤc)r8RXΎJ>9:.En%? ~mχે~|z +/3~1´W}*/awC92Z=kwǧOԿspaӰiVN'/*{?14枆3V(x.$+()'0- sEK$%ln# CWK$JfE]"e,ēEU9uEɻ\dؤ0`.Hö7. R!Y*ppTd42"jJ^Ēr˓KӉ*r. ++8+- Rc'2z!CA2{ɈGFԬdaI+j:T360!UNʹ YܴZ-[Val#hU;*zIO0LP1%%T\& +Ӌ)@6W%)T1,=&1&l^Cy[ vYO0 ĖѯBXMʖ+&Blڰ Blj0 ,鞺*0:=VnɎB>2G[MTlFѳ}+iڱ¸"mw.76בEoqw혇{ QJ5m}L'bKV=nkPX?7UQDnQdVd"U ͷo@b)Zb +K FWĢ) z=Ӧ?#+%Cq;i|l?Qp‡cr̉aV endstream endobj -1549 0 obj +1616 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1548 0 R +/Contents 1615 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1550 0 obj +1617 0 obj << /Filter /FlateDecode -/Length 2284 +/Length 2283 >> stream x\7+˰H  $]L=Ȟ\IHM&BFHbX*$>A/2)e|ywdտ鎫ד#s&D)!kVο9˩|_7b$99grL\sy{2G4Z=hz?NlY H6ޝo3`{]zr=?/2ޫcߕnϲ}way2[]Y{]1~uX-egֆV'3K=Y,5.R!a$l ֎5A -H|rzrm29ձ]dcee#|tݎP0dVPArW -uKT 0rȋGr_8='֜ +H|rzrm29ձ]dceR}ud +[ +j HJ.Vyx:0rȋGr_8=v?@ endstream endobj -1551 0 obj +1618 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1550 0 R +/Contents 1617 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1552 0 obj +1619 0 obj << /Filter /FlateDecode -/Length 3887 +/Length 3885 >> stream -x]K#W0 6v։ ;:H_~H+hiQ'?Ŗ -zE.蝹~|[A?痋Vyw3!^NJ4]ԺFk᯿|志}u_T2`S yM|$;q"4}Q诟.rNIB0W?~7?}DO%Q>\tJ!${ --y[GObۦO w|~t6}άcGIO|Qj\O{fiN<=ώ̿E :?CSkA_ <6O#Ͻb|ڇ\?}ܵ"RxgNߑQ厒7\^[zb,5i7=W m=/Y0<Ɇn/uNM=E|3zXڥN&zGZ,<-#,=,Șl^Hy .tL1!1 sge_8k#l etr:g ?6%uUtl8)x/d{n PhļBSO;J/'<8[5lޘdy3ONG]{f4Oӫ҃R.^NKS$iW= 2mG: NAh*3~PvvS?~zU7Y~:J1їE7>J!q袣}\ _"p f^Лbr y.f=E>!oS뉆#^;"<ĂY!(7TbSʑIJZhN恤 2$M -0 ̙4)pG$sOxeibܐs -ӌ1Fz 1R: VfVbɚ(;c/03]WMDVb3\:w/cmGWsʧ iXnDkklp]$誋>`皈9^Ոaɀ}шS0rA!^hZ9 Iy67>v:oUNbru]Zn5g.i.h+yDŔ)IGaڟIuJW!}`MKF1 uQmFբ)|osM܁6Aڨ`*Q5㓹L4)YOOH"zz -Zh)q}XmlƝVSi1$7yeX_99_"rvTd޶6+j+|ď&B4}~Shhb(m)\VY$3'E9V+j/X Ouk]4g;ND# iw-=SxޟIN9zSfo,tȜ5&$ M6]kk(E-hfh AڂdZmT{h[Ehrm\KrCI͑2(JTHOq IG3DDHAbC 8XQb)>~w#2y1̴'&i.!j܎jgXC}%0Ͷ9 w.0cf^0k 4oG 1z  c3`>E>̠oGɖlM~0/ȝ ̘W̠3H/ nV<;e -@u@F@M⺭2R@Rgg?vFYs;MIZ~OwnLvѫnz̀gsJH8x30VwNbZw3|XEV73F"vTzӆn荗䪗j<*dQV$4fVUڶW4Dł|h-`_8eE!ў -L՜ -(jpŦ(I@doSp.di>hu@R%54IQb"wEgrQݶڼ\+TYB*XR?lj$#q}yګ.e D?LF.XC@ԭQ(޾x~6^=;2О@Â| U0[4.;#9EZ3a;^;"gAz/5q@3șkYPU`@2v۱M\D%OKೂ& -e0 >^Vm| vGim xd&nKA>gx1HЋ6ix#8s=%̻@ MTJ/ȿch: Az A``w3<` 8c -|g::^41zu0Z̃+yjYw6EGYPKOjKЩ-uOgK%U'm Nwd;vpOk8 xa:+z>}o3 ,ɿ4j4ҫPPzM4t릂hYOQǧOlK֠i캩 C9ъ*]2rN8eh;Wr:0inۣmGQr:>E@4;BLR:q}@w-O>m[߃vl( ڧDHSΌd`2v*O-ZԣܶHvƷ_ Ŷ0a (}E;%ޅ53nj|z~D[wE( A;|pm?F7bmTE̼ZAZHw^D!08 `CPIׂ|lѠ(- jYZWDZ5$H STd{ZwqA5nui|GUK<{JС1ˡn{ħEUjz03G߲F,Cz:5tV(^ -@h/F]WUVV>.g>aUFyQҫkΐ@zS ^:hk킓y$t34M?C+ig)w;4ET Y fhZ]4]tM1ڡ)F!GS^r4Xb4EӠI6́3zDSLY.YyG -Uɺ'`Et9mJ p^%)F^En^ac,@]+YK%1 Sڢd9# JϪs/A:# ]mz{*7#9D1*߃Ͻn.sUA qr24f@>ɨa 9L}Om|5k:glz}5J Pp,(qe!p@z6l&4jź ۼp;K`rčHMo]0`Zsg4ЬWUZA,JbpCiU Hm݈{ _=|m:=dal/g,^_-@o_zVߌF>!=L8F$L9nuigzxtYDh \!q YJ$01!BK5hKǠ 9 "R- sT!!q4??<ץyI.i,r  +x]Ɏ$W8}9䃌-Fd`̍KU?&:h5]d| Y*/ Fv!DEt +׷X\|ʻk4 Ax2tR +֝5Z ˿.}ԝRM-5'ى/3зuA"'A *c~|wǫLT_ H0KBBzu"mjw0~ƎoCZ'=G}_Vz<^?ҜxL}鱭}'>z3ߟE :?C)/R^1ڇ\?}ܵ"RxgNߑQ厒7\^[zb,5i7W m=/Y0<Ɇn/uNO|&oអG|\CR'OW-ʖX dH|6f/`S@מg>G>''uy0>NtN)KSoc)_bֶ#\uq}ۅ] t4w?(|w*,sRz]}ˢvએRdDh%躹nWD\l$-)/bj*KYOrxza׎<}$:# w(+oJ荦J,pR9r:t@I nsc6_$]+!'Zץ}Vc6R梉VG/TLt)lZDpbؔlD(^PjD(:~P-rP9˷M;qRi-DՌO21ҤTg==)"zHW?:@K_jc<ֿl4N|퍩%+-a"YW\1; ~4*](ڈFGF1m MᲷ:* 9v(ȱZT{W% }ͭ+?X#!8Ѹu&8q0lHk Or!Л2|+`M[eħ-GQ5&ihQ\ m_3@)mA4C[$ +m C:-B[hu$>'ZHjlAIeUꈥ@zʌlL\P$"B +gZxR|(KC?=;9ȋa]t<1Is Qv/P;>ò|-9m4s0c^3`}; + fkg#f)1`x;̠Ofk: syA\`$m:` Azip)ST,}Ҭj>5jm%фȯj8C>+t'v)mM3 iJژ{ w.pcn^pk =SSMGU)HsR +3ƺ.-\} +9!5\uG6p+|Go<'W$WQ!;m$1g1;mֶ${/,@nYͰ‘-+ +4Ud*T@T{ǽ(6E9m]eM:"c|#uy KACx*15ԤI{.>[=Z9Pڼ갧U1ŒAfS7 ,}wV.JǩY2^3^u/[ q`4ZwJn'Biaj3W;Jn7op#c7wK%\z<Ë9D^\iL/^ΐǡ=fG>:iKpx=#ٴ{Zi Yԫ{i`I]Pͦ^4Z4kRϠ[7dGz*筎z<>|g[H{̨gMϑVT蒑[u:)E?ӁI䏝%tm[?^(:ڦNdZ(jw9E%t('7}zh,ȷ(}i `ϵc.EYO>0'GJrf$Sl I VyjѢ5D3m8\`,= k@+w.a.a/_v_vV ںK,Ba liH7m-*-Zdm"2B"nQYVN\dKvEiIPҒ $jժ%Azf"Slֲ c_vKs?gPZr٫P-Yu#>=(VӃI_5jf҃|ש};@ɔRB|4ꊽ +UYvQ? 2:ȋ*^Sv|,қjxA[kd '雦|iZ)Lӯ/8M1ۡ)J4ɔ24i4C2颋hqM1z 8bzϔ)MzwS%dr) ʇ_*PJ=.kiUON*ѕeGNeG0z*Rw +dZAZ-@'MHn%QVP{e AjsWϑ/'Q~Uul=us/ȝ*bK74CؼgOF kfa:C o|h䫙X9dnjaWżdA+9;a7Q+mHm6Y%nDjnP W *;f ԪbxP%UJJ @zoAKB??ϟ~dal/g,^_-@o_zVߌF>!J8F$L9nuiWzxztYDh \!q YJ$01#Rf`\`ХcЄ~`f 9*}8Xtҟ> endobj -1554 0 obj +1621 0 obj << /Filter /FlateDecode -/Length 3066 +/Length 3061 >> stream x]Iׯ?s`$@Cuʹ/3 )>j~9xrUk[EZ\9Aା޿]~p tzQ`נ^pu3!TS)fR]r?x 9ΝwW!dFMc"=%=}_i 6혂:*Ob6,V!kca!JyMJSBI $٢ !Nk&Diir.r穆ϝ(3SPtE\)Z=ր$U.ӀFynB׷ցI)jҧ(" 3Iwy 9c@ ڴp8* x"u3KI| z+R'5(Ucw5SQJ'wb pYtֶ U ɏ̑|ocz#HaPD=vK;jMB L|]ع5J%cG΁b5Ҍϱ bonOc]HSYҜUf"_ss%Li<5+Tvu ~k~m^~QTlڽ CyrFi~ M[&D9:ˣ-#~Y]"Ao%{ԱG,F7xܣhsG6;#Y3yQWRkHd~Ng~&"Qeob7rR]a~_װmozL$(צɝ/ϓuĆ jP,[mo =&rTtpg/LXʹK\ r> 95 pޏ,ij,DvMlRQB˴ʗcC;cDFѴҰ0f%}+$sq@Kwq[xO tKJ' B% ^R-V,[+bFJljgw6kO9,ӶcpČ[\[ٗ0.m\zoe rIJaC^2)Ȭ;>8Wʚ^ bzz +)gWzԕn{]A܁T!(Y]y.!?43!ltHs`Cd`JJ?(vV{-VwD :[u7^;/s%z *g|:TkBLZTᨩ:y,ox3 ZT%wֳ zܓx'QitgI )گ칈!6-@`O NoZwm-zFyݻK` =:PyJ*חzCe]|)? >ӶcpČ'q>A#&l|xej +)2NΕ&-}lz endstream endobj -1555 0 obj +1622 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1554 0 R +/Contents 1621 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1556 0 obj +1623 0 obj << /Filter /FlateDecode -/Length 3180 +/Length 3176 >> stream x\Kﯘ,  $@l@N$cA#/V9H"lrgr.F;fՃI D;s|| CW|}z^hwh B,EtxݜofGo 3 Hk#*h^B҉wh`C>!Jeˏ*: YoCP,H#C(i4@, SSx4۬hQCdVZ3JS}\JT{{s/]{3 Qx0dȰ&>GdthHhWsPA@.랪:|02QwZMFO3hT >NWƔ77ad yF øcq G;2h*;̩}Fkm3~޷6Z,yE&y*]\#py{uL8 cۊ 26O/փbxX=Fst,.Aa9/s^.]QzC˃f{aCf>bCڑSQuŠsxy%N8Q_o/;1>k7XܣˇW\Ksc|S Nbi{$;[5ϡxնNgͺbfMZ1TИ ׺"F%223Q>"Bwu v6},> endobj -1558 0 obj +1625 0 obj << /Filter /FlateDecode -/Length 3022 +/Length 3021 >> stream xKU,XadIrH0yAnx/3v%R^E{F=zQlu;Ex=_~>I ;b'ht`^pFRRj4F5F/sc0DgPO.JO=HP/*:tHA]A?|:lazFޞ?};}?xVQ|&`葌zҿnl7_W~^<>Sk:}?e]۝󧏫Redc>XI٠kjS ySPXkةNVu@<mDz|_ϊĿcGmjwQ[Lg0PEKt΢;{-ϕKt>ҷ8;RC`їb]8l,ie\.CxpL)xK; bw2) P){#S.&'Znrt~`|aq^; @@ -21996,24 +23016,25 @@ RR WMXI|,9U)K2-oƒLyۙ͒K/U$Sf,νc, t Krn5Z5Q5,TKSܾ[$S^ fIMY"5,\KrMhĒ~Bd}%>1,}_Kbt(;ƙkI#FFC}ez,'}`\>.qTð˕unxL;Wk8^;8`q)x9Ǐ=nbp0LD#CZ*N/uBAG`L{(iC%^d|gr0~5_5lȏ% +0U*hl(܁Pf{c^zxEmLQ~cQ@ '&UօXEEuͶ3x>Tð˕unxL;Wk8^;8`q)x9Ǐ=nbp0Lo +iI4l#0q&SQAIWO4!ѿ/2N3q96. endstream endobj -1559 0 obj +1626 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1558 0 R +/Contents 1625 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1560 0 obj +1627 0 obj << /Filter /FlateDecode -/Length 2382 +/Length 2380 >> stream xZˎ+rH `r$")RLne,ԩ75f\tJ'5cYX>p|Xe-X0JL׈.|ePyUy.>pd>i`f0wuLYCZO™-3'_篻artdj.¹Bw e86=noح )oZޜw a߶R~郧F715[cLv'Z3\Ż0ZKHdrC+}̿U3MX>0< +2>h`-T`TZzЊA${sIQ% w%{܀Y@Qg?l06D&YAPs1g_C@jw(`B. fe;E֝Bw;>Rc +$;?`SMQ`uG3`HЕxRG ~D>5f\tJ'5cYX>p|Xe-X0JL׈.|ePyUy.>pd>i`f0wuLYCZO™-3'_篻artdj.¹Bw e86=noح )oZޜw a߶R~郧F715[cLv'Z3\Ż0ZKHdrC+}̿U3MX>0< +2>h`-T`TZzЊA${sIQ% w%{܀Y@Qg?l0.DްD!z5һ|s0!3w@2zI"N[;R endstream endobj -1561 0 obj +1628 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1560 0 R +/Contents 1627 0 R /Resources 4 0 R -/Annots [ 1562 0 R 1563 0 R 1564 0 R ] +/Annots [ 1629 0 R 1630 0 R 1631 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1562 0 obj +1629 0 obj << /Type /Annot /Subtype /Link @@ -22053,7 +23074,7 @@ endobj >> >> endobj -1563 0 obj +1630 0 obj << /Type /Annot /Subtype /Link @@ -22068,7 +23089,7 @@ endobj >> >> endobj -1564 0 obj +1631 0 obj << /Type /Annot /Subtype /Link @@ -22083,38 +23104,38 @@ endobj >> >> endobj -1565 0 obj +1632 0 obj << /Filter /FlateDecode -/Length 2830 +/Length 2827 >> stream -x[K賁Ȥ$@|s ȡBR,cfǛnd*I^Ex-E,Έƿ_/-.kЋ^pu/RUŃJ-F+%/]yI'*.FMB^o?]E\7ڶj.R*1r*6mT&p -H&ܣբ]>g_ˌn7%DO/pqb&K1Es.^9x?wM;ܭE|şfKpK!ݺ5,K -{~|o__e"hM+x^~xb} -}<0qSO]Kwqۮ׹r.ח5۾=Q}ts|]t}u|̴kտFOkG!z~o6mć!u -$üw($?j=ZnZO -&y z4Fq|dMX;),_ -D w=MD=mHW[6V㖛"mϺnnp|deM"\i:*ͺvd>XtnGHciߌ,U*eMU,Fx6EfbF4e;Co`+t(x!Kr$:wj ף':%U 5WRb#%ZdWʀEu/Bȣgdΐ%ɚ,F(TmO2=U`X= ٨7=犌 [G9&LīP%hB cot\(:tf}53vzt5!Vh!9Վ1aYggq?;LLijY=K="PapC -I-'z 0m׬50M` gP􃽇uE]a9/z)BHNބWVUVX 7*se\yd1hG"-"]J(WB> wD`b5v,jaw/[Qt.l`K4n[m=Wn>?N-/P5sN,m!5&(AYԮȕA{4h;^.<:(.TFE lT+j) -ۅuPGyNp-K6K'-}#V׉Tr®^zgSrnwءBؔFg8(G/wy~ΛtvHv^lT1|{j*4>2Y9TVbW;QR(AX8#h]Gk^^.o%ABVJy+3ėP["Z7Av8;,Lf]@#bÖQD-\j&tuõ2ڞ{`V%Iy5bk#2<+ĵc 6g^evܼe]z)3xK`c"bӏ &1lXA} X|zk4mCח-*NW^ZL}n +x[ˎ,5Wi;Z%HX R`fQUMN>36tޮʇ8)"MY}:|3"+/7'&9I{/}8;')ŬA&oO;-&',`-s,8YӵҜ_t/hx|Y2.]cխa{g0D'~ˮ֣ExEDyZT$Q<]#@tsJf"{zFQλ&6+-qUBgOW^W83伏&G`Dn4f Ja2Zb, !2ǴƁk +)N6[r, /ʊhj4 z Ẻ|x׾'$=CWFx'ZWQyOG#%5aӮN(Yqg0 QfOx : 9iASQu΋0Uۮ2Mَ,PX +5r@mo$jI,bE/Bd ,v7{IFB 9ƇhrONY0`Q +Pro%#dAI$"!lGAscLbKsAVvOB6lFV~wsa"#!-0™[B8DŽ,}6.Do .}zk<&O9Dӛ:1UǛ dGZfP#WӠm{λT`jC%)'%S/ fk!+(Pώc_oA]!屝:RB/l91nD=-夜6;#pv] 9* p^/7y~t6Hv\lb28)-F-=T i83 g8| 5r&6#ZP(^Q?pG$;;)`C15lT_K: Z"V.` g:/696G5 +Q:lwv! fh@=bvÖVD)v\jt5õ<cV)Iy6lk#oR}j؝CoM +'G=;a(|;S~lB)5i DS#8c6*4< 59,vCȐ7;+GmB:#v۬<􊴗?xu"*_M;Hx]v䞄RK6<#tiEEyG +gʘ(1) 4 endstream endobj -1566 0 obj +1633 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1565 0 R +/Contents 1632 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1567 0 obj +1634 0 obj << /Filter /FlateDecode /Length 2190 @@ -22127,22 +23148,22 @@ x GC ޙ1dA3:g+f%RD`T:hzň]~`6;@a21\H⁳h,U{Jo8V"]+k'mX2@ &udT 3 q!,?4+sΧZY6Q]m$]׋dwin<+bmi2t\@ՂL\)F32p- -y/qTZx~%8)4_y;h {cMKS wbroTj*n"9! Isa$iF…=(XR!E"' MSYQ\i?0  Gt Ic("z5GhI941jJny!iQ'"TϙZ)1!(w"}i9%$`܋ӫ 4\B7!-SRBaRssBd6@- =/V;wrZiF s3K ['7r RAʣ ,oyw`p `;2*<Q*W42c魍}AIB)/xI騹qkg3{X~t1MW;^MyH)aAS|wJPg+IVo0e]:|TOV]x*3%Y48_QA &zhn#0Bvz ^R:esmH~MVd܃sZ:Z>" +y/qTZx~%8)4_y;h {cMKS wbroTj*n"9! Isa$iF…=(XR!E"' MSYQ\i?0  Gt Ic("z5GhI941jJny!iQ'"TϙZ)1!(w"}i9%$`܋ӫ 4\B7!-SRBaRssBd6@- =/V;wrZiF s3K ['7r RAʣ ,oyw`p `;2*<Q*W42c魍}AIB)/xI騹qkg3{X~t1MW;^MyH)aAS|wJPg+IVo0e]:|TOV]x*3$̤ =[nS!;=f/)96$&+Sw-H-Xav?+0 endstream endobj -1568 0 obj +1635 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1567 0 R +/Contents 1634 0 R /Resources 4 0 R -/Annots [ 1569 0 R 1570 0 R 1571 0 R ] +/Annots [ 1636 0 R 1637 0 R 1638 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1569 0 obj +1636 0 obj << /Type /Annot /Subtype /Link @@ -22157,7 +23178,7 @@ endobj >> >> endobj -1570 0 obj +1637 0 obj << /Type /Annot /Subtype /Link @@ -22172,7 +23193,7 @@ endobj >> >> endobj -1571 0 obj +1638 0 obj << /Type /Annot /Subtype /Link @@ -22187,40 +23208,37 @@ endobj >> >> endobj -1572 0 obj +1639 0 obj << /Filter /FlateDecode -/Length 3263 +/Length 3261 >> stream -x\K$ z? $u.lAf_f@XH`g8}"YU -VSzv"EpeK'b -TJImhpt|HF)C WN%䡮^~xUB^ N4jc>R8V" 3GdQh/ǫΧ'*.?ҤՁϯ|Gwsۭovg[rš?fY0tf -;3H% -]H!b+0wf1H4u6eDT|`Kkwv%R79i9ɘS8no 6AZ%3Fx ^c_b1W ^o﫿[P,+ci0fhgrYu`yPi_#u֊X*pN4&<*87>cqotdsGdFc)?=19k1pw X ~],H -1AD nӭ-V[G%:8I -ehoԾ.^9 Ce*lgp+4ؔ}od6 -PkF$3vr->d!: ^hmj ǝ1ݰ;1ɰDηu˿ff:Ύ1s,f_dLLe$f>@}ə͐Ii:h_ 6$ OOA{nOĥ DNMGAr#tLP?$NU^Ii_{7 N7L''Bpj|18եw#. _{7%/TZa*x%O?*+Bhɫ [YZO&xZ{:‹27bYeьt]L,6_:wN25},B -Cfd6¬G5?;:׆GhZ60i5qKmo^E +Çs[(} rT,45@ߧ!}wV5F*| +x\K$ z? $u.lAf_f@XH`v9}"YU +VSzv"Epe"|v1AtdQt * +6`4F8k ure:>$#!RZ nP_/?*!'O~1d)~|Q+#R2c凿?UMo?HiKRӁ?oo~~ l/[ ߎ9.ζKݥ85:v??Lavf:K8 :jBĘ ܙ]  $" =8 QY/?_X|0-YII|*ِv{[W9҂-1chGz=Ì\ߗ|^nCd?3C*G o< ţfցQBy~Y+rc(í:㪚!ǽё-SC@G/lSLjÕ88#r`Y bARoi[[D]3ONK"tpUqN_Fr5 }]r𢶿 Ce*lgp+4ؔ}od6 +PkF$3vr->d!: ^hmj ǝ1ݰ;1ɰDηu˿ff:Ύ1s,f_dLLe$f>B}ə͐Ii:h_ 6$ OOA{nOĥ DNMGAr#tLP?$NU^Ii_{7 N7L''Bpj|18եw#. _{7%/TZa*x%O?*+Bhɫ [YZO&xZ{:‹27b]eьt]L,6_:wN25},B +Cfd6¬G5;:4 l`"Ok~8Tn} T"@jxW̑Ňl_P21dXivkȯ!}wV5F*| yZDHyL$3t̷KWcS/|ۅ㪸yRf-PN:׌سd0PŇxuxuh?nDڍ{» s9:pgW9*TA^ \Eb, ?s {5˂J3e >%w+ 9?82J8*/A0#Tl{JbД./C >༧t{ IdV>-Ӥ2:Ẕ -iqZ`{]E8TEZd K'q|@H~faQe8 ] J {OyȬ }ZMe J| 89̃-)f(^-~΃S%8 Y [{Pb }Z7u{[Ȭ }Z$Je [ ٔJan.4zn[coOxHrA 1vMnGA4($P~ϱ-It{wܵ=Lc9A#?oczHg ltf`TX@%}dpwg v<]$R"|ġ6$/٭6cc1d V'XcՈ6hU_a$lnEeQŇx V2gqqFݨW/ѾFv@)`#3|*fi>^ѧz{3[mVx'CH*/Ai0ATVsP-e8 ]|P!^z6Ȭ }ZMet/-<ĭtն}.?B{߉Y3AAnp;Kv%5*/AMUbt'K }Z7TՒ%;MdV>-Ӥ2P%6K] * 3=ں-fRf}`R۫Eݯ[yPb}R&7u{[LOt&pnyAuKO46u{[Rm3[ {]Eu:[LOd&pnYAu2i.-=nI"2i&&pnYAu Kiں-fRI3AAnpuT*/AMHݲރe"85] [{PݒDfe"8M*MHݲc6h-R/Ĭ {]Eu:[BOd&pnY1uK2i.-=ni"2i&&pnYAu댰2u -Wu_Ty NMoT./CM@ރ$2+CiRmTшK!3ۨ {]Eu:[LOd&pnYAu2i.-=nI"2i&&pnY1ud㺥-nl{]Eu:[BOd&pnY1uK2i.-=ni"2iU޾uzn:57FVݸ$У ۍG7q\GtNtG|¯Ӡ?Y"wIG7בl{v% ࣛe`[3۠P_Cd_X'0JW=h;U_ ))X￯b^3|Cm$ pqL搼0H匼L,}0{HNk0ᐼayS򶱌?(oIyI֯ϖ^. y}r-[EMlu.?({I٣4Bn^\g^egHgb:7K`t 6pR%xI>)#a K Z̙y*GϛZW eB:]T>ߦW߼UC|pQ0D% =e:}r›XLJ&50eYLÜz!E Z +iqZ`{]E8TEZd K'q|@H~faQe8 ] J {OyȬ }ZMe J| 89̃-)f(^-~΃S%8 Y [{Pb }Z7u{[Ȭ }Z$Je [ ٔJan.4zn[coOxHrA 1vMnGA4($P^$={AHS{N_r{WȠl۷1 f{rUE:3 aiG,nt >2;QB жYAZel}.g|t{y>VVMZvyٱ1Z m{[mՆd 1jDRsdJ 06ZEڢ¨CVՆx ѳ8tظv#nT+h_svt?PI0tOs>3Fj4LrS=q6+!$JO +4dALQ*C~n9I2ia.>JBzuv{VMdV>-Ӧ2:Vj>Oe_u, {]E8T%;Ԓ}BOd&*z:K%k]^>-Sj~{̒&2+CiRm%S䄙m3i>0)U"-)S-ЧEpj|8P%ЧEpTfխBnԭWLP"܁e-K'Epj|8RtyNMoGT$YNl8Rsm3ۤ {]Eu:[LOd&pnYAu2i.-=nI"2i&&pnY1uݗBwbVLP"܁e-K'Epj|8R%tyNMoGS4YNl8RuFv_ +I:]٫Eݯ[yPb}R&7u{[LOt&pnyAuKO46u{hDlmLP"܁e-K'Epj|8RtyNMoGT$YNl8REwqap"܁e-K'Epj|8R%tyNMoGS4YFLo_eG7|#n\QnFaԣ8.#n: Bod?Y#P>WiP,$ 䣛H=;蒄ny2-ҙmPztӗ +>ޕ= 9}~8?أ QurfvnQNdjck4Ԧ!w/,e{֓RF|%|SX唔m,{RW1}ܡ}P6s8&sHZ$orF^&Q>L$'ZpH氼 )yXF䤼aWgTK/<>9pG-"zڦxb:SQis7/VZ/G}$uvF31%0g:MR8$ s锂0%ip-^L< eMO+YRφ2!?*QoO߼UC|pQ0D% w9"@&=S:Iq }Y:-0gD-h-i&^HQF|/Z0 endstream endobj -1573 0 obj +1640 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1572 0 R +/Contents 1639 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1574 0 obj +1641 0 obj << /Filter /FlateDecode /Length 2035 @@ -22238,22 +23256,24 @@ r c)2^=;4mQQ3 &Q=OgB(;@"'toF"TU|AY"NF nk4+S&a-xE9fNΨFʙnfjRγ^3\U#a|Xp%R! Y|z* WN@)%( ^Vғvʝ{ⵞLŮ0?b́ +Ļ4KL@mt4jl;%. 0[p2$Jkw&GZ7CpMsdvmb*3qjA05Qp#y{8.MoMJ^YcM\?LŠ[sx>-xE9fNΨFʙnfjRγ^3\U#a +wº: =0OY%c + A0{9*Cdr'x'S+;>Lz% endstream endobj -1575 0 obj +1642 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1574 0 R +/Contents 1641 0 R /Resources 4 0 R -/Annots [ 1576 0 R ] +/Annots [ 1643 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1576 0 obj +1643 0 obj << /Type /Annot /Subtype /Link @@ -22268,29 +23288,29 @@ endobj >> >> endobj -1577 0 obj +1644 0 obj << /Filter /FlateDecode -/Length 571 +/Length 569 >> stream xTn1 SH$KE !3nPKδ傘l6?;vЁW9Ϲ''B_*VK J)g f!*1FO)Fp>M?'ӗH',$xf~Ogu\]E<`ʼn%Ɋ^kUSWߑi4cZiDEfyNZٽU2@3Q.h֩YLIi4=c*d@ !`蚛W:ٙLk54T~׫2 -( {n7vF75-۹*o^67s+<00ΈQ:-uLc{.h7z6ٖ%ZOUeVQ()F KV\5#8oӆgʻ1bIx}KBl<0T[Bc@H;y`ݨ0;Z4s rͭcU4 +( {n7vF75-۹*o^67s+<00ΈQ:-uLc{.h7z6ٖ%ZOUeVQ()F KV\5#8oӆgʻ1bIx}KBl<0ʇ y%sg!iu5(hSH.A["=?24Q endstream endobj -1578 0 obj +1645 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1577 0 R +/Contents 1644 0 R /Resources 4 0 R -/Annots [ 1579 0 R 1580 0 R 1581 0 R ] +/Annots [ 1646 0 R 1647 0 R 1648 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1579 0 obj +1646 0 obj << /Type /Annot /Subtype /Link @@ -22305,7 +23325,7 @@ endobj >> >> endobj -1580 0 obj +1647 0 obj << /Type /Annot /Subtype /Link @@ -22320,7 +23340,7 @@ endobj >> >> endobj -1581 0 obj +1648 0 obj << /Type /Annot /Subtype /Link @@ -22335,10 +23355,10 @@ endobj >> >> endobj -1582 0 obj +1649 0 obj << /Filter /FlateDecode -/Length 2301 +/Length 2303 >> stream xZK$5 3!j {4h!5'̨kRٮX8~.ׂy3g8?;|<)\0%h>,Nx& @@ -22348,23 +23368,22 @@ x FTAO"8ѠX/BQg+ mJTK$xrc AzC⎬a6 ބ4=yk3 gI"YځDZ#U7֍.ս'^0Q#j$F6L$4XfU=/mXQ<.Cp^h Q8a8[K֚7"#O9G^s"[V~mM1 e+ Zb|AEf(װŸ`}0`y6;v2u'i h%Mwy" 5~F?wE3}:5%RWznO5fՐKDgnQ9 Me1@xXߊ&ԂiAyyBÑ8@t1e~@[Ie}ȍtW?)F` zla`]GZ}M6Ub3ОѺ*iCImiODNw3 DW9#-r$F{ H"uж @Id^tCJ%Sd''%o @Vc6/0EV+o6G}C;ھXa$"Z<(FCguыuc0f R²@BІOPA oZTT-oIw>ExZ_Ez^WBqla7Q _Cγ7̿0Q^i2m5}U٩Å&њKQJMp_C,ѳU6kkqm*:y<ԴbJrmnp=q:l,x7#UQti7Fϼ,?*1 8蜁:nvb_*CR((Qw0^ q s$L$-OEX'QE(T*` H`B[ޱ8*`=DZ&;aq鏯*eY]. j(r&0DKD'!a pU>P?> endobj -1584 0 obj +1651 0 obj << /Type /Annot /Subtype /Link @@ -22379,7 +23398,7 @@ endobj >> >> endobj -1585 0 obj +1652 0 obj << /Type /Annot /Subtype /Link @@ -22394,7 +23413,7 @@ endobj >> >> endobj -1586 0 obj +1653 0 obj << /Type /Annot /Subtype /Link @@ -22409,7 +23428,7 @@ endobj >> >> endobj -1587 0 obj +1654 0 obj << /Type /Annot /Subtype /Link @@ -22424,7 +23443,7 @@ endobj >> >> endobj -1588 0 obj +1655 0 obj << /Type /Annot /Subtype /Link @@ -22439,36 +23458,37 @@ endobj >> >> endobj -1589 0 obj +1656 0 obj << /Filter /FlateDecode -/Length 2642 +/Length 2641 >> stream -x[K|?Ab`r%BR,cToAZ5̈́ Cz6)i֛5Z ˿.|_Tj2` -yͿzUn/tV'IeV +x[ˮWڀeE/,b`7vI x.ڭ(TdykBޙ巋ؼ_Y1(L.o>Z5̈́ Cz6)i֛5Z ˿.|_Tj2` +yzUn/tV'IeV fSNtO/Uv{ -$&cb9B؜/)i_ ~8d͉ݖ1(Uws-dO򩻳t6{7&k)i#1.퇿|ioHKx\6I_d1!}b}lF}[=no~m:Ko*?ǰdXR \4`]25k^Y²jeMp_9µMնZʺ}uZ,Ye빾y?/r_Qr,3Uf?Bz&f_cy[evP.*+>B$ܫ^u%۸sU%a#1)Emh]Ѵ"@/?|w)6S tnfYF8gG.9a1nFH&iJrظU#&41't\kbB7oUe5}G9-M1UhHk8zܪL8kVmB(tf8*ҀI'*JNN"+T6>4Di1KZne8ܚ+Z8Rc:5j:{W LAv"&?c񖯳 -X4,TQu?0e4=EPOOUlYMUu0O"(Ѳ赆 DS3Kr|f" 1I@#Ezd':a~(Z5SE4'8)rob]}IHuTPkP{hT4PGB0,652!41xd@3@ x-+Y ͐vq P_L8VFje-=pP,áч!NXmvJSaTҼ8OU,6yD=%7r{aARzjj7fז *}L -̡&94U-Pڰ;9rU-U"'%[;+VV^0Bײ f٫ufe?302zV Lm]Kt - C~m-3`I2m"ї9 {d.siXB~Uq`8! c- z[[-MfRVB#оS:a~):ZOǝ ui}e]Ӌ"n؁I~ʭ[=!HHs [V0PUT C htja >p8g &ְ8iЪoƾ~k001Iݷf(]2(-۳d`G`=Cmq@غ*$$qsh HW$7^OliU7IJ4nO loC6+x&ߤ9=to@!`4 9 4Յ"'6%PQ%& ux9# Y;o:=%]r恾vKq=^|XaPuLfsx8oCs)?b6Aqhb[Cbzpc#a|ĐxQu -'4F!gYe8b !yRr򄜂jF&F^ЀOU) Dk݂\|NGd(UC&8|A_'rƴo*nn:p`ާi,h/dyzBS58 vxpdje -[&_TXv'lrjca4sK:*?+<@fOTQ0V 9s+y~O~gU+%6Zb3\< V0)ϝ[2Z0LO{/*)}(_:VO`>zo0NCI]4̡_|3B8q8:.6+dtk^+ΨMിZom;ULɊŠ耐zL;Fݠjo REtbs7er>w_ݜ!w,`Č(` ۍ&eM/ECD +$&cb9B؜/)i_ ~8d͉ݖ1(Uws-dO򩻳t6{7&k)i#1.퇿|ioHKx\6I_&YLH>iq>ucy}wQҹM#vIMl]"&̽Kfy?KXWM +[V+XY.VKe;ˡl=#cR:y=Quʌ']HOCk^7,.ꓷU%]SsG{իdtJ1ݹ$lsa]?&% -K9Vo.fw`.ͼl +BLt<:" 4-$BiqSn~WwjuĄ&DޕkGWr)?I%e0k) *{ZlP,۶,{Z¹GLh& L](Tc # + i-G@w[}P[ǟ^\cVܪMe5T^1 GE#DRZizZId +g>:fTm6zT<>q[rEgWjL&^Mg/9Ng/uQakFw*Grc CMu4J]@¹. S{;ZrpY,$zPfjPt uP6#ZHR t4n}XQ RgșҩF^ k)46xfG*8refח'ht4qfXϬ2Z<; h{$H<[D8,Ec^u'EvS`RM˺!)i*ZyPjSpÛԁ<@fҦU4$F0 xw&Ȱz`; ýXr:Ҏv\;."~ 4K"|}~;?@ԪՈX@@ǵer:"901ق\K HD+rd5+-xmzp2 ]:Ģp нG!p;P 1d -B=Sy0 l5Sw1ʘe4H'°Rt/5H^JO_ڒaU彏I9$JXv4GJd+gʪ FSHZva4{uά?pgYFϊ !uɑNa¢}T` MeWs=t7>qBM$2GaeUy o]gNN<֒ށ+hd+5,`*1;\יt)0Pַ^v/8cTΐ1z$Z[4ȠY`ƘDv7Z`nxoο@ڔRI_3!hu͎5h,fؙXgܺU(ك40Akʼn +O\5NŐ?Jшح()Ayk<{F 2Xqib sfK?v\L N} iFbݵ9-"=Hv4 3D8ܖTBBR7g4zEr̖6PZuC,;!I:6dJqȾ)oMʜ +H&9QD:fJݐBS](rb8Pb uUkP׉ӾO1B>S0*kk<l3ŇF U[|a=ޏ6#f4V*E;?!G;6'N ɉ^qU pIcarm| + +:U_CZP.I bg@*E.'O)ȸI fdb TPJ-ttN1=K[%1d9u"gL(z2얬/!W}fȂNNVJiGJA,45POP`7 GЬV EkBPE5=aK`G|B_;&GY:vxF^O?k` ȓdDU czc?ܜGjhgwV /XRbE-9;`aA ܉P(lj2wx򥃨oVKn> y0DDEEΧ=)?(ӫbBF_5bڴ N6_.{I"YQXTϔ54>i |&} *[tA)6abUNoӟwJE9C)B3so7l'17_:I? endstream endobj -1590 0 obj +1657 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1589 0 R +/Contents 1656 0 R /Resources 4 0 R -/Annots [ 1591 0 R ] +/Annots [ 1658 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1591 0 obj +1658 0 obj << /Type /Annot /Subtype /Link @@ -22483,33 +23503,30 @@ endobj >> >> endobj -1592 0 obj +1659 0 obj << /Filter /FlateDecode -/Length 1068 +/Length 1070 >> stream -xWI4ʋ8 \Fjd _\q'B@KիW/,rK0?}>Yҋ{l>B2Oq*` g˔\6Yb!/O?8M9MyoЕpS}tzwuN:ʹвTc2,s61!Yхcn:̇Ǜû5C͟ z!bh4,x(dm.'WJe>F?^Ma9'isL)aY ڝZ^\gԀ_6.-=&,@L"-4=c. Ш`37a" !erb10ֽ֤qS Ɗ#us$QaTu#kky%+kIPdR$IPE`>PaV -sqP]olPB'* -9Zwۘ$:;[<2M`bete:3ط>MRlq5.Yk+[(c_$[T,{_fn,͕YcnyOJkSVIu`3)c|XF| bXkƤ!kF8s8( -"y5Au;m\/sIwp0+ဘl8,]f}qG6"Un2nMFٛj=ĘCyn -]TQ=C9֕Qtڛ|*.KLOUDRJc=hYGAs!T -{6:HQT}P? mQ!Uq՘;S,^U'CL؅'[z9X-D>~o҄~1_wS*BZZj[i ߓ︉_FbǷHE8C7X+X&+ jXPr=_VTts;RaR?MtN)YÝ"> <# +xWˮ#5+Qt@B,:_\jW;:ԩSm7Yz#39a~|&t}>dRAT@.)l> B6M_>~:qS &Yrޠ+1cnvN:-кTc2,s61!Yхcn:̇ǫݻ!,<}'^`X)/ 1J4m(0A*z[ ?|U~YNяpuWSd|!zSpoJrBFW^\gt߃c֫* &Ho< @hTk0YY@oa"!em}9ֆz 5umq愴H(" endstream endobj -1593 0 obj +1660 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1592 0 R +/Contents 1659 0 R /Resources 4 0 R -/Annots [ 1594 0 R 1595 0 R 1596 0 R ] +/Annots [ 1661 0 R 1662 0 R 1663 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1594 0 obj +1661 0 obj << /Type /Annot /Subtype /Link @@ -22524,7 +23541,7 @@ endobj >> >> endobj -1595 0 obj +1662 0 obj << /Type /Annot /Subtype /Link @@ -22539,7 +23556,7 @@ endobj >> >> endobj -1596 0 obj +1663 0 obj << /Type /Annot /Subtype /Link @@ -22554,30 +23571,31 @@ endobj >> >> endobj -1597 0 obj +1664 0 obj << /Filter /FlateDecode -/Length 661 +/Length 657 >> stream -xUM0 W8qpX4$aڡ+vGtUL^C ?%D,c -MZ0YT"i!^D֤X`c!y=Si:!N2<#8„4͛_taQ)+ aN"9j?|g0uY<| %E]ΰ88XKCH^~nCrD]὎Ӷc7-4S+qV}\ lHpZ. -jj SX90x.-BBڳd#XsJ%rH s[f-'MZ-fㆣ#>/xH*F@N@!^mخ҅RTV _6RWKƿTemn ou_*c9KˠLjw,F[ˮoR1oEcEN%ב1[-cL( Ijg}qA!_q%%*qwۃF m @=FX( (\ӎ!ۭ")\UBЄ +xU͎0 )d8Ni5.+  qv]_iΰ{@rq}AzB}G+bf1<`#^b|Wy(ژ`^%b*,{"i9dF( :gSh0ܜЂy=̚n.I $Jĥ$& λԣ }<5~$3#<#O!LHѼU@b2`Yټ>6,ZqJ +%oHh>h].q_n ".EgX R Qu!XT׷HzUNnZ ijWql;6@R]R9@h +ks`5 +\Z…Tݳd#XsJ%rH 榻͆[N˛67M|XGzׂo4ԑ&:!].AUe3.:uŸtnoK\tscxg ܊\Lx{,|P`t6\-π%@:c# Y*20VQd8V4n*v*y;6ȄB>ڐDNv݇W2ЁIM\#+*Sc==@YOvSH말\C[G1S?ل- endstream endobj -1598 0 obj +1665 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1597 0 R +/Contents 1664 0 R /Resources 4 0 R -/Annots [ 1599 0 R 1600 0 R 1601 0 R ] +/Annots [ 1666 0 R 1667 0 R 1668 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1599 0 obj +1666 0 obj << /Type /Annot /Subtype /Link @@ -22592,7 +23610,7 @@ endobj >> >> endobj -1600 0 obj +1667 0 obj << /Type /Annot /Subtype /Link @@ -22607,7 +23625,7 @@ endobj >> >> endobj -1601 0 obj +1668 0 obj << /Type /Annot /Subtype /Link @@ -22622,29 +23640,32 @@ endobj >> >> endobj -1602 0 obj +1669 0 obj << /Filter /FlateDecode /Length 508 >> stream -xSn1 Wp8KE !p23lbd2B}!ˉ bsxLПq>ߺ= l`Ei( RΔK0@}$1ǻk0e D1P,ՃBH0{%>yTs4q].,[Rj)vNzt!W?h:[N6υTU,|>%ƙƉ» RF:WB䒂 LѬgӇ7*X~o׾pBPF!s8%D1[AL>y\#[Jn㾗[pyCyDxсFq@bMnkWYt)y{ONyJiAE^,zq%+[rwgk9ZW9ӂ&ki-ᴢKo۬l UK/Jz>D;0NUz%i'H?jP. -`ހP0wkZ\kv0^UUq^(/H +xSMo1 ϯDCRiHlK8l"Yo2cPo(R$M?u}0Wn +H)Tjr*@cTe5^ы'AZAj$tg#ђܵyJT*WSR)vٜ؄mpAы3w;X Bp 6o+8WUJ^>2|כD mnE÷{lB#j9{Dž1ŐGXEe^&67s[cN3/~ϐ/:!#3ܒmT;n)yLq~K~ +b*མlŵ ؓ"H]6*poˠ@*G +tXy-5%VXo)v4dyG.Odp&KqMz,>VkiD _,'`v5ŭ~)c߹_j84 +/q endstream endobj -1603 0 obj +1670 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1602 0 R +/Contents 1669 0 R /Resources 4 0 R -/Annots [ 1604 0 R 1605 0 R 1606 0 R ] +/Annots [ 1671 0 R 1672 0 R 1673 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1604 0 obj +1671 0 obj << /Type /Annot /Subtype /Link @@ -22659,7 +23680,7 @@ endobj >> >> endobj -1605 0 obj +1672 0 obj << /Type /Annot /Subtype /Link @@ -22674,7 +23695,7 @@ endobj >> >> endobj -1606 0 obj +1673 0 obj << /Type /Annot /Subtype /Link @@ -22689,951 +23710,14 @@ endobj >> >> endobj -1607 0 obj -<< -/Filter /FlateDecode -/Length 601 ->> -stream -xTM0 W8Na tŁE k*M:~9vЀoPѣ1If1=O`A(t}˽뭾߯!\6'NmjF#xFծ{ex-¼P+Xlkϫplb;_lɯ"\x͖Ǿ -bo(\IuȻgD#^aCr]|$ukSUjpxcct<6낛kTLĺywR7A@Xc,q $z~vckG?JFסX1Öᖵ2@aP|GjV3=-6 6K.b` ہ* m|@U\X8r) A9*͵ܑDn[g*D~U -2O -endstream -endobj -1608 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1607 0 R -/Resources 4 0 R -/Annots [ 1609 0 R 1610 0 R 1611 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1609 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 493.113944 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/newSettingsPageEmptyFullscreen.png) ->> ->> -endobj -1610 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 493.113944 297.637795 478.099544 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/newSettingsPageEmptyFullscreen.png) ->> ->> -endobj -1611 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 410.534744 39.386457 395.520344 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/newRawSettingsPageFull.png) ->> ->> -endobj -1612 0 obj -<< -/Filter /FlateDecode -/Length 1718 ->> -stream -xYˎ#5+ZY `1HERX%l>v{JwRqs.^ֿOO9O}_' F:ʹ‡ τRŋJ1nSλE)zF%~pzs/;BگI ZuyQ<*ZahQ ܝ)8o..NUW7o6VvkbKD\˼*hǬ\9ϿE$ke~)Q?m -Fp9yt$L/N&p}//fKk{[|Ǹ|kKu|3Xl SXi\7 5>ת16Mk17CӜP2{z@-yq0&9q#թYI9X-B - ->LeIeeNu9 TƔ4d8i -thiB`!pF0!Ews%SJ~B=wESaRoF0p((1vBVD{p*Q/r}|yCďQZEHu#FoO>&i{Y 5h䙼sKcLHOjHTJ܏b΅tP& kba/uPf4;jmcgY>.-yM.936›2~QW S2F[PB5a!]YklǘfZXcs뽀FHDЅv8 -wrƼ\s&nsmr._17sEk.6Oϔ8Wqzөr|g/O Ek7L{wX<ѼmtYt,E/YX">4ߝTL`* s?٥ Fsm܏Pv߿Wgobc>zIn"1ֺ_rO^qȓ$.4^:!&[{Ҏ޶ec>a2& - WD>4@d/ͱQA` 3VCP D7/ˣP{* {c>dP﯍[Mergi<`у}CuY>^^_P:Zc,rb$ AP c+;n1Ra^2TNv/\֗}2C$3;?rf물m};#C} BQ]& eWqMv~-_у7 F:7oI>ۊʔV%5D?V`*Г-DÁ®7)<0^Λ/DYUgzm;_OuƤT:im -- 1 ->=LM03Гaz.5RTN;|,Z0Ep) -endstream -endobj -1613 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1612 0 R -/Resources 4 0 R -/Annots [ 1614 0 R 1615 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1614 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 441.895733 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/newRawSettingsPageFull.png) ->> ->> -endobj -1615 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 441.895733 297.637795 426.881333 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/newRawSettingsPageFull.png) ->> ->> -endobj -1616 0 obj -<< -/Filter /FlateDecode -/Length 1697 ->> -stream -xYKo7W9@i-jER=VQPnrRK6RԂ5Ùg0q|)`ykԴڅKf9NB0 8F>_f`| KՏEMi br6Rh?=t!6ͦ67RH7&=shL`G/Ccwsl ݄?<+XF3zcN8o? ($Ӟs8F >sՂaH0GpyND'f]0 -6--*G&-“BI+2VVhNUZ3.F%ü:6QabOfPEOûMx1t_ HF'aKU8W%VAr&Q&0W9:_R(C XLH v `928(U@66_5 NMP5uM.#m vc i@>YŸ4.G]l_m]6(hdC\evN/`Li\ ylc 猪ŝsL;-c7) -PE03QadgHn;߼;XݠTdt*oӧ ijأPBt5AP!)i\UD}Eيԣg&9\2yn(eT²eCTG5]iuO$JHό5I -f a!aڜsT2=BAdp*a>"ٹ")YO^f%1Ioӈ p ד3.xƢᤞ,&AC [YLIcV0!z&UxFIhGb49EǓt\K;١/.y96S[nTL4%i3TqL>^"^#;(D:ϗʅC#%k. \:VDJ@mLcD* Jo6"^a:C(ko(wmDVWݥssݫ Z` Cd>.?o}'/uB䊖)6 J_DL'Q'`w rmɋ| &Jus> -endobj -1618 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 662.169222 39.386457 647.154822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MainPageSketch.png) ->> ->> -endobj -1619 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 662.169222 555.889134 331.650019 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MainPageSketch.png) ->> ->> -endobj -1620 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 331.650019 297.637795 316.635619 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MainPageSketch.png) ->> ->> -endobj -1621 0 obj -<< -/Filter /FlateDecode -/Length 3062 ->> -stream -x[ˎWڀeR| ^Y ȢMn;XazǩSEI^DZY}y|~E,Έ/h?__[\0_ZVJo?򟗭 jqB8.Rbdl-e헗onr_'ڧ?.TzczQR.bbˢ^nF?~Y^-Z{ź-%U68zb%}h6U.tY,QL?m]weY]Růk}囿o"ȟ_*ĺMtB{!Ll7QG+u ~@m7^ӏ][v~{J]yP}9^?viN+?ͱunvIy4:d]j-wۑi^[mm_O -67&EY1ZB2QXC1n6*$RA]0I@ dך^ 1^L{vibsAZ]2UO^p}4y ʝZmQ5o\1Lj@qd(qX6L8Ջ\`3UΊ&\B\`ʵ֔Zn_K;"tU >[Ked,;sIIZm$V Y6S鮫];Pm2;l{}"l4U83!@@LHnW0))MzV8_?4hHi>${g`^"( -D.:Q ]:9}8JL`6Y d 3zkOzvÊ6BnRr6E{jiޣNәy;Ldvzgh3U>sQ*&zg@v -_š#B"B~5(46rh<E/ S`?"%1Fݍˢ*EUn5Bv)̵qZ l5MFy ) wH =H{dӼ#7Rg< a0G)fYy_"u{b,+Eezdb{$gy!znF˔tD5~b +&qi)U6d- R YxȽ#&QRP`Pŋ]--ym%hY1hD)kxrT d,SCwVJQ%ø]4b`Q|(#%Ɓ~Qp (/nO3ƃJ5QI,%֝@6iɆz.½% y[#P:me-MIˈRBYA0$4fq=AUc\y.*bYX1$>qK.])zcD:}=Ҕ.#".zK^I.vKP\Ey'bLaIll1I>5P\?bJP``ai|;'*F%&a!'ǮM\˻rtR5yi*B c$N\+Ftmc%CU?Si  `7-,Ac=ev|U.F4u2iL?9`*U)>r -T4*{ì%7yc̫ -;FGQO  ؽ1O~[gEz̲g<"o`0#ru@W,1`O4_}zp<gpk(BiDMh:/j9,k7}* -XCg2*GTcBTrfi5ẈB8`0"7 `}yNq鐷;([,_'Nq~MM%h2v-0!'f#C`Н#h,J!NkXRUlO<`c}CkO֎TyPB 4}P 9]`0{D*rIe '5mBa}ClTL4d F`kSb3QҔG,-!`u5#X a|`Óy(/Pɦ`uV8 &TiG#pc%7OCyy*=c7U`QW=1j'XR*=0`yQO}\gGSl[OÊgo7:k`pvH{:> -endobj -1623 0 obj -<< -/Filter /FlateDecode -/Length 1784 ->> -stream -xZK6 ϯ9@@sHzh-a<ɥ)dQ&e˛M=GJ^3h?BO'M^wCʆ`B =N88M -4i?|pzw8)~0ffH_>^^N7dZ=JjPOtD* ÆvT(&3zeus!(b88lŁ-FS+[ ws -̈́?ݧiA1kO׃Iǝ0+>}y1˴ucZc |ϰ%ϰc Lߗy vŕE[dr^c?H.yL"KYOe^6L]\]b\x79"7p}cζ;6,ܸ.(}fL!KiQg? -fC{ݑB4Y־S-:9ĭ",jܚ%;1}W|0/DdHT j=ah]oetg[o9!!=r-9;F5T-amE Cw-~tįiwkfݑt94-iydޖZ=ׇr,thԅY:^+a W[/9;t2wIWZcޝS "~LȐ8[_Ul#jC|_^&.5hS&n#/zhE؋ɳ'g/ ^t^OaOҵl=\z~ᯢ+g8>)&/@mR+`S$P ,GeV=]codr>A CoNbrWe4&XCAMF]ҟG$?( $ 7TtWzٖ}yHE&" :N -endstream -endobj -1624 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1623 0 R -/Resources 4 0 R -/Annots [ 1625 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1625 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 342.480522 39.386457 327.466122 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MainPage1.png) ->> ->> -endobj -1626 0 obj -<< -/Filter /FlateDecode -/Length 480 ->> -stream -xSMo1 ϯ;vjr(\*  qV(jtg)'D2x~C!ӄޚG۾4%-5fd%(aLq$PD5 D1P&ՃB=_T.IdmIY#b/I𷃍tcEQdKL sxb52ټW< & -15E -g/*XEOk7[o!eŌΟ\S1!_XʈCfCG]=;f|p%uu\z٫iJG|37E֫D;wo,0MAثQVU+r6^Hx -`ur&4l9_G&)kb^> .k2S8fJ`.  @[aD~N-TG半qj* -endstream -endobj -1627 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1626 0 R -/Resources 4 0 R -/Annots [ 1628 0 R 1629 0 R 1630 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1628 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 416.724764 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MainPage1.png) ->> ->> -endobj -1629 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 416.724764 297.637795 401.710364 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MainPage1.png) ->> ->> -endobj -1630 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 358.543964 39.386457 343.529564 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MainPage2.png) ->> ->> -endobj -1631 0 obj -<< -/Filter /FlateDecode -/Length 1317 ->> -stream -xX݋6߿ρ*IXHi-I(ynCiICGcɒ}+_o)w^}맱aOpB0}9|=hE#+V?d__E4 B -oi?EHk -4V>^Åͪ)D0+T>2vr$J44_0̺VȜ,0Cʒ8Q?84ٗfe AV!F 6Fp+5{lld.ӈtXfJ 6JR6%Nj_ah<_Ai:Gq2vDrOKI/ pU@m0XeDÉ5 К0+$5rBYͅgى/{ 4~,-y^/||:D4K:侬䵸AQٹgn`VDoa -YQ"Q8{dgt[qi8cA80cON:3"%]adYK/U߈8>ۂaFU ϛi#sS  Z%}r3IddCs635h"8p80]1%.5űi&Xe.QB,٤ɾ+}<ޡ0, -&),JB au2#+cCʹ|)qh}.53ƩFft-mu6Y,⤰ T#_2rqrK -YZĚջ;W?JB+C?hӉkr(w M/ۖ}GpvݕlPBQ"4rh -7٢i]i3C=7p6HnƣC`/l|iN=ԭ3aӔ_RXTr7I˜4~i\=Kq`+,NWқdzܤmOmRHJ߸vr5-h4fҏy9ځa!z};Àk2.[qd.|١.mBh3}}te!Ĵj7>R/}5|孔V!c{Ӿh_xCʰju. 9*+hn uՅN1]Ϗ.X)0+ʺ-ҋ>8-u0Cqz T5X -<=)ocHo@A0+caM9sėt$/O@2ݿf -endstream -endobj -1632 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1631 0 R -/Resources 4 0 R -/Annots [ 1633 0 R 1634 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1633 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 415.240022 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MainPage2.png) ->> ->> -endobj -1634 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 415.240022 297.637795 400.225622 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/MainPage2.png) ->> ->> -endobj -1635 0 obj -<< -/Filter /FlateDecode -/Length 2559 ->> -stream -x[K#Wl mB;6$ʗv?bd==@+&]_US_x)>9Q/'6Y¿tE%M^šWr;M3!àVR2{ӿO~dΞ9b~ONѼgi9tIǥ10p -E sg87v6#wk'fI҇/@l -˴0r_qo8>po167}ꇯ,X^>0E}@4s^@Qqу;gS_Y(~R)J#Q]鯣h-F3ʍ8Qx4Ù'V|H~'64zs^*8gNdw_M.؝dQcY]=w]xyL\.{һ㜺=kqmuj~Nqr3eM=h4=OFiyY\?dFeY - D89S64Y&F0+L@؃2}^> -/Vٝ9Di]5Z<nzQm-tBɀrʔAHr- $X7+Qv<x=".q 5<̋շqo}})ݩ3ޭ;[1,!,O7{|-CO־w;CԔ&>>NlO队 7f2ݨ34,*ߖmrÎ&@#J* , &9;);uo ?gnƚAJA[Un v}RtCJ(Ai(VOe)~:YaF;gPjz"+X :q1UjSn}@%C,x<>f\aShZN(Oz':%==,^wȞdJ+Lpd90:Ը7{I̢_gI3߆O8#YIYhF'"l̟^(IzLeM͓HcڼcgάbTp@Ng 3 nf>:N x=]]$0h@G%-~v AksLE|_논 -endstream -endobj -1636 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1635 0 R -/Resources 4 0 R -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1637 0 obj -<< -/Filter /FlateDecode -/Length 1007 ->> -stream -xW͎6)r>iI/ hIk=$E2$"ekE ܥfc5??TO×A42%_?29 ~$li FÇ(gaz>?QA.Q ?7O!h")*b֎O~#$}\_':mW]"e\ۉݿůe9(22-8,tIe"'^o⫺\'> -endobj -1639 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 643.401222 39.386457 628.386822 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetGaps.png) ->> ->> -endobj -1640 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 643.401222 555.889134 423.612849 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetGaps.png) ->> ->> -endobj -1641 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 423.612849 297.637795 408.598449 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetGaps.png) ->> ->> -endobj -1642 0 obj -<< -/Filter /FlateDecode -/Length 629 ->> -stream -x͎0 }Y۱cGBs@a 3]qK8 iK<+1Fc _MM_}3$Z4‘JP|0(hC]%EPӀHK6j.FZM%wfM@BRFᡅ-nuGz}.|':LEnOijNj@X=7ۃ/Tr4T80RغO>rzK5e;i-l/;F9&*iUѤy{|g QuYq3Rec)KL+g ~~=c#Qrr{=JsM==[ N -Yy\hӔBr02 &*LdT̳#T*g`M"TRt@QLh0@cϧRD2*Dpuh7 xq:}mgqhA#{=M{vuN q%JaRq|qÜ;EHRZ9'^܌Y,1K3e t`vp;3X6$wܭjVstM5{;qwy -endstream -endobj -1643 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1642 0 R -/Resources 4 0 R -/Annots [ 1644 0 R 1645 0 R 1646 0 R 1647 0 R 1648 0 R 1649 0 R 1650 0 R 1651 0 R 1652 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1644 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 39.386457 756.009222 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetLaps.png) ->> ->> -endobj -1645 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 543.796678 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetLaps.png) ->> ->> -endobj -1646 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 543.796678 297.637795 528.782278 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetLaps.png) ->> ->> -endobj -1647 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 461.217478 39.386457 446.203078 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetNames.png) ->> ->> -endobj -1648 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 461.217478 555.889134 287.480869 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetNames.png) ->> ->> -endobj -1649 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 287.480869 297.637795 272.466469 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetNames.png) ->> ->> -endobj -1650 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 204.901669 39.386457 189.887269 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetPositions.png) ->> ->> -endobj -1651 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 204.901669 555.889134 106.183012 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetPositions.png) ->> ->> -endobj -1652 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 106.183012 297.637795 91.168612 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetPositions.png) ->> ->> -endobj -1653 0 obj -<< -/Filter /FlateDecode -/Length 725 ->> -stream -xUn1 SH/= PTZН٭8N2ٙ/ELvvۉ?spDS*ƛv^9S-NU}i5sTq<);BD"z&Ġn?|~ef&u1z,+]樹a6fv;@Q|HDH!p_/Ljce{["Ⱥ+Mm~`g8ێ <^,p=D)aߌo-,.a"JlhMe5DT6Y9ZMpVkf|C.TI&y&Wgfr$(|^Ό3C*@<&ic2.Ξ`Y=NĈ4C3 6D G9D6 g(Y 0y-Cm_ddž1֔W1TX+U<3٘IIaqҙyX'Hǩy)g2-R;jAבm\^0rKƪ]kݦ2aGݕmDZRT`󃊸It -endstream -endobj -1654 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1653 0 R -/Resources 4 0 R -/Annots [ 1655 0 R 1656 0 R 1657 0 R 1658 0 R 1659 0 R 1660 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1655 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 703.458822 39.386457 688.444422 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetSectors.png) ->> ->> -endobj -1656 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 703.458822 555.889134 506.411558 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetSectors.png) ->> ->> -endobj -1657 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 506.411558 297.637795 491.397158 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetSectors.png) ->> ->> -endobj -1658 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 423.832358 39.386457 408.817958 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetTyres.png) ->> ->> -endobj -1659 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 423.832358 555.889134 205.910680 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetTyres.png) ->> ->> -endobj -1660 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 205.910680 297.637795 190.896280 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Screens/DataSetTyres.png) ->> ->> -endobj -1661 0 obj -<< -/Filter /FlateDecode -/Length 1459 ->> -stream -xXMo7 ﯘs($0h.aRHRqDֱ͎];#i(|&M@c -M÷V5}ʊLoTHhS.Fi -6Uapt琟ɪua0F!$1)=A뿇3mlվ4f6) hfQE1w7p'EzEjg@ʜQP 3AP!\bZy`2Doo󣋳<*:hbtn} +dYkij~Fs:gi56*'.x.,/f88Wc,cF&q$^.nz'Қٙ,<+V3c(4i-4HPJh|W=yjItV#B/G^'SX Y_J9>]=7kq7cɪt[p1uCzz8g6&.&,ΌDT:(`D`R Jk 4n> -endobj -1663 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 499.193322 39.386457 484.178922 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/DiagrammeG-C3-A9n-C3-A9ral.png) ->> ->> -endobj -1664 0 obj -<< -/Filter /FlateDecode -/Length 488 ->> -stream -xSn0+3~CM@B,M8vKY!l9v3sc0~Z {\;!kTI%xŌ̓EfJƜc-9}h9*be̓CϏՉ#ǟÄDsGR1=Њ0;l dv]?W_|qՉ}ӽ?:YN"qR> -endobj -1666 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 110.449041 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/DiagrammeG-C3-A9n-C3-A9ral.png) ->> ->> -endobj -1667 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 110.449041 297.637795 95.434641 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/DiagrammeG-C3-A9n-C3-A9ral.png) ->> ->> -endobj -1668 0 obj -<< -/Filter /FlateDecode -/Length 702 ->> -stream -xUKo1s,E9 PD - q$Mš/1ڛFj?7~ CMbp0=N~jw=N6꘼A%RRI#hZn2D?&#@S /}nfԠOgvT\Đe@ z ^i2DΩt_o?#Px28ߑ܇&2ιCrTXdkfSS#\B/ެc\ X\ؖ1-sǐmd~1XVڱP012~W۫f -B*1"yK-ȫ %q; t-z8upe{tbz/E5굢/~Fr*{>}^O!E <@C'޳% P]̭dPT6`47?|i6Ի_e&l -<_YB{{QذAϭ+-KA -NNCH1iu:<vS{1geR2(L8D%md(Pip g&C_'>BȸfJɷ[ȅ6 8t#]$=v`H^H.J [ߗc ec% ԼڸqӫLz4> -endstream -endobj -1669 0 obj -<< -/Type /Page -/Parent 1 0 R -/MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1668 0 R -/Resources 4 0 R -/Annots [ 1670 0 R 1671 0 R 1672 0 R 1673 0 R ] -/TrimBox [ 0 0 595.275591 841.889764 ] -/BleedBox [ 0 0 595.275591 841.889764 ] ->> -endobj -1670 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 731.610822 39.386457 716.596422 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/DiagrammeRecupImages.png) ->> ->> -endobj -1671 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 731.610822 555.889134 317.257699 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/DiagrammeRecupImages.png) ->> ->> -endobj -1672 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 297.637795 317.257699 297.637795 302.243299 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/DiagrammeRecupImages.png) ->> ->> -endobj -1673 0 obj -<< -/Type /Annot -/Subtype /Link -/Rect [ 39.386457 259.076899 39.386457 244.062499 ] -/BS << -/W 0 ->> -/A << -/Type /Action -/S /URI -/URI (./Images/Figma/DiagrammeOCR.png) ->> ->> -endobj 1674 0 obj << /Filter /FlateDecode -/Length 467 +/Length 600 >> stream -xSnT1 ߯N4E, -J@B,ShQK8ɽeH&L{07_1p4@>ŏf4$bUQ-jDJ~R,9%|7|^,EH k|FgOSRU#KKZb"-)6ٽnzB>;_}iyeT3Or,| t\i'%N>}MtN7.R$D=D˜g_WK7C?fYޝM~Na_=CN9qB=A:Zo@Gӊ̎-B~XN۵W͆Ybl]}3_pZN+0V"'!{+] OC>#;5ZuMrY -U +xTMo1 ϯ 8Njr(\*- q؝ݩ8P%.e2q;h@7Ƙ$x3' OYmNI1&#-"8R#eOb^i%b)D+q9kZB/-W!FGbOawF™NH`Qh,kUռ7.qJFJxI4^>}˽߯.\6'NmઋZP;uQ[=]yc>O?ñQ|"C̪'pDIC#;7[Z}*VQswa__^Ƀx9 wԭOW}7_`8 nTLzxw6@@XXc,q $z~vckE'?JFצX1E`1eaP|W^jV/3-6 6G.b` \E<! /J+ ]: +(O);mȯ27;OZ endstream endobj 1675 0 obj @@ -23652,14 +23736,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 771.023622 555.889134 329.046958 ] +/Rect [ 39.386457 771.023622 555.889134 493.113944 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Figma/DiagrammeOCR.png) +/URI (./Images/Screens/newSettingsPageEmptyFullscreen.png) >> >> endobj @@ -23667,14 +23751,14 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 297.637795 329.046958 297.637795 314.032558 ] +/Rect [ 297.637795 493.113944 297.637795 478.099544 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Figma/DiagrammeOCR.png) +/URI (./Images/Screens/newSettingsPageEmptyFullscreen.png) >> >> endobj @@ -23682,26 +23766,33 @@ endobj << /Type /Annot /Subtype /Link -/Rect [ 39.386457 270.866158 39.386457 255.851758 ] +/Rect [ 39.386457 410.534744 39.386457 395.520344 ] /BS << /W 0 >> /A << /Type /Action /S /URI -/URI (./Images/Figma/DiagrammeTraitement.png) +/URI (./Images/Screens/newRawSettingsPageFull.png) >> >> endobj 1679 0 obj << /Filter /FlateDecode -/Length 1018 +/Length 1717 >> stream -xWK7!r;&!0=HQ-uh,q{ԪRWo- U;;?O_&P?c2|$!`ǠA4F5:}y>QkE]ās~4>ӿӍU)" *m0Ο'J2nͶi)W ;4r>2>;Q?:fvrP|)Mfsl'n=X̡ty'zy-N_pq)ڸ\z9p#X6OLIdNJDvvy;Yï~~ N>8ަxaǷt3͎""ssRjv=c952ؐ?h| a!pLqoJP}i -t\z/N)}#q?vwA1ǹnBJfDޤbI>\ˇNкT5aQ=./g^E+ -*bݘ307݅pB`M%Hs3x~)5kM ٠-W1FdIDToρ}t$ۈ#DF/\Tv(1 +po +|>"@$A}a4r=BABd{r}"[9@f*եW@Ĝjil<|xfH^,໵(;O ; G‚0M,/*8ـ3R-u!'%oBj϶1SYm@S]=1%g/ ,F?A/}(}Z&BH%@FfQ$LH0nm#r Gƾk]QAEƔpԃ.L" + 8 +k̵]:^"JFeK5|EcVR݀ODZ^C 0y&/ @I *@X̹$!9yM0,cN2 +lfZm,+"BTcK8#aC+I-'U{~1%c+<^S;A Muv)luH n0:w{}H)gZNSӘkΜu#$m~-_?|x:ӅjC0So:Uܜ38c( wϔX0͟n`ORI!,M9Az<>s]Qj8W !myy1|X+9V)X>~-RcێAy)_QEN X!7!ql`7F +5:K#{Bʻi%KrwOfdcGczo[@Fe*b_{1P>jCIDBEbyahS_數+zƙ"H >g[1\2*ә> +Lz%ܚKD:(GB>]c +SBOuYe|y׶EZW`LXCPY(Ioa!eUaj20 s٭ɐr6ϧr`cѢTą(+) endstream endobj 1680 0 obj @@ -23720,6 +23811,936 @@ endobj << /Type /Annot /Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 441.895733 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/newRawSettingsPageFull.png) +>> +>> +endobj +1682 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 441.895733 297.637795 426.881333 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/newRawSettingsPageFull.png) +>> +>> +endobj +1683 0 obj +<< +/Filter /FlateDecode +/Length 1697 +>> +stream +xYK#7Wy!=J/0d9d`nXrhK 0)(-{fϴ(UWT%;朷qj8SY5 '+KJ1 Jq;}k[:; !%1/Y0>}gwƅ֥ۢi-Pm~z **ClMmnoPM2{&|31ca2eCP뛃foϱ3t`us9qw~|7 λO{%p~P @>sabLba= +u0Nͺ`lR[Z8G&-“BI * I>5!bT2< >Du]<}BOk=}vdꏲO6q8~7 -U\H-9əDh\<~IP C XLH v `9d|qnP֫`/lmxI jH:u6A5ꞓ)/ ڍXY|qi\ Fپۺ$JutmP>dCZevN/`Li\ ylc T9s" 6eԆb:)_첛G7/w~97J@]m1x{JhbفFW1h*"`(b_Qn"(Ec癷Itކ[@0Jns뢰lYѮ3AM9:Lj%gFZ$ +3㥴"Ŵ93dzT À>"ٹ㢔Jͧ<> a͔7i&91\W]HcQtJOM%`?k_o!;d!c3%9Zɤ[ TMd#<~Ѵni/sDW'c鸖90wC_8\.x&s +mO+%X{`>b?6W +?h,4wބyЃ3sp4!:Ei$/1z6h\wdzri1k:KGB$_D;j˛<~rv @*y Y[ݙןo8ZG>3%L&a9uҢ=*Fܧbo_SRC}=W +蹖) + xa7FC+rVܖܴIj '%/B'/!qBdm>ZF6/)9(2D-7*&4͍V8&pvy nKCJBӡ~5ai0GH^+\q% 6x +cD6~MO/Ph,a:C(ko(wmD@鹹UR 0!P*Q_sD:z!reKz$/ 0z CC6[zzwE~>9e@]ہxs놣ᕞp !Nz (3lE sۜɭFloREޟR{ڨ)5}z?4 ?ǑG߽IsVz4LWl5K3QfcL;+ck^izcdZ"83e1(3'd2ﱟ (vAA!]VA"%}1!""V' +endstream +endobj +1684 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1683 0 R +/Resources 4 0 R +/Annots [ 1685 0 R 1686 0 R 1687 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1685 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 662.169222 39.386457 647.154822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPageSketch.png) +>> +>> +endobj +1686 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 662.169222 555.889134 331.650019 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPageSketch.png) +>> +>> +endobj +1687 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 331.650019 297.637795 316.635619 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPageSketch.png) +>> +>> +endobj +1688 0 obj +<< +/Filter /FlateDecode +/Length 3060 +>> +stream +x[ˎWڀeR| ^Y ȢMn;XazǩSEI^DZY}y|~E,Έ/h?__[\0_ZVJo?򟗭 jqB8.Rbdl-e헗onr_'ڧ?.TzczQR.bbˢ^nF?~Y^-Z{ź-%U68zb%}h6U.tY,QL?m]weY]Růk}囿o"ȟ_*ĺMtB{!Ll7QG+u ~@m7^ӏ][v~{J]yP}9^?viN+?ͱunvIy4:d]j-wۑi^[mm_O -67&EY1ZB2QXC1n6*$RA]0I@ dך^ 1^L{vibsAZ]2UO^p}4y ʝZmQ5o\1Lj@qd(qX6L8Ջ\`3UΊ&\B\`ʵ֔Zn_K;"tU >[Ked,;sIIZm$V Y6S鮫];Pm2;l{}"l4U83!@@LHnW0))MzV8_?4hHi>${g`^"( +D.:Q ]:9}8JL`6Y d 3zkOzvÊ6BnRr6E{jiޣNәy;Ldvzgh3U>sQ*&zg@v +_š#B"B~5(46rh<E/ S`?"%1Fݍˢ*EUn5Bv)̵qZ l5MFy ) wH =H{dӼ#7Rg< a0G)fYy_"u{b,+Eezdb{$gy!znF˔tD5~b +&qi)U6d- R YxȽ#&QRP`Pŋ]--ym%hY1hD)kxrT d,SCwVJQ%ø]4b`Q|(#%Ɓ~Qp (/nO3ƃJ5QI,%֝@6iɆz.½% y[#P:me-MIˈRBYA0$4fq=AUc\y.*bYX1$>qK.])zcD:}=Ҕ.#".zK^I.vKP\Ey'bLaIll1I>5P\?bJP``ai|;'*F%&a!'ǮM\˻rtR5yi*B c$N\+Ftmc%CU?Si  `7-,Ac=ev|U.F4u2iL?9`*U)>r +T4*{ì%7yc̫ +;FGQO  ؽ1O~[gEz̲g<"o`0#ru@W,1`O4_}zp<gpk(BiDMh:/j9,k7}* +XCg2*GTcBTrfi5ẈB8`0"7 `}yNq鐷;([,_'Nq~MM%h2v-0!'f#C`Н#h,J!NkXRUlO<`c}CkO֎TyPB 4}P 9]`0{D*rIe '5mBa}ClTL4d F`kSb3QҔG,-!`u5#X a|`Óy(/Pɦ`uV8 &TiG#pc%7OCyy*=c7U`QW=1j'XR*=0`yQO}\gGSl[OÊgo7:k`pvH{:> +endobj +1690 0 obj +<< +/Filter /FlateDecode +/Length 1782 +>> +stream +xZK7ϯ!^, ;6!0=%IRW[^]=֣UIj Vwv~:}>IALM'ㅏ6UJImҠ11O_>ޝ>>OJi-@E PS򢄜>s%F 'IUPz1dRE20B߽Hb= +˜ A8_K$]djbK~]\HfJ?筋X] oo~y@:SLH 5=}}1'I.`1=2i[zesfXeiXGsd.t*wZUeF1Yߪ,u=ry[vֹj7?׻MҺŻّ!|wq Աamt@3s:@ Qub\ Lō +58Q:_أ|)jSĩ%n&'YW,ىt3*}Mpј+ J1:JK(ZyO@6m) \Hӯ#z./UK6OBc%Dy@]$dv<-*2P5lMuj=cB\RkMq4: uj1 +X" g.:4dO)RS[9,P=~Ƞ e)|)|ie͔DzV2enU +ScgBr V8<> + 7,;V0tNU| CfY#+]'wl/H][@swVz:pO 5]*4BZI eHV6a*բtqVѰvrMuTPv/Hhׂ_6AnmLg8)T2Ŕaϰt26 0i-Ū5-Xnpiv}_46QA=zfDrh>H^hI"I]@g^M 2'ABkvaGQUa؆ ŬFUHi҉!g}542k-cPp*`ն 3C{D{yư*ͪ`צ:B2Vx%z)zT '(;¸FE=-[߶Ԝٕ P.R% S_UW hrs!AUj)\((Ty~uCҫ)&Q?GtU7GѓJ@z ^3&v{i>Q 2դ^&pwg.!9]g$HVRu80"cH(=a>;R g5Io3儠K8vx0RhյS̼ ۷喃 ޵l i(zC << MޥKuGރ;ˁ9[Ȋ-n]KG{noTQqׇz,thԕ;+a7{;<_iWsTwep>;`60Aqx:eF'8T=,L\,M0!xFc`'ΞH=;'=JR }^9pRGo&H=05~j+]+ zOMe=*J:c~&1$7H}uL%?)#0UIXEĐ<" Si&`@|g8sM+gE, +6_P +endstream +endobj +1691 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1690 0 R +/Resources 4 0 R +/Annots [ 1692 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1692 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 342.480522 39.386457 327.466122 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPage1.png) +>> +>> +endobj +1693 0 obj +<< +/Filter /FlateDecode +/Length 480 +>> +stream +xSM0 W;vpX4$a3]qp>a9!u~ť_ ̊fqBPAojҶ}]6V֍w2bFO/,eD!n!䣮=;\~mIesWs4{]toM*Ν c{[2 $ESj@jmՊ!#$6} ft۽#V1HkBȵ3܀9 Rq@gexV`wt88CC;QyeE_ +endstream +endobj +1694 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1693 0 R +/Resources 4 0 R +/Annots [ 1695 0 R 1696 0 R 1697 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1695 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 416.724764 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPage1.png) +>> +>> +endobj +1696 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 416.724764 297.637795 401.710364 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPage1.png) +>> +>> +endobj +1697 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 358.543964 39.386457 343.529564 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPage2.png) +>> +>> +endobj +1698 0 obj +<< +/Filter /FlateDecode +/Length 1319 +>> +stream +xXߋ6~߿ρ*IXHi-I(ynCiICGcɒ}+_o)ŷ>0h'8P!Dn"__E4 Br +oi>EHk +4F>^Åͮ)D0;T>2vrdJ464_0:VHl$0Cʒ¨Lzܬ~!6*6hbmn[#}O|C%y `]IDIfucBx? ˽>hpp?MH2NƎHaoI9?3N)O  +mth8ÛZ88]=~No B^s,'Ѽ,BwaJge?rh{7&6^!e% b{&f6&| +pWώi#}>3&xKm2OB"U0cO$mL1X`BbIWX,c)ʍ 9 y1L32_YP, uPEN r&xn6s}]4]6+>Ƶ$å.x!6& ,Vll7 (!MOOp6b2x3Te$豂IrBXgB^{]lvm *c#׶sšqs2 ӕ`QɢfKf1%#[Hj 2'֬\y.;E8YI6eŝ6r˶e^Qa[[8hJ6bE!(9ՇDsśmGwwDlQ.c[Qqj8 oƣC盗7>Qߜ ٔ|k$wB}3aӔ u>#eceuh^Q'rS[Rr,+斳v3]Qqrl$lƖ" sNrZ|5ɢKr*zW -Р[I?*kKѵC*`gGH%;eoq;z~"gG}h m77p\MDR@O ?Ӫ|܈WHԵzI^ +RZMƣ}a )~#yeQY, RU]4#U k!xU[ W^ŠTUlIZ 1kJ?r!yL9̟I^s͙#\ґ(_eȻzfb +endstream +endobj +1699 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1698 0 R +/Resources 4 0 R +/Annots [ 1700 0 R 1701 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1700 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 415.240022 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPage2.png) +>> +>> +endobj +1701 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 415.240022 297.637795 400.225622 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/MainPage2.png) +>> +>> +endobj +1702 0 obj +<< +/Filter /FlateDecode +/Length 2558 +>> +stream +x[K#Wl mB;6$ʗv?bd==@+&]_US_x)>9Q/'6Y¿tE%M^šWr;M3!àVR2{ӿO~dΞ9b~ONѼgi9tIǥ10p +E sg87v6#wk'fI҇/@l +˴0r_qo8>po167}ꇯ,X^>0E}@4s^@Qqу;gS_Y(~R)J#Q]鯣h-F3ʍ8Qx4Ù'V|H~'64zs^*8gNdw_M.؝dQcY]=w]xyL\.{һ㜺=kqmuj~Nqr3eM=h4=OFiyY\?dFeY + D89S64Y&F0+L@؃2}^> +/Vٝ9Di]5Z<nzQm-tBɀrʔAHr- $X7+Qv<x=".q 5<̋շqo}})ݩ3ޭ;[1,!,O7{|-CO־w;CԔ&>>NlO队 7f2ݨ34,*ߖmrÎ&@#J* , &9;);uo ?gnƚAJA[Un v}RtCJ(Ai(VOe)~:YaF;gPjz"+X :q1UjSn}@%C,x<>f\aShZN(Oz':%==,^wȞdJ+Lpd90:Ը7{I̢_gI3߆O8#YIYhF'"l̟^(IzLeM͓HcڼcgάbTp@Ng 3 +8ֺI4 x=]]$0h@G%-~v AksLE|_[ +endstream +endobj +1703 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1702 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1704 0 obj +<< +/Filter /FlateDecode +/Length 1009 +>> +stream +xWK6WÇ"!e-P iH̐C"|0jz~T)x;./Vid"?2Br1BLc44F9ky` +ZFD F~~&Pz߰>ņL /TGSX:1Z;^> O?ߏ]_':mW]/4b;Wvae,EF%e^-ri{Wu*Ox.ۥ;c6Pd|j{>z:C3C8 ora9=^" ,Tx3K8~ȣ j:`Ǧu`oK!4䗉7<eB$fī@qxH+"|ћj :7VXh|ڶgL16=éљU}=2,x=(t$ ZtQ?DQF<ȂZ]}fe97e_w%r8?+dۻ"IIL6QrKjl;gK_ ס7)WԆ[ 33**?;i\}rʛH5Mzc5瓴IZе$]CZߔ2N +endstream +endobj +1705 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1704 0 R +/Resources 4 0 R +/Annots [ 1706 0 R 1707 0 R 1708 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1706 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 643.401222 39.386457 628.386822 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetGaps.png) +>> +>> +endobj +1707 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 643.401222 555.889134 423.612849 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetGaps.png) +>> +>> +endobj +1708 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 423.612849 297.637795 408.598449 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetGaps.png) +>> +>> +endobj +1709 0 obj +<< +/Filter /FlateDecode +/Length 627 +>> +stream +x͎0 }Y۱cGBs@a 3]qK8 iK=+1Fc _M-_yF-BCfh%(ZDJ>RN 4ϡגi@$%T ^#F׿ NM;FYڌ&Xr!)GLS>KbGB\~'Ĵ o5d` z͛x*9@*h)l§ X2|}탴 +X# +h<><>?m}?ݨʀܱ%3[IINp +۞(9%|Nz,<.OTuiJE!9MtT sv *LdT̳#T*g`M"TRt@QLh0@cϧRD2*Dpuh7 xq}mgqh~@#{=M{vuN q%Ja\> +endobj +1711 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 39.386457 756.009222 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetLaps.png) +>> +>> +endobj +1712 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 543.796678 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetLaps.png) +>> +>> +endobj +1713 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 543.796678 297.637795 528.782278 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetLaps.png) +>> +>> +endobj +1714 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 461.217478 39.386457 446.203078 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetNames.png) +>> +>> +endobj +1715 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 461.217478 555.889134 287.480869 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetNames.png) +>> +>> +endobj +1716 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 287.480869 297.637795 272.466469 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetNames.png) +>> +>> +endobj +1717 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 204.901669 39.386457 189.887269 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetPositions.png) +>> +>> +endobj +1718 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 204.901669 555.889134 106.183012 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetPositions.png) +>> +>> +endobj +1719 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 106.183012 297.637795 91.168612 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetPositions.png) +>> +>> +endobj +1720 0 obj +<< +/Filter /FlateDecode +/Length 726 +>> +stream +xUn1Sp=?[r@pdCA-/1M b3oo%RV!=dRPf*. e<@hBDτ/ϡ׌^CФ Fϐ%qWb>PmMŒޮ ))$".>I-`,÷KXfٰž(-Ilw <[_p=D)aߌ߯--.a"Jlh-e5BR\Y9Z,p>ҡ_~*(#g yAL{rZ39Bc~fƙ!dHV_5I2į2Ę}sgbVO!'r,1>b >acL[ڏdpClkq`p>Czɹ }P")g1TX5Vef13FOp6cR"3NaFUewfFב󴶎d3=ױ7i>N087I +Mw]Jg Xe/..umt=$7 + Ww$KlDv)q\nX޹% +MCܻsf}Je+'c&(Z.l[*vKyLXd/&I `ՇP2{-]vY/Lˬvd]wR +l~$ +endstream +endobj +1721 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1720 0 R +/Resources 4 0 R +/Annots [ 1722 0 R 1723 0 R 1724 0 R 1725 0 R 1726 0 R 1727 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1722 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 703.458822 39.386457 688.444422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetSectors.png) +>> +>> +endobj +1723 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 703.458822 555.889134 506.411558 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetSectors.png) +>> +>> +endobj +1724 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 506.411558 297.637795 491.397158 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetSectors.png) +>> +>> +endobj +1725 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 423.832358 39.386457 408.817958 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetTyres.png) +>> +>> +endobj +1726 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 423.832358 555.889134 205.910680 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetTyres.png) +>> +>> +endobj +1727 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 205.910680 297.637795 190.896280 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Screens/DataSetTyres.png) +>> +>> +endobj +1728 0 obj +<< +/Filter /FlateDecode +/Length 1460 +>> +stream +xXMo7 ﯘs($0h.aRHRqDֱ͎];#i(|&M@c +M÷V5}ʊLoTHhS.Fi +6Uapt琟ɪua0F!$1)=A뿇3mlվ4f6) hfQE1w7p'EzEjg@ʜQP 3AP!\bZy`2Doo󣋳<*:hbtn} +dYkij~Fs:gi56*'.x.,/f88Wc,cF&q$^.nz'Қٙ,<+V3c(4i-4HPJh|W=yjItV#B/G^'SX Y_J9>]=7kq7cɪt[p1uCzz8g6&.&,ΌDT:(`D`R Jk 4n> +endobj +1730 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 499.193322 39.386457 484.178922 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeG-C3-A9n-C3-A9ral.png) +>> +>> +endobj +1731 0 obj +<< +/Filter /FlateDecode +/Length 488 +>> +stream +xSMo1 ϯe[P¥"mK$3,H4ı^ J,dZs8}&&-=.}ӔKNߧH4HEZiZ~BN3T^ZIUÌVa_J-o&9+ 3Az:UY}>ɫ^蠇X ~OV8ynN3 {dOADkLKߞb RbqFwǍEO2LelX5rb\V[9tŹqɑd@~wT"/&USk )/rJb С +YFiAyc1c%'X/#T=7(1zY L5M7` c^&^fuyV`?BJMs@IwrB~;A +endstream +endobj +1732 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1731 0 R +/Resources 4 0 R +/Annots [ 1733 0 R 1734 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1733 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 110.449041 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeG-C3-A9n-C3-A9ral.png) +>> +>> +endobj +1734 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 110.449041 297.637795 95.434641 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeG-C3-A9n-C3-A9ral.png) +>> +>> +endobj +1735 0 obj +<< +/Filter /FlateDecode +/Length 703 +>> +stream +xUnA WPkK怀CiHCL&PKصtWO"@nL-ޞ˅}-sazRyfRo{]S+Z|pa[8`溶+b{CŲ׎kcWyY'̊\eVI$F_ +endstream +endobj +1736 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1735 0 R +/Resources 4 0 R +/Annots [ 1737 0 R 1738 0 R 1739 0 R 1740 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1737 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 731.610822 39.386457 716.596422 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeRecupImages.png) +>> +>> +endobj +1738 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 731.610822 555.889134 317.257699 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeRecupImages.png) +>> +>> +endobj +1739 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 317.257699 297.637795 302.243299 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeRecupImages.png) +>> +>> +endobj +1740 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 259.076899 39.386457 244.062499 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeOCR.png) +>> +>> +endobj +1741 0 obj +<< +/Filter /FlateDecode +/Length 466 +>> +stream +xSM1 ϯ k;KU8,\V0@ ') 4M;{.0RLux jG3zFL*8r)X,(29%t?| Z +E"QhRrPp3acxI(ڒb1ڞl {^7=!ϝo<2:EfHkj\{jd :Wgrܰ$ 8b AR=| XR} N~Ha=p5 MEz#_kϹKOC{3,bb~v8PE6#!:Nt$貶CGHpސԑfn,J?Wvsiu{dDk[>޿,WܰÇ"0F;fP,GIV_VXv`2Odjh5Yuӟ݇grb7 +endstream +endobj +1742 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1741 0 R +/Resources 4 0 R +/Annots [ 1743 0 R 1744 0 R 1745 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1743 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 771.023622 555.889134 329.046958 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeOCR.png) +>> +>> +endobj +1744 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 297.637795 329.046958 297.637795 314.032558 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeOCR.png) +>> +>> +endobj +1745 0 obj +<< +/Type /Annot +/Subtype /Link +/Rect [ 39.386457 270.866158 39.386457 255.851758 ] +/BS << +/W 0 +>> +/A << +/Type /Action +/S /URI +/URI (./Images/Figma/DiagrammeTraitement.png) +>> +>> +endobj +1746 0 obj +<< +/Filter /FlateDecode +/Length 1019 +>> +stream +xWK7JR@B⃝C r v?nuh,q{ԪRWo-*wE:Sӗ t Oؼ{~L6.FIMk59k!χdu1(Dc4a2iz}B ӿӍUU70RDh!`R'ʢ +nͶ]7RfwIPh>FC1mCq~9vjR_{Wc;t Zb {K%1?O6{sc|l`?ـ gM^GIw?VaFk^^s8 9oa" +7'a׺3?oQ]S%Y* +-S4!{@;9l +\Vd;A`Ԁ*LV5&åf_廎~2OtASt]dusr%1v+al6w|mɏGd%O)gs87kt~;ˑ{<"Q>آ۬I=Y&[u>ɲX9+r\I 曭q@C [T8. CcԜ[0a'RZ}+ĝ᜾2eFt_~{7 +:[+xpYL]b4ˈn4%p;Pi 38=wdQ-}R^r& o6}nowkn獴҂[ $JfR\-Fq|+貫;kUkefk{\*YjXKK4w4ڼ.BD~Э3蝥##&ngZK:\AWBd(EObCJږ#6s[͗Qq,j.l_慖p5eR7[c37L3U@H{bc+պ|M,Ci(#J +endstream +endobj +1747 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1746 0 R +/Resources 4 0 R +/Annots [ 1748 0 R 1749 0 R ] +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1748 0 obj +<< +/Type /Annot +/Subtype /Link /Rect [ 39.386457 771.023622 555.889134 356.670499 ] /BS << /W 0 @@ -23731,7 +24752,7 @@ endobj >> >> endobj -1682 0 obj +1749 0 obj << /Type /Annot /Subtype /Link @@ -23746,37 +24767,30 @@ endobj >> >> endobj -1683 0 obj +1750 0 obj << /Filter /FlateDecode -/Length 1259 +/Length 1260 >> stream -xXK6 ϯC`(zx⠇HRZe~Gǧ *$g*Q4`,=V9_v4 lv#& KvN-D] 1L+ÙL.pV -M -&2`0}GV6$[سVqh /BSu:p)GNLgZȼh1M7ˁ^^zma:y^öM?6 Mﴭ Ay 18K cR=`ndoIo%.̂bJ -YˊuZϻ@H0,1\Uf'Kۧ17Wa,dL.ZS\3{:) 8\]*Ʃ1D#aQ -"&L\+vz;TZ1,dH 1+nl13rըߥREm*: `(!4Cgtl ת24Vr(_PǩOAד <"Ck骉(E8lyS!H+[=sb`\m΋ZDq7@ixu.g.]Z]JN%rnm ->R$/96TXc M"vonw` -f3r8c[Z ]e/!ݷs s]B28ַrq8&I?ֲ -ɽW[rO#geӂϙ;> #@oڊugiY}t}mp6t{='1Х(MDsVL¡] -^Tfn# 8zk&꾗ۃ7v)W*f嬀{w~_RF=@m IBSϔTD ꓲ͓mXztqR ZCw%0'և_MDw> ci0'|nuC5 -6;#O5`=6 O!\yާ7Yck ڢ<2,2'2?ѺZUyfa,:HvN)6^e6UWv#&A3[4=[]52 ÉL(n;s4Z/,KJ ĸ.Gٳч걯 1/7B]6p.n+OL1d-;&9qGDrZmunꇪ{92c$0B4B4Π`X#![s›9mGـFgGF19Bm: &o aQʸ5!Z"!85}9p~g/H2Hv[se$$5R*?^_O9 +\0^^OcCs6TqJ/zѡĪcE\[?wuV'{ QMU;Z˞t +['k-.̿& q)f,42ˆ r(}C KCpܛީP 6Y\ؖBg{lKHw<82jFEV[STj'֝ki2A׫;NБ3LG^3eBek:ƫ>u>Z.Z(@KG]Ixycќn/*sKA<]KJx;ȭN:Ko)K/T𫗕jEZ]}_RF=mTѡϘT 0C͓uZ)ZSg%0'_M HADu .}dƬ9]ϵo0E+\ju}1 ҝ sc3E0 O?rx/' endstream endobj -1684 0 obj +1751 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1683 0 R +/Contents 1750 0 R /Resources 4 0 R -/Annots [ 1685 0 R 1686 0 R 1687 0 R 1688 0 R ] +/Annots [ 1752 0 R 1753 0 R 1754 0 R 1755 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1685 0 obj +1752 0 obj << /Type /Annot /Subtype /Link @@ -23791,7 +24805,7 @@ endobj >> >> endobj -1686 0 obj +1753 0 obj << /Type /Annot /Subtype /Link @@ -23806,7 +24820,7 @@ endobj >> >> endobj -1687 0 obj +1754 0 obj << /Type /Annot /Subtype /Link @@ -23821,7 +24835,7 @@ endobj >> >> endobj -1688 0 obj +1755 0 obj << /Type /Annot /Subtype /Link @@ -23836,31 +24850,32 @@ endobj >> >> endobj -1689 0 obj +1756 0 obj << /Filter /FlateDecode -/Length 932 +/Length 1586 >> stream -xVˮ6 +QDI%.6@;dI(% ExHs(a}20. k-~Ƿ☃ )A#A2y~ཥu8=!k)A1a|^O`ƁPe!hLDAI6g +\X폍_H2'X0O`bgu:&UXX͛K˅90F&!֏n+_nßO|?wo  j͂ GRv ?wHpSv6Lu5fWv7yZ1l,-Ni{LQQ}`Go $p,eH۪]_F(-F4~|r8lN@lB{#p74T {x'`g:Hh*׮Djd,jH^UAb) \[{n7t[C|/Ê3<1ܾ2vXU;h$56RAu5{];b -y_TUEbt!Vظ9+XCߺ(?c#H>(Yvni WӬŽNf# -.q;kkJUz -]aۃ'I!<4YIB6y3CopX~ozIO):wdzrw?ZL]밪~L:nwʮ:Hf Zݘ ='2&75Jtz׏<@B;'|D#)6',y5<Æ ULkep?#DSK\~kHAeǨ|(l(7'G1V^/X`bT"` ¹=yrRJ[.RQr:GaM\vȖk\Ihe,iЄ6UͰgs7 ja4o+J*LT# Ey!W+n+lG=ͦK]b7r nDG$3g WA@ @ü7a1Kk0q0نT's ґXvur=4l`Y/Bk>H %Il(_Eq!~1z> 8%p%Lq[iMP8p+-#[ ;>MyC݅TU4V$zf Vs>{ÿsgC7r詣kL衐㫌ZL!uh9D/".g.vAvt78-+uj#/BEKzS*$$ܛ։kNқ8i81--9cǟ~|j(*WnTV%ʅ[Ĉdٚ@&XqS@rӘ6XUxf뼁$/o->Q1O" r* n@'%o;}=zJ5{U"ty]y~3*@!oIr-Gww I!]yqgd4%E,: +MR8S +΢=<טǽL5a7XS +79:enu G4Yg9ݵ֍T`l]aW'ōf{}UuĖVhwMO]ќdUgdPNB!(ZŒ=D0tGb`||B׵XA=}w`E{kn{.BG[}c/]yx\/#zYEt9ZZX +eg3jG_}yMеB wZ rioړu5V˧&gxC,ЬVR)˧FK)jUЌBSn}rcTs@CAPybHV̠`dxr_0 xoUM endstream endobj -1690 0 obj +1757 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1689 0 R +/Contents 1756 0 R /Resources 4 0 R -/Annots [ 1691 0 R 1692 0 R ] +/Annots [ 1758 0 R 1759 0 R ] /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1691 0 obj +1758 0 obj << /Type /Annot /Subtype /Link @@ -23875,7 +24890,7 @@ endobj >> >> endobj -1692 0 obj +1759 0 obj << /Type /Annot /Subtype /Link @@ -23890,77 +24905,140 @@ endobj >> >> endobj -1693 0 obj +1760 0 obj << /Filter /FlateDecode -/Length 3055 +/Length 4635 >> stream -xَ񽿢 fx 6`'@lbAfzw`REQuJGbKņT)x{}|hy|rBr&k1]D rQ/?]sCB1\Qg_r+j@@BtlPKedOaVЬClɄ0BXNd,M蠴PU  ~xJ5>*v)_5AabR5?9V*u! ']Z -dA?_?]SX^_ﴆd=9R6cr`6ybm}}C5"fB# %ظڦg/3 %wk@Rمn)kI#|ƙE=/^xeDrnq=L@ܼ]9TCAn?}PKD\G nL -mcqPZ nhJ&Ͻ l&C͑Q.l]Sظ[F+> ;W4iY~߲w2ZÑV;j%s'Z%O:2Ӆ]XQ+;)11i|ßovo:b2-fFo\'Wyt&,\sO;7vA=8OuABz -"@1 `ϟ|wo#91?E੡оN_yυ{B*7͚L䯓," -[$#3F4㭈[DyVDL=X0{B6Tpc=5ppHvHXiC|)= -uёCŰY8\I^g_8eXT1pRt4Vm sZKd-R\Rfټ=!%wI'#+d#&XH_nP8F%̬H &`' 6*jJA7t+&jƒ' ~c< a %1oZ=jys]m*& 9K,W2R`*]e}2:ŝR|N.Ga•=,\}"+(Q8&P. zS =bˠA2NK>o6=,PU sjNTJNc?I@q){CPat;`oKQ @Ha&HlMLA aA4f eT{ۀI `C"ٵIYӄ# ` Y昐pܮ`Ƀ9>@$ ZEt}0XJ({'3YH$֞E6Nq;͞r S) THYtUt{ERp(r  ߡ5b;Z]O -keC(bW5jCe(<ĆJ?hCe`NBo۬mH~{n7Hl8Xtv25'w\q{k-4=S:R@ڤ1 ߽+EuDǕ:dJ|G&]LQ ƕ&SfoX$=>Ex65TDIv$n7sD0)g}oZ)hk[" -mJc`i:$;<[vdcFgG2gu#zf{OFy;+]3+Ub~)Ӻ 핁Δ+jp+UsdL8G+-w_Ii=o{%^=XJm}Kvp^{{UY -M͝D;v^ҫq,CpdW?/a|kޚe˛ -R*_Nf4;98eE5A;Lܯ$Dٲf e}} -xXpǥf ,ѓaSA`^ϼGkRX~O*SAoCK I*(– .;ٲHW78پvM?4 -8p?FtO5):H ؠiHB-,P_;qkRF*^p8})zg s65ySz 0<𮯠rnb~(&< +x][$~?b ur ذv !a_:RRR_f[=&V]UUI'~'^ }pV.|~;?_c.)h>L.\Tw> 9Νw'!dFMC~~,?+H?8!O[Q@J̠˿4M܌1>3`1B7{t3Y>2;9] !>:˚H%3/חo~z!Gp};5Ȋxӵm/Wz?^FgN׆q1xmyHSxc<2#3;ҋ,3H721u7ƂĻo NfwI:T}qҽy|Ӈp`dDW:'gfGE٢ĉb~tlԨP!:ʠBVYC'2ϭD O/ի2Yyu;j;>*_b`x<\-?3,UvWc|q ^DZGٳL`zP|mh yDEWփggS5+ɶcjcXINC<'d +F.a+rp9O%ctn Ldzșf=LJQr\XmWNe.ݗcov>+g5'(v(yqX;^Fop $~J8kWyhʺQ$EY2ճ`yeKaD)nV]޿fl$9Mjg|*4 /óc+O''8ebDh9Ot߿OߜD`f@#tU{5h ͭOYd [ ,p2XF5}j!6ܭV)ANZ TiUUތ\J(fEFiIVmmMܒES$eC)h"#^A;S5F@X7R\a$jL;މr~J!4%ukBjm-!'li2-I7 im X3ț:VrLx\arb +M3-m^c/bF]eb+1J‚ b#$G3/xev D 79ۤ"N΀x-c9z%HsA#? O:7v#U8NRdC;I=BPY:栔?~(ݯuLO{/ +LBc3e:j}i~vL^pL\b> /4˗/_rD\䇸!vQߗ 0̅P''gu}/|1InL&t*v!tng@~A$~ 4cږH,i+,`BZp:! +!iCFi&J%|V-+UAo Xp!0A8A (b9i !LŒ0m@~bs|&ĜE5F6SwUbpzu-8=r={HFQVvE'Z ϔɘ5AmX J^ nйoZ Q[u-yisbN͔}l*S\AW>L;H_ +zN#Rd"(FHngnC +TOֹ[C\K zsg>qe.?&Ptj|2 ЄƄ#T(HSI*&8>АfCʭ}C3M"}QHd iO.R@C3#(ށ7=0!Y!E܃\#g{NhFq3z1l_(%tYAs@g +\;v[I)KIF}C0lu +!Mx!EGגo5U 2] f|Ҭb@Ire4pOE,z8":6¶ĨWș6ZlGWj=Ȧr'{Y`>0ANMJw + iK/xaOT- G5ʗuaXijPJ>Ajӯ[{X*爚hAVz)dĂJ*/Ԛ%7(iUFi!dS7a@moerUЏ5u݊HOݙnK{돛 +4j = à @ ?Dz0SEsjb5OG/@8d,.`l\{! Xyc.h\WX .h,seXh+hTeظW^)N qJk%HyO Fdt$[7oPU+u^;eP^*Οڲ[@΅ߺмQ_Y2u7+/Z4<ԧQ3ӽBS*ent7-Jivva4B۰bڲZϑPl66_#Цn,yfz## i,R@C蝬=8vWʼnjnTbnHy}GgwE\;\\TK#CͨiG+L^B+õ@qUO])S]Ke亭$@qwA+sWza6y3iD|uN>?V2eo=2:q#G4w;N!߁@ 7N3DB.m^*֠=pVnHru(_ +6ETQz7G9E+SEݷ; +NJ[(z=ZZ"ݽ(àqع(#S67 k%7XL 0L,Nc_Sw5( @T]W!n "ݻf>lokPˁFfC!ckPbk>q-ez (WO$@a5uw ^ǗPhul{5Nsᑛ0vn*!yTJ:!*XQa!fC]5Οސjv%щj~ޭ2G:өix>))\}=Ho*KS Zi;+fY;q_SJ+)X3W4Ί4ֲ"""3_O>_`%]D:ʱ{uL$OXS+TrASmyMYMN~`QlBh"BZB!`0o:irt 4:4zR'āas`~X̶űa(‘a0C! ᣂ"(DoA_QHm99  { +62jq[U8fі}kɧƗbHcP'(1߫*漴7//c_gɆjuo6VnoY.tʵF(h1{gjo]K/X[dұ+{ @+=:As5X썽hF]PFOlHF/٠lAaWpF~wwn% R=ONw[6'=m,V{ yg[cu[=[oirjCn8r-/CxBJ{Z6il8tha98`Dsܺ+o^:.0u@i*)j8q}3<[J WiU \(40U )QBv-1:ߖWJ^<7غncWka"Wz`!Kv^\v1bR&}0 6<1 XPOEz(Ch+S<mz(=OP> endobj -1695 0 obj +1762 0 obj << /Filter /FlateDecode -/Length 3548 +/Length 1148 >> stream -x]ˎ+ It,YM?KJ2PdHn%}xyIJ;Ay-Y}}™33f?sHgA3gBpJ1?.]Pq -!%3"Xo_rE0~?;HMi SK3 .y5gueKzL +xYjF}WudI <{_79-ss(#y@F-hNI4f_TTkaxrrLw3}#A1'V;hǧûkJyp歞bIExP5#ޛ??/ήG se\jwIYI]ZP\OFYxu7Fc6I梩5mk/G@dɷCeR~i5'ڵ?hrCwJPnfvJі*j?Dl&>xrsd` tlSn1pŶ篛;..$ +endstream +endobj +1763 0 obj +<< +/Type /Page +/Parent 1 0 R +/MediaBox [ 0 0 595.275591 841.889764 ] +/Contents 1762 0 R +/Resources 4 0 R +/TrimBox [ 0 0 595.275591 841.889764 ] +/BleedBox [ 0 0 595.275591 841.889764 ] +>> +endobj +1764 0 obj +<< +/Filter /FlateDecode +/Length 3053 +>> +stream +xˎ_gY,>  6 _v@)QVIbmvE WI5z|rIҌ_N`נ|:@*ADa4t_?^~wywPJ֛8/oA/r)xc@]A;! |1qL5i4l*O=-0뽰.tACɺ #IV(鄴3Oa; VƧT9.k tIc'j2Q%4|(%ERA{QDϗowWeT:wRBx )>Zl}}#Ѧrk ]~ ?O _g@$:k L O0=sx8&eQL{^af->r~?rG9{+rru^yA. %"c.=dDxPRqnh*ͽl$C$͉Q.]ع{F+>{4iE~ߒw2YÐNVK#&sRK:Ӆ]^ +-wR|?o_)qV흍erGmq4l65}b*q]׷hLwO73uAKB.sPLOw=91UࡣP΁+13LmC]ukB&d VjI:$#2SD!۽xqA4(94ڽGdbTH +'\ݰQ&_H^0=]7x*,GΘ>:2r̐v '"+W*m^*y2*5I7K#"RN{/"~@^#@ 89['d}=酛yD1`l5U9M ^E5Tf VTڸ8eH f`% += FmղH9o) ~,i, %ŘlOWxoa&cʀztZ)so Lg 2ʎ?/spwN.>̈́#NKpy`O p_F +u. E@y`O @2g(f5APgRL)Зq]͉j^i!b?XsE +Ę6s]6c=-|~!, 5 Z +v3Ad|7x`O 殟qTGɃJP(m&&سd,ynJfWw| AEoD129!y0:~2m&|kN CN8x%(JBqL#C.r\~6W Qd?2!_+ mreJ7SԖEI=nmrUiR! _6G(Zt\0zluJ@Bg,l*c97*V5xDzboD\64ۯZbV&z}DcVl_Dpx̧~쨊K$kRT?SQݸ;gp%B&7+"-@RJ=y`F'Y?uT@ɏ!{ɦQE~ +|uocȦCx: bΞT $\> pڮɃ)>A$ RqVaДQ>FxPȂ_&m/t ,lv;^3{H̶Q<bOԟ<0)VtUt{åwL(r9sgG1P)!(;ZZö{ v+@ѨPC!6KI܆>چ2 Yp[|'9hRwdq+:dW_udoLx +ב 8U=i_) $X:Q ͨQ\MsQܤ-dU[xpg + {e޺iOorP/83e(p S-ƙj/:04Sa@lƴ g -DH/6կOE&6*_ypv&MFD|.Z=XQ&͙<č?/nu4/rU>l)rԯ֯cK!F6FrAnYRv*:V 7o4-&5`"Y~K,4<1Z7Y(0%ջ%7#M=q#官_,ĺ'~Mؐ83QxDΦHʐ3|,QHpYrF(T{ S/Ur>{ۑ!NDNup$},QYqݑjV&@RC,gqA\YgώFVؑ]!> +endobj +1766 0 obj +<< +/Filter /FlateDecode +/Length 3547 +>> +stream +x]ˎ+ It,۳= dR/HHn%}xyIJ;Ay-Y}}™33f?sHgA3gBpJ1?.]Pq +!%3"Xo_rE0~?HMi SK3 .y5gueKzL ᬡfFDs(n"&sz4h\ -}?*$sVJͯ~ ˪]?Ԅ -X- +;W_SߵZZIN/J31K ۮWh+(=e<$?Rx WQY.8ZFoұ"w8\;qPqE - ӵibbtHK3ћe!&/bZ/'TVſO}~d n Ηy`6:;OVFw˛S<*8&L ʩPR%mTa4 3ޱB0k}(a\?IH&$R?wH2%'|E120I\u޸OHa׊"\PN TmLuNM2UPn*Hb-4"6윱J)~r핱JKC:9W*1d`tWtImfx`9M' -cw29}ç2UtM >@#=nnEPw!Vq͔Nt3VRRh(79Y5M0PY铏^'E#uGf1Zp\ur)]<8+/"!s߉g޿V uT#Qn5F_IJa]͙2x9(%GyN!>u>$)v EFelGH~0KѮ[ 3Z-K^xk^+h2Cʞ2STVJ,Qzkx<6h8üCA4vF8y{N6{L~w<^B.Hd-/mTŽ՗#dI<&-aDK1ғtKѸtmc"p܎ - OsϬPPNx% 4_(q-;Y&{HcjKO @憺&-ٴ9?^ -p$T;B0C.Ot{Վ ,Υږ_t'חAE$eEDyżѳJbJɍ+qV3r aʦ*a2!ju NŘHB`=\y^ &Ռ`Q -JpUr֐d2sVM^i -ޙF_:[uR#8^·Wg}(B(r{~+(z7Pe8RylhMVJMy,YRo]Y7b=(;G$-s::fQqwr8HIͱ{끴!iBZ.ݐ6BJc7͈=i)\kYlΒAIΐSK 8&R_.aֻ0Qzum(2lbVQ.驧~ -|Ogce?(܎"(j,K.x>S:`\V -`;1I3F Auf޸H043F?0%0 OfЎGɞ*#} -`;1I3F Auf^ i՗˕ -. 6.N@Mud!I)@]ΐp8wŽ+?Ee+fQܖ{T;NnPn knzgrIZϑh*`mGQ `zjcY [hx`z|t܎rWaH.Țx Z1ol]3r[9mW(׭ہ|>_u٦u* G(QWiz*MH˄*lU)i*KC:ռ~ €m!vl욱natPIǦ΂^31me KF;[:` ,.IRbSr"\T2/uej\ZY qtye"^Q/ydJNDo零;pdظysv"m ۶y6`\eˬ4)ڧ_Y%?WE.\W[ZpnCzrZӆS(tY)G 2aD-4*E4'@UFP n],H-nѠtbFwHgb/dcګ--2J$V(::6ynm+9z^ TA -ō@z&tjV _ߴ*qwod\Bμ y7E)Q|K)*gG#_71g9w>P݀|U{J~C4f˼)RwSHԋCNCAzQ )(\g)g1 y^̃V ̃4<O`w3yЋ07Q0zVOtr֑ 0?#>0ic`j75o(J (Ͷ{Z/)KuܣCI^zW[%x.mOϑI&L Nߒav&ֳ0IBӝ0 0zmhnHVAm]Ah,e]A3<ې58njzv[WP@)шkUM<4,hW1ֳ;SAN5c>ukϖЭd}>6x  ^<*u{i:[9K->[>{[磪 ڧr|pdSd` pT[`V Qn{Cv#0zţȪd4R`[Wՙk2i|`CR˪_TywxxZW r[mtzp -zR <:'=BU< kRCYSfĴx1ێOcx`{1(EAJ|1'A)0ky'15ۓ +ߑ f7C֗M^_ + ^NV Fwu[H18_٤6d?Ym-oO CKGTB38J(bBKÞ0SѨH{ǂ {\#ìU&ap$; J!llSd4:l@7&q5nz>#a\+sAk:%RI'39dD2Uޓb-4"6윱J)~r핱JKC:9W*1d`tWtImfx`9M' +cw29}ç2UtM +>@#=nnEPw!Vq͔Nt3VRRh(79Y5M0PY铏^'E#uGf1Zp\ur)]<8+/"!sۉG޿V mT#Qn5F_oIJa]͙2x9(%GwyN!6u>$)v EFelGH~0KѮ[ 3Z-K^xk^+h2Cʞ2STVJ,Qz[x<6h8üCA4vF8y{Nu#iuQ>uj ^V|( yhsTpd,|K}"O"Q/nw9E" +G='ǧHr +41zm0Z̃C0hd<}A/gWyv6 +?G>'058y|K%ۙ8{Znx&MMwlfߧ4ЯuUu .[5JhuѲ +򖹣wlC֠33m]AͧG#*UM6mҰu\ńz[ N-;gmK֭=ZB>{u<ڦ6xdzmj9UKPN;oB0ozW{,}Zh=nMw'hF ÑN2 +iÕRm%mZ5G 1HEF`|u HNjGU?/3h2tWՙk2i|`CR˪_TywxxZW r[mtzp +zR ;'ݟBU< kR]YSN=i;)-?wY41-(1ocA[`{1(EAJ|1'Sxcݰp>%.IsdXL| endstream endobj -1696 0 obj +1767 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1695 0 R +/Contents 1766 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1697 0 obj +1768 0 obj << /Filter /FlateDecode -/Length 3208 +/Length 3207 >> stream x]Ɏ#+0=@>(/CkNc8LLeJi]PR2V>F):J !zgo?Vŋ?A{U& @@ -23976,251 +25054,250 @@ RL 9"'|$y;Ȃ{PjR~ez ;գ(g{I}+[Kr;-A<E aTX7ʲ)à*_sVU\gwK<pT' Ö#1ׯe'd)'GU딗:cT1zj!Yo EVW E@";CL7`W Q8"=I 1 F6s:JeރtK7H/^4|t}z={jɻ\_  -m*r7<oxƙ>^0 [`K_C; CLbbt#4SDv&ՅkJ:طC/(kŔspQ]5ܸag|^5w|{w9Jtr1+۪;oTf٘y&f <_Vk +?zE[__kjw;:_nMTgd,9-S.G&TɃto~~&9[JtHOI`ݐ[Ȕ6,?jJg +9 ~f"9Au O L'`0\ӧL>3҄ӌty>g] on endstream endobj -1698 0 obj +1769 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1697 0 R +/Contents 1768 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1699 0 obj +1770 0 obj << /Filter /FlateDecode /Length 3837 >> stream -xێ~py>,0I.6 ݽ{f@,ReKAi-X'Y1דI1{'z|= Br:sƨb:RRz12r?RJi-J>|:~9<+ E]~._~{'̼ >8jJv|vH^k.SIz+O( "Z=ÏxVZϯ}z;>ϭ߲HzFz[OC^m׻c=^sΎ2c\9cυw~M1q=gs맡抬s?Uzϟ?\ -ޑu$bW_e0N44)rRiXeyXߙ5\Lc)ѿi0LEfGi)$4ScTa̦jz̳hCwْZ!{.k{VlVI(Lvh< -ݐa ]~起&c)# G @5LCdʹ40pvi9m-&hGAcQ9P1ҏìDh`* |nC吗JC|c)Mgq&\R%!Q]) -$ ۴ǣrLD -I_NA]3q]BcjGgf n x(e .0u_Ltξ&0JG&aAg.nm@-:%s7Қ>E噟YIe&ؔj@*̕Q #B*yUX3$C{@0# CW)t}B3Lr.u5KcZkmL ?)0B O)"D+'5C;#JOvp(h*J-c בF^83P -: Ky')*JnEGvim㌡.)@hT58CL\R/52Zl6qfJ)2-C5^8\c{tu kJg&Ġ8gGTy4]x*Tvb)-@yxNW S.) pQ--)\~\/P.e-ΞZ[ Ur)ΨL#aYyG-(5/ԉ]<?Yt6_nSYvc̭jL.NDJ|s.Is Z5լe&%յ&P(; Q+Hӎ߆$,4ɫo5IW(fҶ9&M:4(9 7caE<+9kT m -*K5 w>O@yUETDiu,2z ?GRYZ/d*@FomM%T(<:UaΓh80:r4Zz<)R/K6i#+\ym[JXP%[# -([[r PN.[KbkKfa DžK7q71;N1XĴ2l,w@EX,FVPT,Nd3Dܝ%iՈcͲߘe%(KX;/KF}%ʪOTނKlii9 .QfKle@ڙ qKy<%ulM'GeˑKfj^u3 y%@X([/>.Uڸ(F=7pІ#aLY/Mm*na.^dbgEq0isee(FFq1 -8WwQTI;MVU7tMs(k3@yk%ʸoŲ6ǸV`m6`e2;JT zmDYFIT-$ʒ 4Jgc\lcjL y5*l0((UmZ 2e&¨JL"ѧM~ ު|Ta,.oyEq'$@1 -f蹙NTӞh$@={8{w] %30 mwK ^4P>ZOhp P|OxDʚ|bx='m=usPoUWr#oxD٧G@ϴg##.&GX2:3H4xDInMr|P`Q y5*l0(Um?(KMPyXCݡJŌ*W1Xx([)먯`#P5Ls=7jE]U[EV馓Ǧq S[ؼ3RUڸ(F=7t&dω\^>3|-Khk*=L{({-@y4 -(=A%1I`wS7r~aڄø9@y% Uׂce6Pm%w("#C[is#XZgzq9 -Ks4Pt21 -@U(ln6T%f]ڥu @Yl -^(*xKPN[;b\V=7wHɪGcXVk 2ٓ2a3ф$zed?ise(>Fq 8WDI0'k -Ӧ)ʾ<<,,(uqq3Qз# ([U,3{qҏzq}D6_p2_Zg(z4(qqq ֆ#3@'[өZpvf+{XIT7d0)ۅJ-~6NA8깾BAX([FPO{\v`Pz*/s3*+Hѷ 5tzdUP:<KW>rr_r$!1JDc0Y{>mب*GAr,0I.6 ݽ{f@lReKAi-X'Q1׃IWQ_&1AEԆ^4F8k ߾q!>$#!RZ ._?<)!JQߧ sk >rR$O5U6Ié$ur]|J?zO_<*-ÿ>H =ȝNKio9<$o#=ϭax/DeW/pl\:{v<~lz?g.+ }JT<%Hr(qMuӕBLr,Kϋbu1kv%DsRPkc`rDfG4Uє?pn)5d)"^7Y4fdq1[r]>4f3zx+z+a"[UhR%j5B<59q^YZa":BJ1o09qT4I,lLkO af>Ӷbv31 +s +O8=B;F謂]l1Ty$I=0z$qwz!UՕ_LMz<*D`^e9 ]r;P885Kpk_ƃ@1(cpyL¤f +~.um59W:J6Ɏ9t "sQ:ڹ֍3*䣦}eWL 3痚BbU u6(ﲏ[jt2sYW4C֚y &򲯜-D Z^9n,F&tCi`ZX\Ώ^*ӢA.}55A882R|ƹ\3b݀swuS ZP}?#ځk^g]mUYsy1QCP u„&_wt[˒f´m%'f(2>p tl딮avqM錴„Lv*F`u:?k[kCi tSO0њ.A `;rR*bu:OU(mOkqxJnP̦=LqFeTwIvK%8ziA)a9̩N,uxdrP&cn-Tcrqp"ڼTsUONOMDf-7)i5Fp .(\A坯=mmH"9_g4/IVY +RL^5ǤI_1c?|wP7gM*ZAef(oJ(γY0㢊TPp!4/QbT 9Ѕ[+bU(ը! +?dvNhUdo:9N*S fCPFѐt 7zϣr@+/* kV)A1B͕fU/8R`ؼ˂ K*pr j}\^zn&.amFKzqC'Xs[*dEL+-"@y4 +X(EA"liEU"D6Oݩ\.6o/.ьؘ<ܬ;@Y] ;dԷ}\D͸D]9γs3]v3;G#%{n\NsV;"7q:G¹DΓ䨌r>r0s 5e KxU@Is-.%@Ylޢx q'%@1j蹙3>W6<88s?L$ejp s*W$=;+rgoQL+-(@y0 +4 +(QA(\ }F$4a{5m^Lq&3 PZz=۾f TތI`^+Ѥ2虾umLYn1 +&Q\9йVLV:&Q$* B'{өA9[3rPն Sf"$}ص0mWL%&Q$@8l>&Qx6C$v"ŠD/`&qwU.\"O=sY﫬s6s-W4pFq 8J'sSw*~/Q=^s{5(/[Ayq [}Ԟ Lhz&0g< b22xKFAg@h;uqTn#:OSq 㠪mu 3tuSɷ6* ey+a#0XyjNQ[f4]]ww0SlQ,,Syj~|6v.^S1]wW>i +(<.^"rA2),(&؋[E{T -tw`Ayܢo@qnyV0s +PqJ ȟqיYg|4Eu(T-|Eedo:5k7 NTܢޮ-"it=f8-@Ylފs){a*pr j}n[DiwLG cD./ߙ[Lɥk5Kݕ=ac]\ _dђwSwr~aڄݸÙsK/;K4] &; oCӷܡvW`Moz;T΁F;:kKԎ ́>P9ʸX^ T-;T:OSa`Pv@9`w*1s.hKP%bVBQ!{]*prj}Z蹹COV=^{]ja;A&{r8La&D̃9m| '(<.>"H:dU^aڔ8Eǜu3q{AyL>mTތSԭ*yҏzs}D6ȟq:[gz4qrT#uMf®fYa&=Psh4o* IF; UbA;,6oyA=}q'ځևv@1̈́v""G.v5 R:C)x&3R>Wr_'!1JDc0 +}P۰QT.. +?x/E\rU\e + `?]_. $nbM. +6:b X-ͫkJ`_ؠj`4VjO߼O?o9ȓfO")M%ŔBo阿E-;f$w_\G˫F׶A0cƿ|ethFSE e5ČĬ;/AfPZA2qb F=&ڙcHso' &ϥPyhSuMxoI/q endstream endobj -1700 0 obj +1771 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1699 0 R +/Contents 1770 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1701 0 obj +1772 0 obj << /Filter /FlateDecode /Length 4019 >> stream -x]K# V, Y`6$ 9t{{@(Uz٬32 *QDQ*u;P"\|y[??ˋGD -UJImCcc/~IhQJkaUt+%wJ/y!T)wgYvy‰[Zsb8ubڃUi8!Yp)@F4" -.}_(-Țg~㇗?|L6"G`&iZ@9 -kve Pc _ϕln5 O388E.-0Z@zcW3@efnSz{ -!1YB~,i6&L23By?u3@'&}ё2PB~{o06wp]\ml']?_R{yL3>hkD -NHL7>74G8x9TYw ka&p%T@ b0KOszWE1^DVQ6yDDNGX+ViD]jðe& G(znX[J##Yt9VGRkgK`ͣh$-#'!^`\KN{Tq2&>Z@jm R葵44Ax6]HP.QFke뤒-c8-6 Ǿe䫟,I]Vs8a1ƶ1H@p6 =58d`+4с"tR l]݆^kfzd *g%?ĤmF6y;m2tM&Fw [  j(_"sVe[!rJd~tc;8a%f3-`0n/6D)O}M&ݒcKDK,'\L7ͼX4"}Z\.bJZZ~vim,*d@ߘ,rOiͣZ>6) v2]XNdM U:)iqlZkFrou1"]:}I~I׭=jqgtGwEDʴ |ܑϊ8DW:J!,6R{)Mԩm2<- 뼷"׶Cd*^"WǒK 30o_wRľ]ktul.ڼytB uȞ)1iV܉ -|!?!83;0z $pR@$L1Z\\{B$'\9Qe2wDzBC\Nִ|}ՍK}Z8X7]24 -bkMh',ecT$G2ˠ-/rmgad n܃\ ,MYscElrWBW+!r$F͏1{6:[c[93rT;^tI#YakܶZwW=e|6,nTRO1V> -yv)cjQVzyj+"@2ysVg(3r $̬we}:r:<6 Ҿaus ~eB'WY#D?5G7,,QTM/Ȃ$WO$&OֿrG8_8^y2LsMUrɂtUBwuq{&'VPm}6NǘKQY&V7eeĉ$Ihu ^rt9k.E -=;l -*ekLSǏT16E5- - m-[LIanm趢NO?0C z5=&u1 X+46omYs~|=E/zAN~h r6Wܜݶ4gL]֜R3nJ>cW';3.ŗ=y42^gUL^bO\)z'2t4U~w$Tף&6Ay|Lp3$SZQ<@a]cgIf N ѢuL2*0Fr4]I_KL9MΎפ}*uV9d=p̩4z'Mi)/\v?,sd>`d;rA\c|g]tfG<3~F>zv{18)K*fvbr]V֣md$`?KRݸnJI! 啉+ّzI)TD!6 M!hc`5LK$2{#V5d;r% QӆsֵֿL8BoQ/O.iB7iaS1V dULt?x=KC{0YqN: Mˇh p3e韟3hR ;g{٣.0cb~ ig cs`z"K K2t L=0 +x]K# V, Y`6$ 9t{{@(Uz٬32 *QDQ*u;P"\|y[?ˋGD +UJImKcc/~IhQJkaUt+%wJ/y!T)˻,~t-{-Et=\ֿlrJygY4F|Qe8 CJz@j|ㇿ?^i qd3_?>&K#0x4 Ug-hxx/J6'QK\"LYj-z +֙q QY7M)=J ,U!?_d4BZ&ueBG<v۟:}^PzxOpn!M[=7Erop]\ml'rוR{yL3>hkD +NHL7>74G8x9TYw ka&p%T@ b0KOszWE1^DVQ6yDDNGX+ViD]jðe& G(znX[J##Yt9VGRkgK`ͣh$-#'!^`\KN{Tq2&>Z@jm R葵44Ax6]HP.QFke뤒-c8-6 Ǿe䫟,I]Vs8a1ƶ1H@p6 =58d`+4с"tR l]݆^kfzd *g%?ĤmF6y;m2tM&Fw [  j(_"sVe[!rJd~tc;8a%f3-`0n/6D)O}M&ݒcKDK,'\L7ͼX4"}Z\.bJZZ~vim.*d@ߘ,rOiͣZ>6) v2]XNdM U:)iqlZkFrou1". $@s?_[h֋V83Σ" +eZ_t>zwEq^+[%PXŽ&T6zO][u[k[!y~/yO+blcɥm/oRľ]ktul.ڼytB uȞ)1iV܉ +|!?!83;0z $pR@$L1Z\\{B$'\9Qe25`xIc49'-ケc,&!HswԉmA~Lرp,h.˹h@Nf=42{ʈ髱p9%'Kw)~; {bo_TWڻ+ 9Ò`7@+pmy#琡~׏:t;Z$=ۑ +#[5M/]7ܶ9]*.eBgB .dK jvABx+–TAERMLS~S'1yh,(WgeF̡2W2\ȯgzQ]7v:meF/bϿ6jV the 9=?s,&G55 K4C?,VJ;֩BM'J=^0,zt.B/A%W7ႈt9X;ɴk:uk}59\AKO :GzHG^)`O؆6\͖z+V9I/Ѹx&F[q_솓@<[ +B|Ob{Y$3Ι`6mW=F$ V +iԹqNpXCAuO81c. Gfyj@f{Z"Gܔ'$E1ȋ{q>;LrX ()U1N?Rnt@D+x,G5?o1%mۊ:b?u>t#äG m0y4`Q4vԺڼg1R pz9E/\ipsvҨGl 2uYsJ9̸(a_{̸_ zaW1y= rw g`P@T_W ~FP]zH1R4XOiFqyB{Β"{AE#jݙdT +a2htrB#XI%fU: +rz1SiƧyju +7ggtorNl)VZp?ZcqEǤgaٛ3>[zy|= f_ +[Oi ѹh˟h UeZA\:^؈L>z}͹H/10]Śt}|AN S^~Xz Ο>`d;rA\c|g]tfG<3~G>zv{18)K*fvbr]V֣md$`?KRݸnJI! 啉+ّzI)TD!6 M!hc`5LK$2{#V5d;r% Ϩi9d_vZ@?Vi`!ܷY ?O!0 )՘Qu+fm*&ƥ=,n8'ІCzOOLɁ4A{27?0F&my:aAJ:J2hE@d +6< endstream endobj -1702 0 obj +1773 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1701 0 R +/Contents 1772 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1703 0 obj +1774 0 obj << /Filter /FlateDecode /Length 3526 >> stream -x][~(P mZlEq%):$sd'-^۲\4 I)/Z%bLIWΘ)&1AEԆ#5F㯟<琿AQ)SGPOo^ǟ{x#Boz?={'~9FEf^?< DEĩ_8:#|~pGb8xwf"H͕!jW7~gqh2dL>;94' ,Np쌜%6κKt S/႐*..QLd4b^gjY_e]m[%K1|ib܉3)B:Z Vċ|drЬ}wxK4jI#(I[Yj"% Y#ɇ-nJ7ISpj<%~bb4qCC0ixp\M -8Dl9NXDl+=L!91YacT1B) 4F8k _?y!?$#!RZ ._?<)!JR~zN!|9FEf? DEĩ_8:#|m2A9h>o%VnXOJČ-,\ozYRڬ֑CZ)BPnkj F?1N1N8BM!z4a8I&GG "SLv6ˌNXDlSsp$oε |yk\{2+*!Gڙg˖a 2>yjT*rƣt 8Hxo撛'k!iB5-r#S~Ȓ-.]Ğ6Z$%}A(%.IkE-\"o*u!BVQߚ8K-ԯ9sv伿eŖj5;eY(vci\16 S+lJn\>ȟ MWjY0H;ydÄ胑O%%>ydksaY(EWvāv]Tv?^s[6cUw&zowjWX ﹘êgH -2jF/(n^X;)<ȔXJ:9_FWHJB 묋q7Y%dd.{8cڂ|u%اt#@1!s ǯ ~ ӹ|{{1Eʣ3kkт,/SУ$2כ`i|kfKk*S58DXiJ^ٙDA s^\8gqW@ 6vJjrCtIqzf16Kg ّn̘0z29'^X#R%'˳Ӯ6'5FmorZKyv&mcSS79+rqgO#!lAVӅt+KY~ڭ˳mկ&n7ѷwyg䋢(ה"K:,-ξ[y J>Pm`} c$i>¦m^.I,q1tTm~kαiuc/f[zkMYZ/GE ݯe)ZfۧK-y3VӠH. ^m_/O!F{tI{ yE)(_ds0no{ᚲO ;|]5sS7eEn ,m{-Ͼmra?!5\{}<֩QI#֩!=Xn8i: Ulj (ֹ #xV&)|Ubݐ -v^jOp^Zz ӳ+@m -lP^/[lvA`D~h[& l9GMfh7eу@, imU,Jmsځզ 9m-5,MvᅁEPNm :Ok#/kӱvi&S\IUrH -ִ*؞zrihUۗTvUAYuúidzU7r/u&H2hlˆ@*,i<ɮhm) @mOgMg7-Nuo -r yqqjs~_q2$u4G gw1z歮k¾I٫YL,8gqg!Kܖ险9F|,Fͪ .S:m l5iZlKHm).I|G WfPy?uC~툎#2 MTL[}^ s6nP]4ÏxdbR -<@z[`jpDy8@w0{$K-n;7ʖw7| iLNk7\ϙʹ=)V?tnF~rixt^PF8z- %CPtM{rDt']*`όt&F

    ss/;18q{f.E_J.oV*X# ,䟐X?)O4B̨^JdAp|.{ ȆҮ0 Pgo癬yZ[^qd9N|gU +ggF)ka,2rŋ 2aƢM#tcGcьs,z^Έ-L2æ4}Թ`URHqrδ_VOq9;p'4E6R $2\ۍ3/)Bh儴#b4d ':3k +tp<ۢCF 5 $ZX !E -byHt5]hk\E+@+۩ +4dZgTB$d3 -öA4y4k}8&mժT(GK\p9 3ޒ%7OC҄jZI Fh% []= mHJ*﯁ۂPJ JsK$]N"5e[ZE)U"B + (cJ6q![_/r^lyWˊ- VumcjwhPb>mW +,WؔB}?*5aБvJȆ #w+KJ0>}> +ּ`71$[Q"R=|=&e<{a_fٌ}Wߙ2/ߩ]c .b +fZW#9* ۻ5za$#Sbʆ+|#^#)]1.OdLZhoBj M`)eTG_SxJ2H1>O,1Okn)zHE NA\o#A-Nyh:WL@ at+yˮSfg'yyr᜝u\%)~>y0g%D2@zCĞ~EyI]Ei6N rK їd5OV IVsy"QnaeSRa}l׺YP85DE5PW$hUG STcD1k}wjch}V] ѫXfq!7aPoV^U˼pegGsw71 r!=BcX*d?bW؊X;Xl! H=y'l>vS&9tqY I,EyCiOR!/险)3}1pe$[Z9iH։cPY n^jA<ȫEBv!l2mzy +1ګK3m(JaTE&͇qx ה xbPw2N/+rkhels;my%l; e wlGtYhbJw2dX q:~#ۖVˀ U#o.#u#_jq)oW+Oc2vS`m]wf k;Y(G7 e8ײPr: +E״''=JHw5-PfHgbkmϓu &7voyIC$^I17SL^^ٖK_ Cx7BTe d!|Oyqjx`FH#kU}-" ]a;ZO7wL<-8L\d}mT endstream endobj -1704 0 obj +1775 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1703 0 R +/Contents 1774 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1705 0 obj +1776 0 obj << /Filter /FlateDecode -/Length 3307 +/Length 3308 >> stream -x]K#Wl 4' lHI aFK6:Hb엺;JE6gIkg$3+z_ p(gA =pvTHшҝ|SNJ@)a Xopr<*8o 3-/'JT;pO=g9뽰. @B\/^쫋Iʫ.=!yzN 5?<[2FP[ ӷǏ3az~;'Cf1ZZgԓ9c_珅+p* #`f OsgMa=y洙mϲ={ϼ] ݻuB6a]GO/G!k/=ڄD 60N;|9Y#HO_svtZT;Kg_@=;18t\o m0j{) 6T4@JUyIhc􉑁+|c ::/|\I cK.r+D:F6|}|MbfG%%1XL@$0LHmS1ˈ6"ebf&MD0\+ d;wKKw˄&'lwdgoCqVx`3e;:E  !JL ]JEʥ i`Vª JJ^!m y\V/lls69v=׺qZ:A/R!J<2zuRM&Ȼb7]қ僾NЗIMLf!A,l;# 뤚vn^-}Փ8lדo-fʖJm<՘,l$ -+vf*`39l^\َ6H~E5& +N`4:&k.iyV/llG E6C͕~&n.;yoz|uZ=CP31u(bjޤ8+ӓ o]7sz-I17dps߲eM uκ۽=^iIH ^րl%H:Dc \q2`k=+I<3+Ǘ\u F +5|l&-Z-#N偁)N ^bn4!;Ys!;{M?o!;eWfQX&REH67f=-ٙ lggKv5'ْ5Iv7ڶT763L]=z¥).&025TfTy?عZq%׏sos]eۙJa:?u -;)F;)8졖&;/{5Y) -ǂ,tknNGw#($COze6D6-dIՓY.m^>>O]+rM=3UWm4!SV%wBn=U!K8Te LMTΥPHq-OL7VW8_yPWlݏҤ[5} ICN=fIAZXsq~TSX%_VC129l|hЉsS#둛[?g\pUWȓwo[M~@m$^ݕjd!Vq^qWOQK+:4h9_gZ|<9Wwo$yl|<9A ~OtFls>휏;7|v>͜]rGnȩlh SJ/lϗ^ƒoWK՘\5s@ 53].bjn dzoy M3 euF)yFjQ.n`莶%H?xp[ -ǥ:ZC~a۽K5˱}X/>]i&z㯑4i9]jsNy1yjmq2& GTgKo:a+չbF6_.Fd!ǣj~9Z8vmC6/3em6]$iA -KϤ*I Tb n9jzM%:gKSPơƣQ!v^@|`<&5 4kUU#!X"|˒q% ŀdx<㿛}Zl<vO:x_!Q„HZ5fvceb&7Y%vxH_#cQ3Iat0S"M=*#ڈ`RjSEB:LY`4Lbrm72n/$a,c2/PV׿f?QxgeNy0jr*%K\WE(,kw蒥/ l@UqX"-6h`v: ڍ](ktjʷ8]NhEۛ1c0lq<*$}@H +:LsZJ5 bFFY@Z/Œd!};S*,(/K>w2@=x<#l JT)89ěyts +JS\g@_y:ݜ!6 Wdž~1ppF-Zjofb eK2Ohj@f[ܨ/W A q̇ Q.cT q Vcyta2X!CNjX=0缜׊B?z' {-R?jc!Eq\,i8ւOJ5D3nd Bz0GM 0L'"[ pȱF>݊1-W\ºΗuVSZ~~*g=X\>A`[{ǂu8ε'F{Z)&R@x+fGVPL@8X@Ґ i + +\YrPP/9lm HCİU#y,\GIQ دc` MvO^Z'`3e7u Zw6+A`3%fo().^ &;*)F`V/o6Sع~~k8tRoc.J<2z}R-&ȇ0]2僾AЗI&Ooj"1{ [[޲ /g 1hEeq׶G23$W6xdCgnW38/4vݵ "ki&-Z-#N偁)NL^b4!;s!;{M?ِ;VYO(ړln)"sYOKvْ)|$\;[=9!<;³vmL5(a1^~5m:GOh!SJ `Im}|,xsvF;U&KJvS;ڹN`:osjiAGYR0p,ȂIFnD|vN0B<$7(;=SI!3Nt{=uÑE/ǘ>K]|VO2eUP[+dvSCUtN\ +kyrd)ʃbL]tR|e~&]3+XHrRwsN GsDҌռXt*pu|.R@a7@N͝:9߈ڪ>svBGor{j3jzuW㪛XŕzsGNN6"]f-p*?JF1Oodr =p\:U'`^n){nnv.h29|hr;nur9*E盵|<9W7o&yl|<9A ~cLtf9O~ I~X\;n.as{N7"ײ6r)Tza[酭\yTU7AͰ_9=d"fNP.v6AL&>PVgw)&V l[T-x\*57v;>?W{؇5 2ӵf:K3Ŭ6z'[) w)cpl鏭TgJu旃?&Y|_·C[19eٺmYUjL2&dodLZTI%Vzm(qm?[264 +BU6A~U6a7^Qo{_U5% >/W,WrLP H&ۏ3Z_CJ ^kRNvw|&sh9}54b\N]~4G +Gw$]ԈA-||[n#/tOν+8PWW $ endstream endobj -1706 0 obj +1777 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1705 0 R +/Contents 1776 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1707 0 obj +1778 0 obj << /Filter /FlateDecode /Length 3609 >> stream -x]KWX!@$9l0IrLi)ʒIY,k/F{vDR,wVSI$}MXgd -TJIm1Ycd8N! 1Z8|tꜿg%މхyN!h\wǣ"yn_Di.R;"u*H^Z2ydJ/~"x<z?{i󧏅 -ZxT72e.R:!7xCEkO!w -;Tt8$$M݊2*nsWv- vUk5,MLDiZhNA]Y\hc4²x+,I>إ -M%qX˔C`h(% Pyݞ|Pxd2Mď^bS% iDzJzyu~>_~Vir9RM_ﱖj@xfV5uUPjIv%b&\Q}òT= -79ML+ " )}LMaݟr >·]P]`6vua6WDocB`a!|!'0|! -6W$f+vC? d T=! _WB@+'5亇`'X9rSǽ-oCcKA] Dk~.٭Q&> -XEALڬϠx5;.k*$I=J_Flk(%,ei_\d\SܸtAg,#WL\VEA}(^$ DVk04w/59A+/7GduRmd(4lȡcBZ,7CR'H S1c) iϡ|_.)1~Ub\#11JK_NsΘP֚)yZ0j1rF 9~^rbXMj٥°ܿM:1̯ӵ4Ϝ<]Bw̴\Q| #a|Zc?Y\rZn[RLGN!%HH{hz\jVpTґה)g>Ӵ5-*yq[hH -OQd8˔,xS<|b7%f6J[(M6pHlaT-؀q&1 td3Pۅ[ -,}3Pv }3/v) NP6SMI1\3fO%6vƱLd̨jRQiǬYd--+-X=[tl39zSvwH$P!]@qku IPْE^oԼ#"ɸG ס%t&)!:ZkՒyn%w^Rӭz3]5^ZQdKڙMz)}w@~zSn^~׀İ!*S]SeDZTfyUQ.cYuU * ZQ]Va@s/;zc*A횀 e97RHФǒiJiS[ ީj+O--fUigP= 3%[\M P;͓I Iᐈ&yoDWU;Nƾ*R~cؽ(*ue䂇шl7nq\Mj!Z1M5Q9"1qas]!xXA%ai5ʲ '^s8p0\jA=S"UY -} W{+;$}ʒ&rCp$FYvAƇǁck݂]Zk}MPDZGp>FpU5S֑Yfw@{Ǻ> 8t6 $q$$ IULi=@-.H a]AB#HȲ@aH[ 6ʲ > ѱABߡ$={fK$De䂄\AC"\UMG\PQ_ ^ A~ HڵzUHPHI' ]$P胄ܬ $<,**H.9 QKrA6Yv!Ƈ !6:>H;bg0kl;kHxDא3Kդ`ˇZrpK!!!ȏ22AhIs58t -TڸeV$!չ\Qp)  Gy9hP:ȦS'aysHɪS${s yWXeZo=z:k]ô 0+伫\X {X {mqĥ푰tT]dc#= -XQu>8/ڦ:bd N:(H o3 ->JYA -xyxX|gE]屔5z1?3~:=NLn>󜘞gHCx3`{$,ϐţQB<|MbUʧF#Ȋ˓%t -򠃁n-7odlH9g CuުzIg$)Rt|5/3#`/g -d9_W|sksYI<#2fۥr p\4|’qM+\.0IrWf[rmEP RVz5x05/?%/eW0 +x]Ɏ#+p_A m{Çrל@p0d.R>.sq RI2ŝwZ0ۍ3g8 XgsHgA3gBpMJqw]Pq !%3"Xo'=>~gމу?=[zד!T|9 =Qʹ3)JPx/&&sz4x\ +}>.$sVJo,J~?c&dVHŊ],9ךsCT@F+*RZR ۡ2ç 9ij-Tq/Y'媖7 5kX),^7 +SYcBI$OòX,A>)% Iŝ2XC`bJ;h% PyݞZY7'x<`% iYyzJx6~??^s4f )um=VS p]ׄ0/B`C.0h _U{@ Yh`2P L~!&0BW N! a\+rKB`npWcަ!챥ZFI.C"a^X9?QV Tl:L,BlYmTgPQgd赅R% ~Ǟ{pl[E釲*JIJMYW)7<]&c(,*K (oIr@k½vnp{1v0^|"meRL`6V)r9/ņ|4Y8[r$%A-9TT9?56LLSR#&WyGr)|eSb=Zk2%Q wG%&AM{zjڱ0Li0Μq%MzcNڈΪ5Lx> +R~c/؝yü`2^h7nq`iZVI~Mfɮ.n)TETpu\D٘Wեa3/fl&xD|>g%rki$xsZ8\05sP@FaHK fN&^[b$T +s8W:ix \;ATNp(v\G 8GPZ#5bP%*P@?T׍dcro5 +I^Z[ H"d  ;>]9ּD_\WICƇmJ9 2f{KP{U;ᠢꊍc^%R'uSp쪪B]ZeQ]7VYtMikG6UojM#e鍿.k`#dMiw⫍J/16l +WNh϶D{n#]F^b5r6B$~S^j0{6̇y5`o"D]UUK18/i#V>-GFيy_UO Q6&DŽ ]mO +Jy]blM,{Kmv2A"`l]-qzQ_>$qU6dk-]Оu] :Ht6`HJH( +Bӹ{8$\[ +U'$u Q6 a VHCBؒ a,{p !8nw)$D- R Q{AAK"8UMCQOKvCB_WH ZOղǥ[PMO@*HP ABBT׍d +vVArqHZ$,en|$FbAB= !(c7H;sHxE琰2Sդ`Ztpp|H + Q;ABANí9 +*s`mqYf#dW:]70)LMQcw xѩXB0r| AS$ks yeXo= +(,> tHjo:8=&,ݬԆ8Hj:*Te{ [xdEdl ,Y2uIiu猠#oN:(H GRT _w"yn=}Il&?>Qaz endstream endobj -1708 0 obj +1779 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1707 0 R +/Contents 1778 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1709 0 obj +1780 0 obj << /Filter /FlateDecode /Length 1196 >> stream -xYKo6W;/ΐ""}Ec@C[8o %$R6~=u,_|؂H} )aʽa -@! -3XsGOW[`G$ -X_t>a˿ z1 7bD ?n8RPA<̑F.&80ZԻs`'N-WOFj #umYfG[65ثEω~9~Y}\s9-W!iIB 1%]{I0 IP۟cLm{=jCs"DS0n j?8k:@; <e/|EqlqO_ -p͠{ً@/=&m@+ *GR " -V2Lv&]k;6ݜS!YL{a-f5DC^zTų(l]Y^BcS՘adygz6%Eэ0Vke[ƾ@'oh7?a'S^ @}c~bzX؈F\ +xYn6+F | $9< R/R<`%dhWWE{ O69Oo玂G613N=x/,gΥw΁D1_>uwwy/ȳ"!rI9;ݻOEݾޝS zlSs,TF XkԐq7 +}R]KPG.y< ?v)=>x=Q7۶YDqqul3r91_b (BIRN*SD|-r%];J0&H݇۟~C<wݟ5zqWw{X2*Ÿ"(||n$~k; <dL056S7Xr4gThf9 h3uU~܂՜a\bHI#kZ`%f oLV3̶f6k?6=杰Q!9V"<⁡!ȩ)@5X`Z9ty>4Z/yfBXSa Ffq~MfLĐ_ȫ |HBC O@Q2R5SnFTFDuO82_Sn֥_ ~_!Eؾ^`!$IjijE > =HjRsDL ]-UBa⴦eXm&Jz?QLqM͞ばI6s&w&\ Qi$&*+煻ゞN+~:P0]~lJ)mjVb>ȹy^MDĢ$.U\Wc +Y]\ж7* YffUµQsu4VC.HV,U6b VJ+xJ1 +Ӟx~w +jBd6/.mCq"$T6> endobj -1711 0 obj +1782 0 obj << /Filter /FlateDecode -/Length 2632 +/Length 2633 >> stream -xۊc_hU*J!lId7<=2CJ:7Υdu$*pcb׃5+3Fo?1yc X2hG|ÿy='4l-G>8g$!πc÷`Pjab,`Bު S  0<ڥAZa*(FC\sl C뻓c5YXm6 [#l߽䥍BzB<|9|۟;B2OBzOAlL%fy|0#F>s瞄gEi9 w[n~n7Rqf.(4iyMN8=Ӝ~jw++q%#OaL}%=O([R{= pĹc r"A̮F9q/)L\=&)XŢ|>b~8T<)jd\ 2ׁ"_/Zm2̊D?o^_+V4G@̞@)+ 3ؼbqy BHH~ϯ;+&g#O m -<#9S8:JeE8snv} B35B+~nާv yMJN:af0uyy*yJFSt&l2jA6Uh`[ GZA3$s5!e3fd M3/Zv5x P{y(,.#<6tz` -O +q*fߙ~7m`VPw/nʀ$,uUʠsS:_8uA2A-> 7wPI XnM T(2%- KY:0Ө@:vhn%Bxl"Y:0wzj]pW@?Ϸ\40 -:A^ʲ{%+lM}F|9Ec2ܡP*VXdW w'%Cɗd2WZc/I0 d e6VjTWK -ɛ䒳STm a u -:KdH~] up@Ԭ[ -K{! pKǡZIo0w -WRr -ӽ]w'4^ժdzX%1Jlс8:PS¡Ѝ ۄ<_C=)Z (-rXWPX P=Bɮɂr."څV-jRb/R*URz޻פ˜P*QWX(-E<]k aNwXUҲ⮼Z )rnsOsBu^?bxb:xsr{ji0wTS S/a WrD"[+MguQJ+dzz ѐ 4q$A ܷ.Q$HjacXu2}l`K{Yl?LC=gI t-xOϾWEl$'Q)#X&Q4"\BSngSCf<{ Hsd!{9=?5=\o`ϙu9r= +xۊc_hU*J!lId7s瞄GEi9 2Ƈn("]dgQ%h9?5rk5a;sVs4O[^Φ(P| +c2;/Qdz>EFSlMJe@,3X g*yȉ2=54ßD9<`0sGp;7|n+Xâ|>lq8T<)jd/duD#_Dyer||`\_+#^ fO ~%+ 3ؽbqy<'yc,tk~; ȀH~ϯ;+&g#OxF,sp spwp<~=t2=3&䜛E>T t&Yg8wxSWAZC}ðyp3sgYJc~^^ +i8Tl$ -hDz$V,@ I|G@\MHL$,YB{ ] )T^( [9̼mo " 0èY[O3%17.ZƒOw2UxJ[s]x LX^^[?ZiqU] 2`0. K*feЁ /]Ɓu荍 ݄;(~_nMVW h%Ձ,P[ˤ@:vhn%BxDJ v@u` +wm +ޔ%2[իQ#_-k($oKβLQ$tr4G @%ީYXBytk8ƞ]ީcl&)I]np?cQ +)Ũ~MܟsZ0eg0RNôydRD=phLlVu6p%$*Z^zcIY-L +; պn!Aފ' !5^g@Wz;HL\\@F0" ,5.\03)WNw)J'Dh<ź N\~ aAH{ͼk[IV)M6*>*ث~N0 -9MTl\*ݡE@VmiW!$ƪMԪ{%¼-w{q`AE mShAQE)grP5]l]X@ޅ^|>JzCOS0qzM,E)1;=ѕqwBcݔpV%K.iȾv>WI[le/V.7Mѻ1+bHol&gO^/ÍJb]׆GJ\`/ &6K|eoCMԐsMO[IOU)x!Y!}BCu{1{g(^816Z~=u[9<5=t Q90@;GT%k (AtK^ܫ=rϞ`Xjs:h|Ygm{^p/u}S7I d'9:PGjPX{OZ +`MEY{oIiX@iǶ¦MB1JvM^sQ.D؜jI|ٯ&%"uAs@%ܽjRJR/b{tӨu<ָGi90_/O("XДO({êw6o/)sC7|ʟ +CϮ*㡭Ջ}\qyܵ^jHJ| [{'rg_%l=博PZI.3K\\% j徥/u&ERS-ŒDP379`C[57|dsdJkʎڋVs<2>t{Y"OAWn8J{E%*%K%kF0%yCjÃ(_廇BwtlOPrCAv_w?}8#o4Pj=GIp-x}odHORGMiB$x-9=O? =\a92VM<>t=\o`ϙm?t9rlSP endstream endobj -1712 0 obj +1783 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1711 0 R +/Contents 1782 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1713 0 obj +1784 0 obj << /Filter /FlateDecode -/Length 3378 +/Length 3375 >> stream xۊ$ u,ĆuI3;~ȑJ*n].wt]tW*UY>_\pFҿtK:7rN`׀JAA志x Z8)wW`W5g.Ua @@ -24243,81 +25320,77 @@ m 1MP3*.9R&ҵ;7-&.m"U;تA %<fnC)PZS{cylpHc lGp(#!%e\03խ4l6l:κ=R+PAB99'wsfccsf0U YTڄ5sLD(qi׵b_18eG.̢n/&^eW"-~ȏY6YRe6 gsr3؉7m{+ ]o@uk׿E,ٚN9}X}NͪPnNJ蛧`K` )0[w Ԧ72AܠPoʹ(ۑbscyGjqdLN3'=buO 4 :AM&5\|q;G?Ą{5]#Z7y|t`2uYg{ou!'3r>zi8ypt┕~܆ Yޥt=Q_{7ͯh_%VL722c "h24u5dsΐ$uƥPnNJ蛧`K` )0[w Ԧ72AܠPoʹ(ۑbscyGjqdLN3'=buO 4 :AM&5\|q;G?Ą{5]#Z7y|t`2uYg{ou!'3r>zi8ypt┕~܆ Yޥt=Q_{7ͯh_%VL722c "h24u5dsΐ$uƥzyت3ˆvO.1:]X endstream endobj -1714 0 obj +1785 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1713 0 R +/Contents 1784 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1715 0 obj +1786 0 obj << /Filter /FlateDecode -/Length 1733 +/Length 1729 >> stream -xZKo6W<  -}E"%)RDjٕP/䕸əoFĘY2cqQ~YĆcX$$2l迼~! ֆzD ˇ={B;C,|H9f~.l 3:y<5BM\fJ: Ryohx!NV5quT;v(\׽N| {u&yd'ײMllo:$Z6yl0-w7o/o{@<"ZN:#r-aIu>w2r79e~G9:4;7~<ۿwwwgB@NHG\DrI2珙5 9(nVVɚ:Ja˷<# y^9?51e3qGO:7?:/#_#j~7n^m5KMnfY%Kf?ƛH܏afEy bW=URT8ک~Lv]Qjx¯Ιq2Փd !.&3($0L [(t,]jkPjbA>9=9E+DKP]`.BB${"/+ Ԋѱ̑ɢ$m%\%krK&-~BF\D,hฏeL6,=Zć-΂mŲ$y -xT:\ D˨w)We ry~zYD^bz **{LKjm|XՎkRhtbssN^e}g& rj끶5yxA}3IbU%]~'1 M os'aFɦJ|p9s<_.QLTXP>:]A@LP- -$pJ=B$<4? o!i%-k, ,:4OG-3-e_iwĪR2ڏf3_\ԶDa_Jln$NB%Թu[据@Ϲ'dfRnu,M=j%&47BjC%+ZetiEh k* ոV.(.Gw#zـLsU:e#)E_-H} 'DrJ8/t|셚ɲl)^ l7V"p)ւZ=ڛ[MJP[|t%iP(}} oMa_m$J/M&PlulKN߆yx`É/M"O/'zZZ v-?]Ⴄ1]^6@fd5WR:/ӑCQ1k%brCɇ5R$ R_{1V% ?Ҡ'wLu=(btI 巒NkSŜ$9Rz_~>svL"{''p~w}or8jal}{ʣ[7M'k^N! rN* H_ϕݚތ9_&   &wnN݃AiR̠m 7CoEDj}w -!4=̺[X> +xZIo6W[i{h.@у=sI +$@)Qf4P8mV>߀ &to?ݣHO:fSD6ׇvF6`S\@ね!h2;P2h`${HGó vpڱC}pb~"0sԙߚeӓ5LoeX(uPImr#`"[>uo޾_&xDc獵u(GZaIu>w2r79e~G9:4;7~<ۿwww3 08;#h=@>)Rf1&!;e?fie묾|K90ènYø^6C~tls3lr}?5ҭwLuaȐ`fY%Jf ~$G0^{^*.Ellq0uEͫn \3d'ydA\]LfPvI8` +33IBɚYOB&z&3ޓ_BJ$5^ts + (. $R+2{Dz{0{k$`sd>-N ,hฏeL6,=Zć-`oib<<*A*522jܫs$'7qȫygXEe^Y_vRQqbPJuN[},ydjW.syfW.'>V'qM^?/a$usU%]~'1 M os|O܌M,mK!rb%^ G+$eA@ XG*DHɊogr*[nZI ڃ.n)v=QKΖ2կ;bUen)gs\#ϑv.jdwL0/%67]$$NB%Թu[PS;L[ݱZU׸fRIZ#jWIlJmY;]Zcv$S-k* ոV.(.Gw#h@D&9*AYwHJ"Ǘp^B"4oĢ(Փ2Znʒ7g]:>ʚɲl)^m7)Y5Eҥ[ jm]kojo5!AIo]+O+XնHBDXl"rg[uմw/gc\u6,g z !%M*:Hoڕ!}K Caiw.ѷ@"t Ɯ*2gj;\JHG2Z:srWXWn(Pӈ-A),w1jy4b܏¡4ٓvDp&r~twMJ1R`$巒NkSŜ9Rz_~>svL"{''Pϯ? qh<GnN֘x9x3,ʥ/;tX"Q~=Wvk~{3~!X_$D ,a> endobj -1717 0 obj +1788 0 obj << /Filter /FlateDecode -/Length 2699 +/Length 2698 >> stream -xۮ_e8 I@$6-M"u^vl@g(J$]}h#5+iQO@c -莗O|ɧNTH<&\1@TXVyg>~JP+s 22wЬs 3AِBX?8Vꆗ_ V&敧60?^h ^NuLFt 93s;||}CF> 9sg `fRZȆYffxSvv

    @srỗFuV umMZ:#xR|v3ʥAB^[cI]F.)OQ u8ꊥvcmXop$vAl d#-Tk $\q_٪\*J]C!:L2:Hdչ߯6e %\a$Un!OJ\y1 T=nfBSH6\lA __ܵx*!|TL{1D^1 -T -)(~MĢ\qh`l MHG-/B j-I3x;UZp$GYήqo|>/񒒁%*uKG6.Э 'bc L|@v~qms=ssg lO;0V,z`qQM!+Z.=i9qmtE"oCFTs<}`9MF%}l)HN+bryUޥBqW5[}jʽmb 9 Kq)yUUBZޢ4\5̀ cUCܹd`|6rN%t$*f-$粉}ds1EwXPh˪%M(V#.Q:1G)]:Ҷ)yJHhX QQ} 7DARN3^YTj<ЅjrݺH-}K2oϠ5>Zn7q>k]vUpTa}!! +xۮ_e8rH i8mRy8`:(,{tY9dJܯ Gͯ? Tѓ=^>>N_c!_;?+tV ģADT"jï4GT^k Rp8o~~2T)Y~:L5q0)_1㔧|BP3a+!ÛCu3Znxٞ mb67ij#,:s_?kz=Ek'rr,Ct`52;Gw=>Lj0M@0~{;LEaivv ';3/y'ӎYͷQG`1*vBGEh z<굊1{?QHۑ_ +NVF/92Gropv)XŢ|dynYX_̛38=Ё ⎳:RMb|Ꮳ1;k``L9+~oL PfN[ƝGK6Mkr:rtyud,PhS ę́Rʗ9 rʽ ȅoj 0@&I>#Wi*WJRjPHVER0YuwkM!D+-`i[\X'>bAJŎi>ߣaFR:FDme ]TУb{!k ^EcrD,(5̓RY WqYTjwP,g0&:KǾ KNu /-aX[NXPzʵLҞ F_'gL Xꅃ9F[6I%V]:rZM~$`\/b0yLV +1Y7ɚXxU3rd?W:V󪂽K? 'j#2* {ivq)yUUBZޢ4]5π cUmJXT +f-$粉}lsEwXphCSS9UHKTNlL QJꄮ*m +-u^[.0&=sgp:R\>T" $'3^0瓨j<Ѕjrݺ-% NٷI gg}n:sAsBz7fy<1簑ex|fU^&s<3!MZg 2xT9USʐShno#K'y3>-P1B-|p- e댹fqNl1\RQ7[dpo ev}^9z8wbFLȓ-$ʩ["4v83 լJ G|>o7q>k]v\a2}!! _biHL -!)f$ +m*k(kKQ4Ek+ZAaYCtR\sZpQեxޯ6D?ٕU^ !!-yn_(mZ|ucYnYI@/On}%^bmA7tm2u5sJy"v]|kESF\n*&Gt@踭_m%N>[pt C2tM9ܘ0ŒlcѢԄ<P(~՝m!ܽڱ!,)+VliɺiBmŃi)9?7KGHQ rwG -@Ҟ J Ne`8+ȳx}5E}"ou8 3: $6{>@)SbAMflBΧ\opg:>t_7 +!)f$ +m* um)@}mE+( k(.!g٤Ae9GUBJyڔ"TdW.WmZ mɃp}*DiPBvJyOiWLKӧ-Ux_c_yN)3^GEšk;zR7x- 9f/392)ۖZjQ\20;,m=Wu!)7jByiD9` h6z3%.-4)} |_MV˫BEm j+wټ%e߫3 J5H߫sc~KEBLwSVwηpj\sXV%1(m _K<\t4= +MGcp?w?;3sv𲽴'/@x0C8+Ci}5}Cڈki@`ҟ(ԥ%V/_/z)Cf36Cg!K]To#e\)3c S/K} endstream endobj -1718 0 obj +1789 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1717 0 R +/Contents 1788 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1719 0 obj +1790 0 obj << /Filter /FlateDecode -/Length 3428 +/Length 3425 >> stream x]Y#~ׯг,$m`I0~Qf R&E[]}ih%?VhY׀"9_>>VtEK:W|}>i/|ʻs4„!= ƃZ kOtZx)}g肥+Lr<;H?BO'KM%fp_!= @@ -24328,57 +25401,61 @@ x Ubyc5x^CKFZ2|~Ώ:6rt9~9)8 QT±DAKuC,stiUcXIgƩQ>oPr HYThǀA#Ct< qɔuYeZѽ,-\U[ܨ&Z'%.Cp+Fw]enT:K]q2dZJSh빔ch}Sg۰"Yc\,opT,f?Є[7y]AKΛl:{'@,f|n0.y (X8.apD2–~[2$w2rtM2µB ǒ~:RwcK22*a`ddWHFdl7#b K@r~>F4qd s .7m\!J6Pb֬?cucذ/P73=l2_xr͠8=j Q3Y85XөVe15tadc@ĠSVMWn7G<ftt 9:W)nc-JX@=ç*e7C^[3vUi g7  <(o+I8K&ʘ ^[[^l'2m5u(tehtՐBdT3 MmhM,f恀Gsu&ۺ+np_Z o kcѿQ!,%܆u+ʥ=GSVDD~G.AZwCC}ڠ[=l}Kx9hd@x6g<2%ӣB?g&چm\34mjDjvqI?#~ے~&ԓR(㠯]lTMY9k3 CZO3-gUFD_.gpHʕ!޴<2k%5!c4xdfL5@f5,;()Cm_Sl{;؝2;;:ZchnDz 6O4lI>em r $?hƸn>fr׌qFg$Cw/p x̀D3#c-I}XK#*c L{eŀyZ٧,'/o@'ӡl*~^>_*I:k 0Ƣy}2w?}(X8.apD2–~[2$w2rtM2µB ǒ~:RwcK22*a`ddWHFdl7#b K@r~>F4qd s .7m\!J6Pb֬?cucذ/P73=l2_xr͠8=j Q3Y85XөVe15tadc@ĠSVMWn7G<ftt 9:W)nc-JX@=ç*e7C^[3vUi g7  <(o+I8K&ʘ ^[[^l'2m5u(tehtՐBdT3 MmhM,f恀Gsu&ۺ+np_Z o kcѿQ!,%܆u+ʥ=GSVDD~G.AZwCC}ڠ[=l}Kx9hd@x6g<2%ӣB?g&چm\34mjDjvqI?#~ے~&ԓR(㠯]lTMY9k3 CZO3-gUFD_.gpHʕ!޴<2k%5!c4xdfL5@f5,;()Cm_Sl{;؝2;;:ZchnDz 6O4lI>em r $?hƸn>fr׌qFg$Cw/p x̀D3#c-I}XK#*c L{eŀyZ٧,'/o@'ӡl*~^>_*I:k 0Ƣy}2w?}> endobj -1721 0 obj +1792 0 obj << /Filter /FlateDecode /Length 4330 >> stream -x]Ɏ$W8ŝL`[lda5 HAf2TKmV5յ0,yI F!ޙ/[AwH/@h?*nL27/ PzFko~y˿^/&R 6Cϯ?|Iӿ_Tv -[ם)T|0:zX9O}PRzgiX单q9!"r11:!Jǟ_?ݤSʈǯ/@+~_~eRDU,de![t*$y߯o|:%Cqz>>~w}-[U^s8'xш 8qGtiű_vzl{Du|*mZjEJ$ܪ+ry=2Qݻ-L3vhwx֦bXos$ȍ®]Mq!Eʍg*C$g&D>x:B 09 vֿ%·R9ȍlR=P$VQ/X^oK:bo9m#2T=ruF1 lrFHc5#A -1תּHҘqPJI| 2aZT^Q6FOӊ\t¸Nrty?m^NY}eS3#Vҍx\̚4rmq׈\2iEK +x]Ɏ$W8ŝL`[lda5 HAf2TKmV4ݵ0,yI F!ޙ/[AwH/@_^hw &ƛaR(MOj=X__/~ԃR!oן^$q/_D*z;-*>xb=on_X9O}PRzgiX单q9!"r11:!Jǟ_?ݤSʈǯ/@+=/2)@*h[2`RG? a^uz笣Nsa=)aSȊc,h(iKR =hzt,mU|gJAi1 '5ؑHcP2Ypx# ''5,1i99#iktbӏmh`x58蔲<=A' sD @9yiG&\7#jR~ubiI䕡)ѢXd+eI*r&4.PGݮ et\x5R;N ks5ME<8u~]NGV%eIx;n@_fl( ȇw|4^^E^;pc +e\{3 FO1J%z. :dP0]gD PNZ Z'iE?:aC's +^9:acJhJs8tZvq +b3mC(pΒ#D 0u'tz-Zr0'fE?`s +^9\W:69\# +ޱzx @ x LV?VE$i8($\0-P*]/tr(NiE?:aC's +^9:6/,2)+F}\̚4rmq׈\2iEK ,)^G#KQ8jY~odD _!^Z7P G-7GCp:09ڊ 8gTai/oHEi~ ZY0/m@j,ղ+ٵ;ښ<~Pb`xB7Ȥ#df~*dyv^SE5I5䦛.K3 d-_lȀ`o1R$kMBǑ4WD5lbtj~='G%%d2ƦC1U,V*u |guJ7z/JI9sBH52.ۑ윸YjsgDr֗屟)b>#W&NܟP}kk- *E Lڍ[Rn[ǎ{WɻaX r 5~"_\6JNd? /ƠĊreq\$N%`ٵTPvcL A$y5’ Z؉?kE;2`d`Jc[zz'56rGBMd`SPڅѱۺ#Jo1*|H9'Cb|rwc4kWX5Z|ʃ\9 YSAn-4Ԫ բɟ1GxBJ+8*઴T˩ȩ1r/*&'JE7 "9aGs,)4}OpNb0/o@W]/y]7`pCTI0|ϐS gxJWW<*>9鶊# QթcwMV F6I"=a&t5DK -p^0bnQ-g A,wC{Y`uM7Xb@lؚ!Ò9Pe# %t - ߀WԨڲQz7\wto"CsKN#FSu(xzl.B+>oϦ+>2Mi~g5}Hkq^'lPve~ ͻ׽3p <{ebN@,<:c=dz13u&?gKMz o{%w9ZSM h~@iHV=w &`SNdld=nK;*At9 Ưn*!b^>>j gJJ]Nh@kx -,+6fA\v%"eΕn'OT\K䡱_jHzyÒgVr Ng*t>{8=h5^ 7 mc0z^-, ]YGN[iyi7JZٱfwmajĵRCՕբoJNrou-]6(,Iz] g}op3Fv'kV>OnZ-GGr|`~rߪj>JoLetcH @?}?oZɆ=j,0k g%Ij?ߢbab KT/\)]~`߾Xv_ ThI}q+&U 1͞t^hAws[tv^MN&(ja)\|Ôzl%-)K +N05T(R R yIJHF}* u|Ω"\)K%ݔLg?*|:t'n>)#d\&騝b[߰8Nyi'Bp_qGV#رzj %rx6= chyv'4Y&Zטg՚knyu3׎쓒mJRwpͮca{,Sްߦź?(EIbtB ĜѺJ̶t ک==K"R*QA+޺fܺwFR@b$EIM9jOqeHvN,w3"f9KD1K_+cO(>DUKD˂gtMߋr}|`&A t@c=+0]oznN[|r?Z/S.]%'ƗTgcUbZ8@t0Zo ZHf1 & aqDDܟص"02 1Y-lzܓr#&\2TB)(m]>\xݡY 1Mnrwg}k9 +λ\Q+TlR,-p嗭\9 YSAn-4Ԫ բɟ1GxBJ+8*઴T˩ȩ1r/*&'JE7 "9aGs,)4}OpNb0/Swa ѫ<.syj!MWg)38/IߓO6(;M2W^i C~p2JI1M^ poYL2=Ƙ:_&=ЅߎǍ޻-&4?r j$LWL){k W2ٞR7%Utbl:^^W7HO1/Bo3%% kXy4~ _5]|cw .tXzRK_2D7'* X/vJ$askl +o^t:=Cw/vX1vXp/vTzp]q쮬֌'g4Fx%FX;Y5ZZ[jQ7%'9vη.FGl${FvZpFyx37#wG_+pCU'V7#C#9>0?H9|oU~ԎV}%7?:x1~~7d=j,0k g%Ij?ߢbab KT/\)]~`߾Xv_ ThI}q+&U 1͞MC;'5]W +BD`X +0廣`+)gCsG j? endstream endobj -1722 0 obj +1793 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1721 0 R +/Contents 1792 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1723 0 obj +1794 0 obj << /Filter /FlateDecode -/Length 3494 +/Length 3492 >> stream xَ#_Vuy,IL Cw{6lJ,W* o(Y%F*BΞ_~9}=IA|Mz2^ڻs†B<{RRϿ~)^JY)+9'%ف0(8rk)ybЅV;a8b~9* ! %Vje_~9O_~<+-??d=uw_)KH5x4 UgS @@ -24395,54 +25472,59 @@ s Zz3YNН+SD$iWBN_JP"bK L<),1'ߘ{l?Tdux/0x9䝩~1.at9Eޢd*\D>E^ h0TYephǰ_+0׌ĥrh/PDzj?~:o|J9!$mIg&y;i]R-93&hE{V1;NRߺJ -9aKds.D{\8R7(jdfe] +9a\sWl7D{\8R7(jdfeC]n endstream endobj -1724 0 obj +1795 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1723 0 R +/Contents 1794 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1725 0 obj +1796 0 obj << /Filter /FlateDecode -/Length 3101 +/Length 3100 >> stream -x]K ׯ?$ lCrLil$]ݟmV2zQGRYoKTJ9w~U =3߾lT1{9;Rϑ"*O9lU:x&2Fy! :_>DJ t,虯,\kkl Q /kTj]_N4 g騒ӆ/~Oˏg2*c>y=rNr bB3lP4*IP>Ȍ7t<.o|K!8rt.Ȇd-gV0|y5qCsė`_=fp> u< 򅒩Y CO\f%hpYcA`T"C%܏~1LG&-!ef VFWܠ~Zdٹ0GߑVI;á 0T+n?;2me|=$#` kp5hd -T#EtQLnfGp5 ys ajp1n(ISЂC -g_F$Z- p1'_()кc1ʷ7`U@ :߃1 Y)u%MH*86w8![A{=$M.bthtf!-<Д,1CiHU -qvAC -Xcߚtsrkuc il. 4)Яt0U -4ncpysLѥ9ZNrH&RK0`8n@Tqv6j9,Xւ*lN Z8c'(ȚfXAdB^LS'iFI6]z| E-^$eY Ù>,>Buq.Mu%qŮ,Zfd7.$hF``,SФ fZ,8lJ>xbeط@2萓e]xE8و^%O9hW$lx#٘]hӂjU..(≈ZJ `"–ͱO{xh%" "+9؂%"iA=z_Dıx -MW1̐IJeߔ 6^e Z:]eSzl7cnXAQw=BC=ۦMe-'!"NҸD1" )"1PUɻDXAZ+Hx@:U,PxQ5'* !ȯ%!srǗ8JrЂH^ϧyUKj(+ 5O*Ny)Wòw]V@ykMݫfm{Gi:e쉺>g?#04P]B6¼gag HWLUG2#'H0I F(dpա w m:R"[H72}XvxGA* *bAz[6!@TfIG*9:9YGI"0zr)qGѕutс2ѡ*0zd;'# :cr}?t KB eE};A>6xTY*kN0VaJv0H= =AWFGP|ЖVA僶*EEF߁ΎXn6 ,"^oR_xZ*MYt*@a RpXNpƦDX9=ѳ3>RMRT`nDdN^AJ[Ut&!5OhȉV {XǶ_X;:-{\u!eW1+@>`ƚ&!6%if~]nYױax} U0![N7Rwh93(XW"R~FGJ9뚪` -,x *o}jɹ軜wA.w_t-%sAZ:.+t9ĄZƿ4gԪ >OhxZ:QزO1u1$3w8vd jFSR+nN7=!b&$S';ȇT5+C]<'? -ڋu kD=5_\^uCOO>({.;^GնHpOF:'8jB1D[_cɴIAvSLQOV؉ᙋ#rhuk3@erӚV2!p1/=ǯhvmwj^p%JwarjM;iHMv];)1Hض?l{g\N]8#4m*ԃt+MS+,[T*"Bywk Ub|HS*gG>`zO6$FM!UdU4ɉ6LUC\AҮ9ai}z=|+- zǨ6'?k("DB끨@Xmj2[*BíV.kq Nv̡Z^E2@2@z  cxMN 7,{4d9֐iNiiH _JQ cCkO߆߈c_>YAE -xA&?\lq7禃s,̴bBʧnx[< $à򫆩 Lrm/R{*(ޛX?TlN* L bK@Q-:6~S[-`s0 +x]KW`6!9twf)ɤ,Tv!öɪEΚ~C_rR1/o'bK}vQM KR>GJHVyg_~ϩ?f131SɗWй|'ROLh 5}MO߃W=uoykr࿻5QSW(ϗ5y*ڧdfMLZ9 Urڐ;Ï?oLF`/~b-:/!*fQL҄Afxx<2?^ʏhRc-GRZqQ9K6ڲxeܷ4㨙P7H9G| U1SIPu5\me/Jf4gqp_=߯2+)EVk l6}2M.g(~Pӎ5dWl1[wTKX6Cn#pW" ᯄAod90GHT&L2a|620{Xƅ78~_kanՈg@E +Ts`h&!u|TFe`|H EՒ +s򅒝 ;A̜'V޽c4 hѠ HV-nZ֡T6!G۴y6j4 +ڃ:FӑI֛\r~&ӹ1FطȖdCS!W)(O')` cC瓓}k~ <60A ]^ehS_`)Bi^1PNaykLѥ9TZ.rH&RK0`@Vd;;5+^[ձ16 2: drO;pOGkv{b +z~m=D c it vyF/:8qq}O.8nzTp%}p\-#J| +} ᫀGr[tWT!A~lIek{gD +?7}h-ra|P!fjֺSt*@6@>a݀NpM _S=ٳ3^Rvm~L%rW=nC9yQJ&A@z&6nm&!Nhȉެ@ nxcv}[ 1JCʯbVR~=Xk$z~ 47O5Ŗ}ӡ;5=O{y@C]0![.7Rw8h93(XW"~F-%~FMM `J,x *ow|jŹ6\xwA.̈́w_pt-%ZpAZ&)+ +Y_Ysƿ g]|t:92MF:.,g^ s8'cH*gpۑm?&G7TZ_wcp$wRo +*fѭ@vwv*=_ygfrg詵wfW82{x-K.䡁_<7Ymv Z.ŴPĆ!p1/=-4J42!}t\rK6;wHzX3a;N<'\*sʇdhS\F 24ua*?ek +Ԫ›)r*w6P%ƇT8ervT K{䙈A);d"INt`z +5q MS_wn-ӧI.cڜ|m,Kqϓwa];t[pRwb/r~~N^t Ll ':ZO 49O ޱ01k@H=!a,|)E948e}?~Fr-TPgtu᏿OrfkN~smZ͌'fkv@?3Zo;D!OdT>0[0܍)8 +c y-`(!S e23e=Ee +(֌#:6~S-`?n0 endstream endobj -1726 0 obj +1797 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1725 0 R +/Contents 1796 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1727 0 obj +1798 0 obj << /Filter /FlateDecode -/Length 3328 +/Length 3327 >> stream xɮ"CdNrHY 9M?"EJvIޛCm[Y+kcY?~}IጤMvN`JEAn.ht&O^@O}%@Wޗgk`!6P8c-Etk.U DqhiW|"N/` H',F=gLLZ @@ -24460,24 +25542,24 @@ r `ɕn rMW'㷄|(d[ɖ߹< fl{jkUDŽMUtWW:a(z6{1Q|^c4-~}>ի+xzH7Tރg J~3;k1. VV -ClMן2s|y/S >rhEt&[D}N>&Q+J!_kG(h1J鏙A"t=xH4-cЇ".KEE| pNJ:*h |}KaiŖZc͐9C5[QٔB>*VbU# ae@IYC%d0 $h/U/.1mYb?7R!SX]AOnǟҌG 0c#c(*vPyQ!@ +ClMן2s|y/S >rhEt&[D}N>&Q+J!_kG(h1J鏙A"t=xH4-cЇ".KEE| pNJ:*h |}KaiŖZc͐9C5[QٔB>*VbU# ae@IYC%d0 $h/U/.1mYb?7R!+vS&}.{ h :SAȠF~Y|dl<%2V_s*o#9*C@1 endstream endobj -1728 0 obj +1799 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1727 0 R +/Contents 1798 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1729 0 obj +1800 0 obj << /Filter /FlateDecode -/Length 2679 +/Length 2677 >> stream xˎ^_Q?(z9H$d:{R\둦mU.IM$R/d1P;>ph0%H!<_zoׯ{(ٛhmL!!QχϿ^j|s /Q;(ښ:r@X[J͞ǧL֠́a&uǧ_}oGp&^?~bzOǧ/6Σ _ |~s:_@ڵ0@aJt$Ob|:Ǭѓݑ!Rr8rU"G 6pɂa7HiaRfЃn{Tu- 0132 C>na&0cRL)"SD1m^}=cB`$d,-pr @@ -24489,81 +25571,74 @@ x N; zPVS01W] Eґj" .h.R/ Hu\:Ԛ7TwrOff,,{" Ί^d`&Kah -rB< A;ULk)'gS=@ΜJ B<ΫpBc *l ¦ھ\tj,jo,iw;>u5oe]B&:>Wu| ;5;jYp۪]kB(n -`h('^S:u+ƚ Yy7t/gkO %;uVPf|N?>(7C0sv}=4P$ u +`h('^S:u+ƚ Yy7t/gkO %;uv!^\awN>ɞw(vhb}\5t endstream endobj -1730 0 obj +1801 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1729 0 R +/Contents 1800 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1731 0 obj +1802 0 obj << /Filter /FlateDecode -/Length 3141 +/Length 3142 >> stream -xI^ \A}!/Td`d2̭:2ɪahUWp;}p\o.\p(_cv.~h'\@5aJI/ypR:J `=;~'./h5E(|8<"z@t( -##v3Rht4 -~o҉׋B)<_haN(69u,-t[!ƠWH,7-MZP"I9轚 /0:/&F*0׏.?/ۏWPY~|}?\2UYH.aH'O9\#ʧc㥌ăE9S{K :9?+Mߗ5xOn33Ϸ$(#g#q$ 70636閡ɺŃ["# ܹ)weK}I\%w'=E93.] y"KS'Q[񷋨"@ Uc -DKɞy($/U20./ -k5!jSO؂1#8j# &Β,e fY:εc(zsD>3gS5eɔ(4p,6k> M#mz)~iRBz YZ['(ޡr/ }hs.9%,dR3p|wNF(}zce&fZH҃ \4~'4LW?VDiL w اyE5^ќ\IiRnbZhR ->^cׁW9; |-u"Ο_uR6mJoh'o[_JB_8aQ%Y Bk4$@uNamc`dv%}n9..\Ia oCM?ſ h0G]WZΌ0*6Ym[sٿedj1җ *jƱx}irߕ~ -FWf&2ZӜSN~)2A.}3᥼%i^~udwxoBF>^ ÆWzLx◶S\`r2ݓTveWae_M;qe1zeVHOQe?s}7ϘIe`=:#<(rfn}x (I%Sq܍#m&L hG;0OX) Sz78o vxp{41Gxr -˄V(˨6m 9U;jג2:01(ڪ,}ˎG/дD6m.;*g(;QaZOڱ@'Gd&^@uݖ9ݖӧ-Lu[n =-'{m)L(Vhw0)mamJs%'0ׅm8{+z$"L][H|> `ιStRXzn`MUV6ɢhD*w1OhH-8 SQ1aהp+-yY}RDK -?pɺ ;+kt_7,~2O7O ں'~G񟛨]>'m>Xoh*e܀$f>7Ewuyڽw]no'e?C> +xI^{>ؐAQE202IVdU0jrc+lJ^>8o_.R8#_cv.~('\05hRh/ypR:@;~'./h55B-QvqD xc_OO@сFLp NK˧06TJ:*QSzV B{ svvBɩgnI2ΐn j$M瀾@`鼾lo 8kHN贁04L`xx) 6A_?~ㇿo?^Z^?\|?׏.x\T*,BrHȆ X~#,xЧiӱRG|tN0!;7r~ɴS{>7`s~5vf|ne/ޓ -"tD3 L"&>Yxp7u+Q}daҙ;7ns|/霫$gH:ѥk!ckI@"j&Zy՘QnRz'u +}hL.@{' {> `!ݸ)H3HɢD$ uaSlKǹvBG3Sq6uXQL֠чb Rd?k"%tF?!: R'5 +$f/͹/.,˰T]Pg'=nu e|x<\Wז Y"wil$9Z-vs;Jw?9H/ Вn]s(,`28;'tX1 +) +Am=E}KeX@xHK,~@o-e|H.3Q乯~*}16! deR-Ƽ]=U!:^ NK[*8Ay@It)Uq^\fl+]z;Zvʐ( ($ؖt4++#I8%[^l@"5vxӺ0]R+y[XN֗XW8q3t~l"Z䮏P^) Ԓx),_ ?|dX_7!~m7e PYo |Iކ{9u534q'?1b-UĻx24NL3USIp`\OwQVl6&S3&\h嵙tssWxxM N/kE^|jLe~<"zN;3RyUH[*T1f>tlĪwwfڮ4TC˅&Bl9rę`6=;\x=A]6oqפLͺ&Jӆs=#E-Cmڵ4!M}nRrGfuklL8s|{zʠoڗ{Puh, _}>6âJĮWPNԜIsX1F6̊cdI[XH}~`U?8Cl)-( ^[bSv7%6qn[VZ9Lx]oṀ==_n).;ML0)6u>>´"'T J(6gȄcklفyJY1y+\մCLnǃ۫奎I'LoՎhlӶ3l]6*{-)jK V5wg![vTMM:*LQaSQRرr&~~.-YD}rDfmA4t]m;mY?}¤[n Ln V8x ׶n 6'-ܱ{u[v[ÞpѳrBg-L0.9t@)oB{kIYn ^n Wz-A;aa]f㻷G8J"¤ѵ3 k=5N7-FhK=a )he3,F"q]nт0ejo~IM {E_K^FcHPDK +?pɺ ;+kT_7,~2O7O ʺ'~IG񟛨iܟtw@@zCQ)%!'KZ{ܻ0ߪ7O= endstream endobj -1732 0 obj +1803 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1731 0 R +/Contents 1802 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1733 0 obj +1804 0 obj << /Filter /FlateDecode -/Length 3351 +/Length 3352 >> stream x]Ɏ$WY) 0h,#%C48\35:=UE2K+?k3g8t%fN/1t4 Nx&.*ŌV/?\{]Pq !%3"Xob qrY0~WԋJ4!h&T'Ħ:e]V_Yiw{f]1rAH>+Lf:sw32]ӇXw@mIs~to?~s]^/?\'ɐ[ ͭoYeO~xz) wDIcԚcW=1}nUS1z>St=gʸyUY],V9WԼ 싺˷5L07|ԥYө2)՝i}]3S a +2ih麾ohXgR;n9L+fn><(6dto\J=񑛈7nyb /JKzQ|.UHFrMq 1R\ <*FQ̭!x[D烒$gVH*O|̭wyRPuu(@1##SOe&Gܭ.Z$?jrڢHuwC L` ??:ӎl:>~u ;TigC3ZEF:{ڡ]z2+{hmi5\ [`6(bO;n~^sfkO3OV=8AĞv.&fӹ5c:riIdb:P5~~-%uhPe d&O:e`? ׫2\=6Şv2&朓rzǪ+4@m|G_ c,Picb6'UnȤE0\3w:yAx%Bl3M@L躒')DerhY ćn~#`ı:斒q̱Ƒ%bT6%O|dd:8'vʏAkd Aa Ͱv|Q_Gzh5 2Hjz؁d&z R :}^JbA\0p/;a>tw(HLdLLCn;3JlUh`qm[|VŠSʾ,̛t2 Ӝ'XqvF݌fM=+xrTnWk (zآ3![~:3l}'yڭJ}(łey!"YTaG”EF)t )z/|wr|lĚ z%a8{X P-8;m+)h6xU˪U1gTM0Oȡ  .PIT[$zC.Tx3.@-&.r_il!c4,SDS)͖LhA՘/6=u2j#P廁npn}Nc gQͦPVgctT{ȤA2b?Ntr槜2vA4cYʡn`c[s;2s2YYG&Mۑ #kd`bNhW }Hv1@zi;o -X`:oe-g0DDr-?d u}">(q`YL1(ۤ^P۫lK0RoUV!=FBx|.J՟WR :`$3|>>iŜq^-^cщOϨVa-EAakEMN䫺֍?ڍO䘘f#y]Gr8rFrP0)|PBWf̀>?5)\zv eϏDP\hr卞,jPǽoւr4%D""o~|#mfs^2<= C'T6p;)4^M^AAa_y m#EzH)Gӻn8QÑOν=fb' i +w|gaS{z=lrP <7)KHFٓ^ UgфdRrGG`uA1`^--Zu4լ5}`TY<0gWC 4"]봅0uF#:&qWG*k<)fac4IUa=oe-Xgϣg9Q:i]תfA4k'ЀbkEMN䫺֍?ڍO䘘f#y]Gr8rFrP0)|PBWf̀>?5)\zv eϏDP\hr卞,jPǽoւr4%D""o~|#mfs^2<= C'T6p;)4^M^AK__[ܠ[(h#)b=+HD*LA?*f_wyǥ ޽rx03x  endstream endobj -1734 0 obj +1805 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1733 0 R +/Contents 1804 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1735 0 obj +1806 0 obj << /Filter /FlateDecode -/Length 3630 +/Length 3629 >> stream x]ndWYH 8YH+y-^^d=ݒZEJ]%?~@Jϗ)/bEz1^hwHBP!^ @@ -24578,62 +25653,59 @@ S œ/]ysLWEnUVtpxRW5 1R2*uNuJ= X3[ˮ%/eU[9lĄ!w5[QKbbkwO~kWGUCoQ '_1HJSo/939*g Oiu3`gh-( б'jrU,Hsg, +WUi.'ru`YJ^-QFB7H^okSAK%cJua$j75M +W<ӟimHVԼ6ҷr{_MkZtpi1$a!!ϯʉAR?_/'J`Х&'x(a0\vL (bd~%뼲 endstream endobj -1736 0 obj +1807 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1735 0 R +/Contents 1806 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1737 0 obj +1808 0 obj << /Filter /FlateDecode -/Length 3715 +/Length 3714 >> stream -x]KWD!@$9$< 0HbQ%ixmK*X,2 su|~a #7?Ez-z5(W9>rJJf_~%o,c+B {t8_/?]~xO~=yЮ&8el>W%UKhJɴso^xvcbހ \]|/_~r1X#bׯ??g]~e *Z̛%..Ɨ|cLQ7h ,Mx)xaq*sK1|u+h>? -kwK}n,oInjJm2}so=+׌r}R``x$SQ8T*k3cqHk,ņIQg"/I#p >c$rG31nE}Hg#щ a=vAb0SazQaLDV37% ^j -)7g7BR{h\Zr3Hl̛V4&6! "xco8%r6:~Nq@sSxY>L]G4Nr.if5c2n@g $-T1u{y`i1vQcUk(Șс| f3b'NPOzģ -dCwz\BL.Z9_楛ךVxM8C -:9'kk%t%yd233~F Wkdk[e kh5RZ]չ?;u:`J&^N90bD)+tvL,xL;Nsڐƭ;W:䴫>x|5cDhhoySV̠9Do+IL 㦢 AErA Ki{ /j-.rDQ]ʙ+h%H!A0@*28dHgޱw7Qn3J^sOQ{<:~*uêQ=s4:wLxhlFN4n5jY@G%.8d>s$pP@2k;JI$ ٔކl#Hj`8=&bhKV:@SaAO#e(h9B / l܆~6&,}&0瀨@E:s"$,Zp;W/  }5Z\DT&ң̫*(ݪd[}`OB -U=wݳzr(`zX^. $3hzl-KJ8z-$a=\-Hsi(ꍈ?MS+~~Bp::15`m &ʂdÖޢLo"d/`;K -Q^f:_-nxyGo۫&GZ>Zx4yGԫ늩 U64"'!1lxTl[GwxDzYZK6WuA2A>ư^l%t) 嗹qy[x,Fkɱ_5@H^. A2g'85cZTJ Dg!O|^nG. BYE5ബ^IiF>3j`U~R+m>k^17`%~x-'@DPj %l5|+8 ^Zg/pQ_H\?s[w-tړ o8|y_ -nlSR%8TZȿc=l#XKY꣍{'ZfPѧ7-+zv*t@=aPkq$8\e+ ''1aDy-yi&LmzvJR&ʋ)/=Ƶ,+@ޱBRpn)Q!c5o:?o7u?x|TզX3#-`ERcO硸[T,M /z9Mתlё5|-Z\iЏiGDu#ile1t)BF'Ȩ8@hF'UL dKy?5r=4ŝ'%W(M=˸ %^ׇh/c&m4y4t2pVeAJx'ߥ݅X25]UMvV.ehA҈8B/@M[#'Gx$ܤ!7%+щ8 Bu!z݈(iDOX/'ʋeC3FJQ=NI1GT1ҴAN&+p*MwyBن.KN -oB2Upֿf_C4 )MȔndJ̵iI2LHlL-d6,Fi׼'FF܇R4kNAh:m+l1! a6h אi Դ,U} Z-{&->lJӠ=MƦ4yUj*X5olځ=Zr9瘵8'~h;b" -fK]vͤ^+6h1I.:ml$xb펍 {IK58`mQ D 1(Q^ JEʀ9,@ʛ=̪6Nv$ <2_Q~f -9jIΘP4dj'VUL@ -5TQ2SRАWjD6kVA{5jq}A?{=֍iiof?޽rU]?Q7f -S.܇b] -l,sȔN;?WtԼj6飪t.2&_쮭gt}Mu;`0]فb-j&lE}3]ݴtCi5虼HylY}c!2]m)]z{.=Ul=~Zlጴa|E?\چo/\zK -YO ~z4ЄMJC!?j 3ϟgՄbLt/ңl'TU,O +x]KW!@$9$< 0H)JD{s4<ݶ%},H])V2b3Z^?__(1¿pD&|gx}CS諓DZˬf c P\y?8A ƚ+cŜ痟.?1B?AާZ1o6 +ڵ҄lsyXRet3Zeyw’;-%: 25Jʙ~Ï_xe͹ׯ??gř]~e +* +Z̛ũ BoKQ$O|4$08ËssVzz l א5y9'|w?[#co[|O5\WeCP[.\(I4xed`Z{*%8ĵ+!d.8z1rG3!ny DAEZZ(mZVTFOq0.Ȥ|vZ#,ڇsf +!ʹ{1i I V =O̳4Šl5%dL\p E>@jÓ^'oUOzģdCwz\kL&Z)_fW + ;8C:9R'%F%id33=R~F Wd+[i4h5PZ]ՙ?uc_#A9bDJ+tv,v6R![Jwu<)ێ7>OxxucH \3 usVn5Q1[q$qr\(>aA%FRE٥QBp"%v1,y؉9>{Ksh1jzGۏ.wX3gS|'񷞮sU9?fFE*+GV6ш 6 D hp$@hZ`u>H63>#D$DBM|JiEcm.vSQWNdžcRxSЕj GF_.n6ttRU22 + fR[:$Ϫ< tx|{fyϧ~*hą4N Vi)" +RHbYhݕU'TBq4)q<iܠOKA$\|yL,eM_:*;@ɠ+C\)&T H9'`)o)KC7 +M5 +5 Z|rWn `=V*Ū qг>9Zff,؊VB*zi{1Ip2@dyw*iի [<0p%X=G+aOXDF\NCەqOgDkOz;*NX-6; VJ*\r׼+;[h!58 +DH Ȑ\.^͈L׬hzk:;[g-D\ +͇tړ oX%y_polcR%8TZȿc=l'Xٸ룍Q \kO̜zcLoZVfaT趁"}%$8Le+ ''1aHyZ'҂Ӕ9dLmzvJRF )/=ЬzAWZc2V%S@#]_WVB,ySiSz+s_oڛkf@Af"}MCmyU-*~\Ml1| {Vi0qGH #i5I =b| )BOQqX1y,/ly;PrFq_7p/c 'ojgih$2+*u;..DUUa_agUc`L)#j5rDhh4r2rz8> endobj -1739 0 obj +1810 0 obj << /Filter /FlateDecode -/Length 3230 +/Length 3227 >> stream x]Ɏ#+p n탍=CUMל@pL2$nBR*caċYHwt~$_N IP*ijWA(%?N>hVJkaUt+9'%^Ѕ;~tVk |m_ɞ(ԅV;˷՞Ja Aç3HA2:Vt?NkO~#k󧏧:] S5Yl0]'˽$֚' @@ -24651,24 +25723,24 @@ egS H^9 r\[ 1織UA-2_ erg[ ^\23l!#fd ydjX(cg$;,Y}/}K`{٘}r!\$,ic oOij5,V.itN,}_` -.d +q>}o 2}mH܊ԼM?~aT^d7eK.r.}!}!qb=OaӒ5I^WMӲ6eW,EH_ +.d +q>}o 2}mH܊ԼM?~aT^Tnb&GKeebH_HdSz`XôdMsiW~kӴMrG endstream endobj -1740 0 obj +1811 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1739 0 R +/Contents 1810 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1741 0 obj +1812 0 obj << /Filter /FlateDecode -/Length 3543 +/Length 3542 >> stream x]Ko#W`&a9XxO`6HEl2Dz]bl:J~`H3Ǘ_Rx+?ϷG;F#LSDRi~Qkaz߇}RDJ K>A$^Tyog^:_7[.w/CKZ]O*02:Aҋ`"s|Ï_?x$%SxgTJj 0#Y&$!t861 wO3.K5IL{z jWp^H ZTpU9cU)9DN\d 2I[E0kK7W-I'a226X'H]Kr)ͯƝ m&5rBɜib^3IlfA02_$fRґyncdM;S7lH @@ -24687,24 +25759,24 @@ w {cxDTF {Kk9RU(vRޝ2Ђκyges(Cɚh>ja:MAKmgɟg d试&9wwߧu2,?j=v G' 4KWLˉ =u4`Wsa~Q 54i |soUחlo eą~~G/5WbK ljrT"D#7sXn¢:l84cC1"/f'xH:Rirb=EV~뭚P.I~# 8jy-%Wǚlʎ*w8,3=űZtj3+j].0@vaqiʃzRPytGZk3p#TL5KbUj 7%vn#wqK+Eƃ7nKm#njv] <#3"Aw0,5^p0xSjWog1lY 7+[ڶjPJ&D J&k;Wzn^2,uV{B YwVB32y)0y\t+:kw,]V=+ԮBc}9TJ4#w(cCFNԣwns(R[4 ҧ^j4-5 j[̷VC|ݛbJIu$"KƒQ*IJα7j;J]n[td8N;^j~I5K[ck&ʟCK'~Hc퓷8E>YGaeca᏿c -Vӿ s9q ?[I^4Qi R;du}HyVLf9)u߉O}9c.E?: dKjp3O>gSʄTT%Z/v +Vӿ s9q ?[I^4Qi R;du}HyVLf9\!VIXKя!YZ-0\,Dٔ2ag?U/mɮ< Ξ endstream endobj -1742 0 obj +1813 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1741 0 R +/Contents 1812 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1743 0 obj +1814 0 obj << /Filter /FlateDecode -/Length 3447 +/Length 3445 >> stream x]Ɏ#+p_F m{Çrל@p0\TdgTb,%K]%=~h1o/?_^NҿŇb @@ -24721,60 +25793,52 @@ F 6[k8hKiMe&m𴄥Be@ O5I#H 6F&'9peAP-o*Pt})^Ɯݽ`j q^oJJvT`nP^ ڛqƎIy֥ٞ].oh{f9{Oo9\;bP 8*1;nld(89v,c$oh}cqOj{Zbp\7 fǞtOg]E?Q`;3RlխwA+LT'o@13d2~o|H.u]d7KjͶ*~ߠbN7m9hk i~oGoΌ~oD!~s#-SŅ잽9p^36)oo5^Τopre z{)͐|v=;6勎!'f {dx *<)酊)=$^_^Ѕ]P垼R/̼(*/>>d=/XW TWx7ms"/h۽xA[x6^[xAK3^?2^pf3^p f)&p5z2-4=MiՔ;w[,sBfeh_@Xx7'n9w ؒm,`\(-p6H [gϓRSoM$+ _ػo<5XZ|:iO= |.M5@YzI=6~ʽp TF']ڥtzTkl[q oڸ*DQa)5ж{qqmpg\!~d\g\@zg>l>t oC@id*| !RJ(E烘D5-Y!&fB;"R6_-U 1a/ALP 1 1N"zN\W 1TALW &7ms"Ĭh۽ A[ 6^[ fK3?2yf3y L6Q b.<x';4 euhTx)S+D1113Ąds 1 RIAz"c;y6]>?m8s"ЬFp㽠QkNضͦ,`h1dp,`xH'rmG0w3.Td*W{y ܝo6N{Lr.CGA14.؜7ʾzȟn }s/}4zr68 -K?O|3oqC]~(IC}c~Wj4>e*/z!taVTT~:eGO=~η|=&n -RZ+P0Nn#H{eƢ_1eT.ll#_.2 +K?O|3oqC]~(IC}c~Wj4>e*/z!taVTT~T(< Y졠wd4)pSZ酂qR?pA+352!|({racL- endstream endobj -1744 0 obj +1815 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1743 0 R +/Contents 1814 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1745 0 obj +1816 0 obj << /Filter /FlateDecode -/Length 4220 +/Length 4216 >> stream -x]Ko#Wd`!@bI6  v {$} YK]Ey;I#wӯObVп?'bB! BizQ?O~J^>J-VFlz<~~\<3ky{vv[pҾBǟkDGS*%wUXC ڭOr; ##R%9}I;8}~}tO:}*  :qϧ1P,Aڨ` q 0ZU3ZZEiAaɯQtk+x:="8Dllz bJ LV$|s ƫHҌ$Bʈv!iR&ޘ.^I2I̗ؕBEf8!^sܢi#GIP.gIH\m"蹒WMYU8kP|C~ )US3\E6]{Hab6|H܆KYMz^j7Q"tB.Bt#:қE-siKˁz~mfHk}(IWԴ1tу~Zp҃i;ͼl7m yѷr}뺁su6e\u| dGq{'Gzs6 C͒VCT1?[-OF\_QAj{cZ|דb2f-P$T/Eʙ$$rR*Yv +;a"8-V^Èۤqfs>$7-Hbgeeę4\*$$RTWiH\\!H1:`@K}ܰOrIJXX&T'#.i -埘_V.kq\&%Z -(C#X{GLq^uf9.e=Ax9v:g]R9z\JLԌ)?$R)0-RᡑRMH մH 滱H "IJNw5 6K'b}|Ln1Q`Dczj 55j g`5`k (C͒`g)`PQ߲ ށyvZSk)Uk@w8X3\k@j$S߃?Eu[-V쳷[-fނ 5I RJw)o1֐.%`ІL})NCS nH-ZO̹9]fEO07RqQJ5`޺bA QWZnG^1kȣI'&큲= iUt"rڬr-"2ɠX"(U9r~$+^\vO+CPTOLW<8SjoiJy]-¸ -RFip`KsH oж Y!l ܒjܡD-) g -I]{H8r$Oo"RҹnzK҃T۾ a4AyQ'oEas:yiMIH31 #g)U K޲ ,W޿گaVGp,d+]=cM]4&$&y1Vo:#% cV^5ꦣeޮ%܉2U5UP.]dgx[ύbָ -e(Cf0x׎^Sԃ4f=X{̃k`6ŇJ}HV7%Yɵ'YIއdi#١Sۅ.M[dcAx2ù0R04 -Y"r(Z#d|f@P b\w!vKu?ֱhs0Ե i#Gg$z#1|!WDt \"7D,,E!-=#@o7bNx`X o0xÛϻ7 N o0xc ӴdӮ.$c-I›$c]H›67]o;yxk -o*7 %77!ހhu7!to&o!B<ݏf@xxs1 ňdI}P og7^! *LQ1[rpӱpKw`Jttk}=!çtGm?% چo\us>n~>e>O?e.4 C?C/7{ yjB9 BvfsS"^^B9`kP Pى:Mi qFZ]X(RSG - >fBL0&1L-J<ț:7?fַ:he vtc8EfAhf9e.{/qF֑\Fwm{Geį3 -2d{x2J2<[2( -6w>%%J+Oŝ|RZߧ,KviI;bb0隳몀/s0F zH=niZ݃XLWugx^WuWChNSQ9V-&{w9G6w4䊞׬+h-W:se/*[&Zrh' gE7AC -JftFxJb7%JDO J *N0?}Ǭ*)E>}FLNCSIм­AˡXNՃY4(PF U(tE23}֙Ի~ǫwQ UrǬR%hC`D nX<|ӟ_iOJ_ζFO֬~hg\ʪGv` I3k/7.avspvcdt44 iwv ӚMݔkb'wO[|Hb/=$ +x]Ko#Wd`!@bI6  v {$} YAK]Ey;I#wӯObVп_@߿>ihwh eXJӋZ/h-鷯OxS{Tj2`;)}7_"N?Am_ۣނ:]%:zݜ'GC_YZVyce:-lj??8X`H`o/w'2[~OP1^H-׉z +FZ6 }-`UWb "5Ћ:D’_9J܅VtzNCEqXnٸ)@j(I%#\yr ƫHҌ$Bʈv!iR&ޘ.^I2IBKa"deP9WnQ4JѤn(aA$6ϭ豒WMYU8k[#kHJ%ķ$(C +C6\hKlLůʝҪߐFъ4v~I 4Z_ эHoZ\~bE-B9]'b?Il֟7?#O {~(IWԴ1tу> -r^8;ͼMxq{7MZ]\h ܜ}=nXu){&CL8ZE;a>қFEP"cN8m?"c[6YNIe+˰c(Zq';X*ia+~{eJc jc ͘caJlAd~}eee^gf=ǝ֩ά-b3JŶ7r&\6s +[",3'߾ԙ2k&;etVKBͽ.5tlk8`"=##Keѷ[m,v>AoX6xƝ2KAˤd0L!,s@xڝҊXng< G#pq /-ӷcd,692W3.'H1a.'OtPeNN>QM':t3y C͒VCT1?[-O }.YC( ] Jmq-aIt1c^adYL"PE[9RuǬZ{㕝Y[0ؖV+maDHm83Z9{lvIUq1We%gL.-z + *UUW%WbLqN+=)В6>nاp`9bYFXBH,Qzy*_ܓ4莇O/El+\}9Wj{DRau_sk9)ΫnQLw#Ւ1ޥ'o Np+\*gU/YəI⒚c"=DJ EJ <4R)))|7)`XXX[)KxW`$x+#I4PSրpVZfր2, v- ߑ@l@x=r]tj 0@0õfIkK_1=#i_T[/oHq(0bmE>{ pEypb`-P$ tfpj R~mt߯= ihjčzJ( cl OIGNu%i#t'=bP,c6;/E.Zz0siMV:?70f[p+r:M\Y#.K(aӢldbE2+xGqĺ-~0p#T[(&nu;kQK>&vz-<+t2a(PWJ*2\. *"/ %, 0鱛YhFnOr ف[\Xi%xݴh+GUpJm8MW @:K>W[A>P +(Npɘxi: ڶ2S7+s"$->^t=[[- ;E20%`L4k Rnq! [Z7K=UzAm߄Q0 փ꼨EӢ0ԹTRXe 洦]ޑҔ%oYDG([+_}0ģg8Dı.CWe˼ko:#% cV^5ꦣeޮ%܉2U/9UP.]dgx[ύ\ok\e2S!3SkG)Aq3e,=Ak`6ŇJ}HV7%Yɵ'YIއdi#١Sۅ.M[dcAx2ù0uuuTisYQJ ,EKb}-ӑY2>J +3 BNg1Qly,vG5;:L#umBxH(6_Uh0]b'  KQDbKϼlH=[M7 .x. ȩ Xx4-A}0ٴ+ XxsKf:XxsdMmÛ{N`›*} Hi E7 Z]=D7"ÛI"Û{o@5#CxxsC1bA$:YDTzlፗiH +Sv}j~m:t{;C}߬{%vOg=i$Q~mC߷s9KM 7J 22冡rɡؽ<5k!ٜ`!O tD9)/cg5rDv&Y8l-wq.,j#{lz\|H!w{ cwK:7?ұ;ۭou:1bq̂Ѵ.2+rʐ],z9 ^sr#ŏ <_?ge0{2*-edxַdQm.|JJ:'Hn~*[ϏZU~\Yե& :7@ȋ ¤kV[Y_`>{^Ӵ]VMREfChNSQ9V-&{w9G6w4䊞׬+h-W:se/*[&Zrh' gE7AC +JftFxJb7%JDO J *N0?}Ǭ*)E>}FLNCSIм­AˡXNՃY4(Pl֋J\^F[23}L]UXǻ(醪ܿcT)qɡK[b nbѵFc 2yI+lWuˍ=:[Ht~QJL(RNBQdJ, ߃_ZkxHiÓsUc>W -9L%R:ƍ KK7,% ҷӢ6Eqڋr?Xyn3()iapgeH-.Zn̓)0C#bvU(cŻ~p; 92teVdO$_bBLCw7cB'5>㽤(+nЕ$#JID.2y; +xVNnyMҡ{HӡWkfs)$Ŕ}^; +x0CW_ט+#7GO-M05 S~?>qJ?Y~f q>X$y0n䯥?oP!}9Kvcdt44 iwv SNnJjY;'-|_mq/$& endstream endobj -1746 0 obj +1817 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1745 0 R +/Contents 1816 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1747 0 obj +1818 0 obj << /Filter /FlateDecode /Length 4275 @@ -24799,24 +25863,24 @@ R Hm5,9xwP@9X+, P"Wrz>T,_ۍDv)o*[TPNv,]lTzlPAW PAqT*L\JTPeX AlTn&E&#RipȌVZQR"zeXGYfQ@ZlX( 8 -}e}  G (wQPB,kr1'yGZ!;)PclHO>\''(w]I=WNXOɚ7l~7A9M`M&w7N].kMA 7⣸ :󽱔n*AXUTebWY"p"&za"#&< Fk5B YSB&( }, lM#Ys-;h\K(+uꂟR:cP(rEɇ0/61㮹c=RHMo#}WVu27}CBӒUP-K??p8{w^8 yNTlewYMO4>gr,2E™Q91|Ag=?i`0EH&)(b0.3c8Z?iv217+ +}e}  G (wQPB,kr1'yGZ!;)PclHO>\''(w]I=WNXOɚ7l~7A9M`M&w7N].kMA 7⣸ :󽱔n*AXUTebWY"p"&za"#&< Fk5B YSB&( }, lM#Ys-;h\K(+uꂟR:cP(rEɇ0/61㮹c=RHMo#}WVu27}CBӒUP-K??p8{w^8 yNTlewYMO4>gr,2E™Q91Pf\'svPQ#c 0>@JhvkY§ٝTܰX,_F> endobj -1749 0 obj +1820 0 obj << /Filter /FlateDecode -/Length 5595 +/Length 5592 >> stream x]ێ$9} IjipӽH /K9UupmtuU#tב~U4/?Cp#7c?O/& !:k&5נAQzјYc_ϗ1LU)\zzM__0"ھ߷ z >8Z׍%4|!zzݾ8b @@ -24837,52 +25901,49 @@ x һPa9w)*78UI*NW-9U8A2†%hzֆʥJPɧBg}n;Z+gVKg$ *g6ɒ9UNHƺrܑhpN3N-/j;/KΎ(9 l\"7$ Q([x2( d851 ֑%cgz$ECۥR#bnfW-3c KU$npu7һ]yx7K%rZ$JJF,2X 1 *'3liO]l :YJid]eMXd# ^#\:~vDWkdY r\WasXgGT3oX-ɉ)pܑ}f/Ya-C`6wjKUʌlxDOùt!ϨV$ZQu2[]*eQp0( =?~(δغM>rsshg1*Jgn k\Ř44DmI9ܓ*cKҹP{{Ƃы21JP(}QdzQVru4Fk$y],!$' Ə'N>'\4F8r$&Qlxes28T'~>!1zx صe)2 Hgj7llTf\8O05T;mSi1-'CbxnPmUPB Sx&.HFsǦ& Un]Yi-^DcԆq^E!g Z-E*IYž^,>Yҫ8Y g ൻ(Ko:xTr9^ǞX%f/TXU^fv+?7 %6ʒsx'O}+_a8dtU[[uJ2ո;|V)jQ5O+i.&ʧ;rIa?0wXmW[!`W7;4+L~tJYrTZJ̃cdD6:t~ -s]]+໇Ba<蕧ELY`<w& ǴJ*iTܕ2ާ'76NLfz1k2Z$Aκ@zTӈn#>F<@2F<*:(0\#CW%PtnOnQ~8bOX8èj9jj v̓ 0"\Q UF -MX<ש3GXmn1΅6ҲyVz@ګҫ=mvJLNE9mY-h:mRnu2pp1Ɍ" ns3"~F̩\U2+W)ːՒ!12<PՑy7XO/eƶ"-|OJS3@zl K.F)tѫ9=!S^OcVGNMezT#zQzw%!*Ɠ{PcdղJ@ܪ *Aق AYQɗA0>|yzE΅̏Tn(%TGխtkvUMl|WY>Y/uaUUo BE_&\LJW!O3Xz1أ`&d{6k=*/=1iu{Eݢ>@51Ft}ғ>( -Jyx'cPL.[ukr,EZ}}~!{ڕ7~qބtG$Ɏmo_鿋JLy:'gW>.I]6&Xa H.X[g20@EPgXICPоHn4MaY w O)"a:5?+3]el +s]]+໇Ba<蕧ELY`<w& ǴJ*iTܕ2ާ'76NLfz1k2Z$Aκ@zTӈn#>F<@2F<*:(0\#CW%PtnOnQ~8bOX8èj9jj v̓ 0"\Q UF -MX<ש3GXmn1΅6ҲyVz@ګҫ=mvJLNE9mY-h:mRnu2pp1Ɍ" ns3"~F̩\U2+W)ːՒ!12<PՑy7XO/eƶ"-|OJS3@zl K.F)tѫ9=!S^OcVGNMezT#zQzw%!*Ɠ{PcdղJ@ܪ *Aق AYQɗA0>|yzE΅̏Tn(%TGխtkvUMl|WY>Y/uaUUo BE_&\LJW!O3Xz1أ`&d{6k=*/=1iu{Eݢ>@51Ft}ғ>( -Jyx'cPL.[ukr,EZ}}~!{ڕ7~qބtG$Ɏmo_鿋JLy:'gW>.I]6&Xa H.X[g20@u/4 ), $nӶ0)S$L羦9qYcz+0 endstream endobj -1750 0 obj +1821 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1749 0 R +/Contents 1820 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1751 0 obj +1822 0 obj << /Filter /FlateDecode /Length 1640 >> stream -xZM6Wp! {(HCPv$mђLo{Zٴ̛yx}E=wZv-HeB_v3+;y5'σOV2oBP7b"Mp!(y7Z˹-:QrA Jj~p>c Fb^F!YVqM~(pA^BKsFH+ӛ|3&!IҨ A{ⰨSMxnr2H[YT-Cl#{ J\A%ztx?sd-<:U(d7_B+9CDC+hUv ~{;e4Um&{;Yjb=s,"5[7BH9:7g\.L,d@#¸tݏq,-rC$a 腂bbX |JϠ[ZL'1 -[Y\\TMUb`~_in1 Am 1(Pc6. -$U!b3zZ ']؀(\fKPȶ"jcSIUϑ"lS VRoXnRX:q/6]DFj[/*~:yn74dMAtn%:vcOQu:@hcDS[0T-,W0h[MQƈ*oQrIi`GK{Gއ[0CL#Mw:JKQm4Jy_dHU:-=w} -VwۃRWR̽6ZFgyC#uߥu;{K߂7\tWZDi~%!|,.[P%M{CsV*='LFm~o, HY}6$%$bIJq/8sz zwDqΧyH ;KLijvF>6)mP,(2ur8{XMf!rfiOAT>X{~w4<PK*,\ 話|>@`}ooGWN -x]C H4p] Z|lNlP< -!8*hLt -Cf)4hU9>?s[ +xZM6Wp! {(HCPu$mђLo{^{6_l66s K6ͷc +;nlW0$ b<G.0L ]PrZ1C);'PVM[8[g4!3@ޡk5{jGZȖ}nlDvjO(>Y 1CAސmR4ɆY 0綪LRgŻYJ^rhK<b$ele]]7~%* g2uل&Ble%K596rLʡTjL_yI'3G#“C_5BvZ9T|G-oB &_Azk[=)3 n6U=)R#_& Ԕn;Lܜq0v Yv?ƥGDضaXf6R/Ű, AO0,tO1 +[Yxe.*ҦԪ]1JN 4WИvս;أ 6 Cn܌@BI@"{6 ʢ$Tl&-~Ȭ2Tzo@F|RsCUA뱔m ۸¬rhCEdJGF)4][ζ8ST2Q"U h6V+e1m6FT GzjRpGF(1^aD0#j嶺~2FT(RRUNKtBΠvs3Vљe> endobj -1753 0 obj +1824 0 obj << /Filter /FlateDecode -/Length 1748 +/Length 1749 >> stream xZ݋F_@7;;3&ЖkRpgyI @@ -24891,24 +25952,25 @@ x t  0æ'nM⣓|P:6Sow^;&ʼnlz'!=zB-SwԱ9{ s,>)ATj:ᯡnqU.#GvXvcM#7|lɓXzw R K+0 /O}_%E EPW6Y|iFD[ T7?N}&@d+H2<"w )DrQNP&-*Tጬ&⿀ Qf+ d%d Riݮ\LʔEEكZ]n2=Pa3^k<#a㉒EҠ p5mk[ a~E32aŜAJ2_y{3`t$5ՠ؏b%v~נ6ث jyʠڀ٤lf ZzU@IF~3~D1HDk|Ʒ'BO](S=5hGD_ Vݺ8FOnFKi*R_"(70\BSؖwf 3,p$3C;,y|tb?*%\"548xg15Y&4uTZGb'P 곟:bn{̸C`;KXH-+iNpKņ̬jƥӤ:Xi2|GuFU0cͱ}B>&T/YUϟc):a pS|5fS ]RsU rl e0.\kLgy?FrS>%RfȈ28Rg^K6 \P3;hibJwݺ /O[Xy/X{N^JujG1W8YΗz '}}'I07½Euq⾿{{Cqg8 t-}s慇dЗ`H{d_QȲN ,Fhڝ(E~d1+1xMk9W> endobj -1755 0 obj +1826 0 obj << /Filter /FlateDecode -/Length 4270 +/Length 4268 >> stream x]Ks|?A@%v䰻|@bL$E` V;WU$գ1/NҿDHN1B) 4F8k ! 1<*p*1~'%{@fRSSQ9+&frxwv;ډ|‡I0 BWOdRrf'HYa)HMtWgc8wFw<|~~TI\><더*o:219e6~n|ӭHߏ-Q? .c-.OMvtIokIe`<JdJ:4P4AY J% BO2ǵN$U{?btţ7j{ !!*]~2-aq8-[NjJdlzmZ @@ -24921,186 +25983,187 @@ A K4k?uPYHwɩtAf8y)jc5 T<4-!BKBڪGkҼ5A^9m&% Ei nᑊ'FZ8//y!SRvC)#ڟ3S'6O  "2u)N0j9vz5lZF]&6 XMK7Yk産4S雀ڃI{+rImgKڮ[P֞~h[ot{ > `+q$u& 3搼DYm.򂾙 Ĝ,,=6^zlS'Q.ǀ=k۝/ 5X+} (&kg;Hsji1,n͒mu(s4C1Eu3aw2ksY|T`)K Ot/MgxocvYͦ￰|[>úi:b^>Q g 9'"HL,|ՆjJNJ:rl$e-JF:@l+c? 񩷭b*;EִIW+AZ\z _Ό*tN2Wըg=2e䶭IϦM`Gp.6[:ת1ܘhUuٶ#"M>I“{ )C^?D~:I$ot< kH"Zs;w)^5m/K/u49+7`X='a r׆'a ;^m u&"|)ڱL!XS;)FTMX&\l;gcX4Y뀉p1$ϫuF1vP>1zuCddM}'(rKuļ8EWMw#K8釓=.; ۑ;¸nFFY:Y62(>'ъk{6b#2?pH$4:`cY9FƲzl,k=F0\x$kF ̘F7/6,5c#H69H{X}{gq+F|,;e >5H>p;)4=[ 7 lcrë129O4nqë!9O~ku~4zc4J=Ad#1:0w4ˇ=XJPڱ@:UsAknIk{6A9!QjU^l,scd,*7XjUT>s;T'zB>b,#F>b,Hwg>G#ӭGrfId% &Q#~`Gl:W}':D+{v1$xuyM}Cd=^P6L,A7&&/L z%R;&bta"FN|>| X;a)bRv{p5NK*),':+{6֗l,9|,u迖=xcdd=Q0nK-h(([}F;1Q%q˦Rf$E uRKZٻP wmCekFKenM9Z 0@Y:FmDѲztL԰)J)&D8~;9HK3C~+'^Qh͂RRG1}̫"͟ciyS7DϽtJ7K46e|LQ/;ˋI&gT:~Z\gig%{0CzM1 R*c0o+g/y-^ ކfu?sX^s??C +G_DOHvHFN3x|{ǞLn>`Gl:W}':D+{v1$xuyM}Cd=^P6L,A7&&/L z%R;&bta"FN|>| X;a)bRv{p5NK*),':+{6֗l,9|,u迖=xcdd=Q0nK-h(([}F;1Q%q˦Rf$E uRKZٻP wmCekFKenM9Z 0@Y:FmDѲztL԰)J)&D8~;9HK3C~+'^Qh͂RRG1}̫"͟ciyS7DϽtJ7K46e|LQ/;ˋI&gTNO.Krd}~HI1AWw ƕ1ܻ endstream endobj -1756 0 obj +1827 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1755 0 R +/Contents 1826 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1757 0 obj +1828 0 obj << /Filter /FlateDecode -/Length 5332 +/Length 5333 >> stream -x]Ko$ W]CĀl@J ~LgF8s -veIVH}NSJ9'5EGd71}_f?}yYϟ~xçšgYm-B*]hMRej|Jr~,:(;Y5u&Z2JE6z2ҿ]OLWg\YC>O Ir EW̒‘*\zV̒ ^`qAeNF~la#F}>!pns x<=&I'^2X@^ F -BJ T.d[TWKRo/hu<׏<!#0n%'Esh=nb,&FG7AD1w[1B/&EehTA`&fps00Iuv/3ٙ1YrAzf8D6cS<3I@=K؉ёNޮeѨR-ba++Hdk/YU#xɢ PѺsTWKV#a tʥ`xjCd$G}dktll~B>([_MN&G%0ԍ 1|/+{gOpOȭXO}==r 4Ju-O!J =ў!2n$zzcT/W^@O$֐P:NR?>btw +x]K$ ϯ?`'98< ݱ'Ph{z>rxvggD#)O>~);ˋW=}b71\J:SiZKߴvZOߏNQIkc&sH>_z泞|%B c5^'`ZM9Di>cXe;)EoۙTDC8%vO?|w_=i3`SO__vֶ|~w/TXsQL9mESH⼋#IJ,yZm>_ϡ8 h.%7Nki]i%s~Lwӭ2ӟUnW~3ikdeCph)X\9(uy;ao x;r6cSTd*d͍ESfKZǎTEGmc俦]Njw)N)FɘɑRAXFWP-yZtT2F֦ȔV϶ퟆ壽&BE쑓!Vz<8ԏ9+VlqEV+Rl(;2mhȶwi7gT`TGW2 ]"6n WهT%zK8(Jë!cYaʴD#d#w0QgKx]=ժ3>^l"#c&`-$R\ +σKёH{a/}+ +u'V4Geנua%KWۤq"t!>nggH +ڎG:3 +^  n)0JFb&R ؑ?z(blYؓu援w. 2f`#R?6bt>_ox8ȎFd/,Jz/#!*^^M ~v%4:xKch7֓"94"19eeVܴGr@8m.,LW7)*E71q#\J;Yb4G0A39}Yۤ Wىpep 䘬f9BFѠt`f=3"hpD)S`Mؙ㤉h~~a'FoWhTo̰~Sw$[kFqމX*dh]xMY~v%G:Rlrd5!2#>x|{jF:B6O6J?K &K{}P ~RΒ |YG>[xXӳ'sVVľTzz_XO `%dhOYOj7==Cdc1*+/yzQ Eke(d1:r ׭^WV}=V/Cy#ȹX+e_ވnP(խz?!Fh8Fƚ7v#7m:0F^WԂ1gz~~a$FV0%k{1\#QHPѤ0Myr98Fbd1r #Aqe#s>OR?>btw WYatGYHsTW+܃ -wGּۤtUVa HOYs j7q;GzvQDZ9>V$)L^k7d1:r欞Gn,!ۑnKpa݁^2NhNTb/Sl`= =ѹ;cddgH"EeZ0NZ(SOQ?NR7NtpE%姨~όwEv7fޱ&|Ǭ:ie1z_P('kGRO)0K1 FG.]zg-GMޟeCց#*FoF1Gh7w2j[t{UIkth,[FG0zVWls5ȹvj{h] @zwZGB^(ʤq{A #gmWf24ݐ"3;1X&E?%ωmY|'CDs)V4 -ƺI%]@z&je=$Ee[tdjdekݙ-LaoOjDe#T_gzaVC*)M* ' 9)Xz(A:}:|PPd!:Fے+5(_VXe6G'k@hV*Կ9@ϦU;ִz.giPFrŤ *ܷ|2%NEc{[uv@z>#|Wܧ@euO㲯\ 8cYHϲ)j4a3RfwcN9CvGU,5 GUsdo?ew?~ּv`l{ jGXqPf,&V DeR8wIϾjmaig[g (<e{=Vx]6zUS4-!yT*zw̃,uW@:bU5XUm|5[2<󘥆={J6skcSjh)#GkF4F: :edllHosҳM - K,~7ǃ,!FG 1zrh8D>}OlC̽k\JwДF_ؔ!Ϧ:ՏuJYH*QՕ)Z<^aUe] AϋPeՠSEŐ,٨ͻo(a,Cp' C/d-7nk -l!x%RNĀJ%垂0:r '瞆Ff2wOwOWr 5@H:O^XGM^P$;Ȫǭ#լ̬v9diKӌATe|\XHR !L -`,?' ?y*i7ջ/Vc\Q;xpn6d|KqrI0]FG%a\Kٓ}Gkƕ\FTg$/\-KS°;\"/0 -P Y%7N/-6a (tNxwLZOG}˂!!Mz3 R7ƃt0?F =spLK6*fR^0:r '瞆FJ* P5CF:Ћ;P)C12Ckn:B5KjLJ[@qo[ʘpLĐ%dc":VM^ 51G1 =1cdc"P1&blLHOtLHSlLJƘi fc"8Y01DFU2{LYj/d1Chb *c"gKiv@e1-HLp,uW@:bU5XUm|,ؓhTjLld~KD 6&]}1cd c"DDDI&ӑhԏ94ɡb􎎉?8ʥ8l`}Gha~lLSc"Xς@z"c"P%~U@Y.!ဿ/!I蒑k< yJ6i€O9?kAC!\(ѓ B!:"b6 Wb6Aud[x*{PqwrOK #0zri|=awOWr 5n@HK^X7M^P$*ǭ,:uL^I#"PFD9FDK@Őβrv:?ݧ/Ƈ$BS|td1:r؏ѓ2 -8@,@ ²;LՕccZCXe6@k&싛ԞfgL.扠{;Y^}l5Y( P`#.[m#[}gGQWUnz*tk˓jvm B=NIh G v^uyWKm,#% ;PǭВ: j.c$gEBX{7z͕SP|moCZP/p{:%HAR֙(FKohXeK^T›w>#ݯ#}똯G7RFV$)L^k7d1:r欞Gn,!ۑnKpa݁^2NhNTbSl`= =ѹ;cddgH"EeZ0NZ(SOQ?OR7NtpE%2W$%؋C q \aq4 +w@ NonƨFnٙ+xc'}5?"#Kvsm{fHޞ=^'>秨}{s2n̐c=M YunqcR š8-PNְ11 +Ra0c\ ѻΚ[^ ?GTތk-c^Tndt+oն$ҙS&Y:a.TjZs("?+hmQI,[FG0zw{odh!3Dfvb {LTui ~J.sr s̥X +H&ti@u4a m^?TWf▭ztg0sX?ԫMP(1-Z 4<7@, sdb6)C9C咅8g7 HnKήFl|YrG`Y7$T#Tr >%lu9SF\Yt2>O-Rё 61z7SR!2J%HoHUui Kv*D|=~ YFqnY.mDp@ۦ0 d^;ħ`*&go|T-~muv/ %p1`|kwS K.#Az);1Neqt,02P]Ƿz'?|E +Rl`}WƯ7=Z؄*fϷ||),'{ɹ!1;JktG5 DpwTP#p(Mzbh:Qں*Rp޴#cpaMwTx9]+i,}sNS@o!&g4./:[~Ȯ_痢6<|;;\n |~@mC V +$гi-5-Y3\1q +-a$LIepdX&$ucݤ^dcd$-)Pw>rӸ2X5BVv>ҳ|ʧzg]賯Z@;@# +8A^/dޖ{MK4urHJ KU5XU 'VU#_@z|z-O}2faϞDc>(RRژx-yZ#'lZNFe|CN"2қ{ 7܄,CeBˤ KhёCC!FF6sVaG(RGఁF#4%Q[)6%t)N{:FzJ)vuelJ(WtUYs"6ep5TQ1$n6jCKFG.ɅCCcF )Yq[n@Zn`[hA1RIh{w,'{ɹ!1ѻ۠qƕ{B #5FnW)8Dy)Ɏ12jqknD5/3:rY4k/;cgg,.;ԂbHfg1'{?KFG.Ʌ?CcFowp~1bNjrj&\/;6-r'~n~ёsI=94D>0z~?xFq%Y0x6K/WKҵ01;>Hlmw LTB!wu Mz |ȇ@9&r~Fq1>ᅖ?z9|Y0>ĵ"rDoYxƃSvW1g?pځr)v#`4]c"PTj2>+|@FG=a{c";\I A +F"t((MzbBC4 +:%y(4Fz(aMBfI@c"P>D[Dj32&1d ٘NFcqBmlLlLHOtLTG"+һ3&Bڂ٘!;΢aD EU1DnZ uL+fc"ْc"@c"P$DzdLDc"?|r)uX8j4Bc"u~bc"h>䘈12ֳ ȘTDkߦa#PKH,~8oKHudb nZ0d|OvP# +aB!P?p ȕX lP}(FD.J%"7B<]R{ȹ'{"sO=tDqƕ{B 5nFnW) 8Dy)n12JqknD5KjDnWT&G|΁#"P1$l3d?ȅ?=g|,B5ƥ\5f1l!dEy:I@]HG%\K#";\edAP2t~uٌJIi6m#!{<Η2/Hq_> Cvq2ǔq1>v#!>~>j|Toey:w]({)Gˇ!='Y~cЇ AzfzueXVPbVك گ>&Auvv_--}(lPѝ<\m۟~w*8^;tZmsV]5Tv(QaeY:IJW瘊庰6,ųdjh5YG =HߕxmK(9c0m/?,+.'%t1ď1~XVǎ +?Ic_ endstream endobj -1758 0 obj +1829 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1757 0 R +/Contents 1828 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1759 0 obj +1830 0 obj << /Filter /FlateDecode /Length 6061 >> stream -x]͎#9rS 87O9ۇ5=tf RbdIHu4U%e#Ay] /{\Ro}e]RX_?^l/>gk2y1fѹ%x__^SqKZהӫ1.C}y_レe}_މЉ{ 8>ץDwz-(kLk.[Cb˙ů% %//Wc?D+z^?//ͧ5w%W9X(mGd]y5ͶF7967+MGvu#8tc8ޙ,4))Jxh=IT |{OHL+m*~GlD jq̓#ѡ,+N߃OC8B›uɫ$G'FgƓ~9up]gf۸d\0~DN/9@^%l2KTbl j<<++c dN #bV28;` 6v$C> -}l~.bnk !.1k/E/\K4d˵;bK+=#ؐ탆`ߒ+&*(2 +m$ODӦ0/,Jg}-`K !Zc.6j -J7SK'_SN -s@9i^dR]n}|(dg{9I>wb5GkgVUB!knGاȣԓ5O5vbqY[<9Ɗ1Y㎯Z'k$frF/댼1ǻ%$yRؐSTFO?ա1`I+ph `\kg]ۺg P|=]p9ʦ'`)n MKtrV{C i^ct4>FO_k=yk|WL?R6WY+A|e1dnD3h4"󢨦'n)ؐ5=FGNc5Y y]U^ -Bp>M "ٻXw^ͫkV5eC\N<[Nkl~ I`$Pwς@Cs7h*IoXg#dKϣd ͻqoVH-VPB77k&Ҧf>"<ۑkSKcWM5Muݢ|tbN݉x\r9mn^ ̠`^X|NK2EٱR$Μm4pGRzls_Խq[IC#Qk9e -]ϱ4'.7 4$Hcj`B23 U4 Ruv)f5yv!Mg@:bY:zNeXwDw/atR `a]#TtKt*Ob8l6鹯Lwy>ړuIYPXrT1C9ӷ&Fb-nb{-f3(,&Ш 7̠pMuUvص -s`u*OoZbYgC~)Y cۃM8h>C5P#ɨhZk 'b۴ԈAعItH,b l{Cw0:rnFOmҘ6a [%A + ,qS S*XPRwyX<CWw9uWwFR~+ã;#Dhb#[D -HQP"K]|'AzNfUu -z='%ف\s{,"TgWة` @ qRH:]sb J3r2ٲVm!M6 1ۨm@zΊ?厏Qr͝@ItG'[9;ݡl)*N4w@9k֖v|:-`bv7lDQ3uikE( I7z#)4&at$1M蹴^[oؿ/8>~PX,*;!b'LZil) %?O8yՅёS]=}ե1\ua꺜O9g^#^B8F~ -:RlI(SIBCWc95WcF]Vu3Quxx -\ -LxhAۋBMJdlxpH #0zMcz]v>ԪMGr@auCc!*CZsAdzX-ToP:=>A ϚZ rIۖF21nAzsffIa'ABtֆח,h* jk*M $]1 Q[As{|u~1J>6/gB*ɁӃC;bXL=Oi:FH=o4rup@z 3/s?茉kH>5X'OV47AO~ :ӕh;*´,Ho~3'WjxP etG$]qT0ʳfղ (.)oPٓyoҼ7ё:pz*87٤^q|\oQ&:9"OXL5Sv:QsvgR0l')9rm'hB (guk6(z@c<;[!GvXe>}c/^Қ;h(xZWy[N\Qh kŚ*ٮQ/k4r7gO4$Z%%ɥ%gO4V]&<{{ kf;}*R.>bK}@I0u'>n{(u'!Vv(Twr|}״5-mc"p$6$FG. ׁK4 %0z Xqpq1:RbX_#+.VVdξdqV\b(.VƊAz 5(6)XSD*ؐ"FG*v*8Uu5cwZDfXQYDfQA٪bd*Cu3srI ID8y7%0 w] ZEsY7LROq*v4ä́GASWoR+vX !0kwǬyv!MF 1רkF ϛܵㆫvQUV!ܩAɄ1VOQ+AKJ]ٰLx3!ͫ+%Tp2u SWǍ+lTr -"C ;Q݊5SPYF)"C-#==T6pK1/zXO r;v|]v қ (i9枆Fi`&zatgk]/!r̶TpmoﶒfεiV(]'yqY';>y=hK?HO -6vK 1jUWf(ߏvLaq"B5m4V9; = -~VwjHa`ёu6n) X? g{'-'Cx-HG1o lM{"NW-Q[ȣf0Ql1%Yw`$OK,̷ŁёKq`Rús9 <<9ʴ -Ngq ,휖g2ɭZ ('9?ݑǡ[:JjJ-{~ i^ct4>FOOk'Up2؊iG$k5>(9'ύ(midIV -$Zi/pHV#g0zzV@?=y+YV -oBD -s#}yvh!c9 iF3HgjejP!$Ss\.S'>3 .89K,3*B 2(TS 5Ψ%ujhms3q*K 3(O+J#2`&:@(wMg]h"˷ o $4|.e tQPBQL0ךS iiB yM(A5Ig߄?t}t\b?;;?00v=hvf=1Mg -M7y1 h:*j:8h:`u"=;VQ-ԇgwjfcz- Ņp$Bl(,XS!b+u+̼Abk,*ARX~KhJݮWB"S) UK\<܂.xZv!F_>U:?R)m.>m_kPFRwʗlqWՉe|6|Uڳ:{o;[3y?޸4}1E2k !/SxV;zBuw{Fן_%X^#[N$-da<}֪j{^sJ?5}묻Axw/ +x]n$9r)M`abhOk`v`VV1RUHFE#hga^W'C,9__~{YVo7?>{qiI%__|&dbjsKέoO-i]SNXSb'k_^~,_NN_cX)h^w0+z]JbI1а6`v5lsμ.~-h5-ٯ/}߿h__'Y_/_|ZCyg\rSҶ|F&%WN)joF6|ܮnqDn ӻ -JZFOgL_+m *~؈[G#CYWK~?} 4 o%ޒdI]OvYobq9mf|y嗰/wVx5RYJ!1'Kj*;\Px[9%SYɘ>3!wJ_"Qc+ps[gKg q\ })vMDsI\}gH(džo43\5UF0dXIUo q!®6.q~1ggQ:l[fb# Ѯ4 1y1E{bL}IaNH6ǞEK&O|#:4ց[9;imkb <{[, .P,ō^ɽbi\\]N]Cw +?uohؔ5>FGNc5:pѓ8qNi|P|4#ek|b]IO4SF328/jzB֜B~MMi^ct4=FO_kx?$a޼O):y&Tɕ@?;(Lfg {}n&s  NXMZ0d\\w&t*ӘU奐, }"ЊڼgUC_dijiOx! 4D2iYl%عJ2w0VqY"H&/ْ(Cn\U~0$RaTi-MgꚉOƻƤN$1zڔ`$ ǘ?j}Oi_h?$&!~ qw(\w[pDC33(<`h8?Ӓ`h`i Ư kC=clv찿 3z 祔ueG#oܖoҐHAZN~Ws,ɳxG  DAUf150G T{A)VփG:<'t ,HO=K,KһxsHb:S0鮑t*||:t%}:̧C1J\6.Wǻ<5FGNa՛:pѻ}UCr@auCc!*CZsAdzX-ToP:]= gM-@zXHW# Kfoh`7EBt״5cY| /YUGTHc΃ly%*q<~{jy|Z <&/6qa1<18 ##~zR^ou7t,΅z}H3&jo3K`aF>Y>aOW!sl* +&0JLV*l e)(ngT^JTָ߫%kNCdʚ`v}rbpJә X&d&Cg { {R|GRvO\L`:߾L_#hZ~aZ7`d5<( {P:ڋ8*YY^z_tj7PcI<7MiyD}AlRP8i[jaa{(StNT7==p:; ByJdr\c; fB+YsZ Jo:orתv W퀳ځ BS cV(2a)9~rEځĭ[iߒNI C`&gmv?dp G.7©4_в9GNC)k=e!59$θz78i#{f;g;/P @zl~vst9a;v 9W&=4'OBcv* ԋI(gX_#Ge`(ZOa))޸.݃]CeR h$cd@@FM1440rO7 =?-8[zQlcv+|{4suHBpFaa`>\OxB?q@z-t0~ =~*+1(ǨV]|~:2=zĥz +qOԴtZ#**YZɫY#>uFg:ٸ$`!%^#L` +Jt/ᵄ +Fv!8~پ%t r(6N^iTd:]D _"֛DOdk`CdE:CO/3ec@׼ZLb텸3҇)w|[]2eP_{+?jG ~pO\XKMָ(Yce:N*k&5YcO6yё==k|W4>sJb+)\kLT<7؎mr'[R[I+h @|)[Y +`䭀 +Nf@SV[1+HV@ceYoӚ=Q/n)śDE-ؔ5?FGNc4~1z_' )LrͯW\w֯Ue<[Df ){9hF.UkO{;=y ܀:TmcT~7ܗyjF*S}qiʕ3 5ָE(pu&k)ijiGw>\|Z9:k{0^[v+*5d:F5n͓@2[_+W^ +E2S)̍{sB Nic==L?0zY@bp%/`Sl,SmܞRAIYL籖ؔ%FGZb~n-1z}ql3,,%̨7ȠPMe38>ԉ 4_owT8ߗwzQW +FeMtnmQWBn9o'nk',?bJ2Dh󵺔M23ХWAEC0@\kSZ~p3wN~`:az^=zbZomst!AMTt+ptDzvࣣ|[cwjfsz- Ņp$Bl(,XS!b+u+̼Abk,*]ARX~KhIݞWB"S) UK\<܂.xY!F:Q:R,a]| +$׿9wa\/*<⮪m*?k|E[9I\$ÿ2n`}/]'D[gOԾeRlJLֽFG0&HZyb\խUv ~kYw *v endstream endobj -1760 0 obj +1831 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1759 0 R +/Contents 1830 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1761 0 obj +1832 0 obj << /Filter /FlateDecode -/Length 5803 +/Length 5801 >> stream -x]ˎd9W`߶4 5 .gKoLǭ|Աם Srı#ᰭ_%UJ9_Ba?ү_lT1{kvʥS~:)c/UYח٪,1WQ^|~-_嗟Z^Wtu:=xe߫'#^T7KWF<5k ]|Jf>pE%[v鷯ڨq맯/Fֶ~xϤF[,L(5ѨMZ4v_>Tk+:=rXeI>]kuJ >FG !o83}O?g/P/,z!&(\ٰgz]Q-:/YMp,C@mS06Dz 9YxpIA}qq|I%hۊ6g(]gMc"Ci1KwdS>e޸x+Y}(FOl~0zfG7hb64J֛\YM^h\ -QM=7S/|hyZXyԇ\LXJ]G][.s qm!?tH$=.y(8EQ$L<4?H<OFoΓy2Q܉:FDđ` eu 8ذ#92$bÊ,GH35MfciFʾ1y&o:l%i_ lVDpM,X˶rΈ}=󞐅zx>J0y}2Otc@\w6;jח,oη1?0ګYb(пV|ڜ~g֨E1=*|3y V8Mhcrx7az[I 윳ϳFU^#rHV/ѧBg^Ol`.pv~0BZ#EtPMG;-kU;֪]S%qdP@-K߳}jQ:nJ/9[b9QM,c D}B`˗B &]8.`A  ]GikkPk% cO1iXKQRRKջPDs0ۣx@\ _ǗL(A<0(g|0%-=l4*`2}ZL' JԮT|9y㈫}SIbJBdK75!klaY`;Ɖl_c -_㈯q}^_L)SS6 4e4@ye4 P޽Aro/Xvj}5c4`7IJ?B^2>⃫ZX&);4[=tT2 nU (.)V` ܞXLqVɑcX`.fW]kU9$_W|n/3iFjP#Lj<L]ANt3N yspK)T x3e9nԲQm.CcnYّ؜wfˇitx$^#yPv.x/ev:臣hԛSeZ|TdZ?O8ȱ*Lqj +x]ˎd9W`߶4 5 .gKLǭ|Աם Tӯ,G;"|u_h_rZcpozeQ/#}bٛ^S.%kIiKi%Ǘ|Ve)jm:'kO/_M+^=uGyrw׿]2ZYe8S2E3--9 Db{_?O}F`[^?}}w4~ןj..>Fjm2"HG6iѨJz}7}"W u{fʒ|NkO(2*}&<ԍ<>C8?kl@[TߚLr f ? MvmGf) Yzۦ`lÉ,rA}qq|I%hۊ6g(]g :EycȦ|6qlWde@>=y-Mɛ[ ࢱ[+Yorf5yo⢱s1DE7M`L)*꿄uhika1Qr1a1*eww]n`5ĵLN8}"DHJ #G0y( "al&ߜ'=eu}󍔉‰#1paGrdH. Y"fx409r! 7/dC&,{ޔ> +Wu k1\i8cuQ4|Q$9MWЊS0&G.|a慯y n&v'0R1yzDeVyä(ƣV> 3ke= T8>O0&G.a慳y8Y{"uHchdcHc!tc~i(֒mnBvM^yAS:o@LsKPdV9fa$ +g _gЖM$ ʂ~BU"}9m3b_'da;#L^ߤ]3Ƙ,?ǝjח,oη1?0ګYb(пV|lYq5*Ecr8|L +L,Hu/"嘜MV3;@H5(?K)iihq4J W0UHئLH{k$TхpNwK`Վ*yWh;aInv٦5&a$7P->lZԟK*|ŖOlTӸxqӾL!{d?I׮w?|P!fBQhq6{;ZbSLZ>RԡrԒ)s>T*(,W*Ci% q&KSrh6K,2f">iWv哆ι΋-G\Jg|VJ'[*fq_c|R^[l5NgV8(*͍G|s#|U`.N٘~aP(G,;,1oh%/wo 5x{Q5xR5x?T뮑f6cMRI\׍º7Iٙ9Ꙥrpfy@mV0&\5ˀb5?+Tg9V;LX&o}%ݾƙZC2( uU;XOM8Cf 5sKg;CMԐ7B9Ѐ7\F-~24v醨XYʘˎyg*o6[>d߶1^3ߧx$^#yPv.x/ev:臣hԛSeZ|TdZ?O8ȱ*Lqj ^ƪ0y|]-6TEtWJUNwzX;am%G`d#(F9jHKV^$]=#(J./^=o2WEQ9 ʐ Ty -P"kl{FLfGI=P2f2$޴/ -;Mm8TABcr-x>Oxngʳ:8o|_(]e&(W kgU`*g709r Lqٍ)xl{k^6v$W/o}&ySm}إt,ޡNhTwupRSfa4<|<68pH刅4Pa!m@yBvD6NX"[u;#;؈b?DIIq b[(6Cr*ԋdPv=Cb~]fȞv^)(g ;al݂ID'D|x:l[!jNnC|C}u%[2|#|D}_cq_c||پj"55m5m Z$+MiL4&G.́ɛ<́+˟dV}Hs\!Ks̰ 304 q4l,!@:ީ4kթ -/ߋQ).VjCAXR yS}J#@yS>`~ZoqX Pn.QG:WT#[z<M=i7Bmj|LNԀ77C-k~ZЈvE0^6_Ͷ&Tx.DDTri -ɬb7yk}mѻރ8 Hc$RF4MhϏqlaZbEӑ7LޙMZJ?Q fɚ^fJ=_8O`ݟb0ں]9D8M+淦r m[?7+=Av/f'T1FYIh%kQ1냳&PryGeJa#@ySܔ>`au9P+0;X#HBUnaSq,4jSUS0,77U=%ڏn?YqD1늺'F.7-k!d:v,PqɑHiFpk&w'A-Œv/N@~nymK-OS-409ra 77l0y͕ݮu*7X.;vQIT6θ)_Uaɛfa(=p|t,ÝtgJlwE[8deX8 ԁ;!@uNWhR!0~mlC*@L\ 3@L^ ]kX{;LQ]L1+~fsl:_O[K5g6T7U|E&Mώ><#oMe^::; 1xm(^.E렼 N8S˔4m\΅FT=ӊ`.;+~"9p61cz{"Ÿ-cEI>)so]iΤ yTi{rĸ7( >`X[έOn5qދhߗ#}5IIj"t&9)Yr -ưVdBS(Mv(^Svq6X"_cO|_,U8uk{k,;8!=ei|=85<`(~pj#ژ͒Oؤ=?J6`统ڸF.ژb'l& <RSS0 ϟl5!@ -^0+R -OE0Rɉ\y8#1L`n0ytx|Nn]GS@YFTC&ug߄@%vc4cxⷘ|JI9L\Rw|Rnn5rYND66|鮐mͰMd|(Q<ۦ r*Mh,9 39T: ϓ xL99*Qmԓo(/-Gw=:#N5v6V\4o Kgs<=u[[gsP'T`vXuk} Nײ\f?h,SsU]6)ڞ:%F04&4y8ퟧI@a &p|G0_9@.B,jSRc,3}}Fd:׿yTk>{dYϿokqtLε.ۍEN OD|֜`o;}v1X6*f)ESͅ* h}\b?Y?IASmv -b[vdk ;-cn|I]1۟. +P"kl{FLfGI=P2f2$޴y__ 6b s9{oo<'o Eۗ +Wf=\H409r +w\+L9Ɏ1u}}anQZJ]H;\O ЈfOWX>{%)W`d5rY&V%ZK ڷL[- z%'tv[5 +d&)r.*}S~4N09rw=#L=%qZԼoJv0HNQ3*ƣR{rkIN&yTi<|ar&5/ _oޱk?|aZɅ/dN#t&xɘbl)3s0zon:ZJ@,Ib˲E1j#栫9,,"KVTiar(&8J4/D7X{|R.:\Ͼ#`7ؾP"I*SXҠҗ&vLκo|g4jm*Z!.~愺Ά:q%u*k_7* 'G,kE4UTӱ26 (&CiSU!?%\S0(Cԟ47 eb9DY/BH!kדE2a}rO;-NtqBʇSN~%O~&;W>׬^W%c;81=N755V=8>8k&P_c;Y|qZ^_ƠE2ޤޭTOs`ri}YOF?ܝ4Xui+rivn昂9dH;` :e:`pT Z)vTbT0;刱PTv0;=V(k\5T+[#aaԑNU>ՈEA~SOMtƧPƩ5S02>5MP4羻]W9E륰y}s Qy=\E2뽡MZo 7z{tai›Dڈ){1T3@yє1XPQh:bSr;߲)^t^I',Y@˔gi/S0QF[W+Tb~k* VSpԛox`wZObVzAeca$ϭ^Xϱ>Qv>8Ah5*wAxM?i#Vh|bSiDmj;4`d{OF3{w i,_r_q&3 :;YBL6䨜 D@J #G0ysӌ> fKkJu:^9(Ə]K;'Pp&\ 4@9ba75M@yoan\w sӍU=$T؈z<ŪX:B6%Y8#BxsS#jYRoN`!5(`]Qx5XhEtM0W ^܎4N09r 7"N0ym7b$$:XvŽ 8op-om}ye@&G.la憭}&^BT5׿ô[١N7Be5*< J! #0ysC،>!  1^cn+~>q)B^ym%Ac'$PpJ7N(B`*ڦنUɛgְvg`&cV#8Zu-j(O֡mn%*DL7}+dAy&1G>7];yX/ൡ{I:8HL!.SPq9w~VSL+:悹dL.7C|LN qN',JIHs&OޠJ#ƽAyN$rn} +nv6(9u^D+QM7|I*F>XMRSO5 < +(QϔsI=)։2zztqӪ32Tc7^nkuHƠt6SgeIu6%qB'?kgUt-e6È95W~m2A߈Ϗ{ZbL3hLyP&H@a'w +Z T/ ;E@jn-E ;\l?z*QL7` GtL0z>w~x-T۝)ٹtcjbSϚ3>=D8rnjebYd1{\+_ [6DCprHu)/ +ZSLg—O٩-ܶk{&Mv@S endstream endobj -1762 0 obj +1833 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1761 0 R +/Contents 1832 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1763 0 obj +1834 0 obj << /Filter /FlateDecode -/Length 5524 +/Length 5523 >> stream -x]n$+I$0>^Ç's)Fd]QZ##^,$LRhc ->闧y -n8e'9ƨbz*NJ75fק?LaC Ji=9|t's?}JVQwy;NKR;z֩fv1Iɓ 5)Y+_O?O{Vz -^k;?ieMxo>0D#F` -eTГW: -ٶ/JELdH>])v&*Ϻ=~o6:mx}(nC111"%Wgm]G㝊޼yܪ,4 4 .LJ0-q^ܬ\}Eug -4773k[z<]cKLt4!nIrd` Q|10M> _[ ࢵ / W4N^Y⢵SsaE}&y6媜צ -{71DNkF?u'Z$uS_ZE.207?NX =,ȅEa<,䙰:_bw/o*^ fbv/($Pwx. u")={egKQ0XP6vQ&?Uͩ -g.w>F%99SMȣfpwTV$NU"IQ*zP6vQ&?Uͩ -gZ^ȸLו>m}a-E[n~c[JNEY -]&/0F{y]TTh]@Pr}P)h2r36v&?ijם®^Y T/͑}Q;Skg1hD-vաED)L~? ڕSjã;)2vR.sӑZ1ꗭWR&&ǡL&8=G9aN7e!$fq#Sڔ\.`ꈛD]D1?_gVn-9>5L -8#67۬|GY[ !4Өc4e.SI0s2l#Z֚lj!5٠8IC ,FGʫ.]ػr#mY -"IA(n -(J0 nM7~B+~Ol46 -kV5Pli]׼zNJÇtmzC=QtJ8WϯwsXӅ'2h:W>"E^wRäÂrrNl׋Kdۜ`LdIJT6<@SnEV_@u(5鄵1(T>2g@zGٚ#*![cXSx'B!`r" -\#yɻ!˕n5wU[QӆLQeB޲eTfTw/^^,cFuJ` ;#l,^x۸hBi7;貕oYUgucpMUT E,)~Nש> (CCTRi1aar" -\#yvJEQtR-&o1F.b2DOX :-&C0DlŤ%[LP+n16hvZL"rD[L@mq\ N@m&q -jMgaJP}o3!kTFZ]i3 S~0ioЖBSgȖq^ ,sGɴ~pH(G,\;\K[nwX ll`/T;l5,j@Nsd#8vZZ6;5LwZ;<צ'd||O;ҽGzA9LEʫ^aLL=D9>}.Y"]m};>#Rx(9Xvpfk *Y#?3g}L<X~O;?b8vxmb=  9U4CjfyP˃̌Ay,?gayg ˣ*]퐱b,!P>@^G_;d1(8,Cj9F`'d@S={kŽh;p4k+^MA+kgR;crחG`̏ɓg!884U1iGg~ t%Y>~9e9cY~N &MU{!gkYcfrI9ldv!=&G1y}~fJRO-7 ˻eH. -rFWŎ.'P^{m\C0 *la3T`+ݢcj튏ʮB<U.@q EAhCj@9b(k$03@y./+WWڼ~9f6ÎF ;U]gc,S!b'Ta) 2D!Y`U1Y޵ wnvs[ؗۏJ2뗭Z}?Ǯw:xZ9x7(BXOe!-)uv3ZeHXvA7Yar"+L^jfYax^yqƂT5r=a5t%XPCVj,Fsv-q">Ξ38vɑ󐘼rf!1yu7+#s(cƨѝE0' RӍ厄JTq1\'Uq1\otJODukO#6`5L^Í4U9SN\ߜyOۍ}3\vBs͕[l !YD9T&>N8 #"aH#0 -l{3بgP#g@1Fj*^Tфh7> Cj1P̌@yt^ǻJJ+"8FJ+Y%lpK2QSW:+QJ׳1+:DYVj}{\y3eFUvs{/dBU Ԕɲ9tNaNe XӱqNA`rL^8ff`n݇~+;>t:J,[5nJTj)-7D.8SrC0]kC5:]y~7UUY,bjPXjVG.nԱb; -E2,I8n"L\X"L [=]p?>F>8J|NP:>&;l)rq.厱)lH4ɑ)L^_&M\Yrx*46B*4jpUhP6_8(]BRIQV,??8vQ&/e) g.QTiYp:<| \ 5T/%E[t"YhR;marh חF`洅ɻ윽9GRWP4Pc;e`4z9 P DF2F\NRy.Ie׾կ(O!-1i7yKw~_|Q9rCib/s] :"0o/1v @y',>C֘e(.vĢjWRt't5H:MAGz*q8|R8=$XH -4| զ[%播WЃQZ[ ZL7v#fj1g\AF*jQ}^t#juCPrW q#\-&)u߇ 0R_~?i׎?(eMz,1#XϿosf]V8f^_5ɁRڋRWeWb?wr -V˿{5\Nx.QH,0Db,a/\+"cVhۋ5/ۿGL{Cn5XE>0R{ >}!|N@0; q'װ +x]n% +)%`0II,ڞ`B{}Tw1)~Hf +bxVJɩ?g5W?_[|pNZS}|[POZ=VT3dI}~=+=?}}4<7j6.F(L2"H=yP}W/"'.gl&CqJq8#M0ѠPy֭3}{a{nÛkGq­Ɏm +d<7l?gl8bTVGg]@s(0*\vy=[xrq-w֝>gr*ܘl n˳3:ǖLřH!nɦrd'` [ ࢹ< +/ W4N^y⢹SsaE}&E6媂צ +G71DNkF?t'$sS_ZE.r07?NZԞar"L^hnaLXEƯ@ŗaDWIO1L4%㝠,tgdHJ^RTeiAq +S09rTOU#ps -e;ô[99SMȣ@1h\3lH@C*OUǡ*LvQ&?Uͩ +gZ^ȸL>m}a-E۲B?_1*Fd|;ug)u1lFF{: Gu`SuBYF)E{"7s .>a*&G0yionN{LW v,eMiu3v6Γ:T(I'R~rJ-C~xt'WN*e1y:2GV+FJZGׄۤ`zm#sT.&$q*,x|jrYL^qW}􀬋6g,XMҧk\ԃXjb&V!`*g W av!`.lJ;hjdTag;dTzPCkzlU]g lX:[16%sil,^x۸hBi7ǹ;貕oYfusPϦr]*gx }Î"~F?h^l!ZxC&㴘*gX W kvaazsy;(t T [L bd(b2[i1sԋ[L@M-&(-&&)ڠ]~-&Prvl<%f’P~EIZ0k%=ַ7*M-ʴ)zl77Cd|Ը-/} ir-^No|a^7Od#hK)=P R{#Wս1;<-떷i6{IqQ<>t;"ewp(@kzuԡ*d':Sq4|&T{ŕ&ϘͻZW[@>պ2oq㉉][[rlOLrA7vSO|NࡳqJ8IK¹Ŵ~Pt #.. %P-\zo;{j%{;Kp[MP5&Nk9Z՝F`紆Bkǝ5L+9ZC54JT֩)R8YjS-C0 +i7Wն+-8K˗)3RUCwb\0ES8J&G.5=5F{BJrPK9|'h'dQ!ϖ+&u2}nz|6(Lm4Svg;m~j[[˯J?*zt&;o;TҖ@٘}Rs\uP3EzǶ1AyGQDmLRwyI ]&:NXa}D`d R, Pl2e"~I{;_wl(~~P"U0r|d G>[H[C|ȮƊ>|xz)k<kVXp_c;W]}u8 55#v+Sv/XTj/k`reyY/˸z#gb NV[q^.1*b!sK6~]}p1oo[inKGZ2,J# 0y}#<`#,8"bH0bx$]/yap|?0/F*~Pvȱ>&/Y'Cp2q6>b9돘+`}/<(~yVg8+J,cyP^W<(O,,layUX22WQ?<HW~؋KF,=Pɑaf0yaN@MtUyt1W<:~ȣ3 +'#¬'r1:.37&"`*GL\D#0ɓCplE~#ˆCVҾxoWJ8:qvAڙ#?3g~L<ɘ1O??b8D}(!M?ή/R;crXחG`,ɓg!8˃8XtU1釜Ggy?U %|J} +ub*=&G1y}~fJRO=7 ˻eRG9+bG vt(~=̶ !_љ *n1X5JvG`eW! +*G2dqvA3PX& 2PޭKvUFF;U[/LNvq1Ԩ4\rJTҡlejr clʂL>QcF;5xsՊ,^xچ;]n;B5- KuNfuV-xݾcW;asF^#5L\Uj;e턎e^8i1rsN}rm90$1'iUjO09r)&o43O0y̶g;=i%=:Xn=q5FVSIfg&Dc4T4ah T@9b4JcC03ey{r+),A )*a;ʻ,&Q'jZNJTٸ+:٪flU9O|@s b% AM+Y5)̩"!r,j=9{S@L\njLޭo-ǎ;[N-:P\%[5bl)n!.x7WuˡV.r8減*,15Uy.vs +5+CV7|X"YCzV7P#aE#0g¶Prk]p?>F>F>t'('dy}M8irR;Marh +חF`44uy2׮2V9<|P +:\c4 y^D.!Ԩ(+I*??R;ear( חF`攅3,4P,8wi%WpBm}aIV"HVTj-Lma̜0y779Z*TfbYlg,́T/gk:T7H(D*+ST;2vRiٶo+Z4ޛ%;կi<!4Kȗ[x^r@Ctژ_'Vk N!sV(.vbjWRt't9H:MAGRKm<#_?Q KXqZx>5|(1=-)ZB'"Y;*5@9bk'P^ <1a PG,w{X!uWAlZc~)O8;і VUC(2 + -eh]8}Nͤ +c5T71x v8/9Ȩd6vA߂/?Voatc(@+m<}p{;{ :O`"*9TnjvZ,Ԫ4*8xN$j18ԎCVMw U.Ԣ^/jGX!Ԃ3 jD)jG;ZLS> endobj -1765 0 obj +1836 0 obj << /Filter /FlateDecode -/Length 5518 +/Length 5516 >> stream x]n$ )R[$ lC`;=mݼ?bOKCzflD~")R>~Ѫ)==<7Ol|˃ SHNJv1NAIYGc&goC9pRJɩ?Nן{T|/DLqwy˂z_<%OnO%J=I+auN0QouY8OvNh9LZן?/?Χ/V|~Yav8F` @@ -25127,60 +26190,64 @@ AM!-B vU=[ K*FGnWoW1O|WUݫfvR*x /x@744TTJgȨN Y_q^jOIoQU}$[\'N~]5H_%>;-h!6LGm8Gz,;V9 w_/NgUýL{rR-K?$6GW܂+t6taUg'֠t%⾐|\6Q%K$ 1_~#X>WDK,Kz{m ÙAr0//kY[O^}Y%ϓi;VmX\>ܞ +%$IJ)K(bi}`y+yVvT.r*M3m8(O(D9QnLmP#x9 ߌ3|%`:K;ֳwTpl6TX3}>_/NgUýL{rR-K?$6GW܂+t6taUg'֠t%⾐|\6Q%K$ 1_~#X>WDK,W[ O ÙAr0//kY[O^}Y%ϓi;VmX\>b endstream endobj -1766 0 obj +1837 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1765 0 R +/Contents 1836 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1767 0 obj +1838 0 obj << /Filter /FlateDecode /Length 5423 >> stream -x]n%SR0I݋,z7\{s}`:u,'%EmD~")ϊ>~%{_֟}'9ťS~:-Z+c/]V>ߏ.Q,^| \>~Ջz=}'BR׏ׯ/- !z:~1jɁ=(u 5y]*ٍ/OI-N@4KrhOOgmq@+k[>󗟞~+~ˆf $Q>|rCXW,>G_)>Y)OO+{{}'_so? -M#ΥS!QA/iqqQL9mz -RQ)D@g(XL/,4)1dޑxn,M4gn, -9Y3EM`&E /xɧ_biFfdט.s->elyYdӗA0 TA[)thX6am3CFm>6yMoҎD#197;D}#yv:=[$gcLO l W[c %g 2 _tc&hd 1~e[v@j\I9.cci|'s3= qsAn R,H@s0H nSBgvhNiZnܬo@⌷8 SZBթa (92M\݃eE7X6}а2&[ d)*?+h٨%|Z+r: F<-"?me"xL-&Ji,q@])+;+5en+ҳzO˯v' -kt(䦍A]' -u6acd$t1t+=z:Qdh O*2qƨBJ5KJcN`ci1:r;,ΘN w"ƕ,Q2X l(qrTb6%d$`mTfѾekn+A&i mM XL^6 -׏F=G5G7M[ Q1$#J_6Zu -q #:a:͘:alW\n/'w'A.ŒqvwLƫv;:Цyv@ #gsٌpѳUO"F#A+H5HxeMwo7x]I1V*x} ҥV9VSԟ|cwobM#_ -tpzgsM>Rȇ8!mr:OH4Ct|A|+ЮeHf́+d90[mKe%(=V A9[ɫ r+XΕE6SżdgC JV*VF2vW٪ʖ/ʥKKv:,FQ+z~[;U>L+_TnٯԷ76{8DhB_jWbG&\֭[t^KA:%{HY?z9ormH͋ocic ɭ. NȬˌ46.荔8> ]sܷ_qGL3g>ƇtP2x'7Mf˥Ukrk-i>Rٛ9& CZKA}nύըțB(yɣ$-ͩiݓδJeZa{+y͢J>XmR)znb?\mWLݯ@eXsdy @GjT66zjT6zQ0<L%CeT)-*wx#oCmmdk ^p|֖0"ŋqOEoi\4mR]举߲f2mdK]ReUn#&k)fiҥTX|wg˄jk,7=ָ}& A/ldi<ёhrј"/h`Cw c =A FPM6trX*W{934@BujFP-"#+`P풺e [T5ԃ9zRVHM-)E -SL?=Xw0:r(ay{{ŶݡZr552zk *j(%dRp[6"(t%BG?M}eEFb|<.cG=ϛ}rh"m&=z0>ĵ%%gO-x ё0zFKrkK6dV>[Fw$Zl!ʩX y|t#hv5[8EOmltnG0EFvsVQd:Q+VG񼽃2m@eLkö'xckn V? H]m"X[-9<-jW|TwkCjCm9ml<رRmlKO5jkR4[c5ښ`v%fHG,;<1EnKbvrzϟn9 ʡTS~zv*\+ۂ@-O^mY-la􎇭rsL -UW9o(}?#'ւJeda{?#{+XFvp7^2Sd*n } ,#;Gs sY"kj`׾ b-vQhf-RBeS;q#`f=GkzF'y=n$f ٗ<"#@%h<]q)>I풉v Ӊ޽Y%1:r$F]r|赽\ruo\ꎌ^OʏmĠ1 ՍRMެOb()34QBuj|߯=:n^7EQ;7Eѹ̰,Y'*1:+:~>N7mV!x"Jڪ N?@#< ;I(!1/ %x4Gr'aQ wތ.B(_bM5pcg,a1LǷ[V91dә_Gh|"dx@6 a' wȆ|GxȆ%lD}@#j*׽H΢ , kxWHr#v HVLX"ئj&,[5~7ó‚_Os^? ~trܞu?]ٵ?S\QdX5me߮.?6: oT  l/J.㶯fZtew%`(^lN)^$TXxq;+%WԚca^W,6 +x]ˎ%9nW8Fb0M1>Hb(cNdWU>DR"HR~/j^O~/KR)FEkU�ߏ.Q,^| Z>ח?|Ջz BR׏뿯,良,tsՒ}ݽ(u 5y]*ٍ//I-N@4Krho//WmqˏVֶ|߯_~yӗB\(=:%hFi ohbU^}U|?Jy:I\˿hX7&[ d)*ԿfˣuI!d%='?!(cCW`C|/yuAn%˹fl\I7_J(T +_ߝ#[uPeVvi_N(jE߮V-b{{%V-!fB5MKP +PH<˺uk:HdˋkX9Xl֌{Ls`;D }x;8.mAҐN8ڷ)mCȜu̡f:(㈭q[ 3l%m-k5ζ5v:qbii픊6[c&xk'W8kY Ki\771cxg&F?q`ٸ c ?S(Dz6m\r# P]Q҆J;sdi0:rћ a3CFdpVd[8A8{ݑԂejQC|\.S;COxwZgjg3-\lfl,S;E6s YKL[lhٯ:kDC؅IT6!哦E=w4tļT`0ީz{ʩwcVr1`0}s)22Qwl; tj]P٤vLp'#cb3L,qd.nYwg҂uS kl(սzgKNYR`YHA+>БvBk۝]t.v Z;B2 ޡ}ۃ;Z2uՄ*Is&\\:Yw0:rnFo4cۄ{}ɒDeOO;17U Fq-dҕ("AO +_t2ٞ`di0:r0ћ s3Fi7%saJP0$s! E,mnz`0Eyԩh0EFf@.u5V(ZR]>o(͞&|@4 hsHԅH%A1$#d +,H9 7E1E5uM tK:jpȎwc Q*hN[ Kð-Tؚ2 @zO#n?\wdr%F7BNJVЮ~Xڔ̪%#JAyL<4y9ͅs!g.urmqGs;zZ|d4(|lFvߞbT) Іr[,C FG1zs!ppWX~svC6z~ aְTy5~[J-Jkv\e7A +ykEj6}/f=_@>{*RqXOChr^=H3H ՞ >cr9!0> /ƛ>i*7[.ZKָc^; oH4ޤ1q7Z3EFVn%u+/=Py|jvsA:m>[S=?|~{4at#Pܣ)2mw5C jb1j`=e./A2U0P&#JPɤ+yɃ,FG@)2=k7\?|a\j`=/PF9Iu7Yhegh:?ujĽ>5GFvo@âFP"z[jgFThEFs<L[l:FtQ7ɞdi%鈹D\GDs.Ho ZSdT b oDsrJC7Ę##AkEHm!vYelXE9xl^&I̵Mw+E:Why߷ڪ6UW9POQ󜚃,;9'0'b̉5bNn~'RΉ@ # .vRBq9Y(DrQSeO 0!jl=i`k9TRpJ>Mt*q(ap5E^W;c0UOP\ 5b*ЉsڤW~'VƳP?u []vPfoVNYOV/؃׌56jM;k*xdC !f"P +'z(5Gz(9";Brx ׷1Ȕ5fr}ldMEP:K~89ʘ/!݋"?x\x1>xǺz,_7-tEMT{ta|kKKN[ +#Caz6֖l^}X^{;HQoBS +5wF[p ܎~{%a66*c;zM֟tV$>yy{; -OeڀֆmO#@:~X6fc rE&Z B)sxб[ծ.6%k֤"6lsڦycO5楊s]=5nk!=إiZ)bk5< K$h9ѫ Ké Xjwxjc|Zz=9qO?ݸ/sCTWJ%[.." 4[9[3氅+ra< FH0m;d>ނ#ndD6z>l 5 j^zgQZxa5k<Չsd9$A&_c_}OeclSg}j쭋?wE MQ` faAa?y(yV`#[\o}+֗g+j 39^溭l~+)kb@* +qL ; +–d"j0~lOŸ W AH1o?oz吻$JZs]s?m֠U X=+ endstream endobj -1768 0 obj +1839 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1767 0 R +/Contents 1838 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1769 0 obj +1840 0 obj << /Filter /FlateDecode -/Length 5473 +/Length 5472 >> stream x]nd9r+s&F/ c1zVc8xɸTꐌŴVJb! ^g'EVM1^~{fo7?>{1a @@ -25207,63 +26274,64 @@ C03 (,cJǡ?=4c994;˃yb1k,o)ˋFϋa7aK|?VU ,vqK>NI[mgd? ňyFf1\o.0. T#^r [t>2yv@MFGtMFULCW-f0YGLǭb5*!3FIIƌ,u1Cq6cC恙1^> :GUҵͽ2_SL&M&b)Q+X%[IiJηbqU saaG@>:,Hѐ{;܂:d=59(R>b @^BtwN:/N~ %0C \(JJ`rR>[+ӁLevT;X)[‹r&Ȯ𢴴Te\K}=ѽ1^HOd/l6-#v} ob7o܃C4zθ.&C(JV}1>-U2/']gOawe,Q`2'=YOȇ$o&^4Yλ@:byHGp墖! 0?|W}ITqfʩT V \#l/JC=~tdFG)W6r} r&s_9jm~5jQll\"cPo;znlͯ[nCǖŞP_T]A(]ck]c5*q](]Yƶ>5v0]c=k4x0BAFpP5!޿1n5g*&&4Q(\$t |9~9q-"a7b~??}?J\4{08e 5+f9 Kb,Vgu`bӻI ~Zp9XS4g" 1,? - dhy '~+Z, eaetUqg̿Ur6m4I ~tvrLsI + dhy '~{, eaetUqg̿Ur6m4I ~tvr 'H endstream endobj -1770 0 obj +1841 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1769 0 R +/Contents 1840 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1771 0 obj +1842 0 obj << /Filter /FlateDecode -/Length 5527 +/Length 5528 >> stream -x]Mo$ W-=HlC0vf@$4}^glO(LRhc -޾y -n|5ƨbz *NJ_39k^LaC Ji=9|t'k姗>i~/_IIwVGzQWk=OnA>iwԬ֩<fv1Mɓ 5)Y+/?Ͽ{Uz -^k;~idM|o>el]"Q&l)dBaE -zJY*9mFg_D.-.gkz6!8t8ڞ_SO܈!'ռ.w=727Xh)蚃qFJ&G.4 F`&τ+a<1]JdųO\7_* X [DgĂ -| n`eipm sYea*,LqY#s3Tp\mk_aZɭP1yjNq.&/( ,B~,n&f`Cso^M*jyR{ȹ7L6;woTw}9ׇF`]n:ca٦E[ tGxl팒%_ zl"O=ZTQ -OBzZM2vR.COZqFϙu~wp$ I!5&n;9=G2+1yΛhKbxjlJKɫws&]WZ0fkh;$|%fPuVӣgAo] f>f}wxyblP#cjrE@cҺ468VXQgt#T nu;G)½Y=bLtS%Pwl QծwJ --oEƭ:y,a<eg^= CҸ>r-V ->.ˉA1.vYu\.Ȯ9-Kۖs(}r8#@\_ƗvUH\N6 #Y\ƀm4S'`29)e^3NjJPxk⤦N7{%pVF)d\#5Tr͐N -[Gsa5r -ʤJ=\\c\LN&ĠT;hh[2<}^8VnF/a݊j.aE5*aw\ع!¼!(lFXms 'XT8WJlsv߁LSJnO0jjŬp,K**КfnGQDJQ&G.* ˢL5ѭ%ݶʙߘ)Q˪&XKPGIuη UƳ3)+!vPߩ!6{KKQPXƎ4Y)ԲI۱ ]+,mbˎyg*l6y?^ZY>+x\ٕ4sݱ(˙l] { - \ RS=Uar*LqQ,urФzd+zTz&=r!v2hKV ȪGP#cKV,AxO_on n6h'^=m>ܺۯxE(CR+Hh@)_r`$,nd6Tмc&SAR۠*HhMcWI9sx<-y|㹻Q|cG$G8,Pxz~cxC <4_8Q"۾˨P\A9sˆc>p,&~9;߇O ӃX;Y=˾ej<ǻ CbOU19r|F"|j, nAտR[)RCj4Ūӆ NC{_:mFπblϡ`+y}^E2@ 92 : Sffo(t~j+B+[r@ρ+j0.g*NYЃ-yjդdOeT١š\cA0ZCƊb V8X|{\zT;Ko::1;Kow#r[ Pp4Cޙ(C휂)C0$Q k3ʽ1!4[AY٦Ay&Q\R]s4Rɑ*p!#LgBʡms+RjWoY;aI)euI)[FnFu{l3hS[8J!ʶr=6jY}τ"oL@=vUL-e% L(C4C1$Sbaar" -\GX# WdKoD4J_bG.Vb2NX %&C0Dlg>3]+Þ AI͔)L֑s!RLɑ)+p>SgJL^l{|n60ZM4٦IDcb?.ed]vЦ~2#`:.?d uU,;о G˭->0X͟TBL,~?bX>6%y>~Fv'r>.h_GHo9 ns;0) vC}7uq9jNߟ~pv2&9'4^Co?.a"ٖ%N&N -(ϊ&+}Cߟ:s[ܨ| >S +x]Mo$W&Ç'98$$e'{z3#Y͝C,ZJzdbX$LShc +><7OlYGɄ)$Nv1R6L3>??OC2SóRZON%] ?~5? ::?n2*H;*4ZSy[POZ5u*]z?=pys$Cav>SZӗ~K#kj>)fid2dK! +(rTГW: +UQoW|?"riq>SG]#׳ ǡ+4D|BYwF }w>hgGncƼ~ (vT fPx;c;.4 W͝ Y%_T+=w'[ D <zm%GZT&,QQ+sc<%/Lϊ[20[' +2X> ~ziNzFGl6ga ࢱ#ΗW+Sbdwq؅k"SBc5V1LN诩p#V#md.;瞮ck͏a*F7&4F<VQ'z*>Es|eDn$8c5l *P5-xmkܖ1TVeYZk09r. 7e]&\Sus5i}5i%C99(Hkȣ@1no`bFft34{jVQۏ0&GνaƸع{ˤg\˚TF>^6gޯs׉ +&:Wy!sL7;w}wvvc 6MVFw, ;ckgt-zԓdSy9ԢR~J+'n>JvbLxҊK05}Ĭ#iMM +)0=6L#sT.載$fGIɦz=gu|uI!psZifC‡]bPO[hQgɋ1= +|əM.`cx7az[8Zk'UꎱA9b16(?K!W>P 4/Iccuj[qvI7J0v[\yzĘ):"#VMDa9!Y x +5Y*x׉Ti\dڮ#P?{uS;/`lO>$. #b㲜x;R m\e B)*qRm>b'=4?e|gWdà|<%e h6K9%} &xBZŊ1&e70&Nj;KtSj,]rh%1hNk,,5PME{x Tj~4X֡\#;L5k5V 5dB qJXA3(ﰌ%UcVa֭VTcV|쑋b/ fv^j8N`d'‰VO`(#dlRr{:ePU+fUdP\RQ4s;'*T +09rQ&︨`^`.n-ULGB_V0ZJr~AC#?)&B'^ոNa2ʅ87J&G.< #LYNKrjw5ok.j+j i)jF8jj/Yn 52)ݤNqaUw_9;} &ט40J3(idT܍ؙ!_P<1c`sՙ ԲVrLڏo3([ 75./,+ula +B\E30/l8fOwbLSN}1=e޳[M]\8s0=-&o9dPx#Wj$dP^k e!Q(5}zN x:m\:m4%ӆ`d (J>~ GPU@Y$sAkp-i1p_]d + e`OmExe^PNWv(9|E &,B) zж%/;@m쩌*;W8k,H5VksXQW +qq  +5P?k,n`>k7ԇ/Ko*u7@9b\G7`g P^ nDUnKq_9v;etSP pFv$jaOPF\7[9$wߑft83KC64H d!K*BK1u&BT09rB#y{rb\励mZ[Nl-GRJY'jh]GRʖQ%Qn<Ş=b| ڔΥdFmg3\ZV3!*<cPϮno?⽢`KYA =}6=P I?㔘*GX$,a\9g`zdharB +\F#WwYbIooNZ%a5-x_]\ѶܕMcS>l0= 1Oc3q6"2ykG2ɻH2PiZSϜAwP!<wP^mD[ͥbRb0푋 V*dT (Q*6[)CIFH6"ԧFbQ4ImD[On=rDo#e6FTۈP-mKFbmDUv(Ft(x8k6Cn#*\c(qxxzXEpHa\c5X7rMp"8iä70&oLzcverZ-DܹoD7@M(Io˥7F Oo`n!b^xFx Ko Z-^n1jpRnMbHqR[ȹ5L6;wk<|vi%P55@B+QZS|KgfԦ$2lFV%jYR~9b:sǣ]( N8fJ&G.4 F`&|9X&_8-Ѷܕ{S09r +7]&\\Sus%i}%i%C֙Ÿ-/p1cS9!םbOb("_|Tar&o;LaL:}KeQ*p+MT)nUsudJ2h i.dy(\KM*Q8{N$PCZٙ]|%Xj2+Ãݑ_YOkI7LڭZu/DdJ+'╫2|v*PBslU#O#wZpԝ4GsO68 +a۟ǟ~xΉsI\}]j}“ՁorԜ=(Le> endobj -1773 0 obj +1844 0 obj << /Filter /FlateDecode -/Length 5598 +/Length 5599 >> stream x]n$}W6̃bZrx`^Ua2]A*8 A4/9=cpxEM+o~H߿8M M.%kiZKvZ_^|>f;EbZ3yC|/'{NQ3^7!DOӄyj5@w/>.}2Z&:pXS2ˋކ3ɩHVqJN^7_b0Ʃ/_'Y~w_^[LA4mo. Uzcr_'Y?kO]akrxѹ~pWaה'48d\T>S6Bĵq{=5(#q{exFɒ|==MSbȨ# 'z>6֦PyRѣ ˘zS0/muy;((IL֩8F ~[“؂,_wڢ @@ -25274,24 +26342,24 @@ x l!T($GrM,LeaΥ9eaŋRiw8J,Y?*az XReCLglR?marh w.mi w9svlJ%/աvbh@]6lD y7}³ AyXy>"EG+d.{[DvpWR0yK L!cW mUck|KLATp?gb~m?ӧI"kGD0麠RISu`;5gJQY+M^+rJaw5b> t"RlG[ڵb8lkygN=9DO\Sh%,C0L5c 6ZyJ@ŖUg~=ZU.M,'Ҭ~&Y.ݘDps]لߨQ#XɫǓ\s_]|SAsڙ17e)E!)w~gw뢡t(/&=G欓-SN5R hq [cbk,%nk,ijq,[h[cN5)8Ublbk,x!)Ms`ra}H8Ds- s q\.1BOx'p9F`afa!XC΁py$!V6Wǯ#a%QlRiՇI`rLX`Dp\D{;ǽbjr= #0r( 20yNjh*(63yj ?cbrfLLsDVTf8[IlelYggA*Vs4b>q;>@-1Dylԩ~^0c-;^Tէ@Y-@k*C}O_AZRkuneƫѱEp"B$&ɶ6r&PPiH0 v=\t=JT ltL|b|ҕ؁EOHu9>OJI4ɑ9LX0y W2=8a99АXjDv<ŮX,KC0t5լ.E~AwJԷ#_tYD].Q+AOϓ6EȹH.҈>.&e 8R,8خ%F/E]!M8'[lR?uar 7F.L*qlu{*jtA,PhŞ/b P.1m:M;La݈>tɳ /)[4S*hNQ'`|(9-{0%J)D4L'ç@I@PP Ayf]{}]?^j66#Y^uTW\i7?$g,@ycdvt00AyI|$8.C۸Ip>61}'Go&sbߟ9!vHK>M碘?>^Zݻ`=& 2.?{vkG&?(;DՃM19r6&ϸeY]3AyYbCm߯z;þ)i n؁PIuAG;K)v+a9.N,D眔NP;A O=,8礦V6m[坠P}L_"{;&u1(=;\'Zo/э JB[F#ky߄˼!z`AyEء! MTb%`GDO!٬:m81DԬiI]16͚}lV7w/m4+)ዶkdJx=K֫nwΒ!z"&hw/K٪~F8b<\`a lZHaOAj.n(6|*g=!vjMY%LbYƙslsrq"4|v {*6롔#n*h}] u5o">$NMNyr&9:7a .`l3'{qu?Ü PmI8S'0b&oN~"~~uMGRȴ34ϓ#PAbć -gAH+H{V^);W3/FB§ލ(1> endobj -1775 0 obj +1846 0 obj << /Filter /FlateDecode -/Length 4766 +/Length 4765 >> stream xn~ @@ -25312,188 +26380,181 @@ g a6EbN tv#>1N' |.'>1ya#'&O]lcm;d%7Ȗk5lS}-Hn~VFtb*N\!NL;9tbdFNL : ֟05ŧOaZoXG"d'o)|f;tT8 6(Bvrⳇ<|vh湊stj=Ű5-htRAB*H]!TP;1DFTPRV_cFtt'F3hsbX5y&pVQl`uQ,V1䰊ɓj9V1y2Xb*hΕuo̯^̇ڈԁMϥ3opBQl tQ,B1ɓEh9B1y2bC(h^"|?Cqa|܄Y .}%&PӰz`"di'ML,6{ȱɓf6ADZG$R$c)d&j&]4"S4d@Ydb!'6rdbd6L]G&2WOټ>I]=Uӛ?p@q<&MEc(*P}dE`uu;w}k~š05iK} -[:*8~Vb:Q[]!QL?Ab9G1Bb(hݎUwJG-͏ZluP3}>|?TTjvͣ@u=T,[\dcw~x-*]k>HmN˳&n}fV˃㶗ʎlUNb:!°PW"]IKj՗ަ+ C\mN)^6B4+޾R8[(;v}Md*~[ܭ~  |X +[:*8~Vb:Q[]!QL?Ab9G1Bb(hݎUwJG-͏ZluP3}>|?TTjvͣ@u=T,[\dcw~x-*]k>HmN˳&n}fV˃㶗ʎlUNb:!°PW"] U+{s˵P0EAj,Lb. %[l +D!X9 endstream endobj -1776 0 obj +1847 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1775 0 R +/Contents 1846 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1777 0 obj +1848 0 obj << /Filter /FlateDecode /Length 1412 >> stream xn6z -@ΐCA"m(zp^پ?С>lJrqC˗ZpdQ g3ß(Zپ L浱WcrНYޯ 6!!P'DMNhZ8g<}m޾~i>?A m<Ұ=|q_|d4E')3YV4ތ Y lvJ&ΚO seѷ=mն\}`/5ѥb4ޑV~kRvjUqG,yȀ@ctD}h d0l"Y>4>>/[psdCǝwbx@ȘY%#'.x1{}=^Jbi~%ɛuz3!E)Eso \v4Nޞc8J(2Fw -:Du4p7$d/.jDK%oB,X}]tI<-$F ] Rk;|_tU7IuLu/I2%'Keo: vd 1.b+] sdoO Wç6+ Q:Sg.>XSg>7VSR|.*|%> ;Ğ UN19NIZL2kX#& WC6+ Q:Sg.:XSg:7VSm7rBqi>~CQvi>y")-!tP6/uNe+Ӂ7Px3t*]:x!S]5t*UE& t*UA6NjpչUd㣫*OSpE'l!1҅!TNPwW[h,Wh+ߘ37/+7&UPtW\_M +@ΐCA"m(zp^پ?С>lJrqC˗ZP$ g3ß(Zپ L浱Wcg_d;m"C1BL-C4֡4"OۯߛаpxH!ڼ}|؁M~<opKâ}9rʎi6NN)3YV4ތ Y lvJ&ΚO seѷ=mն\}`/5ѥb4ޑV~kRvj'j*8^#"mO I@q"&fMRlg;{j#r /ON9ç΅S|NOwW[h,Wh+v)>E˄qbOFu-t&5b,΅StNNwЩW[h,ѩWh+ЩԶt84CQvi>y")-!tP6/uNe+Ӂ7Px3t*]:x!S]5t*UE& t*UA6NjpչUd㣫*OSpE'l!1҅!TNPwW[h,Wh+ߘ37(s[x(;(pҞ3BxpcnXuOwE?q}MK endstream endobj -1778 0 obj +1849 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1777 0 R +/Contents 1848 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1779 0 obj +1850 0 obj << /Filter /FlateDecode -/Length 3029 +/Length 3027 >> stream -x]ݏ_e8,Ibۤ(K?!EYdY#Cv᳗8?ɡΚO P!D|t|[?_^hwHBQYBNyQy}gcMw9POoL#5z``IfN6u=jơyKWfʻ|ͅςg0׫7fVrea$W,oܬeÕ 9"Ǐ3De;s='f:D dgh銦8QӤaib -R7.1e3qL\sKp!dxX>,^Y{ٜ,5w\Tr6ǨSHiO@kc2 -K͑IV5_N*k-F];jo81L`X>D)20fq6_N=ٵcJu94vxNonxPMxg$5U:0IZJ7fF8"`ɮ~)QӴ+X(&p(mݽdOH(1nl[RIhu9Ze"Լ3v6HmIjPV gDڻ(塙AӔ} *#{ؠ22 F3 ̠/~*ܠ2 *#jvCɼ|>{PMJcfl7=l| -~ H9XMqHQc 56g.ͪv3CR.}*!Æ /jKQa!= -|63c9 -veX+u&5Pɝ hR69!redW@eܽ21B7:c@XQl8A˂dr%ym>Qe_{$6h٢8cWl f -B2RwH?8T9ֆێ2+*>- -f^{9@FBײFdc'f,GRV#$3Z\w㹶@p(3f5@,%iG:P}AĎj1l C[d|T9Jk( c&%[ [⭌Ls}t -m&MuoZF0q ) gAyqvxgCHv{s}9܆rxh+~9f@<0|D -ti#/pbD嬑HN\WAt|.O\JTAnK7K1̈p>wU=iƱyKWfCb4` rQp}X,6v>LJ\5I󣝱|< {x|t?wd|g?},lB ]#) +,8L!uSޮ=CW{Ϥ5:WxOv W +OnUYUIqgoϱ66;G Ɉh u3琲=@I{ȱ,^ ۚO v5rIߣHGC0L}*y AT`& +,DI av:.?\B|&Ã!B~2lTR2H9GƗEk!5ؽcF|\SFfy5=SӧCȥ+Sv qOG"# (`~g:ll S'!-_; v5FBV"oOιU|Ҕ1zBImLfz]xW_W[+G>( D51 wv3q\NO<]&_Sɪ Oɰ4 2.LqSHv&} dJzxl]$xJ2E # G}Ug=- +Pw6X37.J:ngБ oԞHFd9$- YkPՑfP0n0feTAudwTGA?̋kMT 똆*|^WB63~𾉖n\Y] -!Uc0v A j26 =#&fJ{$sҎNaKԆfErxc(d7Zwor!4WR;Oy-u,< ؉:2Ux#xxEA+cpia=kϸ}{.*rAm>W N,&vmp3BRߡ~Xjjhޮ΀߄û`s2mPY"KSs +/GSm/6~1/}0˔\IL:rվ1`Z oKD$7 FCG7Z $7SGK[A j][ [Y.tΥk7%)Tbi%ϻ }'{>9 0CVd2q=I*M f晖.%lزy:qG-5oI+e_0]B鮍&$c#xwI.d$!<$8 3ˈײ3%Veh <8= +cdqMq^EwYc̪XYI ˉà?:FǣJv'!e\O*Tj{Z[S,#Z0Q{^{S򍃧tR 1XuVSOc*:xxIup$Y62Oq7_dE @w @IsPj3%5i5WkjǺ|8 2%}IvVU1r/-%GB[ $ȥ1X!VD3t޷]8%ߪDT)J jX5.U.ZK"+T + x!Z +W*#9XF:mL%i( ~d_H8ε3jkQt~f%΁7X*hE )ȴ0]3[^G1,(]Z͵ y8/kl t5B}f|].{*ǿOỢ凵 ^O0Xa/So?8&q۷oH!o#N5R!\?|v̗ Cm`7(K_n`<vLdnhъyb \ endstream endobj -1780 0 obj +1851 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1779 0 R +/Contents 1850 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1781 0 obj +1852 0 obj << /Filter /FlateDecode -/Length 2638 +/Length 2630 >> stream -x\͎)Hs,0t9t=mټ?E([v(=҆#Yf-8j~@ɻ׃Vz(!N #APXhBgo_:琾O*ҚQLw1~+(}忇3H||5 BWsU|o$zG֐CHa5`fti&6/_`yc>?3k}|||my7X='06|u8*ۯEP1a -r -s+ Ql7~^’_kNEbB&KӀMڪЦɢd#u'=(.t3rٞnmGMĥuv dˆr$Xkz0nSY#8 lv \Ȱ]dFP{1zT!,gb|bME rqB)6e: -mYpOg)rb,*lb)́0<'$ȭ I S*dK*%A["\[_C1J;|l^XM,9&e}u?vI֨ETVkYGh-9pSZYoڸ.S8HjtcۛR#u9ɕõ k2PۊjR& ª/+3܋%+ⷳyWE%gS,M[c.~(n̮rcLEVWƣ0hh( R7ri"DE=)P7UR);&|_>(r\`Q6/t>2cRLV%uFɗв^x?J+@ m 2RL1+v&WTU&rX' -c1~lQTTRm;P;]g^mr&@.\3n,OאVIBy%De[ eya}0r ߄XRNģ -)cx[A[.@8>p+ -I=\wAg`ڹX^.t s3v-$V! h]/xbB{\*Y(nY -K1`Nw&p$SJXGo&G -Y G5GJGJU \|V8v&8R(O78ZHUt#[#o)pdn#.WR#[Ju)g]UpSH*G G"B9pPnpSH w#M.uP뿟}B>Z1EfT1u)%diQp|͔|R_ȳD\Kfѕz_3NT,aֽ~K,.n ؓaIAa}0,?ֻlaɍDR!ݵ9qu'av qe R+((C' / r*@w ナs`X<8"( B| ] x77g}4h_E߽A3( zv YݠkA#WFN [C6hnGij֠i0*:5hZjS4MA#z5f"CݲH9vDE_LݱߔD Υ{ *8RҖ$Ңk^Zz,G)]k Ƞ3sF|Y†(GE]|XEyKºܖA`E nNv86"i3%ds& ^MvRh+ٖN]gN;:f**Pw|6$OdS?VFN(rYu5†!b%5?>2)ëS9jǏOQw륀Mq(y##nHظͅTgP`sci!A`.#uS{< t[\`Ч b9Q >03eV_ uM@TX̯ +x\͎)Hs,0t9t=mټ?E([v(=҆#Yf#-8j~@ɻ׃Vz(!N #APXhBgo_:琾O*ҚQLw1~+(}忇3H||5 BWsU|o$zG֐CHC0rќA+gI ˯~#E/߳eӿ/'F[e DD݉3a^key4-N `{ G3i|xOlu6Q!L`96mmz?+pUH_:Tcӌ /[4W@`#n₣Zt1ל~žL-U% éME1IE2ʃN"Nb{P]Ef? 󝏜|K"Ȇj7H +H`6x8DB5=G#q,pDa}KɌWxr:.CXl֍=Sfn&#J[9<]M*[d燪ea8LAħ鳔mn|gbSG^q\t@f֦$ArL-ad-@.W + +-Q Ҏsl!`#rS>Kߦsýb11T6AV\j-Xn*kܸ8\m +)"] vw<01P1Ty.wY;̇,U@G6yX}7V}Xə^,ux͎<+(5gɘo^#q*1Y]5 I,H޼"]T?CTK5!#MN*OBآ^v>ĥ!2stbgmr%@.\3\5YPmѲLp!,OLF&̃4{*qunwE1Y 9\W7D w *F̽PG-:蕧FoJNY +zdyʙzSBnI9|Yv_ؗ'ཬ9yIZc ۈ0M0^񭊗0% 1՞hV Ao4*2r-œ^ H675~0' s<@4pBڸ͇x!%b/|+wE'G7n[A8X@GEt&_ kjaI0HYn:c70DbBA +(1)'kнƜի: ,v pd3w#Rr8~35RRo8R8R:v/8RNpJ-MC‘4By GJykϧMۻ^GJu lԥ|uM{'WsRO#Ѳ}0|"Q ÑBBzO# G" H]G/82?*|c!ͪ3b amTJpX;|R_1V"nz3NJ'T*0c^%gxzH`b7ɰpu>䎟gb]ێհF"){ݐڝ8;ѓ0;Zc\YcB-~>"3 +na,'#C \ +]aqu \3X~<6̶p+`C0lA ]B`ř|> 4ӯ @3( zv Y@#Dt^ 4RvZY%(j>D(M 4By-4^+:-дzE@skϧ,4! ;gg5r_ݶ0@Y0 h9 I=ea&`PciQka&W }sfu[{Œf^ka&r#8-!ˉn71MTąoŔכґhĂh6%J-FEFZ-fW.~g?+S{J׶ 29+t\_a;Q"V.>lG<{ƥ` nˠiע7]'? \AM vRyNHzVH /&;)cKWOaH_I']gA;fjjPw|6$O䈸S?VF.(rYbKڏR]k-v]q.aix?}|}͏Oaojv1E9BZ/1*.u4iyJȈr58.Fuj3(0 RXO91 lgrpGAJVap{0S\h`k2y}T@dk/ͺODOJkg,ʼp endstream endobj -1782 0 obj +1853 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1781 0 R +/Contents 1852 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1783 0 obj +1854 0 obj << /Filter /FlateDecode -/Length 2975 +/Length 2971 >> stream -x]K# WD+b&!A'Y ȡ1 0UU*U}4<~E"?>Dp;BΞ_=}?iI|I~|~B|$9ZeCEDEQoN<>#* `".P_N?<_{zcBR|wpɂ|mp#*:~ݞMe?ue#xK5`fri*Xm~=׿o?(v׏x积?<. -jrI񼍘.}naj=me#A3 xA9b}{gTj҆΃Eri\LCǺC6\NPmY|/܃T4'r]nw<ϋxy˫ J58wwV(dqϐ nKuD3 㫗34 k-:GJ;!X9s^{lc$ - ]H/q -&+ǘt8֖AeI](8Eu7_)Ā*Cx_5/` }뇐^x&L tK2Om uA-W)}.*WJ -kR'L8|/E)KI"״-p^`Zƶni\ 8P -E\4XWTl!EFw),8SҸ+VcfR{_1B?>uY|{XgJMHA0ܽ"{MX@@-D42W ;!U.}Dhmu)Z= JUnyU5D^Cq37 -\knv}BW0%vNKM R$e,.wÁ")0hdH qdV.ik2)nzEfJCd[WSˈUwtM4UwT_{2"wU!ോ:RU4\u6'tiB*QDV-֦fH=eB+v|U]Q ׭lrAJ -29%Ǵdڊ'O/bI(Hnӧ RuzOtWSui8L^V#ѧI\six=a[ϼ=#mYWY/Bnߌs(Ƅ8Ly_g/gQcџ{8)Na}BsdcUc7U*W!aTEH13<ĸ:F;Jۈ&w= *˕ \Pc;&kT슷zh4urkߦ:mG۲;]UG؍Vj k -ɩt$G;VA6ϓCng5N)´)KFâ=0Ywc[lTB>%}qaCdG6|u勣]lnH Vb2cӡ{臌^]Cov0DϞ':UN) -Nl UbXնY~DluOp}m8*dOG8l:ysD76<:+CGi[c^-KO)Kc|2kEL[^B#ez CǺt?y`hR0ub<cpR -Py -"h,N%Ʒz0@1kY>=_myo7"vx#&K(jC%X] Ǧ}k[ugNCc6V_Mk?Pѥm` 8WCt5w9ӿMҸqyauȚ?C6OTNRuyM88j)SR=tƐ~J)1 f`=˗҂@3//8^ʪ(<d +x]K# WD+b&!A'Y ȡ1 0*vJǯHQLJ(~_B믇rkqTSW;ai9PSf1P3heutLWjᇟFygǧÿ~[/>>}=pRLU3d!ۈҷyiHcק"sdc2u!o4HY"7V,b||,JKڰyP.yX7٢\b؆Éq|^FE`{Ϫ~aTr!icm>_O!_yǡk>ghg[U-G[JÁxσ2es RIH$/B]\"Eqildc*y + !2&`NV-˖u7 v5>gnW=a+ +(Ǡ٭,#q^XτX8[?1kі2Y +qn]ˈg`[L86kӹ>緞9z¬DY=AG8x +w'1,=L,da21̞EBFygqf#LCKsڗiS+l7 $l||c D eRnύox9I' :/|­4Oycj{; 8 6 \;}k. ̯⵳0p^*R 6 0 +Yz+ĒG=2 [) ,Z#cNW9t1bM.8cL@Zec7rbP +NG]MƗʭg1 +}06>,&EciyE0OK>AC(R {IȫsI%Dt + +&KQROe嬨JeKy>?z +smtJ)Z d\p2T*_'XndI4 w> ic,gx[R1j8/e`0=cc[Hw4MbpLSF-<,|.fF,+*{"{.,8)Ci<+VSfRW=WLg㸼՟7V:SZfG +!Kڟ?4=ѽ W)i +w#֯,Ekר+R,(Ezz 6Vjq37U.uXi>!݋KҒNby 񥦄`юqF2FaG s +b eB2s^c3+ƴ-G"3B2ykWSˈMwt]4MwT_G2"uU!ോϥ;hJmNwtGUJ[]#zj,ݣW,]!*9zkjxףj1oXFy╒!=uN.S:.^SYm:z2cS̩9OQJns#޿%ߚہeȄ0rWd,uRmx(xjd_r܉r4ԮGP{s7i2db`=n~pX#lQJ"c({9TJ>QbIh=^*AEw )Cm_+6gXlCKbP^h]~/]æ{GKm^lwT >^ǨYAK~/w̷iһ{TGKѽjļp4z֥l^qtyd۔s +YԖ|+Ѓ)d| s+K,ӏiɼ'dyL>_ĒQ|ݗ"x.Ƌ!Ң8̌^V#lI\:sysx=a[ϼ?m#}YWY-B،s(Ƅ8Ly_(gQcџ{89Na}`BsdcU cwUW!a4EH33=ĸ:F;J6ۈ&w=6 ˕= \Pc'KT슷z h4ur:]\nv5mB:c7f|X9+ 'ґmXڠCdߣmQbO &Ź 5L /=y] {JBuC?d|wz'|<ٮUtJQptնQh!UlqI=Qk=LV_>P̮w0w!_A4QylQνn2| 8*:8tbi4X^f-yK0`p=[tY@`11L[ߜ֩u3K:@ h^L$P5fxm6kcF:otۍ4D ^dZ<4Ҍ͵oؼomK"i:6vN*k}j=ZAp\z@??=q7@?7!57m4e1@/Šӯ{obg??MN[8 t cH?d`0LKig $?θ) +O?!A* endstream endobj -1784 0 obj +1855 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1783 0 R +/Contents 1854 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1785 0 obj +1856 0 obj << /Filter /FlateDecode -/Length 3910 +/Length 3907 >> stream -xɮ_?>H L9k?"EHJCO%VXɢxr~~~|}p Ex}}(\0gL{/|x:\*R)fR=ǿys;BHɌ֛xxƿ_~z|E0ߏw4(Xg*9ƚ`{\yL -ᬁfFDv(n!Fvz4`\ -?)$sVJ͟8^w$\Qߒ WXxyx5f4Ν2fnƨB·ߠӵGv^ oZ-$|~h7}?/߃2krsz`0NIToqW8rZ{ EndZo%.h'/{?ȅ3gF^eR/W pw, -4`2]ֺf k$ud3<^yd hXIdڅ&j] -tZqV:t.oqK@ Ȑ?ˬQ3@$x}FfZ43ʯ|xt0ERaxZͅL0TT׳נgp0a`,sAql X;{bqcQxR9= XAW ڀ2wc2 L|ϴ) -%)v3w3X3'bɖDx1ظ!4YUvRO<5U9J̋&\a" N8EBš͂41Y@K d7/& -6F;af`943˞1%!ZV5*ֻ~*:zG -^ -%3-Y~ -M]°ܝ7ku  -uKf bS5:G%ɾiΐU&J|]3rmp5D0Z9<gxI8WA -zLD+#Ć-T]vX06)4b_^4XݕnbWzO)6"7)6~aFYwV&FQlľtVl1tbU{M5)6*7{)6"n!FYoVF+/EQ[u^+:O۔FdQ6* ?5SCī 5PMEd#9S7SLI5J]!4z%LsڃXn*,8:/9Vwy1sO)Ը {lxUl4TNrJ]5OS@ Wpr:rIZ:́zZx7's}]E b"VBԱL`O+ia;T*Nī9:MʦaFxtIʿtz4UmݚW Wˎy*$bM19P*v1m@nJY*¼xP;;YpdUE,7+Yfwc*" I,NW BS-%M;kHCT2RzMjIۃ)G\&D(KyݕڭYb53jRbȼC|E*TӖQjsz~f+#l]aE :^# h'wCo5ƛpf9^{#` -L0;8(W<1?p'r<Ckk.5kZ_1KDZ/ -sΛHIXEyj,R>a63EµGJZbT e')rG`hH-#>W@S1jynZ*.T=tM[,NijO*GB JLCL[9ׂ%b YXF<z$Ϙ#x&MhZS\W1'2G@tre4CӾxL`C]wŕQUL3Dsđ6>u _Mò#lKkS1U*WՆzԬP]wC-Cɢ6B2=JiX"̶PDd&-Gn)\CP!bJ')r.,3\kV;BS1j%Qj*xMNWXNκV'CY}@뱉`j* R2>m%(PJh5ˑiWt -ǂVBK*g |ڪ&|?d`XRvx=ɼl^$h p뮳&pĈhIV -׭Iz&x&Qui`}F<iyH2s 9h_!Y-pgZOO=)d0&ʈp{b>"W\pHfἛ/ bo|YR4Ȕ 5% * ;qtRwĸAV?yѫ9H*Ҩ -4-iT ׆4 j{Q+8]IeiPX Lp -~=bTDzM -C~Ö9|-"8Q׭<e1JS'jdYU \x^gjUҚLְ}y+}a?fO>DA40h[?j)\ -%T4#Ŧ;qFLE'7BYnwT= ǠAY? -:AC١:p>"xj>n@3[ #sK\r9mG&y7 +xɪ$^_Q?` @>i/`|W̛zrQR"%e1GumYUITwQ_%BM +o%W,כGG +UJImCcco}4K郿+*`~%jO +Fyx=A'":{.RYV{*H^753H2:Vp?Nk|5wod\UIn͆ty$X}xm>>g|a,4F#ӥ7V^=XSXR>d[Iz~f]zoVק?3x=팛?!W?2\kGz`[= O3=#\rbS@/%.DxL_L{" poOBl^TmXxpwUյ[E:Obd,Epg0jbc?1i<6zK:;?zPh#bFoR(1a3Mࡐ&A"YpL.,@/1>+/HWq- O=+ +hBe+j˦FfSmj$)j#Y1\ޓ2! #Z0\Nb-#:֢褅5aϧ[4TLO@*j!NOT;oj +2/qGLiӴ6yhڲ@FN!UkyfeÙ!}\VVH0򮍔p폝4ZD%s dpf9T\4t6־Ca _8H|%"ΌIMH!Z~r ~jvbC&8[ rH [+NDckDNHz&7ٴPhW`sc=EJbB4=Myc5*0MAT2Q}m&#!!"A +8* 7c0. 9C'}?Txrp<`X +~pLaG4v(c0a6/Ј~Q8[\߯u>bzN풤)w/CJYRu7FnFA5 +^EA0k/Rzւ(l$; %45&`/4qأ>hcR]'>ԇLE}[TBJ0XH!AN#+[޳:rͦs}(a|𪥎7 +fdGF 1/5w2) Ź,R^ ?Ⱥr<\YN}(UnBGIZ?J[Ɓ`PgR8?- {`m-t=N3 >a."sldc}"F_#*F~E qg~M:u< eSlOQ6qn*֒\6)73s[r]˪^e}<39L-r'h@T%zm-,kLWY\d+uÈ+Ͷåfh2+d(-WftK89WA*~,D1c(+/ \CvE.4&-AZ0"E-kx3ljV(fNMnԴgsilg^,WVpJ1sj7Ө80:/=uwyKT1nqK%i1594;VS3 ,Uj0~>/UKrZ|wB"Q'CRM$I6kq Ӣ9i-s=;5YV ` S6=VUS;^A^`M-j&xt#)ᵂ/>rUGUlnrbj9D{J?u3 㥶e{@Lf@,j]Cpw[E^И 0Zztg -4dn'1ܘ[g~w'#TB yp͖֫5_j}E^tqg.bʉ&D0N9z!q7iΒT4B)Reը]khV">o4͆ +\?S1aO~i$g-1nQ&m krL?6_C{ںzj̩m9#\RL{8>gr#n6k;^o_1D^lWR#9CŤ^L>5 +)}0ڙeZƓ| ZZf\ e9rGY`BHWrXbԜ.\ ']vi<24e('4%ҎzB%kF}oַsCOj 1Q8F2v$ W1 BəbMd )N( M*1&^+!h[aԫ7<`bWۑz3iDؖS{s1gqq=*4jN֩d1Kp dL +:e -,+[H[W>a|[*Ys1lK%9JWșdr&_ɹs1jN%Ij. xZN^vX'OvUgl>snL0M=VIZ }z92C +W%{ig8rCKC3mZtbB,.y!(<<{NWpr|$%Y[D錻&|r ֻ&mGjΤ[#*' /g"o]Ar:μ{|&;[LkО{&.tDž$jN.<}m {j4#EB!$ [X"F0P\nO ŤpXzsuW;x6@{-5HdIMw`,}}ſ> endobj -1787 0 obj +1858 0 obj << /Filter /FlateDecode -/Length 3251 +/Length 3250 >> stream xˎ"Y|9H$Li)Jd])2 Yɢ*7@yହ~|HPҿtEzNk0x>\x 7h/ﻠywPJ 1ϗ^A7^`^(c7'k.H*g8Dl߾\`` H' @@ -25510,222 +26571,216 @@ C ʲ74Tguh2_6MӶcԔ`R-B0J[ڦz');r7U6҂! MP㦓&:\ّ14޿3>;!>}s:8_ 4n<1 )o]2Fq쓷2v#Ӣ0Fp&o!< -=L:CZ6lGVb'Ns :S%{DUozzMFg7%r˾m:`pd͇'-`gX_ǿGqe P8W-C^IM?q i,DfRټPu: I_K ^_qS3:x&B) gט{em{7 H A?CoDEt>8}r2:x҇ +=L:CZ6lGVb'Ns :S%{DUozzMFg7%r˾m:`pd͇'-`gX_ǿGqe P8W-C^IM?q i,DfRټPu: I_K ^_qS3:x&B)um&,6vxjOyo"ˌKM:x>9c]V] <e endstream endobj -1788 0 obj +1859 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1787 0 R +/Contents 1858 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1789 0 obj +1860 0 obj << /Filter /FlateDecode -/Length 2797 +/Length 2792 >> stream -x]ێ}Wx@$yHйA$D`Yb9,d'Q)xv~*z?E/~pQm LR2)Im:<9/sT:x4ZM(r(}忇7ԉ~=x宛Y7*:_ -BgH1N+I#i|J/wG#Uz>+T_!(kUu%.>O>]Vr_n)' /ڛD9ݬ-c&],+3q -1_BzkXhbu -)sf̃_a*Y\>,HTֳSވqt2 osx\PEHDɆ |96xuBצq|kם6nqf9J>Y`70HfJOv-4S_#miC{)cβr0RwSIqQq -Rx2crFj ׽A -<(ƚ{di^XdKָb&ULB20' wSPvN#L$Zqr_F bY 6"e 9#Lǫmn+{L:EOw^uTN%O~!o߹LFs5~Sq_{ azyNM+/Rs}ofE>F`HrΑɝ&v3vct=6xPgaGz0_$JP`)fԡޤ;稍X:&BmY l3[i–@;bCӖ!nE 1e$ӅOsgujkľ9ׇE/qN7kFnjXP+= g\tBKWPƽQǺ Vl)FXDt*ǜ`h +yaƾhWhfm`<`4 &b7b) $*E?l=i,/]"$8ar!*Dc ޤ`k'"8C#}mzOh\Oӌv%T,$v@ʧp{¶Uk= ogYk)Pjp)Ӹύ(D)<1K#5QDޠf VN +%./("9~`lv 2W^_S̤IHzZuI(UܹB~Vo"6MȻ*yF礅oc*cj`8*{vpq/Y,jp\(}N!s|F:U*6m1/=а =x?x?_ҧ]/Rs}gE>F]2$mCHCc;1{lxx3(aHR&̨CpܯQuM۲%g,Ӓ–@bCӖNԄy(ט2SEt&<:^5Q>3!xo[YE>}U;5xH9FV{R-jvOt{x Pp]:Ĉg]K_(*VMiդ*߹asP!/mRTѻrȸF)>[rA}6!8nݒWihθm\ +Y]yy=kYصFI TjX܀mpflN-'t*ya +j׬0V>Eߪ0^^ܪ0Eݬnq (`P:B<=h (ѱk |̭ i1y3A?ȃ^ AyX +A@5ȃzwր<8v-A>zH| OķyLv 䟡o Af {~-ȃ<W^ݡuPA3B,yDhÔ0B-ߒdC!̏i׎0yQ3)?%^܌@y(!P~3J@QJ͔ o)@72W hS]3JF OѷPzq+J@ Kv1@jW1L[ΥJd'S?"чu^<ϡ [v1S];Gз Lzq3 Uİ^5k>Z #M%I6DJ?UK "[mJ +lvsX:.nc䔄t ` +XZdI=G)x\ܴ;Rx5YPۍ)<9ş*}-'N3AZV$ U#<ퟛ.7_aQ\ |0rpMx=){7)`j\s7Y*9+b?C8;h{# +` +ION- +UEԟsVN=u~I2t`z?މ۔F1}UIih^&,<NJ BW+.R4%t?~4SJK' mf0*ZCn j PPΠ\O`fxRe?<~/w=;W̬nSrtELcOLυRMD_6]IVcuFqBp.D3 9i9?1a&zn4Ety]'8Ur!d:3vtqӧ~s.ɔX) +I8Zs endstream endobj -1790 0 obj +1861 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1789 0 R +/Contents 1860 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1791 0 obj +1862 0 obj << /Filter /FlateDecode /Length 3299 >> stream -xn$}b f(B@ AiK6:>H5v>XnU>]>_pVҿtEK:7|N`k0x>\x Z kˏ^.ht]zk ]^ Q*9`~*SOuX_= -z/%Ɣ%w/$jCWo'tX -Ӈxk,Gr_?||~ǟBSׇ˿I ɼ{+}`$ Ϩ'rƮ޳zF_?ϔ J#aBi$J|Vaj h*q͇OtBN&s:m:{ǣI//G!koJ2'ȜqqbН9Z,U3B)=o)| 7 p#Qt\?,m7c U̴f3FwQȭ1SoSDW 7^b$o۝OC`Λ}}v{NeR$Mr3\e$!@t}϶=~:򨴠UмΑ{@w'd7+ JUwBc*쉉;5H*K^I]K^ -NOp# p]M)ޗ/1 wV^0j?;_ӛM1 9#^랸 [-8{; -e˸ 0h̚ ,'423XH:o:iKrE"JFv:T)X]70.xc ]$<ZªK@h ,Ӕhd34 -)gҞFcg 5vTG2ǓPDVyw$uf [ -1&)(asp'Bڰ<þ7]Ybc0AXDd3HBAs"ߚ^㱡r{\Ih?2zO !{afV EeZ~:VfTшz'BMh"g.8I~hv -# (dEna<y$<0 -Dz\r?/șTk(RAo-5M|zT (ϵ~gpٙZ>٩qIs?1Wj;X!.[`ZKAHM MFSU -ÛVhQmΰ<$ #MpT9ԒGizYG'}T Ec5L-j̋V8v+gagf!C mrY\$Fc7B'=3p@mIg<3XvH=U̯NB;*}QӽqnO^_75k%H?e -$c;kGRMʧ`UA!!=}x_džLSܝRҢcCH|PM&%g7cF<ޖ 7ZP)gb}ْkڒѣMӖj!{0wovM`!NaJv:ҥ}C'a>o,9 *5x$yrGl4J%HoψSL'  9_:Ht*6\[Lmͤm~hFKcsJ)M} (<|z㕝.2'N[y<2 -$q|kk.ɕ6T=E#uJi>T4d{ΤZ|mbw7?<{< 2Ixİađa9a|&o5o0:~+rbmIRpSi\ anSfѫ= -Z.[t[ ℱ(sRǕ?!YJaH:-?5d4I?|ozrߨ5-o>P1%=0 V4=?7);__ǭܗ<(B? TE;^/OבA츃T"^'y[8 +xَ񽿢 f(b  ֱ 3d@ARWDQKu_,4p}phO)/Q>_.X0ރW^H志x Z8)wW3~3yWBԡ?(o-+X#@'.6JSp8WDfqac @'d@rP19D!^)Aj._owRBx2,J,hoԓ]Ʈ^4O~x) AF„H+^`7&rʣqx\7F ;c )v&nr>:uRνU*ɜ"sb.hܸ|| +vfGJh}KxaHWB:~ߌ-T1ӚiR0^TTbwG"R&L_RKI_]12Px^~u <=lwM?n$^f*H+x9#\F2Y@wבG%="u\K Av"ؠZEh;q'>ž(^ARX"'RL|]:ڽ*8= + s0> `Ït'y6x] $܁[c.`vL7xasF6-=qAZp6v1q3A`&5K!$YYLOhdf z,,( XSbu9hp(:7-t\ph r.*/ޞ£1\#LSqʒ( J{.5$FfSORBz[6+fYy>.\s8,?QA1h_yC;C\'ڿ16ͦ1^1=/K`[J!=P]ʥ4:ZpemV.ͦr_*ɰ +XKKi +$*Y<4[ +/UcBy4P# kc޶bmU(]!+%QׯǼ0c(?ZT1=MF ;zֆ R&%1XGF EۣBH@|){u^( ! iZcLiEZQ_.G8D# +J:.3 +5=<$EaQ8+4!P>dwe{ +6^G,5n9:oC(#H cKL%0KF_H7!UQ?X3shsܤ@(6 Xe#LpJ 37& ^}9Hx9r%ax~]~^33P!Z|Wk<< +*vQbk7:t3|Sm㒾xHxs%sGyçˮb;eƒx>/jY>LE4:Dv9?-TiΏ֎土GÜ+ @$-T00@6; 4ؼe\egy8%KLg9wHxq%pD\ ӣҶqh1V T&eg;*A/bp^Í}p!x~b vٱƙC]*s@;MB7ТRkR;ay6IF .ls%{{5OdǤkT[{-≓peqV\$ 0~7Bv98&IJǰoNz-fA ےxf{avTqDk܆n-jJ~j1ID3v֎TOX ,BB{D, +;ɥEdžXI3LJ6n2ASǠly-3.oRyX]SߎNT#O,B+%״%;G-B`d%'aB44ĕuK3- [O|ytp*ivˉ",i7o:K[3oqzlkBa5kfu[خ!-SFUj4Aq|Q(C#ۈȯ\Q->o,9 *5x$yrGl4J%HoSL'  9_:Ht*6\[Lmͤm~hFKcsJ)M} (<|z㕝.2'N[y<2 +$qkk.ɕ6T=E#uJiT4d{ΤZ|mbwo7?<{< 2Ixİađa9a|&o5o0:~+rdmIRpSi\ anSfѫ= -Z.[t[ ℱ> endobj -1793 0 obj +1864 0 obj << /Filter /FlateDecode -/Length 3602 +/Length 3595 >> stream -x]I ?j $L9gixPU%R|ުD")~S_%Bo)obag|~/|ڻk!^4FX0Fo_//ªMWkz%^ސЍ>O -u <pݾcJygY4Fi8 CJz@jO^~?^i 8O?]rSWXwKK# x&1hS 4xi#2$Brߓh t|eJjAz6F%l"(5_\v[{- FK.=eJў382(aBZ+s:' k%# -T>'+tD -Δ i" -c,XrTq5ɽ:mwey_;)Ű/̽!XDQQ -˕ӾBq&pdr^vFtTlWN{vXl|KM 77U/c7sFڷmrovHXn/Os&l#n8 7j3&45=PՓBU1itTb*jˠurWA\=-.BkzQu"rQ'QJk٢zP)>[V -ڦ˭kR.ZR~J-ZծmԢj%S`^ns+̩uGdƜumxɡ>7ĥGj9l8b1Xb,AA~xڼ*5MUoa Y48[~3mA/íDnY |[:mE["R)عaN!1WM!8  t_ja¤Wl1ZW } p9a^*8$.x5cl,( +&&H %L2mA{^ ʋ3̶;,5dDX nJٳ@=C#0nI,|3<"Puv3hhg/3p]? ,3`xdZ'H[j{Z[vMrE`Gj7\_bȫ4CJݔ n9`,t -*O0DKAlWi>z"cO Z,-i+ 5ozy(wkA)a¹!d2yт84Tj=$(;yjd1k*u5uT gu16 9c][hܓ!비4>{xOu'?_ -t4WQ6Km%($Fd*sYS\rYdOtA;est{v(ʲĆ Uq{+$R[3 -m.SFcvVXQU-'nj )a5ڎw]> s{D FqnR:iE˞KrEepd"۶R'&mYM -ɖu +L29Rrr7odzU[ ,OƤVKJ*nf \r@Cm *2`"ݫj!&ύx8k\<2m"QYUn"oTݎge|.t`U&:G Wgp%qg\Ăڜ| F@Wb u:5o^)Po}#;>^?罕>:*ғ&Oqܭ!6|ٛ,7SМ8#T$z-M![{^dB˞wA [ΛbȮ:)Hp g# xP - 7enDnBp\9?P mOfҁn:µ"/Ƥ۫9;j{rIj/x勅GwSs7ÚưS21gg4zHQQjciߚoq۟tM l_&*A$oqAЀ[1RY*yZʾrw٣I8Q*`׏n.$;;h_S]X$ +x]ɎW%>2KUjzb0V * + D;~" O,~ ]>Z5TWPJj?4FX0F_/^JU)UP^_{yEB7RYaSpL-g-EtsncJygqX#mz1/jRgdtHCI/H?Ui _/z5-~pf ì$rF?/'Mb(`鍕AhF!eI'!Ji5!! )y2͗[DP6j,*[{- FK.=eJў3LJ!?Gwy~<JfۑN6cppVgJm 1g.G@}^;yٯP8bKހwZMz"Ch(Jqi?zK \z:9s;(0h.6FzfM6 \{z7ߓ#Ŵ^呲 ކ,- 3岭0pJyb[++$_$l6Dti4zTeȝ(Ǽ)X$eSr[."RUS3_1RH@`- y8͚h۵6ۧ09˄cDrU tڭg&~VSm&ۂ]٣DhM tnʩ.] } T3 +m[F։qoCDDWA+}]cԃJ ZR6%\n]Z.x Ԣb/^jKvAnT+r/Gq.fN'R&C>||kK!/=If3cg)L +:ģfVam+H ![:0ӂiI?HC :Nκe~Ѽ N+E'ެkS))W +E~&Jb*BF +ϻ`e:tn`Ln`GX)VTZ7+LiZT5a*hU݁ +F6,u*1m*(\̃|5fP`*.)М1߆Blކ@ +VZ8^L F) DD\ V+_0`/[tQ +o +.Pb>(7~(GϼL]+c'6$kD+yVd}}i졖k '^r!jD-$/_j!>Lj!)z9WOrti.›s"@H G7&ʷr ByeZsNA_t ߖ jhFUϣ¥{d ^Ȧܒm zqn tz_=i+" +ѕJG kMrlJI|H{V V&ؽ@k]s +G65fp\ΆS,ztrԻbH؏%w{wg}gAf!\57A,GZifiKMWO`Uޜaa!#Z&hpk00W͐FG̙5&2iyCHb:`u6]̀uQF"X̀IONKS띤#{@e!{l5-7ir~!Ҝ.MwW"[3̱e瀹1J8>_zpҰ|n.D, ,ݵX[yV$y9}}Itbٴ⋎GwϢקXU&A'Ubu6E1-%͋mi.JMq:Y';JlPN [̪ܙs/Rk*d~F";zР~?~U3i=ӳ_fC¹F&^XS+T OIxf#L{j6=xL1]-Dd9{b?$rVy('d\(G0$SBB${bi˦ۧE7WM-6Xh{M[I.&u0Ho]hsv|VxQU-an ia5R껮Lڄt##d8I׍?H)ݴeϋ͎%68mG)Q&مd˺"rJ&\g[G +[ѷk%1gKΓ1鵵JB\c2!cAn + hPޫn!&ύD8kB<2m"_QYU"T곲[>7:0g*r^#kG!bAyoNlΒ @Wr u:uoެo}+;><:cpVs?~qwb.n5ӡ.9.9罝9:R*ʓ&OQV{Fh~|MBPSК8#ԋ$^z?-M![{Qd;BAˑwcI [ΛfȮ(Hp sfp" xR 7UnD n3Bgp\9?0 mORfήсnµ.Ƥ۫9ԝF=ǤV=GGNW£9ccpo׎%ݜk3gYDOg}^% zh:ݐ nkpٳNx rFs73h.`sv!P~vy:y5oF%)=piGTu]5qCHuIt|ZS9ĤזEsJۧm5\uڪmzz2ȣkڻ tHw;\41r`-W3medQѫcRqćt2guaڳϮ0Rj>¤^/f͸HIG>¤P; 3%L]=!f3쑕;xLV΍@ol۠7Ã\]e/]YfY@^}\ x;I{}aO dܼ}z?Ʋ!yʳ$шAų[^<" Na|H$/Wfr2^4љ6h3ysѣv8dn/ [3D +p 4L{nLw(pS\p3^שp4P=}D#v¯w6ݳ0{?ׄN]1at 3vju\12MjFjM1ٟTF] T'׌߲jB:PM=Ur=9R^i'cYYGw݃FdK]|fzFY|Ï_<}ѸZ拻ג%L  ӹ5ޢ۟~ot{J/p{ vu 78[ u}HGh-.)L<-_FWd &:C BbaN?w[5zI󷋍9޿?M.8|4$j endstream endobj -1794 0 obj +1865 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1793 0 R +/Contents 1864 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1795 0 obj +1866 0 obj << /Filter /FlateDecode -/Length 3947 +/Length 3942 >> stream -x]ˎ+W^H 8"?b[=di<\AWzXu&E7 FN!D䭠?Bϟ|ʻK4 Ax2LR -C'kק<)G=y!|).t/?>},'qOoDJj}N-us-ssE]\Ujw_uALFDGI`姧ow&2_> a^1/ԫzy~^?3+zYYyL36RSJ~˗~TΒ7Cz ATuGp{$vrN[b0.`s_CJe" ^7K~Zi}+AZ1^7-jE-L+K#VLMv Nb*Q7x v+^FF*EN24/˷ ;HT.h^hP: rQu(>7K)Zg8aiMi`}VPGY}$mS@xe?/Zoc$f$WJ9R=#RG;(Kj=nГ&I*%>vAMja|ngpPAA)i\J ERDQ3)J ۠*)$猑4eNHdJIRH:u<מ\7d*p\d `˷Q}zH7o&}pddjI*saJRsZ[c}T BǠE+c:TyeZ ܧ K[aAkT3/p,"Ԕ&[0(m&dB =\ 5Z?WRRf]u9\oY=p{UNxn,&b8LY#U\Yrd=cE>O ˒'ж_@v,KNAzc+{ "F)p!K%AQO1dSV[ 3<Րˑ*wWycH v,Π+FxƖd׭tcH+@zz`N%PпLi*=FcӮc%m@ѓ6m ӴaKڀp֗iC%Y1~Sx+ev -&-)Îޔ/e%# ?*]&jh,](Զ`YTl{0] Fo[~q45&.Y29P/~]/noN>_;" )S)00pr\9J{vXq5()Fvj2րU 1ܝl{el!]@bw\CoL\i֥έ")ۏihQHF<saXgeA|HQy!1~yK F$G 3Ho7($oCPE]=LfQgA%FUQ^I1zraRjmuwpB rn{]d=v]La@gaέg5 l06zrT|@dEJQ>YM} wcljrt 1vSZK] öѶ`9Ho2qr,?X*7,`yrԫ<^ýb=Tc`lwa91/,o.X g˝HFXccr]X^mU}>XqQ`l7AXa9FZg,lWz >Xzr 0r|ԲBuZ*/7 5D?Ky,r,/ѱmky)Hly }9/ߍ -=\ZZPtt -=" .ZOiW{CnZJ7P : 1X-HGdBbH9|Y9A8P< oCLdj F;Mk?.FWyD{tÓ2sٗ \酷L/Qjciw<{N- Xh(g&PF wl#…)*ΧG%5_FmIn ɀՈ愺'NJ -rd36As:U@Q 4mo=:gRUߊb-Yd뺅V]b󣨦 ([L )yC—aFСWu{dPj +?8 -{rn,Wo;a j+K Ⱥ+|$XWsJ:_{={={|6 (oޛ\X۵Gk|9eQv{ Yꮎ6ѶǪyRoE2:HkX1޻덊9|&z:,_k=紡"pdB'(a|p( 9=hOW 2O w뺚<\-z-sK%r g\0k0[v5H4~`cpoY2ky S$`|-:;򰟭~g1,?[I~ nq@N..'`5cgz^2:ϔ#C7s2 o%ؑmR>_><5s"AfC:ZٸoL+cҥ;RTie^p0Tt _4ՎoVE1O)f=o_p + +x]n++ 0I n@)l>$K/r ]rdթjA?_0r +!zg.?=$&o2/IGD3d/$PzFk/|}}ԓRMWKǧo$.?]I?볳eyK|a#\):z\GtQס)/Or5]xR)|E;|y{oBWz&q YU/=\_{kE9+Ͼ^O7z9cϦgJo}￐YҐ>H/!HIk+NKdVε*t *n}$ZI% +le]R =ZkJ6ryM̑0/L?3ᲩqfZ /b1y>v&.c{iiϽ1%&S[d1''c$&EBH-)Rsn i%-nv՚qv1\ Ӗ@%/lvHL$f)OR+o%HW;ΫvfDMr`ĝ]ɔbzei&ފɏiTLo;&59oLI慼}aEMK JGP.JS .!sa|uJXCf䌐g5 f_=rGWM )]ކ8]IHsz.&G%C;(Kj=ȁnГ&I*%1vAMja|gpPC)i\J eRDQ3)J ۤ*ޤ4UNHdJIRH9u<מ\7d*p\=d `˷Q}z7>83[v` +f?5_kko*AAHceLr1S\+:!4idik2=(sjE䚚+*$L f*3SV +ZJ}3qy;cŃ"Z m,(W%uRkc1 9d"MZtbc|pUʑKcHĥ|1K^/~xר(XT=x$ Ե mA${w2ѱDD2q.i-<ΞD6h1Ķv-ǖFbri=9f9_ ;G9R\CD|,,Yv:`9:6,q=nXr +;,A2vrT&X>wڃC?clw|OR,9durtl.XLyϽf>zk5XAl*p`f^sXy0,Xfvz`986,~Xq -12aU@`WҰwrLr>Xѻ ˫m +1`9{= c`9(+,hS堲9`yJ_XFfXNƧK-!Ta;5/rCPCȟwy)"RXKѱΖX^`奍pKQn4x[FGp-759:\PIIIu&=sN(*a\zg^窶Qʣ{!"ĨX`KuVt>ٺaUd0Xi([h ([L )yCWaFСWȠdAV~qZ`'.2d=Y2vwW @uWH>^uzzb|6= (o^XǵGk|9d2墨}?΂,uwNjdK;ac|SoE6:HkX1޻덊~{ xMux,(%=紡"pdB')a|p( 9=hOS 2`euucrp@-"ʁqfn1@>:"Fq= +dɬ5w0LJpv2. mg<l[tgw8[}/bYT'q〜r]b]N2zkTC)">?wёEwo~Ҿ&lOŎos\v꥿ϷFsM:v~B -}HG+IqeLt27`02(hګa//.b]nP5ݵQT|;{-: + endstream endobj -1796 0 obj +1867 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1795 0 R +/Contents 1866 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1797 0 obj +1868 0 obj << /Filter /FlateDecode -/Length 3798 +/Length 3797 >> stream -x]KoWCdMr`,`{{@,O$%1<,VC;syۓ/_x}{~*. &0H)_j=X߾>O> ჿH`et+%}wr_FFR~o༥yݙBGZ eb%wUXC ZOr^ ##R!|~E;|~{z]>XI'U\Y= aIyiB߯轻Ii3 iEWʒ\1Wq0&xOg -Z[* -eKH"QX[i}LT4i-كr$RhZzZ4 -q*&!gې L@y5R AEK *ڼ33o0O$O V !Ŝ!8]w'>{ajN*dH/'ߧٔ~Vt~eRGɮ{fo_Mɯ4^206 f.zM#LgW:zD EH32ZjSVC=f }!Ê6 䧔Ѓ&q+yxoxSniPFeZOad1|VƕUE^Ze~B%)Cdy•7)F n; 㵓.ކ윛<ϒ=U%)øh8Z$O9ex=Y&KaT)<)Ş9L SDμE*xsYOlk|7\f)0jLH ou\b04&#.Qӑz*ʡqē$=0Ov0 G$ē CI8"II|iTE?HA#΀6t$9^Jr\A%RQٕmb p9K)2Q)Q`B5)6cJl )31,(?:v^Q0/IdВy}r+?.=bG //J)Sg -5(ZЙux-:̇`󰽼u4?F{h嫫K 84nizl=`jgO5ZWx4M+K%H 4!j+EQÓfR6zeH0q6Gݯ$^(:#$Km:>P[iJrq - i7 >Ak*_,]N*-ҒHi% &o"Y%J֑NScH7+H)}iSHSJfWpTGU/GQF -4 &GnZZ74Ho@dbQ*}*צF)qrfՁy+́h-~*D ZSV%gh-kp ^> XAa>30j06~TFb4aߣp}5k҇ʵ) eNuo*=爎%HѱDKTR TB~L(}zJ$RPtkPTzp=tұbm4 .tI iT1|-ap c6]p[c 8k`T4֠cjfU 8SlWfZvtzAt Q^]hvjxeUyjit kA¸papa\>VJp"pO8*j- uW[wb .P -g  gac)cׁ+lRmށhvKmitB -ҭB -GJ/ѵ@T;ŶՈWTm̲bUh9; -澆r6ᄶef^ÙKcN&yQ$3GXiUHz&m!ڝ>Kӷ-#-ܴ?kc6,xmA7 [I*` \lC+#nڣT_Mڼ?c҇^G|AڦNm98l]s=|S’jJ)>*pV:1j8!r $N ~-t Vv6V]_m"_NDe d 驦HWt{jQ[nMS9{x! Kt^O!~|*>Ho>ur}++dHZm~ݺ!O.gCԸC_Eoh"Zά-N@:]\`"n?9o<9|^{ۃբ~[BT5nn YX8֥ }N1zcy^IkG$^R'LaGpc=8n.5R14m<إbS<ĥit iy'NK H;M=E^4m`SDz9T)d3콍(a7؟WzOH hW/b))2Fsg -;K]m8&'1Qn璹` 3b>$ݸ2$81s^E7=>e1$BZL0\Ӵ#TSljr@ e]?0 +x]Kϯ?`!@bI6 `HIRK49ătYb=?)y;I F!DקoObVś?'`B!^ BiPO~JQ^EJ+ 6]!/_{7"4_g};-*xb>7-VSYVyceZ-lj1??y9hH`ק~/2=uc&TArid,%1ҷ үf$ vk]E*Krl\mWWux0>?J%+h%nEVZ+TJ/rf Dc-o911VRѤdݒ;K)[ii*đO藄^ǿoC20H1aY("/-rkK̼=<<6Z-sR|'tݝsC7#,rLf|^gS +Yurˤ]^O__Mɯ4^206}s3A̦/h$w:ϭ8IZQA#6ҌPsqO#)eA),H?Dc8bG;8Mc7)%IJ*"oxh<`[Q>8SY 3UqeUmVa/l0hbʐ%Ypōah +QzE):!x|{';f ϳd@$qFUI0.-S@NFOyRv +On +f4S3>0 +qgƔT0;4A+&禵5 +zd"!HJɴ&'a>K䋽F#p^AT +kOgNST13/pm@ +jcS0_|1עY#z%ƃ%S#?'mj&/̧#`5|7trh\g$$IO+:LI5duH$~_0OTzPҸ~4DDF|C\!YCڮ,evhwP/83 .4I4WP0eT<`1Dve\Rh~DzATJ+Gt@T58PAqJ͘4H/rLuvK0 +݆W +1yR-$m^_m +Kl2ˋRԙl=Ītfr0^cw<)![u}[;ڙS,MRiMȁJvTM^ m\Q+)25; +R[ΰV\G#@zƍu*}PK~xJd*n}Zj9HVau$izp*$҃j2%v:iGJ-p_ڔ:9iTRY`%ѽ*rw1Aj @Ѥ = 2?Qr֍* [a-Y,$XTJi)x +"ܦ{u`Js)Z˫J%QrDUexZOז SGY7:xjRG4W +>xGK} 0@za+ث׫V}k%k8G >Z> ՇQ }8ū1wFarm@yjJBY)jwg>*vk9#jdn ?Rt,R*ըC;6$J18|Ih 1T@1ez!;Ŷt,s HKC:jC!U |Kk'ئDW%XNX"5ؽk@z3vYU2-g96Tիٮc]^P}nae>)CkWg:pmC0^yUlmt:@?Z0.\s.p\n\9Jsk-h@p8X& kB[p#O v6q/`{Z"/1yK83ƭV׭]2 Kr1]ǺB=Fou 3+i}`$6KJރ3jޣD˰etGٵZa۸ל<-^>M{> endobj -1799 0 obj +1870 0 obj << /Filter /FlateDecode -/Length 521 +/Length 516 >> stream -xU0 +dmǎi5`VB.Y_iC;[@B"Kj؎@c2Z8vpT[c6߹B֤UHK FEK@pΠ[֜@M#"QŤc ScHA4h"Hx _vS-QRpsMpeHYG}VߐY.mI&.sSĭ[nX.xNgIbJER-s|>XJWDZCʂ>d3fp/4!>\ݮ~|"y䩬:܄VK˹D3^j{)y&faى)Y* ~R08B=߼[GO\Ѕin_8u.>/'0{͵7Ӹ8"ҚH@ ;:x{\Aj4I3v -vOrTAuz=bxy +xT0 +dmǎi5$XiJ[ؽ N;"M^]v|>Cc2Z8pTǠ ߺB֤UHK FEK@pΠ[֜@M#"QŤi`l!\}GwGiN]$s +~4[/̖(K)4&bm2,:2ڇ^; ޅRQ>znڭb!,ILYCqOk%?*Qx~HY bFD=N 1&c ͇w7)i!b}t&e9v cs7 fOSJ\ىi)U&,~R0׺8B^F/aL\ЅGia_rq߹XUКLJz" #1tG4[7\5F2iANIUgb用?Q7c [)ʂ0!w endstream endobj -1800 0 obj +1871 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1799 0 R +/Contents 1870 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1801 0 obj +1872 0 obj << /Filter /FlateDecode -/Length 3356 +/Length 3357 >> stream xˎ>_Q$@l`I9;d@(6I(qȘlUVp=qozvr>I vH7s.FCDN>.FN`lA-..vȘÄwz%P4,ro3HВmC, ~zFԸ/idkxV.5%m^jڴSGkw1ϊߑnP_(qv0Ip}|+NxXd dWRNhCq-ݮ}^bי Y[ȵ'gg[P iѼVCP -pkoMgB5&lJ^K{Fh{UMV냪"TUKn fMʰe{N/О ؐQbf{vw[ds_Z5ܙڑ!%X!DL|z1q-mXβ#;y¿tAq'˄w@;B(?*t!L.&djQ{XMJ'q8~Vy5|(E+|bRVzuc1>l1t/[ƓzSGKy[OV7??Ea_R_`+[˝p%mo øT1HEtp3BRe4F,zRZY%@ХlJ -~}~7uyʿ)Z[0w}K뛲3 +pkoMgB5&lJ^K{Fh{UMV냪"TUKn fMʰe{N/О ؐQbf{vw[ds_Z5ܙڑ!%X!DL|z1q-mXβ#;y¿tAq'˄w@;B(?*t!L.&djQ{XMJ'q8~Vy5|(E+|bRVzuc1>l1t/[ƓzSGKy[OV7??Ea_R_`+[˝p%mo øT1HEtp3BRe4F,zl}y.ߡۑG RoA6 ATyg>> endobj -1803 0 obj +1874 0 obj << /Filter /FlateDecode -/Length 3575 +/Length 3574 >> stream xɮܸ_?>H$94< E)JWFia-*Fs|Fs[_nnY_bG,rQ6tSz 6>ڢ<"\!bûO*YMhgx(˞Jk/.wVt5ͩys^sdWS_I{$ԷRnXYxgٌ(qU#+}QD2[{=F% >RAɒtJ[Zfc󄴁A=+mRk٠ .tQۘ ^B.jd0X7uqQ5w.Rҳze7@ʯ9KI,xIJTx-*ÚsKw\)3rqI|ՂȁAE;c=$U32Ш6.<"٣k9/1K$wl%\V״)Il`7Qes݋3SfJJaYdIr)owKm`|o{LWL\ǒ94 ߈4%͒AsRgRz_ufl6QS9G Hi1j<`6[:wރ/&#^!ޭT֤}xjDˮmU{'j!")ݐ'j7A$~zOח`cˮNi PLͨԱGmF%nQ یJǁͨ!OoFb6j3 )?:g6RIY!BDjņʴAS:)mcs"wRd߿sfƌc(RbԇJmz/b}̓{ Jt@ЉԱ|R ;~UK[jx p*eZ(=V(A]@0^~W?krDx;K*~NoNC[No-+颛ʃr+ƀ +'s[v*YFLZA(2ڦ aE9Bcе I$|:kReU!Ote*ϋȶS=.+s!(h"P f`䀈XzKgrr+I*~lGm؎؃ژ4mj=zER#":JDeW3bаUB0gR$Q{*=X= -5>ٙ G0 Ol&c9g#{fS"}΢v|#-/:mϋsBjC]:mUnT01}b?;F30x{ag^Q^餑R3s*dy#7\7 `Lxu7\n]"*_%Vj gzlk("#LV2u3\D6鲶'+)Dצבz'zEy ~5R۸ 9Y0 B^T'IoHR\94*+d_nc>>&w/`c*e?ZDr!2zb|\ +5>ٙ G0 Ol&c9g#{fS"}΢v|#-/:mϋsBjC]:mUnT01}b?;F30x{ag^Q^餑R3s*dy#7\7 `Lxu7\n]"*_%Vj gzlk("#LV2u3\D6鲶'+)Dצבz'zEy ~5R۸ 9Y0 B^T'"!l{.UϡQY! .B.ts1{3CwU)% c endstream endobj -1804 0 obj +1875 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1803 0 R +/Contents 1874 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1805 0 obj +1876 0 obj << /Filter /FlateDecode -/Length 4241 +/Length 4240 >> stream -xَ} 40!@bIl xO`)J,ѽk ;Xą`g_^8sÿtME9悑^f{ τR/bF+/xK 9Νw!dFMB\ׯ?|*ߗwZwk:`Xs,^_ΖI!5p["Vvz4`\ -}7}Y)5||׷wxi΍,Sx?ޯW5^,}>,B0㰒#jau6Pqܻ “`^"Mmf^ $wL 'L 9D dj0 QՎۃ{[@dÌ%#!}ҠNkoPm({J3g$YsmZQ8V( +xَ#}B? 1$6av'@lvْk ;j4ju>Xpା gpؽHo_^c.%h>\L.Q)fR]~ϻywBJfD+%7O}y@ g}>[ uƚ`RrvL +ᬁJPx/wsyCpǼRǟ_]dJ˿\Csn,<`27=>{xkX}>,B0㰒#jau6Pqܻ “`"Mmf^ $wL 'L 9D dj0 QՎ ۃ{[@dÌ%#!}ҠNkoPm({J3g$YsmZQ8V( `R+>$YLud&bR)KfJe5g\FGSBe&8c>" -Vrhw`SBrK칖|3͙7:Tbsb!u`RJbT0A! e#w32@6iN W;#t4ki#rn\.\x+,$M1hp"]?(1OVsKCn~L SU͍fAL@,[cSs~.KZXߥKP$Krd vA6rD˗2[J >Ji]4)~/ {䫣L|Fzэ["(gH5_K}y]kɥ"FK"3Ȏ5d-v^tZ|Oerg6+lXdsٻ~veO~e(ӹϡ?= \\o31Q2#q%D -hNבBl4wj˗NǹSS<;϶cwZQϝҰNwÝV+W#ϐ"ʽ!h&8u;(SA.uQsʡ\4xNguҨ|[4-T,OӜaT̽o e - ^܇;yZE>Bjc R|5:k7+ǽ"7rސ&jfQ`vZ)CqJ l#4XYR\[ 9rK2f)uJ -:5IB==VX<>$A}ͱ<ͬ{_U̓_p:ύkZAmҢNTu;us5:P-u9 ֛7 Aɗ .5C=E;C.uYZx-&?'gþ=^S,8 ܬ^-+>]|>!jт# ;2\MFEM(dM6juF;yMGA^} -a֦uY E(zWRxO=Z8ыFp)!WzkeU:0΀-m嫯!mJ۱ӵ;wv"&S_ݿuC4tҐS {rdM; gƉndVvzsN،Xʹk*K| )574]D nF׍ < L -֓"meD8zIN=m v( -G; GbZuX_!W_q1W@DxgC}ܧ>EΩOv85yqFT<fyu.x02E:6R=V6(ow -uC9?:6SL>UzN&u ah뵥3R{TwJVN=ЍD"=8B:5j:ۀJYgu= ʨjEb{M-tIz";vށ܀?t# bڱ铩Q{,A ^{۲= ۖT% -9MJkʄ+KzTlNx_C*ފ< i8mg:mhxFӄ=rC+ĩt@;擬 ?TFW@P(THٛi|AVC#!k8l!Ѱ.DI_OQF@{Ҩݬ2OӤl,ז?\Qf֧9tLnb?K -m/#Od9vme<]nΞ(w`:Ѓ FjpJb^2UşVP!cqf[݂ x5!w~[}>Qs^M ty" +Vrhw`SBrK칖|3͙7:Tbsb!u`RJbT0A! e#w32@6iN W;#t4ki#rn\.\x+,$M1hp"]?(1OVsKCn~L SU͍fAL@,[cS{z>f%-%K(k92h SEES9LS yn%sa_w%4ixY=Qd& >#=RKF-M_ܾIs{ʼ.5|RVv%d2;hxՊD:WH-~\qqܙMg# +6d]ٓ_tso:?gK &7Jw[f0$(^'ޯ"/eRew]2}5uXcRJmNl(*Mw(rމgd:s{RXv*=[ENK\D]_ 6o(}=>$ȣJ21$% :Kڤ0Xͅdb6>$$xAw=w V@l2V@<:xdޒU9,Y+u:U + S'KP+8wNGu+,Eg͙2/zs +D*)J5|5#b5*{Ǖ#^G|jhqԵ 1?h  1_ZYc"Ȁ1*^Bˆ 0eS8*ҎJ'~K0W +HYA%As4,h`ӦS(_uNw=ΝҨ0ϝੵy%ӊJ}ϨFp߂idyj g}kp,;XhTXh>$P?**9V Un8jYY<]40W3x-㴣*|MzSV)+ ^8/ W(Pv8"c !Hu*h<W/ʩt$(*>Cfa]*ӹ0i7h:[C{fTfbڱЛ)5l^*'v2x֫[Gb i +J"hO3e)^!J)@8ZcQ@u=(Ѩ0(EKgjo| j-QQt"cƩDadY&S/"m2ȰVU\㟳 w[zGTpսN>U\k@^~W>nkRqqVe +VPH?jORӥ>MuR*'&IvZpRe[J?/i0A}!;)$DL^mcqxbf.pnA`eIr-n.HvK96ex'̈S="39jiujlɡzHC{jx}IvcylY{_U̓_p:ύkZAmҢNTu;us5:P-u9 ֛7 Aɗ .5C=E;C.uYZx-&?'gþ=^S,8 ܬ^-+>]|>!jт# ;2\MFEM(dM6juF;yMGA^} +a֦uY E(zWRxO=Z8ыFp)!WzkeU:0΀-m嫯!mJ۱ӵ;wv"&S_ݿuC4tҐS {rdM; gmc7y{p};= +9_R~Llwq\5W%>Zx. +"A#KOy&s@Cʶ2"YuPg=$TqCcv v( +v">kPUGHh CJqԒC}@}m +3yeSSf߶l";E2Ϛq|b4\Qk'*&v^& !)|~2|H@3D0C4hTTFrA#B0n@G.d:0a9rTԪrmWhs% DW}&Y=}XdGSgP(moKײ72N¥͎GDޖX5SO3Ec;`ז.IRgpww5ֵ{l֬ܽI_*!slQ<"Q+F7`s:ޡp^)&*s_N&u ah뵥3R{TwJVN}> Dz#qtku6 /T*.ay+7j\&MShxjyr2x"iFۧOFG=zﱈEX4xm؃hl[/4RF.Qiz4UZ#T&\i]ң*xg0v{T) 44ЬVhM;đo;g=+hΈF4&<]7˜R]jm@ +Ow +j>Ljt +0A2LY`d5qy$DxMVM"$Vׅ0);ʨ\hOUt!}L}ǎ'"^ s>t~FV"Z/2uȌ.DXVJ!r."\)ɭ7ȷC:trz [{PeGVR&l_y :)6o=Hv6?Q3i ʿ4h!/XbSD{k߷6۾Z媴ﷱ<,?|kWi֬Y!O= Ns֩!ˣܐzrDG$VU >TD~~?}^kn/tƺi@X?1<@Y]vAoy*=)o'X9ȦQn!RXqquYAP!cqf[݂ x5!w~[}>Qs^M 1- endstream endobj -1806 0 obj +1877 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1805 0 R +/Contents 1876 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1807 0 obj +1878 0 obj << /Filter /FlateDecode -/Length 3998 +/Length 4001 >> stream -x]Yo$~ׯ 1$6AW~r;Hݬ dz;EED)xR'_b|==~~0At -1(ЛgxC~HF)C Ji-J>|z?͓>g|=>{'ᵃ‰q)ǡ T:H/j( %VjeͷQiV>~y}'Ys?~_2)6Hk &K\()ފ\0 EJbt{s3p`x0n` `X DK-eH[TPZs|$Xn^h츖 6̐kNːNEoEF̼mj_ܠ X\xjm5A*zbLU{7:~Nʆ$mI./8TjK2>R-Aט-M7&qA ;4Mvmh&idlqeiB3sOm=&0>r0 ~|]Zg6 m5[kyx? d[]o>t]kg<2 / *Aη> F;/>#H4xO* B5[vT&F)s nk?l<A!AlA$zm$Yx|GE4Np)L/ 16 cuM6yJ!}ftGz -8R_3fۦe[GtQ 7#F-ُp(6;p[ 80K -DL6 MeE:`2j-g#E -n8cD -'Yvt|vrqcn'?l +9%2\R|VA+xW_dK&zv/}˶=Zc9>ob\6А~OQ)EnnA{?evvK(]Y_=֏)e7֚SgY jx 'AIP&n8+S,sӖPe-9PfXk'A+:-G6xX ,,‡<:R*K2yLP\4ufx:sΊ\:tϙ/ޏwve; KB0Rg4dvbب&*&.)E5}0Ŷ*]t ,4L%1<Dr:+o8&ax=YG?wMk3^|I~=^W&N7;k0~a~m~Y/U9YOL#B]|ҴlRVacPA S4U-e*VYel&O6, ؓ>;l;׎[f2 ٳFDguzl-4{\̍QEY_+'Ers$Ѩ{3Hi1g<0M-8~0l/qG\ӍFi~^5̎[ nF/$D3Ir<|I1ml` tmòi?fjcjՍ3WXWjj; A`J3tOBeHj[؊"N*(Z1omRV8.=KA$Xέ>aat4 3N -o$a !`[u>޵1 ΋D hNj혔fQ: -:uy0G0|t =6ooɀ.1=݉DrPG4,'ԝ`Խj>ĜOŬ;u >C%h9~^ctZ -E[P:Td*mmLY1x- %'oGAtz5' ^qpt6P [1桾(!f]5z5 ' ^p0t6P ^k=Pʃ#\:w g 㱩o9xLŮי,Kʫ)MLq@a2zI"+.nʵS̥n0+h ^ҡD1kaR:Ol`ο|d=·@^0xm> KFd]5z2v Rj Ox͡,k;mf*wKʙ_Q~ÚG.i{?Ƴya* f9lO ..6yabZV>;.[dœ[Uf_"+B0n.Tj\ac^S,)I6]geue@ʻ2 <3dជx[֍ջu #/@Lo~ٚnSY(:4yKywT@x`pX͊M@e<ɩ}̓9z} Fy?_ל9`j0U[UsEXδ\M16j?$Ё%Uc?T`56 fM |ƬK ]C\{/*(4%:>F*H,Tf[Q2:+ټ+f7ݺePߥxj_WgfpْŴ|T#UHsV(~bz_Yz J.V]:c舽wyʟn(m5+&b.-):o B:؄S6ka.yk= O;e77*fw*#U)[?1XigmQԇAg> Wc0JOE-3 dOfU%h/X?#$Da<{9 <(%{ ü!6J#b`sṋpiG&|Sl +x]Io%W9H 8d$y@|MזF{ݬ%}N*c +>IWR>^?? Br:dQTJImMcׇ||j{'ᵃ‰[Z}aЅV*xG`aQ5ng AD+_~z~^k+>|/KD5%D.]hoET.i"%1GH0uc70usDZ,Q{%w/$wqΕ~K텎k iS I)ɿ4 Tf_jۦ&07h73A[oM +憞i~ Fភij`$p ^ k ЇЅSF-v*LBEk7 [6Nj ې r H6, +<"SNI1:xs&<>E܉}r^:Y#a=pOz)Eүom2-F`#:(ّ R#Gcϭg}~Y%"p&Mצ"H0aYI5\Rݖ"KXp71"XUBpv;:pHl%1zzerZ9!!? ޾)al2Z$EхM0[g7]#}nQ?CAj^@L$C1S`PN vQb&ĠNWh#6|N _vʆ\6FSR1@x]0MEiՒMw-E~QZ-aMX%{ȚQA<#Hơ 7tS"$]zͺ3޶ɆCV(RrGtqoF#2?OHF>o(@I(Ib80x"fȞfű;qn4)80xo+;;X|b&*;Ŏc817Ar6QsWSte.lAdw〹@Jաْ# _^K߲mkOb~bX4#y*JWWieOA(NL^"S,1>Mm` ^"/s&d `ȒY%i, -s6e ,KkdMy(; Ae +d.s SI nF+]Nx#< ﱇW (7WWB|mƋO"ɿו &,uS%pl4LW_/k?|6'i$Q/^[-C굵0́` 6({TlCW<*ˣi؆!u{ҧt>um'Z(hV)3(ߐ=kDtVdžq@J37*a8_iU4* keHZn$xoi45v㌧33NH x(M3+qe0đh&I.2뙤( ϰPJK6,c^F1NV8SzuЭaz4CQ-TP|eH+ta"cֶ,e?ZkbӉ+Mj^yLBAjSHM0CIXIX]M~T.NY`j]YHhP0f1zގI)`jAŮY ^]I7 s +ÇHǠ޾?c{$Ld}uޝxXO$zT Icp-@2pBٱ)Mk?AZlqCd^Qz]Pw Ҡ3w\v^'v^A\d~ LE RfϔגPqBmFi8|\_:Mᘡw_Áq7W HgcBib6KuQaw_Àqa7 W Hgaa֣5ߡrӱ <=zZ֙ȚDPzrjmĚq/++z[-b{}v V7b.dvgeYAKu}D DN u4]. +R:wM0 ƝV5=s<+.:Cuxz0^+d@xfЇI4ȋZ!Yҹ|bs-(#u>lka M|X2"%:k^FT{M@xbk8mf&]i3P[RfKePtANe|]S5֖XPvlscfKQW]#Yg3}):da.tW*Xu錡#j (uH߷Y֬x6TB$& +`NQWج)ZP+NGiV?FŬ\Ep*ek?=K7lM"*05h>zlݧAJB{{ YHt ɬJ$ 1%g䡾_(7앿B~ >K0o 3㈘b#'ͼV endstream endobj -1808 0 obj +1879 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1807 0 R +/Contents 1878 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1809 0 obj +1880 0 obj << /Filter /FlateDecode -/Length 4310 +/Length 4311 >> stream -x]Ɏ$WJ$0[ld5 HAff1r$;U<%caDE0ȔNHB< _I{U=G#L2g/rP^ZX<J + 6}B>_~|E>3=vV5 [ - _ ɞ(ǩ %w.2 ljqypA!:!]y_~z~K -2ӿ>|| -wj^ĐYR49H_W~;<&2׊^ ՌBH .PzYwzQ^=mߦJDՌND"ТCF`CN6Syߑ}XFY=slҀʁbAQGu|X`21=f`ZLɘR1nR-l:c2á`Gq, -%ʑFǼڑ;&^ׄjф3RhgzA[SiS/6M*#4Fx݄2+i`4MzW^NNd_ -!Qe-]gxQZQA%%{t@t+ j)dd ju6SAZ0 P\.[> @qG"wLA-^FsA5^ 2PpS*B!@`l -^ wqA8c %c `u-w+nmȸ́bM(WmDӀVNX $NXT{xVVWj'J NtFpR -G'x ǼڒS< kx5 -N8!MP6p2(9x7! fS[ҏA'44D/@D}1[읺6jHOTRz56m|c rVj)*}֔ZJ$Vj)[َ4A A7SrVn)͏"GF9yrKI[<&-h ;x6\n!W3Roh`fSw4G9p$22tuA@0nPn}1;Eu-w+n7:PB,(m%RltH tURYٲ)Y[֢[F,Mx9R\jlV`B5YS0fY(V. ^ X}FE\y2{'z s3̋tbziJ9[hZOb魆vK!{ͪm(6Z"ȴAsV>&^v<> rXE߷ΐ^!F>4g945Y³a (V 44w2SF; إArK@7 ᵺb[9̍"d&P3ݚT@zO21#+l`jj3U ̰=^$Ku`, Cv6.l**W ju]T%ﶨһ$>f!\uۇ'H3CTDez>LrӯZP+ݛʌ^)(,>1xPx.:Aa5i;ۗ;}FcDiGGV6Azmp-|2l jG̑2ŋCEg0r+B"mɠ"X[pLx\jF#A59&L^#bo尻`aqX% 5ޱ'b"$6h6uxfg/([($2ۙu2\zndy/~ދKU &8C,>" V)2(Nmr}ԵގUΰ^A)xglrB͈R*EPB3P V4C j@z݂;*͖fzB -fhtfx 6͖vf&y/FmUPN{A3&C])6 b*aXVN{Ae˴Kgc.-;Nv_ޝ΂x6ګ <Wj7Ϯ4t`pM`^,m";> ΂K1*W@Qz;%{g֞3ڳ@gx=kfgb$k@2D盰{BiuV0yPb| -xY p`~ U9jT㣗ye M|0W7_P%ch)C& u.bCZ@ )11 GϏDKNdž1ݼ`txMS[Bɛp6{JV HwKumRE>p:'+}f< m|-malz7Jfgf_]{T~>w餾\ R*ء/+F rF/X]pT)N -n).g)1sUݍDb.e ZRu0[gZ|0&o9^l1\gٵ89uWNHvdъ|ѹ1;Qh7Zhdӱ65m_FW\'uٜU:!a_mHD[ZlWAJ!Lr*K|>Jt8` i90P땧\Ӭh0 J0OMalrT ֈ!'(mjnij.; T4;ao$cu;%mj%[0giv`5(PkR -BjRe}P\ءZĀc}08mbΛX)S(U|LUs*v',vӧ*vW -c+UMN*aL-?紩-ĥ @oO:X?R5jC;/z ٤ J$ͱ響H2~~ZHӡүC]C#Z0.+?T JՒTSo#;~nuz؎AC| +x]n}W$0ai)YtIkzcV]XU ہ+?HO 9aB!>{뗧<)}G-0TJX] +~)FFRY,8o+,T|6׃7D9N]()t[单i8`CPӓ3  ΃vxw{zWx7ߞFV㿟?PSΈ mTk' ͒IAE~N}!>RçD^Z1+S:@hŠJ/F/3ʫ'~XiӘ(Rr3㸢1։H\9Z4cliFג`*;zK(yXP9P,6(=UJߓ?nV" L7& L ց)S +6oM*#4Fx݄2+i`4Mz0ZJWڎga vq:YS<P ` +hj(PM4 j(P ;h-cS zPs c({H`k[wh6Gƍfxh@j'4 +pJg &p +ګ}odz€ U8Tz_pB(4R(G=8ƻm8Ֆ̟恨NX]ƫQp'(n< i"Á f0::q!zy*tD'z 胗ʷdԵ!P3ֆ@zm,%׳iL[M(n@˶RKYURj RKYl>(vȔgtdL3*BڀΓ-QWyVo$z8qG`nT%{6֤~Y}eVsUAm`z%yf0&_kf%膗?Eq9phgSI-PzQㅖ܇d"(yEE !l5S>=9DR".ӣ!d~Ђ"^YTVfDMAOdٝ 75V:s 6Nپ=#Mm +[u0T3c3GrVȠ`" 6VpEڒAE0AB޻a)< + +9GjkrXMY; F8(awVGJ jcOVEHm@l̝__PN1P:I<{e3_d^LdRMqXm~SE*vSdPN{"fk+5 a#ӯSZ{!u Tf= +h޻4C wT>-oU P f[PL#4C>m͖vf&y/FmUPN{A3&C])6 b*aXVN{Ae˴Kgc.-;Nv_ޝ΂x6ګ <Wj7Ϯ4t`pM`^,m";> ΂K1*W@Q8%{g֞3ڳ@gx=kfgbeUxq.lJޭw3F3U͆ Wݚ a{kk6DإAX!T߁(eS+z&IJ,{;}(TrzpPIlX%{@t+CdPg2U2lPvӥ uM2H u< Yb,Am-*A?AQ2MTr*CbOmb]DcT9^ nK{R X隦&')u곌kz06"^Is1v0>m/2`Q}xMX_`=h:F[^K

    {䫛]Y_P%ch)C& u.bCZ@ )11 GϯDKNdž1ݼ`txMS[Bɛp6{JV HwKumRE>p:'+]36~7q~eM?翛R˟w|3٭汿i=nwM׼;n:o+jBb#:v(ˊ dW.=ũ]at-|YJmL\`tw#. `قTn8٤!Ląɛv>\Nj3묮]ێCo^w5T~`G7;vEF6kSc_o߸}EIuRُ`_QSi9\a_ ebK n_'[P*Bw6=\3䎽/l$&ʒ1 yZq_v1j*okfg4/NƱ*6+kϮ=wd!pBa(YSEX>K_#a¹|n0*r EZ#K4L:P77 + u#X4^LoY٬UCnb N_/m۫1[UbKl]-[밯b%ݲG C¶ d9 6a-`#˕}d3Rs1+Jׂ$hdםG+`<_)eTז3 .E^+ (ѽGg çmh@Wrюs$N|4S(*<5AvQ%[#.tx>y%4P=d淹"ʺ++oyÜȣ@[h+ +K1Cs `jyd:obMLUlT2U#kϙؓճأNS}*dJ_?>VW 6;32<ӟӦBjNȚʪj.MGc?rr$(eB4Ǧ"Ti$m;*/=LO#w bj`|ajP +zsvL\ h|g endstream endobj -1810 0 obj +1881 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1809 0 R +/Contents 1880 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1811 0 obj +1882 0 obj << /Filter /FlateDecode -/Length 4936 +/Length 4938 >> stream -x]IoWD}} 0It 4f[AO,~#}U=G3d^AJ4ROyJ/YJ+ 6}B>~~E> Aߢ%vPx>b~ooH)>()4$-lj1<ɋ8`H`/O}_Sʈ/O$!,ؼk0%7^}iR loKe/"X^eXM+bڊu7Gg#ad^B3ȏJW*dH -VR  g8x)MUsfAZ &P6PQQ +Mf )%Νib -frv"4 ARs AY_d/d,կ9kzcޗ:=yW+4INߠKnV|rbv$\p~աM~Ͷ2-7e0Jܲ hANN 饎0"hbF$Kf40Z[l2&ܿa@DAcx^QmHv-Ѓ&%_&SٗٔɜӴ_¤)`fY5g\OMg_/A#7*z6qQmJd~[\eA F| 5;`I|)Y҅4M68nOrA˔ϵN/4vd))UEl;ݒsxR)ZpynSLBJ.0^bD㠔ڶquC$%UQ9Bz'=Qhµ˾hCf - -&d>e4)U[P-S/Qxjʼntg®$YzB6 {<`4rY3«+1LV(qZrcRi5D){ A 1m JφssI08m3@xTPH" e, =M0fm/qIUQ@&02fA:OMkѳxҡի1FYLas -ܖ3r6fvj1ĈUhTBQFA0rnAUf"fM{+GV:A ˼lj/_[+|\Av6-cVIl9D -_.8@CFK*9* -6uzWٲ=9\B1j - ʫ1倏Cnm8p} SUC.1(ѝ -dlCy#>;;R-̠}gsU!b^ V*uQ>x"[ٴj/CCSUʛp;<;6xVXCƺ[Aխ (&H,VEI[(K4& t۞\_X?Uzf0^z~K_/n71Tn*JP%V*{kgTl4H[/(Wq6 - E=,(nT61xLV>@)?L0Ʊhpk7&~S4b@xu rUt]i4:*Wx -G$iUԸģjTu6]h JMuVI90[C9?XiQM*{}jYzM}c,wXC/XeKD)h ؝,1~3cnJV<%AF.m=]`l:+@x{rpQҟTh/n0*`tN}.0:vLߝ*lϕ^,9e^Ƕ^C!qy5ng!+55Gň9H+qe *u, ã׺ $:|n,i3XT۳GzG^\2χaX <}l?UCMT$"m7 }bQuZآlk!>,wSs`o@_Pn:E)ht,r(qmtFƴsP 5h -lGCbJ8~ٖ#]#=ri1W  -*. 1U w .ƀTMW9SdNq~n|/D냨$ib0;js,N=3vXZ' FiI?IΠOIjkI]fAD5;A0GVCS_̪AaBv4 JVzf1֦kiZǮqkm,*| ָr2VŜQ -@XȒZ]aIن|\a M%orڨ+w=Mm8\9umwӔοKx΋5w݉*<<=)bIQTtc7_w=e]S ̅*./c_@,,3nh -דY)٨2p&Jqcb-Q>udO,\Qq1 +ql+n-'V}+*Iߝ{|cxZu1xyǏ -t9X3%;N/qriGtɆfevў -P&U@E˺jA0YRU(ƢeVΥEgƖ-uV^W*a?XQ0̂vH.G(99\j0O.و72gP)c2n۩L]ہ9٥ls67v"vdU\YޱMa,~lRHr(Er -:9!%ͣ -_q8Y@xVY{ -y[Jgvv>@+ C~֞a:Yp=,@/yLQj 56X5f,NEu&g,)F<4|6eLY )3U2wo˒uMʲ)cfTjtZví@Wtƒ,?na.9abTs녩{sV^qxIJjPݫqa`,.jۭuT bƝh=I 23 -m瑳\VyZFeN@^D% -l-CIaplLʠllA9[[],;]s*;ꖝº|kݠhc)ֲAxCy/1J_/B 1~E5eqA"5=EgX| -»c!)͍s2:l{86Fu?:v3Yq.Šv'YQŜ FbE1JN&TFM懕1 -ub'E "1L$cJ5Xռ$WO +jK5VJWطBUnmw. $Nu]Mw\\'Fu?׉t:WV3 -'sgʋNV{DS!a7*+VQd A/C[ -Zv;_#pöa۹1.E\PܧU-;KDpeӂ -X%`m 076,(<C)7w>WHf3j3JB]A)a;rG%Sz#˼B͖* -R\@u=%Xj\@XokMͪ#%XbJ&lCoyǿI5=΂MbIf.v~zՋbPu}-e0 ޴C!gmw=>ZE8?YtTbmcpMyTWFil@i곂)ɖQebk\,r)` &.*Z:١.@V??eb{6eaRqê3a:燎B>*ja0.<+- @ycwNE/h }TyIqDx}];yT ^.}D̘]/ RL4`gI(:zrܥƍUp{');؝<@Tq*nb{+9R41uN+dݦY lUxw[7k>~/7X6sU1-mPNЭZ]gIM`CM2>6׮Uj^彶Gv)vu ljKjByM̙M.h@|pbѵ18eAF-ցJ^\so!H{Dgo K϶ٲ,ZADtANL&zabYATmEXÃb Td)}-0 -(^\1VXV8R&<9@jA3%^G:!>TGcn-,FQ<Mn{Ã^ZF!AN{|pdƜ0Y&`*nW )+9M@-:EBRڳ,7& } JKǢjRH(%7(bbEeAυ eh6apvaJcMg(#*#=lkR~c M:xI'֟*`=3|/;y%P/V_hRuU_7USu(+=V3TKw*e6vz8hbsۃ`7*ڬ~=1Z;|h}dQouj"4`tN?hi}17U f+| Fp.f0@ s =^9_.YZAf(fmONM*vp0zEh'YE];NBz6J/^{qc[v!_Jp Tbǜtڕ8^Au:[M?> 7Q۴@V*Y\#V?eaðl,zv*١Wr&*TM6Em>꨺^-lvfj=7/(7F:|yRdո΍E6H|TcZ9nJB4,A%HAO\:Uq92`VAvY zo k?R5_N9:m{ˊhsMI)ci$6 &9NIp:7 7ve9jn2(ݕa,UħÄh?򭖑jUb ]Mr-Yx] hbXT *y xr2VŜQ +@XȒZ]aIن|\a M%or٨+w[[h62WN]zݴ=yq`;>ҧ +?~'P7^=)ʑ.}tuA(뚂\`.dVqyĄ~bawcE;V~B0 LEk7yU;oQ-v؎%|bIXcWqk9ɮk\QImtDư);CrDgtKvޝ^qriWwt~Ɇfevѝ +P&U@E˺jA0YRU(ƢcVΥEgƖ-uj+gT+ŰJ,;fA;Q[$Bٜȃ`.5k'lQ31wkTc Įm`Nnv\͍GqcdUqvV,W`X0X=RHr(Er +9!%ͣIg tpیQxr, N',=| :;w[QG?Jk0,8:˼(,hbTl0x{r1tͥKF V?SQ]Y,i,jg--M(bf6,]]eG*:_ 9AY6elLeFc~i7JITQiO`,Avsq]XzW>gu +(A,EdW^eV>gwUn%Ogبe3D0.KJ>62RR]5-{ ? +$*N7|@7gkIJ +kgOgeR>.[vaKՅ̲5Sn)k(kʷ . ,x:2(ZE?ZʡٚKU}.G_M+(m~IYuBdKSɤ-{c^T>^m=7v33gG`AXR" oqO/z)U Sc›Vx3̮sU-̢rO,,1ĜLpxhƶ(mUU}V=E?!J#xY:W5h +"%I8-ʢ@6@Vl/Ԧ聩A !X=*Y F?^.q9xqtU=Vj|+r +):;v'U +'U= ^ÊaT͢k0ӄBmv̾]5Ļۑ]-Xr'ec1P)<|jӢʣf^Ht\uvv>$|jlvjV*ߵ=.Yhֽ.-:WckRdlr0EFՏDZ%vd[*pIL b}c^c *Cz͖`h +W7|ANL&zabY B6"m,A<kP-Iͼ?ϫn =6~ngJE&6 AA@- Ƨg>AHznϟ40K#pJ1 endstream endobj -1812 0 obj +1883 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1811 0 R +/Contents 1882 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1813 0 obj +1884 0 obj << /Filter /FlateDecode -/Length 4460 +/Length 4462 >> stream x]ێ }ﯨW !yާ BeWձ%;@QS7(RyHQ];sy'y+_b&gz}U]L2ċR(MjY_ߞ{u_T2`~gىOyz'B=o|?>;.8o_7'{-ssYXce;NI靥f7V†f3Έ舆 F(i._~pN)#._ߟ=nKo6Zy՝D&̦~x}>y$kН:Dr-Yۅ%4(=W[JJ&28"QL촶zWJTIN({G8=ㅍDhNLV`F~xpblVa]gĔ'٬&<[N'Ը%3k"V'lgsZ\M!=q42/0o֑Wx&N%{5zIVȋa_臡>-wdTˉsDCH9LEXxmp019Lzy2nP.?(4OꩃStA{Y@Auoe#S@ R|*}GqbuY`ϸ ڪ $) W^tʫ8`]5>vѺ8ȉЈvi`UCHSf%s2*{٬\k=˖hC;|rQ3UCȶdƣX"sS6FUiKuAvy )COAv]-{F^J&}++K?ړ# dO]YD !jFV]{dY@M`BdoY̦~jF;O^)ZBKv06#h|Gp5=!^;EԚE &9H&EU$ kɂ4E({"Y,*?0]Z],"YE(ыrf$#)E=k >oAJG9MŮeFVBx7Į%jG{0vAwZp`|]%MN8̣ -aPF~?y{ޡ,_tiM,</v"xW`UEϚ},}#o{W:WQ'f$Й^5N6t ;Foj0M/^ E]Һj1 4xdgO -__ +aPF~?y{ޡ,_tiM,</v"xW`UEϚ},}#o{W:WQ'f$Й^;oa#^jI̾ f y2Pεi5~ ;YBu endstream endobj -1814 0 obj +1885 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1813 0 R +/Contents 1884 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1815 0 obj +1886 0 obj << /Filter /FlateDecode -/Length 4058 +/Length 4057 >> stream -x]Ko$ WD!@&9$< ;BZG=9d ODH~Rϒ~~h1o~~I$+WޔL< Br:dQTJImCcק?)AóRZ ._ϯ?=}|?ODh",WvG҅[>yPSZ5u*H^/Ojg䉆AD+_~~|^k+?I󿞿/O^K[K.6i  fB_B9-1XAalPx+a -ZxTh? ;$8; 3;l)ERl&FWiw)Hr^&daVNHkcݲEso3k}2kaYeLg6Ruڷen7:S]Osvx.}7ݷ߃kHJ*c[ċ=z1-SYQ^9/-'0_*ͳޛMfo-Igzk- {gފ#i(oȧYM-g _|P&'7FG8GedadZ{ahh.46-'#EݑG8Yw:jAȌ S40+(eH3gO uk$\Lj̠S1 (}1u]lw$`U[dZfs^m̝/e^'%,Wq>ɕ+9dhPzELVnؼ6? ROzʵ9zkNmPȇGԃ ]u0f/<<}^0(@8_ⰠPzG^i蚔PZIX]0]̕sv~ӊ!ajcrF| ->(ZI@u-%3TŽ5P x8_m6|%]CTP/5Ob˔pK\, -^t4)Ђ =^鋞  .(IqeNDzA2¨kIH̉.R.3#’/Z):7_ܨb3T3X -Gڝ{3u P1r#Nɟ3]!ӡZikiΩ\~j|I $W Yc\V_]?INbϐ؃$# 7bf=3bO 1B>3i%1}ND`X[GJvXw+}=0}^nQn9/mSY +q:e\hJ_⊚BB uk0ʅԳN7kV5C5 Ht w=Y6 [}Տh[/K6D"Oc)BU fWXD%Y sI;) jgDDa i.r wIKp<'KB]NJؘ(IDk4΃Dy],Y 4_Ax%9~lzo-aJE4£o@hۣ,Ho(iC 3Hvd3E{6 -6hn E ɢCd*Vɮ7#]+mHP$ɂdn!Y?ɞ=dQiBrdwz<bd1zE!YX$dAu#YHvEH#FĢb.;HvEH7ɂcdtZv/+ryW9^Ifd=E e gje\/XJ!q [q*2HMvU(mZ-RUk'R AߪT夢~tcnKbu{f)RW~&y~.u@߅~C1S^޷/QEEWXʚKWTwRJ^`>YR oY' -r ;[{ջV^r`V7R^wW|̎Y[}Nqu -FXk߳f0Fң tԯ^ -rZyr뷻O]Pgi2օ{?G2ºp`Ӗ5?ܬʂs5QO^\]Ȏe~e ̝|v-8z58]*r'( Y){AvrH2KVtgy!r`bdQ$m˚tG 17SWv`F.G߰m{֫+X|_/LZ_g)ÚCqs'J]"^7ټo7h9Kz1_auUnv b~Rv~hUc6Y5Eh:ej&'qE;1Nķ0jd\.N: j kxSvo[vw|}1m-m89ls|n]Ww ڽԷ+eG\9!-(ZCC]+,Fl!S)ջDê!o;?X@{0«u"5ӮӪ}Ӫ&7AzmVF[sVDl;R"Q^!|T'/OUewzXMhR~מ##>}+'4W|I:'w*b rV`KG <Հg]v{K@ܹO <8l.P6qM7+̏pZ; ux2d}U]#: ʥd3˄Aɮ .b:1 =k9-L? $A‘"y+[%uLUT^}4iZIvZ{^n>C }xOsY{7'Ip[ll)g΂7uT~G' Kp]Pg!)̽ghYe56m]K܌Rs쉠;h$^F(19xO&՞.MdY -}1cMS4'4tH";1:l`>f*PY,0n3)=ƿ^gV - -|3 ~:uISaWU6?{Zũ$JGjT?9Lǫ:E^ٺO2|XTij0uHC+֯i\̛0jmClS%Y`޿[ k:xII[L{x1{ZI( s_A0ë4Gvˑo6LfJlfu}Cgfv3ŵ̈́gOFoAc4}ZkoȧYL-g; _|P_@橜B'>ҥubugkԷC]3 +CQYL5}F&7:?L6nloh:^'12m4?/Ϯ5Ey=g~ںhOvM cˎfu9zl"V+R:>nDȗPQ& +a= c]\ȖiE H!׌09q6:)"F*FB|nr2A;R |>uz̸>Es_BޝQ*8sD8o؀Y*nt\K4[]"3(,ET$oLJpo[L9AW(e: !X$5 }/_fN[,LAvG;su,5Yh3#TL .nn8Nqn4MBkj@Z$uO׌#XfdOA2럲 `3} .&d +Y ȲNo2Q~~>^].Q5cb9jr,lΔ e٥C]HFCVtcy!rbdQ$meA +I)T滇+y;K=v]kw HoUxCkoHR_c)ÒCp'JY"^6YmWh9Kz1_5Uv b~RvkU}6Y%EheJ&'qES'Oo[E@52;.DK'V|`5Lzʷir;{;6x9>7.XH'(K[_f*3H5ARV}[~+;maYeCV땲=ŐۖJ-!æa#9Ѱjˮ`ێO8`NFx#ؿ@0Q~#Mj{.{x)Gx(>4\i.kF0 n+mjyyD g*p0')s(Rdk0:>x"t/uM8[@ms޴ma$o'mOk:vDŽ!|bfn +_.- endstream endobj -1816 0 obj +1887 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1815 0 R +/Contents 1886 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1817 0 obj +1888 0 obj << /Filter /FlateDecode /Length 2939 >> stream -x]ێ}WeN`0&C0iL?L%$vj7ªSUdQ wxv~[O t+?>Z1aB JE5ZK}K?)%,El?~LB̄.}з,|;x_/OVBP)eU%>u؛BN׃sB)}sH]/^y;MjUکi;o&-Hi6RDqb&~_jPDY卥ZZ&;߿ `$F*2Ǘo~#)RF_·`[s|tYW-%5ψ'/Vޤ~"rG5LH oI#e>??v&#VsO)3HKHr{3Ή[L@/ 62I{B3l߅b -%S&&gؑHI72w*Cd<3j:Ysll(EW~VHCL9}MAiA&Pl7*"J21ܒ#nIJ-Ηx*Lx4J'Yh:6^X\B:cU0kI:zekAR0 <ԜoPJnzsTK ,Q $.1σl - Kd6Ӡҭc *W.kYvcnJXkQ3}X5+xѻF4T`%3TW9,ײ,_m)N(=<)TO6ЫL0xz|U[V{Zqol0jY CeI8hd)=I4tNE*GfU5^zZD!l.TuKm *Xc mA -W$U|ɘ~Ι6QJԨZ#玑eob.neUjVT0 -*X;+*tV V HY[[ _]\mZr [aCp¢} -ԄMFg/,0>[HX~b -݆ Zh ϲVSc-jj|?|[3> - g㬠,w:JI#. UŔpEא݊.P ͊.ZtjVt7_t%oVt=& kљTVCA`xŸwA>[lkHXAp~nd݅GZZu$ّT[iǒ7j(-=\m[mPZ:QV,7n'dwi VqK[z P1*FoF: votU۠ ͎7dg,`)T r҈#ОdG^ĺ.f%:g(piR k.|#>Cvv)Pf rpU r -`仜+|TU1HɹBTVcWw~Q3`g?n:ѯQ;~:q S?t\ ;;*oSe^EUւLz1Ur5o?1:h@ Qp\?qˎ(7Wݶ1RItkQ*CآVkc7;PձE uq 62{K|):T{6=PW.'v1]ryڥצ£.muo=}5W%m׌پLzpʟ<я)OV<]F5B `McGeu*wFJZD;f` _zб5qmbLe"H]s92v: U36di9a" N8S ,jpIYrD9ltv[5U۔wADeCϗ4Cv:AuNϰ2+ŤxG -Y1z!:;TGYrx)VV{P޽*_öcIһޢa a|*Dx6=H_B*|4;}M -xK ʇm&fҜCXD8g|bMqjP6rԷT}b+gqZZFxe8ҿk )̦%}~J~QƗ>4C$ ]^ bhe 7Ǎɥ*k.?^Hz}~/[0Tq/ r%5`0\=cΡ҆mL]:*/ohe#-oZU +x]ێ}WeN`0&C0iL?L%$v j7ªSUdQ D;s<};|?H'?t+?>Z1aB JE5ZK}K?)%,El?|&!?pfBRuV[`gŦѠRmr(H#JO;'~I2 +tg)8=b8kkG+v+y#ͤM0>Rfkׯ#3F,N+<_2xA砘L2$sԭVu[Lm˦6jx̶<v oMxA Ozdtl -F7NrZ) pSEJeʛ5lʫe0Z7yY[l嵳v,R0Ygχl_G-+C4mYE_lvS?6$^/r& M0gT&Fe +i8T?PfHO%L:\$|}TDdb%95G@9ݖd[/ cQ="]b3U7h9N| tlJ#ϱJ1d3DWuG#`־$YaOO'*u<=K]ւ`j#+x5y9D"Z&稖AzKY Hn]b=7lAaQ[rUb#4\%D"D~ݔV3Z֢gV1FokWw}itwB3=Kff#שZk+6sYeYR֝Pzx) RNmWKÙ`" ε`ղZM_A'ؓp(LRzMN9hzO݋T ߫* k.CP Q\驜-Oz29@Tjw +(ۂP H11+3|m QF#H\/0>&˪+`@[T0vVT0ح*Tm*^ +T۴RŻ|˜dE@Z ^X`|*, LY -,ievqZZrլ ,@gx6ظVQȕѥv+mm;SfMtHrf0]G_Gɦ&׸wZa-"2VHw,I!3eQDpVGusע]\ꛋ#/s^RRewr^MtЉѻnp U@Kp&QH|@z+99*t?ge.y]ӆmYx+, VX׳ *%ɋ.VESJ5S]Cv+@-4+@zh5Ҫ Y|5Y.&&EgPZ  nl5"aJ;uR7˓Azw2jiiՑTfGRa[oKިtsmyc~&ⶱCCi0Gy[}²Pdc1ޥ2[ř.In1dg?@Ťna,ؽmбVm6;E^4S9<[0I#v@{YNy뺘؞mZH109 @Ho˹±Vi+oƒr!6SU & +QZr^G΀@`RDFmTn^ıL)kxs5@H.ʫM)z]bUY 3y뵿STiԼ,:Lj1G{sU-;܎\v:H&M&F:F v`Z BYW.9i3؈^Y,^jSHSAB _yY^^Ht?kޛ +@_EX~[x\_3g+W0])&l0F?f> endobj -1819 0 obj +1890 0 obj << /Filter /FlateDecode -/Length 3371 +/Length 3373 >> stream -xَ#]_gY,b  &;;~XT"[>$3д>X,j@c -ޞ_? -NOc!_0 1BLQhtQ9ON=! -Z(GwPNoUa -90gpVfO438`_3Ʃ5!fBX/뎗̀ைގV&:g~!?뿾ߞ!)׉wZCzXM'7s>h}4%eF2R&΁v~8w}xy(97|@}f7 zV,ADj7,GN9}R.gvVϳj.ηIgSAS&)@hl;+I++cpګ~hRvM\I 1I4a=O\ڿoF!qHZY?g%: -8#ƜHzr{n9>YS%c,r"mi8_Mw[*,V 3Li$0"Fʵ|?4 s!U?.1)0=yTn;^"i'G9: &h(m"<<&ͷ|o .a-Tl=ǰV -VTzӶ`q$ )(Z^; -8]Ag`"eBx!e *\2/sSojg:$0FbrM`w T@|~VTQhc1!ؽYK3/j즱̤K\k{{UeKve`.{*KlK-N =Oavo[nHJ[kyh4$)qy@) CAU^ΕRXc CT!8I%&tJ m_B)( ~4AՇuq^JG -yHJ &{IXf({%u7-Ƙ--I)YZW$J@ -O\GЋurEVN\Je(yK9y ^GU<"9ܦ9z4|d5aA+=1ʙ1?U3yĒ;l2~sH@u$CLPeoK]ɳhDeZ\=5 KZ. {E/J~=w+Cḩ83.~KE206MH.QyJsV겠X$e'A.n(kӻx1mxRoRW%OfYW 'Lڀ߯t-H)|vy9vO7MuKvcqBPk ӎ -+З[^6,G>w$.:4y&6PX!$g*IJ8?PN'U!MslfbB-e7{—XWc﫭Zdq=-r[ѯR(%gWRq|/B6G_CjsBvE_CsTZp-!>MQ(F&F""C^ *.-O ]QK*PTI=K*ɾ殆rv:X[VjMY^һ/h| <Љn)8U%F743#Xe*dP!crC4!3192]5WTһ~ -bKlgXAr[dp'Jҕ]N\\v2Fyc+~~>]-Tv-GՃ&{M9x203 nzqJոyu⌜)%00젉{=.Qյdb̗mC]ɍ/" !m;#M"Mc˷gno액/teC#bL8~ub P3o+^kݸ2xw4X۷{飕Rwֆõio[Cӱ+'L|:htPڢY;5_aBSLHȷS{roIR&3ab{TMFڧ}8+D8+~C}Tmg>9 bo٤IWJZ>>0_E)\Juq+Fhsk !7 -i/x!*sv31N%{gdvq_6iŇ%ұw{Rek6 Q6J%Y`9l Qɵ׊/|ݒxH;aE+B>,Ve1߷,!m%ژ-sX6@!>K"iJ{W,OX17VT[C,١awjGm]ԕy)ঝw,_er]lh9;ҳ???sŅ./,46(?AhQn yCz^NxFP˓59i޿zcTAM zyzwnQϏVu~2c#7@1^b +xَ#]_gI lHI _ UV~ 4-sC3*;~>}9iPOc!_ NNML`2F[ +_>~8χ*hb8cB|DÜO_0Juo LMD4l)PҜ+ByƢ +>_1*2a6(!ͱXxY OkElzG;aat0G0_lN\oڤ' I,cB.ybp +>h}4%vڌ0el~8w?<3PZh r8x@}f7 zV,ADj7,GN9}R3@R:s  ql*|IrJ!4G6\XwQA_?`J`JZ*_2y]S$WCLRMz:7׼хAHA7)Q+'e!DrH_(Q`ՐbK9LG^!g ^]3#p{#5Gbi&]B] HAP5ؿ3Iq8L<&]B*sKP> ?+*(:idp^ +, +n~5vPf̥Ou= =L)ϲzl%[20=%{v%OHV +0AzbwuT7$C%-uʼnȵ(zjn]bBݭ^:zVqSqg +)3]JNe`0Ym]>D)YB˂8HN\l{~U=Lwc.2jǥ)/vK +ͲRm&N@_Z4ƣS0W:y9vO7ᦺ%Nұ8!K(i;$Š.喗 > g9(|$qYs| +ZMӞgc LR~ ɬB,3aK|^҄1&>M̍H7[j5n-=k%ĺ%{_mՀS&,eS#9UPT&Ëג9 !m%U9uqIm8ؖ(#k#x!NreC%o)Þ%d_sWCp9;-VO,/ +ݗx4>Lщn)8U%(f!%+V +vHxep.MiE<^#'SwƼUدC%[tfҡteS9Wc>GŲ]"~*;|}l3؊}OןŅ.%rzdpih#1ibFcj,[M<ܾ^Z/}e+~Oʵ=@],]%hn<'j6ՄKT<!rۿ^q_=bPXR +uŸY 'MF,ǏmAy]]BtY3̺Kڢė&$pEx_#{5DC>'8- X̅ΊC XP:nh=dh9='qЌ ?ڝT+&y|:ѐ,nS OGIm4@>4񉀊p;s +2]c'/(3馷T̟hL޼N_8^s vE!J X́p`+WD!mg[$ilR~0 2e.lhbp[I:e(`7S/i ޵nlihnh۽Jѻ{wkCд ޷ؕokhR>4N:(.󚏯C0)M&$N=b9ͷN)_H]0 =*&G#i7 +Q:"ΊgcglۙlN…[6i𕒾O)6uuQJ.l]fxU$%vk B˺6^{v XTY)Y]*}eu!t]mǞTpMB5R tFۙUkE_n|Yn"N!v2[E̶m̖9,N^Av%Mٴ +['kc+ݭ!P`Y +ʰ;J5 Gm]ԕy)ঝw,_e®{f6$#:mHzPc+.sQ~ /giNAɄfqi5&ost7DQ'dGMnbO!/p=O!E?*&_`ƋQ< S(k: +}bL endstream endobj -1820 0 obj +1891 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1819 0 R +/Contents 1890 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1821 0 obj +1892 0 obj << /Filter /FlateDecode -/Length 4151 +/Length 4147 >> stream x]KWX!@$9l0yAӽ{@dL={4<ݶ%փŪΒ~~h1oϯNҿ՛d @@ -26104,91 +27154,79 @@ NP PXL;]@'C'VH1u_=Tց* pп E ;X= 暏jo޴< q{ִ֦ZP1:b*Ol5 Rx5ϳ+("¹ |.Q~X% -AV }" e%~Ϗ߿O~O}~7NgG?yW\ˊߒ"<>ϧW>P{TҨ](ldG/I[3FaRl, @%^b +AV }" e%~Ϗ߿O~O}~7NgG?yW\ˊߒ"<>ϧW>P{TҨ](lDעK̅z.80CK~=y5^ endstream endobj -1822 0 obj +1893 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1821 0 R +/Contents 1892 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1823 0 obj +1894 0 obj << /Filter /FlateDecode -/Length 1824 +/Length 1823 >> stream -x[K6W<8CAi{h}EFKR :âX%q E ->߀ !ݧ] uwN?iG$T3W "Y#QHLu߻ -f Erw~>߽ٽ3B=3ߒN Vo8;fAjr o-^Tq:i=DRi h͛' 8Y}8m;t<{d:щr -Q(&?"?RTTabgn1p,bAԐ9"7?=`PA丿{Zskf -WJ|1Fr?ݮ7vhVE0}9̞f/=L=&0I 2[Zv xc$hV$*xu%S2)UgP;g4LH!Z1+O0͍*s0h8WJ'3XWdsT4N8I`<ҏnoy:N?,fK[.DuΓDvӂ{zzlSR}<}QViJ6\:3ob}p_c\IkRݸYB,+eqp>lC ī13/,\/ $s!0ljKPYT% "TR䖌ń1'-`mh}TjQ(U⣷'xz4)'Ћfé$-dlju;*Mac)d/jN~E>Dr[_lj^m\9Ӽbz]9Y=Ywsg &0p"\Sl-AG,RIN2#b^3%,"L?tM*Ў,Ԣ,xJ#J~mnNF&ŴYfƔIk&,c3QQ(/؂3ϲMlA=˦2^k\9YP[O܅ѩPV%a+;n5$-Dp2Yp[H%Y4A~Ãsom} S[2G!я'2(n>#4Y~7k׿M5%qvH/.vviC걽t -tBA}]$GEc}#be.y?="= -t@yve[ P̯ 1~Ѧe6 ,}1n۬E~chfGz$۪ +x[K7 WT"% ȡ@ m-aHrI +$@yx4^o;9tY۲-#)}7`2Cȹqih7foӎ4hI/8ge@DA(wZ(huɩ~=I,)) wjh  8?<xi>1kTǕch :J%N4 uH;6|xBݐkJQءyً&NSB1O1q?~q&| L?:Ss8SԷw;Lc ww/^_^ +"ݻݟ/К_7udWxDRC,=zgN!qL+^Dܗ 쥇Fpc3mA&rk.o`l͋Dn$=1 H<dChDŽN3JEh`7 _1E]y8 s0_/y0ϷQ'|LFꋨ':Y#[PY)6P[@HV%!@l ,ߵY\S]Nz";:n~9q~Ycs!Y6Eձhn,pt@etH^Y$ f~xuvL(- 'VO嶿n .P$K>{:.o<,g+[.Du.Dvӂ{C6թM)>(rU-Dq;&SQ^2Ő ݉I\=DJrQ| %^NV&&c-nGvbC4g]"lY0&fNc-`8?2h\LBoq1 `PR[>" Wh| +m2 +&IܕVZiVGO5I ['uGs_ +LhIRg|Fn&-qáY}Nukyjd-aKA SFbkV 6|C듼rXR4G& [h'7`/@;݀iIon@:pY'Gcixj›)nٯ'JBVXxel^6B."W+hCy+'ʦ'J3-*ܕ[:K6~dso *o?fOrٮt)aezdxmJ)=pvde pUNfQJ[> endobj -1825 0 obj +1896 0 obj << /Filter /FlateDecode /Length 2619 >> stream -xي$񽾢U(B46xfmMۻfz_f pHT^UG.JTܧT gͯ *_N_OZy'|ȷ̿_O蕏xw(!(m%DϿ|:x)=#* `]i뗟O߾}zc@ Sւ9%~9ٴTF<~xJ57fʻ|υτg0w'j2Z9}3 s֊{N6²H1o QF\oHncY.zqK -jBye1NcTHYܵBGxkc{]gg58+aoȶic -jZS >9Ѱ -cہ;xn"s=X4kv_GtO9v !Y` yf.*_~u*KP"]z2ĊC|1ԇ*fa/'`?|l"O9{y&?[ƭKhu&@ZD:`se)htpcC!M'g2bK)7CR>C…/UFc"G"8,g -g(ܥjn{m綟cyƕLy6iUiT1?R6_7_g0*y„tA:! )qԜmzu5Ѵ}'!ǔs^Nf޺Z.5x,C5&A~  -\)*DRҥ5eM )Lxm(lm(&p+Wdx{` -Of^xbJ22<fʀ B:)Ze"#6VjTWJ -h^ -&[8+dtrT]A‚fgB+bs%Hoe|P!ƮdwK{N9p/G1 -ǹU1 ~K|ϥ~ ,bV2HN%X@3ҡgeBr]ΧV]YvMzTi&B![Pbg18s>~R-D*KS9AUl4 ->тXGF5\%UM2]|HiZijA3xW%|Д*p ()#H4!N"{;%Nhk5!ܣS-k_2Їr]'6BaK";{-M,C[lqr`.Fdo -}v¦FsoN)΀i񛾏cnU.9ve+/&}S,OM):>h]:UC,#vR*_Gԡb rOAGC>MȇMf(!*g -MG㠆EJbKL#ug;i׼^]˭b9eA+{7}7 %4_~n)CHK2yCAN==ݯm"?,)Ӓ5i='S]xPkImyo ^,F{po9g9?|ӇsJO?Ec߷ןK .B;DS ] 7 ҏ(եJM"k@0cH#!ٜY饧z sS/>3t9R7Z +x]E?DRT  H&w!agv^v{,r]@2͌eY)7 "1qד5 p9!3C4֡ "OϿ|:x)? [ˑ)Dg9~0O/5X0=3x2엓Kdϓa'4?~#h68o8{!F w'f3!sF${`ӷ3$;q9ZHE,lBL\cFLS2,Y4#hǥ;#Ci= Kϐ_\W[ `Ezi̲pqǰPFw +证B2b8d:dz[/[' )Q&2u,[SW"PlxSf!| +8LupuᆔHa,3zxT\_G):08EP2TEkȦL."P?/KĔʍEs OʀB:)z㒰Խ2V2RI+Pa!iq8LMTo+PՁ%P??M*p@Yn|;%>\:sWOƚݱd<\T:ZɋAa"6R-|O+8pGHFB[Q%G&dY܉P P|[M9tm,à@Z0'Yz3Nld=({.UpK4X 2OlUF|n0I.9Z0Eu^FP'1ޠF-`(*8:X0,#%]*hBJCoM|})I<]^p7y#95 +ǹ&qJ1$ `~)1O R)eɳ'=?\pa(&LC&˶f8dpoۼ6/Ix1}K^:`_r#޸Č+N`_ 3PкXKN.(,_`{Dl/UH<' Y$ /E_cE[\-w`W҇*&EPM +aKz͆NRw~ aEted(M*mR&-T5 +X~N0@59ϻ'OR*ݡET@V}i$&OUsowj%#(1yR ӽ]v'4QթU5/s{Sp% M/lCՓ+Mu<Ċ%]U6p3OF%1ˮR Nk%l8Jcmzm:a4d\qPi</[7}N6Ö=X݋E wa_⻺Y7ey.v0cup:jlsy5]A.q;07JsV,5AtOYore -YKh4|8S3Ҟ єT1DŽ--% +WS±M[é?޸%.^Ҧe"Ǐm[yMB J,X,)]yE]Y2V=w?9 L"uAs;%ܣjːü:1֟J`6>JˁwDOjQI+65j쬜wc 8_8m^Rskg_b:xK_q7e܄ҼC$9"faټr!)JHdz%+8iB9ezz .} j\/-4_i)bZn1t^훯i7ǃKho KfDiR=f57.#?.q/P cVbwjP0%QaQG 0~MoYaI%9L#ĒL !AO k'=~r K/rw缕# <ן|~K CwS I!R*|Jmm;J5v$WQ=L1sv`)O]/=X3ͮȅˑ'(ZR endstream endobj -1826 0 obj +1897 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1825 0 R +/Contents 1896 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1827 0 obj +1898 0 obj << /Filter /FlateDecode -/Length 2989 +/Length 2988 >> stream xێ_ex00IM䆢3ޝRHY}tفW2%ܯ GI#x<:|>Hጤt|N`ǀJӠ pC|-λ#R@; y7ԁ0o #OJ4úfilQF8Yu0v!͛}s3ZX  6ߞ㣝%̍|t߾!Ӊ')!dH,F`lNf抙}fv6ULCh%J4"hc+0PXHtFVW<3%up^v󸽞윮j!βtEuB>ld)&Y|@ @@ -26205,92 +27243,90 @@ m  ݃#)z&@}װw#V ߬Ɯ<۞M,F/v6&^y˾eqbiWZ06 m3,'˅P-,{e,!VJU*G`ܺ{k_Camq)TCE7a_V͙{RdP훯gF $_s)ssRWG8U<@?8n+9l:g#U4$rR{Bn,j8K[u` X^:/$A$MKtu>=xk9Ҥ9PuBfl̷Sln웉njAAZՂRn͒g*I [rC5Vv%|i! s i^F3-X;ظE)S%Mˈ.fm斦[ɘ¦&V OO5q=ɕ¶D`N Z]sNٷ2kk*c9TRh")z\c>|G>u~Klϴ*2[leMK ̹OXYdcl4Ǹse>znPxochuբ (M]nk41hNc^^@Ä% YZ!N!k -S+EupÃg]s.t ĉByB#HEr&#}DkaVv.@Ǝ>]s.t ĉByB#HEr&#L̅llMҲE㪃?O&A[)w-U\}e:?X_A+ endstream endobj -1828 0 obj +1899 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1827 0 R +/Contents 1898 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1829 0 obj +1900 0 obj << /Filter /FlateDecode -/Length 4024 +/Length 4023 >> stream -x][~s2_Z i6)>{[`tHf %ۇqֶ$j8Iqା?_\8sÿtK:#}(\0kL{/|:\*83Z)~t%wA1ǹ*̈`Wk|W^ހPGp*1B^LD[%frxttoMFl:gg%c%כ{t1Y2 9 !6e@P[(>_?~]E`3ׇ?q.‹~b,``bVΘ6kg~iL[p~kǵ3EF/*4ZU̓[C rͺn/v=VG -&㇡WwTKMNtIy9SM. GӣҵQgd\ `sЉ5Luq|5GG."n]䷖I&]=/ - < |uq}X/D9<2h/tJD߿=CHRꒈd -rcdq LwN|U+:8ڤqc&Ip)u0<'C' -̈t-T}|gvx4ZU⡓P͉GƢfBN\<L:qU8&w*ڰ`rISukx<5=\{xlӛ=N>W_=Hiʰy5e(D <YOwV5,$d -"1R+Pn(pVxn9&/J$|PHS=D d9{jLIƞRS([ז~lx!8 'f%O ǴSG${xD2zG}:btk^^–:i 0@@#{hd:[hAA%C3"0|AidFAU~+ J㡙AAǐAidFfӠMrs|tOLt)D~߃AU@Hid u4a\FT~ZWKlFxyi{;XGusJ.}60 -E%AuScdދ%9?e_ [VDw\ 2{|[^'B^ٓ &Pa-Qƣے 'A -0TE҄ ,jT͇>.ȜbT'i7ii0 9221(m&g$"t'A\s,qȪy",툋;FڈG%BK^-9YiX@Yꘅ,"+k. YJbҞY,rbG5os">p ->J%<IGƇ`v]*ۏZ孪@A65W'MbD0ռDp%5ƉP-p 'Zʹn}805 DɪCc(!!B`i\zL YJAP=BYi!֥iS-]Uhn*q"Y-jDS כB$p -NJ'%<'IGƉq֭ #TWG]q-1%۲H]uDz=ZG$Ƨ~MuDw=u-na!\G_?~]E`3ׇ?q.M0>:xFe ׷]?/嚋 )HF@\;c^nB4 +h{56Vw{5Xu*^߭cRu.m6K;]'-cL794 O:BHGq%Id@'/0헏ݻ4uZ&vQLn3R@ցC ua) 70JDFOL`c )}!JK"+k _gscb^y}L&3IBK)8ȯ9 r=1WdFk?{|ģтޮmN<254p*1`R׉{1۔VԆLH$\+D\vLCcu(RaFJ[WUƯ)C!h/zQff!9&5dFPZ T߀/wC ?#v1y!5@U: 'Ⴢ^F!jhM%˱6Sc2N0JTJF޺c 1M8ɬ0+xJ8%\nj<"٣#Y6^Kd>R|cסۦ_,/N3gP*u@#ފFS +*ĝ T4s J#{ؠ42 H 4i{ yFAid6 ZiBnpS񃉕.o3{0HJ<h6>a64^hO+jȽ/= + fmȖ~$RtI%Bjskoc:燕`hEXif̭ZYHaPjX$t ydS w*%,x,TjS2N=O@~h^Ì@%c2i+X^ƀJ.6%yt*!Y O{`m3{9amU sCA~ֈV-xL YX"m *:][ibXQbNL%c2_ֽ)O>≐>g?c$= 'ToK$hI7Uzf4 ƲU>2grMZ{> HN q. Jp[>=Ixb02Ktd^˩{;"⎑6=Fd `Iuﱐ咁pG %@gV +r:f! ʚB}g!by0 0&XQmۜi,ćD u.-C|8::XĀGwDVy*3u|'M4lj`S)u8m58EI5wͳq"TD ÉV3,[|N#LM28Qx" +AjG'r8BҦj,dj<TOBVgZuiT AWU6=[aJaV<'zG{,ĉD u.-qC8[Wy#tۮӖҒmYWGq֮H|:"D#S?&J:"Qu;B:hBdϰ#h! {ϴBz%[km| Ԩ<Y8?+%\‡[yGpVāo:"LLj[狀 f# F,o=QnO -F0,oF1XU0b)URcTua6aw2)L RePx!ȓ]ŵ5C42:G[ -h}28@EY*$v(*]qig=xs3%Z@! TZyF+ 2mHeFj!Mv1sY"]cL.uI馤h"'t'<@&@d t B%K`E&HUiI77i!it!AbB2܊-bZI;ݕIkCt^&MT xc67KifUy~zc:iDJ|J%~aaQ.C4=hmF~(S#S+@nsJD(퓥?UB9.]s*Δ(*$ 4 -Pm)Wc|bTmpf$"ڍ%QLZ?Kz'b67ѩK2$$2#kcGWB#?"aF7n4Q+{4Z4F;hWVm@L"ݯ5* RC[?Y-4Q!/0S0`if8{s:>+8zf`:K{L߳ӚAb3e?ap{d&9b|" c#˵/HkqCtܾإ9 P+AdMX"͈L=mYvꜷ܇%sDqN’5ZFˆ0}׏dl{xC= jLoH97mP}_zH'ﺛS6֗%.$UڎO)n4&({ 6gw1NڬGu -[~)b#3\ +F0,oF1XU0b)URcTua6aw2)L RePP +ӣۜ4CX[,\G$cr,9QC+:E6d)Kt}lE= C'kkqidtdTqUI-0FPjA+UFxzDL Md=x +J*1.'pLx;$f0Von|ӺCCĄd"[ĴFw+xg% +L@j JmnZ-4ͪ"i>-ubdhJ#Jv͟Jâ+xYB1sIk.yX/Bg67i"ŎSZ{ "ݯ9,ǭ]xr&;,^sfCdbz7@!·6"k`}^c|4#22e٩sr,9 K'רjm8D\hp@-NKTh^?s+~im2r:B2~w?!nߴIR_{@&;* Ou7?l/)J]Hg R ! }u}6gw1NڬGu +[~)wsI}?y endstream endobj -1830 0 obj +1901 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1829 0 R +/Contents 1900 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1831 0 obj +1902 0 obj << /Filter /FlateDecode -/Length 4272 +/Length 4271 >> stream -x]KCdIr`ڽ{@%D.>a-Xz|,)~a;9'5˷6Y_bK"d\sn _J9i%%_?/~d^8b~~W>}yB3g}y7z._']hv |.#VOsk44+< d9i_^2My48SLpuw?|Å!|y0ߗ/_eV w[1.~p1cNLKͬA"ʘzc e -D; ߉tA)xk@T`{L;ؕ b{pNY*1_Ͼ/tc|GCm wx+_mngej5}4OJq= r8P6޷ CZ-00ڃn OI9 [r`ƀݠ{_ГN-XJ&'!>;Ag'-xۣ1Kd g5uǣ(۪(={.kAޒ8s> -YW@֋|FǙw,,so"=x/<8an/s2z^>x *WX ^~MXIv [koij"Hl(,)!38 3-86Bwі*ÁbL- 3\346ZZd`Y ~A.NlI9|͜iJ؜,=yjZr/ӁmRD*> ̞ݞNU@gk,QL)d"[:S*T'1~t4b@4[&Kj)d3UOa!?C*Wҏ b֯M%}NbVuEIźv[[j+,ؘJ9q-~.+H1841pjKNw6)"Y4j ,OmrXJDq؏QqZ=q'Dcloo}+K |<}B=Wҋo}nHSEKV_|ej k=.>F)kEU( 8)t&Apr'9Po;%1oKV!حWk,MA?.\懂A/I 5RC؉"u)"싖5sIlT?+.E-%& {'\@mkUlDtm{%5h :"ϫT6FyiBͯ#t %_ŝmZJ'˻SKid0~ն[B8Uc]uhKZmd6q`S3Ih\OƂHwT07]=S6tg1k٢C~Dw伪lm6 ,>0'@L^h_L;^T;PyؒSyO­2aqe\F՞1l;g9DsRr>(P^'-PMoKإQJ8Y&ʱf,#Ay -B7A!yjVNǴcsY S`i|7j"ŭxJMq6pl%6}7yNA0A i"v.jbڢ3qѹUv(:v ('NQkȇ>Q%N "Di.i \U˜j9 (V.зn}52S!F6Ky'ʻc|:ǭ?z- J~Q!FٲW:W_:޶/c2GVktykڔN6C/Q'LuRBFWh~"6B@2E -i2\cGHBGB#Thq#ϭJl`&Cr\?`ؒݷpEyd~@}5Xe߉/rB<{s>~UkĞ ;*1"b|%U􀟏3ʀ"`9"˨"ˇO :Ȑ#`F.  Os\sZ֯\x n{o FYtTwS,\"ƺ NRh˨cݰ\LW>JUrui%al!T)i)m^? H~)%4:*I+}P208^y^ ~z C)b93TmRTEZ%Ҍ5rW"l47/ɫyٗ_WZV+hmz+@G|Jo6/S5i"[*+Y}ȐOG QG)Mr݉5P]W\y7`5r0bHa*.!o<8~/cڦ'`5XFs,VՈ jD޺3c5jVXoV#JcV#jT/V#5sFjĶajQ2=X؀ DxNZZ*ҷSN*+BэH汙kJ5"JEb?:+",Rrt;F{ $J >Z,("xniln ڣ:Na~J(2C^;%Kc|h`Q Sau?$8S3 -[葴:2hnj&^[anX0WaN7:S`ZYH(`N"Ŧy#!s8čRJmxy@g:'@GzL6FFi:4äcD>l'*[I$Re_ Ax!2} -b?FD+D%?ˆ>p[| :'-~+M=M7mh.a:ɵ}%yI,uspY5z'ǜ~'K4?1Jз4W -4+=Z?R  p3?{2v ~~a'ٗNSkBKѓ\EڿKÎgֆӡ"=i=z49)O~AIcarƼcօi2,FVj":=c -*?wŦn5TvO,ҳäd`ӱUQ7 +x]K# VCdIr`ڽ{@(CRM=a]%E~(pା3g8KWl~I^^c.%h>\L.|3Z).~}^.(8w]7 +q?ݫ`_ށDjY~_ޭaj 5gR~8b:B8kYq87M"i,1嗗~Y)5|y0ߗ/_eR wC8ɬ j?^D q jk% Ncz\qr 1d55 *{\; R{xg=t=:}Mmm7-|񷩝Qs{3xAkZ (nŖry`̾  :h'f\mv~# Ҿ%sZлt﫱 =UTޒ I|q:˂p`ml8Qq}z)|!bܗ*wkTa3$Qy6FZ_Ls߻xKu1dd #M +[ /% +vH\1rI6$+Ps'8G`pޜ Tz+_d*$R +@=|!&hq+5 2H@x$]tN$3ڮs`z*oe^ ࣋"Wcwdw SIJYc7Fba|vhh7 +dO;+ 24~; T yF;}X3}gM"W]QywFiI҈mljx2m, 0ډ_.؞ G1#fK(?C4,Ƞ%F% 25䎘eH+q`L: 6v$D#JbC0Id ;ms96vҌ{a̞Jwa4Nwx~%cNl[`^2268j#$yMTY`D =j283͓%cgjO0YhDh8~i_͡-kJs@Yv9v-9/rŀ8BR*Rׇ8 +Uه`Y͓'ٕgDV@Y rxKκs{(tf]M cR &z^XR~J;^bd̴r%}&\qE &뼊E,k +%^ |+[A +eCnz)ZX]|$ qc%nFlu-U38o[:Aac@K6o @- @q; ~A㮤1^ہlIuK&f-lYYsCӒ%‚ۤmU|b;[FUΎRL> +zJ7PG3nu(C*Ҁ' 1Q?~a&4b%h!ƯݷMbRTe?3k'WC1UU Zŀ+_*H?Ӌ77v:Ia6^g>*5{lmv;1~PYɅ1ꠅ`8%_;ap,obd5HFE=jۃ Ix~&c0eP있Xrʓ- ٭m->ػ?R/%[67Do-m|us{*]ہ=laXl׭P s蚍csÙʝP,jCkD>.Y_n_73 Tpe%_݃Yz&.WƿNAK;ϾhYSS?wv^+rIRRR!Xp!@Olry!؈h\3:"J3:jtD$|=Wlƚ_Ft %_ŝmZJ'˻SKid00'OgJJr-&U >yTSpkLyu\\kӨ3Fmg,gcynBJEbѿ٫dmɓ4j[)Y>kR9ŒzFhD-Ч J<5+cZ1ݙ,(ZS{Y]5bVRug>ȼ2ֳ Zi>h]f>a>6MQr[p7sBw2;yRvզĉ=4 ')@2|}X( % djc"[-'Pe}* 9f|Sֳʻ˙/{N}J0hd n#߀quZKdq4l+D+.oW)#.TtЊuޔN,PGx +0AnM*]`XSM#ϋx}fO #TvƎ9 yG괈E|nUbK q={GbKWwշ5wy?(WgM}' !X99Uq{6W숩#Ї/1T~>KR{++Ƌ,,,>5\dT** #]b|쎄,kN>>GL6SiנNA.Ssҡ˃tx&MCN߀eribY"; YpչDu/d?QǺaC7}2( DJ؂Sڨ;X )^RJZitUVAYcbCFQϑw0 Vm?J(DHǧoz"."3,fig̱T}I^˾T0\_Dh+ȭt4V`1UV` + #roۺ>i|x(Z"(A;~ a X g==c =-M\J s[a?hi XFo,Vh4`5"ð. XF 1 59c5bðG c5(F5a| [u"@yA$YG#ŦY#!3UDzFmn)6IzB[uz#CF Lu#Y#Fȴ~TaR1T"v$He_ Ak3} +b?F ῟O.3<u>n>sYEuKw>6TM#䦃~TOsRܭ-}'; Y6 endstream endobj -1832 0 obj +1903 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1831 0 R +/Contents 1902 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1833 0 obj +1904 0 obj << /Filter /FlateDecode -/Length 4337 +/Length 4333 >> stream x]I+ϯ?60!@bI r{|r;H)V/&=Wl*I#w㧗_ୠ7/>Zk4 AeJӇZh-/?/> RMWǗ ^'@G~_z @@ -26305,186 +27341,191 @@ p e]ſBD?KE \_06M!@\B JPJ(k= ` ;cϢ۫m(x:V?CEQ݊0ט>M i.O) ;pTZȖ^>XY9Ra MFi_Ydx'u+emG 惩3o`z*l8a4u޸Hā^=0DeT&6ҢCa$vU$)#䲱-B.] ]i8^oK_m𱶺\ޅUhj:(ښr17Ŋvzˤ\E4ΊD dׇg[ nJRjAzJs --Of\`ݼz1|_H|=)42 +W`SSdWZ[e! )54K 3~ǟs^#'qnǣxK8kZKn!&er>17Ŋvzˤ\E4ΊD dׇg[ nJRj7c>B~ "4AAE-&nk7_x(D`5ë?6C/M.8> gJ2[ endstream endobj -1834 0 obj +1905 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1833 0 R +/Contents 1904 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1835 0 obj +1906 0 obj << /Filter /FlateDecode -/Length 1443 +/Length 1439 >> stream -xKo6 Պ$R@Cv=H@C2%)JkRz${h gf4c~ dN=5ύwu}Yqȩ2HHb ~ݔ9cY@trX~m9|n>܁5ԛ:χM]xjXՀ8h~\n7PD`qɥHwo-tfʎBS2h~lRr4i>6}-Fqڶr9D7˙{vf)'ySAJ Ep4P6p(0]9igI}j>|_>bCr^ޜ' <|5NO2J - -\ymӗNך7%0Ɛ]$xOGv@H x! -ĺzH~:xgB..BVd6]ML٬=zPte -}ڢoP,PW}b1tMzw2X*LT1 -#S:I2,bWoH Ej~]cؒgꓶ"o?~%k0GEk{kufc&iVz3EZmҷSy}_)Zt$krkWH`]*]yQ# -k_ DaQm'5$ -c6iA a?^l֕VLF 4AzHR$}W# cj$a.I3S/l -=Md+ƻMp Gy_E+/ z4a 41S&l^գ 44a̦ \ -P$ T(&5727ͥ*DaU QFư"ˉu]X7h$:Z$59[$AG楝$אʋH¨I}$7ѫj$a$D׀$پ'!Y:A !ܸFFjYaAXV .&U b/VEtIעX)QYH bdCѺ[yauQgyUo۾ƿo%nAO9&5O@f~I.Dzv.՛ֺ*0JdtZkDInw zP)l^J  ÖE3,}YM0¬i޳A֒;r\)1Xz5_spv;.ޜ脺C -]\~iR꺞nʃ#/*vjgtw |5˼Zm;/<1QTq_Q4@^ׂ9ZV~`*7'=;uA9fUϮOL[}~B݄8r; +xn6z +@8,0| $9؍\?ԋvJ-ڞCZn/a z|'yt)e=5 8 /ݿaqIlw>%LL ~ݔ%I"9P~m9|n>ܡ?̓M{ .<5j04h~\n7p =Rq]<8ҷ^_ g>LZwMG)4?61:"4T #jmuc(As~ +6rv?,#^#%&v .y SOEr<͟WZkxyW{{sNxb)h6zO+;HcpwM_;5o*4K4`U?&I8=U!3-(C)f($'F(C ߺt&"b]WhRf]P|ѧ션,EߠX& b Y=,\@G H:ze)LT1 +#S:I䜒]u Q'DԪMpPwaz>hrO^4ž0-Y>2.J^kK[Vg6lVjbd{Xf^OiR/v۷ĘC5K\&v .Q̯"ٕM=)N6vx ]C0f%f]kehj$Q﯇$l.U! KHw50I]N6ĺQ_>3TVkDvDbфdqއ&FWh¦MXM̔o Whfo;M!Mh>׻Bm.)HLFYPR(}W# +cjDa.Q +4Sw{x} -F)59[$#VsNckHb~E$a_$>OsIU50Lok@V]wlߓ0KW'brc͍matA_@־k5lblb0z] Vb噩\'zH .>q-je +C͍ +Eb6%s5QuxWxk[F]-O5)4פFlZkO _ѥzZWAϑјNkUV2aZ*ͫZ)Krh$Ofq div0+de!:,0osH9WA F~=%˳)݃Z..ܴq:&u*u]OH7ˤʇ#-]\ V1] 8Jy8'(8@K +WqV=յPɇPXnNX{wtt뫞])lCZĽF.vǿRm endstream endobj -1836 0 obj +1907 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1835 0 R +/Contents 1906 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1837 0 obj +1908 0 obj << /Filter /FlateDecode -/Length 2957 +/Length 2954 >> stream -xM+_s*H,Mh&EîK_F|yCvk{F)؜5F9?yCw|R%0LPh |@9t鿧4"(ҚV9}pi9_~>}l>@ ĘgP`?\Z*#\2 G4׿lX{>)fIe0֛C3YxYߌ/klvr1w`ӗ׷볉uv+M|¯A=F'rǭyYLcT5j34!i kwOstމ [ezc؟?z^_=) }T,n *NmIG뭒*ic{f`͉47n|9y嗯ru@h~0a"/i},`kd1|7Kw]5;h욿!xl? ǐBH!y!~ٙ=S -Ӧq|/>rusrݹ[F3ny`4 5|N~xZ:Uౣ!Q;Ft NE@F"$?F\ 8ai^X,ku+@`eu?p<ה58VD3\Q)*?֘ -eA20k>v5LG cY˦j9La<<諦_ ZBo'P Gǁ= niMlu,y1 $-.3d76p'g^Rhy`̲:+UDX^?7.#4K RXe[d`)=Enh~\uDoK''{SצּX-|`9!\@x^a%m•[20+BhwAaJX03Uػ@.%{ƽ=JhQ$kK5٣ bZMO17 -wp -#O_ ݒrPƆma~&JDГhXF|У6ZMR08+c젎c-a$bᓏR0+E;(m`bv#n4U0[^ysdG -hpk1]Uʗ+NMiR5C5.|4F㛢մjM]+h}TLšmE]q: }'G -WȮB2zL"Uˉ`hx3J2礪]EFGW]WP-UVx= V{U.ճύk:_UM+=v -~ |5rmT`e3nSـզjݖ@T3K30ҏט!=`M9:Aet˶xDlר b@*RC!_>X15OldBJaDT`ʤ4μt68xA 簆LudEyF3XE$ilƇ.!/lm EOUu:My7{`a.,Jkj5yos±&usѮpw9!9 JՕIL7|r J*ƔQqBHo QRGSL+}Ki. g*ƜjKYvx畧sqD5é=|"xs!"\7xO 5APpsHPH3`-2(˧>a˴ڻ?Mĭ2v5yI g+ A|9!V[WB&p{&a'a²*>j:& Qxp_L}LI<̷^VʖKjl{TR-.jUvI *A{5Q{-7geWT+Ia]O3Bj0To`\=6E3DJQ L ðz~ݖYNQ xSr(%c=qcpLoCQ=1?Y#pVSw^Y`yLT *I p)y42NuVꧥǦ]]z9*£";{*QilH=ۇE{IvDŽ'^3WzavW8RfVýir][w -q,!SmE+jYoM'Z։2nm=aN`%VlP/hhr D=*bMj#r t#%]U0.%)5Me YFϘ+2WTt! {%ÃC~==U !*l6Z_J_ToUxqYkrϺmCQ!㣪Q(} -*FSwƃɔRň {tk,U`kËy-v╖> 9}G MNZƐTsX7e!_3+УopH'gڼ2njtbYv5zk/b,M됮PCj.;Vڦ%m5<_Ҵhz}PX52az^,r\;jwZU=o9&z֪ٛծ:N ,:pXɱ7jݷ ZW'CBY=Aw|*4 -osj>~G8mJI/|_`jCR 5cG>y*mP[z"*nFWƍP̿eq - +x]}~<"(-@[\Av'ydɖwbofmIH9kB$˧V4#F' EY +C0!eCM_^Oߟ{J)")k3FsӗF;1C {6 ɥ22.pyJs/fu|CP2aPfc984뎗ˈ/ގV&ij',zs&?~:}}>\'o'ɱXc}r+wꜗ;}a4F^6LRk8v:ǬAꝸʰUV^:cӓ GvY vY+p4*9_AOV1汗IhZ ќJs˗w +:o1^~-WGk$^Y .2 M͌6 !̮?7kqpv~ +O93?u}ݕӧ_~x(ķ9pHT;rn, +SEk* 8t=N3sXDe2oU^J  kBCkʚXa}\`^OG`bz?֘ +eA20k>v5LG cY˦j9La<<諦_ ZB_'P Gǁ= niMlu,y1 $-.3d76p'g^Rhy`̲:+UDX^?7.#4K RXe[d`)=Enh~\uDoK''{SצּX-|`9!\@x^a%m•[20+BhwAaJX03Uػ@.%{ƽ=JhQ$kK5٣ bZMO17 -wp +#O_ ݒrPƆma~&JDГhXF|У6ZMR08+c젎c-a$bᓏR0+E;(m`bv#n4U0[^ysdG +hpk1]Uʗ+NMiR5C5.|4F㛢մjM]+h}TLšmE]q: }'G +WȮB2zL"Uˉ`h3J2礪]EFGW]WP-UVx= V{U.ճֿkjuB-[Wz m}@]"+jڨftݦ8:LMػ-cげTgԗfa1=B{r~umخQ} +vT9+SBο|:\b +kz9"fIiylfq<fa .4&6A.;+No*T/ )ℐ g>|["V\ 6 +U9Ֆ+O9jS{]%DV&r!!v/:rC$D njx7l##:g&ZdPnOS}ЗiwS1I[er):/=kV +sxC5Mp (3L.OȽÄeYU|tLz'ᾘ}!Zwyo&ѭ-ܩ|9[\:ժ쒮ATr[\5xbk +p$[oˮVP}Fgܵ7#daTTzm.ՋgYHk?a#pA-A QJc{699ಙ>4z2)c~FK0K)G1 󘊩xwU2 `Sh2epOKMNAr$U@=GEwTףِz>ٷ#?(l GO. g<й4ȯqrro㩇{ )6 +XB?;52VγN4EWexm_{f'ÜлJI٠^ &n +VR]0v@/9;zp *̞훷~<|otDZ5UiEΟ>9&Y/_֕7,% jŶcĪcl* DϩgÛfG=)JT)j;1%٭;B0SiM@Qq52nb?z + endstream endobj -1838 0 obj +1909 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1837 0 R +/Contents 1908 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1839 0 obj +1910 0 obj << /Filter /FlateDecode -/Length 2677 +/Length 2672 >> stream -x]_(8C65yhI }X|CZIIn i'XP!DA+r cʆ! ED,o_:zHSDEZS#1A3~3(}Ù 5;,xr +.εV8>e9ue;֐úڅ`t֜A+gI /oOF7lYӧ_+́E@2; -Ǥ\ڲ3?^ha@:cr2)!59v4+M_`X~aQd}8XFem eX쎳|4.X<[9Q3>-]!>L:rPEtvdy]@ ,g`>MA7 Soud`kSlV; [%(!;5u<*l3cM__.4shRnamWG Tväroڮ^ YHXe],fNA0o_G,Z!4 j򩤧ӵꮇd.mUr.~*_\VrPfCxzQ6Ɣ iUF,=W- -Y*p]^V[xvsT'+.\o֗Wi֡O T-4w@0 :mU} *gB-2t;5 ȫ -Sbcɱݥ -ېyjWp$9ض`.;Dz?7=E=+,Ig.vIĊ5'vd||2 @ݭg35_ߜz&*XL״,Wi= -iU9yܻYzke8b֣jG!uEG*}_nZ蝲{0B>oF\Icbbln|nlʏ.YcM ȒZ%|5! G1ϵ:RŒ=t08,>˟߯ wuFs)S]8xeOϫٲ[&ebv-(_һStRbM$2F3>} r(A.  -cC)/@+}$Е)wj +x]KWb,!@$9$< 6l?"EDNoږXOWUe8k `Aϧ'ig oOH3*x& +@ο|;S"*ҚQ.OAO9]PCmoS8fcXpu_(+@񰆬d.3O'h:zTڀ=?|/_~Ċ%"s`0y e9N#f1)iW~>+Z"\L7Dt{tPoĴ!s^N:2b SzaBd@?G3gy +=E| 5dw\C(̠ v2ʉQno, abБ*.eO(߮d9=i +HYxs&aX1YPfy6*!_MYZ!4\bv@(.@9 g8'/%2%ί'SBMrnN>ns,0@E9cF۹nE@7fRgn 2v~dx-*͛H\HT1oU}o +Xʚh}*o/jCYp]@n*97FK&܃*|*) AYRT3+,yjhev>.rm8D&Br/ABzyuޕ RV.9"Պ}ǔ٦"V;b.^]7̤5b9[48eOt'07I޵k /%CM%Ww"93몢[_rk!cʽkYn ѬuX ZSIHc>$Ujƶ ,0V c-p +2~cgCca:d&NGބB}UV}u*)"ۅFcNM>h!nwT}X+be]V> ɀ"Ԍu)&UX+׆SM>֚c`VPXå\NOK +YΛJVlO2Ƙt!jHE{ӾW!5^ZY^xq«j Bznj$yŅ+ R*-:)?ta +%30H]mp*!ϕ#_L^c4`fa:ySa*WTlt*9TAw2_qymuŪgWHX ͹K{bȏT9!caMc0q*n*(94`CvjtM!W5g<cGq;Bzؑ]kJغcGH&a\uݎ(5En;tx 1pv/#):K; (4&}[:Bt2Y:}L!5;b,w2Cr[)g.]6ҫdd?>XIvw޿ +4|tY2\LMpLAEcl7 mW?Q٩YNGT +U g J~hA*VA*wxA*",+Hr]GV*S̀3hÞU'#޻R. E={U~%`ֽTۀPz@( HF2-αkyOjuOĆ%>KRid !@vƯb͉g;l$_(2>?,CPbw>wc8}-G!UZBZլa96Eb5BkZYn=8(ZQHo-pёJƗ[V1z|/[9W@z`88hr[[+-6?5k7YRU6Z.f?(VQJXZ`ֺ]0R:n\#f羐{Fl7zA>,9f|/ϛٲ[&ebv-(_һStRbM$1F%r\ t }PJ \ȁ0ZOVYSW0߻ś pO endstream endobj -1840 0 obj +1911 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1839 0 R +/Contents 1910 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1841 0 obj +1912 0 obj << /Filter /FlateDecode /Length 3874 >> stream -x]Y#~_?60 1$6 3?9>X~MRqj$XjJ^N!蝹˓/_z~y~*. &0H)Z˯y_Tj2`~~g9Oyz#@#g~>?:;k -e)JJ,-2C ZOOrg )P\>շ"RF\>=kͿ.{çQa2FSi3 (R6%X]VuzP1f|Rh7=H׋zy7~Z\5M )Fk*]Oר+t`:=k3_>IJOW'$bUP6. JD`&ԎDHD~ߏ׈:=Z&`fű o6=>\ve\5%J+Q~)SNܐjkߡ\٘;Y30egsPN'4륅Sƺܱ%SO_t4b2=rct9C;Տs /Ň$ktzUW@8l)OVmg%MxMEEI>vڐVJڋGJwb 0SX(wXI!={mKl q)7^jBa*F隋nVE1~EQE7/f ,?1nGCVK-e98#m"P\HR 9cs{ەȯn~ϱRK7|ۆO97_ ~VkN_~w'Ft;#ҐJw_~k}b`NI׌>v7 ]7 npvAEݳ~-l'Iف̋D{L*sCiɃu &mR(CqPVKݳA;^BH-{M2)p{YFJz 0%&;no%ƍ'fJfAZ,[K-Q-k$pXSf~mnҸ;[f}].+ry4|A'-7'1p˨a9#Ӻ4I )oMF=KMGX--᳆5]' +򣘬AI{Ge5^^oI;ף8?Obu+˸awh&H*4(R#r wSBą8s;iMƉJ鮑H Da6iU$vxNL} wNJ)* -+')dK}*Uȕ&J~ԨڮK4NVj~GqMzPZHu*6xS~ܫDF&*\ H(ljX({=x<~b醡µdyؿ`WX7=4qדmV6WOdiPK Z -Ǣeb`PSx_sN ҠE1QVA Ci/7Cl ^*tm֝ee1,+7lkweZ ~Ɔ-<{7u0mr[rLZTQ`Uhq?AQV$|z`Դ -<;:vF2wsZnmV&te*z{un - b-G EXF_w)q{EW7nT2msen9uoJW{j5cILV\?=0% .+ -"+Yb=is%lRvV1mJ(kҦ #&lVw{젛h&g`sbw6B3*VRU=Fp@J㺦sQZ -0M۶^bɨ1˳Lͧ]P]L$l Vjt 1zs;Qc e+e%i7a0ז|0xvaJ -sS7mi77FO4O5Bt.WЂV>% =v…!*Xј\`(eg3 ?+h0f7(uy'QŌ7GNi&%ػQscAI@9d (+#`}^ǕPxԙ$76~K$ZJS]TdlӬ -tkRn;Cۍ4 -[ <>ՙRvx m% EinSB lR}GWTca;[f {ElEj)˭J0Gj-vd]KŊsOn7Bqxk{u wA -7l5Sx -R˧R~6rB9YR{+mJth̡J|[[ʫk`lO;Gk0|H_B.v[ML6벴H5OMX*Xβcx|S*'ZH4~MGsTH85|kǛ3fmliꢃ4_bl-X|P~NA47gДBޙ3hn -j qIG{d9 HBPp!%2%gM[3n5FGa>o,mP^FYc5ff:0֎\129R2ns*!~AZJ7'3LSez_@ХcJt R -0#^IAM_Gxk^Vn|t` +x]Y~_ 20 1$6 3?9H,O$gd=MŪ%/~~'`B\^~I +G䯿_|ʻK4 Ax2 R +Ck<)]>J VFl!/ןz74󫳃FyKxPqm}n.?H9}PRzgiZ单i9!$ b0":!J˧^Sʈ˧~M+{~˧i T "Hk%TM~iI.+S:}N3~O)Gz>{O>>41>Siuz}+c/ oVJ O*]/m #A62B`'}?Kcљ t˂6ɢ!.8("FhNV̝H,1-W3^ &F&(n`5z9;;G rJO%">2ɺQ8EFuB +V *2eOe d*;48x>|Lur9}^3رs~ķhf|SZ Q +gN|NBffva;3.ߚ^ +(h2gdPܐjkߡ\ј;i#0Eg{PN'$륅Sƺ̱WFL%%E6E*^{Io9w( 2谷szwm礅^Ht$ۙ ȯn^cG1nGCVKC@xwGY|@dGK̈6IOKGSFc,`$ 1ktzڽUvW7ϱRK&W~5ځX4DZ/Ѳׄ5#u9fS `21s&&Xmڹc`$e͒Ej؂fK7[%/8kBO,ŞY8orb\1w7UQJZnOکb9VT=sbi)F9ySiӒ[3P6%iB.j>Bm`mq5 ]X_Ť Oғ.I]8^MެYtr.2EVqCCߡےGʪtH͒cpw|7T5doc2Nv8-Kr>KDH)FtHMZV DaV鷩UvxJL} wNJ.* ++')dS}JUș&$K~TΰK4NV*~GqMzPZHu(6xS~+EF**\ hQXtq'W3Gy +*;e C +k;mCb^Vb tS]Kڌ+WdЩ#K J +Ƣk[ʸEMF}Ij;RJŔ{[ RG%,_/%*!U.Z >;JcXVnU vV1K k[׹:o`[R=!o3kWF->)UjNC vYt'޳[ P@Cmכos+p>冀!fm@WsT0Uny/ toA[uWxB`)<!j9 ^7L[`mvN[޺Z g0XZȒ)\ @nVEo^,1xnj96 ;N+6P5iS +o6JKV*=vCA3 +1;}}sv6|+RdU=Zp@JẦrQJ +0U۶b1˳Lŧ]%QLl Vjd 1zs;P} 9e+e" +,HBe.0(va,8 +ZO1nw]Ϻ+1*o7o)΁m| ?-SI~".~qm9Y +ۄҲxk*-Zb˜rV9UƇB%m:b"F‘W\;䯧4ӓZ^YUEih=Z1(郘irϠ) 3g,TDG∓{d: HjBP0!)2%fM[s3Rь0P76o(7#\1Su  +VME ~g3Ռ\aFVSduX?^U!nx[~G!% bf>xԃßM!͇$l: +f4P磶#trt>yڙVq3=:cx]nt?yO6csB?_:$$sǑ9mzZ`u??|wI2[7)Ϗ;}%@O +%;t(ߗ0֎L1R92nsJ!~AZJ7=Nj'B&.Sc~DV1Mrnz~BaxYe (`r endstream endobj -1842 0 obj +1913 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1841 0 R +/Contents 1912 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1843 0 obj +1914 0 obj << /Filter /FlateDecode -/Length 4551 +/Length 4550 >> stream -x]ێ}0 1$6 ;~r;Ȗҥ{HJ鞖HVn䳠I/93ϯ<$oW,>ׯO>Zs4 AeJZޞtzBTj2`97 g3}~;;4;C?[!LZE/zc}^1W-ozo^ r{kݿ?.%w 鍦Z%!^ㅍDR{ - A)P Aڨ`&[rn] $8GuSv h!WM}ᓦuuVnPlykM rAiQ8hmD>-BFP ޡVp1h(D$_Ԑ2]|3kK ̅O- 0kb5(*&% ?•7+bh1Xl'Wh$/Wģ QW=3|5͐Cko#{ 3B57UIkf%y#&d[Qvp" YM̖趄`Mv`*4GV-I`%MFj oSF6ItdZlcM_۵t}{vJ'7OA6xnbi lRpP;饤$E +x]Ɏ$W8} d cl 0|I$? +3TK3<ڲHF16F0峠I/93ϯ<$oW,ǯO>Zs4 AeJӇZh-ooOxSzBTj2`97 g7z[ם!T}n/H]ܚUj4uA FDGI`/O|_Sʈi&0hzMz%=MK}zmí{9~>{MO@RRzgK^hqP v!QV<$1u}ރb(0ZjB39ʙ!HL}A- cnJ-䪉<#|T~T0$rZB%\DiPd28}g-&Z[cxQOwhU)\ Z4:M_۵wyvJ'7OA6xnbi lRpP;饤$E kSpܶѡ$}A6m/`nfĤg\@='kp`ۦM0 Z 1hۍZūAt8J^İ'BY$PطbK|jh)$.?jqI 8dOTPbȊD(njiF`.!E3#ِ ِԄ8PKGep+C.^8nׄ,&G1FM59aZp#c w/7H C?x%E ZrWmws`UA`ܠA=ܠK 5n%enPw2727 P]Pq.A(s#A Ai)vSP[Jmc"iytlј2<ݟJt`dL˟ԆT1\vlfėdYbi#ZL7f)VMR -W76x;8dKŝTэT "=Ʃ[tH%%'O)9s!*gum\a0}RmEC68mˆqΝ0рQ$)cQq \OQYd Ҝ$e-@N^B: :E>/8G hɞG .ZZ[4*:Rϙ`TqvAEݢ1kOX'T7#jbT4JԸoѨ5l]%uw/MvZ5%=N)[VUZk6U9wJ YgNc{M%T!U4K.ǘ4z3u["ֹEwnɉ<))CҦEUwoW,e]XJ8Db.v0%+>ݒ>,cv#2jZXl`o.v f="eU-q3qT˒T/UK0֦x ,!fwid‚.`8Y)(n;H֞61ԁwRf./4qlmm>3NyR3q^4Ue^90y"xi{~+"8&J\9n-p~޴%_wZXk_*[%"}`p G.>/,wɼ8{%);xkC{W;Nˁ@H4e,w3Y"}YƢzd g&IS3N]!xD_oKX>)|Obλ,G|76%SU3{l V8aqx -4 RtGYLxہJf -D|wEvz;৤e3 -f~'ܱrp'gOL)08*gJbe[00x*Gn:hFY(rDAU,Ȏfo>0-wNK9bqnpmNm7YYlsZe -Aj,B.E|b{B[ϭcU[MʎVх&o/ւ,CvVw)XXbv%]n,v_,JCG6: -BhP6y6^g]a6s[bf`+ffk29xuޢM"36WIP*66Fp!1@ -3{BC%@|Sͧdwj37߽3MvpDG)[$q -6fk/˶*:&s$il: Fl\L(%R7~I]Ppmva KZ[zŴ\6VJ{h+r߶VA+ʽLo)W\;9]Ty +XB)i;DPj<&F";l1kAfMfʪ憏) rZF=k(u bV{y+nr8 dk\v<-4}4=bE F9@Q/f)Mku#Wʿ)馨A_A)JpEAΣcn0E] ܨRԗPu%\Qo)RHz*j W>QQcCQ=Pԋ&Wۖ(i1Zt1 -18ݴǭzCS)GEij.U?- vvdOCDJJ{znb* 6+<c-iVZz+T4MKkL"' rO=irH ,[ďwo nE2NI!e͹hT((dr{t-AF/yfo]ԜQtuOMPdBn"0?6SQѻcuS"d{ DB,3C=τ\#n<(cMOD4ӟIfTʭA.An{MKcÈ#A-ESib)G'%yf 0LRlZX*t (H\Uu/b~eZ}w0Q +W76x;8dKŝTэT "=Ʃ[tH%%'O)9s!*gum\a0}RmEC68mˆqΝ0рQ$)cQq \OQYd Ҝ$e-@N^B: :E>/8G hɞG .ZZ[4*:Rϙ`TqvAEݢ1kOX'T7#jbT4JԸoѨ5l]%uw/MvZ5%=N)[VUZk6U9wJ YgNc{K%Bh\1ig"&DsK2WݒyR^ ^SMr+2NXVdY ݕpz\aJV|IzuKۍ(˨katS+KmZ}/ckd29˵vWނ_X5(oKxN+Bh{՘ጓZ~\Z96KeD?0K &^\uJ(6FqǍϼOmMn6sycx'no n{u w;P0B,ʁK3[5QqSVl?]wQ`D)09;@u-}]vٶ(̳z'"%IHz!P@{cM)ay`7eeTX,{,c<'FGצ S!8Yidp<%O`71[as6wN$ٽ$D5֓ ~ !Ζ]攀):ҖpѬ"ɧA!%!N8En^w}$dM&T/lA+VTǂ6hA~*!IpRղĘSœkh)NTZ-9ƎW”?8A%|j2X1/p(sQ\òRps*JQN8 Lou[_%a|wzXA%B44]"4YA\B.l7L Mv5,+gОʲrNmӁcr$SJMeBSBMV;֟R'vdc-MV'v`a3%vkXVJNeY;d,w_>"EBi˞v$0>; +WH[zD6GEw|dyoB]_z||ia>~>ȧn¢z 1ջd^Xx%| u,aCJN ]!yx8-U"} pdug]2;e,we]Xg'M]&x;=,w<㑾|-Mbqߙ,cF ]2;e,w}|?W;-,nĂ]ϪIƱHK}{Ct%2N]#Xe8~wSXh_KK*ϴ]Rpc+Rx T)?96pmؔLUa/3LXe⤇ǥv)&HM=e1m.y*n[vYڥѭDZ2b*̟p>Nnnm+S`1tqTj+!b +]˶.`aRUtb)<ߓ㍲Vƃ۫ZY6NK^}`ZJa=8Ɲr^`C.ۜBnT5--Y-]6j[b( AM^0;,Xr5;S,Zw.K,0WXX:@m|t:ѠlLe}%l R<4l&6& fWmYd63svME +Dfm>Tl2l܍f33C /b́fm7߇KiA+O%egKfsFf6o{g ȉ^9S$qH"m.5z_$mUt$MH2tz/ظzQJ2$n:' +ء9ilb66'W0mJt53W{-rR"wlsV%Rvx[@?ay(Mf!ˍEKw"y17hqkcp>̔U[ 2Sw8{tPN@Ĭk)]Vp"׸y[TiisŊr7Er聢^4)Sԛ5FW?E]G7E RMQLQwSԕzGu%`LQoQ/)JʹR^T6jmƆMQzMַ-PLc4*b!bpli[ {R]d%`Z06MRӉҕt3t+ŊUl(VD1x4nǶZ$ )@9NAf;GYyI MYVh2 ͛*љ0D\=$:ɹ"-|d掳dl?پicdZ +658%5碅#LRHə +сv<_f31ot]SsFRM,Ds%{2@l% ts6G">grw턬~?x?}!ǘ_uN bYo4+H>yK NGݼxQj<oi3?ͨΕ[)qc]*3n1ߗjdžkG1Z>$ҸŘSNKsQ> endobj -1845 0 obj +1916 0 obj << /Filter /FlateDecode -/Length 3865 +/Length 3866 >> stream x]I, ϯ?Y>H 89 z*>]%.H&;EVS/R'_bG{zbo @@ -26500,91 +27541,93 @@ iQ pS~Κ[8^ArFv|lMxgŸ́_ò2?0X|0`k*~ӆ@xfl5[:%:VAv _] !u|_fI\2cuIMzX qO~37h]-__]K&߇y}{xݠ u_̅1n.:#c,0 `@-mmvtYZtV™>d󲆯6eK(Q1>˲P&K̔ga+t0M(ؙ*ރkX[KEaJ[ 2~?QRO;a=ԫ#́Ҩep!/AIh[GpL6#qX'r4 -`kjϲ5)a=M#_@p1|0 i+d5D=H:M vpoj ? Z*d5+ zRk3ӽo7K33=_N7 3MY\= [K 2ӟnNw4S ̸vk㛯/(G2H2EIb2Y?9i9VF7VL`-)U6a*=C0˼_zkG=ĚM_hJws3| +`kjϲ5)a=M#_@p1|0 i+d5D=H:M vpoj ? Z*d5+ zRk3ӽo7K33=_N7 3MY\= [K 2ӟnNw4S ̸vk㛯/(G2H2EIb2Y?9i9VFY*Sa$d\*ST KlhɷUz`y~P #z,5єRf(0 endstream endobj -1846 0 obj +1917 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1845 0 R +/Contents 1916 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1847 0 obj +1918 0 obj << /Filter /FlateDecode /Length 4518 >> stream -x]ێ$ }HYwU>H 8Ƀ03 TȺtѥ6vOO(R!ER*w~=ӓWobӓ]yp{QX;kU|?RZy=ާ+s^t;H-?{w!DOх[ZuC+;u 5y*f??e8{95Uzvϟ|o~M1N=~46ϟ}I!^(:.h+ᶫ6$PW .Q.j_L/I$I\?O t2_5u^o9:9]>]?טwzog0]~~;_Ol4Ԏ&Lt ug\T~:m  4[F뢣ohe]zE}  -C;~':+~vM0ܕ1IutohWO\y TWPOy~ǾL-A2&Nf,)yxFԤ t(I8p]ԺGU+gp]LVą7FMG4d_%o>tיduM2.1ބz)5+ U_ĺd6h @kKЂmW4V.]pq7 ec7Mvm0ćs9Wߕ\|z͐_ij1284Ӳt'vLYwAiEmzwSՒCjY4rzo傔Ni{C2xd茟33 #;o{lN8_'cxtu[|?qrL!\锊֖ӅAq\9kSSvO̯*7\4fe1_BYC4ZF raC)h©A⎧ibBOq1BR mEB $H #G>qu%a0 -i޺ -܍o_%vs%#?n.i7 k'=Qт+Pd%6!zGh\Q:%cX\9Ox75ٝ˲v}-jk.kh&cKQ@ۮװ*^qLѝMǫ3 78rPbxC x !ж5(V-C Ůlj+ʩ.^îlؕ=rx 5dt2I*=X#0nsg|)h1֐mP:<8v#|b74YkV=2+/PN ÀZI;^Ц%0t~-, C'+G%s܄m>p^y9_]LG6'}4{\ÝJ1* X) Yۮ+F\>I`A,rw˥ !'N@ZVܽϹ!d -H/rMUT부 -amc^;jA{Leж@WJ*h TڤF#JDAZ -xu?Q]h چ֘ΓmfJhoHZ`ǻ2u`-lL vX Sjq/J{Az`ͥP Jf-<MHkf`JXo]e`XKbs++Q+!U]ZB"F k''*麨;5V?b5c$OBHĚ@*ɋRt5Gt$AfpJip}i4ȼDαv@_23a2Ur{ -VhD3jߓ[?s36]olucfj{Eb֮3&kƵ'3ۿr1Awѐ[,vl$=;h3CG#UJ BVn^ٽ^ bXYPuՇ,S4?É%T,Kl>7d>ڭACsMh%zH Ycz{ :aS]X]ڱJVkbd.,VcUq&t;Zi\} B06r(ɡhb}ֶ1qgyV@*igo>\~-0D{ڨ1z$gHƙ{o1F^ZigH?/HZCkwjKoɪeQ 4T) 窸LΊʵ0+Tzu;\8 P^*]XTl. -'881 -~oѫ8t.}O`oJ)@Xc@z9h!F)n" ko';V̾- 3ѡ*L%oʾ&౾ȯc؅{\]tDgtdvs3HlX4.Eh)pƐ9sx$sW1hTC45CoCQC u&rAa1uJ!*Qzw}ԊQahֈjÒy\wly)RKŃM5T$X&0|2Yzg%"qd ZUݬ$PE^KU~\bw֢( ޳td$JF"A2p5k3\Ƅ8ngZwzazo020kդ -NWIs(0X8ua`=hʳkcr"%S'=e=Tv=afp]i,T@\Qަ<:v높@qHߟAJu^Dz>Vn[ $a!m '~~~ 44-֧c;=a۟~cߪI_&'Ij߹6SjjSЅM!_\;03c{R Zt0*PK#N$f~Xx0S<",)Ưy@Z݉sױI +x]Ɏ$ W8]!`0c`5]>0Kf=-cBvfeE"E=R$Я~~aS Ǘ^_?^?8M n^w֪/yK?&;D_6f:+k?^~Y~y'B3g}}~._7Pq^!޽?\RN}0ZYy8hvӋ^sTS) 0:e{/w 1}C#kK^/2+ E>vCG3mF~vۆ#۵b0EKe5=ig=wnQ+Y|}wvh׿O5fi;۷s{}}~m't׿mߗ; Sz0.*jmF8֭QǺh:ڰvY7Q{aQ"yCᢟ&@wE; xK⮂HGEoTFBh֗ %{RQ|쿀|ɋ%6֎ :dɼp;:MqzqxSfttnӡ|:'|uQVèu1[iX7S0$?3e-d~wo3]c^ Sԗs/'hTM4{ Eǃّ$Hn[ihAm +\#.ecwMLvx0ħK9Wߍ\rFMKDM8 4iY1$i SVCPZ%eibѝRРZf M15{ rqPQ;w 8:L#hSN/1<:Zֺ/{|?iB2()DgIq\9ksSvO.&7\4fb8XR4K=#x{u2!P4mԠCq51I!,`״XV!9*!zDT$wj#L86ɒ0THcJyZrwGr /G87!qIDMaq'ޥ|;vhE-x8D†#ZhMk34Ǣd a+I4Ƣ晽sEvÓ5#1>cE#R}8x -W49d ` U8 +hmvP5k8Q(þ y` TH ^qx !Uj+ۤZʢrjװ+[-'veϜ? ^>*x C9ɥq/SfpjG_@g 93tk6(YQ> ^5D{(\'Xa@Q5¤Ã/h{y :twчVn68e|<-#p<&l-CLpJqrDeE)h"2-B,YTzYkU2S XRȚϓ91 ^kl1\KxuĪ^}srAOw**xh4Tb\&3dζlRzu'yj+]- +08iY p?׆) b-qV9Rc ^l^ K6`:C]t 7`-[J m yԠr(OmMJl$1@A =WsՅmh

    UXu$&8^%%$bAvrns1k)OEc%g6V}yXqFɋ,R#P_D]D ]n;IYr1n~Q\_Z- 2o$k=.$,}+B7&MAC\)U3۾XZpip@NU=5Ula=2mnpG/4FF_:*uT: +#YLbA:9M 9~Bxs +o@Yu[cӆ7 +@t 2(N^sq|?rŏ m:Q) +9,ֶ뵉֘n52\λj(h(STCkzPw qhjP:zxƃ w\]CES4Ta5,zP0d ++'ءGs,'q34MG!1>2 K D)tʶ8G7 :ȃ%w;rcWrזO]6kM +7 :Mqku=cb{7d?pEN$K( ھS,u~?X 4o10 )`Q +O!``LG#P&Fw}"D~eZ}8im, TӹbŒɭ1i$V9ϓuߔ][[bq5aN]ܖ_o=Yilx;S3HNMoƨ~լȟ23a2Mrֈ{ VhE3i߳[k36_olu]bfn{4ŬfLXBk/f0bD!`+6X Hzv!n@#Uj C6n^٣^%1,Ьz%_ B*Q%z +9Ml71%;=g-$2N'@>pȖf犜2*ڶxAz:ۃsUEpBcʸԚϻ{$ JZ۴)xO^dΏ +0*|&&Ivde8T 8nͮ/0ݦRwgx@mQmX3y{-/EQ88ZCKM\J%p\;oC'_έxZa|6zZ³M?Ƨ{WQf:9foQƺA'O3ϜƑFM^ px Az0 , Gqnj_Ӊ$bg/xlU@ĚlshќzvCsuɯ7 + +;,0mW44D3'Oc bx%*g¸Z.vT"weZnU\:~ +`ES+0UP"YaExhXyh(顁IKؑbbT[O1·6"V=,1QkʰʋyiʏKB5uZ${" Hy;]13N߃N4L< FTcbuP#iᣲLJ2 +̦N[m>ژHn ϘwvO.EU'@Ylt2]/\h$30 M Tf7#n|Ϧs E8_ 9b/"hp-JІuʰ^A >~'N#KhTOniZCOχ.zZ)N75M>GH$kgջO@N4*R8攡 >CuZ 0 #U\j|Ĺ@:8 _C9Smk6ox@^݉s޷d endstream endobj -1848 0 obj +1919 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1847 0 R +/Contents 1918 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1849 0 obj +1920 0 obj << /Filter /FlateDecode -/Length 4756 +/Length 4755 >> stream -x]Ɏ$W8}:Ax [3:ɀ̥Y̪~\*gXVd1##L,wBޙ緟~ye''9Ʉ C|2LR -ZOh-󯟞y?Kdet'so^$g"ھo?5 [ ϵߛGSYVyce-lj7?>m:hH`O|_Sʈ珟fVĺFhND&Y+m&eD!oԎJkk(Gu/hHp;ldb$UFj[Td-M4]Ft#Bv7—5YaK' FD29ҍ(i'aȼL[u##nd?ļ6?*G3 (=ށQHNłz@z6Bt!tZMQ -龎}UqM_n1Dۘg])3ӭX>7_ƞt[<=k^3e}mA"3o߮UܮB]֚L]EY^J 8jIg.L@nAs0+ r7%~O8Lq!NgUhs{/^ʨLorU ͛@A+%A0_A-tei `M JC`<\$_Ǫ؝ՐKŢ"{+Ca$E)YY KFĐQ 8c-$EX6)[;dHV1Kd*45Q˺-y`%EM$n'D/ӻ)|G&Z(Ng,MV"}L"bAlg|TXIr929#uElYnSMVJrPa;Tc-R]F:7Hҽ>{XRC˞ }-i*kd46$z5Jгl?V#1O ca?X 2U wcv%28^>p5̗<V K^GNd|zzy` dPDK"XV~KP -VTM@; \/@\TF3oj, -t/`tjdծ*J4;( қ˅%pl ωˆG7dcu86C: --CvFAžD3SFZ-8vKYUuy_NV0B5p<O75r|kj01%,bdj:$б^v*iqaZ0D3Ҫ\(%@9U To6NY)֙V `ٷW -}3d kpkT~#(5YeЋ62<Ynwd/ߑA <~Y /nfrԊ | -V}[JoG_s -sR_,;*^Ŝ-8ŋUճԁEagw(i^qY\~!:3QF=8c,krݗa@T]W&!*Uwc1{۽M zL H"_}h6@LAbPS_AV=1([H| 5q+g,NY%05>@7WI=ѹ&ec_޼w#8>"3P Na@Uu8A - w]Z|"бщX|nͅ90'ߝu3:}"!>\p쾜N,UYzfON&Һ*8f)WE5刬r\BSpRw]e"(¨).<b r˧|;Ԫ'#(%xP go1W{]@i. .a@5ve솘Q<20ǹF=qQH>e`s=ee?e?Y]Na0e2vCyeO q.QOeqg\FwtA>4Ȏ L9ť VC'7:vqq0zwnvgq.Vɣg)}:R.iuS6:nUE;D\G9=ҽϥțK@ߓ,fZrQզXQǦXQߘ/dl)˧F\tcwD*Gt2o iBZ %XX rm -h(/k$"בeQ0c.}K5ev%rJd^|{0TM<15ulbq3jHwΜ h?P1s Ӏ ("8PIpcMPYPCe] *k[ y} xCa3 uꥁwitTeYxlѿܾi6id[R+ڦWN[aN `.3Ҿbɗttxz~|{yI"ACxN2/LQVKwk~aPP;Ƙ{úejKŤY[?/s? +x]Ɏ$W8}:Ax zZ:ɀ̥Y̪~\*gXVd1##L,wBޙן~ye''9Ʉ C|2LR +ZOh-󯟟y?Kdet'so^$ZHm_߷N-uZLs#QOJJ, 2M66ALFDG4S0BIo/wRM)eǷ}#1n86Zj%y9JIiDY6Qrrw4#g$ZdQf k+g&$*\@Nj21Aª{%I-v&Mu!>Ds5Dz~~ZzhKNH)WTh&L"d*&W"iM~*z]|mה#r1.HE6v"&­شEvgbcм-ηp|W|"X]&Cgb1Ug, +&h6B^+&g/{[cLS/po6旱1Vee.-lϚO> OvlWoWͪMnk.kMd."LܬT/`׌όer}X5߳Q& Fv7۠}Ufr9OؕbT q'B&øW*~x/eTTk_M Ơz /uBVE&bp_`u\IQIXbc tjȥb{YudĢʬ?y#kbH_L([Mkg"|^,-I`tE$%2eݖ<&][j"#t- +U3Gi+G>v&L\B Znr>*|^,$"6,&+\9(°.#Sn{zy=W)! ^eϊOVrLN(k+oK99MR&#~.=V/cʂnYeW`-}hG XvEp[%\B$4ahgl0_>}uAr5 + GAz'Ypl3 l1 YLpaYJYP P ͘PΟ)p eS,eL[-%AGZ(b 43b G%HtJÑ4}a K.Qƻ +p/p_6D(kȉH:- ȧZL-O|dNL+5lLjo@ˎLK +N>`| t4:lwB\]V/|e9bͺᶔ/VG|3YًC +8}lkㇹ_sٲWeS:FFB[H Kܫg)Qk9Au22XIBQ:37+ IKcOdCG4\adPQD11[\-vX^,j+0hј'{DnugaݶGkl,;wwݸE&Y66%ظVͻuZVb.Z~gi^(&; #Ĭ6=E5C-,-T'K[Xgu;XvKn }VhEb .ANsQdfofgL v],bgC;;c˲<6īy{2uwy4 w]Ԃlb,l+}[N4 iD(8a[$vrnn0C%tۮl*"LlL~91}g_pTUӨK2.VʾDQK0(ᕓ#è:Z4!Dv{B +\7Zx5id*t0=s"PS(G=9 r^.^*ޟZ$)IKYܫ +꺯+< a9]r)XG-=Rfv+ʈsHKh@e|v_bٲsToRm]bra< P65LH^[v`gZgAedW |ZST1=M>=Cw>c@z#a̎M jۑ8..Bb*r{ͣ"mUͼ]ToosȐb?kIDg*ܒ;-ءrE|f™?tUTs5V6fLU$*vdrwE6 `vQN^6PJx@C>x5\$j _uyov|+HDڡ|,ufXK#x(|aieىk+'cI>PcOJ~Gm&M ^r4v5ۏU9w>SDϰV}= °L8] vsJ&tNX Uߝ<؃] 1\,m $%fj)Òrф *ޅ)*z޾&|Yl|T>VU;8BU,?USo.4W %ѱ̛4K6 *1d ,l.JfrὦzI;#[lkCpsb XxMBKCQc%@ hhAu]ޗ;л!~} M\ L I4 .I;t쾗D]i ++`Z?t;)% )8JPFmU<baSV +uXk핂tx_A9Bl鬁.JMVY7G @wdPOmbB닛Y"(_g/£UVR#B{C KFpW@;f1g N"dj2uEsQ,r;@zm+;W\_L0pT~Q}ܱk(ckPUוyJC̞la &kr$Syt|MC4VC Šli1( /_àl-$@aPC}83gc\ 1/o `|xڻz(A'L\0vaSsrYd->]XtP,>BwA:_יp>C.8v_N'w +Ǫ,=Ȋ'xVii]rDV9Y.Sr!Q)8.BQaa]r|19MG@ jw}(Mη ҫA.jbPq4C]a0e2vC (ns\F($20ƹ 22@2, D2Pq!f2\8Ѩ'2 +Ǹ q.A Gidك]&œaMk8[l7D38IVQͳ>):)N"gJW^#Ht +a^QniMϥ|I T}]-(jS(cS(oL]2{M]?J#U :m;"[u#W:74_c-@օ,645BLNȲ(qXH?v}WYX9g%Dm=ARH#^ms!&_:nX +5$;]gJsj9i_jcxCeg81T&lGds ->Pن{0L;4:,`2w<- endstream endobj -1850 0 obj +1921 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1849 0 R +/Contents 1920 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1851 0 obj +1922 0 obj << /Filter /FlateDecode /Length 4028 @@ -26609,21 +27652,21 @@ O p}j@2X(zcT lhW1&y*=]upF'2Q -RjnеZeeۉ;(= zBQoQAI('j蹋cw;|E5<{^SJõٍˮ&7 gY{I4D- -e|$E' Vl[!lpd?_WJ8zR)m}Rn?c֤LQZ_opΏaEZ^U~& Ο͝_mϧ2pEPZ~}va\_?2;!%?՚ۯ>Α +e|$E' Vl[!lpd?_WJ8zR)m}Rn?c֤LQZ_opΏaEZ^UJWħ3!Sr>klAI>Dok۹Fha\_?2;!%?՚ۯ^ endstream endobj -1852 0 obj +1923 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1851 0 R +/Contents 1922 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1853 0 obj +1924 0 obj << /Filter /FlateDecode /Length 3840 @@ -26638,90 +27681,85 @@ x  96Ĭ6]J=9`jc"κoF1˞u ݤی8. =a=×wXzWs1X\Sx\۪]+X81׵j/gt`[WYE %A}%+SRQIf^g>ğLiDI=*|bl#$׮'[YAPY]bOE,&E6]ـrOȦ2[>"Piـu]*HuS)yEݡUs^tE`rϣ^ET-Cd(:^VFލuvܠQhh7Q ˈA+*Xo;Wiamv\i?^7-+؛րfֶ-^E%+}D_6ԡzᖶlqFtNc|opȴ]T-}d%u۟eɀLR텧痿ue7lm_ɜpZUԀt: O3yϽI1{*0^x~$R^ό1\p Cxw -VM +Cv]##Nݬ2l.wihMֹ7Ktl95^'QTN /.$Ɏ~4Ƌ[dV9eeGV2>^VFލuvܠQhh7Q ˈA+*Xo;Wiamv\i?^7-+؛րfֶ-^E%+}D_6ԡzᖶlqFtNc|opȴ]T-}d%u۟eɀLR텧痿ue7lm_ɜpZU$ʔ|: r}(9C@ܛc8 +H+NLNb>w?ndKƓ endstream endobj -1854 0 obj +1925 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1853 0 R +/Contents 1924 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1855 0 obj +1926 0 obj << /Filter /FlateDecode /Length 3944 >> stream -x]Kϯ?` 1$0; E$j'ݙCvdRI?Q_JĘ_~y"8I+6L_^L!9%YacT1]B) 12\~C2"Hb(p*~W%+g{'- >8 s-Ew{\ fRTljc9龔ԢI2'}5mx+HI߲7 Nw7zL^晴4BE6\8I+o{J6_l x$1ض=c:SBN}B}{7-L8BK!ゐ* 9:Cҧh`kSRF1i8x¤O=e[ k{<OX,Mv/wi7˰@;a?Di]Ŷv;άRC?9܀twl7)宍4t;vv!N''}ػezcaIkWY0P;DI9,} #P }IV 5).T֞51̭o& A7Ea#J$&ٿa'(fH}c:}Aog Vd`0q1fIEw do~K-by ĴA' Qeh;NfI-i +x]Kϯ?` 1$0; E$j'ݙC3dRI(/Z%bL/H/ӟL_^L!9%YacT1]B) 12\~C2"Hb(p*_ͫ^މЕZ/ s˂B-\K<^D9O]hwԬ֩F~zQKwF)Lh(DR+{7"x|zԳf]>O/W$-X!rN|/.hR 'e_ME +RFҷM>?g;d#dQ Wr4Nl }ធ"W,`1-^*I} me텎hжu,ީM,v%1κbmȸ J2CF&{N )(xLxڰ70FOxOŴ8x:/K< O>xEO^ k1i8x¤O=Z k{<OX,Mv/]ԒPD,=r*V᪱A|RVNHK>r菊^(0!#G̥ېbI`M{9O0Z25*R=d)Hī>5}zzÈZbڛb@z]1sNpAi.۸ȡ=eHZ32rp(DYL0y^=Pn3w$%箙dQݡ־1rJ'ڸM)3)l7&,e9f. :y&DaBVꉘ bt .w2ٺ$de+0hMhd`tobf1("fpWuk&6v]n_綖۲i]׾~+ݳ/}dW?LCͱ'ڕx*b=ji\t%is^ +k@}(WrU%lRDH[A@)06h EGn*߳['bzn[Y..X>wi7˰@;a?Di]Ŷv;άRC?9܀twl7)宍4t;vv!N''}ػezcaIkWY0P;DI9,} #P }IV 5).T֞51̭o& A7Ea#J$&ٿa'(fH}c:}Aog Vd`0q1fIEw do~K-by ĴA' Qeh;NfI-i TTs+*WvpnC7E9L3tݷLۆVA2SfPxmY., '[mS(<*^QZ^h wjǽ/{W^VAܨ-YB#b:9t)*#|ZyLC# YNTߚuP2@*:'a05== cXkT 3u>9H:Mh!FO/Zo3.Ho!QP}mphuuBW뫿bwz6P5`% ~R>g)#C*#HF̣g& j<IQ*W_D# VR3Ϗ.kȋ0TK#ssi p -di>t[(&֌jd:BUmFF([?i 3b]^m:+rդlj2kT}s4XcPBz_?G 1/65 {@a 0c {@)3Uh?w7>0"}Ut,!| >AXmJ.t3X\8H.6MLCҹjBlSk|=ϼyLg K }?6qgw6(0?;V?4(?N~4P ٦Y}ga2s:k3Lm3O}N&?XglD72e 3\JI=R29q QC{)D>P.nbMN~XAGCg@>FUcaS`*~KVjm UrU AI}TG qA4+`mw"CqF6yT!1Hr̼-y)>S%.?Gp69A|xYlP]vAu(5*a?6QA.bV5-r [o#c aBZHW1[D->:Ђ8 ZP@˦[h;a7Z:+ 0zaX92:+,C8aw mD/BR&>h[k ;Rc-w;5 JyT cJmN쵮@6eQ,]5P?Ȣ*EQ@3˖C%unidڨf[uuIתOTt'q' u>֨_ _f|c~0v,g$%Yn.aUM p ;pW2 mbr+;y^V/[z"+.e|Yq9üU& Ψ3V.$` |R_,=~,^JՋe)(&4ZWH<9<ŠxvqÅ$5D.N:GXvgO3")XC-vr!O@uЕI>ML{; ƓM' |;a̔E\̉|yHvlf*ۅbliTSߌKe[RJrdSVZ]9# t"B~؜4i(M:qvPU]]slX{Yĩ>X-XjYsC;q/t0>O$ۅѶ:ʾa^=H@" h_n -v(W4uMy")sI)2CO.~nTEcXc JML!vEꦪ6aUmzbcZ rcAz'e :@=#9?2d`" Tcibr-2 {d4CF%8;d?2lG>20A41QQ] QO2*@8).Ch#!#8$'C&4Þb-2(; F6MI~ް“=XKygޏg>x}ڧG|/&ӳZ s[٭\Kauy>P` PjR]jS`Ǧ:@N\> pg ;glSmv(F|RWfiǞҪ^R,4(`vP^}$"מeUQ]b! 8XNU>'OdM|o~y6kjT)V1y1Y/gsޗz:SOV3Rו3.?e('uY%T:xN~E'z5-3?PezCW ;[3<~s^dʴ2,9/S~#Dt[(&֌jd:BUmFF([?i 3b]^m:+rդlj2kT}s4XcPBz_?G 1/65 {@a 0c {@)3Uh?w7>0"}Ut,!| >AXmJ.t3X\8H.6MLCҹjBlSk|=ϼyLg K }?6qgw6(0?;V?4(?N~4P ٦Y}ga2s:k3Lm3O}N&?XglD72e 3\JI=R29q QC{)D>P.nbMN~XAGCg@>FUcaS`*~KVjm UrU AI}TG qA4+`mw"CqF6yT!1Hr̼-y)>S%.?Gp69A|xYlP]:=QckT5r mr*]ĬZkZ4ުGVǸ!h8ҵ푮cN7 +Z|I[uɃcq9MrownWtV:a2JFrdu8VXq<.Cd((H^L|Ѿg:vƴ}[vj@6"ڜ!&k]{9$:lʢ@Yj9VEUVff-pK`Q3)+͸꒮UW*[OPNx!q)|Q3 OAF`$|YXHPK8\vஸ evĤ<5Wv4-2dyձ^nDV\`A:ry>M "8c+8Qgڣ/(]H@Yʹh}{Y :4SPMhZ=Ay6 ryA 3~2 IDk8c-]tH1 f*ERZB(뚡+CՓ}nv'뫛Nv@O) #.bͦU #Rb,ʶꉥ$ϧXO³sjGɗ=EJuv)u09 1>iPux";b)&BF'<@ ;4ɏԳS}"љ[ժ7*ɛ8w0(__`}NH0X mu} *-bۃ{zDHA3ЄPh%+μ}ZO N_MÍgNU[[sED.@]&X@);=JuIMbO9q3]'츞#,OqXDWI]{HJ{xJAj?twOJQlS@CyAPG\{UEw鋅$`):iWYs< 7Pp uPR%X>d gs>WNI'2Di?Q*[> endobj -1857 0 obj +1928 0 obj << /Filter /FlateDecode -/Length 4276 +/Length 4275 >> stream -x]Ɏ$Wl}1^Ç֌N2 s)FVfU?.YO1TI_Q_JĘ_~z"8I+6/L? Br:KƨbRR1Ycd/~ɟɈ eᢔ©WK^ͤ֯;anyݙBGZ刕zB+auNeubԛERXlflacu>u8f;(>|:ηf60zʵ86P c"|.rI]ĔPD,=sX!I.ɰyVNHkh'9A4|LhT~$DWA t -0+pRo nCn -99.ALZ߇m2rT0Yd8<9|X2foaNEo`m  =f=fs 'ڒQGƆS)Ah0.ьQ&\ j0MɹM(-0ҸᄦM -)f|+,.` YlJ+HOEzvmżfhXExN T+ -5kVI=A:BtE.#[CO|ޣCOQSVma((CG]ɓ=JwI"51#JA}f2L&Y\*=*Z*cJ6RۦeK|כ|_ajicMy(޴UAC6ohG=ЎJ+{(A.Qh +x]Ɏ$Wl}1^Ç֌N2 s)FVfU?.YO1TI_Q_JĘ_~z"8I+6Loz1AtdQt * +6Gcp_?AE)SGP/_*!/? I_wNG3<e+ԅV*xG`0Ũ7ӋZ2ydJӏ/_}ݟo/J൶?&͚g~˧lur9zKL7̑Н_I*Ҿo ~e6I&dx+-iP{ka|BK,qסto'BGgt V9 H1κ{TIC Ú@#33Xq:値 җIJ#^5kMHZ-a)[9,`mLw|o65P=p܆86q·S:WZE:o3 yvls>P^Cma3|=Z{ұ_PQ>Qy.`bJA("Tb$d,|7^Jx76A uuX9‰$qǑ!z"l}JlK4#k &edz/L`SrngEwZUPipB&f3DZp0ͬI 6%G"x=b^k4"P fV@O*-ӗE3kQzFpalR6|_t6EXv}iS™ϖ2w֦n}zsd'R z[zM5kVI=A:BtE.#[CO|ޣCOQSVma((CG]ɓ=JwI"51#JA}f2L&Y\*=*Z*cJ6RۦeK|כ|_ajicMy(޴UAC6ohG=ЎJ+{(A.Qh ><G=&;S8Koe[76 uMF=\T}3 CO$tIIv܎n:-O""+0 Y ^F\00SaO**؍{b֚LQ {e4a"5F= HsfvC+^ڧ[%A٥Dr>74XkPT=2>o5p7X)l@ >TL퇉BnkaKai;]vV2&!.H\O/BX0b1^6&0{ ay/."Sy߻ -m^7;_Vqyc>~Ԇԥ|ۙ&tߵ{dgXUJ(>W4 C7EOX*H'+:{כY/׺e;~Yu^tnFtݴ\@ahP@vuؾ5;ۄ^#Op/ڳ܏ݝx爬dV`)}tT}-N3B./vY)wi{ZϠ@od[[rgm3f -6}ܸp;ly0!wq|O!DۍteGAmߧGa;`0pqZ Br0(ӪL_1H;ZI3VA _}3X5--CgEߋO= `XvpܯN~2 ٳ2[)_k;acƎc0Fnr+Jo6M{>O֦ZAtZ]yƛoRH350Ȗz?Gؔ@I^%p徱WDu d:K}oFxv 0>;Cvreӱ׹*=ۡ5F~-{xk / cN0,?Xc.H *U;e(=|aTZUQV^*[l~58 p)5 >pN,2 0`°S\=N}L8?&|tp-)+ɖ}^X+!D93S5Wοsl4Wʫt;ʢTfPئ{A;ݯUMi@zefZvxo-OEvἎn~8 Fҥn) 6E{]Va$Zp`-(+V0CoFM\༇5r5`#fVC -ShjZl0-:LʩNAZT68\ڪP %y*@gax -;ͨE=4&օdyبNoGYl^Aexu}\3ׇNMDZ|fuݵ7ͲȃbMǨ2ON41өpfQ%G-WV^ѕ?r-ޙ\,8}UOgs_5ٓws}zV#lp?]2Z.YIuA]8wyA36>2%Yuhfι9/ IJDQ0}~=/GLM1f޾z~a>5w哩g ky}F@fq]z +m^7;_Vqyc>_?jCRcLYzZԈ=3,*%\Td+"U. +GMoZXͬ—k2N?:/LzZiy_nZbu ave0XOON( C:lߚmky/'s::1IocZĦz/psa)FBY+l㴒ãvB }YGHg,g+$ob [{"k`l o_Ve|# +bwTv^$2}N9۶Beܵg1'AnZ(%SnOؒJKv<ꩥw7 IרQ_6o?IBR(rt"8fAT}%x ! kC*c%J?ڭ3iW9+MjQ^YivNEzJSsDVwcwSS:*R'e!hu;լv; +L=gP rFk쉷-u3}oپÂFn\8E6_ې8'Fɿ DvR0PN0 os͸F-!@ GxiUjPn-vFL FK⡳"`Yň0m ,;f8WDV'?ކY/Az5y01cy1y7FKU{hXkBdz<7l)ji$\zDdK#lJW $l/urv+ysb27[ +EkVlH!F2LDX\EgrW#HO=K<еkwUwl~}1z'da1wBa*P}20*ZKj/xm@C?ؚ{ډz`biVh0aة|>&lvJW"hetl Sb:8ɖQQ|ߕd>/,Fzoahb+H߹[6+Uu:vNepMb(lӽWۃvզ4HsqY ^z-;<BQޖF "p^G7Tca?[f#R7Y.EZZ+QDZ-8vW]OŊs+Ew7CLy~#F.pL ^TC3+ڡcw)Vk5- +NEwJ' r*{OF.mU<wSI,M^S:` pz  +5Q)v)_ԛ {XovRrTkJ^SͦUi1(cZ ʂr0(*'ewPaP_t:n*x L讗Tݺdp&8z!4{,:󁵐(m>Tup:&+eu Prw@z5]ׅ;8p-3x^ +@k-&в4FzL҆kxlogY.g{; <%383<3[k4gdTdeoq=eobZ76=eo7 Ϩ=,xYx90<{<{Axptqҡ 'feoqW8eobZ76=eo7Ϡ=,xYx90<{<{AxpvQhRڲu6;8QOL\YY)k%dUs~ZfvRJD]2ibm wO-gz;VPmvY3z̑l.9D:#aS:~VKt9J/0Vwzܓ +:"jb-lbtGs^JA~x`w[%F^>.poVX>ڛfȃbMǨ2ON41өpf8/J.. Z\* *'^+Z3s=)^XLq>s_ׯ;ٓw?s}zV#lp?]2Z.YIuA]8wyA36>2%Yuhfι9/ IJDQ?OZ%%rRLH& RPz3xfo|=?0ÚTzy ߄># V; endstream endobj -1858 0 obj +1929 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1857 0 R +/Contents 1928 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1859 0 obj +1930 0 obj << /Filter /FlateDecode -/Length 4407 +/Length 4408 >> stream x]Yo,9~ϯw[BH<.xL /q\>U|^!nt>v׉~&`!zg^$٫aٕ7ƃÐt 8_Tknqu .tx3GUP{O@;~>Qt?/Oj#]=n1xm6g'J%1# 'I[*a2TNkLZ^~ /Go)i6rP9UM(t܄žZS< :AJڢBW`9g& ]>sœggs|Z] YJq9PLFDze[:js^|9/Fw!<Q<0#`kʳ@`O9 ?a3dZ̽rQ2 }f3\RsSHpgdA([z}L=rP9wyi;ŌyFɦs )V:wז#+}u'4M^ Ypù 5N < YL汲 ]%O,TEݶ75 sw6&ݻZ ۅ+e]Ky t JoE#-iZ'j)VKIp$o=0\Sݤ-T9]ȋRTG^D99g5]rSPMSGfv2t2@֓uTGH]4eaEC>{MQikbJ)k`F-b4L a &ʡ f|z~SS 3dIT#YXIyF]F& .tA%ZƸ @HO ҭE籺gi)3 HvL |VJU -ӣgo_[!?Ʈ +sW6MP7̈́7\ e G:0k <4#}o#dFg2XkcH6~p0SP+͔fIYFՖ%z* <sL+i{3?(Eou(_8_J`H|&-G&ϩ.a].=u<֑dOXڌA bz('O]6UGq6/֫8Q9"Lk"0"Xu7_s+=Gөڥ=JP]fH?Yvjgf~U[yX4.)aO@qI:$49 { 'ʶD *J2YbrFv= E ?^sJiUihi*/jKɒOݯkLz"b:twv xkmO1L$>Ƹ @HO -Hȧ7]SH)f~AT=ͭ:8G!$|xC ͮh endstream endobj -1860 0 obj +1931 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1859 0 R +/Contents 1930 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1861 0 obj +1932 0 obj << /Filter /FlateDecode -/Length 4474 +/Length 4473 >> stream x]KoW0 1$ +RMrkHcWCVFtWU.6i/9=cpo??y3zd71R1g!r~._͋O}z._vIBCBGSy+g1xDuY|Jf~җLjp*C8$vϟ~~1N=~׷ק?Rg,+xCD/gC @@ -26769,48 +27806,49 @@ R" %Y1\w;H܋O\u M,abRY;emtlY&uu -()&OÈZ USo܈/s!{69NO}k;P>Zѱe g( okUH1W?@!Wlћ5@lo]eع:5g}s9Ĩ3́%7H,5"lĵV=As>YrYs>z>|@携} Ƕ/6o!DZ;L9ZkKU%oS6Ո;PqEn9J!i|mmb [r-;a ǼsUm} -P.CeS[Qu}]?*Eզ)2rG]?UT &/f yF09Lt2V~?嫼U Y_>蕟ƿ厦^_&`KkrCV"KX^>UN4$  ޚ4r7SKuA`9ЌD"bnL맹YI\sbʯ7)uJb +P.CeS[Qu}]?*Eզ)2rG]?UT &/f yF09Lt2V~?嫼U Y_>蕟ƿ厦^_&`KkrCV"KX^>UN4$  ޚ4DX!u}I"Ғ YJD"bnL맹ٖؐ~K'rbvε)ޤ׵'Nb endstream endobj -1862 0 obj +1933 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1861 0 R +/Contents 1932 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1863 0 obj +1934 0 obj << /Filter /FlateDecode -/Length 3447 +/Length 3446 >> stream -x]n#}W aaI@k)[f%&)2FeEV*֍Ք:JU"=>vv"8Iʟ6F1(/#?>dD2pTJkT;1%^hiw9'Gt] -ש"y=_lv -Ѱ:X8t1=8V&Os(DR+{^k+__D5y}_36HCk &kd(Z94 -iF,]u2jShoI[Υ9KӤ2'?Ptr7R|x96Kk(X;DK{L!1!`>G c>ѕ@SZ* ,H{Z؏ti6&& CzMl2ɋ>= R{:yczT'ThERR1=ʡi$ B.Nt%zJWE B~&AqV0G#KnjxAӹӍP5H(n( ~wK -.r.ek\~/'t 7Q+p>p#g|Z)BT&KNt6ňa^DGӣtB^k3Ͷ R@߆f?Po& dC;%j廵u'e}; "YKȹ<8NSP"`SF|ROs6S)+/.I~Z+""Tʓ'imC{D€.!u+5:#>$-CLI=AGvFZ;5@G-ScşkT"n,t<a,{V2L)D#_BL`tbƪ&g%J >Y ȸ,o|J~Xזŀ bUs%YkvSsY9bVbny7>iX]Y +lk"&v nBp %`web,QZX8d6D_?QY n8A:Ge+Vo0H#-9-H0l w!LP9t2U*1hDadѐr0N] %SGΑ|9yDaI!d!n!^*IT4H$/cGᕑC|༣VFeibc{b ؼ_<2E$Ө,HtW`1^xl豓-`Ò;Y 85awks~x~߫8ELzaiWNIso.1;JiU]-b.+\.t@ͻiL|Vsy*~JM9m=Jx+1+0Tq3&c!/wv.Ctyng;(,_fy^,d< n w:Fg|i^7U0Ȥ1ԢWσǩjNլ\g:fb翕do˶ԔuWy.cnf0m kщPW]iAS3uF2#;,xܷpC։&5rhlrT̯[̃l$W4ևs@'شlOƋڵ5gHQ3;$wY0[{xF7(]utG`Cf4Pڭ)i0[aY=mB5lj! u=7`j!)hA, +.FGV`]R`ݪ^ |UdOndz̹.kl C%cm8;C*۾4h U ij֩A|7Њ"$sHCgCGm 3sHnXr΋rF~zϺ"}֝ZST//5HpBWFm*4IԾWpp97O0rrl|>l)%aoHصZNcԀ\f$qvWUWYQj~0J//3" "vW/(t=e+rUM'ZtwMͿcE95f@r ݖg^Qkw7 T۠bp58 0ݗWݪZ{6zTm*8E9LҌS|lt"]9ZaEZp^F)|vR4 ]âK7'zŹcaQӾ)w|xf&(>['%&ג~ }U9Vl[b( C<28(.>G$0F=J߹"1seٴI#Рأ9PsnfD}W9w7sthƩVJ֜IӶ\X[Ult𵑲a6[lG,/б)V3d$ rSV˔mgۥ@qk[8팍ezVQ=Ÿ>ڣ/EˬDFvZO[dYi߻$Ia[uOx[':;.f c#[l֑f(-h(%g4DgM34,-|?r;Qu{z}BkI #Ұۋ=jnnN6sE/nۊD9oXс%O$0:s=u_pP-8(9 8vggWaՏ0o/SۣZli8Mݍe:>׫ޣzqmv?t +x]n#}W aaI@k)[f%&)2F|iUuc5h1oONҿrv0AtdQt * +6Kcpÿ! 1Z8|tu_zA y?hu0$ $4:R$O7[]hw4֩,#]z1_$(Jv/_<*-ח??d{^u̪ %eɚG*VpBGEK貑.KsZ9[֢sgR4 $=6 T(^ +F0vE咆SHts .~XOt%TF) >-<#]GF%^fLbO0oO:hectAE+'%uɀ,uUFhT̡trhe5 F;bS(`EŻeFr_IPLсȒG|5tnjAt#0y{:u 9ʇim9ʂ+l)㒼¸ܮ tvR.^:X֛TIf`(Cr8S3fqA^P>!*y슥p':bDs0/V gQ^^x!{V{V͙f[)YoC`I{(7܉@ݡsnO:S%qq֭Cw\O)U(|0ΩCN#`>)ϧu)הLo.I~Z+""Tʓ'imC{D€.!u+5:#>$-CLI=AGvFZ;5@G-ScşkT"n,t<a,{V2L)D#_BL`tbƪ&g%J >Y ȸ,o|J~Xזŀ bUs%YkvSsY9bVbny7>iX]Y +lk"&v nBp %`web,QZX8d6D_?QY n8A:Ge+Vo0H#-9-H0l w!LP9t2U*1hDadѐr0N] %SGΑ|9yDaI!d!n!^*IT4H$/cGᕑC|༣VFeibc{b ؼ_<2E$Ө,HtW`1^xl豓-`Ò;Y 85awks~x> ^Sby"&=0+$YtK̎RZ}W|y?@D[4 BQ^U2EJ!jRSiδ{[;yO濫Jtz +O*r渙T1] F鐗Qd;;p!:<[^73i/l)%aoHصZNcԀ\f$qvWUWYQj~0J//3" "vW/(t=e+rUM'ZtwMͿcE95f@r ݖg^Qkw7 T۠bp58 0ݗWݪZ{6zTm*8E9LҌS|lt"]9ZaEZp^F)|vR4 ]âK7'zŹcaQӾ)w|xf&(>['%&ג~ }U9Vl[b( C<28(.>G$0F=J߹"1seٴI#Рأ9PsnfD}W9w7sthƩVJ֜IӶ\X[Ult𵑲a6[lG,/б)V3d$ rSV˔mgۥ@qk[8팍ezVQ=Ÿ>ڣ/EˬDFvZO[dYi߻$Ia[uOx[':;.f c#[l֑f(-h(%g4DgM34,-|?r;Qu{z}BkI #Ұۋ=jnnN6sE/nۊD9oXс%O$0:s=u_pP-8(9 8vggWaՏ0o/SۣZli8Mݍe:>׫ޣzqmv?t ;2Eˤc[u =ȤLKä&E"L[+=FlJ :ɇ,lެbnρ2; -6*)Ò*Q n:3'~?tI$zq\>;θ|¶Q)۟ǟg*!uٖlz]S-e59eN*"Bx=tx.GEo( d^_R?>p'0M |O}6sXOB,{b٪ +6*)Ò*Q n:3'$]'ɮ\S.g\>a[ȨO_y3{|lIdL6C~S^|{=߮b)2EIb~AsB m'B.P032o@% %{a"̵ k[O$Ϟ&|i_`/_w endstream endobj -1864 0 obj +1935 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1863 0 R +/Contents 1934 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1865 0 obj +1936 0 obj << /Filter /FlateDecode -/Length 2983 +/Length 2984 >> stream x]ێ}WeN Cd'yH\ ;nH&)3nHV.k ?ɑJ)owZEq_F71S.%Jy))"m,_Vyg_>Ϯ|>f1=1Sɗ;h_iGRzw_cW?Wvv=qeA6)ᘌrie}<^zwYYov!*c$]{sI-/c;jUڡCluCJ*igC¦_/Y_gf^+C1y*j}9$΁#zq|_Xcg{]>%mmb;r:lCvYkoewUw>*ZkuS[qooS,I6@Nl9gê;ڈ_Gu+y:҄`֦n8nD}bn|Z,gʠI'xʍճ:-p@In²p8n<4& ) g~GS+/,b8ߧrfOK1-Lkvk"مy=3\*y @@ -26821,24 +27859,24 @@ P Kp]{NT8O E 2SFe|9UwrThX6uMIX#81G%>T0߸/ =;+/X}s̥vg& ̤s5'PL.wK58q!!Y06_5OQЪg(%bH&thGFnmEɳV'RptvV) /%V;y#krkP,K%vC8[uNx9.s3{c8Fru&`cY'[6LtTIkVs()e}Amقr̪gƔh m]kz5c(.[ dw7m[]nj1?&b 3k%:drz#dwXi'\sc}M=:&19Pj^%͒npܳ䈔kfžU1PUqf'-oVѶVŅ?j[A@lk"v&r8;Ұ߃㞅2Mo3쎁" `vFkps2%3pӒYd8g {dH!p9h[6`ݞ=ӛj"ԢrMކrG&9+{T9HVjxUpN;'@էs3|OT 3?VJ ,K{*֦x 55!$+ #y;-y+YJj*=OHu?2&숏Gc3 q~{|mtc*5\.\-_2h}( (П9 z Rd,-d6DjON4н=OHu?2&숏Gc3 q~{|mtc*5\.\-_2h}()n@1D `8ӻ-t,xak|y5,<]d=7 endstream endobj -1866 0 obj +1937 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1865 0 R +/Contents 1936 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1867 0 obj +1938 0 obj << /Filter /FlateDecode -/Length 3667 +/Length 3668 >> stream xˎ>_gIb  6 _ EKVIdt%ŪE FwrI @@ -26854,90 +27892,88 @@ y` S9&lJF0vRIt >!FgO鳸kI륌g#c>3q ֕ 2 1mKG;`*cpf S!8/$S; 2Ȅ]P̈́߹*YLꄜ1ni1vMh(-rr4Y+Sa&ط6?`e%=C : mxbwTE0 f=BO&] fЈim`Uf! .|~`eQYw#g4~J {_o_]4ZeUj6*?et&ӗ9PXă<`̰̌=q'q2NJhBy ["X4vFf<_0I嗢pQƃUZ`#U6Ga7) +CЯ:z+:v-]h+" uZh h6F|Del>=CWح; Ggv#Ե<"Y΄w`%b]61T8cC.!63Iw.Tj4\^EW;FIrLɤz]z`3*5ӊ ,%Qʡ@7Q-ШKZkpHcG.dFЌpF1* ga$61|t3!%f8ިHNRҊ96O^ cyԅ_.\V4Rf쏏^c7KεQ╝)<`x"fX#y$4w6GYM0i3H-qy}fBI<0U0dyA֖wnhʼn k*&°Iz{pI;vvM0LTBaf|NyY6\Ob 6JN*J/ 8L9si@Y )gz w+9xR<3-TV9YbۈH9,GG%IprCYÖ.mvTCy&V`WvMjM&X uD“lZ;CBƒ8IWrr+]RV[ŪbQqΙ)$2Yʚ3e!u5A_%ٖrP6r=b9zR8k3"kV ;2r?Q5UdZ@~>ԄȪ:@ - MEr%sPԠ .M%$qӦGsj˜u~*l`{FH1O az}~/)HD -3S;9~W29e'(v9@ + MEr%sPԠ .M%$qӦGsj>S-L{/0>8)=A0@%)Ha`'/J&F@T endstream endobj -1868 0 obj +1939 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1867 0 R +/Contents 1938 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1869 0 obj +1940 0 obj << /Filter /FlateDecode -/Length 3995 +/Length 4000 >> stream -x]Io$W.$`!@bI& 0-XKUq%#]ŷm|d~~'`!zg_yiNobI{U=G#L2g/rR>ZXOyJ&J + 6]!o??}E>;+= -[[c=s\rDJijX$7хI):ON^3)i?wY*Rfzo~&Jމ$Ϭ# nMXKmͿ]Hot]\5o\alc86d8u,=tya0Ws=%)+ \w1& >gr \-*\ r` -i -VI oQsv+lXuh^H/u -c@]lJ/[bƥpEM'֏9TLޖVu!8Fi!87x KSن,U ׄ-U>%뷾1’H`ŗ:cxu"PjwUz&%iY5~Q".rĦmXNK/]̅ЃXɮVMў@y,Vjoǯ"$T/]ؙ)UAx͉[o{e /pB2FfFJaj"y)nB8w^B/G.'p˫M \\`P.F0 `=8/Ae3`n`N,)272e }ze6Z0o?ㅦ.~L=}p„]\(G}X^=+Z_˩9,VLX瀱qUM -zAxzgUy#)/OUt,ȓfP$a`srmCZȳm9 V,u mjc=:[)ϒ[uc ׃amvQIQWʳ{޼ezWzzPݽh4ISG)娏Ҕ}t©3] ƙ.TiR;(UgQ:PYu/:T8:%QI:"d"(n\Be6[>VgB4h3~fcֺط!oA9ro"t9߼P^]0uH΄1/Z6)h8Ӂ+j4ypM3(.<]qScJkw`M bT7CxP&qZ4*fX6]Vp}l1~#Ln٤;Ѳ/n3L+/m1ƙ~뗚~PL?o;0zY1ƚ~7ΤzX897!f7ׂY'ѲQywӲHǰefe}&W*M V P/dJ8_{78?I #Ig]m9RGJ.ObzJhTs Rؗ 9)s.~8̽dl̤ 1~бF{(F8*vhEr伔Qc6Z.G}`U^}is:@tvGX)Q)*)oĪs((ׇWxY0* -/ۥ³gؕ&Dc?@CH|;0 e p'},61C v=q3Ǔը3qc+U(j':]Bz`UēdUL.b\9+Ka9jfyg qGi ]ׯo`kԱec</Y(;*ʭ,d?mMl|᫼"wms Chk()v&t|#/7z -ϛ&rsIvm(R0? <;!)AtWv3} ,B9t⡙Qn`s3nߥnd%u7̀wpFkɇ:6ȲI?'RW,Q$m4_[n^F28x5W} ~[v T([/@xj3Dѝ6^ɏ*T6xOA]$I\y߁(`w!'+s|W߁ Z -]߁ PI]ߡߡ𪷰12krWwأV<“E/n @x⻯B@x_5J˨xA]zCyX|rA|a|ޙ" }^nyh'Ygqy|иP|ܞ»ĢġĢ}LWPfwGdqQ|9vՈhZpÃ0r L*8 2+<h'Ӭ$X)dJs=wx\{P:a8 0>E=N( -,gU~~_I)9/8rh64,d fO?NLwW!3 ^}Ō|yr> :Վ&Ô BmtjLoO i"LF -]ND\ bSny6Mz3S'￝n$kMC, +x]Ɏ$ W8s0` 탌>L:ɀȥYYb鋧QSUYA (,w FN!D/O>[A+vo@_|ʻh& 0I)Z~z}ԓ,R緟"'ވBjޞ= [넅YҰ_41N'QdՓc+^MN $ʇTcVj,*UmGjL]s~׮j[ǟzۏ3'חUaJ׻}uǟe3Ȯ{2?Ұ .Iv^k?%~m=N??K&D6{7wkBdNNH2~h;ridU|}`yQzzgP(g]2n wUOR+ՁvMY-3FM*49)8SW董&ڂӵr\- 3ړX 89Z:8a\p1ZG7RLA%`!}C8H}CUJU4C$CӠD6|#7OʮF!xi#.gBHGv"pQkhPw(Z6QzJdp/fR9>@(H" 0cX| 33OqrOF Jq8 2jTr"ҹKR283e,ĸ!Kr5iKh/ރШ^AtJIi-rEe0ba˫+Ԓ4w_XPL$*U1$)_˽:H\d'dRjx.shie  +=*.BX:X<0)yB*УZj*.+:`hnDwYEI5VZp=0`Ȣu5n:(Z+TUX; +8Z<=2{rH#?|_)Og+&lK7a5Ý8v_f]sɅ-pBڭ0SNL_!-W*gņڨõXH@: i.:Ж Η$׸(&+#k}GU]9f9᎜tp>p>j%-ܘl\༒Z W +=Gha&탗܁,MېRY~;h@LK"7_1*NV{}H6Ao-Y6/M bdDX:!@ 0~r +pnrVY|RȀJvzh3F{JOocfiR[==~G&x8HΈT&n_uL,y35800RN6HFnǞpZf%s%rrgh]^mjjg&/e?րzty b.udwskw*h䉸I2.gh)z{#S ҫ QjЂe;?iJLrG;ճѪQ8ZөʢA kńu~? ˙#ӱZ/HOl}sQ&zJߑofh%: ʤ*T-:sr\۬աs-ٶrT1zm],qEmmJ|L'Cg67Y2u2طss,)5zP^b=.@2nQW {ezWzzP۽h,ISG)娏Ҕ=ZzNԹ.L\4@fR~㪳(KJԿ6m: T8:%QM:brl L[ipw7[t~΄`fЛZb4X".2Ѱb^/7/WW$y3a̛rw4 T5\uż[J}[D[diJ.+]y#`_ALta+ɓRe#}ʪO]?0׏J 1N\?8*'K9u~q0ir ^c\?߉03+4,rD]~٥'͵`։tmT~iǰmfe} P*M W P/dj8B٣uPrAnm{hM>tA)/0484`, D3s끂[a~&><0w j/·\, (;aۤj!eX5lגẉw``g)'F`̜‚U.t7`'2'NS$hh_H™0rpE(/1AB&=}5wION:jˑj>R"uyBlШANjɣ{3Hmv9?P^|Ts6OnR?X=k +8DU ц(x)h'?цUyFn=硪#Ogwt>!J y[ WD9D>˺QMtUx](={~]>j (/!mr6ءA(Y_&K!ڣcw.X5#Vܓ:yf0!`0K A{Zt⤔媪Bk7iqY9/EGƐ'-9YӟS.UHLC%pQF>Ѻvx> :ՎHl҇T6np:5&7l0(@t,V!S_Վ1^>IXuv*AVl?} endstream endobj -1870 0 obj +1941 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1869 0 R +/Contents 1940 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1871 0 obj +1942 0 obj << /Filter /FlateDecode -/Length 3455 +/Length 3457 >> stream -x]ێ}W !@&y`,䡻3O`7(&iYXr{tnYXU<*iu;EDD)x{|A$} W4 ~~= Br:cƨb:RRz12z?RJi-J>|:~>|<;PGGr-%"yz6B+`0ŨA2yP2hVw"x<~y?Yp|EmQ9.R:M?JJ/_魠&}9Q˫6%̕-ϑ7zLk&I 70Nwiゐ*əezR[<ۿ#]D0(LD a DMDaF% 8.9(șy| +PZze@Oo[":"c[Kb2fm~ dEJћ0ĻTV\#/s4]g!MWoԐ& Dy5_'"y5k -zHj:zK֫:ZOeiɤ~ySW LV炚c ZTP&Ḅ"ȇ9RF!h/A>=q -xɇ=)d}3 YJ`ba ,/\> oOZ>Oމ*KJ#P+$XIABG(޾zxn$ VJٕBqI7w;xEL6o6HX"hd|kV:iܻI0xqWG-߿ -2%s-d~[m!me{m!XB@;~*zu|wnaj`, S됕h59@Ve`YPY8!u-?3nm1-R7b-R=7X3$ثBkΝ!%WjKgHAΐRZ\9k-1G94(sͶo.j~cx]" ~g50<. -SIF Y3muC5%%Kd8'u;PmF[۪**kI*%bpnn%&/l?Z:v8CosO@0/F ^OJ mC +Ȕ}!҈G Vۗ@@O`#K`[.؞̄Y8:m6 ->B%Aq9D6ؗKd)H]5w`ܚXҽ[U]".՘.Gso+m5quz+d~}_.c -NoQ!ZfBPkq=k9\k|I[S]%F7Rbz fW$aR26@AЮmі% L_G))յa&TG1;0Rqj(x܇Ϩ;ec< }ږ)M$MCZZyCj5#O;>y'ک-Ո+[UVvUEz

    %i@1X d-y3(K=@0/F g,m= %xtd|iP0} 6BuuٳW[7Oxlx"Zizz,unWDNTQ$YKW۵Up fA;v&5:͆UY@Rs\9k)atՑ] T>P߫Mf U oFuquA<6*8m˔JD3icjuשҪWC(V} d+cXUMT/lMp& \McqbO-W܆+}H}<}zg1^(RFfv4OO?s}*9)f?ZȡŪ=a+qNfR _ Q$OT;W8K,G)O[&F%MnOϟzN#ߚiJ CTRٳ +x]ێ}W !@&y`,䡻3O`7(&iYXr{tnYXU<*iu;EDD)x{|A$} W4? L!91YacT1B) 12z?RJi-J>|:~>|<;PϧgGr-%"y=sm(хV*xG:aQ7:3JaedJ//GEZ[y~'||EmQ9.R:M%V (A YՖȉ=5|$qօr'` Iֻ4qAHLв{ -HR_㑮\"k &~0m&0^I̼wGuF(-2'޷-MUMV|%v&:ij펔nLJ3İ/kJ +|:.g]mU~$y>~L"v,p mgN7 _&h`_mOshqZdWx1̊ӞXL֬֯Vw2P,~w{ChVi4zsrFx +Q4ʀkemaI@cG֔:@0/F ^V1X d-y3 4#k-҈G Vۗ@@O`#ϕbvi^C(U'R$`BTF+w^`{2wBE#H(|iP0} 6BH w"+J)ovRRlޠm: +'Dvwjs1u4w aⲯjq[.!Zc?aU+(oeR=K6PFm+^]"D{AjBax|]"Uj[,&gP%kK٥K"Sp$N wRU%UP+l%Uoג* \%UK`KM^~tpNL+>`Z# o_=@@.@ے@P1W)C @0/F g%,]"= %$ptl|o#L+|K(' +%rvl/KlS%S֑WZkeA5GP1{Ƿ<@᫺D@]"1џ]P=Vj +VWj~}V]Zډ+˝޲2C %g;,̞:,Ż{"$J5-mK@RRX9k+Lcv` D#F7)4Q9Q w=xH9-SH\܇1lik٥"SG̟𧝿wC}NS[V:& +j& +ZE=&ylɲK O>Ou +i#L+|K 'bz[j?fqQh7zY+>`Z# o_=@@<6cmY<`{2JB Z +`x + lqymTyEJV=ձemm6ޒN"M~i,<@mcR e/sDzc~[mO,g,cjN|i%gk@-g[j-o(P!Dε?X*)6 +jNQIlίk| sv$Mktй 6$A 0}mrTS4#:8|d W)@<6,&˧xmUpږ)#ѕP"g@ը밯S٥U$S"PZV4oeYJ^j(M0`O ¹Ş,[ e%W|?1bPƥh۟ǟ~8T:sR~LZȡŪ=a+qNfR _ Q$OT;W8K,G)rQL+&F%MnOϟzN#ߚiJ CTRٳ endstream endobj -1872 0 obj +1943 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1871 0 R +/Contents 1942 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1873 0 obj +1944 0 obj << /Filter /FlateDecode -/Length 3261 +/Length 3264 >> stream x]n#7}W~ L!91YacT1B) 12! 1Z8|t @@ -26955,95 +27991,86 @@ R) #NP\N؆hJv9sTY*QᲜ4]΁F%ze >9|!q@dpd .E&هIХ%tƙ*̿#ö/ /V׾("@18Ol7Οd)<-%,2|$K"`5"@1XI><$揗DhHyHi>+a#oWADP+a#oWADPKyI `x -X lq+eP\N̆(eJvLAD#N6(e@Lvpq)e,+eʗ`Wʠ2\Ӛ&ś1lRRXK ͑O/̼Xf2+Ur4alzB3s j;dΞ8c\pM5kzđjg|.wʚ}!\S\~ɨҙ H䲉gjjSϠ8\ ~}O|}i39!Ҕo\ m_qwc{Jb¤'4?}/jh5>Bj5D|08nNiΛc 4ta`|7̿|ԯt{ -sڙ>i׼+3Z'D; +X lq+eP\N̆(eJvLAD#N6(e@Lvpq)e,+eʗ`Wʠ2\Ӛ&ś1lRRXK ͑O/̼Xf2+Ur4alzB3s j;dΞ8c\pM5kzđjg|.wʚ}!\S\~ɨҙ H䲉gjjSϠ8\ ~}O|}i39!Ҕo\ m_qwc{Jb¤'4?}/jh5>Bj5D|08n[ʼn00OsޤCo a~SSD9O]?@O endstream endobj -1874 0 obj +1945 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1873 0 R +/Contents 1944 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1875 0 obj +1946 0 obj << /Filter /FlateDecode -/Length 3492 +/Length 3493 >> stream -x]n$W}}0`жc ` [s=AffM/p Z0^D0d)/Z%bL/)\ѽ(~L!91YacT1B) ip~;C|HF)C GN%]Bϯ?~xTBM0,,l}H޷'DYO]hwt[Sy8t18e8V&O4 "Z=>r/_<*-_$!1N[zt=8_qy_x8LR$9{L$(kAOա'Ykژ,J_y" T E&[Kd%ۓ>E}1uM 8yyV42*H"k &;U8ZdkF*TeZdo,Qx$`C{ږL&yA0]1P'b4*$ZJCIK'׉D@zYND֏%AǏىDoӉt:L3|N͉LsiLsڿ*3qd24J2;K֮L֏v1Y4>N%hzeQJ>S4T0z:؜ -HMN\?x\X q %bBY)ɱ0:?siDMWyU>]ER~CeU4exxo7(2Rw>k]nQ3N1٬U`{NCG|svXL;) qHOφUkh˒b58CEeKy -dcrP/2Y0?:&Q9ɋXk{Ngco_aFo4^(AYkM T 9}AiT}@:0zeT2 -bP9 ]Aj T ]@:@z攐 TZh}Ͼ;T&@Tਲ਼ -7L*i ,+R:ŏYX&Xਲ਼ WrDe(/'\t>fgo_`aFo`,^i9 Dcco_`aFo`,^}2-@y9w<)k-\t ,L|,pـ;o(/#R‘,^{s -K&$ro˩i)6(ƄxЯ^WNJJB;Ca!H@zRp&:bӟ r!9͛ؠpG$NCWE#mG{Ig[ci;k ,(V\ơ\\}Ν_%)^; YQZ}!mO4dMVƹ5QO(WciE$4#1$H!ܦsAXv"Q Zn$I,7WG Hc}:ndv-)t)!QFiAS 95y\Ozgo. Tm^Vd3O!TCQ||JƾD \)D޴'SRxor6 ӋLn^< -<):YއW3!eAWpsT(SvsN:Җ&u{[.^mll۪KC ŹD`ф9FmCGcb-ȸly?:JO9wKۅ˞27 :M#w6"fU0z Bf= -!IAy9SN7=-:v2哧Z楫k+&H H_i -x ZdFPEZ)Q _\ջIq{'aRkrwԹHoCskt|DYm|*'oJ,Q -pDJe6_K'6Z `,BR\V#J #{s ǟ#}U~'q3zՅ#Gb>ai3w0>A岅"p;Wɗ\r/ȎUX؞ J:/6 r\ٽ@0\[bn=3Ȧ5=/edߕ!=dl]nCXh/C=妱`,z.΁7| EhM(n:4D6uSb=bCJd?XKdAYXY\,HZƺ_ mB/^- n Y'0>ژc2޾vMh1IZxB [B syiy0'%] -i<ҡށ NXzMkeG^_peۤo6}6SQ3&I +󬛴Xez6d5p;nT/"aPLc]XM_B>zUV{sK'XpcN`[F{M )FtkQzV,¹ݍ -Ƌ۝ョAhG[[e6s--4 5pWl5DXw}fU1DBXOؒyb|pDbdPdSɣ9۪Mgߦ_"Uob;mAjz2(`֘Az|7РAZPUkX%jY.Ϥd7k7Ú'`PniE=_NzQI17;)7aS`wqxJ+VK \Yy5 XK3"WA> -wI'ϲ2V@YZ -eҋe"DoXyK?`n 6§:vF7.H f>72"&F7oX~3-2/IO+pw5LQK\8=}Z0j9!X,b.- e9߼}6ί/\?[Xza~qV>웽F6"u79uu5_J*`N=煂^ti V?% -y"%8Bzn`5d+ ;D?|'&˘' G/q)a#۟~9nd5qʷiv~ӖNJ?MRSv(l<<}c87[ı;JE=v_?W)`Yb 4Pc02ϟ"͛hfݢ9-@UZ +x]Ɏ#+p_F 0|23ER[LFjwA-*0^D0Q1IW~)&1AEԆ4F8k _q!>$#!RZ ._ן?|QBM;aY_7X\K9G+K$5*yP^g 5#*2j-j7(Tk!=mK&hg CѮ(zߓmHeMF R%X!ؤ%ou:RԚx &zm"AG8#2C pq1J |Fe +S v5Ƨd20E)GM-X]H/aPFQ>%]$|IèjRJ~V:ҧr4ؼ*t"N D@k`s" ,V'`u"ǒljDBcpD:y>'׉D@zYP9_82 pǝ%DkW&lvSR,}OfPD42Ncש`s*} +h lN&'Ry9{;,tP&䝊 @M @r8Kg*5eɎm 1Ee21z9,gq @E-wֱ/0M QgFdvܠ& SʅU޾4*>G T*PVFPi 1Uޮ5*.BG T elsJ*TVNPi-uѾe_Pu *L|*p@ћ +y4B`B),` ,L|,pـ+rY9u X.DV`ѳ/0M QgF[洜Vp"t>ձ/0M QgF>X;5.: >`a8l7 XV)Ȋ#עlxg>ȗ +n\ev*V@rrɖ@GRn>[ܝ7wKwqkvu[uiH87ޑ1pq>8Ǩ`ȴsW >'BG9.vC]ٹkh/{~1B|k,b,l6^W L ~Q+d֓@zk28H>t|iYwԱ)<2/]}<^\1i@AzmzEOPpd=f$j%3"`.]O0GZֈH۫=W sZ ?%@zl[#7#vϪoP99}W"heYRG$W:/À|]jc梷"W`Mޛg^>}Ӭ8b;썋H],..`aH>T_)H+UO *-t۹BO/L: ;^Vaa{j7(hpۀOre^9tVPzsoYoXy X}Wl[Ϫu a9: +Ƃ\:ޜ9њ0Pt0p{Y'4h l *zBņ@GvA!0Ȃ,q'&6$轹Y޵u m:ښ^^2[P2%GA>]O`|%12evݽ}'b%ADzUV{sK'XpcN`[F{M )FtkQzV,¹ݍ +Ƌ۝ョAhG[[e6s--4 5pWl5DXw}fU1DBXOؒyb|pDbdPdoSɣ9۪Mgߦ[jHɪ:؎|~艹 J1XG5f11!6uY"Hj ıY-LfczXs =轇KRoQ7^:U3榲vy5ź6U p7w+Լb|]w#SW\WeARs^(NW\pieSp+0ZQ#jh  F _C0O}^~dSZ}2.!lpb6ӟOm&Nv>[=xIIAj1AMw f/8}c^A, 6%9yy֤ - H|*b(5| as Pu' endstream endobj -1876 0 obj +1947 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1875 0 R +/Contents 1946 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1877 0 obj +1948 0 obj << /Filter /FlateDecode -/Length 4524 +/Length 4522 >> stream -x]n#}W,!@&yH0A{6nH-4Iɞ ;ڲ%YS"[$ED)x{x')_yE'DHNHVULPJjC4F8k __RJi-J>u~/JOyz#BGR;aΧy]BGZak) T:aQ/'53JaeDC Z矟?/?km?'ɚk_u>?P4s*[t_zwk黛h6J?_"o M3w<ϔqi 7޷3|+[uC?Kל׿n*@`|`t7`bifיEYT Vc]M"IljEoǯ-56דxg-9`mC,4وK4k & -KǦP$B\nl6HraA:BJ1?C$'7_߭ 5=yyzQmQ9PzLT2 (y*X\ -}*odxJd HG6;#O0ks7HѦՖAZmIʖ|NIhA:/ݧf -fC{Oe -KdqFU쒸@b5X+8&90oB"0KRDm.PLsǕp/Mϓߓ a"ծFjK؆}4(X 1glu q\~)Ls.f5r# -F2d7j[-@]~Dpٚv@6DWq%yy?)v0Y]An8}ܕ-r9/(EB97irT™X2AA %C|-.\9ڻ)ESO99ڲcJG{XҒ) !USչcnT>0>:sO>ʺ:Vlɺ:9T=I_u)ޟZZ#֪k(8%5.qEtNDÙ ؝3JYFg)cwys H$;x+(ԏ!c(}VZy*QyTB9ӕ[JڷX/JQ$6T1X/uTF=jP#8 [#SR -bI{F\?[8w`HqMm5'%q]sLw={ŠZs 0Fd0^8\ YMط{=ZʥXɷ۔J(S* <1ze&ĠFVf~UL)WVzJeXOHH\yoc395156Y\,x_\jb%S:{&\[LLeVt pr/?c(XS4R}jY!^=IZ* ' ˻hkWY`5p Ho,f ~핢Zx'R/^)b3bfӊw!|OI?$,ݻ٩wؓTRV>ʾ[+]JR$0' =2kypn.N4ل_^|dfqO'~czNʚT70SRX{TqRi=ӈ[iEZNwoJ]Osn{kALi?5lТ$KB`h.n5z. Sq -Ho,f%J~?f{(:;"OY@~ka-Niv@^_۠tXtyv-U1s2TR[8 -$&)CE+V"wBE{X;b-GcXNǮGn9OJ˘8\m]]lFO$Asq,gN(U]n0Nucp((lp uK>P$P>9R{MIYu t %DK>9}0yK*k]uGcݒPwQ݅QwA:Hz _D9Oji9RYumw\4*eݽElcYV cPͶqvg+]}'rM+Vz"8pڸb.i^ښg X})?Dglj`pC+oRY6% ڲtNu/El0{򣰑Gl]S"X]_Ӆ۠aju9]H\ZSz&~Dt/Eb ȶWA:)R/P]vfh[#vk@zFMkifj*bYFagXi<;J16-oqyv, =<=`бezt(1'Z';C1\<,t,|ȱLU H)c/7(b{h(N'hHCU"`Xu:=8: ]Y*x_eUhP*|XYKT?2rGxòέز\ΐ,а,w,!kfYHoT֒,T\`YlcPGeAKς@zMY:,,!dYpy,hQWλ9XUy^84w{egU\_r\s:bywI-&8[s->Qmjs>_g )']:Źx&VXJ&_';ZpVck'οb)Q.7jޞnʟZYn:+ ;]Y:)ΘTXԇ)W7"6f.qD ͆6t6]^lSzr98VANve gje[vvǃ4^R{:OIrw0 Χޅ -Az;;d7JPyުǯoȔٔre -Y_I)T/`eD^= -4*G2 ⇺p#/sՓm\wQ`\L}f:61={љ UQ/%(Ùսub4E}w6~e#|;H"=ʿcc}EJHo7, eEWtab_ߟ}$'ɬ~|x e\DHnQ,xȧsd𚾦+'9oIͥͻQHQ/~1a ->j~sIB(.7[/u,gά p$ߠ'#x4%wa)k|ہu_{֑ +x]Ɏ#W>0|誮Rb2%$)U.T&1X_LuEED)x{x')bC'DHNHVULPJjC4F8k __RJi-J> +u%<#cy0SѼ.L-g-E{{XԅV*xG`0Ũ2ydJOJ൶ߓd͵O:|w +PJ9Yu֭aJLKI諵M_o6Jߒ/I/55gy)@6Mon5f~4W5kV7{B,S8\r%K#4 +e)8_qƑ01dysYrz%nsb>{9n t}ݧlv6W[o/6\DB_A8O``u=TdLSdF,LfRmt 6Q4&{/樵(Pߊޗh#;֬D1%Z,,uĈL -q$ϚP% rũlH | G-*ȹIĒ! ܍d P,{G7$mq)"|ΑvXHA("zʡіElsMV:`OipD rR -uZ9ѱ{QֱֽbN!ȡ-eHK<֊z!V\C)q-+SpR oDfQd28K ˛A"١~[A)~ !DCKV˦Jʙ܂UPG0g׾/=ĂX}U' :EIzy砚6Z$%Vyhز]FȞR"WKjƷ0 MLĹFkhc4lnL>꤬Iuc`1*EO9Gg.F3Vtl1ׯtS:(-JTPy+֏fnm ,B֌X̝05kbjVcjY! 0Yf ZIu q _OK'kEj[kGYMYa='(ӻJ+ձp@b2MQXb]/rhIz'Tɼg-9x40tzZ|i;yĻUņkDro=wbxtR|UfTg)9Fr\P$Pms uKcc 7ڔ\@H[B?cSrFj^{pD9:v- ue[]uӉTj;YKD֜,UJv*ERk\4J6<;8e":v [lgzRеyr.ܴb'"+s j^;+6r業yv! g KCtf}[ v 7/uel] -Kg|T:8Z1j 9 +Y*'? +9zujblgԴf9|뎏R QG~T;T/֋5PӃxàؕUX%[NjA/(ט}7,܊- ɂ@ ˂@zw͂fFeAk-iʂPIuz1 *>n|T$},הĉ@˂"O '˂vsXsG,ٰ,כjɂ@, ڣ@ʂPʂP3( 1( +>* A,> Y=h;{%@mA[.k_6Οv܌ +L?};.ɞmKK?uD+msN'**y{>G?*Oދnr}qB~39^NRRыkV] 6?2.חr˿ϲ]g?٢M9|\Lc/:w p]'8=SXՄɡξυ=\C3UZyɄE DbJaq;pۧgnV +NW%zJn3d&yi)aJUGvA덈ʹـKfs͆)'~׻eް\βզxgjw5"),Ka)2EBh UbX.ݶFi QEw ]gY3v s,UoX,Uw =<#{X*I2 yg,U"O=˓;g'E &v[8zn]~NI=~ߛ=Na2]iŽ:оP2H5LUmSFvɓ ‘r enn:w |[X玫]y#7Sly3iގ:@}3:x6$yFO˪SR :wBgގ{$*tFN4ٍ>Tkq2%y6\gW/tRh5 CeW5zLC.\de:+,'8SفM/~䌔PGx݌s#~Wy(:/&%O޺ltfahU;`m{fť(K :6p&xuo]M~g s:%z_l_[<:CY]3}k#L!xˇPƥK"᏿Ǐ|Z<;E#[9]0?xOJ/.mtL Bt-| S_qgtEV1)<˃z3kC4'(7?M&wa)k|ہu_1. endstream endobj -1878 0 obj +1949 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1877 0 R +/Contents 1948 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1879 0 obj +1950 0 obj << /Filter /FlateDecode /Length 4372 @@ -27063,24 +28090,24 @@ i ri:A9M AޖFwT3lR#;*R/yGz>)8ܙrxYjG.4gNfx-Vi=#Nˑ,drXLMMݢ#HB\6$tMz঎ݵlxIWB)>ɡ[v4yD;=0qyA` Bo݅KmNO 9y~"DjSܣ7B+YK]];]\g|N3_QqJU7b|OoGi:'3 C4%YwP)*O4_7Ryk-F&l.BFZ4/]Ox4RP:V,FFF +9`:Cgbπ{ վ| wDJ.E-hq)U‚;F硻ʔ`nR N0`o >k=mJÀ=U7binA|~-Ĺwڦ,z JYl!>(9Yx!iVx"M.7+809 #D O%h}i槬G?ruP:MJDv $Fcw sS<7Sc=n<0t%Ħ ꑆ5# C0;hl@#nc㱗c'sC4==A`#L&V3NTs٠(i^l~A}rKWr:"y!bn +@Yń#zN02PV W|x r1A?nxe=ҕܷ}=v^bUm endstream endobj -1880 0 obj +1951 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1879 0 R +/Contents 1950 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1881 0 obj +1952 0 obj << /Filter /FlateDecode -/Length 2603 +/Length 2601 >> stream x\Y6~( / C@>@ч]'@tHI&ux3e(׶,so.5?T;:_>>V_>c!#??+IQCP DT?S>31Bt3?}J}zfB1|^U8eɳ4S|X~RSv<9tܓVh}w4(cB`:"uE>xG.ٖ˺w2&cC#8yf [߲V;1,چ`FC ZU mO_~_~ Fyg Wk?oN_?j5SȈ)D {+^boGVT-ȯĪ!}jI*į?cv;cL}};ǞN @@ -27093,93 +28120,111 @@ V 5 $U[Ŗaܳ^9W:#v5O&UT|Bzf0Cv ]FNmDuhCcli$k|LImնT>])Wsg2b!$ c 㜱*og3F+"žS]f9{4% Y޷!(MXcT:KmaTBzrM~̝=T^zUMAIG+avU8-ųpZWVԲ@2ss*ܫa xi D(+B)2*w -Z-sUTFo[QǬ#lZR{K>-R{5e_8lu9IQl+Lk35iY1D&U 4r|˾Y<ȱ擖l@Tmm6򈣠8m9y Ŋ\JP,/KG tfEMec`Zm_:tl"ҶrQA-z4ҝx8dT赡)C!q[iC>eaF]6v[vdHv2PM젾TBcXZ9"!UR^KY[vbcM6bno=v뙷#p]O"_5׫Fq#R #,IT.FWEr|U',Dj?+eVG n.7"(<-G.l{mxyֆܺ=D_cC~ͣc}rsF+*K66Y7.5v-jgK Kҏyi9u^[u^BvØ%bkVWnbG5!B-y YZǖ ԽXP.hq]M[.ZV!g{C*J XU=CHgkS;L֦6_|]?-U5{ss6<8hcH"o9gg{fՙBw3`DžXoo\fkUwbvtt#`HɍNKWu%0>_`ХK!31̈pETTRk_|+;b1?mr +Z-sUTFo[QǬ#lZR{K>-R{5e_8lu9IQl+Lk35iY1D&U 4r|˾Y<ȱ擖l@Tmm6򈣠8m9y Ŋ\JP,/KG tfEMec`Zm_:tl"ҶrQA-z4ҝx8dT赡)C!q[iC>eaF]6v[vdHv2PM젾TBcXZ9"!UR^KY[vbcM6bno=v뙷#p]O"_5׫Fq#R #,IT.FWEr|U',Dj?+eVG n.7"(<-G.l{mxyֆܺ=D_cC~ͣc}rsF+*K66Y7.5v-jgK Kҏyi9u^[u^BvØ%bkVWnbG5!B-y YZǖ ԽXP.hq]M[.ZV!g{C*J XU=CHgkS;L֦6_|]?-U5{ss6<8hcH"o9gg{fՙBw3`DžXoo\fkUwbvtt#`HɍNKWu%cݒ|/Eb{0%Ɛ~f`"u*]wwZ^\YR`ו*&ߦ endstream endobj -1882 0 obj +1953 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1881 0 R +/Contents 1952 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1883 0 obj +1954 0 obj << /Filter /FlateDecode -/Length 3763 +/Length 3764 >> stream -xɊ$_QgC/0 ` $,3d==ӺX"xYˋ%}5ՕK}(qା3g8X}N/O1t4 nNx& -*ŌVۯ~|SλR2#&^!nO_? o?#M̈́dP2WU:+@# sv8gg IǔX^jf_#Ü>[Ga07Jۇ_?OD`fׇק\{b1#4VfٽỄiL[4"0:!e=g.Fq]YwâuLQ60ܩ6̙28Vr8)dVHC - W/<)vl`LJe<&sze<9ӧӖ -^H2D$@۬ 40eߍJŸW|R^Jy Mڰ`򱂧m< ̡w=d -:ԉ6Pq&PVX6 LkB}pf tc."f -5QmC76 Hjq](( ^U1-&RD%9 k9>OB%nW,|l2E,|Cx,Pa:fL.tJEųcJp6 0&q% ^*IMN c+"fA(.<\eXLġ@50$)D; |uL;$F nåf6$}&2LZ2g.6V ="ȡC3ڀt5BR[C, +p0JVP):J P @^S"jjd(^ 4H&ze'w=U*X^Z2 -ғ޸O(pIj̴!x!~#^NuD>V{IZ|j뽴L*Y] $0xiJRK@O)8Ng/,Dk ,0 "TI+Sf>y <oeՉtJy+oe9_xc!g96m %9m`2h^'XC< <HMb8Γw3~>Dp$"Lχ_;6 =^FbDլgM댄UFB -%X1yWE"VM5 `$d!YwvY@'E)Z)+2 Y&N-4dKPukaJb+M) rS, Zp#sj, 'UZ;?c!@ qxA% sHKD$Au/ 4. TsWC豣o99;##|s"roWQL8PŪ}z9-#aգq9vuD.S=*,yVefgm.3Ôd --hm̷RJA,T[$ydVűPP9pVCày,Rq]q +xɎ>_g/ brā;rF_rcm|լqAg|J[8N^ }pVߞ<}};V O1t4 nNx& +.*ŌVۯ~zSbsM)z/O~~ A +o7a4jĩd.ty5 7&# svzϬ)70>٣/+zG>96?CGa07J/O?n"03?p.[[ȷf;'\iL[4"4:!eޘO.F.Իc`a|nj m%w*0GMף:s:B}^Jw>(d SXO}jDjDLJuM~?N40 -\׷-.gR;nL+[-=ʃ~Qzq b~w/pT4|(e +HК ++95сg`Ry*B#<Ʊ{f +'ǐB'>c O +.u0#m̶@$\{^{?c?Ln* ɽ}26+ EF%+>)4VP/cB~v6, |i`Os(k@pD8tUd@i`Js&5G~pf tc."f +%QmC76 Hj㪻P PcZM`[Js*Џ sݧ'.}d +J*"݄ XdY40MYTB隙2mA ++!nBv+zlE,tØ ו$7DzmL$v7A:X\6 FXOw-3b"'XLO$ڱ_Xkc!T4lpXp{D0.5'3gՒ8sET +&_PAܘux/ +fA] јTꥂJ TJ*`TQS#C Y@8w0(;CM)T)łҒQ5FxO-nFLRӕe%M  u{78 Z퍞 +Ք{iT"^ѫƧ @kIFaӢ [<́Sp9E_(a%XArYHa,D(=+'W47kDa1}絶f/<1W')yG| <bvg3dh,c߱h`|i2#bf=k^g$D22U(z Ph"(/Do! !$ ĆϺ"<)Z-JYMpϢ%5qwj9![cΨ\ S[lJI*goЂ3KVe NM8PB dI/АA--=mHs .ICϟ;?H%" ~apYr BeiՄylCQxp N9mD6։+eEXOgLק1xAzzeʁ_bJyZ6*9CCjSq;Hv%k4>KZ/_QAlJd" +W2HD0q59R]HV弞b*h_nUdDNv^>U[¼"=7*6V7#6pWǡpǡr`?YO1,tO,;2ت>`iCoZ[wȉn +^ALD2գr@VS^6PrX[G^êGD7sP;@(\zT4Y40]26b5)fՇ)q [(1ژofՕZYTηP%Iɬs硡pr 警(zày,Rq_q :lgSA" -W *TTp֑ -K%$r -jˤ -isTh"Ƃl2Hd\XS9' 锓 Fݸ`"-"kýeď{r~4[4R|uTZYemD] h!A}J){ F u|Ѓ/p^ Ľ]LDX FD --MIQk5ĠMF>rRSd28z]58y2W)hn ؐ=4&@8&Uj>Zg,eဆy[@gsZ8@֧(͝Mg*A!:8#`tEa?Vka<"v"ZфZV,! Dj*Lceulhڼ$NYxB *ic&uH&D}^%%DH{dN!]ҌU -95JRFRzX(5 ʮIA!/ -T%4<({,iU 1x9B*k+tCZܠ;E kcd={6NiaóR_耮XY0:xZcuM֊8ʁx&mZPऩ0W8.#«K[QHPࠌAa9 qnQP W߅ K -*mT -/(p_1Lu2d3 Vҩlor hzJmBz"?PAIqH'’"O!➍~>~#_(j ~zI\V<6XuZƆjk@}s`(pP&pN6m7f8SE7(iߵj+ly3fPd7%i[!&GvD0ZzJ<8Od$<7Ԉcwk%OU's*p!+xL?mm(pg,3$sK*P"3z -އYTQy$o'˰I&OӴJR5D>^)kAΙnj"3<4jlE56\EWy嵋_Q#q9{ڟ,iʓɤѲBiiJ . -&m9nj"<4C>xԑvM0ua4tY5ZD0mOa!U[hLi-TzzL9:liL=ԳWIvȽ%l4731g E\E!UE-T:B,ﰝ=ߍ_bY&=r':S`=uJׄT8;-k+ jqxy -Ee3`΀DOkOƭSmm^cce*S@ -gi>"*"2rt@ *xF B/ ߍsLw]z2@|u{b/;e +W *TG*H +9MeR~4 +njQtT +cAM^6$C2@.Ԝ{tIa}n0ED6\G=9? mH)V>s>N*O{,iܲ HӶi".j +zHߠ>=#:>A 7P8/Xp^/u&a,^PR#"6ئȵbPĦie#ddm2.h`|^6^AՉ qn *5m`ap@ü-{WQ9-] ]S Φ3KmZ "p@wҰ_VZ JOY-hB`^s|noc5E @hZW&` 1:e64Xm^A,<봹m:$>w~" +W$d@2.:ʀUCiE*㜈_Z) )W=,HtjQeVҠeO` +WPuҽkN4Oj4Li.SGFKzPcIJR ߲NŪ˔QԳݽJDNǭ,aќQ@u9-r* +t$--Zobٜdfy,nzdtȝ뢇N)]#Pz Ewdr +??o׼?x8/}Qٹ X3`?}[|0[z~xx}񷭍w5`l% +] `? GDEDn"d +@ *xF B/ oߌkLw]z<2@|uo{֥b/ endstream endobj -1884 0 obj +1955 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1883 0 R +/Contents 1954 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1885 0 obj +1956 0 obj << /Filter /FlateDecode -/Length 3557 +/Length 3558 >> stream -x]MW CdIr`,Ni)RHJI2 OݶXŕo`gۅ3g8Kh~H.1t4 Nx&^Tw_^~%~λR2#&C\ׯ?_ Ư?N@T?05u`;>|ԜKɚ(љYCNCql/sy!$];e/{z9+/-ͬzϗCю@#J(eɸ4kD4'R`x5Y~ǝ~;\W06^S0N&f24FY$4nxD }$Mij9|nqL(q5=i2O]鹨ak'1`Z 1.9ɬ\̶q/u `KlHzу9?|7U"޶\hϠɮ8;Qz>(0)V) V\ J РOvJ >bJa׊_e'S`PɋxV RVfJFwK&f c.H-ih*張TxkF)E2#6x`7@yRXHg0*)&8M%zZ0=VE$#4/sɕbziÊ/!M"_N>eBQsHm, DR 5!L9đ"wCUFnoG8izm$j$DwQI[I$ \rrnWrEn;9" [16D*7x0FPz97s[])URږh:ePGDoxN撗羑,$ڂ=Ii6<גR[og$ -(oY戚!?Ro:b(JdT.GA`VQU ^aJ*«"(.x;#(UNXrr\gq-mʼn`@B؇%88!Ec*;HRj_G{;$/9ZLCnpQNSa $팊kϨh4=f O@q>Mx}W' Sq%ڍeӶ>EAys=' ?~Ve/hw>pfU(e׽ ypa;mUk<";W|=mvt~m ȦqU ɌFS2p]x/#|tz> 9M -{/(Qo6*]}8aiR<.IuB6IW f-^ X VbF\ d cjǔ0.L;YI~/Mxoӡ(! vKaaˠ)iZ>_^0:=> ;EY>A=VʔM#vDBCa`JGe5 =sm&]tC;E|ז.3M!4T$Z #])%re:8Ne)KhjSȷB{3֋|A5k~x{6W;vPS){ȞҢT0(YWC2^ULuBTԥI) Hq;yMfHrvQ`Pk5ϼbBT82f<oXlVË-\$Gnč N|)*kF5q,kFah.oYyliC -ffVLձ;D1>`"ni!d w6p}bx#Rpƺ)qS1:SJ`R-Dz*AcW[lfTMB6 ̓ٞp>&@6RfNZzA>Z?^ 9t#GeX/rLT^Y&DzL&m5Z5$ML+C!-Qz4,x'NjS+L~|὎WIcc]9{ʞN)捎]~PcU{g˚9NPJ41 ͛9sql9? c<~}/GKQ;K^yBG"str.JN/'  l˩+Gņ4oٓ?ֹ;v`k[)I:'SNimin }Oԗ N!z՗ᔹ/xBr[E+7Bk0AYMJPd[d_]ą1,[Xrx->t9U3z / o&[$R8r[P/h<\8zvXS&QȊd[y®ރzx҄c Id٭DG{,,)J +EiԸzym[خ66xmZ$a]hpׂ浨=ܰtCZPjZVjOxVA= -P1yqE2*itpʜ>DjGRo(7!/ȦDGS,45ÞpH=~`w,⭶*nJק:ݩAG8AP]yd6.RPjL!CJS??~þ4cÞhzb2Yy;_,ߟ6s+c:mw?Wja"6sz{  EdROBSʬWɹp7E 1}?Oʝ +x]MW CdIr`,Ni)RHJI2ݶXŕo`gۅ3g8Kh~H]c.5h>\L.3Z)~K 9ΝwW!dFM|Ư_|w_址Ώ05u`;>|ԜKɚ(љYCNCql/sy!$];e/{z9+/-ͬz//7FPNE qihN k4Nw5-4ޱB񚺆q00k0ʒD$qwc%iBHSs+cBI`\FwPٓ&tZ{ŞZkv +ks]" +鹘+lb+Z0? $ɦo>z?GPe+m JsK.Л37pIaI" + Ao dp-#qhX!y=5 g%!eeƨat{.dRiƽ0F Ԓ#Favq2CXY*ɂžA^YhNs"s 83DWF6fv4*F;l/]RuRZs"n B))]EJKen*֌.zQ]n(a ¤h6*=tWB(GCR[K5fDr_T^-3BPis6ps!u%t* coxbT/qo1oUD2M2\)6HaҤ!Ծ!)S/e >Ʋ@$PRq͔N)2pl>t[jjvQc\FQfKMTD|%)6x%W$_8f+2xs`C{ρcDqiKIy!?ǁEN%Re.J\mSPutIKd.y +zIIBrK-8ڃfs-)vFR@nX2s*#vDvJMr +Ƙ:hѹK^O:r!*Qp3R%ᴈ/*W/uyRqnZ$}P^T<( ^$&ŘiqC򒣑Ŕ=KOytQ?0MΨ~&InM#yn^K؄G5:aHR+n4-38) +ڞ71Qޓ~?k~qgU} ǯh&ZRv+@w6Ӗ̭n\5ʿVaS {ghYYOGn F6m5ĭZO~mMLf0򜒩B{3֋A?>_ϩlBupVKYWEa8UZ kL;T֖ItN:yPMLj5=n!LJ53M kp+U;qa H |hr{+E i(LT["\g ^uNIp"XI) *Rlz#U +cS8*yN虋Fn39BϟϷW,⻶t1~h +"JL) <+yq-KO!_BT۞B-\%F ^ ⭑o]Kc)ڱJCAa̺zڗg{5.M2NYC"k +5FҔZy%<5Ӕ©1ШxxúPe,^tm7&A?^Gu#n /e8v uNVY3*ocY3 +cFsx%gK|VǤm4#6bey yu'ܴiuM &5]C{3֍H14kgj=љRjDe?V ߒd0+j|ahL1ҵޗ*7vrK=-IZp]9x/#Gtz#@he2a8e0oˬqך)&irf:&x8_2 )xǴ!;R! WLIO +_LjK=O΄ ::mURn(#3q[=vCY['¤3JW//>pRL~^҅y)8n^\?[WpP:nzCi }A6%8zmzg,CKcvoUIuSھ>UՁ TNG ^8zA䡃W qW ؞K^# JK> VݨRh'磊ʎŋrvlQ-圦"iMoOlηL?\slTؠz:4/ձR8Q=u\.20'#HVWA;f]l]B^308Z[k9qQ)qo [\Oax*wex+^ n`Iձhu`RJ6/j!k ËdxzY +&ƥQ# z Hl\E(bJߵH +bn;i,wμӫdfLsN8ЁuD.,kѵ9LE-h]Q[-XqbՏ B(͗o}c?Ӭ |m\ Ր:C~|}iFdž=evY0?m斍#V1!"3t>.hی9z@EL\c۾cdUDqBٹa5lӸ62}r.'MQ4CL_C endstream endobj -1886 0 obj +1957 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1885 0 R +/Contents 1956 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1887 0 obj +1958 0 obj << /Filter /FlateDecode -/Length 3511 +/Length 3513 >> stream x]n$W}s0`жcAti s)2+Jd[Pk+ex R,wVSI$^bOd @@ -27192,58 +28237,55 @@ F ɉNHډdm4v@G5P'Pb|q%Q %ݒ8 3܁<-]X^] X_^K^{ɧ=u>-n'zfyY.WTsboF{؞c_BO- T:.4kƃGGvO%PC6MiGת(=^_7Bffp% R$N~#jc 4NQ֝6ND=RS!6P2Kkޒ'+0Х„, (%xO`C u2`YblP%#wj~7̼r<[G@zwWnxvl/ -3߰ Q2m+p\E.9;CO.J=y1 1< K1<>kxwȻN) >// ;59Mn]|FxpR.jiM\x# lXr:l@p`fFp׳.ޫWd巘cLSއ 0zBOp4߼VB*PƦyšIWz'ކW/j3WHhOi&rBϑ> Sk^lQzlYVdc<賹P@zl &rVTΫw$7J">zz>q[:(gc(|q50)Q*i.Л/^+pagWے* Hid02[6@zu@i 3/`_ᴗ|,3 -dfGjgp+ QP2Ɲ!70?FH@+i|^^jAJkSy.{VV*ЃF2(9.]g-gޗȀ|pxDTt;a1݉a:eb+ ݕӳSIVEL^ғ/wMWЗF**P'1z82>[ջWurDAƮm{"۝jX_t u5O2 +MAXGmۓ0\u:^uْ|on~n}O&uuZ]%e:~㮏Tg7m6`8m~{l/L51q^#LKpd CνoT¡ȂeE2yC(O\{i6-mUL:;aqC0*;e'tmr 빧Ff7MOB%=,SWG$ϣem(ls*01ꌬKu2edƶ [iJUw{ ][h@3J( 錉я]PIr"UK(+3/O_4YP*rQКCnuԤ ]j9v(3tX{dQUXcUTJjdU3^UTd**EF/.I)O$ʵUPƁPmWm#qE(AnZQi՚iYI^,q* Y+lCe Ce6|ʡ2T:s $3| +Zzqҁ.w*pKaVZɘdՒ`,xHUKWJ\\"%].1"^Z$ jkR2Hz$h f{u)%-bnJ(Pu<~ =\:,_rjQbQ_] o×(wcC} 0!ʻ&;҆^w.Gf3sgfO.[QW㝧j SitUJ$KVM4ڒڵ_VSsf2jrC>R7K~?UK'h1H5s餣rq-6O(-H *VB%-QqrXNF\%[0GL.\̽TPgXB_F >." y`karcl+\_㨼:7v%\{ JsB/"12O|aR``A.H( -?-MVrs1gBL)_-lps'۟~:g] dx^evAP ,uϯ"wpl</%71@X9wpaZΌQ/sy`gd(ՄA`Joò8N.s)WBd܁[\l?rf +?-MVrs1gBL)_-lps'۟~:g] dx^evAP ,uϯ"wpl</%71@X9wpaZΌ"ATfd(ՄA`Joò8N.s)WBd܁[\l?.Ӯ endstream endobj -1888 0 obj +1959 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1887 0 R +/Contents 1958 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1889 0 obj +1960 0 obj << /Filter /FlateDecode -/Length 2945 +/Length 2944 >> stream -x]n#+M EdNH< Ӟ,U,d"l/҆[,>yQoKTJ9w|UMX0/`ٛ)|6_Vyg_qϡ}VEcG"c/c^Љ<% !z :Z5QSW(Ú<sXS2pŜI+s`JNrLJ_?G2*c>>[LJ?\>3GΒx -PrDѨ@&iBYY==#cK ;d$gŵq"S0Ʈ/-%~|ڴ u9Zd7hi?l'.lUڔ*Ѡ:%kzlI3+zd9֝Gs]^C5嘬KqhʱP$[YƧX.T mDV kqX -+r+p2(Ҹ{Mdcb|Tdy?ծ8 .[%dJ!0 ->5Tt۲> N!; +rENd]ΜRNi1zאjhmGm`a[ =9钅̓"LqYN5956=dTֻ5#5#1>3rEnJJi6SHr쥖g<4s9X'axlFODťRrd`ahU1 y'#)MOeT%YRGuD\`=@˯.ysz:yO]2kDy>o -Bum]ưcH`;چvFf*O fk~ -.p")1R $Dn#҄'~rٛc\bÆlb38X iPm/3!kZ jܲ{Oy"einHH31l6t7S3V2pf-ښ,*TIqqv b|'_P7 -V7n T0z7 GΦZt(5\l r֪^ aWi -];P0/:ZdB%E_Xڅ R'k '>YBX[Jai2Fb +3 I2}ٞ%½ : l"d87 04'BniL.q8`!'I.Qѫ<0R-|8өYwtjб:5 sN\}ʆ-4Oq`i3]"ȇԼufکd/{lG Gl'$llldܜ\ax"77HK*[w.*5f0-Al3kksEmiMo!8yFqfje`l -&ޫVAF33Jfn: ^Q21>o*&'YZ!NX stl%MқTry.'y#3qi*md裔;ڕM|I-ǐT6Έx wiW'?F;^/0=0q)zk@2I͉vJu-߹rWYGOQZv.y ŻNP{1ع_ߐ R~y樞$#Y -*fC |E&oڅ oFpLr}12bO9pfA~!ԓۥpPOʕƇcu&ivZCwoڵJl?cQ2'xwud@spR񛳉w:epCI&^nEn%y*p+EQ;lUΎi$Xm6ԠR -#Ym UOT:db/eZtVγ&}#i K:Æ-uH;f.*|uQ)+A2}LsM~ԿцBקpz.=;a-Ғsb/3Oh)ʜ|x<%N)vek:|}>ԟr'j(-~\x9M?z,g˿3 ҏ-w~>m]F2{EmHsSR .x..Qź*qb -3ߗOϥW4^K0Jl9#'5Y18e2 嵓^$T+ų +x]n#+M EdNH< Ӟ,U,d"l/b-,>yQoITJ9w|Uw3/`ٛ)|6_Vyg_qϡ}VEcG"c/c^Љy ^KB :uʁ_wk짮 Q 5y*ڧdV@9VN4HG6~dT 8}|x9lY˿_(}f%mv8Y刢QL҄={{Gǖ+ZiIvHkDa]=^ 11ZKirnt."N0XO\j);T.A]u*KehAf*WȺs;tK<`ѵ纼j1Y#єcwHOE\>ۈ\ ,r2V&W e~-QqY9P5(=~]q\&%Kdak= ɔC`:(=8(d}jp*e} Cvd 3Vɺ9Ab!ՐڎHۄ-H$˷zs% u'E&'jrkl{Yɨjw%kGjFb<'}fllLK-?7xh"ړsTOٌ:EK tTbJ;NGRʨJ Ļ9ꈸ z ) +_]$$euuJ'$ eLג|ސ$3xԐ}+;~)@2繮< l2:pxEUz!7#lusҏiЋ<~S~"8S.K{b2 +͉J3>y`lyo6<'%L63;qS:w)Y&},ںaǐ.v JTֺ/. OU,\DTS):b(H +HV]F KsO7ǜĀ fp Ҡ^f$C2w,@eҳ3O/"eE$\Yg8.} c3Vm0*YorɧgeZ `5YTH8 )(Oĥo-ߡo&`annM'P j =@Uî36oAv"4a^eu`jDžJ$ 'A>ONn}rﳄ&w%*p:Fe29T!HWg$3[d= K{5,a 5,Q)=u4,A2%ؔE~qn:`iN*Ҙ\l=p.CN7\nWͽ3x`ts[>qS$ѩԠcKuj@z7&:  [h:┙gLEy̴S)+^P5َܵԏNHl;ɸ9:WDn*nT\Tk,+K+aZ|f8oY*n,,뛖0Bp* X2M(Ww[5[⳹3\ g;v[5g̮VM ud<c|H.YUL?O + 4/CJW%0 +yA>Ұ6>& [Lö#wa~0ciHf9Ӯ.t{d=$&lc,v7Cb6"Ck>"HoBKawjapH ~@ +HX^p 踳 +u]T1(zkol{[k=Tl=g۵t +5v.:xkv&V^ :Qڐ C aFGBǖ +C 7qvrRQ_5*HC'hPsΫ |W.wFTC҈HElq0EFc!F,[lvɑ_a=|wje<5l\Jam.ǣc3daB#D L1}#pPOb.nA= Bx*WCjEl?Hj.+]/G;\ߝozȧ͍Izo&b7A>Z'e|w8xUmTmyF|HWgU9;:szc^9PJ)xCd9d>hWM?QuꐉS#j ҕZ9&$,IK:ԭ ;kRE3,|Cl15QF +]IS8`섩;T@2z(s>I8qڧtpt e~Я}?}Rmܚys1_6?뱜._g@L[|rEƻeO;'˧<\X\>\|ź*qb +3e#H9DqdSňJKl9#'5Y18e2 TڟvvkDsJ~?y endstream endobj -1890 0 obj +1961 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1889 0 R +/Contents 1960 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1891 0 obj +1962 0 obj << /Filter /FlateDecode -/Length 3583 +/Length 3584 >> stream x]Ɏ#+00`mh>TUwi S"SU]-`,|\DG#/!DJ7=aO*xTFk鏿};CzZx)}G"MO1}',$jX~^:+eܯ+]hx^KR/](",7ܡ A×- R E0R9~Ïx$%Sÿ~Ϟ=}9KWR mS@-:ǡ) TQL>vq9bi*ZA jl,LULp\t{*죪@R]`/>Et#waOBi)({qThGUFP*򠼱K2>}`I27䪉iH4M+mDg_F$C'nÈ$&qD?H`| J" 30#d7L #ǑIL82ɻ5FG~Iw0j-va[nt uWnͮE(ޙrv< @@1}7䕏JV=(kgQ#"B[cgN:yŊ1|@؏ 2eӶ-Pf;(PuQ5[0K㈛r?(n對q=n/kĎfhڨؓu\LNwRuoќU0V|.8  1zx`ЙѮs81NPT*m{8gB7Ww2;jSC#`m8#&i ĭa)qr6oFَmt .`/v bXQLA;]5>pwADek/܁b뼭T֕U_;y7|rw9;A-Rκ};}UHe/s*[ҷ%> vӋ{='g3~5{myLWIO;#ofkW2m u]=vawɁH~QʻiBMf+ػ~5x@1}uL+۷i%yK̊s]էtKGvd>~N/S"m~8*u *دQx$q-YvSު;MmB[v)2ۯ#|Ud^G1>=(֯Q T! 뢙Oj )%X%uSb(*-3&v^w*~o*&2 a?\( y ryhVmo2w\wX!\~}oY'pT]V> endobj -1893 0 obj +1964 0 obj << /Filter /FlateDecode /Length 3872 @@ -27289,25 +28329,24 @@ Z/%旌E> +kլd{9vl=0|@ l<[ ,[ڛxFw1 g㫁e ٲt^Be_Rz\P=٥tdۥt_z*yEW١<W5SPS_Q z [oj7o=%ԃzf_a zPOl.UiE:31Z\)h6?T,Xf\l0ZLJ; \@A\ŔosfodSzņ`' zjj=xzB9ے[* =վ ]0)2pH$fc(Fz-&s>5~zٱނ?z@Y72Oީ/`4}3 F-ӴIii@2 F4]Lٕi@eNﭢ"i퓟cRӮYxFt^AqU'sd+)lcM[+N@x:VV޲ˠZԬ&F1mIUAzMF'CވW0eP2Jk'Jz \hNk _ljpQh'8i%4LOC.U4TswrB *% 4Ao|/6J4=OV Y 3^ eJbG=@2X  y>wM "8cԗ#9P=4Q4Z}/b}ѡgqW%J)jlݶ۫6GZ`TO:G;t\EGr-'KvJ44m| j00Ӝ3{l&-Wz*RI{[\0OF@iatY$S:6aa,< >=[b5=yxo[~"#h-()]u7f[*A݃kdpՐ `suxZGu7{P1~gtyMWg_PTrDjPB%Lᬄ>8BzXp -\ЃZ%6_CJw. 弄Oz B< T$ endstream endobj -1894 0 obj +1965 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1893 0 R +/Contents 1964 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1895 0 obj +1966 0 obj << /Filter /FlateDecode -/Length 3814 +/Length 3816 >> stream x]Ɏ#W\} d c=3:8fyh2dbɬly;I FN!Dח//bV+v?3}~y~*NL&0I)_j=Y>?/> ?IdetWS헗^$N3ZHmWg'}ɂB[ns-T~s$J=II靥e7V&shaCPEn b2":!JӇ__?SʈӇ/,k>OjrR!/ȥIa松J&&Zֻx"h^7.t|Jku>,>kW5.իQU"]oNE @@ -27320,157 +28359,159 @@ x a؊~gV}Mں,X]vP暹x5>Bu3Aoi"wi@8ez˅/9Au12HOmdV|y!j*rîB ajDج$c `WTgݨSN`zʍܑTlQR,k~8(agp UD)sgþ(Rөqk|&H#J.TQ󥤹 (Q#Di^KLS;G+=|fG,BK_Șaþ%d]*akX02z[ԩFEj{{#vGZ{OS'/F_U*>W9QZV }he|uQd,ŷs di-!OѵG2қA,fdX똹f)gn3Gtn[ڳb #37ckS{%Pv}GX0%~xhK;iЛ"N|U2{{*rGo5q`Tht='A*:9N[-ȢL|m\w,F1 u,ngAH\@zmDzA>FLM>J &4χoѵ 3]9(>;9f{2K39}vTRKoU9eT{ŏ,AwPdgPAzT 5PQZL() 3 -^,eW|=%οLVrq(Wg"dNuX~#ڏ7z ;%<'vVU @Ά 1r0`,6O5؍56vbzmG@tkrܩMtA".s?HFV }(¨Z#睭_-z=!ΧkZPmc~Q-Y8}ϢpTR`Rܱ<[c;'k ̮'еq>C1Ee*Jםsk`SlQ#?HqrZXؠƱgߒGid=%T]o)鿳87D+iTWٲ،T?:ևxNwIi0*3ZNo뿋 tUS)D1ǒ~~)90\mz?x=ow϶3 +^,eW|=%οLVrq(Wg"dNuX~#ڏ7z ;%<'vVU @Ά 1r0`,6O5؍56vbzmG@tkrܩMtA".s?HFV }(¨Z#睭_-z=!ΧkZPmc~Q-Y8}ϢpTR`Rܱ<[c;'k ̮'еq>C1Ee*Jםsk`SlQ#?HqrZXؠƱgߒGid=%T]o)鿳87D+iTWٲ،T?:ևxNwIi0*3o +*{νb.jTA +Qv _J)o$ W^2ݳbG endstream endobj -1896 0 obj +1967 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1895 0 R +/Contents 1966 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1897 0 obj +1968 0 obj << /Filter /FlateDecode /Length 3311 >> stream -x]َ}}=H 8Ƀ%1A3r%k!kS$GDQ/ͻSEV+ k/Μ/}b"GzQ`נ^pu3!TRh˿/.(8w]7~G\A3ajuBWkYnr\:B8khX1b)3̓%;5B_?r~9+_.|GUg?|hM ʩYr.E@Zͼ0A&hKs})"aƐZ!+#C {OVbWL*鳠AV 4Z -?tY_Iˤ@|=RIdᯘo腺Q8i?SJ)}ShvF)3PǸܬ;[Bx -yc@Z$7d[<,g Ώuk;e?z0*)-Oet+c8/>cq(G{.dq.=g&[Qqvwn)񴠘ףr JMFŦ4925(]l,qBH 8;9p h3I!%a@%pLVh oG`&ty&fPPF'!a\oG,խQxn<U@Ŝ#*,y:v/qЖ=ђx qf<@bva@L>J 3HOx{ADH04 E𢡄~&P1`l*fr_@pH)9E\@]sG1?.DSD\Jۂ|Id5Ҹ)9p3s<Ʋ/3 -FZx&v:VnԅE[f0rЄZ7VpTF'nfy'7Y[MTqwݸ 6n9TX -st^-{d-ܤ% n?/ɁO0|gX? &4VRR5.ڟ ^ -!)8)u:QB#d[I] )([(OxMIAzBRkm3CRWIQ 3k'kRtn5$݌RI1h!)(LHzRcwlم|m _BG'f I?ƅBχ Q- --ARФ.-Z2˾&h =!)6H -!NTkMN;腺t;J$} ±j!i0$EIڲII[cI5$-=@7a /KF,Wq\_EᙊyVn:yŢݷwjRc&Ԙ^"I,'k6H R^kԠR -HV;腺z;J} RñjԨ!u0Fڲ[cR@j,FhwLC꥛iF3n_ -}!5hRH ڌ{G4Bj=ֱM5nTST(Q݀howg^V(u@]? ƪbLke -~-=~-ENY7i{hB*ΔyryWƾynDc%J=JÂw7tФ.-Z:1S+nJ3N8m[`N - \XP'JV7[24{<(ޣ p3if#lW#hDB}rF#W>㽱gb[x)q1mFyT=wBM))+rt*G]v/Y U#v5㚏MW9K@˻P^HCJ&$P^EoW@ ! 4j*@I -~ЄUN.!麦5L*yfmcSנpTk> VM[Hb&Tj BP* ^պw ΋u}{g# -ݎ(Tܠ^ӥbLyЄ1fPqJPI[pm+P+[ ݪXtRccRL@Y1?HiT*b[,u%9܁c;vwj'0g#2I@#.GLw|`wI);pOqRk2ч <ņ7TCqsD#C$;7zeNyi5[BKZ4!r`"P܊f -4@<ĸբu!N#^Ky\JO~8Ã76/Z:*9wa5AҒOѭ̥ \5)(gp?[>w ʓW~q)j>0v!<JL!۟ǟ~coL)۔x ͊&,Ace#!) ܴ]NfʐR~yx{(h4hwh\(g"19սw]Fq=Nq39U$ +x]َ}W$L d =OrZZ>EI,VK;9UdrzN^ }pV_|p _ҟ F:{ iW'<KEo*ŌV믟/bsU)z?!ϗ> +Ư? l Sk3 *r_k΂ubϔҙYCJPx/ELi,1wY)5~r;:~C4E;nYPN̢s)j 6A[ќKw 34 +1^bm~bR)OJťR9:JZ&>豗MR&s |Ͽ@/ԍyN!̘RcNcRF3J/8EfMI*E8cU~K4 $eu ,.I )hBOH +{ bfH+ )*$1ESΡzn-$ݎRIAup )*DHZa) Iѱ{A҃Am@Җ/ CX@3 IEТMXaˠK,>.OO%'e$#h Lߛ!l<ߎU!jח}EFxbi^DZԘI} 5&WH I R&԰ 5(fԡR2:A8/9zn-ގRAup 5*DH]a) ѱ{AꃶAm@/ CX@3(ˬ%SzAьWF_H RE+6^3AudzAS|Ք4JTf7 [Fz٭@t3J|jdq_KhϺ :):_KSVMڞ, +3eg^3Aޕ/p*XIyszOҰ ]4 euNT>J[ҌN>i@+B?tC%/ԉ͖L>O86JGB45܌@yjڳەѧ&2p}xo/br\nEpLQgkibG0Dj]dPcJJ2JQs>nK$CՈ]h~Ǹ`U97n{46O[oV/[[Nimj̤]Xq!Q%a ,?]$ q=q50WgAjsTV T׭PRG(BYM=|4ԍnk |)? | +ZJw[O^yy[F>j5x jdn!Q\ j MJg5}8HžYL^=,&{VRZ7zvCŒ :}IyY8:@yr4bY[2nv`~$հm~-[ly?r`hBeB:uߝ\[W,gOy!bhac: Wh! Pnͱ +-P&B4zUh-|S qHjx cJހYX5("7Zjko5՚bUǫ թZBëW.Bb]z_ޙhi# +:7Tj.xTöJ3k5'PLe_X+a իRe`U͑w*u!TN +Z֍ty|f7:p$wvPj;|YY:*&u*u77Z%4{Uv*KQ d/tbSa,4a)TT֪x>@J jE*,+Xf㘺/PF -R +Vl*K]Iwf( وLЈS~@*"_8v1DRt + SdALq!fF!p M\"T-٢{- 41nwm]SHR^fnM͋ +DΫdXct+s)WMnh +ʙ5]A?}G6틛 ibP*aҿk<͔rMYxЬm͂4V1BxMۅnV +;(. $ymMnP \޿RPq=Z<#'νH8)n;m endstream endobj -1898 0 obj +1969 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1897 0 R +/Contents 1968 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1899 0 obj +1970 0 obj << /Filter /FlateDecode -/Length 3648 +/Length 3647 >> stream -x]Ɏ)p_0AgZm&''JdJEjv'-~'/>8o8sӟ?A9悑f{ τR/bF+񷯇swA1ǹ(̈`Oc/= |K3>rk΂)ЙYCJPx/W qz4`\ -}|Ot9+Ǘÿ~$ɪק_>r"a K4 -@0_]dKb(wd ]rŔvb>B"& }Hzj PJtlA(X'AÒ;0'" -K -/:*8[ g$WG Z.vKw.iM 0Z Tt]r+01hI aϓ)6) -g&uh -\҃WzYx[ {>k-a*Cvڤʐ,8nm= =,%Sd'a,TqP VDhIH&d=ȉ+: sv 2[Ԯ™Pf㚺сodgfvwtr2(ɐMDC@VS -zwgi -K\N_ %,yM6SJYl/eKn%DaPAb 1@{1qlag*F0CHRa=kj䶍^j>l[)H1ӥɻu%#W+ b^q ;"@eVkǎu4Ǘ JɖߙOzX_>uPe^2+;XN&Szۖ]*ifˎ22#q\*e<S*]HpX1QTq%%YCcǨ\i΄?9#u3?́JD e 5̪agP- -Q:W(37^ cDAcTbWVn%-7._j>\>2ʅAaBN 0[ tdjc"YZ?8N -s2qPHMKcPbv <у트b ޣexiH+/L{nv§w}' a3Q:tB5%Ƈ -tiz֎h6-J#J0 MtQMҶO8l|43^JPn4s-AxE[Hx%B44 3(1%(|L.ǀx !ʠFVr [5cRY,<oZe~! *.()F -wmBΥS5C)#ەS."h{Md9FX^i*),g{ԭ͑h-Wz/py.>T nOp錡hQ£0(-5t@01N\/NrM\5RR*~9b*N.a]4#V -& -qRKZ8[^b4c.ur(K^j[ؤNiFU6qPk\:k12\R&83[fu7/jPXS?A>us!KC.זι0^{}e); 6@26@ݏ"[i a.sH~rb"Q?C̣W~Qm墼2j}<û-7xylrƖDQ5́r`FBYCF )b;Q'y;Pi?`ޮR{v%ۡ؍kFrgnڭyMv(e֒qB'g QrdУ G*KlhU]ʏ9)Fstw:-v3?C1m34b a ]{ԌʶZ1ȇ2Axn@YYp*$ s)z h$̭DIm~s9 T TK+b];WtسDb1w5^J=\P,QOE -/oٵH;vrr,Jb-;E% 6iI2ҝY_AvnB5Q]Rg23 ÔY;fG`2IQ˃%[#U2k G-^94 sr]U'}z_[Z2(tXNP^' Nq},;^f &9#*=Ex3̑= -p}a/R- RH M0 I-RWN*/+˫M}]Kħ탟R򔘧Apx.[P=jkel:PZ3+HkuXQ~?&)OVu)'5!=uXRc4_jASM*|Jsce)iџ:EmW8JdH*Gd^'8ߟ#E6Mr2r?ӧ s?2EtN¬PL_ +x]nS }>Hp9H5 ɪjV\C,ՒwwZ0ۉ3g8IO~H3c.9h>L.R)fRܝz?ys;BHɌ֛8ǯ~9,?@-_wkڢ`!,X>RI!5tڈ(ōrNbL` yͥ_O?/Og!Rj~~z;Gy}OI!ޢ!dVH"[CS$ +;1-d~OFˠ V3/L0B0Tu(-\ {)ޓ4O Y;_(%[Z|g?aaA~\+*4.̅e\eNGH$p2 +۶RIˤ5[v!!R)(è&R]J J <qT6qPHMK1(1;w~E\ iQ~E\pzE}K7;}' c3QzjJ8=*2`?lZ0F6aJڣJ m,q53^JPn4s-AxE[Hx%B44 3(1%(O.ǀx !ʠFVr [5cRY,<oZe~! *.()F +wmBΥS5C)#ەST&2Ӝ\,hkXD؍쎴XP Q^]#H+]Q7ExZw@tPDVI_wD^}ʁ݁ ~'c`'{9&K~c)vhI M 1ia ְoayu N8R%y -M-Y/1`1Q ʍbpύn%/K~=l['S]et4#q]*8(5DukQ.F;W;V.{f0/ߎjPXSA>us!KC.זι0V{}e); 6@26@ݏ"ki a.sH~rb"Q?ḄW~Qm墼2j}<û-7xylrƖD^5́r`FBYCF )b;Q'py;PiaޮRGv%ۡ؍kFsgn{vP. ʐ% VΐA2XɠGMyUėКsIoF/,]u iCо'3N0 3NڣfP MՊQ~E> kMʂS'aK[@}'anW&:O0Xnm,P%P-^o t_])b:znpx)pAhG=d+t#0N@ڱH[fQkɨ.*a MKUpTDʤup +1*jtCDq Wb_Ɖ ^zCϕCOrDy0uD +W[~T JXدT @:;V3ѯYo Bb* +|Nđt^{+4V"}Ѧ*ot~w#dYn"Dyϻ9DF&cɈ%Iw3~i+pT=O׀rg roz +7 IfÑ"sT4DbUZ- <$ 9]AK\z̊%,+TaW`ahˬK*s2BceS" 0yi-BՇb>P#uEeh ;zM!>StP_ѕ +Ò[=(6x=BOh"=ĊZ&΍Z&*-y&cOa1b9Lc&ig !uߧ%sn-D @t+rzrL>Ype1ߙ5M^09|QK.w-h_u2G(YK4LcJ!6QF߹!E`ޖMjrTg/Vh,t 77f%4_ten +/R$·~JSbŻlA樕q\Bqk! REץwp (bED~W> endobj -1901 0 obj +1972 0 obj << /Filter /FlateDecode -/Length 4115 +/Length 4116 >> stream -x]ɎW} Ax zJd`$+EV˥8:x3]=b,ˋ`dS;sEL -U]L2ċaR(Md_~/yIQO^EJ&+ 6]!/ן_yߗDh&~?ߝ= [ oyk1EGo.GSYʴZ" b2":!J_^_/RM)e}K+{~zDI!@vym}D:_fs2 -ɽʫH KI4USѥ\E&<4PwR!Q>$!!6,fKK -;LLm"椌6FKu -m}x$Xz%mK~e }ɷ@MlG;9-@JE7*0|}sʆ\Ns/JRuZ_ׯp0aXx9a,i"q՗d>56`jHЧxm; ":L -l Wp 6?6[mp !_ުK$^>^/i{j)FR ه:HE2% x8G5h -6חv)Tۚ5rpzsP&VBɁu҃8{hEqG #ϩ9Up.ޮ(f boKb SErx98^a-CmIucX@; @zobXZlj\ubRxöւaK ðUJUnAh~=Kz. JzTojoՓT("iH1@#{֑k QhXLWqJQ|~h+$9~ln$h+UNAz$lU{M&u@);S.iꓽqmȭ#{y(YgTz {k0*UU'>cc>|VJn=!  W=[OU:""uOvZI&-PoX{<V_,mV`-у_d䬯py&X6t)OpL$D)çذYz =XYBK䮷xevEv[dxl$>Dp>ݐӧ9b$6h{ȠN5}0:q+cvւ[Y#W,Nn=SQ *Q=(D.Ya(=E +0 -S4a W ;̾"k6 oH3F0 ]&?mi/;ax,e9zホri8, HGTήNu2U&ec7ptk5tMQ`MY{=/ =6R.H߆㶷zon}H4p^+&ug8g!b%XpRaz[K)wVJB,v)LSΏTUZ+Sv~Xs}Z|89#$n*2ԌStxzʌM # jH+ٵc-zLaG* U}d]nU[)r2h陜(x,͊UkgL j}鐥)=Ыz@Cȇ%=Q31r:G 稬4]k҄=Ge ԩBdsO ^͙{4j`d-gb).iu!vZ(bqv 8Cr4RSH9Z#܈jBEhrRDBՁwM(RXvP#獢JSYfKVހ7YT3RG7 iTy{{_yiKysJyTfJysJyS /7NVހjʛVTʛg+oPZʛS\7.ʛQ.ʛS\7(,oz܈7+oF 0d;ԩn=q+?5`OX[N2};.xw~ Xfۢ2S៻{TdqW}UePQz%slOGomkwh `Q5'Yz`'@S6'dk` cJsTvE& -Y;A 8eEaҡG4 6~+L8޿xX"aT[ӟ3ӟXJ:'z渙:wpH ҇4i܆vI|fFebSjd_|/^`0UiNS(3a0nw)Ŭ4S^w'?K +x]ɎW8:AHI$?ȬΨꙗKu0p+ETdHU"ˋISP~=_6F%(#5F˯??/! 1\Z8|t +u_G%|&B wgG|=`-os-Eq$J;u +muN0Ũ7u]( %Vje/~~~{QZ_5Ϳ/Ե4ؠv3%Cd#MR^n[QNA -,%ѐR+!jZ6HEW$W:J$-h6a1s\"_0ibD1ADXL09R %=c՗ȶ=d5!8 )yC/R!6VȨS]|O(?Zk uTuTI6 \C/2RDAY,k~Yl1,2EJhܢ0z]@a}ЅH8%(Q&7 z_r~6jאj$k8*{w7$!{8'` &\#eCL{DRՓ+1n i $ +@+ְ\ k1Xޢ,V& mw5wㆣ) WQ9Ҕ4 cSO6В}?VaP3)5> e陏Wtΐ Q4bH g)ݠ2$kzĄ7Ӆ86(SWf6 *۬|cHJ*?RN7K 7_}c^i[wȌμ|.ק{]ʀ,ŀ1jc,簄鄆†^Ra9 ƈH] )*߬㣠f'N >>.*Ձu#LXlĤ3$1zGNp wj",a\e$$mȍ ئ:2!)ExqK[΀`|«6n=¡!>E·浍Ag,n&GԂ\P{]XV`xhս 7 {̱"kv oH7 F/0 lϖ]<y/;aty6Hw֖mk0J/edY[a ׭lHֱe$SdX^wx$=[G*(-s*GU2FW}Vnsq-- +C[Yn6g6^[(n{ VQ7pjaVnPQ'sVn6)ޭu K5$u׻8ۡ[{C74s*p+ku%,u.'WS,bL3PI!(e$fB8 71ʴ,=;j(C=cq73nIvCsbf+/q:Fo/IdTTI,c`BEΟYnm&|EzQ9 ԑ2X;x(\CQkF=h gpB&`(b1S<u8GU NRAW㵦l' 6H v,\> w֡%rёü^pM>94N%؛8ڀcխǰwm&re su +.,tZ gO9 6B:)i y8tvZdž91p^? +N1s"@23K~زSO0`],ThǠθB@57mNi~.(YF\L)^ 'ƒ5׬d5ӥnQhNGƠvO˱ȭ3{p5ZGiܒ*HϬvE{ַrtEyV2EUE.' r[Ƃ\W(XQzgsy+nuK׼1`Sα{Oh32%w +J$qA#׬*K=&_VN3] B06N qZXcr8md㴨d$4M +y쓏*@e5.ˎj\ݣ-e-)Fk`|TQQXɦ{Fh볯=n8>B53K:y;dA'ޒ+}Ώk\KKӾ}wvc:ح[A=~vDݿ+,K_{\Kp=s(x@zfաE]JCf@v0n)z: + 9zGutg ҷޛ_`q! $I=Ymp iA:\>*lhp<{x@ZdtkE[ c!ݔ V{\DG)0 +oMEŖx.Bʰ`H/<"1JUC[k0ےo9vHZ+*cb8EN-@93evb(6SZX:di +wڪPPaoI{LhhզSUV{UV稌6}^肝ls)6k9Sw3uQM ELb}T,?Ņ .N B#Nq!g(@NV} +is#Ok$v}Qm.*4.7A"Tl~܋b$o=s(*N=/oPi HozysA;GIEnq{9x{Wu^e\>ktF&&~n`{հy+"jldC +đY!Gvg;L(¡B&zL@as/~?*./<|X,<,?Kfh,w':pl|D$EIfb~sn?VA /L|. + ojiDyP)*a0 o^SYyլoBeY߰XNJ endstream endobj -1902 0 obj +1973 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1901 0 R +/Contents 1972 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1903 0 obj +1974 0 obj << /Filter /FlateDecode /Length 1191 >> stream -xXnF }W:r8$P - Pp@ό$[{q2kK-J!G4F_Pp/2!펃/q> ɂ̦c e4@9ARȒRᯡ>o%F"搩znxuK!hR9c79ϋQ:\CT&1lv#~P '+A50#+ukmzV+۷\Z&Z?N/1\0DaL R|oZcXQd^ᗟތYxs7\W777T ,DR25Y[1!9F&y#9PNJ=?"%P_ x:Zu7} 8~ ƱivTw-LGq^9v,Ȁ\ӥ1)IP)K` %_Z<|.hh -Zy<Vpp^$OrԧWKN}ݾx`U՜}>V<@(!ln=k4=ݴ=>g|b3Xc7 \$bM0囈6Ut=X! -AcASmP}sӌ"D*OdsѺ -ʣ:Mc:;Z5|mlO]hNeEըDGn7j,K1 g[v3F9l/`fR)s/-]^31a$7#D!oN#0Ŷ9K6jt l+W"BX33UiǼrL-ݬ/ͱ,-drۧn0Nc@Y:c)SQ,Xmso?v]f?G* -'_|02*wX߇ԿmwM81Ѽ] -[ͽR 'x{9DlhT}?sUM&#HvW+)ڕyK L^C +xXn6 +ՈER ih>v2@HGftt52W?.܋arħݱOGC`%X$;y<ENm~uk[Ib49d*Ac=>~\Sㇿ[(T-rҡ W~nlf=UI )$-Am$@J|7t ~zn-|mw2Bw']ثe`CDCQe=u/#2yZ%q1q\o`B2:X98v9Nڎn{<(n#PP4k:7g!% 8eOq$\9P~Q'> Tћ_A7|޲UW*s@nxSy/g)-X`5'~>~*vj +j]ޒ5# F7 /OOgm:G'J'$[kd{3q@?L=hzwsgi-{|FO2fh)n0P;mnIJ`7l{&.zx~CpD[ Lڠu/欧E@Ttiyt*0i&\w*(Vntlu^:`u;feULݨlnK`m-?}HaNe7OtypƄᒸl{9@f(/d~>J +9ly\3 aWgz]'4%n;>;tӎy6[ nwY_6c?׫,-drۧn0Nc@Y:a)SQ,XmSo?u]f?G* +G__|02*wX߇Ӷ&hԉqx^SZ}\<ֽP{6cGd(dt ͎x*xUSq@0,{u꿕cK\i@yv] endstream endobj -1904 0 obj +1975 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1903 0 R +/Contents 1974 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1905 0 obj +1976 0 obj << /Filter /FlateDecode -/Length 3970 +/Length 3972 >> stream x][$~_φȺ_`H 6 a;<%!G}J%t]tIąwZ0rgp(?ϗ' F:{ i'<KbF+O?>)bsE)z积_㗟Q@S"fB%aJKVn|hk4ZjgZzUey|o]ZcMk,#1y%޶ p0ОJ̣f;swQ~8/:5}ɱ>;{gz69:^if1 ZJa~Ю݋[5cDi y R &FC*!dhA hHYMUE |~o{͡{ce$<:H}o~o>q ƘZY[@  ܣ/g DKB,s|4.D'^G:Ky ur Y(g{R| '9=X)TL +ݗqhԓs虁Q3 m@sk8mjYgeݡVkr +TT'xELZpVWosE- hjkjQl Y,S·C;us+dCTcNSzU>MUE |~o{͡{ce$<:H}o~o>q ƘZY[@  ܣ/g DKB,s|4.D'b Ǝm,qUFAAh,3C=j)>o]r*̈ endstream endobj -1906 0 obj +1977 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1905 0 R +/Contents 1976 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1907 0 obj +1978 0 obj << /Filter /FlateDecode -/Length 3229 +/Length 3231 >> stream xˎ"s,I &An6lH$ʒ%QvI,g/ wxzzʓɗ|z^HƻsD!@gAhcGkڟr?tVy}gcAtpNrJu{H)8O<;Sq*ۡ+#AbO'BU@mϟ~=O~s˘1<*dt{NFwe<>/]Kr=//st#ioI?\> XH0*mXak5 ggb!qn xq)ݍnae4p @@ -27517,98 +28558,96 @@ w Z|MŢưmF邮Fftz|q2v^s_G-iM7~%\3Ŧe٬?E䭝U'ydcSZ|mSo-5v!ڪ7A,+9r@v_)*N\)6Ma\u?ޮtׄWu!<*V@f>d\Zד{a.(L=DF qT* Gej9U.sP$EL8{!G0|7\r:L6o{u%ţ\N>Uү P0kAs7fuvH<(? )wE5ɈVňϩsL-+65h=MZ` MG+ bpoɒ7ɷ8*K%_~lV~U QiP=Ic(Ry`s}k~u`wIAN؉%K\VĿsڟ z9R(|a*e3@]ps)[Sb D!Ndҩ ìJbi1L JL0 ]s5LXg'M&SfBY + *%Fu?\|7B_'+ftWW>~U QiP=Ic(Ry`s}k~u`wIAN؉%K\VĿsڟ z9R(|a*e3@]ps)[Sb D!Ndҩ ìJ<\ ɚc mtƐ3&*f20D/?t9H X2aG D"Y' endstream endobj -1908 0 obj +1979 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1907 0 R +/Contents 1978 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1909 0 obj +1980 0 obj << /Filter /FlateDecode -/Length 3384 +/Length 3385 >> stream -xˎb  Y`L={ EDixmˬ]EΒ~~ H=IoO F9{Zh/BzQ(oswywPJ֛xϯ?~x!?NOy^~[#pu†Z`u}DzB8khY崁(jᅵlB` H' -/~3(RZv=^}/ F@Q2Hd\ڵD,Pl 2^JMqmAw"S`h.J! -H*Bkp5u BRF+="6"=Y% -zaWmAd9etSHyi) 1߯%)$%j HYF si" ESڪ'։LM͑d0PN K6 -VQݤưEuC:jύ eT%RrB Q%OCٱEWKÕ'e`bo0' d>XmxpD twL&.YO* @՛Gl '᳅wʖVU|T^{q_ ׵gMMnC򏮾`3_}hz^`uJҚi\("k'EeFHM,E $e&^^:v~maԘ}dWPG 7.JǿPkev(6L++,(Q#ɠZʩOb^h ,Ry:[7~6಺/kuҺ6jza"~Dܰ':5שKjʆ{8#[zv6.I*!63ANy+ fN-FW&~щAv%c9F_5] Vg&<,zI7o3g(@T7?d erC(13^qu[PLQbS -ťIUT.UKlBW[b*o{IP:2Qti$%\ptAΤfd0D&M;T,p˺j̃ư9S= -$%\vVT*j)TLHf4rQ[LQWesc_] G] W]^Gxbl̄.LUW੃kSLRq6Z[cp RIEjؒnJ<\K]ӆfQj%3>5Rj"ukՐ6EDt[P.BNQR. 70d%9sWdV;`\8E„Tml̙pSurY*=L%zPE=LsDO{qAwCcRS7l8 .ok#)Y͡$ ]Ecs}iђbUؘ(<Ʀ~_K2WbK6E<&&W\8xj(=76]0%H&%߄ُMm -y\RPiA -QxLW\3v -6W2Wc9nA+s!w[(]wP:`Zܲɭ1. C Vn5^b%`݂ߪĤEHa%Īc+D(WyRX[ I" L"bᱰS2Vu#)a0Mwt5F 2vYͮ1<<LQ5xcC8d/4eFǍ9aSd 3NֱLZPul2#-xTi-PQ;FJ;>Bi4 ->j4"bŏK^`Q-1yƵH -}J4y -]u[CCqs' -5}*&R8ϗ_NOR8#_#Wz|?.9h +EDa4t_y)~NJ@)a Xop?|<;?l) + +>rk)y) ଡev4ޫf9AN/ Nx-_N?/ۏgPY<y?,{_"*Idȸk5ʼnX(e$MB[Åw"S`h.J! +Ց T*j* @8 ^j؊ڈd(>Hr d!SB0"=Q~-h$(Ii$)TkFg7z\HS.zZ=ypͷNdjo$ rJXP^Q&5-KP|nT`@/*J`yFR< gC!\R|+Oj`%O}ZىLb?L\Pa9pc= +V3Wo% #B)["lB[WZbS~uޯxM?kT6$q ч3LW=5^hZZ3m3Y$|$()ؐ9+@`K밎_2*TH{<e]RjLtF waaEz@;JTHcTKQRfwVR$]WXm74 |^cX'kTZ/}V[7 {20Xv ԥBj|eyC=Ɩ^&bAF5܆Lpԭ!S +@:ŃSI'ub|ݮ$Ru%m]хbZ}fΓD[/ zFpw 較&(swGP)J̌}\ݖ*gTBq)|Rj%KUv-U +{PLRm" 3BGK/HRb ޙ +HD)L*nkdվiG@.wYWMy06?gGA8cJUWE- +\ W]ɌR.S rK]3ln쫫r2a3V^uUm]ppׅ @'fŸk19lrK}}-[jAK̺>[P[U]I4X vlB +=Ok2!I|ID,c#<3OlH +DX+`1L]т̾uVd /n Sv P, $MQ7Rؕ* +CN:.<̕Ѱ*ܭls9% VEƤ;qc`;`kjVLum)s ©Bcҫ9MB(|CdڭP7PA\I%:8*?aODo +l8fӘ^jAfNĆîpx&f82"xGcFN!:GX @ O&\ΨJe/ l[8WGۜU97KdžMak,'cxN4R1YD@#H(K'p?r'!>`1$[tkzjr9%Hy#> Q<p)p b3e{V~Ķ" +!}f Ƕ*_|;1=d m! KoBԧvlNux5Y)gJ2Зi1L.*.;iKuruC̄kǛ*cwLvf&9APYRosids&LYQ}۞(LpfYWoOI rA3#5!ui,dKZ{؂ uQ2!:#Sĕң{7l9DJv;/ +IƧw7l|ˤkh؁]U)0.Tng Q {5s9MCiW[=\. \չWX1y_*ӹn+yy4KGr mvQ ,+ڝ-E:#!>c1gSCLvzء‗׻5?Lz6nvHnnvP I +l4;ʤa)r3ϊ\!+Ĩ;.o>FJ?yȊK˾RX)cu˲҃Rq0Xns R<ݖw_ێL>H퀘lZ&F.V?1?Xd>zF +8E-\ϗY8^5o]m pMjU? WeS\OduU̦k/AH`F)yx6T}jYܹ{[~+AX| vxݍhad7y{Ks--yΫi$ӟsLQ"&fHWp t@ف2Z2xKi26s#ֲݘ4AB XylF%1 5o/'Q:0Ou/.167"D endstream endobj -1910 0 obj +1981 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1909 0 R +/Contents 1980 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1911 0 obj +1982 0 obj << /Filter /FlateDecode -/Length 3580 +/Length 3581 >> stream -x]IWǝ@:a9Us=@%QW}hW 6ܶUF4%?~G_0$BޙJ}cO~^hwh B<{ -H*h-?N9}K?)%,ElןO?<{za@=ȟBQp2^7PqXK_75RC;*o,%qhiCPDYA -#c$F*2篿~_ϤwJyr'n/: -R2M<:z\Gd MQJqγt@x%z.<:{mOkzo-4kNKRL2樉pG3M5Xٞގn?{WtR٧ڵ:(,즕rd~XV.+ OC\pO"!^ĬYIJbOKbilac\ i`<askN鵕o=F0AmQ.v7v,v}ĽY쀮.-CMo2~^Ϗ0VPsSzhX2~r;~qIJY»[zKSO  -$Hi3»G>Gqoewo;.Ŋ}J6Oǎ(7 f0Zm qV4(AqJ:;+ Mk]T(&uHڐp‚F6Qhm͂7P;ѵUgta[R/刬V Ohgd棴]c)^ڹa:J):#w3iIդR\YcHA>VgQcCQ¹i:D,ZyUr Et3vU, -z!,a]`s$q/K28qT?G掬JQ4E_AuIc ca4cohì qq<˯MsT-#)QIT^ܹTFĤj9XX~۾ -4[܆(pг /dXsف -dZtlbw ^{YyWTWPgfSk:JkKE8acR0Sp7K M9/m \Zien 4 *W]ٔpBᠠP²?DU>ʋBe\u12ns腱,~nguvV*?(s=0n0g/5lxWp7Ø.tPU2Rzl^V -.c8-C &Vָ#*\8إqH.zUl=Cc'tn616T@{4) `mxɮvP!pCnIQ BՖ(q ϲoģ Ц)Wڂ h޲ #?oWOψ}K)O򘫞Y44*VZ;A;mõGYw9`:ʑpwN7!bëjS=Z0a{Q+G`=Pg,]< r"FCq<+y4T9/%-TY)>ǝFmnd;"@ {6}LS0j,\ѱ^ϘٺMvl{Mf=,otoٍby0L+@xmK*.3o%,BgZ^̨*;k3B]vyl>,9奇{Iy]!l؏_J fvCyȒ -rXTAx:@r:I+?ҳ?8yQX6,[ϳ1`#s#+Eb$34 (++rl#벍9p0Kv3Xƹ8\&\uo.w~ď~HY7tfzPLFv"Ζg<:?rNY70Ït3Or%(|o te؉ɍCJ7Ap=O\*_+y-L?4{.G+ a|+tPj?ycg16eIvb_ +x]IWǝ@:a9Us=@%QW}hW 6^Jȷ D;sr~[+&?'텏VywF(ij ?|?tZx)}g"MW9=~ yԃʏ9:+-u|FvBygyX卥$-mj2￞(3Hadt HE?~㙔N)#__NĒ-}`24C'AVAJI'~^_O̗9|4J)Q{;cU` yODœGG~oiMMzf)`^*I 5QhWIfKV0xz|mmOijAJ}]>*Vv>{+cvH6qDF.VCV }=vDa5yI*#J61َTux8و?HUvsW -J0'´RnK`1+'tM6Y!Ӡ}+XxV.7Wso7EtS !kCY + b*UD5 {B"HGN6VBmцyouHh(#Z-@xf?ml)v=Zmz!k檇],넏*"C0I|ئ%sVJ)-rmd"XcXU DɎuF +约UsWrhMcWc6-J +uUn>(X;v={0N%{BW/BrPQIK;*\a3N&D%r&թz'Վ:l2XYd0 ~3 T.66!βQQLގlF%qSVjzqR`ay}Ni Pওg?A^2ɰ申Fcتh{I14 7;ү)* ̦t֖*p4ÈǤ`roN>r^Tf-^iqu27Ty{PYU+~.lJ8XTZ%JaqXЬCxX"Ǽҫ»,: ˹2ch4*ٲ#{TJ鳝եq9<!okcL}ូ?:5CH`8yܝ8zg{Õ s2&}9neJUeTTe7nO3jY7;7p@XJ^UŒH0X5c zyիZvG ^9Hjn|.=öֈ4z Kk 92;W3$KbWI‡HUq;54lRtG <[bƤӎ *Kc>]V|b_f8Dw=P`j띲"O: Ry+3^+[ueh$.D7DreX+Dm>cx6[> +>t;[CINaCj~ -ot64Fmh+ʳ!'iGS3/db`caȪZ2CL/&ͽr,&g״Vh=Jc^P^X"BȻjGyT4.T }n0%ϭlղΎJGt?G F]&6? oC +fSqt@sӅ +CBJKJe GeC7oג7ttWKg>;ve "*i{>1|'2S^zg†bl7oZێ,(UK$ǣOvG:)m<Zg` +C r ɉp`9!l2'[ 7uJ?:~ì\t6x>,F͞UNw!6oab$7bnUOm%[k?6ȇfaoCV +0Lm-%L[MT +ﭼp;ay0y Spm&o2n-uUD 8|N`=R|R0;V`3Px+RrdE^ ؑmӍ 9_; ﳳ2R࣓#=k?ӍskUjؽU< 62;RP^RD OB:C݀B+*Ǧɼ=.؞ Tj7>eK)c ezZUrQIz}Ox͏uCoKonvdd'ly{sSӟ/䛥C>M>$WR͟§@P֎8^>qI +kcu5)l`)s=\IM c^ R?,Kup endstream endobj -1912 0 obj +1983 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1911 0 R +/Contents 1982 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1913 0 obj +1984 0 obj << /Filter /FlateDecode -/Length 3370 +/Length 3369 >> stream x]ێ}WeNCd'yI0xix@nZ-O7 dh$օu9,i:j?ɑJ)~=|9h_?ď/UpN(c;ku<1[)QrH_?<_{xaB'R,虯,l\k2D1xDL>%34Mg騒ӆ㯇~#1N?g֮yJQLtAp' swN#db\p)qY9MdDu4>*Zҳ\,7ȧ-ڽ*5As-mڄ`9O)+0 9ϲrŠ4I >bS0tMpl%"st[ı[g`qOP9d]NZ˱y|=?òchʬ{psl>ep}I7>x ytɢ.kβ=~l}FM<8M+\vʨ꼶3msDv "'=s5HdvX&fW!Q \d!fY(ixr3#'&KqR|6+GK֛\t?\Lap93F2vJc@-KNt^>@}z;>P s!d֛Ũ+|U惖##*U#&D7wX_!KÂi4x2o@fʏ 7  &(c. p*NiNWX1Bj]nK : (oڹ!Xbȯ-w_c +\SN"C,tŏZYKMa>P5ck>yuVyHV m5l =7"J>2p*#rT^&y2D|K^Q:#'æ1ѽ^Nbz!?\^T08qg8g,hfQ10qs\#X$yKT8X;*tmV'@z}OH1ם<֨iNfCܓYL7p&N kc:re$Ɏ3 ާ<=שHvN٘"\MM5|1<,݆\e55ù'wU=8&Q0LN{bv}dԴ'v;gwQVm,'mꮱ\๺,%7BoSiq!%a:ҳB˜7M @@ -27622,58 +28661,61 @@ Y +KZ\N7%8u%nú-S?Vԍ0W@rlC<ئkĹ8צآVwE >jm>Jﮇo*s6g~jS]95~S)b0<(WbU,(G/e"xa;nmaP³)vQ dϬyqZ z :v Az>*HS-V| +4OX|u,(wSmN3~!ZLDEt)\}g[MWv9=jU Lή}Ej8bT'bJGo҉; *A_'c;fW2%8JG=Ǩa?W 宐{=QzwP᫈eb -9iטT>gL\Xk}t8|.ǻx_~tzm`+9X^-"Lbn%kOnj>Ʃ NG4L'WE. +9iטT>gL\Xk}t8,1ޗ.DW%!݃rWrZ'9E1Ścp~xc +zDymD endstream endobj -1914 0 obj +1985 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1913 0 R +/Contents 1984 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1915 0 obj +1986 0 obj << /Filter /FlateDecode -/Length 3306 +/Length 3304 >> stream -x]IWǝCd'9L,@= XYU"U6bA%o#Β#/!DדJ]1'~~=i/|ʻs4„@!=A$/h-/sJQ /L] -:o~_{za@=1~_zŽ|k)y)ۡ Ea78!|QA -#c$F*2Ͽ~_ϤwJyr~?jgQK%Ii?*~(`QF|ꕾd,YmLJ)yd{hu"J]eaCN_\|o=@'j` j8b|ђiTn0>2 6HᩊFVy3Dv^1zazILJcNI0mULvEܢy%x -kCu,;b  *b-r@u dj6r#{†fD$ -sӲSa J*8+\E+O{a¢#sU_jhQR m<w2 S+Mnos>8 `-j\IJ >K찝$kv*9BpK)[IU3HoLpg?#3&yg%G_uCD&'2`f8s^RL+uBy s"6'08'Q$# Ri1JdGe22!*%!xz'] 0lt:[dm3 f 6aeh2P˚e$ݕ೴]˦:ep)3aqH-ˎZ9aBϞ JZ kۗ?N9&RJX.to~_{za@=g}|uV% +[ +;m?7kl.wUXJ҆fFq)a"Ȝ?zO_<)e_X>Ӂj%J*b +ou(#?|>JqZd6& +V2]:.]R!jP +e50D5 hIMx4Nn0>2 6HᩊFVy3Dv^1zazILJcNI0mULvEܢy%x +kCu,;b  *b-r@u dj6r#{†fD$ +sӲSa J*8+zhZ0a9*p/5(6V +;){&7N9cUQ` 5]$yuHuhvNĵ L;gThG!kcu ˎtNQՌ-<댉e^{ őWFݐp<a4J{P Ig0 +3Ή|T&,ɹc?xj2FZqLQ}H)y>~ueIpcc+p$!y06ݰ6t >@2pf6Zf9r Բf8Iwe,m)3Niu (cXvntxh˲#O:cjYV,tauBwkc Zou4OA(c9 {%(q,;&VuN ކwTwBRXNWlMM=U(662F:pe[HNΘ=__g"Np G_ڡ YPZH/~9y+M` +a@/}^ +ZPӜd 2&zV~%$B1,)>;џy#CYBҬbd)SjboZw6 Z-M|A9N21;@:[*8aaG4lGv{QήhU1V ]0MV16HZ-䑮e̔ 䜜F1IVe̔n v1SjFUT&fJ:ƴL"wA9ԼOFGrV^lh6C F݌M*A= Ka$4 Bst2ܣ[ޭB?㬠~$rt꯴0brpU$!0C5Rc1wc1cqLfցK -*Gr;,HFSD=f@j 2&b :q8:uIAa]{;vBW,T.d~]n"q%r*nи" kGe%!7u %xwď RDJ>Rltj>GMjMZ[c=ʍ扜6|]jPxwMmZd,)K*`y` ޭbF]P2f 缒,g3`i gLDOc4#0AtZdZA KƂҏrn48`64ORgR:v+WVC|Csg4˗Z- -ŲF]hϚ"Nsglץ (=?WE/]L΍6s&g' 0Q8,!5W;WstX,ʗmKpRnpuF{UP)"OvmU -*)XgSO4L6{~ 8կVK\Y0C|M!&vAM.j3v /EfU/Y콏0dz_N(UW1}|=Wc(w21[J0w`;o WcWm.M ]q ]xS7˧۝!7VY16 WEރ -V:P c]N;RC V -TxӖv[i\ee04kypo^]0n@9wai=i#n6u]QPѷU;%Wk9X_H[e)/r]^S^RA +TJ*>/Ax`1ޥS8PQc7J`%Np<"{XOe>H?&o8 -oeז=wN55 Ja1 +J5p*PT^cRyǕN%~PdS띊Jh6XFN%i{=׶<=SgZ;z N&,A^V:\لe8lMy'o`bXd.@x nO@Pw{|H<=D>|ա Nc7p2:Zd򡾰ɤ))NmCVQ7ZWIh|Wg&_C;lnyURJ']!uHqC#Er'qs#h9ֱ~O뱯#}fEZTl>-?i#&MB֌G H>?~T !zꃈ i9.ֲǴk0.C>?u-LN=l8H S%$fScX,2IEsO +7;ܡ{_"`r't O?uF+Sq;wLo;"- >-9f8]0,s#~dȥ"W2eKV9mRmQnT6OL 0 Rp»kj"c)N45XRAcC_n3ZRG?0[8̗d0Ddu.m@,zb*tn߶ٟ{'@0)?#=^TG4N,_\=c #(_ZZX-Ii!09WA1nʊ<ڵVY(4r*_`ekbL=I f0]:칇y7T[).rei -6·jjv*5lò6S% uV?xg&z>0b𺺓ҳZ ~9C4V^Q^Jcܹ˸ na*܁4O_]6W*vŁkwMkT,Vnw^χܘ[fLVې;vh2_y*dXOUxN@y\>WGu?O  `=+Erh:pa=N< PDPfn[`+j][@U:#ZRה7p*0t* +FBSɛg@xJaAW:lA-NAǮw*N*`%9|:J`_ NekQ78\yYdre݂5 L~aO5xB! Ƈf#]T6; 6hɇzz'8YVT A[F7Gtk]%$^1m ޭ*s쾏[@n4j»V+TZ켝'il2AhzoۦA[H$m;@4uq!v*jޓ2i:t=ŒR0v. -^i 5ʧ-_[P6>Ê(vr@KDi]o͖!Tlc♙(~u )qU=K)}ڟtm"폘'ڃsoɝ́ CXr~:Y}|榖%[yx!a'sZHI5;A#8k?z(kCA co?CgK1.+>]@0-; 5C0LاC"cNc5r86X'r endstream endobj -1916 0 obj +1987 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1915 0 R +/Contents 1986 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1917 0 obj +1988 0 obj << /Filter /FlateDecode -/Length 2867 +/Length 2865 >> stream x][6~ϯXUpp @@ -27685,168 +28727,179 @@ b W71F[Ʀd|(!B7AzM%'cb졫ň,/ F荍taE>eEn+).(HsHo7uMނ‘؉nSĀu+)ef wpD4;6+f'^8R2 QE³DJBg}D X9~S7s)uaI %>סp87523X l~:DZl\%p?LW\ex0)^.e!Pŋ[{’7 ʽq{x8r^v9`[W {m F)F$s ӐOʸ-Vb*|Tdp?wlq*@+vr [y'CC7e.* }T7xO9/G₍Xyx-Fp8*#l62n/A±XN ~=`ų;WX51۵mWB^.ϑZ֫k]n.(?T;w:U]NUt![Ĉ`nSLiu\huhƝϒ u&N@Ź*p_@z]_@݊_@z7+~Aeܫա5/`۽_į+ImR|J.J |m"\ .o^ݫd|wr_rv*) 41HcLYE5x,ԢW<bxt|̛K =Tg ˩)F#9+r'A>dC~0,w,.*RRI.V g9n>{ k{@Iɏ/ _Gu>\b*%TXSO:\q/SxzܞMv}5/&Ne\2ϣekycȲKӫkr_:!$"=Mץb׽^bMQMUһ_LA$^7x%qPNbMWF⌀|rw|nȊdnbVYJVp|1jViwbgKyP>T>:'lH7tw,_~nT :S6O8Z=^L_uZoSc̬h_>NoB)cǨJb8oH_ +.=(Ã\ME&`w2 ?_if>gKyP>T>:'lH7tw,_~nT :S6O8Z=0z8 '{t0zb~sdfGq +{CdJ C8?FUq_ endstream endobj -1918 0 obj +1989 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1917 0 R +/Contents 1988 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1919 0 obj +1990 0 obj << /Filter /FlateDecode -/Length 3461 +/Length 3458 >> stream -x]ێ# }W% !@&y`,䡧wz6lUKK'vZ,^DQL{-?#/2SuuUpZ W, (;THO8Fi(*"mZZ}c] -ZD(GG}wO^Hj){| >8 O^k9VSW(x'Ú:v1YQ+ AEֆxw=1^v v lJٲ+y_dƇgyĉ~v~zk<y&? ur~=_*P2K![f'"% V19R]'EoqiIYx-a]P Jo0lb6nUQ~G8ňҷ_*~u&eWIbڗeѝщH@z0/;c 0AHسr1YKqH49Ɇʇ'1+Y&ߝΏ8$W-jAF xjxP&DZp,7NGԐ,FYThe)=^)snA88Qh0q5r]0+*FYbwJ߽욉$z3ѯ%*as# ;]_; :I*7GGZc`fpV vuOGXavro,](ōW, 9w6,~ Hk H[ Hj 2{5Ƞ6AkJ ۩fzL Wģh`r2ʚTb&ƘTS`]s^'w(+H=(yq2./p-4%/&o<ݪNLF1(2n -JAxq(AmUѝbcRN'KeCZr]hӁ4Ӂtӡ4ӡc*[˹r9rr:zӡtK9݊Yڭ??ef^*שVy+?r+%M 62Zsf5GwNuѸW`_3yr*KY*^,H[ -w,*^Y*ԆUsp1BKK<_Oc̵V%ek̺X"n+(-;km%d~%/OGZouT7:UmϖͼNUtSS vS)Tgxi=Y=W!r +9X%3 -;*1t|o q~ڜNB1;YJ0ݫ[/4 @{ոa7م\[&A]W_|w}5W`65~{usyΖOΆ?Jv|,(={7E crq̝2P%C3NieC3³ѧ37Pyz<6  W9nW:wP=`U Kݛ'ӣdc'OAHajb|5&yZ=?^`lMIx[JҳOvj0/JvE-S9C!xgF,XxV)4㩋ӵfh1TVQL)J4L&VtYK!'@w}fD - U2lS#@1rbwujĆl^b]ۧa1yV\GﻛWߵz -%Gk ҼŶ*R-VlJ, e8mٔ |M)7PJH -s򸔥,zC,)Gw{l,>jwC"TZP:v|t 8ɪsضv_M_>ޟِ9ys'UɅ3eccHE w% ]dq;&)+4a#gcmdC@z1IM7W =' fUnibg:k;mybqVuىW*uQC+( pV2L"Lz _pW⠜jې@q=P>"ae|Uyexnrk;&7[;^V"S1;U֤V u`|rI2MHQ - >_gwbͷ%*|RAn/y3DﱱߨN`; k(Χ XmW-6$|5 :+w=X{9qhGcw=s%!ߋbC4yNapb,Z?91+ڗ2b ‡ʬ"z= bK6ܲ\t[ 1_t_8ܵtNb)}ʱ:߻!Y1쉌Q._AwO^Hj~̟W=Nu ^k|7XYO]4k;a,b Tdm~}_ߓQze2=v \i1[xe"2tYq$?Oxm~:3ksx/0]'8;9҈`~TvI8dK6lDĺa_U,yNTyG[\rrR:vnsbX$*3+(͊'v{_Q*:N1헊hIT%~YD$ =b;c PA Hgb.bi20O:cViLe3' 8Ѩ$W5jAFXjxP&DZp,fM{NRP$xfIRq*(qI)ehٹ ȣ"$|yLNyoXlFt*dn[ EKy2n&BԀ:OX#c'HkD3_OO +F荅]O 9يȿ dgl~r>8VesYR +1e{yi(ϲx{ظ#b +:jBqΫ ٍfp쨌 a!8V9\`۬/6cx?O6cT:14 !t%"%v`>z2Q莾W1{)4ᡫ0.v^0J^J22‰&_*emVtIl2mX0^;k?%v3SmTQUV3wy*XxNQ◲!s +_Z@Y7"~~"c{y٪9W{-`&"WHIE8 +m_OV_TB2nCd +ZPp/cͰ_C^%3/Z7ǚ1?F/inB`:^"9r=jY7NM?<65⿕թ-NoeusoSoauHFS+[0թRnfu9䷲:N03VƯ: +G7 EV:+@!ۖ 8p^xΆJHGº +вt2)>^(qp#KV9SBnKUXp6!^7&ؙ k[Jλ*;&N4lveAhtshf'_#H [S,tJV4ɲ/yU9g7' h0q5r]0+**BYbwJ߽{3ѯ%*as! \;]_; :I*GGZc`jpv2ꞶB +ޘPP-<7^$Z l2 2 n2 Ƞ2U Ж2+u[ {X1>2^+I+k|R}R)O89C:]|=l*{g vȸG)yQyɜ ٭Det"(&dTXe@:QW{,p@Nlk tt:ft:nt:t:^t+y9Nw:GNjYt:tnI[1KTt7:U:*w TG?XT`#SZɐYkδ `X4>x/Xlc}MZ6(Hk +-JһZ +q(C9v{R)şZyr5FdX"n+(-;khm)%e~%/OGZoaujT7:UnϖͬNtSS vS)Tgxi=Y=W!r +Y%3 +*0nt|o q~ڌNB12v,`W /8V9r74 @{ոa7م.-irXg0az/>Ļ>+}R0Ui\<ۄ618NgzpM}n3NieC3³ѧ3K<}~^Ftyw׫S仗+T0xf +nb Iɥ͓ Vܱק؉Az$7Ew1>{y<-㞟G^2KN6Ѧ$ҭ +X]Y ٧je;ejŧ]QMA?uPx^.K(&&5by4xt1E US +q=׿໕eGv+UB.]|G onb9]a+䣗*{iXLU$~wSuq]ˡ7Zb Qxd&%[t w/T-P]$oѵb@gSp`mHAn;ϦL^lJ+HqRp@zUXǩ,eѳlreO9nU>md엪 dRچ䣛IVVMŶU:l8}*O7?!srN g8'G%xKhvLRW`iJ.Z%ж0I:c +o઼2`<7 pU;^V"S(c,w:1EIwjed7|nK +=Ě%*xRA3_`gqDXoT'Jǭ-#vr3JiC<saE‹ʭ_9pľ+ƴvˉCGMw=rmC(/|Ǐk?ȍ`o.ZhB)DYa۟ǟ~ZWX̕[ا>Tj5'?0d+e'b.gtv_8Z=0xZY ʉI1OAfxHqB FP|lœn][_? endstream endobj -1920 0 obj +1991 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1919 0 R +/Contents 1990 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1921 0 obj +1992 0 obj << /Filter /FlateDecode -/Length 3461 +/Length 3458 >> stream -x]ێ# }Wu0aI@>m?ʶTt* -vgǨnŋCT^w%G*ۿ*zߘ0|#_v6ar)QHIicMkwc*jS<| ڗǯ?{"?wʄFRsʞB-,wU_|yX}Jf2Τ90 Q% _v}_dT 8'֬_~f3N|%_( Yin4AҚ5s.j2.kU|PY2s΃S>eM#7GYz>lCx9;78h^||y Y3C ]<3Be79OooF7`&X_~&Hb/nQ<- !x]49 jaϭ8OI;&@Pz}q)a٧&V;&vqb(RiN:']0la P(=୸E <cs7M{šwV#vײ5NI).Ys6mA X: R< -,|Ij'E琿KU,~wօ1|?PaMqt#{t~!6j9?)-4Xt%̢cwm6'Ԑ֊zl&1w݁i׆ KzNecb:R(~m~n[zrBWkW+aN Vr]P9ssӸBm@6 Z]=ʂkWd sj,jCxj~v(lORӑТ MU.YU\q8KEH;#Z#GX%}$obuӑ:k, MX #Ai.#Aǖ#˵>9Z jeR}$$]G2ci7:Mɦ^#ud3R< `n7b,`2mX!l`]tnbLX e(83N_)!r(^:+@z A1} A1z1J"q_mbS=|5GpXVQϤXÖE) o"бH n` ZқP73PԂu 53+'j'6zwz-#>47;!=bkQY}>G,H7![,H85w}8ZboC&ct]n׸o D* d!$`Z&rF]*$()Wq5><ISj׷+la>hCoe !zj&BD+[ï_ -liUVlEe,UيВVplVq~UΜsb'e|}^QG?8$,&u!Mv̍Aaoa։7=٘єb.(c Т-sA~\;o\tin<[d&/׺I.j$x6J{fcg3tຩ_ydSt:H?͎> 3>W.Gsw^n:3P[31jdu:'AbGe,QZE?\t !sN N4 tl)?k2z7: : 4nl`f^Azou>rqou>^&hkΒ]|Jj>rޢ>rpl>rv G]c!?W| +!z׍),*~/_\ce>ueb%3wtTg騒ӆ~=1N?5kO;u朽‰Z?{X?ű{^uFx"Kdߙ0p]sm¹@9a38'ٸtΊ@ ~ -teaLs26GHʸ+(E?6Ⱥ$xH_)]<|oXM -`43l\cex\22p.U*`:mi3c1$ph˺H>U|zu[entouڍniY u4'4)V^3 u.5x^c߁`S ҔrF9 e5*ɼ4 C.s99\fLBo,b;=ws.Y+xh <>oq/[d5gfXsξsP) +L +xϠ`ȗv|R{KT(W^κp5'CM/)dG729qOWYba^`sBK6֜Ytہ }55 ^=Hjn&1w47 p:8ˍٙCg{<[܃X:_t!qMU0B-؋r&Dq6ȧXg-&&`|/; +泟g\M!JSCvlcۖr6q`Y&#BKq&og㶉jwV<*7YBH\|K\碲ġB&k''tvԮ`5( +a=s^_/9]=!hp7+ ԮjS,HOvMP<ʸ{ʢ6׮ֺXpWjW])U:YZ +-Z +]QUe{vrE}$H`]#\X HOՂT Ho>TR}$ -#~%Ufׯt,,Yc18h,ibh JsI :TL^\HP+#A>TMs+~3lu>Y^G6(y19y;q;yI+֚+θ "d [mUvsM ; ONL$dNl9MV鐏|΄JN?VٌNw:O^q~Nڃ1;ǫ`l/ >y=_ @8Vƛ\Z'@Do`rTPN`bMٽV[p^ @iv6J`yM.Pk85(΃nOW|:& !C!t1@E9C?ԩ @>Ěr#A_euv R8,Z(|gRa "XޔonEcwvl -HO;7kIHo z35A-W@X{mϞ;rvblQiA [S =#Q)s~:,&eQ7 nXcn { N̝ A\\sA\І\ll٘ -&ykN.Nu4R$3yMr=V&봡U47v6:M7 ZiI6:M7,#3]8O#r9y7K?@Q'ïAz)Az!TR%[E Đ??Js GǖB3y/j q ͼNMP~lu俩if^#:M&^#_uj&,ٵȧ#-##Gl`7ΏX9j} 5ʳx\G3LRJ90 OD"g'&7=ykcrdOI2'zgt7|;zPKft>laP7M(LR,>;9Wǔm)bdl;0t2_> endobj -1923 0 obj +1994 0 obj << /Filter /FlateDecode -/Length 3077 +/Length 3076 >> stream -x]ێ}We`!@<$p<̎ix@}h|5zZ,xi:jIŘӯoca_` -əH1EE*p!Y1Q.A/H/=|B3gN._W{Uro^be?uewҬ (jٴZb Tdm=ㇿo?ɨa}wY-ANR"s1"5r%v# -: e=L,.Ĭ H-`sܕxM8ݓb&i:nym$77,VבefZIgva|k7?ʋr4^_KCmgÅA"@߰93R~RL *I.$Q&;g*=+elـ̧3qRc&Zc+u܉WMWyu z5eaznmq«tYF{]XSCNijLf¹وwɲњ3,hPb0֨Dz = -[W[9X]P<(lb4^;&#GbD&iXI1JlV!qy 5؉ߥa5,؊LP"<@T@3'5h2F7઀"Ho܀e$X*[B׀=+cYoaz\#Q^2&O2pD8oB| Py"ئPS"d~3IX,+-ssX8(+p?2SeMw&疨 pa%/C AT.K UЀPы֙ɐD|vJ[eE@ ḓJrm{P`D&[W,wӝ&˽hrAK@28 A@(e+ ~`۝HpBS$@22 ^*OO_ DxoR+g*ƺ̮XT+|mV"/60Zôa8|Eţ\ǻ}a -Gr˜"51n:î*`jF/O5y/fu^aMm#F^YR~wC{}MRrM]msjZKZ0B6B;F( XZ ->PEAz1B23Te혠-`5Aݽ٦׀4ͧj!η$ym;g0w}(<t1kZ_Pi*<)Hbtu{C熘O"{%ȳvveE+Mgꁲ̵UDuyy)\r> VagMۼ -7"זj/ז@zsm@*6#J0A6+V".rǨ\m-$s-\ kAsU^ -ӱ(MdItuBm /TwRK<>8U [P+Ѫ:)^)wxi•2'ʪtS-iԩ7XcwuO;߲ӲGZyD8EыVw u'/+`ݞs^/]rޏI9}$y$HoIE>/IM*~P@6q xiwi\x`t)Ϙz#dN51_Y!6.'F䛞t@ -5*'$SoXl1Ll){J}+Ağ(W=1jD%}l}(cRO{u tte=')/aI{6m[f^R0%=]?~oؾAԦqyF[N"S -({dRdJ %t'l{Tj(QhL }F]2bW)O))Uل /WO,D(S/=o{<=6#7WƔyT'OO9S'&Zrq9ڇY{O_%`wt*yIʛN琒Si.i9PTPH0$0wPMiD~)$=3,\dQrK5uR13v +x]ێ}We`!@<$p<̎ix@}h|5dI-ź/MG-#/2S||UpZMؼ><>lP!91)crZZ=y!>$!#1Qo1RLj[߯){J~zJ^K짮 QN5euXb4@:V 㯇~#1?N4k?~8a6I +Zv.S&T^nD:XabQ€l`Ys߅] %lIGy|{R$Bm=1 Uu@f~xv^]X=/Z~Gyp=|gq^KCmgÅA"@߰93RzRL *I.$Q&;g*=+elـ̧=qRc&Zc+u܉Wy:0=8aUWU}q,w.!4[im5&N3lD;TdYQhYZ4(1kT"M=p-+X-X.(qjqabQyf k`1L| c #1b4$KZA%6YӸaXIdiRR|YlE&{N( {t*ڋt̀ˊtO#pU@7n2,|-kŞ0(/d'8| GT`7@>A<Fl[B(XL)\2pGGə[$X,9B9L,n)2_;sK^pނ0DZءY*ӥ*hzELydH}yq>;2" HpIZ% +ֈ=(]ws-+N^f\{6+T瘷K2qR8둟e3] F=g|Qn.GXel4X U|%ojN5ņjv,>NCxUُ-+1zӝ}B[24Fx%F_/j/*vȰ ?}q +3N% HPEΠH IHNK$l)r `]\/OW/G {6+SrYaڰ^yGfEQV]̾0U|[jR9aL!51n:î*`jF/O5y/fu^aMm#F^YRv}C>fy .T\ض9F^G5Uz˥Z-hd#,zvF( TAR_2vLlSk@Sa V[<ƶٝIeuڻ>ia c +5"S( 07NMw]6$wߣ0gcsW;΁|kewW<` ѲdTEssu\Ca',g faўcRlݡQu Hoh*t^ *񑗈%:8Z#/kYyPK}TɰӲ>cT:IjHg-[`<6?,$"%~9EipZwJ(Of +]!Sq ;솝]k$yJәzl;sm(Q]s^ +#ȵUzؙkS6ȵ%Z˵08\[>P}ʇ ȵ} fJ1*n[~e \ 6=4ׂ4ZkxtJ6YyoG բ&DÅ%Nʺ|*NW`ʪ^ڹpL(,Touͮ3|]ӎQVr6NQ,`e݉J'X眗K#jRa; *J7" B◤&| +X?C(P}_ pע6#D4휄e/'x/,_ιحKed 5,`sE t`}b|ŔRb9lc"ڰsnQʮ:> xiwi\x`t)ϘzgHD2r'[zmP#MJA  Ma)7,&6{= KOJMTr vg5 xb6>us~::֗w6m[f^R0%=]~oؾAԦqyF[N"S +({dRdJ %t'l{Tj(QhL }F]2bW)O))Uل /Ww,D(S/Ϸ{^>Owzz491c'IӟӇcɬ⼉|iΦ=wCw2@ ]>ţJ^9k=r_pX(NydJ"`</2v]lx:jYN~N|vM endstream endobj -1924 0 obj +1995 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1923 0 R +/Contents 1994 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1925 0 obj +1996 0 obj << /Filter /FlateDecode -/Length 2762 +/Length 2761 >> stream -x]n#}WeE !@$yH$ y} žٺx--2FͺXM{?#/1D?F_;/Frp D)!7?wٕ%{#J=s&P)#h_~~y#%4?f!JP.׹&G;O?zI :TmHɭÎfs&k4ȊIlw?_Բ#_ntA*Z8˻h\+ -?-c7ѩ`oXj Y%fO^|:el+ 1 tR 0x -VZ淑 3wj^4XAqz?;+MFjRҙpy&m1+s69Ʈǒh%3r1MS[P&fOLsC{,Ez^F#;` -Wͮ&%kXlƬ*<ʼM#*oTTuJ>\ iqpI%؇vW͠*aM<OE85Ȑzayyj9#**#ѵOz_+f1-o9q-\>{y25wɅso8QKMeH#.1bL :Ms A+^uy3ro A*?>tEF\@76+QPFƩ޹w=ea]r/8t {AcmUhP˒.F_r:v~pB''i$9ɩS ˚Sk(.<8Py_"M ;ZwlRnQ+BH'ڎ} 3DTZ/f H șQX(!07TU֗K(xc<ʜ;Tv % ށk_ٶ32Fw4|Yd:n˱UN}aY]rR52FAiLj 36J)@䞊]m%@h0:hoxIB /(gMRpP|Gj=sm- ֘>0.m׆5r/H?V s{UazɖY;;]*TN8#„Ѷ, ;']M߽f=r:Y犸F7(XV#P^@K0Iᖁ† (W75VDbolWF12fD|BorR)mΎ tN s˥V#vRIʮ Hvfg4a'xA&>;1MzwN%yP^I^go-% >P^j+5I TFSsi&^G.p6@Zc!bl^Kŷ0{A SVfC 7 -ٞ&09 OAg0mxS 2}}\'sf=+tSWl e1:]m2Ғh|F &'ouoΫ\\UW%ؘ ~? -llk*Eh[CVS;$&nƕ "VVhk^v+@z[3)ZI(a[v. k/zoKWD>]{QCg 짶{^JPw鼒dVu-UQ[nT$TXmy#qKt׮oߕڕ֕{[х=[`\!;щ];@g/B2.=m] CJ|*]pCt2В@z}@U9 -pwi.T}WV}*,ʙm j•G[@EhWJ)E T;h J&goϾ6 -s+ӡD#㖥!+ꧺ;3.>m:*&:J*X͍KǿVnqLM4A6㌪kλˍsбpFUEUW Hm --@]6,{i*p=;-7Y{%vZ.AkN=>`vШ#m%*B']a{2,&|TMݪ:%`rتHԏSjˀcҸshޙ; -fSnz=q*|<6Bze`qFWOKl$49jng2^};Hx8'q; eXe86=b=tѫYc}H,@=8矯ÃsbH +Mɺ27,Ag0?eKqzΝo$*7\0)}O5XQsQ|"e_Ɂk;r:${W>]J)Ƞfr+ӡu[X,iAgeVڃ\ +x]n#}WeE !@$yH$ y} žٺx--bCnYf.:,iowI)K/;k$XX3|W}}y1l8%Jy/ u^?ןvgWX+IDΙ@9PΠ}wd^Hj1܅(Au .y䨟9VnĠ:@Eކܪ?hVgmJ~}oα?I5?/?]EnCJ82n+GU ᳱ +'\{Xɺ1V1*_F =b 6^Di]b!ث&|Wb!([GІو~%: +Q~w]|of 654^{x!e0+&lїX݄ƳЉAFiHN,sr*1TC[)/QƏ׀-YܺM)}7EE!uXuGFwޙL{J`^iIi @S$LWOC rg*V*% x1F eN5F*+Oꈌl;jILP*60/U.1q#!~'_a%M +rOɮQ g {l$\"w +H8(\#9fkL6,}kU׽T *ZJ=dK ^Hy(==Nf0a~=˂C.IVwY%`D".B/RƁg/%ӿp@aC䫛K)"Ϸ J_ysM؊I#Z"uw!T6Aza)vٔxOgiqkv:a'҉RPJ;)~$eU;UI32`S'`zxG&i`'PrƂmWEMt +/ѧj/yvڋ<u7O ~[Uޒz,cA-yU +w.T蕏ʔr*Pq>+UNcX2 +K%wؕl Exn]V%& (1>zjIH&zӲLRxSX,:%nb)Vt!kWIrǕzNv[lg/B2.5mU CHlJ]pC4@z}@U: +pwiNd}uWf},,3~7 j#TpS,4+ +sa4J&goϾ6rs)!D#㒥3:;3.t[fU[%>se[ i`#S%mG8J҃r&Qe@z}qFUo[nAzxC8Pe8Ar\9N h^-2hcx-ة4jH[nw ;eWndwf|R/[X[q + vp] +w;wG>%߶Ήpniة[ƻ>t[> endobj -1927 0 obj +1998 0 obj << /Filter /FlateDecode -/Length 3371 +/Length 3373 >> stream -x]ɎWN@=lƐ#i h1$ZpJ1 ccEG͏r A5 X>_6ᘝr)QHIicMkwxc*jS<<|_?<_{€FPc~=_Wt -!zו)˳*~o.2D1xD穰jYٙr:A:!w?HF`Ǐ_zǜ|Ҕt̋\g~~>5>OFu,&d<u>F(3v.+c 6Ť!=<8S^<3}D)Y؂ FqO|n•hX0a%]vU؟[p1*" 8ndbk$r2Li҅+'˔7֦Uچe4i\pCɪLU e.k>Z1@0vw.-wmwئu8QɻSc#{h:)mРZXlt󆃤%]x9_p -ou=s^۴+`gΥy=F +4􂌁0MQ^>3Β$ -#/!w%3(8ݣrgu> {-%Ei?./b:qYkR vRZmvGz<$lM}EWÒ!1̔*#3C€+_:yYÊ&O4I"dws8|v5:jLz1v-Ng<e9::zcľwfAzz㋩V?.5эl!q>I -b( z˼ 'b!G/jch=9`9.w [|nڒn$oId@mZ'n.8LژO'BٜMEvn--YEZ'H9G HDRE).1q=7a`īu,6drz$Y$3>K^TO~Lǔ6.UP{ADvVSr2ƊxGo' a(I}+^%$kó)l~d#sf*z[6 Qy>ʮHJ#a^/<Ǽki$8n (zFnVҸWi$*C{J#_(tZ$wizxHp讥  ܮ(=ؽJ#7r4|ܬ4^(ܰJF"Ⱦ ػjQI{dUJy[J.(=/!`"hzקs;D5A ΰ1  [r(8"JڰOsƲ{E,2:.H&5F!xF%~)pQY0uV#wS6t?@"pn6\.Fgkv(e"pU/y##{iS^ZGv:9.ZG{:"k#w:"]눲i&! uDs]hڤu:WL.gb`*:* ܶS Pe#6u_^H>ӑk:5WU^ch-ak>*)MU‡Bns2..Nlwiީڶ)Z ^B>Yio&&X ^ȘWޤkދimT;iY;EM;sMICT-5› :6uin6;Ԁȝ 8.|9AdJ?,3{A M> 4 g -_ {3~/xS$_Ml<>5!_dSykr=>Σe萋mӘj0cg~E%3΢^y T4nԙ.c) ˫ 9*Yr^3 -,/݅{mƤWߑ<QiUr~NλW",zGz=VNzRe'-otN:w׭i~M Q zKy7׈L7lR wRTɸղSN]1$3ufpR'];2Y ^s&YY"{姌7A':SM& ->6߳[ة<ưf|DѦK$_&n[7 %w:W'ȝJkL,9V~ΐ R\%<&yNUWs5[|R\V&2gd~}? ^_:CV|?=f41l$RmKڵp{'޿wZw1#nOrV <:v[lYs αe͋Oio)m5BEP7ʵV [ME.:^|;V&~B $P!E%0BXW7ynm5F~ Oac^}ɰ¸ xJJh߆l\ȼԊӁ"aH[HmFۥ6D*v)mқN~EeKNgD L%;4#&Z&gb)=Ee3nhE/:v3l+U Sc%v\Q`?Mr9 5Fa./q7ʮ˫WMvlfأx22 ktm/Nw!F2~rχux>Jn]~Ouu~,c5dJ{1G4zҁuӟǒ)Mcusqا 4W~ލ?ښ)CIŤrH.&]v _IqFhE򯅦598N-dsl|㻪?JyPR{ +x]َ[}Waq'`!@2CZD(O9$_>A/H/=|aB#{y~^)y^WO^V9x+۩+CaMtrXS2@r&΁i*9m?z_s?{ױ2c6y0* i+s*j2.kۗX1d|mO9Nm87Bn>,dQx[gH"oOs#y&A_ #y1yԫv(ߙNj +aC4nM"RZX9oMm9M*?㹉Wޢ9j҄UxB‹VYLq#4[xɰSLֲ=jx5x.,KX +Ỵ;hҸvᆒLΡcٳ Huێ:Υpז׎"Y\Pہts::%m@vV9 )fpMjG> NQ'ڱgΛujڱvV\ +gc0BSL/H1oB9tl%QyIkX,>SMO/k./b,֋;gZLDl 3Ŗbj;'ak/r IgTA ^ʑ5 4 | J&-ǵb]MN~wauJ;'س DduK֜ ] Feb_;3 _ TF &pdwCRKN|Ϸ|!D>qX8Ox 㛃,+A ccOz#ʮHPJ#ᵽ^yyHpJ#Az]K#UU һYi$*^)~4H"^ޥ;]K#F4FtF4Fc*˥=rHTzFvߤ4r.Vc n#wEQ ut׳Kg*<-%p^[s[ ÞF?}aoj=֧s;D5A ΰ1  [r(*4EAڰOsdXet]PMF)j/CvEe=XܡOAD}#f7iExEuM+wi^ udpOԑPGvGu{QGo:"}#":2LC uDs]QG4GmBy%w~ ٫% +FŷtVxܹy a~ڦ ٫ɘug:r^€k,% ~U‡B5JP(m6Pʼn\.U;Ub7x[6(A#~67!ƚ4&MzAZ\QO뽨˝؆חjt'dѱO6guS.&t[j|]7 :6in6;Dȝ0_1\=q\&=rȔ~Xn an4 Ō<-i0?Kh@ ڧKtnȜY끩$B lZeFF"ն$S w).>w".z};=),-cPi`cŖ5[ּ8HM6VC(Tus\@-m۴Y颳ͷcg7ҺJU"YT,ty}l0IC2>$va-yxKJhƋl\ȼ֊ہWÐvڠbSk4D*v)mқN~/&:HmE-H_gU2y C3rmiB~a?+"SVaqC+z8TMg8"U Kc%N\Q`?Mr9)5F7a./q7\SWڛ̰G;d.e h/NO!A +ʵ xݮ\`/ueot@M,U/ٖ8zV!mʸ^͠9pA-٨&Ga=;sb59}7m hoV LQ؜j06ڜz}Wmˆ@DM[:(f%ofx`1<"aڞöC7Tl9S<w]~3ludJ{1G4zVa?%?RMcu0O)4W~ލ05 S!*f}I\XMXzL)0Ϯr"-2-)qloɬ&&O'˰efO}*~,?ij+ endstream endobj -1928 0 obj +1999 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1927 0 R +/Contents 1998 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1929 0 obj +2000 0 obj << /Filter /FlateDecode -/Length 3333 +/Length 3332 >> stream xn#]_E/`06Cy>m?")/2Fb'-J Ax/o)/]%gz|h'\0k@ރW^HZ ZKw\]I鼻(% Mן/?<ן{y&@F:CxXK,{.U DqhiWY^ @@ -27860,132 +28913,129 @@ M h=᱅5v y&g{/(2en!w.[ZU:UX:%g C/L,;IZ[\{#jFnW9vVΙzёl3:ch: x%5"SezBtJ%(Q|{FgS̔L:ZR:0wLz~Sq80^(BI6  Y *'\Oa4.)lnIK]Wf3K:3+O\Wu<`N%~D5sQ3@-'F&xp1HSǡNkpAÚ)Ӝ%ubqԀLzk[1̳r|g&'g ΗQ@mqLxZut*OjC/fifc9Q%kLu'`[%LJ:DNtnǍ|9Nq$oCH%Jbw^m!ܜ{{u^nguh޷)SZHlZtJWhk--qF˃V6XZJ@ 8>qA+x],qݹc+}*'+a7+KxE|oC|^mJpqC瞶/ifھ6 ?Iw9ryR4*kɃɦӷʬst52w:fF+xB,`9'tz63%aҡ`SJz'풧qAxg<ƙ=LFrVgNɶī?oaTem_o I:C?~wP4Nڑn&>˖bem]W*0)j.XnX tKnnmཛA;TT98[L%1}vnlr[&: +H8^`=Atv3܉eD2S>v y&g{/(2en!w.[ZU:UX:%g C/L,;IZ[\{#jFnW9vVΙzёl3:ch: x%5"SezBtJ%(Q|{FgS̔L:ZR:0wLz~Sq80^(BI6  Y *'\Oa4.)lnIK]Wf3K:3+O\Wu<`N%~D5sQ3@-'F&xp1HSǡNkpAÚ)Ӝ%ubqԀLzk[1̳r|g&'g ΗQ@mqLxZut*OjC/fifc9Q%kLu'`[%LJ:DNtnǍ|9Nq$oCH%Jbw^m!ܜ{{u^nguh޷)SZHlZtJWhk--qF˃V6XZJ@ 8>qA+x],qݹc+}*'+a7+KxE|oC|^mJpqC瞶/ifھ6 ?Iw9ryR4*kɃɦӷʬst52w:fF+xB,`9'tz63%aҡ`SJz'풧qAxg<ƙ=LFrVgNɶī?oaTem_o I:C?~wP4Nڑn&>˖bem]W*0)j.XnX Sp͉w}9A:x&@>~4Uq2V9SIu3\Vwt  endstream endobj -1930 0 obj +2001 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1929 0 R +/Contents 2000 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1931 0 obj +2002 0 obj << /Filter /FlateDecode /Length 3630 >> stream -xɮ#9H LIbAznzrof+-qାzz'/ҟ F:{ iW'<Ko*ŌVo_.wA1ǹ*̈`w7/h5=okZ`vP1֜ kdЙYJPx/ELi,VN~?eJO@ǟ?ehIf\ŕ5ǯ\1(pZZ6>m -ˠfԁiTJ>.FiJ*%r\Sn5aD=J *LNn(p, ܈gq tH&[Wpww$I=?CJ3_4l4xҌɜuii Pdi;g%?j%9`EgR5e@ qH%!qa{fGI%:PJhxѱl[ -Đ*_tL^ȲO^J1J^XuK^p&Y7 -p^Hn yQyALkI׮eY Nykib~!GdZnNMH뵒PRe1B!)3chxٶ_nP<~ !^"'mOMIB٢C0,ʠB Nk5E<%j g K"]w=ER6y਼ $fTĉ:RUAģ-x eFz{Kp?mi4v2Pnv1ل=D#SD)uh(*7kY(e\̲t`eXWycij"9 bM5[dOג {T3!d-%F 4P_?xϚ7vݤdDl<9`Y5[p3&NYJ!'6csLϯ( N]#-$ #YCKa ̊{Ԭ1T]o A.}}XK1HjOTS%eMUNZkurAEV4KUCf '1fZ/2 X{'Cfo3g{hX[`N@WI+0q!eV`-Xj1- ɮ>[[@iv>"j)kOp{ͤe~v;[%8z1\Qt13jdP<هwh c y,ךmn3 >~4$|/(5mB9 \" T3tB5#x|[CTD_<#i !/cCδ3OhtnC;`z+x_ 57A?9 c s3|TI -^ǿڸA\ gù0MQxd3XЃr]b2?0F +xˎ#fM`MrpI 9h`Rd?XTMRH5dW wE +o%˟X]>Z5aBJZ kO\}IPJX. ǯ?_ןs@@1~;+-uKc-EtnrPY\Vyc!CKZ02: +W^[y)e͏??d~RW +VH4nVW*668? H*2ŝOۇpP`8zhkO;‚Z'ˠhmPC؈ 0~(FԹPucrdaq9vchHWusnL9 y(x6 ̶uKcݮ],-.ՏgW/sh,;WQ=k][M5h8P6FW5|EUQ&O;Ũ~>Tx]5q9x^:@|nyx^ÝБ'3FHRQf34SvN欓MJ liuJ"~Jr(KCdT^ 3X! e `q(0Ip=3գXL%O2X6l[?\1ya~򲥾䅉U &/z#YA΃n4/* )Hڵl?=K>(olJO7d8V4l[h(W.& =1k&5C0pz -uz)+{"-&F lIUxpZ{%.i $4X!/,tHHLٜ. '7{L\@J=KANX{4(hdh˃@c wFRҠU7kY(e\첗t`eXWecij"%`bM5B`ZlO|0 {F +CKQC&.OEjr-G4Gh 5l]63o̪ET(9[f||?فg:dИJp9+ OvL:;2ڕ/Q$E~BC!{)Gi^o~*tesb3\;A%-nWXp% %+Qn*ŖNws)靌I:qm!m[=x&P-\~py!\;dMNTC)ix!mW`-Xj " WK-}%K~-A`4Jd΃Vp@6'{LfRvi??b]Qm鬋c^g!>CchL>7)35llc&8*rr Ue Viࡃ\z86fopZx^#f*Sش1w=; 2US[ 80!}Ϋv#ٹs{hB:}t6#O:ƹ7VsD2Cf6 S{{g>b1-K|Q=nt!{%3W +Bxc%Jqv5ۭyݏrZ})ÊxU7wu* VhX)=`:2bKz6[SǔP\$q{ jzfZH鏸Jtk ηіX4]h̓W_)&ZI ENtsAфrWe1XA4ańV, /O7 M9X0ޑ] q) r9[>.{q8GtߞbK$cadSc%<^eSVMڦ͙(bڜ͍;a%i21&D5Zbg ״s B<ʄ[M;,t& +5l]EzYfsn0rBhd4;>dw}4>ѵ|;)~$腱Lt::NqUh:lX&.wk[z“VdJ5l}ĭc!qv ǥ9Q=prtmCӱqv~XsQ(}3Qx75adRK7w6^Ja){Rtfmsp5rgɬLj)KpDHט(Rp۶KoˇEͦ0Sq*[*4I^:h&e  ÚEJ1Gv^t drl+; 2'BHJϲ4] ҽ^~!H€=>n3 !}놲$|ܯ(5ΜlB9pjD{g+֌IcCm4QD ex{;SR;.\Vk2լ?oBg[x`%fSt@pjW6Pe)6%Qc=6:WƎ`D ˶5F(u9Ą7;7|K5ߢ?mWKg/[wtA<eίf~l9 .9k}SL9 +„M1tu{ט v$\YHVT/V$0Tr 8WbثHX4㻌2UEߦ=bO)͑Kd=lRUyƤ[yVCo)_ߛy|#1cIIR.gbաiB.]k5 o5oKТ)/8kUt=^y(6k;7&vQ:l CKh0'☄wCņ֎̡KAD5/Eg^  +<% +W~>[v{NsTjەu֘jLK-5Or&V݂y@P1tW.ۺ&b@9w +[lY)/-v6<,}s&.% z9gG.bj%:/ϡB7|>HQ& R7P[Yӟkrlix:كMҷ +߇i`uF:)0nt~Z8^B сAA- }4MQtd3XЃ}fl2_/ endstream endobj -1932 0 obj +2003 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1931 0 R +/Contents 2002 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1933 0 obj +2004 0 obj << /Filter /FlateDecode -/Length 4008 +/Length 4007 >> stream -x]n$}}y$& a$[~@.ki*. #uD^n\,wVSI$z3{z}9 Br:sƨb:RRhpοx?! 1Z8|tu_tO/_{'̭FEf޿_|j@[ab4RJa\ztw0In>|#)>F]/=ϻWkϓ.G61?%hbH=My)R;ҏ֩ t1+EI&J5yjL Z_N|/wgEZ[yr׷kLÿϟ>)ft$F`r좠%RA t -Q 8ww}gVxךBdPxMi,$ -ᦉ|z!4"etSAIqVRI(L,=`0t*'B9Aô.rBZC;5`AŊTy-I~u);^+;V N˽Y4OsVsK{k[kyY~M}<3sڍIH?8>Tu /wy#`%8JvOq,NrEn 彑.j+ xb3Z3ഓi -aBn1炍((͎'|&F˘.:ZnX\u%|F)9OIo 2#UӨ|nnvo! 1QX4YZU8a]f?5h. Z&i?ɭ;.hn2y >P _z##箊 XK`[ᆙ뎊FkrmO)91,[))d\0-_8NYxG> ERFx>-2* -<Z!9:Ʈi;$睃LjC;۔;`[պk,[]>S.;(rt\MCc\xfY'x?taݡKihb*l9U2zX¾VKj]0 &~hM(C&=arzN'5+ŘHCh1:Z =cXh11E=GUaIpiUJP1c-zr*^Z Z N-FG8 `bThqncEŨ팢-.@Q5h1:Qr,{A+W-F}c-F7 -@=ޙr6R s _-E< nb񪉉ۻˣsۻqCaƁr.Ca;*+$k GÏUyf)7 )`}%D5՝ q$cōLdw^}0(yu뻕p x4EpRQAA%l@Yt6B!t=gh 8{ {Nuk,W98¥8KRyV!.ŞC}KP'"`n:=L -͛P+<0(pmoAb.fԱR[\]71#ݗ - - fm0184 0`7 -2*\A7VAՀizi9:O/e4VK>MD6H;@' [$ }6Md[5P)r5h7׳!2;r1j/r #KӰ g9VP -6JjyFX0\@ ˰n*q:C{SXD Սem7|@ >&ǨE%bjB;$L1stZ90z7Mnjbw6z=כX=Ǻi`yi1ziqzaZ47/\pz0z:0z~wpzިqN_:zJ2{:sZEϧ3CbP]gl98+z~/E*bFFs^\;Z=a1Pa,rU,l{nbd]Z,8 QNwdGmLQ,ۇD 3cBDzlPQ,=ebٕSxk|{wƲLe˘ -8z觖`n]SQcVV*0v j 9FEQSpj٪RgJu#h:v'f|Qop W1:WZh+Dn׸wVS8=BW?JW<+I93غ(%2ZfgyepX8+'"g釗4:@T"xYc4*u^ _ GdF^x`ڦz O}S@2^W -S֛xYZs m/>^d -}D(@қªv1'OeO1Dsʃ2M5)!am"kc6xZ)Ah~J'$}aRQ.zN'XM~:5pX(cJs#2K s&2Di$X?+{1=E=9bZ2ܴ6qoVʆ)?lvynvΣgKYzE7^< 5jtԚr #RzЇLEţٸ -eue9wNzlesM;`kh5u!?ӤzNir㛇h-Ӏh0hNY8O;,O%#R.:I5/=}ׯ4Nғ6?Z:oQuvO?x!>V*|˂fX]W&/!񁂸LQ 1oJƘBgI 2H{9B\:$Fc]OrT&14ddØ 4q?t. +x]n$W8s0` 0|R.pd-]˥CC],fD"+Y1ӗI7qfr2AtdQt* +6t12NC2"Hb8+p*ꜿ~g%^LjZ߽߯斅_NfsJ?_/>_ 01ynNX`0.Wz;$u7WO>m晔?|\f. oϻy*zy}pdQc/Etݞ?o/K +ޑ~tNaQ_)Nj 0Q`Jʞ?r滏_;+-ӿXcj^}O5Kđ5c0Α +ZxT(KbSpҚBdPxKc&S 0o"m=^9M/0gƳ{*4()nߪ^*IV?yd҃ Ar"a^tibt_&[gtsuF]/t:ӵLgOƤ5H^ k`5btW5W^g55@Fh{K,Ńłѽc[,h:[9[z/o~W,[iz4]3K ֫N5fs~SzR{1{1֯"{h@AQLbE֖$yͺ^,u2:֚c^ߧAgyS")*N ݇ݽ(Ał]Fȃwά]")_3icz<kSఓi +ca&b9Υ6n$#O$fː.:[nX>"%\m3 Zؔzk[rH4+ǴLЎ-*6&WT ] 8XK4 3s.ڞVFs fcX R(S<`,[dqN Yxg>O +"`#,DžOKDi J'e=)W-BycW贄s!Ɏmj5*[]>Sn;(rt\MCcXxfY<PΥ A01X6?*q=a_\udZIwN}n>4J +M(C&=$O*kW1bt-{,荃qw ,nm,mU]jIpaUJP1c,zr*^X X K3Az`1HXt,mUWbt`qQ`1ꂝxf,F0 +We_1hżC*ŨoF&6e;bQFd KG4]Cbf*V4^ 1ap{wytn{7n(8oe(lXSc$p{~Z#gU&=APB9 +QBTSIF2Y;DNv'镺6n}\e4.sx,hj)ҨLFqBEYt67B)t=ghq&dX,0ppKq0Х"$m79C\=Hbϡw)D&D-{(~5U+R޻6oFZa D)gѱtJA *YY):֪Ut}!msB-T,K`bphb`@2 + Mcĥo6RUŚ=z樜^z3iᷳb.7c mg,`ToM'uXmzwBUl̜B)NPN~\^}s?;PEfG6A>F-:EΛadku_ yޝCmJf^)=nj  ReRq:/VՋ썹d%^\v+ +4BFE>G)GEc1jQNǮ3sa@ <1zyv^7wsqĚ9F c筦ۦyiqxi(Fl%躎 AFlX ({Bٕ WC e|C &ւA22&أPvi C=P6*(UV eog?t(:(}w0ݪq_*r2e #}7Fut7V,vUo s^)oбR RTnbۻ+RJ &WoTRcw))]ŊXcZ<[ }dVv5˪xгMPtUol}[9|`j1w3/G 9)u= װjѯ]PC~DuJ"4j` ʹb|#7YSX^ЙOXRGw+@sЫBq{DF@zUiwX*P r,,jsбG;E=SK0tܮة|BYun`++ }< ]{BAQ"4ܷZxtAY˾n\L 7jC^>wa5U +{9C r-95+T+{G=F08qPzD..al"JE L2F}^;@lg[ETQD":<@罎z~9YwEFc +9B'ҨEx5|6.:2#oLy[2>+-|Iq}Frg endstream endobj -1934 0 obj +2005 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1933 0 R +/Contents 2004 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1935 0 obj +2006 0 obj << /Filter /FlateDecode -/Length 4069 +/Length 4071 >> stream -x]Ko$W@hB@ AV%`n6.6)!,KfU},~U,=w`gΜ/#WsHgoA3gBpRhᧇ<]Pq !%3"Xo;-~÷O/}xA@S&fB%_Ll*).to@Mt4Y )Oћjfe2w9] `o:EQ>|y/?w><"W=uhӖk.VF}jHQB(D$shC+Ok}۱ܑzяir?~XuijrjIکi/gʸuOkp`l~>; HZ|vӷ~Ɠ2f~dyvcW2òI7ڟ%q˽g[gۗ\)fۢI1ڰ`rI"YqhQYh)Uf2}ϯsǽ;*o? |{߫1\̽ @+p18= W:h -XsL$:QGߛXyf1^0zBQ&f""qV4{3zC\C0v({}6c' -q)ͬ}a*[JϞ㈞1={~,_ć|=tN(,:J ǴtnR58gIJagWhc9[Z^T4 < $VB9+jWW!3Vrf<91L,|eTKBJ-$#)M8i+IDPt _Kn,~ Z'00I V DwcJpq$(cK݋-QQ/@KlB=4,PDLcLl֒8c`ơT0@ -lT1ro8xbV30s ڻqРv4 %U8b?S+} w&fg1d5Hۀv$:ƂV{sG?MdUr3+n-dV@\}OBd+P ƵZX00WVUw0EoEwGQ O# J{l!f\3"H QzB*t. -iQBrB+fDz@,}"|27J0 -g1 -_.7BĹҍy&Ũ}"?nC̶b}Yzʫ Nd‰Dlw4r +VzǬ @rɹSTh2DɊ.Xl`(LKDn1kmCi^m!xO慗`/ѝ DCD2#].LB/l~Q(E'銳fC̣Lωb]猣͢DT46zhldj>xJ4C_k]*%maZD%pG -Tז*I5xAq6l.w^2,BÎ>]@uжKhDxy&j9 Uºb=/+4hOEtf$DyHlHs %Vmcq*m!In6eD;;"N>5Y]:LnX&ʋM6 dA}$RJuT[ǓH)uP\\Հ)fޟ6jK^@f^ ` /eyKo͇Mu=%,aD ,ܲs'T ; KJZB0l2"QvbQRWЀrVA~>ېIrnu"F,E(Ʋ-.T !Mf8BzPX6 -M  -7v"ʋ٫;^:PE콮, (@3u]+l0EN˦p=HfUl&r7Jа7m;GoD{y\z~{"xռDμ(oy8ÕWlje^N#)灣"=8Q^|z (r ŵ8&di֮k7e~wp& -^ -{r~Й(3QV}-z^o jz HDYUlAkpWXAO9/ (/&WH&UHjҭ0 JE]gq";&=.J>RC$Cta\֧6R17sA(7"S vd-jL@q|݋Tr ]7M͍ ^zLlqH ;O9/3mF'R9LhOLbT -#MZ";QӇnbz E;؉AiCp<"(NwFŃo*../$$\{HB{ڌ&|8{ߨl&;lꬾ/Ou9CL?=~*Lvus mnUTmGf>0Y>o`IKӂ$zQ(wk%Ow{ٖu먱NohؾYRj]}7ѣ8n6. r;X]#R#jչdDy.[J -aSbv  cҔ^ULrJ㲗hkm4̨nnGFӪsSDyd`~Au|`͟z-\:@sa2LJv{9P-u(ol0BבUAlwGRt@Gg&?YgL7PSPF5j0ߡRhiy*Q{wfc6O^Q4yAl?O\v]`*UhX06V(6 v;DLl~g]{-ψ=X V^GOSa&4ZvU51,tϧX-/j:?SyqkeU*G8ĶG2U8`?W;JgE+`7CpԵ?~~㿥g`(~wpӔy5!뵭/su|(=h$.>D l=GUnR>+f?>8:=:tB -S^ +x]Ko$W@hB@ AV%`n6.6)!,3ͪXX$[w`gΜ/}%WsHgoA3gBpRhᧇ<]Pq !%3"Xo'-~÷O/}xA@S&fB%_Ll*).to@Mt4Y )O?чjfe2w9] `o:EQ>|y/?w><"w=uhӖk.VF}jHQB(D$shC;Ok}۱ܑzяir?~Xu~I59 ۤAT`JOô\×3e:p5x8 !}+jv&v߿rjT5]췖IVH몙`(yAC m 7P"סsy c'xS(!"B@R/ǘ?PF}9<=_"Y +6`x-XHlbPfB$IPzC Bcɽ] /n/SxR̟QgHkw 0vu,C1,tY^IzkkKzu}6}FOr'=A׆K̊k@"@KR6AO@|{~=@u;%w1(V13~YsGxYZddUdp_1rA3/Uc'qԉ|>t3k٠tЋ4p7L!;̧ك{zF/wAW|F13;QXLif=S ݪ%lvVzG y3`y">sBg񀞖N?VJ8svY{W[AblC&-ˡաXq:PeZ4e]BB( +qBll{K'*"boDp (Wwtѡ {]Y,Z#P f*vWZa[M.z-yyv{xJr5,dƥ7AIV~`aAMPvKۇ=H<e{)]+pcb22ՄR!^LebN3[[VlDMd9hɔj^8Jg&$S^my:p%qB/QQy}̪yMo"וao"6vƏV߈Ey&yQp+ϯ>"ʼ_cGDSGEzpz@QRAkqLR]n+pL $3QDqgZ[g[t4@eg .AAɉ質زكj_U]iV7f_ +T s^@Q_Ld.M䫐.;[51`@4Q2q9DwLzd]<b)}HløOQm!coIC"2Q\oDZ +Z"2Q6ERion"!{-]S, %(5"0\72w s6_fD:ONr*О٩("FDDvW=sdv%69xD8n7Pl' 7ޤU]\_^i !IHSM:Pp$Q$M\w6hY}'?_(|7M5#r쇊"~z,9T\Q$ h߫&#ڎ2}`p8}",&2eI<0Q(J>:-'Qc/Ѱ}DoGql\]vFZFԪsw҉97D9O]@F[æG +)38Ы)Ƚ䶕e/5νhQ.#gcU/Lw@FC:?[y+l[t؁hd\;`sT9Z0;Q_ `x#5A5NxH[Ţj3hPʞ>6"T͟V غZ(l$4qQh8tR"F}m9 +Rma +T hhD}}4,-#qMC(Ij=S5EM.f᚞1@MUBM ר8j~bK屫D2eN׸+t-G(t[&!0 +Y)b 0 N@7>gRGGޕNSa*<=^g endstream endobj -1936 0 obj +2007 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1935 0 R +/Contents 2006 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1937 0 obj +2008 0 obj << /Filter /FlateDecode -/Length 3462 +/Length 3463 >> stream x]Ɏ)p_ÇNrH$9tksx@~RU_KKl;qCVwI,J%N*c @@ -28005,807 +29055,96 @@ j ~q%ajGv_oCs65q]IӪuFKMrsOvힹָٮ0sO\":*52-;Ĩs4S3vi?;jnj2v^!mzOy-Jc_z[Z2nvmH"9`acez4wqruq[pvXXb3`]#N_K ى^`3wr4\5J-֦drܦhN9&_^*x~YtAMcWMụDU: p6Q2/`6 +CG}:^ܞ:AnwM93~rS~ eE'G5ƣ}'PbyuSD摵RyDqa2/H։PK sl>b|$~~(cv%=<;!b׆( iwy `mw{ Νmp;[_ u)zZ_olg ;c0;m *b-(aGzص=ް\;> (܎ e1G~O;Q|5 g g -3%FLG1:kz(}No OG/oEqg0:c# Xv\bvY{ FvYJB9@XoHqj>~x&wG72ϕe\Ds'^.菗F%(Ce !4}d#g!׽3A/jZj|L^=ky>H=g܎l{޸6SɏԢn *ڽo;|jWډ\=a#VD??}8gݢP"Hj˜Na_xe)2.\̯EiƇի9(bNʬ_t:yHr.wu9Awf%9s@0wW#|4}ӄ!B? ?N +3%FLG1:kz(}No OG/oEqg0:c# Xv\bvY{ FvYJB9@XoHqj>~x&wG72ϕe\Ds'^.菗F%(Ce !4}d#g!׽3A/jZj|L^=ky>H=g܎l{޸6SɏԢn *ڽo;|jWډ\=a#VD??}8gݢP"Hj˜Na_xe)2.\̯EiƇի9(bNʬ_t:yH+u{F+wy]@-&ݰAI\/7?ݕa,B!o4}9+@zt> endstream endobj -1938 0 obj +2009 0 obj << /Type /Page /Parent 1 0 R /MediaBox [ 0 0 595.275591 841.889764 ] -/Contents 1937 0 R +/Contents 2008 0 R /Resources 4 0 R /TrimBox [ 0 0 595.275591 841.889764 ] /BleedBox [ 0 0 595.275591 841.889764 ] >> endobj -1939 0 obj +2010 0 obj << /Title (Documentation Track Trends) /Dest [ 6 0 R /XYZ 69.746457 512.280482 0 ] /Count 0 -/Next 1940 0 R -/Parent 2119 0 R ->> -endobj -1940 0 obj -<< -/Title (1. Rapport Track Trends V1.0) -/Dest [ 484 0 R /XYZ 39.386457 757.223622 0 ] -/Count 90 -/Prev 1939 0 R -/First 1941 0 R -/Last 2030 0 R -/Next 2031 0 R -/Parent 2119 0 R ->> -endobj -1941 0 obj -<< -/Title (1.1 Introduction) -/Dest [ 490 0 R /XYZ 39.386457 723.165222 0 ] -/Count 3 -/First 1942 0 R -/Last 1944 0 R -/Parent 1940 0 R -/Next 1945 0 R ->> -endobj -1942 0 obj -<< -/Title -/Dest [ 490 0 R /XYZ 39.386457 667.603722 0 ] -/Count 0 -/Parent 1941 0 R -/Next 1943 0 R ->> -endobj -1943 0 obj -<< -/Title (1.1.2 Abstract) -/Dest [ 496 0 R /XYZ 39.386457 771.023622 0 ] -/Count 0 -/Prev 1942 0 R -/Parent 1941 0 R -/Next 1944 0 R ->> -endobj -1944 0 obj -<< -/Title (1.1.3 Description du besoin) -/Dest [ 496 0 R /XYZ 39.386457 343.911222 0 ] -/Count 0 -/Prev 1943 0 R -/Parent 1941 0 R ->> -endobj -1945 0 obj -<< -/Title (1.2 Cahier des charges) -/Dest [ 498 0 R /XYZ 39.386457 550.499622 0 ] -/Count 4 -/Prev 1941 0 R -/First 1946 0 R -/Last 1949 0 R -/Parent 1940 0 R -/Next 1950 0 R ->> -endobj -1946 0 obj -<< -/Title (1.2.1 Projet) -/Dest [ 498 0 R /XYZ 39.386457 435.818922 0 ] -/Count 0 -/Parent 1945 0 R -/Next 1947 0 R ->> -endobj -1947 0 obj -<< -/Title -/Dest [ 500 0 R /XYZ 39.386457 771.023622 0 ] -/Count 0 -/Prev 1946 0 R -/Parent 1945 0 R -/Next 1948 0 R ->> -endobj -1948 0 obj -<< -/Title (1.2.3 Cas d'utilisation) -/Dest [ 508 0 R /XYZ 39.386457 412.926066 0 ] -/Count 0 -/Prev 1947 0 R -/Parent 1945 0 R -/Next 1949 0 R ->> -endobj -1949 0 obj -<< -/Title -/Dest [ 512 0 R /XYZ 39.386457 638.709222 0 ] -/Count 0 -/Prev 1948 0 R -/Parent 1945 0 R ->> -endobj -1950 0 obj -<< -/Title -/Dest [ 512 0 R /XYZ 39.386457 368.746422 0 ] -/Count 0 -/Prev 1945 0 R -/Parent 1940 0 R -/Next 1951 0 R ->> -endobj -1951 0 obj -<< -/Title -/Dest [ 512 0 R /XYZ 39.386457 279.402522 0 ] -/Count 19 -/Prev 1950 0 R -/First 1952 0 R -/Last 1952 0 R -/Parent 1940 0 R -/Next 1971 0 R ->> -endobj -1952 0 obj -<< -/Title -/Dest [ 514 0 R /XYZ 39.386457 771.023622 0 ] -/Count 18 -/First 1953 0 R -/Last 1968 0 R -/Parent 1951 0 R ->> -endobj -1953 0 obj -<< -/Title (PT) -/Dest [ 514 0 R /XYZ 42.836457 580.332822 0 ] -/Count 1 -/First 1954 0 R -/Last 1954 0 R -/Parent 1952 0 R -/Next 1955 0 R ->> -endobj -1954 0 obj -<< -/Title -/Dest [ 514 0 R /XYZ 42.836457 531.536022 0 ] -/Count 0 -/Parent 1953 0 R ->> -endobj -1955 0 obj -<< -/Title (DT) -/Dest [ 514 0 R /XYZ 42.836457 404.984502 0 ] -/Count 6 -/Prev 1953 0 R -/First 1956 0 R -/Last 1961 0 R -/Parent 1952 0 R -/Next 1962 0 R ->> -endobj -1956 0 obj -<< -/Title -/Dest [ 514 0 R /XYZ 42.836457 341.173302 0 ] -/Count 0 -/Parent 1955 0 R -/Next 1957 0 R ->> -endobj -1957 0 obj -<< -/Title (DT2 Documentation Analyse de l'existant \(2\)) -/Dest [ 514 0 R /XYZ 42.836457 225.937782 0 ] -/Count 0 -/Prev 1956 0 R -/Parent 1955 0 R -/Next 1958 0 R ->> -endobj -1958 0 obj -<< -/Title (DT3 Documentation Analyse organique \(5\)) -/Dest [ 514 0 R /XYZ 42.836457 140.731062 0 ] -/Count 0 -/Prev 1957 0 R -/Parent 1955 0 R -/Next 1959 0 R ->> -endobj -1959 0 obj -<< -/Title (DT4 Documentation Analyse fonctionnelle \(2\)) -/Dest [ 516 0 R /XYZ 42.836457 692.198022 0 ] -/Count 0 -/Prev 1958 0 R -/Parent 1955 0 R -/Next 1960 0 R ->> -endobj -1960 0 obj -<< -/Title (DT5 Documentation Tests \(1\)) -/Dest [ 516 0 R /XYZ 42.836457 552.564102 0 ] -/Count 0 -/Prev 1959 0 R -/Parent 1955 0 R -/Next 1961 0 R ->> -endobj -1961 0 obj -<< -/Title (DT6 Documentation Reste \(2\)) -/Dest [ 516 0 R /XYZ 42.836457 476.741382 0 ] -/Count 0 -/Prev 1960 0 R -/Parent 1955 0 R ->> -endobj -1962 0 obj -<< -/Title (PT) -/Dest [ 516 0 R /XYZ 42.836457 374.588262 0 ] -/Count 5 -/Prev 1955 0 R -/First 1963 0 R -/Last 1967 0 R -/Parent 1952 0 R -/Next 1968 0 R ->> -endobj -1963 0 obj -<< -/Title -/Dest [ 516 0 R /XYZ 42.836457 310.777062 0 ] -/Count 0 -/Parent 1962 0 R -/Next 1964 0 R ->> -endobj -1964 0 obj -<< -/Title (PT2 Programmation OCR \(5\)) -/Dest [ 518 0 R /XYZ 42.836457 771.023622 0 ] -/Count 0 -/Prev 1963 0 R -/Parent 1962 0 R -/Next 1965 0 R ->> -endobj -1965 0 obj -<< -/Title -/Dest [ 518 0 R /XYZ 42.836457 625.759302 0 ] -/Count 0 -/Prev 1964 0 R -/Parent 1962 0 R -/Next 1966 0 R ->> -endobj -1966 0 obj -<< -/Title (PT4 Programmation Vue de l'APP \(5\)) -/Dest [ 518 0 R /XYZ 42.836457 495.509382 0 ] -/Count 0 -/Prev 1965 0 R -/Parent 1962 0 R -/Next 1967 0 R ->> -endobj -1967 0 obj -<< -/Title (PT5 Programmation mise en commun \(3\)) -/Dest [ 518 0 R /XYZ 42.836457 365.259462 0 ] -/Count 0 -/Prev 1966 0 R -/Parent 1962 0 R ->> -endobj -1968 0 obj -<< -/Title (TT) -/Dest [ 518 0 R /XYZ 42.836457 238.707942 0 ] -/Count 2 -/Prev 1962 0 R -/First 1969 0 R -/Last 1970 0 R -/Parent 1952 0 R ->> -endobj -1969 0 obj -<< -/Title (TT1 Tests OCR \(2\)) -/Dest [ 518 0 R /XYZ 42.836457 174.896742 0 ] -/Count 0 -/Parent 1968 0 R -/Next 1970 0 R ->> -endobj -1970 0 obj -<< -/Title (TT2 Tests finaux \(2\)) -/Dest [ 520 0 R /XYZ 42.836457 662.169222 0 ] -/Count 0 -/Prev 1969 0 R -/Parent 1968 0 R ->> -endobj -1971 0 obj -<< -/Title -/Dest [ 520 0 R /XYZ 39.386457 517.843302 0 ] -/Count 0 -/Prev 1951 0 R -/Parent 1940 0 R -/Next 1972 0 R ->> -endobj -1972 0 obj -<< -/Title (1.6 Analyse fonctionnelle) -/Dest [ 520 0 R /XYZ 39.386457 428.499402 0 ] -/Count 0 -/Prev 1971 0 R -/Parent 1940 0 R -/Next 1973 0 R ->> -endobj -1973 0 obj -<< -/Title (1.7 Analyse Organique) -/Dest [ 520 0 R /XYZ 39.386457 339.155502 0 ] -/Count 46 -/Prev 1972 0 R -/First 1974 0 R -/Last 2014 0 R -/Parent 1940 0 R -/Next 2020 0 R ->> -endobj -1974 0 obj -<< -/Title -/Dest [ 520 0 R /XYZ 39.386457 283.594002 0 ] -/Count 0 -/Parent 1973 0 R -/Next 1975 0 R ->> -endobj -1975 0 obj -<< -/Title -/Dest [ 520 0 R /XYZ 39.386457 222.457602 0 ] -/Count 5 -/Prev 1974 0 R -/First 1976 0 R -/Last 1980 0 R -/Parent 1973 0 R -/Next 1981 0 R ->> -endobj -1976 0 obj -<< -/Title (Selenium) -/Dest [ 520 0 R /XYZ 42.836457 104.962002 0 ] -/Count 0 -/Parent 1975 0 R -/Next 1977 0 R ->> -endobj -1977 0 obj -<< -/Title (CSharp) -/Dest [ 534 0 R /XYZ 42.836457 487.571622 0 ] -/Count 0 -/Prev 1976 0 R -/Parent 1975 0 R -/Next 1978 0 R ->> -endobj -1978 0 obj -<< -/Title (Python?) -/Dest [ 539 0 R /XYZ 42.836457 517.600422 0 ] -/Count 0 -/Prev 1977 0 R -/Parent 1975 0 R -/Next 1979 0 R ->> -endobj -1979 0 obj -<< -/Title (Firefox) -/Dest [ 544 0 R /XYZ 42.836457 389.978022 0 ] -/Count 0 -/Prev 1978 0 R -/Parent 1975 0 R -/Next 1980 0 R ->> -endobj -1980 0 obj -<< -/Title (Tesseract) -/Dest [ 551 0 R /XYZ 42.836457 611.440422 0 ] -/Count 0 -/Prev 1979 0 R -/Parent 1975 0 R ->> -endobj -1981 0 obj -<< -/Title -/Dest [ 551 0 R /XYZ 39.386457 435.021222 0 ] -/Count 5 -/Prev 1975 0 R -/First 1982 0 R -/Last 1986 0 R -/Parent 1973 0 R -/Next 1987 0 R ->> -endobj -1982 0 obj -<< -/Title (Les briques principales) -/Dest [ 551 0 R /XYZ 42.836457 326.909622 0 ] -/Count 3 -/First 1983 0 R -/Last 1985 0 R -/Parent 1981 0 R -/Next 1986 0 R ->> -endobj -1983 0 obj -<< -/Title -/Dest [ 551 0 R /XYZ 42.836457 263.098422 0 ] -/Count 0 -/Parent 1982 0 R -/Next 1984 0 R ->> -endobj -1984 0 obj -<< -/Title (OCR) -/Dest [ 554 0 R /XYZ 42.836457 95.795299 0 ] -/Count 0 -/Prev 1983 0 R -/Parent 1982 0 R -/Next 1985 0 R ->> -endobj -1985 0 obj -<< -/Title (Traitement et affichage) -/Dest [ 559 0 R /XYZ 42.836457 122.598958 0 ] -/Count 0 -/Prev 1984 0 R -/Parent 1982 0 R ->> -endobj -1986 0 obj -<< -/Title -/Dest [ 564 0 R /XYZ 42.836457 187.703299 0 ] -/Count 0 -/Prev 1982 0 R -/Parent 1981 0 R ->> -endobj -1987 0 obj -<< -/Title -/Dest [ 573 0 R /XYZ 39.386457 253.026822 0 ] -/Count 10 -/Prev 1981 0 R -/First 1988 0 R -/Last 1992 0 R -/Parent 1973 0 R -/Next 1998 0 R ->> -endobj -1988 0 obj -<< -/Title (Comment faire ?) -/Dest [ 582 0 R /XYZ 42.836457 735.309222 0 ] -/Count 0 -/Parent 1987 0 R -/Next 1989 0 R ->> -endobj -1989 0 obj -<< -/Title (Simuler un navigateur ?) -/Dest [ 582 0 R /XYZ 42.836457 106.526022 0 ] -/Count 0 -/Prev 1988 0 R -/Parent 1987 0 R -/Next 1990 0 R ->> -endobj -1990 0 obj -<< -/Title -/Dest [ 589 0 R /XYZ 42.836457 387.800022 0 ] -/Count 0 -/Prev 1989 0 R -/Parent 1987 0 R -/Next 1991 0 R ->> -endobj -1991 0 obj -<< -/Title -/Dest [ 596 0 R /XYZ 42.836457 409.684422 0 ] -/Count 0 -/Prev 1990 0 R -/Parent 1987 0 R -/Next 1992 0 R ->> -endobj -1992 0 obj -<< -/Title (Calibration) -/Dest [ 604 0 R /XYZ 42.836457 579.426906 0 ] -/Count 5 -/Prev 1991 0 R -/First 1993 0 R -/Last 1997 0 R -/Parent 1987 0 R ->> -endobj -1993 0 obj -<< -/Title (Liste des pilotes) -/Dest [ 606 0 R /XYZ 42.836457 771.023622 0 ] -/Count 0 -/Parent 1992 0 R -/Next 1994 0 R ->> -endobj -1994 0 obj -<< -/Title (Zone principale) -/Dest [ 606 0 R /XYZ 42.836457 640.773702 0 ] -/Count 0 -/Prev 1993 0 R -/Parent 1992 0 R -/Next 1995 0 R ->> -endobj -1995 0 obj -<< -/Title (Zones pilotes) -/Dest [ 606 0 R /XYZ 42.836457 316.153201 0 ] -/Count 0 -/Prev 1994 0 R -/Parent 1992 0 R -/Next 1996 0 R ->> -endobj -1996 0 obj -<< -/Title (Windows pilotes) -/Dest [ 616 0 R /XYZ 42.836457 363.762714 0 ] -/Count 0 -/Prev 1995 0 R -/Parent 1992 0 R -/Next 1997 0 R ->> -endobj -1997 0 obj -<< -/Title (Stockage) -/Dest [ 625 0 R /XYZ 42.836457 646.430022 0 ] -/Count 0 -/Prev 1996 0 R -/Parent 1992 0 R ->> -endobj -1998 0 obj -<< -/Title (1.7.5 OCR) -/Dest [ 633 0 R /XYZ 39.386457 303.179610 0 ] -/Count 9 -/Prev 1987 0 R -/First 1999 0 R -/Last 1999 0 R -/Parent 1973 0 R -/Next 2008 0 R ->> -endobj -1999 0 obj -<< -/Title -/Dest [ 635 0 R /XYZ 42.836457 771.023622 0 ] -/Count 8 -/First 2000 0 R -/Last 2000 0 R -/Parent 1998 0 R ->> -endobj -2000 0 obj -<< -/Title (Filtres et traitement) -/Dest [ 669 0 R /XYZ 42.836457 237.136277 0 ] -/Count 7 -/First 2001 0 R -/Last 2007 0 R -/Parent 1999 0 R ->> -endobj -2001 0 obj -<< -/Title (Texte) -/Dest [ 691 0 R /XYZ 42.836457 369.234822 0 ] -/Count 0 -/Parent 2000 0 R -/Next 2002 0 R ->> -endobj -2002 0 obj -<< -/Title (Chiffres) -/Dest [ 712 0 R /XYZ 42.836457 460.413222 0 ] -/Count 0 -/Prev 2001 0 R -/Parent 2000 0 R -/Next 2003 0 R ->> -endobj -2003 0 obj -<< -/Title (les chiffres \(2\)) -/Dest [ 736 0 R /XYZ 42.836457 569.267622 0 ] -/Count 0 -/Prev 2002 0 R -/Parent 2000 0 R -/Next 2004 0 R ->> -endobj -2004 0 obj -<< -/Title (Pneus) -/Dest [ 736 0 R /XYZ 42.836457 523.473702 0 ] -/Count 0 -/Prev 2003 0 R -/Parent 2000 0 R -/Next 2005 0 R ->> -endobj -2005 0 obj -<< -/Title (DRS) -/Dest [ 802 0 R /XYZ 42.836457 584.282022 0 ] -/Count 0 -/Prev 2004 0 R -/Parent 2000 0 R -/Next 2006 0 R ->> -endobj -2006 0 obj -<< -/Title (Filtres et methodes sur les images) -/Dest [ 802 0 R /XYZ 42.836457 523.473702 0 ] -/Count 0 -/Prev 2005 0 R -/Parent 2000 0 R -/Next 2007 0 R ->> -endobj -2007 0 obj -<< -/Title -/Dest [ 816 0 R /XYZ 42.836457 371.265222 0 ] -/Count 0 -/Prev 2006 0 R -/Parent 2000 0 R ->> -endobj -2008 0 obj -<< -/Title -/Dest [ 842 0 R /XYZ 39.386457 195.312822 0 ] -/Count 0 -/Prev 1998 0 R -/Parent 1973 0 R -/Next 2009 0 R ->> -endobj -2009 0 obj -<< -/Title -/Dest [ 854 0 R /XYZ 39.386457 572.502822 0 ] -/Count 4 -/Prev 2008 0 R -/First 2010 0 R -/Last 2011 0 R -/Parent 1973 0 R -/Next 2014 0 R ->> -endobj -2010 0 obj -<< -/Title -/Dest [ 860 0 R /XYZ 42.836457 353.394469 0 ] -/Count 0 -/Parent 2009 0 R /Next 2011 0 R +/Parent 2200 0 R >> endobj 2011 0 obj << -/Title (Quand remplir la base ?) -/Dest [ 864 0 R /XYZ 42.836457 256.212822 0 ] -/Count 2 +/Title (1. Rapport Track Trends V1.0) +/Dest [ 510 0 R /XYZ 39.386457 757.223622 0 ] +/Count 98 /Prev 2010 0 R /First 2012 0 R -/Last 2013 0 R -/Parent 2009 0 R +/Last 2109 0 R +/Next 2110 0 R +/Parent 2200 0 R >> endobj 2012 0 obj << -/Title (Quand un pilote a finit un tour) -/Dest [ 866 0 R /XYZ 42.836457 746.625222 0 ] -/Count 0 +/Title (1.1 Introduction) +/Dest [ 516 0 R /XYZ 39.386457 723.165222 0 ] +/Count 3 +/First 2013 0 R +/Last 2015 0 R /Parent 2011 0 R -/Next 2013 0 R +/Next 2016 0 R >> endobj 2013 0 obj << -/Title -/Dest [ 868 0 R /XYZ 42.836457 771.023622 0 ] +/Title +/Dest [ 516 0 R /XYZ 39.386457 667.603722 0 ] /Count 0 -/Prev 2012 0 R -/Parent 2011 0 R +/Parent 2012 0 R +/Next 2014 0 R >> endobj 2014 0 obj << -/Title -/Dest [ 873 0 R /XYZ 39.386457 722.226822 0 ] -/Count 5 -/Prev 2009 0 R -/First 2015 0 R -/Last 2019 0 R -/Parent 1973 0 R +/Title (1.1.2 Abstract) +/Dest [ 522 0 R /XYZ 39.386457 771.023622 0 ] +/Count 0 +/Prev 2013 0 R +/Parent 2012 0 R +/Next 2015 0 R >> endobj 2015 0 obj << -/Title (Affichage direct) -/Dest [ 873 0 R /XYZ 42.836457 580.332822 0 ] +/Title (1.1.3 Description du besoin) +/Dest [ 522 0 R /XYZ 39.386457 343.911222 0 ] /Count 0 -/Parent 2014 0 R -/Next 2016 0 R +/Prev 2014 0 R +/Parent 2012 0 R >> endobj 2016 0 obj << -/Title -/Dest [ 878 0 R /XYZ 42.836457 716.541222 0 ] -/Count 2 -/Prev 2015 0 R +/Title (1.2 Cahier des charges) +/Dest [ 524 0 R /XYZ 39.386457 550.499622 0 ] +/Count 4 +/Prev 2012 0 R /First 2017 0 R -/Last 2018 0 R -/Parent 2014 0 R -/Next 2019 0 R +/Last 2020 0 R +/Parent 2011 0 R +/Next 2021 0 R >> endobj 2017 0 obj << -/Title (Affichage Hybride) -/Dest [ 878 0 R /XYZ 42.836457 667.744422 0 ] +/Title (1.2.1 Projet) +/Dest [ 524 0 R /XYZ 39.386457 435.818922 0 ] /Count 0 /Parent 2016 0 R /Next 2018 0 R @@ -28813,289 +29152,290 @@ endobj endobj 2018 0 obj << -/Title -/Dest [ 888 0 R /XYZ 42.836457 353.735622 0 ] +/Title +/Dest [ 526 0 R /XYZ 39.386457 771.023622 0 ] /Count 0 /Prev 2017 0 R /Parent 2016 0 R +/Next 2019 0 R >> endobj 2019 0 obj << -/Title -/Dest [ 898 0 R /XYZ 42.836457 595.529850 0 ] +/Title (1.2.3 Cas d'utilisation) +/Dest [ 534 0 R /XYZ 39.386457 412.926066 0 ] /Count 0 -/Prev 2016 0 R -/Parent 2014 0 R +/Prev 2018 0 R +/Parent 2016 0 R +/Next 2020 0 R >> endobj 2020 0 obj << -/Title (1.8 Tests) -/Dest [ 898 0 R /XYZ 39.386457 211.724250 0 ] -/Count 3 -/Prev 1973 0 R -/First 2021 0 R -/Last 2023 0 R -/Parent 1940 0 R -/Next 2024 0 R +/Title +/Dest [ 538 0 R /XYZ 39.386457 638.709222 0 ] +/Count 0 +/Prev 2019 0 R +/Parent 2016 0 R >> endobj 2021 0 obj << -/Title -/Dest [ 900 0 R /XYZ 39.386457 682.814022 0 ] +/Title +/Dest [ 538 0 R /XYZ 39.386457 368.746422 0 ] /Count 0 -/Parent 2020 0 R +/Prev 2016 0 R +/Parent 2011 0 R /Next 2022 0 R >> endobj 2022 0 obj << -/Title (1.8.2 Comment ca aurait du se passer) -/Dest [ 905 0 R /XYZ 39.386457 250.947249 0 ] -/Count 0 +/Title +/Dest [ 551 0 R /XYZ 39.386457 268.716368 0 ] +/Count 19 /Prev 2021 0 R -/Parent 2020 0 R -/Next 2023 0 R +/First 2023 0 R +/Last 2023 0 R +/Parent 2011 0 R +/Next 2042 0 R >> endobj 2023 0 obj << -/Title (1.8.3 Lecons) -/Dest [ 909 0 R /XYZ 39.386457 613.372422 0 ] -/Count 0 -/Prev 2022 0 R -/Parent 2020 0 R +/Title +/Dest [ 555 0 R /XYZ 39.386457 771.023622 0 ] +/Count 18 +/First 2024 0 R +/Last 2039 0 R +/Parent 2022 0 R >> endobj 2024 0 obj << -/Title -/Dest [ 909 0 R /XYZ 39.386457 478.102422 0 ] -/Count 0 -/Prev 2020 0 R -/Parent 1940 0 R -/Next 2025 0 R +/Title (PT) +/Dest [ 555 0 R /XYZ 42.836457 580.332822 0 ] +/Count 1 +/First 2025 0 R +/Last 2025 0 R +/Parent 2023 0 R +/Next 2026 0 R >> endobj 2025 0 obj << -/Title (1.10 Optimisation du programme) -/Dest [ 909 0 R /XYZ 39.386457 388.758522 0 ] +/Title +/Dest [ 555 0 R /XYZ 42.836457 531.536022 0 ] /Count 0 -/Prev 2024 0 R -/Parent 1940 0 R -/Next 2026 0 R +/Parent 2024 0 R >> endobj 2026 0 obj << -/Title (1.11 Ethique du projet) -/Dest [ 909 0 R /XYZ 39.386457 299.414622 0 ] -/Count 0 -/Prev 2025 0 R -/Parent 1940 0 R -/Next 2027 0 R +/Title (DT) +/Dest [ 555 0 R /XYZ 42.836457 404.984502 0 ] +/Count 6 +/Prev 2024 0 R +/First 2027 0 R +/Last 2032 0 R +/Parent 2023 0 R +/Next 2033 0 R >> endobj 2027 0 obj << -/Title (1.12 Utilisation de Chat GPT) -/Dest [ 909 0 R /XYZ 39.386457 195.056322 0 ] +/Title +/Dest [ 555 0 R /XYZ 42.836457 341.173302 0 ] /Count 0 -/Prev 2026 0 R -/Parent 1940 0 R +/Parent 2026 0 R /Next 2028 0 R >> endobj 2028 0 obj << -/Title -/Dest [ 911 0 R /XYZ 39.386457 771.023622 0 ] +/Title (DT2 Documentation Analyse de l'existant \(2\)) +/Dest [ 555 0 R /XYZ 42.836457 225.937782 0 ] /Count 0 /Prev 2027 0 R -/Parent 1940 0 R +/Parent 2026 0 R /Next 2029 0 R >> endobj 2029 0 obj << -/Title (1.14 Conclusion) -/Dest [ 911 0 R /XYZ 39.386457 681.679722 0 ] +/Title (DT3 Documentation Analyse organique \(5\)) +/Dest [ 555 0 R /XYZ 42.836457 140.731062 0 ] /Count 0 /Prev 2028 0 R -/Parent 1940 0 R +/Parent 2026 0 R /Next 2030 0 R >> endobj 2030 0 obj << -/Title (1.15 Notes de code) -/Dest [ 911 0 R /XYZ 39.386457 592.335822 0 ] +/Title (DT4 Documentation Analyse fonctionnelle \(2\)) +/Dest [ 557 0 R /XYZ 42.836457 692.198022 0 ] /Count 0 /Prev 2029 0 R -/Parent 1940 0 R +/Parent 2026 0 R +/Next 2031 0 R >> endobj 2031 0 obj << -/Title (2. Cahier des charges) -/Dest [ 913 0 R /XYZ 39.386457 757.223622 0 ] -/Count 5 -/Prev 1940 0 R -/First 2032 0 R -/Last 2036 0 R -/Next 2037 0 R -/Parent 2119 0 R +/Title (DT5 Documentation Tests \(1\)) +/Dest [ 557 0 R /XYZ 42.836457 552.564102 0 ] +/Count 0 +/Prev 2030 0 R +/Parent 2026 0 R +/Next 2032 0 R >> endobj 2032 0 obj << -/Title (2.1 Contexte) -/Dest [ 913 0 R /XYZ 39.386457 669.390822 0 ] +/Title (DT6 Documentation Reste \(2\)) +/Dest [ 557 0 R /XYZ 42.836457 476.741382 0 ] /Count 0 -/Parent 2031 0 R -/Next 2033 0 R +/Prev 2031 0 R +/Parent 2026 0 R >> endobj 2033 0 obj << -/Title (2.2 Projet) -/Dest [ 918 0 R /XYZ 39.386457 124.199039 0 ] -/Count 0 -/Prev 2032 0 R -/Parent 2031 0 R -/Next 2034 0 R +/Title (PT) +/Dest [ 557 0 R /XYZ 42.836457 374.588262 0 ] +/Count 5 +/Prev 2026 0 R +/First 2034 0 R +/Last 2038 0 R +/Parent 2023 0 R +/Next 2039 0 R >> endobj 2034 0 obj << -/Title -/Dest [ 922 0 R /XYZ 39.386457 436.953222 0 ] +/Title +/Dest [ 557 0 R /XYZ 42.836457 310.777062 0 ] /Count 0 -/Prev 2033 0 R -/Parent 2031 0 R +/Parent 2033 0 R /Next 2035 0 R >> endobj 2035 0 obj << -/Title (2.4 Cas d'utilisation) -/Dest [ 934 0 R /XYZ 39.386457 771.023622 0 ] +/Title (PT2 Programmation OCR \(5\)) +/Dest [ 559 0 R /XYZ 42.836457 771.023622 0 ] /Count 0 /Prev 2034 0 R -/Parent 2031 0 R +/Parent 2033 0 R /Next 2036 0 R >> endobj 2036 0 obj << -/Title -/Dest [ 936 0 R /XYZ 39.386457 771.023622 0 ] +/Title +/Dest [ 559 0 R /XYZ 42.836457 625.759302 0 ] /Count 0 /Prev 2035 0 R -/Parent 2031 0 R +/Parent 2033 0 R +/Next 2037 0 R >> endobj 2037 0 obj << -/Title (3. Manuel utilisateur) -/Dest [ 938 0 R /XYZ 39.386457 757.223622 0 ] -/Count 19 -/Prev 2031 0 R -/First 2038 0 R -/Last 2056 0 R -/Next 2057 0 R -/Parent 2119 0 R +/Title (PT4 Programmation Vue de l'APP \(5\)) +/Dest [ 559 0 R /XYZ 42.836457 495.509382 0 ] +/Count 0 +/Prev 2036 0 R +/Parent 2033 0 R +/Next 2038 0 R >> endobj 2038 0 obj << -/Title (3.1 Installation) -/Dest [ 938 0 R /XYZ 39.386457 707.865222 0 ] +/Title (PT5 Programmation mise en commun \(3\)) +/Dest [ 559 0 R /XYZ 42.836457 365.259462 0 ] /Count 0 -/Parent 2037 0 R -/Next 2039 0 R +/Prev 2037 0 R +/Parent 2033 0 R >> endobj 2039 0 obj << -/Title (3.2 A quoi sert l'app ?) -/Dest [ 938 0 R /XYZ 39.386457 608.700522 0 ] -/Count 0 -/Prev 2038 0 R -/Parent 2037 0 R -/Next 2040 0 R +/Title (TT) +/Dest [ 559 0 R /XYZ 42.836457 238.707942 0 ] +/Count 2 +/Prev 2033 0 R +/First 2040 0 R +/Last 2041 0 R +/Parent 2023 0 R >> endobj 2040 0 obj << -/Title (3.3 Utilisation "Simple") -/Dest [ 938 0 R /XYZ 39.386457 391.297422 0 ] -/Count 2 -/Prev 2039 0 R -/First 2041 0 R -/Last 2042 0 R -/Parent 2037 0 R -/Next 2043 0 R +/Title (TT1 Tests OCR \(2\)) +/Dest [ 559 0 R /XYZ 42.836457 174.896742 0 ] +/Count 0 +/Parent 2039 0 R +/Next 2041 0 R >> endobj 2041 0 obj << -/Title -/Dest [ 947 0 R /XYZ 39.386457 347.470422 0 ] +/Title (TT2 Tests finaux \(2\)) +/Dest [ 561 0 R /XYZ 42.836457 662.169222 0 ] /Count 0 -/Parent 2040 0 R -/Next 2042 0 R +/Prev 2040 0 R +/Parent 2039 0 R >> endobj 2042 0 obj << -/Title (3.3.2 Boutons) -/Dest [ 958 0 R /XYZ 39.386457 309.260718 0 ] +/Title +/Dest [ 561 0 R /XYZ 39.386457 517.843302 0 ] /Count 0 -/Prev 2041 0 R -/Parent 2040 0 R +/Prev 2022 0 R +/Parent 2011 0 R +/Next 2043 0 R >> endobj 2043 0 obj << -/Title (3.4 Calibration) -/Dest [ 977 0 R /XYZ 39.386457 771.023622 0 ] -/Count 6 -/Prev 2040 0 R -/First 2044 0 R -/Last 2049 0 R -/Parent 2037 0 R -/Next 2050 0 R +/Title (1.6 Analyse fonctionnelle) +/Dest [ 563 0 R /XYZ 39.386457 335.606022 0 ] +/Count 0 +/Prev 2042 0 R +/Parent 2011 0 R +/Next 2044 0 R >> endobj 2044 0 obj << -/Title -/Dest [ 977 0 R /XYZ 39.386457 661.536522 0 ] -/Count 0 -/Parent 2043 0 R -/Next 2045 0 R +/Title (1.7 Analyse Organique) +/Dest [ 563 0 R /XYZ 39.386457 246.262122 0 ] +/Count 50 +/Prev 2043 0 R +/First 2045 0 R +/Last 2089 0 R +/Parent 2011 0 R +/Next 2095 0 R >> endobj 2045 0 obj << -/Title -/Dest [ 977 0 R /XYZ 39.386457 269.144922 0 ] -/Count 3 -/Prev 2044 0 R +/Title +/Dest [ 563 0 R /XYZ 39.386457 190.700622 0 ] +/Count 4 /First 2046 0 R -/Last 2048 0 R -/Parent 2043 0 R -/Next 2049 0 R +/Last 2049 0 R +/Parent 2044 0 R +/Next 2050 0 R >> endobj 2046 0 obj << -/Title -/Dest [ 993 0 R /XYZ 42.836457 587.042022 0 ] +/Title (Visual Studio 2022) +/Dest [ 563 0 R /XYZ 42.836457 163.346622 0 ] /Count 0 /Parent 2045 0 R /Next 2047 0 R @@ -29103,8 +29443,8 @@ endobj endobj 2047 0 obj << -/Title (Ajout du nom des pilotes) -/Dest [ 1016 0 R /XYZ 42.836457 166.651302 0 ] +/Title (Visual Studio Code) +/Dest [ 566 0 R /XYZ 42.836457 298.274022 0 ] /Count 0 /Prev 2046 0 R /Parent 2045 0 R @@ -29113,38 +29453,39 @@ endobj endobj 2048 0 obj << -/Title (Sauvegarder le nouveau Preset) -/Dest [ 1030 0 R /XYZ 42.836457 341.110056 0 ] +/Title (Material/Mkdocs/Markdown) +/Dest [ 575 0 R /XYZ 42.836457 771.023622 0 ] /Count 0 /Prev 2047 0 R /Parent 2045 0 R +/Next 2049 0 R >> endobj 2049 0 obj << -/Title (3.4.3 Load un Preset existant) -/Dest [ 1030 0 R /XYZ 39.386457 189.089256 0 ] +/Title (Figma) +/Dest [ 575 0 R /XYZ 42.836457 270.006822 0 ] /Count 0 -/Prev 2045 0 R -/Parent 2043 0 R +/Prev 2048 0 R +/Parent 2045 0 R >> endobj 2050 0 obj << -/Title -/Dest [ 1035 0 R /XYZ 39.386457 322.349771 0 ] +/Title +/Dest [ 585 0 R /XYZ 39.386457 771.023622 0 ] /Count 5 -/Prev 2043 0 R +/Prev 2045 0 R /First 2051 0 R /Last 2055 0 R -/Parent 2037 0 R +/Parent 2044 0 R /Next 2056 0 R >> endobj 2051 0 obj << -/Title (3.5.1 Overtakes) -/Dest [ 1040 0 R /XYZ 39.386457 307.522050 0 ] +/Title (Selenium) +/Dest [ 585 0 R /XYZ 42.836457 653.528022 0 ] /Count 0 /Parent 2050 0 R /Next 2052 0 R @@ -29152,8 +29493,8 @@ endobj endobj 2052 0 obj << -/Title (3.5.2 Last Five Laps) -/Dest [ 1040 0 R /XYZ 39.386457 206.972850 0 ] +/Title (CSharp) +/Dest [ 597 0 R /XYZ 42.836457 487.571622 0 ] /Count 0 /Prev 2051 0 R /Parent 2050 0 R @@ -29162,8 +29503,8 @@ endobj endobj 2053 0 obj << -/Title (3.5.3 Battles) -/Dest [ 1045 0 R /XYZ 39.386457 234.880422 0 ] +/Title (Python?) +/Dest [ 602 0 R /XYZ 42.836457 517.600422 0 ] /Count 0 /Prev 2052 0 R /Parent 2050 0 R @@ -29172,8 +29513,8 @@ endobj endobj 2054 0 obj << -/Title (3.5.4 Driver infos) -/Dest [ 1050 0 R /XYZ 39.386457 294.880422 0 ] +/Title (Firefox) +/Dest [ 607 0 R /XYZ 42.836457 389.978022 0 ] /Count 0 /Prev 2053 0 R /Parent 2050 0 R @@ -29182,8 +29523,8 @@ endobj endobj 2055 0 obj << -/Title (3.5.5 Live Ranking) -/Dest [ 1062 0 R /XYZ 39.386457 771.023622 0 ] +/Title (Tesseract) +/Dest [ 614 0 R /XYZ 42.836457 611.440422 0 ] /Count 0 /Prev 2054 0 R /Parent 2050 0 R @@ -29191,29 +29532,31 @@ endobj endobj 2056 0 obj << -/Title (3.6 Erreurs) -/Dest [ 1068 0 R /XYZ 39.386457 634.955622 0 ] -/Count 0 +/Title +/Dest [ 614 0 R /XYZ 39.386457 435.021222 0 ] +/Count 5 /Prev 2050 0 R -/Parent 2037 0 R +/First 2057 0 R +/Last 2061 0 R +/Parent 2044 0 R +/Next 2062 0 R >> endobj 2057 0 obj << -/Title (4. Journal de bord) -/Dest [ 1071 0 R /XYZ 39.386457 757.223622 0 ] -/Count 39 -/Prev 2037 0 R +/Title (Les briques principales) +/Dest [ 614 0 R /XYZ 42.836457 326.909622 0 ] +/Count 3 /First 2058 0 R -/Last 2096 0 R -/Next 2097 0 R -/Parent 2119 0 R +/Last 2060 0 R +/Parent 2056 0 R +/Next 2061 0 R >> endobj 2058 0 obj << -/Title (4.1 Mercredi 29 Mars 2023) -/Dest [ 1071 0 R /XYZ 39.386457 707.865222 0 ] +/Title +/Dest [ 614 0 R /XYZ 42.836457 263.098422 0 ] /Count 0 /Parent 2057 0 R /Next 2059 0 R @@ -29221,8 +29564,8 @@ endobj endobj 2059 0 obj << -/Title (4.2 Jeudi 30 Mars 2023) -/Dest [ 1074 0 R /XYZ 39.386457 263.492343 0 ] +/Title (OCR) +/Dest [ 617 0 R /XYZ 42.836457 95.795299 0 ] /Count 0 /Prev 2058 0 R /Parent 2057 0 R @@ -29231,776 +29574,1597 @@ endobj endobj 2060 0 obj << -/Title (4.3 Vendredi 31/03/2023) -/Dest [ 1086 0 R /XYZ 39.386457 347.805222 0 ] +/Title (Traitement et affichage) +/Dest [ 622 0 R /XYZ 42.836457 122.598958 0 ] /Count 0 /Prev 2059 0 R /Parent 2057 0 R -/Next 2061 0 R >> endobj 2061 0 obj << -/Title (4.4 Lundi 3 Avril) -/Dest [ 1161 0 R /XYZ 39.386457 717.534822 0 ] +/Title +/Dest [ 627 0 R /XYZ 42.836457 187.703299 0 ] /Count 0 -/Prev 2060 0 R -/Parent 2057 0 R -/Next 2062 0 R +/Prev 2057 0 R +/Parent 2056 0 R >> endobj 2062 0 obj << -/Title (4.5 Mardi 4 Avril) -/Dest [ 1227 0 R /XYZ 39.386457 305.202822 0 ] -/Count 0 -/Prev 2061 0 R -/Parent 2057 0 R -/Next 2063 0 R +/Title +/Dest [ 636 0 R /XYZ 39.386457 253.026822 0 ] +/Count 10 +/Prev 2056 0 R +/First 2063 0 R +/Last 2067 0 R +/Parent 2044 0 R +/Next 2073 0 R >> endobj 2063 0 obj << -/Title (4.6 Mercredi 5 Avril) -/Dest [ 1254 0 R /XYZ 39.386457 293.199726 0 ] +/Title (Comment faire ?) +/Dest [ 645 0 R /XYZ 42.836457 735.309222 0 ] /Count 0 -/Prev 2062 0 R -/Parent 2057 0 R +/Parent 2062 0 R /Next 2064 0 R >> endobj 2064 0 obj << -/Title (4.7 Jeudi 6 Avril) -/Dest [ 1281 0 R /XYZ 39.386457 238.444086 0 ] +/Title (Simuler un navigateur ?) +/Dest [ 645 0 R /XYZ 42.836457 106.526022 0 ] /Count 0 /Prev 2063 0 R -/Parent 2057 0 R +/Parent 2062 0 R /Next 2065 0 R >> endobj 2065 0 obj << -/Title (4.8 Vendredi 6 Avril 2023) -/Dest [ 1324 0 R /XYZ 39.386457 565.514022 0 ] +/Title +/Dest [ 652 0 R /XYZ 42.836457 387.800022 0 ] /Count 0 /Prev 2064 0 R -/Parent 2057 0 R +/Parent 2062 0 R /Next 2066 0 R >> endobj 2066 0 obj << -/Title (4.9 Vacances) -/Dest [ 1349 0 R /XYZ 39.386457 355.144422 0 ] +/Title +/Dest [ 659 0 R /XYZ 42.836457 409.684422 0 ] /Count 0 /Prev 2065 0 R -/Parent 2057 0 R +/Parent 2062 0 R /Next 2067 0 R >> endobj 2067 0 obj << -/Title (4.10 Lundi 24 Avril 2023) -/Dest [ 1404 0 R /XYZ 39.386457 266.404302 0 ] -/Count 0 +/Title (Calibration) +/Dest [ 667 0 R /XYZ 42.836457 579.426906 0 ] +/Count 5 /Prev 2066 0 R -/Parent 2057 0 R -/Next 2068 0 R +/First 2068 0 R +/Last 2072 0 R +/Parent 2062 0 R >> endobj 2068 0 obj << -/Title (4.11 Mardi 25 Avril 2023) -/Dest [ 1423 0 R /XYZ 39.386457 693.136422 0 ] +/Title (Liste des pilotes) +/Dest [ 669 0 R /XYZ 42.836457 771.023622 0 ] /Count 0 -/Prev 2067 0 R -/Parent 2057 0 R +/Parent 2067 0 R /Next 2069 0 R >> endobj 2069 0 obj << -/Title (4.12 26 Avril 2023) -/Dest [ 1423 0 R /XYZ 39.386457 222.365322 0 ] +/Title (Zone principale) +/Dest [ 669 0 R /XYZ 42.836457 640.773702 0 ] /Count 0 /Prev 2068 0 R -/Parent 2057 0 R +/Parent 2067 0 R /Next 2070 0 R >> endobj 2070 0 obj << -/Title (4.13 Jeudi 27 Avril 2023) -/Dest [ 1430 0 R /XYZ 39.386457 584.282022 0 ] +/Title (Zones pilotes) +/Dest [ 669 0 R /XYZ 42.836457 316.153201 0 ] /Count 0 /Prev 2069 0 R -/Parent 2057 0 R +/Parent 2067 0 R /Next 2071 0 R >> endobj 2071 0 obj << -/Title (4.14 Vendredi 28 Avril 2023) -/Dest [ 1442 0 R /XYZ 39.386457 717.534822 0 ] +/Title (Windows pilotes) +/Dest [ 679 0 R /XYZ 42.836457 363.762714 0 ] /Count 0 /Prev 2070 0 R -/Parent 2057 0 R +/Parent 2067 0 R /Next 2072 0 R >> endobj 2072 0 obj << -/Title (4.15 Lundi 1 Mai 2023) -/Dest [ 1444 0 R /XYZ 39.386457 501.702822 0 ] +/Title (Stockage) +/Dest [ 688 0 R /XYZ 42.836457 646.430022 0 ] /Count 0 /Prev 2071 0 R -/Parent 2057 0 R -/Next 2073 0 R +/Parent 2067 0 R >> endobj 2073 0 obj << -/Title (4.16 Mardi 2 Mai 2023) -/Dest [ 1450 0 R /XYZ 39.386457 595.251918 0 ] -/Count 0 -/Prev 2072 0 R -/Parent 2057 0 R -/Next 2074 0 R +/Title (1.7.5 OCR) +/Dest [ 696 0 R /XYZ 39.386457 303.179610 0 ] +/Count 9 +/Prev 2062 0 R +/First 2074 0 R +/Last 2074 0 R +/Parent 2044 0 R +/Next 2083 0 R >> endobj 2074 0 obj << -/Title (4.17 Recrutement Payerne Mai 2023) -/Dest [ 1470 0 R /XYZ 39.386457 526.101222 0 ] -/Count 0 -/Prev 2073 0 R -/Parent 2057 0 R -/Next 2075 0 R +/Title +/Dest [ 698 0 R /XYZ 42.836457 771.023622 0 ] +/Count 8 +/First 2075 0 R +/Last 2075 0 R +/Parent 2073 0 R >> endobj 2075 0 obj << -/Title (4.18 Vendredi 5 Mai 2023) -/Dest [ 1470 0 R /XYZ 39.386457 426.936522 0 ] -/Count 0 -/Prev 2074 0 R -/Parent 2057 0 R -/Next 2076 0 R +/Title (Filtres et traitement) +/Dest [ 732 0 R /XYZ 42.836457 237.136277 0 ] +/Count 7 +/First 2076 0 R +/Last 2082 0 R +/Parent 2074 0 R >> endobj 2076 0 obj << -/Title (4.19 Lundi 8 Mai 2023) -/Dest [ 1473 0 R /XYZ 39.386457 314.866514 0 ] +/Title (Texte) +/Dest [ 754 0 R /XYZ 42.836457 369.234822 0 ] /Count 0 -/Prev 2075 0 R -/Parent 2057 0 R +/Parent 2075 0 R /Next 2077 0 R >> endobj 2077 0 obj << -/Title (4.20 Mardi 9 Mai 2023) -/Dest [ 1509 0 R /XYZ 39.386457 146.799010 0 ] +/Title (Chiffres) +/Dest [ 775 0 R /XYZ 42.836457 460.413222 0 ] /Count 0 /Prev 2076 0 R -/Parent 2057 0 R +/Parent 2075 0 R /Next 2078 0 R >> endobj 2078 0 obj << -/Title (4.21 Mercredi 10 Mai 2023) -/Dest [ 1530 0 R /XYZ 39.386457 659.354022 0 ] +/Title (les chiffres \(2\)) +/Dest [ 799 0 R /XYZ 42.836457 569.267622 0 ] /Count 0 /Prev 2077 0 R -/Parent 2057 0 R +/Parent 2075 0 R /Next 2079 0 R >> endobj 2079 0 obj << -/Title (4.22 Jeudi 11 Mai 2023) -/Dest [ 1544 0 R /XYZ 39.386457 562.440762 0 ] +/Title (Pneus) +/Dest [ 799 0 R /XYZ 42.836457 523.473702 0 ] /Count 0 /Prev 2078 0 R -/Parent 2057 0 R +/Parent 2075 0 R /Next 2080 0 R >> endobj 2080 0 obj << -/Title (4.23 vendredi 12 Mai 2023) -/Dest [ 1557 0 R /XYZ 39.386457 623.694822 0 ] +/Title (DRS) +/Dest [ 865 0 R /XYZ 42.836457 584.282022 0 ] /Count 0 /Prev 2079 0 R -/Parent 2057 0 R +/Parent 2075 0 R /Next 2081 0 R >> endobj 2081 0 obj << -/Title (4.24 Lundi 15 Mai 2023) -/Dest [ 1566 0 R /XYZ 39.386457 584.282022 0 ] +/Title (Filtres et methodes sur les images) +/Dest [ 865 0 R /XYZ 42.836457 523.473702 0 ] /Count 0 /Prev 2080 0 R -/Parent 2057 0 R +/Parent 2075 0 R /Next 2082 0 R >> endobj 2082 0 obj << -/Title (4.25 Mardi 16 Mai 2023) -/Dest [ 1566 0 R /XYZ 39.386457 273.038922 0 ] +/Title +/Dest [ 879 0 R /XYZ 42.836457 371.265222 0 ] /Count 0 /Prev 2081 0 R -/Parent 2057 0 R -/Next 2083 0 R +/Parent 2075 0 R >> endobj 2083 0 obj << -/Title (4.26 Mercredi 17 Mai 2023) -/Dest [ 1575 0 R /XYZ 39.386457 771.023622 0 ] +/Title +/Dest [ 905 0 R /XYZ 39.386457 195.312822 0 ] /Count 0 -/Prev 2082 0 R -/Parent 2057 0 R +/Prev 2073 0 R +/Parent 2044 0 R /Next 2084 0 R >> endobj 2084 0 obj << -/Title (4.27 Jeudi 18 Mai 2023) -/Dest [ 1583 0 R /XYZ 39.386457 459.588513 0 ] -/Count 0 +/Title +/Dest [ 917 0 R /XYZ 39.386457 572.502822 0 ] +/Count 4 /Prev 2083 0 R -/Parent 2057 0 R -/Next 2085 0 R +/First 2085 0 R +/Last 2086 0 R +/Parent 2044 0 R +/Next 2089 0 R >> endobj 2085 0 obj << -/Title (4.28 Lundi 22 Mai 2023) -/Dest [ 1590 0 R /XYZ 39.386457 649.970022 0 ] +/Title +/Dest [ 923 0 R /XYZ 42.836457 353.394469 0 ] /Count 0 -/Prev 2084 0 R -/Parent 2057 0 R +/Parent 2084 0 R /Next 2086 0 R >> endobj 2086 0 obj << -/Title (4.29 Mardi 23 Mai 2023) -/Dest [ 1617 0 R /XYZ 39.386457 234.994819 0 ] -/Count 0 +/Title (Quand remplir la base ?) +/Dest [ 927 0 R /XYZ 42.836457 256.212822 0 ] +/Count 2 /Prev 2085 0 R -/Parent 2057 0 R -/Next 2087 0 R +/First 2087 0 R +/Last 2088 0 R +/Parent 2084 0 R >> endobj 2087 0 obj << -/Title (4.30 Mercredi 24 Mai 2023) -/Dest [ 1622 0 R /XYZ 39.386457 629.325222 0 ] +/Title (Quand un pilote a finit un tour) +/Dest [ 929 0 R /XYZ 42.836457 746.625222 0 ] /Count 0 -/Prev 2086 0 R -/Parent 2057 0 R +/Parent 2086 0 R /Next 2088 0 R >> endobj 2088 0 obj << -/Title (4.31 Jeudi 25 Mai 2023) -/Dest [ 1624 0 R /XYZ 39.386457 446.337222 0 ] +/Title +/Dest [ 931 0 R /XYZ 42.836457 771.023622 0 ] /Count 0 /Prev 2087 0 R -/Parent 2057 0 R -/Next 2089 0 R +/Parent 2086 0 R >> endobj 2089 0 obj << -/Title (4.32 Vendredi 26 Mai 2023) -/Dest [ 1632 0 R /XYZ 39.386457 249.143222 0 ] -/Count 0 -/Prev 2088 0 R -/Parent 2057 0 R -/Next 2090 0 R +/Title +/Dest [ 936 0 R /XYZ 39.386457 722.226822 0 ] +/Count 5 +/Prev 2084 0 R +/First 2090 0 R +/Last 2094 0 R +/Parent 2044 0 R >> endobj 2090 0 obj << -/Title (4.33 Grand Prix de Monaco) -/Dest [ 1632 0 R /XYZ 39.386457 164.992922 0 ] +/Title (Affichage direct) +/Dest [ 936 0 R /XYZ 42.836457 580.332822 0 ] /Count 0 -/Prev 2089 0 R -/Parent 2057 0 R +/Parent 2089 0 R /Next 2091 0 R >> endobj 2091 0 obj << -/Title (4.34 Lundi 29 Mai 2023) -/Dest [ 1636 0 R /XYZ 39.386457 771.023622 0 ] -/Count 0 +/Title +/Dest [ 941 0 R /XYZ 42.836457 716.541222 0 ] +/Count 2 /Prev 2090 0 R -/Parent 2057 0 R -/Next 2092 0 R +/First 2092 0 R +/Last 2093 0 R +/Parent 2089 0 R +/Next 2094 0 R >> endobj 2092 0 obj << -/Title (4.35 Mardi 30 Mai 2023) -/Dest [ 1636 0 R /XYZ 39.386457 547.990122 0 ] +/Title (Affichage Hybride) +/Dest [ 941 0 R /XYZ 42.836457 667.744422 0 ] /Count 0 -/Prev 2091 0 R -/Parent 2057 0 R +/Parent 2091 0 R /Next 2093 0 R >> endobj 2093 0 obj << -/Title (4.36 Mercredi 31 Mai 2023) -/Dest [ 1636 0 R /XYZ 39.386457 339.971022 0 ] +/Title +/Dest [ 951 0 R /XYZ 42.836457 353.735622 0 ] /Count 0 /Prev 2092 0 R -/Parent 2057 0 R -/Next 2094 0 R +/Parent 2091 0 R >> endobj 2094 0 obj << -/Title (4.37 Jeudi 1 Juin 2023) -/Dest [ 1636 0 R /XYZ 39.386457 270.835122 0 ] +/Title +/Dest [ 961 0 R /XYZ 42.836457 595.529850 0 ] /Count 0 -/Prev 2093 0 R -/Parent 2057 0 R -/Next 2095 0 R +/Prev 2091 0 R +/Parent 2089 0 R >> endobj 2095 0 obj << -/Title (4.38 Vendredi 2 Juin 2023) -/Dest [ 1662 0 R /XYZ 39.386457 608.680422 0 ] -/Count 0 -/Prev 2094 0 R -/Parent 2057 0 R -/Next 2096 0 R +/Title (1.8 Tests) +/Dest [ 961 0 R /XYZ 39.386457 211.724250 0 ] +/Count 3 +/Prev 2044 0 R +/First 2096 0 R +/Last 2098 0 R +/Parent 2011 0 R +/Next 2099 0 R >> endobj 2096 0 obj << -/Title (4.39 Lundi 5 Juin 2023) -/Dest [ 1680 0 R /XYZ 39.386457 229.986499 0 ] +/Title +/Dest [ 963 0 R /XYZ 39.386457 682.814022 0 ] /Count 0 -/Prev 2095 0 R -/Parent 2057 0 R +/Parent 2095 0 R +/Next 2097 0 R >> endobj 2097 0 obj << -/Title (5. Code) -/Dest [ 1694 0 R /XYZ 39.386457 757.223622 0 ] -/Count 21 -/Prev 2057 0 R -/First 2098 0 R -/Last 2118 0 R -/Parent 2119 0 R +/Title (1.8.2 Comment ca aurait du se passer) +/Dest [ 968 0 R /XYZ 39.386457 250.947249 0 ] +/Count 0 +/Prev 2096 0 R +/Parent 2095 0 R +/Next 2098 0 R >> endobj 2098 0 obj << -/Title (5.1 ConfigurationTool.cs) -/Dest [ 1694 0 R /XYZ 39.386457 707.865222 0 ] +/Title (1.8.3 Lecons) +/Dest [ 972 0 R /XYZ 39.386457 613.372422 0 ] /Count 0 -/Parent 2097 0 R -/Next 2099 0 R +/Prev 2097 0 R +/Parent 2095 0 R >> endobj 2099 0 obj << -/Title (5.2 DriverData.cs) -/Dest [ 1706 0 R /XYZ 39.386457 747.563622 0 ] -/Count 0 -/Prev 2098 0 R -/Parent 2097 0 R -/Next 2100 0 R +/Title +/Dest [ 972 0 R /XYZ 39.386457 478.102422 0 ] +/Count 3 +/Prev 2095 0 R +/First 2100 0 R +/Last 2102 0 R +/Parent 2011 0 R +/Next 2103 0 R >> endobj 2100 0 obj << -/Title (5.3 DriverGapToLeaderWindow.cs) -/Dest [ 1712 0 R /XYZ 39.386457 747.563622 0 ] +/Title (1.9.1 Browser Headless) +/Dest [ 972 0 R /XYZ 39.386457 324.008922 0 ] /Count 0 -/Prev 2099 0 R -/Parent 2097 0 R +/Parent 2099 0 R /Next 2101 0 R >> endobj 2101 0 obj << -/Title (5.4 DriverNameWindow.cs) -/Dest [ 1714 0 R /XYZ 39.386457 747.563622 0 ] +/Title (1.9.2 OCR) +/Dest [ 974 0 R /XYZ 39.386457 613.372422 0 ] /Count 0 /Prev 2100 0 R -/Parent 2097 0 R +/Parent 2099 0 R /Next 2102 0 R >> endobj 2102 0 obj << -/Title (5.5 DriverSectorWindow.cs) -/Dest [ 1718 0 R /XYZ 39.386457 747.563622 0 ] +/Title (1.9.3 Stockage) +/Dest [ 974 0 R /XYZ 39.386457 195.644022 0 ] /Count 0 /Prev 2101 0 R -/Parent 2097 0 R -/Next 2103 0 R +/Parent 2099 0 R >> endobj 2103 0 obj << -/Title (5.6 F1TVEmulator.cs) -/Dest [ 1720 0 R /XYZ 39.386457 747.563622 0 ] +/Title (1.10 Optimisation du programme) +/Dest [ 976 0 R /XYZ 39.386457 717.534822 0 ] /Count 0 -/Prev 2102 0 R -/Parent 2097 0 R +/Prev 2099 0 R +/Parent 2011 0 R /Next 2104 0 R >> endobj 2104 0 obj << -/Title (5.7 Form1.cs) -/Dest [ 1734 0 R /XYZ 39.386457 747.563622 0 ] +/Title (1.11 Ethique du projet) +/Dest [ 976 0 R /XYZ 39.386457 459.278922 0 ] /Count 0 /Prev 2103 0 R -/Parent 2097 0 R +/Parent 2011 0 R /Next 2105 0 R >> endobj 2105 0 obj << -/Title (5.8 Program.cs) -/Dest [ 1754 0 R /XYZ 39.386457 747.563622 0 ] +/Title (1.12 Utilisation de Chat GPT) +/Dest [ 976 0 R /XYZ 39.386457 354.920622 0 ] /Count 0 /Prev 2104 0 R -/Parent 2097 0 R +/Parent 2011 0 R /Next 2106 0 R >> endobj 2106 0 obj << -/Title (5.9 Settings.Designer.cs) -/Dest [ 1756 0 R /XYZ 39.386457 747.563622 0 ] +/Title +/Dest [ 976 0 R /XYZ 39.386457 265.576722 0 ] /Count 0 /Prev 2105 0 R -/Parent 2097 0 R +/Parent 2011 0 R /Next 2107 0 R >> endobj 2107 0 obj << -/Title (5.10 SqliteStorage.cs) -/Dest [ 1780 0 R /XYZ 39.386457 747.563622 0 ] +/Title (1.14 Conclusion) +/Dest [ 976 0 R /XYZ 39.386457 176.232822 0 ] /Count 0 /Prev 2106 0 R -/Parent 2097 0 R +/Parent 2011 0 R /Next 2108 0 R >> endobj 2108 0 obj << -/Title (5.11 Zone.cs) -/Dest [ 1792 0 R /XYZ 39.386457 747.563622 0 ] +/Title (1.15 Notes de code) +/Dest [ 978 0 R /XYZ 39.386457 771.023622 0 ] /Count 0 /Prev 2107 0 R -/Parent 2097 0 R +/Parent 2011 0 R /Next 2109 0 R >> endobj 2109 0 obj << -/Title (5.12 DataWrapper.cs) -/Dest [ 1802 0 R /XYZ 39.386457 747.563622 0 ] +/Title (1.16 Glossaire) +/Dest [ 978 0 R /XYZ 39.386457 710.770122 0 ] /Count 0 /Prev 2108 0 R -/Parent 2097 0 R -/Next 2110 0 R +/Parent 2011 0 R >> endobj 2110 0 obj << -/Title (5.13 DriverDrsWindow.cs) -/Dest [ 1820 0 R /XYZ 39.386457 747.563622 0 ] -/Count 0 -/Prev 2109 0 R -/Parent 2097 0 R -/Next 2111 0 R +/Title (2. Cahier des charges) +/Dest [ 980 0 R /XYZ 39.386457 757.223622 0 ] +/Count 5 +/Prev 2011 0 R +/First 2111 0 R +/Last 2115 0 R +/Next 2116 0 R +/Parent 2200 0 R >> endobj 2111 0 obj << -/Title (5.14 DriverLapTimeWindow.cs) -/Dest [ 1826 0 R /XYZ 39.386457 747.563622 0 ] +/Title (2.1 Contexte) +/Dest [ 980 0 R /XYZ 39.386457 669.390822 0 ] /Count 0 -/Prev 2110 0 R -/Parent 2097 0 R +/Parent 2110 0 R /Next 2112 0 R >> endobj 2112 0 obj << -/Title (5.15 DriverPositionWindow.cs) -/Dest [ 1828 0 R /XYZ 39.386457 747.563622 0 ] +/Title (2.2 Projet) +/Dest [ 985 0 R /XYZ 39.386457 124.199039 0 ] /Count 0 /Prev 2111 0 R -/Parent 2097 0 R +/Parent 2110 0 R /Next 2113 0 R >> endobj 2113 0 obj << -/Title (5.16 DriverTyresWindow.cs) -/Dest [ 1830 0 R /XYZ 39.386457 747.563622 0 ] +/Title +/Dest [ 989 0 R /XYZ 39.386457 436.953222 0 ] /Count 0 /Prev 2112 0 R -/Parent 2097 0 R +/Parent 2110 0 R /Next 2114 0 R >> endobj 2114 0 obj << -/Title (5.17 OcrImage.cs) -/Dest [ 1838 0 R /XYZ 39.386457 747.563622 0 ] +/Title (2.4 Cas d'utilisation) +/Dest [ 1001 0 R /XYZ 39.386457 771.023622 0 ] /Count 0 /Prev 2113 0 R -/Parent 2097 0 R +/Parent 2110 0 R /Next 2115 0 R >> endobj 2115 0 obj << -/Title (5.18 Reader.cs) -/Dest [ 1868 0 R /XYZ 39.386457 747.563622 0 ] +/Title +/Dest [ 1003 0 R /XYZ 39.386457 771.023622 0 ] /Count 0 /Prev 2114 0 R -/Parent 2097 0 R -/Next 2116 0 R +/Parent 2110 0 R >> endobj 2116 0 obj << -/Title (5.19 Settings.cs) -/Dest [ 1884 0 R /XYZ 39.386457 747.563622 0 ] -/Count 0 -/Prev 2115 0 R -/Parent 2097 0 R -/Next 2117 0 R +/Title (3. Manuel utilisateur) +/Dest [ 1005 0 R /XYZ 39.386457 757.223622 0 ] +/Count 19 +/Prev 2110 0 R +/First 2117 0 R +/Last 2135 0 R +/Next 2136 0 R +/Parent 2200 0 R >> endobj 2117 0 obj << -/Title (5.20 Window.cs) -/Dest [ 1906 0 R /XYZ 39.386457 747.563622 0 ] +/Title (3.1 Installation) +/Dest [ 1005 0 R /XYZ 39.386457 707.865222 0 ] /Count 0 -/Prev 2116 0 R -/Parent 2097 0 R +/Parent 2116 0 R /Next 2118 0 R >> endobj 2118 0 obj << -/Title (5.21 recoverCookiesCSV.py) -/Dest [ 1936 0 R /XYZ 39.386457 747.563622 0 ] +/Title (3.2 A quoi sert l'app ?) +/Dest [ 1005 0 R /XYZ 39.386457 608.700522 0 ] /Count 0 /Prev 2117 0 R -/Parent 2097 0 R +/Parent 2116 0 R +/Next 2119 0 R >> endobj 2119 0 obj << -/Count 180 -/First 1939 0 R -/Last 2097 0 R +/Title (3.3 Utilisation "Simple") +/Dest [ 1005 0 R /XYZ 39.386457 391.297422 0 ] +/Count 2 +/Prev 2118 0 R +/First 2120 0 R +/Last 2121 0 R +/Parent 2116 0 R +/Next 2122 0 R >> endobj 2120 0 obj << -/Length1 7240 -/Filter /FlateDecode -/Length 4662 +/Title +/Dest [ 1014 0 R /XYZ 39.386457 347.470422 0 ] +/Count 0 +/Parent 2119 0 R +/Next 2121 0 R >> -stream -x9XTs , he5uYP -JSXb&& ƆDM-,(Opg3wW$/w{39md:Hz4Wiqм@nj*yI ,6*-8DZ&e B4Wq.SsaÁwJ'b3nBzf`RʸnAل8 W&De'$ -q=9jBnavTcSSҭH4 5:'_xQISŸmb(:YtƵۃp$ԺZ)Wԑ* -~E$MdF-l_4O%=EIL!5!"uN|>{@ҝ$Si)iY7VMu**d#>X{`5p@~ iÿX<) C^Xb?6<:,W׹P89t VbUO 3+#$E!Ab!$ň/dulʷqm8r$ˤ0b}P4^_XXgK+Ѷ܌`.9G&A, vR Ze m-`Bo|,FYo3wtջ0/Qc#Ndo^_ԹK:iHOQ_NGJ]g&SV4EaB{eglʌ.cSc{4+U?cV$~=52fጩ^^0w('<+Q5!Z!kvx immŜ_]cW?ntR쨴tiPv|ѵ݆àB/.X:9c ߳Z؎фx( -0ԝOxxCd/W>(-Z_d#EF,o.A+Fە6 w`lrI0P RGb\+吴|XTdmG:QK -aP> 1k FZˬ18s7 !$]~9mjTt`bwsJS2b"eq\C)ԠDaG&w+]c-;l%:ۿ t;j +w̫Wovz.%Wl.wOM}Wy(:.TZ@7SW,.Cwm>eǂ[A[{fm EUrֶN(il!mֳ2 %WQ>rb%^2NjR. b{Ut)M.2W6뮨 P6GQkG]Rs΋dbP)ʔ |h(T]HN_Ç8Uطb@G}i0Q.l Ƥ/Bɪ=T/^|`+V>UUO˹FGʑ:z0a>;Ӝe`͹&\ݟ Eo@e0$=vp"%y ܶբ!@AY4Vqy>R՝_+a4$h*|E!Xt9UV. 9}?> WܷܺOz.jn/VVF;>~b -{ 2妰TyaGRgQ-J>Hk\M%>&J,ؙ};.:@ox@ɌЅcĩ^%]+]~;[oޞ&o-0b4ShfPbLv$ُW~NJ~gMr1La)&2վcZ s9gV|)Qv-2"{p -ӑS1?;b &\eӊLϼ,EDyJ;3pq`6gMWC?xI0>ddZrt[ǗNgl/+}{ -O 'j;e<y8@fbBYC*m`rIw rB;< Tp֎QZ'ޣ566nO)ثHl` _+PU rUBBikh%{xn*o]ޤuu{qϳWz1~ӇU *f=^J ^5L]Э>]G<=ڹ~})w7O"mäjT-~bE Y- *bZ:V.&M*\1 4?9V -7t%$G^àh -`Y5Ի~U13L @_/| vQ;asmsG75?C R/5hq߮V_3oiꥀ I{ 8*駣"Ze. M-s}"kY9cN(@aa=Һ-ـ[;z%dA,ZYn{fYaUb3d@R2Ct8ݝRɲ`3DZ24z<.\|YʁJ6wsg n8mvk 1&)C":*Ā6? Gn6^~GZ;~WYlDrLUz/FS$D``Аtc!nn.i%ˈ4FOoLMn!=)~ʔĄtjZW;U_붭hK+nqcu/^..A97H9H?l{Ʞ3~LeY0NTFZdZvL}/ڹtXc닯a¸~ --gO| Dyj}~^* OX=7zKB3ҨuoJh퐢37DNJK&OM낷F~.xtw|:˽[|A]eGg1!bPhmGA]Z7 ;lgwtֳV҅R/[.ŝʳ^6 uhm{:׬zeʕ@_O/-5J7B5hsq'xLCĽ[wR0/Gw~8GQCB[Rg/"ظOaAcDUt3u76a%]WӼs'!vE1cVݺ%Vw2pAk4F k&zŋj[i:So1EB? t|ycj e+acoOju"?4dTfEofH7Q>F, W5| [ V $$ -endstream endobj 2121 0 obj << -/Length1 32276 -/Filter /FlateDecode -/Length 8510 +/Title (3.3.2 Boutons) +/Dest [ 1025 0 R /XYZ 39.386457 309.260718 0 ] +/Count 0 +/Prev 2120 0 R +/Parent 2119 0 R >> -stream -x= XT{s (aD,q@ghjffCq )">H!(-2̼E^Ϳ30}wg/ל}ck8B-R$Ǐ:Qv 6\}A}o[#!7Uj8}w!<5#0jRǡaƬh8Bo:=0햭Pw+ -J:}dς{ެ>{AW BmIx;sZBڻ Əe!s"/CalVįjdg:BSH]olh4*BXkF A" @o!8:B=Bu#ZkՑz~u Ht='Y9=}3_Xk5v <4~H p:#p: t ec"$Tf1Hz(kH/Y+h=vUcu;Ѫ@.QJC7=bkX9aeU%Y@"K\Ezu^tBOo[iO -]#<lƽJJ6V/gJ'WRxVҚ4ܼP{&$lh1Gţ{2 -_t1#@ut|yJCILsIYܞV%1ơN#ޭjkuhϽ7ОN`5B!V[ڇ`s30v6dH*~!7iq9ӂ/1-6ښhkdcq9"jca˖ [koO*I雳6Zqk\Zei<<70$X4:ug8j4( xq߂e)8 ː6?SxDm+*WK"Nɞꮮx$J*>8Йա5#UfXXz.)"=ۓf3/_xL^wYeW{``EpQlҋt1X]@:f7A/6V Lx+}),o!,hn';nqaak8ƅTӏyd[!.3(Opә lr?9hC=94f=ao<~{4n0RO,-N]fo4lt9zɥi'<8vh|%T,13$ю&xb}0Y昻klQj|>ѻd:&@#nX9U3a+n1 HNdV@!+GPPp1;?J<q)KCGw,tjM~چ@H@j}rn>!wcnЖ"_:uZ}hohS]`} nN}_9a[au9Mye {dDc XTH1 -ߌoͦtz25ol -k(?]2[G8'TtA^UJ?JqǛwR,W)3xa0)z/xl_ɧ@e%sG sbe k@G@@ [0SG@*` 6isƧ-T ~Ӧ71Һ -~}U C ?b!t`j+iͼ,l\ <i[vn`˭KV?6߳:), Gv(\ўO;?u΅Ki̫MDxYBؕ>|m̑˔F4@vz]؎;*c(raI__dΟn3N?o}_~ۻ!r=wgqㆼ ݓ#6}Wf,T2?Ɲ׶m;'ܞ}Uv)Y -GHz(45aɻ٪S.z|}|#|og.nI411D^!LN=`'ZXK"DyBZYx|<ԟ|ێ=3h*u4{,OѻS,ʨ-gk"G2L3!28W)Z_2SEWpґ|BMgz:5_GlEvJ/eG&ǽ;708w܍\K Lof&vp_L82q2xhZ-FWO4avJ?eGnOLp;L MF)k6tb̊qC4̘=DV?)3N#r'WLtx}`R@ۃ)ogΏyg^`*+g -#s+oMw+ -SU~>-rxLJΆ.<|6䱔7v|-??WLM&qo[V}B!44_x:MY,ܤ=[s^~MxJBI}ٯ0IeSg6S -]_o~f˻⽧/^\.r~f^czE0;*Аި4RJͥ4P:]li))54{Z)I!^+$CǙ[Rx4XJIͦ1~92FR]znGw>/L䘺aqG glOh7lHț}P@@U}X{|s -qs"g$I˦hᵘ 2݆>ڻ&}rqʄS ; 6-/%ÝA"m_P+8[3H3$^$>? /߇ aߗZũX-ZGj~Eyyj4V8kVc&Z;O!uԌىd*qZ DNefS%&]aE^‚WtR&o[a:Lze>$NQj %i?_LkA'R:Ig]'zG`JMLܢlƈ3q1%5>3"Ly$8KXΊ}c@T2$Tϳϧ-a\0S'ZnF^_lр>H6՚mIs>qIZz5H!I 5P_C5Pg -נ:"MwI@继XpW*Ԣ"L+mY2q3MU!*СggݼTh9*d_^4UZׯF.ޅpF  bOMwOz_ u^Vp^T.8+M -S{O53|C -2T#.A5pˮU"S}:.ԘeSd -izfK=Zb"@E'5 &|\VZ)*\Vo/aV. h,G^#'4}q!yTMG + :TMGX fb,NTpvd{QDl! Mx[nMfmy'l|سmW<qx≀q5?,(<0x2nlxBnp k!cGSw%On<-Y}ҔG vs -LD))Qðg>mVnG#Nk*}ef?+\j}Y8nkH@iMoԋCKACZxFuZl*8ֲ:l[ZyTjM -*n>{oMfo/-_`y kD_y\KN+ AhAoh -EsD(Aps%A 74EQo(FE B`Њw:̃`h |aݺAPφ>y@N ̆9fН ܠe& -N# DAYF!&{j~1;OML%_mȮNvulmؓwtPbɏ}WsL=>7`m`1 !0: - zJ=V&*!U*S`7a__foR^L),YN{y~*a8y=kѤ|}Pc@\е (< 4壯gᕠ0̀;hI{  {.,bѼ={Ic> ЮSohׯ]_.IANbh7vPm(f?V6)7󔾯<'.A{$X;[>hb7An6Y!B -endstream endobj 2122 0 obj << -/Length1 6952 -/Filter /FlateDecode -/Length 4583 +/Title (3.4 Calibration) +/Dest [ 1044 0 R /XYZ 39.386457 771.023622 0 ] +/Count 6 +/Prev 2119 0 R +/First 2123 0 R +/Last 2128 0 R +/Parent 2116 0 R +/Next 2129 0 R >> -stream -xYyXSGsNV@X TmRmZ -AqCPܱbqA B(ZwEPZiZ!|/39n{gN(qhd -B/B1yŜ^3fFDq-BpQxEH!YCHP7&8O4XS=~s6a<93wzh;Bh{x9Av*ωu˄Q14 (m7.-9asYɾn0m$/$P2?0ON;ݴ\B'<@O._'PH=G^/W8õ㏆$T,!L<8.ݲh^Zy7H\ 9r awB^#a&ܙЛ+x4T/Z%@ul/EeGзrJ2q=*叠I|%C`^RwNZ4x #l~$@t&{` jdS`!Or!#_o/G{jXOϱ(ÃQyӔF -w˕XAf'K<B8QhC΄jlPHe˽hQk^nF -޲鴚zE҂Q3K~1lB)AJuՐ:5Qe0"T #ZVJoD|7C~4#Ś҄si?IBÈq*:4iׇb.^J@3d{4݀ߑtdoJ;6B$ymf.J_Ѹ(viWt'6lS~@u2!s%s˃wWL-o )Oؗ:: :2 `Lʅ8Z|)Q9:ik6S8(8`̨Z'?7fi6nj,F3+78?OHE$kBыG}Uݖ*n%#Gp.,+ r@ܡM#ܨδ^;s簊Zڂgaѧ's3C9dg)_/{xcΒo>ϤtXZѸ:NqG/Z 3 :Qal;3i}|Uy$6ClU[6:8±Cy,^ZX~ܒn_v8[ߒ MoF$| 4dz=NpZDXbvyle6ɾmc}d! ?E}aC uG{ܴ>?mvj╏@gi< ɬ7[p ֝hv[|RU (A$k;wW]Vyxnxmʓ'gm;}fwyKis~ -p]+8fUX?:B>7"%,: -|dzc\IDǗ?ڍ>r)^jф8&yҍ<~J+=}9ݷoZO[ .#‹up'CɴH]Kpϼ!ÎBVz6Uc>{b5H2gS![dCƽ ke`Af8_:qFȕtT+2+c;n(}R c5^=j -[ M$dg۰2O{fvz{)Ku!L:x}lFw@W XFA yqΗF}D(2?nVn+ܦ!Aqej71&F, : (3ҍئhlnl\ -8̗dY7S D -U-2 Lo(OJ,*xAlvaxm]x[TXY2(-4ъgr_kcmI?Cog}%lϧ'm Hk!a"rÍqcU!bZ5z3 -Wr|7M#g -ٵ!RS.H5"!) .6R*H=>mpx%Nx~L3 E g3/1&E9'.Ajx\G.,3d~fjy Y.;/zwAE1^ZLɡE{Gw -]P~]:]d1["vSSN Z#,뮥zڙ!CaT>pFɘ:a\2;G'ߊSdߣ//Zp7\k=4V1z:N3r_4$ҪZbl76,W/2p-Tі)j)O{bH[X:f.to<͜5yuX>f_=6/xE)'\Z}nw3$s)t$}+9 >Ѱ[,wǀ}Uj9vh4@[.;C)0dDq,}x5+=yy_i-V#nKhfw2})x|6}؀_IJg:F|us`L Zjs 1Gbnvdl3qm5+;Jq~zr̍]@i W5a&&ZsDt4ّ'Jc#^FfbcU_R2ny̭Sq-,'%NYsu" Y<+̏}ezc[wwd׳w![m#i͓PNc9,oKvpPO r (*VRbӿ u[f>YrО ;>vmɢO =G9CEu)P~9F)`eXB.5%%u4s&ri;e:.4fv 㸋iwjӀվ"Z m2,)Fs[qej͑L1)mQ,h7-݂MB͓ -"$1p \ zgXg"lnI( *ػ 'EIHN2$Vd{H[:=PݑĵDN}hw~ ឞftS`SR+cAho>YvwW#oi}?1R!coM:\9j,XHgJϗ8m\f2Pu6b1rx,k81d8/;r$r^i wш'T3wu AtѓYIɅ)6ZvbܙvF@Et ta9;ɑCۑ^n>>9%z)+3Sw|xdږnZ~-N|Y-OqnY+tOD=piZ:Bn)y'ݮ s6u]("K^z5aAƗf\HG;WO^D|ߘX ]iQU Oʉm@~nb<-'+UnQ qdq nǬv +/Dest [ 1044 0 R /XYZ 39.386457 661.536522 0 ] +/Count 0 +/Parent 2122 0 R +/Next 2124 0 R >> -stream -xXyTTGֿ%J 11&J/wGs+1₂ b01ĭ1*B SJpK\xs5(f9|9SuZo{@> :pG+Ui]l J6Plg;p9AKf KPT?w@F+b/}.Gz; U3۹|VPLQgE}T(?w g9- %4$< 7l,|ͷ}tMl()EIlTAUJu:tG<;abH -fр$;|)ߺ1|0)1Q1X w$&Dṉ̂9^LX`%y40Qh<Ł A< -Gapz=_?OT!I WӹD:rzTh{!QS`. |}vw6 WVhV=~M/i?̛YKopЏ=Ђ=M a(10"! -~Vmp|2>Ɓ˸s23Yd#ʒy"<̥1׍9U^=\%W/ss*8 -C!K8,T -AԋvB%7i!J;0{\@*7y Kzμ kVb*M!?h -nm4{j\$}a}sРo"^>*E !N-E4szM=3PxpDfQ4:cgKV04CC}6Y:z~Z犭>a볓NG#eA>񏑢h#gVI*W| -MWSGbW[-ڥV[Φ֢1gmH佸0 Vw߯ W IWqh&a 6hF֩QѪU|LYY%+I+Awq:~ vj>r[1ue>c (Ao1htzLЅT8~/+hDƟӶ%ɩlf Fz'ʡatpchtAy I+twT_m8(X(N9y-tc7-H(hֳ'o{H -sˌ<օ[k2?VƖ WصW&Y|#zp7g,t茴>#tfo'hJ%ixL,k g/p?|n[޽ b}Mv=Ac3Oww -CAxx;9'=Q*"w2F,lu'Bk >UdIG:6\u'" 2ޠ'I-gZL'mw)G??g):sy$7]xug=Gx>HkH{bk a{ t'%+wH{#S6oߞL>2xk٩x9~ qkThw旐 ryL4Vqʸ2/9݁M[B1a~#ǮHpqG]QM|TC/$w[3fҺQ>Yt.~?2wDY&#:dK!Ԋ5U.=v.d(6,: (!nN9(o0zZzOl0<麩]4]PcM:wdfן|Gͽ gF:/iIYT+}\̾ļC>fL>8qw4ᜄ[k(TIh5BpZ]}%$XwmR%%J*ir}5c&b}Z+7`f]Y2m]]r-WGM@< tyW;0bݡ2iߕM#*rcq&7vpjF߷K}ȉonY2c -ǎVq#zsȽMgӑȳq-@h&ViMz=7[zyZY'|0#ΰ0^ t^s!<>i-G}R:毓+6[~U~G+Bg2(!Me;w-ׯ;CvQKna|щo+йE~oZ2J31("W[r">E})>kQzl8XD&ݒ0)dCf*["I~B,ܝQSa@--%x X4Z6qgĮ[:\9dx||,S`#!z 0_?2W8`@O4)y%*kGkMf$a4소N*_p -joT",dl F*/K |ON`IFa|3v%(~7vfd-Ԥq/#Id='mC,BXWtŕmi@ H_m,褯T+Ѕ>qYAGLC6"*ɀ'I&M)2Q/Y)"iyIV@K9Iī~o_]R|^W(wh S7VZ;.)]hɳ_x/ wԏhXDhpF1K;-hNo][ZbިMK&oV='D^MvEsN?4e ݗ߷®^[Ӿ0wT[dDʼ!\bQ߹hxn!ctMkE+g -G4߰:"& F7!bڃG`!CL\2)~Ӄ}:n8f@Y+$<ؽa˖hC?xCKz5(_BpD߫8wBw r:pӥ\ +/Dest [ 1044 0 R /XYZ 39.386457 269.144922 0 ] +/Count 3 +/Prev 2123 0 R +/First 2125 0 R +/Last 2127 0 R +/Parent 2122 0 R +/Next 2128 0 R >> -stream -xY @Tӿshf@J"XER$CDD$!#O>Lҿ!>=|s"Vq{wf̙3.ǽĥs<pnҹgs,op7#_{slP lFG$ñ]4")39mq)џi*9Nq,PK/>|`<A}z텚iamkDMĶ͊%vb6lubB  >!Sqֆk]קGG -Rklj_?3#w3k'qM'?a+'8BR״WMto(" /?P0 zK-Cg8}:,1zNNh&4 R;>7*PlW }! HYH=H;rtus2ҴLnHv::uHz]M&dϜ -qbMZڙysHH:pB:tLVF{xmՍScFjDjG2<OѫHb ĶMrQ{zn_\/xxFc $oq^Hu;@)a9 ~ -rTpOFEɷޖ_WM/XC-]2O-)KnKY#]+%m6 S dl38lp7jhbhcl8< - k 4oЪA z0x`^.\; 1j1o yT.|JqpI 7\\+,e"H2H @̣ee˺o юe=>F/=Hjh|B#JhU1=>\UR Nىasuu``*ZZ .\2w械†%>4:Bj@ ]lrF o/|go7?t&^ԟ_|wi3gad#S= 4X۾wJ^{ G'γ>_R f NN{sC\p98(XVrTn1D".Jn@ήnnDe#Z$;D$qs*LGZP=Ѵ @8_H!1|T#FĭRBΈLf)C]{4|EgVR/8-R/Qi$HDu]I85 HcJIh-T J2Hdcp;jOIt঳}?FIx|~#6<#;mmԄ8g:N x}oV^nnޖ-=6ߏҫ6Ы\ ,ki!FՃꍸ0L%.v -f'x&у*!ٯY;_X_e2WM7\W.0J!T'a.JˉK/Eʉ*M][*X'mlnM݇qcJ@WK:\TɖT寨h)(0k#ޱ(59s/^hH1v>^Sz2ⳣ>WW!;+Uٱ al1ANrN<lu;;m{⛪?NA>E=(cƍ#'hMKl2:ȳĝܷ/E0#C%\N 1ԸHZeHs3r1bkts9 -[<7 .ܖpm(xxaAO(ui)nǦM;6\(;V\vD&I/e׮K@k!o Dċsafr.K^ -3f9[{0͒}YΉYϟ@xH9Ed$4`2wM4f$k\Ũtk#ƽ.j6SwDYK޲3>1BbKY\y0"B ?CYZ{+GB -_]B AX{;)F.TL|1VAÎ9C&h8[%/!.N)[,yV0X<)3޿*2LaA$2gAu}ٽ~ =CVUp#9D36=t]dFwNvW7+|cmY -/fdƦoj9oKހ v387N軰4?#]2>ڵNJk0/: [ 3b@a0hdbjĴx7GXwB]9.GvHPHy UBLMc5_]0^0-s:EFȆtt3K|@4b -lml]G3 NITUXyߚJ>2_J -4+8I+3|9wQ EFSh-]889w3r2KQ'+7^uz@Ws`ˎEBjr$?}[t,ц]8 ~^z98|b;DX~EߞO˾MSJ.z^_<%keT|ox@Oٱ0vYweGt`dORW -9Z O*Z@?8ȥdheƋ!z׉`v*}RzpPZ 81Ͽ1l( ;}*(ކ(V&.Il99OQ|\#7Nvp?߹9m}bb.n 6lڴ!ks̮]qF>K-C8ZocǕ[?Pg|7y%s -;g;:Dcc͘զ"Tk]R%ZJ€"WlӰ٘o&3[&ch -nm?~zBܖ~K~ h|A3/ l|Z(ؘuK_~` OuAv1|mɬaٿg.84Gͅ VM[qRyKN|sA%-{҂If w&('$b!a!n|AX>Sz'5wsmKz] =J{53} ̩ZSkgPnZDƎ0:Y$-dO?ӭao#b:Vύf)$ld'TxLtgi~K?fj5$_5i$A" -SyglX?!W ׉٢7Yel޺us֭y]{tm߷޸}[)-c^q - Qvpt兄 n.d_^w0/G|5k@Ëŏ_vVVNNVV6yel N Lfӂ`(LZ iKѦ}A8dzʧ{㇯5-B5ipFZўRC:p"o O =wǖ/=p݆G>!Bp?2nܼ>_)]_qJ.qqZ>l]eC3dXByMMI4Ӱ䦛M*W${|M$<!V&bOձm:qb*9s%[^4(E.]< ];B@oY|j`DZڲC_VB5SShM \bX P݊%V _hp55pN#0 P>2w_J-1u15!ǽe;nShQз۵oBLdI_]DZ4 B䋕I'?VdOaMT]!w;1œ%N~"]f|c7O|ޛ Y暭Ew_A{a-Ovo>bK@Ij#> D]t/zNQ^y +B>͛>=/Ԛ'[F ߲I^P~aW^i=֓ } -`+]P3|Iٛ?y*#MWXuaQ_߹s}.[~hlZ[pphHHHۇ&8Ž:b[mJh׷zyq_?վ>KC~Ԋ1?1$8d_{Z[{6Iwx. pø[{)f-D.[-r1j~݆sCway"j. ie >í@qx7Æ߯+Il-yJyr%#GF" 36e'.C>O~#wճ@4EHH \,g'TQ(8zY}r?Ή'}}"k&vm9?ڤ -2 Ax -endstream endobj 2125 0 obj << +/Title +/Dest [ 1060 0 R /XYZ 42.836457 587.042022 0 ] +/Count 0 +/Parent 2124 0 R +/Next 2126 0 R +>> +endobj +2126 0 obj +<< +/Title (Ajout du nom des pilotes) +/Dest [ 1083 0 R /XYZ 42.836457 166.651302 0 ] +/Count 0 +/Prev 2125 0 R +/Parent 2124 0 R +/Next 2127 0 R +>> +endobj +2127 0 obj +<< +/Title (Sauvegarder le nouveau Preset) +/Dest [ 1097 0 R /XYZ 42.836457 341.110056 0 ] +/Count 0 +/Prev 2126 0 R +/Parent 2124 0 R +>> +endobj +2128 0 obj +<< +/Title (3.4.3 Load un Preset existant) +/Dest [ 1097 0 R /XYZ 39.386457 189.089256 0 ] +/Count 0 +/Prev 2124 0 R +/Parent 2122 0 R +>> +endobj +2129 0 obj +<< +/Title +/Dest [ 1102 0 R /XYZ 39.386457 322.349771 0 ] +/Count 5 +/Prev 2122 0 R +/First 2130 0 R +/Last 2134 0 R +/Parent 2116 0 R +/Next 2135 0 R +>> +endobj +2130 0 obj +<< +/Title (3.5.1 Overtakes) +/Dest [ 1107 0 R /XYZ 39.386457 307.522050 0 ] +/Count 0 +/Parent 2129 0 R +/Next 2131 0 R +>> +endobj +2131 0 obj +<< +/Title (3.5.2 Last Five Laps) +/Dest [ 1107 0 R /XYZ 39.386457 206.972850 0 ] +/Count 0 +/Prev 2130 0 R +/Parent 2129 0 R +/Next 2132 0 R +>> +endobj +2132 0 obj +<< +/Title (3.5.3 Battles) +/Dest [ 1112 0 R /XYZ 39.386457 234.880422 0 ] +/Count 0 +/Prev 2131 0 R +/Parent 2129 0 R +/Next 2133 0 R +>> +endobj +2133 0 obj +<< +/Title (3.5.4 Driver infos) +/Dest [ 1117 0 R /XYZ 39.386457 294.880422 0 ] +/Count 0 +/Prev 2132 0 R +/Parent 2129 0 R +/Next 2134 0 R +>> +endobj +2134 0 obj +<< +/Title (3.5.5 Live Ranking) +/Dest [ 1129 0 R /XYZ 39.386457 771.023622 0 ] +/Count 0 +/Prev 2133 0 R +/Parent 2129 0 R +>> +endobj +2135 0 obj +<< +/Title (3.6 Erreurs) +/Dest [ 1135 0 R /XYZ 39.386457 634.955622 0 ] +/Count 0 +/Prev 2129 0 R +/Parent 2116 0 R +>> +endobj +2136 0 obj +<< +/Title (4. Journal de bord) +/Dest [ 1138 0 R /XYZ 39.386457 757.223622 0 ] +/Count 41 +/Prev 2116 0 R +/First 2137 0 R +/Last 2177 0 R +/Next 2178 0 R +/Parent 2200 0 R +>> +endobj +2137 0 obj +<< +/Title (4.1 Mercredi 29 Mars 2023) +/Dest [ 1138 0 R /XYZ 39.386457 707.865222 0 ] +/Count 0 +/Parent 2136 0 R +/Next 2138 0 R +>> +endobj +2138 0 obj +<< +/Title (4.2 Jeudi 30 Mars 2023) +/Dest [ 1141 0 R /XYZ 39.386457 263.492343 0 ] +/Count 0 +/Prev 2137 0 R +/Parent 2136 0 R +/Next 2139 0 R +>> +endobj +2139 0 obj +<< +/Title (4.3 Vendredi 31/03/2023) +/Dest [ 1153 0 R /XYZ 39.386457 347.805222 0 ] +/Count 0 +/Prev 2138 0 R +/Parent 2136 0 R +/Next 2140 0 R +>> +endobj +2140 0 obj +<< +/Title (4.4 Lundi 3 Avril) +/Dest [ 1228 0 R /XYZ 39.386457 717.534822 0 ] +/Count 0 +/Prev 2139 0 R +/Parent 2136 0 R +/Next 2141 0 R +>> +endobj +2141 0 obj +<< +/Title (4.5 Mardi 4 Avril) +/Dest [ 1294 0 R /XYZ 39.386457 305.202822 0 ] +/Count 0 +/Prev 2140 0 R +/Parent 2136 0 R +/Next 2142 0 R +>> +endobj +2142 0 obj +<< +/Title (4.6 Mercredi 5 Avril) +/Dest [ 1321 0 R /XYZ 39.386457 293.199726 0 ] +/Count 0 +/Prev 2141 0 R +/Parent 2136 0 R +/Next 2143 0 R +>> +endobj +2143 0 obj +<< +/Title (4.7 Jeudi 6 Avril) +/Dest [ 1348 0 R /XYZ 39.386457 238.444086 0 ] +/Count 0 +/Prev 2142 0 R +/Parent 2136 0 R +/Next 2144 0 R +>> +endobj +2144 0 obj +<< +/Title (4.8 Vendredi 6 Avril 2023) +/Dest [ 1391 0 R /XYZ 39.386457 565.514022 0 ] +/Count 0 +/Prev 2143 0 R +/Parent 2136 0 R +/Next 2145 0 R +>> +endobj +2145 0 obj +<< +/Title (4.9 Vacances) +/Dest [ 1416 0 R /XYZ 39.386457 355.144422 0 ] +/Count 0 +/Prev 2144 0 R +/Parent 2136 0 R +/Next 2146 0 R +>> +endobj +2146 0 obj +<< +/Title (4.10 Lundi 24 Avril 2023) +/Dest [ 1471 0 R /XYZ 39.386457 266.404302 0 ] +/Count 0 +/Prev 2145 0 R +/Parent 2136 0 R +/Next 2147 0 R +>> +endobj +2147 0 obj +<< +/Title (4.11 Mardi 25 Avril 2023) +/Dest [ 1490 0 R /XYZ 39.386457 693.136422 0 ] +/Count 0 +/Prev 2146 0 R +/Parent 2136 0 R +/Next 2148 0 R +>> +endobj +2148 0 obj +<< +/Title (4.12 26 Avril 2023) +/Dest [ 1490 0 R /XYZ 39.386457 222.365322 0 ] +/Count 0 +/Prev 2147 0 R +/Parent 2136 0 R +/Next 2149 0 R +>> +endobj +2149 0 obj +<< +/Title (4.13 Jeudi 27 Avril 2023) +/Dest [ 1497 0 R /XYZ 39.386457 584.282022 0 ] +/Count 0 +/Prev 2148 0 R +/Parent 2136 0 R +/Next 2150 0 R +>> +endobj +2150 0 obj +<< +/Title (4.14 Vendredi 28 Avril 2023) +/Dest [ 1509 0 R /XYZ 39.386457 717.534822 0 ] +/Count 0 +/Prev 2149 0 R +/Parent 2136 0 R +/Next 2151 0 R +>> +endobj +2151 0 obj +<< +/Title (4.15 Lundi 1 Mai 2023) +/Dest [ 1511 0 R /XYZ 39.386457 501.702822 0 ] +/Count 0 +/Prev 2150 0 R +/Parent 2136 0 R +/Next 2152 0 R +>> +endobj +2152 0 obj +<< +/Title (4.16 Mardi 2 Mai 2023) +/Dest [ 1517 0 R /XYZ 39.386457 595.251918 0 ] +/Count 0 +/Prev 2151 0 R +/Parent 2136 0 R +/Next 2153 0 R +>> +endobj +2153 0 obj +<< +/Title (4.17 Recrutement Payerne Mai 2023) +/Dest [ 1537 0 R /XYZ 39.386457 526.101222 0 ] +/Count 0 +/Prev 2152 0 R +/Parent 2136 0 R +/Next 2154 0 R +>> +endobj +2154 0 obj +<< +/Title (4.18 Vendredi 5 Mai 2023) +/Dest [ 1537 0 R /XYZ 39.386457 426.936522 0 ] +/Count 0 +/Prev 2153 0 R +/Parent 2136 0 R +/Next 2155 0 R +>> +endobj +2155 0 obj +<< +/Title (4.19 Lundi 8 Mai 2023) +/Dest [ 1540 0 R /XYZ 39.386457 314.866514 0 ] +/Count 0 +/Prev 2154 0 R +/Parent 2136 0 R +/Next 2156 0 R +>> +endobj +2156 0 obj +<< +/Title (4.20 Mardi 9 Mai 2023) +/Dest [ 1576 0 R /XYZ 39.386457 146.799010 0 ] +/Count 0 +/Prev 2155 0 R +/Parent 2136 0 R +/Next 2157 0 R +>> +endobj +2157 0 obj +<< +/Title (4.21 Mercredi 10 Mai 2023) +/Dest [ 1597 0 R /XYZ 39.386457 659.354022 0 ] +/Count 0 +/Prev 2156 0 R +/Parent 2136 0 R +/Next 2158 0 R +>> +endobj +2158 0 obj +<< +/Title (4.22 Jeudi 11 Mai 2023) +/Dest [ 1611 0 R /XYZ 39.386457 562.440762 0 ] +/Count 0 +/Prev 2157 0 R +/Parent 2136 0 R +/Next 2159 0 R +>> +endobj +2159 0 obj +<< +/Title (4.23 vendredi 12 Mai 2023) +/Dest [ 1624 0 R /XYZ 39.386457 623.694822 0 ] +/Count 0 +/Prev 2158 0 R +/Parent 2136 0 R +/Next 2160 0 R +>> +endobj +2160 0 obj +<< +/Title (4.24 Lundi 15 Mai 2023) +/Dest [ 1633 0 R /XYZ 39.386457 584.282022 0 ] +/Count 0 +/Prev 2159 0 R +/Parent 2136 0 R +/Next 2161 0 R +>> +endobj +2161 0 obj +<< +/Title (4.25 Mardi 16 Mai 2023) +/Dest [ 1633 0 R /XYZ 39.386457 273.038922 0 ] +/Count 0 +/Prev 2160 0 R +/Parent 2136 0 R +/Next 2162 0 R +>> +endobj +2162 0 obj +<< +/Title (4.26 Mercredi 17 Mai 2023) +/Dest [ 1642 0 R /XYZ 39.386457 771.023622 0 ] +/Count 0 +/Prev 2161 0 R +/Parent 2136 0 R +/Next 2163 0 R +>> +endobj +2163 0 obj +<< +/Title (4.27 Jeudi 18 Mai 2023) +/Dest [ 1650 0 R /XYZ 39.386457 459.588513 0 ] +/Count 0 +/Prev 2162 0 R +/Parent 2136 0 R +/Next 2164 0 R +>> +endobj +2164 0 obj +<< +/Title (4.28 Lundi 22 Mai 2023) +/Dest [ 1657 0 R /XYZ 39.386457 649.970022 0 ] +/Count 0 +/Prev 2163 0 R +/Parent 2136 0 R +/Next 2165 0 R +>> +endobj +2165 0 obj +<< +/Title (4.29 Mardi 23 Mai 2023) +/Dest [ 1684 0 R /XYZ 39.386457 234.994819 0 ] +/Count 0 +/Prev 2164 0 R +/Parent 2136 0 R +/Next 2166 0 R +>> +endobj +2166 0 obj +<< +/Title (4.30 Mercredi 24 Mai 2023) +/Dest [ 1689 0 R /XYZ 39.386457 629.325222 0 ] +/Count 0 +/Prev 2165 0 R +/Parent 2136 0 R +/Next 2167 0 R +>> +endobj +2167 0 obj +<< +/Title (4.31 Jeudi 25 Mai 2023) +/Dest [ 1691 0 R /XYZ 39.386457 446.337222 0 ] +/Count 0 +/Prev 2166 0 R +/Parent 2136 0 R +/Next 2168 0 R +>> +endobj +2168 0 obj +<< +/Title (4.32 Vendredi 26 Mai 2023) +/Dest [ 1699 0 R /XYZ 39.386457 249.143222 0 ] +/Count 0 +/Prev 2167 0 R +/Parent 2136 0 R +/Next 2169 0 R +>> +endobj +2169 0 obj +<< +/Title (4.33 Grand Prix de Monaco) +/Dest [ 1699 0 R /XYZ 39.386457 164.992922 0 ] +/Count 0 +/Prev 2168 0 R +/Parent 2136 0 R +/Next 2170 0 R +>> +endobj +2170 0 obj +<< +/Title (4.34 Lundi 29 Mai 2023) +/Dest [ 1703 0 R /XYZ 39.386457 771.023622 0 ] +/Count 0 +/Prev 2169 0 R +/Parent 2136 0 R +/Next 2171 0 R +>> +endobj +2171 0 obj +<< +/Title (4.35 Mardi 30 Mai 2023) +/Dest [ 1703 0 R /XYZ 39.386457 547.990122 0 ] +/Count 0 +/Prev 2170 0 R +/Parent 2136 0 R +/Next 2172 0 R +>> +endobj +2172 0 obj +<< +/Title (4.36 Mercredi 31 Mai 2023) +/Dest [ 1703 0 R /XYZ 39.386457 339.971022 0 ] +/Count 0 +/Prev 2171 0 R +/Parent 2136 0 R +/Next 2173 0 R +>> +endobj +2173 0 obj +<< +/Title (4.37 Jeudi 1 Juin 2023) +/Dest [ 1703 0 R /XYZ 39.386457 270.835122 0 ] +/Count 0 +/Prev 2172 0 R +/Parent 2136 0 R +/Next 2174 0 R +>> +endobj +2174 0 obj +<< +/Title (4.38 Vendredi 2 Juin 2023) +/Dest [ 1729 0 R /XYZ 39.386457 608.680422 0 ] +/Count 0 +/Prev 2173 0 R +/Parent 2136 0 R +/Next 2175 0 R +>> +endobj +2175 0 obj +<< +/Title (4.39 Lundi 5 Juin 2023) +/Dest [ 1747 0 R /XYZ 39.386457 229.986499 0 ] +/Count 0 +/Prev 2174 0 R +/Parent 2136 0 R +/Next 2176 0 R +>> +endobj +2176 0 obj +<< +/Title (4.40 Mardi 6 Juin 2023) +/Dest [ 1757 0 R /XYZ 39.386457 150.125803 0 ] +/Count 0 +/Prev 2175 0 R +/Parent 2136 0 R +/Next 2177 0 R +>> +endobj +2177 0 obj +<< +/Title (4.41 Mercredi 7 Juin) +/Dest [ 1761 0 R /XYZ 39.386457 648.093222 0 ] +/Count 0 +/Prev 2176 0 R +/Parent 2136 0 R +>> +endobj +2178 0 obj +<< +/Title (5. Code) +/Dest [ 1765 0 R /XYZ 39.386457 757.223622 0 ] +/Count 21 +/Prev 2136 0 R +/First 2179 0 R +/Last 2199 0 R +/Parent 2200 0 R +>> +endobj +2179 0 obj +<< +/Title (5.1 ConfigurationTool.cs) +/Dest [ 1765 0 R /XYZ 39.386457 707.865222 0 ] +/Count 0 +/Parent 2178 0 R +/Next 2180 0 R +>> +endobj +2180 0 obj +<< +/Title (5.2 DriverData.cs) +/Dest [ 1777 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2179 0 R +/Parent 2178 0 R +/Next 2181 0 R +>> +endobj +2181 0 obj +<< +/Title (5.3 DriverGapToLeaderWindow.cs) +/Dest [ 1783 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2180 0 R +/Parent 2178 0 R +/Next 2182 0 R +>> +endobj +2182 0 obj +<< +/Title (5.4 DriverNameWindow.cs) +/Dest [ 1785 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2181 0 R +/Parent 2178 0 R +/Next 2183 0 R +>> +endobj +2183 0 obj +<< +/Title (5.5 DriverSectorWindow.cs) +/Dest [ 1789 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2182 0 R +/Parent 2178 0 R +/Next 2184 0 R +>> +endobj +2184 0 obj +<< +/Title (5.6 F1TVEmulator.cs) +/Dest [ 1791 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2183 0 R +/Parent 2178 0 R +/Next 2185 0 R +>> +endobj +2185 0 obj +<< +/Title (5.7 Form1.cs) +/Dest [ 1805 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2184 0 R +/Parent 2178 0 R +/Next 2186 0 R +>> +endobj +2186 0 obj +<< +/Title (5.8 Program.cs) +/Dest [ 1825 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2185 0 R +/Parent 2178 0 R +/Next 2187 0 R +>> +endobj +2187 0 obj +<< +/Title (5.9 Settings.Designer.cs) +/Dest [ 1827 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2186 0 R +/Parent 2178 0 R +/Next 2188 0 R +>> +endobj +2188 0 obj +<< +/Title (5.10 SqliteStorage.cs) +/Dest [ 1851 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2187 0 R +/Parent 2178 0 R +/Next 2189 0 R +>> +endobj +2189 0 obj +<< +/Title (5.11 Zone.cs) +/Dest [ 1863 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2188 0 R +/Parent 2178 0 R +/Next 2190 0 R +>> +endobj +2190 0 obj +<< +/Title (5.12 DataWrapper.cs) +/Dest [ 1873 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2189 0 R +/Parent 2178 0 R +/Next 2191 0 R +>> +endobj +2191 0 obj +<< +/Title (5.13 DriverDrsWindow.cs) +/Dest [ 1891 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2190 0 R +/Parent 2178 0 R +/Next 2192 0 R +>> +endobj +2192 0 obj +<< +/Title (5.14 DriverLapTimeWindow.cs) +/Dest [ 1897 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2191 0 R +/Parent 2178 0 R +/Next 2193 0 R +>> +endobj +2193 0 obj +<< +/Title (5.15 DriverPositionWindow.cs) +/Dest [ 1899 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2192 0 R +/Parent 2178 0 R +/Next 2194 0 R +>> +endobj +2194 0 obj +<< +/Title (5.16 DriverTyresWindow.cs) +/Dest [ 1901 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2193 0 R +/Parent 2178 0 R +/Next 2195 0 R +>> +endobj +2195 0 obj +<< +/Title (5.17 OcrImage.cs) +/Dest [ 1909 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2194 0 R +/Parent 2178 0 R +/Next 2196 0 R +>> +endobj +2196 0 obj +<< +/Title (5.18 Reader.cs) +/Dest [ 1939 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2195 0 R +/Parent 2178 0 R +/Next 2197 0 R +>> +endobj +2197 0 obj +<< +/Title (5.19 Settings.cs) +/Dest [ 1955 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2196 0 R +/Parent 2178 0 R +/Next 2198 0 R +>> +endobj +2198 0 obj +<< +/Title (5.20 Window.cs) +/Dest [ 1977 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2197 0 R +/Parent 2178 0 R +/Next 2199 0 R +>> +endobj +2199 0 obj +<< +/Title (5.21 recoverCookiesCSV.py) +/Dest [ 2007 0 R /XYZ 39.386457 747.563622 0 ] +/Count 0 +/Prev 2198 0 R +/Parent 2178 0 R +>> +endobj +2200 0 obj +<< +/Count 190 +/First 2010 0 R +/Last 2178 0 R +>> +endobj +2201 0 obj +<< +/Length1 7328 +/Filter /FlateDecode +/Length 4734 +>> +stream +x9XǶs/ teYQTXQQTl ( jl+1шƈbM/cؐXhTFξ3&79gN?gd:H>AzsĞ4wiqЙ =n|rD)%"%؈4bEp=oӦᄨ.bUO8v8hx_A|"~%gf %c$GdiV)%"9nQ4±id+Buۇm CBYRuƵքp$ThL_H-irjy߂XL!^ y!ʖpPekG NL!1Yω~R2' 9.`^ПtZNZ{Lt/5X{c{׿btdxVޭ%??Kv$aUS.O}OZX1Nt@̢EU{t0 %!~Ԑ4V{%W'a7nĪA;2v;b|GIwn<'/2e]}5:Vu-h*auʸ! . ЎfCC&Z:DW;F+ Hsvss:8`E<\b3OdU.}m-G&LNќ@eG|*7)ыfLӔ(et8z4:YVڇ޶._c&_9& rwzҁ{IAe݅#`tx풉Y=ۚ QM3ݍq K}g7ῲ*;N}]8NC\8_Cٕ3p0MYkQ 4Am|Ji pZVj]*!% ڠ|Z:2\$^"t35ئD`gON3K%%uk1YVBm|a:Hs,xQx}숉[`MXE/~P`^=Qb Q=6wZJOqsn.!7FᥣhSQ%9rL8xo,f,[\&la{g}܀fm F5w -2x +'ch&J%: BX!^gl\=ĸ/1HeD̽+Bq^Jt>v}] K3v~^հu>;"qU oxZ357bEҙy*c]i=0mNܒ뮊NC ~YoBYZ-p"&9#-ܶ0zr>v 0cRڐ%CXlTj)ke%fVE.+ek:Ͼ) +=>_~zr +uTMx>*hgs%fdϠAi.I*ɾGiq) Rn{rTE2}v6|gq_%Ch/~v9y (41 <0ebN-bb#XeDNzqb r㦛ޜ0)IQ$37f(1ab6;{޳+*L`;f1l64<ÜM89+*u;}Ƶ}s-  SDQb dFWSSu֙j.[;xȌ&vcѼ;`S#0 8V +`t%wU +@yْ1kUoS: d"ᤡ#zj(.5`+-߆a/<13:cVrĀf&G Vf -gC{˜) 06V=.2{q=05pVmĠ|XFr +BGR]V]2VҖw+FOvsMjG+Zw~T7`HVY1h564 7qͻ[Y~l'kS0P}ޥj|TܻO@,[/ԊS<>*7dF=3_CC혁]y?C&ƋTl>?94O7̉t 5$d^CHF0Ĕ[1Իu7jiؘwC_/YעXAFm +ռWGG>C RW%q߯gVgMwcmdm~flE-f yGX Ckxby1ջш{i~\i2YT<&?rFG,@3MJX!;3q\< M+e ^j{)D:sao 1vj{|3viP0#]f~5|{3ٴ'n_w{6lńCB}&~Xn> +stream +x= XT{s (aD,q@oCS3S4ShOH@M Am׬̌ 13+"lA{?{k^k}9 j" >~tԉ-+{exݗpF~ůѽRǡP8gvyAQs-83fńhEzÈGm3+ހ{^PV* ;}'|xC^fEm߳/BkjKߙbZ>mv`0~Lo( 5~ gzd%~\LPGh +R٘ƎzO6\J2G;˛w㔬CVb)zI%ezXlB-tf |M +ARHKrȸؐah r# +3"WXx4 +ycW!*LV@NJh`ˠHrM 8sE L̓ˠe.PV{j&TtDQ +&}0עH+~yi,B`+֠(iBu0/rQyϮj&GO}M9 +xp3] GѾоG6b5_|*GQo;pءs!-Z84hT&Ccʧ&>(lS-?kY;XAQm`xH l`A6' %q x4l}'/:^w|P TV֫m`58kiS "NWt5G*m2$iN&"jNW>jE,e*uLssNMˏa&Wk䵃7x<;Mהռӳ~>a^bzzbRzz녬/+*̺vo⁋$esL5VM"}/ٌ9YddH~V3^mi~lڔ)l}u$vSU4nq:L=DwP祠P6e +ׅ5[U޽Gg}F{4G&rSPC.Vي0j -nKl{o(*e8D*2;'` $RK +5{Ib.R0OXy`C{p nU}Pgڽ>.ȞBT3aY8tf86[]Ѻov/~}螎bmIʌEeeӉu9uj0XujA:&xⲋL7sV/!ٺ)v}h$Z|-FИMIc/Z 5֮8H/ӜMr(_RBn޺ CaqbҢڍ .\쩜odU_!倞ڳKggg*̆ +FrjuxqKxW`` ~BaV&IV%S\:7-pmد7=Gq!8=^>f <>ͦs֙qyv,)ǚXJJb9_PbXlZ=` OS3:gcM/c +tOM,6Xy +فE)no^|e:j=K) +TZ[N/t&o.Ū ѵ#z6̏i~xYx'hgEܶg58/A9yDPcm >d$bXX2H,P$j!tq u+`E v:B6s'Ƭ'"oÓq<& fTEu})-y.G#4u2tT6[q.d +%cF0t4Z&saMM@1[M8zޟL3֤h!S3j~"l3c-F?a:S{_ +/ds +>v.G9LhanΤѓW|kPa+L9q3} bM؉Oh8?5 +EdcfxD)y hsBVVCa@ }CS!?ni,qĄ?&H\Csg~&ig9Vܜ ".1}i9HC#bOҵk9/[:Rfڅ .#}x55cwzMxfiiOR\>^z玱ii[=-FO7o8? g?AߣK꥕g"Yo=,b;^#N43՜qHa쏽kk0j;?ع׮*̏/­F#:( JX-3潎xƭnW% Rdň{+6 v9)ެ5?Yg>| +f]{ Y1XjԤ0c [г״X\wDш%Di)扬uƪ'8XmSp(M(L8b|Ν||zMrjYs͒`O,ēlQf|nmUC,KWdE;kMgՠSk6l7$@T#svɐ/ܽMw С/v< KN0F*#8C^usƽ5.]VSєL]+AvM4J4s!zlN'Ssx+׫`|0 +%〮utsMU MU n'nw1{gN.%˲|%|2 +_O|j [V9'y0'YѸd İ53uj ql*?k|jI "7mZ~Sz+pkZ9wUU} 0D{rC+M}-;αx&)aef:[dUc,0=kd%YTS\dƼztMמ/])LiDXK OXl5R?1K2+o^EA11z 6-A/3!_t'I'4{So~pYt}Y)ɾqNM=s5L6Ν9w#&B'%ӛWl7'=6L=%f&0VMX=|R^~9eGnOLp;L MF)k6tb̊qC4̘=EV?)3N#r'WLtx}`R@ۃ)ogΏyg^`*+g +#s+oMw+ +SU>-rxLJΆ.<|6䱔7v|-??WLM&qo[V}B!44_x:MY,ܤ3[szCJݤ~Wɤ2̩3)Geb7?3]xBS˗i/i.|x9?3ry/1"hHPb)%Rc(.|KCJ=$RH/FVnm̭CY)|I|KC,$GIfdkK`#).ݍ}jO7;{Z &rLݰK#]3~6|ħ ~X6x\$G>( *>ko=v9kAv0lbդXBOeSZL[tnÂu]m8e)̈́bWO P/U(Ǖm-~/N_u\KTp-# ?`ᢼ1^tj *hQ|*{Ӗ0f.ʩ-{xV#/sbh@$jMFSHz6Lʤ9e8m$S-O=\$Z`$/}ס3kP|$݂K,+jajQDLvӇ1UF_O,hѦ*W ѳln^* +/M/* gMBNOCLwĦ;'ㅺ/+8/*VO&}Nh劚!kn*Yeתtw>yj̲zyo4=]a%ہE1 ڢ^UfzFv>.k+N +.0_n4utϑ~鸐6G+8Ccx +l_=iO +Z_vly2Pzaoghm l|(ާr>A-V-DCPbh&B\J "y @i 6sQh: +Dh6r,7-tN>3Z6(e:2_Xn;t#w*stgB;7GB0(g%QPiuȻI^Z@_S2{{kߪ.륓]ơGh2;|!]'2|~1Ǿ+9{Y 0 +6r0ڍFK^+*SM/Ev@wX)q r,['=[>1O j kN`^ JЁqPf@`$ʽތfV{hޞ]߆vih)^nh׿]?.IANbh7vPm(f?V6)7󔾯<'.A{$X;[>hb7An6Y!B +endstream +endobj +2203 0 obj +<< +/Length1 6952 +/Filter /FlateDecode +/Length 4585 +>> +stream +xYyXSGsNV԰ŭHT+!PZju_֪ Pd "nXD X;TĢK](ZEjL;'y{39n{gN(qh߈d +B=.@넱> !>g yP_3?:Y![2;,!(~,t;B@Y+j {C5=1:fCs9a3q1ЯHԌ>r8?ʳP.>:zX!u| h8/PFdCz +RIPɝIyه;f΂ vLE +- DC;>@Ч037z(4M^td25/?0zL}^IH2>wp—M4 +Rlr\%\?HH\*w{={sL~_+vwMa.|'4I:I$TINA&*͐^z#eVEVʿycxX&?ߔABV#g'v8vy!VbZ<.j8FiMhZ,ӟBG>^ޞv'U8q+ xݝQyÔJ +w˕XNf%I܁!\8QOؕ('j񴱕zAM"ٱz]Z}#ۼ` ):+&i =bW,` l\2(2A!t47 #aD;F([륂^O{;+H$qFegROCq*<0i髣ϗ^F@3d{ +4]ߑt`oJ96BW'iMF.Z_ٸ(fiӚWuoUOuqƦKV ڟR\'/{Uhu8H3ufk+eJH + gcRjCzh@G nT~lnWpQơO0U?Ron{1 Qkl1^$ +'"gN+x/5mk]=w=!Ǖw྇n7q4%za~ N!5g}L^dZ/.٥W&z}b-x3={lqz~ת0Ҋ=0|W `{3w)-2An5x2c PZ_5Ns H!nVx8!t :Wa*QNP7>. +cOLnc5έKˋ&볠-X99ޠfTa]0^U?롆wP0HfAf'>>uQ-;} U7iys\Ej eKDED +/t'=;;-%YbMd3SF`KƴL?*o: ŭ +$(ۅ]bf|'fygGF.#FdtJLr9&xӿ5xgp콮 +k]HA{qD1 LǶBBkg,568`NJNc}v):e@BԑkDBR@\lTz:9_%[T t+f,Ng\k\kM3rv0O].PR9 YgX\^ʺ3/fgae ^ZDΡEw'Yx.ڲ/wSSN^ #,뮡zڙ!B`TpFɘ:a2;GoߌSgߥ/sroz{`P]euf\>"iHU\glXm޼e~)yE-SR6t-7tM\815Zk6q|ʕE{eK|-R{ Fp|S$9IVr/a%4ucYYsrh,B-\f'ÇR"?aܣXJfZ]sZ^*^5aE1R +(QOb%E<فR^21h́Dnj"nۖwJBbc ƽm.ݟN4@ !c[LL`7 qK*F Q.^ߎ >vmɤO?{Á9Ceu PP^9F)`eXB.5便E#w"Z m2,)Z3'Y~ejML1-m~isn\LBJ<8p \zgXg"lnI(.߽ERCO0"UY+=%y-bn"I[6}?CDwX 3:))Jٲ 7~}ey*WW~PulgZeԈ"#X[p0`cN7oʦZ$(ҙd%ΦoW T̻X.;u,  Y@1֬Zxo`4rбXѝ\pj/{nK:=}cRܿñ/j?m=pHW0M_Xȭ7#$7۱~Φ~E"녫_Wi+_h|yofՉ{o(I. E.p !zQ0?<6뗬&ҳrRAK| M7vJKO1@N`{Ο <`7t808&=-oH]LS'Xz2ץp{a.lsŏ(= J4p6mQZc.t|ƽ7 dmMJ=ؚ5 +ᆴVrS +&[%v"7o\yi YѬ$g|d7Q[HGsaaZ8{}SnC&48u'[';ϔ|$J]c %D=d2ch'E#P5XmN +aNh"+cM xc̵kەBKY;p"QB!h6 +F1OF@{ +(4DPzZ;h@Y0ry9b?D [V 4%7>roG?Sy`Ќd~] a8eooX!#v;YCc +endstream +endobj +2204 0 obj +<< +/Length1 6176 +/Filter /FlateDecode +/Length 3970 +>> +stream +x8iTW5h Y4(O4jQq(..K44Q(hW|j  n+Pv|ΙsyUoV&0ѧWB/8;b}cޙ@8h\xp%pdM ps('4ЃB 4'N`3O‰׾#<^c⪌n+p dE 95¯¹Sqps158|v nI8c ?/Gz lyzWũ8t +a >AS Xn(37-ǂH - TB^8@oLP |M +q|^H=0Uk-X/Ά|lc}̈́m`G0#П\<3 ]>~>BľaX^Mq *O(v1t q{ܴ}qrK@= b($ US FxY|lar+\pulͭ\AQZ;/P +`_=a0֭^QU7O-M_z IC +^5 +H'eX`gy5!R D,WRS4P +\PW TPjß=t /A/0DQ +UEлdtfV`(cvⲬU)/M"d+M[9qewtr9I`Ba m6wji1F-$ɡ4TGJL 5t9묵b;<6rE ֕=} nv$jɏhm)IGj~,),jh%Ƣ'UL؟0pʝg,Dͥ-txVn*=!ZΦ'uQ[f\@N41] Z3O;4*^W{O}q[srF="ĸwdKo_V洔!-AkDtvGՂl2OYxm g˯:ZL߸CGXn˖4EedcgX2?K㷗xL'\TjH)4z嗐U ȰTⓖi oªr_9 Ix9A~ B퉲zno sZ=Q}>99 P4D:gp(qD!z\+!1I-+kQ:*,?D?EzjR] +VUhn۸t)teVs1}=Х-5&7h0rG}s ¾ܹ4~`|LjoY$~2d{? &!֞pGk]U?wM\b3/;[#o&%ki $Wsj<`c頿8-izU JrW“۶}Ө7n"vd8Jkxao<3hH㧄egsNՔE8=93sЌ3#Z`p@bdLڤW-dxĪ5c@n?b JOͽ= ,$4bT"d qO xrڝMfx,$uե PGM0'i1)i%+g]n=]Lfa m+_l(Xk0a`+XƑOhRqTwǛHPs1>匑ێ^CW%!*䄉In"ǥ8-虓d_ZZF,Ȃ;O!?l,8QᛖE[؜CyuT#έiܤ5mrQuvӲK^/蟰Gbe+^OЖw tu`uEƎLۇbtEJ +CZeh̠E{u>6,~O x:Zk0 D}BV WhrsOzϚ]Z*`uirpϞM2\34fb~ u^)r!+aXR8eαRZ,~#ԗI."<`Z)#MYKYz{}M;1b ǷďNYXi{b V|jйL06*w;xG9 p#0ċݽrHxE]ݏ$T"ߔ/l +SL6Y^*v +X%υk +b&ZzHv&XH 7`T>~eΪa:P(D >S>A?)¼B_B-UQ +aĀB{:`F|Q? +=ę0|~v*Zx9ONx.w SEx av:"o(ʀ"O*}'|_;B+o \b%xc{|O3tgoUX +Q('!L +endstream +endobj +2205 0 obj +<< +/Length1 8452 +/Filter /FlateDecode +/Length 6005 +>> +stream +xY @TU>k3 +%OPIF@TI !Q@P$E" .""" p2|4>ȐLȟ2QKC|0kAas9kkL}|O>sӗ+o.rqkq$8#q|KG&'qFxpvGm<>5pm5 W8e1yt&=&6a a0ȔU 듸$MƶݪȄe/vlmRb,ٕ arkp]D-6u/3Jw k'/M/ 6Nq]\ @X&!@1sLD@jE("8c5p2tB pxO °]HJnl "B?+?GFL Br˨G2gU =o7E?&{T/B/oɄխðCCJSݠk IHz,uzP!dl#Ό8q}8D͍0VT +kHrK9M&y9pEŊ⧴3bEb)i/ĂŽ5hd)QQ)Gڋi"]6wwINRpmpsGGIn +lXCíFȪ~MIN 1 QʦKgf~CiMʷ!)'2i{Xݯ%7-w93oxʹqhq'S3l6l^@`ČW~Mh}H-8(%V6rG6ƒOΩYRSj zW:Ps'\zaO'}Op k+b$wpD LUwt[U/oQk@"1r@D'ApeI'ÞCjֿ Y D#a2 xq-,YeKag4gHgZro0ջ0h30DjTО&\lQzINzb Ȃ\|b  +]/1r`Z?XC¾NAƟgiqJu0D|nt +c$,sIt&Rd*~B0C-nr⒲$eͳkqt섀3';fqojKO\jiggZBE ed\I, Rː9=laa-eC}79\K;,=_6ozȲv`nz+qӧx(Wc\?_,>d :q}* ]iG={資X1OH=[f7ZE.XVi,8=thDt~מ"A=tdKvij +Z*K⬬eWHF)ig |M,0;Q< ;E{KÓ(ژ<~,q[>f">D0Ǔ<8x\Q:I[BYܧ` 1L_ q`(v0t[rJssKr[i4X~u3[K +4#8IKO1|yvP"EFSi;-V򏞟C\ƈؒU[XوX,U O> ݧQu6r*B꾷y-9Ej`cV>nl  66Yz99t>c1v"*aoǚ%_-U_9 /t%NY+1ۣm?uw^Zһv#]b T  '"$Mi=bD祯vpȍ5Y@::7K Z^6̴gj +9SKcȩӦMjb=7c)Sף|tRaq`Q$i~_J⌶ܦf%zҒfZwijRϛ(:4yS<tA0<\C5!MiD&t@16F-9\xFȇHAE2r.lcAӃL#/QU&aی{ug60X` `UM_v, oζ,b(e S xBߗZ=P*0sj!Oa9TC5p +4̾0qdьZZ.X]q[ +j(\brחVY|"TcCrrnȭ7EQo+wW ռ<؄q` +1L +)2ǏuËDQ'VʯXrLKzSmJ?"A FCĽ@ 9ѫY  +B~6$IěaX=! +n -~ B!hV}[Zӥw3wq&g`ZiҠh}Ȭ,:~C"Z4'Kv|^NߝlcU}݆z4k%o77'pjE_1wN Ԯ#Y' YU6ǰ8BD5[ "~+Z{_fHm۶lVvwo/}m߷oPs0l0eie~0GX 8N`~ۭƘR 6EKW6Ɩ%PobP=.z rzx%//]}׉ęICn^<0 )K>e!}%4ѳouQ=uülw U.~ HS>\[͊Eia} +~oxG7T G&LXWKUr[̉E}-c%{uvsfjNb4hV"Kj+ދ*j"0G L2kuCuK`>X ̘)ԾH &A(q7.fw 3tȋ} =*TOQs;#j>h˰?~&y 4j۰<4k NBd.A`;E컯a:<ވ9$aA:7 6 }<% ,) !ʤM'ٚSXl5?PAk;c0f컟uy@kf~|r n+o뜨q/rlfc0[)!_u<O~ +endstream +endobj +2206 0 obj +<< /Length1 3520 /Filter /FlateDecode /Length 2183 >> stream -x PT-~Ydb lD%D[ES ?1ʲ, bhډ5kt(LcR5JUGJ28 IL2~n}ktzϜ{߽|9{(X ku裁|oFt5(#؁pKv14XVʥh9}i/O8h Z&^j@5ntg;Zko@)E&,9|_|IsWVe8 MB|Ml/+~aJz"f:EJ};Cn@OɀbފWXj#L7o5C Kg&( -oL@s-_ rV#BzEh6bhd#vpB%QCXHHlG(?`OE(\K8sGp}'f ~§~H~O&::an.9Ƣ1kê2vx䡑pXkΤ)\+wn -g_`-K$yZh] 3)%Ŕ,bb-9ҷislkаuU]?iñX[sŎ':weϞC{L`db ɪj_?o 8~\`wy-8q#լm`DQB2IQo8E?ʵfV, tVRLւhhjM)֬lŚEk#LlAD+uqdXƴuY7»G`yzN‹rs}j79|rwY^K&ҬYkRYU#6|;;Yyf+^X7b -A8zvw_YݨZUE/E$IzȌ@)l!WgQYwnZW)v5@5O{z+#z{w -i$"*dToъiXYXI u §:b(,hW绱O:}hEф6>&HU% })VK+YqJ%c;mgx{s6I<"@R!@ZQr?ͤz6ROuRUDf(XCo4XR~›D셌;勝>Ϊ=C QM&@ ]K;%~(JyPO"_g sWbME>g'trT8Щ"jU, 't&Jeٰ~_ pb.z \PlG]\1DQAGSL##)GҘ5&Q`X]>0,G'k+YY]~ɞ_ڵ}kzH^ӊ=)$AmΑN2ƞe._-+SN 돌î/.t`%nɝ^>Gv#8ֹ.~Rc&sf.J0b-Fas?jѣõJK8gปdWfX{Σtd0 CQgtXϪH[Xx6keZI1Y b$ZE5&%[fKY 3Zz-ԉ#vc-j݌q0Le v T06(4VϥR6Kj,Y6Q{Qbz, +=}}z-El=9޾|7Gzzt. zKh7>b'_wso.y׬u|z3 1ZLD^W?cZX?켗tgz5%ߓF~5fЅNr/1`da}cyK9lol+]ٷ sb +?šbWA#Tay3fz4ӧO76exJ"X{Ιi7Y +F/e"/iQ~k .o FaW zE9kj'^n~! 0W9Qa4p6AͷSR,sP ǩ ʡY8$B#Q؉FRJ=}szROhI"6eN9E'ӈhj^?@Qyiԥhˤ) __0xWܵ(Jv[O̻Q-l#y9)3K:iEy49HW>HV%Ջ_ endstream endobj -2126 0 obj +2207 0 obj << -/Length 1304 +/Length 1318 >> stream /CIDInit /ProcSet findresource begin @@ -30016,7 +31180,7 @@ begincmap 1 begincodespacerange <0000> endcodespacerange -70 beginbfchar +71 beginbfchar <0028> <0044> <0053> <006f> <0047> <0063> @@ -30067,6 +31231,9 @@ endcodespacerange <002f> <004b> <00cb> <00c8> <0050> <006c> +<0014> <0030> +<005b> <0077> +<004b> <0067> <004c> <0068> <0054> <0070> <005d> <0079> @@ -30077,7 +31244,6 @@ endcodespacerange <0055> <0071> <002c> <0048> <00e6> <00e9> -<004b> <0067> <005a> <0076> <00f0> <00f4> <00e5> <00e8> @@ -30085,7 +31251,6 @@ endcodespacerange <003b> <0057> <0026> <0042> <00cd> <00ca> -<005b> <0077> <004e> <006a> endbfchar endcmap @@ -30094,7 +31259,7 @@ end end endstream endobj -2127 0 obj +2208 0 obj << /Type /FontDescriptor /FontName /HOYATR+Roboto-Bold @@ -30107,10 +31272,10 @@ endobj /CapHeight 737 /StemV 80 /StemH 80 -/FontFile2 2120 0 R +/FontFile2 2201 0 R >> endobj -2128 0 obj +2209 0 obj << /Type /Font /Subtype /CIDFontType2 @@ -30121,21 +31286,21 @@ endobj /Supplement 0 >> /CIDToGIDMap /Identity -/W [ 4 [ 249 ] 11 [ 162 351 352 ] 16 [ 244 ] 19 [ 373 ] 21 [ 574 574 574 574 574 574 ] 35 [ 497 ] 37 [ 673 638 654 650 562 548 681 707 291 ] 47 [ 635 541 876 706 690 645 690 638 615 619 658 654 874 635 618 606 ] 69 [ 536 563 521 563 541 358 571 560 265 260 534 265 866 560 565 563 565 365 514 338 560 505 735 509 502 ] 203 [ 562 562 562 ] 214 [ 690 ] 229 [ 540 540 ] 240 [ 565 ] ] -/FontDescriptor 2127 0 R +/W [ 4 [ 249 ] 11 [ 162 351 352 ] 16 [ 244 ] 19 [ 373 574 574 574 574 574 574 574 ] 35 [ 497 ] 37 [ 673 638 654 650 562 548 681 707 291 ] 47 [ 635 541 876 706 690 645 690 638 615 619 658 654 874 635 618 606 ] 69 [ 536 563 521 563 541 358 571 560 265 260 534 265 866 560 565 563 565 365 514 338 560 505 735 509 502 ] 203 [ 562 562 562 ] 214 [ 690 ] 229 [ 540 540 ] 240 [ 565 ] ] +/FontDescriptor 2208 0 R >> endobj -2129 0 obj +2210 0 obj << /Type /Font /Subtype /Type0 /BaseFont /HOYATR+Roboto-Bold -/ToUnicode 2126 0 R +/ToUnicode 2207 0 R /Encoding /Identity-H -/DescendantFonts [ 2128 0 R ] +/DescendantFonts [ 2209 0 R ] >> endobj -2130 0 obj +2211 0 obj << /Length 1891 >> @@ -30199,8 +31364,8 @@ endcodespacerange <0017> <0034> <0cf2> <00660066> <0054> <0071> +<001c> <0039> <0059> <0076> -<001a> <0037> <00a4> <00e2> <0012> <002f> <00b6> <00f4> @@ -30208,18 +31373,18 @@ endcodespacerange <000c> <0029> <005c> <0079> <0049> <0066> -<001c> <0039> <0032> <004f> <000f> <002c> <00aa> <00e8> <0010> <002d> <0cf3> <00660069> +<001a> <0037> <0036> <0053> +<005a> <0077> <0022> <003f> <002f> <004c> <003d> <005a> <003a> <0057> -<005a> <0077> <0025> <0042> <0034> <0051> <00ac> <00ea> @@ -30244,7 +31409,7 @@ endcodespacerange <000e> <002b> <00a9> <00e7> <000d> <002a> -<0082> <00c0> +<0008> <0025> <00bb> <00f9> <00bd> <00fb> <003b> <0058> @@ -30255,12 +31420,12 @@ endcodespacerange <0020> <003d> <0060> <007d> <002e> <004b> -<0008> <0025> +<0042> <005f> <008b> <00c9> <0115> <0153> <0534> <1d49> <0855> <2192> -<0042> <005f> +<0082> <00c0> <0021> <003e> <009d> <00db> <0041> <005e> @@ -30272,7 +31437,7 @@ end end endstream endobj -2131 0 obj +2212 0 obj << /Type /FontDescriptor /FontName /UKLFXJ+DejaVu-Serif-Oblique @@ -30285,10 +31450,10 @@ endobj /CapHeight 927 /StemV 80 /StemH 80 -/FontFile2 2121 0 R +/FontFile2 2202 0 R >> endobj -2132 0 obj +2213 0 obj << /Type /Font /Subtype /CIDFontType2 @@ -30300,20 +31465,20 @@ endobj >> /CIDToGIDMap /Identity /W [ 3 [ 318 402 460 838 ] 8 [ 950 ] 10 [ 275 390 390 500 838 318 338 318 337 636 636 636 636 636 636 636 636 636 636 337 337 ] 32 [ 838 838 536 ] 36 [ 722 735 765 802 730 694 799 872 395 401 747 664 1024 875 820 673 820 753 685 667 843 722 1028 712 660 695 390 ] 64 [ 390 838 500 ] 68 [ 596 640 560 640 592 370 640 644 320 310 606 320 948 644 602 640 640 478 513 402 644 565 856 564 565 527 636 ] 96 [ 636 ] 107 [ 1000 ] 130 [ 722 ] 139 [ 730 730 ] 150 [ 820 ] 157 [ 843 ] 162 [ 596 ] 164 [ 596 ] 169 [ 560 592 592 592 ] 176 [ 320 ] 182 [ 602 ] 187 [ 644 ] 189 [ 644 ] 277 [ 989 ] 1332 [ 387 ] 1928 [ 318 ] 1937 [ 590 ] 2133 [ 838 ] 3314 [ 710 667 667 ] ] -/FontDescriptor 2131 0 R +/FontDescriptor 2212 0 R >> endobj -2133 0 obj +2214 0 obj << /Type /Font /Subtype /Type0 /BaseFont /UKLFXJ+DejaVu-Serif-Oblique -/ToUnicode 2130 0 R +/ToUnicode 2211 0 R /Encoding /Identity-H -/DescendantFonts [ 2132 0 R ] +/DescendantFonts [ 2213 0 R ] >> endobj -2134 0 obj +2215 0 obj << /Length 1206 >> @@ -30402,7 +31567,7 @@ end end endstream endobj -2135 0 obj +2216 0 obj << /Type /FontDescriptor /FontName /PYKAXF+Roboto-Light @@ -30415,10 +31580,10 @@ endobj /CapHeight 710 /StemV 80 /StemH 80 -/FontFile2 2122 0 R +/FontFile2 2203 0 R >> endobj -2136 0 obj +2217 0 obj << /Type /Font /Subtype /CIDFontType2 @@ -30430,22 +31595,22 @@ endobj >> /CIDToGIDMap /Identity /W [ 4 [ 243 ] 6 [ 287 ] 11 [ 170 ] 18 [ 239 397 554 554 554 554 554 554 554 554 554 554 ] 35 [ 454 ] 37 [ 625 ] 39 [ 649 655 569 562 684 ] 45 [ 266 550 ] 48 [ 527 865 710 677 616 ] 54 [ 635 592 597 657 617 896 ] 62 [ 598 ] 69 [ 536 554 515 556 517 331 555 549 224 228 490 224 886 549 560 554 558 336 506 321 549 481 754 486 475 ] 229 [ 517 517 ] ] -/FontDescriptor 2135 0 R +/FontDescriptor 2216 0 R >> endobj -2137 0 obj +2218 0 obj << /Type /Font /Subtype /Type0 /BaseFont /PYKAXF+Roboto-Light -/ToUnicode 2134 0 R +/ToUnicode 2215 0 R /Encoding /Identity-H -/DescendantFonts [ 2136 0 R ] +/DescendantFonts [ 2217 0 R ] >> endobj -2138 0 obj +2219 0 obj << -/Length 996 +/Length 1038 >> stream /CIDInit /ProcSet findresource begin @@ -30461,7 +31626,7 @@ begincmap 1 begincodespacerange <0000> endcodespacerange -48 beginbfchar +51 beginbfchar <0015> <0031> <0012> <002e> <0004> <0020> @@ -30506,9 +31671,12 @@ endcodespacerange <004f> <006b> <001c> <0038> <0030> <004c> +<001d> <0039> +<0026> <0042> +<005b> <0077> +<002c> <0048> <005a> <0076> <005c> <0078> -<0026> <0042> <0023> <003f> endbfchar endcmap @@ -30517,7 +31685,7 @@ end end endstream endobj -2139 0 obj +2220 0 obj << /Type /FontDescriptor /FontName /YAMLPF+Roboto @@ -30530,10 +31698,10 @@ endobj /CapHeight 720 /StemV 80 /StemH 80 -/FontFile2 2123 0 R +/FontFile2 2204 0 R >> endobj -2140 0 obj +2221 0 obj << /Type /Font /Subtype /CIDFontType2 @@ -30544,21 +31712,21 @@ endobj /Supplement 0 >> /CIDToGIDMap /Identity -/W [ 4 [ 248 ] 11 [ 174 ] 18 [ 263 ] 21 [ 561 561 561 561 561 561 561 561 ] 35 [ 472 ] 37 [ 652 623 651 656 ] 42 [ 553 ] 48 [ 538 ] 51 [ 687 631 ] 54 [ 616 593 597 ] 69 [ 544 561 523 564 530 347 561 551 243 239 507 243 876 552 570 561 568 338 516 327 551 484 ] 92 [ 496 ] 224 [ 544 ] 230 [ 530 ] ] -/FontDescriptor 2139 0 R +/W [ 4 [ 248 ] 11 [ 174 ] 18 [ 263 ] 21 [ 561 561 561 561 561 561 561 561 561 ] 35 [ 472 ] 37 [ 652 623 651 656 ] 42 [ 553 ] 44 [ 713 ] 48 [ 538 ] 51 [ 687 631 ] 54 [ 616 593 597 ] 69 [ 544 561 523 564 530 347 561 551 243 239 507 243 876 552 570 561 568 338 516 327 551 484 751 496 ] 224 [ 544 ] 230 [ 530 ] ] +/FontDescriptor 2220 0 R >> endobj -2141 0 obj +2222 0 obj << /Type /Font /Subtype /Type0 /BaseFont /YAMLPF+Roboto -/ToUnicode 2138 0 R +/ToUnicode 2219 0 R /Encoding /Identity-H -/DescendantFonts [ 2140 0 R ] +/DescendantFonts [ 2221 0 R ] >> endobj -2142 0 obj +2223 0 obj << /Length 1626 >> @@ -30677,7 +31845,7 @@ end end endstream endobj -2143 0 obj +2224 0 obj << /Type /FontDescriptor /FontName /GJMVRG+DejaVu-Sans-Mono @@ -30690,10 +31858,10 @@ endobj /CapHeight 729 /StemV 80 /StemH 80 -/FontFile2 2124 0 R +/FontFile2 2205 0 R >> endobj -2144 0 obj +2225 0 obj << /Type /Font /Subtype /CIDFontType2 @@ -30705,20 +31873,20 @@ endobj >> /CIDToGIDMap /Identity /W [ 3 [ 602 602 602 602 602 ] 9 [ 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 ] 68 [ 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 602 ] 107 [ 602 ] ] -/FontDescriptor 2143 0 R +/FontDescriptor 2224 0 R >> endobj -2145 0 obj +2226 0 obj << /Type /Font /Subtype /Type0 /BaseFont /GJMVRG+DejaVu-Sans-Mono -/ToUnicode 2142 0 R +/ToUnicode 2223 0 R /Encoding /Identity-H -/DescendantFonts [ 2144 0 R ] +/DescendantFonts [ 2225 0 R ] >> endobj -2146 0 obj +2227 0 obj << /Length 590 >> @@ -30763,7 +31931,7 @@ end end endstream endobj -2147 0 obj +2228 0 obj << /Type /FontDescriptor /FontName /WQJRKZ+DejaVu-Serif-Bold @@ -30776,10 +31944,10 @@ endobj /CapHeight 742 /StemV 80 /StemH 80 -/FontFile2 2125 0 R +/FontFile2 2206 0 R >> endobj -2148 0 obj +2229 0 obj << /Type /Font /Subtype /CIDFontType2 @@ -30791,30 +31959,30 @@ endobj >> /CIDToGIDMap /Identity /W [ 3 [ 348 ] 13 [ 523 ] 38 [ 796 867 ] 55 [ 744 ] 68 [ 648 ] 70 [ 609 699 636 ] 74 [ 699 ] 76 [ 380 ] 79 [ 380 ] 81 [ 727 667 699 ] 85 [ 527 563 462 ] 92 [ 581 ] ] -/FontDescriptor 2147 0 R +/FontDescriptor 2228 0 R >> endobj -2149 0 obj +2230 0 obj << /Type /Font /Subtype /Type0 /BaseFont /WQJRKZ+DejaVu-Serif-Bold -/ToUnicode 2146 0 R +/ToUnicode 2227 0 R /Encoding /Identity-H -/DescendantFonts [ 2148 0 R ] +/DescendantFonts [ 2229 0 R ] >> endobj -2150 0 obj +2231 0 obj << -/HOYATR 2129 0 R -/UKLFXJ 2133 0 R -/PYKAXF 2137 0 R -/YAMLPF 2141 0 R -/GJMVRG 2145 0 R -/WQJRKZ 2149 0 R +/HOYATR 2210 0 R +/UKLFXJ 2214 0 R +/PYKAXF 2218 0 R +/YAMLPF 2222 0 R +/GJMVRG 2226 0 R +/WQJRKZ 2230 0 R >> endobj -2151 0 obj +2232 0 obj << /Type /XObject /Subtype /Image @@ -30829,7 +31997,7 @@ endobj /Columns 4969 /Colors 3 >> -/SMask 2152 0 R +/SMask 2233 0 R /Length 3704458 >> stream @@ -44126,7 +45294,7 @@ p5^vSٲ 7Y[lX} 3"% 3"=,LXKxR68av)j>-+ܼfloago{7xl,xp0ub.yVIMYpEˆW0)]0)يuY'eӋ+6mWfbǏ[ko]?}tC7`ah\*=,*sczɉKصE8f/=^0~=B \|fp&|]uɉ?CBgg? V/;9Q'c[ge''d b /,XD_l331_-X|fpF`2 ^vrO/bςNN_,>38Yzɉ?CBgg? v??ϟp?LzO.N??yP-}YRƧ).S~E:cn}E7}Q sf/;ȸZxCs鎳}cn Ң_|W+jэl_veoy?_]?Ӻm]?q8.)~q|‹i߸UNF[9s1uGooc6 u|,yqc];fg^xQ"WHa3]#g2朹 wӆᯎۘ%/xLkl /6S~3W9);l=~cbAƜ31au0uwMyEf4o\y*'#etuZ9Șs:#̷7ܱN:nc13/(L+\dQ3s\x;iWm̒W<&ߵc6}e)Xq噫?1j1r cΙ0p:mYv̦ϼl3E7‹i߸UNF[9s1uGooc6 u|,yqc];fg^xQ"WHa3]#g2朹 wӆᯎۘ%/xLkl /6S~3W9);l=~cbAƜ31au0uwMyEf4o\y*'#etuZ9Șs:#̷7ܱN:nc13/(L+\dQ3s\x;iWm̒W<&ߵc6}e)Xq噫?1j1r cΙ0p:mYv̦ϼl3E7‹i߸UNF[9s1uGooc6 u|,yqc];fg^xQ"WHa3]#g2朹 wӆᯎۘ%/xLkl /6S~3WYG_5( endstream endobj -2152 0 obj +2233 0 obj << /Filter /FlateDecode /Type /XObject @@ -44383,7 +45551,7 @@ mp5 QO\K]޾U/////Oo%_n;>Wz)p^k<^CyNOʾ>y~2}8gxw';////D&/1Ƕ* endstream endobj -2153 0 obj +2234 0 obj << /Type /XObject /Subtype /Image @@ -44398,7 +45566,7 @@ endobj /Columns 1920 /Colors 3 >> -/SMask 2154 0 R +/SMask 2235 0 R /Length 782043 >> stream @@ -47132,7 +48300,7 @@ wض Z\y|>x(,&cPYYPs];"WB!B!rS뺦ibU#EwWff"&էz媔eIc%%{iQ`~'uY}Ov+^Vm[$Y8ѨGs² ,I8"@8Ji6p. aBP'܌Ȝݖe !FH$ڀY$qu0(B!B!q!c I˥1E4۶XmD"QgĄ_rQVVjd@@"7o=޽{ܹeEd!lӴl[`RY2 zr,˪Ku"A 0I";nӴ9VX8,6B!B!$۶ {9dL[-: P#P0M+ʘ$q@qs-(L!B!B!u`^`ZN!UXľJM$tؼ"Qc/ !B!B!`$d 1S/!B!B!cA_A!B!B!dTE>( !B!B!gkXCB!B!B!dQB!B!B>AhB!B!B! !B!B!&B!B!OȦi@!B!B!`c[̻ endstream endobj -2154 0 obj +2235 0 obj << /Filter /FlateDecode /Type /XObject @@ -47153,7 +48321,7 @@ x u^;uȀ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  o endstream endobj -2155 0 obj +2236 0 obj << /Type /XObject /Subtype /Image @@ -47168,7 +48336,7 @@ endobj /Columns 1920 /Colors 3 >> -/SMask 2156 0 R +/SMask 2237 0 R /Length 727652 >> stream @@ -49523,7 +50691,7 @@ AD Ȁ[Ů~ endstream endobj -2156 0 obj +2237 0 obj << /Filter /FlateDecode /Type /XObject @@ -49544,7 +50712,7 @@ x u^;uȀ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0. k endstream endobj -2157 0 obj +2238 0 obj << /Type /XObject /Subtype /Image @@ -49559,7 +50727,7 @@ endobj /Columns 1920 /Colors 3 >> -/SMask 2158 0 R +/SMask 2239 0 R /Length 287978 >> stream @@ -50553,7 +51721,7 @@ hH3 nHL4NR)Jee2Yw @`iiy> +/SMask 2241 0 R +/Length 95588 +>> +stream +x{|/N$!ؑ";aRJ)2KYYT]L@nYiA倏ϰ\VS)قҝ.^YM@! ;j'D?f4iF7[_Zkgyf'˘zJbD1J} WTW`V1W4\}K$r*~. dBbgZSФEK sm…-N{mҘ-;ujӋ+r%D1瓻ݎV\tx|'Wu)RfS}™O~,XI@N*MoUқr,Z=N}gH%S,M}C(mj3sS]C "{TK!%'.|'j+DDjo\ky3,ʪ@ŗ2/8ODr7ܩ ~N\ʜYP}FxssfxT;3c\s͸kDD/;Vߝ60{wOb#GΌ/ⵉ1l&o񓹄p)>嗈 Ξ//-t-osX,51Lׯ?Ik7m۶ֆ1lJsCQ=H#O:.~~v햛oyժUW^]~-֭lb``  ~_s 0v}m…)Ϝ91 zC77ި 7\㷔)pϜ A9@g >n߯}kDo9r䦛nGmS}s>GD?яod(Xl…)KKKrjoQ©Sn r͗Ϝ/9}t|ɅSgihgl@l0=LOOu!0x㷓gK-D繐siعSDt\~]v}39s̮]7x*++]v=CPv% +/ByGgQg;5ۺu:u}_~}gQ7=~;~~Ȟ|p"|X(X{?UVD2]vۧNBo9r[Ν;{}sovM>?cf/Ro~VY"|p<77bhG?$G(VTTP}hGO)7IW\qE0$˗7?"4CKfs^}KN/!_CcQ6Iˡ LO5M/~w[OU?CD] ]ST5(v]OK]]DGڿJC[NJ̔S7M[֛Toәk|O MUPclDf/̑r5yU1#H13]+e3׾@Κ&Ɛ^|C-(h o4=1p-Wi~*QAc!Wg/o^︶w[QxqKSGMy5y8KnyC^],9MG|HMӋkj#H"=mڍ56ecǻ;~r<^Р|ޒz"ZuKeGCʰk3P_"W]IaY/#;+BDdiz%\tZ^JNzĥ|4̪ɺ Eef4:Wkе=5Ux9]]o[o>PDyDx %?PoѪ[\׾ݺo5j`+=DD=צ)$#<"qxBnajUp4!w5MohG+{nh׿NwYݎiUꁎ'h"u=^Y Eo:*i$/=сU"K*BL'wXL{h``)1]Cboiu '܅PщVիkk(%#ц' P u=@_z!jPZKOq66%KD( nO5`Hr@iwx-*H]bX86t1N_f@a!KR(s^42i9}+5&b¨ k(ǂ_OwOu`im+0)[ljk1&u>( +E6[-D m]=S[=6 Yl3%$]jjM\;}@*9F͝=Dx_`d9,j&f! C1qycPy[6+>4_q){SIFIB"Na\j̡큒$I2?q&-i:}J${b},6[Ҍ5Ir a% +L0jr:z;8ԫ9\G]TW`"|A$&h ]!""2[Fgs%e8vi2&[$""JVVG(˧םz1% Jffa,0a7~;sbZnT?SG +/ht5VK$p0 uk+a /pJFpN}Q')ΰ$kvXFy.4AJ5qMMӌ5`s˕6M6BdbS$ֲYP(XC׿UT4uJEFK^N">w2y8nNAWt\reH7r\zmH$DDq=/'@ؚ;_XZ݈ mfHhRkGB6Zt2Exo[[$8]ʲr':oX _nߔ1K܉}p#+_ gŌߘ:{ #d(+wt5-6O3KO9Q0[]$݂U~ fٲwc[s 9GۯnS,VPǭ}߳e)V`o5<}PDɳnX_IMOE5I_\R3 NueI zħtiH(E^ßT-Y)^-Uo[/(BF"S0._3u%?7qА +@eƎz"u Í; ڟ_}=Rٛi[( +&Ӟ-6|`wZ/g&߷j_ Go[oKaDD6l>ѱ}SSAl&1g S[[[fRX"D+4Fx>q N +IsC!o;<$pk+QĂq.&Ǧ^%."68-QҘ~3·dIbvl츿>lU;H%DaV>=t)[ +G7zǚ<~WdڳMgH__E{L6c<wF_~lO߿V[[g`TWWOuf8OJFG6Y,(FxF7r^u>D ue}\Zb%<˘؂R*.W= ytݘZFPww7JoooMPY"Ifh0u2o `+x6O\7 8bDj@:Xo@q@PNu`1YkKDNs[nelՔy`B0ẻ +EV@OF +DpUP[]JbJF7 `2TWWOuޔ-h5H +yL5DRLNsy`0 `s:l`sY8^EQ䀎q5B]n5l+!oJf' Njl<ҏyDC96ѯFzY Hf'̈<-ijr&O@Vx8 pUbPeu1[ `;uݢ&a$/~zPoš`8iw]-9w`""iz{B +PD +9iw+[MS; Pv- gnYEDDiz{c[bӟi^^]}5moTufvnžxkwVߧﵷ?H!\/6)AVM#M5XuMh]fiW7@(jNp1Ns +٨yUͨJ5QtǸɥ)ˇ*飙l.mTvKn5㬲>~ԦmYL"~wf<v\L{{{{{蕶'0Xu3/biz[:0`B{zStBm~(s-ȉ!Z] 9}=$#˲,G;weؚoCx̼Q-1/`|~>QQgфBvvRVr[UW@$%C⚝3'*( +xțS u +5̛z;Ϯ'gf +icDreG Qwf\ ƏdP +Ƅ`ʷ:| CŸl!/&I E%n6KFϸUdF$& di5G%MEj[!WS](鰅-p)դd(gUt"NI ^ɐ~aes`\>T5VK](ٺBk(Dȼ1V'SDRK7♥p4V41ZO8"df [ 5IoKYyD#et+ qx yձW-斈3N|9""nnWF9!6;nt +@>T՜qvfz=6(K IF/G]`!"G Wʱ\Bꩮ,Uot% y'HFJ7[EQyB|Ym6K\:#3tn*v24I6]'a-a3>5es+`FBӊ[ Ffv 8}\jhYk97® iD?T-d$QYp'\Zx3&[՜;%m<fE +y<6eEbcnC\=.(z(e?9MoN L_>h>d,g"<"ihwo̱%]1,4y% Eѣnr(`3UTTf`UUUP'"חEL1 Z%Z Ed +` +|i6aCee$i7dI" 8 ~(7 8o݅* +ҭ1;2P +ng<1bӧ%/' +,z\ka W@]1UkP_2̸ZeY͞|k +0ARf--<pj7 ق-PjL天/-.H +Yu 1p1FI$Y%Y[)3Y 2, `!~[$)IAv/XqJ +Y5n}'Q5Rrr #k Ix^j&39h[ ̤s ("or> 7وq5䑃Rg0bs 9{YM 7˲\΋ϙc9N(Y8^n3eHR1&[jHh +sr? 7Y[EQyBF2wN-5>^2#&Yydh +TExN3Ԏ%e IF4#.$SSϢ-6\fg3g yY24c(%[It1GK"iŃ9jhXʹL4A23$cY7Q2/q54&W!EExN&$"'o\_pXèKp{򉢇B^V^W$rlԾ-|EQ*F '%2X-c2ukṼM c"1%uwwc[w\ދ-f V~fCB' Ed2a$@I;U(2h5)2 oo2 8 ~(@,VF<68t"eץK ^`ʎ ?\JSO1WrO|ŲE484f^Q*+7Q5yJ˗\lD644HV&uPט:п͛7:c4p***C'iUeԑ~#C*9< 362tA7oeW'<1-S 7&<;t_`f)m(-229޿P Vlr+?88ryR9wʥK+H5rRЁUՕr$78y@~ZY]^}# y sJwG.hsW 0Y0-Z*O7)Cs(ܿ4>8| -j.@٢UK-#|YEYЊrtieWz([g)y +yq汝0L;U(-yD~Ёg-%/ 'wDegG3R;0YFhr?O|T!:^{^izZJ#ufᲊV;cR.EdLJ&GEDʴk#;<\hAhDِ:ʟpxE?KΣwL1F,tБz{`-LEMKu~"픬ҥ+OҢbQDe*-ξ쑘TXZjc䡐eeVښJee救rUK.>lW|E&"*[TQ\0_FD+*W$^624:J(-Uj $^.?['.]QT.}x?Ѭo|dI|F>XȣMgO}u1gYndVc"5r2@o<6`e*]|}4òE+nf^xVTŸ"b7NŤ4}ΤJȇ|:M9ssuaKt?ijI%/}9>G89}D |ښ~ Zf`8}=ȱF)5興(b&Y7Ds c +x˲,rI'YpkjSN8+`lՅYBxoZMjRGeW-5M +b9b䬣o(?k>9L:5@Y L1g3Gu7wN̷$t ~'bP@D$t,:W@ 2'j2"%RQ-+DfkG7kɩ`&iCJK0!"({mHp?hD=D vJIM-`vBEp{:tET~wOq'ߘ-z$ G,Ԥ<3'Eyҍ04ÍIƸ}ŸlJ4UP?R"n|藈p4+c5'GfTf Ͳ,dJ͑nLF ;EG"*j<6 g\rɜ|,5O(<ۗVje o^xft lVpT[QMw[faIt &#n!G=Jb!\8qڃ\c9 +D ,"j +gI+SЦ8zK׫dl5e˺rVWg'm,gh>jB4C +7KB? w +0V3E99K|5yYK1DKV{8:-MF@5}R^tO`\M wk5ܽ5?h24DMQS2(oz g{`F*=p ySO8B63IF/sp(w9}omr8)'>EQLl qʈ +nCjW ilӗXc>)mfMMJ_"SiLs3 ~+]bLJFȬ|EUEUTU([eLt R+@$ 2{xQ@R{7G(s[ آ^v7ިkU٭]-,˲\8#.&'Maev9W"Ih>"6f no(#0c+!/˲77H9Xe9f]ᕺeQl2G4rQك ߈JZrѼ}}3JVVcÃ4<<O,[ w7,yyj +u f>b)Bmʂ'?i;j@Lp/gg3G"6ǃ)d9}nQn^Ǩ]xIF=﫱ZCKFm j61#7YiiyUeÇTV9Y\[hj*9KH ݍ,G,1V,LMDt"NI &7#5$[rZh[>}o2'XkԉIVjh2EQAΝBLC MV:w.ᲊK6R[R8J9H vB{|[olIesCa[&%X.Fe)ЎZK1wԹGJMjiIIi&VrhDrWM^L Fl$Yv>?f8G 1rD ?IeYZS8O8L +(cGI("/ 86Hʓ篕ΝGÃG4Y<W|k=eKg3g;?ŗ?a\\hQNT7_@C^oޤl׶-D~?5"zCjK-c0dO|Է"02a [ä&eIJ?#6㔨p[sȁ*_?907[WI-HRᤦ4ҵ#D%&i3A7)13&TQQID vx8UUU钺 YYv<%(\ވ-f V~fCB' EL? Po@q@Po@q;;U(d3LBㇷTS]Y}*Po@q@PiX[gSㅍ.Z @LBo;6\'}S݅b5wRyq[h3la QCbu\VS&iėٲY0 +7Tv_j|6HFVul|7?m2jm.\0{j +qu7տ'u?4L5wu]}S[kV6ц ב3-я}5ھؚr[OC*;=&ShSyR7!~i0Xo`+:znS _wkbrjhhobkxaCe ouF%bG Sn_bYg0 +d#oŃXlϷwtl*훞 +D)͂oUohoo@iiOm H9DN~=oP<>Qp1F3)ĸ)u[ʥ0Z+hPD$/uSR={i0'ßzM,d~!(,V`džʎ;_ؘn%4)*ee^$V=2?QJnTTuw6Y3X˺"rVWg_JAdo!"\R򲬠\$d#$#YARKff\\6 +ĸ) +|7>dϐź5 l-M쏏ykY@ܐ\1+wz]_49S7>T@ +Y5S[O9-.H!.(qڃ|(9QoWRX{0dڳކOloo߶}SȚ~7PڳvƎz/gLY=I;2Ԧʐܟ4M׷ox=r`F`\MP;Cu%[,/rD鈋{?z$#'"NDn\U*Y>QFLo|[ I3LrXGd2ɔnR({{<Ry&fDFQL&dҕLʾ1ў x-;K%Yyx).[9}ǦG2R^$CN_4גT}fh +s[OY@1yYeQU3lMZ$NclM-y,˲79ex謱ZRvINq5EQ񩋐hF\ޒ3i X5oF9^ykVd{xHX K[ +J F@E8I7 +oHLL?ӆo$3,L[? Gp{'iH3Rpwm鷐f: +2%Jݨ})[/KD+ۃ\_LTcdsJfMb$"Y;<<5wUUef-f]]]=Y5(JK=;0J2l†In""2a$@q@Po@q@b\Q c9-)/}NA.#539S[62`\yYV OluujO2rQ/( +>W(x E UDێ(u FOĸԢ4IV NäKAsQ JPUc lM +[Zx%jw+rȱ3`P@D$t,:W@ 2KFm nƪ|6 ڎWsa$!|8mm k753j2-T4H+zI?"`L:75#;N-씤ΠKs7fHpX noC[,ρ2{?z$#b&Yp{#ۃzfc7 D@.A +ɟ44f4m#6Mk(ګ)k0!~:[?7I͑v\}F[,7˲\Ϋ`["<Dz,˦Mv r7&W%)Kfh +sr:3?\\ 1V8KL$ZMB6[nl(L6;8}"omcR`$[5™:%#;YH%d7e]#%Il02cF3CݴGAZ([R:;;%tB/RgP5e qTdmc(HMӷ],7 +%֔Jq.vv *uX Ks )`Q㔘\0>H6` +abB(a3leWpN"a3O\$%O]}٥L$!ȷN_jhX2ؒʛZ!)E8c:%QyO0zgIjƍq\i>=a5FcSVøZ1fB?_5qxc\Yť6ÔpZ5'wW4Aѓm!ѕ:ioN#'O:D%}.\'|bB^V "q@i 4'xQl|@K|2KnCT*9Y'~Hp*906IaI#]CjEQ9`JChuԦZ,6EwKz{{ +PJ"bÃYsg^K=Ou 'K=]vroc;?6CKwwwuuu^mz{{kkk՗h5zG7~ MT /8ܟVVHvoBmj%t<#{8 Q˺{\>(fdVOؔ½AG[ؔ mV^-Dm$ +ypkDLFքg$?'qx.|N]R''fEN>kɯY.Ř g)(Wj 0R Y鰑~~I[}YG[&y*<[WFslry8ep>cO0hzSy],*G3T +r\)'ښ$ 2gJ$o ظOEF#RjFݮސ#p)4)oQsW"`$n;LoN.gԃfyS:t2IQ*>4Y25r-H,!oQoܑmzw̒_7zw jP7. DeaL~+>8k'![̞p /E(enҞ'X `)I`LJtؔ%+zN~{qIOEZryj_W,z‘GFOf? o!W=SߢƄ1D7nwu*<6``\ٖɏ$7"G5 g\1XqrP_H2Ƹ"ߜ_,L䇴JhrDEjz3q7 +9~R}ިL&9kWRiO/|ʣ= hNy9G<'9Ҝ)Ǜ›2Zp橬.ǫܔype-GxQ~fG7Qp=.٬T;g| $[k +wBwØw]ٓR 09nn4(5wOf%H ;gaUT!Ofц~~}ks 4Ed5|?w=o'j&~>1T=W@QJQ`"JHߘ2W \O>|&i+?/0(3` +9~41~ItBmnF BǗvVWg_rx{.WZvfؚ\٬3oL/.?+!/ +ɜvːxθBWb?aɧBW99 +IW"L-h⑻T§ c/ +cD5VK4 ♉q5fX+%Y%s]!~4\RfxхI&Q7E$h!F<#pGO8b֐od$""G[5s@"M +G3:a umQExu+ qxa\ML`w8IPY8^䈈(UnL3vQp{btN) rJa)yԀM/!ܬ/,i%c5L&K9H(T3q@0z{{ +E Enpa6|3 Ghb$ٰOL3["~DDgff\w!\8cVnVf,"jJ. }8D"")P_JJSH+ތ„II +YM}T/X͔DD?֪]Sf=XCrͰᝦw&mۅ>oݷjm>y;E•YZKǍ$ +z3lQsYJÛb7 ,?|C +]7&>~[+Oܛ7 ?1MKnpIy7zMREKn>8 .ýt.n*D:I-6ђ]6 w+D[;u8atL ?a,egk/~t;O^r3՝J(ueeD~+=Yd3+Ve#72f8b||.plcDW-N~wqJʷa@o0y3et7ԃ ]I?|/M{pI{}uLtے]6 M|)/o}izT}Y>xϭ"Z|eizxeϭ"2ß:xw~rh/]VFU"t<Փ7ߞ zp|X/3 ,{/+vگnhe'fɣ7 %,s~Z"<>ؽ]n87>&O:@N&6~M|d@{r}LoO rtE'`Wc^;݁ R$VY9߈n*,~_>;^^zyR 놃{ j>8B.2% i9O8@}r}ow❄)cbs ?Y_v%u"Nfگl2<.D4ppݫnWJ0ΖBAŗ"JΥ9v %++ Ϧr2XF6=3)ˉԵ%/]>UzsO/F]B WV*_N&^ooTW +c"7sva:5x<*L-^j5pV|劲 6te^M`˨9bZN۞P7mw~T7o~g[,eu&+*[g?/wƔXQ۰%@:~[|׽D>x+y/o7X,YI?ᕕ;S­Kec-5EZ r5"ɷkߙ٘XoU`*k? _v-aK8VnwrBbGOKWKwy7y+}w󽓿|crsox/+z0K{ W2 en$u$}|DD^{iQkn/Z \ƞDސXa2c69_yxeyH-+GizK7ܻ~\s9SNýĀU']'׫[ֽ:$Cƻ'%iۺp- sb8* PLD0k殪JO=}8Sfzj[|׽~=9C___}3$߃7ڛ$t>P08-'67$'si$U_Vv|>ѥ6^#'3S +R8>+sXOp%˜4r;;0oPXa6TVH>&h%XO0izjf @6j7dkr1$KQZ՗9}L^ +c_f9[5D̷ x[Zx}%)fIWlȠhE$Y%o,ITcDږȬ9H0 o'4\JMUOWS/߇Mձ'oq8'Qc7*VT_}L'$ G,r_Of)(7ˌLf+C5VK(b{^-7 vJRgfn'd u (,/&2[vydf\QŤ.$EQAnv& ;|x~/a,~F?,L\~wO\@62LrIʒY9H(!lfXV"Oluub l&Yyȩl6DDp"6(z"<ǺS?3y*ȥղܬ:5eHF֯FL@Sc1 TPEL#|B^$F o&d2DRn!\8á{=/`lx{iZ(%)Lh o(!GMI,$ٰOlr1ȑ5A^"‰V[I_"veI!B\r)"3*2A'I͓+Ƹ[/ yxSMLn/yZcWg0bs81fʜ8`D瑃<;`&qyjhX"g3g yY7dI(9Ij2(k4v4^r'0eJMe֎U0`$L͒OOH$S1 B\1j^d[@p7n-|EQ'F>ʬ/oyƷ,%|.ExNm$lxtc=WO?ȥ(( o6kP,܎Nĸe%.Iw5(Fr\(fDC`}K"3/ +b=? x~@1*@MJ))^<;^+ڪ7)d\[5WqmUVF%.v{̳)Q_w(I7mQ~<>sj.י,B[+O⓻ _\uҝ>#K2zkp9>c/v{ӣy6O뗶(6+~# +U^sK0 +(/"1iےϙ@l<I%xM|hL,_ +Q|!ɧ籅m*J&1NMg\[=^N++)?GV"t2T6m t6}}`zDRl(faؚQ'Ma.;ERf`FdH^J@z+!/˲$YB6H2*YsZx'ׄof 1ϩ)%[Fun2>*'XkH7;Rf.ԘԓI^cD.Ps&S[JoF7*?{#Rl)JS,+QdO8JkEa35'}j>8z#FRO=KxY;7srDmG"2&[@l:;d?&ޘfY yul~fdTcS@*c$dKfH{lvj1 }~Էh~ ZID$oZE(zePpn2D#4b\[y#g#"r<-ͯWo>g'Ko'zl5qUQF:/;l_754ם(+@8OjQCh\Q+NqZS^sra6sVT/ϣmTy9}f5c,ۥ 0JbPqRK+qdf"r'#E*Ye.iHˠV2VIP4Z$M/2>iO3IO 3_g2ԓ;Zq|QJXi*LP4,I&'V;/[>\:~c\[եCM}L΁RZژ7QrˠVQ8^;qXMS +n__Aʞfuqmӗ8DYm%htHs]5&oKYVH#Zaod䉯Is8Kp{UȦۃ&B^`H3hcI/% o(zH^E]DDD5V6Ү_]7ƯD1$c +nκE(eD$loއ&(zB^֭˰V6ӵWHʠJ7yyHA磶?ӬL53sJH[s鄼K>Q-u-A+ŒOH7&ol1n)n[k=賤V͸l$#7~?6wSEE%1%i_242ӳV3L>O.Յ[[[D迃 AL/8-&ll$oc6gfFsGMIVzr8mǚrFc<̌ ]SNϙ?y_lrHc֤nc g\[5EcnT G!7mڒlTva\ߴQKH[(ҼqOSD\Л?MǢpjlrXRLo3f`r*(_'N*bzsS'C%S0)ȲE[{l̡LZM/Lݍh'{Fl4~R^b.OyY&o[6֟=L ?  8 ~(P`Y9P{ +RKf2O/2Y"`Q=MÎnC\=~܍ڗ! +yY$?$II9JFoJnu`:`YrԖ +QZ6Q$m^ERq*޹!0vͤtc|(z`RB_lm]O4tۚj~ԉnm5Ջeef4}692gʱV9!ps=M6))ap\@LqǞ@| e=ʞx}U=;&-$t7g+#C^MDpƐd#"+xDn^*:$njc3s 3Clٱy>3缵iVu=῾]x(>7`%Lg$"Y;<<5wUUU>KƵ4V뙤ZMϓ1𙗥|s Ad5]]]=)5TIMPY"I-=AjS`jh$LXτ׊qm930m$mH7P4 + @q@P? 0Nu0P0UWWOuf~ 8 `twwOu`z/ EuuuUUTo +:¿¿@q@Po@q@Po +*8)bwRg\r!tIjMIjp, l=ȱ +/y&)]LDH4Xq:fߝK=6OExџ'CX$CuEBIN!/IF֯9pPLW[s Y{1Mu]sc'}\crj]{ߒKӹk-3T`X`:$Aӥt"$QVH-:D g8f"rjY51kJ.@B+,Ib\Ʋ}$B&T|;֌Ӟ-6܋ `jdGrT;;=Q];ٱcWm[=;7tזw:.l-#ySWc %"a3OM¸|.&S$KV{ Fl'*Sز% Iӧjawϖ=X~Rt7"1ij"/諑ڽ0KYˉgUwEBZQ +f枝[~L|ˡXw KP+|f>͒OjHD9V$#QS:D%ڗ! +yY$ك\_ߐȬKZ,6m.rrLEcBOLompjkl /l~umTTPdž@o /ldݲbvw=q[OuL5_6?q[Ow}rX`o5<=ga\(/"<@3(e݂vK<.f,} 枽DԽNĈ;5twN`441]𣏕c뀓#u)#3(i/i?>!:๨2JI|$/+B.$ʁC sMJ?usb3PNM!CdT`:'c#Z|־_^ް&#"meuslə_w~}e?7XȺ/ۯ;0"< o41FݨJjeI$#(s8_γ_10DT$i^%5g7gȜv!Zrߵ$<#w>1({kALAL? l,K<ڋe+f,`)lVYcmR Vz[YY}c}eeomdoRl^dd_w}m,fR|~557`:Bɋ5˥]qژ1-2} [D H2&_6>L nj,2 1IƸl60 +xs]TY8J@_B~ ؄{uej3VBÎۢȰ%d; Qf?M<!:~ėO{e&_wkbDC#M$uh&Ӟm"Z)ncڳMHܶDŽ `Y8^EQ=\nyDq)lĸZ'!'_w?8S 2wrS +hRҢr|XkvlcY yQ9@翙lyݸoj oic}`9MzV&2YUL=liȫ +8}'znD6!E[j{gc߉U"x:a&=2ij;v>γsSgţ,GDM.F0h{:bi̭`ɴg˽DS=[m wro^m&S r~&SPTO +q4A"~5C9=[e>[q8Kvɝ{}B-9+}/[>+9̛htDJ=WOb I-u}ȓN[h9 'm|qHe-WO2;!;9M6MIB(abB] Z I766꟬#iɺlx ϴUCd—_/1E~y 9Z9tegod(]in־d3_E?X%2#O?.wѬWrjic2&f_X%Ҋ|d]C%O1e}uKK.R%"u!"{9v쪥C8XRE0- r%.lk,2]r3l]CDu%]{?.nk/4J"bÃYsWUUM|I___ʖ ͤzkEHOhɟ _+ 2·5L2l†Inoz{{ +P? P0a$T)x7xB~ bXک0'/ +R4# Hⷊ.4)I_X,V]jk(9AsΎ Oo@q(rtW| eee˖-+/_/Sn2j-)1Qͫ>)-Z N'􍎞3w]-J=zltttŊg7LFDDX$͛7gΜϛL&9?NK,>̛7/%v\sU|nӋ?/>cﺺlhGt*(ow}=G^s韓7wnbgG6nz攔o߾;FFFO>uo#_ʗ_} q֭W;"zǟxfyݯ|a9fPxOӟs{gyןoy݃s}3?vϽp |q^쩡SO}fޫ̙aู_xq?n}){k;wJ555%%^ǿ{.9%_]:UVV_u_{U{{_Ͼt-Vs ~׳55Ҳ[;_-_T $&oOQS7>o=sz߅_rWlz#z׭YC{\Xqwׯytu^W:t6idd׿ >y> 7^ug~x׿U{gzLz{{'PDd0I'===[[?}ekOO5\z۝G>::zfx~;.:'rɓ'c5W_{w_v5WsUWb9sJJJnzzz΅ |·nYy +"KKvO$:<<<88422p'b%%%>_{ VVV;]~պe뮵K/~_jWr_.[+/ewܼxh^"O믯gΜl/z{\tQ%"k$ܹsΝ;~X,F& x+/cx^ͷ.ѳgϞWZN?>:zV<{饟V_oo~w~722po6ꫯutmW=VRb">}S޸e? .Xz[kΜ93tjhtw7ѾmykϞ=^x]s-_oױ}֮λ`;˫wuÇ뒴߄w;0/-[^暫 ~2n׬dP>1L$0.!i(nQ`\1xO/`3'f7ȬʿbL&Ӄvo]'ONɩgϞ[}sG3,{wW<sIUO?ls̟?ܹ{/+xWO.[ ֭[>|cI飏nx罿]+W[Gճr>W^_:oF?;O}Ν;˿l^0ӟD488T}H4z/xܹHى'/]ndddYy Dwꩫ;N:jժ?ޭ{'N_e}*8pppp4]T毺.]x[=m>^_ʗ̙߽'ܴ]ӧ|?C}OX6~?r`?H;替40o-\w}044t%K0/ﮤ][կ޼lٟ9.͛_:>_}ESpdOM&DŽoW\qUOW]u-/w7Tt?|SJuܹ? I_ػӟSO/^l^+e˫^f~geuw776ܺ~/w8po\{ΛgG^y5" +8q/Wn7o^Wכ3gΪK.6hǎw[jddr$'c1 +l8}g>gy|ќ9sK_9s'_b+?z͵W?~tݼy~##o[KQ…g_æ:uꩧ7~?3ǿu۟~ؿ_:yࡹ_ee}߿.xcǞx__p:|񪋏;X,{z,Y=ZG}׆N=F~{CMuǻ ϸoyse˫_R^@D}8stǿ[ʻ߿ǟ&"mnSz{z:;7mÇIUff2ku~3/UT\W?+[8xٹs飏vRccSw9}u )m99}bSk+[e&MS>T3kz#̛9B Z$&ll$)c$fj9xLϱ,˲\\ 1V8Kd\MP_":#>Lp+ILF,nZ$ܓ{e 2;}qTGpc5N-,˲(׊ p0-lŋ[EjQ ۷ԩSS]I$u#`w8IЄ7N-ޜcALB(z IC/%#)YtoDk DD5V CfeQ +uGB +0-7p{{Gɫ2Y=(_nLErF<|5JL鹿Cao00uvK$C$B6Oqr=G %5E"Q<`=߷p3g/`٪UݻO<88tkw=>688pcG|ܫ$DŽ1S#Gor<ϑS9s=zĉr.)c|'/^T~m!jڗCC$itDҔ&QӇ<9ϑcucǎ5l>)n߾}XجwOʓۯ>GQF?I20o``v{~ UR?x`A~-ٶm7i 2董GKWPOV|;bҗ}w`ށ}uHoPj}'<.N)K?~9ǻvBhiHt"-΍)I6t\,u2ON~5R/IKcYJQc6;Qf"SR\Sѩ0a&$~袋Ν;{1ۯ\ԿhlZm]]UةS+.Wov3W8~%Kϝ; Nd*9{ܹsl0V\yرe,7o^YYiżl~O<|6&! &23?"--/Yqbdt袞o*µwc0)ZrE=z,niꩆpK.ӟ:u Ϝ]h[ݞz.9袊 / 🰟;~/`Ν-*~񮚚'bgϞݳ':LC:uODd¿Zmrxe˖^]y۷֭[;w'/ ӧO/*_8-U׬9uLuŋ>|E/StwZli -^:zjؾý爔M,3Pn9f?u?_yƶs'NI#>,o'.. c/p5k,k,X0cUǎ]p4Fkѣht… .qfbt=xЉ'V]|ҥ/Xtxd͟_v`A}GO>uׂFΖ~#8yK׍vuη'O$j`yL&O.]tܹ} sϟ?Ge7wЙ3gR2b燆Ntl8+"$hy+Ggssp݉_ϔ$˘J]"R٢8-Kw\ҡO*E%C.M1N]vGfjXWWpٲΝ;q$ٳg|3Tq .ܱ%K8o^3;9r444tܹ v8Hk遝 _]5BgßC[W_ec,D]% 0&$~;rG7UNQ~3"%{c̦uС-4IDGv/̡ό\xL龧]db4Ç%L2RcZII_m{W]u ͛w%KwwZ^&G /\:m:/VnҒo*m.]RWXp/~˫sι n(๨u -,ʋ=6kb\ƺ]"<lß{S!"\}rF}e2b [[%xl ?&NbB(z &^]ӧO-^W\~w _όWW/\H1:^8~ْ%K_ZZZZZRE]XVVf6>=+|ٲeKߖ-[zK"O%s_0?9_|E.]R2g΁.є-F/]Rznl,f:]M#e3s*/hq+R<8\>Gi%%si4ӣ * >-Ofs^vl9s9sz#ǎΙ3gnܒE%s*J=}nyv`IɜYnŲ:f(ƈS$bkr1Drf<,J[k %[^dj`%83V2\4OqM޷{޷h4"V"XMu!AR۱&3w,w/Tyn,yt[ZxY&CBm"-#Ywgr5aAaijli6o6A;%ߎ==4G>ɁϞ/ǜjS֤bV18{\Ra߬> n""A8 sw݁sòw?Rq6i~*,P3ɓm0!Mr\WܮHuDŽ6C̴?>|ULdiGt7/fIa^:Zͱ7Z/5Hb29J_͐P ~fW\o}06W74A; +6q{<]Ҕ m2i|}aEď#xKv6Z395E˲r\T]{17WL졇6jtW3}#Z^aAR%'@UucVWW_xu}-Tmwx(ʭ)9Vr@#ng[ie~!q+HtS% w! =liә||9"h5S2S'β'K3fiΆ%d$ +rٛe` +~|H:pGHF˾n[{ :/W8ΦzsAlij7fɜIJi| |Kx{w0܃.. +4)Kl &Aah|a+Zo F/AP$0} +o#S23g +唠[~ܜH'WARpi42p|FRJ +$( E\g9w@1A3$M"(G|:G(JB@RBsR _%dS|A9-%!,xNzN]'2Z4ӎ0ћܜ<ҶK!\ےO +MM;]X2ӃdJ\ @c +dYcKEkV,5Ӈ ANܙ,yn x&pXrBBu`pyC|UKCѦ{2f +;lYAQ9rX6j| wNClDX)N% G˶%Vxqgcz8!1,aT8 62'8t8Cr\^"ߩOO& +<ٰ(\ [{&5n[{ֶ&#}t6ԛuv5u|oL;Ǽl:}^H,!W6\jwpYnmSkIJ &P ȝu_o"A_08L/ramP&ġi$K:2eHQR|Ul2^,m[ LF>itH +=uFph\i7JvR-!W69~s]-4ș +| rg$[vv֪U+9&26]hll\WWW۷vv4uqk֬p\P(r)x Ô9r, 45EQ,VUMMU.++xzך2蕪*ܷйIJօr!3He +7@AI]s + +r#AAn6~җB!ėrrV:vDiiuMOOqH$Ғ&˗\ϔ]*\>ϟ-+Rwuי3gEwWJZzdx7\QVV NLLs.\Z|W ZF)TC᝽2ˍ vj9`$l?6;;_RY/!1Hb ]g(Jfts@8.|u7*z 4KJ=p_*WPPXӟUWWWSMV)%mf |\s +bÃgg.{(psAFtGtEq/MY<B }Cʠ.YZAXĉSĒ>'ᒒˣ#G/EE0L|Q)8 d;vbO1u/}Iqܯ~U.z3ih'6pZU, :m@4MEC{yD{'&e(GN#¼)I#4$Dθ3g1 Vkޙ<7DZp_. +]? =qߣ_'AlH[umC֑r 3DMk[- ,7K:6{8 H(4.*GԦ|#碯aYa96.6ox#уnwrPMah#xw7'_1etbT ET&S>\[Mڈ'  +W0)` wm6Y2zѷ0ͷL^$ 8~i@ ]RV+ǮMOMKRD›pR2ndJrV8szB)‡RUIhhR>X:Kfwg7)(K txV!D< +K&4IԂɴA@ + ;D6puppT8&!lh 'njO`IJ  rK$ۦMFB}]|87/r~GBwڟmvv(K!}35kfggY͙s:'&&.8qݺ** {'\XT(IQtu>Kᄉ >NVeee% +))!wp,] v,_^Yعcwxk}}|U*EX{MA؟TX-6ĩc%Uẍ́{]jZL*R4UW/˰aUݷjo!-hS,zcURJͽd+u+6>ްz6K ,5r~RR/Wjk~뫳WC4fj "3vv6vYڶ/tg"lWغYW٭qX!\K;xЬфOͽ2z` w`|rrB&s]]]put~cnnxHG{rss`>Dt(RkԢRcp!JT߿{|>qQ(sss/:.ByYXf|ܬ'Nߏx|s| SED9Epp?=+̃'ɏW6b%9%+h8ƛ?jD"4MJHTݡe_s! (Dtg@ DA$]CAa^:Y,Au6ԋ\bδVΦAs޶dجt VN_ ƶ Wu7,0+Bϛ5fss2O"\ KbA8v=;99d =$5 +33I<0Kg7Ofc%.%O)23;z +ŕ a%Jx9.fE r$hDI?m$KX$7#6'Ldu<.@46!oaqlW#QAAx- SyU(UTtBsΦzS[S\9ad4$ >9aj57פ7&5憰H&jeBpgSK`جr\%4]ryKDZH?B "byJN#,G=eEXgdH(ď8 HI 'L3Ex D|HaDBl/lmkODLgS 4Hamb4 L]fghlhh4-hSyF8¡3JYVXXx=wuu|7K$Tbrre}U?95q.֬RWTSp99|'abePpꙙYV K{{{ct:](j59Z55h5i#+s9Q`!j^@8.0Wg:}Bv*XhD IIs*i$tGNʵk:Ɨ-+TT#7'we@PUGKML%Gz9[ҩsRJyfyܜ/~*j/>p8zݯ! Bmnajk>^F-zs{8>.I:{j:;hޞ٤)^oN0غH#Hش,,d!, +8YOK,{8)p^wU/\)-+eBF\ :E^AL0蕬,uP(nwH%˖9sY,"yˊ7BHQQ)Z"L&S(CCqi-9Pv~VsyĖBLiii{lnNmhhNN8K[,(YH~~) +볕zz?>VZZ<22Tiar\6qb"aeB*DYuy,HhV$xJ91н ;]܇GdI*ajU܆pn&:H6UN9$<79eAX'pW[!Am*YNc``[YI _ &=N\X)9x:(f9dyDn $YM %aU +DAi|ZOB$ITL2Ic_D%L2. "4d҉300p M >%Ad՗$~2+KR+>kT\{?2;fffGrrr>hlNNl: +Q- `0'! +y0J%Ra9șj=Z&$ԴVhssNBVi1t=3H +b(voڥDs3~/>}}wD'? +aXJ`XI2U&IMp*)4'(rq5raJJbzz:778LrBPb"4HNIeXXMtyydbb2;;(ϧhҗGAA[%֭/K}?͕UI2#3n}ܴi㗿MtH!LJرcPh]RpZ"JUYYi[/~Pl&F| +K;>>3?=+jE,U+:9}(??E(+ B;=<#< pXQJVC/Hͽ`駅Csei D^FěvB= ID4WNR #W`0x-3ӝӺu]{YA#QIUs!.t0T)Q@{+\@&}s8pOϜ}ڋ.7 _O0n$)@SAD~X.jhᩭ[mpŵk>uS}{>v/3q^f8p8fZ[OeecYL +1F\l> +h蕄r`ҥBv箢B&J"ܳޠ3H$4R{e&TRFf+k6x8OsR4DOE+E .'╈7qq)4 ҉)WG"`hh`Xyyb| _&ydXaaRx!RlWc-thA~VKpNh2V]P"9snK #+R;U-WrnNUY}N@ AASXK/ O>9422|Y~D4˲BH4%Jqb1Hڑ!H,})(A"< l6|K{Hlpr3P,R4%\QQ²ܑ#{ wOm^I6%#2VAဃpΝX, RBX G8Gs`f8CAA;%Dv0D6[xQHdRmTRDA*s4spaD_z~H2"-$ [$I"i*fdWr8 KIN+aPۛCAA[ŷ!4M4۞/W.8f9JB.B!Ѩ9Q,Q-B,KQ/q5y1B|3_'ZYsP@BڊEI\;=ҿ?H1i" +c‰$jVJBSqZX?QQy?#"#Jb !C@At  mo4M<"JnסCGGr9|ts%B(B4uvvˣ>Zt=z"ZϲlQQQ'ozr[S[w_NN6ǁɹ.ùsجJ;޻6??o\0JL*ϕqW6ɚp1CņJxd!V'nVH\a:IE$IPrj--&՜jg׷o;|Eӧd NTvtHKUj +ſ[sʤ7w;/ ˖-r4TR%٨bt  pS|ج6>9p@5ܞP08p2nq799p%/,I / ;>>>;똝M|BV0,0p:]"1ߟUOMM w\_( +(K|s>cpAV})}2b}Y\2qj|s@ OKГV<)wă䚣C}811gB1EcW(3p;{>//777fMMdg + yȇa\Ad``F/Aa`0QL4롃?=3x8gϝOqP)#GMQqp!nͻ‘l:xs4l:݂p@evUiBƘh?gH2"a4)E‰$XkTE9y(b[(@%~\ɩpjБˉ!OhhضGAAۀQ;\[4 I:.eSclǟ4>_m#4p,$U+XEhv%Ex=Iܢ0 TUU% ʢ{~Jz}T* s=4}MBnWU^3XwϹ%|Ij+"85.Å ͗%Uiyyy4M-_V4=3 P++u9cnNRr9@ sĘ(gg  !`X%Jϝ;oX +U*tׂ   o1 ~B@J dVW>EQ+c4YsLaQ+O=~Un2/7]{cٲe"T~SW{Μ9rD!dEuU겲VJN:#ߤR-/Nΰ6"WTTZJ{_7_/|IDc̗K=dY7SN!O1Q)%+/+FF}R?E(L +2VU[mwu]TQq{jzjrrxxjMJhPݫAJx}1"@rr\+//+HC_u9A`߻k"yqs-␹׎^YṬ;]O&W苓m_\ ,FQi +XaJE|L&SEN5sE.AassN+2,#DSYP(Jsss&''Ebn;x9OJ%ر999ݽњ1PhaFUo{' +sggǏދ1/Ϳ^we"m?FQF2_dOZ,2"/( fhb`Q( +\"|>YɤP(7'g|b<r y7.Xb@ gHҹ9'OK$\.G A8ScGӚ[ͽgNTk^uLoe"  7oBA[8_?:΄hޱEޱǓGǣ|>4ىc6IT)Lg&b^>Q"c20%/@bۢ2OĮt3I z#.d~|Ÿ|0 k/N[^Dl4dYe2dyV[ *nD^?վh{={ L%!@"E\g즄PeZ2vVL1OD* 3jyRnxܭ/fH:x@ 9_m!2$߄D|Z&Z0$P8 ǂ\;a: ݭ&56q VSqᛗkgetR5vÆueſm[}qcWC2IE#!|5wAvf Ȥ7ebtݗ8vgk'Ϟ=?+dzRf9 ֯;q*EE|Bq؉/}4>>QZZ<3=:]E~^D*瞵*29{nUTTp,RYO?=~:.\hO8)[#SI% kҥ)'awW]B` pWgQJYĂ3#_u?wJ6\Z4ʑOD'e(~R}D8 ~2<98% G?ﳌMlWgΜ8N_;z|fZqJ>,/ +B dh575//K_2Tݻ>XEH0*))nkP.-cb\6[FCg9%=gijli6o64u.ɲ2cn[{)g,KtOZ36O?wZK|Kx~QCs^Vf2"`j57W7,f3rc'>(R=Rt6ԛCL;!< 8h4yji ʊ> +/r*eh +,q\nnVGJ]O^XaX + +P!1\n^˱ ˆBP(DjêQqa1h +9P24K8ojhoeޕ{W]ц4LFQTj$J%qĽ\]ԗ$T# =PZZ:pt33 l!6͐PaK,)KfI}ӱøs*+uCKhD? P9/^J|'y+@i}$ TxW.ΐg VPW 5-[crgS[y)|vx@bIwo%z(8vıc'G1 =3| wR~:4424.>do W/8{\*aߔ3ipX-8e֔ey>Yf:j||B|AZwR8Ƒ̄ G)ƉU&@ԑIc@+I63bv{}&};~d{̜cnG#ޑAgSK`kokloX, ;LmIhM-mM|24v4CKo]yQ%ڡ6J /lH&$Q+f/{)&׽'+6Z1lLFOHHcikh5wI uƲ2JHx+f3Y3s!;ck\4;|O2h?p  M!P?$\By'@ᨤ͸W7]l2 u-)5;,}ݶT[:Zwq_j`$!o}q-Ey>R@}ߌuę03A&fTGJ2:hhQ,M"H$ٙY cccCP(IJLNNFz33yn'CG.K˗Gsss! Hhz"(JR2\!4MOMMdnF(J*LNM` x@/%Q_bq*eٹ9+}/?_EUmXE/&L/Iqjc!16N4Ixj8JRQE( +L0L `Y  +d0r:I6$VϟRxfeEnFk+%6@l67O`u_n؊dKfi_ DzD2D + ˷Ō7;t]Ǟt*|zvPaXF,V; &c';^3AHImgoC}X^Xsj>TR./hzÆuUzh5sS?9jrss׬1BCDYcp:]˵̬rffvuV~{T*;~kaVT*// Cz}eVba?x>PXRk2 0s#ǣV7n\o*:6֯3oi?h$Hn&3FТ9$y cBս犐?`:c O\!Z"(|򹹹+c˖~ǯ~+WoBӒGj:aƇreѼc +v]06z[Qܜ*2EYg{Xa+-q _MkmQdHd\KeUP-r}=r F##)[Ab,AI,{Bx˃BpRXX0pj@@"+ 8N¾ JBV|>LrCЁJjYǏZjW"˱~0 +]xI.\#GSrܑb1M\a)>p1'qwg=3g|\$e 5H$-dQ[~7 T*Ufc5zoL5ZMʣRon\Pnn!7~7IbUBMnW7$c@[/ ߜ艷2A'-g vxP4)k>oC.|;^?eS&>  @Ѯ߹Чyd䟹 q!{DE _ϒ/f(X)h88qro +-E,;5555vʝ:iRRijO_UQ[q- LOX. oLTWƎE7m\Z8t\%n\y漞9OX.(H"σ%Z"cH?BU´%B(Q)yPĥNa@<ѼM·K_*>Z]O +-Ů c"޽aZu-HAnk\¡Zꄤ!ZzkGW$&q)2uበWW nij4-WR]w{o*}{%ңxr#X{{>NQ?~BW[h}NMN XNg0:0^_ +e +\.+((((?~ƍ:B>=}V8FQaV[Z|brz|||2~\EEUTZFT^4PR|YQ띜ti@(WPMX 2Cq Q/[F095y]gNBP0T*|iVdFj(.疉*?*MRcI%tyܞ+cʉ LN=woٲ3X"|t^Jds:u򡡑++˲.]IryIP)**cYwǁT:(߈M +V{<3lҸ\‚;Gϭ]׿~2騘Lrpѕ$R2S1& +SMNLlc.rZջ=,*W:9=C>yL|w;HA7X Y,E[^3o&2r—phn[{ :Sphغ/4DM-tRu5TiU.'|A[o*'Bo@`׮c=s˲ AvӇIFMx#?F owbo}?ytTҥŋ.MZR<0w(>y@@*fte=zWOJF0 "N-A__ n$b.%$ ',G90oq@*wmNH /} w)y^憝s 'PMa%//dZ[֧潀yDۇ%R`mkW%gY߈OR$&FFSkӇ}yzSCDݬooO9 t!75o%籸EqMA_0$wq=!ɛ⊰ R\j)&@8i,kF\bR \#J8O +c\ua\$}DEb2E`<4E` {Bl27M ìXQ + +W\gϟ?z?f,g~ؘDzܑG]UU) +T*uYiInn#׮]333;99P8oeE*B`fxVɨ'F'+WTnBQY{6жm_կ޶+Ƈ>DAkXI|#TtHtjќb7sssov)^mX' 汸?[!~N*/߿v]~7*Y8ِ^fxxXԓxD驪Z! +DJ Hg d``6驤pRrr^[aN8 +_G]23XZ}̹+c UDwrKh`vfFFY`dܜ3gd H$O>w0_dOWXz~F=33 +y it:H@r r2 >?9>pCЂF!fHR[q׈QǛp CRqˣWOҨUK*p~z67/777fz|rTAAAn$NRh1_ͣ={rܙ碒$&3gA<@ 8qobܸALzBAA[ŷX]Z\ ;}ln^_}YYY`ukBn> +$T \VU?w9JՅ Dۆ h4`0t7l0h\H$Ofw 8Ĺ+:,JrY(8xJr"i>O>Dt xxS#!5rtpG)h +ѣ"~'펽^oM:25zM|\…c#wm{{?dPHR1 3o +DRvw L&]AAuY4/6.8NP(Z|&!`0݇ $ý^Omf IF<T*z?IOY6\fvK5*󿥭-R7/ +Fŗ C><?C~w5=S   $7 :_,ZB+rd$~˃;48gXe %$FKr\Qؔ"=Q:&J\IFa"AAY2$ɦMsM>}F*χB_ʕ+K/+@3 "suZ =UXRRLQT~A^iIiO[ϟ;r}©W&JK]((ȫ:phU` 7''+;+7'=tbrjjjJ&>}F(S%%2 9OvV}"|XUJ+G+7_qc!We A=K35I N`XgϜ BE7B~ LHe!J펽xzrj+]\  , N} +Ei5D}hvvt^, (9(,2.Tx>NVvE sssDS;Nz*ZX.J$Z%c6//4CVd2\&+H9$R <J&%4d9l~BDBSj[E +yMo:t;뒦L>oll|zzf``P..\pb(,^Z|>߬ rr.^pby R   4$?իWh+++~|xdd4%ښ eŵo(===,6F/K@n.YI AnIO%"k.[ϮG3n<>t+ gBSL"IvyN.T/ҍ   o2tdfffn.LR!as)f={>Ѵ+**u*Rat:˰,E1EQy~dgB8BT$&O^^jR56>lY!!v{gj2bras +<,9Dέ\YKr!\$YS/&eJmMM*C2^תѨCCv/[Vh<盚BHYiJ_]Uq+.bU7H IeAۆŷ`yyiAAC4}Խ3B{=wke +kk?|_x4w( +bn5kV5kV]I^xV4 ߲k( X +J511133#$RiU}Q {G#Ǵ~S)s;m -OQrE[ LM͈ӊ>F\ud!Qaa8& 6VT|B #JZFpbo'6m2>Q"|b_w_熆o9 AAA%?xO<=qr lg9rlzzT"!rLMMjsϢP(XUk4tbbrv12r+ssΣGO}wCNN쬃aXaK3 ?wr{aR9;!/( +W\)nYL5GGV?qld<.)b, 2b+N#7/ R0uL, +uٲ"xo Ճ  w EŢ{~ 'N⏣}A$l6;ݱAB^u7gggSM0 ʕ؎!̉T:.̸Q;+Nx8C(F D±lX J. +}KJf% )F]m g9%Ub}Y0W]2ϫ/EAA;둿䖆8C`%P+N #%rlY@ YB v2 a*ڄDXheԓF)$R$f^(AAA%޵*j||~PJYW´~Hט]|ɤ~E8\WZH+eRc'?nfvdfz©srr@9΂|mvff>JJ`,0 +ȑ?H艉I~QrWd+@E(&gS rTȱ紇V4U6䔕؝sN5}|>$6yg"Dv ͨ:h.NПjAeiiUչ9@i*77j-ɦ dUNOF, :gGAAەů eDަQ.fGlV+Jry^2&gei + + + +wmIIqEE!W*D󖕖XQU\pUVĤIIIq \w}9ê˗AJUPP ( +\nq*K +)7=[,Y3P kA-ٔYY'NREFSQI98-?d.7 ςPL4*(Z677\QgeeS0H(iWD/[N-[Fyk*]~  ȝÒfΏ*JT;Jp B? l&spp68hS>{Ξ=J8 !t|ejR ,s><9OEY1E޳t;ʒ楄D2ѩ#3r`TC8Z2#u +F>7s^Sx½Є   *i[wV)uBcE~ֳg#`|3J"DCD[9I2I`#  w2o4=^˰@,g]sDf禕2YQQz:]EĥgJ x(",+J9  +! \ Yi8"EqI#% 08L&˅B!Ȓh3Ii"@79 WFff}+[?v%lU&@ƚlā$rKϯZQT~O&Qx(8NTݞP(d|k8.??O"j5jdr:z}=Kfee\Yzaffj\~FNk`UVQQNQDR?zk׏|>qՁX~ȫ3H4px*('0\_g}qƍ?xC#ZzժUUʎݿ+ s{L*/p>~ dgg=ݰ- _t9Y˗4MoX]ưv99?7  rSBr&'s&R)T:hK\ bs\.ˣWGTfW(9G.dg꼼˗Gggg''&v܅ rT*ӳR4 +) +K-h4jc$W(\.#ǤR8<^!9 |ܜb#/7g c`0n""*9bq2==sevfVRYL&s8FG,{‚L7p'O˵Zm3 2l: +šC@VVqO_"Y%Rmnڂ`vvv}  rS:p ҝ_#Sc -v|\ƋP(r&HgTԟ{ϒW26&5Q˽^B:fE1jyZ9>tp >o߾2AAAn6~<=g,W88نvLg矓2'}dc8)I+8   7%FG @W,CaBM4MTߌMd´(jLj% \E4-I372*ګmnƥ0豣=C^;zks-}GSk23_!퀡 0: fs D=;M"s{ +,]CAaFL57,8{.e ॺO^ʕYZL&'JZ嘝hV-++egg/|s B&4zy e9R955_711F_퉩lnm0nWĤ# j/m!۽ ~qVOyvXxOZx[FC۰>fA%#^-%뽫0*pyȵQHWSguH~F=ah^ӻ`mf?cRWAAtgSa|[Ϛkt Eywf˕Z8jAۍ7攖OLLL2+Z ΄fw.\op:BH/ynĿ !ъtKbF4EOv4@w K mwѾjи&n + +PZEE1P!pj]ېg Tvk|E&˻U:pGF4Kކ]oK'U}amk7A1جoĉu6ԛ[M VHMgL7  >ChvK^\r-T<99#/3 sk`00>11<?.~"ȵaѠÛZ1oooo7\Ҷ$ 5- Qu!هG /u7lj6\h- +bzfRx7nVܾ#Go>'JJˊffgyYmXT*<[VVr{sJ%Ä(,*t:.qy<t-ʥݵ5|~6qV޵f!qatgSo,+5q5#Q"SWl@WMN04vFkz3@ -Ei_&_ܫ8 [{q>Oz!Ͷ끩^duѾKކt`s]ϭf1U`}Y7ٴUشn67E쨮t5qݷym s!Ȓ!='i%X CI",ˆB|/-Oιg~!7颔J6mv9};2Oc9(Nt "I EhI /ewi8'O(Ʌ .PX]a؏D.\xC7`߇ Ŀ˿+WƢ=ZrrnFa17'H4/;jR=h+Rpߟ?QXX$ EQgfv6Td2'%4T)^Vz<.3_뿼xeӟo\jˣWTJGX#B,V; ؛K0_썥mjhL9<7j:1j_(4%E, +`:_w=KQ)rXn/0,˲Dz@QL.Q* q\  +|53%4EKhx? 8X 1L(pG("Hd2L&i+zgO>B(@QP  |#2  +1!!dgkrs + +}!Q|iEOWQd%3w峎7FCɪ]OOBI +976MM~`h6ݒoVq+w"Ө~$ʹC?'N+0,PȔJ9MS, 8(PiaL9;xL&O,n"QWVV֗iS +}>իxBK/q·yR)ggk? BwxxaKQT(~(w~ I !ǎ +D#ǎ8n$J$w5HW1?X#EMSSWkD%16M+9ILxC2햒V5Ժ+~.ǿu4om-ߙpqakoANcI' (ӣ(!$|e`L:x[+bb!@QT;{,ޱK@ D)B$҈; +[,˅BL0biZBS"r 8-'n>:ea4q쳄 +nR௏L"D*㼾^JB:wЪ+/s:g'|g劑K҃RREV&_U{&@%_5xdpiЗC3'F+>!lN:>)BA&İEI4M 8>>O+죛6?p^jş!!䞵wWW;W(D珞~j,(rcN~8QkP`0 )JE`(h4j +\*# %I I؛T!'W,,r @4_Ő0}qzVnX`K<$L],h${z Ę5A4~[s0ða`vy9ɤ|x$$S-\"n{RL@@$ HJI::;ztG%80 ?_Beg+bYOb%rARQT9RɧD(UEBd2,++ s9wympVP_3g"n[.uYad2ĤZ|GK$N3‚߿os8R$77 ˗-ǭ\(0@#DD{(ڡϼf+>n[]sW1$PEB6oҗ _;b-tEK<AY:nUUzeR8y\T*|>?EQ+BY'enT*y:ajU 8|hYYH$4E=wJJ7>rbvvL&9VIsιu̹EYljy}T*I=o>_*XQj +EI+WJFF.ۇhw++?[h5]ycc._V4h;ܜYᚚG(B^ԩ3%%ſ;z}e dvUS3j>p4 +An”'b,)8?J3LWW]ǞN"+(P{QY[S/AqoEmRxno.ʕ1B?pP,ˣVR?dee,+׬1Pm6;fYZVCaP(2LA~>ᙟ' BPBۋ 8ɓN<2߼?mioQѱG40OFwlB8)6H%`(DQԎ|+ /OG+?oo +אÐ[]Px$ҽO< +ϦW^y wFAA5X>ZI{(>~ lnjl?鯮)iwyѣI^ހ qû}/Rտl=?@n k6H/xtj 62".NxoCR r300p ߼?n{&_m{o0~( \_-]߳%;wO`OPп'v;&%|={'[jw@Fx   +,Jdg ?/w;iW^i۴'Clډ(7szxϞFQt|Ϟ=ڞh8Us} KDO}5@ haAn>~CAAnYž/ kh77ElVj+ډH~MKVc[E7QjnfC}T g`iDr  {1,ZE`j5o0+eFS?17gDmT5Cc[ΦzskKиwgS YA AnWYl2L*_Y+/ I A"I5mJ O*og06&{+OqͿ}{W^ 7CKu [3 +!붵כS mYE.5g :}ؑWׁ5[v6a`hxF* `An5+Ib!Aиۼ[("5 +EwGzb"wF'2ƭ3*K*HcK!*\얍Wi(----h|s_L\P#blJgvu6akonlj77[{Ql*lZ^hh79R")I(lj O  όK"Z[ 7~3l~_YhpomHHiGMpov6ԛwښ:*r㾧nQ;[A[=F~1[$꾲`dޑ-[6n|r[eXÇa-}77`B'~Ս#{_x^悐]?@M[x5 rK붭[ȥZ+-m[' XF=,X9٘ +iٷ,$ۯzo߷x,^gj#st6D5Ac#a%*[Mݭa`HO,3 5P + 2* WO3p!"#A XD-)c;Stvl04~jjW {q4goK[oY,ޖHIU4ר (Q ĠWt-)/2"((_ϠJ>n{8{a=h^p۞R +pV>g϶-6DA(Klkn^~o\]<`hࡡqw]&|}-bUr.EklVjy@$qDZhn!^a-Ͼgצ{ g. o\4)Ob\]z۶=~-#2={fcfWJm?h! /1vJ#vv6כ fXYu/CPqdooHhi{vG %lz ]}ڎ^U/IzzM ,HPڛ毷7'Gv'(FͷKvn7rݙyßnƍ~;WXfUAn-8'Id +#mUIt~fy+ XzWL\wxxxIօ 7"oy'l ӻ<[JOD=`v&}~ϳWg7FB8{{y-|m*+PQQQ^≬ۊm?{uO\[`wk0@{-'YgKr"U5,POOOUUuY bjkZܒ}}r=!]?UYsn,-&_7F.(ܼ%0r$\bppg׮m?{uK%n3k7_aD֮=[K<=vA&7)7^u(Ony$V !;FN!X[Xj|D$n_矃מxb¾g]a(b)UnVY{~D|7}y)QS-#|t˫-=g<O'">E3@ An+)6rxo7=R#] |&=?=n&wXZZV0xr!=?Va=`ٲH/V}yi8Y]޽-FZFdґ2dpk{nTuw_"A[#ZK 1$yMOnRZ)(ij9y's+J֡sD'v+g|aez֡r/A Xo$=_[)*= W'1HjY۫#@H{G`ƍe#'ۈmbWy;N}w旅[4=!=?޽|Pnk{GȼER-#5eHAorC({##KQ>j%RCHOiM*ΉKgCngCP̸{zwX>B8an 2[ONnyuXxrNBF6~){J} - +or<7ֿWFwT6q/"Vs3.A}2eamInMz~DOXF  @T|;Odڪ&6^ +;9   uc7Cu?hEBjjO=ihpqw3dm3C/}i,8C[J   rY4|,V[E}5@LZ_al>aR̲ъvsߴ2]^6:ziGCED'1gCAAAdiY$rMc6N_o:0gU405uVd,V6Y-V[M :;T_ՔfMdY3Az!&  Q~34PbLiYڞjVl+ZgS~w;ސ"dgS~wd[zsx`o-2AAAn5H^^ ^w+]VV&^u!A([`! ($} K3ӃF100P[[T斔\ħ.mi   R      r   ȭo  w"sFXѐtjtlj%Y0 +%7z.'\rӰhAA[Sk{]wQPi 5mR㾭mS=:j654v4C);vl6lts!AA髁z[NgSKoEZZ{y 7&)Ꜧʤh;ك`)4qa6EHݮ9օα/luat!=-4/0b!n2Bnl,"mm,ߋdygJ9?>vl$U#c,3=f&9f=+^T4S/ƕ,Tq.g+vWE/ߞF1/4?l>oAI˶>FȡUWtAV#4rcmmJ$(Lr-gxYټZ0^dJcpI\U'yYLKKJĊ2䟂_' +bה(Lt?eV=/ry~^s M N̻O+*&d|$RtRBS/jE\ S*NNrU +\GwS㈗݋6jlK'"pKKV}KVs)7!_gRzIΑtN*ϹX4 +\xYק |՝sv"$+,LV,ʼ&Q8'yYw'ukbQ)HGRV:>~U,z/+BTD`9nḱeZBҪGWub܊8˙2q0G4*U[Kx1O8U"8!i&*..QZ.Ó[Y +UNv>eEJJX\p Xq:\@1 +\WWMa`lDD_B>mZȦ #DDl2nm.D>3!3L+N墓 +}3p|&gĊө,؛* tD$b1TNeޗcifuYQd3"A3Hf&IW']u +B%vl$|2y`KD&O coltx3pٷTNsDUE"{3 +\xYקh&I=S$W0X(jh!Iv3"^V(qv O  pI`md( e=GywC\ SUgtE,MJ؄t٣c߇4gRU;٢g$FLs$qy+;6 뺮D_Ʉ7)5o>$Բ7pKK>%vL)kYbɘɥ(!(^u| pb1Pt1tq:_(L)q#^vDtôgkôV<Բ?O>}²ŔenGxXȦo1 +n^#K3 z?=&py՟hSZ.P"W|Fe{S{) ɢ;146)3Psm7wzǒ%VsxDJK VƼ9}"z<߱@Sޡ x曄#STN:nu42,17j.>zS|!1 sHศnݜ׏z,Px^ZM;dvݢ.plxvT aefhrc<;WJsD8""Dof\FóRiqn6|[Y*͍gK[-N +Q LvkWk*I^Rw(6ot'ow]+];oj4|Joeٽ}whk|^p)޼mT/mkS'؍q-x6q(\<^+mݽ] Ui%Ăp(z2>dŢ(Fid!/7o?0 X˺C +^O_.-6-7~7b~T{eIuFs]0y,\jFTVݫa娅ښ3#.ecu+ 4K;;g pEڸ /x_{쯿~W#NQGeoMlMcadϾ_RմĴȪ_ʊEetCR^֋0a?څ zB:jVP9d^3e|k}Jۂ3f Zf߹\pIbŵl9ZƸ|-=_Z lPXz~mv7K4ry1Zz}3yi8͖ͯJDD[KK[^p]Ċt .>gR- >pvM\on썗WtjFW,K6/뙲xMIXqUyURy9S8XqU ]d+r|# +S%4}poy*qrzV\Xo^O_Ezr;4[K 1xlm^+բis{S4eRO7v*7/M+3 +uiRZbd̝aˤx?Ǝ$sCaUg(LrՈ4qVWUFe }~enSVO׿36o׶YM$毧S,Ps:"uXKQ*2˱4˺Ӭ(In"ZJLw[ +97ܔQ{=FFKNkTkC] +js2],ٛۚ">?rn|XߴEZBP"}\TƊÅͽR*(I$b+mJ$(LrS>PehTVI=0OډXvr,Y(jHU˟eŞ܌Ċ +&ߠg̏jDFR!˳5bK~{aaZjqCgέw7ޜڗ.ћI;7wR{L#PE˶94ryvym]S7]_sm^Gmgg稇 rΟ$_ +P&%ع~½gg'ꂗ\> NDbŋ)*]h +d&'d&3GQQaZQ0[euRY$" +0;6]Vna "c +w6ذpjo_;ڬ]DD݁R~f!T/+ήJs>(ʍ,͗f%p5DhG-w>z Gn2L>ȹa~]n{ڽJsDq٣@`qks jpf9ߢW`&9S/Np#9_&YDҹHEHB|ȎUgJgxR:F&t8:߈ +gD&qJQܶXK(=B^Lf6-VtmV}Z@y &:67bvWʌmÐ/Ðۭ{Fo|]QxeS#0_r㻀wV»Դ鄈?8Vi-Q_"T]|5kI-R|FwfZ_ũZGdoZ}gRvVtFYM8Ŕ[pl>~#R2QNUyIQ9ssBT>YYlL)ѝZ^pH#`4E؁Cj +{m;>=ظlJ[8R-k\*"*"-*nOƚzk\uRICpUYUt=G3HtǡdŸdU#M{P" ƨ+襗^|~M%{{{2.!o~ tlrr RpX|W*t:y>0=aO@5e o@@og+uJ"U+PNTY(Mx)~8{%@7^VF7&n1;6JU-Zޮ;aŢ>m:Ќ5wXմtSdJqR*B"g+qcO) lUK_HZUߌ1wرQkFSP˚?#Xy/2 +R*8WPȩM,xrF'I7UDE~Fʪt2 "6ja"T)UΓcDĊ\R9]y_6g5^֝fEgv̉4 +y麮+W9г70q\9[IieX _tDe t%X(Sn;7עC""uY %Qf^#-qҶ tN8D@[aŢIx(mwđI3)Jt=gDDZTV,*3|AR JWe=w(\(fth<Wt~XU jYee|Uc 9!@olwM&LZ*ಳ +6jYK:o ҾC"B3ɮl:~;'٨w=Q*egf*rJ+Ke-I7gt]&N'l43sTzB螵"m"LH;\-ϵ ߜu pΞ={CxL|9}"z<߱@S^op_MoMm>V"_JQIӑzS|!1 ӻaBo@@nN ^>=l{X+ͽqgӗKCzz4;lѪZ>xKUTKͽ~{aB xk){οbQ/!^u]}uOuLxTʞZlvuw``ϔ<\ #;*ZʎgJ~yp)[[_]٥XWkk^|Iϯ-f476[OcNp2~cFJcV,*g[I*^ TմtsT˾ڒھ͌`9n`kVu_]Dӗ7g3*71Kz}kôdOj1wnQ,t0};oߨ5ʍWKsdK[ N6Lқwv~bU7vlZ2g+߈T)o 3v%,,貇GA8nb|dl0m-]l_mpg>;k}Gkl(]\[[&U_nOjD?nt6^䯣KbNEQL2[W jDTnߨ0щ%nE$O7~Fʪ*c/6[5`NR'@X̥(uYvYeiVY'e~&ë熩VAkbZz餴͕jó̷Xvqqn6 *7ƳsQ47>Ll4 ϖ۬Nx6;i}5tk'q^ۛf&* ^-!uY^<Ũ>j6<k7ĊgչiIbK)_U t^x5.wi5|Q:JF"^>by;2rc;o.: +=Kmݽ0m~{jmzkJԬN]b%@߱gUJ*(KYVbよMw)d0 +qb}k^^NsY3eu'?FWSj\D򞻤v8ҫSXqJeOK@Q1T:bFqAѝ:` :-kM8$dƈDbqM ͏jN}$#&Wd575.yGq:_v^>;ƹЕb6-{jʍRimm8piQR7lLxݭ~k)}riFl uA#Z6PRbQ'QKЎ}NwZʍCz~ß->6Sh&)3|ARH]K&./[܅3ۦHQ +nϫ8رvK%F!"Jt=GE Me-I% .UaP%w*dHʲܺ*]t#$Nvf5iEi幨Uj4̝mJQӗgW ?I>bQb4}W@PQMJsEFZ{#熩VB Wiyb "ZߴyUTbUE|_7kDG97#T5ձ 8+ꫛ^ zG8JE/8VzyoRsd&cSkߣn[8TO&~Ԉ8ij90[ ZNt41ny⛖"q瓷wn>{z- ε&0sb7<7BJ65? [%s1h>!ˉ+t~.aѷ:c,;6D6Ȫ^]0ə( C;':8Q\jr٫y`CE["2W-.:!2CDݜ x;L\.sy$knᄝ.)G +i͠{Dj֣eJ5oQlXMxW78W?Zt Qf oJ?pG p wH3</8U!QtXߴ-L\+^LY6+^"ÇXQڹ۝ 7ا;odo/ffw3o-:Gk%Z ,JDT/+ή)LF:֢Vv5Tndi46nwޘ%\Rc_>|LWܾZxyR6|jw11o[S{F8)L +l2.+ ORcyKW+MT)sdSZ4h*NV\UF6ɂosO&)7,E\s* +]})t.9}"z<߱@Sޡ x曄A$@@_&ccWo7 >dŢ^iuzp/YV,E^[^5e=54*7ϊkf15ξ_MCt G?ɎRFK*qTq'DXTF7$+I n+3縉}/$WɲsKX@7vlZ ଍ _όn(~;g+߈T)o 3vq*UJ7ɉQ(8wGQ~o\#1*zSgox3d|&]djnKj"ۉ\R9]y_e5^֝fEsvɊӉu6M ˚ 5d*DCn• rj.JiɄVnDe=GySh~IiyNr^փ<3C˅u.+JQܶXK(B0D2 ++TIEpi _[iggRZYjW۞C9KIZR]'X7 [cf&Q2!Dd' +ZmJ9:mS<9roɄm n!Ü>ҋX{``dooPp<_MoMm>V"_JcHӑH=> a_GٳG=No;@@o@U˺޽Y=`bվFid!/G ioiWfŢ8jZb:bQ8JRi+Z.[BB""e_G՘T(:iėj ItDpQ8WA׌`!*-a)QZBb'"Lb^3eNRY(SUЂ"[/"ܓ92OKt}Z& +C^5_ьD^u=g =6;uV{.<uK4Xu/4zw齿M8OZ|%[K_=߈eezAd.rnIFBQ +N8Vz%QZ)p˺GbQ 6Q*sD/c noXyU"9GySXxGNHˊSMNJiS$Xء.0""KÁ+c>j>҇sӧy9?oO":οGV{ή'•Q/C0$d͂ +*# TkJdzǩmVAdVɎア뺮+BjzB3I$r%s eY ԞSiB^v d"Xݴ2v|&eaZ.*ҲôjgR^,ת;fVN>| nN 5S7\iI.u~_O\~=,p﹇|_ 甸]~yY.n@/7͊Wm}v+۪oBo }3e!Tc{O=Ο$""UZ9* .QUaLU()˺sQ{\2vZSYhqRTt=GimUj.gtJ4tj7ΕᱱTa2L>00(*͍٭ӗKk4~rM_zE׹ikGo՟^>mݏO?~o^.xkL)":7?O`/W-w|ߤտ3ۋޕᜥO%ĈjȚCbYVȪ3^sq[U}>i׉,t+#u."~3eWg֧*3yU/^3AxMIXqUy^oAekM„YcFkؙ$.ш1 N ZiI 0KJM nݽ:t?zo_0e{/˿/^| |uMo?w]~ ~+sog Щ냯~s_q6PkW_i^Ul4KDؼ|RiXbJ UgP\f(-EvWhرv]撻8hlU& *ypm;\o^smZ >׸rU%"ìSϟc;[۩#ioGM({*{5 y|_|(Y;kO~>kߞ>}C3p򍈞{c+#9nrv1+ՆgK7zPp¨R*\ &Zii?+^ /(T|UP:IfDmZIΉtkt.J&4KUv76xnPPLv "EIΔY[0'I's( 3܎(҄f4ɊJXK$bFh7 O/ SA_87L[TZʹ y#"bz?vIO/Ɵ<1}_?yS}Jtg:|LgbsJy]s?S--k;j. +]vZdFQ-TϞ7IYEyݲŔenm73d+^ Ds) qj8>;=m٪޾Eóނ͛S?cKӻ_?=EdB94؞ߖxn~4%NN'-$uyRoN :đˋmݽI8&GhMw׃EdR>(TrG;$%R`(\U9]' -)nj2 +6Wy(HxO]7L4w+)W_&#IǼײݶɓLFKZiۻ CNCk}vE,D/_} ?N_ooso{_E'Wut\t͓j*9^mfwnzb@qx‡sY8ۦ"rs DK/>xpc큁C~7 :6^"Ͻqg!xC +N6+pJr N#u!ӧ>C"bObѝ%=bQ/f}M^Ay9p2lA/;rpHO]W->'s~[\ߋ\ onͷ+(UithyVDghQ6WhƍZܚ;jZb)LR%8AV!AMv3/w/$)N6Q// cʕΡ5~F^dATTq*xɠJ7ܘ{aꆽ㒺$2Nkkk;cG* tsv?#XeX Xq:em5%ZP0uT"ݹ1V,eTp*:ənI#%}^{F\R9m#ɳSaZqco moֳ70q\9[IieX _tDe t9э8͟tZtHdOK5'QKl.OWOepx'L2e_'+. 洽.G%x&Uiy(jLVT)o*N)BR^ҟk(Lp\^kw^ +W6F"6J 2L=9-?ٱxܹ"I7k5 oQ-kP+8nLIR>>g6sv#)ܿ#7 +>7*oG9!@o` ?` %GߘCO7V,E[8˺˼W;C x !"*nXnm%xPUQ/jKj63縉/~lWK_HZ}u #=رQkF|#R%QS+ײLU⸉ew?#XeXoDlDҭTI0{ V,R,;ͬ4+2?,~3)tI1uYiJ4 +Ǖ3]RFa"8i[\p,s}Jl`rvzf>jF*~3+BRpdV<9/J Fh8S%Ξ܃Ew㛣M&ꜷ5(~3)͙8.Ep겒yiX%e5P(LSvd~L|~;ô3z Iie{\'(.(@DTUBaBS`*UZ9**e]ϹuU"2FH9j.ӊ0!3Ps`N~^zw=00Tw(8¯&@&D48us1 m-ߨS+ͽ~gF +8=FS/ Cߺ+J+<\R={CH=>}%][[O׃uNXvAl!;GطIOޭQ +nlcզsk-ݴ궩fa]iw0<!Cp,TnggKαy}ib$dcқt{3g$~)W}ӿ +@WxY&+Mر&p9˺~t{/TRwk$qXnG~V⪮_[G}ƽѺ2ct!'QYPۃ AFï]. #^l?~'U}״u^'}gY0hF ϾapⓟcgڼzUe-""VOEYݼ8bySwuQ;63ۦ2ZpܶiQTsì>q0;<#ٟսl:8/s/ +-kdV{zE_tȮ~|{.s/?K?ľULA!""g(sdf<.T)_PBd&emf|Y=/ K87qjݦ[Uz0N0Z]mZD*;|O5\d?kdS,!A1Zdy>xR6V+y$"ٽliT:c_㯈Uh~2 1SzW>ԝcS3pC{ZxP%[ŊSڭAdoZAwկp2chQ?BuƑF8ͥxquAu8iĊN9  olV*-͎qgםaʍ-XvTZ>_6}WO9ݗ~WkgWg܆ 3y4(Lry^Ǝ$HM[aV)qvP<*9Ӝxq 9!⪞)W55gFhs "2 +"o {;G#+p\ڢ擞 {kJYLĝ4|Y_=5WF_~p{?n&T5 gO%K'"uY!)ݒ];܍}N>gڬx-nnՄ/xh7ڗO=kwG_RYiyN%^NYKTJ'5*sd0əvADZ  DDd)­dz='!*MȦ0Y0 +WUEsDZ*%{v3~0Sg9d_V/C @B$QeKYv?(6}B׳tTuJswv̙W/g^Y}9sύ'wG);/J+n>QkOsH=t{Rp !1 ? ~ؿ}oQo@@o@'Qz $;{Qz@@o@@o@@=d{ —7ɂI ? ~7 ? ~!>N6̿o@@Ɖ0юӟ=t? 8caxO "<ğNt_7O<$ y'o~CD:vg:s{OH7gے_◿'+#"> +/Width 1173 +/Height 808 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Interpolate true +/Length 2654 +>> +stream +x1 0q^ݳB+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-\?O +endstream +endobj +2242 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 1078 +/Height 310 +/ColorSpace /DeviceRGB +/BitsPerComponent 8 +/Interpolate true +/Filter /FlateDecode +/DecodeParms << +/Predictor 15 +/Columns 1078 +/Colors 3 +>> +/SMask 2243 0 R +/Length 9040 +>> +stream +xKv㸶 PR͚J5kSxf(Rvy@^zy-|(J6 8NY|Kݮ,?GxYtzjwޞ݁' R(DjE@_CxYڹ9Mϟ?QR$i~~ށ),W:DVz"iǔNkkxub`EEV]W)Px:S(̘vrplXǏ4DjLaUQJ{[=ہS@Wt:UUu\̟W!ʠpܮ.rz+N[Sl3D ^Ǹ2c!JQeYJ^D-EYJVgNsdX V*%=#Kvv.vͦ?cv~]\QEߙ;~Wi:1#vI 0y`IY)F8|~G 7gkw"'9q^֚UUUtƈajMdQtWUGc)dQ'N;t(¦Ww~o:UQL~1W* +n(_DέpD3qHgF|>IV#''کx] H|GU? #vmJJu`TUՎ~{{4Dnáͱ,_ EƑ/G1wD.Z{Ls/t:_LWF UUUe~lF?KiڡRr\.W0"x+wn\U܇ G#A,2 Q`RMa#hV˝Sf-¥ǤYGjri?.?~ܱs}4㞺75:Cvl\^ &?)ƵÀX%epE|!4 7D4Jk^#K3FCs/sU6{{k/}Ǟwxj^QnX*Qb .x{mqrM=`"X(E^[)%Gۍ~x-% ( O3o +U-mnџU3gd#"aжp (H +yJ}D/!DS1TKrD)wmb-l6͆o)}==c2 QHHɳ~}ۍVfSTm Z,Lrl7/IGnKO?OE&aenNőR uC< )`aO]΀irFARbX˷ץܤ3B:o3Ew*Mհ2,O/8YI0ljv|⍍0׿uЏ"R~+ZUIU&JMEUU^z- MͰÃ*ynᑉUE& $=IQUUi!}si[4yv}q)_UUxOx0=xxe9`v,ȘQLcgH!=~L<*&8o'\.-Y5<ߓp.2I37/~s:E.Kg=?6Rt gau9TQy~d& H7;]5h݈\MIj?s!Ygx9SFտ줨4΢ <1u2D)zCGɲ"Hd >y-Y:|wu~=iA# +A(X;K ^ë*nNHر'9v; 2tg5|z?'p|?0;1|,h+5Ws#ލF7I4 n>h߇U|şqߒI/Vͱ_b#U"-$>dkq3{Ɋץwf1^OMcaLD*aC|K'_~66T@Xqҹ+| j/p6⭥4eIhgL9})elUľy7[\vf6\o&ѵO7Ej+ev^;k>bc)ֱ߯ؒ;uUE_zE5Lޫ=ryݜBZOtcv+nX*bNfR5>yy0p09ĺ,4kT_rrQ~(\@DgAEI"ȎM#Ur[UUW~3KRXvLQDȽ@$V1H:6j"%+կmy0i-UInc 8.~𘬕m!ۇ.ǫLtF)K7+R$! +fHw)- ]"(>REz=LA1yzMOɐމBVƹ? Qlwg䉝.ΓaTK'z{{k{ě,Y +QxUCG:vK Draq{ O= ;0> \kV`ٔ~eҶlě(6u]EvM-p|0[::r>M y桰f!iv{WK.h7~L7Z1u8;8Rin>6_]7t"DutF=R89e`M*Hr۵x&>t=pUNHpf|_N}\Njq&￴c*Jड़NTm<} Q673j_[xpG>҇t"w_nO >??'eq( ⣇ffâp拄Okj.;p:Nk"a)YL4cv"h2av>߿mM}kԤhjW|e( QrŌpRVdWU¹w[XYpvXvr?ӽ}Y\Ԧ;Ʌx1m뺮*vJ@6eK]5Y<3i +47;{|kKF(/[ߊ^g,_̤,/k(DYvC|Oo\>\- Y|\[M+,ZX!4䂕oiw뉯fO2:^UU΂"Dn7/|gJZqG8֓ XUU8-بzLǮyQ%}n1yBs +?"UkXg'H24L Qh"vlf?&d7&#k՜QJ2dp~\"4/v+ey8RJ.h[X~trTU?:͔?6r)*fJS&2hO-mkQcKoNS'hl@o!<`r@|f(5_WñNvbi]'.XSo QY?iӲ,w]b3>ѫM|*Dk?fFWbX96s\{ӽFRUՏ.<&t)-ش~֝&u=6O\'~NS`t~~=hi)8٫[ B/gjEy)|牋\2ƞŸ[P4֝O'Ko?4ͦ=8x}=Nv뱞|}}KMƵ3?[l^)7+}#Í鷷Ʈ? N9?Y#UaS) f9߳FUUa[Dܽ`L{CuӋ(׊(a^S]5lNkFM43Ȗ%Jdg#\>joůXr#H_Ј(\'(nQoJ5hȤǼ];I2\MY^&+?VS$7UWx>>"n2TEIq>S&[[1 p8w!_ީ2|HX&5| ku]U LdEBJ!lg̽4lS~u;; \WDp}ѝWYgيq!J 3FʬNn>Ïvs;ҽg}CA2^ +}Y/#)-?)^> vyIyx;+\opm,b6~o"5x5?,0glrJ\.gvRgd-"(EQl6;F$zmRvd30 *ag_0SVodH)OZUUͳlNĽL4mwIOMAsxXg3\w]ؙE:NLxlb5'ԯ~}\_B^&[ CN*t:ǦxEԎM#Jڦxom0ZpP{pĴt +G1nk~؏ٚ'6]e[h^BMΪ򷾻}m$+;s)j+-R ]9\j;^>]~ /lUxm'M OB&hy]M<xp|nǔMS,f33.R*㶅؋hqd#K~-^-D[9ɛ^/5;eM}h6.2R<ATUO,E҈3%(u]HUVV (>$z4Hk/#U̢|mq6IR.agw^_.<?Բ@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(@F(Ly|>u{?0~t:=/wQ]xl.Q~Mwⓢ(n [uUUOWҏOnwz8`U==JK2Exn|2NS"xjp">u-JY2De,O`R Q'vD) (x 9D)(x%ORn +Q'zQ' Q'ڞ Q'<%Jx(6i%=Ū|^M! +! +0v]ME&6o9^O4 y|b|R)D)Fv{fڟ Q(幧 +tw Q_QJY㮏ьsO2 UULMEq\޾置|q>8! +@v]d6)7N;x{v5W}.=]g#0\5dTJ|(p8ܻ?$?~xVO('0)r}өbUYؾ퉇~ݯɭꮽ <꺎X~xSUUaO1n,^9 +%W'p84Q]`w4 B:3o<PgD6# `O(er7OfeYEJ#.6#DX0H,4ReYÝc:Ȍ(ls.6׶HXlRk;iZם9vJxL؟t:<@ {55U''[x +! +:K-zJDBԮkf`eVTkgkQ=f,7=;{ +endstream +endobj +2243 0 obj +<< +/Filter /FlateDecode +/Type /XObject +/Subtype /Image +/DecodeParms << +/Predictor 15 +/Columns 1078 +>> +/Width 1078 +/Height 310 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Interpolate true +/Length 7405 +>> +stream +xu8u + +TNT`Mb*\ +T@i*T([X֬o %Rl/мTD*/U" +'@XEBm:KUڊHݮ힔vЖR\+Y/hZ#b#qEͯD@phUnOqLGwָ͢8 '!JFs84ӋQ +tPj4KwvU@R$5]lv~ҟt6?v?#gj;kd%Љw 2y1KJ36B6'zَDg[6MĆI9uCC)^).Aq=4ŗ_ JCOR77[W#!eVϪ#MQE:|6f +?,˿O$v-pvZK 4;{_Vψn(On1pxJO[W9gcu{~_74h܍.54Mm{2TMd?O6'~^3S~Je@Gmp~=w;)n\( v?5[ ѥ6K l25Lv$niw(`uou03ܟp;cqлW+/Rv70lTTڟ}[ 4T +2r_ +oҕ*5TM?~iu;F{\Fs8lkhFF}г]po#X&71rAЋ3oН=&NsҝTgH͢6~bwoi3˟Í_.%)pkZwG81&'nqxm[;c?īKe +IqSG7~58-OpMtg0 fpR`oi+}xpL;~Rk][k ~{VvzU׶4e]ۺ= WR2RkK+lT,^ߓ<XE={0^1 %xJ-ױv[nWZ6~3d~%n#~[0&+C;5)7e!䷃f=oaY.dzÕQ0{rgalZV+e-^3ĆlB.,J?nk\D_ +u5؈QCZomabׄ+"6 +"FDĶ,!$t?-"c-hԶr *FaUwk޽]]KE~Y)"pn ؈xo +_86F]- 6c{KHFP!$_Yk[~tE-/{$ۺvUp0[ R[ՇgZ U~9(+"vE-Rx˺H?jUC-zw~G{bctA%+qVlBhDpgm֮@hW5\7Xdž,wQ_O^s$bb2tܫv앿+x›؈|eUEݡqYkw%Pe:+6Jp52\^,fCiaG WȌRmM[EoùJУѽn:(ĕP:Wl/6^J؈6%-o&Ć{~W }G}@_{\ ~f &uyO>?~Ӈ*[$Z7U s<{Q 0*s1Z5ͮ9*Ei42U0 j׌m6ZE[广Fc_e4j[g'0j`~xp솏s֨&*b7O-pon8sY1oL>'|x^fT%(sUO5 : V㾳Cfg&?0g7=8m>|~z:j:2olG&gU@dǤnPsu7 Q7I*Q/#*o/e_jŕ^lL,twl**:Ôʾ2/q D X5yZQ'[妚nW"zo[7 8@.ؠ=LKRa-QuD @~Y%mC +(}{`l&-$i| } ' +7$fBp Q)yo,:䮁Y2F{u)"vz/.s?mOWFX,kh[f ⟊eԭ]":EKÁ}"6"T ȲVĺ.,ʊH7fXVEKMl܍#/ c1HQۖFCJ('cV!$Ⱦt_GI-"ROިg Sp~ۉ yC!k^'$/^$scC$ڡd<_\t%3ccQ0I?"Z uQ}H';] Q8TRh`<"/ѣ#NSF+Tk&KT0֣1$4^DtM|*}OgR" +E_Wxn]D׆t-z&}G=} U,+s]nm_FDqE(3t>@f54) ʙFV)I gDtjq򹫚\:hoNvJ .|rLD1ԢE̎6L]0f[HݾnZ] ];y"tPLV"m_EDEZv !6}ߥ~\=^[b٭YtOG+,u$CJACA'WK^LVDdFۉa8.v I?BC3~evv2n:LevY37~ ]HaH)"[0 {HalEdo4ʬ 3 ;hW)و.6"b/eѭ."6SNR =7rQۚz#DaUi41ER#n6ܛMVKI᰻.wzkƳ4$S>?6K7ֈy,U+@ִOUAZP}k~2TU" +\xь?1z{|n!1_ K^jաiu+Cpp٨$liIN5 +7T̠0zCdOlZ[o|j^DO"jM?=8i@zοתpMUVu$T#qSHp SI`\J;u1 0f:ܙD, }샟Aawwh"oꑕƱ1[78"zê? S5!7Bg,("EkTʣ77xKOnX 7(QvJ!8KDq8^DQ]NDq"ײQY05GaDtf>A)Quk.]9y}"J#+B9ocL'j[@Dٓg(jik3d3̅kS[q4oD^DΟFDYK$WHi3k:_Y $WEd;L<9 EDS9`23ZJO19DtLX[B@EdE-""v|Q"bd3"݈(G6n~?z1=:ZNDo]!bnD$j)"u;7͆bFDe-"z?~DDR\ƊVHY\b)"v}. kZ^(y#m]{^+w0=Q{>%z<ϋZN NBx1kT*;CܔD:Vem"mN7(@m| ͧĒOaV4pT_P5zSAlv tVjr$\c2.,[L߹u=k)EDw5>m|??cKx?,K)gG8NU]6y> al|(zh\(9J_&~06>7FIy:.߯0}clk./?Zw\S^w--nDVgs(D-'q2 ƻCxt Tg^o[zVЋuUk9ƻVSwevT^'a FD0R&>ܫmV^o~,'7hvb+}=wNlh+"RV۠#FD]Gzb/DfVROqNltrg> +/SMask 2245 0 R +/Length 18073 +>> +stream +xyŝ̺։N>hfg wG<s#, Iw_Z% ##@ qV[}wdݕUYWeQU]/~@ @ @ @ @ @ @  ; Ԋ/Y9r)08$x||ӽ6B8>d`0Bky꿌1i,A*Ǻqp|Ţ!eTg1ʔxupÍsDFQJ- d]]]6Ee9+]J5R9sf +pE׳5$T#%"Ci/xD(˜-ɡje$UHĆ jko#,7{I͍bBC[wnk4O?eYt QdJ\䎦7~{k{'pJgg'a΄`s 57O'_PSt75|EwRR9FR #ggS:QϷZc!CI\onK8?6ЧJB)t”3,o!K.YK$FT'%9xffBh"WS"҄Q\؊!{$(an@R MGM{ޞʺ3pļq'gw!PTX)0eܛK5SB8ae R<7z@5EϞrw5wzOpA'tmrs ]?EIM6) κ?X73@5CsR5眳8KiP'o B8`񜵈抈i3 IR`b-K{D5#Cv 2w~s92uMG!p5 /]MC(ip$Hpaq\DZ9UF1t'tF7-)rҤૼB8b8n/#FI/a!1~[p!p 笒Q=y}"y1Z A"MN{z[^K،[?wAbh1ߒ>Cm8Lp\˂ٯyfPӔ^p!py.Q&) ,’L,/>r@a:3 B8z-j% 4ju~lpj954- Fi5LKyQws29c0ƹKWWg&Xl6@#iL˸7{z<Ն+ujyˤq\m6 eaHč2}@6'޳s{^db8gZQ*sIc&sP;x܊m7Bu;q<#BLH#;7{jq;$"n{?/>|nquSƎ)R#髮 k1rG|a#Jܾh? 5cM[+A6!ҩtۖYmmA7_$"j]h߷n}q$*m%r[Y!8ZXV_3T?K@ !@a@88cs8LUi<]pL?H]CPsHS,i<%sa,p^y 8p}sSkʹqδ*U__2i$ބC$6/_{D\"ABKX@!XH G6x60FK7[@BkbNK.]MkC5bW}$%;0Biš%#߻O)jhFoTC!$ˡ5m wſ(T-Eqk}+l8`$Rh۟յ;ܥM(vId\ wZ0wYTwT"W\x7# Ta1#@,+yVvj俲&J&Yn[YJGf٨a_Nȏi +!ih1B85A D&==)CpgJUjX@~+%u"D^wǮ.׺ߓ{ZEefV}z ^o[M4=4o%m=o,U \)H`*Ўs$+x1G@T +0ƘhB$K7>|`WFUZxK;NR.4ѓg?FTÃi;؂9TQ IaD0҆<`cmjȐTXl"'wL;dZYc*@P; '5R!\()q(k,oIF +BG;?/]AXQ-z1R򑌰@ڋ8X A8 %Y +mSa,0M̟`scI"\aeeO-E +NJշ|W!kZ*[cG(giAp%N,ɕ,yZ:Bdn®& +`$<,IBkڑ;\ƚ)kSciiC K\Q^J:B5t˅N I*Yڡ1јJpl>9 L &C&c^Pr輓.*e|p.2.krGҍD_ݯP d"3H(DLYZ;Mۃ‘\%2 }ŎOnf'V2YrϞ~~c21&C*Bq H)uz|QaaWUdSU9{y-vpp@ a`;okihP5ӦԢsޫ͸A8xiZ;OĆL4eT#|g7+4_C*5%ںH'(&EPnRӦ9}BQM2Q;L 1{TDÒ JG +Z]^54B'M:u\8&8﨏y"cJ[c=mJOIo\!T# IO0j,δÔBk^ $$L6o=& +ڀՇ~]PgN7s 0H(oq#mZr^}Bs*qo;|9`?~Wiq9ЬkaV_M{!.Q-"XH68,,[Z5^@ ooi'LvpkWsP_=`=Nm2u>@6PtjX@~+E[5;FO9iI*i> ԃvWiⱍ79Zt6wrVK$RҶL;[\媡1cɧ(j}hG79S#^\dWo|Ras-@;ܴc=, QqmNzFzRô]ƙVt.c_}ޖE&z|r<T#vƴ;3)SRڑN;ЃqSWm\tG<ۅVG{-@RA೭\+_5rFѧO;;̟ڡ>gc/U < E)ӭ_SeP ֪F[c' (v(,>q80'GOh,t@pF5 &S 3O8!JOȂsO>&;"-A$,#$hȿE/FkUZFc@E;>WxH8 mnzt8?P[̿3J*/Q Pù'1gQ~II*/-䮑)Kq,pt_UÊzcΙq>!(O;RKZ< ezŅNwWxN88NHpߡ7>|vTS P |Ό%s{X;80FF~q]^mVd{J݁PC,R ?CګyY O +GAz:rUP'R煃!Js2|u8Qဂ8+@ CFٓ2:H(52Fķx{p@ +*(ujX>Yb D:kyMFU[tnjXk6t;?iyNh Q~־)&O;YUmawP ض ɬMϏƆc~ +q0m`LNvvkSJJqCUwvC5|L>HGϬ[p}gĕd\~U1§%rhAm$ǃkIm2%wiegv#sy͋`Ƿ.U 8p qu^lL3T ׬J5'bNzΡD3[٢+^LʥO,[}s'T#tj@'̜0zʴapA\QO[I8 o}!78@Lj_MFϘht\ vN51a'Tiz:*12\}_ +'ThQs WP;B^3@M9~[!I{DN;'kTM_1to!͂Փc톫*+)B82\qIn;og>ejm l8kyc4;U:cs֛8YR ;60UOתa`*fiNѫ2:0<vzĪz# ^MO0U'ʡ+ YY>Kf=p/B8zk*Sj0l-R r^tʤ,VDr#C+nƎG +Q R 3H߬(憺!\wڔ=,RJ5а3QDNVc(BRV;(SG bCy ( sjTQ;B519}ڹMƔvoѢD* lCG)hb$W;\yRX*LN;%cY鎓ڡ{}{jx!e5z͓tJJ5X9)SlonWYl +M=gfQ+9E 'kT樭jhmFNk\g~nR S|0C O;LcB5*nإ:qc&h2B!.S/ <>a愎㢉߬nCQ^!L%^,jm{TØeW*s'Sg, x!;w57Q)'if[L5̪5ǨjTX*B( VCGy杻\nm,KXt7.֪jTQ;Bc JN# sDd0F$(ԨW(e)mtd cDaX +ʑ|Ł= +5pDJi6Fy$"M=y (‹!$F0&!zW3@N5QH-UCCr9sKf(ʂKH!a %"o W3Z5*|UC+Nlws!C/~<(aˆ v0䵸T?гL!RiU8d$`mjف0ƚv 2 2o} +֥jTRHq1qϭ4׈8:0|ل1J2!M/k1,ض[xֶ,U _c,W h<%kJ`/B8r;ֶ|,I0B#hrh8U|%S,P 0ÿ^6"# *%$@[0ִ0FR@|y.ٶ*_F540ƭVEG.YP!^BD{0Nh冏|@o^]>dEFW2ULxyV޺D‘dՈE4'GJd9 7Z'vIU%^1Q2CFK*!I#7@ H"2wA  Tf0Pi-[' HBHh1&L>ޤREFf}/PV޲ޅ}(@m蒞0iAT6of֏jcdZ~Jj j@] ܹO2T$-h{{?L7Op\5 Rraw`ɸljrIhQ2@U:BVA%- ,~c%cTjh:ң8 D#;pѯK4Q_!YW\c0I +Ǣ٫1 -JN%V9 GtkA6P ]@H"'GՒBU,YZ+EX"B[wMUN5*o*T ?IUFi'B"M~/'f/8W;k ZA-KMoZ5J6Z`)Qj<$xVK8^ZqEaNH. EٶgT(ZuB5BY s +Wp޹RrVF*8}}~0|[)FH+ok +*ŗ¡{AxbSWCh;)rx>T6_j+ A$}+ *‡xAŗpjBPjU讠Jq,7ٶcfڬȿ' Xz:a >8|XaK(AYڬS4>l5&H`S'sg.zDƒ}D[;_UR;UdĂŪALH`O(k^ Ej|5Bn űm`EW `{|25 <' ts?C M5s87oX@ʥ8}nn+L0_TJRI˨b80m@s8W:Xzy 8qnU*Ϋ1iiT.gyg21"aAz}ATVȗ5T AUC53KZ54$DZ""Uz-phá@3:ejP7wciX ~wHn1VNHUacQ 鵖/$C b1+1N1ƣ[&2e8S#,~=;@[c +V5#O5406Uۺ +GNq㜍mІLH@jjTNC!9x׬r3(ضC䬾ңgh Uݶ ʌ8G5xQc}+ ‘|DG5O}+fb8#ET&xW]9kTC;lku0Sp+S86lroeA%$ EٳRmTfjթFrc-{ +<'Aikt85hov;~mUäRr'VV^#ܰk=)8g@C[8;fvdr/vɯj)(Ң1QX +{KEÇü$esitDU yڼ2 mpl(Y^)WFEf^k{+‘ jg3>u+FKFDK'JRC1cMV5jB #$]׽\mOuWH_|a*ڣh. N\YeT۶+h3ըu)O欣iČ~Y8ڼѭdtoՓYA c")4zu3nB($,_=rH_S8Siil(t߬A}fm`7ݵLoPN(uڨF  /Y_IW [/Oh ;5+I8޿:;@Ł_CժsUP HM ,ߚIW=oou{(GJ.B52- 0Cg+S#BNwf2)aIP|yӯ}jI/L +T=SevNda%lnmt!1`mIB0Na`)(Gv~A$8\pxe&kjy>]!)K,GI=g2U&햣_Iq}w[>5S WN0 ^\^x]>H_SaJ9Ei=8V4@8&X޺ODTv-Uʦj[TalqIVkZpI.fHPQ/f)yzP Hp䬗O:S`A |bpbxT<51ըb[CX vp_+_;'sr#9)!8?4 8?JзM5!|)!?FpJ8 +sJ1 f2!}fsWļ_U (7"V\[6s5pPKsd%R (S?UӼЛ +k+԰S5ݬnRMSA 2 +面RE;E |aÒ7SF- +?gjTܝ +R(|jCӅ8,08d%cǴNky5?guu?~dFRjVQc=Y Ǫs6x&+**Kz$7lsOJ4uox[B'wT@1mS<(S~ˌ^x|@nFeTy*lt4OH"Z +Ozꩧךy 5^R;FE^k5W\W'5bܡ<F[Hl +ι&xr2J!&5\JN[#U)|j=w*Y@|0Y*7eS4[1m&| Ɍ (=w#psJ¸vY5 +Uc;nGGzmithou#IzZbspj;]F)aڍ/{X|K7SGVtյC٧2&U**L^ؚWT'wjhtw}%RK5jTUzu09iwU(q222 U#)?:bUΎ߰{ٳWYD(UFԭ{XH')2|YQ/_BkqlS߬?z&T&m+Hy~๱D&=:OSÒQmrQRL)a'w3ytÒ(j|QBnS ʝeo%h$LB&],b<d`~ 4a9PXNw4=-OO,SMQB5*9BEŽյu-"ݧf\1Z-& fmKH5+VwJmCfl îJA!!qp@jmK4>IbB<%OZ}PbH'MmQIk.'d?;Z}uo/o͓5JkjCB594U36M.- ʝNwdlIJ (I/ V@GWU͛|hlIbбU/-r.ߔۭ:8Bѷ6UV¡ G0I1Wџjp&l@ʮ]eUg{5j3SoQ 8 j@1a\8眧q3Y:9dI8j)ji7wXA8I }"7|Y7r FAM88*##I\;{fxUf  ()SiP_0/3GU@gD쯢MCeA)>իИ;sl4Kʔ7o)ВwBr$%^UCj\^BSS#~vy]`U>ΨxC gMe)PSHC +rU'#Tk%ɸ[J,T=-(jW5Wȯݓ{,W p6IoB'h=OU[6TkPu^2jL=6p䍑?h߷J6 /^-KA#n Le^iCWnjjMZF~ Ӯ ++U%g~8<ܕ=' eL-21UUc;jTͫ/%3k(UL*~5(Gi5U #i`,k +G㟭 B'VrכCwo-A0Uf{0Y>0tRm<䝰P]FU*ӷAbC`7ߴ{jrG5J[Y zx؄pJգxaCC"D 7$UL1gGӆ~M9gQvɎ[{@^-8 +ժ@Qg,G8D; j<'Y:pISE+3M8@B8S)Jt$60L՛ Ux_W^yxP%=ɁRKgMӌ#oq"YH*:_"!ROx0JchJLߍܰu,i\!8oPQۥq$gmE5>5hEBgN?MʗD6 8Wi1a!pC102o;B<%}pum]U0cQ(4uB10#ÇPWׅNN @ @ @ @ @ @ @ K?qEL +endstream +endobj +2245 0 obj +<< +/Filter /FlateDecode +/Type /XObject +/Subtype /Image +/DecodeParms << +/Predictor 15 +/Columns 360 +>> +/Width 360 +/Height 360 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Interpolate true +/Length 4849 +>> +stream +xixTEǫ; `"8 *h lB$4 yp$," AeGq >Bd(Iv}:TW:U%BP( +BP( +BP8^^EnOBWjnLrmvBŜ((RS(tQzR)WǽtRWq -kT:KnB>uj +~tR_g)f>C* +-J2y;]ըqi]:Ky&őlP4.ҩ2ZnoB:KyzPA{snPg)S}FFTZ qte枛PC;swu36BHȒd>tED&KUl=)|1Еj0!u5 t5%X:Yt&?M~ζB(ÇʶBaEY4L-c"%BQ/\PvglOQ)ny0#SMB" R4B&BMzN }}b=M{%ޱ'l6j4v=kfb͢K4mD +B'c87bDBoM/aY?/f^B3%M_w,[=6~ /oR_:ׄ3v: 2&N$6H5 ydWk7uOd +~l + z_ʞ\gOdFYay{F)K_:^֚a`̔L@[- N9+n[3H%q @L78A䫅ױk$Ɛ|]#hVNc? (|m%^PܔKG]9}{W>0ftFNr<}J/d'9([Zvw1{52 +|AD&<[אѺ'BGw7oe_Dt+\ +2{pD'>WN~d?h.ۅЄ]K?D 4q)8q 7A)M@:,~bAgn`R;z4B-ۏ0z2{I[B[>pA BDD r[{$VE,@@ܳ^f6==thl)?䥄ZПv)9606Y!ěShķt+B]x +~Æ;ʟX<ŋ+eI"NO0o\9򕿜J*O?bqun˾ :9|a[|džL%t/BȩF)| #:ƪk4k=A{R4%.O{]+>f+h ?0P1ze=K ZC$.[3sͦ4::֋ ܚz-cRQ'b/$8|d+}jgiWO p4{n?u{Gf,pt1gT cwݯK}h +|lG;뛘-N< 2v\kGu>ywpX3,M}J8O/Y lfG?mx~HP#ݠ4e4ॠ^Jی :2;!tyYKh>rl(M*tf*]zjl)cc(Ʌ9ܛ|w;12Cڼ? R $9zcŲo8AlE ʩVFUopci ^6+Og r G8xw#}Y,É苬 ^.b{X_}T>k/fLlh~raTo&_a ;[X*4Xbu*iBeBCUtyOC(N1'3]Mop4acц\gdZ& Q*K靇u>s~J\z Q#HD#+fyUp5eglwdwW,jmPoEԵjv qVts6L1Mȧ$vLC=~7 Q(IC>5WEp >AmhvUKH.G\E.%$yt%z$"jGêFubStpjةUܑ"~RNPeGIOGlכ 2_,:l]ibʬ#QRO;_2lԥ%"lx0$sdL lŽ[fuiWg'u fà MguI@ +TJ UxUk)*Ц~>*5z ? W +CQ `C +6ta9`C-鬂  ,/Ta3ݜUa{mqQaz Ta /`s ꬂ DYi欂 4V*ذ]3 +u=C 3p|Ik2x٘,y7Aw%BP( +BP( +BP-X]s +endstream +endobj +2246 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 614 +/Height 614 +/ColorSpace /DeviceRGB +/BitsPerComponent 8 +/Interpolate true +/Filter /FlateDecode +/DecodeParms << +/Predictor 15 +/Columns 614 +/Colors 3 +>> +/SMask 2247 0 R +/Length 26290 +>> +stream +xw\y/=SWj@ $ǹ 67CPDu хؾ8u%682 li6 z>l^)!Ξ9v4y@ƺoll<)ORXi inXiwP-L|>Z1 Ers234LifL׏w/ePULtޡ(B>nqUzV@d~OQaF7e\/  ",*VQU_yxu#}Yif65UDTYD|M6_'Ej$t~D&Ե?=jƣPb|X1+u[&`ccgoSl_Cs%LqM&Q%Ad@GǎEz,ˆv𲺑ID=./9WGWx!?C7]G&W2 |/3EU5޸⼪>"<~l̜]dQӬy(0s\3izjV01uYcW ^[8ړdf澉@d6JnS/]/ V!0 mdr"mݷvɬȤAa#lY}  '/~~ .۶ܽb3n<2;N=+0Ldžcoeݵ"S=kyUndE).o(w0%c ,*"\i֝Ry*̙8޲PdfNluC/?"%Gh,ϳw]@>'DD,nۡ5T@kc`h8O]m~YN /;N{B?.iI 2e21[j3A2Tm<מ"q<~bJYx\0LAanW_ut]~")JxL21S\3F"_gD&@(I'LRlLf"nu"s4=F}s.tB;esG/Se[4~y ̒)7N2I=JLDs7LЍwN >4pX`dRzܬȜ0hB:du:3"kvhyiI)MDf)TÌ$ZlZNi/'Dd2O Df(57Ȭ.e4_fw-5YN4{BdVaʨf^vRuh%| v`kp</*‹/'dD&1ʜVr2S!230sL3'.s}W[?ΑU(55KLe"2Dq͌{N=B)"lsF)L1QU}dK =;pބrV/2yT ݌$]wjL0$GH,Ɵ̷tL?2{ɻl'xjl9qorüsW&o]:Y”2ЇiW:B!~ǵ:$\Cʗw9q/"Lq>'#~Addh"ʗBBd@Nx5{ǖzpg-sɦvLm7]4"uRD) N#2zة2ښBdz +%4#SCo\Q{LGzUq }ޯMwD&X#?+LUdBdzYB7cqmDON9 nvbwPw@S/{9p*=F`O#]M} +ⴿ 2'eqKq̓]; g]1WI]nSmMY XJ D'8I':<59U/qpt3ܧiܙQfN0t SrLϻ_Pmx4hwLʖL1<.*{'rώ,0Q Sj +vЁc\],}DMOz>'h@w͔ +8ĺ{vjl0Fwe@ >M%@ +!9pN:ZP]u]-k"O(GyN7ܧDYdy&o-~'R@:|mS7FP؅w`u={HB)ʼ/P_*"bȽ;L7xҡLiG}&EoȷMͪwY?0ppO7@|tɵ"`t]@}bngm~ >v: [>6z[W"R|lԀXg=-, Cduw4 } As:i#2`҅Tɴ>cئk +(:Z}n2OLKnk N hTWSOt3` tϓX~Eno~3 nNH@mm?#w¨n4,8sl{`A>"mb(.|g ^%W /iPDDdxGyN"&dD&}L(ֆ. 6`"&@Z +xwD8?">#Dh`ua!01 -81S0ozAC^TexywH$ŘSi_O7l;d8 Q&'|g0p߽CK(>yS20p-!YYᨦw 2;]"@dϺhP{1@X&\Xd,@!2dϚU)LGB ʾ'"v,)_">|NЅXi5N;;rPz J + |^pli tk7?nwYgЦ$:8Fu];Lkie8R(tl2_8F +y!/ ,+B#/.3q3!2cw bNLЬNϜ@C>l{jNL8ҍ2v3*6;w +`7?G$MIKE"k7=LAd\n~Up @M w!. P;kCOG:f%IYi8o; P+ +m}~wP'nƓ]o; (4/+p,V:!2;K]T P]#b}< PEka&| LjYsA%$BD/<L+ |s0̺qFv.2;p-βsndm`2q h09<LJa Ps6?/f Ps7=GL2dL(9+L9i/Vu~S b!4D&TdTeW̮y警.Qe{^pPo +K $Տ+滄 --g-kιk"%&VVS :e;_Ӏ}} =o?,Xo'p +vp̞c NkñLOXf?qVB(-+/8mUOy,3!/xyIl9 Fl+IJ 9ʳXoⴿeNoS(y-( j}[Aퟺ$ #N׍cCvWՓ2ˬS;IތSmS&f'w6'xX-'f>:K"Rhjm[g7bEU(2W}-I]"0w#+]xO9 NT맟W0?B;*m= O Bg0pך(-NeWn'ZolF\B5$tĸR)Dԥcپ-"[| ?]mXULV!/d~" +>)Р,:mqO>iw-pVvfPzK.J}tO""Iz,{vbTMk2O +j$tE( --˗߷~'iW3r`1fhy >|qoh蚷1sEvSc",7)90xmAbt, ]K < +{XL3~K(ĝGLǗZnR47EUcЈx3va# +64Y7ݵT[^keJV>jW8odK~Z"8ZiF])WURK'kҊj1829P +c|B{^psvbnNC)x\#`w-Y~Ƚ;YsN}=Oow9[I1f8"vAgXLcn"ֹߟߴ29%X## %xK syw]K +@JNZTD2/{vuO+ {_龯~ZgKq"5 +馌; ޤ` K)>cݯ.k)yۅc1܄$ts(&Pc"$Va OݵGWܶLċ’ݱ] b:g]݅dc}IL!s󀑚P!y83evH'.cUOQ;g-ZNBۛ>% +&^jǷ|B~)D~?R -ɼk"աLH +Ȥ8,p,FH~l] Ե1`vLL{7>}}f +/J Sp8姟%V^0+ճ(S6lxyS,HItsƤSMd]S 9ևBʇj^2_SGϩ^uU_I{'ɂ +I*6iqKʼ;cTŏL0Ӥ,߻,\>c--Kgg=bjwzTLfaj[3(Cwg;1:z秬 "^=6BTpAl)Dqh>yد2=#X'.,`jzOute"&iWNh#3o$“IZ "M95<&g?%7%Ҷۯy]q?$-q8g,8_78Oޕ<)797W=8w*5y/&D%fXIuRʰk`w-Yy1ME  se7|OLJW3ȼ?&AR> cp%vR]Bk?X ?r"7̟) \ I`4yKDgdYAUĄlhh/r7<'hGm&,,G'|90 )["!xt&iϸAd2YHtuIZ3L9'BjL(f9V !q')hn8^hm_$yp9$dYI҆7S?k=TCǣu1}J_Yx+p+]7'mo)BˣgNWfҷ(pf~phMQǮZ(3JeNxz +s]ˣe|Rg()iN:8p6Ð<ﻸ<˶*kz3k[#m'Gu==JZ%& .ضK.6ezFɣ :A`UB]bdai)c#v%Ly&*C2EURy Sgi$^&M>@0Q +iwrZ3M9Ƿ|BQg PoQ^>NLj"-35)4a^92uf^+*sN8Q"Ai&BS^~k{x#>YJ>!Y&ioL}wr4TiBş9'(9fiCy dE1лBJ,2i~R#DɥA)[ 7IӷnN}|f# ؖ]`e.I'Įk;)~]BmsYǑM1$M:s9f杹NzJ$m}͆ u̥%\1Is.Xb9vyk.g< ix1N3Iښ#q3LzEI~}j=eCTIM0I[k!Gy u>[-5C'uΧYsJZLZ9d,ԑLx*t|}:c)["2e 7NMN&%&f&˔VMSmo&|>S1IݙIڤmSdNNpQ'ioa|90M /5i-HwcI#(6ByGf'Y6LCz'JJ U SF]+aUeN 1֬ BEԵoI2sHL2W&,;)ff҅ð6U7KҊ٬޿nMO#IZ$mig 5HQؿ7[I@T%^u%'i ^n^)49Ĭgjb6מ-ݧN O$'in`6ˑDy Ɔ>{=uIڔۥL&+i+Òex] 6[r>ŏ+l i9~WRFJH[d@DD4vXffhzM TE)jzfQU{ v523VDfiޥ wL>8!8];?){KyO;6QiJǂY/ip3k=/0%u2=QV%?JsSVf&HZ4TJڴrL$6(M9M /$"!v_Yx= 6z/PrYK%LfbnScc2XΚiZ;"RiAIp'iMQ8~%vR01ΘMڕ|Eg p6ˬu U7ΊL"uYRPϩ]6IK.KM&F\~kp%.->߱AU: '5Jd$mjOJqMAĬg8nbvU4ի/,^"J-<3IVM:nc?/g9F8  i%#3)2N IrL[ڣrqf"8.N{|0nküb,R#b m14GZ(s6UzOڤܢ,QfNJMɜP#|l NN;`X miiCD+iSM^ms6ΩGMKF >i-RFڑ- /$wW $RA]ibJI_nsj%mp%mZjf_[;.GbƉmx>~~ +Pip R'iֺ+} +2=e_OqmCeC4z^"[p!ZoA,Y6}W4/d'PUGu +u#JepXœmrMnRއdC b)Ǣ1%@Wfz0szi2R'is&e32&ig?)XVI,4׍1`Mh2/`WҠ%φfܦEJ;S)9Ƿ4ĬgO!Bn5XN)~9%d9Ќ&AeOϧI,;L4%<DD熕}ꗠ>]J>"mRTIZfNoAy `3oNbv/e֋C0u>@j+i0I+%4zYl?[a PRjMStS&^p/W\ )cz$Mdf=_L*~IiCܲ^8,*& ֢X;VnW%f : #5Ju6Jڔ)\-^%I M?RYDgxA~{_& 3ueKtn֕)S4AIZ;I2(d0" ؃C^8#nU+Ы.9555>_$C.j8˙PO:o93.$&*xMNz Sp3?fbf1U;?gjɟ/i}]%ɔ;R¡rڤ|G7MSɯϒp L/^HbYׄB] h)(O& 7ӕ5IˬƐ#/\"^w 8Y皻hr +48IKNJ昮~#p:<_  {,iEƓ)qu˒ QgI>,٬wBEԵB<5ݚVvI%%I 1'u;ʜYYyz> ]%\6vrK쯣oI&0~跨tp U0w)hoK>@Q]`2V vƵ:E(4OBZI'7 s,A^ZG&yEsDZ "j٧?.ˡʹIm$Lhb?U$"z"`-v%Qzj}7&ԣ!=k"s }pg uK%7IK6Iɯc2#Il_K`Bl]F@J6%LhꡑEAUc #5B(F,ZBʙۙ8sAD&"jń@2fMӌ,]0 2SX)"2O"OIc(  "! K6 FE ' %)c6 6SkV02 g7SezF8@I 24eZNOV-EiimqkJ!2ilNX OFzOkGv2W1I R OLB"=Lg$N^ĩ̂ bQKwujwu}tl<~Evp +,x.YRf|rH[3}+uiC|SE[jw!Pω3]OHsL*/Ӷn4a=lu>Eimk}+"u {R!E$e) +HC O B4669{iuut,s]hёy#OH?s[c@iRkQS:2E݅@UXgQ+lyI3keprm 2fOn?xkni՗i:8Z]D˟ĂyԩI4IQP)E46ŭ7m9ڧ(cv?S3%LM"'. 6;v < ~g.#qA),̗͟F''-Vuvv~F] rd.eN]MȟҠS"\yn'N]1a)߅\g-O]2SOb$u/b~OiF#w2?ӑz@q?RV9L=U LC|m=)\җsT9RSFؑ?3Ei?] x,24K)V2ɿ?N# LC=!ӽƟ] +@бPha<≟)H(&ߛ'sٓ?VF{ (OD?jw!P \{ kS2Ϥf.,O'Ng]Lڃ@wIZx!2熞>5Wdf[ڙ3F=csfJ̎Iߝح=#DCCpNz\r/]%wf@wh3)'nhq: 5_P~GYr<4n.t<6OjZ6[p[R'F'v#ASW鏾ew-uőhH:8))f%QɩIR3M="DCCci7z{D˒$/|-=PjlNj=PKl1hAaҔxdΏ]de.iTvfy3clNjb*8{+ZJD{`2WG {E'[ O]O}$>HNJI !߱k2EϢP$)(큊LM"=J#M-=]b%-@Xf( z. Q*'̀wDE݋̉x|ݵez{evΏKJu,ḱ&keU6ƚb!gڛG 2ѷǫS +f@ :TL.%t}2&[@OqzdmGs儜Yp3^]O2i\9}ğLkLpMk8:2^t@V eɲ;/&5 ]chE[f ] 8w9VL႗\ ˶Fӫ~?QU/J!1)>YJ -bٌA68; ɹ?j@.Kmt0s2eL?EH4Wp@{Z'TT#5EѩYqͤdWE^kr\dοi!ؾcSSTDj>@Hlv/݅"sO$:95i*50zF+ kno +D!(cB +ɵ$)=P@4@{=tS" h v݅xxcBk{IYǚ3- &&WVT(iaڛ`Cwq \{b +ᨼPbj?AҜm%Y=q:>Ib_Bb؜R@qY,i9fh +z@#.#_ _IYմG.Ĭg<1'%|iX}fS1eޱfSgYF4lt|jiAB464^uvhUu? 邸cRFƚhbQAI큘IQ/Ai)c>%gT` Fr5S̐=%F9&<$сh큠$Oiiiu?] {rBjj&ϔ + Sr(15%Kё|eB4Հvj7cw-P /PxLFCD9eSh' >RY}I@ &I/t^\"/NRU[ѦS'=2}IVi y2ؖ[g )ed̉6B2kqdUoe8s^\"h^R9!ǚTpS6syB)c͔ ܻMD.2b~6iB^ߒ_T1ɺlн dRL^/%'O4w哤F ~ + iƢݟ8;$E望{eI,iTZjNMlEelcd!%:zGgw-.; +"Fuoq^E&;h3krz6);IZFktb%…T"g-+] @MY}7;J#//O@otr"B95’]y[F%^|˅Nmypz.8RbIɪPݵ8Vz+fFˡ(5iO2$7DD:M<" +i*L큒RJI\ .F? !sZniw)+?zC;}1ouZ񯗽m=%wlEyV;BJǾ7\R&LzFs,.kfiOI~5K5MSIK"'nYP EQ[:Ca%-] ٷ)8|i\efFIYS -qc_Go:[HJP6!Dccì޾ /] @̾ 'W'd ţ z\Or5$%&T w_vP"pΆqYŜ|RqʹE(q͉Xf|t8.wm3:J2k"exεO!/$OFy?L5SP& C7N{|R;lHJO"eFbb5g(exkbRg]Sz dmt qX~J򒈆Oo?v$u P2A뢋ݵ坷큠ű6N.oÖ codADD 34xޏ]0lPБv9HJ&%qyDצ +}^PZrJLCvKM6=YN,"5I<;0˭,sB8~w GS\z-.y +=!k _j2 {~Mp:~9Lh= h;nApw9Wn k $2հkJ2z쏪R]w%$z*+xr8)2Γg w'MS,/MMr";tk1s+5ef4OcWk|d 3 YMbw!&mg_},u \}Y:/ָd=CXB2kj|Ώt%tɉ+Ηb>$"15no^+Z"DccsW_`%-L!"_B`<"**ّ?4 Vit݅@]Sh1Ƙ.K$L}pՔ_Ή\,)mmB~)0VH}jb.8>EijnlUݵ@=R42bfx0v2?.gEjlv +nO a3^J]aw-L8 Vmm-B(IɆ9 )[!,hnnm +a%-ԈL&ß\BluQccC] &o_.Dimj*'oY#|+|֎q TI vɤY @ݿ&a3 uwtΨKAlG2"yIDoZolƙ'`!!DS,iEkĬ1nC?+ SW`@rRBs0)oK=93AG[ |>~GF|b)7>VoUGC jhh윿:VR8zq=f6Y =t-^] X/7ބ&A`{S(lrkZKx)$al)+f=cb,5R4"uDtֳIQR vz##93KC[?;ȗ6'oZz@0t v&ڧbb6#8sl*sY`1j"uWĬgL2lHB^NiZ"DSSSg\I!N3Q-Ȕ<ضKYo?W ) vujܡd>*3ln݅8W/VЂEX2kX$1 1cK"1kI2o즏G^U._&MFG~OLjÇ#[%Ƿ38jB`0P'/PTm̦9\z `1Tklmq'@AI=/t2LqcelŠ$ )JcKK-E_pk'Y`L)G:jP),~%%}c]7cfbgf_䬫DCafSßMbx}B +G&1I)x+&f=#Lm`Y#lÙ$6]o1K,*Lbf)U5?\R.Dge& s#h K.䥝.fRG(JcSSG}BF}$ ZcffAǘuD8qt96 SMD[(3J~`3cXH1k/%Kڄ IEFff3T5{-@/肹ۣ Z9IDW}SS2?\bw!EOM!p&22'nk:II"3ʎL"kO,p ++c74!ILi#zVDgheKXZ f2IA^:L]xolh?(l:LhK.2v9~gw}445?B-ktKX,DL4ض/@'nYmDoA௾kw%PḚϺy,rf"fI^ 6y EʱLb9Kj4DXgTt,3OYj䥫p9pE(MWxݵ3pb&I)PqyR!|Not,G'GYdUi+/t2ZfIba_mw3}}01 G.QY"u.|;.>ijt*#7 ra#ffU`w)`A&WɨޯO1Ƿ +u`ֻ01 I&]hWS۷Mɑap Yq`QG'&0yr"SgLFdz.k51;+F:"c-3 y ϝx7p RMPc!kw0f&c_†D`;dv2o(SuF9{b5IFB ØYѭX %)LIFcU>!/T#+\ӽ +j덌~U`3Ic]~KUyBhL]mvduf6d=cf 7zZ#nw kdLcݗ",*]7-> +X&T?Yu\5@2V]01$ +ѷA]r{g\J 2"N _sJOzkPԩN3,Df} 9&΍>-t]! "!Y)vBnv:LqfE&5Cdzp7ƚȄ R㡵~N2pRLt:+L2v ,T"|cKLo?73 P|!R_ڃEކơ 1*_*WS he`m+MtzHSD+̇di< kjO\QOBdXNCk8 "*·a +Yx3p D&@1Mo@dTW5~_lx"Fn[%~J!2jaՁ(5t9g"Z m{IL$%m "̄O\ `H.L;ְCwUE&!27|VΆp]7(HZ?2~^$A Aud2HsbVTd+Nu-@+O@+?5:ON] +Cd8ECkH"2 `Ik^2EUWf+9utM2nj+pVѷ d2cDRqYb6cbeϋrfhlpQz15p毾.X+ױȝ +I|h".$ "_5(>x)2F4hTerҝ+&l +#MIB` PG44:( 3k1ތ_ZRF'D&@=?/!'O7BL!2TEq +bf#W"~ǹKSeNFdԵDZkdDMwsD ,LC?8Dd6OBb-@2fu.l2"xy[gIIی}7&W1Zam=e$mZEq\$K-;0#APi@f~Eiw"2 xJU1Gfgޏ +n$F#ԟ>"L}oKơM+̬kN]D&eiuU=𕹹6P[+/f9q)K9s{bg$o˔YDx3w-[hcfC>/6e@ꦵ<0|#6z%Ah6 ;`hL-}@nzY}ȜMsb#N"2z+sP,3VR?0t0 wN/saML$P_y2I.e@?STq&3?v$2||ElbYטMC\zP˄pD6K#f& L*q LZQbR2FBWKv +  +^W{RJ X_TR  w88Z-p mҁƉ/Ser&3<$9Y6>%1e:)x;w+sdjf]SzdrwARǵNS$qׇt\j̔}zyIenkbE,i~=vE Qi/v̾ȜeV4 i/ٓ"2:y)DwH04@֯/Ǽ{B̈́3fhL꘳i fi*<:ea)MiؘQ&To}lnbJ,ÇfݵT6Q7tԧ9z`|l̆a豃]icX 9 5{ZJ> e f95A2IJ"R14 i|Aa92FM` f)u-:K(j,pӫSDǚe:K҈~ݵQ&Ԕ~zM&>84՘q2Kq;=jb) -8/;pa3Cj=l3L53fbtɂ) m2k) "md&󗩑YIWn pIx&ML eu!2V BToLƬl;@Ė4 P~eݥX;kemsܮd?pf) È;5o%a \s32c,jN'_ w i>7KzJeS2pӭVcfS}W>7K bn>OVԢ1kcrkOjG[4iSN:$J9)3qI眅s|dɺENnݵT"|BXԊ,`i&Frlg]K 267U6yI #o"SJi m8rWv$("ިʋlRvB4MCcvb,{ 8[{Fz*FOI>3/cQK&U#S}72IYGڸQ&FRЏ=ݵ PD2#3mVjmΦi&b9N{XN,|fW+! KC?|o"/W +uwTBPQf敿Q&1FRF<|hR8"\۫,}Ž{eDf+eR95+2&tKd2KC7CFXxˌLzO2 ^_ +F&KG&ah#WyѝUp,\hӇMYEG=+=zܑ 3zwE/]Eלf3LQSGOʲk)=sqj7W +!2B(F\fIQ1= t9蚑,4Ddg] 2BDw3GDeg54TKԵx$qSŭ~|B|Rr٬TDY*BgeLҐȽmo%no`S2FȤ̌m +E/9]¬,MGFE; 2;_%nW&dMdtYRR&'wȖ< *OL*/2{.6tCjԞL>ܒ>[LE( V448 hSL^V@6Ef[Tcjߣ]U!2n|YH["S(ʼWA+~|L]cGN~WBI'x02{.ȉY m0"<ׅbNQ架RU(&KɦǮg-n=Cdׅv*Z3䃚Ս٧iO0UK]N۸C1PB!.Ե G3hj9{~֖O,ס1PB,ԗRxh}dvΚgeW4Tsэhc?D&Vn|{e٬l5T=KSP*l|9etiEd +} ,ijCAugAd@::5>`SZ;*/MTc؉L:"Q}HDE&ή9 z4xI:]A 2NTx4c֋ 2&BƦ +ːnjoopWPmLk =! GúL!Dc/PᅣYŎ BK 2ޭ0)4D< CKH`)H(Mͭkf<|7 2=r(DB޺,̦E#6Xy& "`Ƭol1EQ !i47jP{L !ӽ?:1/[nu2U{Vt$p=D&@>shmPQ><ɝ HJ=qow 2vWt8:F `!d ڪxU%& +endstream +endobj +2247 0 obj +<< +/Filter /FlateDecode +/Type /XObject +/Subtype /Image +/DecodeParms << +/Predictor 15 +/Columns 614 +>> +/Width 614 +/Height 614 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Interpolate true +/Length 11015 +>> +stream +xg`EM&UDAJB1:;H"EX@DH&IIPB+RJ $$ef3'mBbi_@9J&˲0c2Y疄)[&rʢ?(T-e9yu%5`U~3e, q73e,;;1e,;6qP-eqh4z/**[l??2 7w`v]] Z2Y[#.,qwb(q膥7(@U9 Kg򗡻NW=IT z [}G 4[g&cKs-ADm a?f +簗=Hv轄ɲDJ\EY R:~Lsߋ5TzP#͚wCwbU*Asg_΀ԩw ߐ+5810l}ɾǪA#ndYU5L +ܼ_ +'N匀%g.wo|˿tj~|C/ÚD.5y#_53Z=f5 kfN?}a/L$?ƚ"__!F +}ߓGXYyMҿ'i#mN~kflAG0Dʪ3& yAG0V3v[iⓈ^ !7ۥn?q#Ze$Tto`X34:T:|L|Zxd*^wgPdz_kwZedФaX3Ƽ->pԳ_A-[w;oMu!ҽ?kR# J&g3 +xHOf[:8GCUaˈ4׋;@GAHsBLM +dϕnƈlZ|7cDT\ ֌ á#͓xdo E}݌߂%݌{eMڊ :ɔ_:jU5#@GPr^L̳d9kX3JE F Mql +X3M A(X3-l +A,X3ҿ:X3դI%aj.|:xf*e_:fXhrfU:@2ML|_|7SlFX3KZa Zh5SF7o0i}fJd]:ذf +V:fY:f[:fT.A|xAÃl~X3  fnX:)`ܐF,KT)k_CGv`X3Wr~ :y`\( /Ӄ5sס# i:qlMX3gތ) \fNԋdf:Gʰf [KӦLS*[D|6r"`ď: pfṞ\Զ)&7t3R[3[FZ.@i T֬pn[B#\jAG0'U50/W4^Ԭ҆n4y4^,TԬvw/ xQlyhl4c˘QZ3Oy~^ԁ.?]D._4RxДf Su @7O "PV,*.qJ&]7,ʷp7i ,j6)ox40|Wv`v +jVze{Ma`X:yHRږG{QP49fskج|# xtY]jn-:&Ƙ +2xYZ*r֊-7ڟWιk'+*7tkpW3!IyEǷgTJNsO)\a%̄YlWFMB. +:k.t}hl~>N?c-wZ:jV0 qי}So4!tw\ԬWiBY3wDs4j:[kV+Q֨( +"Ǻ3xf-"P}Qݞ^b߀@Qb.3xf[iOUR8#N 5ӴRÖ}$YͤWgʎ7QC##oAL5rRӓ!,6^ǝ9# X)](q}.3Ӓמ-slQsxX At5+ø/fہiٵS{oj]_npw^*Pu=U8U耊ѦK? jJbyT}%b$1n +6n5o>x-@Wզeic=]eK\ +G~VOq1"U ;ygA ,m8A/ȶƧߤA+H:<ΠT:!ѝh{IƖ\3[&!H?s3 |DqkvU9ǰZJm[Y5 OZcy,zr?YF!`ԟb&!H=?%j hx`rŒPeqZS73P#X\= V;ZJ`כ}&Hסc}Þ£ Q*jt 29RNǷ}zk~NI^`Kۍ#3S^;O۶1[SCGM:?i5|Ϭ&XP_ I~L3mT8," >ɾ:Sy7NU)+.l# |y/(q,t&$ru5tO7V~,uxQy$B&5A4!.9) =}x؂k6mOTsZǣ݁޳Qr߹|p,S +UN4zRβ`UbƼEZyI>[˓zۉBHcW{qTCi(Z|HJ/njҹ +=4 n;d+/ix +u#Y05CG68^j&u7m0MͼAfZBG剃gˬ8x-uP : O;)nߜEμkhzNzxΝ ձe_!@=|D <ҰB0s/å0㔖h>B=)lpp4wt9L3J۲Z:,C|L+WoK~w2t"1:ƌ§\KIt<<"L߮#MxÁ#pNʺQ >ʕBHʤס3NjM+nz>>['BȯrX评CPY\/r 5#7[yj޷Ky[9: t׌$ښ7BkFR~by":Ǚ| ,7/  +fȋ;YlNJl +TjFِL5(ՌԳ \fͳhՌ֦8'o :hՌbbEfF6ƭa ŚoqH~@ ͚Go_z-uFM ˳ϥ rQnFc0> GVƖiDfa )c߄ ,MBYws{6w!nF~3.~(t19eES&5g`Q3kb ΋ af:';+oĦfvlx.CgW1ڲwLXՌ 7l1ÏY͈}DStlqL-$Ag05#deG)h 0`Z3SS9V4֌} 0O|5#?snWf`j5s l]O` +̚|xe3{Lp>̵-,ǪY3QmfƓ(AxljVp &ۅQtk3!1^gY0y6.,jVK +kbƠfMMxf\ $5ْL-"XZoQjjʱԶ3ߩrAg8Z֦xV/HiK(3ļmAgCb)ou0Cf֙ҿ+NqU3FͤXܑ^x/]1 +5?d[J/HU(נ3BwrD#8YzTr)f!([W3@_*{RaUk Ajzʱq.jf-ĝV"ia1 +4nJ1ȂN595F.ʿk" wV4:lC#^8+_@D[ͲmB9 +E+joS9Lk =ک8L=)49 +SjVHy9̡H0<1rF^ :ZA𝉫=9foN~95uxHI<[:7tި4+@瓕#pFMm|$+RdS/RQa2[j|'k{W9&Gq +gÄ*Χ֬\,W)x'šUuT ) jcK8(Y GFlOZct,>簐'zY'A''ے%Y3,s͊D=Tꬰv_)tsb)dYcUb(w)c9yۖfbKAPLyJT$\3:2Ԭ.ߗC.BE/i1 -ZfN{mP_oo3#&]\u/|?X?(TU~fҧx[Xr1o||ŗBz?tc<9<׫ gs Q( +=tC<Kʮ2> ]wNBӚ#h޼5jtڼDZ`SZríw';-26 +BG`Iͼ<ǥZK\\J0^O‘^D!$or; !>Sv|BZõGwtqL#dPvy$BHo{9l|}EPp38%BXnU=׿< +k>36DH9naOU/<$FhW:3!cxtT((ӟO/HX' сGؐH'>̒6o7*~:WNh:Qs؉mW0IbǻAG`AzUSJ $۪&\B +:U fCoB5|_R jqo3C*iM + 29{|$ +!kgl:&53w4!P%N^BnsRP6@jLh$k {x>?w[rZFI(1t8xI[ 3 #"݁N̏RzF:V 3jj! *Wj{EH@퇽{&R\06+W)V{N@!8ƽNo +i1yC mE(=m+&p:I=T(BqxYu~@M $65m j1/t]$Fʇmbȏ6n6+CGC"{cXn@O+xa%^=7p%%xo2˘1l]O B!dU#H;q@NvtDʇBOF&3V.sD!W8}rÞru :Z:O^b<"vFv4˃tδ5 ٱ*rd'ƹ-V3yaw++Xa z}j7?|fwE6\Ə2\&s R\q~5j{)3?}Z b~Z|Z85:xda4U68t+teO=M#Rebݢ% |;B#KWsD%sSŕУ6X"RHRyrSJnnn׾TV^2NrNu~e]nBGwۆOֳݔ3t!`ˈXďbPs]x<+,:Y:Ozfh&X[QM3>创|v : 4<]~z?D?\>=gt3L⥳^3SҸxC:5B9!YfŞQ5sV!@̙=# ̩[HkxVŠLkܵ:fY$ X3jf\$=5GBҕjҏ|7c+` +y'Z;=P5c*IO~9WX3l=%~6cEI'}X3Z i?_ +kf7O X3#T,`,yf( +tC]y;xi- "fƸ~:an:!oa rx4.g3xcp@4,xlnVq6+3Dj?.kf+#rw[.kf[̹H3c1TZt`͌Vv_I=mi/hdEɿXf˳3:5Oފ;s*. \j/k+ BAjlC<k%:Faɸg)'X2! ͒V{H&̓wR!$1$)G#,MMx -߇5T"5jܘuH(UQxTFYz橘;wqh/ҦO +Kv#>4dH|oXʡxW 8ӹį%CTHOc;:9v_L%kUML\>ysȗӖrf|: B>L +endstream +endobj +2248 0 obj +<< +/Type /XObject +/Subtype /Image +/Width 200 +/Height 200 +/ColorSpace /DeviceRGB +/BitsPerComponent 8 +/Interpolate true +/Filter /FlateDecode +/DecodeParms << +/Predictor 15 +/Columns 200 +/Colors 3 +>> +/SMask 2249 0 R +/Length 1289 +>> +stream +x˒0EQ 2vtkEw#UXu-@of/1$  ‚aA AX ,H$  ‚aA AX ,HeZ#JX[Roi˸_#e~XG[f}O֙#qhqt.,ΓaRZ=?a:hk^#SŅϝ#()-z>h;ŅȞ58)ƌ~XN)ںmŅϝ#8Λ5aIjC[8,kIᐅ} ڳ3aYw6?%UmcY}X%k[?5B'UE8' VYڋVlBnuPmBUµThߤh'V?# x;a9#*lXڄ i:/pIUOb{r\Żڋ5ᓪRedM/`0 +%Ue9ʤ笪 +s;\a 9*]X=K* *ʶHjSa$KU:'yzH28j:/U?DBXE u!fkF$OTX?PU/ ‚aA AX ,H$  ‚aA AX ,H$  ‚aA AX ,H$  ‚aA AX ,H$  ‚aA AX ,H$  ‚aA AX ,H$  ‚aA AX ,H$ Zu:k]WmB= _mcZ̲,s9+ln0ys2Ga .!B׍H^bGڋÐ^|ꒄ0Ga!/ۺg0(fe(a$/V{cgЧޞ6aEA"/)#6VE^I]ڟ5VE^om:ܟc5VE^{z?Fj:^폩Q:"&4ڸ;&pVE^u#/rV!/_ +V5/3 +V)/ V=/s V1 V%HHVe9xSHVe-.B^w>iXլ2y갪ymjyegAW&7zyo 'yuj^gEXɋ|EX|ʋ=#^b>!,H#,H$  ‚aA AX ,H$  ‚aAdo +endstream +endobj +2249 0 obj +<< +/Filter /FlateDecode +/Type /XObject +/Subtype /Image +/DecodeParms << +/Predictor 15 +/Columns 200 +>> +/Width 200 +/Height 200 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Interpolate true +/Length 1509 +>> +stream +xk\URJ\P p(.Rp-|kJ.\ nq!h#hA2RBԸLߏ{;s={6 M|z (SL2eʔ)SL2e8/Bw6wVmͯO.>R<ܾٚ_T_=SPܾiqEL ,0Wt?!0 s\.81q3 _\>Fe@$Wᇄ>0e@n4q c@0!̀Dq}$., 1@?.< !3@9. +%PX]OvΪ~Cs!Usܝ5+ȵwyx00o~:y:[}Ʋ׌mĵhCLUKv@b!.v@=.v@9]Hָz{/>$W\}Hq l !BR%k*$d\tqMJm8!w>qA5{l|A?.D=.D7.D5vWU/tx|tfZ!x\Lk; k&ўЛ qn!qi^; #פ>{wJ O%vD"clBb㐸f'ǯ֓gM鈸m NZ[ܸ[ֱܸ́auo!gP\p]pK(-qa73b>.h<.BU(( +gЀ~9O?g>6<3{^+`r`*~Cbq1˺S]eum˿CA&Ӭ>rqU~C>48x 7uQ}UFVTFFTL>EW֡KxUv" ~]4{&#l, ӊpp63PFf?;`=Ьv۷GTEYNx + PQQ]/_աˁS]wz΁ gTڔTġChyw+ HhV/V1l%0,$sC'o\{<&4<[ڴU{>7t90%s#ާsΡ"".]w ] l)&sd}'n,@h8zw3t-E̋ou Jh@Q?:t!̾?˧CW12BÅȌ<}CDqwJ l\УEBuvVgB4\:'.6N7!123r[Tf͗| ')*"7fzэ'tʌ̬+Vk$40;ᆚ0B3o>͸є̌ !40 s-ʈG.6cwv@2#*FOh`qh_fVy +Nh`ݾҜQտ['^;̈<%40J|Y%20:] K!40>niRy F)~bB !|+edĴ~CGh`L.YsB", ]\'vk1032nb*"40^C ]l4"qxvWu>2c2"{Ѕ+2tpAFw ̰t6 4кmi{~dB<ZmI/]@M ̋g6tp.BM맽(&4ЮoG̙Cg%4ЮK-eQGn1Cϼs"`}BJ ̥r(&b*`B-Z kӡKu 4߰K9W: 4gR aC'[F^hK*hAU Uu lCTiߌ 4q%@K2kyy")B 9.pFF]&Qp.r5Mh 4%@*-]D 4_+ X8KCWB{#ue=CB-`]pBhed8ߒf z"eCW b6t О뮡ӄZ h, V"4А|C-LJ."4] #4Ж"jzj*ir*~CO#4МvgHh9W+>`UD~#CW$4М}j60ʢ`Z$4ТkC2**]ChEyWrHX{`B:;CU' ]OhQ/}{<_w"`}B򲩅 ̕ˇJh]ݧf_8+] ̇U 4-BtzbUTL2PBۄZwŧ ́i3:8zY̲+ Ҿ̨.( UH ̦o]\ѸWfLUU>tpF#?lfFEE ]\(1UӮdž..UXDN'}lC[\upUuRMԡ;vGV8 a]k4<2^2சN 3 PQ>l&旁^uӑkt֬DDf^9=.0,}eݾ(KSU]d-hO3䤢ʲhr#8Mhutڙ~+s[IYPyI^M8#\8ھE'y}\V9c5+[ Ӝ|cqc۟ۮw_.NTk42nfcKh콳d-/3kIa8@?ȈS}fL*jov{]veuUgU-=WDE WgFFv볋hx%40>#}>~{`x{k>jmk^"vKi_ݪ<;~1v[hDҾif1h+-Jn`܄Fly1eSM\g]Mh`*oE m>'嬺Y"1s%B|rCHh`>nj]n\&$40>k_e)CC_]qA.XfVgq#402w{_WdEʬ诿uwVZИ]`*]̬nX0+іzJ<94i{)sk) qnjJʉ^  B#A){FɅd +FAh`-vMÕ^r'sdZoݦt;Ÿ VuuFcZ711јw&\ռyBM[zy-Vዉ͐qB{ge MYN]MlZ&4ЮmY|/_7ٮN.JhQ.X6')m5h@v~jҧ+|y}F rl$4Т `ؖ\z6-hG4fZfh@s>B1US-~Vv9Bͩ>lQܔ`eN,=BmwUYКio֫|In-Bmqd +xW|yȃ-Bm)-/7L. աk Dcqc2t V<,14g C@^hӰ9&=UBM4EMޅBS iEQ۵%"h@>VgT5'mCf\߅`P }>탳<6t BH+}ӉvX[B#PlxSD j` ؖo4BhQNjG#wsdċWcxB[\m Ҙ;Z0 +-MGm\Tڠ =t1hPp^B44&'4]ۘ ]\Q doz +/8J5s2<_HkLg 4=hM%@zd 40۰A'R]gfx+YQpNBѻ͟>-?~5sش)i 4먩oZ"T&՚WW8!?4Ah ;1NkӪh&L2`,_F~6PXM܈49hEz:h@+Zr,lFBh1P 4ýH+n|zlrg3su_%f.U5)10f6}n(i8ⴏ(G>n-{=\^~Z-IׯNb`Ḣ 7T#"*gwN}lj[ԮVq^Ņ+xuGQSU|Qm + fxHVENsϜm}}:oKCÚV3vCUEBK{;bEE,x  O}UUU]?zc3UsCDosrLŐaҧ+wLt"bm9rOcWeDKw θ~Qݖ6 +~[ia}GFdD;጗|y 2>Ӭ"QUh}FUfDy_`hxtUD7bYQQΌ8u2G4/m + +t]ug֌v`X)}~yуf/-,غ `  vd"h:nqzpy^-UƬVY '402?~*lU Ͽ[ [2 sFc䆡Kk: ߯0,1xpk"zb#Z,]B{gL 4дwJ hGfاvL1Flb7' 4[54Т;g5@kthO-\6ABͩ.u ?W&$4ЖӡK`}BmI$@4d .dgv hp.Bؾ%p.BQ6VTI MhC퍴$@ӄ,24Nh r+HM2l :6XVmKet"C *X}e*F4Њm!Pk"F K\0~u:t @b_aUɿg*v 4U5 ', =xLE&4ЖQG_/h@[>k6 "77@cncTui7<SV}{ղ;r <s}LBhE: [˵h-2k3DhQY +q敡AhQGoz ["#-".@.aUi3Jh]'n^&f.@&eEf<塋Dhi_Jk7Atuh#ۜFN_`d.FcCWz )3^C8lb1~*Q/OEce]:cg/YUTʼnWX\"WKSQ\ Jٶhmå8v{.79]|2)R^]:~ƚs&40J'n^ŘЅ@h`#s\|s,cɸ3nKUCq;_SUEEJ c7Kt8*&+p̈g熮۷ fN3]vsnOJ &ÌrCt$Z[YoleqV]wyž&aUB<. 㪣gU_y*&C qͱ!l +endstream +endobj +2251 0 obj +<< +/Filter /FlateDecode +/Type /XObject +/Subtype /Image +/DecodeParms << +/Predictor 15 +/Columns 700 +>> +/Width 700 +/Height 700 +/ColorSpace /DeviceGray +/BitsPerComponent 8 +/Interpolate true +/Length 6748 +>> +stream +xyU>0!&%gQLQdҼSd֫Vv˼pLYk ") 2|}p8]YgYgg?ϳ*Զ]6+Ҙr5V.s$((N{ٷ.;WPGYO}͙5k)n~!XQu:m:uTP^33k#Nb !@yڍ:juY?tٔڌ;L! G}8)U?0\!#W#D˞VޤQt7ڊQSG큑^19Vs:BXJ!k5jVm~N!Xkݳ:B󏟮[^3SGnǝ-1_^_~3>PG:B+|yewƚ 57u=P.ޖ0P=1y+o9̐qunW<6433lluk#ZCIݛSEAy̺!6)ݳH"CF6[ufyaGq#(o0`>|$j}nhPNc~mVlӳ{KVrkxjbǗ"oPۧgqo6kz+{;.7k֌g G ;x/h=pİm.4ڢHP^39hyQ7GyDpץ1:~Moe{l5|"4-OYr^ڴNݜ_Eyu뺾MIQyꋛW^]9B\¿ԛgn+:/+–`QQ ݈fc |dKXV 9ټfRtA;(ʔ! \F1]!μAobJӼxsq5wI7Fb|ߠy- +}biF)J)x="N"$-(4Tv?ւA1񝸪lD)z>b'DJU^54߫aFݪy4<=낕)4.U6`iH!zv Z}:!r\:"KQJGrb"s%0vÏYb~r! # Z3rbQIySQOoee<άt0Nw˟9i6nC} FFG+͆Ѫ)=og~~R` Ǔ"lyG`[y  ^ qPu3;1qSmaO#l7#wlw?-=btWC<ďƮzjc׏}̸cV12P̬?D%"&a{nff׌T͸.o ˫QU]yT#GẼ%Yksβ#9$N$s+Yi0_\uw̬ڊy\3 k_S*x.$i%zr<7C$ḼMNt\ڨUH!9.o'S?m?ioyXrPoZ[] pu^ [ff́_`u33 -o)V0ć!-g׉Hfl] z:Yep[޽̬f6@ M +-uPܖ:Q0K$Dn[vU0K$D^6 ;uO +g +M3F6P\&z%y-oWg̬:@ ^˛ē͒.Z޶}haۺRX'xky9.fLF2ർԪY2Q8QXg:UkyhT035x-2uuu@}uu҈H }W`wʔw벰N`ffI|o]"ɅZIy@ްme^Q03Wⶼ/Y")`ff/~I 坡`ffs-o +ktug Bq[7ٓfoq%-OU'03Z坮m:@0~;I>{ - i|:[ [ &zsym:=>9.CI\Rg?$]ƾOLN T03oIt<%ff5+G_? ]%nVݿK!I8k7$qqlg}uc纼/)jeC/W_N`ff7>e4M0kw%q+4fXbu33 ɰ`N?QF<<ďƮzr`뇧q3I8W^So]+m?KlL-#dOA_yb?"`ʿ`zO;ȏ|9^,k>+84]_8I<2,yT'03+oeLZY/k{hQ3f}nasd9yͬ]$?;N2{΍2Z{^3{n)塑kOʣ&™UG?HyATp6 >JWͧ}:KyUExצ8xi-xnJ +Z4uty}4. 5\etׯֆMOgnju2+ MXu*~ B)Mh{Kc_yB IM8uC==B5i1hNq.np٘pcq> 5wP&G]yC^LoLWq}LQ9&%2͖ltwTE.6t' +)E 򔙛㗏6!Y]f]MKQ:fxxnagk}ƴ;M -ηnڙN }JZzk6Ͻozp Yŀ_lz?sчvl{U-@y?aCv/-|auMdPކ:wzjSܬo{&ּ5o]VH,'(*o?p@UqK\ӾW.U֬XQ@gusG4䋇=ffuΚnu(?L(W>3$4||φ- hm.E(&.Ev@yH嘰j1yMCr|TEg]o;]}t]s฼vt/HρNr;5湼f\^I)}΅~nkuCg&j'FΈמ突s{&hƝ7 kMӌS׆OR:s7+M/t跶z\x_ymCn!6 b/nݙ| +sk=@}p/•5*—u +g*GnH.GCޏ;_*wwrQ§kCwcWgՅmG/o>>xvvKU|;9Žӻ 4Lw'l>2ݽ AG +o +y'^?D}HȅEvw\7 '=VrDU:sQ1ݝP7} a OE'1 W_؂ܾSglfuOf}\mH׶CSh |qνl/u\`=폻}'>Hح-})E Pg~wձf{e<<=1UUZW׮^0?% +endstream +endobj +2252 0 obj << /Type /XObject /Subtype /Image @@ -50589,7 +52641,7 @@ endobj /Columns 1826 /Colors 3 >> -/SMask 2160 0 R +/SMask 2253 0 R /Length 88383 >> stream @@ -51185,7 +53237,7 @@ L af<u~E~9#~TY%L/Q4'&OY{&f (20rh_O?]y{h.uL)! o?<;?v/?Uh{_*AyZh#^@t/%GSŌzzk@uԫC/ivTQ6t鏍grpάX=ߗ}L.?#)gk554dK}UיL f[S;S~1q#sFƝaL endstream endobj -2160 0 obj +2253 0 obj << /Filter /FlateDecode /Type /XObject @@ -51205,7 +53257,7 @@ stream xձ03ΐ\Эs^,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@HH " Y$$d,E@:\ endstream endobj -2161 0 obj +2254 0 obj << /Type /XObject /Subtype /Image @@ -51220,7 +53272,7 @@ endobj /Columns 290 /Colors 3 >> -/SMask 2162 0 R +/SMask 2255 0 R /Length 9644 >> stream @@ -51247,7 +53299,7 @@ y? i>kjj֩S'?!oM+//5N9.Lgjfh>MQ4dW{^ooEZUH+Dͨ݉dKfh>9|X6FǘF6+++dFff74IfffȀSgP9kI.}Ѱ03IKK3Ϗ'Q'6}}}ו1_?lp\}?lEeee7$|]4e8nhhTZ<υ?/)) X&SfeeOKKS!d0gyqMMMF2:o^Jý#9.`:#hX#Es劲dVNSrf|B ?{@y28J3Xfff(('S(:F|4+//tȹnÞO @tPXX4IFFFuugtgS0F.©M9Iq'OFy ?;SaC畮x߳wҵgvϧt-z9t-ř566._\ZaҥJR￿n:+X{}LŊ*?ڵ[r9:z .XWV.\x$C[Z<1'NdO~wT` n;{B'TS&M>}1cl6 ;wޏEÑ>btdX "A'={477=#H3 endstream endobj -2162 0 obj +2255 0 obj << /Filter /FlateDecode /Type /XObject @@ -51307,7 +53359,7 @@ I % endstream endobj -2163 0 obj +2256 0 obj << /Type /XObject /Subtype /Image @@ -51322,7 +53374,7 @@ endobj /Columns 267 /Colors 3 >> -/SMask 2164 0 R +/SMask 2257 0 R /Length 14982 >> stream @@ -51394,7 +53446,7 @@ L( T UV):LsT1 `e`z!a@) ttUS$CT(0!€M߰2 endstream endobj -2164 0 obj +2257 0 obj << /Filter /FlateDecode /Type /XObject @@ -51420,7 +53472,7 @@ k X^:cy.Sߣt国3(*[png7  [1 endstream endobj -2165 0 obj +2258 0 obj << /Type /XObject /Subtype /Image @@ -51435,7 +53487,7 @@ endobj /Columns 480 /Colors 3 >> -/SMask 2166 0 R +/SMask 2259 0 R /Length 27801 >> stream @@ -51541,7 +53593,7 @@ Y!|Z 1g )8;O?G[K;@3n. Clz6nR`|\co_&Q&h(}a ] r̀ Li'D4$ЄA삮$sJLNñ)D45>G40 { TX\ Spq8/d- 4wZ{za :DC@$aB*(2O.4A3\*P@&p|fH#I HЕHÀTYH|                                                        _.~ endstream endobj -2166 0 obj +2259 0 obj << /Filter /FlateDecode /Type /XObject @@ -51603,7 +53655,7 @@ z g8H 7r+3ƐspS[LJ;=NȅwBc> -/SMask 2168 0 R +/SMask 2261 0 R /Length 314223 >> stream @@ -52770,7 +54822,7 @@ cGPP Zn endstream endobj -2168 0 obj +2261 0 obj << /Filter /FlateDecode /Type /XObject @@ -52887,7 +54939,7 @@ w A;>NhZZ"1-x,h7E endstream endobj -2169 0 obj +2262 0 obj << /Type /XObject /Subtype /Image @@ -52902,7 +54954,7 @@ endobj /Columns 3590 /Colors 3 >> -/SMask 2170 0 R +/SMask 2263 0 R /Length 364004 >> stream @@ -54262,7 +56314,7 @@ I( *߻x. 9sf2 {(wRԞ={?{3N^:ܑ$N^"I&O<0ƥ鎎}Iſ$ Dmmmmmmeee"7n\"wB8\JZ[[[[[ᠯ' }S CpAOA^݆fY(`/ (A1,c} endstream endobj -2170 0 obj +2263 0 obj << /Filter /FlateDecode /Type /XObject @@ -54287,7 +56339,7 @@ XD |l te1pؿ9p \χU~`tsbybu$-##!#3u w>|"f~nj;?>-eqxn顗BZǽC16>w \k]xΧOhuya oʗ8k˻/ϝn] endstream endobj -2171 0 obj +2264 0 obj << /Type /XObject /Subtype /Image @@ -54302,7 +56354,7 @@ endobj /Columns 3590 /Colors 3 >> -/SMask 2172 0 R +/SMask 2265 0 R /Length 680627 >> stream @@ -57132,7 +59184,7 @@ w z?6ŋ"Qދ/~%(?E endstream endobj -2172 0 obj +2265 0 obj << /Filter /FlateDecode /Type /XObject @@ -57156,7 +59208,7 @@ x X q@AAz@W,{G"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 E@"Rd @ H)2 e{Hfx=Pvܞ/=v{݋a{v^_/d=m_Rv} j;sD='_v :lr=o\ab Xh9X*@oH,@LG]3#Yk_~xΏCc.\ƶ޶cjzеqPt]Z_'ޢ98?k]}x}hgZe1sy{}> F; endstream endobj -2173 0 obj +2266 0 obj << /Type /XObject /Subtype /Image @@ -57171,7 +59223,7 @@ endobj /Columns 3590 /Colors 3 >> -/SMask 2174 0 R +/SMask 2267 0 R /Length 347639 >> stream @@ -58196,7 +60248,7 @@ pn Op8 锅 endstream endobj -2174 0 obj +2267 0 obj << /Filter /FlateDecode /Type /XObject @@ -58220,7 +60272,7 @@ XD ]k^ 7O5puyur-:>݇')_Fx.~\?w endstream endobj -2175 0 obj +2268 0 obj << /Type /XObject /Subtype /Image @@ -58235,7 +60287,7 @@ endobj /Columns 2108 /Colors 3 >> -/SMask 2176 0 R +/SMask 2269 0 R /Length 172455 >> stream @@ -58713,7 +60765,7 @@ IZ 1&ųjf,JPN_glFff㓮Ř,f؈+`#` endstream endobj -2176 0 obj +2269 0 obj << /Filter /FlateDecode /Type /XObject @@ -58743,7 +60795,7 @@ l uP=a;t] gGSj_O3xm=v%yan<[/4\؞/.)-ԟ=o˓0 endstream endobj -2177 0 obj +2270 0 obj << /Type /XObject /Subtype /Image @@ -59203,7 +61255,7 @@ Uڟ ),\Rg?JvC{lRb@*AmsLu4 endstream endobj -2178 0 obj +2271 0 obj << /Type /XObject /Subtype /Image @@ -59345,7 +61397,7 @@ NGBG 8QSFO\ sZUSyGesEj7cT_FOV#zQAީ<⵿?Qީ<G4ֱ橁SyGeRsZzP|7cT_PO4Ҵ?SLJ5<G)Ej98j?@TV#Q<Ej98j?@TV#Q<Ej98j?@TV#Q<Ej98j?@TV#Q<Ej98j?@TV#Q<MZj?*֟kfxȐ9-@ endstream endobj -2179 0 obj +2272 0 obj << /Type /XObject /Subtype /Image @@ -59709,7 +61761,7 @@ Q h-R@?JSˌE@ F8)v#E `H=Ouh*wE" cI˞EKR&HAEu)9$'QE4%OH8QEC܄M7r:.SRQMlq>p{+DC}stQH;NQH: ퟭ5zE\sLEGPң&GQQE)? endstream endobj -2180 0 obj +2273 0 obj << /Type /XObject /Subtype /Image @@ -59724,7 +61776,7 @@ endobj /Columns 100 /Colors 3 >> -/SMask 2181 0 R +/SMask 2274 0 R /Length 3917 >> stream @@ -59744,7 +61796,7 @@ x "wiNȌEFrסUUg~/tc5HDm;O-Xz%~0  "BA0m[fB)W? Cb.gQdw*q~`LsJf`P :*oW K[{i endstream endobj -2181 0 obj +2274 0 obj << /Filter /FlateDecode /Type /XObject @@ -59769,7 +61821,7 @@ f 9]Gd35 o_wX@l/7ۺae> endstream endobj -2182 0 obj +2275 0 obj << /Type /XObject /Subtype /Image @@ -59784,7 +61836,7 @@ endobj /Columns 100 /Colors 3 >> -/SMask 2183 0 R +/SMask 2276 0 R /Length 10160 >> stream @@ -59823,7 +61875,7 @@ U ߖM/#0RY5\YAo"zfHJn8t$E BReOӫD]mn~}U;v}$ ͠emq (brr2)d:q|Ҕ5^RB@OTW#(TD5[NW{w㳯hM(Eib&D "Ckݎ嵃ӱ*5P0QoaM|bZP{8͖c}a^cXՒsa}(V21jn{Ƙnʛԥi@v鏿5^>x&q m"eggǩynoNJʖx٧`'fCm,s˖R=;_k|"USM.Xĉf*&O_݅5£vfI=^ML<8TNڗ~p9kp endstream endobj -2183 0 obj +2276 0 obj << /Filter /FlateDecode /Type /XObject @@ -59845,7 +61897,7 @@ x 5gd9u ׊,H*UޑpJLj+𷘽*#C Rp*qw!Eml%?e~j!% C ,9a\G]h+1^v81B+W1/ʡ8T$~;#')Ȁq_N#ƚ=YH/#.8[Cb6 1b P,nSZ!;7 q%kH(z8 /i1vDtmKɊcD@` tBUZMm֗k iUvr&^@lYB~?Y)^hf{ps|tHgÖreUQ7tBcbNwoK1ꪀ=R| 0T1Pǽm8C' CbXaC ӈGC&L |Ug=ˀi01jgCs?#R]^FnO!ւd2l"##֙}~)Ue >2Ĵ-24-˲,3teAWsXttas4L KÃi0`MiI#nJ6OfOn%./W]` c8K~cVT&O7X4߹mWkh7TŶϞ> -/SMask 2185 0 R +/SMask 2278 0 R /Length 622269 >> stream @@ -61937,7 +63989,7 @@ Q YdׇiU'XT7=]QYdEYdEYdEYϢO>֯j-",bKSv endstream endobj -2185 0 obj +2278 0 obj << /Filter /FlateDecode /Type /XObject @@ -61957,7 +64009,7 @@ stream x1 pT~]gٯD'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" D'@<Ox" endstream endobj -2186 0 obj +2279 0 obj << /Type /XObject /Subtype /Image @@ -61972,7 +64024,7 @@ endobj /Columns 1807 /Colors 3 >> -/SMask 2187 0 R +/SMask 2280 0 R /Length 28962 >> stream @@ -62105,7 +64157,7 @@ _\ 9.6n{`a)%P7˴$$Y7}$X渲kb$ھ=h|> -/SMask 2189 0 R +/SMask 2282 0 R /Length 12198 >> stream @@ -62175,7 +64227,7 @@ J ұ0d*D+HJQ;tbeqn~bbOOUӠ t͟ƛ8n{]#&䀅03{fmCd7qޯ"n&sI4A5kjHL0XkBqxQ=hkvj$Z%Z*BeK 3m72ǽo+kf:{N^LL uj״=3۟֗X'0:E0si2,fҪ"(υGi܈q<.3er$,YOʬjy ^Kc+sn5VMHܛE/lඓd͹GLO=\L>yZ̜u\vf66}{"d#Oa͸I49{{f!Dᔟm(%HW2WZLշ0~}|4Q)3YlÎ>"?:5M vǸ%HmuZ؂Utfձ}Qoa-o0/usAS&`G!s5Ac% LkPV  SS`1%1CTؒYQ.&|%%64qԦ ,3Vl`}!)="KQ_ļجO"f,kO':*,dubYƈ/>+sr-grN˚^<ti\O'o,{'LZ& 0)P=EQ/SN |ayN $zQj{ 9;a|'Y.OM/b3 endstream endobj -2189 0 obj +2282 0 obj << /Filter /FlateDecode /Type /XObject @@ -62195,7 +64247,7 @@ stream x 0u%$= jxٚ [dklM 5A&ٚ [dklM 5A&ٚ [dklM 5A&ٚ [dk.2n; endstream endobj -2190 0 obj +2283 0 obj << /Type /XObject /Subtype /Image @@ -62210,7 +64262,7 @@ endobj /Columns 107 /Colors 3 >> -/SMask 2191 0 R +/SMask 2284 0 R /Length 2501 >> stream @@ -62225,7 +64277,7 @@ _okȘ #O. |}[[ۍ4 ;oDr.iA0OCn?eS+z endstream endobj -2191 0 obj +2284 0 obj << /Filter /FlateDecode /Type /XObject @@ -62245,7 +64297,7 @@ stream x 0gmq뭘U.r\R1 endstream endobj -2192 0 obj +2285 0 obj << /Type /XObject /Subtype /Image @@ -62260,7 +64312,7 @@ endobj /Columns 75 /Colors 3 >> -/SMask 2193 0 R +/SMask 2286 0 R /Length 1771 >> stream @@ -62272,7 +64324,7 @@ x  )x?⽛ÈՓcP @+&QʅJn$tesSTaBޓ|uR(xGޓ3PY :R7h(vG)GCbΨ*Fj(w{'41}Ox;@l=yXQs$zk,D7|ιE#\((솏~coH0)))5Tna'WP!qH`홅ɛG^.}d_Uv=%IޮgvO;Jo4ã] }]hWLW*8@GzvxԙJ6Y<¡Rg5Y9=9#A(ЪA\ʟ@0j[鴕(K +neē|YxXɭB2f&qewO endstream endobj -2193 0 obj +2286 0 obj << /Filter /FlateDecode /Type /XObject @@ -62292,7 +64344,7 @@ stream xA0>!:wr\.U0uG endstream endobj -2194 0 obj +2287 0 obj << /Type /XObject /Subtype /Image @@ -62307,7 +64359,7 @@ endobj /Columns 1303 /Colors 3 >> -/SMask 2195 0 R +/SMask 2288 0 R /Length 491902 >> stream @@ -64022,7 +66074,7 @@ BNN _i0d'p8p8뮽.%57TK&FHnnnS;vp8plDIYnp8p8$p8p8&p8p8GB4p8p8BVsp8p8YOpe endstream endobj -2195 0 obj +2288 0 obj << /Filter /FlateDecode /Type /XObject @@ -64042,7 +66094,7 @@ stream xԱ03^\Щs.ug|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||= endstream endobj -2196 0 obj +2289 0 obj << /Type /XObject /Subtype /Image @@ -64057,7 +66109,7 @@ endobj /Columns 1742 /Colors 3 >> -/SMask 2197 0 R +/SMask 2290 0 R /Length 172996 >> stream @@ -64488,7 +66540,7 @@ g%qg uRҀcO=7@^yT׼.p^V,?0Lz~j38MD_v4vmkþ%+ӥwշ&{,_^׌o}ʻ{Do I ^?(q!HoP79WfX7:3x[u2t|@[_s endstream endobj -2197 0 obj +2290 0 obj << /Filter /FlateDecode /Type /XObject @@ -64616,7 +66668,7 @@ v[t; ӺND[ Š +u~{O9]>+9xKl>'b{p:xc|~O=SDMnyw+znp:jǫ9-d1.m!Qq&;L^~د3R?p-!;?^ݷa~qJkx!H;' :Nc] endstream endobj -2198 0 obj +2291 0 obj << /Type /XObject /Subtype /Image @@ -64631,7 +66683,7 @@ endobj /Columns 33 /Colors 3 >> -/SMask 2199 0 R +/SMask 2292 0 R /Length 588 >> stream @@ -64639,7 +66691,7 @@ x ս=O\Rʃ Զ"詉ǏNM5&?L" bH((& bhl,ptJשTbni0pӶ+pC-C4ЉR_WsFÉR˗Vy-'3ĺeOTVV@wW rPPOΆCbqg߶u9ˇ$sgܜV.rVU$§yPʙ]Ӳ jw;@JOęmԓQ̶ a3jX=Z@h{'յ Q@$ϹUV+.ؾY1hfpf@Tfb'+WΆ;MOZW.\Q7 endstream endobj -2199 0 obj +2292 0 obj << /Filter /FlateDecode /Type /XObject @@ -64660,7 +66712,7 @@ x T3 endstream endobj -2200 0 obj +2293 0 obj << /Type /XObject /Subtype /Image @@ -64675,7 +66727,7 @@ endobj /Columns 176 /Colors 3 >> -/SMask 2201 0 R +/SMask 2294 0 R /Length 2907 >> stream @@ -64693,7 +66745,7 @@ H D cYר aR(XV"k CD aFODoIPswavRiw!2}>ٚ俛|~!}z= ֘/jߌBCn7-E!ZhAZ!/(U endstream endobj -2201 0 obj +2294 0 obj << /Filter /FlateDecode /Type /XObject @@ -64715,7 +66767,7 @@ k ki? endstream endobj -2202 0 obj +2295 0 obj << /Type /XObject /Subtype /Image @@ -64730,7 +66782,7 @@ endobj /Columns 720 /Colors 3 >> -/SMask 2203 0 R +/SMask 2296 0 R /Length 8063 >> stream @@ -64770,7 +66822,7 @@ P $;Y_sʓoZs0Χtk %)鈇_>0H"EÃxxĈ 58k7 UZcĦpk?6KOlߙ՜،ji3 Im8}M'EsGM_$~9%xڵma[ QҥNfBj3d%B ҚHT^V[34r0,35\R^a(ITu*MNSk^XHӐ"CJLIT\cHsF( ],o ³sf˖S׍E'}%k}.KʼndIrNU"^p8Ѽ{q]PMR̐@sQȐL%7+b1A!B썀\B;9upeX|nM oX݋8P endstream endobj -2203 0 obj +2296 0 obj << /Filter /FlateDecode /Type /XObject @@ -64790,7 +66842,7 @@ stream x 0u%$= :xФCbhR MI14)&ФCbhR MI14)&ФCbhR MI14)&ФCbhR.iG; endstream endobj -2204 0 obj +2297 0 obj << /Type /XObject /Subtype /Image @@ -64805,7 +66857,7 @@ endobj /Columns 308 /Colors 3 >> -/SMask 2205 0 R +/SMask 2298 0 R /Length 1809 >> stream @@ -64813,7 +66865,7 @@ x ''''''''''''j,a8xN7tlnfLM{N~got{e{89888888888888l9Wp*}&GCw,>hy~N.֯Cg-PJPJPJPJPJPJPJPJPJPJPJPJPVJ<\{!^/6n'}IzSŋ_d3ƶR qB)qB)qB)qB)qB)qB)qB)qB)qB)qB)qB)qB)[)wدpr߀p<'Gm%*|r%+NN(%N(%N(%N(%N(%N(%N(%N(%N(%N(%N(%N(%N(u R=QY8[7GoNNNwwɿ-ݞY 07Hs&~|ɗ .VJkۍHwRF5OLxdǏOnùh߿2^RRRRRRRRRRRRRJyLk{8=xc6vg?7[7^ '&*lJJJJJJJJJJJJJmx+e.Qxco\[)턓|0|zzN.oh:H7Hf.w쇓?{=Jpr/6 (9''''''''''''''V.5r$+enf\J9o??N N+3*Ԇ99888888888888~-|:'ekQį9oy$}- 6|Wʶ8/|Mٖi[^9RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRM?\?wp  *= endstream endobj -2205 0 obj +2298 0 obj << /Filter /FlateDecode /Type /XObject @@ -64833,7 +66885,7 @@ stream xA @g>"%{pkiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:g endstream endobj -2206 0 obj +2299 0 obj << /Type /XObject /Subtype /Image @@ -64848,7 +66900,7 @@ endobj /Columns 308 /Colors 3 >> -/SMask 2207 0 R +/SMask 2300 0 R /Length 1403 >> stream @@ -64857,7 +66909,7 @@ x w0.}7\޼.NK߅˝ǓJJJJJJJJJJJJJJ> Z ˍ!}vvn+u92?-.wҫ̓JJJJJJJJJJJJJJL'ry!x-搾e{& Y.gӟp4_겋yrB)qB)qB)qB)qB)qB)qB)qB)qB)qB)qB)qB)qB)W)[}!*emQs锧ʓJJJJJJJJJJJJO' endstream endobj -2207 0 obj +2300 0 obj << /Filter /FlateDecode /Type /XObject @@ -64878,7 +66930,7 @@ x @@(u+yG8ΣWMH {kȯsyG------------X݌ @@@@@@@@@@@@|&-------------X,?m9\פIn#Z Z Z Z Z Z Z Z Z Z Z Z|Qَrl#Z Z Z Z Z Z Z Z Z Z Z Zpdg\Ф?}I D D D D D D D D D D D Dx endstream endobj -2208 0 obj +2301 0 obj << /Type /XObject /Subtype /Image @@ -64893,14 +66945,14 @@ endobj /Columns 308 /Colors 3 >> -/SMask 2209 0 R +/SMask 2302 0 R /Length 299 >> stream x1 Om_~Y  endstream endobj -2209 0 obj +2302 0 obj << /Filter /FlateDecode /Type /XObject @@ -64921,7 +66973,7 @@ x 1U&xivA`qv&}3hhhhhhhhhhhhcu#1+dтw9&.&D D D D D D D D D D D D D D D D D D D D D D D D D D 1]-x}40ihhhhhhhhhhhh[s~äceƤ[be-s@@@@@@@@@@@@4~ 5 endstream endobj -2210 0 obj +2303 0 obj << /Type /XObject /Subtype /Image @@ -64936,14 +66988,14 @@ endobj /Columns 308 /Colors 3 >> -/SMask 2211 0 R +/SMask 2304 0 R /Length 299 >> stream x1 Om_~Y  endstream endobj -2211 0 obj +2304 0 obj << /Filter /FlateDecode /Type /XObject @@ -64964,7 +67016,7 @@ x 0@Q[YKYKFe׹ec6;-------------羶 1 endstream endobj -2212 0 obj +2305 0 obj << /Type /XObject /Subtype /Image @@ -64979,14 +67031,14 @@ endobj /Columns 308 /Colors 3 >> -/SMask 2213 0 R +/SMask 2306 0 R /Length 299 >> stream x1 Om_~Y  endstream endobj -2213 0 obj +2306 0 obj << /Filter /FlateDecode /Type /XObject @@ -65007,7 +67059,7 @@ x @@(u+yG8ΣWMH {kȯsyG------------X݌ @@@@@@@@@@@@|&-------------X,?m9\פIn#Z Z Z Z Z Z Z Z Z Z Z Z|Qَrl#Z Z Z Z Z Z Z Z Z Z Z Zpdg\Ф?}I D D D D D D D D D D D Dx endstream endobj -2214 0 obj +2307 0 obj << /Type /XObject /Subtype /Image @@ -65022,7 +67074,7 @@ endobj /Columns 165 /Colors 3 >> -/SMask 2215 0 R +/SMask 2308 0 R /Length 2190 >> stream @@ -65034,7 +67086,7 @@ qH[ r6Dgnpc*6#=*Bcfkef]π+IȪ:">sY)?,(* w2y4'{E^?@ QEVQ7Oqs@e|.-.-.-.-.-* endstream endobj -2215 0 obj +2308 0 obj << /Filter /FlateDecode /Type /XObject @@ -65054,7 +67106,7 @@ stream xA 1gc -XWZ:-NKitZ:-NKitZ:G endstream endobj -2216 0 obj +2309 0 obj << /Type /XObject /Subtype /Image @@ -65069,7 +67121,7 @@ endobj /Columns 165 /Colors 3 >> -/SMask 2217 0 R +/SMask 2310 0 R /Length 2189 >> stream @@ -65087,7 +67139,7 @@ s Ǔ= V p )]"L7OqԟP滴P滴P滴P滴P滴?+ endstream endobj -2217 0 obj +2310 0 obj << /Filter /FlateDecode /Type /XObject @@ -65107,7 +67159,7 @@ stream xA 1gc -XWZ:-NKitZ:-NKitZ:G endstream endobj -2218 0 obj +2311 0 obj << /Type /XObject /Subtype /Image @@ -65122,14 +67174,14 @@ endobj /Columns 165 /Colors 3 >> -/SMask 2219 0 R +/SMask 2312 0 R /Length 276 >> stream x F\/H2YܠΕخlfI`xހX|oBY7 f!,䛅|o[f91׭t(SK|˖޸5ߓDɟsxdwb"w^{؏&KL9߅}]fFz{;9hori^:åf5Lw)%3] G EkoBY7 f!,䛅|or? endstream endobj -2219 0 obj +2312 0 obj << /Filter /FlateDecode /Type /XObject @@ -65149,7 +67201,7 @@ stream xA 1gc -XWZ:-NKitZ:-NKitZ:G endstream endobj -2220 0 obj +2313 0 obj << /Type /XObject /Subtype /Image @@ -65164,7 +67216,7 @@ endobj /Columns 330 /Colors 3 >> -/SMask 2221 0 R +/SMask 2314 0 R /Length 2822 >> stream @@ -65179,7 +67231,7 @@ mN} dEG endstream endobj -2221 0 obj +2314 0 obj << /Filter /FlateDecode /Type /XObject @@ -65199,7 +67251,7 @@ stream xICAQ~Q"XC! ^N_EE\o>a1;aVfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ]xݰs<;b 1 endstream endobj -2222 0 obj +2315 0 obj << /Type /XObject /Subtype /Image @@ -65214,14 +67266,14 @@ endobj /Columns 330 /Colors 3 >> -/SMask 2223 0 R +/SMask 2316 0 R /Length 691 >> stream xn0eRm>yꃍl߀DnpX b7o%K!xC,X b7o%K!xC,X b7og۶^|/[`+=a۶KWūwPii{jCJɯߌmO֫jHImfwOO[?ʖt=C5/pY}YS~ދv#f84 >lGx8 Éچmߟ1kݞwUf܋zi瞭.i[/Tx=_|yG_ !ejGX8CHJ$<,jv}߫õ{Su4Ohzuƛ%5T]BT 4N!xC,X b7o%K!xC,X b7o%K!xC,X b7SN endstream endobj -2223 0 obj +2316 0 obj << /Filter /FlateDecode /Type /XObject @@ -65241,7 +67293,7 @@ stream x @@c{:VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceL endstream endobj -2224 0 obj +2317 0 obj << /Type /XObject /Subtype /Image @@ -65256,7 +67308,7 @@ endobj /Columns 101 /Colors 3 >> -/SMask 2225 0 R +/SMask 2318 0 R /Length 2503 >> stream @@ -65274,7 +67326,7 @@ z J#DBY--A=f8Z704r!VL"JDCH [!p҃x:l/JFBRBR:DLZ2"R؜/Iixp$vDV4ig/exC.h$8`CNћt?e'JtǓ_1՚ﭳHJtߺ4]#+yI;'d_JWa_ٞuxi3d=+ߡ19./ecVn졛/{7fSm endstream endobj -2225 0 obj +2318 0 obj << /Filter /FlateDecode /Type /XObject @@ -65295,7 +67347,7 @@ x &X,bX,a9\QG endstream endobj -2226 0 obj +2319 0 obj << /Type /XObject /Subtype /Image @@ -65310,14 +67362,14 @@ endobj /Columns 2020 /Colors 3 >> -/SMask 2227 0 R +/SMask 2320 0 R /Length 10241 >> stream x{u}~eA*&E 8NG.E4U)`l4v՘hh`hBo$/Hdw;dg/_s{;SA` L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z L0z LQ`0A::MB {Dy{va^w/ L0z L0z L0z L0z L0º~T߰O>}駗a+/yEy{o,ok_/ok8)Cs;y% _ryϔ_+oW޶\ gc3[wvaamXޞ{ޅ1OU(onU޶}_>_޾ەתo[ +ory/|-GyDy;eii6gTz~^rɫ۟?+o۾;&@Xab=&@Xab=&@Xab=&@Xab=&@Xaa2]>:؍ 'p FlFay;;;{[#5W{]A7ln>' .+oj|C{vry{']ͽYov?TZ>6=ΔK.)o_n۾&_@Xab=&@Xab=&@Xab=&@Xab=&@Xab=/OoөsHyiyhX޶/E N;\וW\qyymO=Uv]ڱ}gyP~O__>)ow]޶箫?`.ryecϾ}.oWVVۖϔ; 7FŰ+5W׿yY}7/o֖mV뮽ᆷ Snۺu)&@Xab=&@Xab=&@Xab=&@Xab=&@(}ui-6Ghx[l۶#-O˜o~^wiy5f\y{QG/ow]}ںm[yiy7~]Z^.oay;=]䰶T?'ߗw; ʸϣ6_X޾,oo-&/;;[~/7=엔_ۻhyWy]^Y)oO L0z L0z L0z L0z LQ`dhxVЋեޤO~/[޶ڏX_ʫ,o??*ow[߿X~÷_Ty;7tkp8,O./v<V޾mח~yq|y ./Ǭ/ove~n G7ly{˭ ۮ]_Nuox6]/^~wSrm헿_w-7nPc&_@Xab=&@Xab=&@Xab=&@Xab=&@Xab=~U=l.]e&j9{ԷSm=wG\rqya~}l+o[Ϋ]u4ԟopbM۳>=*oۘԗsRy]~v8_ Mr¦3~귖_xau^^GZ9vϞvmxpl;z L0z L0z L0z L0z LQb0SO-o7/zQy;33Sޞw޹veܗ_={-o[ɛnzwya~}n.o<_͛7~Mqyac}/^_?Xعm1;WםyQGU޶ɣ9⊷'xry{-+o:][җT~wۖ{I'ύ^rvyۦ~nL/{UW^Qn/oyvye/y;33[N Q˷zj?Uޞpo}g=vv]ezTo-oۖ* j4Y\\*oow.o.~_@Xab=&@Xab=&@Xab=&@Xab=&@Xab=O߰pX޾u]Ë533]N_~]Z^)o͛ݳv8?կzuy{'S{_}1w] x\<[??/o3Iwy{y{)yXۿ㎏6u|.{vi@ypkWm"[ߎWwz};}v_B^wmm=blyu^Z\.o~f{yu؍T>9?Ly>|n;OMٳ_xSy{z L0z L0z L0z L0z xJG ۮaG]S~]yZWB7-Ϸ[(o~^p^y;f}?/o[ޣA)y h<_GKg-o۾s 1s3m;JyTٻm?7i3۷m/o]Y3Wޮ?~ _EuK x\ohr!-c^Ty;jx] ]vvE*o"MܱmM{0z L0z L0z L0z L0z7>C/oAwd_Tܲm9m:ZnRn}pm^æ[lХ0h>9n;)mB)@ w]mk>$Fz L0z L0z L0z L0z l>OݠKOo<߆mcny7A1ߖmy'.58Q}:oo'Ԉ} }vMֵ|\y9h/a_@Xab=&@Xab=&@Xab=&@Xab=&@Xab=]˸?XG1!Rw ZM]5ܯjONUw*n:Sj~[.Uw <ϓNv&_@Xab=&@Xab=&@Xab=&@Xab=&@Xab=t}wC] jZC/ L0z L0z L0z L0z L0Fn8vuxpe=&@Xab=&@Xab=&@Xab=&@Xab=&@(}ѷ<,b~Yab=&@Xab=&@Xab=&@Xab=&@Xab=6Jct-`pe=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@Xab=&@9Y endstream endobj -2227 0 obj +2320 0 obj << /Filter /FlateDecode /Type /XObject @@ -65337,7 +67389,7 @@ stream xA 0C!YZm ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( r endstream endobj -2228 0 obj +2321 0 obj << /Type /XObject /Subtype /Image @@ -65352,14 +67404,14 @@ endobj /Columns 101 /Colors 3 >> -/SMask 2229 0 R +/SMask 2322 0 R /Length 239 >> stream xI ej*$SDJl%}ǩ) ^xO#FT鵆p Ă^a{sm+3_lWĚKD\tnT|:v!wا.{Urgp6^ZVѲ׫`ųEwG]mx/_X[L_8/_Y5Z٪t(њ7#?3 endstream endobj -2229 0 obj +2322 0 obj << /Filter /FlateDecode /Type /XObject @@ -65380,7 +67432,7 @@ x &X,bX,a9\QG endstream endobj -2230 0 obj +2323 0 obj << /Type /XObject /Subtype /Image @@ -65395,7 +67447,7 @@ endobj /Columns 202 /Colors 3 >> -/SMask 2231 0 R +/SMask 2324 0 R /Length 3532 >> stream @@ -65416,7 +67468,7 @@ c _L[.-@I]h,2 8ai=?LHۃE80jC @ @ @ @ @ @ /;; endstream endobj -2231 0 obj +2324 0 obj << /Filter /FlateDecode /Type /XObject @@ -65445,7 +67497,7 @@ fN +DBt6 H{. }W߷˧kի endstream endobj -2232 0 obj +2325 0 obj << /Type /XObject /Subtype /Image @@ -65460,7 +67512,7 @@ endobj /Columns 202 /Colors 3 >> -/SMask 2233 0 R +/SMask 2326 0 R /Length 547 >> stream @@ -65469,7 +67521,7 @@ x 㮄vq_ 8ڰ{ٍv7Æe4 =-d&~;u菡̠*DV%bIoiY2h`K^v{8ª1~qi$2R endstream endobj -2233 0 obj +2326 0 obj << /Filter /FlateDecode /Type /XObject @@ -65489,7 +67541,7 @@ stream x 0g-!8K=~^ӊQ+VDZ"jEԊQ+VDZ"jEԊQ+VDZ"jEԊQ+VDZ"jEԊQ+* endstream endobj -2234 0 obj +2327 0 obj << /Type /XObject /Subtype /Image @@ -65504,7 +67556,7 @@ endobj /Columns 202 /Colors 3 >> -/SMask 2235 0 R +/SMask 2328 0 R /Length 664 >> stream @@ -65513,7 +67565,7 @@ x ^ R\԰Qߤrk/v!A7j{=ޞS+˧֪KUVVb5&G ?w'b;|s?=m'ko^m/ݟXr'o_-^rKXv`> -/SMask 2237 0 R +/SMask 2330 0 R /Length 511942 >> stream @@ -67216,7 +69268,7 @@ f 3B!f!B!#*B!BGT!B!ޏ0C!B!/ endstream endobj -2237 0 obj +2330 0 obj << /Filter /FlateDecode /Type /XObject @@ -67324,7 +69376,7 @@ h-΀ Yr*&}l|'~وqmGe9ji }:MJefh nqnOLj$'U[ކ,L1QexV >[2xOmү0&tϸ:v|zv8iV?nVy≄jL/$aD=g=!z(jongtEk4ΤucME Rl̘?Z <7XGKYĔ:;ŷiə$,_ƞf ٨M#.ۀN~kMTLβ1v,4nzq=auINi9bM;ȑ0X;ƌa3w0z,N-hZ)'n8_>2Rb&*e=[Z̀ ZrY_v(8I楍|1'32sF;Z2 pH|$UҰ[eh LDŽ/%9OHwf99V3b,ն-M h!:.dM&$ɟx3uFӝCtFL6 ' aDXK<-(fCkj+---$upDƻ8ۭL6e N{tV&,%eYA!AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAb,@ endstream endobj -2238 0 obj +2331 0 obj << /Type /XObject /Subtype /Image @@ -67339,7 +69391,7 @@ endobj /Columns 727 /Colors 3 >> -/SMask 2239 0 R +/SMask 2332 0 R /Length 8085 >> stream @@ -67369,7 +69421,7 @@ Y 7Gd"qߍPuu+bԬ# !bs-)ziy,aqJvVb{ c4"U%b\(seXVO̊a\*m>E^}岌?%ػ 7Ҵ;&9<-9uO-qbtwncn!P% @79glb"P#^کQ1Z`@D]̂ QjKU A\3z/ t=܁3 ubw2:@Fvw/,SSMBã endstream endobj -2239 0 obj +2332 0 obj << /Filter /FlateDecode /Type /XObject @@ -67389,7 +69441,7 @@ stream xA 0C!YZ{lς;5E"_Sk|M)5E"_Sk|M)5E"_Sk|M)5E S; endstream endobj -2240 0 obj +2333 0 obj << /Type /XObject /Subtype /Image @@ -67404,7 +69456,7 @@ endobj /Columns 721 /Colors 3 >> -/SMask 2241 0 R +/SMask 2334 0 R /Length 13952 >> stream @@ -67455,7 +69507,7 @@ h'2 lE~*&Ƌq["^PWī6F{Ɔ5E`Q8&cy|w2h-GMxbR\mLM5֋Vel鞛]cC_onl0؝G*jz5> -/SMask 2243 0 R +/SMask 2336 0 R /Length 8276 >> stream @@ -67520,7 +69572,7 @@ m a*^/oV!6Ī A8kh++NmeJ#k,xͿH\ڷ̫a̅t^ΕCU +|]DwZůjwMVݱZvmz5BFF\簯K6G~Pul_#@HkQ)rg+%^F?&q endstream endobj -2243 0 obj +2336 0 obj << /Filter /FlateDecode /Type /XObject @@ -67540,7 +69592,7 @@ stream xA 0C!YZ{lς;6UަTy*oSmM6UަTy*oSmM6UަTy*oSmM6UަTy*oSm.? endstream endobj -2244 0 obj +2337 0 obj << /Type /XObject /Subtype /Image @@ -67555,7 +69607,7 @@ endobj /Columns 717 /Colors 3 >> -/SMask 2245 0 R +/SMask 2338 0 R /Length 7952 >> stream @@ -67582,7 +69634,7 @@ b |cfbFʼ@~NmT82VWC+wvp^9AD"6n֪kB_En&SwlܜLBp~lh! j |W00)L0'I·j|BvjO[9x)L|wZ]uFuM|#KxQ> -/SMask 2247 0 R +/SMask 2340 0 R /Length 1322 >> stream @@ -67629,7 +69681,7 @@ F ؐ6jF :V/a(f$ov`g7VF0X?ݙ/O}㻽[ҰxӸ#i˧ͧ+g 9q@0S_~Z^~I}4L|MGxo7{{:I3e@MZ xѼ}XLG@dgvf 7nwXI"9<ڣ:wv%\ 爈_!oe endstream endobj -2247 0 obj +2340 0 obj << /Filter /FlateDecode /Type /XObject @@ -67649,7 +69701,7 @@ stream xcπ0- endstream endobj -2248 0 obj +2341 0 obj << /Type /XObject /Subtype /Image @@ -67664,14 +69716,14 @@ endobj /Columns 200 /Colors 3 >> -/SMask 2249 0 R +/SMask 2342 0 R /Length 279 >> stream xA @g-.{}u2 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c0 c8 endstream endobj -2249 0 obj +2342 0 obj << /Filter /FlateDecode /Type /XObject @@ -67691,7 +69743,7 @@ stream x 0g-!8K=^҈M#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈ4 endstream endobj -2250 0 obj +2343 0 obj << /Type /XObject /Subtype /Image @@ -67706,14 +69758,14 @@ endobj /Columns 200 /Colors 3 >> -/SMask 2251 0 R +/SMask 2344 0 R /Length 283 >> stream xA @'TNAgz?HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH\| endstream endobj -2251 0 obj +2344 0 obj << /Filter /FlateDecode /Type /XObject @@ -67733,7 +69785,7 @@ stream x 0g-!8K=^҈M#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈ4 endstream endobj -2252 0 obj +2345 0 obj << /Type /XObject /Subtype /Image @@ -67748,14 +69800,14 @@ endobj /Columns 200 /Colors 3 >> -/SMask 2253 0 R +/SMask 2346 0 R /Length 284 >> stream x @u1*8fhyd> ں?HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH endstream endobj -2253 0 obj +2346 0 obj << /Filter /FlateDecode /Type /XObject @@ -67775,7 +69827,7 @@ stream x 0g-!8K=^҈M#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈ4 endstream endobj -2254 0 obj +2347 0 obj << /Type /XObject /Subtype /Image @@ -67790,14 +69842,14 @@ endobj /Columns 200 /Colors 3 >> -/SMask 2255 0 R +/SMask 2348 0 R /Length 283 >> stream xA @ T#kHȝ>:^M"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,"a,B endstream endobj -2255 0 obj +2348 0 obj << /Filter /FlateDecode /Type /XObject @@ -67817,7 +69869,7 @@ stream x 0g-!8K=^҈M#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈ4 endstream endobj -2256 0 obj +2349 0 obj << /Type /XObject /Subtype /Image @@ -67832,14 +69884,14 @@ endobj /Columns 200 /Colors 3 >> -/SMask 2257 0 R +/SMask 2350 0 R /Length 285 >> stream xA @l3dSGπHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH  endstream endobj -2257 0 obj +2350 0 obj << /Filter /FlateDecode /Type /XObject @@ -67859,7 +69911,7 @@ stream x 0g-!8K=^҈M#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈ4 endstream endobj -2258 0 obj +2351 0 obj << /Type /XObject /Subtype /Image @@ -67874,7 +69926,7 @@ endobj /Columns 27 /Colors 3 >> -/SMask 2259 0 R +/SMask 2352 0 R /Length 1259 >> stream @@ -67886,7 +69938,7 @@ x gҩrlo>999`0M@i=+ s]LP@\T*X"g@ŊKEKR\iP0А(s{"D"_h44Ȍ_<8ݵ)IV?K:Rg\~##""ΙaWrc>ڱ,SJ+lxKY퍎JB) DTU;q{{K߿JgMm@) v]\L}ץ2"$8G/bP}{ dǏgd>jaBnz> -/SMask 2261 0 R +/SMask 2354 0 R /Length 284 >> stream x @u1*8fhyd> ں?HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH endstream endobj -2261 0 obj +2354 0 obj << /Filter /FlateDecode /Type /XObject @@ -67948,7 +70000,7 @@ stream x 0g-!8K=^҈M#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈM#F4h4iDӈ4 endstream endobj -2262 0 obj +2355 0 obj << /Type /XObject /Subtype /Image @@ -67963,7 +70015,7 @@ endobj /Columns 27 /Colors 3 >> -/SMask 2263 0 R +/SMask 2356 0 R /Length 1039 >> stream @@ -67978,7 +70030,7 @@ y (tKZD4R7x<e [!nH1 tnrܙcڱtPU1R(q D9&9л|͋w;5YVASO+6υ|GOJ endstream endobj -2263 0 obj +2356 0 obj << /Filter /FlateDecode /Type /XObject @@ -67998,7 +70050,7 @@ stream xcπ0- endstream endobj -2264 0 obj +2357 0 obj << /Type /XObject /Subtype /Image @@ -68013,7 +70065,7 @@ endobj /Columns 27 /Colors 3 >> -/SMask 2265 0 R +/SMask 2358 0 R /Length 298 >> stream @@ -68022,7 +70074,7 @@ x Pⶨ7jMd"6:5*}W_wYK%m*b$A2Clh{:K7잿iiO endstream endobj -2265 0 obj +2358 0 obj << /Filter /FlateDecode /Type /XObject @@ -68042,7 +70094,7 @@ stream xcπ0- endstream endobj -2266 0 obj +2359 0 obj << /Type /XObject /Subtype /Image @@ -68057,7 +70109,7 @@ endobj /Columns 108 /Colors 3 >> -/SMask 2267 0 R +/SMask 2360 0 R /Length 3629 >> stream @@ -68073,7 +70125,7 @@ C *fwyj2ZC")+ݍsk;ۼ;ypKw)xHrRa&4'{/g??~ +-Jye=X6Kb @,A%hm X6Kb @,A/DJTbiJ=oT=SyJ,m~m. 3F endstream endobj -2267 0 obj +2360 0 obj << /Filter /FlateDecode /Type /XObject @@ -68094,7 +70146,7 @@ x W)-`y>n>k y0 endstream endobj -2268 0 obj +2361 0 obj << /Type /XObject /Subtype /Image @@ -68109,14 +70161,14 @@ endobj /Columns 108 /Colors 3 >> -/SMask 2269 0 R +/SMask 2362 0 R /Length 389 >> stream xN0@Q1/[Tzx¥x<^xE("PD@"E("PD@"E("PDm珏XUyoJ\,OfZ4t;O|ǓO(9A;xѳnNv~;?}}>];8?ϥӼ?v\/ cE("PD@"E("PD@"E("PD@ #~]s}uU=caLε¬=^,.8s#feɹu;&]arE+ ("PD@"E("PD@"E("PD@"EK endstream endobj -2269 0 obj +2362 0 obj << /Filter /FlateDecode /Type /XObject @@ -68137,7 +70189,7 @@ x [9d2L&d2L&d2L&d2L&d2L&{A endstream endobj -2270 0 obj +2363 0 obj << /Type /XObject /Subtype /Image @@ -70522,7 +72574,7 @@ Du ֤aaaaaaa;k 0 0 0 0 0 0 0̝5iaaaaaaaN40 0 0 0 0 0 0 s`MaaaaaaaS&0 0 0 0 0 0 0 )Xfaaaaaaa endstream endobj -2271 0 obj +2364 0 obj << /Type /XObject /Subtype /Image @@ -70547,7 +72599,7 @@ x cfkt pYJ~Q*,krjSueLͦfNJ'Ri\L?=y.gmf0E藒}h>ycd1(?-墇<}(!<=[JoBwyx.mZ2T>pQljLJd)띮`S? Χr)F_Z,Bv}m>vsQ 2;<+>/I;y'<B!C!D"x<B!C!D2}~w̷_E9!D"x<B!C!D"x<B!<:~{/}"x<B!C!D"x<B!Cy<ܗyo"x<B!C!D"x<B!C!D"x<B!C!D"x<B!CsY_;'<B!C!D"x<B!C!Dr𳙇Vm^}6'<B!C!D"x<B!C!D>~i|sC!D"x<B!C!D"x<Bxs\# endstream endobj -2274 0 obj +2367 0 obj << /Type /XObject /Subtype /Image @@ -71071,7 +73123,7 @@ c B ;3z ҿm }nNwz}n u;/ۖ> -/SMask 2276 0 R +/SMask 2369 0 R /Length 6746 >> stream @@ -71171,7 +73223,7 @@ m <7 6 6 6 I endstream endobj -2276 0 obj +2369 0 obj << /Filter /FlateDecode /Type /XObject @@ -71301,7 +73353,7 @@ x N'BQ endstream endobj -2277 0 obj +2370 0 obj << /Type /XObject /Subtype /Image @@ -71316,7 +73368,7 @@ endobj /Columns 755 /Colors 3 >> -/SMask 2278 0 R +/SMask 2371 0 R /Length 7230 >> stream @@ -71331,7 +73383,7 @@ $ >.4FogU[}(el> ЇP6@C}(el> ЇP6@C}(el>f>Sx;.~ޭj+x[2xy*YOFsC6f1;wP[s8ƫ=fl> ЇP6@C}(el> ЇP6@C}(el> ЇP6@u^Oz5zO`\%a2$q7'o_u.ۏcv!? чbX)M]n1kE}(el> ЇP6@C}(el> ЇP6@C}(e1[ euWxpd 8^ϗz7Ϝh>@lN ЇP6@o endstream endobj -2278 0 obj +2371 0 obj << /Filter /FlateDecode /Type /XObject @@ -71352,7 +73404,7 @@ x ztς;<5xSyj> -/SMask 2280 0 R +/SMask 2373 0 R /Length 12579 >> stream @@ -71407,7 +73459,7 @@ U oL9/4﫞s|-ɗ޷r=F_)! )! )! )! )! -H endstream endobj -2280 0 obj +2373 0 obj << /Filter /FlateDecode /Type /XObject @@ -71427,7 +73479,7 @@ stream x1 0qݳnjd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3aF2H0#f$Ìd 3qI endstream endobj -2281 0 obj +2374 0 obj << /Type /XObject /Subtype /Image @@ -71442,7 +73494,7 @@ endobj /Columns 190 /Colors 3 >> -/SMask 2282 0 R +/SMask 2375 0 R /Length 6183 >> stream @@ -71478,7 +73530,7 @@ J ʩDѤbF%}ٮ>,A I!f :Hts#ԹWF>`~et ?{04޼K63v:Nvt '|n<ϗ"[`w#vQg;bGuv#vQg;bGuv#vQg;bGw\ endstream endobj -2282 0 obj +2375 0 obj << /Filter /FlateDecode /Type /XObject @@ -71498,7 +73550,7 @@ stream xA 1!GCrU=gGԗKR}T_/՗KR}T_/՗KR}T_/՗KR}txT{ endstream endobj -2283 0 obj +2376 0 obj << /Type /XObject /Subtype /Image @@ -71513,7 +73565,7 @@ endobj /Columns 190 /Colors 3 >> -/SMask 2284 0 R +/SMask 2377 0 R /Length 2812 >> stream @@ -71536,7 +73588,7 @@ x rq&V endstream endobj -2284 0 obj +2377 0 obj << /Filter /FlateDecode /Type /XObject @@ -71556,7 +73608,7 @@ stream xA 1!GCrU=gGԗKR}T_/՗KR}T_/՗KR}T_/՗KR}txT{ endstream endobj -2285 0 obj +2378 0 obj << /Type /XObject /Subtype /Image @@ -71571,7 +73623,7 @@ endobj /Columns 190 /Colors 3 >> -/SMask 2286 0 R +/SMask 2379 0 R /Length 675 >> stream @@ -71579,7 +73631,7 @@ x 'SܧEۥtfF / / endstream endobj -2286 0 obj +2379 0 obj << /Filter /FlateDecode /Type /XObject @@ -71599,7 +73651,7 @@ stream xA 1!GCrU=gGԗKR}T_/՗KR}T_/՗KR}T_/՗KR}txT{ endstream endobj -2287 0 obj +2380 0 obj << /Type /XObject /Subtype /Image @@ -71614,7 +73666,7 @@ endobj /Columns 229 /Colors 3 >> -/SMask 2288 0 R +/SMask 2381 0 R /Length 2647 >> stream @@ -71632,7 +73684,7 @@ N 222BkDDDCCϟ{{{5X,޹s  |ƠOt[2Apϔ-nׂ|P禸xgys_͋Z|  ^#p,C>m&TF-#eR>gØ!~7A]o endstream endobj -2288 0 obj +2381 0 obj << /Filter /FlateDecode /Type /XObject @@ -71652,7 +73704,7 @@ stream x 0L]?QЮ5^vs.;\vpe.;\vpe.;\vpe.;\vpenj^~ endstream endobj -2289 0 obj +2382 0 obj << /Type /XObject /Subtype /Image @@ -71667,7 +73719,7 @@ endobj /Columns 1200 /Colors 3 >> -/SMask 2290 0 R +/SMask 2383 0 R /Length 30497 >> stream @@ -71738,7 +73790,7 @@ i `cjh` le~w P2'd ̸W᭾vE7,#*}%CBA5b'}DBVPK]pSy*9@O0|Q]XTȆ1lɧ|ABzXqweaV?P/$ kIJ4F2V6bީSOpBіXHJ+te"XQ[@ _ endstream endobj -2290 0 obj +2383 0 obj << /Filter /FlateDecode /Type /XObject @@ -71829,7 +73881,7 @@ QJ sۉ&bP:#۞6QJ7D䬐b\ꔥ&ŸESdbџ8)vt XIJ)n2R:m')P?ۮ)g;-&Y JYJi o],zd\+~N,(CvB)Ydw}~OVsw 5r = |loŦ猎[T?{}n2(7h/K֘xpܯXpgW ;ARBH;B2onHdכvXO A`AӇ]ji[]њuyT<6NTŋ.V:jsO> -/SMask 2292 0 R +/SMask 2385 0 R /Length 12986 >> stream @@ -71895,7 +73947,7 @@ y7c dxyqۓӫ8beh滷Z+tJt]wg!t_\zu]FSu?̯W/܄oMp#촎PaWc6?XF,Hn2x(-9D!fN%רJ\ךj꺎m;iRN *B$qN/`4x8LP$0nئkV+{ђ5waCDO?tuu-*aB,vclZ o >9ғs -xyrsfbgRH Riɤ7ȯTڶe PHE7ǓIL0S$ ?@ze@RRp8:99q V`³:`?+Z8\.# m1 ]R-R&s=eaٖia˼PJHIFq%I2w\r!屜3h+Ή:L:7r8MpyEb -&]J$rfXo2*ͱPJCb#&PJa{am7p^qˠ9m;W;RJ$I5HTnY3dr:Ă;::p棺~7_L endstream endobj -2292 0 obj +2385 0 obj << /Filter /FlateDecode /Type /XObject @@ -71916,7 +73968,7 @@ x 2&bX,bX,bX,bX,bX,bX,bX endstream endobj -2293 0 obj +2386 0 obj << /Type /XObject /Subtype /Image @@ -71931,7 +73983,7 @@ endobj /Columns 283 /Colors 3 >> -/SMask 2294 0 R +/SMask 2387 0 R /Length 6824 >> stream @@ -71973,7 +74025,7 @@ _n(3g )9ssR\UD9CۼNؓw79y{Z[@Cwv ]6oAD?]}&QNn94XWe*TXKODtgPTN";Ol%GZ.5 CG#"+yӶ2Fa({y2f/+ecSIytx6,3z"Lʽi\@xyTʶ@7s W_/?f_ ΣS !wݪ<::jQ _酿і_wM{m˦(ͧrϾ<#awU%ʩELUNO !ɶm[q;}maxP$TEl9d1ovZo&]sQ;ʓ׭9΍e`zG;0P^>^NjHEFrULcޠYZ,2m[|?~+x"Զ{oγ`7[~ =#`ݸWxTDDԠ{&*{݇mKHKHKHKHKHKHKHKHKHKHKHK: endstream endobj -2294 0 obj +2387 0 obj << /Filter /FlateDecode /Type /XObject @@ -71993,7 +74045,7 @@ stream x1 0GAgY:c4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛MyӼi4o7͛M endstream endobj -2295 0 obj +2388 0 obj << /Type /XObject /Subtype /Image @@ -72008,7 +74060,7 @@ endobj /Columns 702 /Colors 3 >> -/SMask 2296 0 R +/SMask 2389 0 R /Length 30262 >> stream @@ -72121,7 +74173,7 @@ a !BB`t@!P0: Bꎓp endstream endobj -2296 0 obj +2389 0 obj << /Filter /FlateDecode /Type /XObject @@ -72141,7 +74193,7 @@ stream xA 0U,:} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0v endstream endobj -2297 0 obj +2390 0 obj << /Type /XObject /Subtype /Image @@ -72156,7 +74208,7 @@ endobj /Columns 691 /Colors 3 >> -/SMask 2298 0 R +/SMask 2391 0 R /Length 27680 >> stream @@ -72262,7 +74314,7 @@ K$ɪԙ  zjaxr͛Yt2vi-{CGrG5tmB#CIzCMBvOL~msDpkn]뮫gjpDq("g U1uuz}s㲠j%Ne%2|'!DFtm$wlr(Tf"Ne%:ړ> ;شiVI 9<> -/SMask 2300 0 R +/SMask 2393 0 R /Length 18179 >> stream @@ -72393,7 +74445,7 @@ I KX1ˆ"p/R8^8-um>xp^8-k} endstream endobj -2300 0 obj +2393 0 obj << /Filter /FlateDecode /Type /XObject @@ -72413,7 +74465,7 @@ stream xA @g"%{pm{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{7 endstream endobj -2301 0 obj +2394 0 obj << /Type /XObject /Subtype /Image @@ -72428,7 +74480,7 @@ endobj /Columns 696 /Colors 3 >> -/SMask 2302 0 R +/SMask 2395 0 R /Length 37577 >> stream @@ -72636,7 +74688,7 @@ ENN B!n)E|PbE] B&6(\!B endstream endobj -2302 0 obj +2395 0 obj << /Filter /FlateDecode /Type /XObject @@ -72656,7 +74708,7 @@ stream xA 0U,9qI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$$d\KqI2.I%ɸ$]F endstream endobj -2303 0 obj +2396 0 obj << /Type /XObject /Subtype /Image @@ -72671,7 +74723,7 @@ endobj /Columns 1222 /Colors 3 >> -/SMask 2304 0 R +/SMask 2397 0 R /Length 127078 >> stream @@ -73148,7 +75200,7 @@ RhR 5Az׫긭o">t6?R9R9қ&^?9cZxѧ͗ kkf. &$hR$hR$hR$hR$hR$hR$hR$hR r endstream endobj -2304 0 obj +2397 0 obj << /Filter /FlateDecode /Type /XObject @@ -73168,7 +75220,7 @@ stream xA 0CU,;q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6gc@q6] endstream endobj -2305 0 obj +2398 0 obj << /Type /XObject /Subtype /Image @@ -73183,7 +75235,7 @@ endobj /Columns 1442 /Colors 3 >> -/SMask 2306 0 R +/SMask 2399 0 R /Length 274159 >> stream @@ -74122,7 +76174,7 @@ A O|$ݑ;A'c[q(%+k9j,pL73Ҁcef>2Cq@~=B2"=g,8i3T]zIMtUL` dIZq'6pED nڽ',dfH") (Qh0rY% endstream endobj -2306 0 obj +2399 0 obj << /Filter /FlateDecode /Type /XObject @@ -74142,7 +76194,7 @@ stream x1 0础^ݳh:xh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh,Ȳh /y endstream endobj -2307 0 obj +2400 0 obj << /Type /XObject /Subtype /Image @@ -74157,7 +76209,7 @@ endobj /Columns 1472 /Colors 3 >> -/SMask 2308 0 R +/SMask 2401 0 R /Length 89327 >> stream @@ -74448,7 +76500,7 @@ s CƑdCYO v| OC;>a3?I?A(Xs? 0- endstream endobj -2308 0 obj +2401 0 obj << /Filter /FlateDecode /Type /XObject @@ -74468,7 +76520,7 @@ stream xA 0U,8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D8@D]i endstream endobj -2309 0 obj +2402 0 obj << /Type /XObject /Subtype /Image @@ -74483,7 +76535,7 @@ endobj /Columns 323 /Colors 3 >> -/SMask 2310 0 R +/SMask 2403 0 R /Length 38003 >> stream @@ -74620,7 +76672,7 @@ i I)BRT߈嗛 vB.MW $qͧ0Mc|A cq:^04B9y9`[8|c&[tg1)j [4co<1u5&5n0起H4Hiq$$d C(t+֌[4=;cwvw8l%jEw_C.#] VbɺEEIsLd=q?WrzVڪQH|#᱋ cKbsiA3z~3ƷܦO&IV3~?bc.MdXc1 ޓoq1b|1bO" endstream endobj -2310 0 obj +2403 0 obj << /Filter /FlateDecode /Type /XObject @@ -74640,7 +76692,7 @@ stream xA 0C$Ul":>aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaw5y endstream endobj -2311 0 obj +2404 0 obj << /Type /XObject /Subtype /Image @@ -74655,7 +76707,7 @@ endobj /Columns 1903 /Colors 3 >> -/SMask 2312 0 R +/SMask 2405 0 R /Length 744474 >> stream @@ -77410,7 +79462,7 @@ EDF 1P)XDdB4^W%#@@H=K{St*{{n{6y㛯X?ǟ~b\w]t#]re|૷f& ך'c‡6NxE̜OnShFŠ[+}[n]i ~Q.)ݟGgu7x'foӡFi8˳tzh߼͟8QqG oj4ݵ7ٵz~؟ݛ.MwŽW) u$5኉|$3Ar5Ws5Ws5srr! endstream endobj -2312 0 obj +2405 0 obj << /Filter /FlateDecode /Type /XObject @@ -77430,7 +79482,7 @@ stream x1 0GEDAY@-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[]HW endstream endobj -2313 0 obj +2406 0 obj << /Type /XObject /Subtype /Image @@ -77445,7 +79497,7 @@ endobj /Columns 1903 /Colors 3 >> -/SMask 2314 0 R +/SMask 2407 0 R /Length 430685 >> stream @@ -78946,7 +80998,7 @@ cI 1c cH+iv/#sܓ ZSwoL=pIq<.Vڄ<w}rw{q)t"Qbj)"F'1ZDmckI$Q*w޼~& FHp.=#=# & endstream endobj -2314 0 obj +2407 0 obj << /Filter /FlateDecode /Type /XObject @@ -78966,7 +81018,7 @@ stream x1 0GEDAY@-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z~ =@o[-z5 endstream endobj -2315 0 obj +2408 0 obj << /Type /XObject /Subtype /Image @@ -78981,7 +81033,7 @@ endobj /Columns 1500 /Colors 3 >> -/SMask 2316 0 R +/SMask 2409 0 R /Length 36662 >> stream @@ -79068,7 +81120,7 @@ M0 1Zx<.r0TVz-) 6]Dl^pX&WQr{ݻA9xƓeYQT:{rY,%ɬٯ!sJ9p8J7ZNS>VNG[8{̋:P&m{~2sߣo?Ȅsk>}=n9G t|s87oOL»pɑ);u/ֵ; >W4syۂo/k$:;yѽ]tZ~F2׻=0#0f˜(uU,HIuJ5xg ޸ٻlC!Tİ1{߀`fW|7_qЉ#CC Yc?,u+[C3ijuYl 5gB>58!/)uAXZN* yR3UexF`<뱩KtB18L:BQ2I/kD.٧ endstream endobj -2316 0 obj +2409 0 obj << /Filter /FlateDecode /Type /XObject @@ -79088,7 +81140,7 @@ stream x 0u%$= ;                                                                                                                                                                                                                                                                                                                                                                                                                  .0K endstream endobj -2317 0 obj +2410 0 obj << /Type /XObject /Subtype /Image @@ -79103,7 +81155,7 @@ endobj /Columns 1476 /Colors 3 >> -/SMask 2318 0 R +/SMask 2411 0 R /Length 215881 >> stream @@ -79897,7 +81949,7 @@ Fb EZ(JdJjͅwAw|jM˲|& Y77UI>~ܥ p'tsZ)Dvo5bx>0kn^*WZaa..~4n/9_30̌{r6u*W S.`K^˫ɍ= ?wgu;`ͽ1:9Tn77`Fw_Y><psxϔ[{.Mw#t)׈K򔛵}~>q;܈ S>V/;[yaAK6(ϩ|'-1a>gwן{LK: /cMe endstream endobj -2318 0 obj +2411 0 obj << /Filter /FlateDecode /Type /XObject @@ -79917,7 +81969,7 @@ stream xA 0U,ޙ8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@8@%M endstream endobj -2319 0 obj +2412 0 obj << /Type /XObject /Subtype /Image @@ -79932,7 +81984,7 @@ endobj /Columns 337 /Colors 3 >> -/SMask 2320 0 R +/SMask 2413 0 R /Length 79782 >> stream @@ -80167,7 +82219,7 @@ Bhww EQ),ժU.3Csj0\8k&NZ19(tZgR9X__>c׋ _̳L2ߨW3suE\\\\\\\\\\\\\\\\uכ稘cdO"pD16ess_s_s_s_} endstream endobj -2320 0 obj +2413 0 obj << /Filter /FlateDecode /Type /XObject @@ -80187,7 +82239,7 @@ stream x @@c{:;9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zshњ5Gk9Zsh/ endstream endobj -2321 0 obj +2414 0 obj << /Type /XObject /Subtype /Image @@ -80202,7 +82254,7 @@ endobj /Columns 1278 /Colors 3 >> -/SMask 2322 0 R +/SMask 2415 0 R /Length 32650 >> stream @@ -80272,7 +82324,7 @@ zL a͟/?3/dZ(w-Ʀ?]oLl-Kla'|9e'?8c3H;'ྯ4{';αxG]do̹~~ZE|}8SO}jL_̄AGxjG:/7;DRq,eCʿ\u24M0j׏lY=_|hMg0O,#Yߝwi7{B."_{f<8jZ~#VD`ȷWFZ endstream endobj -2322 0 obj +2415 0 obj << /Filter /FlateDecode /Type /XObject @@ -80292,7 +82344,7 @@ stream x1 0!cGzDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDe@QDO endstream endobj -2323 0 obj +2416 0 obj << /Type /XObject /Subtype /Image @@ -80307,7 +82359,7 @@ endobj /Columns 1563 /Colors 3 >> -/SMask 2324 0 R +/SMask 2417 0 R /Length 162082 >> stream @@ -80778,7 +82830,7 @@ s}7 ~ϩJA8rPgYmoUTko?GNN\Эs|(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o(o_ endstream endobj -2325 0 obj +2418 0 obj << /Type /XObject /Subtype /Image @@ -80813,7 +82865,7 @@ endobj /Columns 1597 /Colors 3 >> -/SMask 2326 0 R +/SMask 2419 0 R /Length 420470 >> stream @@ -82282,7 +84334,7 @@ Y [QHr-ޢ7sZ}cctG?Oal[wuKXS{3+i!MWWWKpdgwHw&BeKVBtMs endstream endobj -2326 0 obj +2419 0 obj << /Filter /FlateDecode /Type /XObject @@ -82302,7 +84354,7 @@ stream xA 0C^U,>t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@tƌ % endstream endobj -2327 0 obj +2420 0 obj << /Type /XObject /Subtype /Image @@ -82317,7 +84369,7 @@ endobj /Columns 273 /Colors 3 >> -/SMask 2328 0 R +/SMask 2421 0 R /Length 12650 >> stream @@ -82368,7 +84420,7 @@ EQT4 )IR(6 ISG$;;'==mq1Z= Ӕٽs߾EŅ+ASSo~~aXX}ƪYq_'.Q(2vn/..2W,~o}ԙ`ytEbصnEYז$qٸӧ9rtŅ7okd4;v{RCC]Ǚsګ8]XXl8/kPђj#-,cc8' f93+3bS0LwOOEyY#=< &j|5 99Y{ڷwwUUQ%̸'&&&)*FyAZdYF8ki:p`eej~.v~a>!PZ$]\Hp8\VVp/]8( `0??(3<芢8n0,n9 z=~db^\A~r((3nj_֡V-(/MQRRS5hZK? endstream endobj -2328 0 obj +2421 0 obj << /Filter /FlateDecode /Type /XObject @@ -82388,7 +84440,7 @@ stream xб@3,@?A.s.uw)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr)Gʑr_V endstream endobj -2329 0 obj +2422 0 obj << /Type /XObject /Subtype /Image @@ -82403,7 +84455,7 @@ endobj /Columns 1204 /Colors 3 >> -/SMask 2330 0 R +/SMask 2423 0 R /Length 345407 >> stream @@ -83554,7 +85606,7 @@ b  뺎㤽$,`7MeY&Z?8gAE9n'QTգl[[YE~u[J$MźD"2u8$ʲ4֜fYfG.JmΣj4{;nG<u8)oy#4MFBWtONNt:][[LN'Qi42Ʋ4 q,FNҒRqصI4ٽ{޽[GٗtפeUF޻^8eڅ}ѓ]Ug}^UՅ_q6\'L|: @d-OxCpy0ߎ7C> -/SMask 2332 0 R +/SMask 2425 0 R /Length 346414 >> stream @@ -84813,7 +86865,7 @@ f ,]6R*6&s+nGJiEẮֺn?kZZV+a8v۲Zne3V9;;i=f75-!cwUZZ8R qdQzǏF#"ƕJe2>Fx/PHjƨR1JrQj]*ϋ8QJ ԲCY^2iGkmmlTUahh<omm +mG* !/I~?ķ,*%!bƐ"zẕ00X,!lDZ's)eQeRLeYh4>ʋ&oߙBy1L~^e8kWs'2cLӱm'>L:KYI|ruݕaax|]"i`Ydi>8h0vvv]VVzWWW^曯`?t\eߌ A穐Ń{=˲nݼl6Ȍׯ{[[( x¨^ێI"j4fff> -/SMask 2334 0 R +/SMask 2427 0 R /Length 426671 >> stream @@ -86356,7 +88408,7 @@ $R @D&R˲/^20⋧(RT.T{Lg2 `0 c!$߶WdMi0 ,`0D|'`0 `0+(%zLqjh6y`@Gsh`0 `|%(+#>۶ǩV `0 w!p>}Թ^!d. `0 a0 `0 NqL`0 `<0@L&PV`0 `0%PJ)X,z`0 `0(|~])ľ᯹`0 `|;`1 `0 x`0`0 `0 `0 x`0`0 `0 `0 x`0`0 `0J8#;`0 `<xw&2=ϻ˖ `0 `삹2 `0 D&`0 `0Ld2 `0 D&`0 `0Ld2 `0 D&`0 `0w+a!DP`0 `+ endstream endobj -2334 0 obj +2427 0 obj << /Filter /FlateDecode /Type /XObject @@ -86376,7 +88428,7 @@ stream xA @g-!.^{ò3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H03 ̀3 H8h endstream endobj -2335 0 obj +2428 0 obj << /Type /XObject /Subtype /Image @@ -86391,7 +88443,7 @@ endobj /Columns 1560 /Colors 3 >> -/SMask 2336 0 R +/SMask 2429 0 R /Length 49312 >> stream @@ -86759,7 +88811,7 @@ cMX$ $)((((((((((((((((F? endstream endobj -2336 0 obj +2429 0 obj << /Filter /FlateDecode /Type /XObject @@ -86779,7 +88831,7 @@ stream xձ@3:a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a 1@a / endstream endobj -2337 0 obj +2430 0 obj << /Type /XObject /Subtype /Image @@ -86794,7 +88846,7 @@ endobj /Columns 287 /Colors 3 >> -/SMask 2338 0 R +/SMask 2431 0 R /Length 14502 >> stream @@ -86852,7 +88904,7 @@ eXRR 0'Z 𚚪LNxGYO,0$0 We%{p/) h,.`0GO endstream endobj -2338 0 obj +2431 0 obj << /Filter /FlateDecode /Type /XObject @@ -86872,7 +88924,7 @@ stream x1 0AWY:s4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi4?͟Oi  endstream endobj -2339 0 obj +2432 0 obj << /Type /XObject /Subtype /Image @@ -86887,7 +88939,7 @@ endobj /Columns 1561 /Colors 3 >> -/SMask 2340 0 R +/SMask 2433 0 R /Length 49457 >> stream @@ -87074,7 +89126,7 @@ p \8D"H$#Euk\[[;o^Aox}EKq,r2DrpΟ>=wQqѲ\v;KayI$Dr "c4P䝚't@)W.j`84lm]ɧ/yy_^NK"smK m<!c %D#y1hp8.am[SU]ׄv@MUBo˯K}t勁[[[G?z-0XRJ<9V"H$Sáa/K6A]/|;'-{/Zk 9O(1㾫z=uCkZVu]~ !,v"G RV·\36yi쫪jEKtT,^ q KRTu-H$WDDDqCʘB@մkzZ & Wla!ij#CUJiyN'~Ծ$D"H$D"H$ɷ/)mH$D"H$D"HC$D"H$D"H$"}ID"H$D"H$y$D"H$D"H$ɼH_D"H$D"H$d^/I"H$D"H$D2/җ$H$D"H$D"uw9aH$D"H$D"H.BԕY$˲yH$D"H$D"H./"$D"H$D"H$"KH$D"H$D"̋%I$D"H$D"HE$D"H$D"H$"}ID"H$D"H$y$D"H$D"H$ɼH_D"H$D"H$d^v1 endstream endobj -2340 0 obj +2433 0 obj << /Filter /FlateDecode /Type /XObject @@ -87094,7 +89146,7 @@ stream xձ03^\Эs|(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(gr(g:\l endstream endobj -2341 0 obj +2434 0 obj << /Type /XObject /Subtype /Image @@ -87109,7 +89161,7 @@ endobj /Columns 321 /Colors 3 >> -/SMask 2342 0 R +/SMask 2435 0 R /Length 6346 >> stream @@ -87134,7 +89186,7 @@ w huvv֜]᭰?  xCa0oh74  xCa0oh74  xCa0oh74  x[oDb +Htk%Iz2N 6(^M&Svp=: -˝ l \~V3ZjQ0oh74  Ғ$e2=Xl) Fqm띇zl:xCa0oh74  xCa0oh74  xCa0o-U* W|g<p^74  xCa0oh74 SjE endstream endobj -2342 0 obj +2435 0 obj << /Filter /FlateDecode /Type /XObject @@ -87154,7 +89206,7 @@ stream xA 0CUl"9``````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````u^ endstream endobj -2343 0 obj +2436 0 obj << /Type /XObject /Subtype /Image @@ -87169,7 +89221,7 @@ endobj /Columns 1594 /Colors 3 >> -/SMask 2344 0 R +/SMask 2437 0 R /Length 559350 >> stream @@ -89187,7 +91239,7 @@ D B8w xMtgr<{ŋ55^ΫQ\B4f endstream endobj -2344 0 obj +2437 0 obj << /Filter /FlateDecode /Type /XObject @@ -89207,7 +91259,7 @@ stream xA 0C^U,(~cD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dD@dDt  endstream endobj -2345 0 obj +2438 0 obj << /Type /XObject /Subtype /Image @@ -89222,7 +91274,7 @@ endobj /Columns 1597 /Colors 3 >> -/SMask 2346 0 R +/SMask 2439 0 R /Length 567282 >> stream @@ -91240,7 +93292,7 @@ T 3Ý;Sۗb}_B_>Q?|9iFswwG1rLI^`=wxu:U7;t)WXai1鴳@ctf} ^Dmݼg,lr$݌H endstream endobj -2346 0 obj +2439 0 obj << /Filter /FlateDecode /Type /XObject @@ -91260,7 +93312,7 @@ stream xA 0C^U,>t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@w? # endstream endobj -2347 0 obj +2440 0 obj << /Type /XObject /Subtype /Image @@ -91275,7 +93327,7 @@ endobj /Columns 1469 /Colors 3 >> -/SMask 2348 0 R +/SMask 2441 0 R /Length 247256 >> stream @@ -92147,7 +94199,7 @@ S IN]rELn2:v_x\|u7[r7pI/;5fv9>ToEn&,|*/$UL`rQ5+C7w+/ 0ܣt.6 ]8EwYE'!!9w3={xdɒk_&r5w5?03 endstream endobj -2348 0 obj +2441 0 obj << /Filter /FlateDecode /Type /XObject @@ -92167,7 +94219,7 @@ stream xA 0U,r7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{7@{] endstream endobj -2349 0 obj +2442 0 obj << /Type /XObject /Subtype /Image @@ -92182,7 +94234,7 @@ endobj /Columns 682 /Colors 3 >> -/SMask 2350 0 R +/SMask 2443 0 R /Length 40407 >> stream @@ -92305,7 +94357,7 @@ A1 4j?Ps @59i Zlq_+c*i endstream endobj -2350 0 obj +2443 0 obj << /Filter /FlateDecode /Type /XObject @@ -92325,7 +94377,7 @@ stream xA 0?U,(8U*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªDXaU"JU*V%ªD\* endstream endobj -2351 0 obj +2444 0 obj << /Type /XObject /Subtype /Image @@ -92340,7 +94392,7 @@ endobj /Columns 685 /Colors 3 >> -/SMask 2352 0 R +/SMask 2445 0 R /Length 27431 >> stream @@ -92432,7 +94484,7 @@ n_N "##!B^8͗h^ȭB}H*B!0 B sB!0 BR\Bo endstream endobj -2352 0 obj +2445 0 obj << /Filter /FlateDecode /Type /XObject @@ -92452,7 +94504,7 @@ stream xA 0?U,8[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nítV:J[p+nít\ endstream endobj -2353 0 obj +2446 0 obj << /Type /XObject /Subtype /Image @@ -92467,7 +94519,7 @@ endobj /Columns 702 /Colors 3 >> -/SMask 2354 0 R +/SMask 2447 0 R /Length 27768 >> stream @@ -92559,7 +94611,7 @@ q {UBs("Y e!fb!ψF!B%B`t@!P 0: BB!T!*FBB!J!B%& endstream endobj -2354 0 obj +2447 0 obj << /Filter /FlateDecode /Type /XObject @@ -92579,7 +94631,7 @@ stream xA 0U,:} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ0f_K} /a%̾ٗ } endstream endobj -2355 0 obj +2448 0 obj << /Type /XObject /Subtype /Image @@ -92594,7 +94646,7 @@ endobj /Columns 263 /Colors 3 >> -/SMask 2356 0 R +/SMask 2449 0 R /Length 17224 >> stream @@ -92667,7 +94719,7 @@ nF{x X|m{==>by^kHD`Fs>:%z<ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ćC|!>ć\1 endstream endobj -2357 0 obj +2450 0 obj << /Type /XObject /Subtype /Image @@ -92702,7 +94754,7 @@ endobj /Columns 384 /Colors 3 >> -/SMask 2358 0 R +/SMask 2451 0 R /Length 63980 >> stream @@ -92903,7 +94955,7 @@ Vի B賆N_10sp!2@B B(e0B)J P`!R!2?GJ endstream endobj -2358 0 obj +2451 0 obj << /Filter /FlateDecode /Type /XObject @@ -92924,7 +94976,7 @@ x zy'5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5kX` 5k*-' endstream endobj -2359 0 obj +2452 0 obj << /Type /XObject /Subtype /Image @@ -92939,7 +94991,7 @@ endobj /Columns 1901 /Colors 3 >> -/SMask 2360 0 R +/SMask 2453 0 R /Length 117846 >> stream @@ -93265,7 +95317,7 @@ O^ ݣ$J$-t^Cl;~yc_쪦֬zb U(;ס?73nÂ͛:LxwSSS3F1t=Ì?3q#?-]fo?ýf=*pC;,Ќ O@BßiϘsHρ<ׄ߾u =<'~K?UQQӷlw+n9쿯8|Og&i% endstream endobj -2360 0 obj +2453 0 obj << /Filter /FlateDecode /Type /XObject @@ -93285,7 +95337,7 @@ stream xA 0CBBZmRu|mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mPs[-jn 5@mP7$G endstream endobj -2361 0 obj +2454 0 obj << /Type /XObject /Subtype /Image @@ -96346,7 +98398,7 @@ M wNL@*R_E6A#i2jNhj?7|E(ShGj?((oU&E5iۨizAZ(f[#S@ HѻmMnZoPM}֢E ERR?ޠQMA#mnBRfԛjm:m6ڂrI4P endstream endobj -2362 0 obj +2455 0 obj << /Type /XObject /Subtype /Image @@ -100019,7 +102071,7 @@ P rj#=_ޡwlehv|z%^~emLcnҤnM۾*@̨&?~dҪŸ c?})i8Q4>jjfv[妏w}ij{f$ٹ7S~F6ݫmYmwTՠ E1 endstream endobj -2363 0 obj +2456 0 obj << /Type /XObject /Subtype /Image @@ -100034,7 +102086,7 @@ endobj /Columns 330 /Colors 3 >> -/SMask 2364 0 R +/SMask 2457 0 R /Length 11173 >> stream @@ -100063,7 +102115,7 @@ J,g} BZ^뺾WJaaZiJy^/Z$֦m[0:sZ[Ԙ{A1F!sԔ[ 6&ŠsI[ =?aOY摗R]/(-xl[l켚)|k ҉L#CHJ-,/&}JJ+%ONTbv:.  Ƃ1!$`WB_p:~^{kRrcF *sF&=RͱpoUB2 eXݴQ7S<d8~P]8Nb3ćl1śa@VB$MoN)j _>ɉ.JcpZW~ (Oc p@=z@aJDA\ ١FPTNeM. k! ݄nAᯆtL l2Bxc 0#ύ {7MT7Sqy}Xzys<<'!ohK{=WRb^}A;_o4c}Z|;?# 4b| 'o8|ZޏI}Ëw@l_8@ۑ S3{+[? CҟtQ^S?7墽/4y&rE>'?/\}29?E~ "?\\kO+x_"?\}u;%8 endstream endobj -2364 0 obj +2457 0 obj << /Filter /FlateDecode /Type /XObject @@ -100083,7 +102135,7 @@ stream x @@c{:VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3VfX2ceʌ+3Vf.R endstream endobj -2365 0 obj +2458 0 obj << /Type /XObject /Subtype /Image @@ -100098,7 +102150,7 @@ endobj /Columns 312 /Colors 3 >> -/SMask 2366 0 R +/SMask 2459 0 R /Length 6008 >> stream @@ -100129,7 +102181,7 @@ Q uL~/|{B"D!B"D!B"D!B"D!B ^ endstream endobj -2366 0 obj +2459 0 obj << /Filter /FlateDecode /Type /XObject @@ -100149,7 +102201,7 @@ stream xA 0>UlϢ8~e\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d\tZ} endstream endobj -2367 0 obj +2460 0 obj << /Type /XObject /Subtype /Image @@ -100164,7 +102216,7 @@ endobj /Columns 270 /Colors 3 >> -/SMask 2368 0 R +/SMask 2461 0 R /Length 4691 >> stream @@ -100186,7 +102238,7 @@ S8 w?ݢA ?Km9ir S#p |>nzp]W`020p4~p ?{bh4J4FѣoA~Ȧ@,4hέᝀyO=X Bdgxi:`0F,0 SZ678{18{SKUa͠0{)GY a A,]T:+U9Iqk«ӧE΋"zM6 H$(^+А^JA E~nbw#Fu/8$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$_- endstream endobj -2368 0 obj +2461 0 obj << /Filter /FlateDecode /Type /XObject @@ -100206,7 +102258,7 @@ stream x1 0g8*X6ZbGvaGvaGvaGvaGvaGvaGvaGvaGvaGvaGvaGvaGvaGvaGjw endstream endobj -2369 0 obj +2462 0 obj << /Type /XObject /Subtype /Image @@ -100221,7 +102273,7 @@ endobj /Columns 773 /Colors 3 >> -/SMask 2370 0 R +/SMask 2463 0 R /Length 149970 >> stream @@ -100721,7 +102773,7 @@ kݺ U&5VE R5bU0]iحV+叏 t:;ٞ;{mqSd* 9oڥzӲzA;]s$ =2 J??͝lh> -/SMask 2372 0 R +/SMask 2465 0 R /Length 114393 >> stream @@ -101265,7 +103317,7 @@ w <'X EZ>,27?; B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* B*""" @* "~\N&,˾|s^)%@*/bB|kRo޼A*;csj2|4}m6}1??<&ݝ endstream endobj -2372 0 obj +2465 0 obj << /Filter /FlateDecode /Type /XObject @@ -101285,7 +103337,7 @@ stream xA χ Hh5xP>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>T endstream endobj -2373 0 obj +2466 0 obj << /Type /XObject /Subtype /Image @@ -101300,7 +103352,7 @@ endobj /Columns 766 /Colors 3 >> -/SMask 2374 0 R +/SMask 2467 0 R /Length 121085 >> stream @@ -101690,7 +103742,7 @@ JI :ԚM}_ىӫqY*:gNZ8aE>ӂLcojs/5]Lz7z&M٢n 7rSs'!21!J) j3!1qaG3O1{^}宛g:!γ675eGPB -XA/J>k]q (óX#8g.&KJsXjkp}P\>䅟ݢ:VAKC/ۃ@>|JSJ"vf~\Ay{B%_4z_'\[=|>'O~[G_E??_Z?<;+'Z> 8c|=g)U 91NsZ\I9H k_kLJc7N#?+>=&&e^?/'}>镅1b!r$dZ_3W*}O+BՆPD}ޭL,>o+J>? 45Q>\ }"@pE_Gie{I]?k+Oy6 d /R +WH>\ }"@pEx!/ PUR N)>^>]?|nooyf׶E0?pu }޾?Ku]}͛?m۶w|_d۶7m:^TU|(s!R[/4/HmڶKP'WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+WH>\ }"@pE+W|ڶUJk_>B?3@)" }1&Xk^[ 6g>\ }" endstream endobj -2374 0 obj +2467 0 obj << /Filter /FlateDecode /Type /XObject @@ -101710,7 +103762,7 @@ stream x1 0!cG=z@='ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0fO ?a'ٟ0f>k endstream endobj -2375 0 obj +2468 0 obj << /Type /XObject /Subtype /Image @@ -101725,7 +103777,7 @@ endobj /Columns 901 /Colors 3 >> -/SMask 2376 0 R +/SMask 2469 0 R /Length 3790 >> stream @@ -101760,7 +103812,7 @@ x @&}L(Q2dGȤI d:}M.ޏI V endstream endobj -2376 0 obj +2469 0 obj << /Filter /FlateDecode /Type /XObject @@ -101780,7 +103832,7 @@ stream x1 0 }:[z. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. Bj. endstream endobj -2377 0 obj +2470 0 obj << /Type /XObject /Subtype /Image @@ -101795,7 +103847,7 @@ endobj /Columns 847 /Colors 3 >> -/SMask 2378 0 R +/SMask 2471 0 R /Length 5720 >> stream @@ -101812,7 +103864,7 @@ Sɛ/ ^[üRI 6k:ݏaP+ѭ[7J}k=†ݐgHLMh}{}n fL{1c@̘bƴ3=ѷ?QRSIUHw3O^R\}+7۾uʂ{Pͧz+w밷\*̌* |}b-)=1Či fL{1cЖ endstream endobj -2378 0 obj +2471 0 obj << /Filter /FlateDecode /Type /XObject @@ -101833,7 +103885,7 @@ x $= ?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOйzg endstream endobj -2379 0 obj +2472 0 obj << /Type /XObject /Subtype /Image @@ -101848,7 +103900,7 @@ endobj /Columns 770 /Colors 3 >> -/SMask 2380 0 R +/SMask 2473 0 R /Length 119052 >> stream @@ -102350,7 +104402,7 @@ V p4$<cy6 :==5i:OOJ>gà?_3^Iqjà?}r| GEeA@= _P~MP)aA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@AaA8P@o}~C1*MS0c_W[ 8 0ƄzR~>oRp_o} /?q endstream endobj -2380 0 obj +2473 0 obj << /Filter /FlateDecode /Type /XObject @@ -102370,7 +104422,7 @@ stream x1 0!cG}z@] Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@& endstream endobj -2381 0 obj +2474 0 obj << /Type /XObject /Subtype /Image @@ -102385,7 +104437,7 @@ endobj /Columns 768 /Colors 3 >> -/SMask 2382 0 R +/SMask 2475 0 R /Length 108398 >> stream @@ -102880,7 +104932,7 @@ e2 >4Om߽n뺞N\t:=#t:f<Ғ|ZA6l6d2YO`P. S8 LtzH$~b8bəNs|||ttpWߢZvyI.˷:?aՃ. $ihT*n|FyF!K^yHRbtjSoŒL&Raw=#ouvv/p+{&BzMѨiӵZMӴɼlJ8Hig0DZF\Jeő'JlptIJ徭Rz%%>6B4zT*]Yj=Nsrr2fƖJ[& CPuY6o^Rpn&BVq&V[TyHד[2iI\rs)U'_f5M;?{_JLj)ɝRގ9̷Y$aK98?S!7>T<==@&wqkhffF-SB?w6dIla19(=C8g~D]cg>Ic}wr@@9 P(C!r@@9 P(C!r#^s8>o0[k8N:==ܫQhee믿pfu TvϷLjF~ޚg333evvb|jTvޚp?C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r@@9 P(C!r`iZ-g0D"^g2>v[I!gzzzffnJnLt\mWA{5g>~F0tUiZ&izzou_"n<Af endstream endobj -2382 0 obj +2475 0 obj << /Filter /FlateDecode /Type /XObject @@ -102900,7 +104952,7 @@ stream x1 0!cG}z@M 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i 4f @H3i  endstream endobj -2383 0 obj +2476 0 obj << /Type /XObject /Subtype /Image @@ -102915,7 +104967,7 @@ endobj /Columns 775 /Colors 3 >> -/SMask 2384 0 R +/SMask 2477 0 R /Length 104078 >> stream @@ -103368,7 +105420,7 @@ N@C {%$ -@nocx pE+(W0\@" WP`"rE+\pE+(W0\@" WP`"rE+\pE+(W0\@" WP`"rE+\pE+(W0\@" WP`"rE+\pE+(W0\@"}>|>zmsEa~O-q۶-u߯1npu]C endstream endobj -2384 0 obj +2477 0 obj << /Filter /FlateDecode /Type /XObject @@ -103388,7 +105440,7 @@ stream xA χ Hh5xP>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|(@P>|U? endstream endobj -2385 0 obj +2478 0 obj << /Type /XObject /Subtype /Image @@ -103403,7 +105455,7 @@ endobj /Columns 770 /Colors 3 >> -/SMask 2386 0 R +/SMask 2479 0 R /Length 104505 >> stream @@ -103821,7 +105873,7 @@ S \Px>gv 0M88k8ź˲RJ) endstream endobj -2386 0 obj +2479 0 obj << /Filter /FlateDecode /Type /XObject @@ -103841,7 +105893,7 @@ stream x1 0!cG}z@] Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q YJ{ endstream endobj -2387 0 obj +2480 0 obj << /Type /XObject /Subtype /Image @@ -103856,7 +105908,7 @@ endobj /Columns 770 /Colors 3 >> -/SMask 2388 0 R +/SMask 2481 0 R /Length 119685 >> stream @@ -104363,7 +106415,7 @@ A~ AA. *u?{-4M2A_99kA7Gk2A!J)cLk`A7G)E^  O- \((AD>| AA.'?/٫BAy_iQW| endstream endobj -2388 0 obj +2481 0 obj << /Filter /FlateDecode /Type /XObject @@ -104383,7 +106435,7 @@ stream x1 0!cG}z@] Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 g,@q Y8 0x endstream endobj -2389 0 obj +2482 0 obj << /Type /XObject /Subtype /Image @@ -104398,7 +106450,7 @@ endobj /Columns 767 /Colors 3 >> -/SMask 2390 0 R +/SMask 2483 0 R /Length 108864 >> stream @@ -104774,7 +106826,7 @@ D endstream endobj -2390 0 obj +2483 0 obj << /Filter /FlateDecode /Type /XObject @@ -104794,7 +106846,7 @@ stream x1 0!cG=z@E2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)?e2SO)2, endstream endobj -2391 0 obj +2484 0 obj << /Type /XObject /Subtype /Image @@ -104809,7 +106861,7 @@ endobj /Columns 777 /Colors 3 >> -/SMask 2392 0 R +/SMask 2485 0 R /Length 110124 >> stream @@ -105265,7 +107317,7 @@ c? )J_?SP?k endstream endobj -2392 0 obj +2485 0 obj << /Filter /FlateDecode /Type /XObject @@ -105285,7 +107337,7 @@ stream x10axtS% ;('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8 0Nr('8> endstream endobj -2393 0 obj +2486 0 obj << /Type /XObject /Subtype /Image @@ -105300,7 +107352,7 @@ endobj /Columns 1280 /Colors 3 >> -/SMask 2394 0 R +/SMask 2487 0 R /Length 81155 >> stream @@ -105565,7 +107617,7 @@ e ::UU{eo޲Fcb t endstream endobj -2394 0 obj +2487 0 obj << /Filter /FlateDecode /Type /XObject @@ -105585,7 +107637,7 @@ stream x1 0!cGz4-d e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@W endstream endobj -2395 0 obj +2488 0 obj << /Type /XObject /Subtype /Image @@ -105600,7 +107652,7 @@ endobj /Columns 1172 /Colors 3 >> -/SMask 2396 0 R +/SMask 2489 0 R /Length 17657 >> stream @@ -105666,7 +107718,7 @@ G ` !B!qR endstream endobj -2396 0 obj +2489 0 obj << /Filter /FlateDecode /Type /XObject @@ -105686,7 +107738,7 @@ stream x1 0^ݳ:))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@))bJ@ endstream endobj -2397 0 obj +2490 0 obj << /Type /XObject /Subtype /Image @@ -105701,7 +107753,7 @@ endobj /Columns 1848 /Colors 3 >> -/SMask 2398 0 R +/SMask 2491 0 R /Length 539454 >> stream @@ -107412,7 +109464,7 @@ A Ra+FsGQ;ZDdH(d,!p}|Dz5(0+I!=P,bЊ(aCڔl,@L99O#aXN\',;̙u(s;haD"ip8:2pY/7mלv P&Vdwbd /p.C 9<6rhWȤXy8ԸquW c"uͽg$Jcm Qr0{GJ_@DRHҥpp?J)Sݐ1/gl$T]KT0 1桋!ehH$92DK) Zg5 p "ȑy DD$|9#H3 R *s@$Xkp.9 m9m4RƆ#^fJtg2;KLH `Od|vVWD;̈dke)th &NMOo vDD.Z c]olᛴY١̱yo2u:_[3i&C$2~\ yG4 endstream endobj -2398 0 obj +2491 0 obj << /Filter /FlateDecode /Type /XObject @@ -107432,7 +109484,7 @@ stream x1 0g.B*طpk' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@p7 endstream endobj -2399 0 obj +2492 0 obj << /Type /XObject /Subtype /Image @@ -107447,7 +109499,7 @@ endobj /Columns 1840 /Colors 3 >> -/SMask 2400 0 R +/SMask 2493 0 R /Length 515273 >> stream @@ -109134,7 +111186,7 @@ t ADidV)אRys Fǹ J,T'mU;uD5JkBɔ rj+תmMDd7+0`)66m:m?hG^ƫhO~Ui}]f~^s^6$ܩ׵͹MYgꜭZnž0/ :C9t1 endstream endobj -2400 0 obj +2493 0 obj << /Filter /FlateDecode /Type /XObject @@ -109154,7 +111206,7 @@ stream x1 0g>B*طp^ 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L P endstream endobj -2401 0 obj +2494 0 obj << /Type /XObject /Subtype /Image @@ -109169,7 +111221,7 @@ endobj /Columns 1834 /Colors 3 >> -/SMask 2402 0 R +/SMask 2495 0 R /Length 532957 >> stream @@ -110886,7 +112938,7 @@ Cʈ$ ~sHޢ ,/x݀.9ܼKW)U%7®2D y^|*\/> -/SMask 2404 0 R +/SMask 2497 0 R /Length 539494 >> stream @@ -112695,7 +114747,7 @@ r #I#F9Ǎk6<]E圦;pSѺ uh}r @2 h `d RG"tmb3FDtIM Qr0k?jAI!@"ѫKU5(LBƸC1"3ee0ĸI!eD$<"CΥAGsnA$92Bt!dL.7^X2 $9cč'k4r%rn@h97V)a|b;3k{͇MƚRs2rZM-+ۦm7ʍׯΈe7S@i/RM0Zmt>LGNFkN~MIc]j~d6s]Y ׶7]HꜮ5OaGAGXt2 ZldA4sEdqR3L"ZO5I$@"4gL!BI $.BF Й*| \!C7NI'WJArV)"ł$ 3 n5`pRJÌH5muL56ɕB$n pt5S""MY%k4$.-)+[.4rkM)K$~ԏru)nX ).PHWMn\ca=;c s>w隁smF;pl&rnH,7>֥VGFϖ}WuX8Rڤ٣cMʄAde6 2 "uxQ  PLHRb+u=:$^望zӫAG,)tF<….k-k_rRζr7rqS`悈R}luNrorS.@O;dRzG\;My:9eM%+'#nK䶢-o´6$[ȵ{hӏM75P &2 2W* 2 2Td3$A埴"Z*Ƥ;æ霣%rf!ݠ0LcNr\bt.7U&mE*7]?jkR܎õmԣ-:-9ոP.0$"i3t4[n(ޅ!yuu&~2 27{4h endstream endobj -2404 0 obj +2497 0 obj << /Filter /FlateDecode /Type /XObject @@ -112715,7 +114767,7 @@ stream xA 0~U, 8 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4 g@x&4^ endstream endobj -2405 0 obj +2498 0 obj << /Type /XObject /Subtype /Image @@ -112730,7 +114782,7 @@ endobj /Columns 1845 /Colors 3 >> -/SMask 2406 0 R +/SMask 2499 0 R /Length 539274 >> stream @@ -114501,7 +116553,7 @@ B Z~Jȵ9FPiڳ.127!s8ٖk;ntWvr 9.V$ rc:Z7|컪g>=`iLιNۤLdAg3 2Ƞ.0hj@ )YR*R!".gwͯC7\NI` HvY\r+M );k "ulr[or-ɝ]p)z#RKyBpӼIpKrӵ@d bsGc0mIr#xӵvqfVdA;}2 2 +!'(f!IH1+$ĄҊ\Nk59GG:̚C.&D a~Ȝȵn/bt.תswM׏Zn#pm-z#\!#:[MmI"6CG嶻]r7]\m, 2 dAdAdAdAdAXثd{ֲKz݃L-k2uȔm֢`Ӷ$!Q MЊtrvDmF>auCspmyھ$%krn\UbvC~۝/H9w̍SYn;p;}Xs~䜛!$7UV=Mo2EadNL| gXdӂ9L9%Yi`(/O<5*ZtrUnhw4gʍrmVzGuv%"+VcSK;[榃`m~m;,gr׶5bsr2Y[Iw(mÖktڢs;r#:µU9Զ">萛nOu֌8Z6q~`f=Ad/l endstream endobj -2406 0 obj +2499 0 obj << /Filter /FlateDecode /Type /XObject @@ -114521,7 +116573,7 @@ stream xA 0~U, 9 k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T k@P&T ˱ endstream endobj -2407 0 obj +2500 0 obj << /Type /XObject /Subtype /Image @@ -114536,7 +116588,7 @@ endobj /Columns 513 /Colors 3 >> -/SMask 2408 0 R +/SMask 2501 0 R /Length 19372 >> stream @@ -114601,7 +116653,7 @@ OEL %斒ɹXуƗ*t]36F$x\%1%r`|xA|MN,.W[rҥ7AЮ~ 6A9ߌCAO~U(7~7R o??9 _*A7O]U $w+m i+xR& AB$  .hAN x |{ rZ A? B rv@mG '6Ap׵"hA<|ۍJ8JgCA<gJ2g?;oI"/ /hAڗf endstream endobj -2408 0 obj +2501 0 obj << /Filter /FlateDecode /Type /XObject @@ -114621,7 +116673,7 @@ stream x1 0!cG=zX:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P:9us@P瀺5 endstream endobj -2409 0 obj +2502 0 obj << /Type /XObject /Subtype /Image @@ -114636,7 +116688,7 @@ endobj /Columns 1840 /Colors 3 >> -/SMask 2410 0 R +/SMask 2503 0 R /Length 27536 >> stream @@ -114725,7 +116777,7 @@ $־t Jk`o4z\7i'|Z "@'{oOstuZIRa:05m7"( y~  ,QDEa_)aHBcjWjI D@NYĎzegr1scuvr/hBLdIMLz>PJn"]_b/@KӺTz97'j~hBD?j3snE|ڬMُzSB!봞K)O2{AUQ;o槾DIS7OYn>?EQDEb!d1}"("/jB R@j$t:Y Bowgeoxzֱt1;}tF>Z?^ּKu M 9 o_AOhujv,|S tS_5] "("6?)` endstream endobj -2410 0 obj +2503 0 obj << /Filter /FlateDecode /Type /XObject @@ -114745,7 +116797,7 @@ stream x1 0g>B*طp^ 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L 0 0L ,<E endstream endobj -2411 0 obj +2504 0 obj << /Type /XObject /Subtype /Image @@ -114760,7 +116812,7 @@ endobj /Columns 171 /Colors 3 >> -/SMask 2412 0 R +/SMask 2505 0 R /Length 1285 >> stream @@ -114769,7 +116821,7 @@ D Ǥ[V(}$BaDz}7nWTrK}g{,xyŒ2xOv8⸸BD)"vvt455QRkQ+zڴ绻m=}"}Qt@erZeeU]]-9YyoY =q%3^ʘ%<̙!c` @~3ӳg3ufcbB˹-v룄kX' !"IEmEVe0|ٖJ @(s>זʫ$k@@6|@n|foEEٔ$۶SJEI޸yˮ;&N|vҤ  DF]F; A(DQ=Q8^iRJ("RJ 93ZM"ˠ1rq.נ(ᄎj5”ɓ-iiܺ$>A<0EEQ׀Ds6/uO8PFED%@#ceO7.Շ4V:F)1rt @ nCc<ּM4pQc ѽ)|"2?Q?Du@: QuT: endstream endobj -2412 0 obj +2505 0 obj << /Filter /FlateDecode /Type /XObject @@ -114789,7 +116841,7 @@ stream xA 1g`F]22222222e# endstream endobj -2413 0 obj +2506 0 obj << /Type /XObject /Subtype /Image @@ -114804,7 +116856,7 @@ endobj /Columns 171 /Colors 3 >> -/SMask 2414 0 R +/SMask 2507 0 R /Length 1135 >> stream @@ -114813,7 +116865,7 @@ x 3+]!Q)^*̻ &[xPSV2IZF@9Or_@TzdyZ.7PNp9ͣ0X> -/SMask 2416 0 R +/SMask 2509 0 R /Length 257079 >> stream @@ -115660,7 +117712,7 @@ D ZU62l98]/xRvVf;\s 7M}{Ω*tVIYMV7,Q} llQϞZq2ڨv+ەt*>qkxz3l8vInuƌōֳkNyVI&7p}sx$#js<(` @YYTo~8F< qMVǬD}Y乙Җ f~~CpQjfϚR9VWEcrڿtsD}fgu0o)}gW9Gٜκmвfՙn)%IL~j2M[`V"rVfE.oY{noXgmFܯ^ԇr\g=&&֤ R)Ik)XK)Yɋۤ+JY\.YOOzgJ^Jԝ<$Lf\\4aIu;vT28٤(6Y"۩Q/- YmK>oEe`F^cCb,)b EڒWR:3 Nv6 ;uL΁u_,}er趿ώ(K N y7^ZoYL#L_6#JhmymIR>Gǎ~n~ZKnrǟRw_}gBպ]}.H:Nfgeɉ{[ ̾l.^1òذVO ҕzm|ZTu%[ok'm3^3aiGG'sK)YN Nl7]g^ǰZ2)CQtp5Smu]nNc9wu嗽kKrW}Z/ș#TGН]=qιy^,\.3[uotuņd>|MAooonpN7|&#9OOOG7o> -/SMask 2418 0 R +/SMask 2511 0 R /Length 21101 >> stream @@ -115765,7 +117817,7 @@ W+8J ,vD!avD!.B!\r5\c6ϸfIIɖ-[~FmGBI ""km|vD!DDD4}z󨾇0;"B8ޙb- endstream endobj -2418 0 obj +2511 0 obj << /Filter /FlateDecode /Type /XObject @@ -115785,7 +117837,7 @@ stream xA 0CBBZ{lςyE_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_.^F endstream endobj -2419 0 obj +2512 0 obj << /Type /XObject /Subtype /Image @@ -115800,7 +117852,7 @@ endobj /Columns 1848 /Colors 3 >> -/SMask 2420 0 R +/SMask 2513 0 R /Length 506775 >> stream @@ -117361,7 +119413,7 @@ A a$ FPDkڠܰt[nx}Fͪb FDجo"O]%Wf[n͐D㨽&*1r;ײZro m~rr Fg$Ir[F!M>i,$H"= ɴI$DI=KDI$DI$DI$D'ft{m/`It0\$-2$~H6xS0cXjb̴&DrDԶFeEl^aɵM}p-l}-o%&-ljb\}Pk [c ƹJmnOk6m;s]ݲS٪ݒ$,I$# vɮDI``)9 ʨpͯZH.]ob`s#k\Kn<5\:Q:V]܈9:P%8Y5\Ke:˘Am)B6XggMn,͟-1O%DI endstream endobj -2420 0 obj +2513 0 obj << /Filter /FlateDecode /Type /XObject @@ -117381,7 +119433,7 @@ stream x1 0g.B*طpk' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`' q@`m endstream endobj -2421 0 obj +2514 0 obj << /Type /XObject /Subtype /Image @@ -117396,7 +119448,7 @@ endobj /Columns 1821 /Colors 3 >> -/SMask 2422 0 R +/SMask 2515 0 R /Length 539259 >> stream @@ -119287,7 +121339,7 @@ n` MdO"WPJww*\ qt[)b)1;<7-- m5 bI7E3W; ; -aHPsݻoݯ{緐 endstream endobj -2422 0 obj +2515 0 obj << /Filter /FlateDecode /Type /XObject @@ -119307,7 +121359,7 @@ stream xձ03>\Эs^w@w endstream endobj -2423 0 obj +2516 0 obj << /Type /XObject /Subtype /Image @@ -119322,7 +121374,7 @@ endobj /Columns 1845 /Colors 3 >> -/SMask 2424 0 R +/SMask 2517 0 R /Length 544180 >> stream @@ -121141,7 +123193,7 @@ z¾ nٸ=Onۆe۸ZEPTT*xœ@Ӵ.L> -/SMask 2426 0 R +/SMask 2519 0 R /Length 30419 >> stream @@ -121279,7 +123331,7 @@ z0\ dϦY.+1Z 2ddk\,% @)˛Wj%YjY9vغEHcW7U 6waQzZ/t)))ZzZ*eyJRRk/T,_\fXU:Yye-/""**.Դtдy%QQq(2SYn+2EHNR7"tZ<tzf[fki8) V_:;7==wv~BvZ7E۽8A:бfe3R*7Rٖrʘm<-[-J٭N-RVVfefh/yMqYzh5%4;c>-^N3rrfPplNyS3 *R׬-n[$ǕWFT633؝8(ojN;8$5$?؝]Y433'̩榷1m*S)ګmwTfd|(((\Y޼rw>̌s,2Lw~F2"( ZY_'hYGx[WzniqRYm\vde*xDGKϝKY#sKS# *_Q9 7u^#Ї`d(!,twHS}G3#(uYg]yNs,[?w(uEu$؈())骫w(#V­ZYYβ~%  u0ڙRJ 1#D8yG3 Q@:@T*@T@FV̺ed[h4QGVtv#GHGR|8ԴUBX(hѢܼlٲN, >#w0C:ٿ endstream endobj -2426 0 obj +2519 0 obj << /Filter /FlateDecode /Type /XObject @@ -121299,7 +123351,7 @@ stream xA 0CBBZ{lςyE_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_.u# endstream endobj -2427 0 obj +2520 0 obj << /Type /XObject /Subtype /Image @@ -121314,7 +123366,7 @@ endobj /Columns 582 /Colors 3 >> -/SMask 2428 0 R +/SMask 2521 0 R /Length 24987 >> stream @@ -121390,7 +123442,7 @@ y< xB]??<Nwۂ}PL;hr^W![iC]G7mZ?xG> -/SMask 2430 0 R +/SMask 2523 0 R /Length 14549 >> stream @@ -121484,7 +123536,7 @@ YeG (hȡ P5G Fi0So~QVC姨 03;m$r6H;J7䖫i_z4t endstream endobj -2430 0 obj +2523 0 obj << /Filter /FlateDecode /Type /XObject @@ -121509,7 +123561,7 @@ x AqG endstream endobj -2431 0 obj +2524 0 obj << /Type /XObject /Subtype /Image @@ -121524,7 +123576,7 @@ endobj /Columns 872 /Colors 3 >> -/SMask 2432 0 R +/SMask 2525 0 R /Length 16208 >> stream @@ -121585,7 +123637,7 @@ H!  6ia}5 8T3rlcsyLEN>B gfʲvJҿ?悟3?۲36%v`` KAcwqƚn9aKr4eU`TNO&`,}]kЁ%CvA?!nQCP#_[]".{[:r4[y:kR"KhUJ&(~e7ƈa=ܭB,`,\K|Rl4NwSYgbۜt=+m^Sտ?kW11\$]4 %.z‘$I܌ E8*ꝍV~h̀^S| MalXWTy\AYD"z[}EWW RDR9(*a|jޗ'b OaDT:QL B$p,Uf{&\s`9//v_`RG~B p}" N2",&(*_rCJJ(leFc33thB}tNf2:E9CڈMdӊW{ WҦRdlT "AMSJ"BYv%F§[*bffz47M$<[vګ ADi6˫ruMSҶ5&xl endstream endobj -2432 0 obj +2525 0 obj << /Filter /FlateDecode /Type /XObject @@ -121605,7 +123657,7 @@ stream xӱ03WArA= `4 F `4 F `4 F `4 F `4 F `4 F p5 endstream endobj -2433 0 obj +2526 0 obj << /Type /XObject /Subtype /Image @@ -121620,7 +123672,7 @@ endobj /Columns 607 /Colors 3 >> -/SMask 2434 0 R +/SMask 2527 0 R /Length 18321 >> stream @@ -121700,7 +123752,7 @@ t `tB:X!VHG-78 endstream endobj -2434 0 obj +2527 0 obj << /Filter /FlateDecode /Type /XObject @@ -121720,7 +123772,7 @@ stream xA 0CBBZ{lςyE_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_E_.յ endstream endobj -2435 0 obj +2528 0 obj << /Type /XObject /Subtype /Image @@ -121735,7 +123787,7 @@ endobj /Columns 952 /Colors 3 >> -/SMask 2436 0 R +/SMask 2529 0 R /Length 321098 >> stream @@ -122810,7 +124862,7 @@ T* Xl||<cAA20 i݀^   9   r(PFAAsL1 endstream endobj -2436 0 obj +2529 0 obj << /Filter /FlateDecode /Type /XObject @@ -122830,7 +124882,7 @@ stream xA 0C/U, Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bq!ȸd\2. Aƅ Bmk endstream endobj -2437 0 obj +2530 0 obj << /Type /XObject /Subtype /Image @@ -122845,14 +124897,14 @@ endobj /Columns 97 /Colors 3 >> -/SMask 2438 0 R +/SMask 2531 0 R /Length 223 >> stream x Eu3ae\t> -/SMask 2440 0 R +/SMask 2533 0 R /Length 237 >> stream x Dqe@CasB!2 ӽYfXkk"Ԥxv:Al}/.ȝGȐ$Z `& ,."PYz'FSᬻJpy]0ƕ.Թ*dlpj 2H DJI HkvvMg~zO:M*YґוB!:~ endstream endobj -2440 0 obj +2533 0 obj << /Filter /FlateDecode /Type /XObject @@ -122915,7 +124967,7 @@ stream xA  gMq@oELz^zSG endstream endobj -2441 0 obj +2534 0 obj << /Type /XObject /Subtype /Image @@ -122930,14 +124982,14 @@ endobj /Columns 97 /Colors 3 >> -/SMask 2442 0 R +/SMask 2535 0 R /Length 271 >> stream x De{HXEMξc\D!B!Y\N跟kY7PDiZFuV Qڑ!MbT .ao #ӭ13ysNG'S^P5J (g ;#k Z8_>2چ[ۻ;1G#˧o%w =2>W<`>2~I^M3Q ٻeAuyF}Os۔B!Н4 endstream endobj -2442 0 obj +2535 0 obj << /Filter /FlateDecode /Type /XObject @@ -122958,7 +125010,7 @@ x & `0 ëG endstream endobj -2443 0 obj +2536 0 obj << /Type /XObject /Subtype /Image @@ -122973,7 +125025,7 @@ endobj /Columns 348 /Colors 3 >> -/SMask 2444 0 R +/SMask 2537 0 R /Length 1085 >> stream @@ -122991,7 +125043,7 @@ t? >z)gX6ũ+)rUj.eH*}N4O>B-kΖ~JQ*m!)UV14y endstream endobj -2444 0 obj +2537 0 obj << /Filter /FlateDecode /Type /XObject @@ -123011,7 +125063,7 @@ stream x @7.؞E!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27dnܐ!sC 27t endstream endobj -2445 0 obj +2538 0 obj << /Type /XObject /Subtype /Image @@ -123026,7 +125078,7 @@ endobj /Columns 388 /Colors 3 >> -/SMask 2446 0 R +/SMask 2539 0 R /Length 1115 >> stream @@ -123035,7 +125087,7 @@ x a$SNO7hY.UA[޽/M݈N~Y33JKZGAF_?lŗ$0Z'!{'(9aBg, \&Vŗ6>086JUhxJq7 {iimA2};8QëGt`q_XՔ endstream endobj -2446 0 obj +2539 0 obj << /Filter /FlateDecode /Type /XObject @@ -123056,7 +125108,7 @@ x z;mo;L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L0!L endstream endobj -2447 0 obj +2540 0 obj << /Type /XObject /Subtype /Image @@ -123071,7 +125123,7 @@ endobj /Columns 101 /Colors 3 >> -/SMask 2448 0 R +/SMask 2541 0 R /Length 2562 >> stream @@ -123082,7 +125134,7 @@ x '2 %Λ`Q(Fn":g{Y]:-^hhx9c'Y4ap2}vSc=}B8G+':%"n.>ω.ECf[D^/T4FZnyg.8 V0~r4D9h|C?_ϗ9e|} endstream endobj -2448 0 obj +2541 0 obj << /Filter /FlateDecode /Type /XObject @@ -123103,7 +125155,7 @@ x &X,bX,a9\QG endstream endobj -2449 0 obj +2542 0 obj << /Type /XObject /Subtype /Image @@ -123118,7 +125170,7 @@ endobj /Columns 101 /Colors 3 >> -/SMask 2450 0 R +/SMask 2543 0 R /Length 2208 >> stream @@ -123136,7 +125188,7 @@ B bmmkD"QrrR$IXa5t($hv:( GB~_oL8"a/xm6#G&oָGT@m$~ݗh>og&3pAu#{gtٟX7W^D~_B|C/~i endstream endobj -2450 0 obj +2543 0 obj << /Filter /FlateDecode /Type /XObject @@ -123157,7 +125209,7 @@ x &X,bX,a9\QG endstream endobj -2451 0 obj +2544 0 obj << /Type /XObject /Subtype /Image @@ -123172,7 +125224,7 @@ endobj /Columns 101 /Colors 3 >> -/SMask 2452 0 R +/SMask 2545 0 R /Length 292 >> stream @@ -123180,7 +125232,7 @@ x :Px9 }/O_Tsُ$Q͋_xҗ9\/gm~͘yO)a?E3/*Ym ^*slޭ_Tn^nfYm\w~LY=)Kd[JVEf>~ul!_fGڌ Gj3܍z__ /|1!_ bCŐ/|1>lQ endstream endobj -2452 0 obj +2545 0 obj << /Filter /FlateDecode /Type /XObject @@ -123201,7 +125253,7 @@ x &X,bX,a9\QG endstream endobj -2453 0 obj +2546 0 obj << /Type /XObject /Subtype /Image @@ -123216,7 +125268,7 @@ endobj /Columns 404 /Colors 3 >> -/SMask 2454 0 R +/SMask 2547 0 R /Length 9205 >> stream @@ -123245,7 +125297,7 @@ mnn"_ 藠 A 4JThEO,LT< <b> endstream endobj -2454 0 obj +2547 0 obj << /Filter /FlateDecode /Type /XObject @@ -123280,7 +125332,7 @@ x Qd (@Fi(8RVa9"OWV7W٬ &rRR%Ѷq)'@DJۗ\Q "}ܜfH_D endstream endobj -2455 0 obj +2548 0 obj << /Type /XObject /Subtype /Image @@ -123295,7 +125347,7 @@ endobj /Columns 404 /Colors 3 >> -/SMask 2456 0 R +/SMask 2549 0 R /Length 1346 >> stream @@ -123306,7 +125358,7 @@ i JyEj?Wۮ:3/}~OUuzGx΄﷥@N묓:wxvwߜY펹F?W=*)$H $H $H $H $H $H $H $H $H $H $H $H $H $H $H $H $H $H $H $H $?kx endstream endobj -2456 0 obj +2549 0 obj << /Filter /FlateDecode /Type /XObject @@ -123326,7 +125378,7 @@ stream x 0_o +T3f>˚N7eJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)AdJ)A. endstream endobj -2457 0 obj +2550 0 obj << /Type /XObject /Subtype /Image @@ -123341,7 +125393,7 @@ endobj /Columns 202 /Colors 3 >> -/SMask 2458 0 R +/SMask 2551 0 R /Length 687 >> stream @@ -123349,7 +125401,7 @@ x ўc[c3H+jpk=oKO&C@}hԑJipMM%zxr*[}m=&Zn}bg@@'.Os4S-{.F>oT0in{&싣|4% % % % % % % % % % % % % % % % % % % % % % ?V endstream endobj -2458 0 obj +2551 0 obj << /Filter /FlateDecode /Type /XObject @@ -123369,7 +125421,7 @@ stream x 0g-!8K=~^ӊQ+VDZ"jEԊQ+VDZ"jEԊQ+VDZ"jEԊQ+VDZ"jEԊQ+* endstream endobj -2459 0 obj +2552 0 obj << /Type /XObject /Subtype /Image @@ -123384,7 +125436,7 @@ endobj /Columns 75 /Colors 3 >> -/SMask 2460 0 R +/SMask 2553 0 R /Length 1753 >> stream @@ -123399,7 +125451,7 @@ E D7 T(#wkd朤B5֚!6~Ko8n endstream endobj -2460 0 obj +2553 0 obj << /Filter /FlateDecode /Type /XObject @@ -123419,7 +125471,7 @@ stream xA0>!:wr\.U0uG endstream endobj -2461 0 obj +2554 0 obj << /Type /XObject /Subtype /Image @@ -123434,7 +125486,7 @@ endobj /Columns 1347 /Colors 3 >> -/SMask 2462 0 R +/SMask 2555 0 R /Length 9550 >> stream @@ -123448,7 +125500,7 @@ x >kw@'J:QЉN<t%(yD@'J:QЉN<t%(yD@'J:QЉN<t%(yd:I֖RSU5n6> -/SMask 2464 0 R +/SMask 2557 0 R /Length 40741 >> stream @@ -123881,7 +125933,7 @@ a ne!,    nС  V%t(  U   `UB2  XС  V%t(  U   `U?1Q endstream endobj -2464 0 obj +2557 0 obj << /Filter /FlateDecode /Type /XObject @@ -123902,7 +125954,7 @@ x t*up2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap2 !Ap5 endstream endobj -2465 0 obj +2558 0 obj << /Type /XObject /Subtype /Image @@ -123917,14 +125969,14 @@ endobj /Columns 420 /Colors 3 >> -/SMask 2466 0 R +/SMask 2559 0 R /Length 1429 >> stream xA A[r&PM#SlBW)Wgw~AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; As<; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; Azt v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ b$ v@ c_WoγH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; a\nH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH; AH8 endstream endobj -2466 0 obj +2559 0 obj << /Filter /FlateDecode /Type /XObject @@ -124049,7 +126101,7 @@ x 8M1G endstream endobj -2467 0 obj +2560 0 obj << /Type /XObject /Subtype /Image @@ -124132,7 +126184,7 @@ K (>|Cqx_QKZ%.J`̮$++O~!Fl$ Nۢ 0d, 8M}W@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@W=~5 ܋?7H lN$+9T݌y@ endstream endobj -2468 0 obj +2561 0 obj << /Type /XObject /Subtype /Image @@ -124147,7 +126199,7 @@ endobj /Columns 22 /Colors 3 >> -/SMask 2469 0 R +/SMask 2562 0 R /Length 877 >> stream @@ -124159,7 +126211,7 @@ x endstream endobj -2469 0 obj +2562 0 obj << /Filter /FlateDecode /Type /XObject @@ -124179,7 +126231,7 @@ stream xcπ 0a0,# endstream endobj -2470 0 obj +2563 0 obj << /Type /XObject /Subtype /Image @@ -124194,7 +126246,7 @@ endobj /Columns 22 /Colors 3 >> -/SMask 2471 0 R +/SMask 2564 0 R /Length 825 >> stream @@ -124203,7 +126255,7 @@ x U6}󯯗R}L_f#ݬNrS-l ZǃΙov;p\e-WO/MW#4T '3wVSV%'Xܪ(0$ĀNb%7kk:Vd 9m j9¸{LoN endstream endobj -2471 0 obj +2564 0 obj << /Filter /FlateDecode /Type /XObject @@ -124223,7 +126275,7 @@ stream xcπ 0a0,# endstream endobj -2472 0 obj +2565 0 obj << /Type /XObject /Subtype /Image @@ -124238,14 +126290,14 @@ endobj /Columns 216 /Colors 3 >> -/SMask 2473 0 R +/SMask 2566 0 R /Length 875 >> stream xNH@QgهH ZvFgP\,Gp_?}pB$B$! DHI" B$A$! DHI" B$A$! DHI" B$A$! DHI" B$A$! DHI" B$A$󜏹nm1yϻ-=\^t{o)֪ϟZi^.2mmޒiyko~h\>opk=)įB6$^M=}[4CtCdB|M!zu3!2I" B$A$! D!d׹HB$A$! DHI" B$A$! DHI" B$A$! DHI" B$!kz׹H[N\m"K$! DHV!wt.s9!~oo6uR43罼fu91$~olECgOᬵ!f/ESOB oU9۴y*y/}Xa%!/7WyW# DHI" B$aIJWyW#*pNr w+mڼ#>cڼ=)D;+$! DHI" B$A$! DHI" B$A$! DHI" B$A$! DHI" B$A$! DHI" B$A$! DHI" B$A$I endstream endobj -2473 0 obj +2566 0 obj << /Filter /FlateDecode /Type /XObject @@ -124265,7 +126317,7 @@ stream xρ 03WT ǟ[4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLs o endstream endobj -2474 0 obj +2567 0 obj << /Type /XObject /Subtype /Image @@ -124280,7 +126332,7 @@ endobj /Columns 216 /Colors 3 >> -/SMask 2475 0 R +/SMask 2568 0 R /Length 1288 >> stream @@ -124307,7 +126359,7 @@ $ `B0D! Q΁\ endstream endobj -2475 0 obj +2568 0 obj << /Filter /FlateDecode /Type /XObject @@ -124327,7 +126379,7 @@ stream xρ 03WT ǟ[4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLs o endstream endobj -2476 0 obj +2569 0 obj << /Type /XObject /Subtype /Image @@ -124342,7 +126394,7 @@ endobj /Columns 216 /Colors 3 >> -/SMask 2477 0 R +/SMask 2570 0 R /Length 1479 >> stream @@ -124354,7 +126406,7 @@ Qa Bs_5kOH DH DH DHX3bDBlD!!!aUOGzߑ'[ߋb3X$ŊDW^sqg7mn@~LM9y8#/Nxh6 %"$XX꺮 "$"$"$"$& endstream endobj -2477 0 obj +2570 0 obj << /Filter /FlateDecode /Type /XObject @@ -124374,7 +126426,7 @@ stream xρ 03WT ǟ[4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLӘ1Mc4i4iLs o endstream endobj -2478 0 obj +2571 0 obj << /Type /XObject /Subtype /Image @@ -124389,7 +126441,7 @@ endobj /Columns 4961 /Colors 3 >> -/SMask 2479 0 R +/SMask 2572 0 R /Length 3565035 >> stream @@ -137333,7 +139385,7 @@ SW 0=QшLF`z4ӣ(V endstream endobj -2479 0 obj +2572 0 obj << /Filter /FlateDecode /Type /XObject @@ -137353,7 +139405,7 @@ stream x1 0gB*ؽpm9lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lpرcAփ[ aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lĎ ða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  vX` Fp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða؀ڱcAփ[aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68 7 endstream endobj -2480 0 obj +2573 0 obj << /Type /XObject /Subtype /Image @@ -137368,7 +139420,7 @@ endobj /Columns 4961 /Colors 3 >> -/SMask 2481 0 R +/SMask 2574 0 R /Length 3761458 >> stream @@ -151570,7 +153622,7 @@ lCF` 0x/v*#} endstream endobj -2481 0 obj +2574 0 obj << /Filter /FlateDecode /Type /XObject @@ -151590,7 +153642,7 @@ stream x1 0gB*ؽpm9lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lpرcAփ[ aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lĎ ða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  vX` Fp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða؀ڱcAփ[aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68 7 endstream endobj -2482 0 obj +2575 0 obj << /Type /XObject /Subtype /Image @@ -151605,7 +153657,7 @@ endobj /Columns 1920 /Colors 3 >> -/SMask 2483 0 R +/SMask 2576 0 R /Length 483438 >> stream @@ -153155,7 +155207,7 @@ C ΠiuR=!H!$4 )IA He-& endstream endobj -2483 0 obj +2576 0 obj << /Filter /FlateDecode /Type /XObject @@ -153176,7 +155228,7 @@ x u^;uȀ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`\T i endstream endobj -2484 0 obj +2577 0 obj << /Type /XObject /Subtype /Image @@ -153191,14 +155243,14 @@ endobj /Columns 108 /Colors 3 >> -/SMask 2485 0 R +/SMask 2578 0 R /Length 484 >> stream xю /{oi"̲3oMa,в,ˏ݁;D%(@JP"D%(@JP"ss)e3tYcZI{$~jk\J{n%NgXbzP.q+Ex$f5ewˉ)$K >$γ>˲ԇƫA~DL~/ۺ{Ҙ{yAt*hE'_N{Ě+LD%(@JP"D%(@JP"D%(@JP"D%U endstream endobj -2485 0 obj +2578 0 obj << /Filter /FlateDecode /Type /XObject @@ -153219,7 +155271,7 @@ x [9d2L&d2L&d2L&d2L&d2L&{A endstream endobj -2486 0 obj +2579 0 obj << /Type /XObject /Subtype /Image @@ -153234,7 +155286,7 @@ endobj /Columns 108 /Colors 3 >> -/SMask 2487 0 R +/SMask 2580 0 R /Length 451 >> stream @@ -153242,7 +155294,7 @@ x 7ⷒDj?1&ލVmJNTfbA G3hQ3Q^uDE@9\'>bsKX޵p:Bc2q:'wf6r8q#Oĉzo[wr63ˆ8]hi}zt?G*,ϟa_w}KCguULڙ3+tn0"?.scu X.gF`DF`DF`DF`DF`DF`DFu endstream endobj -2487 0 obj +2580 0 obj << /Filter /FlateDecode /Type /XObject @@ -153263,7 +155315,7 @@ x [9d2L&d2L&d2L&d2L&d2L&{A endstream endobj -2488 0 obj +2581 0 obj << /Type /XObject /Subtype /Image @@ -153278,14 +155330,14 @@ endobj /Columns 108 /Colors 3 >> -/SMask 2489 0 R +/SMask 2582 0 R /Length 422 >> stream xn0Ѹs\?ʜe Sj>3{F`DF`DF`DF`DF`DoR.w'KtNCo =s#z)qMеC۝A'v {u$RSqshGp"L?jx,q׈J7#0"#0"#0"#0"#0"#0"n?Q>c5fұ;G- ;}wi暸X=I ?D1:DIy9Gg1p_蝿ZB;yw`DF`DF`DF`DF`DF`DF endstream endobj -2489 0 obj +2582 0 obj << /Filter /FlateDecode /Type /XObject @@ -153306,7 +155358,7 @@ x [9d2L&d2L&d2L&d2L&d2L&{A endstream endobj -2490 0 obj +2583 0 obj << /Type /XObject /Subtype /Image @@ -153321,14 +155373,14 @@ endobj /Columns 108 /Colors 3 >> -/SMask 2491 0 R +/SMask 2584 0 R /Length 397 >> stream xN@@Q1/hڌp!=vns>W+("PD@"E("PD@"E("PD@"_g޼mO] +q^y~5נIs`JmpFbc^]q<뱽1lg0q0VȌmڪ}(Eogn|ݾjE3ef{|Z>v("PD@"E("PD@"E("PD@"EIQ endstream endobj -2491 0 obj +2584 0 obj << /Filter /FlateDecode /Type /XObject @@ -153349,7 +155401,7 @@ x [9d2L&d2L&d2L&d2L&d2L&{A endstream endobj -2492 0 obj +2585 0 obj << /Type /XObject /Subtype /Image @@ -153364,7 +155416,7 @@ endobj /Columns 1768 /Colors 3 >> -/SMask 2493 0 R +/SMask 2586 0 R /Length 68446 >> stream @@ -153523,7 +155575,7 @@ B {Oʒ 'ݩrkW!H tZy=-{ZZ4z\C7ұgoki' }ַ3mU%|*++Nw9Ǽpypj%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9%9ƙL\d2PWWهx<Y(HL&y2?????7xܜ= ql6N8'dQQQeee{{p \|!>JJJ82̱l6b{\MWWWgggnnnCCC{{{___IIIMMMKKp \L&JOORL&ͦ|J endstream endobj -2493 0 obj +2586 0 obj << /Filter /FlateDecode /Type /XObject @@ -153543,7 +155595,7 @@ stream xA 0C!YZm;^2:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ4 H3:Ҍ QB endstream endobj -2494 0 obj +2587 0 obj << /Type /XObject /Subtype /Image @@ -153558,7 +155610,7 @@ endobj /Columns 1920 /Colors 3 >> -/SMask 2495 0 R +/SMask 2588 0 R /Length 295467 >> stream @@ -154536,7 +156588,7 @@ I БH$D"H$D"H$9"D:D"H$D"H$D"G(@G"H$D"H$D"HH$D"H$D"H$N޳w endstream endobj -2495 0 obj +2588 0 obj << /Filter /FlateDecode /Type /XObject @@ -154557,7 +156609,7 @@ x u^;uȀ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ p! e endstream endobj -2496 0 obj +2589 0 obj << /Type /XObject /Subtype /Image @@ -154572,7 +156624,7 @@ endobj /Columns 1920 /Colors 3 >> -/SMask 2497 0 R +/SMask 2590 0 R /Length 285963 >> stream @@ -155609,7 +157661,7 @@ jP Њr1EQEQEQEQEQAhEQEQEQEQEQeAPZQEQEQEQEQEYTVEQEQEQEQEQEQEQEQEQEQAhEQEQEQEQEQeAPZQEQEQEQEQEYTVEQEQEQEQEQEQEQEQEQEQAhEQEQEQEQEQeAx endstream endobj -2497 0 obj +2590 0 obj << /Filter /FlateDecode /Type /XObject @@ -155630,7 +157682,7 @@ x u^;uȀ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ p! e endstream endobj -2498 0 obj +2591 0 obj << /Type /XObject /Subtype /Image @@ -155645,7 +157697,7 @@ endobj /Columns 1920 /Colors 3 >> -/SMask 2499 0 R +/SMask 2592 0 R /Length 1112571 >> stream @@ -159693,7 +161745,7 @@ S} Ԡ^AA)ǑĠ)'A)L*@+r*GGG~z`9jvܽbŲ˗ɟ?~![~Ŋeiy̛7d`s / Mӿ?}ptt߼_:swo~du饗\pJ ?gdGze9H|e'0S%A"PԠIkPZW"'A)L*@+rR>MӇ~dk]ΝbEs˖ƷB7>7ҥg<3f oڴoki>_~_Zw~Qbnڵ{Gv>joYMT<NATjP'9jPr\8 J+d6(EQiBhEQNMjM7c|lc=ٵkWOy4ڵ3H 7p}۵kAF>ZrWcTo%76M͛+9吨ArP5(8LQEQ^.A*I endstream endobj -2499 0 obj +2592 0 obj << /Filter /FlateDecode /Type /XObject @@ -159714,7 +161766,7 @@ x u^;uȀ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ `0`0  @ p endstream endobj -2500 0 obj +2593 0 obj << /Type /XObject /Subtype /Image @@ -159729,7 +161781,7 @@ endobj /Columns 1366 /Colors 3 >> -/SMask 2501 0 R +/SMask 2594 0 R /Length 1564922 >> stream @@ -165227,7 +167279,7 @@ TT V(&I endstream endobj -2501 0 obj +2594 0 obj << /Filter /FlateDecode /Type /XObject @@ -165344,7 +167396,7 @@ x U.Z endstream endobj -2502 0 obj +2595 0 obj << /Type /XObject /Subtype /Image @@ -165359,7 +167411,7 @@ endobj /Columns 1847 /Colors 3 >> -/SMask 2503 0 R +/SMask 2596 0 R /Length 542509 >> stream @@ -167186,7 +169238,7 @@ f LKL$ fpI9I,9M7< FL%@3(}^x‘Ñ PpihȣX IB2~$HZx2&3vf<&Eܕ G~h&fmNfh$b[ɘRyZ<Շjrx`SPVtf+טͤϕȍЦ7  Ɠ6  0fDBEOV/t\d/M WQ8d⿓+uF咤f&yN3LY\l3 eђ؈$KPڨXXHHVɫ͒55LѨ(,;S"$)kY|dHE)m"K+Z)$$5\rKfR*f\8@LxR)~ΎtC!Hj&R,?]DHs45fܚ+ex/ njj߸ef*th(T{9١ D!ʆ,FYJD7|cHVe{̈BoblF2QI;\-*^dj(9i250$4ƄL[= }dC23[vLA% CNW,܋' V4G|1Y0`'IS1``cLv P3 ~½kښA3nLPEEbz1@`,n%,35&%Ƈ(Dda!Q,%+~1aCp9`^=eaBH1lZ 3F=1 dqȤT!3ʋlDXT,DWK7Mjz50,Rs8&3&>5I 0H~/@44b;]Ύx0(]"Θ:>D΁φjXK:4r5*VAwwΘuN9P?-+}r/g1m &Gfh!{OiQL u!LJI[v9c2x&-j.Mkdl E|Zl>waL@}IBģ _;G:qj,+BAAAALy`0XZZJ*>      AAAAA== AAAAA<ua+++B K.V7W%    xh4ZP(~aaҥKw `uuƍoo}Z>ik     58A9^[VV3ٟPKAAAAq,,,lr.t /tAAAAAģ7wsvc9SSSkkkO~^[ZZzҦAAAAA<#t:ͭz1D*-0榧M ?&eoW.?m?nm?XWx6 Rٛ #S*i?Z\\AA<:h!O \]I]޷_oU_/׾& |a|bWNf˿4ARb7?<0/??-B)׾^}vx~ɇ 1W*Gkkk>" Cr39_67O^y}+iӆx}핅aت?sB./֭nnnm ] 7/οo[J=:'̅հ endstream endobj -2503 0 obj +2596 0 obj << /Filter /FlateDecode /Type /XObject @@ -167206,7 +169258,7 @@ stream xA 0~U, :# o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&t o@&tGk endstream endobj -2504 0 obj +2597 0 obj << /Type /XObject /Subtype /Image @@ -167221,7 +169273,7 @@ endobj /Columns 4961 /Colors 3 >> -/SMask 2505 0 R +/SMask 2598 0 R /Length 3320669 >> stream @@ -180480,7 +182532,7 @@ bt 0zdDF(=2GF`ȈQג endstream endobj -2505 0 obj +2598 0 obj << /Filter /FlateDecode /Type /XObject @@ -180500,7 +182552,7 @@ stream x1 0gB*ؽpm9lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lpرcAփ[ aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lĎ ða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  vX` Fp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða؀ڱcAփ[aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68 7 endstream endobj -2506 0 obj +2599 0 obj << /Type /XObject /Subtype /Image @@ -180515,7 +182567,7 @@ endobj /Columns 4961 /Colors 3 >> -/SMask 2507 0 R +/SMask 2600 0 R /Length 3104347 >> stream @@ -192374,7 +194426,7 @@ V* X6::rškJ> -/SMask 2509 0 R +/SMask 2602 0 R /Length 3065065 >> stream @@ -203878,7 +205930,7 @@ y {Ȉ?U+ endstream endobj -2509 0 obj +2602 0 obj << /Filter /FlateDecode /Type /XObject @@ -203898,7 +205950,7 @@ stream x1 0gB*ؽpm9lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lpرcAփ[ aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lĎ ða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  vX` Fp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða؀ڱcAփ[aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68 7 endstream endobj -2510 0 obj +2603 0 obj << /Type /XObject /Subtype /Image @@ -203913,7 +205965,7 @@ endobj /Columns 4961 /Colors 3 >> -/SMask 2511 0 R +/SMask 2604 0 R /Length 4740001 >> stream @@ -221799,7 +223851,7 @@ X 3=e1'ࡹOmΔEAџɝ5yBWژwf܋{O?pyztkϽџћ#r#,μ'{7^Nj;}'iLN^rv{>㇏mUls0Ԯ/=_;xhwwŒe8;ua?wj/Xx~j$돈GNiW ɩC㇏4oVOK33ӗL_މߥO>RVޓ쾴ys%UvZ> -/SMask 2513 0 R +/SMask 2606 0 R /Length 281568 >> stream @@ -222672,7 +224724,7 @@ O^ AAfiii5  rigӹ\òez(8sjqD}}ȑ#U9 heAdQifιmW̲ Ad@+   ,2^   \heAAAEZYAAAdVAAAYdEAAAheAAAEZYAAAdVAAAYdEAAAheAAAEZYAAAd M7- endstream endobj -2513 0 obj +2606 0 obj << /Filter /FlateDecode /Type /XObject @@ -222693,7 +224745,7 @@ x zu(8ް; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; "; ".{ endstream endobj -2514 0 obj +2607 0 obj << /Type /XObject /Subtype /Image @@ -222708,7 +224760,7 @@ endobj /Columns 4961 /Colors 3 >> -/SMask 2515 0 R +/SMask 2608 0 R /Length 4818808 >> stream @@ -240481,7 +242533,7 @@ t&o 71 endstream endobj -2515 0 obj +2608 0 obj << /Filter /FlateDecode /Type /XObject @@ -240501,7 +242553,7 @@ stream x1 0gB*ؽpm9lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lP8lpرcAփ[ aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lĎ ða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  vX` Fp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða؀ڱcAփ[aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68  aða0lp68 7 endstream endobj -2516 0 obj +2609 0 obj << /Type /XObject /Subtype /Image @@ -240516,7 +242568,7 @@ endobj /Columns 4969 /Colors 3 >> -/SMask 2517 0 R +/SMask 2610 0 R /Length 4512504 >> stream @@ -257360,7 +259412,7 @@ V ]~ʞ&[oߧVQ+-LhOG-}WNq;Z#vWO!˯sS3Rdj;jes9)WcW)n'_kĮJ)v{s*{Fl}ZmG3v>=[jJ^9kص{^)>.v}NeH]S}&tпz#_ؾ^]+|vs+֧ϩk}jҲD9Woqzb ׫+y5b}xR=9=#uM޾OVZH;gўB-XO[ az5v%vFڽ[Bj_>gvJ>is:S_i/l_ƮSNֈ]9bSHkT#Z endstream endobj -2517 0 obj +2610 0 obj << /Filter /FlateDecode /Type /XObject @@ -257617,7 +259669,7 @@ mp5 QO\K]޾U/////Oo%_n;>Wz)p^k<^CyNOʾ>y~2}8gxw';////D&/1Ƕ* endstream endobj -2518 0 obj +2611 0 obj << /Type /XObject /Subtype /Image @@ -257632,7 +259684,7 @@ endobj /Columns 945 /Colors 3 >> -/SMask 2519 0 R +/SMask 2612 0 R /Length 10477 >> stream @@ -257657,7 +259709,7 @@ t <+iH}.N֏1KN*~Wd.,Yw4a ή`ӧfOy⥯zS\WѮCöΥO3Ppf7a;h.s~Oͬmu Ctdo:ñYޱ׌u՗.Jj&$k>o\<5hlIM: -c==c;JZtΕ䟶=1bǜcN ؑ'bMqjOslM}U{{zOoJ &&w76|]yվ|J~ol6P+[[>=/ҙ{%;.Y0}0v65:捽Txi|zGkRcwK89*?)ێ$#Ԅr#5@llsn^b۲%IXuKz꺹y_I\Jnhl±ss',MK_)LKb v̉;yb|4֑n?@͉'|AhwЇk9\t:<x֨qfxcN 1'@ v!?-߼~c.k4ڸ!K;tI;sbĎ<1>h7K IVk2N  v̉;ybDhcm'!>td=1bǜcN ؑ'F,@'@ v̉;Ĉqb;sbĎ91bǜcN 1'@ v̉;sbĎ91bǜcN 1'@ v̉;sbĎ91bǜcN 1'@ v̉;sbĎ91bǜcN 1'@ v̉;sbĎ91bǜcN 1'@ v̉;sbĎ91bǜcN 1'@ v̉;sbĎ91bǜcN 1'@ v̉;sbĎ91bǜcN 1'@ v̉;_& endstream endobj -2519 0 obj +2612 0 obj << /Filter /FlateDecode /Type /XObject @@ -257677,7 +259729,7 @@ stream xA 0C/U, 8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J %BcıPX(q,8J % wI endstream endobj -2520 0 obj +2613 0 obj << /Type /XObject /Subtype /Image @@ -257692,7 +259744,7 @@ endobj /Columns 3784 /Colors 3 >> -/SMask 2521 0 R +/SMask 2614 0 R /Length 54101 >> stream @@ -257854,7 +259906,7 @@ Z+ YB\H)5bqtt$r:S֬_F|6}ĜUgggYVH-Mh/F{K4MQQTR*E&Gǜ3-)J*|>Fl6n^5j|0+I#!8B b1-r>_Fd2PJҔl~vz&8 |-k;q<&l:˲s.+t:Zʳ\*9c\kj8-X=5+%l:A'B θr.8vaڶMhEY&I2f9<}ЊJCQEZ-۶cT*$Id<)ʊkԨQWu: endstream endobj -2521 0 obj +2614 0 obj << /Filter /FlateDecode /Type /XObject @@ -257874,7 +259926,7 @@ stream xA 0C/U,8 bdH1YR,)F# @ bdH1YR,)F# @ bdH1YR,)F# @ bdH1YR,)F# @ bdH1YR,)F# @ bdH1YR,)F# @ bdH1YR,)F# @ bdH1YR,)F# @ bdH1YR.0 endstream endobj -2522 0 obj +2615 0 obj << /Type /XObject /Subtype /Image @@ -257889,7 +259941,7 @@ endobj /Columns 198 /Colors 3 >> -/SMask 2523 0 R +/SMask 2616 0 R /Length 4157 >> stream @@ -257909,7 +259961,7 @@ Q u,j۠#}90ハd7\fs|˃]ꈟ韸 ?D *梲54@TH%17g9fS̘R1?> -/SMask 2525 0 R +/SMask 2618 0 R /Length 106253 >> stream @@ -258429,7 +260481,7 @@ n\M 1&WHvvI! P,Q :f%KG$Ps<6VD}MoJ>tmJ%bTTLOb5~qc3uSXFjD51$בFxCܗήZ`[%鸫ܴ0Djʛ}񢮉2_q_ӓZ9v27bzDrYN3 endstream endobj -2525 0 obj +2618 0 obj << /Filter /FlateDecode /Type /XObject @@ -258449,7 +260501,7 @@ stream x1 gM議I`0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 `0 prB endstream endobj -2526 0 obj +2619 0 obj << /Type /XObject /Subtype /Image @@ -258464,7 +260516,7 @@ endobj /Columns 847 /Colors 3 >> -/SMask 2527 0 R +/SMask 2620 0 R /Length 53486 >> stream @@ -258682,7 +260734,7 @@ W @B^ȩK@@ !ƼJ4dUP9g_ݺsa&T"X4+vdmҀS!sKN6uɲ0.\Mov@us^wx]q  hnG]#&Cy51 endstream endobj -2527 0 obj +2620 0 obj << /Filter /FlateDecode /Type /XObject @@ -258703,7 +260755,7 @@ x $= ?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt?AOt  endstream endobj -2528 0 obj +2621 0 obj << /Type /XObject /Subtype /Image @@ -258718,7 +260770,7 @@ endobj /Columns 1858 /Colors 3 >> -/SMask 2529 0 R +/SMask 2622 0 R /Length 81378 >> stream @@ -258915,7 +260967,7 @@ JKK ]=퍲~ͶK}]?3bXUBMUleý\yVс> x}3gc=bVjoo݊ƎFxx7Яݸ{PrnMl<ܻ;x<4/'?y_|Ǐb{!N?ׁ%{?jx9c7ǿ4?~]|G}釴777}/ӝ?~pWyS s?|r _oK8wԾ߾h~/lSW/}jЏO~oxnmrC.Ew^+| endstream endobj -2529 0 obj +2622 0 obj << /Filter /FlateDecode /Type /XObject @@ -259185,7 +261237,7 @@ x  endstream endobj -2530 0 obj +2623 0 obj << /Type /XObject /Subtype /Image @@ -259200,7 +261252,7 @@ endobj /Columns 1250 /Colors 3 >> -/SMask 2531 0 R +/SMask 2624 0 R /Length 23086 >> stream @@ -259329,7 +261381,7 @@ X @DT""1T"L^: Skkk/ML *b*eDL "s_B ?tƒ… {+Qvo{.\:5Z:u7$&~'N?T"dfqR~xg<]̞/ygܹs!Sϟwpeӧ9BŚ5SK?Y?֯__R?LNNn endstream endobj -2531 0 obj +2624 0 obj << /Filter /FlateDecode /Type /XObject @@ -259349,7 +261401,7 @@ stream xA 0C!YZ{m:ޱ8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0,8 0.PA endstream endobj -2532 0 obj +2625 0 obj << /Type /XObject /Subtype /Image @@ -259364,7 +261416,7 @@ endobj /Columns 1263 /Colors 3 >> -/SMask 2533 0 R +/SMask 2626 0 R /Length 33303 >> stream @@ -259425,7 +261477,7 @@ GYEc T endstream endobj -2533 0 obj +2626 0 obj << /Filter /FlateDecode /Type /XObject @@ -259647,7 +261699,7 @@ zu *PK endstream endobj -2534 0 obj +2627 0 obj << /Type /XObject /Subtype /Image @@ -259662,7 +261714,7 @@ endobj /Columns 1918 /Colors 3 >> -/SMask 2535 0 R +/SMask 2628 0 R /Length 25760 >> stream @@ -259720,7 +261772,7 @@ C Zץ9m7{Vk-f~ S{\=s̛Cc~:*qx ׄo3GR)"QXK{;rr3qE_չۗ2{l{o{nDy_A7~kQQK1ܑޮ=]7YyZzhkk {z@^^^h>mz=vmZ,[ji֞7{{ ~)[hcҮI^&{}7 Z>օ{ַoþ7?bD~?s+om'+xԚھcsv;k-o_Y9oowj\ endstream endobj -2535 0 obj +2628 0 obj << /Filter /FlateDecode /Type /XObject @@ -259741,7 +261793,7 @@ x uZu~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r 9@~ g_/r   endstream endobj -2536 0 obj +2629 0 obj << /Type /XObject /Subtype /Image @@ -259756,7 +261808,7 @@ endobj /Columns 1268 /Colors 3 >> -/SMask 2537 0 R +/SMask 2630 0 R /Length 329625 >> stream @@ -260982,7 +263034,7 @@ Cˋ a/:V[d獲=9E36ĊM_Nk.vjqR3雚[]ںmݞZo7=n]Z:}%",T䇃_zw'VR~g0 c&;cE|t endstream endobj -2537 0 obj +2630 0 obj << /Filter /FlateDecode /Type /XObject @@ -261003,7 +263055,7 @@ x zu8^2= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= RLH1= O endstream endobj -2538 0 obj +2631 0 obj << /Type /XObject /Subtype /Image @@ -261018,7 +263070,7 @@ endobj /Columns 972 /Colors 3 >> -/SMask 2539 0 R +/SMask 2632 0 R /Length 66223 >> stream @@ -261190,7 +263242,7 @@ MNN =Smw@ ;zJdg3J>P<oooGI>@ @G}ѣ٠{+Zbs=62@ @DBddC&.mOIA],'I HG+,I:(u!qK#:^ $ 2WŸ(JrB.? endstream endobj -2539 0 obj +2632 0 obj << /Filter /FlateDecode /Type /XObject @@ -261210,7 +263262,7 @@ stream x 0u%$= (87 f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C!af03D" f3C! endstream endobj -2540 0 obj +2633 0 obj << /Type /XObject /Subtype /Image @@ -261225,7 +263277,7 @@ endobj /Columns 1175 /Colors 3 >> -/SMask 2541 0 R +/SMask 2634 0 R /Length 90041 >> stream @@ -261481,7 +263533,7 @@ R' ;}> T[.qDY\.y&`Rp.e ?\ endstream endobj -2541 0 obj +2634 0 obj << /Filter /FlateDecode /Type /XObject @@ -261501,374 +263553,7 @@ stream x1 0c^ݳR/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@/5PK@\K endstream endobj -2542 0 obj -<< -/Type /XObject -/Subtype /Image -/Width 1173 -/Height 808 -/ColorSpace /DeviceRGB -/BitsPerComponent 8 -/Interpolate true -/Filter /FlateDecode -/DecodeParms << -/Predictor 15 -/Columns 1173 -/Colors 3 ->> -/SMask 2543 0 R -/Length 95588 ->> -stream -x{|/N$!ؑ";aRJ)2KYYT]L@nYiA倏ϰ\VS)قҝ.^YM@! ;j'D?f4iF7[_Zkgyf'˘zJbD1J} WTW`V1W4\}K$r*~. dBbgZSФEK sm…-N{mҘ-;ujӋ+r%D1瓻ݎV\tx|'Wu)RfS}™O~,XI@N*MoUқr,Z=N}gH%S,M}C(mj3sS]C "{TK!%'.|'j+DDjo\ky3,ʪ@ŗ2/8ODr7ܩ ~N\ʜYP}FxssfxT;3c\s͸kDD/;Vߝ60{wOb#GΌ/ⵉ1l&o񓹄p)>嗈 Ξ//-t-osX,51Lׯ?Ik7m۶ֆ1lJsCQ=H#O:.~~v햛oyժUW^]~-֭lb``  ~_s 0v}m…)Ϝ91 zC77ި 7\㷔)pϜ A9@g >n߯}kDo9r䦛nGmS}s>GD?яod(Xl…)KKKrjoQ©Sn r͗Ϝ/9}t|ɅSgihgl@l0=LOOu!0x㷓gK-D繐siعSDt\~]v}39s̮]7x*++]v=CPv% -/ByGgQg;5ۺu:u}_~}gQ7=~;~~Ȟ|p"|X(X{?UVD2]vۧNBo9r[Ν;{}sovM>?cf/Ro~VY"|p<77bhG?$G(VTTP}hGO)7IW\qE0$˗7?"4CKfs^}KN/!_CcQ6Iˡ LO5M/~w[OU?CD] ]ST5(v]OK]]DGڿJC[NJ̔S7M[֛Toәk|O MUPclDf/̑r5yU1#H13]+e3׾@Κ&Ɛ^|C-(h o4=1p-Wi~*QAc!Wg/o^︶w[QxqKSGMy5y8KnyC^],9MG|HMӋkj#H"=mڍ56ecǻ;~r<^Р|ޒz"ZuKeGCʰk3P_"W]IaY/#;+BDdiz%\tZ^JNzĥ|4̪ɺ Eef4:Wkе=5Ux9]]o[o>PDyDx %?PoѪ[\׾ݺo5j`+=DD=צ)$#<"qxBnajUp4!w5MohG+{nh׿NwYݎiUꁎ'h"u=^Y Eo:*i$/=сU"K*BL'wXL{h``)1]Cboiu '܅PщVիkk(%#ц' P u=@_z!jPZKOq66%KD( nO5`Hr@iwx-*H]bX86t1N_f@a!KR(s^42i9}+5&b¨ k(ǂ_OwOu`im+0)[ljk1&u>( -E6[-D m]=S[=6 Yl3%$]jjM\;}@*9F͝=Dx_`d9,j&f! C1qycPy[6+>4_q){SIFIB"Na\j̡큒$I2?q&-i:}J${b},6[Ҍ5Ir a% -L0jr:z;8ԫ9\G]TW`"|A$&h ]!""2[Fgs%e8vi2&[$""JVVG(˧םz1% Jffa,0a7~;sbZnT?SG -/ht5VK$p0 uk+a /pJFpN}Q')ΰ$kvXFy.4AJ5qMMӌ5`s˕6M6BdbS$ֲYP(XC׿UT4uJEFK^N">w2y8nNAWt\reH7r\zmH$DDq=/'@ؚ;_XZ݈ mfHhRkGB6Zt2Exo[[$8]ʲr':oX _nߔ1K܉}p#+_ gŌߘ:{ #d(+wt5-6O3KO9Q0[]$݂U~ fٲwc[s 9GۯnS,VPǭ}߳e)V`o5<}PDɳnX_IMOE5I_\R3 NueI zħtiH(E^ßT-Y)^-Uo[/(BF"S0._3u%?7qА -@eƎz"u Í; ڟ_}=Rٛi[( -&Ӟ-6|`wZ/g&߷j_ Go[oKaDD6l>ѱ}SSAl&1g S[[[fRX"D+4Fx>q N -IsC!o;<$pk+QĂq.&Ǧ^%."68-QҘ~3·dIbvl츿>lU;H%DaV>=t)[ -G7zǚ<~WdڳMgH__E{L6c<wF_~lO߿V[[g`TWWOuf8OJFG6Y,(FxF7r^u>D ue}\Zb%<˘؂R*.W= ytݘZFPww7JoooMPY"Ifh0u2o `+x6O\7 8bDj@:Xo@q@PNu`1YkKDNs[nelՔy`B0ẻ -EV@OF -DpUP[]JbJF7 `2TWWOuޔ-h5H -yL5DRLNsy`0 `s:l`sY8^EQ䀎q5B]n5l+!oJf' Njl<ҏyDC96ѯFzY Hf'̈<-ijr&O@Vx8 pUbPeu1[ `;uݢ&a$/~zPoš`8iw]-9w`""iz{B -PD -9iw+[MS; Pv- gnYEDDiz{c[bӟi^^]}5moTufvnžxkwVߧﵷ?H!\/6)AVM#M5XuMh]fiW7@(jNp1Ns +٨yUͨJ5QtǸɥ)ˇ*飙l.mTvKn5㬲>~ԦmYL"~wf<v\L{{{{{蕶'0Xu3/biz[:0`B{zStBm~(s-ȉ!Z] 9}=$#˲,G;weؚoCx̼Q-1/`|~>QQgфBvvRVr[UW@$%C⚝3'*( -xțS u -5̛z;Ϯ'gf +icDreG Qwf\ ƏdP +Ƅ`ʷ:| CŸl!/&I E%n6KFϸUdF$& di5G%MEj[!WS](鰅-p)դd(gUt"NI ^ɐ~aes`\>T5VK](ٺBk(Dȼ1V'SDRK7♥p4V41ZO8"df [ 5IoKYyD#et+ qx yձW-斈3N|9""nnWF9!6;nt -@>T՜qvfz=6(K IF/G]`!"G Wʱ\Bꩮ,Uot% y'HFJ7[EQyB|Ym6K\:#3tn*v24I6]'a-a3>5es+`FBӊ[ Ffv 8}\jhYk97® iD?T-d$QYp'\Zx3&[՜;%m<fE -y<6eEbcnC\=.(z(e?9MoN L_>h>d,g"<"ihwo̱%]1,4y% Eѣnr(`3UTTf`UUUP'"חEL1 Z%Z Ed -` -|i6aCee$i7dI" 8 ~(7 8o݅* -ҭ1;2P -ng<1bӧ%/' -,z\ka W@]1UkP_2̸ZeY͞|k -0ARf--<pj7 ق-PjL天/-.H -Yu 1p1FI$Y%Y[)3Y 2, `!~[$)IAv/XqJ -Y5n}'Q5Rrr #k Ix^j&39h[ ̤s ("or> 7وq5䑃Rg0bs 9{YM 7˲\΋ϙc9N(Y8^n3eHR1&[jHh -sr? 7Y[EQyBF2wN-5>^2#&Yydh -TExN3Ԏ%e IF4#.$SSϢ-6\fg3g yY24c(%[It1GK"iŃ9jhXʹL4A23$cY7Q2/q54&W!EExN&$"'o\_pXèKp{򉢇B^V^W$rlԾ-|EQ*F '%2X-c2ukṼM c"1%uwwc[w\ދ-f V~fCB' Ed2a$@I;U(2h5)2 oo2 8 ~(@,VF<68t"eץK ^`ʎ ?\JSO1WrO|ŲE484f^Q*+7Q5yJ˗\lD644HV&uPט:п͛7:c4p***C'iUeԑ~#C*9< 362tA7oeW'<1-S 7&<;t_`f)m(-229޿P Vlr+?88ryR9wʥK+H5rRЁUՕr$78y@~ZY]^}# y sJwG.hsW 0Y0-Z*O7)Cs(ܿ4>8| -j.@٢UK-#|YEYЊrtieWz([g)y -yq汝0L;U(-yD~Ёg-%/ 'wDegG3R;0YFhr?O|T!:^{^izZJ#ufᲊV;cR.EdLJ&GEDʴk#;<\hAhDِ:ʟpxE?KΣwL1F,tБz{`-LEMKu~"픬ҥ+OҢbQDe*-ξ쑘TXZjc䡐eeVښJee救rUK.>lW|E&"*[TQ\0_FD+*W$^624:J(-Uj $^.?['.]QT.}x?Ѭo|dI|F>XȣMgO}u1gYndVc"5r2@o<6`e*]|}4òE+nf^xVTŸ"b7NŤ4}ΤJȇ|:M9ssuaKt?ijI%/}9>G89}D |ښ~ Zf`8}=ȱF)5興(b&Y7Ds c -x˲,rI'YpkjSN8+`lՅYBxoZMjRGeW-5M -b9b䬣o(?k>9L:5@Y L1g3Gu7wN̷$t ~'bP@D$t,:W@ 2'j2"%RQ-+DfkG7kɩ`&iCJK0!"({mHp?hD=D vJIM-`vBEp{:tET~wOq'ߘ-z$ G,Ԥ<3'Eyҍ04ÍIƸ}ŸlJ4UP?R"n|藈p4+c5'GfTf Ͳ,dJ͑nLF ;EG"*j<6 g\rɜ|,5O(<ۗVje o^xft lVpT[QMw[faIt &#n!G=Jb!\8qڃ\c9 -D ,"j -gI+SЦ8zK׫dl5e˺rVWg'm,gh>jB4C -7KB? w -0V3E99K|5yYK1DKV{8:-MF@5}R^tO`\M wk5ܽ5?h24DMQS2(oz g{`F*=p ySO8B63IF/sp(w9}omr8)'>EQLl qʈ -nCjW ilӗXc>)mfMMJ_"SiLs3 ~+]bLJFȬ|EUEUTU([eLt R+@$ 2{xQ@R{7G(s[ آ^v7ިkU٭]-,˲\8#.&'Maev9W"Ih>"6f no(#0c+!/˲77H9Xe9f]ᕺeQl2G4rQك ߈JZrѼ}}3JVVcÃ4<<O,[ w7,yyj -u f>b)Bmʂ'?i;j@Lp/gg3G"6ǃ)d9}nQn^Ǩ]xIF=﫱ZCKFm j61#7YiiyUeÇTV9Y\[hj*9KH ݍ,G,1V,LMDt"NI &7#5$[rZh[>}o2'XkԉIVjh2EQAΝBLC MV:w.ᲊK6R[R8J9H vB{|[olIesCa[&%X.Fe)ЎZK1wԹGJMjiIIi&VrhDrWM^L Fl$Yv>?f8G 1rD ?IeYZS8O8L -(cGI("/ 86Hʓ篕ΝGÃG4Y<W|k=eKg3g;?ŗ?a\\hQNT7_@C^oޤl׶-D~?5"zCjK-c0dO|Է"02a [ä&eIJ?#6㔨p[sȁ*_?907[WI-HRᤦ4ҵ#D%&i3A7)13&TQQID vx8UUU钺 YYv<%(\ވ-f V~fCB' EL? Po@q@Po@q;;U(d3LBㇷTS]Y}*Po@q@PiX[gSㅍ.Z @LBo;6\'}S݅b5wRyq[h3la QCbu\VS&iėٲY0 -7Tv_j|6HFVul|7?m2jm.\0{j -qu7տ'u?4L5wu]}S[kV6ц ב3-я}5ھؚr[OC*;=&ShSyR7!~i0Xo`+:znS _wkbrjhhobkxaCe ouF%bG Sn_bYg0 -d#oŃXlϷwtl*훞 -D)͂oUohoo@iiOm H9DN~=oP<>Qp1F3)ĸ)u[ʥ0Z+hPD$/uSR={i0'ßzM,d~!(,V`džʎ;_ؘn%4)*ee^$V=2?QJnTTuw6Y3X˺"rVWg_JAdo!"\R򲬠\$d#$#YARKff\\6 -ĸ) -|7>dϐź5 l-M쏏ykY@ܐ\1+wz]_49S7>T@ -Y5S[O9-.H!.(qڃ|(9QoWRX{0dڳކOloo߶}SȚ~7PڳvƎz/gLY=I;2Ԧʐܟ4M׷ox=r`F`\MP;Cu%[,/rD鈋{?z$#'"NDn\U*Y>QFLo|[ I3LrXGd2ɔnR({{<Ry&fDFQL&dҕLʾ1ў x-;K%Yyx).[9}ǦG2R^$CN_4גT}fh -s[OY@1yYeQU3lMZ$NclM-y,˲79ex謱ZRvINq5EQ񩋐hF\ޒ3i X5oF9^ykVd{xHX K[ -J F@E8I7 -oHLL?ӆo$3,L[? Gp{'iH3Rpwm鷐f: -2%Jݨ})[/KD+ۃ\_LTcdsJfMb$"Y;<<5wUUef-f]]]=Y5(JK=;0J2l†In""2a$@q@Po@q@b\Q c9-)/}NA.#539S[62`\yYV OluujO2rQ/( ->W(x E UDێ(u FOĸԢ4IV NäKAsQ JPUc lM -[Zx%jw+rȱ3`P@D$t,:W@ 2KFm nƪ|6 ڎWsa$!|8mm k753j2-T4H+zI?"`L:75#;N-씤ΠKs7fHpX noC[,ρ2{?z$#b&Yp{#ۃzfc7 D@.A -ɟ44f4m#6Mk(ګ)k0!~:[?7I͑v\}F[,7˲\Ϋ`["<Dz,˦Mv r7&W%)Kfh -sr:3?\\ 1V8KL$ZMB6[nl(L6;8}"omcR`$[5™:%#;YH%d7e]#%Il02cF3CݴGAZ([R:;;%tB/RgP5e qTdmc(HMӷ],7 -%֔Jq.vv *uX Ks )`Q㔘\0>H6` -abB(a3leWpN"a3O\$%O]}٥L$!ȷN_jhX2ؒʛZ!)E8c:%QyO0zgIjƍq\i>=a5FcSVøZ1fB?_5qxc\Yť6ÔpZ5'wW4Aѓm!ѕ:ioN#'O:D%}.\'|bB^V "q@i 4'xQl|@K|2KnCT*9Y'~Hp*906IaI#]CjEQ9`JChuԦZ,6EwKz{{ -PJ"bÃYsg^K=Ou 'K=]vroc;?6CKwwwuuu^mz{{kkk՗h5zG7~ MT /8ܟVVHvoBmj%t<#{8 Q˺{\>(fdVOؔ½AG[ؔ mV^-Dm$ -ypkDLFքg$?'qx.|N]R''fEN>kɯY.Ř g)(Wj 0R Y鰑~~I[}YG[&y*<[WFslry8ep>cO0hzSy],*G3T -r\)'ښ$ 2gJ$o ظOEF#RjFݮސ#p)4)oQsW"`$n;LoN.gԃfyS:t2IQ*>4Y25r-H,!oQoܑmzw̒_7zw jP7. DeaL~+>8k'![̞p /E(enҞ'X `)I`LJtؔ%+zN~{qIOEZryj_W,z‘GFOf? o!W=SߢƄ1D7nwu*<6``\ٖɏ$7"G5 g\1XqrP_H2Ƹ"ߜ_,L䇴JhrDEjz3q7 -9~R}ިL&9kWRiO/|ʣ= hNy9G<'9Ҝ)Ǜ›2Zp橬.ǫܔype-GxQ~fG7Qp=.٬T;g| $[k -wBwØw]ٓR 09nn4(5wOf%H ;gaUT!Ofц~~}ks 4Ed5|?w=o'j&~>1T=W@QJQ`"JHߘ2W \O>|&i+?/0(3` -9~41~ItBmnF BǗvVWg_rx{.WZvfؚ\٬3oL/.?+!/ -ɜvːxθBWb?aɧBW99 -IW"L-h⑻T§ c/ -cD5VK4 ♉q5fX+%Y%s]!~4\RfxхI&Q7E$h!F<#pGO8b֐od$""G[5s@"M -G3:a umQExu+ qxa\ML`w8IPY8^䈈(UnL3vQp{btN) rJa)yԀM/!ܬ/,i%c5L&K9H(T3q@0z{{ -E Enpa6|3 Ghb$ٰOL3["~DDgff\w!\8cVnVf,"jJ. }8D"")P_JJSH+ތ„II -YM}T/X͔DD?֪]Sf=XCrͰᝦw&mۅ>oݷjm>y;E•YZKǍ$ -z3lQsYJÛb7 ,?|C +]7&>~[+Oܛ7 ?1MKnpIy7zMREKn>8 .ýt.n*D:I-6ђ]6 w+D[;u8atL ?a,egk/~t;O^r3՝J(ueeD~+=Yd3+Ve#72f8b||.plcDW-N~wqJʷa@o0y3et7ԃ ]I?|/M{pI{}uLtے]6 M|)/o}izT}Y>xϭ"Z|eizxeϭ"2ß:xw~rh/]VFU"t<Փ7ߞ zp|X/3 ,{/+vگnhe'fɣ7 %,s~Z"<>ؽ]n87>&O:@N&6~M|d@{r}LoO rtE'`Wc^;݁ R$VY9߈n*,~_>;^^zyR 놃{ j>8B.2% i9O8@}r}ow❄)cbs ?Y_v%u"Nfگl2<.D4ppݫnWJ0ΖBAŗ"JΥ9v %++ Ϧr2XF6=3)ˉԵ%/]>UzsO/F]B WV*_N&^ooTW -c"7sva:5x<*L-^j5pV|劲 6te^M`˨9bZN۞P7mw~T7o~g[,eu&+*[g?/wƔXQ۰%@:~[|׽D>x+y/o7X,YI?ᕕ;S­Kec-5EZ r5"ɷkߙ٘XoU`*k? _v-aK8VnwrBbGOKWKwy7y+}w󽓿|crsox/+z0K{ W2 en$u$}|DD^{iQkn/Z \ƞDސXa2c69_yxeyH-+GizK7ܻ~\s9SNýĀU']'׫[ֽ:$Cƻ'%iۺp- sb8* PLD0k殪JO=}8Sfzj[|׽~=9C___}3$߃7ڛ$t>P08-'67$'si$U_Vv|>ѥ6^#'3S -R8>+sXOp%˜4r;;0oPXa6TVH>&h%XO0izjf @6j7dkr1$KQZ՗9}L^ -c_f9[5D̷ x[Zx}%)fIWlȠhE$Y%o,ITcDږȬ9H0 o'4\JMUOWS/߇Mձ'oq8'Qc7*VT_}L'$ G,r_Of)(7ˌLf+C5VK(b{^-7 vJRgfn'd u (,/&2[vydf\QŤ.$EQAnv& ;|x~/a,~F?,L\~wO\@62LrIʒY9H(!lfXV"Oluub l&Yyȩl6DDp"6(z"<ǺS?3y*ȥղܬ:5eHF֯FL@Sc1 TPEL#|B^$F o&d2DRn!\8á{=/`lx{iZ(%)Lh o(!GMI,$ٰOlr1ȑ5A^"‰V[I_"veI!B\r)"3*2A'I͓+Ƹ[/ yxSMLn/yZcWg0bs81fʜ8`D瑃<;`&qyjhX"g3g yY7dI(9Ij2(k4v4^r'0eJMe֎U0`$L͒OOH$S1 B\1j^d[@p7n-|EQ'F>ʬ/oyƷ,%|.ExNm$lxtc=WO?ȥ(( o6kP,܎Nĸe%.Iw5(Fr\(fDC`}K"3/ -b=? x~@1*@MJ))^<;^+ڪ7)d\[5WqmUVF%.v{̳)Q_w(I7mQ~<>sj.י,B[+O⓻ _\uҝ>#K2zkp9>c/v{ӣy6O뗶(6+~# -U^sK0 -(/"1iےϙ@l<I%xM|hL,_ -Q|!ɧ籅m*J&1NMg\[=^N++)?GV"t2T6m t6}}`zDRl(faؚQ'Ma.;ERf`FdH^J@z+!/˲$YB6H2*YsZx'ׄof 1ϩ)%[Fun2>*'XkH7;Rf.ԘԓI^cD.Ps&S[JoF7*?{#Rl)JS,+QdO8JkEa35'}j>8z#FRO=KxY;7srDmG"2&[@l:;d?&ޘfY yul~fdTcS@*c$dKfH{lvj1 }~Էh~ ZID$oZE(zePpn2D#4b\[y#g#"r<-ͯWo>g'Ko'zl5qUQF:/;l_754ם(+@8OjQCh\Q+NqZS^sra6sVT/ϣmTy9}f5c,ۥ 0JbPqRK+qdf"r'#E*Ye.iHˠV2VIP4Z$M/2>iO3IO 3_g2ԓ;Zq|QJXi*LP4,I&'V;/[>\:~c\[եCM}L΁RZژ7QrˠVQ8^;qXMS -n__Aʞfuqmӗ8DYm%htHs]5&oKYVH#Zaod䉯Is8Kp{UȦۃ&B^`H3hcI/% o(zH^E]DDD5V6Ү_]7ƯD1$c -nκE(eD$loއ&(zB^֭˰V6ӵWHʠJ7yyHA磶?ӬL53sJH[s鄼K>Q-u-A+ŒOH7&ol1n)n[k=賤V͸l$#7~?6wSEE%1%i_242ӳV3L>O.Յ[[[D迃 AL/8-&ll$oc6gfFsGMIVzr8mǚrFc<̌ ]SNϙ?y_lrHc֤nc g\[5EcnT G!7mڒlTva\ߴQKH[(ҼqOSD\Л?MǢpjlrXRLo3f`r*(_'N*bzsS'C%S0)ȲE[{l̡LZM/Lݍh'{Fl4~R^b.OyY&o[6֟=L ?  8 ~(P`Y9P{ -RKf2O/2Y"`Q=MÎnC\=~܍ڗ! -yY$?$II9JFoJnu`:`YrԖ +QZ6Q$m^ERq*޹!0vͤtc|(z`RB_lm]O4tۚj~ԉnm5Ջeef4}692gʱV9!ps=M6))ap\@LqǞ@| e=ʞx}U=;&-$t7g+#C^MDpƐd#"+xDn^*:$njc3s 3Clٱy>3缵iVu=῾]x(>7`%Lg$"Y;<<5wUUU>KƵ4V뙤ZMϓ1𙗥|s Ad5]]]=)5TIMPY"I-=AjS`jh$LXτ׊qm930m$mH7P4 - @q@P? 0Nu0P0UWWOuf~ 8 `twwOu`z/ EuuuUUTo -:¿¿@q@Po@q@Po -*8)bwRg\r!tIjMIjp, l=ȱ -/y&)]LDH4Xq:fߝK=6OExџ'CX$CuEBIN!/IF֯9pPLW[s Y{1Mu]sc'}\crj]{ߒKӹk-3T`X`:$Aӥt"$QVH-:D g8f"rjY51kJ.@B+,Ib\Ʋ}$B&T|;֌Ӟ-6܋ `jdGrT;;=Q];ٱcWm[=;7tזw:.l-#ySWc %"a3OM¸|.&S$KV{ Fl'*Sز% Iӧjawϖ=X~Rt7"1ij"/諑ڽ0KYˉgUwEBZQ -f枝[~L|ˡXw KP+|f>͒OjHD9V$#QS:D%ڗ! -yY$ك\_ߐȬKZ,6m.rrLEcBOLompjkl /l~umTTPdž@o /ldݲbvw=q[OuL5_6?q[Ow}rX`o5<=ga\(/"<@3(e݂vK<.f,} 枽DԽNĈ;5twN`441]𣏕c뀓#u)#3(i/i?>!:๨2JI|$/+B.$ʁC sMJ?usb3PNM!CdT`:'c#Z|־_^ް&#"meuslə_w~}e?7XȺ/ۯ;0"< o41FݨJjeI$#(s8_γ_10DT$i^%5g7gȜv!Zrߵ$<#w>1({kALAL? l,K<ڋe+f,`)lVYcmR Vz[YY}c}eeomdoRl^dd_w}m,fR|~557`:Bɋ5˥]qژ1-2} [D H2&_6>L nj,2 1IƸl60 -xs]TY8J@_B~ ؄{uej3VBÎۢȰ%d; Qf?M<!:~ėO{e&_wkbDC#M$uh&Ӟm"Z)ncڳMHܶDŽ `Y8^EQ=\nyDq)lĸZ'!'_w?8S 2wrS -hRҢr|XkvlcY yQ9@翙lyݸoj oic}`9MzV&2YUL=liȫ -8}'znD6!E[j{gc߉U"x:a&=2ij;v>γsSgţ,GDM.F0h{:bi̭`ɴg˽DS=[m wro^m&S r~&SPTO -q4A"~5C9=[e>[q8Kvɝ{}B-9+}/[>+9̛htDJ=WOb I-u}ȓN[h9 'm|qHe-WO2;!;9M6MIB(abB] Z I766꟬#iɺlx ϴUCd—_/1E~y 9Z9tegod(]in־d3_E?X%2#O?.wѬWrjic2&f_X%Ҋ|d]C%O1e}uKK.R%"u!"{9v쪥C8XRE0- r%.lk,2]r3l]CDu%]{?.nk/4J"bÃYsWUUM|I___ʖ ͤzkEHOhɟ _+ 2·5L2l†Inoz{{ -P? P0a$T)x7xB~ bXک0'/ -R4# Hⷊ.4)I_X,V]jk(9AsΎ Oo@q(rtW| eee˖-+/_/Sn2j-)1Qͫ>)-Z N'􍎞3w]-J=zltttŊg7LFDDX$͛7gΜϛL&9?NK,>̛7/%v\sU|nӋ?/>cﺺlhGt*(ow}=G^s韓7wnbgG6nz攔o߾;FFFO>uo#_ʗ_} q֭W;"zǟxfyݯ|a9fPxOӟs{gyןoy݃s}3?vϽp |q^쩡SO}fޫ̙aู_xq?n}){k;wJ555%%^ǿ{.9%_]:UVV_u_{U{{_Ͼt-Vs ~׳55Ҳ[;_-_T $&oOQS7>o=sz߅_rWlz#z׭YC{\Xqwׯytu^W:t6idd׿ >y> 7^ug~x׿U{gzLz{{'PDd0I'===[[?}ekOO5\z۝G>::zfx~;.:'rɓ'c5W_{w_v5WsUWb9sJJJnzzz΅ |·nYy -"KKvO$:<<<88422p'b%%%>_{ VVV;]~պe뮵K/~_jWr_.[+/ewܼxh^"O믯gΜl/z{\tQ%"k$ܹsΝ;~X,F& x+/cx^ͷ.ѳgϞWZN?>:zV<{饟V_oo~w~722po6ꫯutmW=VRb">}S޸e? .Xz[kΜ93tjhtw7ѾmykϞ=^x]s-_oױ}֮λ`;˫wuÇ뒴߄w;0/-[^暫 ~2n׬dP>1L$0.!i(nQ`\1xO/`3'f7ȬʿbL&Ӄvo]'ONɩgϞ[}sG3,{wW<sIUO?ls̟?ܹ{/+xWO.[ ֭[>|cI飏nx罿]+W[Gճr>W^_:oF?;O}Ν;˿l^0ӟD488T}H4z/xܹHى'/]ndddYy Dwꩫ;N:jժ?ޭ{'N_e}*8pppp4]T毺.]x[=m>^_ʗ̙߽'ܴ]ӧ|?C}OX6~?r`?H;替40o-\w}044t%K0/ﮤ][կ޼lٟ9.͛_:>_}ESpdOM&DŽoW\qUOW]u-/w7Tt?|SJuܹ? I_ػӟSO/^l^+e˫^f~geuw776ܺ~/w8po\{ΛgG^y5" -8q/Wn7o^Wכ3gΪK.6hǎw[jddr$'c1 -l8}g>gy|ќ9sK_9s'_b+?z͵W?~tݼy~##o[KQ…g_æ:uꩧ7~?3ǿu۟~ؿ_:yࡹ_ee}߿.xcǞx__p:|񪋏;X,{z,Y=ZG}׆N=F~{CMuǻ ϸoyse˫_R^@D}8stǿ[ʻ߿ǟ&"mnSz{z:;7mÇIUff2ku~3/UT\W?+[8xٹs飏vRccSw9}u )m99}bSk+[e&MS>T3kz#̛9B Z$&ll$)c$fj9xLϱ,˲\\ 1V8Kd\MP_":#>Lp+ILF,nZ$ܓ{e 2;}qTGpc5N-,˲(׊ p0-lŋ[EjQ ۷ԩSS]I$u#`w8IЄ7N-ޜcALB(z IC/%#)YtoDk DD5V CfeQ -uGB -0-7p{{Gɫ2Y=(_nLErF<|5JL鹿Cao00uvK$C$B6Oqr=G %5E"Q<`=߷p3g/`٪UݻO<88tkw=>688pcG|ܫ$DŽ1S#Gor<ϑS9s=zĉr.)c|'/^T~m!jڗCC$itDҔ&QӇ<9ϑcucǎ5l>)n߾}XجwOʓۯ>GQF?I20o``v{~ UR?x`A~-ٶm7i 2董GKWPOV|;bҗ}w`ށ}uHoPj}'<.N)K?~9ǻvBhiHt"-΍)I6t\,u2ON~5R/IKcYJQc6;Qf"SR\Sѩ0a&$~袋Ν;{1ۯ\ԿhlZm]]UةS+.Wov3W8~%Kϝ; Nd*9{ܹsl0V\yرe,7o^YYiżl~O<|6&! &23?"--/Yqbdt袞o*µwc0)ZrE=z,niꩆpK.ӟ:u Ϝ]h[ݞz.9袊 / 🰟;~/`Ν-*~񮚚'bgϞݳ':LC:uODd¿Zmrxe˖^]y۷֭[;w'/ ӧO/*_8-U׬9uLuŋ>|E/StwZli -^:zjؾý爔M,3Pn9f?u?_yƶs'NI#>,o'.. c/p5k,k,X0cUǎ]p4Fkѣht… .qfbt=xЉ'V]|ҥ/Xtxd͟_v`A}GO>uׂFΖ~#8yK׍vuη'O$j`yL&O.]tܹ} sϟ?Ge7wЙ3gR2b燆Ntl8+"$hy+Ggssp݉_ϔ$˘J]"R٢8-Kw\ҡO*E%C.M1N]vGfjXWWpٲΝ;q$ٳg|3Tq .ܱ%K8o^3;9r444tܹ v8Hk遝 _]5BgßC[W_ec,D]% 0&$~;rG7UNQ~3"%{c̦uС-4IDGv/̡ό\xL龧]db4Ç%L2RcZII_m{W]u ͛w%KwwZ^&G /\:m:/VnҒo*m.]RWXp/~˫sι n(๨u -,ʋ=6kb\ƺ]"<lß{S!"\}rF}e2b [[%xl ?&NbB(z &^]ӧO-^W\~w _όWW/\H1:^8~ْ%K_ZZZZZRE]XVVf6>=+|ٲeKߖ-[zK"O%s_0?9_|E.]R2g΁.є-F/]Rznl,f:]M#e3s*/hq+R<8\>Gi%%si4ӣ * >-Ofs^vl9s9sz#ǎΙ3gnܒE%s*J=}nyv`IɜYnŲ:f(ƈS$bkr1Drf<,J[k %[^dj`%83V2\4OqM޷{޷h4"V"XMu!AR۱&3w,w/Tyn,yt[ZxY&CBm"-#Ywgr5aAaijli6o6A;%ߎ==4G>ɁϞ/ǜjS֤bV18{\Ra߬> n""A8 sw݁sòw?Rq6i~*,P3ɓm0!Mr\WܮHuDŽ6C̴?>|ULdiGt7/fIa^:Zͱ7Z/5Hb29J_͐P ~fW\o}06W74A; -6q{<]Ҕ m2i|}aEď#xKv6Z395E˲r\T]{17WL졇6jtW3}#Z^aAR%'@UucVWW_xu}-Tmwx(ʭ)9Vr@#ng[ie~!q+HtS% w! =liә||9"h5S2S'β'K3fiΆ%d$ -rٛe` -~|H:pGHF˾n[{ :/W8ΦzsAlij7fɜIJi| |Kx{w0܃.. -4)Kl &Aah|a+Zo F/AP$0} -o#S23g -唠[~ܜH'WARpi42p|FRJ -$( E\g9w@1A3$M"(G|:G(JB@RBsR _%dS|A9-%!,xNzN]'2Z4ӎ0ћܜ<ҶK!\ےO -MM;]X2ӃdJ\ @c -dYcKEkV,5Ӈ ANܙ,yn x&pXrBBu`pyC|UKCѦ{2f -;lYAQ9rX6j| wNClDX)N% G˶%Vxqgcz8!1,aT8 62'8t8Cr\^"ߩOO& -<ٰ(\ [{&5n[{ֶ&#}t6ԛuv5u|oL;Ǽl:}^H,!W6\jwpYnmSkIJ &P ȝu_o"A_08L/ramP&ġi$K:2eHQR|Ul2^,m[ LF>itH -=uFph\i7JvR-!W69~s]-4ș -| rg$[vv֪U+9&26]hll\WWW۷vv4uqk֬p\P(r)x Ô9r, 45EQ,VUMMU.++xzך2蕪*ܷйIJօr!3He -7@AI]s - -r#AAn6~җB!ėrrV:vDiiuMOOqH$Ғ&˗\ϔ]*\>ϟ-+Rwuי3gEwWJZzdx7\QVV NLLs.\Z|W ZF)TC᝽2ˍ vj9`$l?6;;_RY/!1Hb ]g(Jfts@8.|u7*z 4KJ=p_*WPPXӟUWWWSMV)%mf |\s -bÃgg.{(psAFtGtEq/MY<B }Cʠ.YZAXĉSĒ>'ᒒˣ#G/EE0L|Q)8 d;vbO1u/}Iqܯ~U.z3ih'6pZU, :m@4MEC{yD{'&e(GN#¼)I#4$Dθ3g1 Vkޙ<7DZp_. -]? =qߣ_'AlH[umC֑r 3DMk[- ,7K:6{8 H(4.*GԦ|#碯aYa96.6ox#уnwrPMah#xw7'_1etbT ET&S>\[Mڈ'  -W0)` wm6Y2zѷ0ͷL^$ 8~i@ ]RV+ǮMOMKRD›pR2ndJrV8szB)‡RUIhhR>X:Kfwg7)(K txV!D< -K&4IԂɴA@ - ;D6puppT8&!lh 'njO`IJ  rK$ۦMFB}]|87/r~GBwڟmvv(K!}35kfggY͙s:'&&.8qݺ** {'\XT(IQtu>Kᄉ >NVeee% -))!wp,] v,_^Yعcwxk}}|U*EX{MA؟TX-6ĩc%Uẍ́{]jZL*R4UW/˰aUݷjo!-hS,zcURJͽd+u+6>ްz6K ,5r~RR/Wjk~뫳WC4fj "3vv6vYڶ/tg"lWغYW٭qX!\K;xЬфOͽ2z` w`|rrB&s]]]put~cnnxHG{rss`>Dt(RkԢRcp!JT߿{|>qQ(sss/:.ByYXf|ܬ'Nߏx|s| SED9Epp?=+̃'ɏW6b%9%+h8ƛ?jD"4MJHTݡe_s! (Dtg@ DA$]CAa^:Y,Au6ԋ\bδVΦAs޶dجt VN_ ƶ Wu7,0+Bϛ5fss2O"\ KbA8v=;99d =$5 -33I<0Kg7Ofc%.%O)23;z -ŕ a%Jx9.fE r$hDI?m$KX$7#6'Ldu<.@46!oaqlW#QAAx- SyU(UTtBsΦzS[S\9ad4$ >9aj57פ7&5憰H&jeBpgSK`جr\%4]ryKDZH?B "byJN#,G=eEXgdH(ď8 HI 'L3Ex D|HaDBl/lmkODLgS 4Hamb4 L]fghlhh4-hSyF8¡3JYVXXx=wuu|7K$Tbrre}U?95q.֬RWTSp99|'abePpꙙYV K{{{ct:](j59Z55h5i#+s9Q`!j^@8.0Wg:}Bv*XhD IIs*i$tGNʵk:Ɨ-+TT#7'we@PUGKML%Gz9[ҩsRJyfyܜ/~*j/>p8zݯ! Bmnajk>^F-zs{8>.I:{j:;hޞ٤)^oN0غH#Hش,,d!, -8YOK,{8)p^wU/\)-+eBF\ :E^AL0蕬,uP(nwH%˖9sY,"yˊ7BHQQ)Z"L&S(CCqi-9Pv~VsyĖBLiii{lnNmhhNN8K[,(YH~~) +볕zz?>VZZ<22Tiar\6qb"aeB*DYuy,HhV$xJ91н ;]܇GdI*ajU܆pn&:H6UN9$<79eAX'pW[!Am*YNc``[YI _ &=N\X)9x:(f9dyDn $YM %aU -DAi|ZOB$ITL2Ic_D%L2. "4d҉300p M >%Ad՗$~2+KR+>kT\{?2;fffGrrr>hlNNl: -Q- `0'! -y0J%Ra9șj=Z&$ԴVhssNBVi1t=3H -b(voڥDs3~/>}}wD'? +aXJ`XI2U&IMp*)4'(rq5raJJbzz:778LrBPb"4HNIeXXMtyydbb2;;(ϧhҗGAA[%֭/K}?͕UI2#3n}ܴi㗿MtH!LJرcPh]RpZ"JUYYi[/~Pl&F| +K;>>3?=+jE,U+:9}(??E(+ B;=<#< pXQJVC/Hͽ`駅Csei D^FěvB= ID4WNR #W`0x-3ӝӺu]{YA#QIUs!.t0T)Q@{+\@&}s8pOϜ}ڋ.7 _O0n$)@SAD~X.jhᩭ[mpŵk>uS}{>v/3q^f8p8fZ[OeecYL -1F\l> -h蕄r`ҥBv箢B&J"ܳޠ3H$4R{e&TRFf+k6x8OsR4DOE+E .'╈7qq)4 ҉)WG"`hh`Xyyb| _&ydXaaRx!RlWc-thA~VKpNh2V]P"9snK #+R;U-WrnNUY}N@ AASXK/ O>9422|Y~D4˲BH4%Jqb1Hڑ!H,})(A"< l6|K{Hlpr3P,R4%\QQ²ܑ#{ wOm^I6%#2VAဃpΝX, RBX G8Gs`f8CAA;%Dv0D6[xQHdRmTRDA*s4spaD_z~H2"-$ [$I"i*fdWr8 KIN+aPۛCAA[ŷ!4M4۞/W.8f9JB.B!Ѩ9Q,Q-B,KQ/q5y1B|3_'ZYsP@BڊEI\;=ҿ?H1i" -c‰$jVJBSqZX?QQy?#"#Jb !C@At  mo4M<"JnסCGGr9|ts%B(B4uvvˣ>Zt=z"ZϲlQQQ'ozr[S[w_NN6ǁɹ.ùsجJ;޻6??o\0JL*ϕqW6ɚp1CņJxd!V'nVH\a:IE$IPrj--&՜jg׷o;|Eӧd NTvtHKUj -ſ[sʤ7w;/ ˖-r4TR%٨bt  pS|ج6>9p@5ܞP08p2nq799p%/,I / ;>>>;똝M|BV0,0p:]"1ߟUOMM w\_( +(K|s>cpAV})}2b}Y\2qj|s@ OKГV<)wă䚣C}811gB1EcW(3p;{>//777fMMdg + yȇa\Ad``F/Aa`0QL4롃?=3x8gϝOqP)#GMQqp!nͻ‘l:xs4l:݂p@evUiBƘh?gH2"a4)E‰$XkTE9y(b[(@%~\ɩpjБˉ!OhhضGAAۀQ;\[4 I:.eSclǟ4>_m#4p,$U+XEhv%Ex=Iܢ0 TUU% ʢ{~Jz}T* s=4}MBnWU^3XwϹ%|Ij+"85.Å ͗%Uiyyy4M-_V4=3 P++u9cnNRr9@ sĘ(gg  !`X%Jϝ;oX -U*tׂ   o1 ~B@J dVW>EQ+c4YsLaQ+O=~Un2/7]{cٲe"T~SW{Μ9rD!dEuU겲VJN:#ߤR-/Nΰ6"WTTZJ{_7_/|IDc̗K=dY7SN!O1Q)%+/+FF}R?E(L -2VU[mwu]TQq{jzjrrxxjMJhPݫAJx}1"@rr\+//+HC_u9A`߻k"yqs-␹׎^YṬ;]O&W苓m_\ ,FQi -XaJE|L&SEN5sE.AassN+2,#DSYP(Jsss&''Ebn;x9OJ%ر999ݽњ1PhaFUo{' -sggǏދ1/Ϳ^we"m?FQF2_dOZ,2"/( fhb`Q( -\"|>YɤP(7'g|b<r y7.Xb@ gHҹ9'OK$\.G A8ScGӚ[ͽgNTk^uLoe"  7oBA[8_?:΄hޱEޱǓGǣ|>4ىc6IT)Lg&b^>Q"c20%/@bۢ2OĮt3I z#.d~|Ÿ|0 k/N[^Dl4dYe2dyV[ *nD^?վh{={ L%!@"E\g즄PeZ2vVL1OD* 3jyRnxܭ/fH:x@ 9_m!2$߄D|Z&Z0$P8 ǂ\;a: ݭ&56q VSqᛗkgetR5vÆueſm[}qcWC2IE#!|5wAvf Ȥ7ebtݗ8vgk'Ϟ=?+dzRf9 ֯;q*EE|Bq؉/}4>>QZZ<3=:]E~^D*瞵*29{nUTTp,RYO?=~:.\hO8)[#SI% kҥ)'awW]B` pWgQJYĂ3#_u?wJ6\Z4ʑOD'e(~R}D8 ~2<98% G?ﳌMlWgΜ8N_;z|fZqJ>,/ -B dh575//K_2Tݻ>XEH0*))nkP.-cb\6[FCg9%=gijli6o64u.ɲ2cn[{)g,KtOZ36O?wZK|Kx~QCs^Vf2"`j57W7,f3rc'>(R=Rt6ԛCL;!< 8h4yji ʊ> -/r*eh -,q\nnVGJ]O^XaX - -P!1\n^˱ ˆBP(DjêQqa1h -9P24K8ojhoeޕ{W]ц4LFQTj$J%qĽ\]ԗ$T# =PZZ:pt33 l!6͐PaK,)KfI}ӱøs*+uCKhD? P9/^J|'y+@i}$ TxW.ΐg VPW 5-[crgS[y)|vx@bIwo%z(8vıc'G1 =3| wR~:4424.>do W/8{\*aߔ3ipX-8e֔ey>Yf:j||B|AZwR8Ƒ̄ G)ƉU&@ԑIc@+I63bv{}&};~d{̜cnG#ޑAgSK`kokloX, ;LmIhM-mM|24v4CKo]yQ%ڡ6J /lH&$Q+f/{)&׽'+6Z1lLFOHHcikh5wI uƲ2JHx+f3Y3s!;ck\4;|O2h?p  M!P?$\By'@ᨤ͸W7]l2 u-)5;,}ݶT[:Zwq_j`$!o}q-Ey>R@}ߌuę03A&fTGJ2:hhQ,M"H$ٙY cccCP(IJLNNFz33yn'CG.K˗Gsss! Hhz"(JR2\!4MOMMdnF(J*LNM` x@/%Q_bq*eٹ9+}/?_EUmXE/&L/Iqjc!16N4Ixj8JRQE( -L0L `Y  -d0r:I6$VϟRxfeEnFk+%6@l67O`u_n؊dKfi_ DzD2D - ˷Ō7;t]Ǟt*|zvPaXF,V; &c';^3AHImgoC}X^Xsj>TR./hzÆuUzh5sS?9jrss׬1BCDYcp:]˵̬rffvuV~{T*;~kaVT*// Cz}eVba?x>PXRk2 0s#ǣV7n\o*:6֯3oi?h$Hn&3FТ9$y cBս犐?`:c O\!Z"(|򹹹+c˖~ǯ~+WoBӒGj:aƇreѼc -v]06z[Qܜ*2EYg{Xa+-q _MkmQdHd\KeUP-r}=r F##)[Ab,AI,{Bx˃BpRXX0pj@@"+ 8N¾ JBV|>LrCЁJjYǏZjW"˱~0 -]xI.\#GSrܑb1M\a)>p1'qwg=3g|\$e 5H$-dQ[~7 T*Ufc5zoL5ZMʣRon\Pnn!7~7IbUBMnW7$c@[/ ߜ艷2A'-g vxP4)k>oC.|;^?eS&>  @Ѯ߹Чyd䟹 q!{DE _ϒ/f(X)h88qro --E,;5555vʝ:iRRijO_UQ[q- LOX. oLTWƎE7m\Z8t\%n\y漞9OX.(H"σ%Z"cH?BU´%B(Q)yPĥNa@<ѼM·K_*>Z]O --Ů c"޽aZu-HAnk\¡Zꄤ!ZzkGW$&q)2uበWW nij4-WR]w{o*}{%ңxr#X{{>NQ?~BW[h}NMN XNg0:0^_ -e -\.+((((?~ƍ:B>=}V8FQaV[Z|brz|||2~\EEUTZFT^4PR|YQ띜ti@(WPMX 2Cq Q/[F095y]gNBP0T*|iVdFj(.疉*?*MRcI%tyܞ+cʉ LN=woٲ3X"|t^Jds:u򡡑++˲.]IryIP)**cYwǁT:(߈M -V{<3lҸ\‚;Gϭ]׿~2騘Lrpѕ$R2S1& -SMNLlc.rZջ=,*W:9=C>yL|w;HA7X Y,E[^3o&2r—phn[{ :Sphغ/4DM-tRu5TiU.'|A[o*'Bo@`׮c=s˲ AvӇIFMx#?F owbo}?ytTҥŋ.MZR<0w(>y@@*fte=zWOJF0 "N-A__ n$b.%$ ',G90oq@*wmNH /} w)y^憝s 'PMa%//dZ[֧潀yDۇ%R`mkW%gY߈OR$&FFSkӇ}yzSCDݬooO9 t!75o%籸EqMA_0$wq=!ɛ⊰ R\j)&@8i,kF\bR \#J8O -c\ua\$}DEb2E`<4E` {Bl27M ìXQ - -W\gϟ?z?f,g~ؘDzܑG]UU) -T*uYiInn#׮]333;99P8oeE*B`fxVɨ'F'+WTnBQY{6жm_կ޶+Ƈ>DAkXI|#TtHtjќb7sssov)^mX' 汸?[!~N*/߿v]~7*Y8ِ^fxxXԓxD驪Z! -DJ Hg d``6驤pRrr^[aN8 -_G]23XZ}̹+c UDwrKh`vfFFY`dܜ3gd H$O>w0_dOWXz~F=33 -y it:H@r r2 >?9>pCЂF!fHR[q׈QǛp CRqˣWOҨUK*p~z67/777fz|rTAAAn$NRh1_ͣ={rܙ碒$&3gA<@ 8qobܸALzBAA[ŷX]Z\ ;}ln^_}YYY`ukBn> -$T \VU?w9JՅ Dۆ h4`0t7l0h\H$Ofw 8Ĺ+:,JrY(8xJr"i>O>Dt xxS#!5rtpG)h -ѣ"~'펽^oM:25zM|\…c#wm{{?dPHR1 3o -DRvw L&]AAuY4/6.8NP(Z|&!`0݇ $ý^Omf IF<T*z?IOY6\fvK5*󿥭-R7/ -Fŗ C><?C~w5=S   $7 :_,ZB+rd$~˃;48gXe %$FKr\Qؔ"=Q:&J\IFa"AAY2$ɦMsM>}F*χB_ʕ+K/+@3 "suZ =UXRRLQT~A^iIiO[ϟ;r}©W&JK]((ȫ:phU` 7''+;+7'=tbrjjjJ&>}F(S%%2 9OvV}"|XUJ+G+7_qc!We A=K35I N`XgϜ BE7B~ LHe!J펽xzrj+]\  , N} -Ei5D}hvvt^, (9(,2.Tx>NVvE sssDS;Nz*ZX.J$Z%c6//4CVd2\&+H9$R <J&%4d9l~BDBSj[E -yMo:t;뒦L>oll|zzf``P..\pb(,^Z|>߬ rr.^pby R   4$?իWh+++~|xdd4%ښ eŵo(===,6F/K@n.YI AnIO%"k.[ϮG3n<>t+ gBSL"IvyN.T/ҍ   o2tdfffn.LR!as)f={>Ѵ+**u*Rat:˰,E1EQy~dgB8BT$&O^^jR56>lY!!v{gj2bras -<,9Dέ\YKr!\$YS/&eJmMM*C2^תѨCCv/[Vh<盚BHYiJ_]Uq+.bU7H IeAۆŷ`yyiAAC4}Խ3B{=wke -kk?|_x4w( -bn5kV5kV]I^xV4 ߲k( X -J511133#$RiU}Q {G#Ǵ~S)s;m -OQrE[ LM͈ӊ>F\ud!Qaa8& 6VT|B #JZFpbo'6m2>Q"|b_w_熆o9 AAA%?xO<=qr lg9rlzzT"!rLMMjsϢP(XUk4tbbrv12r+ssΣGO}wCNN쬃aXaK3 ?wr{aR9;!/( -W\)nYL5GGV?qld<.)b, 2b+N#7/ R0uL, -uٲ"xo Ճ  w EŢ{~ 'N⏣}A$l6;ݱAB^u7gggSM0 ʕ؎!̉T:.̸Q;+Nx8C(F D±lX J. -}KJf% )F]m g9%Ub}Y0W]2ϫ/EAA;둿䖆8C`%P+N #%rlY@ YB v2 a*ڄDXheԓF)$R$f^(AAA%޵*j||~PJYW´~Hט]|ɤ~E8\WZH+eRc'?nfvdfz©srr@9΂|mvff>JJ`,0 -ȑ?H艉I~QrWd+@E(&gS rTȱ紇V4U6䔕؝sN5}|>$6yg"Dv ͨ:h.NПjAeiiUչ9@i*77j-ɦ dUNOF, :gGAAەů eDަQ.fGlV+Jry^2&gei - - - -wmIIqEE!W*D󖕖XQU\pUVĤIIIq \w}9ê˗AJUPP ( -\nq*K -)7=[,Y3P kA-ٔYY'NREFSQI98-?d.7 ςPL4*(Z677\QgeeS0H(iWD/[N-[Fyk*]~  ȝÒfΏ*JT;Jp B? l&spp68hS>{Ξ=J8 !t|ejR ,s><9OEY1E޳t;ʒ楄D2ѩ#3r`TC8Z2#u -F>7s^Sx½Є   *i[wV)uBcE~ֳg#`|3J"DCD[9I2I`#  w2o4=^˰@,g]sDf禕2YQQz:]EĥgJ x(",+J9  -! \ Yi8"EqI#% 08L&˅B!Ȓh3Ii"@79 WFff}+[?v%lU&@ƚlā$rKϯZQT~O&Qx(8NTݞP(d|k8.??O"j5jdr:z}=Kfee\Yzaffj\~FNk`UVQQNQDR?zk׏|>qՁX~ȫ3H4px*('0\_g}qƍ?xC#ZzժUUʎݿ+ s{L*/p>~ dgg=ݰ- _t9Y˗4MoX]ưv99?7  rSBr&'s&R)T:hK\ bs\.ˣWGTfW(9G.dg꼼˗Gggg''&v܅ rT*ӳR4 -) -K-h4jc$W(\.#ǤR8<^!9 |ܜb#/7g c`0n""*9bq2==sevfVRYL&s8FG,{‚L7p'O˵Zm3 2l: -šC@VVqO_"Y%Rmnڂ`vvv}  rS:p ҝ_#Sc -v|\ƋP(r&HgTԟ{ϒW26&5Q˽^B:fE1jyZ9>tp >o߾2AAAn6~<=g,W88نvLg矓2'}dc8)I+8   7%FG @W,CaBM4MTߌMd´(jLj% \E4-I372*ګmnƥ0豣=C^;zks-}GSk23_!퀡 0: fs D=;M"s{ -,]CAaFL57,8{.e ॺO^ʕYZL&'JZ嘝hV-++egg/|s B&4zy e9R955_711F_퉩lnm0nWĤ# j/m!۽ ~qVOyvXxOZx[FC۰>fA%#^-%뽫0*pyȵQHWSguH~F=ah^ӻ`mf?cRWAAtgSa|[Ϛkt Eywf˕Z8jAۍ7攖OLLL2+Z ΄fw.\op:BH/ynĿ !ъtKbF4EOv4@w K mwѾjи&n - -PZEE1P!pj]ېg Tvk|E&˻U:pGF4Kކ]oK'U}amk7A1جoĉu6ԛ[M VHMgL7  >ChvK^\r-T<99#/3 sk`00>11<?.~"ȵaѠÛZ1oooo7\Ҷ$ 5- Qu!هG /u7lj6\h- -bzfRx7nVܾ#Go>'JJˊffgyYmXT*<[VVr{sJ%Ä(,*t:.qy<t-ʥݵ5|~6qV޵f!qatgSo,+5q5#Q"SWl@WMN04vFkz3@ -Ei_&_ܫ8 [{q>Oz!Ͷ끩^duѾKކt`s]ϭf1U`}Y7ٴUشn67E쨮t5qݷym s!Ȓ!='i%X CI",ˆB|/-Oιg~!7颔J6mv9};2Oc9(Nt "I EhI /ewi8'O(Ʌ .PX]a؏D.\xC7`߇ Ŀ˿+WƢ=ZrrnFa17'H4/;jR=h+Rpߟ?QXX$ EQgfv6Td2'%4T)^Vz<.3_뿼xeӟo\jˣWTJGX#B,V; ؛K0_썥mjhL9<7j:1j_(4%E, -`:_w=KQ)rXn/0,˲Dz@QL.Q* q\  -|53%4EKhx? 8X 1L(pG("Hd2L&i+zgO>B(@QP  |#2  -1!!dgkrs - -}!Q|iEOWQd%3w峎7FCɪ]OOBI -976MM~`h6ݒoVq+w"Ө~$ʹC?'N+0,PȔJ9MS, 8(PiaL9;xL&O,n"QWVV֗iS +}>իxBK/q·yR)ggk? BwxxaKQT(~(w~ I !ǎ -D#ǎ8n$J$w5HW1?X#EMSSWkD%16M+9ILxC2햒V5Ժ+~.ǿu4om-ߙpqakoANcI' (ӣ(!$|e`L:x[+bb!@QT;{,ޱK@ D)B$҈; -[,˅BL0biZBS"r 8-'n>:ea4q쳄 +nR௏L"D*㼾^JB:wЪ+/s:g'|g劑K҃RREV&_U{&@%_5xdpiЗC3'F+>!lN:>)BA&İEI4M 8>>O+죛6?p^jş!!䞵wWW;W(D珞~j,(rcN~8QkP`0 )JE`(h4j -\*# %I I؛T!'W,,r @4_Ő0}qzVnX`K<$L],h${z Ę5A4~[s0ða`vy9ɤ|x$$S-\"n{RL@@$ HJI::;ztG%80 ?_Beg+bYOb%rARQT9RɧD(UEBd2,++ s9wympVP_3g"n[.uYad2ĤZ|GK$N3‚߿os8R$77 ˗-ǭ\(0@#DD{(ڡϼf+>n[]sW1$PEB6oҗ _;b-tEK<AY:nUUzeR8y\T*|>?EQ+BY'enT*y:ajU 8|hYYH$4E=wJJ7>rbvvL&9VIsιu̹EYljy}T*I=o>_*XQj -EI+WJFF.ۇhw++?[h5]ycc._V4h;ܜYᚚG(B^ԩ3%%ſ;z}e dvUS3j>p4 -An”'b,)8?J3LWW]ǞN"+(P{QY[S/AqoEmRxno.ʕ1B?pP,ˣVR?dee,+׬1Pm6;fYZVCaP(2LA~>ᙟ' BPBۋ 8ɓN<2߼?mioQѱG40OFwlB8)6H%`(DQԎ|+ /OG+?oo -אÐ[]Px$ҽO< -ϦW^y wFAA5X>ZI{(>~ lnjl?鯮)iwyѣI^ހ qû}/Rտl=?@n k6H/xtj 62".NxoCR r300p ߼?n{&_m{o0~( \_-]߳%;wO`OPп'v;&%|={'[jw@Fx   -,Jdg ?/w;iW^i۴'Clډ(7szxϞFQt|Ϟ=ڞh8Us} KDO}5@ haAn>~CAAnYž/ kh77ElVj+ډH~MKVc[E7QjnfC}T g`iDr  {1,ZE`j5o0+eFS?17gDmT5Cc[ΦzskKиwgS YA AnWYl2L*_Y+/ I A"I5mJ O*og06&{+OqͿ}{W^ 7CKu [3 -!붵כS mYE.5g :}ؑWׁ5[v6a`hxF* `An5+Ib!Aиۼ[("5 -EwGzb"wF'2ƭ3*K*HcK!*\얍Wi(----h|s_L\P#blJgvu6akonlj77[{Ql*lZ^hh79R")I(lj O  όK"Z[ 7~3l~_YhpomHHiGMpov6ԛwښ:*r㾧nQ;[A[=F~1[$꾲`dޑ-[6n|r[eXÇa-}77`B'~Ս#{_x^悐]?@M[x5 rK붭[ȥZ+-m[' XF=,X9٘ -iٷ,$ۯzo߷x,^gj#st6D5Ac#a%*[Mݭa`HO,3 5P - 2* WO3p!"#A XD-)c;Stvl04~jjW {q4goK[oY,ޖHIU4ר (Q ĠWt-)/2"((_ϠJ>n{8{a=h^p۞R -pV>g϶-6DA(Klkn^~o\]<`hࡡqw]&|}-bUr.EklVjy@$qDZhn!^a-Ͼgצ{ g. o\4)Ob\]z۶=~-#2={fcfWJm?h! /1vJ#vv6כ fXYu/CPqdooHhi{vG %lz ]}ڎ^U/IzzM ,HPڛ毷7'Gv'(FͷKvn7rݙyßnƍ~;WXfUAn-8'Id -#mUIt~fy+ XzWL\wxxxIօ 7"oy'l ӻ<[JOD=`v&}~ϳWg7FB8{{y-|m*+PQQQ^≬ۊm?{uO\[`wk0@{-'YgKr"U5,POOOUUuY bjkZܒ}}r=!]?UYsn,-&_7F.(ܼ%0r$\bppg׮m?{uK%n3k7_aD֮=[K<=vA&7)7^u(Ony$V !;FN!X[Xj|D$n_矃מxb¾g]a(b)UnVY{~D|7}y)QS-#|t˫-=g<O'">E3@ An+)6rxo7=R#] |&=?=n&wXZZV0xr!=?Va=`ٲH/V}yi8Y]޽-FZFdґ2dpk{nTuw_"A[#ZK 1$yMOnRZ)(ij9y's+J֡sD'v+g|aez֡r/A Xo$=_[)*= W'1HjY۫#@H{G`ƍe#'ۈmbWy;N}w旅[4=!=?޽|Pnk{GȼER-#5eHAorC({##KQ>j%RCHOiM*ΉKgCngCP̸{zwX>B8an 2[ONnyuXxrNBF6~){J} - -or<7ֿWFwT6q/"Vs3.A}2eamInMz~DOXF  @T|;Odڪ&6^ -;9   uc7Cu?hEBjjO=ihpqw3dm3C/}i,8C[J   rY4|,V[E}5@LZ_al>aR̲ъvsߴ2]^6:ziGCED'1gCAAAdiY$rMc6N_o:0gU405uVd,V6Y-V[M :;T_ՔfMdY3Az!&  Q~34PbLiYڞjVl+ZgS~w;ސ"dgS~wd[zsx`o-2AAAn5H^^ ^w+]VV&^u!A([`! ($} K3ӃF100P[[T斔\ħ.mi   R      r   ȭo  w"sFXѐtjtlj%Y0 -%7z.'\rӰhAA[Sk{]wQPi 5mR㾭mS=:j654v4C);vl6lts!AA髁z[NgSKoEZZ{y 7&)Ꜧʤh;ك`)4qa6EHݮ9օα/luat!=-4/0b!n2Bnl,"mm,ߋdygJ9?>vl$U#c,3=f&9f=+^T4S/ƕ,Tq.g+vWE/ߞF1/4?l>oAI˶>FȡUWtAV#4rcmmJ$(Lr-gxYټZ0^dJcpI\U'yYLKKJĊ2䟂_' -bה(Lt?eV=/ry~^s M N̻O+*&d|$RtRBS/jE\ S*NNrU -\GwS㈗݋6jlK'"pKKV}KVs)7!_gRzIΑtN*ϹX4 -\xYק |՝sv"$+,LV,ʼ&Q8'yYw'ukbQ)HGRV:>~U,z/+BTD`9nḱeZBҪGWub܊8˙2q0G4*U[Kx1O8U"8!i&*..QZ.Ó[Y -UNv>eEJJX\p Xq:\@1 -\WWMa`lDD_B>mZȦ #DDl2nm.D>3!3L+N墓 -}3p|&gĊө,؛* tD$b1TNeޗcifuYQd3"A3Hf&IW']u -B%vl$|2y`KD&O coltx3pٷTNsDUE"{3 -\xYקh&I=S$W0X(jh!Iv3"^V(qv O  pI`md( e=GywC\ SUgtE,MJ؄t٣c߇4gRU;٢g$FLs$qy+;6 뺮D_Ʉ7)5o>$Բ7pKK>%vL)kYbɘɥ(!(^u| pb1Pt1tq:_(L)q#^vDtôgkôV<Բ?O>}²ŔenGxXȦo1 -n^#K3 z?=&py՟hSZ.P"W|Fe{S{) ɢ;146)3Psm7wzǒ%VsxDJK VƼ9}"z<߱@Sޡ x曄#STN:nu42,17j.>zS|!1 sHศnݜ׏z,Px^ZM;dvݢ.plxvT aefhrc<;WJsD8""Dof\FóRiqn6|[Y*͍gK[-N -Q LvkWk*I^Rw(6ot'ow]+];oj4|Joeٽ}whk|^p)޼mT/mkS'؍q-x6q(\<^+mݽ] Ui%Ăp(z2>dŢ(Fid!/7o?0 X˺C -^O_.-6-7~7b~T{eIuFs]0y,\jFTVݫa娅ښ3#.ecu+ 4K;;g pEڸ /x_{쯿~W#NQGeoMlMcadϾ_RմĴȪ_ʊEetCR^֋0a?څ zB:jVP9d^3e|k}Jۂ3f Zf߹\pIbŵl9ZƸ|-=_Z lPXz~mv7K4ry1Zz}3yi8͖ͯJDD[KK[^p]Ċt .>gR- >pvM\on썗WtjFW,K6/뙲xMIXqUyURy9S8XqU ]d+r|# -S%4}poy*qrzV\Xo^O_Ezr;4[K 1xlm^+բis{S4eRO7v*7/M+3 -uiRZbd̝aˤx?Ǝ$sCaUg(LrՈ4qVWUFe }~enSVO׿36o׶YM$毧S,Ps:"uXKQ*2˱4˺Ӭ(In"ZJLw[ +97ܔQ{=FFKNkTkC] -js2],ٛۚ">?rn|XߴEZBP"}\TƊÅͽR*(I$b+mJ$(LrS>PehTVI=0OډXvr,Y(jHU˟eŞ܌Ċ -&ߠg̏jDFR!˳5bK~{aaZjqCgέw7ޜڗ.ћI;7wR{L#PE˶94ryvym]S7]_sm^Gmgg稇 rΟ$_ -P&%ع~½gg'ꂗ\> NDbŋ)*]h -d&'d&3GQQaZQ0[euRY$" +0;6]Vna "c -w6ذpjo_;ڬ]DD݁R~f!T/+ήJs>(ʍ,͗f%p5DhG-w>z Gn2L>ȹa~]n{ڽJsDq٣@`qks jpf9ߢW`&9S/Np#9_&YDҹHEHB|ȎUgJgxR:F&t8:߈ -gD&qJQܶXK(=B^Lf6-VtmV}Z@y &:67bvWʌmÐ/Ðۭ{Fo|]QxeS#0_r㻀wV»Դ鄈?8Vi-Q_"T]|5kI-R|FwfZ_ũZGdoZ}gRvVtFYM8Ŕ[pl>~#R2QNUyIQ9ssBT>YYlL)ѝZ^pH#`4E؁Cj -{m;>=ظlJ[8R-k\*"*"-*nOƚzk\uRICpUYUt=G3HtǡdŸdU#M{P" ƨ+襗^|~M%{{{2.!o~ tlrr RpX|W*t:y>0=aO@5e o@@og+uJ"U+PNTY(Mx)~8{%@7^VF7&n1;6JU-Zޮ;aŢ>m:Ќ5wXմtSdJqR*B"g+qcO) lUK_HZUߌ1wرQkFSP˚?#Xy/2 -R*8WPȩM,xrF'I7UDE~Fʪt2 "6ja"T)UΓcDĊ\R9]y_6g5^֝fEgv̉4 -y麮+W9г70q\9[IieX _tDe t%X(Sn;7עC""uY %Qf^#-qҶ tN8D@[aŢIx(mwđI3)Jt=gDDZTV,*3|AR JWe=w(\(fth<Wt~XU jYee|Uc 9!@olwM&LZ*ಳ -6jYK:o ҾC"B3ɮl:~;'٨w=Q*egf*rJ+Ke-I7gt]&N'l43sTzB螵"m"LH;\-ϵ ߜu pΞ={CxL|9}"z<߱@S^op_MoMm>V"_JQIӑzS|!1 ӻaBo@@nN ^>=l{X+ͽqgӗKCzz4;lѪZ>xKUTKͽ~{aB xk){οbQ/!^u]}uOuLxTʞZlvuw``ϔ<\ #;*ZʎgJ~yp)[[_]٥XWkk^|Iϯ-f476[OcNp2~cFJcV,*g[I*^ TմtsT˾ڒھ͌`9n`kVu_]Dӗ7g3*71Kz}kôdOj1wnQ,t0};oߨ5ʍWKsdK[ N6Lқwv~bU7vlZ2g+߈T)o 3v%,,貇GA8nb|dl0m-]l_mpg>;k}Gkl(]\[[&U_nOjD?nt6^䯣KbNEQL2[W jDTnߨ0щ%nE$O7~Fʪ*c/6[5`NR'@X̥(uYvYeiVY'e~&ë熩VAkbZz餴͕jó̷Xvqqn6 *7ƳsQ47>Ll4 ϖ۬Nx6;i}5tk'q^ۛf&* ^-!uY^<Ũ>j6<k7ĊgչiIbK)_U t^x5.wi5|Q:JF"^>by;2rc;o.: -=Kmݽ0m~{jmzkJԬN]b%@߱gUJ*(KYVbよMw)d0 -qb}k^^NsY3eu'?FWSj\D򞻤v8ҫSXqJeOK@Q1T:bFqAѝ:` :-kM8$dƈDbqM ͏jN}$#&Wd575.yGq:_v^>;ƹЕb6-{jʍRimm8piQR7lLxݭ~k)}riFl uA#Z6PRbQ'QKЎ}NwZʍCz~ß->6Sh&)3|ARH]K&./[܅3ۦHQ -nϫ8رvK%F!"Jt=GE Me-I% .UaP%w*dHʲܺ*]t#$Nvf5iEi幨Uj4̝mJQӗgW ?I>bQb4}W@PQMJsEFZ{#熩VB Wiyb "ZߴyUTbUE|_7kDG97#T5ձ 8+ꫛ^ zG8JE/8VzyoRsd&cSkߣn[8TO&~Ԉ8ij90[ ZNt41ny⛖"q瓷wn>{z- ε&0sb7<7BJ65? [%s1h>!ˉ+t~.aѷ:c,;6D6Ȫ^]0ə( C;':8Q\jr٫y`CE["2W-.:!2CDݜ x;L\.sy$knᄝ.)G -i͠{Dj֣eJ5oQlXMxW78W?Zt Qf oJ?pG p wH3</8U!QtXߴ-L\+^LY6+^"ÇXQڹ۝ 7ا;odo/ffw3o-:Gk%Z ,JDT/+ή)LF:֢Vv5Tndi46nwޘ%\Rc_>|LWܾZxyR6|jw11o[S{F8)L -l2.+ ORcyKW+MT)sdSZ4h*NV\UF6ɂosO&)7,E\s* -]})t.9}"z<߱@Sޡ x曄A$@@_&ccWo7 >dŢ^iuzp/YV,E^[^5e=54*7ϊkf15ξ_MCt G?ɎRFK*qTq'DXTF7$+I n+3縉}/$WɲsKX@7vlZ ଍ _όn(~;g+߈T)o 3vq*UJ7ɉQ(8wGQ~o\#1*zSgox3d|&]djnKj"ۉ\R9]y_e5^֝fEsvɊӉu6M ˚ 5d*DCn• rj.JiɄVnDe=GySh~IiyNr^փ<3C˅u.+JQܶXK(B0D2 -+TIEpi _[iggRZYjW۞C9KIZR]'X7 [cf&Q2!Dd' -ZmJ9:mS<9roɄm n!Ü>ҋX{``dooPp<_MoMm>V"_JcHӑH=> a_GٳG=No;@@o@U˺޽Y=`bվFid!/G ioiWfŢ8jZb:bQ8JRi+Z.[BB""e_G՘T(:iėj ItDpQ8WA׌`!*-a)QZBb'"Lb^3eNRY(SUЂ"[/"ܓ92OKt}Z& -C^5_ьD^u=g =6;uV{.<uK4Xu/4zw齿M8OZ|%[K_=߈eezAd.rnIFBQ -N8Vz%QZ)p˺GbQ 6Q*sD/c noXyU"9GySXxGNHˊSMNJiS$Xء.0""KÁ+c>j>҇sӧy9?oO":οGV{ή'•Q/C0$d͂ -*# TkJdzǩmVAdVɎア뺮+BjzB3I$r%s eY ԞSiB^v d"Xݴ2v|&eaZ.*ҲôjgR^,ת;fVN>| nN 5S7\iI.u~_O\~=,p﹇|_ 甸]~yY.n@/7͊Wm}v+۪oBo }3e!Tc{O=Ο$""UZ9* .QUaLU()˺sQ{\2vZSYhqRTt=GimUj.gtJ4tj7ΕᱱTa2L>00(*͍٭ӗKk4~rM_zE׹ikGo՟^>mݏO?~o^.xkL)":7?O`/W-w|ߤտ3ۋޕᜥO%ĈjȚCbYVȪ3^sq[U}>i׉,t+#u."~3eWg֧*3yU/^3AxMIXqUy^oAekM„YcFkؙ$.ш1 N ZiI 0KJM nݽ:t?zo_0e{/˿/^| |uMo?w]~ ~+sog Щ냯~s_q6PkW_i^Ul4KDؼ|RiXbJ UgP\f(-EvWhرv]撻8hlU& *ypm;\o^smZ >׸rU%"ìSϟc;[۩#ioGM({*{5 y|_|(Y;kO~>kߞ>}C3p򍈞{c+#9nrv1+ՆgK7zPp¨R*\ &Zii?+^ /(T|UP:IfDmZIΉtkt.J&4KUv76xnPPLv "EIΔY[0'I's( 3܎(҄f4ɊJXK$bFh7 O/ SA_87L[TZʹ y#"bz?vIO/Ɵ<1}_?yS}Jtg:|LgbsJy]s?S--k;j. -]vZdFQ-TϞ7IYEyݲŔenm73d+^ Ds) qj8>;=m٪޾Eóނ͛S?cKӻ_?=EdB94؞ߖxn~4%NN'-$uyRoN :đˋmݽI8&GhMw׃EdR>(TrG;$%R`(\U9]' -)nj2 -6Wy(HxO]7L4w+)W_&#IǼײݶɓLFKZiۻ CNCk}vE,D/_} ?N_ooso{_E'Wut\t͓j*9^mfwnzb@qx‡sY8ۦ"rs DK/>xpc큁C~7 :6^"Ͻqg!xC -N6+pJr N#u!ӧ>C"bObѝ%=bQ/f}M^Ay9p2lA/;rpHO]W->'s~[\ߋ\ onͷ+(UithyVDghQ6WhƍZܚ;jZb)LR%8AV!AMv3/w/$)N6Q// cʕΡ5~F^dATTq*xɠJ7ܘ{aꆽ㒺$2Nkkk;cG* tsv?#XeX Xq:em5%ZP0uT"ݹ1V,eTp*:ənI#%}^{F\R9m#ɳSaZqco moֳ70q\9[IieX _tDe t9э8͟tZtHdOK5'QKl.OWOepx'L2e_'+. 洽.G%x&Uiy(jLVT)o*N)BR^ҟk(Lp\^kw^ -W6F"6J 2L=9-?ٱxܹ"I7k5 oQ-kP+8nLIR>>g6sv#)ܿ#7 ->7*oG9!@o` ?` %GߘCO7V,E[8˺˼W;C x !"*nXnm%xPUQ/jKj63縉/~lWK_HZ}u #=رQkF|#R%QS+ײLU⸉ew?#XeXoDlDҭTI0{ V,R,;ͬ4+2?,~3)tI1uYiJ4 -Ǖ3]RFa"8i[\p,s}Jl`rvzf>jF*~3+BRpdV<9/J Fh8S%Ξ܃Ew㛣M&ꜷ5(~3)͙8.Ep겒yiX%e5P(LSvd~L|~;ô3z Iie{\'(.(@DTUBaBS`*UZ9**e]ϹuU"2FH9j.ӊ0!3Ps`N~^zw=00Tw(8¯&@&D48us1 m-ߨS+ͽ~gF -8=FS/ Cߺ+J+<\R={CH=>}%][[O׃uNXvAl!;GطIOޭQ +nlcզsk-ݴ궩fa]iw0<!Cp,TnggKαy}ib$dcқt{3g$~)W}ӿ -@WxY&+Mر&p9˺~t{/TRwk$qXnG~V⪮_[G}ƽѺ2ct!'QYPۃ AFï]. #^l?~'U}״u^'}gY0hF ϾapⓟcgڼzUe-""VOEYݼ8bySwuQ;63ۦ2ZpܶiQTsì>q0;<#ٟսl:8/s/ --kdV{zE_tȮ~|{.s/?K?ľULA!""g(sdf<.T)_PBd&emf|Y=/ K87qjݦ[Uz0N0Z]mZD*;|O5\d?kdS,!A1Zdy>xR6V+y$"ٽliT:c_㯈Uh~2 1SzW>ԝcS3pC{ZxP%[ŊSڭAdoZAwկp2chQ?BuƑF8ͥxquAu8iĊN9  olV*-͎qgםaʍ-XvTZ>_6}WO9ݗ~WkgWg܆ 3y4(Lry^Ǝ$HM[aV)qvP<*9Ӝxq 9!⪞)W55gFhs "2 -"o {;G#+p\ڢ擞 {kJYLĝ4|Y_=5WF_~p{?n&T5 gO%K'"uY!)ݒ];܍}N>gڬx-nnՄ/xh7ڗO=kwG_RYiyN%^NYKTJ'5*sd0əvADZ  DDd)­dz='!*MȦ0Y0 -WUEsDZ*%{v3~0Sg9d_V/C @B$QeKYv?(6}B׳tTuJswv̙W/g^Y}9sύ'wG);/J+n>QkOsH=t{Rp !1 ? ~ؿ}oQo@@o@'Qz $;{Qz@@o@@o@@=d{ —7ɂI ? ~7 ? ~!>N6̿o@@Ɖ0юӟ=t? 8caxO "<ğNt_7O<$ y'o~CD:vg:s{OH7gے_◿'+#"> -/Width 1173 -/Height 808 -/ColorSpace /DeviceGray -/BitsPerComponent 8 -/Interpolate true -/Length 2654 ->> -stream -x1 0q^ݳB+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-J@+-\?O -endstream -endobj -2544 0 obj +2635 0 obj << /Type /XObject /Subtype /Image @@ -261883,7 +263568,7 @@ endobj /Columns 1207 /Colors 3 >> -/SMask 2545 0 R +/SMask 2636 0 R /Length 132655 >> stream @@ -262322,7 +264007,7 @@ iW ҫx^  X>;ހ%.9 W8S@K-8D@KH endstream endobj -2545 0 obj +2636 0 obj << /Filter /FlateDecode /Type /XObject @@ -262342,7 +264027,7 @@ stream xA 0C/U,;o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5% endstream endobj -2546 0 obj +2637 0 obj << /Type /XObject /Subtype /Image @@ -262357,7 +264042,7 @@ endobj /Columns 1207 /Colors 3 >> -/SMask 2547 0 R +/SMask 2638 0 R /Length 98634 >> stream @@ -262720,7 +264405,7 @@ ic$ 8 ~xAA`3Omh {<' ~xAA`)=0%D{`Z"=PKj@-%D{`Z"=PKd endstream endobj -2547 0 obj +2638 0 obj << /Filter /FlateDecode /Type /XObject @@ -262740,7 +264425,7 @@ stream xA 0C/U,;o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@o5P[@M6+ endstream endobj -2548 0 obj +2639 0 obj << /Type /XObject /Subtype /Image @@ -262755,7 +264440,7 @@ endobj /Columns 1240 /Colors 3 >> -/SMask 2549 0 R +/SMask 2640 0 R /Length 37910 >> stream @@ -262866,7 +264551,7 @@ Q@WQ Q@WQBUt( k endstream endobj -2549 0 obj +2640 0 obj << /Filter /FlateDecode /Type /XObject @@ -262886,7 +264571,7 @@ stream x 0u%$= x؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr 16 ؀cr ȹ endstream endobj -2550 0 obj +2641 0 obj << /Type /XObject /Subtype /Image @@ -262901,7 +264586,7 @@ endobj /Columns 1211 /Colors 3 >> -/SMask 2551 0 R +/SMask 2642 0 R /Length 84536 >> stream @@ -263194,7 +264879,7 @@ e `4# c0dFh1 2FA`4# c0eet endstream endobj -2551 0 obj +2642 0 obj << /Filter /FlateDecode /Type /XObject @@ -263215,7 +264900,7 @@ x y endstream endobj -2552 0 obj +2643 0 obj << /Type /XObject /Subtype /Image @@ -263230,7 +264915,7 @@ endobj /Columns 1095 /Colors 3 >> -/SMask 2553 0 R +/SMask 2644 0 R /Length 40374 >> stream @@ -263349,7 +265034,7 @@ d& To4HOn=rվ>*)-.?>wo3zwN|Kۥ{7s\Q|ӛ~o3"s-ߛ~%_~u/_~~|czmtmPw?;𫯾?p [p [`$#UGι>.jGfӅѫBNjhیF-I!H9)iٯfʩۥ];i)9 ߳w:kϣ뷿xFL9)9 3@6-#nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬nj`!醬4 endstream endobj -2553 0 obj +2644 0 obj << /Filter /FlateDecode /Type /XObject @@ -263369,7 +265054,7 @@ stream xA 0CU,#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@u5 endstream endobj -2554 0 obj +2645 0 obj << /Type /XObject /Subtype /Image @@ -263384,7 +265069,7 @@ endobj /Columns 1280 /Colors 3 >> -/SMask 2555 0 R +/SMask 2646 0 R /Length 119051 >> stream @@ -263782,7 +265467,7 @@ KN 2OmCo  ͤz,w`d(؃Cd  endstream endobj -2555 0 obj +2646 0 obj << /Filter /FlateDecode /Type /XObject @@ -263802,7 +265487,7 @@ stream x1 0!cGz4-d e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd e@Yd}0% endstream endobj -2556 0 obj +2647 0 obj << /Type /XObject /Subtype /Image @@ -263817,7 +265502,7 @@ endobj /Columns 1280 /Colors 3 >> -/SMask 2557 0 R +/SMask 2648 0 R /Length 402974 >> stream @@ -265236,7 +266921,7 @@ g %ul!crfmfp{[{t4^_,Wӣ¨,!Ǐu-hz;V]/BhWz4eF|}>s69o?u016`SȺ˙UcU320ꦆXļt|Zuv2mIt="p8,|yl~VNm6* )1@fqgdloPi<%cC, }$>|}ٽ}ޜhG")"Ci[PM1 |Yc,wE$o8C@dq^ y?Tλzcoe}EtQ;f9=GD.Wگ禷7n,7Qc0@3m&xYUظ!BdDóGz="lU@1]@D$ӬoѰ=m5_FF]4 _*7# endstream endobj -2557 0 obj +2648 0 obj << /Filter /FlateDecode /Type /XObject @@ -265257,2571 +266942,2662 @@ x endstream endobj xref -0 2558 +0 2649 0000000000 65535 f 0000000015 00000 n -0000003530 00000 n -0000003686 00000 n -0000591993 00000 n -0000601357 00000 n -0000601883 00000 n -0000602082 00000 n -0000651610 00000 n -0000652331 00000 n -0000652483 00000 n -0000652635 00000 n -0000652789 00000 n -0000652930 00000 n -0000653070 00000 n -0000653212 00000 n -0000653347 00000 n -0000653481 00000 n -0000653617 00000 n -0000653754 00000 n -0000653890 00000 n -0000654028 00000 n -0000654178 00000 n -0000654327 00000 n -0000654478 00000 n -0000654625 00000 n -0000654771 00000 n -0000654919 00000 n -0000655054 00000 n -0000655188 00000 n -0000655324 00000 n -0000655464 00000 n -0000655603 00000 n -0000655744 00000 n -0000655889 00000 n -0000656033 00000 n -0000656179 00000 n -0000656330 00000 n -0000656480 00000 n -0000656632 00000 n -0000656798 00000 n -0000656963 00000 n -0000657130 00000 n -0000657280 00000 n -0000657429 00000 n -0000657580 00000 n -0000657715 00000 n -0000657849 00000 n -0000657985 00000 n -0000658116 00000 n -0000658248 00000 n -0000658416 00000 n -0000658585 00000 n -0000658716 00000 n -0000658848 00000 n -0000659001 00000 n -0000659155 00000 n -0000659324 00000 n -0000659494 00000 n -0000659660 00000 n -0000659827 00000 n -0000659997 00000 n -0000660168 00000 n -0000660322 00000 n -0000660477 00000 n -0000660631 00000 n -0000660786 00000 n -0000660919 00000 n -0000661053 00000 n -0000661225 00000 n -0000661398 00000 n -0000661550 00000 n -0000661703 00000 n -0000661870 00000 n -0000662038 00000 n -0000662198 00000 n -0000662359 00000 n -0000662522 00000 n -0000662686 00000 n -0000662817 00000 n -0000662949 00000 n -0000663092 00000 n -0000663236 00000 n -0000718312 00000 n -0000719093 00000 n -0000719240 00000 n -0000719388 00000 n -0000719549 00000 n -0000719709 00000 n -0000719871 00000 n -0000720021 00000 n -0000720170 00000 n -0000720321 00000 n -0000720467 00000 n -0000720612 00000 n -0000720759 00000 n -0000720903 00000 n -0000721046 00000 n -0000721191 00000 n -0000721342 00000 n -0000721492 00000 n -0000721645 00000 n -0000721783 00000 n -0000721922 00000 n -0000722058 00000 n -0000722195 00000 n -0000722331 00000 n -0000722468 00000 n -0000722605 00000 n -0000722743 00000 n -0000722882 00000 n -0000723022 00000 n -0000723174 00000 n -0000723325 00000 n -0000723478 00000 n -0000723631 00000 n -0000723785 00000 n -0000723935 00000 n -0000724086 00000 n -0000724219 00000 n -0000724353 00000 n -0000724506 00000 n -0000724660 00000 n -0000724822 00000 n -0000724985 00000 n -0000725138 00000 n -0000725290 00000 n -0000725444 00000 n -0000725587 00000 n -0000725731 00000 n -0000725882 00000 n -0000726034 00000 n -0000726187 00000 n -0000726341 00000 n -0000726492 00000 n -0000726644 00000 n -0000726785 00000 n -0000726927 00000 n -0000727074 00000 n -0000727222 00000 n -0000727367 00000 n -0000727513 00000 n -0000727656 00000 n -0000727800 00000 n -0000727945 00000 n -0000728091 00000 n -0000728229 00000 n -0000728368 00000 n -0000728503 00000 n -0000728637 00000 n -0000728773 00000 n -0000728927 00000 n -0000729082 00000 n -0000729233 00000 n -0000729385 00000 n -0000729537 00000 n -0000729688 00000 n -0000729841 00000 n -0000786520 00000 n -0000787455 00000 n -0000787605 00000 n -0000787754 00000 n -0000787905 00000 n -0000788049 00000 n -0000788194 00000 n -0000788345 00000 n -0000788497 00000 n -0000788658 00000 n -0000788820 00000 n -0000788992 00000 n -0000789165 00000 n -0000789316 00000 n -0000789466 00000 n -0000789618 00000 n -0000789764 00000 n -0000789911 00000 n -0000790058 00000 n -0000790206 00000 n -0000790353 00000 n -0000790501 00000 n -0000790659 00000 n -0000790818 00000 n -0000790967 00000 n -0000791117 00000 n -0000791252 00000 n -0000791386 00000 n -0000791522 00000 n -0000791673 00000 n -0000791823 00000 n -0000791975 00000 n -0000792135 00000 n -0000792294 00000 n -0000792455 00000 n -0000792591 00000 n -0000792726 00000 n -0000792863 00000 n -0000793026 00000 n -0000793188 00000 n -0000793352 00000 n -0000793507 00000 n -0000793661 00000 n -0000793817 00000 n -0000793964 00000 n -0000794110 00000 n -0000794258 00000 n -0000794411 00000 n -0000794563 00000 n -0000794717 00000 n -0000794868 00000 n -0000795018 00000 n -0000795170 00000 n -0000795310 00000 n -0000795449 00000 n -0000795590 00000 n -0000795733 00000 n -0000795875 00000 n -0000796019 00000 n -0000796183 00000 n -0000796346 00000 n -0000796511 00000 n -0000796665 00000 n -0000796818 00000 n -0000796973 00000 n -0000797125 00000 n -0000797276 00000 n -0000797429 00000 n -0000797586 00000 n -0000797742 00000 n -0000797900 00000 n -0000798062 00000 n -0000798223 00000 n -0000798386 00000 n -0000798554 00000 n -0000798721 00000 n -0000798890 00000 n -0000799055 00000 n -0000799219 00000 n -0000799385 00000 n -0000799544 00000 n -0000799702 00000 n -0000799862 00000 n -0000800025 00000 n -0000800187 00000 n -0000800351 00000 n -0000800516 00000 n -0000800680 00000 n -0000800846 00000 n -0000801022 00000 n -0000801197 00000 n -0000801374 00000 n -0000850750 00000 n -0000851733 00000 n -0000851887 00000 n -0000852040 00000 n -0000852195 00000 n -0000852353 00000 n -0000852510 00000 n -0000852669 00000 n -0000852865 00000 n -0000853060 00000 n -0000853257 00000 n -0000853428 00000 n -0000853598 00000 n -0000853770 00000 n -0000853950 00000 n -0000854131 00000 n -0000854302 00000 n -0000854474 00000 n -0000854650 00000 n -0000854827 00000 n -0000854997 00000 n -0000855166 00000 n -0000855337 00000 n -0000855506 00000 n -0000855674 00000 n -0000855844 00000 n -0000856000 00000 n -0000856155 00000 n -0000856312 00000 n -0000856473 00000 n -0000856633 00000 n -0000856795 00000 n -0000856949 00000 n -0000857102 00000 n -0000857257 00000 n -0000857416 00000 n -0000857574 00000 n -0000857734 00000 n -0000857893 00000 n -0000858051 00000 n -0000858211 00000 n -0000858365 00000 n -0000858518 00000 n -0000858673 00000 n -0000858821 00000 n -0000858968 00000 n -0000859117 00000 n -0000859271 00000 n -0000859424 00000 n -0000859579 00000 n -0000859730 00000 n -0000859880 00000 n -0000860032 00000 n -0000860182 00000 n -0000860331 00000 n -0000860482 00000 n -0000860628 00000 n -0000860773 00000 n -0000860920 00000 n -0000861066 00000 n -0000861211 00000 n -0000861358 00000 n -0000861507 00000 n -0000861655 00000 n -0000861805 00000 n -0000861951 00000 n -0000862096 00000 n -0000862243 00000 n -0000862397 00000 n -0000862550 00000 n -0000862705 00000 n -0000862846 00000 n -0000862986 00000 n -0000863128 00000 n -0000863280 00000 n -0000863431 00000 n -0000863584 00000 n -0000863736 00000 n -0000863887 00000 n -0000864040 00000 n -0000864186 00000 n -0000864331 00000 n -0000864478 00000 n -0000864630 00000 n -0000864781 00000 n -0000864934 00000 n -0000865089 00000 n -0000865243 00000 n -0000865399 00000 n -0000865548 00000 n -0000865696 00000 n -0000865846 00000 n -0000865995 00000 n -0000866143 00000 n -0000866293 00000 n -0000866453 00000 n -0000866612 00000 n -0000866773 00000 n -0000909498 00000 n -0000910505 00000 n -0000910657 00000 n -0000910808 00000 n -0000910961 00000 n -0000911110 00000 n -0000911258 00000 n -0000911408 00000 n -0000911557 00000 n -0000911705 00000 n -0000911855 00000 n -0000912008 00000 n -0000912160 00000 n -0000912314 00000 n -0000912464 00000 n -0000912613 00000 n -0000912764 00000 n -0000912917 00000 n -0000913069 00000 n -0000913223 00000 n -0000913373 00000 n -0000913522 00000 n -0000913673 00000 n -0000913823 00000 n -0000913972 00000 n -0000914123 00000 n -0000914276 00000 n -0000914428 00000 n -0000914582 00000 n -0000914732 00000 n -0000914881 00000 n -0000915032 00000 n -0000915182 00000 n -0000915331 00000 n -0000915482 00000 n -0000915632 00000 n -0000915781 00000 n -0000915932 00000 n -0000916085 00000 n -0000916237 00000 n -0000916391 00000 n -0000916541 00000 n -0000916690 00000 n -0000916841 00000 n -0000916994 00000 n -0000917146 00000 n -0000917300 00000 n -0000917453 00000 n -0000917605 00000 n -0000917759 00000 n -0000917909 00000 n -0000918058 00000 n -0000918209 00000 n -0000918359 00000 n -0000918508 00000 n -0000918659 00000 n -0000918812 00000 n -0000918964 00000 n -0000919118 00000 n -0000919268 00000 n -0000919417 00000 n -0000919568 00000 n -0000919721 00000 n -0000919873 00000 n -0000920027 00000 n -0000920177 00000 n -0000920326 00000 n -0000920477 00000 n -0000920613 00000 n -0000920748 00000 n -0000920885 00000 n -0000921056 00000 n -0000921226 00000 n -0000921398 00000 n -0000921555 00000 n -0000921711 00000 n -0000921869 00000 n -0000922052 00000 n -0000922234 00000 n -0000922418 00000 n -0000922587 00000 n -0000922755 00000 n -0000922925 00000 n -0000923098 00000 n -0000923270 00000 n -0000923444 00000 n -0000923605 00000 n -0000923765 00000 n -0000923927 00000 n -0000924074 00000 n -0000924220 00000 n -0000924368 00000 n -0000924519 00000 n -0000924669 00000 n -0000924821 00000 n -0000924991 00000 n -0000925160 00000 n -0000925331 00000 n -0000925493 00000 n -0000925654 00000 n -0000925817 00000 n -0000940807 00000 n -0000941286 00000 n -0000941431 00000 n -0000941575 00000 n -0000941721 00000 n -0000941880 00000 n -0000942038 00000 n -0000942198 00000 n -0000942365 00000 n -0000942531 00000 n -0000942699 00000 n -0000942874 00000 n -0000943048 00000 n -0000943224 00000 n -0000943401 00000 n -0000943577 00000 n -0000943755 00000 n -0000943926 00000 n -0000944096 00000 n -0000944268 00000 n -0000944421 00000 n -0000944573 00000 n -0000944727 00000 n -0000944876 00000 n -0000945024 00000 n -0000945174 00000 n -0000945327 00000 n -0000945479 00000 n -0000945633 00000 n -0000945782 00000 n -0000945930 00000 n -0000946080 00000 n -0000946251 00000 n -0000946421 00000 n -0000946593 00000 n -0000949535 00000 n -0000949758 00000 n -0000949942 00000 n -0000950406 00000 n -0000950629 00000 n -0000950813 00000 n -0000954908 00000 n -0000955155 00000 n -0000955341 00000 n -0000955533 00000 n -0000955726 00000 n -0000955920 00000 n -0000958914 00000 n -0000959117 00000 n -0000965448 00000 n -0000965651 00000 n -0000967556 00000 n -0000967795 00000 n -0000967992 00000 n -0000968190 00000 n -0000968389 00000 n -0000970328 00000 n -0000970551 00000 n -0000970736 00000 n -0000974568 00000 n -0000974799 00000 n -0000974985 00000 n -0000975172 00000 n -0000982777 00000 n -0000982980 00000 n -0000985451 00000 n -0000985654 00000 n -0000988467 00000 n -0000988670 00000 n -0000991294 00000 n -0000991497 00000 n -0000999199 00000 n -0000999422 00000 n -0000999610 00000 n -0001000666 00000 n -0001000897 00000 n -0001001088 00000 n -0001001280 00000 n -0001003196 00000 n -0001003419 00000 n -0001003610 00000 n -0001005499 00000 n -0001005730 00000 n -0001005922 00000 n -0001006115 00000 n -0001008132 00000 n -0001008371 00000 n -0001008559 00000 n -0001008748 00000 n -0001008938 00000 n -0001010482 00000 n -0001010721 00000 n -0001010909 00000 n -0001011098 00000 n -0001011288 00000 n -0001013030 00000 n -0001013253 00000 n -0001013446 00000 n -0001014458 00000 n -0001014689 00000 n -0001014883 00000 n -0001015078 00000 n -0001017377 00000 n -0001017600 00000 n -0001017796 00000 n -0001019219 00000 n -0001019458 00000 n -0001019655 00000 n -0001019853 00000 n -0001020039 00000 n -0001021336 00000 n -0001021575 00000 n -0001021764 00000 n -0001021954 00000 n -0001022148 00000 n -0001023273 00000 n -0001023512 00000 n -0001023708 00000 n -0001023905 00000 n -0001024107 00000 n -0001024703 00000 n -0001024934 00000 n -0001025137 00000 n -0001025340 00000 n -0001028276 00000 n -0001028479 00000 n -0001029811 00000 n -0001030014 00000 n -0001032122 00000 n -0001032361 00000 n -0001032553 00000 n -0001032746 00000 n -0001032940 00000 n -0001035764 00000 n -0001035967 00000 n -0001037533 00000 n -0001037772 00000 n -0001037962 00000 n -0001038153 00000 n -0001038345 00000 n -0001040347 00000 n -0001040586 00000 n -0001040775 00000 n -0001040965 00000 n -0001041156 00000 n -0001044179 00000 n -0001044382 00000 n -0001046897 00000 n -0001047100 00000 n -0001051483 00000 n -0001051686 00000 n -0001055900 00000 n -0001056103 00000 n -0001060695 00000 n -0001060898 00000 n -0001063494 00000 n -0001063697 00000 n -0001065687 00000 n -0001065934 00000 n -0001066127 00000 n -0001066321 00000 n -0001066516 00000 n -0001066709 00000 n -0001070939 00000 n -0001071170 00000 n -0001071366 00000 n -0001071563 00000 n -0001075073 00000 n -0001075344 00000 n -0001075538 00000 n -0001075733 00000 n -0001075929 00000 n -0001076127 00000 n -0001076326 00000 n -0001076526 00000 n -0001076710 00000 n -0001079549 00000 n -0001079780 00000 n -0001079966 00000 n -0001080154 00000 n -0001082549 00000 n -0001082752 00000 n -0001085128 00000 n -0001085331 00000 n -0001087822 00000 n -0001088025 00000 n -0001088947 00000 n -0001089194 00000 n -0001089386 00000 n -0001089579 00000 n -0001089773 00000 n -0001089971 00000 n -0001091654 00000 n -0001091885 00000 n -0001092084 00000 n -0001092284 00000 n -0001094175 00000 n -0001094398 00000 n -0001094602 00000 n -0001095299 00000 n -0001095530 00000 n -0001095735 00000 n -0001095941 00000 n -0001096940 00000 n -0001097275 00000 n -0001097468 00000 n -0001097662 00000 n -0001097857 00000 n -0001098052 00000 n -0001098248 00000 n -0001098445 00000 n -0001098644 00000 n -0001098843 00000 n -0001099044 00000 n -0001099239 00000 n -0001099435 00000 n -0001099632 00000 n -0001099830 00000 n -0001100029 00000 n -0001100229 00000 n -0001102931 00000 n -0001103170 00000 n -0001103371 00000 n -0001103573 00000 n -0001103776 00000 n -0001104813 00000 n -0001105084 00000 n -0001105271 00000 n -0001105459 00000 n -0001105648 00000 n -0001105832 00000 n -0001106017 00000 n -0001106203 00000 n -0001106386 00000 n -0001107033 00000 n -0001107296 00000 n -0001107482 00000 n -0001107669 00000 n -0001107858 00000 n -0001108048 00000 n -0001108239 00000 n -0001108422 00000 n -0001110202 00000 n -0001110457 00000 n -0001110641 00000 n -0001110826 00000 n -0001111018 00000 n -0001111211 00000 n -0001111405 00000 n -0001113204 00000 n -0001113515 00000 n -0001113715 00000 n -0001113916 00000 n -0001114118 00000 n -0001114318 00000 n -0001114519 00000 n -0001114721 00000 n -0001114916 00000 n -0001115112 00000 n -0001115309 00000 n -0001115508 00000 n -0001115708 00000 n -0001115909 00000 n -0001118343 00000 n -0001118566 00000 n -0001118762 00000 n -0001120541 00000 n -0001120820 00000 n -0001121019 00000 n -0001121219 00000 n -0001121425 00000 n -0001121632 00000 n -0001121840 00000 n -0001122040 00000 n -0001122241 00000 n -0001122443 00000 n -0001124464 00000 n -0001124751 00000 n -0001124949 00000 n -0001125148 00000 n -0001125348 00000 n -0001125550 00000 n -0001125753 00000 n -0001125957 00000 n -0001126154 00000 n -0001126352 00000 n -0001126551 00000 n -0001128297 00000 n -0001128536 00000 n -0001128718 00000 n -0001128901 00000 n -0001129085 00000 n -0001130933 00000 n -0001131244 00000 n -0001131438 00000 n -0001131633 00000 n -0001131829 00000 n -0001132023 00000 n -0001132218 00000 n -0001132414 00000 n -0001132608 00000 n -0001132803 00000 n -0001132999 00000 n -0001133193 00000 n -0001133388 00000 n -0001133584 00000 n -0001135626 00000 n -0001135897 00000 n -0001136087 00000 n -0001136278 00000 n -0001136470 00000 n -0001136663 00000 n -0001136856 00000 n -0001137051 00000 n -0001137241 00000 n -0001138095 00000 n -0001138406 00000 n -0001138597 00000 n -0001138789 00000 n -0001138981 00000 n -0001139174 00000 n -0001139368 00000 n -0001139558 00000 n -0001139749 00000 n -0001139941 00000 n -0001140139 00000 n -0001140338 00000 n -0001140538 00000 n -0001140727 00000 n -0001142592 00000 n -0001142879 00000 n -0001143069 00000 n -0001143260 00000 n -0001143450 00000 n -0001143640 00000 n -0001143832 00000 n -0001144025 00000 n -0001144219 00000 n -0001144414 00000 n -0001144621 00000 n -0001146060 00000 n -0001146363 00000 n -0001146572 00000 n -0001146783 00000 n -0001146976 00000 n -0001147169 00000 n -0001147364 00000 n -0001147557 00000 n -0001147751 00000 n -0001147946 00000 n -0001148137 00000 n -0001148329 00000 n -0001148522 00000 n -0001150233 00000 n -0001150436 00000 n -0001152247 00000 n -0001152494 00000 n -0001152691 00000 n -0001152889 00000 n -0001153088 00000 n -0001153279 00000 n -0001154091 00000 n -0001154322 00000 n -0001154514 00000 n -0001154707 00000 n -0001155723 00000 n -0001155926 00000 n -0001158346 00000 n -0001158569 00000 n -0001158757 00000 n -0001159292 00000 n -0001159531 00000 n -0001159720 00000 n -0001159910 00000 n -0001160099 00000 n -0001160615 00000 n -0001160854 00000 n -0001161044 00000 n -0001161235 00000 n -0001161426 00000 n -0001162533 00000 n -0001162764 00000 n -0001162956 00000 n -0001163149 00000 n -0001165774 00000 n -0001166045 00000 n -0001166232 00000 n -0001166420 00000 n -0001166609 00000 n -0001166802 00000 n -0001166996 00000 n -0001167191 00000 n -0001167379 00000 n -0001169582 00000 n -0001169837 00000 n -0001170028 00000 n -0001170220 00000 n -0001170412 00000 n -0001170605 00000 n -0001170799 00000 n -0001172971 00000 n -0001173210 00000 n -0001173408 00000 n -0001173607 00000 n -0001173807 00000 n -0001175920 00000 n -0001176167 00000 n -0001176354 00000 n -0001176542 00000 n -0001176731 00000 n -0001176919 00000 n -0001179117 00000 n -0001179348 00000 n -0001179537 00000 n -0001179727 00000 n -0001183263 00000 n -0001183466 00000 n -0001187364 00000 n -0001187567 00000 n -0001190686 00000 n -0001190925 00000 n -0001191115 00000 n -0001191306 00000 n -0001191498 00000 n -0001194354 00000 n -0001194593 00000 n -0001194793 00000 n -0001194993 00000 n -0001195193 00000 n -0001197807 00000 n -0001198046 00000 n -0001198250 00000 n -0001198455 00000 n -0001198661 00000 n -0001201803 00000 n -0001202042 00000 n -0001202240 00000 n -0001202439 00000 n -0001202639 00000 n -0001204873 00000 n -0001205120 00000 n -0001205320 00000 n -0001205521 00000 n -0001205723 00000 n -0001205925 00000 n -0001208582 00000 n -0001208813 00000 n -0001209016 00000 n -0001209220 00000 n -0001214565 00000 n -0001214768 00000 n -0001218588 00000 n -0001218791 00000 n -0001222160 00000 n -0001222383 00000 n -0001222572 00000 n -0001224844 00000 n -0001225075 00000 n -0001225265 00000 n -0001225456 00000 n -0001234165 00000 n -0001234368 00000 n -0001238926 00000 n -0001239129 00000 n -0001243132 00000 n -0001243371 00000 n -0001243616 00000 n -0001243856 00000 n -0001244051 00000 n -0001248011 00000 n -0001248242 00000 n -0001248438 00000 n -0001248635 00000 n -0001250823 00000 n -0001251046 00000 n -0001251243 00000 n -0001252946 00000 n -0001253177 00000 n -0001253375 00000 n -0001253574 00000 n -0001255054 00000 n -0001255293 00000 n -0001255478 00000 n -0001255664 00000 n -0001255851 00000 n -0001259836 00000 n -0001260039 00000 n -0001263775 00000 n -0001263978 00000 n -0001265959 00000 n -0001266190 00000 n -0001266392 00000 n -0001266578 00000 n -0001267310 00000 n -0001267549 00000 n -0001267736 00000 n -0001267924 00000 n -0001268109 00000 n -0001269625 00000 n -0001269872 00000 n -0001270058 00000 n -0001270245 00000 n -0001270430 00000 n -0001270619 00000 n -0001271683 00000 n -0001271922 00000 n -0001272112 00000 n -0001272303 00000 n -0001272490 00000 n -0001274663 00000 n -0001274894 00000 n -0001275082 00000 n -0001275271 00000 n -0001276594 00000 n -0001276841 00000 n -0001277028 00000 n -0001277216 00000 n -0001277405 00000 n -0001277599 00000 n -0001278477 00000 n -0001278716 00000 n -0001278911 00000 n -0001279107 00000 n -0001279291 00000 n -0001280385 00000 n -0001280616 00000 n -0001280801 00000 n -0001280987 00000 n -0001283713 00000 n -0001283944 00000 n -0001284144 00000 n -0001284338 00000 n -0001285808 00000 n -0001286039 00000 n -0001286234 00000 n -0001286430 00000 n -0001287518 00000 n -0001287781 00000 n -0001287981 00000 n -0001288182 00000 n -0001288384 00000 n -0001288588 00000 n -0001288793 00000 n -0001288999 00000 n -0001291204 00000 n -0001291451 00000 n -0001291644 00000 n -0001291838 00000 n -0001292033 00000 n -0001292228 00000 n -0001292961 00000 n -0001293203 00000 n -0001293401 00000 n -0001293600 00000 n -0001293791 00000 n -0001294785 00000 n -0001295029 00000 n -0001295221 00000 n -0001295414 00000 n -0001295603 00000 n -0001296947 00000 n -0001297209 00000 n -0001297399 00000 n -0001297590 00000 n -0001297778 00000 n -0001297967 00000 n -0001298157 00000 n -0001299864 00000 n -0001300144 00000 n -0001300339 00000 n -0001300535 00000 n -0001300732 00000 n -0001300917 00000 n -0001301103 00000 n -0001301290 00000 n -0001301484 00000 n -0001302633 00000 n -0001302877 00000 n -0001303074 00000 n -0001303272 00000 n -0001303463 00000 n -0001305168 00000 n -0001305412 00000 n -0001305604 00000 n -0001305797 00000 n -0001305985 00000 n -0001307046 00000 n -0001307290 00000 n -0001307481 00000 n -0001307673 00000 n -0001307861 00000 n -0001309069 00000 n -0001309313 00000 n -0001309502 00000 n -0001309692 00000 n -0001309882 00000 n -0001311353 00000 n -0001311597 00000 n -0001311788 00000 n -0001311980 00000 n -0001312165 00000 n -0001313656 00000 n -0001313900 00000 n -0001314086 00000 n -0001314273 00000 n -0001314462 00000 n -0001315564 00000 n -0001315826 00000 n -0001316016 00000 n -0001316207 00000 n -0001316393 00000 n -0001316580 00000 n -0001316768 00000 n -0001317352 00000 n -0001317578 00000 n -0001317767 00000 n -0001318215 00000 n -0001318441 00000 n -0001318630 00000 n -0001320842 00000 n -0001321068 00000 n -0001321259 00000 n -0001325495 00000 n -0001325721 00000 n -0001325913 00000 n -0001330045 00000 n -0001330280 00000 n -0001330473 00000 n -0001330667 00000 n -0001331310 00000 n -0001331515 00000 n -0001331975 00000 n -0001332180 00000 n -0001332657 00000 n -0001332862 00000 n -0001333323 00000 n -0001333528 00000 n -0001336005 00000 n -0001336231 00000 n -0001336423 00000 n -0001339109 00000 n -0001339398 00000 n -0001339591 00000 n -0001339785 00000 n -0001339977 00000 n -0001340170 00000 n -0001340364 00000 n -0001340556 00000 n -0001340749 00000 n -0001340943 00000 n -0001344009 00000 n -0001344235 00000 n -0001344430 00000 n -0001345129 00000 n -0001345373 00000 n -0001345569 00000 n -0001345766 00000 n -0001345961 00000 n -0001346780 00000 n -0001347024 00000 n -0001347220 00000 n -0001347417 00000 n -0001347612 00000 n -0001348427 00000 n -0001348671 00000 n -0001348867 00000 n -0001349064 00000 n -0001349254 00000 n -0001350081 00000 n -0001350352 00000 n -0001350543 00000 n -0001350735 00000 n -0001350926 00000 n -0001351118 00000 n -0001351311 00000 n -0001351506 00000 n -0001352522 00000 n -0001352757 00000 n -0001352953 00000 n -0001353150 00000 n -0001356168 00000 n -0001356394 00000 n -0001356589 00000 n -0001357456 00000 n -0001357700 00000 n -0001357896 00000 n -0001358093 00000 n -0001358288 00000 n -0001359027 00000 n -0001359271 00000 n -0001359467 00000 n -0001359664 00000 n -0001359859 00000 n -0001361008 00000 n -0001361243 00000 n -0001361439 00000 n -0001361636 00000 n -0001362742 00000 n -0001362995 00000 n -0001363192 00000 n -0001363390 00000 n -0001363589 00000 n -0001363785 00000 n -0001364665 00000 n -0001364909 00000 n -0001365107 00000 n -0001365306 00000 n -0001365503 00000 n -0001366633 00000 n -0001366868 00000 n -0001367066 00000 n -0001367265 00000 n -0001368968 00000 n -0001369212 00000 n -0001369411 00000 n -0001369611 00000 n -0001369812 00000 n -0001371235 00000 n -0001371506 00000 n -0001371705 00000 n -0001371905 00000 n -0001372106 00000 n -0001372305 00000 n -0001372505 00000 n -0001372706 00000 n -0001374404 00000 n -0001374630 00000 n -0001374835 00000 n -0001375460 00000 n -0001375695 00000 n -0001375901 00000 n -0001376108 00000 n -0001380129 00000 n -0001380334 00000 n -0001383757 00000 n -0001383962 00000 n -0001386363 00000 n -0001386607 00000 n -0001386802 00000 n -0001386998 00000 n -0001387195 00000 n -0001388415 00000 n -0001388695 00000 n -0001388890 00000 n -0001389086 00000 n -0001389283 00000 n -0001389478 00000 n -0001389674 00000 n -0001389871 00000 n -0001390064 00000 n -0001390948 00000 n -0001391219 00000 n -0001391415 00000 n -0001391612 00000 n -0001391807 00000 n -0001392003 00000 n -0001392200 00000 n -0001392393 00000 n -0001395199 00000 n -0001395461 00000 n -0001395655 00000 n -0001395850 00000 n -0001396036 00000 n -0001396223 00000 n -0001396411 00000 n -0001400585 00000 n -0001400790 00000 n -0001402276 00000 n -0001402574 00000 n -0001402763 00000 n -0001402953 00000 n -0001403144 00000 n -0001403333 00000 n -0001403523 00000 n -0001403714 00000 n -0001403909 00000 n -0001404105 00000 n -0001404302 00000 n -0001406246 00000 n -0001406499 00000 n -0001406689 00000 n -0001406880 00000 n -0001407072 00000 n -0001407267 00000 n -0001408418 00000 n -0001408680 00000 n -0001408876 00000 n -0001409073 00000 n -0001409268 00000 n -0001409464 00000 n -0001409661 00000 n -0001412044 00000 n -0001412288 00000 n -0001412483 00000 n -0001412679 00000 n -0001412876 00000 n -0001415437 00000 n -0001415663 00000 n -0001415858 00000 n -0001416958 00000 n -0001417193 00000 n -0001417389 00000 n -0001417586 00000 n -0001420250 00000 n -0001420455 00000 n -0001423080 00000 n -0001423306 00000 n -0001423501 00000 n -0001425181 00000 n -0001425479 00000 n -0001425675 00000 n -0001425872 00000 n -0001426065 00000 n -0001426259 00000 n -0001426454 00000 n -0001426649 00000 n -0001426845 00000 n -0001427042 00000 n -0001427237 00000 n -0001428095 00000 n -0001428339 00000 n -0001428536 00000 n -0001428734 00000 n -0001428927 00000 n -0001430250 00000 n -0001430485 00000 n -0001430679 00000 n -0001430874 00000 n -0001433048 00000 n -0001433253 00000 n -0001435792 00000 n -0001435997 00000 n -0001438574 00000 n -0001438779 00000 n -0001440690 00000 n -0001440997 00000 n -0001441181 00000 n -0001441366 00000 n -0001441552 00000 n -0001441736 00000 n -0001441921 00000 n -0001442107 00000 n -0001442291 00000 n -0001442476 00000 n -0001442662 00000 n -0001442849 00000 n -0001444021 00000 n -0001444319 00000 n -0001444509 00000 n -0001444700 00000 n -0001444889 00000 n -0001445079 00000 n -0001445270 00000 n -0001445466 00000 n -0001445663 00000 n -0001445861 00000 n -0001446047 00000 n -0001447243 00000 n -0001447559 00000 n -0001447748 00000 n -0001447938 00000 n -0001448128 00000 n -0001448319 00000 n -0001448511 00000 n -0001448697 00000 n -0001448884 00000 n -0001449072 00000 n -0001449261 00000 n -0001449451 00000 n -0001449642 00000 n -0001451598 00000 n -0001451842 00000 n -0001452036 00000 n -0001452231 00000 n -0001452427 00000 n -0001454686 00000 n -0001454891 00000 n -0001457238 00000 n -0001457518 00000 n -0001457705 00000 n -0001457892 00000 n -0001458081 00000 n -0001458267 00000 n -0001458453 00000 n -0001458641 00000 n -0001458832 00000 n -0001461900 00000 n -0001462135 00000 n -0001462328 00000 n -0001462522 00000 n -0001464413 00000 n -0001464666 00000 n -0001464856 00000 n -0001465047 00000 n -0001465239 00000 n -0001465428 00000 n -0001466851 00000 n -0001467086 00000 n -0001467276 00000 n -0001467467 00000 n -0001469359 00000 n -0001469564 00000 n -0001471580 00000 n -0001471878 00000 n -0001472075 00000 n -0001472272 00000 n -0001472471 00000 n -0001472671 00000 n -0001472871 00000 n -0001473073 00000 n -0001473264 00000 n -0001473456 00000 n -0001473649 00000 n -0001475134 00000 n -0001475405 00000 n -0001475595 00000 n -0001475786 00000 n -0001475978 00000 n -0001476168 00000 n -0001476359 00000 n -0001476551 00000 n -0001479816 00000 n -0001480021 00000 n -0001483946 00000 n -0001484151 00000 n -0001487442 00000 n -0001487647 00000 n -0001489833 00000 n -0001490038 00000 n -0001492058 00000 n -0001492284 00000 n -0001492469 00000 n -0001492911 00000 n -0001493137 00000 n -0001493322 00000 n -0001494007 00000 n -0001494242 00000 n -0001494429 00000 n -0001494614 00000 n -0001495058 00000 n -0001495284 00000 n -0001495469 00000 n -0001498653 00000 n -0001498879 00000 n -0001499066 00000 n -0001501982 00000 n -0001502187 00000 n -0001505678 00000 n -0001505883 00000 n -0001509963 00000 n -0001510168 00000 n -0001514378 00000 n -0001514583 00000 n -0001517850 00000 n -0001518055 00000 n -0001519880 00000 n -0001520133 00000 n -0001520321 00000 n -0001520510 00000 n -0001520700 00000 n -0001520890 00000 n -0001522295 00000 n -0001522611 00000 n -0001522803 00000 n -0001522996 00000 n -0001523187 00000 n -0001523379 00000 n -0001523572 00000 n -0001523769 00000 n -0001523967 00000 n -0001524166 00000 n -0001524363 00000 n -0001524561 00000 n -0001524760 00000 n -0001527684 00000 n -0001527889 00000 n -0001529578 00000 n -0001529822 00000 n -0001530017 00000 n -0001530213 00000 n -0001530410 00000 n -0001532377 00000 n -0001532603 00000 n -0001532793 00000 n -0001533325 00000 n -0001533569 00000 n -0001533760 00000 n -0001533952 00000 n -0001534141 00000 n -0001535222 00000 n -0001535457 00000 n -0001535647 00000 n -0001535838 00000 n -0001538843 00000 n -0001539048 00000 n -0001541891 00000 n -0001542096 00000 n -0001545974 00000 n -0001546179 00000 n -0001549263 00000 n -0001549468 00000 n -0001552110 00000 n -0001552336 00000 n -0001552530 00000 n -0001553112 00000 n -0001553374 00000 n -0001553569 00000 n -0001553765 00000 n -0001553960 00000 n -0001554156 00000 n -0001554353 00000 n -0001555625 00000 n -0001555878 00000 n -0001556073 00000 n -0001556269 00000 n -0001556466 00000 n -0001556660 00000 n -0001558517 00000 n -0001558752 00000 n -0001558947 00000 n -0001559143 00000 n -0001562149 00000 n -0001562375 00000 n -0001562565 00000 n -0001563961 00000 n -0001564205 00000 n -0001564396 00000 n -0001564588 00000 n -0001564773 00000 n -0001565230 00000 n -0001565456 00000 n -0001565641 00000 n -0001566421 00000 n -0001566656 00000 n -0001566843 00000 n -0001567028 00000 n -0001567484 00000 n -0001567710 00000 n -0001567895 00000 n -0001568523 00000 n -0001568758 00000 n -0001568945 00000 n -0001569130 00000 n -0001569589 00000 n -0001569815 00000 n -0001570000 00000 n -0001570745 00000 n -0001570980 00000 n -0001571167 00000 n -0001571352 00000 n -0001571810 00000 n -0001572036 00000 n -0001572221 00000 n -0001572955 00000 n -0001573190 00000 n -0001573377 00000 n -0001573562 00000 n -0001574021 00000 n -0001574247 00000 n -0001574432 00000 n -0001576181 00000 n -0001576434 00000 n -0001576621 00000 n -0001576811 00000 n -0001577002 00000 n -0001577194 00000 n -0001579396 00000 n -0001579601 00000 n -0001581090 00000 n -0001581316 00000 n -0001581501 00000 n -0001581951 00000 n -0001582177 00000 n -0001582362 00000 n -0001582929 00000 n -0001583164 00000 n -0001583351 00000 n -0001583536 00000 n -0001583987 00000 n -0001584213 00000 n -0001584398 00000 n -0001586639 00000 n -0001586892 00000 n -0001587079 00000 n -0001587264 00000 n -0001587450 00000 n -0001587637 00000 n -0001591680 00000 n -0001591885 00000 n -0001595780 00000 n -0001595985 00000 n -0001600279 00000 n -0001600484 00000 n -0001604666 00000 n -0001604871 00000 n -0001607958 00000 n -0001608202 00000 n -0001608394 00000 n -0001608587 00000 n -0001608781 00000 n -0001611640 00000 n -0001611845 00000 n -0001614205 00000 n -0001614410 00000 n -0001618373 00000 n -0001618578 00000 n -0001621720 00000 n -0001621925 00000 n -0001625181 00000 n -0001625386 00000 n -0001628484 00000 n -0001628689 00000 n -0001631147 00000 n -0001631391 00000 n -0001631582 00000 n -0001631774 00000 n -0001631967 00000 n -0001634873 00000 n -0001635078 00000 n -0001637344 00000 n -0001637588 00000 n -0001637782 00000 n -0001637977 00000 n -0001638173 00000 n -0001641512 00000 n -0001641717 00000 n -0001643828 00000 n -0001644054 00000 n -0001644240 00000 n -0001644886 00000 n -0001645130 00000 n -0001645317 00000 n -0001645505 00000 n -0001645692 00000 n -0001648069 00000 n -0001648331 00000 n -0001648519 00000 n -0001648708 00000 n -0001648901 00000 n -0001649095 00000 n -0001649290 00000 n -0001652008 00000 n -0001652234 00000 n -0001652428 00000 n -0001653572 00000 n -0001653816 00000 n -0001654011 00000 n -0001654207 00000 n -0001654404 00000 n -0001655140 00000 n -0001655384 00000 n -0001655582 00000 n -0001655781 00000 n -0001655980 00000 n -0001656563 00000 n -0001656807 00000 n -0001657007 00000 n -0001657208 00000 n -0001657417 00000 n -0001658093 00000 n -0001658337 00000 n -0001658547 00000 n -0001658758 00000 n -0001658959 00000 n -0001660753 00000 n -0001660988 00000 n -0001661190 00000 n -0001661393 00000 n -0001663166 00000 n -0001663410 00000 n -0001663603 00000 n -0001663797 00000 n -0001663992 00000 n -0001667130 00000 n -0001667335 00000 n -0001669195 00000 n -0001669421 00000 n -0001669609 00000 n -0001670164 00000 n -0001670408 00000 n -0001670597 00000 n -0001670787 00000 n -0001670975 00000 n -0001672368 00000 n -0001672603 00000 n -0001672792 00000 n -0001672982 00000 n -0001675617 00000 n -0001675822 00000 n -0001676905 00000 n -0001677149 00000 n -0001677339 00000 n -0001677530 00000 n -0001677722 00000 n -0001678426 00000 n -0001678724 00000 n -0001678914 00000 n -0001679105 00000 n -0001679297 00000 n -0001679488 00000 n -0001679680 00000 n -0001679873 00000 n -0001680068 00000 n -0001680264 00000 n -0001680460 00000 n -0001681260 00000 n -0001681531 00000 n -0001681724 00000 n -0001681918 00000 n -0001682113 00000 n -0001682304 00000 n -0001682496 00000 n -0001682689 00000 n -0001684224 00000 n -0001684450 00000 n -0001684653 00000 n -0001685216 00000 n -0001685451 00000 n -0001685655 00000 n -0001685859 00000 n -0001686636 00000 n -0001686889 00000 n -0001687086 00000 n -0001687284 00000 n -0001687483 00000 n -0001687672 00000 n -0001688214 00000 n -0001688458 00000 n -0001688648 00000 n -0001688839 00000 n -0001689035 00000 n -0001690129 00000 n -0001690364 00000 n -0001690561 00000 n -0001690759 00000 n -0001692094 00000 n -0001692347 00000 n -0001692536 00000 n -0001692726 00000 n -0001692917 00000 n -0001693111 00000 n -0001694118 00000 n -0001694353 00000 n -0001694548 00000 n -0001694744 00000 n -0001697875 00000 n -0001698080 00000 n -0001701704 00000 n -0001701909 00000 n -0001705193 00000 n -0001705398 00000 n -0001709311 00000 n -0001709516 00000 n -0001713611 00000 n -0001713816 00000 n -0001717418 00000 n -0001717623 00000 n -0001721006 00000 n -0001721211 00000 n -0001724896 00000 n -0001725101 00000 n -0001726373 00000 n -0001726578 00000 n -0001729286 00000 n -0001729491 00000 n -0001732945 00000 n -0001733150 00000 n -0001734959 00000 n -0001735164 00000 n -0001737939 00000 n -0001738144 00000 n -0001741648 00000 n -0001741853 00000 n -0001746259 00000 n -0001746464 00000 n -0001750034 00000 n -0001750239 00000 n -0001753416 00000 n -0001753621 00000 n -0001757025 00000 n -0001757230 00000 n -0001759985 00000 n -0001760190 00000 n -0001763407 00000 n -0001763612 00000 n -0001767039 00000 n -0001767244 00000 n -0001770950 00000 n -0001771155 00000 n -0001774946 00000 n -0001775151 00000 n -0001778457 00000 n -0001778662 00000 n -0001782281 00000 n -0001782486 00000 n -0001786009 00000 n -0001786214 00000 n -0001790510 00000 n -0001790715 00000 n -0001795066 00000 n -0001795271 00000 n -0001800942 00000 n -0001801147 00000 n -0001802863 00000 n -0001803068 00000 n -0001804892 00000 n -0001805097 00000 n -0001809443 00000 n -0001809648 00000 n -0001815056 00000 n -0001815261 00000 n -0001821398 00000 n -0001821603 00000 n -0001827482 00000 n -0001827687 00000 n -0001833287 00000 n -0001833492 00000 n -0001839086 00000 n -0001839291 00000 n -0001844790 00000 n -0001844995 00000 n -0001850544 00000 n -0001850749 00000 n -0001856352 00000 n -0001856557 00000 n -0001862231 00000 n -0001862436 00000 n -0001867278 00000 n -0001867483 00000 n -0001868971 00000 n -0001869176 00000 n -0001872281 00000 n -0001872486 00000 n -0001875200 00000 n -0001875405 00000 n -0001878456 00000 n -0001878661 00000 n -0001882647 00000 n -0001882852 00000 n -0001886179 00000 n -0001886384 00000 n -0001889257 00000 n -0001889462 00000 n -0001892837 00000 n -0001893042 00000 n -0001896720 00000 n -0001896925 00000 n -0001900948 00000 n -0001901153 00000 n -0001905027 00000 n -0001905232 00000 n -0001905828 00000 n -0001906033 00000 n -0001909465 00000 n -0001909670 00000 n -0001913321 00000 n -0001913526 00000 n -0001917843 00000 n -0001918048 00000 n -0001922122 00000 n -0001922327 00000 n -0001926713 00000 n -0001926918 00000 n -0001931930 00000 n -0001932135 00000 n -0001936671 00000 n -0001936876 00000 n -0001941010 00000 n -0001941215 00000 n -0001944230 00000 n -0001944435 00000 n -0001947882 00000 n -0001948087 00000 n -0001952314 00000 n -0001952519 00000 n -0001954419 00000 n -0001954624 00000 n -0001957319 00000 n -0001957524 00000 n -0001960589 00000 n -0001960794 00000 n -0001964894 00000 n -0001965099 00000 n -0001969447 00000 n -0001969652 00000 n -0001974065 00000 n -0001974270 00000 n -0001975789 00000 n -0001975994 00000 n -0001979027 00000 n -0001979232 00000 n -0001981985 00000 n -0001982190 00000 n -0001986140 00000 n -0001986345 00000 n -0001990972 00000 n -0001991177 00000 n -0001995118 00000 n -0001995323 00000 n -0001999917 00000 n -0002000122 00000 n -0002004954 00000 n -0002005159 00000 n -0002009263 00000 n -0002009468 00000 n -0002013384 00000 n -0002013589 00000 n -0002017609 00000 n -0002017814 00000 n -0002022166 00000 n -0002022371 00000 n -0002026854 00000 n -0002027059 00000 n -0002031609 00000 n -0002031814 00000 n -0002035337 00000 n -0002035542 00000 n -0002038601 00000 n -0002038806 00000 n -0002042549 00000 n -0002042754 00000 n -0002046825 00000 n -0002047030 00000 n -0002050561 00000 n -0002050766 00000 n -0002054103 00000 n -0002054308 00000 n -0002057876 00000 n -0002058081 00000 n -0002062681 00000 n -0002062886 00000 n -0002067334 00000 n -0002067539 00000 n -0002070218 00000 n -0002070423 00000 n -0002074262 00000 n -0002074467 00000 n -0002078100 00000 n -0002078305 00000 n -0002081892 00000 n -0002082097 00000 n -0002085118 00000 n -0002085323 00000 n -0002088982 00000 n -0002089187 00000 n -0002093135 00000 n -0002093340 00000 n -0002097230 00000 n -0002097435 00000 n -0002100822 00000 n -0002101027 00000 n -0002104751 00000 n -0002104956 00000 n -0002109147 00000 n -0002109352 00000 n -0002110619 00000 n -0002110824 00000 n -0002114870 00000 n -0002115075 00000 n -0002118380 00000 n -0002118585 00000 n -0002122045 00000 n -0002122250 00000 n -0002125906 00000 n -0002126111 00000 n -0002129557 00000 n -0002129762 00000 n -0002133144 00000 n -0002133349 00000 n -0002136292 00000 n -0002136497 00000 n -0002140034 00000 n -0002140239 00000 n -0002143776 00000 n -0002143981 00000 n -0002147134 00000 n -0002147339 00000 n -0002150177 00000 n -0002150382 00000 n -0002153829 00000 n -0002154034 00000 n -0002157443 00000 n -0002157648 00000 n -0002161354 00000 n -0002161559 00000 n -0002165643 00000 n -0002165848 00000 n -0002169993 00000 n -0002170198 00000 n -0002173736 00000 n -0002173941 00000 n -0002174086 00000 n -0002174282 00000 n -0002174450 00000 n -0002174623 00000 n -0002174773 00000 n -0002174921 00000 n -0002175110 00000 n -0002175243 00000 n -0002175451 00000 n -0002175610 00000 n -0002175847 00000 n -0002176151 00000 n -0002176423 00000 n -0002176613 00000 n -0002176767 00000 n -0002177049 00000 n -0002177218 00000 n -0002177447 00000 n -0002177628 00000 n -0002177805 00000 n -0002177986 00000 n -0002178151 00000 n -0002178301 00000 n -0002178470 00000 n -0002178775 00000 n -0002178938 00000 n -0002179242 00000 n -0002179414 00000 n -0002179573 00000 n -0002179727 00000 n -0002179867 00000 n -0002180010 00000 n -0002180294 00000 n -0002180455 00000 n -0002180644 00000 n -0002180853 00000 n -0002181136 00000 n -0002181265 00000 n -0002181407 00000 n -0002181550 00000 n -0002181693 00000 n -0002181823 00000 n -0002182106 00000 n -0002182281 00000 n -0002182490 00000 n -0002182628 00000 n -0002182772 00000 n -0002183025 00000 n -0002183313 00000 n -0002183449 00000 n -0002183608 00000 n -0002183840 00000 n -0002184072 00000 n -0002184235 00000 n -0002184373 00000 n -0002184524 00000 n -0002184673 00000 n -0002184824 00000 n -0002184953 00000 n -0002185129 00000 n -0002185358 00000 n -0002185516 00000 n -0002185642 00000 n -0002185786 00000 n -0002185940 00000 n -0002186081 00000 n -0002186220 00000 n -0002186390 00000 n -0002186603 00000 n -0002186855 00000 n -0002187130 00000 n -0002187311 00000 n -0002187486 00000 n -0002187638 00000 n -0002187931 00000 n -0002188195 00000 n -0002188332 00000 n -0002188571 00000 n -0002188709 00000 n -0002188946 00000 n -0002189147 00000 n -0002189323 00000 n -0002189560 00000 n -0002189732 00000 n -0002189865 00000 n -0002190153 00000 n -0002190319 00000 n -0002190477 00000 n -0002190641 00000 n -0002190885 00000 n -0002191036 00000 n -0002191175 00000 n -0002191363 00000 n -0002191496 00000 n -0002191642 00000 n -0002191842 00000 n -0002191999 00000 n -0002192228 00000 n -0002192417 00000 n -0002192554 00000 n -0002192713 00000 n -0002192904 00000 n -0002193173 00000 n -0002193307 00000 n -0002193489 00000 n -0002193846 00000 n -0002194137 00000 n -0002194394 00000 n -0002194555 00000 n -0002194706 00000 n -0002194857 00000 n -0002195133 00000 n -0002195270 00000 n -0002195427 00000 n -0002195577 00000 n -0002195732 00000 n -0002195872 00000 n -0002196005 00000 n -0002196192 00000 n -0002196339 00000 n -0002196498 00000 n -0002196658 00000 n -0002196812 00000 n -0002196966 00000 n -0002197123 00000 n -0002197277 00000 n -0002197439 00000 n -0002197588 00000 n -0002197749 00000 n -0002197910 00000 n -0002198065 00000 n -0002198226 00000 n -0002198390 00000 n -0002198548 00000 n -0002198706 00000 n -0002198876 00000 n -0002199037 00000 n -0002199195 00000 n -0002199353 00000 n -0002199515 00000 n -0002199674 00000 n -0002199836 00000 n -0002199995 00000 n -0002200154 00000 n -0002200316 00000 n -0002200475 00000 n -0002200634 00000 n -0002200793 00000 n -0002200955 00000 n -0002201114 00000 n -0002201276 00000 n -0002201438 00000 n -0002201597 00000 n -0002201756 00000 n -0002201918 00000 n -0002202077 00000 n -0002202239 00000 n -0002202383 00000 n -0002202544 00000 n -0002202690 00000 n -0002202844 00000 n -0002203011 00000 n -0002203171 00000 n -0002203333 00000 n -0002203489 00000 n -0002203638 00000 n -0002203789 00000 n -0002203950 00000 n -0002204108 00000 n -0002204257 00000 n -0002204413 00000 n -0002204573 00000 n -0002204737 00000 n -0002204902 00000 n -0002205064 00000 n -0002205217 00000 n -0002205368 00000 n -0002205521 00000 n -0002205672 00000 n -0002205819 00000 n -0002205885 00000 n -0002210637 00000 n -0002219238 00000 n -0002223911 00000 n -0002227789 00000 n -0002233885 00000 n -0002236158 00000 n -0002237517 00000 n -0002237750 00000 n -0002238342 00000 n -0002238496 00000 n -0002240442 00000 n -0002240690 00000 n -0002241567 00000 n -0002241730 00000 n -0002242991 00000 n -0002243224 00000 n -0002243785 00000 n -0002243940 00000 n -0002244990 00000 n -0002245218 00000 n -0002245722 00000 n -0002245871 00000 n -0002247552 00000 n -0002247798 00000 n -0002248420 00000 n -0002248579 00000 n -0002249223 00000 n -0002249468 00000 n -0002249851 00000 n -0002250011 00000 n -0002250137 00000 n -0005954864 00000 n -0006025217 00000 n -0006807528 00000 n -0006811982 00000 n -0007539902 00000 n -0007544348 00000 n -0007832594 00000 n -0007837048 00000 n -0007925698 00000 n -0007932884 00000 n -0007942791 00000 n -0007948278 00000 n -0007963524 00000 n -0007965912 00000 n -0007993977 00000 n -0008002670 00000 n -0008317159 00000 n -0008348247 00000 n -0008712519 00000 n -0008729715 00000 n -0009410610 00000 n -0009428826 00000 n -0009776733 00000 n -0009793931 00000 n -0009966654 00000 n -0009982196 00000 n -0010108049 00000 n -0010140484 00000 n -0010225950 00000 n -0010230130 00000 n -0010231807 00000 n -0010242231 00000 n -0010244141 00000 n -0010866677 00000 n -0010869381 00000 n -0010898608 00000 n -0010898969 00000 n -0010911430 00000 n -0010911774 00000 n -0010914537 00000 n -0010914811 00000 n -0010916842 00000 n -0010917114 00000 n -0011409283 00000 n -0011411745 00000 n -0011585009 00000 n -0011631539 00000 n -0011632386 00000 n -0011632644 00000 n -0011635813 00000 n -0011636109 00000 n -0011644434 00000 n -0011644778 00000 n -0011646850 00000 n -0011647733 00000 n -0011649399 00000 n -0011650153 00000 n -0011650714 00000 n -0011651400 00000 n -0011651961 00000 n -0011652650 00000 n -0011653211 00000 n -0011653965 00000 n -0011656417 00000 n -0011656717 00000 n -0011659168 00000 n -0011659468 00000 n -0011660005 00000 n -0011660305 00000 n -0011663389 00000 n -0011663865 00000 n -0011664817 00000 n -0011665235 00000 n -0011668000 00000 n -0011668276 00000 n -0011678783 00000 n -0011681932 00000 n -0011682432 00000 n -0011682708 00000 n -0011686502 00000 n -0011686909 00000 n -0011687717 00000 n -0011688060 00000 n -0011688985 00000 n -0011689328 00000 n -0012201537 00000 n -0012228443 00000 n -0012236790 00000 n -0012237134 00000 n -0012251349 00000 n -0012251714 00000 n -0012260252 00000 n -0012260601 00000 n -0012268815 00000 n -0012269175 00000 n -0012270757 00000 n -0012271012 00000 n -0012271553 00000 n -0012271927 00000 n -0012272472 00000 n -0012272846 00000 n -0012273392 00000 n -0012273766 00000 n -0012274311 00000 n -0012274685 00000 n -0012275232 00000 n -0012275606 00000 n -0012277125 00000 n -0012277380 00000 n -0012277926 00000 n -0012278300 00000 n -0012279599 00000 n -0012279854 00000 n -0012280411 00000 n -0012280666 00000 n -0012284557 00000 n -0012284975 00000 n -0012285625 00000 n -0012285923 00000 n -0013064221 00000 n -0013066590 00000 n -0013152378 00000 n -0013153777 00000 n -0013203841 00000 n -0013210850 00000 n -0013213660 00000 n -0013221153 00000 n -0013223144 00000 n -0013235987 00000 n -0013238031 00000 n -0013244476 00000 n -0013244800 00000 n -0013247874 00000 n -0013248198 00000 n -0013249134 00000 n -0013249458 00000 n -0013252367 00000 n -0013252709 00000 n -0013283472 00000 n -0013304116 00000 n -0013317366 00000 n -0013317679 00000 n -0013324766 00000 n -0013325465 00000 n -0013355991 00000 n -0013357098 00000 n -0013385042 00000 n -0013386012 00000 n -0013404455 00000 n -0013405034 00000 n -0013442875 00000 n -0013444060 00000 n -0013571405 00000 n -0013573364 00000 n -0013847790 00000 n -0013851408 00000 n -0013941002 00000 n -0013944814 00000 n -0013983081 00000 n -0013983982 00000 n -0014728723 00000 n -0014732843 00000 n -0015163795 00000 n -0015167923 00000 n -0015204851 00000 n -0015207941 00000 n -0015424090 00000 n -0015427913 00000 n -0015507959 00000 n -0015509450 00000 n -0015542366 00000 n -0015545364 00000 n -0015707713 00000 n -0015709386 00000 n -0016130124 00000 n -0016134045 00000 n -0016146959 00000 n -0016147467 00000 n -0016493141 00000 n -0016495864 00000 n -0016842545 00000 n -0016845268 00000 n -0017272206 00000 n -0017275000 00000 n -0017324578 00000 n -0017325237 00000 n -0017340003 00000 n -0017340485 00000 n -0017390208 00000 n -0017390882 00000 n -0017397491 00000 n -0017398414 00000 n -0017958032 00000 n -0017961932 00000 n -0018529482 00000 n -0018533400 00000 n -0018780924 00000 n -0018784743 00000 n -0018825414 00000 n -0018826578 00000 n -0018854273 00000 n -0018855227 00000 n -0018883259 00000 n -0018884363 00000 n -0018901851 00000 n -0018902575 00000 n -0018966819 00000 n -0018969032 00000 n -0019087145 00000 n -0019091025 00000 n -0020285732 00000 n -0022052405 00000 n -0022063841 00000 n -0022064248 00000 n -0022070518 00000 n -0022070910 00000 n -0022075863 00000 n -0022076234 00000 n -0022226469 00000 n -0022228072 00000 n -0022342730 00000 n -0022344683 00000 n -0022466033 00000 n -0022468165 00000 n -0022472218 00000 n -0022473019 00000 n -0022479002 00000 n -0022479763 00000 n -0022599080 00000 n -0022601215 00000 n -0022709878 00000 n -0022712026 00000 n -0022816369 00000 n -0022818327 00000 n -0022923097 00000 n -0022925245 00000 n -0023045195 00000 n -0023047346 00000 n -0023156475 00000 n -0023158696 00000 n -0023269085 00000 n -0023271056 00000 n -0023352477 00000 n -0023353176 00000 n -0023371099 00000 n -0023371711 00000 n -0023911432 00000 n -0023914541 00000 n -0024430081 00000 n -0024433017 00000 n -0024966241 00000 n -0024969109 00000 n -0025508870 00000 n -0025511817 00000 n -0026051358 00000 n -0026054324 00000 n -0026073960 00000 n -0026074897 00000 n -0026102698 00000 n -0026103097 00000 n -0026104644 00000 n -0026104927 00000 n -0026106324 00000 n -0026106607 00000 n -0026363953 00000 n -0026366337 00000 n -0026387702 00000 n -0026388623 00000 n -0026895665 00000 n -0026898612 00000 n -0027438138 00000 n -0027440857 00000 n -0027985304 00000 n -0027988311 00000 n -0028018994 00000 n -0028020906 00000 n -0028046157 00000 n -0028047041 00000 n -0028061853 00000 n -0028062214 00000 n -0028078685 00000 n -0028079024 00000 n -0028097609 00000 n -0028098740 00000 n -0028420103 00000 n -0028422734 00000 n -0028423216 00000 n -0028423490 00000 n -0028423986 00000 n -0028424260 00000 n -0028424790 00000 n -0028425064 00000 n -0028426412 00000 n -0028426984 00000 n -0028428362 00000 n -0028428950 00000 n -0028431774 00000 n -0028432050 00000 n -0028434520 00000 n -0028434796 00000 n -0028435349 00000 n -0028435625 00000 n -0028445093 00000 n -0028445838 00000 n -0028447447 00000 n -0028448036 00000 n -0028448984 00000 n -0028449327 00000 n -0028451340 00000 n -0028451612 00000 n -0028461427 00000 n -0028464371 00000 n -0028505376 00000 n -0028506419 00000 n -0028508111 00000 n -0028509322 00000 n -0028517766 00000 n -0028518902 00000 n -0028519155 00000 n -0028520239 00000 n -0028520492 00000 n -0028521629 00000 n -0028522092 00000 n -0028523643 00000 n -0028524106 00000 n -0028525848 00000 n -0028526311 00000 n -0032091615 00000 n -0032140388 00000 n -0035902115 00000 n -0035950888 00000 n -0036434594 00000 n -0036439036 00000 n -0036439781 00000 n -0036440079 00000 n -0036440791 00000 n -0036441089 00000 n -0036441772 00000 n -0036442070 00000 n -0036442728 00000 n -0036443026 00000 n -0036511738 00000 n -0036515682 00000 n -0036811417 00000 n -0036815852 00000 n -0037102083 00000 n -0037106518 00000 n -0038219358 00000 n -0038223948 00000 n -0039789138 00000 n -0039791999 00000 n -0040334775 00000 n -0040338607 00000 n -0043659545 00000 n -0043708318 00000 n -0046812934 00000 n -0046861707 00000 n -0049927041 00000 n -0049975814 00000 n -0054716084 00000 n -0054764857 00000 n -0055046692 00000 n -0055049316 00000 n -0059868393 00000 n -0059917166 00000 n -0064429939 00000 n -0064500292 00000 n -0064511033 00000 n -0064512142 00000 n -0064566508 00000 n -0064567192 00000 n -0064571611 00000 n -0064571950 00000 n -0064678466 00000 n -0064678972 00000 n -0064732722 00000 n -0064733335 00000 n -0064814980 00000 n -0064819001 00000 n -0064842353 00000 n -0064845225 00000 n -0064878794 00000 n -0064881681 00000 n -0064907708 00000 n -0064911976 00000 n -0065241868 00000 n -0065244762 00000 n -0065311249 00000 n -0065313305 00000 n -0065403612 00000 n -0065406500 00000 n -0065502354 00000 n -0065505248 00000 n -0065638170 00000 n -0065640165 00000 n -0065739065 00000 n -0065740654 00000 n -0065778830 00000 n -0065779868 00000 n -0065864670 00000 n -0065866441 00000 n -0065907081 00000 n -0065908737 00000 n -0066028055 00000 n -0066031296 00000 n -0066434537 00000 n +0000003643 00000 n +0000003799 00000 n +0000597489 00000 n +0000607073 00000 n +0000607599 00000 n +0000607798 00000 n +0000657331 00000 n +0000658052 00000 n +0000658204 00000 n +0000658356 00000 n +0000658510 00000 n +0000658651 00000 n +0000658791 00000 n +0000658933 00000 n +0000659068 00000 n +0000659202 00000 n +0000659338 00000 n +0000659475 00000 n +0000659611 00000 n +0000659749 00000 n +0000659899 00000 n +0000660048 00000 n +0000660199 00000 n +0000660346 00000 n +0000660492 00000 n +0000660640 00000 n +0000660775 00000 n +0000660909 00000 n +0000661045 00000 n +0000661185 00000 n +0000661324 00000 n +0000661465 00000 n +0000661610 00000 n +0000661754 00000 n +0000661900 00000 n +0000662051 00000 n +0000662201 00000 n +0000662353 00000 n +0000662519 00000 n +0000662684 00000 n +0000662851 00000 n +0000663001 00000 n +0000663150 00000 n +0000663301 00000 n +0000663436 00000 n +0000663570 00000 n +0000663706 00000 n +0000663837 00000 n +0000663969 00000 n +0000664137 00000 n +0000664306 00000 n +0000664437 00000 n +0000664569 00000 n +0000664722 00000 n +0000664876 00000 n +0000665045 00000 n +0000665215 00000 n +0000665381 00000 n +0000665548 00000 n +0000665718 00000 n +0000665889 00000 n +0000666043 00000 n +0000666198 00000 n +0000666352 00000 n +0000666507 00000 n +0000666640 00000 n +0000666774 00000 n +0000666946 00000 n +0000667119 00000 n +0000667271 00000 n +0000667424 00000 n +0000667591 00000 n +0000667759 00000 n +0000667919 00000 n +0000668080 00000 n +0000668243 00000 n +0000668407 00000 n +0000668538 00000 n +0000668670 00000 n +0000668813 00000 n +0000668957 00000 n +0000720644 00000 n +0000721409 00000 n +0000721556 00000 n +0000721704 00000 n +0000721865 00000 n +0000722025 00000 n +0000722187 00000 n +0000722337 00000 n +0000722486 00000 n +0000722637 00000 n +0000722783 00000 n +0000722928 00000 n +0000723075 00000 n +0000723219 00000 n +0000723362 00000 n +0000723507 00000 n +0000723654 00000 n +0000723802 00000 n +0000723950 00000 n +0000724099 00000 n +0000724251 00000 n +0000724404 00000 n +0000724539 00000 n +0000724675 00000 n +0000724827 00000 n +0000724978 00000 n +0000725131 00000 n +0000725269 00000 n +0000725408 00000 n +0000725544 00000 n +0000725681 00000 n +0000725817 00000 n +0000725954 00000 n +0000726091 00000 n +0000726229 00000 n +0000726368 00000 n +0000726508 00000 n +0000726660 00000 n +0000726811 00000 n +0000726964 00000 n +0000727117 00000 n +0000727271 00000 n +0000727421 00000 n +0000727572 00000 n +0000727705 00000 n +0000727839 00000 n +0000727992 00000 n +0000728146 00000 n +0000728308 00000 n +0000728471 00000 n +0000728624 00000 n +0000728776 00000 n +0000728930 00000 n +0000729073 00000 n +0000729217 00000 n +0000729368 00000 n +0000729520 00000 n +0000729673 00000 n +0000729827 00000 n +0000729978 00000 n +0000730130 00000 n +0000730271 00000 n +0000730413 00000 n +0000730560 00000 n +0000730708 00000 n +0000730853 00000 n +0000730999 00000 n +0000731142 00000 n +0000731286 00000 n +0000731431 00000 n +0000731577 00000 n +0000731715 00000 n +0000731854 00000 n +0000790713 00000 n +0000791632 00000 n +0000791767 00000 n +0000791901 00000 n +0000792037 00000 n +0000792191 00000 n +0000792346 00000 n +0000792497 00000 n +0000792649 00000 n +0000792801 00000 n +0000792952 00000 n +0000793105 00000 n +0000793255 00000 n +0000793404 00000 n +0000793555 00000 n +0000793699 00000 n +0000793844 00000 n +0000793995 00000 n +0000794147 00000 n +0000794308 00000 n +0000794470 00000 n +0000794642 00000 n +0000794815 00000 n +0000794966 00000 n +0000795116 00000 n +0000795268 00000 n +0000795414 00000 n +0000795561 00000 n +0000795708 00000 n +0000795856 00000 n +0000796003 00000 n +0000796151 00000 n +0000796309 00000 n +0000796468 00000 n +0000796617 00000 n +0000796767 00000 n +0000796902 00000 n +0000797036 00000 n +0000797172 00000 n +0000797323 00000 n +0000797473 00000 n +0000797625 00000 n +0000797785 00000 n +0000797944 00000 n +0000798105 00000 n +0000798241 00000 n +0000798376 00000 n +0000798513 00000 n +0000798676 00000 n +0000798838 00000 n +0000799002 00000 n +0000799148 00000 n +0000799293 00000 n +0000799440 00000 n +0000799575 00000 n +0000799709 00000 n +0000799845 00000 n +0000799985 00000 n +0000800124 00000 n +0000800265 00000 n +0000800420 00000 n +0000800574 00000 n +0000800730 00000 n +0000800877 00000 n +0000801023 00000 n +0000801171 00000 n +0000801324 00000 n +0000801476 00000 n +0000801630 00000 n +0000801781 00000 n +0000801931 00000 n +0000802083 00000 n +0000802223 00000 n +0000802362 00000 n +0000802503 00000 n +0000802646 00000 n +0000802788 00000 n +0000802932 00000 n +0000803071 00000 n +0000803209 00000 n +0000803349 00000 n +0000803513 00000 n +0000803676 00000 n +0000803841 00000 n +0000803995 00000 n +0000804148 00000 n +0000804303 00000 n +0000804454 00000 n +0000804604 00000 n +0000804756 00000 n +0000857856 00000 n +0000858839 00000 n +0000858996 00000 n +0000859152 00000 n +0000859310 00000 n +0000859472 00000 n +0000859633 00000 n +0000859796 00000 n +0000859964 00000 n +0000860131 00000 n +0000860300 00000 n +0000860465 00000 n +0000860629 00000 n +0000860795 00000 n +0000860954 00000 n +0000861112 00000 n +0000861272 00000 n +0000861435 00000 n +0000861597 00000 n +0000861761 00000 n +0000861926 00000 n +0000862090 00000 n +0000862256 00000 n +0000862433 00000 n +0000862609 00000 n +0000862787 00000 n +0000862941 00000 n +0000863094 00000 n +0000863249 00000 n +0000863407 00000 n +0000863564 00000 n +0000863723 00000 n +0000863919 00000 n +0000864114 00000 n +0000864311 00000 n +0000864482 00000 n +0000864652 00000 n +0000864824 00000 n +0000865004 00000 n +0000865185 00000 n +0000865356 00000 n +0000865528 00000 n +0000865704 00000 n +0000865881 00000 n +0000866051 00000 n +0000866220 00000 n +0000866391 00000 n +0000866560 00000 n +0000866728 00000 n +0000866898 00000 n +0000867054 00000 n +0000867209 00000 n +0000867366 00000 n +0000867527 00000 n +0000867687 00000 n +0000867849 00000 n +0000868003 00000 n +0000868156 00000 n +0000868311 00000 n +0000868470 00000 n +0000868628 00000 n +0000868788 00000 n +0000868947 00000 n +0000869105 00000 n +0000869265 00000 n +0000869419 00000 n +0000869572 00000 n +0000869727 00000 n +0000869875 00000 n +0000870022 00000 n +0000870171 00000 n +0000870325 00000 n +0000870478 00000 n +0000870633 00000 n +0000870784 00000 n +0000870934 00000 n +0000871086 00000 n +0000871236 00000 n +0000871385 00000 n +0000871536 00000 n +0000871682 00000 n +0000871827 00000 n +0000871974 00000 n +0000872120 00000 n +0000872265 00000 n +0000872412 00000 n +0000872561 00000 n +0000872709 00000 n +0000872859 00000 n +0000873005 00000 n +0000873150 00000 n +0000873297 00000 n +0000873451 00000 n +0000873604 00000 n +0000873759 00000 n +0000873899 00000 n +0000874038 00000 n +0000874179 00000 n +0000913684 00000 n +0000914667 00000 n +0000914819 00000 n +0000914970 00000 n +0000915123 00000 n +0000915275 00000 n +0000915426 00000 n +0000915579 00000 n +0000915725 00000 n +0000915870 00000 n +0000916017 00000 n +0000916169 00000 n +0000916320 00000 n +0000916473 00000 n +0000916628 00000 n +0000916782 00000 n +0000916938 00000 n +0000917087 00000 n +0000917235 00000 n +0000917385 00000 n +0000917534 00000 n +0000917682 00000 n +0000917832 00000 n +0000917993 00000 n +0000918153 00000 n +0000918315 00000 n +0000918467 00000 n +0000918618 00000 n +0000918771 00000 n +0000918920 00000 n +0000919068 00000 n +0000919218 00000 n +0000919367 00000 n +0000919515 00000 n +0000919665 00000 n +0000919818 00000 n +0000919970 00000 n +0000920124 00000 n +0000920274 00000 n +0000920423 00000 n +0000920574 00000 n +0000920727 00000 n +0000920879 00000 n +0000921033 00000 n +0000921183 00000 n +0000921332 00000 n +0000921483 00000 n +0000921633 00000 n +0000921782 00000 n +0000921933 00000 n +0000922086 00000 n +0000922238 00000 n +0000922392 00000 n +0000922542 00000 n +0000922691 00000 n +0000922842 00000 n +0000922992 00000 n +0000923141 00000 n +0000923292 00000 n +0000923442 00000 n +0000923591 00000 n +0000923742 00000 n +0000923895 00000 n +0000924047 00000 n +0000924201 00000 n +0000924351 00000 n +0000924500 00000 n +0000924651 00000 n +0000924804 00000 n +0000924956 00000 n +0000925110 00000 n +0000925263 00000 n +0000925415 00000 n +0000925569 00000 n +0000925719 00000 n +0000925868 00000 n +0000926019 00000 n +0000926169 00000 n +0000926318 00000 n +0000926469 00000 n +0000926622 00000 n +0000926774 00000 n +0000926928 00000 n +0000927078 00000 n +0000927227 00000 n +0000927378 00000 n +0000927531 00000 n +0000927683 00000 n +0000927837 00000 n +0000927987 00000 n +0000928136 00000 n +0000928287 00000 n +0000928437 00000 n +0000928586 00000 n +0000928737 00000 n +0000928885 00000 n +0000929032 00000 n +0000929181 00000 n +0000958859 00000 n +0000959602 00000 n +0000959738 00000 n +0000959873 00000 n +0000960010 00000 n +0000960181 00000 n +0000960351 00000 n +0000960523 00000 n +0000960680 00000 n +0000960836 00000 n +0000960994 00000 n +0000961177 00000 n +0000961359 00000 n +0000961543 00000 n +0000961712 00000 n +0000961880 00000 n +0000962050 00000 n +0000962223 00000 n +0000962395 00000 n +0000962569 00000 n +0000962730 00000 n +0000962890 00000 n +0000963052 00000 n +0000963199 00000 n +0000963345 00000 n +0000963493 00000 n +0000963644 00000 n +0000963794 00000 n +0000963946 00000 n +0000964116 00000 n +0000964285 00000 n +0000964456 00000 n +0000964619 00000 n +0000964781 00000 n +0000964945 00000 n +0000965090 00000 n +0000965234 00000 n +0000965380 00000 n +0000965539 00000 n +0000965697 00000 n +0000965857 00000 n +0000966024 00000 n +0000966190 00000 n +0000966358 00000 n +0000966533 00000 n +0000966707 00000 n +0000966883 00000 n +0000967060 00000 n +0000967236 00000 n +0000967414 00000 n +0000967585 00000 n +0000967755 00000 n +0000967927 00000 n +0000968080 00000 n +0000968232 00000 n +0000968386 00000 n +0000968535 00000 n +0000968683 00000 n +0000968833 00000 n +0000968986 00000 n +0000969138 00000 n +0000969292 00000 n +0000969441 00000 n +0000969589 00000 n +0000969739 00000 n +0000969910 00000 n +0000970080 00000 n +0000970252 00000 n +0000973192 00000 n +0000973415 00000 n +0000973599 00000 n +0000974064 00000 n +0000974287 00000 n +0000974471 00000 n +0000978563 00000 n +0000978810 00000 n +0000978996 00000 n +0000979188 00000 n +0000979381 00000 n +0000979575 00000 n +0000982566 00000 n +0000982769 00000 n +0000989098 00000 n +0000989301 00000 n +0000991206 00000 n +0000991445 00000 n +0000991642 00000 n +0000991840 00000 n +0000992039 00000 n +0000993975 00000 n +0000994198 00000 n +0000994383 00000 n +0000998215 00000 n +0000998446 00000 n +0000998632 00000 n +0000998819 00000 n +0001005354 00000 n +0001005557 00000 n +0001007102 00000 n +0001007349 00000 n +0001007534 00000 n +0001007720 00000 n +0001007907 00000 n +0001008093 00000 n +0001009571 00000 n +0001009810 00000 n +0001009998 00000 n +0001010187 00000 n +0001010378 00000 n +0001014813 00000 n +0001015044 00000 n +0001015236 00000 n +0001015429 00000 n +0001017897 00000 n +0001018100 00000 n +0001020909 00000 n +0001021112 00000 n +0001023735 00000 n +0001023938 00000 n +0001028906 00000 n +0001029109 00000 n +0001035646 00000 n +0001035869 00000 n +0001036057 00000 n +0001037139 00000 n +0001037378 00000 n +0001037567 00000 n +0001037757 00000 n +0001037945 00000 n +0001039285 00000 n +0001039516 00000 n +0001039705 00000 n +0001039895 00000 n +0001041673 00000 n +0001041920 00000 n +0001042111 00000 n +0001042303 00000 n +0001042496 00000 n +0001042683 00000 n +0001043657 00000 n +0001043888 00000 n +0001044076 00000 n +0001044265 00000 n +0001045385 00000 n +0001045624 00000 n +0001045814 00000 n +0001046004 00000 n +0001046194 00000 n +0001048533 00000 n +0001048756 00000 n +0001048947 00000 n +0001050834 00000 n +0001051065 00000 n +0001051257 00000 n +0001051450 00000 n +0001053464 00000 n +0001053703 00000 n +0001053891 00000 n +0001054080 00000 n +0001054270 00000 n +0001055810 00000 n +0001056049 00000 n +0001056237 00000 n +0001056426 00000 n +0001056616 00000 n +0001058356 00000 n +0001058579 00000 n +0001058772 00000 n +0001059784 00000 n +0001060015 00000 n +0001060209 00000 n +0001060404 00000 n +0001062703 00000 n +0001062926 00000 n +0001063122 00000 n +0001064543 00000 n +0001064782 00000 n +0001064979 00000 n +0001065177 00000 n +0001065363 00000 n +0001066659 00000 n +0001066898 00000 n +0001067087 00000 n +0001067277 00000 n +0001067471 00000 n +0001068596 00000 n +0001068835 00000 n +0001069031 00000 n +0001069228 00000 n +0001069430 00000 n +0001070023 00000 n +0001070254 00000 n +0001070457 00000 n +0001070660 00000 n +0001073594 00000 n +0001073797 00000 n +0001075129 00000 n +0001075332 00000 n +0001077440 00000 n +0001077679 00000 n +0001077871 00000 n +0001078064 00000 n +0001078258 00000 n +0001081078 00000 n +0001081281 00000 n +0001082849 00000 n +0001083088 00000 n +0001083278 00000 n +0001083469 00000 n +0001083661 00000 n +0001085663 00000 n +0001085902 00000 n +0001086091 00000 n +0001086281 00000 n +0001086472 00000 n +0001089496 00000 n +0001089699 00000 n +0001092212 00000 n +0001092415 00000 n +0001096799 00000 n +0001097002 00000 n +0001101214 00000 n +0001101417 00000 n +0001106007 00000 n +0001106210 00000 n +0001108806 00000 n +0001109009 00000 n +0001110996 00000 n +0001111243 00000 n +0001111436 00000 n +0001111630 00000 n +0001111825 00000 n +0001112018 00000 n +0001116245 00000 n +0001116476 00000 n +0001116672 00000 n +0001116869 00000 n +0001120377 00000 n +0001120648 00000 n +0001120842 00000 n +0001121037 00000 n +0001121233 00000 n +0001121431 00000 n +0001121630 00000 n +0001121830 00000 n +0001122014 00000 n +0001124852 00000 n +0001125083 00000 n +0001125269 00000 n +0001125457 00000 n +0001127854 00000 n +0001128057 00000 n +0001130433 00000 n +0001130636 00000 n +0001133126 00000 n +0001133329 00000 n +0001134248 00000 n +0001134495 00000 n +0001134687 00000 n +0001134880 00000 n +0001135074 00000 n +0001135272 00000 n +0001136951 00000 n +0001137182 00000 n +0001137381 00000 n +0001137581 00000 n +0001139471 00000 n +0001139694 00000 n +0001139898 00000 n +0001140593 00000 n +0001140824 00000 n +0001141029 00000 n +0001141235 00000 n +0001142232 00000 n +0001142567 00000 n +0001142760 00000 n +0001142954 00000 n +0001143149 00000 n +0001143344 00000 n +0001143540 00000 n +0001143737 00000 n +0001143936 00000 n +0001144135 00000 n +0001144336 00000 n +0001144531 00000 n +0001144727 00000 n +0001144924 00000 n +0001145122 00000 n +0001145321 00000 n +0001145521 00000 n +0001148219 00000 n +0001148458 00000 n +0001148659 00000 n +0001148861 00000 n +0001149064 00000 n +0001150095 00000 n +0001150366 00000 n +0001150553 00000 n +0001150741 00000 n +0001150930 00000 n +0001151114 00000 n +0001151299 00000 n +0001151485 00000 n +0001151668 00000 n +0001152313 00000 n +0001152576 00000 n +0001152762 00000 n +0001152949 00000 n +0001153138 00000 n +0001153328 00000 n +0001153519 00000 n +0001153702 00000 n +0001155482 00000 n +0001155737 00000 n +0001155921 00000 n +0001156106 00000 n +0001156298 00000 n +0001156491 00000 n +0001156685 00000 n +0001158486 00000 n +0001158797 00000 n +0001158997 00000 n +0001159198 00000 n +0001159400 00000 n +0001159600 00000 n +0001159801 00000 n +0001160003 00000 n +0001160198 00000 n +0001160394 00000 n +0001160591 00000 n +0001160790 00000 n +0001160990 00000 n +0001161191 00000 n +0001163624 00000 n +0001163847 00000 n +0001164043 00000 n +0001165822 00000 n +0001166101 00000 n +0001166300 00000 n +0001166500 00000 n +0001166706 00000 n +0001166913 00000 n +0001167121 00000 n +0001167321 00000 n +0001167522 00000 n +0001167724 00000 n +0001169745 00000 n +0001170032 00000 n +0001170230 00000 n +0001170429 00000 n +0001170629 00000 n +0001170831 00000 n +0001171034 00000 n +0001171238 00000 n +0001171435 00000 n +0001171633 00000 n +0001171832 00000 n +0001173578 00000 n +0001173817 00000 n +0001173999 00000 n +0001174182 00000 n +0001174366 00000 n +0001176214 00000 n +0001176525 00000 n +0001176719 00000 n +0001176914 00000 n +0001177110 00000 n +0001177304 00000 n +0001177499 00000 n +0001177695 00000 n +0001177889 00000 n +0001178084 00000 n +0001178280 00000 n +0001178474 00000 n +0001178669 00000 n +0001178865 00000 n +0001180905 00000 n +0001181176 00000 n +0001181366 00000 n +0001181557 00000 n +0001181749 00000 n +0001181942 00000 n +0001182135 00000 n +0001182330 00000 n +0001182520 00000 n +0001183371 00000 n +0001183682 00000 n +0001183873 00000 n +0001184065 00000 n +0001184257 00000 n +0001184450 00000 n +0001184644 00000 n +0001184834 00000 n +0001185025 00000 n +0001185217 00000 n +0001185415 00000 n +0001185614 00000 n +0001185814 00000 n +0001186003 00000 n +0001187865 00000 n +0001188152 00000 n +0001188342 00000 n +0001188533 00000 n +0001188723 00000 n +0001188913 00000 n +0001189105 00000 n +0001189298 00000 n +0001189492 00000 n +0001189687 00000 n +0001189894 00000 n +0001191333 00000 n +0001191636 00000 n +0001191845 00000 n +0001192056 00000 n +0001192249 00000 n +0001192442 00000 n +0001192637 00000 n +0001192830 00000 n +0001193024 00000 n +0001193219 00000 n +0001193410 00000 n +0001193602 00000 n +0001193795 00000 n +0001195504 00000 n +0001195707 00000 n +0001197518 00000 n +0001197765 00000 n +0001197962 00000 n +0001198160 00000 n +0001198359 00000 n +0001198550 00000 n +0001199359 00000 n +0001199590 00000 n +0001199782 00000 n +0001199975 00000 n +0001200991 00000 n +0001201194 00000 n +0001203611 00000 n +0001203834 00000 n +0001204022 00000 n +0001204557 00000 n +0001204796 00000 n +0001204985 00000 n +0001205175 00000 n +0001205364 00000 n +0001205879 00000 n +0001206118 00000 n +0001206308 00000 n +0001206499 00000 n +0001206690 00000 n +0001207799 00000 n +0001208030 00000 n +0001208222 00000 n +0001208415 00000 n +0001211041 00000 n +0001211312 00000 n +0001211499 00000 n +0001211687 00000 n +0001211876 00000 n +0001212069 00000 n +0001212263 00000 n +0001212458 00000 n +0001212646 00000 n +0001214846 00000 n +0001215101 00000 n +0001215292 00000 n +0001215484 00000 n +0001215676 00000 n +0001215869 00000 n +0001216063 00000 n +0001218239 00000 n +0001218478 00000 n +0001218676 00000 n +0001218875 00000 n +0001219075 00000 n +0001221187 00000 n +0001221434 00000 n +0001221621 00000 n +0001221809 00000 n +0001221998 00000 n +0001222186 00000 n +0001224382 00000 n +0001224613 00000 n +0001224802 00000 n +0001224992 00000 n +0001228527 00000 n +0001228730 00000 n +0001232628 00000 n +0001232831 00000 n +0001235947 00000 n +0001236186 00000 n +0001236376 00000 n +0001236567 00000 n +0001236759 00000 n +0001239616 00000 n +0001239855 00000 n +0001240055 00000 n +0001240255 00000 n +0001240455 00000 n +0001243071 00000 n +0001243310 00000 n +0001243514 00000 n +0001243719 00000 n +0001243925 00000 n +0001247066 00000 n +0001247305 00000 n +0001247503 00000 n +0001247702 00000 n +0001247902 00000 n +0001250135 00000 n +0001250382 00000 n +0001250582 00000 n +0001250783 00000 n +0001250985 00000 n +0001251187 00000 n +0001253844 00000 n +0001254075 00000 n +0001254278 00000 n +0001254482 00000 n +0001259827 00000 n +0001260030 00000 n +0001263849 00000 n +0001264052 00000 n +0001267422 00000 n +0001267645 00000 n +0001267834 00000 n +0001270105 00000 n +0001270336 00000 n +0001270526 00000 n +0001270717 00000 n +0001276180 00000 n +0001276383 00000 n +0001279139 00000 n +0001279342 00000 n +0001289056 00000 n +0001289259 00000 n +0001293556 00000 n +0001293759 00000 n +0001297760 00000 n +0001297999 00000 n +0001298244 00000 n +0001298484 00000 n +0001298679 00000 n +0001302640 00000 n +0001302871 00000 n +0001303067 00000 n +0001303264 00000 n +0001305452 00000 n +0001305675 00000 n +0001305872 00000 n +0001307573 00000 n +0001307804 00000 n +0001308002 00000 n +0001308201 00000 n +0001309678 00000 n +0001309917 00000 n +0001310102 00000 n +0001310288 00000 n +0001310475 00000 n +0001314459 00000 n +0001314664 00000 n +0001318398 00000 n +0001318603 00000 n +0001320583 00000 n +0001320818 00000 n +0001321021 00000 n +0001321208 00000 n +0001321939 00000 n +0001322183 00000 n +0001322371 00000 n +0001322560 00000 n +0001322746 00000 n +0001324261 00000 n +0001324514 00000 n +0001324701 00000 n +0001324889 00000 n +0001325075 00000 n +0001325265 00000 n +0001326330 00000 n +0001326574 00000 n +0001326765 00000 n +0001326957 00000 n +0001327145 00000 n +0001329317 00000 n +0001329552 00000 n +0001329741 00000 n +0001329931 00000 n +0001331256 00000 n +0001331509 00000 n +0001331697 00000 n +0001331886 00000 n +0001332076 00000 n +0001332271 00000 n +0001333151 00000 n +0001333395 00000 n +0001333591 00000 n +0001333788 00000 n +0001333973 00000 n +0001335066 00000 n +0001335301 00000 n +0001335487 00000 n +0001335674 00000 n +0001338401 00000 n +0001338636 00000 n +0001338837 00000 n +0001339032 00000 n +0001340503 00000 n +0001340738 00000 n +0001340934 00000 n +0001341131 00000 n +0001342220 00000 n +0001342491 00000 n +0001342692 00000 n +0001342894 00000 n +0001343097 00000 n +0001343302 00000 n +0001343508 00000 n +0001343715 00000 n +0001345922 00000 n +0001346175 00000 n +0001346369 00000 n +0001346564 00000 n +0001346760 00000 n +0001346956 00000 n +0001347689 00000 n +0001347933 00000 n +0001348131 00000 n +0001348330 00000 n +0001348521 00000 n +0001349516 00000 n +0001349760 00000 n +0001349952 00000 n +0001350145 00000 n +0001350334 00000 n +0001351679 00000 n +0001351941 00000 n +0001352131 00000 n +0001352322 00000 n +0001352510 00000 n +0001352699 00000 n +0001352889 00000 n +0001354592 00000 n +0001354872 00000 n +0001355067 00000 n +0001355263 00000 n +0001355460 00000 n +0001355645 00000 n +0001355831 00000 n +0001356018 00000 n +0001356212 00000 n +0001357359 00000 n +0001357603 00000 n +0001357800 00000 n +0001357998 00000 n +0001358189 00000 n +0001359893 00000 n +0001360137 00000 n +0001360329 00000 n +0001360522 00000 n +0001360710 00000 n +0001361769 00000 n +0001362013 00000 n +0001362204 00000 n +0001362396 00000 n +0001362584 00000 n +0001363788 00000 n +0001364032 00000 n +0001364221 00000 n +0001364411 00000 n +0001364601 00000 n +0001366071 00000 n +0001366315 00000 n +0001366506 00000 n +0001366698 00000 n +0001366883 00000 n +0001368372 00000 n +0001368616 00000 n +0001368802 00000 n +0001368989 00000 n +0001369178 00000 n +0001370277 00000 n +0001370539 00000 n +0001370729 00000 n +0001370920 00000 n +0001371106 00000 n +0001371293 00000 n +0001371481 00000 n +0001372063 00000 n +0001372289 00000 n +0001372478 00000 n +0001372923 00000 n +0001373149 00000 n +0001373338 00000 n +0001375549 00000 n +0001375775 00000 n +0001375966 00000 n +0001380200 00000 n +0001380426 00000 n +0001380618 00000 n +0001384748 00000 n +0001384983 00000 n +0001385176 00000 n +0001385370 00000 n +0001386012 00000 n +0001386217 00000 n +0001386674 00000 n +0001386879 00000 n +0001387350 00000 n +0001387555 00000 n +0001388015 00000 n +0001388220 00000 n +0001390695 00000 n +0001390921 00000 n +0001391113 00000 n +0001393797 00000 n +0001394086 00000 n +0001394279 00000 n +0001394473 00000 n +0001394665 00000 n +0001394858 00000 n +0001395052 00000 n +0001395244 00000 n +0001395437 00000 n +0001395631 00000 n +0001398697 00000 n +0001398923 00000 n +0001399118 00000 n +0001399817 00000 n +0001400061 00000 n +0001400257 00000 n +0001400454 00000 n +0001400649 00000 n +0001401466 00000 n +0001401710 00000 n +0001401906 00000 n +0001402103 00000 n +0001402298 00000 n +0001403113 00000 n +0001403357 00000 n +0001403553 00000 n +0001403750 00000 n +0001403940 00000 n +0001404765 00000 n +0001405036 00000 n +0001405227 00000 n +0001405419 00000 n +0001405610 00000 n +0001405802 00000 n +0001405995 00000 n +0001406190 00000 n +0001407206 00000 n +0001407441 00000 n +0001407637 00000 n +0001407834 00000 n +0001410850 00000 n +0001411076 00000 n +0001411271 00000 n +0001412137 00000 n +0001412381 00000 n +0001412577 00000 n +0001412774 00000 n +0001412969 00000 n +0001413705 00000 n +0001413949 00000 n +0001414145 00000 n +0001414342 00000 n +0001414537 00000 n +0001415687 00000 n +0001415922 00000 n +0001416118 00000 n +0001416315 00000 n +0001417422 00000 n +0001417675 00000 n +0001417872 00000 n +0001418070 00000 n +0001418269 00000 n +0001418465 00000 n +0001419344 00000 n +0001419588 00000 n +0001419786 00000 n +0001419985 00000 n +0001420182 00000 n +0001421309 00000 n +0001421544 00000 n +0001421742 00000 n +0001421941 00000 n +0001423642 00000 n +0001423886 00000 n +0001424085 00000 n +0001424285 00000 n +0001424486 00000 n +0001425910 00000 n +0001426181 00000 n +0001426380 00000 n +0001426580 00000 n +0001426781 00000 n +0001426980 00000 n +0001427180 00000 n +0001427381 00000 n +0001429079 00000 n +0001429305 00000 n +0001429510 00000 n +0001430138 00000 n +0001430373 00000 n +0001430579 00000 n +0001430786 00000 n +0001434802 00000 n +0001435007 00000 n +0001438430 00000 n +0001438635 00000 n +0001441034 00000 n +0001441278 00000 n +0001441473 00000 n +0001441669 00000 n +0001441866 00000 n +0001443086 00000 n +0001443366 00000 n +0001443561 00000 n +0001443757 00000 n +0001443954 00000 n +0001444149 00000 n +0001444345 00000 n +0001444542 00000 n +0001444735 00000 n +0001445617 00000 n +0001445888 00000 n +0001446084 00000 n +0001446281 00000 n +0001446476 00000 n +0001446672 00000 n +0001446869 00000 n +0001447062 00000 n +0001449866 00000 n +0001450128 00000 n +0001450322 00000 n +0001450517 00000 n +0001450703 00000 n +0001450890 00000 n +0001451078 00000 n +0001455249 00000 n +0001455454 00000 n +0001456939 00000 n +0001457237 00000 n +0001457426 00000 n +0001457616 00000 n +0001457807 00000 n +0001457996 00000 n +0001458186 00000 n +0001458377 00000 n +0001458572 00000 n +0001458768 00000 n +0001458965 00000 n +0001460905 00000 n +0001461158 00000 n +0001461348 00000 n +0001461539 00000 n +0001461731 00000 n +0001461926 00000 n +0001463077 00000 n +0001463339 00000 n +0001463535 00000 n +0001463732 00000 n +0001463927 00000 n +0001464123 00000 n +0001464320 00000 n +0001466701 00000 n +0001466945 00000 n +0001467140 00000 n +0001467336 00000 n +0001467533 00000 n +0001470087 00000 n +0001470313 00000 n +0001470508 00000 n +0001471606 00000 n +0001471841 00000 n +0001472037 00000 n +0001472234 00000 n +0001474896 00000 n +0001475101 00000 n +0001477722 00000 n +0001477948 00000 n +0001478143 00000 n +0001479820 00000 n +0001480118 00000 n +0001480314 00000 n +0001480511 00000 n +0001480704 00000 n +0001480898 00000 n +0001481093 00000 n +0001481288 00000 n +0001481484 00000 n +0001481681 00000 n +0001481876 00000 n +0001482731 00000 n +0001482975 00000 n +0001483172 00000 n +0001483370 00000 n +0001483563 00000 n +0001484886 00000 n +0001485121 00000 n +0001485315 00000 n +0001485510 00000 n +0001487680 00000 n +0001487885 00000 n +0001490424 00000 n +0001490629 00000 n +0001493205 00000 n +0001493410 00000 n +0001495322 00000 n +0001495629 00000 n +0001495813 00000 n +0001495998 00000 n +0001496184 00000 n +0001496368 00000 n +0001496553 00000 n +0001496739 00000 n +0001496923 00000 n +0001497108 00000 n +0001497294 00000 n +0001497481 00000 n +0001498651 00000 n +0001498949 00000 n +0001499139 00000 n +0001499330 00000 n +0001499519 00000 n +0001499709 00000 n +0001499900 00000 n +0001500096 00000 n +0001500293 00000 n +0001500491 00000 n +0001500677 00000 n +0001501875 00000 n +0001502191 00000 n +0001502380 00000 n +0001502570 00000 n +0001502760 00000 n +0001502951 00000 n +0001503143 00000 n +0001503329 00000 n +0001503516 00000 n +0001503704 00000 n +0001503893 00000 n +0001504083 00000 n +0001504274 00000 n +0001506231 00000 n +0001506475 00000 n +0001506669 00000 n +0001506864 00000 n +0001507060 00000 n +0001509320 00000 n +0001509525 00000 n +0001511873 00000 n +0001512153 00000 n +0001512340 00000 n +0001512527 00000 n +0001512716 00000 n +0001512902 00000 n +0001513088 00000 n +0001513276 00000 n +0001513467 00000 n +0001516537 00000 n +0001516772 00000 n +0001516965 00000 n +0001517159 00000 n +0001519050 00000 n +0001519303 00000 n +0001519493 00000 n +0001519684 00000 n +0001519876 00000 n +0001520065 00000 n +0001521488 00000 n +0001521723 00000 n +0001521913 00000 n +0001522104 00000 n +0001523995 00000 n +0001524200 00000 n +0001526215 00000 n +0001526513 00000 n +0001526710 00000 n +0001526907 00000 n +0001527106 00000 n +0001527306 00000 n +0001527506 00000 n +0001527708 00000 n +0001527899 00000 n +0001528091 00000 n +0001528284 00000 n +0001529771 00000 n +0001530042 00000 n +0001530232 00000 n +0001530423 00000 n +0001530615 00000 n +0001530805 00000 n +0001530996 00000 n +0001531188 00000 n +0001534451 00000 n +0001534656 00000 n +0001538577 00000 n +0001538782 00000 n +0001542069 00000 n +0001542274 00000 n +0001544456 00000 n +0001544661 00000 n +0001546683 00000 n +0001546909 00000 n +0001547094 00000 n +0001547536 00000 n +0001547762 00000 n +0001547947 00000 n +0001548634 00000 n +0001548869 00000 n +0001549056 00000 n +0001549241 00000 n +0001549683 00000 n +0001549909 00000 n +0001550094 00000 n +0001553278 00000 n +0001553504 00000 n +0001553691 00000 n +0001556608 00000 n +0001556813 00000 n +0001560305 00000 n +0001560510 00000 n +0001564589 00000 n +0001564794 00000 n +0001569001 00000 n +0001569206 00000 n +0001572472 00000 n +0001572677 00000 n +0001574502 00000 n +0001574755 00000 n +0001574943 00000 n +0001575132 00000 n +0001575322 00000 n +0001575512 00000 n +0001576912 00000 n +0001577228 00000 n +0001577420 00000 n +0001577613 00000 n +0001577804 00000 n +0001577996 00000 n +0001578189 00000 n +0001578386 00000 n +0001578584 00000 n +0001578783 00000 n +0001578980 00000 n +0001579178 00000 n +0001579377 00000 n +0001582301 00000 n +0001582506 00000 n +0001584193 00000 n +0001584437 00000 n +0001584632 00000 n +0001584828 00000 n +0001585025 00000 n +0001586992 00000 n +0001587218 00000 n +0001587408 00000 n +0001587941 00000 n +0001588185 00000 n +0001588376 00000 n +0001588568 00000 n +0001588757 00000 n +0001589840 00000 n +0001590075 00000 n +0001590265 00000 n +0001590456 00000 n +0001593459 00000 n +0001593664 00000 n +0001596507 00000 n +0001596712 00000 n +0001600587 00000 n +0001600792 00000 n +0001603875 00000 n +0001604080 00000 n +0001606723 00000 n +0001606949 00000 n +0001607143 00000 n +0001607722 00000 n +0001607984 00000 n +0001608179 00000 n +0001608375 00000 n +0001608570 00000 n +0001608766 00000 n +0001608963 00000 n +0001610233 00000 n +0001610486 00000 n +0001610681 00000 n +0001610877 00000 n +0001611074 00000 n +0001611268 00000 n +0001613122 00000 n +0001613357 00000 n +0001613552 00000 n +0001613748 00000 n +0001616753 00000 n +0001616979 00000 n +0001617169 00000 n +0001618566 00000 n +0001618810 00000 n +0001619001 00000 n +0001619193 00000 n +0001619378 00000 n +0001619834 00000 n +0001620060 00000 n +0001620245 00000 n +0001621024 00000 n +0001621259 00000 n +0001621446 00000 n +0001621631 00000 n +0001622088 00000 n +0001622314 00000 n +0001622499 00000 n +0001623127 00000 n +0001623362 00000 n +0001623549 00000 n +0001623734 00000 n +0001624192 00000 n +0001624418 00000 n +0001624603 00000 n +0001625349 00000 n +0001625584 00000 n +0001625771 00000 n +0001625956 00000 n +0001626415 00000 n +0001626641 00000 n +0001626826 00000 n +0001627562 00000 n +0001627797 00000 n +0001627984 00000 n +0001628169 00000 n +0001628626 00000 n +0001628852 00000 n +0001629037 00000 n +0001630785 00000 n +0001631038 00000 n +0001631225 00000 n +0001631415 00000 n +0001631606 00000 n +0001631798 00000 n +0001633998 00000 n +0001634203 00000 n +0001635689 00000 n +0001635915 00000 n +0001636100 00000 n +0001636547 00000 n +0001636773 00000 n +0001636958 00000 n +0001637527 00000 n +0001637762 00000 n +0001637949 00000 n +0001638134 00000 n +0001638581 00000 n +0001638807 00000 n +0001638992 00000 n +0001641230 00000 n +0001641483 00000 n +0001641670 00000 n +0001641855 00000 n +0001642041 00000 n +0001642228 00000 n +0001646268 00000 n +0001646473 00000 n +0001650364 00000 n +0001650569 00000 n +0001654860 00000 n +0001655065 00000 n +0001659247 00000 n +0001659452 00000 n +0001662536 00000 n +0001662780 00000 n +0001662972 00000 n +0001663165 00000 n +0001663359 00000 n +0001666215 00000 n +0001666420 00000 n +0001668779 00000 n +0001668984 00000 n +0001672945 00000 n +0001673150 00000 n +0001676287 00000 n +0001676492 00000 n +0001679744 00000 n +0001679949 00000 n +0001683046 00000 n +0001683251 00000 n +0001685707 00000 n +0001685951 00000 n +0001686142 00000 n +0001686334 00000 n +0001686527 00000 n +0001689430 00000 n +0001689635 00000 n +0001691901 00000 n +0001692145 00000 n +0001692339 00000 n +0001692534 00000 n +0001692730 00000 n +0001696067 00000 n +0001696272 00000 n +0001698383 00000 n +0001698609 00000 n +0001698795 00000 n +0001699439 00000 n +0001699683 00000 n +0001699870 00000 n +0001700058 00000 n +0001700245 00000 n +0001702624 00000 n +0001702886 00000 n +0001703074 00000 n +0001703263 00000 n +0001703456 00000 n +0001703650 00000 n +0001703845 00000 n +0001706562 00000 n +0001706788 00000 n +0001706982 00000 n +0001708128 00000 n +0001708372 00000 n +0001708567 00000 n +0001708763 00000 n +0001708960 00000 n +0001709692 00000 n +0001709936 00000 n +0001710134 00000 n +0001710333 00000 n +0001710532 00000 n +0001711115 00000 n +0001711359 00000 n +0001711559 00000 n +0001711760 00000 n +0001711969 00000 n +0001712644 00000 n +0001712888 00000 n +0001713098 00000 n +0001713309 00000 n +0001713510 00000 n +0001715303 00000 n +0001715538 00000 n +0001715740 00000 n +0001715943 00000 n +0001717716 00000 n +0001717960 00000 n +0001718153 00000 n +0001718347 00000 n +0001718542 00000 n +0001721678 00000 n +0001721883 00000 n +0001723741 00000 n +0001723967 00000 n +0001724155 00000 n +0001724710 00000 n +0001724954 00000 n +0001725143 00000 n +0001725333 00000 n +0001725521 00000 n +0001726916 00000 n +0001727151 00000 n +0001727340 00000 n +0001727530 00000 n +0001730164 00000 n +0001730369 00000 n +0001731454 00000 n +0001731698 00000 n +0001731888 00000 n +0001732079 00000 n +0001732271 00000 n +0001732973 00000 n +0001733271 00000 n +0001733461 00000 n +0001733652 00000 n +0001733844 00000 n +0001734035 00000 n +0001734227 00000 n +0001734420 00000 n +0001734615 00000 n +0001734811 00000 n +0001735007 00000 n +0001735808 00000 n +0001736079 00000 n +0001736272 00000 n +0001736466 00000 n +0001736661 00000 n +0001736852 00000 n +0001737044 00000 n +0001737237 00000 n +0001738773 00000 n +0001738999 00000 n +0001739202 00000 n +0001739765 00000 n +0001740000 00000 n +0001740204 00000 n +0001740408 00000 n +0001741186 00000 n +0001741439 00000 n +0001741636 00000 n +0001741834 00000 n +0001742033 00000 n +0001742222 00000 n +0001742763 00000 n +0001743007 00000 n +0001743197 00000 n +0001743388 00000 n +0001743584 00000 n +0001744679 00000 n +0001744914 00000 n +0001745111 00000 n +0001745309 00000 n +0001746645 00000 n +0001746898 00000 n +0001747087 00000 n +0001747277 00000 n +0001747468 00000 n +0001747662 00000 n +0001749324 00000 n +0001749559 00000 n +0001749754 00000 n +0001749950 00000 n +0001754661 00000 n +0001754866 00000 n +0001756090 00000 n +0001756295 00000 n +0001759424 00000 n +0001759629 00000 n +0001763252 00000 n +0001763457 00000 n +0001766740 00000 n +0001766945 00000 n +0001770858 00000 n +0001771063 00000 n +0001775158 00000 n +0001775363 00000 n +0001778965 00000 n +0001779170 00000 n +0001782554 00000 n +0001782759 00000 n +0001786444 00000 n +0001786649 00000 n +0001787921 00000 n +0001788126 00000 n +0001790835 00000 n +0001791040 00000 n +0001794491 00000 n +0001794696 00000 n +0001796501 00000 n +0001796706 00000 n +0001799480 00000 n +0001799685 00000 n +0001803186 00000 n +0001803391 00000 n +0001807797 00000 n +0001808002 00000 n +0001811570 00000 n +0001811775 00000 n +0001814951 00000 n +0001815156 00000 n +0001818559 00000 n +0001818764 00000 n +0001821517 00000 n +0001821722 00000 n +0001824940 00000 n +0001825145 00000 n +0001828573 00000 n +0001828778 00000 n +0001832483 00000 n +0001832688 00000 n +0001836478 00000 n +0001836683 00000 n +0001839986 00000 n +0001840191 00000 n +0001843809 00000 n +0001844014 00000 n +0001847535 00000 n +0001847740 00000 n +0001852032 00000 n +0001852237 00000 n +0001856588 00000 n +0001856793 00000 n +0001862461 00000 n +0001862666 00000 n +0001864382 00000 n +0001864587 00000 n +0001866412 00000 n +0001866617 00000 n +0001870961 00000 n +0001871166 00000 n +0001876575 00000 n +0001876780 00000 n +0001882917 00000 n +0001883122 00000 n +0001888999 00000 n +0001889204 00000 n +0001894803 00000 n +0001895008 00000 n +0001900600 00000 n +0001900805 00000 n +0001906304 00000 n +0001906509 00000 n +0001912057 00000 n +0001912262 00000 n +0001917866 00000 n +0001918071 00000 n +0001923746 00000 n +0001923951 00000 n +0001928792 00000 n +0001928997 00000 n +0001930485 00000 n +0001930690 00000 n +0001933793 00000 n +0001933998 00000 n +0001936704 00000 n +0001936909 00000 n +0001939956 00000 n +0001940161 00000 n +0001944144 00000 n +0001944349 00000 n +0001947675 00000 n +0001947880 00000 n +0001950748 00000 n +0001950953 00000 n +0001954328 00000 n +0001954533 00000 n +0001958204 00000 n +0001958409 00000 n +0001962427 00000 n +0001962632 00000 n +0001966505 00000 n +0001966710 00000 n +0001967301 00000 n +0001967506 00000 n +0001970939 00000 n +0001971144 00000 n +0001974794 00000 n +0001974999 00000 n +0001979315 00000 n +0001979520 00000 n +0001983597 00000 n +0001983802 00000 n +0001988189 00000 n +0001988394 00000 n +0001993408 00000 n +0001993613 00000 n +0001998151 00000 n +0001998356 00000 n +0002002489 00000 n +0002002694 00000 n +0002005709 00000 n +0002005914 00000 n +0002009363 00000 n +0002009568 00000 n +0002013791 00000 n +0002013996 00000 n +0002015895 00000 n +0002016100 00000 n +0002018795 00000 n +0002019000 00000 n +0002022064 00000 n +0002022269 00000 n +0002026368 00000 n +0002026573 00000 n +0002030920 00000 n +0002031125 00000 n +0002035534 00000 n +0002035739 00000 n +0002037254 00000 n +0002037459 00000 n +0002040489 00000 n +0002040694 00000 n +0002043442 00000 n +0002043647 00000 n +0002047597 00000 n +0002047802 00000 n +0002052428 00000 n +0002052633 00000 n +0002056575 00000 n +0002056780 00000 n +0002061374 00000 n +0002061579 00000 n +0002066410 00000 n +0002066615 00000 n +0002070719 00000 n +0002070924 00000 n +0002074840 00000 n +0002075045 00000 n +0002079065 00000 n +0002079270 00000 n +0002083621 00000 n +0002083826 00000 n +0002088310 00000 n +0002088515 00000 n +0002093064 00000 n +0002093269 00000 n +0002096791 00000 n +0002096996 00000 n +0002100056 00000 n +0002100261 00000 n +0002104005 00000 n +0002104210 00000 n +0002108286 00000 n +0002108491 00000 n +0002112024 00000 n +0002112229 00000 n +0002115569 00000 n +0002115774 00000 n +0002119343 00000 n +0002119548 00000 n +0002124146 00000 n +0002124351 00000 n +0002128799 00000 n +0002129004 00000 n +0002131681 00000 n +0002131886 00000 n +0002135726 00000 n +0002135931 00000 n +0002139565 00000 n +0002139770 00000 n +0002143359 00000 n +0002143564 00000 n +0002146584 00000 n +0002146789 00000 n +0002150449 00000 n +0002150654 00000 n +0002154602 00000 n +0002154807 00000 n +0002158699 00000 n +0002158904 00000 n +0002162291 00000 n +0002162496 00000 n +0002166219 00000 n +0002166424 00000 n +0002170616 00000 n +0002170821 00000 n +0002172088 00000 n +0002172293 00000 n +0002176341 00000 n +0002176546 00000 n +0002179853 00000 n +0002180058 00000 n +0002183519 00000 n +0002183724 00000 n +0002187381 00000 n +0002187586 00000 n +0002191031 00000 n +0002191236 00000 n +0002194616 00000 n +0002194821 00000 n +0002197762 00000 n +0002197967 00000 n +0002201501 00000 n +0002201706 00000 n +0002205240 00000 n +0002205445 00000 n +0002208597 00000 n +0002208802 00000 n +0002211639 00000 n +0002211844 00000 n +0002215293 00000 n +0002215498 00000 n +0002218906 00000 n +0002219111 00000 n +0002222817 00000 n +0002223022 00000 n +0002227105 00000 n +0002227310 00000 n +0002231457 00000 n +0002231662 00000 n +0002235201 00000 n +0002235406 00000 n +0002235551 00000 n +0002235747 00000 n +0002235915 00000 n +0002236088 00000 n +0002236238 00000 n +0002236386 00000 n +0002236575 00000 n +0002236708 00000 n +0002236916 00000 n +0002237075 00000 n +0002237312 00000 n +0002237616 00000 n +0002237888 00000 n +0002238078 00000 n +0002238232 00000 n +0002238514 00000 n +0002238683 00000 n +0002238912 00000 n +0002239093 00000 n +0002239270 00000 n +0002239451 00000 n +0002239616 00000 n +0002239766 00000 n +0002239935 00000 n +0002240240 00000 n +0002240403 00000 n +0002240707 00000 n +0002240879 00000 n +0002241038 00000 n +0002241192 00000 n +0002241332 00000 n +0002241475 00000 n +0002241759 00000 n +0002241920 00000 n +0002242109 00000 n +0002242349 00000 n +0002242488 00000 n +0002242642 00000 n +0002242802 00000 n +0002242928 00000 n +0002243211 00000 n +0002243340 00000 n +0002243482 00000 n +0002243625 00000 n +0002243768 00000 n +0002243898 00000 n +0002244181 00000 n +0002244356 00000 n +0002244565 00000 n +0002244703 00000 n +0002244847 00000 n +0002245100 00000 n +0002245388 00000 n +0002245524 00000 n +0002245683 00000 n +0002245915 00000 n +0002246147 00000 n +0002246310 00000 n +0002246448 00000 n +0002246599 00000 n +0002246748 00000 n +0002246899 00000 n +0002247028 00000 n +0002247204 00000 n +0002247433 00000 n +0002247591 00000 n +0002247717 00000 n +0002247861 00000 n +0002248015 00000 n +0002248156 00000 n +0002248295 00000 n +0002248465 00000 n +0002248678 00000 n +0002248930 00000 n +0002249205 00000 n +0002249386 00000 n +0002249561 00000 n +0002249713 00000 n +0002250006 00000 n +0002250270 00000 n +0002250407 00000 n +0002250646 00000 n +0002250784 00000 n +0002251021 00000 n +0002251222 00000 n +0002251398 00000 n +0002251635 00000 n +0002251807 00000 n +0002251940 00000 n +0002252259 00000 n +0002252402 00000 n +0002252547 00000 n +0002252682 00000 n +0002252848 00000 n +0002253006 00000 n +0002253170 00000 n +0002253414 00000 n +0002253565 00000 n +0002253719 00000 n +0002253854 00000 n +0002254042 00000 n +0002254175 00000 n +0002254321 00000 n +0002254521 00000 n +0002254679 00000 n +0002254909 00000 n +0002255099 00000 n +0002255237 00000 n +0002255397 00000 n +0002255589 00000 n +0002255859 00000 n +0002255994 00000 n +0002256177 00000 n +0002256535 00000 n +0002256827 00000 n +0002257085 00000 n +0002257246 00000 n +0002257397 00000 n +0002257548 00000 n +0002257824 00000 n +0002257961 00000 n +0002258118 00000 n +0002258268 00000 n +0002258423 00000 n +0002258563 00000 n +0002258696 00000 n +0002258883 00000 n +0002259030 00000 n +0002259189 00000 n +0002259349 00000 n +0002259503 00000 n +0002259657 00000 n +0002259814 00000 n +0002259968 00000 n +0002260130 00000 n +0002260279 00000 n +0002260440 00000 n +0002260601 00000 n +0002260756 00000 n +0002260917 00000 n +0002261081 00000 n +0002261239 00000 n +0002261397 00000 n +0002261567 00000 n +0002261728 00000 n +0002261886 00000 n +0002262044 00000 n +0002262206 00000 n +0002262365 00000 n +0002262527 00000 n +0002262686 00000 n +0002262845 00000 n +0002263007 00000 n +0002263166 00000 n +0002263325 00000 n +0002263484 00000 n +0002263646 00000 n +0002263805 00000 n +0002263967 00000 n +0002264129 00000 n +0002264288 00000 n +0002264447 00000 n +0002264609 00000 n +0002264768 00000 n +0002264930 00000 n +0002265089 00000 n +0002265248 00000 n +0002265390 00000 n +0002265551 00000 n +0002265697 00000 n +0002265851 00000 n +0002266018 00000 n +0002266178 00000 n +0002266340 00000 n +0002266496 00000 n +0002266645 00000 n +0002266796 00000 n +0002266957 00000 n +0002267115 00000 n +0002267264 00000 n +0002267420 00000 n +0002267580 00000 n +0002267744 00000 n +0002267909 00000 n +0002268071 00000 n +0002268224 00000 n +0002268375 00000 n +0002268528 00000 n +0002268679 00000 n +0002268826 00000 n +0002268892 00000 n +0002273716 00000 n +0002282318 00000 n +0002286993 00000 n +0002291053 00000 n +0002297148 00000 n +0002299421 00000 n +0002300794 00000 n +0002301027 00000 n +0002301616 00000 n +0002301770 00000 n +0002303716 00000 n +0002303964 00000 n +0002304841 00000 n +0002305004 00000 n +0002306265 00000 n +0002306498 00000 n +0002307059 00000 n +0002307214 00000 n +0002308307 00000 n +0002308535 00000 n +0002309051 00000 n +0002309200 00000 n +0002310881 00000 n +0002311127 00000 n +0002311749 00000 n +0002311908 00000 n +0002312552 00000 n +0002312797 00000 n +0002313180 00000 n +0002313340 00000 n +0002313466 00000 n +0006018193 00000 n +0006088546 00000 n +0006870857 00000 n +0006875311 00000 n +0007603231 00000 n +0007607677 00000 n +0007895923 00000 n +0007900377 00000 n +0007996231 00000 n +0007999125 00000 n +0008008430 00000 n +0008016075 00000 n +0008034412 00000 n +0008039499 00000 n +0008066053 00000 n +0008077307 00000 n +0008078859 00000 n +0008080606 00000 n +0008090421 00000 n +0008097407 00000 n +0008186057 00000 n +0008193243 00000 n +0008203150 00000 n +0008208637 00000 n +0008223883 00000 n +0008226271 00000 n +0008254336 00000 n +0008263029 00000 n +0008577518 00000 n +0008608606 00000 n +0008972878 00000 n +0008990074 00000 n +0009670969 00000 n +0009689185 00000 n +0010037092 00000 n +0010054290 00000 n +0010227013 00000 n +0010242555 00000 n +0010368408 00000 n +0010400843 00000 n +0010486309 00000 n +0010490489 00000 n +0010492166 00000 n +0010502590 00000 n +0010504500 00000 n +0011127036 00000 n +0011129740 00000 n +0011158967 00000 n +0011159328 00000 n +0011171789 00000 n +0011172133 00000 n +0011174896 00000 n +0011175170 00000 n +0011177201 00000 n +0011177473 00000 n +0011669642 00000 n +0011672104 00000 n +0011845368 00000 n +0011891898 00000 n +0011892745 00000 n +0011893003 00000 n +0011896172 00000 n +0011896468 00000 n +0011904793 00000 n +0011905137 00000 n +0011907209 00000 n +0011908092 00000 n +0011909758 00000 n +0011910512 00000 n +0011911073 00000 n +0011911759 00000 n +0011912320 00000 n +0011913009 00000 n +0011913570 00000 n +0011914324 00000 n +0011916776 00000 n +0011917076 00000 n +0011919527 00000 n +0011919827 00000 n +0011920364 00000 n +0011920664 00000 n +0011923748 00000 n +0011924224 00000 n +0011925176 00000 n +0011925594 00000 n +0011928359 00000 n +0011928635 00000 n +0011939142 00000 n +0011942291 00000 n +0011942791 00000 n +0011943067 00000 n +0011946861 00000 n +0011947268 00000 n +0011948076 00000 n +0011948419 00000 n +0011949344 00000 n +0011949687 00000 n +0012461896 00000 n +0012488802 00000 n +0012497149 00000 n +0012497493 00000 n +0012511708 00000 n +0012512073 00000 n +0012520611 00000 n +0012520960 00000 n +0012529174 00000 n +0012529534 00000 n +0012531116 00000 n +0012531371 00000 n +0012531912 00000 n +0012532286 00000 n +0012532831 00000 n +0012533205 00000 n +0012533751 00000 n +0012534125 00000 n +0012534670 00000 n +0012535044 00000 n +0012535591 00000 n +0012535965 00000 n +0012537484 00000 n +0012537739 00000 n +0012538285 00000 n +0012538659 00000 n +0012539958 00000 n +0012540213 00000 n +0012540770 00000 n +0012541025 00000 n +0012544916 00000 n +0012545334 00000 n +0012545984 00000 n +0012546282 00000 n +0013324580 00000 n +0013326949 00000 n +0013412737 00000 n +0013414136 00000 n +0013464200 00000 n +0013471209 00000 n +0013474019 00000 n +0013481512 00000 n +0013483503 00000 n +0013496346 00000 n +0013498390 00000 n +0013504835 00000 n +0013505159 00000 n +0013508233 00000 n +0013508557 00000 n +0013509493 00000 n +0013509817 00000 n +0013512726 00000 n +0013513068 00000 n +0013543831 00000 n +0013564475 00000 n +0013577725 00000 n +0013578038 00000 n +0013585125 00000 n +0013585824 00000 n +0013616350 00000 n +0013617457 00000 n +0013645401 00000 n +0013646371 00000 n +0013664814 00000 n +0013665393 00000 n +0013703234 00000 n +0013704419 00000 n +0013831764 00000 n +0013833723 00000 n +0014108149 00000 n +0014111767 00000 n +0014201361 00000 n +0014205173 00000 n +0014243440 00000 n +0014244341 00000 n +0014989082 00000 n +0014993202 00000 n +0015424154 00000 n +0015428282 00000 n +0015465210 00000 n +0015468300 00000 n +0015684449 00000 n +0015688272 00000 n +0015768318 00000 n +0015769809 00000 n +0015802725 00000 n +0015805723 00000 n +0015968072 00000 n +0015969745 00000 n +0016390483 00000 n +0016394404 00000 n +0016407318 00000 n +0016407826 00000 n +0016753500 00000 n +0016756223 00000 n +0017102904 00000 n +0017105627 00000 n +0017532565 00000 n +0017535359 00000 n +0017584937 00000 n +0017585596 00000 n +0017600362 00000 n +0017600844 00000 n +0017650567 00000 n +0017651241 00000 n +0017657850 00000 n +0017658773 00000 n +0018218391 00000 n +0018222291 00000 n +0018789841 00000 n +0018793759 00000 n +0019041283 00000 n +0019045102 00000 n +0019085773 00000 n +0019086937 00000 n +0019114632 00000 n +0019115586 00000 n +0019143618 00000 n +0019144722 00000 n +0019162210 00000 n +0019162934 00000 n +0019227178 00000 n +0019229391 00000 n +0019347504 00000 n +0019351384 00000 n +0020546091 00000 n +0022312764 00000 n +0022324200 00000 n +0022324607 00000 n +0022330877 00000 n +0022331269 00000 n +0022336222 00000 n +0022336593 00000 n +0022486828 00000 n +0022488431 00000 n +0022603089 00000 n +0022605042 00000 n +0022726392 00000 n +0022728524 00000 n +0022732577 00000 n +0022733378 00000 n +0022739361 00000 n +0022740122 00000 n +0022859439 00000 n +0022861574 00000 n +0022970237 00000 n +0022972385 00000 n +0023076728 00000 n +0023078686 00000 n +0023183456 00000 n +0023185604 00000 n +0023305554 00000 n +0023307705 00000 n +0023416834 00000 n +0023419055 00000 n +0023529444 00000 n +0023531415 00000 n +0023612836 00000 n +0023613535 00000 n +0023631458 00000 n +0023632070 00000 n +0024171791 00000 n +0024174900 00000 n +0024690440 00000 n +0024693376 00000 n +0025226600 00000 n +0025229468 00000 n +0025769229 00000 n +0025772176 00000 n +0026311717 00000 n +0026314683 00000 n +0026334319 00000 n +0026335256 00000 n +0026363057 00000 n +0026363456 00000 n +0026365003 00000 n +0026365286 00000 n +0026366683 00000 n +0026366966 00000 n +0026624312 00000 n +0026626696 00000 n +0026648061 00000 n +0026648982 00000 n +0027156024 00000 n +0027158971 00000 n +0027698497 00000 n +0027701216 00000 n +0028245663 00000 n +0028248670 00000 n +0028279353 00000 n +0028281265 00000 n +0028306516 00000 n +0028307400 00000 n +0028322212 00000 n +0028322573 00000 n +0028339044 00000 n +0028339383 00000 n +0028357968 00000 n +0028359099 00000 n +0028680462 00000 n +0028683093 00000 n +0028683575 00000 n +0028683849 00000 n +0028684345 00000 n +0028684619 00000 n +0028685149 00000 n +0028685423 00000 n +0028686771 00000 n +0028687343 00000 n +0028688721 00000 n +0028689309 00000 n +0028692133 00000 n +0028692409 00000 n +0028694879 00000 n +0028695155 00000 n +0028695708 00000 n +0028695984 00000 n +0028705452 00000 n +0028706197 00000 n +0028707806 00000 n +0028708395 00000 n +0028709343 00000 n +0028709686 00000 n +0028711699 00000 n +0028711971 00000 n +0028721786 00000 n +0028724730 00000 n +0028765735 00000 n +0028766778 00000 n +0028768470 00000 n +0028769681 00000 n +0028778125 00000 n +0028779261 00000 n +0028779514 00000 n +0028780598 00000 n +0028780851 00000 n +0028781988 00000 n +0028782451 00000 n +0028784002 00000 n +0028784465 00000 n +0028786207 00000 n +0028786670 00000 n +0032351974 00000 n +0032400747 00000 n +0036162474 00000 n +0036211247 00000 n +0036694953 00000 n +0036699395 00000 n +0036700140 00000 n +0036700438 00000 n +0036701150 00000 n +0036701448 00000 n +0036702131 00000 n +0036702429 00000 n +0036703087 00000 n +0036703385 00000 n +0036772097 00000 n +0036776041 00000 n +0037071776 00000 n +0037076211 00000 n +0037362442 00000 n +0037366877 00000 n +0038479717 00000 n +0038484307 00000 n +0040049497 00000 n +0040052358 00000 n +0040595134 00000 n +0040598966 00000 n +0043919904 00000 n +0043968677 00000 n +0047073293 00000 n +0047122066 00000 n +0050187400 00000 n +0050236173 00000 n +0054976443 00000 n +0055025216 00000 n +0055307051 00000 n +0055309675 00000 n +0060128752 00000 n +0060177525 00000 n +0064690298 00000 n +0064760651 00000 n +0064771392 00000 n +0064772501 00000 n +0064826867 00000 n +0064827551 00000 n +0064831970 00000 n +0064832309 00000 n +0064938825 00000 n +0064939331 00000 n +0064993081 00000 n +0064993694 00000 n +0065075339 00000 n +0065079360 00000 n +0065102712 00000 n +0065105584 00000 n +0065139153 00000 n +0065142040 00000 n +0065168067 00000 n +0065172335 00000 n +0065502227 00000 n +0065505121 00000 n +0065571608 00000 n +0065573664 00000 n +0065663971 00000 n +0065666859 00000 n +0065799781 00000 n +0065801776 00000 n +0065900676 00000 n +0065902265 00000 n +0065940441 00000 n +0065941479 00000 n +0066026281 00000 n +0066028052 00000 n +0066068692 00000 n +0066070348 00000 n +0066189666 00000 n +0066192907 00000 n +0066596148 00000 n trailer << -/Size 2558 +/Size 2649 /Root 3 0 R /Info 2 0 R >> startxref -66437908 +66599519 %%EOF diff --git a/site/search/search_index.json b/site/search/search_index.json index fb830a4..31fffc0 100644 --- a/site/search/search_index.json +++ b/site/search/search_index.json @@ -1 +1 @@ -{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"index.html","text":"Rapport Track Trends V1.0 Rohmer Maxime Travail de dipl\u00f4me Technicien ES 2023 Introduction R\u00e9sum\u00e9 Track Trends est un outil de r\u00e9cup\u00e9ration et d'analyse de donn\u00e9es de courses de Formule 1. Pour le contexte, en dehors des cours, j'exerce diff\u00e9rentes activit\u00e9s dont celle de Live Ticker F1 pour le 20 minutes. Pour m'aider dans ce travail, j'utilise actuellement la F1TV \u00e0 laquelle je suis abonn\u00e9 qui me propose non seulement un feed vid\u00e9o de meilleure qualit\u00e9 avec des commentaires plus pertinents que ceux de la RTS mais qui aussi me permet d'acc\u00e9der \u00e0 un feed vid\u00e9o tr\u00e8s important : la chaine data. Ce dernier ressemble \u00e0 cela : \"Screenshot du feed data de la f1tv\" (Attention ce n'est pas un joli tableau HTML, mais bien une vid\u00e9o qui contient un tableau.) Sauf que toutes les informations sont \u00e9tal\u00e9es p\u00eale-m\u00eale sans hi\u00e9rarchie ce qui fait que cela me prendrait trop de temps de tout d\u00e9chiffrer \u00e0 chaque fois, ce qui me fait rater des choses int\u00e9ressantes. Le but du projet est donc de fournir un outil qui hi\u00e9rarchise et affiche diff\u00e9remment les donn\u00e9es pour faciliter leur lecture et me permettre de faire de meilleurs commentaires. Abstract Track Trends is a Formula 1 data is a tool that displays and interpret data. To understand everything,first ,a little bit of context. In my free time I have multiple activities and one is to be the Live Ticker F1 for the local journal \"20 minutes\" (Owned by Tamedia). to help me in this work I'm currently using the F1TV to which I'm currently subscribed because it provides me with a better video feed with better commentary than the ones from the RTS (in my opinion) but also because it gives me access to a very important video feed : the data channel You can see in the chapter above an example of the F1TV DATA CHANNEL. [Note : Even tough it looks like a pretty HTML table on wich you could easely get infos... Its not. Its a video feed] You can see a lot of data all well and good BUT! All the data is displayed the same in a big table which make it really hard to read totally in a hurry, which means that I miss a lot of useful information. The point of the project then is to provide a tool that can display those data by taking into account their relevance. So for example a driver that is 10s away from everyone and that is doing some normal lapTimes will be less displayed or even not displayed at all so I can focus on the drivers that are battling each others. This tool would help me not miss the battles and details that are happening in the back and therefore not being broadcasted on TV.And it could be a usefull tool for anyone who wants a better insight of how the race is going by looking at the data. This kind of project already exists in the form of the AWS tool \"F1 Insight\" but it is not avaible to the public. We can only see some of its predictions (that are trash) and data dumps in the live feed when the TV directors feel like it. Description du besoin Comme expliqu\u00e9 dans le r\u00e9sum\u00e9, je suis Live Ticker F1. Mais pour mieux comprendre le besoin que j'ai, je pense qu'il est pertinent de comprendre comment je travaille. Pendant un Grand Prix de Formule 1 j'ai plusieurs t\u00e2ches \u00e0 effectuer : Suivre les diff\u00e9rents \u00e9v\u00e8nements du Grand Prix Changer le titre et la photo de titre du Live Chercher des Tweets ou des Images \u00e0 int\u00e9grer Ecrire les commentaires en faisant attention \u00e0 dire ce qu'il se passe mais aussi l\u2019expliquer, ce que cela implique, mais aussi ce que cela veut dire pour le reste de la course. Comprendre et expliquer les strat\u00e9gies Tout cela toutes les cinq minutes max... Cela veut dire que je dois \u00eatre le plus rapide possible quand je cherche des informations. Et comme le tableau en comporte trop et bien, je suis oblig\u00e9 de le lire en diagonale. Par exemple dans le tableau, les infos que je cherche le plus sont : Le nombre de places gagn\u00e9es (surtout au d\u00e9part) Les \u00e9carts entre les pilotes (surtout ceux qui sont en dessous de deux secondes). Les pneus de chaque pilote et combien de tours, ils ont fait dessus Les temps d'arr\u00eats aux stands Les temps au tour (surtout pour la strat\u00e9gie) Mais pleins d'autres informations existent si on les recoupe sur plusieurs tours. Un outil qui permettrait de mettre en \u00e9vidence les informations importantes serait donc une tr\u00e8s grosse plus-value pour mon travail et s'il est facile \u00e0 installer et \u00e0 utiliser, il se pourrait qu'il devienne indispensable. Cahier des charges Il s'agit d'une version coup\u00e9e du cahier des charges qui ne contient pas l'explication du contexte. Mais l'original est disponible sur ce site \u00e9galement. Il est toutefois normal d'y voir des choses r\u00e9p\u00e9t\u00e9es ou l\u00e9g\u00e8rement diff\u00e9rentes, en effet, il n'a pas \u00e9t\u00e9 \u00e9crit en m\u00eame temps que le reste de ce document. Projet Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes. Le but est non seulement de faciliter mon job, mais aussi faire en sorte d'am\u00e9liorer la plus-value de mon travail en me permettant de fournir des commentaires qui ne sont pas disponibles pour le tout venant qui regarde simplement le flux RTS. Exemples : Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand Maintenant afficher diff\u00e9remment les infos, c'est sympa, mais cela serait encore mieux de traiter ces data et de permettre des petites pr\u00e9dictions. Exemples : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents R\u00e9alisation Malheureusement, la Formula 1 Management ne propose aucune API publique qui puisse nous permettre de faire ce projet \"simplement\". La raison la plus probable \u00e9tant qu'Amazon avec son service AWS propose exactement ce genre de services pour le flux t\u00e9l\u00e9vis\u00e9 et il doit y avoir un contrat d'exclusivit\u00e9. Il existe des API \"Pirates\" faites par la communaut\u00e9, le probl\u00e8me est qu'elles ne sont pas forc\u00e9ment des plus pratiques \u00e0 utiliser. Mais comme je poss\u00e8de un abonnement premium ++ \u00e0 la F1TV, j'ai acc\u00e8s pour chaque grand prix \u00e0 un flux vid\u00e9o nomm\u00e9 : DATA F1 CHANNEL Qui ressemble \u00e0 \u00e7a : \"Exemple de la Data Channel\" Donc la seule fa\u00e7on que je vois de r\u00e9cup\u00e9rer ces donn\u00e9es est de les prendre directement sur ce feed. M\u00eame si le but final de l'application est de faire pleins de choses super avec les datas, le gros du projet va surtout \u00eatre la r\u00e9cup\u00e9ration des donn\u00e9es et leur stockage. Les donn\u00e9es viennent du flux vid\u00e9o et ainsi dans un premier temps, il va falloir r\u00e9cup\u00e9rer d'une mani\u00e8re ou d'une autre des images qui viennent d'un grand prix en direct ou en rediffusion. Ensuite, dans un second temps, il faut lire les informations directement sur l'image en utilisant une librairie pr\u00e9vue pour (exemple Tesseract) et v\u00e9rifier l'int\u00e9grit\u00e9 de ces derni\u00e8res pour qu'on puisse ensuite les stocker. Dans un troisi\u00e8me temps, il faut stocker toutes ces donn\u00e9es dans une forme qui permette d'aller facilement faire des requ\u00eates de r\u00e9cup\u00e9ration et d\u00e9j\u00e0 pr\u00e9parer des m\u00e9thodes qui permettent de r\u00e9cup\u00e9rer des infos importantes (ex : la moyenne des cinq derniers tours, le temps moyen d'arr\u00eat etc.) pour faciliter la derni\u00e8re \u00e9tape Quand tout cela est fait, on peut ensuite s'amuser un peu avec les Data. La derni\u00e8re \u00e9tape est donc l'affichage. L'id\u00e9e est de cr\u00e9er une Windows Form qui contienne toutes ces informations dans un format beaucoup plus lisible et avec laquelle on pourrait interagir pour permettre de plus facilement commenter les Grands Prix. (exemple plus bas avec un croquis de ce \u00e0 quoi l'application pourrait ressembler) Voici la liste des donn\u00e9es qui pourraient \u00eatre affich\u00e9es (Non contractuel, simplement des id\u00e9es). Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand La moyenne de temps que les pilotes perdent dans les stands La performance moyenne des 5 types de pneus La moyenne de temps de chaque pilote sur le pneu actuel Le nombre de points que chaque pilote gagnerait selon sa position Le classement de la course Voire m\u00eame si c'est possible : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents Pr\u00e9dire les temps au tour de chaque pilote selon l'usure des pneus Voici un exemple d'interface possible pour une page : \"Protype de l'app fait sur Figma\" Cas d'utilisation '*'On va consid\u00e9rer que tous les user ont un abonnement F1 TV PRO Un user veut r\u00e9cup\u00e9rer les data : Il ouvre son navigateur et lance la page DATA de la F1 TV Il calibre la capture des data via le programme (pour la premi\u00e8re utilisation). Il confirme que les donn\u00e9es initiales sont bonnes (pour la premi\u00e8re utilisation). Il regarde tranquille son Grand Prix Le programme r\u00e9cup\u00e8re les data : Il r\u00e9cup\u00e8re des images depuis la F1TV Il utilise Tesseract (ou autre) pour en r\u00e9cup\u00e9rer les infos. Il met ces infos dans un Objet Pilote, dans un Objet course avec un attribut tour pour hi\u00e9rarchiser les data Pour ce qui est de l'affichage, l'id\u00e9e est de faire une application C# comme on l'a appris \u00e0 l'\u00e9cole, mais avec assez de style pour qu'elle puisse \u00eatre agr\u00e9able \u00e0 utiliser. Quand le programme affiche les data : Il prend les donn\u00e9es venant directement de la F1TV. Il affiche diff\u00e9remment les donn\u00e9es pour permettre une meilleure lisibilit\u00e9 Il interpr\u00e8te avec des r\u00e8gles plut\u00f4t simples certaines data pour faire des minipr\u00e9dictions ou aider \u00e0 la lecture Il r\u00e9cup\u00e8re des infos d'autres courses pour les comparer et proposer des pr\u00e9dictions plus int\u00e9ressantes Difficult\u00e9s techniques R\u00e9cup\u00e9rer un flux vid\u00e9o plut\u00f4t propre malgr\u00e9 les contres mesures de la F1 TV pour en emp\u00eacher la lecture par un logiciel Si on doit passer par une capture d'\u00e9cran, trouver un moyen de stocker les donn\u00e9es de mani\u00e8re \u00e0 pr\u00e9voir que parfois un tour pourrait avoir plus de donn\u00e9es qu'un autre, que le user peut mettre pause, ou m\u00eame qu\u2019il revienne en arri\u00e8re. D\u00e9velopper des algorithmes pour r\u00e9cup\u00e9rer les donn\u00e9es comme les diff\u00e9rents pneus utilis\u00e9s ou l'activation du DRS ainsi que d\u00e9velopper des moyens de nettoyer les r\u00e9sultats de l'OCR (Par exemple utiliser diff\u00e9rents champs redondants pour comparer les r\u00e9sultats) Stocker les donn\u00e9es sur une base pour les traiter plus tard tout en pr\u00e9voyant un moyen de voir les stats live D\u00e9velopper des algorithmes de pr\u00e9diction qui prennent en compte d'anciennes courses pour tenter de pr\u00e9dire des choses comme les arr\u00eats aux stands par exemple. Diff\u00e9rences sur le cahier des charges [\u00c0 remplir dans les derni\u00e8res semaines du travail de dipl\u00f4me] Planning pr\u00e9visionnel Mes suiveurs m'ont demand\u00e9 un planning de type GANTT pour ce travail de dipl\u00f4me Je n'ai pas utilis\u00e9 un logiciel particulier pour faire ce dernier, mais je me suis inspir\u00e9 des principes fondamentaux d'un diagramme de ce type. Comme l'original a \u00e9t\u00e9 fait sur Excel, je ne peux pas vraiment l'ins\u00e9rer de mani\u00e8re lisible ici, mais il est disponible dans le dossier Planning. Mais voici un r\u00e9sum\u00e9 de son contenu : T\u00e2ches J'ai d\u00e9cid\u00e9 de d\u00e9composer mon planning en trois grands types de t\u00e2ches. Programmation Documentation Tests L'id\u00e9e est de permettre une meilleure lisibilit\u00e9 et de me permettre \u00e0 moi de me faire plus facilement \u00e0 l'id\u00e9e de ce qu'il m'attend. Voici la liste des t\u00e2ches par rubrique : PT Cette rubrique contient les t\u00e2ches qui n'ont pas leur place dans les trois cat\u00e9gories principales. PT1 / pr\u00e9paration au travail de dipl\u00f4me (2) Cette t\u00e2che est un peu hors cat\u00e9gorie, mais c'est normal, c'est une supert\u00e2che qui regroupe beaucoup de choses. C'est une t\u00e2che qui est planifi\u00e9e pour deux jours et qui normalement devrait \u00eatre faite les deux premiers jours du travail. Le but est de pr\u00e9parer tout ce qui peut \u00eatre pr\u00e9par\u00e9 en avance niveau documentation et mise en place pour ne pas avoir besoin de s'en soucier ensuite. DT Rubrique documentation qui contient toutes les t\u00e2ches en rapport de pr\u00e8s ou de loin avec la documentation du projet. DT1 Cr\u00e9ation du poster (1) Cette t\u00e2che consiste \u00e0 faire une version num\u00e9rique du poster qui soit en accord avec les consignes qu'on nous a donn\u00e9es. Le but est aussi et surtout de faire poster dont je sois fier et que je sois content de montrer. Il y a d\u00e9j\u00e0 des croquis de poster et j'ai clairement pr\u00e9vu de travailler sur \u00e7a pendant les vacances alors, je n'ai mis qu'un jour et je l'ai plac\u00e9 juste avant le rendu de ce dernier. DT2 Documentation Analyse de l'existant (2) Cette t\u00e2che est d\u00e9di\u00e9e \u00e0 l'\u00e9criture de la documentation et plus pr\u00e9cis\u00e9ment de l'analyse de l'existant. Comme il y a pas mal de technologies utilis\u00e9es dans mon projet, j'aimerais faire correctement un vrai debrief de pourquoi j'ai utilis\u00e9 l'une ou l'autre alors, j'ai assign\u00e9 deux jours dessus. DT3 Documentation Analyse organique (5) Cette t\u00e2che est la plus grosse dans la cat\u00e9gorie documentation. Il s'agit de documenter comment l'application fonctionne. J'y ai mis cinq jours et je pense que c'est un minimum car c'est dans cette t\u00e2che que je vais devoir d\u00e9tailler exactement comment fonctionne chaque partie du projet. Ces cinq jours sont \u00e9parpill\u00e9s sur le projet en g\u00e9n\u00e9ral \u00e0 la fin du d\u00e9veloppement de chaque grande partie de projet. Le but est de ne rien oublier et de ne pas avoir \u00e0 tout faire en m\u00eame temps. DT4 Documentation Analyse fonctionnelle (2) Cette t\u00e2che est d\u00e9j\u00e0 moins grosse, elle consiste \u00e0 documenter le fonctionnement de l'application et comment utiliser les composants que j'ai d\u00e9velopp\u00e9s. Je l'ai mis en fin de projet, car comme j'ai l'habitude de faire des analyses fonctionnelles plut\u00f4t pr\u00e9cises, le moindre changement dans l'UI peut tout rendre obsol\u00e8te. J'y ai mis deux jours, car j'aimerais correctement documenter avec de bonnes photos et sc\u00e9narios pour qu'on puisse voir toutes les possibilit\u00e9s de l'application. DT5 Documentation Tests (1) Cette t\u00e2che est un peu plus petite qu'elle ne le devrait. Elle concerne la documentation des diff\u00e9rents tests. Je n'y ai mis qu'un seul jour, car en r\u00e9alit\u00e9 les diff\u00e9rentes t\u00e2ches de tests contiennent aussi beaucoup de documentation, DT6 Documentation Reste (2) Cette t\u00e2che est une t\u00e2che un peu vague. Elle contient toutes les actions autres que j'aurai besoin de faire (Mise au propre, orthographe, g\u00e9n\u00e9ration de PDF ...). J'y ai mis deux jours pour avoir un peu de marge, car ce sont toujours des t\u00e2ches qui paraissent faciles, mais qui \u00e0 la fin prennent beaucoup de temps si on les fait bien. PT Rubrique programmation qui contient toutes les t\u00e2ches qui touchent \u00e0 la programmation et au d\u00e9veloppement de l'application. PT1 Programmation r\u00e9cup\u00e9ration des images (3) Cette t\u00e2che est estim\u00e9e \u00e0 seulement trois jours, il ne faut pas s'y m\u00e9prendre, c'est une des t\u00e2ches les plus dures et lourdes niveaux documentation en explications. Cependant, un POC (Proof Of Concept) assez avanc\u00e9 a d\u00e9j\u00e0 \u00e9t\u00e9 fait et donc cela permet de n'envisager que trois jours, car il suffit de l'impl\u00e9menter et de la paufinner. Cette t\u00e2che consiste \u00e0 prendre en entr\u00e9e un lien de Grand Prix et de sortir une image tous les x secondes de la page DATA. Cela peut sembler simple, mais pour le faire sans prendre d'espace d'\u00e9cran et ne demandant pas \u00e0 l'utilisateur de copier-coller quoi que ce soit o\u00f9 de donner ses identifiants F1TV c'est un challenge. Cela peut paraitre curieux alors de mettre cette t\u00e2che loin dans le planning m\u00eame si c'est la premi\u00e8re \u00e9tape du projet. Encore une fois cela s'explique avec le fait qu'il y a d\u00e9j\u00e0 un POC qui fonctionne \u00e0 peu pr\u00e8s et que donc pr\u00e9f\u00e8re commencer avec des t\u00e2ches plus incertaines dans le cas o\u00f9 elles prendraient plus de temps que pr\u00e9vu. PT2 Programmation OCR (5) Cette t\u00e2che consiste \u00e0 d\u00e9velopper la partie qui reconnait le texte sur les images. C'est tr\u00e8s certainement la t\u00e2che qui risque le plus de d\u00e9border car c'est celle qui est la plus complexe techniquement puisqu'elle demande non seulement la lecture sur image, mais aussi le d\u00e9veloppement d'algorithmes de traitement de cette donn\u00e9e pour \u00eatre s\u00fbr qu'elle a bien \u00e9t\u00e9 lue. J'y ai ainsi allou\u00e9 cinq jours, mais j'esp\u00e8re que j'arriverai \u00e0 gagner du temps sur les autres pour y allouer plus dans le planning effectif, car je suis convaincu que plus, on y passe du temps, meilleur sera le r\u00e9sultat. PT3 Programmation, stockage et mod\u00e8le (5) Cette partie est moins technique, mais concerne le stockage des donn\u00e9es que nous retourne la lecture des images. Mais elle va demander de la r\u00e9flexion et de l'intelligence de programmation, car il faut que cette partie anticipe les besoins de la vue et pr\u00e9pare un terrain fertile qui ne demande pas un refactor quand on passera au d\u00e9veloppement de la vue. C'est pour cela que je lui ai aussi assign\u00e9 cinq jours de travail et elle doit absolument \u00eatre commenc\u00e9e apr\u00e8s la lecture. PT4 Programmation Vue de l'APP (5) Cette partie peut \u00eatre horrible comme tr\u00e8s facile, cela d\u00e9pend compl\u00e8tement de la qualit\u00e9 du travail avant. Si le mod\u00e8le est parfait et que les donn\u00e9es sont int\u00e8gres, cela devrait \u00eatre plut\u00f4t simple de les afficher de mani\u00e8re int\u00e9ressante. Cependant, cette partie d\u00e9bordera s\u00fbrement un peu, car tout le temps gagn\u00e9 avec de bonnes donn\u00e9es sera utilis\u00e9 pour tenter de faire de la pr\u00e9diction. Pour ces raisons, je lui ai assign\u00e9 \u00e9galement cinq jours de travail et elle doit absolument \u00eatre faite apr\u00e8s le mod\u00e8le. PT5 Programmation mise en commun (3) Cette t\u00e2che est aussi un petit peu sp\u00e9ciale, car elle regroupe plusieurs choses. En gros, chaque partie de programmation sera s\u00fbrement assez ind\u00e9pendante et il faudra \u00e0 un moment faire un seul projet C# qui contient tout. Il est difficile d'estimer \u00e0 quel point cela va \u00eatre compliqu\u00e9 alors, j'ai \u00e9t\u00e9 conservateur et j'ai mis trois jours. TT Cette rubrique contient les t\u00e2ches qui sont uniquement des tests. La plupart des t\u00e2ches de programmations contiennent d\u00e9j\u00e0 des tests, mais certaines demandent une attention particuli\u00e8re. TT1 Tests OCR (2) Cette t\u00e2che est une des t\u00e2ches les plus importantes. Son but est de faire un protocole de tests complet qui permette de comparer les diff\u00e9rents algorithmes de reconnaissance de texte. Je l'ai mise apr\u00e8s la reconnaissance, mais m\u00eame maintenant en \u00e9crivant ces lignes, je me dis que dans le planning effectif, elle sera faite pendant la t\u00e2che de programmation. En effet, comment savoir si mon tout nouvel algorithme est r\u00e9ellement mieux que le pr\u00e9c\u00e9dent. Je pr\u00e9vois deux jours, car je pense que faire le dataset va prendre beaucoup de temps, il faut pr\u00e9voir un certain nombre d'images et de texte qui pourront ensuite \u00eatre donn\u00e9es sous forme de tests. C'est certes une t\u00e2che de test, mais c'est aussi de la programmation. TT2 Tests finaux (2) Cette t\u00e2che de tests est un peu vague, elle regroupe les diff\u00e9rents tests pour v\u00e9rifier que les donn\u00e9es sont bien affich\u00e9es correctement. Ce qui serait cool si j'ai du temps en fin de travail de dipl\u00f4me serait de faire un syst\u00e8me de test qui permet d'entrainer le programme \u00e0 mieux reconnaitre certaines choses comme des arr\u00eats aux stands si on lui donne les trois derni\u00e8res ann\u00e9es de grands Prix. J'ai mis une dur\u00e9e arbitraire de deux jours, mais je ne sais pas vraiment combien de temps cela va vraiment durer. Elle est \u00e9videmment \u00e0 effectuer une fois que tout est \u00e0 peu pr\u00e8s termin\u00e9. Planning effectif et diff\u00e9rences [A remplir dans les derni\u00e8res semaines du travail de dipl\u00f4me] Analyse fonctionnelle [A remplir au fur et \u00e0 mesure dans la seconde moiti\u00e9 du travail de dipl\u00f4me] Analyse Organique Outils utilis\u00e9s [A Remplir] Technologies utilis\u00e9es Dans ce projet diff\u00e9rents choix ont \u00e9t\u00e9 faits pour ce qui est des technologies. Certaines ont \u00e9t\u00e9 choisies car elles \u00e9taient les plus simples, les plus pratiques, les plus efficaces ou encore les plus connues et donc ayant le meilleur support. Je vais tenter de r\u00e9sumer ici ces choix mais je reviendrai sur la plupart d'entre eux plus tard quand j'explique ce que je fais avec. Selenium \"Logo de selenium\" Selenium est une librairie \u00e0 la base Node JS qui permet d'automatiser des actions sur un navigateur internet. Le but premier et je pense son utilisation premi\u00e8re est l'automatisation de tests pour des applications WEB. En effet c'est un super outil pour simuler un user faisant un certain nombre d'actions sans apporter de variabilit\u00e9 ce qui fait de supers test unitaires. Cependant je pense que l'autre grande partie des utilisateurs de Selenium l'utilisent pour faire du \"Scrapping\". Et nous sommes un peu dans cette seconde cat\u00e9gorie. Le \"Scrapping\" c'est l'acte d'aller r\u00e9cup\u00e8rer des informations sur des pages web automatiquement pour alimenter sa propre base de donn\u00e9es. En effet, si on arrive \u00e0 passer les protections anti-bot on peut facilemnt utiliser Selenium pour scraper tous les sites qui nous passent par la t\u00eate. Le cahier des charges que j'avais en t\u00eate en cherchant une technologie de contr\u00f4le de navigateur internet \u00e9tait le suivant : Simple Permettant de contr\u00f4ler un navigateur Headless (Voir chapitre \"Simuler un navigateur ?\") Permettant de contr\u00f4ler firefox Ayant un wrapper C# Permettre de changer certaines choses comme les cookies en Live Permettre d'interagir avec les \u00e9l\u00e9ments d'une page Fonctionner Simple car je ne voulais pas avoir \u00e0 passer trop de temps dessus (ca n'a pas bien vieillit lol...). Je voulais que l'on puisse utiliser Firefox car il n'impl\u00e9mente pas les m\u00eames s\u00e9curit\u00e9es que Chrome pour faire simple. J'avais besoin que la lib puisse contr\u00f4ler un Firefox HEADLESS car je ne voulais pas avoir une page web ouvert sur mon ordi quand je commente car c'est de l'espace utilis\u00e9 pour rien. J'avais besoin d'un wrapper C# car c'est le language que j'utilise. Pour finir j'avais besoin d'interragir avec les \u00e9l\u00e9ments de la page pour naviguer dessus et d'ins\u00e8rer des cookies pour me connecter sans avoir \u00e0 passer par le login de la F1TV qui est tr\u00e8s bon pour detecter les bots. Avec un cahier des charges parreil beaucoup de librairies ont \u00e9t\u00e9 abandonn\u00e9es. J'ai pu tester pleins de librairies C# qui arrivaient \u00e0 contr\u00f4ler un Chrome et m\u00eame pas mal qui arrivaient \u00e0 contr\u00f4ler un Chrome Headless. Mais le choix est tr\u00e8s vite restreind quand on veut pouvoir contr\u00f4ler Chrome OU Firefox. A la base mon choix c'\u00e9tait port\u00e9 sur Puppeteer Sharp qui est une librairie qui se veut \u00eatre exactement ce que je veux. \"Logo de Pupeteer\" Je voulais utiliser cette librairie car il y a des plugins qui sont tr\u00e8s orient\u00e9s scrapping, en effet, ils impl\u00e9mentent de nombreuses techniques pour permettre de mieux passer innapercu par les syst\u00e8mes de detection de bots. Sur le papier c'est la librairie parfaite qui correspond parfaitement au cahier des charges que je m'\u00e9tais fix\u00e9 et je pense que si j'utilisais un projet JS elle le serait. Sauf que avec le wrapper C# j'ai eu un certain nombre de probl\u00e8mes: Toutes les versions de la librairie ne fonctionnaient pas. Il fallait faire des tests avec diff\u00e9rentes versions de la librairie et de ses d\u00e9pendences simplement pour faire d\u00e9marrer un browser. Et ca c'est quand ca marchait car il y avait des jours ou des machines ou je n'ai simplement pas pu faire fonctionner la librairie. M\u00eame avec les techniques propos\u00e9es par les plugins \"Stealth\" je n'arrivais pas \u00e0 bypass les s\u00e9curit\u00e9es de la page de login de la F1TV. J'ai essay\u00e9 tout ce que j'ai pu trouver sur internet mais on se fait toujours chopper d\u00e8s que l'on arrive sur la page. Et le pire de tout, impossible de faire fonctionner un vid\u00e9o. J'ai pu faire tout ce que je voulais faire au final en passant par l'utillisation de cookies pour la connexion. Tout ca pour arriver au moment ou il faut lancer la vid\u00e9o, et la, crash. Impossible de faire fonctionner Puppeteer Sharp avec une vid\u00e9o. D\u00e8s qu'elle se lance c'est un crash assur\u00e9 sans message d'erreur clair. Et le soucis c'est que le wrapper C# n'est pas vraiment bien support\u00e9 et que si c'est un bug de la lib je ne risque pas de voir de fix avant un moment si ce n'est jamais. Pour toutes ces raisons, j'ai du abandonner cette librairie ce qui a \u00e9t\u00e9 tr\u00e8s dur car j'avais pass\u00e9 beaucoup de temps dessus \u00e0 essayer de la faire marcher. Ensuite le choix de Selenium \u00e9tait plut\u00f4t simple, c'\u00e9tait la seule option restante. A ce jour je ne connait aucune autre librairie que Puppeteer ou Selenium qui puisse contr\u00f4ler un Firefox Headless en respectant mon cahier des charges et qui soit donc disponible depuis C#. Si je n'arrivais pas \u00e0 faire fonctionner Selenium j'aurai du abandonner l'id\u00e9e de simuler un navigateur tout simplement. Mais j'ai eu la chance que cette librairie fasse tout ce que je pouvais demander. C'est une super lib et m\u00eame si la version C# n'est vraiment pas bien document\u00e9e, la plupart des documentations de la version JS sont pertinentes pour al version C# m\u00eame si ca n'est pas la m\u00eame syntaxe. Pour r\u00e9sumer, j'ai choisis Puppeteer car c'\u00e9tait la seule option viable pour mon besoin. (Note : Par contre si je trouve la personne chez mozilla ou puppeteer qui a d\u00e9cid\u00e9 d'hardcoder la r\u00e9solution maximale du browser Headless que l'on peut override UNIQUEMENT en changeant les variables d'environnement de la machine ET DE NE LE DOCUMENTER QUASI NULLE PART JE JURE QUE CA VA TRES MAL SE PASSER) CSharp \"Logo C#\" Je pense que c'est le choix le plus simple \u00e0 expliquer. C# est un language de programmation orient\u00e9 objet relativement haut niveau qui a \u00e9t\u00e9 cr\u00e9\u00e9 par Microsoft et qui a comme cible le developpement d'applications pour Windows. (On peut evidemment trouver des adaptations pour le faire tourner sur Linux mais ce n'est pas vraiment le but du language) En plus d'\u00eatre un superbe language de programmation, c'est le language que l'on apprend au CFPT informatique. C'est donc un language avec lequel je suis beaucoup plus \u00e0 l'aise que pour d'autres languages comme le Python ou le JS. Mon but n'\u00e9tait pas de faire une application Web et je travaille sous Windows. Je savais que mon projet allait demander un minimum de programmation orient\u00e9e objet. J'ai donc imm\u00e9diattement pens\u00e9 \u00e0 utliser C#. Cependant j'aurais tr\u00e8s bien pu utiliser un language comme python qui m'aurait clairement facilit\u00e9 la t\u00e2che avec des librairies bien plus fournies et plus souvent mises \u00e0 jour. Mais comme je ne suis pas du tout aussi \u00e0 l'aise avec je pense que le C# \u00e9tait la meilleure option. Mes seuls regrets apr\u00e8s coup sont que je trouve les Windows Forms tr\u00e8s moches et qu'il est particuli\u00e8rement difficile de les rendres plus jolies et que les librairies disponibles en C# pour des sc\u00e9narios tr\u00e8s pr\u00e9cis ne sont pas au niveau de celles pour JS et pour Python. Cependant si j'avais \u00e0 refaire le projet je reprendrais C# je pense. Python? \"Logo Python\" Alors ce choix la est plus commpliqu\u00e9 \u00e0 comprendre. Pour tout le projet j'ai tent\u00e9 de garder le C# comme language et de ne pas utiliser autre chose. Cependant j'ai du utiliser une seule fois le Python dans un cas tr\u00e8s pr\u00e9cis. Je n'aime vraiment pas coder en python de base et clairement j'aurais pr\u00e9f\u00e8r\u00e9 ne pas l'utiliser mais je n'avais pas le choix. Le besoin dans le cas du python \u00e9tait le suivant : J'avais besoin d'un moyen de r\u00e9cup\u00e8rer des strings et les d\u00e9coder avec une cl\u00e9 encod\u00e9e avec le syst\u00e8me propri\u00e9taire de windows d'encodage. Le soucis que j'avais avec le C# c'est que les methodes de decryption ne fonctionnent pas pareil que en python et tous les exemples que je pouvais trouver \u00e9taient en python. J'ai essay\u00e9 pendant un sacr\u00e9 moment de faire fonctionner la decryption en C# mais sans succ\u00e8s. J'ai donc directement utilis\u00e9 le python comme faisait toutes les personnes que je pouvais voir sur internet et je pense que ca n'est pas une mauvaise id\u00e9e. En effet, cela veut dire que si \u00e0 un moment Chrome est mis \u00e0 jour, je n'aurai pas besoin d'aller ouvrir tout le code source de mon projet pour tout recompiler, j'aurai simplement besoin de changer ce script. Un des avantages du Python est quand m\u00eame qu'il y beaucoup plus de gens qui codent dessus, et pour ce genre d'utilisation tr\u00e8s sp\u00e9cifiques c'est plut\u00f4t pratique. Le seul probl\u00e8me c'est que cela oblige l'utilisateur \u00e0 avoir python install\u00e9 sur sa machine et que sa version doit \u00eatre compatible... (les joies de python) Firefox \"Logo Firefox Headless\" J'en parle deja plus bas, mais le choix de navigateur est super important. Deja tous les navigateurs n'ont pas un mode Headless(sans t\u00eate, mieux expliqu\u00e9 dans la rubrique \"Simuler un naviguateur ?\"). Par exemple, m\u00eame si Edge est maintenant bas\u00e9 sur chromium, il n'existe pas de moyen de le faire tourner en Headless pour le moment. Autre soucis, les librairies d'automatisation ne supportent pas tous les navigateurs. Par exemple, beaucoup supportent chrome mais tr\u00e8s peu supportent Firefox ou Edge. Donc il me fallait un navigateur qui puisse op\u00e8rer en Headless et qui soit support\u00e9 par plusieurs librairies d'automatisation. Il n'y a que Firefox et Chrome qui sont conforme \u00e0 ces exigeances (Je n'ai pas verifi\u00e9 pour TOUS les navigateurs. Peut-\u00eatre que les Opera GX ont aussi un mode headless super, mais je me suis concentr\u00e9 sur les navigateurs plus grand public). Chrome est support\u00e9 par plus de lib, mais le soucis c'est que la F1TV utilise un lecteur de vid\u00e9o avec DRM (Plus d'infos la dessus dans la partie \"Simuler un navigateur?\") et donc le choix \u00e9tait simple. Il ne restait que Firefox. Tesseract Je pense que le choix le plus simple apr\u00e8s le C# fut l'utilisation de Tesseract. C'est tout simplement l'outil le plus utilis\u00e9 pour faire de l'OCR. A la base c'est une lib Python (Ah tiens encore ?) qui peut \u00eatre redoutablement efficace avec le bon dataset. Il existe d'autres outils mais j'ai d\u00e9cid\u00e9 de prendre celui la \u00e0 cause de son support juste incroyable et de son omnipr\u00e9sence dans la documentation OCR. En plus il est facile \u00e0 utiliser et je ne pense pas encore avoir fait le tour de tout son potentiel dans ce projet. Fonctionnement g\u00e9n\u00e9ral Avant de passer \u00e0 l'explication de chaques parties du projet en d\u00e9tail, je pense qu'il est important de faire un petit point sur comment toutes les parties du projet s'emboitent et fonctionnement ensemble. Comme ca quand vous lirez l'explication d'une \u00e9tape vous serez conscient de \u00e0 quoi elle sert et ou elle s'\u00eenscrit dans le projet principal. Les briques principales Voici trois grosses \u00e9tapes du projet. Pour rappel ce sont des vulgarisations plut\u00f4t larges qui n'ont qu'un seul but, aider \u00e0 la compr\u00e9hension de ce qui vient par la suite. Recup\u00e9ration d'images \"Diagramme simplifi\u00e9 repr\u00e9sentant le processus de r\u00e9cup\u00e8ration des images\" Pour faire simple on peut voir qu'il y a deux parties \u00e0 cette \u00e9tape. La premi\u00e8re en partant du haut repr\u00e9sente un script python qui va chercher des informations dans la base de donn\u00e9es de Chrome qui est en SQLITE. Ces informations dans notre cas sont les cookies de connexion. Dans la seconde \u00e9tape, on peut voir que le programme utilise Selenium avec un navigateur Firefox Headless qui va aller communiquer avec la F1TV qui est le site web qui nous int\u00e9resse et que une des infos que l'on r\u00e9cup\u00e8re est une image de la page en format PNG que l'on envoie au programme C#. Ces deux partie sont li\u00e9es car pour se connecter \u00e0 la F1TV Selenium a besoin des cookies de connexion r\u00e9cup\u00e8r\u00e9s par le programme Python. La premi\u00e8re partie est un processus qui n'est utilis\u00e9 qu'une seule fois au d\u00e9marrage tandis que la r\u00e9cup\u00e9ration d'images et en continu pendant toute la dur\u00e9e de l'utilisation de l'application. OCR \"Diagramme simplifi\u00e9 repr\u00e9sentant le processur d'OCR\" ; On peut voir dans ce diagramme simplifi\u00e9 qu'avec l'aide de ce que contient le fichier \"Config.JSON\" on d\u00e9coupe l'image que l'on a r\u00e9cup\u00e8r\u00e9 au pr\u00e9alable en petits morceaux qui continennent des informations. Ensuite on prend cette image et on lui applique un filtre pour retirer le flou la couleur etc... Puis en utilisant de l'OCR (Optical Character Recognition) on en r\u00e9cup\u00e8re les informations sous forme de texte et on le renvoie dans le programme C# Dans cette partie explicative g\u00e9n\u00e9rale, on ne reviendra pas sur la cr\u00e9ation de ce fichier config. Pour plus d'infos \u00e0 son sujet voir la rubrique (OCR/Fonctionnement g\u00e9n\u00e9ral) Traitement et affichage \"Diagramme simplifi\u00e9 repr\u00e9sentant le processus de traitement et d'affichage\" On peut voir dans ce dernier mini diagramme simplifi\u00e9 que on prend les donn\u00e9es que l'on r\u00e9cup\u00e8r\u00e9 de l'\u00e9tape pr\u00e9c\u00e9dente qui ne sont pas forc\u00e9ment toutes coh\u00e9rentes et qu'on les traite pour leur redonner du sens avant de les stocker dans une base de donn\u00e9es SQLITE. Ensuite cette m\u00eame base de donn\u00e9e fournis les infos nescessaires pour des affichages (Ces affichages sont directements r\u00e9cup\u00e8r\u00e9s depuis le projet en cours de fonctionnement) R\u00e9sum\u00e9 du fonctionnement g\u00e9n\u00e9ral \"Diagramme simplif\u00e9 repr\u00e9sentant le processus g\u00e9n\u00e9ral du projet\" Ce dernier diagramme est un sch\u00e9ma fait pour repr\u00e9senter de la mani\u00e8re la plus simple possible toutes les briques du projet et comment elles s'imbriquent ensemble. La repr\u00e9sentation est un peu diff\u00e9rentes des 3 autre diagramme car le but ici est surtout de montrer le chemin que fait la donn\u00e9e \u00e0 travers les couches Toutes les parties du projet ne sont pas incluses, notamment la partie calibration dans un objectif de simplifier la lecture. Dans l'ordre, on peut voir que pour la partie r\u00e9cup\u00e8ration d'images, le python va r\u00e9cup\u00e8rer les cookies dans la base de donn\u00e9es chrome pour ensuite les retourner \u00e0 Selenium. Selenium va ensuite pouvoir lancer un navigateur (en l'occurence Firefox) et utiliser les cookies r\u00e9cup\u00e8r\u00e9s pour aller sur la page de la F1TV qui va retourner un certain nombre d'infos \u00e0 Selenium. L'info qui nous int\u00e9resse le plus depuis Selenium c'est les images de la page data de la F1Tv et c'est elles que l'on va envoyer dans la partie LOAD du diagramme. Dans cette partie on prend l'image de la F1TV et on la decoupe selon les directives donn\u00e9es par le fichier Config.JSON (il renseigne les zones \u00e0 d\u00e9couper et ce qu'elles repr\u00e9sentent) et apr\u00e8s le d\u00e9coupage on se retrouve avec une zone principale, vingt zones de pilotes et 9 fen\u00eatres de donn\u00e9es par zone de pilote donc 180 fen\u00eatres en tout. Ces fen\u00eatres sont ensuite envoy\u00e9es pour \u00eatre filtr\u00e9es (retirer le flou, mettre en \u00e9vidence les caract\u00e8res, en gros les pr\u00e9parer pour la reconnaissance) dans la partie OCR Dans cette partie, apr\u00e8s avoir filtr\u00e9 les images, on les envoie \u00e0 Tesseract pour qu'il nous retourne des r\u00e9sultats d'OCR. Ces r\u00e9sultats sont ce que Tesseract a trouv\u00e9 sur les image et ils sont retourn\u00e9s sous al forme de Data Pilote. Ex (Position: 1,Tour : 45, Temps au tour : 1:34.683, Pneus: Medium etc....) Finalement ces donn\u00e9es ont envoy\u00e9es dans la partie traitement qui va faire des v\u00e9rifications d'usage pour s'assurer qu'elles sont correctes et quand c'est fait, tout est envoy\u00e9 dans une base de donn\u00e9es SQLITE. On ne montre pas non plus dans ce diagramme la parte affichage des donn\u00e9es car je ne trouve pas pertinent de l'inclure ici. Et voila c'est le fonctionnement tr\u00e8s g\u00e9n\u00e9ral et simplifi\u00e9 de l'application. Je vous invite \u00e0 continuer \u00e0 lire cette documentation pour des informations plus pr\u00e9cises \u00e0 propos de toutes ces \u00e9tapes. Bonne lecture ! R\u00e9cup\u00e9ration des images Voici la premi\u00e8re grande \u00e9tape du projet. Pour rappel, Amazon h\u00e9berge directement le site de la F1TV et poss\u00e8de les droits sur les donn\u00e9es de la F1. C'est sous le nom de AWS (le service d'h\u00e9bergement d'Amazon) que la firme apparait en tant que sponsor. On peut voir ce nom appara\u00eetre assez souvent quand on regarde un Grand Prix car comme ils ont la main-mise sur les donn\u00e9es ils peuvent ins\u00e8rer des bandeaux d'informations sur le flux public sur ce qu'il se passe voir m\u00eame faire des pr\u00e9dictions (Bien qu'un peu bancales) \"Exemple insertion AWS en GP\" Ce service s'appelle F1 Insights (Oui c'est un meilleur nom de projet que F1 Companion mais bon) et c'est, je pense, la raison pour laquelle on ne voit aucune API publique qui permette de correctement se renseigner en don\u00e9es en direct pendant un Grand Prix. Ils ont du d\u00e9gotter un juteux contrat pour s'occuper de toute l'infrastructure digitale de la F1 (du moins publique) en \u00e9change d'une exclusivit\u00e9 totale sur certaines choses comme les Data \"Exemple data d'AWS\" Evidemment je ne fais que conjecturer et ce que j'ai dit n'est pas \u00e0 prendre au pied de la lettre mais c'est une explication possible je pense de pourquoi il est si difficile de trouver des donn\u00e9es sur la F1 facilement en temps r\u00e9el. Il existe bien quelques API un peu bancales publiques, mais le probl\u00e8me c'est qu'elles ne sont vraiment pas suffisante et je ne peux pas leur faire confiance quand je commente. Ce qu'il m'aurait fallut c'est une API publique et officielle qui me permette d'\u00eatre sur que les donn\u00e9es sont les bonnes et qu'elles arrivent le plus vite possible. On pourrait croire que c'est impossible car cela n'existe pas comme je l'ai dit MAIS ! Ce n'est pas compl\u00eatement vrai. En effet depuis que je poss\u00e8de un abonnement \u00e0 la F1TV, il existe une source d'informations tr\u00e8s pr\u00e9cieuse qui m'aide \u00e9norm\u00e9ment dans mon quotidien de commentateur de Formule 1. La \"DATA CHANNEL\". La Data Channel est une page de la F1TV qui permet, pour chaque Grand Prix, de visualiser, sous la forme d'un flux vid\u00e9o, diff\u00e9rentes informations capitales sur la course. \"Exemple de Data Channel\" Le probl\u00e8me, c'est que comme je viens de le dire, ces donn\u00e9es ne sont pas accessibles comme un tableau HTML ou un flux RSS ou un tableau JSON. C'est un flux vid\u00e9o. Il faut savoir qu'entretenir une diffusion de flux vid\u00e9o en 1080P pendant deux heures accessible par des milliers d'abonn\u00e9s est EXTR\u00caMENT cher surtout quand on le compare \u00e0 simplement afficher les donn\u00e9es dans un tableau. Ce qui veut dire que ce choix est d\u00e9lib\u00e9r\u00e9 et a un sens au niveau \u00e9conomique. Je pense donc que c'est justement pour \u00e9viter que des petits malins puissent simplement venir scraper l'int\u00e9gralit\u00e9 des donn\u00e9es qu'ils proposent et fasse sa propre API. (C'est d'ailleurs un des sites avec la meilleure protection anti bot du monde) MAIS ce n'est pas par ce que les donn\u00e9es ne sont pas facile \u00e0 avoir qu'elles sont IMPOSSIBLE \u00e0 avoir. Et c'est la que ce projet entre en jeu. Mais pour d\u00e9coder les donn\u00e9es d'une image il faut dabord ... (roulement de tambours) ... Avoir des images ! Et c'est la que vient se glisser cette partie du projet. Comment faire ? Le but de ce segment est de se concentrer sur la r\u00e9cup\u00e8ration et la mise \u00e0 disposition pour le reste du programme, des images en direct de la F1TV dans la meilleure qualit\u00e9 possible et dans les meilleurs d\u00e9lais. Pour ce faire il y a plusieurs solutions : Reverse engeneer la F1TV pour acc\u00e8der directement au flux sans passer par la plateforme internet et pouvoir prendres images \u00e0 volont\u00e9. Avoir tout simplement une page de la F1TV ouverte sur un \u00e9cran et prendres des screenshots \u00e0 intervals r\u00e9guliers. Simuler un navigateur internet sans qu'il soit affich\u00e9 et le contr\u00f4ler automatiquement pour qu'il prenne des captures. La premi\u00e8re option aurait \u00e9t\u00e9 la plus \u00e9l\u00e9gante mais lors d'un POC que je tentais de r\u00e9aliser je me suis rendu compte que cela serait un peu trop compliqu\u00e9 et long \u00e0 faire. Sans compter le fait que les rediffusions de Grand Prix ne sont pas g\u00e8r\u00e9es de la m\u00eame mani\u00e8re que les diffusions en live. Et que pour faire des Tests en live il faudrait attendre \u00e0 chaque fois un weekend de Grand Prix et le faire en plus du commentaire que je dois produire. Pour toutes ces raisons et bien d'autres je l'ai rang\u00e9e dans la case \"Trop dur, Trop chiant, S\u00fbrement ill\u00e9gal\" (Oui je sais c'est une cat\u00e9gorie bien sp\u00e9cifique mais c'est ma documentation je fais ce que je veux) La troisi\u00e8me option aurait \u00e9t\u00e9 la plus simple (et moins dr\u00f4le) et je suis presque s\u00fbr que je peux impl\u00e9menter cette derni\u00e8re en moins d'une apr\u00e8s-midi. Sauf qu'elle apporte de gros soucis. On ne peux pas garantir l'int\u00e9grit\u00e9 et la continuit\u00e9 des donn\u00e9es si l'utilisateur avance ou fait pause m\u00eame par simple inadvertance. La moindre fen\u00eatre qui s'afficherait devant ruinerait toute la reconnaissance de caract\u00e8res. On ne peut pas contr\u00f4ler la qualit\u00e9 du flux et on est oblig\u00e9 de faire confiance en l'utilisateur On ne peut pas vraiment automatiser quoi que ce soit niveau tests ou m\u00eame pour faire du scrapping auto pour remplir une base de donn\u00e9e. Et finalement le pire inconv\u00e9nient : C'EST NUL ! Je ne pourrais jamais utiliser un projet qui fonctionne de cette facon, je ne peux pas me permettre d'avoir un \u00e9cran inutilisable quand je commente et auquel je dois constamment faire attention pour ne pas perturber la reconnaissance. Pour moi cette option aurait \u00e9t\u00e9 celle \u00e0 choisir en cas d'extr\u00eame urgence et en dernier recours car le projet deviendrait inutile. J'ai donc d\u00e9cid\u00e9 de m'occuper de la seconde option : Simuler un navigateur. Cette option bien que complexe et difficile \u00e0 impl\u00e9menter propose une solution \u00e0 tous les probl\u00eame et permet une r\u00e9cup\u00e8ration quasi sans compromis. Simuler un navigateur ? \"Navigateur Headless(sans t\u00eate)\" Simuler un navigateur internet n'est pas forc\u00e9ment tr\u00e8s difficile. Chromium par exemple offre une panoplie d'outils natifs et \u00e9norm\u00e9ment de librairies existent permettant de facilement et en quelques lignes simuler un Google Chrome et le contr\u00f4ler sans afficher son UI (Interface Utilisateur). \"Chromium logo\" {: style=\"height:150px;width:150px\"} Cependant. La F1TV n'utilise pas simplement un player HTML5 basique. Elle utilise un service de streaming BitMovin qui permet de fournir un stream de bonne qualit\u00e9 et surtout qui impl\u00e9mente les DRM (Digital Right Management) Cela veut dire que quand on ouvre un flux de la F1TV sur chrome et que l'on essaie de prendre une capture d'\u00e9cran, le player se met en noir et ne permet pas de voir quoi que ce soit (Certaines version de Chrome le permettent pendant quelques semaines avant de bloquer \u00e0 nouveau). Ce qui dans notre cas est un immense probl\u00e8me. Mais Firefox ne nous bloque pas de cette facon et il est donc assez facile de passer outre. L'explication sans trop rentrer dans les d\u00e9tails est la suivante : Dans chrome, le player par d\u00e9faut utilise une technologie appell\u00e9e \"PCP\" ou \"Protected Content Playback\" qui leur permet de bloquer au moins une partie des techniques de r\u00e9cup\u00e8ration du flux vid\u00e9o et audio. Cependant Firefox de pas sa nature Open Source utilise \"OpenH264\" pour lire ces m\u00eames flux soumis \u00e0 des DRM et OpenH264 n'impl\u00e9mente pas les m\u00eames restrictions. Sauf que Firefox n'est pas aussi facilement \u00e9mul\u00e9 que chrome et cela r\u00e9duit notre choix de librairies \u00e0 ... Une seule... Qui est Selenium. (Il existe aussi Pupetteer C# mais j'ai rencontr\u00e9 \u00e9norm\u00e9ment de soucis avec cette derni\u00e8re d\u00e8s que je voulais lancer une vid\u00e9o) \"Firefox dev logo\" {: style=\"height:150px;width:150px\"} Mais m\u00eame si la documentation est plut\u00f4t maigre parfois, c'est une bonne librairie qui permet de tr\u00e8s bien contr\u00f4ler une instance de chrome ou de Firefox. Contr\u00f4ler le navigateur Maintenant que l'on sait quel navigateur simuler et avec quelle technologie, on peut passer \u00e0 la r\u00e9alisation. Ce qu'il y a de bien avec Selenium, c'est qu'on a un certain nombre de commandes tr\u00e8s haut niveau qui nous permettent de contr\u00f4ler un navigateur de mani\u00e8re plut\u00f4t pr\u00e9cise. Je vais d\u00e9crire ici la proc\u00e9dure habituelle utilis\u00e9e sous une forme de recette de cuisine pour que l'on puisse facilement comprendre ce qu'il se passe. Durant cette explication je vais parler \u00e0 un moment de Cookies, ne vous en faites pas c'est le sous chapitre suivant qui va vous en parler. Recette de cuisine pour r\u00e9cup\u00e8rer des images de la F1TV : D\u00e9marrer une instance de navigateur avec les bons arguments Ajouter les bons param\u00eatres pour ne pas se faire flag comme un bot Naviguer sur la page de la F1TV Ajouter les cookies de connexion pour avoir acc\u00e8s au contenu de la page Naviguer sur la page du Grand Prix demand\u00e9 Attendre un peu que la page se charge Cliquer sur l'invite de cookies Attendre cinq secondes le temps que la page se reload Cliquer sur le bouton qui permet de passer du feed live \u00e0 la DATA CHANNEL Appuyer sur Espace pour faire apparaitre le bouton d'acc\u00e8s au param\u00eatres Cliquer sur le menu d\u00e9roulant des r\u00e9solution Trouver l'option 1080P et la selectionner Cliquer sur le bouton qui met la vid\u00e9o en plein \u00e9cran Prendre de screenshots \u00e0 intervales r\u00e9guliers Pour faire toutes ces actions on doit r\u00e9cup\u00e8rer les \u00e9l\u00e9ments selon leur ID ou leur classe. Voici un exemple qui r\u00e9cup\u00e8re le bouton de plein \u00e9cran et qui clique dessus : IWebElement fullScreenButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-fullscreentogglebutton\" )); fullScreenButton . Click (); Ca peut para\u00eetre plut\u00f4t simple dit comme ca et quand tout fonctionne ca l'est mais la difficult\u00e9 vient du fait que \u00e0 peu pr\u00e8s nimporte laquelle de ces \u00e9tapes peut rater et qu'il faut donc faire un bon syst\u00e8me de gestion d'erreurs qui puisse aider l'utilisateur en cas de probl\u00e8me. Parfois il est aussi difficile de trouver un \u00e9l\u00e9ment selon son ID,sa classe, ou sa value. Par exemple l'option qui permet de passer en 1080P peut avoir comme value 1080_9011456 ou 1080_9011200 si on refresh la page. Cela demande de passer par des expression r\u00e9guli\u00e8res ce qui n'est pas compliqu\u00e9 en soi mais c'est toutes ces petites choses qui rendent le processus long \u00e0 mettre en place. Il faut dire aussi que les sites ne sont pas forc\u00e9ment tr\u00e8s content de voir des bots passer car cela peut \u00eatre un risque de DDOS et de Scraping (Comme moi) et donc ils mettent en place des syst\u00e8mes pour nous emp\u00eacher de faire ce que l'on veut On peut utiliser diff\u00e9rntes techniques pour passer outre ces restrictions comme : Changer son UserAgent Changer sa r\u00e9solution Ne pas avoir des patterns trop pr\u00e9visibles Avoir un historique Ne pas cliquer pile sur le milieu des boutons Ne pas cliquer trop vite Passer par un proxy pour ne pas se faire flag Utiliser des librairies plus discr\u00e8tes J'ai eu l'occasion de tester toutes ces methodes pour tenter de passer derri\u00e8re les radars de la F1TV et visiblement j'ai r\u00e9ussi pour les pages principales mais pas pour les pages de Login. Il faut savoir que la bataille entre bots et propri\u00e9taires de sites est un grand jeu du chat et de la souris et que les plateformes innovent constamment leur s\u00e9curit\u00e9. Et il se trouve que la partie login de la F1TV est heberg\u00e9e autre part que le reste du site chez Amazon et que elle poss\u00e8de les meilleures s\u00e9curit\u00e9s que j'aie pu voir. Aucunes des methodes que j'ai cit\u00e9es et d'autres encore que j'ai essay\u00e9 n'ont r\u00e9ussi \u00e0 fourvoyer le syst\u00e8me. J'ai donc \u00e9t\u00e9 oblig\u00e9 de faire appel \u00e0 la connexion par Cookies pour pouvoir acc\u00e8der au reste du site internet. R\u00e9cup\u00e8rer les cookies ? Alors, on va mettre de c\u00f4t\u00e9 toutes les questions de s\u00e9curit\u00e9 et de violation de la vie priv\u00e9e et de protection des donn\u00e9es des utilisateurs pour ce chapitre. Car pour faire simple, je siphonne TOUS les cookies de la persone qui utilise mon app. Alors \u00e9videmment ca n'est pas pour faire des b\u00e9tises avec et c'est pour une \"bonne\" raison, mais bon quand m\u00eame ca peut faire bizarre comme ca. Je pense que vous savez d\u00e9ja ce qu'est un Cookie, mais je vais quand m\u00eame faire un petit point la dessus car c'est important pour la suite. Quand on va sur un site internet et que l'on se connecte avec nos identifiants nous sommes connect\u00e9s sur la session. Cependant, si on quitte le site ou que l'on ferme le navigateur, le site ne peut pas garder en m\u00e9moire que c'est bien vous quand le lendemain vous retournez dessus. Pour palier \u00e0 cette limitation on a invent\u00e9 cette chose magnifique (hem...) que sont les cookies ! Les cookies sont des petits fichiers qui sont stock\u00e9s dans votre navigateur et qui peuvent servir \u00e0 beaucoup de choses comme traquer votre activit\u00e9 sur internet et espionner un peu ou aussi par exemple, servir de jeton de connexion. L'id\u00e9e est que quand vous vous connectez sur le site avec vos identifiants, le site envoie un petit fichier dans votre navigateur qui va servir de jeton. Et donc quand vous reviendrez, le site pourra voir que vous avez le jeton et vous connectera automatiquement. Ca peut para\u00eetre g\u00e9nial, et c'est effectivement bien pratique, cependant ce n'est pas sans risques. En effet, imaginons qu'un acteur malveillant parvienne \u00e0 s'emparer de ces petits fichiers, il pourrait ainsi facilement se faire passer pour vous. Alors un cookie expire \u00e0 un moment donn\u00e9 pour temperer les risques, mais ils sont toujours pr\u00e9sents. Dans notre cas on peut vite comprendre pourquoi cela peut \u00eatre int\u00e9ressant de r\u00e9cup\u00e8rer ces cookies. En effet, si on peut mettre la main sur le jeton de connexion de l'utilisateur de notre application. On pourra se connecter automatiquement \u00e0 la F1TV et aller prendre des photos directement sans que l'utilisateur aie \u00e0 faire quoi que ce soit. Sauf que les cookies ne sont pas stock\u00e9s en clair comme ca. Evidemment Google Chrome a mis en place quelques techniques pour \u00e9viter que nimporte qui puisse s'amuser \u00e0 aller taper dans les cookies de la machine. Tous les cookies sont stock\u00e9s dans une base de donn\u00e9es sqlite avec les noms en clair et les valeurs sont encrypt\u00e9es en utilisant la methode AES 256 qui est une methode de cryptage tr\u00e8s utilis\u00e9e et efficace. Tellement efficace qu'il serait compl\u00eatement inutile de tenter de les decrypter en utilisant de la force brute pour trouver la valeur ou m\u00eame une attaque de dictionnaire ou quoi que ce soit. Si ces valeurs peuvent \u00eatre encod\u00e9es et d\u00e9cod\u00e9es en local sur la machine sans connexion internet, cela veut dire que la cl\u00e9 est stock\u00e9e sur la machine. Et si je peux mettre la mais sur cette cl\u00e9 alors je pourrai lire tous les cookies de la machine. Cette cl\u00e9 est stock\u00e9 dans les fichiers de Google Chrome sous Google\\Chrome\\User Data\\Local State . Et dans ce fichier on peut trouver une liste de donn\u00e9es en cl\u00e9 valeurs et on peut trouver la cl\u00e9 sous os_crypt encrypted_key . On pourrait croire que l'on a d\u00e9ja touch\u00e9 le jackpot mais il reste encore une \u00e9tape. Cette cl\u00e9 est crypt\u00e9e en utilisant le syst\u00e8me d'encryption de Windows. Cette encryption est utilis\u00e9e pour emp\u00eacher des utilisateurs non connect\u00e9s d'acc\u00e8der \u00e0 certaines donn\u00e9es. Mais comme nous sommes connect\u00e9s nous pouvons facilement utiliser les librairies de decryption pour trouver la valeur de cette cl\u00e9. Et \u00e0 partir de la il suffit d'utiliser cette cl\u00e9 pour d\u00e9crypter tous les cookies de la machine pour aller chercher ceux qui nous int\u00e9ressent. Voici un exemple du code python qui permet d'aller chercher la cl\u00e9 d'encryption dans les fichiers de Google Chrome : def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key Python ?? Et oui j'ai choisit d'utiliser un srypt python pour aller chercher les cookies. Ce choix a \u00e9t\u00e9 fait pour trois raisons : Le python est un language que je n'aime pas particuli\u00e8rement mais qui poss\u00e8de un \u00e9ventail de librairies absolument fantastique. Et pour ce genre de choses qui demandent une constante mise \u00e0 jour des librairies et qui sont un peu niches le python est une option juste g\u00e9niale. Comme c'est une des parties qui est le plus suceptible de changer vu que Chrome change relativement souvent le syst\u00e8me de stockage des cookies. Dans une optique de facilit\u00e9 de maintenance, avoir un seul fichier qui concerne cette partie du projet et qui est dans un language que plus de gens maitrisent que C# est pratique. Je n'ai pas r\u00e9ussi \u00e0 trouver de librairies C# qui me donne des r\u00e9sultats identiques \u00e0 celles que j'utilise dans ce script python. Pour faire la liaison entre le C# et le python, j'appelle le script depuis mon C# et ensuite le python s'occupe de mettre tous les cookies dans un CSV qui est ensuite lu depuis le C#. Voici la partie python qui \u00e9crit dans le csv : if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" ) Et la partie C# qui appelle le script et qui lit le CSV : private void StartCookieRecovering () { string scriptPath = PYTHON_COOKIE_RETRIEVAL_FILENAME ; Process process = new Process (); process . StartInfo . FileName = \"python.exe\" ; process . StartInfo . Arguments = scriptPath ; process . StartInfo . UseShellExecute = false ; process . StartInfo . RedirectStandardOutput = true ; process . Start (); string output = process . StandardOutput . ReadToEnd (); process . WaitForExit (); } public string GetCookie ( string host , string name ) { StartCookieRecovering (); string value = \"\" ; List < Cookie > cookies = new List < Cookie >(); using ( var reader = new StreamReader ( COOKIES_CSV_FILENAME )) { // Read the header row and validate column order string header = reader . ReadLine (); string [] expectedColumns = { \"host_key\" , \"name\" , \"value\" , \"path\" , \"expires_utc\" , \"is_secure\" , \"is_httponly\" }; string [] actualColumns = header . Split ( ',' ); for ( int i = 0 ; i < expectedColumns . Length ; i ++) { if ( expectedColumns [ i ] != actualColumns [ i ]) { throw new InvalidOperationException ( $\"Expected column '{expectedColumns[i]}' at index {i} but found '{actualColumns[i]}'\" ); } } // Read each data row and parse values into a Cookie object while (! reader . EndOfStream ) { string line = reader . ReadLine (); string [] fields = line . Split ( ',' ); string hostname = fields [ 0 ]; string cookieName = fields [ 1 ]; if ( hostname == host && cookieName == name ) { value = fields [ 2 ]; } } } return value ; } Maintenant que l'on sait comment simuler et manipuler un navigateur internet, que l'on sait comment se connecter sur le compte F1TV de l'utilisateur sans qu'il n'aie rien \u00e0 faire. On a tous les ingr\u00e9dients pour automatiquement r\u00e9cup\u00e8rer des images de la F1TV du Grand Prix que l'on souhaite. Calibration Maintenant que l'on a des images de la page Data de la F1TV on pourrait croire que c'est tout bon on peut direct passer \u00e0 la partie OCR. Mais que nenni ! Le gros soucis de l'OCR c'est que sa pr\u00e9cision est grandement r\u00e9duite d\u00e8s que l'on augmente la taille de la zone de recherche. M\u00eame simplement deux mots sur une image, si on les prends dans images individuelles on a de grandes chances de trouver quelque chose mais si on les mets les deux sur la m\u00eame et que on tente l'OCR on va avoir de r\u00e9sultats bien moins bons. Et puis il faut aussi voir que selon les donn\u00e9es que je cherche je ne peux pas faire le m\u00eame traitement. Par exemple, savoir si le DRS est allum\u00e9, savoir quels pneus chausse un pilote et depuis combien de tours et savoir quel est le temps de son dernier tour, ce sont des informations qui demandent des traitements qui n'ont rien \u00e0 voir. Il faut donc pouvoir dire au programme d'OCR ou se trouvent les informations et quelle est leur nature pour qu'il puisse les d\u00e9coder. Il faut donc faire une calibration qui puisse donner toutes les infos importantes mais qui en m\u00eame temps soit facile \u00e0 utiliser car un utilisateur doit \u00eatre capable de le faire assez facilement. Voici la liste des informations que l'on doit r\u00e9cup\u00e8rer : La liste des pilotes pr\u00e9sent sur le Grand Prix La position de la zone principale La position de chaque zone de pilote La position de toutes les Window sur chaque zone de pilote Le but a \u00e9t\u00e9 de retirer le plus d'\u00e9tapes possibles \u00e0 l'utilisateur. Techniquement j'aurais pu faire une version compl\u00eatement manuelle mais ca aurait pris trop de temps alors il y a des syst\u00e8mes qui permettent de rendre cette t\u00e2che moins p\u00e9nible. Liste des pilotes Pour la liste des pilotes j'ai pens\u00e9 \u00e0 utiliser une API externe pour avoir une liste dans laquelle on pourrait selectionner des noms de pilotes sauf que j'ai abandonn\u00e9 l'id\u00e9e car je trouvais que le projet avait d\u00e9ja bien assez de points qui d\u00e9pendent de l'exterieur. Il y a donc une liste de pilotes dans laquelle on peut ajouter ou supprimer des noms de pilotes. L'id\u00e9al serait de mettre tous les pilotes de reserve comme ca si un pilote est malade sur une course on a pas besoin de venir changer la liste. Zone principale Pour la zone principale c'est compl\u00eatement manuel, on attend de l'utilisateur deux points x,y sur l'image pour ensuite avoir une id\u00e9e de ou est sens\u00e9 se trouver la zone. \"Exemple de zone principale\" Zones pilotes C'est la que ca devient int\u00e9ressant. L'utilisateur n'a pas besoin de faire quoi que ce soit pour que le programme sache ou sont les zones des pilotes. J'aurais pu le faire manuellement en faisant choisir \u00e0 l'utilisateur de donner deux points qui correspondent \u00e0 la premi\u00e8re zone et extrapoler pour en avoir 20. Sauf que si l'utilisateur n'est pas pr\u00e9cis au pixel pr\u00e8s (et m\u00eame comme ca parfois) le vingti\u00e8me pilote se retrouve avec une zone compl\u00eatement desax\u00e9e. La, le programme va \"simplement\" effectuer une reconaissance de texte sur toute l'image. Les r\u00e9sultats ne nous int\u00e9ressent pas vraiment tout ce que l'on veut c'est la position des textes. Avec les position il est facile de determiner ou sont toutes les zones de pilotes et donc sans que l'utilisateur n'aie \u00e0 toucher quoi que ce soit, d\u00e8s qu'il a donn\u00e9 les infos pour la zone principale, les zones de pilotes sont determin\u00e9es. \"Exemple zone pilote\" Voici un exemple du code utilis\u00e9 pour trouver ou dessiner des zones de pilotes : public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); List < Zone > zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Image image = MainZone . ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //var text = iter.GetText(PageIteratorLevel.Word).ToUpper(); //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } //DEBUG int i = 1 ; foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); //We add the driver zones Zone driverZone = new Zone ( MainZone . ZoneImage , windowRectangle , \"DriverZone\" ); MainZone . AddZone ( driverZone ); //driverZone.ZoneImage.Save(\"Driver\" + i+\".png\"); i ++; } } Windows pilotes C'est ici que c'est le plus p\u00e9nible pour l'utilisateur, il doit selectionner manuellement les positions des fen\u00eatres de donn\u00e9es. Ensuite d\u00e8s que l'utilisateur a donn\u00e9e une position pour chaque window, on applique les positions pour chaque zone de pilote. Il y a plusieurs types de windows et selon le type le traitement est diff\u00e9rent comme je l'ai dit plus t\u00f4t. Voici des exemples concrets : \"Exemple Window de pneus\" \"Exemple Window temps au tour\" \"Exemple window Drs\" Il est important que toutes ces zones soient transmises avec le plus de pr\u00e9cision possible pour que l'OCR puisse bien faire son boulot. Stockage Ensuite quand l'utilisateur a finit de configurer son flux, la configuration est stock\u00e9e pour qu'il puisse ensuite la r\u00e9utiliser pour tous les autres Grand Prix de l'ann\u00e9e. Le stockage est fait sous format JSON et est fait pour que le programme d'OCR puisse lire dedans toutes les infos nescessaires. Cela fait des fichiers plut\u00f4t gros mais je n'avais pas vraiment le choix. J'ai test\u00e9 une version avec seulement les infos de la premi\u00e8re zone de pilote mais avec l'interpolation, les derniers pilotes se retrouvent avec des zones clairement pas \u00e0 la bonne taille. Voici un exemple de ce \u00e0 quoi ressemble le JSON final : { \"Main\" : { \"x\" : 36 , \"y\" : 343 , \"width\" : 3780 , \"height\" : 1454 , \"DriverZones\" : [ { \"name\" : \"Driver1\" , \"x\" : 0 , \"y\" : 1 , \"width\" : 3780 , \"height\" : 72 , \"Windows\" : [ { \"Position\" : { \"x\" : 45 , \"y\" : 3 , \"width\" : 76 , \"height\" : 65 }, \"GapToLeader\" : { \"x\" : 447 , \"y\" : 1 , \"width\" : 206 , \"height\" : 67 }, \"LapTime\" : { \"x\" : 863 , \"y\" : 3 , \"width\" : 229 , \"height\" : 65 }, \"DRS\" : { \"x\" : 1095 , \"y\" : 1 , \"width\" : 174 , \"height\" : 67 }, \"Tyres\" : { \"x\" : 1274 , \"y\" : 3 , \"width\" : 1448 , \"height\" : 62 }, \"Name\" : { \"x\" : 2724 , \"y\" : 3 , \"width\" : 361 , \"height\" : 65 }, \"Sector1\" : { \"x\" : 3088 , \"y\" : 1 , \"width\" : 239 , \"height\" : 65 }, \"Sector2\" : { \"x\" : 3314 , \"y\" : 4 , \"width\" : 190 , \"height\" : 62 }, \"Sector3\" : { \"x\" : 3493 , \"y\" : 1 , \"width\" : 198 , \"height\" : 67 } } ] }, { \"name\" : \"Driver2\" , \"x\" : 0 , \"y\" : 72 , \"width\" : 3780 , \"height\" : 72 , \"Windows\" : [ { \"Position\" : { \"x\" : 45 , \"y\" : 3 , \"width\" : 76 , \"height\" : 65 }, \"GapToLeader\" : { \"x\" : 447 , \"y\" : 1 , \"width\" : 206 , \"height\" : 67 }, \"LapTime\" : { \"x\" : 863 , \"y\" : 3 , \"width\" : 229 , \"height\" : 65 }, \"DRS\" : { \"x\" : 1095 , \"y\" : 1 , \"width\" : 174 , \"height\" : 67 }, \"Tyres\" : { \"x\" : 1274 , \"y\" : 3 , \"width\" : 1448 , \"height\" : 62 }, \"Name\" : { \"x\" : 2724 , \"y\" : 3 , \"width\" : 361 , \"height\" : 65 }, \"Sector1\" : { \"x\" : 3088 , \"y\" : 1 , \"width\" : 239 , \"height\" : 65 }, \"Sector2\" : { \"x\" : 3314 , \"y\" : 4 , \"width\" : 190 , \"height\" : 62 }, \"Sector3\" : { \"x\" : 3493 , \"y\" : 1 , \"width\" : 198 , \"height\" : 67 } } ] } [ O t her pilo ts ... ] ], \"Drivers\" : [ \"Perez\" , \"Verstappen\" , \"Alonso\" , \"Sainz\" , \"Russel\" , \"Gasly\" , \"Leclerc\" , \"Ocon\" , \"Hulkenberg\" , \"Bottas\" , \"Hamilton\" , \"Albon\" , \"Tsunoda\" , \"Zhou\" , \"Stroll\" , \"De Vries\" , \"Magnussen\" , \"Norris\" , \"Piastri\" , \"Sargeant\" ] } } Et avec tout ca. L'OCR peut d\u00e9marrer dans de bonnes conditions OCR Maintenant que on a des images qui arrivent automatiquement et que l'on sait ou se trouvent les informations sur ces dites images, je vais parler de la seconde partie du projet qui parle du processus de reconnaissance de data sur une image du feed DATA de la F1TV. C'est je pense la partie qui a demand\u00e9 le plus tests et de refactor. Toute la partie OCR a \u00e9t\u00e9 d\u00e9velopp\u00e9e dans un projet \u00e0 part avant d'\u00eatre int\u00e9gr\u00e9e dans le projet final. Il faut savoir que la reconnaissance est diff\u00e9rente celon ce que l'on cherche. Je vais donc d\u00e9composer cette partie du document en sous rubriques selon les donn\u00e9es recherch\u00e9es. Mais avant ca je dois expliquer certains concepts qui seront importants. Fonctionnement g\u00e9n\u00e9ral Voici un screenshot de la page DATA de la F1TV que le programme va recevoir : \"Screen F1TV\" Si on regarde de loin on peut se dire que la structure est plut\u00f4t simple mais c'est loin d'\u00eatre le cas. On peut y voir au moins 4 zones contenant de l'information dans un format diff\u00e9rent. \"Zones principales\" Dans l'exemple ci dessus on peut voir 3 zones mais on aurait \u00e9galement pu comprendre la zone de position des pilotes autour du circuit pour faire 4. Ces 4 zones sont tr\u00e8s diff\u00e9rentes et contiennent d'autres informations. Pour ce travail de dipl\u00f4me je ne m'occupe que de la zone principale. Mais je pense que le titre et les infos de circuit ne prendrait pas tant de temps que ca \u00e0 impl\u00e9menter. J'ai utilis\u00e9 le mot \"Zone\" plus haut et ca n'est pas juste un mot utilis\u00e9 au hasard. C'est le nom de l'objet que j'utilise pour les repr\u00e9senter dans mon programme. Mais comme c'est important de bien comprendre ce concept avant de continuer je vais vous l'expliquer. ZONE : L'objet \"Zone\" parent est un objet qui est une zone d'image. Je m'explique, le but d'une zone est d'\u00eatre un morceau d'une image plus grande. Le but d'une Zone est de contenir une liste de plus petites Zones ou bien une liste de \"Window\" (j'explique ce que c'est juste apr\u00e8s). Elle contient la portion d'image qui la concerne et ses propres dimensions. Le parent zone ne pr\u00e9voit que de pouvoir ajouter ou supprimer des \u00e9l\u00e9ments des listes de zones ou de windows ainsi qu'une methode qui permet d'aller chercher toutes informations des livres qu'elle contient. L'int\u00e9r\u00eat d'une zone est de pouvoir compartimenter une image dans des parties int\u00e9ressantes au niveau de la reconnaissance mais pas de traiter d'information. WINDOW : L'objet \"Window\" est un objet qui peut ressembler beaucoup \u00e0 l'objet \"Zone\". En effet elle aussi est une partie d'une image plus grande et contient ses dimensions, mais elle se distingue en deux points importants. Elle ne contient pas d'autres Zones ou Windows Elle peut retourner les informations \u00e9crites sur son image. Toutes les Window qui h\u00e9ritent du parent Window peuvent impl\u00e9menter une methode qui permet de renvoyer ce qui peut \u00eatre d\u00e9cod\u00e9 sur son image. Les enfants peuvent aussi aller piocher dans les nombresues methodes de r\u00e9cup\u00e8ration de donn\u00e9es contenues dans le parent Window. Mieux vaut r\u00e9utiliser le plus possible que de r\u00e9inventer la roue pour chaque Window. Une analogie un peu bancale pourrait se pr\u00e9senter comme la suivante : La zone est une armoire ou une bibliot\u00e8que. Si c'est une zone qui contient d'autres zones c'est une bibliot\u00e8que et chacune de ces sous-zones sont des armoires. Leur unique but est de contenir de mani\u00e8re ordonn\u00e9e des objets qui eux contiennent de l'information. Les livres ici sont les Windows. Ils contiennet de l'information et sont stock\u00e9s dans des armoires et on y acc\u00e8de en allant dans la bonne bibliot\u00e8que et en allant dans la bonne armoire. Derni\u00e8res choses pour comprendre le diagramme: Il existe une Main Zone qui est une des 4 grandes zones dont je parlais dans la d\u00e9composition de l'image. Il existe aussi des \"Driver Zone\" qui sont de plus petites zones contenues dans la Main Zone qui et qui ne contiennent que les informations d'un pilote. L'objet Window n'est quasi jamais utilis\u00e9, c'est presque tout le temps des enfants de Window plus sp\u00e9cifiques qui sont utilis\u00e9s, le but est que chaque type d'information sur l'image aie son type de window. Voila donc un petit diagramme qui montre le d\u00e9coupage du programme : \"Diagramme explicatif de l'architecture des zones\" Pour visualiser encore un peu mieux comment ce d\u00e9coupage prend forme voici ce que chaque zone et Window contient. Main Zone : \"Exemple zone principale\" Driver Zone : \"Exemple zone de pilote\" Driver Position Window : \"Exemple de fen\u00eatre de position\" Driver name Window : \"Exemple de fen\u00eatre de nom\" Driver LapTime Window : \"Exemple de fen\u00eatre de temps au tour\" Driver Tyre Window : \"Exemple de fen\u00eatre pneus\" Il existe d'autres types de Window mais ce sont les principaux. On se rend assez facilement compte que chacunes de ces windows va avoir besoin d'un traitement sp\u00e9cifique car la mani\u00e8re de reconnaitre le pneu utilis\u00e9 et le temps au tour ne peut pas \u00eatre la m\u00eame. Pour r\u00e9sumer, on a un programme qui prend en entr\u00e9e un fichier de configuration, qui prend des images de la F1TV et les d\u00e9coupe dans des ZONES qui elles m\u00eame sont d\u00e9coup\u00e9es en WINDOWS pour qu'on puisse plus facilement les d\u00e9coder. Maintenant qu'on a une liste de diff\u00e9rent types de zones on peut commencer \u00e0 chercher ce qu'il y a marqu\u00e9 dessus. Pour cela il faut dabord comprendre un petit peu comment l'OCR fonctionne et comment des libraries comme Tesseract fonctionnent pour donner du texte en partant d'une image. Pour faire tr\u00e8s simple, nous avons un mod\u00e8le qui est entrain\u00e9. C'est \u00e0 dire que on donne \u00e0 un programme un tr\u00e8s grand nombre de mots ou de lettres en lui disant ce que contiennent chaques images. Ensuite le programme va cr\u00e9er des matrices de convolutions pour chaque lettre avec comme objectif de detecter les points communs entre les lettres pour cr\u00e9er un alpphabet. Par exemple la matric de la lettre 'H' donnerait un poids important \u00e0 des lignes verticales connect\u00e9es par une ligne centrale. Et si on fournis assez de donn\u00e9es de bonne qualit\u00e9 au mod\u00e8le, les matrices peuvent \u00eatre tr\u00e8s efficace \u00e0 detecter si une lettre est un H ou un M. Il y a pleins d'autres methodes comme l'utilisation d'un dictionnaire de mots de la langue pour permettre la reconnaissance de mots m\u00eame si une lettre au milieu n'est pas comprise ou en ajoutant d'autres informations sur le contexte mais ca ne nous int\u00e9resse pas ici. C'est important de comprendre comment cette reconnaissance de caract\u00e8res avec des matrices fonctionne car cela va nous aider \u00e0 pr\u00e9parer nos donn\u00e9es pour lui rendre la vie facile et augmenter la pr\u00e9cision de nos r\u00e9sultats. Filtres et traitement On peut essayer de donner toutes nos images directement \u00e0 Tesseract pour qu'il reconnaisse tout le texte qu'il y voit mais on risque de se retrouver avec des r\u00e9sultats au mieux inconsistents. Dans notre cas, le soucis est que les chiffres et lettres sont beaucoup trop petits. Ils ne font parfoisd que 10 pixels de haut et cela fait que il n'est pas forc\u00e9ment facile de toujours les diff\u00e9rencier. De plus, comme ils sont petits, les art\u00e9facts d'aliasing sont assez violents et peuvent grandement d\u00e9former une lettre ou un chiffre. Exemple : Prenons le chiffre 9. Dans l'image il peut \u00eatre repr\u00e9sent\u00e9 de cette mani\u00e8re : \"Exemple de chiffre avant post traitement\" On peut voir qu'il est flou, pour nous cela ne pose pas de probl\u00e8me et je pense que \u00e0 peu pr\u00e8s nimporte qui peut dire que c'est un 9. Cependant comme les contours sont flous et m\u00eame si on essaie de retirer le background : \"9 avec anti aliasing\" On voit que le 9 n'est pas clairement d\u00e9finit. En effet on pourrait le comprendre comme : \"Premier exemple de contours\" Ou comme : \"Second exemple de contours\" Voire m\u00eame simplement comme : \"Exemple de coutour g\u00e9n\u00e9reux\" Et on se rend bien compte que les performances de detection ne sont pas les m\u00eames dans ces trois cas. Il faut donc faire un certain post traitement des images pour supprimer les \u00e9l\u00e9ments parasites, les couleurs, et augmenter la visibilit\u00e9 des contours importants. Mais chaque type de donn\u00e9e va avoir des methodes de post traitement diff\u00e9rents. Donc voici les diff\u00e9rents types de reconnaissance et leur post traitements : Texte Alors ce type de reconnaissance est utilis\u00e9 par la WINDOW du nom de pilote et de la position du pilote. C'est je pense la plus simple de toutes car Tesseract est particuli\u00e8rement bien entrain\u00e9 pour. Cette reconnaissance concerne donc des lettres qui font des mots ou des noms. Voici un exemple de la WINDOW nom de pilote en entr\u00e9e : \"Exemple texte cru\" Ce texte peut paraitre bon, cependant quand on le lance dans Tesseract, il ne va pas toujours donner un r\u00e9sultat parfait. Il faut aussi savoir qu'il y a des noms pas mal plus p\u00e9nibles que Tesseract a plus de mal \u00e0 reconnaitres, soit \u00e0 cause des lettres utilis\u00e9es, soit car le nom est un nom d'une autre r\u00e9gion et qui ne veut rien dire en anglais ce qui emp\u00eache l'utilisation de dictionnaire (Ex : Tsunoda est un nom japonais et parfois il est difficile pour Tesseract de le reconnaitre car si une lettre pose probl\u00eame il ne peut pas trouver de contexte qui puisse l'aider). Donc pour le rendre plus facilement lisible et augmenter les chances que toutes les lettres soient d\u00e9couvertes, voici les \u00e9tapes que j'ai mis en place. 1 : J'inverse les couleurs. Je me suis rendu compte que il \u00e9tait souvent plus facile de trouver un noir sur blanc que blanc sur noir. Je ne suis pas sur que cette \u00e9tape soit capitale cependant. \"Texte invers\u00e9\" 2 : Je fais un Treshhold de 165 car avec moins le texte parfois prend trop du background et avec plus les lettres sont trop fines. \"Texte apr\u00e8s Treshold\" 3 : Je fais un Resize de l'image pour avoir une meilleure r\u00e9solution et permettre une meilleure d\u00e9tection. J'augmente la hauteur et la largeur par un facteur 2. J'ai trouv\u00e9 cette valeur suffisante et aller plus haut consomme beaucoup de ressources. \"Texte apr\u00e8s Resize\" 4: Je fais une tr\u00e8s rapide Dilatation du texte pour retirer le flou amen\u00e9 par la methode de Resize. Je n'utilise qu'une valeur de 1 car je ne veux pas trop changer comment le texte est model\u00e9 je veux juste retirer le flou. \"Texte apr\u00e8s Dilatation\" Explication des methodes pr\u00e9cises plus bas Voila pour ce qui est du post processing. Je ne dis pas que ce sont les meilleurs param\u00eatres possibles mais dans mes tests ce sont ceux qui ont le mieux march\u00e9s. C'est aussi les premi\u00e8res methodes que j'ai pu d\u00e9velopper alors forc\u00e9ment elles n'ont pas le niveau de d\u00e9tails de certaines autres. Mais comme m\u00eame avec ce traitement il n'est pas rare que je me retrouve avec une ou deux lettres pas justes, il faut un moyen d'\u00eatre s\u00fbr que c'est le bon nom qui est trouv\u00e9. Ce qu'il y a de pratique avec les noms de pilotes c'est que on sait d\u00e9ja comment ils s'appellent avant le Grand Prix. En effet dans le fichier de configuration de la reconnaissance, il y a une liste de noms de pilotes. Cela veut dire que au lieu de chercher \u00e0 trouver parfaitement les bonnes lettres, on peut simplement essayer de trouver quel nom de pilote ressemble le plus au nom trouv\u00e9 sur l'image. Pour ce faire j'ai utilis\u00e9 une methode appel\u00e9e la distance de Levenshtein. Pour faire simple c'est une methode qui va calculer les distances de lettres pour determiner entre des strings laquelle ressemble le plus \u00e0 une autre. Pour r\u00e9sumer le fonctionnement dans lordre : On prend l'image on la traite On envoie l'image trait\u00e9e \u00e0 Tesseract On trouve quel nom de pilote ressemble le plus \u00e0 ce r\u00e9sultat On renvoie le nom du pilote Chiffres Cette methode en r\u00e9alit\u00e9 utilise simplement la m\u00eame methode que celle qui va r\u00e9cup\u00e8rer le texte sur une image. Cependant, la, on envoie \u00e0 Tesseract l'information qu'il ne peut trouver que des chiffres sur l'image ce qui lui permet d'\u00eatre beaucoup plus pr\u00e9cis et de ne pas confondre un 9 avec un P ou un 11 avec un H PAR EXEMPLE (non pas que ca me soit arriv\u00e9 tr\u00e8s r\u00e9guli\u00e8rement et que ca me soit rest\u00e9 dans la gorge \u00e9videmment) L'avantage c'est que cette methode ne demande m\u00eame pas de traitement de la donn\u00e9e en sortie de Tesseract. On \u00e9sp\u00e8re simplement que le post traitement aura suffit. TEMPS : Cette methode regroupe la d\u00e9tection de temps au tour. Il y a trois grands types de WINDOW qui sont concern\u00e9es : La WINDOW du temps au tour La WINDOW du retard sur le leader La WINDOW des secteurs La grande diff\u00e9rence ce sont les ordres de grandeur. Les temps au tour sont en g\u00e9n\u00e9ral entre 50 secondes et 2 minutes. Tandis que les secteurs sont entre 20 et 30 secondes alors que le retard sur le leader peut-\u00eatre de plusieurs minutes. Cependant, tous ces temps poss\u00e8dent le m\u00eame type de post-traitement avant d'\u00eatre envoy\u00e9s \u00e0 Tesseract. Voici un exemple de temps au tour avant toute transformation : \"Temps au tour avant traitement\" On peut avoir l'impression que ce texte est tout \u00e0 fait lisible et facile \u00e0 d\u00e9coder surtout quand on le voit de loin comme ca. Cependant, il faut imaginer que ces chiffres font 13 pixels de haut en comptant le flou et comme expliqu\u00e9 plus haut ce flou dans ces echelles est terrible. \"Temps au tour zoom\u00e9\" Si on donne cette image \u00e0 Tesseract, les '3' deviennent des '9', des '9' deviennent des '8', des '2' deviennent eux aussi des '9', le tout parfois inversement et de mani\u00e8re compl\u00eatement impr\u00e9visible. Ca n'est simplement pas utilisable. Cette partie est un peu plus complexe car si la detection n'est pas fiable les chiffres sont simplement inutilisables. Si \u00e0 tout moment un temps au tour de 1:39.106 devient 1:32.108 c'est juste pas possible. Voici donc les \u00e9tapes de post-traitement que j'ai mis en place pour leur d\u00e9tection : 1: J'applique un Treshold de 185 pour enlever les ambiguit\u00e9s d'alisaising et avoir une image en noir et blanc claire. La valeur de 185 est assez \u00e9lev\u00e9e car le but est de vraiment garder uniquement les contours. Comme les chiffres se ressemlent beaucoup plu que les lettres, il faut tenter le plus possible de conserver leur formes sp\u00e9cifiques. Je me suis rendu compte que cette valeur \u00e9tait une de celles qui marchent le mieux. \"Temps au tour apr\u00e8s Treshold\" 2: J'applique un Resize de 2 pour augmenter la r\u00e9solution des chiffres et permettre une meilleure d\u00e9tection. Le but est d'avoir plus de pixels et donc de permettre \u00e0 Tesseract de mieux utiliser ses matrices de convolution. \"Temps au tour apr\u00e8s Resize\" 3: Comme le Resize am\u00e8ne du flou, j'utilise une methode de Dilatation qui me permet de retirer ce flou et de remplir un peu plus certaines parties qui ont \u00e9t\u00e9 un peu laiss\u00e9e par le Resize ; \"Temps au tour apr\u00e8s Dilatation\" 4: Contrairement aux mots plus haut, la rondeur ajout\u00e9e par la dilatation n'est pas vraiment d\u00e9sir\u00e9e. En effet, elle peut rendre confuse certains chiffres et emp\u00eacher Tesseract de bien trouver le chiffre. Alors j'applique une Erosion qui me permet de contrecarrer en partie les rondeurs ajout\u00e9es par la dilatation et retrouver des chiffres bien form\u00e9es. Pour l' Erosion et la Dilatation j'ai utilis\u00e9 une valeur de 1 car je ne voulais pas trop changer les chiffres. \"Temps au tour apr\u00e8s Erosion\" Explication des methodes pr\u00e9cises plus bas Et avec ce post processing on retrouve de plut\u00f4ts bon r\u00e9sultats qui demandent peu de traitement. Le traitement d\u00e9pend du type de WINDOW cependant. Pour les secteurs on indique \u00e0 Tesseract que les caract\u00e8res autoris\u00e9s sont : \"0123456789.\" Pour les temps au tour on autorise plut\u00f4t \"0123456789.:\" Et pour les \u00e9carts on autorise \"0123456789.+\" Ensuite on r\u00e9cup\u00e8re une liste de chiffres qui'il va falloir transformer en milisecondes pour faciliter le stockage et l'envoi. Le programme nettoie un peu la chaine avant de la convertir. Par exemple parfois le ':' de 1:34.456 est compris comme un '1' ou un '2' et il faut faire attention \u00e0 detecter quand ca arriver. Je passe les d\u00e9tails du reste du nettoyage car c'est vraiment du cas par cas mais quand on a finit de nettoyer la chaine on peut transformer les chaines de minutes secondes et milisecondes en un total de milisecondes. Pour r\u00e9sumer le fonctionnement dans l'ordre : On prend l'image et on lui applique une s\u00e9rie de filtres On envoie l'image filtr\u00e9e \u00e0 Tesseract On nettoie le r\u00e9sultat Tesseract pour compenser certains biais On convertis le r\u00e9sultat en milisecondes les chiffres (2) Il faut savoir que avec la derni\u00e8re version de l'\u00e9mulateur (dont je vais parler un peu plus tard) Pneus La on arrive sur la partie la plus p\u00e9nible. Pour comprendre la probl\u00e9matique il faut d'abord faire un petit point sur comment les pneus fonctionnent en Formule 1. Depuis 2019 en Formule 1 nous avons 5 grandes familles de pneus : Les pneus tendres Les pneus medium Les pneus durs Les pneus interm\u00e9diaires Les pneus pluie \"Gamme de pneus Pirelli\" Les trois premiers pneus sont des pneus faits pour piste s\u00e8che, le pneu interm\u00e9diaire pour piste humide et le neu pluie pour la pluie. Chaque pneu a sa dur\u00e9e de vie et son niveau de performance propre mais je ne vais pas rentrer dans le d\u00e9tail ici. Tout ce qu'il faut savoir ce que savoir sur quel pneu chaque pilote est et depuis combien de temps il les chausse est une information tr\u00e8s importante. Chaque pneu a une couleur donn\u00e9e qui permet de les diff\u00e9rencier. Voici un exemple de ce \u00e0 quoi une WINDOW de pneus peut ressembler : \"Exemple zone pneus 1\" Mais cette zone peut aussi ressembler \u00e0 ca : \"Exemple zone pneus 2\" Mais aussi \u00e0 ca : \"Exemple zone pneus 3\" Voire m\u00eame ca : \"Exemple zone pneus 4\" Je pense que vous pouvez tout de suite comprendre la difficult\u00e9 que repr\u00e9sente la t\u00e2che de r\u00e9cup\u00e8ration de donn\u00e9es \u00e0 partir de cette image. En gros le fonctionnement de cette zone d'information est assez simple. Au fur et \u00e0 mesure que la course avance, le trait fait de m\u00eame. Le chiffre dans le round tout \u00e0 droite indique le nombre de tour que le pilote a pass\u00e9 sur ce pneu. La couleur indique le type de pneu. Si il y a une lettre \u00e0 la place d'un chiffre c'est que c'est le premier tour sur ce pneu. La lettre indique le type de pneu. Et pas besoin de dire que si on essaie simplement de donner l'image \u00e0 Tesseract on ne r\u00e9cup\u00e8re ni les chiffres ni les lettres correctement si ce n'est pas du tout. Il faut donc utiliser une methode qui permette d'isoler le rond le plus \u00e0 droite, lui appliquer un traitement qui permette \u00e0 Tesseract de lire ce qu'il y a marqu\u00e9 et qui puisse determiner quel pneu est en train d'\u00eatre utilis\u00e9. J'ai d\u00e9cid\u00e9 de m'occuper dans un premier temps de trouver ce rond avant d'appliquer les filtres car plus l'image est petite plus les filtres sont rapides. Le programme va tirer un trait depuis le bord droit de la zone, et il va avancer vers la gauche jusqu'\u00e0 trouver un obstacle. Je d\u00e9tecte un obstacle si le pixel sur lequel est mon trait poss\u00e8de une valeur de plus de 0x50 dans le channel R,G ou B. J'ai trouv\u00e9 en faisant des tests que les couleurs de background de la F1TV ne d\u00e9passaient jamais ces valeurs. Ensuite apr\u00e8s avoir trouv\u00e9 le premier obstacle, je r\u00e9cup\u00e8re une zone qui doit englober le cercle. Voici un exemple avec cette image en entr\u00e9e : \"Zone compl\u00eate\" Elle est automatiquement coup\u00e9e de cette facon : \"Zone coup\u00e9e automatiquement\" Cela me permet d'isoler uniquement ce qui m'int\u00e9resse ce qui est tr\u00e8s pratique pour Tesseract et pour la detection de couleur. Ensuite avec cette image je peux commencer le processus de reconnaissance. Je commence par faire une moyenne de tous les pixels de l'image en excluant les pixels trop sombres qui font s\u00fbrement partie du background ou du chiffre. Ensuite j'utilise une methode qui calcule la diff\u00e9rence entre la couleur obbtenue et la liste de couleurs possible. Il y a cinq couleurs des pneus possibles : \"#ff0000\" pneu tendre/soft \"Couleur d'un pneu tendre\" \"#f5bf00\" pneu medium \"Couleur d'un pneu medium\" \"#a4a5a8\" pneu dur/hard \"Couleur d'un pneu dur\" \"#00a42e\" pneu inter \"Couleur d'un pneu interm\u00e9diaire\" \"#2760a6\" pneu pluie/wet \"Couleur d'un pneu pluie\" Ce qui est pratique c'est que m\u00eame dans les cas ou il n'y a pas beaucoup de couleur comme celui la : \"Pneu dur avec 0 tours\" On arrive \u00e0 une couleur moyenne de : \"Couleur moyenne de l'image ci dessus apr\u00e8s soustraction du background\" Et il est donc assez facile de determiner le type de pneu en question. Attention, les r\u00e9sultats peuvent \u00eatre tr\u00e8s vite d\u00e9rang\u00e9s par la couleur du pneu pr\u00e9c\u00e9dent si le d\u00e9coupage de la fen\u00eatre n'a pas \u00e9t\u00e9 assez pr\u00e9cis. Ensuite il \"suffit\" de lire le chiffre dans le rond et si on arrive pas \u00e0 le lire alors c'est que c'est une lettre et on sait que le nombre de tours est donc de 0. Maintenant vient le moment tr\u00e8s sympatique de la lecture du chiffre. Vous saurez que Tesseract en plus de detester les grandes images et les images avec des couleurs, deteste \u00e9galement les formes dans une image. Donc dans notre cas, le round de couleur autour du chiffre, m\u00eame si il n'est pas complet, il interf\u00e8re avec la reconnaissance et emp\u00eache de bien lire le chiffre. Il faut donc retirer le background et ensuite la couleur. Sauf que comme le chiffre est de la couleur du background, si on retire le background et ensuite la couleur il ne reste plus rien. Il faut donc retirer le background AUTOUR du rond, et ensuite si on retire la couleur il devrait rester le chiffre sur fond blanc. Pour se faire, j'ai tir\u00e9 des traits depuis les bords de l'image jusqu'\u00e0 ce qu'ils rencontrent le rond. Ensuite je retire tous les pixels entre le rond et les bords de l'image ce qui nous donne ceci : \"Zone pneu avec le background en moins\" Ensuite on peu retirer les pixels qui ont une valeur dans un channel RGB plus haute qu'un certain seuil : \"Zone avec le reste des couleurs supprimm\u00e9es\" Et la on a ce que l'on veut ! A partir de la c'est les filtres que l'on connait qui sont utilis\u00e9s pour en faire une image plus facile \u00e0 utiliser par Tesseract. 1 : On effectue un Resize de facteur 4 (oui c'est beaucoup mais en m\u00eame temps le chiffre est vraiment petit \u00e0 la base) qui permet d'avoir une image d'une bien meilleure r\u00e9solution. \"Filtre 1\" 2: On fait une Dilatation de facteur 1 pour retirer tout le flou de l'image pour aider Tesseract \"Resultat\" Et on a un chiffre qui est utilisable par Tesseract ! Explication des methodes pr\u00e9cises plus bas Pour r\u00e9sumer : On prend l'image de la zone et on la crop pour ne garder que la partie essentielle On d\u00e9termine le type de pneu avec la couleur moyenne de la zone On retire le background autour de cette zone On retire la couleur qui reste pour ne garder que le chiffre On augmente la r\u00e9solution du chiffre On rend ce chiffre net On envoie l'image trait\u00e9e et filtr\u00e9e \u00e0 Tesseract On d\u00e9termine le nombre de tours que le pilote a fait avec ses pneus avec le r\u00e9sultat de Tesseract DRS Bon ca c'\u00e9tait plut\u00f4t simple j'ai simplement v\u00e9rifi\u00e9 si la moyenne de vert d\u00e9passait une certaine valeur et puis voila. Filtres et methodes sur les images Dans ce projet on a du utiliser diff\u00e9rentes methodes d'\u00e9dition d'image que ce soit sous forme de filtres ou de modification de l'image directement. Voici un sommaire des methodes utilis\u00e9es et comment elles fonctionnent. Tresholding Cette methode sert \u00e0 passer d'une image en couleurs \u00e0 une image binaire noir blanc. C'est une \u00e9tape tr\u00e8s importante pour l'OCR car elle permet (si bien faite) d'isoler du texte de son background. Un exemple ici : \"Exemple treshold\" Le fonctionnement est assez simple mais il peut \u00eatre fait de diff\u00e9rentes mani\u00e8res mais dans mon cas voici comment l'algorythme fonctionne sachant qu'il demande en entr\u00e9e la Bitmap que l'on veut modifier ainsi que la valeur de Treshold : On parcours chaque pixel de l'image On convertir la couleur du pixel en une valeur de gris pour avoir la m\u00eame valeur en R,G et B (Formule utilis\u00e9e : grey = R x 0.3 + G x 0.59 + B x 0.11) Si le r\u00e9sultat de la valeur de gris est au dessus de la valeur de treshold, le pixel est pass\u00e9 en blanc complet et dans le cas contraire il est pass\u00e9 en noir complet On retourne la Bitmap modifi\u00e9e Un algorythme pas forc\u00e9ment complexe mais qui peut augmenter de mani\u00e8re titanesque les chances de r\u00e9ussir une OCR Resize Cette methode sert \u00e0 augmenter la r\u00e9solution d'une image pour am\u00e9liorer la pr\u00e9cision de l'algorythme de Tesseract. En effet, avec trop peu de pixels, la matrice de convolution n'est pas toujours aussi efficace. Il ne faut pas confondre cette methode d'augmentation de la taille avec une simple interpolation. En effet une augmentation de taille interpol\u00e9e ne vas pas vraiment changer la r\u00e9solution, l'image sera toujours aussi pixelis\u00e9e, seulement, les pixels seront compos\u00e9es de plus de pixels comme dans l'exemple ci dessous : \"Exemple d'interpolation lin\u00e9aire\" Dans mon projet j'utilise de l'interpolation bicubique qui va cr\u00e9er de l'information pour tenter de combler le vide et produire une image r\u00e9ellement plus grande et avec plus de details mais en ajoutant du flou. \"Exemple des diff\u00e9rents types d'interpolation\" Le but est d'aller chercher dans les pixels alentours les couleurs qui sont d\u00e9ja pr\u00e9sente et de jouer avec des poids pour tenter de faire une pr\u00e9diction de ce que ce pixel aurait \u00e9t\u00e9 si l'image avait plus de detail. Voici un exemple assez parlant : \"Exemple interpolation bicubique (avant)\" \"Exemple interpolation bicubique (apr\u00e8s)\" On pourrait croire que c'est inutile mais dans le contexte de Tesseract ajouter des d\u00e9tails pour tenter de simuler une meilleure r\u00e9solution m\u00eame en cr\u00e9ant du flou est int\u00e9ressant pour mieux remplir la matrice de convolution. Mais il est possible de r\u00e9duire ce flou avec d'autres m\u00e9thodes \u00e9galement. (Dans mon code je n'ai pas utilis\u00e9 du code fait main mais j'utilise une librairie qui me permet de le faire) Il faut simplement faire attention car c'est un proc\u00e9d\u00e9 assez lourd en performances. Dilatation et Erosion Cette methode et la suivante font partie des methodes de transformation morphologiques. Ces methodes sont utilis\u00e9es pour accentuer les formes et les epaissir ou les r\u00e9duire et les affiner. Elles poss\u00e8dent l'aventage \u00e9galement de retirer le flou d'une image ce qui est tr\u00e8s pratique si utilis\u00e9 apr\u00e8s l'utilisation de methodes comme Resize . Je ne vais pas trop rentrer dans les d\u00e9tails de ces methodes car leur fonctionnement est un peu plus lourd en math si on veut faire une v\u00e9ritable explication du pourquoi et du comment ca marche aussi bien. Pour notre projet je dirais que l'important est de savoir que ce sont deux outils tr\u00e8s pratiques pour changer la morphologie des lettres et des chiffres et qu'on peut les utiliser pour corriger du flou et/ou des art\u00e9facts apparus lors de la binarisation de l'image ou de la suppression de fond. Remove Background Cette methode est assez simple et est juste une methode qui va passer en revue tous les pixels de l'image et si la couleur d'un pixel s'apparente \u00e0 celle d'un pixel de fond il est pass\u00e9 en noir total ou en blanc total. Le but est de permettre au reste du programme de fonctionner avec des couleurs moins ambigues. Une variante sp\u00e9cialis\u00e9e pour la reconnaissance des pneus appel\u00e9e affectueusement Remove Useless cherche \u00e0 atteindre le m\u00eame bu mais est bien plus soffistiqu\u00e9e et sp\u00e9cialis\u00e9e pour retirer le background autour d'un cercle de couleur pour ensuite retirer la couleur et qu'il ne reste qu'un chiffre. Pour plus de details voir la detection de pneus. Il y aussi d'autre methodes comme un filtre Gaussien ou Highlight countour que j'ai du d\u00e9velopper mais que je n'ai pas utilis\u00e9 donc je ne vais pas en parler ici. Petit point r\u00e9solution Comme on peut l'imaginer la r\u00e9solution est extr\u00eamement importante pour l'OCR. Et en avancant sur le projet de l'\u00e9mulateur je me suis rendu compte qu'il \u00e9tait possible de r\u00e9cup\u00e8rer des images en 4K (Plut\u00f4t 1080 avec l'upscaling du lecteur). Cela est une superbe nouvelle car cela permet de simplifier \u00e9norm\u00e9ment le processing sur les diff\u00e9rentes windows. Quelques exemples pour se faire une id\u00e9e \"Echantillon 720P\" ; \"Echantillon 1080P\" \"Echantillon 4K\" Mais il faut savoir que gr\u00e2ce \u00e0 cette simplification j'ai pu aussi cr\u00e9er d'autres methodes de filtrage pour certaines parties. Mais la simplification \u00e9tait obligatoire car avec des images aussi grande il n'\u00e9tait simplement pas possible de venir appliquer les m\u00eames filtres car le temps de traitement serait beaucoup plus long. J'indique ces changements que apr\u00e8s l'explication d'avant car ce sont des changements un peu de derni\u00e8re minute et que la logique expliqu\u00e9e plus haut a \u00e9t\u00e9 tr\u00e8s importante pour le projet OCR m\u00eame si tout n'est plus forc\u00e9ment utilis\u00e9 maintenant que j'ai des images de meilleure qualit\u00e9. Dans la version actuellement disponible la reconnaissance a \u00e9t\u00e9 simplifi\u00e9e sous cette forme : Le \"GapToLeader\" est d\u00e9cod\u00e9 avec un premier passage de Tresholding \u00e0 165 puis un Resize de 2 et une Dilatation de 1 pour retirer le flou Les \"Sectors\" sont d\u00e9cod\u00e9s en utilisant une toute nouvelle methode VanishOxyAction \u00e0 cause des couleurs parfois appliqu\u00e9es et ensuite simplement une methode de Tresholding de 150 pour rendre le r\u00e9sultat assez propre pour l'OCR. Le \"LapTime\" est dabord pass\u00e9 par un Tresholding tr\u00e8s strict de 185 pour pr\u00e9parer la SobelEdgeDetection qui est \u00e9galement une nouvelle methode qu'il a \u00e9t\u00e9 possible d'utiliser gr\u00e2ce \u00e0 la simplification du reste des processus. Le \"Text\" est d\u00e9cod\u00e9 simplement avec un tresholding de 165 maintenant gr\u00e2ce \u00e0 l'image 4K. Les pneus ont leur propre traitement comme expliqu\u00e9 plus haut auquel on ajoute la Dilatation de 1. Comme on peut le voir le traitement est pas mal plus simple mais cela ne veut pas dire que les autres methodes que je n'utilise plus ne sont pas utiles. La reconnaissance n'est pas encore parfaite et je pense que leur utilisation pourrait aider \u00e0 am\u00e9liorer les r\u00e9sultats. (Et parfois ces anciennes methodes sont utiles dans les traitements personnalis\u00e9s des windows elle m\u00eames comme par exemple les pneus qui utilisent la methode GrayScale pour isoler les couleurs) VanishOxyAction Cette methode est une methode plut\u00f4t simple mais qui est importante. Elle se base beaucoup sur le code de la methode Grayscale et sur la methode Tresholding car elle essaie de regrouper le meilleur des deux en r\u00e8glant quelques soucis que ces derni\u00e8res cr\u00e9\u00e9ent. Le soucis avec la methode grayscale c'est que quand le texte est de couleur (Ce qui arrive souvent pour les temps de secteurs) la methode GrayScale rend les couleurs dans une nuance de gris un peu trop sombre ce qui fait que ensuite la methode de Tresholding d\u00e9fonce tout. \"Exemple de secteur en couleur\" \"Exemple de secteur en grayscale\" L'id\u00e9e est alors de prendre pour chaque pixel et de garder uniquement la valeur de R,G ou B la plus haute et de mettre les deux autres canaux au m\u00eame niveau pour avoir une image blanchie qui puisse \u00eatre ensuite utilis\u00e9e avec la methode de Tresholding sans soucis. \"Exemple de secteur blanchi avec vanishoxyAction\" SobelEdgeDetection On pourrait se dire que avec ce genre de methode le tresholding est inutile ensuite mais ca n'est pas le cas car le tresholding sert ensuite pour rendre les contours plus ou moins aggressif. Car m\u00eame si l'image ressemble \u00e0 une image binaris\u00e9e, il reste des nuances que le treshold va pouvoir utiliser. SobelEdgeDetection Cette methode est une methode assez classique que je n'ai pas design\u00e9 moi m\u00eame alors je ne vais pas trop m'\u00e9pancher dessus. En gros on utilise une matrice et une formule math\u00e9matique pour redessiner une image et le r\u00e9sultat est une image avec des contours. Je ne l'ai utilis\u00e9 que pour les temps au tour car ce sont les plus r\u00e9calcitrants. Cette methode a besoin d'une image pass\u00e9e en noir et blanc au pr\u00e9alable \u00e0 laquelle on applique ensuite les matrrices de filtres. Et avec ces filtres ajout\u00e9s \u00e0 l'image on peut ensuite calculer le \"Gradient\" pour cr\u00e9er les bords. Le seul soucis de cette methode c'est qu'elle est assez gourmande et qu'elle fournit des formes creuses d\u00fb \u00e0 la nature des matrices donn\u00e9es. Voici un exemple de ce dont cette m\u00e9thode est capable : Artefacts de la detection de bords de Sobel Apparemment l'OCR aime assez bien cette methode et elle permet de beaucoup moins souvent oublier les '.' ou ':' Traitement des donn\u00e9es C'est bien gentil de recevoir des r\u00e9sultats de l'OCR, cependant on ne peut pas souvent les utiliser comme tels. En effet les resultats ne sont pas tr\u00e8s constants et demandent d'\u00eatre verifi\u00e9s pour savoir si ils doivent \u00eatre pris en compte. Le post traitement de ces donn\u00e9es d\u00e9pend compl\u00eatement du contexte et donc il est diff\u00e9rent pour chque type de window. Voici un floril\u00e8ge des diff\u00e9rents types de traitements : Traitement du nom de pilote Rien de plus que ce qui est d\u00e9ja d\u00e9taill\u00e9 dans la partie OCR Traitement des pneus Pareil Traitement des temps La par contre c'est int\u00e9ressant. Dans un monde parfait je pourrais simplement prendre les r\u00e9sultats de l'OCR et les traiter directement. Mais comme nous vivons dans un monde ou la souffrance et la douleur sont les seules choses autoris\u00e9es on ne peut pas. Le probl\u00e8me vient du fait que les temps que l'on peut trouver sur la F1TV sont encod\u00e9s avec des '.' et des ':' qui determinent les limites entre les chiffres qui d\u00e9signent les minutes, les secondes et les milisecondes. Et le soucis avec ces s\u00e9parateurs c'est qu'ils aiment bien mettre le chaos dans la reconnaissance. Quand ils ne sont pas compris comme des autres chiffres ils sont parfois simplement oubli\u00e9s ou pris en double c'est un enfer. Il faut donc trouver un moyen de detecter quand cela arrive. Et je n'ai pas trouv\u00e9 de meilleur moyen que de faire du cas par cas. Cela peut para\u00eetre simple quand on parle par exemple des secteurs. On sasit que on attend deux chiffres avant un '.' et trois chiffres apr\u00e8s. Il est donc facile de voir que si je trouve six chiffres et pas de s\u00e9paration le troisi\u00e8me est le s\u00e9parateur mal compris. Mais l'exemple qui d\u00e9truit vraiment tout c'est les \u00e9carts avec le leader. Autant un temps au tour c'est toujours x:xx.xxx et un temps de secteur c'est xx.xxx. Mais un \u00e9cart avec le leader ca peut \u00eatre 0.345 comme 1:12.345. Ce qui fait que quand je 121345 est-ce que c'est 12.345 ou 1:21.345...? Souvent on peut quand m\u00eame d\u00e9duire mais cela demande de pr\u00e9voir presque tous les cas limites ce qui est assez p\u00e9nible. On pourrait se dire qu'il suffit de voir si la valeur est trop en dehors des normes. Le soucis c'est que il n'est pas impossible que un temps au tour ou un \u00e9cart prenne d'un coup une grosse diff\u00e9rence. Cela arrive m\u00eame assez souvent quand des pilotes sortent de la piste. \"Exemple temps au tour\" \"Exemple temps secteur\" Pour ce qui est du DRS et de la position des pilotes, il n'y a pas vraiment de traitement suppl\u00e9mentaire. Non pas car la detection est parfaite, mais par ce que la detection ne peut pas rater de 200 facons. Le DRS ne peut retourner que TRUE ou FALSE et la position du pilote est entre 1 et 20 compris. Le peu de nuance fait que ce sont des cas de figures qui ne demandent pas un traitement particulier au del\u00e0 de l'OCR Stockage des donn\u00e9es Dans ce projet le but n'est pas simplement de trouver les donn\u00e9es et les afficher. L'int\u00e9r\u00eat de les r\u00e9cup\u00e8rer est de pouvoir les comparer \u00e0 d'autres donn\u00e9es pr\u00e9c\u00e9dentes. Le vrai soucis de la F1TV c'est justement que l'on ne peut pas facilement voir les \u00e9volutions. On ne peut voir que des \"photos\" de la situation actuelle de la course. Il faut donc garder en m\u00e9moire les diff\u00e9rentes choses qui se sont pass\u00e9es. Techniquement on pourrait stocker ces donn\u00e9es dans de b\u00eates listes C#. Mais le soucis avec ca c'est que m\u00eame si des outils comme LinQ existent, ca n'est pas le plus pratique quand on veut faire des recherches complexes. Il faut aussi voir que si le projet dans sa forme actuelle aurait peut-\u00eatre pu se satisfaire de listes simples, le but est d'ensuite pouvoir construire sur ces bases pour faire des predictions et des insertions de stats beaucoup plus int\u00e9ressantes qui demandent de faire des requ\u00eates complexe rapidement. Je me suis dit que la meilleure methode serait d'avoir une base de donn\u00e9e dans laquelle je peux faire des requ\u00e8tes SQL. Mais commme je n'ai pas besoin de toutes les features de SQl et que je ne veut pas avoir \u00e0 g\u00e8rer un serveur de base de donn\u00e9e et tout ce qui va avec je me suis dit qu'une bonne option serait d'utiliser SQLITE. \"Logo Sqlite\" ; SQLITE est vraiment pratique car cela me permet d'avoir une DB sans avoir de serveur donc pas vraiment complexe ou quoi que ce soit mais qui conserve les aventages de rapidit\u00e9 et d'utilisation de requetes SQl. J'ai cr\u00e9\u00e9 trois tables dans cette base de donn\u00e9e SQLITE que voici : Base de donn\u00e9e Drivers Colonne Type de Data Description Tag ID INTEGER ID du pilote PRIMARY Name VARCHAR Nom du pilote NOT NULL Pitstops Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui a effectu\u00e9 le Pitstop PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL Stats Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui concern\u00e9 PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL LapTime INTEGER Temps au tour (MS) NOT NULL Sector1 INTEGER Temps du secteur 1 (MS) NOT NULL Sector2 INTEGER Temps du secteur 2 (MS) NOT NULL Sector3 INTEGER Temps du secteur 3 (MS) NOT NULL GapToLeader INTEGER Ecart avec le leader (MS) NOT NULL Position INTEGER Position pilote NOT NULL La table Drivers sert juste \u00e0 stocker les diff\u00e9rents noms de pilote pour qu'ils soient utilis\u00e9s dans le reste de la DB La table Pitstops n'est pas vraiment utilis\u00e9e dans l'\u00e9tat actuel du projet. Mais le but \u00e9tait de la remplir d\u00e8s que le programme d\u00e9tectais un arr\u00eat aux stands. Le but est ensuite de pouvoir construire un classement pond\u00e8r\u00e9 en fonction des arr\u00eats des diff\u00e9rents pilotes et d'afficher la stats tout le temps sur l'affichage principal. Elle n'est pas vraiment utilis\u00e9e car la detection de pitstop n'a pas pu \u00eatre commpl\u00eat\u00e9e. De par la nature des donn\u00e9es r\u00e9cup\u00e8r\u00e9es des pneus et des positions, c'est tr\u00e8s difficile de detecter avec prescision un arr\u00eat aux stands. La table Stats est la plus importante car elle contient toutes les informations concernant les pilotes \u00e0 chaque tour. L'id\u00e9e est qu'elle soit remplie \u00e0 chaque tour. Les infos ne sont pas scens\u00e9e \u00eatre les infos live mais plut\u00f4t juste une photo \u00e0 chaque tour de la situation de chaque pilote pour ensuite pouvoir faire des commparaisons tourspar tours. Des donn\u00e9es comme le GapToLeader peuvent \u00e9voluer pendant le tour mais on s'en fiche. Ce qui compte vraiment c'est le temps au tour et les secteurs ainsi que les pneus. Quand remplir la base ? Dans ce projet il y a deux type d'information. Les informations live qui sont stock\u00e9es dans des listes et les informations long terme qui sont stock\u00e9es dans la DB. A chaque it\u00e9ration de l'OCR, les donn\u00e9es r\u00e9cup\u00e8r\u00e9es sont stock\u00e9es dans une liste de DRIVERDATA. Les DRIVERDATA sont des structures de donn\u00e9es qui contiennent toutes les infos d'un pilote \u00e0 un instant T. Elles peuvent \u00eatre incompl\u00eates et sont juste la pour faire de petits calculs et determiner quand ins\u00e8rer des donn\u00e9es permanentes. Ce qui nous am\u00e8ne au moment int\u00e9ressant. Comment on d\u00e9termine quand il est int\u00e9ressant d'ins\u00e8rer des informations dans la base de donn\u00e9es. Il y a deux cas de figure ou on pourrait vouloir ins\u00e8rer des infos : Quand un pilote a finit un tour En effet, j'ai estim\u00e9 que les seuls moments ou on veut garder une photo de la situation du pilote c'est quand il passe d'un tour \u00e0 l'autre. Le raisonnement est le suivant : On ne veut pas conserver TOUTES les donn\u00e9es car si on prend une phot toutes les trois secondes, la majorit\u00e9 des informations seront redondantes avec les pr\u00e9c\u00e9dentes. Mais en m\u00eame temps il ne faut pas rater des changements importants de donn\u00e9es. Les seules donn\u00e9es qui changent entre deux passages de l'OCR sont les \u00e9carts entre les pilotes et de temps en temps un nouveau secteur s'affiche. Alors que d'un tour \u00e0 l'autre presque toutes les informations changent. Et on ne perd que les l\u00e9g\u00e8res fluctuations des \u00e9carts entre les pilotes. J'ai donc d\u00e9cid\u00e9 de conserver une photo par tour. Mais c'est bien joli sauf qu'il reste une difficult\u00e9 : Comment savoir qu'un pilote a fait son tour ? Cela peut para\u00eetre simple comme question mais elle est plus difficile qu'il n'y parait. Il faut savoir que en F1 un pilote peut \u00eatre dans son 26\u00e8me tour pendant qu'un autre en est \u00e0 son 24\u00e8me. Chaque pilote a sa propre course et au fur et \u00e0 mesure que les \u00e9carts se creusent il peut y avoir un tour voir plusieurs d'\u00e9cart entre la queue de course et les premiers pilotes. Ensuite il faut savoir qu'il n'est pas marqu\u00e9 sur la f1TV dans quel tour chaque pilote est. Il faut donc le d\u00e9duire en fonction des Data. Voici le code le if qui d\u00e9tecte un nouveau tour if ( DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Sector3 != 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Sector3 == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Position != - 1 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Position != - 1 ) { //Do stuff } DriverDataLogs est une liste de liste d'informations de pilotes. Chaque DriverDataLogs repr\u00e9sente les 20 photos des donn\u00e9es des pilotes. Cela veut dire que DriverDataLogs[3] repr\u00e9sente toutes les infos des pilotes dans le tour 4 et que DriverDataLogs[3][0] repr\u00e9sente toutes les infos du premier pilote dans le tour 3. Si on analyse un peu ce qui est \u00e9crit avec ces informations, on peut voir que je d\u00e9termine qu'un nouveau tour se d\u00e9finis comme une photo ou le troisi\u00e8me secteur a \u00e9t\u00e9 compl\u00eat\u00e9 et ou il ne l'\u00e9tait pas juste avant. Cela fait sens car quand un pilote compl\u00eate son troisi\u00e8me secteur c'est la que son dernier temps au tour se met \u00e0 jour. Le reste des tests est juste la pour \u00e9viter les faux positifs dans le cas ou un des deux DriverDataLogs[x][x] soit corrompu et que donc la valeur n'aie pas de sens. Cela veut dire que dans des conditions tr\u00e8s sp\u00e9cifiques je pourrais potentiellement rater un tour mais il faudrait vraiment que l'OCR me joue un vilain tour. Quand un pilote a fait un arr\u00eat aux stands Et la on touche le plus difficile. Pourtant un arr\u00eat aau stand ne devrait pas \u00eatre compliqu\u00e9 \u00e0 detecter. C'est quand un pilote change de pneu. Alors il peut changer de pneu en gardant le m\u00eame type de pneu et donc tout repose sur le nombre de tour qu'un pneu fait. Sauf que il faut ajouter \u00e0 cette reflexion qu'un pneu peut \u00eatre chauss\u00e9 sans qu'il soit neuf. Ce qui veut dire que l'on ne peut pas simplement choisir qu'un pilote a chang\u00e9 de pneus quand ses pneus sont \u00e0 1 tour. Il peut tr\u00e8s bien reprendre des pneus de qualif qui peuvent avoir 10 tours dans les pattes. En plus quand le pilote change de pneus il y a un phenomene assez p\u00e9nible qui fait que les deux premiers tours faits avec ne sont pass vraiment d\u00e9chiffrables car ils sont un peu cach\u00e9s derri\u00e8re la lettre qui indique le nouveau pneu chauss\u00e9. Exemple : \"Infographie de pneu qui se chevauche\" Voici le code que j'avais \u00e9crit pour tenter de trouver quand un pilote avait fait un pitstop : if ( data . CurrentTyre . Coumpound != Tyre . Type . Undefined && data . CurrentTyre . NumberOfLaps == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps != 0 ) { //Do stuff } On peut voir que j'essaie de detecter quand le pneu est \u00e0 0 tours (ce qui est le moment ou il y a une lettre \u00e0 la place d'un num\u00e9ro de tour) et que la photo d'avant montrait un pneu normal. On v\u00e9rifie aussi que le pneu a bien \u00e9t\u00e9 detect\u00e9 en verifiant que le pneu n'est pas de type undefined. Le soucis c'est que ce n'est pas rare que l'OCR nous retourne qu'un pneu est vieux de 0 tours et donc il est absolument impossible de faire confiance \u00e0 cette metric. Si on veut utiliser cette methode pour trouver les Pitstop il va falloir avant tout am\u00e9liorer l'OCR sur ce point. Ce soucis mets en lumi\u00e8re un principe assez important de l'informatique \"Ggarbage in, Garbage out\". Si les donn\u00e9es que je recoit ne sont pas g\u00e9niales, le r\u00e9sultat ne sera pas g\u00e9nial non plus. Ce qui est frustrant c'est que la detection des pneus n'est pas si mal mais entre les chiffres qui se chevauchent ce qui nous fait lire 0 alors que c'est juste un un '1' derri\u00e8re un 'H' ou le 1% du temps ou le programme se trompe, on ne peut pour l'instant tout simplement rien faire de mieux. Affichage des donn\u00e9es Maintenant que l'on a stock\u00e9 toutes ces donn\u00e9es, il faut en faire quelque chose sinon ca ne sert a rien. Afficher les donn\u00e9es est techniquement la partie la plus simple du projet. Il faut prendre les donn\u00e9es qui nous int\u00e9ressent de la base de donn\u00e9es et des r\u00e9sultats de l'OCR et les afficher sur des composants Windows Forms. Il y a deux types d'affichages actuellements mis en place dans le projet sur les trois pr\u00e9vus initialement : Affichage direct L'affichage direct est simplement l'affichage du r\u00e9sultat de l'OCR. Par exemple le classement live ainsi que les \u00e9carts entre les pilotes sont affich\u00e9s directement depuis les r\u00e9sultats de l'OCR. Ce ne sont pas forc\u00e9ment des donn\u00e9es prises dans la base de donn\u00e9e. Voici un exemple : for ( int driverCount = 0 ; driverCount < liveData . Count ; driverCount ++) { DriverData driver = liveData [ driverCount ]; lblDriverName . Text = driver . Name ; lblDriverPosition . Text = driver . Position ; lblDriverLapTime . Text = Reader . ConvertMsToTime ( driver . LapTime ); } C'est l'affichage le plus simple et celui qui est le plus soumis \u00e0 des erreurs. En effet, si un pilote est mal detect\u00e9 on le verra directement mal s'afficher dans la Form principale. C'est \u00e9galement l'affichage le moins int\u00e9ressant car il ne cr\u00e9e aucune information, il ne fait que remontrer les infos que l'on peut d\u00e9ja voir dans la F1TV \"Exemple d'affichage live\" Affichage calcul\u00e9 La encore il y a plusieurs types d'affichages : Affichage Hybride Pour ce qui est des affichages hybrides ce sont des affichages qui vont chercher des informations lives et des informations dans la base de donn\u00e9e. Ils ne font pas de calculs \u00e0 proprement parler mais ils affichent plus d'informations que ce que montre la F1TV. Cela veut dire qu'ils repr\u00e9sentent un d\u00e9but de plusvalue par rapport \u00e0 l'alternative qu'est la page DATA de la F1TV. Ils ne sont pas beaucoup plus durs \u00e0 impl\u00e9menter mais demandent de faire des requ\u00eates \u00e0 la base de donn\u00e9e. Comme exemple d'affichage hybride on a l'affichage des cinq derniers tours d'un pilote. C'est un affichage qui ne demande aucun calcul mais qui permet deja de se rendre compte de si le pilote est enn train de perdre ou gagner du temps ou si il est constant, ce qui n'est pas possible actuellement avec la F1TV \u00e0 moins d'avoir une excellente m\u00e9moire. \"Fen\u00eatre d'informations \u00e0 propos d'un pilote\" Voici un exemmple du type de code necessaire pour afficher ce genre de donn\u00e9es: public List <( int LapTime , int Lap )> GetDriverLaptimes ( string driverName , int numberOfLaptimes ) { int driverId = GetDriverID ( driverName ); List <( int LapTime , int Lap )> lapData = new List <( int LapTime , int Lap )>(); string selectQuery = \"Select LapTime,Lap from Stats WHERE DriverID = @driverID ORDER BY Lap DESC LIMIT @limit\" ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@limit\" , numberOfLaptimes ); SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { int lapTime = reader . GetInt32 ( 0 ); int lap = reader . GetInt32 ( 1 ); lapData . Add (( lapTime , lap )); } } return lapData ; } public void Display (){ List <( int LapTime , int Lap )> lapsInfos = Storage . GetDriverLaptimes ( driverName , 5 ); int id = 0 ; foreach (( int LapTime , int Lap ) lapData in lapsInfos ){ Labels [ id ]. Text = LapTime ; id ++; } } Note: Le code montr\u00e9 ici n'est pas forc\u00e9ment le code utilis\u00e9 dans le projet. D'une certaine facon les fen\u00eatres de bataille et de d\u00e9passements sont aussi des hybrides. \"Exemple fen\u00eatre des batailles\" Ici ce sont les batailles qui sont repr\u00e9sent\u00e9es. Aucune donn\u00e9e n'est calcul\u00e9e, c'est litterallement directement les donn\u00e9es de la F1TV, mais la nuance est qu'on ne montre que les pilotes qui sont en train de se battre et que on leur assigne une couleur selon \u00e0 quel point ils sont proches. On a une plus-value sur la F1TV sans pour autant faire de monstres calculs. Pour info, les pilotes consid\u00e8r\u00e9s comme \u00eatant en train de se battre sont les pilotes \u00e0 moins de trois secondes les uns des autres et les couleurs sont suivantes : Vert : Dans la zone de DRS (Moins d'une seconde) Jaune : Plus d'une seconde Noir : Plus de deux secondes \"Exemple fen\u00eatre des d\u00e9passements\" La c'est l'historique des d\u00e9passements qui est affich\u00e9. On pourrait presque dire que c'est un affichage compl\u00eatement calcul\u00e9 car ce ne sont pas des informations disponibles directement sur la F1TV cependant je dirais que cela reste un hybride car il n'y a aucuns calculs. On regarde juste les diff\u00e9rences entre l'ancienne position d'un pilote et la nouvelle et on affiche les changements. Affichage totalement calcul\u00e9 L'affichage compl\u00eatement calcul\u00e9 est un type d'affichage qui ne montre aucune information trouv\u00e9e sur la page de la F1TV. C'est le premier affichage \u00e0 traiter l'information qu'il trouve et il retourne des informations nouvelles. La nuance avec les affichages pr\u00e9dictif est qu'il ne cr\u00e9e pas r\u00e9ellement de l'information, il la d\u00e9duit. Le but est de prendre un certain nombre d'informations trouv\u00e9es sur la page de la F1TV et de calculer des choses pour faire ressortir des tendances \u00e0 l'utilisateur. Cependant on reste sur des informations factuelles. Ce sont des infos d\u00e9duites que techniquement unn humain avec une bonne m\u00e9moire et fort en calcul mental pourrait faire. Mais la c'est fait automatiquement pour tous les pilotes et c'est affich\u00e9 de sorte \u00e0 faire ressortir les valeurs sp\u00e9ciales. Comme c'est un peu plus abstrait, je pense qu'un exemple vaut mieux que 1000 mots. \"Exemple de fen\u00eatre d'informations totalement calcul\u00e9es\" Ci dessus on peut voir un bon exemple. C'est une fen\u00eatre qui montre qui sont les pilotes les plus rapides et les moins rapides et qui montre la diff\u00e9rence de temps au tour. Cette information est totalement d\u00e9duite et n'est en aucun cas trouvable sur la F1TV mais elle n'est pas invent\u00e9e. Elle est simplement calcul\u00e9e. La formule est assez simple, je prend les cinq derniers temps au tour de tous les pilotes. Je fais une moyenne qui donne un temps. Et ensuite je trie les pilotes en fonction de ce temps et je n'affiche que les cinq plus rapide et les cinq plus lents. Ensuite il suffit de prendre le temps le plus rapide et faire une petite soustraction pour avoir l'\u00e9cart. C'est une stat assez int\u00e9ressante car elle lisse les diff\u00e9rences d'un tour \u00e0 l'autre et fait ressortir une tendance. On peut voir pour le grand prix de monaco 2023 par exemple, le moment ou les pneus pluie deviennent plus int\u00e9ressants que les pneus secs car on voit que les pilotes les plus rapides sont les pilotes de fond de grille qui ont chauss\u00e9 les pneus pluie en premier tandis que les plus lents sont les pilotes sur pneus secs vieux. Voici un bout de code qui s'occupe de faire les calculs : List <( int avg , string driverName )> averages = new List <( int avg , string driverName )>(); foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { //We want to recover the last 5 lap times List <( int lapTime , int lap )> laps = Storage . GetDriverLaptimes ( driver . Name , 5 ); if ( laps . Count > 0 ) { int avg = 0 ; foreach (( int lapTime , int lap ) lap in laps ) { avg += lap . lapTime ; } avg = avg / laps . Count ; averages . Add (( avg , driver . Name )); } } Affichage pr\u00e9dictif C'est ici que ca devient vraiment dommage, le projet a mannqu\u00e9 de temps pour impl\u00e9menter des affichages pr\u00e9dictifs mais le potentiel est la ! Un affichage pr\u00e9dictif est un affichage qui cr\u00e9e des informations \u00e0 partir des infos qu'il a mais qui fait plus qu'un calcul. Le but est de tenter de deviner quelque chose. Voici des exemples d'affichages pr\u00e9dictifs qui pourraient \u00eatre mis en place averc l'architecture actuelle du projet : Si un pilote a des pneus depuis plus de 20 tours et que son temps au tour est en chute libre depuis cinq tours. Alors ce pilote va peut-\u00eatre devoir s'arr\u00eater. Si un pilote tourne une seconde au tour plus vite que le pilote devant lui et que ce pilote est \u00e0 10 secondes devant, alors il devrait pouvoir le rattraper d'ici dix tours. Si un arr\u00eat au stand est en moyenne de 23 secondes, alors un pilote 3\u00e8me ressortirais potentiellement 7\u00e8me si il s'arr\u00eate maintenant. Tous ces exemples sont des mini algorythmes pr\u00e9dictifs qui pourraient \u00eatre impl\u00e9ment\u00e9s assez facilement dans l'architecture actuelle du projet et pourraient apporter une immense plus-value si ils sont bien param\u00eatr\u00e9s. On peut m\u00eame imaginer que l'algorythme se corrige tout seul si il voit qu'il a eu tort pour que les course suivante il puisse mieux s'en sortir. Les possibilit\u00e9es sont infinies ! Tests Alors la on arrive \u00e0 la GROSSE erreur de ce projet... Si je ne pouvais changer qu'une seule chose \u00e0 ma facon de faire le projet apr\u00e8s coup c'est ici que je ferai le changement. Les tests sont d'une importance absolument capitale mais si ils sont bien faits, c'est surtout un moyen ultra efficace de v\u00e9rifier que du nouveau code est performant et est beaucoup plus pratique \u00e0 utiliser. Je pense sans rire que j'aurais pu gagner plusieurs jours de travail si j'avais travaill\u00e9 diff\u00e9remment vis-a-vis des tests. Comment ca c'est pass\u00e9 D\u00e8s la cr\u00e9ation du planning pr\u00e9visionnel j'ai fait une erreur capitale. J'ai mis les tests en fin de developpement des features... Et je ne leur ai laiss\u00e9 que tr\u00e8s peu de temps tout en les mettant au milieu du chemin critique ce qui les rends particuli\u00e8rement vuln\u00e9rables si une t\u00e2che du chemin critique est retard\u00e9e. En fait dans ce projet je voulais surtout \u00e9viter de faire comme certains projets que l'on a pu avoir pendant notre formation. C'est \u00e0 dire que je ne voulais surtout pas oublier la doc. Alors j'ai agenc\u00e9 le projet pour commencer par les fondations de la doc, puis en incluant les p\u00e9riodes de programmation et entre ces derni\u00e8re ajouter des Tests dans les trous. Le soucis c'est que du coup les projets \u00e9taient un peu le dernier truc dont je devais me soucier ce qui a \u00e9t\u00e9 une tr\u00e8s mauvaise id\u00e9e. Je me suis retrouv\u00e9 \u00e0 devoir mordre sur les jours de tests car les t\u00e2ches de programmation mettaient plus de temps que pr\u00e9vu (qui elles-m\u00eame auraient p\u00fb \u00eatre plus courte avec une bonne utilisation des tests) et je mme suis retrouv\u00e9 \u00e0 passer outre les tests pour avancer sur le reste du projet. J'ai donc du en panique \u00e0 la toute fin du projet construire quelques tests \"unitaires\" dont l'utilit\u00e9 est tr\u00e8s limit\u00e9e car tout le travail a d\u00e9ja \u00e9t\u00e9 fait et que vu la complexit\u00e9 qu'a pris le projet, faire de vrais tests unitaires est devenu un peu trop compliqu\u00e9 pour valoir le coup. Les seuls tests \"unitaires\" (Je l'\u00e9cris entre quotes car ce ne sont pas vraiment des tests unitaires mais plut\u00f4t des tests tout courts car ils ne sont pas sp\u00e9cifiques) qu'il y a dans le projet final sont des tests exclusivement tourn\u00e9s sur l'OCR. Ils sont d\u00e9ja vraiment pratiques car cela me permet de tester d'autres algorythmes d'OCR et voir si les r\u00e9sultats sont meilleurs ou non mais c'est juste un peu trop tard quoi... Les tests unitaires que j'ai impl\u00e9ment\u00e9s sont un peu tous pareils au niveau du fonctionnement : On choisit une image dans une liste d'images pr\u00e9par\u00e9es qui sont scens\u00e9e repr\u00e9senter le type de donn\u00e9es rencontr\u00e9es par l'application en temps normal On lis le nom de l'image que j'ai mis manuellement en indiquant ce qui \u00e9tait marqu\u00e9 sur l'image On fait un coup d'OCR sur l'image et on compare ce r\u00e9sultat avec la valeur que l'on est scens\u00e9 retrouver En pratique on est sur un code de ce style : [TestMethod()] public void SectorOCR_Test () { string directory = @\"./../../TestImages/Sectors/\" ; foreach ( string file in Directory . GetFiles ( directory )) { Bitmap image = ( Bitmap ) Image . FromFile ( file ); DriverSectorWindow sectorsWindow = new DriverSectorWindow ( image , new Rectangle ( 0 , 0 , image . Width , image . Height ), 1 , true ); string [] paths = file . Split ( '/' ); string fileName = paths [ paths . Length - 1 ]; fileName = fileName . Replace ( \".png\" , \"\" ); int timeMS = ( int ) sectorsWindow . DecodePng (); string time = Reader . ConvertMsToTime ( timeMS ); string [] checkDigits = fileName . Split ( '_' ); string [] digitsToCheck = time . Split ( ':' ); if ( time == \"0:00:000\" ) { Assert . AreEqual ( 0 , Convert . ToInt32 ( checkDigits [ 0 ])); } else { //The ConvertMSToTime will always return three chars so we need to make the checkDigits be also three chars while ( checkDigits . Length != 3 ) checkDigits = new [] { \"0\" }. Concat ( checkDigits ). ToArray (); for ( int i = 0 ; i < checkDigits . Length ; i ++) { //We need to convert to int first because sometimes we have \"08\" and \"8\" and in string its not the same but in int it is Assert . AreEqual ( Convert . ToInt32 ( checkDigits [ i ]), Convert . ToInt32 ( digitsToCheck [ i ])); } } } } Tout le code suppl\u00e9mentaire qui ne fait pas partie des \u00e9tapes cit\u00e9es est juste la pour manipuler le format des r\u00e9sultats pour qu'il soit comparable. \"Exemple d'\u00e9chantillons pour les tests\" Ce qui est pratique avec cette approche c'est qu'il est tr\u00e8s facile de rajouter des cas sp\u00e9cifiques et voir comment le programme les g\u00e8re. Si je vois que un certain nombre est souvent mal reconnu je peux faire expr\u00e8s de le mettre dans le dossier et modifier mon code d'OCR jusqu'\u00e0 ce que le test passe. Si j'avais eu plus de temps j'aurais s\u00fbrement pu ajouter de vrais tests unitaires qui testent des fonctions tr\u00e8s pr\u00e9cises. Par exemple verifier que les diff\u00e9rentes Windows sont bien appel\u00e9es et que les zones se cr\u00e9ent correctement ou m\u00eame plus simplement que la lecture du JSON au d\u00e9marrage marche bien. Il faut savoir que m\u00eame si je n'ai pas eu l'occasion d'\u00e9crire beaucoup de tests sous forme de code. Toute la phase de d\u00e9veloppement de l'OCR j'ai pass\u00e9 plus d'une heure par jour \u00e0 analyser les r\u00e9sultats. Je gardais toutes les images des WINDOWS et je notais dans le nom du fichier ce que l'algorythme trouvais et je passais en revue manuellement les centaines de r\u00e9sultats pour isoler ceux qui posaient probl\u00e8me. C'est comme ca que je me suis rendu compte par exemple que, avec cette police, les 4 et les 1 \u00e9taient souvent confondus. Donc m\u00eame si les tests automatis\u00e9s sont clairement insuffisant par rapport \u00e0 ce que j'aurais peut-\u00eatre du faire, j'ai pass\u00e9 \u00e9norm\u00e9ment de temps \u00e0 tester mon application. Comment ca aurait du se passer Si je devais refaire ce projet aujourd'hui je pense que j'utiliserais un peu la m\u00eame technique que pour la doc. J'aurais mis les t\u00e2ches de Tests directement au d\u00e9but du projet et j'aurais determin\u00e9 le squelette de l'application par la m\u00eame occasion. Je pense que j'aurais mis trois jours pour \u00e9crire tous les tests dont j'aurais besoin et j'aurais fait une strat\u00e9gie de TDD (Test Driven Developpement) par ce que je pense que ca marcherait vraiment super bien sur ce type de projet. J'aurais pris je pense 5 une dixaine d'images compl\u00eates de la F1TV de plusieurs GP diff\u00e9rents et j'aurais mis toutes les fen\u00eatres d\u00e9coup\u00e9es dans des fichiers avec des tests comme ceux que j'ai fait pour ce projet. Et comme ca je saurai que mon algo est bon uniquement quand il aura r\u00e9ussi \u00e0 passer tous les tests. Cela r\u00e8glerait le soucis que j'ai eu le plus : Me retrouver \u00e0 devoir changer l'OCR 5 fois par ce que \u00e0 chaque fois que je d\u00e9veloppe une nouvelle feature je me rends compte d'une faiblesse mon algorythme... Non seulement j'aurai eu beaucoup plus de facilit\u00e9 \u00e0 avancer sur le projet, mais en plus je pense que cela m'aurait fait gagner \u00e9norm\u00e9ment de temps non seulement car je n'ai plus \u00e0 tester tout \u00e0 la main mais en plus par ce que ca veut dire que quand l'OCR passe les tests je n'ai plus jamais \u00e0 m'en soucier. Lecons Je pense que dans mes futurs projets je mettrai les tests en d\u00e9but de projet plut\u00f4t que \u00e0 la fin et je ferai en sorte qu'ils fassent partie du chemin critique et que je ne puisse pas passer \u00e0 c\u00f4t\u00e9 sous pretexte que \"Je n'ai pas le temps\". Ecrire des tests c'est jamais marrant et c'est encore moins marrant quand ils nous emp\u00eachent d'avancer. Mais je suis convaincu que au final c'est un gain de temps et de s\u00e9r\u00e9nit\u00e9 incontournable. R\u00e9sum\u00e9 des difficult\u00e9s techniques [A remplir au fur et \u00e0 mesure dans la seconde moiti\u00e9 du travail de dipl\u00f4me] Optimisation du programme [A remplir \u00e0 la fin du projet pour parler des diff\u00e9rentes methodes d'optimisation] Ethique du projet [A remplir \u00e0 la fin du projet pour parler des questions ethiques du projet (Ex: Utilisation potentiellement abusive de la F1Tv ou L'histoire des cookies)] Utilisation de Chat GPT [A remplir \u00e0 la fin du projet] Am\u00e9liorations futures [A remplir dans les derni\u00e8res semaines du travail de dipl\u00f4me] Conclusion [A remplir la derni\u00e8re semaine du travail de dipl\u00f4me] Notes de code","title":"Rapport Track Trends V1.0"},{"location":"index.html#rapport-track-trends-v10","text":"Rohmer Maxime Travail de dipl\u00f4me Technicien ES 2023","title":"Rapport Track Trends V1.0"},{"location":"index.html#introduction","text":"","title":"Introduction"},{"location":"index.html#resume","text":"Track Trends est un outil de r\u00e9cup\u00e9ration et d'analyse de donn\u00e9es de courses de Formule 1. Pour le contexte, en dehors des cours, j'exerce diff\u00e9rentes activit\u00e9s dont celle de Live Ticker F1 pour le 20 minutes. Pour m'aider dans ce travail, j'utilise actuellement la F1TV \u00e0 laquelle je suis abonn\u00e9 qui me propose non seulement un feed vid\u00e9o de meilleure qualit\u00e9 avec des commentaires plus pertinents que ceux de la RTS mais qui aussi me permet d'acc\u00e9der \u00e0 un feed vid\u00e9o tr\u00e8s important : la chaine data. Ce dernier ressemble \u00e0 cela : \"Screenshot du feed data de la f1tv\" (Attention ce n'est pas un joli tableau HTML, mais bien une vid\u00e9o qui contient un tableau.) Sauf que toutes les informations sont \u00e9tal\u00e9es p\u00eale-m\u00eale sans hi\u00e9rarchie ce qui fait que cela me prendrait trop de temps de tout d\u00e9chiffrer \u00e0 chaque fois, ce qui me fait rater des choses int\u00e9ressantes. Le but du projet est donc de fournir un outil qui hi\u00e9rarchise et affiche diff\u00e9remment les donn\u00e9es pour faciliter leur lecture et me permettre de faire de meilleurs commentaires.","title":"R\u00e9sum\u00e9"},{"location":"index.html#abstract","text":"Track Trends is a Formula 1 data is a tool that displays and interpret data. To understand everything,first ,a little bit of context. In my free time I have multiple activities and one is to be the Live Ticker F1 for the local journal \"20 minutes\" (Owned by Tamedia). to help me in this work I'm currently using the F1TV to which I'm currently subscribed because it provides me with a better video feed with better commentary than the ones from the RTS (in my opinion) but also because it gives me access to a very important video feed : the data channel You can see in the chapter above an example of the F1TV DATA CHANNEL. [Note : Even tough it looks like a pretty HTML table on wich you could easely get infos... Its not. Its a video feed] You can see a lot of data all well and good BUT! All the data is displayed the same in a big table which make it really hard to read totally in a hurry, which means that I miss a lot of useful information. The point of the project then is to provide a tool that can display those data by taking into account their relevance. So for example a driver that is 10s away from everyone and that is doing some normal lapTimes will be less displayed or even not displayed at all so I can focus on the drivers that are battling each others. This tool would help me not miss the battles and details that are happening in the back and therefore not being broadcasted on TV.And it could be a usefull tool for anyone who wants a better insight of how the race is going by looking at the data. This kind of project already exists in the form of the AWS tool \"F1 Insight\" but it is not avaible to the public. We can only see some of its predictions (that are trash) and data dumps in the live feed when the TV directors feel like it.","title":"Abstract"},{"location":"index.html#description-du-besoin","text":"Comme expliqu\u00e9 dans le r\u00e9sum\u00e9, je suis Live Ticker F1. Mais pour mieux comprendre le besoin que j'ai, je pense qu'il est pertinent de comprendre comment je travaille. Pendant un Grand Prix de Formule 1 j'ai plusieurs t\u00e2ches \u00e0 effectuer : Suivre les diff\u00e9rents \u00e9v\u00e8nements du Grand Prix Changer le titre et la photo de titre du Live Chercher des Tweets ou des Images \u00e0 int\u00e9grer Ecrire les commentaires en faisant attention \u00e0 dire ce qu'il se passe mais aussi l\u2019expliquer, ce que cela implique, mais aussi ce que cela veut dire pour le reste de la course. Comprendre et expliquer les strat\u00e9gies Tout cela toutes les cinq minutes max... Cela veut dire que je dois \u00eatre le plus rapide possible quand je cherche des informations. Et comme le tableau en comporte trop et bien, je suis oblig\u00e9 de le lire en diagonale. Par exemple dans le tableau, les infos que je cherche le plus sont : Le nombre de places gagn\u00e9es (surtout au d\u00e9part) Les \u00e9carts entre les pilotes (surtout ceux qui sont en dessous de deux secondes). Les pneus de chaque pilote et combien de tours, ils ont fait dessus Les temps d'arr\u00eats aux stands Les temps au tour (surtout pour la strat\u00e9gie) Mais pleins d'autres informations existent si on les recoupe sur plusieurs tours. Un outil qui permettrait de mettre en \u00e9vidence les informations importantes serait donc une tr\u00e8s grosse plus-value pour mon travail et s'il est facile \u00e0 installer et \u00e0 utiliser, il se pourrait qu'il devienne indispensable.","title":"Description du besoin"},{"location":"index.html#cahier-des-charges","text":"Il s'agit d'une version coup\u00e9e du cahier des charges qui ne contient pas l'explication du contexte. Mais l'original est disponible sur ce site \u00e9galement. Il est toutefois normal d'y voir des choses r\u00e9p\u00e9t\u00e9es ou l\u00e9g\u00e8rement diff\u00e9rentes, en effet, il n'a pas \u00e9t\u00e9 \u00e9crit en m\u00eame temps que le reste de ce document.","title":"Cahier des charges"},{"location":"index.html#projet","text":"Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes. Le but est non seulement de faciliter mon job, mais aussi faire en sorte d'am\u00e9liorer la plus-value de mon travail en me permettant de fournir des commentaires qui ne sont pas disponibles pour le tout venant qui regarde simplement le flux RTS. Exemples : Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand Maintenant afficher diff\u00e9remment les infos, c'est sympa, mais cela serait encore mieux de traiter ces data et de permettre des petites pr\u00e9dictions. Exemples : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents","title":"Projet"},{"location":"index.html#realisation","text":"Malheureusement, la Formula 1 Management ne propose aucune API publique qui puisse nous permettre de faire ce projet \"simplement\". La raison la plus probable \u00e9tant qu'Amazon avec son service AWS propose exactement ce genre de services pour le flux t\u00e9l\u00e9vis\u00e9 et il doit y avoir un contrat d'exclusivit\u00e9. Il existe des API \"Pirates\" faites par la communaut\u00e9, le probl\u00e8me est qu'elles ne sont pas forc\u00e9ment des plus pratiques \u00e0 utiliser. Mais comme je poss\u00e8de un abonnement premium ++ \u00e0 la F1TV, j'ai acc\u00e8s pour chaque grand prix \u00e0 un flux vid\u00e9o nomm\u00e9 : DATA F1 CHANNEL Qui ressemble \u00e0 \u00e7a : \"Exemple de la Data Channel\" Donc la seule fa\u00e7on que je vois de r\u00e9cup\u00e9rer ces donn\u00e9es est de les prendre directement sur ce feed. M\u00eame si le but final de l'application est de faire pleins de choses super avec les datas, le gros du projet va surtout \u00eatre la r\u00e9cup\u00e9ration des donn\u00e9es et leur stockage. Les donn\u00e9es viennent du flux vid\u00e9o et ainsi dans un premier temps, il va falloir r\u00e9cup\u00e9rer d'une mani\u00e8re ou d'une autre des images qui viennent d'un grand prix en direct ou en rediffusion. Ensuite, dans un second temps, il faut lire les informations directement sur l'image en utilisant une librairie pr\u00e9vue pour (exemple Tesseract) et v\u00e9rifier l'int\u00e9grit\u00e9 de ces derni\u00e8res pour qu'on puisse ensuite les stocker. Dans un troisi\u00e8me temps, il faut stocker toutes ces donn\u00e9es dans une forme qui permette d'aller facilement faire des requ\u00eates de r\u00e9cup\u00e9ration et d\u00e9j\u00e0 pr\u00e9parer des m\u00e9thodes qui permettent de r\u00e9cup\u00e9rer des infos importantes (ex : la moyenne des cinq derniers tours, le temps moyen d'arr\u00eat etc.) pour faciliter la derni\u00e8re \u00e9tape Quand tout cela est fait, on peut ensuite s'amuser un peu avec les Data. La derni\u00e8re \u00e9tape est donc l'affichage. L'id\u00e9e est de cr\u00e9er une Windows Form qui contienne toutes ces informations dans un format beaucoup plus lisible et avec laquelle on pourrait interagir pour permettre de plus facilement commenter les Grands Prix. (exemple plus bas avec un croquis de ce \u00e0 quoi l'application pourrait ressembler) Voici la liste des donn\u00e9es qui pourraient \u00eatre affich\u00e9es (Non contractuel, simplement des id\u00e9es). Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand La moyenne de temps que les pilotes perdent dans les stands La performance moyenne des 5 types de pneus La moyenne de temps de chaque pilote sur le pneu actuel Le nombre de points que chaque pilote gagnerait selon sa position Le classement de la course Voire m\u00eame si c'est possible : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents Pr\u00e9dire les temps au tour de chaque pilote selon l'usure des pneus Voici un exemple d'interface possible pour une page : \"Protype de l'app fait sur Figma\"","title":"R\u00e9alisation"},{"location":"index.html#cas-dutilisation","text":"'*'On va consid\u00e9rer que tous les user ont un abonnement F1 TV PRO Un user veut r\u00e9cup\u00e9rer les data : Il ouvre son navigateur et lance la page DATA de la F1 TV Il calibre la capture des data via le programme (pour la premi\u00e8re utilisation). Il confirme que les donn\u00e9es initiales sont bonnes (pour la premi\u00e8re utilisation). Il regarde tranquille son Grand Prix Le programme r\u00e9cup\u00e8re les data : Il r\u00e9cup\u00e8re des images depuis la F1TV Il utilise Tesseract (ou autre) pour en r\u00e9cup\u00e9rer les infos. Il met ces infos dans un Objet Pilote, dans un Objet course avec un attribut tour pour hi\u00e9rarchiser les data Pour ce qui est de l'affichage, l'id\u00e9e est de faire une application C# comme on l'a appris \u00e0 l'\u00e9cole, mais avec assez de style pour qu'elle puisse \u00eatre agr\u00e9able \u00e0 utiliser. Quand le programme affiche les data : Il prend les donn\u00e9es venant directement de la F1TV. Il affiche diff\u00e9remment les donn\u00e9es pour permettre une meilleure lisibilit\u00e9 Il interpr\u00e8te avec des r\u00e8gles plut\u00f4t simples certaines data pour faire des minipr\u00e9dictions ou aider \u00e0 la lecture Il r\u00e9cup\u00e8re des infos d'autres courses pour les comparer et proposer des pr\u00e9dictions plus int\u00e9ressantes","title":"Cas d'utilisation"},{"location":"index.html#difficultes-techniques","text":"R\u00e9cup\u00e9rer un flux vid\u00e9o plut\u00f4t propre malgr\u00e9 les contres mesures de la F1 TV pour en emp\u00eacher la lecture par un logiciel Si on doit passer par une capture d'\u00e9cran, trouver un moyen de stocker les donn\u00e9es de mani\u00e8re \u00e0 pr\u00e9voir que parfois un tour pourrait avoir plus de donn\u00e9es qu'un autre, que le user peut mettre pause, ou m\u00eame qu\u2019il revienne en arri\u00e8re. D\u00e9velopper des algorithmes pour r\u00e9cup\u00e9rer les donn\u00e9es comme les diff\u00e9rents pneus utilis\u00e9s ou l'activation du DRS ainsi que d\u00e9velopper des moyens de nettoyer les r\u00e9sultats de l'OCR (Par exemple utiliser diff\u00e9rents champs redondants pour comparer les r\u00e9sultats) Stocker les donn\u00e9es sur une base pour les traiter plus tard tout en pr\u00e9voyant un moyen de voir les stats live D\u00e9velopper des algorithmes de pr\u00e9diction qui prennent en compte d'anciennes courses pour tenter de pr\u00e9dire des choses comme les arr\u00eats aux stands par exemple.","title":"Difficult\u00e9s techniques"},{"location":"index.html#differences-sur-le-cahier-des-charges","text":"[\u00c0 remplir dans les derni\u00e8res semaines du travail de dipl\u00f4me]","title":"Diff\u00e9rences sur le cahier des charges"},{"location":"index.html#planning-previsionnel","text":"Mes suiveurs m'ont demand\u00e9 un planning de type GANTT pour ce travail de dipl\u00f4me Je n'ai pas utilis\u00e9 un logiciel particulier pour faire ce dernier, mais je me suis inspir\u00e9 des principes fondamentaux d'un diagramme de ce type. Comme l'original a \u00e9t\u00e9 fait sur Excel, je ne peux pas vraiment l'ins\u00e9rer de mani\u00e8re lisible ici, mais il est disponible dans le dossier Planning. Mais voici un r\u00e9sum\u00e9 de son contenu :","title":"Planning pr\u00e9visionnel"},{"location":"index.html#taches","text":"J'ai d\u00e9cid\u00e9 de d\u00e9composer mon planning en trois grands types de t\u00e2ches. Programmation Documentation Tests L'id\u00e9e est de permettre une meilleure lisibilit\u00e9 et de me permettre \u00e0 moi de me faire plus facilement \u00e0 l'id\u00e9e de ce qu'il m'attend. Voici la liste des t\u00e2ches par rubrique :","title":"T\u00e2ches"},{"location":"index.html#pt","text":"Cette rubrique contient les t\u00e2ches qui n'ont pas leur place dans les trois cat\u00e9gories principales.","title":"PT"},{"location":"index.html#pt1-preparation-au-travail-de-diplome-2","text":"Cette t\u00e2che est un peu hors cat\u00e9gorie, mais c'est normal, c'est une supert\u00e2che qui regroupe beaucoup de choses. C'est une t\u00e2che qui est planifi\u00e9e pour deux jours et qui normalement devrait \u00eatre faite les deux premiers jours du travail. Le but est de pr\u00e9parer tout ce qui peut \u00eatre pr\u00e9par\u00e9 en avance niveau documentation et mise en place pour ne pas avoir besoin de s'en soucier ensuite.","title":"PT1 / pr\u00e9paration au travail de dipl\u00f4me (2)"},{"location":"index.html#dt","text":"Rubrique documentation qui contient toutes les t\u00e2ches en rapport de pr\u00e8s ou de loin avec la documentation du projet.","title":"DT"},{"location":"index.html#dt1-creation-du-poster-1","text":"Cette t\u00e2che consiste \u00e0 faire une version num\u00e9rique du poster qui soit en accord avec les consignes qu'on nous a donn\u00e9es. Le but est aussi et surtout de faire poster dont je sois fier et que je sois content de montrer. Il y a d\u00e9j\u00e0 des croquis de poster et j'ai clairement pr\u00e9vu de travailler sur \u00e7a pendant les vacances alors, je n'ai mis qu'un jour et je l'ai plac\u00e9 juste avant le rendu de ce dernier.","title":"DT1 Cr\u00e9ation du poster (1)"},{"location":"index.html#dt2-documentation-analyse-de-lexistant-2","text":"Cette t\u00e2che est d\u00e9di\u00e9e \u00e0 l'\u00e9criture de la documentation et plus pr\u00e9cis\u00e9ment de l'analyse de l'existant. Comme il y a pas mal de technologies utilis\u00e9es dans mon projet, j'aimerais faire correctement un vrai debrief de pourquoi j'ai utilis\u00e9 l'une ou l'autre alors, j'ai assign\u00e9 deux jours dessus.","title":"DT2 Documentation Analyse de l'existant (2)"},{"location":"index.html#dt3-documentation-analyse-organique-5","text":"Cette t\u00e2che est la plus grosse dans la cat\u00e9gorie documentation. Il s'agit de documenter comment l'application fonctionne. J'y ai mis cinq jours et je pense que c'est un minimum car c'est dans cette t\u00e2che que je vais devoir d\u00e9tailler exactement comment fonctionne chaque partie du projet. Ces cinq jours sont \u00e9parpill\u00e9s sur le projet en g\u00e9n\u00e9ral \u00e0 la fin du d\u00e9veloppement de chaque grande partie de projet. Le but est de ne rien oublier et de ne pas avoir \u00e0 tout faire en m\u00eame temps.","title":"DT3 Documentation Analyse organique (5)"},{"location":"index.html#dt4-documentation-analyse-fonctionnelle-2","text":"Cette t\u00e2che est d\u00e9j\u00e0 moins grosse, elle consiste \u00e0 documenter le fonctionnement de l'application et comment utiliser les composants que j'ai d\u00e9velopp\u00e9s. Je l'ai mis en fin de projet, car comme j'ai l'habitude de faire des analyses fonctionnelles plut\u00f4t pr\u00e9cises, le moindre changement dans l'UI peut tout rendre obsol\u00e8te. J'y ai mis deux jours, car j'aimerais correctement documenter avec de bonnes photos et sc\u00e9narios pour qu'on puisse voir toutes les possibilit\u00e9s de l'application.","title":"DT4 Documentation Analyse fonctionnelle (2)"},{"location":"index.html#dt5-documentation-tests-1","text":"Cette t\u00e2che est un peu plus petite qu'elle ne le devrait. Elle concerne la documentation des diff\u00e9rents tests. Je n'y ai mis qu'un seul jour, car en r\u00e9alit\u00e9 les diff\u00e9rentes t\u00e2ches de tests contiennent aussi beaucoup de documentation,","title":"DT5 Documentation Tests (1)"},{"location":"index.html#dt6-documentation-reste-2","text":"Cette t\u00e2che est une t\u00e2che un peu vague. Elle contient toutes les actions autres que j'aurai besoin de faire (Mise au propre, orthographe, g\u00e9n\u00e9ration de PDF ...). J'y ai mis deux jours pour avoir un peu de marge, car ce sont toujours des t\u00e2ches qui paraissent faciles, mais qui \u00e0 la fin prennent beaucoup de temps si on les fait bien.","title":"DT6 Documentation Reste (2)"},{"location":"index.html#pt_1","text":"Rubrique programmation qui contient toutes les t\u00e2ches qui touchent \u00e0 la programmation et au d\u00e9veloppement de l'application.","title":"PT"},{"location":"index.html#pt1-programmation-recuperation-des-images-3","text":"Cette t\u00e2che est estim\u00e9e \u00e0 seulement trois jours, il ne faut pas s'y m\u00e9prendre, c'est une des t\u00e2ches les plus dures et lourdes niveaux documentation en explications. Cependant, un POC (Proof Of Concept) assez avanc\u00e9 a d\u00e9j\u00e0 \u00e9t\u00e9 fait et donc cela permet de n'envisager que trois jours, car il suffit de l'impl\u00e9menter et de la paufinner. Cette t\u00e2che consiste \u00e0 prendre en entr\u00e9e un lien de Grand Prix et de sortir une image tous les x secondes de la page DATA. Cela peut sembler simple, mais pour le faire sans prendre d'espace d'\u00e9cran et ne demandant pas \u00e0 l'utilisateur de copier-coller quoi que ce soit o\u00f9 de donner ses identifiants F1TV c'est un challenge. Cela peut paraitre curieux alors de mettre cette t\u00e2che loin dans le planning m\u00eame si c'est la premi\u00e8re \u00e9tape du projet. Encore une fois cela s'explique avec le fait qu'il y a d\u00e9j\u00e0 un POC qui fonctionne \u00e0 peu pr\u00e8s et que donc pr\u00e9f\u00e8re commencer avec des t\u00e2ches plus incertaines dans le cas o\u00f9 elles prendraient plus de temps que pr\u00e9vu.","title":"PT1 Programmation r\u00e9cup\u00e9ration des images (3)"},{"location":"index.html#pt2-programmation-ocr-5","text":"Cette t\u00e2che consiste \u00e0 d\u00e9velopper la partie qui reconnait le texte sur les images. C'est tr\u00e8s certainement la t\u00e2che qui risque le plus de d\u00e9border car c'est celle qui est la plus complexe techniquement puisqu'elle demande non seulement la lecture sur image, mais aussi le d\u00e9veloppement d'algorithmes de traitement de cette donn\u00e9e pour \u00eatre s\u00fbr qu'elle a bien \u00e9t\u00e9 lue. J'y ai ainsi allou\u00e9 cinq jours, mais j'esp\u00e8re que j'arriverai \u00e0 gagner du temps sur les autres pour y allouer plus dans le planning effectif, car je suis convaincu que plus, on y passe du temps, meilleur sera le r\u00e9sultat.","title":"PT2 Programmation OCR (5)"},{"location":"index.html#pt3-programmation-stockage-et-modele-5","text":"Cette partie est moins technique, mais concerne le stockage des donn\u00e9es que nous retourne la lecture des images. Mais elle va demander de la r\u00e9flexion et de l'intelligence de programmation, car il faut que cette partie anticipe les besoins de la vue et pr\u00e9pare un terrain fertile qui ne demande pas un refactor quand on passera au d\u00e9veloppement de la vue. C'est pour cela que je lui ai aussi assign\u00e9 cinq jours de travail et elle doit absolument \u00eatre commenc\u00e9e apr\u00e8s la lecture.","title":"PT3 Programmation, stockage et mod\u00e8le (5)"},{"location":"index.html#pt4-programmation-vue-de-lapp-5","text":"Cette partie peut \u00eatre horrible comme tr\u00e8s facile, cela d\u00e9pend compl\u00e8tement de la qualit\u00e9 du travail avant. Si le mod\u00e8le est parfait et que les donn\u00e9es sont int\u00e8gres, cela devrait \u00eatre plut\u00f4t simple de les afficher de mani\u00e8re int\u00e9ressante. Cependant, cette partie d\u00e9bordera s\u00fbrement un peu, car tout le temps gagn\u00e9 avec de bonnes donn\u00e9es sera utilis\u00e9 pour tenter de faire de la pr\u00e9diction. Pour ces raisons, je lui ai assign\u00e9 \u00e9galement cinq jours de travail et elle doit absolument \u00eatre faite apr\u00e8s le mod\u00e8le.","title":"PT4 Programmation Vue de l'APP (5)"},{"location":"index.html#pt5-programmation-mise-en-commun-3","text":"Cette t\u00e2che est aussi un petit peu sp\u00e9ciale, car elle regroupe plusieurs choses. En gros, chaque partie de programmation sera s\u00fbrement assez ind\u00e9pendante et il faudra \u00e0 un moment faire un seul projet C# qui contient tout. Il est difficile d'estimer \u00e0 quel point cela va \u00eatre compliqu\u00e9 alors, j'ai \u00e9t\u00e9 conservateur et j'ai mis trois jours.","title":"PT5 Programmation mise en commun (3)"},{"location":"index.html#tt","text":"Cette rubrique contient les t\u00e2ches qui sont uniquement des tests. La plupart des t\u00e2ches de programmations contiennent d\u00e9j\u00e0 des tests, mais certaines demandent une attention particuli\u00e8re.","title":"TT"},{"location":"index.html#tt1-tests-ocr-2","text":"Cette t\u00e2che est une des t\u00e2ches les plus importantes. Son but est de faire un protocole de tests complet qui permette de comparer les diff\u00e9rents algorithmes de reconnaissance de texte. Je l'ai mise apr\u00e8s la reconnaissance, mais m\u00eame maintenant en \u00e9crivant ces lignes, je me dis que dans le planning effectif, elle sera faite pendant la t\u00e2che de programmation. En effet, comment savoir si mon tout nouvel algorithme est r\u00e9ellement mieux que le pr\u00e9c\u00e9dent. Je pr\u00e9vois deux jours, car je pense que faire le dataset va prendre beaucoup de temps, il faut pr\u00e9voir un certain nombre d'images et de texte qui pourront ensuite \u00eatre donn\u00e9es sous forme de tests. C'est certes une t\u00e2che de test, mais c'est aussi de la programmation.","title":"TT1 Tests OCR (2)"},{"location":"index.html#tt2-tests-finaux-2","text":"Cette t\u00e2che de tests est un peu vague, elle regroupe les diff\u00e9rents tests pour v\u00e9rifier que les donn\u00e9es sont bien affich\u00e9es correctement. Ce qui serait cool si j'ai du temps en fin de travail de dipl\u00f4me serait de faire un syst\u00e8me de test qui permet d'entrainer le programme \u00e0 mieux reconnaitre certaines choses comme des arr\u00eats aux stands si on lui donne les trois derni\u00e8res ann\u00e9es de grands Prix. J'ai mis une dur\u00e9e arbitraire de deux jours, mais je ne sais pas vraiment combien de temps cela va vraiment durer. Elle est \u00e9videmment \u00e0 effectuer une fois que tout est \u00e0 peu pr\u00e8s termin\u00e9.","title":"TT2 Tests finaux (2)"},{"location":"index.html#planning-effectif-et-differences","text":"[A remplir dans les derni\u00e8res semaines du travail de dipl\u00f4me]","title":"Planning effectif et diff\u00e9rences"},{"location":"index.html#analyse-fonctionnelle","text":"[A remplir au fur et \u00e0 mesure dans la seconde moiti\u00e9 du travail de dipl\u00f4me]","title":"Analyse fonctionnelle"},{"location":"index.html#analyse-organique","text":"","title":"Analyse Organique"},{"location":"index.html#outils-utilises","text":"[A Remplir]","title":"Outils utilis\u00e9s"},{"location":"index.html#technologies-utilisees","text":"Dans ce projet diff\u00e9rents choix ont \u00e9t\u00e9 faits pour ce qui est des technologies. Certaines ont \u00e9t\u00e9 choisies car elles \u00e9taient les plus simples, les plus pratiques, les plus efficaces ou encore les plus connues et donc ayant le meilleur support. Je vais tenter de r\u00e9sumer ici ces choix mais je reviendrai sur la plupart d'entre eux plus tard quand j'explique ce que je fais avec.","title":"Technologies utilis\u00e9es"},{"location":"index.html#selenium","text":"\"Logo de selenium\" Selenium est une librairie \u00e0 la base Node JS qui permet d'automatiser des actions sur un navigateur internet. Le but premier et je pense son utilisation premi\u00e8re est l'automatisation de tests pour des applications WEB. En effet c'est un super outil pour simuler un user faisant un certain nombre d'actions sans apporter de variabilit\u00e9 ce qui fait de supers test unitaires. Cependant je pense que l'autre grande partie des utilisateurs de Selenium l'utilisent pour faire du \"Scrapping\". Et nous sommes un peu dans cette seconde cat\u00e9gorie. Le \"Scrapping\" c'est l'acte d'aller r\u00e9cup\u00e8rer des informations sur des pages web automatiquement pour alimenter sa propre base de donn\u00e9es. En effet, si on arrive \u00e0 passer les protections anti-bot on peut facilemnt utiliser Selenium pour scraper tous les sites qui nous passent par la t\u00eate. Le cahier des charges que j'avais en t\u00eate en cherchant une technologie de contr\u00f4le de navigateur internet \u00e9tait le suivant : Simple Permettant de contr\u00f4ler un navigateur Headless (Voir chapitre \"Simuler un navigateur ?\") Permettant de contr\u00f4ler firefox Ayant un wrapper C# Permettre de changer certaines choses comme les cookies en Live Permettre d'interagir avec les \u00e9l\u00e9ments d'une page Fonctionner Simple car je ne voulais pas avoir \u00e0 passer trop de temps dessus (ca n'a pas bien vieillit lol...). Je voulais que l'on puisse utiliser Firefox car il n'impl\u00e9mente pas les m\u00eames s\u00e9curit\u00e9es que Chrome pour faire simple. J'avais besoin que la lib puisse contr\u00f4ler un Firefox HEADLESS car je ne voulais pas avoir une page web ouvert sur mon ordi quand je commente car c'est de l'espace utilis\u00e9 pour rien. J'avais besoin d'un wrapper C# car c'est le language que j'utilise. Pour finir j'avais besoin d'interragir avec les \u00e9l\u00e9ments de la page pour naviguer dessus et d'ins\u00e8rer des cookies pour me connecter sans avoir \u00e0 passer par le login de la F1TV qui est tr\u00e8s bon pour detecter les bots. Avec un cahier des charges parreil beaucoup de librairies ont \u00e9t\u00e9 abandonn\u00e9es. J'ai pu tester pleins de librairies C# qui arrivaient \u00e0 contr\u00f4ler un Chrome et m\u00eame pas mal qui arrivaient \u00e0 contr\u00f4ler un Chrome Headless. Mais le choix est tr\u00e8s vite restreind quand on veut pouvoir contr\u00f4ler Chrome OU Firefox. A la base mon choix c'\u00e9tait port\u00e9 sur Puppeteer Sharp qui est une librairie qui se veut \u00eatre exactement ce que je veux. \"Logo de Pupeteer\" Je voulais utiliser cette librairie car il y a des plugins qui sont tr\u00e8s orient\u00e9s scrapping, en effet, ils impl\u00e9mentent de nombreuses techniques pour permettre de mieux passer innapercu par les syst\u00e8mes de detection de bots. Sur le papier c'est la librairie parfaite qui correspond parfaitement au cahier des charges que je m'\u00e9tais fix\u00e9 et je pense que si j'utilisais un projet JS elle le serait. Sauf que avec le wrapper C# j'ai eu un certain nombre de probl\u00e8mes: Toutes les versions de la librairie ne fonctionnaient pas. Il fallait faire des tests avec diff\u00e9rentes versions de la librairie et de ses d\u00e9pendences simplement pour faire d\u00e9marrer un browser. Et ca c'est quand ca marchait car il y avait des jours ou des machines ou je n'ai simplement pas pu faire fonctionner la librairie. M\u00eame avec les techniques propos\u00e9es par les plugins \"Stealth\" je n'arrivais pas \u00e0 bypass les s\u00e9curit\u00e9es de la page de login de la F1TV. J'ai essay\u00e9 tout ce que j'ai pu trouver sur internet mais on se fait toujours chopper d\u00e8s que l'on arrive sur la page. Et le pire de tout, impossible de faire fonctionner un vid\u00e9o. J'ai pu faire tout ce que je voulais faire au final en passant par l'utillisation de cookies pour la connexion. Tout ca pour arriver au moment ou il faut lancer la vid\u00e9o, et la, crash. Impossible de faire fonctionner Puppeteer Sharp avec une vid\u00e9o. D\u00e8s qu'elle se lance c'est un crash assur\u00e9 sans message d'erreur clair. Et le soucis c'est que le wrapper C# n'est pas vraiment bien support\u00e9 et que si c'est un bug de la lib je ne risque pas de voir de fix avant un moment si ce n'est jamais. Pour toutes ces raisons, j'ai du abandonner cette librairie ce qui a \u00e9t\u00e9 tr\u00e8s dur car j'avais pass\u00e9 beaucoup de temps dessus \u00e0 essayer de la faire marcher. Ensuite le choix de Selenium \u00e9tait plut\u00f4t simple, c'\u00e9tait la seule option restante. A ce jour je ne connait aucune autre librairie que Puppeteer ou Selenium qui puisse contr\u00f4ler un Firefox Headless en respectant mon cahier des charges et qui soit donc disponible depuis C#. Si je n'arrivais pas \u00e0 faire fonctionner Selenium j'aurai du abandonner l'id\u00e9e de simuler un navigateur tout simplement. Mais j'ai eu la chance que cette librairie fasse tout ce que je pouvais demander. C'est une super lib et m\u00eame si la version C# n'est vraiment pas bien document\u00e9e, la plupart des documentations de la version JS sont pertinentes pour al version C# m\u00eame si ca n'est pas la m\u00eame syntaxe. Pour r\u00e9sumer, j'ai choisis Puppeteer car c'\u00e9tait la seule option viable pour mon besoin. (Note : Par contre si je trouve la personne chez mozilla ou puppeteer qui a d\u00e9cid\u00e9 d'hardcoder la r\u00e9solution maximale du browser Headless que l'on peut override UNIQUEMENT en changeant les variables d'environnement de la machine ET DE NE LE DOCUMENTER QUASI NULLE PART JE JURE QUE CA VA TRES MAL SE PASSER)","title":"Selenium"},{"location":"index.html#csharp","text":"\"Logo C#\" Je pense que c'est le choix le plus simple \u00e0 expliquer. C# est un language de programmation orient\u00e9 objet relativement haut niveau qui a \u00e9t\u00e9 cr\u00e9\u00e9 par Microsoft et qui a comme cible le developpement d'applications pour Windows. (On peut evidemment trouver des adaptations pour le faire tourner sur Linux mais ce n'est pas vraiment le but du language) En plus d'\u00eatre un superbe language de programmation, c'est le language que l'on apprend au CFPT informatique. C'est donc un language avec lequel je suis beaucoup plus \u00e0 l'aise que pour d'autres languages comme le Python ou le JS. Mon but n'\u00e9tait pas de faire une application Web et je travaille sous Windows. Je savais que mon projet allait demander un minimum de programmation orient\u00e9e objet. J'ai donc imm\u00e9diattement pens\u00e9 \u00e0 utliser C#. Cependant j'aurais tr\u00e8s bien pu utiliser un language comme python qui m'aurait clairement facilit\u00e9 la t\u00e2che avec des librairies bien plus fournies et plus souvent mises \u00e0 jour. Mais comme je ne suis pas du tout aussi \u00e0 l'aise avec je pense que le C# \u00e9tait la meilleure option. Mes seuls regrets apr\u00e8s coup sont que je trouve les Windows Forms tr\u00e8s moches et qu'il est particuli\u00e8rement difficile de les rendres plus jolies et que les librairies disponibles en C# pour des sc\u00e9narios tr\u00e8s pr\u00e9cis ne sont pas au niveau de celles pour JS et pour Python. Cependant si j'avais \u00e0 refaire le projet je reprendrais C# je pense.","title":"CSharp"},{"location":"index.html#python","text":"\"Logo Python\" Alors ce choix la est plus commpliqu\u00e9 \u00e0 comprendre. Pour tout le projet j'ai tent\u00e9 de garder le C# comme language et de ne pas utiliser autre chose. Cependant j'ai du utiliser une seule fois le Python dans un cas tr\u00e8s pr\u00e9cis. Je n'aime vraiment pas coder en python de base et clairement j'aurais pr\u00e9f\u00e8r\u00e9 ne pas l'utiliser mais je n'avais pas le choix. Le besoin dans le cas du python \u00e9tait le suivant : J'avais besoin d'un moyen de r\u00e9cup\u00e8rer des strings et les d\u00e9coder avec une cl\u00e9 encod\u00e9e avec le syst\u00e8me propri\u00e9taire de windows d'encodage. Le soucis que j'avais avec le C# c'est que les methodes de decryption ne fonctionnent pas pareil que en python et tous les exemples que je pouvais trouver \u00e9taient en python. J'ai essay\u00e9 pendant un sacr\u00e9 moment de faire fonctionner la decryption en C# mais sans succ\u00e8s. J'ai donc directement utilis\u00e9 le python comme faisait toutes les personnes que je pouvais voir sur internet et je pense que ca n'est pas une mauvaise id\u00e9e. En effet, cela veut dire que si \u00e0 un moment Chrome est mis \u00e0 jour, je n'aurai pas besoin d'aller ouvrir tout le code source de mon projet pour tout recompiler, j'aurai simplement besoin de changer ce script. Un des avantages du Python est quand m\u00eame qu'il y beaucoup plus de gens qui codent dessus, et pour ce genre d'utilisation tr\u00e8s sp\u00e9cifiques c'est plut\u00f4t pratique. Le seul probl\u00e8me c'est que cela oblige l'utilisateur \u00e0 avoir python install\u00e9 sur sa machine et que sa version doit \u00eatre compatible... (les joies de python)","title":"Python?"},{"location":"index.html#firefox","text":"\"Logo Firefox Headless\" J'en parle deja plus bas, mais le choix de navigateur est super important. Deja tous les navigateurs n'ont pas un mode Headless(sans t\u00eate, mieux expliqu\u00e9 dans la rubrique \"Simuler un naviguateur ?\"). Par exemple, m\u00eame si Edge est maintenant bas\u00e9 sur chromium, il n'existe pas de moyen de le faire tourner en Headless pour le moment. Autre soucis, les librairies d'automatisation ne supportent pas tous les navigateurs. Par exemple, beaucoup supportent chrome mais tr\u00e8s peu supportent Firefox ou Edge. Donc il me fallait un navigateur qui puisse op\u00e8rer en Headless et qui soit support\u00e9 par plusieurs librairies d'automatisation. Il n'y a que Firefox et Chrome qui sont conforme \u00e0 ces exigeances (Je n'ai pas verifi\u00e9 pour TOUS les navigateurs. Peut-\u00eatre que les Opera GX ont aussi un mode headless super, mais je me suis concentr\u00e9 sur les navigateurs plus grand public). Chrome est support\u00e9 par plus de lib, mais le soucis c'est que la F1TV utilise un lecteur de vid\u00e9o avec DRM (Plus d'infos la dessus dans la partie \"Simuler un navigateur?\") et donc le choix \u00e9tait simple. Il ne restait que Firefox.","title":"Firefox"},{"location":"index.html#tesseract","text":"Je pense que le choix le plus simple apr\u00e8s le C# fut l'utilisation de Tesseract. C'est tout simplement l'outil le plus utilis\u00e9 pour faire de l'OCR. A la base c'est une lib Python (Ah tiens encore ?) qui peut \u00eatre redoutablement efficace avec le bon dataset. Il existe d'autres outils mais j'ai d\u00e9cid\u00e9 de prendre celui la \u00e0 cause de son support juste incroyable et de son omnipr\u00e9sence dans la documentation OCR. En plus il est facile \u00e0 utiliser et je ne pense pas encore avoir fait le tour de tout son potentiel dans ce projet.","title":"Tesseract"},{"location":"index.html#fonctionnement-general","text":"Avant de passer \u00e0 l'explication de chaques parties du projet en d\u00e9tail, je pense qu'il est important de faire un petit point sur comment toutes les parties du projet s'emboitent et fonctionnement ensemble. Comme ca quand vous lirez l'explication d'une \u00e9tape vous serez conscient de \u00e0 quoi elle sert et ou elle s'\u00eenscrit dans le projet principal.","title":"Fonctionnement g\u00e9n\u00e9ral"},{"location":"index.html#les-briques-principales","text":"Voici trois grosses \u00e9tapes du projet. Pour rappel ce sont des vulgarisations plut\u00f4t larges qui n'ont qu'un seul but, aider \u00e0 la compr\u00e9hension de ce qui vient par la suite.","title":"Les briques principales"},{"location":"index.html#recuperation-dimages","text":"\"Diagramme simplifi\u00e9 repr\u00e9sentant le processus de r\u00e9cup\u00e8ration des images\" Pour faire simple on peut voir qu'il y a deux parties \u00e0 cette \u00e9tape. La premi\u00e8re en partant du haut repr\u00e9sente un script python qui va chercher des informations dans la base de donn\u00e9es de Chrome qui est en SQLITE. Ces informations dans notre cas sont les cookies de connexion. Dans la seconde \u00e9tape, on peut voir que le programme utilise Selenium avec un navigateur Firefox Headless qui va aller communiquer avec la F1TV qui est le site web qui nous int\u00e9resse et que une des infos que l'on r\u00e9cup\u00e8re est une image de la page en format PNG que l'on envoie au programme C#. Ces deux partie sont li\u00e9es car pour se connecter \u00e0 la F1TV Selenium a besoin des cookies de connexion r\u00e9cup\u00e8r\u00e9s par le programme Python. La premi\u00e8re partie est un processus qui n'est utilis\u00e9 qu'une seule fois au d\u00e9marrage tandis que la r\u00e9cup\u00e9ration d'images et en continu pendant toute la dur\u00e9e de l'utilisation de l'application.","title":"Recup\u00e9ration d'images"},{"location":"index.html#ocr","text":"\"Diagramme simplifi\u00e9 repr\u00e9sentant le processur d'OCR\" ; On peut voir dans ce diagramme simplifi\u00e9 qu'avec l'aide de ce que contient le fichier \"Config.JSON\" on d\u00e9coupe l'image que l'on a r\u00e9cup\u00e8r\u00e9 au pr\u00e9alable en petits morceaux qui continennent des informations. Ensuite on prend cette image et on lui applique un filtre pour retirer le flou la couleur etc... Puis en utilisant de l'OCR (Optical Character Recognition) on en r\u00e9cup\u00e8re les informations sous forme de texte et on le renvoie dans le programme C# Dans cette partie explicative g\u00e9n\u00e9rale, on ne reviendra pas sur la cr\u00e9ation de ce fichier config. Pour plus d'infos \u00e0 son sujet voir la rubrique (OCR/Fonctionnement g\u00e9n\u00e9ral)","title":"OCR"},{"location":"index.html#traitement-et-affichage","text":"\"Diagramme simplifi\u00e9 repr\u00e9sentant le processus de traitement et d'affichage\" On peut voir dans ce dernier mini diagramme simplifi\u00e9 que on prend les donn\u00e9es que l'on r\u00e9cup\u00e8r\u00e9 de l'\u00e9tape pr\u00e9c\u00e9dente qui ne sont pas forc\u00e9ment toutes coh\u00e9rentes et qu'on les traite pour leur redonner du sens avant de les stocker dans une base de donn\u00e9es SQLITE. Ensuite cette m\u00eame base de donn\u00e9e fournis les infos nescessaires pour des affichages (Ces affichages sont directements r\u00e9cup\u00e8r\u00e9s depuis le projet en cours de fonctionnement)","title":"Traitement et affichage"},{"location":"index.html#resume-du-fonctionnement-general","text":"\"Diagramme simplif\u00e9 repr\u00e9sentant le processus g\u00e9n\u00e9ral du projet\" Ce dernier diagramme est un sch\u00e9ma fait pour repr\u00e9senter de la mani\u00e8re la plus simple possible toutes les briques du projet et comment elles s'imbriquent ensemble. La repr\u00e9sentation est un peu diff\u00e9rentes des 3 autre diagramme car le but ici est surtout de montrer le chemin que fait la donn\u00e9e \u00e0 travers les couches Toutes les parties du projet ne sont pas incluses, notamment la partie calibration dans un objectif de simplifier la lecture. Dans l'ordre, on peut voir que pour la partie r\u00e9cup\u00e8ration d'images, le python va r\u00e9cup\u00e8rer les cookies dans la base de donn\u00e9es chrome pour ensuite les retourner \u00e0 Selenium. Selenium va ensuite pouvoir lancer un navigateur (en l'occurence Firefox) et utiliser les cookies r\u00e9cup\u00e8r\u00e9s pour aller sur la page de la F1TV qui va retourner un certain nombre d'infos \u00e0 Selenium. L'info qui nous int\u00e9resse le plus depuis Selenium c'est les images de la page data de la F1Tv et c'est elles que l'on va envoyer dans la partie LOAD du diagramme. Dans cette partie on prend l'image de la F1TV et on la decoupe selon les directives donn\u00e9es par le fichier Config.JSON (il renseigne les zones \u00e0 d\u00e9couper et ce qu'elles repr\u00e9sentent) et apr\u00e8s le d\u00e9coupage on se retrouve avec une zone principale, vingt zones de pilotes et 9 fen\u00eatres de donn\u00e9es par zone de pilote donc 180 fen\u00eatres en tout. Ces fen\u00eatres sont ensuite envoy\u00e9es pour \u00eatre filtr\u00e9es (retirer le flou, mettre en \u00e9vidence les caract\u00e8res, en gros les pr\u00e9parer pour la reconnaissance) dans la partie OCR Dans cette partie, apr\u00e8s avoir filtr\u00e9 les images, on les envoie \u00e0 Tesseract pour qu'il nous retourne des r\u00e9sultats d'OCR. Ces r\u00e9sultats sont ce que Tesseract a trouv\u00e9 sur les image et ils sont retourn\u00e9s sous al forme de Data Pilote. Ex (Position: 1,Tour : 45, Temps au tour : 1:34.683, Pneus: Medium etc....) Finalement ces donn\u00e9es ont envoy\u00e9es dans la partie traitement qui va faire des v\u00e9rifications d'usage pour s'assurer qu'elles sont correctes et quand c'est fait, tout est envoy\u00e9 dans une base de donn\u00e9es SQLITE. On ne montre pas non plus dans ce diagramme la parte affichage des donn\u00e9es car je ne trouve pas pertinent de l'inclure ici. Et voila c'est le fonctionnement tr\u00e8s g\u00e9n\u00e9ral et simplifi\u00e9 de l'application. Je vous invite \u00e0 continuer \u00e0 lire cette documentation pour des informations plus pr\u00e9cises \u00e0 propos de toutes ces \u00e9tapes. Bonne lecture !","title":"R\u00e9sum\u00e9 du fonctionnement g\u00e9n\u00e9ral"},{"location":"index.html#recuperation-des-images","text":"Voici la premi\u00e8re grande \u00e9tape du projet. Pour rappel, Amazon h\u00e9berge directement le site de la F1TV et poss\u00e8de les droits sur les donn\u00e9es de la F1. C'est sous le nom de AWS (le service d'h\u00e9bergement d'Amazon) que la firme apparait en tant que sponsor. On peut voir ce nom appara\u00eetre assez souvent quand on regarde un Grand Prix car comme ils ont la main-mise sur les donn\u00e9es ils peuvent ins\u00e8rer des bandeaux d'informations sur le flux public sur ce qu'il se passe voir m\u00eame faire des pr\u00e9dictions (Bien qu'un peu bancales) \"Exemple insertion AWS en GP\" Ce service s'appelle F1 Insights (Oui c'est un meilleur nom de projet que F1 Companion mais bon) et c'est, je pense, la raison pour laquelle on ne voit aucune API publique qui permette de correctement se renseigner en don\u00e9es en direct pendant un Grand Prix. Ils ont du d\u00e9gotter un juteux contrat pour s'occuper de toute l'infrastructure digitale de la F1 (du moins publique) en \u00e9change d'une exclusivit\u00e9 totale sur certaines choses comme les Data \"Exemple data d'AWS\" Evidemment je ne fais que conjecturer et ce que j'ai dit n'est pas \u00e0 prendre au pied de la lettre mais c'est une explication possible je pense de pourquoi il est si difficile de trouver des donn\u00e9es sur la F1 facilement en temps r\u00e9el. Il existe bien quelques API un peu bancales publiques, mais le probl\u00e8me c'est qu'elles ne sont vraiment pas suffisante et je ne peux pas leur faire confiance quand je commente. Ce qu'il m'aurait fallut c'est une API publique et officielle qui me permette d'\u00eatre sur que les donn\u00e9es sont les bonnes et qu'elles arrivent le plus vite possible. On pourrait croire que c'est impossible car cela n'existe pas comme je l'ai dit MAIS ! Ce n'est pas compl\u00eatement vrai. En effet depuis que je poss\u00e8de un abonnement \u00e0 la F1TV, il existe une source d'informations tr\u00e8s pr\u00e9cieuse qui m'aide \u00e9norm\u00e9ment dans mon quotidien de commentateur de Formule 1. La \"DATA CHANNEL\". La Data Channel est une page de la F1TV qui permet, pour chaque Grand Prix, de visualiser, sous la forme d'un flux vid\u00e9o, diff\u00e9rentes informations capitales sur la course. \"Exemple de Data Channel\" Le probl\u00e8me, c'est que comme je viens de le dire, ces donn\u00e9es ne sont pas accessibles comme un tableau HTML ou un flux RSS ou un tableau JSON. C'est un flux vid\u00e9o. Il faut savoir qu'entretenir une diffusion de flux vid\u00e9o en 1080P pendant deux heures accessible par des milliers d'abonn\u00e9s est EXTR\u00caMENT cher surtout quand on le compare \u00e0 simplement afficher les donn\u00e9es dans un tableau. Ce qui veut dire que ce choix est d\u00e9lib\u00e9r\u00e9 et a un sens au niveau \u00e9conomique. Je pense donc que c'est justement pour \u00e9viter que des petits malins puissent simplement venir scraper l'int\u00e9gralit\u00e9 des donn\u00e9es qu'ils proposent et fasse sa propre API. (C'est d'ailleurs un des sites avec la meilleure protection anti bot du monde) MAIS ce n'est pas par ce que les donn\u00e9es ne sont pas facile \u00e0 avoir qu'elles sont IMPOSSIBLE \u00e0 avoir. Et c'est la que ce projet entre en jeu. Mais pour d\u00e9coder les donn\u00e9es d'une image il faut dabord ... (roulement de tambours) ... Avoir des images ! Et c'est la que vient se glisser cette partie du projet.","title":"R\u00e9cup\u00e9ration des images"},{"location":"index.html#comment-faire","text":"Le but de ce segment est de se concentrer sur la r\u00e9cup\u00e8ration et la mise \u00e0 disposition pour le reste du programme, des images en direct de la F1TV dans la meilleure qualit\u00e9 possible et dans les meilleurs d\u00e9lais. Pour ce faire il y a plusieurs solutions : Reverse engeneer la F1TV pour acc\u00e8der directement au flux sans passer par la plateforme internet et pouvoir prendres images \u00e0 volont\u00e9. Avoir tout simplement une page de la F1TV ouverte sur un \u00e9cran et prendres des screenshots \u00e0 intervals r\u00e9guliers. Simuler un navigateur internet sans qu'il soit affich\u00e9 et le contr\u00f4ler automatiquement pour qu'il prenne des captures. La premi\u00e8re option aurait \u00e9t\u00e9 la plus \u00e9l\u00e9gante mais lors d'un POC que je tentais de r\u00e9aliser je me suis rendu compte que cela serait un peu trop compliqu\u00e9 et long \u00e0 faire. Sans compter le fait que les rediffusions de Grand Prix ne sont pas g\u00e8r\u00e9es de la m\u00eame mani\u00e8re que les diffusions en live. Et que pour faire des Tests en live il faudrait attendre \u00e0 chaque fois un weekend de Grand Prix et le faire en plus du commentaire que je dois produire. Pour toutes ces raisons et bien d'autres je l'ai rang\u00e9e dans la case \"Trop dur, Trop chiant, S\u00fbrement ill\u00e9gal\" (Oui je sais c'est une cat\u00e9gorie bien sp\u00e9cifique mais c'est ma documentation je fais ce que je veux) La troisi\u00e8me option aurait \u00e9t\u00e9 la plus simple (et moins dr\u00f4le) et je suis presque s\u00fbr que je peux impl\u00e9menter cette derni\u00e8re en moins d'une apr\u00e8s-midi. Sauf qu'elle apporte de gros soucis. On ne peux pas garantir l'int\u00e9grit\u00e9 et la continuit\u00e9 des donn\u00e9es si l'utilisateur avance ou fait pause m\u00eame par simple inadvertance. La moindre fen\u00eatre qui s'afficherait devant ruinerait toute la reconnaissance de caract\u00e8res. On ne peut pas contr\u00f4ler la qualit\u00e9 du flux et on est oblig\u00e9 de faire confiance en l'utilisateur On ne peut pas vraiment automatiser quoi que ce soit niveau tests ou m\u00eame pour faire du scrapping auto pour remplir une base de donn\u00e9e. Et finalement le pire inconv\u00e9nient : C'EST NUL ! Je ne pourrais jamais utiliser un projet qui fonctionne de cette facon, je ne peux pas me permettre d'avoir un \u00e9cran inutilisable quand je commente et auquel je dois constamment faire attention pour ne pas perturber la reconnaissance. Pour moi cette option aurait \u00e9t\u00e9 celle \u00e0 choisir en cas d'extr\u00eame urgence et en dernier recours car le projet deviendrait inutile. J'ai donc d\u00e9cid\u00e9 de m'occuper de la seconde option : Simuler un navigateur. Cette option bien que complexe et difficile \u00e0 impl\u00e9menter propose une solution \u00e0 tous les probl\u00eame et permet une r\u00e9cup\u00e8ration quasi sans compromis.","title":"Comment faire ?"},{"location":"index.html#simuler-un-navigateur","text":"\"Navigateur Headless(sans t\u00eate)\" Simuler un navigateur internet n'est pas forc\u00e9ment tr\u00e8s difficile. Chromium par exemple offre une panoplie d'outils natifs et \u00e9norm\u00e9ment de librairies existent permettant de facilement et en quelques lignes simuler un Google Chrome et le contr\u00f4ler sans afficher son UI (Interface Utilisateur). \"Chromium logo\" {: style=\"height:150px;width:150px\"} Cependant. La F1TV n'utilise pas simplement un player HTML5 basique. Elle utilise un service de streaming BitMovin qui permet de fournir un stream de bonne qualit\u00e9 et surtout qui impl\u00e9mente les DRM (Digital Right Management) Cela veut dire que quand on ouvre un flux de la F1TV sur chrome et que l'on essaie de prendre une capture d'\u00e9cran, le player se met en noir et ne permet pas de voir quoi que ce soit (Certaines version de Chrome le permettent pendant quelques semaines avant de bloquer \u00e0 nouveau). Ce qui dans notre cas est un immense probl\u00e8me. Mais Firefox ne nous bloque pas de cette facon et il est donc assez facile de passer outre. L'explication sans trop rentrer dans les d\u00e9tails est la suivante : Dans chrome, le player par d\u00e9faut utilise une technologie appell\u00e9e \"PCP\" ou \"Protected Content Playback\" qui leur permet de bloquer au moins une partie des techniques de r\u00e9cup\u00e8ration du flux vid\u00e9o et audio. Cependant Firefox de pas sa nature Open Source utilise \"OpenH264\" pour lire ces m\u00eames flux soumis \u00e0 des DRM et OpenH264 n'impl\u00e9mente pas les m\u00eames restrictions. Sauf que Firefox n'est pas aussi facilement \u00e9mul\u00e9 que chrome et cela r\u00e9duit notre choix de librairies \u00e0 ... Une seule... Qui est Selenium. (Il existe aussi Pupetteer C# mais j'ai rencontr\u00e9 \u00e9norm\u00e9ment de soucis avec cette derni\u00e8re d\u00e8s que je voulais lancer une vid\u00e9o) \"Firefox dev logo\" {: style=\"height:150px;width:150px\"} Mais m\u00eame si la documentation est plut\u00f4t maigre parfois, c'est une bonne librairie qui permet de tr\u00e8s bien contr\u00f4ler une instance de chrome ou de Firefox.","title":"Simuler un navigateur ?"},{"location":"index.html#controler-le-navigateur","text":"Maintenant que l'on sait quel navigateur simuler et avec quelle technologie, on peut passer \u00e0 la r\u00e9alisation. Ce qu'il y a de bien avec Selenium, c'est qu'on a un certain nombre de commandes tr\u00e8s haut niveau qui nous permettent de contr\u00f4ler un navigateur de mani\u00e8re plut\u00f4t pr\u00e9cise. Je vais d\u00e9crire ici la proc\u00e9dure habituelle utilis\u00e9e sous une forme de recette de cuisine pour que l'on puisse facilement comprendre ce qu'il se passe. Durant cette explication je vais parler \u00e0 un moment de Cookies, ne vous en faites pas c'est le sous chapitre suivant qui va vous en parler. Recette de cuisine pour r\u00e9cup\u00e8rer des images de la F1TV : D\u00e9marrer une instance de navigateur avec les bons arguments Ajouter les bons param\u00eatres pour ne pas se faire flag comme un bot Naviguer sur la page de la F1TV Ajouter les cookies de connexion pour avoir acc\u00e8s au contenu de la page Naviguer sur la page du Grand Prix demand\u00e9 Attendre un peu que la page se charge Cliquer sur l'invite de cookies Attendre cinq secondes le temps que la page se reload Cliquer sur le bouton qui permet de passer du feed live \u00e0 la DATA CHANNEL Appuyer sur Espace pour faire apparaitre le bouton d'acc\u00e8s au param\u00eatres Cliquer sur le menu d\u00e9roulant des r\u00e9solution Trouver l'option 1080P et la selectionner Cliquer sur le bouton qui met la vid\u00e9o en plein \u00e9cran Prendre de screenshots \u00e0 intervales r\u00e9guliers Pour faire toutes ces actions on doit r\u00e9cup\u00e8rer les \u00e9l\u00e9ments selon leur ID ou leur classe. Voici un exemple qui r\u00e9cup\u00e8re le bouton de plein \u00e9cran et qui clique dessus : IWebElement fullScreenButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-fullscreentogglebutton\" )); fullScreenButton . Click (); Ca peut para\u00eetre plut\u00f4t simple dit comme ca et quand tout fonctionne ca l'est mais la difficult\u00e9 vient du fait que \u00e0 peu pr\u00e8s nimporte laquelle de ces \u00e9tapes peut rater et qu'il faut donc faire un bon syst\u00e8me de gestion d'erreurs qui puisse aider l'utilisateur en cas de probl\u00e8me. Parfois il est aussi difficile de trouver un \u00e9l\u00e9ment selon son ID,sa classe, ou sa value. Par exemple l'option qui permet de passer en 1080P peut avoir comme value 1080_9011456 ou 1080_9011200 si on refresh la page. Cela demande de passer par des expression r\u00e9guli\u00e8res ce qui n'est pas compliqu\u00e9 en soi mais c'est toutes ces petites choses qui rendent le processus long \u00e0 mettre en place. Il faut dire aussi que les sites ne sont pas forc\u00e9ment tr\u00e8s content de voir des bots passer car cela peut \u00eatre un risque de DDOS et de Scraping (Comme moi) et donc ils mettent en place des syst\u00e8mes pour nous emp\u00eacher de faire ce que l'on veut On peut utiliser diff\u00e9rntes techniques pour passer outre ces restrictions comme : Changer son UserAgent Changer sa r\u00e9solution Ne pas avoir des patterns trop pr\u00e9visibles Avoir un historique Ne pas cliquer pile sur le milieu des boutons Ne pas cliquer trop vite Passer par un proxy pour ne pas se faire flag Utiliser des librairies plus discr\u00e8tes J'ai eu l'occasion de tester toutes ces methodes pour tenter de passer derri\u00e8re les radars de la F1TV et visiblement j'ai r\u00e9ussi pour les pages principales mais pas pour les pages de Login. Il faut savoir que la bataille entre bots et propri\u00e9taires de sites est un grand jeu du chat et de la souris et que les plateformes innovent constamment leur s\u00e9curit\u00e9. Et il se trouve que la partie login de la F1TV est heberg\u00e9e autre part que le reste du site chez Amazon et que elle poss\u00e8de les meilleures s\u00e9curit\u00e9s que j'aie pu voir. Aucunes des methodes que j'ai cit\u00e9es et d'autres encore que j'ai essay\u00e9 n'ont r\u00e9ussi \u00e0 fourvoyer le syst\u00e8me. J'ai donc \u00e9t\u00e9 oblig\u00e9 de faire appel \u00e0 la connexion par Cookies pour pouvoir acc\u00e8der au reste du site internet.","title":"Contr\u00f4ler le navigateur"},{"location":"index.html#recuperer-les-cookies","text":"Alors, on va mettre de c\u00f4t\u00e9 toutes les questions de s\u00e9curit\u00e9 et de violation de la vie priv\u00e9e et de protection des donn\u00e9es des utilisateurs pour ce chapitre. Car pour faire simple, je siphonne TOUS les cookies de la persone qui utilise mon app. Alors \u00e9videmment ca n'est pas pour faire des b\u00e9tises avec et c'est pour une \"bonne\" raison, mais bon quand m\u00eame ca peut faire bizarre comme ca. Je pense que vous savez d\u00e9ja ce qu'est un Cookie, mais je vais quand m\u00eame faire un petit point la dessus car c'est important pour la suite. Quand on va sur un site internet et que l'on se connecte avec nos identifiants nous sommes connect\u00e9s sur la session. Cependant, si on quitte le site ou que l'on ferme le navigateur, le site ne peut pas garder en m\u00e9moire que c'est bien vous quand le lendemain vous retournez dessus. Pour palier \u00e0 cette limitation on a invent\u00e9 cette chose magnifique (hem...) que sont les cookies ! Les cookies sont des petits fichiers qui sont stock\u00e9s dans votre navigateur et qui peuvent servir \u00e0 beaucoup de choses comme traquer votre activit\u00e9 sur internet et espionner un peu ou aussi par exemple, servir de jeton de connexion. L'id\u00e9e est que quand vous vous connectez sur le site avec vos identifiants, le site envoie un petit fichier dans votre navigateur qui va servir de jeton. Et donc quand vous reviendrez, le site pourra voir que vous avez le jeton et vous connectera automatiquement. Ca peut para\u00eetre g\u00e9nial, et c'est effectivement bien pratique, cependant ce n'est pas sans risques. En effet, imaginons qu'un acteur malveillant parvienne \u00e0 s'emparer de ces petits fichiers, il pourrait ainsi facilement se faire passer pour vous. Alors un cookie expire \u00e0 un moment donn\u00e9 pour temperer les risques, mais ils sont toujours pr\u00e9sents. Dans notre cas on peut vite comprendre pourquoi cela peut \u00eatre int\u00e9ressant de r\u00e9cup\u00e8rer ces cookies. En effet, si on peut mettre la main sur le jeton de connexion de l'utilisateur de notre application. On pourra se connecter automatiquement \u00e0 la F1TV et aller prendre des photos directement sans que l'utilisateur aie \u00e0 faire quoi que ce soit. Sauf que les cookies ne sont pas stock\u00e9s en clair comme ca. Evidemment Google Chrome a mis en place quelques techniques pour \u00e9viter que nimporte qui puisse s'amuser \u00e0 aller taper dans les cookies de la machine. Tous les cookies sont stock\u00e9s dans une base de donn\u00e9es sqlite avec les noms en clair et les valeurs sont encrypt\u00e9es en utilisant la methode AES 256 qui est une methode de cryptage tr\u00e8s utilis\u00e9e et efficace. Tellement efficace qu'il serait compl\u00eatement inutile de tenter de les decrypter en utilisant de la force brute pour trouver la valeur ou m\u00eame une attaque de dictionnaire ou quoi que ce soit. Si ces valeurs peuvent \u00eatre encod\u00e9es et d\u00e9cod\u00e9es en local sur la machine sans connexion internet, cela veut dire que la cl\u00e9 est stock\u00e9e sur la machine. Et si je peux mettre la mais sur cette cl\u00e9 alors je pourrai lire tous les cookies de la machine. Cette cl\u00e9 est stock\u00e9 dans les fichiers de Google Chrome sous Google\\Chrome\\User Data\\Local State . Et dans ce fichier on peut trouver une liste de donn\u00e9es en cl\u00e9 valeurs et on peut trouver la cl\u00e9 sous os_crypt encrypted_key . On pourrait croire que l'on a d\u00e9ja touch\u00e9 le jackpot mais il reste encore une \u00e9tape. Cette cl\u00e9 est crypt\u00e9e en utilisant le syst\u00e8me d'encryption de Windows. Cette encryption est utilis\u00e9e pour emp\u00eacher des utilisateurs non connect\u00e9s d'acc\u00e8der \u00e0 certaines donn\u00e9es. Mais comme nous sommes connect\u00e9s nous pouvons facilement utiliser les librairies de decryption pour trouver la valeur de cette cl\u00e9. Et \u00e0 partir de la il suffit d'utiliser cette cl\u00e9 pour d\u00e9crypter tous les cookies de la machine pour aller chercher ceux qui nous int\u00e9ressent. Voici un exemple du code python qui permet d'aller chercher la cl\u00e9 d'encryption dans les fichiers de Google Chrome : def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key Python ?? Et oui j'ai choisit d'utiliser un srypt python pour aller chercher les cookies. Ce choix a \u00e9t\u00e9 fait pour trois raisons : Le python est un language que je n'aime pas particuli\u00e8rement mais qui poss\u00e8de un \u00e9ventail de librairies absolument fantastique. Et pour ce genre de choses qui demandent une constante mise \u00e0 jour des librairies et qui sont un peu niches le python est une option juste g\u00e9niale. Comme c'est une des parties qui est le plus suceptible de changer vu que Chrome change relativement souvent le syst\u00e8me de stockage des cookies. Dans une optique de facilit\u00e9 de maintenance, avoir un seul fichier qui concerne cette partie du projet et qui est dans un language que plus de gens maitrisent que C# est pratique. Je n'ai pas r\u00e9ussi \u00e0 trouver de librairies C# qui me donne des r\u00e9sultats identiques \u00e0 celles que j'utilise dans ce script python. Pour faire la liaison entre le C# et le python, j'appelle le script depuis mon C# et ensuite le python s'occupe de mettre tous les cookies dans un CSV qui est ensuite lu depuis le C#. Voici la partie python qui \u00e9crit dans le csv : if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" ) Et la partie C# qui appelle le script et qui lit le CSV : private void StartCookieRecovering () { string scriptPath = PYTHON_COOKIE_RETRIEVAL_FILENAME ; Process process = new Process (); process . StartInfo . FileName = \"python.exe\" ; process . StartInfo . Arguments = scriptPath ; process . StartInfo . UseShellExecute = false ; process . StartInfo . RedirectStandardOutput = true ; process . Start (); string output = process . StandardOutput . ReadToEnd (); process . WaitForExit (); } public string GetCookie ( string host , string name ) { StartCookieRecovering (); string value = \"\" ; List < Cookie > cookies = new List < Cookie >(); using ( var reader = new StreamReader ( COOKIES_CSV_FILENAME )) { // Read the header row and validate column order string header = reader . ReadLine (); string [] expectedColumns = { \"host_key\" , \"name\" , \"value\" , \"path\" , \"expires_utc\" , \"is_secure\" , \"is_httponly\" }; string [] actualColumns = header . Split ( ',' ); for ( int i = 0 ; i < expectedColumns . Length ; i ++) { if ( expectedColumns [ i ] != actualColumns [ i ]) { throw new InvalidOperationException ( $\"Expected column '{expectedColumns[i]}' at index {i} but found '{actualColumns[i]}'\" ); } } // Read each data row and parse values into a Cookie object while (! reader . EndOfStream ) { string line = reader . ReadLine (); string [] fields = line . Split ( ',' ); string hostname = fields [ 0 ]; string cookieName = fields [ 1 ]; if ( hostname == host && cookieName == name ) { value = fields [ 2 ]; } } } return value ; } Maintenant que l'on sait comment simuler et manipuler un navigateur internet, que l'on sait comment se connecter sur le compte F1TV de l'utilisateur sans qu'il n'aie rien \u00e0 faire. On a tous les ingr\u00e9dients pour automatiquement r\u00e9cup\u00e8rer des images de la F1TV du Grand Prix que l'on souhaite.","title":"R\u00e9cup\u00e8rer les cookies ?"},{"location":"index.html#calibration","text":"Maintenant que l'on a des images de la page Data de la F1TV on pourrait croire que c'est tout bon on peut direct passer \u00e0 la partie OCR. Mais que nenni ! Le gros soucis de l'OCR c'est que sa pr\u00e9cision est grandement r\u00e9duite d\u00e8s que l'on augmente la taille de la zone de recherche. M\u00eame simplement deux mots sur une image, si on les prends dans images individuelles on a de grandes chances de trouver quelque chose mais si on les mets les deux sur la m\u00eame et que on tente l'OCR on va avoir de r\u00e9sultats bien moins bons. Et puis il faut aussi voir que selon les donn\u00e9es que je cherche je ne peux pas faire le m\u00eame traitement. Par exemple, savoir si le DRS est allum\u00e9, savoir quels pneus chausse un pilote et depuis combien de tours et savoir quel est le temps de son dernier tour, ce sont des informations qui demandent des traitements qui n'ont rien \u00e0 voir. Il faut donc pouvoir dire au programme d'OCR ou se trouvent les informations et quelle est leur nature pour qu'il puisse les d\u00e9coder. Il faut donc faire une calibration qui puisse donner toutes les infos importantes mais qui en m\u00eame temps soit facile \u00e0 utiliser car un utilisateur doit \u00eatre capable de le faire assez facilement. Voici la liste des informations que l'on doit r\u00e9cup\u00e8rer : La liste des pilotes pr\u00e9sent sur le Grand Prix La position de la zone principale La position de chaque zone de pilote La position de toutes les Window sur chaque zone de pilote Le but a \u00e9t\u00e9 de retirer le plus d'\u00e9tapes possibles \u00e0 l'utilisateur. Techniquement j'aurais pu faire une version compl\u00eatement manuelle mais ca aurait pris trop de temps alors il y a des syst\u00e8mes qui permettent de rendre cette t\u00e2che moins p\u00e9nible.","title":"Calibration"},{"location":"index.html#liste-des-pilotes","text":"Pour la liste des pilotes j'ai pens\u00e9 \u00e0 utiliser une API externe pour avoir une liste dans laquelle on pourrait selectionner des noms de pilotes sauf que j'ai abandonn\u00e9 l'id\u00e9e car je trouvais que le projet avait d\u00e9ja bien assez de points qui d\u00e9pendent de l'exterieur. Il y a donc une liste de pilotes dans laquelle on peut ajouter ou supprimer des noms de pilotes. L'id\u00e9al serait de mettre tous les pilotes de reserve comme ca si un pilote est malade sur une course on a pas besoin de venir changer la liste.","title":"Liste des pilotes"},{"location":"index.html#zone-principale","text":"Pour la zone principale c'est compl\u00eatement manuel, on attend de l'utilisateur deux points x,y sur l'image pour ensuite avoir une id\u00e9e de ou est sens\u00e9 se trouver la zone. \"Exemple de zone principale\"","title":"Zone principale"},{"location":"index.html#zones-pilotes","text":"C'est la que ca devient int\u00e9ressant. L'utilisateur n'a pas besoin de faire quoi que ce soit pour que le programme sache ou sont les zones des pilotes. J'aurais pu le faire manuellement en faisant choisir \u00e0 l'utilisateur de donner deux points qui correspondent \u00e0 la premi\u00e8re zone et extrapoler pour en avoir 20. Sauf que si l'utilisateur n'est pas pr\u00e9cis au pixel pr\u00e8s (et m\u00eame comme ca parfois) le vingti\u00e8me pilote se retrouve avec une zone compl\u00eatement desax\u00e9e. La, le programme va \"simplement\" effectuer une reconaissance de texte sur toute l'image. Les r\u00e9sultats ne nous int\u00e9ressent pas vraiment tout ce que l'on veut c'est la position des textes. Avec les position il est facile de determiner ou sont toutes les zones de pilotes et donc sans que l'utilisateur n'aie \u00e0 toucher quoi que ce soit, d\u00e8s qu'il a donn\u00e9 les infos pour la zone principale, les zones de pilotes sont determin\u00e9es. \"Exemple zone pilote\" Voici un exemple du code utilis\u00e9 pour trouver ou dessiner des zones de pilotes : public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); List < Zone > zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Image image = MainZone . ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //var text = iter.GetText(PageIteratorLevel.Word).ToUpper(); //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } //DEBUG int i = 1 ; foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); //We add the driver zones Zone driverZone = new Zone ( MainZone . ZoneImage , windowRectangle , \"DriverZone\" ); MainZone . AddZone ( driverZone ); //driverZone.ZoneImage.Save(\"Driver\" + i+\".png\"); i ++; } }","title":"Zones pilotes"},{"location":"index.html#windows-pilotes","text":"C'est ici que c'est le plus p\u00e9nible pour l'utilisateur, il doit selectionner manuellement les positions des fen\u00eatres de donn\u00e9es. Ensuite d\u00e8s que l'utilisateur a donn\u00e9e une position pour chaque window, on applique les positions pour chaque zone de pilote. Il y a plusieurs types de windows et selon le type le traitement est diff\u00e9rent comme je l'ai dit plus t\u00f4t. Voici des exemples concrets : \"Exemple Window de pneus\" \"Exemple Window temps au tour\" \"Exemple window Drs\" Il est important que toutes ces zones soient transmises avec le plus de pr\u00e9cision possible pour que l'OCR puisse bien faire son boulot.","title":"Windows pilotes"},{"location":"index.html#stockage","text":"Ensuite quand l'utilisateur a finit de configurer son flux, la configuration est stock\u00e9e pour qu'il puisse ensuite la r\u00e9utiliser pour tous les autres Grand Prix de l'ann\u00e9e. Le stockage est fait sous format JSON et est fait pour que le programme d'OCR puisse lire dedans toutes les infos nescessaires. Cela fait des fichiers plut\u00f4t gros mais je n'avais pas vraiment le choix. J'ai test\u00e9 une version avec seulement les infos de la premi\u00e8re zone de pilote mais avec l'interpolation, les derniers pilotes se retrouvent avec des zones clairement pas \u00e0 la bonne taille. Voici un exemple de ce \u00e0 quoi ressemble le JSON final : { \"Main\" : { \"x\" : 36 , \"y\" : 343 , \"width\" : 3780 , \"height\" : 1454 , \"DriverZones\" : [ { \"name\" : \"Driver1\" , \"x\" : 0 , \"y\" : 1 , \"width\" : 3780 , \"height\" : 72 , \"Windows\" : [ { \"Position\" : { \"x\" : 45 , \"y\" : 3 , \"width\" : 76 , \"height\" : 65 }, \"GapToLeader\" : { \"x\" : 447 , \"y\" : 1 , \"width\" : 206 , \"height\" : 67 }, \"LapTime\" : { \"x\" : 863 , \"y\" : 3 , \"width\" : 229 , \"height\" : 65 }, \"DRS\" : { \"x\" : 1095 , \"y\" : 1 , \"width\" : 174 , \"height\" : 67 }, \"Tyres\" : { \"x\" : 1274 , \"y\" : 3 , \"width\" : 1448 , \"height\" : 62 }, \"Name\" : { \"x\" : 2724 , \"y\" : 3 , \"width\" : 361 , \"height\" : 65 }, \"Sector1\" : { \"x\" : 3088 , \"y\" : 1 , \"width\" : 239 , \"height\" : 65 }, \"Sector2\" : { \"x\" : 3314 , \"y\" : 4 , \"width\" : 190 , \"height\" : 62 }, \"Sector3\" : { \"x\" : 3493 , \"y\" : 1 , \"width\" : 198 , \"height\" : 67 } } ] }, { \"name\" : \"Driver2\" , \"x\" : 0 , \"y\" : 72 , \"width\" : 3780 , \"height\" : 72 , \"Windows\" : [ { \"Position\" : { \"x\" : 45 , \"y\" : 3 , \"width\" : 76 , \"height\" : 65 }, \"GapToLeader\" : { \"x\" : 447 , \"y\" : 1 , \"width\" : 206 , \"height\" : 67 }, \"LapTime\" : { \"x\" : 863 , \"y\" : 3 , \"width\" : 229 , \"height\" : 65 }, \"DRS\" : { \"x\" : 1095 , \"y\" : 1 , \"width\" : 174 , \"height\" : 67 }, \"Tyres\" : { \"x\" : 1274 , \"y\" : 3 , \"width\" : 1448 , \"height\" : 62 }, \"Name\" : { \"x\" : 2724 , \"y\" : 3 , \"width\" : 361 , \"height\" : 65 }, \"Sector1\" : { \"x\" : 3088 , \"y\" : 1 , \"width\" : 239 , \"height\" : 65 }, \"Sector2\" : { \"x\" : 3314 , \"y\" : 4 , \"width\" : 190 , \"height\" : 62 }, \"Sector3\" : { \"x\" : 3493 , \"y\" : 1 , \"width\" : 198 , \"height\" : 67 } } ] } [ O t her pilo ts ... ] ], \"Drivers\" : [ \"Perez\" , \"Verstappen\" , \"Alonso\" , \"Sainz\" , \"Russel\" , \"Gasly\" , \"Leclerc\" , \"Ocon\" , \"Hulkenberg\" , \"Bottas\" , \"Hamilton\" , \"Albon\" , \"Tsunoda\" , \"Zhou\" , \"Stroll\" , \"De Vries\" , \"Magnussen\" , \"Norris\" , \"Piastri\" , \"Sargeant\" ] } } Et avec tout ca. L'OCR peut d\u00e9marrer dans de bonnes conditions","title":"Stockage"},{"location":"index.html#ocr_1","text":"Maintenant que on a des images qui arrivent automatiquement et que l'on sait ou se trouvent les informations sur ces dites images, je vais parler de la seconde partie du projet qui parle du processus de reconnaissance de data sur une image du feed DATA de la F1TV. C'est je pense la partie qui a demand\u00e9 le plus tests et de refactor. Toute la partie OCR a \u00e9t\u00e9 d\u00e9velopp\u00e9e dans un projet \u00e0 part avant d'\u00eatre int\u00e9gr\u00e9e dans le projet final. Il faut savoir que la reconnaissance est diff\u00e9rente celon ce que l'on cherche. Je vais donc d\u00e9composer cette partie du document en sous rubriques selon les donn\u00e9es recherch\u00e9es. Mais avant ca je dois expliquer certains concepts qui seront importants.","title":"OCR"},{"location":"index.html#fonctionnement-general_1","text":"Voici un screenshot de la page DATA de la F1TV que le programme va recevoir : \"Screen F1TV\" Si on regarde de loin on peut se dire que la structure est plut\u00f4t simple mais c'est loin d'\u00eatre le cas. On peut y voir au moins 4 zones contenant de l'information dans un format diff\u00e9rent. \"Zones principales\" Dans l'exemple ci dessus on peut voir 3 zones mais on aurait \u00e9galement pu comprendre la zone de position des pilotes autour du circuit pour faire 4. Ces 4 zones sont tr\u00e8s diff\u00e9rentes et contiennent d'autres informations. Pour ce travail de dipl\u00f4me je ne m'occupe que de la zone principale. Mais je pense que le titre et les infos de circuit ne prendrait pas tant de temps que ca \u00e0 impl\u00e9menter. J'ai utilis\u00e9 le mot \"Zone\" plus haut et ca n'est pas juste un mot utilis\u00e9 au hasard. C'est le nom de l'objet que j'utilise pour les repr\u00e9senter dans mon programme. Mais comme c'est important de bien comprendre ce concept avant de continuer je vais vous l'expliquer. ZONE : L'objet \"Zone\" parent est un objet qui est une zone d'image. Je m'explique, le but d'une zone est d'\u00eatre un morceau d'une image plus grande. Le but d'une Zone est de contenir une liste de plus petites Zones ou bien une liste de \"Window\" (j'explique ce que c'est juste apr\u00e8s). Elle contient la portion d'image qui la concerne et ses propres dimensions. Le parent zone ne pr\u00e9voit que de pouvoir ajouter ou supprimer des \u00e9l\u00e9ments des listes de zones ou de windows ainsi qu'une methode qui permet d'aller chercher toutes informations des livres qu'elle contient. L'int\u00e9r\u00eat d'une zone est de pouvoir compartimenter une image dans des parties int\u00e9ressantes au niveau de la reconnaissance mais pas de traiter d'information. WINDOW : L'objet \"Window\" est un objet qui peut ressembler beaucoup \u00e0 l'objet \"Zone\". En effet elle aussi est une partie d'une image plus grande et contient ses dimensions, mais elle se distingue en deux points importants. Elle ne contient pas d'autres Zones ou Windows Elle peut retourner les informations \u00e9crites sur son image. Toutes les Window qui h\u00e9ritent du parent Window peuvent impl\u00e9menter une methode qui permet de renvoyer ce qui peut \u00eatre d\u00e9cod\u00e9 sur son image. Les enfants peuvent aussi aller piocher dans les nombresues methodes de r\u00e9cup\u00e8ration de donn\u00e9es contenues dans le parent Window. Mieux vaut r\u00e9utiliser le plus possible que de r\u00e9inventer la roue pour chaque Window. Une analogie un peu bancale pourrait se pr\u00e9senter comme la suivante : La zone est une armoire ou une bibliot\u00e8que. Si c'est une zone qui contient d'autres zones c'est une bibliot\u00e8que et chacune de ces sous-zones sont des armoires. Leur unique but est de contenir de mani\u00e8re ordonn\u00e9e des objets qui eux contiennent de l'information. Les livres ici sont les Windows. Ils contiennet de l'information et sont stock\u00e9s dans des armoires et on y acc\u00e8de en allant dans la bonne bibliot\u00e8que et en allant dans la bonne armoire. Derni\u00e8res choses pour comprendre le diagramme: Il existe une Main Zone qui est une des 4 grandes zones dont je parlais dans la d\u00e9composition de l'image. Il existe aussi des \"Driver Zone\" qui sont de plus petites zones contenues dans la Main Zone qui et qui ne contiennent que les informations d'un pilote. L'objet Window n'est quasi jamais utilis\u00e9, c'est presque tout le temps des enfants de Window plus sp\u00e9cifiques qui sont utilis\u00e9s, le but est que chaque type d'information sur l'image aie son type de window. Voila donc un petit diagramme qui montre le d\u00e9coupage du programme : \"Diagramme explicatif de l'architecture des zones\" Pour visualiser encore un peu mieux comment ce d\u00e9coupage prend forme voici ce que chaque zone et Window contient. Main Zone : \"Exemple zone principale\" Driver Zone : \"Exemple zone de pilote\" Driver Position Window : \"Exemple de fen\u00eatre de position\" Driver name Window : \"Exemple de fen\u00eatre de nom\" Driver LapTime Window : \"Exemple de fen\u00eatre de temps au tour\" Driver Tyre Window : \"Exemple de fen\u00eatre pneus\" Il existe d'autres types de Window mais ce sont les principaux. On se rend assez facilement compte que chacunes de ces windows va avoir besoin d'un traitement sp\u00e9cifique car la mani\u00e8re de reconnaitre le pneu utilis\u00e9 et le temps au tour ne peut pas \u00eatre la m\u00eame. Pour r\u00e9sumer, on a un programme qui prend en entr\u00e9e un fichier de configuration, qui prend des images de la F1TV et les d\u00e9coupe dans des ZONES qui elles m\u00eame sont d\u00e9coup\u00e9es en WINDOWS pour qu'on puisse plus facilement les d\u00e9coder. Maintenant qu'on a une liste de diff\u00e9rent types de zones on peut commencer \u00e0 chercher ce qu'il y a marqu\u00e9 dessus. Pour cela il faut dabord comprendre un petit peu comment l'OCR fonctionne et comment des libraries comme Tesseract fonctionnent pour donner du texte en partant d'une image. Pour faire tr\u00e8s simple, nous avons un mod\u00e8le qui est entrain\u00e9. C'est \u00e0 dire que on donne \u00e0 un programme un tr\u00e8s grand nombre de mots ou de lettres en lui disant ce que contiennent chaques images. Ensuite le programme va cr\u00e9er des matrices de convolutions pour chaque lettre avec comme objectif de detecter les points communs entre les lettres pour cr\u00e9er un alpphabet. Par exemple la matric de la lettre 'H' donnerait un poids important \u00e0 des lignes verticales connect\u00e9es par une ligne centrale. Et si on fournis assez de donn\u00e9es de bonne qualit\u00e9 au mod\u00e8le, les matrices peuvent \u00eatre tr\u00e8s efficace \u00e0 detecter si une lettre est un H ou un M. Il y a pleins d'autres methodes comme l'utilisation d'un dictionnaire de mots de la langue pour permettre la reconnaissance de mots m\u00eame si une lettre au milieu n'est pas comprise ou en ajoutant d'autres informations sur le contexte mais ca ne nous int\u00e9resse pas ici. C'est important de comprendre comment cette reconnaissance de caract\u00e8res avec des matrices fonctionne car cela va nous aider \u00e0 pr\u00e9parer nos donn\u00e9es pour lui rendre la vie facile et augmenter la pr\u00e9cision de nos r\u00e9sultats.","title":"Fonctionnement g\u00e9n\u00e9ral"},{"location":"index.html#filtres-et-traitement","text":"On peut essayer de donner toutes nos images directement \u00e0 Tesseract pour qu'il reconnaisse tout le texte qu'il y voit mais on risque de se retrouver avec des r\u00e9sultats au mieux inconsistents. Dans notre cas, le soucis est que les chiffres et lettres sont beaucoup trop petits. Ils ne font parfoisd que 10 pixels de haut et cela fait que il n'est pas forc\u00e9ment facile de toujours les diff\u00e9rencier. De plus, comme ils sont petits, les art\u00e9facts d'aliasing sont assez violents et peuvent grandement d\u00e9former une lettre ou un chiffre. Exemple : Prenons le chiffre 9. Dans l'image il peut \u00eatre repr\u00e9sent\u00e9 de cette mani\u00e8re : \"Exemple de chiffre avant post traitement\" On peut voir qu'il est flou, pour nous cela ne pose pas de probl\u00e8me et je pense que \u00e0 peu pr\u00e8s nimporte qui peut dire que c'est un 9. Cependant comme les contours sont flous et m\u00eame si on essaie de retirer le background : \"9 avec anti aliasing\" On voit que le 9 n'est pas clairement d\u00e9finit. En effet on pourrait le comprendre comme : \"Premier exemple de contours\" Ou comme : \"Second exemple de contours\" Voire m\u00eame simplement comme : \"Exemple de coutour g\u00e9n\u00e9reux\" Et on se rend bien compte que les performances de detection ne sont pas les m\u00eames dans ces trois cas. Il faut donc faire un certain post traitement des images pour supprimer les \u00e9l\u00e9ments parasites, les couleurs, et augmenter la visibilit\u00e9 des contours importants. Mais chaque type de donn\u00e9e va avoir des methodes de post traitement diff\u00e9rents. Donc voici les diff\u00e9rents types de reconnaissance et leur post traitements :","title":"Filtres et traitement"},{"location":"index.html#texte","text":"Alors ce type de reconnaissance est utilis\u00e9 par la WINDOW du nom de pilote et de la position du pilote. C'est je pense la plus simple de toutes car Tesseract est particuli\u00e8rement bien entrain\u00e9 pour. Cette reconnaissance concerne donc des lettres qui font des mots ou des noms. Voici un exemple de la WINDOW nom de pilote en entr\u00e9e : \"Exemple texte cru\" Ce texte peut paraitre bon, cependant quand on le lance dans Tesseract, il ne va pas toujours donner un r\u00e9sultat parfait. Il faut aussi savoir qu'il y a des noms pas mal plus p\u00e9nibles que Tesseract a plus de mal \u00e0 reconnaitres, soit \u00e0 cause des lettres utilis\u00e9es, soit car le nom est un nom d'une autre r\u00e9gion et qui ne veut rien dire en anglais ce qui emp\u00eache l'utilisation de dictionnaire (Ex : Tsunoda est un nom japonais et parfois il est difficile pour Tesseract de le reconnaitre car si une lettre pose probl\u00eame il ne peut pas trouver de contexte qui puisse l'aider). Donc pour le rendre plus facilement lisible et augmenter les chances que toutes les lettres soient d\u00e9couvertes, voici les \u00e9tapes que j'ai mis en place. 1 : J'inverse les couleurs. Je me suis rendu compte que il \u00e9tait souvent plus facile de trouver un noir sur blanc que blanc sur noir. Je ne suis pas sur que cette \u00e9tape soit capitale cependant. \"Texte invers\u00e9\" 2 : Je fais un Treshhold de 165 car avec moins le texte parfois prend trop du background et avec plus les lettres sont trop fines. \"Texte apr\u00e8s Treshold\" 3 : Je fais un Resize de l'image pour avoir une meilleure r\u00e9solution et permettre une meilleure d\u00e9tection. J'augmente la hauteur et la largeur par un facteur 2. J'ai trouv\u00e9 cette valeur suffisante et aller plus haut consomme beaucoup de ressources. \"Texte apr\u00e8s Resize\" 4: Je fais une tr\u00e8s rapide Dilatation du texte pour retirer le flou amen\u00e9 par la methode de Resize. Je n'utilise qu'une valeur de 1 car je ne veux pas trop changer comment le texte est model\u00e9 je veux juste retirer le flou. \"Texte apr\u00e8s Dilatation\" Explication des methodes pr\u00e9cises plus bas Voila pour ce qui est du post processing. Je ne dis pas que ce sont les meilleurs param\u00eatres possibles mais dans mes tests ce sont ceux qui ont le mieux march\u00e9s. C'est aussi les premi\u00e8res methodes que j'ai pu d\u00e9velopper alors forc\u00e9ment elles n'ont pas le niveau de d\u00e9tails de certaines autres. Mais comme m\u00eame avec ce traitement il n'est pas rare que je me retrouve avec une ou deux lettres pas justes, il faut un moyen d'\u00eatre s\u00fbr que c'est le bon nom qui est trouv\u00e9. Ce qu'il y a de pratique avec les noms de pilotes c'est que on sait d\u00e9ja comment ils s'appellent avant le Grand Prix. En effet dans le fichier de configuration de la reconnaissance, il y a une liste de noms de pilotes. Cela veut dire que au lieu de chercher \u00e0 trouver parfaitement les bonnes lettres, on peut simplement essayer de trouver quel nom de pilote ressemble le plus au nom trouv\u00e9 sur l'image. Pour ce faire j'ai utilis\u00e9 une methode appel\u00e9e la distance de Levenshtein. Pour faire simple c'est une methode qui va calculer les distances de lettres pour determiner entre des strings laquelle ressemble le plus \u00e0 une autre. Pour r\u00e9sumer le fonctionnement dans lordre : On prend l'image on la traite On envoie l'image trait\u00e9e \u00e0 Tesseract On trouve quel nom de pilote ressemble le plus \u00e0 ce r\u00e9sultat On renvoie le nom du pilote","title":"Texte"},{"location":"index.html#chiffres","text":"Cette methode en r\u00e9alit\u00e9 utilise simplement la m\u00eame methode que celle qui va r\u00e9cup\u00e8rer le texte sur une image. Cependant, la, on envoie \u00e0 Tesseract l'information qu'il ne peut trouver que des chiffres sur l'image ce qui lui permet d'\u00eatre beaucoup plus pr\u00e9cis et de ne pas confondre un 9 avec un P ou un 11 avec un H PAR EXEMPLE (non pas que ca me soit arriv\u00e9 tr\u00e8s r\u00e9guli\u00e8rement et que ca me soit rest\u00e9 dans la gorge \u00e9videmment) L'avantage c'est que cette methode ne demande m\u00eame pas de traitement de la donn\u00e9e en sortie de Tesseract. On \u00e9sp\u00e8re simplement que le post traitement aura suffit. TEMPS : Cette methode regroupe la d\u00e9tection de temps au tour. Il y a trois grands types de WINDOW qui sont concern\u00e9es : La WINDOW du temps au tour La WINDOW du retard sur le leader La WINDOW des secteurs La grande diff\u00e9rence ce sont les ordres de grandeur. Les temps au tour sont en g\u00e9n\u00e9ral entre 50 secondes et 2 minutes. Tandis que les secteurs sont entre 20 et 30 secondes alors que le retard sur le leader peut-\u00eatre de plusieurs minutes. Cependant, tous ces temps poss\u00e8dent le m\u00eame type de post-traitement avant d'\u00eatre envoy\u00e9s \u00e0 Tesseract. Voici un exemple de temps au tour avant toute transformation : \"Temps au tour avant traitement\" On peut avoir l'impression que ce texte est tout \u00e0 fait lisible et facile \u00e0 d\u00e9coder surtout quand on le voit de loin comme ca. Cependant, il faut imaginer que ces chiffres font 13 pixels de haut en comptant le flou et comme expliqu\u00e9 plus haut ce flou dans ces echelles est terrible. \"Temps au tour zoom\u00e9\" Si on donne cette image \u00e0 Tesseract, les '3' deviennent des '9', des '9' deviennent des '8', des '2' deviennent eux aussi des '9', le tout parfois inversement et de mani\u00e8re compl\u00eatement impr\u00e9visible. Ca n'est simplement pas utilisable. Cette partie est un peu plus complexe car si la detection n'est pas fiable les chiffres sont simplement inutilisables. Si \u00e0 tout moment un temps au tour de 1:39.106 devient 1:32.108 c'est juste pas possible. Voici donc les \u00e9tapes de post-traitement que j'ai mis en place pour leur d\u00e9tection : 1: J'applique un Treshold de 185 pour enlever les ambiguit\u00e9s d'alisaising et avoir une image en noir et blanc claire. La valeur de 185 est assez \u00e9lev\u00e9e car le but est de vraiment garder uniquement les contours. Comme les chiffres se ressemlent beaucoup plu que les lettres, il faut tenter le plus possible de conserver leur formes sp\u00e9cifiques. Je me suis rendu compte que cette valeur \u00e9tait une de celles qui marchent le mieux. \"Temps au tour apr\u00e8s Treshold\" 2: J'applique un Resize de 2 pour augmenter la r\u00e9solution des chiffres et permettre une meilleure d\u00e9tection. Le but est d'avoir plus de pixels et donc de permettre \u00e0 Tesseract de mieux utiliser ses matrices de convolution. \"Temps au tour apr\u00e8s Resize\" 3: Comme le Resize am\u00e8ne du flou, j'utilise une methode de Dilatation qui me permet de retirer ce flou et de remplir un peu plus certaines parties qui ont \u00e9t\u00e9 un peu laiss\u00e9e par le Resize ; \"Temps au tour apr\u00e8s Dilatation\" 4: Contrairement aux mots plus haut, la rondeur ajout\u00e9e par la dilatation n'est pas vraiment d\u00e9sir\u00e9e. En effet, elle peut rendre confuse certains chiffres et emp\u00eacher Tesseract de bien trouver le chiffre. Alors j'applique une Erosion qui me permet de contrecarrer en partie les rondeurs ajout\u00e9es par la dilatation et retrouver des chiffres bien form\u00e9es. Pour l' Erosion et la Dilatation j'ai utilis\u00e9 une valeur de 1 car je ne voulais pas trop changer les chiffres. \"Temps au tour apr\u00e8s Erosion\" Explication des methodes pr\u00e9cises plus bas Et avec ce post processing on retrouve de plut\u00f4ts bon r\u00e9sultats qui demandent peu de traitement. Le traitement d\u00e9pend du type de WINDOW cependant. Pour les secteurs on indique \u00e0 Tesseract que les caract\u00e8res autoris\u00e9s sont : \"0123456789.\" Pour les temps au tour on autorise plut\u00f4t \"0123456789.:\" Et pour les \u00e9carts on autorise \"0123456789.+\" Ensuite on r\u00e9cup\u00e8re une liste de chiffres qui'il va falloir transformer en milisecondes pour faciliter le stockage et l'envoi. Le programme nettoie un peu la chaine avant de la convertir. Par exemple parfois le ':' de 1:34.456 est compris comme un '1' ou un '2' et il faut faire attention \u00e0 detecter quand ca arriver. Je passe les d\u00e9tails du reste du nettoyage car c'est vraiment du cas par cas mais quand on a finit de nettoyer la chaine on peut transformer les chaines de minutes secondes et milisecondes en un total de milisecondes. Pour r\u00e9sumer le fonctionnement dans l'ordre : On prend l'image et on lui applique une s\u00e9rie de filtres On envoie l'image filtr\u00e9e \u00e0 Tesseract On nettoie le r\u00e9sultat Tesseract pour compenser certains biais On convertis le r\u00e9sultat en milisecondes","title":"Chiffres"},{"location":"index.html#les-chiffres-2","text":"Il faut savoir que avec la derni\u00e8re version de l'\u00e9mulateur (dont je vais parler un peu plus tard)","title":"les chiffres (2)"},{"location":"index.html#pneus","text":"La on arrive sur la partie la plus p\u00e9nible. Pour comprendre la probl\u00e9matique il faut d'abord faire un petit point sur comment les pneus fonctionnent en Formule 1. Depuis 2019 en Formule 1 nous avons 5 grandes familles de pneus : Les pneus tendres Les pneus medium Les pneus durs Les pneus interm\u00e9diaires Les pneus pluie \"Gamme de pneus Pirelli\" Les trois premiers pneus sont des pneus faits pour piste s\u00e8che, le pneu interm\u00e9diaire pour piste humide et le neu pluie pour la pluie. Chaque pneu a sa dur\u00e9e de vie et son niveau de performance propre mais je ne vais pas rentrer dans le d\u00e9tail ici. Tout ce qu'il faut savoir ce que savoir sur quel pneu chaque pilote est et depuis combien de temps il les chausse est une information tr\u00e8s importante. Chaque pneu a une couleur donn\u00e9e qui permet de les diff\u00e9rencier. Voici un exemple de ce \u00e0 quoi une WINDOW de pneus peut ressembler : \"Exemple zone pneus 1\" Mais cette zone peut aussi ressembler \u00e0 ca : \"Exemple zone pneus 2\" Mais aussi \u00e0 ca : \"Exemple zone pneus 3\" Voire m\u00eame ca : \"Exemple zone pneus 4\" Je pense que vous pouvez tout de suite comprendre la difficult\u00e9 que repr\u00e9sente la t\u00e2che de r\u00e9cup\u00e8ration de donn\u00e9es \u00e0 partir de cette image. En gros le fonctionnement de cette zone d'information est assez simple. Au fur et \u00e0 mesure que la course avance, le trait fait de m\u00eame. Le chiffre dans le round tout \u00e0 droite indique le nombre de tour que le pilote a pass\u00e9 sur ce pneu. La couleur indique le type de pneu. Si il y a une lettre \u00e0 la place d'un chiffre c'est que c'est le premier tour sur ce pneu. La lettre indique le type de pneu. Et pas besoin de dire que si on essaie simplement de donner l'image \u00e0 Tesseract on ne r\u00e9cup\u00e8re ni les chiffres ni les lettres correctement si ce n'est pas du tout. Il faut donc utiliser une methode qui permette d'isoler le rond le plus \u00e0 droite, lui appliquer un traitement qui permette \u00e0 Tesseract de lire ce qu'il y a marqu\u00e9 et qui puisse determiner quel pneu est en train d'\u00eatre utilis\u00e9. J'ai d\u00e9cid\u00e9 de m'occuper dans un premier temps de trouver ce rond avant d'appliquer les filtres car plus l'image est petite plus les filtres sont rapides. Le programme va tirer un trait depuis le bord droit de la zone, et il va avancer vers la gauche jusqu'\u00e0 trouver un obstacle. Je d\u00e9tecte un obstacle si le pixel sur lequel est mon trait poss\u00e8de une valeur de plus de 0x50 dans le channel R,G ou B. J'ai trouv\u00e9 en faisant des tests que les couleurs de background de la F1TV ne d\u00e9passaient jamais ces valeurs. Ensuite apr\u00e8s avoir trouv\u00e9 le premier obstacle, je r\u00e9cup\u00e8re une zone qui doit englober le cercle. Voici un exemple avec cette image en entr\u00e9e : \"Zone compl\u00eate\" Elle est automatiquement coup\u00e9e de cette facon : \"Zone coup\u00e9e automatiquement\" Cela me permet d'isoler uniquement ce qui m'int\u00e9resse ce qui est tr\u00e8s pratique pour Tesseract et pour la detection de couleur. Ensuite avec cette image je peux commencer le processus de reconnaissance. Je commence par faire une moyenne de tous les pixels de l'image en excluant les pixels trop sombres qui font s\u00fbrement partie du background ou du chiffre. Ensuite j'utilise une methode qui calcule la diff\u00e9rence entre la couleur obbtenue et la liste de couleurs possible. Il y a cinq couleurs des pneus possibles : \"#ff0000\" pneu tendre/soft \"Couleur d'un pneu tendre\" \"#f5bf00\" pneu medium \"Couleur d'un pneu medium\" \"#a4a5a8\" pneu dur/hard \"Couleur d'un pneu dur\" \"#00a42e\" pneu inter \"Couleur d'un pneu interm\u00e9diaire\" \"#2760a6\" pneu pluie/wet \"Couleur d'un pneu pluie\" Ce qui est pratique c'est que m\u00eame dans les cas ou il n'y a pas beaucoup de couleur comme celui la : \"Pneu dur avec 0 tours\" On arrive \u00e0 une couleur moyenne de : \"Couleur moyenne de l'image ci dessus apr\u00e8s soustraction du background\" Et il est donc assez facile de determiner le type de pneu en question. Attention, les r\u00e9sultats peuvent \u00eatre tr\u00e8s vite d\u00e9rang\u00e9s par la couleur du pneu pr\u00e9c\u00e9dent si le d\u00e9coupage de la fen\u00eatre n'a pas \u00e9t\u00e9 assez pr\u00e9cis. Ensuite il \"suffit\" de lire le chiffre dans le rond et si on arrive pas \u00e0 le lire alors c'est que c'est une lettre et on sait que le nombre de tours est donc de 0. Maintenant vient le moment tr\u00e8s sympatique de la lecture du chiffre. Vous saurez que Tesseract en plus de detester les grandes images et les images avec des couleurs, deteste \u00e9galement les formes dans une image. Donc dans notre cas, le round de couleur autour du chiffre, m\u00eame si il n'est pas complet, il interf\u00e8re avec la reconnaissance et emp\u00eache de bien lire le chiffre. Il faut donc retirer le background et ensuite la couleur. Sauf que comme le chiffre est de la couleur du background, si on retire le background et ensuite la couleur il ne reste plus rien. Il faut donc retirer le background AUTOUR du rond, et ensuite si on retire la couleur il devrait rester le chiffre sur fond blanc. Pour se faire, j'ai tir\u00e9 des traits depuis les bords de l'image jusqu'\u00e0 ce qu'ils rencontrent le rond. Ensuite je retire tous les pixels entre le rond et les bords de l'image ce qui nous donne ceci : \"Zone pneu avec le background en moins\" Ensuite on peu retirer les pixels qui ont une valeur dans un channel RGB plus haute qu'un certain seuil : \"Zone avec le reste des couleurs supprimm\u00e9es\" Et la on a ce que l'on veut ! A partir de la c'est les filtres que l'on connait qui sont utilis\u00e9s pour en faire une image plus facile \u00e0 utiliser par Tesseract. 1 : On effectue un Resize de facteur 4 (oui c'est beaucoup mais en m\u00eame temps le chiffre est vraiment petit \u00e0 la base) qui permet d'avoir une image d'une bien meilleure r\u00e9solution. \"Filtre 1\" 2: On fait une Dilatation de facteur 1 pour retirer tout le flou de l'image pour aider Tesseract \"Resultat\" Et on a un chiffre qui est utilisable par Tesseract ! Explication des methodes pr\u00e9cises plus bas Pour r\u00e9sumer : On prend l'image de la zone et on la crop pour ne garder que la partie essentielle On d\u00e9termine le type de pneu avec la couleur moyenne de la zone On retire le background autour de cette zone On retire la couleur qui reste pour ne garder que le chiffre On augmente la r\u00e9solution du chiffre On rend ce chiffre net On envoie l'image trait\u00e9e et filtr\u00e9e \u00e0 Tesseract On d\u00e9termine le nombre de tours que le pilote a fait avec ses pneus avec le r\u00e9sultat de Tesseract","title":"Pneus"},{"location":"index.html#drs","text":"Bon ca c'\u00e9tait plut\u00f4t simple j'ai simplement v\u00e9rifi\u00e9 si la moyenne de vert d\u00e9passait une certaine valeur et puis voila.","title":"DRS"},{"location":"index.html#filtres-et-methodes-sur-les-images","text":"Dans ce projet on a du utiliser diff\u00e9rentes methodes d'\u00e9dition d'image que ce soit sous forme de filtres ou de modification de l'image directement. Voici un sommaire des methodes utilis\u00e9es et comment elles fonctionnent. Tresholding Cette methode sert \u00e0 passer d'une image en couleurs \u00e0 une image binaire noir blanc. C'est une \u00e9tape tr\u00e8s importante pour l'OCR car elle permet (si bien faite) d'isoler du texte de son background. Un exemple ici : \"Exemple treshold\" Le fonctionnement est assez simple mais il peut \u00eatre fait de diff\u00e9rentes mani\u00e8res mais dans mon cas voici comment l'algorythme fonctionne sachant qu'il demande en entr\u00e9e la Bitmap que l'on veut modifier ainsi que la valeur de Treshold : On parcours chaque pixel de l'image On convertir la couleur du pixel en une valeur de gris pour avoir la m\u00eame valeur en R,G et B (Formule utilis\u00e9e : grey = R x 0.3 + G x 0.59 + B x 0.11) Si le r\u00e9sultat de la valeur de gris est au dessus de la valeur de treshold, le pixel est pass\u00e9 en blanc complet et dans le cas contraire il est pass\u00e9 en noir complet On retourne la Bitmap modifi\u00e9e Un algorythme pas forc\u00e9ment complexe mais qui peut augmenter de mani\u00e8re titanesque les chances de r\u00e9ussir une OCR Resize Cette methode sert \u00e0 augmenter la r\u00e9solution d'une image pour am\u00e9liorer la pr\u00e9cision de l'algorythme de Tesseract. En effet, avec trop peu de pixels, la matrice de convolution n'est pas toujours aussi efficace. Il ne faut pas confondre cette methode d'augmentation de la taille avec une simple interpolation. En effet une augmentation de taille interpol\u00e9e ne vas pas vraiment changer la r\u00e9solution, l'image sera toujours aussi pixelis\u00e9e, seulement, les pixels seront compos\u00e9es de plus de pixels comme dans l'exemple ci dessous : \"Exemple d'interpolation lin\u00e9aire\" Dans mon projet j'utilise de l'interpolation bicubique qui va cr\u00e9er de l'information pour tenter de combler le vide et produire une image r\u00e9ellement plus grande et avec plus de details mais en ajoutant du flou. \"Exemple des diff\u00e9rents types d'interpolation\" Le but est d'aller chercher dans les pixels alentours les couleurs qui sont d\u00e9ja pr\u00e9sente et de jouer avec des poids pour tenter de faire une pr\u00e9diction de ce que ce pixel aurait \u00e9t\u00e9 si l'image avait plus de detail. Voici un exemple assez parlant : \"Exemple interpolation bicubique (avant)\" \"Exemple interpolation bicubique (apr\u00e8s)\" On pourrait croire que c'est inutile mais dans le contexte de Tesseract ajouter des d\u00e9tails pour tenter de simuler une meilleure r\u00e9solution m\u00eame en cr\u00e9ant du flou est int\u00e9ressant pour mieux remplir la matrice de convolution. Mais il est possible de r\u00e9duire ce flou avec d'autres m\u00e9thodes \u00e9galement. (Dans mon code je n'ai pas utilis\u00e9 du code fait main mais j'utilise une librairie qui me permet de le faire) Il faut simplement faire attention car c'est un proc\u00e9d\u00e9 assez lourd en performances. Dilatation et Erosion Cette methode et la suivante font partie des methodes de transformation morphologiques. Ces methodes sont utilis\u00e9es pour accentuer les formes et les epaissir ou les r\u00e9duire et les affiner. Elles poss\u00e8dent l'aventage \u00e9galement de retirer le flou d'une image ce qui est tr\u00e8s pratique si utilis\u00e9 apr\u00e8s l'utilisation de methodes comme Resize . Je ne vais pas trop rentrer dans les d\u00e9tails de ces methodes car leur fonctionnement est un peu plus lourd en math si on veut faire une v\u00e9ritable explication du pourquoi et du comment ca marche aussi bien. Pour notre projet je dirais que l'important est de savoir que ce sont deux outils tr\u00e8s pratiques pour changer la morphologie des lettres et des chiffres et qu'on peut les utiliser pour corriger du flou et/ou des art\u00e9facts apparus lors de la binarisation de l'image ou de la suppression de fond. Remove Background Cette methode est assez simple et est juste une methode qui va passer en revue tous les pixels de l'image et si la couleur d'un pixel s'apparente \u00e0 celle d'un pixel de fond il est pass\u00e9 en noir total ou en blanc total. Le but est de permettre au reste du programme de fonctionner avec des couleurs moins ambigues. Une variante sp\u00e9cialis\u00e9e pour la reconnaissance des pneus appel\u00e9e affectueusement Remove Useless cherche \u00e0 atteindre le m\u00eame bu mais est bien plus soffistiqu\u00e9e et sp\u00e9cialis\u00e9e pour retirer le background autour d'un cercle de couleur pour ensuite retirer la couleur et qu'il ne reste qu'un chiffre. Pour plus de details voir la detection de pneus. Il y aussi d'autre methodes comme un filtre Gaussien ou Highlight countour que j'ai du d\u00e9velopper mais que je n'ai pas utilis\u00e9 donc je ne vais pas en parler ici.","title":"Filtres et methodes sur les images"},{"location":"index.html#petit-point-resolution","text":"Comme on peut l'imaginer la r\u00e9solution est extr\u00eamement importante pour l'OCR. Et en avancant sur le projet de l'\u00e9mulateur je me suis rendu compte qu'il \u00e9tait possible de r\u00e9cup\u00e8rer des images en 4K (Plut\u00f4t 1080 avec l'upscaling du lecteur). Cela est une superbe nouvelle car cela permet de simplifier \u00e9norm\u00e9ment le processing sur les diff\u00e9rentes windows. Quelques exemples pour se faire une id\u00e9e \"Echantillon 720P\" ; \"Echantillon 1080P\" \"Echantillon 4K\" Mais il faut savoir que gr\u00e2ce \u00e0 cette simplification j'ai pu aussi cr\u00e9er d'autres methodes de filtrage pour certaines parties. Mais la simplification \u00e9tait obligatoire car avec des images aussi grande il n'\u00e9tait simplement pas possible de venir appliquer les m\u00eames filtres car le temps de traitement serait beaucoup plus long. J'indique ces changements que apr\u00e8s l'explication d'avant car ce sont des changements un peu de derni\u00e8re minute et que la logique expliqu\u00e9e plus haut a \u00e9t\u00e9 tr\u00e8s importante pour le projet OCR m\u00eame si tout n'est plus forc\u00e9ment utilis\u00e9 maintenant que j'ai des images de meilleure qualit\u00e9. Dans la version actuellement disponible la reconnaissance a \u00e9t\u00e9 simplifi\u00e9e sous cette forme : Le \"GapToLeader\" est d\u00e9cod\u00e9 avec un premier passage de Tresholding \u00e0 165 puis un Resize de 2 et une Dilatation de 1 pour retirer le flou Les \"Sectors\" sont d\u00e9cod\u00e9s en utilisant une toute nouvelle methode VanishOxyAction \u00e0 cause des couleurs parfois appliqu\u00e9es et ensuite simplement une methode de Tresholding de 150 pour rendre le r\u00e9sultat assez propre pour l'OCR. Le \"LapTime\" est dabord pass\u00e9 par un Tresholding tr\u00e8s strict de 185 pour pr\u00e9parer la SobelEdgeDetection qui est \u00e9galement une nouvelle methode qu'il a \u00e9t\u00e9 possible d'utiliser gr\u00e2ce \u00e0 la simplification du reste des processus. Le \"Text\" est d\u00e9cod\u00e9 simplement avec un tresholding de 165 maintenant gr\u00e2ce \u00e0 l'image 4K. Les pneus ont leur propre traitement comme expliqu\u00e9 plus haut auquel on ajoute la Dilatation de 1. Comme on peut le voir le traitement est pas mal plus simple mais cela ne veut pas dire que les autres methodes que je n'utilise plus ne sont pas utiles. La reconnaissance n'est pas encore parfaite et je pense que leur utilisation pourrait aider \u00e0 am\u00e9liorer les r\u00e9sultats. (Et parfois ces anciennes methodes sont utiles dans les traitements personnalis\u00e9s des windows elle m\u00eames comme par exemple les pneus qui utilisent la methode GrayScale pour isoler les couleurs) VanishOxyAction Cette methode est une methode plut\u00f4t simple mais qui est importante. Elle se base beaucoup sur le code de la methode Grayscale et sur la methode Tresholding car elle essaie de regrouper le meilleur des deux en r\u00e8glant quelques soucis que ces derni\u00e8res cr\u00e9\u00e9ent. Le soucis avec la methode grayscale c'est que quand le texte est de couleur (Ce qui arrive souvent pour les temps de secteurs) la methode GrayScale rend les couleurs dans une nuance de gris un peu trop sombre ce qui fait que ensuite la methode de Tresholding d\u00e9fonce tout. \"Exemple de secteur en couleur\" \"Exemple de secteur en grayscale\" L'id\u00e9e est alors de prendre pour chaque pixel et de garder uniquement la valeur de R,G ou B la plus haute et de mettre les deux autres canaux au m\u00eame niveau pour avoir une image blanchie qui puisse \u00eatre ensuite utilis\u00e9e avec la methode de Tresholding sans soucis. \"Exemple de secteur blanchi avec vanishoxyAction\" SobelEdgeDetection On pourrait se dire que avec ce genre de methode le tresholding est inutile ensuite mais ca n'est pas le cas car le tresholding sert ensuite pour rendre les contours plus ou moins aggressif. Car m\u00eame si l'image ressemble \u00e0 une image binaris\u00e9e, il reste des nuances que le treshold va pouvoir utiliser. SobelEdgeDetection Cette methode est une methode assez classique que je n'ai pas design\u00e9 moi m\u00eame alors je ne vais pas trop m'\u00e9pancher dessus. En gros on utilise une matrice et une formule math\u00e9matique pour redessiner une image et le r\u00e9sultat est une image avec des contours. Je ne l'ai utilis\u00e9 que pour les temps au tour car ce sont les plus r\u00e9calcitrants. Cette methode a besoin d'une image pass\u00e9e en noir et blanc au pr\u00e9alable \u00e0 laquelle on applique ensuite les matrrices de filtres. Et avec ces filtres ajout\u00e9s \u00e0 l'image on peut ensuite calculer le \"Gradient\" pour cr\u00e9er les bords. Le seul soucis de cette methode c'est qu'elle est assez gourmande et qu'elle fournit des formes creuses d\u00fb \u00e0 la nature des matrices donn\u00e9es. Voici un exemple de ce dont cette m\u00e9thode est capable : Artefacts de la detection de bords de Sobel Apparemment l'OCR aime assez bien cette methode et elle permet de beaucoup moins souvent oublier les '.' ou ':'","title":"Petit point r\u00e9solution"},{"location":"index.html#traitement-des-donnees","text":"C'est bien gentil de recevoir des r\u00e9sultats de l'OCR, cependant on ne peut pas souvent les utiliser comme tels. En effet les resultats ne sont pas tr\u00e8s constants et demandent d'\u00eatre verifi\u00e9s pour savoir si ils doivent \u00eatre pris en compte. Le post traitement de ces donn\u00e9es d\u00e9pend compl\u00eatement du contexte et donc il est diff\u00e9rent pour chque type de window. Voici un floril\u00e8ge des diff\u00e9rents types de traitements : Traitement du nom de pilote Rien de plus que ce qui est d\u00e9ja d\u00e9taill\u00e9 dans la partie OCR Traitement des pneus Pareil Traitement des temps La par contre c'est int\u00e9ressant. Dans un monde parfait je pourrais simplement prendre les r\u00e9sultats de l'OCR et les traiter directement. Mais comme nous vivons dans un monde ou la souffrance et la douleur sont les seules choses autoris\u00e9es on ne peut pas. Le probl\u00e8me vient du fait que les temps que l'on peut trouver sur la F1TV sont encod\u00e9s avec des '.' et des ':' qui determinent les limites entre les chiffres qui d\u00e9signent les minutes, les secondes et les milisecondes. Et le soucis avec ces s\u00e9parateurs c'est qu'ils aiment bien mettre le chaos dans la reconnaissance. Quand ils ne sont pas compris comme des autres chiffres ils sont parfois simplement oubli\u00e9s ou pris en double c'est un enfer. Il faut donc trouver un moyen de detecter quand cela arrive. Et je n'ai pas trouv\u00e9 de meilleur moyen que de faire du cas par cas. Cela peut para\u00eetre simple quand on parle par exemple des secteurs. On sasit que on attend deux chiffres avant un '.' et trois chiffres apr\u00e8s. Il est donc facile de voir que si je trouve six chiffres et pas de s\u00e9paration le troisi\u00e8me est le s\u00e9parateur mal compris. Mais l'exemple qui d\u00e9truit vraiment tout c'est les \u00e9carts avec le leader. Autant un temps au tour c'est toujours x:xx.xxx et un temps de secteur c'est xx.xxx. Mais un \u00e9cart avec le leader ca peut \u00eatre 0.345 comme 1:12.345. Ce qui fait que quand je 121345 est-ce que c'est 12.345 ou 1:21.345...? Souvent on peut quand m\u00eame d\u00e9duire mais cela demande de pr\u00e9voir presque tous les cas limites ce qui est assez p\u00e9nible. On pourrait se dire qu'il suffit de voir si la valeur est trop en dehors des normes. Le soucis c'est que il n'est pas impossible que un temps au tour ou un \u00e9cart prenne d'un coup une grosse diff\u00e9rence. Cela arrive m\u00eame assez souvent quand des pilotes sortent de la piste. \"Exemple temps au tour\" \"Exemple temps secteur\" Pour ce qui est du DRS et de la position des pilotes, il n'y a pas vraiment de traitement suppl\u00e9mentaire. Non pas car la detection est parfaite, mais par ce que la detection ne peut pas rater de 200 facons. Le DRS ne peut retourner que TRUE ou FALSE et la position du pilote est entre 1 et 20 compris. Le peu de nuance fait que ce sont des cas de figures qui ne demandent pas un traitement particulier au del\u00e0 de l'OCR","title":"Traitement des donn\u00e9es"},{"location":"index.html#stockage-des-donnees","text":"Dans ce projet le but n'est pas simplement de trouver les donn\u00e9es et les afficher. L'int\u00e9r\u00eat de les r\u00e9cup\u00e8rer est de pouvoir les comparer \u00e0 d'autres donn\u00e9es pr\u00e9c\u00e9dentes. Le vrai soucis de la F1TV c'est justement que l'on ne peut pas facilement voir les \u00e9volutions. On ne peut voir que des \"photos\" de la situation actuelle de la course. Il faut donc garder en m\u00e9moire les diff\u00e9rentes choses qui se sont pass\u00e9es. Techniquement on pourrait stocker ces donn\u00e9es dans de b\u00eates listes C#. Mais le soucis avec ca c'est que m\u00eame si des outils comme LinQ existent, ca n'est pas le plus pratique quand on veut faire des recherches complexes. Il faut aussi voir que si le projet dans sa forme actuelle aurait peut-\u00eatre pu se satisfaire de listes simples, le but est d'ensuite pouvoir construire sur ces bases pour faire des predictions et des insertions de stats beaucoup plus int\u00e9ressantes qui demandent de faire des requ\u00eates complexe rapidement. Je me suis dit que la meilleure methode serait d'avoir une base de donn\u00e9e dans laquelle je peux faire des requ\u00e8tes SQL. Mais commme je n'ai pas besoin de toutes les features de SQl et que je ne veut pas avoir \u00e0 g\u00e8rer un serveur de base de donn\u00e9e et tout ce qui va avec je me suis dit qu'une bonne option serait d'utiliser SQLITE. \"Logo Sqlite\" ; SQLITE est vraiment pratique car cela me permet d'avoir une DB sans avoir de serveur donc pas vraiment complexe ou quoi que ce soit mais qui conserve les aventages de rapidit\u00e9 et d'utilisation de requetes SQl. J'ai cr\u00e9\u00e9 trois tables dans cette base de donn\u00e9e SQLITE que voici :","title":"Stockage des donn\u00e9es"},{"location":"index.html#base-de-donnee","text":"Drivers Colonne Type de Data Description Tag ID INTEGER ID du pilote PRIMARY Name VARCHAR Nom du pilote NOT NULL Pitstops Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui a effectu\u00e9 le Pitstop PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL Stats Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui concern\u00e9 PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL LapTime INTEGER Temps au tour (MS) NOT NULL Sector1 INTEGER Temps du secteur 1 (MS) NOT NULL Sector2 INTEGER Temps du secteur 2 (MS) NOT NULL Sector3 INTEGER Temps du secteur 3 (MS) NOT NULL GapToLeader INTEGER Ecart avec le leader (MS) NOT NULL Position INTEGER Position pilote NOT NULL La table Drivers sert juste \u00e0 stocker les diff\u00e9rents noms de pilote pour qu'ils soient utilis\u00e9s dans le reste de la DB La table Pitstops n'est pas vraiment utilis\u00e9e dans l'\u00e9tat actuel du projet. Mais le but \u00e9tait de la remplir d\u00e8s que le programme d\u00e9tectais un arr\u00eat aux stands. Le but est ensuite de pouvoir construire un classement pond\u00e8r\u00e9 en fonction des arr\u00eats des diff\u00e9rents pilotes et d'afficher la stats tout le temps sur l'affichage principal. Elle n'est pas vraiment utilis\u00e9e car la detection de pitstop n'a pas pu \u00eatre commpl\u00eat\u00e9e. De par la nature des donn\u00e9es r\u00e9cup\u00e8r\u00e9es des pneus et des positions, c'est tr\u00e8s difficile de detecter avec prescision un arr\u00eat aux stands. La table Stats est la plus importante car elle contient toutes les informations concernant les pilotes \u00e0 chaque tour. L'id\u00e9e est qu'elle soit remplie \u00e0 chaque tour. Les infos ne sont pas scens\u00e9e \u00eatre les infos live mais plut\u00f4t juste une photo \u00e0 chaque tour de la situation de chaque pilote pour ensuite pouvoir faire des commparaisons tourspar tours. Des donn\u00e9es comme le GapToLeader peuvent \u00e9voluer pendant le tour mais on s'en fiche. Ce qui compte vraiment c'est le temps au tour et les secteurs ainsi que les pneus.","title":"Base de donn\u00e9e"},{"location":"index.html#quand-remplir-la-base","text":"Dans ce projet il y a deux type d'information. Les informations live qui sont stock\u00e9es dans des listes et les informations long terme qui sont stock\u00e9es dans la DB. A chaque it\u00e9ration de l'OCR, les donn\u00e9es r\u00e9cup\u00e8r\u00e9es sont stock\u00e9es dans une liste de DRIVERDATA. Les DRIVERDATA sont des structures de donn\u00e9es qui contiennent toutes les infos d'un pilote \u00e0 un instant T. Elles peuvent \u00eatre incompl\u00eates et sont juste la pour faire de petits calculs et determiner quand ins\u00e8rer des donn\u00e9es permanentes. Ce qui nous am\u00e8ne au moment int\u00e9ressant. Comment on d\u00e9termine quand il est int\u00e9ressant d'ins\u00e8rer des informations dans la base de donn\u00e9es. Il y a deux cas de figure ou on pourrait vouloir ins\u00e8rer des infos :","title":"Quand remplir la base ?"},{"location":"index.html#quand-un-pilote-a-finit-un-tour","text":"En effet, j'ai estim\u00e9 que les seuls moments ou on veut garder une photo de la situation du pilote c'est quand il passe d'un tour \u00e0 l'autre. Le raisonnement est le suivant : On ne veut pas conserver TOUTES les donn\u00e9es car si on prend une phot toutes les trois secondes, la majorit\u00e9 des informations seront redondantes avec les pr\u00e9c\u00e9dentes. Mais en m\u00eame temps il ne faut pas rater des changements importants de donn\u00e9es. Les seules donn\u00e9es qui changent entre deux passages de l'OCR sont les \u00e9carts entre les pilotes et de temps en temps un nouveau secteur s'affiche. Alors que d'un tour \u00e0 l'autre presque toutes les informations changent. Et on ne perd que les l\u00e9g\u00e8res fluctuations des \u00e9carts entre les pilotes. J'ai donc d\u00e9cid\u00e9 de conserver une photo par tour. Mais c'est bien joli sauf qu'il reste une difficult\u00e9 : Comment savoir qu'un pilote a fait son tour ? Cela peut para\u00eetre simple comme question mais elle est plus difficile qu'il n'y parait. Il faut savoir que en F1 un pilote peut \u00eatre dans son 26\u00e8me tour pendant qu'un autre en est \u00e0 son 24\u00e8me. Chaque pilote a sa propre course et au fur et \u00e0 mesure que les \u00e9carts se creusent il peut y avoir un tour voir plusieurs d'\u00e9cart entre la queue de course et les premiers pilotes. Ensuite il faut savoir qu'il n'est pas marqu\u00e9 sur la f1TV dans quel tour chaque pilote est. Il faut donc le d\u00e9duire en fonction des Data. Voici le code le if qui d\u00e9tecte un nouveau tour if ( DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Sector3 != 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Sector3 == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Position != - 1 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Position != - 1 ) { //Do stuff } DriverDataLogs est une liste de liste d'informations de pilotes. Chaque DriverDataLogs repr\u00e9sente les 20 photos des donn\u00e9es des pilotes. Cela veut dire que DriverDataLogs[3] repr\u00e9sente toutes les infos des pilotes dans le tour 4 et que DriverDataLogs[3][0] repr\u00e9sente toutes les infos du premier pilote dans le tour 3. Si on analyse un peu ce qui est \u00e9crit avec ces informations, on peut voir que je d\u00e9termine qu'un nouveau tour se d\u00e9finis comme une photo ou le troisi\u00e8me secteur a \u00e9t\u00e9 compl\u00eat\u00e9 et ou il ne l'\u00e9tait pas juste avant. Cela fait sens car quand un pilote compl\u00eate son troisi\u00e8me secteur c'est la que son dernier temps au tour se met \u00e0 jour. Le reste des tests est juste la pour \u00e9viter les faux positifs dans le cas ou un des deux DriverDataLogs[x][x] soit corrompu et que donc la valeur n'aie pas de sens. Cela veut dire que dans des conditions tr\u00e8s sp\u00e9cifiques je pourrais potentiellement rater un tour mais il faudrait vraiment que l'OCR me joue un vilain tour.","title":"Quand un pilote a finit un tour"},{"location":"index.html#quand-un-pilote-a-fait-un-arret-aux-stands","text":"Et la on touche le plus difficile. Pourtant un arr\u00eat aau stand ne devrait pas \u00eatre compliqu\u00e9 \u00e0 detecter. C'est quand un pilote change de pneu. Alors il peut changer de pneu en gardant le m\u00eame type de pneu et donc tout repose sur le nombre de tour qu'un pneu fait. Sauf que il faut ajouter \u00e0 cette reflexion qu'un pneu peut \u00eatre chauss\u00e9 sans qu'il soit neuf. Ce qui veut dire que l'on ne peut pas simplement choisir qu'un pilote a chang\u00e9 de pneus quand ses pneus sont \u00e0 1 tour. Il peut tr\u00e8s bien reprendre des pneus de qualif qui peuvent avoir 10 tours dans les pattes. En plus quand le pilote change de pneus il y a un phenomene assez p\u00e9nible qui fait que les deux premiers tours faits avec ne sont pass vraiment d\u00e9chiffrables car ils sont un peu cach\u00e9s derri\u00e8re la lettre qui indique le nouveau pneu chauss\u00e9. Exemple : \"Infographie de pneu qui se chevauche\" Voici le code que j'avais \u00e9crit pour tenter de trouver quand un pilote avait fait un pitstop : if ( data . CurrentTyre . Coumpound != Tyre . Type . Undefined && data . CurrentTyre . NumberOfLaps == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps != 0 ) { //Do stuff } On peut voir que j'essaie de detecter quand le pneu est \u00e0 0 tours (ce qui est le moment ou il y a une lettre \u00e0 la place d'un num\u00e9ro de tour) et que la photo d'avant montrait un pneu normal. On v\u00e9rifie aussi que le pneu a bien \u00e9t\u00e9 detect\u00e9 en verifiant que le pneu n'est pas de type undefined. Le soucis c'est que ce n'est pas rare que l'OCR nous retourne qu'un pneu est vieux de 0 tours et donc il est absolument impossible de faire confiance \u00e0 cette metric. Si on veut utiliser cette methode pour trouver les Pitstop il va falloir avant tout am\u00e9liorer l'OCR sur ce point. Ce soucis mets en lumi\u00e8re un principe assez important de l'informatique \"Ggarbage in, Garbage out\". Si les donn\u00e9es que je recoit ne sont pas g\u00e9niales, le r\u00e9sultat ne sera pas g\u00e9nial non plus. Ce qui est frustrant c'est que la detection des pneus n'est pas si mal mais entre les chiffres qui se chevauchent ce qui nous fait lire 0 alors que c'est juste un un '1' derri\u00e8re un 'H' ou le 1% du temps ou le programme se trompe, on ne peut pour l'instant tout simplement rien faire de mieux.","title":"Quand un pilote a fait un arr\u00eat aux stands"},{"location":"index.html#affichage-des-donnees","text":"Maintenant que l'on a stock\u00e9 toutes ces donn\u00e9es, il faut en faire quelque chose sinon ca ne sert a rien. Afficher les donn\u00e9es est techniquement la partie la plus simple du projet. Il faut prendre les donn\u00e9es qui nous int\u00e9ressent de la base de donn\u00e9es et des r\u00e9sultats de l'OCR et les afficher sur des composants Windows Forms. Il y a deux types d'affichages actuellements mis en place dans le projet sur les trois pr\u00e9vus initialement :","title":"Affichage des donn\u00e9es"},{"location":"index.html#affichage-direct","text":"L'affichage direct est simplement l'affichage du r\u00e9sultat de l'OCR. Par exemple le classement live ainsi que les \u00e9carts entre les pilotes sont affich\u00e9s directement depuis les r\u00e9sultats de l'OCR. Ce ne sont pas forc\u00e9ment des donn\u00e9es prises dans la base de donn\u00e9e. Voici un exemple : for ( int driverCount = 0 ; driverCount < liveData . Count ; driverCount ++) { DriverData driver = liveData [ driverCount ]; lblDriverName . Text = driver . Name ; lblDriverPosition . Text = driver . Position ; lblDriverLapTime . Text = Reader . ConvertMsToTime ( driver . LapTime ); } C'est l'affichage le plus simple et celui qui est le plus soumis \u00e0 des erreurs. En effet, si un pilote est mal detect\u00e9 on le verra directement mal s'afficher dans la Form principale. C'est \u00e9galement l'affichage le moins int\u00e9ressant car il ne cr\u00e9e aucune information, il ne fait que remontrer les infos que l'on peut d\u00e9ja voir dans la F1TV \"Exemple d'affichage live\"","title":"Affichage direct"},{"location":"index.html#affichage-calcule","text":"La encore il y a plusieurs types d'affichages :","title":"Affichage calcul\u00e9"},{"location":"index.html#affichage-hybride","text":"Pour ce qui est des affichages hybrides ce sont des affichages qui vont chercher des informations lives et des informations dans la base de donn\u00e9e. Ils ne font pas de calculs \u00e0 proprement parler mais ils affichent plus d'informations que ce que montre la F1TV. Cela veut dire qu'ils repr\u00e9sentent un d\u00e9but de plusvalue par rapport \u00e0 l'alternative qu'est la page DATA de la F1TV. Ils ne sont pas beaucoup plus durs \u00e0 impl\u00e9menter mais demandent de faire des requ\u00eates \u00e0 la base de donn\u00e9e. Comme exemple d'affichage hybride on a l'affichage des cinq derniers tours d'un pilote. C'est un affichage qui ne demande aucun calcul mais qui permet deja de se rendre compte de si le pilote est enn train de perdre ou gagner du temps ou si il est constant, ce qui n'est pas possible actuellement avec la F1TV \u00e0 moins d'avoir une excellente m\u00e9moire. \"Fen\u00eatre d'informations \u00e0 propos d'un pilote\" Voici un exemmple du type de code necessaire pour afficher ce genre de donn\u00e9es: public List <( int LapTime , int Lap )> GetDriverLaptimes ( string driverName , int numberOfLaptimes ) { int driverId = GetDriverID ( driverName ); List <( int LapTime , int Lap )> lapData = new List <( int LapTime , int Lap )>(); string selectQuery = \"Select LapTime,Lap from Stats WHERE DriverID = @driverID ORDER BY Lap DESC LIMIT @limit\" ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@limit\" , numberOfLaptimes ); SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { int lapTime = reader . GetInt32 ( 0 ); int lap = reader . GetInt32 ( 1 ); lapData . Add (( lapTime , lap )); } } return lapData ; } public void Display (){ List <( int LapTime , int Lap )> lapsInfos = Storage . GetDriverLaptimes ( driverName , 5 ); int id = 0 ; foreach (( int LapTime , int Lap ) lapData in lapsInfos ){ Labels [ id ]. Text = LapTime ; id ++; } } Note: Le code montr\u00e9 ici n'est pas forc\u00e9ment le code utilis\u00e9 dans le projet. D'une certaine facon les fen\u00eatres de bataille et de d\u00e9passements sont aussi des hybrides. \"Exemple fen\u00eatre des batailles\" Ici ce sont les batailles qui sont repr\u00e9sent\u00e9es. Aucune donn\u00e9e n'est calcul\u00e9e, c'est litterallement directement les donn\u00e9es de la F1TV, mais la nuance est qu'on ne montre que les pilotes qui sont en train de se battre et que on leur assigne une couleur selon \u00e0 quel point ils sont proches. On a une plus-value sur la F1TV sans pour autant faire de monstres calculs. Pour info, les pilotes consid\u00e8r\u00e9s comme \u00eatant en train de se battre sont les pilotes \u00e0 moins de trois secondes les uns des autres et les couleurs sont suivantes : Vert : Dans la zone de DRS (Moins d'une seconde) Jaune : Plus d'une seconde Noir : Plus de deux secondes \"Exemple fen\u00eatre des d\u00e9passements\" La c'est l'historique des d\u00e9passements qui est affich\u00e9. On pourrait presque dire que c'est un affichage compl\u00eatement calcul\u00e9 car ce ne sont pas des informations disponibles directement sur la F1TV cependant je dirais que cela reste un hybride car il n'y a aucuns calculs. On regarde juste les diff\u00e9rences entre l'ancienne position d'un pilote et la nouvelle et on affiche les changements.","title":"Affichage Hybride"},{"location":"index.html#affichage-totalement-calcule","text":"L'affichage compl\u00eatement calcul\u00e9 est un type d'affichage qui ne montre aucune information trouv\u00e9e sur la page de la F1TV. C'est le premier affichage \u00e0 traiter l'information qu'il trouve et il retourne des informations nouvelles. La nuance avec les affichages pr\u00e9dictif est qu'il ne cr\u00e9e pas r\u00e9ellement de l'information, il la d\u00e9duit. Le but est de prendre un certain nombre d'informations trouv\u00e9es sur la page de la F1TV et de calculer des choses pour faire ressortir des tendances \u00e0 l'utilisateur. Cependant on reste sur des informations factuelles. Ce sont des infos d\u00e9duites que techniquement unn humain avec une bonne m\u00e9moire et fort en calcul mental pourrait faire. Mais la c'est fait automatiquement pour tous les pilotes et c'est affich\u00e9 de sorte \u00e0 faire ressortir les valeurs sp\u00e9ciales. Comme c'est un peu plus abstrait, je pense qu'un exemple vaut mieux que 1000 mots. \"Exemple de fen\u00eatre d'informations totalement calcul\u00e9es\" Ci dessus on peut voir un bon exemple. C'est une fen\u00eatre qui montre qui sont les pilotes les plus rapides et les moins rapides et qui montre la diff\u00e9rence de temps au tour. Cette information est totalement d\u00e9duite et n'est en aucun cas trouvable sur la F1TV mais elle n'est pas invent\u00e9e. Elle est simplement calcul\u00e9e. La formule est assez simple, je prend les cinq derniers temps au tour de tous les pilotes. Je fais une moyenne qui donne un temps. Et ensuite je trie les pilotes en fonction de ce temps et je n'affiche que les cinq plus rapide et les cinq plus lents. Ensuite il suffit de prendre le temps le plus rapide et faire une petite soustraction pour avoir l'\u00e9cart. C'est une stat assez int\u00e9ressante car elle lisse les diff\u00e9rences d'un tour \u00e0 l'autre et fait ressortir une tendance. On peut voir pour le grand prix de monaco 2023 par exemple, le moment ou les pneus pluie deviennent plus int\u00e9ressants que les pneus secs car on voit que les pilotes les plus rapides sont les pilotes de fond de grille qui ont chauss\u00e9 les pneus pluie en premier tandis que les plus lents sont les pilotes sur pneus secs vieux. Voici un bout de code qui s'occupe de faire les calculs : List <( int avg , string driverName )> averages = new List <( int avg , string driverName )>(); foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { //We want to recover the last 5 lap times List <( int lapTime , int lap )> laps = Storage . GetDriverLaptimes ( driver . Name , 5 ); if ( laps . Count > 0 ) { int avg = 0 ; foreach (( int lapTime , int lap ) lap in laps ) { avg += lap . lapTime ; } avg = avg / laps . Count ; averages . Add (( avg , driver . Name )); } }","title":"Affichage totalement calcul\u00e9"},{"location":"index.html#affichage-predictif","text":"C'est ici que ca devient vraiment dommage, le projet a mannqu\u00e9 de temps pour impl\u00e9menter des affichages pr\u00e9dictifs mais le potentiel est la ! Un affichage pr\u00e9dictif est un affichage qui cr\u00e9e des informations \u00e0 partir des infos qu'il a mais qui fait plus qu'un calcul. Le but est de tenter de deviner quelque chose. Voici des exemples d'affichages pr\u00e9dictifs qui pourraient \u00eatre mis en place averc l'architecture actuelle du projet : Si un pilote a des pneus depuis plus de 20 tours et que son temps au tour est en chute libre depuis cinq tours. Alors ce pilote va peut-\u00eatre devoir s'arr\u00eater. Si un pilote tourne une seconde au tour plus vite que le pilote devant lui et que ce pilote est \u00e0 10 secondes devant, alors il devrait pouvoir le rattraper d'ici dix tours. Si un arr\u00eat au stand est en moyenne de 23 secondes, alors un pilote 3\u00e8me ressortirais potentiellement 7\u00e8me si il s'arr\u00eate maintenant. Tous ces exemples sont des mini algorythmes pr\u00e9dictifs qui pourraient \u00eatre impl\u00e9ment\u00e9s assez facilement dans l'architecture actuelle du projet et pourraient apporter une immense plus-value si ils sont bien param\u00eatr\u00e9s. On peut m\u00eame imaginer que l'algorythme se corrige tout seul si il voit qu'il a eu tort pour que les course suivante il puisse mieux s'en sortir. Les possibilit\u00e9es sont infinies !","title":"Affichage pr\u00e9dictif"},{"location":"index.html#tests","text":"Alors la on arrive \u00e0 la GROSSE erreur de ce projet... Si je ne pouvais changer qu'une seule chose \u00e0 ma facon de faire le projet apr\u00e8s coup c'est ici que je ferai le changement. Les tests sont d'une importance absolument capitale mais si ils sont bien faits, c'est surtout un moyen ultra efficace de v\u00e9rifier que du nouveau code est performant et est beaucoup plus pratique \u00e0 utiliser. Je pense sans rire que j'aurais pu gagner plusieurs jours de travail si j'avais travaill\u00e9 diff\u00e9remment vis-a-vis des tests.","title":"Tests"},{"location":"index.html#comment-ca-cest-passe","text":"D\u00e8s la cr\u00e9ation du planning pr\u00e9visionnel j'ai fait une erreur capitale. J'ai mis les tests en fin de developpement des features... Et je ne leur ai laiss\u00e9 que tr\u00e8s peu de temps tout en les mettant au milieu du chemin critique ce qui les rends particuli\u00e8rement vuln\u00e9rables si une t\u00e2che du chemin critique est retard\u00e9e. En fait dans ce projet je voulais surtout \u00e9viter de faire comme certains projets que l'on a pu avoir pendant notre formation. C'est \u00e0 dire que je ne voulais surtout pas oublier la doc. Alors j'ai agenc\u00e9 le projet pour commencer par les fondations de la doc, puis en incluant les p\u00e9riodes de programmation et entre ces derni\u00e8re ajouter des Tests dans les trous. Le soucis c'est que du coup les projets \u00e9taient un peu le dernier truc dont je devais me soucier ce qui a \u00e9t\u00e9 une tr\u00e8s mauvaise id\u00e9e. Je me suis retrouv\u00e9 \u00e0 devoir mordre sur les jours de tests car les t\u00e2ches de programmation mettaient plus de temps que pr\u00e9vu (qui elles-m\u00eame auraient p\u00fb \u00eatre plus courte avec une bonne utilisation des tests) et je mme suis retrouv\u00e9 \u00e0 passer outre les tests pour avancer sur le reste du projet. J'ai donc du en panique \u00e0 la toute fin du projet construire quelques tests \"unitaires\" dont l'utilit\u00e9 est tr\u00e8s limit\u00e9e car tout le travail a d\u00e9ja \u00e9t\u00e9 fait et que vu la complexit\u00e9 qu'a pris le projet, faire de vrais tests unitaires est devenu un peu trop compliqu\u00e9 pour valoir le coup. Les seuls tests \"unitaires\" (Je l'\u00e9cris entre quotes car ce ne sont pas vraiment des tests unitaires mais plut\u00f4t des tests tout courts car ils ne sont pas sp\u00e9cifiques) qu'il y a dans le projet final sont des tests exclusivement tourn\u00e9s sur l'OCR. Ils sont d\u00e9ja vraiment pratiques car cela me permet de tester d'autres algorythmes d'OCR et voir si les r\u00e9sultats sont meilleurs ou non mais c'est juste un peu trop tard quoi... Les tests unitaires que j'ai impl\u00e9ment\u00e9s sont un peu tous pareils au niveau du fonctionnement : On choisit une image dans une liste d'images pr\u00e9par\u00e9es qui sont scens\u00e9e repr\u00e9senter le type de donn\u00e9es rencontr\u00e9es par l'application en temps normal On lis le nom de l'image que j'ai mis manuellement en indiquant ce qui \u00e9tait marqu\u00e9 sur l'image On fait un coup d'OCR sur l'image et on compare ce r\u00e9sultat avec la valeur que l'on est scens\u00e9 retrouver En pratique on est sur un code de ce style : [TestMethod()] public void SectorOCR_Test () { string directory = @\"./../../TestImages/Sectors/\" ; foreach ( string file in Directory . GetFiles ( directory )) { Bitmap image = ( Bitmap ) Image . FromFile ( file ); DriverSectorWindow sectorsWindow = new DriverSectorWindow ( image , new Rectangle ( 0 , 0 , image . Width , image . Height ), 1 , true ); string [] paths = file . Split ( '/' ); string fileName = paths [ paths . Length - 1 ]; fileName = fileName . Replace ( \".png\" , \"\" ); int timeMS = ( int ) sectorsWindow . DecodePng (); string time = Reader . ConvertMsToTime ( timeMS ); string [] checkDigits = fileName . Split ( '_' ); string [] digitsToCheck = time . Split ( ':' ); if ( time == \"0:00:000\" ) { Assert . AreEqual ( 0 , Convert . ToInt32 ( checkDigits [ 0 ])); } else { //The ConvertMSToTime will always return three chars so we need to make the checkDigits be also three chars while ( checkDigits . Length != 3 ) checkDigits = new [] { \"0\" }. Concat ( checkDigits ). ToArray (); for ( int i = 0 ; i < checkDigits . Length ; i ++) { //We need to convert to int first because sometimes we have \"08\" and \"8\" and in string its not the same but in int it is Assert . AreEqual ( Convert . ToInt32 ( checkDigits [ i ]), Convert . ToInt32 ( digitsToCheck [ i ])); } } } } Tout le code suppl\u00e9mentaire qui ne fait pas partie des \u00e9tapes cit\u00e9es est juste la pour manipuler le format des r\u00e9sultats pour qu'il soit comparable. \"Exemple d'\u00e9chantillons pour les tests\" Ce qui est pratique avec cette approche c'est qu'il est tr\u00e8s facile de rajouter des cas sp\u00e9cifiques et voir comment le programme les g\u00e8re. Si je vois que un certain nombre est souvent mal reconnu je peux faire expr\u00e8s de le mettre dans le dossier et modifier mon code d'OCR jusqu'\u00e0 ce que le test passe. Si j'avais eu plus de temps j'aurais s\u00fbrement pu ajouter de vrais tests unitaires qui testent des fonctions tr\u00e8s pr\u00e9cises. Par exemple verifier que les diff\u00e9rentes Windows sont bien appel\u00e9es et que les zones se cr\u00e9ent correctement ou m\u00eame plus simplement que la lecture du JSON au d\u00e9marrage marche bien. Il faut savoir que m\u00eame si je n'ai pas eu l'occasion d'\u00e9crire beaucoup de tests sous forme de code. Toute la phase de d\u00e9veloppement de l'OCR j'ai pass\u00e9 plus d'une heure par jour \u00e0 analyser les r\u00e9sultats. Je gardais toutes les images des WINDOWS et je notais dans le nom du fichier ce que l'algorythme trouvais et je passais en revue manuellement les centaines de r\u00e9sultats pour isoler ceux qui posaient probl\u00e8me. C'est comme ca que je me suis rendu compte par exemple que, avec cette police, les 4 et les 1 \u00e9taient souvent confondus. Donc m\u00eame si les tests automatis\u00e9s sont clairement insuffisant par rapport \u00e0 ce que j'aurais peut-\u00eatre du faire, j'ai pass\u00e9 \u00e9norm\u00e9ment de temps \u00e0 tester mon application.","title":"Comment ca c'est pass\u00e9"},{"location":"index.html#comment-ca-aurait-du-se-passer","text":"Si je devais refaire ce projet aujourd'hui je pense que j'utiliserais un peu la m\u00eame technique que pour la doc. J'aurais mis les t\u00e2ches de Tests directement au d\u00e9but du projet et j'aurais determin\u00e9 le squelette de l'application par la m\u00eame occasion. Je pense que j'aurais mis trois jours pour \u00e9crire tous les tests dont j'aurais besoin et j'aurais fait une strat\u00e9gie de TDD (Test Driven Developpement) par ce que je pense que ca marcherait vraiment super bien sur ce type de projet. J'aurais pris je pense 5 une dixaine d'images compl\u00eates de la F1TV de plusieurs GP diff\u00e9rents et j'aurais mis toutes les fen\u00eatres d\u00e9coup\u00e9es dans des fichiers avec des tests comme ceux que j'ai fait pour ce projet. Et comme ca je saurai que mon algo est bon uniquement quand il aura r\u00e9ussi \u00e0 passer tous les tests. Cela r\u00e8glerait le soucis que j'ai eu le plus : Me retrouver \u00e0 devoir changer l'OCR 5 fois par ce que \u00e0 chaque fois que je d\u00e9veloppe une nouvelle feature je me rends compte d'une faiblesse mon algorythme... Non seulement j'aurai eu beaucoup plus de facilit\u00e9 \u00e0 avancer sur le projet, mais en plus je pense que cela m'aurait fait gagner \u00e9norm\u00e9ment de temps non seulement car je n'ai plus \u00e0 tester tout \u00e0 la main mais en plus par ce que ca veut dire que quand l'OCR passe les tests je n'ai plus jamais \u00e0 m'en soucier.","title":"Comment ca aurait du se passer"},{"location":"index.html#lecons","text":"Je pense que dans mes futurs projets je mettrai les tests en d\u00e9but de projet plut\u00f4t que \u00e0 la fin et je ferai en sorte qu'ils fassent partie du chemin critique et que je ne puisse pas passer \u00e0 c\u00f4t\u00e9 sous pretexte que \"Je n'ai pas le temps\". Ecrire des tests c'est jamais marrant et c'est encore moins marrant quand ils nous emp\u00eachent d'avancer. Mais je suis convaincu que au final c'est un gain de temps et de s\u00e9r\u00e9nit\u00e9 incontournable.","title":"Lecons"},{"location":"index.html#resume-des-difficultes-techniques","text":"[A remplir au fur et \u00e0 mesure dans la seconde moiti\u00e9 du travail de dipl\u00f4me]","title":"R\u00e9sum\u00e9 des difficult\u00e9s techniques"},{"location":"index.html#optimisation-du-programme","text":"[A remplir \u00e0 la fin du projet pour parler des diff\u00e9rentes methodes d'optimisation]","title":"Optimisation du programme"},{"location":"index.html#ethique-du-projet","text":"[A remplir \u00e0 la fin du projet pour parler des questions ethiques du projet (Ex: Utilisation potentiellement abusive de la F1Tv ou L'histoire des cookies)]","title":"Ethique du projet"},{"location":"index.html#utilisation-de-chat-gpt","text":"[A remplir \u00e0 la fin du projet]","title":"Utilisation de Chat GPT"},{"location":"index.html#ameliorations-futures","text":"[A remplir dans les derni\u00e8res semaines du travail de dipl\u00f4me]","title":"Am\u00e9liorations futures"},{"location":"index.html#conclusion","text":"[A remplir la derni\u00e8re semaine du travail de dipl\u00f4me]","title":"Conclusion"},{"location":"index.html#notes-de-code","text":"","title":"Notes de code"},{"location":"CahierDesCharges.html","text":"Cahier des charges Cahier des charges \"Track Trends\" Travail de dipl\u00f4me Maxime Rohmer 2023 Contexte Je suis le \"Live Ticker\" charg\u00e9 de la Formule 1 pour le 20 minutes. On peut traduire cela comme commentateur de F1, avec tout de m\u00eame l'importante subtilit\u00e9 que je ne commente pas avec la voix, mais avec le clavier. Mes commentaires sont sous la forme de commentaires \u00e9crits live qui s'ajoutent au fur et \u00e0 mesure de l'\u00e9v\u00e8nement. Par exemple : \"Tour 28/54, Hamilton a fini par s'arr\u00eater et chausser des gommes tendres 13 tours apr\u00e8s Verstappen. L'Anglais va voir plus de 15 secondes \u00e0 rattraper, mais les gommes neuves et plus tendres que son rival devraient lui permettre s'il ne se fait pas trop ralentir par le trafic\". En g\u00e9n\u00e9ral avec un peu plus d'infos quand m\u00eame et cela tous les 3-4 tours Voici quelques exemples de pr\u00e9c\u00e9dents commentaires (Conseil : il y a un bouton pour montrer le feed dans l'ordre chronologique) : \"Commentaire Grand Prix de Belgique 2022\" \"Commentaire du Grand Prix de Singapour 2022\" \"Exemple commentaires\" Pendant un Grand Prix, je dois constamment : \u00c9crire ce qu'il se passe dans le grand prix et expliquer les enjeux Chercher r\u00e9guli\u00e8rement des m\u00e9dias \u00e0 inclure pour diversifier mon live (Tweets, Images etc.) Changer le titre et la description du live en fonction de l'\u00e9volution du Grand prix Et accessoirement regarder le grand prix pour y comprendre quelque chose Avec tout \u00e7a, il est tr\u00e8s difficile de garder un \u0153il sur la page DATA de la F1TV qui fournit pourtant des informations pr\u00e9cieuses. Je me retrouve parfois par exemple \u00e0 ne pas parler de d\u00e9passements dans le peloton, car ils ne sont pas retransmis \u00e0 la t\u00e9l\u00e9 alors que c'est une information importante. Autre exemple, occasionnellement le classement ne refl\u00e8te pas les vraies positions des pilotes. Les arr\u00eats aux stands font que du coup des pilotes qui devraient \u00eatre 15\u00e8mes se retrouvent 8\u1d49 puisqu'ils ne sont pas encore arr\u00eat\u00e9s. Cela peut de temps en temps pr\u00eater \u00e0 confusion. Projet Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes. Le but est non seulement de faciliter mon job, mais aussi faire en sorte d'am\u00e9liorer la plus-value de mon travail en me permettant de fournir des commentaires qui ne sont pas disponibles pour le tout venant qui regarde simplement le flux RTS. Exemples: Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand Maintenant afficher diff\u00e9remment les infos, c'est sympa, mais cela serait encore mieux de traiter ces data et de permettre des petites pr\u00e9dictions. Exemples : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents R\u00e9alisation Malheureusement, la Formula 1 Management ne propose aucune API publique qui puisse nous permettre de faire ce projet \"simplement\". La raison la plus probable \u00e9tant qu'Amazon avec son service AWS propose exactement ce genre de services pour le flux t\u00e9l\u00e9vis\u00e9 et il doit y avoir un contrat d'exclusivit\u00e9. Il existe des API \"Pirates\" faites par la communaut\u00e9, le probl\u00e8me est qu'elles ne sont pas forc\u00e9ment des plus pratiques \u00e0 utiliser. Mais comme je poss\u00e8de un abonnement premium ++ \u00e0 la F1TV, j'ai acc\u00e8s pour chaque grand prix \u00e0 un flux vid\u00e9o nomm\u00e9 : DATA F1 CHANNEL Qui ressemble \u00e0 \u00e7a : \"Data channel exemple\" Donc la seule fa\u00e7on que je vois de r\u00e9cup\u00e9rer ces donn\u00e9es est de les prendre directement sur ce feed. M\u00eame si le but final de l'application est de faire pleins de choses super avec les datas, le gros du projet va surtout \u00eatre la r\u00e9cup\u00e9ration des donn\u00e9es et leur stockage. Les donn\u00e9es viennent du flux vid\u00e9o et ainsi dans un premier temps, il va falloir r\u00e9cup\u00e9rer d'une mani\u00e8re ou d'une autre des images qui viennent d'un grand prix en direct ou en rediffusion. Ensuite, dans un second temps, il faut lire les informations directement sur l'image en utilisant une librairie pr\u00e9vue pour (exemple Tesseract) et v\u00e9rifier l'int\u00e9grit\u00e9 de ces derni\u00e8res pour qu'on puisse ensuite les stocker. Dans un troisi\u00e8me temps, il faut stocker toutes ces donn\u00e9es dans une forme qui permette d'aller facilement faire des requ\u00eates de r\u00e9cup\u00e9ration et d\u00e9j\u00e0 pr\u00e9parer des m\u00e9thodes qui permettent de r\u00e9cup\u00e9rer des infos importantes (ex : la moyenne des cinq derniers tours, le temps moyen d'arr\u00eat etc.) pour faciliter la derni\u00e8re \u00e9tape Quand tout cela est fait, on peut ensuite s'amuser un peu avec les Data. La derni\u00e8re \u00e9tape est donc l'affichage. L'id\u00e9e est de cr\u00e9er une Windows Form qui contienne toutes ces informations dans un format beaucoup plus lisible et avec laquelle on pourrait interagir pour permettre de plus facilement commenter les Grands Prix. (exemple plus bas avec un croquis de ce \u00e0 quoi l'application pourrait ressembler) Voici la liste des donn\u00e9es qui pourraient \u00eatre affich\u00e9es (Non contractuel, simplement des id\u00e9es). Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand La moyenne de temps que les pilotes perdent dans les stands La performance moyenne des 5 types de pneus La moyenne de temps de chaque pilote sur le pneu actuel Le nombre de points que chaque pilote gagnerait selon sa position Le classement de la course Voire m\u00eame si c'est possible : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents Pr\u00e9dire les temps au tour de chaque pilote selon l'usure des pneus Voici un exemple d'interface possible pour une page : \"Proto\" Cas d'utilisation *On va consid\u00e9rer que tous les user ont un abonnement F1 TV PRO Un user veut r\u00e9cup\u00e9rer les data : Il ouvre son navigateur et lance la page DATA de la F1 TV Il calibre la capture des data via le programme (pour la premi\u00e8re utilisation). Il confirme que les donn\u00e9es initiales sont bonnes (pour la premi\u00e8re utilisation). Il regarde tranquille son Grand Prix Le programme r\u00e9cup\u00e8re les data : Il r\u00e9cup\u00e8re des images depuis la F1TV Il utilise Tesseract (ou autre) pour en r\u00e9cup\u00e9rer les infos. Il met ces infos dans un Objet Pilote, dans un Objet course avec un attribut tour pour hi\u00e9rarchiser les data Pour ce qui est de l'affichage, l'id\u00e9e est de faire une application C# comme on l'a appris \u00e0 l'\u00e9cole, mais avec assez de style pour qu'elle puisse \u00eatre agr\u00e9able \u00e0 utiliser. Quand le programme affiche les data : Il prend les donn\u00e9es venant directement de la F1TV. Il affiche diff\u00e9remment les donn\u00e9es pour permettre une meilleure lisibilit\u00e9 Il interpr\u00e8te avec des r\u00e8gles plut\u00f4t simples certaines data pour faire des minipr\u00e9dictions ou aider \u00e0 la lecture Il r\u00e9cup\u00e8re des infos d'autres courses pour les comparer et proposer des pr\u00e9dictions plus int\u00e9ressantes Difficult\u00e9s techniques R\u00e9cup\u00e9rer un flux vid\u00e9o plut\u00f4t propre malgr\u00e9 les contres mesures de la F1 TV pour en emp\u00eacher la lecture par un logiciel Si on doit passer par une capture d'\u00e9cran, trouver un moyen de stocker les donn\u00e9es de mani\u00e8re \u00e0 pr\u00e9voir que parfois un tour pourrait avoir plus de donn\u00e9es qu'un autre, que le user peut mettre pause, ou m\u00eame qu\u2019il revienne en arri\u00e8re. D\u00e9velopper des algorithmes pour r\u00e9cup\u00e9rer les donn\u00e9es comme les diff\u00e9rents pneus utilis\u00e9s ou l'activation du DRS ainsi que d\u00e9velopper des moyens de nettoyer les r\u00e9sultats de l'OCR (Par exemple utiliser diff\u00e9rents champs redondants pour comparer les r\u00e9sultats) Stocker les donn\u00e9es sur une base pour les traiter plus tard tout en pr\u00e9voyant un moyen de voir les stats live D\u00e9velopper des algorithmes de pr\u00e9diction qui prennent en compte d'anciennes courses pour tenter de pr\u00e9dire des choses comme les arr\u00eats aux stands par exemple.","title":"Cahier des charges"},{"location":"CahierDesCharges.html#cahier-des-charges","text":"Cahier des charges \"Track Trends\" Travail de dipl\u00f4me Maxime Rohmer 2023","title":"Cahier des charges"},{"location":"CahierDesCharges.html#contexte","text":"Je suis le \"Live Ticker\" charg\u00e9 de la Formule 1 pour le 20 minutes. On peut traduire cela comme commentateur de F1, avec tout de m\u00eame l'importante subtilit\u00e9 que je ne commente pas avec la voix, mais avec le clavier. Mes commentaires sont sous la forme de commentaires \u00e9crits live qui s'ajoutent au fur et \u00e0 mesure de l'\u00e9v\u00e8nement. Par exemple : \"Tour 28/54, Hamilton a fini par s'arr\u00eater et chausser des gommes tendres 13 tours apr\u00e8s Verstappen. L'Anglais va voir plus de 15 secondes \u00e0 rattraper, mais les gommes neuves et plus tendres que son rival devraient lui permettre s'il ne se fait pas trop ralentir par le trafic\". En g\u00e9n\u00e9ral avec un peu plus d'infos quand m\u00eame et cela tous les 3-4 tours Voici quelques exemples de pr\u00e9c\u00e9dents commentaires (Conseil : il y a un bouton pour montrer le feed dans l'ordre chronologique) : \"Commentaire Grand Prix de Belgique 2022\" \"Commentaire du Grand Prix de Singapour 2022\" \"Exemple commentaires\" Pendant un Grand Prix, je dois constamment : \u00c9crire ce qu'il se passe dans le grand prix et expliquer les enjeux Chercher r\u00e9guli\u00e8rement des m\u00e9dias \u00e0 inclure pour diversifier mon live (Tweets, Images etc.) Changer le titre et la description du live en fonction de l'\u00e9volution du Grand prix Et accessoirement regarder le grand prix pour y comprendre quelque chose Avec tout \u00e7a, il est tr\u00e8s difficile de garder un \u0153il sur la page DATA de la F1TV qui fournit pourtant des informations pr\u00e9cieuses. Je me retrouve parfois par exemple \u00e0 ne pas parler de d\u00e9passements dans le peloton, car ils ne sont pas retransmis \u00e0 la t\u00e9l\u00e9 alors que c'est une information importante. Autre exemple, occasionnellement le classement ne refl\u00e8te pas les vraies positions des pilotes. Les arr\u00eats aux stands font que du coup des pilotes qui devraient \u00eatre 15\u00e8mes se retrouvent 8\u1d49 puisqu'ils ne sont pas encore arr\u00eat\u00e9s. Cela peut de temps en temps pr\u00eater \u00e0 confusion.","title":"Contexte"},{"location":"CahierDesCharges.html#projet","text":"Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes. Le but est non seulement de faciliter mon job, mais aussi faire en sorte d'am\u00e9liorer la plus-value de mon travail en me permettant de fournir des commentaires qui ne sont pas disponibles pour le tout venant qui regarde simplement le flux RTS. Exemples: Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand Maintenant afficher diff\u00e9remment les infos, c'est sympa, mais cela serait encore mieux de traiter ces data et de permettre des petites pr\u00e9dictions. Exemples : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents","title":"Projet"},{"location":"CahierDesCharges.html#realisation","text":"Malheureusement, la Formula 1 Management ne propose aucune API publique qui puisse nous permettre de faire ce projet \"simplement\". La raison la plus probable \u00e9tant qu'Amazon avec son service AWS propose exactement ce genre de services pour le flux t\u00e9l\u00e9vis\u00e9 et il doit y avoir un contrat d'exclusivit\u00e9. Il existe des API \"Pirates\" faites par la communaut\u00e9, le probl\u00e8me est qu'elles ne sont pas forc\u00e9ment des plus pratiques \u00e0 utiliser. Mais comme je poss\u00e8de un abonnement premium ++ \u00e0 la F1TV, j'ai acc\u00e8s pour chaque grand prix \u00e0 un flux vid\u00e9o nomm\u00e9 : DATA F1 CHANNEL Qui ressemble \u00e0 \u00e7a : \"Data channel exemple\" Donc la seule fa\u00e7on que je vois de r\u00e9cup\u00e9rer ces donn\u00e9es est de les prendre directement sur ce feed. M\u00eame si le but final de l'application est de faire pleins de choses super avec les datas, le gros du projet va surtout \u00eatre la r\u00e9cup\u00e9ration des donn\u00e9es et leur stockage. Les donn\u00e9es viennent du flux vid\u00e9o et ainsi dans un premier temps, il va falloir r\u00e9cup\u00e9rer d'une mani\u00e8re ou d'une autre des images qui viennent d'un grand prix en direct ou en rediffusion. Ensuite, dans un second temps, il faut lire les informations directement sur l'image en utilisant une librairie pr\u00e9vue pour (exemple Tesseract) et v\u00e9rifier l'int\u00e9grit\u00e9 de ces derni\u00e8res pour qu'on puisse ensuite les stocker. Dans un troisi\u00e8me temps, il faut stocker toutes ces donn\u00e9es dans une forme qui permette d'aller facilement faire des requ\u00eates de r\u00e9cup\u00e9ration et d\u00e9j\u00e0 pr\u00e9parer des m\u00e9thodes qui permettent de r\u00e9cup\u00e9rer des infos importantes (ex : la moyenne des cinq derniers tours, le temps moyen d'arr\u00eat etc.) pour faciliter la derni\u00e8re \u00e9tape Quand tout cela est fait, on peut ensuite s'amuser un peu avec les Data. La derni\u00e8re \u00e9tape est donc l'affichage. L'id\u00e9e est de cr\u00e9er une Windows Form qui contienne toutes ces informations dans un format beaucoup plus lisible et avec laquelle on pourrait interagir pour permettre de plus facilement commenter les Grands Prix. (exemple plus bas avec un croquis de ce \u00e0 quoi l'application pourrait ressembler) Voici la liste des donn\u00e9es qui pourraient \u00eatre affich\u00e9es (Non contractuel, simplement des id\u00e9es). Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand La moyenne de temps que les pilotes perdent dans les stands La performance moyenne des 5 types de pneus La moyenne de temps de chaque pilote sur le pneu actuel Le nombre de points que chaque pilote gagnerait selon sa position Le classement de la course Voire m\u00eame si c'est possible : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents Pr\u00e9dire les temps au tour de chaque pilote selon l'usure des pneus Voici un exemple d'interface possible pour une page : \"Proto\"","title":"R\u00e9alisation"},{"location":"CahierDesCharges.html#cas-dutilisation","text":"*On va consid\u00e9rer que tous les user ont un abonnement F1 TV PRO Un user veut r\u00e9cup\u00e9rer les data : Il ouvre son navigateur et lance la page DATA de la F1 TV Il calibre la capture des data via le programme (pour la premi\u00e8re utilisation). Il confirme que les donn\u00e9es initiales sont bonnes (pour la premi\u00e8re utilisation). Il regarde tranquille son Grand Prix Le programme r\u00e9cup\u00e8re les data : Il r\u00e9cup\u00e8re des images depuis la F1TV Il utilise Tesseract (ou autre) pour en r\u00e9cup\u00e9rer les infos. Il met ces infos dans un Objet Pilote, dans un Objet course avec un attribut tour pour hi\u00e9rarchiser les data Pour ce qui est de l'affichage, l'id\u00e9e est de faire une application C# comme on l'a appris \u00e0 l'\u00e9cole, mais avec assez de style pour qu'elle puisse \u00eatre agr\u00e9able \u00e0 utiliser. Quand le programme affiche les data : Il prend les donn\u00e9es venant directement de la F1TV. Il affiche diff\u00e9remment les donn\u00e9es pour permettre une meilleure lisibilit\u00e9 Il interpr\u00e8te avec des r\u00e8gles plut\u00f4t simples certaines data pour faire des minipr\u00e9dictions ou aider \u00e0 la lecture Il r\u00e9cup\u00e8re des infos d'autres courses pour les comparer et proposer des pr\u00e9dictions plus int\u00e9ressantes","title":"Cas d'utilisation"},{"location":"CahierDesCharges.html#difficultes-techniques","text":"R\u00e9cup\u00e9rer un flux vid\u00e9o plut\u00f4t propre malgr\u00e9 les contres mesures de la F1 TV pour en emp\u00eacher la lecture par un logiciel Si on doit passer par une capture d'\u00e9cran, trouver un moyen de stocker les donn\u00e9es de mani\u00e8re \u00e0 pr\u00e9voir que parfois un tour pourrait avoir plus de donn\u00e9es qu'un autre, que le user peut mettre pause, ou m\u00eame qu\u2019il revienne en arri\u00e8re. D\u00e9velopper des algorithmes pour r\u00e9cup\u00e9rer les donn\u00e9es comme les diff\u00e9rents pneus utilis\u00e9s ou l'activation du DRS ainsi que d\u00e9velopper des moyens de nettoyer les r\u00e9sultats de l'OCR (Par exemple utiliser diff\u00e9rents champs redondants pour comparer les r\u00e9sultats) Stocker les donn\u00e9es sur une base pour les traiter plus tard tout en pr\u00e9voyant un moyen de voir les stats live D\u00e9velopper des algorithmes de pr\u00e9diction qui prennent en compte d'anciennes courses pour tenter de pr\u00e9dire des choses comme les arr\u00eats aux stands par exemple.","title":"Difficult\u00e9s techniques"},{"location":"ManuelUtilisateur.html","text":"Manuel utilisateur Installation Pour Installer le projet, il faut aller sur le repo qui contient le projet et suivre les \u00e9tapes indiqu\u00e9es dans le ReadMe. Les \u00e9tapes ne sont pas r\u00e9p\u00e9t\u00e9es ici pour \u00e9viter de la redondance et pour \u00e9viter de devoir changer cette documentation si les versions ou les d\u00e9pendances \u00e0 installer changent. A quoi sert l'app ? Track Trends est une application Windows qui sert d'outil pour des abonn\u00e9s de la F1TV qui veulent exploiter le potentiel de la page DATA de la F1TV. L'application est faite pour un seul cas d'utilisation : R\u00e9cup\u00e9rer les infos d'un Grand Prix en cours ou d'une rediffusion et les afficher de mani\u00e8re plus int\u00e9ressante (en mettant en valeur des infos, en construisant un historique et en en interpr\u00e9tant d'autres). L'application est faite pour que l'utilisateur ait le moins de choses \u00e0 faire pour que tout fonctionne. Cela ne veut pas dire que l'utilisateur n'a rien \u00e0 faire et le but de ce document est d'expliquer les diff\u00e9rentes \u00e9tapes n\u00e9cessaires \u00e0 l'utilisation de l'application. Utilisation \"Simple\" Le but de cette section est de vous permettre d'apprendre \u00e0 lancer, stopper et modifier les variables de fonctionnement de l'application. Vous serez donc en mesure d'utiliser le programme correctement. Vous devez commencer par lancer le programme. \"Page de lancement\" Au lancement de l'app, vous devriez avoir une page comme ci-dessus. Il y a beaucoup d'infos, mais pour le moment ce qui nous int\u00e9resse, c'est le menu en haut \u00e0 gauche. \"Contr\u00f4les\" Si c'est la premi\u00e8re fois que vous utilisez l'application, il est possible qu'il n'y ait qu'un seul preset au lieu des quatre ci-dessous voire 0 si vous n'avez pas mis le preset inclus dans l'installation. Si vous n'avez aucun preset, passez directement \u00e0 l'\u00e9tape calibration avant de revenir ici. Comme vous pouvez le voir, en plus des presets s\u00e9lectionnables, il y a quatre boutons (dont deux gris\u00e9s) et une boite de texte avec un lien. Le lien est la chose la plus simple. C'est le lien du Grand Prix que vous voulez analyser. R\u00e9cup\u00e9rer le lien vers le flux Pour remplir la boite de texte pr\u00e9cit\u00e9e, il nous faut un lien et ce lien, on le trouve sur la F1TV . Quand vous vous rendez sur la F1TV la page principale devrait ressembler \u00e0 quelque chose comme \u00e7a (\u00e9videmment le contenu ne sera pas le m\u00eame) : \"Page principale de la F1TV\" Si vous ne vous \u00eates pas d\u00e9j\u00e0 connect\u00e9, connectez-vous et ensuite, allez sur la page du Grand Prix qui vous int\u00e9resse. Pour un Grand Prix en direct, normalement, il y a un endroit o\u00f9 vous pouvez cliquer pour acc\u00e9der au flux directement, et si vous voulez utiliser un Grand Prix en diff\u00e9r\u00e9, vous pouvez aller dans \"202x Season\" ou x est l'ann\u00e9e en cours, en l'occurrence 2023. Et l\u00e0, vous pourrez s\u00e9lectionner un Grand Prix. Dans tous les cas, quand vous avez s\u00e9lectionn\u00e9 votre Grand Prix, vous devriez vous retrouver sur une page de ce style : \"Page d'un Grand Prix sur la F1TV\" Et ici si vous \u00eates sur un Grand Prix en direct, vous pouvez directement copier l'URL de la page et si c'est un Grand Prix en diff\u00e9r\u00e9, vous pouvez directement naviguer avec la barre de progression vid\u00e9o du lecteur de la F1TV, Je conseille de la placer juste apr\u00e8s le d\u00e9part. Vous pouvez prendre le lien avant ou apr\u00e8s avoir chang\u00e9 le timecode de la vid\u00e9o, cela ne change rien, le lien ne contient pas votre progression dans la vid\u00e9o. Ensuite, vous pourrez juste mettre le lien que vous avez r\u00e9cup\u00e9r\u00e9 dans la boite de texte que l'on a vu pr\u00e9c\u00e9demment. Il faut simplement s'assurer que le lien contient bien le terme ?action=play \u00e0 la fin. Boutons Vous n'avez acc\u00e8s qu'\u00e0 deux boutons au lancement de l'application. Le premier nomm\u00e9 'Config' et le second 'Launch' Le bouton 'Config' permet d'ouvrir la page de calibration (voir section Calibration). Le bouton Launch permet de lancer le programme. Le texte peut changer (Par exemple en 'Retry' si le lancement a rat\u00e9) mais son utilit\u00e9 reste la m\u00eame : Lancer le navigateur virtuel qui sera requis pour traiter les donn\u00e9es. Si vous cliquez sur Launch tous les boutons devraient \u00eatre gris\u00e9s, c'est normal. Pendant le lancement du navigateur, l'application ne peut pas \u00eatre utilis\u00e9e pour \u00e9viter des conflits. Il faut juste attendre. Vous aurez \u00e9galement des fen\u00eatres d'invite de commande qui vont s'ouvrir et se fermer, c'est tout \u00e0 fait normal et il ne faut pas interagir avec tant que tout ne s'est pas stabilis\u00e9. Vous devriez voir enfin une fen\u00eatre comme celle ci : \"Page suspecte (Pas de panique, elle ne l'est pas)\" Il ne faut pas fermer cette fen\u00eatre. C'est la seule chose qui nous relie au navigateur virtuel qu'utilise l'application. Il ne faut pas la fermer, par contre, vous pouvez la r\u00e9duire et la laisser en background, c'est d'ailleurs ce que je vous recommande de faire. Peu apr\u00e8s l'ouverture de cette fen\u00eatre, vous devriez avoir acc\u00e8s \u00e0 trois boutons. Bouton 'Config' qui fait la m\u00eame chose qu'avant Bouton 'Re Launch' qui remplace le bouton 'Launch' qui permet de relancer le processus dans le cas ou vous auriez envie de changer de lien ou de preset. Bouton 'Start' lance le processus de r\u00e9cup\u00e9ration de donn\u00e9es. Si vous cliquez sur ce dernier, vous lancerez le programme. Cela peut prendre quelque secondes \u00e0 s'actualiser, mais tr\u00e8s vite vous devriez vous trouver devant une page comme celle-ci : \"D\u00e9but du programme\" Vous n'aurez alors qu'un seul bouton disponible : le bouton 'Stop'. Vous pouvez arr\u00eater le programme quand vous le voulez. ATTENTION : Avant de fermer le programme, merci de stopper d'abord le processus. Si vous stoppez le processus, vous devriez vous retrouver dans la m\u00eame situation que juste apr\u00e8s avoir lanc\u00e9 le navigateur virtuel : \"Arr\u00eat du programme\" Vous pouvez voir en dessous la derni\u00e8re image que le programme a d\u00e9cod\u00e9e et vous avez de nouveau acc\u00e8s aux trois boutons expliqu\u00e9s pr\u00e9c\u00e9demment. Quand l'application a \u00e9t\u00e9 lanc\u00e9e, vous pouvez aussi cliquer sur les donn\u00e9es affich\u00e9es, mais ces comportements sont expliqu\u00e9s dans la section \"Comprendre les donn\u00e9es\" Voil\u00e0 ! Vous savez comment lancer, stopper et modifier les variables de fonctionnement de l'application. Maintenant, vous pouvez passer directement \u00e0 la section \"Comprendre les donn\u00e9es\" si vous voulez apprendre comment utiliser ce que propose le programme ou passer \u00e0 la section \"Calibration\" si vous voulez apprendre \u00e0 configurer l'application et cr\u00e9er des Presets. Calibration Ici, vous apprendrez \u00e0 configurer l'application pour cr\u00e9er vos propres presets et surtout pourquoi vous auriez besoin de le faire et \u00e0 quoi servent ces fameux \"Preset\". Vous serez en mesure d'adapter le fonctionnement de l'application, qu'elle soit conforme aux diff\u00e9rents changements d'interface et de pilotes pr\u00e9sents. Pourquoi calibrer l'application et cr\u00e9er un Preset ? Le programme que vous allez utiliser utilise de l'OCR (Optical Character Recognition). Cela veut dire que le programme va aller regarder chaque image de la F1TV et convertir ce qu'il y a marqu\u00e9 dessus en donn\u00e9es que l'on peut r\u00e9cup\u00e9rer automatiquement. Sauf que pour y arriver, le programme a besoin de savoir o\u00f9 se trouve le texte important et surtout quel type de donn\u00e9e, il est cens\u00e9 trouver \u00e0 tel ou tel endroit. Pour \u00eatre plus pr\u00e9cis, il a \u00e9galement besoin de savoir quels pilotes peuvent se trouver dans la course actuelle. Et pour qu'il sache tout cela, il y a des fichiers de configuration nomm\u00e9s \"Presets\" qui doivent contenir toutes ces informations. Et pour les cr\u00e9er, il existe la page de calibration qui va demander \u00e0 un humain de lui fournir les infos qu'il ne peut pas trouver par lui-m\u00eame. Normalement, il devrait y avoir un Preset fournis par l'application quand vous la t\u00e9l\u00e9chargez depuis le repo mais vous pouvez avoir besoin de faire votre propre \"Preset\" dans deux cas : Quand les pilotes pr\u00e9sents ne sont pas les m\u00eames (Ex : Si un pilote doit \u00eatre remplac\u00e9 ou si de nouveaux pilotes sont arriv\u00e9s ou bien que d'autres aient pris leur retraite) Quand vous voulez utiliser des Grand Prix fait d'une autre ann\u00e9e que celle pour laquelle le \"Preset\" original a \u00e9t\u00e9 pr\u00e9vu. (L'ann\u00e9e devrait \u00eatre mentionn\u00e9e dans le nom du preset) Il est d\u00e9conseill\u00e9 d'utiliser ce projet pour des Grand Prix couru avant 2022, car l'interface de la page Data de la F1TV peut avoir trop chang\u00e9, mais vous pouvez toujours essayer pour voir en faisant votre propre Preset pour des ann\u00e9es comme 2021 ou 2020. Comment cr\u00e9er son Preset Pour cr\u00e9er son Preset, il faut utiliser la page Settings ou Config de l'application. Pour y acc\u00e9der, il faut simplement cliquer sur le bouton \"Config\" de la page principale et vous serez accueilli par une page qui devrait ressembler \u00e0 celle ci dessous : \"Page de config vide\" La seule diff\u00e9rence est que vous aurez s\u00fbrement moins de Presets dans la liste des Presets voir, vous pouvez n'en avoir aucuns. Comme vous pouvez le voir, vous n'avez pas \u00e9norm\u00e9ment d'options disponibles quand vous lancez simplement l'application. Vous n'avez acc\u00e8s qu'aux boutons \"Start the browser\" et \"Add\",\"Remove\". On verra \u00e0 quoi servent ces deux derni\u00e8res plus tard, mais dans un premier temps, on va se pencher sur le bouton Start. Vous pouvez voir qu'en plus de ce bouton, vous pouvez aussi rentrer du texte dans la boite de texte \"Grand Prix URL\" ce qui n'est pas un hasard. Le but, c'est de mettre le lien vers un Grand Prix pour pouvoir avoir une image de test. Pour voir comment r\u00e9cup\u00e9rer cet URL, voir la section (Utilisation \"simple\" \u2192 \"R\u00e9cup\u00e9rer le lien vers le flux\") Quand l'URL a \u00e9t\u00e9 plac\u00e9e au bon endroit, on peut cliquer sur le bouton \"Start\" et attendre. Si vous n'avez pas encore lu la partie \"Utilisation \"simple\"\", vous allez voir des invites de commandes s'ouvrir et se fermer et c'est tout \u00e0 fait normal. Il faut attendre d'avoir une invite de commande qui reste ouverte et qui ressemble \u00e0 celle ci dessous avant de faire quoi que ce soit. Ensuite, vous pourrez simplement r\u00e9duire cette fen\u00eatre et retourner sur la page de configuration. \"Invite de commande suspecte, mais normale\" Ensuite, si vous attendez un peu (le processus peut prendre jusqu'\u00e0 plusieurs dizaines de secondes), vous aurez soit une erreur, soit vous vous retrouverez avec une page qui ressemble \u00e0 \u00e7a : \"Page de config amorc\u00e9e\" Et l\u00e0 on voit que toutes les options ont \u00e9t\u00e9 d\u00e9bloqu\u00e9es. Avant de se pencher sur les nouvelles options, on va rester sur le fonctionnement g\u00e9n\u00e9ral. Le bouton \"Get a newer image\" permet d'avoir une image plus r\u00e9cente de la F1TV. C'est utile par exemple, car comme on le voit sur l'exemple, l'interface de la F1TV n'a pas encore eu le temps de disparaitre. Mais cela peut aussi \u00eatre utile plus tard dans le cas o\u00f9 vous voudriez que certaines infos s'affichent. Le bouton \"Reset Emulator\", lui, permet, comme son nom l'indique, de relancer le navigateur virtuel que l'on a lanc\u00e9 avec le bouton \"Start the browser\". Cela peut \u00eatre utile dans le cas ou l'image ne soit pas l'image que l'on attendait ou si on veut tenter le coup avec un autre URL. Maintenant, on peut passer \u00e0 la cr\u00e9ation des zones et des windows Cr\u00e9ation des Zones et des Windows Sans trop rentrer dans les d\u00e9tails, l'application a besoin de connaitre la localisation de certains \u00e9l\u00e9ments. Elle a besoin de savoir : O\u00f9 se trouve la zone g\u00e9n\u00e9rale des infos pilotes O\u00f9 se trouve chaque pilote O\u00f9 se trouvent les informations pour chacuns de ces pilotes Le programme de calibration est fait pour que vous n'ayez besoin de donner que les informations qu'il ne peut pas deviner. Il y a deux \u00e9tapes : La premi\u00e8re \u00e9tape est de donner les dimensions de la zone principale d'informations. Pour ce faire, il faut dans un premier temps cliquer sur le bouton \"Create the main zone\" qui devrait afficher le texte suivant en dessous apr\u00e8s avoir cliqu\u00e9 : \"Texte indiquant le nombre de points qu'il reste \u00e0 ajouter\" Ensuite, il va falloir cliquer directement sur l'image pour indiquer le coin en haut \u00e0 gauche et le point en bas \u00e0 droite de la zone rectangulaire qui contient les informations. Vous pouvez voir en bleu ci-dessous les coins du rectangle et en rouge l'endroit o\u00f9 il faut cliquer. \"Infographie expliquant o\u00f9 placer les points de la zone principale\" Il faut faire attention \u00e0 bien prendre tous les pilotes MAIS il faut \u00e9galement faire attention \u00e0 ne pas prendre le texte alentours. \"Texte qui ne doit pas \u00eatre dans la zone s\u00e9lectionn\u00e9e\" Ci dessus, on peut voir du texte barr\u00e9 en violet. Il ne faut surtout pas que la zone vienne inclure ces bouts de texte ou toute la calibration pourrait rater. Ensuite, si vous avez bien fait votre travail, au deuxi\u00e8me clic sur la page, vous aurez quelques secondes de flottement et ensuite, vous devriez avoir les contours que vous avez dessin\u00e9s affich\u00e9s en jaune avec pleins de plus petites zones \u00e0 l'int\u00e9rieur comme ci-dessous : \"Zone principale avec les zones de pilotes automatiquement calcul\u00e9es\" Le programme a non seulement pris en compte la zone, mais il a aussi d\u00e9tect\u00e9 automatiquement o\u00f9 se trouvaient les zones de chaque pilote. Si vous n'avez pas un r\u00e9sultat comme celui-l\u00e0 et/ou que les zones ne sont pas bien align\u00e9es sur les pilotes sur l'image, je vous conseille de r\u00e9essayer de cr\u00e9er la zone principale. La seconde \u00e9tape est de montrer o\u00f9 sont les fen\u00eatres d'infos au programme. Vous aurez peut-\u00eatre remarqu\u00e9 qu'en dessous de l'image principale, quand l'affichage jaune a \u00e9t\u00e9 appliqu\u00e9, une image est apparue. Elle devrait ressembler \u00e0 quelque chose dans ce style : \"Image d'une zone de pilote\" C'est une zone de pilote de l'image que l'on voit au-dessus et c'est ici que l'on va indiquer les zones int\u00e9ressantes. Pour ce faire, il faut cliquer sur le bouton \"Create Windows\" et ce message devrait s'afficher un peu en dessous : \"Texte indiquant le nombre de windows \u00e0 ajouter\" Cela nous indique le nombre de fen\u00eatres qu'il nous reste \u00e0 s\u00e9lectionner. La technique est la m\u00eame que pour la grande zone sauf que l\u00e0, il faut le faire neuf fois. Et il faut absolument le faire dans l'ordre de gauche \u00e0 droite. Le but est de tout s\u00e9lectionner et d'arriver \u00e0 ce r\u00e9sultat : \"Exemple de fen\u00eatres d\u00e9coup\u00e9es\" Dans l'ordre, de gauche \u00e0 droite, on veut r\u00e9cup\u00e9rer : La position du pilote Son \u00e9cart avec le leader (en l'occurrence comme c'est le leader que l'on voit, on doit s\u00e9lectionner la fen\u00eatre ou il est marqu\u00e9 \"LEADER\") Son dernier temps au tour La fen\u00eatre DRS L'\u00e9tat de ses pneus Son nom Son temps au secteur 1 Son temps au secteur 2 Son temps au secteur 3 Ajout du nom des pilotes La derni\u00e8re info qui manque \u00e0 notre programme est la liste des pilotes pr\u00e9sents. On peut interagir avec cette liste ici : \"Menu d'interaction avec la liste de pilotes\" Dans la boite de texte, on peut \u00e9crire le nom d'un pilote qui peut \u00eatre trouv\u00e9 sur l'image, on peut l'ajouter \u00e0 la liste et si on a fait une erreur, on peut le retirer. Et c'est \u00e0 peu pr\u00e8s tout. Il ne reste maintenant plus qu'\u00e0 mettre tous les noms. TIP : Il peut \u00eatre int\u00e9ressant d'ajouter le nom des pilotes de r\u00e9serve pour \u00e9viter de venir changer son preset si un pilote n'est pas pr\u00e9sent pour cause de maladie ou de blessure. Il faut simplement faire attention de ne pas non plus mettre trop de noms pour \u00e9viter que le programme puisse confondre. Et voil\u00e0 ! On a toutes les infos n\u00e9cessaires. La page de configuration devrait ressembler \u00e0 \u00e7a : \"Image de la page de config apr\u00e8s avoir ajout\u00e9 toutes les infos\" Il ne reste plus qu'\u00e0 le sauvegarder. Sauvegarder le nouveau Preset Pour sauvegarder le preset, on peut facilement lui donner un nom dans la zone de texte sous les trois boutons de contr\u00f4le des Presets et cliquer sur Save current Preset. Et voil\u00e0, vous savez d\u00e9sormais comment cr\u00e9er vos propres presets et \u00e0 quoi ils servent. Vous pouvez donc adapter le fonctionnement du projet pour qu'il soit conforme aux changements de pilotes et d'interface avec les ann\u00e9es. Vous pouvez ainsi utiliser l'application normalement en s\u00e9lectionnant votre nouveau preset \u00e0 chaque fois. Load un Preset existant Le loading est un peu sp\u00e9cial. Il faut d\u00e9j\u00e0 avoir lanc\u00e9 le navigateur virtuel pour activer les boutons. Ensuite, il suffit de s\u00e9lectionner un preset et de cliquer sur \"Load the Preset\" et attendre un petit peu. L'affichage sera un peu bizarre, mais c'est normal, il ne faut pas s'inqui\u00e9ter si la zone de pilote affich\u00e9e en dessous est correcte. \"Exemple de ce \u00e0 quoi peut ressembler un loading et l'affichage bizarre que \u00e7a implique\" \u00c0 partir de l\u00e0, il est facile de faire son propre preset en changeant juste les noms des pilotes par exemple. Comprendre les donn\u00e9es Ici, vous allez apprendre \u00e0 utiliser l'application et ses donn\u00e9es en comprenant \u00e0 quoi elles servent et comment elles sont affich\u00e9es. \"Image de l'application en cours de fonctionnement depuis quelques minutes\" Il y a 5 types de donn\u00e9es : Overtakes Cette fen\u00eatre est loin d'\u00eatre compl\u00e8tement op\u00e9rationnelle, mais elle permet de voir l'historique des d\u00e9passements et des changements de position. Il faut scroller pour voir les plus r\u00e9cents. Je dirais que pour le moment, c'est la moins int\u00e9ressante et elle ne fonctionne pas toujours super. Last Five Laps \"Image de la fen\u00eatre des cinq derniers tours\" En total contraste avec la fen\u00eatre Overtakes, ici, on a peut-\u00eatre la fen\u00eatre la plus int\u00e9ressante de toutes. On peut voir les pilotes actuellement les plus rapides et plus lents sur le circuit. Le calcul est fait sur la moyenne des cinq derniers tours de chaque pilote. Cela permet de se faire une id\u00e9e de la situation des pilotes. Cela peut servir par exemple \u00e0 d\u00e9tecter quand un pneu est plus rapide que les autres quand on voit des pilotes dans le milieu ou bas de tableau appara\u00eetre dans le plus rapide. Il est par exemple int\u00e9ressant de voir la diff\u00e9rence de vitesse entre les pneus secs et pluie sur un circuit qui commence \u00e0 s\u00e9cher. On peut progressivement voir les pilotes en pneus secs devenir de plus en plus rapides alors que ce sont des pilotes beaucoup moins rapide en temps normal. On peut cliquer sur n'importe lequel de ces pilotes pour voir ses infos appara\u00eetre dans la fen\u00eatre Driver Infos pour voir les cinq derniers tours par exemple ou les pneus qu'il est en train de chausser. Battles \"Fen\u00eatre des batailles\" Cette fen\u00eatre est \u00e9galement assez int\u00e9ressante, car elle permet de voir les pilotes qui sont en train de se battre. Il est estim\u00e9 qu'un pilote qui se bat est un pilote qui est \u00e0 trois secondes ou moins du pilote devant lui. Ne sont affich\u00e9es que les batailles de quatre pilotes maximums dans l'ordre du classement. Si un pilote est entre 2 et 3 secondes de son adversaire, l'\u00e9cart est en blanc. Entre 1 et 2 secondes, il est \u00e9crit en jaune. Dans la zone du DRS (Une seconde ou moins) il est \u00e9crit en vert. On peut aussi cliquer sur le nom d'un pilote pour afficher ses infos dans la fen\u00eatre des infos pilote. Cette fen\u00eatre permet de mieux comprendre qui sont les pilotes qu'il faut garder \u00e0 l'\u0153il \u00e0 la TV ou simplement qui sont les pilotes qui sont tr\u00e8s proches et qui pourraient se mettre la pression pour les arr\u00eats aux stands, car jamais un pilote ne reste \u00e0 moins de trois secondes d'un autre si \u00e7a n'est pas pour tenter quelque chose au niveau strat\u00e9gique. Driver infos \"Fen\u00eatre des infos pilote\" Ici, on peut voir toutes les infos lives d'un pilote. Rien de fou \u00e0 dire sur la partie de gauche, par contre la partie de droite est un peu plus int\u00e9ressante, car elle contient un historique de ses cinq derniers tours (dans la photo, il n'y en a qu'un seul, mais au fur et \u00e0 mesure de la course cela se remplit). On peut non seulement voir les cinq derniers temps au tour, mais on peut aussi cliquer sur chacun d'eux pour voir les secteurs associ\u00e9s. \"Exemple d'affichage des secteurs d'un temps au tour\" ; Live Ranking \"Fen\u00eatre du classement en direct\" Ceci est la fen\u00eatre la plus simple. C'est tout b\u00eatement le classement actuel avec les \u00e9carts avec le leader. Note : On peut \u00e9galement cliquer sur les diff\u00e9rents pilotes pour en afficher les infos dans la fen\u00eatre infos pilote. Erreurs Il est tr\u00e8s probable que si vous utilisez beaucoup cette application, vous allez rencontrer des erreurs. Ici, vous pourrez apprendre ce qu'elles veulent dire et ce que vous pouvez faire pour y rem\u00e9dier. Il n'existe pas un tr\u00e8s grand nombre d'erreurs, mais voici les principales Erreur 100 (Souvent au premier d\u00e9marrage) Cette erreur signale un probl\u00e8me avec la r\u00e9cup\u00e9ration de cookies. Cela peut \u00eatre caus\u00e9 par une mauvaise installation de python ou si vous ne vous \u00eates pas connect\u00e9s r\u00e9cemment \u00e0 la F1TV depuis Chrome ou que vous n'avez tout simplement pas install\u00e9 Chrome sur votre machine. Erreur 101 (Moins r\u00e9current qu'\u00e0 une \u00e9poque) Cette erreur veut dire qu'il y a d\u00e9j\u00e0 une instance de navigateur ouverte. Pour r\u00e9gler cette erreur, regarder dans votre barre des t\u00e2ches les invites de commande ouvertes et fermez celui qui correspond \u00e0 un ancien navigateur. (Si c'est d\u00e9j\u00e0 fait alors en derniers recours, vous pouvez chercher dans le gestionnaire des t\u00e2ches et chercher \"GeckoDriver.exe\") Erreur 102 Cela peut \u00eatre une erreur qui arrive, car vous n'avez pas donn\u00e9 un URL valide pour la F1TV ou par ce que vous ne vous \u00eates pas connect\u00e9 r\u00e9cemment \u00e0 la F1TV depuis chrome (Si vous veniez de le faire alors, attendez un peu et r\u00e9essayez). Parfois cela peut prendre un peu de temps \u00e0 s'actualiser). Erreur 103 L'URL est invalide Erreur 104 L'URL est invalide Erreur 105 Cette erreur indique que soit vous avez donn\u00e9 un URL qui ne correspond \u00e0 aucun Grand Prix, soit que la vid\u00e9o a mis trop de temps \u00e0 charger. Vous pouvez essayer de vous brancher en Ethernet ou simplement r\u00e9essayer si vous \u00eates s\u00fbr de votre URL. Erreur 106 M\u00eame chose que pour la 105","title":"Manuel utilisateur"},{"location":"ManuelUtilisateur.html#manuel-utilisateur","text":"","title":"Manuel utilisateur"},{"location":"ManuelUtilisateur.html#installation","text":"Pour Installer le projet, il faut aller sur le repo qui contient le projet et suivre les \u00e9tapes indiqu\u00e9es dans le ReadMe. Les \u00e9tapes ne sont pas r\u00e9p\u00e9t\u00e9es ici pour \u00e9viter de la redondance et pour \u00e9viter de devoir changer cette documentation si les versions ou les d\u00e9pendances \u00e0 installer changent.","title":"Installation"},{"location":"ManuelUtilisateur.html#a-quoi-sert-lapp","text":"Track Trends est une application Windows qui sert d'outil pour des abonn\u00e9s de la F1TV qui veulent exploiter le potentiel de la page DATA de la F1TV. L'application est faite pour un seul cas d'utilisation : R\u00e9cup\u00e9rer les infos d'un Grand Prix en cours ou d'une rediffusion et les afficher de mani\u00e8re plus int\u00e9ressante (en mettant en valeur des infos, en construisant un historique et en en interpr\u00e9tant d'autres). L'application est faite pour que l'utilisateur ait le moins de choses \u00e0 faire pour que tout fonctionne. Cela ne veut pas dire que l'utilisateur n'a rien \u00e0 faire et le but de ce document est d'expliquer les diff\u00e9rentes \u00e9tapes n\u00e9cessaires \u00e0 l'utilisation de l'application.","title":"A quoi sert l'app ?"},{"location":"ManuelUtilisateur.html#utilisation-simple","text":"Le but de cette section est de vous permettre d'apprendre \u00e0 lancer, stopper et modifier les variables de fonctionnement de l'application. Vous serez donc en mesure d'utiliser le programme correctement. Vous devez commencer par lancer le programme. \"Page de lancement\" Au lancement de l'app, vous devriez avoir une page comme ci-dessus. Il y a beaucoup d'infos, mais pour le moment ce qui nous int\u00e9resse, c'est le menu en haut \u00e0 gauche. \"Contr\u00f4les\" Si c'est la premi\u00e8re fois que vous utilisez l'application, il est possible qu'il n'y ait qu'un seul preset au lieu des quatre ci-dessous voire 0 si vous n'avez pas mis le preset inclus dans l'installation. Si vous n'avez aucun preset, passez directement \u00e0 l'\u00e9tape calibration avant de revenir ici. Comme vous pouvez le voir, en plus des presets s\u00e9lectionnables, il y a quatre boutons (dont deux gris\u00e9s) et une boite de texte avec un lien. Le lien est la chose la plus simple. C'est le lien du Grand Prix que vous voulez analyser.","title":"Utilisation \"Simple\""},{"location":"ManuelUtilisateur.html#recuperer-le-lien-vers-le-flux","text":"Pour remplir la boite de texte pr\u00e9cit\u00e9e, il nous faut un lien et ce lien, on le trouve sur la F1TV . Quand vous vous rendez sur la F1TV la page principale devrait ressembler \u00e0 quelque chose comme \u00e7a (\u00e9videmment le contenu ne sera pas le m\u00eame) : \"Page principale de la F1TV\" Si vous ne vous \u00eates pas d\u00e9j\u00e0 connect\u00e9, connectez-vous et ensuite, allez sur la page du Grand Prix qui vous int\u00e9resse. Pour un Grand Prix en direct, normalement, il y a un endroit o\u00f9 vous pouvez cliquer pour acc\u00e9der au flux directement, et si vous voulez utiliser un Grand Prix en diff\u00e9r\u00e9, vous pouvez aller dans \"202x Season\" ou x est l'ann\u00e9e en cours, en l'occurrence 2023. Et l\u00e0, vous pourrez s\u00e9lectionner un Grand Prix. Dans tous les cas, quand vous avez s\u00e9lectionn\u00e9 votre Grand Prix, vous devriez vous retrouver sur une page de ce style : \"Page d'un Grand Prix sur la F1TV\" Et ici si vous \u00eates sur un Grand Prix en direct, vous pouvez directement copier l'URL de la page et si c'est un Grand Prix en diff\u00e9r\u00e9, vous pouvez directement naviguer avec la barre de progression vid\u00e9o du lecteur de la F1TV, Je conseille de la placer juste apr\u00e8s le d\u00e9part. Vous pouvez prendre le lien avant ou apr\u00e8s avoir chang\u00e9 le timecode de la vid\u00e9o, cela ne change rien, le lien ne contient pas votre progression dans la vid\u00e9o. Ensuite, vous pourrez juste mettre le lien que vous avez r\u00e9cup\u00e9r\u00e9 dans la boite de texte que l'on a vu pr\u00e9c\u00e9demment. Il faut simplement s'assurer que le lien contient bien le terme ?action=play \u00e0 la fin.","title":"R\u00e9cup\u00e9rer le lien vers le flux"},{"location":"ManuelUtilisateur.html#boutons","text":"Vous n'avez acc\u00e8s qu'\u00e0 deux boutons au lancement de l'application. Le premier nomm\u00e9 'Config' et le second 'Launch' Le bouton 'Config' permet d'ouvrir la page de calibration (voir section Calibration). Le bouton Launch permet de lancer le programme. Le texte peut changer (Par exemple en 'Retry' si le lancement a rat\u00e9) mais son utilit\u00e9 reste la m\u00eame : Lancer le navigateur virtuel qui sera requis pour traiter les donn\u00e9es. Si vous cliquez sur Launch tous les boutons devraient \u00eatre gris\u00e9s, c'est normal. Pendant le lancement du navigateur, l'application ne peut pas \u00eatre utilis\u00e9e pour \u00e9viter des conflits. Il faut juste attendre. Vous aurez \u00e9galement des fen\u00eatres d'invite de commande qui vont s'ouvrir et se fermer, c'est tout \u00e0 fait normal et il ne faut pas interagir avec tant que tout ne s'est pas stabilis\u00e9. Vous devriez voir enfin une fen\u00eatre comme celle ci : \"Page suspecte (Pas de panique, elle ne l'est pas)\" Il ne faut pas fermer cette fen\u00eatre. C'est la seule chose qui nous relie au navigateur virtuel qu'utilise l'application. Il ne faut pas la fermer, par contre, vous pouvez la r\u00e9duire et la laisser en background, c'est d'ailleurs ce que je vous recommande de faire. Peu apr\u00e8s l'ouverture de cette fen\u00eatre, vous devriez avoir acc\u00e8s \u00e0 trois boutons. Bouton 'Config' qui fait la m\u00eame chose qu'avant Bouton 'Re Launch' qui remplace le bouton 'Launch' qui permet de relancer le processus dans le cas ou vous auriez envie de changer de lien ou de preset. Bouton 'Start' lance le processus de r\u00e9cup\u00e9ration de donn\u00e9es. Si vous cliquez sur ce dernier, vous lancerez le programme. Cela peut prendre quelque secondes \u00e0 s'actualiser, mais tr\u00e8s vite vous devriez vous trouver devant une page comme celle-ci : \"D\u00e9but du programme\" Vous n'aurez alors qu'un seul bouton disponible : le bouton 'Stop'. Vous pouvez arr\u00eater le programme quand vous le voulez. ATTENTION : Avant de fermer le programme, merci de stopper d'abord le processus. Si vous stoppez le processus, vous devriez vous retrouver dans la m\u00eame situation que juste apr\u00e8s avoir lanc\u00e9 le navigateur virtuel : \"Arr\u00eat du programme\" Vous pouvez voir en dessous la derni\u00e8re image que le programme a d\u00e9cod\u00e9e et vous avez de nouveau acc\u00e8s aux trois boutons expliqu\u00e9s pr\u00e9c\u00e9demment. Quand l'application a \u00e9t\u00e9 lanc\u00e9e, vous pouvez aussi cliquer sur les donn\u00e9es affich\u00e9es, mais ces comportements sont expliqu\u00e9s dans la section \"Comprendre les donn\u00e9es\" Voil\u00e0 ! Vous savez comment lancer, stopper et modifier les variables de fonctionnement de l'application. Maintenant, vous pouvez passer directement \u00e0 la section \"Comprendre les donn\u00e9es\" si vous voulez apprendre comment utiliser ce que propose le programme ou passer \u00e0 la section \"Calibration\" si vous voulez apprendre \u00e0 configurer l'application et cr\u00e9er des Presets.","title":"Boutons"},{"location":"ManuelUtilisateur.html#calibration","text":"Ici, vous apprendrez \u00e0 configurer l'application pour cr\u00e9er vos propres presets et surtout pourquoi vous auriez besoin de le faire et \u00e0 quoi servent ces fameux \"Preset\". Vous serez en mesure d'adapter le fonctionnement de l'application, qu'elle soit conforme aux diff\u00e9rents changements d'interface et de pilotes pr\u00e9sents.","title":"Calibration"},{"location":"ManuelUtilisateur.html#pourquoi-calibrer-lapplication-et-creer-un-preset","text":"Le programme que vous allez utiliser utilise de l'OCR (Optical Character Recognition). Cela veut dire que le programme va aller regarder chaque image de la F1TV et convertir ce qu'il y a marqu\u00e9 dessus en donn\u00e9es que l'on peut r\u00e9cup\u00e9rer automatiquement. Sauf que pour y arriver, le programme a besoin de savoir o\u00f9 se trouve le texte important et surtout quel type de donn\u00e9e, il est cens\u00e9 trouver \u00e0 tel ou tel endroit. Pour \u00eatre plus pr\u00e9cis, il a \u00e9galement besoin de savoir quels pilotes peuvent se trouver dans la course actuelle. Et pour qu'il sache tout cela, il y a des fichiers de configuration nomm\u00e9s \"Presets\" qui doivent contenir toutes ces informations. Et pour les cr\u00e9er, il existe la page de calibration qui va demander \u00e0 un humain de lui fournir les infos qu'il ne peut pas trouver par lui-m\u00eame. Normalement, il devrait y avoir un Preset fournis par l'application quand vous la t\u00e9l\u00e9chargez depuis le repo mais vous pouvez avoir besoin de faire votre propre \"Preset\" dans deux cas : Quand les pilotes pr\u00e9sents ne sont pas les m\u00eames (Ex : Si un pilote doit \u00eatre remplac\u00e9 ou si de nouveaux pilotes sont arriv\u00e9s ou bien que d'autres aient pris leur retraite) Quand vous voulez utiliser des Grand Prix fait d'une autre ann\u00e9e que celle pour laquelle le \"Preset\" original a \u00e9t\u00e9 pr\u00e9vu. (L'ann\u00e9e devrait \u00eatre mentionn\u00e9e dans le nom du preset) Il est d\u00e9conseill\u00e9 d'utiliser ce projet pour des Grand Prix couru avant 2022, car l'interface de la page Data de la F1TV peut avoir trop chang\u00e9, mais vous pouvez toujours essayer pour voir en faisant votre propre Preset pour des ann\u00e9es comme 2021 ou 2020.","title":"Pourquoi calibrer l'application et cr\u00e9er un Preset ?"},{"location":"ManuelUtilisateur.html#comment-creer-son-preset","text":"Pour cr\u00e9er son Preset, il faut utiliser la page Settings ou Config de l'application. Pour y acc\u00e9der, il faut simplement cliquer sur le bouton \"Config\" de la page principale et vous serez accueilli par une page qui devrait ressembler \u00e0 celle ci dessous : \"Page de config vide\" La seule diff\u00e9rence est que vous aurez s\u00fbrement moins de Presets dans la liste des Presets voir, vous pouvez n'en avoir aucuns. Comme vous pouvez le voir, vous n'avez pas \u00e9norm\u00e9ment d'options disponibles quand vous lancez simplement l'application. Vous n'avez acc\u00e8s qu'aux boutons \"Start the browser\" et \"Add\",\"Remove\". On verra \u00e0 quoi servent ces deux derni\u00e8res plus tard, mais dans un premier temps, on va se pencher sur le bouton Start. Vous pouvez voir qu'en plus de ce bouton, vous pouvez aussi rentrer du texte dans la boite de texte \"Grand Prix URL\" ce qui n'est pas un hasard. Le but, c'est de mettre le lien vers un Grand Prix pour pouvoir avoir une image de test. Pour voir comment r\u00e9cup\u00e9rer cet URL, voir la section (Utilisation \"simple\" \u2192 \"R\u00e9cup\u00e9rer le lien vers le flux\") Quand l'URL a \u00e9t\u00e9 plac\u00e9e au bon endroit, on peut cliquer sur le bouton \"Start\" et attendre. Si vous n'avez pas encore lu la partie \"Utilisation \"simple\"\", vous allez voir des invites de commandes s'ouvrir et se fermer et c'est tout \u00e0 fait normal. Il faut attendre d'avoir une invite de commande qui reste ouverte et qui ressemble \u00e0 celle ci dessous avant de faire quoi que ce soit. Ensuite, vous pourrez simplement r\u00e9duire cette fen\u00eatre et retourner sur la page de configuration. \"Invite de commande suspecte, mais normale\" Ensuite, si vous attendez un peu (le processus peut prendre jusqu'\u00e0 plusieurs dizaines de secondes), vous aurez soit une erreur, soit vous vous retrouverez avec une page qui ressemble \u00e0 \u00e7a : \"Page de config amorc\u00e9e\" Et l\u00e0 on voit que toutes les options ont \u00e9t\u00e9 d\u00e9bloqu\u00e9es. Avant de se pencher sur les nouvelles options, on va rester sur le fonctionnement g\u00e9n\u00e9ral. Le bouton \"Get a newer image\" permet d'avoir une image plus r\u00e9cente de la F1TV. C'est utile par exemple, car comme on le voit sur l'exemple, l'interface de la F1TV n'a pas encore eu le temps de disparaitre. Mais cela peut aussi \u00eatre utile plus tard dans le cas o\u00f9 vous voudriez que certaines infos s'affichent. Le bouton \"Reset Emulator\", lui, permet, comme son nom l'indique, de relancer le navigateur virtuel que l'on a lanc\u00e9 avec le bouton \"Start the browser\". Cela peut \u00eatre utile dans le cas ou l'image ne soit pas l'image que l'on attendait ou si on veut tenter le coup avec un autre URL. Maintenant, on peut passer \u00e0 la cr\u00e9ation des zones et des windows","title":"Comment cr\u00e9er son Preset"},{"location":"ManuelUtilisateur.html#creation-des-zones-et-des-windows","text":"Sans trop rentrer dans les d\u00e9tails, l'application a besoin de connaitre la localisation de certains \u00e9l\u00e9ments. Elle a besoin de savoir : O\u00f9 se trouve la zone g\u00e9n\u00e9rale des infos pilotes O\u00f9 se trouve chaque pilote O\u00f9 se trouvent les informations pour chacuns de ces pilotes Le programme de calibration est fait pour que vous n'ayez besoin de donner que les informations qu'il ne peut pas deviner. Il y a deux \u00e9tapes : La premi\u00e8re \u00e9tape est de donner les dimensions de la zone principale d'informations. Pour ce faire, il faut dans un premier temps cliquer sur le bouton \"Create the main zone\" qui devrait afficher le texte suivant en dessous apr\u00e8s avoir cliqu\u00e9 : \"Texte indiquant le nombre de points qu'il reste \u00e0 ajouter\" Ensuite, il va falloir cliquer directement sur l'image pour indiquer le coin en haut \u00e0 gauche et le point en bas \u00e0 droite de la zone rectangulaire qui contient les informations. Vous pouvez voir en bleu ci-dessous les coins du rectangle et en rouge l'endroit o\u00f9 il faut cliquer. \"Infographie expliquant o\u00f9 placer les points de la zone principale\" Il faut faire attention \u00e0 bien prendre tous les pilotes MAIS il faut \u00e9galement faire attention \u00e0 ne pas prendre le texte alentours. \"Texte qui ne doit pas \u00eatre dans la zone s\u00e9lectionn\u00e9e\" Ci dessus, on peut voir du texte barr\u00e9 en violet. Il ne faut surtout pas que la zone vienne inclure ces bouts de texte ou toute la calibration pourrait rater. Ensuite, si vous avez bien fait votre travail, au deuxi\u00e8me clic sur la page, vous aurez quelques secondes de flottement et ensuite, vous devriez avoir les contours que vous avez dessin\u00e9s affich\u00e9s en jaune avec pleins de plus petites zones \u00e0 l'int\u00e9rieur comme ci-dessous : \"Zone principale avec les zones de pilotes automatiquement calcul\u00e9es\" Le programme a non seulement pris en compte la zone, mais il a aussi d\u00e9tect\u00e9 automatiquement o\u00f9 se trouvaient les zones de chaque pilote. Si vous n'avez pas un r\u00e9sultat comme celui-l\u00e0 et/ou que les zones ne sont pas bien align\u00e9es sur les pilotes sur l'image, je vous conseille de r\u00e9essayer de cr\u00e9er la zone principale. La seconde \u00e9tape est de montrer o\u00f9 sont les fen\u00eatres d'infos au programme. Vous aurez peut-\u00eatre remarqu\u00e9 qu'en dessous de l'image principale, quand l'affichage jaune a \u00e9t\u00e9 appliqu\u00e9, une image est apparue. Elle devrait ressembler \u00e0 quelque chose dans ce style : \"Image d'une zone de pilote\" C'est une zone de pilote de l'image que l'on voit au-dessus et c'est ici que l'on va indiquer les zones int\u00e9ressantes. Pour ce faire, il faut cliquer sur le bouton \"Create Windows\" et ce message devrait s'afficher un peu en dessous : \"Texte indiquant le nombre de windows \u00e0 ajouter\" Cela nous indique le nombre de fen\u00eatres qu'il nous reste \u00e0 s\u00e9lectionner. La technique est la m\u00eame que pour la grande zone sauf que l\u00e0, il faut le faire neuf fois. Et il faut absolument le faire dans l'ordre de gauche \u00e0 droite. Le but est de tout s\u00e9lectionner et d'arriver \u00e0 ce r\u00e9sultat : \"Exemple de fen\u00eatres d\u00e9coup\u00e9es\" Dans l'ordre, de gauche \u00e0 droite, on veut r\u00e9cup\u00e9rer : La position du pilote Son \u00e9cart avec le leader (en l'occurrence comme c'est le leader que l'on voit, on doit s\u00e9lectionner la fen\u00eatre ou il est marqu\u00e9 \"LEADER\") Son dernier temps au tour La fen\u00eatre DRS L'\u00e9tat de ses pneus Son nom Son temps au secteur 1 Son temps au secteur 2 Son temps au secteur 3","title":"Cr\u00e9ation des Zones et des Windows"},{"location":"ManuelUtilisateur.html#ajout-du-nom-des-pilotes","text":"La derni\u00e8re info qui manque \u00e0 notre programme est la liste des pilotes pr\u00e9sents. On peut interagir avec cette liste ici : \"Menu d'interaction avec la liste de pilotes\" Dans la boite de texte, on peut \u00e9crire le nom d'un pilote qui peut \u00eatre trouv\u00e9 sur l'image, on peut l'ajouter \u00e0 la liste et si on a fait une erreur, on peut le retirer. Et c'est \u00e0 peu pr\u00e8s tout. Il ne reste maintenant plus qu'\u00e0 mettre tous les noms. TIP : Il peut \u00eatre int\u00e9ressant d'ajouter le nom des pilotes de r\u00e9serve pour \u00e9viter de venir changer son preset si un pilote n'est pas pr\u00e9sent pour cause de maladie ou de blessure. Il faut simplement faire attention de ne pas non plus mettre trop de noms pour \u00e9viter que le programme puisse confondre. Et voil\u00e0 ! On a toutes les infos n\u00e9cessaires. La page de configuration devrait ressembler \u00e0 \u00e7a : \"Image de la page de config apr\u00e8s avoir ajout\u00e9 toutes les infos\" Il ne reste plus qu'\u00e0 le sauvegarder.","title":"Ajout du nom des pilotes"},{"location":"ManuelUtilisateur.html#sauvegarder-le-nouveau-preset","text":"Pour sauvegarder le preset, on peut facilement lui donner un nom dans la zone de texte sous les trois boutons de contr\u00f4le des Presets et cliquer sur Save current Preset. Et voil\u00e0, vous savez d\u00e9sormais comment cr\u00e9er vos propres presets et \u00e0 quoi ils servent. Vous pouvez donc adapter le fonctionnement du projet pour qu'il soit conforme aux changements de pilotes et d'interface avec les ann\u00e9es. Vous pouvez ainsi utiliser l'application normalement en s\u00e9lectionnant votre nouveau preset \u00e0 chaque fois.","title":"Sauvegarder le nouveau Preset"},{"location":"ManuelUtilisateur.html#load-un-preset-existant","text":"Le loading est un peu sp\u00e9cial. Il faut d\u00e9j\u00e0 avoir lanc\u00e9 le navigateur virtuel pour activer les boutons. Ensuite, il suffit de s\u00e9lectionner un preset et de cliquer sur \"Load the Preset\" et attendre un petit peu. L'affichage sera un peu bizarre, mais c'est normal, il ne faut pas s'inqui\u00e9ter si la zone de pilote affich\u00e9e en dessous est correcte. \"Exemple de ce \u00e0 quoi peut ressembler un loading et l'affichage bizarre que \u00e7a implique\" \u00c0 partir de l\u00e0, il est facile de faire son propre preset en changeant juste les noms des pilotes par exemple.","title":"Load un Preset existant"},{"location":"ManuelUtilisateur.html#comprendre-les-donnees","text":"Ici, vous allez apprendre \u00e0 utiliser l'application et ses donn\u00e9es en comprenant \u00e0 quoi elles servent et comment elles sont affich\u00e9es. \"Image de l'application en cours de fonctionnement depuis quelques minutes\" Il y a 5 types de donn\u00e9es :","title":"Comprendre les donn\u00e9es"},{"location":"ManuelUtilisateur.html#overtakes","text":"Cette fen\u00eatre est loin d'\u00eatre compl\u00e8tement op\u00e9rationnelle, mais elle permet de voir l'historique des d\u00e9passements et des changements de position. Il faut scroller pour voir les plus r\u00e9cents. Je dirais que pour le moment, c'est la moins int\u00e9ressante et elle ne fonctionne pas toujours super.","title":"Overtakes"},{"location":"ManuelUtilisateur.html#last-five-laps","text":"\"Image de la fen\u00eatre des cinq derniers tours\" En total contraste avec la fen\u00eatre Overtakes, ici, on a peut-\u00eatre la fen\u00eatre la plus int\u00e9ressante de toutes. On peut voir les pilotes actuellement les plus rapides et plus lents sur le circuit. Le calcul est fait sur la moyenne des cinq derniers tours de chaque pilote. Cela permet de se faire une id\u00e9e de la situation des pilotes. Cela peut servir par exemple \u00e0 d\u00e9tecter quand un pneu est plus rapide que les autres quand on voit des pilotes dans le milieu ou bas de tableau appara\u00eetre dans le plus rapide. Il est par exemple int\u00e9ressant de voir la diff\u00e9rence de vitesse entre les pneus secs et pluie sur un circuit qui commence \u00e0 s\u00e9cher. On peut progressivement voir les pilotes en pneus secs devenir de plus en plus rapides alors que ce sont des pilotes beaucoup moins rapide en temps normal. On peut cliquer sur n'importe lequel de ces pilotes pour voir ses infos appara\u00eetre dans la fen\u00eatre Driver Infos pour voir les cinq derniers tours par exemple ou les pneus qu'il est en train de chausser.","title":"Last Five Laps"},{"location":"ManuelUtilisateur.html#battles","text":"\"Fen\u00eatre des batailles\" Cette fen\u00eatre est \u00e9galement assez int\u00e9ressante, car elle permet de voir les pilotes qui sont en train de se battre. Il est estim\u00e9 qu'un pilote qui se bat est un pilote qui est \u00e0 trois secondes ou moins du pilote devant lui. Ne sont affich\u00e9es que les batailles de quatre pilotes maximums dans l'ordre du classement. Si un pilote est entre 2 et 3 secondes de son adversaire, l'\u00e9cart est en blanc. Entre 1 et 2 secondes, il est \u00e9crit en jaune. Dans la zone du DRS (Une seconde ou moins) il est \u00e9crit en vert. On peut aussi cliquer sur le nom d'un pilote pour afficher ses infos dans la fen\u00eatre des infos pilote. Cette fen\u00eatre permet de mieux comprendre qui sont les pilotes qu'il faut garder \u00e0 l'\u0153il \u00e0 la TV ou simplement qui sont les pilotes qui sont tr\u00e8s proches et qui pourraient se mettre la pression pour les arr\u00eats aux stands, car jamais un pilote ne reste \u00e0 moins de trois secondes d'un autre si \u00e7a n'est pas pour tenter quelque chose au niveau strat\u00e9gique.","title":"Battles"},{"location":"ManuelUtilisateur.html#driver-infos","text":"\"Fen\u00eatre des infos pilote\" Ici, on peut voir toutes les infos lives d'un pilote. Rien de fou \u00e0 dire sur la partie de gauche, par contre la partie de droite est un peu plus int\u00e9ressante, car elle contient un historique de ses cinq derniers tours (dans la photo, il n'y en a qu'un seul, mais au fur et \u00e0 mesure de la course cela se remplit). On peut non seulement voir les cinq derniers temps au tour, mais on peut aussi cliquer sur chacun d'eux pour voir les secteurs associ\u00e9s. \"Exemple d'affichage des secteurs d'un temps au tour\" ;","title":"Driver infos"},{"location":"ManuelUtilisateur.html#live-ranking","text":"\"Fen\u00eatre du classement en direct\" Ceci est la fen\u00eatre la plus simple. C'est tout b\u00eatement le classement actuel avec les \u00e9carts avec le leader. Note : On peut \u00e9galement cliquer sur les diff\u00e9rents pilotes pour en afficher les infos dans la fen\u00eatre infos pilote.","title":"Live Ranking"},{"location":"ManuelUtilisateur.html#erreurs","text":"Il est tr\u00e8s probable que si vous utilisez beaucoup cette application, vous allez rencontrer des erreurs. Ici, vous pourrez apprendre ce qu'elles veulent dire et ce que vous pouvez faire pour y rem\u00e9dier. Il n'existe pas un tr\u00e8s grand nombre d'erreurs, mais voici les principales Erreur 100 (Souvent au premier d\u00e9marrage) Cette erreur signale un probl\u00e8me avec la r\u00e9cup\u00e9ration de cookies. Cela peut \u00eatre caus\u00e9 par une mauvaise installation de python ou si vous ne vous \u00eates pas connect\u00e9s r\u00e9cemment \u00e0 la F1TV depuis Chrome ou que vous n'avez tout simplement pas install\u00e9 Chrome sur votre machine. Erreur 101 (Moins r\u00e9current qu'\u00e0 une \u00e9poque) Cette erreur veut dire qu'il y a d\u00e9j\u00e0 une instance de navigateur ouverte. Pour r\u00e9gler cette erreur, regarder dans votre barre des t\u00e2ches les invites de commande ouvertes et fermez celui qui correspond \u00e0 un ancien navigateur. (Si c'est d\u00e9j\u00e0 fait alors en derniers recours, vous pouvez chercher dans le gestionnaire des t\u00e2ches et chercher \"GeckoDriver.exe\") Erreur 102 Cela peut \u00eatre une erreur qui arrive, car vous n'avez pas donn\u00e9 un URL valide pour la F1TV ou par ce que vous ne vous \u00eates pas connect\u00e9 r\u00e9cemment \u00e0 la F1TV depuis chrome (Si vous veniez de le faire alors, attendez un peu et r\u00e9essayez). Parfois cela peut prendre un peu de temps \u00e0 s'actualiser). Erreur 103 L'URL est invalide Erreur 104 L'URL est invalide Erreur 105 Cette erreur indique que soit vous avez donn\u00e9 un URL qui ne correspond \u00e0 aucun Grand Prix, soit que la vid\u00e9o a mis trop de temps \u00e0 charger. Vous pouvez essayer de vous brancher en Ethernet ou simplement r\u00e9essayer si vous \u00eates s\u00fbr de votre URL. Erreur 106 M\u00eame chose que pour la 105","title":"Erreurs"},{"location":"jdb.html","text":"Journal de bord Mercredi 29 Mars 2023 Premier jour du travail de dipl\u00f4me. Nous avons eu un briefing de mr Garcia et nous avons pu commencer \u00e0 pr\u00e9parer le travail. Nous avons eu les diff\u00e9rents fichiers nescessaires \u00e0 la bonne r\u00e9alisation du projet et je me suis mis \u00e0 faire les fichiers nescessaires La premi\u00e8re chose a \u00e9t\u00e9 de faire ce mkdocs dans lequel j'ai mis un fichier yml plut\u00f4t standart qui risque de changer au fur et \u00e0 mesure. Voici le premier yml : site_name: Documentation Diplome theme: name: material palette: # Palette toggle for light mode - media: \"(prefers-color-scheme: light)\" scheme: default toggle: icon: material/brightness-7 name: Switch to dark mode # Palette toggle for dark mode - media: \"(prefers-color-scheme: dark)\" scheme: slate toggle: icon: material/brightness-4 name: Switch to light mode markdown_extensions: - attr_list - md_in_html plugins: - glightbox - with-pdf Voici un example de \u00e0 quoi ca ressemble en forme de site \"Exemple mkdocs\" Ensuite il m'a fallu faire une version plus \u00e0 jour de mon cahier des charges car je n'y avait pas touch\u00e9 depuis novembre. J'ai envoy\u00e9 un mail \u00e0 mes enseignants pour qu'ils puissent y jeter un oeuil pour \u00eatre s\u00fbr que je n'ai rien chang\u00e9 qui les d\u00e9rangent. Monsieur Jayr m'a demad\u00e9 \u00e0 l'occasion de lui faire un planning type Gantt alors je me suis mis \u00e0 la t\u00e2che. J'ai fait un planning pr\u00e9visionnel et une l\u00e9gende les deux sont dispo dans le dossier planning de ce repertoire. Ensuite je me suis mis \u00e0 tout mettre sur git. A commencer par ce repertoire Et c'est deja la fin de la journ\u00e9e ! Demain j'avance un peu sur la doc avec ce que je peux d\u00e9ja remplir et je finis de pr\u00e9parer ce dont j'ai besoin pour commencer \u00e0 coder. Jeudi 30 Mars 2023 Aujourd'hui selon le planning je dois me charger des dernirers pr\u00e9paratifs pour commencer correctement. J'ai fait expr\u00e8s de prenre du temps pour ca au d\u00e9but pour ne pas me cr\u00e9er de soucis plus loin pendant le travail. Je vais envoyer par mail le planning que j'ai fait \u00e0 mes suiveurs. Ensuite je vais m'attaquer au squelette de la docmentation. Je vais essayer de remplir tout ce que je peux remplir dans un premier temps car cela tout ca de fait pour plus tard quitte \u00e0 modifier quelques aspects au fur et \u00e0 mesure. J'ai aussi d\u00e9sactiv\u00e9 mkdocs with pdf par ce que les r\u00e9sultats ne sont vraiment pas ceux que j'attends et cela ralentis \u00e9norm\u00e9ment le d\u00e9ploiment. J'ai aussi rassembl\u00e9 mes croquis pour le poster : \"Croquis Poster 1\" \"Croquis Poster 2\" On peut voir que dans un premier temps j'ai tent\u00e9 de faire un poster un peu plus stylis\u00e9 et marketing. Cependant apr\u00e8s avoir discut\u00e9 avec Mr Garcia et diff\u00e9rents profs dont un de l'HEPIA et ils m'ont indiqu\u00e9 que ce qui \u00e9tait attendu \u00e9tait moins du marketing qu'un diagramme de fonctionnement. On peut voir sur les derniers posters que le cot\u00e9 technique ressort de plus en plus. Le but sera de faire une version encore plus technique ou on peut voir les diff\u00e9rents fonctionnements de l'application avec les technologies utilis\u00e9es. Le d\u00e9fi cela va \u00eatre de faire un joli poster qui soit en m\u00eame temps vendeur et en m\u00eame temps rempli techniquement. Oh et j'ai eu un probl\u00e8me ou mon calvier et ma souris ne voulaient d'un coup plus fonctionner. Dans mon cas c'\u00e9tait un probl\u00e8me de power management des ports. J'ai eu le soucis sur mon pc fixe \u00e0 la maison et sur mon pc portable \u00e9galement. En gros de ce que j'ai compris le soucis c'est que le pc croit que un port est trop solicit\u00e9 niveau puissance et du coup d\u00e9cide de couper l'alimentation du port USB. J'ai pu r\u00e8gler le soucis en allant dans le device manager sous universal bus controller sous power management et en d\u00e9cochant la case qui indique que windows peut d\u00e9sactiver ce port. Je ne conseille pas ce fix si vous avez des composants de mauvaise qualit\u00e9 car cela pourrait \u00eatre une vraie alerte cependant le fait que mes composants sont plut\u00f4t haut de gamme et le fait que mon clavier et ma souris le fassent en m\u00eame temps et que ils fonctionnaient tr\u00e8s bien depuis plus de 4 ans me font penser que c'est juste une nouvelle mise a jour de windows qui est p\u00e9nible. Demain je vais pouvoir commencer \u00e0 coder pour de bon. Vendredi 31/03/2023 Aujourd'hui on s'occupe de la PT2 qui est la programmation de la r\u00e9cup\u00e8ration des informations des images. Je vais tester IronOcr Source : https://www.c-sharpcorner.com/article/ocr-using-tesseract-in-C-Sharp/ Doc : https://ironsoftware.com/csharp/ocr/docs/ Examples : https://ironsoftware.com/csharp/ocr/examples/simple-csharp-ocr-tesseract/ Avant d'utiliser la librairie je me demande si je dois utiliser un peu de post processing pour aider \u00e0 la reconnaissance. Je peux soit utiliser l'image crop\u00e9e directement : \"Image non trait\u00e9e\" Soit avec un filtre pour passer en noir et blanc laxiste \"Image trait\u00e9e laxiste\" Soit avec un filtre pour passer en noir et blanc stricte \"Image trait\u00e9e stricte\" Il va falloir faire des tests avec tous les noms et les chiffres pour trouver le plus efficace. Bon malheureusment Iron OCR semblait \u00eatre une bonne alternative mais c'est une librairie priv\u00e9e qui demande une license pour \u00eatre utilis\u00e9e. Il va falloir trouver autre chose. En utilisant la librairie \"Tesseract\" qui existe on peut faire de la reconnaissance de texte avec un code plut\u00f4t simple : TesseractEngine engine = new TesseractEngine ( tessDataFolder . FullName , \"eng\" , EngineMode . Default ); var tessImage = Pix . LoadFromMemory ( ImageToByte ( sample )); Page page = engine . Process ( tessImage ); string text = page . GetText (); Voici la methode ImageToByte : https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-array public static byte [] ImageToByte ( Image img ) { using ( var stream = new MemoryStream ()) { img . Save ( stream , System . Drawing . Imaging . ImageFormat . Png ); return stream . ToArray (); } } Voici le code pour traiter plusieurs textes sur une seule image : Page page = engine . Process ( tessImage ); // Get the iterator for the page layout using ( var iter = page . GetIterator ()) { // Loop over the elements of the page layout iter . Begin (); do { // Declare a Rect variable to hold the bounding box Rect boundingBox ; // Get the bounding box for the current element if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { g . DrawRectangle ( Pens . Red , new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } // Get the text for the current element var text = iter . GetText ( PageIteratorLevel . Word ); tbxResult . Text += text . ToUpper () + Environment . NewLine ; } while ( iter . Next ( PageIteratorLevel . Word )); } Etonnament, avec plus de texte, des noms qui \u00e9taient autrefois mal reconnus sont parfaitement interpr\u00eat\u00e9s. Par exemple voici un exemple de reconnaisance de texte sur tous les pilotes : \"Screenshot de reconnaisance d'image complete\" On voit que le nom Leclerc est mal reconnu. Mais voici ce que cela donne quand on prend une image qui ne contient que le nom Leclerc : \"Screenshot de reconnaissance d'image crop\u00e9e\" On voit ici que le nom Leclerc est tr\u00e8s bien reconnu. Dans le premier exemple on peut voir que Tsunoda est reconnu comme \"Reticin\" ce qui n'est pas exactement pareil (lol) Et quand on isole le nom Tsunoda dans une image seule : \"Screenshot de reconnaissance de Tsunoda\" Il le lit \"RETLELYY\" ce qui n'est toujours pas exactement ca... Une meilleure r\u00e9solution pourrait peut-\u00eatre r\u00e9soudre le probl\u00e8me en partie. Jusqu'ici les images \u00e9taient en presque 720P ce qui donne ceci : \"Tsunoda en 720P\" Et j'ai lanc\u00e9 une r\u00e9cup\u00e8ration d'images en 1080p pour r\u00e9cup\u00e8rer ceci : \"Tsunoda en 1080P\" On peut voir une certaine diff\u00e9rence tout de m\u00eame. Et quand on lance la reconnaissance : \"Reconnaissance Tsunoda en 1080P\" \"Tsunoda n'est plus \u00e9crit \"RETLELYY\" mais \"TSUNDDA\" ce qui n'est pas parfait mais qui est d\u00e9ja beaucoup mieux. J'ai essay\u00e9 de mettre l'engine de Tesseract en mode \"JPN\" comme Tsunoda est un nom japonais mais sans succ\u00e8s j'ai le m\u00eame r\u00e9sultat. Comme la r\u00e9solution est meilleure je me suis dit que peut \u00eatre le filtre de passage en noir et blanc pourrait aider. J'ai \u00e9crit cette petite methode pour convertir l'image en noir et blanc : private static Bitmap ConvertToBlackAndWhite ( Bitmap inputBmp ) { const int BLACK_TO_WHITE_TRESHOLD = 200 ; Bitmap result = new Bitmap ( inputBmp . Width , inputBmp . Height ); for ( int y = 0 ; y < inputBmp . Height ; y ++) { for ( int x = 0 ; x < inputBmp . Width ; x ++) { Color pixelColor = inputBmp . GetPixel ( x , y ); if ( pixelColor . R <= BLACK_TO_WHITE_TRESHOLD && pixelColor . G <= BLACK_TO_WHITE_TRESHOLD && pixelColor . B <= BLACK_TO_WHITE_TRESHOLD ) { pixelColor = Color . FromArgb ( 0 , 0 , 0 ); } else { pixelColor = Color . FromArgb ( 255 , 255 , 255 ); } result . SetPixel ( x , y , pixelColor ); } } return result ; } Rien de bien dingue mais cela fonctionne et je peux jouer avec le BLACK_AND_WHITE_TRESHOLD pour changer son comportement. J'ai dabord test\u00e9 avec un treshold de 100 et le programme a r\u00e9ussi \u00e0 me sortir Tsunoda en deux mots ce qui \u00e9tait d\u00e9ja tr\u00e8s encourageant. Et apr\u00e8s avoir augment\u00e9 le Treshold... Tada : \"Tsunoda 1080P avec filtre\" Le programme arrive bien \u00e0 reconnaitre TSUNODA. Je pense que cette tactique ne fonctionnait pas avant car la resolution \u00e9tait trop faible et l'aliasing se m\u00ealait trop avec le texte pour \u00eatre utilisable. Cependant cette technique ne fonctionne pas sur tous les noms. Par example avec Leclerc : \"Leclerc 1080P avec filtre\" On r\u00e9cup\u00e8re \"Leeler'c\" ce qui n'est pas bon du tout. Mais en modulant le Treshold (ici \u00e0 150) On peut de nouveau voir Leclerc \u00eatre reconnu correctement \"Leclerc 1080P avec filtre 2\" Je pense que pour avoir de bons r\u00e9sultats il va falloir faire un algo qui : D\u00e9coupe l'image en autant de plus petites images pour avoir un mot par image. Teste voir si avec l'image originale un nom correspond \u00e0 la liste de pilotes existant. Si cela ne marche pas, on applique le filtre en modulant le Treshold. Dans le cas ou on aurait pas un match parfait on fait un algo qui cherche le nom le plus proche qui existe dans la liste de noms donn\u00e9s. Seulement voila, il n'y a pas que des lettres que l'on veut r\u00e9cup\u00e8rer. On veut surtout pouvoir r\u00e9cup\u00e8rer les chiffres. Pour les chiffres on va avoir des soucis \u00e9galement... Si on essaie directement la m\u00eame technique sans filtre on a des r\u00e9sultats comme celui ci : \"Tentative de reconnaisance du timing\" La virgule a tendeance \u00e0 se barrer ce qui est particuli\u00e8rement probl\u00e9matique. Cependant comme les chiffres ont beaucoup moins de possibilit\u00e9es que les lettres et qu'il n'y a pas de probl\u00e8me de langue on devrait pouvoir travailler \u00e0 faire des r\u00e8glage que l'on pourra ensuite utiliser. Avec un Treshold de 165 on arrive presque \u00e0 quelque chose d'int\u00e9ressant : \"Tentative 2 de reconnaissance du timing\" Le + n'est clairement pas compris mais ca n'est pas emb\u00eatant car c'est souvent redondant. On arrive cependant \u00e0 isoler 3 et 259. M\u00eame si la virgule n'est pas comprise cela veut dire qu'il est tout de m\u00eame possible de discriminer les secondes des milisecondes. Maintenant avec un temps au tour : \"Reconnaissance du timing au tour\" On arrive sans rien changer aux param\u00eatres \u00e0 isoler minutes secondes et milisecondes. Il semble que la reconnaissance de chiffre soit bien plus efficace que la reconnaissance de lettres. Il va falloir faire un test \u00e0 plus grande \u00e9chelle avec plus d'image pour se rendre compte de la precision. Demain ce qui serait bien cela serait que je fasse un jeu d'images avec des valeurs connues et que je fasse une batterie de tests pour voir \u00e0 quel point je peux faire confiance \u00e0 la reconnaissance des chiffres. Automatiser un syst\u00e8me de test de la sorte me sera tr\u00e8s utile dans le futur pour v\u00e9rifier la non regression de ma reconnaissance de texte quand je tenterai d'y faire des changements. Je suis toujours curieux cependant de voir comment le programme se d\u00e9brouille avec les nombres de tours qui se trouvent dans les icones de pneus. Lundi 3 Avril Aujourd'hui on va faire un programme qui permet de cr\u00e9er un dataset qui permette de tester le programme de reconnaissance. Je pense que le meilleur moyen de faire serait un programme qui cr\u00e9e le dataset et qui ensuite peut tester diff\u00e9rentes methodes de reconnaissance. Par la m\u00eame occasion je peux d\u00e9velopper la technologie qui va permettre de d\u00e9couper une image en 20 lignes ce qui me servira ensuite pour la reconnaissance. Je me rend compte que pour faire un programme de tests je dois d\u00e9ja avoir une id\u00e9e de la structure de mon programme. Pour le moment je r\u00e9flechis \u00e0 un syst\u00e8me de \"Zones\" et de \"Windows\". L'id\u00e9e serait que une Zone est juste une sous partie d'image qui peut encore \u00eatre d\u00e9compos\u00e9 tandis que chaque Window contient une ou plusieurs informations \u00e0 r\u00e9cup\u00e8rer. J'ai essay\u00e9 de d\u00e9couper l'image pour que cela soit plus clair : \"Main zone\" Ici on peut voir que l'image est d\u00e9coup\u00e9e en plusieurs grandes zones. Dans un premier temps on ne s'occupe que de la premi\u00e8re. Ensuite : \"Driver zone #1\" On peut voir la que cette Main zone serait elle m\u00eame d\u00e9compos\u00e9e en plusieurs plus petites zones. Et ensuite chacunes de ces petites zones : \"Driver windows\" Sera d\u00e9compos\u00e9e en plusieurs windows qui elles sont des zones qui contiennent de l'information. En gros on aurait trois types de zone : Les zones qui contiennent d'autres zones Les zones qui contiennent des Windows Les Windows Cependant en y r\u00e9flechissant on pourrait tout \u00e0 fait avoir seulement des zones et des windows en faisant en sorte que les windows peuvent avoir une liste de windows et une liste de zones. Une zone serait compos\u00e9e de : Une image de d\u00e9part Un rectangle qui la positionne sur cette derni\u00e8re Une liste de zones (potentiellement vide) Une liste de windows (potentiellement vide) Une methode qui permet de r\u00e9cup\u00e8rer une image de la zone Une methode qui permet de lancer la reconnaissance sur chaque window Une window serait compos\u00e9e de : Une image de d\u00e9part (cela peut \u00eatre l'image crop\u00e9e de la zone parente peu importe) Un rectangle qui la positionne sur cette derni\u00e8re Une methode qui permet de r\u00e9cup\u00e9rer un image de la window Une methode qui permet de lancer la reconnaisance sur l'image (Chaque type de zone doit l'impl\u00e9menter) Dans chaque window on peut imaginer que la methode qui fait la reconnaissance au lieu de retourner un objet qui peut contenir nimporte quel type d'information peut envoyer ce qu'elle vient de r\u00e9cup\u00e8rer dans une base de donn\u00e9e ou un objet. Par exemple une Zone de pilote pourrait tr\u00e8s bien contenir un objet pilote et le donner \u00e0 ses windows qui rempliraient ce m\u00eame objet. C'est une reflexion plus stockage que OCR mais c'est int\u00e9ressant pour savoir ce que fait une window des donn\u00e9es qu'elle r\u00e9cup\u00e8re. Dans un premier temps je pense que les windows vont simplement \u00e9crire dans un fichier ce qu'elles trouvent chacunes dans le format qu'elles veulent. Pour comprendre pourquoi je me prend la t\u00eate il faut savoir que chaque window peut avoir acc\u00e8s \u00e0 pleins d'informations diff\u00e9rentes. On pourrait dire qu'elles retournent toutes une string sauf que si ca marche pour un temps au tour ou pour un nom de pilote, cela ne marche pas forc\u00e9ment pour un type de pneu ou un DRS ouver. Comme chaque window a plusieurs types de data elle devra elle m\u00eame se charger de comment la traiter ET de la stocker. Voila un diagramme qui r\u00e9sume comment je vois l'impl\u00e9mentation dans un premier temps : \"Diagramme d'explications\" Voici comment se pr\u00e9sente le squellette d'une Zone : public class Zone { private Bitmap FullImage ; private List < Zone > Zones ; private List < Window > Windows ; private Rectangle _bounds ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap ZoneImage { get { Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( FullImage , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Zone ( Image fullImage , Rectangle bounds ) { FullImage = ( Bitmap ) fullImage ; Init ( bounds ); } public Zone ( Bitmap fullImage , Rectangle bounds ) { FullImage = fullImage ; Init ( bounds ); } private void Init ( Rectangle bounds ) { Bounds = bounds ; Zones = new List < Zone >(); Windows = new List < Window >(); } public void AddZone ( Rectangle bounds ) { if ( Fits ( bounds )) Zones . Add ( new Zone ( ZoneImage , bounds )); } public void AddWindow ( Rectangle bounds ) { if ( Fits ( bounds )) Windows . Add ( new Window ( ZoneImage , bounds )); } private bool Fits ( Rectangle inputRectangle ) { if ( inputRectangle . X + inputRectangle . Width > Bounds . Width || inputRectangle . Y + inputRectangle . Height > Bounds . Height || inputRectangle . X < 0 || inputRectangle . Y < 0 ) { return false ; } else { return true ; } } } Le but est ensuite de cr\u00e9er diff\u00e9rent types de Zones. Par exemple la MainZone devra d\u00e9couper son contenu en 20 parties \u00e9gales pour tenter de chopper les 20 pilotes. Il serait cool de trouver un moyen de calibrer automatiquement. C'est peut-\u00eatre possible de calibrer avec de la reconnaissance de texte, on peut essayer de lancer la reconnaissance et voir ou on trouve du texte avec un peu de chance cela pourrait donner les positions et avec ca on peut peut-\u00eatre determiner des lignes. Et voici le squelette d'une window g\u00e9n\u00e9rique using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace OCR_tester { public class Window { private Bitmap FullImage ; private Rectangle _bounds ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap WindowImage { get { Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( FullImage , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Window ( Bitmap fullImage , Rectangle bounds ) { FullImage = fullImage ; Bounds = bounds ; } public virtual void RecoverInformations () { //Each Window type will have to implement its own way to recover the informations stored in the Window Image } } } Chaque Window pourra ainsi elle m\u00eame impl\u00e9menter la r\u00e9cup\u00e8ration d'informations. La facon de les retourner/stocker est encore un peu floue. Par exemple pour un temps au tour on peut imaginer que il fait une petite v\u00e9rification dans l'objet pilote et dans le tableau des tours si il n'y a pas deja une valeur et si il n'y en a pas une alors il peut l'ajouter. Maintenant je vais essayer de cr\u00e9er une Main window qui se calibre toute seule. Alors apr\u00e8s avoir bien gal\u00e8r\u00e9 avec l'interface pour permettre au user de cliquer sur la form pour voir les zones qu'il cr\u00e9e, j'ai pu cr\u00e9er un zone qui fait les dimensions de MainZone et j'ai pu lancer la reconnaissance sur l'image et voir ou il trouve du texte : \"MainZone avec carr\u00e9s de texte\" Maintenant il faut que je nettoie la liste de rectangle pour exclure ceux qui sont trop grands pour \u00eatre sur une seule ligne, ceux qui indiquent le nombre de tour en haut et ceux qui n'ont pas d'int\u00e9r\u00eats. On pourra ensuite isoler les lignes et cr\u00e9er une liste d'images. Pour ce qui est de la ligne qui contient les \"Gap interval last lap\" et des chiffres sur les tours pour les pneus etc je vais juste demander \u00e0 l'utilisateur de ne pas les prendre dans la screenshot. Comme ils contiennent des mots qui peuvent \u00eatre utilis\u00e9s plus loin dans les data je ne peux pas les blacklister et faire un syst\u00e8me qui s'occupe de les enlever si ils existent selon le position y me prendrait trop de temps pour rien. Apr\u00e8s avoir filtr\u00e9 un peu les resultats et enlev\u00e9 les zones beaucoup trop grandes, on se retrouve d\u00e9ja plus qu'avec ca : \"MainZone avec de meilleurs carr\u00e9s\" Comme on peut le voir, du c\u00f4t\u00e9 gauche de l'image on a beaucoup de choses reconnues mais avec beaucoup de tailles diff\u00e9rentes ce qui n'est pas id\u00e9al. Alors j'ajoute un filtre qui permet de ne selectionner que les data sur la droite. \"MainZone avec de meilleurs carr\u00e9s\" Maintenant il devrait \u00eatre possible de faire un algorythme qui ne prend que un seul carr\u00e9 par ligne. \"MainZone avec un seul carr\u00e9 par ligne\" Maintenant que on sait ou se trouve chaque ligne on peut faire un petit traitement et d\u00e9couper l'image en plusieurs windows. Et voila : \"Mainzone auto calibr\u00e9e\" Maintenant le programme peut cr\u00e9er des zones pour chaque pilote \"Images pilotes\" \"Zone d'un pilote\" Maintenant il faut que j'impl\u00e9mente un syst\u00e8me un peu similaire pour cr\u00e9er des windows. Voici la methode que j'ai cr\u00e9\u00e9 pour l'autocalibration : public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); Zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . tessDataFolder . FullName , \"eng\" , EngineMode . Default ); Image image = ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //var text = iter.GetText(PageIteratorLevel.Word).ToUpper(); //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); Zones . Add ( new Zone ( ZoneImage , windowRectangle )); } } Ca peut paraitre pas \u00e9norme comme code mais pour tout mettre en place ca demande quand m\u00eame pas mal de reflexion. J'ai du clean un peu le code que j'avais fait pour permettre la selection de zones et ajouter la possibilit\u00e9 d'ajouter des windows sur une zone. J'ai juste quelques difficult\u00e9es \u00e0 les ajouter correctement, j'ai un offset tout pourri qui se met tout le temps \"Sainz coup\u00e9\" \"Perez coup\u00e9\" Cela doit \u00eatre un soucis lors de la detection de clic qui met un offset en trop. C'est vraiment p\u00e9nible en tout cas. Certes c'est moins fun de devoir manuellement indiquer ou sont les windows sur une ligne de pilote, mais je ne vois vraiment pas comment faire cela automatiquement. Le but c'est de faire une configuration qui puisse \u00eatre sauvegard\u00e9e comme ca pas besoin d'\u00e0 chaques fois le refaire. C'est bon ! J'avais juste oubli\u00e9 de changer le calcul d'offset entre le code de la zone et de la window. Note pour plus tard, il serait peut-\u00eatre judicieux de faire quelque chose pour la vue, les windows et les Zones ont le m\u00eame exact comportement pour la vue ce qui fait dupliquer du code. Mais au moins maintenant ca fonctionne : \"Ocr tester screenshot\" Et le programme va directement cr\u00e9er un dossier par pilote avec toutes les images de chaque Data le concernant : \"Dossier Perez\" ; Et c'est tout pour aujourd'hui je pense. Ce qui serait cool demain c'est que je puisse stocker d'une mani\u00e8re ou d'une autre ces fichiers de calibration et que je puisse les transf\u00e8rer vers le programme qui va s'occuper de d\u00e9coder et commencer gentillement \u00e0 d\u00e9coder les diff\u00e9rents types de data. Note pour quand je ferai les tests. Je pense que la meilleure id\u00e9e serait que je prenne pleins de photos du style et que je les mette dans un fichier CSV ou JSON avec leur contenu. Et ensuite je le fais passer en tests pour calculer la prescision de mon algo de d\u00e9codage. Pour le moment on est plut\u00f4t dans les clouts niveau planning. Mardi 4 Avril Aujourd'hui je suis scens\u00e9 plut\u00f4t bosser sur l'interpretation des donn\u00e9es, mais une id\u00e9e m'a taraud\u00e9 l'esprit toute la nuit. Est-ce que je ne pourrais pas quand m\u00eame essayer de d\u00e9composer la zone de pilote directment comme pour la Main zone. Pour ce faire j'ai tent\u00e9 de faire comme pour la main zone c'est \u00e0 dire lancer la reconnaissance pour savoir ou \u00e9taient tous les champs de donn\u00e9es mais malheureusement je ne pense pas que cela va \u00eatre possible. En effet non seulement ici les champs sont de tailles tr\u00e8s vari\u00e9es, mais en plus la reconnaissance n'arrive pas \u00e0 en r\u00e9cup\u00e8rer le m\u00eame nombre sur chaque ligne ce qui risque d'\u00eatre complexe \u00e0 utiliser ensuite. La preuve : \"Tentative d'auto calibration\" ; Cependant tout n'est pas perdu ! Il y a peut-\u00eatre un moyen qui serait mieux en tous points. Le soucis avec ce type de reconnaissance c'est qu'on utilise beaucoup de ressources inutiles. On peut peut-\u00eatre hard coder la valeur des diviseurs et les utiliser pour cr\u00e9er des zones. Ok alors visiblement c'est un probl\u00e8me car il semble y avoir d'autres pixels de cette couleur dans l'image (Qui l'aurait cru lol) \"Tentative 2\" J'a tent\u00e9 de r\u00e9duire la tol\u00e9rance mais le soucis c'est que c'est soit trop soit pas assez Derni\u00e8re tentative, j'ai essay\u00e9 de prendre plusieurs pixels en hauteur pour chaque incr\u00e9ment de X et en faire la moyenne, et m\u00eame comme ca, impossible de trouver de mani\u00e8re efficace les zones. Je pense que je vais donc revert tous mes changements pour revenir \u00e0 la version ou on les choisissait manuellement. Pas mal de temps perdu mais bon c'est comme ca ca arrive Bon j'ai fait un revert mais j'ai ajout\u00e9 une feature importante. Les zones font la largeur indiqu\u00e9e par l'utilisateur mais elles font la hauteur max comme ca toutes les window font la m\u00eame hauteur et ca permet \u00e0 l'utilisateur de ne pas forc\u00e9ment \u00eatre ultra pr\u00e9cis dans sa selection. Ce qui nous donne : \"Resultat final\" Maintenant je dirais que les deux prochaines choses \u00e0 faire seraient de stocker ces zones dans un fichier JSON ou autre pour que la calibration puisse \u00eatre envoy\u00e9e directement dans le logiciel de reconnaissance et ensuite de faire une calibration sur des images qui font la taille qu'on aura pendant les Grands Prix. Pour le moment elles sont au format 16:10 qui est le format d'\u00e9crant de mon laptop. Pour le stockage j'imagine un fichier qui donne des indications assez simples qui permettent de reconstruire le total des zones quand il est import\u00e9 plutot que d'\u00e9crire les coordonn\u00e9es en dur pour chacunes. Chaque Grande zone va impl\u00e9menter une methode qui s'occupe de mettre tous ses enfants dans un fichier. { \"MainZone\" :{ \"x\" : 10 , \"y\" : 20 , \"width\" : 1450 , \"height\" : 1340 , \"DriverZone\" :{ \"x\" : 0 , \"y\" : 23 , \"height\" : 25 , \"Windows\" :[ { \"DriverPositionWindow\" :{ \"x\" : 0 , \"y\" : 0 , \"width\" : 35 } }, { \"DriverPositionChangesWindow\" :{ \"x\" : 0 , \"y\" : 0 , \"width\" : 45 } } ] } } } C'est le r\u00e9sultat auquel j'aimerais arriver. Mais pour y arriver il faut encore que je cr\u00e9e les diff\u00e9rents types de window. Cela veut dire que je dois d\u00e9cider quelles informations je vais r\u00e9cup\u00e8rer de la page. Par exemple je vais conserver la position du pilote mais au final les changements de positions sont difficiles \u00e0 lire et sont redondants. Si je garde un historique des positions des pilotes je peux calculer moi m\u00eame les changements. Pareil pour gap avec la voiture devant. Je pense que je vais juste garder l'information des \u00e9carts absolus et ensuite je pourrai toujours calculer la diff\u00e9rence entre les pilotes. Ca peut para\u00eetre b\u00eate car cela rajoute du calcul mais en r\u00e9alit\u00e9 le calcul de l'OCR est extr\u00eamement gourmand alors il faut que j'\u00e9vite le plus possible d'y faire recours. Il est bien plus rapide de calculer les \u00e9carts que d'essayer de reconnaitre le texte et le convertir en chiffre. J'ai visiblement ajout\u00e9 un bug dans mon code. Maintenant tous les pilotes ont la m\u00eame image quand on les selectionne. Mais visiblement ca n'\u00e9tait pas le cas avant car j'avais pu prendres des images de chaque pilote. J'ai pass\u00e9 3 minutes \u00e0 fixer un bug stupide j'ai un peu envie de br\u00fbler ma place de travail... Mais bon au moins maintenant cela fonctionne ! Toutes les images sont r\u00e9cup\u00e8r\u00e9es et ont un format correct avec le bon nom : \"Verstappen folder\" Avec un peu de code tr\u00e8s moche j'ai pu cr\u00e9er un fichier JSON qui contient les diff\u00e9rentes infos. Cependant en exportant TOUT on se retrouve avec un fichier de 1200 lignes ce qui n'est pas optimal. Mais quand on regarde, il devrait \u00eatre possible de faire un fichier qui ne contient que les infos d'un seul pilote car ensuite il y a simplement un offset \u00e0 appliquer sur la zone et les windows. Je vais donc pouvoir commencer enfin le logiciel de d\u00e9codage qui prend en entr\u00e9e un fichier JSON comme celui ci qui a \u00e9t\u00e9 g\u00e9n\u00e8r\u00e9 avec le programme de calibration. { \"Main\" : { \"x\" : 40 , \"y\" : 230 , \"width\" : 1845 , \"height\" : 719 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : 3 , \"width\" : 1845 , \"height\" : 35 , \"Windows\" : [ { \"Position\" : { \"x\" : 2 , \"y\" : 0 , \"width\" : 32 }, \"GapToLeader\" : { \"x\" : 204 , \"y\" : 0 , \"width\" : 96 }, \"LapTime\" : { \"x\" : 413 , \"y\" : 0 , \"width\" : 105 }, \"Drs\" : { \"x\" : 526 , \"y\" : 0 , \"width\" : 81 }, e t c... } ] } } ] } } Dans le futur il faudrait ajouter d'autres choses comme par exemple les diff\u00e9rents pilotes pr\u00e9sents sur le Grand Prix et ce genre d'infos. Quoique je vais l'ajouter d\u00e9ja maintenant et plus tard je mettrai en place la feature acessible depuis l'interface. Mais le hardcoder maintenant me permet d\u00e9ja de mieux coder l'autre c\u00f4t\u00e9. Ce programme n'est en aucun cas termin\u00e9 et je vais devoir travailler encore un peu dessus pour qu'il soit utilisable correctement mais au moins il fonctionne \u00e0 peu pr\u00e8s. Exemple du json avec les noms de pilotes: { \"Main\" : { \"x\" : 37 , \"y\" : 238 , \"width\" : 1851 , \"height\" : 713 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : -5 , \"width\" : 1851 , \"height\" : 35 } } ] }, \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , e t c... ] } Maintenant je vais m'attaquer au d\u00e9codage. Demain je dois finir le d\u00e9codage du JSON et je dois commencer \u00e0 impl\u00e9menter la reconnaissance des textes. Voire m\u00eame des pneus etc si j'y arrive. Mercredi 5 Avril Bon la il faut vraiment que je finisse assez vite la lecture du JSON et la reconstruction des zones pour commencer la reconnaissance. J'ai pris beaucoup de temps \u00e0 faire le programme de calibration mais je pense que c'est essentiel de prendre ce temps maintenant. (BTW il faudra quand m\u00eame retourner faire une plus jolie version par ce que la ca marche mais c'est tout) Bon apr\u00e8s pas mal de boulot je pense avoir r\u00e9ussi. Dans le nouveau programme on arrive \u00e0 r\u00e9cup\u00e8rer les diff\u00e9rentes zones : \"JSON decode result\" Un conseil de notre professeur M.Bonvin a \u00e9t\u00e9 de cr\u00e9er des Releases de versions qui ne fonctionnent pas ou pas tr\u00e8s bien. J'ai donc publi\u00e9 une premi\u00e8re release de l'OCR_TEST qui fonctionne vite fait. J'ai seulement un petit soucis, comme je recr\u00e9e compl\u00eatement la structure des driver zones avec seulement la premi\u00e8re, il y a un petit d\u00e9calage car entre les zones il y avait un gap. Ce qui fait que si la premi\u00e8re zone est parfaitement centr\u00e9e : \"Centered driver\" La vingti\u00e8me ne l'est plus exactement : \"Uncentered Driver\" Pour ca j'ai essay\u00e9 de mettre un espacement arbitraire mais c'est complexe. Je vais plut\u00f4t tenter de faire une diff\u00e9rence entre la taille de la zone compl\u00eate et de la taille additionn\u00e9e de toutes les fen\u00eatre et diviser le resultat entre toutes les fen\u00eatres. Ca n'est pas parfait mais au moins maintenant les donn\u00e9es ne touchent plus les bords de la fen\u00eatre. Et voila ! Maintenant avec le fichier de configuration en Json on arrive \u00e0 r\u00e9cup\u00e8rer toutes les infos comme si elles avaient \u00e9t\u00e9 envoy\u00e9es directement depuis l'app de calibration mais sans le processing time ! \"Verstappen folder 2 On peut donc ENFIN passer au d\u00e9codage de ces FICHUES donn\u00e9es. Je vais pouvoir impl\u00e9menter ce que j'ai fait dans le projet de test de d\u00e9codage. Gr\u00e2ce \u00e0 mon d\u00e9coupage initial qui m'a pris du temps \u00e0 impl\u00e9menter on a enfin un truc qui marche m\u00eame si je n'ai impl\u00e9ment\u00e9 que la reconnaissance de noms. \"Image reconnaissance propre\" Si on se rappelle du syst\u00e8me de window et de zones dans le diagramme plus haut, c'est assez facile de comprendre comment je m'y suis pris. En gros on des listes et des listes de listes de zones, c'est la partie un peu plus technique car il y a des zones qui peuvent contenir d'autres zones etc. Je vais commencer par la reconnaissance de noms. Voici le tableau de pilotes de 2023 \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , \"Hamilton\" , \"Alonso\" , \"Russel\" , \"Gasly\" , \"Stroll\" , \"Sainz\" , \"Hulkenberg\" , \"Norris\" , \"Tsunoda\" , \"Piastri\" , \"Zhou\" , \"Ocon\" , \"Magnussen\" , \"Perez\" , \"Sargeant\" , \"De Vries\" , \"Bottas\" , \"Albon\" ] ET voici le tableau de pilotes de 2022 : \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , \"Sainz\" , \"Perez\" , \"Hamilton\" , \"Russel\" , \"Magnussen\" , \"Gasly\" , \"Ocon\" , \"Alonso\" , \"Tsunoda\" , \"Bottas\" , \"Zhou\" , \"Albon\" , \"Stroll\" , \"Schumacher\" , \"Hulkenberg\" , \"Norris\" , \"Latifi\" , \"Ricciardo\" ] Je les notes ici car J'ai souvent besoin de changer selon le dataset que j'utilise. Dans le futur je ferai s\u00fbrement un grand dataset qui prend des pilotes de reserves et des pilotes juniors pour que dans le cas ou un pilote est remplac\u00e9 dans l'ann\u00e9e il n'y a pas besoin de tout recalibrer avec l'application. Apr\u00e8s une discussion avec M.Bonvin j'ai d\u00e9cid\u00e9 de tester 3 valeurs de convertion en noir et blanc et si je ne trouve pas un match exact je prend le nom le plus proche. Pour trouver la string la plus proche je pense que je vais utiliser quelque chose qui s'appelle la technique de Levenshtein. De ce que j'ai compris c'est un algorythme qui permet de donner une metric de diff\u00e9rence entre deux strings. Bon et \u00e9videmment il ne faut pas se tromper dans la liste des pilotes GENRE NE PAS OUBLIER QUE GEORGE RUSSELL COMPORTE DEUX WFNEWIEWV DE \"L\" A LA FIN DE SON NOM CE QUI POURRAIT ENGRANGER 2H DE DEBUGGING POUR RIEN ASK ME HOW I KNOW joker laugh J'ai vraiment un soucis avec Tsunoda, Il a trop tendeance \u00e0 le confondre avec \"TSUNDDA\" et pour des raisons obscures, quand j'applique l'algorythme de Levenshtein le plus proche n'est pas \"Tsunoda\" mais \"Sainz\" iniuvbwdiucbiubisc POURQUOI !!??!! Je pense que cela demande moins de changements de lettres enfin bon c'est quand m\u00eame pas id\u00e9al. Il va falloir que je trouve un moyen de le repond\u00e9rer. C'est dommage par ce que cela marche super avec Alonso Verstappen et Albon. J'ai un peu modifi\u00e9 la methode et j'ai fait en sorte d'envoyer tous les noms en majuscules en me disant que cela pourrait r\u00e9duire le nombre de changements. Et ca a march\u00e9 !! Cela va s\u00fbrement demander plus de tests pour \u00eatre bien s\u00fbr que tout fonctionne nikel, cependant pour le moment ca marche parfaitement avec les pilotes de 2022. Pour ce qui est de la reconnaissance de chiffres, j'ai d\u00e9ja fait une partie du boulot le premier jour alors je vais juste reprendre \u00e0 partir de l\u00e0. Je r\u00e9cup\u00e8re une string de ce type \"1:35.123\" le soucis c'est que les : se transforment parfois en . ou inversement mais bon ca devrait pas \u00eatre trop dur \u00e0 g\u00e8rer. Il faut que je transforme cette string en nombre de milisecondes (Du moins je pense que c'est le meilleur moyen pour ensuite pouvoir facilement comparer et stocker l'information). Cela fait que 1:35:123 en milisecondes donne : 1 * 1000 * 60 => 60'000 35 * 1000 => 35'000 123 => 123 Total : 60'000+35'000+123 => 95'123ms Et pour l'affichage : Minutes = ms / 60'000 secondes = (ms - (minutes/60'000))/1000 ms = ms - ((minutes 60'000) + (secondes * 1000)) Et on se retrouve avec 1:35:123 Maintenant apr\u00e8s un peu de temps pour nettoyer la string etc on se retrouve avec un r\u00e9sultat comme le suivant : Position : 0 Gap to leader : 0:0:0 Lap time : 2:15:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:323 Sector 2 : 0:42:340 Sector 3 : 0:0:0 Evidemment pareil pour les autres pilotes Et je me rend compte que j'ai encore tout cass\u00e9 car le laptime ne devrait pas \u00eatre 2:15 mais 1:35... Voila apr\u00e8s une heure de debugging et des ajouts pour nettoyer les chaines on se retrouve avec : Position : 0 Gap to leader : 0:0:0 Lap time : 1:35:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:323 Sector 2 : 0:42:340 Sector 3 : 0:0:0 Note: le traitement commence \u00e0 devenir long, il serait peut-\u00eatre int\u00e9ressant d'utiliser un seul Tesseract Engine ou de voir ce qui prend autant de temps, on d\u00e9passe la seconde de traitement ce qui est un peu ma limite. Apr\u00e8s on peut toujours tester de rajouter du multicore processing mais c'est pour une autre fois. Demain je m'occupe de r\u00e8gler les soucis que j'ai avec la prescision de ces temps au tour et j'\u00e9sp\u00e8re pouvoir m'occuper aussi de la position des pneus et du DRS. J'aimerais finir tout ca cette semaine. Jeudi 6 Avril Une id\u00e9e m'est pass\u00e9e par la t\u00eate pendant que je dormais, dans la liste des pilotes, quand ils sont \u00e0 plus d'un tour de retard avec le leader (Ce qui arrive normalement dans presque tous les Grand Prix) on a pas des minutes mais une string qui montre \"+1 Lap\" ou \"+2Laps\" ce qui est \u00e9videmment un probl\u00e8me. Je pense qu'une bonne facon d'envoyer l'info serait de retourner -1 -2etc... \u00e0 la place des milisecondes, mais encore faut-il detecter le nombre de tours Je devrais \u00eatre en train de commencer la documentation de commment tout ce que j'ai fait fonctionne. Cependant je ne me vois pas faire ca tant que je n'ai pas au moins r\u00e9cup\u00e8r\u00e9 toutes les infos au moins un peu proprement. Cela veut dire que je commence officiellement \u00e0 prendre du retard. (Sachant que si je finis tout aujourd'hui une journ\u00e9e de doc suffira largement le terme est un peu exag\u00e8r\u00e9 mais bon) Bon pour la reconnaissance des temps c'est sp\u00e9cial... Le filtre semble ne pas changer grand chose ce qui est probl\u00e9matique et ca n'est vraiment pas fiable. Voici quelques expemples avec un treshold de 100: \"11ZSD\" Cette image est comprise comme \"11ZSD\" 42340 Cette image est comprise comme \"42340\" \"ZZAEB\" Et celle ci \"ZZAEB\"... Ce qui... n'est pas bon du tout... J'ai essay\u00e9 de trouver un fichier d'entrainement sp\u00e9cifiquement fait pour les digits. J'ai essay\u00e9 de blacklister les chars non voulus pour tenter d'obliger Tesseract \u00e0 trouver des chiffres. Avec la premi\u00e8re option, les r\u00e9sultats ne sont pas meilleurs voire pires. Avec la seconde option c'est d\u00e9ja pas mal mieux mais on perd compl\u00e8tement la possibilit\u00e9 de detecter les mots comme \"LEADER\" ou \"LAP\" et de toute facon ca n'est pas parfait. Le soucis c'est que si je n'ai pas des donn\u00e9es fiables c'est juste impossible de faire des calculs et de l'affichage correct... Il faut absolument que je trouve une solution. J'ai essay\u00e9 d'utiliser de l'interpolation our augmenter la taille de l'image et ensuite appliquer mon filtre pour retirer le flou mais sans succ\u00e8s... Pourtant la on se retrouve avec des images plut\u00f4t claires : \"Clear1\" Ici le programme trouve \"44301\" \"Clear2\" Et ici \"A5151\"... On a toujours les m\u00eames probl\u00e8mes. Bon je suis all\u00e9 me renseigner sur l'OCR et je me suis dit que j'allais tenter de faire les choses proprement. Je vais faire passer plusieurs \u00e9tapes de postProcessing avant de donner l'image \u00e0 Tesseract. GrayScale Tresholding InvertColors Scaling Dilatation Ce qui donne : \"Original\" \"Grayscale\" \"InvertColors\" ; \"Resize\" ; \"Dilatation\" Ce qui ne change : Roulement de tambour RIEN kjd viuwvuirnvoirenbf Tout ca pour rien... C'EST BON !!! Bon en fait au final le probl\u00e8me \u00e9tait une mauvaise configuration de Tesseract. Je vais devoir un peu nettoyer tout ca. Mais avec les changements de l'image on a des r\u00e9sultats BEAUCOUP plus pr\u00e9cis et potentiellement utilisables. La je vais devoir faire un serieux travail de nettoyage et simplification de mon code par ce que la c'est vraiment un chantier vu le nombre de choses que j'ai du essayer. J'ai du aussi beaucoup modifier la gestion de l'image ce qui donne : \"Clean\" Et la on a des r\u00e9sultats qui sont vraiment bons. J'ai pu ajouter assez facilement la detection de position comme c'est simplement un chiffre. On se retrouve maintenant avec ce genre de retours : Position : 1 Gap to leader : 8:33:51 Lap time : 2:19:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:828 Sector 2 : 0:42:940 Sector 3 : 0:0:0 Position : 2 Gap to leader : 0:3:259 Lap time : 23:12:392 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : VERSTAPPEN Sector 1 : 0:38:119 Sector 2 : 0:0:0 Sector 3 : 0:0:0 Il ne manque plus que l'impl\u00e9mentation de la reconnaissance du DRS et des Pneus Et non... je viens de me rendre compte que mon programme a encore cass\u00e9 car le tap time ne peut pas \u00eatre 23 min lol. J'ai un nouveau magnifique probl\u00e8me... Les points et les deux points sont interpr\u00eat\u00e9s comme des chiffres ... Give me a F * * break... J'ai du mal \u00e0 comprendre pourquoi ils ne sont d\u00e9tect\u00e9s comme tels que maintenant. Bon alors il semblerait les temps au tour aie besoin d'un ordre tr\u00e8s pr\u00e9cis pour fonctionner. Grayscale InvertColors Tresholding Resize * 2 Resize * 2 Et la on a des r\u00e9sultats un peu mieux. Bon demain il faut absolument que je me charge de r\u00e8gler tous ces probl\u00e8mes et que je commence la reconnaissance des pneus et de DRS par ce que je commence \u00e0 \u00eatre en retard. Vendredi 6 Avril 2023 Alors aujourd'hui c'est le dernier jour avant de commencer \u00e0 \u00eatre en retard pour de bon. J'ai r\u00e9ussi \u00e0 r\u00e8gler le probl\u00e8me des temps au tour, des gaps, et des secteurs. Dans le processus j'ai cass\u00e9 la detection de position mais ca devrait pas \u00eatre TROP compliqu\u00e9. Et voila ... Apr\u00e8s seulement plus de dix heures de gal\u00e8re, si on donne cette image au programme et le bon JSON le programme nous retourne : Position : 1 Gap to leader : 0:05:059 Lap time : 1:39:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:828 Sector 2 : 0:42:940 Sector 3 : 0:00:000 Position : 2 Gap to leader : 0:03:259 Lap time : 1:39:392 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : VERSTAPPEN Sector 1 : 0:31:749 Sector 2 : 0:00:000 Sector 3 : 0:00:000 Evidemment le GapToLeader est faux sur leclerc car il est leader mais bon ca je pourrai toujours Hardcoder que le premier a jamais de GapToLeader. Bon j'ai eu beaucoup de soucis que je ne vais pas mentionner ici car ce sont simplement des soucis de logique de programmation pour trouver un DRS ouvert ou non. Au final la technique que j'utilise et qui marche plut\u00f4t bien pour le DRS est que je prend la premi\u00e8re image de DRS et je la d\u00e9clare comme valeur \u00e9talon d'un DRS non actif, en effet dans 99% des cas le leader n'a pas de DRS (cela peut arriver alors il faudra donc juste verifier que les pilotes sont bien \u00e0 moins de deux secondes les uns des autres pour confirmer). Ensuite cette valeur \u00e9talon je la calcule en fonction du nombre de pixels verts dans l'image et si il y a plus de 30% de pixels verts en plus c'est que le DRS est activ\u00e9 ex: Ceci est un DRS ferm\u00e9: \"Closed DRS\" Ceci est un DRS ouvert: \"Open DRS\" Cela marche \u00e0 peu pr\u00e8s tout le temps mais dans le pire des cas on peut toujours verifier que les pilotes sont bien proches pour detecter les potentiels rares cas de faux positifs. J'ai pu augmenter les performances en utilisant un seul engine pour tout le monde et en arr\u00eatant d'utiliser GetPixel et SetPixel qui sont simplement des horreurs \u00e0 utiliser. Mais elles ne sont pas encore bonnes Le soucis avec la detection de pneus cependant, c'est qu'il n'est pas possible d'utiliser la reconnaissance pour savoir ou regarder la couleur car cela ne marcherait pas. Je ne peux pas faire trop de post processing car je dois conserver la couleur Je ne peux pas hardocder un endroit ou aller regarder car cela \u00e9volue tout le long du Grand Prix. Bref c'est la gal\u00e8re. En y r\u00e9flechissant je me suis dit qu'une bonne id\u00e9e pourrait \u00eatre de partir de la droite de la zone du pneu en regardant au milieu de la hauteur. Puis continuer vers la gauche jusqu'\u00e0 ce que je rencontre une couleur diff\u00e9rente. Je pourrai ensuite faire une zone un peu vers la gauche qui devrait contenir les infos du pneu et sur laquelle il sera possible de faire de le reconnaissance de couleur et de la reconnaissance de chiffres. J'ai d\u00e9termin\u00e9 que le background n'\u00e9tait jamais plus clair que #505050 et que donc nimporte quelle couleur qui aurait plus que 50 dans un seul des channels serait consid\u00e8r\u00e9e comme une couleur cassant le background Pour arriver \u00e0 cette conclusion je me suis amus\u00e9 un peu avec les couleurs pour jouer avec les limites de mon algorythme : \"Color fun\" Et je crois que j'ai eu une bonne id\u00e9e, avec une petite methode bien faite on arrive \u00e0 de supers r\u00e9sultats : private Rectangle FindTyreZone () { Bitmap bmp = WindowImage ; int currentPosition = bmp . Width ; int height = bmp . Height / 2 ; Color limitColor = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Color currentColor = Color . FromArgb ( 0 , 0 , 0 ); Size newWindowSize = new Size ( bmp . Height , bmp . Height ); while ( currentColor . R <= limitColor . R && currentColor . G <= limitColor . G && currentColor . B <= limitColor . B && currentPosition > 0 ) { currentPosition --; currentColor = bmp . GetPixel ( currentPosition , height ); } //Its here to let the new window include a little bit of the right side int offset = Convert . ToInt32 (( float ) newWindowSize . Width / 100f * 20f ); int CorrectedX = currentPosition - ( newWindowSize . Width - offset ); if ( CorrectedX <= 0 ) return new Rectangle ( 0 , 0 , newWindowSize . Width , newWindowSize . Height ); return new Rectangle ( CorrectedX , 0 , newWindowSize . Width , newWindowSize . Height ); } \"Tyres\" Maintenant cela devrait \u00eatre beaucoup plus simple de trouver la couleur g\u00e9n\u00e9rale et le nombre de tours. Donc ce que je fais c'est que je fais une reconnaissance de texte sur l'image r\u00e9duite. Si je trouve une lettre c'est facile Ca me donne le type de pneu et ca me dit que c'est le premier tour avec. Si c'est un nombre alors je fais la moyenne de toutes les couleurs de l'image et je prend la couleur de pneu la plus proche. Voici les diff\u00e9rentes couleurs de pneus : SOFT : #FF0000 MEDIUM : #f5bf00 HARD : #d9d8d4 INTER : #00a42e WET : #2760a6 \"Tyre colors\" Les couleurs de pneus peuvent changer de temps \u00e0 autres, par exemple cette r\u00e8gle de pneus est arriv\u00e9e en 2019 et avant il y avait beaucoup plus de couleurs mais dans une volont\u00e9 de rendre le sport plus facile \u00e0 comprendre \u00e0 la t\u00e9l\u00e9 cela a \u00e9t\u00e9 simplifi\u00e9. Je ne pense pas que cela va changer dans les ann\u00e9es qui viennent alors tout est hardcod\u00e9. Je pense que j'ai des soucis avec la detection de texte et de couleur car ma zone est trop grande. Alors bon j'\u00e9crit ces lignes apres des heures de tests. Il semble que la principale difficult\u00e9 avec ces pneus c'est que les chiffres ou lettres sont minuscules. Il est donc extr\u00eamement difficile de faire une reconnaissance ne serait-ce qu'un peu fiable.. Je fais de mon mieux pour tenter de r\u00e8gler le soucis cependant c'est vraiment complexe. Je commence \u00e0 devenir fou, je tente tout et nimporte quoi pour permettre \u00e0 mon algo de fonctionner et m\u00eame quand je fais du post processing comme pas possible il me retourne toujours nimporte quoi... \"5i t'inqui\u00e8tes\" Ici le programme va trouver '5i'... En fait c'est complexe d'expliquer tout ce que je fais car je change tout en boucle en essayant et en ratant ce qui prend des heures. Pour aujourd'hui j'abandonne je vais simplement rentrer chez moi et y r\u00e9flechir cette nuit mais je ne vois pas comment mieux faire la... C'est terrible par ce que je sens que je ne suis pas bien loin. Vacances Bon je vais un peu laisser de c\u00f4t\u00e9 la detection de chiffres pour me pencher un peu plus sur la d\u00e9tection de couleur. Par ce que techniquement si j'arrive \u00e0 toujours parfaitement la detecter alors je pourrais me passer des chiffres car ils sont redondant si je construit un historique de pneus. J'ai r\u00e9ussi \u00e0 fix mon probl\u00e8me de mauvaise detection de couleur de pneus. Du moins je crois. Seulement j'ai quand m\u00eame un souci, les fen\u00eatres de pneus avec une lettre n'ont pas assez de couleur pour \u00eatre d\u00e9tect\u00e9s. Je vais donc essayer de detecter les cinq lettres possibles et si il ne trouve pas alors je pourrai tenter de detecter les chiffres sans lettres ce qui devrait grandement aider. Le but est encore une fois de r\u00e9duire les possibilit\u00e9s de Tesseract. Je me rend de plus en plus compte que le plus important c'est de r\u00e9duire le scope le plus possible. Moins il y a de mots et lettres et de chiffres possibles meilleure sera la reconnaissance. Bon ca ne veut toujours pas marcher maintenant le 11 est interpr\u00eat\u00e9 comme trois I ou comme un M... J'en ai marre sans rire c'est vraiment p\u00e9nible. Alors j'\u00e9crit ces lignes deux jours plus tard et me rend compte avec horreur que toutes mes modifications sur ce journal de bord n'ont pas \u00e9t\u00e9 auvegard\u00e9e... yess.. Bon pour faire simple, j'ai r\u00e9ussi \u00e0 rendre la detection de couleurs bien plus efficace en r\u00e9duisant la taille de l'image et en ne prenant pas en compte les couleurs que l'on d\u00e9tecte comme \u00e9tant partie int\u00e9grante du background. Par exemple quand on a une image comme celle ci : \"Avec background\" qui contient un background alors que ci dessous, on l'a enlev\u00e9. \"Sans background\" La diff\u00e9rence est t\u00e9nue mais elle permet de grandement am\u00e9liorer la prescision de la reconnaissance de couleurs. Pour ce qui est du nombre de tours je me suis rendu compte que cela n'\u00e9tait d\u00e9ja pas tr\u00e8s utile car avec l'historique on devrait pouvoir le d\u00e9duire. Mais bon pour la forme je me suis dit que cela serait quand m\u00eame une bonne id\u00e9e de v\u00e9rifier avec la reconnaissance. J'\u00e9tais quasi certain que le soucis \u00e9tait le fait que l'on voie le contour du logo de pneu qui faisait que la reconnaissance avait du mal. Et j'avais raison ! En les enlevant (Ce qui n'a pas \u00e9t\u00e9 simple) J'ai pu avoir des chiffres beaucoup plus proches de la r\u00e9alit\u00e9. En m\u00eame temps je ne vois pas bien comment j'aurais pu faire mieux : \"Super 11\" Je suis quand m\u00eame assez fier de voir que j'ai r\u00e9ussi \u00e0 part de l'image que on peut voir un peu plus haut et automatiquement la transormer en celle ci-dessus. J'ai donc pu retirer le round autour du chiffre et cela m'a permit de pouvoir d\u00e9zoomer un peu et c'est avec ca que les lettres ont pu \u00eatre mieux reconnues : \"Super H\" \"Super M\" Maintenant je pense qu'il ne reste \"plus qu'\u00e0\" nettoyer un peu tout ce code qui traine de partout pour tout faire fonctionner et impl\u00e9menter un peu de parrallel processing ainsi que de l'asynchrone pour ne pas bloquer le reste du programme. Par ce qu'il faut savoir que en l'\u00e9t\u00e2t, le programme met 25 secondes \u00e0 d\u00e9marrer et consomme presque 2GB de Ram. Certes cela ne veut pas dire que la reconnaissance \u00e0 elle seule prend 25 secondes car au d\u00e9marrage il y a aussi la lecture du fichier de config et la cr\u00e9ation des window etc.. En r\u00e9alit\u00e9 la partie strictement OCR prend dans les 12s si on en croit la fonction stopWatch de C#. Et quand on change d'image la reconnaissance prend 9s. Dans tout les cas c'est BEAUCOUP trop. J'aurais eu comme objectif de faire une reconnaissance toutes les secondes. Je ne sais pas bien si cela va \u00eatre possible mais en tout cas le but va \u00eatre de s'en rapprocher. Pour \u00eatre plus exact et permettre une comparaison, voici les stats exactes Avec un fichier d'images vide : Loading - 11.8s Splitting d'images - 90ms OCR - 12.5s Avec un fichier d'images plein : Loading - 10.8s Splitting d'images - 80ms Ocr - 11.6s En passant d'une image \u00e0 l'autre : Loading - NaN Splitting d'images - 50ms Ocr - 8.8s Donc on peut voir que les deux endroits ou le programme prend le plus de temps c'est au premier d\u00e9marrage quand il faut lire le fichier et setup les windows etc... Et l'OCR qui prend un temps fou. Ce qui est pratique c'est que les presque 2gb de ram sont utilis\u00e9s que au lancement et ensuite l'application n'en utilise que quelques centaines de mb. Le processeur lui tourne entre 10 et 20% ce qui ne va pas durer :) Je vais m'occuper dabord du loading. J'ai essay\u00e9 d'utiliser un Parrallel.For au moment de la cr\u00e9ation des windows, le probl\u00e8me c'est que visiblement les objets windows sont beaucoup trops complexes et utilisent trop de ressources partag\u00e9es pour \u00eatre vraiment thread Safe. J'\u00e9sp\u00e8re que je n'aurais pas trop de soucis avec ca qu'en j'en viendrai \u00e0 l'optimisation de l'OCR... Ce qui me rend fou c'est que cette boucle toute nulle prend plus de dix secondes \u00e0 s'executer et je ne comprend pas bien pourquoi. for ( int i = 0 ; i < NUMBER_OF_DRIVERS ; i ++) { Point tmpPos = new Point ( 0 , FirstZonePosition . Y + i * FirstZoneSize . Height - Convert . ToInt32 ( i * offset ) /*- (i* (FirstZoneSize.Height / 32))*/ ); Zone newDriverZone = new Zone ( MainZoneImage , new Rectangle ( tmpPos , FirstZoneSize )); Bitmap zoneImg = newDriverZone . ZoneImage ; newDriverZone . AddWindow ( new DriverPositionWindow ( zoneImg , new Rectangle ( driverPositionPosition , driverPositionArea ))); newDriverZone . AddWindow ( new DriverGapToLeaderWindow ( zoneImg , new Rectangle ( driverGapToLeaderPosition , driverGapToLeaderArea ))); newDriverZone . AddWindow ( new DriverLapTimeWindow ( zoneImg , new Rectangle ( driverLapTimePosition , driverLapTimeArea ))); newDriverZone . AddWindow ( new DriverDrsWindow ( zoneImg , new Rectangle ( driverDrsPosition , driverDrsArea ))); newDriverZone . AddWindow ( new DriverTyresWindow ( zoneImg , new Rectangle ( driverTyresPosition , driverTyresArea ))); newDriverZone . AddWindow ( new DriverNameWindow ( zoneImg , new Rectangle ( driverNamePosition , driverNameArea ))); newDriverZone . AddWindow ( new DriverSector1Window ( zoneImg , new Rectangle ( driverSector1Position , driverSector1Area ))); newDriverZone . AddWindow ( new DriverSector2Window ( zoneImg , new Rectangle ( driverSector2Position , driverSector2Area ))); newDriverZone . AddWindow ( new DriverSector3Window ( zoneImg , new Rectangle ( driverSector3Position , driverSector3Area ))); MainZone . AddZone ( newDriverZone ); } Alors que Zone.AddWindow c'est simplement : public virtual void AddWindow ( Window window ) { Windows . Add ( window ); } Et windows est simplement une liste. Donc ca ne peut pas \u00eatre ca qui prend du temps. Et les windows que je cr\u00e9\u00e9 ont ca comme code : public DriverPositionWindow ( Bitmap image , Rectangle bounds ) : base ( image , bounds ) { Name = \"Position\" ; } Sachant que le constructeur de base d'une Window c'est : public Window ( Bitmap image , Rectangle bounds ) { Image = image ; Bounds = bounds ; Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } Sachant que TesseractEngine est en statique et que donc il ne devrait... OHLLALALALALALALALALA je suis un imb\u00e9cile... J'ai juste \u00e0 changer ce constructeur avec ca: if ( Engine == null ) { Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } ET le loading ne prend plus que 2-300 ms... Bon c'est une tr\u00e8s belle am\u00e9lioration pour pas tr\u00e8s ch\u00e8r mais bon c'est un peu b\u00eate... Bon je pense que 2-300ms c'est une dur\u00e9e correcte surtout que ca n'est appel\u00e9 qu'une fois pour le lancement. On peut passer \u00e0 la suite maintenant. Alors il y a un grand soucis avec la parallellisation de l'OCR... Tesseract n'est pas par d\u00e9faut une classe \"Thread safe\" ce qui veut dire que je ne peut utiliser de parallell.Foreach sur mes windows pour acc\u00e8l\u00e8rer le traitement drastiquement. Je pourrais par exemple avoir une instance de Tesseract par window sauf que cela fait 20 pilotes * 9 windows chacuns ce qui donne 180 instances ce qui n'est tout simplement pas raisonnable. Je vais donc essayer de voir avec l'utilisation de methodes asynchrones qui me permettraient de faire un genre de flux tendu de reconnaissance. J'avoue que la je navigue un peu \u00e0 vue, je me base sur diff\u00e9rentes infos que je trouve sur des sites un peu perdus et sur chatGPT, j'esp\u00e8re que j'arriverai \u00e0 trouver une solution car 10 secondes de reconnaissance c'est vraiment beaucoup trop. Alors le soucis avec un Engine unique entre toutes les windows c'est qu'il n'est pas possible de process plusieurs images \u00e0 la fois. Je vais donc retirer l'engine unique pour voir si en cr\u00e9er un par window me permet de passer en multithreading. La grande question sera : Est-ce que les ressources suppl\u00e9mentaires que vont prendre la cr\u00e9ation de tous ces engines va compenser enti\u00e8rement le temps gagn\u00e9 avec la paralellisation. Pour stocker les donn\u00e9es dans un premier temps je vais cr\u00e9er un objet DriverData. Ce qu'il y a de pratique avec ca, c'est que je pourrais ajouter du code de v\u00e9rification de certaines donn\u00e9es directement dedans avant de les donner \u00e0 la suite du programme. Et on peut m\u00eame imaginer une impl\u00e9mentation d'une liste de DriverData pour avoir l'historique. Ce qui serait cool ca serait de grouper toutes ces data avec un num\u00e9ro de tour. Placer ensuite la liste de Data dans une DB serait ainsi super simple. Mais il va falloir savoir quoi mettre, quelles infos sont redondantes et prendre en compte le fait que un tour affich\u00e9 sur la page de la F1TV n'est accompli que par certains des premiers pilotes. D'autres pilotes peuvent \u00eatre dans des tours pr\u00e9c\u00e9dents si ils ont du retard. Il faudra r\u00e9fl\u00e9chir \u00e0 cela quand je viendrai au mod\u00e8le. Bon pour y arriver j'ai du faire de gros changements et le r\u00e9sultat n'est peut-\u00eatre pas aussi cool que ce que j'aurais voulut... Voici un petit point sur les performances maintenant J'ai \u00e9galement d\u00e9sactiv\u00e9 le dump d'images. Pour le moment j'ai tout mis en commentaire mais cela pourrait \u00eatre int\u00e9ressant de faire en sorte de pouvoir l'activer en changeant une ou deux variables Au d\u00e9marrage : Loading - 113ms Splitting d'images - 14ms Ocr - 7s En passant d'une image \u00e0 l'autre : Loading - 113ms Splitting d'images - 13ms Ocr - 5s Alors clairement les stats montrent qu'il y a eu un changement mesurable mais bon je pensais pouvoir en gagner un peu plus... Je soupconne la cr\u00e9ation d'engines d'\u00eatre \u00e0 l'origine de ces performances presque d\u00e9cevantes. Autre soucis, il semble que plus je change d'image plus la detection est lente et plus je consomme de RAM. Il va falloir que je travaille encore un peu. J'ai tent\u00e9 de mettre un stopwatch sur une des cr\u00e9ations d'engine Tesseract et le r\u00e9sultat me parait fou... Plus d'une seconde c'est dingue. J'ai test\u00e9 dans d'autres endroits du code et effectivement il semble que la cr\u00e9ation d'un engine prenne entre une et deux secondes ce qui est une ETERNITEE what ! Donc il faut optimiser tout ca. Une id\u00e9e serait de d\u00e9composer le threading mais cela me demanderait un gros refactor et je n'ai pas envie d'en refaire un la... Sinon, une fois qu'ils sont cr\u00e9\u00e9s ils ne prennent pas de temps du tout. Cr\u00e9er une fois tous les engines et ensuite les utiliser pourrait \u00eatre une bonne id\u00e9e. Cela prendrait longtemps au load mais ensuite les reconnaissances devraient \u00eatre super rapides. Ok alors ca c'est d\u00e9ja plus ce \u00e0 quoi je m'attendais ! On est de nouveau \u00e0 plus de 10s de loading time mais on est descendu \u00e0 deux secondes par OCR. (Bon autre soucis, l'utilisation de la RAM est ridicule plus de 2gb mais ce qui m'inqui\u00e8te c'est que j'ai l'impression qu'elle augmente plus on change d'image) J'ai r\u00e8gl\u00e9 (en partie) le soucis en obligeant le GC (Garbage Collector) \u00e0 collecter apr\u00e8s chaque detection. m\u00eame apr\u00e8s 50 detections l'utilisation de la ram se stabilize autour des 2GB. Bon en paralellisant la cr\u00e9ation des Engines le soucis c'est que cela demande d'allouer beaucoup trop de m\u00e9moire d'un coup alors le programme se fige pendant genre cinq secondes avant de tout cr\u00e9er. Du coup m\u00eame si la cr\u00e9ation est plus rapide, on se retrouve avec un temps total plus long... Je pense que l'on va devoir se contenter de ces dix secondes. Bon la j'allais tenter de faire la documentation mais je viens de me rendre compte que la detection de temps au tour est pas vraiment encore id\u00e9ale... J'ai r\u00e9ussi \u00e0 changer un petit peu le programme de reconnaissance pour rendre la reconnaissance un peu meilleure mais cela a drastiquement augment\u00e9 le temps requis pour d\u00e9coder... On arrive \u00e0 3.5 secondes. Je vais tenter de rajouter un peu de parralell processing sur les boucles de traitement voir si cela peut aider. Alors effectivement cela aide pas mal, on arrive maintenant \u00e0 faire une detection presque tout le temps en dessous de la seconde. Et j'ai aussi du changer un peu le fonctionnement de la detection des Temps au tour. Et voila je pense que je vais m'arr\u00eater la pour la partie d\u00e9codage. Je ne pense pas que je peux facilement faire mieux que ca et il faut que j'avance dans d'autres parties du projet. Je vais pouvoir commencer \u00e0 documenter un peu toute la partie OCR. Il faut que je prenne le temps de le faire bien car c'est la partie la plus int\u00e9ressante du projet et ou je pense que j'aurai le plus essay\u00e9 de choses qui vallent le coup d\u00eatres racont\u00e9es. J'ai aussi pass\u00e9 pas mal de temps sur le poster du projet. J'avais fait des croquis au crayon de ce \u00e0 quoi je pensais, cependant apr\u00e8s de longues discussions avec M.Garcia ils n'\u00e9taient pas forc\u00e9ment tr\u00e8s bons car ils ne repr\u00e9sentent pas assez bien le fonctionnement du projet et sont un peu trop marketings. Du coup j'ai fait une premi\u00e8re version au propre : \"Poster V1\" Mais je n'\u00e9tais pas forc\u00e9ment content du r\u00e9sultat et il manquait des choses je trouve comme par exemple l'utilisation de Selenium. J'ai donc repass\u00e9 des heures \u00e0 faire une seconde version : \"Poster V2\" La police d'\u00e9criture n'est pas encore la bonne mais cela va venir. Mais je pr\u00e9f\u00e8re d\u00e9ja beaucoup cette version \u00e0 la premi\u00e8re. Je ne sais pas encore si la version finale sera une version plus travaill\u00e9e de ce poster ou compl\u00eatement autre chose mais pour l'instant je suis \u00e0 peu pr\u00e8s content de cette version. Je le trouve un tout petit peu trop brouillon ou avec trop d'infos mais il m'a \u00e9t\u00e9 de nombreuses fois reproch\u00e9 de ne pas assez montrer le fonctionnememt interne et je ne peux pas faire plus simple. L'ajout des nombres pour compartimenter le projet ajoute de la structure mais je me demande si cela suffit. Maintenant que je suis \u00e0 peu pr\u00e8s content de mon code pour l'OCR je vais commencer sa documentation. (Uniquement son fonctionnement interne pas comment s'en servir car cela va changer) Bon j'ai cr\u00e9\u00e9 u nouveau projet selenium mais m\u00eame avec les bonnes libraries je n'arrivais pas \u00e0 faire fonctionner firefox j'avais toujours une erreur \"OpenQA.Selenium.WebDriverException: 'Cannot start the driver service on http://localhost:51481/'\" et j'ai pu r\u00e8gler le probl\u00e8me en t\u00e9l\u00e9chargeant directement le gecko driver depuis le git https://github.com/mozilla/geckodriver/releases et utiliser le fichier directement dans le service : var service = FirefoxDriverService . CreateDefaultService ( AppDomain . CurrentDomain . BaseDirectory + @\"geckodriver-v0.27.0-win32\\geckodriver.exe\" ); FirefoxOptions options = new FirefoxOptions (); var driver = new FirefoxDriver ( service , options ); Le seul probl\u00e8me c'est que du coup il faut tout le temps d\u00e9placer le fichier dans le dossier bin si je clone le projet. Il faudra faire un installeur dans la version finale qui s'occupe de tout je pense. Je me suis dit que j'allais garder la doc pour le retour des vacances quand j'aurai un bureau un clavier et un setup complet un peu propres. Bon il va falloir que je parle de la r\u00e9cup\u00e9ration de cookie. J'ai d\u00e9ja pu travailler lors d'un poc sur la meilleure facon de prendres des screenshots de la F1TV : Avoir une page chrome ouverte avec le feed en plein \u00e9cran et un programme qui prend des captures d'\u00e9crans. Avoir une cam\u00e9ra qui prend en photo l'\u00e9cran au cas ou chrome et Firefox emp\u00eachent la prise de captures d'\u00e9crans. R\u00e9cup\u00e8rer directement le feed en faisant du reverse engeneering de la plateforme. Simuler un chrome en background qui prenne des screenshot sans qu'on aie \u00e0 le voir. Dans toutes ces options, je dirais que la pire \u00e9tait celle de la cam\u00e9ra qui filme l'\u00e9cran, mais \u00e0 l'\u00e9poque c'\u00e9tait encore envisageable comme solution de dernier recours. Le soucis de cette solution c'est l'horreur que serait la partie OCR avec une image de tr\u00e8s mauvaise qualit\u00e9. Une autre option qui m'aurait vraiment emb\u00eat\u00e9 aurait \u00e9t\u00e9 de devoir garder une page de Chrome ou Firefox ouverte quelque part sur un \u00e9cran pour que le programme puisse prendres des captures d'\u00e9crans. C'est de loin l'option la plus simple et la plus logique mais elle poss\u00e8de pour moi de tr\u00e8s gros points noirs : On ne peut pas certifier l'int\u00e9grit\u00e9 des donn\u00e9es car l'utilisateur a le contr\u00f4le total sur le feed. Il peut mettre pause, avancer, reculer, tout casser sans faire expr\u00e8s en ouvrant autre chose sur son ordi qui se mette pile devant. Bref c'est un peu bancale. Et surtout on bloque une partie non significative de l'\u00e9cran de l'utilisateur avec des infos redondantes. Et je peux vous dire que quand je commente la F1 j'ai besoin de beaucoup d'informations et que chaque centim\u00e8tre d'\u00e9cran est crucia\u00e9 ! Alors avoir un \u00e9cran complet bloqu\u00e9 est juste un point bloquant qui m'emp\u00eacherait d'utiliser l'app aussi bonne soit-elle dans ses pr\u00e9dictions. Mais bon si aucune autre methode ne fonctionne ce qui est bien c'est que celle la est plut\u00f4t simple \u00e0 mettre en place. Ensuite reverse engeneer le feed serait l'option la plus classe, cependant c'est la plus complexe et la plus bancale au niveau l\u00e9gal haha. L'id\u00e9e serait de r\u00e9cup\u00e8rer le lien vers le broadcast g\u00e9n\u00e9ral et de comprendre comment il fonctionne pour le d\u00e9coder nous m\u00eame pendant un Grand Prix. Seuls soucis : Il n'est pas possible de faire des tests en dehors des periodes de Grand Prix (Et je rappelle que c'est des p\u00e9riodes ou je travaille en plus) Difficile de faire un syst\u00e8me qui marche pareil pour les rediffusions et les lives. (En effet les liens des rediff sont beaucoup plus simple \u00e0 r\u00e9cup\u00e8rer mais ne fonctionnent pas du tout pareil et pour tester l'app il est essentiel de pouvoir s'entrainer sur des anciens Grand Prix) Dernier GROS soucis, je ne sais tout simplement pas faire ca lol. Je ne sais pas comment faire. Peut-\u00eatre que avec des profs qui m'aident et chat gpt ainsi qu'internet je pourrais potentiellement n\u00e9gocier un truc mais c'est hautement improbable et cela serait une perte de temps folle si je n'y arrive pas. Derni\u00e8re option que je trouve la plus s\u00e9duisante. Simuler une instance de Chrome ou de Firefox (Le soucis avec chrome c'est qu'il impl\u00e9mente l'utilisation de DRM dans les vid\u00e9os qui fait qu'il est tr\u00e8s difficile de passer outre la s\u00e9curit\u00e9 avec un bot) pour ensuite prendre des captures d'\u00e9crans automatiquement. Cette solutions offre pleins d'avantages : Pas de place prise sur l'\u00e9cran L'int\u00e9grit\u00e9 des donn\u00e9es est assur\u00e9e car c'est le programme qui d\u00e9cide d'ou partir et de si il met pause ou non C'est une option complexe mais beaucoup moins que le reverse engeneering Elle permet de ne demander presque aucun input de la part de l'utilisateur. Mais elle pose quelques probl\u00e9matiques : Comment se connecter automatiquement sans \u00eatre detect\u00e9 par un Bot et sans demander \u00e0 l'utilisateur ses identifiants (Pour des raisons \u00e9videntes qui sont : QUI VA METTRE SES IDENTIFIANTS SUR UNE VIEILLE APP COMME LA MIENNE??) Comment faire en sorte que le programme prenne les meilleures captures dans la meilleure qualit\u00e9 et en plein \u00e9cran. Mais j'ai d\u00e9cid\u00e9 de partir sur cette option. Pour ce faire j'utilise Selenium. J'ai pu tester Puppetteer Sharp et m\u00eame si dans un premier temps j'ai pu avancer asez vite, malheureusement il y a des bugs qui rendent son utilisation impossible dans notre contexte. J'ai donc d\u00e9cid\u00e9 de tout faire en utilisant un portage de Selenium dans mon programme. Voici un exemple de code qui va ouvrir FireFox et qui va lancer un RickRoll var service = FirefoxDriverService . CreateDefaultService ( AppDomain . CurrentDomain . BaseDirectory + @\"geckodriver-v0.27.0-win32\\geckodriver.exe\" ); service . Host = \"127.0.0.1\" ; service . Port = 5555 ; FirefoxOptions options = new FirefoxOptions (); options . AddArgument ( \"--disable-headless\" ); var driver = new FirefoxDriver ( service , options ); driver . Navigate (). GoToUrl ( \"https://www.youtube.com/watch?v=dQw4w9WgXcQ&autoplay=1&mute=1\" ); Dans cet exemple on d\u00e9sactive le \"Headless\" pour qu'on puisse voir ce que fait l'app car sinon tout est invisible. Alors dans les faits la vid\u00e9o youtube ne se lance pas du tout car il y a des pubs et des prompts de cookies que l'on doit accepter etc... ce qui montre les diff\u00e9rents challenges que l'on va devoir surmonter pour vraiment faire ce que l'on veut. Mais un petit d\u00e9tail extr\u00eamement important, la F1TV est un programme payant un peu comme netflix. Ce qui veut dire que pour acc\u00e8der au contenu il faut \u00eatre connect\u00e9. Sauf que une instance de firefox cr\u00e9\u00e9 par Selenium est comme une page de naviguation priv\u00e9e, ce qui veut dire que si on va sur la page de la F1TV on est pas connect\u00e9s. Je pourrais tout \u00e0 fait demander \u00e0 l'utilisateur de me donner ses identifiants pour que j'aille ensuite automatiquement me connecter sauf que cela pose deux soucis: Personne ne voudra mettre ses identifiants sur mon programme La page de login de la F1TV a \u00e9t\u00e9 prot\u00e8g\u00e9e avec la meilleure technologie de detection de bots que je connaisse. Presque aucun site n'arrive \u00e0 me detecter sauf eux ! Donc c'est tout simplement impossible d'utiliser cette technique. Ensuite je me suis rappel\u00e9 que ce que la page stocke pour me permettre de rester connect\u00e9 ce sont des cookies. Et si je mets le bon cookies dans Selenium alors je serai connect\u00e9. Dans un premier temps je voulais faire un syst\u00e8me ou l'utilisateur irait prendre dans son chrome son cookie et le copie colle dans mon programme mais c'est immonde. C'est alors que vient la partie r\u00e9cup\u00e8ration de cookies ! Tous les cookies de chrome sont stock\u00e9s dans une base de donn\u00e9es SQLITE. On pourrait se dire Banco il suffit d'aller dedans et de retrouver tous les cookies et se connecter. Sauf que, pas b\u00eates, les \u00e9quipes de chrome ont d\u00e9cid\u00e9 que c'\u00e9tait une bonne id\u00e9e d'encoder les cookies pour que tout le monde ne puisse pas venir y mettre son nez... En effet les cookies peuvent contenir des informations importantes. Cela fait que pour utiliser ces cookies il faut pouvoir les d\u00e9coder. Mon hypoth\u00e8se a \u00e9t\u00e9 que si ces cookies peuvent \u00eatre lus par Chrome m\u00eame hors connexion, c'est que la cl\u00e9 de d\u00e9codage existe sur l'appareil et qu'il suffit de la trouver. ET C'EST LE CAS! Apr\u00e8s pas mal de recherches j'ai pu voir que la cl\u00e9 de d\u00e9codage existe bel et bien et qu'il suffit de la d\u00e9coder en utilisant la librairie DPAPI pour la lire. Avec cette cl\u00e9 on peut ensuite d\u00e9coder les cookies et leurs valeurs ce qui veut dire qu'il est th\u00e9oriquement possible d'automatiser le processus sans que l'utilisateur n'aie rien \u00e0 faire. J'ai d\u00e9cid\u00e9 de faire la partie r\u00e9cup\u00e8ration en python pour deux raison : Je n'arrivais pas \u00e0 trouver une bonne impl\u00e9mentation de DPAPI en C# qui me permettait de d\u00e9coder la cl\u00e9. Il existe beaucoup plus de documentation en Python pour ce qui est de la cryptographie et donc si Chrome change de fonctionnement il sera beaucoup plus simple de changer cette partie en particulier sans avoir \u00e0 recompiler le code C#. J'ai donc avec l'aide d'internet et de ChatGPT cr\u00e9\u00e9 ce script : def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key def decrypt_payload ( cipher , payload ): return cipher . decrypt ( payload ) def generate_cipher ( aes_key , iv ): return AES . new ( aes_key , AES . MODE_GCM , iv ) def decrypt_password ( buff , master_key ): try : iv = buff [ 3 : 15 ] payload = buff [ 15 :] cipher = generate_cipher ( master_key , iv ) decrypted_pass = decrypt_payload ( cipher , payload ) decrypted_pass = decrypted_pass [: - 16 ] . decode () # remove suffix bytes return decrypted_pass except Exception : # print(\"Probably saved password from Chrome version older than v80\\n\") # print(str(e)) return \"Chrome < 80\" master_key = get_master_key () cookies_path = Path ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Default \\\\ Network \\\\ Cookies\" ) if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" ) Ce programme va faire tout ce que j'ai expliqu\u00e9 et va ensuite stocker les r\u00e9sultats dans un CSV pour qu'il soit facile d'y acc\u00e8der depuis le C#. Alors oui cela pose certaines questions de s\u00e9curit\u00e9. Car en effet je prend tous les cookies, les d\u00e9code et les stocke. Ce qui veut dire que je pourrais tout \u00e0 fait envoyer ces donn\u00e9es quelque part, par exemple un compte Netflix, et me rincer. Si je devais rendre le projet ouvert au public je pense qu'il faudra que cela soit mentionn\u00e9 clairement et que le projet soit open source pour que les utilisateurs puissent verifier que je ne fais pas ca. Maintenant de l'autre c\u00f4t\u00e9 j'ai juste \u00e0 lire le CSV et le tour est jou\u00e9 ! (Trouver cette solution m'a pris une semaine de vacances \u00e0 l'\u00e9poque) Bon j'ai r\u00e9ussi \u00e0 faire le programme se connecter et naviguer etc.. Par contre quelque chose que j'ai voulu ajouter et qui m'a pris pas mal de temps c'est de faire en sorte de pouvoir selectionner la qualit\u00e9. Pour changer la qualit\u00e9 du feed il faut cliquer sur settings et ensuite prendre le menu deroulant et selectioner 1080p. Le soucis c'est le que la value du select est jamais la m\u00eame. Elle commence toujours pas \"1080_\" mais ensuite ca peut \u00eatre \"1080_45930285\" ou \"1080_56801\" la suite est apparemment random. J'ai donc du utiliser ce code pour le selectioner quand m\u00eame : IWebElement settingsButton = driver . FindElement ( By . ClassName ( \"bmpui-ui-settingstogglebutton\" )); settingsButton . Click (); IWebElement selectElement = driver . FindElement ( By . ClassName ( \"bmpui-ui-videoqualityselectbox\" )); SelectElement select = new SelectElement ( selectElement ); IWebElement selectOption = selectElement . FindElement ( By . CssSelector ( \"option[value^='1080_']\" )); selectOption . Click (); Sauf que pour que cela marche je dois avant cliquer sur le bouton des settings le probl\u00e8me c'est qu'il est invisible alors on doit le faire apparaitre. J'ai tent\u00e9 de le faire aparaitre en bougeant la souris, en cliquant \u00e0 un endroit pr\u00e9cis, impossible de le faire marcher correctement. Puis j'ai eu l'id\u00e9e de mettre pause en envoyant un appui sur la touche Espace et ca a permit de d\u00e9couvrir le bouton et permettre qu'on clique dessus. Ca peut paraitre tout b\u00eate mais rien que ca, ca m'a pris un temps consid\u00e9rable. Bon pour ce qui est du timecode de la vid\u00e9o. Je pense qu'il serait trop complexe de faire en sorte que selenium change le slider de progression de la vid\u00e9o. Alors j'ai fait quelques tests et apparemment, si on quitte la F1TV sur un timecode de la vid\u00e9o que on donne au programme, comme il r\u00e9cup\u00e8re tous les cookies de la F1TV il commencera de la. Donc si on veut utiliser le programme avec des Grand Prix ayant d\u00e9ja eu lieu, on peut le faire, seulement il faudra juste au pr\u00e9alable avoir choisit le bon timecode dans le page de la F1TV avant de le lancer. Ce qui est int\u00e9ressant c'est que la page de la F1TV ressemble \u00e0 ca au d\u00e9part : \"Empty F1TV\" Je pense qu'une bonne id\u00e9e serait de dire au programme que c'est la grille de d\u00e9part et ensuite d\u00e8s qu'il d\u00e9tecte un secteur il sait que la course a commenc\u00e9. Lundi 24 Avril 2023 Aujourd'hui c'est jour de documentation. J'ai pas mal travaill\u00e9 pendant les vacances mais je n'ai pas encore pu faire de vraie documentation correcte du fonctionnement. Du coup je vais m'en charger aujourd'hui et peut-\u00eatre un peu demain. Ok normalement je ne devrais faire que de la documentation mais je ne peux pas passer \u00e0 cot\u00e9 de ca... Le probl\u00e8me que j'ai avec les pneus ou parfois il d\u00e9tecte un H au lieu d'un '11' et ce genre de choses c'est \u00e0 cause de ma methode \"RemoveBG\" Qui va retirer tous les pixels plus sombres que le background. Sauf que cela va aussi retirer des pixels dans le chiffre lui m\u00eame et qui va donc defigurer les 11 : \"diformed 11\" \"diformed 11\" J'ai r\u00e9ussi \u00e0 les changer en : \"less diformed\" \"less diformed\" Mais au final cela n'a pas augment\u00e9 la pr\u00e9cision de la reconnaissance. Je pense que je vais donc devoir encore changer. Je pense que une bonne facon de trouver serait dabord de trouver la couleur du pneu. Et si il n'y a pas assez de couleur alors c'est que le pneu contient une lettre. Le but est d'arr\u00eater de chercher des lettres ou des chiffres. Comme ca les 11 arr\u00eateront d'\u00eatre pris pour des 'H' En fait on peut faire encore plus simple que ca. On peut simplement regarder la couleur dominante et determiner le pneu. En effet m\u00eame si il y a une lettre sur fond noir pour d\u00e9crire le pneu, mon methode de r\u00e9cup\u00e8ration de la couleur dominante ommet les pixels trop noirs alors il est quand m\u00eame possible de determiner le type de pneus. Et tout simplement si il n'arrive pas \u00e0 lire le chiffre c'est que c'est une lettre et que donc on est \u00e0 0 tours. Cela marche plut\u00f4t bien et cela simplifie pas mal le processing. Voila, la je vais me remettre \u00e0 la documentation sinon je vais encore prendre du retard. Mardi 25 Avril 2023 Encore une fois j'ai pris du temps de doc pour changer des choses sur la partie OCR. Mais en m\u00eame temps en documentant je vois des choses que j'ai soit mal fait soit que je pourrais faire mieux en changeant tr\u00e8s peu de choses. J'\u00e9sp\u00e8re que les changement que j'ai fait vont aider au moins \u00e0 la coh\u00e9rence du code et un peu pour les performances. Il semble que dans les conditions que j'ai test\u00e9 le nombre de tour soit plut\u00f4t fiable mais je pense que je devrai faire un peu de travail en aval dans la r\u00e9cup\u00e9ration de ces donn\u00e9es car je sens que cela va poser probl\u00e8me quelques fois. Je pense que en utilisant bien l'historique on peut potentiellement se passer de l'utilisation de ce chiffre pas toujours compl\u00eatement fiable. Mais sinon aujourd'hui c'est encore une fois un gros jour de doc. J'essaie d'expliquer les diff\u00e9rents proc\u00e9d\u00e9s avant de les oublier. J'essaie aussi de donner un maximum d'exemples sous formes de photos interm\u00e9diaires mais ca me prend pas mal de temps car il faut que j'ajoute un peu partout dans le code des lignes pour sortir des images interm\u00e9diaires. En plus de la documentation je me suis aussi beaucoup occup\u00e9 de nettoyer mon code et je suis assez content par ce que m\u00eame en ayant du rajouter des couches de complexit\u00e9 pour mieux reconnaitres les temps au tour j'arrive \u00e0 un temps de processing parfois en dessous des 2 secondes ce que je trouve honorable. Quand j'aurai finit de nettoyer tous mes fichiers je ferai une release sur gitea et ce sera la version que j'utiliserai quand je voudrai faire un merge avec les autres parties du projet. J'ai beaucoup beaucoup boss\u00e9 aujourd'hui et je sui bien mort. Faire autant de documentation et de nettoyage de code c'est pas forc\u00e9ment bon pour le cerveau je crois. J'ai besoin d'une sieste. Demain je pense que je vais commencer \u00e0 avancer sur la partie r\u00e9cup\u00e8ration des images. Je sais que la je fais un peu passer les tests \u00e0 la trappe mais d\u00e9ja j'en ai fait tout le long du d\u00e9veloppement de OCR_DECODE et il faut vraiment que j'avance, quitte \u00e0 revenir dessus quand j'aurai merge les deux projets ensemble. 26 Avril 2023 Aujourd'hui je vais devoir m'occuper de la partie r\u00e9cup\u00e9ration des images. J'ai d\u00e9ja eu l'occasion d'avancer sur ce projet pendant mopn poc et mes vacances. Donc la le but ca va \u00eatre de voir ce qui manque comme v\u00e9ritables features et ensuite je vais pouvoir m'occuper de la vue et de son int\u00e9gration avec le d\u00e9codage. Ok donc maintenant que j'au un programme qui arrive \u00e0 prendre des images depuis la F1TV correctement et en bonne r\u00e9solution. Je pense qu'il est temps de passer \u00e0 l'impl\u00e9mentation de la Forme que ca va prendre. C'est important de se poser au moins cinq minutes la question de comment je pr\u00e9vois de faire car m\u00eame si ca n'est pas la version finale, cette derni\u00e8re prendra tr\u00e8s fort inspiration du desing que je vais faire. Dans cette form j'aurais besoin de : Pouvoir selectionner un Grand Prix en ins\u00e8rant l'URL du feed. Pouvoir lancer la calibration si besoin Indiquer le titre et la date du Grand Prix Indiquer si le Grand Prix vient de commencer ou si il y a d\u00e9ja un certain nombre de tours lanc\u00e9s. Et c'est \u00e0 peu pr\u00e8s tout en fait... J'ai tellement pouss\u00e9 pour avoir un programme qui fait tout tout seul que il ne me faut pas grand chose de plus. Je pense que ce qui serait pas mal ca serait du coup d'utiliser ce temps pour bien impl\u00e9menter la calibration qui elle aura besoin d'une UI un peu plus bal\u00e8ze. On pourrait m\u00eame imaginer que la calibration fasse partie int\u00e9grante des settings... Ca serait peut-\u00eatre bien que quand l'application se lance on se retrouve sur la page principale d'affichage de donn\u00e9es et qu'on puisse simplement cliquer sur la page options qui contient la page calibration et qui permet de rentrer les infos du Grand Prix. Je pense que je vais faire ca. Voici l'interface que j'ai d\u00e9velopp\u00e9e pour regrouper tout ca : \"Screen\" La police le style le placement et les couleurs ne sont pas d\u00e9finitfs, cependant je pense que c'est un bon d\u00e9but. Le but maintenant va \u00eatre de permettre de faire fonctionner la calibration et la r\u00e9cup\u00e8ration d'images. Si j'arrive \u00e0 faire fonctionner ces deux choses sur un m\u00eame projet avant la fin de la semaine cela serait super ! Bon J'ai pu avancer sur l'int\u00e8gration de Selenium mais cela prend un peu de temps car je veux impl\u00e9metner un moyen de pouvoir prendre une Screenshot \u00e0 nimporte quel moment et pas juste en boucle. Demain je finis de faire fonctionner ca et ensuite je commence le cablage du reste. Jeudi 27 Avril 2023 C'est assez dur de faire l'importation car il y a des petites diff\u00e9rences qui obligent \u00e0 presque tout r\u00e9\u00e9crire. En fait le programme de calibration avait d\u00e9ja impl\u00e9ment\u00e9 la fonction de Windows et de Zones mais il fonctionnait juste assez diff\u00e9remment pour qu'il faille tout refaire. La je suis en train de perdre \u00e9norm\u00e9ment de temps \u00e0 cause d'un soucis de coordonn\u00e9es. J'ai repris le code de la calibration pour detecter ou l'utilisateur a cliqu\u00e9 pour cr\u00e9er les zones. Cependant, je n'arrive pas \u00e0 le faire fonctionner correctement. La zone est tout le temps d\u00e9cal\u00e9e en haut et en bas mais pas de la m\u00eame facon. En haut, la valeur Y est trop grande alors que en bas la valeur Y est trop petite... Je ne comprends pas bien pourquoi. Si c'\u00e9tait un simple d\u00e9calage cela ne serait pas compliqu\u00e9 \u00e0 g\u00e8rer mais la... J'ai un soucis \u00e9galement avec la r\u00e9solution des screenshots que je r\u00e9cup\u00e8re en full Headless. Voici un exemple de r\u00e9solution que j'arrive \u00e0 r\u00e9cup\u00e8rer sans le headless : \"High Res\" \"Low Res\" Il y a clairement un soucis et le probl\u00e8me c'est que avec une r\u00e9solution pareille, impossible de faire une reconnaissance correcte. BON J?EN PEUX PLUS LA. Ca fait des heures que je bosse sur ce probl\u00e8me d\u00e9bile et impossible de trouver une solution. J'ai essay\u00e9 cinq facons de forcer le browser headless a prendre une plus haute r\u00e9solution aucune ne fonctionne je ne comprends pas. A chaque fois que je me retrouve avec une r\u00e9solution de 1366 x 768 Ou une variante de basse r\u00e9solution du style. J'en peux plus je ne trouve aucune r\u00e9ponse sur internet ni m\u00eame avec chatGPT. Super... La seule chose que j'ai pu faire qui change quelque chose fait que les images font maintenant du 926x517... j'ai un peu envie de commentre un crime de guerre au plus vite. Vendredi 28 Avril 2023 Une des solutions que je n'ai pas encore essay\u00e9 est de changer ma version de GeckoDriver. Sauf que ca m'oblige \u00e0 changer les versions de mes libraries ce qui est tr\u00e8s p\u00e9nible, je vais continuer le debugging dans le projet Selenium_clean. Il faut savoir que la librairie de Selenium que j'utilise est bloqu\u00e9e en 0.27 ce qui fait que je ne peux utiliser qu'une version obsol\u00e8te du Gecko Driver. J'ai tent\u00e9 de changer vers une version en 64 bits du GeckoDriver 0.27 mais pareil, je me retrouve toujours avec des images de M. J'essaie toutes les solutions que je trouve sur internet aucune ne convient c'est infernal. J'essaie de changer la r\u00e9solution DPI, j'essaie de changer les param\u00eatres par d\u00e9faut des player de Firefox, j'essaie de changer la r\u00e9solution pendant et au d\u00e9but de l'execution IMPOSSIBLE DE FAIRE MARCHER CETTE MERDE C'EST PAS POSSIBLE !!! J'ai essay\u00e9 avec chrome mais je ne peux pas l'utiliser car les DRM m'emp\u00eacheront de prendre des screenshot du flux vid\u00e9o. J'ai essay\u00e9 de faire tourner avec edge mais edge ne peut pas tourner en headless. JE VAIS DEVENIR FOUF FPWQOVMQEKOVNVIBDBJDAIVOBI. ET MAINTENANT JE N'ARRIVE PLUS A FAIRE DE PROJET AVEC SELENIUM VOIWQNV(UEWQBVU)WEQN=OEJNIVIUWVBWUEV ON CHERCHE A ME FAIRE PETER UN PLOMB C'EST PAS POSSIBLE GIWEGUWEQN VOICI UN EXEMPLE DU CODE QUE JE DEMANDE A UN NOUVEAU PROJET AVEC EXACTEMENT LES MEMES LIBRARIES INSTALLEES : // Create a new FirefoxDriver instance IWebDriver driver = new FirefoxDriver (); // Navigate to the specified URL driver . Navigate (). GoToUrl ( \"https://www.example.com\" ); // Do something with the driver (e.g., find elements or take screenshots) // Quit the driver driver . Quit (); Je ne demande que ca ET MEME CA CA NE VEUT PAS FONCTIONNER VOIWENB)IWUQENV Oui je suis un peu \u00e9nerv\u00e9 ca se voit? A bon? Et maintenant NUGGET ne fonctionne plus... j'en peux plus la. Je ne peux plus t\u00e9l\u00e9charger de librairie sur aucun de mes projets... J'ai tent\u00e9 de supprimer le fichier de config et red\u00e9marrer Visual Studio mais cela ne fait rien. J'ai aussi tent\u00e9 de faire un 'nugget restore' toujours rien. Bon apparemment je ne suis pas le seul qui ne peut pas acc\u00e8der \u00e0 Nuget donc bon c'est pas juste chez moi qu'il y a un soucis. Mais m\u00eame en mettant ma 4G pour me connecter, je n'arrive pas \u00e0 acc\u00e8der \u00e0 certains sites y compris Nuget et je ne peux pas download de librairies... Je ne comprends pas ce qui se passe et du coup je ne peux juste pas bosser... J'ai red\u00e9marr\u00e9 trois fois mon pc et visual studio, j'ai essay\u00e9 de changer mes settings DNS etc... impossible de bosser. Je crois que je n'aurais pas du me reveiller aujourd'hui. Bon je vais tenter d'avancer sur mon poster en attendant que le r\u00e9seau soit en meilleur \u00e9tat. Lundi 1 Mai 2023 Bon je bosse depuis chez moi donc j'esp\u00e8re que Nuget va mieux fonctionner. Apr\u00e8s un weekend \u00e0 r\u00e9fl\u00e9chir au sujet de cette resolution je me suis dit deux choses. La seule personne sur internet que j'ai vu avoir le meme soucis avait une r\u00e9solution de 1920x1200 comme moi. Cela veut donc s\u00fbrement dire que le soucis vient de cette r\u00e9solution de laptop comme moi. Si vraiment je n'arrive pas dans un premier temps \u00e0 faire fonctionner le Headless correctement, je peux toujours laisser la page de c\u00f4t\u00e9 et m'occuper du reste du programme. Certes ca serait vraiment infernal d'avoir \u00e0 garder une page chrome ouvert en tous temps et en plus elle doit \u00eatre en plein \u00e9cran mais bon... Si il n'y a vraiment pas d'autres solutions malheureusement je serai bien oblig\u00e9. BON ! JE N'ARRIVE MEME PLUS A FAIRE UN PROJET QUI UTILISE SELENIUM ET QUI MARCHE JE VAIS FAIRE BR\u00dbLER GENEVE. C'est pas possible serieux, je ne comprends pas j'essaie tout ce que je trouve et impossible de juste lancer firefox c'est du grand nimporte quoi. Je prend les m\u00eame putain de librairies que sur les autres projets les m\u00eames versions, je prend le m\u00eame exact code. Sur le nouveau projet impossible de le faire fonctionner. Je commence \u00e0 croire que on essaie de me faire p\u00eater un cable. Du coup dans un \u00e9lan de d\u00e9sespoir je vais tenter de passer sur une autre librairie qui avec un peu de chance marche et en plus me permettrais de prendre des foutues screenshot dans le bon format. Les deux seules librairies qui pourraient potentiellement faire l'affaire sont les librairies : PhantomJS CefSharp Je vais les tester et simplement prier pour qu'elles fonctionnent et que je puisse faire ce que je veux avec. Alors pour le moment avec CEFSharp j'arrive \u00e0 lancer une instance de chrome et prendre une screenshot avec ce code : CefSettings settings = new CefSettings (); settings . CachePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . LocalApplicationData ), \"CefSharp\\\\Cache\" ); // Set cache path settings . LogSeverity = LogSeverity . Disable ; // Disable logging Cef . Initialize ( settings ); // Initialize CEF using ( var browser = new ChromiumWebBrowser ( \"www.google.com\" , new BrowserSettings ())) // Launch Chromium in off-screen mode { browser . Load ( \"https://www.example.com\" ); // Navigate to the test URL browser . Size = new Size ( 1920 , 1080 ); // Set the browser size to 1920x1080 browser . ScreenshotAsync (). ContinueWith ( task => { var bitmap = task . Result ; bitmap . Save ( \"screenshot.png\" , System . Drawing . Imaging . ImageFormat . Png ); // Take a screenshot and save it as a PNG file }). Wait (); } Cef . Shutdown (); // Shutdown CEF Avec ca il faut ces using : using System ; using System.Drawing ; using System.IO ; using CefSharp ; using CefSharp.OffScreen ; C'est assez prometteur m\u00eame si il faut encore beaucoup pour remplacer selenium. Ah bah lol en fait non on peut pas utiliser cette librarie pour faire tourner firefox... J'EN AI MARRE J'AVAIS CHERCHE PRECISEMENT UNE LIB QUI MARCHE AVEC FIREFOX Et phantomJS non plus ne fonctionne pas avec firefox... J'en ai marre. Donc je vais plut\u00f4t partir sur la librairie GeckoFX qui semble pouvoir contr\u00f4ler une instance de firefox. Mais j'avais justement pris un putain de projet C# et pas JS pour ne pas me taper ces probl\u00e8mes de librairies... Et si cette option ne fonctionne pas mon dernier espoir sera de directement int\u00e9ragir avec le geckodriver.exe et la ca risque de pas \u00eatre dr\u00f4le. JE NE COMPRENDS RIEN !!!!! Ca n'a aucun sens la doc est inexistante le seul lien qui pourrait amener sur une doc envoie sur la page principale de bitbucket. Tous les exemples de code que je trouve ne fonctionnent pas. Je n'arrive \u00e0 rien je commence \u00e0 devenir fou. Tout ce travail pour rien c'est pas possible. M\u00eame en essayant directement d'int\u00e9ragir avec le process geckodriver.exe je ne peux pas arriver \u00e0 mes fins. J'arrive \u00e0 lancer le service et tout, mais je n'arrive pas \u00e0 vraiment contr\u00f4ler ce qu'il se passe donc impossible de venir prendre des screenshot. Je ne sais tout simplement pas quoi faire ... Je suis bloqu\u00e9. Je me suis cass\u00e9 la t\u00eate \u00e0 faire un truc qui marchait bien avec selenium et tout. Mais maintenant plus rien ne fonctionne du jour au lendemain et il n'y a simplement aucune alternative. Je vais essayer de changer directement le projet Selenium_Clean mais bon ca va pas \u00eatre dr\u00f4le. Ok alors j'ai tout repris depuis le d\u00e9but et je crois que j'ai enfin une solution. Pour la trouver j'ai re-essay\u00e9 toutes les techniques que j'avais tent\u00e9 avant mais dans l'ordre et en les isolant \u00e0 chaque fois. Cela inclus : Tenter de changer la densit\u00e9 de pixels. En effet je me suis dit que comme la r\u00e9solution \u00e9tait plus basse le soucis \u00e9tait que le virtual screen avait simplement une DPI r\u00e9duite. profile.SetPreference(\"layout.css.devPixelsPerPx\", \"2.0\"); J'ai aussi tent\u00e9 de r\u00e9duire \u00e0 un seule le nombre de process de Firefox. J'ai pu lire sur internet que parfois cela pouvait influer sur les performances du renderer. profile.SetPreference(\"dom.ipc.processCount\", 1); Ensuite j'ai tent\u00e9 tout b\u00eatement de rajouter dans la liste des arguments la taille voulue de l'\u00e9cran. options.AddArgument(\"--window-size=1920,1080\"); Mais comme cela ne foncionnait pas, je me suis rabattu sur un script JS pour tenter de forcer la fen\u00eatre \u00e0 \u00eatre plus grande. js.ExecuteScript(\"window.resizeTo(1920, 1080);\"); Comme cela n'a pas march\u00e9 j'ai pu lire que cela pouvait \u00eatre la taille int\u00e9rieure qui devait \u00eatre chang\u00e9e js.ExecuteScript(\"window.innerWidth = 1920; window.innerHeight = 1080;\"); Encore une fois sans succ\u00e8s. J'ai ensuite tent\u00e9 d'utiliser trois autres versions du GeckoDriver, 0.27,0.26,0.25 et aucune ne m'aidait. Mais en fait la seule chose qui a chang\u00e9 quoi que ce soit \u00e9tait la technique suivante : Changer la window size en utilisant : options . AddArgument ( \"--width=1920\" ); options . AddArgument ( \"--height=1200\" ); Ca ne marchait pas car j'utilisais une autre methode pour resize en m\u00eame temps, qui elle ne marchait pas mais qui emp\u00eachait celle la de marcher. Ensuite le soucis que j'avais c'est que en mettant 1920-1080 je me retrouvais avec 1920-998 ou un truc du genre ce qui n'\u00e9tait pas normal alors je me disais que cette technique ne marchait pas non plus et je l'ai pass\u00e9e. Alors tout n'est pas encore gagn\u00e9, il faut que j'arrive \u00e0 impl\u00e9menter ca dans un plus gros projet et que la vid\u00e9o puisse \u00eatre prise seule. Demain je m'occupe de ca. Mardi 2 Mai 2023 Bon aujourd'hui je change le programme principal. Le soucis que j'ai c'est que en ajoutant ce syst\u00e8me de resize, maintenant la page fait 100x100 et est grise. Il doit y avoir une technique que j'ai oubli\u00e9 de retirer ou un comportement un peu bizarrre. Bon clairement je ne sais pas QUI DECIDE DE ME POURRIR LA VIE mais il est fort. J'ai t\u00e9l\u00e9charger EXACTEMENT les m\u00eames librairies que sur mon autre projet et j'utilise l'EXACT m\u00eame geckodriver.exe mais dans le projet principal impossible de lui faire chier une image m\u00eame avec l'EXACT m\u00eame code. POURQUOI VOUS ME FAITES CA????= La je ne comprend vraiment pas ce qui peut se passer pour que rien ne fonctionne alors que tout est pareil. JE VIENS DE TOUT VERIFIER TOUT EST PAREIL JE NE COMPRENDS PAS. Bon apr\u00e8s avoir supprim\u00e9 l'int\u00e9gralit\u00e9 de ma classe Emulator cela semble marcher un peu mieux. Je ne vais pas m'\u00e9tendre sur la castrophe niveau temps que cela repr\u00e9sente. Si au moins j'arrive \u00e0 faire fonctionner quelque chose je suis content. Maintenant j'ai un soucis un peu sp\u00e9cial. Depuis que j'ai chang\u00e9 la r\u00e9solution, il semble que le programme aie du mal \u00e0 cliquer sur l'icone de settings. En prenant des screenshots du moment ou l'erreur apparait, j'ai pu me rendre compte que en fait le stream est toujours en train de charger et c'est pour ca que on arrive pas \u00e0 trouver le bouton : \"ERROR 105\" \"ERROR 105\" Je pense que je n'ai le soucis que maintenant car le flux en 1080p se lance moins vite. Je vais essayer de voir si je peux detecter un \u00e9l\u00e9ment d'HTML qui correspond au loading comme ca je peux attendre qu'il disparaisse. Sinon je peux aussi juste essayer de trouver le bouton en boucle pendant une dixaine de secondes. Bon la j'essaie pendant genre plus de 50 secondes et ca ne marche toujours pas. Il semblerait que au final le probl\u00e8me vienne du GP d'azerbidjan. En effet, quand je teste un autre Grand Prix tout va bien. ET MERDE ! J'ai r\u00e9ussi \u00e0 avoir des images en 1080P mais d\u00e9s que je passe l'image en plein \u00e9cran c'est de nouveau du 1366X768 Avant de mettre en plein \u00e9cran: \"Before fullscreen\" Apr\u00e8s: \"After fullscreen\" On peut voir sur l'image que l'option 1080P est effectivement bien selectionn\u00e9e mais il doit y avoir un param\u00e8tre de Firefox qui s'occupe de la r\u00e9solution d'un player vid\u00e9o. Il va juste falloir trouver ce param\u00eatre... J'ai essay\u00e9 d'utiliser : Driver.Manage().Window.Size = new System.Drawing.Size(windowWidth, windowHeight); Sans succ\u00e8s. options.AddArgument(\"--start-maximized\"); Pareil Driver.Manage().Window.Maximize(); Toujours rien profile.SetPreference(\"full-screen-api.ignore-widgets\", true); Nada profile.SetPreference(\"media.hardware-video-decoding.enabled\", true); Toujours pas J'ai vraiment cru que j'avais trouv\u00e9 la solution en trouvant cette commande profile.SetPreference(\"full-screen-api.enabled\", true); Mais non toujours pas... Je commence \u00e0 perdre patience. C'EST BON. Apr\u00e8s litt\u00e9rallement 3h de debugging avec M.Bonvin (Que je remercie IMMENSEMENT) on a r\u00e9ussi \u00e0 trouver au fin fond d'un thread github que la valeur \u00e9tait hard cod\u00e9e dans les variables d'environnement et que donc quoi que je fasse je n'aurais pas pu le changer. En fait la seul moyen de tout r\u00e8gler a \u00e9t\u00e9 de changer les variables d'environnement de ma machine: MOZ_HEADLESS_WIDTH et MOZ_HEADLESS_HEIGHT . Et ce qu'il y a de bien c'est que maintenant je peux mettre de la 4K et cela permet de faire un meilleur upscaling. Recrutement Payerne Mai 2023 J'ai du faire mon recrutement \u00e0 Payerne Mercredi et Jeudi. Si vous \u00eates curieux je peux vous dire que comme il n'y avait presque plus de places cet \u00e9t\u00e9 je ferai Canonnier Lance mines. C'\u00e9tait assez frustrant d'avoir perdu deux jours de travail mais on va faire avec. Vendredi 5 Mai 2023 Bon malgr\u00e9s les courbatures il faut que je me mette au boulot un peu serieusement par ce que sinon ca va \u00eatre compliqu\u00e9 de rattraper mon retard. La derni\u00e8re fois si je me souviens bien j'avais r\u00e9ussi \u00e0 trouver un moyen de prendres des images en bonne r\u00e9solution. Il faut maintenant que je commence \u00e0 faire fonctionner la calibration et ce qui serait bien ca serait que je commence \u00e0 ajouter la partie OCR au projet. Il faut que je me d\u00e9p\u00eache car Lundi je dois m'occuper du Poster. OK j'ai compris le soucis que j'avais quand j'essayais de faire la calibration. J'avais mis l'image en ZOOM ce qui fait que si la hauteur n'\u00e9tait pas la bonne, l'image \u00e9tait recentr\u00e9e ce qui fait que cela faussait totalement les r\u00e9sultats. Quand on fait en sorte que l'image prenne toute la place, les coordonn\u00e9es sont prises correctement. Voici un exemple d'ou en est la partie calibration. \"Exemple settings UI\" Normalement il me suffit d'impl\u00e9menter les windows, et on devrait relativement facilement ajouter les pilotes. Et voila. J'ai pu impl\u00e9menter les windows et les pilotes. Et je peux aussi exporter des presets et les loader. Bon le loading est un peu beugg\u00e9 au niveau de l'affichage mais il semble qu'il fonctionne bien quand je save les images. Lundi je m'occupe du poster etc.. mais je pense que la suite va \u00eatre l'impl\u00e9mentation de l'OCR. Lundi 8 Mai 2023 Aujourd'hui c'est journ\u00e9e Poster. Je pense que je ne vais pas finir la journ\u00e9e content car les limitations sont un peu trop pr\u00e9sentes. J'ai fait une version que Garcia pourrait accepter, c'est \u00e0 dire en noir et blanc et avec un tout petit peu plus de d\u00e9tail. \"Poster V3\" Le truc c'est que en blanc je trouve que ca ne marche pas super. Et le concept d'avoir trois parties au projet qui se posent autour d'un circuit c'est peut-\u00eatre pas la meilleure id\u00e9e. Je me suis dit que la bonne id\u00e9e serait peut-\u00eatre de prendre un autre circuit pour qu'il y aie bien trois parties : \"Poster V4\" Clairement ce poster doit faire partie des pires. C'est pas clair et ca part dans tous les sens. Je vais essayer avec un autre layout de circuit. \"Poster V5\" Je me suis ensuite dit que le circuit n'\u00e9tait peut \u00eatre tout simplement pas une bonne id\u00e9e. J'ai donc essay\u00e9 de faire quelque chose de plus classique avec juste un peu de background pour qu'on puisse \u00e9viter le soucis de la page blanche derri\u00e8re : \"Poster V6\" Puis je me suis dit que finalement le circuit me manquait. Alors j'ai d\u00e9cid\u00e9 de combiner le background et le circuit ainsi que simplifier l\u00e9g\u00e8rement les diagrammes en retouchant un peu tout le reste on pouvait arriver \u00e0 quelque chose de sympatique : \"Poster V7\" Je ne suis pas content \u00e0 100% mais bon je pense que je vais m'en satisfaire. Pour donner une id\u00e9e de la gal\u00e8re que c'est de cr\u00e9er un poster, voici ce \u00e0 quoi ressemble mon espace de travail Figma : \"Bordel Figma\" Je ne suis pas un graphiste et ca se voit '^^. Je pense que comme il me reste un peu de temps aujourd'hui, je vais faire un peu de documentation de la partie r\u00e9cup\u00e8ration d'images. En effet, je pense que je n'aurai plus besoin de changer grand chose \u00e0 ce niveau. Mais je ne ferai pas la partie analyse fonctionnelle car l'interface n'est clairement pas termin\u00e9e. En fait j'avais oubli\u00e9 mais j'ai eu un rendez vous m\u00e9dical du coup je n'ai pas eu trop le temps de faire la doc que je voulais. Mais au moins je pense avoir finit mon travail sur le poster et le abstract en Anglais qui sont les deux gros livrables \u00e0 venir. Mardi 9 Mai 2023 Bon je viens de me rendre compte que apparemment on doit rendre l'abstract anglais, le Poster, ET LE PROJET. Je pense que mes deux jours \u00e0 l'arm\u00e9e m'ont fait perdre un peu la notion du temps car j'avais l'impression que l'evaluation interm\u00e9diaire 1 \u00e9tait il y a genre moins d'une semaine. Donc aujourd'hui je ne vais pas trop avancer sur le code et vraiment me focus sur la documentation de la r\u00e9cup\u00e8ration d'images. Je pense que je vais aussi ajouter la partie calibration \u00e0 la documentation. Je pense que c'est important que je prenne le temps maintenant car sinon le prof aura l'impression que ca n'a pas trop avanc\u00e9 depuis la derni\u00e8re fois. Et puis je pense que la partie calibration et r\u00e9cup\u00e8ration d'images ne va pas trop changer et la partie calibration encore moins. La partie anglaise je fais la revoir un peu mais je l'avais d\u00e9ja faite pendant les premiers jours alors ca devrait aller. Pour le rendu il nous \u00e9tait demand\u00e9 de fournir un fichier PDF avec tout dedans avec une table des mati\u00e8res notre code source etc... Pour ce faire j'ai du changer le mkdocs.yml et installer des packages. Voici les changements :: site_name: Documentation Track Trends site_author: Rohmer Maxime copyright: \u00a9CFPTI Tech2 theme: name: material palette: # Palette toggle for light mode - media: \"(prefers-color-scheme: light)\" scheme: default toggle: icon: material/brightness-7 name: Switch to dark mode # Palette toggle for dark mode - media: \"(prefers-color-scheme: dark)\" scheme: slate toggle: icon: material/brightness-4 name: Switch to light mode markdown_extensions: - attr_list - md_in_html - pymdownx.highlight plugins: - glightbox - search - img2fig - with-pdf: cover_subtitle: Vroum Vroum enabled_if_env: ENABLE_PDF_EXPORT - annexes-integration: annexes: # Required (at least 1) - ConfigurationTool.cs: Code/ConfigurationTool.cs # An path to an annex with its title - DriverGapToLeaderWindow.cs: Code/DriverGapToLeaderWindow.cs # An path to an annex with its title - DriverPositionWindow.cs: Code/DriverPositionWindow.cs # An path to an annex with its title - F1TVEmulator.cs: Code/F1TVEmulator.cs # An path to an annex with its title - Program.cs: Code/Program.cs # An path to an annex with its title - Window.cs: Code/Window.cs # An path to an annex with its title - DriverData.cs: Code/DriverData.cs # An path to an annex with its title - DriverLapTimeWindow.cs: Code/DriverLapTimeWindow.cs # An path to an annex with its title - DriverSectorWindow.cs: Code/DriverSectorWindow.cs # An path to an annex with its title - Form1.cs: Code/Form1.cs # An path to an annex with its title - Reader.cs: Code/Reader.cs # An path to an annex with its title - Zone.cs: Code/Zone.cs # An path to an annex with its title - DriverDrsWindow.cs: Code/DriverDrsWindow.cs # An path to an annex with its title - DriverNameWindow.cs: Code/DriverNameWindow.cs # An path to an annex with its title - DriverTyresWindow.cs: Code/DriverTyresWindow.cs # An path to an annex with its title - OcrImage.cs: Code/OcrImage.cs # An path to an annex with its title - Settings.cs: Code/Settings.cs # An path to an annex with its title - recoverCookiesCSV.py: Code/recoverCookiesCSV.py # An path to an annex with its title Je remercie Monsieur Briard le sultan officiel de Mkdocs de la classe de m'avoir aid\u00e9 pour cette partie et avoir cr\u00e9\u00e9 un plugin qui me permet de mettre mon code source directement dans le pdf. Bon au final j'ai quand m\u00eame chang\u00e9 mon poster \"Poster V8\" Mais je suis trop attach\u00e9 \u00e0 l'ancien concept alors je vais plut\u00f4t utiliser ca : \"Poster V9\" Je pense que cette version est meilleure m\u00eame si elle est encore plus en bordel par ce que le texte permet de se faire une meilleure id\u00e9e de l'utilis\u00e9 de chaque partie. Mercredi 10 Mai 2023 Bon hier je n'ai pas eu le temps de finir la documentation de la recup\u00e8ration d'images et de la calibration. Il faudra donc que je repasse un coup dessus en fin de semaine je pense. Mais la j'aimerais avancer sur la mise en commun du projet, comme la configuration fonctionne plut\u00f4t pas mal je pense que je vais juste vite fait aller commenter les methodes qui ne le sont pas encore et ensuite je vais passer \u00e0 l'impl\u00e9mentation de l'OCR. Je suis presque certain que l'OCR va avoir besoin de plus de r\u00e8glages mais bon on verra bien. Je me rend compte en commentant que la methode de load serait plus efficace avec un tout petit peu plus d'infos de la part du JSON. J'aurais pu ajouter l'offset entre chaque Driver Zone pour eviter un l\u00e8ger drift lors de la reconstruction. Mais bon rien de grave donc je pense que je vais le laisser comme ca pour le moment \u00e0 moins que ca me pose soucis plus tard. J'ai eu quelques soucis avec les images en 4K. Du coup j'ai descendu les variables d'environnement \u00e0 1920x1080 En fait il y a parfois un soucis un peu p\u00e9nible avec l'OCR. Parfois pour un temps comme ci dessous: \"1:45.140\" Le programme ne va pas bien comprendre les ponctuations et il va donner : 1115140 La il y a deux probl\u00e8mes... Le 1:xx.xxx est compris comme 11xxxxx et le 4 s'est transform\u00e9 en 1... J'ai cr\u00e9\u00e9 ce \"petit\" bout de code pour g\u00e8rer les fois ou les '.' et les ':' ont mal \u00e9t\u00e9 interpr\u00eat\u00e9s if ( rawNumbers . Count == 1 ) { //If this code is used it means that its bad ... //The methods that comes are really not that great and are juste quick fixes try { result = Convert . ToInt32 ( rawNumbers [ 0 ]); switch ( windowType ) { case OcrImage . WindowType . Sector : //The usual sector is in this form : 33.456 if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' has been understood like a number result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ]); } if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ]); } break ; case OcrImage . WindowType . LapTime : //The usual Lap time is in this form : 1:45:345 if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' and ':' have been overlooked //I Know Im skipping the cases where there are more than 9 minuts but it happens so rarely that... we dont care result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ] + rawNumbers [ 0 ][ 2 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ]); } if ( rawNumbers [ 0 ]. Length == 7 ) { //There is two possibilities //Either 1:45.140 has been interpreted as 1145.10 or 1:451140. We will assume its the first one result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ] + rawNumbers [ 0 ][ 6 ]); } break ; case OcrImage . WindowType . Gap : //The usual Gap is in this form : + 34.567 if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ]); } break ; } if ( rawNumbers [ 0 ]. Length > 6 ) { //The number definitely has been interpreted wrong } } catch { //It can be because the input is empty or because its the LEADER bracket result = 0 ; } } else { //Auuuugh result = 0 ; } ConfigFile = \"./Presets/Clean_2023.json\" ; string gpUrl = \"https://f1tv.formula1.com/detail/1000006688/2023-azerbaijan-grand-prix?action=play\" ; Bon je n'arrive pas \u00e0 faire fonctionner l'OCR sans tout faire crash \u00e0 chaque fois. Je vais abandonner le travail de la journ\u00e9e pour revenir au point initial... C'est tr\u00e8s frustrant mais bon je ne vois pas comment faire mieux. Rien ne marche alors qu'avant ca marchant super sur le projet OCR normal. Va savoir pourquoi m\u00eame comme ca, impossible de faire marcher l'OCR. Il y a un soucis au niveau de l'ASYNC qui me fait crash tout le temps en me disant qu'un objet est deja en train d'\u00eatre utilis\u00e9. Ca marchait nikel dans mes premi\u00e8res version je ne vois pas pourquoi ca p\u00eate maintenant. Je pense que je vois \u00e0 peu pr\u00e8s le soucis. public virtual async Task < DriverData > Decode ( List < string > driverList ) { int sectorCount = 0 ; DriverData result = new DriverData (); Parallel . ForEach ( Windows , async w => { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) result . Name = ( string ) await ( w as DriverNameWindow ). DecodePng ( driverList ); if ( w is DriverDrsWindow ) result . DRS = ( bool ) await ( w as DriverDrsWindow ). DecodePng (); if ( w is DriverGapToLeaderWindow ) result . GapToLeader = ( int ) await ( w as DriverGapToLeaderWindow ). DecodePng (); if ( w is DriverLapTimeWindow ) result . LapTime = ( int ) await ( w as DriverLapTimeWindow ). DecodePng (); if ( w is DriverPositionWindow ) result . Position = ( int ) await ( w as DriverPositionWindow ). DecodePng (); if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) result . Sector1 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 2 ) result . Sector2 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 3 ) result . Sector3 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); } if ( w is DriverTyresWindow ) result . CurrentTyre = ( Tyre ) await ( w as DriverTyresWindow ). DecodePng (); }); return result ; } Ca c'est ma methode de decoding de chaque Driver Zone. Le message d'erreur me parle d'une windowImage quand il dit qu'un objet est d\u00e9ja utilis\u00e9. Ma conjecture c'est que en essayant de faire toutes les windows en m\u00eame temps. Elles veulent parfois acc\u00e8der \u00e0 l'image principale en m\u00eame temps. Ce qui evidemment pose probl\u00e8me. Je pense que le fix le plus simple serait de faire le traitement sans le parallele quitte \u00e0 exporter ce fonctionnement sur chaque zone en elle m\u00eame pour ne pas perdre trop de performances. Ok je crois que je vois ou est le soucis. En fait dans cette version du programme c'est toujours la premi\u00e8re image qui \u00e9tait juste tout le temps prise et dans la premi\u00e8re image on a une partie des chiffres qui est bloqu\u00e9e par l'UI de la fen\u00eatre... lol... EN FAIT J'avais un soucis dans ma gestion des chiffres mal faits. Visiblement parfois quand je ne prenais pas en compte un :, un LapTime etait compris comme un Gap to leader ou un Secteur Bon j'en ai tellement marre... Je n'arrive tout simplement PAS \u00e0 faire fonctionner l'OCR ca crash tout le temps j'en peux plus. J'ai tent\u00e9 de r\u00e8gler les probl\u00e8mes de mauvaises detections de secteurs et temps au tour qui font crasher l'app : if ( rawNumbers . Count == 2 ) { //ss:ms result = ( Convert . ToInt32 ( rawNumbers [ 0 ]) * 1000 ) + Convert . ToInt32 ( rawNumbers [ 1 ]); if ( result > ( 60000 + 999 )) { if ( windowType == OcrImage . WindowType . LapTime ) { result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 1 ]); } if ( windowType == OcrImage . WindowType . Sector ) { int seconds = 0 ; if ( rawNumbers [ 0 ]. Length == 3 ) { //We have one char that we need to delete //For no apparent reason im going to delete the first seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); } else { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); } int ms = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); result = seconds * 1000 + ms ; } } } Mais toujours impossible de faire fonctionner cette M**** C'est juste infernal. Je pense que je vais encore tout retirer et remplacer par ce que j'ai dans mon projet OCR original. Donc c'est une journ\u00e9e de perdue compl\u00eatement... C'est extr\u00eamement frustrant. Apr\u00e8s des heures de debug j'ai enfin r\u00e9ussi \u00e0 faire fonctionner le programme de temps en temps. Mais j'ai toujours le soucis que l'image ne veut pas changer alors que je fais tout pour et que l'OCR est nulle \u00e0 chier du coup... Jeudi 11 Mai 2023 Bon apr\u00e8s une bonne nuit de sommeil je vais reprendre les choses depuis le d\u00e9but. J'ai deux soucis : L'OCR pue du derche L'Image que l'on d\u00e9code ne change pas Pour la premi\u00e8re partie j'ai ma petite th\u00e9orie. Je pense que comme je donne des images 4K alors que le feed est en 1080P, il y a d\u00e9ja un genre d'interpolation qui est faite. Je pense donc qu'il faut que j'adapte mon engine pour qu'il fonctionne avec cette r\u00e9solution. Je me suis demand\u00e9 si ca n'\u00e9tait pas mieux de prendre en compte les deux r\u00e9solutions pour les pc un peu moins bal\u00e8zes et j'ai d\u00e9cid\u00e9 de n'en avoir rien a faire. On verra dans le futur si c'est une feature que je voudrais ajouter mais c'est en dehors du scope du dipl\u00f4me je pense. Pour la seconde partie, je pense qu'il faut que j'aille voir du c\u00f4te de OCR_Decode et de OCR Tester pour voir comment je faisais. Je dois forc\u00e9ment oublier un truc. Bon ca commence mal, quand je vais voir dans le projet OCR_Decode, le changement d'image est exactement le m\u00eame et il fonctionne alors que de mon c\u00f4t\u00e9 ca n'est pas le cas. Alors deux choses. Je me rend compte que le changement d'images n'a AUCUN effet sur la detection de texte, et seconde chose, le d\u00e9calage est trop grand entre les windows. Des que le soucis d'image est r\u00e8gl\u00e9 il va falloir que je change drastiquement ma facon de stocker la config en JSON. Il faut que je conserve les \u00e9carts. Sinon regardez ce que ca donne quand on arrive au dernier pilote : \"Zone de pilote d\u00e9cal\u00e9e\" Je commence \u00e0 devenir FOU. Je n'arrive pas \u00e0 changer cette foutue image wtf... J'ai beau tenter par tous les moyens de la changer par une image noire, l'image semble toujours rester celle du d\u00e9part. Bon j'ai enfin trouv\u00e9 pourquoi et je n'ai pas envie de dire comment j'ai trouv\u00e9... Je pense que l'on a tous droit \u00e0 son petit jardin secret. Maintenant ca veut dire que je peux me focus sur le concept important qui est le changement de la cr\u00e9ation et de la lecture des JSON. Voici un exemple de preset JSON : { \"Main\" : { \"x\" : 40 , \"y\" : 355 , \"width\" : 3784 , \"height\" : 1438 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : -10 , \"width\" : 3784 , \"height\" : 71 , \"Windows\" : [ { \"Position\" : { \"x\" : 47 , \"y\" : 11 , \"width\" : 72 }, \"GapToLeader\" : { \"x\" : 445 , \"y\" : 13 , \"width\" : 201 }, \"LapTime\" : { \"x\" : 859 , \"y\" : 14 , \"width\" : 221 }, \"DRS\" : { \"x\" : 1094 , \"y\" : 13 , \"width\" : 173 }, \"Tyres\" : { \"x\" : 1270 , \"y\" : 11 , \"width\" : 1452 }, \"Name\" : { \"x\" : 2727 , \"y\" : 11 , \"width\" : 351 }, \"Sector1\" : { \"x\" : 3083 , \"y\" : 10 , \"width\" : 253 }, \"Sector2\" : { \"x\" : 3339 , \"y\" : 14 , \"width\" : 195 }, \"Sector3\" : { \"x\" : 3518 , \"y\" : 14 , \"width\" : 250 } } ] } } ] }, \"Drivers\" : [ \"Perez\" , \"Leclerc\" , \"Sainz\" , \"Alonso\" , \"Stroll\" , \"Russel\" , \"Verstappen\" , \"Zhou\" , \"Ocon\" , \"Hulkenberg\" , \"Hamilton\" , \"Norris\" , \"Tsunoda\" , \"Magnussen\" , \"Piastri\" , \"Albon\" , \"Gasly\" , \"Sargeant\" , \"Bottas\" , \"De Vries\" ] } Je pense que ce qui serait bien ce serait de rajouter un \"offsets\" qui contienne les 19 \u00e9carts restants. Bon... la structure de ma fabrication de JSON etait trop confuse je trouve alors je l'ai compl\u00eatement refaite. J'ai aussi abandonn\u00e9 l'id\u00e9e de faire un fichier le plus petit possible car au final on s'en fiche et le plus important c'est que toutes les windows et les zones soient aux bons endroits. Ca nous fait un fichier d'environs 1300 lignes mais au moins le code pour la serialisation est plut\u00f4t clean : public void SaveToJson ( List < string > drivers , string configName ) { string JSON = \"\" ; JsonObject jsonFileObject = new JsonObject (); //Creating the mainZone object JsonObject mainZoneObject = new JsonObject (); mainZoneObject . Add ( \"x\" , MainZone . Bounds . X ); mainZoneObject . Add ( \"y\" , MainZone . Bounds . Y ); mainZoneObject . Add ( \"width\" , MainZone . Bounds . Width ); mainZoneObject . Add ( \"height\" , MainZone . Bounds . Height ); JsonArray driverZonesArray = new JsonArray (); int DriverID = 0 ; foreach ( Zone driverZone in MainZone . Zones ) { DriverID ++; JsonObject driverZoneObject = new JsonObject (); driverZoneObject . Add ( \"name\" , \"Driver\" + DriverID ); driverZoneObject . Add ( \"x\" , driverZone . Bounds . X ); driverZoneObject . Add ( \"y\" , driverZone . Bounds . Y ); driverZoneObject . Add ( \"width\" , driverZone . Bounds . Width ); driverZoneObject . Add ( \"height\" , driverZone . Bounds . Height ); JsonArray windowsArray = new JsonArray (); JsonObject windowObject = new JsonObject (); foreach ( Window window in driverZone . Windows ) { windowObject . Add ( window . Name , new JsonObject { { \"x\" , window . Bounds . X }, { \"y\" , window . Bounds . Y }, { \"width\" , window . Bounds . Width }, { \"height\" , window . Bounds . Height } }); } windowsArray . Add ( windowObject ); driverZoneObject . Add ( \"Windows\" , windowsArray ); driverZonesArray . Add ( driverZoneObject ); } mainZoneObject . Add ( \"DriverZones\" , driverZonesArray ); JsonArray driversArray = new JsonArray (); foreach ( string driver in drivers ) { driversArray . Add ( driver ); } mainZoneObject . Add ( \"Drivers\" , driversArray ); jsonFileObject . Add ( \"Main\" , mainZoneObject ); JSON = jsonFileObject . ToString (); //Saving the file string path = CONFIGS_FOLDER_NAME + configName ; if ( File . Exists ( path + \".json\" )) { //We need to create a new name int count = 2 ; while ( File . Exists ( path + \"_\" + count + \".json\" )) { count ++; } path += \"_\" + count + \".json\" ; } else { path += \".json\" ; } File . WriteAllText ( path , JSON ); } Et normalement la lecture devrait \u00eatre encore plus simple. En fait c'\u00e9tait pas beaucoup plus simple mais au moins maintenant ca marche. Je vais pas mettre le code de lecture ici car c'est un peu trop long donc il va falloir me croire sur parole. (Ou aller sur Git) Bon bah on est au m\u00eame endroit qu'hier... Bon pour demain le plan de bataille ca va \u00eatre : Changer compl\u00eatement la methode \"GetTimeFromPng\" pour qu'elle prenne en compte toutes les possibilit\u00e9s de bugs et d'oubli de '.' ou de ':' mais pas selon le nombre de blocs mais selon le type de temps que l'on cherche Pour le moment je regarde le nombre de blocs et si il y en a deux alors c'est que c'est un temps de secteur. En fait non cela peut aussi \u00eatre un temps au tour qui a rat\u00e9 un point. Il faut que je bosse juste un peu vite fait la dessus et que j'arr\u00eate de putain de crasher d\u00e8s que un truc est pas au bon format. Ensuite quand ca aura arr\u00eat\u00e9 de crasher je vais reprendre l'OCR et voir pourquoi les resultats sont nuls a chier comme ca. Et le but c'est que demain soir j'ai une reconnaissance de caract\u00e8res plus proche de ce que j'avais dans d'autres projets... J'y croit 0 mais bon l'espoir fait vivre comme on dit. vendredi 12 Mai 2023 Bon aujourd'hui il faut que ca marche. On va y aller par \u00e9tape. Je vais revoir toutes les methodes d'OCR et essayer de r\u00e9apliquer les filtres differemment et revenir au point de d\u00e9part. Avant de commencer je note plusieurs soucis avec les premiers tests : Les positions des pilotes ont l'air pas mal (Pas besoin de tout changer mais peut-\u00eatre simplement checker que les filtres sont bons) L'\u00e9cart avec le leader est \u00e9tonnamment pas mal aussi Le temps au tour est tout simplement horrible. Aucun n'est juste et de tr\u00e8s loin m\u00eame si les d\u00e9cimales ne sont pas forc\u00e9ment loin Le DRS je n'ai pas eu l'occasion de bien le tester mais je dirais que ca devrait \u00eatre bon (\u00e0 verifier quand le reste sera bon) Les pneus ne sont \u00e9tonnamment pas SI horribles, m\u00eame si parfois les lettres sont prises comme des chiffres Les noms de pilotes sont tr\u00e8s bon (pas \u00e9tonnant vu le syst\u00e8me de distance de Levenstein donc ca m\u00e9rite quand m\u00eame un petit check) Les secteurs sont en g\u00e9n\u00e9ral horribles mais pas toujours. C'est peut-\u00eatre un soucis de d\u00e9cimale ou des 4 qui se transforment en 1 J'ai remarqu\u00e9 que les 4 sont souvent pris comme des 1. Peut-\u00eatre que en ayant des images 4K l'interpolation est un peu diff\u00e9rente de ce que j'ai l'habitude de voir. Mais donc le plan aujourd'hui c'est de checker tous ces points et les faire fonctionner (youpi...) J'ai d\u00e9sactiv\u00e9 toutes les methodes de cette facon : int sectorCount = 0 ; DriverData result = new DriverData (); foreach ( Window w in Windows ) { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) //result.Name = (string)await (w as DriverNameWindow).DecodePng(driverList); result . Name = \"Unknown\" ; if ( w is DriverDrsWindow ) //result.DRS = (bool)await (w as DriverDrsWindow).DecodePng(); result . DRS = false ; if ( w is DriverGapToLeaderWindow ) //result.GapToLeader = (int)await (w as DriverGapToLeaderWindow).DecodePng(); result . GapToLeader = 0 ; if ( w is DriverLapTimeWindow ) //result.LapTime = (int)await (w as DriverLapTimeWindow).DecodePng(); result . LapTime = 0 ; if ( w is DriverPositionWindow ) //result.Position = (int)await (w as DriverPositionWindow).DecodePng(); result . Position = 0 ; if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) //result.Sector1 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector1 = 0 ; if ( sectorCount == 2 ) //result.Sector2 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector2 = 0 ; if ( sectorCount == 3 ) //result.Sector3 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector3 = 0 ; } if ( w is DriverTyresWindow ) //result.CurrentTyre = (Tyre)await (w as DriverTyresWindow).DecodePng(); result . CurrentTyre = new Tyre ( Tyre . Type . Undefined , 0 ); } return result ; Le but c'est que ensuite je puisse y aller \u00e9tape par \u00e9tape. Position : Alors pour cette reconnaissance je dirais que la 4K fait des merveilles qui permettent de retirer du processing. La position apr\u00e8s un simple Treshold est assez bien reconnue et la dilataion et/ou Erosion ne sont pas nescessaires finalement. On va donc pouvoir gagner un certain temps et c'est un bon signe pour la suite. On peut aussi noter que quand un pilote est hors course toutes ses valeurs sont gris\u00e9es et sa position est prise comme un -1 Sectors, alors j'ai refait toute la partie qui concerne les secteurs et qui les nettoie. Et je me suis rendu compte qu'ils \u00e9taient bien souvent juste, le seul truc c'est que ils s'affichent de mani\u00e8re un peu sp\u00e9ciale. En fait dans la page de la F1TV les secteurs peuvent faire plus de 60 secondes sans passer sur un affichage de minutes. Ce qui fait que c'est un peu bizarre \u00e0 regarder mais c'est parfaitement juste. J'ai aussi pu simplifier la reconnaissance gr\u00e2ce \u00e0 l'image de meilleure qualit\u00e9 et maintenant les temps de secteur sont plut\u00f4t corrects. En fait le plus long et complexe c'est de pr\u00e9voir les cas particuliers ou un '.' a \u00e9t\u00e9 mal interpr\u00eat\u00e9... Et en parlant de ca, je vais aller m'occuper des temps au tour qui ajoutent une couche de complexit\u00e9 avec un '.' ET un ':' qui peuvent \u00eatre oubli\u00e9s... Oh et j'y pense, un truc malin pourrait \u00eatre de comparer les temps au tour et les temps de secteur. Ils devraient concorder normalement je pense. Ok je viens de finir la gestion des temps au tour... J'ai un code de genre 170 lignes pour juste nettoyer le resultat dans le cas ou des '.' n'ont pas \u00e9t\u00e9 trouv\u00e9s ou des ':' ont \u00e9t\u00e9 n'ont pas \u00e9t\u00e9 trouv\u00e9 ou si l'un des deux s'est transform\u00e9 en chiffre etc.. etc.. etc.. Le soucis c'est que la maintenant je me rend compte que les \u00e9carts entre les pilotes vont juste \u00eatre un enfer \u00e0 nettoyer... Ils peuvent aussi bien \u00eatre \"0.760\" comme \"1:34.456\" du coup... je sais pas vraiment comment faire pour tout nettoyer. Je pense que je vais juste en avoir rien \u00e0 faire et tant pis si de temps en temps c'est pas g\u00e9nial. Bon du coup j'ai pas pris en compte TOUS les cas possibles mais d\u00e9ja un certain nombre et c'est d\u00e9ja pas mal. Sur les diff\u00e9rents Grand Prix d'exemples ca a l'air de plut\u00f4t bien tourner ! Mais ca demande tellement de tests et de code que c'est un peu ridicule... La methode \"GetTimeFromPng\" fait d\u00e9ja presque 430 lignes \u00e0 cause de tous les cas possibles et tous les try catch. Ca peut para\u00eetre peu \u00e9l\u00e9gant mais j'ai essay\u00e9 de mettre des commentaires un peu partout pour permettre \u00e0 nimporte qui de comprendre ce qui se passe. J'ai aussi pu faire les pneus et maintenant (roulement de tambour) Ca marche (presque) En fait j'ai des soucis parfois quand les pneus sont un peu cach\u00e9s dans les permiers tours : Pneus cach\u00e9s Le soucis c'est que du coup le chiffre est un peu illisible... mais je pense que avec l'historique il devrait y avoir moyen de ne pas prendre en compte les chiffres de pneus pendant cinq tours apr\u00e8s le changement de pneu ou de simplement tenter de faire les calculs de pneus. Pour conclure la journ\u00e9e je pense que je devrais avoir le temps de faire un syst\u00e8me qui permet de refresh \u00e0 volont\u00e9. Par contre je viens de d\u00e9couvrir que quand un temps de secteur est en couleur on arrive pas \u00e0 le lire. Ah et la detection prend un peu moins de trois secondes sur mon pc je crois. Mais c'est seulement si les driver zones sont faites en m\u00eame temps mais en faisant ca de temps en temps ca crash et \u00e0 chaques fois c'est d'un endroit diff\u00e9rent du coup je comprend pas vraiment. Sinon ca prend dix secondes. Lundi 15 Mai 2023 Aujourd'hui c'est journ\u00e9e poster et visites. Comme on va avoir des visites de premi\u00e8res ann\u00e9es voire de terminales et que le soir c'est visite des parents. Je pense que j'ai finit de tout regrouper (\u00e0 part \u00e9videmment le traitement et le stockage des donn\u00e9es) ce qui veut dire que je suis pas dans une superbe posture. Il va falloir que je sois tr\u00e8s efficace dans la partie stockage de donn\u00e9es et mise en place du mod\u00e8le si je veux avoir une chance de rendre un joli travail de dipl\u00f4me. (et m\u00eame comme ca je peux voir que le temps commence \u00e0 manquer) Dans l'id\u00e9al je devrais avoir termin\u00e9 la partie stockage jeudi... Ce qui veut dire que je n'ai que trois jours pour le faire et que en plus jeudi je dois travailler depuis la maison. Ca va pas \u00eatre simple. Mais aujourd'hui je vais m'occuper d'adapter la documentation de l'OCR et faire la documentation de toute la partie r\u00e9cup\u00e8ration d'images et de la calibration. Bon au final la journ\u00e9e a \u00e9t\u00e9 un peu difficile. On a pas vraiment pu travailler l'apr\u00e8s midi car il a fallu pr\u00e9senter le projet environs 10 fois \u00e0 toutes les classes et \u00e0 des parents voire futurs experts. Les d\u00e9mos ont plut\u00f4t bien fonctionn\u00e9es j'en suis assez content. Mais ca veut dire que la partie doc a pas forc\u00e9ment pu \u00eatre totalement compl\u00eat\u00e9e mais demain il va falloir que je m'occupe de la suite du projet. Mardi 16 Mai 2023 Bon aujourd'hui c'est la partie stockage qui doit \u00eatre faite. Il y a plusieurs solutions possibles \u00e0 ce probl\u00e8me. Mais comme je n'ai besoin que d'une base de donn\u00e9e locale et que je ne veux pas que chaque utilisateur doive installer un serveur sur sa machine je pense que je vais utiliser une base de donn\u00e9es SQLITE. Il y a eu une petit intervention de mr Bonvin qui est venu me donner une id\u00e9e pour la partie OCR. En fait j'avais un soucis quand je voulais d\u00e9coder du texte de couleur. M\u00eame en appliquant un filtre de gris je n'arrivais pas \u00e0 faire reconnaitre les chiffres. Et il m'a dit que une bonne id\u00e9e cela pourrait de prendre la valeur max de chaque channel et de la faire appliquer \u00e0 tous ce qui blanchit assez bien l'image. J'ai d\u00e9cid\u00e9 d'exag\u00e8rer le blanchiment et cela donne des r\u00e9sultats plut\u00f4t... int\u00e9ressants... \"Filtre vanish oxy action sur un secteur violet\" Le soucis c'est que le violet est une couleur quand m\u00eame assez sombre alors il va falloir que je fasse un syst\u00e8me de treshold un peu sp\u00e9cial qui soit un peu plus sympa et qui prenne plus facilement des couleurs plus basses. Une methode \u00e0 laquelle j'ai pens\u00e9 pour detecter dans quel tour chaque pilote est serait de garder en m\u00e9moire toutes les infos de chaques pilotes au fur et \u00e0 mesure, et d\u00e8s qu'on ne recoit plus d'infos des secteurs ou que le temps au tour a chang\u00e9 on peut savoir qu'il faut passer au tour suivant. Pour detecter les arr\u00eats aux stands je peux essayer de detecter un changement de type de pneus ou de nombre de tours detect\u00e9s sur le m\u00eame pneu Au d\u00e9part je me disais que je pourrais peut-\u00eatre faire une base de donn\u00e9e SQLITE locale qui puisse \u00eatre reprise d'un Grand Prix \u00e0 un autre. Mais je me suis dit que de faire des statistiques inter Grand Prix \u00e9tait un peu en dehors du scope du projet. La base de donn\u00e9e sera donc cr\u00e9\u00e9e \u00e0 chaque d\u00e9marrage de l'app La mani\u00e8re dont je vois les choses en ce moment est qu'on aie deux sources de donn\u00e9es dans l'affichage final. On aurait une partie des infos qui seraient en direct depuis la detection : Les ecarts entre pilotes La position des pilotes Le dernier temps au tour Les derniers secteurs Les pneus Mais on aurait aussi des rubriques cr\u00e9\u00e9es de toutes pi\u00e8ces par des infos qui viennent de la BD Voici les rubriques qui pourraient \u00eatre int\u00e9ressantes \u00e0 voir dans l'interface finale : Les 3 ou 5 pilotes les plus rapides ces cinq derniers tours Le pilote qui a le plus fait de d\u00e9passements Les batailles en cours Les 3 pilotes les plus lents Un classement pond\u00e9r\u00e9 avec les 20s de moins pour tous les pilotes qui ne se sont pas encore arr\u00eat\u00e9s En gros l'id\u00e9e serait que on update une fois par tour et par pilote la base de donn\u00e9e avec des infos comme le temps au tour, le type de pneu etc... Voici les trois tables que je vais cr\u00e9er : Drivers Colonne Type de Data Description Tag ID INTEGER ID du pilote PRIMARY Name VARCHAR Nom du pilote NOT NULL Pitstops Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui a effectu\u00e9 le Pitstop PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL Stats Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui concern\u00e9 PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL LapTime INTEGER Temps au tour (MS) NOT NULL Sector1 INTEGER Temps du secteur 1 (MS) NOT NULL Sector2 INTEGER Temps du secteur 2 (MS) NOT NULL Sector3 INTEGER Temps du secteur 3 (MS) NOT NULL GapToLeader INTEGER Ecart avec le leader (MS) NOT NULL Position INTEGER Position pilote NOT NULL Ca n'est pas forc\u00e9ment d\u00e9finitif mais je pense que c'est d\u00e9ja un bon d\u00e9but pour faire des rubriques sympa. Je suis en train de tenter d'impl\u00e9menter le code pour permettre ensuite d'ajouter et retirer des choses facilement. Mercredi 17 Mai 2023 Aujourd'hui le but c'est de remplir la base SQLITE avec des infos. Si j'arrive \u00e0 tout remplir alors ca devrait pas \u00eatre trop compliqu\u00e9 de venir faire des requ\u00e8tes qui donnent de bonnes infos. Mais la probl\u00e9matique principale va \u00eatre de d\u00e9cider QUAND ins\u00e8rer des choses dans la base de donn\u00e9e. Je pense que le meilleur moyen serait de garder une liste de DriverData par pilote en piste qui puisse contenir toutes les data que l'on recoit. Et \u00e0 chaques fois que l'on veut ajouter \u00e0 cette liste on v\u00e9rifie si un tour a \u00e9t\u00e9 fait pour envoyer les data pr\u00e9c\u00e9dente et r\u00e9initialiser la liste. Il faut donc une liste de 20 listes de DriverData et une liste de int qui repr\u00e9senteront le num\u00e9ro du tour dans lequel chaque pilote se trouve. Pour detecter un arr\u00eat je pense que la meilleure mani\u00e8re est de regarder si le pilote a chang\u00e9 de place ou de type de pneu. Si je prend que les fois ou le pilote change place ET de pneus alors certains arr\u00eats pour ceux qui sont loins devant ou loins derri\u00e8re pourraient ne pas \u00eatre detect\u00e9s. Et si je ne prend que le changement de pneus cela pose un soucis car un pneu pourrait avoir \u00e9t\u00e9 chang\u00e9 pour un autre du m\u00eame type. Et parfois les valeurs de tours faits avec le pneu ne sont pas toujours bien lues et parfois sont compliqu\u00e9es \u00e0 retrouver car tous les pneus ne sont pas neuf quand ils sont chauss\u00e9s. Je crois que la detection de tours et des arr\u00eats aux stands est sur la bonne voie. Le seul soucis que j'ai c'est que pour faire du debug je suis un peu oblig\u00e9 d'attendre pendant 10min si je veux avoir de quoi faire des stats un peu sympa. Je me rend compte que parfois j'obtiens des r\u00e9sultats un peu bizarres mais que c'est la f1TV qui les donne. Par exemple de cas ou Alex Albon n'a que deux tours sur ses pneus alors que tout le monde devant et derri\u00e8re lui en a 3 et que on est au tour 4. \"wtf...?\" Ah et aussi parfois quand les pilotes se d\u00e9passent on se retrouve dans des situations plut\u00f4t rigolotes : \"Wtf...??\" COMMENT JE FAIS POUR DETECTER CA WIONDVIDNJDODVNSDIC Bon je me rend compte que clairement si je veux que mes data soient plus utiles il faudrait que je fasse un tout petit peu plus de taff sur quelques points dans l'OCR. Le nombre de tours des pneus (Les num\u00e9ros sont vraiment mal detect\u00e9s et parfois m\u00eame la couleur est pas dingue) Les 4 qui sont pris pour des 1 ou des 11 (pour les temps et les pneus) apr\u00e8s un test de plus longue haleine je suis content de voir que au moins mon programme peut tourner plus d'une heure sans crasher et qu'il peut \u00eatre fiable quand il veut. Jeudi 18 Mai 2023 Aujourd'hui c'est t\u00e9l\u00e9Travail forc\u00e9 et j'\u00e9tais scens\u00e9 aller au Grand Prix d'Imola ce qui malheureusement ne pourra pas se faire pour des raisons d'inondations. En effet la r\u00e9gion est clairement pas en \u00e9tat de recevoir un Grand Prix de Formule 1 et donc ce weekend c'est maison. Le but du jour c'est d'avancer la doc et de tenter d'am\u00e9liorer l'OCR pour que Lundi il soit relativement facile d'avancer sur l'interface de l'app finale. Je suis en train d'explorer une methode de detection de bords de sobel. Le seul soucis c'est que les r\u00e9sultats sont bons mais avec un vide au milieu des chiffres. Cela veut dire que parfois le temps est mal detect\u00e9. Mais il semble que pour le reste du temps cela se passe plut\u00f4t bien. Ca vaut peut \u00eatre le coup de modifier la gestion des erreurs. \"Artefacts de detection de sobel\" En fait le soucis avec ces artefacts c'est que parfois le temps au tour n'est tout simplement pas detect\u00e9. Dans l'exemple ci dessus, la reconnaissance de caract\u00e8res ne trouve tout simplement rien. Il faut donc que je trouve un moyen de corriger ces soucis. Il semblerait que en appliquant un tresholding un peu plus s\u00e9v\u00e8re en amont on arrive \u00e0 r\u00e9duire les artefacts \"Artefacts all\u00e8g\u00e9s\" ; Je crois qu'il faut faire attention avec les 'Bitmap.save' quand on utilise de l'asynchrone. le GDI+ aime pas des masses. Lundi 22 Mai 2023 BON ! Il ne reste plus beaucoup de temps ! Selon le planning cette semaine est la derni\u00e8re semaine de programmation. Il va donc falloir CHARBONNER !! Il ne me reste plus que une t\u00e2che \u00e0 vraiment faire (\u00e0 part les tests mais euuuu voila bon). J'essaie d'impl\u00e9menter un peu plus d'error handling mais c'est pas facile... Il y a tellement de choses qui peuvent mal tourner c'est infernal. Une chose qui serait bien serait de rajouter des points d'attente variables dans le code de l'emulateur un peu partout pour eviter de se retrouver bloqu\u00e9 \u00e0 chaque fois. L'int\u00e9r\u00eat serait que des gens avec une moins bonne connexion pourraient quand m\u00eame profiter du programme sans qu'il crashe 300 fois. Ce qui est frustrant c'est que va savoir pourquoi, maintenant, on arrive quasi jamais a avoir la page data... Genre sans deconner c'est une fois sur 5 que l'emulateur nous ressort la page Data et pas juste le feed. C'est absolument infernal. Je ne comprends pas pourquoi en plus. L'emulateur arrive bien \u00e0 cliquer sur le bon bouton mais m\u00eame comme ca ca ne veut pas. CA NA AUCUN SENS BORDEL. Sur une image Jjai de supers resultats pour les temps au tour mais d\u00e8s que l'image change PAF plus aucun temps n'est detect\u00e9. Ah non c'est bon c'est juste que VA SAVOIR POURQUOI les images sont en putain de resolution DEGEULASSE. Je ne comprends pas pourquoi ce matin particuli\u00e8rement le projet marche si mal. Par ce que d\u00e8s que l'image revient \u00e0 une r\u00e9solution normale c'est bon. Un autre soucis que j'ai est que je n'arrive pas \u00e0 paralleliser l'OCR ce qui fait que elle peut prendre parfois plus de 15 secondes. Et le probl\u00e8me avec ca c'est que la detection de tours et de pitstop est grandement impact\u00e9e si on a pas assez de data assez souvent. Je vais me focus sur le reste en attendant mais d\u00e8s que M.Bonvin apparait dans les parages je vais devoir l'alpaguer. J'ai ajout\u00e9 la possibilit\u00e9 d'essayer plusieurs fois de trouver le bouton fullscreen et de cliquer dessus plut\u00f4t que d'attendre dix secondes comme un con et esp\u00e8rer que ca fonctionne. Mais si apr\u00e8s 15 secondes d'essais il n'y arrive pas cela fait quand m\u00eame p\u00eater une erreur. Je pense que je vais m'occuper de la page de configuration maintenant. Voici \u00e0 quoi ressemblait la page de settings ce matin quand je suis arriv\u00e9. \"Ancienne page de settings\" Comme je pense que l'UI de cette page ne va pas vraiment changer d'ici la fin du projet je peux me permettre de lui faire une petite beaut\u00e9 car apr\u00e8s je ne pense pas y retoucher. Pour ca j'ai plusieurs \u00e9tapes comme choisir une palette de couleur, retirer l'inutile et choisir judicieusement le placement des items sur la form pour que cela soit le plus intuitif possible. J'y pense, il fuadrait peut-\u00eatre que je me trouve un logo ca pourrait rendre bien. Voila alors j'ai chang\u00e9 un tout petit peu ce \u00e0 quoi ressemble la page de settings et j'ai ajout\u00e9 du responsive pour que le user puisse mettre l'application en plein \u00e9cran. \"Nouvelle page de configuration\" Mais il manque un peu de couleurs et de d\u00e9tails pour que cela rende vraiment bien. Et apr\u00e8s quelques tentatives on se retrouve avec une page plut\u00f4t sympa je trouve : \"Nouvelle page de config\" Et elle est responsive : \"Nouvelle page de config en plein \u00e9cran\" Et j'ai fait quelques changements pour ce qui est des zones qui s'affichent pour qu'on les voie mieux. \"Nouvelle page de config en action\" Je trouve que franchement ca rend pas mal. Le reste de l'app sera dans ce style. J'ai mis pas mal de temps \u00e0 cr\u00e9er cette page, mais je pense que c'est important que la page de config soit propre. Et en plus tout le temps que j'ai pass\u00e9 ici n'est pas perdu car ensuite j'aurai simplement \u00e0 suivre les m\u00eames directives de style pour le reste de l'UI. Il faut aussi savoir que Windows Form n'est ps forc\u00e9ment le meilleur outil pour travailler avec le design. Truc tout b\u00eate par exemple qui m'a fait perdre 30 minutes. Il est impossible de retirer les bordures des objets \"GroupBox\". Ce que j'ai donc du faire ca a \u00e9t\u00e9 de dessiner un rectangle autour de la couleur du background pour que l'on ne voit plus les bordures et ensuite j'ai du redessiner le texte pour qu'il puisse s'afficher quand m\u00eame. C'est pleins de petites choses comme ca qui sont plut\u00f4t p\u00e9nibles et qui font perdre du temps mais je pense que c'est rentable de s'y attarder. Maintenant ce que je vais faire aujourd'hui et demain c'est l'affichage general de l'app. Je pense que je vais commencer par mettre des placeholder de l'app finale comme ca je saurai quoi implementer comme methodes de r\u00e9cup\u00e8ration demain. J'aimerais quand m\u00eame faire une interface sympa m\u00eame si les data sont pas parfaites. Par ce que je me dis que au pire si je montre une interface qui donne des infos inexacte mais qui a la bonne logique c'est toujours mieux que de ne pas montrer ce que ca pourrait faire avec des donn\u00e9es un peu plus int\u00e8gres. Autre point \u00e0 noter, je me suis rendu compte que ca pourrait \u00eatre potentiellement pas mal de trouver un moyen rapide de lancer l'appli avec un Grand Prix. Genre permettre de selectionner le preset et l'URL du Grand Prix sans avoir \u00e0 passer par la page de configuration. Je me suis rendu compte que c'\u00e9tait super chiant de devoir \u00e0 chaque fois le faire (m\u00eame si je me rends compte que normalement un user ne devrait pas lancer l'app autant) Voila ue premi\u00e8re version de l'App avec tous les placeholders : \"Premi\u00e8re version de la page principale\" Et c'est tout pour aujourd'hui ! Ce fut une journ\u00e9e remplie. Mardi 23 Mai 2023 Aujourd'hui le but c'est de remplir le framework de hier avec les bonnes Data. Je ne sais pas si je peux tout finir en un jour mais on va essayer. Bon j'ai eu une discussion anim\u00e9e avec M.Bonvin et il semble que je sois oblig\u00e9 de refaire \u00e0 peu pr\u00e8s tout mon code pour le rendre ne serait-ce qu'un peu optimis\u00e9. Bon au final j'ai perdu 6H de travail \u00e0 tenter de convertir mon code dans une version un peu plus optimis\u00e9e... Mais je me rend compte que c'est juste impossible... Il me faudrait au moins plusieurs jours pour faire correctement ce refactor et donc je vais tout simplement faire un git restore... C'est extr\u00eament frustrant mais bon... Pas le choix il semble. J'ai du \u00e9crire au moins 600 lignes de code et tout pars en fum\u00e9e. C'est une d\u00e9bauche d'\u00e9nergie absolument ph\u00e9nomenale. Apr\u00e8s ca valait le coup de tenter je pense. (J'ai envie de mourir) EN FAIT C'EST BON !! Il fallait juste que je croie en mon code original !!! J'ai r\u00e9ussi \u00e0 paralelliser mon ancien code. Il ne manquait presque rien mais M.Bonvin voulait absolument que je change le reste. Maintenant j'ai une detection qui se fait en quelques secondes c'est genial. Mercredi 24 Mai 2023 Alors hier je n'ai pas bien eu le temps d'expliquer ce que voulait que M.Bonvin. En fait mon programme actuellement utilise un d\u00e9coupage qui peut par\u00e2itre complexe. Et de par sa nature, il pensait qu'il \u00e9tait simplement impossible de paralelliser le traitement car trop complexe et trop couteux. Il voulait donc que je passe sur un traitement plus simple. L'id\u00e9e \u00e9tait que on s'occupe dabord de faire une liste de toutes les Windows et de les traiter toutes \u00e0 la fois pour \u00e9viter que les boucles soient trop complexes. Sauf que pour impl\u00e9menter un truc pareil c'est \u00e9norm\u00e9ment de code car cela va \u00e0 l'encontre totale de la facon dont mon projet fonctionne actuellement. Mais comme j'\u00e9tais ouvert \u00e0 d'autres solutions. J'ai pass\u00e9 six heures \u00e0 tenter de l'impl\u00e9menter. Il en aurait fallu au minimum deux jours soyons clair. Et en fait on s'est retrouv\u00e9s devant pleins de probl\u00e8mes qui ne se posent pas dans mon architecture originale. Par exemple. On a pas trouv\u00e9 de methode simple pour d\u00e9couper les images des fen\u00eatres de mani\u00e8re thread safe. Il aurait donc fallu ajouter des boucles en pr\u00e9alable pour tout d\u00e9couper et le faire de mani\u00e8re s\u00e9quencielle. Ensuite vient le probl\u00e8me que si on traite toutes les donn\u00e9es dans des boucless paralelle on perds leur position originale donc il faut faire une classe pour stocker les r\u00e9sultats temporaires. Il y a aussi le soucis que les Windows ont certe une position mais elle est relative au parent et \u00e0 l'image parente. Donc il faudra faire un syst\u00e8me qui convertis les windows en position absolue sur l'image. Ca peut para\u00eetre \u00eatre de simples changements mais deja il y en a pas mal d'autres et franchement m\u00eame si l'id\u00e9e originale aurait pu simplifier les choses. Les sacrifices que l'on doit faire pour la faire marcher sont juste trop moches et \u00e0 mon avis ne sont pas du tout aussi logiques que mon d\u00e9coupage original. Cette exp\u00e9rience m'a quand m\u00eame permis de me rendre compte des endroits dans mon code qui sont plus ou moins difficile \u00e0 maintenir et cela m'a fait me rendre compte que ma solution n'\u00e9tait pas forc\u00e9ment la plus simple pour tout le monde mais que mine de rien elle peut \u00eatre efficace. La je suis en train de rajouter les routes pour la vue. Je me suis dit que ca serait une bonne id\u00e9e de permettre aux users de cliquer sur un pilote pour avoir ses infos. Mais je me suis dit que ce qui serait encore plus cool serait de pouvoir cliquer sur un des temps au tour d'un pilote et qu'une petite fen\u00eatre s'ouvre pour indiquer les temps par secteurs. Mais en faisant ca je me rends compte qu'il y a quelques soucis dans la facon que je conserve les infos dans la DB et je peux voir directement quand la reconnaissance a du mal avec certains pilotes ou des positions. Ca arrive plus souvent que ce que je voudrais que un pilote soit mal detect\u00e9. Mais ce qui est dr\u00f4le c'est que c'est parfois sur une deux voire trois reconnaissance que le pilote n'est plus reconnu mais ensuite tout va bien. Il faut que je travaille un peu plus sur le filtrage de ces donn\u00e9es limites et peut-\u00eatre de voir si la reconnaissance de la position pourrait \u00eatre un peu v\u00e9rifi\u00e9e. Bon pour \u00eatre honn\u00eate je ne pense pas que le code qui concerne l'affichage soit le meilleur code que j'aie pu produire dans ma vie de d\u00e9veloppeur mais en m\u00eame temps je n'ai pas forc\u00e9ment le temps de le rendre magnifique. La le but est simplement que tout marche. (Et c'est un peu la m\u00eame phylosophie dans tout le reste du projet lol) Demain il me reste pas mal de choses \u00e0 faire et c'est la derni\u00e8re journ\u00e9e ou je peux les faire. Rendre la form plus jolie et changer les couleurs Rendre la form Responsive Ajouter les bons messages d'erreur qui vont bien Modifier les messageBox d'erreur pour qu'elles soient plus agr\u00e9ables \u00e0 utiliser Clean un peu le code mod\u00e8le vue controller Si j'ai le temps ajouter les bons commentaires les bonnes ent\u00eates partout Jeudi 25 Mai 2023 Bon bah le but aujourd'hui c'est de finaliser un peu le projet car la semaine prochaine c'est doc. Pas grand chose \u00e0 dire. J'ai pass\u00e9 la journ\u00e9e \u00e0 fix des petits bugs par ci par la. Voici des exemples de ce \u00e0 quoi ressemble l'app \u00e0 la fin de la journ\u00e9e : \"Screenshot de la page principale\" \"Screenshot de la page principale\" On se rend jamais compte mais c'est tellement long de r\u00e8gler chaque petit soucis un par un. Il y a tellement de possibilit\u00e9s de choses qui peuvent mal tourner ou qui ont un comportement diff\u00e9rent selon l'ordre dans lequel on fait les choses. Mais dans l'ensemble, m\u00eame si on est pas sur la meilleure interface que l'on aie vu dans l'histoire. Je trouve que elle fait quand m\u00eame le taff. Vendredi 26 Mai 2023 Aujourd'hui c'est d\u00e9part pour Monaco mais comme l'avion etait bien en retard j'ai pu avancer sur le nettoyage du code. Grand Prix de Monaco [Insert photos] Lundi 29 Mai 2023 Mon vol pour Geneve hier soit a \u00e9t\u00e9 annul\u00e9 et je dois donc prendre une deviation car tous les vols pour Geneve sont pleins. Je dois partir a 7h30 pour prende l'avion de 9H pour Nantes et de la bas je dois prendre un avion \u00e0 17h pour arriver \u00e0 18h30 \u00e0 l'a\u00e9roport de Geneve. C'est pas pratique car j'avais pr\u00e9vu d'avancer aujourd'hui et je suis oblig\u00e9 d'avancer comme je peux dans l'a\u00e9roport. J'avance encore sur le nettoyage rapide du code. Le but est que demain je puisse sortir la premi\u00e8re release en Beta et que je mette vraiment serieusement \u00e0 la Documentation. M.Jayr m'a \u00e9galement demand\u00e9 de lui donner le document d'\u00e9valuation interm\u00e9diaire. Il ne faut pas que j'oublie demain. J'ai mis des notes sur mon code au cas ou des gens viennent \u00e0 le lire. J'y d\u00e9cris les choses que j'aurais fait diff\u00e9remment ou qui pourraient para\u00eetre bizarre au tout venant. Mardi 30 Mai 2023 Bon aujourd'hui je dois encore avancer sur la partie nettoyage de code et avant de sortir la premi\u00e8re release Beta je vais tenter d'installer le projet sur un autre pc pour voir ce que je n'ai pas mentionn\u00e9 dans mon ReadMe. Bon j'ai pu rendre \u00e0 M.Jayr mon evaluation interm\u00e9diaire et j'ai fait les derni\u00e8res modifications sur le projet pour que je puisse sortir une release correcte. Maintenant je vais me mettre \u00e0 la documentation. Il va falloir que je revoie ce que j'ai d\u00e9ja \u00e9crit en ce qui concerne l'OCR car j'ai fait des modifications depuis et j'ai ajout\u00e9 la methode de SOBEL. Il faut peut-\u00eatre aussi que je parle vite fait dans la partie Emulation que j'ai du changer les variables d'environnement pour faire fonctionner le syst\u00e8me en 4K. Mercredi 31 Mai 2023 Doc Jeudi 1 Juin 2023 Bon je me suis rendu compte que je n'avais fait vraiment aucuns tests et que c'est franchement bof. Je pense que ce que je devrais faire pour faire des tests unitaires c'est prendre des exemples de chaque type de windows possibles en plusieurs exemplaires. Ensuite je note le r\u00e9sultat que j'attends et je regarde si ca me retourne la bonne valeur. Mais ca veut dire que ca va me prendre pas mal de temps de tout mettre en place mais ca m'aurait s\u00fbrement fait gagner beaucoup de temps si je l'avais fait d\u00e8s le d\u00e9but... Je pense que une bonne id\u00e9e serait de prendre trois Grand Prix et de prendre une photo de chaque type de window au d\u00e9but et \u00e0 la fin. Plus je regarde plus je me rend compte que ce pojet aurait carr\u00e9ment du \u00eatre en TDD (Test Driven Developement) par ce que ca m'aurait fait gagner un temps FOU. OK JE SUIS DEBILE POURQUOI J'AI PAS FAIT CA PLUS T\u00d4T ??? En fait ce que j'aurais du faire c'est prendre de gros \u00e9chantillons de toutes les types de windows et j'aurais un parfait framework pour savoir si j'ai am\u00e9lior\u00e9 mon OCR ou non. Voici les exemples que je vais utiliser pour verifier le bon fonctionnement de l'OCR : \"Dataset Ecarts\" ; \"Dataset Tours\" ; \"Dataset Noms\" ; \"Dataset Positions\" ; \"Dataset Sectors\" ; \"Dataset Tyres\" ; Je pense que c'est un set assez correct car j'ai essay\u00e9 de prendre un peu tous les cas possibles. Le seul qui m'inqui\u00e8te un peu c'est celui des pneus mais bon. C'est aussi celui qui m'inqui\u00e8te le plus en temps normal. Non mais c'est juste g\u00e9nial les tests en fait... j'avais pas vu que parfois ma detection de GAP TO LEADER comprenait le \"+1:34.567\" en \"61:34.567\" car le '+' \u00e9tait interpr\u00eat\u00e9 comme un 6. Sans les tests je ne m'en serais pas rendu compte. Ce qui est g\u00e9nial c'est que ca veut dire que si je veux am\u00e9liorer mon OCR j'ai juste \u00e0 mettre plus d'exemples dans le dossier de tests et de run les tests et voir ou il a des soucis. C'est un peu tard mais ca m'aurait fait gagner TELLEMENT de temps c'est absolument ridicule. Vendredi 2 Juin 2023 Aujourd'hui c'est de nouveau doc. Mais la je pense qu'il faut que je rajoute une rubrique \"Fonctionnement g\u00e9n\u00e9ral\" qui r\u00e9sume tr\u00e8s simplement toutes les \u00e9tapes du projet avec un bon diagramme. En fait c'est beaucoup plus dur que ce que je pensais de faire un bon diagramme qui explique tout sans \u00eatre illisible. J'ai mis une heure trente \u00e0 faire celui la : \"Diagramme fonctionnement g\u00e9n\u00e9ral\" J'ai pris pas mal de temps aussi \u00e0 faire ces trois autre diagrammes un peu plus graphiques qui montrent de mani\u00e8re un poil plus abstraite le fonctionnement des trois grosses parties du projet. \"Diagramme recup\u00e9ration d'images\" \"Diagramme OCR\" \"Diagramme Traitement\" Je pense qu'ils sont un peu plus faciles \u00e0 comprendre que le gros diagramme g\u00e9n\u00e9ral. Ce que je me dis c'est que je vais faire une section fonctionnement g\u00e9n\u00e9ral ou je vais expliquer les trois parties avec les petits diagramme et r\u00e9sumer avec le grand diagramme. Lundi 5 Juin 2023 Ce weekend j'ai voulu essayer le projet pour le Grand Prix de Barcelone qui s'est sold\u00e9 en un \u00e9chec cuisant... J'ai eu trois soucis pour l'utilisation du programme. Les voici dans l'ordre croissant d'importance et de difficult\u00e9 \u00e0 r\u00e8gler : Mon Laptop est incapable de rester plus d'une heure allum\u00e9 m\u00eame compl\u00eatement charg\u00e9 \u00e0 100% Le WIFI de chez moi a du mal \u00e0 g\u00e8rer plusieurs flux 1080p en m\u00eame temps et donc le temps de chargement est trop long ce qui me fait des erreurs 105 \"Ce que voyait le programme pendant les erreurs 105 ce dimanche\" Le fait que quand un flux est en live, quand on clique dessus, un nouveau bouton appar\u00e2it qui n'\u00e9tait pas pr\u00e9vu et qui nous propose de regarder depuis le d\u00e9but ou en live. Le soucis avec ce bouton c'est qu'il n'est pr\u00e9sent que pour les sessions live... Il va donc falloir attendre le prochain GP (Canada 18 Juin) pour faire un test en conditions r\u00e9elles. \"Ce que voyait le programme avant que j'essaie d'impl\u00e9menter le click auto\" J'ai essay\u00e9 de r\u00e8gler le probl\u00e8me en Live, le soucis c'est que j'ai un commentaire \u00e0 fournir pendant la course et donc je n'ai pas eu le temps de plus me pencher sur le cas. Le weekend du prochain Grand Prix je vais essayer de tester sur les sc\u00e9ances d'essais libres.le click du bouton et j'amenerai mon cable chez moi. Bon sinon aujourd'hui, comme d'hab, Doc... Je vais faire le manuel utilisateur.","title":"Journal de bord"},{"location":"jdb.html#journal-de-bord","text":"","title":"Journal de bord"},{"location":"jdb.html#mercredi-29-mars-2023","text":"Premier jour du travail de dipl\u00f4me. Nous avons eu un briefing de mr Garcia et nous avons pu commencer \u00e0 pr\u00e9parer le travail. Nous avons eu les diff\u00e9rents fichiers nescessaires \u00e0 la bonne r\u00e9alisation du projet et je me suis mis \u00e0 faire les fichiers nescessaires La premi\u00e8re chose a \u00e9t\u00e9 de faire ce mkdocs dans lequel j'ai mis un fichier yml plut\u00f4t standart qui risque de changer au fur et \u00e0 mesure. Voici le premier yml : site_name: Documentation Diplome theme: name: material palette: # Palette toggle for light mode - media: \"(prefers-color-scheme: light)\" scheme: default toggle: icon: material/brightness-7 name: Switch to dark mode # Palette toggle for dark mode - media: \"(prefers-color-scheme: dark)\" scheme: slate toggle: icon: material/brightness-4 name: Switch to light mode markdown_extensions: - attr_list - md_in_html plugins: - glightbox - with-pdf Voici un example de \u00e0 quoi ca ressemble en forme de site \"Exemple mkdocs\" Ensuite il m'a fallu faire une version plus \u00e0 jour de mon cahier des charges car je n'y avait pas touch\u00e9 depuis novembre. J'ai envoy\u00e9 un mail \u00e0 mes enseignants pour qu'ils puissent y jeter un oeuil pour \u00eatre s\u00fbr que je n'ai rien chang\u00e9 qui les d\u00e9rangent. Monsieur Jayr m'a demad\u00e9 \u00e0 l'occasion de lui faire un planning type Gantt alors je me suis mis \u00e0 la t\u00e2che. J'ai fait un planning pr\u00e9visionnel et une l\u00e9gende les deux sont dispo dans le dossier planning de ce repertoire. Ensuite je me suis mis \u00e0 tout mettre sur git. A commencer par ce repertoire Et c'est deja la fin de la journ\u00e9e ! Demain j'avance un peu sur la doc avec ce que je peux d\u00e9ja remplir et je finis de pr\u00e9parer ce dont j'ai besoin pour commencer \u00e0 coder.","title":"Mercredi 29 Mars 2023"},{"location":"jdb.html#jeudi-30-mars-2023","text":"Aujourd'hui selon le planning je dois me charger des dernirers pr\u00e9paratifs pour commencer correctement. J'ai fait expr\u00e8s de prenre du temps pour ca au d\u00e9but pour ne pas me cr\u00e9er de soucis plus loin pendant le travail. Je vais envoyer par mail le planning que j'ai fait \u00e0 mes suiveurs. Ensuite je vais m'attaquer au squelette de la docmentation. Je vais essayer de remplir tout ce que je peux remplir dans un premier temps car cela tout ca de fait pour plus tard quitte \u00e0 modifier quelques aspects au fur et \u00e0 mesure. J'ai aussi d\u00e9sactiv\u00e9 mkdocs with pdf par ce que les r\u00e9sultats ne sont vraiment pas ceux que j'attends et cela ralentis \u00e9norm\u00e9ment le d\u00e9ploiment. J'ai aussi rassembl\u00e9 mes croquis pour le poster : \"Croquis Poster 1\" \"Croquis Poster 2\" On peut voir que dans un premier temps j'ai tent\u00e9 de faire un poster un peu plus stylis\u00e9 et marketing. Cependant apr\u00e8s avoir discut\u00e9 avec Mr Garcia et diff\u00e9rents profs dont un de l'HEPIA et ils m'ont indiqu\u00e9 que ce qui \u00e9tait attendu \u00e9tait moins du marketing qu'un diagramme de fonctionnement. On peut voir sur les derniers posters que le cot\u00e9 technique ressort de plus en plus. Le but sera de faire une version encore plus technique ou on peut voir les diff\u00e9rents fonctionnements de l'application avec les technologies utilis\u00e9es. Le d\u00e9fi cela va \u00eatre de faire un joli poster qui soit en m\u00eame temps vendeur et en m\u00eame temps rempli techniquement. Oh et j'ai eu un probl\u00e8me ou mon calvier et ma souris ne voulaient d'un coup plus fonctionner. Dans mon cas c'\u00e9tait un probl\u00e8me de power management des ports. J'ai eu le soucis sur mon pc fixe \u00e0 la maison et sur mon pc portable \u00e9galement. En gros de ce que j'ai compris le soucis c'est que le pc croit que un port est trop solicit\u00e9 niveau puissance et du coup d\u00e9cide de couper l'alimentation du port USB. J'ai pu r\u00e8gler le soucis en allant dans le device manager sous universal bus controller sous power management et en d\u00e9cochant la case qui indique que windows peut d\u00e9sactiver ce port. Je ne conseille pas ce fix si vous avez des composants de mauvaise qualit\u00e9 car cela pourrait \u00eatre une vraie alerte cependant le fait que mes composants sont plut\u00f4t haut de gamme et le fait que mon clavier et ma souris le fassent en m\u00eame temps et que ils fonctionnaient tr\u00e8s bien depuis plus de 4 ans me font penser que c'est juste une nouvelle mise a jour de windows qui est p\u00e9nible. Demain je vais pouvoir commencer \u00e0 coder pour de bon.","title":"Jeudi 30 Mars 2023"},{"location":"jdb.html#vendredi-31032023","text":"Aujourd'hui on s'occupe de la PT2 qui est la programmation de la r\u00e9cup\u00e8ration des informations des images. Je vais tester IronOcr Source : https://www.c-sharpcorner.com/article/ocr-using-tesseract-in-C-Sharp/ Doc : https://ironsoftware.com/csharp/ocr/docs/ Examples : https://ironsoftware.com/csharp/ocr/examples/simple-csharp-ocr-tesseract/ Avant d'utiliser la librairie je me demande si je dois utiliser un peu de post processing pour aider \u00e0 la reconnaissance. Je peux soit utiliser l'image crop\u00e9e directement : \"Image non trait\u00e9e\" Soit avec un filtre pour passer en noir et blanc laxiste \"Image trait\u00e9e laxiste\" Soit avec un filtre pour passer en noir et blanc stricte \"Image trait\u00e9e stricte\" Il va falloir faire des tests avec tous les noms et les chiffres pour trouver le plus efficace. Bon malheureusment Iron OCR semblait \u00eatre une bonne alternative mais c'est une librairie priv\u00e9e qui demande une license pour \u00eatre utilis\u00e9e. Il va falloir trouver autre chose. En utilisant la librairie \"Tesseract\" qui existe on peut faire de la reconnaissance de texte avec un code plut\u00f4t simple : TesseractEngine engine = new TesseractEngine ( tessDataFolder . FullName , \"eng\" , EngineMode . Default ); var tessImage = Pix . LoadFromMemory ( ImageToByte ( sample )); Page page = engine . Process ( tessImage ); string text = page . GetText (); Voici la methode ImageToByte : https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-array public static byte [] ImageToByte ( Image img ) { using ( var stream = new MemoryStream ()) { img . Save ( stream , System . Drawing . Imaging . ImageFormat . Png ); return stream . ToArray (); } } Voici le code pour traiter plusieurs textes sur une seule image : Page page = engine . Process ( tessImage ); // Get the iterator for the page layout using ( var iter = page . GetIterator ()) { // Loop over the elements of the page layout iter . Begin (); do { // Declare a Rect variable to hold the bounding box Rect boundingBox ; // Get the bounding box for the current element if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { g . DrawRectangle ( Pens . Red , new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } // Get the text for the current element var text = iter . GetText ( PageIteratorLevel . Word ); tbxResult . Text += text . ToUpper () + Environment . NewLine ; } while ( iter . Next ( PageIteratorLevel . Word )); } Etonnament, avec plus de texte, des noms qui \u00e9taient autrefois mal reconnus sont parfaitement interpr\u00eat\u00e9s. Par exemple voici un exemple de reconnaisance de texte sur tous les pilotes : \"Screenshot de reconnaisance d'image complete\" On voit que le nom Leclerc est mal reconnu. Mais voici ce que cela donne quand on prend une image qui ne contient que le nom Leclerc : \"Screenshot de reconnaissance d'image crop\u00e9e\" On voit ici que le nom Leclerc est tr\u00e8s bien reconnu. Dans le premier exemple on peut voir que Tsunoda est reconnu comme \"Reticin\" ce qui n'est pas exactement pareil (lol) Et quand on isole le nom Tsunoda dans une image seule : \"Screenshot de reconnaissance de Tsunoda\" Il le lit \"RETLELYY\" ce qui n'est toujours pas exactement ca... Une meilleure r\u00e9solution pourrait peut-\u00eatre r\u00e9soudre le probl\u00e8me en partie. Jusqu'ici les images \u00e9taient en presque 720P ce qui donne ceci : \"Tsunoda en 720P\" Et j'ai lanc\u00e9 une r\u00e9cup\u00e8ration d'images en 1080p pour r\u00e9cup\u00e8rer ceci : \"Tsunoda en 1080P\" On peut voir une certaine diff\u00e9rence tout de m\u00eame. Et quand on lance la reconnaissance : \"Reconnaissance Tsunoda en 1080P\" \"Tsunoda n'est plus \u00e9crit \"RETLELYY\" mais \"TSUNDDA\" ce qui n'est pas parfait mais qui est d\u00e9ja beaucoup mieux. J'ai essay\u00e9 de mettre l'engine de Tesseract en mode \"JPN\" comme Tsunoda est un nom japonais mais sans succ\u00e8s j'ai le m\u00eame r\u00e9sultat. Comme la r\u00e9solution est meilleure je me suis dit que peut \u00eatre le filtre de passage en noir et blanc pourrait aider. J'ai \u00e9crit cette petite methode pour convertir l'image en noir et blanc : private static Bitmap ConvertToBlackAndWhite ( Bitmap inputBmp ) { const int BLACK_TO_WHITE_TRESHOLD = 200 ; Bitmap result = new Bitmap ( inputBmp . Width , inputBmp . Height ); for ( int y = 0 ; y < inputBmp . Height ; y ++) { for ( int x = 0 ; x < inputBmp . Width ; x ++) { Color pixelColor = inputBmp . GetPixel ( x , y ); if ( pixelColor . R <= BLACK_TO_WHITE_TRESHOLD && pixelColor . G <= BLACK_TO_WHITE_TRESHOLD && pixelColor . B <= BLACK_TO_WHITE_TRESHOLD ) { pixelColor = Color . FromArgb ( 0 , 0 , 0 ); } else { pixelColor = Color . FromArgb ( 255 , 255 , 255 ); } result . SetPixel ( x , y , pixelColor ); } } return result ; } Rien de bien dingue mais cela fonctionne et je peux jouer avec le BLACK_AND_WHITE_TRESHOLD pour changer son comportement. J'ai dabord test\u00e9 avec un treshold de 100 et le programme a r\u00e9ussi \u00e0 me sortir Tsunoda en deux mots ce qui \u00e9tait d\u00e9ja tr\u00e8s encourageant. Et apr\u00e8s avoir augment\u00e9 le Treshold... Tada : \"Tsunoda 1080P avec filtre\" Le programme arrive bien \u00e0 reconnaitre TSUNODA. Je pense que cette tactique ne fonctionnait pas avant car la resolution \u00e9tait trop faible et l'aliasing se m\u00ealait trop avec le texte pour \u00eatre utilisable. Cependant cette technique ne fonctionne pas sur tous les noms. Par example avec Leclerc : \"Leclerc 1080P avec filtre\" On r\u00e9cup\u00e8re \"Leeler'c\" ce qui n'est pas bon du tout. Mais en modulant le Treshold (ici \u00e0 150) On peut de nouveau voir Leclerc \u00eatre reconnu correctement \"Leclerc 1080P avec filtre 2\" Je pense que pour avoir de bons r\u00e9sultats il va falloir faire un algo qui : D\u00e9coupe l'image en autant de plus petites images pour avoir un mot par image. Teste voir si avec l'image originale un nom correspond \u00e0 la liste de pilotes existant. Si cela ne marche pas, on applique le filtre en modulant le Treshold. Dans le cas ou on aurait pas un match parfait on fait un algo qui cherche le nom le plus proche qui existe dans la liste de noms donn\u00e9s. Seulement voila, il n'y a pas que des lettres que l'on veut r\u00e9cup\u00e8rer. On veut surtout pouvoir r\u00e9cup\u00e8rer les chiffres. Pour les chiffres on va avoir des soucis \u00e9galement... Si on essaie directement la m\u00eame technique sans filtre on a des r\u00e9sultats comme celui ci : \"Tentative de reconnaisance du timing\" La virgule a tendeance \u00e0 se barrer ce qui est particuli\u00e8rement probl\u00e9matique. Cependant comme les chiffres ont beaucoup moins de possibilit\u00e9es que les lettres et qu'il n'y a pas de probl\u00e8me de langue on devrait pouvoir travailler \u00e0 faire des r\u00e8glage que l'on pourra ensuite utiliser. Avec un Treshold de 165 on arrive presque \u00e0 quelque chose d'int\u00e9ressant : \"Tentative 2 de reconnaissance du timing\" Le + n'est clairement pas compris mais ca n'est pas emb\u00eatant car c'est souvent redondant. On arrive cependant \u00e0 isoler 3 et 259. M\u00eame si la virgule n'est pas comprise cela veut dire qu'il est tout de m\u00eame possible de discriminer les secondes des milisecondes. Maintenant avec un temps au tour : \"Reconnaissance du timing au tour\" On arrive sans rien changer aux param\u00eatres \u00e0 isoler minutes secondes et milisecondes. Il semble que la reconnaissance de chiffre soit bien plus efficace que la reconnaissance de lettres. Il va falloir faire un test \u00e0 plus grande \u00e9chelle avec plus d'image pour se rendre compte de la precision. Demain ce qui serait bien cela serait que je fasse un jeu d'images avec des valeurs connues et que je fasse une batterie de tests pour voir \u00e0 quel point je peux faire confiance \u00e0 la reconnaissance des chiffres. Automatiser un syst\u00e8me de test de la sorte me sera tr\u00e8s utile dans le futur pour v\u00e9rifier la non regression de ma reconnaissance de texte quand je tenterai d'y faire des changements. Je suis toujours curieux cependant de voir comment le programme se d\u00e9brouille avec les nombres de tours qui se trouvent dans les icones de pneus.","title":"Vendredi 31/03/2023"},{"location":"jdb.html#lundi-3-avril","text":"Aujourd'hui on va faire un programme qui permet de cr\u00e9er un dataset qui permette de tester le programme de reconnaissance. Je pense que le meilleur moyen de faire serait un programme qui cr\u00e9e le dataset et qui ensuite peut tester diff\u00e9rentes methodes de reconnaissance. Par la m\u00eame occasion je peux d\u00e9velopper la technologie qui va permettre de d\u00e9couper une image en 20 lignes ce qui me servira ensuite pour la reconnaissance. Je me rend compte que pour faire un programme de tests je dois d\u00e9ja avoir une id\u00e9e de la structure de mon programme. Pour le moment je r\u00e9flechis \u00e0 un syst\u00e8me de \"Zones\" et de \"Windows\". L'id\u00e9e serait que une Zone est juste une sous partie d'image qui peut encore \u00eatre d\u00e9compos\u00e9 tandis que chaque Window contient une ou plusieurs informations \u00e0 r\u00e9cup\u00e8rer. J'ai essay\u00e9 de d\u00e9couper l'image pour que cela soit plus clair : \"Main zone\" Ici on peut voir que l'image est d\u00e9coup\u00e9e en plusieurs grandes zones. Dans un premier temps on ne s'occupe que de la premi\u00e8re. Ensuite : \"Driver zone #1\" On peut voir la que cette Main zone serait elle m\u00eame d\u00e9compos\u00e9e en plusieurs plus petites zones. Et ensuite chacunes de ces petites zones : \"Driver windows\" Sera d\u00e9compos\u00e9e en plusieurs windows qui elles sont des zones qui contiennent de l'information. En gros on aurait trois types de zone : Les zones qui contiennent d'autres zones Les zones qui contiennent des Windows Les Windows Cependant en y r\u00e9flechissant on pourrait tout \u00e0 fait avoir seulement des zones et des windows en faisant en sorte que les windows peuvent avoir une liste de windows et une liste de zones. Une zone serait compos\u00e9e de : Une image de d\u00e9part Un rectangle qui la positionne sur cette derni\u00e8re Une liste de zones (potentiellement vide) Une liste de windows (potentiellement vide) Une methode qui permet de r\u00e9cup\u00e8rer une image de la zone Une methode qui permet de lancer la reconnaissance sur chaque window Une window serait compos\u00e9e de : Une image de d\u00e9part (cela peut \u00eatre l'image crop\u00e9e de la zone parente peu importe) Un rectangle qui la positionne sur cette derni\u00e8re Une methode qui permet de r\u00e9cup\u00e9rer un image de la window Une methode qui permet de lancer la reconnaisance sur l'image (Chaque type de zone doit l'impl\u00e9menter) Dans chaque window on peut imaginer que la methode qui fait la reconnaissance au lieu de retourner un objet qui peut contenir nimporte quel type d'information peut envoyer ce qu'elle vient de r\u00e9cup\u00e8rer dans une base de donn\u00e9e ou un objet. Par exemple une Zone de pilote pourrait tr\u00e8s bien contenir un objet pilote et le donner \u00e0 ses windows qui rempliraient ce m\u00eame objet. C'est une reflexion plus stockage que OCR mais c'est int\u00e9ressant pour savoir ce que fait une window des donn\u00e9es qu'elle r\u00e9cup\u00e8re. Dans un premier temps je pense que les windows vont simplement \u00e9crire dans un fichier ce qu'elles trouvent chacunes dans le format qu'elles veulent. Pour comprendre pourquoi je me prend la t\u00eate il faut savoir que chaque window peut avoir acc\u00e8s \u00e0 pleins d'informations diff\u00e9rentes. On pourrait dire qu'elles retournent toutes une string sauf que si ca marche pour un temps au tour ou pour un nom de pilote, cela ne marche pas forc\u00e9ment pour un type de pneu ou un DRS ouver. Comme chaque window a plusieurs types de data elle devra elle m\u00eame se charger de comment la traiter ET de la stocker. Voila un diagramme qui r\u00e9sume comment je vois l'impl\u00e9mentation dans un premier temps : \"Diagramme d'explications\" Voici comment se pr\u00e9sente le squellette d'une Zone : public class Zone { private Bitmap FullImage ; private List < Zone > Zones ; private List < Window > Windows ; private Rectangle _bounds ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap ZoneImage { get { Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( FullImage , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Zone ( Image fullImage , Rectangle bounds ) { FullImage = ( Bitmap ) fullImage ; Init ( bounds ); } public Zone ( Bitmap fullImage , Rectangle bounds ) { FullImage = fullImage ; Init ( bounds ); } private void Init ( Rectangle bounds ) { Bounds = bounds ; Zones = new List < Zone >(); Windows = new List < Window >(); } public void AddZone ( Rectangle bounds ) { if ( Fits ( bounds )) Zones . Add ( new Zone ( ZoneImage , bounds )); } public void AddWindow ( Rectangle bounds ) { if ( Fits ( bounds )) Windows . Add ( new Window ( ZoneImage , bounds )); } private bool Fits ( Rectangle inputRectangle ) { if ( inputRectangle . X + inputRectangle . Width > Bounds . Width || inputRectangle . Y + inputRectangle . Height > Bounds . Height || inputRectangle . X < 0 || inputRectangle . Y < 0 ) { return false ; } else { return true ; } } } Le but est ensuite de cr\u00e9er diff\u00e9rent types de Zones. Par exemple la MainZone devra d\u00e9couper son contenu en 20 parties \u00e9gales pour tenter de chopper les 20 pilotes. Il serait cool de trouver un moyen de calibrer automatiquement. C'est peut-\u00eatre possible de calibrer avec de la reconnaissance de texte, on peut essayer de lancer la reconnaissance et voir ou on trouve du texte avec un peu de chance cela pourrait donner les positions et avec ca on peut peut-\u00eatre determiner des lignes. Et voici le squelette d'une window g\u00e9n\u00e9rique using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace OCR_tester { public class Window { private Bitmap FullImage ; private Rectangle _bounds ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap WindowImage { get { Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( FullImage , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Window ( Bitmap fullImage , Rectangle bounds ) { FullImage = fullImage ; Bounds = bounds ; } public virtual void RecoverInformations () { //Each Window type will have to implement its own way to recover the informations stored in the Window Image } } } Chaque Window pourra ainsi elle m\u00eame impl\u00e9menter la r\u00e9cup\u00e8ration d'informations. La facon de les retourner/stocker est encore un peu floue. Par exemple pour un temps au tour on peut imaginer que il fait une petite v\u00e9rification dans l'objet pilote et dans le tableau des tours si il n'y a pas deja une valeur et si il n'y en a pas une alors il peut l'ajouter. Maintenant je vais essayer de cr\u00e9er une Main window qui se calibre toute seule. Alors apr\u00e8s avoir bien gal\u00e8r\u00e9 avec l'interface pour permettre au user de cliquer sur la form pour voir les zones qu'il cr\u00e9e, j'ai pu cr\u00e9er un zone qui fait les dimensions de MainZone et j'ai pu lancer la reconnaissance sur l'image et voir ou il trouve du texte : \"MainZone avec carr\u00e9s de texte\" Maintenant il faut que je nettoie la liste de rectangle pour exclure ceux qui sont trop grands pour \u00eatre sur une seule ligne, ceux qui indiquent le nombre de tour en haut et ceux qui n'ont pas d'int\u00e9r\u00eats. On pourra ensuite isoler les lignes et cr\u00e9er une liste d'images. Pour ce qui est de la ligne qui contient les \"Gap interval last lap\" et des chiffres sur les tours pour les pneus etc je vais juste demander \u00e0 l'utilisateur de ne pas les prendre dans la screenshot. Comme ils contiennent des mots qui peuvent \u00eatre utilis\u00e9s plus loin dans les data je ne peux pas les blacklister et faire un syst\u00e8me qui s'occupe de les enlever si ils existent selon le position y me prendrait trop de temps pour rien. Apr\u00e8s avoir filtr\u00e9 un peu les resultats et enlev\u00e9 les zones beaucoup trop grandes, on se retrouve d\u00e9ja plus qu'avec ca : \"MainZone avec de meilleurs carr\u00e9s\" Comme on peut le voir, du c\u00f4t\u00e9 gauche de l'image on a beaucoup de choses reconnues mais avec beaucoup de tailles diff\u00e9rentes ce qui n'est pas id\u00e9al. Alors j'ajoute un filtre qui permet de ne selectionner que les data sur la droite. \"MainZone avec de meilleurs carr\u00e9s\" Maintenant il devrait \u00eatre possible de faire un algorythme qui ne prend que un seul carr\u00e9 par ligne. \"MainZone avec un seul carr\u00e9 par ligne\" Maintenant que on sait ou se trouve chaque ligne on peut faire un petit traitement et d\u00e9couper l'image en plusieurs windows. Et voila : \"Mainzone auto calibr\u00e9e\" Maintenant le programme peut cr\u00e9er des zones pour chaque pilote \"Images pilotes\" \"Zone d'un pilote\" Maintenant il faut que j'impl\u00e9mente un syst\u00e8me un peu similaire pour cr\u00e9er des windows. Voici la methode que j'ai cr\u00e9\u00e9 pour l'autocalibration : public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); Zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . tessDataFolder . FullName , \"eng\" , EngineMode . Default ); Image image = ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //var text = iter.GetText(PageIteratorLevel.Word).ToUpper(); //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); Zones . Add ( new Zone ( ZoneImage , windowRectangle )); } } Ca peut paraitre pas \u00e9norme comme code mais pour tout mettre en place ca demande quand m\u00eame pas mal de reflexion. J'ai du clean un peu le code que j'avais fait pour permettre la selection de zones et ajouter la possibilit\u00e9 d'ajouter des windows sur une zone. J'ai juste quelques difficult\u00e9es \u00e0 les ajouter correctement, j'ai un offset tout pourri qui se met tout le temps \"Sainz coup\u00e9\" \"Perez coup\u00e9\" Cela doit \u00eatre un soucis lors de la detection de clic qui met un offset en trop. C'est vraiment p\u00e9nible en tout cas. Certes c'est moins fun de devoir manuellement indiquer ou sont les windows sur une ligne de pilote, mais je ne vois vraiment pas comment faire cela automatiquement. Le but c'est de faire une configuration qui puisse \u00eatre sauvegard\u00e9e comme ca pas besoin d'\u00e0 chaques fois le refaire. C'est bon ! J'avais juste oubli\u00e9 de changer le calcul d'offset entre le code de la zone et de la window. Note pour plus tard, il serait peut-\u00eatre judicieux de faire quelque chose pour la vue, les windows et les Zones ont le m\u00eame exact comportement pour la vue ce qui fait dupliquer du code. Mais au moins maintenant ca fonctionne : \"Ocr tester screenshot\" Et le programme va directement cr\u00e9er un dossier par pilote avec toutes les images de chaque Data le concernant : \"Dossier Perez\" ; Et c'est tout pour aujourd'hui je pense. Ce qui serait cool demain c'est que je puisse stocker d'une mani\u00e8re ou d'une autre ces fichiers de calibration et que je puisse les transf\u00e8rer vers le programme qui va s'occuper de d\u00e9coder et commencer gentillement \u00e0 d\u00e9coder les diff\u00e9rents types de data. Note pour quand je ferai les tests. Je pense que la meilleure id\u00e9e serait que je prenne pleins de photos du style et que je les mette dans un fichier CSV ou JSON avec leur contenu. Et ensuite je le fais passer en tests pour calculer la prescision de mon algo de d\u00e9codage. Pour le moment on est plut\u00f4t dans les clouts niveau planning.","title":"Lundi 3 Avril"},{"location":"jdb.html#mardi-4-avril","text":"Aujourd'hui je suis scens\u00e9 plut\u00f4t bosser sur l'interpretation des donn\u00e9es, mais une id\u00e9e m'a taraud\u00e9 l'esprit toute la nuit. Est-ce que je ne pourrais pas quand m\u00eame essayer de d\u00e9composer la zone de pilote directment comme pour la Main zone. Pour ce faire j'ai tent\u00e9 de faire comme pour la main zone c'est \u00e0 dire lancer la reconnaissance pour savoir ou \u00e9taient tous les champs de donn\u00e9es mais malheureusement je ne pense pas que cela va \u00eatre possible. En effet non seulement ici les champs sont de tailles tr\u00e8s vari\u00e9es, mais en plus la reconnaissance n'arrive pas \u00e0 en r\u00e9cup\u00e8rer le m\u00eame nombre sur chaque ligne ce qui risque d'\u00eatre complexe \u00e0 utiliser ensuite. La preuve : \"Tentative d'auto calibration\" ; Cependant tout n'est pas perdu ! Il y a peut-\u00eatre un moyen qui serait mieux en tous points. Le soucis avec ce type de reconnaissance c'est qu'on utilise beaucoup de ressources inutiles. On peut peut-\u00eatre hard coder la valeur des diviseurs et les utiliser pour cr\u00e9er des zones. Ok alors visiblement c'est un probl\u00e8me car il semble y avoir d'autres pixels de cette couleur dans l'image (Qui l'aurait cru lol) \"Tentative 2\" J'a tent\u00e9 de r\u00e9duire la tol\u00e9rance mais le soucis c'est que c'est soit trop soit pas assez Derni\u00e8re tentative, j'ai essay\u00e9 de prendre plusieurs pixels en hauteur pour chaque incr\u00e9ment de X et en faire la moyenne, et m\u00eame comme ca, impossible de trouver de mani\u00e8re efficace les zones. Je pense que je vais donc revert tous mes changements pour revenir \u00e0 la version ou on les choisissait manuellement. Pas mal de temps perdu mais bon c'est comme ca ca arrive Bon j'ai fait un revert mais j'ai ajout\u00e9 une feature importante. Les zones font la largeur indiqu\u00e9e par l'utilisateur mais elles font la hauteur max comme ca toutes les window font la m\u00eame hauteur et ca permet \u00e0 l'utilisateur de ne pas forc\u00e9ment \u00eatre ultra pr\u00e9cis dans sa selection. Ce qui nous donne : \"Resultat final\" Maintenant je dirais que les deux prochaines choses \u00e0 faire seraient de stocker ces zones dans un fichier JSON ou autre pour que la calibration puisse \u00eatre envoy\u00e9e directement dans le logiciel de reconnaissance et ensuite de faire une calibration sur des images qui font la taille qu'on aura pendant les Grands Prix. Pour le moment elles sont au format 16:10 qui est le format d'\u00e9crant de mon laptop. Pour le stockage j'imagine un fichier qui donne des indications assez simples qui permettent de reconstruire le total des zones quand il est import\u00e9 plutot que d'\u00e9crire les coordonn\u00e9es en dur pour chacunes. Chaque Grande zone va impl\u00e9menter une methode qui s'occupe de mettre tous ses enfants dans un fichier. { \"MainZone\" :{ \"x\" : 10 , \"y\" : 20 , \"width\" : 1450 , \"height\" : 1340 , \"DriverZone\" :{ \"x\" : 0 , \"y\" : 23 , \"height\" : 25 , \"Windows\" :[ { \"DriverPositionWindow\" :{ \"x\" : 0 , \"y\" : 0 , \"width\" : 35 } }, { \"DriverPositionChangesWindow\" :{ \"x\" : 0 , \"y\" : 0 , \"width\" : 45 } } ] } } } C'est le r\u00e9sultat auquel j'aimerais arriver. Mais pour y arriver il faut encore que je cr\u00e9e les diff\u00e9rents types de window. Cela veut dire que je dois d\u00e9cider quelles informations je vais r\u00e9cup\u00e8rer de la page. Par exemple je vais conserver la position du pilote mais au final les changements de positions sont difficiles \u00e0 lire et sont redondants. Si je garde un historique des positions des pilotes je peux calculer moi m\u00eame les changements. Pareil pour gap avec la voiture devant. Je pense que je vais juste garder l'information des \u00e9carts absolus et ensuite je pourrai toujours calculer la diff\u00e9rence entre les pilotes. Ca peut para\u00eetre b\u00eate car cela rajoute du calcul mais en r\u00e9alit\u00e9 le calcul de l'OCR est extr\u00eamement gourmand alors il faut que j'\u00e9vite le plus possible d'y faire recours. Il est bien plus rapide de calculer les \u00e9carts que d'essayer de reconnaitre le texte et le convertir en chiffre. J'ai visiblement ajout\u00e9 un bug dans mon code. Maintenant tous les pilotes ont la m\u00eame image quand on les selectionne. Mais visiblement ca n'\u00e9tait pas le cas avant car j'avais pu prendres des images de chaque pilote. J'ai pass\u00e9 3 minutes \u00e0 fixer un bug stupide j'ai un peu envie de br\u00fbler ma place de travail... Mais bon au moins maintenant cela fonctionne ! Toutes les images sont r\u00e9cup\u00e8r\u00e9es et ont un format correct avec le bon nom : \"Verstappen folder\" Avec un peu de code tr\u00e8s moche j'ai pu cr\u00e9er un fichier JSON qui contient les diff\u00e9rentes infos. Cependant en exportant TOUT on se retrouve avec un fichier de 1200 lignes ce qui n'est pas optimal. Mais quand on regarde, il devrait \u00eatre possible de faire un fichier qui ne contient que les infos d'un seul pilote car ensuite il y a simplement un offset \u00e0 appliquer sur la zone et les windows. Je vais donc pouvoir commencer enfin le logiciel de d\u00e9codage qui prend en entr\u00e9e un fichier JSON comme celui ci qui a \u00e9t\u00e9 g\u00e9n\u00e8r\u00e9 avec le programme de calibration. { \"Main\" : { \"x\" : 40 , \"y\" : 230 , \"width\" : 1845 , \"height\" : 719 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : 3 , \"width\" : 1845 , \"height\" : 35 , \"Windows\" : [ { \"Position\" : { \"x\" : 2 , \"y\" : 0 , \"width\" : 32 }, \"GapToLeader\" : { \"x\" : 204 , \"y\" : 0 , \"width\" : 96 }, \"LapTime\" : { \"x\" : 413 , \"y\" : 0 , \"width\" : 105 }, \"Drs\" : { \"x\" : 526 , \"y\" : 0 , \"width\" : 81 }, e t c... } ] } } ] } } Dans le futur il faudrait ajouter d'autres choses comme par exemple les diff\u00e9rents pilotes pr\u00e9sents sur le Grand Prix et ce genre d'infos. Quoique je vais l'ajouter d\u00e9ja maintenant et plus tard je mettrai en place la feature acessible depuis l'interface. Mais le hardcoder maintenant me permet d\u00e9ja de mieux coder l'autre c\u00f4t\u00e9. Ce programme n'est en aucun cas termin\u00e9 et je vais devoir travailler encore un peu dessus pour qu'il soit utilisable correctement mais au moins il fonctionne \u00e0 peu pr\u00e8s. Exemple du json avec les noms de pilotes: { \"Main\" : { \"x\" : 37 , \"y\" : 238 , \"width\" : 1851 , \"height\" : 713 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : -5 , \"width\" : 1851 , \"height\" : 35 } } ] }, \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , e t c... ] } Maintenant je vais m'attaquer au d\u00e9codage. Demain je dois finir le d\u00e9codage du JSON et je dois commencer \u00e0 impl\u00e9menter la reconnaissance des textes. Voire m\u00eame des pneus etc si j'y arrive.","title":"Mardi 4 Avril"},{"location":"jdb.html#mercredi-5-avril","text":"Bon la il faut vraiment que je finisse assez vite la lecture du JSON et la reconstruction des zones pour commencer la reconnaissance. J'ai pris beaucoup de temps \u00e0 faire le programme de calibration mais je pense que c'est essentiel de prendre ce temps maintenant. (BTW il faudra quand m\u00eame retourner faire une plus jolie version par ce que la ca marche mais c'est tout) Bon apr\u00e8s pas mal de boulot je pense avoir r\u00e9ussi. Dans le nouveau programme on arrive \u00e0 r\u00e9cup\u00e8rer les diff\u00e9rentes zones : \"JSON decode result\" Un conseil de notre professeur M.Bonvin a \u00e9t\u00e9 de cr\u00e9er des Releases de versions qui ne fonctionnent pas ou pas tr\u00e8s bien. J'ai donc publi\u00e9 une premi\u00e8re release de l'OCR_TEST qui fonctionne vite fait. J'ai seulement un petit soucis, comme je recr\u00e9e compl\u00eatement la structure des driver zones avec seulement la premi\u00e8re, il y a un petit d\u00e9calage car entre les zones il y avait un gap. Ce qui fait que si la premi\u00e8re zone est parfaitement centr\u00e9e : \"Centered driver\" La vingti\u00e8me ne l'est plus exactement : \"Uncentered Driver\" Pour ca j'ai essay\u00e9 de mettre un espacement arbitraire mais c'est complexe. Je vais plut\u00f4t tenter de faire une diff\u00e9rence entre la taille de la zone compl\u00eate et de la taille additionn\u00e9e de toutes les fen\u00eatre et diviser le resultat entre toutes les fen\u00eatres. Ca n'est pas parfait mais au moins maintenant les donn\u00e9es ne touchent plus les bords de la fen\u00eatre. Et voila ! Maintenant avec le fichier de configuration en Json on arrive \u00e0 r\u00e9cup\u00e8rer toutes les infos comme si elles avaient \u00e9t\u00e9 envoy\u00e9es directement depuis l'app de calibration mais sans le processing time ! \"Verstappen folder 2 On peut donc ENFIN passer au d\u00e9codage de ces FICHUES donn\u00e9es. Je vais pouvoir impl\u00e9menter ce que j'ai fait dans le projet de test de d\u00e9codage. Gr\u00e2ce \u00e0 mon d\u00e9coupage initial qui m'a pris du temps \u00e0 impl\u00e9menter on a enfin un truc qui marche m\u00eame si je n'ai impl\u00e9ment\u00e9 que la reconnaissance de noms. \"Image reconnaissance propre\" Si on se rappelle du syst\u00e8me de window et de zones dans le diagramme plus haut, c'est assez facile de comprendre comment je m'y suis pris. En gros on des listes et des listes de listes de zones, c'est la partie un peu plus technique car il y a des zones qui peuvent contenir d'autres zones etc. Je vais commencer par la reconnaissance de noms. Voici le tableau de pilotes de 2023 \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , \"Hamilton\" , \"Alonso\" , \"Russel\" , \"Gasly\" , \"Stroll\" , \"Sainz\" , \"Hulkenberg\" , \"Norris\" , \"Tsunoda\" , \"Piastri\" , \"Zhou\" , \"Ocon\" , \"Magnussen\" , \"Perez\" , \"Sargeant\" , \"De Vries\" , \"Bottas\" , \"Albon\" ] ET voici le tableau de pilotes de 2022 : \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , \"Sainz\" , \"Perez\" , \"Hamilton\" , \"Russel\" , \"Magnussen\" , \"Gasly\" , \"Ocon\" , \"Alonso\" , \"Tsunoda\" , \"Bottas\" , \"Zhou\" , \"Albon\" , \"Stroll\" , \"Schumacher\" , \"Hulkenberg\" , \"Norris\" , \"Latifi\" , \"Ricciardo\" ] Je les notes ici car J'ai souvent besoin de changer selon le dataset que j'utilise. Dans le futur je ferai s\u00fbrement un grand dataset qui prend des pilotes de reserves et des pilotes juniors pour que dans le cas ou un pilote est remplac\u00e9 dans l'ann\u00e9e il n'y a pas besoin de tout recalibrer avec l'application. Apr\u00e8s une discussion avec M.Bonvin j'ai d\u00e9cid\u00e9 de tester 3 valeurs de convertion en noir et blanc et si je ne trouve pas un match exact je prend le nom le plus proche. Pour trouver la string la plus proche je pense que je vais utiliser quelque chose qui s'appelle la technique de Levenshtein. De ce que j'ai compris c'est un algorythme qui permet de donner une metric de diff\u00e9rence entre deux strings. Bon et \u00e9videmment il ne faut pas se tromper dans la liste des pilotes GENRE NE PAS OUBLIER QUE GEORGE RUSSELL COMPORTE DEUX WFNEWIEWV DE \"L\" A LA FIN DE SON NOM CE QUI POURRAIT ENGRANGER 2H DE DEBUGGING POUR RIEN ASK ME HOW I KNOW joker laugh J'ai vraiment un soucis avec Tsunoda, Il a trop tendeance \u00e0 le confondre avec \"TSUNDDA\" et pour des raisons obscures, quand j'applique l'algorythme de Levenshtein le plus proche n'est pas \"Tsunoda\" mais \"Sainz\" iniuvbwdiucbiubisc POURQUOI !!??!! Je pense que cela demande moins de changements de lettres enfin bon c'est quand m\u00eame pas id\u00e9al. Il va falloir que je trouve un moyen de le repond\u00e9rer. C'est dommage par ce que cela marche super avec Alonso Verstappen et Albon. J'ai un peu modifi\u00e9 la methode et j'ai fait en sorte d'envoyer tous les noms en majuscules en me disant que cela pourrait r\u00e9duire le nombre de changements. Et ca a march\u00e9 !! Cela va s\u00fbrement demander plus de tests pour \u00eatre bien s\u00fbr que tout fonctionne nikel, cependant pour le moment ca marche parfaitement avec les pilotes de 2022. Pour ce qui est de la reconnaissance de chiffres, j'ai d\u00e9ja fait une partie du boulot le premier jour alors je vais juste reprendre \u00e0 partir de l\u00e0. Je r\u00e9cup\u00e8re une string de ce type \"1:35.123\" le soucis c'est que les : se transforment parfois en . ou inversement mais bon ca devrait pas \u00eatre trop dur \u00e0 g\u00e8rer. Il faut que je transforme cette string en nombre de milisecondes (Du moins je pense que c'est le meilleur moyen pour ensuite pouvoir facilement comparer et stocker l'information). Cela fait que 1:35:123 en milisecondes donne : 1 * 1000 * 60 => 60'000 35 * 1000 => 35'000 123 => 123 Total : 60'000+35'000+123 => 95'123ms Et pour l'affichage : Minutes = ms / 60'000 secondes = (ms - (minutes/60'000))/1000 ms = ms - ((minutes 60'000) + (secondes * 1000)) Et on se retrouve avec 1:35:123 Maintenant apr\u00e8s un peu de temps pour nettoyer la string etc on se retrouve avec un r\u00e9sultat comme le suivant : Position : 0 Gap to leader : 0:0:0 Lap time : 2:15:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:323 Sector 2 : 0:42:340 Sector 3 : 0:0:0 Evidemment pareil pour les autres pilotes Et je me rend compte que j'ai encore tout cass\u00e9 car le laptime ne devrait pas \u00eatre 2:15 mais 1:35... Voila apr\u00e8s une heure de debugging et des ajouts pour nettoyer les chaines on se retrouve avec : Position : 0 Gap to leader : 0:0:0 Lap time : 1:35:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:323 Sector 2 : 0:42:340 Sector 3 : 0:0:0 Note: le traitement commence \u00e0 devenir long, il serait peut-\u00eatre int\u00e9ressant d'utiliser un seul Tesseract Engine ou de voir ce qui prend autant de temps, on d\u00e9passe la seconde de traitement ce qui est un peu ma limite. Apr\u00e8s on peut toujours tester de rajouter du multicore processing mais c'est pour une autre fois. Demain je m'occupe de r\u00e8gler les soucis que j'ai avec la prescision de ces temps au tour et j'\u00e9sp\u00e8re pouvoir m'occuper aussi de la position des pneus et du DRS. J'aimerais finir tout ca cette semaine.","title":"Mercredi 5 Avril"},{"location":"jdb.html#jeudi-6-avril","text":"Une id\u00e9e m'est pass\u00e9e par la t\u00eate pendant que je dormais, dans la liste des pilotes, quand ils sont \u00e0 plus d'un tour de retard avec le leader (Ce qui arrive normalement dans presque tous les Grand Prix) on a pas des minutes mais une string qui montre \"+1 Lap\" ou \"+2Laps\" ce qui est \u00e9videmment un probl\u00e8me. Je pense qu'une bonne facon d'envoyer l'info serait de retourner -1 -2etc... \u00e0 la place des milisecondes, mais encore faut-il detecter le nombre de tours Je devrais \u00eatre en train de commencer la documentation de commment tout ce que j'ai fait fonctionne. Cependant je ne me vois pas faire ca tant que je n'ai pas au moins r\u00e9cup\u00e8r\u00e9 toutes les infos au moins un peu proprement. Cela veut dire que je commence officiellement \u00e0 prendre du retard. (Sachant que si je finis tout aujourd'hui une journ\u00e9e de doc suffira largement le terme est un peu exag\u00e8r\u00e9 mais bon) Bon pour la reconnaissance des temps c'est sp\u00e9cial... Le filtre semble ne pas changer grand chose ce qui est probl\u00e9matique et ca n'est vraiment pas fiable. Voici quelques expemples avec un treshold de 100: \"11ZSD\" Cette image est comprise comme \"11ZSD\" 42340 Cette image est comprise comme \"42340\" \"ZZAEB\" Et celle ci \"ZZAEB\"... Ce qui... n'est pas bon du tout... J'ai essay\u00e9 de trouver un fichier d'entrainement sp\u00e9cifiquement fait pour les digits. J'ai essay\u00e9 de blacklister les chars non voulus pour tenter d'obliger Tesseract \u00e0 trouver des chiffres. Avec la premi\u00e8re option, les r\u00e9sultats ne sont pas meilleurs voire pires. Avec la seconde option c'est d\u00e9ja pas mal mieux mais on perd compl\u00e8tement la possibilit\u00e9 de detecter les mots comme \"LEADER\" ou \"LAP\" et de toute facon ca n'est pas parfait. Le soucis c'est que si je n'ai pas des donn\u00e9es fiables c'est juste impossible de faire des calculs et de l'affichage correct... Il faut absolument que je trouve une solution. J'ai essay\u00e9 d'utiliser de l'interpolation our augmenter la taille de l'image et ensuite appliquer mon filtre pour retirer le flou mais sans succ\u00e8s... Pourtant la on se retrouve avec des images plut\u00f4t claires : \"Clear1\" Ici le programme trouve \"44301\" \"Clear2\" Et ici \"A5151\"... On a toujours les m\u00eames probl\u00e8mes. Bon je suis all\u00e9 me renseigner sur l'OCR et je me suis dit que j'allais tenter de faire les choses proprement. Je vais faire passer plusieurs \u00e9tapes de postProcessing avant de donner l'image \u00e0 Tesseract. GrayScale Tresholding InvertColors Scaling Dilatation Ce qui donne : \"Original\" \"Grayscale\" \"InvertColors\" ; \"Resize\" ; \"Dilatation\" Ce qui ne change : Roulement de tambour RIEN kjd viuwvuirnvoirenbf Tout ca pour rien... C'EST BON !!! Bon en fait au final le probl\u00e8me \u00e9tait une mauvaise configuration de Tesseract. Je vais devoir un peu nettoyer tout ca. Mais avec les changements de l'image on a des r\u00e9sultats BEAUCOUP plus pr\u00e9cis et potentiellement utilisables. La je vais devoir faire un serieux travail de nettoyage et simplification de mon code par ce que la c'est vraiment un chantier vu le nombre de choses que j'ai du essayer. J'ai du aussi beaucoup modifier la gestion de l'image ce qui donne : \"Clean\" Et la on a des r\u00e9sultats qui sont vraiment bons. J'ai pu ajouter assez facilement la detection de position comme c'est simplement un chiffre. On se retrouve maintenant avec ce genre de retours : Position : 1 Gap to leader : 8:33:51 Lap time : 2:19:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:828 Sector 2 : 0:42:940 Sector 3 : 0:0:0 Position : 2 Gap to leader : 0:3:259 Lap time : 23:12:392 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : VERSTAPPEN Sector 1 : 0:38:119 Sector 2 : 0:0:0 Sector 3 : 0:0:0 Il ne manque plus que l'impl\u00e9mentation de la reconnaissance du DRS et des Pneus Et non... je viens de me rendre compte que mon programme a encore cass\u00e9 car le tap time ne peut pas \u00eatre 23 min lol. J'ai un nouveau magnifique probl\u00e8me... Les points et les deux points sont interpr\u00eat\u00e9s comme des chiffres ... Give me a F * * break... J'ai du mal \u00e0 comprendre pourquoi ils ne sont d\u00e9tect\u00e9s comme tels que maintenant. Bon alors il semblerait les temps au tour aie besoin d'un ordre tr\u00e8s pr\u00e9cis pour fonctionner. Grayscale InvertColors Tresholding Resize * 2 Resize * 2 Et la on a des r\u00e9sultats un peu mieux. Bon demain il faut absolument que je me charge de r\u00e8gler tous ces probl\u00e8mes et que je commence la reconnaissance des pneus et de DRS par ce que je commence \u00e0 \u00eatre en retard.","title":"Jeudi 6 Avril"},{"location":"jdb.html#vendredi-6-avril-2023","text":"Alors aujourd'hui c'est le dernier jour avant de commencer \u00e0 \u00eatre en retard pour de bon. J'ai r\u00e9ussi \u00e0 r\u00e8gler le probl\u00e8me des temps au tour, des gaps, et des secteurs. Dans le processus j'ai cass\u00e9 la detection de position mais ca devrait pas \u00eatre TROP compliqu\u00e9. Et voila ... Apr\u00e8s seulement plus de dix heures de gal\u00e8re, si on donne cette image au programme et le bon JSON le programme nous retourne : Position : 1 Gap to leader : 0:05:059 Lap time : 1:39:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:828 Sector 2 : 0:42:940 Sector 3 : 0:00:000 Position : 2 Gap to leader : 0:03:259 Lap time : 1:39:392 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : VERSTAPPEN Sector 1 : 0:31:749 Sector 2 : 0:00:000 Sector 3 : 0:00:000 Evidemment le GapToLeader est faux sur leclerc car il est leader mais bon ca je pourrai toujours Hardcoder que le premier a jamais de GapToLeader. Bon j'ai eu beaucoup de soucis que je ne vais pas mentionner ici car ce sont simplement des soucis de logique de programmation pour trouver un DRS ouvert ou non. Au final la technique que j'utilise et qui marche plut\u00f4t bien pour le DRS est que je prend la premi\u00e8re image de DRS et je la d\u00e9clare comme valeur \u00e9talon d'un DRS non actif, en effet dans 99% des cas le leader n'a pas de DRS (cela peut arriver alors il faudra donc juste verifier que les pilotes sont bien \u00e0 moins de deux secondes les uns des autres pour confirmer). Ensuite cette valeur \u00e9talon je la calcule en fonction du nombre de pixels verts dans l'image et si il y a plus de 30% de pixels verts en plus c'est que le DRS est activ\u00e9 ex: Ceci est un DRS ferm\u00e9: \"Closed DRS\" Ceci est un DRS ouvert: \"Open DRS\" Cela marche \u00e0 peu pr\u00e8s tout le temps mais dans le pire des cas on peut toujours verifier que les pilotes sont bien proches pour detecter les potentiels rares cas de faux positifs. J'ai pu augmenter les performances en utilisant un seul engine pour tout le monde et en arr\u00eatant d'utiliser GetPixel et SetPixel qui sont simplement des horreurs \u00e0 utiliser. Mais elles ne sont pas encore bonnes Le soucis avec la detection de pneus cependant, c'est qu'il n'est pas possible d'utiliser la reconnaissance pour savoir ou regarder la couleur car cela ne marcherait pas. Je ne peux pas faire trop de post processing car je dois conserver la couleur Je ne peux pas hardocder un endroit ou aller regarder car cela \u00e9volue tout le long du Grand Prix. Bref c'est la gal\u00e8re. En y r\u00e9flechissant je me suis dit qu'une bonne id\u00e9e pourrait \u00eatre de partir de la droite de la zone du pneu en regardant au milieu de la hauteur. Puis continuer vers la gauche jusqu'\u00e0 ce que je rencontre une couleur diff\u00e9rente. Je pourrai ensuite faire une zone un peu vers la gauche qui devrait contenir les infos du pneu et sur laquelle il sera possible de faire de le reconnaissance de couleur et de la reconnaissance de chiffres. J'ai d\u00e9termin\u00e9 que le background n'\u00e9tait jamais plus clair que #505050 et que donc nimporte quelle couleur qui aurait plus que 50 dans un seul des channels serait consid\u00e8r\u00e9e comme une couleur cassant le background Pour arriver \u00e0 cette conclusion je me suis amus\u00e9 un peu avec les couleurs pour jouer avec les limites de mon algorythme : \"Color fun\" Et je crois que j'ai eu une bonne id\u00e9e, avec une petite methode bien faite on arrive \u00e0 de supers r\u00e9sultats : private Rectangle FindTyreZone () { Bitmap bmp = WindowImage ; int currentPosition = bmp . Width ; int height = bmp . Height / 2 ; Color limitColor = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Color currentColor = Color . FromArgb ( 0 , 0 , 0 ); Size newWindowSize = new Size ( bmp . Height , bmp . Height ); while ( currentColor . R <= limitColor . R && currentColor . G <= limitColor . G && currentColor . B <= limitColor . B && currentPosition > 0 ) { currentPosition --; currentColor = bmp . GetPixel ( currentPosition , height ); } //Its here to let the new window include a little bit of the right side int offset = Convert . ToInt32 (( float ) newWindowSize . Width / 100f * 20f ); int CorrectedX = currentPosition - ( newWindowSize . Width - offset ); if ( CorrectedX <= 0 ) return new Rectangle ( 0 , 0 , newWindowSize . Width , newWindowSize . Height ); return new Rectangle ( CorrectedX , 0 , newWindowSize . Width , newWindowSize . Height ); } \"Tyres\" Maintenant cela devrait \u00eatre beaucoup plus simple de trouver la couleur g\u00e9n\u00e9rale et le nombre de tours. Donc ce que je fais c'est que je fais une reconnaissance de texte sur l'image r\u00e9duite. Si je trouve une lettre c'est facile Ca me donne le type de pneu et ca me dit que c'est le premier tour avec. Si c'est un nombre alors je fais la moyenne de toutes les couleurs de l'image et je prend la couleur de pneu la plus proche. Voici les diff\u00e9rentes couleurs de pneus : SOFT : #FF0000 MEDIUM : #f5bf00 HARD : #d9d8d4 INTER : #00a42e WET : #2760a6 \"Tyre colors\" Les couleurs de pneus peuvent changer de temps \u00e0 autres, par exemple cette r\u00e8gle de pneus est arriv\u00e9e en 2019 et avant il y avait beaucoup plus de couleurs mais dans une volont\u00e9 de rendre le sport plus facile \u00e0 comprendre \u00e0 la t\u00e9l\u00e9 cela a \u00e9t\u00e9 simplifi\u00e9. Je ne pense pas que cela va changer dans les ann\u00e9es qui viennent alors tout est hardcod\u00e9. Je pense que j'ai des soucis avec la detection de texte et de couleur car ma zone est trop grande. Alors bon j'\u00e9crit ces lignes apres des heures de tests. Il semble que la principale difficult\u00e9 avec ces pneus c'est que les chiffres ou lettres sont minuscules. Il est donc extr\u00eamement difficile de faire une reconnaissance ne serait-ce qu'un peu fiable.. Je fais de mon mieux pour tenter de r\u00e8gler le soucis cependant c'est vraiment complexe. Je commence \u00e0 devenir fou, je tente tout et nimporte quoi pour permettre \u00e0 mon algo de fonctionner et m\u00eame quand je fais du post processing comme pas possible il me retourne toujours nimporte quoi... \"5i t'inqui\u00e8tes\" Ici le programme va trouver '5i'... En fait c'est complexe d'expliquer tout ce que je fais car je change tout en boucle en essayant et en ratant ce qui prend des heures. Pour aujourd'hui j'abandonne je vais simplement rentrer chez moi et y r\u00e9flechir cette nuit mais je ne vois pas comment mieux faire la... C'est terrible par ce que je sens que je ne suis pas bien loin.","title":"Vendredi 6 Avril 2023"},{"location":"jdb.html#vacances","text":"Bon je vais un peu laisser de c\u00f4t\u00e9 la detection de chiffres pour me pencher un peu plus sur la d\u00e9tection de couleur. Par ce que techniquement si j'arrive \u00e0 toujours parfaitement la detecter alors je pourrais me passer des chiffres car ils sont redondant si je construit un historique de pneus. J'ai r\u00e9ussi \u00e0 fix mon probl\u00e8me de mauvaise detection de couleur de pneus. Du moins je crois. Seulement j'ai quand m\u00eame un souci, les fen\u00eatres de pneus avec une lettre n'ont pas assez de couleur pour \u00eatre d\u00e9tect\u00e9s. Je vais donc essayer de detecter les cinq lettres possibles et si il ne trouve pas alors je pourrai tenter de detecter les chiffres sans lettres ce qui devrait grandement aider. Le but est encore une fois de r\u00e9duire les possibilit\u00e9s de Tesseract. Je me rend de plus en plus compte que le plus important c'est de r\u00e9duire le scope le plus possible. Moins il y a de mots et lettres et de chiffres possibles meilleure sera la reconnaissance. Bon ca ne veut toujours pas marcher maintenant le 11 est interpr\u00eat\u00e9 comme trois I ou comme un M... J'en ai marre sans rire c'est vraiment p\u00e9nible. Alors j'\u00e9crit ces lignes deux jours plus tard et me rend compte avec horreur que toutes mes modifications sur ce journal de bord n'ont pas \u00e9t\u00e9 auvegard\u00e9e... yess.. Bon pour faire simple, j'ai r\u00e9ussi \u00e0 rendre la detection de couleurs bien plus efficace en r\u00e9duisant la taille de l'image et en ne prenant pas en compte les couleurs que l'on d\u00e9tecte comme \u00e9tant partie int\u00e9grante du background. Par exemple quand on a une image comme celle ci : \"Avec background\" qui contient un background alors que ci dessous, on l'a enlev\u00e9. \"Sans background\" La diff\u00e9rence est t\u00e9nue mais elle permet de grandement am\u00e9liorer la prescision de la reconnaissance de couleurs. Pour ce qui est du nombre de tours je me suis rendu compte que cela n'\u00e9tait d\u00e9ja pas tr\u00e8s utile car avec l'historique on devrait pouvoir le d\u00e9duire. Mais bon pour la forme je me suis dit que cela serait quand m\u00eame une bonne id\u00e9e de v\u00e9rifier avec la reconnaissance. J'\u00e9tais quasi certain que le soucis \u00e9tait le fait que l'on voie le contour du logo de pneu qui faisait que la reconnaissance avait du mal. Et j'avais raison ! En les enlevant (Ce qui n'a pas \u00e9t\u00e9 simple) J'ai pu avoir des chiffres beaucoup plus proches de la r\u00e9alit\u00e9. En m\u00eame temps je ne vois pas bien comment j'aurais pu faire mieux : \"Super 11\" Je suis quand m\u00eame assez fier de voir que j'ai r\u00e9ussi \u00e0 part de l'image que on peut voir un peu plus haut et automatiquement la transormer en celle ci-dessus. J'ai donc pu retirer le round autour du chiffre et cela m'a permit de pouvoir d\u00e9zoomer un peu et c'est avec ca que les lettres ont pu \u00eatre mieux reconnues : \"Super H\" \"Super M\" Maintenant je pense qu'il ne reste \"plus qu'\u00e0\" nettoyer un peu tout ce code qui traine de partout pour tout faire fonctionner et impl\u00e9menter un peu de parrallel processing ainsi que de l'asynchrone pour ne pas bloquer le reste du programme. Par ce qu'il faut savoir que en l'\u00e9t\u00e2t, le programme met 25 secondes \u00e0 d\u00e9marrer et consomme presque 2GB de Ram. Certes cela ne veut pas dire que la reconnaissance \u00e0 elle seule prend 25 secondes car au d\u00e9marrage il y a aussi la lecture du fichier de config et la cr\u00e9ation des window etc.. En r\u00e9alit\u00e9 la partie strictement OCR prend dans les 12s si on en croit la fonction stopWatch de C#. Et quand on change d'image la reconnaissance prend 9s. Dans tout les cas c'est BEAUCOUP trop. J'aurais eu comme objectif de faire une reconnaissance toutes les secondes. Je ne sais pas bien si cela va \u00eatre possible mais en tout cas le but va \u00eatre de s'en rapprocher. Pour \u00eatre plus exact et permettre une comparaison, voici les stats exactes Avec un fichier d'images vide : Loading - 11.8s Splitting d'images - 90ms OCR - 12.5s Avec un fichier d'images plein : Loading - 10.8s Splitting d'images - 80ms Ocr - 11.6s En passant d'une image \u00e0 l'autre : Loading - NaN Splitting d'images - 50ms Ocr - 8.8s Donc on peut voir que les deux endroits ou le programme prend le plus de temps c'est au premier d\u00e9marrage quand il faut lire le fichier et setup les windows etc... Et l'OCR qui prend un temps fou. Ce qui est pratique c'est que les presque 2gb de ram sont utilis\u00e9s que au lancement et ensuite l'application n'en utilise que quelques centaines de mb. Le processeur lui tourne entre 10 et 20% ce qui ne va pas durer :) Je vais m'occuper dabord du loading. J'ai essay\u00e9 d'utiliser un Parrallel.For au moment de la cr\u00e9ation des windows, le probl\u00e8me c'est que visiblement les objets windows sont beaucoup trops complexes et utilisent trop de ressources partag\u00e9es pour \u00eatre vraiment thread Safe. J'\u00e9sp\u00e8re que je n'aurais pas trop de soucis avec ca qu'en j'en viendrai \u00e0 l'optimisation de l'OCR... Ce qui me rend fou c'est que cette boucle toute nulle prend plus de dix secondes \u00e0 s'executer et je ne comprend pas bien pourquoi. for ( int i = 0 ; i < NUMBER_OF_DRIVERS ; i ++) { Point tmpPos = new Point ( 0 , FirstZonePosition . Y + i * FirstZoneSize . Height - Convert . ToInt32 ( i * offset ) /*- (i* (FirstZoneSize.Height / 32))*/ ); Zone newDriverZone = new Zone ( MainZoneImage , new Rectangle ( tmpPos , FirstZoneSize )); Bitmap zoneImg = newDriverZone . ZoneImage ; newDriverZone . AddWindow ( new DriverPositionWindow ( zoneImg , new Rectangle ( driverPositionPosition , driverPositionArea ))); newDriverZone . AddWindow ( new DriverGapToLeaderWindow ( zoneImg , new Rectangle ( driverGapToLeaderPosition , driverGapToLeaderArea ))); newDriverZone . AddWindow ( new DriverLapTimeWindow ( zoneImg , new Rectangle ( driverLapTimePosition , driverLapTimeArea ))); newDriverZone . AddWindow ( new DriverDrsWindow ( zoneImg , new Rectangle ( driverDrsPosition , driverDrsArea ))); newDriverZone . AddWindow ( new DriverTyresWindow ( zoneImg , new Rectangle ( driverTyresPosition , driverTyresArea ))); newDriverZone . AddWindow ( new DriverNameWindow ( zoneImg , new Rectangle ( driverNamePosition , driverNameArea ))); newDriverZone . AddWindow ( new DriverSector1Window ( zoneImg , new Rectangle ( driverSector1Position , driverSector1Area ))); newDriverZone . AddWindow ( new DriverSector2Window ( zoneImg , new Rectangle ( driverSector2Position , driverSector2Area ))); newDriverZone . AddWindow ( new DriverSector3Window ( zoneImg , new Rectangle ( driverSector3Position , driverSector3Area ))); MainZone . AddZone ( newDriverZone ); } Alors que Zone.AddWindow c'est simplement : public virtual void AddWindow ( Window window ) { Windows . Add ( window ); } Et windows est simplement une liste. Donc ca ne peut pas \u00eatre ca qui prend du temps. Et les windows que je cr\u00e9\u00e9 ont ca comme code : public DriverPositionWindow ( Bitmap image , Rectangle bounds ) : base ( image , bounds ) { Name = \"Position\" ; } Sachant que le constructeur de base d'une Window c'est : public Window ( Bitmap image , Rectangle bounds ) { Image = image ; Bounds = bounds ; Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } Sachant que TesseractEngine est en statique et que donc il ne devrait... OHLLALALALALALALALALA je suis un imb\u00e9cile... J'ai juste \u00e0 changer ce constructeur avec ca: if ( Engine == null ) { Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } ET le loading ne prend plus que 2-300 ms... Bon c'est une tr\u00e8s belle am\u00e9lioration pour pas tr\u00e8s ch\u00e8r mais bon c'est un peu b\u00eate... Bon je pense que 2-300ms c'est une dur\u00e9e correcte surtout que ca n'est appel\u00e9 qu'une fois pour le lancement. On peut passer \u00e0 la suite maintenant. Alors il y a un grand soucis avec la parallellisation de l'OCR... Tesseract n'est pas par d\u00e9faut une classe \"Thread safe\" ce qui veut dire que je ne peut utiliser de parallell.Foreach sur mes windows pour acc\u00e8l\u00e8rer le traitement drastiquement. Je pourrais par exemple avoir une instance de Tesseract par window sauf que cela fait 20 pilotes * 9 windows chacuns ce qui donne 180 instances ce qui n'est tout simplement pas raisonnable. Je vais donc essayer de voir avec l'utilisation de methodes asynchrones qui me permettraient de faire un genre de flux tendu de reconnaissance. J'avoue que la je navigue un peu \u00e0 vue, je me base sur diff\u00e9rentes infos que je trouve sur des sites un peu perdus et sur chatGPT, j'esp\u00e8re que j'arriverai \u00e0 trouver une solution car 10 secondes de reconnaissance c'est vraiment beaucoup trop. Alors le soucis avec un Engine unique entre toutes les windows c'est qu'il n'est pas possible de process plusieurs images \u00e0 la fois. Je vais donc retirer l'engine unique pour voir si en cr\u00e9er un par window me permet de passer en multithreading. La grande question sera : Est-ce que les ressources suppl\u00e9mentaires que vont prendre la cr\u00e9ation de tous ces engines va compenser enti\u00e8rement le temps gagn\u00e9 avec la paralellisation. Pour stocker les donn\u00e9es dans un premier temps je vais cr\u00e9er un objet DriverData. Ce qu'il y a de pratique avec ca, c'est que je pourrais ajouter du code de v\u00e9rification de certaines donn\u00e9es directement dedans avant de les donner \u00e0 la suite du programme. Et on peut m\u00eame imaginer une impl\u00e9mentation d'une liste de DriverData pour avoir l'historique. Ce qui serait cool ca serait de grouper toutes ces data avec un num\u00e9ro de tour. Placer ensuite la liste de Data dans une DB serait ainsi super simple. Mais il va falloir savoir quoi mettre, quelles infos sont redondantes et prendre en compte le fait que un tour affich\u00e9 sur la page de la F1TV n'est accompli que par certains des premiers pilotes. D'autres pilotes peuvent \u00eatre dans des tours pr\u00e9c\u00e9dents si ils ont du retard. Il faudra r\u00e9fl\u00e9chir \u00e0 cela quand je viendrai au mod\u00e8le. Bon pour y arriver j'ai du faire de gros changements et le r\u00e9sultat n'est peut-\u00eatre pas aussi cool que ce que j'aurais voulut... Voici un petit point sur les performances maintenant J'ai \u00e9galement d\u00e9sactiv\u00e9 le dump d'images. Pour le moment j'ai tout mis en commentaire mais cela pourrait \u00eatre int\u00e9ressant de faire en sorte de pouvoir l'activer en changeant une ou deux variables Au d\u00e9marrage : Loading - 113ms Splitting d'images - 14ms Ocr - 7s En passant d'une image \u00e0 l'autre : Loading - 113ms Splitting d'images - 13ms Ocr - 5s Alors clairement les stats montrent qu'il y a eu un changement mesurable mais bon je pensais pouvoir en gagner un peu plus... Je soupconne la cr\u00e9ation d'engines d'\u00eatre \u00e0 l'origine de ces performances presque d\u00e9cevantes. Autre soucis, il semble que plus je change d'image plus la detection est lente et plus je consomme de RAM. Il va falloir que je travaille encore un peu. J'ai tent\u00e9 de mettre un stopwatch sur une des cr\u00e9ations d'engine Tesseract et le r\u00e9sultat me parait fou... Plus d'une seconde c'est dingue. J'ai test\u00e9 dans d'autres endroits du code et effectivement il semble que la cr\u00e9ation d'un engine prenne entre une et deux secondes ce qui est une ETERNITEE what ! Donc il faut optimiser tout ca. Une id\u00e9e serait de d\u00e9composer le threading mais cela me demanderait un gros refactor et je n'ai pas envie d'en refaire un la... Sinon, une fois qu'ils sont cr\u00e9\u00e9s ils ne prennent pas de temps du tout. Cr\u00e9er une fois tous les engines et ensuite les utiliser pourrait \u00eatre une bonne id\u00e9e. Cela prendrait longtemps au load mais ensuite les reconnaissances devraient \u00eatre super rapides. Ok alors ca c'est d\u00e9ja plus ce \u00e0 quoi je m'attendais ! On est de nouveau \u00e0 plus de 10s de loading time mais on est descendu \u00e0 deux secondes par OCR. (Bon autre soucis, l'utilisation de la RAM est ridicule plus de 2gb mais ce qui m'inqui\u00e8te c'est que j'ai l'impression qu'elle augmente plus on change d'image) J'ai r\u00e8gl\u00e9 (en partie) le soucis en obligeant le GC (Garbage Collector) \u00e0 collecter apr\u00e8s chaque detection. m\u00eame apr\u00e8s 50 detections l'utilisation de la ram se stabilize autour des 2GB. Bon en paralellisant la cr\u00e9ation des Engines le soucis c'est que cela demande d'allouer beaucoup trop de m\u00e9moire d'un coup alors le programme se fige pendant genre cinq secondes avant de tout cr\u00e9er. Du coup m\u00eame si la cr\u00e9ation est plus rapide, on se retrouve avec un temps total plus long... Je pense que l'on va devoir se contenter de ces dix secondes. Bon la j'allais tenter de faire la documentation mais je viens de me rendre compte que la detection de temps au tour est pas vraiment encore id\u00e9ale... J'ai r\u00e9ussi \u00e0 changer un petit peu le programme de reconnaissance pour rendre la reconnaissance un peu meilleure mais cela a drastiquement augment\u00e9 le temps requis pour d\u00e9coder... On arrive \u00e0 3.5 secondes. Je vais tenter de rajouter un peu de parralell processing sur les boucles de traitement voir si cela peut aider. Alors effectivement cela aide pas mal, on arrive maintenant \u00e0 faire une detection presque tout le temps en dessous de la seconde. Et j'ai aussi du changer un peu le fonctionnement de la detection des Temps au tour. Et voila je pense que je vais m'arr\u00eater la pour la partie d\u00e9codage. Je ne pense pas que je peux facilement faire mieux que ca et il faut que j'avance dans d'autres parties du projet. Je vais pouvoir commencer \u00e0 documenter un peu toute la partie OCR. Il faut que je prenne le temps de le faire bien car c'est la partie la plus int\u00e9ressante du projet et ou je pense que j'aurai le plus essay\u00e9 de choses qui vallent le coup d\u00eatres racont\u00e9es. J'ai aussi pass\u00e9 pas mal de temps sur le poster du projet. J'avais fait des croquis au crayon de ce \u00e0 quoi je pensais, cependant apr\u00e8s de longues discussions avec M.Garcia ils n'\u00e9taient pas forc\u00e9ment tr\u00e8s bons car ils ne repr\u00e9sentent pas assez bien le fonctionnement du projet et sont un peu trop marketings. Du coup j'ai fait une premi\u00e8re version au propre : \"Poster V1\" Mais je n'\u00e9tais pas forc\u00e9ment content du r\u00e9sultat et il manquait des choses je trouve comme par exemple l'utilisation de Selenium. J'ai donc repass\u00e9 des heures \u00e0 faire une seconde version : \"Poster V2\" La police d'\u00e9criture n'est pas encore la bonne mais cela va venir. Mais je pr\u00e9f\u00e8re d\u00e9ja beaucoup cette version \u00e0 la premi\u00e8re. Je ne sais pas encore si la version finale sera une version plus travaill\u00e9e de ce poster ou compl\u00eatement autre chose mais pour l'instant je suis \u00e0 peu pr\u00e8s content de cette version. Je le trouve un tout petit peu trop brouillon ou avec trop d'infos mais il m'a \u00e9t\u00e9 de nombreuses fois reproch\u00e9 de ne pas assez montrer le fonctionnememt interne et je ne peux pas faire plus simple. L'ajout des nombres pour compartimenter le projet ajoute de la structure mais je me demande si cela suffit. Maintenant que je suis \u00e0 peu pr\u00e8s content de mon code pour l'OCR je vais commencer sa documentation. (Uniquement son fonctionnement interne pas comment s'en servir car cela va changer) Bon j'ai cr\u00e9\u00e9 u nouveau projet selenium mais m\u00eame avec les bonnes libraries je n'arrivais pas \u00e0 faire fonctionner firefox j'avais toujours une erreur \"OpenQA.Selenium.WebDriverException: 'Cannot start the driver service on http://localhost:51481/'\" et j'ai pu r\u00e8gler le probl\u00e8me en t\u00e9l\u00e9chargeant directement le gecko driver depuis le git https://github.com/mozilla/geckodriver/releases et utiliser le fichier directement dans le service : var service = FirefoxDriverService . CreateDefaultService ( AppDomain . CurrentDomain . BaseDirectory + @\"geckodriver-v0.27.0-win32\\geckodriver.exe\" ); FirefoxOptions options = new FirefoxOptions (); var driver = new FirefoxDriver ( service , options ); Le seul probl\u00e8me c'est que du coup il faut tout le temps d\u00e9placer le fichier dans le dossier bin si je clone le projet. Il faudra faire un installeur dans la version finale qui s'occupe de tout je pense. Je me suis dit que j'allais garder la doc pour le retour des vacances quand j'aurai un bureau un clavier et un setup complet un peu propres. Bon il va falloir que je parle de la r\u00e9cup\u00e9ration de cookie. J'ai d\u00e9ja pu travailler lors d'un poc sur la meilleure facon de prendres des screenshots de la F1TV : Avoir une page chrome ouverte avec le feed en plein \u00e9cran et un programme qui prend des captures d'\u00e9crans. Avoir une cam\u00e9ra qui prend en photo l'\u00e9cran au cas ou chrome et Firefox emp\u00eachent la prise de captures d'\u00e9crans. R\u00e9cup\u00e8rer directement le feed en faisant du reverse engeneering de la plateforme. Simuler un chrome en background qui prenne des screenshot sans qu'on aie \u00e0 le voir. Dans toutes ces options, je dirais que la pire \u00e9tait celle de la cam\u00e9ra qui filme l'\u00e9cran, mais \u00e0 l'\u00e9poque c'\u00e9tait encore envisageable comme solution de dernier recours. Le soucis de cette solution c'est l'horreur que serait la partie OCR avec une image de tr\u00e8s mauvaise qualit\u00e9. Une autre option qui m'aurait vraiment emb\u00eat\u00e9 aurait \u00e9t\u00e9 de devoir garder une page de Chrome ou Firefox ouverte quelque part sur un \u00e9cran pour que le programme puisse prendres des captures d'\u00e9crans. C'est de loin l'option la plus simple et la plus logique mais elle poss\u00e8de pour moi de tr\u00e8s gros points noirs : On ne peut pas certifier l'int\u00e9grit\u00e9 des donn\u00e9es car l'utilisateur a le contr\u00f4le total sur le feed. Il peut mettre pause, avancer, reculer, tout casser sans faire expr\u00e8s en ouvrant autre chose sur son ordi qui se mette pile devant. Bref c'est un peu bancale. Et surtout on bloque une partie non significative de l'\u00e9cran de l'utilisateur avec des infos redondantes. Et je peux vous dire que quand je commente la F1 j'ai besoin de beaucoup d'informations et que chaque centim\u00e8tre d'\u00e9cran est crucia\u00e9 ! Alors avoir un \u00e9cran complet bloqu\u00e9 est juste un point bloquant qui m'emp\u00eacherait d'utiliser l'app aussi bonne soit-elle dans ses pr\u00e9dictions. Mais bon si aucune autre methode ne fonctionne ce qui est bien c'est que celle la est plut\u00f4t simple \u00e0 mettre en place. Ensuite reverse engeneer le feed serait l'option la plus classe, cependant c'est la plus complexe et la plus bancale au niveau l\u00e9gal haha. L'id\u00e9e serait de r\u00e9cup\u00e8rer le lien vers le broadcast g\u00e9n\u00e9ral et de comprendre comment il fonctionne pour le d\u00e9coder nous m\u00eame pendant un Grand Prix. Seuls soucis : Il n'est pas possible de faire des tests en dehors des periodes de Grand Prix (Et je rappelle que c'est des p\u00e9riodes ou je travaille en plus) Difficile de faire un syst\u00e8me qui marche pareil pour les rediffusions et les lives. (En effet les liens des rediff sont beaucoup plus simple \u00e0 r\u00e9cup\u00e8rer mais ne fonctionnent pas du tout pareil et pour tester l'app il est essentiel de pouvoir s'entrainer sur des anciens Grand Prix) Dernier GROS soucis, je ne sais tout simplement pas faire ca lol. Je ne sais pas comment faire. Peut-\u00eatre que avec des profs qui m'aident et chat gpt ainsi qu'internet je pourrais potentiellement n\u00e9gocier un truc mais c'est hautement improbable et cela serait une perte de temps folle si je n'y arrive pas. Derni\u00e8re option que je trouve la plus s\u00e9duisante. Simuler une instance de Chrome ou de Firefox (Le soucis avec chrome c'est qu'il impl\u00e9mente l'utilisation de DRM dans les vid\u00e9os qui fait qu'il est tr\u00e8s difficile de passer outre la s\u00e9curit\u00e9 avec un bot) pour ensuite prendre des captures d'\u00e9crans automatiquement. Cette solutions offre pleins d'avantages : Pas de place prise sur l'\u00e9cran L'int\u00e9grit\u00e9 des donn\u00e9es est assur\u00e9e car c'est le programme qui d\u00e9cide d'ou partir et de si il met pause ou non C'est une option complexe mais beaucoup moins que le reverse engeneering Elle permet de ne demander presque aucun input de la part de l'utilisateur. Mais elle pose quelques probl\u00e9matiques : Comment se connecter automatiquement sans \u00eatre detect\u00e9 par un Bot et sans demander \u00e0 l'utilisateur ses identifiants (Pour des raisons \u00e9videntes qui sont : QUI VA METTRE SES IDENTIFIANTS SUR UNE VIEILLE APP COMME LA MIENNE??) Comment faire en sorte que le programme prenne les meilleures captures dans la meilleure qualit\u00e9 et en plein \u00e9cran. Mais j'ai d\u00e9cid\u00e9 de partir sur cette option. Pour ce faire j'utilise Selenium. J'ai pu tester Puppetteer Sharp et m\u00eame si dans un premier temps j'ai pu avancer asez vite, malheureusement il y a des bugs qui rendent son utilisation impossible dans notre contexte. J'ai donc d\u00e9cid\u00e9 de tout faire en utilisant un portage de Selenium dans mon programme. Voici un exemple de code qui va ouvrir FireFox et qui va lancer un RickRoll var service = FirefoxDriverService . CreateDefaultService ( AppDomain . CurrentDomain . BaseDirectory + @\"geckodriver-v0.27.0-win32\\geckodriver.exe\" ); service . Host = \"127.0.0.1\" ; service . Port = 5555 ; FirefoxOptions options = new FirefoxOptions (); options . AddArgument ( \"--disable-headless\" ); var driver = new FirefoxDriver ( service , options ); driver . Navigate (). GoToUrl ( \"https://www.youtube.com/watch?v=dQw4w9WgXcQ&autoplay=1&mute=1\" ); Dans cet exemple on d\u00e9sactive le \"Headless\" pour qu'on puisse voir ce que fait l'app car sinon tout est invisible. Alors dans les faits la vid\u00e9o youtube ne se lance pas du tout car il y a des pubs et des prompts de cookies que l'on doit accepter etc... ce qui montre les diff\u00e9rents challenges que l'on va devoir surmonter pour vraiment faire ce que l'on veut. Mais un petit d\u00e9tail extr\u00eamement important, la F1TV est un programme payant un peu comme netflix. Ce qui veut dire que pour acc\u00e8der au contenu il faut \u00eatre connect\u00e9. Sauf que une instance de firefox cr\u00e9\u00e9 par Selenium est comme une page de naviguation priv\u00e9e, ce qui veut dire que si on va sur la page de la F1TV on est pas connect\u00e9s. Je pourrais tout \u00e0 fait demander \u00e0 l'utilisateur de me donner ses identifiants pour que j'aille ensuite automatiquement me connecter sauf que cela pose deux soucis: Personne ne voudra mettre ses identifiants sur mon programme La page de login de la F1TV a \u00e9t\u00e9 prot\u00e8g\u00e9e avec la meilleure technologie de detection de bots que je connaisse. Presque aucun site n'arrive \u00e0 me detecter sauf eux ! Donc c'est tout simplement impossible d'utiliser cette technique. Ensuite je me suis rappel\u00e9 que ce que la page stocke pour me permettre de rester connect\u00e9 ce sont des cookies. Et si je mets le bon cookies dans Selenium alors je serai connect\u00e9. Dans un premier temps je voulais faire un syst\u00e8me ou l'utilisateur irait prendre dans son chrome son cookie et le copie colle dans mon programme mais c'est immonde. C'est alors que vient la partie r\u00e9cup\u00e8ration de cookies ! Tous les cookies de chrome sont stock\u00e9s dans une base de donn\u00e9es SQLITE. On pourrait se dire Banco il suffit d'aller dedans et de retrouver tous les cookies et se connecter. Sauf que, pas b\u00eates, les \u00e9quipes de chrome ont d\u00e9cid\u00e9 que c'\u00e9tait une bonne id\u00e9e d'encoder les cookies pour que tout le monde ne puisse pas venir y mettre son nez... En effet les cookies peuvent contenir des informations importantes. Cela fait que pour utiliser ces cookies il faut pouvoir les d\u00e9coder. Mon hypoth\u00e8se a \u00e9t\u00e9 que si ces cookies peuvent \u00eatre lus par Chrome m\u00eame hors connexion, c'est que la cl\u00e9 de d\u00e9codage existe sur l'appareil et qu'il suffit de la trouver. ET C'EST LE CAS! Apr\u00e8s pas mal de recherches j'ai pu voir que la cl\u00e9 de d\u00e9codage existe bel et bien et qu'il suffit de la d\u00e9coder en utilisant la librairie DPAPI pour la lire. Avec cette cl\u00e9 on peut ensuite d\u00e9coder les cookies et leurs valeurs ce qui veut dire qu'il est th\u00e9oriquement possible d'automatiser le processus sans que l'utilisateur n'aie rien \u00e0 faire. J'ai d\u00e9cid\u00e9 de faire la partie r\u00e9cup\u00e8ration en python pour deux raison : Je n'arrivais pas \u00e0 trouver une bonne impl\u00e9mentation de DPAPI en C# qui me permettait de d\u00e9coder la cl\u00e9. Il existe beaucoup plus de documentation en Python pour ce qui est de la cryptographie et donc si Chrome change de fonctionnement il sera beaucoup plus simple de changer cette partie en particulier sans avoir \u00e0 recompiler le code C#. J'ai donc avec l'aide d'internet et de ChatGPT cr\u00e9\u00e9 ce script : def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key def decrypt_payload ( cipher , payload ): return cipher . decrypt ( payload ) def generate_cipher ( aes_key , iv ): return AES . new ( aes_key , AES . MODE_GCM , iv ) def decrypt_password ( buff , master_key ): try : iv = buff [ 3 : 15 ] payload = buff [ 15 :] cipher = generate_cipher ( master_key , iv ) decrypted_pass = decrypt_payload ( cipher , payload ) decrypted_pass = decrypted_pass [: - 16 ] . decode () # remove suffix bytes return decrypted_pass except Exception : # print(\"Probably saved password from Chrome version older than v80\\n\") # print(str(e)) return \"Chrome < 80\" master_key = get_master_key () cookies_path = Path ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Default \\\\ Network \\\\ Cookies\" ) if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" ) Ce programme va faire tout ce que j'ai expliqu\u00e9 et va ensuite stocker les r\u00e9sultats dans un CSV pour qu'il soit facile d'y acc\u00e8der depuis le C#. Alors oui cela pose certaines questions de s\u00e9curit\u00e9. Car en effet je prend tous les cookies, les d\u00e9code et les stocke. Ce qui veut dire que je pourrais tout \u00e0 fait envoyer ces donn\u00e9es quelque part, par exemple un compte Netflix, et me rincer. Si je devais rendre le projet ouvert au public je pense qu'il faudra que cela soit mentionn\u00e9 clairement et que le projet soit open source pour que les utilisateurs puissent verifier que je ne fais pas ca. Maintenant de l'autre c\u00f4t\u00e9 j'ai juste \u00e0 lire le CSV et le tour est jou\u00e9 ! (Trouver cette solution m'a pris une semaine de vacances \u00e0 l'\u00e9poque) Bon j'ai r\u00e9ussi \u00e0 faire le programme se connecter et naviguer etc.. Par contre quelque chose que j'ai voulu ajouter et qui m'a pris pas mal de temps c'est de faire en sorte de pouvoir selectionner la qualit\u00e9. Pour changer la qualit\u00e9 du feed il faut cliquer sur settings et ensuite prendre le menu deroulant et selectioner 1080p. Le soucis c'est le que la value du select est jamais la m\u00eame. Elle commence toujours pas \"1080_\" mais ensuite ca peut \u00eatre \"1080_45930285\" ou \"1080_56801\" la suite est apparemment random. J'ai donc du utiliser ce code pour le selectioner quand m\u00eame : IWebElement settingsButton = driver . FindElement ( By . ClassName ( \"bmpui-ui-settingstogglebutton\" )); settingsButton . Click (); IWebElement selectElement = driver . FindElement ( By . ClassName ( \"bmpui-ui-videoqualityselectbox\" )); SelectElement select = new SelectElement ( selectElement ); IWebElement selectOption = selectElement . FindElement ( By . CssSelector ( \"option[value^='1080_']\" )); selectOption . Click (); Sauf que pour que cela marche je dois avant cliquer sur le bouton des settings le probl\u00e8me c'est qu'il est invisible alors on doit le faire apparaitre. J'ai tent\u00e9 de le faire aparaitre en bougeant la souris, en cliquant \u00e0 un endroit pr\u00e9cis, impossible de le faire marcher correctement. Puis j'ai eu l'id\u00e9e de mettre pause en envoyant un appui sur la touche Espace et ca a permit de d\u00e9couvrir le bouton et permettre qu'on clique dessus. Ca peut paraitre tout b\u00eate mais rien que ca, ca m'a pris un temps consid\u00e9rable. Bon pour ce qui est du timecode de la vid\u00e9o. Je pense qu'il serait trop complexe de faire en sorte que selenium change le slider de progression de la vid\u00e9o. Alors j'ai fait quelques tests et apparemment, si on quitte la F1TV sur un timecode de la vid\u00e9o que on donne au programme, comme il r\u00e9cup\u00e8re tous les cookies de la F1TV il commencera de la. Donc si on veut utiliser le programme avec des Grand Prix ayant d\u00e9ja eu lieu, on peut le faire, seulement il faudra juste au pr\u00e9alable avoir choisit le bon timecode dans le page de la F1TV avant de le lancer. Ce qui est int\u00e9ressant c'est que la page de la F1TV ressemble \u00e0 ca au d\u00e9part : \"Empty F1TV\" Je pense qu'une bonne id\u00e9e serait de dire au programme que c'est la grille de d\u00e9part et ensuite d\u00e8s qu'il d\u00e9tecte un secteur il sait que la course a commenc\u00e9.","title":"Vacances"},{"location":"jdb.html#lundi-24-avril-2023","text":"Aujourd'hui c'est jour de documentation. J'ai pas mal travaill\u00e9 pendant les vacances mais je n'ai pas encore pu faire de vraie documentation correcte du fonctionnement. Du coup je vais m'en charger aujourd'hui et peut-\u00eatre un peu demain. Ok normalement je ne devrais faire que de la documentation mais je ne peux pas passer \u00e0 cot\u00e9 de ca... Le probl\u00e8me que j'ai avec les pneus ou parfois il d\u00e9tecte un H au lieu d'un '11' et ce genre de choses c'est \u00e0 cause de ma methode \"RemoveBG\" Qui va retirer tous les pixels plus sombres que le background. Sauf que cela va aussi retirer des pixels dans le chiffre lui m\u00eame et qui va donc defigurer les 11 : \"diformed 11\" \"diformed 11\" J'ai r\u00e9ussi \u00e0 les changer en : \"less diformed\" \"less diformed\" Mais au final cela n'a pas augment\u00e9 la pr\u00e9cision de la reconnaissance. Je pense que je vais donc devoir encore changer. Je pense que une bonne facon de trouver serait dabord de trouver la couleur du pneu. Et si il n'y a pas assez de couleur alors c'est que le pneu contient une lettre. Le but est d'arr\u00eater de chercher des lettres ou des chiffres. Comme ca les 11 arr\u00eateront d'\u00eatre pris pour des 'H' En fait on peut faire encore plus simple que ca. On peut simplement regarder la couleur dominante et determiner le pneu. En effet m\u00eame si il y a une lettre sur fond noir pour d\u00e9crire le pneu, mon methode de r\u00e9cup\u00e8ration de la couleur dominante ommet les pixels trop noirs alors il est quand m\u00eame possible de determiner le type de pneus. Et tout simplement si il n'arrive pas \u00e0 lire le chiffre c'est que c'est une lettre et que donc on est \u00e0 0 tours. Cela marche plut\u00f4t bien et cela simplifie pas mal le processing. Voila, la je vais me remettre \u00e0 la documentation sinon je vais encore prendre du retard.","title":"Lundi 24 Avril 2023"},{"location":"jdb.html#mardi-25-avril-2023","text":"Encore une fois j'ai pris du temps de doc pour changer des choses sur la partie OCR. Mais en m\u00eame temps en documentant je vois des choses que j'ai soit mal fait soit que je pourrais faire mieux en changeant tr\u00e8s peu de choses. J'\u00e9sp\u00e8re que les changement que j'ai fait vont aider au moins \u00e0 la coh\u00e9rence du code et un peu pour les performances. Il semble que dans les conditions que j'ai test\u00e9 le nombre de tour soit plut\u00f4t fiable mais je pense que je devrai faire un peu de travail en aval dans la r\u00e9cup\u00e9ration de ces donn\u00e9es car je sens que cela va poser probl\u00e8me quelques fois. Je pense que en utilisant bien l'historique on peut potentiellement se passer de l'utilisation de ce chiffre pas toujours compl\u00eatement fiable. Mais sinon aujourd'hui c'est encore une fois un gros jour de doc. J'essaie d'expliquer les diff\u00e9rents proc\u00e9d\u00e9s avant de les oublier. J'essaie aussi de donner un maximum d'exemples sous formes de photos interm\u00e9diaires mais ca me prend pas mal de temps car il faut que j'ajoute un peu partout dans le code des lignes pour sortir des images interm\u00e9diaires. En plus de la documentation je me suis aussi beaucoup occup\u00e9 de nettoyer mon code et je suis assez content par ce que m\u00eame en ayant du rajouter des couches de complexit\u00e9 pour mieux reconnaitres les temps au tour j'arrive \u00e0 un temps de processing parfois en dessous des 2 secondes ce que je trouve honorable. Quand j'aurai finit de nettoyer tous mes fichiers je ferai une release sur gitea et ce sera la version que j'utiliserai quand je voudrai faire un merge avec les autres parties du projet. J'ai beaucoup beaucoup boss\u00e9 aujourd'hui et je sui bien mort. Faire autant de documentation et de nettoyage de code c'est pas forc\u00e9ment bon pour le cerveau je crois. J'ai besoin d'une sieste. Demain je pense que je vais commencer \u00e0 avancer sur la partie r\u00e9cup\u00e8ration des images. Je sais que la je fais un peu passer les tests \u00e0 la trappe mais d\u00e9ja j'en ai fait tout le long du d\u00e9veloppement de OCR_DECODE et il faut vraiment que j'avance, quitte \u00e0 revenir dessus quand j'aurai merge les deux projets ensemble.","title":"Mardi 25 Avril 2023"},{"location":"jdb.html#26-avril-2023","text":"Aujourd'hui je vais devoir m'occuper de la partie r\u00e9cup\u00e9ration des images. J'ai d\u00e9ja eu l'occasion d'avancer sur ce projet pendant mopn poc et mes vacances. Donc la le but ca va \u00eatre de voir ce qui manque comme v\u00e9ritables features et ensuite je vais pouvoir m'occuper de la vue et de son int\u00e9gration avec le d\u00e9codage. Ok donc maintenant que j'au un programme qui arrive \u00e0 prendre des images depuis la F1TV correctement et en bonne r\u00e9solution. Je pense qu'il est temps de passer \u00e0 l'impl\u00e9mentation de la Forme que ca va prendre. C'est important de se poser au moins cinq minutes la question de comment je pr\u00e9vois de faire car m\u00eame si ca n'est pas la version finale, cette derni\u00e8re prendra tr\u00e8s fort inspiration du desing que je vais faire. Dans cette form j'aurais besoin de : Pouvoir selectionner un Grand Prix en ins\u00e8rant l'URL du feed. Pouvoir lancer la calibration si besoin Indiquer le titre et la date du Grand Prix Indiquer si le Grand Prix vient de commencer ou si il y a d\u00e9ja un certain nombre de tours lanc\u00e9s. Et c'est \u00e0 peu pr\u00e8s tout en fait... J'ai tellement pouss\u00e9 pour avoir un programme qui fait tout tout seul que il ne me faut pas grand chose de plus. Je pense que ce qui serait pas mal ca serait du coup d'utiliser ce temps pour bien impl\u00e9menter la calibration qui elle aura besoin d'une UI un peu plus bal\u00e8ze. On pourrait m\u00eame imaginer que la calibration fasse partie int\u00e9grante des settings... Ca serait peut-\u00eatre bien que quand l'application se lance on se retrouve sur la page principale d'affichage de donn\u00e9es et qu'on puisse simplement cliquer sur la page options qui contient la page calibration et qui permet de rentrer les infos du Grand Prix. Je pense que je vais faire ca. Voici l'interface que j'ai d\u00e9velopp\u00e9e pour regrouper tout ca : \"Screen\" La police le style le placement et les couleurs ne sont pas d\u00e9finitfs, cependant je pense que c'est un bon d\u00e9but. Le but maintenant va \u00eatre de permettre de faire fonctionner la calibration et la r\u00e9cup\u00e8ration d'images. Si j'arrive \u00e0 faire fonctionner ces deux choses sur un m\u00eame projet avant la fin de la semaine cela serait super ! Bon J'ai pu avancer sur l'int\u00e8gration de Selenium mais cela prend un peu de temps car je veux impl\u00e9metner un moyen de pouvoir prendre une Screenshot \u00e0 nimporte quel moment et pas juste en boucle. Demain je finis de faire fonctionner ca et ensuite je commence le cablage du reste.","title":"26 Avril 2023"},{"location":"jdb.html#jeudi-27-avril-2023","text":"C'est assez dur de faire l'importation car il y a des petites diff\u00e9rences qui obligent \u00e0 presque tout r\u00e9\u00e9crire. En fait le programme de calibration avait d\u00e9ja impl\u00e9ment\u00e9 la fonction de Windows et de Zones mais il fonctionnait juste assez diff\u00e9remment pour qu'il faille tout refaire. La je suis en train de perdre \u00e9norm\u00e9ment de temps \u00e0 cause d'un soucis de coordonn\u00e9es. J'ai repris le code de la calibration pour detecter ou l'utilisateur a cliqu\u00e9 pour cr\u00e9er les zones. Cependant, je n'arrive pas \u00e0 le faire fonctionner correctement. La zone est tout le temps d\u00e9cal\u00e9e en haut et en bas mais pas de la m\u00eame facon. En haut, la valeur Y est trop grande alors que en bas la valeur Y est trop petite... Je ne comprends pas bien pourquoi. Si c'\u00e9tait un simple d\u00e9calage cela ne serait pas compliqu\u00e9 \u00e0 g\u00e8rer mais la... J'ai un soucis \u00e9galement avec la r\u00e9solution des screenshots que je r\u00e9cup\u00e8re en full Headless. Voici un exemple de r\u00e9solution que j'arrive \u00e0 r\u00e9cup\u00e8rer sans le headless : \"High Res\" \"Low Res\" Il y a clairement un soucis et le probl\u00e8me c'est que avec une r\u00e9solution pareille, impossible de faire une reconnaissance correcte. BON J?EN PEUX PLUS LA. Ca fait des heures que je bosse sur ce probl\u00e8me d\u00e9bile et impossible de trouver une solution. J'ai essay\u00e9 cinq facons de forcer le browser headless a prendre une plus haute r\u00e9solution aucune ne fonctionne je ne comprends pas. A chaque fois que je me retrouve avec une r\u00e9solution de 1366 x 768 Ou une variante de basse r\u00e9solution du style. J'en peux plus je ne trouve aucune r\u00e9ponse sur internet ni m\u00eame avec chatGPT. Super... La seule chose que j'ai pu faire qui change quelque chose fait que les images font maintenant du 926x517... j'ai un peu envie de commentre un crime de guerre au plus vite.","title":"Jeudi 27 Avril 2023"},{"location":"jdb.html#vendredi-28-avril-2023","text":"Une des solutions que je n'ai pas encore essay\u00e9 est de changer ma version de GeckoDriver. Sauf que ca m'oblige \u00e0 changer les versions de mes libraries ce qui est tr\u00e8s p\u00e9nible, je vais continuer le debugging dans le projet Selenium_clean. Il faut savoir que la librairie de Selenium que j'utilise est bloqu\u00e9e en 0.27 ce qui fait que je ne peux utiliser qu'une version obsol\u00e8te du Gecko Driver. J'ai tent\u00e9 de changer vers une version en 64 bits du GeckoDriver 0.27 mais pareil, je me retrouve toujours avec des images de M. J'essaie toutes les solutions que je trouve sur internet aucune ne convient c'est infernal. J'essaie de changer la r\u00e9solution DPI, j'essaie de changer les param\u00eatres par d\u00e9faut des player de Firefox, j'essaie de changer la r\u00e9solution pendant et au d\u00e9but de l'execution IMPOSSIBLE DE FAIRE MARCHER CETTE MERDE C'EST PAS POSSIBLE !!! J'ai essay\u00e9 avec chrome mais je ne peux pas l'utiliser car les DRM m'emp\u00eacheront de prendre des screenshot du flux vid\u00e9o. J'ai essay\u00e9 de faire tourner avec edge mais edge ne peut pas tourner en headless. JE VAIS DEVENIR FOUF FPWQOVMQEKOVNVIBDBJDAIVOBI. ET MAINTENANT JE N'ARRIVE PLUS A FAIRE DE PROJET AVEC SELENIUM VOIWQNV(UEWQBVU)WEQN=OEJNIVIUWVBWUEV ON CHERCHE A ME FAIRE PETER UN PLOMB C'EST PAS POSSIBLE GIWEGUWEQN VOICI UN EXEMPLE DU CODE QUE JE DEMANDE A UN NOUVEAU PROJET AVEC EXACTEMENT LES MEMES LIBRARIES INSTALLEES : // Create a new FirefoxDriver instance IWebDriver driver = new FirefoxDriver (); // Navigate to the specified URL driver . Navigate (). GoToUrl ( \"https://www.example.com\" ); // Do something with the driver (e.g., find elements or take screenshots) // Quit the driver driver . Quit (); Je ne demande que ca ET MEME CA CA NE VEUT PAS FONCTIONNER VOIWENB)IWUQENV Oui je suis un peu \u00e9nerv\u00e9 ca se voit? A bon? Et maintenant NUGGET ne fonctionne plus... j'en peux plus la. Je ne peux plus t\u00e9l\u00e9charger de librairie sur aucun de mes projets... J'ai tent\u00e9 de supprimer le fichier de config et red\u00e9marrer Visual Studio mais cela ne fait rien. J'ai aussi tent\u00e9 de faire un 'nugget restore' toujours rien. Bon apparemment je ne suis pas le seul qui ne peut pas acc\u00e8der \u00e0 Nuget donc bon c'est pas juste chez moi qu'il y a un soucis. Mais m\u00eame en mettant ma 4G pour me connecter, je n'arrive pas \u00e0 acc\u00e8der \u00e0 certains sites y compris Nuget et je ne peux pas download de librairies... Je ne comprends pas ce qui se passe et du coup je ne peux juste pas bosser... J'ai red\u00e9marr\u00e9 trois fois mon pc et visual studio, j'ai essay\u00e9 de changer mes settings DNS etc... impossible de bosser. Je crois que je n'aurais pas du me reveiller aujourd'hui. Bon je vais tenter d'avancer sur mon poster en attendant que le r\u00e9seau soit en meilleur \u00e9tat.","title":"Vendredi 28 Avril 2023"},{"location":"jdb.html#lundi-1-mai-2023","text":"Bon je bosse depuis chez moi donc j'esp\u00e8re que Nuget va mieux fonctionner. Apr\u00e8s un weekend \u00e0 r\u00e9fl\u00e9chir au sujet de cette resolution je me suis dit deux choses. La seule personne sur internet que j'ai vu avoir le meme soucis avait une r\u00e9solution de 1920x1200 comme moi. Cela veut donc s\u00fbrement dire que le soucis vient de cette r\u00e9solution de laptop comme moi. Si vraiment je n'arrive pas dans un premier temps \u00e0 faire fonctionner le Headless correctement, je peux toujours laisser la page de c\u00f4t\u00e9 et m'occuper du reste du programme. Certes ca serait vraiment infernal d'avoir \u00e0 garder une page chrome ouvert en tous temps et en plus elle doit \u00eatre en plein \u00e9cran mais bon... Si il n'y a vraiment pas d'autres solutions malheureusement je serai bien oblig\u00e9. BON ! JE N'ARRIVE MEME PLUS A FAIRE UN PROJET QUI UTILISE SELENIUM ET QUI MARCHE JE VAIS FAIRE BR\u00dbLER GENEVE. C'est pas possible serieux, je ne comprends pas j'essaie tout ce que je trouve et impossible de juste lancer firefox c'est du grand nimporte quoi. Je prend les m\u00eame putain de librairies que sur les autres projets les m\u00eames versions, je prend le m\u00eame exact code. Sur le nouveau projet impossible de le faire fonctionner. Je commence \u00e0 croire que on essaie de me faire p\u00eater un cable. Du coup dans un \u00e9lan de d\u00e9sespoir je vais tenter de passer sur une autre librairie qui avec un peu de chance marche et en plus me permettrais de prendre des foutues screenshot dans le bon format. Les deux seules librairies qui pourraient potentiellement faire l'affaire sont les librairies : PhantomJS CefSharp Je vais les tester et simplement prier pour qu'elles fonctionnent et que je puisse faire ce que je veux avec. Alors pour le moment avec CEFSharp j'arrive \u00e0 lancer une instance de chrome et prendre une screenshot avec ce code : CefSettings settings = new CefSettings (); settings . CachePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . LocalApplicationData ), \"CefSharp\\\\Cache\" ); // Set cache path settings . LogSeverity = LogSeverity . Disable ; // Disable logging Cef . Initialize ( settings ); // Initialize CEF using ( var browser = new ChromiumWebBrowser ( \"www.google.com\" , new BrowserSettings ())) // Launch Chromium in off-screen mode { browser . Load ( \"https://www.example.com\" ); // Navigate to the test URL browser . Size = new Size ( 1920 , 1080 ); // Set the browser size to 1920x1080 browser . ScreenshotAsync (). ContinueWith ( task => { var bitmap = task . Result ; bitmap . Save ( \"screenshot.png\" , System . Drawing . Imaging . ImageFormat . Png ); // Take a screenshot and save it as a PNG file }). Wait (); } Cef . Shutdown (); // Shutdown CEF Avec ca il faut ces using : using System ; using System.Drawing ; using System.IO ; using CefSharp ; using CefSharp.OffScreen ; C'est assez prometteur m\u00eame si il faut encore beaucoup pour remplacer selenium. Ah bah lol en fait non on peut pas utiliser cette librarie pour faire tourner firefox... J'EN AI MARRE J'AVAIS CHERCHE PRECISEMENT UNE LIB QUI MARCHE AVEC FIREFOX Et phantomJS non plus ne fonctionne pas avec firefox... J'en ai marre. Donc je vais plut\u00f4t partir sur la librairie GeckoFX qui semble pouvoir contr\u00f4ler une instance de firefox. Mais j'avais justement pris un putain de projet C# et pas JS pour ne pas me taper ces probl\u00e8mes de librairies... Et si cette option ne fonctionne pas mon dernier espoir sera de directement int\u00e9ragir avec le geckodriver.exe et la ca risque de pas \u00eatre dr\u00f4le. JE NE COMPRENDS RIEN !!!!! Ca n'a aucun sens la doc est inexistante le seul lien qui pourrait amener sur une doc envoie sur la page principale de bitbucket. Tous les exemples de code que je trouve ne fonctionnent pas. Je n'arrive \u00e0 rien je commence \u00e0 devenir fou. Tout ce travail pour rien c'est pas possible. M\u00eame en essayant directement d'int\u00e9ragir avec le process geckodriver.exe je ne peux pas arriver \u00e0 mes fins. J'arrive \u00e0 lancer le service et tout, mais je n'arrive pas \u00e0 vraiment contr\u00f4ler ce qu'il se passe donc impossible de venir prendre des screenshot. Je ne sais tout simplement pas quoi faire ... Je suis bloqu\u00e9. Je me suis cass\u00e9 la t\u00eate \u00e0 faire un truc qui marchait bien avec selenium et tout. Mais maintenant plus rien ne fonctionne du jour au lendemain et il n'y a simplement aucune alternative. Je vais essayer de changer directement le projet Selenium_Clean mais bon ca va pas \u00eatre dr\u00f4le. Ok alors j'ai tout repris depuis le d\u00e9but et je crois que j'ai enfin une solution. Pour la trouver j'ai re-essay\u00e9 toutes les techniques que j'avais tent\u00e9 avant mais dans l'ordre et en les isolant \u00e0 chaque fois. Cela inclus : Tenter de changer la densit\u00e9 de pixels. En effet je me suis dit que comme la r\u00e9solution \u00e9tait plus basse le soucis \u00e9tait que le virtual screen avait simplement une DPI r\u00e9duite. profile.SetPreference(\"layout.css.devPixelsPerPx\", \"2.0\"); J'ai aussi tent\u00e9 de r\u00e9duire \u00e0 un seule le nombre de process de Firefox. J'ai pu lire sur internet que parfois cela pouvait influer sur les performances du renderer. profile.SetPreference(\"dom.ipc.processCount\", 1); Ensuite j'ai tent\u00e9 tout b\u00eatement de rajouter dans la liste des arguments la taille voulue de l'\u00e9cran. options.AddArgument(\"--window-size=1920,1080\"); Mais comme cela ne foncionnait pas, je me suis rabattu sur un script JS pour tenter de forcer la fen\u00eatre \u00e0 \u00eatre plus grande. js.ExecuteScript(\"window.resizeTo(1920, 1080);\"); Comme cela n'a pas march\u00e9 j'ai pu lire que cela pouvait \u00eatre la taille int\u00e9rieure qui devait \u00eatre chang\u00e9e js.ExecuteScript(\"window.innerWidth = 1920; window.innerHeight = 1080;\"); Encore une fois sans succ\u00e8s. J'ai ensuite tent\u00e9 d'utiliser trois autres versions du GeckoDriver, 0.27,0.26,0.25 et aucune ne m'aidait. Mais en fait la seule chose qui a chang\u00e9 quoi que ce soit \u00e9tait la technique suivante : Changer la window size en utilisant : options . AddArgument ( \"--width=1920\" ); options . AddArgument ( \"--height=1200\" ); Ca ne marchait pas car j'utilisais une autre methode pour resize en m\u00eame temps, qui elle ne marchait pas mais qui emp\u00eachait celle la de marcher. Ensuite le soucis que j'avais c'est que en mettant 1920-1080 je me retrouvais avec 1920-998 ou un truc du genre ce qui n'\u00e9tait pas normal alors je me disais que cette technique ne marchait pas non plus et je l'ai pass\u00e9e. Alors tout n'est pas encore gagn\u00e9, il faut que j'arrive \u00e0 impl\u00e9menter ca dans un plus gros projet et que la vid\u00e9o puisse \u00eatre prise seule. Demain je m'occupe de ca.","title":"Lundi 1 Mai 2023"},{"location":"jdb.html#mardi-2-mai-2023","text":"Bon aujourd'hui je change le programme principal. Le soucis que j'ai c'est que en ajoutant ce syst\u00e8me de resize, maintenant la page fait 100x100 et est grise. Il doit y avoir une technique que j'ai oubli\u00e9 de retirer ou un comportement un peu bizarrre. Bon clairement je ne sais pas QUI DECIDE DE ME POURRIR LA VIE mais il est fort. J'ai t\u00e9l\u00e9charger EXACTEMENT les m\u00eames librairies que sur mon autre projet et j'utilise l'EXACT m\u00eame geckodriver.exe mais dans le projet principal impossible de lui faire chier une image m\u00eame avec l'EXACT m\u00eame code. POURQUOI VOUS ME FAITES CA????= La je ne comprend vraiment pas ce qui peut se passer pour que rien ne fonctionne alors que tout est pareil. JE VIENS DE TOUT VERIFIER TOUT EST PAREIL JE NE COMPRENDS PAS. Bon apr\u00e8s avoir supprim\u00e9 l'int\u00e9gralit\u00e9 de ma classe Emulator cela semble marcher un peu mieux. Je ne vais pas m'\u00e9tendre sur la castrophe niveau temps que cela repr\u00e9sente. Si au moins j'arrive \u00e0 faire fonctionner quelque chose je suis content. Maintenant j'ai un soucis un peu sp\u00e9cial. Depuis que j'ai chang\u00e9 la r\u00e9solution, il semble que le programme aie du mal \u00e0 cliquer sur l'icone de settings. En prenant des screenshots du moment ou l'erreur apparait, j'ai pu me rendre compte que en fait le stream est toujours en train de charger et c'est pour ca que on arrive pas \u00e0 trouver le bouton : \"ERROR 105\" \"ERROR 105\" Je pense que je n'ai le soucis que maintenant car le flux en 1080p se lance moins vite. Je vais essayer de voir si je peux detecter un \u00e9l\u00e9ment d'HTML qui correspond au loading comme ca je peux attendre qu'il disparaisse. Sinon je peux aussi juste essayer de trouver le bouton en boucle pendant une dixaine de secondes. Bon la j'essaie pendant genre plus de 50 secondes et ca ne marche toujours pas. Il semblerait que au final le probl\u00e8me vienne du GP d'azerbidjan. En effet, quand je teste un autre Grand Prix tout va bien. ET MERDE ! J'ai r\u00e9ussi \u00e0 avoir des images en 1080P mais d\u00e9s que je passe l'image en plein \u00e9cran c'est de nouveau du 1366X768 Avant de mettre en plein \u00e9cran: \"Before fullscreen\" Apr\u00e8s: \"After fullscreen\" On peut voir sur l'image que l'option 1080P est effectivement bien selectionn\u00e9e mais il doit y avoir un param\u00e8tre de Firefox qui s'occupe de la r\u00e9solution d'un player vid\u00e9o. Il va juste falloir trouver ce param\u00eatre... J'ai essay\u00e9 d'utiliser : Driver.Manage().Window.Size = new System.Drawing.Size(windowWidth, windowHeight); Sans succ\u00e8s. options.AddArgument(\"--start-maximized\"); Pareil Driver.Manage().Window.Maximize(); Toujours rien profile.SetPreference(\"full-screen-api.ignore-widgets\", true); Nada profile.SetPreference(\"media.hardware-video-decoding.enabled\", true); Toujours pas J'ai vraiment cru que j'avais trouv\u00e9 la solution en trouvant cette commande profile.SetPreference(\"full-screen-api.enabled\", true); Mais non toujours pas... Je commence \u00e0 perdre patience. C'EST BON. Apr\u00e8s litt\u00e9rallement 3h de debugging avec M.Bonvin (Que je remercie IMMENSEMENT) on a r\u00e9ussi \u00e0 trouver au fin fond d'un thread github que la valeur \u00e9tait hard cod\u00e9e dans les variables d'environnement et que donc quoi que je fasse je n'aurais pas pu le changer. En fait la seul moyen de tout r\u00e8gler a \u00e9t\u00e9 de changer les variables d'environnement de ma machine: MOZ_HEADLESS_WIDTH et MOZ_HEADLESS_HEIGHT . Et ce qu'il y a de bien c'est que maintenant je peux mettre de la 4K et cela permet de faire un meilleur upscaling.","title":"Mardi 2 Mai 2023"},{"location":"jdb.html#recrutement-payerne-mai-2023","text":"J'ai du faire mon recrutement \u00e0 Payerne Mercredi et Jeudi. Si vous \u00eates curieux je peux vous dire que comme il n'y avait presque plus de places cet \u00e9t\u00e9 je ferai Canonnier Lance mines. C'\u00e9tait assez frustrant d'avoir perdu deux jours de travail mais on va faire avec.","title":"Recrutement Payerne Mai 2023"},{"location":"jdb.html#vendredi-5-mai-2023","text":"Bon malgr\u00e9s les courbatures il faut que je me mette au boulot un peu serieusement par ce que sinon ca va \u00eatre compliqu\u00e9 de rattraper mon retard. La derni\u00e8re fois si je me souviens bien j'avais r\u00e9ussi \u00e0 trouver un moyen de prendres des images en bonne r\u00e9solution. Il faut maintenant que je commence \u00e0 faire fonctionner la calibration et ce qui serait bien ca serait que je commence \u00e0 ajouter la partie OCR au projet. Il faut que je me d\u00e9p\u00eache car Lundi je dois m'occuper du Poster. OK j'ai compris le soucis que j'avais quand j'essayais de faire la calibration. J'avais mis l'image en ZOOM ce qui fait que si la hauteur n'\u00e9tait pas la bonne, l'image \u00e9tait recentr\u00e9e ce qui fait que cela faussait totalement les r\u00e9sultats. Quand on fait en sorte que l'image prenne toute la place, les coordonn\u00e9es sont prises correctement. Voici un exemple d'ou en est la partie calibration. \"Exemple settings UI\" Normalement il me suffit d'impl\u00e9menter les windows, et on devrait relativement facilement ajouter les pilotes. Et voila. J'ai pu impl\u00e9menter les windows et les pilotes. Et je peux aussi exporter des presets et les loader. Bon le loading est un peu beugg\u00e9 au niveau de l'affichage mais il semble qu'il fonctionne bien quand je save les images. Lundi je m'occupe du poster etc.. mais je pense que la suite va \u00eatre l'impl\u00e9mentation de l'OCR.","title":"Vendredi 5 Mai 2023"},{"location":"jdb.html#lundi-8-mai-2023","text":"Aujourd'hui c'est journ\u00e9e Poster. Je pense que je ne vais pas finir la journ\u00e9e content car les limitations sont un peu trop pr\u00e9sentes. J'ai fait une version que Garcia pourrait accepter, c'est \u00e0 dire en noir et blanc et avec un tout petit peu plus de d\u00e9tail. \"Poster V3\" Le truc c'est que en blanc je trouve que ca ne marche pas super. Et le concept d'avoir trois parties au projet qui se posent autour d'un circuit c'est peut-\u00eatre pas la meilleure id\u00e9e. Je me suis dit que la bonne id\u00e9e serait peut-\u00eatre de prendre un autre circuit pour qu'il y aie bien trois parties : \"Poster V4\" Clairement ce poster doit faire partie des pires. C'est pas clair et ca part dans tous les sens. Je vais essayer avec un autre layout de circuit. \"Poster V5\" Je me suis ensuite dit que le circuit n'\u00e9tait peut \u00eatre tout simplement pas une bonne id\u00e9e. J'ai donc essay\u00e9 de faire quelque chose de plus classique avec juste un peu de background pour qu'on puisse \u00e9viter le soucis de la page blanche derri\u00e8re : \"Poster V6\" Puis je me suis dit que finalement le circuit me manquait. Alors j'ai d\u00e9cid\u00e9 de combiner le background et le circuit ainsi que simplifier l\u00e9g\u00e8rement les diagrammes en retouchant un peu tout le reste on pouvait arriver \u00e0 quelque chose de sympatique : \"Poster V7\" Je ne suis pas content \u00e0 100% mais bon je pense que je vais m'en satisfaire. Pour donner une id\u00e9e de la gal\u00e8re que c'est de cr\u00e9er un poster, voici ce \u00e0 quoi ressemble mon espace de travail Figma : \"Bordel Figma\" Je ne suis pas un graphiste et ca se voit '^^. Je pense que comme il me reste un peu de temps aujourd'hui, je vais faire un peu de documentation de la partie r\u00e9cup\u00e8ration d'images. En effet, je pense que je n'aurai plus besoin de changer grand chose \u00e0 ce niveau. Mais je ne ferai pas la partie analyse fonctionnelle car l'interface n'est clairement pas termin\u00e9e. En fait j'avais oubli\u00e9 mais j'ai eu un rendez vous m\u00e9dical du coup je n'ai pas eu trop le temps de faire la doc que je voulais. Mais au moins je pense avoir finit mon travail sur le poster et le abstract en Anglais qui sont les deux gros livrables \u00e0 venir.","title":"Lundi 8 Mai 2023"},{"location":"jdb.html#mardi-9-mai-2023","text":"Bon je viens de me rendre compte que apparemment on doit rendre l'abstract anglais, le Poster, ET LE PROJET. Je pense que mes deux jours \u00e0 l'arm\u00e9e m'ont fait perdre un peu la notion du temps car j'avais l'impression que l'evaluation interm\u00e9diaire 1 \u00e9tait il y a genre moins d'une semaine. Donc aujourd'hui je ne vais pas trop avancer sur le code et vraiment me focus sur la documentation de la r\u00e9cup\u00e8ration d'images. Je pense que je vais aussi ajouter la partie calibration \u00e0 la documentation. Je pense que c'est important que je prenne le temps maintenant car sinon le prof aura l'impression que ca n'a pas trop avanc\u00e9 depuis la derni\u00e8re fois. Et puis je pense que la partie calibration et r\u00e9cup\u00e8ration d'images ne va pas trop changer et la partie calibration encore moins. La partie anglaise je fais la revoir un peu mais je l'avais d\u00e9ja faite pendant les premiers jours alors ca devrait aller. Pour le rendu il nous \u00e9tait demand\u00e9 de fournir un fichier PDF avec tout dedans avec une table des mati\u00e8res notre code source etc... Pour ce faire j'ai du changer le mkdocs.yml et installer des packages. Voici les changements :: site_name: Documentation Track Trends site_author: Rohmer Maxime copyright: \u00a9CFPTI Tech2 theme: name: material palette: # Palette toggle for light mode - media: \"(prefers-color-scheme: light)\" scheme: default toggle: icon: material/brightness-7 name: Switch to dark mode # Palette toggle for dark mode - media: \"(prefers-color-scheme: dark)\" scheme: slate toggle: icon: material/brightness-4 name: Switch to light mode markdown_extensions: - attr_list - md_in_html - pymdownx.highlight plugins: - glightbox - search - img2fig - with-pdf: cover_subtitle: Vroum Vroum enabled_if_env: ENABLE_PDF_EXPORT - annexes-integration: annexes: # Required (at least 1) - ConfigurationTool.cs: Code/ConfigurationTool.cs # An path to an annex with its title - DriverGapToLeaderWindow.cs: Code/DriverGapToLeaderWindow.cs # An path to an annex with its title - DriverPositionWindow.cs: Code/DriverPositionWindow.cs # An path to an annex with its title - F1TVEmulator.cs: Code/F1TVEmulator.cs # An path to an annex with its title - Program.cs: Code/Program.cs # An path to an annex with its title - Window.cs: Code/Window.cs # An path to an annex with its title - DriverData.cs: Code/DriverData.cs # An path to an annex with its title - DriverLapTimeWindow.cs: Code/DriverLapTimeWindow.cs # An path to an annex with its title - DriverSectorWindow.cs: Code/DriverSectorWindow.cs # An path to an annex with its title - Form1.cs: Code/Form1.cs # An path to an annex with its title - Reader.cs: Code/Reader.cs # An path to an annex with its title - Zone.cs: Code/Zone.cs # An path to an annex with its title - DriverDrsWindow.cs: Code/DriverDrsWindow.cs # An path to an annex with its title - DriverNameWindow.cs: Code/DriverNameWindow.cs # An path to an annex with its title - DriverTyresWindow.cs: Code/DriverTyresWindow.cs # An path to an annex with its title - OcrImage.cs: Code/OcrImage.cs # An path to an annex with its title - Settings.cs: Code/Settings.cs # An path to an annex with its title - recoverCookiesCSV.py: Code/recoverCookiesCSV.py # An path to an annex with its title Je remercie Monsieur Briard le sultan officiel de Mkdocs de la classe de m'avoir aid\u00e9 pour cette partie et avoir cr\u00e9\u00e9 un plugin qui me permet de mettre mon code source directement dans le pdf. Bon au final j'ai quand m\u00eame chang\u00e9 mon poster \"Poster V8\" Mais je suis trop attach\u00e9 \u00e0 l'ancien concept alors je vais plut\u00f4t utiliser ca : \"Poster V9\" Je pense que cette version est meilleure m\u00eame si elle est encore plus en bordel par ce que le texte permet de se faire une meilleure id\u00e9e de l'utilis\u00e9 de chaque partie.","title":"Mardi 9 Mai 2023"},{"location":"jdb.html#mercredi-10-mai-2023","text":"Bon hier je n'ai pas eu le temps de finir la documentation de la recup\u00e8ration d'images et de la calibration. Il faudra donc que je repasse un coup dessus en fin de semaine je pense. Mais la j'aimerais avancer sur la mise en commun du projet, comme la configuration fonctionne plut\u00f4t pas mal je pense que je vais juste vite fait aller commenter les methodes qui ne le sont pas encore et ensuite je vais passer \u00e0 l'impl\u00e9mentation de l'OCR. Je suis presque certain que l'OCR va avoir besoin de plus de r\u00e8glages mais bon on verra bien. Je me rend compte en commentant que la methode de load serait plus efficace avec un tout petit peu plus d'infos de la part du JSON. J'aurais pu ajouter l'offset entre chaque Driver Zone pour eviter un l\u00e8ger drift lors de la reconstruction. Mais bon rien de grave donc je pense que je vais le laisser comme ca pour le moment \u00e0 moins que ca me pose soucis plus tard. J'ai eu quelques soucis avec les images en 4K. Du coup j'ai descendu les variables d'environnement \u00e0 1920x1080 En fait il y a parfois un soucis un peu p\u00e9nible avec l'OCR. Parfois pour un temps comme ci dessous: \"1:45.140\" Le programme ne va pas bien comprendre les ponctuations et il va donner : 1115140 La il y a deux probl\u00e8mes... Le 1:xx.xxx est compris comme 11xxxxx et le 4 s'est transform\u00e9 en 1... J'ai cr\u00e9\u00e9 ce \"petit\" bout de code pour g\u00e8rer les fois ou les '.' et les ':' ont mal \u00e9t\u00e9 interpr\u00eat\u00e9s if ( rawNumbers . Count == 1 ) { //If this code is used it means that its bad ... //The methods that comes are really not that great and are juste quick fixes try { result = Convert . ToInt32 ( rawNumbers [ 0 ]); switch ( windowType ) { case OcrImage . WindowType . Sector : //The usual sector is in this form : 33.456 if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' has been understood like a number result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ]); } if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ]); } break ; case OcrImage . WindowType . LapTime : //The usual Lap time is in this form : 1:45:345 if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' and ':' have been overlooked //I Know Im skipping the cases where there are more than 9 minuts but it happens so rarely that... we dont care result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ] + rawNumbers [ 0 ][ 2 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ]); } if ( rawNumbers [ 0 ]. Length == 7 ) { //There is two possibilities //Either 1:45.140 has been interpreted as 1145.10 or 1:451140. We will assume its the first one result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ] + rawNumbers [ 0 ][ 6 ]); } break ; case OcrImage . WindowType . Gap : //The usual Gap is in this form : + 34.567 if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ]); } break ; } if ( rawNumbers [ 0 ]. Length > 6 ) { //The number definitely has been interpreted wrong } } catch { //It can be because the input is empty or because its the LEADER bracket result = 0 ; } } else { //Auuuugh result = 0 ; } ConfigFile = \"./Presets/Clean_2023.json\" ; string gpUrl = \"https://f1tv.formula1.com/detail/1000006688/2023-azerbaijan-grand-prix?action=play\" ; Bon je n'arrive pas \u00e0 faire fonctionner l'OCR sans tout faire crash \u00e0 chaque fois. Je vais abandonner le travail de la journ\u00e9e pour revenir au point initial... C'est tr\u00e8s frustrant mais bon je ne vois pas comment faire mieux. Rien ne marche alors qu'avant ca marchant super sur le projet OCR normal. Va savoir pourquoi m\u00eame comme ca, impossible de faire marcher l'OCR. Il y a un soucis au niveau de l'ASYNC qui me fait crash tout le temps en me disant qu'un objet est deja en train d'\u00eatre utilis\u00e9. Ca marchait nikel dans mes premi\u00e8res version je ne vois pas pourquoi ca p\u00eate maintenant. Je pense que je vois \u00e0 peu pr\u00e8s le soucis. public virtual async Task < DriverData > Decode ( List < string > driverList ) { int sectorCount = 0 ; DriverData result = new DriverData (); Parallel . ForEach ( Windows , async w => { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) result . Name = ( string ) await ( w as DriverNameWindow ). DecodePng ( driverList ); if ( w is DriverDrsWindow ) result . DRS = ( bool ) await ( w as DriverDrsWindow ). DecodePng (); if ( w is DriverGapToLeaderWindow ) result . GapToLeader = ( int ) await ( w as DriverGapToLeaderWindow ). DecodePng (); if ( w is DriverLapTimeWindow ) result . LapTime = ( int ) await ( w as DriverLapTimeWindow ). DecodePng (); if ( w is DriverPositionWindow ) result . Position = ( int ) await ( w as DriverPositionWindow ). DecodePng (); if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) result . Sector1 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 2 ) result . Sector2 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 3 ) result . Sector3 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); } if ( w is DriverTyresWindow ) result . CurrentTyre = ( Tyre ) await ( w as DriverTyresWindow ). DecodePng (); }); return result ; } Ca c'est ma methode de decoding de chaque Driver Zone. Le message d'erreur me parle d'une windowImage quand il dit qu'un objet est d\u00e9ja utilis\u00e9. Ma conjecture c'est que en essayant de faire toutes les windows en m\u00eame temps. Elles veulent parfois acc\u00e8der \u00e0 l'image principale en m\u00eame temps. Ce qui evidemment pose probl\u00e8me. Je pense que le fix le plus simple serait de faire le traitement sans le parallele quitte \u00e0 exporter ce fonctionnement sur chaque zone en elle m\u00eame pour ne pas perdre trop de performances. Ok je crois que je vois ou est le soucis. En fait dans cette version du programme c'est toujours la premi\u00e8re image qui \u00e9tait juste tout le temps prise et dans la premi\u00e8re image on a une partie des chiffres qui est bloqu\u00e9e par l'UI de la fen\u00eatre... lol... EN FAIT J'avais un soucis dans ma gestion des chiffres mal faits. Visiblement parfois quand je ne prenais pas en compte un :, un LapTime etait compris comme un Gap to leader ou un Secteur Bon j'en ai tellement marre... Je n'arrive tout simplement PAS \u00e0 faire fonctionner l'OCR ca crash tout le temps j'en peux plus. J'ai tent\u00e9 de r\u00e8gler les probl\u00e8mes de mauvaises detections de secteurs et temps au tour qui font crasher l'app : if ( rawNumbers . Count == 2 ) { //ss:ms result = ( Convert . ToInt32 ( rawNumbers [ 0 ]) * 1000 ) + Convert . ToInt32 ( rawNumbers [ 1 ]); if ( result > ( 60000 + 999 )) { if ( windowType == OcrImage . WindowType . LapTime ) { result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 1 ]); } if ( windowType == OcrImage . WindowType . Sector ) { int seconds = 0 ; if ( rawNumbers [ 0 ]. Length == 3 ) { //We have one char that we need to delete //For no apparent reason im going to delete the first seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); } else { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); } int ms = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); result = seconds * 1000 + ms ; } } } Mais toujours impossible de faire fonctionner cette M**** C'est juste infernal. Je pense que je vais encore tout retirer et remplacer par ce que j'ai dans mon projet OCR original. Donc c'est une journ\u00e9e de perdue compl\u00eatement... C'est extr\u00eamement frustrant. Apr\u00e8s des heures de debug j'ai enfin r\u00e9ussi \u00e0 faire fonctionner le programme de temps en temps. Mais j'ai toujours le soucis que l'image ne veut pas changer alors que je fais tout pour et que l'OCR est nulle \u00e0 chier du coup...","title":"Mercredi 10 Mai 2023"},{"location":"jdb.html#jeudi-11-mai-2023","text":"Bon apr\u00e8s une bonne nuit de sommeil je vais reprendre les choses depuis le d\u00e9but. J'ai deux soucis : L'OCR pue du derche L'Image que l'on d\u00e9code ne change pas Pour la premi\u00e8re partie j'ai ma petite th\u00e9orie. Je pense que comme je donne des images 4K alors que le feed est en 1080P, il y a d\u00e9ja un genre d'interpolation qui est faite. Je pense donc qu'il faut que j'adapte mon engine pour qu'il fonctionne avec cette r\u00e9solution. Je me suis demand\u00e9 si ca n'\u00e9tait pas mieux de prendre en compte les deux r\u00e9solutions pour les pc un peu moins bal\u00e8zes et j'ai d\u00e9cid\u00e9 de n'en avoir rien a faire. On verra dans le futur si c'est une feature que je voudrais ajouter mais c'est en dehors du scope du dipl\u00f4me je pense. Pour la seconde partie, je pense qu'il faut que j'aille voir du c\u00f4te de OCR_Decode et de OCR Tester pour voir comment je faisais. Je dois forc\u00e9ment oublier un truc. Bon ca commence mal, quand je vais voir dans le projet OCR_Decode, le changement d'image est exactement le m\u00eame et il fonctionne alors que de mon c\u00f4t\u00e9 ca n'est pas le cas. Alors deux choses. Je me rend compte que le changement d'images n'a AUCUN effet sur la detection de texte, et seconde chose, le d\u00e9calage est trop grand entre les windows. Des que le soucis d'image est r\u00e8gl\u00e9 il va falloir que je change drastiquement ma facon de stocker la config en JSON. Il faut que je conserve les \u00e9carts. Sinon regardez ce que ca donne quand on arrive au dernier pilote : \"Zone de pilote d\u00e9cal\u00e9e\" Je commence \u00e0 devenir FOU. Je n'arrive pas \u00e0 changer cette foutue image wtf... J'ai beau tenter par tous les moyens de la changer par une image noire, l'image semble toujours rester celle du d\u00e9part. Bon j'ai enfin trouv\u00e9 pourquoi et je n'ai pas envie de dire comment j'ai trouv\u00e9... Je pense que l'on a tous droit \u00e0 son petit jardin secret. Maintenant ca veut dire que je peux me focus sur le concept important qui est le changement de la cr\u00e9ation et de la lecture des JSON. Voici un exemple de preset JSON : { \"Main\" : { \"x\" : 40 , \"y\" : 355 , \"width\" : 3784 , \"height\" : 1438 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : -10 , \"width\" : 3784 , \"height\" : 71 , \"Windows\" : [ { \"Position\" : { \"x\" : 47 , \"y\" : 11 , \"width\" : 72 }, \"GapToLeader\" : { \"x\" : 445 , \"y\" : 13 , \"width\" : 201 }, \"LapTime\" : { \"x\" : 859 , \"y\" : 14 , \"width\" : 221 }, \"DRS\" : { \"x\" : 1094 , \"y\" : 13 , \"width\" : 173 }, \"Tyres\" : { \"x\" : 1270 , \"y\" : 11 , \"width\" : 1452 }, \"Name\" : { \"x\" : 2727 , \"y\" : 11 , \"width\" : 351 }, \"Sector1\" : { \"x\" : 3083 , \"y\" : 10 , \"width\" : 253 }, \"Sector2\" : { \"x\" : 3339 , \"y\" : 14 , \"width\" : 195 }, \"Sector3\" : { \"x\" : 3518 , \"y\" : 14 , \"width\" : 250 } } ] } } ] }, \"Drivers\" : [ \"Perez\" , \"Leclerc\" , \"Sainz\" , \"Alonso\" , \"Stroll\" , \"Russel\" , \"Verstappen\" , \"Zhou\" , \"Ocon\" , \"Hulkenberg\" , \"Hamilton\" , \"Norris\" , \"Tsunoda\" , \"Magnussen\" , \"Piastri\" , \"Albon\" , \"Gasly\" , \"Sargeant\" , \"Bottas\" , \"De Vries\" ] } Je pense que ce qui serait bien ce serait de rajouter un \"offsets\" qui contienne les 19 \u00e9carts restants. Bon... la structure de ma fabrication de JSON etait trop confuse je trouve alors je l'ai compl\u00eatement refaite. J'ai aussi abandonn\u00e9 l'id\u00e9e de faire un fichier le plus petit possible car au final on s'en fiche et le plus important c'est que toutes les windows et les zones soient aux bons endroits. Ca nous fait un fichier d'environs 1300 lignes mais au moins le code pour la serialisation est plut\u00f4t clean : public void SaveToJson ( List < string > drivers , string configName ) { string JSON = \"\" ; JsonObject jsonFileObject = new JsonObject (); //Creating the mainZone object JsonObject mainZoneObject = new JsonObject (); mainZoneObject . Add ( \"x\" , MainZone . Bounds . X ); mainZoneObject . Add ( \"y\" , MainZone . Bounds . Y ); mainZoneObject . Add ( \"width\" , MainZone . Bounds . Width ); mainZoneObject . Add ( \"height\" , MainZone . Bounds . Height ); JsonArray driverZonesArray = new JsonArray (); int DriverID = 0 ; foreach ( Zone driverZone in MainZone . Zones ) { DriverID ++; JsonObject driverZoneObject = new JsonObject (); driverZoneObject . Add ( \"name\" , \"Driver\" + DriverID ); driverZoneObject . Add ( \"x\" , driverZone . Bounds . X ); driverZoneObject . Add ( \"y\" , driverZone . Bounds . Y ); driverZoneObject . Add ( \"width\" , driverZone . Bounds . Width ); driverZoneObject . Add ( \"height\" , driverZone . Bounds . Height ); JsonArray windowsArray = new JsonArray (); JsonObject windowObject = new JsonObject (); foreach ( Window window in driverZone . Windows ) { windowObject . Add ( window . Name , new JsonObject { { \"x\" , window . Bounds . X }, { \"y\" , window . Bounds . Y }, { \"width\" , window . Bounds . Width }, { \"height\" , window . Bounds . Height } }); } windowsArray . Add ( windowObject ); driverZoneObject . Add ( \"Windows\" , windowsArray ); driverZonesArray . Add ( driverZoneObject ); } mainZoneObject . Add ( \"DriverZones\" , driverZonesArray ); JsonArray driversArray = new JsonArray (); foreach ( string driver in drivers ) { driversArray . Add ( driver ); } mainZoneObject . Add ( \"Drivers\" , driversArray ); jsonFileObject . Add ( \"Main\" , mainZoneObject ); JSON = jsonFileObject . ToString (); //Saving the file string path = CONFIGS_FOLDER_NAME + configName ; if ( File . Exists ( path + \".json\" )) { //We need to create a new name int count = 2 ; while ( File . Exists ( path + \"_\" + count + \".json\" )) { count ++; } path += \"_\" + count + \".json\" ; } else { path += \".json\" ; } File . WriteAllText ( path , JSON ); } Et normalement la lecture devrait \u00eatre encore plus simple. En fait c'\u00e9tait pas beaucoup plus simple mais au moins maintenant ca marche. Je vais pas mettre le code de lecture ici car c'est un peu trop long donc il va falloir me croire sur parole. (Ou aller sur Git) Bon bah on est au m\u00eame endroit qu'hier... Bon pour demain le plan de bataille ca va \u00eatre : Changer compl\u00eatement la methode \"GetTimeFromPng\" pour qu'elle prenne en compte toutes les possibilit\u00e9s de bugs et d'oubli de '.' ou de ':' mais pas selon le nombre de blocs mais selon le type de temps que l'on cherche Pour le moment je regarde le nombre de blocs et si il y en a deux alors c'est que c'est un temps de secteur. En fait non cela peut aussi \u00eatre un temps au tour qui a rat\u00e9 un point. Il faut que je bosse juste un peu vite fait la dessus et que j'arr\u00eate de putain de crasher d\u00e8s que un truc est pas au bon format. Ensuite quand ca aura arr\u00eat\u00e9 de crasher je vais reprendre l'OCR et voir pourquoi les resultats sont nuls a chier comme ca. Et le but c'est que demain soir j'ai une reconnaissance de caract\u00e8res plus proche de ce que j'avais dans d'autres projets... J'y croit 0 mais bon l'espoir fait vivre comme on dit.","title":"Jeudi 11 Mai 2023"},{"location":"jdb.html#vendredi-12-mai-2023","text":"Bon aujourd'hui il faut que ca marche. On va y aller par \u00e9tape. Je vais revoir toutes les methodes d'OCR et essayer de r\u00e9apliquer les filtres differemment et revenir au point de d\u00e9part. Avant de commencer je note plusieurs soucis avec les premiers tests : Les positions des pilotes ont l'air pas mal (Pas besoin de tout changer mais peut-\u00eatre simplement checker que les filtres sont bons) L'\u00e9cart avec le leader est \u00e9tonnamment pas mal aussi Le temps au tour est tout simplement horrible. Aucun n'est juste et de tr\u00e8s loin m\u00eame si les d\u00e9cimales ne sont pas forc\u00e9ment loin Le DRS je n'ai pas eu l'occasion de bien le tester mais je dirais que ca devrait \u00eatre bon (\u00e0 verifier quand le reste sera bon) Les pneus ne sont \u00e9tonnamment pas SI horribles, m\u00eame si parfois les lettres sont prises comme des chiffres Les noms de pilotes sont tr\u00e8s bon (pas \u00e9tonnant vu le syst\u00e8me de distance de Levenstein donc ca m\u00e9rite quand m\u00eame un petit check) Les secteurs sont en g\u00e9n\u00e9ral horribles mais pas toujours. C'est peut-\u00eatre un soucis de d\u00e9cimale ou des 4 qui se transforment en 1 J'ai remarqu\u00e9 que les 4 sont souvent pris comme des 1. Peut-\u00eatre que en ayant des images 4K l'interpolation est un peu diff\u00e9rente de ce que j'ai l'habitude de voir. Mais donc le plan aujourd'hui c'est de checker tous ces points et les faire fonctionner (youpi...) J'ai d\u00e9sactiv\u00e9 toutes les methodes de cette facon : int sectorCount = 0 ; DriverData result = new DriverData (); foreach ( Window w in Windows ) { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) //result.Name = (string)await (w as DriverNameWindow).DecodePng(driverList); result . Name = \"Unknown\" ; if ( w is DriverDrsWindow ) //result.DRS = (bool)await (w as DriverDrsWindow).DecodePng(); result . DRS = false ; if ( w is DriverGapToLeaderWindow ) //result.GapToLeader = (int)await (w as DriverGapToLeaderWindow).DecodePng(); result . GapToLeader = 0 ; if ( w is DriverLapTimeWindow ) //result.LapTime = (int)await (w as DriverLapTimeWindow).DecodePng(); result . LapTime = 0 ; if ( w is DriverPositionWindow ) //result.Position = (int)await (w as DriverPositionWindow).DecodePng(); result . Position = 0 ; if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) //result.Sector1 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector1 = 0 ; if ( sectorCount == 2 ) //result.Sector2 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector2 = 0 ; if ( sectorCount == 3 ) //result.Sector3 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector3 = 0 ; } if ( w is DriverTyresWindow ) //result.CurrentTyre = (Tyre)await (w as DriverTyresWindow).DecodePng(); result . CurrentTyre = new Tyre ( Tyre . Type . Undefined , 0 ); } return result ; Le but c'est que ensuite je puisse y aller \u00e9tape par \u00e9tape. Position : Alors pour cette reconnaissance je dirais que la 4K fait des merveilles qui permettent de retirer du processing. La position apr\u00e8s un simple Treshold est assez bien reconnue et la dilataion et/ou Erosion ne sont pas nescessaires finalement. On va donc pouvoir gagner un certain temps et c'est un bon signe pour la suite. On peut aussi noter que quand un pilote est hors course toutes ses valeurs sont gris\u00e9es et sa position est prise comme un -1 Sectors, alors j'ai refait toute la partie qui concerne les secteurs et qui les nettoie. Et je me suis rendu compte qu'ils \u00e9taient bien souvent juste, le seul truc c'est que ils s'affichent de mani\u00e8re un peu sp\u00e9ciale. En fait dans la page de la F1TV les secteurs peuvent faire plus de 60 secondes sans passer sur un affichage de minutes. Ce qui fait que c'est un peu bizarre \u00e0 regarder mais c'est parfaitement juste. J'ai aussi pu simplifier la reconnaissance gr\u00e2ce \u00e0 l'image de meilleure qualit\u00e9 et maintenant les temps de secteur sont plut\u00f4t corrects. En fait le plus long et complexe c'est de pr\u00e9voir les cas particuliers ou un '.' a \u00e9t\u00e9 mal interpr\u00eat\u00e9... Et en parlant de ca, je vais aller m'occuper des temps au tour qui ajoutent une couche de complexit\u00e9 avec un '.' ET un ':' qui peuvent \u00eatre oubli\u00e9s... Oh et j'y pense, un truc malin pourrait \u00eatre de comparer les temps au tour et les temps de secteur. Ils devraient concorder normalement je pense. Ok je viens de finir la gestion des temps au tour... J'ai un code de genre 170 lignes pour juste nettoyer le resultat dans le cas ou des '.' n'ont pas \u00e9t\u00e9 trouv\u00e9s ou des ':' ont \u00e9t\u00e9 n'ont pas \u00e9t\u00e9 trouv\u00e9 ou si l'un des deux s'est transform\u00e9 en chiffre etc.. etc.. etc.. Le soucis c'est que la maintenant je me rend compte que les \u00e9carts entre les pilotes vont juste \u00eatre un enfer \u00e0 nettoyer... Ils peuvent aussi bien \u00eatre \"0.760\" comme \"1:34.456\" du coup... je sais pas vraiment comment faire pour tout nettoyer. Je pense que je vais juste en avoir rien \u00e0 faire et tant pis si de temps en temps c'est pas g\u00e9nial. Bon du coup j'ai pas pris en compte TOUS les cas possibles mais d\u00e9ja un certain nombre et c'est d\u00e9ja pas mal. Sur les diff\u00e9rents Grand Prix d'exemples ca a l'air de plut\u00f4t bien tourner ! Mais ca demande tellement de tests et de code que c'est un peu ridicule... La methode \"GetTimeFromPng\" fait d\u00e9ja presque 430 lignes \u00e0 cause de tous les cas possibles et tous les try catch. Ca peut para\u00eetre peu \u00e9l\u00e9gant mais j'ai essay\u00e9 de mettre des commentaires un peu partout pour permettre \u00e0 nimporte qui de comprendre ce qui se passe. J'ai aussi pu faire les pneus et maintenant (roulement de tambour) Ca marche (presque) En fait j'ai des soucis parfois quand les pneus sont un peu cach\u00e9s dans les permiers tours : Pneus cach\u00e9s Le soucis c'est que du coup le chiffre est un peu illisible... mais je pense que avec l'historique il devrait y avoir moyen de ne pas prendre en compte les chiffres de pneus pendant cinq tours apr\u00e8s le changement de pneu ou de simplement tenter de faire les calculs de pneus. Pour conclure la journ\u00e9e je pense que je devrais avoir le temps de faire un syst\u00e8me qui permet de refresh \u00e0 volont\u00e9. Par contre je viens de d\u00e9couvrir que quand un temps de secteur est en couleur on arrive pas \u00e0 le lire. Ah et la detection prend un peu moins de trois secondes sur mon pc je crois. Mais c'est seulement si les driver zones sont faites en m\u00eame temps mais en faisant ca de temps en temps ca crash et \u00e0 chaques fois c'est d'un endroit diff\u00e9rent du coup je comprend pas vraiment. Sinon ca prend dix secondes.","title":"vendredi 12 Mai 2023"},{"location":"jdb.html#lundi-15-mai-2023","text":"Aujourd'hui c'est journ\u00e9e poster et visites. Comme on va avoir des visites de premi\u00e8res ann\u00e9es voire de terminales et que le soir c'est visite des parents. Je pense que j'ai finit de tout regrouper (\u00e0 part \u00e9videmment le traitement et le stockage des donn\u00e9es) ce qui veut dire que je suis pas dans une superbe posture. Il va falloir que je sois tr\u00e8s efficace dans la partie stockage de donn\u00e9es et mise en place du mod\u00e8le si je veux avoir une chance de rendre un joli travail de dipl\u00f4me. (et m\u00eame comme ca je peux voir que le temps commence \u00e0 manquer) Dans l'id\u00e9al je devrais avoir termin\u00e9 la partie stockage jeudi... Ce qui veut dire que je n'ai que trois jours pour le faire et que en plus jeudi je dois travailler depuis la maison. Ca va pas \u00eatre simple. Mais aujourd'hui je vais m'occuper d'adapter la documentation de l'OCR et faire la documentation de toute la partie r\u00e9cup\u00e8ration d'images et de la calibration. Bon au final la journ\u00e9e a \u00e9t\u00e9 un peu difficile. On a pas vraiment pu travailler l'apr\u00e8s midi car il a fallu pr\u00e9senter le projet environs 10 fois \u00e0 toutes les classes et \u00e0 des parents voire futurs experts. Les d\u00e9mos ont plut\u00f4t bien fonctionn\u00e9es j'en suis assez content. Mais ca veut dire que la partie doc a pas forc\u00e9ment pu \u00eatre totalement compl\u00eat\u00e9e mais demain il va falloir que je m'occupe de la suite du projet.","title":"Lundi 15 Mai 2023"},{"location":"jdb.html#mardi-16-mai-2023","text":"Bon aujourd'hui c'est la partie stockage qui doit \u00eatre faite. Il y a plusieurs solutions possibles \u00e0 ce probl\u00e8me. Mais comme je n'ai besoin que d'une base de donn\u00e9e locale et que je ne veux pas que chaque utilisateur doive installer un serveur sur sa machine je pense que je vais utiliser une base de donn\u00e9es SQLITE. Il y a eu une petit intervention de mr Bonvin qui est venu me donner une id\u00e9e pour la partie OCR. En fait j'avais un soucis quand je voulais d\u00e9coder du texte de couleur. M\u00eame en appliquant un filtre de gris je n'arrivais pas \u00e0 faire reconnaitre les chiffres. Et il m'a dit que une bonne id\u00e9e cela pourrait de prendre la valeur max de chaque channel et de la faire appliquer \u00e0 tous ce qui blanchit assez bien l'image. J'ai d\u00e9cid\u00e9 d'exag\u00e8rer le blanchiment et cela donne des r\u00e9sultats plut\u00f4t... int\u00e9ressants... \"Filtre vanish oxy action sur un secteur violet\" Le soucis c'est que le violet est une couleur quand m\u00eame assez sombre alors il va falloir que je fasse un syst\u00e8me de treshold un peu sp\u00e9cial qui soit un peu plus sympa et qui prenne plus facilement des couleurs plus basses. Une methode \u00e0 laquelle j'ai pens\u00e9 pour detecter dans quel tour chaque pilote est serait de garder en m\u00e9moire toutes les infos de chaques pilotes au fur et \u00e0 mesure, et d\u00e8s qu'on ne recoit plus d'infos des secteurs ou que le temps au tour a chang\u00e9 on peut savoir qu'il faut passer au tour suivant. Pour detecter les arr\u00eats aux stands je peux essayer de detecter un changement de type de pneus ou de nombre de tours detect\u00e9s sur le m\u00eame pneu Au d\u00e9part je me disais que je pourrais peut-\u00eatre faire une base de donn\u00e9e SQLITE locale qui puisse \u00eatre reprise d'un Grand Prix \u00e0 un autre. Mais je me suis dit que de faire des statistiques inter Grand Prix \u00e9tait un peu en dehors du scope du projet. La base de donn\u00e9e sera donc cr\u00e9\u00e9e \u00e0 chaque d\u00e9marrage de l'app La mani\u00e8re dont je vois les choses en ce moment est qu'on aie deux sources de donn\u00e9es dans l'affichage final. On aurait une partie des infos qui seraient en direct depuis la detection : Les ecarts entre pilotes La position des pilotes Le dernier temps au tour Les derniers secteurs Les pneus Mais on aurait aussi des rubriques cr\u00e9\u00e9es de toutes pi\u00e8ces par des infos qui viennent de la BD Voici les rubriques qui pourraient \u00eatre int\u00e9ressantes \u00e0 voir dans l'interface finale : Les 3 ou 5 pilotes les plus rapides ces cinq derniers tours Le pilote qui a le plus fait de d\u00e9passements Les batailles en cours Les 3 pilotes les plus lents Un classement pond\u00e9r\u00e9 avec les 20s de moins pour tous les pilotes qui ne se sont pas encore arr\u00eat\u00e9s En gros l'id\u00e9e serait que on update une fois par tour et par pilote la base de donn\u00e9e avec des infos comme le temps au tour, le type de pneu etc... Voici les trois tables que je vais cr\u00e9er : Drivers Colonne Type de Data Description Tag ID INTEGER ID du pilote PRIMARY Name VARCHAR Nom du pilote NOT NULL Pitstops Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui a effectu\u00e9 le Pitstop PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL Stats Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui concern\u00e9 PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL LapTime INTEGER Temps au tour (MS) NOT NULL Sector1 INTEGER Temps du secteur 1 (MS) NOT NULL Sector2 INTEGER Temps du secteur 2 (MS) NOT NULL Sector3 INTEGER Temps du secteur 3 (MS) NOT NULL GapToLeader INTEGER Ecart avec le leader (MS) NOT NULL Position INTEGER Position pilote NOT NULL Ca n'est pas forc\u00e9ment d\u00e9finitif mais je pense que c'est d\u00e9ja un bon d\u00e9but pour faire des rubriques sympa. Je suis en train de tenter d'impl\u00e9menter le code pour permettre ensuite d'ajouter et retirer des choses facilement.","title":"Mardi 16 Mai 2023"},{"location":"jdb.html#mercredi-17-mai-2023","text":"Aujourd'hui le but c'est de remplir la base SQLITE avec des infos. Si j'arrive \u00e0 tout remplir alors ca devrait pas \u00eatre trop compliqu\u00e9 de venir faire des requ\u00e8tes qui donnent de bonnes infos. Mais la probl\u00e9matique principale va \u00eatre de d\u00e9cider QUAND ins\u00e8rer des choses dans la base de donn\u00e9e. Je pense que le meilleur moyen serait de garder une liste de DriverData par pilote en piste qui puisse contenir toutes les data que l'on recoit. Et \u00e0 chaques fois que l'on veut ajouter \u00e0 cette liste on v\u00e9rifie si un tour a \u00e9t\u00e9 fait pour envoyer les data pr\u00e9c\u00e9dente et r\u00e9initialiser la liste. Il faut donc une liste de 20 listes de DriverData et une liste de int qui repr\u00e9senteront le num\u00e9ro du tour dans lequel chaque pilote se trouve. Pour detecter un arr\u00eat je pense que la meilleure mani\u00e8re est de regarder si le pilote a chang\u00e9 de place ou de type de pneu. Si je prend que les fois ou le pilote change place ET de pneus alors certains arr\u00eats pour ceux qui sont loins devant ou loins derri\u00e8re pourraient ne pas \u00eatre detect\u00e9s. Et si je ne prend que le changement de pneus cela pose un soucis car un pneu pourrait avoir \u00e9t\u00e9 chang\u00e9 pour un autre du m\u00eame type. Et parfois les valeurs de tours faits avec le pneu ne sont pas toujours bien lues et parfois sont compliqu\u00e9es \u00e0 retrouver car tous les pneus ne sont pas neuf quand ils sont chauss\u00e9s. Je crois que la detection de tours et des arr\u00eats aux stands est sur la bonne voie. Le seul soucis que j'ai c'est que pour faire du debug je suis un peu oblig\u00e9 d'attendre pendant 10min si je veux avoir de quoi faire des stats un peu sympa. Je me rend compte que parfois j'obtiens des r\u00e9sultats un peu bizarres mais que c'est la f1TV qui les donne. Par exemple de cas ou Alex Albon n'a que deux tours sur ses pneus alors que tout le monde devant et derri\u00e8re lui en a 3 et que on est au tour 4. \"wtf...?\" Ah et aussi parfois quand les pilotes se d\u00e9passent on se retrouve dans des situations plut\u00f4t rigolotes : \"Wtf...??\" COMMENT JE FAIS POUR DETECTER CA WIONDVIDNJDODVNSDIC Bon je me rend compte que clairement si je veux que mes data soient plus utiles il faudrait que je fasse un tout petit peu plus de taff sur quelques points dans l'OCR. Le nombre de tours des pneus (Les num\u00e9ros sont vraiment mal detect\u00e9s et parfois m\u00eame la couleur est pas dingue) Les 4 qui sont pris pour des 1 ou des 11 (pour les temps et les pneus) apr\u00e8s un test de plus longue haleine je suis content de voir que au moins mon programme peut tourner plus d'une heure sans crasher et qu'il peut \u00eatre fiable quand il veut.","title":"Mercredi 17 Mai 2023"},{"location":"jdb.html#jeudi-18-mai-2023","text":"Aujourd'hui c'est t\u00e9l\u00e9Travail forc\u00e9 et j'\u00e9tais scens\u00e9 aller au Grand Prix d'Imola ce qui malheureusement ne pourra pas se faire pour des raisons d'inondations. En effet la r\u00e9gion est clairement pas en \u00e9tat de recevoir un Grand Prix de Formule 1 et donc ce weekend c'est maison. Le but du jour c'est d'avancer la doc et de tenter d'am\u00e9liorer l'OCR pour que Lundi il soit relativement facile d'avancer sur l'interface de l'app finale. Je suis en train d'explorer une methode de detection de bords de sobel. Le seul soucis c'est que les r\u00e9sultats sont bons mais avec un vide au milieu des chiffres. Cela veut dire que parfois le temps est mal detect\u00e9. Mais il semble que pour le reste du temps cela se passe plut\u00f4t bien. Ca vaut peut \u00eatre le coup de modifier la gestion des erreurs. \"Artefacts de detection de sobel\" En fait le soucis avec ces artefacts c'est que parfois le temps au tour n'est tout simplement pas detect\u00e9. Dans l'exemple ci dessus, la reconnaissance de caract\u00e8res ne trouve tout simplement rien. Il faut donc que je trouve un moyen de corriger ces soucis. Il semblerait que en appliquant un tresholding un peu plus s\u00e9v\u00e8re en amont on arrive \u00e0 r\u00e9duire les artefacts \"Artefacts all\u00e8g\u00e9s\" ; Je crois qu'il faut faire attention avec les 'Bitmap.save' quand on utilise de l'asynchrone. le GDI+ aime pas des masses.","title":"Jeudi 18 Mai 2023"},{"location":"jdb.html#lundi-22-mai-2023","text":"BON ! Il ne reste plus beaucoup de temps ! Selon le planning cette semaine est la derni\u00e8re semaine de programmation. Il va donc falloir CHARBONNER !! Il ne me reste plus que une t\u00e2che \u00e0 vraiment faire (\u00e0 part les tests mais euuuu voila bon). J'essaie d'impl\u00e9menter un peu plus d'error handling mais c'est pas facile... Il y a tellement de choses qui peuvent mal tourner c'est infernal. Une chose qui serait bien serait de rajouter des points d'attente variables dans le code de l'emulateur un peu partout pour eviter de se retrouver bloqu\u00e9 \u00e0 chaque fois. L'int\u00e9r\u00eat serait que des gens avec une moins bonne connexion pourraient quand m\u00eame profiter du programme sans qu'il crashe 300 fois. Ce qui est frustrant c'est que va savoir pourquoi, maintenant, on arrive quasi jamais a avoir la page data... Genre sans deconner c'est une fois sur 5 que l'emulateur nous ressort la page Data et pas juste le feed. C'est absolument infernal. Je ne comprends pas pourquoi en plus. L'emulateur arrive bien \u00e0 cliquer sur le bon bouton mais m\u00eame comme ca ca ne veut pas. CA NA AUCUN SENS BORDEL. Sur une image Jjai de supers resultats pour les temps au tour mais d\u00e8s que l'image change PAF plus aucun temps n'est detect\u00e9. Ah non c'est bon c'est juste que VA SAVOIR POURQUOI les images sont en putain de resolution DEGEULASSE. Je ne comprends pas pourquoi ce matin particuli\u00e8rement le projet marche si mal. Par ce que d\u00e8s que l'image revient \u00e0 une r\u00e9solution normale c'est bon. Un autre soucis que j'ai est que je n'arrive pas \u00e0 paralleliser l'OCR ce qui fait que elle peut prendre parfois plus de 15 secondes. Et le probl\u00e8me avec ca c'est que la detection de tours et de pitstop est grandement impact\u00e9e si on a pas assez de data assez souvent. Je vais me focus sur le reste en attendant mais d\u00e8s que M.Bonvin apparait dans les parages je vais devoir l'alpaguer. J'ai ajout\u00e9 la possibilit\u00e9 d'essayer plusieurs fois de trouver le bouton fullscreen et de cliquer dessus plut\u00f4t que d'attendre dix secondes comme un con et esp\u00e8rer que ca fonctionne. Mais si apr\u00e8s 15 secondes d'essais il n'y arrive pas cela fait quand m\u00eame p\u00eater une erreur. Je pense que je vais m'occuper de la page de configuration maintenant. Voici \u00e0 quoi ressemblait la page de settings ce matin quand je suis arriv\u00e9. \"Ancienne page de settings\" Comme je pense que l'UI de cette page ne va pas vraiment changer d'ici la fin du projet je peux me permettre de lui faire une petite beaut\u00e9 car apr\u00e8s je ne pense pas y retoucher. Pour ca j'ai plusieurs \u00e9tapes comme choisir une palette de couleur, retirer l'inutile et choisir judicieusement le placement des items sur la form pour que cela soit le plus intuitif possible. J'y pense, il fuadrait peut-\u00eatre que je me trouve un logo ca pourrait rendre bien. Voila alors j'ai chang\u00e9 un tout petit peu ce \u00e0 quoi ressemble la page de settings et j'ai ajout\u00e9 du responsive pour que le user puisse mettre l'application en plein \u00e9cran. \"Nouvelle page de configuration\" Mais il manque un peu de couleurs et de d\u00e9tails pour que cela rende vraiment bien. Et apr\u00e8s quelques tentatives on se retrouve avec une page plut\u00f4t sympa je trouve : \"Nouvelle page de config\" Et elle est responsive : \"Nouvelle page de config en plein \u00e9cran\" Et j'ai fait quelques changements pour ce qui est des zones qui s'affichent pour qu'on les voie mieux. \"Nouvelle page de config en action\" Je trouve que franchement ca rend pas mal. Le reste de l'app sera dans ce style. J'ai mis pas mal de temps \u00e0 cr\u00e9er cette page, mais je pense que c'est important que la page de config soit propre. Et en plus tout le temps que j'ai pass\u00e9 ici n'est pas perdu car ensuite j'aurai simplement \u00e0 suivre les m\u00eames directives de style pour le reste de l'UI. Il faut aussi savoir que Windows Form n'est ps forc\u00e9ment le meilleur outil pour travailler avec le design. Truc tout b\u00eate par exemple qui m'a fait perdre 30 minutes. Il est impossible de retirer les bordures des objets \"GroupBox\". Ce que j'ai donc du faire ca a \u00e9t\u00e9 de dessiner un rectangle autour de la couleur du background pour que l'on ne voit plus les bordures et ensuite j'ai du redessiner le texte pour qu'il puisse s'afficher quand m\u00eame. C'est pleins de petites choses comme ca qui sont plut\u00f4t p\u00e9nibles et qui font perdre du temps mais je pense que c'est rentable de s'y attarder. Maintenant ce que je vais faire aujourd'hui et demain c'est l'affichage general de l'app. Je pense que je vais commencer par mettre des placeholder de l'app finale comme ca je saurai quoi implementer comme methodes de r\u00e9cup\u00e8ration demain. J'aimerais quand m\u00eame faire une interface sympa m\u00eame si les data sont pas parfaites. Par ce que je me dis que au pire si je montre une interface qui donne des infos inexacte mais qui a la bonne logique c'est toujours mieux que de ne pas montrer ce que ca pourrait faire avec des donn\u00e9es un peu plus int\u00e8gres. Autre point \u00e0 noter, je me suis rendu compte que ca pourrait \u00eatre potentiellement pas mal de trouver un moyen rapide de lancer l'appli avec un Grand Prix. Genre permettre de selectionner le preset et l'URL du Grand Prix sans avoir \u00e0 passer par la page de configuration. Je me suis rendu compte que c'\u00e9tait super chiant de devoir \u00e0 chaque fois le faire (m\u00eame si je me rends compte que normalement un user ne devrait pas lancer l'app autant) Voila ue premi\u00e8re version de l'App avec tous les placeholders : \"Premi\u00e8re version de la page principale\" Et c'est tout pour aujourd'hui ! Ce fut une journ\u00e9e remplie.","title":"Lundi 22 Mai 2023"},{"location":"jdb.html#mardi-23-mai-2023","text":"Aujourd'hui le but c'est de remplir le framework de hier avec les bonnes Data. Je ne sais pas si je peux tout finir en un jour mais on va essayer. Bon j'ai eu une discussion anim\u00e9e avec M.Bonvin et il semble que je sois oblig\u00e9 de refaire \u00e0 peu pr\u00e8s tout mon code pour le rendre ne serait-ce qu'un peu optimis\u00e9. Bon au final j'ai perdu 6H de travail \u00e0 tenter de convertir mon code dans une version un peu plus optimis\u00e9e... Mais je me rend compte que c'est juste impossible... Il me faudrait au moins plusieurs jours pour faire correctement ce refactor et donc je vais tout simplement faire un git restore... C'est extr\u00eament frustrant mais bon... Pas le choix il semble. J'ai du \u00e9crire au moins 600 lignes de code et tout pars en fum\u00e9e. C'est une d\u00e9bauche d'\u00e9nergie absolument ph\u00e9nomenale. Apr\u00e8s ca valait le coup de tenter je pense. (J'ai envie de mourir) EN FAIT C'EST BON !! Il fallait juste que je croie en mon code original !!! J'ai r\u00e9ussi \u00e0 paralelliser mon ancien code. Il ne manquait presque rien mais M.Bonvin voulait absolument que je change le reste. Maintenant j'ai une detection qui se fait en quelques secondes c'est genial.","title":"Mardi 23 Mai 2023"},{"location":"jdb.html#mercredi-24-mai-2023","text":"Alors hier je n'ai pas bien eu le temps d'expliquer ce que voulait que M.Bonvin. En fait mon programme actuellement utilise un d\u00e9coupage qui peut par\u00e2itre complexe. Et de par sa nature, il pensait qu'il \u00e9tait simplement impossible de paralelliser le traitement car trop complexe et trop couteux. Il voulait donc que je passe sur un traitement plus simple. L'id\u00e9e \u00e9tait que on s'occupe dabord de faire une liste de toutes les Windows et de les traiter toutes \u00e0 la fois pour \u00e9viter que les boucles soient trop complexes. Sauf que pour impl\u00e9menter un truc pareil c'est \u00e9norm\u00e9ment de code car cela va \u00e0 l'encontre totale de la facon dont mon projet fonctionne actuellement. Mais comme j'\u00e9tais ouvert \u00e0 d'autres solutions. J'ai pass\u00e9 six heures \u00e0 tenter de l'impl\u00e9menter. Il en aurait fallu au minimum deux jours soyons clair. Et en fait on s'est retrouv\u00e9s devant pleins de probl\u00e8mes qui ne se posent pas dans mon architecture originale. Par exemple. On a pas trouv\u00e9 de methode simple pour d\u00e9couper les images des fen\u00eatres de mani\u00e8re thread safe. Il aurait donc fallu ajouter des boucles en pr\u00e9alable pour tout d\u00e9couper et le faire de mani\u00e8re s\u00e9quencielle. Ensuite vient le probl\u00e8me que si on traite toutes les donn\u00e9es dans des boucless paralelle on perds leur position originale donc il faut faire une classe pour stocker les r\u00e9sultats temporaires. Il y a aussi le soucis que les Windows ont certe une position mais elle est relative au parent et \u00e0 l'image parente. Donc il faudra faire un syst\u00e8me qui convertis les windows en position absolue sur l'image. Ca peut para\u00eetre \u00eatre de simples changements mais deja il y en a pas mal d'autres et franchement m\u00eame si l'id\u00e9e originale aurait pu simplifier les choses. Les sacrifices que l'on doit faire pour la faire marcher sont juste trop moches et \u00e0 mon avis ne sont pas du tout aussi logiques que mon d\u00e9coupage original. Cette exp\u00e9rience m'a quand m\u00eame permis de me rendre compte des endroits dans mon code qui sont plus ou moins difficile \u00e0 maintenir et cela m'a fait me rendre compte que ma solution n'\u00e9tait pas forc\u00e9ment la plus simple pour tout le monde mais que mine de rien elle peut \u00eatre efficace. La je suis en train de rajouter les routes pour la vue. Je me suis dit que ca serait une bonne id\u00e9e de permettre aux users de cliquer sur un pilote pour avoir ses infos. Mais je me suis dit que ce qui serait encore plus cool serait de pouvoir cliquer sur un des temps au tour d'un pilote et qu'une petite fen\u00eatre s'ouvre pour indiquer les temps par secteurs. Mais en faisant ca je me rends compte qu'il y a quelques soucis dans la facon que je conserve les infos dans la DB et je peux voir directement quand la reconnaissance a du mal avec certains pilotes ou des positions. Ca arrive plus souvent que ce que je voudrais que un pilote soit mal detect\u00e9. Mais ce qui est dr\u00f4le c'est que c'est parfois sur une deux voire trois reconnaissance que le pilote n'est plus reconnu mais ensuite tout va bien. Il faut que je travaille un peu plus sur le filtrage de ces donn\u00e9es limites et peut-\u00eatre de voir si la reconnaissance de la position pourrait \u00eatre un peu v\u00e9rifi\u00e9e. Bon pour \u00eatre honn\u00eate je ne pense pas que le code qui concerne l'affichage soit le meilleur code que j'aie pu produire dans ma vie de d\u00e9veloppeur mais en m\u00eame temps je n'ai pas forc\u00e9ment le temps de le rendre magnifique. La le but est simplement que tout marche. (Et c'est un peu la m\u00eame phylosophie dans tout le reste du projet lol) Demain il me reste pas mal de choses \u00e0 faire et c'est la derni\u00e8re journ\u00e9e ou je peux les faire. Rendre la form plus jolie et changer les couleurs Rendre la form Responsive Ajouter les bons messages d'erreur qui vont bien Modifier les messageBox d'erreur pour qu'elles soient plus agr\u00e9ables \u00e0 utiliser Clean un peu le code mod\u00e8le vue controller Si j'ai le temps ajouter les bons commentaires les bonnes ent\u00eates partout","title":"Mercredi 24 Mai 2023"},{"location":"jdb.html#jeudi-25-mai-2023","text":"Bon bah le but aujourd'hui c'est de finaliser un peu le projet car la semaine prochaine c'est doc. Pas grand chose \u00e0 dire. J'ai pass\u00e9 la journ\u00e9e \u00e0 fix des petits bugs par ci par la. Voici des exemples de ce \u00e0 quoi ressemble l'app \u00e0 la fin de la journ\u00e9e : \"Screenshot de la page principale\" \"Screenshot de la page principale\" On se rend jamais compte mais c'est tellement long de r\u00e8gler chaque petit soucis un par un. Il y a tellement de possibilit\u00e9s de choses qui peuvent mal tourner ou qui ont un comportement diff\u00e9rent selon l'ordre dans lequel on fait les choses. Mais dans l'ensemble, m\u00eame si on est pas sur la meilleure interface que l'on aie vu dans l'histoire. Je trouve que elle fait quand m\u00eame le taff.","title":"Jeudi 25 Mai 2023"},{"location":"jdb.html#vendredi-26-mai-2023","text":"Aujourd'hui c'est d\u00e9part pour Monaco mais comme l'avion etait bien en retard j'ai pu avancer sur le nettoyage du code.","title":"Vendredi 26 Mai 2023"},{"location":"jdb.html#grand-prix-de-monaco","text":"[Insert photos]","title":"Grand Prix de Monaco"},{"location":"jdb.html#lundi-29-mai-2023","text":"Mon vol pour Geneve hier soit a \u00e9t\u00e9 annul\u00e9 et je dois donc prendre une deviation car tous les vols pour Geneve sont pleins. Je dois partir a 7h30 pour prende l'avion de 9H pour Nantes et de la bas je dois prendre un avion \u00e0 17h pour arriver \u00e0 18h30 \u00e0 l'a\u00e9roport de Geneve. C'est pas pratique car j'avais pr\u00e9vu d'avancer aujourd'hui et je suis oblig\u00e9 d'avancer comme je peux dans l'a\u00e9roport. J'avance encore sur le nettoyage rapide du code. Le but est que demain je puisse sortir la premi\u00e8re release en Beta et que je mette vraiment serieusement \u00e0 la Documentation. M.Jayr m'a \u00e9galement demand\u00e9 de lui donner le document d'\u00e9valuation interm\u00e9diaire. Il ne faut pas que j'oublie demain. J'ai mis des notes sur mon code au cas ou des gens viennent \u00e0 le lire. J'y d\u00e9cris les choses que j'aurais fait diff\u00e9remment ou qui pourraient para\u00eetre bizarre au tout venant.","title":"Lundi 29 Mai 2023"},{"location":"jdb.html#mardi-30-mai-2023","text":"Bon aujourd'hui je dois encore avancer sur la partie nettoyage de code et avant de sortir la premi\u00e8re release Beta je vais tenter d'installer le projet sur un autre pc pour voir ce que je n'ai pas mentionn\u00e9 dans mon ReadMe. Bon j'ai pu rendre \u00e0 M.Jayr mon evaluation interm\u00e9diaire et j'ai fait les derni\u00e8res modifications sur le projet pour que je puisse sortir une release correcte. Maintenant je vais me mettre \u00e0 la documentation. Il va falloir que je revoie ce que j'ai d\u00e9ja \u00e9crit en ce qui concerne l'OCR car j'ai fait des modifications depuis et j'ai ajout\u00e9 la methode de SOBEL. Il faut peut-\u00eatre aussi que je parle vite fait dans la partie Emulation que j'ai du changer les variables d'environnement pour faire fonctionner le syst\u00e8me en 4K.","title":"Mardi 30 Mai 2023"},{"location":"jdb.html#mercredi-31-mai-2023","text":"Doc","title":"Mercredi 31 Mai 2023"},{"location":"jdb.html#jeudi-1-juin-2023","text":"Bon je me suis rendu compte que je n'avais fait vraiment aucuns tests et que c'est franchement bof. Je pense que ce que je devrais faire pour faire des tests unitaires c'est prendre des exemples de chaque type de windows possibles en plusieurs exemplaires. Ensuite je note le r\u00e9sultat que j'attends et je regarde si ca me retourne la bonne valeur. Mais ca veut dire que ca va me prendre pas mal de temps de tout mettre en place mais ca m'aurait s\u00fbrement fait gagner beaucoup de temps si je l'avais fait d\u00e8s le d\u00e9but... Je pense que une bonne id\u00e9e serait de prendre trois Grand Prix et de prendre une photo de chaque type de window au d\u00e9but et \u00e0 la fin. Plus je regarde plus je me rend compte que ce pojet aurait carr\u00e9ment du \u00eatre en TDD (Test Driven Developement) par ce que ca m'aurait fait gagner un temps FOU. OK JE SUIS DEBILE POURQUOI J'AI PAS FAIT CA PLUS T\u00d4T ??? En fait ce que j'aurais du faire c'est prendre de gros \u00e9chantillons de toutes les types de windows et j'aurais un parfait framework pour savoir si j'ai am\u00e9lior\u00e9 mon OCR ou non. Voici les exemples que je vais utiliser pour verifier le bon fonctionnement de l'OCR : \"Dataset Ecarts\" ; \"Dataset Tours\" ; \"Dataset Noms\" ; \"Dataset Positions\" ; \"Dataset Sectors\" ; \"Dataset Tyres\" ; Je pense que c'est un set assez correct car j'ai essay\u00e9 de prendre un peu tous les cas possibles. Le seul qui m'inqui\u00e8te un peu c'est celui des pneus mais bon. C'est aussi celui qui m'inqui\u00e8te le plus en temps normal. Non mais c'est juste g\u00e9nial les tests en fait... j'avais pas vu que parfois ma detection de GAP TO LEADER comprenait le \"+1:34.567\" en \"61:34.567\" car le '+' \u00e9tait interpr\u00eat\u00e9 comme un 6. Sans les tests je ne m'en serais pas rendu compte. Ce qui est g\u00e9nial c'est que ca veut dire que si je veux am\u00e9liorer mon OCR j'ai juste \u00e0 mettre plus d'exemples dans le dossier de tests et de run les tests et voir ou il a des soucis. C'est un peu tard mais ca m'aurait fait gagner TELLEMENT de temps c'est absolument ridicule.","title":"Jeudi 1 Juin 2023"},{"location":"jdb.html#vendredi-2-juin-2023","text":"Aujourd'hui c'est de nouveau doc. Mais la je pense qu'il faut que je rajoute une rubrique \"Fonctionnement g\u00e9n\u00e9ral\" qui r\u00e9sume tr\u00e8s simplement toutes les \u00e9tapes du projet avec un bon diagramme. En fait c'est beaucoup plus dur que ce que je pensais de faire un bon diagramme qui explique tout sans \u00eatre illisible. J'ai mis une heure trente \u00e0 faire celui la : \"Diagramme fonctionnement g\u00e9n\u00e9ral\" J'ai pris pas mal de temps aussi \u00e0 faire ces trois autre diagrammes un peu plus graphiques qui montrent de mani\u00e8re un poil plus abstraite le fonctionnement des trois grosses parties du projet. \"Diagramme recup\u00e9ration d'images\" \"Diagramme OCR\" \"Diagramme Traitement\" Je pense qu'ils sont un peu plus faciles \u00e0 comprendre que le gros diagramme g\u00e9n\u00e9ral. Ce que je me dis c'est que je vais faire une section fonctionnement g\u00e9n\u00e9ral ou je vais expliquer les trois parties avec les petits diagramme et r\u00e9sumer avec le grand diagramme.","title":"Vendredi 2 Juin 2023"},{"location":"jdb.html#lundi-5-juin-2023","text":"Ce weekend j'ai voulu essayer le projet pour le Grand Prix de Barcelone qui s'est sold\u00e9 en un \u00e9chec cuisant... J'ai eu trois soucis pour l'utilisation du programme. Les voici dans l'ordre croissant d'importance et de difficult\u00e9 \u00e0 r\u00e8gler : Mon Laptop est incapable de rester plus d'une heure allum\u00e9 m\u00eame compl\u00eatement charg\u00e9 \u00e0 100% Le WIFI de chez moi a du mal \u00e0 g\u00e8rer plusieurs flux 1080p en m\u00eame temps et donc le temps de chargement est trop long ce qui me fait des erreurs 105 \"Ce que voyait le programme pendant les erreurs 105 ce dimanche\" Le fait que quand un flux est en live, quand on clique dessus, un nouveau bouton appar\u00e2it qui n'\u00e9tait pas pr\u00e9vu et qui nous propose de regarder depuis le d\u00e9but ou en live. Le soucis avec ce bouton c'est qu'il n'est pr\u00e9sent que pour les sessions live... Il va donc falloir attendre le prochain GP (Canada 18 Juin) pour faire un test en conditions r\u00e9elles. \"Ce que voyait le programme avant que j'essaie d'impl\u00e9menter le click auto\" J'ai essay\u00e9 de r\u00e8gler le probl\u00e8me en Live, le soucis c'est que j'ai un commentaire \u00e0 fournir pendant la course et donc je n'ai pas eu le temps de plus me pencher sur le cas. Le weekend du prochain Grand Prix je vais essayer de tester sur les sc\u00e9ances d'essais libres.le click du bouton et j'amenerai mon cable chez moi. Bon sinon aujourd'hui, comme d'hab, Doc... Je vais faire le manuel utilisateur.","title":"Lundi 5 Juin 2023"},{"location":"Code/ConfigurationTool.html","text":"ConfigurationTool.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : ConfigurationTool.cs /// Brief : Class that contains all the methods used to create config files for the main programm /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using Tesseract ; using System.IO ; using System.Text.Json ; using System.Text.Json.Nodes ; namespace TrackTrends { public class ConfigurationTool { public Zone MainZone ; public const int NUMBER_OF_DRIVERS = 20 ; public const int NUMBER_OF_ZONES = 9 ; public const string CONFIGS_FOLDER_NAME = \"./Presets/\" ; ///

    /// Creates the configuration tool. It can only be created if you already have the dimensions of the main zone /// /// The full image coming from the F1TV Data Channel /// The dimensions of the zone where all the drivers data are situated public ConfigurationTool ( Bitmap fullImage , Rectangle mainZoneDimensions ) { MainZone = new Zone ( fullImage , mainZoneDimensions , \"Main\" ); AutoCalibrate (); } /// /// Resets the main zone /// public void ResetMainZone () { MainZone . ResetZones (); } /// /// Reset the windows /// public void ResetWindows () { MainZone . ResetWindows (); } /// /// Save the current config in a JSON file stored in /Presets/ /// /// A list of all the drivers in the GP. IMPORTANT, they need to ALL be mentionned or the program wont be able to detect the missing ones and will F up everything /// The name the config should have public void SaveToJson ( List < string > drivers , string configName ) { string JSON = \"\" ; JsonObject jsonFileObject = new JsonObject (); //Creates the mainZone object JsonObject mainZoneObject = new JsonObject (); mainZoneObject . Add ( \"x\" , MainZone . Bounds . X ); mainZoneObject . Add ( \"y\" , MainZone . Bounds . Y ); mainZoneObject . Add ( \"width\" , MainZone . Bounds . Width ); mainZoneObject . Add ( \"height\" , MainZone . Bounds . Height ); JsonArray driverZonesArray = new JsonArray (); //Creates all the subzones that contain driver infos int DriverID = 0 ; foreach ( Zone driverZone in MainZone . Zones ) { DriverID ++; JsonObject driverZoneObject = new JsonObject (); driverZoneObject . Add ( \"name\" , \"Driver\" + DriverID ); driverZoneObject . Add ( \"x\" , driverZone . Bounds . X ); driverZoneObject . Add ( \"y\" , driverZone . Bounds . Y ); driverZoneObject . Add ( \"width\" , driverZone . Bounds . Width ); driverZoneObject . Add ( \"height\" , driverZone . Bounds . Height ); JsonArray windowsArray = new JsonArray (); JsonObject windowObject = new JsonObject (); //Creates all the windows of the current driver zone //Note : We store ALL the windows and zones in the JSON because they are not spaced exactly the same on the main zone foreach ( Window window in driverZone . Windows ) { windowObject . Add ( window . Name , new JsonObject { { \"x\" , window . Bounds . X }, { \"y\" , window . Bounds . Y }, { \"width\" , window . Bounds . Width }, { \"height\" , window . Bounds . Height } }); } windowsArray . Add ( windowObject ); driverZoneObject . Add ( \"Windows\" , windowsArray ); driverZonesArray . Add ( driverZoneObject ); } mainZoneObject . Add ( \"DriverZones\" , driverZonesArray ); JsonArray driversArray = new JsonArray (); foreach ( string driver in drivers ) { driversArray . Add ( driver ); } mainZoneObject . Add ( \"Drivers\" , driversArray ); jsonFileObject . Add ( \"Main\" , mainZoneObject ); JSON = jsonFileObject . ToString (); //Saving the file string path = CONFIGS_FOLDER_NAME + configName ; if ( File . Exists ( path + \".json\" )) { //We need to create a new name int count = 2 ; while ( File . Exists ( path + \"_\" + count + \".json\" )) { count ++; } path += \"_\" + count + \".json\" ; } else { path += \".json\" ; } File . WriteAllText ( path , JSON ); } /// /// Adds a window in the windows list /// Be carefull of the order. It cant be random or it will crash. The programm expect the first to be position, second Gap to leader etc... /// /// The bounds of the window public void AddWindows ( List < Rectangle > rectangles ) { foreach ( Zone driverZone in MainZone . Zones ) { Bitmap zoneImage = driverZone . ZoneImage ; for ( int i = 1 ; i <= rectangles . Count ; i ++) { switch ( i ) { case 1 : //First zone should be the driver's Position driverZone . AddWindow ( new DriverPositionWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 2 : //Second zone should be the Gap to leader driverZone . AddWindow ( new DriverGapToLeaderWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 3 : //Third zone should be the driver's Lap Time driverZone . AddWindow ( new DriverLapTimeWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 4 : //Fourth zone should be the driver's DRS status driverZone . AddWindow ( new DriverDrsWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 5 : //Fifth zone should be the driver's Tyre's informations driverZone . AddWindow ( new DriverTyresWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 6 : //Sixth zone should be the driver's Name driverZone . AddWindow ( new DriverNameWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 7 : //Seventh zone should be the driver's First Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 1 , false )); break ; case 8 : //Zone number eight should be the driver's Second Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 2 , false )); break ; case 9 : //Zone number nine should be the driver's Position Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 3 , false )); break ; } } } } /// /// This will automatically create all the driver zones at the correct places if the main zone has been weel positionned /// You cant just divide the image by the number of pilots or it will be messy and inconsistent at the end (Garbage in Garbage Out) /// public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); List < Zone > zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Image image = MainZone . ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); //Runs a quick OCR detection. Not to detect any content but just to detect where is all the text positionned. //For each row it decides the best Zone location and adds it to the Driver zone list using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } //DEBUG int i = 1 ; foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); //We add the driver zones Zone driverZone = new Zone ( MainZone . ZoneImage , windowRectangle , \"DriverZone\" ); MainZone . AddZone ( driverZone ); //driverZone.ZoneImage.Save(\"Driver\" + i+\".png\"); i ++; } } } }","title":"ConfigurationTool.cs"},{"location":"Code/ConfigurationTool.html#configurationtoolcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : ConfigurationTool.cs /// Brief : Class that contains all the methods used to create config files for the main programm /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using Tesseract ; using System.IO ; using System.Text.Json ; using System.Text.Json.Nodes ; namespace TrackTrends { public class ConfigurationTool { public Zone MainZone ; public const int NUMBER_OF_DRIVERS = 20 ; public const int NUMBER_OF_ZONES = 9 ; public const string CONFIGS_FOLDER_NAME = \"./Presets/\" ; /// /// Creates the configuration tool. It can only be created if you already have the dimensions of the main zone /// /// The full image coming from the F1TV Data Channel /// The dimensions of the zone where all the drivers data are situated public ConfigurationTool ( Bitmap fullImage , Rectangle mainZoneDimensions ) { MainZone = new Zone ( fullImage , mainZoneDimensions , \"Main\" ); AutoCalibrate (); } /// /// Resets the main zone /// public void ResetMainZone () { MainZone . ResetZones (); } /// /// Reset the windows /// public void ResetWindows () { MainZone . ResetWindows (); } /// /// Save the current config in a JSON file stored in /Presets/ /// /// A list of all the drivers in the GP. IMPORTANT, they need to ALL be mentionned or the program wont be able to detect the missing ones and will F up everything /// The name the config should have public void SaveToJson ( List < string > drivers , string configName ) { string JSON = \"\" ; JsonObject jsonFileObject = new JsonObject (); //Creates the mainZone object JsonObject mainZoneObject = new JsonObject (); mainZoneObject . Add ( \"x\" , MainZone . Bounds . X ); mainZoneObject . Add ( \"y\" , MainZone . Bounds . Y ); mainZoneObject . Add ( \"width\" , MainZone . Bounds . Width ); mainZoneObject . Add ( \"height\" , MainZone . Bounds . Height ); JsonArray driverZonesArray = new JsonArray (); //Creates all the subzones that contain driver infos int DriverID = 0 ; foreach ( Zone driverZone in MainZone . Zones ) { DriverID ++; JsonObject driverZoneObject = new JsonObject (); driverZoneObject . Add ( \"name\" , \"Driver\" + DriverID ); driverZoneObject . Add ( \"x\" , driverZone . Bounds . X ); driverZoneObject . Add ( \"y\" , driverZone . Bounds . Y ); driverZoneObject . Add ( \"width\" , driverZone . Bounds . Width ); driverZoneObject . Add ( \"height\" , driverZone . Bounds . Height ); JsonArray windowsArray = new JsonArray (); JsonObject windowObject = new JsonObject (); //Creates all the windows of the current driver zone //Note : We store ALL the windows and zones in the JSON because they are not spaced exactly the same on the main zone foreach ( Window window in driverZone . Windows ) { windowObject . Add ( window . Name , new JsonObject { { \"x\" , window . Bounds . X }, { \"y\" , window . Bounds . Y }, { \"width\" , window . Bounds . Width }, { \"height\" , window . Bounds . Height } }); } windowsArray . Add ( windowObject ); driverZoneObject . Add ( \"Windows\" , windowsArray ); driverZonesArray . Add ( driverZoneObject ); } mainZoneObject . Add ( \"DriverZones\" , driverZonesArray ); JsonArray driversArray = new JsonArray (); foreach ( string driver in drivers ) { driversArray . Add ( driver ); } mainZoneObject . Add ( \"Drivers\" , driversArray ); jsonFileObject . Add ( \"Main\" , mainZoneObject ); JSON = jsonFileObject . ToString (); //Saving the file string path = CONFIGS_FOLDER_NAME + configName ; if ( File . Exists ( path + \".json\" )) { //We need to create a new name int count = 2 ; while ( File . Exists ( path + \"_\" + count + \".json\" )) { count ++; } path += \"_\" + count + \".json\" ; } else { path += \".json\" ; } File . WriteAllText ( path , JSON ); } /// /// Adds a window in the windows list /// Be carefull of the order. It cant be random or it will crash. The programm expect the first to be position, second Gap to leader etc... /// /// The bounds of the window public void AddWindows ( List < Rectangle > rectangles ) { foreach ( Zone driverZone in MainZone . Zones ) { Bitmap zoneImage = driverZone . ZoneImage ; for ( int i = 1 ; i <= rectangles . Count ; i ++) { switch ( i ) { case 1 : //First zone should be the driver's Position driverZone . AddWindow ( new DriverPositionWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 2 : //Second zone should be the Gap to leader driverZone . AddWindow ( new DriverGapToLeaderWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 3 : //Third zone should be the driver's Lap Time driverZone . AddWindow ( new DriverLapTimeWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 4 : //Fourth zone should be the driver's DRS status driverZone . AddWindow ( new DriverDrsWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 5 : //Fifth zone should be the driver's Tyre's informations driverZone . AddWindow ( new DriverTyresWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 6 : //Sixth zone should be the driver's Name driverZone . AddWindow ( new DriverNameWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 7 : //Seventh zone should be the driver's First Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 1 , false )); break ; case 8 : //Zone number eight should be the driver's Second Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 2 , false )); break ; case 9 : //Zone number nine should be the driver's Position Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 3 , false )); break ; } } } } /// /// This will automatically create all the driver zones at the correct places if the main zone has been weel positionned /// You cant just divide the image by the number of pilots or it will be messy and inconsistent at the end (Garbage in Garbage Out) /// public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); List < Zone > zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Image image = MainZone . ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); //Runs a quick OCR detection. Not to detect any content but just to detect where is all the text positionned. //For each row it decides the best Zone location and adds it to the Driver zone list using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } //DEBUG int i = 1 ; foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); //We add the driver zones Zone driverZone = new Zone ( MainZone . ZoneImage , windowRectangle , \"DriverZone\" ); MainZone . AddZone ( driverZone ); //driverZone.ZoneImage.Save(\"Driver\" + i+\".png\"); i ++; } } } }","title":"ConfigurationTool.cs"},{"location":"Code/DriverData.html","text":"DriverData.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverData.cs /// Brief : File containing classes that behave just like structures to store data about drivers /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class DriverData { public bool DRS ; //True = Drs is opened public int GapToLeader ; //In ms public int LapTime ; //In ms public string Name ; //Ex: LECLERC public int Position ; //Ex: 1 public int Sector1 ; //in ms public int Sector2 ; //in ms public int Sector3 ; //in ms public Tyre CurrentTyre ; //Ex Soft 11 laps public DriverData ( bool dRS , int gapToLeader , int lapTime , string name , int position , int sector1 , int sector2 , int sector3 , Tyre tyre ) { DRS = dRS ; GapToLeader = gapToLeader ; LapTime = lapTime ; Name = name ; Position = position ; Sector1 = sector1 ; Sector2 = sector2 ; Sector3 = sector3 ; CurrentTyre = tyre ; } /// /// Creates a default driver data with empty values /// public DriverData () { DRS = false ; GapToLeader = - 1 ; LapTime = - 1 ; Name = \"Unknown\" ; Position = - 1 ; Sector1 = - 1 ; Sector2 = - 1 ; Sector3 = - 1 ; CurrentTyre = new Tyre ( Tyre . Type . Undefined , - 1 ); } /// /// Method that displays all the data found in a string /// /// string containing all the driver datas public override string ToString () { string result = \"\" ; //Position result += \"Position : \" + Position + Environment . NewLine ; //Gap result += \"GapToLeader : \" + Reader . ConvertMsToTime ( GapToLeader ) + Environment . NewLine ; //LapTime result += \"LapTime : \" + Reader . ConvertMsToTime ( LapTime ) + Environment . NewLine ; //DRS result += \"DRS : \" + DRS + Environment . NewLine ; //Tyres result += \"Uses \" + CurrentTyre . Coumpound + \" tyre \" + CurrentTyre . NumberOfLaps + \" laps old\" + Environment . NewLine ; //Name result += \"DriverName : \" + Name + Environment . NewLine ; //Sector 1 result += \"Sector1 : \" + Reader . ConvertMsToTime ( Sector1 ) + Environment . NewLine ; //Sector 1 result += \"Sector2 : \" + Reader . ConvertMsToTime ( Sector2 ) + Environment . NewLine ; //Sector 1 result += \"Sector3 : \" + Reader . ConvertMsToTime ( Sector3 ) + Environment . NewLine ; return result ; } } //Structure to store tyres infos public struct Tyre { //If new tyres were to be added you will have to need to change this enum public enum Type { Soft , Medium , Hard , Inter , Wet , Undefined } public Type Coumpound ; public int NumberOfLaps ; public Tyre ( Type type , int laps ) { Coumpound = type ; NumberOfLaps = laps ; } } }","title":"DriverData.cs"},{"location":"Code/DriverData.html#driverdatacs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverData.cs /// Brief : File containing classes that behave just like structures to store data about drivers /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class DriverData { public bool DRS ; //True = Drs is opened public int GapToLeader ; //In ms public int LapTime ; //In ms public string Name ; //Ex: LECLERC public int Position ; //Ex: 1 public int Sector1 ; //in ms public int Sector2 ; //in ms public int Sector3 ; //in ms public Tyre CurrentTyre ; //Ex Soft 11 laps public DriverData ( bool dRS , int gapToLeader , int lapTime , string name , int position , int sector1 , int sector2 , int sector3 , Tyre tyre ) { DRS = dRS ; GapToLeader = gapToLeader ; LapTime = lapTime ; Name = name ; Position = position ; Sector1 = sector1 ; Sector2 = sector2 ; Sector3 = sector3 ; CurrentTyre = tyre ; } /// /// Creates a default driver data with empty values /// public DriverData () { DRS = false ; GapToLeader = - 1 ; LapTime = - 1 ; Name = \"Unknown\" ; Position = - 1 ; Sector1 = - 1 ; Sector2 = - 1 ; Sector3 = - 1 ; CurrentTyre = new Tyre ( Tyre . Type . Undefined , - 1 ); } /// /// Method that displays all the data found in a string /// /// string containing all the driver datas public override string ToString () { string result = \"\" ; //Position result += \"Position : \" + Position + Environment . NewLine ; //Gap result += \"GapToLeader : \" + Reader . ConvertMsToTime ( GapToLeader ) + Environment . NewLine ; //LapTime result += \"LapTime : \" + Reader . ConvertMsToTime ( LapTime ) + Environment . NewLine ; //DRS result += \"DRS : \" + DRS + Environment . NewLine ; //Tyres result += \"Uses \" + CurrentTyre . Coumpound + \" tyre \" + CurrentTyre . NumberOfLaps + \" laps old\" + Environment . NewLine ; //Name result += \"DriverName : \" + Name + Environment . NewLine ; //Sector 1 result += \"Sector1 : \" + Reader . ConvertMsToTime ( Sector1 ) + Environment . NewLine ; //Sector 1 result += \"Sector2 : \" + Reader . ConvertMsToTime ( Sector2 ) + Environment . NewLine ; //Sector 1 result += \"Sector3 : \" + Reader . ConvertMsToTime ( Sector3 ) + Environment . NewLine ; return result ; } } //Structure to store tyres infos public struct Tyre { //If new tyres were to be added you will have to need to change this enum public enum Type { Soft , Medium , Hard , Inter , Wet , Undefined } public Type Coumpound ; public int NumberOfLaps ; public Tyre ( Type type , int laps ) { Coumpound = type ; NumberOfLaps = laps ; } } }","title":"DriverData.cs"},{"location":"Code/DriverGapToLeaderWindow.html","text":"DriverGapToLeaderWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverGapToLeaderWindow.cs /// Brief : Window containing infos about the gap to the leader of a driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class DriverGapToLeaderWindow : Window { public DriverGapToLeaderWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"GapToLeader\" ; } /// /// Decodes the gap to leader using Tesseract OCR /// /// Returns the gap to the leader in miliseconds (int) public override object DecodePng () { int result = GetTimeFromPng ( WindowImage , OcrImage . WindowType . Gap , Engine ); return result ; } } }","title":"DriverGapToLeaderWindow.cs"},{"location":"Code/DriverGapToLeaderWindow.html#drivergaptoleaderwindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverGapToLeaderWindow.cs /// Brief : Window containing infos about the gap to the leader of a driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class DriverGapToLeaderWindow : Window { public DriverGapToLeaderWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"GapToLeader\" ; } /// /// Decodes the gap to leader using Tesseract OCR /// /// Returns the gap to the leader in miliseconds (int) public override object DecodePng () { int result = GetTimeFromPng ( WindowImage , OcrImage . WindowType . Gap , Engine ); return result ; } } }","title":"DriverGapToLeaderWindow.cs"},{"location":"Code/DriverNameWindow.html","text":"DriverNameWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverNameWindow /// Brief : Window containing infos about the name of the driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverNameWindow : Window { public DriverNameWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Name\" ; } /// /// Decodes using OCR wich driver name is in the image /// /// A list of all the names that can be on the image /// a string representing the found driver name. It will be one of the ones given in the list public override object DecodePng ( List < string > DriverList ) { string result = \"\" ; result = GetStringFromPng ( WindowImage , Engine ); if (! IsADriver ( DriverList , result )) { //I put everything in uppercase to try to lower the chances of bad answers result = FindClosestMatch ( DriverList . ConvertAll ( d => d . ToUpper ()), result . ToUpper ()); } return result ; } /// /// Verifies that the name found in the OCR is a valid name /// /// The list of all the drivers name that can be found in the image /// The driver you want to be sure if it exists or not /// If ye or no the driver exists private static bool IsADriver ( List < string > driverList , string potentialDriver ) { bool result = false ; //I cant use drivers.Contains because it has missmatched cases and all foreach ( string name in driverList ) { if ( name . ToUpper () == potentialDriver . ToUpper ()) result = true ; } return result ; } } }","title":"DriverNameWindow.cs"},{"location":"Code/DriverNameWindow.html#drivernamewindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverNameWindow /// Brief : Window containing infos about the name of the driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverNameWindow : Window { public DriverNameWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Name\" ; } /// /// Decodes using OCR wich driver name is in the image /// /// A list of all the names that can be on the image /// a string representing the found driver name. It will be one of the ones given in the list public override object DecodePng ( List < string > DriverList ) { string result = \"\" ; result = GetStringFromPng ( WindowImage , Engine ); if (! IsADriver ( DriverList , result )) { //I put everything in uppercase to try to lower the chances of bad answers result = FindClosestMatch ( DriverList . ConvertAll ( d => d . ToUpper ()), result . ToUpper ()); } return result ; } /// /// Verifies that the name found in the OCR is a valid name /// /// The list of all the drivers name that can be found in the image /// The driver you want to be sure if it exists or not /// If ye or no the driver exists private static bool IsADriver ( List < string > driverList , string potentialDriver ) { bool result = false ; //I cant use drivers.Contains because it has missmatched cases and all foreach ( string name in driverList ) { if ( name . ToUpper () == potentialDriver . ToUpper ()) result = true ; } return result ; } } }","title":"DriverNameWindow.cs"},{"location":"Code/DriverSectorWindow.html","text":"DriverSectorWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverSectorWindow.cs /// Brief : Window containing infos about a driver sector time. Can be the first second or third, does not matter. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverSectorWindow : Window { public DriverSectorWindow ( Bitmap image , Rectangle bounds , int sectorId , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Sector\" + sectorId ; } /// /// Decodes the sector /// /// the sector time in int (ms) public override object DecodePng () { int ocrResult = GetTimeFromPng ( WindowImage , OcrImage . WindowType . Sector , Engine ); return ocrResult ; } } }","title":"DriverSectorWindow.cs"},{"location":"Code/DriverSectorWindow.html#driversectorwindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverSectorWindow.cs /// Brief : Window containing infos about a driver sector time. Can be the first second or third, does not matter. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverSectorWindow : Window { public DriverSectorWindow ( Bitmap image , Rectangle bounds , int sectorId , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Sector\" + sectorId ; } /// /// Decodes the sector /// /// the sector time in int (ms) public override object DecodePng () { int ocrResult = GetTimeFromPng ( WindowImage , OcrImage . WindowType . Sector , Engine ); return ocrResult ; } } }","title":"DriverSectorWindow.cs"},{"location":"Code/F1TVEmulator.html","text":"F1TVEmulator.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : F1TVEmulator.cs /// Brief : Class that contains methods to emulate a browser and navigate the F1TV website /// Version : Alpha 1.0 using OpenQA.Selenium ; using OpenQA.Selenium.Firefox ; using OpenQA.Selenium.Interactions ; using OpenQA.Selenium.Support.UI ; using System ; using System.Collections.Generic ; using System.Diagnostics ; using System.Drawing ; using System.IO ; using System.Linq ; using System.Text ; using System.Threading ; using System.Threading.Tasks ; namespace TrackTrends { internal class F1TVEmulator { public const string COOKIE_HOST = \".formula1.com\" ; public const string PYTHON_COOKIE_RETRIEVAL_FILENAME = \"recoverCookiesCSV.py\" ; public const string GECKODRIVER_FILENAME = @\"geckodriver-v0.27.0-win64\\geckodriver.exe\" ; //BE CAREFULL IF YOU CHANGE IT HERE YOU NEED TO CHANGE IT IN THE PYTHON SCRIPT TOO public const string COOKIES_CSV_FILENAME = \"cookies.csv\" ; private FirefoxDriver Driver ; private bool _ready ; private string _grandPrixUrl ; public string GrandPrixUrl { get => _grandPrixUrl ; private set => _grandPrixUrl = value ; } public bool Ready { get => _ready ; set => _ready = value ; } public F1TVEmulator ( string grandPrixUrl ) { GrandPrixUrl = grandPrixUrl ; Ready = false ; } /// /// Will start the python programm that runs the Cookie Recovering /// private void StartCookieRecovering () { string scriptPath = PYTHON_COOKIE_RETRIEVAL_FILENAME ; Process process = new Process (); process . StartInfo . FileName = \"python.exe\" ; process . StartInfo . Arguments = scriptPath ; process . StartInfo . UseShellExecute = false ; process . StartInfo . RedirectStandardOutput = true ; process . Start (); string output = process . StandardOutput . ReadToEnd (); process . WaitForExit (); } /// /// Method that will recover the needed cookies in the DB /// /// The host of the wanted cookie ex: ./formula1.com /// The name of the wanted cookie ex: login /// returns the value of the cookie if it has been found /// public string GetCookie ( string host , string name ) { StartCookieRecovering (); string value = \"\" ; List < Cookie > cookies = new List < Cookie >(); if ( File . Exists ( COOKIES_CSV_FILENAME )) { using ( var reader = new StreamReader ( COOKIES_CSV_FILENAME )) { // Read the header row and validate column order string header = reader . ReadLine (); string [] expectedColumns = { \"host_key\" , \"name\" , \"value\" , \"path\" , \"expires_utc\" , \"is_secure\" , \"is_httponly\" }; string [] actualColumns = header . Split ( ',' ); for ( int i = 0 ; i < expectedColumns . Length ; i ++) { if ( expectedColumns [ i ] != actualColumns [ i ]) { throw new InvalidOperationException ( $\"Expected column '{expectedColumns[i]}' at index {i} but found '{actualColumns[i]}'\" ); } } // Read each data row and parse values into a Cookie object while (! reader . EndOfStream ) { string line = reader . ReadLine (); string [] fields = line . Split ( ',' ); string hostname = fields [ 0 ]; string cookieName = fields [ 1 ]; if ( hostname == host && cookieName == name ) { value = fields [ 2 ]; } } } } return value ; } /// /// Starts the headless browser /// /// Error code 1xx public async Task < int > Start () { Ready = false ; string loginCookieName = \"login\" ; string loginSessionCookieName = \"login-session\" ; string loginCookieValue = GetCookie ( COOKIE_HOST , loginCookieName ); string loginSessionValue = GetCookie ( COOKIE_HOST , loginSessionCookieName ); //Cookie retreival has gone wrong (usually its because of python not being installed properly) if ( loginCookieValue == \"\" || loginSessionValue == \"\" ) return 100 ; var service = FirefoxDriverService . CreateDefaultService ( GECKODRIVER_FILENAME ); service . Host = \"127.0.0.1\" ; service . Port = 5555 ; FirefoxProfile profile = new FirefoxProfile (); FirefoxOptions options = new FirefoxOptions (); //profile.SetPreference(\"full-screen-api.ignore-widgets\", true); //profile.SetPreference(\"media.hardware-video-decoding.enabled\", true); //profile.SetPreference(\"full-screen-api.enabled\", true); options . Profile = profile ; profile . SetPreference ( \"layout.css.devPixelsPerPx\" , \"1.0\" ); options . AcceptInsecureCertificates = true ; options . AddArgument ( \"--headless\" ); //options.AddArgument(\"--start-maximized\"); //options.AddArgument(\"--window-size=1920x1080\"); //options.AddArgument(\"--width=\" + windowWidth); //options.AddArgument(\"--height=\" + windowHeight); //options.AddArgument(\"-window-size=1920x1080\"); //options.AddArgument(\"--width=1920\"); //options.AddArgument(\"--height=1080\"); //profile try { Driver = new FirefoxDriver ( service , options ); } catch { Ready = false ; return 101 ; } Actions actions = new Actions ( Driver ); var loginCookie = new Cookie ( loginCookieName , loginCookieValue , COOKIE_HOST , \"/\" , DateTime . Now . AddDays ( 5 )); var loginSessionCookie = new Cookie ( loginSessionCookieName , loginSessionValue , COOKIE_HOST , \"/\" , DateTime . Now . AddDays ( 5 )); Driver . Navigate (). GoToUrl ( \"https://f1tv.formula1.com/\" ); Driver . Manage (). Cookies . AddCookie ( loginCookie ); Driver . Manage (). Cookies . AddCookie ( loginSessionCookie ); try { Driver . Navigate (). GoToUrl ( GrandPrixUrl ); } catch { //The url is not a valid url Driver . Dispose (); return 103 ; } //Waits for the page to fully load Driver . Manage (). Timeouts (). PageLoad = TimeSpan . FromSeconds ( 30 ); //Removes the cookie prompt try { IWebElement conscentButton = Driver . FindElement ( By . Id ( \"truste-consent-button\" )); conscentButton . Click (); } catch { //Could not locate the cookie button Screenshot ( \"ERROR104\" ); Driver . Dispose (); return 104 ; } //Again waits for the page to fully load (when you accept cookies it takes a little time for the page to load) //Cannot use The timeout because the feed loading is not really loading so there is not event or anything Thread . Sleep ( 5000 ); //Switches to the Data channel try { IWebElement dataChannelButton = Driver . FindElement ( By . ClassName ( \"data-button\" )); dataChannelButton . Click (); } catch { //If the data button does not exists its because the user is not connected Screenshot ( \"ERROR102\" ); Driver . Dispose (); return 102 ; } //Open settings // Press the space key, this should make the setting button visible // It does not matter if the feed is paused because when changing channel it autoplays actions . SendKeys ( OpenQA . Selenium . Keys . Space ). Perform (); //Clicks on the settings Icon int settingsClickTries = 0 ; bool settingsClickSuccess = false ; while ( settingsClickTries < 100 && ! settingsClickSuccess ) { Thread . Sleep ( 100 ); try { IWebElement settingsButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-settingstogglebutton\" )); settingsButton . Click (); IWebElement selectElement = Driver . FindElement ( By . ClassName ( \"bmpui-ui-videoqualityselectbox\" )); SelectElement select = new SelectElement ( selectElement ); IWebElement selectOption = selectElement . FindElement ( By . CssSelector ( \"option[value^='1080_']\" )); selectOption . Click (); settingsClickSuccess = true ; } catch { //Sometimes it can crash because it could not get the options to show up in time. When it happens just retry settingsClickSuccess = false ; settingsClickTries ++; } } if (! settingsClickSuccess ) { Screenshot ( \"ERROR105\" ); Driver . Dispose (); return 105 ; } Screenshot ( \"BEFOREFULLSCREEN\" ); //Makes the feed fullscreen int fullScreenClickTries = 0 ; bool fullScreenClickSuccess = false ; Driver . Manage (). Window . Maximize (); //WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10)); while ( fullScreenClickTries < 100 && ! fullScreenClickSuccess ) { Thread . Sleep ( 150 ); try { IWebElement fullScreenButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-fullscreentogglebutton\" )); fullScreenButton . Click (); fullScreenClickSuccess = true ; } catch { fullScreenClickSuccess = false ; fullScreenClickTries ++; } } if (! fullScreenClickSuccess ) { Screenshot ( \"ERROR106\" ); Driver . Dispose (); return 106 ; } Screenshot ( \"AFTERFULLSCREEN\" ); //STARTUP FINISHED READY TO SCREENSHOT Ready = true ; return 0 ; } /// /// Takes a screenshot of what the headless browser is displaying /// /// Optional ! The name of the picture so it can be saved /// Returns the screenshot in the bitmap format public Bitmap Screenshot ( string name = \"TEST\" ) { Bitmap result = new Bitmap ( 4242 , 6969 ); try { //Screenshot scrsht = ((ITakesScreenshot)Driver).GetScreenshot(); //profileriver.SetPreferencC:\\Users\\Moi\\source\\repos\\Test_Merge\\README.mde(\"layout.css.devPixelsPerPx\", \"1.0\"); //Screenshot scrsht = Driver.GetFullPageScreenshot(); Screenshot scrsht = Driver . GetScreenshot (); byte [] screenshotBytes = Convert . FromBase64String ( scrsht . AsBase64EncodedString ); MemoryStream stream = new MemoryStream ( screenshotBytes ); result = new Bitmap ( stream ); //result.Save(name + \".png\"); scrsht . SaveAsFile ( name + \".png\" ); } catch { //Nothing for now } return result ; } /// /// Stops the Emulation. Note: if you plan to start it again please use ResetDriver() instead /// public void Stop () { Ready = false ; if ( Driver != null ) Driver . Dispose (); } /// /// Resets the emulation /// public void ResetDriver () { Ready = false ; if ( Driver != null ) Driver . Dispose (); Driver = null ; } } }","title":"F1TVEmulator.cs"},{"location":"Code/F1TVEmulator.html#f1tvemulatorcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : F1TVEmulator.cs /// Brief : Class that contains methods to emulate a browser and navigate the F1TV website /// Version : Alpha 1.0 using OpenQA.Selenium ; using OpenQA.Selenium.Firefox ; using OpenQA.Selenium.Interactions ; using OpenQA.Selenium.Support.UI ; using System ; using System.Collections.Generic ; using System.Diagnostics ; using System.Drawing ; using System.IO ; using System.Linq ; using System.Text ; using System.Threading ; using System.Threading.Tasks ; namespace TrackTrends { internal class F1TVEmulator { public const string COOKIE_HOST = \".formula1.com\" ; public const string PYTHON_COOKIE_RETRIEVAL_FILENAME = \"recoverCookiesCSV.py\" ; public const string GECKODRIVER_FILENAME = @\"geckodriver-v0.27.0-win64\\geckodriver.exe\" ; //BE CAREFULL IF YOU CHANGE IT HERE YOU NEED TO CHANGE IT IN THE PYTHON SCRIPT TOO public const string COOKIES_CSV_FILENAME = \"cookies.csv\" ; private FirefoxDriver Driver ; private bool _ready ; private string _grandPrixUrl ; public string GrandPrixUrl { get => _grandPrixUrl ; private set => _grandPrixUrl = value ; } public bool Ready { get => _ready ; set => _ready = value ; } public F1TVEmulator ( string grandPrixUrl ) { GrandPrixUrl = grandPrixUrl ; Ready = false ; } /// /// Will start the python programm that runs the Cookie Recovering /// private void StartCookieRecovering () { string scriptPath = PYTHON_COOKIE_RETRIEVAL_FILENAME ; Process process = new Process (); process . StartInfo . FileName = \"python.exe\" ; process . StartInfo . Arguments = scriptPath ; process . StartInfo . UseShellExecute = false ; process . StartInfo . RedirectStandardOutput = true ; process . Start (); string output = process . StandardOutput . ReadToEnd (); process . WaitForExit (); } /// /// Method that will recover the needed cookies in the DB /// /// The host of the wanted cookie ex: ./formula1.com /// The name of the wanted cookie ex: login /// returns the value of the cookie if it has been found /// public string GetCookie ( string host , string name ) { StartCookieRecovering (); string value = \"\" ; List < Cookie > cookies = new List < Cookie >(); if ( File . Exists ( COOKIES_CSV_FILENAME )) { using ( var reader = new StreamReader ( COOKIES_CSV_FILENAME )) { // Read the header row and validate column order string header = reader . ReadLine (); string [] expectedColumns = { \"host_key\" , \"name\" , \"value\" , \"path\" , \"expires_utc\" , \"is_secure\" , \"is_httponly\" }; string [] actualColumns = header . Split ( ',' ); for ( int i = 0 ; i < expectedColumns . Length ; i ++) { if ( expectedColumns [ i ] != actualColumns [ i ]) { throw new InvalidOperationException ( $\"Expected column '{expectedColumns[i]}' at index {i} but found '{actualColumns[i]}'\" ); } } // Read each data row and parse values into a Cookie object while (! reader . EndOfStream ) { string line = reader . ReadLine (); string [] fields = line . Split ( ',' ); string hostname = fields [ 0 ]; string cookieName = fields [ 1 ]; if ( hostname == host && cookieName == name ) { value = fields [ 2 ]; } } } } return value ; } /// /// Starts the headless browser /// /// Error code 1xx public async Task < int > Start () { Ready = false ; string loginCookieName = \"login\" ; string loginSessionCookieName = \"login-session\" ; string loginCookieValue = GetCookie ( COOKIE_HOST , loginCookieName ); string loginSessionValue = GetCookie ( COOKIE_HOST , loginSessionCookieName ); //Cookie retreival has gone wrong (usually its because of python not being installed properly) if ( loginCookieValue == \"\" || loginSessionValue == \"\" ) return 100 ; var service = FirefoxDriverService . CreateDefaultService ( GECKODRIVER_FILENAME ); service . Host = \"127.0.0.1\" ; service . Port = 5555 ; FirefoxProfile profile = new FirefoxProfile (); FirefoxOptions options = new FirefoxOptions (); //profile.SetPreference(\"full-screen-api.ignore-widgets\", true); //profile.SetPreference(\"media.hardware-video-decoding.enabled\", true); //profile.SetPreference(\"full-screen-api.enabled\", true); options . Profile = profile ; profile . SetPreference ( \"layout.css.devPixelsPerPx\" , \"1.0\" ); options . AcceptInsecureCertificates = true ; options . AddArgument ( \"--headless\" ); //options.AddArgument(\"--start-maximized\"); //options.AddArgument(\"--window-size=1920x1080\"); //options.AddArgument(\"--width=\" + windowWidth); //options.AddArgument(\"--height=\" + windowHeight); //options.AddArgument(\"-window-size=1920x1080\"); //options.AddArgument(\"--width=1920\"); //options.AddArgument(\"--height=1080\"); //profile try { Driver = new FirefoxDriver ( service , options ); } catch { Ready = false ; return 101 ; } Actions actions = new Actions ( Driver ); var loginCookie = new Cookie ( loginCookieName , loginCookieValue , COOKIE_HOST , \"/\" , DateTime . Now . AddDays ( 5 )); var loginSessionCookie = new Cookie ( loginSessionCookieName , loginSessionValue , COOKIE_HOST , \"/\" , DateTime . Now . AddDays ( 5 )); Driver . Navigate (). GoToUrl ( \"https://f1tv.formula1.com/\" ); Driver . Manage (). Cookies . AddCookie ( loginCookie ); Driver . Manage (). Cookies . AddCookie ( loginSessionCookie ); try { Driver . Navigate (). GoToUrl ( GrandPrixUrl ); } catch { //The url is not a valid url Driver . Dispose (); return 103 ; } //Waits for the page to fully load Driver . Manage (). Timeouts (). PageLoad = TimeSpan . FromSeconds ( 30 ); //Removes the cookie prompt try { IWebElement conscentButton = Driver . FindElement ( By . Id ( \"truste-consent-button\" )); conscentButton . Click (); } catch { //Could not locate the cookie button Screenshot ( \"ERROR104\" ); Driver . Dispose (); return 104 ; } //Again waits for the page to fully load (when you accept cookies it takes a little time for the page to load) //Cannot use The timeout because the feed loading is not really loading so there is not event or anything Thread . Sleep ( 5000 ); //Switches to the Data channel try { IWebElement dataChannelButton = Driver . FindElement ( By . ClassName ( \"data-button\" )); dataChannelButton . Click (); } catch { //If the data button does not exists its because the user is not connected Screenshot ( \"ERROR102\" ); Driver . Dispose (); return 102 ; } //Open settings // Press the space key, this should make the setting button visible // It does not matter if the feed is paused because when changing channel it autoplays actions . SendKeys ( OpenQA . Selenium . Keys . Space ). Perform (); //Clicks on the settings Icon int settingsClickTries = 0 ; bool settingsClickSuccess = false ; while ( settingsClickTries < 100 && ! settingsClickSuccess ) { Thread . Sleep ( 100 ); try { IWebElement settingsButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-settingstogglebutton\" )); settingsButton . Click (); IWebElement selectElement = Driver . FindElement ( By . ClassName ( \"bmpui-ui-videoqualityselectbox\" )); SelectElement select = new SelectElement ( selectElement ); IWebElement selectOption = selectElement . FindElement ( By . CssSelector ( \"option[value^='1080_']\" )); selectOption . Click (); settingsClickSuccess = true ; } catch { //Sometimes it can crash because it could not get the options to show up in time. When it happens just retry settingsClickSuccess = false ; settingsClickTries ++; } } if (! settingsClickSuccess ) { Screenshot ( \"ERROR105\" ); Driver . Dispose (); return 105 ; } Screenshot ( \"BEFOREFULLSCREEN\" ); //Makes the feed fullscreen int fullScreenClickTries = 0 ; bool fullScreenClickSuccess = false ; Driver . Manage (). Window . Maximize (); //WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10)); while ( fullScreenClickTries < 100 && ! fullScreenClickSuccess ) { Thread . Sleep ( 150 ); try { IWebElement fullScreenButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-fullscreentogglebutton\" )); fullScreenButton . Click (); fullScreenClickSuccess = true ; } catch { fullScreenClickSuccess = false ; fullScreenClickTries ++; } } if (! fullScreenClickSuccess ) { Screenshot ( \"ERROR106\" ); Driver . Dispose (); return 106 ; } Screenshot ( \"AFTERFULLSCREEN\" ); //STARTUP FINISHED READY TO SCREENSHOT Ready = true ; return 0 ; } /// /// Takes a screenshot of what the headless browser is displaying /// /// Optional ! The name of the picture so it can be saved /// Returns the screenshot in the bitmap format public Bitmap Screenshot ( string name = \"TEST\" ) { Bitmap result = new Bitmap ( 4242 , 6969 ); try { //Screenshot scrsht = ((ITakesScreenshot)Driver).GetScreenshot(); //profileriver.SetPreferencC:\\Users\\Moi\\source\\repos\\Test_Merge\\README.mde(\"layout.css.devPixelsPerPx\", \"1.0\"); //Screenshot scrsht = Driver.GetFullPageScreenshot(); Screenshot scrsht = Driver . GetScreenshot (); byte [] screenshotBytes = Convert . FromBase64String ( scrsht . AsBase64EncodedString ); MemoryStream stream = new MemoryStream ( screenshotBytes ); result = new Bitmap ( stream ); //result.Save(name + \".png\"); scrsht . SaveAsFile ( name + \".png\" ); } catch { //Nothing for now } return result ; } /// /// Stops the Emulation. Note: if you plan to start it again please use ResetDriver() instead /// public void Stop () { Ready = false ; if ( Driver != null ) Driver . Dispose (); } /// /// Resets the emulation /// public void ResetDriver () { Ready = false ; if ( Driver != null ) Driver . Dispose (); Driver = null ; } } }","title":"F1TVEmulator.cs"},{"location":"Code/Form1.html","text":"Form1.cs using System ; using System.Collections.Generic ; using System.ComponentModel ; using System.Data ; using System.Diagnostics ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.IO ; namespace TrackTrends { public partial class Main : Form { //private Reader Reader = null; private F1TVEmulator Emulator = null ; private DataWrapper Wrapper = null ; private bool cancelRequested = false ; private SemaphoreSlim semaphore = new SemaphoreSlim ( 1 ); string ConfigFile = \"\" ; string GpUrl = \"\" ; //For the responsive content Size oldSize = new Size (); Size oldRankingSize = new Size (); Size oldLapTimesSize = new Size (); Size oldBattles = new Size (); Size oldPnlBattles = new Size (); Size oldPnlRankings = new Size (); Size oldPnlFastest = new Size (); Size oldPnlSlowest = new Size (); Point oldRankingPosition = new Point (); Point oldBattlePosition = new Point (); Point oldDriverInfoPosition = new Point (); Point olPnlFastestPosition = new Point (); Point oldPnlSlowestPosition = new Point (); public Main () { InitializeComponent (); } public async void RefreshUI () { if ( Directory . Exists ( ConfigurationTool . CONFIGS_FOLDER_NAME )) { lsbPresets . DataSource = null ; lsbPresets . DataSource = Directory . GetFiles ( ConfigurationTool . CONFIGS_FOLDER_NAME ); } } private async void btnSettings_Click ( object sender , EventArgs e ) { if ( Emulator != null ) Emulator . ResetDriver (); btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = false ; btnResetEmulator . Text = \"Launch\" ; Emulator = null ; Wrapper = null ; GC . Collect (); Settings settingsForm = new Settings (); settingsForm . ShowDialog (); RefreshUI (); //MessageBox.Show(settingsForm.GrandPrixUrl + Environment.NewLine + settingsForm.GrandPrixName + Environment.NewLine + settingsForm.GrandPrixYear); if ( settingsForm . GrandPrixUrl != \"\" && settingsForm . SelectedConfigFile != \"\" ) { GpUrl = settingsForm . GrandPrixUrl ; tbxGpUrl . Text = GpUrl ; if ( File . Exists ( settingsForm . SelectedConfigFile )) { ConfigFile = settingsForm . SelectedConfigFile ; for ( int i = 0 ; i < lsbPresets . Items . Count ; i ++) { if ( lsbPresets . Items [ i ]. ToString () == ConfigFile ) lsbPresets . SelectedIndex = i ; } } else { MessageBox . Show ( \"The config file has not been found please return to the config and change it\" ); } } else { //WE dont care anymore, the user will choose its Grand Prix himself in the main program //MessageBox.Show(\"There is no URL for the Grand Prix you want to decode. Please return to the config and add a valid one\"); } } private async void Form1_Load ( object sender , EventArgs e ) { //Those are the default values but they will need to be changed later when the configuration has been done ConfigFile = \"./Presets/Clean_4K_2023.json\" ; GpUrl = \"https://f1tv.formula1.com/detail/1000006688/2023-azerbaijan-grand-prix?action=play\" ; tbxGpUrl . Text = GpUrl ; oldSize = this . Size ; oldRankingSize = gpbxRanking . Size ; oldLapTimesSize = gpbxLapTimes . Size ; oldBattles = gpbxBattles . Size ; oldPnlRankings = pnlLiveRanking . Size ; oldPnlBattles = pnlBattles . Size ; oldPnlFastest = pnlFastest . Size ; oldPnlSlowest = pnlSlowest . Size ; oldRankingPosition = gpbxRanking . Location ; oldBattlePosition = gpbxBattles . Location ; oldDriverInfoPosition = gpbxDriverInfos . Location ; olPnlFastestPosition = pnlFastest . Location ; oldPnlSlowestPosition = pnlSlowest . Location ; tip1 . SetToolTip ( btnResetEmulator , \"Starts or restarts the emulator. You need to start this to use the app\" ); tip1 . SetToolTip ( btnSettings , \"Opens the configuration menu\" ); tip1 . SetToolTip ( tbxGpUrl , \"Insert the URL of the Grand Prix you want to track. Dont forget the \\\"?action=play\\\" at the end\" ); tip1 . SetToolTip ( lsbPresets , \"Select a configuration preset to use with the decoding\" ); tip1 . SetToolTip ( pbxResult , \"A preview of what the program sees. You should see the DATA page of the F1TV here\" ); tip1 . SetToolTip ( lsbOvertakes , \"A list of all the activity. You can scroll to see the most recent overtakes\" ); tip1 . SetToolTip ( gpbxBattles , \"The four first battles in the field. A battle is two drivers less than 3 seconds apart\" ); tip1 . SetToolTip ( gpbxLapTimes , \"The fastest and slowest drivers on track at the moment. It takes the average lapTime of the last 5 laps to choose who is the fastes or the slowest\" ); RefreshUI (); } private async void btnUpdate_Click ( object sender , EventArgs e ) { cancelRequested = false ; if ( Emulator != null && Wrapper != null ) { // Disable UI controls to prevent re-entrancy btnResetEmulator . Enabled = false ; btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = true ; btnSettings . Enabled = false ; while (! cancelRequested ) { await semaphore . WaitAsync (); try { // Start the time-consuming task on a separate thread await Task . Run ( async () => { Stopwatch sw = new Stopwatch (); sw . Start (); Bitmap screen = Emulator . Screenshot (); screen . Save ( \"HopefullyDataScreenshot.png\" ); Invoke (( MethodInvoker ) delegate { pbxResult . Image = ( Bitmap ) screen . Clone (); }); Wrapper . ChangeImage ( screen ); int errorCode = Wrapper . Refresh (); sw . Stop (); // Task completed Invoke (( MethodInvoker ) delegate { DisplayResults ( errorCode , sw , screen ); DisplayBattles (); DisplayDeltas (); DisplayOvertakes (); }); }); } finally { semaphore . Release (); } } // Re-enable UI controls btnStopUpdating . Text = \"Stop\" ; btnStartDecoding . Enabled = true ; btnStopUpdating . Enabled = false ; btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; } } private void DisplayOvertakes () { Wrapper . DisplayOvertakes ( lsbOvertakes ); } private void DisplayBattles () { Wrapper . DisplayBattles ( pnlBattles , this ); } private void DisplayDeltas () { Wrapper . DisplayTimesDeltas ( pnlFastest , pnlSlowest , this ); } private void Form1_FormClosing ( object sender , FormClosingEventArgs e ) { if ( Emulator != null ) { Emulator . Stop (); } } private void DisplayResults ( int errorCode , Stopwatch sw , Bitmap screen ) { if ( errorCode != 0 ) { cancelRequested = true ; MessageBox . Show ( \"An error has occured while trying to recover data from live feed. This can happen sometimes. I would advise you to restart a few times. If the problem persists check your configuration.\" ); } else { Wrapper . DisplayLiveRanking ( pnlLiveRanking , this ); } } private void btnStopUpdating_Click ( object sender , EventArgs e ) { // Set the cancellation flag cancelRequested = true ; btnStopUpdating . Enabled = false ; btnResetEmulator . Enabled = false ; btnStopUpdating . Text = \"Stopping\" ; } private async void button1_Click ( object sender , EventArgs e ) { lsbOvertakes . Items . Clear (); btnResetEmulator . Text = \"Launching\" ; btnResetEmulator . Enabled = false ; btnSettings . Enabled = true ; btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = false ; btnSettings . Enabled = false ; int errorCode = - 1 ; await Task . Run ( async () => { if ( Emulator != null ) Emulator . ResetDriver (); Emulator = null ; Wrapper = null ; GC . Collect (); Emulator = new F1TVEmulator ( GpUrl ); errorCode = await Emulator . Start (); }); if ( errorCode != 0 ) { string message = \"\" ; switch ( errorCode ) { case 100 : message = \"Error \" + errorCode + \" Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again\" ; break ; case 101 : message = \"Error \" + errorCode + \" Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again\" ; break ; case 102 : message = \"Error \" + errorCode + \" Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update\" ; break ; case 103 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 104 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 105 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; case 106 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; default : message = \"Could not start the emulator Error \" + errorCode ; break ; } MessageBox . Show ( message ); btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; btnResetEmulator . Text = \"Retry\" ; } else { Wrapper = new DataWrapper ( ConfigFile , Emulator . Screenshot ()); btnResetEmulator . Text = \"Re launch\" ; btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; btnStartDecoding . Enabled = true ; } } private void removeBorders ( object sender , PaintEventArgs e ) { GroupBox gpbx = ( GroupBox ) sender ; using ( Pen pen = new Pen ( gpbx . BackColor , 50 )) { e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); } using ( var brush = new SolidBrush ( gpbx . ForeColor )) { var textPosition = new Point ( 5 , 0 ); // Adjust the X and Y values as needed e . Graphics . DrawString ( gpbx . Text , gpbx . Font , brush , textPosition ); } } private void lsbPresets_SelectedIndexChanged ( object sender , EventArgs e ) { if ( lsbPresets . SelectedIndex >= 0 ) ConfigFile = lsbPresets . Items [ lsbPresets . SelectedIndex ]. ToString (); } private void textBox1_TextChanged ( object sender , EventArgs e ) { if ( tbxGpUrl . Text != \"\" ) GpUrl = tbxGpUrl . Text ; } public void btnDriver_Click ( object sender , EventArgs e ) { //Removes the cover if ( pnlCover . Visible = true ) pnlCover . Visible = false ; //Happens when a driver button has been clicked //MessageBox.Show((sender as Button).Name + \" has been selected\"); Button btn = ( sender as Button ); string [] parts = btn . Name . Split ( '_' ); DriverData driver = Wrapper . GetFullDriverData ( parts [ 0 ], pnlCurrentDriverLapsHistory , this ); lblCurrentDriverName . Text = driver . Name ; lblCurrentDriverPosition . Text = driver . Position . ToString (); lblCurrentDriverGapToLeader . Text = Reader . ConvertMsToTime ( driver . GapToLeader ); lblCurrentDriverLapTime . Text = Reader . ConvertMsToTime ( driver . LapTime ); lblCurrentDriverTyreAge . Text = driver . CurrentTyre . NumberOfLaps . ToString (); if ( driver . DRS ) { lblCurrentDriverDRS . Text = \"Open\" ; lblCurrentDriverDRS . ForeColor = Color . FromArgb ( 0 , 164 , 46 ); } else { lblCurrentDriverDRS . Text = \"Closed\" ; lblCurrentDriverDRS . ForeColor = Color . Black ; } switch ( driver . CurrentTyre . Coumpound ) { case Tyre . Type . Undefined : lblCurrentDriverTyreType . Text = \"uuuuh...\" ; lblCurrentDriverTyreType . ForeColor = Color . Violet ; break ; case Tyre . Type . Hard : lblCurrentDriverTyreType . Text = \"Hard\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 164 , 165 , 168 ); break ; case Tyre . Type . Medium : lblCurrentDriverTyreType . Text = \"Medium\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 245 , 191 , 0 ); break ; case Tyre . Type . Soft : lblCurrentDriverTyreType . Text = \"Soft\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 255 , 0 , 0 ); break ; case Tyre . Type . Inter : lblCurrentDriverTyreType . Text = \"Intermediate\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 0 , 164 , 46 ); break ; case Tyre . Type . Wet : lblCurrentDriverTyreType . Text = \"Wet\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 39 , 96 , 166 ); break ; } } public void btnLapTime_Click ( object sender , EventArgs e ) { //Happens when a lapTime has been clicked Button btn = sender as Button ; string [] parts = btn . Name . Split ( '_' ); Wrapper . DisplayLapTimeInfos ( parts [ 0 ], Convert . ToInt32 ( parts [ 1 ]), btn . Text ); } private void Main_Resize ( object sender , EventArgs e ) { int xDiff = this . Width - oldSize . Width ; int yDiff = this . Height - oldSize . Height ; int padding = 10 ; //This will take half the newly created space gpbxRanking . Size = new Size ( oldRankingSize . Width + xDiff / 2 , oldRankingSize . Height + yDiff ); gpbxRanking . Location = new Point ( oldRankingPosition . X + xDiff / 2 , gpbxRanking . Location . Y ); //Will take half the new height and half the new height gpbxLapTimes . Size = new Size ( oldLapTimesSize . Width + xDiff / 2 , oldLapTimesSize . Height + yDiff / 2 ); //Will take half the new height and half the new width gpbxBattles . Size = new Size ( oldBattles . Width + xDiff / 2 , oldBattles . Height + yDiff / 2 ); gpbxBattles . Location = new Point ( gpbxBattles . Location . X , oldBattlePosition . Y + yDiff / 2 ); //The infos wont change width but will need to be centerd Point startOfZone = new Point ( gpbxOvertakes . Width + gpbxOvertakes . Location . X , gpbxOvertakes . Location . Y ); Point endOfZone = new Point ( gpbxRanking . Location . X , gpbxOvertakes . Location . Y ); int totalWidth = endOfZone . X - startOfZone . X ; gpbxDriverInfos . Location = new Point ( startOfZone . X + ( totalWidth / 2 - gpbxDriverInfos . Width / 2 ), oldDriverInfoPosition . Y + yDiff ); //Now resizing internals pnlFastest . Size = new Size ( oldPnlFastest . Width + xDiff / 4 , oldPnlFastest . Height + yDiff / 4 ); pnlFastest . Location = new Point ( olPnlFastestPosition . X , olPnlFastestPosition . Y + yDiff / 4 ); pnlSlowest . Size = new Size ( oldPnlSlowest . Width + xDiff / 4 , oldPnlSlowest . Height + yDiff / 4 ); pnlSlowest . Location = new Point ( oldPnlSlowestPosition . X + xDiff / 4 , oldPnlSlowestPosition . Y + yDiff / 4 ); pnlBattles . Size = new Size ( oldPnlBattles . Width + xDiff / 2 , oldPnlBattles . Height + yDiff / 2 ); pnlLiveRanking . Size = new Size ( oldPnlRankings . Width + xDiff / 2 , oldPnlRankings . Height + yDiff ); } } }","title":"Form1.cs"},{"location":"Code/Form1.html#form1cs","text":"using System ; using System.Collections.Generic ; using System.ComponentModel ; using System.Data ; using System.Diagnostics ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.IO ; namespace TrackTrends { public partial class Main : Form { //private Reader Reader = null; private F1TVEmulator Emulator = null ; private DataWrapper Wrapper = null ; private bool cancelRequested = false ; private SemaphoreSlim semaphore = new SemaphoreSlim ( 1 ); string ConfigFile = \"\" ; string GpUrl = \"\" ; //For the responsive content Size oldSize = new Size (); Size oldRankingSize = new Size (); Size oldLapTimesSize = new Size (); Size oldBattles = new Size (); Size oldPnlBattles = new Size (); Size oldPnlRankings = new Size (); Size oldPnlFastest = new Size (); Size oldPnlSlowest = new Size (); Point oldRankingPosition = new Point (); Point oldBattlePosition = new Point (); Point oldDriverInfoPosition = new Point (); Point olPnlFastestPosition = new Point (); Point oldPnlSlowestPosition = new Point (); public Main () { InitializeComponent (); } public async void RefreshUI () { if ( Directory . Exists ( ConfigurationTool . CONFIGS_FOLDER_NAME )) { lsbPresets . DataSource = null ; lsbPresets . DataSource = Directory . GetFiles ( ConfigurationTool . CONFIGS_FOLDER_NAME ); } } private async void btnSettings_Click ( object sender , EventArgs e ) { if ( Emulator != null ) Emulator . ResetDriver (); btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = false ; btnResetEmulator . Text = \"Launch\" ; Emulator = null ; Wrapper = null ; GC . Collect (); Settings settingsForm = new Settings (); settingsForm . ShowDialog (); RefreshUI (); //MessageBox.Show(settingsForm.GrandPrixUrl + Environment.NewLine + settingsForm.GrandPrixName + Environment.NewLine + settingsForm.GrandPrixYear); if ( settingsForm . GrandPrixUrl != \"\" && settingsForm . SelectedConfigFile != \"\" ) { GpUrl = settingsForm . GrandPrixUrl ; tbxGpUrl . Text = GpUrl ; if ( File . Exists ( settingsForm . SelectedConfigFile )) { ConfigFile = settingsForm . SelectedConfigFile ; for ( int i = 0 ; i < lsbPresets . Items . Count ; i ++) { if ( lsbPresets . Items [ i ]. ToString () == ConfigFile ) lsbPresets . SelectedIndex = i ; } } else { MessageBox . Show ( \"The config file has not been found please return to the config and change it\" ); } } else { //WE dont care anymore, the user will choose its Grand Prix himself in the main program //MessageBox.Show(\"There is no URL for the Grand Prix you want to decode. Please return to the config and add a valid one\"); } } private async void Form1_Load ( object sender , EventArgs e ) { //Those are the default values but they will need to be changed later when the configuration has been done ConfigFile = \"./Presets/Clean_4K_2023.json\" ; GpUrl = \"https://f1tv.formula1.com/detail/1000006688/2023-azerbaijan-grand-prix?action=play\" ; tbxGpUrl . Text = GpUrl ; oldSize = this . Size ; oldRankingSize = gpbxRanking . Size ; oldLapTimesSize = gpbxLapTimes . Size ; oldBattles = gpbxBattles . Size ; oldPnlRankings = pnlLiveRanking . Size ; oldPnlBattles = pnlBattles . Size ; oldPnlFastest = pnlFastest . Size ; oldPnlSlowest = pnlSlowest . Size ; oldRankingPosition = gpbxRanking . Location ; oldBattlePosition = gpbxBattles . Location ; oldDriverInfoPosition = gpbxDriverInfos . Location ; olPnlFastestPosition = pnlFastest . Location ; oldPnlSlowestPosition = pnlSlowest . Location ; tip1 . SetToolTip ( btnResetEmulator , \"Starts or restarts the emulator. You need to start this to use the app\" ); tip1 . SetToolTip ( btnSettings , \"Opens the configuration menu\" ); tip1 . SetToolTip ( tbxGpUrl , \"Insert the URL of the Grand Prix you want to track. Dont forget the \\\"?action=play\\\" at the end\" ); tip1 . SetToolTip ( lsbPresets , \"Select a configuration preset to use with the decoding\" ); tip1 . SetToolTip ( pbxResult , \"A preview of what the program sees. You should see the DATA page of the F1TV here\" ); tip1 . SetToolTip ( lsbOvertakes , \"A list of all the activity. You can scroll to see the most recent overtakes\" ); tip1 . SetToolTip ( gpbxBattles , \"The four first battles in the field. A battle is two drivers less than 3 seconds apart\" ); tip1 . SetToolTip ( gpbxLapTimes , \"The fastest and slowest drivers on track at the moment. It takes the average lapTime of the last 5 laps to choose who is the fastes or the slowest\" ); RefreshUI (); } private async void btnUpdate_Click ( object sender , EventArgs e ) { cancelRequested = false ; if ( Emulator != null && Wrapper != null ) { // Disable UI controls to prevent re-entrancy btnResetEmulator . Enabled = false ; btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = true ; btnSettings . Enabled = false ; while (! cancelRequested ) { await semaphore . WaitAsync (); try { // Start the time-consuming task on a separate thread await Task . Run ( async () => { Stopwatch sw = new Stopwatch (); sw . Start (); Bitmap screen = Emulator . Screenshot (); screen . Save ( \"HopefullyDataScreenshot.png\" ); Invoke (( MethodInvoker ) delegate { pbxResult . Image = ( Bitmap ) screen . Clone (); }); Wrapper . ChangeImage ( screen ); int errorCode = Wrapper . Refresh (); sw . Stop (); // Task completed Invoke (( MethodInvoker ) delegate { DisplayResults ( errorCode , sw , screen ); DisplayBattles (); DisplayDeltas (); DisplayOvertakes (); }); }); } finally { semaphore . Release (); } } // Re-enable UI controls btnStopUpdating . Text = \"Stop\" ; btnStartDecoding . Enabled = true ; btnStopUpdating . Enabled = false ; btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; } } private void DisplayOvertakes () { Wrapper . DisplayOvertakes ( lsbOvertakes ); } private void DisplayBattles () { Wrapper . DisplayBattles ( pnlBattles , this ); } private void DisplayDeltas () { Wrapper . DisplayTimesDeltas ( pnlFastest , pnlSlowest , this ); } private void Form1_FormClosing ( object sender , FormClosingEventArgs e ) { if ( Emulator != null ) { Emulator . Stop (); } } private void DisplayResults ( int errorCode , Stopwatch sw , Bitmap screen ) { if ( errorCode != 0 ) { cancelRequested = true ; MessageBox . Show ( \"An error has occured while trying to recover data from live feed. This can happen sometimes. I would advise you to restart a few times. If the problem persists check your configuration.\" ); } else { Wrapper . DisplayLiveRanking ( pnlLiveRanking , this ); } } private void btnStopUpdating_Click ( object sender , EventArgs e ) { // Set the cancellation flag cancelRequested = true ; btnStopUpdating . Enabled = false ; btnResetEmulator . Enabled = false ; btnStopUpdating . Text = \"Stopping\" ; } private async void button1_Click ( object sender , EventArgs e ) { lsbOvertakes . Items . Clear (); btnResetEmulator . Text = \"Launching\" ; btnResetEmulator . Enabled = false ; btnSettings . Enabled = true ; btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = false ; btnSettings . Enabled = false ; int errorCode = - 1 ; await Task . Run ( async () => { if ( Emulator != null ) Emulator . ResetDriver (); Emulator = null ; Wrapper = null ; GC . Collect (); Emulator = new F1TVEmulator ( GpUrl ); errorCode = await Emulator . Start (); }); if ( errorCode != 0 ) { string message = \"\" ; switch ( errorCode ) { case 100 : message = \"Error \" + errorCode + \" Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again\" ; break ; case 101 : message = \"Error \" + errorCode + \" Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again\" ; break ; case 102 : message = \"Error \" + errorCode + \" Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update\" ; break ; case 103 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 104 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 105 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; case 106 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; default : message = \"Could not start the emulator Error \" + errorCode ; break ; } MessageBox . Show ( message ); btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; btnResetEmulator . Text = \"Retry\" ; } else { Wrapper = new DataWrapper ( ConfigFile , Emulator . Screenshot ()); btnResetEmulator . Text = \"Re launch\" ; btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; btnStartDecoding . Enabled = true ; } } private void removeBorders ( object sender , PaintEventArgs e ) { GroupBox gpbx = ( GroupBox ) sender ; using ( Pen pen = new Pen ( gpbx . BackColor , 50 )) { e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); } using ( var brush = new SolidBrush ( gpbx . ForeColor )) { var textPosition = new Point ( 5 , 0 ); // Adjust the X and Y values as needed e . Graphics . DrawString ( gpbx . Text , gpbx . Font , brush , textPosition ); } } private void lsbPresets_SelectedIndexChanged ( object sender , EventArgs e ) { if ( lsbPresets . SelectedIndex >= 0 ) ConfigFile = lsbPresets . Items [ lsbPresets . SelectedIndex ]. ToString (); } private void textBox1_TextChanged ( object sender , EventArgs e ) { if ( tbxGpUrl . Text != \"\" ) GpUrl = tbxGpUrl . Text ; } public void btnDriver_Click ( object sender , EventArgs e ) { //Removes the cover if ( pnlCover . Visible = true ) pnlCover . Visible = false ; //Happens when a driver button has been clicked //MessageBox.Show((sender as Button).Name + \" has been selected\"); Button btn = ( sender as Button ); string [] parts = btn . Name . Split ( '_' ); DriverData driver = Wrapper . GetFullDriverData ( parts [ 0 ], pnlCurrentDriverLapsHistory , this ); lblCurrentDriverName . Text = driver . Name ; lblCurrentDriverPosition . Text = driver . Position . ToString (); lblCurrentDriverGapToLeader . Text = Reader . ConvertMsToTime ( driver . GapToLeader ); lblCurrentDriverLapTime . Text = Reader . ConvertMsToTime ( driver . LapTime ); lblCurrentDriverTyreAge . Text = driver . CurrentTyre . NumberOfLaps . ToString (); if ( driver . DRS ) { lblCurrentDriverDRS . Text = \"Open\" ; lblCurrentDriverDRS . ForeColor = Color . FromArgb ( 0 , 164 , 46 ); } else { lblCurrentDriverDRS . Text = \"Closed\" ; lblCurrentDriverDRS . ForeColor = Color . Black ; } switch ( driver . CurrentTyre . Coumpound ) { case Tyre . Type . Undefined : lblCurrentDriverTyreType . Text = \"uuuuh...\" ; lblCurrentDriverTyreType . ForeColor = Color . Violet ; break ; case Tyre . Type . Hard : lblCurrentDriverTyreType . Text = \"Hard\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 164 , 165 , 168 ); break ; case Tyre . Type . Medium : lblCurrentDriverTyreType . Text = \"Medium\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 245 , 191 , 0 ); break ; case Tyre . Type . Soft : lblCurrentDriverTyreType . Text = \"Soft\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 255 , 0 , 0 ); break ; case Tyre . Type . Inter : lblCurrentDriverTyreType . Text = \"Intermediate\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 0 , 164 , 46 ); break ; case Tyre . Type . Wet : lblCurrentDriverTyreType . Text = \"Wet\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 39 , 96 , 166 ); break ; } } public void btnLapTime_Click ( object sender , EventArgs e ) { //Happens when a lapTime has been clicked Button btn = sender as Button ; string [] parts = btn . Name . Split ( '_' ); Wrapper . DisplayLapTimeInfos ( parts [ 0 ], Convert . ToInt32 ( parts [ 1 ]), btn . Text ); } private void Main_Resize ( object sender , EventArgs e ) { int xDiff = this . Width - oldSize . Width ; int yDiff = this . Height - oldSize . Height ; int padding = 10 ; //This will take half the newly created space gpbxRanking . Size = new Size ( oldRankingSize . Width + xDiff / 2 , oldRankingSize . Height + yDiff ); gpbxRanking . Location = new Point ( oldRankingPosition . X + xDiff / 2 , gpbxRanking . Location . Y ); //Will take half the new height and half the new height gpbxLapTimes . Size = new Size ( oldLapTimesSize . Width + xDiff / 2 , oldLapTimesSize . Height + yDiff / 2 ); //Will take half the new height and half the new width gpbxBattles . Size = new Size ( oldBattles . Width + xDiff / 2 , oldBattles . Height + yDiff / 2 ); gpbxBattles . Location = new Point ( gpbxBattles . Location . X , oldBattlePosition . Y + yDiff / 2 ); //The infos wont change width but will need to be centerd Point startOfZone = new Point ( gpbxOvertakes . Width + gpbxOvertakes . Location . X , gpbxOvertakes . Location . Y ); Point endOfZone = new Point ( gpbxRanking . Location . X , gpbxOvertakes . Location . Y ); int totalWidth = endOfZone . X - startOfZone . X ; gpbxDriverInfos . Location = new Point ( startOfZone . X + ( totalWidth / 2 - gpbxDriverInfos . Width / 2 ), oldDriverInfoPosition . Y + yDiff ); //Now resizing internals pnlFastest . Size = new Size ( oldPnlFastest . Width + xDiff / 4 , oldPnlFastest . Height + yDiff / 4 ); pnlFastest . Location = new Point ( olPnlFastestPosition . X , olPnlFastestPosition . Y + yDiff / 4 ); pnlSlowest . Size = new Size ( oldPnlSlowest . Width + xDiff / 4 , oldPnlSlowest . Height + yDiff / 4 ); pnlSlowest . Location = new Point ( oldPnlSlowestPosition . X + xDiff / 4 , oldPnlSlowestPosition . Y + yDiff / 4 ); pnlBattles . Size = new Size ( oldPnlBattles . Width + xDiff / 2 , oldPnlBattles . Height + yDiff / 2 ); pnlLiveRanking . Size = new Size ( oldPnlRankings . Width + xDiff / 2 , oldPnlRankings . Height + yDiff ); } } }","title":"Form1.cs"},{"location":"Code/Program.html","text":"Program.cs using System ; using System.Collections.Generic ; using System.Linq ; using System.Threading.Tasks ; using System.Windows.Forms ; namespace TrackTrends { internal static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main () { Application . EnableVisualStyles (); Application . SetCompatibleTextRenderingDefault ( false ); Application . Run ( new Main ()); } } }","title":"Program.cs"},{"location":"Code/Program.html#programcs","text":"using System ; using System.Collections.Generic ; using System.Linq ; using System.Threading.Tasks ; using System.Windows.Forms ; namespace TrackTrends { internal static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main () { Application . EnableVisualStyles (); Application . SetCompatibleTextRenderingDefault ( false ); Application . Run ( new Main ()); } } }","title":"Program.cs"},{"location":"Code/Settings.Designer.html","text":"Settings.Designer.cs namespace TrackTrends { partial class Settings { /// /// Required designer variable. /// private System . ComponentModel . IContainer components = null ; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose ( bool disposing ) { if ( disposing && ( components != null )) { components . Dispose (); } base . Dispose ( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent () { this . components = new System . ComponentModel . Container (); this . label1 = new System . Windows . Forms . Label (); this . label2 = new System . Windows . Forms . Label (); this . gpbxRaceSettings = new System . Windows . Forms . GroupBox (); this . tbxGpUrl = new System . Windows . Forms . TextBox (); this . gpbxDriverList = new System . Windows . Forms . GroupBox (); this . lsbDrivers = new System . Windows . Forms . ListBox (); this . btnRemoveDriver = new System . Windows . Forms . Button (); this . btnAddDriver = new System . Windows . Forms . Button (); this . tbxDriverName = new System . Windows . Forms . TextBox (); this . gpbxPreview = new System . Windows . Forms . GroupBox (); this . lblWindowsRemaining = new System . Windows . Forms . Label (); this . btnResetDriver = new System . Windows . Forms . Button (); this . btnRefresh = new System . Windows . Forms . Button (); this . lblWindowPointsRemaining = new System . Windows . Forms . Label (); this . lblZonePointsRemaning = new System . Windows . Forms . Label (); this . btnCreateWindow = new System . Windows . Forms . Button (); this . pbxPreview = new System . Windows . Forms . PictureBox (); this . btnCreatZone = new System . Windows . Forms . Button (); this . gpbxWindowPreview = new System . Windows . Forms . GroupBox (); this . pbxWindowPreview = new System . Windows . Forms . PictureBox (); this . btnLoadPreset = new System . Windows . Forms . Button (); this . lsbPresets = new System . Windows . Forms . ListBox (); this . tbxPresetName = new System . Windows . Forms . TextBox (); this . btnSavePreset = new System . Windows . Forms . Button (); this . gpbxPresets = new System . Windows . Forms . GroupBox (); this . btnDeletePreset = new System . Windows . Forms . Button (); this . tip1 = new System . Windows . Forms . ToolTip ( this . components ); this . gpbxRaceSettings . SuspendLayout (); this . gpbxDriverList . SuspendLayout (); this . gpbxPreview . SuspendLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxPreview )). BeginInit (); this . gpbxWindowPreview . SuspendLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxWindowPreview )). BeginInit (); this . gpbxPresets . SuspendLayout (); this . SuspendLayout (); // // label1 // this . label1 . AutoSize = true ; this . label1 . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 19.8F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . label1 . ForeColor = System . Drawing . Color . White ; this . label1 . Location = new System . Drawing . Point ( 12 , 14 ); this . label1 . Name = \"label1\" ; this . label1 . Size = new System . Drawing . Size ( 309 , 43 ); this . label1 . TabIndex = 0 ; this . label1 . Text = \"Configuration tool\" ; // // label2 // this . label2 . AutoSize = true ; this . label2 . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . label2 . ForeColor = System . Drawing . Color . White ; this . label2 . Location = new System . Drawing . Point ( 3 , 25 ); this . label2 . Name = \"label2\" ; this . label2 . Size = new System . Drawing . Size ( 132 , 23 ); this . label2 . TabIndex = 1 ; this . label2 . Text = \"Grand Prix URL\" ; // // gpbxRaceSettings // this . gpbxRaceSettings . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxRaceSettings . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxRaceSettings . Controls . Add ( this . tbxGpUrl ); this . gpbxRaceSettings . Controls . Add ( this . label2 ); this . gpbxRaceSettings . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . gpbxRaceSettings . ForeColor = System . Drawing . Color . White ; this . gpbxRaceSettings . Location = new System . Drawing . Point ( 733 , 9 ); this . gpbxRaceSettings . Name = \"gpbxRaceSettings\" ; this . gpbxRaceSettings . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxRaceSettings . Size = new System . Drawing . Size ( 521 , 58 ); this . gpbxRaceSettings . TabIndex = 2 ; this . gpbxRaceSettings . TabStop = false ; this . gpbxRaceSettings . Text = \"RaceSettings\" ; this . gpbxRaceSettings . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // tbxGpUrl // this . tbxGpUrl . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxGpUrl . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxGpUrl . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . tbxGpUrl . ForeColor = System . Drawing . Color . White ; this . tbxGpUrl . Location = new System . Drawing . Point ( 141 , 25 ); this . tbxGpUrl . Name = \"tbxGpUrl\" ; this . tbxGpUrl . Size = new System . Drawing . Size ( 367 , 22 ); this . tbxGpUrl . TabIndex = 4 ; this . tbxGpUrl . TextChanged += new System . EventHandler ( this . tbxGpUrl_TextChanged ); // // gpbxDriverList // this . gpbxDriverList . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxDriverList . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxDriverList . Controls . Add ( this . lsbDrivers ); this . gpbxDriverList . Controls . Add ( this . btnRemoveDriver ); this . gpbxDriverList . Controls . Add ( this . btnAddDriver ); this . gpbxDriverList . Controls . Add ( this . tbxDriverName ); this . gpbxDriverList . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxDriverList . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxDriverList . ForeColor = System . Drawing . Color . White ; this . gpbxDriverList . Location = new System . Drawing . Point ( 995 , 73 ); this . gpbxDriverList . Name = \"gpbxDriverList\" ; this . gpbxDriverList . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxDriverList . Size = new System . Drawing . Size ( 259 , 269 ); this . gpbxDriverList . TabIndex = 3 ; this . gpbxDriverList . TabStop = false ; this . gpbxDriverList . Text = \"DriverList\" ; this . gpbxDriverList . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // lsbDrivers // this . lsbDrivers . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . lsbDrivers . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . lsbDrivers . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . lsbDrivers . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . lsbDrivers . FormattingEnabled = true ; this . lsbDrivers . ItemHeight = 23 ; this . lsbDrivers . Location = new System . Drawing . Point ( 10 , 23 ); this . lsbDrivers . Name = \"lsbDrivers\" ; this . lsbDrivers . Size = new System . Drawing . Size ( 243 , 138 ); this . lsbDrivers . TabIndex = 10 ; // // btnRemoveDriver // this . btnRemoveDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnRemoveDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnRemoveDriver . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . btnRemoveDriver . ForeColor = System . Drawing . Color . White ; this . btnRemoveDriver . Location = new System . Drawing . Point ( 132 , 167 ); this . btnRemoveDriver . Name = \"btnRemoveDriver\" ; this . btnRemoveDriver . Size = new System . Drawing . Size ( 121 , 62 ); this . btnRemoveDriver . TabIndex = 9 ; this . btnRemoveDriver . Text = \"Remove\" ; this . btnRemoveDriver . UseVisualStyleBackColor = false ; this . btnRemoveDriver . Click += new System . EventHandler ( this . btnRemoveDriver_Click ); // // btnAddDriver // this . btnAddDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnAddDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnAddDriver . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . btnAddDriver . ForeColor = System . Drawing . Color . White ; this . btnAddDriver . Location = new System . Drawing . Point ( 10 , 167 ); this . btnAddDriver . Name = \"btnAddDriver\" ; this . btnAddDriver . Size = new System . Drawing . Size ( 116 , 62 ); this . btnAddDriver . TabIndex = 8 ; this . btnAddDriver . Text = \"Add\" ; this . btnAddDriver . UseVisualStyleBackColor = false ; this . btnAddDriver . Click += new System . EventHandler ( this . btnAddDriver_Click ); // // tbxDriverName // this . tbxDriverName . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxDriverName . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxDriverName . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 11F ); this . tbxDriverName . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . tbxDriverName . Location = new System . Drawing . Point ( 10 , 235 ); this . tbxDriverName . Name = \"tbxDriverName\" ; this . tbxDriverName . Size = new System . Drawing . Size ( 243 , 24 ); this . tbxDriverName . TabIndex = 7 ; // // gpbxPreview // this . gpbxPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxPreview . Controls . Add ( this . lblWindowsRemaining ); this . gpbxPreview . Controls . Add ( this . btnResetDriver ); this . gpbxPreview . Controls . Add ( this . btnRefresh ); this . gpbxPreview . Controls . Add ( this . lblWindowPointsRemaining ); this . gpbxPreview . Controls . Add ( this . lblZonePointsRemaning ); this . gpbxPreview . Controls . Add ( this . btnCreateWindow ); this . gpbxPreview . Controls . Add ( this . pbxPreview ); this . gpbxPreview . Controls . Add ( this . btnCreatZone ); this . gpbxPreview . FlatStyle = System . Windows . Forms . FlatStyle . Flat ; this . gpbxPreview . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxPreview . ForeColor = System . Drawing . Color . White ; this . gpbxPreview . Location = new System . Drawing . Point ( 18 , 73 ); this . gpbxPreview . Name = \"gpbxPreview\" ; this . gpbxPreview . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxPreview . Size = new System . Drawing . Size ( 968 , 608 ); this . gpbxPreview . TabIndex = 4 ; this . gpbxPreview . TabStop = false ; this . gpbxPreview . Text = \"Preview\" ; this . gpbxPreview . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // lblWindowsRemaining // this . lblWindowsRemaining . AutoSize = true ; this . lblWindowsRemaining . BackColor = System . Drawing . Color . Transparent ; this . lblWindowsRemaining . ForeColor = System . Drawing . Color . White ; this . lblWindowsRemaining . Location = new System . Drawing . Point ( 215 , 82 ); this . lblWindowsRemaining . Name = \"lblWindowsRemaining\" ; this . lblWindowsRemaining . Size = new System . Drawing . Size ( 183 , 23 ); this . lblWindowsRemaining . TabIndex = 6 ; this . lblWindowsRemaining . Text = \"7 windows remaining\" ; // // btnResetDriver // this . btnResetDriver . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . btnResetDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnResetDriver . Enabled = false ; this . btnResetDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnResetDriver . ForeColor = System . Drawing . Color . White ; this . btnResetDriver . Location = new System . Drawing . Point ( 748 , 20 ); this . btnResetDriver . Name = \"btnResetDriver\" ; this . btnResetDriver . Size = new System . Drawing . Size ( 211 , 33 ); this . btnResetDriver . TabIndex = 2 ; this . btnResetDriver . Text = \"Reset the emulator\" ; this . btnResetDriver . UseVisualStyleBackColor = false ; this . btnResetDriver . Click += new System . EventHandler ( this . btnResetDriver_Click ); // // btnRefresh // this . btnRefresh . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . btnRefresh . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnRefresh . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnRefresh . ForeColor = System . Drawing . Color . White ; this . btnRefresh . Location = new System . Drawing . Point ( 549 , 20 ); this . btnRefresh . Name = \"btnRefresh\" ; this . btnRefresh . Size = new System . Drawing . Size ( 193 , 33 ); this . btnRefresh . TabIndex = 1 ; this . btnRefresh . Text = \"Start the browser\" ; this . btnRefresh . UseVisualStyleBackColor = false ; this . btnRefresh . Click += new System . EventHandler ( this . btnRefresh_Click ); // // lblWindowPointsRemaining // this . lblWindowPointsRemaining . AutoSize = true ; this . lblWindowPointsRemaining . ForeColor = System . Drawing . Color . White ; this . lblWindowPointsRemaining . Location = new System . Drawing . Point ( 215 , 59 ); this . lblWindowPointsRemaining . Name = \"lblWindowPointsRemaining\" ; this . lblWindowPointsRemaining . Size = new System . Drawing . Size ( 163 , 23 ); this . lblWindowPointsRemaining . TabIndex = 4 ; this . lblWindowPointsRemaining . Text = \"0 points remaining\" ; // // lblZonePointsRemaning // this . lblZonePointsRemaning . AutoSize = true ; this . lblZonePointsRemaning . ForeColor = System . Drawing . Color . White ; this . lblZonePointsRemaning . Location = new System . Drawing . Point ( 19 , 59 ); this . lblZonePointsRemaning . Name = \"lblZonePointsRemaning\" ; this . lblZonePointsRemaning . Size = new System . Drawing . Size ( 163 , 23 ); this . lblZonePointsRemaning . TabIndex = 5 ; this . lblZonePointsRemaning . Text = \"0 points remaining\" ; // // btnCreateWindow // this . btnCreateWindow . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnCreateWindow . Enabled = false ; this . btnCreateWindow . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnCreateWindow . ForeColor = System . Drawing . Color . White ; this . btnCreateWindow . Location = new System . Drawing . Point ( 213 , 23 ); this . btnCreateWindow . Name = \"btnCreateWindow\" ; this . btnCreateWindow . Size = new System . Drawing . Size ( 201 , 33 ); this . btnCreateWindow . TabIndex = 2 ; this . btnCreateWindow . Text = \"Create the windows\" ; this . btnCreateWindow . UseVisualStyleBackColor = false ; this . btnCreateWindow . Click += new System . EventHandler ( this . btnCreateWindow_Click ); // // pbxPreview // this . pbxPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . pbxPreview . Location = new System . Drawing . Point ( 10 , 62 ); this . pbxPreview . Name = \"pbxPreview\" ; this . pbxPreview . Size = new System . Drawing . Size ( 950 , 540 ); this . pbxPreview . SizeMode = System . Windows . Forms . PictureBoxSizeMode . StretchImage ; this . pbxPreview . TabIndex = 0 ; this . pbxPreview . TabStop = false ; this . pbxPreview . Click += new System . EventHandler ( this . pbxMain_Click ); this . pbxPreview . MouseClick += new System . Windows . Forms . MouseEventHandler ( this . pbxMain_MouseClick ); // // btnCreatZone // this . btnCreatZone . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnCreatZone . Enabled = false ; this . btnCreatZone . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnCreatZone . ForeColor = System . Drawing . Color . White ; this . btnCreatZone . Location = new System . Drawing . Point ( 6 , 23 ); this . btnCreatZone . Name = \"btnCreatZone\" ; this . btnCreatZone . Size = new System . Drawing . Size ( 201 , 33 ); this . btnCreatZone . TabIndex = 1 ; this . btnCreatZone . Text = \"Create the main zone\" ; this . btnCreatZone . UseVisualStyleBackColor = false ; this . btnCreatZone . Click += new System . EventHandler ( this . btnCreatZone_Click ); // // gpbxWindowPreview // this . gpbxWindowPreview . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Bottom | System . Windows . Forms . AnchorStyles . Left ))); this . gpbxWindowPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxWindowPreview . Controls . Add ( this . pbxWindowPreview ); this . gpbxWindowPreview . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxWindowPreview . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxWindowPreview . ForeColor = System . Drawing . Color . White ; this . gpbxWindowPreview . Location = new System . Drawing . Point ( 18 , 688 ); this . gpbxWindowPreview . Name = \"gpbxWindowPreview\" ; this . gpbxWindowPreview . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxWindowPreview . Size = new System . Drawing . Size ( 1237 , 88 ); this . gpbxWindowPreview . TabIndex = 5 ; this . gpbxWindowPreview . TabStop = false ; this . gpbxWindowPreview . Text = \"DriverZonePreview\" ; this . gpbxWindowPreview . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // pbxWindowPreview // this . pbxWindowPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . pbxWindowPreview . Location = new System . Drawing . Point ( 6 , 30 ); this . pbxWindowPreview . Name = \"pbxWindowPreview\" ; this . pbxWindowPreview . Size = new System . Drawing . Size ( 1225 , 50 ); this . pbxWindowPreview . SizeMode = System . Windows . Forms . PictureBoxSizeMode . StretchImage ; this . pbxWindowPreview . TabIndex = 0 ; this . pbxWindowPreview . TabStop = false ; this . pbxWindowPreview . Click += new System . EventHandler ( this . pbxDriverZone_Click ); this . pbxWindowPreview . MouseClick += new System . Windows . Forms . MouseEventHandler ( this . pbxDriverZone_MouseClick ); // // btnLoadPreset // this . btnLoadPreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnLoadPreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnLoadPreset . ForeColor = System . Drawing . Color . White ; this . btnLoadPreset . Location = new System . Drawing . Point ( 10 , 213 ); this . btnLoadPreset . Name = \"btnLoadPreset\" ; this . btnLoadPreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnLoadPreset . TabIndex = 10 ; this . btnLoadPreset . Text = \"Load the preset\" ; this . btnLoadPreset . UseVisualStyleBackColor = false ; this . btnLoadPreset . Click += new System . EventHandler ( this . btnLoadPreset_Click ); // // lsbPresets // this . lsbPresets . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . lsbPresets . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . lsbPresets . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . lsbPresets . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . lsbPresets . FormattingEnabled = true ; this . lsbPresets . ItemHeight = 23 ; this . lsbPresets . Location = new System . Drawing . Point ( 10 , 23 ); this . lsbPresets . Name = \"lsbPresets\" ; this . lsbPresets . Size = new System . Drawing . Size ( 243 , 138 ); this . lsbPresets . TabIndex = 8 ; this . lsbPresets . SelectedIndexChanged += new System . EventHandler ( this . lsbPresets_SelectedIndexChanged ); // // tbxPresetName // this . tbxPresetName . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxPresetName . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxPresetName . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 11F ); this . tbxPresetName . ForeColor = System . Drawing . Color . White ; this . tbxPresetName . Location = new System . Drawing . Point ( 10 , 303 ); this . tbxPresetName . Name = \"tbxPresetName\" ; this . tbxPresetName . Size = new System . Drawing . Size ( 243 , 24 ); this . tbxPresetName . TabIndex = 7 ; // // btnSavePreset // this . btnSavePreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnSavePreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnSavePreset . ForeColor = System . Drawing . Color . White ; this . btnSavePreset . Location = new System . Drawing . Point ( 10 , 259 ); this . btnSavePreset . Name = \"btnSavePreset\" ; this . btnSavePreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnSavePreset . TabIndex = 7 ; this . btnSavePreset . Text = \"Save current preset\" ; this . btnSavePreset . UseVisualStyleBackColor = false ; this . btnSavePreset . Click += new System . EventHandler ( this . btnSavePreset_Click ); // // gpbxPresets // this . gpbxPresets . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxPresets . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxPresets . Controls . Add ( this . btnSavePreset ); this . gpbxPresets . Controls . Add ( this . btnDeletePreset ); this . gpbxPresets . Controls . Add ( this . tbxPresetName ); this . gpbxPresets . Controls . Add ( this . btnLoadPreset ); this . gpbxPresets . Controls . Add ( this . lsbPresets ); this . gpbxPresets . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxPresets . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxPresets . ForeColor = System . Drawing . Color . White ; this . gpbxPresets . Location = new System . Drawing . Point ( 995 , 348 ); this . gpbxPresets . Name = \"gpbxPresets\" ; this . gpbxPresets . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxPresets . Size = new System . Drawing . Size ( 259 , 333 ); this . gpbxPresets . TabIndex = 6 ; this . gpbxPresets . TabStop = false ; this . gpbxPresets . Text = \"Presets\" ; this . gpbxPresets . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // btnDeletePreset // this . btnDeletePreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnDeletePreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnDeletePreset . ForeColor = System . Drawing . Color . White ; this . btnDeletePreset . Location = new System . Drawing . Point ( 10 , 167 ); this . btnDeletePreset . Name = \"btnDeletePreset\" ; this . btnDeletePreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnDeletePreset . TabIndex = 11 ; this . btnDeletePreset . Text = \"Delete the preset\" ; this . btnDeletePreset . UseVisualStyleBackColor = false ; this . btnDeletePreset . Click += new System . EventHandler ( this . btnDeletePreset_Click ); // // Settings // this . AutoScaleDimensions = new System . Drawing . SizeF ( 8F , 19F ); this . AutoScaleMode = System . Windows . Forms . AutoScaleMode . Font ; this . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . ClientSize = new System . Drawing . Size ( 1266 , 788 ); this . Controls . Add ( this . gpbxPresets ); this . Controls . Add ( this . gpbxWindowPreview ); this . Controls . Add ( this . gpbxPreview ); this . Controls . Add ( this . gpbxDriverList ); this . Controls . Add ( this . label1 ); this . Controls . Add ( this . gpbxRaceSettings ); this . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 7.8F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . Margin = new System . Windows . Forms . Padding ( 3 , 4 , 3 , 4 ); this . MinimumSize = new System . Drawing . Size ( 1284 , 835 ); this . Name = \"Settings\" ; this . StartPosition = System . Windows . Forms . FormStartPosition . CenterScreen ; this . Text = \"Settings\" ; this . FormClosing += new System . Windows . Forms . FormClosingEventHandler ( this . Settings_FormClosing ); this . Resize += new System . EventHandler ( this . Settings_Resize ); this . gpbxRaceSettings . ResumeLayout ( false ); this . gpbxRaceSettings . PerformLayout (); this . gpbxDriverList . ResumeLayout ( false ); this . gpbxDriverList . PerformLayout (); this . gpbxPreview . ResumeLayout ( false ); this . gpbxPreview . PerformLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxPreview )). EndInit (); this . gpbxWindowPreview . ResumeLayout ( false ); (( System . ComponentModel . ISupportInitialize )( this . pbxWindowPreview )). EndInit (); this . gpbxPresets . ResumeLayout ( false ); this . gpbxPresets . PerformLayout (); this . ResumeLayout ( false ); this . PerformLayout (); } #endregion private System . Windows . Forms . Label label1 ; private System . Windows . Forms . Label label2 ; private System . Windows . Forms . GroupBox gpbxRaceSettings ; private System . Windows . Forms . TextBox tbxGpUrl ; private System . Windows . Forms . GroupBox gpbxDriverList ; private System . Windows . Forms . ListBox lsbDrivers ; private System . Windows . Forms . Button btnRemoveDriver ; private System . Windows . Forms . Button btnAddDriver ; private System . Windows . Forms . TextBox tbxDriverName ; private System . Windows . Forms . GroupBox gpbxPreview ; private System . Windows . Forms . PictureBox pbxPreview ; private System . Windows . Forms . GroupBox gpbxWindowPreview ; private System . Windows . Forms . PictureBox pbxWindowPreview ; private System . Windows . Forms . Button btnCreateWindow ; private System . Windows . Forms . Button btnCreatZone ; private System . Windows . Forms . ListBox lsbPresets ; private System . Windows . Forms . TextBox tbxPresetName ; private System . Windows . Forms . Button btnSavePreset ; private System . Windows . Forms . Label lblWindowsRemaining ; private System . Windows . Forms . Label lblZonePointsRemaning ; private System . Windows . Forms . Label lblWindowPointsRemaining ; private System . Windows . Forms . Button btnRefresh ; private System . Windows . Forms . Button btnResetDriver ; private System . Windows . Forms . Button btnLoadPreset ; private System . Windows . Forms . GroupBox gpbxPresets ; private System . Windows . Forms . Button btnDeletePreset ; private System . Windows . Forms . ToolTip tip1 ; } }","title":"Settings.Designer.cs"},{"location":"Code/Settings.Designer.html#settingsdesignercs","text":"namespace TrackTrends { partial class Settings { /// /// Required designer variable. /// private System . ComponentModel . IContainer components = null ; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose ( bool disposing ) { if ( disposing && ( components != null )) { components . Dispose (); } base . Dispose ( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent () { this . components = new System . ComponentModel . Container (); this . label1 = new System . Windows . Forms . Label (); this . label2 = new System . Windows . Forms . Label (); this . gpbxRaceSettings = new System . Windows . Forms . GroupBox (); this . tbxGpUrl = new System . Windows . Forms . TextBox (); this . gpbxDriverList = new System . Windows . Forms . GroupBox (); this . lsbDrivers = new System . Windows . Forms . ListBox (); this . btnRemoveDriver = new System . Windows . Forms . Button (); this . btnAddDriver = new System . Windows . Forms . Button (); this . tbxDriverName = new System . Windows . Forms . TextBox (); this . gpbxPreview = new System . Windows . Forms . GroupBox (); this . lblWindowsRemaining = new System . Windows . Forms . Label (); this . btnResetDriver = new System . Windows . Forms . Button (); this . btnRefresh = new System . Windows . Forms . Button (); this . lblWindowPointsRemaining = new System . Windows . Forms . Label (); this . lblZonePointsRemaning = new System . Windows . Forms . Label (); this . btnCreateWindow = new System . Windows . Forms . Button (); this . pbxPreview = new System . Windows . Forms . PictureBox (); this . btnCreatZone = new System . Windows . Forms . Button (); this . gpbxWindowPreview = new System . Windows . Forms . GroupBox (); this . pbxWindowPreview = new System . Windows . Forms . PictureBox (); this . btnLoadPreset = new System . Windows . Forms . Button (); this . lsbPresets = new System . Windows . Forms . ListBox (); this . tbxPresetName = new System . Windows . Forms . TextBox (); this . btnSavePreset = new System . Windows . Forms . Button (); this . gpbxPresets = new System . Windows . Forms . GroupBox (); this . btnDeletePreset = new System . Windows . Forms . Button (); this . tip1 = new System . Windows . Forms . ToolTip ( this . components ); this . gpbxRaceSettings . SuspendLayout (); this . gpbxDriverList . SuspendLayout (); this . gpbxPreview . SuspendLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxPreview )). BeginInit (); this . gpbxWindowPreview . SuspendLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxWindowPreview )). BeginInit (); this . gpbxPresets . SuspendLayout (); this . SuspendLayout (); // // label1 // this . label1 . AutoSize = true ; this . label1 . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 19.8F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . label1 . ForeColor = System . Drawing . Color . White ; this . label1 . Location = new System . Drawing . Point ( 12 , 14 ); this . label1 . Name = \"label1\" ; this . label1 . Size = new System . Drawing . Size ( 309 , 43 ); this . label1 . TabIndex = 0 ; this . label1 . Text = \"Configuration tool\" ; // // label2 // this . label2 . AutoSize = true ; this . label2 . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . label2 . ForeColor = System . Drawing . Color . White ; this . label2 . Location = new System . Drawing . Point ( 3 , 25 ); this . label2 . Name = \"label2\" ; this . label2 . Size = new System . Drawing . Size ( 132 , 23 ); this . label2 . TabIndex = 1 ; this . label2 . Text = \"Grand Prix URL\" ; // // gpbxRaceSettings // this . gpbxRaceSettings . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxRaceSettings . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxRaceSettings . Controls . Add ( this . tbxGpUrl ); this . gpbxRaceSettings . Controls . Add ( this . label2 ); this . gpbxRaceSettings . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . gpbxRaceSettings . ForeColor = System . Drawing . Color . White ; this . gpbxRaceSettings . Location = new System . Drawing . Point ( 733 , 9 ); this . gpbxRaceSettings . Name = \"gpbxRaceSettings\" ; this . gpbxRaceSettings . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxRaceSettings . Size = new System . Drawing . Size ( 521 , 58 ); this . gpbxRaceSettings . TabIndex = 2 ; this . gpbxRaceSettings . TabStop = false ; this . gpbxRaceSettings . Text = \"RaceSettings\" ; this . gpbxRaceSettings . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // tbxGpUrl // this . tbxGpUrl . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxGpUrl . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxGpUrl . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . tbxGpUrl . ForeColor = System . Drawing . Color . White ; this . tbxGpUrl . Location = new System . Drawing . Point ( 141 , 25 ); this . tbxGpUrl . Name = \"tbxGpUrl\" ; this . tbxGpUrl . Size = new System . Drawing . Size ( 367 , 22 ); this . tbxGpUrl . TabIndex = 4 ; this . tbxGpUrl . TextChanged += new System . EventHandler ( this . tbxGpUrl_TextChanged ); // // gpbxDriverList // this . gpbxDriverList . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxDriverList . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxDriverList . Controls . Add ( this . lsbDrivers ); this . gpbxDriverList . Controls . Add ( this . btnRemoveDriver ); this . gpbxDriverList . Controls . Add ( this . btnAddDriver ); this . gpbxDriverList . Controls . Add ( this . tbxDriverName ); this . gpbxDriverList . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxDriverList . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxDriverList . ForeColor = System . Drawing . Color . White ; this . gpbxDriverList . Location = new System . Drawing . Point ( 995 , 73 ); this . gpbxDriverList . Name = \"gpbxDriverList\" ; this . gpbxDriverList . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxDriverList . Size = new System . Drawing . Size ( 259 , 269 ); this . gpbxDriverList . TabIndex = 3 ; this . gpbxDriverList . TabStop = false ; this . gpbxDriverList . Text = \"DriverList\" ; this . gpbxDriverList . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // lsbDrivers // this . lsbDrivers . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . lsbDrivers . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . lsbDrivers . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . lsbDrivers . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . lsbDrivers . FormattingEnabled = true ; this . lsbDrivers . ItemHeight = 23 ; this . lsbDrivers . Location = new System . Drawing . Point ( 10 , 23 ); this . lsbDrivers . Name = \"lsbDrivers\" ; this . lsbDrivers . Size = new System . Drawing . Size ( 243 , 138 ); this . lsbDrivers . TabIndex = 10 ; // // btnRemoveDriver // this . btnRemoveDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnRemoveDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnRemoveDriver . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . btnRemoveDriver . ForeColor = System . Drawing . Color . White ; this . btnRemoveDriver . Location = new System . Drawing . Point ( 132 , 167 ); this . btnRemoveDriver . Name = \"btnRemoveDriver\" ; this . btnRemoveDriver . Size = new System . Drawing . Size ( 121 , 62 ); this . btnRemoveDriver . TabIndex = 9 ; this . btnRemoveDriver . Text = \"Remove\" ; this . btnRemoveDriver . UseVisualStyleBackColor = false ; this . btnRemoveDriver . Click += new System . EventHandler ( this . btnRemoveDriver_Click ); // // btnAddDriver // this . btnAddDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnAddDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnAddDriver . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . btnAddDriver . ForeColor = System . Drawing . Color . White ; this . btnAddDriver . Location = new System . Drawing . Point ( 10 , 167 ); this . btnAddDriver . Name = \"btnAddDriver\" ; this . btnAddDriver . Size = new System . Drawing . Size ( 116 , 62 ); this . btnAddDriver . TabIndex = 8 ; this . btnAddDriver . Text = \"Add\" ; this . btnAddDriver . UseVisualStyleBackColor = false ; this . btnAddDriver . Click += new System . EventHandler ( this . btnAddDriver_Click ); // // tbxDriverName // this . tbxDriverName . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxDriverName . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxDriverName . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 11F ); this . tbxDriverName . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . tbxDriverName . Location = new System . Drawing . Point ( 10 , 235 ); this . tbxDriverName . Name = \"tbxDriverName\" ; this . tbxDriverName . Size = new System . Drawing . Size ( 243 , 24 ); this . tbxDriverName . TabIndex = 7 ; // // gpbxPreview // this . gpbxPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxPreview . Controls . Add ( this . lblWindowsRemaining ); this . gpbxPreview . Controls . Add ( this . btnResetDriver ); this . gpbxPreview . Controls . Add ( this . btnRefresh ); this . gpbxPreview . Controls . Add ( this . lblWindowPointsRemaining ); this . gpbxPreview . Controls . Add ( this . lblZonePointsRemaning ); this . gpbxPreview . Controls . Add ( this . btnCreateWindow ); this . gpbxPreview . Controls . Add ( this . pbxPreview ); this . gpbxPreview . Controls . Add ( this . btnCreatZone ); this . gpbxPreview . FlatStyle = System . Windows . Forms . FlatStyle . Flat ; this . gpbxPreview . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxPreview . ForeColor = System . Drawing . Color . White ; this . gpbxPreview . Location = new System . Drawing . Point ( 18 , 73 ); this . gpbxPreview . Name = \"gpbxPreview\" ; this . gpbxPreview . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxPreview . Size = new System . Drawing . Size ( 968 , 608 ); this . gpbxPreview . TabIndex = 4 ; this . gpbxPreview . TabStop = false ; this . gpbxPreview . Text = \"Preview\" ; this . gpbxPreview . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // lblWindowsRemaining // this . lblWindowsRemaining . AutoSize = true ; this . lblWindowsRemaining . BackColor = System . Drawing . Color . Transparent ; this . lblWindowsRemaining . ForeColor = System . Drawing . Color . White ; this . lblWindowsRemaining . Location = new System . Drawing . Point ( 215 , 82 ); this . lblWindowsRemaining . Name = \"lblWindowsRemaining\" ; this . lblWindowsRemaining . Size = new System . Drawing . Size ( 183 , 23 ); this . lblWindowsRemaining . TabIndex = 6 ; this . lblWindowsRemaining . Text = \"7 windows remaining\" ; // // btnResetDriver // this . btnResetDriver . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . btnResetDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnResetDriver . Enabled = false ; this . btnResetDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnResetDriver . ForeColor = System . Drawing . Color . White ; this . btnResetDriver . Location = new System . Drawing . Point ( 748 , 20 ); this . btnResetDriver . Name = \"btnResetDriver\" ; this . btnResetDriver . Size = new System . Drawing . Size ( 211 , 33 ); this . btnResetDriver . TabIndex = 2 ; this . btnResetDriver . Text = \"Reset the emulator\" ; this . btnResetDriver . UseVisualStyleBackColor = false ; this . btnResetDriver . Click += new System . EventHandler ( this . btnResetDriver_Click ); // // btnRefresh // this . btnRefresh . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . btnRefresh . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnRefresh . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnRefresh . ForeColor = System . Drawing . Color . White ; this . btnRefresh . Location = new System . Drawing . Point ( 549 , 20 ); this . btnRefresh . Name = \"btnRefresh\" ; this . btnRefresh . Size = new System . Drawing . Size ( 193 , 33 ); this . btnRefresh . TabIndex = 1 ; this . btnRefresh . Text = \"Start the browser\" ; this . btnRefresh . UseVisualStyleBackColor = false ; this . btnRefresh . Click += new System . EventHandler ( this . btnRefresh_Click ); // // lblWindowPointsRemaining // this . lblWindowPointsRemaining . AutoSize = true ; this . lblWindowPointsRemaining . ForeColor = System . Drawing . Color . White ; this . lblWindowPointsRemaining . Location = new System . Drawing . Point ( 215 , 59 ); this . lblWindowPointsRemaining . Name = \"lblWindowPointsRemaining\" ; this . lblWindowPointsRemaining . Size = new System . Drawing . Size ( 163 , 23 ); this . lblWindowPointsRemaining . TabIndex = 4 ; this . lblWindowPointsRemaining . Text = \"0 points remaining\" ; // // lblZonePointsRemaning // this . lblZonePointsRemaning . AutoSize = true ; this . lblZonePointsRemaning . ForeColor = System . Drawing . Color . White ; this . lblZonePointsRemaning . Location = new System . Drawing . Point ( 19 , 59 ); this . lblZonePointsRemaning . Name = \"lblZonePointsRemaning\" ; this . lblZonePointsRemaning . Size = new System . Drawing . Size ( 163 , 23 ); this . lblZonePointsRemaning . TabIndex = 5 ; this . lblZonePointsRemaning . Text = \"0 points remaining\" ; // // btnCreateWindow // this . btnCreateWindow . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnCreateWindow . Enabled = false ; this . btnCreateWindow . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnCreateWindow . ForeColor = System . Drawing . Color . White ; this . btnCreateWindow . Location = new System . Drawing . Point ( 213 , 23 ); this . btnCreateWindow . Name = \"btnCreateWindow\" ; this . btnCreateWindow . Size = new System . Drawing . Size ( 201 , 33 ); this . btnCreateWindow . TabIndex = 2 ; this . btnCreateWindow . Text = \"Create the windows\" ; this . btnCreateWindow . UseVisualStyleBackColor = false ; this . btnCreateWindow . Click += new System . EventHandler ( this . btnCreateWindow_Click ); // // pbxPreview // this . pbxPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . pbxPreview . Location = new System . Drawing . Point ( 10 , 62 ); this . pbxPreview . Name = \"pbxPreview\" ; this . pbxPreview . Size = new System . Drawing . Size ( 950 , 540 ); this . pbxPreview . SizeMode = System . Windows . Forms . PictureBoxSizeMode . StretchImage ; this . pbxPreview . TabIndex = 0 ; this . pbxPreview . TabStop = false ; this . pbxPreview . Click += new System . EventHandler ( this . pbxMain_Click ); this . pbxPreview . MouseClick += new System . Windows . Forms . MouseEventHandler ( this . pbxMain_MouseClick ); // // btnCreatZone // this . btnCreatZone . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnCreatZone . Enabled = false ; this . btnCreatZone . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnCreatZone . ForeColor = System . Drawing . Color . White ; this . btnCreatZone . Location = new System . Drawing . Point ( 6 , 23 ); this . btnCreatZone . Name = \"btnCreatZone\" ; this . btnCreatZone . Size = new System . Drawing . Size ( 201 , 33 ); this . btnCreatZone . TabIndex = 1 ; this . btnCreatZone . Text = \"Create the main zone\" ; this . btnCreatZone . UseVisualStyleBackColor = false ; this . btnCreatZone . Click += new System . EventHandler ( this . btnCreatZone_Click ); // // gpbxWindowPreview // this . gpbxWindowPreview . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Bottom | System . Windows . Forms . AnchorStyles . Left ))); this . gpbxWindowPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxWindowPreview . Controls . Add ( this . pbxWindowPreview ); this . gpbxWindowPreview . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxWindowPreview . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxWindowPreview . ForeColor = System . Drawing . Color . White ; this . gpbxWindowPreview . Location = new System . Drawing . Point ( 18 , 688 ); this . gpbxWindowPreview . Name = \"gpbxWindowPreview\" ; this . gpbxWindowPreview . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxWindowPreview . Size = new System . Drawing . Size ( 1237 , 88 ); this . gpbxWindowPreview . TabIndex = 5 ; this . gpbxWindowPreview . TabStop = false ; this . gpbxWindowPreview . Text = \"DriverZonePreview\" ; this . gpbxWindowPreview . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // pbxWindowPreview // this . pbxWindowPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . pbxWindowPreview . Location = new System . Drawing . Point ( 6 , 30 ); this . pbxWindowPreview . Name = \"pbxWindowPreview\" ; this . pbxWindowPreview . Size = new System . Drawing . Size ( 1225 , 50 ); this . pbxWindowPreview . SizeMode = System . Windows . Forms . PictureBoxSizeMode . StretchImage ; this . pbxWindowPreview . TabIndex = 0 ; this . pbxWindowPreview . TabStop = false ; this . pbxWindowPreview . Click += new System . EventHandler ( this . pbxDriverZone_Click ); this . pbxWindowPreview . MouseClick += new System . Windows . Forms . MouseEventHandler ( this . pbxDriverZone_MouseClick ); // // btnLoadPreset // this . btnLoadPreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnLoadPreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnLoadPreset . ForeColor = System . Drawing . Color . White ; this . btnLoadPreset . Location = new System . Drawing . Point ( 10 , 213 ); this . btnLoadPreset . Name = \"btnLoadPreset\" ; this . btnLoadPreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnLoadPreset . TabIndex = 10 ; this . btnLoadPreset . Text = \"Load the preset\" ; this . btnLoadPreset . UseVisualStyleBackColor = false ; this . btnLoadPreset . Click += new System . EventHandler ( this . btnLoadPreset_Click ); // // lsbPresets // this . lsbPresets . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . lsbPresets . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . lsbPresets . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . lsbPresets . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . lsbPresets . FormattingEnabled = true ; this . lsbPresets . ItemHeight = 23 ; this . lsbPresets . Location = new System . Drawing . Point ( 10 , 23 ); this . lsbPresets . Name = \"lsbPresets\" ; this . lsbPresets . Size = new System . Drawing . Size ( 243 , 138 ); this . lsbPresets . TabIndex = 8 ; this . lsbPresets . SelectedIndexChanged += new System . EventHandler ( this . lsbPresets_SelectedIndexChanged ); // // tbxPresetName // this . tbxPresetName . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxPresetName . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxPresetName . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 11F ); this . tbxPresetName . ForeColor = System . Drawing . Color . White ; this . tbxPresetName . Location = new System . Drawing . Point ( 10 , 303 ); this . tbxPresetName . Name = \"tbxPresetName\" ; this . tbxPresetName . Size = new System . Drawing . Size ( 243 , 24 ); this . tbxPresetName . TabIndex = 7 ; // // btnSavePreset // this . btnSavePreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnSavePreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnSavePreset . ForeColor = System . Drawing . Color . White ; this . btnSavePreset . Location = new System . Drawing . Point ( 10 , 259 ); this . btnSavePreset . Name = \"btnSavePreset\" ; this . btnSavePreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnSavePreset . TabIndex = 7 ; this . btnSavePreset . Text = \"Save current preset\" ; this . btnSavePreset . UseVisualStyleBackColor = false ; this . btnSavePreset . Click += new System . EventHandler ( this . btnSavePreset_Click ); // // gpbxPresets // this . gpbxPresets . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxPresets . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxPresets . Controls . Add ( this . btnSavePreset ); this . gpbxPresets . Controls . Add ( this . btnDeletePreset ); this . gpbxPresets . Controls . Add ( this . tbxPresetName ); this . gpbxPresets . Controls . Add ( this . btnLoadPreset ); this . gpbxPresets . Controls . Add ( this . lsbPresets ); this . gpbxPresets . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxPresets . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxPresets . ForeColor = System . Drawing . Color . White ; this . gpbxPresets . Location = new System . Drawing . Point ( 995 , 348 ); this . gpbxPresets . Name = \"gpbxPresets\" ; this . gpbxPresets . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxPresets . Size = new System . Drawing . Size ( 259 , 333 ); this . gpbxPresets . TabIndex = 6 ; this . gpbxPresets . TabStop = false ; this . gpbxPresets . Text = \"Presets\" ; this . gpbxPresets . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // btnDeletePreset // this . btnDeletePreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnDeletePreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnDeletePreset . ForeColor = System . Drawing . Color . White ; this . btnDeletePreset . Location = new System . Drawing . Point ( 10 , 167 ); this . btnDeletePreset . Name = \"btnDeletePreset\" ; this . btnDeletePreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnDeletePreset . TabIndex = 11 ; this . btnDeletePreset . Text = \"Delete the preset\" ; this . btnDeletePreset . UseVisualStyleBackColor = false ; this . btnDeletePreset . Click += new System . EventHandler ( this . btnDeletePreset_Click ); // // Settings // this . AutoScaleDimensions = new System . Drawing . SizeF ( 8F , 19F ); this . AutoScaleMode = System . Windows . Forms . AutoScaleMode . Font ; this . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . ClientSize = new System . Drawing . Size ( 1266 , 788 ); this . Controls . Add ( this . gpbxPresets ); this . Controls . Add ( this . gpbxWindowPreview ); this . Controls . Add ( this . gpbxPreview ); this . Controls . Add ( this . gpbxDriverList ); this . Controls . Add ( this . label1 ); this . Controls . Add ( this . gpbxRaceSettings ); this . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 7.8F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . Margin = new System . Windows . Forms . Padding ( 3 , 4 , 3 , 4 ); this . MinimumSize = new System . Drawing . Size ( 1284 , 835 ); this . Name = \"Settings\" ; this . StartPosition = System . Windows . Forms . FormStartPosition . CenterScreen ; this . Text = \"Settings\" ; this . FormClosing += new System . Windows . Forms . FormClosingEventHandler ( this . Settings_FormClosing ); this . Resize += new System . EventHandler ( this . Settings_Resize ); this . gpbxRaceSettings . ResumeLayout ( false ); this . gpbxRaceSettings . PerformLayout (); this . gpbxDriverList . ResumeLayout ( false ); this . gpbxDriverList . PerformLayout (); this . gpbxPreview . ResumeLayout ( false ); this . gpbxPreview . PerformLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxPreview )). EndInit (); this . gpbxWindowPreview . ResumeLayout ( false ); (( System . ComponentModel . ISupportInitialize )( this . pbxWindowPreview )). EndInit (); this . gpbxPresets . ResumeLayout ( false ); this . gpbxPresets . PerformLayout (); this . ResumeLayout ( false ); this . PerformLayout (); } #endregion private System . Windows . Forms . Label label1 ; private System . Windows . Forms . Label label2 ; private System . Windows . Forms . GroupBox gpbxRaceSettings ; private System . Windows . Forms . TextBox tbxGpUrl ; private System . Windows . Forms . GroupBox gpbxDriverList ; private System . Windows . Forms . ListBox lsbDrivers ; private System . Windows . Forms . Button btnRemoveDriver ; private System . Windows . Forms . Button btnAddDriver ; private System . Windows . Forms . TextBox tbxDriverName ; private System . Windows . Forms . GroupBox gpbxPreview ; private System . Windows . Forms . PictureBox pbxPreview ; private System . Windows . Forms . GroupBox gpbxWindowPreview ; private System . Windows . Forms . PictureBox pbxWindowPreview ; private System . Windows . Forms . Button btnCreateWindow ; private System . Windows . Forms . Button btnCreatZone ; private System . Windows . Forms . ListBox lsbPresets ; private System . Windows . Forms . TextBox tbxPresetName ; private System . Windows . Forms . Button btnSavePreset ; private System . Windows . Forms . Label lblWindowsRemaining ; private System . Windows . Forms . Label lblZonePointsRemaning ; private System . Windows . Forms . Label lblWindowPointsRemaining ; private System . Windows . Forms . Button btnRefresh ; private System . Windows . Forms . Button btnResetDriver ; private System . Windows . Forms . Button btnLoadPreset ; private System . Windows . Forms . GroupBox gpbxPresets ; private System . Windows . Forms . Button btnDeletePreset ; private System . Windows . Forms . ToolTip tip1 ; } }","title":"Settings.Designer.cs"},{"location":"Code/SqliteStorage.html","text":"SqliteStorage.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : SqliteStorage.cs /// Brief : Class that controls the sqlite database /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Data.SQLite ; using System.IO ; using System.Windows.Forms ; namespace TrackTrends { public class SqliteStorage { private const string DATABASE_FOLDER = \"./Data\" ; private const string DATABASE_FILE = \"/database.sqlite\" ; private const string CONNECTION_STRING = \"Data Source=\" + DATABASE_FOLDER + DATABASE_FILE + \";Version=3;\" ; private SQLiteConnection Connection ; /// /// Creates a new Sqlite Storage and initialize the database /// public SqliteStorage () { Load (); } /// /// Loads a fresh new Database or create a new one if it does not exist. /// private void Load () { if (! Directory . Exists ( DATABASE_FOLDER )) Directory . CreateDirectory ( DATABASE_FOLDER ); if (! File . Exists ( DATABASE_FOLDER + DATABASE_FILE )) { SQLiteConnection . CreateFile ( DATABASE_FOLDER + DATABASE_FILE ); } else { //We are not using the existing DataBase File . Delete ( DATABASE_FOLDER + DATABASE_FILE ); } Connection = new SQLiteConnection ( CONNECTION_STRING ); Connection . Open (); //Create the drivers table string createDriversTableQuery = @\"CREATE TABLE IF NOT EXISTS Drivers (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name VARCHAR NOT NULL);\" ; using ( var command = new SQLiteCommand ( createDriversTableQuery , Connection )) { command . ExecuteNonQuery (); } //Create the drivers table string createPitstopTableQuery = @\"CREATE TABLE Pitstops (Lap INTEGER NOT NULL, DriverID INTEGER NOT NULL, Tyre VARCHAR, PRIMARY KEY (Lap,DriverID));\" ; using ( var command = new SQLiteCommand ( createPitstopTableQuery , Connection )) { command . ExecuteNonQuery (); } //Create the stats string createStatsTableQuery = @\"CREATE TABLE IF NOT EXISTS Stats (Lap INTEGER NOT NULL, DriverID INTEGER NOT NULL, Tyre VARCHAR NOT NULL, LapTime INTEGER NOT NULL, Sector1 INTEGER NOT NULL, Sector2 INTEGER NOT NULL, Sector3 INTEGER NOT NULL, GapToLeader INTEGER NOT NULL, Position INTEGER NOT NULL, PRIMARY KEY (Lap, DriverID));\" ; using ( var command = new SQLiteCommand ( createStatsTableQuery , Connection )) { command . ExecuteNonQuery (); } } /// /// Adds a driver into the drivers table. Meant to be used at the start of the programm /// /// The name of the driver. (non case sensitive) public void AddDriver ( string name ) { string insertQuery = \"INSERT INTO Drivers (Name) VALUES (@name);\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Name\" , name ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert a new driver into de Database\"); } } } /// /// Searches for a driver and returns its id if it has been found /// /// Name of the driver (non case sensitive) /// private int GetDriverID ( string name ) { string selectQuery = \"SELECT ID FROM Drivers where Name LIKE @driverName\" ; int result = 0 ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverName\" , name ); try { using ( var reader = command . ExecuteReader ()) { while ( reader . Read ()) { result = reader . GetInt32 ( 0 ); } } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return result ; } /// /// Gets the sectors from a lapTime. Sectors are subdivisions of a laptime (could be usefull to validate one or the other) /// /// The name of the driver who has done the lap /// The lap at wich the driver has done the time /// A list of the different sectors time in int (ms) public List < int > GetSectorsFromLapTime ( string driverName , int lap ) { int driverId = GetDriverID ( driverName ); string selectQuery = \"SELECT Sector1,Sector2,Sector3 FROM Stats WHERE DriverID = @driverID AND Lap = @lap\" ; List < int > result = new List < int >(); using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@lap\" , lap ); try { SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { result . Add ( reader . GetInt32 ( 0 )); result . Add ( reader . GetInt32 ( 1 )); result . Add ( reader . GetInt32 ( 2 )); } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return result ; } /// /// Get the laptime history of a driver /// /// The name of the driver /// The number of lapTimes you want /// A list of tuples with the lap and the laptime. It will only return the amount it found so even if you ask 5 expect getting less or even 0 public List <( int LapTime , int Lap )> GetDriverLaptimes ( string driverName , int numberOfLaptimes ) { int driverId = GetDriverID ( driverName ); List <( int LapTime , int Lap )> lapData = new List <( int LapTime , int Lap )>(); string selectQuery = \"Select LapTime,Lap from Stats WHERE DriverID = @driverID ORDER BY Lap DESC LIMIT @limit\" ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@limit\" , numberOfLaptimes ); try { SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { int lapTime = reader . GetInt32 ( 0 ); int lap = reader . GetInt32 ( 1 ); lapData . Add (( lapTime , lap )); } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return lapData ; } /// /// Add a pitstop into the db /// /// The name of the driver who made his pitstop /// The lap where he stopped /// The tyre he took out public void AddPitstop ( string driverName , int lap , string tyre ) { string insertQuery = \"INSERT INTO Pitstops (Lap,DriverID,Tyre) VALUES (@Lap,@DriverID,@Tyre)\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Lap\" , lap ); command . Parameters . AddWithValue ( \"@DriverID\" , GetDriverID ( driverName )); command . Parameters . AddWithValue ( \"@Tyre\" , tyre ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert a new pitstop into the DB\" + Environment.NewLine + \"Request :\"+ command.ToString()); } } } /// /// Adds drivers info into the DB (it should only be once per lap) /// /// The Driver data /// The lap from wich the datas are from public void AddDriverStat ( DriverData data , int lap ) { string insertQuery = \"INSERT INTO Stats (Lap,DriverID,Tyre,LapTime,Sector1,Sector2,Sector3,GapToLeader,Position) VALUES (@Lap,@DriverID,@Tyre,@LapTime,@Sector1,@Sector2,@Sector3,@GapToLeader,@Position);\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Lap\" , lap ); command . Parameters . AddWithValue ( \"@DriverID\" , GetDriverID ( data . Name )); command . Parameters . AddWithValue ( \"@Tyre\" , data . CurrentTyre . Coumpound . ToString ()); command . Parameters . AddWithValue ( \"@LapTime\" , data . LapTime ); command . Parameters . AddWithValue ( \"@Sector1\" , data . Sector1 ); command . Parameters . AddWithValue ( \"@Sector2\" , data . Sector2 ); command . Parameters . AddWithValue ( \"@Sector3\" , data . Sector3 ); command . Parameters . AddWithValue ( \"@GapToLeader\" , data . GapToLeader ); command . Parameters . AddWithValue ( \"@Position\" , data . Position ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert infos about a driver\"); } } } } }","title":"SqliteStorage.cs"},{"location":"Code/SqliteStorage.html#sqlitestoragecs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : SqliteStorage.cs /// Brief : Class that controls the sqlite database /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Data.SQLite ; using System.IO ; using System.Windows.Forms ; namespace TrackTrends { public class SqliteStorage { private const string DATABASE_FOLDER = \"./Data\" ; private const string DATABASE_FILE = \"/database.sqlite\" ; private const string CONNECTION_STRING = \"Data Source=\" + DATABASE_FOLDER + DATABASE_FILE + \";Version=3;\" ; private SQLiteConnection Connection ; /// /// Creates a new Sqlite Storage and initialize the database /// public SqliteStorage () { Load (); } /// /// Loads a fresh new Database or create a new one if it does not exist. /// private void Load () { if (! Directory . Exists ( DATABASE_FOLDER )) Directory . CreateDirectory ( DATABASE_FOLDER ); if (! File . Exists ( DATABASE_FOLDER + DATABASE_FILE )) { SQLiteConnection . CreateFile ( DATABASE_FOLDER + DATABASE_FILE ); } else { //We are not using the existing DataBase File . Delete ( DATABASE_FOLDER + DATABASE_FILE ); } Connection = new SQLiteConnection ( CONNECTION_STRING ); Connection . Open (); //Create the drivers table string createDriversTableQuery = @\"CREATE TABLE IF NOT EXISTS Drivers (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name VARCHAR NOT NULL);\" ; using ( var command = new SQLiteCommand ( createDriversTableQuery , Connection )) { command . ExecuteNonQuery (); } //Create the drivers table string createPitstopTableQuery = @\"CREATE TABLE Pitstops (Lap INTEGER NOT NULL, DriverID INTEGER NOT NULL, Tyre VARCHAR, PRIMARY KEY (Lap,DriverID));\" ; using ( var command = new SQLiteCommand ( createPitstopTableQuery , Connection )) { command . ExecuteNonQuery (); } //Create the stats string createStatsTableQuery = @\"CREATE TABLE IF NOT EXISTS Stats (Lap INTEGER NOT NULL, DriverID INTEGER NOT NULL, Tyre VARCHAR NOT NULL, LapTime INTEGER NOT NULL, Sector1 INTEGER NOT NULL, Sector2 INTEGER NOT NULL, Sector3 INTEGER NOT NULL, GapToLeader INTEGER NOT NULL, Position INTEGER NOT NULL, PRIMARY KEY (Lap, DriverID));\" ; using ( var command = new SQLiteCommand ( createStatsTableQuery , Connection )) { command . ExecuteNonQuery (); } } /// /// Adds a driver into the drivers table. Meant to be used at the start of the programm /// /// The name of the driver. (non case sensitive) public void AddDriver ( string name ) { string insertQuery = \"INSERT INTO Drivers (Name) VALUES (@name);\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Name\" , name ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert a new driver into de Database\"); } } } /// /// Searches for a driver and returns its id if it has been found /// /// Name of the driver (non case sensitive) /// private int GetDriverID ( string name ) { string selectQuery = \"SELECT ID FROM Drivers where Name LIKE @driverName\" ; int result = 0 ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverName\" , name ); try { using ( var reader = command . ExecuteReader ()) { while ( reader . Read ()) { result = reader . GetInt32 ( 0 ); } } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return result ; } /// /// Gets the sectors from a lapTime. Sectors are subdivisions of a laptime (could be usefull to validate one or the other) /// /// The name of the driver who has done the lap /// The lap at wich the driver has done the time /// A list of the different sectors time in int (ms) public List < int > GetSectorsFromLapTime ( string driverName , int lap ) { int driverId = GetDriverID ( driverName ); string selectQuery = \"SELECT Sector1,Sector2,Sector3 FROM Stats WHERE DriverID = @driverID AND Lap = @lap\" ; List < int > result = new List < int >(); using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@lap\" , lap ); try { SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { result . Add ( reader . GetInt32 ( 0 )); result . Add ( reader . GetInt32 ( 1 )); result . Add ( reader . GetInt32 ( 2 )); } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return result ; } /// /// Get the laptime history of a driver /// /// The name of the driver /// The number of lapTimes you want /// A list of tuples with the lap and the laptime. It will only return the amount it found so even if you ask 5 expect getting less or even 0 public List <( int LapTime , int Lap )> GetDriverLaptimes ( string driverName , int numberOfLaptimes ) { int driverId = GetDriverID ( driverName ); List <( int LapTime , int Lap )> lapData = new List <( int LapTime , int Lap )>(); string selectQuery = \"Select LapTime,Lap from Stats WHERE DriverID = @driverID ORDER BY Lap DESC LIMIT @limit\" ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@limit\" , numberOfLaptimes ); try { SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { int lapTime = reader . GetInt32 ( 0 ); int lap = reader . GetInt32 ( 1 ); lapData . Add (( lapTime , lap )); } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return lapData ; } /// /// Add a pitstop into the db /// /// The name of the driver who made his pitstop /// The lap where he stopped /// The tyre he took out public void AddPitstop ( string driverName , int lap , string tyre ) { string insertQuery = \"INSERT INTO Pitstops (Lap,DriverID,Tyre) VALUES (@Lap,@DriverID,@Tyre)\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Lap\" , lap ); command . Parameters . AddWithValue ( \"@DriverID\" , GetDriverID ( driverName )); command . Parameters . AddWithValue ( \"@Tyre\" , tyre ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert a new pitstop into the DB\" + Environment.NewLine + \"Request :\"+ command.ToString()); } } } /// /// Adds drivers info into the DB (it should only be once per lap) /// /// The Driver data /// The lap from wich the datas are from public void AddDriverStat ( DriverData data , int lap ) { string insertQuery = \"INSERT INTO Stats (Lap,DriverID,Tyre,LapTime,Sector1,Sector2,Sector3,GapToLeader,Position) VALUES (@Lap,@DriverID,@Tyre,@LapTime,@Sector1,@Sector2,@Sector3,@GapToLeader,@Position);\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Lap\" , lap ); command . Parameters . AddWithValue ( \"@DriverID\" , GetDriverID ( data . Name )); command . Parameters . AddWithValue ( \"@Tyre\" , data . CurrentTyre . Coumpound . ToString ()); command . Parameters . AddWithValue ( \"@LapTime\" , data . LapTime ); command . Parameters . AddWithValue ( \"@Sector1\" , data . Sector1 ); command . Parameters . AddWithValue ( \"@Sector2\" , data . Sector2 ); command . Parameters . AddWithValue ( \"@Sector3\" , data . Sector3 ); command . Parameters . AddWithValue ( \"@GapToLeader\" , data . GapToLeader ); command . Parameters . AddWithValue ( \"@Position\" , data . Position ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert infos about a driver\"); } } } } }","title":"SqliteStorage.cs"},{"location":"Code/Zone.html","text":"Zone.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Zone.cs /// Brief : Class that contains all the methods and infos for a zone. This is designed to be potentially be inherited. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class Zone { private Rectangle _bounds ; private List < Zone > _zones ; private List < Window > _windows ; private Bitmap _image ; private string _name ; public Bitmap ZoneImage { get { //This little trickery lets you have the image that the zone sees Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( Image , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Bitmap Image { get { return _image ; } set { //It automatically sets the image for the contained windows and zones _image = value ; foreach ( Window w in Windows ) { w . Image = ZoneImage ; } foreach ( Zone z in Zones ) { z . Image = Image ; } } } public Rectangle Bounds { get => _bounds ; protected set => _bounds = value ; } public List < Zone > Zones { get => _zones ; protected set => _zones = value ; } public List < Window > Windows { get => _windows ; protected set => _windows = value ; } public string Name { get => _name ; protected set => _name = value ; } /// /// Creates a new Zone /// /// Image of the parent zone /// The position and size of the zone /// THe name of the zone (usefull for the JSON formatting) public Zone ( Bitmap image , Rectangle bounds , string name ) { Windows = new List < Window >(); Zones = new List < Zone >(); Name = name ; //You cant set the image in the CTOR because the processing is impossible at first initiation _image = image ; Bounds = bounds ; } /// /// Adds a zone to the list of zones /// /// The zone you want to add public virtual void AddZone ( Zone zone ) { Zones . Add ( zone ); } /// /// Add a window to the list of windows /// /// the window you want to add public virtual void AddWindow ( Window window ) { Windows . Add ( window ); } /// /// Calls all the windows to do OCR and to give back the results so we can send them to the model /// /// A list of all the driver in the race to help with text recognition /// A driver data object that contains all the infos about a driver public virtual DriverData Decode ( List < string > driverList ) { int sectorCount = 0 ; DriverData result = new DriverData (); foreach ( Window w in Windows ) { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) result . Name = ( string )( w as DriverNameWindow ). DecodePng ( driverList ); if ( w is DriverDrsWindow ) result . DRS = ( bool )( w as DriverDrsWindow ). DecodePng (); if ( w is DriverGapToLeaderWindow ) result . GapToLeader = ( int )( w as DriverGapToLeaderWindow ). DecodePng (); if ( w is DriverLapTimeWindow ) result . LapTime = ( int )( w as DriverLapTimeWindow ). DecodePng (); if ( w is DriverPositionWindow ) result . Position = ( int )( w as DriverPositionWindow ). DecodePng (); if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) result . Sector1 = ( int )( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 2 ) result . Sector2 = ( int )( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 3 ) result . Sector3 = ( int )( w as DriverSectorWindow ). DecodePng (); } if ( w is DriverTyresWindow ) result . CurrentTyre = ( Tyre )( w as DriverTyresWindow ). DecodePng (); } return result ; } public virtual Bitmap Draw () { Bitmap img ; //If its the main zone we want to see everything if ( Zones . Count > 0 ) { img = Image ; } else { img = ZoneImage ; } Graphics g = Graphics . FromImage ( img ); //If its the main zone we need to visualize the Zone bounds displayed if ( Zones . Count > 0 ) g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 249 , 194 , 46 )), 5 ), Bounds ); foreach ( Zone z in Zones ) { Rectangle newBounds = new Rectangle ( z . Bounds . X , z . Bounds . Y + Bounds . Y , z . Bounds . Width , z . Bounds . Height ); g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 249 , 194 , 46 )), 5 ), newBounds ); } foreach ( Window w in Windows ) { g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 252 , 252 , 252 )), 5 ), w . Bounds ); } return img ; } public void ResetZones () { Zones . Clear (); } public void ResetWindows () { foreach ( Zone z in Zones ) { z . ResetWindows (); } Windows . Clear (); } /// /// Checks if the given Rectangle fits in the current zone /// /// The Rectangle you want to check the fittment /// protected bool Fits ( Rectangle inputRectangle ) { if ( inputRectangle . X + inputRectangle . Width > Bounds . Width || inputRectangle . Y + inputRectangle . Height > Bounds . Height || inputRectangle . X < 0 || inputRectangle . Y < 0 ) { return false ; } else { return true ; } } } }","title":"Zone.cs"},{"location":"Code/Zone.html#zonecs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Zone.cs /// Brief : Class that contains all the methods and infos for a zone. This is designed to be potentially be inherited. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class Zone { private Rectangle _bounds ; private List < Zone > _zones ; private List < Window > _windows ; private Bitmap _image ; private string _name ; public Bitmap ZoneImage { get { //This little trickery lets you have the image that the zone sees Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( Image , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Bitmap Image { get { return _image ; } set { //It automatically sets the image for the contained windows and zones _image = value ; foreach ( Window w in Windows ) { w . Image = ZoneImage ; } foreach ( Zone z in Zones ) { z . Image = Image ; } } } public Rectangle Bounds { get => _bounds ; protected set => _bounds = value ; } public List < Zone > Zones { get => _zones ; protected set => _zones = value ; } public List < Window > Windows { get => _windows ; protected set => _windows = value ; } public string Name { get => _name ; protected set => _name = value ; } /// /// Creates a new Zone /// /// Image of the parent zone /// The position and size of the zone /// THe name of the zone (usefull for the JSON formatting) public Zone ( Bitmap image , Rectangle bounds , string name ) { Windows = new List < Window >(); Zones = new List < Zone >(); Name = name ; //You cant set the image in the CTOR because the processing is impossible at first initiation _image = image ; Bounds = bounds ; } /// /// Adds a zone to the list of zones /// /// The zone you want to add public virtual void AddZone ( Zone zone ) { Zones . Add ( zone ); } /// /// Add a window to the list of windows /// /// the window you want to add public virtual void AddWindow ( Window window ) { Windows . Add ( window ); } /// /// Calls all the windows to do OCR and to give back the results so we can send them to the model /// /// A list of all the driver in the race to help with text recognition /// A driver data object that contains all the infos about a driver public virtual DriverData Decode ( List < string > driverList ) { int sectorCount = 0 ; DriverData result = new DriverData (); foreach ( Window w in Windows ) { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) result . Name = ( string )( w as DriverNameWindow ). DecodePng ( driverList ); if ( w is DriverDrsWindow ) result . DRS = ( bool )( w as DriverDrsWindow ). DecodePng (); if ( w is DriverGapToLeaderWindow ) result . GapToLeader = ( int )( w as DriverGapToLeaderWindow ). DecodePng (); if ( w is DriverLapTimeWindow ) result . LapTime = ( int )( w as DriverLapTimeWindow ). DecodePng (); if ( w is DriverPositionWindow ) result . Position = ( int )( w as DriverPositionWindow ). DecodePng (); if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) result . Sector1 = ( int )( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 2 ) result . Sector2 = ( int )( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 3 ) result . Sector3 = ( int )( w as DriverSectorWindow ). DecodePng (); } if ( w is DriverTyresWindow ) result . CurrentTyre = ( Tyre )( w as DriverTyresWindow ). DecodePng (); } return result ; } public virtual Bitmap Draw () { Bitmap img ; //If its the main zone we want to see everything if ( Zones . Count > 0 ) { img = Image ; } else { img = ZoneImage ; } Graphics g = Graphics . FromImage ( img ); //If its the main zone we need to visualize the Zone bounds displayed if ( Zones . Count > 0 ) g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 249 , 194 , 46 )), 5 ), Bounds ); foreach ( Zone z in Zones ) { Rectangle newBounds = new Rectangle ( z . Bounds . X , z . Bounds . Y + Bounds . Y , z . Bounds . Width , z . Bounds . Height ); g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 249 , 194 , 46 )), 5 ), newBounds ); } foreach ( Window w in Windows ) { g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 252 , 252 , 252 )), 5 ), w . Bounds ); } return img ; } public void ResetZones () { Zones . Clear (); } public void ResetWindows () { foreach ( Zone z in Zones ) { z . ResetWindows (); } Windows . Clear (); } /// /// Checks if the given Rectangle fits in the current zone /// /// The Rectangle you want to check the fittment /// protected bool Fits ( Rectangle inputRectangle ) { if ( inputRectangle . X + inputRectangle . Width > Bounds . Width || inputRectangle . Y + inputRectangle . Height > Bounds . Height || inputRectangle . X < 0 || inputRectangle . Y < 0 ) { return false ; } else { return true ; } } } }","title":"Zone.cs"},{"location":"Code/DataWrapper.html","text":"DataWrapper.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DataWrapper.cs /// Brief : Class that is used to interface between the main Form (vue) and the Storage (wich is a class that wraps the sqlite database, so the model) its almost MVC :D /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.Drawing ; namespace TrackTrends { internal class DataWrapper { private Reader Reader ; private SqliteStorage Storage ; List < List < DriverData >> LiveDriverDataLogs = new List < List < DriverData >>(); //Note : It could be usefull to get the mainForm at the start of the programm and not have to take it in half of the methods. /// /// Constructs a new DataWrapper. It needs the config file so it can create a Reader, It also needs a first screenshot for the same reason /// /// The JSON config file that is created by the configuration tool /// A screenshot of the public DataWrapper ( string configFile , Bitmap screenshot ) { Reader = new Reader ( configFile , screenshot , true ); //The Storage is here and on the Reader. It seems bad but it is ok as we dont use it at all to insert data and are only using it here to read some. The reader takes care of the inserts (Note: We could technically do both here but I did not find it usefull to transfer everything here) Storage = Reader . Storage ; } /// /// Refreshes the controller so it has the latest driver datas (Be sure to call it everytime you need to use any other method and expects the data to be up to date) /// /// Error code, 0 is success, 1 is not (Note: Maybe it could be interesting in the future to add some more error handling here) public int Refresh () { LiveDriverDataLogs . Add ( Reader . Decode ( Reader . MainZones , Reader . Drivers )); if ( LiveDriverDataLogs . Count > 0 ) return 0 ; return 1 ; } /// /// Changes the image to the newest screenshot in all of the zones and windows /// /// The new screenshot to put everywhere (Do not mix resolutions) public void ChangeImage ( Bitmap image ) { Reader . ChangeImage ( image ); } /// /// Gets all the data from one driver and also displays into the given panel the last five laps (or less if its the sart of the race) Note: Its responsive :D /// /// The name of the driver (should not be case sensitive but it MUST already exist in the first list that has been inserted into the DB) /// The pannel where you want the five last laps to be displayed /// The Main form. /// public DriverData GetFullDriverData ( string driverName , Panel lastFiveLapsPanel , Main form1 ) { //Note : I know that its a bad idea to ask the Form in this method and some others because it means that it wont work with any main form. And to that Ill say that... your right ! DriverData result = new DriverData (); if ( LiveDriverDataLogs . Count > 0 ) { //Searches the most recent live data from the given driverName foreach ( DriverData data in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { if ( data . Name == driverName ) result = data ; } if ( result . Name != \"\" ) { //Recovers and displays the last five laps from the driver lastFiveLapsPanel . Controls . Clear (); Size labelDimensions = new Size ( lastFiveLapsPanel . Width , lastFiveLapsPanel . Height / 5 ); List <( int LapTime , int Lap )> lapsInfos = Storage . GetDriverLaptimes ( driverName , 5 ); int id = 0 ; foreach (( int LapTime , int Lap ) lapData in lapsInfos ) { //Hardcodes the new button. //Note : It could be smart to have like a default button for all the methods to use without needing to rewrite everything. Button newButton = new Button (); lastFiveLapsPanel . Controls . Add ( newButton ); newButton . Name = driverName + \"_\" + lapData . Lap ; newButton . Text = Reader . ConvertMsToTime ( lapData . LapTime ); newButton . Size = labelDimensions ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Click += form1 . btnLapTime_Click ; newButton . Location = new Point ( 0 , id * newButton . Height ); id ++; } } } return result ; } /// /// Runs trough every drivers live data to recover the drivers that are close to each others /// /// The control that will host the displayed battles /// The main form. It needs to have a method called 'btnDriver_Click' so it can reads the buttons clicks public void DisplayBattles ( Panel pnlBattles , Main form1 ) { DriverData oldDriver = null ; List <( DriverData d1 , DriverData d2 , int gap )> battles = new List <( DriverData d1 , DriverData d2 , int gap )>(); //Search trough all the drivers and finds the one battling foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { if ( oldDriver != null && driver . Position != - 1 && oldDriver . Position != - 1 ) { if ( driver . GapToLeader < oldDriver . GapToLeader ) { //There is a problem with the drivers gaps } else { int gap = driver . GapToLeader - oldDriver . GapToLeader ; //3000ms is 3s. If drivers are that close then they are definitely in battle. If they are farther then maybe not if ( gap <= 3000 ) { battles . Add (( oldDriver , driver , gap )); } } oldDriver = driver ; } else { oldDriver = driver ; } } //We will only display 4 battles max int maxBattles = 4 ; if ( battles . Count > 0 ) { pnlBattles . Controls . Clear (); int maxUiHeight = Math . Max ( pnlBattles . Height / maxBattles , pnlBattles . Height / battles . Count ); int id = 0 ; foreach (( DriverData d1 , DriverData d2 , int gap ) battle in battles ) { if ( id < maxBattles ) { //*hardcoding* the different controls that needs to be added to the panel. //Note : this stuff could totally be handled by the Form with method returning a list of the drivers. It was just easier for me at the time to code it this way but its not the prettiest Button btnFirstDriver = new Button (); Button btnSecondDriver = new Button (); Label lblGap = new Label (); pnlBattles . Controls . Add ( btnFirstDriver ); pnlBattles . Controls . Add ( lblGap ); pnlBattles . Controls . Add ( btnSecondDriver ); btnFirstDriver . Anchor = AnchorStyles . Left | AnchorStyles . Top ; btnSecondDriver . Anchor = AnchorStyles . Right | AnchorStyles . Top ; lblGap . Anchor = AnchorStyles . Right | AnchorStyles . Left | AnchorStyles . Top ; lblGap . TextAlign = ContentAlignment . MiddleCenter ; lblGap . Font = new Font ( lblGap . Font . FontFamily , 15 ); btnFirstDriver . Click += form1 . btnDriver_Click ; btnSecondDriver . Click += form1 . btnDriver_Click ; btnFirstDriver . FlatStyle = FlatStyle . Popup ; btnSecondDriver . FlatStyle = FlatStyle . Popup ; lblGap . FlatStyle = FlatStyle . Popup ; btnFirstDriver . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); btnSecondDriver . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); lblGap . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); btnFirstDriver . Location = new Point ( pnlBattles . Width / 3 * 0 , id * maxUiHeight ); lblGap . Location = new Point ( pnlBattles . Width / 3 * 1 , id * maxUiHeight ); btnSecondDriver . Location = new Point ( pnlBattles . Width / 3 * 2 , id * maxUiHeight ); btnFirstDriver . Text = battle . d1 . Name ; lblGap . Text = \"+ \" + Reader . ConvertMsToTime ( battle . gap ); if ( battle . gap <= 2000 ) lblGap . ForeColor = Color . Yellow ; if ( battle . gap <= 1000 ) lblGap . ForeColor = Color . Green ; btnSecondDriver . Text = battle . d2 . Name ; btnFirstDriver . Name = battle . d1 . Name + \"_\" + id ; lblGap . Name = \"lbl_Gap_\" + id ; btnSecondDriver . Name = battle . d2 . Name + \"_\" + id ; } else { break ; } id ++; } } } /// /// Searches the fastest and slowests drivers and displays them in the given panels /// /// Panel that will contain the constructed controls /// Panel that will contain the constructed controls /// The main form that needs to implement the method btnDriver_Click to allow it to recover custom buttons click public void DisplayTimesDeltas ( Panel pnlFastest , Panel pnlSlowest , Main form1 ) { List <( int avg , string driverName )> averages = new List <( int avg , string driverName )>(); foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { //We want to recover the last 5 lap times List <( int lapTime , int lap )> laps = Storage . GetDriverLaptimes ( driver . Name , 5 ); if ( laps . Count > 0 ) { int avg = 0 ; foreach (( int lapTime , int lap ) lap in laps ) { avg += lap . lapTime ; } avg = avg / laps . Count ; averages . Add (( avg , driver . Name )); } } int numberOfDriversToShow = 5 ; if ( averages . Count > 0 && averages . Count > numberOfDriversToShow ) { averages = averages . OrderBy ( item => item . avg ). ToList (); pnlFastest . Controls . Clear (); pnlSlowest . Controls . Clear (); int maxUiSize = pnlFastest . Height / numberOfDriversToShow ; //Displays the fastest drivers for ( int i = 0 ; i < numberOfDriversToShow ; i ++) { Button newButton = new Button (); ( int avg , string driver ) data = averages [ i ]; pnlFastest . Controls . Add ( newButton ); newButton . Size = new Size ( pnlFastest . Width , maxUiSize ); newButton . Location = new Point ( 0 , i * maxUiSize ); newButton . Text = data . driver ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Name = data . driver + \"_fastest_\" + i ; newButton . Click += form1 . btnDriver_Click ; //We take the average time lost per lap if ( i != 0 ) newButton . Text += \" + \" + Reader . ConvertMsToTime ( Convert . ToInt32 ((( float ) data . avg - ( float ) averages [ 0 ]. avg ) / 5.0f )); } //Displays the slowests drivers int badId = 0 ; for ( int i = averages . Count - 1 ; i >= averages . Count - numberOfDriversToShow ; i --) { Button newButton = new Button (); ( int avg , string driver ) data = averages [ i ]; pnlSlowest . Controls . Add ( newButton ); newButton . Size = new Size ( pnlFastest . Width , maxUiSize ); newButton . Location = new Point ( 0 , badId * maxUiSize ); newButton . Text = data . driver ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Name = data . driver + \"_slowest_\" + i ; newButton . Click += form1 . btnDriver_Click ; //We take the average time lost per lap newButton . Text += \" + \" + Reader . ConvertMsToTime ( Convert . ToInt32 ((( float ) data . avg - ( float ) averages [ 0 ]. avg ) / 5.0f )); badId ++; } } } /// /// Will add to the list of overtakes the different changes of position /// /// The listbox containing all the infos public void DisplayOvertakes ( ListBox lsbResult ) { //Note : This method SHOULD REALLY not do this but just return a string or a list of string with the new overtakes so the form can handle it as it wishes if ( LiveDriverDataLogs . Count > 1 ) { List < DriverData > oldList = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 2 ]; List < DriverData > newList = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]; for ( int i = 0 ; i < LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]. Count ; i ++) { if ( oldList [ i ]. Name != newList [ i ]. Name ) { //There has been a change in the standings for ( int y = 0 ; y < oldList . Count ; y ++) { if ( newList [ y ]. Name == oldList [ i ]. Name ) { //We found its new location if ( y > i ) { //The driver overtook someone lsbResult . Items . Add ( newList [ y ]. Name + \" climbed to \" + y ); } else { //The driver got overtook by someone lsbResult . Items . Add ( newList [ y ]. Name + \" fell to \" + y ); } } } } } } } /// /// Displays a messageBox containing the infos about a lap time /// /// The name of the driver that has done the lapTime /// The number of the lap on wich the lapTime has been set (CAUTION ITS NOT THE RACING LAP ITS FROM THE DB) /// The time (in ms) of the lap public void DisplayLapTimeInfos ( string driverName , int Lap , string LapTime ) { List < int > sectors = Storage . GetSectorsFromLapTime ( driverName , Lap ); string message = \"Lap time infos\" + Environment . NewLine ; message += LapTime + Environment . NewLine ; if ( sectors . Count > 0 ) message += \"Sector 1 : \" + Reader . ConvertMsToTime ( sectors [ 0 ]) + Environment . NewLine ; if ( sectors . Count > 1 ) message += \"Sector 2 : \" + Reader . ConvertMsToTime ( sectors [ 1 ]) + Environment . NewLine ; if ( sectors . Count > 2 ) message += \"Sector 3 : \" + Reader . ConvertMsToTime ( sectors [ 2 ]) + Environment . NewLine ; MessageBox . Show ( message ); } /// /// Displays the live ranking with the names of the drivers and their gap to the leader in the right order /// /// The control that will host all the new controls /// The main form public void DisplayLiveRanking ( Panel pnl , Main form1 ) { if ( LiveDriverDataLogs . Count > 0 ) { pnl . Controls . Clear (); //Gets the last item that should be the most recent data List < DriverData > liveData = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]; Button [] buttons = new Button [ liveData . Count ]; Size buttonDimensions = new Size ( pnl . Width , pnl . Height / liveData . Count ); for ( int driverCount = 0 ; driverCount < liveData . Count ; driverCount ++) { Button newButton = new Button (); newButton . Size = buttonDimensions ; newButton . Location = new Point ( 0 , driverCount * buttonDimensions . Height ); newButton . FlatStyle = FlatStyle . Popup ; DriverData driver = liveData [ driverCount ]; if ( driver . Position == - 1 ) { //Its a DNF newButton . Enabled = false ; } if ( driver . Position > 1 ) { newButton . Text = driver . Name + \" +\" + Reader . ConvertMsToTime ( driver . GapToLeader ); } else { newButton . Text = driver . Name ; } newButton . Name = liveData [ driverCount ]. Name ; newButton . TextAlign = ContentAlignment . MiddleLeft ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Click += form1 . btnDriver_Click ; buttons [ driverCount ] = newButton ; } //Note : It could be better to have this directly in the same loop foreach ( Button button in buttons ) { pnl . Controls . Add ( button ); } } } } }","title":"DataWrapper.cs"},{"location":"Code/DataWrapper.html#datawrappercs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DataWrapper.cs /// Brief : Class that is used to interface between the main Form (vue) and the Storage (wich is a class that wraps the sqlite database, so the model) its almost MVC :D /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.Drawing ; namespace TrackTrends { internal class DataWrapper { private Reader Reader ; private SqliteStorage Storage ; List < List < DriverData >> LiveDriverDataLogs = new List < List < DriverData >>(); //Note : It could be usefull to get the mainForm at the start of the programm and not have to take it in half of the methods. /// /// Constructs a new DataWrapper. It needs the config file so it can create a Reader, It also needs a first screenshot for the same reason /// /// The JSON config file that is created by the configuration tool /// A screenshot of the public DataWrapper ( string configFile , Bitmap screenshot ) { Reader = new Reader ( configFile , screenshot , true ); //The Storage is here and on the Reader. It seems bad but it is ok as we dont use it at all to insert data and are only using it here to read some. The reader takes care of the inserts (Note: We could technically do both here but I did not find it usefull to transfer everything here) Storage = Reader . Storage ; } /// /// Refreshes the controller so it has the latest driver datas (Be sure to call it everytime you need to use any other method and expects the data to be up to date) /// /// Error code, 0 is success, 1 is not (Note: Maybe it could be interesting in the future to add some more error handling here) public int Refresh () { LiveDriverDataLogs . Add ( Reader . Decode ( Reader . MainZones , Reader . Drivers )); if ( LiveDriverDataLogs . Count > 0 ) return 0 ; return 1 ; } /// /// Changes the image to the newest screenshot in all of the zones and windows /// /// The new screenshot to put everywhere (Do not mix resolutions) public void ChangeImage ( Bitmap image ) { Reader . ChangeImage ( image ); } /// /// Gets all the data from one driver and also displays into the given panel the last five laps (or less if its the sart of the race) Note: Its responsive :D /// /// The name of the driver (should not be case sensitive but it MUST already exist in the first list that has been inserted into the DB) /// The pannel where you want the five last laps to be displayed /// The Main form. /// public DriverData GetFullDriverData ( string driverName , Panel lastFiveLapsPanel , Main form1 ) { //Note : I know that its a bad idea to ask the Form in this method and some others because it means that it wont work with any main form. And to that Ill say that... your right ! DriverData result = new DriverData (); if ( LiveDriverDataLogs . Count > 0 ) { //Searches the most recent live data from the given driverName foreach ( DriverData data in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { if ( data . Name == driverName ) result = data ; } if ( result . Name != \"\" ) { //Recovers and displays the last five laps from the driver lastFiveLapsPanel . Controls . Clear (); Size labelDimensions = new Size ( lastFiveLapsPanel . Width , lastFiveLapsPanel . Height / 5 ); List <( int LapTime , int Lap )> lapsInfos = Storage . GetDriverLaptimes ( driverName , 5 ); int id = 0 ; foreach (( int LapTime , int Lap ) lapData in lapsInfos ) { //Hardcodes the new button. //Note : It could be smart to have like a default button for all the methods to use without needing to rewrite everything. Button newButton = new Button (); lastFiveLapsPanel . Controls . Add ( newButton ); newButton . Name = driverName + \"_\" + lapData . Lap ; newButton . Text = Reader . ConvertMsToTime ( lapData . LapTime ); newButton . Size = labelDimensions ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Click += form1 . btnLapTime_Click ; newButton . Location = new Point ( 0 , id * newButton . Height ); id ++; } } } return result ; } /// /// Runs trough every drivers live data to recover the drivers that are close to each others /// /// The control that will host the displayed battles /// The main form. It needs to have a method called 'btnDriver_Click' so it can reads the buttons clicks public void DisplayBattles ( Panel pnlBattles , Main form1 ) { DriverData oldDriver = null ; List <( DriverData d1 , DriverData d2 , int gap )> battles = new List <( DriverData d1 , DriverData d2 , int gap )>(); //Search trough all the drivers and finds the one battling foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { if ( oldDriver != null && driver . Position != - 1 && oldDriver . Position != - 1 ) { if ( driver . GapToLeader < oldDriver . GapToLeader ) { //There is a problem with the drivers gaps } else { int gap = driver . GapToLeader - oldDriver . GapToLeader ; //3000ms is 3s. If drivers are that close then they are definitely in battle. If they are farther then maybe not if ( gap <= 3000 ) { battles . Add (( oldDriver , driver , gap )); } } oldDriver = driver ; } else { oldDriver = driver ; } } //We will only display 4 battles max int maxBattles = 4 ; if ( battles . Count > 0 ) { pnlBattles . Controls . Clear (); int maxUiHeight = Math . Max ( pnlBattles . Height / maxBattles , pnlBattles . Height / battles . Count ); int id = 0 ; foreach (( DriverData d1 , DriverData d2 , int gap ) battle in battles ) { if ( id < maxBattles ) { //*hardcoding* the different controls that needs to be added to the panel. //Note : this stuff could totally be handled by the Form with method returning a list of the drivers. It was just easier for me at the time to code it this way but its not the prettiest Button btnFirstDriver = new Button (); Button btnSecondDriver = new Button (); Label lblGap = new Label (); pnlBattles . Controls . Add ( btnFirstDriver ); pnlBattles . Controls . Add ( lblGap ); pnlBattles . Controls . Add ( btnSecondDriver ); btnFirstDriver . Anchor = AnchorStyles . Left | AnchorStyles . Top ; btnSecondDriver . Anchor = AnchorStyles . Right | AnchorStyles . Top ; lblGap . Anchor = AnchorStyles . Right | AnchorStyles . Left | AnchorStyles . Top ; lblGap . TextAlign = ContentAlignment . MiddleCenter ; lblGap . Font = new Font ( lblGap . Font . FontFamily , 15 ); btnFirstDriver . Click += form1 . btnDriver_Click ; btnSecondDriver . Click += form1 . btnDriver_Click ; btnFirstDriver . FlatStyle = FlatStyle . Popup ; btnSecondDriver . FlatStyle = FlatStyle . Popup ; lblGap . FlatStyle = FlatStyle . Popup ; btnFirstDriver . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); btnSecondDriver . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); lblGap . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); btnFirstDriver . Location = new Point ( pnlBattles . Width / 3 * 0 , id * maxUiHeight ); lblGap . Location = new Point ( pnlBattles . Width / 3 * 1 , id * maxUiHeight ); btnSecondDriver . Location = new Point ( pnlBattles . Width / 3 * 2 , id * maxUiHeight ); btnFirstDriver . Text = battle . d1 . Name ; lblGap . Text = \"+ \" + Reader . ConvertMsToTime ( battle . gap ); if ( battle . gap <= 2000 ) lblGap . ForeColor = Color . Yellow ; if ( battle . gap <= 1000 ) lblGap . ForeColor = Color . Green ; btnSecondDriver . Text = battle . d2 . Name ; btnFirstDriver . Name = battle . d1 . Name + \"_\" + id ; lblGap . Name = \"lbl_Gap_\" + id ; btnSecondDriver . Name = battle . d2 . Name + \"_\" + id ; } else { break ; } id ++; } } } /// /// Searches the fastest and slowests drivers and displays them in the given panels /// /// Panel that will contain the constructed controls /// Panel that will contain the constructed controls /// The main form that needs to implement the method btnDriver_Click to allow it to recover custom buttons click public void DisplayTimesDeltas ( Panel pnlFastest , Panel pnlSlowest , Main form1 ) { List <( int avg , string driverName )> averages = new List <( int avg , string driverName )>(); foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { //We want to recover the last 5 lap times List <( int lapTime , int lap )> laps = Storage . GetDriverLaptimes ( driver . Name , 5 ); if ( laps . Count > 0 ) { int avg = 0 ; foreach (( int lapTime , int lap ) lap in laps ) { avg += lap . lapTime ; } avg = avg / laps . Count ; averages . Add (( avg , driver . Name )); } } int numberOfDriversToShow = 5 ; if ( averages . Count > 0 && averages . Count > numberOfDriversToShow ) { averages = averages . OrderBy ( item => item . avg ). ToList (); pnlFastest . Controls . Clear (); pnlSlowest . Controls . Clear (); int maxUiSize = pnlFastest . Height / numberOfDriversToShow ; //Displays the fastest drivers for ( int i = 0 ; i < numberOfDriversToShow ; i ++) { Button newButton = new Button (); ( int avg , string driver ) data = averages [ i ]; pnlFastest . Controls . Add ( newButton ); newButton . Size = new Size ( pnlFastest . Width , maxUiSize ); newButton . Location = new Point ( 0 , i * maxUiSize ); newButton . Text = data . driver ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Name = data . driver + \"_fastest_\" + i ; newButton . Click += form1 . btnDriver_Click ; //We take the average time lost per lap if ( i != 0 ) newButton . Text += \" + \" + Reader . ConvertMsToTime ( Convert . ToInt32 ((( float ) data . avg - ( float ) averages [ 0 ]. avg ) / 5.0f )); } //Displays the slowests drivers int badId = 0 ; for ( int i = averages . Count - 1 ; i >= averages . Count - numberOfDriversToShow ; i --) { Button newButton = new Button (); ( int avg , string driver ) data = averages [ i ]; pnlSlowest . Controls . Add ( newButton ); newButton . Size = new Size ( pnlFastest . Width , maxUiSize ); newButton . Location = new Point ( 0 , badId * maxUiSize ); newButton . Text = data . driver ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Name = data . driver + \"_slowest_\" + i ; newButton . Click += form1 . btnDriver_Click ; //We take the average time lost per lap newButton . Text += \" + \" + Reader . ConvertMsToTime ( Convert . ToInt32 ((( float ) data . avg - ( float ) averages [ 0 ]. avg ) / 5.0f )); badId ++; } } } /// /// Will add to the list of overtakes the different changes of position /// /// The listbox containing all the infos public void DisplayOvertakes ( ListBox lsbResult ) { //Note : This method SHOULD REALLY not do this but just return a string or a list of string with the new overtakes so the form can handle it as it wishes if ( LiveDriverDataLogs . Count > 1 ) { List < DriverData > oldList = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 2 ]; List < DriverData > newList = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]; for ( int i = 0 ; i < LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]. Count ; i ++) { if ( oldList [ i ]. Name != newList [ i ]. Name ) { //There has been a change in the standings for ( int y = 0 ; y < oldList . Count ; y ++) { if ( newList [ y ]. Name == oldList [ i ]. Name ) { //We found its new location if ( y > i ) { //The driver overtook someone lsbResult . Items . Add ( newList [ y ]. Name + \" climbed to \" + y ); } else { //The driver got overtook by someone lsbResult . Items . Add ( newList [ y ]. Name + \" fell to \" + y ); } } } } } } } /// /// Displays a messageBox containing the infos about a lap time /// /// The name of the driver that has done the lapTime /// The number of the lap on wich the lapTime has been set (CAUTION ITS NOT THE RACING LAP ITS FROM THE DB) /// The time (in ms) of the lap public void DisplayLapTimeInfos ( string driverName , int Lap , string LapTime ) { List < int > sectors = Storage . GetSectorsFromLapTime ( driverName , Lap ); string message = \"Lap time infos\" + Environment . NewLine ; message += LapTime + Environment . NewLine ; if ( sectors . Count > 0 ) message += \"Sector 1 : \" + Reader . ConvertMsToTime ( sectors [ 0 ]) + Environment . NewLine ; if ( sectors . Count > 1 ) message += \"Sector 2 : \" + Reader . ConvertMsToTime ( sectors [ 1 ]) + Environment . NewLine ; if ( sectors . Count > 2 ) message += \"Sector 3 : \" + Reader . ConvertMsToTime ( sectors [ 2 ]) + Environment . NewLine ; MessageBox . Show ( message ); } /// /// Displays the live ranking with the names of the drivers and their gap to the leader in the right order /// /// The control that will host all the new controls /// The main form public void DisplayLiveRanking ( Panel pnl , Main form1 ) { if ( LiveDriverDataLogs . Count > 0 ) { pnl . Controls . Clear (); //Gets the last item that should be the most recent data List < DriverData > liveData = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]; Button [] buttons = new Button [ liveData . Count ]; Size buttonDimensions = new Size ( pnl . Width , pnl . Height / liveData . Count ); for ( int driverCount = 0 ; driverCount < liveData . Count ; driverCount ++) { Button newButton = new Button (); newButton . Size = buttonDimensions ; newButton . Location = new Point ( 0 , driverCount * buttonDimensions . Height ); newButton . FlatStyle = FlatStyle . Popup ; DriverData driver = liveData [ driverCount ]; if ( driver . Position == - 1 ) { //Its a DNF newButton . Enabled = false ; } if ( driver . Position > 1 ) { newButton . Text = driver . Name + \" +\" + Reader . ConvertMsToTime ( driver . GapToLeader ); } else { newButton . Text = driver . Name ; } newButton . Name = liveData [ driverCount ]. Name ; newButton . TextAlign = ContentAlignment . MiddleLeft ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Click += form1 . btnDriver_Click ; buttons [ driverCount ] = newButton ; } //Note : It could be better to have this directly in the same loop foreach ( Button button in buttons ) { pnl . Controls . Add ( button ); } } } } }","title":"DataWrapper.cs"},{"location":"Code/DriverDrsWindow.html","text":"DriverDrsWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverDrsWindow.cs /// Brief : Window containing DRS related method and infos /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Drawing.Imaging ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using Tesseract ; namespace TrackTrends { public class DriverDrsWindow : Window { private static int EmptyDrsGreenValue = - 1 ; private static Random rnd = new Random (); public DriverDrsWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"DRS\" ; } /// /// Method that will decode the content of the window /// /// returns a boolean (true = DRS OPEN, false = DRS CLOSED) public override object DecodePng () { bool result = false ; //DEBUG //WindowImage.Save(\"./DRS/\"+rnd.Next(0,99999)+\".png\"); int greenValue = GetGreenPixels (); if ( EmptyDrsGreenValue == - 1 ) EmptyDrsGreenValue = greenValue ; if ( greenValue > EmptyDrsGreenValue + EmptyDrsGreenValue / 100 * 30 ) result = true ; return result ; } /// /// Method that will get the green pixel proportion in the image, this can be used to determin if the DRS has been actuated /// /// The number of clearely green pixels private unsafe int GetGreenPixels () { int tot = 0 ; Bitmap bmp = WindowImage ; Rectangle rect = new Rectangle ( 0 , 0 , bmp . Width , bmp . Height ); BitmapData bmpData = bmp . LockBits ( rect , ImageLockMode . ReadOnly , bmp . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( bmp . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < bmp . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmp . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; if ( green > blue * 1.5 && green > red * 1.5 ) { tot ++; } } } } bmp . UnlockBits ( bmpData ); return tot ; } /// /// This method is used to lock on where exactly the DRS window is /// /// Returns a rectangle containing the DRS public Rectangle GetBox () { var tessImage = Pix . LoadFromMemory ( ImageToByte ( WindowImage )); Engine . SetVariable ( \"tessedit_char_whitelist\" , \"\" ); Page page = Engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; // Get the bounding box for the current element if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { page . Dispose (); return new Rectangle ( boundingBox . X1 , boundingBox . X2 , boundingBox . Width , boundingBox . Height ); } } while ( iter . Next ( PageIteratorLevel . Word )); page . Dispose (); return new Rectangle ( 0 , 0 , 0 , 0 ); } } } }","title":"DriverDrsWindow.cs"},{"location":"Code/DriverDrsWindow.html#driverdrswindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverDrsWindow.cs /// Brief : Window containing DRS related method and infos /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Drawing.Imaging ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using Tesseract ; namespace TrackTrends { public class DriverDrsWindow : Window { private static int EmptyDrsGreenValue = - 1 ; private static Random rnd = new Random (); public DriverDrsWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"DRS\" ; } /// /// Method that will decode the content of the window /// /// returns a boolean (true = DRS OPEN, false = DRS CLOSED) public override object DecodePng () { bool result = false ; //DEBUG //WindowImage.Save(\"./DRS/\"+rnd.Next(0,99999)+\".png\"); int greenValue = GetGreenPixels (); if ( EmptyDrsGreenValue == - 1 ) EmptyDrsGreenValue = greenValue ; if ( greenValue > EmptyDrsGreenValue + EmptyDrsGreenValue / 100 * 30 ) result = true ; return result ; } /// /// Method that will get the green pixel proportion in the image, this can be used to determin if the DRS has been actuated /// /// The number of clearely green pixels private unsafe int GetGreenPixels () { int tot = 0 ; Bitmap bmp = WindowImage ; Rectangle rect = new Rectangle ( 0 , 0 , bmp . Width , bmp . Height ); BitmapData bmpData = bmp . LockBits ( rect , ImageLockMode . ReadOnly , bmp . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( bmp . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < bmp . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmp . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; if ( green > blue * 1.5 && green > red * 1.5 ) { tot ++; } } } } bmp . UnlockBits ( bmpData ); return tot ; } /// /// This method is used to lock on where exactly the DRS window is /// /// Returns a rectangle containing the DRS public Rectangle GetBox () { var tessImage = Pix . LoadFromMemory ( ImageToByte ( WindowImage )); Engine . SetVariable ( \"tessedit_char_whitelist\" , \"\" ); Page page = Engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; // Get the bounding box for the current element if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { page . Dispose (); return new Rectangle ( boundingBox . X1 , boundingBox . X2 , boundingBox . Width , boundingBox . Height ); } } while ( iter . Next ( PageIteratorLevel . Word )); page . Dispose (); return new Rectangle ( 0 , 0 , 0 , 0 ); } } } }","title":"DriverDrsWindow.cs"},{"location":"Code/DriverLapTimeWindow.html","text":"DriverLapTimeWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverLapTimeWindow /// Brief : Window containing infos about the lap time of a driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverLapTimeWindow : Window { public DriverLapTimeWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"LapTime\" ; } /// /// Decodes the lap time contained in the image using OCR Tesseract /// /// The laptime in int (ms) public override object DecodePng () { int result = GetTimeFromPng ( WindowImage , OcrImage . WindowType . LapTime , Engine ); return result ; } } }","title":"DriverLapTimeWindow.cs"},{"location":"Code/DriverLapTimeWindow.html#driverlaptimewindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverLapTimeWindow /// Brief : Window containing infos about the lap time of a driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverLapTimeWindow : Window { public DriverLapTimeWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"LapTime\" ; } /// /// Decodes the lap time contained in the image using OCR Tesseract /// /// The laptime in int (ms) public override object DecodePng () { int result = GetTimeFromPng ( WindowImage , OcrImage . WindowType . LapTime , Engine ); return result ; } } }","title":"DriverLapTimeWindow.cs"},{"location":"Code/DriverPositionWindow.html","text":"DriverPositionWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverPositionWindow.cs /// Brief : Window containing infos about the position of a driver. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverPositionWindow : Window { public DriverPositionWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Position\" ; } /// /// Decodes the position number using Tesseract OCR /// /// An int representing the position of the driver (should be between 1 and 20 included) public override object DecodePng () { string ocrResult = GetStringFromPng ( WindowImage , Engine , \"0123456789\" ); int position ; try { position = Convert . ToInt32 ( ocrResult ); } catch { position = - 1 ; } return position ; } } }","title":"DriverPositionWindow.cs"},{"location":"Code/DriverPositionWindow.html#driverpositionwindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverPositionWindow.cs /// Brief : Window containing infos about the position of a driver. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverPositionWindow : Window { public DriverPositionWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Position\" ; } /// /// Decodes the position number using Tesseract OCR /// /// An int representing the position of the driver (should be between 1 and 20 included) public override object DecodePng () { string ocrResult = GetStringFromPng ( WindowImage , Engine , \"0123456789\" ); int position ; try { position = Convert . ToInt32 ( ocrResult ); } catch { position = - 1 ; } return position ; } } }","title":"DriverPositionWindow.cs"},{"location":"Code/DriverTyresWindow.html","text":"DriverTyresWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverTyresWindow.cs /// Brief : Window containing infos about a driver's tyre /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverTyresWindow : Window { private static Random rnd = new Random (); //Those are the colors I found but you can change them if they change in the future like in 2019 public static Color SOFT_TYRE_COLOR = Color . FromArgb ( 0 xff , 0 x00 , 0 x00 ); public static Color MEDIUM_TYRE_COLOR = Color . FromArgb ( 0 xf5 , 0 xbf , 0 x00 ); public static Color HARD_TYRE_COLOR = Color . FromArgb ( 0 xa4 , 0 xa5 , 0 xa8 ); public static Color INTER_TYRE_COLOR = Color . FromArgb ( 0 x00 , 0 xa4 , 0 x2e ); public static Color WET_TYRE_COLOR = Color . FromArgb ( 0 x27 , 0 x60 , 0 xa6 ); public static Color EMPTY_COLOR = Color . FromArgb ( 0 x20 , 0 x20 , 0 x20 ); public DriverTyresWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Tyres\" ; } /// /// This will decode the content of the image /// /// And object containing what was on the image public override object DecodePng () { return GetTyreInfos (); } /// /// Method that will decode whats on the image and return the tyre infos it could manage to recover /// /// A tyre object containing tyre infos private Tyre GetTyreInfos () { //DEBUG //WindowImage.Save(\"./Tyre/raw_\"+rnd.Next(0,99999)+\".png\"); Bitmap tyreZone = GetSmallBitmapFromBigOne ( WindowImage , FindTyreZone ()); Tyre . Type type = Tyre . Type . Undefined ; type = GetTyreTypeFromColor ( OcrImage . GetAvgColorFromBitmap ( tyreZone )); int laps = - 1 ; string number = GetStringFromPng ( tyreZone , Engine , \"0123456789\" , OcrImage . WindowType . Tyre ); try { laps = Convert . ToInt32 ( number ); } catch { //We could not convert the number so its a letter so its 0 laps old laps = 0 ; } //71 is the most laps an f1 race is ever going to have (mexico) so any more would be considered as bad (and remember you cant go trough a full race without making at least one pitstop) if ( laps > 75 ) laps = 0 ; return new Tyre ( type , laps ); } /// /// Finds where the important part of the image is /// /// A rectangle containing position and dimensions of the important part of the image private Rectangle FindTyreZone () { Bitmap bmp = WindowImage ; int currentPosition = bmp . Width ; int height = bmp . Height / 2 ; Color limitColor = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Color currentColor = Color . FromArgb ( 0 , 0 , 0 ); //25F Size newWindowSize = new Size ( bmp . Height - Convert . ToInt32 (( float ) bmp . Height / 100f * 25f ), bmp . Height - Convert . ToInt32 (( float ) bmp . Height / 100f * 35f )); while ( currentColor . R <= limitColor . R && currentColor . G <= limitColor . G && currentColor . B <= limitColor . B && currentPosition > 0 ) { currentPosition --; currentColor = bmp . GetPixel ( currentPosition , height ); } //Its here to let the new window include a little bit of the right int CorrectedX = currentPosition - ( newWindowSize . Width ) + Convert . ToInt32 (( float ) newWindowSize . Width / 100f * 10f ); int CorrectedY = Convert . ToInt32 (( float ) newWindowSize . Height / 100f * 35f ); if ( CorrectedX <= 0 ) return new Rectangle ( 0 , 0 , newWindowSize . Width , newWindowSize . Height ); return new Rectangle ( CorrectedX , CorrectedY , newWindowSize . Width , newWindowSize . Height ); } //This method has been created with the help of chatGPT /// /// Methods that compares a list of colors to see wich is the closest from the input color and decide wich tyre type it is /// /// The color that you found /// The tyre type public Tyre . Type GetTyreTypeFromColor ( Color inputColor ) { Tyre . Type type = Tyre . Type . Undefined ; List < Color > colors = new List < Color >(); //dont forget that if for some reason someday F1 adds a new Tyre type you will need to add it in the constants but also here in the list //You will also need to add it below in the Tyre object's enum and add an if in the end of this method colors . Add ( SOFT_TYRE_COLOR ); colors . Add ( MEDIUM_TYRE_COLOR ); colors . Add ( HARD_TYRE_COLOR ); colors . Add ( INTER_TYRE_COLOR ); colors . Add ( WET_TYRE_COLOR ); colors . Add ( EMPTY_COLOR ); Color closestColor = colors [ 0 ]; int closestDistance = int . MaxValue ; foreach ( Color color in colors ) { int distance = Math . Abs ( color . R - inputColor . R ) + Math . Abs ( color . G - inputColor . G ) + Math . Abs ( color . B - inputColor . B ); if ( distance < closestDistance ) { closestColor = color ; closestDistance = distance ; } } //We cant use a switch as the colors cant be constants ... if ( closestColor == SOFT_TYRE_COLOR ) type = Tyre . Type . Soft ; if ( closestColor == MEDIUM_TYRE_COLOR ) type = Tyre . Type . Medium ; if ( closestColor == HARD_TYRE_COLOR ) type = Tyre . Type . Hard ; if ( closestColor == INTER_TYRE_COLOR ) type = Tyre . Type . Inter ; if ( closestColor == WET_TYRE_COLOR ) type = Tyre . Type . Wet ; if ( closestColor == EMPTY_COLOR ) return Tyre . Type . Undefined ; return type ; } } }","title":"DriverTyresWindow.cs"},{"location":"Code/DriverTyresWindow.html#drivertyreswindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverTyresWindow.cs /// Brief : Window containing infos about a driver's tyre /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverTyresWindow : Window { private static Random rnd = new Random (); //Those are the colors I found but you can change them if they change in the future like in 2019 public static Color SOFT_TYRE_COLOR = Color . FromArgb ( 0 xff , 0 x00 , 0 x00 ); public static Color MEDIUM_TYRE_COLOR = Color . FromArgb ( 0 xf5 , 0 xbf , 0 x00 ); public static Color HARD_TYRE_COLOR = Color . FromArgb ( 0 xa4 , 0 xa5 , 0 xa8 ); public static Color INTER_TYRE_COLOR = Color . FromArgb ( 0 x00 , 0 xa4 , 0 x2e ); public static Color WET_TYRE_COLOR = Color . FromArgb ( 0 x27 , 0 x60 , 0 xa6 ); public static Color EMPTY_COLOR = Color . FromArgb ( 0 x20 , 0 x20 , 0 x20 ); public DriverTyresWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Tyres\" ; } /// /// This will decode the content of the image /// /// And object containing what was on the image public override object DecodePng () { return GetTyreInfos (); } /// /// Method that will decode whats on the image and return the tyre infos it could manage to recover /// /// A tyre object containing tyre infos private Tyre GetTyreInfos () { //DEBUG //WindowImage.Save(\"./Tyre/raw_\"+rnd.Next(0,99999)+\".png\"); Bitmap tyreZone = GetSmallBitmapFromBigOne ( WindowImage , FindTyreZone ()); Tyre . Type type = Tyre . Type . Undefined ; type = GetTyreTypeFromColor ( OcrImage . GetAvgColorFromBitmap ( tyreZone )); int laps = - 1 ; string number = GetStringFromPng ( tyreZone , Engine , \"0123456789\" , OcrImage . WindowType . Tyre ); try { laps = Convert . ToInt32 ( number ); } catch { //We could not convert the number so its a letter so its 0 laps old laps = 0 ; } //71 is the most laps an f1 race is ever going to have (mexico) so any more would be considered as bad (and remember you cant go trough a full race without making at least one pitstop) if ( laps > 75 ) laps = 0 ; return new Tyre ( type , laps ); } /// /// Finds where the important part of the image is /// /// A rectangle containing position and dimensions of the important part of the image private Rectangle FindTyreZone () { Bitmap bmp = WindowImage ; int currentPosition = bmp . Width ; int height = bmp . Height / 2 ; Color limitColor = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Color currentColor = Color . FromArgb ( 0 , 0 , 0 ); //25F Size newWindowSize = new Size ( bmp . Height - Convert . ToInt32 (( float ) bmp . Height / 100f * 25f ), bmp . Height - Convert . ToInt32 (( float ) bmp . Height / 100f * 35f )); while ( currentColor . R <= limitColor . R && currentColor . G <= limitColor . G && currentColor . B <= limitColor . B && currentPosition > 0 ) { currentPosition --; currentColor = bmp . GetPixel ( currentPosition , height ); } //Its here to let the new window include a little bit of the right int CorrectedX = currentPosition - ( newWindowSize . Width ) + Convert . ToInt32 (( float ) newWindowSize . Width / 100f * 10f ); int CorrectedY = Convert . ToInt32 (( float ) newWindowSize . Height / 100f * 35f ); if ( CorrectedX <= 0 ) return new Rectangle ( 0 , 0 , newWindowSize . Width , newWindowSize . Height ); return new Rectangle ( CorrectedX , CorrectedY , newWindowSize . Width , newWindowSize . Height ); } //This method has been created with the help of chatGPT /// /// Methods that compares a list of colors to see wich is the closest from the input color and decide wich tyre type it is /// /// The color that you found /// The tyre type public Tyre . Type GetTyreTypeFromColor ( Color inputColor ) { Tyre . Type type = Tyre . Type . Undefined ; List < Color > colors = new List < Color >(); //dont forget that if for some reason someday F1 adds a new Tyre type you will need to add it in the constants but also here in the list //You will also need to add it below in the Tyre object's enum and add an if in the end of this method colors . Add ( SOFT_TYRE_COLOR ); colors . Add ( MEDIUM_TYRE_COLOR ); colors . Add ( HARD_TYRE_COLOR ); colors . Add ( INTER_TYRE_COLOR ); colors . Add ( WET_TYRE_COLOR ); colors . Add ( EMPTY_COLOR ); Color closestColor = colors [ 0 ]; int closestDistance = int . MaxValue ; foreach ( Color color in colors ) { int distance = Math . Abs ( color . R - inputColor . R ) + Math . Abs ( color . G - inputColor . G ) + Math . Abs ( color . B - inputColor . B ); if ( distance < closestDistance ) { closestColor = color ; closestDistance = distance ; } } //We cant use a switch as the colors cant be constants ... if ( closestColor == SOFT_TYRE_COLOR ) type = Tyre . Type . Soft ; if ( closestColor == MEDIUM_TYRE_COLOR ) type = Tyre . Type . Medium ; if ( closestColor == HARD_TYRE_COLOR ) type = Tyre . Type . Hard ; if ( closestColor == INTER_TYRE_COLOR ) type = Tyre . Type . Inter ; if ( closestColor == WET_TYRE_COLOR ) type = Tyre . Type . Wet ; if ( closestColor == EMPTY_COLOR ) return Tyre . Type . Undefined ; return type ; } } }","title":"DriverTyresWindow.cs"},{"location":"Code/OcrImage.html","text":"OcrImage.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : OcrImage.cs /// Brief : Class containing all the methods used to enhance images for OCR /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Threading.Tasks ; using System.Drawing ; using System.Drawing.Drawing2D ; using System.Drawing.Imaging ; namespace TrackTrends { public class OcrImage { //this is a hardcoded value based on the colors of the F1TV data channel background you can change it if sometime in the future the color changes //Any color that has any of its R,G or B channel higher than the treshold will be considered as being usefull information public static Color F1TV_BACKGROUND_TRESHOLD = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Bitmap InputBitmap ; public enum WindowType { LapTime , Text , Sector , Gap , Tyre , } /// /// Create a new Ocr image to help enhance the given bitmap for OCR /// /// The image you want to enhance public OcrImage ( Bitmap inputBitmap ) { InputBitmap = inputBitmap ; } /// /// Enhances the image depending on wich type of window the image comes from /// /// The type of the window. Depending on it different enhancing features will be applied /// The enhanced Bitmap public Bitmap Enhance ( WindowType type = WindowType . Text ) { Bitmap outputBitmap = ( Bitmap ) InputBitmap . Clone (); //Note : If you plan to activate all the comments that I used to debug the OCR I would advise to make sure that the debug folder exists switch ( type ) { case WindowType . Gap : //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 165 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\treshold_\" + id + \".png\"); outputBitmap = Resize ( outputBitmap , 2 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\resize_\" + id + \".png\"); outputBitmap = Dilatation ( outputBitmap , 1 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\Final_dilatation_\" + id + \".png\"); break ; case WindowType . Sector : //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = VanishOxyAction ( outputBitmap ); //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\vanish_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 150 ); //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\Final_treshold_\" + id + \".png\"); break ; case WindowType . LapTime : //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 185 ); //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\Treshold_\" + id + \".png\"); outputBitmap = SobelEdgeDetection ( outputBitmap ); //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\SobelDetection_\" + id + \".png\"); break ; case WindowType . Text : //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 165 ); //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @\"\\Final_treshold_\" + id + \".png\"); break ; case WindowType . Tyre : //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = RemoveUseless ( outputBitmap ); //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\uselessRemoved_\" + id + \".png\"); outputBitmap = Dilatation ( outputBitmap , 1 ); //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\Final_dilatation_\" + id + \".png\"); break ; default : outputBitmap = Tresholding ( outputBitmap , 165 ); outputBitmap = Resize ( outputBitmap , 2 ); outputBitmap = Erode ( outputBitmap , 1 ); break ; } return outputBitmap ; } /// /// Method that convert a colored RGB bitmap into a GrayScale image /// /// The Bitmap you want to convert /// The bitmap in grayscale public static Bitmap Grayscale ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); //This is not a proper treshold method but it is helping the sobel edge detection if ( gray <= F1TV_BACKGROUND_TRESHOLD . R ) { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } else { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) gray ; } } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that uses the Sobel Edge detection to outline the edges of the characters to help with the OCR /// /// The image with the sobel edge detection used /// private Bitmap SobelEdgeDetection ( Bitmap grayscaleImage ) { // Create a new bitmap for the edges Bitmap edgesImage = new Bitmap ( grayscaleImage . Width , grayscaleImage . Height ); // Define the Sobel operators // Its just a matrix that we will use on the all image int [,] sobelX = { { - 1 , 0 , 1 }, { - 2 , 0 , 2 }, { - 1 , 0 , 1 } }; int [,] sobelY = { { - 1 , - 2 , - 1 }, { 0 , 0 , 0 }, { 1 , 2 , 1 } }; // Apply the Sobel operators and normalize the gradients // NOTE: I dont know how easy or hard it would be to make this paralel but it could be a good idea to do so if possible. for ( int y = 1 ; y < grayscaleImage . Height - 1 ; y ++) { for ( int x = 1 ; x < grayscaleImage . Width - 1 ; x ++) { int gradientX = CalculateGradient ( grayscaleImage , sobelX , x , y ); int gradientY = CalculateGradient ( grayscaleImage , sobelY , x , y ); int gradient = ( int ) Math . Sqrt ( gradientX * gradientX + gradientY * gradientY ); // Normalize the gradient value // In some rare cases the value can exceed 255 so we limit it with the Math.Min method gradient = Math . Min ( 255 , Math . Max ( 0 , gradient )); edgesImage . SetPixel ( x , y , Color . FromArgb ( gradient , gradient , gradient )); } } return edgesImage ; } /// /// Method that's here to be used by the sobel edge detection method (Chat GPT has been used for parts of this method) /// /// The input image with the grayscale processing already done /// The matrix to apply /// /// /// Returns the processed gradient private int CalculateGradient ( Bitmap grayscaleImage , int [,] sobelOperator , int x , int y ) { int gradient = 0 ; for ( int j = - 1 ; j <= 1 ; j ++) { for ( int i = - 1 ; i <= 1 ; i ++) { int pixelX = grayscaleImage . GetPixel ( x + i , y + j ). R ; gradient += sobelOperator [ j + 1 , i + 1 ] * pixelX ; } } return gradient ; } /// /// Method that is used to whiten an image. Ignore the funny name. Its used to prevent colored text to trouble the OCR when it uses grayscaling /// /// The bitmap to vanish /// public static Bitmap VanishOxyAction ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { //Note : MAKE THIS PARALELL OMG WY DID I LEFT IT LIKE THAT byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int blue = ( int ) pixel [ 0 ]; int green = ( int ) pixel [ 1 ]; int red = ( int ) pixel [ 2 ]; int max = Math . Max ( Math . Max ( blue , green ), red ); if ( max > 255 / 3 ) max = 255 ; pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) max ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that binaries the input image up to a certain treshold given /// /// the bitmap you want to convert to binary colors /// The floor at wich the color is considered as white or black /// The binarised bitmap public static Bitmap Tresholding ( Bitmap inputBitmap , int threshold ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); int bmpHeight = inputBitmap . Height ; int bmpWidth = inputBitmap . Width ; Parallel . For ( 0 , bmpHeight , y => { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmpWidth ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); int value = gray < threshold ? 0 : 255 ; pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) value ; } }); } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that removes the pixels that are flagged as background /// /// The bitmap you want to remove the background from /// The Bitmap without the background public static Bitmap RemoveBG ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R <= F1TV_BACKGROUND_TRESHOLD . R && G <= F1TV_BACKGROUND_TRESHOLD . G && B <= F1TV_BACKGROUND_TRESHOLD . B ) pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that removes all the useless things from the image and returns hopefully only the numbers /// /// The bitmap you want to remove useless things from (Expects a cropped part of the TyreWindow) /// The bitmap with (hopefully) only the digits public unsafe static Bitmap RemoveUseless ( Bitmap inputBitmap ) { //Note you can use something else than a cropped tyre window but I would recommend checking the code first to see if it fits your intended use Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); List < int > pixelsToRemove = new List < int >(); bool fromBorder = true ; for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( fromBorder && B < F1TV_BACKGROUND_TRESHOLD . B && G < F1TV_BACKGROUND_TRESHOLD . G && R < F1TV_BACKGROUND_TRESHOLD . R ) { pixelsToRemove . Add ( x ); } else { if ( fromBorder ) { fromBorder = false ; pixelsToRemove . Add ( x ); } } } fromBorder = true ; for ( int x = inputBitmap . Width - 1 ; x > 0 ; x --) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( fromBorder && B < F1TV_BACKGROUND_TRESHOLD . B && G < F1TV_BACKGROUND_TRESHOLD . G && R < F1TV_BACKGROUND_TRESHOLD . R ) { pixelsToRemove . Add ( x ); } else { if ( fromBorder ) { fromBorder = false ; pixelsToRemove . Add ( x ); } } } foreach ( int pxPos in pixelsToRemove ) { byte * pixel = currentLine + ( pxPos * bytesPerPixel ); pixel [ 0 ] = 0 xFF ; pixel [ 1 ] = 0 xFF ; pixel [ 2 ] = 0 xFF ; } } //Removing the color parts for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R >= F1TV_BACKGROUND_TRESHOLD . R + 25 || G >= F1TV_BACKGROUND_TRESHOLD . G + 25 || B >= F1TV_BACKGROUND_TRESHOLD . B + 25 ) { pixel [ 0 ] = 0 xFF ; pixel [ 1 ] = 0 xFF ; pixel [ 2 ] = 0 xFF ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Recovers the average colors from the Image. NOTE : It wont take in account colors that are lower than the background /// /// The bitmap you want to get the average color from /// The average color of the bitmap public static Color GetAvgColorFromBitmap ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; int totR = 0 ; int totG = 0 ; int totB = 0 ; int totPixels = 1 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); int bmpHeight = inputBitmap . Height ; int bmpWidth = inputBitmap . Width ; Parallel . For ( 0 , bmpHeight , y => { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmpWidth ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R >= F1TV_BACKGROUND_TRESHOLD . R || G >= F1TV_BACKGROUND_TRESHOLD . G || B >= F1TV_BACKGROUND_TRESHOLD . B ) { totPixels ++; totB += pixel [ 0 ]; totG += pixel [ 1 ]; totR += pixel [ 2 ]; } } }); } inputBitmap . UnlockBits ( bmpData ); return Color . FromArgb ( 255 , Math . Min ( Convert . ToInt32 (( float ) totR / ( float ) totPixels ), 255 ), Math . Min ( Convert . ToInt32 (( float ) totG / ( float ) totPixels ), 255 ), Math . Min ( Convert . ToInt32 (( float ) totB / ( float ) totPixels ), 255 )); } /// /// This method simply inverts all the colors in a Bitmap /// /// the bitmap you want to invert the colors from /// The bitmap with inverted colors public static Bitmap InvertColors ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); pixel [ 0 ] = ( byte )( 255 - pixel [ 0 ]); pixel [ 1 ] = ( byte )( 255 - pixel [ 1 ]); pixel [ 2 ] = ( byte )( 255 - pixel [ 2 ]); } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Methods that applies Bicubic interpolation to increase the size and resolution of an image /// /// The bitmap you want to resize /// The factor of resizing you want to use. I recommend using even numbers /// The bitmap witht the new size public static Bitmap Resize ( Bitmap inputBitmap , int resizeFactor ) { var resultBitmap = new Bitmap ( inputBitmap . Width * resizeFactor , inputBitmap . Height * resizeFactor ); using ( var graphics = Graphics . FromImage ( resultBitmap )) { graphics . InterpolationMode = InterpolationMode . HighQualityBicubic ; graphics . DrawImage ( inputBitmap , new Rectangle ( 0 , 0 , resultBitmap . Width , resultBitmap . Height )); } return resultBitmap ; } /// /// method that Highlights the countours of a Bitmap /// /// The bitmap you want to highlight the countours of /// The bitmap with countours highlighted public static Bitmap HighlightContours ( Bitmap inputBitmap ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); Bitmap grayscale = Grayscale ( inputBitmap ); Bitmap thresholded = Tresholding ( grayscale , 128 ); Bitmap dilated = Dilatation ( thresholded , 3 ); Bitmap eroded = Erode ( dilated , 3 ); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { for ( int x = 0 ; x < inputBitmap . Width ; x ++) { Color pixel = inputBitmap . GetPixel ( x , y ); Color dilatedPixel = dilated . GetPixel ( x , y ); Color erodedPixel = eroded . GetPixel ( x , y ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); int threshold = dilatedPixel . R ; if ( gray > threshold ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } else if ( gray <= threshold && erodedPixel . R == 0 ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 0 , 0 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } } } return outputBitmap ; } /// /// Method that that erodes the morphology of a bitmap /// /// The bitmap you want to erode /// The amount of Erosion you want (be carefull its expensive on ressources) /// The Bitmap with the eroded contents public static Bitmap Erode ( Bitmap inputBitmap , int kernelSize ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); int [,] kernel = new int [ kernelSize , kernelSize ]; for ( int i = 0 ; i < kernelSize ; i ++) { for ( int j = 0 ; j < kernelSize ; j ++) { kernel [ i , j ] = 1 ; } } for ( int y = kernelSize / 2 ; y < inputBitmap . Height - kernelSize / 2 ; y ++) { for ( int x = kernelSize / 2 ; x < inputBitmap . Width - kernelSize / 2 ; x ++) { bool flag = true ; for ( int i = - kernelSize / 2 ; i <= kernelSize / 2 ; i ++) { for ( int j = - kernelSize / 2 ; j <= kernelSize / 2 ; j ++) { Color pixel = inputBitmap . GetPixel ( x + i , y + j ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); if ( gray >= 128 && kernel [ i + kernelSize / 2 , j + kernelSize / 2 ] == 1 ) { flag = false ; break ; } } if (! flag ) { break ; } } if ( flag ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } } } return outputBitmap ; } /// /// Method that that use dilatation of the morphology of a bitmap /// /// The bitmap you want to use dilatation on /// The amount of dilatation you want (be carefull its expensive on ressources) /// The Bitmap after Dilatation public static Bitmap Dilatation ( Bitmap inputBitmap , int kernelSize ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); int [,] kernel = new int [ kernelSize , kernelSize ]; for ( int i = 0 ; i < kernelSize ; i ++) { for ( int j = 0 ; j < kernelSize ; j ++) { kernel [ i , j ] = 1 ; } } for ( int y = kernelSize / 2 ; y < inputBitmap . Height - kernelSize / 2 ; y ++) { for ( int x = kernelSize / 2 ; x < inputBitmap . Width - kernelSize / 2 ; x ++) { bool flag = false ; for ( int i = - kernelSize / 2 ; i <= kernelSize / 2 ; i ++) { for ( int j = - kernelSize / 2 ; j <= kernelSize / 2 ; j ++) { Color pixel = inputBitmap . GetPixel ( x + i , y + j ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); if ( gray < 128 && kernel [ i + kernelSize / 2 , j + kernelSize / 2 ] == 1 ) { flag = true ; break ; } } if ( flag ) { break ; } } if ( flag ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } } } return outputBitmap ; } } }","title":"OcrImage.cs"},{"location":"Code/OcrImage.html#ocrimagecs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : OcrImage.cs /// Brief : Class containing all the methods used to enhance images for OCR /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Threading.Tasks ; using System.Drawing ; using System.Drawing.Drawing2D ; using System.Drawing.Imaging ; namespace TrackTrends { public class OcrImage { //this is a hardcoded value based on the colors of the F1TV data channel background you can change it if sometime in the future the color changes //Any color that has any of its R,G or B channel higher than the treshold will be considered as being usefull information public static Color F1TV_BACKGROUND_TRESHOLD = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Bitmap InputBitmap ; public enum WindowType { LapTime , Text , Sector , Gap , Tyre , } /// /// Create a new Ocr image to help enhance the given bitmap for OCR /// /// The image you want to enhance public OcrImage ( Bitmap inputBitmap ) { InputBitmap = inputBitmap ; } /// /// Enhances the image depending on wich type of window the image comes from /// /// The type of the window. Depending on it different enhancing features will be applied /// The enhanced Bitmap public Bitmap Enhance ( WindowType type = WindowType . Text ) { Bitmap outputBitmap = ( Bitmap ) InputBitmap . Clone (); //Note : If you plan to activate all the comments that I used to debug the OCR I would advise to make sure that the debug folder exists switch ( type ) { case WindowType . Gap : //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 165 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\treshold_\" + id + \".png\"); outputBitmap = Resize ( outputBitmap , 2 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\resize_\" + id + \".png\"); outputBitmap = Dilatation ( outputBitmap , 1 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\Final_dilatation_\" + id + \".png\"); break ; case WindowType . Sector : //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = VanishOxyAction ( outputBitmap ); //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\vanish_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 150 ); //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\Final_treshold_\" + id + \".png\"); break ; case WindowType . LapTime : //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 185 ); //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\Treshold_\" + id + \".png\"); outputBitmap = SobelEdgeDetection ( outputBitmap ); //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\SobelDetection_\" + id + \".png\"); break ; case WindowType . Text : //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 165 ); //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @\"\\Final_treshold_\" + id + \".png\"); break ; case WindowType . Tyre : //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = RemoveUseless ( outputBitmap ); //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\uselessRemoved_\" + id + \".png\"); outputBitmap = Dilatation ( outputBitmap , 1 ); //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\Final_dilatation_\" + id + \".png\"); break ; default : outputBitmap = Tresholding ( outputBitmap , 165 ); outputBitmap = Resize ( outputBitmap , 2 ); outputBitmap = Erode ( outputBitmap , 1 ); break ; } return outputBitmap ; } /// /// Method that convert a colored RGB bitmap into a GrayScale image /// /// The Bitmap you want to convert /// The bitmap in grayscale public static Bitmap Grayscale ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); //This is not a proper treshold method but it is helping the sobel edge detection if ( gray <= F1TV_BACKGROUND_TRESHOLD . R ) { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } else { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) gray ; } } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that uses the Sobel Edge detection to outline the edges of the characters to help with the OCR /// /// The image with the sobel edge detection used /// private Bitmap SobelEdgeDetection ( Bitmap grayscaleImage ) { // Create a new bitmap for the edges Bitmap edgesImage = new Bitmap ( grayscaleImage . Width , grayscaleImage . Height ); // Define the Sobel operators // Its just a matrix that we will use on the all image int [,] sobelX = { { - 1 , 0 , 1 }, { - 2 , 0 , 2 }, { - 1 , 0 , 1 } }; int [,] sobelY = { { - 1 , - 2 , - 1 }, { 0 , 0 , 0 }, { 1 , 2 , 1 } }; // Apply the Sobel operators and normalize the gradients // NOTE: I dont know how easy or hard it would be to make this paralel but it could be a good idea to do so if possible. for ( int y = 1 ; y < grayscaleImage . Height - 1 ; y ++) { for ( int x = 1 ; x < grayscaleImage . Width - 1 ; x ++) { int gradientX = CalculateGradient ( grayscaleImage , sobelX , x , y ); int gradientY = CalculateGradient ( grayscaleImage , sobelY , x , y ); int gradient = ( int ) Math . Sqrt ( gradientX * gradientX + gradientY * gradientY ); // Normalize the gradient value // In some rare cases the value can exceed 255 so we limit it with the Math.Min method gradient = Math . Min ( 255 , Math . Max ( 0 , gradient )); edgesImage . SetPixel ( x , y , Color . FromArgb ( gradient , gradient , gradient )); } } return edgesImage ; } /// /// Method that's here to be used by the sobel edge detection method (Chat GPT has been used for parts of this method) /// /// The input image with the grayscale processing already done /// The matrix to apply /// /// /// Returns the processed gradient private int CalculateGradient ( Bitmap grayscaleImage , int [,] sobelOperator , int x , int y ) { int gradient = 0 ; for ( int j = - 1 ; j <= 1 ; j ++) { for ( int i = - 1 ; i <= 1 ; i ++) { int pixelX = grayscaleImage . GetPixel ( x + i , y + j ). R ; gradient += sobelOperator [ j + 1 , i + 1 ] * pixelX ; } } return gradient ; } /// /// Method that is used to whiten an image. Ignore the funny name. Its used to prevent colored text to trouble the OCR when it uses grayscaling /// /// The bitmap to vanish /// public static Bitmap VanishOxyAction ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { //Note : MAKE THIS PARALELL OMG WY DID I LEFT IT LIKE THAT byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int blue = ( int ) pixel [ 0 ]; int green = ( int ) pixel [ 1 ]; int red = ( int ) pixel [ 2 ]; int max = Math . Max ( Math . Max ( blue , green ), red ); if ( max > 255 / 3 ) max = 255 ; pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) max ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that binaries the input image up to a certain treshold given /// /// the bitmap you want to convert to binary colors /// The floor at wich the color is considered as white or black /// The binarised bitmap public static Bitmap Tresholding ( Bitmap inputBitmap , int threshold ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); int bmpHeight = inputBitmap . Height ; int bmpWidth = inputBitmap . Width ; Parallel . For ( 0 , bmpHeight , y => { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmpWidth ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); int value = gray < threshold ? 0 : 255 ; pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) value ; } }); } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that removes the pixels that are flagged as background /// /// The bitmap you want to remove the background from /// The Bitmap without the background public static Bitmap RemoveBG ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R <= F1TV_BACKGROUND_TRESHOLD . R && G <= F1TV_BACKGROUND_TRESHOLD . G && B <= F1TV_BACKGROUND_TRESHOLD . B ) pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that removes all the useless things from the image and returns hopefully only the numbers /// /// The bitmap you want to remove useless things from (Expects a cropped part of the TyreWindow) /// The bitmap with (hopefully) only the digits public unsafe static Bitmap RemoveUseless ( Bitmap inputBitmap ) { //Note you can use something else than a cropped tyre window but I would recommend checking the code first to see if it fits your intended use Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); List < int > pixelsToRemove = new List < int >(); bool fromBorder = true ; for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( fromBorder && B < F1TV_BACKGROUND_TRESHOLD . B && G < F1TV_BACKGROUND_TRESHOLD . G && R < F1TV_BACKGROUND_TRESHOLD . R ) { pixelsToRemove . Add ( x ); } else { if ( fromBorder ) { fromBorder = false ; pixelsToRemove . Add ( x ); } } } fromBorder = true ; for ( int x = inputBitmap . Width - 1 ; x > 0 ; x --) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( fromBorder && B < F1TV_BACKGROUND_TRESHOLD . B && G < F1TV_BACKGROUND_TRESHOLD . G && R < F1TV_BACKGROUND_TRESHOLD . R ) { pixelsToRemove . Add ( x ); } else { if ( fromBorder ) { fromBorder = false ; pixelsToRemove . Add ( x ); } } } foreach ( int pxPos in pixelsToRemove ) { byte * pixel = currentLine + ( pxPos * bytesPerPixel ); pixel [ 0 ] = 0 xFF ; pixel [ 1 ] = 0 xFF ; pixel [ 2 ] = 0 xFF ; } } //Removing the color parts for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R >= F1TV_BACKGROUND_TRESHOLD . R + 25 || G >= F1TV_BACKGROUND_TRESHOLD . G + 25 || B >= F1TV_BACKGROUND_TRESHOLD . B + 25 ) { pixel [ 0 ] = 0 xFF ; pixel [ 1 ] = 0 xFF ; pixel [ 2 ] = 0 xFF ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Recovers the average colors from the Image. NOTE : It wont take in account colors that are lower than the background /// /// The bitmap you want to get the average color from /// The average color of the bitmap public static Color GetAvgColorFromBitmap ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; int totR = 0 ; int totG = 0 ; int totB = 0 ; int totPixels = 1 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); int bmpHeight = inputBitmap . Height ; int bmpWidth = inputBitmap . Width ; Parallel . For ( 0 , bmpHeight , y => { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmpWidth ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R >= F1TV_BACKGROUND_TRESHOLD . R || G >= F1TV_BACKGROUND_TRESHOLD . G || B >= F1TV_BACKGROUND_TRESHOLD . B ) { totPixels ++; totB += pixel [ 0 ]; totG += pixel [ 1 ]; totR += pixel [ 2 ]; } } }); } inputBitmap . UnlockBits ( bmpData ); return Color . FromArgb ( 255 , Math . Min ( Convert . ToInt32 (( float ) totR / ( float ) totPixels ), 255 ), Math . Min ( Convert . ToInt32 (( float ) totG / ( float ) totPixels ), 255 ), Math . Min ( Convert . ToInt32 (( float ) totB / ( float ) totPixels ), 255 )); } /// /// This method simply inverts all the colors in a Bitmap /// /// the bitmap you want to invert the colors from /// The bitmap with inverted colors public static Bitmap InvertColors ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); pixel [ 0 ] = ( byte )( 255 - pixel [ 0 ]); pixel [ 1 ] = ( byte )( 255 - pixel [ 1 ]); pixel [ 2 ] = ( byte )( 255 - pixel [ 2 ]); } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Methods that applies Bicubic interpolation to increase the size and resolution of an image /// /// The bitmap you want to resize /// The factor of resizing you want to use. I recommend using even numbers /// The bitmap witht the new size public static Bitmap Resize ( Bitmap inputBitmap , int resizeFactor ) { var resultBitmap = new Bitmap ( inputBitmap . Width * resizeFactor , inputBitmap . Height * resizeFactor ); using ( var graphics = Graphics . FromImage ( resultBitmap )) { graphics . InterpolationMode = InterpolationMode . HighQualityBicubic ; graphics . DrawImage ( inputBitmap , new Rectangle ( 0 , 0 , resultBitmap . Width , resultBitmap . Height )); } return resultBitmap ; } /// /// method that Highlights the countours of a Bitmap /// /// The bitmap you want to highlight the countours of /// The bitmap with countours highlighted public static Bitmap HighlightContours ( Bitmap inputBitmap ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); Bitmap grayscale = Grayscale ( inputBitmap ); Bitmap thresholded = Tresholding ( grayscale , 128 ); Bitmap dilated = Dilatation ( thresholded , 3 ); Bitmap eroded = Erode ( dilated , 3 ); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { for ( int x = 0 ; x < inputBitmap . Width ; x ++) { Color pixel = inputBitmap . GetPixel ( x , y ); Color dilatedPixel = dilated . GetPixel ( x , y ); Color erodedPixel = eroded . GetPixel ( x , y ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); int threshold = dilatedPixel . R ; if ( gray > threshold ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } else if ( gray <= threshold && erodedPixel . R == 0 ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 0 , 0 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } } } return outputBitmap ; } /// /// Method that that erodes the morphology of a bitmap /// /// The bitmap you want to erode /// The amount of Erosion you want (be carefull its expensive on ressources) /// The Bitmap with the eroded contents public static Bitmap Erode ( Bitmap inputBitmap , int kernelSize ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); int [,] kernel = new int [ kernelSize , kernelSize ]; for ( int i = 0 ; i < kernelSize ; i ++) { for ( int j = 0 ; j < kernelSize ; j ++) { kernel [ i , j ] = 1 ; } } for ( int y = kernelSize / 2 ; y < inputBitmap . Height - kernelSize / 2 ; y ++) { for ( int x = kernelSize / 2 ; x < inputBitmap . Width - kernelSize / 2 ; x ++) { bool flag = true ; for ( int i = - kernelSize / 2 ; i <= kernelSize / 2 ; i ++) { for ( int j = - kernelSize / 2 ; j <= kernelSize / 2 ; j ++) { Color pixel = inputBitmap . GetPixel ( x + i , y + j ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); if ( gray >= 128 && kernel [ i + kernelSize / 2 , j + kernelSize / 2 ] == 1 ) { flag = false ; break ; } } if (! flag ) { break ; } } if ( flag ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } } } return outputBitmap ; } /// /// Method that that use dilatation of the morphology of a bitmap /// /// The bitmap you want to use dilatation on /// The amount of dilatation you want (be carefull its expensive on ressources) /// The Bitmap after Dilatation public static Bitmap Dilatation ( Bitmap inputBitmap , int kernelSize ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); int [,] kernel = new int [ kernelSize , kernelSize ]; for ( int i = 0 ; i < kernelSize ; i ++) { for ( int j = 0 ; j < kernelSize ; j ++) { kernel [ i , j ] = 1 ; } } for ( int y = kernelSize / 2 ; y < inputBitmap . Height - kernelSize / 2 ; y ++) { for ( int x = kernelSize / 2 ; x < inputBitmap . Width - kernelSize / 2 ; x ++) { bool flag = false ; for ( int i = - kernelSize / 2 ; i <= kernelSize / 2 ; i ++) { for ( int j = - kernelSize / 2 ; j <= kernelSize / 2 ; j ++) { Color pixel = inputBitmap . GetPixel ( x + i , y + j ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); if ( gray < 128 && kernel [ i + kernelSize / 2 , j + kernelSize / 2 ] == 1 ) { flag = true ; break ; } } if ( flag ) { break ; } } if ( flag ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } } } return outputBitmap ; } } }","title":"OcrImage.cs"},{"location":"Code/Reader.html","text":"Reader.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Reader.cs /// Brief : Class used to Read the config file for the OCR /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; using System.Windows.Forms ; using System.IO ; using System.Text.Json ; namespace TrackTrends { public class Reader { const int NUMBER_OF_DRIVERS = 20 ; public List < string > Drivers ; public List < Zone > MainZones ; private SqliteStorage _storage ; private List < DriverData >[] DriverDataLogs = new List < DriverData >[ NUMBER_OF_DRIVERS ]; private int [] DriverLaps = new int [ NUMBER_OF_DRIVERS ]; public SqliteStorage Storage { get => _storage ; private set => _storage = value ; } public Reader ( string configFile , Bitmap image , bool loadOCR = true ) { Storage = new SqliteStorage (); MainZones = Load ( image , configFile , ref Drivers , loadOCR ); } /// /// Method that reads the JSON config file and create all the Zones and Windows /// /// The image #id on wich you want to create the zones on public List < Zone > Load ( Bitmap image , string configFilePath , ref List < string > driverListToFill , bool LoadOCR ) { // Note : You may wonder why in the H... I have all the zones and windows stored in a JSON file and not just for example the first and the last // Its because they are not perfectly aligned to each others and every zone has his own alignement to the main image List < Zone > mainZones = new List < Zone >(); Bitmap fullImage = image ; Zone mainZone ; for ( int i = 0 ; i < NUMBER_OF_DRIVERS ; i ++) { DriverDataLogs [ i ] = new List < DriverData >(); DriverLaps [ i ] = 0 ; } try { string jsonString = File . ReadAllText ( configFilePath ); JsonDocument document = JsonDocument . Parse ( jsonString ); JsonElement root = document . RootElement ; mainZones = new List < Zone >(); driverListToFill = new List < string >(); JsonElement main = root . GetProperty ( \"Main\" ); int x = main . GetProperty ( \"x\" ). GetInt32 (); int y = main . GetProperty ( \"y\" ). GetInt32 (); int width = main . GetProperty ( \"width\" ). GetInt32 (); int height = main . GetProperty ( \"height\" ). GetInt32 (); mainZone = new Zone ( fullImage , new Rectangle ( x , y , width , height ), \"Main\" ); mainZone . ResetWindows (); mainZone . ResetZones (); JsonElement driverZones = main . GetProperty ( \"DriverZones\" ); foreach ( JsonElement driverZoneElement in driverZones . EnumerateArray ()) { string name = driverZoneElement . GetProperty ( \"name\" ). GetString (); int driverX = driverZoneElement . GetProperty ( \"x\" ). GetInt32 () + mainZone . Bounds . X ; int driverY = driverZoneElement . GetProperty ( \"y\" ). GetInt32 () + mainZone . Bounds . Y ; int driverWidth = driverZoneElement . GetProperty ( \"width\" ). GetInt32 (); int driverHeight = driverZoneElement . GetProperty ( \"height\" ). GetInt32 (); Zone driverZone = new Zone ( fullImage , new Rectangle ( driverX , driverY , driverWidth , driverHeight ), \"Driver\" ); JsonElement windowsElement = driverZoneElement . GetProperty ( \"Windows\" ); //string[] windowNames = new string[] { \"Position\",\"GapToLeader\",\"LapTime\",\"DRS\",\"Tyres\",\"Name\",\"Sector1\",\"Sector2\",\"Sector3\" }; foreach ( JsonElement windowElement in windowsElement . EnumerateArray ()) { //Position JsonElement posEl = windowElement . GetProperty ( \"Position\" ); DriverPositionWindow positionWindow = new DriverPositionWindow ( driverZone . ZoneImage , new Rectangle ( posEl . GetProperty ( \"x\" ). GetInt32 (), posEl . GetProperty ( \"y\" ). GetInt32 (), posEl . GetProperty ( \"width\" ). GetInt32 (), posEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //GapToLeader JsonElement gapEl = windowElement . GetProperty ( \"GapToLeader\" ); DriverGapToLeaderWindow gapWindow = new DriverGapToLeaderWindow ( driverZone . ZoneImage , new Rectangle ( gapEl . GetProperty ( \"x\" ). GetInt32 (), gapEl . GetProperty ( \"y\" ). GetInt32 (), gapEl . GetProperty ( \"width\" ). GetInt32 (), gapEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //LapTime JsonElement lapEl = windowElement . GetProperty ( \"LapTime\" ); DriverLapTimeWindow lapWindow = new DriverLapTimeWindow ( driverZone . ZoneImage , new Rectangle ( lapEl . GetProperty ( \"x\" ). GetInt32 (), lapEl . GetProperty ( \"y\" ). GetInt32 (), lapEl . GetProperty ( \"width\" ). GetInt32 (), lapEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //DRS JsonElement drsEl = windowElement . GetProperty ( \"DRS\" ); DriverDrsWindow drsWindow = new DriverDrsWindow ( driverZone . ZoneImage , new Rectangle ( drsEl . GetProperty ( \"x\" ). GetInt32 (), drsEl . GetProperty ( \"y\" ). GetInt32 (), drsEl . GetProperty ( \"width\" ). GetInt32 (), drsEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Tyre JsonElement tyresEl = windowElement . GetProperty ( \"Tyres\" ); DriverTyresWindow tyreWindow = new DriverTyresWindow ( driverZone . ZoneImage , new Rectangle ( tyresEl . GetProperty ( \"x\" ). GetInt32 (), tyresEl . GetProperty ( \"y\" ). GetInt32 (), tyresEl . GetProperty ( \"width\" ). GetInt32 (), tyresEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Name JsonElement nameEl = windowElement . GetProperty ( \"Name\" ); DriverNameWindow nameWindow = new DriverNameWindow ( driverZone . ZoneImage , new Rectangle ( nameEl . GetProperty ( \"x\" ). GetInt32 (), nameEl . GetProperty ( \"y\" ). GetInt32 (), nameEl . GetProperty ( \"width\" ). GetInt32 (), nameEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Sector1 JsonElement sec1El = windowElement . GetProperty ( \"Sector1\" ); DriverSectorWindow sec1Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec1El . GetProperty ( \"x\" ). GetInt32 (), sec1El . GetProperty ( \"y\" ). GetInt32 (), sec1El . GetProperty ( \"width\" ). GetInt32 (), sec1El . GetProperty ( \"height\" ). GetInt32 ()), 1 , LoadOCR ); //Sector2 JsonElement sec2El = windowElement . GetProperty ( \"Sector2\" ); DriverSectorWindow sec2Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec2El . GetProperty ( \"x\" ). GetInt32 (), sec2El . GetProperty ( \"y\" ). GetInt32 (), sec2El . GetProperty ( \"width\" ). GetInt32 (), sec2El . GetProperty ( \"height\" ). GetInt32 ()), 2 , LoadOCR ); //Sector3 JsonElement sec3El = windowElement . GetProperty ( \"Sector3\" ); DriverSectorWindow sec3Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec3El . GetProperty ( \"x\" ). GetInt32 (), sec3El . GetProperty ( \"y\" ). GetInt32 (), sec3El . GetProperty ( \"width\" ). GetInt32 (), sec3El . GetProperty ( \"height\" ). GetInt32 ()), 3 , LoadOCR ); driverZone . AddWindow ( positionWindow ); driverZone . AddWindow ( gapWindow ); driverZone . AddWindow ( lapWindow ); driverZone . AddWindow ( drsWindow ); driverZone . AddWindow ( tyreWindow ); driverZone . AddWindow ( nameWindow ); driverZone . AddWindow ( sec1Window ); driverZone . AddWindow ( sec2Window ); driverZone . AddWindow ( sec3Window ); } mainZone . AddZone ( driverZone ); } JsonElement driversElement = main . GetProperty ( \"Drivers\" ); foreach ( JsonElement driverElement in driversElement . EnumerateArray ()) { string driverName = driverElement . GetString (); driverListToFill . Add ( driverName ); Storage . AddDriver ( driverName ); } mainZones . Add ( mainZone ); } catch ( IOException ex ) { MessageBox . Show ( \"Error reading JSON file: \" + ex . Message ); } catch ( JsonException ex ) { MessageBox . Show ( \"Invalid JSON format: \" + ex . Message ); } int driverID = 0 ; foreach ( Zone z in mainZones [ 0 ]. Zones ) { driverID ++; z . ZoneImage . Save ( \"LoadedDriver\" + driverID + \".png\" ); } return mainZones ; } /// /// Method that calls all the zones and windows to get the content they can find on the image to display them /// /// The id of the image we are working with /// a string representation of all the returns public List < DriverData > Decode ( List < Zone > mainZones , List < string > drivers ) { List < DriverData > mainResults = new List < DriverData >(); //Decode for ( int mainZoneId = 0 ; mainZoneId < mainZones . Count ; mainZoneId ++) { switch ( mainZoneId ) { case 0 : //object lockObject = new object(); //Main Zone Parallel . For ( 0 , mainZones [ mainZoneId ]. Zones . Count , async i => //for (int i = 0; i < mainZones[mainZoneId].Zones.Count; i++) { DriverData data = mainZones [ mainZoneId ]. Zones [ i ]. Decode ( new List < string >( drivers )); mainResults . Add ( data ); DriverDataLogs [ i ]. Add ( data ); if ( data . Position != - 1 && DriverDataLogs [ i ]. Count > 1 ) { //Tries to fix the tyres if ( data . CurrentTyre . NumberOfLaps > DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps + 3 ) data . CurrentTyre . NumberOfLaps = DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps + 1 ; //Checking if its a new lap //If the third sector is filled but it was'nt the last time, then it means that a new Lap has been started //Lap detection can be f***ed if the OCR takes so much time that an entire sector can be raced without us knowing. if ( DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Sector3 != 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Sector3 == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Position != - 1 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Position != - 1 ) { DriverData stats = new DriverData (); stats = DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]; DriverLaps [ i ]++; Storage . AddDriverStat ( stats , DriverLaps [ i ]); } //Checking if its a pitstop //Forget this the best way to know if a tyre has been changed is if the number of laps is zero if ( data . CurrentTyre . Coumpound != Tyre . Type . Undefined && data . CurrentTyre . NumberOfLaps == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps != 0 ) { Storage . AddPitstop ( data . Name , DriverLaps [ i ] - 1 , data . CurrentTyre . Coumpound . ToString ()); //Driver laps -1 because it would take AT LEAST one lap for this program to detect a pitstop } } DriverDataLogs [ i ]. Add ( data ); }); break ; //Next there could be a Title Zone and TrackInfoZone } } //mainResults = mainResults.OrderBy(driver => driver.Position >= 0).ThenBy(driver => driver.Position).ToList(); mainResults = mainResults . OrderBy ( driver => driver . Position ). ToList (); return mainResults ; } /// /// Changes the image in all of the zones wich then will do the same for theyre own subzones and windows /// /// The new Image from the F1TV data channel public void ChangeImage ( Bitmap Image ) { foreach ( Zone z in MainZones ) { z . Image = Image ; } } /// /// Method that can be used to convert an amount of miliseconds into a more readable human form /// /// The given amount of miliseconds ton convert /// A human readable string that represents the ms public static string ConvertMsToTime ( int amountOfMs ) { //Convert.ToInt32 would round upand I dont want that int minuts = ( int )(( float ) amountOfMs / ( 1000f * 60f )); int seconds = ( int )(( amountOfMs - ( minuts * 60f * 1000f )) / 1000 ); int ms = amountOfMs - (( minuts * 60 * 1000 ) + ( seconds * 1000 )); return minuts + \":\" + seconds . ToString ( \"00\" ) + \":\" + ms . ToString ( \"000\" ); } /// /// Old method that can draw on an image where the windows and zones are created. mostly used for debugging /// /// the #id of the image we are working with /// the drawed bitmap public Bitmap Draw ( Bitmap image , List < Zone > mainZones ) { Graphics g = Graphics . FromImage ( image ); foreach ( Zone z in mainZones ) { int count = 0 ; foreach ( Zone zz in z . Zones ) { g . DrawRectangle ( Pens . Red , z . Bounds ); foreach ( Window w in zz . Windows ) { g . DrawRectangle ( Pens . Blue , new Rectangle ( z . Bounds . X + zz . Bounds . X , z . Bounds . Y + zz . Bounds . Y , zz . Bounds . Width , zz . Bounds . Height )); } count ++; } } return image ; } } }","title":"Reader.cs"},{"location":"Code/Reader.html#readercs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Reader.cs /// Brief : Class used to Read the config file for the OCR /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; using System.Windows.Forms ; using System.IO ; using System.Text.Json ; namespace TrackTrends { public class Reader { const int NUMBER_OF_DRIVERS = 20 ; public List < string > Drivers ; public List < Zone > MainZones ; private SqliteStorage _storage ; private List < DriverData >[] DriverDataLogs = new List < DriverData >[ NUMBER_OF_DRIVERS ]; private int [] DriverLaps = new int [ NUMBER_OF_DRIVERS ]; public SqliteStorage Storage { get => _storage ; private set => _storage = value ; } public Reader ( string configFile , Bitmap image , bool loadOCR = true ) { Storage = new SqliteStorage (); MainZones = Load ( image , configFile , ref Drivers , loadOCR ); } /// /// Method that reads the JSON config file and create all the Zones and Windows /// /// The image #id on wich you want to create the zones on public List < Zone > Load ( Bitmap image , string configFilePath , ref List < string > driverListToFill , bool LoadOCR ) { // Note : You may wonder why in the H... I have all the zones and windows stored in a JSON file and not just for example the first and the last // Its because they are not perfectly aligned to each others and every zone has his own alignement to the main image List < Zone > mainZones = new List < Zone >(); Bitmap fullImage = image ; Zone mainZone ; for ( int i = 0 ; i < NUMBER_OF_DRIVERS ; i ++) { DriverDataLogs [ i ] = new List < DriverData >(); DriverLaps [ i ] = 0 ; } try { string jsonString = File . ReadAllText ( configFilePath ); JsonDocument document = JsonDocument . Parse ( jsonString ); JsonElement root = document . RootElement ; mainZones = new List < Zone >(); driverListToFill = new List < string >(); JsonElement main = root . GetProperty ( \"Main\" ); int x = main . GetProperty ( \"x\" ). GetInt32 (); int y = main . GetProperty ( \"y\" ). GetInt32 (); int width = main . GetProperty ( \"width\" ). GetInt32 (); int height = main . GetProperty ( \"height\" ). GetInt32 (); mainZone = new Zone ( fullImage , new Rectangle ( x , y , width , height ), \"Main\" ); mainZone . ResetWindows (); mainZone . ResetZones (); JsonElement driverZones = main . GetProperty ( \"DriverZones\" ); foreach ( JsonElement driverZoneElement in driverZones . EnumerateArray ()) { string name = driverZoneElement . GetProperty ( \"name\" ). GetString (); int driverX = driverZoneElement . GetProperty ( \"x\" ). GetInt32 () + mainZone . Bounds . X ; int driverY = driverZoneElement . GetProperty ( \"y\" ). GetInt32 () + mainZone . Bounds . Y ; int driverWidth = driverZoneElement . GetProperty ( \"width\" ). GetInt32 (); int driverHeight = driverZoneElement . GetProperty ( \"height\" ). GetInt32 (); Zone driverZone = new Zone ( fullImage , new Rectangle ( driverX , driverY , driverWidth , driverHeight ), \"Driver\" ); JsonElement windowsElement = driverZoneElement . GetProperty ( \"Windows\" ); //string[] windowNames = new string[] { \"Position\",\"GapToLeader\",\"LapTime\",\"DRS\",\"Tyres\",\"Name\",\"Sector1\",\"Sector2\",\"Sector3\" }; foreach ( JsonElement windowElement in windowsElement . EnumerateArray ()) { //Position JsonElement posEl = windowElement . GetProperty ( \"Position\" ); DriverPositionWindow positionWindow = new DriverPositionWindow ( driverZone . ZoneImage , new Rectangle ( posEl . GetProperty ( \"x\" ). GetInt32 (), posEl . GetProperty ( \"y\" ). GetInt32 (), posEl . GetProperty ( \"width\" ). GetInt32 (), posEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //GapToLeader JsonElement gapEl = windowElement . GetProperty ( \"GapToLeader\" ); DriverGapToLeaderWindow gapWindow = new DriverGapToLeaderWindow ( driverZone . ZoneImage , new Rectangle ( gapEl . GetProperty ( \"x\" ). GetInt32 (), gapEl . GetProperty ( \"y\" ). GetInt32 (), gapEl . GetProperty ( \"width\" ). GetInt32 (), gapEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //LapTime JsonElement lapEl = windowElement . GetProperty ( \"LapTime\" ); DriverLapTimeWindow lapWindow = new DriverLapTimeWindow ( driverZone . ZoneImage , new Rectangle ( lapEl . GetProperty ( \"x\" ). GetInt32 (), lapEl . GetProperty ( \"y\" ). GetInt32 (), lapEl . GetProperty ( \"width\" ). GetInt32 (), lapEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //DRS JsonElement drsEl = windowElement . GetProperty ( \"DRS\" ); DriverDrsWindow drsWindow = new DriverDrsWindow ( driverZone . ZoneImage , new Rectangle ( drsEl . GetProperty ( \"x\" ). GetInt32 (), drsEl . GetProperty ( \"y\" ). GetInt32 (), drsEl . GetProperty ( \"width\" ). GetInt32 (), drsEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Tyre JsonElement tyresEl = windowElement . GetProperty ( \"Tyres\" ); DriverTyresWindow tyreWindow = new DriverTyresWindow ( driverZone . ZoneImage , new Rectangle ( tyresEl . GetProperty ( \"x\" ). GetInt32 (), tyresEl . GetProperty ( \"y\" ). GetInt32 (), tyresEl . GetProperty ( \"width\" ). GetInt32 (), tyresEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Name JsonElement nameEl = windowElement . GetProperty ( \"Name\" ); DriverNameWindow nameWindow = new DriverNameWindow ( driverZone . ZoneImage , new Rectangle ( nameEl . GetProperty ( \"x\" ). GetInt32 (), nameEl . GetProperty ( \"y\" ). GetInt32 (), nameEl . GetProperty ( \"width\" ). GetInt32 (), nameEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Sector1 JsonElement sec1El = windowElement . GetProperty ( \"Sector1\" ); DriverSectorWindow sec1Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec1El . GetProperty ( \"x\" ). GetInt32 (), sec1El . GetProperty ( \"y\" ). GetInt32 (), sec1El . GetProperty ( \"width\" ). GetInt32 (), sec1El . GetProperty ( \"height\" ). GetInt32 ()), 1 , LoadOCR ); //Sector2 JsonElement sec2El = windowElement . GetProperty ( \"Sector2\" ); DriverSectorWindow sec2Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec2El . GetProperty ( \"x\" ). GetInt32 (), sec2El . GetProperty ( \"y\" ). GetInt32 (), sec2El . GetProperty ( \"width\" ). GetInt32 (), sec2El . GetProperty ( \"height\" ). GetInt32 ()), 2 , LoadOCR ); //Sector3 JsonElement sec3El = windowElement . GetProperty ( \"Sector3\" ); DriverSectorWindow sec3Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec3El . GetProperty ( \"x\" ). GetInt32 (), sec3El . GetProperty ( \"y\" ). GetInt32 (), sec3El . GetProperty ( \"width\" ). GetInt32 (), sec3El . GetProperty ( \"height\" ). GetInt32 ()), 3 , LoadOCR ); driverZone . AddWindow ( positionWindow ); driverZone . AddWindow ( gapWindow ); driverZone . AddWindow ( lapWindow ); driverZone . AddWindow ( drsWindow ); driverZone . AddWindow ( tyreWindow ); driverZone . AddWindow ( nameWindow ); driverZone . AddWindow ( sec1Window ); driverZone . AddWindow ( sec2Window ); driverZone . AddWindow ( sec3Window ); } mainZone . AddZone ( driverZone ); } JsonElement driversElement = main . GetProperty ( \"Drivers\" ); foreach ( JsonElement driverElement in driversElement . EnumerateArray ()) { string driverName = driverElement . GetString (); driverListToFill . Add ( driverName ); Storage . AddDriver ( driverName ); } mainZones . Add ( mainZone ); } catch ( IOException ex ) { MessageBox . Show ( \"Error reading JSON file: \" + ex . Message ); } catch ( JsonException ex ) { MessageBox . Show ( \"Invalid JSON format: \" + ex . Message ); } int driverID = 0 ; foreach ( Zone z in mainZones [ 0 ]. Zones ) { driverID ++; z . ZoneImage . Save ( \"LoadedDriver\" + driverID + \".png\" ); } return mainZones ; } /// /// Method that calls all the zones and windows to get the content they can find on the image to display them /// /// The id of the image we are working with /// a string representation of all the returns public List < DriverData > Decode ( List < Zone > mainZones , List < string > drivers ) { List < DriverData > mainResults = new List < DriverData >(); //Decode for ( int mainZoneId = 0 ; mainZoneId < mainZones . Count ; mainZoneId ++) { switch ( mainZoneId ) { case 0 : //object lockObject = new object(); //Main Zone Parallel . For ( 0 , mainZones [ mainZoneId ]. Zones . Count , async i => //for (int i = 0; i < mainZones[mainZoneId].Zones.Count; i++) { DriverData data = mainZones [ mainZoneId ]. Zones [ i ]. Decode ( new List < string >( drivers )); mainResults . Add ( data ); DriverDataLogs [ i ]. Add ( data ); if ( data . Position != - 1 && DriverDataLogs [ i ]. Count > 1 ) { //Tries to fix the tyres if ( data . CurrentTyre . NumberOfLaps > DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps + 3 ) data . CurrentTyre . NumberOfLaps = DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps + 1 ; //Checking if its a new lap //If the third sector is filled but it was'nt the last time, then it means that a new Lap has been started //Lap detection can be f***ed if the OCR takes so much time that an entire sector can be raced without us knowing. if ( DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Sector3 != 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Sector3 == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Position != - 1 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Position != - 1 ) { DriverData stats = new DriverData (); stats = DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]; DriverLaps [ i ]++; Storage . AddDriverStat ( stats , DriverLaps [ i ]); } //Checking if its a pitstop //Forget this the best way to know if a tyre has been changed is if the number of laps is zero if ( data . CurrentTyre . Coumpound != Tyre . Type . Undefined && data . CurrentTyre . NumberOfLaps == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps != 0 ) { Storage . AddPitstop ( data . Name , DriverLaps [ i ] - 1 , data . CurrentTyre . Coumpound . ToString ()); //Driver laps -1 because it would take AT LEAST one lap for this program to detect a pitstop } } DriverDataLogs [ i ]. Add ( data ); }); break ; //Next there could be a Title Zone and TrackInfoZone } } //mainResults = mainResults.OrderBy(driver => driver.Position >= 0).ThenBy(driver => driver.Position).ToList(); mainResults = mainResults . OrderBy ( driver => driver . Position ). ToList (); return mainResults ; } /// /// Changes the image in all of the zones wich then will do the same for theyre own subzones and windows /// /// The new Image from the F1TV data channel public void ChangeImage ( Bitmap Image ) { foreach ( Zone z in MainZones ) { z . Image = Image ; } } /// /// Method that can be used to convert an amount of miliseconds into a more readable human form /// /// The given amount of miliseconds ton convert /// A human readable string that represents the ms public static string ConvertMsToTime ( int amountOfMs ) { //Convert.ToInt32 would round upand I dont want that int minuts = ( int )(( float ) amountOfMs / ( 1000f * 60f )); int seconds = ( int )(( amountOfMs - ( minuts * 60f * 1000f )) / 1000 ); int ms = amountOfMs - (( minuts * 60 * 1000 ) + ( seconds * 1000 )); return minuts + \":\" + seconds . ToString ( \"00\" ) + \":\" + ms . ToString ( \"000\" ); } /// /// Old method that can draw on an image where the windows and zones are created. mostly used for debugging /// /// the #id of the image we are working with /// the drawed bitmap public Bitmap Draw ( Bitmap image , List < Zone > mainZones ) { Graphics g = Graphics . FromImage ( image ); foreach ( Zone z in mainZones ) { int count = 0 ; foreach ( Zone zz in z . Zones ) { g . DrawRectangle ( Pens . Red , z . Bounds ); foreach ( Window w in zz . Windows ) { g . DrawRectangle ( Pens . Blue , new Rectangle ( z . Bounds . X + zz . Bounds . X , z . Bounds . Y + zz . Bounds . Y , zz . Bounds . Width , zz . Bounds . Height )); } count ++; } } return image ; } } }","title":"Reader.cs"},{"location":"Code/Settings.html","text":"Settings.cs using System ; using System.Collections.Generic ; using System.ComponentModel ; using System.Data ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.IO ; using TrackTrends ; namespace TrackTrends { public partial class Settings : Form { private string _grandPrixUrl = \"\" ; private string _selectedConfigFile ; private List < string > _driverList = new List < string >(); private F1TVEmulator Emulator = null ; private ConfigurationTool Config = null ; private bool CreatingZone = false ; private Point ZoneP1 ; private Point ZoneP2 ; private bool CreatingWindow = false ; private Point WindowP1 ; private Point WindowP2 ; List < Rectangle > WindowsToAdd = new List < Rectangle >(); public string GrandPrixUrl { get => _grandPrixUrl ; private set => _grandPrixUrl = value ; } public List < string > DriverList { get => _driverList ; private set => _driverList = value ; } public string SelectedConfigFile { get => _selectedConfigFile ; private set => _selectedConfigFile = value ; } //For the responsive content Size oldSize = new Size (); Size oldGpbxPreviewSize = new Size (); Size oldGpbxWindowPreviewSize = new Size (); Size oldPbxPreviewSize = new Size (); Size oldPbxWindowPreviewSize = new Size (); public Settings () { InitializeComponent (); Load (); } private void Load () { RefreshUI (); oldSize = this . Size ; oldGpbxPreviewSize = gpbxPreview . Size ; oldGpbxWindowPreviewSize = gpbxWindowPreview . Size ; oldPbxPreviewSize = pbxPreview . Size ; oldPbxWindowPreviewSize = pbxWindowPreview . Size ; tip1 . SetToolTip ( btnCreatZone , \"After clicking you can select two points in the image to set the bounds of the important data\" ); tip1 . SetToolTip ( btnCreateWindow , \"After clicking this you will have to select all the windows that are important on the lower image. Refer to the documentation for more infos\" ); tip1 . SetToolTip ( btnRefresh , \"Starts the emulator or refreshes the images if its already running\" ); tip1 . SetToolTip ( btnResetDriver , \"Resets the driver if something went wrong or if you want to test an other URL\" ); tip1 . SetToolTip ( lsbDrivers , \"The drivers that are on the image. Non-Case sensitive\" ); tip1 . SetToolTip ( tbxPresetName , \"The name of the preset you want to save\" ); tip1 . SetToolTip ( pbxPreview , \"What the emulator returns\" ); tip1 . SetToolTip ( pbxWindowPreview , \"One of the driver zones that the program managed to slice from the main zone\" ); } private void RefreshUI () { lsbDrivers . DataSource = null ; lsbDrivers . DataSource = DriverList ; if ( Directory . Exists ( ConfigurationTool . CONFIGS_FOLDER_NAME )) { lsbPresets . DataSource = null ; lsbPresets . DataSource = Directory . GetFiles ( ConfigurationTool . CONFIGS_FOLDER_NAME ); } if ( CreatingZone ) { if ( ZoneP1 == new Point (- 1 , - 1 )) { lblZonePointsRemaning . Text = \"2 points Remaining\" ; } else { lblZonePointsRemaning . Text = \"1 point Remaining\" ; } } else { lblZonePointsRemaning . Text = \"\" ; } if ( CreatingWindow ) { if ( WindowP1 == new Point (- 1 , - 1 )) { lblWindowPointsRemaining . Text = \"2 points Remaining\" ; } else { lblWindowPointsRemaining . Text = \"1 point Remaining\" ; } lblWindowPointsRemaining . Text = ConfigurationTool . NUMBER_OF_ZONES - WindowsToAdd . Count () + \" Windows remaining\" ; } else { lblWindowPointsRemaining . Text = \"\" ; lblWindowsRemaining . Text = \"\" ; } if ( Config != null ) { pbxPreview . Image = Config . MainZone . Draw (); if ( Config . MainZone . Zones . Count > 0 ) pbxWindowPreview . Image = Config . MainZone . Zones [ 0 ]. Draw (); } } private void CreateNewZone ( Point p1 , Point p2 ) { Rectangle dimensions = CreateAbsoluteRectangle ( p1 , p2 ); Config = new ConfigurationTool (( Bitmap ) pbxPreview . Image , dimensions ); RefreshUI (); } private void CreateWindows ( List < Rectangle > dimensions ) { if ( Config != null ) { Config . AddWindows ( dimensions ); } } private void tbxGpUrl_TextChanged ( object sender , EventArgs e ) { GrandPrixUrl = tbxGpUrl . Text ; } private void btnAddDriver_Click ( object sender , EventArgs e ) { string newDriver = tbxDriverName . Text ; DriverList . Add ( newDriver ); tbxDriverName . Text = \"\" ; RefreshUI (); } private void btnRemoveDriver_Click ( object sender , EventArgs e ) { if ( lsbDrivers . SelectedIndex >= 0 ) { DriverList . RemoveAt ( lsbDrivers . SelectedIndex ); } RefreshUI (); } private void SwitchZoneCreation () { if ( CreatingZone ) { CreatingZone = false ; lblZonePointsRemaning . Text = \"\" ; } else { CreatingZone = true ; if ( Config != null ) Config . ResetMainZone (); if ( CreatingWindow ) SwitchWindowCreation (); if ( Emulator != null && Emulator . Ready ) { Config = null ; pbxPreview . Image = Emulator . Screenshot (); } ZoneP1 = new Point (- 1 , - 1 ); ZoneP2 = new Point (- 1 , - 1 ); lblZonePointsRemaning . Text = \"2 Points left\" ; } RefreshUI (); } private void SwitchWindowCreation () { if ( CreatingWindow ) { CreatingWindow = false ; } else { CreatingWindow = true ; if ( Config != null ) Config . ResetWindows (); if ( CreatingZone ) SwitchZoneCreation (); WindowP1 = new Point (- 1 , - 1 ); WindowP2 = new Point (- 1 , - 1 ); WindowsToAdd = new List < Rectangle >(); } RefreshUI (); } private void btnCreatZone_Click ( object sender , EventArgs e ) { SwitchZoneCreation (); } private void btnCreateWindow_Click ( object sender , EventArgs e ) { SwitchWindowCreation (); } private void pbxMain_MouseClick ( object sender , MouseEventArgs e ) { if ( CreatingZone && pbxPreview . Image != null ) { //Point coordinates = pbxMain.PointToClient(new Point(MousePosition.X, MousePosition.Y)); Point coordinates = e . Location ; float xOffset = ( float ) pbxPreview . Image . Width / ( float ) pbxPreview . Width ; float yOffset = ( float ) pbxPreview . Image . Height / ( float ) pbxPreview . Height ; Point newPoint = new Point ( Convert . ToInt32 (( float ) coordinates . X * xOffset ), Convert . ToInt32 (( float ) coordinates . Y * yOffset )); //MessageBox.Show(\"Coordinates\" + Environment.NewLine + \"Old : \" + coordinates.ToString() + Environment.NewLine + \"New : \" + newPoint.ToString()); if ( ZoneP1 == new Point (- 1 , - 1 )) { ZoneP1 = newPoint ; } else { ZoneP2 = newPoint ; CreateNewZone ( ZoneP1 , ZoneP2 ); SwitchZoneCreation (); } RefreshUI (); } } private void pbxMain_Click ( object sender , EventArgs e ) { //Not the right one to use visibly } private void pbxDriverZone_MouseClick ( object sender , MouseEventArgs e ) { if ( CreatingWindow && pbxWindowPreview . Image != null ) { Point coordinates = e . Location ; float xOffset = ( float ) pbxWindowPreview . Image . Width / ( float ) pbxWindowPreview . Width ; float yOffset = ( float ) pbxWindowPreview . Image . Height / ( float ) pbxWindowPreview . Height ; Point newPoint = new Point ( Convert . ToInt32 (( float ) coordinates . X * xOffset ), Convert . ToInt32 (( float ) coordinates . Y * yOffset )); if ( WindowP1 == new Point (- 1 , - 1 )) { WindowP1 = newPoint ; } else { WindowP2 = newPoint ; WindowsToAdd . Add ( CreateAbsoluteRectangle ( WindowP1 , WindowP2 )); if ( WindowsToAdd . Count < ConfigurationTool . NUMBER_OF_ZONES ) { WindowP1 = new Point (- 1 , - 1 ); WindowP2 = new Point (- 1 , - 1 ); } else { WindowP1 = new Point ( WindowP1 . X , 0 ); WindowP2 = new Point ( WindowP2 . X , pbxWindowPreview . Image . Height ); CreateWindows ( WindowsToAdd ); SwitchWindowCreation (); } } RefreshUI (); } } private void pbxDriverZone_Click ( object sender , EventArgs e ) { //Not the right one to use visibly } private Rectangle CreateAbsoluteRectangle ( Point p1 , Point p2 ) { Point newP1 = new Point (); Point newP2 = new Point (); if ( p1 . X < p2 . X ) { newP1 . X = p1 . X ; newP2 . X = p2 . X ; } else { newP1 . X = p2 . X ; newP2 . X = p1 . X ; } if ( p1 . Y < p2 . Y ) { newP1 . Y = p1 . Y ; newP2 . Y = p2 . Y ; } else { newP1 . Y = p2 . Y ; newP2 . Y = p1 . Y ; } return new Rectangle ( newP1 . X , newP1 . Y , newP2 . X - newP1 . X , newP2 . Y - newP1 . Y ); } private async void btnRefresh_Click ( object sender , EventArgs e ) { btnRefresh . Enabled = false ; btnCreatZone . Enabled = false ; btnCreateWindow . Enabled = false ; btnResetDriver . Enabled = false ; if ( Emulator == null || Emulator . GrandPrixUrl != tbxGpUrl . Text ) { Emulator = new F1TVEmulator ( tbxGpUrl . Text ); } if (! Emulator . Ready ) { Task < int > start = Task . Run (() => Emulator . Start ()); int errorCode = await start ; if ( errorCode != 0 ) { string message ; switch ( errorCode ) { case 100 : message = \"Error \" + errorCode + \" Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again\" ; break ; case 101 : message = \"Error \" + errorCode + \" Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again\" ; break ; case 102 : message = \"Error \" + errorCode + \" Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update\" ; break ; case 103 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 104 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 105 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; case 106 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; default : message = \"Could not start the emulator Error \" + errorCode ; break ; } MessageBox . Show ( message ); } else { pbxPreview . Image = Emulator . Screenshot (); } } else { pbxPreview . Image = Emulator . Screenshot (); } btnRefresh . Enabled = true ; btnCreatZone . Enabled = true ; btnCreateWindow . Enabled = true ; btnResetDriver . Enabled = true ; btnRefresh . Text = \"Get a newer image\" ; } private void Settings_FormClosing ( object sender , FormClosingEventArgs e ) { if ( Emulator != null ) { Emulator . Stop (); } Emulator = null ; GC . Collect (); } private void btnResetDriver_Click ( object sender , EventArgs e ) { if ( Emulator != null ) { Emulator . ResetDriver (); } } private void btnSavePreset_Click ( object sender , EventArgs e ) { string presetName = tbxPresetName . Text ; if ( Config != null ) { Config . SaveToJson ( DriverList , presetName ); } RefreshUI (); } private void lsbPresets_SelectedIndexChanged ( object sender , EventArgs e ) { SelectedConfigFile = ( string ) lsbPresets . Items [ lsbPresets . SelectedIndex ]; } private void btnLoadPreset_Click ( object sender , EventArgs e ) { //MessageBox.Show(lsbPresets.SelectedIndex.ToString()); if ( lsbPresets . SelectedIndex >= 0 && pbxPreview . Image != null ) { try { string fileName = lsbPresets . Items [ lsbPresets . SelectedIndex ]. ToString (); Reader reader = new Reader ( fileName , ( Bitmap ) pbxPreview . Image , false ); //MainZones #0 is the big main zone containing driver zones Config = new ConfigurationTool (( Bitmap ) pbxPreview . Image , reader . MainZones [ 0 ]. Bounds ); Config . MainZone = reader . MainZones [ 0 ]; DriverList = reader . Drivers ; SelectedConfigFile = fileName ; } catch ( Exception ex ) { MessageBox . Show ( \"Could not load the settings error :\" + ex ); } RefreshUI (); } } private void Settings_Resize ( object sender , EventArgs e ) { int xDiff = this . Width - oldSize . Width ; int yDiff = this . Height - oldSize . Height ; gpbxPreview . Size = new Size ( oldGpbxPreviewSize . Width + xDiff , oldGpbxPreviewSize . Height + yDiff ); gpbxWindowPreview . Size = new Size ( oldGpbxWindowPreviewSize . Width + xDiff , oldGpbxWindowPreviewSize . Height ); pbxPreview . Size = new Size ( oldPbxPreviewSize . Width + xDiff , oldPbxPreviewSize . Height + yDiff ); pbxWindowPreview . Size = new Size ( oldPbxWindowPreviewSize . Width + xDiff , oldPbxWindowPreviewSize . Height ); } private void btnDeletePreset_Click ( object sender , EventArgs e ) { int selectedIndex = lsbPresets . SelectedIndex ; if ( selectedIndex >= 0 ) { string fileName = lsbPresets . Items [ selectedIndex ]. ToString (); if ( File . Exists ( fileName )) { File . Delete ( fileName ); RefreshUI (); } else { MessageBox . Show ( \"Could not delete the preset because it does not exists\" ); } } } private void removeBorders ( object sender , PaintEventArgs e ) { GroupBox gpbx = ( GroupBox ) sender ; using ( Pen pen = new Pen ( gpbx . BackColor , 50 )) { e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); } using ( var brush = new SolidBrush ( gpbx . ForeColor )) { var textPosition = new Point ( 5 , 0 ); // Adjust the X and Y values as needed e . Graphics . DrawString ( gpbx . Text , gpbx . Font , brush , textPosition ); } } } }","title":"Settings.cs"},{"location":"Code/Settings.html#settingscs","text":"using System ; using System.Collections.Generic ; using System.ComponentModel ; using System.Data ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.IO ; using TrackTrends ; namespace TrackTrends { public partial class Settings : Form { private string _grandPrixUrl = \"\" ; private string _selectedConfigFile ; private List < string > _driverList = new List < string >(); private F1TVEmulator Emulator = null ; private ConfigurationTool Config = null ; private bool CreatingZone = false ; private Point ZoneP1 ; private Point ZoneP2 ; private bool CreatingWindow = false ; private Point WindowP1 ; private Point WindowP2 ; List < Rectangle > WindowsToAdd = new List < Rectangle >(); public string GrandPrixUrl { get => _grandPrixUrl ; private set => _grandPrixUrl = value ; } public List < string > DriverList { get => _driverList ; private set => _driverList = value ; } public string SelectedConfigFile { get => _selectedConfigFile ; private set => _selectedConfigFile = value ; } //For the responsive content Size oldSize = new Size (); Size oldGpbxPreviewSize = new Size (); Size oldGpbxWindowPreviewSize = new Size (); Size oldPbxPreviewSize = new Size (); Size oldPbxWindowPreviewSize = new Size (); public Settings () { InitializeComponent (); Load (); } private void Load () { RefreshUI (); oldSize = this . Size ; oldGpbxPreviewSize = gpbxPreview . Size ; oldGpbxWindowPreviewSize = gpbxWindowPreview . Size ; oldPbxPreviewSize = pbxPreview . Size ; oldPbxWindowPreviewSize = pbxWindowPreview . Size ; tip1 . SetToolTip ( btnCreatZone , \"After clicking you can select two points in the image to set the bounds of the important data\" ); tip1 . SetToolTip ( btnCreateWindow , \"After clicking this you will have to select all the windows that are important on the lower image. Refer to the documentation for more infos\" ); tip1 . SetToolTip ( btnRefresh , \"Starts the emulator or refreshes the images if its already running\" ); tip1 . SetToolTip ( btnResetDriver , \"Resets the driver if something went wrong or if you want to test an other URL\" ); tip1 . SetToolTip ( lsbDrivers , \"The drivers that are on the image. Non-Case sensitive\" ); tip1 . SetToolTip ( tbxPresetName , \"The name of the preset you want to save\" ); tip1 . SetToolTip ( pbxPreview , \"What the emulator returns\" ); tip1 . SetToolTip ( pbxWindowPreview , \"One of the driver zones that the program managed to slice from the main zone\" ); } private void RefreshUI () { lsbDrivers . DataSource = null ; lsbDrivers . DataSource = DriverList ; if ( Directory . Exists ( ConfigurationTool . CONFIGS_FOLDER_NAME )) { lsbPresets . DataSource = null ; lsbPresets . DataSource = Directory . GetFiles ( ConfigurationTool . CONFIGS_FOLDER_NAME ); } if ( CreatingZone ) { if ( ZoneP1 == new Point (- 1 , - 1 )) { lblZonePointsRemaning . Text = \"2 points Remaining\" ; } else { lblZonePointsRemaning . Text = \"1 point Remaining\" ; } } else { lblZonePointsRemaning . Text = \"\" ; } if ( CreatingWindow ) { if ( WindowP1 == new Point (- 1 , - 1 )) { lblWindowPointsRemaining . Text = \"2 points Remaining\" ; } else { lblWindowPointsRemaining . Text = \"1 point Remaining\" ; } lblWindowPointsRemaining . Text = ConfigurationTool . NUMBER_OF_ZONES - WindowsToAdd . Count () + \" Windows remaining\" ; } else { lblWindowPointsRemaining . Text = \"\" ; lblWindowsRemaining . Text = \"\" ; } if ( Config != null ) { pbxPreview . Image = Config . MainZone . Draw (); if ( Config . MainZone . Zones . Count > 0 ) pbxWindowPreview . Image = Config . MainZone . Zones [ 0 ]. Draw (); } } private void CreateNewZone ( Point p1 , Point p2 ) { Rectangle dimensions = CreateAbsoluteRectangle ( p1 , p2 ); Config = new ConfigurationTool (( Bitmap ) pbxPreview . Image , dimensions ); RefreshUI (); } private void CreateWindows ( List < Rectangle > dimensions ) { if ( Config != null ) { Config . AddWindows ( dimensions ); } } private void tbxGpUrl_TextChanged ( object sender , EventArgs e ) { GrandPrixUrl = tbxGpUrl . Text ; } private void btnAddDriver_Click ( object sender , EventArgs e ) { string newDriver = tbxDriverName . Text ; DriverList . Add ( newDriver ); tbxDriverName . Text = \"\" ; RefreshUI (); } private void btnRemoveDriver_Click ( object sender , EventArgs e ) { if ( lsbDrivers . SelectedIndex >= 0 ) { DriverList . RemoveAt ( lsbDrivers . SelectedIndex ); } RefreshUI (); } private void SwitchZoneCreation () { if ( CreatingZone ) { CreatingZone = false ; lblZonePointsRemaning . Text = \"\" ; } else { CreatingZone = true ; if ( Config != null ) Config . ResetMainZone (); if ( CreatingWindow ) SwitchWindowCreation (); if ( Emulator != null && Emulator . Ready ) { Config = null ; pbxPreview . Image = Emulator . Screenshot (); } ZoneP1 = new Point (- 1 , - 1 ); ZoneP2 = new Point (- 1 , - 1 ); lblZonePointsRemaning . Text = \"2 Points left\" ; } RefreshUI (); } private void SwitchWindowCreation () { if ( CreatingWindow ) { CreatingWindow = false ; } else { CreatingWindow = true ; if ( Config != null ) Config . ResetWindows (); if ( CreatingZone ) SwitchZoneCreation (); WindowP1 = new Point (- 1 , - 1 ); WindowP2 = new Point (- 1 , - 1 ); WindowsToAdd = new List < Rectangle >(); } RefreshUI (); } private void btnCreatZone_Click ( object sender , EventArgs e ) { SwitchZoneCreation (); } private void btnCreateWindow_Click ( object sender , EventArgs e ) { SwitchWindowCreation (); } private void pbxMain_MouseClick ( object sender , MouseEventArgs e ) { if ( CreatingZone && pbxPreview . Image != null ) { //Point coordinates = pbxMain.PointToClient(new Point(MousePosition.X, MousePosition.Y)); Point coordinates = e . Location ; float xOffset = ( float ) pbxPreview . Image . Width / ( float ) pbxPreview . Width ; float yOffset = ( float ) pbxPreview . Image . Height / ( float ) pbxPreview . Height ; Point newPoint = new Point ( Convert . ToInt32 (( float ) coordinates . X * xOffset ), Convert . ToInt32 (( float ) coordinates . Y * yOffset )); //MessageBox.Show(\"Coordinates\" + Environment.NewLine + \"Old : \" + coordinates.ToString() + Environment.NewLine + \"New : \" + newPoint.ToString()); if ( ZoneP1 == new Point (- 1 , - 1 )) { ZoneP1 = newPoint ; } else { ZoneP2 = newPoint ; CreateNewZone ( ZoneP1 , ZoneP2 ); SwitchZoneCreation (); } RefreshUI (); } } private void pbxMain_Click ( object sender , EventArgs e ) { //Not the right one to use visibly } private void pbxDriverZone_MouseClick ( object sender , MouseEventArgs e ) { if ( CreatingWindow && pbxWindowPreview . Image != null ) { Point coordinates = e . Location ; float xOffset = ( float ) pbxWindowPreview . Image . Width / ( float ) pbxWindowPreview . Width ; float yOffset = ( float ) pbxWindowPreview . Image . Height / ( float ) pbxWindowPreview . Height ; Point newPoint = new Point ( Convert . ToInt32 (( float ) coordinates . X * xOffset ), Convert . ToInt32 (( float ) coordinates . Y * yOffset )); if ( WindowP1 == new Point (- 1 , - 1 )) { WindowP1 = newPoint ; } else { WindowP2 = newPoint ; WindowsToAdd . Add ( CreateAbsoluteRectangle ( WindowP1 , WindowP2 )); if ( WindowsToAdd . Count < ConfigurationTool . NUMBER_OF_ZONES ) { WindowP1 = new Point (- 1 , - 1 ); WindowP2 = new Point (- 1 , - 1 ); } else { WindowP1 = new Point ( WindowP1 . X , 0 ); WindowP2 = new Point ( WindowP2 . X , pbxWindowPreview . Image . Height ); CreateWindows ( WindowsToAdd ); SwitchWindowCreation (); } } RefreshUI (); } } private void pbxDriverZone_Click ( object sender , EventArgs e ) { //Not the right one to use visibly } private Rectangle CreateAbsoluteRectangle ( Point p1 , Point p2 ) { Point newP1 = new Point (); Point newP2 = new Point (); if ( p1 . X < p2 . X ) { newP1 . X = p1 . X ; newP2 . X = p2 . X ; } else { newP1 . X = p2 . X ; newP2 . X = p1 . X ; } if ( p1 . Y < p2 . Y ) { newP1 . Y = p1 . Y ; newP2 . Y = p2 . Y ; } else { newP1 . Y = p2 . Y ; newP2 . Y = p1 . Y ; } return new Rectangle ( newP1 . X , newP1 . Y , newP2 . X - newP1 . X , newP2 . Y - newP1 . Y ); } private async void btnRefresh_Click ( object sender , EventArgs e ) { btnRefresh . Enabled = false ; btnCreatZone . Enabled = false ; btnCreateWindow . Enabled = false ; btnResetDriver . Enabled = false ; if ( Emulator == null || Emulator . GrandPrixUrl != tbxGpUrl . Text ) { Emulator = new F1TVEmulator ( tbxGpUrl . Text ); } if (! Emulator . Ready ) { Task < int > start = Task . Run (() => Emulator . Start ()); int errorCode = await start ; if ( errorCode != 0 ) { string message ; switch ( errorCode ) { case 100 : message = \"Error \" + errorCode + \" Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again\" ; break ; case 101 : message = \"Error \" + errorCode + \" Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again\" ; break ; case 102 : message = \"Error \" + errorCode + \" Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update\" ; break ; case 103 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 104 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 105 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; case 106 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; default : message = \"Could not start the emulator Error \" + errorCode ; break ; } MessageBox . Show ( message ); } else { pbxPreview . Image = Emulator . Screenshot (); } } else { pbxPreview . Image = Emulator . Screenshot (); } btnRefresh . Enabled = true ; btnCreatZone . Enabled = true ; btnCreateWindow . Enabled = true ; btnResetDriver . Enabled = true ; btnRefresh . Text = \"Get a newer image\" ; } private void Settings_FormClosing ( object sender , FormClosingEventArgs e ) { if ( Emulator != null ) { Emulator . Stop (); } Emulator = null ; GC . Collect (); } private void btnResetDriver_Click ( object sender , EventArgs e ) { if ( Emulator != null ) { Emulator . ResetDriver (); } } private void btnSavePreset_Click ( object sender , EventArgs e ) { string presetName = tbxPresetName . Text ; if ( Config != null ) { Config . SaveToJson ( DriverList , presetName ); } RefreshUI (); } private void lsbPresets_SelectedIndexChanged ( object sender , EventArgs e ) { SelectedConfigFile = ( string ) lsbPresets . Items [ lsbPresets . SelectedIndex ]; } private void btnLoadPreset_Click ( object sender , EventArgs e ) { //MessageBox.Show(lsbPresets.SelectedIndex.ToString()); if ( lsbPresets . SelectedIndex >= 0 && pbxPreview . Image != null ) { try { string fileName = lsbPresets . Items [ lsbPresets . SelectedIndex ]. ToString (); Reader reader = new Reader ( fileName , ( Bitmap ) pbxPreview . Image , false ); //MainZones #0 is the big main zone containing driver zones Config = new ConfigurationTool (( Bitmap ) pbxPreview . Image , reader . MainZones [ 0 ]. Bounds ); Config . MainZone = reader . MainZones [ 0 ]; DriverList = reader . Drivers ; SelectedConfigFile = fileName ; } catch ( Exception ex ) { MessageBox . Show ( \"Could not load the settings error :\" + ex ); } RefreshUI (); } } private void Settings_Resize ( object sender , EventArgs e ) { int xDiff = this . Width - oldSize . Width ; int yDiff = this . Height - oldSize . Height ; gpbxPreview . Size = new Size ( oldGpbxPreviewSize . Width + xDiff , oldGpbxPreviewSize . Height + yDiff ); gpbxWindowPreview . Size = new Size ( oldGpbxWindowPreviewSize . Width + xDiff , oldGpbxWindowPreviewSize . Height ); pbxPreview . Size = new Size ( oldPbxPreviewSize . Width + xDiff , oldPbxPreviewSize . Height + yDiff ); pbxWindowPreview . Size = new Size ( oldPbxWindowPreviewSize . Width + xDiff , oldPbxWindowPreviewSize . Height ); } private void btnDeletePreset_Click ( object sender , EventArgs e ) { int selectedIndex = lsbPresets . SelectedIndex ; if ( selectedIndex >= 0 ) { string fileName = lsbPresets . Items [ selectedIndex ]. ToString (); if ( File . Exists ( fileName )) { File . Delete ( fileName ); RefreshUI (); } else { MessageBox . Show ( \"Could not delete the preset because it does not exists\" ); } } } private void removeBorders ( object sender , PaintEventArgs e ) { GroupBox gpbx = ( GroupBox ) sender ; using ( Pen pen = new Pen ( gpbx . BackColor , 50 )) { e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); } using ( var brush = new SolidBrush ( gpbx . ForeColor )) { var textPosition = new Point ( 5 , 0 ); // Adjust the X and Y values as needed e . Graphics . DrawString ( gpbx . Text , gpbx . Font , brush , textPosition ); } } } }","title":"Settings.cs"},{"location":"Code/Window.html","text":"Window.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Window.cs /// Brief : Default Window object that is mainly expected to be inherited. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; using System.IO ; using Tesseract ; using System.Text.RegularExpressions ; using System.Drawing.Drawing2D ; namespace TrackTrends { public class Window { public const string STRING_DEBUG_FOLDER = \"./GetString\" ; public const string LAPTIME_DEBUG_FOLDER = \"./LapTime\" ; public const string GAPTOLEADER_DEBUG_FOLDER = \"./Gap\" ; public const string SECTOR1_DEBUG_FOLDER = \"./Sector1\" ; public const string SECTOR2_DEBUG_FOLDER = \"./Sector2\" ; public const string SECTOR3_DEBUG_FOLDER = \"./Sector3\" ; public const string DRS_DEBUG_FOLDER = \"./DRS\" ; public const string TYRE_DEBUG_FOLDER = \"./Tyre\" ; private Rectangle _bounds ; private Bitmap _image ; private string _name ; protected TesseractEngine Engine ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap Image { get => _image ; set => _image = value ; } public string Name { get => _name ; protected set => _name = value ; } //This will have to be changed if you want to make it run on your machine public static DirectoryInfo TESS_DATA_FOLDER = new DirectoryInfo ( @\"C:\\Users\\Moi\\Pictures\\SeleniumScreens\\TessData\" ); //Debug public static Random rnd = new Random (); public Bitmap WindowImage { get { //This little trickery lets you have the image that the window sees Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( Image , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } /// /// Creates a new Window /// /// The image of the parent zone /// The position and size of the window /// Does the window need to generate a tesseract engine (takes time and ressources) public Window ( Bitmap image , Rectangle bounds , bool generateEngine = true ) { Image = image ; Bounds = bounds ; if ( generateEngine ) { Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } //DEBUG /* if (!Directory.Exists(STRING_DEBUG_FOLDER)) Directory.CreateDirectory(STRING_DEBUG_FOLDER); if (!Directory.Exists(LAPTIME_DEBUG_FOLDER)) Directory.CreateDirectory(LAPTIME_DEBUG_FOLDER); if (!Directory.Exists(GAPTOLEADER_DEBUG_FOLDER)) Directory.CreateDirectory(GAPTOLEADER_DEBUG_FOLDER); if (!Directory.Exists(SECTOR1_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR1_DEBUG_FOLDER); if (!Directory.Exists(SECTOR2_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR2_DEBUG_FOLDER); if (!Directory.Exists(SECTOR3_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR3_DEBUG_FOLDER); if (!Directory.Exists(DRS_DEBUG_FOLDER)) Directory.CreateDirectory(DRS_DEBUG_FOLDER); if (!Directory.Exists(TYRE_DEBUG_FOLDER)) Directory.CreateDirectory(TYRE_DEBUG_FOLDER); */ } /// /// Method that will have to be used by the childrens to let the model make them decode the images they have /// /// Returns an object because we dont know what kind of return it will be public virtual Object DecodePng () { return \"NaN\" ; } /// /// Method that will have to be used by the childrens to let the model make them decode the images they have /// /// This is a list of the different possible drivers in the race. It should not be too big but NEVER be too short /// Returns an object because we dont know what kind of return it will be public virtual Object DecodePng ( List < string > driverList ) { return \"NaN\" ; } /// /// This converts an image into a byte[]. It can be usefull when doing unsafe stuff. Use at your own risks /// /// The image you want to convert /// A byte array containing the image informations public static byte [] ImageToByte ( Image inputImage ) { using ( var stream = new MemoryStream ()) { inputImage . Save ( stream , System . Drawing . Imaging . ImageFormat . Png ); return stream . ToArray (); } } /// /// This method is used to recover a time from a PNG using Tesseract OCR /// /// The image where the text is /// The type of window it is /// The Tesseract Engine /// The time in milliseconds public static int GetTimeFromPng ( Bitmap image , OcrImage . WindowType windowType , TesseractEngine Engine ) { //Kind of a big method but it has a lot of error handling and has to work with three special cases string rawResult = \"\" ; int result = 0 ; //Debug int salt = rnd . Next ( 0 , 999999 ); switch ( windowType ) { case OcrImage . WindowType . Sector : //The usual sector is in this form : 33.456 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.\" ); break ; case OcrImage . WindowType . LapTime : //The usual Lap time is in this form : 1:45:345 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.:\" ); break ; case OcrImage . WindowType . Gap : //The usual Gap is in this form : + 34.567 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.+\" ); break ; default : Engine . SetVariable ( \"tessedit_char_whitelist\" , \"\" ); break ; } Bitmap enhancedImage = new OcrImage ( image ). Enhance ( windowType ); var tessImage = Pix . LoadFromMemory ( ImageToByte ( enhancedImage )); Page page = Engine . Process ( tessImage ); Graphics g = Graphics . FromImage ( enhancedImage ); // Get the iterator for the page layout using ( var iter = page . GetIterator ()) { // Loop over the elements of the page layout iter . Begin (); do { // Get the text for the current element try { rawResult += iter . GetText ( PageIteratorLevel . Word ); } catch { //nothing we just dont add it if its not a number } } while ( iter . Next ( PageIteratorLevel . Word )); } List < string > rawNumbers ; //In the gaps we can find '+' but we dont care about it its redondant a driver will never be - something if ( windowType == OcrImage . WindowType . Gap ) rawResult = Regex . Replace ( rawResult , \"[^0-9.:]\" , \"\" ); //Splits into minuts seconds miliseconds rawNumbers = rawResult . Split ( '.' , ':' ). ToList < string >(); //removes any empty cells (tho this usually sign of a really bad OCR implementation tbh will have to be fixed higher in the chian) rawNumbers . RemoveAll ( x => (( string ) x ) == \"\" ); int minuts = 0 ; int seconds = 0 ; int miliseconds = 0 ; switch ( windowType ) { case OcrImage . WindowType . Sector : //Usually there is supposed to be only 2 parts. if ( rawNumbers . Count == 2 ) { //The perect case try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { if ( rawNumbers . Count == 1 ) { //Here it is a little harder... Usually its because a '.' has been overlooked or interpreted as a number if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' has been understood as a number try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { Console . WriteLine ( \"Sector time convertion failed\" ); } } } else { //The OCR detected more than 1 '.' wich is concerning because that means that something went really wrong Console . WriteLine ( \"Sector time convertion failed\" ); } } result = 0 ; result += seconds * 1000 ; result += miliseconds ; break ; case OcrImage . WindowType . LapTime : if ( rawNumbers . Count == 3 ) { //The normal way try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 2 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers . Count == 2 ) { //Either the ':' or the '.' has been missinterpreted if ( rawNumbers [ 0 ]. Length > rawNumbers [ 1 ]. Length ) { //The ':' has been missinterpreted if ( rawNumbers [ 0 ]. Length == 3 ) { //It has been forgotten try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 4 ) { //I has been translated into an other number try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { //This could happen if the ':' has been missinterpreted with a lap time of over 9 minuts (HIGLY IMPROBABLE) Console . WriteLine ( \"Lap time convertion failed\" ); } } } else { //The '.' has been missinterpreted if ( rawNumbers [ 1 ]. Length == 5 ) { //It has been forgotten minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 0 ]. ToString () + rawNumbers [ 1 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 2 ]. ToString () + rawNumbers [ 1 ][ 3 ]. ToString () + rawNumbers [ 1 ][ 4 ]. ToString ()); } else { if ( rawNumbers [ 1 ]. Length == 6 ) { try { //It has been interpreted as a number minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 0 ]. ToString () + rawNumbers [ 1 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 3 ]. ToString () + rawNumbers [ 1 ][ 4 ]. ToString () + rawNumbers [ 1 ][ 5 ]. ToString ()); } catch { //It can happen and to be honest I dont know how to fix it } } else { Console . WriteLine ( \"Lap time convertion failed\" ); } } } } else { if ( rawNumbers . Count == 1 ) { //Both the '.' and the ':' have been missinterpreted if ( rawNumbers [ 0 ]. Length == 6 ) { //The just all have been forgotten try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 7 ) { //The '.' or ':' have been interpreted as a number (usually the ':') try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString () + rawNumbers [ 0 ][ 6 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 8 ) { //Both have been interpreted as a number try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 5 ]. ToString () + rawNumbers [ 0 ][ 6 ]. ToString () + rawNumbers [ 0 ][ 7 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { //I dont know what could have happened Console . WriteLine ( \"Lap time convertion failed\" ); } } } } else { //I dont know what could have happened Console . WriteLine ( \"Lap time convertion failed\" ); } } } result = 0 ; result += minuts * 60 * 1000 ; result += seconds * 1000 ; result += miliseconds ; break ; case OcrImage . WindowType . Gap : if ( rawNumbers . Count == 2 ) { // This should be the x.xxx or a missed x:xx.xxx if ( rawNumbers [ 0 ]. Length > 2 ) { //Its a missed x:xx.xxx if ( rawNumbers [ 0 ]. Length == 3 ) { //It forgot the \":\" try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { //The \":\" has been mistaken as a number if ( rawNumbers [ 0 ]. Length == 4 ) { try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } else { //It should be a normal x.xxx or xx.xxx try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } else { if ( rawNumbers . Count == 1 ) { //can be anything depending on the size of the string if ( rawNumbers [ 0 ]. Length == 4 ) { //We just missed the '.' try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 5 ) { //We just missed the '.' try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } //There is just too much possibilities that it would be stupid to try and tell them appart so for now im leaving that as just an error Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { if ( rawNumbers . Count == 3 ) { // This should be the x:xx.xxx try { //Gaps cant be more than 9 minuts so if there is more than 1 digit it means that the '+' has been understood as an other number if ( rawNumbers [ 0 ]. Length > 1 ) rawNumbers [ 0 ] = rawNumbers [ 0 ][ rawNumbers [ 0 ]. Length - 1 ]. ToString (); minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 2 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } } result = 0 ; result += minuts * 60 * 1000 ; result += seconds * 1000 ; result += miliseconds ; break ; default : try { result = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); } catch { result = 0 ; } break ; } page . Dispose (); return result ; } /// /// Method that recovers strings from an image using Tesseract OCR /// /// The image of the window that contains text /// The Tesseract engine /// The list of allowed chars /// The type of window the text is on. Depending on the context the OCR will behave differently /// the string it found public static string GetStringFromPng ( Bitmap image , TesseractEngine Engine , string allowedChars = \"\" , OcrImage . WindowType windowType = OcrImage . WindowType . Text ) { string result = \"\" ; //Debug int salt = rnd . Next ( 0 , 999999 ); Engine . SetVariable ( \"tessedit_char_whitelist\" , allowedChars ); Bitmap rawData = image ; Bitmap enhancedImage = new OcrImage ( rawData ). Enhance ( windowType ); Page page = Engine . Process ( enhancedImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { result += iter . GetText ( PageIteratorLevel . Word ); } while ( iter . Next ( PageIteratorLevel . Word )); } page . Dispose (); return result ; } /// /// Get a smaller image from a bigger one /// /// The big bitmap you want to get a part of /// The dimensions of the new bitmap /// The little bitmap protected Bitmap GetSmallBitmapFromBigOne ( Bitmap inputBitmap , Rectangle newBitmapDimensions ) { Bitmap sample = new Bitmap ( newBitmapDimensions . Width , newBitmapDimensions . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( inputBitmap , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), newBitmapDimensions , GraphicsUnit . Pixel ); return sample ; } /// /// Returns the closest string from a list of options /// /// an array of all the possibilities /// the string you want to compare /// The closest option protected static string FindClosestMatch ( List < string > options , string testString ) { var closestMatch = \"\" ; var closestDistance = int . MaxValue ; foreach ( var item in options ) { var distance = LevenshteinDistance ( item , testString ); if ( distance < closestDistance ) { closestMatch = item ; closestDistance = distance ; } } return closestMatch ; } //This method has been generated with the help of ChatGPT /// /// Method that computes a score of distance between two strings /// /// The first string (order irrelevant) /// The second string (order irrelevant) /// The levenshtein distance protected static int LevenshteinDistance ( string string1 , string string2 ) { if ( string . IsNullOrEmpty ( string1 )) { return string . IsNullOrEmpty ( string2 ) ? 0 : string2 . Length ; } if ( string . IsNullOrEmpty ( string2 )) { return string . IsNullOrEmpty ( string1 ) ? 0 : string1 . Length ; } var d = new int [ string1 . Length + 1 , string2 . Length + 1 ]; for ( var i = 0 ; i <= string1 . Length ; i ++) { d [ i , 0 ] = i ; } for ( var j = 0 ; j <= string2 . Length ; j ++) { d [ 0 , j ] = j ; } for ( var i = 1 ; i <= string1 . Length ; i ++) { for ( var j = 1 ; j <= string2 . Length ; j ++) { var cost = ( string1 [ i - 1 ] == string2 [ j - 1 ]) ? 0 : 1 ; d [ i , j ] = Math . Min ( Math . Min ( d [ i - 1 , j ] + 1 , d [ i , j - 1 ] + 1 ), d [ i - 1 , j - 1 ] + cost ); } } return d [ string1 . Length , string2 . Length ]; } } }","title":"Window.cs"},{"location":"Code/Window.html#windowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Window.cs /// Brief : Default Window object that is mainly expected to be inherited. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; using System.IO ; using Tesseract ; using System.Text.RegularExpressions ; using System.Drawing.Drawing2D ; namespace TrackTrends { public class Window { public const string STRING_DEBUG_FOLDER = \"./GetString\" ; public const string LAPTIME_DEBUG_FOLDER = \"./LapTime\" ; public const string GAPTOLEADER_DEBUG_FOLDER = \"./Gap\" ; public const string SECTOR1_DEBUG_FOLDER = \"./Sector1\" ; public const string SECTOR2_DEBUG_FOLDER = \"./Sector2\" ; public const string SECTOR3_DEBUG_FOLDER = \"./Sector3\" ; public const string DRS_DEBUG_FOLDER = \"./DRS\" ; public const string TYRE_DEBUG_FOLDER = \"./Tyre\" ; private Rectangle _bounds ; private Bitmap _image ; private string _name ; protected TesseractEngine Engine ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap Image { get => _image ; set => _image = value ; } public string Name { get => _name ; protected set => _name = value ; } //This will have to be changed if you want to make it run on your machine public static DirectoryInfo TESS_DATA_FOLDER = new DirectoryInfo ( @\"C:\\Users\\Moi\\Pictures\\SeleniumScreens\\TessData\" ); //Debug public static Random rnd = new Random (); public Bitmap WindowImage { get { //This little trickery lets you have the image that the window sees Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( Image , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } /// /// Creates a new Window /// /// The image of the parent zone /// The position and size of the window /// Does the window need to generate a tesseract engine (takes time and ressources) public Window ( Bitmap image , Rectangle bounds , bool generateEngine = true ) { Image = image ; Bounds = bounds ; if ( generateEngine ) { Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } //DEBUG /* if (!Directory.Exists(STRING_DEBUG_FOLDER)) Directory.CreateDirectory(STRING_DEBUG_FOLDER); if (!Directory.Exists(LAPTIME_DEBUG_FOLDER)) Directory.CreateDirectory(LAPTIME_DEBUG_FOLDER); if (!Directory.Exists(GAPTOLEADER_DEBUG_FOLDER)) Directory.CreateDirectory(GAPTOLEADER_DEBUG_FOLDER); if (!Directory.Exists(SECTOR1_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR1_DEBUG_FOLDER); if (!Directory.Exists(SECTOR2_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR2_DEBUG_FOLDER); if (!Directory.Exists(SECTOR3_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR3_DEBUG_FOLDER); if (!Directory.Exists(DRS_DEBUG_FOLDER)) Directory.CreateDirectory(DRS_DEBUG_FOLDER); if (!Directory.Exists(TYRE_DEBUG_FOLDER)) Directory.CreateDirectory(TYRE_DEBUG_FOLDER); */ } /// /// Method that will have to be used by the childrens to let the model make them decode the images they have /// /// Returns an object because we dont know what kind of return it will be public virtual Object DecodePng () { return \"NaN\" ; } /// /// Method that will have to be used by the childrens to let the model make them decode the images they have /// /// This is a list of the different possible drivers in the race. It should not be too big but NEVER be too short /// Returns an object because we dont know what kind of return it will be public virtual Object DecodePng ( List < string > driverList ) { return \"NaN\" ; } /// /// This converts an image into a byte[]. It can be usefull when doing unsafe stuff. Use at your own risks /// /// The image you want to convert /// A byte array containing the image informations public static byte [] ImageToByte ( Image inputImage ) { using ( var stream = new MemoryStream ()) { inputImage . Save ( stream , System . Drawing . Imaging . ImageFormat . Png ); return stream . ToArray (); } } /// /// This method is used to recover a time from a PNG using Tesseract OCR /// /// The image where the text is /// The type of window it is /// The Tesseract Engine /// The time in milliseconds public static int GetTimeFromPng ( Bitmap image , OcrImage . WindowType windowType , TesseractEngine Engine ) { //Kind of a big method but it has a lot of error handling and has to work with three special cases string rawResult = \"\" ; int result = 0 ; //Debug int salt = rnd . Next ( 0 , 999999 ); switch ( windowType ) { case OcrImage . WindowType . Sector : //The usual sector is in this form : 33.456 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.\" ); break ; case OcrImage . WindowType . LapTime : //The usual Lap time is in this form : 1:45:345 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.:\" ); break ; case OcrImage . WindowType . Gap : //The usual Gap is in this form : + 34.567 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.+\" ); break ; default : Engine . SetVariable ( \"tessedit_char_whitelist\" , \"\" ); break ; } Bitmap enhancedImage = new OcrImage ( image ). Enhance ( windowType ); var tessImage = Pix . LoadFromMemory ( ImageToByte ( enhancedImage )); Page page = Engine . Process ( tessImage ); Graphics g = Graphics . FromImage ( enhancedImage ); // Get the iterator for the page layout using ( var iter = page . GetIterator ()) { // Loop over the elements of the page layout iter . Begin (); do { // Get the text for the current element try { rawResult += iter . GetText ( PageIteratorLevel . Word ); } catch { //nothing we just dont add it if its not a number } } while ( iter . Next ( PageIteratorLevel . Word )); } List < string > rawNumbers ; //In the gaps we can find '+' but we dont care about it its redondant a driver will never be - something if ( windowType == OcrImage . WindowType . Gap ) rawResult = Regex . Replace ( rawResult , \"[^0-9.:]\" , \"\" ); //Splits into minuts seconds miliseconds rawNumbers = rawResult . Split ( '.' , ':' ). ToList < string >(); //removes any empty cells (tho this usually sign of a really bad OCR implementation tbh will have to be fixed higher in the chian) rawNumbers . RemoveAll ( x => (( string ) x ) == \"\" ); int minuts = 0 ; int seconds = 0 ; int miliseconds = 0 ; switch ( windowType ) { case OcrImage . WindowType . Sector : //Usually there is supposed to be only 2 parts. if ( rawNumbers . Count == 2 ) { //The perect case try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { if ( rawNumbers . Count == 1 ) { //Here it is a little harder... Usually its because a '.' has been overlooked or interpreted as a number if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' has been understood as a number try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { Console . WriteLine ( \"Sector time convertion failed\" ); } } } else { //The OCR detected more than 1 '.' wich is concerning because that means that something went really wrong Console . WriteLine ( \"Sector time convertion failed\" ); } } result = 0 ; result += seconds * 1000 ; result += miliseconds ; break ; case OcrImage . WindowType . LapTime : if ( rawNumbers . Count == 3 ) { //The normal way try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 2 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers . Count == 2 ) { //Either the ':' or the '.' has been missinterpreted if ( rawNumbers [ 0 ]. Length > rawNumbers [ 1 ]. Length ) { //The ':' has been missinterpreted if ( rawNumbers [ 0 ]. Length == 3 ) { //It has been forgotten try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 4 ) { //I has been translated into an other number try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { //This could happen if the ':' has been missinterpreted with a lap time of over 9 minuts (HIGLY IMPROBABLE) Console . WriteLine ( \"Lap time convertion failed\" ); } } } else { //The '.' has been missinterpreted if ( rawNumbers [ 1 ]. Length == 5 ) { //It has been forgotten minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 0 ]. ToString () + rawNumbers [ 1 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 2 ]. ToString () + rawNumbers [ 1 ][ 3 ]. ToString () + rawNumbers [ 1 ][ 4 ]. ToString ()); } else { if ( rawNumbers [ 1 ]. Length == 6 ) { try { //It has been interpreted as a number minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 0 ]. ToString () + rawNumbers [ 1 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 3 ]. ToString () + rawNumbers [ 1 ][ 4 ]. ToString () + rawNumbers [ 1 ][ 5 ]. ToString ()); } catch { //It can happen and to be honest I dont know how to fix it } } else { Console . WriteLine ( \"Lap time convertion failed\" ); } } } } else { if ( rawNumbers . Count == 1 ) { //Both the '.' and the ':' have been missinterpreted if ( rawNumbers [ 0 ]. Length == 6 ) { //The just all have been forgotten try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 7 ) { //The '.' or ':' have been interpreted as a number (usually the ':') try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString () + rawNumbers [ 0 ][ 6 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 8 ) { //Both have been interpreted as a number try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 5 ]. ToString () + rawNumbers [ 0 ][ 6 ]. ToString () + rawNumbers [ 0 ][ 7 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { //I dont know what could have happened Console . WriteLine ( \"Lap time convertion failed\" ); } } } } else { //I dont know what could have happened Console . WriteLine ( \"Lap time convertion failed\" ); } } } result = 0 ; result += minuts * 60 * 1000 ; result += seconds * 1000 ; result += miliseconds ; break ; case OcrImage . WindowType . Gap : if ( rawNumbers . Count == 2 ) { // This should be the x.xxx or a missed x:xx.xxx if ( rawNumbers [ 0 ]. Length > 2 ) { //Its a missed x:xx.xxx if ( rawNumbers [ 0 ]. Length == 3 ) { //It forgot the \":\" try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { //The \":\" has been mistaken as a number if ( rawNumbers [ 0 ]. Length == 4 ) { try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } else { //It should be a normal x.xxx or xx.xxx try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } else { if ( rawNumbers . Count == 1 ) { //can be anything depending on the size of the string if ( rawNumbers [ 0 ]. Length == 4 ) { //We just missed the '.' try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 5 ) { //We just missed the '.' try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } //There is just too much possibilities that it would be stupid to try and tell them appart so for now im leaving that as just an error Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { if ( rawNumbers . Count == 3 ) { // This should be the x:xx.xxx try { //Gaps cant be more than 9 minuts so if there is more than 1 digit it means that the '+' has been understood as an other number if ( rawNumbers [ 0 ]. Length > 1 ) rawNumbers [ 0 ] = rawNumbers [ 0 ][ rawNumbers [ 0 ]. Length - 1 ]. ToString (); minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 2 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } } result = 0 ; result += minuts * 60 * 1000 ; result += seconds * 1000 ; result += miliseconds ; break ; default : try { result = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); } catch { result = 0 ; } break ; } page . Dispose (); return result ; } /// /// Method that recovers strings from an image using Tesseract OCR /// /// The image of the window that contains text /// The Tesseract engine /// The list of allowed chars /// The type of window the text is on. Depending on the context the OCR will behave differently /// the string it found public static string GetStringFromPng ( Bitmap image , TesseractEngine Engine , string allowedChars = \"\" , OcrImage . WindowType windowType = OcrImage . WindowType . Text ) { string result = \"\" ; //Debug int salt = rnd . Next ( 0 , 999999 ); Engine . SetVariable ( \"tessedit_char_whitelist\" , allowedChars ); Bitmap rawData = image ; Bitmap enhancedImage = new OcrImage ( rawData ). Enhance ( windowType ); Page page = Engine . Process ( enhancedImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { result += iter . GetText ( PageIteratorLevel . Word ); } while ( iter . Next ( PageIteratorLevel . Word )); } page . Dispose (); return result ; } /// /// Get a smaller image from a bigger one /// /// The big bitmap you want to get a part of /// The dimensions of the new bitmap /// The little bitmap protected Bitmap GetSmallBitmapFromBigOne ( Bitmap inputBitmap , Rectangle newBitmapDimensions ) { Bitmap sample = new Bitmap ( newBitmapDimensions . Width , newBitmapDimensions . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( inputBitmap , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), newBitmapDimensions , GraphicsUnit . Pixel ); return sample ; } /// /// Returns the closest string from a list of options /// /// an array of all the possibilities /// the string you want to compare /// The closest option protected static string FindClosestMatch ( List < string > options , string testString ) { var closestMatch = \"\" ; var closestDistance = int . MaxValue ; foreach ( var item in options ) { var distance = LevenshteinDistance ( item , testString ); if ( distance < closestDistance ) { closestMatch = item ; closestDistance = distance ; } } return closestMatch ; } //This method has been generated with the help of ChatGPT /// /// Method that computes a score of distance between two strings /// /// The first string (order irrelevant) /// The second string (order irrelevant) /// The levenshtein distance protected static int LevenshteinDistance ( string string1 , string string2 ) { if ( string . IsNullOrEmpty ( string1 )) { return string . IsNullOrEmpty ( string2 ) ? 0 : string2 . Length ; } if ( string . IsNullOrEmpty ( string2 )) { return string . IsNullOrEmpty ( string1 ) ? 0 : string1 . Length ; } var d = new int [ string1 . Length + 1 , string2 . Length + 1 ]; for ( var i = 0 ; i <= string1 . Length ; i ++) { d [ i , 0 ] = i ; } for ( var j = 0 ; j <= string2 . Length ; j ++) { d [ 0 , j ] = j ; } for ( var i = 1 ; i <= string1 . Length ; i ++) { for ( var j = 1 ; j <= string2 . Length ; j ++) { var cost = ( string1 [ i - 1 ] == string2 [ j - 1 ]) ? 0 : 1 ; d [ i , j ] = Math . Min ( Math . Min ( d [ i - 1 , j ] + 1 , d [ i , j - 1 ] + 1 ), d [ i - 1 , j - 1 ] + cost ); } } return d [ string1 . Length , string2 . Length ]; } } }","title":"Window.cs"},{"location":"Code/recoverCookiesCSV.html","text":"recoverCookiesCSV.py # Rohmer Maxime # RecoverCookies.py # Little script that recovers the cookies stored in the chrome sqlite database and then decrypts them using the key stored in the chrome files # This script has been created to be used by an other programm or for the data to not be used directly. This is why it stores all the decoded cookies in a csv. (Btw could be smart for the end programm to delete the csv after using it) # Parts of this cript have been created with the help of ChatGPT import os import json import base64 import sqlite3 import win32crypt from Cryptodome.Cipher import AES from pathlib import Path import csv def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key def decrypt_payload ( cipher , payload ): return cipher . decrypt ( payload ) def generate_cipher ( aes_key , iv ): return AES . new ( aes_key , AES . MODE_GCM , iv ) def decrypt_password ( buff , master_key ): try : iv = buff [ 3 : 15 ] payload = buff [ 15 :] cipher = generate_cipher ( master_key , iv ) decrypted_pass = decrypt_payload ( cipher , payload ) decrypted_pass = decrypted_pass [: - 16 ] . decode () # remove suffix bytes return decrypted_pass except Exception : # print(\"Probably saved password from Chrome version older than v80\\n\") # print(str(e)) return \"Chrome < 80\" master_key = get_master_key () cookies_path = Path ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Default \\\\ Network \\\\ Cookies\" ) if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" )","title":"recoverCookiesCSV.py"},{"location":"Code/recoverCookiesCSV.html#recovercookiescsvpy","text":"# Rohmer Maxime # RecoverCookies.py # Little script that recovers the cookies stored in the chrome sqlite database and then decrypts them using the key stored in the chrome files # This script has been created to be used by an other programm or for the data to not be used directly. This is why it stores all the decoded cookies in a csv. (Btw could be smart for the end programm to delete the csv after using it) # Parts of this cript have been created with the help of ChatGPT import os import json import base64 import sqlite3 import win32crypt from Cryptodome.Cipher import AES from pathlib import Path import csv def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key def decrypt_payload ( cipher , payload ): return cipher . decrypt ( payload ) def generate_cipher ( aes_key , iv ): return AES . new ( aes_key , AES . MODE_GCM , iv ) def decrypt_password ( buff , master_key ): try : iv = buff [ 3 : 15 ] payload = buff [ 15 :] cipher = generate_cipher ( master_key , iv ) decrypted_pass = decrypt_payload ( cipher , payload ) decrypted_pass = decrypted_pass [: - 16 ] . decode () # remove suffix bytes return decrypted_pass except Exception : # print(\"Probably saved password from Chrome version older than v80\\n\") # print(str(e)) return \"Chrome < 80\" master_key = get_master_key () cookies_path = Path ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Default \\\\ Network \\\\ Cookies\" ) if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" )","title":"recoverCookiesCSV.py"}]} \ No newline at end of file +{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"index.html","text":"Rapport Track Trends V1.0 Rohmer Maxime Travail de dipl\u00f4me Technicien ES 2023 Introduction R\u00e9sum\u00e9 Track Trends est un outil de r\u00e9cup\u00e9ration et d'analyse de donn\u00e9es de courses de Formule 1. Pour le contexte, en dehors des cours, j'exerce diff\u00e9rentes activit\u00e9s dont celle de Live Ticker F1 pour le 20 minutes. Pour m'aider dans ce travail, j'utilise actuellement la F1TV \u00e0 laquelle je suis abonn\u00e9 qui me propose non seulement un feed vid\u00e9o de meilleure qualit\u00e9 avec des commentaires plus pertinents que ceux de la RTS mais qui aussi me permet d'acc\u00e9der \u00e0 un feed vid\u00e9o tr\u00e8s important : la chaine data. Ce dernier ressemble \u00e0 cela : \"Screenshot du feed data de la f1tv\" (Attention ce n'est pas un joli tableau HTML, mais bien une vid\u00e9o qui contient un tableau.) Sauf que toutes les informations sont \u00e9tal\u00e9es p\u00eale-m\u00eale sans hi\u00e9rarchie ce qui fait que cela me prendrait trop de temps de tout d\u00e9chiffrer \u00e0 chaque fois, ce qui me fait rater des choses int\u00e9ressantes. Le but du projet est donc de fournir un outil qui hi\u00e9rarchise et affiche diff\u00e9remment les donn\u00e9es pour faciliter leur lecture et me permettre de faire de meilleurs commentaires. Abstract Track Trends is a Formula 1 data is a tool that displays and interpret data. To understand everything,first ,a little bit of context. In my free time I have multiple activities and one is to be the Live Ticker F1 for the local journal \"20 minutes\" (Owned by Tamedia). to help me in this work I'm currently using the F1TV to which I'm currently subscribed because it provides me with a better video feed with better commentary than the ones from the RTS (in my opinion) but also because it gives me access to a very important video feed : the data channel You can see in the chapter above an example of the F1TV DATA CHANNEL. [Note : Even tough it looks like a pretty HTML table on wich you could easely get infos... Its not. Its a video feed] You can see a lot of data all well and good BUT! All the data is displayed the same in a big table which make it really hard to read totally in a hurry, which means that I miss a lot of useful information. The point of the project then is to provide a tool that can display those data by taking into account their relevance. So for example a driver that is 10s away from everyone and that is doing some normal lapTimes will be less displayed or even not displayed at all so I can focus on the drivers that are battling each others. This tool would help me not miss the battles and details that are happening in the back and therefore not being broadcasted on TV.And it could be a usefull tool for anyone who wants a better insight of how the race is going by looking at the data. This kind of project already exists in the form of the AWS tool \"F1 Insight\" but it is not avaible to the public. We can only see some of its predictions (that are trash) and data dumps in the live feed when the TV directors feel like it. Description du besoin Comme expliqu\u00e9 dans le r\u00e9sum\u00e9, je suis Live Ticker F1. Mais pour mieux comprendre le besoin que j'ai, je pense qu'il est pertinent de comprendre comment je travaille. Pendant un Grand Prix de Formule 1 j'ai plusieurs t\u00e2ches \u00e0 effectuer : Suivre les diff\u00e9rents \u00e9v\u00e8nements du Grand Prix Changer le titre et la photo de titre du Live Chercher des Tweets ou des Images \u00e0 int\u00e9grer Ecrire les commentaires en faisant attention \u00e0 dire ce qu'il se passe mais aussi l\u2019expliquer, ce que cela implique, mais aussi ce que cela veut dire pour le reste de la course. Comprendre et expliquer les strat\u00e9gies Tout cela toutes les cinq minutes max... Cela veut dire que je dois \u00eatre le plus rapide possible quand je cherche des informations. Et comme le tableau en comporte trop et bien, je suis oblig\u00e9 de le lire en diagonale. Par exemple dans le tableau, les infos que je cherche le plus sont : Le nombre de places gagn\u00e9es (surtout au d\u00e9part) Les \u00e9carts entre les pilotes (surtout ceux qui sont en dessous de deux secondes). Les pneus de chaque pilote et combien de tours, ils ont fait dessus Les temps d'arr\u00eats aux stands Les temps au tour (surtout pour la strat\u00e9gie) Mais pleins d'autres informations existent si on les recoupe sur plusieurs tours. Un outil qui permettrait de mettre en \u00e9vidence les informations importantes serait donc une tr\u00e8s grosse plus-value pour mon travail et s'il est facile \u00e0 installer et \u00e0 utiliser, il se pourrait qu'il devienne indispensable. Cahier des charges Il s'agit d'une version coup\u00e9e du cahier des charges qui ne contient pas l'explication du contexte. Mais l'original est disponible sur ce site \u00e9galement. Il est toutefois normal d'y voir des choses r\u00e9p\u00e9t\u00e9es ou l\u00e9g\u00e8rement diff\u00e9rentes, en effet, il n'a pas \u00e9t\u00e9 \u00e9crit en m\u00eame temps que le reste de ce document. Projet Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes. Le but est non seulement de faciliter mon job, mais aussi faire en sorte d'am\u00e9liorer la plus-value de mon travail en me permettant de fournir des commentaires qui ne sont pas disponibles pour le tout venant qui regarde simplement le flux RTS. Exemples : Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand Maintenant afficher diff\u00e9remment les infos, c'est sympa, mais cela serait encore mieux de traiter ces data et de permettre des petites pr\u00e9dictions. Exemples : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents R\u00e9alisation Malheureusement, la Formula 1 Management ne propose aucune API publique qui puisse nous permettre de faire ce projet \"simplement\". La raison la plus probable \u00e9tant qu'Amazon avec son service AWS propose exactement ce genre de services pour le flux t\u00e9l\u00e9vis\u00e9 et il doit y avoir un contrat d'exclusivit\u00e9. Il existe des API \"Pirates\" faites par la communaut\u00e9, le probl\u00e8me est qu'elles ne sont pas forc\u00e9ment des plus pratiques \u00e0 utiliser. Mais comme je poss\u00e8de un abonnement premium ++ \u00e0 la F1TV, j'ai acc\u00e8s pour chaque grand prix \u00e0 un flux vid\u00e9o nomm\u00e9 : DATA F1 CHANNEL Qui ressemble \u00e0 \u00e7a : \"Exemple de la Data Channel\" Donc la seule fa\u00e7on que je vois de r\u00e9cup\u00e9rer ces donn\u00e9es est de les prendre directement sur ce feed. M\u00eame si le but final de l'application est de faire pleins de choses super avec les datas, le gros du projet va surtout \u00eatre la r\u00e9cup\u00e9ration des donn\u00e9es et leur stockage. Les donn\u00e9es viennent du flux vid\u00e9o et ainsi dans un premier temps, il va falloir r\u00e9cup\u00e9rer d'une mani\u00e8re ou d'une autre des images qui viennent d'un grand prix en direct ou en rediffusion. Ensuite, dans un second temps, il faut lire les informations directement sur l'image en utilisant une librairie pr\u00e9vue pour (exemple Tesseract) et v\u00e9rifier l'int\u00e9grit\u00e9 de ces derni\u00e8res pour qu'on puisse ensuite les stocker. Dans un troisi\u00e8me temps, il faut stocker toutes ces donn\u00e9es dans une forme qui permette d'aller facilement faire des requ\u00eates de r\u00e9cup\u00e9ration et d\u00e9j\u00e0 pr\u00e9parer des m\u00e9thodes qui permettent de r\u00e9cup\u00e9rer des infos importantes (ex : la moyenne des cinq derniers tours, le temps moyen d'arr\u00eat etc.) pour faciliter la derni\u00e8re \u00e9tape Quand tout cela est fait, on peut ensuite s'amuser un peu avec les Data. La derni\u00e8re \u00e9tape est donc l'affichage. L'id\u00e9e est de cr\u00e9er une Windows Form qui contienne toutes ces informations dans un format beaucoup plus lisible et avec laquelle on pourrait interagir pour permettre de plus facilement commenter les Grands Prix. (exemple plus bas avec un croquis de ce \u00e0 quoi l'application pourrait ressembler) Voici la liste des donn\u00e9es qui pourraient \u00eatre affich\u00e9es (Non contractuel, simplement des id\u00e9es). Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand La moyenne de temps que les pilotes perdent dans les stands La performance moyenne des 5 types de pneus La moyenne de temps de chaque pilote sur le pneu actuel Le nombre de points que chaque pilote gagnerait selon sa position Le classement de la course Voire m\u00eame si c'est possible : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents Pr\u00e9dire les temps au tour de chaque pilote selon l'usure des pneus Voici un exemple d'interface possible pour une page : \"Protype de l'app fait sur Figma\" Cas d'utilisation '*'On va consid\u00e9rer que tous les user ont un abonnement F1 TV PRO Un user veut r\u00e9cup\u00e9rer les data : Il ouvre son navigateur et lance la page DATA de la F1 TV Il calibre la capture des data via le programme (pour la premi\u00e8re utilisation). Il confirme que les donn\u00e9es initiales sont bonnes (pour la premi\u00e8re utilisation). Il regarde tranquille son Grand Prix Le programme r\u00e9cup\u00e8re les data : Il r\u00e9cup\u00e8re des images depuis la F1TV Il utilise Tesseract (ou autre) pour en r\u00e9cup\u00e9rer les infos. Il met ces infos dans un Objet Pilote, dans un Objet course avec un attribut tour pour hi\u00e9rarchiser les data Pour ce qui est de l'affichage, l'id\u00e9e est de faire une application C# comme on l'a appris \u00e0 l'\u00e9cole, mais avec assez de style pour qu'elle puisse \u00eatre agr\u00e9able \u00e0 utiliser. Quand le programme affiche les data : Il prend les donn\u00e9es venant directement de la F1TV. Il affiche diff\u00e9remment les donn\u00e9es pour permettre une meilleure lisibilit\u00e9 Il interpr\u00e8te avec des r\u00e8gles plut\u00f4t simples certaines data pour faire des minipr\u00e9dictions ou aider \u00e0 la lecture Il r\u00e9cup\u00e8re des infos d'autres courses pour les comparer et proposer des pr\u00e9dictions plus int\u00e9ressantes Difficult\u00e9s techniques R\u00e9cup\u00e9rer un flux vid\u00e9o plut\u00f4t propre malgr\u00e9 les contres mesures de la F1 TV pour en emp\u00eacher la lecture par un logiciel Si on doit passer par une capture d'\u00e9cran, trouver un moyen de stocker les donn\u00e9es de mani\u00e8re \u00e0 pr\u00e9voir que parfois un tour pourrait avoir plus de donn\u00e9es qu'un autre, que le user peut mettre pause, ou m\u00eame qu\u2019il revienne en arri\u00e8re. D\u00e9velopper des algorithmes pour r\u00e9cup\u00e9rer les donn\u00e9es comme les diff\u00e9rents pneus utilis\u00e9s ou l'activation du DRS ainsi que d\u00e9velopper des moyens de nettoyer les r\u00e9sultats de l'OCR (Par exemple utiliser diff\u00e9rents champs redondants pour comparer les r\u00e9sultats) Stocker les donn\u00e9es sur une base pour les traiter plus tard tout en pr\u00e9voyant un moyen de voir les stats live D\u00e9velopper des algorithmes de pr\u00e9diction qui prennent en compte d'anciennes courses pour tenter de pr\u00e9dire des choses comme les arr\u00eats aux stands par exemple. Diff\u00e9rences sur le cahier des charges Ici je vais parler de l'\u00e9t\u00e2t du projet \u00e0 la date du 12 Juin 2023. A cette date, le projet est fonctionel mais comporte quelques diff\u00e9rences avec le cahier des charges original. Je vais expliquer non seulement ces diff\u00e9rences mais aussi les raisons qui font qu'elles sont la. Pour bien comprendre les diff\u00e9rences il faut s'en r\u00e9f\u00e8rer au cahier des charges original. L'application doit \u00eatre \"Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes\". C'est ca la phrase la plus importante dans tout le CDC. Et je pense que tr\u00e8s honn\u00eatement, ce cahier des charges est rempli ! L'application actuellement disponible sur le r\u00e9po GIT est une application de style compagnion Windows Forms qui r\u00e9cup\u00e8re les infos de la F1TV en temps r\u00e9el et elle affiche les informations qu'elle trouve importante. Donc je dirais que l'objectif g\u00e9n\u00e9ral est remplis. Maintenant c'est dans les d\u00e9tails que cela p\u00eache. Il est mentionn\u00e9 trois exemples d'infos \u00e0 suivre je cite : \"Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre).\" \"Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps\" \"Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand\" r\u00e9sultats : Dans l'application on peut effectivement voir les pilotes proches (Ce sont ceux qui sont \u00e0 moins de 3 secondes dans le version finale) Dans l'application on peut aussi voir un affichage qui permet de voir les pilotes les plus rapides et les plus lents sur le circuit. On ne peut en revanche pas voir de classement pond\u00e9r\u00e9 selon les arr\u00eats aux stands car l'application a du mal \u00e0 detecter des arr\u00eats. Ensuite pour ce qui est des pr\u00e9dictions il n'y en a aucunes comme ca c'est simple. Si on ne regarde que de tr\u00e8s loin le CDC et le projet final on pourrait dire que c'est plut\u00f4t d\u00e9cevant car il manque beaucoup de choses comme les pr\u00e9dictions et certains affichages. On peut aussi se dire ca en comparant la maquette du CDC et le r\u00e9sultat final. \"Maquette originale du projet faite sur Figma\" \"Maquette originale du projet faite sur Figma\" Clairement un oeuil non avis\u00e9 pourrait \u00eatre tr\u00e8s d\u00e9cu et pourrait dire que c'est un echec. Et moi je vais vous expliquer pourquoi au contraire c'est un total succ\u00e8s. D\u00e9ja, la beaut\u00e9 de l'interface est tr\u00e8s difficile a r\u00e9pliquer en Windows Forms et il faudrait plus d'une semaine de travail pour arriver \u00e0 quelque chose qui pourrait ressembler un tout petit peu \u00e0 la maquette. Ensuite, si on regarde bien, on a quand m\u00eame une application qui nous permet de suivre les informations de la course et qui calcule des choses \u00e0 notre place. C'est d\u00e9ja une grosse plus-value par rapport \u00e0 la page Data de la F1TV. Et finalement, les pr\u00e9dictions, les affichages et le style ce sont les choses les moins compliqu\u00e9es du projet. On ne se rends pas compte que pour simplement afficher les 20 pilotes dans le bon ordre il faut \u00e9norm\u00e9ment de travail. Voici une petite repr\u00e9sentation graphique de la quantit\u00e9 de travail nescessaire pour en arriver \u00e0 l'\u00e9t\u00e2t actuel du projet : \"Graphique repr\u00e9sentant la quantit\u00e9 de travail requise\" Pour en arriver \u00e0 un affichage il a fallu r\u00e9cup\u00e8rer automatiquement les images en utilisant un browser headless ce qui a pris un temps fou \u00e0 mettre en place et il a fallu surtout lire les informations que l'on recevait des images. J'ai pass\u00e9 presque 90% du temps de mon projet \u00e0 d\u00e9velopper des choses qui permettront ensuite de faire de l'affichage. Le fait qu'il y aie quoi que ce soit de logique qui s'affiche cela veut dire que TOUT LE RESTE fonctionne ! Le moindre soucis \u00e0 la r\u00e9cup\u00e9ration des images, ou surtout \u00e0 la reconnaissance de texte et de chiffres et l'affichage est ruin\u00e9. Si j'avais pass\u00e9 ne serait-ce qu'une semaine de plus juste sur l'affichage le r\u00e9sultat final n'aurait rien \u00e0 voir. Le soucis c'est simplement que le cahier des charges ne parle pas du tout du reste du projet et ne parle que du r\u00e9sultat final. Pour toutes ces raisons je dirais que le CDC \u00e9tait trop superficiel mais que l'application est conforme \u00e0 l'id\u00e9e g\u00e9n\u00e9rale de ce dernier et qu'il serait tr\u00e8s facile de la rendre parfaitement conforme maintenant que tout le travail de fond a \u00e9t\u00e9 fait et fonctionne et je pense donc que c'est un succ\u00e8s. Planning pr\u00e9visionnel Mes suiveurs m'ont demand\u00e9 un planning de type GANTT pour ce travail de dipl\u00f4me Je n'ai pas utilis\u00e9 un logiciel particulier pour faire ce dernier, mais je me suis inspir\u00e9 des principes fondamentaux d'un diagramme de ce type. Comme l'original a \u00e9t\u00e9 fait sur Excel, je ne peux pas vraiment l'ins\u00e9rer de mani\u00e8re lisible ici, mais il est disponible dans le dossier Planning. Mais voici un r\u00e9sum\u00e9 de son contenu : T\u00e2ches J'ai d\u00e9cid\u00e9 de d\u00e9composer mon planning en trois grands types de t\u00e2ches. Programmation Documentation Tests L'id\u00e9e est de permettre une meilleure lisibilit\u00e9 et de me permettre \u00e0 moi de me faire plus facilement \u00e0 l'id\u00e9e de ce qu'il m'attend. Voici la liste des t\u00e2ches par rubrique : PT Cette rubrique contient les t\u00e2ches qui n'ont pas leur place dans les trois cat\u00e9gories principales. PT1 / pr\u00e9paration au travail de dipl\u00f4me (2) Cette t\u00e2che est un peu hors cat\u00e9gorie, mais c'est normal, c'est une supert\u00e2che qui regroupe beaucoup de choses. C'est une t\u00e2che qui est planifi\u00e9e pour deux jours et qui normalement devrait \u00eatre faite les deux premiers jours du travail. Le but est de pr\u00e9parer tout ce qui peut \u00eatre pr\u00e9par\u00e9 en avance niveau documentation et mise en place pour ne pas avoir besoin de s'en soucier ensuite. DT Rubrique documentation qui contient toutes les t\u00e2ches en rapport de pr\u00e8s ou de loin avec la documentation du projet. DT1 Cr\u00e9ation du poster (1) Cette t\u00e2che consiste \u00e0 faire une version num\u00e9rique du poster qui soit en accord avec les consignes qu'on nous a donn\u00e9es. Le but est aussi et surtout de faire poster dont je sois fier et que je sois content de montrer. Il y a d\u00e9j\u00e0 des croquis de poster et j'ai clairement pr\u00e9vu de travailler sur \u00e7a pendant les vacances alors, je n'ai mis qu'un jour et je l'ai plac\u00e9 juste avant le rendu de ce dernier. DT2 Documentation Analyse de l'existant (2) Cette t\u00e2che est d\u00e9di\u00e9e \u00e0 l'\u00e9criture de la documentation et plus pr\u00e9cis\u00e9ment de l'analyse de l'existant. Comme il y a pas mal de technologies utilis\u00e9es dans mon projet, j'aimerais faire correctement un vrai debrief de pourquoi j'ai utilis\u00e9 l'une ou l'autre alors, j'ai assign\u00e9 deux jours dessus. DT3 Documentation Analyse organique (5) Cette t\u00e2che est la plus grosse dans la cat\u00e9gorie documentation. Il s'agit de documenter comment l'application fonctionne. J'y ai mis cinq jours et je pense que c'est un minimum car c'est dans cette t\u00e2che que je vais devoir d\u00e9tailler exactement comment fonctionne chaque partie du projet. Ces cinq jours sont \u00e9parpill\u00e9s sur le projet en g\u00e9n\u00e9ral \u00e0 la fin du d\u00e9veloppement de chaque grande partie de projet. Le but est de ne rien oublier et de ne pas avoir \u00e0 tout faire en m\u00eame temps. DT4 Documentation Analyse fonctionnelle (2) Cette t\u00e2che est d\u00e9j\u00e0 moins grosse, elle consiste \u00e0 documenter le fonctionnement de l'application et comment utiliser les composants que j'ai d\u00e9velopp\u00e9s. Je l'ai mis en fin de projet, car comme j'ai l'habitude de faire des analyses fonctionnelles plut\u00f4t pr\u00e9cises, le moindre changement dans l'UI peut tout rendre obsol\u00e8te. J'y ai mis deux jours, car j'aimerais correctement documenter avec de bonnes photos et sc\u00e9narios pour qu'on puisse voir toutes les possibilit\u00e9s de l'application. DT5 Documentation Tests (1) Cette t\u00e2che est un peu plus petite qu'elle ne le devrait. Elle concerne la documentation des diff\u00e9rents tests. Je n'y ai mis qu'un seul jour, car en r\u00e9alit\u00e9 les diff\u00e9rentes t\u00e2ches de tests contiennent aussi beaucoup de documentation, DT6 Documentation Reste (2) Cette t\u00e2che est une t\u00e2che un peu vague. Elle contient toutes les actions autres que j'aurai besoin de faire (Mise au propre, orthographe, g\u00e9n\u00e9ration de PDF ...). J'y ai mis deux jours pour avoir un peu de marge, car ce sont toujours des t\u00e2ches qui paraissent faciles, mais qui \u00e0 la fin prennent beaucoup de temps si on les fait bien. PT Rubrique programmation qui contient toutes les t\u00e2ches qui touchent \u00e0 la programmation et au d\u00e9veloppement de l'application. PT1 Programmation r\u00e9cup\u00e9ration des images (3) Cette t\u00e2che est estim\u00e9e \u00e0 seulement trois jours, il ne faut pas s'y m\u00e9prendre, c'est une des t\u00e2ches les plus dures et lourdes niveaux documentation en explications. Cependant, un POC (Proof Of Concept) assez avanc\u00e9 a d\u00e9j\u00e0 \u00e9t\u00e9 fait et donc cela permet de n'envisager que trois jours, car il suffit de l'impl\u00e9menter et de la paufinner. Cette t\u00e2che consiste \u00e0 prendre en entr\u00e9e un lien de Grand Prix et de sortir une image tous les x secondes de la page DATA. Cela peut sembler simple, mais pour le faire sans prendre d'espace d'\u00e9cran et ne demandant pas \u00e0 l'utilisateur de copier-coller quoi que ce soit o\u00f9 de donner ses identifiants F1TV c'est un challenge. Cela peut paraitre curieux alors de mettre cette t\u00e2che loin dans le planning m\u00eame si c'est la premi\u00e8re \u00e9tape du projet. Encore une fois cela s'explique avec le fait qu'il y a d\u00e9j\u00e0 un POC qui fonctionne \u00e0 peu pr\u00e8s et que donc pr\u00e9f\u00e8re commencer avec des t\u00e2ches plus incertaines dans le cas o\u00f9 elles prendraient plus de temps que pr\u00e9vu. PT2 Programmation OCR (5) Cette t\u00e2che consiste \u00e0 d\u00e9velopper la partie qui reconnait le texte sur les images. C'est tr\u00e8s certainement la t\u00e2che qui risque le plus de d\u00e9border car c'est celle qui est la plus complexe techniquement puisqu'elle demande non seulement la lecture sur image, mais aussi le d\u00e9veloppement d'algorithmes de traitement de cette donn\u00e9e pour \u00eatre s\u00fbr qu'elle a bien \u00e9t\u00e9 lue. J'y ai ainsi allou\u00e9 cinq jours, mais j'esp\u00e8re que j'arriverai \u00e0 gagner du temps sur les autres pour y allouer plus dans le planning effectif, car je suis convaincu que plus, on y passe du temps, meilleur sera le r\u00e9sultat. PT3 Programmation, stockage et mod\u00e8le (5) Cette partie est moins technique, mais concerne le stockage des donn\u00e9es que nous retourne la lecture des images. Mais elle va demander de la r\u00e9flexion et de l'intelligence de programmation, car il faut que cette partie anticipe les besoins de la vue et pr\u00e9pare un terrain fertile qui ne demande pas un refactor quand on passera au d\u00e9veloppement de la vue. C'est pour cela que je lui ai aussi assign\u00e9 cinq jours de travail et elle doit absolument \u00eatre commenc\u00e9e apr\u00e8s la lecture. PT4 Programmation Vue de l'APP (5) Cette partie peut \u00eatre horrible comme tr\u00e8s facile, cela d\u00e9pend compl\u00e8tement de la qualit\u00e9 du travail avant. Si le mod\u00e8le est parfait et que les donn\u00e9es sont int\u00e8gres, cela devrait \u00eatre plut\u00f4t simple de les afficher de mani\u00e8re int\u00e9ressante. Cependant, cette partie d\u00e9bordera s\u00fbrement un peu, car tout le temps gagn\u00e9 avec de bonnes donn\u00e9es sera utilis\u00e9 pour tenter de faire de la pr\u00e9diction. Pour ces raisons, je lui ai assign\u00e9 \u00e9galement cinq jours de travail et elle doit absolument \u00eatre faite apr\u00e8s le mod\u00e8le. PT5 Programmation mise en commun (3) Cette t\u00e2che est aussi un petit peu sp\u00e9ciale, car elle regroupe plusieurs choses. En gros, chaque partie de programmation sera s\u00fbrement assez ind\u00e9pendante et il faudra \u00e0 un moment faire un seul projet C# qui contient tout. Il est difficile d'estimer \u00e0 quel point cela va \u00eatre compliqu\u00e9 alors, j'ai \u00e9t\u00e9 conservateur et j'ai mis trois jours. TT Cette rubrique contient les t\u00e2ches qui sont uniquement des tests. La plupart des t\u00e2ches de programmations contiennent d\u00e9j\u00e0 des tests, mais certaines demandent une attention particuli\u00e8re. TT1 Tests OCR (2) Cette t\u00e2che est une des t\u00e2ches les plus importantes. Son but est de faire un protocole de tests complet qui permette de comparer les diff\u00e9rents algorithmes de reconnaissance de texte. Je l'ai mise apr\u00e8s la reconnaissance, mais m\u00eame maintenant en \u00e9crivant ces lignes, je me dis que dans le planning effectif, elle sera faite pendant la t\u00e2che de programmation. En effet, comment savoir si mon tout nouvel algorithme est r\u00e9ellement mieux que le pr\u00e9c\u00e9dent. Je pr\u00e9vois deux jours, car je pense que faire le dataset va prendre beaucoup de temps, il faut pr\u00e9voir un certain nombre d'images et de texte qui pourront ensuite \u00eatre donn\u00e9es sous forme de tests. C'est certes une t\u00e2che de test, mais c'est aussi de la programmation. TT2 Tests finaux (2) Cette t\u00e2che de tests est un peu vague, elle regroupe les diff\u00e9rents tests pour v\u00e9rifier que les donn\u00e9es sont bien affich\u00e9es correctement. Ce qui serait cool si j'ai du temps en fin de travail de dipl\u00f4me serait de faire un syst\u00e8me de test qui permet d'entrainer le programme \u00e0 mieux reconnaitre certaines choses comme des arr\u00eats aux stands si on lui donne les trois derni\u00e8res ann\u00e9es de grands Prix. J'ai mis une dur\u00e9e arbitraire de deux jours, mais je ne sais pas vraiment combien de temps cela va vraiment durer. Elle est \u00e9videmment \u00e0 effectuer une fois que tout est \u00e0 peu pr\u00e8s termin\u00e9. Planning effectif et diff\u00e9rences Alors ! Ces lignes sont \u00e9crites dans les derniers jours du travail de dipl\u00f4me et j'ai des choses \u00e0 dire. Premi\u00e8rement je suis plut\u00f4t content de mon estimation du travail. Je trouve que j'ai bien estim\u00e9 la quantit\u00e9 de travail et combien de temps les diff\u00e9rentes t\u00e2ches allaient prendre. La plupart des d\u00e9passements sont des impr\u00e9vus et/ou des allers et retours entre d'autres t\u00e2ches. La raison pour laquelle je suis plut\u00f4t content de ma planification, c'est que malgr\u00e9 l'usine \u00e0 Gaz que repr\u00e9sente ce projet et le nombre de soucis que j'ai eu, j'ai quand m\u00eame pu arriver \u00e0 un projet qui fonctionne en suivant plut\u00f4t fid\u00e8lement le planning. Une chose dont je suis plut\u00f4t fier c'est la documentation. En ayant d\u00e9velopp\u00e9 le squelette de l'app d\u00e8s le d\u00e9but du projet ca m'a permis d'avancer au fur et \u00e0 mesure du projet la conscience tranquille. Bon c'est bien joli les fleurs mais clairement c'est loin d'\u00eatre parfait. Au moment de la planification je n'avais pas pr\u00e9vu de faire des allers et retours entre plusieurs t\u00e2ches. Dans le planning effectif on peut voir que un jour je suis sur la PT3 (Stockage) et la PT5 (regroupement des mini projets en un seul gros). J'aurais peut-\u00eatre du inverser l'ordre. Mais il y a deux gros soucis dans mon planning : L'ordre des t\u00e2ches n'\u00e9tait pas bon (mais il a \u00e9t\u00e9 d\u00e9cid\u00e9 comme ca pour que les plus grosse difficult\u00e9es soient faites en premier) ce qui a cr\u00e9\u00e9 pas mal de soucis. Ex : L'\u00e9mulateur de la F1TV a \u00e9t\u00e9 fait tr\u00e8s tard et au final les images r\u00e9cup\u00e8r\u00e9es n'\u00e9taient pas de la m\u00eame qualit\u00e9 que ce que j'avais pr\u00e9vu en d\u00e9veloppant l'OCR en premier. Les Tests ont \u00e9t\u00e9 n\u00e9glig\u00e9s et utilis\u00e9s comme des jours tampons. Ca c'est la plus grosse erreur de planning. Autant les autres sont p\u00e9nibles etc... mais n'ont pas forc\u00e9ment compromis la bonne r\u00e9alisation du projet alors que la les tests ont \u00e9t\u00e9 mal plac\u00e9s et ont au final \u00e9t\u00e9 balay\u00e9s alors que si ils avaient \u00e9t\u00e9 mieux planifi\u00e9s ca ne serait pas arriv\u00e9. Solutions : L'ordre des t\u00e2ches a \u00e9t\u00e9 d\u00e9cid\u00e9 expr\u00e8s de cette facon pour \u00e9viter de prendre trop de risques. L'id\u00e9e \u00e9tait qu'en faisant le plus dur au d\u00e9but, je pourrai facilement changer le cahier des charges. J'ai envie de dire que j'aurais d\u00fb \u00eatre plus confiant mais pour \u00eatre honn\u00eate je pense que c'\u00e9tait un mal pour un bien. Je ne pense pas avoir \"bien\" fait mais je pense que c'est une erreur qui \u00e9tait rentable pour mon niveau de stress dans le projet. Par contre les Tests c'est tout simplement une erreur. J'en parle plus en d\u00e9tail dans la partie test de la documentation mais je vais r\u00e9sumer un peu ici. La documentation a \u00e9t\u00e9 faite d\u00e8s le d\u00e9but du projet. J'ai mis en place le squelette pour qu'ensuite il soit simple d'y ajouter au fur et \u00e0 mesure. J'aurais dur faire exactement pareil avec les tests. Si j'avais fait au moins le squelette des tests au d\u00e9but du projet j'aurais pu beaucoup plus facilement en faire et cela m'aurait fait gagner un temps fou et j'aurais m\u00eame pu faire du TDD (Test Driven Developpement). Je suis persuad\u00e9 que cette b\u00eate erreur de planification m'a c\u00f4ut\u00e9 tr\u00e8s ch\u00e8re car ne pas avoir une bonne strat\u00e9gie de tests a du me faire perdre un temps fou. Pour conclure je suis content car j'ai r\u00e9ussi \u00e0 rendre un projet qui marche en suivant assez bien le planning mais il y a des choses que je vais devoir changer dans mes prochains projets. Analyse fonctionnelle Voir \"Manuel Utilisateur\" tout y est indiqu\u00e9 Analyse Organique Outils utilis\u00e9s Visual Studio 2022 \"Logo de Visual Studio 2022\" C'est l'application que j'ai le plus utilis\u00e9 je pense. Visual Studio 2022 est l'IDE officiel de Microsoft pour coder en C#. C'est l'outil que j'utilise depuis maintenant 6 ans au CFPT et franchement il fait tout ce que je pourrais vouloir. C'est aussi un outil pratique pour utiliser Windows Forms et faire des applications natives Windows. Pas grand chose \u00e0 dire \u00e0 ce sujet \u00e0 part que c'est un outil qui marche bien et qui est gratuit si on prend la community edition. Visual Studio Code \"Logo de Visual Studio Code\" Cet outil est d\u00e9ja un peu plus int\u00e9ressant. C'est le second outil que j'ai le plus utilis\u00e9. J'en ai surtout eu besoin pour \u00e9crire de la doc, mais aussi pour coder en python et pour contr\u00f4ler mkdocs. Visual Studio est un IDE absolument g\u00e9nial qui est tr\u00e8s puissant avec les bonnes extensions. Je l'utilise au quotidien pour tout ce qui est d\u00e9veloppement WEB, Mobile ou pour \u00e9diter des fichiers de configs pour mes drones ou imprimantes 3D. Je peux m\u00eame compiler le firmware pour ces derni\u00e8res en utilisant une extension faite pour. Les possibilit\u00e9s de customisation sont presques infinies et c'est un plaisir d'utiliser ce logiciel gratuit fournis par Microsoft mais qui est am\u00e9lior\u00e9 constamment par des d\u00e9veloppeurs ind\u00e9pendants. Je conseille \u00e0 nimporte quel d\u00e9veloppeur de l'essayer \u00e0 moins qu'il soit uniquement sur C# ou il serait plus int\u00e9ressant d'utiliser visual studio 2022 Material/Mkdocs/Markdown \"Logo de Mkdocs Materials\" Pendant ce projet j'ai utilis\u00e9 exclusivement du markdown avec l'aide de Mkdocs et Materials. Le choix de Markdown a \u00e9t\u00e9 plut\u00f4t simple, c'est une facon facile et efficace de cr\u00e9er de la documentation et on n'avait pas le choix de l'utiliser. On avait \u00e9galement l'obligation (Ou au moins un tr\u00e8s forte incitation) par nos professeurs d'utiliser mkdocs et materials pour que notre documentation ne soit pas simplement une liste de fichiers mais un joli site dans lequel il est agr\u00e9able de chercher des informations. Mkdocs et Materials sont deux outils vraiment fantastiques mais je dois avouer que je n'ai pas assez mis de temps pour apprendre tout leur potentiel. Pour moi ce sont simplement des outils et je veux qu'ils marchent. Je ne suis pas forc\u00e9ment du genre \u00e0 aller changer toutes les couleurs et polices pour avoir la doc parfaite, j'ai pr\u00e9f\u00e9r\u00e9 passer du temps sur mon app. Mais m\u00eame si ces outils offrent une customisation tr\u00e8s avanc\u00e9e, il est tr\u00e8s facile de cr\u00e9er un projet simple et j'aime beaucoup cette simplicit\u00e9. J'ai eu pas mal d'aide de la part de M.Briard pour impl\u00e9menter certaines features et je l'en remercie tr\u00e8s chaudement car sans son aide ce document serait s\u00fbrement un peu moins facile \u00e0 lire (Oui oui ca aurait pu \u00eatre pire, je sais c'est dur \u00e0 imaginer) Figma \"Logo de Figma\" Figma est l'outil que j'ai utilis\u00e9 pour cr\u00e9er mon poster et un certain nombre des diagrammes de cette documentation. J'utilise aussi cet outil d\u00e8s que je vais faire des maquettes de sites ou d'applications. D'ailleurs les maquettes dans le cahier des charges ont \u00e9t\u00e9 faites avec. C'est un outil en ligne parfaitement gratuit qui conserve tout dans le cloud. Franchement je n'ai rien \u00e0 dire, je n'ai pas utilis\u00e9 plus de 15% des features que cet outil propose et je suis d\u00e9ja conquis. Technologies utilis\u00e9es Dans ce projet diff\u00e9rents choix ont \u00e9t\u00e9 faits pour ce qui est des technologies. Certaines ont \u00e9t\u00e9 choisies car elles \u00e9taient les plus simples, les plus pratiques, les plus efficaces ou encore les plus connues et donc ayant le meilleur support. Je vais tenter de r\u00e9sumer ici ces choix mais je reviendrai sur la plupart d'entre eux plus tard quand j'explique ce que je fais avec. Selenium \"Logo de selenium\" Selenium est une librairie \u00e0 la base Node JS qui permet d'automatiser des actions sur un navigateur internet. Le but premier et je pense son utilisation premi\u00e8re est l'automatisation de tests pour des applications WEB. En effet c'est un super outil pour simuler un user faisant un certain nombre d'actions sans apporter de variabilit\u00e9 ce qui fait de supers test unitaires. Cependant je pense que l'autre grande partie des utilisateurs de Selenium l'utilisent pour faire du \"Scrapping\". Et nous sommes un peu dans cette seconde cat\u00e9gorie. Le \"Scrapping\" c'est l'acte d'aller r\u00e9cup\u00e8rer des informations sur des pages web automatiquement pour alimenter sa propre base de donn\u00e9es. En effet, si on arrive \u00e0 passer les protections anti-bot on peut facilemnt utiliser Selenium pour scraper tous les sites qui nous passent par la t\u00eate. Le cahier des charges que j'avais en t\u00eate en cherchant une technologie de contr\u00f4le de navigateur internet \u00e9tait le suivant : Simple Permettant de contr\u00f4ler un navigateur Headless (Voir chapitre \"Simuler un navigateur ?\") Permettant de contr\u00f4ler firefox Ayant un wrapper C# Permettre de changer certaines choses comme les cookies en Live Permettre d'interagir avec les \u00e9l\u00e9ments d'une page Fonctionner Simple car je ne voulais pas avoir \u00e0 passer trop de temps dessus (ca n'a pas bien vieillit lol...). Je voulais que l'on puisse utiliser Firefox car il n'impl\u00e9mente pas les m\u00eames s\u00e9curit\u00e9es que Chrome pour faire simple. J'avais besoin que la lib puisse contr\u00f4ler un Firefox HEADLESS car je ne voulais pas avoir une page web ouvert sur mon ordi quand je commente car c'est de l'espace utilis\u00e9 pour rien. J'avais besoin d'un wrapper C# car c'est le language que j'utilise. Pour finir j'avais besoin d'interragir avec les \u00e9l\u00e9ments de la page pour naviguer dessus et d'ins\u00e8rer des cookies pour me connecter sans avoir \u00e0 passer par le login de la F1TV qui est tr\u00e8s bon pour detecter les bots. Avec un cahier des charges parreil beaucoup de librairies ont \u00e9t\u00e9 abandonn\u00e9es. J'ai pu tester pleins de librairies C# qui arrivaient \u00e0 contr\u00f4ler un Chrome et m\u00eame pas mal qui arrivaient \u00e0 contr\u00f4ler un Chrome Headless. Mais le choix est tr\u00e8s vite restreind quand on veut pouvoir contr\u00f4ler Chrome OU Firefox. A la base mon choix c'\u00e9tait port\u00e9 sur Puppeteer Sharp qui est une librairie qui se veut \u00eatre exactement ce que je veux. \"Logo de Pupeteer\" Je voulais utiliser cette librairie car il y a des plugins qui sont tr\u00e8s orient\u00e9s scrapping, en effet, ils impl\u00e9mentent de nombreuses techniques pour permettre de mieux passer innapercu par les syst\u00e8mes de detection de bots. Sur le papier c'est la librairie parfaite qui correspond parfaitement au cahier des charges que je m'\u00e9tais fix\u00e9 et je pense que si j'utilisais un projet JS elle le serait. Sauf que avec le wrapper C# j'ai eu un certain nombre de probl\u00e8mes: Toutes les versions de la librairie ne fonctionnaient pas. Il fallait faire des tests avec diff\u00e9rentes versions de la librairie et de ses d\u00e9pendences simplement pour faire d\u00e9marrer un browser. Et ca c'est quand ca marchait car il y avait des jours ou des machines ou je n'ai simplement pas pu faire fonctionner la librairie. M\u00eame avec les techniques propos\u00e9es par les plugins \"Stealth\" je n'arrivais pas \u00e0 bypass les s\u00e9curit\u00e9es de la page de login de la F1TV. J'ai essay\u00e9 tout ce que j'ai pu trouver sur internet mais on se fait toujours chopper d\u00e8s que l'on arrive sur la page. Et le pire de tout, impossible de faire fonctionner un vid\u00e9o. J'ai pu faire tout ce que je voulais faire au final en passant par l'utillisation de cookies pour la connexion. Tout ca pour arriver au moment ou il faut lancer la vid\u00e9o, et la, crash. Impossible de faire fonctionner Puppeteer Sharp avec une vid\u00e9o. D\u00e8s qu'elle se lance c'est un crash assur\u00e9 sans message d'erreur clair. Et le soucis c'est que le wrapper C# n'est pas vraiment bien support\u00e9 et que si c'est un bug de la lib je ne risque pas de voir de fix avant un moment si ce n'est jamais. Pour toutes ces raisons, j'ai du abandonner cette librairie ce qui a \u00e9t\u00e9 tr\u00e8s dur car j'avais pass\u00e9 beaucoup de temps dessus \u00e0 essayer de la faire marcher. Ensuite le choix de Selenium \u00e9tait plut\u00f4t simple, c'\u00e9tait la seule option restante. A ce jour je ne connait aucune autre librairie que Puppeteer ou Selenium qui puisse contr\u00f4ler un Firefox Headless en respectant mon cahier des charges et qui soit donc disponible depuis C#. Si je n'arrivais pas \u00e0 faire fonctionner Selenium j'aurai du abandonner l'id\u00e9e de simuler un navigateur tout simplement. Mais j'ai eu la chance que cette librairie fasse tout ce que je pouvais demander. C'est une super lib et m\u00eame si la version C# n'est vraiment pas bien document\u00e9e, la plupart des documentations de la version JS sont pertinentes pour al version C# m\u00eame si ca n'est pas la m\u00eame syntaxe. Pour r\u00e9sumer, j'ai choisis Puppeteer car c'\u00e9tait la seule option viable pour mon besoin. (Note : Par contre si je trouve la personne chez mozilla ou puppeteer qui a d\u00e9cid\u00e9 d'hardcoder la r\u00e9solution maximale du browser Headless que l'on peut override UNIQUEMENT en changeant les variables d'environnement de la machine ET DE NE LE DOCUMENTER QUASI NULLE PART JE JURE QUE CA VA TRES MAL SE PASSER) CSharp \"Logo C#\" Je pense que c'est le choix le plus simple \u00e0 expliquer. C# est un language de programmation orient\u00e9 objet relativement haut niveau qui a \u00e9t\u00e9 cr\u00e9\u00e9 par Microsoft et qui a comme cible le developpement d'applications pour Windows. (On peut evidemment trouver des adaptations pour le faire tourner sur Linux mais ce n'est pas vraiment le but du language) En plus d'\u00eatre un superbe language de programmation, c'est le language que l'on apprend au CFPT informatique. C'est donc un language avec lequel je suis beaucoup plus \u00e0 l'aise que pour d'autres languages comme le Python ou le JS. Mon but n'\u00e9tait pas de faire une application Web et je travaille sous Windows. Je savais que mon projet allait demander un minimum de programmation orient\u00e9e objet. J'ai donc imm\u00e9diattement pens\u00e9 \u00e0 utliser C#. Cependant j'aurais tr\u00e8s bien pu utiliser un language comme python qui m'aurait clairement facilit\u00e9 la t\u00e2che avec des librairies bien plus fournies et plus souvent mises \u00e0 jour. Mais comme je ne suis pas du tout aussi \u00e0 l'aise avec je pense que le C# \u00e9tait la meilleure option. Mes seuls regrets apr\u00e8s coup sont que je trouve les Windows Forms tr\u00e8s moches et qu'il est particuli\u00e8rement difficile de les rendres plus jolies et que les librairies disponibles en C# pour des sc\u00e9narios tr\u00e8s pr\u00e9cis ne sont pas au niveau de celles pour JS et pour Python. Cependant si j'avais \u00e0 refaire le projet je reprendrais C# je pense. Python? \"Logo Python\" Alors ce choix la est plus commpliqu\u00e9 \u00e0 comprendre. Pour tout le projet j'ai tent\u00e9 de garder le C# comme language et de ne pas utiliser autre chose. Cependant j'ai du utiliser une seule fois le Python dans un cas tr\u00e8s pr\u00e9cis. Je n'aime vraiment pas coder en python de base et clairement j'aurais pr\u00e9f\u00e8r\u00e9 ne pas l'utiliser mais je n'avais pas le choix. Le besoin dans le cas du python \u00e9tait le suivant : J'avais besoin d'un moyen de r\u00e9cup\u00e8rer des strings et les d\u00e9coder avec une cl\u00e9 encod\u00e9e avec le syst\u00e8me propri\u00e9taire de windows d'encodage. Le soucis que j'avais avec le C# c'est que les methodes de decryption ne fonctionnent pas pareil que en python et tous les exemples que je pouvais trouver \u00e9taient en python. J'ai essay\u00e9 pendant un sacr\u00e9 moment de faire fonctionner la decryption en C# mais sans succ\u00e8s. J'ai donc directement utilis\u00e9 le python comme faisait toutes les personnes que je pouvais voir sur internet et je pense que ca n'est pas une mauvaise id\u00e9e. En effet, cela veut dire que si \u00e0 un moment Chrome est mis \u00e0 jour, je n'aurai pas besoin d'aller ouvrir tout le code source de mon projet pour tout recompiler, j'aurai simplement besoin de changer ce script. Un des avantages du Python est quand m\u00eame qu'il y beaucoup plus de gens qui codent dessus, et pour ce genre d'utilisation tr\u00e8s sp\u00e9cifiques c'est plut\u00f4t pratique. Le seul probl\u00e8me c'est que cela oblige l'utilisateur \u00e0 avoir python install\u00e9 sur sa machine et que sa version doit \u00eatre compatible... (les joies de python) Firefox \"Logo Firefox Headless\" J'en parle deja plus bas, mais le choix de navigateur est super important. Deja tous les navigateurs n'ont pas un mode Headless(sans t\u00eate, mieux expliqu\u00e9 dans la rubrique \"Simuler un naviguateur ?\"). Par exemple, m\u00eame si Edge est maintenant bas\u00e9 sur chromium, il n'existe pas de moyen de le faire tourner en Headless pour le moment. Autre soucis, les librairies d'automatisation ne supportent pas tous les navigateurs. Par exemple, beaucoup supportent chrome mais tr\u00e8s peu supportent Firefox ou Edge. Donc il me fallait un navigateur qui puisse op\u00e8rer en Headless et qui soit support\u00e9 par plusieurs librairies d'automatisation. Il n'y a que Firefox et Chrome qui sont conforme \u00e0 ces exigeances (Je n'ai pas verifi\u00e9 pour TOUS les navigateurs. Peut-\u00eatre que les Opera GX ont aussi un mode headless super, mais je me suis concentr\u00e9 sur les navigateurs plus grand public). Chrome est support\u00e9 par plus de lib, mais le soucis c'est que la F1TV utilise un lecteur de vid\u00e9o avec DRM (Plus d'infos la dessus dans la partie \"Simuler un navigateur?\") et donc le choix \u00e9tait simple. Il ne restait que Firefox. Tesseract Je pense que le choix le plus simple apr\u00e8s le C# fut l'utilisation de Tesseract. C'est tout simplement l'outil le plus utilis\u00e9 pour faire de l'OCR. A la base c'est une lib Python (Ah tiens encore ?) qui peut \u00eatre redoutablement efficace avec le bon dataset. Il existe d'autres outils mais j'ai d\u00e9cid\u00e9 de prendre celui la \u00e0 cause de son support juste incroyable et de son omnipr\u00e9sence dans la documentation OCR. En plus il est facile \u00e0 utiliser et je ne pense pas encore avoir fait le tour de tout son potentiel dans ce projet. Fonctionnement g\u00e9n\u00e9ral Avant de passer \u00e0 l'explication de chaques parties du projet en d\u00e9tail, je pense qu'il est important de faire un petit point sur comment toutes les parties du projet s'emboitent et fonctionnement ensemble. Comme ca quand vous lirez l'explication d'une \u00e9tape vous serez conscient de \u00e0 quoi elle sert et ou elle s'\u00eenscrit dans le projet principal. Les briques principales Voici trois grosses \u00e9tapes du projet. Pour rappel ce sont des vulgarisations plut\u00f4t larges qui n'ont qu'un seul but, aider \u00e0 la compr\u00e9hension de ce qui vient par la suite. Recup\u00e9ration d'images \"Diagramme simplifi\u00e9 repr\u00e9sentant le processus de r\u00e9cup\u00e8ration des images\" Pour faire simple on peut voir qu'il y a deux parties \u00e0 cette \u00e9tape. La premi\u00e8re en partant du haut repr\u00e9sente un script python qui va chercher des informations dans la base de donn\u00e9es de Chrome qui est en SQLITE. Ces informations dans notre cas sont les cookies de connexion. Dans la seconde \u00e9tape, on peut voir que le programme utilise Selenium avec un navigateur Firefox Headless qui va aller communiquer avec la F1TV qui est le site web qui nous int\u00e9resse et que une des infos que l'on r\u00e9cup\u00e8re est une image de la page en format PNG que l'on envoie au programme C#. Ces deux partie sont li\u00e9es car pour se connecter \u00e0 la F1TV Selenium a besoin des cookies de connexion r\u00e9cup\u00e8r\u00e9s par le programme Python. La premi\u00e8re partie est un processus qui n'est utilis\u00e9 qu'une seule fois au d\u00e9marrage tandis que la r\u00e9cup\u00e9ration d'images et en continu pendant toute la dur\u00e9e de l'utilisation de l'application. OCR \"Diagramme simplifi\u00e9 repr\u00e9sentant le processur d'OCR\" ; On peut voir dans ce diagramme simplifi\u00e9 qu'avec l'aide de ce que contient le fichier \"Config.JSON\" on d\u00e9coupe l'image que l'on a r\u00e9cup\u00e8r\u00e9 au pr\u00e9alable en petits morceaux qui continennent des informations. Ensuite on prend cette image et on lui applique un filtre pour retirer le flou la couleur etc... Puis en utilisant de l'OCR (Optical Character Recognition) on en r\u00e9cup\u00e8re les informations sous forme de texte et on le renvoie dans le programme C# Dans cette partie explicative g\u00e9n\u00e9rale, on ne reviendra pas sur la cr\u00e9ation de ce fichier config. Pour plus d'infos \u00e0 son sujet voir la rubrique (OCR/Fonctionnement g\u00e9n\u00e9ral) Traitement et affichage \"Diagramme simplifi\u00e9 repr\u00e9sentant le processus de traitement et d'affichage\" On peut voir dans ce dernier mini diagramme simplifi\u00e9 que on prend les donn\u00e9es que l'on r\u00e9cup\u00e8r\u00e9 de l'\u00e9tape pr\u00e9c\u00e9dente qui ne sont pas forc\u00e9ment toutes coh\u00e9rentes et qu'on les traite pour leur redonner du sens avant de les stocker dans une base de donn\u00e9es SQLITE. Ensuite cette m\u00eame base de donn\u00e9e fournis les infos nescessaires pour des affichages (Ces affichages sont directements r\u00e9cup\u00e8r\u00e9s depuis le projet en cours de fonctionnement) R\u00e9sum\u00e9 du fonctionnement g\u00e9n\u00e9ral \"Diagramme simplif\u00e9 repr\u00e9sentant le processus g\u00e9n\u00e9ral du projet\" Ce dernier diagramme est un sch\u00e9ma fait pour repr\u00e9senter de la mani\u00e8re la plus simple possible toutes les briques du projet et comment elles s'imbriquent ensemble. La repr\u00e9sentation est un peu diff\u00e9rentes des 3 autre diagramme car le but ici est surtout de montrer le chemin que fait la donn\u00e9e \u00e0 travers les couches Toutes les parties du projet ne sont pas incluses, notamment la partie calibration dans un objectif de simplifier la lecture. Dans l'ordre, on peut voir que pour la partie r\u00e9cup\u00e8ration d'images, le python va r\u00e9cup\u00e8rer les cookies dans la base de donn\u00e9es chrome pour ensuite les retourner \u00e0 Selenium. Selenium va ensuite pouvoir lancer un navigateur (en l'occurence Firefox) et utiliser les cookies r\u00e9cup\u00e8r\u00e9s pour aller sur la page de la F1TV qui va retourner un certain nombre d'infos \u00e0 Selenium. L'info qui nous int\u00e9resse le plus depuis Selenium c'est les images de la page data de la F1Tv et c'est elles que l'on va envoyer dans la partie LOAD du diagramme. Dans cette partie on prend l'image de la F1TV et on la decoupe selon les directives donn\u00e9es par le fichier Config.JSON (il renseigne les zones \u00e0 d\u00e9couper et ce qu'elles repr\u00e9sentent) et apr\u00e8s le d\u00e9coupage on se retrouve avec une zone principale, vingt zones de pilotes et 9 fen\u00eatres de donn\u00e9es par zone de pilote donc 180 fen\u00eatres en tout. Ces fen\u00eatres sont ensuite envoy\u00e9es pour \u00eatre filtr\u00e9es (retirer le flou, mettre en \u00e9vidence les caract\u00e8res, en gros les pr\u00e9parer pour la reconnaissance) dans la partie OCR Dans cette partie, apr\u00e8s avoir filtr\u00e9 les images, on les envoie \u00e0 Tesseract pour qu'il nous retourne des r\u00e9sultats d'OCR. Ces r\u00e9sultats sont ce que Tesseract a trouv\u00e9 sur les image et ils sont retourn\u00e9s sous al forme de Data Pilote. Ex (Position: 1,Tour : 45, Temps au tour : 1:34.683, Pneus: Medium etc....) Finalement ces donn\u00e9es ont envoy\u00e9es dans la partie traitement qui va faire des v\u00e9rifications d'usage pour s'assurer qu'elles sont correctes et quand c'est fait, tout est envoy\u00e9 dans une base de donn\u00e9es SQLITE. On ne montre pas non plus dans ce diagramme la parte affichage des donn\u00e9es car je ne trouve pas pertinent de l'inclure ici. Et voila c'est le fonctionnement tr\u00e8s g\u00e9n\u00e9ral et simplifi\u00e9 de l'application. Je vous invite \u00e0 continuer \u00e0 lire cette documentation pour des informations plus pr\u00e9cises \u00e0 propos de toutes ces \u00e9tapes. Bonne lecture ! R\u00e9cup\u00e9ration des images Voici la premi\u00e8re grande \u00e9tape du projet. Pour rappel, Amazon h\u00e9berge directement le site de la F1TV et poss\u00e8de les droits sur les donn\u00e9es de la F1. C'est sous le nom de AWS (le service d'h\u00e9bergement d'Amazon) que la firme apparait en tant que sponsor. On peut voir ce nom appara\u00eetre assez souvent quand on regarde un Grand Prix car comme ils ont la main-mise sur les donn\u00e9es ils peuvent ins\u00e8rer des bandeaux d'informations sur le flux public sur ce qu'il se passe voir m\u00eame faire des pr\u00e9dictions (Bien qu'un peu bancales) \"Exemple insertion AWS en GP\" Ce service s'appelle F1 Insights (Oui c'est un meilleur nom de projet que F1 Companion mais bon) et c'est, je pense, la raison pour laquelle on ne voit aucune API publique qui permette de correctement se renseigner en don\u00e9es en direct pendant un Grand Prix. Ils ont du d\u00e9gotter un juteux contrat pour s'occuper de toute l'infrastructure digitale de la F1 (du moins publique) en \u00e9change d'une exclusivit\u00e9 totale sur certaines choses comme les Data \"Exemple data d'AWS\" Evidemment je ne fais que conjecturer et ce que j'ai dit n'est pas \u00e0 prendre au pied de la lettre mais c'est une explication possible je pense de pourquoi il est si difficile de trouver des donn\u00e9es sur la F1 facilement en temps r\u00e9el. Il existe bien quelques API un peu bancales publiques, mais le probl\u00e8me c'est qu'elles ne sont vraiment pas suffisante et je ne peux pas leur faire confiance quand je commente. Ce qu'il m'aurait fallut c'est une API publique et officielle qui me permette d'\u00eatre sur que les donn\u00e9es sont les bonnes et qu'elles arrivent le plus vite possible. On pourrait croire que c'est impossible car cela n'existe pas comme je l'ai dit MAIS ! Ce n'est pas compl\u00eatement vrai. En effet depuis que je poss\u00e8de un abonnement \u00e0 la F1TV, il existe une source d'informations tr\u00e8s pr\u00e9cieuse qui m'aide \u00e9norm\u00e9ment dans mon quotidien de commentateur de Formule 1. La \"DATA CHANNEL\". La Data Channel est une page de la F1TV qui permet, pour chaque Grand Prix, de visualiser, sous la forme d'un flux vid\u00e9o, diff\u00e9rentes informations capitales sur la course. \"Exemple de Data Channel\" Le probl\u00e8me, c'est que comme je viens de le dire, ces donn\u00e9es ne sont pas accessibles comme un tableau HTML ou un flux RSS ou un tableau JSON. C'est un flux vid\u00e9o. Il faut savoir qu'entretenir une diffusion de flux vid\u00e9o en 1080P pendant deux heures accessible par des milliers d'abonn\u00e9s est EXTR\u00caMENT cher surtout quand on le compare \u00e0 simplement afficher les donn\u00e9es dans un tableau. Ce qui veut dire que ce choix est d\u00e9lib\u00e9r\u00e9 et a un sens au niveau \u00e9conomique. Je pense donc que c'est justement pour \u00e9viter que des petits malins puissent simplement venir scraper l'int\u00e9gralit\u00e9 des donn\u00e9es qu'ils proposent et fasse sa propre API. (C'est d'ailleurs un des sites avec la meilleure protection anti bot du monde) MAIS ce n'est pas par ce que les donn\u00e9es ne sont pas facile \u00e0 avoir qu'elles sont IMPOSSIBLE \u00e0 avoir. Et c'est la que ce projet entre en jeu. Mais pour d\u00e9coder les donn\u00e9es d'une image il faut dabord ... (roulement de tambours) ... Avoir des images ! Et c'est la que vient se glisser cette partie du projet. Comment faire ? Le but de ce segment est de se concentrer sur la r\u00e9cup\u00e8ration et la mise \u00e0 disposition pour le reste du programme, des images en direct de la F1TV dans la meilleure qualit\u00e9 possible et dans les meilleurs d\u00e9lais. Pour ce faire il y a plusieurs solutions : Reverse engeneer la F1TV pour acc\u00e8der directement au flux sans passer par la plateforme internet et pouvoir prendres images \u00e0 volont\u00e9. Avoir tout simplement une page de la F1TV ouverte sur un \u00e9cran et prendres des screenshots \u00e0 intervals r\u00e9guliers. Simuler un navigateur internet sans qu'il soit affich\u00e9 et le contr\u00f4ler automatiquement pour qu'il prenne des captures. La premi\u00e8re option aurait \u00e9t\u00e9 la plus \u00e9l\u00e9gante mais lors d'un POC que je tentais de r\u00e9aliser je me suis rendu compte que cela serait un peu trop compliqu\u00e9 et long \u00e0 faire. Sans compter le fait que les rediffusions de Grand Prix ne sont pas g\u00e8r\u00e9es de la m\u00eame mani\u00e8re que les diffusions en live. Et que pour faire des Tests en live il faudrait attendre \u00e0 chaque fois un weekend de Grand Prix et le faire en plus du commentaire que je dois produire. Pour toutes ces raisons et bien d'autres je l'ai rang\u00e9e dans la case \"Trop dur, Trop chiant, S\u00fbrement ill\u00e9gal\" (Oui je sais c'est une cat\u00e9gorie bien sp\u00e9cifique mais c'est ma documentation je fais ce que je veux) La troisi\u00e8me option aurait \u00e9t\u00e9 la plus simple (et moins dr\u00f4le) et je suis presque s\u00fbr que je peux impl\u00e9menter cette derni\u00e8re en moins d'une apr\u00e8s-midi. Sauf qu'elle apporte de gros soucis. On ne peux pas garantir l'int\u00e9grit\u00e9 et la continuit\u00e9 des donn\u00e9es si l'utilisateur avance ou fait pause m\u00eame par simple inadvertance. La moindre fen\u00eatre qui s'afficherait devant ruinerait toute la reconnaissance de caract\u00e8res. On ne peut pas contr\u00f4ler la qualit\u00e9 du flux et on est oblig\u00e9 de faire confiance en l'utilisateur On ne peut pas vraiment automatiser quoi que ce soit niveau tests ou m\u00eame pour faire du scrapping auto pour remplir une base de donn\u00e9e. Et finalement le pire inconv\u00e9nient : C'EST NUL ! Je ne pourrais jamais utiliser un projet qui fonctionne de cette facon, je ne peux pas me permettre d'avoir un \u00e9cran inutilisable quand je commente et auquel je dois constamment faire attention pour ne pas perturber la reconnaissance. Pour moi cette option aurait \u00e9t\u00e9 celle \u00e0 choisir en cas d'extr\u00eame urgence et en dernier recours car le projet deviendrait inutile. J'ai donc d\u00e9cid\u00e9 de m'occuper de la seconde option : Simuler un navigateur. Cette option bien que complexe et difficile \u00e0 impl\u00e9menter propose une solution \u00e0 tous les probl\u00eame et permet une r\u00e9cup\u00e8ration quasi sans compromis. Simuler un navigateur ? \"Navigateur Headless(sans t\u00eate)\" Simuler un navigateur internet n'est pas forc\u00e9ment tr\u00e8s difficile. Chromium par exemple offre une panoplie d'outils natifs et \u00e9norm\u00e9ment de librairies existent permettant de facilement et en quelques lignes simuler un Google Chrome et le contr\u00f4ler sans afficher son UI (Interface Utilisateur). \"Chromium logo\" {: style=\"height:150px;width:150px\"} Cependant. La F1TV n'utilise pas simplement un player HTML5 basique. Elle utilise un service de streaming BitMovin qui permet de fournir un stream de bonne qualit\u00e9 et surtout qui impl\u00e9mente les DRM (Digital Right Management) Cela veut dire que quand on ouvre un flux de la F1TV sur chrome et que l'on essaie de prendre une capture d'\u00e9cran, le player se met en noir et ne permet pas de voir quoi que ce soit (Certaines version de Chrome le permettent pendant quelques semaines avant de bloquer \u00e0 nouveau). Ce qui dans notre cas est un immense probl\u00e8me. Mais Firefox ne nous bloque pas de cette facon et il est donc assez facile de passer outre. L'explication sans trop rentrer dans les d\u00e9tails est la suivante : Dans chrome, le player par d\u00e9faut utilise une technologie appell\u00e9e \"PCP\" ou \"Protected Content Playback\" qui leur permet de bloquer au moins une partie des techniques de r\u00e9cup\u00e8ration du flux vid\u00e9o et audio. Cependant Firefox de pas sa nature Open Source utilise \"OpenH264\" pour lire ces m\u00eames flux soumis \u00e0 des DRM et OpenH264 n'impl\u00e9mente pas les m\u00eames restrictions. Sauf que Firefox n'est pas aussi facilement \u00e9mul\u00e9 que chrome et cela r\u00e9duit notre choix de librairies \u00e0 ... Une seule... Qui est Selenium. (Il existe aussi Pupetteer C# mais j'ai rencontr\u00e9 \u00e9norm\u00e9ment de soucis avec cette derni\u00e8re d\u00e8s que je voulais lancer une vid\u00e9o) \"Firefox dev logo\" {: style=\"height:150px;width:150px\"} Mais m\u00eame si la documentation est plut\u00f4t maigre parfois, c'est une bonne librairie qui permet de tr\u00e8s bien contr\u00f4ler une instance de chrome ou de Firefox. Contr\u00f4ler le navigateur Maintenant que l'on sait quel navigateur simuler et avec quelle technologie, on peut passer \u00e0 la r\u00e9alisation. Ce qu'il y a de bien avec Selenium, c'est qu'on a un certain nombre de commandes tr\u00e8s haut niveau qui nous permettent de contr\u00f4ler un navigateur de mani\u00e8re plut\u00f4t pr\u00e9cise. Je vais d\u00e9crire ici la proc\u00e9dure habituelle utilis\u00e9e sous une forme de recette de cuisine pour que l'on puisse facilement comprendre ce qu'il se passe. Durant cette explication je vais parler \u00e0 un moment de Cookies, ne vous en faites pas c'est le sous chapitre suivant qui va vous en parler. Recette de cuisine pour r\u00e9cup\u00e8rer des images de la F1TV : D\u00e9marrer une instance de navigateur avec les bons arguments Ajouter les bons param\u00eatres pour ne pas se faire flag comme un bot Naviguer sur la page de la F1TV Ajouter les cookies de connexion pour avoir acc\u00e8s au contenu de la page Naviguer sur la page du Grand Prix demand\u00e9 Attendre un peu que la page se charge Cliquer sur l'invite de cookies Attendre cinq secondes le temps que la page se reload Cliquer sur le bouton qui permet de passer du feed live \u00e0 la DATA CHANNEL Appuyer sur Espace pour faire apparaitre le bouton d'acc\u00e8s au param\u00eatres Cliquer sur le menu d\u00e9roulant des r\u00e9solution Trouver l'option 1080P et la selectionner Cliquer sur le bouton qui met la vid\u00e9o en plein \u00e9cran Prendre de screenshots \u00e0 intervales r\u00e9guliers Pour faire toutes ces actions on doit r\u00e9cup\u00e8rer les \u00e9l\u00e9ments selon leur ID ou leur classe. Voici un exemple qui r\u00e9cup\u00e8re le bouton de plein \u00e9cran et qui clique dessus : IWebElement fullScreenButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-fullscreentogglebutton\" )); fullScreenButton . Click (); Ca peut para\u00eetre plut\u00f4t simple dit comme ca et quand tout fonctionne ca l'est mais la difficult\u00e9 vient du fait que \u00e0 peu pr\u00e8s nimporte laquelle de ces \u00e9tapes peut rater et qu'il faut donc faire un bon syst\u00e8me de gestion d'erreurs qui puisse aider l'utilisateur en cas de probl\u00e8me. Parfois il est aussi difficile de trouver un \u00e9l\u00e9ment selon son ID,sa classe, ou sa value. Par exemple l'option qui permet de passer en 1080P peut avoir comme value 1080_9011456 ou 1080_9011200 si on refresh la page. Cela demande de passer par des expression r\u00e9guli\u00e8res ce qui n'est pas compliqu\u00e9 en soi mais c'est toutes ces petites choses qui rendent le processus long \u00e0 mettre en place. Il faut dire aussi que les sites ne sont pas forc\u00e9ment tr\u00e8s content de voir des bots passer car cela peut \u00eatre un risque de DDOS et de Scraping (Comme moi) et donc ils mettent en place des syst\u00e8mes pour nous emp\u00eacher de faire ce que l'on veut On peut utiliser diff\u00e9rntes techniques pour passer outre ces restrictions comme : Changer son UserAgent Changer sa r\u00e9solution Ne pas avoir des patterns trop pr\u00e9visibles Avoir un historique Ne pas cliquer pile sur le milieu des boutons Ne pas cliquer trop vite Passer par un proxy pour ne pas se faire flag Utiliser des librairies plus discr\u00e8tes J'ai eu l'occasion de tester toutes ces methodes pour tenter de passer derri\u00e8re les radars de la F1TV et visiblement j'ai r\u00e9ussi pour les pages principales mais pas pour les pages de Login. Il faut savoir que la bataille entre bots et propri\u00e9taires de sites est un grand jeu du chat et de la souris et que les plateformes innovent constamment leur s\u00e9curit\u00e9. Et il se trouve que la partie login de la F1TV est heberg\u00e9e autre part que le reste du site chez Amazon et que elle poss\u00e8de les meilleures s\u00e9curit\u00e9s que j'aie pu voir. Aucunes des methodes que j'ai cit\u00e9es et d'autres encore que j'ai essay\u00e9 n'ont r\u00e9ussi \u00e0 fourvoyer le syst\u00e8me. J'ai donc \u00e9t\u00e9 oblig\u00e9 de faire appel \u00e0 la connexion par Cookies pour pouvoir acc\u00e8der au reste du site internet. R\u00e9cup\u00e8rer les cookies ? Alors, on va mettre de c\u00f4t\u00e9 toutes les questions de s\u00e9curit\u00e9 et de violation de la vie priv\u00e9e et de protection des donn\u00e9es des utilisateurs pour ce chapitre. Car pour faire simple, je siphonne TOUS les cookies de la persone qui utilise mon app. Alors \u00e9videmment ca n'est pas pour faire des b\u00e9tises avec et c'est pour une \"bonne\" raison, mais bon quand m\u00eame ca peut faire bizarre comme ca. Je pense que vous savez d\u00e9ja ce qu'est un Cookie, mais je vais quand m\u00eame faire un petit point la dessus car c'est important pour la suite. Quand on va sur un site internet et que l'on se connecte avec nos identifiants nous sommes connect\u00e9s sur la session. Cependant, si on quitte le site ou que l'on ferme le navigateur, le site ne peut pas garder en m\u00e9moire que c'est bien vous quand le lendemain vous retournez dessus. Pour palier \u00e0 cette limitation on a invent\u00e9 cette chose magnifique (hem...) que sont les cookies ! Les cookies sont des petits fichiers qui sont stock\u00e9s dans votre navigateur et qui peuvent servir \u00e0 beaucoup de choses comme traquer votre activit\u00e9 sur internet et espionner un peu ou aussi par exemple, servir de jeton de connexion. L'id\u00e9e est que quand vous vous connectez sur le site avec vos identifiants, le site envoie un petit fichier dans votre navigateur qui va servir de jeton. Et donc quand vous reviendrez, le site pourra voir que vous avez le jeton et vous connectera automatiquement. Ca peut para\u00eetre g\u00e9nial, et c'est effectivement bien pratique, cependant ce n'est pas sans risques. En effet, imaginons qu'un acteur malveillant parvienne \u00e0 s'emparer de ces petits fichiers, il pourrait ainsi facilement se faire passer pour vous. Alors un cookie expire \u00e0 un moment donn\u00e9 pour temperer les risques, mais ils sont toujours pr\u00e9sents. Dans notre cas on peut vite comprendre pourquoi cela peut \u00eatre int\u00e9ressant de r\u00e9cup\u00e8rer ces cookies. En effet, si on peut mettre la main sur le jeton de connexion de l'utilisateur de notre application. On pourra se connecter automatiquement \u00e0 la F1TV et aller prendre des photos directement sans que l'utilisateur aie \u00e0 faire quoi que ce soit. Sauf que les cookies ne sont pas stock\u00e9s en clair comme ca. Evidemment Google Chrome a mis en place quelques techniques pour \u00e9viter que nimporte qui puisse s'amuser \u00e0 aller taper dans les cookies de la machine. Tous les cookies sont stock\u00e9s dans une base de donn\u00e9es sqlite avec les noms en clair et les valeurs sont encrypt\u00e9es en utilisant la methode AES 256 qui est une methode de cryptage tr\u00e8s utilis\u00e9e et efficace. Tellement efficace qu'il serait compl\u00eatement inutile de tenter de les decrypter en utilisant de la force brute pour trouver la valeur ou m\u00eame une attaque de dictionnaire ou quoi que ce soit. Si ces valeurs peuvent \u00eatre encod\u00e9es et d\u00e9cod\u00e9es en local sur la machine sans connexion internet, cela veut dire que la cl\u00e9 est stock\u00e9e sur la machine. Et si je peux mettre la mais sur cette cl\u00e9 alors je pourrai lire tous les cookies de la machine. Cette cl\u00e9 est stock\u00e9 dans les fichiers de Google Chrome sous Google\\Chrome\\User Data\\Local State . Et dans ce fichier on peut trouver une liste de donn\u00e9es en cl\u00e9 valeurs et on peut trouver la cl\u00e9 sous os_crypt encrypted_key . On pourrait croire que l'on a d\u00e9ja touch\u00e9 le jackpot mais il reste encore une \u00e9tape. Cette cl\u00e9 est crypt\u00e9e en utilisant le syst\u00e8me d'encryption de Windows. Cette encryption est utilis\u00e9e pour emp\u00eacher des utilisateurs non connect\u00e9s d'acc\u00e8der \u00e0 certaines donn\u00e9es. Mais comme nous sommes connect\u00e9s nous pouvons facilement utiliser les librairies de decryption pour trouver la valeur de cette cl\u00e9. Et \u00e0 partir de la il suffit d'utiliser cette cl\u00e9 pour d\u00e9crypter tous les cookies de la machine pour aller chercher ceux qui nous int\u00e9ressent. Voici un exemple du code python qui permet d'aller chercher la cl\u00e9 d'encryption dans les fichiers de Google Chrome : def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key Python ?? Et oui j'ai choisit d'utiliser un srypt python pour aller chercher les cookies. Ce choix a \u00e9t\u00e9 fait pour trois raisons : Le python est un language que je n'aime pas particuli\u00e8rement mais qui poss\u00e8de un \u00e9ventail de librairies absolument fantastique. Et pour ce genre de choses qui demandent une constante mise \u00e0 jour des librairies et qui sont un peu niches le python est une option juste g\u00e9niale. Comme c'est une des parties qui est le plus suceptible de changer vu que Chrome change relativement souvent le syst\u00e8me de stockage des cookies. Dans une optique de facilit\u00e9 de maintenance, avoir un seul fichier qui concerne cette partie du projet et qui est dans un language que plus de gens maitrisent que C# est pratique. Je n'ai pas r\u00e9ussi \u00e0 trouver de librairies C# qui me donne des r\u00e9sultats identiques \u00e0 celles que j'utilise dans ce script python. Pour faire la liaison entre le C# et le python, j'appelle le script depuis mon C# et ensuite le python s'occupe de mettre tous les cookies dans un CSV qui est ensuite lu depuis le C#. Voici la partie python qui \u00e9crit dans le csv : if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" ) Et la partie C# qui appelle le script et qui lit le CSV : private void StartCookieRecovering () { string scriptPath = PYTHON_COOKIE_RETRIEVAL_FILENAME ; Process process = new Process (); process . StartInfo . FileName = \"python.exe\" ; process . StartInfo . Arguments = scriptPath ; process . StartInfo . UseShellExecute = false ; process . StartInfo . RedirectStandardOutput = true ; process . Start (); string output = process . StandardOutput . ReadToEnd (); process . WaitForExit (); } public string GetCookie ( string host , string name ) { StartCookieRecovering (); string value = \"\" ; List < Cookie > cookies = new List < Cookie >(); using ( var reader = new StreamReader ( COOKIES_CSV_FILENAME )) { // Read the header row and validate column order string header = reader . ReadLine (); string [] expectedColumns = { \"host_key\" , \"name\" , \"value\" , \"path\" , \"expires_utc\" , \"is_secure\" , \"is_httponly\" }; string [] actualColumns = header . Split ( ',' ); for ( int i = 0 ; i < expectedColumns . Length ; i ++) { if ( expectedColumns [ i ] != actualColumns [ i ]) { throw new InvalidOperationException ( $\"Expected column '{expectedColumns[i]}' at index {i} but found '{actualColumns[i]}'\" ); } } // Read each data row and parse values into a Cookie object while (! reader . EndOfStream ) { string line = reader . ReadLine (); string [] fields = line . Split ( ',' ); string hostname = fields [ 0 ]; string cookieName = fields [ 1 ]; if ( hostname == host && cookieName == name ) { value = fields [ 2 ]; } } } return value ; } Maintenant que l'on sait comment simuler et manipuler un navigateur internet, que l'on sait comment se connecter sur le compte F1TV de l'utilisateur sans qu'il n'aie rien \u00e0 faire. On a tous les ingr\u00e9dients pour automatiquement r\u00e9cup\u00e8rer des images de la F1TV du Grand Prix que l'on souhaite. Calibration Maintenant que l'on a des images de la page Data de la F1TV on pourrait croire que c'est tout bon on peut direct passer \u00e0 la partie OCR. Mais que nenni ! Le gros soucis de l'OCR c'est que sa pr\u00e9cision est grandement r\u00e9duite d\u00e8s que l'on augmente la taille de la zone de recherche. M\u00eame simplement deux mots sur une image, si on les prends dans images individuelles on a de grandes chances de trouver quelque chose mais si on les mets les deux sur la m\u00eame et que on tente l'OCR on va avoir de r\u00e9sultats bien moins bons. Et puis il faut aussi voir que selon les donn\u00e9es que je cherche je ne peux pas faire le m\u00eame traitement. Par exemple, savoir si le DRS est allum\u00e9, savoir quels pneus chausse un pilote et depuis combien de tours et savoir quel est le temps de son dernier tour, ce sont des informations qui demandent des traitements qui n'ont rien \u00e0 voir. Il faut donc pouvoir dire au programme d'OCR ou se trouvent les informations et quelle est leur nature pour qu'il puisse les d\u00e9coder. Il faut donc faire une calibration qui puisse donner toutes les infos importantes mais qui en m\u00eame temps soit facile \u00e0 utiliser car un utilisateur doit \u00eatre capable de le faire assez facilement. Voici la liste des informations que l'on doit r\u00e9cup\u00e8rer : La liste des pilotes pr\u00e9sent sur le Grand Prix La position de la zone principale La position de chaque zone de pilote La position de toutes les Window sur chaque zone de pilote Le but a \u00e9t\u00e9 de retirer le plus d'\u00e9tapes possibles \u00e0 l'utilisateur. Techniquement j'aurais pu faire une version compl\u00eatement manuelle mais ca aurait pris trop de temps alors il y a des syst\u00e8mes qui permettent de rendre cette t\u00e2che moins p\u00e9nible. Liste des pilotes Pour la liste des pilotes j'ai pens\u00e9 \u00e0 utiliser une API externe pour avoir une liste dans laquelle on pourrait selectionner des noms de pilotes sauf que j'ai abandonn\u00e9 l'id\u00e9e car je trouvais que le projet avait d\u00e9ja bien assez de points qui d\u00e9pendent de l'exterieur. Il y a donc une liste de pilotes dans laquelle on peut ajouter ou supprimer des noms de pilotes. L'id\u00e9al serait de mettre tous les pilotes de reserve comme ca si un pilote est malade sur une course on a pas besoin de venir changer la liste. Zone principale Pour la zone principale c'est compl\u00eatement manuel, on attend de l'utilisateur deux points x,y sur l'image pour ensuite avoir une id\u00e9e de ou est sens\u00e9 se trouver la zone. \"Exemple de zone principale\" Zones pilotes C'est la que ca devient int\u00e9ressant. L'utilisateur n'a pas besoin de faire quoi que ce soit pour que le programme sache ou sont les zones des pilotes. J'aurais pu le faire manuellement en faisant choisir \u00e0 l'utilisateur de donner deux points qui correspondent \u00e0 la premi\u00e8re zone et extrapoler pour en avoir 20. Sauf que si l'utilisateur n'est pas pr\u00e9cis au pixel pr\u00e8s (et m\u00eame comme ca parfois) le vingti\u00e8me pilote se retrouve avec une zone compl\u00eatement desax\u00e9e. La, le programme va \"simplement\" effectuer une reconaissance de texte sur toute l'image. Les r\u00e9sultats ne nous int\u00e9ressent pas vraiment tout ce que l'on veut c'est la position des textes. Avec les position il est facile de determiner ou sont toutes les zones de pilotes et donc sans que l'utilisateur n'aie \u00e0 toucher quoi que ce soit, d\u00e8s qu'il a donn\u00e9 les infos pour la zone principale, les zones de pilotes sont determin\u00e9es. \"Exemple zone pilote\" Voici un exemple du code utilis\u00e9 pour trouver ou dessiner des zones de pilotes : public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); List < Zone > zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Image image = MainZone . ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //var text = iter.GetText(PageIteratorLevel.Word).ToUpper(); //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } //DEBUG int i = 1 ; foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); //We add the driver zones Zone driverZone = new Zone ( MainZone . ZoneImage , windowRectangle , \"DriverZone\" ); MainZone . AddZone ( driverZone ); //driverZone.ZoneImage.Save(\"Driver\" + i+\".png\"); i ++; } } Windows pilotes C'est ici que c'est le plus p\u00e9nible pour l'utilisateur, il doit selectionner manuellement les positions des fen\u00eatres de donn\u00e9es. Ensuite d\u00e8s que l'utilisateur a donn\u00e9e une position pour chaque window, on applique les positions pour chaque zone de pilote. Il y a plusieurs types de windows et selon le type le traitement est diff\u00e9rent comme je l'ai dit plus t\u00f4t. Voici des exemples concrets : \"Exemple Window de pneus\" \"Exemple Window temps au tour\" \"Exemple window Drs\" Il est important que toutes ces zones soient transmises avec le plus de pr\u00e9cision possible pour que l'OCR puisse bien faire son boulot. Stockage Ensuite quand l'utilisateur a finit de configurer son flux, la configuration est stock\u00e9e pour qu'il puisse ensuite la r\u00e9utiliser pour tous les autres Grand Prix de l'ann\u00e9e. Le stockage est fait sous format JSON et est fait pour que le programme d'OCR puisse lire dedans toutes les infos nescessaires. Cela fait des fichiers plut\u00f4t gros mais je n'avais pas vraiment le choix. J'ai test\u00e9 une version avec seulement les infos de la premi\u00e8re zone de pilote mais avec l'interpolation, les derniers pilotes se retrouvent avec des zones clairement pas \u00e0 la bonne taille. Voici un exemple de ce \u00e0 quoi ressemble le JSON final : { \"Main\" : { \"x\" : 36 , \"y\" : 343 , \"width\" : 3780 , \"height\" : 1454 , \"DriverZones\" : [ { \"name\" : \"Driver1\" , \"x\" : 0 , \"y\" : 1 , \"width\" : 3780 , \"height\" : 72 , \"Windows\" : [ { \"Position\" : { \"x\" : 45 , \"y\" : 3 , \"width\" : 76 , \"height\" : 65 }, \"GapToLeader\" : { \"x\" : 447 , \"y\" : 1 , \"width\" : 206 , \"height\" : 67 }, \"LapTime\" : { \"x\" : 863 , \"y\" : 3 , \"width\" : 229 , \"height\" : 65 }, \"DRS\" : { \"x\" : 1095 , \"y\" : 1 , \"width\" : 174 , \"height\" : 67 }, \"Tyres\" : { \"x\" : 1274 , \"y\" : 3 , \"width\" : 1448 , \"height\" : 62 }, \"Name\" : { \"x\" : 2724 , \"y\" : 3 , \"width\" : 361 , \"height\" : 65 }, \"Sector1\" : { \"x\" : 3088 , \"y\" : 1 , \"width\" : 239 , \"height\" : 65 }, \"Sector2\" : { \"x\" : 3314 , \"y\" : 4 , \"width\" : 190 , \"height\" : 62 }, \"Sector3\" : { \"x\" : 3493 , \"y\" : 1 , \"width\" : 198 , \"height\" : 67 } } ] }, { \"name\" : \"Driver2\" , \"x\" : 0 , \"y\" : 72 , \"width\" : 3780 , \"height\" : 72 , \"Windows\" : [ { \"Position\" : { \"x\" : 45 , \"y\" : 3 , \"width\" : 76 , \"height\" : 65 }, \"GapToLeader\" : { \"x\" : 447 , \"y\" : 1 , \"width\" : 206 , \"height\" : 67 }, \"LapTime\" : { \"x\" : 863 , \"y\" : 3 , \"width\" : 229 , \"height\" : 65 }, \"DRS\" : { \"x\" : 1095 , \"y\" : 1 , \"width\" : 174 , \"height\" : 67 }, \"Tyres\" : { \"x\" : 1274 , \"y\" : 3 , \"width\" : 1448 , \"height\" : 62 }, \"Name\" : { \"x\" : 2724 , \"y\" : 3 , \"width\" : 361 , \"height\" : 65 }, \"Sector1\" : { \"x\" : 3088 , \"y\" : 1 , \"width\" : 239 , \"height\" : 65 }, \"Sector2\" : { \"x\" : 3314 , \"y\" : 4 , \"width\" : 190 , \"height\" : 62 }, \"Sector3\" : { \"x\" : 3493 , \"y\" : 1 , \"width\" : 198 , \"height\" : 67 } } ] } [ O t her pilo ts ... ] ], \"Drivers\" : [ \"Perez\" , \"Verstappen\" , \"Alonso\" , \"Sainz\" , \"Russel\" , \"Gasly\" , \"Leclerc\" , \"Ocon\" , \"Hulkenberg\" , \"Bottas\" , \"Hamilton\" , \"Albon\" , \"Tsunoda\" , \"Zhou\" , \"Stroll\" , \"De Vries\" , \"Magnussen\" , \"Norris\" , \"Piastri\" , \"Sargeant\" ] } } Et avec tout ca. L'OCR peut d\u00e9marrer dans de bonnes conditions OCR Maintenant que on a des images qui arrivent automatiquement et que l'on sait ou se trouvent les informations sur ces dites images, je vais parler de la seconde partie du projet qui parle du processus de reconnaissance de data sur une image du feed DATA de la F1TV. C'est je pense la partie qui a demand\u00e9 le plus tests et de refactor. Toute la partie OCR a \u00e9t\u00e9 d\u00e9velopp\u00e9e dans un projet \u00e0 part avant d'\u00eatre int\u00e9gr\u00e9e dans le projet final. Il faut savoir que la reconnaissance est diff\u00e9rente celon ce que l'on cherche. Je vais donc d\u00e9composer cette partie du document en sous rubriques selon les donn\u00e9es recherch\u00e9es. Mais avant ca je dois expliquer certains concepts qui seront importants. Fonctionnement g\u00e9n\u00e9ral Voici un screenshot de la page DATA de la F1TV que le programme va recevoir : \"Screen F1TV\" Si on regarde de loin on peut se dire que la structure est plut\u00f4t simple mais c'est loin d'\u00eatre le cas. On peut y voir au moins 4 zones contenant de l'information dans un format diff\u00e9rent. \"Zones principales\" Dans l'exemple ci dessus on peut voir 3 zones mais on aurait \u00e9galement pu comprendre la zone de position des pilotes autour du circuit pour faire 4. Ces 4 zones sont tr\u00e8s diff\u00e9rentes et contiennent d'autres informations. Pour ce travail de dipl\u00f4me je ne m'occupe que de la zone principale. Mais je pense que le titre et les infos de circuit ne prendrait pas tant de temps que ca \u00e0 impl\u00e9menter. J'ai utilis\u00e9 le mot \"Zone\" plus haut et ca n'est pas juste un mot utilis\u00e9 au hasard. C'est le nom de l'objet que j'utilise pour les repr\u00e9senter dans mon programme. Mais comme c'est important de bien comprendre ce concept avant de continuer je vais vous l'expliquer. ZONE : L'objet \"Zone\" parent est un objet qui est une zone d'image. Je m'explique, le but d'une zone est d'\u00eatre un morceau d'une image plus grande. Le but d'une Zone est de contenir une liste de plus petites Zones ou bien une liste de \"Window\" (j'explique ce que c'est juste apr\u00e8s). Elle contient la portion d'image qui la concerne et ses propres dimensions. Le parent zone ne pr\u00e9voit que de pouvoir ajouter ou supprimer des \u00e9l\u00e9ments des listes de zones ou de windows ainsi qu'une methode qui permet d'aller chercher toutes informations des livres qu'elle contient. L'int\u00e9r\u00eat d'une zone est de pouvoir compartimenter une image dans des parties int\u00e9ressantes au niveau de la reconnaissance mais pas de traiter d'information. WINDOW : L'objet \"Window\" est un objet qui peut ressembler beaucoup \u00e0 l'objet \"Zone\". En effet elle aussi est une partie d'une image plus grande et contient ses dimensions, mais elle se distingue en deux points importants. Elle ne contient pas d'autres Zones ou Windows Elle peut retourner les informations \u00e9crites sur son image. Toutes les Window qui h\u00e9ritent du parent Window peuvent impl\u00e9menter une methode qui permet de renvoyer ce qui peut \u00eatre d\u00e9cod\u00e9 sur son image. Les enfants peuvent aussi aller piocher dans les nombresues methodes de r\u00e9cup\u00e8ration de donn\u00e9es contenues dans le parent Window. Mieux vaut r\u00e9utiliser le plus possible que de r\u00e9inventer la roue pour chaque Window. Une analogie un peu bancale pourrait se pr\u00e9senter comme la suivante : La zone est une armoire ou une bibliot\u00e8que. Si c'est une zone qui contient d'autres zones c'est une bibliot\u00e8que et chacune de ces sous-zones sont des armoires. Leur unique but est de contenir de mani\u00e8re ordonn\u00e9e des objets qui eux contiennent de l'information. Les livres ici sont les Windows. Ils contiennet de l'information et sont stock\u00e9s dans des armoires et on y acc\u00e8de en allant dans la bonne bibliot\u00e8que et en allant dans la bonne armoire. Derni\u00e8res choses pour comprendre le diagramme: Il existe une Main Zone qui est une des 4 grandes zones dont je parlais dans la d\u00e9composition de l'image. Il existe aussi des \"Driver Zone\" qui sont de plus petites zones contenues dans la Main Zone qui et qui ne contiennent que les informations d'un pilote. L'objet Window n'est quasi jamais utilis\u00e9, c'est presque tout le temps des enfants de Window plus sp\u00e9cifiques qui sont utilis\u00e9s, le but est que chaque type d'information sur l'image aie son type de window. Voila donc un petit diagramme qui montre le d\u00e9coupage du programme : \"Diagramme explicatif de l'architecture des zones\" Pour visualiser encore un peu mieux comment ce d\u00e9coupage prend forme voici ce que chaque zone et Window contient. Main Zone : \"Exemple zone principale\" Driver Zone : \"Exemple zone de pilote\" Driver Position Window : \"Exemple de fen\u00eatre de position\" Driver name Window : \"Exemple de fen\u00eatre de nom\" Driver LapTime Window : \"Exemple de fen\u00eatre de temps au tour\" Driver Tyre Window : \"Exemple de fen\u00eatre pneus\" Il existe d'autres types de Window mais ce sont les principaux. On se rend assez facilement compte que chacunes de ces windows va avoir besoin d'un traitement sp\u00e9cifique car la mani\u00e8re de reconnaitre le pneu utilis\u00e9 et le temps au tour ne peut pas \u00eatre la m\u00eame. Pour r\u00e9sumer, on a un programme qui prend en entr\u00e9e un fichier de configuration, qui prend des images de la F1TV et les d\u00e9coupe dans des ZONES qui elles m\u00eame sont d\u00e9coup\u00e9es en WINDOWS pour qu'on puisse plus facilement les d\u00e9coder. Maintenant qu'on a une liste de diff\u00e9rent types de zones on peut commencer \u00e0 chercher ce qu'il y a marqu\u00e9 dessus. Pour cela il faut dabord comprendre un petit peu comment l'OCR fonctionne et comment des libraries comme Tesseract fonctionnent pour donner du texte en partant d'une image. Pour faire tr\u00e8s simple, nous avons un mod\u00e8le qui est entrain\u00e9. C'est \u00e0 dire que on donne \u00e0 un programme un tr\u00e8s grand nombre de mots ou de lettres en lui disant ce que contiennent chaques images. Ensuite le programme va cr\u00e9er des matrices de convolutions pour chaque lettre avec comme objectif de detecter les points communs entre les lettres pour cr\u00e9er un alpphabet. Par exemple la matric de la lettre 'H' donnerait un poids important \u00e0 des lignes verticales connect\u00e9es par une ligne centrale. Et si on fournis assez de donn\u00e9es de bonne qualit\u00e9 au mod\u00e8le, les matrices peuvent \u00eatre tr\u00e8s efficace \u00e0 detecter si une lettre est un H ou un M. Il y a pleins d'autres methodes comme l'utilisation d'un dictionnaire de mots de la langue pour permettre la reconnaissance de mots m\u00eame si une lettre au milieu n'est pas comprise ou en ajoutant d'autres informations sur le contexte mais ca ne nous int\u00e9resse pas ici. C'est important de comprendre comment cette reconnaissance de caract\u00e8res avec des matrices fonctionne car cela va nous aider \u00e0 pr\u00e9parer nos donn\u00e9es pour lui rendre la vie facile et augmenter la pr\u00e9cision de nos r\u00e9sultats. Filtres et traitement On peut essayer de donner toutes nos images directement \u00e0 Tesseract pour qu'il reconnaisse tout le texte qu'il y voit mais on risque de se retrouver avec des r\u00e9sultats au mieux inconsistents. Dans notre cas, le soucis est que les chiffres et lettres sont beaucoup trop petits. Ils ne font parfoisd que 10 pixels de haut et cela fait que il n'est pas forc\u00e9ment facile de toujours les diff\u00e9rencier. De plus, comme ils sont petits, les art\u00e9facts d'aliasing sont assez violents et peuvent grandement d\u00e9former une lettre ou un chiffre. Exemple : Prenons le chiffre 9. Dans l'image il peut \u00eatre repr\u00e9sent\u00e9 de cette mani\u00e8re : \"Exemple de chiffre avant post traitement\" On peut voir qu'il est flou, pour nous cela ne pose pas de probl\u00e8me et je pense que \u00e0 peu pr\u00e8s nimporte qui peut dire que c'est un 9. Cependant comme les contours sont flous et m\u00eame si on essaie de retirer le background : \"9 avec anti aliasing\" On voit que le 9 n'est pas clairement d\u00e9finit. En effet on pourrait le comprendre comme : \"Premier exemple de contours\" Ou comme : \"Second exemple de contours\" Voire m\u00eame simplement comme : \"Exemple de coutour g\u00e9n\u00e9reux\" Et on se rend bien compte que les performances de detection ne sont pas les m\u00eames dans ces trois cas. Il faut donc faire un certain post traitement des images pour supprimer les \u00e9l\u00e9ments parasites, les couleurs, et augmenter la visibilit\u00e9 des contours importants. Mais chaque type de donn\u00e9e va avoir des methodes de post traitement diff\u00e9rents. Donc voici les diff\u00e9rents types de reconnaissance et leur post traitements : Texte Alors ce type de reconnaissance est utilis\u00e9 par la WINDOW du nom de pilote et de la position du pilote. C'est je pense la plus simple de toutes car Tesseract est particuli\u00e8rement bien entrain\u00e9 pour. Cette reconnaissance concerne donc des lettres qui font des mots ou des noms. Voici un exemple de la WINDOW nom de pilote en entr\u00e9e : \"Exemple texte cru\" Ce texte peut paraitre bon, cependant quand on le lance dans Tesseract, il ne va pas toujours donner un r\u00e9sultat parfait. Il faut aussi savoir qu'il y a des noms pas mal plus p\u00e9nibles que Tesseract a plus de mal \u00e0 reconnaitres, soit \u00e0 cause des lettres utilis\u00e9es, soit car le nom est un nom d'une autre r\u00e9gion et qui ne veut rien dire en anglais ce qui emp\u00eache l'utilisation de dictionnaire (Ex : Tsunoda est un nom japonais et parfois il est difficile pour Tesseract de le reconnaitre car si une lettre pose probl\u00eame il ne peut pas trouver de contexte qui puisse l'aider). Donc pour le rendre plus facilement lisible et augmenter les chances que toutes les lettres soient d\u00e9couvertes, voici les \u00e9tapes que j'ai mis en place. 1 : J'inverse les couleurs. Je me suis rendu compte que il \u00e9tait souvent plus facile de trouver un noir sur blanc que blanc sur noir. Je ne suis pas sur que cette \u00e9tape soit capitale cependant. \"Texte invers\u00e9\" 2 : Je fais un Treshhold de 165 car avec moins le texte parfois prend trop du background et avec plus les lettres sont trop fines. \"Texte apr\u00e8s Treshold\" 3 : Je fais un Resize de l'image pour avoir une meilleure r\u00e9solution et permettre une meilleure d\u00e9tection. J'augmente la hauteur et la largeur par un facteur 2. J'ai trouv\u00e9 cette valeur suffisante et aller plus haut consomme beaucoup de ressources. \"Texte apr\u00e8s Resize\" 4: Je fais une tr\u00e8s rapide Dilatation du texte pour retirer le flou amen\u00e9 par la methode de Resize. Je n'utilise qu'une valeur de 1 car je ne veux pas trop changer comment le texte est model\u00e9 je veux juste retirer le flou. \"Texte apr\u00e8s Dilatation\" Explication des methodes pr\u00e9cises plus bas Voila pour ce qui est du post processing. Je ne dis pas que ce sont les meilleurs param\u00eatres possibles mais dans mes tests ce sont ceux qui ont le mieux march\u00e9s. C'est aussi les premi\u00e8res methodes que j'ai pu d\u00e9velopper alors forc\u00e9ment elles n'ont pas le niveau de d\u00e9tails de certaines autres. Mais comme m\u00eame avec ce traitement il n'est pas rare que je me retrouve avec une ou deux lettres pas justes, il faut un moyen d'\u00eatre s\u00fbr que c'est le bon nom qui est trouv\u00e9. Ce qu'il y a de pratique avec les noms de pilotes c'est que on sait d\u00e9ja comment ils s'appellent avant le Grand Prix. En effet dans le fichier de configuration de la reconnaissance, il y a une liste de noms de pilotes. Cela veut dire que au lieu de chercher \u00e0 trouver parfaitement les bonnes lettres, on peut simplement essayer de trouver quel nom de pilote ressemble le plus au nom trouv\u00e9 sur l'image. Pour ce faire j'ai utilis\u00e9 une methode appel\u00e9e la distance de Levenshtein. Pour faire simple c'est une methode qui va calculer les distances de lettres pour determiner entre des strings laquelle ressemble le plus \u00e0 une autre. Pour r\u00e9sumer le fonctionnement dans lordre : On prend l'image on la traite On envoie l'image trait\u00e9e \u00e0 Tesseract On trouve quel nom de pilote ressemble le plus \u00e0 ce r\u00e9sultat On renvoie le nom du pilote Chiffres Cette methode en r\u00e9alit\u00e9 utilise simplement la m\u00eame methode que celle qui va r\u00e9cup\u00e8rer le texte sur une image. Cependant, la, on envoie \u00e0 Tesseract l'information qu'il ne peut trouver que des chiffres sur l'image ce qui lui permet d'\u00eatre beaucoup plus pr\u00e9cis et de ne pas confondre un 9 avec un P ou un 11 avec un H PAR EXEMPLE (non pas que ca me soit arriv\u00e9 tr\u00e8s r\u00e9guli\u00e8rement et que ca me soit rest\u00e9 dans la gorge \u00e9videmment) L'avantage c'est que cette methode ne demande m\u00eame pas de traitement de la donn\u00e9e en sortie de Tesseract. On \u00e9sp\u00e8re simplement que le post traitement aura suffit. TEMPS : Cette methode regroupe la d\u00e9tection de temps au tour. Il y a trois grands types de WINDOW qui sont concern\u00e9es : La WINDOW du temps au tour La WINDOW du retard sur le leader La WINDOW des secteurs La grande diff\u00e9rence ce sont les ordres de grandeur. Les temps au tour sont en g\u00e9n\u00e9ral entre 50 secondes et 2 minutes. Tandis que les secteurs sont entre 20 et 30 secondes alors que le retard sur le leader peut-\u00eatre de plusieurs minutes. Cependant, tous ces temps poss\u00e8dent le m\u00eame type de post-traitement avant d'\u00eatre envoy\u00e9s \u00e0 Tesseract. Voici un exemple de temps au tour avant toute transformation : \"Temps au tour avant traitement\" On peut avoir l'impression que ce texte est tout \u00e0 fait lisible et facile \u00e0 d\u00e9coder surtout quand on le voit de loin comme ca. Cependant, il faut imaginer que ces chiffres font 13 pixels de haut en comptant le flou et comme expliqu\u00e9 plus haut ce flou dans ces echelles est terrible. \"Temps au tour zoom\u00e9\" Si on donne cette image \u00e0 Tesseract, les '3' deviennent des '9', des '9' deviennent des '8', des '2' deviennent eux aussi des '9', le tout parfois inversement et de mani\u00e8re compl\u00eatement impr\u00e9visible. Ca n'est simplement pas utilisable. Cette partie est un peu plus complexe car si la detection n'est pas fiable les chiffres sont simplement inutilisables. Si \u00e0 tout moment un temps au tour de 1:39.106 devient 1:32.108 c'est juste pas possible. Voici donc les \u00e9tapes de post-traitement que j'ai mis en place pour leur d\u00e9tection : 1: J'applique un Treshold de 185 pour enlever les ambiguit\u00e9s d'alisaising et avoir une image en noir et blanc claire. La valeur de 185 est assez \u00e9lev\u00e9e car le but est de vraiment garder uniquement les contours. Comme les chiffres se ressemlent beaucoup plu que les lettres, il faut tenter le plus possible de conserver leur formes sp\u00e9cifiques. Je me suis rendu compte que cette valeur \u00e9tait une de celles qui marchent le mieux. \"Temps au tour apr\u00e8s Treshold\" 2: J'applique un Resize de 2 pour augmenter la r\u00e9solution des chiffres et permettre une meilleure d\u00e9tection. Le but est d'avoir plus de pixels et donc de permettre \u00e0 Tesseract de mieux utiliser ses matrices de convolution. \"Temps au tour apr\u00e8s Resize\" 3: Comme le Resize am\u00e8ne du flou, j'utilise une methode de Dilatation qui me permet de retirer ce flou et de remplir un peu plus certaines parties qui ont \u00e9t\u00e9 un peu laiss\u00e9e par le Resize ; \"Temps au tour apr\u00e8s Dilatation\" 4: Contrairement aux mots plus haut, la rondeur ajout\u00e9e par la dilatation n'est pas vraiment d\u00e9sir\u00e9e. En effet, elle peut rendre confuse certains chiffres et emp\u00eacher Tesseract de bien trouver le chiffre. Alors j'applique une Erosion qui me permet de contrecarrer en partie les rondeurs ajout\u00e9es par la dilatation et retrouver des chiffres bien form\u00e9es. Pour l' Erosion et la Dilatation j'ai utilis\u00e9 une valeur de 1 car je ne voulais pas trop changer les chiffres. \"Temps au tour apr\u00e8s Erosion\" Explication des methodes pr\u00e9cises plus bas Et avec ce post processing on retrouve de plut\u00f4ts bon r\u00e9sultats qui demandent peu de traitement. Le traitement d\u00e9pend du type de WINDOW cependant. Pour les secteurs on indique \u00e0 Tesseract que les caract\u00e8res autoris\u00e9s sont : \"0123456789.\" Pour les temps au tour on autorise plut\u00f4t \"0123456789.:\" Et pour les \u00e9carts on autorise \"0123456789.+\" Ensuite on r\u00e9cup\u00e8re une liste de chiffres qui'il va falloir transformer en milisecondes pour faciliter le stockage et l'envoi. Le programme nettoie un peu la chaine avant de la convertir. Par exemple parfois le ':' de 1:34.456 est compris comme un '1' ou un '2' et il faut faire attention \u00e0 detecter quand ca arriver. Je passe les d\u00e9tails du reste du nettoyage car c'est vraiment du cas par cas mais quand on a finit de nettoyer la chaine on peut transformer les chaines de minutes secondes et milisecondes en un total de milisecondes. Pour r\u00e9sumer le fonctionnement dans l'ordre : On prend l'image et on lui applique une s\u00e9rie de filtres On envoie l'image filtr\u00e9e \u00e0 Tesseract On nettoie le r\u00e9sultat Tesseract pour compenser certains biais On convertis le r\u00e9sultat en milisecondes les chiffres (2) Il faut savoir que avec la derni\u00e8re version de l'\u00e9mulateur (dont je vais parler un peu plus tard) Pneus La on arrive sur la partie la plus p\u00e9nible. Pour comprendre la probl\u00e9matique il faut d'abord faire un petit point sur comment les pneus fonctionnent en Formule 1. Depuis 2019 en Formule 1 nous avons 5 grandes familles de pneus : Les pneus tendres Les pneus medium Les pneus durs Les pneus interm\u00e9diaires Les pneus pluie \"Gamme de pneus Pirelli\" Les trois premiers pneus sont des pneus faits pour piste s\u00e8che, le pneu interm\u00e9diaire pour piste humide et le neu pluie pour la pluie. Chaque pneu a sa dur\u00e9e de vie et son niveau de performance propre mais je ne vais pas rentrer dans le d\u00e9tail ici. Tout ce qu'il faut savoir ce que savoir sur quel pneu chaque pilote est et depuis combien de temps il les chausse est une information tr\u00e8s importante. Chaque pneu a une couleur donn\u00e9e qui permet de les diff\u00e9rencier. Voici un exemple de ce \u00e0 quoi une WINDOW de pneus peut ressembler : \"Exemple zone pneus 1\" Mais cette zone peut aussi ressembler \u00e0 ca : \"Exemple zone pneus 2\" Mais aussi \u00e0 ca : \"Exemple zone pneus 3\" Voire m\u00eame ca : \"Exemple zone pneus 4\" Je pense que vous pouvez tout de suite comprendre la difficult\u00e9 que repr\u00e9sente la t\u00e2che de r\u00e9cup\u00e8ration de donn\u00e9es \u00e0 partir de cette image. En gros le fonctionnement de cette zone d'information est assez simple. Au fur et \u00e0 mesure que la course avance, le trait fait de m\u00eame. Le chiffre dans le round tout \u00e0 droite indique le nombre de tour que le pilote a pass\u00e9 sur ce pneu. La couleur indique le type de pneu. Si il y a une lettre \u00e0 la place d'un chiffre c'est que c'est le premier tour sur ce pneu. La lettre indique le type de pneu. Et pas besoin de dire que si on essaie simplement de donner l'image \u00e0 Tesseract on ne r\u00e9cup\u00e8re ni les chiffres ni les lettres correctement si ce n'est pas du tout. Il faut donc utiliser une methode qui permette d'isoler le rond le plus \u00e0 droite, lui appliquer un traitement qui permette \u00e0 Tesseract de lire ce qu'il y a marqu\u00e9 et qui puisse determiner quel pneu est en train d'\u00eatre utilis\u00e9. J'ai d\u00e9cid\u00e9 de m'occuper dans un premier temps de trouver ce rond avant d'appliquer les filtres car plus l'image est petite plus les filtres sont rapides. Le programme va tirer un trait depuis le bord droit de la zone, et il va avancer vers la gauche jusqu'\u00e0 trouver un obstacle. Je d\u00e9tecte un obstacle si le pixel sur lequel est mon trait poss\u00e8de une valeur de plus de 0x50 dans le channel R,G ou B. J'ai trouv\u00e9 en faisant des tests que les couleurs de background de la F1TV ne d\u00e9passaient jamais ces valeurs. Ensuite apr\u00e8s avoir trouv\u00e9 le premier obstacle, je r\u00e9cup\u00e8re une zone qui doit englober le cercle. Voici un exemple avec cette image en entr\u00e9e : \"Zone compl\u00eate\" Elle est automatiquement coup\u00e9e de cette facon : \"Zone coup\u00e9e automatiquement\" Cela me permet d'isoler uniquement ce qui m'int\u00e9resse ce qui est tr\u00e8s pratique pour Tesseract et pour la detection de couleur. Ensuite avec cette image je peux commencer le processus de reconnaissance. Je commence par faire une moyenne de tous les pixels de l'image en excluant les pixels trop sombres qui font s\u00fbrement partie du background ou du chiffre. Ensuite j'utilise une methode qui calcule la diff\u00e9rence entre la couleur obbtenue et la liste de couleurs possible. Il y a cinq couleurs des pneus possibles : \"#ff0000\" pneu tendre/soft \"Couleur d'un pneu tendre\" \"#f5bf00\" pneu medium \"Couleur d'un pneu medium\" \"#a4a5a8\" pneu dur/hard \"Couleur d'un pneu dur\" \"#00a42e\" pneu inter \"Couleur d'un pneu interm\u00e9diaire\" \"#2760a6\" pneu pluie/wet \"Couleur d'un pneu pluie\" Ce qui est pratique c'est que m\u00eame dans les cas ou il n'y a pas beaucoup de couleur comme celui la : \"Pneu dur avec 0 tours\" On arrive \u00e0 une couleur moyenne de : \"Couleur moyenne de l'image ci dessus apr\u00e8s soustraction du background\" Et il est donc assez facile de determiner le type de pneu en question. Attention, les r\u00e9sultats peuvent \u00eatre tr\u00e8s vite d\u00e9rang\u00e9s par la couleur du pneu pr\u00e9c\u00e9dent si le d\u00e9coupage de la fen\u00eatre n'a pas \u00e9t\u00e9 assez pr\u00e9cis. Ensuite il \"suffit\" de lire le chiffre dans le rond et si on arrive pas \u00e0 le lire alors c'est que c'est une lettre et on sait que le nombre de tours est donc de 0. Maintenant vient le moment tr\u00e8s sympatique de la lecture du chiffre. Vous saurez que Tesseract en plus de detester les grandes images et les images avec des couleurs, deteste \u00e9galement les formes dans une image. Donc dans notre cas, le round de couleur autour du chiffre, m\u00eame si il n'est pas complet, il interf\u00e8re avec la reconnaissance et emp\u00eache de bien lire le chiffre. Il faut donc retirer le background et ensuite la couleur. Sauf que comme le chiffre est de la couleur du background, si on retire le background et ensuite la couleur il ne reste plus rien. Il faut donc retirer le background AUTOUR du rond, et ensuite si on retire la couleur il devrait rester le chiffre sur fond blanc. Pour se faire, j'ai tir\u00e9 des traits depuis les bords de l'image jusqu'\u00e0 ce qu'ils rencontrent le rond. Ensuite je retire tous les pixels entre le rond et les bords de l'image ce qui nous donne ceci : \"Zone pneu avec le background en moins\" Ensuite on peu retirer les pixels qui ont une valeur dans un channel RGB plus haute qu'un certain seuil : \"Zone avec le reste des couleurs supprimm\u00e9es\" Et la on a ce que l'on veut ! A partir de la c'est les filtres que l'on connait qui sont utilis\u00e9s pour en faire une image plus facile \u00e0 utiliser par Tesseract. 1 : On effectue un Resize de facteur 4 (oui c'est beaucoup mais en m\u00eame temps le chiffre est vraiment petit \u00e0 la base) qui permet d'avoir une image d'une bien meilleure r\u00e9solution. \"Filtre 1\" 2: On fait une Dilatation de facteur 1 pour retirer tout le flou de l'image pour aider Tesseract \"Resultat\" Et on a un chiffre qui est utilisable par Tesseract ! Explication des methodes pr\u00e9cises plus bas Pour r\u00e9sumer : On prend l'image de la zone et on la crop pour ne garder que la partie essentielle On d\u00e9termine le type de pneu avec la couleur moyenne de la zone On retire le background autour de cette zone On retire la couleur qui reste pour ne garder que le chiffre On augmente la r\u00e9solution du chiffre On rend ce chiffre net On envoie l'image trait\u00e9e et filtr\u00e9e \u00e0 Tesseract On d\u00e9termine le nombre de tours que le pilote a fait avec ses pneus avec le r\u00e9sultat de Tesseract DRS Bon ca c'\u00e9tait plut\u00f4t simple j'ai simplement v\u00e9rifi\u00e9 si la moyenne de vert d\u00e9passait une certaine valeur et puis voila. Filtres et methodes sur les images Dans ce projet on a du utiliser diff\u00e9rentes methodes d'\u00e9dition d'image que ce soit sous forme de filtres ou de modification de l'image directement. Voici un sommaire des methodes utilis\u00e9es et comment elles fonctionnent. Tresholding Cette methode sert \u00e0 passer d'une image en couleurs \u00e0 une image binaire noir blanc. C'est une \u00e9tape tr\u00e8s importante pour l'OCR car elle permet (si bien faite) d'isoler du texte de son background. Un exemple ici : \"Exemple treshold\" Le fonctionnement est assez simple mais il peut \u00eatre fait de diff\u00e9rentes mani\u00e8res mais dans mon cas voici comment l'algorythme fonctionne sachant qu'il demande en entr\u00e9e la Bitmap que l'on veut modifier ainsi que la valeur de Treshold : On parcours chaque pixel de l'image On convertir la couleur du pixel en une valeur de gris pour avoir la m\u00eame valeur en R,G et B (Formule utilis\u00e9e : grey = R x 0.3 + G x 0.59 + B x 0.11) Si le r\u00e9sultat de la valeur de gris est au dessus de la valeur de treshold, le pixel est pass\u00e9 en blanc complet et dans le cas contraire il est pass\u00e9 en noir complet On retourne la Bitmap modifi\u00e9e Un algorythme pas forc\u00e9ment complexe mais qui peut augmenter de mani\u00e8re titanesque les chances de r\u00e9ussir une OCR Resize Cette methode sert \u00e0 augmenter la r\u00e9solution d'une image pour am\u00e9liorer la pr\u00e9cision de l'algorythme de Tesseract. En effet, avec trop peu de pixels, la matrice de convolution n'est pas toujours aussi efficace. Il ne faut pas confondre cette methode d'augmentation de la taille avec une simple interpolation. En effet une augmentation de taille interpol\u00e9e ne vas pas vraiment changer la r\u00e9solution, l'image sera toujours aussi pixelis\u00e9e, seulement, les pixels seront compos\u00e9es de plus de pixels comme dans l'exemple ci dessous : \"Exemple d'interpolation lin\u00e9aire\" Dans mon projet j'utilise de l'interpolation bicubique qui va cr\u00e9er de l'information pour tenter de combler le vide et produire une image r\u00e9ellement plus grande et avec plus de details mais en ajoutant du flou. \"Exemple des diff\u00e9rents types d'interpolation\" Le but est d'aller chercher dans les pixels alentours les couleurs qui sont d\u00e9ja pr\u00e9sente et de jouer avec des poids pour tenter de faire une pr\u00e9diction de ce que ce pixel aurait \u00e9t\u00e9 si l'image avait plus de detail. Voici un exemple assez parlant : \"Exemple interpolation bicubique (avant)\" \"Exemple interpolation bicubique (apr\u00e8s)\" On pourrait croire que c'est inutile mais dans le contexte de Tesseract ajouter des d\u00e9tails pour tenter de simuler une meilleure r\u00e9solution m\u00eame en cr\u00e9ant du flou est int\u00e9ressant pour mieux remplir la matrice de convolution. Mais il est possible de r\u00e9duire ce flou avec d'autres m\u00e9thodes \u00e9galement. (Dans mon code je n'ai pas utilis\u00e9 du code fait main mais j'utilise une librairie qui me permet de le faire) Il faut simplement faire attention car c'est un proc\u00e9d\u00e9 assez lourd en performances. Dilatation et Erosion Cette methode et la suivante font partie des methodes de transformation morphologiques. Ces methodes sont utilis\u00e9es pour accentuer les formes et les epaissir ou les r\u00e9duire et les affiner. Elles poss\u00e8dent l'aventage \u00e9galement de retirer le flou d'une image ce qui est tr\u00e8s pratique si utilis\u00e9 apr\u00e8s l'utilisation de methodes comme Resize . Je ne vais pas trop rentrer dans les d\u00e9tails de ces methodes car leur fonctionnement est un peu plus lourd en math si on veut faire une v\u00e9ritable explication du pourquoi et du comment ca marche aussi bien. Pour notre projet je dirais que l'important est de savoir que ce sont deux outils tr\u00e8s pratiques pour changer la morphologie des lettres et des chiffres et qu'on peut les utiliser pour corriger du flou et/ou des art\u00e9facts apparus lors de la binarisation de l'image ou de la suppression de fond. Remove Background Cette methode est assez simple et est juste une methode qui va passer en revue tous les pixels de l'image et si la couleur d'un pixel s'apparente \u00e0 celle d'un pixel de fond il est pass\u00e9 en noir total ou en blanc total. Le but est de permettre au reste du programme de fonctionner avec des couleurs moins ambigues. Une variante sp\u00e9cialis\u00e9e pour la reconnaissance des pneus appel\u00e9e affectueusement Remove Useless cherche \u00e0 atteindre le m\u00eame bu mais est bien plus soffistiqu\u00e9e et sp\u00e9cialis\u00e9e pour retirer le background autour d'un cercle de couleur pour ensuite retirer la couleur et qu'il ne reste qu'un chiffre. Pour plus de details voir la detection de pneus. Il y aussi d'autre methodes comme un filtre Gaussien ou Highlight countour que j'ai du d\u00e9velopper mais que je n'ai pas utilis\u00e9 donc je ne vais pas en parler ici. Petit point r\u00e9solution Comme on peut l'imaginer la r\u00e9solution est extr\u00eamement importante pour l'OCR. Et en avancant sur le projet de l'\u00e9mulateur je me suis rendu compte qu'il \u00e9tait possible de r\u00e9cup\u00e8rer des images en 4K (Plut\u00f4t 1080 avec l'upscaling du lecteur). Cela est une superbe nouvelle car cela permet de simplifier \u00e9norm\u00e9ment le processing sur les diff\u00e9rentes windows. Quelques exemples pour se faire une id\u00e9e \"Echantillon 720P\" ; \"Echantillon 1080P\" \"Echantillon 4K\" Mais il faut savoir que gr\u00e2ce \u00e0 cette simplification j'ai pu aussi cr\u00e9er d'autres methodes de filtrage pour certaines parties. Mais la simplification \u00e9tait obligatoire car avec des images aussi grande il n'\u00e9tait simplement pas possible de venir appliquer les m\u00eames filtres car le temps de traitement serait beaucoup plus long. J'indique ces changements que apr\u00e8s l'explication d'avant car ce sont des changements un peu de derni\u00e8re minute et que la logique expliqu\u00e9e plus haut a \u00e9t\u00e9 tr\u00e8s importante pour le projet OCR m\u00eame si tout n'est plus forc\u00e9ment utilis\u00e9 maintenant que j'ai des images de meilleure qualit\u00e9. Dans la version actuellement disponible la reconnaissance a \u00e9t\u00e9 simplifi\u00e9e sous cette forme : Le \"GapToLeader\" est d\u00e9cod\u00e9 avec un premier passage de Tresholding \u00e0 165 puis un Resize de 2 et une Dilatation de 1 pour retirer le flou Les \"Sectors\" sont d\u00e9cod\u00e9s en utilisant une toute nouvelle methode VanishOxyAction \u00e0 cause des couleurs parfois appliqu\u00e9es et ensuite simplement une methode de Tresholding de 150 pour rendre le r\u00e9sultat assez propre pour l'OCR. Le \"LapTime\" est dabord pass\u00e9 par un Tresholding tr\u00e8s strict de 185 pour pr\u00e9parer la SobelEdgeDetection qui est \u00e9galement une nouvelle methode qu'il a \u00e9t\u00e9 possible d'utiliser gr\u00e2ce \u00e0 la simplification du reste des processus. Le \"Text\" est d\u00e9cod\u00e9 simplement avec un tresholding de 165 maintenant gr\u00e2ce \u00e0 l'image 4K. Les pneus ont leur propre traitement comme expliqu\u00e9 plus haut auquel on ajoute la Dilatation de 1. Comme on peut le voir le traitement est pas mal plus simple mais cela ne veut pas dire que les autres methodes que je n'utilise plus ne sont pas utiles. La reconnaissance n'est pas encore parfaite et je pense que leur utilisation pourrait aider \u00e0 am\u00e9liorer les r\u00e9sultats. (Et parfois ces anciennes methodes sont utiles dans les traitements personnalis\u00e9s des windows elle m\u00eames comme par exemple les pneus qui utilisent la methode GrayScale pour isoler les couleurs) VanishOxyAction Cette methode est une methode plut\u00f4t simple mais qui est importante. Elle se base beaucoup sur le code de la methode Grayscale et sur la methode Tresholding car elle essaie de regrouper le meilleur des deux en r\u00e8glant quelques soucis que ces derni\u00e8res cr\u00e9\u00e9ent. Le soucis avec la methode grayscale c'est que quand le texte est de couleur (Ce qui arrive souvent pour les temps de secteurs) la methode GrayScale rend les couleurs dans une nuance de gris un peu trop sombre ce qui fait que ensuite la methode de Tresholding d\u00e9fonce tout. \"Exemple de secteur en couleur\" \"Exemple de secteur en grayscale\" L'id\u00e9e est alors de prendre pour chaque pixel et de garder uniquement la valeur de R,G ou B la plus haute et de mettre les deux autres canaux au m\u00eame niveau pour avoir une image blanchie qui puisse \u00eatre ensuite utilis\u00e9e avec la methode de Tresholding sans soucis. \"Exemple de secteur blanchi avec vanishoxyAction\" SobelEdgeDetection On pourrait se dire que avec ce genre de methode le tresholding est inutile ensuite mais ca n'est pas le cas car le tresholding sert ensuite pour rendre les contours plus ou moins aggressif. Car m\u00eame si l'image ressemble \u00e0 une image binaris\u00e9e, il reste des nuances que le treshold va pouvoir utiliser. SobelEdgeDetection Cette methode est une methode assez classique que je n'ai pas design\u00e9 moi m\u00eame alors je ne vais pas trop m'\u00e9pancher dessus. En gros on utilise une matrice et une formule math\u00e9matique pour redessiner une image et le r\u00e9sultat est une image avec des contours. Je ne l'ai utilis\u00e9 que pour les temps au tour car ce sont les plus r\u00e9calcitrants. Cette methode a besoin d'une image pass\u00e9e en noir et blanc au pr\u00e9alable \u00e0 laquelle on applique ensuite les matrrices de filtres. Et avec ces filtres ajout\u00e9s \u00e0 l'image on peut ensuite calculer le \"Gradient\" pour cr\u00e9er les bords. Le seul soucis de cette methode c'est qu'elle est assez gourmande et qu'elle fournit des formes creuses d\u00fb \u00e0 la nature des matrices donn\u00e9es. Voici un exemple de ce dont cette m\u00e9thode est capable : Artefacts de la detection de bords de Sobel Apparemment l'OCR aime assez bien cette methode et elle permet de beaucoup moins souvent oublier les '.' ou ':' Traitement des donn\u00e9es C'est bien gentil de recevoir des r\u00e9sultats de l'OCR, cependant on ne peut pas souvent les utiliser comme tels. En effet les resultats ne sont pas tr\u00e8s constants et demandent d'\u00eatre verifi\u00e9s pour savoir si ils doivent \u00eatre pris en compte. Le post traitement de ces donn\u00e9es d\u00e9pend compl\u00eatement du contexte et donc il est diff\u00e9rent pour chque type de window. Voici un floril\u00e8ge des diff\u00e9rents types de traitements : Traitement du nom de pilote Rien de plus que ce qui est d\u00e9ja d\u00e9taill\u00e9 dans la partie OCR Traitement des pneus Pareil Traitement des temps La par contre c'est int\u00e9ressant. Dans un monde parfait je pourrais simplement prendre les r\u00e9sultats de l'OCR et les traiter directement. Mais comme nous vivons dans un monde ou la souffrance et la douleur sont les seules choses autoris\u00e9es on ne peut pas. Le probl\u00e8me vient du fait que les temps que l'on peut trouver sur la F1TV sont encod\u00e9s avec des '.' et des ':' qui determinent les limites entre les chiffres qui d\u00e9signent les minutes, les secondes et les milisecondes. Et le soucis avec ces s\u00e9parateurs c'est qu'ils aiment bien mettre le chaos dans la reconnaissance. Quand ils ne sont pas compris comme des autres chiffres ils sont parfois simplement oubli\u00e9s ou pris en double c'est un enfer. Il faut donc trouver un moyen de detecter quand cela arrive. Et je n'ai pas trouv\u00e9 de meilleur moyen que de faire du cas par cas. Cela peut para\u00eetre simple quand on parle par exemple des secteurs. On sasit que on attend deux chiffres avant un '.' et trois chiffres apr\u00e8s. Il est donc facile de voir que si je trouve six chiffres et pas de s\u00e9paration le troisi\u00e8me est le s\u00e9parateur mal compris. Mais l'exemple qui d\u00e9truit vraiment tout c'est les \u00e9carts avec le leader. Autant un temps au tour c'est toujours x:xx.xxx et un temps de secteur c'est xx.xxx. Mais un \u00e9cart avec le leader ca peut \u00eatre 0.345 comme 1:12.345. Ce qui fait que quand je 121345 est-ce que c'est 12.345 ou 1:21.345...? Souvent on peut quand m\u00eame d\u00e9duire mais cela demande de pr\u00e9voir presque tous les cas limites ce qui est assez p\u00e9nible. On pourrait se dire qu'il suffit de voir si la valeur est trop en dehors des normes. Le soucis c'est que il n'est pas impossible que un temps au tour ou un \u00e9cart prenne d'un coup une grosse diff\u00e9rence. Cela arrive m\u00eame assez souvent quand des pilotes sortent de la piste. \"Exemple temps au tour\" \"Exemple temps secteur\" Pour ce qui est du DRS et de la position des pilotes, il n'y a pas vraiment de traitement suppl\u00e9mentaire. Non pas car la detection est parfaite, mais par ce que la detection ne peut pas rater de 200 facons. Le DRS ne peut retourner que TRUE ou FALSE et la position du pilote est entre 1 et 20 compris. Le peu de nuance fait que ce sont des cas de figures qui ne demandent pas un traitement particulier au del\u00e0 de l'OCR Stockage des donn\u00e9es Dans ce projet le but n'est pas simplement de trouver les donn\u00e9es et les afficher. L'int\u00e9r\u00eat de les r\u00e9cup\u00e8rer est de pouvoir les comparer \u00e0 d'autres donn\u00e9es pr\u00e9c\u00e9dentes. Le vrai soucis de la F1TV c'est justement que l'on ne peut pas facilement voir les \u00e9volutions. On ne peut voir que des \"photos\" de la situation actuelle de la course. Il faut donc garder en m\u00e9moire les diff\u00e9rentes choses qui se sont pass\u00e9es. Techniquement on pourrait stocker ces donn\u00e9es dans de b\u00eates listes C#. Mais le soucis avec ca c'est que m\u00eame si des outils comme LinQ existent, ca n'est pas le plus pratique quand on veut faire des recherches complexes. Il faut aussi voir que si le projet dans sa forme actuelle aurait peut-\u00eatre pu se satisfaire de listes simples, le but est d'ensuite pouvoir construire sur ces bases pour faire des predictions et des insertions de stats beaucoup plus int\u00e9ressantes qui demandent de faire des requ\u00eates complexe rapidement. Je me suis dit que la meilleure methode serait d'avoir une base de donn\u00e9e dans laquelle je peux faire des requ\u00e8tes SQL. Mais commme je n'ai pas besoin de toutes les features de SQl et que je ne veut pas avoir \u00e0 g\u00e8rer un serveur de base de donn\u00e9e et tout ce qui va avec je me suis dit qu'une bonne option serait d'utiliser SQLITE. \"Logo Sqlite\" ; SQLITE est vraiment pratique car cela me permet d'avoir une DB sans avoir de serveur donc pas vraiment complexe ou quoi que ce soit mais qui conserve les aventages de rapidit\u00e9 et d'utilisation de requetes SQl. J'ai cr\u00e9\u00e9 trois tables dans cette base de donn\u00e9e SQLITE que voici : Base de donn\u00e9e Drivers Colonne Type de Data Description Tag ID INTEGER ID du pilote PRIMARY Name VARCHAR Nom du pilote NOT NULL Pitstops Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui a effectu\u00e9 le Pitstop PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL Stats Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui concern\u00e9 PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL LapTime INTEGER Temps au tour (MS) NOT NULL Sector1 INTEGER Temps du secteur 1 (MS) NOT NULL Sector2 INTEGER Temps du secteur 2 (MS) NOT NULL Sector3 INTEGER Temps du secteur 3 (MS) NOT NULL GapToLeader INTEGER Ecart avec le leader (MS) NOT NULL Position INTEGER Position pilote NOT NULL La table Drivers sert juste \u00e0 stocker les diff\u00e9rents noms de pilote pour qu'ils soient utilis\u00e9s dans le reste de la DB La table Pitstops n'est pas vraiment utilis\u00e9e dans l'\u00e9tat actuel du projet. Mais le but \u00e9tait de la remplir d\u00e8s que le programme d\u00e9tectais un arr\u00eat aux stands. Le but est ensuite de pouvoir construire un classement pond\u00e8r\u00e9 en fonction des arr\u00eats des diff\u00e9rents pilotes et d'afficher la stats tout le temps sur l'affichage principal. Elle n'est pas vraiment utilis\u00e9e car la detection de pitstop n'a pas pu \u00eatre commpl\u00eat\u00e9e. De par la nature des donn\u00e9es r\u00e9cup\u00e8r\u00e9es des pneus et des positions, c'est tr\u00e8s difficile de detecter avec prescision un arr\u00eat aux stands. La table Stats est la plus importante car elle contient toutes les informations concernant les pilotes \u00e0 chaque tour. L'id\u00e9e est qu'elle soit remplie \u00e0 chaque tour. Les infos ne sont pas scens\u00e9e \u00eatre les infos live mais plut\u00f4t juste une photo \u00e0 chaque tour de la situation de chaque pilote pour ensuite pouvoir faire des commparaisons tourspar tours. Des donn\u00e9es comme le GapToLeader peuvent \u00e9voluer pendant le tour mais on s'en fiche. Ce qui compte vraiment c'est le temps au tour et les secteurs ainsi que les pneus. Quand remplir la base ? Dans ce projet il y a deux type d'information. Les informations live qui sont stock\u00e9es dans des listes et les informations long terme qui sont stock\u00e9es dans la DB. A chaque it\u00e9ration de l'OCR, les donn\u00e9es r\u00e9cup\u00e8r\u00e9es sont stock\u00e9es dans une liste de DRIVERDATA. Les DRIVERDATA sont des structures de donn\u00e9es qui contiennent toutes les infos d'un pilote \u00e0 un instant T. Elles peuvent \u00eatre incompl\u00eates et sont juste la pour faire de petits calculs et determiner quand ins\u00e8rer des donn\u00e9es permanentes. Ce qui nous am\u00e8ne au moment int\u00e9ressant. Comment on d\u00e9termine quand il est int\u00e9ressant d'ins\u00e8rer des informations dans la base de donn\u00e9es. Il y a deux cas de figure ou on pourrait vouloir ins\u00e8rer des infos : Quand un pilote a finit un tour En effet, j'ai estim\u00e9 que les seuls moments ou on veut garder une photo de la situation du pilote c'est quand il passe d'un tour \u00e0 l'autre. Le raisonnement est le suivant : On ne veut pas conserver TOUTES les donn\u00e9es car si on prend une phot toutes les trois secondes, la majorit\u00e9 des informations seront redondantes avec les pr\u00e9c\u00e9dentes. Mais en m\u00eame temps il ne faut pas rater des changements importants de donn\u00e9es. Les seules donn\u00e9es qui changent entre deux passages de l'OCR sont les \u00e9carts entre les pilotes et de temps en temps un nouveau secteur s'affiche. Alors que d'un tour \u00e0 l'autre presque toutes les informations changent. Et on ne perd que les l\u00e9g\u00e8res fluctuations des \u00e9carts entre les pilotes. J'ai donc d\u00e9cid\u00e9 de conserver une photo par tour. Mais c'est bien joli sauf qu'il reste une difficult\u00e9 : Comment savoir qu'un pilote a fait son tour ? Cela peut para\u00eetre simple comme question mais elle est plus difficile qu'il n'y parait. Il faut savoir que en F1 un pilote peut \u00eatre dans son 26\u00e8me tour pendant qu'un autre en est \u00e0 son 24\u00e8me. Chaque pilote a sa propre course et au fur et \u00e0 mesure que les \u00e9carts se creusent il peut y avoir un tour voir plusieurs d'\u00e9cart entre la queue de course et les premiers pilotes. Ensuite il faut savoir qu'il n'est pas marqu\u00e9 sur la f1TV dans quel tour chaque pilote est. Il faut donc le d\u00e9duire en fonction des Data. Voici le code le if qui d\u00e9tecte un nouveau tour if ( DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Sector3 != 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Sector3 == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Position != - 1 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Position != - 1 ) { //Do stuff } DriverDataLogs est une liste de liste d'informations de pilotes. Chaque DriverDataLogs repr\u00e9sente les 20 photos des donn\u00e9es des pilotes. Cela veut dire que DriverDataLogs[3] repr\u00e9sente toutes les infos des pilotes dans le tour 4 et que DriverDataLogs[3][0] repr\u00e9sente toutes les infos du premier pilote dans le tour 3. Si on analyse un peu ce qui est \u00e9crit avec ces informations, on peut voir que je d\u00e9termine qu'un nouveau tour se d\u00e9finis comme une photo ou le troisi\u00e8me secteur a \u00e9t\u00e9 compl\u00eat\u00e9 et ou il ne l'\u00e9tait pas juste avant. Cela fait sens car quand un pilote compl\u00eate son troisi\u00e8me secteur c'est la que son dernier temps au tour se met \u00e0 jour. Le reste des tests est juste la pour \u00e9viter les faux positifs dans le cas ou un des deux DriverDataLogs[x][x] soit corrompu et que donc la valeur n'aie pas de sens. Cela veut dire que dans des conditions tr\u00e8s sp\u00e9cifiques je pourrais potentiellement rater un tour mais il faudrait vraiment que l'OCR me joue un vilain tour. Quand un pilote a fait un arr\u00eat aux stands Et la on touche le plus difficile. Pourtant un arr\u00eat aau stand ne devrait pas \u00eatre compliqu\u00e9 \u00e0 detecter. C'est quand un pilote change de pneu. Alors il peut changer de pneu en gardant le m\u00eame type de pneu et donc tout repose sur le nombre de tour qu'un pneu fait. Sauf que il faut ajouter \u00e0 cette reflexion qu'un pneu peut \u00eatre chauss\u00e9 sans qu'il soit neuf. Ce qui veut dire que l'on ne peut pas simplement choisir qu'un pilote a chang\u00e9 de pneus quand ses pneus sont \u00e0 1 tour. Il peut tr\u00e8s bien reprendre des pneus de qualif qui peuvent avoir 10 tours dans les pattes. En plus quand le pilote change de pneus il y a un phenomene assez p\u00e9nible qui fait que les deux premiers tours faits avec ne sont pass vraiment d\u00e9chiffrables car ils sont un peu cach\u00e9s derri\u00e8re la lettre qui indique le nouveau pneu chauss\u00e9. Exemple : \"Infographie de pneu qui se chevauche\" Voici le code que j'avais \u00e9crit pour tenter de trouver quand un pilote avait fait un pitstop : if ( data . CurrentTyre . Coumpound != Tyre . Type . Undefined && data . CurrentTyre . NumberOfLaps == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps != 0 ) { //Do stuff } On peut voir que j'essaie de detecter quand le pneu est \u00e0 0 tours (ce qui est le moment ou il y a une lettre \u00e0 la place d'un num\u00e9ro de tour) et que la photo d'avant montrait un pneu normal. On v\u00e9rifie aussi que le pneu a bien \u00e9t\u00e9 detect\u00e9 en verifiant que le pneu n'est pas de type undefined. Le soucis c'est que ce n'est pas rare que l'OCR nous retourne qu'un pneu est vieux de 0 tours et donc il est absolument impossible de faire confiance \u00e0 cette metric. Si on veut utiliser cette methode pour trouver les Pitstop il va falloir avant tout am\u00e9liorer l'OCR sur ce point. Ce soucis mets en lumi\u00e8re un principe assez important de l'informatique \"Ggarbage in, Garbage out\". Si les donn\u00e9es que je recoit ne sont pas g\u00e9niales, le r\u00e9sultat ne sera pas g\u00e9nial non plus. Ce qui est frustrant c'est que la detection des pneus n'est pas si mal mais entre les chiffres qui se chevauchent ce qui nous fait lire 0 alors que c'est juste un un '1' derri\u00e8re un 'H' ou le 1% du temps ou le programme se trompe, on ne peut pour l'instant tout simplement rien faire de mieux. Affichage des donn\u00e9es Maintenant que l'on a stock\u00e9 toutes ces donn\u00e9es, il faut en faire quelque chose sinon ca ne sert a rien. Afficher les donn\u00e9es est techniquement la partie la plus simple du projet. Il faut prendre les donn\u00e9es qui nous int\u00e9ressent de la base de donn\u00e9es et des r\u00e9sultats de l'OCR et les afficher sur des composants Windows Forms. Il y a deux types d'affichages actuellements mis en place dans le projet sur les trois pr\u00e9vus initialement : Affichage direct L'affichage direct est simplement l'affichage du r\u00e9sultat de l'OCR. Par exemple le classement live ainsi que les \u00e9carts entre les pilotes sont affich\u00e9s directement depuis les r\u00e9sultats de l'OCR. Ce ne sont pas forc\u00e9ment des donn\u00e9es prises dans la base de donn\u00e9e. Voici un exemple : for ( int driverCount = 0 ; driverCount < liveData . Count ; driverCount ++) { DriverData driver = liveData [ driverCount ]; lblDriverName . Text = driver . Name ; lblDriverPosition . Text = driver . Position ; lblDriverLapTime . Text = Reader . ConvertMsToTime ( driver . LapTime ); } C'est l'affichage le plus simple et celui qui est le plus soumis \u00e0 des erreurs. En effet, si un pilote est mal detect\u00e9 on le verra directement mal s'afficher dans la Form principale. C'est \u00e9galement l'affichage le moins int\u00e9ressant car il ne cr\u00e9e aucune information, il ne fait que remontrer les infos que l'on peut d\u00e9ja voir dans la F1TV \"Exemple d'affichage live\" Affichage calcul\u00e9 La encore il y a plusieurs types d'affichages : Affichage Hybride Pour ce qui est des affichages hybrides ce sont des affichages qui vont chercher des informations lives et des informations dans la base de donn\u00e9e. Ils ne font pas de calculs \u00e0 proprement parler mais ils affichent plus d'informations que ce que montre la F1TV. Cela veut dire qu'ils repr\u00e9sentent un d\u00e9but de plusvalue par rapport \u00e0 l'alternative qu'est la page DATA de la F1TV. Ils ne sont pas beaucoup plus durs \u00e0 impl\u00e9menter mais demandent de faire des requ\u00eates \u00e0 la base de donn\u00e9e. Comme exemple d'affichage hybride on a l'affichage des cinq derniers tours d'un pilote. C'est un affichage qui ne demande aucun calcul mais qui permet deja de se rendre compte de si le pilote est enn train de perdre ou gagner du temps ou si il est constant, ce qui n'est pas possible actuellement avec la F1TV \u00e0 moins d'avoir une excellente m\u00e9moire. \"Fen\u00eatre d'informations \u00e0 propos d'un pilote\" Voici un exemmple du type de code necessaire pour afficher ce genre de donn\u00e9es: public List <( int LapTime , int Lap )> GetDriverLaptimes ( string driverName , int numberOfLaptimes ) { int driverId = GetDriverID ( driverName ); List <( int LapTime , int Lap )> lapData = new List <( int LapTime , int Lap )>(); string selectQuery = \"Select LapTime,Lap from Stats WHERE DriverID = @driverID ORDER BY Lap DESC LIMIT @limit\" ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@limit\" , numberOfLaptimes ); SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { int lapTime = reader . GetInt32 ( 0 ); int lap = reader . GetInt32 ( 1 ); lapData . Add (( lapTime , lap )); } } return lapData ; } public void Display (){ List <( int LapTime , int Lap )> lapsInfos = Storage . GetDriverLaptimes ( driverName , 5 ); int id = 0 ; foreach (( int LapTime , int Lap ) lapData in lapsInfos ){ Labels [ id ]. Text = LapTime ; id ++; } } Note: Le code montr\u00e9 ici n'est pas forc\u00e9ment le code utilis\u00e9 dans le projet. D'une certaine facon les fen\u00eatres de bataille et de d\u00e9passements sont aussi des hybrides. \"Exemple fen\u00eatre des batailles\" Ici ce sont les batailles qui sont repr\u00e9sent\u00e9es. Aucune donn\u00e9e n'est calcul\u00e9e, c'est litterallement directement les donn\u00e9es de la F1TV, mais la nuance est qu'on ne montre que les pilotes qui sont en train de se battre et que on leur assigne une couleur selon \u00e0 quel point ils sont proches. On a une plus-value sur la F1TV sans pour autant faire de monstres calculs. Pour info, les pilotes consid\u00e8r\u00e9s comme \u00eatant en train de se battre sont les pilotes \u00e0 moins de trois secondes les uns des autres et les couleurs sont suivantes : Vert : Dans la zone de DRS (Moins d'une seconde) Jaune : Plus d'une seconde Noir : Plus de deux secondes \"Exemple fen\u00eatre des d\u00e9passements\" La c'est l'historique des d\u00e9passements qui est affich\u00e9. On pourrait presque dire que c'est un affichage compl\u00eatement calcul\u00e9 car ce ne sont pas des informations disponibles directement sur la F1TV cependant je dirais que cela reste un hybride car il n'y a aucuns calculs. On regarde juste les diff\u00e9rences entre l'ancienne position d'un pilote et la nouvelle et on affiche les changements. Affichage totalement calcul\u00e9 L'affichage compl\u00eatement calcul\u00e9 est un type d'affichage qui ne montre aucune information trouv\u00e9e sur la page de la F1TV. C'est le premier affichage \u00e0 traiter l'information qu'il trouve et il retourne des informations nouvelles. La nuance avec les affichages pr\u00e9dictif est qu'il ne cr\u00e9e pas r\u00e9ellement de l'information, il la d\u00e9duit. Le but est de prendre un certain nombre d'informations trouv\u00e9es sur la page de la F1TV et de calculer des choses pour faire ressortir des tendances \u00e0 l'utilisateur. Cependant on reste sur des informations factuelles. Ce sont des infos d\u00e9duites que techniquement unn humain avec une bonne m\u00e9moire et fort en calcul mental pourrait faire. Mais la c'est fait automatiquement pour tous les pilotes et c'est affich\u00e9 de sorte \u00e0 faire ressortir les valeurs sp\u00e9ciales. Comme c'est un peu plus abstrait, je pense qu'un exemple vaut mieux que 1000 mots. \"Exemple de fen\u00eatre d'informations totalement calcul\u00e9es\" Ci dessus on peut voir un bon exemple. C'est une fen\u00eatre qui montre qui sont les pilotes les plus rapides et les moins rapides et qui montre la diff\u00e9rence de temps au tour. Cette information est totalement d\u00e9duite et n'est en aucun cas trouvable sur la F1TV mais elle n'est pas invent\u00e9e. Elle est simplement calcul\u00e9e. La formule est assez simple, je prend les cinq derniers temps au tour de tous les pilotes. Je fais une moyenne qui donne un temps. Et ensuite je trie les pilotes en fonction de ce temps et je n'affiche que les cinq plus rapide et les cinq plus lents. Ensuite il suffit de prendre le temps le plus rapide et faire une petite soustraction pour avoir l'\u00e9cart. C'est une stat assez int\u00e9ressante car elle lisse les diff\u00e9rences d'un tour \u00e0 l'autre et fait ressortir une tendance. On peut voir pour le grand prix de monaco 2023 par exemple, le moment ou les pneus pluie deviennent plus int\u00e9ressants que les pneus secs car on voit que les pilotes les plus rapides sont les pilotes de fond de grille qui ont chauss\u00e9 les pneus pluie en premier tandis que les plus lents sont les pilotes sur pneus secs vieux. Voici un bout de code qui s'occupe de faire les calculs : List <( int avg , string driverName )> averages = new List <( int avg , string driverName )>(); foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { //We want to recover the last 5 lap times List <( int lapTime , int lap )> laps = Storage . GetDriverLaptimes ( driver . Name , 5 ); if ( laps . Count > 0 ) { int avg = 0 ; foreach (( int lapTime , int lap ) lap in laps ) { avg += lap . lapTime ; } avg = avg / laps . Count ; averages . Add (( avg , driver . Name )); } } Affichage pr\u00e9dictif C'est ici que ca devient vraiment dommage, le projet a mannqu\u00e9 de temps pour impl\u00e9menter des affichages pr\u00e9dictifs mais le potentiel est la ! Un affichage pr\u00e9dictif est un affichage qui cr\u00e9e des informations \u00e0 partir des infos qu'il a mais qui fait plus qu'un calcul. Le but est de tenter de deviner quelque chose. Voici des exemples d'affichages pr\u00e9dictifs qui pourraient \u00eatre mis en place averc l'architecture actuelle du projet : Si un pilote a des pneus depuis plus de 20 tours et que son temps au tour est en chute libre depuis cinq tours. Alors ce pilote va peut-\u00eatre devoir s'arr\u00eater. Si un pilote tourne une seconde au tour plus vite que le pilote devant lui et que ce pilote est \u00e0 10 secondes devant, alors il devrait pouvoir le rattraper d'ici dix tours. Si un arr\u00eat au stand est en moyenne de 23 secondes, alors un pilote 3\u00e8me ressortirais potentiellement 7\u00e8me si il s'arr\u00eate maintenant. Tous ces exemples sont des mini algorythmes pr\u00e9dictifs qui pourraient \u00eatre impl\u00e9ment\u00e9s assez facilement dans l'architecture actuelle du projet et pourraient apporter une immense plus-value si ils sont bien param\u00eatr\u00e9s. On peut m\u00eame imaginer que l'algorythme se corrige tout seul si il voit qu'il a eu tort pour que les course suivante il puisse mieux s'en sortir. Les possibilit\u00e9es sont infinies ! Tests Alors la on arrive \u00e0 la GROSSE erreur de ce projet... Si je ne pouvais changer qu'une seule chose \u00e0 ma facon de faire le projet apr\u00e8s coup c'est ici que je ferai le changement. Les tests sont d'une importance absolument capitale mais si ils sont bien faits, c'est surtout un moyen ultra efficace de v\u00e9rifier que du nouveau code est performant et est beaucoup plus pratique \u00e0 utiliser. Je pense sans rire que j'aurais pu gagner plusieurs jours de travail si j'avais travaill\u00e9 diff\u00e9remment vis-a-vis des tests. Comment ca c'est pass\u00e9 D\u00e8s la cr\u00e9ation du planning pr\u00e9visionnel j'ai fait une erreur capitale. J'ai mis les tests en fin de developpement des features... Et je ne leur ai laiss\u00e9 que tr\u00e8s peu de temps tout en les mettant au milieu du chemin critique ce qui les rends particuli\u00e8rement vuln\u00e9rables si une t\u00e2che du chemin critique est retard\u00e9e. En fait dans ce projet je voulais surtout \u00e9viter de faire comme certains projets que l'on a pu avoir pendant notre formation. C'est \u00e0 dire que je ne voulais surtout pas oublier la doc. Alors j'ai agenc\u00e9 le projet pour commencer par les fondations de la doc, puis en incluant les p\u00e9riodes de programmation et entre ces derni\u00e8re ajouter des Tests dans les trous. Le soucis c'est que du coup les projets \u00e9taient un peu le dernier truc dont je devais me soucier ce qui a \u00e9t\u00e9 une tr\u00e8s mauvaise id\u00e9e. Je me suis retrouv\u00e9 \u00e0 devoir mordre sur les jours de tests car les t\u00e2ches de programmation mettaient plus de temps que pr\u00e9vu (qui elles-m\u00eame auraient p\u00fb \u00eatre plus courte avec une bonne utilisation des tests) et je mme suis retrouv\u00e9 \u00e0 passer outre les tests pour avancer sur le reste du projet. J'ai donc du en panique \u00e0 la toute fin du projet construire quelques tests \"unitaires\" dont l'utilit\u00e9 est tr\u00e8s limit\u00e9e car tout le travail a d\u00e9ja \u00e9t\u00e9 fait et que vu la complexit\u00e9 qu'a pris le projet, faire de vrais tests unitaires est devenu un peu trop compliqu\u00e9 pour valoir le coup. Les seuls tests \"unitaires\" (Je l'\u00e9cris entre quotes car ce ne sont pas vraiment des tests unitaires mais plut\u00f4t des tests tout courts car ils ne sont pas sp\u00e9cifiques) qu'il y a dans le projet final sont des tests exclusivement tourn\u00e9s sur l'OCR. Ils sont d\u00e9ja vraiment pratiques car cela me permet de tester d'autres algorythmes d'OCR et voir si les r\u00e9sultats sont meilleurs ou non mais c'est juste un peu trop tard quoi... Les tests unitaires que j'ai impl\u00e9ment\u00e9s sont un peu tous pareils au niveau du fonctionnement : On choisit une image dans une liste d'images pr\u00e9par\u00e9es qui sont scens\u00e9e repr\u00e9senter le type de donn\u00e9es rencontr\u00e9es par l'application en temps normal On lis le nom de l'image que j'ai mis manuellement en indiquant ce qui \u00e9tait marqu\u00e9 sur l'image On fait un coup d'OCR sur l'image et on compare ce r\u00e9sultat avec la valeur que l'on est scens\u00e9 retrouver En pratique on est sur un code de ce style : [TestMethod()] public void SectorOCR_Test () { string directory = @\"./../../TestImages/Sectors/\" ; foreach ( string file in Directory . GetFiles ( directory )) { Bitmap image = ( Bitmap ) Image . FromFile ( file ); DriverSectorWindow sectorsWindow = new DriverSectorWindow ( image , new Rectangle ( 0 , 0 , image . Width , image . Height ), 1 , true ); string [] paths = file . Split ( '/' ); string fileName = paths [ paths . Length - 1 ]; fileName = fileName . Replace ( \".png\" , \"\" ); int timeMS = ( int ) sectorsWindow . DecodePng (); string time = Reader . ConvertMsToTime ( timeMS ); string [] checkDigits = fileName . Split ( '_' ); string [] digitsToCheck = time . Split ( ':' ); if ( time == \"0:00:000\" ) { Assert . AreEqual ( 0 , Convert . ToInt32 ( checkDigits [ 0 ])); } else { //The ConvertMSToTime will always return three chars so we need to make the checkDigits be also three chars while ( checkDigits . Length != 3 ) checkDigits = new [] { \"0\" }. Concat ( checkDigits ). ToArray (); for ( int i = 0 ; i < checkDigits . Length ; i ++) { //We need to convert to int first because sometimes we have \"08\" and \"8\" and in string its not the same but in int it is Assert . AreEqual ( Convert . ToInt32 ( checkDigits [ i ]), Convert . ToInt32 ( digitsToCheck [ i ])); } } } } Tout le code suppl\u00e9mentaire qui ne fait pas partie des \u00e9tapes cit\u00e9es est juste la pour manipuler le format des r\u00e9sultats pour qu'il soit comparable. \"Exemple d'\u00e9chantillons pour les tests\" Ce qui est pratique avec cette approche c'est qu'il est tr\u00e8s facile de rajouter des cas sp\u00e9cifiques et voir comment le programme les g\u00e8re. Si je vois que un certain nombre est souvent mal reconnu je peux faire expr\u00e8s de le mettre dans le dossier et modifier mon code d'OCR jusqu'\u00e0 ce que le test passe. Si j'avais eu plus de temps j'aurais s\u00fbrement pu ajouter de vrais tests unitaires qui testent des fonctions tr\u00e8s pr\u00e9cises. Par exemple verifier que les diff\u00e9rentes Windows sont bien appel\u00e9es et que les zones se cr\u00e9ent correctement ou m\u00eame plus simplement que la lecture du JSON au d\u00e9marrage marche bien. Il faut savoir que m\u00eame si je n'ai pas eu l'occasion d'\u00e9crire beaucoup de tests sous forme de code. Toute la phase de d\u00e9veloppement de l'OCR j'ai pass\u00e9 plus d'une heure par jour \u00e0 analyser les r\u00e9sultats. Je gardais toutes les images des WINDOWS et je notais dans le nom du fichier ce que l'algorythme trouvais et je passais en revue manuellement les centaines de r\u00e9sultats pour isoler ceux qui posaient probl\u00e8me. C'est comme ca que je me suis rendu compte par exemple que, avec cette police, les 4 et les 1 \u00e9taient souvent confondus. Donc m\u00eame si les tests automatis\u00e9s sont clairement insuffisant par rapport \u00e0 ce que j'aurais peut-\u00eatre du faire, j'ai pass\u00e9 \u00e9norm\u00e9ment de temps \u00e0 tester mon application. Comment ca aurait du se passer Si je devais refaire ce projet aujourd'hui je pense que j'utiliserais un peu la m\u00eame technique que pour la doc. J'aurais mis les t\u00e2ches de Tests directement au d\u00e9but du projet et j'aurais determin\u00e9 le squelette de l'application par la m\u00eame occasion. Je pense que j'aurais mis trois jours pour \u00e9crire tous les tests dont j'aurais besoin et j'aurais fait une strat\u00e9gie de TDD (Test Driven Developpement) par ce que je pense que ca marcherait vraiment super bien sur ce type de projet. J'aurais pris je pense 5 une dixaine d'images compl\u00eates de la F1TV de plusieurs GP diff\u00e9rents et j'aurais mis toutes les fen\u00eatres d\u00e9coup\u00e9es dans des fichiers avec des tests comme ceux que j'ai fait pour ce projet. Et comme ca je saurai que mon algo est bon uniquement quand il aura r\u00e9ussi \u00e0 passer tous les tests. Cela r\u00e8glerait le soucis que j'ai eu le plus : Me retrouver \u00e0 devoir changer l'OCR 5 fois par ce que \u00e0 chaque fois que je d\u00e9veloppe une nouvelle feature je me rends compte d'une faiblesse mon algorythme... Non seulement j'aurai eu beaucoup plus de facilit\u00e9 \u00e0 avancer sur le projet, mais en plus je pense que cela m'aurait fait gagner \u00e9norm\u00e9ment de temps non seulement car je n'ai plus \u00e0 tester tout \u00e0 la main mais en plus par ce que ca veut dire que quand l'OCR passe les tests je n'ai plus jamais \u00e0 m'en soucier. Lecons Je pense que dans mes futurs projets je mettrai les tests en d\u00e9but de projet plut\u00f4t que \u00e0 la fin et je ferai en sorte qu'ils fassent partie du chemin critique et que je ne puisse pas passer \u00e0 c\u00f4t\u00e9 sous pretexte que \"Je n'ai pas le temps\". Ecrire des tests c'est jamais marrant et c'est encore moins marrant quand ils nous emp\u00eachent d'avancer. Mais je suis convaincu que au final c'est un gain de temps et de s\u00e9r\u00e9nit\u00e9 incontournable. R\u00e9sum\u00e9 des difficult\u00e9s techniques Ici je vais parler tr\u00e8s rapidement des difficult\u00e9es techniques rencontr\u00e9es. Si vous voulez tout savoir \u00e0 propos des difficult\u00e9es vous pouvez aller lire le journal de bord. C'est aussi pour \u00e9viter de me r\u00e9p\u00e8ter par rapport aux explications des diff\u00e9rents points dans l'analyse organique. Je vais pas non plus parler des difficult\u00e9es rencontr\u00e9e avec des choses que je n'ai pas gard\u00e9 dans le programme final donc il est normal que vous vous disiez qu'il n'y a pas eu tant de difficult\u00e9s que ca. Browser Headless Il y avait plusieurs difficult\u00e9es techniques avec cette histoire de Browser Headless. Deja pouvoir lancer un browser headless et le contr\u00f4ler. C'est difficile car il faut trouver la bonne librairie et ensuite il faut trouver le bon exectuable de geckoDriver qui permette de faire fonctionner l'application m\u00eame si l'utilisateur n'a pas Firefox sur sa machine. Ensuite la seconde difficult\u00e9 est celle de ne pas se faire chopper comme un bot par le site de la F1TV. Il faut savoir qu'\u00e0 ce jour je n'ai toujours pas r\u00e9ussi \u00e0 faire croire \u00e0 la page de login de la F1TV que j'\u00e9tais un user normal en utilisant Selnnium mais au moins maintenant je peux acc\u00e8der aux vid\u00e9os tranquillement. Ce soucis de ne pas pouvoir se connecter avec la page de login \u00e0 la plus grosse difficult\u00e9 technique de cette partie du projet : la connexion automatique. Pour me connecter \u00e0 la F1TV avec un browser headless la seule solution que j'ai trouv\u00e9 a \u00e9t\u00e9 d'utiliser des cookies. Et pour que l'utilisateur n'aie pas \u00e0 aller chercher les siens dans son navigateur il a fallut trouver une technique pour aller les chercher directement sans lui demander son avis. Autre difficutl\u00e9, comme on travaille avec un site web que l'on ne contr\u00f4le pas, il faut trouver un moyen de g\u00e8rer les erreurs et de r\u00e9essayer parfois et attendre quand il faut dans les cas ou le chargement est long etc... Ensuite apr\u00e8s tout ca la derni\u00e8re difficult\u00e9 a \u00e9t\u00e9 de pouvoir contr\u00f4ler le firefox Headless assez bien pour qu'il puisse non seulement naviguer les pages mais aussi qu'il puisse cliquer sur des boutons qui ne s'affichent pas tout le temps. (Je ne vais pas mentioner la difficult\u00e9 que ca a \u00e9t\u00e9 de mettre le browser en 4K pour des raison de sant\u00e9 mentale) OCR Les difficult\u00e9es ici sont dans un autre niveau. Chaque type de donn\u00e9e repr\u00e9sentait sa difficult\u00e9 \u00e0 lui tout seul sans compter l'optimisation. Pour commencer on a le texte pour les noms de pilotes. Il a fallu trouver un syst\u00e8me qui puisse reconnaitre le texte et qui puisse comparer le r\u00e9sultat avec les pilotes que l'on connait. Ensuite il a fallu trouver un moyen de detecter la diff\u00e9rence entre les fen\u00eatres de DRS o\u00f9 il est ouvert ou ferm\u00e9. Il fallait \u00e9galement faire attention \u00e0 ne pas faire de faux positifs. Pour les temps par secteurs il a fallu trouver des filtres qui permettent de bien diff\u00e9rencier les '1' et les '4' sans les confondre et il a aussi fallut trouver un moyen de filter l'image pour que dans le cas ou le texte serait en couleur ca fonctionne quand m\u00eame. (Car oui un filtre de nuances de gris ne marche pas super avec des couleurs sombres) Pour les pneus (le plus dur) il a fallut trouver un moyen de trouver sur toute la longeur de la zone la partie int\u00e9ressante. Ensuite il a fallut trouver une technique pour savoir quel type de pneu c'est en fonction de la couleur moyenne et ensuite le plus dur a \u00e9t\u00e9 d'isoler le chiffre du dessin autour car Tesseract aime pas les formes, le tout automatiquement. Pour les temps au tour il a fallut trouver un moyen de ne pas confondre les ponctuations avec des chiffres tout en ne les ratant pas. Et il a fallu trouver un moyen de detecter quand in\u00e9vitablement cela arrive quand m\u00eame. Et la derni\u00e8re difficult\u00e9 (la plus p\u00e9nible) a \u00e9t\u00e9 de detecter les \u00e9carts entre les pilotes. Il a fallut trouver une facon de decoder le texte en temps mais aussi de faire tout un syst\u00e8me qui d\u00e9tecte et r\u00e8gle les cas ou un ':' a \u00e9t\u00e9 oubli\u00e9 ou confondu tout en ne sachant pas si il \u00e9tait scens\u00e9 y en avoir \u00e0 la base car les valeurs peuvent varier entre '1_23.657' et '0.452'. Stockage Pour ce qui est du stockage la grande difficult\u00e9 a \u00e9t\u00e9 de savoir quand un pilote avait avait finit un tour car chaque pilote finit son tour \u00e0 un moment diff\u00e9rent. Il a \u00e9galement fallut trouver un moyen de savoir les donn\u00e9es d'un pilote \u00e9taient logiques. Une difficult\u00e9 qui n'a pas \u00e9t\u00e9 compl\u00eatement d\u00e9pass\u00e9e est de savoir quand un pilote a fait un arr\u00eat aux stands car la detection de l'age des pneus est plus que mauvaise. Voila. Ce fut une petite liste non exhaustive de quelques difficult\u00e9s techniques que j'ai rencontr\u00e9 pendant ce projet. Optimisation du programme Ici je vais parler des techniques que j'ai utilis\u00e9 pour r\u00e9duire le temps de traitement de chaques images de 50 secondes \u00e0 un peu moins de 3 sur le processeur de mon laptop. En effet, dans les premi\u00e8res version du projet, traiter l'int\u00e9gralit\u00e9 d'une image pouvait prendre presque une minute. Ce qui est compliqu\u00e9 dans ce projet c'est qu'il y a un certain nombres de choses que je ne contr\u00f4le pas. En utilisant Tesseract, je me retrouve avec des incompressibles. En imaginant que l'OCR sur une image prenne 300ms, m\u00eame si j'avais 180 threads capables de faire cette t\u00e2che en m\u00eame temps, le temps de traitement sera toujours d'au moins 300ms. Cr\u00e9er une instance de Tesseract prend \u00e9galement du temps. Ma mission n'est donc pas d'arriver \u00e0 des temps de quelques dixaines de milisecondes mais plut\u00f4t de rajouter le moins de temps possible pendant le traitement et de tenter de faire le plus du choses possible en paralelle. I Ethique du projet [A remplir \u00e0 la fin du projet pour parler des questions ethiques du projet (Ex: Utilisation potentiellement abusive de la F1Tv ou L'histoire des cookies)] Utilisation de Chat GPT [A remplir \u00e0 la fin du projet] Am\u00e9liorations futures [A remplir dans les derni\u00e8res semaines du travail de dipl\u00f4me] Conclusion [A remplir la derni\u00e8re semaine du travail de dipl\u00f4me] Notes de code Glossaire","title":"Rapport Track Trends V1.0"},{"location":"index.html#rapport-track-trends-v10","text":"Rohmer Maxime Travail de dipl\u00f4me Technicien ES 2023","title":"Rapport Track Trends V1.0"},{"location":"index.html#introduction","text":"","title":"Introduction"},{"location":"index.html#resume","text":"Track Trends est un outil de r\u00e9cup\u00e9ration et d'analyse de donn\u00e9es de courses de Formule 1. Pour le contexte, en dehors des cours, j'exerce diff\u00e9rentes activit\u00e9s dont celle de Live Ticker F1 pour le 20 minutes. Pour m'aider dans ce travail, j'utilise actuellement la F1TV \u00e0 laquelle je suis abonn\u00e9 qui me propose non seulement un feed vid\u00e9o de meilleure qualit\u00e9 avec des commentaires plus pertinents que ceux de la RTS mais qui aussi me permet d'acc\u00e9der \u00e0 un feed vid\u00e9o tr\u00e8s important : la chaine data. Ce dernier ressemble \u00e0 cela : \"Screenshot du feed data de la f1tv\" (Attention ce n'est pas un joli tableau HTML, mais bien une vid\u00e9o qui contient un tableau.) Sauf que toutes les informations sont \u00e9tal\u00e9es p\u00eale-m\u00eale sans hi\u00e9rarchie ce qui fait que cela me prendrait trop de temps de tout d\u00e9chiffrer \u00e0 chaque fois, ce qui me fait rater des choses int\u00e9ressantes. Le but du projet est donc de fournir un outil qui hi\u00e9rarchise et affiche diff\u00e9remment les donn\u00e9es pour faciliter leur lecture et me permettre de faire de meilleurs commentaires.","title":"R\u00e9sum\u00e9"},{"location":"index.html#abstract","text":"Track Trends is a Formula 1 data is a tool that displays and interpret data. To understand everything,first ,a little bit of context. In my free time I have multiple activities and one is to be the Live Ticker F1 for the local journal \"20 minutes\" (Owned by Tamedia). to help me in this work I'm currently using the F1TV to which I'm currently subscribed because it provides me with a better video feed with better commentary than the ones from the RTS (in my opinion) but also because it gives me access to a very important video feed : the data channel You can see in the chapter above an example of the F1TV DATA CHANNEL. [Note : Even tough it looks like a pretty HTML table on wich you could easely get infos... Its not. Its a video feed] You can see a lot of data all well and good BUT! All the data is displayed the same in a big table which make it really hard to read totally in a hurry, which means that I miss a lot of useful information. The point of the project then is to provide a tool that can display those data by taking into account their relevance. So for example a driver that is 10s away from everyone and that is doing some normal lapTimes will be less displayed or even not displayed at all so I can focus on the drivers that are battling each others. This tool would help me not miss the battles and details that are happening in the back and therefore not being broadcasted on TV.And it could be a usefull tool for anyone who wants a better insight of how the race is going by looking at the data. This kind of project already exists in the form of the AWS tool \"F1 Insight\" but it is not avaible to the public. We can only see some of its predictions (that are trash) and data dumps in the live feed when the TV directors feel like it.","title":"Abstract"},{"location":"index.html#description-du-besoin","text":"Comme expliqu\u00e9 dans le r\u00e9sum\u00e9, je suis Live Ticker F1. Mais pour mieux comprendre le besoin que j'ai, je pense qu'il est pertinent de comprendre comment je travaille. Pendant un Grand Prix de Formule 1 j'ai plusieurs t\u00e2ches \u00e0 effectuer : Suivre les diff\u00e9rents \u00e9v\u00e8nements du Grand Prix Changer le titre et la photo de titre du Live Chercher des Tweets ou des Images \u00e0 int\u00e9grer Ecrire les commentaires en faisant attention \u00e0 dire ce qu'il se passe mais aussi l\u2019expliquer, ce que cela implique, mais aussi ce que cela veut dire pour le reste de la course. Comprendre et expliquer les strat\u00e9gies Tout cela toutes les cinq minutes max... Cela veut dire que je dois \u00eatre le plus rapide possible quand je cherche des informations. Et comme le tableau en comporte trop et bien, je suis oblig\u00e9 de le lire en diagonale. Par exemple dans le tableau, les infos que je cherche le plus sont : Le nombre de places gagn\u00e9es (surtout au d\u00e9part) Les \u00e9carts entre les pilotes (surtout ceux qui sont en dessous de deux secondes). Les pneus de chaque pilote et combien de tours, ils ont fait dessus Les temps d'arr\u00eats aux stands Les temps au tour (surtout pour la strat\u00e9gie) Mais pleins d'autres informations existent si on les recoupe sur plusieurs tours. Un outil qui permettrait de mettre en \u00e9vidence les informations importantes serait donc une tr\u00e8s grosse plus-value pour mon travail et s'il est facile \u00e0 installer et \u00e0 utiliser, il se pourrait qu'il devienne indispensable.","title":"Description du besoin"},{"location":"index.html#cahier-des-charges","text":"Il s'agit d'une version coup\u00e9e du cahier des charges qui ne contient pas l'explication du contexte. Mais l'original est disponible sur ce site \u00e9galement. Il est toutefois normal d'y voir des choses r\u00e9p\u00e9t\u00e9es ou l\u00e9g\u00e8rement diff\u00e9rentes, en effet, il n'a pas \u00e9t\u00e9 \u00e9crit en m\u00eame temps que le reste de ce document.","title":"Cahier des charges"},{"location":"index.html#projet","text":"Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes. Le but est non seulement de faciliter mon job, mais aussi faire en sorte d'am\u00e9liorer la plus-value de mon travail en me permettant de fournir des commentaires qui ne sont pas disponibles pour le tout venant qui regarde simplement le flux RTS. Exemples : Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand Maintenant afficher diff\u00e9remment les infos, c'est sympa, mais cela serait encore mieux de traiter ces data et de permettre des petites pr\u00e9dictions. Exemples : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents","title":"Projet"},{"location":"index.html#realisation","text":"Malheureusement, la Formula 1 Management ne propose aucune API publique qui puisse nous permettre de faire ce projet \"simplement\". La raison la plus probable \u00e9tant qu'Amazon avec son service AWS propose exactement ce genre de services pour le flux t\u00e9l\u00e9vis\u00e9 et il doit y avoir un contrat d'exclusivit\u00e9. Il existe des API \"Pirates\" faites par la communaut\u00e9, le probl\u00e8me est qu'elles ne sont pas forc\u00e9ment des plus pratiques \u00e0 utiliser. Mais comme je poss\u00e8de un abonnement premium ++ \u00e0 la F1TV, j'ai acc\u00e8s pour chaque grand prix \u00e0 un flux vid\u00e9o nomm\u00e9 : DATA F1 CHANNEL Qui ressemble \u00e0 \u00e7a : \"Exemple de la Data Channel\" Donc la seule fa\u00e7on que je vois de r\u00e9cup\u00e9rer ces donn\u00e9es est de les prendre directement sur ce feed. M\u00eame si le but final de l'application est de faire pleins de choses super avec les datas, le gros du projet va surtout \u00eatre la r\u00e9cup\u00e9ration des donn\u00e9es et leur stockage. Les donn\u00e9es viennent du flux vid\u00e9o et ainsi dans un premier temps, il va falloir r\u00e9cup\u00e9rer d'une mani\u00e8re ou d'une autre des images qui viennent d'un grand prix en direct ou en rediffusion. Ensuite, dans un second temps, il faut lire les informations directement sur l'image en utilisant une librairie pr\u00e9vue pour (exemple Tesseract) et v\u00e9rifier l'int\u00e9grit\u00e9 de ces derni\u00e8res pour qu'on puisse ensuite les stocker. Dans un troisi\u00e8me temps, il faut stocker toutes ces donn\u00e9es dans une forme qui permette d'aller facilement faire des requ\u00eates de r\u00e9cup\u00e9ration et d\u00e9j\u00e0 pr\u00e9parer des m\u00e9thodes qui permettent de r\u00e9cup\u00e9rer des infos importantes (ex : la moyenne des cinq derniers tours, le temps moyen d'arr\u00eat etc.) pour faciliter la derni\u00e8re \u00e9tape Quand tout cela est fait, on peut ensuite s'amuser un peu avec les Data. La derni\u00e8re \u00e9tape est donc l'affichage. L'id\u00e9e est de cr\u00e9er une Windows Form qui contienne toutes ces informations dans un format beaucoup plus lisible et avec laquelle on pourrait interagir pour permettre de plus facilement commenter les Grands Prix. (exemple plus bas avec un croquis de ce \u00e0 quoi l'application pourrait ressembler) Voici la liste des donn\u00e9es qui pourraient \u00eatre affich\u00e9es (Non contractuel, simplement des id\u00e9es). Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand La moyenne de temps que les pilotes perdent dans les stands La performance moyenne des 5 types de pneus La moyenne de temps de chaque pilote sur le pneu actuel Le nombre de points que chaque pilote gagnerait selon sa position Le classement de la course Voire m\u00eame si c'est possible : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents Pr\u00e9dire les temps au tour de chaque pilote selon l'usure des pneus Voici un exemple d'interface possible pour une page : \"Protype de l'app fait sur Figma\"","title":"R\u00e9alisation"},{"location":"index.html#cas-dutilisation","text":"'*'On va consid\u00e9rer que tous les user ont un abonnement F1 TV PRO Un user veut r\u00e9cup\u00e9rer les data : Il ouvre son navigateur et lance la page DATA de la F1 TV Il calibre la capture des data via le programme (pour la premi\u00e8re utilisation). Il confirme que les donn\u00e9es initiales sont bonnes (pour la premi\u00e8re utilisation). Il regarde tranquille son Grand Prix Le programme r\u00e9cup\u00e8re les data : Il r\u00e9cup\u00e8re des images depuis la F1TV Il utilise Tesseract (ou autre) pour en r\u00e9cup\u00e9rer les infos. Il met ces infos dans un Objet Pilote, dans un Objet course avec un attribut tour pour hi\u00e9rarchiser les data Pour ce qui est de l'affichage, l'id\u00e9e est de faire une application C# comme on l'a appris \u00e0 l'\u00e9cole, mais avec assez de style pour qu'elle puisse \u00eatre agr\u00e9able \u00e0 utiliser. Quand le programme affiche les data : Il prend les donn\u00e9es venant directement de la F1TV. Il affiche diff\u00e9remment les donn\u00e9es pour permettre une meilleure lisibilit\u00e9 Il interpr\u00e8te avec des r\u00e8gles plut\u00f4t simples certaines data pour faire des minipr\u00e9dictions ou aider \u00e0 la lecture Il r\u00e9cup\u00e8re des infos d'autres courses pour les comparer et proposer des pr\u00e9dictions plus int\u00e9ressantes","title":"Cas d'utilisation"},{"location":"index.html#difficultes-techniques","text":"R\u00e9cup\u00e9rer un flux vid\u00e9o plut\u00f4t propre malgr\u00e9 les contres mesures de la F1 TV pour en emp\u00eacher la lecture par un logiciel Si on doit passer par une capture d'\u00e9cran, trouver un moyen de stocker les donn\u00e9es de mani\u00e8re \u00e0 pr\u00e9voir que parfois un tour pourrait avoir plus de donn\u00e9es qu'un autre, que le user peut mettre pause, ou m\u00eame qu\u2019il revienne en arri\u00e8re. D\u00e9velopper des algorithmes pour r\u00e9cup\u00e9rer les donn\u00e9es comme les diff\u00e9rents pneus utilis\u00e9s ou l'activation du DRS ainsi que d\u00e9velopper des moyens de nettoyer les r\u00e9sultats de l'OCR (Par exemple utiliser diff\u00e9rents champs redondants pour comparer les r\u00e9sultats) Stocker les donn\u00e9es sur une base pour les traiter plus tard tout en pr\u00e9voyant un moyen de voir les stats live D\u00e9velopper des algorithmes de pr\u00e9diction qui prennent en compte d'anciennes courses pour tenter de pr\u00e9dire des choses comme les arr\u00eats aux stands par exemple.","title":"Difficult\u00e9s techniques"},{"location":"index.html#differences-sur-le-cahier-des-charges","text":"Ici je vais parler de l'\u00e9t\u00e2t du projet \u00e0 la date du 12 Juin 2023. A cette date, le projet est fonctionel mais comporte quelques diff\u00e9rences avec le cahier des charges original. Je vais expliquer non seulement ces diff\u00e9rences mais aussi les raisons qui font qu'elles sont la. Pour bien comprendre les diff\u00e9rences il faut s'en r\u00e9f\u00e8rer au cahier des charges original. L'application doit \u00eatre \"Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes\". C'est ca la phrase la plus importante dans tout le CDC. Et je pense que tr\u00e8s honn\u00eatement, ce cahier des charges est rempli ! L'application actuellement disponible sur le r\u00e9po GIT est une application de style compagnion Windows Forms qui r\u00e9cup\u00e8re les infos de la F1TV en temps r\u00e9el et elle affiche les informations qu'elle trouve importante. Donc je dirais que l'objectif g\u00e9n\u00e9ral est remplis. Maintenant c'est dans les d\u00e9tails que cela p\u00eache. Il est mentionn\u00e9 trois exemples d'infos \u00e0 suivre je cite : \"Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre).\" \"Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps\" \"Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand\" r\u00e9sultats : Dans l'application on peut effectivement voir les pilotes proches (Ce sont ceux qui sont \u00e0 moins de 3 secondes dans le version finale) Dans l'application on peut aussi voir un affichage qui permet de voir les pilotes les plus rapides et les plus lents sur le circuit. On ne peut en revanche pas voir de classement pond\u00e9r\u00e9 selon les arr\u00eats aux stands car l'application a du mal \u00e0 detecter des arr\u00eats. Ensuite pour ce qui est des pr\u00e9dictions il n'y en a aucunes comme ca c'est simple. Si on ne regarde que de tr\u00e8s loin le CDC et le projet final on pourrait dire que c'est plut\u00f4t d\u00e9cevant car il manque beaucoup de choses comme les pr\u00e9dictions et certains affichages. On peut aussi se dire ca en comparant la maquette du CDC et le r\u00e9sultat final. \"Maquette originale du projet faite sur Figma\" \"Maquette originale du projet faite sur Figma\" Clairement un oeuil non avis\u00e9 pourrait \u00eatre tr\u00e8s d\u00e9cu et pourrait dire que c'est un echec. Et moi je vais vous expliquer pourquoi au contraire c'est un total succ\u00e8s. D\u00e9ja, la beaut\u00e9 de l'interface est tr\u00e8s difficile a r\u00e9pliquer en Windows Forms et il faudrait plus d'une semaine de travail pour arriver \u00e0 quelque chose qui pourrait ressembler un tout petit peu \u00e0 la maquette. Ensuite, si on regarde bien, on a quand m\u00eame une application qui nous permet de suivre les informations de la course et qui calcule des choses \u00e0 notre place. C'est d\u00e9ja une grosse plus-value par rapport \u00e0 la page Data de la F1TV. Et finalement, les pr\u00e9dictions, les affichages et le style ce sont les choses les moins compliqu\u00e9es du projet. On ne se rends pas compte que pour simplement afficher les 20 pilotes dans le bon ordre il faut \u00e9norm\u00e9ment de travail. Voici une petite repr\u00e9sentation graphique de la quantit\u00e9 de travail nescessaire pour en arriver \u00e0 l'\u00e9t\u00e2t actuel du projet : \"Graphique repr\u00e9sentant la quantit\u00e9 de travail requise\" Pour en arriver \u00e0 un affichage il a fallu r\u00e9cup\u00e8rer automatiquement les images en utilisant un browser headless ce qui a pris un temps fou \u00e0 mettre en place et il a fallu surtout lire les informations que l'on recevait des images. J'ai pass\u00e9 presque 90% du temps de mon projet \u00e0 d\u00e9velopper des choses qui permettront ensuite de faire de l'affichage. Le fait qu'il y aie quoi que ce soit de logique qui s'affiche cela veut dire que TOUT LE RESTE fonctionne ! Le moindre soucis \u00e0 la r\u00e9cup\u00e9ration des images, ou surtout \u00e0 la reconnaissance de texte et de chiffres et l'affichage est ruin\u00e9. Si j'avais pass\u00e9 ne serait-ce qu'une semaine de plus juste sur l'affichage le r\u00e9sultat final n'aurait rien \u00e0 voir. Le soucis c'est simplement que le cahier des charges ne parle pas du tout du reste du projet et ne parle que du r\u00e9sultat final. Pour toutes ces raisons je dirais que le CDC \u00e9tait trop superficiel mais que l'application est conforme \u00e0 l'id\u00e9e g\u00e9n\u00e9rale de ce dernier et qu'il serait tr\u00e8s facile de la rendre parfaitement conforme maintenant que tout le travail de fond a \u00e9t\u00e9 fait et fonctionne et je pense donc que c'est un succ\u00e8s.","title":"Diff\u00e9rences sur le cahier des charges"},{"location":"index.html#planning-previsionnel","text":"Mes suiveurs m'ont demand\u00e9 un planning de type GANTT pour ce travail de dipl\u00f4me Je n'ai pas utilis\u00e9 un logiciel particulier pour faire ce dernier, mais je me suis inspir\u00e9 des principes fondamentaux d'un diagramme de ce type. Comme l'original a \u00e9t\u00e9 fait sur Excel, je ne peux pas vraiment l'ins\u00e9rer de mani\u00e8re lisible ici, mais il est disponible dans le dossier Planning. Mais voici un r\u00e9sum\u00e9 de son contenu :","title":"Planning pr\u00e9visionnel"},{"location":"index.html#taches","text":"J'ai d\u00e9cid\u00e9 de d\u00e9composer mon planning en trois grands types de t\u00e2ches. Programmation Documentation Tests L'id\u00e9e est de permettre une meilleure lisibilit\u00e9 et de me permettre \u00e0 moi de me faire plus facilement \u00e0 l'id\u00e9e de ce qu'il m'attend. Voici la liste des t\u00e2ches par rubrique :","title":"T\u00e2ches"},{"location":"index.html#pt","text":"Cette rubrique contient les t\u00e2ches qui n'ont pas leur place dans les trois cat\u00e9gories principales.","title":"PT"},{"location":"index.html#pt1-preparation-au-travail-de-diplome-2","text":"Cette t\u00e2che est un peu hors cat\u00e9gorie, mais c'est normal, c'est une supert\u00e2che qui regroupe beaucoup de choses. C'est une t\u00e2che qui est planifi\u00e9e pour deux jours et qui normalement devrait \u00eatre faite les deux premiers jours du travail. Le but est de pr\u00e9parer tout ce qui peut \u00eatre pr\u00e9par\u00e9 en avance niveau documentation et mise en place pour ne pas avoir besoin de s'en soucier ensuite.","title":"PT1 / pr\u00e9paration au travail de dipl\u00f4me (2)"},{"location":"index.html#dt","text":"Rubrique documentation qui contient toutes les t\u00e2ches en rapport de pr\u00e8s ou de loin avec la documentation du projet.","title":"DT"},{"location":"index.html#dt1-creation-du-poster-1","text":"Cette t\u00e2che consiste \u00e0 faire une version num\u00e9rique du poster qui soit en accord avec les consignes qu'on nous a donn\u00e9es. Le but est aussi et surtout de faire poster dont je sois fier et que je sois content de montrer. Il y a d\u00e9j\u00e0 des croquis de poster et j'ai clairement pr\u00e9vu de travailler sur \u00e7a pendant les vacances alors, je n'ai mis qu'un jour et je l'ai plac\u00e9 juste avant le rendu de ce dernier.","title":"DT1 Cr\u00e9ation du poster (1)"},{"location":"index.html#dt2-documentation-analyse-de-lexistant-2","text":"Cette t\u00e2che est d\u00e9di\u00e9e \u00e0 l'\u00e9criture de la documentation et plus pr\u00e9cis\u00e9ment de l'analyse de l'existant. Comme il y a pas mal de technologies utilis\u00e9es dans mon projet, j'aimerais faire correctement un vrai debrief de pourquoi j'ai utilis\u00e9 l'une ou l'autre alors, j'ai assign\u00e9 deux jours dessus.","title":"DT2 Documentation Analyse de l'existant (2)"},{"location":"index.html#dt3-documentation-analyse-organique-5","text":"Cette t\u00e2che est la plus grosse dans la cat\u00e9gorie documentation. Il s'agit de documenter comment l'application fonctionne. J'y ai mis cinq jours et je pense que c'est un minimum car c'est dans cette t\u00e2che que je vais devoir d\u00e9tailler exactement comment fonctionne chaque partie du projet. Ces cinq jours sont \u00e9parpill\u00e9s sur le projet en g\u00e9n\u00e9ral \u00e0 la fin du d\u00e9veloppement de chaque grande partie de projet. Le but est de ne rien oublier et de ne pas avoir \u00e0 tout faire en m\u00eame temps.","title":"DT3 Documentation Analyse organique (5)"},{"location":"index.html#dt4-documentation-analyse-fonctionnelle-2","text":"Cette t\u00e2che est d\u00e9j\u00e0 moins grosse, elle consiste \u00e0 documenter le fonctionnement de l'application et comment utiliser les composants que j'ai d\u00e9velopp\u00e9s. Je l'ai mis en fin de projet, car comme j'ai l'habitude de faire des analyses fonctionnelles plut\u00f4t pr\u00e9cises, le moindre changement dans l'UI peut tout rendre obsol\u00e8te. J'y ai mis deux jours, car j'aimerais correctement documenter avec de bonnes photos et sc\u00e9narios pour qu'on puisse voir toutes les possibilit\u00e9s de l'application.","title":"DT4 Documentation Analyse fonctionnelle (2)"},{"location":"index.html#dt5-documentation-tests-1","text":"Cette t\u00e2che est un peu plus petite qu'elle ne le devrait. Elle concerne la documentation des diff\u00e9rents tests. Je n'y ai mis qu'un seul jour, car en r\u00e9alit\u00e9 les diff\u00e9rentes t\u00e2ches de tests contiennent aussi beaucoup de documentation,","title":"DT5 Documentation Tests (1)"},{"location":"index.html#dt6-documentation-reste-2","text":"Cette t\u00e2che est une t\u00e2che un peu vague. Elle contient toutes les actions autres que j'aurai besoin de faire (Mise au propre, orthographe, g\u00e9n\u00e9ration de PDF ...). J'y ai mis deux jours pour avoir un peu de marge, car ce sont toujours des t\u00e2ches qui paraissent faciles, mais qui \u00e0 la fin prennent beaucoup de temps si on les fait bien.","title":"DT6 Documentation Reste (2)"},{"location":"index.html#pt_1","text":"Rubrique programmation qui contient toutes les t\u00e2ches qui touchent \u00e0 la programmation et au d\u00e9veloppement de l'application.","title":"PT"},{"location":"index.html#pt1-programmation-recuperation-des-images-3","text":"Cette t\u00e2che est estim\u00e9e \u00e0 seulement trois jours, il ne faut pas s'y m\u00e9prendre, c'est une des t\u00e2ches les plus dures et lourdes niveaux documentation en explications. Cependant, un POC (Proof Of Concept) assez avanc\u00e9 a d\u00e9j\u00e0 \u00e9t\u00e9 fait et donc cela permet de n'envisager que trois jours, car il suffit de l'impl\u00e9menter et de la paufinner. Cette t\u00e2che consiste \u00e0 prendre en entr\u00e9e un lien de Grand Prix et de sortir une image tous les x secondes de la page DATA. Cela peut sembler simple, mais pour le faire sans prendre d'espace d'\u00e9cran et ne demandant pas \u00e0 l'utilisateur de copier-coller quoi que ce soit o\u00f9 de donner ses identifiants F1TV c'est un challenge. Cela peut paraitre curieux alors de mettre cette t\u00e2che loin dans le planning m\u00eame si c'est la premi\u00e8re \u00e9tape du projet. Encore une fois cela s'explique avec le fait qu'il y a d\u00e9j\u00e0 un POC qui fonctionne \u00e0 peu pr\u00e8s et que donc pr\u00e9f\u00e8re commencer avec des t\u00e2ches plus incertaines dans le cas o\u00f9 elles prendraient plus de temps que pr\u00e9vu.","title":"PT1 Programmation r\u00e9cup\u00e9ration des images (3)"},{"location":"index.html#pt2-programmation-ocr-5","text":"Cette t\u00e2che consiste \u00e0 d\u00e9velopper la partie qui reconnait le texte sur les images. C'est tr\u00e8s certainement la t\u00e2che qui risque le plus de d\u00e9border car c'est celle qui est la plus complexe techniquement puisqu'elle demande non seulement la lecture sur image, mais aussi le d\u00e9veloppement d'algorithmes de traitement de cette donn\u00e9e pour \u00eatre s\u00fbr qu'elle a bien \u00e9t\u00e9 lue. J'y ai ainsi allou\u00e9 cinq jours, mais j'esp\u00e8re que j'arriverai \u00e0 gagner du temps sur les autres pour y allouer plus dans le planning effectif, car je suis convaincu que plus, on y passe du temps, meilleur sera le r\u00e9sultat.","title":"PT2 Programmation OCR (5)"},{"location":"index.html#pt3-programmation-stockage-et-modele-5","text":"Cette partie est moins technique, mais concerne le stockage des donn\u00e9es que nous retourne la lecture des images. Mais elle va demander de la r\u00e9flexion et de l'intelligence de programmation, car il faut que cette partie anticipe les besoins de la vue et pr\u00e9pare un terrain fertile qui ne demande pas un refactor quand on passera au d\u00e9veloppement de la vue. C'est pour cela que je lui ai aussi assign\u00e9 cinq jours de travail et elle doit absolument \u00eatre commenc\u00e9e apr\u00e8s la lecture.","title":"PT3 Programmation, stockage et mod\u00e8le (5)"},{"location":"index.html#pt4-programmation-vue-de-lapp-5","text":"Cette partie peut \u00eatre horrible comme tr\u00e8s facile, cela d\u00e9pend compl\u00e8tement de la qualit\u00e9 du travail avant. Si le mod\u00e8le est parfait et que les donn\u00e9es sont int\u00e8gres, cela devrait \u00eatre plut\u00f4t simple de les afficher de mani\u00e8re int\u00e9ressante. Cependant, cette partie d\u00e9bordera s\u00fbrement un peu, car tout le temps gagn\u00e9 avec de bonnes donn\u00e9es sera utilis\u00e9 pour tenter de faire de la pr\u00e9diction. Pour ces raisons, je lui ai assign\u00e9 \u00e9galement cinq jours de travail et elle doit absolument \u00eatre faite apr\u00e8s le mod\u00e8le.","title":"PT4 Programmation Vue de l'APP (5)"},{"location":"index.html#pt5-programmation-mise-en-commun-3","text":"Cette t\u00e2che est aussi un petit peu sp\u00e9ciale, car elle regroupe plusieurs choses. En gros, chaque partie de programmation sera s\u00fbrement assez ind\u00e9pendante et il faudra \u00e0 un moment faire un seul projet C# qui contient tout. Il est difficile d'estimer \u00e0 quel point cela va \u00eatre compliqu\u00e9 alors, j'ai \u00e9t\u00e9 conservateur et j'ai mis trois jours.","title":"PT5 Programmation mise en commun (3)"},{"location":"index.html#tt","text":"Cette rubrique contient les t\u00e2ches qui sont uniquement des tests. La plupart des t\u00e2ches de programmations contiennent d\u00e9j\u00e0 des tests, mais certaines demandent une attention particuli\u00e8re.","title":"TT"},{"location":"index.html#tt1-tests-ocr-2","text":"Cette t\u00e2che est une des t\u00e2ches les plus importantes. Son but est de faire un protocole de tests complet qui permette de comparer les diff\u00e9rents algorithmes de reconnaissance de texte. Je l'ai mise apr\u00e8s la reconnaissance, mais m\u00eame maintenant en \u00e9crivant ces lignes, je me dis que dans le planning effectif, elle sera faite pendant la t\u00e2che de programmation. En effet, comment savoir si mon tout nouvel algorithme est r\u00e9ellement mieux que le pr\u00e9c\u00e9dent. Je pr\u00e9vois deux jours, car je pense que faire le dataset va prendre beaucoup de temps, il faut pr\u00e9voir un certain nombre d'images et de texte qui pourront ensuite \u00eatre donn\u00e9es sous forme de tests. C'est certes une t\u00e2che de test, mais c'est aussi de la programmation.","title":"TT1 Tests OCR (2)"},{"location":"index.html#tt2-tests-finaux-2","text":"Cette t\u00e2che de tests est un peu vague, elle regroupe les diff\u00e9rents tests pour v\u00e9rifier que les donn\u00e9es sont bien affich\u00e9es correctement. Ce qui serait cool si j'ai du temps en fin de travail de dipl\u00f4me serait de faire un syst\u00e8me de test qui permet d'entrainer le programme \u00e0 mieux reconnaitre certaines choses comme des arr\u00eats aux stands si on lui donne les trois derni\u00e8res ann\u00e9es de grands Prix. J'ai mis une dur\u00e9e arbitraire de deux jours, mais je ne sais pas vraiment combien de temps cela va vraiment durer. Elle est \u00e9videmment \u00e0 effectuer une fois que tout est \u00e0 peu pr\u00e8s termin\u00e9.","title":"TT2 Tests finaux (2)"},{"location":"index.html#planning-effectif-et-differences","text":"Alors ! Ces lignes sont \u00e9crites dans les derniers jours du travail de dipl\u00f4me et j'ai des choses \u00e0 dire. Premi\u00e8rement je suis plut\u00f4t content de mon estimation du travail. Je trouve que j'ai bien estim\u00e9 la quantit\u00e9 de travail et combien de temps les diff\u00e9rentes t\u00e2ches allaient prendre. La plupart des d\u00e9passements sont des impr\u00e9vus et/ou des allers et retours entre d'autres t\u00e2ches. La raison pour laquelle je suis plut\u00f4t content de ma planification, c'est que malgr\u00e9 l'usine \u00e0 Gaz que repr\u00e9sente ce projet et le nombre de soucis que j'ai eu, j'ai quand m\u00eame pu arriver \u00e0 un projet qui fonctionne en suivant plut\u00f4t fid\u00e8lement le planning. Une chose dont je suis plut\u00f4t fier c'est la documentation. En ayant d\u00e9velopp\u00e9 le squelette de l'app d\u00e8s le d\u00e9but du projet ca m'a permis d'avancer au fur et \u00e0 mesure du projet la conscience tranquille. Bon c'est bien joli les fleurs mais clairement c'est loin d'\u00eatre parfait. Au moment de la planification je n'avais pas pr\u00e9vu de faire des allers et retours entre plusieurs t\u00e2ches. Dans le planning effectif on peut voir que un jour je suis sur la PT3 (Stockage) et la PT5 (regroupement des mini projets en un seul gros). J'aurais peut-\u00eatre du inverser l'ordre. Mais il y a deux gros soucis dans mon planning : L'ordre des t\u00e2ches n'\u00e9tait pas bon (mais il a \u00e9t\u00e9 d\u00e9cid\u00e9 comme ca pour que les plus grosse difficult\u00e9es soient faites en premier) ce qui a cr\u00e9\u00e9 pas mal de soucis. Ex : L'\u00e9mulateur de la F1TV a \u00e9t\u00e9 fait tr\u00e8s tard et au final les images r\u00e9cup\u00e8r\u00e9es n'\u00e9taient pas de la m\u00eame qualit\u00e9 que ce que j'avais pr\u00e9vu en d\u00e9veloppant l'OCR en premier. Les Tests ont \u00e9t\u00e9 n\u00e9glig\u00e9s et utilis\u00e9s comme des jours tampons. Ca c'est la plus grosse erreur de planning. Autant les autres sont p\u00e9nibles etc... mais n'ont pas forc\u00e9ment compromis la bonne r\u00e9alisation du projet alors que la les tests ont \u00e9t\u00e9 mal plac\u00e9s et ont au final \u00e9t\u00e9 balay\u00e9s alors que si ils avaient \u00e9t\u00e9 mieux planifi\u00e9s ca ne serait pas arriv\u00e9. Solutions : L'ordre des t\u00e2ches a \u00e9t\u00e9 d\u00e9cid\u00e9 expr\u00e8s de cette facon pour \u00e9viter de prendre trop de risques. L'id\u00e9e \u00e9tait qu'en faisant le plus dur au d\u00e9but, je pourrai facilement changer le cahier des charges. J'ai envie de dire que j'aurais d\u00fb \u00eatre plus confiant mais pour \u00eatre honn\u00eate je pense que c'\u00e9tait un mal pour un bien. Je ne pense pas avoir \"bien\" fait mais je pense que c'est une erreur qui \u00e9tait rentable pour mon niveau de stress dans le projet. Par contre les Tests c'est tout simplement une erreur. J'en parle plus en d\u00e9tail dans la partie test de la documentation mais je vais r\u00e9sumer un peu ici. La documentation a \u00e9t\u00e9 faite d\u00e8s le d\u00e9but du projet. J'ai mis en place le squelette pour qu'ensuite il soit simple d'y ajouter au fur et \u00e0 mesure. J'aurais dur faire exactement pareil avec les tests. Si j'avais fait au moins le squelette des tests au d\u00e9but du projet j'aurais pu beaucoup plus facilement en faire et cela m'aurait fait gagner un temps fou et j'aurais m\u00eame pu faire du TDD (Test Driven Developpement). Je suis persuad\u00e9 que cette b\u00eate erreur de planification m'a c\u00f4ut\u00e9 tr\u00e8s ch\u00e8re car ne pas avoir une bonne strat\u00e9gie de tests a du me faire perdre un temps fou. Pour conclure je suis content car j'ai r\u00e9ussi \u00e0 rendre un projet qui marche en suivant assez bien le planning mais il y a des choses que je vais devoir changer dans mes prochains projets.","title":"Planning effectif et diff\u00e9rences"},{"location":"index.html#analyse-fonctionnelle","text":"Voir \"Manuel Utilisateur\" tout y est indiqu\u00e9","title":"Analyse fonctionnelle"},{"location":"index.html#analyse-organique","text":"","title":"Analyse Organique"},{"location":"index.html#outils-utilises","text":"","title":"Outils utilis\u00e9s"},{"location":"index.html#visual-studio-2022","text":"\"Logo de Visual Studio 2022\" C'est l'application que j'ai le plus utilis\u00e9 je pense. Visual Studio 2022 est l'IDE officiel de Microsoft pour coder en C#. C'est l'outil que j'utilise depuis maintenant 6 ans au CFPT et franchement il fait tout ce que je pourrais vouloir. C'est aussi un outil pratique pour utiliser Windows Forms et faire des applications natives Windows. Pas grand chose \u00e0 dire \u00e0 ce sujet \u00e0 part que c'est un outil qui marche bien et qui est gratuit si on prend la community edition.","title":"Visual Studio 2022"},{"location":"index.html#visual-studio-code","text":"\"Logo de Visual Studio Code\" Cet outil est d\u00e9ja un peu plus int\u00e9ressant. C'est le second outil que j'ai le plus utilis\u00e9. J'en ai surtout eu besoin pour \u00e9crire de la doc, mais aussi pour coder en python et pour contr\u00f4ler mkdocs. Visual Studio est un IDE absolument g\u00e9nial qui est tr\u00e8s puissant avec les bonnes extensions. Je l'utilise au quotidien pour tout ce qui est d\u00e9veloppement WEB, Mobile ou pour \u00e9diter des fichiers de configs pour mes drones ou imprimantes 3D. Je peux m\u00eame compiler le firmware pour ces derni\u00e8res en utilisant une extension faite pour. Les possibilit\u00e9s de customisation sont presques infinies et c'est un plaisir d'utiliser ce logiciel gratuit fournis par Microsoft mais qui est am\u00e9lior\u00e9 constamment par des d\u00e9veloppeurs ind\u00e9pendants. Je conseille \u00e0 nimporte quel d\u00e9veloppeur de l'essayer \u00e0 moins qu'il soit uniquement sur C# ou il serait plus int\u00e9ressant d'utiliser visual studio 2022","title":"Visual Studio Code"},{"location":"index.html#materialmkdocsmarkdown","text":"\"Logo de Mkdocs Materials\" Pendant ce projet j'ai utilis\u00e9 exclusivement du markdown avec l'aide de Mkdocs et Materials. Le choix de Markdown a \u00e9t\u00e9 plut\u00f4t simple, c'est une facon facile et efficace de cr\u00e9er de la documentation et on n'avait pas le choix de l'utiliser. On avait \u00e9galement l'obligation (Ou au moins un tr\u00e8s forte incitation) par nos professeurs d'utiliser mkdocs et materials pour que notre documentation ne soit pas simplement une liste de fichiers mais un joli site dans lequel il est agr\u00e9able de chercher des informations. Mkdocs et Materials sont deux outils vraiment fantastiques mais je dois avouer que je n'ai pas assez mis de temps pour apprendre tout leur potentiel. Pour moi ce sont simplement des outils et je veux qu'ils marchent. Je ne suis pas forc\u00e9ment du genre \u00e0 aller changer toutes les couleurs et polices pour avoir la doc parfaite, j'ai pr\u00e9f\u00e9r\u00e9 passer du temps sur mon app. Mais m\u00eame si ces outils offrent une customisation tr\u00e8s avanc\u00e9e, il est tr\u00e8s facile de cr\u00e9er un projet simple et j'aime beaucoup cette simplicit\u00e9. J'ai eu pas mal d'aide de la part de M.Briard pour impl\u00e9menter certaines features et je l'en remercie tr\u00e8s chaudement car sans son aide ce document serait s\u00fbrement un peu moins facile \u00e0 lire (Oui oui ca aurait pu \u00eatre pire, je sais c'est dur \u00e0 imaginer)","title":"Material/Mkdocs/Markdown"},{"location":"index.html#figma","text":"\"Logo de Figma\" Figma est l'outil que j'ai utilis\u00e9 pour cr\u00e9er mon poster et un certain nombre des diagrammes de cette documentation. J'utilise aussi cet outil d\u00e8s que je vais faire des maquettes de sites ou d'applications. D'ailleurs les maquettes dans le cahier des charges ont \u00e9t\u00e9 faites avec. C'est un outil en ligne parfaitement gratuit qui conserve tout dans le cloud. Franchement je n'ai rien \u00e0 dire, je n'ai pas utilis\u00e9 plus de 15% des features que cet outil propose et je suis d\u00e9ja conquis.","title":"Figma"},{"location":"index.html#technologies-utilisees","text":"Dans ce projet diff\u00e9rents choix ont \u00e9t\u00e9 faits pour ce qui est des technologies. Certaines ont \u00e9t\u00e9 choisies car elles \u00e9taient les plus simples, les plus pratiques, les plus efficaces ou encore les plus connues et donc ayant le meilleur support. Je vais tenter de r\u00e9sumer ici ces choix mais je reviendrai sur la plupart d'entre eux plus tard quand j'explique ce que je fais avec.","title":"Technologies utilis\u00e9es"},{"location":"index.html#selenium","text":"\"Logo de selenium\" Selenium est une librairie \u00e0 la base Node JS qui permet d'automatiser des actions sur un navigateur internet. Le but premier et je pense son utilisation premi\u00e8re est l'automatisation de tests pour des applications WEB. En effet c'est un super outil pour simuler un user faisant un certain nombre d'actions sans apporter de variabilit\u00e9 ce qui fait de supers test unitaires. Cependant je pense que l'autre grande partie des utilisateurs de Selenium l'utilisent pour faire du \"Scrapping\". Et nous sommes un peu dans cette seconde cat\u00e9gorie. Le \"Scrapping\" c'est l'acte d'aller r\u00e9cup\u00e8rer des informations sur des pages web automatiquement pour alimenter sa propre base de donn\u00e9es. En effet, si on arrive \u00e0 passer les protections anti-bot on peut facilemnt utiliser Selenium pour scraper tous les sites qui nous passent par la t\u00eate. Le cahier des charges que j'avais en t\u00eate en cherchant une technologie de contr\u00f4le de navigateur internet \u00e9tait le suivant : Simple Permettant de contr\u00f4ler un navigateur Headless (Voir chapitre \"Simuler un navigateur ?\") Permettant de contr\u00f4ler firefox Ayant un wrapper C# Permettre de changer certaines choses comme les cookies en Live Permettre d'interagir avec les \u00e9l\u00e9ments d'une page Fonctionner Simple car je ne voulais pas avoir \u00e0 passer trop de temps dessus (ca n'a pas bien vieillit lol...). Je voulais que l'on puisse utiliser Firefox car il n'impl\u00e9mente pas les m\u00eames s\u00e9curit\u00e9es que Chrome pour faire simple. J'avais besoin que la lib puisse contr\u00f4ler un Firefox HEADLESS car je ne voulais pas avoir une page web ouvert sur mon ordi quand je commente car c'est de l'espace utilis\u00e9 pour rien. J'avais besoin d'un wrapper C# car c'est le language que j'utilise. Pour finir j'avais besoin d'interragir avec les \u00e9l\u00e9ments de la page pour naviguer dessus et d'ins\u00e8rer des cookies pour me connecter sans avoir \u00e0 passer par le login de la F1TV qui est tr\u00e8s bon pour detecter les bots. Avec un cahier des charges parreil beaucoup de librairies ont \u00e9t\u00e9 abandonn\u00e9es. J'ai pu tester pleins de librairies C# qui arrivaient \u00e0 contr\u00f4ler un Chrome et m\u00eame pas mal qui arrivaient \u00e0 contr\u00f4ler un Chrome Headless. Mais le choix est tr\u00e8s vite restreind quand on veut pouvoir contr\u00f4ler Chrome OU Firefox. A la base mon choix c'\u00e9tait port\u00e9 sur Puppeteer Sharp qui est une librairie qui se veut \u00eatre exactement ce que je veux. \"Logo de Pupeteer\" Je voulais utiliser cette librairie car il y a des plugins qui sont tr\u00e8s orient\u00e9s scrapping, en effet, ils impl\u00e9mentent de nombreuses techniques pour permettre de mieux passer innapercu par les syst\u00e8mes de detection de bots. Sur le papier c'est la librairie parfaite qui correspond parfaitement au cahier des charges que je m'\u00e9tais fix\u00e9 et je pense que si j'utilisais un projet JS elle le serait. Sauf que avec le wrapper C# j'ai eu un certain nombre de probl\u00e8mes: Toutes les versions de la librairie ne fonctionnaient pas. Il fallait faire des tests avec diff\u00e9rentes versions de la librairie et de ses d\u00e9pendences simplement pour faire d\u00e9marrer un browser. Et ca c'est quand ca marchait car il y avait des jours ou des machines ou je n'ai simplement pas pu faire fonctionner la librairie. M\u00eame avec les techniques propos\u00e9es par les plugins \"Stealth\" je n'arrivais pas \u00e0 bypass les s\u00e9curit\u00e9es de la page de login de la F1TV. J'ai essay\u00e9 tout ce que j'ai pu trouver sur internet mais on se fait toujours chopper d\u00e8s que l'on arrive sur la page. Et le pire de tout, impossible de faire fonctionner un vid\u00e9o. J'ai pu faire tout ce que je voulais faire au final en passant par l'utillisation de cookies pour la connexion. Tout ca pour arriver au moment ou il faut lancer la vid\u00e9o, et la, crash. Impossible de faire fonctionner Puppeteer Sharp avec une vid\u00e9o. D\u00e8s qu'elle se lance c'est un crash assur\u00e9 sans message d'erreur clair. Et le soucis c'est que le wrapper C# n'est pas vraiment bien support\u00e9 et que si c'est un bug de la lib je ne risque pas de voir de fix avant un moment si ce n'est jamais. Pour toutes ces raisons, j'ai du abandonner cette librairie ce qui a \u00e9t\u00e9 tr\u00e8s dur car j'avais pass\u00e9 beaucoup de temps dessus \u00e0 essayer de la faire marcher. Ensuite le choix de Selenium \u00e9tait plut\u00f4t simple, c'\u00e9tait la seule option restante. A ce jour je ne connait aucune autre librairie que Puppeteer ou Selenium qui puisse contr\u00f4ler un Firefox Headless en respectant mon cahier des charges et qui soit donc disponible depuis C#. Si je n'arrivais pas \u00e0 faire fonctionner Selenium j'aurai du abandonner l'id\u00e9e de simuler un navigateur tout simplement. Mais j'ai eu la chance que cette librairie fasse tout ce que je pouvais demander. C'est une super lib et m\u00eame si la version C# n'est vraiment pas bien document\u00e9e, la plupart des documentations de la version JS sont pertinentes pour al version C# m\u00eame si ca n'est pas la m\u00eame syntaxe. Pour r\u00e9sumer, j'ai choisis Puppeteer car c'\u00e9tait la seule option viable pour mon besoin. (Note : Par contre si je trouve la personne chez mozilla ou puppeteer qui a d\u00e9cid\u00e9 d'hardcoder la r\u00e9solution maximale du browser Headless que l'on peut override UNIQUEMENT en changeant les variables d'environnement de la machine ET DE NE LE DOCUMENTER QUASI NULLE PART JE JURE QUE CA VA TRES MAL SE PASSER)","title":"Selenium"},{"location":"index.html#csharp","text":"\"Logo C#\" Je pense que c'est le choix le plus simple \u00e0 expliquer. C# est un language de programmation orient\u00e9 objet relativement haut niveau qui a \u00e9t\u00e9 cr\u00e9\u00e9 par Microsoft et qui a comme cible le developpement d'applications pour Windows. (On peut evidemment trouver des adaptations pour le faire tourner sur Linux mais ce n'est pas vraiment le but du language) En plus d'\u00eatre un superbe language de programmation, c'est le language que l'on apprend au CFPT informatique. C'est donc un language avec lequel je suis beaucoup plus \u00e0 l'aise que pour d'autres languages comme le Python ou le JS. Mon but n'\u00e9tait pas de faire une application Web et je travaille sous Windows. Je savais que mon projet allait demander un minimum de programmation orient\u00e9e objet. J'ai donc imm\u00e9diattement pens\u00e9 \u00e0 utliser C#. Cependant j'aurais tr\u00e8s bien pu utiliser un language comme python qui m'aurait clairement facilit\u00e9 la t\u00e2che avec des librairies bien plus fournies et plus souvent mises \u00e0 jour. Mais comme je ne suis pas du tout aussi \u00e0 l'aise avec je pense que le C# \u00e9tait la meilleure option. Mes seuls regrets apr\u00e8s coup sont que je trouve les Windows Forms tr\u00e8s moches et qu'il est particuli\u00e8rement difficile de les rendres plus jolies et que les librairies disponibles en C# pour des sc\u00e9narios tr\u00e8s pr\u00e9cis ne sont pas au niveau de celles pour JS et pour Python. Cependant si j'avais \u00e0 refaire le projet je reprendrais C# je pense.","title":"CSharp"},{"location":"index.html#python","text":"\"Logo Python\" Alors ce choix la est plus commpliqu\u00e9 \u00e0 comprendre. Pour tout le projet j'ai tent\u00e9 de garder le C# comme language et de ne pas utiliser autre chose. Cependant j'ai du utiliser une seule fois le Python dans un cas tr\u00e8s pr\u00e9cis. Je n'aime vraiment pas coder en python de base et clairement j'aurais pr\u00e9f\u00e8r\u00e9 ne pas l'utiliser mais je n'avais pas le choix. Le besoin dans le cas du python \u00e9tait le suivant : J'avais besoin d'un moyen de r\u00e9cup\u00e8rer des strings et les d\u00e9coder avec une cl\u00e9 encod\u00e9e avec le syst\u00e8me propri\u00e9taire de windows d'encodage. Le soucis que j'avais avec le C# c'est que les methodes de decryption ne fonctionnent pas pareil que en python et tous les exemples que je pouvais trouver \u00e9taient en python. J'ai essay\u00e9 pendant un sacr\u00e9 moment de faire fonctionner la decryption en C# mais sans succ\u00e8s. J'ai donc directement utilis\u00e9 le python comme faisait toutes les personnes que je pouvais voir sur internet et je pense que ca n'est pas une mauvaise id\u00e9e. En effet, cela veut dire que si \u00e0 un moment Chrome est mis \u00e0 jour, je n'aurai pas besoin d'aller ouvrir tout le code source de mon projet pour tout recompiler, j'aurai simplement besoin de changer ce script. Un des avantages du Python est quand m\u00eame qu'il y beaucoup plus de gens qui codent dessus, et pour ce genre d'utilisation tr\u00e8s sp\u00e9cifiques c'est plut\u00f4t pratique. Le seul probl\u00e8me c'est que cela oblige l'utilisateur \u00e0 avoir python install\u00e9 sur sa machine et que sa version doit \u00eatre compatible... (les joies de python)","title":"Python?"},{"location":"index.html#firefox","text":"\"Logo Firefox Headless\" J'en parle deja plus bas, mais le choix de navigateur est super important. Deja tous les navigateurs n'ont pas un mode Headless(sans t\u00eate, mieux expliqu\u00e9 dans la rubrique \"Simuler un naviguateur ?\"). Par exemple, m\u00eame si Edge est maintenant bas\u00e9 sur chromium, il n'existe pas de moyen de le faire tourner en Headless pour le moment. Autre soucis, les librairies d'automatisation ne supportent pas tous les navigateurs. Par exemple, beaucoup supportent chrome mais tr\u00e8s peu supportent Firefox ou Edge. Donc il me fallait un navigateur qui puisse op\u00e8rer en Headless et qui soit support\u00e9 par plusieurs librairies d'automatisation. Il n'y a que Firefox et Chrome qui sont conforme \u00e0 ces exigeances (Je n'ai pas verifi\u00e9 pour TOUS les navigateurs. Peut-\u00eatre que les Opera GX ont aussi un mode headless super, mais je me suis concentr\u00e9 sur les navigateurs plus grand public). Chrome est support\u00e9 par plus de lib, mais le soucis c'est que la F1TV utilise un lecteur de vid\u00e9o avec DRM (Plus d'infos la dessus dans la partie \"Simuler un navigateur?\") et donc le choix \u00e9tait simple. Il ne restait que Firefox.","title":"Firefox"},{"location":"index.html#tesseract","text":"Je pense que le choix le plus simple apr\u00e8s le C# fut l'utilisation de Tesseract. C'est tout simplement l'outil le plus utilis\u00e9 pour faire de l'OCR. A la base c'est une lib Python (Ah tiens encore ?) qui peut \u00eatre redoutablement efficace avec le bon dataset. Il existe d'autres outils mais j'ai d\u00e9cid\u00e9 de prendre celui la \u00e0 cause de son support juste incroyable et de son omnipr\u00e9sence dans la documentation OCR. En plus il est facile \u00e0 utiliser et je ne pense pas encore avoir fait le tour de tout son potentiel dans ce projet.","title":"Tesseract"},{"location":"index.html#fonctionnement-general","text":"Avant de passer \u00e0 l'explication de chaques parties du projet en d\u00e9tail, je pense qu'il est important de faire un petit point sur comment toutes les parties du projet s'emboitent et fonctionnement ensemble. Comme ca quand vous lirez l'explication d'une \u00e9tape vous serez conscient de \u00e0 quoi elle sert et ou elle s'\u00eenscrit dans le projet principal.","title":"Fonctionnement g\u00e9n\u00e9ral"},{"location":"index.html#les-briques-principales","text":"Voici trois grosses \u00e9tapes du projet. Pour rappel ce sont des vulgarisations plut\u00f4t larges qui n'ont qu'un seul but, aider \u00e0 la compr\u00e9hension de ce qui vient par la suite.","title":"Les briques principales"},{"location":"index.html#recuperation-dimages","text":"\"Diagramme simplifi\u00e9 repr\u00e9sentant le processus de r\u00e9cup\u00e8ration des images\" Pour faire simple on peut voir qu'il y a deux parties \u00e0 cette \u00e9tape. La premi\u00e8re en partant du haut repr\u00e9sente un script python qui va chercher des informations dans la base de donn\u00e9es de Chrome qui est en SQLITE. Ces informations dans notre cas sont les cookies de connexion. Dans la seconde \u00e9tape, on peut voir que le programme utilise Selenium avec un navigateur Firefox Headless qui va aller communiquer avec la F1TV qui est le site web qui nous int\u00e9resse et que une des infos que l'on r\u00e9cup\u00e8re est une image de la page en format PNG que l'on envoie au programme C#. Ces deux partie sont li\u00e9es car pour se connecter \u00e0 la F1TV Selenium a besoin des cookies de connexion r\u00e9cup\u00e8r\u00e9s par le programme Python. La premi\u00e8re partie est un processus qui n'est utilis\u00e9 qu'une seule fois au d\u00e9marrage tandis que la r\u00e9cup\u00e9ration d'images et en continu pendant toute la dur\u00e9e de l'utilisation de l'application.","title":"Recup\u00e9ration d'images"},{"location":"index.html#ocr","text":"\"Diagramme simplifi\u00e9 repr\u00e9sentant le processur d'OCR\" ; On peut voir dans ce diagramme simplifi\u00e9 qu'avec l'aide de ce que contient le fichier \"Config.JSON\" on d\u00e9coupe l'image que l'on a r\u00e9cup\u00e8r\u00e9 au pr\u00e9alable en petits morceaux qui continennent des informations. Ensuite on prend cette image et on lui applique un filtre pour retirer le flou la couleur etc... Puis en utilisant de l'OCR (Optical Character Recognition) on en r\u00e9cup\u00e8re les informations sous forme de texte et on le renvoie dans le programme C# Dans cette partie explicative g\u00e9n\u00e9rale, on ne reviendra pas sur la cr\u00e9ation de ce fichier config. Pour plus d'infos \u00e0 son sujet voir la rubrique (OCR/Fonctionnement g\u00e9n\u00e9ral)","title":"OCR"},{"location":"index.html#traitement-et-affichage","text":"\"Diagramme simplifi\u00e9 repr\u00e9sentant le processus de traitement et d'affichage\" On peut voir dans ce dernier mini diagramme simplifi\u00e9 que on prend les donn\u00e9es que l'on r\u00e9cup\u00e8r\u00e9 de l'\u00e9tape pr\u00e9c\u00e9dente qui ne sont pas forc\u00e9ment toutes coh\u00e9rentes et qu'on les traite pour leur redonner du sens avant de les stocker dans une base de donn\u00e9es SQLITE. Ensuite cette m\u00eame base de donn\u00e9e fournis les infos nescessaires pour des affichages (Ces affichages sont directements r\u00e9cup\u00e8r\u00e9s depuis le projet en cours de fonctionnement)","title":"Traitement et affichage"},{"location":"index.html#resume-du-fonctionnement-general","text":"\"Diagramme simplif\u00e9 repr\u00e9sentant le processus g\u00e9n\u00e9ral du projet\" Ce dernier diagramme est un sch\u00e9ma fait pour repr\u00e9senter de la mani\u00e8re la plus simple possible toutes les briques du projet et comment elles s'imbriquent ensemble. La repr\u00e9sentation est un peu diff\u00e9rentes des 3 autre diagramme car le but ici est surtout de montrer le chemin que fait la donn\u00e9e \u00e0 travers les couches Toutes les parties du projet ne sont pas incluses, notamment la partie calibration dans un objectif de simplifier la lecture. Dans l'ordre, on peut voir que pour la partie r\u00e9cup\u00e8ration d'images, le python va r\u00e9cup\u00e8rer les cookies dans la base de donn\u00e9es chrome pour ensuite les retourner \u00e0 Selenium. Selenium va ensuite pouvoir lancer un navigateur (en l'occurence Firefox) et utiliser les cookies r\u00e9cup\u00e8r\u00e9s pour aller sur la page de la F1TV qui va retourner un certain nombre d'infos \u00e0 Selenium. L'info qui nous int\u00e9resse le plus depuis Selenium c'est les images de la page data de la F1Tv et c'est elles que l'on va envoyer dans la partie LOAD du diagramme. Dans cette partie on prend l'image de la F1TV et on la decoupe selon les directives donn\u00e9es par le fichier Config.JSON (il renseigne les zones \u00e0 d\u00e9couper et ce qu'elles repr\u00e9sentent) et apr\u00e8s le d\u00e9coupage on se retrouve avec une zone principale, vingt zones de pilotes et 9 fen\u00eatres de donn\u00e9es par zone de pilote donc 180 fen\u00eatres en tout. Ces fen\u00eatres sont ensuite envoy\u00e9es pour \u00eatre filtr\u00e9es (retirer le flou, mettre en \u00e9vidence les caract\u00e8res, en gros les pr\u00e9parer pour la reconnaissance) dans la partie OCR Dans cette partie, apr\u00e8s avoir filtr\u00e9 les images, on les envoie \u00e0 Tesseract pour qu'il nous retourne des r\u00e9sultats d'OCR. Ces r\u00e9sultats sont ce que Tesseract a trouv\u00e9 sur les image et ils sont retourn\u00e9s sous al forme de Data Pilote. Ex (Position: 1,Tour : 45, Temps au tour : 1:34.683, Pneus: Medium etc....) Finalement ces donn\u00e9es ont envoy\u00e9es dans la partie traitement qui va faire des v\u00e9rifications d'usage pour s'assurer qu'elles sont correctes et quand c'est fait, tout est envoy\u00e9 dans une base de donn\u00e9es SQLITE. On ne montre pas non plus dans ce diagramme la parte affichage des donn\u00e9es car je ne trouve pas pertinent de l'inclure ici. Et voila c'est le fonctionnement tr\u00e8s g\u00e9n\u00e9ral et simplifi\u00e9 de l'application. Je vous invite \u00e0 continuer \u00e0 lire cette documentation pour des informations plus pr\u00e9cises \u00e0 propos de toutes ces \u00e9tapes. Bonne lecture !","title":"R\u00e9sum\u00e9 du fonctionnement g\u00e9n\u00e9ral"},{"location":"index.html#recuperation-des-images","text":"Voici la premi\u00e8re grande \u00e9tape du projet. Pour rappel, Amazon h\u00e9berge directement le site de la F1TV et poss\u00e8de les droits sur les donn\u00e9es de la F1. C'est sous le nom de AWS (le service d'h\u00e9bergement d'Amazon) que la firme apparait en tant que sponsor. On peut voir ce nom appara\u00eetre assez souvent quand on regarde un Grand Prix car comme ils ont la main-mise sur les donn\u00e9es ils peuvent ins\u00e8rer des bandeaux d'informations sur le flux public sur ce qu'il se passe voir m\u00eame faire des pr\u00e9dictions (Bien qu'un peu bancales) \"Exemple insertion AWS en GP\" Ce service s'appelle F1 Insights (Oui c'est un meilleur nom de projet que F1 Companion mais bon) et c'est, je pense, la raison pour laquelle on ne voit aucune API publique qui permette de correctement se renseigner en don\u00e9es en direct pendant un Grand Prix. Ils ont du d\u00e9gotter un juteux contrat pour s'occuper de toute l'infrastructure digitale de la F1 (du moins publique) en \u00e9change d'une exclusivit\u00e9 totale sur certaines choses comme les Data \"Exemple data d'AWS\" Evidemment je ne fais que conjecturer et ce que j'ai dit n'est pas \u00e0 prendre au pied de la lettre mais c'est une explication possible je pense de pourquoi il est si difficile de trouver des donn\u00e9es sur la F1 facilement en temps r\u00e9el. Il existe bien quelques API un peu bancales publiques, mais le probl\u00e8me c'est qu'elles ne sont vraiment pas suffisante et je ne peux pas leur faire confiance quand je commente. Ce qu'il m'aurait fallut c'est une API publique et officielle qui me permette d'\u00eatre sur que les donn\u00e9es sont les bonnes et qu'elles arrivent le plus vite possible. On pourrait croire que c'est impossible car cela n'existe pas comme je l'ai dit MAIS ! Ce n'est pas compl\u00eatement vrai. En effet depuis que je poss\u00e8de un abonnement \u00e0 la F1TV, il existe une source d'informations tr\u00e8s pr\u00e9cieuse qui m'aide \u00e9norm\u00e9ment dans mon quotidien de commentateur de Formule 1. La \"DATA CHANNEL\". La Data Channel est une page de la F1TV qui permet, pour chaque Grand Prix, de visualiser, sous la forme d'un flux vid\u00e9o, diff\u00e9rentes informations capitales sur la course. \"Exemple de Data Channel\" Le probl\u00e8me, c'est que comme je viens de le dire, ces donn\u00e9es ne sont pas accessibles comme un tableau HTML ou un flux RSS ou un tableau JSON. C'est un flux vid\u00e9o. Il faut savoir qu'entretenir une diffusion de flux vid\u00e9o en 1080P pendant deux heures accessible par des milliers d'abonn\u00e9s est EXTR\u00caMENT cher surtout quand on le compare \u00e0 simplement afficher les donn\u00e9es dans un tableau. Ce qui veut dire que ce choix est d\u00e9lib\u00e9r\u00e9 et a un sens au niveau \u00e9conomique. Je pense donc que c'est justement pour \u00e9viter que des petits malins puissent simplement venir scraper l'int\u00e9gralit\u00e9 des donn\u00e9es qu'ils proposent et fasse sa propre API. (C'est d'ailleurs un des sites avec la meilleure protection anti bot du monde) MAIS ce n'est pas par ce que les donn\u00e9es ne sont pas facile \u00e0 avoir qu'elles sont IMPOSSIBLE \u00e0 avoir. Et c'est la que ce projet entre en jeu. Mais pour d\u00e9coder les donn\u00e9es d'une image il faut dabord ... (roulement de tambours) ... Avoir des images ! Et c'est la que vient se glisser cette partie du projet.","title":"R\u00e9cup\u00e9ration des images"},{"location":"index.html#comment-faire","text":"Le but de ce segment est de se concentrer sur la r\u00e9cup\u00e8ration et la mise \u00e0 disposition pour le reste du programme, des images en direct de la F1TV dans la meilleure qualit\u00e9 possible et dans les meilleurs d\u00e9lais. Pour ce faire il y a plusieurs solutions : Reverse engeneer la F1TV pour acc\u00e8der directement au flux sans passer par la plateforme internet et pouvoir prendres images \u00e0 volont\u00e9. Avoir tout simplement une page de la F1TV ouverte sur un \u00e9cran et prendres des screenshots \u00e0 intervals r\u00e9guliers. Simuler un navigateur internet sans qu'il soit affich\u00e9 et le contr\u00f4ler automatiquement pour qu'il prenne des captures. La premi\u00e8re option aurait \u00e9t\u00e9 la plus \u00e9l\u00e9gante mais lors d'un POC que je tentais de r\u00e9aliser je me suis rendu compte que cela serait un peu trop compliqu\u00e9 et long \u00e0 faire. Sans compter le fait que les rediffusions de Grand Prix ne sont pas g\u00e8r\u00e9es de la m\u00eame mani\u00e8re que les diffusions en live. Et que pour faire des Tests en live il faudrait attendre \u00e0 chaque fois un weekend de Grand Prix et le faire en plus du commentaire que je dois produire. Pour toutes ces raisons et bien d'autres je l'ai rang\u00e9e dans la case \"Trop dur, Trop chiant, S\u00fbrement ill\u00e9gal\" (Oui je sais c'est une cat\u00e9gorie bien sp\u00e9cifique mais c'est ma documentation je fais ce que je veux) La troisi\u00e8me option aurait \u00e9t\u00e9 la plus simple (et moins dr\u00f4le) et je suis presque s\u00fbr que je peux impl\u00e9menter cette derni\u00e8re en moins d'une apr\u00e8s-midi. Sauf qu'elle apporte de gros soucis. On ne peux pas garantir l'int\u00e9grit\u00e9 et la continuit\u00e9 des donn\u00e9es si l'utilisateur avance ou fait pause m\u00eame par simple inadvertance. La moindre fen\u00eatre qui s'afficherait devant ruinerait toute la reconnaissance de caract\u00e8res. On ne peut pas contr\u00f4ler la qualit\u00e9 du flux et on est oblig\u00e9 de faire confiance en l'utilisateur On ne peut pas vraiment automatiser quoi que ce soit niveau tests ou m\u00eame pour faire du scrapping auto pour remplir une base de donn\u00e9e. Et finalement le pire inconv\u00e9nient : C'EST NUL ! Je ne pourrais jamais utiliser un projet qui fonctionne de cette facon, je ne peux pas me permettre d'avoir un \u00e9cran inutilisable quand je commente et auquel je dois constamment faire attention pour ne pas perturber la reconnaissance. Pour moi cette option aurait \u00e9t\u00e9 celle \u00e0 choisir en cas d'extr\u00eame urgence et en dernier recours car le projet deviendrait inutile. J'ai donc d\u00e9cid\u00e9 de m'occuper de la seconde option : Simuler un navigateur. Cette option bien que complexe et difficile \u00e0 impl\u00e9menter propose une solution \u00e0 tous les probl\u00eame et permet une r\u00e9cup\u00e8ration quasi sans compromis.","title":"Comment faire ?"},{"location":"index.html#simuler-un-navigateur","text":"\"Navigateur Headless(sans t\u00eate)\" Simuler un navigateur internet n'est pas forc\u00e9ment tr\u00e8s difficile. Chromium par exemple offre une panoplie d'outils natifs et \u00e9norm\u00e9ment de librairies existent permettant de facilement et en quelques lignes simuler un Google Chrome et le contr\u00f4ler sans afficher son UI (Interface Utilisateur). \"Chromium logo\" {: style=\"height:150px;width:150px\"} Cependant. La F1TV n'utilise pas simplement un player HTML5 basique. Elle utilise un service de streaming BitMovin qui permet de fournir un stream de bonne qualit\u00e9 et surtout qui impl\u00e9mente les DRM (Digital Right Management) Cela veut dire que quand on ouvre un flux de la F1TV sur chrome et que l'on essaie de prendre une capture d'\u00e9cran, le player se met en noir et ne permet pas de voir quoi que ce soit (Certaines version de Chrome le permettent pendant quelques semaines avant de bloquer \u00e0 nouveau). Ce qui dans notre cas est un immense probl\u00e8me. Mais Firefox ne nous bloque pas de cette facon et il est donc assez facile de passer outre. L'explication sans trop rentrer dans les d\u00e9tails est la suivante : Dans chrome, le player par d\u00e9faut utilise une technologie appell\u00e9e \"PCP\" ou \"Protected Content Playback\" qui leur permet de bloquer au moins une partie des techniques de r\u00e9cup\u00e8ration du flux vid\u00e9o et audio. Cependant Firefox de pas sa nature Open Source utilise \"OpenH264\" pour lire ces m\u00eames flux soumis \u00e0 des DRM et OpenH264 n'impl\u00e9mente pas les m\u00eames restrictions. Sauf que Firefox n'est pas aussi facilement \u00e9mul\u00e9 que chrome et cela r\u00e9duit notre choix de librairies \u00e0 ... Une seule... Qui est Selenium. (Il existe aussi Pupetteer C# mais j'ai rencontr\u00e9 \u00e9norm\u00e9ment de soucis avec cette derni\u00e8re d\u00e8s que je voulais lancer une vid\u00e9o) \"Firefox dev logo\" {: style=\"height:150px;width:150px\"} Mais m\u00eame si la documentation est plut\u00f4t maigre parfois, c'est une bonne librairie qui permet de tr\u00e8s bien contr\u00f4ler une instance de chrome ou de Firefox.","title":"Simuler un navigateur ?"},{"location":"index.html#controler-le-navigateur","text":"Maintenant que l'on sait quel navigateur simuler et avec quelle technologie, on peut passer \u00e0 la r\u00e9alisation. Ce qu'il y a de bien avec Selenium, c'est qu'on a un certain nombre de commandes tr\u00e8s haut niveau qui nous permettent de contr\u00f4ler un navigateur de mani\u00e8re plut\u00f4t pr\u00e9cise. Je vais d\u00e9crire ici la proc\u00e9dure habituelle utilis\u00e9e sous une forme de recette de cuisine pour que l'on puisse facilement comprendre ce qu'il se passe. Durant cette explication je vais parler \u00e0 un moment de Cookies, ne vous en faites pas c'est le sous chapitre suivant qui va vous en parler. Recette de cuisine pour r\u00e9cup\u00e8rer des images de la F1TV : D\u00e9marrer une instance de navigateur avec les bons arguments Ajouter les bons param\u00eatres pour ne pas se faire flag comme un bot Naviguer sur la page de la F1TV Ajouter les cookies de connexion pour avoir acc\u00e8s au contenu de la page Naviguer sur la page du Grand Prix demand\u00e9 Attendre un peu que la page se charge Cliquer sur l'invite de cookies Attendre cinq secondes le temps que la page se reload Cliquer sur le bouton qui permet de passer du feed live \u00e0 la DATA CHANNEL Appuyer sur Espace pour faire apparaitre le bouton d'acc\u00e8s au param\u00eatres Cliquer sur le menu d\u00e9roulant des r\u00e9solution Trouver l'option 1080P et la selectionner Cliquer sur le bouton qui met la vid\u00e9o en plein \u00e9cran Prendre de screenshots \u00e0 intervales r\u00e9guliers Pour faire toutes ces actions on doit r\u00e9cup\u00e8rer les \u00e9l\u00e9ments selon leur ID ou leur classe. Voici un exemple qui r\u00e9cup\u00e8re le bouton de plein \u00e9cran et qui clique dessus : IWebElement fullScreenButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-fullscreentogglebutton\" )); fullScreenButton . Click (); Ca peut para\u00eetre plut\u00f4t simple dit comme ca et quand tout fonctionne ca l'est mais la difficult\u00e9 vient du fait que \u00e0 peu pr\u00e8s nimporte laquelle de ces \u00e9tapes peut rater et qu'il faut donc faire un bon syst\u00e8me de gestion d'erreurs qui puisse aider l'utilisateur en cas de probl\u00e8me. Parfois il est aussi difficile de trouver un \u00e9l\u00e9ment selon son ID,sa classe, ou sa value. Par exemple l'option qui permet de passer en 1080P peut avoir comme value 1080_9011456 ou 1080_9011200 si on refresh la page. Cela demande de passer par des expression r\u00e9guli\u00e8res ce qui n'est pas compliqu\u00e9 en soi mais c'est toutes ces petites choses qui rendent le processus long \u00e0 mettre en place. Il faut dire aussi que les sites ne sont pas forc\u00e9ment tr\u00e8s content de voir des bots passer car cela peut \u00eatre un risque de DDOS et de Scraping (Comme moi) et donc ils mettent en place des syst\u00e8mes pour nous emp\u00eacher de faire ce que l'on veut On peut utiliser diff\u00e9rntes techniques pour passer outre ces restrictions comme : Changer son UserAgent Changer sa r\u00e9solution Ne pas avoir des patterns trop pr\u00e9visibles Avoir un historique Ne pas cliquer pile sur le milieu des boutons Ne pas cliquer trop vite Passer par un proxy pour ne pas se faire flag Utiliser des librairies plus discr\u00e8tes J'ai eu l'occasion de tester toutes ces methodes pour tenter de passer derri\u00e8re les radars de la F1TV et visiblement j'ai r\u00e9ussi pour les pages principales mais pas pour les pages de Login. Il faut savoir que la bataille entre bots et propri\u00e9taires de sites est un grand jeu du chat et de la souris et que les plateformes innovent constamment leur s\u00e9curit\u00e9. Et il se trouve que la partie login de la F1TV est heberg\u00e9e autre part que le reste du site chez Amazon et que elle poss\u00e8de les meilleures s\u00e9curit\u00e9s que j'aie pu voir. Aucunes des methodes que j'ai cit\u00e9es et d'autres encore que j'ai essay\u00e9 n'ont r\u00e9ussi \u00e0 fourvoyer le syst\u00e8me. J'ai donc \u00e9t\u00e9 oblig\u00e9 de faire appel \u00e0 la connexion par Cookies pour pouvoir acc\u00e8der au reste du site internet.","title":"Contr\u00f4ler le navigateur"},{"location":"index.html#recuperer-les-cookies","text":"Alors, on va mettre de c\u00f4t\u00e9 toutes les questions de s\u00e9curit\u00e9 et de violation de la vie priv\u00e9e et de protection des donn\u00e9es des utilisateurs pour ce chapitre. Car pour faire simple, je siphonne TOUS les cookies de la persone qui utilise mon app. Alors \u00e9videmment ca n'est pas pour faire des b\u00e9tises avec et c'est pour une \"bonne\" raison, mais bon quand m\u00eame ca peut faire bizarre comme ca. Je pense que vous savez d\u00e9ja ce qu'est un Cookie, mais je vais quand m\u00eame faire un petit point la dessus car c'est important pour la suite. Quand on va sur un site internet et que l'on se connecte avec nos identifiants nous sommes connect\u00e9s sur la session. Cependant, si on quitte le site ou que l'on ferme le navigateur, le site ne peut pas garder en m\u00e9moire que c'est bien vous quand le lendemain vous retournez dessus. Pour palier \u00e0 cette limitation on a invent\u00e9 cette chose magnifique (hem...) que sont les cookies ! Les cookies sont des petits fichiers qui sont stock\u00e9s dans votre navigateur et qui peuvent servir \u00e0 beaucoup de choses comme traquer votre activit\u00e9 sur internet et espionner un peu ou aussi par exemple, servir de jeton de connexion. L'id\u00e9e est que quand vous vous connectez sur le site avec vos identifiants, le site envoie un petit fichier dans votre navigateur qui va servir de jeton. Et donc quand vous reviendrez, le site pourra voir que vous avez le jeton et vous connectera automatiquement. Ca peut para\u00eetre g\u00e9nial, et c'est effectivement bien pratique, cependant ce n'est pas sans risques. En effet, imaginons qu'un acteur malveillant parvienne \u00e0 s'emparer de ces petits fichiers, il pourrait ainsi facilement se faire passer pour vous. Alors un cookie expire \u00e0 un moment donn\u00e9 pour temperer les risques, mais ils sont toujours pr\u00e9sents. Dans notre cas on peut vite comprendre pourquoi cela peut \u00eatre int\u00e9ressant de r\u00e9cup\u00e8rer ces cookies. En effet, si on peut mettre la main sur le jeton de connexion de l'utilisateur de notre application. On pourra se connecter automatiquement \u00e0 la F1TV et aller prendre des photos directement sans que l'utilisateur aie \u00e0 faire quoi que ce soit. Sauf que les cookies ne sont pas stock\u00e9s en clair comme ca. Evidemment Google Chrome a mis en place quelques techniques pour \u00e9viter que nimporte qui puisse s'amuser \u00e0 aller taper dans les cookies de la machine. Tous les cookies sont stock\u00e9s dans une base de donn\u00e9es sqlite avec les noms en clair et les valeurs sont encrypt\u00e9es en utilisant la methode AES 256 qui est une methode de cryptage tr\u00e8s utilis\u00e9e et efficace. Tellement efficace qu'il serait compl\u00eatement inutile de tenter de les decrypter en utilisant de la force brute pour trouver la valeur ou m\u00eame une attaque de dictionnaire ou quoi que ce soit. Si ces valeurs peuvent \u00eatre encod\u00e9es et d\u00e9cod\u00e9es en local sur la machine sans connexion internet, cela veut dire que la cl\u00e9 est stock\u00e9e sur la machine. Et si je peux mettre la mais sur cette cl\u00e9 alors je pourrai lire tous les cookies de la machine. Cette cl\u00e9 est stock\u00e9 dans les fichiers de Google Chrome sous Google\\Chrome\\User Data\\Local State . Et dans ce fichier on peut trouver une liste de donn\u00e9es en cl\u00e9 valeurs et on peut trouver la cl\u00e9 sous os_crypt encrypted_key . On pourrait croire que l'on a d\u00e9ja touch\u00e9 le jackpot mais il reste encore une \u00e9tape. Cette cl\u00e9 est crypt\u00e9e en utilisant le syst\u00e8me d'encryption de Windows. Cette encryption est utilis\u00e9e pour emp\u00eacher des utilisateurs non connect\u00e9s d'acc\u00e8der \u00e0 certaines donn\u00e9es. Mais comme nous sommes connect\u00e9s nous pouvons facilement utiliser les librairies de decryption pour trouver la valeur de cette cl\u00e9. Et \u00e0 partir de la il suffit d'utiliser cette cl\u00e9 pour d\u00e9crypter tous les cookies de la machine pour aller chercher ceux qui nous int\u00e9ressent. Voici un exemple du code python qui permet d'aller chercher la cl\u00e9 d'encryption dans les fichiers de Google Chrome : def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key Python ?? Et oui j'ai choisit d'utiliser un srypt python pour aller chercher les cookies. Ce choix a \u00e9t\u00e9 fait pour trois raisons : Le python est un language que je n'aime pas particuli\u00e8rement mais qui poss\u00e8de un \u00e9ventail de librairies absolument fantastique. Et pour ce genre de choses qui demandent une constante mise \u00e0 jour des librairies et qui sont un peu niches le python est une option juste g\u00e9niale. Comme c'est une des parties qui est le plus suceptible de changer vu que Chrome change relativement souvent le syst\u00e8me de stockage des cookies. Dans une optique de facilit\u00e9 de maintenance, avoir un seul fichier qui concerne cette partie du projet et qui est dans un language que plus de gens maitrisent que C# est pratique. Je n'ai pas r\u00e9ussi \u00e0 trouver de librairies C# qui me donne des r\u00e9sultats identiques \u00e0 celles que j'utilise dans ce script python. Pour faire la liaison entre le C# et le python, j'appelle le script depuis mon C# et ensuite le python s'occupe de mettre tous les cookies dans un CSV qui est ensuite lu depuis le C#. Voici la partie python qui \u00e9crit dans le csv : if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" ) Et la partie C# qui appelle le script et qui lit le CSV : private void StartCookieRecovering () { string scriptPath = PYTHON_COOKIE_RETRIEVAL_FILENAME ; Process process = new Process (); process . StartInfo . FileName = \"python.exe\" ; process . StartInfo . Arguments = scriptPath ; process . StartInfo . UseShellExecute = false ; process . StartInfo . RedirectStandardOutput = true ; process . Start (); string output = process . StandardOutput . ReadToEnd (); process . WaitForExit (); } public string GetCookie ( string host , string name ) { StartCookieRecovering (); string value = \"\" ; List < Cookie > cookies = new List < Cookie >(); using ( var reader = new StreamReader ( COOKIES_CSV_FILENAME )) { // Read the header row and validate column order string header = reader . ReadLine (); string [] expectedColumns = { \"host_key\" , \"name\" , \"value\" , \"path\" , \"expires_utc\" , \"is_secure\" , \"is_httponly\" }; string [] actualColumns = header . Split ( ',' ); for ( int i = 0 ; i < expectedColumns . Length ; i ++) { if ( expectedColumns [ i ] != actualColumns [ i ]) { throw new InvalidOperationException ( $\"Expected column '{expectedColumns[i]}' at index {i} but found '{actualColumns[i]}'\" ); } } // Read each data row and parse values into a Cookie object while (! reader . EndOfStream ) { string line = reader . ReadLine (); string [] fields = line . Split ( ',' ); string hostname = fields [ 0 ]; string cookieName = fields [ 1 ]; if ( hostname == host && cookieName == name ) { value = fields [ 2 ]; } } } return value ; } Maintenant que l'on sait comment simuler et manipuler un navigateur internet, que l'on sait comment se connecter sur le compte F1TV de l'utilisateur sans qu'il n'aie rien \u00e0 faire. On a tous les ingr\u00e9dients pour automatiquement r\u00e9cup\u00e8rer des images de la F1TV du Grand Prix que l'on souhaite.","title":"R\u00e9cup\u00e8rer les cookies ?"},{"location":"index.html#calibration","text":"Maintenant que l'on a des images de la page Data de la F1TV on pourrait croire que c'est tout bon on peut direct passer \u00e0 la partie OCR. Mais que nenni ! Le gros soucis de l'OCR c'est que sa pr\u00e9cision est grandement r\u00e9duite d\u00e8s que l'on augmente la taille de la zone de recherche. M\u00eame simplement deux mots sur une image, si on les prends dans images individuelles on a de grandes chances de trouver quelque chose mais si on les mets les deux sur la m\u00eame et que on tente l'OCR on va avoir de r\u00e9sultats bien moins bons. Et puis il faut aussi voir que selon les donn\u00e9es que je cherche je ne peux pas faire le m\u00eame traitement. Par exemple, savoir si le DRS est allum\u00e9, savoir quels pneus chausse un pilote et depuis combien de tours et savoir quel est le temps de son dernier tour, ce sont des informations qui demandent des traitements qui n'ont rien \u00e0 voir. Il faut donc pouvoir dire au programme d'OCR ou se trouvent les informations et quelle est leur nature pour qu'il puisse les d\u00e9coder. Il faut donc faire une calibration qui puisse donner toutes les infos importantes mais qui en m\u00eame temps soit facile \u00e0 utiliser car un utilisateur doit \u00eatre capable de le faire assez facilement. Voici la liste des informations que l'on doit r\u00e9cup\u00e8rer : La liste des pilotes pr\u00e9sent sur le Grand Prix La position de la zone principale La position de chaque zone de pilote La position de toutes les Window sur chaque zone de pilote Le but a \u00e9t\u00e9 de retirer le plus d'\u00e9tapes possibles \u00e0 l'utilisateur. Techniquement j'aurais pu faire une version compl\u00eatement manuelle mais ca aurait pris trop de temps alors il y a des syst\u00e8mes qui permettent de rendre cette t\u00e2che moins p\u00e9nible.","title":"Calibration"},{"location":"index.html#liste-des-pilotes","text":"Pour la liste des pilotes j'ai pens\u00e9 \u00e0 utiliser une API externe pour avoir une liste dans laquelle on pourrait selectionner des noms de pilotes sauf que j'ai abandonn\u00e9 l'id\u00e9e car je trouvais que le projet avait d\u00e9ja bien assez de points qui d\u00e9pendent de l'exterieur. Il y a donc une liste de pilotes dans laquelle on peut ajouter ou supprimer des noms de pilotes. L'id\u00e9al serait de mettre tous les pilotes de reserve comme ca si un pilote est malade sur une course on a pas besoin de venir changer la liste.","title":"Liste des pilotes"},{"location":"index.html#zone-principale","text":"Pour la zone principale c'est compl\u00eatement manuel, on attend de l'utilisateur deux points x,y sur l'image pour ensuite avoir une id\u00e9e de ou est sens\u00e9 se trouver la zone. \"Exemple de zone principale\"","title":"Zone principale"},{"location":"index.html#zones-pilotes","text":"C'est la que ca devient int\u00e9ressant. L'utilisateur n'a pas besoin de faire quoi que ce soit pour que le programme sache ou sont les zones des pilotes. J'aurais pu le faire manuellement en faisant choisir \u00e0 l'utilisateur de donner deux points qui correspondent \u00e0 la premi\u00e8re zone et extrapoler pour en avoir 20. Sauf que si l'utilisateur n'est pas pr\u00e9cis au pixel pr\u00e8s (et m\u00eame comme ca parfois) le vingti\u00e8me pilote se retrouve avec une zone compl\u00eatement desax\u00e9e. La, le programme va \"simplement\" effectuer une reconaissance de texte sur toute l'image. Les r\u00e9sultats ne nous int\u00e9ressent pas vraiment tout ce que l'on veut c'est la position des textes. Avec les position il est facile de determiner ou sont toutes les zones de pilotes et donc sans que l'utilisateur n'aie \u00e0 toucher quoi que ce soit, d\u00e8s qu'il a donn\u00e9 les infos pour la zone principale, les zones de pilotes sont determin\u00e9es. \"Exemple zone pilote\" Voici un exemple du code utilis\u00e9 pour trouver ou dessiner des zones de pilotes : public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); List < Zone > zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Image image = MainZone . ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //var text = iter.GetText(PageIteratorLevel.Word).ToUpper(); //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } //DEBUG int i = 1 ; foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); //We add the driver zones Zone driverZone = new Zone ( MainZone . ZoneImage , windowRectangle , \"DriverZone\" ); MainZone . AddZone ( driverZone ); //driverZone.ZoneImage.Save(\"Driver\" + i+\".png\"); i ++; } }","title":"Zones pilotes"},{"location":"index.html#windows-pilotes","text":"C'est ici que c'est le plus p\u00e9nible pour l'utilisateur, il doit selectionner manuellement les positions des fen\u00eatres de donn\u00e9es. Ensuite d\u00e8s que l'utilisateur a donn\u00e9e une position pour chaque window, on applique les positions pour chaque zone de pilote. Il y a plusieurs types de windows et selon le type le traitement est diff\u00e9rent comme je l'ai dit plus t\u00f4t. Voici des exemples concrets : \"Exemple Window de pneus\" \"Exemple Window temps au tour\" \"Exemple window Drs\" Il est important que toutes ces zones soient transmises avec le plus de pr\u00e9cision possible pour que l'OCR puisse bien faire son boulot.","title":"Windows pilotes"},{"location":"index.html#stockage","text":"Ensuite quand l'utilisateur a finit de configurer son flux, la configuration est stock\u00e9e pour qu'il puisse ensuite la r\u00e9utiliser pour tous les autres Grand Prix de l'ann\u00e9e. Le stockage est fait sous format JSON et est fait pour que le programme d'OCR puisse lire dedans toutes les infos nescessaires. Cela fait des fichiers plut\u00f4t gros mais je n'avais pas vraiment le choix. J'ai test\u00e9 une version avec seulement les infos de la premi\u00e8re zone de pilote mais avec l'interpolation, les derniers pilotes se retrouvent avec des zones clairement pas \u00e0 la bonne taille. Voici un exemple de ce \u00e0 quoi ressemble le JSON final : { \"Main\" : { \"x\" : 36 , \"y\" : 343 , \"width\" : 3780 , \"height\" : 1454 , \"DriverZones\" : [ { \"name\" : \"Driver1\" , \"x\" : 0 , \"y\" : 1 , \"width\" : 3780 , \"height\" : 72 , \"Windows\" : [ { \"Position\" : { \"x\" : 45 , \"y\" : 3 , \"width\" : 76 , \"height\" : 65 }, \"GapToLeader\" : { \"x\" : 447 , \"y\" : 1 , \"width\" : 206 , \"height\" : 67 }, \"LapTime\" : { \"x\" : 863 , \"y\" : 3 , \"width\" : 229 , \"height\" : 65 }, \"DRS\" : { \"x\" : 1095 , \"y\" : 1 , \"width\" : 174 , \"height\" : 67 }, \"Tyres\" : { \"x\" : 1274 , \"y\" : 3 , \"width\" : 1448 , \"height\" : 62 }, \"Name\" : { \"x\" : 2724 , \"y\" : 3 , \"width\" : 361 , \"height\" : 65 }, \"Sector1\" : { \"x\" : 3088 , \"y\" : 1 , \"width\" : 239 , \"height\" : 65 }, \"Sector2\" : { \"x\" : 3314 , \"y\" : 4 , \"width\" : 190 , \"height\" : 62 }, \"Sector3\" : { \"x\" : 3493 , \"y\" : 1 , \"width\" : 198 , \"height\" : 67 } } ] }, { \"name\" : \"Driver2\" , \"x\" : 0 , \"y\" : 72 , \"width\" : 3780 , \"height\" : 72 , \"Windows\" : [ { \"Position\" : { \"x\" : 45 , \"y\" : 3 , \"width\" : 76 , \"height\" : 65 }, \"GapToLeader\" : { \"x\" : 447 , \"y\" : 1 , \"width\" : 206 , \"height\" : 67 }, \"LapTime\" : { \"x\" : 863 , \"y\" : 3 , \"width\" : 229 , \"height\" : 65 }, \"DRS\" : { \"x\" : 1095 , \"y\" : 1 , \"width\" : 174 , \"height\" : 67 }, \"Tyres\" : { \"x\" : 1274 , \"y\" : 3 , \"width\" : 1448 , \"height\" : 62 }, \"Name\" : { \"x\" : 2724 , \"y\" : 3 , \"width\" : 361 , \"height\" : 65 }, \"Sector1\" : { \"x\" : 3088 , \"y\" : 1 , \"width\" : 239 , \"height\" : 65 }, \"Sector2\" : { \"x\" : 3314 , \"y\" : 4 , \"width\" : 190 , \"height\" : 62 }, \"Sector3\" : { \"x\" : 3493 , \"y\" : 1 , \"width\" : 198 , \"height\" : 67 } } ] } [ O t her pilo ts ... ] ], \"Drivers\" : [ \"Perez\" , \"Verstappen\" , \"Alonso\" , \"Sainz\" , \"Russel\" , \"Gasly\" , \"Leclerc\" , \"Ocon\" , \"Hulkenberg\" , \"Bottas\" , \"Hamilton\" , \"Albon\" , \"Tsunoda\" , \"Zhou\" , \"Stroll\" , \"De Vries\" , \"Magnussen\" , \"Norris\" , \"Piastri\" , \"Sargeant\" ] } } Et avec tout ca. L'OCR peut d\u00e9marrer dans de bonnes conditions","title":"Stockage"},{"location":"index.html#ocr_1","text":"Maintenant que on a des images qui arrivent automatiquement et que l'on sait ou se trouvent les informations sur ces dites images, je vais parler de la seconde partie du projet qui parle du processus de reconnaissance de data sur une image du feed DATA de la F1TV. C'est je pense la partie qui a demand\u00e9 le plus tests et de refactor. Toute la partie OCR a \u00e9t\u00e9 d\u00e9velopp\u00e9e dans un projet \u00e0 part avant d'\u00eatre int\u00e9gr\u00e9e dans le projet final. Il faut savoir que la reconnaissance est diff\u00e9rente celon ce que l'on cherche. Je vais donc d\u00e9composer cette partie du document en sous rubriques selon les donn\u00e9es recherch\u00e9es. Mais avant ca je dois expliquer certains concepts qui seront importants.","title":"OCR"},{"location":"index.html#fonctionnement-general_1","text":"Voici un screenshot de la page DATA de la F1TV que le programme va recevoir : \"Screen F1TV\" Si on regarde de loin on peut se dire que la structure est plut\u00f4t simple mais c'est loin d'\u00eatre le cas. On peut y voir au moins 4 zones contenant de l'information dans un format diff\u00e9rent. \"Zones principales\" Dans l'exemple ci dessus on peut voir 3 zones mais on aurait \u00e9galement pu comprendre la zone de position des pilotes autour du circuit pour faire 4. Ces 4 zones sont tr\u00e8s diff\u00e9rentes et contiennent d'autres informations. Pour ce travail de dipl\u00f4me je ne m'occupe que de la zone principale. Mais je pense que le titre et les infos de circuit ne prendrait pas tant de temps que ca \u00e0 impl\u00e9menter. J'ai utilis\u00e9 le mot \"Zone\" plus haut et ca n'est pas juste un mot utilis\u00e9 au hasard. C'est le nom de l'objet que j'utilise pour les repr\u00e9senter dans mon programme. Mais comme c'est important de bien comprendre ce concept avant de continuer je vais vous l'expliquer. ZONE : L'objet \"Zone\" parent est un objet qui est une zone d'image. Je m'explique, le but d'une zone est d'\u00eatre un morceau d'une image plus grande. Le but d'une Zone est de contenir une liste de plus petites Zones ou bien une liste de \"Window\" (j'explique ce que c'est juste apr\u00e8s). Elle contient la portion d'image qui la concerne et ses propres dimensions. Le parent zone ne pr\u00e9voit que de pouvoir ajouter ou supprimer des \u00e9l\u00e9ments des listes de zones ou de windows ainsi qu'une methode qui permet d'aller chercher toutes informations des livres qu'elle contient. L'int\u00e9r\u00eat d'une zone est de pouvoir compartimenter une image dans des parties int\u00e9ressantes au niveau de la reconnaissance mais pas de traiter d'information. WINDOW : L'objet \"Window\" est un objet qui peut ressembler beaucoup \u00e0 l'objet \"Zone\". En effet elle aussi est une partie d'une image plus grande et contient ses dimensions, mais elle se distingue en deux points importants. Elle ne contient pas d'autres Zones ou Windows Elle peut retourner les informations \u00e9crites sur son image. Toutes les Window qui h\u00e9ritent du parent Window peuvent impl\u00e9menter une methode qui permet de renvoyer ce qui peut \u00eatre d\u00e9cod\u00e9 sur son image. Les enfants peuvent aussi aller piocher dans les nombresues methodes de r\u00e9cup\u00e8ration de donn\u00e9es contenues dans le parent Window. Mieux vaut r\u00e9utiliser le plus possible que de r\u00e9inventer la roue pour chaque Window. Une analogie un peu bancale pourrait se pr\u00e9senter comme la suivante : La zone est une armoire ou une bibliot\u00e8que. Si c'est une zone qui contient d'autres zones c'est une bibliot\u00e8que et chacune de ces sous-zones sont des armoires. Leur unique but est de contenir de mani\u00e8re ordonn\u00e9e des objets qui eux contiennent de l'information. Les livres ici sont les Windows. Ils contiennet de l'information et sont stock\u00e9s dans des armoires et on y acc\u00e8de en allant dans la bonne bibliot\u00e8que et en allant dans la bonne armoire. Derni\u00e8res choses pour comprendre le diagramme: Il existe une Main Zone qui est une des 4 grandes zones dont je parlais dans la d\u00e9composition de l'image. Il existe aussi des \"Driver Zone\" qui sont de plus petites zones contenues dans la Main Zone qui et qui ne contiennent que les informations d'un pilote. L'objet Window n'est quasi jamais utilis\u00e9, c'est presque tout le temps des enfants de Window plus sp\u00e9cifiques qui sont utilis\u00e9s, le but est que chaque type d'information sur l'image aie son type de window. Voila donc un petit diagramme qui montre le d\u00e9coupage du programme : \"Diagramme explicatif de l'architecture des zones\" Pour visualiser encore un peu mieux comment ce d\u00e9coupage prend forme voici ce que chaque zone et Window contient. Main Zone : \"Exemple zone principale\" Driver Zone : \"Exemple zone de pilote\" Driver Position Window : \"Exemple de fen\u00eatre de position\" Driver name Window : \"Exemple de fen\u00eatre de nom\" Driver LapTime Window : \"Exemple de fen\u00eatre de temps au tour\" Driver Tyre Window : \"Exemple de fen\u00eatre pneus\" Il existe d'autres types de Window mais ce sont les principaux. On se rend assez facilement compte que chacunes de ces windows va avoir besoin d'un traitement sp\u00e9cifique car la mani\u00e8re de reconnaitre le pneu utilis\u00e9 et le temps au tour ne peut pas \u00eatre la m\u00eame. Pour r\u00e9sumer, on a un programme qui prend en entr\u00e9e un fichier de configuration, qui prend des images de la F1TV et les d\u00e9coupe dans des ZONES qui elles m\u00eame sont d\u00e9coup\u00e9es en WINDOWS pour qu'on puisse plus facilement les d\u00e9coder. Maintenant qu'on a une liste de diff\u00e9rent types de zones on peut commencer \u00e0 chercher ce qu'il y a marqu\u00e9 dessus. Pour cela il faut dabord comprendre un petit peu comment l'OCR fonctionne et comment des libraries comme Tesseract fonctionnent pour donner du texte en partant d'une image. Pour faire tr\u00e8s simple, nous avons un mod\u00e8le qui est entrain\u00e9. C'est \u00e0 dire que on donne \u00e0 un programme un tr\u00e8s grand nombre de mots ou de lettres en lui disant ce que contiennent chaques images. Ensuite le programme va cr\u00e9er des matrices de convolutions pour chaque lettre avec comme objectif de detecter les points communs entre les lettres pour cr\u00e9er un alpphabet. Par exemple la matric de la lettre 'H' donnerait un poids important \u00e0 des lignes verticales connect\u00e9es par une ligne centrale. Et si on fournis assez de donn\u00e9es de bonne qualit\u00e9 au mod\u00e8le, les matrices peuvent \u00eatre tr\u00e8s efficace \u00e0 detecter si une lettre est un H ou un M. Il y a pleins d'autres methodes comme l'utilisation d'un dictionnaire de mots de la langue pour permettre la reconnaissance de mots m\u00eame si une lettre au milieu n'est pas comprise ou en ajoutant d'autres informations sur le contexte mais ca ne nous int\u00e9resse pas ici. C'est important de comprendre comment cette reconnaissance de caract\u00e8res avec des matrices fonctionne car cela va nous aider \u00e0 pr\u00e9parer nos donn\u00e9es pour lui rendre la vie facile et augmenter la pr\u00e9cision de nos r\u00e9sultats.","title":"Fonctionnement g\u00e9n\u00e9ral"},{"location":"index.html#filtres-et-traitement","text":"On peut essayer de donner toutes nos images directement \u00e0 Tesseract pour qu'il reconnaisse tout le texte qu'il y voit mais on risque de se retrouver avec des r\u00e9sultats au mieux inconsistents. Dans notre cas, le soucis est que les chiffres et lettres sont beaucoup trop petits. Ils ne font parfoisd que 10 pixels de haut et cela fait que il n'est pas forc\u00e9ment facile de toujours les diff\u00e9rencier. De plus, comme ils sont petits, les art\u00e9facts d'aliasing sont assez violents et peuvent grandement d\u00e9former une lettre ou un chiffre. Exemple : Prenons le chiffre 9. Dans l'image il peut \u00eatre repr\u00e9sent\u00e9 de cette mani\u00e8re : \"Exemple de chiffre avant post traitement\" On peut voir qu'il est flou, pour nous cela ne pose pas de probl\u00e8me et je pense que \u00e0 peu pr\u00e8s nimporte qui peut dire que c'est un 9. Cependant comme les contours sont flous et m\u00eame si on essaie de retirer le background : \"9 avec anti aliasing\" On voit que le 9 n'est pas clairement d\u00e9finit. En effet on pourrait le comprendre comme : \"Premier exemple de contours\" Ou comme : \"Second exemple de contours\" Voire m\u00eame simplement comme : \"Exemple de coutour g\u00e9n\u00e9reux\" Et on se rend bien compte que les performances de detection ne sont pas les m\u00eames dans ces trois cas. Il faut donc faire un certain post traitement des images pour supprimer les \u00e9l\u00e9ments parasites, les couleurs, et augmenter la visibilit\u00e9 des contours importants. Mais chaque type de donn\u00e9e va avoir des methodes de post traitement diff\u00e9rents. Donc voici les diff\u00e9rents types de reconnaissance et leur post traitements :","title":"Filtres et traitement"},{"location":"index.html#texte","text":"Alors ce type de reconnaissance est utilis\u00e9 par la WINDOW du nom de pilote et de la position du pilote. C'est je pense la plus simple de toutes car Tesseract est particuli\u00e8rement bien entrain\u00e9 pour. Cette reconnaissance concerne donc des lettres qui font des mots ou des noms. Voici un exemple de la WINDOW nom de pilote en entr\u00e9e : \"Exemple texte cru\" Ce texte peut paraitre bon, cependant quand on le lance dans Tesseract, il ne va pas toujours donner un r\u00e9sultat parfait. Il faut aussi savoir qu'il y a des noms pas mal plus p\u00e9nibles que Tesseract a plus de mal \u00e0 reconnaitres, soit \u00e0 cause des lettres utilis\u00e9es, soit car le nom est un nom d'une autre r\u00e9gion et qui ne veut rien dire en anglais ce qui emp\u00eache l'utilisation de dictionnaire (Ex : Tsunoda est un nom japonais et parfois il est difficile pour Tesseract de le reconnaitre car si une lettre pose probl\u00eame il ne peut pas trouver de contexte qui puisse l'aider). Donc pour le rendre plus facilement lisible et augmenter les chances que toutes les lettres soient d\u00e9couvertes, voici les \u00e9tapes que j'ai mis en place. 1 : J'inverse les couleurs. Je me suis rendu compte que il \u00e9tait souvent plus facile de trouver un noir sur blanc que blanc sur noir. Je ne suis pas sur que cette \u00e9tape soit capitale cependant. \"Texte invers\u00e9\" 2 : Je fais un Treshhold de 165 car avec moins le texte parfois prend trop du background et avec plus les lettres sont trop fines. \"Texte apr\u00e8s Treshold\" 3 : Je fais un Resize de l'image pour avoir une meilleure r\u00e9solution et permettre une meilleure d\u00e9tection. J'augmente la hauteur et la largeur par un facteur 2. J'ai trouv\u00e9 cette valeur suffisante et aller plus haut consomme beaucoup de ressources. \"Texte apr\u00e8s Resize\" 4: Je fais une tr\u00e8s rapide Dilatation du texte pour retirer le flou amen\u00e9 par la methode de Resize. Je n'utilise qu'une valeur de 1 car je ne veux pas trop changer comment le texte est model\u00e9 je veux juste retirer le flou. \"Texte apr\u00e8s Dilatation\" Explication des methodes pr\u00e9cises plus bas Voila pour ce qui est du post processing. Je ne dis pas que ce sont les meilleurs param\u00eatres possibles mais dans mes tests ce sont ceux qui ont le mieux march\u00e9s. C'est aussi les premi\u00e8res methodes que j'ai pu d\u00e9velopper alors forc\u00e9ment elles n'ont pas le niveau de d\u00e9tails de certaines autres. Mais comme m\u00eame avec ce traitement il n'est pas rare que je me retrouve avec une ou deux lettres pas justes, il faut un moyen d'\u00eatre s\u00fbr que c'est le bon nom qui est trouv\u00e9. Ce qu'il y a de pratique avec les noms de pilotes c'est que on sait d\u00e9ja comment ils s'appellent avant le Grand Prix. En effet dans le fichier de configuration de la reconnaissance, il y a une liste de noms de pilotes. Cela veut dire que au lieu de chercher \u00e0 trouver parfaitement les bonnes lettres, on peut simplement essayer de trouver quel nom de pilote ressemble le plus au nom trouv\u00e9 sur l'image. Pour ce faire j'ai utilis\u00e9 une methode appel\u00e9e la distance de Levenshtein. Pour faire simple c'est une methode qui va calculer les distances de lettres pour determiner entre des strings laquelle ressemble le plus \u00e0 une autre. Pour r\u00e9sumer le fonctionnement dans lordre : On prend l'image on la traite On envoie l'image trait\u00e9e \u00e0 Tesseract On trouve quel nom de pilote ressemble le plus \u00e0 ce r\u00e9sultat On renvoie le nom du pilote","title":"Texte"},{"location":"index.html#chiffres","text":"Cette methode en r\u00e9alit\u00e9 utilise simplement la m\u00eame methode que celle qui va r\u00e9cup\u00e8rer le texte sur une image. Cependant, la, on envoie \u00e0 Tesseract l'information qu'il ne peut trouver que des chiffres sur l'image ce qui lui permet d'\u00eatre beaucoup plus pr\u00e9cis et de ne pas confondre un 9 avec un P ou un 11 avec un H PAR EXEMPLE (non pas que ca me soit arriv\u00e9 tr\u00e8s r\u00e9guli\u00e8rement et que ca me soit rest\u00e9 dans la gorge \u00e9videmment) L'avantage c'est que cette methode ne demande m\u00eame pas de traitement de la donn\u00e9e en sortie de Tesseract. On \u00e9sp\u00e8re simplement que le post traitement aura suffit. TEMPS : Cette methode regroupe la d\u00e9tection de temps au tour. Il y a trois grands types de WINDOW qui sont concern\u00e9es : La WINDOW du temps au tour La WINDOW du retard sur le leader La WINDOW des secteurs La grande diff\u00e9rence ce sont les ordres de grandeur. Les temps au tour sont en g\u00e9n\u00e9ral entre 50 secondes et 2 minutes. Tandis que les secteurs sont entre 20 et 30 secondes alors que le retard sur le leader peut-\u00eatre de plusieurs minutes. Cependant, tous ces temps poss\u00e8dent le m\u00eame type de post-traitement avant d'\u00eatre envoy\u00e9s \u00e0 Tesseract. Voici un exemple de temps au tour avant toute transformation : \"Temps au tour avant traitement\" On peut avoir l'impression que ce texte est tout \u00e0 fait lisible et facile \u00e0 d\u00e9coder surtout quand on le voit de loin comme ca. Cependant, il faut imaginer que ces chiffres font 13 pixels de haut en comptant le flou et comme expliqu\u00e9 plus haut ce flou dans ces echelles est terrible. \"Temps au tour zoom\u00e9\" Si on donne cette image \u00e0 Tesseract, les '3' deviennent des '9', des '9' deviennent des '8', des '2' deviennent eux aussi des '9', le tout parfois inversement et de mani\u00e8re compl\u00eatement impr\u00e9visible. Ca n'est simplement pas utilisable. Cette partie est un peu plus complexe car si la detection n'est pas fiable les chiffres sont simplement inutilisables. Si \u00e0 tout moment un temps au tour de 1:39.106 devient 1:32.108 c'est juste pas possible. Voici donc les \u00e9tapes de post-traitement que j'ai mis en place pour leur d\u00e9tection : 1: J'applique un Treshold de 185 pour enlever les ambiguit\u00e9s d'alisaising et avoir une image en noir et blanc claire. La valeur de 185 est assez \u00e9lev\u00e9e car le but est de vraiment garder uniquement les contours. Comme les chiffres se ressemlent beaucoup plu que les lettres, il faut tenter le plus possible de conserver leur formes sp\u00e9cifiques. Je me suis rendu compte que cette valeur \u00e9tait une de celles qui marchent le mieux. \"Temps au tour apr\u00e8s Treshold\" 2: J'applique un Resize de 2 pour augmenter la r\u00e9solution des chiffres et permettre une meilleure d\u00e9tection. Le but est d'avoir plus de pixels et donc de permettre \u00e0 Tesseract de mieux utiliser ses matrices de convolution. \"Temps au tour apr\u00e8s Resize\" 3: Comme le Resize am\u00e8ne du flou, j'utilise une methode de Dilatation qui me permet de retirer ce flou et de remplir un peu plus certaines parties qui ont \u00e9t\u00e9 un peu laiss\u00e9e par le Resize ; \"Temps au tour apr\u00e8s Dilatation\" 4: Contrairement aux mots plus haut, la rondeur ajout\u00e9e par la dilatation n'est pas vraiment d\u00e9sir\u00e9e. En effet, elle peut rendre confuse certains chiffres et emp\u00eacher Tesseract de bien trouver le chiffre. Alors j'applique une Erosion qui me permet de contrecarrer en partie les rondeurs ajout\u00e9es par la dilatation et retrouver des chiffres bien form\u00e9es. Pour l' Erosion et la Dilatation j'ai utilis\u00e9 une valeur de 1 car je ne voulais pas trop changer les chiffres. \"Temps au tour apr\u00e8s Erosion\" Explication des methodes pr\u00e9cises plus bas Et avec ce post processing on retrouve de plut\u00f4ts bon r\u00e9sultats qui demandent peu de traitement. Le traitement d\u00e9pend du type de WINDOW cependant. Pour les secteurs on indique \u00e0 Tesseract que les caract\u00e8res autoris\u00e9s sont : \"0123456789.\" Pour les temps au tour on autorise plut\u00f4t \"0123456789.:\" Et pour les \u00e9carts on autorise \"0123456789.+\" Ensuite on r\u00e9cup\u00e8re une liste de chiffres qui'il va falloir transformer en milisecondes pour faciliter le stockage et l'envoi. Le programme nettoie un peu la chaine avant de la convertir. Par exemple parfois le ':' de 1:34.456 est compris comme un '1' ou un '2' et il faut faire attention \u00e0 detecter quand ca arriver. Je passe les d\u00e9tails du reste du nettoyage car c'est vraiment du cas par cas mais quand on a finit de nettoyer la chaine on peut transformer les chaines de minutes secondes et milisecondes en un total de milisecondes. Pour r\u00e9sumer le fonctionnement dans l'ordre : On prend l'image et on lui applique une s\u00e9rie de filtres On envoie l'image filtr\u00e9e \u00e0 Tesseract On nettoie le r\u00e9sultat Tesseract pour compenser certains biais On convertis le r\u00e9sultat en milisecondes","title":"Chiffres"},{"location":"index.html#les-chiffres-2","text":"Il faut savoir que avec la derni\u00e8re version de l'\u00e9mulateur (dont je vais parler un peu plus tard)","title":"les chiffres (2)"},{"location":"index.html#pneus","text":"La on arrive sur la partie la plus p\u00e9nible. Pour comprendre la probl\u00e9matique il faut d'abord faire un petit point sur comment les pneus fonctionnent en Formule 1. Depuis 2019 en Formule 1 nous avons 5 grandes familles de pneus : Les pneus tendres Les pneus medium Les pneus durs Les pneus interm\u00e9diaires Les pneus pluie \"Gamme de pneus Pirelli\" Les trois premiers pneus sont des pneus faits pour piste s\u00e8che, le pneu interm\u00e9diaire pour piste humide et le neu pluie pour la pluie. Chaque pneu a sa dur\u00e9e de vie et son niveau de performance propre mais je ne vais pas rentrer dans le d\u00e9tail ici. Tout ce qu'il faut savoir ce que savoir sur quel pneu chaque pilote est et depuis combien de temps il les chausse est une information tr\u00e8s importante. Chaque pneu a une couleur donn\u00e9e qui permet de les diff\u00e9rencier. Voici un exemple de ce \u00e0 quoi une WINDOW de pneus peut ressembler : \"Exemple zone pneus 1\" Mais cette zone peut aussi ressembler \u00e0 ca : \"Exemple zone pneus 2\" Mais aussi \u00e0 ca : \"Exemple zone pneus 3\" Voire m\u00eame ca : \"Exemple zone pneus 4\" Je pense que vous pouvez tout de suite comprendre la difficult\u00e9 que repr\u00e9sente la t\u00e2che de r\u00e9cup\u00e8ration de donn\u00e9es \u00e0 partir de cette image. En gros le fonctionnement de cette zone d'information est assez simple. Au fur et \u00e0 mesure que la course avance, le trait fait de m\u00eame. Le chiffre dans le round tout \u00e0 droite indique le nombre de tour que le pilote a pass\u00e9 sur ce pneu. La couleur indique le type de pneu. Si il y a une lettre \u00e0 la place d'un chiffre c'est que c'est le premier tour sur ce pneu. La lettre indique le type de pneu. Et pas besoin de dire que si on essaie simplement de donner l'image \u00e0 Tesseract on ne r\u00e9cup\u00e8re ni les chiffres ni les lettres correctement si ce n'est pas du tout. Il faut donc utiliser une methode qui permette d'isoler le rond le plus \u00e0 droite, lui appliquer un traitement qui permette \u00e0 Tesseract de lire ce qu'il y a marqu\u00e9 et qui puisse determiner quel pneu est en train d'\u00eatre utilis\u00e9. J'ai d\u00e9cid\u00e9 de m'occuper dans un premier temps de trouver ce rond avant d'appliquer les filtres car plus l'image est petite plus les filtres sont rapides. Le programme va tirer un trait depuis le bord droit de la zone, et il va avancer vers la gauche jusqu'\u00e0 trouver un obstacle. Je d\u00e9tecte un obstacle si le pixel sur lequel est mon trait poss\u00e8de une valeur de plus de 0x50 dans le channel R,G ou B. J'ai trouv\u00e9 en faisant des tests que les couleurs de background de la F1TV ne d\u00e9passaient jamais ces valeurs. Ensuite apr\u00e8s avoir trouv\u00e9 le premier obstacle, je r\u00e9cup\u00e8re une zone qui doit englober le cercle. Voici un exemple avec cette image en entr\u00e9e : \"Zone compl\u00eate\" Elle est automatiquement coup\u00e9e de cette facon : \"Zone coup\u00e9e automatiquement\" Cela me permet d'isoler uniquement ce qui m'int\u00e9resse ce qui est tr\u00e8s pratique pour Tesseract et pour la detection de couleur. Ensuite avec cette image je peux commencer le processus de reconnaissance. Je commence par faire une moyenne de tous les pixels de l'image en excluant les pixels trop sombres qui font s\u00fbrement partie du background ou du chiffre. Ensuite j'utilise une methode qui calcule la diff\u00e9rence entre la couleur obbtenue et la liste de couleurs possible. Il y a cinq couleurs des pneus possibles : \"#ff0000\" pneu tendre/soft \"Couleur d'un pneu tendre\" \"#f5bf00\" pneu medium \"Couleur d'un pneu medium\" \"#a4a5a8\" pneu dur/hard \"Couleur d'un pneu dur\" \"#00a42e\" pneu inter \"Couleur d'un pneu interm\u00e9diaire\" \"#2760a6\" pneu pluie/wet \"Couleur d'un pneu pluie\" Ce qui est pratique c'est que m\u00eame dans les cas ou il n'y a pas beaucoup de couleur comme celui la : \"Pneu dur avec 0 tours\" On arrive \u00e0 une couleur moyenne de : \"Couleur moyenne de l'image ci dessus apr\u00e8s soustraction du background\" Et il est donc assez facile de determiner le type de pneu en question. Attention, les r\u00e9sultats peuvent \u00eatre tr\u00e8s vite d\u00e9rang\u00e9s par la couleur du pneu pr\u00e9c\u00e9dent si le d\u00e9coupage de la fen\u00eatre n'a pas \u00e9t\u00e9 assez pr\u00e9cis. Ensuite il \"suffit\" de lire le chiffre dans le rond et si on arrive pas \u00e0 le lire alors c'est que c'est une lettre et on sait que le nombre de tours est donc de 0. Maintenant vient le moment tr\u00e8s sympatique de la lecture du chiffre. Vous saurez que Tesseract en plus de detester les grandes images et les images avec des couleurs, deteste \u00e9galement les formes dans une image. Donc dans notre cas, le round de couleur autour du chiffre, m\u00eame si il n'est pas complet, il interf\u00e8re avec la reconnaissance et emp\u00eache de bien lire le chiffre. Il faut donc retirer le background et ensuite la couleur. Sauf que comme le chiffre est de la couleur du background, si on retire le background et ensuite la couleur il ne reste plus rien. Il faut donc retirer le background AUTOUR du rond, et ensuite si on retire la couleur il devrait rester le chiffre sur fond blanc. Pour se faire, j'ai tir\u00e9 des traits depuis les bords de l'image jusqu'\u00e0 ce qu'ils rencontrent le rond. Ensuite je retire tous les pixels entre le rond et les bords de l'image ce qui nous donne ceci : \"Zone pneu avec le background en moins\" Ensuite on peu retirer les pixels qui ont une valeur dans un channel RGB plus haute qu'un certain seuil : \"Zone avec le reste des couleurs supprimm\u00e9es\" Et la on a ce que l'on veut ! A partir de la c'est les filtres que l'on connait qui sont utilis\u00e9s pour en faire une image plus facile \u00e0 utiliser par Tesseract. 1 : On effectue un Resize de facteur 4 (oui c'est beaucoup mais en m\u00eame temps le chiffre est vraiment petit \u00e0 la base) qui permet d'avoir une image d'une bien meilleure r\u00e9solution. \"Filtre 1\" 2: On fait une Dilatation de facteur 1 pour retirer tout le flou de l'image pour aider Tesseract \"Resultat\" Et on a un chiffre qui est utilisable par Tesseract ! Explication des methodes pr\u00e9cises plus bas Pour r\u00e9sumer : On prend l'image de la zone et on la crop pour ne garder que la partie essentielle On d\u00e9termine le type de pneu avec la couleur moyenne de la zone On retire le background autour de cette zone On retire la couleur qui reste pour ne garder que le chiffre On augmente la r\u00e9solution du chiffre On rend ce chiffre net On envoie l'image trait\u00e9e et filtr\u00e9e \u00e0 Tesseract On d\u00e9termine le nombre de tours que le pilote a fait avec ses pneus avec le r\u00e9sultat de Tesseract","title":"Pneus"},{"location":"index.html#drs","text":"Bon ca c'\u00e9tait plut\u00f4t simple j'ai simplement v\u00e9rifi\u00e9 si la moyenne de vert d\u00e9passait une certaine valeur et puis voila.","title":"DRS"},{"location":"index.html#filtres-et-methodes-sur-les-images","text":"Dans ce projet on a du utiliser diff\u00e9rentes methodes d'\u00e9dition d'image que ce soit sous forme de filtres ou de modification de l'image directement. Voici un sommaire des methodes utilis\u00e9es et comment elles fonctionnent. Tresholding Cette methode sert \u00e0 passer d'une image en couleurs \u00e0 une image binaire noir blanc. C'est une \u00e9tape tr\u00e8s importante pour l'OCR car elle permet (si bien faite) d'isoler du texte de son background. Un exemple ici : \"Exemple treshold\" Le fonctionnement est assez simple mais il peut \u00eatre fait de diff\u00e9rentes mani\u00e8res mais dans mon cas voici comment l'algorythme fonctionne sachant qu'il demande en entr\u00e9e la Bitmap que l'on veut modifier ainsi que la valeur de Treshold : On parcours chaque pixel de l'image On convertir la couleur du pixel en une valeur de gris pour avoir la m\u00eame valeur en R,G et B (Formule utilis\u00e9e : grey = R x 0.3 + G x 0.59 + B x 0.11) Si le r\u00e9sultat de la valeur de gris est au dessus de la valeur de treshold, le pixel est pass\u00e9 en blanc complet et dans le cas contraire il est pass\u00e9 en noir complet On retourne la Bitmap modifi\u00e9e Un algorythme pas forc\u00e9ment complexe mais qui peut augmenter de mani\u00e8re titanesque les chances de r\u00e9ussir une OCR Resize Cette methode sert \u00e0 augmenter la r\u00e9solution d'une image pour am\u00e9liorer la pr\u00e9cision de l'algorythme de Tesseract. En effet, avec trop peu de pixels, la matrice de convolution n'est pas toujours aussi efficace. Il ne faut pas confondre cette methode d'augmentation de la taille avec une simple interpolation. En effet une augmentation de taille interpol\u00e9e ne vas pas vraiment changer la r\u00e9solution, l'image sera toujours aussi pixelis\u00e9e, seulement, les pixels seront compos\u00e9es de plus de pixels comme dans l'exemple ci dessous : \"Exemple d'interpolation lin\u00e9aire\" Dans mon projet j'utilise de l'interpolation bicubique qui va cr\u00e9er de l'information pour tenter de combler le vide et produire une image r\u00e9ellement plus grande et avec plus de details mais en ajoutant du flou. \"Exemple des diff\u00e9rents types d'interpolation\" Le but est d'aller chercher dans les pixels alentours les couleurs qui sont d\u00e9ja pr\u00e9sente et de jouer avec des poids pour tenter de faire une pr\u00e9diction de ce que ce pixel aurait \u00e9t\u00e9 si l'image avait plus de detail. Voici un exemple assez parlant : \"Exemple interpolation bicubique (avant)\" \"Exemple interpolation bicubique (apr\u00e8s)\" On pourrait croire que c'est inutile mais dans le contexte de Tesseract ajouter des d\u00e9tails pour tenter de simuler une meilleure r\u00e9solution m\u00eame en cr\u00e9ant du flou est int\u00e9ressant pour mieux remplir la matrice de convolution. Mais il est possible de r\u00e9duire ce flou avec d'autres m\u00e9thodes \u00e9galement. (Dans mon code je n'ai pas utilis\u00e9 du code fait main mais j'utilise une librairie qui me permet de le faire) Il faut simplement faire attention car c'est un proc\u00e9d\u00e9 assez lourd en performances. Dilatation et Erosion Cette methode et la suivante font partie des methodes de transformation morphologiques. Ces methodes sont utilis\u00e9es pour accentuer les formes et les epaissir ou les r\u00e9duire et les affiner. Elles poss\u00e8dent l'aventage \u00e9galement de retirer le flou d'une image ce qui est tr\u00e8s pratique si utilis\u00e9 apr\u00e8s l'utilisation de methodes comme Resize . Je ne vais pas trop rentrer dans les d\u00e9tails de ces methodes car leur fonctionnement est un peu plus lourd en math si on veut faire une v\u00e9ritable explication du pourquoi et du comment ca marche aussi bien. Pour notre projet je dirais que l'important est de savoir que ce sont deux outils tr\u00e8s pratiques pour changer la morphologie des lettres et des chiffres et qu'on peut les utiliser pour corriger du flou et/ou des art\u00e9facts apparus lors de la binarisation de l'image ou de la suppression de fond. Remove Background Cette methode est assez simple et est juste une methode qui va passer en revue tous les pixels de l'image et si la couleur d'un pixel s'apparente \u00e0 celle d'un pixel de fond il est pass\u00e9 en noir total ou en blanc total. Le but est de permettre au reste du programme de fonctionner avec des couleurs moins ambigues. Une variante sp\u00e9cialis\u00e9e pour la reconnaissance des pneus appel\u00e9e affectueusement Remove Useless cherche \u00e0 atteindre le m\u00eame bu mais est bien plus soffistiqu\u00e9e et sp\u00e9cialis\u00e9e pour retirer le background autour d'un cercle de couleur pour ensuite retirer la couleur et qu'il ne reste qu'un chiffre. Pour plus de details voir la detection de pneus. Il y aussi d'autre methodes comme un filtre Gaussien ou Highlight countour que j'ai du d\u00e9velopper mais que je n'ai pas utilis\u00e9 donc je ne vais pas en parler ici.","title":"Filtres et methodes sur les images"},{"location":"index.html#petit-point-resolution","text":"Comme on peut l'imaginer la r\u00e9solution est extr\u00eamement importante pour l'OCR. Et en avancant sur le projet de l'\u00e9mulateur je me suis rendu compte qu'il \u00e9tait possible de r\u00e9cup\u00e8rer des images en 4K (Plut\u00f4t 1080 avec l'upscaling du lecteur). Cela est une superbe nouvelle car cela permet de simplifier \u00e9norm\u00e9ment le processing sur les diff\u00e9rentes windows. Quelques exemples pour se faire une id\u00e9e \"Echantillon 720P\" ; \"Echantillon 1080P\" \"Echantillon 4K\" Mais il faut savoir que gr\u00e2ce \u00e0 cette simplification j'ai pu aussi cr\u00e9er d'autres methodes de filtrage pour certaines parties. Mais la simplification \u00e9tait obligatoire car avec des images aussi grande il n'\u00e9tait simplement pas possible de venir appliquer les m\u00eames filtres car le temps de traitement serait beaucoup plus long. J'indique ces changements que apr\u00e8s l'explication d'avant car ce sont des changements un peu de derni\u00e8re minute et que la logique expliqu\u00e9e plus haut a \u00e9t\u00e9 tr\u00e8s importante pour le projet OCR m\u00eame si tout n'est plus forc\u00e9ment utilis\u00e9 maintenant que j'ai des images de meilleure qualit\u00e9. Dans la version actuellement disponible la reconnaissance a \u00e9t\u00e9 simplifi\u00e9e sous cette forme : Le \"GapToLeader\" est d\u00e9cod\u00e9 avec un premier passage de Tresholding \u00e0 165 puis un Resize de 2 et une Dilatation de 1 pour retirer le flou Les \"Sectors\" sont d\u00e9cod\u00e9s en utilisant une toute nouvelle methode VanishOxyAction \u00e0 cause des couleurs parfois appliqu\u00e9es et ensuite simplement une methode de Tresholding de 150 pour rendre le r\u00e9sultat assez propre pour l'OCR. Le \"LapTime\" est dabord pass\u00e9 par un Tresholding tr\u00e8s strict de 185 pour pr\u00e9parer la SobelEdgeDetection qui est \u00e9galement une nouvelle methode qu'il a \u00e9t\u00e9 possible d'utiliser gr\u00e2ce \u00e0 la simplification du reste des processus. Le \"Text\" est d\u00e9cod\u00e9 simplement avec un tresholding de 165 maintenant gr\u00e2ce \u00e0 l'image 4K. Les pneus ont leur propre traitement comme expliqu\u00e9 plus haut auquel on ajoute la Dilatation de 1. Comme on peut le voir le traitement est pas mal plus simple mais cela ne veut pas dire que les autres methodes que je n'utilise plus ne sont pas utiles. La reconnaissance n'est pas encore parfaite et je pense que leur utilisation pourrait aider \u00e0 am\u00e9liorer les r\u00e9sultats. (Et parfois ces anciennes methodes sont utiles dans les traitements personnalis\u00e9s des windows elle m\u00eames comme par exemple les pneus qui utilisent la methode GrayScale pour isoler les couleurs) VanishOxyAction Cette methode est une methode plut\u00f4t simple mais qui est importante. Elle se base beaucoup sur le code de la methode Grayscale et sur la methode Tresholding car elle essaie de regrouper le meilleur des deux en r\u00e8glant quelques soucis que ces derni\u00e8res cr\u00e9\u00e9ent. Le soucis avec la methode grayscale c'est que quand le texte est de couleur (Ce qui arrive souvent pour les temps de secteurs) la methode GrayScale rend les couleurs dans une nuance de gris un peu trop sombre ce qui fait que ensuite la methode de Tresholding d\u00e9fonce tout. \"Exemple de secteur en couleur\" \"Exemple de secteur en grayscale\" L'id\u00e9e est alors de prendre pour chaque pixel et de garder uniquement la valeur de R,G ou B la plus haute et de mettre les deux autres canaux au m\u00eame niveau pour avoir une image blanchie qui puisse \u00eatre ensuite utilis\u00e9e avec la methode de Tresholding sans soucis. \"Exemple de secteur blanchi avec vanishoxyAction\" SobelEdgeDetection On pourrait se dire que avec ce genre de methode le tresholding est inutile ensuite mais ca n'est pas le cas car le tresholding sert ensuite pour rendre les contours plus ou moins aggressif. Car m\u00eame si l'image ressemble \u00e0 une image binaris\u00e9e, il reste des nuances que le treshold va pouvoir utiliser. SobelEdgeDetection Cette methode est une methode assez classique que je n'ai pas design\u00e9 moi m\u00eame alors je ne vais pas trop m'\u00e9pancher dessus. En gros on utilise une matrice et une formule math\u00e9matique pour redessiner une image et le r\u00e9sultat est une image avec des contours. Je ne l'ai utilis\u00e9 que pour les temps au tour car ce sont les plus r\u00e9calcitrants. Cette methode a besoin d'une image pass\u00e9e en noir et blanc au pr\u00e9alable \u00e0 laquelle on applique ensuite les matrrices de filtres. Et avec ces filtres ajout\u00e9s \u00e0 l'image on peut ensuite calculer le \"Gradient\" pour cr\u00e9er les bords. Le seul soucis de cette methode c'est qu'elle est assez gourmande et qu'elle fournit des formes creuses d\u00fb \u00e0 la nature des matrices donn\u00e9es. Voici un exemple de ce dont cette m\u00e9thode est capable : Artefacts de la detection de bords de Sobel Apparemment l'OCR aime assez bien cette methode et elle permet de beaucoup moins souvent oublier les '.' ou ':'","title":"Petit point r\u00e9solution"},{"location":"index.html#traitement-des-donnees","text":"C'est bien gentil de recevoir des r\u00e9sultats de l'OCR, cependant on ne peut pas souvent les utiliser comme tels. En effet les resultats ne sont pas tr\u00e8s constants et demandent d'\u00eatre verifi\u00e9s pour savoir si ils doivent \u00eatre pris en compte. Le post traitement de ces donn\u00e9es d\u00e9pend compl\u00eatement du contexte et donc il est diff\u00e9rent pour chque type de window. Voici un floril\u00e8ge des diff\u00e9rents types de traitements : Traitement du nom de pilote Rien de plus que ce qui est d\u00e9ja d\u00e9taill\u00e9 dans la partie OCR Traitement des pneus Pareil Traitement des temps La par contre c'est int\u00e9ressant. Dans un monde parfait je pourrais simplement prendre les r\u00e9sultats de l'OCR et les traiter directement. Mais comme nous vivons dans un monde ou la souffrance et la douleur sont les seules choses autoris\u00e9es on ne peut pas. Le probl\u00e8me vient du fait que les temps que l'on peut trouver sur la F1TV sont encod\u00e9s avec des '.' et des ':' qui determinent les limites entre les chiffres qui d\u00e9signent les minutes, les secondes et les milisecondes. Et le soucis avec ces s\u00e9parateurs c'est qu'ils aiment bien mettre le chaos dans la reconnaissance. Quand ils ne sont pas compris comme des autres chiffres ils sont parfois simplement oubli\u00e9s ou pris en double c'est un enfer. Il faut donc trouver un moyen de detecter quand cela arrive. Et je n'ai pas trouv\u00e9 de meilleur moyen que de faire du cas par cas. Cela peut para\u00eetre simple quand on parle par exemple des secteurs. On sasit que on attend deux chiffres avant un '.' et trois chiffres apr\u00e8s. Il est donc facile de voir que si je trouve six chiffres et pas de s\u00e9paration le troisi\u00e8me est le s\u00e9parateur mal compris. Mais l'exemple qui d\u00e9truit vraiment tout c'est les \u00e9carts avec le leader. Autant un temps au tour c'est toujours x:xx.xxx et un temps de secteur c'est xx.xxx. Mais un \u00e9cart avec le leader ca peut \u00eatre 0.345 comme 1:12.345. Ce qui fait que quand je 121345 est-ce que c'est 12.345 ou 1:21.345...? Souvent on peut quand m\u00eame d\u00e9duire mais cela demande de pr\u00e9voir presque tous les cas limites ce qui est assez p\u00e9nible. On pourrait se dire qu'il suffit de voir si la valeur est trop en dehors des normes. Le soucis c'est que il n'est pas impossible que un temps au tour ou un \u00e9cart prenne d'un coup une grosse diff\u00e9rence. Cela arrive m\u00eame assez souvent quand des pilotes sortent de la piste. \"Exemple temps au tour\" \"Exemple temps secteur\" Pour ce qui est du DRS et de la position des pilotes, il n'y a pas vraiment de traitement suppl\u00e9mentaire. Non pas car la detection est parfaite, mais par ce que la detection ne peut pas rater de 200 facons. Le DRS ne peut retourner que TRUE ou FALSE et la position du pilote est entre 1 et 20 compris. Le peu de nuance fait que ce sont des cas de figures qui ne demandent pas un traitement particulier au del\u00e0 de l'OCR","title":"Traitement des donn\u00e9es"},{"location":"index.html#stockage-des-donnees","text":"Dans ce projet le but n'est pas simplement de trouver les donn\u00e9es et les afficher. L'int\u00e9r\u00eat de les r\u00e9cup\u00e8rer est de pouvoir les comparer \u00e0 d'autres donn\u00e9es pr\u00e9c\u00e9dentes. Le vrai soucis de la F1TV c'est justement que l'on ne peut pas facilement voir les \u00e9volutions. On ne peut voir que des \"photos\" de la situation actuelle de la course. Il faut donc garder en m\u00e9moire les diff\u00e9rentes choses qui se sont pass\u00e9es. Techniquement on pourrait stocker ces donn\u00e9es dans de b\u00eates listes C#. Mais le soucis avec ca c'est que m\u00eame si des outils comme LinQ existent, ca n'est pas le plus pratique quand on veut faire des recherches complexes. Il faut aussi voir que si le projet dans sa forme actuelle aurait peut-\u00eatre pu se satisfaire de listes simples, le but est d'ensuite pouvoir construire sur ces bases pour faire des predictions et des insertions de stats beaucoup plus int\u00e9ressantes qui demandent de faire des requ\u00eates complexe rapidement. Je me suis dit que la meilleure methode serait d'avoir une base de donn\u00e9e dans laquelle je peux faire des requ\u00e8tes SQL. Mais commme je n'ai pas besoin de toutes les features de SQl et que je ne veut pas avoir \u00e0 g\u00e8rer un serveur de base de donn\u00e9e et tout ce qui va avec je me suis dit qu'une bonne option serait d'utiliser SQLITE. \"Logo Sqlite\" ; SQLITE est vraiment pratique car cela me permet d'avoir une DB sans avoir de serveur donc pas vraiment complexe ou quoi que ce soit mais qui conserve les aventages de rapidit\u00e9 et d'utilisation de requetes SQl. J'ai cr\u00e9\u00e9 trois tables dans cette base de donn\u00e9e SQLITE que voici :","title":"Stockage des donn\u00e9es"},{"location":"index.html#base-de-donnee","text":"Drivers Colonne Type de Data Description Tag ID INTEGER ID du pilote PRIMARY Name VARCHAR Nom du pilote NOT NULL Pitstops Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui a effectu\u00e9 le Pitstop PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL Stats Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui concern\u00e9 PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL LapTime INTEGER Temps au tour (MS) NOT NULL Sector1 INTEGER Temps du secteur 1 (MS) NOT NULL Sector2 INTEGER Temps du secteur 2 (MS) NOT NULL Sector3 INTEGER Temps du secteur 3 (MS) NOT NULL GapToLeader INTEGER Ecart avec le leader (MS) NOT NULL Position INTEGER Position pilote NOT NULL La table Drivers sert juste \u00e0 stocker les diff\u00e9rents noms de pilote pour qu'ils soient utilis\u00e9s dans le reste de la DB La table Pitstops n'est pas vraiment utilis\u00e9e dans l'\u00e9tat actuel du projet. Mais le but \u00e9tait de la remplir d\u00e8s que le programme d\u00e9tectais un arr\u00eat aux stands. Le but est ensuite de pouvoir construire un classement pond\u00e8r\u00e9 en fonction des arr\u00eats des diff\u00e9rents pilotes et d'afficher la stats tout le temps sur l'affichage principal. Elle n'est pas vraiment utilis\u00e9e car la detection de pitstop n'a pas pu \u00eatre commpl\u00eat\u00e9e. De par la nature des donn\u00e9es r\u00e9cup\u00e8r\u00e9es des pneus et des positions, c'est tr\u00e8s difficile de detecter avec prescision un arr\u00eat aux stands. La table Stats est la plus importante car elle contient toutes les informations concernant les pilotes \u00e0 chaque tour. L'id\u00e9e est qu'elle soit remplie \u00e0 chaque tour. Les infos ne sont pas scens\u00e9e \u00eatre les infos live mais plut\u00f4t juste une photo \u00e0 chaque tour de la situation de chaque pilote pour ensuite pouvoir faire des commparaisons tourspar tours. Des donn\u00e9es comme le GapToLeader peuvent \u00e9voluer pendant le tour mais on s'en fiche. Ce qui compte vraiment c'est le temps au tour et les secteurs ainsi que les pneus.","title":"Base de donn\u00e9e"},{"location":"index.html#quand-remplir-la-base","text":"Dans ce projet il y a deux type d'information. Les informations live qui sont stock\u00e9es dans des listes et les informations long terme qui sont stock\u00e9es dans la DB. A chaque it\u00e9ration de l'OCR, les donn\u00e9es r\u00e9cup\u00e8r\u00e9es sont stock\u00e9es dans une liste de DRIVERDATA. Les DRIVERDATA sont des structures de donn\u00e9es qui contiennent toutes les infos d'un pilote \u00e0 un instant T. Elles peuvent \u00eatre incompl\u00eates et sont juste la pour faire de petits calculs et determiner quand ins\u00e8rer des donn\u00e9es permanentes. Ce qui nous am\u00e8ne au moment int\u00e9ressant. Comment on d\u00e9termine quand il est int\u00e9ressant d'ins\u00e8rer des informations dans la base de donn\u00e9es. Il y a deux cas de figure ou on pourrait vouloir ins\u00e8rer des infos :","title":"Quand remplir la base ?"},{"location":"index.html#quand-un-pilote-a-finit-un-tour","text":"En effet, j'ai estim\u00e9 que les seuls moments ou on veut garder une photo de la situation du pilote c'est quand il passe d'un tour \u00e0 l'autre. Le raisonnement est le suivant : On ne veut pas conserver TOUTES les donn\u00e9es car si on prend une phot toutes les trois secondes, la majorit\u00e9 des informations seront redondantes avec les pr\u00e9c\u00e9dentes. Mais en m\u00eame temps il ne faut pas rater des changements importants de donn\u00e9es. Les seules donn\u00e9es qui changent entre deux passages de l'OCR sont les \u00e9carts entre les pilotes et de temps en temps un nouveau secteur s'affiche. Alors que d'un tour \u00e0 l'autre presque toutes les informations changent. Et on ne perd que les l\u00e9g\u00e8res fluctuations des \u00e9carts entre les pilotes. J'ai donc d\u00e9cid\u00e9 de conserver une photo par tour. Mais c'est bien joli sauf qu'il reste une difficult\u00e9 : Comment savoir qu'un pilote a fait son tour ? Cela peut para\u00eetre simple comme question mais elle est plus difficile qu'il n'y parait. Il faut savoir que en F1 un pilote peut \u00eatre dans son 26\u00e8me tour pendant qu'un autre en est \u00e0 son 24\u00e8me. Chaque pilote a sa propre course et au fur et \u00e0 mesure que les \u00e9carts se creusent il peut y avoir un tour voir plusieurs d'\u00e9cart entre la queue de course et les premiers pilotes. Ensuite il faut savoir qu'il n'est pas marqu\u00e9 sur la f1TV dans quel tour chaque pilote est. Il faut donc le d\u00e9duire en fonction des Data. Voici le code le if qui d\u00e9tecte un nouveau tour if ( DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Sector3 != 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Sector3 == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Position != - 1 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Position != - 1 ) { //Do stuff } DriverDataLogs est une liste de liste d'informations de pilotes. Chaque DriverDataLogs repr\u00e9sente les 20 photos des donn\u00e9es des pilotes. Cela veut dire que DriverDataLogs[3] repr\u00e9sente toutes les infos des pilotes dans le tour 4 et que DriverDataLogs[3][0] repr\u00e9sente toutes les infos du premier pilote dans le tour 3. Si on analyse un peu ce qui est \u00e9crit avec ces informations, on peut voir que je d\u00e9termine qu'un nouveau tour se d\u00e9finis comme une photo ou le troisi\u00e8me secteur a \u00e9t\u00e9 compl\u00eat\u00e9 et ou il ne l'\u00e9tait pas juste avant. Cela fait sens car quand un pilote compl\u00eate son troisi\u00e8me secteur c'est la que son dernier temps au tour se met \u00e0 jour. Le reste des tests est juste la pour \u00e9viter les faux positifs dans le cas ou un des deux DriverDataLogs[x][x] soit corrompu et que donc la valeur n'aie pas de sens. Cela veut dire que dans des conditions tr\u00e8s sp\u00e9cifiques je pourrais potentiellement rater un tour mais il faudrait vraiment que l'OCR me joue un vilain tour.","title":"Quand un pilote a finit un tour"},{"location":"index.html#quand-un-pilote-a-fait-un-arret-aux-stands","text":"Et la on touche le plus difficile. Pourtant un arr\u00eat aau stand ne devrait pas \u00eatre compliqu\u00e9 \u00e0 detecter. C'est quand un pilote change de pneu. Alors il peut changer de pneu en gardant le m\u00eame type de pneu et donc tout repose sur le nombre de tour qu'un pneu fait. Sauf que il faut ajouter \u00e0 cette reflexion qu'un pneu peut \u00eatre chauss\u00e9 sans qu'il soit neuf. Ce qui veut dire que l'on ne peut pas simplement choisir qu'un pilote a chang\u00e9 de pneus quand ses pneus sont \u00e0 1 tour. Il peut tr\u00e8s bien reprendre des pneus de qualif qui peuvent avoir 10 tours dans les pattes. En plus quand le pilote change de pneus il y a un phenomene assez p\u00e9nible qui fait que les deux premiers tours faits avec ne sont pass vraiment d\u00e9chiffrables car ils sont un peu cach\u00e9s derri\u00e8re la lettre qui indique le nouveau pneu chauss\u00e9. Exemple : \"Infographie de pneu qui se chevauche\" Voici le code que j'avais \u00e9crit pour tenter de trouver quand un pilote avait fait un pitstop : if ( data . CurrentTyre . Coumpound != Tyre . Type . Undefined && data . CurrentTyre . NumberOfLaps == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps != 0 ) { //Do stuff } On peut voir que j'essaie de detecter quand le pneu est \u00e0 0 tours (ce qui est le moment ou il y a une lettre \u00e0 la place d'un num\u00e9ro de tour) et que la photo d'avant montrait un pneu normal. On v\u00e9rifie aussi que le pneu a bien \u00e9t\u00e9 detect\u00e9 en verifiant que le pneu n'est pas de type undefined. Le soucis c'est que ce n'est pas rare que l'OCR nous retourne qu'un pneu est vieux de 0 tours et donc il est absolument impossible de faire confiance \u00e0 cette metric. Si on veut utiliser cette methode pour trouver les Pitstop il va falloir avant tout am\u00e9liorer l'OCR sur ce point. Ce soucis mets en lumi\u00e8re un principe assez important de l'informatique \"Ggarbage in, Garbage out\". Si les donn\u00e9es que je recoit ne sont pas g\u00e9niales, le r\u00e9sultat ne sera pas g\u00e9nial non plus. Ce qui est frustrant c'est que la detection des pneus n'est pas si mal mais entre les chiffres qui se chevauchent ce qui nous fait lire 0 alors que c'est juste un un '1' derri\u00e8re un 'H' ou le 1% du temps ou le programme se trompe, on ne peut pour l'instant tout simplement rien faire de mieux.","title":"Quand un pilote a fait un arr\u00eat aux stands"},{"location":"index.html#affichage-des-donnees","text":"Maintenant que l'on a stock\u00e9 toutes ces donn\u00e9es, il faut en faire quelque chose sinon ca ne sert a rien. Afficher les donn\u00e9es est techniquement la partie la plus simple du projet. Il faut prendre les donn\u00e9es qui nous int\u00e9ressent de la base de donn\u00e9es et des r\u00e9sultats de l'OCR et les afficher sur des composants Windows Forms. Il y a deux types d'affichages actuellements mis en place dans le projet sur les trois pr\u00e9vus initialement :","title":"Affichage des donn\u00e9es"},{"location":"index.html#affichage-direct","text":"L'affichage direct est simplement l'affichage du r\u00e9sultat de l'OCR. Par exemple le classement live ainsi que les \u00e9carts entre les pilotes sont affich\u00e9s directement depuis les r\u00e9sultats de l'OCR. Ce ne sont pas forc\u00e9ment des donn\u00e9es prises dans la base de donn\u00e9e. Voici un exemple : for ( int driverCount = 0 ; driverCount < liveData . Count ; driverCount ++) { DriverData driver = liveData [ driverCount ]; lblDriverName . Text = driver . Name ; lblDriverPosition . Text = driver . Position ; lblDriverLapTime . Text = Reader . ConvertMsToTime ( driver . LapTime ); } C'est l'affichage le plus simple et celui qui est le plus soumis \u00e0 des erreurs. En effet, si un pilote est mal detect\u00e9 on le verra directement mal s'afficher dans la Form principale. C'est \u00e9galement l'affichage le moins int\u00e9ressant car il ne cr\u00e9e aucune information, il ne fait que remontrer les infos que l'on peut d\u00e9ja voir dans la F1TV \"Exemple d'affichage live\"","title":"Affichage direct"},{"location":"index.html#affichage-calcule","text":"La encore il y a plusieurs types d'affichages :","title":"Affichage calcul\u00e9"},{"location":"index.html#affichage-hybride","text":"Pour ce qui est des affichages hybrides ce sont des affichages qui vont chercher des informations lives et des informations dans la base de donn\u00e9e. Ils ne font pas de calculs \u00e0 proprement parler mais ils affichent plus d'informations que ce que montre la F1TV. Cela veut dire qu'ils repr\u00e9sentent un d\u00e9but de plusvalue par rapport \u00e0 l'alternative qu'est la page DATA de la F1TV. Ils ne sont pas beaucoup plus durs \u00e0 impl\u00e9menter mais demandent de faire des requ\u00eates \u00e0 la base de donn\u00e9e. Comme exemple d'affichage hybride on a l'affichage des cinq derniers tours d'un pilote. C'est un affichage qui ne demande aucun calcul mais qui permet deja de se rendre compte de si le pilote est enn train de perdre ou gagner du temps ou si il est constant, ce qui n'est pas possible actuellement avec la F1TV \u00e0 moins d'avoir une excellente m\u00e9moire. \"Fen\u00eatre d'informations \u00e0 propos d'un pilote\" Voici un exemmple du type de code necessaire pour afficher ce genre de donn\u00e9es: public List <( int LapTime , int Lap )> GetDriverLaptimes ( string driverName , int numberOfLaptimes ) { int driverId = GetDriverID ( driverName ); List <( int LapTime , int Lap )> lapData = new List <( int LapTime , int Lap )>(); string selectQuery = \"Select LapTime,Lap from Stats WHERE DriverID = @driverID ORDER BY Lap DESC LIMIT @limit\" ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@limit\" , numberOfLaptimes ); SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { int lapTime = reader . GetInt32 ( 0 ); int lap = reader . GetInt32 ( 1 ); lapData . Add (( lapTime , lap )); } } return lapData ; } public void Display (){ List <( int LapTime , int Lap )> lapsInfos = Storage . GetDriverLaptimes ( driverName , 5 ); int id = 0 ; foreach (( int LapTime , int Lap ) lapData in lapsInfos ){ Labels [ id ]. Text = LapTime ; id ++; } } Note: Le code montr\u00e9 ici n'est pas forc\u00e9ment le code utilis\u00e9 dans le projet. D'une certaine facon les fen\u00eatres de bataille et de d\u00e9passements sont aussi des hybrides. \"Exemple fen\u00eatre des batailles\" Ici ce sont les batailles qui sont repr\u00e9sent\u00e9es. Aucune donn\u00e9e n'est calcul\u00e9e, c'est litterallement directement les donn\u00e9es de la F1TV, mais la nuance est qu'on ne montre que les pilotes qui sont en train de se battre et que on leur assigne une couleur selon \u00e0 quel point ils sont proches. On a une plus-value sur la F1TV sans pour autant faire de monstres calculs. Pour info, les pilotes consid\u00e8r\u00e9s comme \u00eatant en train de se battre sont les pilotes \u00e0 moins de trois secondes les uns des autres et les couleurs sont suivantes : Vert : Dans la zone de DRS (Moins d'une seconde) Jaune : Plus d'une seconde Noir : Plus de deux secondes \"Exemple fen\u00eatre des d\u00e9passements\" La c'est l'historique des d\u00e9passements qui est affich\u00e9. On pourrait presque dire que c'est un affichage compl\u00eatement calcul\u00e9 car ce ne sont pas des informations disponibles directement sur la F1TV cependant je dirais que cela reste un hybride car il n'y a aucuns calculs. On regarde juste les diff\u00e9rences entre l'ancienne position d'un pilote et la nouvelle et on affiche les changements.","title":"Affichage Hybride"},{"location":"index.html#affichage-totalement-calcule","text":"L'affichage compl\u00eatement calcul\u00e9 est un type d'affichage qui ne montre aucune information trouv\u00e9e sur la page de la F1TV. C'est le premier affichage \u00e0 traiter l'information qu'il trouve et il retourne des informations nouvelles. La nuance avec les affichages pr\u00e9dictif est qu'il ne cr\u00e9e pas r\u00e9ellement de l'information, il la d\u00e9duit. Le but est de prendre un certain nombre d'informations trouv\u00e9es sur la page de la F1TV et de calculer des choses pour faire ressortir des tendances \u00e0 l'utilisateur. Cependant on reste sur des informations factuelles. Ce sont des infos d\u00e9duites que techniquement unn humain avec une bonne m\u00e9moire et fort en calcul mental pourrait faire. Mais la c'est fait automatiquement pour tous les pilotes et c'est affich\u00e9 de sorte \u00e0 faire ressortir les valeurs sp\u00e9ciales. Comme c'est un peu plus abstrait, je pense qu'un exemple vaut mieux que 1000 mots. \"Exemple de fen\u00eatre d'informations totalement calcul\u00e9es\" Ci dessus on peut voir un bon exemple. C'est une fen\u00eatre qui montre qui sont les pilotes les plus rapides et les moins rapides et qui montre la diff\u00e9rence de temps au tour. Cette information est totalement d\u00e9duite et n'est en aucun cas trouvable sur la F1TV mais elle n'est pas invent\u00e9e. Elle est simplement calcul\u00e9e. La formule est assez simple, je prend les cinq derniers temps au tour de tous les pilotes. Je fais une moyenne qui donne un temps. Et ensuite je trie les pilotes en fonction de ce temps et je n'affiche que les cinq plus rapide et les cinq plus lents. Ensuite il suffit de prendre le temps le plus rapide et faire une petite soustraction pour avoir l'\u00e9cart. C'est une stat assez int\u00e9ressante car elle lisse les diff\u00e9rences d'un tour \u00e0 l'autre et fait ressortir une tendance. On peut voir pour le grand prix de monaco 2023 par exemple, le moment ou les pneus pluie deviennent plus int\u00e9ressants que les pneus secs car on voit que les pilotes les plus rapides sont les pilotes de fond de grille qui ont chauss\u00e9 les pneus pluie en premier tandis que les plus lents sont les pilotes sur pneus secs vieux. Voici un bout de code qui s'occupe de faire les calculs : List <( int avg , string driverName )> averages = new List <( int avg , string driverName )>(); foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { //We want to recover the last 5 lap times List <( int lapTime , int lap )> laps = Storage . GetDriverLaptimes ( driver . Name , 5 ); if ( laps . Count > 0 ) { int avg = 0 ; foreach (( int lapTime , int lap ) lap in laps ) { avg += lap . lapTime ; } avg = avg / laps . Count ; averages . Add (( avg , driver . Name )); } }","title":"Affichage totalement calcul\u00e9"},{"location":"index.html#affichage-predictif","text":"C'est ici que ca devient vraiment dommage, le projet a mannqu\u00e9 de temps pour impl\u00e9menter des affichages pr\u00e9dictifs mais le potentiel est la ! Un affichage pr\u00e9dictif est un affichage qui cr\u00e9e des informations \u00e0 partir des infos qu'il a mais qui fait plus qu'un calcul. Le but est de tenter de deviner quelque chose. Voici des exemples d'affichages pr\u00e9dictifs qui pourraient \u00eatre mis en place averc l'architecture actuelle du projet : Si un pilote a des pneus depuis plus de 20 tours et que son temps au tour est en chute libre depuis cinq tours. Alors ce pilote va peut-\u00eatre devoir s'arr\u00eater. Si un pilote tourne une seconde au tour plus vite que le pilote devant lui et que ce pilote est \u00e0 10 secondes devant, alors il devrait pouvoir le rattraper d'ici dix tours. Si un arr\u00eat au stand est en moyenne de 23 secondes, alors un pilote 3\u00e8me ressortirais potentiellement 7\u00e8me si il s'arr\u00eate maintenant. Tous ces exemples sont des mini algorythmes pr\u00e9dictifs qui pourraient \u00eatre impl\u00e9ment\u00e9s assez facilement dans l'architecture actuelle du projet et pourraient apporter une immense plus-value si ils sont bien param\u00eatr\u00e9s. On peut m\u00eame imaginer que l'algorythme se corrige tout seul si il voit qu'il a eu tort pour que les course suivante il puisse mieux s'en sortir. Les possibilit\u00e9es sont infinies !","title":"Affichage pr\u00e9dictif"},{"location":"index.html#tests","text":"Alors la on arrive \u00e0 la GROSSE erreur de ce projet... Si je ne pouvais changer qu'une seule chose \u00e0 ma facon de faire le projet apr\u00e8s coup c'est ici que je ferai le changement. Les tests sont d'une importance absolument capitale mais si ils sont bien faits, c'est surtout un moyen ultra efficace de v\u00e9rifier que du nouveau code est performant et est beaucoup plus pratique \u00e0 utiliser. Je pense sans rire que j'aurais pu gagner plusieurs jours de travail si j'avais travaill\u00e9 diff\u00e9remment vis-a-vis des tests.","title":"Tests"},{"location":"index.html#comment-ca-cest-passe","text":"D\u00e8s la cr\u00e9ation du planning pr\u00e9visionnel j'ai fait une erreur capitale. J'ai mis les tests en fin de developpement des features... Et je ne leur ai laiss\u00e9 que tr\u00e8s peu de temps tout en les mettant au milieu du chemin critique ce qui les rends particuli\u00e8rement vuln\u00e9rables si une t\u00e2che du chemin critique est retard\u00e9e. En fait dans ce projet je voulais surtout \u00e9viter de faire comme certains projets que l'on a pu avoir pendant notre formation. C'est \u00e0 dire que je ne voulais surtout pas oublier la doc. Alors j'ai agenc\u00e9 le projet pour commencer par les fondations de la doc, puis en incluant les p\u00e9riodes de programmation et entre ces derni\u00e8re ajouter des Tests dans les trous. Le soucis c'est que du coup les projets \u00e9taient un peu le dernier truc dont je devais me soucier ce qui a \u00e9t\u00e9 une tr\u00e8s mauvaise id\u00e9e. Je me suis retrouv\u00e9 \u00e0 devoir mordre sur les jours de tests car les t\u00e2ches de programmation mettaient plus de temps que pr\u00e9vu (qui elles-m\u00eame auraient p\u00fb \u00eatre plus courte avec une bonne utilisation des tests) et je mme suis retrouv\u00e9 \u00e0 passer outre les tests pour avancer sur le reste du projet. J'ai donc du en panique \u00e0 la toute fin du projet construire quelques tests \"unitaires\" dont l'utilit\u00e9 est tr\u00e8s limit\u00e9e car tout le travail a d\u00e9ja \u00e9t\u00e9 fait et que vu la complexit\u00e9 qu'a pris le projet, faire de vrais tests unitaires est devenu un peu trop compliqu\u00e9 pour valoir le coup. Les seuls tests \"unitaires\" (Je l'\u00e9cris entre quotes car ce ne sont pas vraiment des tests unitaires mais plut\u00f4t des tests tout courts car ils ne sont pas sp\u00e9cifiques) qu'il y a dans le projet final sont des tests exclusivement tourn\u00e9s sur l'OCR. Ils sont d\u00e9ja vraiment pratiques car cela me permet de tester d'autres algorythmes d'OCR et voir si les r\u00e9sultats sont meilleurs ou non mais c'est juste un peu trop tard quoi... Les tests unitaires que j'ai impl\u00e9ment\u00e9s sont un peu tous pareils au niveau du fonctionnement : On choisit une image dans une liste d'images pr\u00e9par\u00e9es qui sont scens\u00e9e repr\u00e9senter le type de donn\u00e9es rencontr\u00e9es par l'application en temps normal On lis le nom de l'image que j'ai mis manuellement en indiquant ce qui \u00e9tait marqu\u00e9 sur l'image On fait un coup d'OCR sur l'image et on compare ce r\u00e9sultat avec la valeur que l'on est scens\u00e9 retrouver En pratique on est sur un code de ce style : [TestMethod()] public void SectorOCR_Test () { string directory = @\"./../../TestImages/Sectors/\" ; foreach ( string file in Directory . GetFiles ( directory )) { Bitmap image = ( Bitmap ) Image . FromFile ( file ); DriverSectorWindow sectorsWindow = new DriverSectorWindow ( image , new Rectangle ( 0 , 0 , image . Width , image . Height ), 1 , true ); string [] paths = file . Split ( '/' ); string fileName = paths [ paths . Length - 1 ]; fileName = fileName . Replace ( \".png\" , \"\" ); int timeMS = ( int ) sectorsWindow . DecodePng (); string time = Reader . ConvertMsToTime ( timeMS ); string [] checkDigits = fileName . Split ( '_' ); string [] digitsToCheck = time . Split ( ':' ); if ( time == \"0:00:000\" ) { Assert . AreEqual ( 0 , Convert . ToInt32 ( checkDigits [ 0 ])); } else { //The ConvertMSToTime will always return three chars so we need to make the checkDigits be also three chars while ( checkDigits . Length != 3 ) checkDigits = new [] { \"0\" }. Concat ( checkDigits ). ToArray (); for ( int i = 0 ; i < checkDigits . Length ; i ++) { //We need to convert to int first because sometimes we have \"08\" and \"8\" and in string its not the same but in int it is Assert . AreEqual ( Convert . ToInt32 ( checkDigits [ i ]), Convert . ToInt32 ( digitsToCheck [ i ])); } } } } Tout le code suppl\u00e9mentaire qui ne fait pas partie des \u00e9tapes cit\u00e9es est juste la pour manipuler le format des r\u00e9sultats pour qu'il soit comparable. \"Exemple d'\u00e9chantillons pour les tests\" Ce qui est pratique avec cette approche c'est qu'il est tr\u00e8s facile de rajouter des cas sp\u00e9cifiques et voir comment le programme les g\u00e8re. Si je vois que un certain nombre est souvent mal reconnu je peux faire expr\u00e8s de le mettre dans le dossier et modifier mon code d'OCR jusqu'\u00e0 ce que le test passe. Si j'avais eu plus de temps j'aurais s\u00fbrement pu ajouter de vrais tests unitaires qui testent des fonctions tr\u00e8s pr\u00e9cises. Par exemple verifier que les diff\u00e9rentes Windows sont bien appel\u00e9es et que les zones se cr\u00e9ent correctement ou m\u00eame plus simplement que la lecture du JSON au d\u00e9marrage marche bien. Il faut savoir que m\u00eame si je n'ai pas eu l'occasion d'\u00e9crire beaucoup de tests sous forme de code. Toute la phase de d\u00e9veloppement de l'OCR j'ai pass\u00e9 plus d'une heure par jour \u00e0 analyser les r\u00e9sultats. Je gardais toutes les images des WINDOWS et je notais dans le nom du fichier ce que l'algorythme trouvais et je passais en revue manuellement les centaines de r\u00e9sultats pour isoler ceux qui posaient probl\u00e8me. C'est comme ca que je me suis rendu compte par exemple que, avec cette police, les 4 et les 1 \u00e9taient souvent confondus. Donc m\u00eame si les tests automatis\u00e9s sont clairement insuffisant par rapport \u00e0 ce que j'aurais peut-\u00eatre du faire, j'ai pass\u00e9 \u00e9norm\u00e9ment de temps \u00e0 tester mon application.","title":"Comment ca c'est pass\u00e9"},{"location":"index.html#comment-ca-aurait-du-se-passer","text":"Si je devais refaire ce projet aujourd'hui je pense que j'utiliserais un peu la m\u00eame technique que pour la doc. J'aurais mis les t\u00e2ches de Tests directement au d\u00e9but du projet et j'aurais determin\u00e9 le squelette de l'application par la m\u00eame occasion. Je pense que j'aurais mis trois jours pour \u00e9crire tous les tests dont j'aurais besoin et j'aurais fait une strat\u00e9gie de TDD (Test Driven Developpement) par ce que je pense que ca marcherait vraiment super bien sur ce type de projet. J'aurais pris je pense 5 une dixaine d'images compl\u00eates de la F1TV de plusieurs GP diff\u00e9rents et j'aurais mis toutes les fen\u00eatres d\u00e9coup\u00e9es dans des fichiers avec des tests comme ceux que j'ai fait pour ce projet. Et comme ca je saurai que mon algo est bon uniquement quand il aura r\u00e9ussi \u00e0 passer tous les tests. Cela r\u00e8glerait le soucis que j'ai eu le plus : Me retrouver \u00e0 devoir changer l'OCR 5 fois par ce que \u00e0 chaque fois que je d\u00e9veloppe une nouvelle feature je me rends compte d'une faiblesse mon algorythme... Non seulement j'aurai eu beaucoup plus de facilit\u00e9 \u00e0 avancer sur le projet, mais en plus je pense que cela m'aurait fait gagner \u00e9norm\u00e9ment de temps non seulement car je n'ai plus \u00e0 tester tout \u00e0 la main mais en plus par ce que ca veut dire que quand l'OCR passe les tests je n'ai plus jamais \u00e0 m'en soucier.","title":"Comment ca aurait du se passer"},{"location":"index.html#lecons","text":"Je pense que dans mes futurs projets je mettrai les tests en d\u00e9but de projet plut\u00f4t que \u00e0 la fin et je ferai en sorte qu'ils fassent partie du chemin critique et que je ne puisse pas passer \u00e0 c\u00f4t\u00e9 sous pretexte que \"Je n'ai pas le temps\". Ecrire des tests c'est jamais marrant et c'est encore moins marrant quand ils nous emp\u00eachent d'avancer. Mais je suis convaincu que au final c'est un gain de temps et de s\u00e9r\u00e9nit\u00e9 incontournable.","title":"Lecons"},{"location":"index.html#resume-des-difficultes-techniques","text":"Ici je vais parler tr\u00e8s rapidement des difficult\u00e9es techniques rencontr\u00e9es. Si vous voulez tout savoir \u00e0 propos des difficult\u00e9es vous pouvez aller lire le journal de bord. C'est aussi pour \u00e9viter de me r\u00e9p\u00e8ter par rapport aux explications des diff\u00e9rents points dans l'analyse organique. Je vais pas non plus parler des difficult\u00e9es rencontr\u00e9e avec des choses que je n'ai pas gard\u00e9 dans le programme final donc il est normal que vous vous disiez qu'il n'y a pas eu tant de difficult\u00e9s que ca.","title":"R\u00e9sum\u00e9 des difficult\u00e9s techniques"},{"location":"index.html#browser-headless","text":"Il y avait plusieurs difficult\u00e9es techniques avec cette histoire de Browser Headless. Deja pouvoir lancer un browser headless et le contr\u00f4ler. C'est difficile car il faut trouver la bonne librairie et ensuite il faut trouver le bon exectuable de geckoDriver qui permette de faire fonctionner l'application m\u00eame si l'utilisateur n'a pas Firefox sur sa machine. Ensuite la seconde difficult\u00e9 est celle de ne pas se faire chopper comme un bot par le site de la F1TV. Il faut savoir qu'\u00e0 ce jour je n'ai toujours pas r\u00e9ussi \u00e0 faire croire \u00e0 la page de login de la F1TV que j'\u00e9tais un user normal en utilisant Selnnium mais au moins maintenant je peux acc\u00e8der aux vid\u00e9os tranquillement. Ce soucis de ne pas pouvoir se connecter avec la page de login \u00e0 la plus grosse difficult\u00e9 technique de cette partie du projet : la connexion automatique. Pour me connecter \u00e0 la F1TV avec un browser headless la seule solution que j'ai trouv\u00e9 a \u00e9t\u00e9 d'utiliser des cookies. Et pour que l'utilisateur n'aie pas \u00e0 aller chercher les siens dans son navigateur il a fallut trouver une technique pour aller les chercher directement sans lui demander son avis. Autre difficutl\u00e9, comme on travaille avec un site web que l'on ne contr\u00f4le pas, il faut trouver un moyen de g\u00e8rer les erreurs et de r\u00e9essayer parfois et attendre quand il faut dans les cas ou le chargement est long etc... Ensuite apr\u00e8s tout ca la derni\u00e8re difficult\u00e9 a \u00e9t\u00e9 de pouvoir contr\u00f4ler le firefox Headless assez bien pour qu'il puisse non seulement naviguer les pages mais aussi qu'il puisse cliquer sur des boutons qui ne s'affichent pas tout le temps. (Je ne vais pas mentioner la difficult\u00e9 que ca a \u00e9t\u00e9 de mettre le browser en 4K pour des raison de sant\u00e9 mentale)","title":"Browser Headless"},{"location":"index.html#ocr_2","text":"Les difficult\u00e9es ici sont dans un autre niveau. Chaque type de donn\u00e9e repr\u00e9sentait sa difficult\u00e9 \u00e0 lui tout seul sans compter l'optimisation. Pour commencer on a le texte pour les noms de pilotes. Il a fallu trouver un syst\u00e8me qui puisse reconnaitre le texte et qui puisse comparer le r\u00e9sultat avec les pilotes que l'on connait. Ensuite il a fallu trouver un moyen de detecter la diff\u00e9rence entre les fen\u00eatres de DRS o\u00f9 il est ouvert ou ferm\u00e9. Il fallait \u00e9galement faire attention \u00e0 ne pas faire de faux positifs. Pour les temps par secteurs il a fallu trouver des filtres qui permettent de bien diff\u00e9rencier les '1' et les '4' sans les confondre et il a aussi fallut trouver un moyen de filter l'image pour que dans le cas ou le texte serait en couleur ca fonctionne quand m\u00eame. (Car oui un filtre de nuances de gris ne marche pas super avec des couleurs sombres) Pour les pneus (le plus dur) il a fallut trouver un moyen de trouver sur toute la longeur de la zone la partie int\u00e9ressante. Ensuite il a fallut trouver une technique pour savoir quel type de pneu c'est en fonction de la couleur moyenne et ensuite le plus dur a \u00e9t\u00e9 d'isoler le chiffre du dessin autour car Tesseract aime pas les formes, le tout automatiquement. Pour les temps au tour il a fallut trouver un moyen de ne pas confondre les ponctuations avec des chiffres tout en ne les ratant pas. Et il a fallu trouver un moyen de detecter quand in\u00e9vitablement cela arrive quand m\u00eame. Et la derni\u00e8re difficult\u00e9 (la plus p\u00e9nible) a \u00e9t\u00e9 de detecter les \u00e9carts entre les pilotes. Il a fallut trouver une facon de decoder le texte en temps mais aussi de faire tout un syst\u00e8me qui d\u00e9tecte et r\u00e8gle les cas ou un ':' a \u00e9t\u00e9 oubli\u00e9 ou confondu tout en ne sachant pas si il \u00e9tait scens\u00e9 y en avoir \u00e0 la base car les valeurs peuvent varier entre '1_23.657' et '0.452'.","title":"OCR"},{"location":"index.html#stockage_1","text":"Pour ce qui est du stockage la grande difficult\u00e9 a \u00e9t\u00e9 de savoir quand un pilote avait avait finit un tour car chaque pilote finit son tour \u00e0 un moment diff\u00e9rent. Il a \u00e9galement fallut trouver un moyen de savoir les donn\u00e9es d'un pilote \u00e9taient logiques. Une difficult\u00e9 qui n'a pas \u00e9t\u00e9 compl\u00eatement d\u00e9pass\u00e9e est de savoir quand un pilote a fait un arr\u00eat aux stands car la detection de l'age des pneus est plus que mauvaise. Voila. Ce fut une petite liste non exhaustive de quelques difficult\u00e9s techniques que j'ai rencontr\u00e9 pendant ce projet.","title":"Stockage"},{"location":"index.html#optimisation-du-programme","text":"Ici je vais parler des techniques que j'ai utilis\u00e9 pour r\u00e9duire le temps de traitement de chaques images de 50 secondes \u00e0 un peu moins de 3 sur le processeur de mon laptop. En effet, dans les premi\u00e8res version du projet, traiter l'int\u00e9gralit\u00e9 d'une image pouvait prendre presque une minute. Ce qui est compliqu\u00e9 dans ce projet c'est qu'il y a un certain nombres de choses que je ne contr\u00f4le pas. En utilisant Tesseract, je me retrouve avec des incompressibles. En imaginant que l'OCR sur une image prenne 300ms, m\u00eame si j'avais 180 threads capables de faire cette t\u00e2che en m\u00eame temps, le temps de traitement sera toujours d'au moins 300ms. Cr\u00e9er une instance de Tesseract prend \u00e9galement du temps. Ma mission n'est donc pas d'arriver \u00e0 des temps de quelques dixaines de milisecondes mais plut\u00f4t de rajouter le moins de temps possible pendant le traitement et de tenter de faire le plus du choses possible en paralelle. I","title":"Optimisation du programme"},{"location":"index.html#ethique-du-projet","text":"[A remplir \u00e0 la fin du projet pour parler des questions ethiques du projet (Ex: Utilisation potentiellement abusive de la F1Tv ou L'histoire des cookies)]","title":"Ethique du projet"},{"location":"index.html#utilisation-de-chat-gpt","text":"[A remplir \u00e0 la fin du projet]","title":"Utilisation de Chat GPT"},{"location":"index.html#ameliorations-futures","text":"[A remplir dans les derni\u00e8res semaines du travail de dipl\u00f4me]","title":"Am\u00e9liorations futures"},{"location":"index.html#conclusion","text":"[A remplir la derni\u00e8re semaine du travail de dipl\u00f4me]","title":"Conclusion"},{"location":"index.html#notes-de-code","text":"","title":"Notes de code"},{"location":"index.html#glossaire","text":"","title":"Glossaire"},{"location":"CahierDesCharges.html","text":"Cahier des charges Cahier des charges \"Track Trends\" Travail de dipl\u00f4me Maxime Rohmer 2023 Contexte Je suis le \"Live Ticker\" charg\u00e9 de la Formule 1 pour le 20 minutes. On peut traduire cela comme commentateur de F1, avec tout de m\u00eame l'importante subtilit\u00e9 que je ne commente pas avec la voix, mais avec le clavier. Mes commentaires sont sous la forme de commentaires \u00e9crits live qui s'ajoutent au fur et \u00e0 mesure de l'\u00e9v\u00e8nement. Par exemple : \"Tour 28/54, Hamilton a fini par s'arr\u00eater et chausser des gommes tendres 13 tours apr\u00e8s Verstappen. L'Anglais va voir plus de 15 secondes \u00e0 rattraper, mais les gommes neuves et plus tendres que son rival devraient lui permettre s'il ne se fait pas trop ralentir par le trafic\". En g\u00e9n\u00e9ral avec un peu plus d'infos quand m\u00eame et cela tous les 3-4 tours Voici quelques exemples de pr\u00e9c\u00e9dents commentaires (Conseil : il y a un bouton pour montrer le feed dans l'ordre chronologique) : \"Commentaire Grand Prix de Belgique 2022\" \"Commentaire du Grand Prix de Singapour 2022\" \"Exemple commentaires\" Pendant un Grand Prix, je dois constamment : \u00c9crire ce qu'il se passe dans le grand prix et expliquer les enjeux Chercher r\u00e9guli\u00e8rement des m\u00e9dias \u00e0 inclure pour diversifier mon live (Tweets, Images etc.) Changer le titre et la description du live en fonction de l'\u00e9volution du Grand prix Et accessoirement regarder le grand prix pour y comprendre quelque chose Avec tout \u00e7a, il est tr\u00e8s difficile de garder un \u0153il sur la page DATA de la F1TV qui fournit pourtant des informations pr\u00e9cieuses. Je me retrouve parfois par exemple \u00e0 ne pas parler de d\u00e9passements dans le peloton, car ils ne sont pas retransmis \u00e0 la t\u00e9l\u00e9 alors que c'est une information importante. Autre exemple, occasionnellement le classement ne refl\u00e8te pas les vraies positions des pilotes. Les arr\u00eats aux stands font que du coup des pilotes qui devraient \u00eatre 15\u00e8mes se retrouvent 8\u1d49 puisqu'ils ne sont pas encore arr\u00eat\u00e9s. Cela peut de temps en temps pr\u00eater \u00e0 confusion. Projet Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes. Le but est non seulement de faciliter mon job, mais aussi faire en sorte d'am\u00e9liorer la plus-value de mon travail en me permettant de fournir des commentaires qui ne sont pas disponibles pour le tout venant qui regarde simplement le flux RTS. Exemples: Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand Maintenant afficher diff\u00e9remment les infos, c'est sympa, mais cela serait encore mieux de traiter ces data et de permettre des petites pr\u00e9dictions. Exemples : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents R\u00e9alisation Malheureusement, la Formula 1 Management ne propose aucune API publique qui puisse nous permettre de faire ce projet \"simplement\". La raison la plus probable \u00e9tant qu'Amazon avec son service AWS propose exactement ce genre de services pour le flux t\u00e9l\u00e9vis\u00e9 et il doit y avoir un contrat d'exclusivit\u00e9. Il existe des API \"Pirates\" faites par la communaut\u00e9, le probl\u00e8me est qu'elles ne sont pas forc\u00e9ment des plus pratiques \u00e0 utiliser. Mais comme je poss\u00e8de un abonnement premium ++ \u00e0 la F1TV, j'ai acc\u00e8s pour chaque grand prix \u00e0 un flux vid\u00e9o nomm\u00e9 : DATA F1 CHANNEL Qui ressemble \u00e0 \u00e7a : \"Data channel exemple\" Donc la seule fa\u00e7on que je vois de r\u00e9cup\u00e9rer ces donn\u00e9es est de les prendre directement sur ce feed. M\u00eame si le but final de l'application est de faire pleins de choses super avec les datas, le gros du projet va surtout \u00eatre la r\u00e9cup\u00e9ration des donn\u00e9es et leur stockage. Les donn\u00e9es viennent du flux vid\u00e9o et ainsi dans un premier temps, il va falloir r\u00e9cup\u00e9rer d'une mani\u00e8re ou d'une autre des images qui viennent d'un grand prix en direct ou en rediffusion. Ensuite, dans un second temps, il faut lire les informations directement sur l'image en utilisant une librairie pr\u00e9vue pour (exemple Tesseract) et v\u00e9rifier l'int\u00e9grit\u00e9 de ces derni\u00e8res pour qu'on puisse ensuite les stocker. Dans un troisi\u00e8me temps, il faut stocker toutes ces donn\u00e9es dans une forme qui permette d'aller facilement faire des requ\u00eates de r\u00e9cup\u00e9ration et d\u00e9j\u00e0 pr\u00e9parer des m\u00e9thodes qui permettent de r\u00e9cup\u00e9rer des infos importantes (ex : la moyenne des cinq derniers tours, le temps moyen d'arr\u00eat etc.) pour faciliter la derni\u00e8re \u00e9tape Quand tout cela est fait, on peut ensuite s'amuser un peu avec les Data. La derni\u00e8re \u00e9tape est donc l'affichage. L'id\u00e9e est de cr\u00e9er une Windows Form qui contienne toutes ces informations dans un format beaucoup plus lisible et avec laquelle on pourrait interagir pour permettre de plus facilement commenter les Grands Prix. (exemple plus bas avec un croquis de ce \u00e0 quoi l'application pourrait ressembler) Voici la liste des donn\u00e9es qui pourraient \u00eatre affich\u00e9es (Non contractuel, simplement des id\u00e9es). Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand La moyenne de temps que les pilotes perdent dans les stands La performance moyenne des 5 types de pneus La moyenne de temps de chaque pilote sur le pneu actuel Le nombre de points que chaque pilote gagnerait selon sa position Le classement de la course Voire m\u00eame si c'est possible : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents Pr\u00e9dire les temps au tour de chaque pilote selon l'usure des pneus Voici un exemple d'interface possible pour une page : \"Proto\" Cas d'utilisation *On va consid\u00e9rer que tous les user ont un abonnement F1 TV PRO Un user veut r\u00e9cup\u00e9rer les data : Il ouvre son navigateur et lance la page DATA de la F1 TV Il calibre la capture des data via le programme (pour la premi\u00e8re utilisation). Il confirme que les donn\u00e9es initiales sont bonnes (pour la premi\u00e8re utilisation). Il regarde tranquille son Grand Prix Le programme r\u00e9cup\u00e8re les data : Il r\u00e9cup\u00e8re des images depuis la F1TV Il utilise Tesseract (ou autre) pour en r\u00e9cup\u00e9rer les infos. Il met ces infos dans un Objet Pilote, dans un Objet course avec un attribut tour pour hi\u00e9rarchiser les data Pour ce qui est de l'affichage, l'id\u00e9e est de faire une application C# comme on l'a appris \u00e0 l'\u00e9cole, mais avec assez de style pour qu'elle puisse \u00eatre agr\u00e9able \u00e0 utiliser. Quand le programme affiche les data : Il prend les donn\u00e9es venant directement de la F1TV. Il affiche diff\u00e9remment les donn\u00e9es pour permettre une meilleure lisibilit\u00e9 Il interpr\u00e8te avec des r\u00e8gles plut\u00f4t simples certaines data pour faire des minipr\u00e9dictions ou aider \u00e0 la lecture Il r\u00e9cup\u00e8re des infos d'autres courses pour les comparer et proposer des pr\u00e9dictions plus int\u00e9ressantes Difficult\u00e9s techniques R\u00e9cup\u00e9rer un flux vid\u00e9o plut\u00f4t propre malgr\u00e9 les contres mesures de la F1 TV pour en emp\u00eacher la lecture par un logiciel Si on doit passer par une capture d'\u00e9cran, trouver un moyen de stocker les donn\u00e9es de mani\u00e8re \u00e0 pr\u00e9voir que parfois un tour pourrait avoir plus de donn\u00e9es qu'un autre, que le user peut mettre pause, ou m\u00eame qu\u2019il revienne en arri\u00e8re. D\u00e9velopper des algorithmes pour r\u00e9cup\u00e9rer les donn\u00e9es comme les diff\u00e9rents pneus utilis\u00e9s ou l'activation du DRS ainsi que d\u00e9velopper des moyens de nettoyer les r\u00e9sultats de l'OCR (Par exemple utiliser diff\u00e9rents champs redondants pour comparer les r\u00e9sultats) Stocker les donn\u00e9es sur une base pour les traiter plus tard tout en pr\u00e9voyant un moyen de voir les stats live D\u00e9velopper des algorithmes de pr\u00e9diction qui prennent en compte d'anciennes courses pour tenter de pr\u00e9dire des choses comme les arr\u00eats aux stands par exemple.","title":"Cahier des charges"},{"location":"CahierDesCharges.html#cahier-des-charges","text":"Cahier des charges \"Track Trends\" Travail de dipl\u00f4me Maxime Rohmer 2023","title":"Cahier des charges"},{"location":"CahierDesCharges.html#contexte","text":"Je suis le \"Live Ticker\" charg\u00e9 de la Formule 1 pour le 20 minutes. On peut traduire cela comme commentateur de F1, avec tout de m\u00eame l'importante subtilit\u00e9 que je ne commente pas avec la voix, mais avec le clavier. Mes commentaires sont sous la forme de commentaires \u00e9crits live qui s'ajoutent au fur et \u00e0 mesure de l'\u00e9v\u00e8nement. Par exemple : \"Tour 28/54, Hamilton a fini par s'arr\u00eater et chausser des gommes tendres 13 tours apr\u00e8s Verstappen. L'Anglais va voir plus de 15 secondes \u00e0 rattraper, mais les gommes neuves et plus tendres que son rival devraient lui permettre s'il ne se fait pas trop ralentir par le trafic\". En g\u00e9n\u00e9ral avec un peu plus d'infos quand m\u00eame et cela tous les 3-4 tours Voici quelques exemples de pr\u00e9c\u00e9dents commentaires (Conseil : il y a un bouton pour montrer le feed dans l'ordre chronologique) : \"Commentaire Grand Prix de Belgique 2022\" \"Commentaire du Grand Prix de Singapour 2022\" \"Exemple commentaires\" Pendant un Grand Prix, je dois constamment : \u00c9crire ce qu'il se passe dans le grand prix et expliquer les enjeux Chercher r\u00e9guli\u00e8rement des m\u00e9dias \u00e0 inclure pour diversifier mon live (Tweets, Images etc.) Changer le titre et la description du live en fonction de l'\u00e9volution du Grand prix Et accessoirement regarder le grand prix pour y comprendre quelque chose Avec tout \u00e7a, il est tr\u00e8s difficile de garder un \u0153il sur la page DATA de la F1TV qui fournit pourtant des informations pr\u00e9cieuses. Je me retrouve parfois par exemple \u00e0 ne pas parler de d\u00e9passements dans le peloton, car ils ne sont pas retransmis \u00e0 la t\u00e9l\u00e9 alors que c'est une information importante. Autre exemple, occasionnellement le classement ne refl\u00e8te pas les vraies positions des pilotes. Les arr\u00eats aux stands font que du coup des pilotes qui devraient \u00eatre 15\u00e8mes se retrouvent 8\u1d49 puisqu'ils ne sont pas encore arr\u00eat\u00e9s. Cela peut de temps en temps pr\u00eater \u00e0 confusion.","title":"Contexte"},{"location":"CahierDesCharges.html#projet","text":"Un outil de style compagnon sous forme d'application C# Windows Form qui r\u00e9cup\u00e8re en temps r\u00e9el les informations de la course et affiche les informations les plus importantes. Le but est non seulement de faciliter mon job, mais aussi faire en sorte d'am\u00e9liorer la plus-value de mon travail en me permettant de fournir des commentaires qui ne sont pas disponibles pour le tout venant qui regarde simplement le flux RTS. Exemples: Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand Maintenant afficher diff\u00e9remment les infos, c'est sympa, mais cela serait encore mieux de traiter ces data et de permettre des petites pr\u00e9dictions. Exemples : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents","title":"Projet"},{"location":"CahierDesCharges.html#realisation","text":"Malheureusement, la Formula 1 Management ne propose aucune API publique qui puisse nous permettre de faire ce projet \"simplement\". La raison la plus probable \u00e9tant qu'Amazon avec son service AWS propose exactement ce genre de services pour le flux t\u00e9l\u00e9vis\u00e9 et il doit y avoir un contrat d'exclusivit\u00e9. Il existe des API \"Pirates\" faites par la communaut\u00e9, le probl\u00e8me est qu'elles ne sont pas forc\u00e9ment des plus pratiques \u00e0 utiliser. Mais comme je poss\u00e8de un abonnement premium ++ \u00e0 la F1TV, j'ai acc\u00e8s pour chaque grand prix \u00e0 un flux vid\u00e9o nomm\u00e9 : DATA F1 CHANNEL Qui ressemble \u00e0 \u00e7a : \"Data channel exemple\" Donc la seule fa\u00e7on que je vois de r\u00e9cup\u00e9rer ces donn\u00e9es est de les prendre directement sur ce feed. M\u00eame si le but final de l'application est de faire pleins de choses super avec les datas, le gros du projet va surtout \u00eatre la r\u00e9cup\u00e9ration des donn\u00e9es et leur stockage. Les donn\u00e9es viennent du flux vid\u00e9o et ainsi dans un premier temps, il va falloir r\u00e9cup\u00e9rer d'une mani\u00e8re ou d'une autre des images qui viennent d'un grand prix en direct ou en rediffusion. Ensuite, dans un second temps, il faut lire les informations directement sur l'image en utilisant une librairie pr\u00e9vue pour (exemple Tesseract) et v\u00e9rifier l'int\u00e9grit\u00e9 de ces derni\u00e8res pour qu'on puisse ensuite les stocker. Dans un troisi\u00e8me temps, il faut stocker toutes ces donn\u00e9es dans une forme qui permette d'aller facilement faire des requ\u00eates de r\u00e9cup\u00e9ration et d\u00e9j\u00e0 pr\u00e9parer des m\u00e9thodes qui permettent de r\u00e9cup\u00e9rer des infos importantes (ex : la moyenne des cinq derniers tours, le temps moyen d'arr\u00eat etc.) pour faciliter la derni\u00e8re \u00e9tape Quand tout cela est fait, on peut ensuite s'amuser un peu avec les Data. La derni\u00e8re \u00e9tape est donc l'affichage. L'id\u00e9e est de cr\u00e9er une Windows Form qui contienne toutes ces informations dans un format beaucoup plus lisible et avec laquelle on pourrait interagir pour permettre de plus facilement commenter les Grands Prix. (exemple plus bas avec un croquis de ce \u00e0 quoi l'application pourrait ressembler) Voici la liste des donn\u00e9es qui pourraient \u00eatre affich\u00e9es (Non contractuel, simplement des id\u00e9es). Les pilotes qui sont proches (moins de 1-2 secondes qui sont donc en train de se battre). Les pilotes qui am\u00e9liorent leur temps au tour et ceux qui perdent le plus de temps Le classement pond\u00e9r\u00e9 tenant compte des futurs arr\u00eats au stand La moyenne de temps que les pilotes perdent dans les stands La performance moyenne des 5 types de pneus La moyenne de temps de chaque pilote sur le pneu actuel Le nombre de points que chaque pilote gagnerait selon sa position Le classement de la course Voire m\u00eame si c'est possible : Pr\u00e9dire les arr\u00eats aux stands en prenant en compte les baisses de performances des pneus Pr\u00e9dire le pneu que le pilote va chausser s'il rentre aux stands dans le prochain tour Pr\u00e9dire dans combien de tour tel pilote va rattraper tel autre pilote Pr\u00e9dire combien de temps le pilote va perdre dans les stands en fonctions des arr\u00eats pr\u00e9c\u00e9dents Pr\u00e9dire les temps au tour de chaque pilote selon l'usure des pneus Voici un exemple d'interface possible pour une page : \"Proto\"","title":"R\u00e9alisation"},{"location":"CahierDesCharges.html#cas-dutilisation","text":"*On va consid\u00e9rer que tous les user ont un abonnement F1 TV PRO Un user veut r\u00e9cup\u00e9rer les data : Il ouvre son navigateur et lance la page DATA de la F1 TV Il calibre la capture des data via le programme (pour la premi\u00e8re utilisation). Il confirme que les donn\u00e9es initiales sont bonnes (pour la premi\u00e8re utilisation). Il regarde tranquille son Grand Prix Le programme r\u00e9cup\u00e8re les data : Il r\u00e9cup\u00e8re des images depuis la F1TV Il utilise Tesseract (ou autre) pour en r\u00e9cup\u00e9rer les infos. Il met ces infos dans un Objet Pilote, dans un Objet course avec un attribut tour pour hi\u00e9rarchiser les data Pour ce qui est de l'affichage, l'id\u00e9e est de faire une application C# comme on l'a appris \u00e0 l'\u00e9cole, mais avec assez de style pour qu'elle puisse \u00eatre agr\u00e9able \u00e0 utiliser. Quand le programme affiche les data : Il prend les donn\u00e9es venant directement de la F1TV. Il affiche diff\u00e9remment les donn\u00e9es pour permettre une meilleure lisibilit\u00e9 Il interpr\u00e8te avec des r\u00e8gles plut\u00f4t simples certaines data pour faire des minipr\u00e9dictions ou aider \u00e0 la lecture Il r\u00e9cup\u00e8re des infos d'autres courses pour les comparer et proposer des pr\u00e9dictions plus int\u00e9ressantes","title":"Cas d'utilisation"},{"location":"CahierDesCharges.html#difficultes-techniques","text":"R\u00e9cup\u00e9rer un flux vid\u00e9o plut\u00f4t propre malgr\u00e9 les contres mesures de la F1 TV pour en emp\u00eacher la lecture par un logiciel Si on doit passer par une capture d'\u00e9cran, trouver un moyen de stocker les donn\u00e9es de mani\u00e8re \u00e0 pr\u00e9voir que parfois un tour pourrait avoir plus de donn\u00e9es qu'un autre, que le user peut mettre pause, ou m\u00eame qu\u2019il revienne en arri\u00e8re. D\u00e9velopper des algorithmes pour r\u00e9cup\u00e9rer les donn\u00e9es comme les diff\u00e9rents pneus utilis\u00e9s ou l'activation du DRS ainsi que d\u00e9velopper des moyens de nettoyer les r\u00e9sultats de l'OCR (Par exemple utiliser diff\u00e9rents champs redondants pour comparer les r\u00e9sultats) Stocker les donn\u00e9es sur une base pour les traiter plus tard tout en pr\u00e9voyant un moyen de voir les stats live D\u00e9velopper des algorithmes de pr\u00e9diction qui prennent en compte d'anciennes courses pour tenter de pr\u00e9dire des choses comme les arr\u00eats aux stands par exemple.","title":"Difficult\u00e9s techniques"},{"location":"ManuelUtilisateur.html","text":"Manuel utilisateur Installation Pour Installer le projet, il faut aller sur le repo qui contient le projet et suivre les \u00e9tapes indiqu\u00e9es dans le ReadMe. Les \u00e9tapes ne sont pas r\u00e9p\u00e9t\u00e9es ici pour \u00e9viter de la redondance et pour \u00e9viter de devoir changer cette documentation si les versions ou les d\u00e9pendances \u00e0 installer changent. A quoi sert l'app ? Track Trends est une application Windows qui sert d'outil pour des abonn\u00e9s de la F1TV qui veulent exploiter le potentiel de la page DATA de la F1TV. L'application est faite pour un seul cas d'utilisation : R\u00e9cup\u00e9rer les infos d'un Grand Prix en cours ou d'une rediffusion et les afficher de mani\u00e8re plus int\u00e9ressante (en mettant en valeur des infos, en construisant un historique et en en interpr\u00e9tant d'autres). L'application est faite pour que l'utilisateur ait le moins de choses \u00e0 faire pour que tout fonctionne. Cela ne veut pas dire que l'utilisateur n'a rien \u00e0 faire et le but de ce document est d'expliquer les diff\u00e9rentes \u00e9tapes n\u00e9cessaires \u00e0 l'utilisation de l'application. Utilisation \"Simple\" Le but de cette section est de vous permettre d'apprendre \u00e0 lancer, stopper et modifier les variables de fonctionnement de l'application. Vous serez donc en mesure d'utiliser le programme correctement. Vous devez commencer par lancer le programme. \"Page de lancement\" Au lancement de l'app, vous devriez avoir une page comme ci-dessus. Il y a beaucoup d'infos, mais pour le moment ce qui nous int\u00e9resse, c'est le menu en haut \u00e0 gauche. \"Contr\u00f4les\" Si c'est la premi\u00e8re fois que vous utilisez l'application, il est possible qu'il n'y ait qu'un seul preset au lieu des quatre ci-dessous voire 0 si vous n'avez pas mis le preset inclus dans l'installation. Si vous n'avez aucun preset, passez directement \u00e0 l'\u00e9tape calibration avant de revenir ici. Comme vous pouvez le voir, en plus des presets s\u00e9lectionnables, il y a quatre boutons (dont deux gris\u00e9s) et une boite de texte avec un lien. Le lien est la chose la plus simple. C'est le lien du Grand Prix que vous voulez analyser. R\u00e9cup\u00e9rer le lien vers le flux Pour remplir la boite de texte pr\u00e9cit\u00e9e, il nous faut un lien et ce lien, on le trouve sur la F1TV . Quand vous vous rendez sur la F1TV la page principale devrait ressembler \u00e0 quelque chose comme \u00e7a (\u00e9videmment le contenu ne sera pas le m\u00eame) : \"Page principale de la F1TV\" Si vous ne vous \u00eates pas d\u00e9j\u00e0 connect\u00e9, connectez-vous et ensuite, allez sur la page du Grand Prix qui vous int\u00e9resse. Pour un Grand Prix en direct, normalement, il y a un endroit o\u00f9 vous pouvez cliquer pour acc\u00e9der au flux directement, et si vous voulez utiliser un Grand Prix en diff\u00e9r\u00e9, vous pouvez aller dans \"202x Season\" ou x est l'ann\u00e9e en cours, en l'occurrence 2023. Et l\u00e0, vous pourrez s\u00e9lectionner un Grand Prix. Dans tous les cas, quand vous avez s\u00e9lectionn\u00e9 votre Grand Prix, vous devriez vous retrouver sur une page de ce style : \"Page d'un Grand Prix sur la F1TV\" Et ici si vous \u00eates sur un Grand Prix en direct, vous pouvez directement copier l'URL de la page et si c'est un Grand Prix en diff\u00e9r\u00e9, vous pouvez directement naviguer avec la barre de progression vid\u00e9o du lecteur de la F1TV, Je conseille de la placer juste apr\u00e8s le d\u00e9part. Vous pouvez prendre le lien avant ou apr\u00e8s avoir chang\u00e9 le timecode de la vid\u00e9o, cela ne change rien, le lien ne contient pas votre progression dans la vid\u00e9o. Ensuite, vous pourrez juste mettre le lien que vous avez r\u00e9cup\u00e9r\u00e9 dans la boite de texte que l'on a vu pr\u00e9c\u00e9demment. Il faut simplement s'assurer que le lien contient bien le terme ?action=play \u00e0 la fin. Boutons Vous n'avez acc\u00e8s qu'\u00e0 deux boutons au lancement de l'application. Le premier nomm\u00e9 'Config' et le second 'Launch' Le bouton 'Config' permet d'ouvrir la page de calibration (voir section Calibration). Le bouton Launch permet de lancer le programme. Le texte peut changer (Par exemple en 'Retry' si le lancement a rat\u00e9) mais son utilit\u00e9 reste la m\u00eame : Lancer le navigateur virtuel qui sera requis pour traiter les donn\u00e9es. Si vous cliquez sur Launch tous les boutons devraient \u00eatre gris\u00e9s, c'est normal. Pendant le lancement du navigateur, l'application ne peut pas \u00eatre utilis\u00e9e pour \u00e9viter des conflits. Il faut juste attendre. Vous aurez \u00e9galement des fen\u00eatres d'invite de commande qui vont s'ouvrir et se fermer, c'est tout \u00e0 fait normal et il ne faut pas interagir avec tant que tout ne s'est pas stabilis\u00e9. Vous devriez voir enfin une fen\u00eatre comme celle ci : \"Page suspecte (Pas de panique, elle ne l'est pas)\" Il ne faut pas fermer cette fen\u00eatre. C'est la seule chose qui nous relie au navigateur virtuel qu'utilise l'application. Il ne faut pas la fermer, par contre, vous pouvez la r\u00e9duire et la laisser en background, c'est d'ailleurs ce que je vous recommande de faire. Peu apr\u00e8s l'ouverture de cette fen\u00eatre, vous devriez avoir acc\u00e8s \u00e0 trois boutons. Bouton 'Config' qui fait la m\u00eame chose qu'avant Bouton 'Re Launch' qui remplace le bouton 'Launch' qui permet de relancer le processus dans le cas ou vous auriez envie de changer de lien ou de preset. Bouton 'Start' lance le processus de r\u00e9cup\u00e9ration de donn\u00e9es. Si vous cliquez sur ce dernier, vous lancerez le programme. Cela peut prendre quelque secondes \u00e0 s'actualiser, mais tr\u00e8s vite vous devriez vous trouver devant une page comme celle-ci : \"D\u00e9but du programme\" Vous n'aurez alors qu'un seul bouton disponible : le bouton 'Stop'. Vous pouvez arr\u00eater le programme quand vous le voulez. ATTENTION : Avant de fermer le programme, merci de stopper d'abord le processus. Si vous stoppez le processus, vous devriez vous retrouver dans la m\u00eame situation que juste apr\u00e8s avoir lanc\u00e9 le navigateur virtuel : \"Arr\u00eat du programme\" Vous pouvez voir en dessous la derni\u00e8re image que le programme a d\u00e9cod\u00e9e et vous avez de nouveau acc\u00e8s aux trois boutons expliqu\u00e9s pr\u00e9c\u00e9demment. Quand l'application a \u00e9t\u00e9 lanc\u00e9e, vous pouvez aussi cliquer sur les donn\u00e9es affich\u00e9es, mais ces comportements sont expliqu\u00e9s dans la section \"Comprendre les donn\u00e9es\" Voil\u00e0 ! Vous savez comment lancer, stopper et modifier les variables de fonctionnement de l'application. Maintenant, vous pouvez passer directement \u00e0 la section \"Comprendre les donn\u00e9es\" si vous voulez apprendre comment utiliser ce que propose le programme ou passer \u00e0 la section \"Calibration\" si vous voulez apprendre \u00e0 configurer l'application et cr\u00e9er des Presets. Calibration Ici, vous apprendrez \u00e0 configurer l'application pour cr\u00e9er vos propres presets et surtout pourquoi vous auriez besoin de le faire et \u00e0 quoi servent ces fameux \"Preset\". Vous serez en mesure d'adapter le fonctionnement de l'application, qu'elle soit conforme aux diff\u00e9rents changements d'interface et de pilotes pr\u00e9sents. Pourquoi calibrer l'application et cr\u00e9er un Preset ? Le programme que vous allez utiliser utilise de l'OCR (Optical Character Recognition). Cela veut dire que le programme va aller regarder chaque image de la F1TV et convertir ce qu'il y a marqu\u00e9 dessus en donn\u00e9es que l'on peut r\u00e9cup\u00e9rer automatiquement. Sauf que pour y arriver, le programme a besoin de savoir o\u00f9 se trouve le texte important et surtout quel type de donn\u00e9e, il est cens\u00e9 trouver \u00e0 tel ou tel endroit. Pour \u00eatre plus pr\u00e9cis, il a \u00e9galement besoin de savoir quels pilotes peuvent se trouver dans la course actuelle. Et pour qu'il sache tout cela, il y a des fichiers de configuration nomm\u00e9s \"Presets\" qui doivent contenir toutes ces informations. Et pour les cr\u00e9er, il existe la page de calibration qui va demander \u00e0 un humain de lui fournir les infos qu'il ne peut pas trouver par lui-m\u00eame. Normalement, il devrait y avoir un Preset fournis par l'application quand vous la t\u00e9l\u00e9chargez depuis le repo mais vous pouvez avoir besoin de faire votre propre \"Preset\" dans deux cas : Quand les pilotes pr\u00e9sents ne sont pas les m\u00eames (Ex : Si un pilote doit \u00eatre remplac\u00e9 ou si de nouveaux pilotes sont arriv\u00e9s ou bien que d'autres aient pris leur retraite) Quand vous voulez utiliser des Grand Prix fait d'une autre ann\u00e9e que celle pour laquelle le \"Preset\" original a \u00e9t\u00e9 pr\u00e9vu. (L'ann\u00e9e devrait \u00eatre mentionn\u00e9e dans le nom du preset) Il est d\u00e9conseill\u00e9 d'utiliser ce projet pour des Grand Prix couru avant 2022, car l'interface de la page Data de la F1TV peut avoir trop chang\u00e9, mais vous pouvez toujours essayer pour voir en faisant votre propre Preset pour des ann\u00e9es comme 2021 ou 2020. Comment cr\u00e9er son Preset Pour cr\u00e9er son Preset, il faut utiliser la page Settings ou Config de l'application. Pour y acc\u00e9der, il faut simplement cliquer sur le bouton \"Config\" de la page principale et vous serez accueilli par une page qui devrait ressembler \u00e0 celle ci dessous : \"Page de config vide\" La seule diff\u00e9rence est que vous aurez s\u00fbrement moins de Presets dans la liste des Presets voir, vous pouvez n'en avoir aucuns. Comme vous pouvez le voir, vous n'avez pas \u00e9norm\u00e9ment d'options disponibles quand vous lancez simplement l'application. Vous n'avez acc\u00e8s qu'aux boutons \"Start the browser\" et \"Add\",\"Remove\". On verra \u00e0 quoi servent ces deux derni\u00e8res plus tard, mais dans un premier temps, on va se pencher sur le bouton Start. Vous pouvez voir qu'en plus de ce bouton, vous pouvez aussi rentrer du texte dans la boite de texte \"Grand Prix URL\" ce qui n'est pas un hasard. Le but, c'est de mettre le lien vers un Grand Prix pour pouvoir avoir une image de test. Pour voir comment r\u00e9cup\u00e9rer cet URL, voir la section (Utilisation \"simple\" \u2192 \"R\u00e9cup\u00e9rer le lien vers le flux\") Quand l'URL a \u00e9t\u00e9 plac\u00e9e au bon endroit, on peut cliquer sur le bouton \"Start\" et attendre. Si vous n'avez pas encore lu la partie \"Utilisation \"simple\"\", vous allez voir des invites de commandes s'ouvrir et se fermer et c'est tout \u00e0 fait normal. Il faut attendre d'avoir une invite de commande qui reste ouverte et qui ressemble \u00e0 celle ci dessous avant de faire quoi que ce soit. Ensuite, vous pourrez simplement r\u00e9duire cette fen\u00eatre et retourner sur la page de configuration. \"Invite de commande suspecte, mais normale\" Ensuite, si vous attendez un peu (le processus peut prendre jusqu'\u00e0 plusieurs dizaines de secondes), vous aurez soit une erreur, soit vous vous retrouverez avec une page qui ressemble \u00e0 \u00e7a : \"Page de config amorc\u00e9e\" Et l\u00e0 on voit que toutes les options ont \u00e9t\u00e9 d\u00e9bloqu\u00e9es. Avant de se pencher sur les nouvelles options, on va rester sur le fonctionnement g\u00e9n\u00e9ral. Le bouton \"Get a newer image\" permet d'avoir une image plus r\u00e9cente de la F1TV. C'est utile par exemple, car comme on le voit sur l'exemple, l'interface de la F1TV n'a pas encore eu le temps de disparaitre. Mais cela peut aussi \u00eatre utile plus tard dans le cas o\u00f9 vous voudriez que certaines infos s'affichent. Le bouton \"Reset Emulator\", lui, permet, comme son nom l'indique, de relancer le navigateur virtuel que l'on a lanc\u00e9 avec le bouton \"Start the browser\". Cela peut \u00eatre utile dans le cas ou l'image ne soit pas l'image que l'on attendait ou si on veut tenter le coup avec un autre URL. Maintenant, on peut passer \u00e0 la cr\u00e9ation des zones et des windows Cr\u00e9ation des Zones et des Windows Sans trop rentrer dans les d\u00e9tails, l'application a besoin de connaitre la localisation de certains \u00e9l\u00e9ments. Elle a besoin de savoir : O\u00f9 se trouve la zone g\u00e9n\u00e9rale des infos pilotes O\u00f9 se trouve chaque pilote O\u00f9 se trouvent les informations pour chacuns de ces pilotes Le programme de calibration est fait pour que vous n'ayez besoin de donner que les informations qu'il ne peut pas deviner. Il y a deux \u00e9tapes : La premi\u00e8re \u00e9tape est de donner les dimensions de la zone principale d'informations. Pour ce faire, il faut dans un premier temps cliquer sur le bouton \"Create the main zone\" qui devrait afficher le texte suivant en dessous apr\u00e8s avoir cliqu\u00e9 : \"Texte indiquant le nombre de points qu'il reste \u00e0 ajouter\" Ensuite, il va falloir cliquer directement sur l'image pour indiquer le coin en haut \u00e0 gauche et le point en bas \u00e0 droite de la zone rectangulaire qui contient les informations. Vous pouvez voir en bleu ci-dessous les coins du rectangle et en rouge l'endroit o\u00f9 il faut cliquer. \"Infographie expliquant o\u00f9 placer les points de la zone principale\" Il faut faire attention \u00e0 bien prendre tous les pilotes MAIS il faut \u00e9galement faire attention \u00e0 ne pas prendre le texte alentours. \"Texte qui ne doit pas \u00eatre dans la zone s\u00e9lectionn\u00e9e\" Ci dessus, on peut voir du texte barr\u00e9 en violet. Il ne faut surtout pas que la zone vienne inclure ces bouts de texte ou toute la calibration pourrait rater. Ensuite, si vous avez bien fait votre travail, au deuxi\u00e8me clic sur la page, vous aurez quelques secondes de flottement et ensuite, vous devriez avoir les contours que vous avez dessin\u00e9s affich\u00e9s en jaune avec pleins de plus petites zones \u00e0 l'int\u00e9rieur comme ci-dessous : \"Zone principale avec les zones de pilotes automatiquement calcul\u00e9es\" Le programme a non seulement pris en compte la zone, mais il a aussi d\u00e9tect\u00e9 automatiquement o\u00f9 se trouvaient les zones de chaque pilote. Si vous n'avez pas un r\u00e9sultat comme celui-l\u00e0 et/ou que les zones ne sont pas bien align\u00e9es sur les pilotes sur l'image, je vous conseille de r\u00e9essayer de cr\u00e9er la zone principale. La seconde \u00e9tape est de montrer o\u00f9 sont les fen\u00eatres d'infos au programme. Vous aurez peut-\u00eatre remarqu\u00e9 qu'en dessous de l'image principale, quand l'affichage jaune a \u00e9t\u00e9 appliqu\u00e9, une image est apparue. Elle devrait ressembler \u00e0 quelque chose dans ce style : \"Image d'une zone de pilote\" C'est une zone de pilote de l'image que l'on voit au-dessus et c'est ici que l'on va indiquer les zones int\u00e9ressantes. Pour ce faire, il faut cliquer sur le bouton \"Create Windows\" et ce message devrait s'afficher un peu en dessous : \"Texte indiquant le nombre de windows \u00e0 ajouter\" Cela nous indique le nombre de fen\u00eatres qu'il nous reste \u00e0 s\u00e9lectionner. La technique est la m\u00eame que pour la grande zone sauf que l\u00e0, il faut le faire neuf fois. Et il faut absolument le faire dans l'ordre de gauche \u00e0 droite. Le but est de tout s\u00e9lectionner et d'arriver \u00e0 ce r\u00e9sultat : \"Exemple de fen\u00eatres d\u00e9coup\u00e9es\" Dans l'ordre, de gauche \u00e0 droite, on veut r\u00e9cup\u00e9rer : La position du pilote Son \u00e9cart avec le leader (en l'occurrence comme c'est le leader que l'on voit, on doit s\u00e9lectionner la fen\u00eatre ou il est marqu\u00e9 \"LEADER\") Son dernier temps au tour La fen\u00eatre DRS L'\u00e9tat de ses pneus Son nom Son temps au secteur 1 Son temps au secteur 2 Son temps au secteur 3 Ajout du nom des pilotes La derni\u00e8re info qui manque \u00e0 notre programme est la liste des pilotes pr\u00e9sents. On peut interagir avec cette liste ici : \"Menu d'interaction avec la liste de pilotes\" Dans la boite de texte, on peut \u00e9crire le nom d'un pilote qui peut \u00eatre trouv\u00e9 sur l'image, on peut l'ajouter \u00e0 la liste et si on a fait une erreur, on peut le retirer. Et c'est \u00e0 peu pr\u00e8s tout. Il ne reste maintenant plus qu'\u00e0 mettre tous les noms. TIP : Il peut \u00eatre int\u00e9ressant d'ajouter le nom des pilotes de r\u00e9serve pour \u00e9viter de venir changer son preset si un pilote n'est pas pr\u00e9sent pour cause de maladie ou de blessure. Il faut simplement faire attention de ne pas non plus mettre trop de noms pour \u00e9viter que le programme puisse confondre. Et voil\u00e0 ! On a toutes les infos n\u00e9cessaires. La page de configuration devrait ressembler \u00e0 \u00e7a : \"Image de la page de config apr\u00e8s avoir ajout\u00e9 toutes les infos\" Il ne reste plus qu'\u00e0 le sauvegarder. Sauvegarder le nouveau Preset Pour sauvegarder le preset, on peut facilement lui donner un nom dans la zone de texte sous les trois boutons de contr\u00f4le des Presets et cliquer sur Save current Preset. Et voil\u00e0, vous savez d\u00e9sormais comment cr\u00e9er vos propres presets et \u00e0 quoi ils servent. Vous pouvez donc adapter le fonctionnement du projet pour qu'il soit conforme aux changements de pilotes et d'interface avec les ann\u00e9es. Vous pouvez ainsi utiliser l'application normalement en s\u00e9lectionnant votre nouveau preset \u00e0 chaque fois. Load un Preset existant Le loading est un peu sp\u00e9cial. Il faut d\u00e9j\u00e0 avoir lanc\u00e9 le navigateur virtuel pour activer les boutons. Ensuite, il suffit de s\u00e9lectionner un preset et de cliquer sur \"Load the Preset\" et attendre un petit peu. L'affichage sera un peu bizarre, mais c'est normal, il ne faut pas s'inqui\u00e9ter si la zone de pilote affich\u00e9e en dessous est correcte. \"Exemple de ce \u00e0 quoi peut ressembler un loading et l'affichage bizarre que \u00e7a implique\" \u00c0 partir de l\u00e0, il est facile de faire son propre preset en changeant juste les noms des pilotes par exemple. Comprendre les donn\u00e9es Ici, vous allez apprendre \u00e0 utiliser l'application et ses donn\u00e9es en comprenant \u00e0 quoi elles servent et comment elles sont affich\u00e9es. \"Image de l'application en cours de fonctionnement depuis quelques minutes\" Il y a 5 types de donn\u00e9es : Overtakes Cette fen\u00eatre est loin d'\u00eatre compl\u00e8tement op\u00e9rationnelle, mais elle permet de voir l'historique des d\u00e9passements et des changements de position. Il faut scroller pour voir les plus r\u00e9cents. Je dirais que pour le moment, c'est la moins int\u00e9ressante et elle ne fonctionne pas toujours super. Last Five Laps \"Image de la fen\u00eatre des cinq derniers tours\" En total contraste avec la fen\u00eatre Overtakes, ici, on a peut-\u00eatre la fen\u00eatre la plus int\u00e9ressante de toutes. On peut voir les pilotes actuellement les plus rapides et plus lents sur le circuit. Le calcul est fait sur la moyenne des cinq derniers tours de chaque pilote. Cela permet de se faire une id\u00e9e de la situation des pilotes. Cela peut servir par exemple \u00e0 d\u00e9tecter quand un pneu est plus rapide que les autres quand on voit des pilotes dans le milieu ou bas de tableau appara\u00eetre dans le plus rapide. Il est par exemple int\u00e9ressant de voir la diff\u00e9rence de vitesse entre les pneus secs et pluie sur un circuit qui commence \u00e0 s\u00e9cher. On peut progressivement voir les pilotes en pneus secs devenir de plus en plus rapides alors que ce sont des pilotes beaucoup moins rapide en temps normal. On peut cliquer sur n'importe lequel de ces pilotes pour voir ses infos appara\u00eetre dans la fen\u00eatre Driver Infos pour voir les cinq derniers tours par exemple ou les pneus qu'il est en train de chausser. Battles \"Fen\u00eatre des batailles\" Cette fen\u00eatre est \u00e9galement assez int\u00e9ressante, car elle permet de voir les pilotes qui sont en train de se battre. Il est estim\u00e9 qu'un pilote qui se bat est un pilote qui est \u00e0 trois secondes ou moins du pilote devant lui. Ne sont affich\u00e9es que les batailles de quatre pilotes maximums dans l'ordre du classement. Si un pilote est entre 2 et 3 secondes de son adversaire, l'\u00e9cart est en blanc. Entre 1 et 2 secondes, il est \u00e9crit en jaune. Dans la zone du DRS (Une seconde ou moins) il est \u00e9crit en vert. On peut aussi cliquer sur le nom d'un pilote pour afficher ses infos dans la fen\u00eatre des infos pilote. Cette fen\u00eatre permet de mieux comprendre qui sont les pilotes qu'il faut garder \u00e0 l'\u0153il \u00e0 la TV ou simplement qui sont les pilotes qui sont tr\u00e8s proches et qui pourraient se mettre la pression pour les arr\u00eats aux stands, car jamais un pilote ne reste \u00e0 moins de trois secondes d'un autre si \u00e7a n'est pas pour tenter quelque chose au niveau strat\u00e9gique. Driver infos \"Fen\u00eatre des infos pilote\" Ici, on peut voir toutes les infos lives d'un pilote. Rien de fou \u00e0 dire sur la partie de gauche, par contre la partie de droite est un peu plus int\u00e9ressante, car elle contient un historique de ses cinq derniers tours (dans la photo, il n'y en a qu'un seul, mais au fur et \u00e0 mesure de la course cela se remplit). On peut non seulement voir les cinq derniers temps au tour, mais on peut aussi cliquer sur chacun d'eux pour voir les secteurs associ\u00e9s. \"Exemple d'affichage des secteurs d'un temps au tour\" ; Live Ranking \"Fen\u00eatre du classement en direct\" Ceci est la fen\u00eatre la plus simple. C'est tout b\u00eatement le classement actuel avec les \u00e9carts avec le leader. Note : On peut \u00e9galement cliquer sur les diff\u00e9rents pilotes pour en afficher les infos dans la fen\u00eatre infos pilote. Erreurs Il est tr\u00e8s probable que si vous utilisez beaucoup cette application, vous allez rencontrer des erreurs. Ici, vous pourrez apprendre ce qu'elles veulent dire et ce que vous pouvez faire pour y rem\u00e9dier. Il n'existe pas un tr\u00e8s grand nombre d'erreurs, mais voici les principales Erreur 100 (Souvent au premier d\u00e9marrage) Cette erreur signale un probl\u00e8me avec la r\u00e9cup\u00e9ration de cookies. Cela peut \u00eatre caus\u00e9 par une mauvaise installation de python ou si vous ne vous \u00eates pas connect\u00e9s r\u00e9cemment \u00e0 la F1TV depuis Chrome ou que vous n'avez tout simplement pas install\u00e9 Chrome sur votre machine. Erreur 101 (Moins r\u00e9current qu'\u00e0 une \u00e9poque) Cette erreur veut dire qu'il y a d\u00e9j\u00e0 une instance de navigateur ouverte. Pour r\u00e9gler cette erreur, regarder dans votre barre des t\u00e2ches les invites de commande ouvertes et fermez celui qui correspond \u00e0 un ancien navigateur. (Si c'est d\u00e9j\u00e0 fait alors en derniers recours, vous pouvez chercher dans le gestionnaire des t\u00e2ches et chercher \"GeckoDriver.exe\") Erreur 102 Cela peut \u00eatre une erreur qui arrive, car vous n'avez pas donn\u00e9 un URL valide pour la F1TV ou par ce que vous ne vous \u00eates pas connect\u00e9 r\u00e9cemment \u00e0 la F1TV depuis chrome (Si vous veniez de le faire alors, attendez un peu et r\u00e9essayez). Parfois cela peut prendre un peu de temps \u00e0 s'actualiser). Erreur 103 L'URL est invalide Erreur 104 L'URL est invalide Erreur 105 Cette erreur indique que soit vous avez donn\u00e9 un URL qui ne correspond \u00e0 aucun Grand Prix, soit que la vid\u00e9o a mis trop de temps \u00e0 charger. Vous pouvez essayer de vous brancher en Ethernet ou simplement r\u00e9essayer si vous \u00eates s\u00fbr de votre URL. Erreur 106 M\u00eame chose que pour la 105","title":"Manuel utilisateur"},{"location":"ManuelUtilisateur.html#manuel-utilisateur","text":"","title":"Manuel utilisateur"},{"location":"ManuelUtilisateur.html#installation","text":"Pour Installer le projet, il faut aller sur le repo qui contient le projet et suivre les \u00e9tapes indiqu\u00e9es dans le ReadMe. Les \u00e9tapes ne sont pas r\u00e9p\u00e9t\u00e9es ici pour \u00e9viter de la redondance et pour \u00e9viter de devoir changer cette documentation si les versions ou les d\u00e9pendances \u00e0 installer changent.","title":"Installation"},{"location":"ManuelUtilisateur.html#a-quoi-sert-lapp","text":"Track Trends est une application Windows qui sert d'outil pour des abonn\u00e9s de la F1TV qui veulent exploiter le potentiel de la page DATA de la F1TV. L'application est faite pour un seul cas d'utilisation : R\u00e9cup\u00e9rer les infos d'un Grand Prix en cours ou d'une rediffusion et les afficher de mani\u00e8re plus int\u00e9ressante (en mettant en valeur des infos, en construisant un historique et en en interpr\u00e9tant d'autres). L'application est faite pour que l'utilisateur ait le moins de choses \u00e0 faire pour que tout fonctionne. Cela ne veut pas dire que l'utilisateur n'a rien \u00e0 faire et le but de ce document est d'expliquer les diff\u00e9rentes \u00e9tapes n\u00e9cessaires \u00e0 l'utilisation de l'application.","title":"A quoi sert l'app ?"},{"location":"ManuelUtilisateur.html#utilisation-simple","text":"Le but de cette section est de vous permettre d'apprendre \u00e0 lancer, stopper et modifier les variables de fonctionnement de l'application. Vous serez donc en mesure d'utiliser le programme correctement. Vous devez commencer par lancer le programme. \"Page de lancement\" Au lancement de l'app, vous devriez avoir une page comme ci-dessus. Il y a beaucoup d'infos, mais pour le moment ce qui nous int\u00e9resse, c'est le menu en haut \u00e0 gauche. \"Contr\u00f4les\" Si c'est la premi\u00e8re fois que vous utilisez l'application, il est possible qu'il n'y ait qu'un seul preset au lieu des quatre ci-dessous voire 0 si vous n'avez pas mis le preset inclus dans l'installation. Si vous n'avez aucun preset, passez directement \u00e0 l'\u00e9tape calibration avant de revenir ici. Comme vous pouvez le voir, en plus des presets s\u00e9lectionnables, il y a quatre boutons (dont deux gris\u00e9s) et une boite de texte avec un lien. Le lien est la chose la plus simple. C'est le lien du Grand Prix que vous voulez analyser.","title":"Utilisation \"Simple\""},{"location":"ManuelUtilisateur.html#recuperer-le-lien-vers-le-flux","text":"Pour remplir la boite de texte pr\u00e9cit\u00e9e, il nous faut un lien et ce lien, on le trouve sur la F1TV . Quand vous vous rendez sur la F1TV la page principale devrait ressembler \u00e0 quelque chose comme \u00e7a (\u00e9videmment le contenu ne sera pas le m\u00eame) : \"Page principale de la F1TV\" Si vous ne vous \u00eates pas d\u00e9j\u00e0 connect\u00e9, connectez-vous et ensuite, allez sur la page du Grand Prix qui vous int\u00e9resse. Pour un Grand Prix en direct, normalement, il y a un endroit o\u00f9 vous pouvez cliquer pour acc\u00e9der au flux directement, et si vous voulez utiliser un Grand Prix en diff\u00e9r\u00e9, vous pouvez aller dans \"202x Season\" ou x est l'ann\u00e9e en cours, en l'occurrence 2023. Et l\u00e0, vous pourrez s\u00e9lectionner un Grand Prix. Dans tous les cas, quand vous avez s\u00e9lectionn\u00e9 votre Grand Prix, vous devriez vous retrouver sur une page de ce style : \"Page d'un Grand Prix sur la F1TV\" Et ici si vous \u00eates sur un Grand Prix en direct, vous pouvez directement copier l'URL de la page et si c'est un Grand Prix en diff\u00e9r\u00e9, vous pouvez directement naviguer avec la barre de progression vid\u00e9o du lecteur de la F1TV, Je conseille de la placer juste apr\u00e8s le d\u00e9part. Vous pouvez prendre le lien avant ou apr\u00e8s avoir chang\u00e9 le timecode de la vid\u00e9o, cela ne change rien, le lien ne contient pas votre progression dans la vid\u00e9o. Ensuite, vous pourrez juste mettre le lien que vous avez r\u00e9cup\u00e9r\u00e9 dans la boite de texte que l'on a vu pr\u00e9c\u00e9demment. Il faut simplement s'assurer que le lien contient bien le terme ?action=play \u00e0 la fin.","title":"R\u00e9cup\u00e9rer le lien vers le flux"},{"location":"ManuelUtilisateur.html#boutons","text":"Vous n'avez acc\u00e8s qu'\u00e0 deux boutons au lancement de l'application. Le premier nomm\u00e9 'Config' et le second 'Launch' Le bouton 'Config' permet d'ouvrir la page de calibration (voir section Calibration). Le bouton Launch permet de lancer le programme. Le texte peut changer (Par exemple en 'Retry' si le lancement a rat\u00e9) mais son utilit\u00e9 reste la m\u00eame : Lancer le navigateur virtuel qui sera requis pour traiter les donn\u00e9es. Si vous cliquez sur Launch tous les boutons devraient \u00eatre gris\u00e9s, c'est normal. Pendant le lancement du navigateur, l'application ne peut pas \u00eatre utilis\u00e9e pour \u00e9viter des conflits. Il faut juste attendre. Vous aurez \u00e9galement des fen\u00eatres d'invite de commande qui vont s'ouvrir et se fermer, c'est tout \u00e0 fait normal et il ne faut pas interagir avec tant que tout ne s'est pas stabilis\u00e9. Vous devriez voir enfin une fen\u00eatre comme celle ci : \"Page suspecte (Pas de panique, elle ne l'est pas)\" Il ne faut pas fermer cette fen\u00eatre. C'est la seule chose qui nous relie au navigateur virtuel qu'utilise l'application. Il ne faut pas la fermer, par contre, vous pouvez la r\u00e9duire et la laisser en background, c'est d'ailleurs ce que je vous recommande de faire. Peu apr\u00e8s l'ouverture de cette fen\u00eatre, vous devriez avoir acc\u00e8s \u00e0 trois boutons. Bouton 'Config' qui fait la m\u00eame chose qu'avant Bouton 'Re Launch' qui remplace le bouton 'Launch' qui permet de relancer le processus dans le cas ou vous auriez envie de changer de lien ou de preset. Bouton 'Start' lance le processus de r\u00e9cup\u00e9ration de donn\u00e9es. Si vous cliquez sur ce dernier, vous lancerez le programme. Cela peut prendre quelque secondes \u00e0 s'actualiser, mais tr\u00e8s vite vous devriez vous trouver devant une page comme celle-ci : \"D\u00e9but du programme\" Vous n'aurez alors qu'un seul bouton disponible : le bouton 'Stop'. Vous pouvez arr\u00eater le programme quand vous le voulez. ATTENTION : Avant de fermer le programme, merci de stopper d'abord le processus. Si vous stoppez le processus, vous devriez vous retrouver dans la m\u00eame situation que juste apr\u00e8s avoir lanc\u00e9 le navigateur virtuel : \"Arr\u00eat du programme\" Vous pouvez voir en dessous la derni\u00e8re image que le programme a d\u00e9cod\u00e9e et vous avez de nouveau acc\u00e8s aux trois boutons expliqu\u00e9s pr\u00e9c\u00e9demment. Quand l'application a \u00e9t\u00e9 lanc\u00e9e, vous pouvez aussi cliquer sur les donn\u00e9es affich\u00e9es, mais ces comportements sont expliqu\u00e9s dans la section \"Comprendre les donn\u00e9es\" Voil\u00e0 ! Vous savez comment lancer, stopper et modifier les variables de fonctionnement de l'application. Maintenant, vous pouvez passer directement \u00e0 la section \"Comprendre les donn\u00e9es\" si vous voulez apprendre comment utiliser ce que propose le programme ou passer \u00e0 la section \"Calibration\" si vous voulez apprendre \u00e0 configurer l'application et cr\u00e9er des Presets.","title":"Boutons"},{"location":"ManuelUtilisateur.html#calibration","text":"Ici, vous apprendrez \u00e0 configurer l'application pour cr\u00e9er vos propres presets et surtout pourquoi vous auriez besoin de le faire et \u00e0 quoi servent ces fameux \"Preset\". Vous serez en mesure d'adapter le fonctionnement de l'application, qu'elle soit conforme aux diff\u00e9rents changements d'interface et de pilotes pr\u00e9sents.","title":"Calibration"},{"location":"ManuelUtilisateur.html#pourquoi-calibrer-lapplication-et-creer-un-preset","text":"Le programme que vous allez utiliser utilise de l'OCR (Optical Character Recognition). Cela veut dire que le programme va aller regarder chaque image de la F1TV et convertir ce qu'il y a marqu\u00e9 dessus en donn\u00e9es que l'on peut r\u00e9cup\u00e9rer automatiquement. Sauf que pour y arriver, le programme a besoin de savoir o\u00f9 se trouve le texte important et surtout quel type de donn\u00e9e, il est cens\u00e9 trouver \u00e0 tel ou tel endroit. Pour \u00eatre plus pr\u00e9cis, il a \u00e9galement besoin de savoir quels pilotes peuvent se trouver dans la course actuelle. Et pour qu'il sache tout cela, il y a des fichiers de configuration nomm\u00e9s \"Presets\" qui doivent contenir toutes ces informations. Et pour les cr\u00e9er, il existe la page de calibration qui va demander \u00e0 un humain de lui fournir les infos qu'il ne peut pas trouver par lui-m\u00eame. Normalement, il devrait y avoir un Preset fournis par l'application quand vous la t\u00e9l\u00e9chargez depuis le repo mais vous pouvez avoir besoin de faire votre propre \"Preset\" dans deux cas : Quand les pilotes pr\u00e9sents ne sont pas les m\u00eames (Ex : Si un pilote doit \u00eatre remplac\u00e9 ou si de nouveaux pilotes sont arriv\u00e9s ou bien que d'autres aient pris leur retraite) Quand vous voulez utiliser des Grand Prix fait d'une autre ann\u00e9e que celle pour laquelle le \"Preset\" original a \u00e9t\u00e9 pr\u00e9vu. (L'ann\u00e9e devrait \u00eatre mentionn\u00e9e dans le nom du preset) Il est d\u00e9conseill\u00e9 d'utiliser ce projet pour des Grand Prix couru avant 2022, car l'interface de la page Data de la F1TV peut avoir trop chang\u00e9, mais vous pouvez toujours essayer pour voir en faisant votre propre Preset pour des ann\u00e9es comme 2021 ou 2020.","title":"Pourquoi calibrer l'application et cr\u00e9er un Preset ?"},{"location":"ManuelUtilisateur.html#comment-creer-son-preset","text":"Pour cr\u00e9er son Preset, il faut utiliser la page Settings ou Config de l'application. Pour y acc\u00e9der, il faut simplement cliquer sur le bouton \"Config\" de la page principale et vous serez accueilli par une page qui devrait ressembler \u00e0 celle ci dessous : \"Page de config vide\" La seule diff\u00e9rence est que vous aurez s\u00fbrement moins de Presets dans la liste des Presets voir, vous pouvez n'en avoir aucuns. Comme vous pouvez le voir, vous n'avez pas \u00e9norm\u00e9ment d'options disponibles quand vous lancez simplement l'application. Vous n'avez acc\u00e8s qu'aux boutons \"Start the browser\" et \"Add\",\"Remove\". On verra \u00e0 quoi servent ces deux derni\u00e8res plus tard, mais dans un premier temps, on va se pencher sur le bouton Start. Vous pouvez voir qu'en plus de ce bouton, vous pouvez aussi rentrer du texte dans la boite de texte \"Grand Prix URL\" ce qui n'est pas un hasard. Le but, c'est de mettre le lien vers un Grand Prix pour pouvoir avoir une image de test. Pour voir comment r\u00e9cup\u00e9rer cet URL, voir la section (Utilisation \"simple\" \u2192 \"R\u00e9cup\u00e9rer le lien vers le flux\") Quand l'URL a \u00e9t\u00e9 plac\u00e9e au bon endroit, on peut cliquer sur le bouton \"Start\" et attendre. Si vous n'avez pas encore lu la partie \"Utilisation \"simple\"\", vous allez voir des invites de commandes s'ouvrir et se fermer et c'est tout \u00e0 fait normal. Il faut attendre d'avoir une invite de commande qui reste ouverte et qui ressemble \u00e0 celle ci dessous avant de faire quoi que ce soit. Ensuite, vous pourrez simplement r\u00e9duire cette fen\u00eatre et retourner sur la page de configuration. \"Invite de commande suspecte, mais normale\" Ensuite, si vous attendez un peu (le processus peut prendre jusqu'\u00e0 plusieurs dizaines de secondes), vous aurez soit une erreur, soit vous vous retrouverez avec une page qui ressemble \u00e0 \u00e7a : \"Page de config amorc\u00e9e\" Et l\u00e0 on voit que toutes les options ont \u00e9t\u00e9 d\u00e9bloqu\u00e9es. Avant de se pencher sur les nouvelles options, on va rester sur le fonctionnement g\u00e9n\u00e9ral. Le bouton \"Get a newer image\" permet d'avoir une image plus r\u00e9cente de la F1TV. C'est utile par exemple, car comme on le voit sur l'exemple, l'interface de la F1TV n'a pas encore eu le temps de disparaitre. Mais cela peut aussi \u00eatre utile plus tard dans le cas o\u00f9 vous voudriez que certaines infos s'affichent. Le bouton \"Reset Emulator\", lui, permet, comme son nom l'indique, de relancer le navigateur virtuel que l'on a lanc\u00e9 avec le bouton \"Start the browser\". Cela peut \u00eatre utile dans le cas ou l'image ne soit pas l'image que l'on attendait ou si on veut tenter le coup avec un autre URL. Maintenant, on peut passer \u00e0 la cr\u00e9ation des zones et des windows","title":"Comment cr\u00e9er son Preset"},{"location":"ManuelUtilisateur.html#creation-des-zones-et-des-windows","text":"Sans trop rentrer dans les d\u00e9tails, l'application a besoin de connaitre la localisation de certains \u00e9l\u00e9ments. Elle a besoin de savoir : O\u00f9 se trouve la zone g\u00e9n\u00e9rale des infos pilotes O\u00f9 se trouve chaque pilote O\u00f9 se trouvent les informations pour chacuns de ces pilotes Le programme de calibration est fait pour que vous n'ayez besoin de donner que les informations qu'il ne peut pas deviner. Il y a deux \u00e9tapes : La premi\u00e8re \u00e9tape est de donner les dimensions de la zone principale d'informations. Pour ce faire, il faut dans un premier temps cliquer sur le bouton \"Create the main zone\" qui devrait afficher le texte suivant en dessous apr\u00e8s avoir cliqu\u00e9 : \"Texte indiquant le nombre de points qu'il reste \u00e0 ajouter\" Ensuite, il va falloir cliquer directement sur l'image pour indiquer le coin en haut \u00e0 gauche et le point en bas \u00e0 droite de la zone rectangulaire qui contient les informations. Vous pouvez voir en bleu ci-dessous les coins du rectangle et en rouge l'endroit o\u00f9 il faut cliquer. \"Infographie expliquant o\u00f9 placer les points de la zone principale\" Il faut faire attention \u00e0 bien prendre tous les pilotes MAIS il faut \u00e9galement faire attention \u00e0 ne pas prendre le texte alentours. \"Texte qui ne doit pas \u00eatre dans la zone s\u00e9lectionn\u00e9e\" Ci dessus, on peut voir du texte barr\u00e9 en violet. Il ne faut surtout pas que la zone vienne inclure ces bouts de texte ou toute la calibration pourrait rater. Ensuite, si vous avez bien fait votre travail, au deuxi\u00e8me clic sur la page, vous aurez quelques secondes de flottement et ensuite, vous devriez avoir les contours que vous avez dessin\u00e9s affich\u00e9s en jaune avec pleins de plus petites zones \u00e0 l'int\u00e9rieur comme ci-dessous : \"Zone principale avec les zones de pilotes automatiquement calcul\u00e9es\" Le programme a non seulement pris en compte la zone, mais il a aussi d\u00e9tect\u00e9 automatiquement o\u00f9 se trouvaient les zones de chaque pilote. Si vous n'avez pas un r\u00e9sultat comme celui-l\u00e0 et/ou que les zones ne sont pas bien align\u00e9es sur les pilotes sur l'image, je vous conseille de r\u00e9essayer de cr\u00e9er la zone principale. La seconde \u00e9tape est de montrer o\u00f9 sont les fen\u00eatres d'infos au programme. Vous aurez peut-\u00eatre remarqu\u00e9 qu'en dessous de l'image principale, quand l'affichage jaune a \u00e9t\u00e9 appliqu\u00e9, une image est apparue. Elle devrait ressembler \u00e0 quelque chose dans ce style : \"Image d'une zone de pilote\" C'est une zone de pilote de l'image que l'on voit au-dessus et c'est ici que l'on va indiquer les zones int\u00e9ressantes. Pour ce faire, il faut cliquer sur le bouton \"Create Windows\" et ce message devrait s'afficher un peu en dessous : \"Texte indiquant le nombre de windows \u00e0 ajouter\" Cela nous indique le nombre de fen\u00eatres qu'il nous reste \u00e0 s\u00e9lectionner. La technique est la m\u00eame que pour la grande zone sauf que l\u00e0, il faut le faire neuf fois. Et il faut absolument le faire dans l'ordre de gauche \u00e0 droite. Le but est de tout s\u00e9lectionner et d'arriver \u00e0 ce r\u00e9sultat : \"Exemple de fen\u00eatres d\u00e9coup\u00e9es\" Dans l'ordre, de gauche \u00e0 droite, on veut r\u00e9cup\u00e9rer : La position du pilote Son \u00e9cart avec le leader (en l'occurrence comme c'est le leader que l'on voit, on doit s\u00e9lectionner la fen\u00eatre ou il est marqu\u00e9 \"LEADER\") Son dernier temps au tour La fen\u00eatre DRS L'\u00e9tat de ses pneus Son nom Son temps au secteur 1 Son temps au secteur 2 Son temps au secteur 3","title":"Cr\u00e9ation des Zones et des Windows"},{"location":"ManuelUtilisateur.html#ajout-du-nom-des-pilotes","text":"La derni\u00e8re info qui manque \u00e0 notre programme est la liste des pilotes pr\u00e9sents. On peut interagir avec cette liste ici : \"Menu d'interaction avec la liste de pilotes\" Dans la boite de texte, on peut \u00e9crire le nom d'un pilote qui peut \u00eatre trouv\u00e9 sur l'image, on peut l'ajouter \u00e0 la liste et si on a fait une erreur, on peut le retirer. Et c'est \u00e0 peu pr\u00e8s tout. Il ne reste maintenant plus qu'\u00e0 mettre tous les noms. TIP : Il peut \u00eatre int\u00e9ressant d'ajouter le nom des pilotes de r\u00e9serve pour \u00e9viter de venir changer son preset si un pilote n'est pas pr\u00e9sent pour cause de maladie ou de blessure. Il faut simplement faire attention de ne pas non plus mettre trop de noms pour \u00e9viter que le programme puisse confondre. Et voil\u00e0 ! On a toutes les infos n\u00e9cessaires. La page de configuration devrait ressembler \u00e0 \u00e7a : \"Image de la page de config apr\u00e8s avoir ajout\u00e9 toutes les infos\" Il ne reste plus qu'\u00e0 le sauvegarder.","title":"Ajout du nom des pilotes"},{"location":"ManuelUtilisateur.html#sauvegarder-le-nouveau-preset","text":"Pour sauvegarder le preset, on peut facilement lui donner un nom dans la zone de texte sous les trois boutons de contr\u00f4le des Presets et cliquer sur Save current Preset. Et voil\u00e0, vous savez d\u00e9sormais comment cr\u00e9er vos propres presets et \u00e0 quoi ils servent. Vous pouvez donc adapter le fonctionnement du projet pour qu'il soit conforme aux changements de pilotes et d'interface avec les ann\u00e9es. Vous pouvez ainsi utiliser l'application normalement en s\u00e9lectionnant votre nouveau preset \u00e0 chaque fois.","title":"Sauvegarder le nouveau Preset"},{"location":"ManuelUtilisateur.html#load-un-preset-existant","text":"Le loading est un peu sp\u00e9cial. Il faut d\u00e9j\u00e0 avoir lanc\u00e9 le navigateur virtuel pour activer les boutons. Ensuite, il suffit de s\u00e9lectionner un preset et de cliquer sur \"Load the Preset\" et attendre un petit peu. L'affichage sera un peu bizarre, mais c'est normal, il ne faut pas s'inqui\u00e9ter si la zone de pilote affich\u00e9e en dessous est correcte. \"Exemple de ce \u00e0 quoi peut ressembler un loading et l'affichage bizarre que \u00e7a implique\" \u00c0 partir de l\u00e0, il est facile de faire son propre preset en changeant juste les noms des pilotes par exemple.","title":"Load un Preset existant"},{"location":"ManuelUtilisateur.html#comprendre-les-donnees","text":"Ici, vous allez apprendre \u00e0 utiliser l'application et ses donn\u00e9es en comprenant \u00e0 quoi elles servent et comment elles sont affich\u00e9es. \"Image de l'application en cours de fonctionnement depuis quelques minutes\" Il y a 5 types de donn\u00e9es :","title":"Comprendre les donn\u00e9es"},{"location":"ManuelUtilisateur.html#overtakes","text":"Cette fen\u00eatre est loin d'\u00eatre compl\u00e8tement op\u00e9rationnelle, mais elle permet de voir l'historique des d\u00e9passements et des changements de position. Il faut scroller pour voir les plus r\u00e9cents. Je dirais que pour le moment, c'est la moins int\u00e9ressante et elle ne fonctionne pas toujours super.","title":"Overtakes"},{"location":"ManuelUtilisateur.html#last-five-laps","text":"\"Image de la fen\u00eatre des cinq derniers tours\" En total contraste avec la fen\u00eatre Overtakes, ici, on a peut-\u00eatre la fen\u00eatre la plus int\u00e9ressante de toutes. On peut voir les pilotes actuellement les plus rapides et plus lents sur le circuit. Le calcul est fait sur la moyenne des cinq derniers tours de chaque pilote. Cela permet de se faire une id\u00e9e de la situation des pilotes. Cela peut servir par exemple \u00e0 d\u00e9tecter quand un pneu est plus rapide que les autres quand on voit des pilotes dans le milieu ou bas de tableau appara\u00eetre dans le plus rapide. Il est par exemple int\u00e9ressant de voir la diff\u00e9rence de vitesse entre les pneus secs et pluie sur un circuit qui commence \u00e0 s\u00e9cher. On peut progressivement voir les pilotes en pneus secs devenir de plus en plus rapides alors que ce sont des pilotes beaucoup moins rapide en temps normal. On peut cliquer sur n'importe lequel de ces pilotes pour voir ses infos appara\u00eetre dans la fen\u00eatre Driver Infos pour voir les cinq derniers tours par exemple ou les pneus qu'il est en train de chausser.","title":"Last Five Laps"},{"location":"ManuelUtilisateur.html#battles","text":"\"Fen\u00eatre des batailles\" Cette fen\u00eatre est \u00e9galement assez int\u00e9ressante, car elle permet de voir les pilotes qui sont en train de se battre. Il est estim\u00e9 qu'un pilote qui se bat est un pilote qui est \u00e0 trois secondes ou moins du pilote devant lui. Ne sont affich\u00e9es que les batailles de quatre pilotes maximums dans l'ordre du classement. Si un pilote est entre 2 et 3 secondes de son adversaire, l'\u00e9cart est en blanc. Entre 1 et 2 secondes, il est \u00e9crit en jaune. Dans la zone du DRS (Une seconde ou moins) il est \u00e9crit en vert. On peut aussi cliquer sur le nom d'un pilote pour afficher ses infos dans la fen\u00eatre des infos pilote. Cette fen\u00eatre permet de mieux comprendre qui sont les pilotes qu'il faut garder \u00e0 l'\u0153il \u00e0 la TV ou simplement qui sont les pilotes qui sont tr\u00e8s proches et qui pourraient se mettre la pression pour les arr\u00eats aux stands, car jamais un pilote ne reste \u00e0 moins de trois secondes d'un autre si \u00e7a n'est pas pour tenter quelque chose au niveau strat\u00e9gique.","title":"Battles"},{"location":"ManuelUtilisateur.html#driver-infos","text":"\"Fen\u00eatre des infos pilote\" Ici, on peut voir toutes les infos lives d'un pilote. Rien de fou \u00e0 dire sur la partie de gauche, par contre la partie de droite est un peu plus int\u00e9ressante, car elle contient un historique de ses cinq derniers tours (dans la photo, il n'y en a qu'un seul, mais au fur et \u00e0 mesure de la course cela se remplit). On peut non seulement voir les cinq derniers temps au tour, mais on peut aussi cliquer sur chacun d'eux pour voir les secteurs associ\u00e9s. \"Exemple d'affichage des secteurs d'un temps au tour\" ;","title":"Driver infos"},{"location":"ManuelUtilisateur.html#live-ranking","text":"\"Fen\u00eatre du classement en direct\" Ceci est la fen\u00eatre la plus simple. C'est tout b\u00eatement le classement actuel avec les \u00e9carts avec le leader. Note : On peut \u00e9galement cliquer sur les diff\u00e9rents pilotes pour en afficher les infos dans la fen\u00eatre infos pilote.","title":"Live Ranking"},{"location":"ManuelUtilisateur.html#erreurs","text":"Il est tr\u00e8s probable que si vous utilisez beaucoup cette application, vous allez rencontrer des erreurs. Ici, vous pourrez apprendre ce qu'elles veulent dire et ce que vous pouvez faire pour y rem\u00e9dier. Il n'existe pas un tr\u00e8s grand nombre d'erreurs, mais voici les principales Erreur 100 (Souvent au premier d\u00e9marrage) Cette erreur signale un probl\u00e8me avec la r\u00e9cup\u00e9ration de cookies. Cela peut \u00eatre caus\u00e9 par une mauvaise installation de python ou si vous ne vous \u00eates pas connect\u00e9s r\u00e9cemment \u00e0 la F1TV depuis Chrome ou que vous n'avez tout simplement pas install\u00e9 Chrome sur votre machine. Erreur 101 (Moins r\u00e9current qu'\u00e0 une \u00e9poque) Cette erreur veut dire qu'il y a d\u00e9j\u00e0 une instance de navigateur ouverte. Pour r\u00e9gler cette erreur, regarder dans votre barre des t\u00e2ches les invites de commande ouvertes et fermez celui qui correspond \u00e0 un ancien navigateur. (Si c'est d\u00e9j\u00e0 fait alors en derniers recours, vous pouvez chercher dans le gestionnaire des t\u00e2ches et chercher \"GeckoDriver.exe\") Erreur 102 Cela peut \u00eatre une erreur qui arrive, car vous n'avez pas donn\u00e9 un URL valide pour la F1TV ou par ce que vous ne vous \u00eates pas connect\u00e9 r\u00e9cemment \u00e0 la F1TV depuis chrome (Si vous veniez de le faire alors, attendez un peu et r\u00e9essayez). Parfois cela peut prendre un peu de temps \u00e0 s'actualiser). Erreur 103 L'URL est invalide Erreur 104 L'URL est invalide Erreur 105 Cette erreur indique que soit vous avez donn\u00e9 un URL qui ne correspond \u00e0 aucun Grand Prix, soit que la vid\u00e9o a mis trop de temps \u00e0 charger. Vous pouvez essayer de vous brancher en Ethernet ou simplement r\u00e9essayer si vous \u00eates s\u00fbr de votre URL. Erreur 106 M\u00eame chose que pour la 105","title":"Erreurs"},{"location":"jdb.html","text":"Journal de bord Mercredi 29 Mars 2023 Premier jour du travail de dipl\u00f4me. Nous avons eu un briefing de mr Garcia et nous avons pu commencer \u00e0 pr\u00e9parer le travail. Nous avons eu les diff\u00e9rents fichiers nescessaires \u00e0 la bonne r\u00e9alisation du projet et je me suis mis \u00e0 faire les fichiers nescessaires La premi\u00e8re chose a \u00e9t\u00e9 de faire ce mkdocs dans lequel j'ai mis un fichier yml plut\u00f4t standart qui risque de changer au fur et \u00e0 mesure. Voici le premier yml : site_name: Documentation Diplome theme: name: material palette: # Palette toggle for light mode - media: \"(prefers-color-scheme: light)\" scheme: default toggle: icon: material/brightness-7 name: Switch to dark mode # Palette toggle for dark mode - media: \"(prefers-color-scheme: dark)\" scheme: slate toggle: icon: material/brightness-4 name: Switch to light mode markdown_extensions: - attr_list - md_in_html plugins: - glightbox - with-pdf Voici un example de \u00e0 quoi ca ressemble en forme de site \"Exemple mkdocs\" Ensuite il m'a fallu faire une version plus \u00e0 jour de mon cahier des charges car je n'y avait pas touch\u00e9 depuis novembre. J'ai envoy\u00e9 un mail \u00e0 mes enseignants pour qu'ils puissent y jeter un oeuil pour \u00eatre s\u00fbr que je n'ai rien chang\u00e9 qui les d\u00e9rangent. Monsieur Jayr m'a demad\u00e9 \u00e0 l'occasion de lui faire un planning type Gantt alors je me suis mis \u00e0 la t\u00e2che. J'ai fait un planning pr\u00e9visionnel et une l\u00e9gende les deux sont dispo dans le dossier planning de ce repertoire. Ensuite je me suis mis \u00e0 tout mettre sur git. A commencer par ce repertoire Et c'est deja la fin de la journ\u00e9e ! Demain j'avance un peu sur la doc avec ce que je peux d\u00e9ja remplir et je finis de pr\u00e9parer ce dont j'ai besoin pour commencer \u00e0 coder. Jeudi 30 Mars 2023 Aujourd'hui selon le planning je dois me charger des dernirers pr\u00e9paratifs pour commencer correctement. J'ai fait expr\u00e8s de prenre du temps pour ca au d\u00e9but pour ne pas me cr\u00e9er de soucis plus loin pendant le travail. Je vais envoyer par mail le planning que j'ai fait \u00e0 mes suiveurs. Ensuite je vais m'attaquer au squelette de la docmentation. Je vais essayer de remplir tout ce que je peux remplir dans un premier temps car cela tout ca de fait pour plus tard quitte \u00e0 modifier quelques aspects au fur et \u00e0 mesure. J'ai aussi d\u00e9sactiv\u00e9 mkdocs with pdf par ce que les r\u00e9sultats ne sont vraiment pas ceux que j'attends et cela ralentis \u00e9norm\u00e9ment le d\u00e9ploiment. J'ai aussi rassembl\u00e9 mes croquis pour le poster : \"Croquis Poster 1\" \"Croquis Poster 2\" On peut voir que dans un premier temps j'ai tent\u00e9 de faire un poster un peu plus stylis\u00e9 et marketing. Cependant apr\u00e8s avoir discut\u00e9 avec Mr Garcia et diff\u00e9rents profs dont un de l'HEPIA et ils m'ont indiqu\u00e9 que ce qui \u00e9tait attendu \u00e9tait moins du marketing qu'un diagramme de fonctionnement. On peut voir sur les derniers posters que le cot\u00e9 technique ressort de plus en plus. Le but sera de faire une version encore plus technique ou on peut voir les diff\u00e9rents fonctionnements de l'application avec les technologies utilis\u00e9es. Le d\u00e9fi cela va \u00eatre de faire un joli poster qui soit en m\u00eame temps vendeur et en m\u00eame temps rempli techniquement. Oh et j'ai eu un probl\u00e8me ou mon calvier et ma souris ne voulaient d'un coup plus fonctionner. Dans mon cas c'\u00e9tait un probl\u00e8me de power management des ports. J'ai eu le soucis sur mon pc fixe \u00e0 la maison et sur mon pc portable \u00e9galement. En gros de ce que j'ai compris le soucis c'est que le pc croit que un port est trop solicit\u00e9 niveau puissance et du coup d\u00e9cide de couper l'alimentation du port USB. J'ai pu r\u00e8gler le soucis en allant dans le device manager sous universal bus controller sous power management et en d\u00e9cochant la case qui indique que windows peut d\u00e9sactiver ce port. Je ne conseille pas ce fix si vous avez des composants de mauvaise qualit\u00e9 car cela pourrait \u00eatre une vraie alerte cependant le fait que mes composants sont plut\u00f4t haut de gamme et le fait que mon clavier et ma souris le fassent en m\u00eame temps et que ils fonctionnaient tr\u00e8s bien depuis plus de 4 ans me font penser que c'est juste une nouvelle mise a jour de windows qui est p\u00e9nible. Demain je vais pouvoir commencer \u00e0 coder pour de bon. Vendredi 31/03/2023 Aujourd'hui on s'occupe de la PT2 qui est la programmation de la r\u00e9cup\u00e8ration des informations des images. Je vais tester IronOcr Source : https://www.c-sharpcorner.com/article/ocr-using-tesseract-in-C-Sharp/ Doc : https://ironsoftware.com/csharp/ocr/docs/ Examples : https://ironsoftware.com/csharp/ocr/examples/simple-csharp-ocr-tesseract/ Avant d'utiliser la librairie je me demande si je dois utiliser un peu de post processing pour aider \u00e0 la reconnaissance. Je peux soit utiliser l'image crop\u00e9e directement : \"Image non trait\u00e9e\" Soit avec un filtre pour passer en noir et blanc laxiste \"Image trait\u00e9e laxiste\" Soit avec un filtre pour passer en noir et blanc stricte \"Image trait\u00e9e stricte\" Il va falloir faire des tests avec tous les noms et les chiffres pour trouver le plus efficace. Bon malheureusment Iron OCR semblait \u00eatre une bonne alternative mais c'est une librairie priv\u00e9e qui demande une license pour \u00eatre utilis\u00e9e. Il va falloir trouver autre chose. En utilisant la librairie \"Tesseract\" qui existe on peut faire de la reconnaissance de texte avec un code plut\u00f4t simple : TesseractEngine engine = new TesseractEngine ( tessDataFolder . FullName , \"eng\" , EngineMode . Default ); var tessImage = Pix . LoadFromMemory ( ImageToByte ( sample )); Page page = engine . Process ( tessImage ); string text = page . GetText (); Voici la methode ImageToByte : https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-array public static byte [] ImageToByte ( Image img ) { using ( var stream = new MemoryStream ()) { img . Save ( stream , System . Drawing . Imaging . ImageFormat . Png ); return stream . ToArray (); } } Voici le code pour traiter plusieurs textes sur une seule image : Page page = engine . Process ( tessImage ); // Get the iterator for the page layout using ( var iter = page . GetIterator ()) { // Loop over the elements of the page layout iter . Begin (); do { // Declare a Rect variable to hold the bounding box Rect boundingBox ; // Get the bounding box for the current element if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { g . DrawRectangle ( Pens . Red , new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } // Get the text for the current element var text = iter . GetText ( PageIteratorLevel . Word ); tbxResult . Text += text . ToUpper () + Environment . NewLine ; } while ( iter . Next ( PageIteratorLevel . Word )); } Etonnament, avec plus de texte, des noms qui \u00e9taient autrefois mal reconnus sont parfaitement interpr\u00eat\u00e9s. Par exemple voici un exemple de reconnaisance de texte sur tous les pilotes : \"Screenshot de reconnaisance d'image complete\" On voit que le nom Leclerc est mal reconnu. Mais voici ce que cela donne quand on prend une image qui ne contient que le nom Leclerc : \"Screenshot de reconnaissance d'image crop\u00e9e\" On voit ici que le nom Leclerc est tr\u00e8s bien reconnu. Dans le premier exemple on peut voir que Tsunoda est reconnu comme \"Reticin\" ce qui n'est pas exactement pareil (lol) Et quand on isole le nom Tsunoda dans une image seule : \"Screenshot de reconnaissance de Tsunoda\" Il le lit \"RETLELYY\" ce qui n'est toujours pas exactement ca... Une meilleure r\u00e9solution pourrait peut-\u00eatre r\u00e9soudre le probl\u00e8me en partie. Jusqu'ici les images \u00e9taient en presque 720P ce qui donne ceci : \"Tsunoda en 720P\" Et j'ai lanc\u00e9 une r\u00e9cup\u00e8ration d'images en 1080p pour r\u00e9cup\u00e8rer ceci : \"Tsunoda en 1080P\" On peut voir une certaine diff\u00e9rence tout de m\u00eame. Et quand on lance la reconnaissance : \"Reconnaissance Tsunoda en 1080P\" \"Tsunoda n'est plus \u00e9crit \"RETLELYY\" mais \"TSUNDDA\" ce qui n'est pas parfait mais qui est d\u00e9ja beaucoup mieux. J'ai essay\u00e9 de mettre l'engine de Tesseract en mode \"JPN\" comme Tsunoda est un nom japonais mais sans succ\u00e8s j'ai le m\u00eame r\u00e9sultat. Comme la r\u00e9solution est meilleure je me suis dit que peut \u00eatre le filtre de passage en noir et blanc pourrait aider. J'ai \u00e9crit cette petite methode pour convertir l'image en noir et blanc : private static Bitmap ConvertToBlackAndWhite ( Bitmap inputBmp ) { const int BLACK_TO_WHITE_TRESHOLD = 200 ; Bitmap result = new Bitmap ( inputBmp . Width , inputBmp . Height ); for ( int y = 0 ; y < inputBmp . Height ; y ++) { for ( int x = 0 ; x < inputBmp . Width ; x ++) { Color pixelColor = inputBmp . GetPixel ( x , y ); if ( pixelColor . R <= BLACK_TO_WHITE_TRESHOLD && pixelColor . G <= BLACK_TO_WHITE_TRESHOLD && pixelColor . B <= BLACK_TO_WHITE_TRESHOLD ) { pixelColor = Color . FromArgb ( 0 , 0 , 0 ); } else { pixelColor = Color . FromArgb ( 255 , 255 , 255 ); } result . SetPixel ( x , y , pixelColor ); } } return result ; } Rien de bien dingue mais cela fonctionne et je peux jouer avec le BLACK_AND_WHITE_TRESHOLD pour changer son comportement. J'ai dabord test\u00e9 avec un treshold de 100 et le programme a r\u00e9ussi \u00e0 me sortir Tsunoda en deux mots ce qui \u00e9tait d\u00e9ja tr\u00e8s encourageant. Et apr\u00e8s avoir augment\u00e9 le Treshold... Tada : \"Tsunoda 1080P avec filtre\" Le programme arrive bien \u00e0 reconnaitre TSUNODA. Je pense que cette tactique ne fonctionnait pas avant car la resolution \u00e9tait trop faible et l'aliasing se m\u00ealait trop avec le texte pour \u00eatre utilisable. Cependant cette technique ne fonctionne pas sur tous les noms. Par example avec Leclerc : \"Leclerc 1080P avec filtre\" On r\u00e9cup\u00e8re \"Leeler'c\" ce qui n'est pas bon du tout. Mais en modulant le Treshold (ici \u00e0 150) On peut de nouveau voir Leclerc \u00eatre reconnu correctement \"Leclerc 1080P avec filtre 2\" Je pense que pour avoir de bons r\u00e9sultats il va falloir faire un algo qui : D\u00e9coupe l'image en autant de plus petites images pour avoir un mot par image. Teste voir si avec l'image originale un nom correspond \u00e0 la liste de pilotes existant. Si cela ne marche pas, on applique le filtre en modulant le Treshold. Dans le cas ou on aurait pas un match parfait on fait un algo qui cherche le nom le plus proche qui existe dans la liste de noms donn\u00e9s. Seulement voila, il n'y a pas que des lettres que l'on veut r\u00e9cup\u00e8rer. On veut surtout pouvoir r\u00e9cup\u00e8rer les chiffres. Pour les chiffres on va avoir des soucis \u00e9galement... Si on essaie directement la m\u00eame technique sans filtre on a des r\u00e9sultats comme celui ci : \"Tentative de reconnaisance du timing\" La virgule a tendeance \u00e0 se barrer ce qui est particuli\u00e8rement probl\u00e9matique. Cependant comme les chiffres ont beaucoup moins de possibilit\u00e9es que les lettres et qu'il n'y a pas de probl\u00e8me de langue on devrait pouvoir travailler \u00e0 faire des r\u00e8glage que l'on pourra ensuite utiliser. Avec un Treshold de 165 on arrive presque \u00e0 quelque chose d'int\u00e9ressant : \"Tentative 2 de reconnaissance du timing\" Le + n'est clairement pas compris mais ca n'est pas emb\u00eatant car c'est souvent redondant. On arrive cependant \u00e0 isoler 3 et 259. M\u00eame si la virgule n'est pas comprise cela veut dire qu'il est tout de m\u00eame possible de discriminer les secondes des milisecondes. Maintenant avec un temps au tour : \"Reconnaissance du timing au tour\" On arrive sans rien changer aux param\u00eatres \u00e0 isoler minutes secondes et milisecondes. Il semble que la reconnaissance de chiffre soit bien plus efficace que la reconnaissance de lettres. Il va falloir faire un test \u00e0 plus grande \u00e9chelle avec plus d'image pour se rendre compte de la precision. Demain ce qui serait bien cela serait que je fasse un jeu d'images avec des valeurs connues et que je fasse une batterie de tests pour voir \u00e0 quel point je peux faire confiance \u00e0 la reconnaissance des chiffres. Automatiser un syst\u00e8me de test de la sorte me sera tr\u00e8s utile dans le futur pour v\u00e9rifier la non regression de ma reconnaissance de texte quand je tenterai d'y faire des changements. Je suis toujours curieux cependant de voir comment le programme se d\u00e9brouille avec les nombres de tours qui se trouvent dans les icones de pneus. Lundi 3 Avril Aujourd'hui on va faire un programme qui permet de cr\u00e9er un dataset qui permette de tester le programme de reconnaissance. Je pense que le meilleur moyen de faire serait un programme qui cr\u00e9e le dataset et qui ensuite peut tester diff\u00e9rentes methodes de reconnaissance. Par la m\u00eame occasion je peux d\u00e9velopper la technologie qui va permettre de d\u00e9couper une image en 20 lignes ce qui me servira ensuite pour la reconnaissance. Je me rend compte que pour faire un programme de tests je dois d\u00e9ja avoir une id\u00e9e de la structure de mon programme. Pour le moment je r\u00e9flechis \u00e0 un syst\u00e8me de \"Zones\" et de \"Windows\". L'id\u00e9e serait que une Zone est juste une sous partie d'image qui peut encore \u00eatre d\u00e9compos\u00e9 tandis que chaque Window contient une ou plusieurs informations \u00e0 r\u00e9cup\u00e8rer. J'ai essay\u00e9 de d\u00e9couper l'image pour que cela soit plus clair : \"Main zone\" Ici on peut voir que l'image est d\u00e9coup\u00e9e en plusieurs grandes zones. Dans un premier temps on ne s'occupe que de la premi\u00e8re. Ensuite : \"Driver zone #1\" On peut voir la que cette Main zone serait elle m\u00eame d\u00e9compos\u00e9e en plusieurs plus petites zones. Et ensuite chacunes de ces petites zones : \"Driver windows\" Sera d\u00e9compos\u00e9e en plusieurs windows qui elles sont des zones qui contiennent de l'information. En gros on aurait trois types de zone : Les zones qui contiennent d'autres zones Les zones qui contiennent des Windows Les Windows Cependant en y r\u00e9flechissant on pourrait tout \u00e0 fait avoir seulement des zones et des windows en faisant en sorte que les windows peuvent avoir une liste de windows et une liste de zones. Une zone serait compos\u00e9e de : Une image de d\u00e9part Un rectangle qui la positionne sur cette derni\u00e8re Une liste de zones (potentiellement vide) Une liste de windows (potentiellement vide) Une methode qui permet de r\u00e9cup\u00e8rer une image de la zone Une methode qui permet de lancer la reconnaissance sur chaque window Une window serait compos\u00e9e de : Une image de d\u00e9part (cela peut \u00eatre l'image crop\u00e9e de la zone parente peu importe) Un rectangle qui la positionne sur cette derni\u00e8re Une methode qui permet de r\u00e9cup\u00e9rer un image de la window Une methode qui permet de lancer la reconnaisance sur l'image (Chaque type de zone doit l'impl\u00e9menter) Dans chaque window on peut imaginer que la methode qui fait la reconnaissance au lieu de retourner un objet qui peut contenir nimporte quel type d'information peut envoyer ce qu'elle vient de r\u00e9cup\u00e8rer dans une base de donn\u00e9e ou un objet. Par exemple une Zone de pilote pourrait tr\u00e8s bien contenir un objet pilote et le donner \u00e0 ses windows qui rempliraient ce m\u00eame objet. C'est une reflexion plus stockage que OCR mais c'est int\u00e9ressant pour savoir ce que fait une window des donn\u00e9es qu'elle r\u00e9cup\u00e8re. Dans un premier temps je pense que les windows vont simplement \u00e9crire dans un fichier ce qu'elles trouvent chacunes dans le format qu'elles veulent. Pour comprendre pourquoi je me prend la t\u00eate il faut savoir que chaque window peut avoir acc\u00e8s \u00e0 pleins d'informations diff\u00e9rentes. On pourrait dire qu'elles retournent toutes une string sauf que si ca marche pour un temps au tour ou pour un nom de pilote, cela ne marche pas forc\u00e9ment pour un type de pneu ou un DRS ouver. Comme chaque window a plusieurs types de data elle devra elle m\u00eame se charger de comment la traiter ET de la stocker. Voila un diagramme qui r\u00e9sume comment je vois l'impl\u00e9mentation dans un premier temps : \"Diagramme d'explications\" Voici comment se pr\u00e9sente le squellette d'une Zone : public class Zone { private Bitmap FullImage ; private List < Zone > Zones ; private List < Window > Windows ; private Rectangle _bounds ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap ZoneImage { get { Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( FullImage , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Zone ( Image fullImage , Rectangle bounds ) { FullImage = ( Bitmap ) fullImage ; Init ( bounds ); } public Zone ( Bitmap fullImage , Rectangle bounds ) { FullImage = fullImage ; Init ( bounds ); } private void Init ( Rectangle bounds ) { Bounds = bounds ; Zones = new List < Zone >(); Windows = new List < Window >(); } public void AddZone ( Rectangle bounds ) { if ( Fits ( bounds )) Zones . Add ( new Zone ( ZoneImage , bounds )); } public void AddWindow ( Rectangle bounds ) { if ( Fits ( bounds )) Windows . Add ( new Window ( ZoneImage , bounds )); } private bool Fits ( Rectangle inputRectangle ) { if ( inputRectangle . X + inputRectangle . Width > Bounds . Width || inputRectangle . Y + inputRectangle . Height > Bounds . Height || inputRectangle . X < 0 || inputRectangle . Y < 0 ) { return false ; } else { return true ; } } } Le but est ensuite de cr\u00e9er diff\u00e9rent types de Zones. Par exemple la MainZone devra d\u00e9couper son contenu en 20 parties \u00e9gales pour tenter de chopper les 20 pilotes. Il serait cool de trouver un moyen de calibrer automatiquement. C'est peut-\u00eatre possible de calibrer avec de la reconnaissance de texte, on peut essayer de lancer la reconnaissance et voir ou on trouve du texte avec un peu de chance cela pourrait donner les positions et avec ca on peut peut-\u00eatre determiner des lignes. Et voici le squelette d'une window g\u00e9n\u00e9rique using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace OCR_tester { public class Window { private Bitmap FullImage ; private Rectangle _bounds ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap WindowImage { get { Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( FullImage , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Window ( Bitmap fullImage , Rectangle bounds ) { FullImage = fullImage ; Bounds = bounds ; } public virtual void RecoverInformations () { //Each Window type will have to implement its own way to recover the informations stored in the Window Image } } } Chaque Window pourra ainsi elle m\u00eame impl\u00e9menter la r\u00e9cup\u00e8ration d'informations. La facon de les retourner/stocker est encore un peu floue. Par exemple pour un temps au tour on peut imaginer que il fait une petite v\u00e9rification dans l'objet pilote et dans le tableau des tours si il n'y a pas deja une valeur et si il n'y en a pas une alors il peut l'ajouter. Maintenant je vais essayer de cr\u00e9er une Main window qui se calibre toute seule. Alors apr\u00e8s avoir bien gal\u00e8r\u00e9 avec l'interface pour permettre au user de cliquer sur la form pour voir les zones qu'il cr\u00e9e, j'ai pu cr\u00e9er un zone qui fait les dimensions de MainZone et j'ai pu lancer la reconnaissance sur l'image et voir ou il trouve du texte : \"MainZone avec carr\u00e9s de texte\" Maintenant il faut que je nettoie la liste de rectangle pour exclure ceux qui sont trop grands pour \u00eatre sur une seule ligne, ceux qui indiquent le nombre de tour en haut et ceux qui n'ont pas d'int\u00e9r\u00eats. On pourra ensuite isoler les lignes et cr\u00e9er une liste d'images. Pour ce qui est de la ligne qui contient les \"Gap interval last lap\" et des chiffres sur les tours pour les pneus etc je vais juste demander \u00e0 l'utilisateur de ne pas les prendre dans la screenshot. Comme ils contiennent des mots qui peuvent \u00eatre utilis\u00e9s plus loin dans les data je ne peux pas les blacklister et faire un syst\u00e8me qui s'occupe de les enlever si ils existent selon le position y me prendrait trop de temps pour rien. Apr\u00e8s avoir filtr\u00e9 un peu les resultats et enlev\u00e9 les zones beaucoup trop grandes, on se retrouve d\u00e9ja plus qu'avec ca : \"MainZone avec de meilleurs carr\u00e9s\" Comme on peut le voir, du c\u00f4t\u00e9 gauche de l'image on a beaucoup de choses reconnues mais avec beaucoup de tailles diff\u00e9rentes ce qui n'est pas id\u00e9al. Alors j'ajoute un filtre qui permet de ne selectionner que les data sur la droite. \"MainZone avec de meilleurs carr\u00e9s\" Maintenant il devrait \u00eatre possible de faire un algorythme qui ne prend que un seul carr\u00e9 par ligne. \"MainZone avec un seul carr\u00e9 par ligne\" Maintenant que on sait ou se trouve chaque ligne on peut faire un petit traitement et d\u00e9couper l'image en plusieurs windows. Et voila : \"Mainzone auto calibr\u00e9e\" Maintenant le programme peut cr\u00e9er des zones pour chaque pilote \"Images pilotes\" \"Zone d'un pilote\" Maintenant il faut que j'impl\u00e9mente un syst\u00e8me un peu similaire pour cr\u00e9er des windows. Voici la methode que j'ai cr\u00e9\u00e9 pour l'autocalibration : public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); Zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . tessDataFolder . FullName , \"eng\" , EngineMode . Default ); Image image = ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //var text = iter.GetText(PageIteratorLevel.Word).ToUpper(); //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); Zones . Add ( new Zone ( ZoneImage , windowRectangle )); } } Ca peut paraitre pas \u00e9norme comme code mais pour tout mettre en place ca demande quand m\u00eame pas mal de reflexion. J'ai du clean un peu le code que j'avais fait pour permettre la selection de zones et ajouter la possibilit\u00e9 d'ajouter des windows sur une zone. J'ai juste quelques difficult\u00e9es \u00e0 les ajouter correctement, j'ai un offset tout pourri qui se met tout le temps \"Sainz coup\u00e9\" \"Perez coup\u00e9\" Cela doit \u00eatre un soucis lors de la detection de clic qui met un offset en trop. C'est vraiment p\u00e9nible en tout cas. Certes c'est moins fun de devoir manuellement indiquer ou sont les windows sur une ligne de pilote, mais je ne vois vraiment pas comment faire cela automatiquement. Le but c'est de faire une configuration qui puisse \u00eatre sauvegard\u00e9e comme ca pas besoin d'\u00e0 chaques fois le refaire. C'est bon ! J'avais juste oubli\u00e9 de changer le calcul d'offset entre le code de la zone et de la window. Note pour plus tard, il serait peut-\u00eatre judicieux de faire quelque chose pour la vue, les windows et les Zones ont le m\u00eame exact comportement pour la vue ce qui fait dupliquer du code. Mais au moins maintenant ca fonctionne : \"Ocr tester screenshot\" Et le programme va directement cr\u00e9er un dossier par pilote avec toutes les images de chaque Data le concernant : \"Dossier Perez\" ; Et c'est tout pour aujourd'hui je pense. Ce qui serait cool demain c'est que je puisse stocker d'une mani\u00e8re ou d'une autre ces fichiers de calibration et que je puisse les transf\u00e8rer vers le programme qui va s'occuper de d\u00e9coder et commencer gentillement \u00e0 d\u00e9coder les diff\u00e9rents types de data. Note pour quand je ferai les tests. Je pense que la meilleure id\u00e9e serait que je prenne pleins de photos du style et que je les mette dans un fichier CSV ou JSON avec leur contenu. Et ensuite je le fais passer en tests pour calculer la prescision de mon algo de d\u00e9codage. Pour le moment on est plut\u00f4t dans les clouts niveau planning. Mardi 4 Avril Aujourd'hui je suis scens\u00e9 plut\u00f4t bosser sur l'interpretation des donn\u00e9es, mais une id\u00e9e m'a taraud\u00e9 l'esprit toute la nuit. Est-ce que je ne pourrais pas quand m\u00eame essayer de d\u00e9composer la zone de pilote directment comme pour la Main zone. Pour ce faire j'ai tent\u00e9 de faire comme pour la main zone c'est \u00e0 dire lancer la reconnaissance pour savoir ou \u00e9taient tous les champs de donn\u00e9es mais malheureusement je ne pense pas que cela va \u00eatre possible. En effet non seulement ici les champs sont de tailles tr\u00e8s vari\u00e9es, mais en plus la reconnaissance n'arrive pas \u00e0 en r\u00e9cup\u00e8rer le m\u00eame nombre sur chaque ligne ce qui risque d'\u00eatre complexe \u00e0 utiliser ensuite. La preuve : \"Tentative d'auto calibration\" ; Cependant tout n'est pas perdu ! Il y a peut-\u00eatre un moyen qui serait mieux en tous points. Le soucis avec ce type de reconnaissance c'est qu'on utilise beaucoup de ressources inutiles. On peut peut-\u00eatre hard coder la valeur des diviseurs et les utiliser pour cr\u00e9er des zones. Ok alors visiblement c'est un probl\u00e8me car il semble y avoir d'autres pixels de cette couleur dans l'image (Qui l'aurait cru lol) \"Tentative 2\" J'a tent\u00e9 de r\u00e9duire la tol\u00e9rance mais le soucis c'est que c'est soit trop soit pas assez Derni\u00e8re tentative, j'ai essay\u00e9 de prendre plusieurs pixels en hauteur pour chaque incr\u00e9ment de X et en faire la moyenne, et m\u00eame comme ca, impossible de trouver de mani\u00e8re efficace les zones. Je pense que je vais donc revert tous mes changements pour revenir \u00e0 la version ou on les choisissait manuellement. Pas mal de temps perdu mais bon c'est comme ca ca arrive Bon j'ai fait un revert mais j'ai ajout\u00e9 une feature importante. Les zones font la largeur indiqu\u00e9e par l'utilisateur mais elles font la hauteur max comme ca toutes les window font la m\u00eame hauteur et ca permet \u00e0 l'utilisateur de ne pas forc\u00e9ment \u00eatre ultra pr\u00e9cis dans sa selection. Ce qui nous donne : \"Resultat final\" Maintenant je dirais que les deux prochaines choses \u00e0 faire seraient de stocker ces zones dans un fichier JSON ou autre pour que la calibration puisse \u00eatre envoy\u00e9e directement dans le logiciel de reconnaissance et ensuite de faire une calibration sur des images qui font la taille qu'on aura pendant les Grands Prix. Pour le moment elles sont au format 16:10 qui est le format d'\u00e9crant de mon laptop. Pour le stockage j'imagine un fichier qui donne des indications assez simples qui permettent de reconstruire le total des zones quand il est import\u00e9 plutot que d'\u00e9crire les coordonn\u00e9es en dur pour chacunes. Chaque Grande zone va impl\u00e9menter une methode qui s'occupe de mettre tous ses enfants dans un fichier. { \"MainZone\" :{ \"x\" : 10 , \"y\" : 20 , \"width\" : 1450 , \"height\" : 1340 , \"DriverZone\" :{ \"x\" : 0 , \"y\" : 23 , \"height\" : 25 , \"Windows\" :[ { \"DriverPositionWindow\" :{ \"x\" : 0 , \"y\" : 0 , \"width\" : 35 } }, { \"DriverPositionChangesWindow\" :{ \"x\" : 0 , \"y\" : 0 , \"width\" : 45 } } ] } } } C'est le r\u00e9sultat auquel j'aimerais arriver. Mais pour y arriver il faut encore que je cr\u00e9e les diff\u00e9rents types de window. Cela veut dire que je dois d\u00e9cider quelles informations je vais r\u00e9cup\u00e8rer de la page. Par exemple je vais conserver la position du pilote mais au final les changements de positions sont difficiles \u00e0 lire et sont redondants. Si je garde un historique des positions des pilotes je peux calculer moi m\u00eame les changements. Pareil pour gap avec la voiture devant. Je pense que je vais juste garder l'information des \u00e9carts absolus et ensuite je pourrai toujours calculer la diff\u00e9rence entre les pilotes. Ca peut para\u00eetre b\u00eate car cela rajoute du calcul mais en r\u00e9alit\u00e9 le calcul de l'OCR est extr\u00eamement gourmand alors il faut que j'\u00e9vite le plus possible d'y faire recours. Il est bien plus rapide de calculer les \u00e9carts que d'essayer de reconnaitre le texte et le convertir en chiffre. J'ai visiblement ajout\u00e9 un bug dans mon code. Maintenant tous les pilotes ont la m\u00eame image quand on les selectionne. Mais visiblement ca n'\u00e9tait pas le cas avant car j'avais pu prendres des images de chaque pilote. J'ai pass\u00e9 3 minutes \u00e0 fixer un bug stupide j'ai un peu envie de br\u00fbler ma place de travail... Mais bon au moins maintenant cela fonctionne ! Toutes les images sont r\u00e9cup\u00e8r\u00e9es et ont un format correct avec le bon nom : \"Verstappen folder\" Avec un peu de code tr\u00e8s moche j'ai pu cr\u00e9er un fichier JSON qui contient les diff\u00e9rentes infos. Cependant en exportant TOUT on se retrouve avec un fichier de 1200 lignes ce qui n'est pas optimal. Mais quand on regarde, il devrait \u00eatre possible de faire un fichier qui ne contient que les infos d'un seul pilote car ensuite il y a simplement un offset \u00e0 appliquer sur la zone et les windows. Je vais donc pouvoir commencer enfin le logiciel de d\u00e9codage qui prend en entr\u00e9e un fichier JSON comme celui ci qui a \u00e9t\u00e9 g\u00e9n\u00e8r\u00e9 avec le programme de calibration. { \"Main\" : { \"x\" : 40 , \"y\" : 230 , \"width\" : 1845 , \"height\" : 719 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : 3 , \"width\" : 1845 , \"height\" : 35 , \"Windows\" : [ { \"Position\" : { \"x\" : 2 , \"y\" : 0 , \"width\" : 32 }, \"GapToLeader\" : { \"x\" : 204 , \"y\" : 0 , \"width\" : 96 }, \"LapTime\" : { \"x\" : 413 , \"y\" : 0 , \"width\" : 105 }, \"Drs\" : { \"x\" : 526 , \"y\" : 0 , \"width\" : 81 }, e t c... } ] } } ] } } Dans le futur il faudrait ajouter d'autres choses comme par exemple les diff\u00e9rents pilotes pr\u00e9sents sur le Grand Prix et ce genre d'infos. Quoique je vais l'ajouter d\u00e9ja maintenant et plus tard je mettrai en place la feature acessible depuis l'interface. Mais le hardcoder maintenant me permet d\u00e9ja de mieux coder l'autre c\u00f4t\u00e9. Ce programme n'est en aucun cas termin\u00e9 et je vais devoir travailler encore un peu dessus pour qu'il soit utilisable correctement mais au moins il fonctionne \u00e0 peu pr\u00e8s. Exemple du json avec les noms de pilotes: { \"Main\" : { \"x\" : 37 , \"y\" : 238 , \"width\" : 1851 , \"height\" : 713 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : -5 , \"width\" : 1851 , \"height\" : 35 } } ] }, \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , e t c... ] } Maintenant je vais m'attaquer au d\u00e9codage. Demain je dois finir le d\u00e9codage du JSON et je dois commencer \u00e0 impl\u00e9menter la reconnaissance des textes. Voire m\u00eame des pneus etc si j'y arrive. Mercredi 5 Avril Bon la il faut vraiment que je finisse assez vite la lecture du JSON et la reconstruction des zones pour commencer la reconnaissance. J'ai pris beaucoup de temps \u00e0 faire le programme de calibration mais je pense que c'est essentiel de prendre ce temps maintenant. (BTW il faudra quand m\u00eame retourner faire une plus jolie version par ce que la ca marche mais c'est tout) Bon apr\u00e8s pas mal de boulot je pense avoir r\u00e9ussi. Dans le nouveau programme on arrive \u00e0 r\u00e9cup\u00e8rer les diff\u00e9rentes zones : \"JSON decode result\" Un conseil de notre professeur M.Bonvin a \u00e9t\u00e9 de cr\u00e9er des Releases de versions qui ne fonctionnent pas ou pas tr\u00e8s bien. J'ai donc publi\u00e9 une premi\u00e8re release de l'OCR_TEST qui fonctionne vite fait. J'ai seulement un petit soucis, comme je recr\u00e9e compl\u00eatement la structure des driver zones avec seulement la premi\u00e8re, il y a un petit d\u00e9calage car entre les zones il y avait un gap. Ce qui fait que si la premi\u00e8re zone est parfaitement centr\u00e9e : \"Centered driver\" La vingti\u00e8me ne l'est plus exactement : \"Uncentered Driver\" Pour ca j'ai essay\u00e9 de mettre un espacement arbitraire mais c'est complexe. Je vais plut\u00f4t tenter de faire une diff\u00e9rence entre la taille de la zone compl\u00eate et de la taille additionn\u00e9e de toutes les fen\u00eatre et diviser le resultat entre toutes les fen\u00eatres. Ca n'est pas parfait mais au moins maintenant les donn\u00e9es ne touchent plus les bords de la fen\u00eatre. Et voila ! Maintenant avec le fichier de configuration en Json on arrive \u00e0 r\u00e9cup\u00e8rer toutes les infos comme si elles avaient \u00e9t\u00e9 envoy\u00e9es directement depuis l'app de calibration mais sans le processing time ! \"Verstappen folder 2 On peut donc ENFIN passer au d\u00e9codage de ces FICHUES donn\u00e9es. Je vais pouvoir impl\u00e9menter ce que j'ai fait dans le projet de test de d\u00e9codage. Gr\u00e2ce \u00e0 mon d\u00e9coupage initial qui m'a pris du temps \u00e0 impl\u00e9menter on a enfin un truc qui marche m\u00eame si je n'ai impl\u00e9ment\u00e9 que la reconnaissance de noms. \"Image reconnaissance propre\" Si on se rappelle du syst\u00e8me de window et de zones dans le diagramme plus haut, c'est assez facile de comprendre comment je m'y suis pris. En gros on des listes et des listes de listes de zones, c'est la partie un peu plus technique car il y a des zones qui peuvent contenir d'autres zones etc. Je vais commencer par la reconnaissance de noms. Voici le tableau de pilotes de 2023 \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , \"Hamilton\" , \"Alonso\" , \"Russel\" , \"Gasly\" , \"Stroll\" , \"Sainz\" , \"Hulkenberg\" , \"Norris\" , \"Tsunoda\" , \"Piastri\" , \"Zhou\" , \"Ocon\" , \"Magnussen\" , \"Perez\" , \"Sargeant\" , \"De Vries\" , \"Bottas\" , \"Albon\" ] ET voici le tableau de pilotes de 2022 : \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , \"Sainz\" , \"Perez\" , \"Hamilton\" , \"Russel\" , \"Magnussen\" , \"Gasly\" , \"Ocon\" , \"Alonso\" , \"Tsunoda\" , \"Bottas\" , \"Zhou\" , \"Albon\" , \"Stroll\" , \"Schumacher\" , \"Hulkenberg\" , \"Norris\" , \"Latifi\" , \"Ricciardo\" ] Je les notes ici car J'ai souvent besoin de changer selon le dataset que j'utilise. Dans le futur je ferai s\u00fbrement un grand dataset qui prend des pilotes de reserves et des pilotes juniors pour que dans le cas ou un pilote est remplac\u00e9 dans l'ann\u00e9e il n'y a pas besoin de tout recalibrer avec l'application. Apr\u00e8s une discussion avec M.Bonvin j'ai d\u00e9cid\u00e9 de tester 3 valeurs de convertion en noir et blanc et si je ne trouve pas un match exact je prend le nom le plus proche. Pour trouver la string la plus proche je pense que je vais utiliser quelque chose qui s'appelle la technique de Levenshtein. De ce que j'ai compris c'est un algorythme qui permet de donner une metric de diff\u00e9rence entre deux strings. Bon et \u00e9videmment il ne faut pas se tromper dans la liste des pilotes GENRE NE PAS OUBLIER QUE GEORGE RUSSELL COMPORTE DEUX WFNEWIEWV DE \"L\" A LA FIN DE SON NOM CE QUI POURRAIT ENGRANGER 2H DE DEBUGGING POUR RIEN ASK ME HOW I KNOW joker laugh J'ai vraiment un soucis avec Tsunoda, Il a trop tendeance \u00e0 le confondre avec \"TSUNDDA\" et pour des raisons obscures, quand j'applique l'algorythme de Levenshtein le plus proche n'est pas \"Tsunoda\" mais \"Sainz\" iniuvbwdiucbiubisc POURQUOI !!??!! Je pense que cela demande moins de changements de lettres enfin bon c'est quand m\u00eame pas id\u00e9al. Il va falloir que je trouve un moyen de le repond\u00e9rer. C'est dommage par ce que cela marche super avec Alonso Verstappen et Albon. J'ai un peu modifi\u00e9 la methode et j'ai fait en sorte d'envoyer tous les noms en majuscules en me disant que cela pourrait r\u00e9duire le nombre de changements. Et ca a march\u00e9 !! Cela va s\u00fbrement demander plus de tests pour \u00eatre bien s\u00fbr que tout fonctionne nikel, cependant pour le moment ca marche parfaitement avec les pilotes de 2022. Pour ce qui est de la reconnaissance de chiffres, j'ai d\u00e9ja fait une partie du boulot le premier jour alors je vais juste reprendre \u00e0 partir de l\u00e0. Je r\u00e9cup\u00e8re une string de ce type \"1:35.123\" le soucis c'est que les : se transforment parfois en . ou inversement mais bon ca devrait pas \u00eatre trop dur \u00e0 g\u00e8rer. Il faut que je transforme cette string en nombre de milisecondes (Du moins je pense que c'est le meilleur moyen pour ensuite pouvoir facilement comparer et stocker l'information). Cela fait que 1:35:123 en milisecondes donne : 1 * 1000 * 60 => 60'000 35 * 1000 => 35'000 123 => 123 Total : 60'000+35'000+123 => 95'123ms Et pour l'affichage : Minutes = ms / 60'000 secondes = (ms - (minutes/60'000))/1000 ms = ms - ((minutes 60'000) + (secondes * 1000)) Et on se retrouve avec 1:35:123 Maintenant apr\u00e8s un peu de temps pour nettoyer la string etc on se retrouve avec un r\u00e9sultat comme le suivant : Position : 0 Gap to leader : 0:0:0 Lap time : 2:15:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:323 Sector 2 : 0:42:340 Sector 3 : 0:0:0 Evidemment pareil pour les autres pilotes Et je me rend compte que j'ai encore tout cass\u00e9 car le laptime ne devrait pas \u00eatre 2:15 mais 1:35... Voila apr\u00e8s une heure de debugging et des ajouts pour nettoyer les chaines on se retrouve avec : Position : 0 Gap to leader : 0:0:0 Lap time : 1:35:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:323 Sector 2 : 0:42:340 Sector 3 : 0:0:0 Note: le traitement commence \u00e0 devenir long, il serait peut-\u00eatre int\u00e9ressant d'utiliser un seul Tesseract Engine ou de voir ce qui prend autant de temps, on d\u00e9passe la seconde de traitement ce qui est un peu ma limite. Apr\u00e8s on peut toujours tester de rajouter du multicore processing mais c'est pour une autre fois. Demain je m'occupe de r\u00e8gler les soucis que j'ai avec la prescision de ces temps au tour et j'\u00e9sp\u00e8re pouvoir m'occuper aussi de la position des pneus et du DRS. J'aimerais finir tout ca cette semaine. Jeudi 6 Avril Une id\u00e9e m'est pass\u00e9e par la t\u00eate pendant que je dormais, dans la liste des pilotes, quand ils sont \u00e0 plus d'un tour de retard avec le leader (Ce qui arrive normalement dans presque tous les Grand Prix) on a pas des minutes mais une string qui montre \"+1 Lap\" ou \"+2Laps\" ce qui est \u00e9videmment un probl\u00e8me. Je pense qu'une bonne facon d'envoyer l'info serait de retourner -1 -2etc... \u00e0 la place des milisecondes, mais encore faut-il detecter le nombre de tours Je devrais \u00eatre en train de commencer la documentation de commment tout ce que j'ai fait fonctionne. Cependant je ne me vois pas faire ca tant que je n'ai pas au moins r\u00e9cup\u00e8r\u00e9 toutes les infos au moins un peu proprement. Cela veut dire que je commence officiellement \u00e0 prendre du retard. (Sachant que si je finis tout aujourd'hui une journ\u00e9e de doc suffira largement le terme est un peu exag\u00e8r\u00e9 mais bon) Bon pour la reconnaissance des temps c'est sp\u00e9cial... Le filtre semble ne pas changer grand chose ce qui est probl\u00e9matique et ca n'est vraiment pas fiable. Voici quelques expemples avec un treshold de 100: \"11ZSD\" Cette image est comprise comme \"11ZSD\" 42340 Cette image est comprise comme \"42340\" \"ZZAEB\" Et celle ci \"ZZAEB\"... Ce qui... n'est pas bon du tout... J'ai essay\u00e9 de trouver un fichier d'entrainement sp\u00e9cifiquement fait pour les digits. J'ai essay\u00e9 de blacklister les chars non voulus pour tenter d'obliger Tesseract \u00e0 trouver des chiffres. Avec la premi\u00e8re option, les r\u00e9sultats ne sont pas meilleurs voire pires. Avec la seconde option c'est d\u00e9ja pas mal mieux mais on perd compl\u00e8tement la possibilit\u00e9 de detecter les mots comme \"LEADER\" ou \"LAP\" et de toute facon ca n'est pas parfait. Le soucis c'est que si je n'ai pas des donn\u00e9es fiables c'est juste impossible de faire des calculs et de l'affichage correct... Il faut absolument que je trouve une solution. J'ai essay\u00e9 d'utiliser de l'interpolation our augmenter la taille de l'image et ensuite appliquer mon filtre pour retirer le flou mais sans succ\u00e8s... Pourtant la on se retrouve avec des images plut\u00f4t claires : \"Clear1\" Ici le programme trouve \"44301\" \"Clear2\" Et ici \"A5151\"... On a toujours les m\u00eames probl\u00e8mes. Bon je suis all\u00e9 me renseigner sur l'OCR et je me suis dit que j'allais tenter de faire les choses proprement. Je vais faire passer plusieurs \u00e9tapes de postProcessing avant de donner l'image \u00e0 Tesseract. GrayScale Tresholding InvertColors Scaling Dilatation Ce qui donne : \"Original\" \"Grayscale\" \"InvertColors\" ; \"Resize\" ; \"Dilatation\" Ce qui ne change : Roulement de tambour RIEN kjd viuwvuirnvoirenbf Tout ca pour rien... C'EST BON !!! Bon en fait au final le probl\u00e8me \u00e9tait une mauvaise configuration de Tesseract. Je vais devoir un peu nettoyer tout ca. Mais avec les changements de l'image on a des r\u00e9sultats BEAUCOUP plus pr\u00e9cis et potentiellement utilisables. La je vais devoir faire un serieux travail de nettoyage et simplification de mon code par ce que la c'est vraiment un chantier vu le nombre de choses que j'ai du essayer. J'ai du aussi beaucoup modifier la gestion de l'image ce qui donne : \"Clean\" Et la on a des r\u00e9sultats qui sont vraiment bons. J'ai pu ajouter assez facilement la detection de position comme c'est simplement un chiffre. On se retrouve maintenant avec ce genre de retours : Position : 1 Gap to leader : 8:33:51 Lap time : 2:19:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:828 Sector 2 : 0:42:940 Sector 3 : 0:0:0 Position : 2 Gap to leader : 0:3:259 Lap time : 23:12:392 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : VERSTAPPEN Sector 1 : 0:38:119 Sector 2 : 0:0:0 Sector 3 : 0:0:0 Il ne manque plus que l'impl\u00e9mentation de la reconnaissance du DRS et des Pneus Et non... je viens de me rendre compte que mon programme a encore cass\u00e9 car le tap time ne peut pas \u00eatre 23 min lol. J'ai un nouveau magnifique probl\u00e8me... Les points et les deux points sont interpr\u00eat\u00e9s comme des chiffres ... Give me a F * * break... J'ai du mal \u00e0 comprendre pourquoi ils ne sont d\u00e9tect\u00e9s comme tels que maintenant. Bon alors il semblerait les temps au tour aie besoin d'un ordre tr\u00e8s pr\u00e9cis pour fonctionner. Grayscale InvertColors Tresholding Resize * 2 Resize * 2 Et la on a des r\u00e9sultats un peu mieux. Bon demain il faut absolument que je me charge de r\u00e8gler tous ces probl\u00e8mes et que je commence la reconnaissance des pneus et de DRS par ce que je commence \u00e0 \u00eatre en retard. Vendredi 6 Avril 2023 Alors aujourd'hui c'est le dernier jour avant de commencer \u00e0 \u00eatre en retard pour de bon. J'ai r\u00e9ussi \u00e0 r\u00e8gler le probl\u00e8me des temps au tour, des gaps, et des secteurs. Dans le processus j'ai cass\u00e9 la detection de position mais ca devrait pas \u00eatre TROP compliqu\u00e9. Et voila ... Apr\u00e8s seulement plus de dix heures de gal\u00e8re, si on donne cette image au programme et le bon JSON le programme nous retourne : Position : 1 Gap to leader : 0:05:059 Lap time : 1:39:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:828 Sector 2 : 0:42:940 Sector 3 : 0:00:000 Position : 2 Gap to leader : 0:03:259 Lap time : 1:39:392 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : VERSTAPPEN Sector 1 : 0:31:749 Sector 2 : 0:00:000 Sector 3 : 0:00:000 Evidemment le GapToLeader est faux sur leclerc car il est leader mais bon ca je pourrai toujours Hardcoder que le premier a jamais de GapToLeader. Bon j'ai eu beaucoup de soucis que je ne vais pas mentionner ici car ce sont simplement des soucis de logique de programmation pour trouver un DRS ouvert ou non. Au final la technique que j'utilise et qui marche plut\u00f4t bien pour le DRS est que je prend la premi\u00e8re image de DRS et je la d\u00e9clare comme valeur \u00e9talon d'un DRS non actif, en effet dans 99% des cas le leader n'a pas de DRS (cela peut arriver alors il faudra donc juste verifier que les pilotes sont bien \u00e0 moins de deux secondes les uns des autres pour confirmer). Ensuite cette valeur \u00e9talon je la calcule en fonction du nombre de pixels verts dans l'image et si il y a plus de 30% de pixels verts en plus c'est que le DRS est activ\u00e9 ex: Ceci est un DRS ferm\u00e9: \"Closed DRS\" Ceci est un DRS ouvert: \"Open DRS\" Cela marche \u00e0 peu pr\u00e8s tout le temps mais dans le pire des cas on peut toujours verifier que les pilotes sont bien proches pour detecter les potentiels rares cas de faux positifs. J'ai pu augmenter les performances en utilisant un seul engine pour tout le monde et en arr\u00eatant d'utiliser GetPixel et SetPixel qui sont simplement des horreurs \u00e0 utiliser. Mais elles ne sont pas encore bonnes Le soucis avec la detection de pneus cependant, c'est qu'il n'est pas possible d'utiliser la reconnaissance pour savoir ou regarder la couleur car cela ne marcherait pas. Je ne peux pas faire trop de post processing car je dois conserver la couleur Je ne peux pas hardocder un endroit ou aller regarder car cela \u00e9volue tout le long du Grand Prix. Bref c'est la gal\u00e8re. En y r\u00e9flechissant je me suis dit qu'une bonne id\u00e9e pourrait \u00eatre de partir de la droite de la zone du pneu en regardant au milieu de la hauteur. Puis continuer vers la gauche jusqu'\u00e0 ce que je rencontre une couleur diff\u00e9rente. Je pourrai ensuite faire une zone un peu vers la gauche qui devrait contenir les infos du pneu et sur laquelle il sera possible de faire de le reconnaissance de couleur et de la reconnaissance de chiffres. J'ai d\u00e9termin\u00e9 que le background n'\u00e9tait jamais plus clair que #505050 et que donc nimporte quelle couleur qui aurait plus que 50 dans un seul des channels serait consid\u00e8r\u00e9e comme une couleur cassant le background Pour arriver \u00e0 cette conclusion je me suis amus\u00e9 un peu avec les couleurs pour jouer avec les limites de mon algorythme : \"Color fun\" Et je crois que j'ai eu une bonne id\u00e9e, avec une petite methode bien faite on arrive \u00e0 de supers r\u00e9sultats : private Rectangle FindTyreZone () { Bitmap bmp = WindowImage ; int currentPosition = bmp . Width ; int height = bmp . Height / 2 ; Color limitColor = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Color currentColor = Color . FromArgb ( 0 , 0 , 0 ); Size newWindowSize = new Size ( bmp . Height , bmp . Height ); while ( currentColor . R <= limitColor . R && currentColor . G <= limitColor . G && currentColor . B <= limitColor . B && currentPosition > 0 ) { currentPosition --; currentColor = bmp . GetPixel ( currentPosition , height ); } //Its here to let the new window include a little bit of the right side int offset = Convert . ToInt32 (( float ) newWindowSize . Width / 100f * 20f ); int CorrectedX = currentPosition - ( newWindowSize . Width - offset ); if ( CorrectedX <= 0 ) return new Rectangle ( 0 , 0 , newWindowSize . Width , newWindowSize . Height ); return new Rectangle ( CorrectedX , 0 , newWindowSize . Width , newWindowSize . Height ); } \"Tyres\" Maintenant cela devrait \u00eatre beaucoup plus simple de trouver la couleur g\u00e9n\u00e9rale et le nombre de tours. Donc ce que je fais c'est que je fais une reconnaissance de texte sur l'image r\u00e9duite. Si je trouve une lettre c'est facile Ca me donne le type de pneu et ca me dit que c'est le premier tour avec. Si c'est un nombre alors je fais la moyenne de toutes les couleurs de l'image et je prend la couleur de pneu la plus proche. Voici les diff\u00e9rentes couleurs de pneus : SOFT : #FF0000 MEDIUM : #f5bf00 HARD : #d9d8d4 INTER : #00a42e WET : #2760a6 \"Tyre colors\" Les couleurs de pneus peuvent changer de temps \u00e0 autres, par exemple cette r\u00e8gle de pneus est arriv\u00e9e en 2019 et avant il y avait beaucoup plus de couleurs mais dans une volont\u00e9 de rendre le sport plus facile \u00e0 comprendre \u00e0 la t\u00e9l\u00e9 cela a \u00e9t\u00e9 simplifi\u00e9. Je ne pense pas que cela va changer dans les ann\u00e9es qui viennent alors tout est hardcod\u00e9. Je pense que j'ai des soucis avec la detection de texte et de couleur car ma zone est trop grande. Alors bon j'\u00e9crit ces lignes apres des heures de tests. Il semble que la principale difficult\u00e9 avec ces pneus c'est que les chiffres ou lettres sont minuscules. Il est donc extr\u00eamement difficile de faire une reconnaissance ne serait-ce qu'un peu fiable.. Je fais de mon mieux pour tenter de r\u00e8gler le soucis cependant c'est vraiment complexe. Je commence \u00e0 devenir fou, je tente tout et nimporte quoi pour permettre \u00e0 mon algo de fonctionner et m\u00eame quand je fais du post processing comme pas possible il me retourne toujours nimporte quoi... \"5i t'inqui\u00e8tes\" Ici le programme va trouver '5i'... En fait c'est complexe d'expliquer tout ce que je fais car je change tout en boucle en essayant et en ratant ce qui prend des heures. Pour aujourd'hui j'abandonne je vais simplement rentrer chez moi et y r\u00e9flechir cette nuit mais je ne vois pas comment mieux faire la... C'est terrible par ce que je sens que je ne suis pas bien loin. Vacances Bon je vais un peu laisser de c\u00f4t\u00e9 la detection de chiffres pour me pencher un peu plus sur la d\u00e9tection de couleur. Par ce que techniquement si j'arrive \u00e0 toujours parfaitement la detecter alors je pourrais me passer des chiffres car ils sont redondant si je construit un historique de pneus. J'ai r\u00e9ussi \u00e0 fix mon probl\u00e8me de mauvaise detection de couleur de pneus. Du moins je crois. Seulement j'ai quand m\u00eame un souci, les fen\u00eatres de pneus avec une lettre n'ont pas assez de couleur pour \u00eatre d\u00e9tect\u00e9s. Je vais donc essayer de detecter les cinq lettres possibles et si il ne trouve pas alors je pourrai tenter de detecter les chiffres sans lettres ce qui devrait grandement aider. Le but est encore une fois de r\u00e9duire les possibilit\u00e9s de Tesseract. Je me rend de plus en plus compte que le plus important c'est de r\u00e9duire le scope le plus possible. Moins il y a de mots et lettres et de chiffres possibles meilleure sera la reconnaissance. Bon ca ne veut toujours pas marcher maintenant le 11 est interpr\u00eat\u00e9 comme trois I ou comme un M... J'en ai marre sans rire c'est vraiment p\u00e9nible. Alors j'\u00e9crit ces lignes deux jours plus tard et me rend compte avec horreur que toutes mes modifications sur ce journal de bord n'ont pas \u00e9t\u00e9 auvegard\u00e9e... yess.. Bon pour faire simple, j'ai r\u00e9ussi \u00e0 rendre la detection de couleurs bien plus efficace en r\u00e9duisant la taille de l'image et en ne prenant pas en compte les couleurs que l'on d\u00e9tecte comme \u00e9tant partie int\u00e9grante du background. Par exemple quand on a une image comme celle ci : \"Avec background\" qui contient un background alors que ci dessous, on l'a enlev\u00e9. \"Sans background\" La diff\u00e9rence est t\u00e9nue mais elle permet de grandement am\u00e9liorer la prescision de la reconnaissance de couleurs. Pour ce qui est du nombre de tours je me suis rendu compte que cela n'\u00e9tait d\u00e9ja pas tr\u00e8s utile car avec l'historique on devrait pouvoir le d\u00e9duire. Mais bon pour la forme je me suis dit que cela serait quand m\u00eame une bonne id\u00e9e de v\u00e9rifier avec la reconnaissance. J'\u00e9tais quasi certain que le soucis \u00e9tait le fait que l'on voie le contour du logo de pneu qui faisait que la reconnaissance avait du mal. Et j'avais raison ! En les enlevant (Ce qui n'a pas \u00e9t\u00e9 simple) J'ai pu avoir des chiffres beaucoup plus proches de la r\u00e9alit\u00e9. En m\u00eame temps je ne vois pas bien comment j'aurais pu faire mieux : \"Super 11\" Je suis quand m\u00eame assez fier de voir que j'ai r\u00e9ussi \u00e0 part de l'image que on peut voir un peu plus haut et automatiquement la transormer en celle ci-dessus. J'ai donc pu retirer le round autour du chiffre et cela m'a permit de pouvoir d\u00e9zoomer un peu et c'est avec ca que les lettres ont pu \u00eatre mieux reconnues : \"Super H\" \"Super M\" Maintenant je pense qu'il ne reste \"plus qu'\u00e0\" nettoyer un peu tout ce code qui traine de partout pour tout faire fonctionner et impl\u00e9menter un peu de parrallel processing ainsi que de l'asynchrone pour ne pas bloquer le reste du programme. Par ce qu'il faut savoir que en l'\u00e9t\u00e2t, le programme met 25 secondes \u00e0 d\u00e9marrer et consomme presque 2GB de Ram. Certes cela ne veut pas dire que la reconnaissance \u00e0 elle seule prend 25 secondes car au d\u00e9marrage il y a aussi la lecture du fichier de config et la cr\u00e9ation des window etc.. En r\u00e9alit\u00e9 la partie strictement OCR prend dans les 12s si on en croit la fonction stopWatch de C#. Et quand on change d'image la reconnaissance prend 9s. Dans tout les cas c'est BEAUCOUP trop. J'aurais eu comme objectif de faire une reconnaissance toutes les secondes. Je ne sais pas bien si cela va \u00eatre possible mais en tout cas le but va \u00eatre de s'en rapprocher. Pour \u00eatre plus exact et permettre une comparaison, voici les stats exactes Avec un fichier d'images vide : Loading - 11.8s Splitting d'images - 90ms OCR - 12.5s Avec un fichier d'images plein : Loading - 10.8s Splitting d'images - 80ms Ocr - 11.6s En passant d'une image \u00e0 l'autre : Loading - NaN Splitting d'images - 50ms Ocr - 8.8s Donc on peut voir que les deux endroits ou le programme prend le plus de temps c'est au premier d\u00e9marrage quand il faut lire le fichier et setup les windows etc... Et l'OCR qui prend un temps fou. Ce qui est pratique c'est que les presque 2gb de ram sont utilis\u00e9s que au lancement et ensuite l'application n'en utilise que quelques centaines de mb. Le processeur lui tourne entre 10 et 20% ce qui ne va pas durer :) Je vais m'occuper dabord du loading. J'ai essay\u00e9 d'utiliser un Parrallel.For au moment de la cr\u00e9ation des windows, le probl\u00e8me c'est que visiblement les objets windows sont beaucoup trops complexes et utilisent trop de ressources partag\u00e9es pour \u00eatre vraiment thread Safe. J'\u00e9sp\u00e8re que je n'aurais pas trop de soucis avec ca qu'en j'en viendrai \u00e0 l'optimisation de l'OCR... Ce qui me rend fou c'est que cette boucle toute nulle prend plus de dix secondes \u00e0 s'executer et je ne comprend pas bien pourquoi. for ( int i = 0 ; i < NUMBER_OF_DRIVERS ; i ++) { Point tmpPos = new Point ( 0 , FirstZonePosition . Y + i * FirstZoneSize . Height - Convert . ToInt32 ( i * offset ) /*- (i* (FirstZoneSize.Height / 32))*/ ); Zone newDriverZone = new Zone ( MainZoneImage , new Rectangle ( tmpPos , FirstZoneSize )); Bitmap zoneImg = newDriverZone . ZoneImage ; newDriverZone . AddWindow ( new DriverPositionWindow ( zoneImg , new Rectangle ( driverPositionPosition , driverPositionArea ))); newDriverZone . AddWindow ( new DriverGapToLeaderWindow ( zoneImg , new Rectangle ( driverGapToLeaderPosition , driverGapToLeaderArea ))); newDriverZone . AddWindow ( new DriverLapTimeWindow ( zoneImg , new Rectangle ( driverLapTimePosition , driverLapTimeArea ))); newDriverZone . AddWindow ( new DriverDrsWindow ( zoneImg , new Rectangle ( driverDrsPosition , driverDrsArea ))); newDriverZone . AddWindow ( new DriverTyresWindow ( zoneImg , new Rectangle ( driverTyresPosition , driverTyresArea ))); newDriverZone . AddWindow ( new DriverNameWindow ( zoneImg , new Rectangle ( driverNamePosition , driverNameArea ))); newDriverZone . AddWindow ( new DriverSector1Window ( zoneImg , new Rectangle ( driverSector1Position , driverSector1Area ))); newDriverZone . AddWindow ( new DriverSector2Window ( zoneImg , new Rectangle ( driverSector2Position , driverSector2Area ))); newDriverZone . AddWindow ( new DriverSector3Window ( zoneImg , new Rectangle ( driverSector3Position , driverSector3Area ))); MainZone . AddZone ( newDriverZone ); } Alors que Zone.AddWindow c'est simplement : public virtual void AddWindow ( Window window ) { Windows . Add ( window ); } Et windows est simplement une liste. Donc ca ne peut pas \u00eatre ca qui prend du temps. Et les windows que je cr\u00e9\u00e9 ont ca comme code : public DriverPositionWindow ( Bitmap image , Rectangle bounds ) : base ( image , bounds ) { Name = \"Position\" ; } Sachant que le constructeur de base d'une Window c'est : public Window ( Bitmap image , Rectangle bounds ) { Image = image ; Bounds = bounds ; Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } Sachant que TesseractEngine est en statique et que donc il ne devrait... OHLLALALALALALALALALA je suis un imb\u00e9cile... J'ai juste \u00e0 changer ce constructeur avec ca: if ( Engine == null ) { Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } ET le loading ne prend plus que 2-300 ms... Bon c'est une tr\u00e8s belle am\u00e9lioration pour pas tr\u00e8s ch\u00e8r mais bon c'est un peu b\u00eate... Bon je pense que 2-300ms c'est une dur\u00e9e correcte surtout que ca n'est appel\u00e9 qu'une fois pour le lancement. On peut passer \u00e0 la suite maintenant. Alors il y a un grand soucis avec la parallellisation de l'OCR... Tesseract n'est pas par d\u00e9faut une classe \"Thread safe\" ce qui veut dire que je ne peut utiliser de parallell.Foreach sur mes windows pour acc\u00e8l\u00e8rer le traitement drastiquement. Je pourrais par exemple avoir une instance de Tesseract par window sauf que cela fait 20 pilotes * 9 windows chacuns ce qui donne 180 instances ce qui n'est tout simplement pas raisonnable. Je vais donc essayer de voir avec l'utilisation de methodes asynchrones qui me permettraient de faire un genre de flux tendu de reconnaissance. J'avoue que la je navigue un peu \u00e0 vue, je me base sur diff\u00e9rentes infos que je trouve sur des sites un peu perdus et sur chatGPT, j'esp\u00e8re que j'arriverai \u00e0 trouver une solution car 10 secondes de reconnaissance c'est vraiment beaucoup trop. Alors le soucis avec un Engine unique entre toutes les windows c'est qu'il n'est pas possible de process plusieurs images \u00e0 la fois. Je vais donc retirer l'engine unique pour voir si en cr\u00e9er un par window me permet de passer en multithreading. La grande question sera : Est-ce que les ressources suppl\u00e9mentaires que vont prendre la cr\u00e9ation de tous ces engines va compenser enti\u00e8rement le temps gagn\u00e9 avec la paralellisation. Pour stocker les donn\u00e9es dans un premier temps je vais cr\u00e9er un objet DriverData. Ce qu'il y a de pratique avec ca, c'est que je pourrais ajouter du code de v\u00e9rification de certaines donn\u00e9es directement dedans avant de les donner \u00e0 la suite du programme. Et on peut m\u00eame imaginer une impl\u00e9mentation d'une liste de DriverData pour avoir l'historique. Ce qui serait cool ca serait de grouper toutes ces data avec un num\u00e9ro de tour. Placer ensuite la liste de Data dans une DB serait ainsi super simple. Mais il va falloir savoir quoi mettre, quelles infos sont redondantes et prendre en compte le fait que un tour affich\u00e9 sur la page de la F1TV n'est accompli que par certains des premiers pilotes. D'autres pilotes peuvent \u00eatre dans des tours pr\u00e9c\u00e9dents si ils ont du retard. Il faudra r\u00e9fl\u00e9chir \u00e0 cela quand je viendrai au mod\u00e8le. Bon pour y arriver j'ai du faire de gros changements et le r\u00e9sultat n'est peut-\u00eatre pas aussi cool que ce que j'aurais voulut... Voici un petit point sur les performances maintenant J'ai \u00e9galement d\u00e9sactiv\u00e9 le dump d'images. Pour le moment j'ai tout mis en commentaire mais cela pourrait \u00eatre int\u00e9ressant de faire en sorte de pouvoir l'activer en changeant une ou deux variables Au d\u00e9marrage : Loading - 113ms Splitting d'images - 14ms Ocr - 7s En passant d'une image \u00e0 l'autre : Loading - 113ms Splitting d'images - 13ms Ocr - 5s Alors clairement les stats montrent qu'il y a eu un changement mesurable mais bon je pensais pouvoir en gagner un peu plus... Je soupconne la cr\u00e9ation d'engines d'\u00eatre \u00e0 l'origine de ces performances presque d\u00e9cevantes. Autre soucis, il semble que plus je change d'image plus la detection est lente et plus je consomme de RAM. Il va falloir que je travaille encore un peu. J'ai tent\u00e9 de mettre un stopwatch sur une des cr\u00e9ations d'engine Tesseract et le r\u00e9sultat me parait fou... Plus d'une seconde c'est dingue. J'ai test\u00e9 dans d'autres endroits du code et effectivement il semble que la cr\u00e9ation d'un engine prenne entre une et deux secondes ce qui est une ETERNITEE what ! Donc il faut optimiser tout ca. Une id\u00e9e serait de d\u00e9composer le threading mais cela me demanderait un gros refactor et je n'ai pas envie d'en refaire un la... Sinon, une fois qu'ils sont cr\u00e9\u00e9s ils ne prennent pas de temps du tout. Cr\u00e9er une fois tous les engines et ensuite les utiliser pourrait \u00eatre une bonne id\u00e9e. Cela prendrait longtemps au load mais ensuite les reconnaissances devraient \u00eatre super rapides. Ok alors ca c'est d\u00e9ja plus ce \u00e0 quoi je m'attendais ! On est de nouveau \u00e0 plus de 10s de loading time mais on est descendu \u00e0 deux secondes par OCR. (Bon autre soucis, l'utilisation de la RAM est ridicule plus de 2gb mais ce qui m'inqui\u00e8te c'est que j'ai l'impression qu'elle augmente plus on change d'image) J'ai r\u00e8gl\u00e9 (en partie) le soucis en obligeant le GC (Garbage Collector) \u00e0 collecter apr\u00e8s chaque detection. m\u00eame apr\u00e8s 50 detections l'utilisation de la ram se stabilize autour des 2GB. Bon en paralellisant la cr\u00e9ation des Engines le soucis c'est que cela demande d'allouer beaucoup trop de m\u00e9moire d'un coup alors le programme se fige pendant genre cinq secondes avant de tout cr\u00e9er. Du coup m\u00eame si la cr\u00e9ation est plus rapide, on se retrouve avec un temps total plus long... Je pense que l'on va devoir se contenter de ces dix secondes. Bon la j'allais tenter de faire la documentation mais je viens de me rendre compte que la detection de temps au tour est pas vraiment encore id\u00e9ale... J'ai r\u00e9ussi \u00e0 changer un petit peu le programme de reconnaissance pour rendre la reconnaissance un peu meilleure mais cela a drastiquement augment\u00e9 le temps requis pour d\u00e9coder... On arrive \u00e0 3.5 secondes. Je vais tenter de rajouter un peu de parralell processing sur les boucles de traitement voir si cela peut aider. Alors effectivement cela aide pas mal, on arrive maintenant \u00e0 faire une detection presque tout le temps en dessous de la seconde. Et j'ai aussi du changer un peu le fonctionnement de la detection des Temps au tour. Et voila je pense que je vais m'arr\u00eater la pour la partie d\u00e9codage. Je ne pense pas que je peux facilement faire mieux que ca et il faut que j'avance dans d'autres parties du projet. Je vais pouvoir commencer \u00e0 documenter un peu toute la partie OCR. Il faut que je prenne le temps de le faire bien car c'est la partie la plus int\u00e9ressante du projet et ou je pense que j'aurai le plus essay\u00e9 de choses qui vallent le coup d\u00eatres racont\u00e9es. J'ai aussi pass\u00e9 pas mal de temps sur le poster du projet. J'avais fait des croquis au crayon de ce \u00e0 quoi je pensais, cependant apr\u00e8s de longues discussions avec M.Garcia ils n'\u00e9taient pas forc\u00e9ment tr\u00e8s bons car ils ne repr\u00e9sentent pas assez bien le fonctionnement du projet et sont un peu trop marketings. Du coup j'ai fait une premi\u00e8re version au propre : \"Poster V1\" Mais je n'\u00e9tais pas forc\u00e9ment content du r\u00e9sultat et il manquait des choses je trouve comme par exemple l'utilisation de Selenium. J'ai donc repass\u00e9 des heures \u00e0 faire une seconde version : \"Poster V2\" La police d'\u00e9criture n'est pas encore la bonne mais cela va venir. Mais je pr\u00e9f\u00e8re d\u00e9ja beaucoup cette version \u00e0 la premi\u00e8re. Je ne sais pas encore si la version finale sera une version plus travaill\u00e9e de ce poster ou compl\u00eatement autre chose mais pour l'instant je suis \u00e0 peu pr\u00e8s content de cette version. Je le trouve un tout petit peu trop brouillon ou avec trop d'infos mais il m'a \u00e9t\u00e9 de nombreuses fois reproch\u00e9 de ne pas assez montrer le fonctionnememt interne et je ne peux pas faire plus simple. L'ajout des nombres pour compartimenter le projet ajoute de la structure mais je me demande si cela suffit. Maintenant que je suis \u00e0 peu pr\u00e8s content de mon code pour l'OCR je vais commencer sa documentation. (Uniquement son fonctionnement interne pas comment s'en servir car cela va changer) Bon j'ai cr\u00e9\u00e9 u nouveau projet selenium mais m\u00eame avec les bonnes libraries je n'arrivais pas \u00e0 faire fonctionner firefox j'avais toujours une erreur \"OpenQA.Selenium.WebDriverException: 'Cannot start the driver service on http://localhost:51481/'\" et j'ai pu r\u00e8gler le probl\u00e8me en t\u00e9l\u00e9chargeant directement le gecko driver depuis le git https://github.com/mozilla/geckodriver/releases et utiliser le fichier directement dans le service : var service = FirefoxDriverService . CreateDefaultService ( AppDomain . CurrentDomain . BaseDirectory + @\"geckodriver-v0.27.0-win32\\geckodriver.exe\" ); FirefoxOptions options = new FirefoxOptions (); var driver = new FirefoxDriver ( service , options ); Le seul probl\u00e8me c'est que du coup il faut tout le temps d\u00e9placer le fichier dans le dossier bin si je clone le projet. Il faudra faire un installeur dans la version finale qui s'occupe de tout je pense. Je me suis dit que j'allais garder la doc pour le retour des vacances quand j'aurai un bureau un clavier et un setup complet un peu propres. Bon il va falloir que je parle de la r\u00e9cup\u00e9ration de cookie. J'ai d\u00e9ja pu travailler lors d'un poc sur la meilleure facon de prendres des screenshots de la F1TV : Avoir une page chrome ouverte avec le feed en plein \u00e9cran et un programme qui prend des captures d'\u00e9crans. Avoir une cam\u00e9ra qui prend en photo l'\u00e9cran au cas ou chrome et Firefox emp\u00eachent la prise de captures d'\u00e9crans. R\u00e9cup\u00e8rer directement le feed en faisant du reverse engeneering de la plateforme. Simuler un chrome en background qui prenne des screenshot sans qu'on aie \u00e0 le voir. Dans toutes ces options, je dirais que la pire \u00e9tait celle de la cam\u00e9ra qui filme l'\u00e9cran, mais \u00e0 l'\u00e9poque c'\u00e9tait encore envisageable comme solution de dernier recours. Le soucis de cette solution c'est l'horreur que serait la partie OCR avec une image de tr\u00e8s mauvaise qualit\u00e9. Une autre option qui m'aurait vraiment emb\u00eat\u00e9 aurait \u00e9t\u00e9 de devoir garder une page de Chrome ou Firefox ouverte quelque part sur un \u00e9cran pour que le programme puisse prendres des captures d'\u00e9crans. C'est de loin l'option la plus simple et la plus logique mais elle poss\u00e8de pour moi de tr\u00e8s gros points noirs : On ne peut pas certifier l'int\u00e9grit\u00e9 des donn\u00e9es car l'utilisateur a le contr\u00f4le total sur le feed. Il peut mettre pause, avancer, reculer, tout casser sans faire expr\u00e8s en ouvrant autre chose sur son ordi qui se mette pile devant. Bref c'est un peu bancale. Et surtout on bloque une partie non significative de l'\u00e9cran de l'utilisateur avec des infos redondantes. Et je peux vous dire que quand je commente la F1 j'ai besoin de beaucoup d'informations et que chaque centim\u00e8tre d'\u00e9cran est crucia\u00e9 ! Alors avoir un \u00e9cran complet bloqu\u00e9 est juste un point bloquant qui m'emp\u00eacherait d'utiliser l'app aussi bonne soit-elle dans ses pr\u00e9dictions. Mais bon si aucune autre methode ne fonctionne ce qui est bien c'est que celle la est plut\u00f4t simple \u00e0 mettre en place. Ensuite reverse engeneer le feed serait l'option la plus classe, cependant c'est la plus complexe et la plus bancale au niveau l\u00e9gal haha. L'id\u00e9e serait de r\u00e9cup\u00e8rer le lien vers le broadcast g\u00e9n\u00e9ral et de comprendre comment il fonctionne pour le d\u00e9coder nous m\u00eame pendant un Grand Prix. Seuls soucis : Il n'est pas possible de faire des tests en dehors des periodes de Grand Prix (Et je rappelle que c'est des p\u00e9riodes ou je travaille en plus) Difficile de faire un syst\u00e8me qui marche pareil pour les rediffusions et les lives. (En effet les liens des rediff sont beaucoup plus simple \u00e0 r\u00e9cup\u00e8rer mais ne fonctionnent pas du tout pareil et pour tester l'app il est essentiel de pouvoir s'entrainer sur des anciens Grand Prix) Dernier GROS soucis, je ne sais tout simplement pas faire ca lol. Je ne sais pas comment faire. Peut-\u00eatre que avec des profs qui m'aident et chat gpt ainsi qu'internet je pourrais potentiellement n\u00e9gocier un truc mais c'est hautement improbable et cela serait une perte de temps folle si je n'y arrive pas. Derni\u00e8re option que je trouve la plus s\u00e9duisante. Simuler une instance de Chrome ou de Firefox (Le soucis avec chrome c'est qu'il impl\u00e9mente l'utilisation de DRM dans les vid\u00e9os qui fait qu'il est tr\u00e8s difficile de passer outre la s\u00e9curit\u00e9 avec un bot) pour ensuite prendre des captures d'\u00e9crans automatiquement. Cette solutions offre pleins d'avantages : Pas de place prise sur l'\u00e9cran L'int\u00e9grit\u00e9 des donn\u00e9es est assur\u00e9e car c'est le programme qui d\u00e9cide d'ou partir et de si il met pause ou non C'est une option complexe mais beaucoup moins que le reverse engeneering Elle permet de ne demander presque aucun input de la part de l'utilisateur. Mais elle pose quelques probl\u00e9matiques : Comment se connecter automatiquement sans \u00eatre detect\u00e9 par un Bot et sans demander \u00e0 l'utilisateur ses identifiants (Pour des raisons \u00e9videntes qui sont : QUI VA METTRE SES IDENTIFIANTS SUR UNE VIEILLE APP COMME LA MIENNE??) Comment faire en sorte que le programme prenne les meilleures captures dans la meilleure qualit\u00e9 et en plein \u00e9cran. Mais j'ai d\u00e9cid\u00e9 de partir sur cette option. Pour ce faire j'utilise Selenium. J'ai pu tester Puppetteer Sharp et m\u00eame si dans un premier temps j'ai pu avancer asez vite, malheureusement il y a des bugs qui rendent son utilisation impossible dans notre contexte. J'ai donc d\u00e9cid\u00e9 de tout faire en utilisant un portage de Selenium dans mon programme. Voici un exemple de code qui va ouvrir FireFox et qui va lancer un RickRoll var service = FirefoxDriverService . CreateDefaultService ( AppDomain . CurrentDomain . BaseDirectory + @\"geckodriver-v0.27.0-win32\\geckodriver.exe\" ); service . Host = \"127.0.0.1\" ; service . Port = 5555 ; FirefoxOptions options = new FirefoxOptions (); options . AddArgument ( \"--disable-headless\" ); var driver = new FirefoxDriver ( service , options ); driver . Navigate (). GoToUrl ( \"https://www.youtube.com/watch?v=dQw4w9WgXcQ&autoplay=1&mute=1\" ); Dans cet exemple on d\u00e9sactive le \"Headless\" pour qu'on puisse voir ce que fait l'app car sinon tout est invisible. Alors dans les faits la vid\u00e9o youtube ne se lance pas du tout car il y a des pubs et des prompts de cookies que l'on doit accepter etc... ce qui montre les diff\u00e9rents challenges que l'on va devoir surmonter pour vraiment faire ce que l'on veut. Mais un petit d\u00e9tail extr\u00eamement important, la F1TV est un programme payant un peu comme netflix. Ce qui veut dire que pour acc\u00e8der au contenu il faut \u00eatre connect\u00e9. Sauf que une instance de firefox cr\u00e9\u00e9 par Selenium est comme une page de naviguation priv\u00e9e, ce qui veut dire que si on va sur la page de la F1TV on est pas connect\u00e9s. Je pourrais tout \u00e0 fait demander \u00e0 l'utilisateur de me donner ses identifiants pour que j'aille ensuite automatiquement me connecter sauf que cela pose deux soucis: Personne ne voudra mettre ses identifiants sur mon programme La page de login de la F1TV a \u00e9t\u00e9 prot\u00e8g\u00e9e avec la meilleure technologie de detection de bots que je connaisse. Presque aucun site n'arrive \u00e0 me detecter sauf eux ! Donc c'est tout simplement impossible d'utiliser cette technique. Ensuite je me suis rappel\u00e9 que ce que la page stocke pour me permettre de rester connect\u00e9 ce sont des cookies. Et si je mets le bon cookies dans Selenium alors je serai connect\u00e9. Dans un premier temps je voulais faire un syst\u00e8me ou l'utilisateur irait prendre dans son chrome son cookie et le copie colle dans mon programme mais c'est immonde. C'est alors que vient la partie r\u00e9cup\u00e8ration de cookies ! Tous les cookies de chrome sont stock\u00e9s dans une base de donn\u00e9es SQLITE. On pourrait se dire Banco il suffit d'aller dedans et de retrouver tous les cookies et se connecter. Sauf que, pas b\u00eates, les \u00e9quipes de chrome ont d\u00e9cid\u00e9 que c'\u00e9tait une bonne id\u00e9e d'encoder les cookies pour que tout le monde ne puisse pas venir y mettre son nez... En effet les cookies peuvent contenir des informations importantes. Cela fait que pour utiliser ces cookies il faut pouvoir les d\u00e9coder. Mon hypoth\u00e8se a \u00e9t\u00e9 que si ces cookies peuvent \u00eatre lus par Chrome m\u00eame hors connexion, c'est que la cl\u00e9 de d\u00e9codage existe sur l'appareil et qu'il suffit de la trouver. ET C'EST LE CAS! Apr\u00e8s pas mal de recherches j'ai pu voir que la cl\u00e9 de d\u00e9codage existe bel et bien et qu'il suffit de la d\u00e9coder en utilisant la librairie DPAPI pour la lire. Avec cette cl\u00e9 on peut ensuite d\u00e9coder les cookies et leurs valeurs ce qui veut dire qu'il est th\u00e9oriquement possible d'automatiser le processus sans que l'utilisateur n'aie rien \u00e0 faire. J'ai d\u00e9cid\u00e9 de faire la partie r\u00e9cup\u00e8ration en python pour deux raison : Je n'arrivais pas \u00e0 trouver une bonne impl\u00e9mentation de DPAPI en C# qui me permettait de d\u00e9coder la cl\u00e9. Il existe beaucoup plus de documentation en Python pour ce qui est de la cryptographie et donc si Chrome change de fonctionnement il sera beaucoup plus simple de changer cette partie en particulier sans avoir \u00e0 recompiler le code C#. J'ai donc avec l'aide d'internet et de ChatGPT cr\u00e9\u00e9 ce script : def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key def decrypt_payload ( cipher , payload ): return cipher . decrypt ( payload ) def generate_cipher ( aes_key , iv ): return AES . new ( aes_key , AES . MODE_GCM , iv ) def decrypt_password ( buff , master_key ): try : iv = buff [ 3 : 15 ] payload = buff [ 15 :] cipher = generate_cipher ( master_key , iv ) decrypted_pass = decrypt_payload ( cipher , payload ) decrypted_pass = decrypted_pass [: - 16 ] . decode () # remove suffix bytes return decrypted_pass except Exception : # print(\"Probably saved password from Chrome version older than v80\\n\") # print(str(e)) return \"Chrome < 80\" master_key = get_master_key () cookies_path = Path ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Default \\\\ Network \\\\ Cookies\" ) if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" ) Ce programme va faire tout ce que j'ai expliqu\u00e9 et va ensuite stocker les r\u00e9sultats dans un CSV pour qu'il soit facile d'y acc\u00e8der depuis le C#. Alors oui cela pose certaines questions de s\u00e9curit\u00e9. Car en effet je prend tous les cookies, les d\u00e9code et les stocke. Ce qui veut dire que je pourrais tout \u00e0 fait envoyer ces donn\u00e9es quelque part, par exemple un compte Netflix, et me rincer. Si je devais rendre le projet ouvert au public je pense qu'il faudra que cela soit mentionn\u00e9 clairement et que le projet soit open source pour que les utilisateurs puissent verifier que je ne fais pas ca. Maintenant de l'autre c\u00f4t\u00e9 j'ai juste \u00e0 lire le CSV et le tour est jou\u00e9 ! (Trouver cette solution m'a pris une semaine de vacances \u00e0 l'\u00e9poque) Bon j'ai r\u00e9ussi \u00e0 faire le programme se connecter et naviguer etc.. Par contre quelque chose que j'ai voulu ajouter et qui m'a pris pas mal de temps c'est de faire en sorte de pouvoir selectionner la qualit\u00e9. Pour changer la qualit\u00e9 du feed il faut cliquer sur settings et ensuite prendre le menu deroulant et selectioner 1080p. Le soucis c'est le que la value du select est jamais la m\u00eame. Elle commence toujours pas \"1080_\" mais ensuite ca peut \u00eatre \"1080_45930285\" ou \"1080_56801\" la suite est apparemment random. J'ai donc du utiliser ce code pour le selectioner quand m\u00eame : IWebElement settingsButton = driver . FindElement ( By . ClassName ( \"bmpui-ui-settingstogglebutton\" )); settingsButton . Click (); IWebElement selectElement = driver . FindElement ( By . ClassName ( \"bmpui-ui-videoqualityselectbox\" )); SelectElement select = new SelectElement ( selectElement ); IWebElement selectOption = selectElement . FindElement ( By . CssSelector ( \"option[value^='1080_']\" )); selectOption . Click (); Sauf que pour que cela marche je dois avant cliquer sur le bouton des settings le probl\u00e8me c'est qu'il est invisible alors on doit le faire apparaitre. J'ai tent\u00e9 de le faire aparaitre en bougeant la souris, en cliquant \u00e0 un endroit pr\u00e9cis, impossible de le faire marcher correctement. Puis j'ai eu l'id\u00e9e de mettre pause en envoyant un appui sur la touche Espace et ca a permit de d\u00e9couvrir le bouton et permettre qu'on clique dessus. Ca peut paraitre tout b\u00eate mais rien que ca, ca m'a pris un temps consid\u00e9rable. Bon pour ce qui est du timecode de la vid\u00e9o. Je pense qu'il serait trop complexe de faire en sorte que selenium change le slider de progression de la vid\u00e9o. Alors j'ai fait quelques tests et apparemment, si on quitte la F1TV sur un timecode de la vid\u00e9o que on donne au programme, comme il r\u00e9cup\u00e8re tous les cookies de la F1TV il commencera de la. Donc si on veut utiliser le programme avec des Grand Prix ayant d\u00e9ja eu lieu, on peut le faire, seulement il faudra juste au pr\u00e9alable avoir choisit le bon timecode dans le page de la F1TV avant de le lancer. Ce qui est int\u00e9ressant c'est que la page de la F1TV ressemble \u00e0 ca au d\u00e9part : \"Empty F1TV\" Je pense qu'une bonne id\u00e9e serait de dire au programme que c'est la grille de d\u00e9part et ensuite d\u00e8s qu'il d\u00e9tecte un secteur il sait que la course a commenc\u00e9. Lundi 24 Avril 2023 Aujourd'hui c'est jour de documentation. J'ai pas mal travaill\u00e9 pendant les vacances mais je n'ai pas encore pu faire de vraie documentation correcte du fonctionnement. Du coup je vais m'en charger aujourd'hui et peut-\u00eatre un peu demain. Ok normalement je ne devrais faire que de la documentation mais je ne peux pas passer \u00e0 cot\u00e9 de ca... Le probl\u00e8me que j'ai avec les pneus ou parfois il d\u00e9tecte un H au lieu d'un '11' et ce genre de choses c'est \u00e0 cause de ma methode \"RemoveBG\" Qui va retirer tous les pixels plus sombres que le background. Sauf que cela va aussi retirer des pixels dans le chiffre lui m\u00eame et qui va donc defigurer les 11 : \"diformed 11\" \"diformed 11\" J'ai r\u00e9ussi \u00e0 les changer en : \"less diformed\" \"less diformed\" Mais au final cela n'a pas augment\u00e9 la pr\u00e9cision de la reconnaissance. Je pense que je vais donc devoir encore changer. Je pense que une bonne facon de trouver serait dabord de trouver la couleur du pneu. Et si il n'y a pas assez de couleur alors c'est que le pneu contient une lettre. Le but est d'arr\u00eater de chercher des lettres ou des chiffres. Comme ca les 11 arr\u00eateront d'\u00eatre pris pour des 'H' En fait on peut faire encore plus simple que ca. On peut simplement regarder la couleur dominante et determiner le pneu. En effet m\u00eame si il y a une lettre sur fond noir pour d\u00e9crire le pneu, mon methode de r\u00e9cup\u00e8ration de la couleur dominante ommet les pixels trop noirs alors il est quand m\u00eame possible de determiner le type de pneus. Et tout simplement si il n'arrive pas \u00e0 lire le chiffre c'est que c'est une lettre et que donc on est \u00e0 0 tours. Cela marche plut\u00f4t bien et cela simplifie pas mal le processing. Voila, la je vais me remettre \u00e0 la documentation sinon je vais encore prendre du retard. Mardi 25 Avril 2023 Encore une fois j'ai pris du temps de doc pour changer des choses sur la partie OCR. Mais en m\u00eame temps en documentant je vois des choses que j'ai soit mal fait soit que je pourrais faire mieux en changeant tr\u00e8s peu de choses. J'\u00e9sp\u00e8re que les changement que j'ai fait vont aider au moins \u00e0 la coh\u00e9rence du code et un peu pour les performances. Il semble que dans les conditions que j'ai test\u00e9 le nombre de tour soit plut\u00f4t fiable mais je pense que je devrai faire un peu de travail en aval dans la r\u00e9cup\u00e9ration de ces donn\u00e9es car je sens que cela va poser probl\u00e8me quelques fois. Je pense que en utilisant bien l'historique on peut potentiellement se passer de l'utilisation de ce chiffre pas toujours compl\u00eatement fiable. Mais sinon aujourd'hui c'est encore une fois un gros jour de doc. J'essaie d'expliquer les diff\u00e9rents proc\u00e9d\u00e9s avant de les oublier. J'essaie aussi de donner un maximum d'exemples sous formes de photos interm\u00e9diaires mais ca me prend pas mal de temps car il faut que j'ajoute un peu partout dans le code des lignes pour sortir des images interm\u00e9diaires. En plus de la documentation je me suis aussi beaucoup occup\u00e9 de nettoyer mon code et je suis assez content par ce que m\u00eame en ayant du rajouter des couches de complexit\u00e9 pour mieux reconnaitres les temps au tour j'arrive \u00e0 un temps de processing parfois en dessous des 2 secondes ce que je trouve honorable. Quand j'aurai finit de nettoyer tous mes fichiers je ferai une release sur gitea et ce sera la version que j'utiliserai quand je voudrai faire un merge avec les autres parties du projet. J'ai beaucoup beaucoup boss\u00e9 aujourd'hui et je sui bien mort. Faire autant de documentation et de nettoyage de code c'est pas forc\u00e9ment bon pour le cerveau je crois. J'ai besoin d'une sieste. Demain je pense que je vais commencer \u00e0 avancer sur la partie r\u00e9cup\u00e8ration des images. Je sais que la je fais un peu passer les tests \u00e0 la trappe mais d\u00e9ja j'en ai fait tout le long du d\u00e9veloppement de OCR_DECODE et il faut vraiment que j'avance, quitte \u00e0 revenir dessus quand j'aurai merge les deux projets ensemble. 26 Avril 2023 Aujourd'hui je vais devoir m'occuper de la partie r\u00e9cup\u00e9ration des images. J'ai d\u00e9ja eu l'occasion d'avancer sur ce projet pendant mopn poc et mes vacances. Donc la le but ca va \u00eatre de voir ce qui manque comme v\u00e9ritables features et ensuite je vais pouvoir m'occuper de la vue et de son int\u00e9gration avec le d\u00e9codage. Ok donc maintenant que j'au un programme qui arrive \u00e0 prendre des images depuis la F1TV correctement et en bonne r\u00e9solution. Je pense qu'il est temps de passer \u00e0 l'impl\u00e9mentation de la Forme que ca va prendre. C'est important de se poser au moins cinq minutes la question de comment je pr\u00e9vois de faire car m\u00eame si ca n'est pas la version finale, cette derni\u00e8re prendra tr\u00e8s fort inspiration du desing que je vais faire. Dans cette form j'aurais besoin de : Pouvoir selectionner un Grand Prix en ins\u00e8rant l'URL du feed. Pouvoir lancer la calibration si besoin Indiquer le titre et la date du Grand Prix Indiquer si le Grand Prix vient de commencer ou si il y a d\u00e9ja un certain nombre de tours lanc\u00e9s. Et c'est \u00e0 peu pr\u00e8s tout en fait... J'ai tellement pouss\u00e9 pour avoir un programme qui fait tout tout seul que il ne me faut pas grand chose de plus. Je pense que ce qui serait pas mal ca serait du coup d'utiliser ce temps pour bien impl\u00e9menter la calibration qui elle aura besoin d'une UI un peu plus bal\u00e8ze. On pourrait m\u00eame imaginer que la calibration fasse partie int\u00e9grante des settings... Ca serait peut-\u00eatre bien que quand l'application se lance on se retrouve sur la page principale d'affichage de donn\u00e9es et qu'on puisse simplement cliquer sur la page options qui contient la page calibration et qui permet de rentrer les infos du Grand Prix. Je pense que je vais faire ca. Voici l'interface que j'ai d\u00e9velopp\u00e9e pour regrouper tout ca : \"Screen\" La police le style le placement et les couleurs ne sont pas d\u00e9finitfs, cependant je pense que c'est un bon d\u00e9but. Le but maintenant va \u00eatre de permettre de faire fonctionner la calibration et la r\u00e9cup\u00e8ration d'images. Si j'arrive \u00e0 faire fonctionner ces deux choses sur un m\u00eame projet avant la fin de la semaine cela serait super ! Bon J'ai pu avancer sur l'int\u00e8gration de Selenium mais cela prend un peu de temps car je veux impl\u00e9metner un moyen de pouvoir prendre une Screenshot \u00e0 nimporte quel moment et pas juste en boucle. Demain je finis de faire fonctionner ca et ensuite je commence le cablage du reste. Jeudi 27 Avril 2023 C'est assez dur de faire l'importation car il y a des petites diff\u00e9rences qui obligent \u00e0 presque tout r\u00e9\u00e9crire. En fait le programme de calibration avait d\u00e9ja impl\u00e9ment\u00e9 la fonction de Windows et de Zones mais il fonctionnait juste assez diff\u00e9remment pour qu'il faille tout refaire. La je suis en train de perdre \u00e9norm\u00e9ment de temps \u00e0 cause d'un soucis de coordonn\u00e9es. J'ai repris le code de la calibration pour detecter ou l'utilisateur a cliqu\u00e9 pour cr\u00e9er les zones. Cependant, je n'arrive pas \u00e0 le faire fonctionner correctement. La zone est tout le temps d\u00e9cal\u00e9e en haut et en bas mais pas de la m\u00eame facon. En haut, la valeur Y est trop grande alors que en bas la valeur Y est trop petite... Je ne comprends pas bien pourquoi. Si c'\u00e9tait un simple d\u00e9calage cela ne serait pas compliqu\u00e9 \u00e0 g\u00e8rer mais la... J'ai un soucis \u00e9galement avec la r\u00e9solution des screenshots que je r\u00e9cup\u00e8re en full Headless. Voici un exemple de r\u00e9solution que j'arrive \u00e0 r\u00e9cup\u00e8rer sans le headless : \"High Res\" \"Low Res\" Il y a clairement un soucis et le probl\u00e8me c'est que avec une r\u00e9solution pareille, impossible de faire une reconnaissance correcte. BON J?EN PEUX PLUS LA. Ca fait des heures que je bosse sur ce probl\u00e8me d\u00e9bile et impossible de trouver une solution. J'ai essay\u00e9 cinq facons de forcer le browser headless a prendre une plus haute r\u00e9solution aucune ne fonctionne je ne comprends pas. A chaque fois que je me retrouve avec une r\u00e9solution de 1366 x 768 Ou une variante de basse r\u00e9solution du style. J'en peux plus je ne trouve aucune r\u00e9ponse sur internet ni m\u00eame avec chatGPT. Super... La seule chose que j'ai pu faire qui change quelque chose fait que les images font maintenant du 926x517... j'ai un peu envie de commentre un crime de guerre au plus vite. Vendredi 28 Avril 2023 Une des solutions que je n'ai pas encore essay\u00e9 est de changer ma version de GeckoDriver. Sauf que ca m'oblige \u00e0 changer les versions de mes libraries ce qui est tr\u00e8s p\u00e9nible, je vais continuer le debugging dans le projet Selenium_clean. Il faut savoir que la librairie de Selenium que j'utilise est bloqu\u00e9e en 0.27 ce qui fait que je ne peux utiliser qu'une version obsol\u00e8te du Gecko Driver. J'ai tent\u00e9 de changer vers une version en 64 bits du GeckoDriver 0.27 mais pareil, je me retrouve toujours avec des images de M. J'essaie toutes les solutions que je trouve sur internet aucune ne convient c'est infernal. J'essaie de changer la r\u00e9solution DPI, j'essaie de changer les param\u00eatres par d\u00e9faut des player de Firefox, j'essaie de changer la r\u00e9solution pendant et au d\u00e9but de l'execution IMPOSSIBLE DE FAIRE MARCHER CETTE MERDE C'EST PAS POSSIBLE !!! J'ai essay\u00e9 avec chrome mais je ne peux pas l'utiliser car les DRM m'emp\u00eacheront de prendre des screenshot du flux vid\u00e9o. J'ai essay\u00e9 de faire tourner avec edge mais edge ne peut pas tourner en headless. JE VAIS DEVENIR FOUF FPWQOVMQEKOVNVIBDBJDAIVOBI. ET MAINTENANT JE N'ARRIVE PLUS A FAIRE DE PROJET AVEC SELENIUM VOIWQNV(UEWQBVU)WEQN=OEJNIVIUWVBWUEV ON CHERCHE A ME FAIRE PETER UN PLOMB C'EST PAS POSSIBLE GIWEGUWEQN VOICI UN EXEMPLE DU CODE QUE JE DEMANDE A UN NOUVEAU PROJET AVEC EXACTEMENT LES MEMES LIBRARIES INSTALLEES : // Create a new FirefoxDriver instance IWebDriver driver = new FirefoxDriver (); // Navigate to the specified URL driver . Navigate (). GoToUrl ( \"https://www.example.com\" ); // Do something with the driver (e.g., find elements or take screenshots) // Quit the driver driver . Quit (); Je ne demande que ca ET MEME CA CA NE VEUT PAS FONCTIONNER VOIWENB)IWUQENV Oui je suis un peu \u00e9nerv\u00e9 ca se voit? A bon? Et maintenant NUGGET ne fonctionne plus... j'en peux plus la. Je ne peux plus t\u00e9l\u00e9charger de librairie sur aucun de mes projets... J'ai tent\u00e9 de supprimer le fichier de config et red\u00e9marrer Visual Studio mais cela ne fait rien. J'ai aussi tent\u00e9 de faire un 'nugget restore' toujours rien. Bon apparemment je ne suis pas le seul qui ne peut pas acc\u00e8der \u00e0 Nuget donc bon c'est pas juste chez moi qu'il y a un soucis. Mais m\u00eame en mettant ma 4G pour me connecter, je n'arrive pas \u00e0 acc\u00e8der \u00e0 certains sites y compris Nuget et je ne peux pas download de librairies... Je ne comprends pas ce qui se passe et du coup je ne peux juste pas bosser... J'ai red\u00e9marr\u00e9 trois fois mon pc et visual studio, j'ai essay\u00e9 de changer mes settings DNS etc... impossible de bosser. Je crois que je n'aurais pas du me reveiller aujourd'hui. Bon je vais tenter d'avancer sur mon poster en attendant que le r\u00e9seau soit en meilleur \u00e9tat. Lundi 1 Mai 2023 Bon je bosse depuis chez moi donc j'esp\u00e8re que Nuget va mieux fonctionner. Apr\u00e8s un weekend \u00e0 r\u00e9fl\u00e9chir au sujet de cette resolution je me suis dit deux choses. La seule personne sur internet que j'ai vu avoir le meme soucis avait une r\u00e9solution de 1920x1200 comme moi. Cela veut donc s\u00fbrement dire que le soucis vient de cette r\u00e9solution de laptop comme moi. Si vraiment je n'arrive pas dans un premier temps \u00e0 faire fonctionner le Headless correctement, je peux toujours laisser la page de c\u00f4t\u00e9 et m'occuper du reste du programme. Certes ca serait vraiment infernal d'avoir \u00e0 garder une page chrome ouvert en tous temps et en plus elle doit \u00eatre en plein \u00e9cran mais bon... Si il n'y a vraiment pas d'autres solutions malheureusement je serai bien oblig\u00e9. BON ! JE N'ARRIVE MEME PLUS A FAIRE UN PROJET QUI UTILISE SELENIUM ET QUI MARCHE JE VAIS FAIRE BR\u00dbLER GENEVE. C'est pas possible serieux, je ne comprends pas j'essaie tout ce que je trouve et impossible de juste lancer firefox c'est du grand nimporte quoi. Je prend les m\u00eame putain de librairies que sur les autres projets les m\u00eames versions, je prend le m\u00eame exact code. Sur le nouveau projet impossible de le faire fonctionner. Je commence \u00e0 croire que on essaie de me faire p\u00eater un cable. Du coup dans un \u00e9lan de d\u00e9sespoir je vais tenter de passer sur une autre librairie qui avec un peu de chance marche et en plus me permettrais de prendre des foutues screenshot dans le bon format. Les deux seules librairies qui pourraient potentiellement faire l'affaire sont les librairies : PhantomJS CefSharp Je vais les tester et simplement prier pour qu'elles fonctionnent et que je puisse faire ce que je veux avec. Alors pour le moment avec CEFSharp j'arrive \u00e0 lancer une instance de chrome et prendre une screenshot avec ce code : CefSettings settings = new CefSettings (); settings . CachePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . LocalApplicationData ), \"CefSharp\\\\Cache\" ); // Set cache path settings . LogSeverity = LogSeverity . Disable ; // Disable logging Cef . Initialize ( settings ); // Initialize CEF using ( var browser = new ChromiumWebBrowser ( \"www.google.com\" , new BrowserSettings ())) // Launch Chromium in off-screen mode { browser . Load ( \"https://www.example.com\" ); // Navigate to the test URL browser . Size = new Size ( 1920 , 1080 ); // Set the browser size to 1920x1080 browser . ScreenshotAsync (). ContinueWith ( task => { var bitmap = task . Result ; bitmap . Save ( \"screenshot.png\" , System . Drawing . Imaging . ImageFormat . Png ); // Take a screenshot and save it as a PNG file }). Wait (); } Cef . Shutdown (); // Shutdown CEF Avec ca il faut ces using : using System ; using System.Drawing ; using System.IO ; using CefSharp ; using CefSharp.OffScreen ; C'est assez prometteur m\u00eame si il faut encore beaucoup pour remplacer selenium. Ah bah lol en fait non on peut pas utiliser cette librarie pour faire tourner firefox... J'EN AI MARRE J'AVAIS CHERCHE PRECISEMENT UNE LIB QUI MARCHE AVEC FIREFOX Et phantomJS non plus ne fonctionne pas avec firefox... J'en ai marre. Donc je vais plut\u00f4t partir sur la librairie GeckoFX qui semble pouvoir contr\u00f4ler une instance de firefox. Mais j'avais justement pris un putain de projet C# et pas JS pour ne pas me taper ces probl\u00e8mes de librairies... Et si cette option ne fonctionne pas mon dernier espoir sera de directement int\u00e9ragir avec le geckodriver.exe et la ca risque de pas \u00eatre dr\u00f4le. JE NE COMPRENDS RIEN !!!!! Ca n'a aucun sens la doc est inexistante le seul lien qui pourrait amener sur une doc envoie sur la page principale de bitbucket. Tous les exemples de code que je trouve ne fonctionnent pas. Je n'arrive \u00e0 rien je commence \u00e0 devenir fou. Tout ce travail pour rien c'est pas possible. M\u00eame en essayant directement d'int\u00e9ragir avec le process geckodriver.exe je ne peux pas arriver \u00e0 mes fins. J'arrive \u00e0 lancer le service et tout, mais je n'arrive pas \u00e0 vraiment contr\u00f4ler ce qu'il se passe donc impossible de venir prendre des screenshot. Je ne sais tout simplement pas quoi faire ... Je suis bloqu\u00e9. Je me suis cass\u00e9 la t\u00eate \u00e0 faire un truc qui marchait bien avec selenium et tout. Mais maintenant plus rien ne fonctionne du jour au lendemain et il n'y a simplement aucune alternative. Je vais essayer de changer directement le projet Selenium_Clean mais bon ca va pas \u00eatre dr\u00f4le. Ok alors j'ai tout repris depuis le d\u00e9but et je crois que j'ai enfin une solution. Pour la trouver j'ai re-essay\u00e9 toutes les techniques que j'avais tent\u00e9 avant mais dans l'ordre et en les isolant \u00e0 chaque fois. Cela inclus : Tenter de changer la densit\u00e9 de pixels. En effet je me suis dit que comme la r\u00e9solution \u00e9tait plus basse le soucis \u00e9tait que le virtual screen avait simplement une DPI r\u00e9duite. profile.SetPreference(\"layout.css.devPixelsPerPx\", \"2.0\"); J'ai aussi tent\u00e9 de r\u00e9duire \u00e0 un seule le nombre de process de Firefox. J'ai pu lire sur internet que parfois cela pouvait influer sur les performances du renderer. profile.SetPreference(\"dom.ipc.processCount\", 1); Ensuite j'ai tent\u00e9 tout b\u00eatement de rajouter dans la liste des arguments la taille voulue de l'\u00e9cran. options.AddArgument(\"--window-size=1920,1080\"); Mais comme cela ne foncionnait pas, je me suis rabattu sur un script JS pour tenter de forcer la fen\u00eatre \u00e0 \u00eatre plus grande. js.ExecuteScript(\"window.resizeTo(1920, 1080);\"); Comme cela n'a pas march\u00e9 j'ai pu lire que cela pouvait \u00eatre la taille int\u00e9rieure qui devait \u00eatre chang\u00e9e js.ExecuteScript(\"window.innerWidth = 1920; window.innerHeight = 1080;\"); Encore une fois sans succ\u00e8s. J'ai ensuite tent\u00e9 d'utiliser trois autres versions du GeckoDriver, 0.27,0.26,0.25 et aucune ne m'aidait. Mais en fait la seule chose qui a chang\u00e9 quoi que ce soit \u00e9tait la technique suivante : Changer la window size en utilisant : options . AddArgument ( \"--width=1920\" ); options . AddArgument ( \"--height=1200\" ); Ca ne marchait pas car j'utilisais une autre methode pour resize en m\u00eame temps, qui elle ne marchait pas mais qui emp\u00eachait celle la de marcher. Ensuite le soucis que j'avais c'est que en mettant 1920-1080 je me retrouvais avec 1920-998 ou un truc du genre ce qui n'\u00e9tait pas normal alors je me disais que cette technique ne marchait pas non plus et je l'ai pass\u00e9e. Alors tout n'est pas encore gagn\u00e9, il faut que j'arrive \u00e0 impl\u00e9menter ca dans un plus gros projet et que la vid\u00e9o puisse \u00eatre prise seule. Demain je m'occupe de ca. Mardi 2 Mai 2023 Bon aujourd'hui je change le programme principal. Le soucis que j'ai c'est que en ajoutant ce syst\u00e8me de resize, maintenant la page fait 100x100 et est grise. Il doit y avoir une technique que j'ai oubli\u00e9 de retirer ou un comportement un peu bizarrre. Bon clairement je ne sais pas QUI DECIDE DE ME POURRIR LA VIE mais il est fort. J'ai t\u00e9l\u00e9charger EXACTEMENT les m\u00eames librairies que sur mon autre projet et j'utilise l'EXACT m\u00eame geckodriver.exe mais dans le projet principal impossible de lui faire chier une image m\u00eame avec l'EXACT m\u00eame code. POURQUOI VOUS ME FAITES CA????= La je ne comprend vraiment pas ce qui peut se passer pour que rien ne fonctionne alors que tout est pareil. JE VIENS DE TOUT VERIFIER TOUT EST PAREIL JE NE COMPRENDS PAS. Bon apr\u00e8s avoir supprim\u00e9 l'int\u00e9gralit\u00e9 de ma classe Emulator cela semble marcher un peu mieux. Je ne vais pas m'\u00e9tendre sur la castrophe niveau temps que cela repr\u00e9sente. Si au moins j'arrive \u00e0 faire fonctionner quelque chose je suis content. Maintenant j'ai un soucis un peu sp\u00e9cial. Depuis que j'ai chang\u00e9 la r\u00e9solution, il semble que le programme aie du mal \u00e0 cliquer sur l'icone de settings. En prenant des screenshots du moment ou l'erreur apparait, j'ai pu me rendre compte que en fait le stream est toujours en train de charger et c'est pour ca que on arrive pas \u00e0 trouver le bouton : \"ERROR 105\" \"ERROR 105\" Je pense que je n'ai le soucis que maintenant car le flux en 1080p se lance moins vite. Je vais essayer de voir si je peux detecter un \u00e9l\u00e9ment d'HTML qui correspond au loading comme ca je peux attendre qu'il disparaisse. Sinon je peux aussi juste essayer de trouver le bouton en boucle pendant une dixaine de secondes. Bon la j'essaie pendant genre plus de 50 secondes et ca ne marche toujours pas. Il semblerait que au final le probl\u00e8me vienne du GP d'azerbidjan. En effet, quand je teste un autre Grand Prix tout va bien. ET MERDE ! J'ai r\u00e9ussi \u00e0 avoir des images en 1080P mais d\u00e9s que je passe l'image en plein \u00e9cran c'est de nouveau du 1366X768 Avant de mettre en plein \u00e9cran: \"Before fullscreen\" Apr\u00e8s: \"After fullscreen\" On peut voir sur l'image que l'option 1080P est effectivement bien selectionn\u00e9e mais il doit y avoir un param\u00e8tre de Firefox qui s'occupe de la r\u00e9solution d'un player vid\u00e9o. Il va juste falloir trouver ce param\u00eatre... J'ai essay\u00e9 d'utiliser : Driver.Manage().Window.Size = new System.Drawing.Size(windowWidth, windowHeight); Sans succ\u00e8s. options.AddArgument(\"--start-maximized\"); Pareil Driver.Manage().Window.Maximize(); Toujours rien profile.SetPreference(\"full-screen-api.ignore-widgets\", true); Nada profile.SetPreference(\"media.hardware-video-decoding.enabled\", true); Toujours pas J'ai vraiment cru que j'avais trouv\u00e9 la solution en trouvant cette commande profile.SetPreference(\"full-screen-api.enabled\", true); Mais non toujours pas... Je commence \u00e0 perdre patience. C'EST BON. Apr\u00e8s litt\u00e9rallement 3h de debugging avec M.Bonvin (Que je remercie IMMENSEMENT) on a r\u00e9ussi \u00e0 trouver au fin fond d'un thread github que la valeur \u00e9tait hard cod\u00e9e dans les variables d'environnement et que donc quoi que je fasse je n'aurais pas pu le changer. En fait la seul moyen de tout r\u00e8gler a \u00e9t\u00e9 de changer les variables d'environnement de ma machine: MOZ_HEADLESS_WIDTH et MOZ_HEADLESS_HEIGHT . Et ce qu'il y a de bien c'est que maintenant je peux mettre de la 4K et cela permet de faire un meilleur upscaling. Recrutement Payerne Mai 2023 J'ai du faire mon recrutement \u00e0 Payerne Mercredi et Jeudi. Si vous \u00eates curieux je peux vous dire que comme il n'y avait presque plus de places cet \u00e9t\u00e9 je ferai Canonnier Lance mines. C'\u00e9tait assez frustrant d'avoir perdu deux jours de travail mais on va faire avec. Vendredi 5 Mai 2023 Bon malgr\u00e9s les courbatures il faut que je me mette au boulot un peu serieusement par ce que sinon ca va \u00eatre compliqu\u00e9 de rattraper mon retard. La derni\u00e8re fois si je me souviens bien j'avais r\u00e9ussi \u00e0 trouver un moyen de prendres des images en bonne r\u00e9solution. Il faut maintenant que je commence \u00e0 faire fonctionner la calibration et ce qui serait bien ca serait que je commence \u00e0 ajouter la partie OCR au projet. Il faut que je me d\u00e9p\u00eache car Lundi je dois m'occuper du Poster. OK j'ai compris le soucis que j'avais quand j'essayais de faire la calibration. J'avais mis l'image en ZOOM ce qui fait que si la hauteur n'\u00e9tait pas la bonne, l'image \u00e9tait recentr\u00e9e ce qui fait que cela faussait totalement les r\u00e9sultats. Quand on fait en sorte que l'image prenne toute la place, les coordonn\u00e9es sont prises correctement. Voici un exemple d'ou en est la partie calibration. \"Exemple settings UI\" Normalement il me suffit d'impl\u00e9menter les windows, et on devrait relativement facilement ajouter les pilotes. Et voila. J'ai pu impl\u00e9menter les windows et les pilotes. Et je peux aussi exporter des presets et les loader. Bon le loading est un peu beugg\u00e9 au niveau de l'affichage mais il semble qu'il fonctionne bien quand je save les images. Lundi je m'occupe du poster etc.. mais je pense que la suite va \u00eatre l'impl\u00e9mentation de l'OCR. Lundi 8 Mai 2023 Aujourd'hui c'est journ\u00e9e Poster. Je pense que je ne vais pas finir la journ\u00e9e content car les limitations sont un peu trop pr\u00e9sentes. J'ai fait une version que Garcia pourrait accepter, c'est \u00e0 dire en noir et blanc et avec un tout petit peu plus de d\u00e9tail. \"Poster V3\" Le truc c'est que en blanc je trouve que ca ne marche pas super. Et le concept d'avoir trois parties au projet qui se posent autour d'un circuit c'est peut-\u00eatre pas la meilleure id\u00e9e. Je me suis dit que la bonne id\u00e9e serait peut-\u00eatre de prendre un autre circuit pour qu'il y aie bien trois parties : \"Poster V4\" Clairement ce poster doit faire partie des pires. C'est pas clair et ca part dans tous les sens. Je vais essayer avec un autre layout de circuit. \"Poster V5\" Je me suis ensuite dit que le circuit n'\u00e9tait peut \u00eatre tout simplement pas une bonne id\u00e9e. J'ai donc essay\u00e9 de faire quelque chose de plus classique avec juste un peu de background pour qu'on puisse \u00e9viter le soucis de la page blanche derri\u00e8re : \"Poster V6\" Puis je me suis dit que finalement le circuit me manquait. Alors j'ai d\u00e9cid\u00e9 de combiner le background et le circuit ainsi que simplifier l\u00e9g\u00e8rement les diagrammes en retouchant un peu tout le reste on pouvait arriver \u00e0 quelque chose de sympatique : \"Poster V7\" Je ne suis pas content \u00e0 100% mais bon je pense que je vais m'en satisfaire. Pour donner une id\u00e9e de la gal\u00e8re que c'est de cr\u00e9er un poster, voici ce \u00e0 quoi ressemble mon espace de travail Figma : \"Bordel Figma\" Je ne suis pas un graphiste et ca se voit '^^. Je pense que comme il me reste un peu de temps aujourd'hui, je vais faire un peu de documentation de la partie r\u00e9cup\u00e8ration d'images. En effet, je pense que je n'aurai plus besoin de changer grand chose \u00e0 ce niveau. Mais je ne ferai pas la partie analyse fonctionnelle car l'interface n'est clairement pas termin\u00e9e. En fait j'avais oubli\u00e9 mais j'ai eu un rendez vous m\u00e9dical du coup je n'ai pas eu trop le temps de faire la doc que je voulais. Mais au moins je pense avoir finit mon travail sur le poster et le abstract en Anglais qui sont les deux gros livrables \u00e0 venir. Mardi 9 Mai 2023 Bon je viens de me rendre compte que apparemment on doit rendre l'abstract anglais, le Poster, ET LE PROJET. Je pense que mes deux jours \u00e0 l'arm\u00e9e m'ont fait perdre un peu la notion du temps car j'avais l'impression que l'evaluation interm\u00e9diaire 1 \u00e9tait il y a genre moins d'une semaine. Donc aujourd'hui je ne vais pas trop avancer sur le code et vraiment me focus sur la documentation de la r\u00e9cup\u00e8ration d'images. Je pense que je vais aussi ajouter la partie calibration \u00e0 la documentation. Je pense que c'est important que je prenne le temps maintenant car sinon le prof aura l'impression que ca n'a pas trop avanc\u00e9 depuis la derni\u00e8re fois. Et puis je pense que la partie calibration et r\u00e9cup\u00e8ration d'images ne va pas trop changer et la partie calibration encore moins. La partie anglaise je fais la revoir un peu mais je l'avais d\u00e9ja faite pendant les premiers jours alors ca devrait aller. Pour le rendu il nous \u00e9tait demand\u00e9 de fournir un fichier PDF avec tout dedans avec une table des mati\u00e8res notre code source etc... Pour ce faire j'ai du changer le mkdocs.yml et installer des packages. Voici les changements :: site_name: Documentation Track Trends site_author: Rohmer Maxime copyright: \u00a9CFPTI Tech2 theme: name: material palette: # Palette toggle for light mode - media: \"(prefers-color-scheme: light)\" scheme: default toggle: icon: material/brightness-7 name: Switch to dark mode # Palette toggle for dark mode - media: \"(prefers-color-scheme: dark)\" scheme: slate toggle: icon: material/brightness-4 name: Switch to light mode markdown_extensions: - attr_list - md_in_html - pymdownx.highlight plugins: - glightbox - search - img2fig - with-pdf: cover_subtitle: Vroum Vroum enabled_if_env: ENABLE_PDF_EXPORT - annexes-integration: annexes: # Required (at least 1) - ConfigurationTool.cs: Code/ConfigurationTool.cs # An path to an annex with its title - DriverGapToLeaderWindow.cs: Code/DriverGapToLeaderWindow.cs # An path to an annex with its title - DriverPositionWindow.cs: Code/DriverPositionWindow.cs # An path to an annex with its title - F1TVEmulator.cs: Code/F1TVEmulator.cs # An path to an annex with its title - Program.cs: Code/Program.cs # An path to an annex with its title - Window.cs: Code/Window.cs # An path to an annex with its title - DriverData.cs: Code/DriverData.cs # An path to an annex with its title - DriverLapTimeWindow.cs: Code/DriverLapTimeWindow.cs # An path to an annex with its title - DriverSectorWindow.cs: Code/DriverSectorWindow.cs # An path to an annex with its title - Form1.cs: Code/Form1.cs # An path to an annex with its title - Reader.cs: Code/Reader.cs # An path to an annex with its title - Zone.cs: Code/Zone.cs # An path to an annex with its title - DriverDrsWindow.cs: Code/DriverDrsWindow.cs # An path to an annex with its title - DriverNameWindow.cs: Code/DriverNameWindow.cs # An path to an annex with its title - DriverTyresWindow.cs: Code/DriverTyresWindow.cs # An path to an annex with its title - OcrImage.cs: Code/OcrImage.cs # An path to an annex with its title - Settings.cs: Code/Settings.cs # An path to an annex with its title - recoverCookiesCSV.py: Code/recoverCookiesCSV.py # An path to an annex with its title Je remercie Monsieur Briard le sultan officiel de Mkdocs de la classe de m'avoir aid\u00e9 pour cette partie et avoir cr\u00e9\u00e9 un plugin qui me permet de mettre mon code source directement dans le pdf. Bon au final j'ai quand m\u00eame chang\u00e9 mon poster \"Poster V8\" Mais je suis trop attach\u00e9 \u00e0 l'ancien concept alors je vais plut\u00f4t utiliser ca : \"Poster V9\" Je pense que cette version est meilleure m\u00eame si elle est encore plus en bordel par ce que le texte permet de se faire une meilleure id\u00e9e de l'utilis\u00e9 de chaque partie. Mercredi 10 Mai 2023 Bon hier je n'ai pas eu le temps de finir la documentation de la recup\u00e8ration d'images et de la calibration. Il faudra donc que je repasse un coup dessus en fin de semaine je pense. Mais la j'aimerais avancer sur la mise en commun du projet, comme la configuration fonctionne plut\u00f4t pas mal je pense que je vais juste vite fait aller commenter les methodes qui ne le sont pas encore et ensuite je vais passer \u00e0 l'impl\u00e9mentation de l'OCR. Je suis presque certain que l'OCR va avoir besoin de plus de r\u00e8glages mais bon on verra bien. Je me rend compte en commentant que la methode de load serait plus efficace avec un tout petit peu plus d'infos de la part du JSON. J'aurais pu ajouter l'offset entre chaque Driver Zone pour eviter un l\u00e8ger drift lors de la reconstruction. Mais bon rien de grave donc je pense que je vais le laisser comme ca pour le moment \u00e0 moins que ca me pose soucis plus tard. J'ai eu quelques soucis avec les images en 4K. Du coup j'ai descendu les variables d'environnement \u00e0 1920x1080 En fait il y a parfois un soucis un peu p\u00e9nible avec l'OCR. Parfois pour un temps comme ci dessous: \"1:45.140\" Le programme ne va pas bien comprendre les ponctuations et il va donner : 1115140 La il y a deux probl\u00e8mes... Le 1:xx.xxx est compris comme 11xxxxx et le 4 s'est transform\u00e9 en 1... J'ai cr\u00e9\u00e9 ce \"petit\" bout de code pour g\u00e8rer les fois ou les '.' et les ':' ont mal \u00e9t\u00e9 interpr\u00eat\u00e9s if ( rawNumbers . Count == 1 ) { //If this code is used it means that its bad ... //The methods that comes are really not that great and are juste quick fixes try { result = Convert . ToInt32 ( rawNumbers [ 0 ]); switch ( windowType ) { case OcrImage . WindowType . Sector : //The usual sector is in this form : 33.456 if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' has been understood like a number result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ]); } if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ]); } break ; case OcrImage . WindowType . LapTime : //The usual Lap time is in this form : 1:45:345 if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' and ':' have been overlooked //I Know Im skipping the cases where there are more than 9 minuts but it happens so rarely that... we dont care result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ] + rawNumbers [ 0 ][ 2 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ]); } if ( rawNumbers [ 0 ]. Length == 7 ) { //There is two possibilities //Either 1:45.140 has been interpreted as 1145.10 or 1:451140. We will assume its the first one result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ] + rawNumbers [ 0 ][ 6 ]); } break ; case OcrImage . WindowType . Gap : //The usual Gap is in this form : + 34.567 if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ]); } break ; } if ( rawNumbers [ 0 ]. Length > 6 ) { //The number definitely has been interpreted wrong } } catch { //It can be because the input is empty or because its the LEADER bracket result = 0 ; } } else { //Auuuugh result = 0 ; } ConfigFile = \"./Presets/Clean_2023.json\" ; string gpUrl = \"https://f1tv.formula1.com/detail/1000006688/2023-azerbaijan-grand-prix?action=play\" ; Bon je n'arrive pas \u00e0 faire fonctionner l'OCR sans tout faire crash \u00e0 chaque fois. Je vais abandonner le travail de la journ\u00e9e pour revenir au point initial... C'est tr\u00e8s frustrant mais bon je ne vois pas comment faire mieux. Rien ne marche alors qu'avant ca marchant super sur le projet OCR normal. Va savoir pourquoi m\u00eame comme ca, impossible de faire marcher l'OCR. Il y a un soucis au niveau de l'ASYNC qui me fait crash tout le temps en me disant qu'un objet est deja en train d'\u00eatre utilis\u00e9. Ca marchait nikel dans mes premi\u00e8res version je ne vois pas pourquoi ca p\u00eate maintenant. Je pense que je vois \u00e0 peu pr\u00e8s le soucis. public virtual async Task < DriverData > Decode ( List < string > driverList ) { int sectorCount = 0 ; DriverData result = new DriverData (); Parallel . ForEach ( Windows , async w => { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) result . Name = ( string ) await ( w as DriverNameWindow ). DecodePng ( driverList ); if ( w is DriverDrsWindow ) result . DRS = ( bool ) await ( w as DriverDrsWindow ). DecodePng (); if ( w is DriverGapToLeaderWindow ) result . GapToLeader = ( int ) await ( w as DriverGapToLeaderWindow ). DecodePng (); if ( w is DriverLapTimeWindow ) result . LapTime = ( int ) await ( w as DriverLapTimeWindow ). DecodePng (); if ( w is DriverPositionWindow ) result . Position = ( int ) await ( w as DriverPositionWindow ). DecodePng (); if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) result . Sector1 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 2 ) result . Sector2 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 3 ) result . Sector3 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); } if ( w is DriverTyresWindow ) result . CurrentTyre = ( Tyre ) await ( w as DriverTyresWindow ). DecodePng (); }); return result ; } Ca c'est ma methode de decoding de chaque Driver Zone. Le message d'erreur me parle d'une windowImage quand il dit qu'un objet est d\u00e9ja utilis\u00e9. Ma conjecture c'est que en essayant de faire toutes les windows en m\u00eame temps. Elles veulent parfois acc\u00e8der \u00e0 l'image principale en m\u00eame temps. Ce qui evidemment pose probl\u00e8me. Je pense que le fix le plus simple serait de faire le traitement sans le parallele quitte \u00e0 exporter ce fonctionnement sur chaque zone en elle m\u00eame pour ne pas perdre trop de performances. Ok je crois que je vois ou est le soucis. En fait dans cette version du programme c'est toujours la premi\u00e8re image qui \u00e9tait juste tout le temps prise et dans la premi\u00e8re image on a une partie des chiffres qui est bloqu\u00e9e par l'UI de la fen\u00eatre... lol... EN FAIT J'avais un soucis dans ma gestion des chiffres mal faits. Visiblement parfois quand je ne prenais pas en compte un :, un LapTime etait compris comme un Gap to leader ou un Secteur Bon j'en ai tellement marre... Je n'arrive tout simplement PAS \u00e0 faire fonctionner l'OCR ca crash tout le temps j'en peux plus. J'ai tent\u00e9 de r\u00e8gler les probl\u00e8mes de mauvaises detections de secteurs et temps au tour qui font crasher l'app : if ( rawNumbers . Count == 2 ) { //ss:ms result = ( Convert . ToInt32 ( rawNumbers [ 0 ]) * 1000 ) + Convert . ToInt32 ( rawNumbers [ 1 ]); if ( result > ( 60000 + 999 )) { if ( windowType == OcrImage . WindowType . LapTime ) { result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 1 ]); } if ( windowType == OcrImage . WindowType . Sector ) { int seconds = 0 ; if ( rawNumbers [ 0 ]. Length == 3 ) { //We have one char that we need to delete //For no apparent reason im going to delete the first seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); } else { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); } int ms = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); result = seconds * 1000 + ms ; } } } Mais toujours impossible de faire fonctionner cette M**** C'est juste infernal. Je pense que je vais encore tout retirer et remplacer par ce que j'ai dans mon projet OCR original. Donc c'est une journ\u00e9e de perdue compl\u00eatement... C'est extr\u00eamement frustrant. Apr\u00e8s des heures de debug j'ai enfin r\u00e9ussi \u00e0 faire fonctionner le programme de temps en temps. Mais j'ai toujours le soucis que l'image ne veut pas changer alors que je fais tout pour et que l'OCR est nulle \u00e0 chier du coup... Jeudi 11 Mai 2023 Bon apr\u00e8s une bonne nuit de sommeil je vais reprendre les choses depuis le d\u00e9but. J'ai deux soucis : L'OCR pue du derche L'Image que l'on d\u00e9code ne change pas Pour la premi\u00e8re partie j'ai ma petite th\u00e9orie. Je pense que comme je donne des images 4K alors que le feed est en 1080P, il y a d\u00e9ja un genre d'interpolation qui est faite. Je pense donc qu'il faut que j'adapte mon engine pour qu'il fonctionne avec cette r\u00e9solution. Je me suis demand\u00e9 si ca n'\u00e9tait pas mieux de prendre en compte les deux r\u00e9solutions pour les pc un peu moins bal\u00e8zes et j'ai d\u00e9cid\u00e9 de n'en avoir rien a faire. On verra dans le futur si c'est une feature que je voudrais ajouter mais c'est en dehors du scope du dipl\u00f4me je pense. Pour la seconde partie, je pense qu'il faut que j'aille voir du c\u00f4te de OCR_Decode et de OCR Tester pour voir comment je faisais. Je dois forc\u00e9ment oublier un truc. Bon ca commence mal, quand je vais voir dans le projet OCR_Decode, le changement d'image est exactement le m\u00eame et il fonctionne alors que de mon c\u00f4t\u00e9 ca n'est pas le cas. Alors deux choses. Je me rend compte que le changement d'images n'a AUCUN effet sur la detection de texte, et seconde chose, le d\u00e9calage est trop grand entre les windows. Des que le soucis d'image est r\u00e8gl\u00e9 il va falloir que je change drastiquement ma facon de stocker la config en JSON. Il faut que je conserve les \u00e9carts. Sinon regardez ce que ca donne quand on arrive au dernier pilote : \"Zone de pilote d\u00e9cal\u00e9e\" Je commence \u00e0 devenir FOU. Je n'arrive pas \u00e0 changer cette foutue image wtf... J'ai beau tenter par tous les moyens de la changer par une image noire, l'image semble toujours rester celle du d\u00e9part. Bon j'ai enfin trouv\u00e9 pourquoi et je n'ai pas envie de dire comment j'ai trouv\u00e9... Je pense que l'on a tous droit \u00e0 son petit jardin secret. Maintenant ca veut dire que je peux me focus sur le concept important qui est le changement de la cr\u00e9ation et de la lecture des JSON. Voici un exemple de preset JSON : { \"Main\" : { \"x\" : 40 , \"y\" : 355 , \"width\" : 3784 , \"height\" : 1438 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : -10 , \"width\" : 3784 , \"height\" : 71 , \"Windows\" : [ { \"Position\" : { \"x\" : 47 , \"y\" : 11 , \"width\" : 72 }, \"GapToLeader\" : { \"x\" : 445 , \"y\" : 13 , \"width\" : 201 }, \"LapTime\" : { \"x\" : 859 , \"y\" : 14 , \"width\" : 221 }, \"DRS\" : { \"x\" : 1094 , \"y\" : 13 , \"width\" : 173 }, \"Tyres\" : { \"x\" : 1270 , \"y\" : 11 , \"width\" : 1452 }, \"Name\" : { \"x\" : 2727 , \"y\" : 11 , \"width\" : 351 }, \"Sector1\" : { \"x\" : 3083 , \"y\" : 10 , \"width\" : 253 }, \"Sector2\" : { \"x\" : 3339 , \"y\" : 14 , \"width\" : 195 }, \"Sector3\" : { \"x\" : 3518 , \"y\" : 14 , \"width\" : 250 } } ] } } ] }, \"Drivers\" : [ \"Perez\" , \"Leclerc\" , \"Sainz\" , \"Alonso\" , \"Stroll\" , \"Russel\" , \"Verstappen\" , \"Zhou\" , \"Ocon\" , \"Hulkenberg\" , \"Hamilton\" , \"Norris\" , \"Tsunoda\" , \"Magnussen\" , \"Piastri\" , \"Albon\" , \"Gasly\" , \"Sargeant\" , \"Bottas\" , \"De Vries\" ] } Je pense que ce qui serait bien ce serait de rajouter un \"offsets\" qui contienne les 19 \u00e9carts restants. Bon... la structure de ma fabrication de JSON etait trop confuse je trouve alors je l'ai compl\u00eatement refaite. J'ai aussi abandonn\u00e9 l'id\u00e9e de faire un fichier le plus petit possible car au final on s'en fiche et le plus important c'est que toutes les windows et les zones soient aux bons endroits. Ca nous fait un fichier d'environs 1300 lignes mais au moins le code pour la serialisation est plut\u00f4t clean : public void SaveToJson ( List < string > drivers , string configName ) { string JSON = \"\" ; JsonObject jsonFileObject = new JsonObject (); //Creating the mainZone object JsonObject mainZoneObject = new JsonObject (); mainZoneObject . Add ( \"x\" , MainZone . Bounds . X ); mainZoneObject . Add ( \"y\" , MainZone . Bounds . Y ); mainZoneObject . Add ( \"width\" , MainZone . Bounds . Width ); mainZoneObject . Add ( \"height\" , MainZone . Bounds . Height ); JsonArray driverZonesArray = new JsonArray (); int DriverID = 0 ; foreach ( Zone driverZone in MainZone . Zones ) { DriverID ++; JsonObject driverZoneObject = new JsonObject (); driverZoneObject . Add ( \"name\" , \"Driver\" + DriverID ); driverZoneObject . Add ( \"x\" , driverZone . Bounds . X ); driverZoneObject . Add ( \"y\" , driverZone . Bounds . Y ); driverZoneObject . Add ( \"width\" , driverZone . Bounds . Width ); driverZoneObject . Add ( \"height\" , driverZone . Bounds . Height ); JsonArray windowsArray = new JsonArray (); JsonObject windowObject = new JsonObject (); foreach ( Window window in driverZone . Windows ) { windowObject . Add ( window . Name , new JsonObject { { \"x\" , window . Bounds . X }, { \"y\" , window . Bounds . Y }, { \"width\" , window . Bounds . Width }, { \"height\" , window . Bounds . Height } }); } windowsArray . Add ( windowObject ); driverZoneObject . Add ( \"Windows\" , windowsArray ); driverZonesArray . Add ( driverZoneObject ); } mainZoneObject . Add ( \"DriverZones\" , driverZonesArray ); JsonArray driversArray = new JsonArray (); foreach ( string driver in drivers ) { driversArray . Add ( driver ); } mainZoneObject . Add ( \"Drivers\" , driversArray ); jsonFileObject . Add ( \"Main\" , mainZoneObject ); JSON = jsonFileObject . ToString (); //Saving the file string path = CONFIGS_FOLDER_NAME + configName ; if ( File . Exists ( path + \".json\" )) { //We need to create a new name int count = 2 ; while ( File . Exists ( path + \"_\" + count + \".json\" )) { count ++; } path += \"_\" + count + \".json\" ; } else { path += \".json\" ; } File . WriteAllText ( path , JSON ); } Et normalement la lecture devrait \u00eatre encore plus simple. En fait c'\u00e9tait pas beaucoup plus simple mais au moins maintenant ca marche. Je vais pas mettre le code de lecture ici car c'est un peu trop long donc il va falloir me croire sur parole. (Ou aller sur Git) Bon bah on est au m\u00eame endroit qu'hier... Bon pour demain le plan de bataille ca va \u00eatre : Changer compl\u00eatement la methode \"GetTimeFromPng\" pour qu'elle prenne en compte toutes les possibilit\u00e9s de bugs et d'oubli de '.' ou de ':' mais pas selon le nombre de blocs mais selon le type de temps que l'on cherche Pour le moment je regarde le nombre de blocs et si il y en a deux alors c'est que c'est un temps de secteur. En fait non cela peut aussi \u00eatre un temps au tour qui a rat\u00e9 un point. Il faut que je bosse juste un peu vite fait la dessus et que j'arr\u00eate de putain de crasher d\u00e8s que un truc est pas au bon format. Ensuite quand ca aura arr\u00eat\u00e9 de crasher je vais reprendre l'OCR et voir pourquoi les resultats sont nuls a chier comme ca. Et le but c'est que demain soir j'ai une reconnaissance de caract\u00e8res plus proche de ce que j'avais dans d'autres projets... J'y croit 0 mais bon l'espoir fait vivre comme on dit. vendredi 12 Mai 2023 Bon aujourd'hui il faut que ca marche. On va y aller par \u00e9tape. Je vais revoir toutes les methodes d'OCR et essayer de r\u00e9apliquer les filtres differemment et revenir au point de d\u00e9part. Avant de commencer je note plusieurs soucis avec les premiers tests : Les positions des pilotes ont l'air pas mal (Pas besoin de tout changer mais peut-\u00eatre simplement checker que les filtres sont bons) L'\u00e9cart avec le leader est \u00e9tonnamment pas mal aussi Le temps au tour est tout simplement horrible. Aucun n'est juste et de tr\u00e8s loin m\u00eame si les d\u00e9cimales ne sont pas forc\u00e9ment loin Le DRS je n'ai pas eu l'occasion de bien le tester mais je dirais que ca devrait \u00eatre bon (\u00e0 verifier quand le reste sera bon) Les pneus ne sont \u00e9tonnamment pas SI horribles, m\u00eame si parfois les lettres sont prises comme des chiffres Les noms de pilotes sont tr\u00e8s bon (pas \u00e9tonnant vu le syst\u00e8me de distance de Levenstein donc ca m\u00e9rite quand m\u00eame un petit check) Les secteurs sont en g\u00e9n\u00e9ral horribles mais pas toujours. C'est peut-\u00eatre un soucis de d\u00e9cimale ou des 4 qui se transforment en 1 J'ai remarqu\u00e9 que les 4 sont souvent pris comme des 1. Peut-\u00eatre que en ayant des images 4K l'interpolation est un peu diff\u00e9rente de ce que j'ai l'habitude de voir. Mais donc le plan aujourd'hui c'est de checker tous ces points et les faire fonctionner (youpi...) J'ai d\u00e9sactiv\u00e9 toutes les methodes de cette facon : int sectorCount = 0 ; DriverData result = new DriverData (); foreach ( Window w in Windows ) { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) //result.Name = (string)await (w as DriverNameWindow).DecodePng(driverList); result . Name = \"Unknown\" ; if ( w is DriverDrsWindow ) //result.DRS = (bool)await (w as DriverDrsWindow).DecodePng(); result . DRS = false ; if ( w is DriverGapToLeaderWindow ) //result.GapToLeader = (int)await (w as DriverGapToLeaderWindow).DecodePng(); result . GapToLeader = 0 ; if ( w is DriverLapTimeWindow ) //result.LapTime = (int)await (w as DriverLapTimeWindow).DecodePng(); result . LapTime = 0 ; if ( w is DriverPositionWindow ) //result.Position = (int)await (w as DriverPositionWindow).DecodePng(); result . Position = 0 ; if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) //result.Sector1 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector1 = 0 ; if ( sectorCount == 2 ) //result.Sector2 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector2 = 0 ; if ( sectorCount == 3 ) //result.Sector3 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector3 = 0 ; } if ( w is DriverTyresWindow ) //result.CurrentTyre = (Tyre)await (w as DriverTyresWindow).DecodePng(); result . CurrentTyre = new Tyre ( Tyre . Type . Undefined , 0 ); } return result ; Le but c'est que ensuite je puisse y aller \u00e9tape par \u00e9tape. Position : Alors pour cette reconnaissance je dirais que la 4K fait des merveilles qui permettent de retirer du processing. La position apr\u00e8s un simple Treshold est assez bien reconnue et la dilataion et/ou Erosion ne sont pas nescessaires finalement. On va donc pouvoir gagner un certain temps et c'est un bon signe pour la suite. On peut aussi noter que quand un pilote est hors course toutes ses valeurs sont gris\u00e9es et sa position est prise comme un -1 Sectors, alors j'ai refait toute la partie qui concerne les secteurs et qui les nettoie. Et je me suis rendu compte qu'ils \u00e9taient bien souvent juste, le seul truc c'est que ils s'affichent de mani\u00e8re un peu sp\u00e9ciale. En fait dans la page de la F1TV les secteurs peuvent faire plus de 60 secondes sans passer sur un affichage de minutes. Ce qui fait que c'est un peu bizarre \u00e0 regarder mais c'est parfaitement juste. J'ai aussi pu simplifier la reconnaissance gr\u00e2ce \u00e0 l'image de meilleure qualit\u00e9 et maintenant les temps de secteur sont plut\u00f4t corrects. En fait le plus long et complexe c'est de pr\u00e9voir les cas particuliers ou un '.' a \u00e9t\u00e9 mal interpr\u00eat\u00e9... Et en parlant de ca, je vais aller m'occuper des temps au tour qui ajoutent une couche de complexit\u00e9 avec un '.' ET un ':' qui peuvent \u00eatre oubli\u00e9s... Oh et j'y pense, un truc malin pourrait \u00eatre de comparer les temps au tour et les temps de secteur. Ils devraient concorder normalement je pense. Ok je viens de finir la gestion des temps au tour... J'ai un code de genre 170 lignes pour juste nettoyer le resultat dans le cas ou des '.' n'ont pas \u00e9t\u00e9 trouv\u00e9s ou des ':' ont \u00e9t\u00e9 n'ont pas \u00e9t\u00e9 trouv\u00e9 ou si l'un des deux s'est transform\u00e9 en chiffre etc.. etc.. etc.. Le soucis c'est que la maintenant je me rend compte que les \u00e9carts entre les pilotes vont juste \u00eatre un enfer \u00e0 nettoyer... Ils peuvent aussi bien \u00eatre \"0.760\" comme \"1:34.456\" du coup... je sais pas vraiment comment faire pour tout nettoyer. Je pense que je vais juste en avoir rien \u00e0 faire et tant pis si de temps en temps c'est pas g\u00e9nial. Bon du coup j'ai pas pris en compte TOUS les cas possibles mais d\u00e9ja un certain nombre et c'est d\u00e9ja pas mal. Sur les diff\u00e9rents Grand Prix d'exemples ca a l'air de plut\u00f4t bien tourner ! Mais ca demande tellement de tests et de code que c'est un peu ridicule... La methode \"GetTimeFromPng\" fait d\u00e9ja presque 430 lignes \u00e0 cause de tous les cas possibles et tous les try catch. Ca peut para\u00eetre peu \u00e9l\u00e9gant mais j'ai essay\u00e9 de mettre des commentaires un peu partout pour permettre \u00e0 nimporte qui de comprendre ce qui se passe. J'ai aussi pu faire les pneus et maintenant (roulement de tambour) Ca marche (presque) En fait j'ai des soucis parfois quand les pneus sont un peu cach\u00e9s dans les permiers tours : Pneus cach\u00e9s Le soucis c'est que du coup le chiffre est un peu illisible... mais je pense que avec l'historique il devrait y avoir moyen de ne pas prendre en compte les chiffres de pneus pendant cinq tours apr\u00e8s le changement de pneu ou de simplement tenter de faire les calculs de pneus. Pour conclure la journ\u00e9e je pense que je devrais avoir le temps de faire un syst\u00e8me qui permet de refresh \u00e0 volont\u00e9. Par contre je viens de d\u00e9couvrir que quand un temps de secteur est en couleur on arrive pas \u00e0 le lire. Ah et la detection prend un peu moins de trois secondes sur mon pc je crois. Mais c'est seulement si les driver zones sont faites en m\u00eame temps mais en faisant ca de temps en temps ca crash et \u00e0 chaques fois c'est d'un endroit diff\u00e9rent du coup je comprend pas vraiment. Sinon ca prend dix secondes. Lundi 15 Mai 2023 Aujourd'hui c'est journ\u00e9e poster et visites. Comme on va avoir des visites de premi\u00e8res ann\u00e9es voire de terminales et que le soir c'est visite des parents. Je pense que j'ai finit de tout regrouper (\u00e0 part \u00e9videmment le traitement et le stockage des donn\u00e9es) ce qui veut dire que je suis pas dans une superbe posture. Il va falloir que je sois tr\u00e8s efficace dans la partie stockage de donn\u00e9es et mise en place du mod\u00e8le si je veux avoir une chance de rendre un joli travail de dipl\u00f4me. (et m\u00eame comme ca je peux voir que le temps commence \u00e0 manquer) Dans l'id\u00e9al je devrais avoir termin\u00e9 la partie stockage jeudi... Ce qui veut dire que je n'ai que trois jours pour le faire et que en plus jeudi je dois travailler depuis la maison. Ca va pas \u00eatre simple. Mais aujourd'hui je vais m'occuper d'adapter la documentation de l'OCR et faire la documentation de toute la partie r\u00e9cup\u00e8ration d'images et de la calibration. Bon au final la journ\u00e9e a \u00e9t\u00e9 un peu difficile. On a pas vraiment pu travailler l'apr\u00e8s midi car il a fallu pr\u00e9senter le projet environs 10 fois \u00e0 toutes les classes et \u00e0 des parents voire futurs experts. Les d\u00e9mos ont plut\u00f4t bien fonctionn\u00e9es j'en suis assez content. Mais ca veut dire que la partie doc a pas forc\u00e9ment pu \u00eatre totalement compl\u00eat\u00e9e mais demain il va falloir que je m'occupe de la suite du projet. Mardi 16 Mai 2023 Bon aujourd'hui c'est la partie stockage qui doit \u00eatre faite. Il y a plusieurs solutions possibles \u00e0 ce probl\u00e8me. Mais comme je n'ai besoin que d'une base de donn\u00e9e locale et que je ne veux pas que chaque utilisateur doive installer un serveur sur sa machine je pense que je vais utiliser une base de donn\u00e9es SQLITE. Il y a eu une petit intervention de mr Bonvin qui est venu me donner une id\u00e9e pour la partie OCR. En fait j'avais un soucis quand je voulais d\u00e9coder du texte de couleur. M\u00eame en appliquant un filtre de gris je n'arrivais pas \u00e0 faire reconnaitre les chiffres. Et il m'a dit que une bonne id\u00e9e cela pourrait de prendre la valeur max de chaque channel et de la faire appliquer \u00e0 tous ce qui blanchit assez bien l'image. J'ai d\u00e9cid\u00e9 d'exag\u00e8rer le blanchiment et cela donne des r\u00e9sultats plut\u00f4t... int\u00e9ressants... \"Filtre vanish oxy action sur un secteur violet\" Le soucis c'est que le violet est une couleur quand m\u00eame assez sombre alors il va falloir que je fasse un syst\u00e8me de treshold un peu sp\u00e9cial qui soit un peu plus sympa et qui prenne plus facilement des couleurs plus basses. Une methode \u00e0 laquelle j'ai pens\u00e9 pour detecter dans quel tour chaque pilote est serait de garder en m\u00e9moire toutes les infos de chaques pilotes au fur et \u00e0 mesure, et d\u00e8s qu'on ne recoit plus d'infos des secteurs ou que le temps au tour a chang\u00e9 on peut savoir qu'il faut passer au tour suivant. Pour detecter les arr\u00eats aux stands je peux essayer de detecter un changement de type de pneus ou de nombre de tours detect\u00e9s sur le m\u00eame pneu Au d\u00e9part je me disais que je pourrais peut-\u00eatre faire une base de donn\u00e9e SQLITE locale qui puisse \u00eatre reprise d'un Grand Prix \u00e0 un autre. Mais je me suis dit que de faire des statistiques inter Grand Prix \u00e9tait un peu en dehors du scope du projet. La base de donn\u00e9e sera donc cr\u00e9\u00e9e \u00e0 chaque d\u00e9marrage de l'app La mani\u00e8re dont je vois les choses en ce moment est qu'on aie deux sources de donn\u00e9es dans l'affichage final. On aurait une partie des infos qui seraient en direct depuis la detection : Les ecarts entre pilotes La position des pilotes Le dernier temps au tour Les derniers secteurs Les pneus Mais on aurait aussi des rubriques cr\u00e9\u00e9es de toutes pi\u00e8ces par des infos qui viennent de la BD Voici les rubriques qui pourraient \u00eatre int\u00e9ressantes \u00e0 voir dans l'interface finale : Les 3 ou 5 pilotes les plus rapides ces cinq derniers tours Le pilote qui a le plus fait de d\u00e9passements Les batailles en cours Les 3 pilotes les plus lents Un classement pond\u00e9r\u00e9 avec les 20s de moins pour tous les pilotes qui ne se sont pas encore arr\u00eat\u00e9s En gros l'id\u00e9e serait que on update une fois par tour et par pilote la base de donn\u00e9e avec des infos comme le temps au tour, le type de pneu etc... Voici les trois tables que je vais cr\u00e9er : Drivers Colonne Type de Data Description Tag ID INTEGER ID du pilote PRIMARY Name VARCHAR Nom du pilote NOT NULL Pitstops Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui a effectu\u00e9 le Pitstop PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL Stats Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui concern\u00e9 PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL LapTime INTEGER Temps au tour (MS) NOT NULL Sector1 INTEGER Temps du secteur 1 (MS) NOT NULL Sector2 INTEGER Temps du secteur 2 (MS) NOT NULL Sector3 INTEGER Temps du secteur 3 (MS) NOT NULL GapToLeader INTEGER Ecart avec le leader (MS) NOT NULL Position INTEGER Position pilote NOT NULL Ca n'est pas forc\u00e9ment d\u00e9finitif mais je pense que c'est d\u00e9ja un bon d\u00e9but pour faire des rubriques sympa. Je suis en train de tenter d'impl\u00e9menter le code pour permettre ensuite d'ajouter et retirer des choses facilement. Mercredi 17 Mai 2023 Aujourd'hui le but c'est de remplir la base SQLITE avec des infos. Si j'arrive \u00e0 tout remplir alors ca devrait pas \u00eatre trop compliqu\u00e9 de venir faire des requ\u00e8tes qui donnent de bonnes infos. Mais la probl\u00e9matique principale va \u00eatre de d\u00e9cider QUAND ins\u00e8rer des choses dans la base de donn\u00e9e. Je pense que le meilleur moyen serait de garder une liste de DriverData par pilote en piste qui puisse contenir toutes les data que l'on recoit. Et \u00e0 chaques fois que l'on veut ajouter \u00e0 cette liste on v\u00e9rifie si un tour a \u00e9t\u00e9 fait pour envoyer les data pr\u00e9c\u00e9dente et r\u00e9initialiser la liste. Il faut donc une liste de 20 listes de DriverData et une liste de int qui repr\u00e9senteront le num\u00e9ro du tour dans lequel chaque pilote se trouve. Pour detecter un arr\u00eat je pense que la meilleure mani\u00e8re est de regarder si le pilote a chang\u00e9 de place ou de type de pneu. Si je prend que les fois ou le pilote change place ET de pneus alors certains arr\u00eats pour ceux qui sont loins devant ou loins derri\u00e8re pourraient ne pas \u00eatre detect\u00e9s. Et si je ne prend que le changement de pneus cela pose un soucis car un pneu pourrait avoir \u00e9t\u00e9 chang\u00e9 pour un autre du m\u00eame type. Et parfois les valeurs de tours faits avec le pneu ne sont pas toujours bien lues et parfois sont compliqu\u00e9es \u00e0 retrouver car tous les pneus ne sont pas neuf quand ils sont chauss\u00e9s. Je crois que la detection de tours et des arr\u00eats aux stands est sur la bonne voie. Le seul soucis que j'ai c'est que pour faire du debug je suis un peu oblig\u00e9 d'attendre pendant 10min si je veux avoir de quoi faire des stats un peu sympa. Je me rend compte que parfois j'obtiens des r\u00e9sultats un peu bizarres mais que c'est la f1TV qui les donne. Par exemple de cas ou Alex Albon n'a que deux tours sur ses pneus alors que tout le monde devant et derri\u00e8re lui en a 3 et que on est au tour 4. \"wtf...?\" Ah et aussi parfois quand les pilotes se d\u00e9passent on se retrouve dans des situations plut\u00f4t rigolotes : \"Wtf...??\" COMMENT JE FAIS POUR DETECTER CA WIONDVIDNJDODVNSDIC Bon je me rend compte que clairement si je veux que mes data soient plus utiles il faudrait que je fasse un tout petit peu plus de taff sur quelques points dans l'OCR. Le nombre de tours des pneus (Les num\u00e9ros sont vraiment mal detect\u00e9s et parfois m\u00eame la couleur est pas dingue) Les 4 qui sont pris pour des 1 ou des 11 (pour les temps et les pneus) apr\u00e8s un test de plus longue haleine je suis content de voir que au moins mon programme peut tourner plus d'une heure sans crasher et qu'il peut \u00eatre fiable quand il veut. Jeudi 18 Mai 2023 Aujourd'hui c'est t\u00e9l\u00e9Travail forc\u00e9 et j'\u00e9tais scens\u00e9 aller au Grand Prix d'Imola ce qui malheureusement ne pourra pas se faire pour des raisons d'inondations. En effet la r\u00e9gion est clairement pas en \u00e9tat de recevoir un Grand Prix de Formule 1 et donc ce weekend c'est maison. Le but du jour c'est d'avancer la doc et de tenter d'am\u00e9liorer l'OCR pour que Lundi il soit relativement facile d'avancer sur l'interface de l'app finale. Je suis en train d'explorer une methode de detection de bords de sobel. Le seul soucis c'est que les r\u00e9sultats sont bons mais avec un vide au milieu des chiffres. Cela veut dire que parfois le temps est mal detect\u00e9. Mais il semble que pour le reste du temps cela se passe plut\u00f4t bien. Ca vaut peut \u00eatre le coup de modifier la gestion des erreurs. \"Artefacts de detection de sobel\" En fait le soucis avec ces artefacts c'est que parfois le temps au tour n'est tout simplement pas detect\u00e9. Dans l'exemple ci dessus, la reconnaissance de caract\u00e8res ne trouve tout simplement rien. Il faut donc que je trouve un moyen de corriger ces soucis. Il semblerait que en appliquant un tresholding un peu plus s\u00e9v\u00e8re en amont on arrive \u00e0 r\u00e9duire les artefacts \"Artefacts all\u00e8g\u00e9s\" ; Je crois qu'il faut faire attention avec les 'Bitmap.save' quand on utilise de l'asynchrone. le GDI+ aime pas des masses. Lundi 22 Mai 2023 BON ! Il ne reste plus beaucoup de temps ! Selon le planning cette semaine est la derni\u00e8re semaine de programmation. Il va donc falloir CHARBONNER !! Il ne me reste plus que une t\u00e2che \u00e0 vraiment faire (\u00e0 part les tests mais euuuu voila bon). J'essaie d'impl\u00e9menter un peu plus d'error handling mais c'est pas facile... Il y a tellement de choses qui peuvent mal tourner c'est infernal. Une chose qui serait bien serait de rajouter des points d'attente variables dans le code de l'emulateur un peu partout pour eviter de se retrouver bloqu\u00e9 \u00e0 chaque fois. L'int\u00e9r\u00eat serait que des gens avec une moins bonne connexion pourraient quand m\u00eame profiter du programme sans qu'il crashe 300 fois. Ce qui est frustrant c'est que va savoir pourquoi, maintenant, on arrive quasi jamais a avoir la page data... Genre sans deconner c'est une fois sur 5 que l'emulateur nous ressort la page Data et pas juste le feed. C'est absolument infernal. Je ne comprends pas pourquoi en plus. L'emulateur arrive bien \u00e0 cliquer sur le bon bouton mais m\u00eame comme ca ca ne veut pas. CA NA AUCUN SENS BORDEL. Sur une image Jjai de supers resultats pour les temps au tour mais d\u00e8s que l'image change PAF plus aucun temps n'est detect\u00e9. Ah non c'est bon c'est juste que VA SAVOIR POURQUOI les images sont en putain de resolution DEGEULASSE. Je ne comprends pas pourquoi ce matin particuli\u00e8rement le projet marche si mal. Par ce que d\u00e8s que l'image revient \u00e0 une r\u00e9solution normale c'est bon. Un autre soucis que j'ai est que je n'arrive pas \u00e0 paralleliser l'OCR ce qui fait que elle peut prendre parfois plus de 15 secondes. Et le probl\u00e8me avec ca c'est que la detection de tours et de pitstop est grandement impact\u00e9e si on a pas assez de data assez souvent. Je vais me focus sur le reste en attendant mais d\u00e8s que M.Bonvin apparait dans les parages je vais devoir l'alpaguer. J'ai ajout\u00e9 la possibilit\u00e9 d'essayer plusieurs fois de trouver le bouton fullscreen et de cliquer dessus plut\u00f4t que d'attendre dix secondes comme un con et esp\u00e8rer que ca fonctionne. Mais si apr\u00e8s 15 secondes d'essais il n'y arrive pas cela fait quand m\u00eame p\u00eater une erreur. Je pense que je vais m'occuper de la page de configuration maintenant. Voici \u00e0 quoi ressemblait la page de settings ce matin quand je suis arriv\u00e9. \"Ancienne page de settings\" Comme je pense que l'UI de cette page ne va pas vraiment changer d'ici la fin du projet je peux me permettre de lui faire une petite beaut\u00e9 car apr\u00e8s je ne pense pas y retoucher. Pour ca j'ai plusieurs \u00e9tapes comme choisir une palette de couleur, retirer l'inutile et choisir judicieusement le placement des items sur la form pour que cela soit le plus intuitif possible. J'y pense, il fuadrait peut-\u00eatre que je me trouve un logo ca pourrait rendre bien. Voila alors j'ai chang\u00e9 un tout petit peu ce \u00e0 quoi ressemble la page de settings et j'ai ajout\u00e9 du responsive pour que le user puisse mettre l'application en plein \u00e9cran. \"Nouvelle page de configuration\" Mais il manque un peu de couleurs et de d\u00e9tails pour que cela rende vraiment bien. Et apr\u00e8s quelques tentatives on se retrouve avec une page plut\u00f4t sympa je trouve : \"Nouvelle page de config\" Et elle est responsive : \"Nouvelle page de config en plein \u00e9cran\" Et j'ai fait quelques changements pour ce qui est des zones qui s'affichent pour qu'on les voie mieux. \"Nouvelle page de config en action\" Je trouve que franchement ca rend pas mal. Le reste de l'app sera dans ce style. J'ai mis pas mal de temps \u00e0 cr\u00e9er cette page, mais je pense que c'est important que la page de config soit propre. Et en plus tout le temps que j'ai pass\u00e9 ici n'est pas perdu car ensuite j'aurai simplement \u00e0 suivre les m\u00eames directives de style pour le reste de l'UI. Il faut aussi savoir que Windows Form n'est ps forc\u00e9ment le meilleur outil pour travailler avec le design. Truc tout b\u00eate par exemple qui m'a fait perdre 30 minutes. Il est impossible de retirer les bordures des objets \"GroupBox\". Ce que j'ai donc du faire ca a \u00e9t\u00e9 de dessiner un rectangle autour de la couleur du background pour que l'on ne voit plus les bordures et ensuite j'ai du redessiner le texte pour qu'il puisse s'afficher quand m\u00eame. C'est pleins de petites choses comme ca qui sont plut\u00f4t p\u00e9nibles et qui font perdre du temps mais je pense que c'est rentable de s'y attarder. Maintenant ce que je vais faire aujourd'hui et demain c'est l'affichage general de l'app. Je pense que je vais commencer par mettre des placeholder de l'app finale comme ca je saurai quoi implementer comme methodes de r\u00e9cup\u00e8ration demain. J'aimerais quand m\u00eame faire une interface sympa m\u00eame si les data sont pas parfaites. Par ce que je me dis que au pire si je montre une interface qui donne des infos inexacte mais qui a la bonne logique c'est toujours mieux que de ne pas montrer ce que ca pourrait faire avec des donn\u00e9es un peu plus int\u00e8gres. Autre point \u00e0 noter, je me suis rendu compte que ca pourrait \u00eatre potentiellement pas mal de trouver un moyen rapide de lancer l'appli avec un Grand Prix. Genre permettre de selectionner le preset et l'URL du Grand Prix sans avoir \u00e0 passer par la page de configuration. Je me suis rendu compte que c'\u00e9tait super chiant de devoir \u00e0 chaque fois le faire (m\u00eame si je me rends compte que normalement un user ne devrait pas lancer l'app autant) Voila ue premi\u00e8re version de l'App avec tous les placeholders : \"Premi\u00e8re version de la page principale\" Et c'est tout pour aujourd'hui ! Ce fut une journ\u00e9e remplie. Mardi 23 Mai 2023 Aujourd'hui le but c'est de remplir le framework de hier avec les bonnes Data. Je ne sais pas si je peux tout finir en un jour mais on va essayer. Bon j'ai eu une discussion anim\u00e9e avec M.Bonvin et il semble que je sois oblig\u00e9 de refaire \u00e0 peu pr\u00e8s tout mon code pour le rendre ne serait-ce qu'un peu optimis\u00e9. Bon au final j'ai perdu 6H de travail \u00e0 tenter de convertir mon code dans une version un peu plus optimis\u00e9e... Mais je me rend compte que c'est juste impossible... Il me faudrait au moins plusieurs jours pour faire correctement ce refactor et donc je vais tout simplement faire un git restore... C'est extr\u00eament frustrant mais bon... Pas le choix il semble. J'ai du \u00e9crire au moins 600 lignes de code et tout pars en fum\u00e9e. C'est une d\u00e9bauche d'\u00e9nergie absolument ph\u00e9nomenale. Apr\u00e8s ca valait le coup de tenter je pense. (J'ai envie de mourir) EN FAIT C'EST BON !! Il fallait juste que je croie en mon code original !!! J'ai r\u00e9ussi \u00e0 paralelliser mon ancien code. Il ne manquait presque rien mais M.Bonvin voulait absolument que je change le reste. Maintenant j'ai une detection qui se fait en quelques secondes c'est genial. Mercredi 24 Mai 2023 Alors hier je n'ai pas bien eu le temps d'expliquer ce que voulait que M.Bonvin. En fait mon programme actuellement utilise un d\u00e9coupage qui peut par\u00e2itre complexe. Et de par sa nature, il pensait qu'il \u00e9tait simplement impossible de paralelliser le traitement car trop complexe et trop couteux. Il voulait donc que je passe sur un traitement plus simple. L'id\u00e9e \u00e9tait que on s'occupe dabord de faire une liste de toutes les Windows et de les traiter toutes \u00e0 la fois pour \u00e9viter que les boucles soient trop complexes. Sauf que pour impl\u00e9menter un truc pareil c'est \u00e9norm\u00e9ment de code car cela va \u00e0 l'encontre totale de la facon dont mon projet fonctionne actuellement. Mais comme j'\u00e9tais ouvert \u00e0 d'autres solutions. J'ai pass\u00e9 six heures \u00e0 tenter de l'impl\u00e9menter. Il en aurait fallu au minimum deux jours soyons clair. Et en fait on s'est retrouv\u00e9s devant pleins de probl\u00e8mes qui ne se posent pas dans mon architecture originale. Par exemple. On a pas trouv\u00e9 de methode simple pour d\u00e9couper les images des fen\u00eatres de mani\u00e8re thread safe. Il aurait donc fallu ajouter des boucles en pr\u00e9alable pour tout d\u00e9couper et le faire de mani\u00e8re s\u00e9quencielle. Ensuite vient le probl\u00e8me que si on traite toutes les donn\u00e9es dans des boucless paralelle on perds leur position originale donc il faut faire une classe pour stocker les r\u00e9sultats temporaires. Il y a aussi le soucis que les Windows ont certe une position mais elle est relative au parent et \u00e0 l'image parente. Donc il faudra faire un syst\u00e8me qui convertis les windows en position absolue sur l'image. Ca peut para\u00eetre \u00eatre de simples changements mais deja il y en a pas mal d'autres et franchement m\u00eame si l'id\u00e9e originale aurait pu simplifier les choses. Les sacrifices que l'on doit faire pour la faire marcher sont juste trop moches et \u00e0 mon avis ne sont pas du tout aussi logiques que mon d\u00e9coupage original. Cette exp\u00e9rience m'a quand m\u00eame permis de me rendre compte des endroits dans mon code qui sont plus ou moins difficile \u00e0 maintenir et cela m'a fait me rendre compte que ma solution n'\u00e9tait pas forc\u00e9ment la plus simple pour tout le monde mais que mine de rien elle peut \u00eatre efficace. La je suis en train de rajouter les routes pour la vue. Je me suis dit que ca serait une bonne id\u00e9e de permettre aux users de cliquer sur un pilote pour avoir ses infos. Mais je me suis dit que ce qui serait encore plus cool serait de pouvoir cliquer sur un des temps au tour d'un pilote et qu'une petite fen\u00eatre s'ouvre pour indiquer les temps par secteurs. Mais en faisant ca je me rends compte qu'il y a quelques soucis dans la facon que je conserve les infos dans la DB et je peux voir directement quand la reconnaissance a du mal avec certains pilotes ou des positions. Ca arrive plus souvent que ce que je voudrais que un pilote soit mal detect\u00e9. Mais ce qui est dr\u00f4le c'est que c'est parfois sur une deux voire trois reconnaissance que le pilote n'est plus reconnu mais ensuite tout va bien. Il faut que je travaille un peu plus sur le filtrage de ces donn\u00e9es limites et peut-\u00eatre de voir si la reconnaissance de la position pourrait \u00eatre un peu v\u00e9rifi\u00e9e. Bon pour \u00eatre honn\u00eate je ne pense pas que le code qui concerne l'affichage soit le meilleur code que j'aie pu produire dans ma vie de d\u00e9veloppeur mais en m\u00eame temps je n'ai pas forc\u00e9ment le temps de le rendre magnifique. La le but est simplement que tout marche. (Et c'est un peu la m\u00eame phylosophie dans tout le reste du projet lol) Demain il me reste pas mal de choses \u00e0 faire et c'est la derni\u00e8re journ\u00e9e ou je peux les faire. Rendre la form plus jolie et changer les couleurs Rendre la form Responsive Ajouter les bons messages d'erreur qui vont bien Modifier les messageBox d'erreur pour qu'elles soient plus agr\u00e9ables \u00e0 utiliser Clean un peu le code mod\u00e8le vue controller Si j'ai le temps ajouter les bons commentaires les bonnes ent\u00eates partout Jeudi 25 Mai 2023 Bon bah le but aujourd'hui c'est de finaliser un peu le projet car la semaine prochaine c'est doc. Pas grand chose \u00e0 dire. J'ai pass\u00e9 la journ\u00e9e \u00e0 fix des petits bugs par ci par la. Voici des exemples de ce \u00e0 quoi ressemble l'app \u00e0 la fin de la journ\u00e9e : \"Screenshot de la page principale\" \"Screenshot de la page principale\" On se rend jamais compte mais c'est tellement long de r\u00e8gler chaque petit soucis un par un. Il y a tellement de possibilit\u00e9s de choses qui peuvent mal tourner ou qui ont un comportement diff\u00e9rent selon l'ordre dans lequel on fait les choses. Mais dans l'ensemble, m\u00eame si on est pas sur la meilleure interface que l'on aie vu dans l'histoire. Je trouve que elle fait quand m\u00eame le taff. Vendredi 26 Mai 2023 Aujourd'hui c'est d\u00e9part pour Monaco mais comme l'avion etait bien en retard j'ai pu avancer sur le nettoyage du code. Grand Prix de Monaco [Insert photos] Lundi 29 Mai 2023 Mon vol pour Geneve hier soit a \u00e9t\u00e9 annul\u00e9 et je dois donc prendre une deviation car tous les vols pour Geneve sont pleins. Je dois partir a 7h30 pour prende l'avion de 9H pour Nantes et de la bas je dois prendre un avion \u00e0 17h pour arriver \u00e0 18h30 \u00e0 l'a\u00e9roport de Geneve. C'est pas pratique car j'avais pr\u00e9vu d'avancer aujourd'hui et je suis oblig\u00e9 d'avancer comme je peux dans l'a\u00e9roport. J'avance encore sur le nettoyage rapide du code. Le but est que demain je puisse sortir la premi\u00e8re release en Beta et que je mette vraiment serieusement \u00e0 la Documentation. M.Jayr m'a \u00e9galement demand\u00e9 de lui donner le document d'\u00e9valuation interm\u00e9diaire. Il ne faut pas que j'oublie demain. J'ai mis des notes sur mon code au cas ou des gens viennent \u00e0 le lire. J'y d\u00e9cris les choses que j'aurais fait diff\u00e9remment ou qui pourraient para\u00eetre bizarre au tout venant. Mardi 30 Mai 2023 Bon aujourd'hui je dois encore avancer sur la partie nettoyage de code et avant de sortir la premi\u00e8re release Beta je vais tenter d'installer le projet sur un autre pc pour voir ce que je n'ai pas mentionn\u00e9 dans mon ReadMe. Bon j'ai pu rendre \u00e0 M.Jayr mon evaluation interm\u00e9diaire et j'ai fait les derni\u00e8res modifications sur le projet pour que je puisse sortir une release correcte. Maintenant je vais me mettre \u00e0 la documentation. Il va falloir que je revoie ce que j'ai d\u00e9ja \u00e9crit en ce qui concerne l'OCR car j'ai fait des modifications depuis et j'ai ajout\u00e9 la methode de SOBEL. Il faut peut-\u00eatre aussi que je parle vite fait dans la partie Emulation que j'ai du changer les variables d'environnement pour faire fonctionner le syst\u00e8me en 4K. Mercredi 31 Mai 2023 Doc Jeudi 1 Juin 2023 Bon je me suis rendu compte que je n'avais fait vraiment aucuns tests et que c'est franchement bof. Je pense que ce que je devrais faire pour faire des tests unitaires c'est prendre des exemples de chaque type de windows possibles en plusieurs exemplaires. Ensuite je note le r\u00e9sultat que j'attends et je regarde si ca me retourne la bonne valeur. Mais ca veut dire que ca va me prendre pas mal de temps de tout mettre en place mais ca m'aurait s\u00fbrement fait gagner beaucoup de temps si je l'avais fait d\u00e8s le d\u00e9but... Je pense que une bonne id\u00e9e serait de prendre trois Grand Prix et de prendre une photo de chaque type de window au d\u00e9but et \u00e0 la fin. Plus je regarde plus je me rend compte que ce pojet aurait carr\u00e9ment du \u00eatre en TDD (Test Driven Developement) par ce que ca m'aurait fait gagner un temps FOU. OK JE SUIS DEBILE POURQUOI J'AI PAS FAIT CA PLUS T\u00d4T ??? En fait ce que j'aurais du faire c'est prendre de gros \u00e9chantillons de toutes les types de windows et j'aurais un parfait framework pour savoir si j'ai am\u00e9lior\u00e9 mon OCR ou non. Voici les exemples que je vais utiliser pour verifier le bon fonctionnement de l'OCR : \"Dataset Ecarts\" ; \"Dataset Tours\" ; \"Dataset Noms\" ; \"Dataset Positions\" ; \"Dataset Sectors\" ; \"Dataset Tyres\" ; Je pense que c'est un set assez correct car j'ai essay\u00e9 de prendre un peu tous les cas possibles. Le seul qui m'inqui\u00e8te un peu c'est celui des pneus mais bon. C'est aussi celui qui m'inqui\u00e8te le plus en temps normal. Non mais c'est juste g\u00e9nial les tests en fait... j'avais pas vu que parfois ma detection de GAP TO LEADER comprenait le \"+1:34.567\" en \"61:34.567\" car le '+' \u00e9tait interpr\u00eat\u00e9 comme un 6. Sans les tests je ne m'en serais pas rendu compte. Ce qui est g\u00e9nial c'est que ca veut dire que si je veux am\u00e9liorer mon OCR j'ai juste \u00e0 mettre plus d'exemples dans le dossier de tests et de run les tests et voir ou il a des soucis. C'est un peu tard mais ca m'aurait fait gagner TELLEMENT de temps c'est absolument ridicule. Vendredi 2 Juin 2023 Aujourd'hui c'est de nouveau doc. Mais la je pense qu'il faut que je rajoute une rubrique \"Fonctionnement g\u00e9n\u00e9ral\" qui r\u00e9sume tr\u00e8s simplement toutes les \u00e9tapes du projet avec un bon diagramme. En fait c'est beaucoup plus dur que ce que je pensais de faire un bon diagramme qui explique tout sans \u00eatre illisible. J'ai mis une heure trente \u00e0 faire celui la : \"Diagramme fonctionnement g\u00e9n\u00e9ral\" J'ai pris pas mal de temps aussi \u00e0 faire ces trois autre diagrammes un peu plus graphiques qui montrent de mani\u00e8re un poil plus abstraite le fonctionnement des trois grosses parties du projet. \"Diagramme recup\u00e9ration d'images\" \"Diagramme OCR\" \"Diagramme Traitement\" Je pense qu'ils sont un peu plus faciles \u00e0 comprendre que le gros diagramme g\u00e9n\u00e9ral. Ce que je me dis c'est que je vais faire une section fonctionnement g\u00e9n\u00e9ral ou je vais expliquer les trois parties avec les petits diagramme et r\u00e9sumer avec le grand diagramme. Lundi 5 Juin 2023 Ce weekend j'ai voulu essayer le projet pour le Grand Prix de Barcelone qui s'est sold\u00e9 en un \u00e9chec cuisant... J'ai eu trois soucis pour l'utilisation du programme. Les voici dans l'ordre croissant d'importance et de difficult\u00e9 \u00e0 r\u00e8gler : Mon Laptop est incapable de rester plus d'une heure allum\u00e9 m\u00eame compl\u00eatement charg\u00e9 \u00e0 100% Le WIFI de chez moi a du mal \u00e0 g\u00e8rer plusieurs flux 1080p en m\u00eame temps et donc le temps de chargement est trop long ce qui me fait des erreurs 105 \"Ce que voyait le programme pendant les erreurs 105 ce dimanche\" Le fait que quand un flux est en live, quand on clique dessus, un nouveau bouton appar\u00e2it qui n'\u00e9tait pas pr\u00e9vu et qui nous propose de regarder depuis le d\u00e9but ou en live. Le soucis avec ce bouton c'est qu'il n'est pr\u00e9sent que pour les sessions live... Il va donc falloir attendre le prochain GP (Canada 18 Juin) pour faire un test en conditions r\u00e9elles. \"Ce que voyait le programme avant que j'essaie d'impl\u00e9menter le click auto\" J'ai essay\u00e9 de r\u00e8gler le probl\u00e8me en Live, le soucis c'est que j'ai un commentaire \u00e0 fournir pendant la course et donc je n'ai pas eu le temps de plus me pencher sur le cas. Le weekend du prochain Grand Prix je vais essayer de tester sur les sc\u00e9ances d'essais libres.le click du bouton et j'amenerai mon cable chez moi. Bon sinon aujourd'hui, comme d'hab, Doc... Je vais faire le manuel utilisateur. J'ai fait un manuel qui d\u00e9crit \u00e0 peu pr\u00e8s tout ce qui'il faut savoir pour bien utiliser l'app. Cela fait un document un peu long mais je pense que c'est nescessaire car c'est vraiment pas une app facile \u00e0 comprendre quand on ne vient pas du milieu de la F1 (et m\u00eame la...) Mardi 6 Juin 2023 Aujourd'hui je vais continuer \u00e0 documenter... Ma methode pour l'instant c'est juste de remplir les titres que j'ai pr\u00e9vu au d\u00e9part. Ensuite \u00e0 partir de jeudi (je pense que c'est \u00e0 partir de cette date que j'aurai un peu tout rempli) j'aimerais bien relire la grille d'\u00e9valuation et ensuite faire une lecture de mon journal de bord pour v\u00e9rifier que je n'ai rien oubli\u00e9. Et le but c'est de finir la doc Vendredi soir pour faire une derni\u00e8re release doc + projet. Un coll\u00e8gue M.Briard m'a pas mal aid\u00e9 avec la configuration de mon mkdocs et il a d\u00e9velopp\u00e9 une extension pour ajouter le code source au PDF final. La il est en train de regarder si il peut trouver un moyen de faire une table des figures qui nous est demand\u00e9e. (j'ai plus de 200 images dans ma documentation alors si c'est possible de ne pas avoir \u00e0 faire une table des figures \u00e0 la main je prends) Mercredi 7 Juin La je suis en train de parler de l'optimisation de mon application et je viens de me rappeller qu'il manquait des methodes avec de la paralellisation alors je vais les convertir avant de continuer la doc. En fait je viens de me rendre compte qu'aucunes de mes methodes de filtres n'\u00e9taient en parralel... Je ne sais pas si jaurai le temps de le faire aujourd'hui en fait public static Bitmap Grayscale ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); //This is not a proper treshold method but it is helping the sobel edge detection if ( gray <= F1TV_BACKGROUND_TRESHOLD . R ) { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } else { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) gray ; } } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; }","title":"Journal de bord"},{"location":"jdb.html#journal-de-bord","text":"","title":"Journal de bord"},{"location":"jdb.html#mercredi-29-mars-2023","text":"Premier jour du travail de dipl\u00f4me. Nous avons eu un briefing de mr Garcia et nous avons pu commencer \u00e0 pr\u00e9parer le travail. Nous avons eu les diff\u00e9rents fichiers nescessaires \u00e0 la bonne r\u00e9alisation du projet et je me suis mis \u00e0 faire les fichiers nescessaires La premi\u00e8re chose a \u00e9t\u00e9 de faire ce mkdocs dans lequel j'ai mis un fichier yml plut\u00f4t standart qui risque de changer au fur et \u00e0 mesure. Voici le premier yml : site_name: Documentation Diplome theme: name: material palette: # Palette toggle for light mode - media: \"(prefers-color-scheme: light)\" scheme: default toggle: icon: material/brightness-7 name: Switch to dark mode # Palette toggle for dark mode - media: \"(prefers-color-scheme: dark)\" scheme: slate toggle: icon: material/brightness-4 name: Switch to light mode markdown_extensions: - attr_list - md_in_html plugins: - glightbox - with-pdf Voici un example de \u00e0 quoi ca ressemble en forme de site \"Exemple mkdocs\" Ensuite il m'a fallu faire une version plus \u00e0 jour de mon cahier des charges car je n'y avait pas touch\u00e9 depuis novembre. J'ai envoy\u00e9 un mail \u00e0 mes enseignants pour qu'ils puissent y jeter un oeuil pour \u00eatre s\u00fbr que je n'ai rien chang\u00e9 qui les d\u00e9rangent. Monsieur Jayr m'a demad\u00e9 \u00e0 l'occasion de lui faire un planning type Gantt alors je me suis mis \u00e0 la t\u00e2che. J'ai fait un planning pr\u00e9visionnel et une l\u00e9gende les deux sont dispo dans le dossier planning de ce repertoire. Ensuite je me suis mis \u00e0 tout mettre sur git. A commencer par ce repertoire Et c'est deja la fin de la journ\u00e9e ! Demain j'avance un peu sur la doc avec ce que je peux d\u00e9ja remplir et je finis de pr\u00e9parer ce dont j'ai besoin pour commencer \u00e0 coder.","title":"Mercredi 29 Mars 2023"},{"location":"jdb.html#jeudi-30-mars-2023","text":"Aujourd'hui selon le planning je dois me charger des dernirers pr\u00e9paratifs pour commencer correctement. J'ai fait expr\u00e8s de prenre du temps pour ca au d\u00e9but pour ne pas me cr\u00e9er de soucis plus loin pendant le travail. Je vais envoyer par mail le planning que j'ai fait \u00e0 mes suiveurs. Ensuite je vais m'attaquer au squelette de la docmentation. Je vais essayer de remplir tout ce que je peux remplir dans un premier temps car cela tout ca de fait pour plus tard quitte \u00e0 modifier quelques aspects au fur et \u00e0 mesure. J'ai aussi d\u00e9sactiv\u00e9 mkdocs with pdf par ce que les r\u00e9sultats ne sont vraiment pas ceux que j'attends et cela ralentis \u00e9norm\u00e9ment le d\u00e9ploiment. J'ai aussi rassembl\u00e9 mes croquis pour le poster : \"Croquis Poster 1\" \"Croquis Poster 2\" On peut voir que dans un premier temps j'ai tent\u00e9 de faire un poster un peu plus stylis\u00e9 et marketing. Cependant apr\u00e8s avoir discut\u00e9 avec Mr Garcia et diff\u00e9rents profs dont un de l'HEPIA et ils m'ont indiqu\u00e9 que ce qui \u00e9tait attendu \u00e9tait moins du marketing qu'un diagramme de fonctionnement. On peut voir sur les derniers posters que le cot\u00e9 technique ressort de plus en plus. Le but sera de faire une version encore plus technique ou on peut voir les diff\u00e9rents fonctionnements de l'application avec les technologies utilis\u00e9es. Le d\u00e9fi cela va \u00eatre de faire un joli poster qui soit en m\u00eame temps vendeur et en m\u00eame temps rempli techniquement. Oh et j'ai eu un probl\u00e8me ou mon calvier et ma souris ne voulaient d'un coup plus fonctionner. Dans mon cas c'\u00e9tait un probl\u00e8me de power management des ports. J'ai eu le soucis sur mon pc fixe \u00e0 la maison et sur mon pc portable \u00e9galement. En gros de ce que j'ai compris le soucis c'est que le pc croit que un port est trop solicit\u00e9 niveau puissance et du coup d\u00e9cide de couper l'alimentation du port USB. J'ai pu r\u00e8gler le soucis en allant dans le device manager sous universal bus controller sous power management et en d\u00e9cochant la case qui indique que windows peut d\u00e9sactiver ce port. Je ne conseille pas ce fix si vous avez des composants de mauvaise qualit\u00e9 car cela pourrait \u00eatre une vraie alerte cependant le fait que mes composants sont plut\u00f4t haut de gamme et le fait que mon clavier et ma souris le fassent en m\u00eame temps et que ils fonctionnaient tr\u00e8s bien depuis plus de 4 ans me font penser que c'est juste une nouvelle mise a jour de windows qui est p\u00e9nible. Demain je vais pouvoir commencer \u00e0 coder pour de bon.","title":"Jeudi 30 Mars 2023"},{"location":"jdb.html#vendredi-31032023","text":"Aujourd'hui on s'occupe de la PT2 qui est la programmation de la r\u00e9cup\u00e8ration des informations des images. Je vais tester IronOcr Source : https://www.c-sharpcorner.com/article/ocr-using-tesseract-in-C-Sharp/ Doc : https://ironsoftware.com/csharp/ocr/docs/ Examples : https://ironsoftware.com/csharp/ocr/examples/simple-csharp-ocr-tesseract/ Avant d'utiliser la librairie je me demande si je dois utiliser un peu de post processing pour aider \u00e0 la reconnaissance. Je peux soit utiliser l'image crop\u00e9e directement : \"Image non trait\u00e9e\" Soit avec un filtre pour passer en noir et blanc laxiste \"Image trait\u00e9e laxiste\" Soit avec un filtre pour passer en noir et blanc stricte \"Image trait\u00e9e stricte\" Il va falloir faire des tests avec tous les noms et les chiffres pour trouver le plus efficace. Bon malheureusment Iron OCR semblait \u00eatre une bonne alternative mais c'est une librairie priv\u00e9e qui demande une license pour \u00eatre utilis\u00e9e. Il va falloir trouver autre chose. En utilisant la librairie \"Tesseract\" qui existe on peut faire de la reconnaissance de texte avec un code plut\u00f4t simple : TesseractEngine engine = new TesseractEngine ( tessDataFolder . FullName , \"eng\" , EngineMode . Default ); var tessImage = Pix . LoadFromMemory ( ImageToByte ( sample )); Page page = engine . Process ( tessImage ); string text = page . GetText (); Voici la methode ImageToByte : https://stackoverflow.com/questions/7350679/convert-a-bitmap-into-a-byte-array public static byte [] ImageToByte ( Image img ) { using ( var stream = new MemoryStream ()) { img . Save ( stream , System . Drawing . Imaging . ImageFormat . Png ); return stream . ToArray (); } } Voici le code pour traiter plusieurs textes sur une seule image : Page page = engine . Process ( tessImage ); // Get the iterator for the page layout using ( var iter = page . GetIterator ()) { // Loop over the elements of the page layout iter . Begin (); do { // Declare a Rect variable to hold the bounding box Rect boundingBox ; // Get the bounding box for the current element if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { g . DrawRectangle ( Pens . Red , new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } // Get the text for the current element var text = iter . GetText ( PageIteratorLevel . Word ); tbxResult . Text += text . ToUpper () + Environment . NewLine ; } while ( iter . Next ( PageIteratorLevel . Word )); } Etonnament, avec plus de texte, des noms qui \u00e9taient autrefois mal reconnus sont parfaitement interpr\u00eat\u00e9s. Par exemple voici un exemple de reconnaisance de texte sur tous les pilotes : \"Screenshot de reconnaisance d'image complete\" On voit que le nom Leclerc est mal reconnu. Mais voici ce que cela donne quand on prend une image qui ne contient que le nom Leclerc : \"Screenshot de reconnaissance d'image crop\u00e9e\" On voit ici que le nom Leclerc est tr\u00e8s bien reconnu. Dans le premier exemple on peut voir que Tsunoda est reconnu comme \"Reticin\" ce qui n'est pas exactement pareil (lol) Et quand on isole le nom Tsunoda dans une image seule : \"Screenshot de reconnaissance de Tsunoda\" Il le lit \"RETLELYY\" ce qui n'est toujours pas exactement ca... Une meilleure r\u00e9solution pourrait peut-\u00eatre r\u00e9soudre le probl\u00e8me en partie. Jusqu'ici les images \u00e9taient en presque 720P ce qui donne ceci : \"Tsunoda en 720P\" Et j'ai lanc\u00e9 une r\u00e9cup\u00e8ration d'images en 1080p pour r\u00e9cup\u00e8rer ceci : \"Tsunoda en 1080P\" On peut voir une certaine diff\u00e9rence tout de m\u00eame. Et quand on lance la reconnaissance : \"Reconnaissance Tsunoda en 1080P\" \"Tsunoda n'est plus \u00e9crit \"RETLELYY\" mais \"TSUNDDA\" ce qui n'est pas parfait mais qui est d\u00e9ja beaucoup mieux. J'ai essay\u00e9 de mettre l'engine de Tesseract en mode \"JPN\" comme Tsunoda est un nom japonais mais sans succ\u00e8s j'ai le m\u00eame r\u00e9sultat. Comme la r\u00e9solution est meilleure je me suis dit que peut \u00eatre le filtre de passage en noir et blanc pourrait aider. J'ai \u00e9crit cette petite methode pour convertir l'image en noir et blanc : private static Bitmap ConvertToBlackAndWhite ( Bitmap inputBmp ) { const int BLACK_TO_WHITE_TRESHOLD = 200 ; Bitmap result = new Bitmap ( inputBmp . Width , inputBmp . Height ); for ( int y = 0 ; y < inputBmp . Height ; y ++) { for ( int x = 0 ; x < inputBmp . Width ; x ++) { Color pixelColor = inputBmp . GetPixel ( x , y ); if ( pixelColor . R <= BLACK_TO_WHITE_TRESHOLD && pixelColor . G <= BLACK_TO_WHITE_TRESHOLD && pixelColor . B <= BLACK_TO_WHITE_TRESHOLD ) { pixelColor = Color . FromArgb ( 0 , 0 , 0 ); } else { pixelColor = Color . FromArgb ( 255 , 255 , 255 ); } result . SetPixel ( x , y , pixelColor ); } } return result ; } Rien de bien dingue mais cela fonctionne et je peux jouer avec le BLACK_AND_WHITE_TRESHOLD pour changer son comportement. J'ai dabord test\u00e9 avec un treshold de 100 et le programme a r\u00e9ussi \u00e0 me sortir Tsunoda en deux mots ce qui \u00e9tait d\u00e9ja tr\u00e8s encourageant. Et apr\u00e8s avoir augment\u00e9 le Treshold... Tada : \"Tsunoda 1080P avec filtre\" Le programme arrive bien \u00e0 reconnaitre TSUNODA. Je pense que cette tactique ne fonctionnait pas avant car la resolution \u00e9tait trop faible et l'aliasing se m\u00ealait trop avec le texte pour \u00eatre utilisable. Cependant cette technique ne fonctionne pas sur tous les noms. Par example avec Leclerc : \"Leclerc 1080P avec filtre\" On r\u00e9cup\u00e8re \"Leeler'c\" ce qui n'est pas bon du tout. Mais en modulant le Treshold (ici \u00e0 150) On peut de nouveau voir Leclerc \u00eatre reconnu correctement \"Leclerc 1080P avec filtre 2\" Je pense que pour avoir de bons r\u00e9sultats il va falloir faire un algo qui : D\u00e9coupe l'image en autant de plus petites images pour avoir un mot par image. Teste voir si avec l'image originale un nom correspond \u00e0 la liste de pilotes existant. Si cela ne marche pas, on applique le filtre en modulant le Treshold. Dans le cas ou on aurait pas un match parfait on fait un algo qui cherche le nom le plus proche qui existe dans la liste de noms donn\u00e9s. Seulement voila, il n'y a pas que des lettres que l'on veut r\u00e9cup\u00e8rer. On veut surtout pouvoir r\u00e9cup\u00e8rer les chiffres. Pour les chiffres on va avoir des soucis \u00e9galement... Si on essaie directement la m\u00eame technique sans filtre on a des r\u00e9sultats comme celui ci : \"Tentative de reconnaisance du timing\" La virgule a tendeance \u00e0 se barrer ce qui est particuli\u00e8rement probl\u00e9matique. Cependant comme les chiffres ont beaucoup moins de possibilit\u00e9es que les lettres et qu'il n'y a pas de probl\u00e8me de langue on devrait pouvoir travailler \u00e0 faire des r\u00e8glage que l'on pourra ensuite utiliser. Avec un Treshold de 165 on arrive presque \u00e0 quelque chose d'int\u00e9ressant : \"Tentative 2 de reconnaissance du timing\" Le + n'est clairement pas compris mais ca n'est pas emb\u00eatant car c'est souvent redondant. On arrive cependant \u00e0 isoler 3 et 259. M\u00eame si la virgule n'est pas comprise cela veut dire qu'il est tout de m\u00eame possible de discriminer les secondes des milisecondes. Maintenant avec un temps au tour : \"Reconnaissance du timing au tour\" On arrive sans rien changer aux param\u00eatres \u00e0 isoler minutes secondes et milisecondes. Il semble que la reconnaissance de chiffre soit bien plus efficace que la reconnaissance de lettres. Il va falloir faire un test \u00e0 plus grande \u00e9chelle avec plus d'image pour se rendre compte de la precision. Demain ce qui serait bien cela serait que je fasse un jeu d'images avec des valeurs connues et que je fasse une batterie de tests pour voir \u00e0 quel point je peux faire confiance \u00e0 la reconnaissance des chiffres. Automatiser un syst\u00e8me de test de la sorte me sera tr\u00e8s utile dans le futur pour v\u00e9rifier la non regression de ma reconnaissance de texte quand je tenterai d'y faire des changements. Je suis toujours curieux cependant de voir comment le programme se d\u00e9brouille avec les nombres de tours qui se trouvent dans les icones de pneus.","title":"Vendredi 31/03/2023"},{"location":"jdb.html#lundi-3-avril","text":"Aujourd'hui on va faire un programme qui permet de cr\u00e9er un dataset qui permette de tester le programme de reconnaissance. Je pense que le meilleur moyen de faire serait un programme qui cr\u00e9e le dataset et qui ensuite peut tester diff\u00e9rentes methodes de reconnaissance. Par la m\u00eame occasion je peux d\u00e9velopper la technologie qui va permettre de d\u00e9couper une image en 20 lignes ce qui me servira ensuite pour la reconnaissance. Je me rend compte que pour faire un programme de tests je dois d\u00e9ja avoir une id\u00e9e de la structure de mon programme. Pour le moment je r\u00e9flechis \u00e0 un syst\u00e8me de \"Zones\" et de \"Windows\". L'id\u00e9e serait que une Zone est juste une sous partie d'image qui peut encore \u00eatre d\u00e9compos\u00e9 tandis que chaque Window contient une ou plusieurs informations \u00e0 r\u00e9cup\u00e8rer. J'ai essay\u00e9 de d\u00e9couper l'image pour que cela soit plus clair : \"Main zone\" Ici on peut voir que l'image est d\u00e9coup\u00e9e en plusieurs grandes zones. Dans un premier temps on ne s'occupe que de la premi\u00e8re. Ensuite : \"Driver zone #1\" On peut voir la que cette Main zone serait elle m\u00eame d\u00e9compos\u00e9e en plusieurs plus petites zones. Et ensuite chacunes de ces petites zones : \"Driver windows\" Sera d\u00e9compos\u00e9e en plusieurs windows qui elles sont des zones qui contiennent de l'information. En gros on aurait trois types de zone : Les zones qui contiennent d'autres zones Les zones qui contiennent des Windows Les Windows Cependant en y r\u00e9flechissant on pourrait tout \u00e0 fait avoir seulement des zones et des windows en faisant en sorte que les windows peuvent avoir une liste de windows et une liste de zones. Une zone serait compos\u00e9e de : Une image de d\u00e9part Un rectangle qui la positionne sur cette derni\u00e8re Une liste de zones (potentiellement vide) Une liste de windows (potentiellement vide) Une methode qui permet de r\u00e9cup\u00e8rer une image de la zone Une methode qui permet de lancer la reconnaissance sur chaque window Une window serait compos\u00e9e de : Une image de d\u00e9part (cela peut \u00eatre l'image crop\u00e9e de la zone parente peu importe) Un rectangle qui la positionne sur cette derni\u00e8re Une methode qui permet de r\u00e9cup\u00e9rer un image de la window Une methode qui permet de lancer la reconnaisance sur l'image (Chaque type de zone doit l'impl\u00e9menter) Dans chaque window on peut imaginer que la methode qui fait la reconnaissance au lieu de retourner un objet qui peut contenir nimporte quel type d'information peut envoyer ce qu'elle vient de r\u00e9cup\u00e8rer dans une base de donn\u00e9e ou un objet. Par exemple une Zone de pilote pourrait tr\u00e8s bien contenir un objet pilote et le donner \u00e0 ses windows qui rempliraient ce m\u00eame objet. C'est une reflexion plus stockage que OCR mais c'est int\u00e9ressant pour savoir ce que fait une window des donn\u00e9es qu'elle r\u00e9cup\u00e8re. Dans un premier temps je pense que les windows vont simplement \u00e9crire dans un fichier ce qu'elles trouvent chacunes dans le format qu'elles veulent. Pour comprendre pourquoi je me prend la t\u00eate il faut savoir que chaque window peut avoir acc\u00e8s \u00e0 pleins d'informations diff\u00e9rentes. On pourrait dire qu'elles retournent toutes une string sauf que si ca marche pour un temps au tour ou pour un nom de pilote, cela ne marche pas forc\u00e9ment pour un type de pneu ou un DRS ouver. Comme chaque window a plusieurs types de data elle devra elle m\u00eame se charger de comment la traiter ET de la stocker. Voila un diagramme qui r\u00e9sume comment je vois l'impl\u00e9mentation dans un premier temps : \"Diagramme d'explications\" Voici comment se pr\u00e9sente le squellette d'une Zone : public class Zone { private Bitmap FullImage ; private List < Zone > Zones ; private List < Window > Windows ; private Rectangle _bounds ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap ZoneImage { get { Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( FullImage , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Zone ( Image fullImage , Rectangle bounds ) { FullImage = ( Bitmap ) fullImage ; Init ( bounds ); } public Zone ( Bitmap fullImage , Rectangle bounds ) { FullImage = fullImage ; Init ( bounds ); } private void Init ( Rectangle bounds ) { Bounds = bounds ; Zones = new List < Zone >(); Windows = new List < Window >(); } public void AddZone ( Rectangle bounds ) { if ( Fits ( bounds )) Zones . Add ( new Zone ( ZoneImage , bounds )); } public void AddWindow ( Rectangle bounds ) { if ( Fits ( bounds )) Windows . Add ( new Window ( ZoneImage , bounds )); } private bool Fits ( Rectangle inputRectangle ) { if ( inputRectangle . X + inputRectangle . Width > Bounds . Width || inputRectangle . Y + inputRectangle . Height > Bounds . Height || inputRectangle . X < 0 || inputRectangle . Y < 0 ) { return false ; } else { return true ; } } } Le but est ensuite de cr\u00e9er diff\u00e9rent types de Zones. Par exemple la MainZone devra d\u00e9couper son contenu en 20 parties \u00e9gales pour tenter de chopper les 20 pilotes. Il serait cool de trouver un moyen de calibrer automatiquement. C'est peut-\u00eatre possible de calibrer avec de la reconnaissance de texte, on peut essayer de lancer la reconnaissance et voir ou on trouve du texte avec un peu de chance cela pourrait donner les positions et avec ca on peut peut-\u00eatre determiner des lignes. Et voici le squelette d'une window g\u00e9n\u00e9rique using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace OCR_tester { public class Window { private Bitmap FullImage ; private Rectangle _bounds ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap WindowImage { get { Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( FullImage , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Window ( Bitmap fullImage , Rectangle bounds ) { FullImage = fullImage ; Bounds = bounds ; } public virtual void RecoverInformations () { //Each Window type will have to implement its own way to recover the informations stored in the Window Image } } } Chaque Window pourra ainsi elle m\u00eame impl\u00e9menter la r\u00e9cup\u00e8ration d'informations. La facon de les retourner/stocker est encore un peu floue. Par exemple pour un temps au tour on peut imaginer que il fait une petite v\u00e9rification dans l'objet pilote et dans le tableau des tours si il n'y a pas deja une valeur et si il n'y en a pas une alors il peut l'ajouter. Maintenant je vais essayer de cr\u00e9er une Main window qui se calibre toute seule. Alors apr\u00e8s avoir bien gal\u00e8r\u00e9 avec l'interface pour permettre au user de cliquer sur la form pour voir les zones qu'il cr\u00e9e, j'ai pu cr\u00e9er un zone qui fait les dimensions de MainZone et j'ai pu lancer la reconnaissance sur l'image et voir ou il trouve du texte : \"MainZone avec carr\u00e9s de texte\" Maintenant il faut que je nettoie la liste de rectangle pour exclure ceux qui sont trop grands pour \u00eatre sur une seule ligne, ceux qui indiquent le nombre de tour en haut et ceux qui n'ont pas d'int\u00e9r\u00eats. On pourra ensuite isoler les lignes et cr\u00e9er une liste d'images. Pour ce qui est de la ligne qui contient les \"Gap interval last lap\" et des chiffres sur les tours pour les pneus etc je vais juste demander \u00e0 l'utilisateur de ne pas les prendre dans la screenshot. Comme ils contiennent des mots qui peuvent \u00eatre utilis\u00e9s plus loin dans les data je ne peux pas les blacklister et faire un syst\u00e8me qui s'occupe de les enlever si ils existent selon le position y me prendrait trop de temps pour rien. Apr\u00e8s avoir filtr\u00e9 un peu les resultats et enlev\u00e9 les zones beaucoup trop grandes, on se retrouve d\u00e9ja plus qu'avec ca : \"MainZone avec de meilleurs carr\u00e9s\" Comme on peut le voir, du c\u00f4t\u00e9 gauche de l'image on a beaucoup de choses reconnues mais avec beaucoup de tailles diff\u00e9rentes ce qui n'est pas id\u00e9al. Alors j'ajoute un filtre qui permet de ne selectionner que les data sur la droite. \"MainZone avec de meilleurs carr\u00e9s\" Maintenant il devrait \u00eatre possible de faire un algorythme qui ne prend que un seul carr\u00e9 par ligne. \"MainZone avec un seul carr\u00e9 par ligne\" Maintenant que on sait ou se trouve chaque ligne on peut faire un petit traitement et d\u00e9couper l'image en plusieurs windows. Et voila : \"Mainzone auto calibr\u00e9e\" Maintenant le programme peut cr\u00e9er des zones pour chaque pilote \"Images pilotes\" \"Zone d'un pilote\" Maintenant il faut que j'impl\u00e9mente un syst\u00e8me un peu similaire pour cr\u00e9er des windows. Voici la methode que j'ai cr\u00e9\u00e9 pour l'autocalibration : public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); Zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . tessDataFolder . FullName , \"eng\" , EngineMode . Default ); Image image = ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //var text = iter.GetText(PageIteratorLevel.Word).ToUpper(); //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); Zones . Add ( new Zone ( ZoneImage , windowRectangle )); } } Ca peut paraitre pas \u00e9norme comme code mais pour tout mettre en place ca demande quand m\u00eame pas mal de reflexion. J'ai du clean un peu le code que j'avais fait pour permettre la selection de zones et ajouter la possibilit\u00e9 d'ajouter des windows sur une zone. J'ai juste quelques difficult\u00e9es \u00e0 les ajouter correctement, j'ai un offset tout pourri qui se met tout le temps \"Sainz coup\u00e9\" \"Perez coup\u00e9\" Cela doit \u00eatre un soucis lors de la detection de clic qui met un offset en trop. C'est vraiment p\u00e9nible en tout cas. Certes c'est moins fun de devoir manuellement indiquer ou sont les windows sur une ligne de pilote, mais je ne vois vraiment pas comment faire cela automatiquement. Le but c'est de faire une configuration qui puisse \u00eatre sauvegard\u00e9e comme ca pas besoin d'\u00e0 chaques fois le refaire. C'est bon ! J'avais juste oubli\u00e9 de changer le calcul d'offset entre le code de la zone et de la window. Note pour plus tard, il serait peut-\u00eatre judicieux de faire quelque chose pour la vue, les windows et les Zones ont le m\u00eame exact comportement pour la vue ce qui fait dupliquer du code. Mais au moins maintenant ca fonctionne : \"Ocr tester screenshot\" Et le programme va directement cr\u00e9er un dossier par pilote avec toutes les images de chaque Data le concernant : \"Dossier Perez\" ; Et c'est tout pour aujourd'hui je pense. Ce qui serait cool demain c'est que je puisse stocker d'une mani\u00e8re ou d'une autre ces fichiers de calibration et que je puisse les transf\u00e8rer vers le programme qui va s'occuper de d\u00e9coder et commencer gentillement \u00e0 d\u00e9coder les diff\u00e9rents types de data. Note pour quand je ferai les tests. Je pense que la meilleure id\u00e9e serait que je prenne pleins de photos du style et que je les mette dans un fichier CSV ou JSON avec leur contenu. Et ensuite je le fais passer en tests pour calculer la prescision de mon algo de d\u00e9codage. Pour le moment on est plut\u00f4t dans les clouts niveau planning.","title":"Lundi 3 Avril"},{"location":"jdb.html#mardi-4-avril","text":"Aujourd'hui je suis scens\u00e9 plut\u00f4t bosser sur l'interpretation des donn\u00e9es, mais une id\u00e9e m'a taraud\u00e9 l'esprit toute la nuit. Est-ce que je ne pourrais pas quand m\u00eame essayer de d\u00e9composer la zone de pilote directment comme pour la Main zone. Pour ce faire j'ai tent\u00e9 de faire comme pour la main zone c'est \u00e0 dire lancer la reconnaissance pour savoir ou \u00e9taient tous les champs de donn\u00e9es mais malheureusement je ne pense pas que cela va \u00eatre possible. En effet non seulement ici les champs sont de tailles tr\u00e8s vari\u00e9es, mais en plus la reconnaissance n'arrive pas \u00e0 en r\u00e9cup\u00e8rer le m\u00eame nombre sur chaque ligne ce qui risque d'\u00eatre complexe \u00e0 utiliser ensuite. La preuve : \"Tentative d'auto calibration\" ; Cependant tout n'est pas perdu ! Il y a peut-\u00eatre un moyen qui serait mieux en tous points. Le soucis avec ce type de reconnaissance c'est qu'on utilise beaucoup de ressources inutiles. On peut peut-\u00eatre hard coder la valeur des diviseurs et les utiliser pour cr\u00e9er des zones. Ok alors visiblement c'est un probl\u00e8me car il semble y avoir d'autres pixels de cette couleur dans l'image (Qui l'aurait cru lol) \"Tentative 2\" J'a tent\u00e9 de r\u00e9duire la tol\u00e9rance mais le soucis c'est que c'est soit trop soit pas assez Derni\u00e8re tentative, j'ai essay\u00e9 de prendre plusieurs pixels en hauteur pour chaque incr\u00e9ment de X et en faire la moyenne, et m\u00eame comme ca, impossible de trouver de mani\u00e8re efficace les zones. Je pense que je vais donc revert tous mes changements pour revenir \u00e0 la version ou on les choisissait manuellement. Pas mal de temps perdu mais bon c'est comme ca ca arrive Bon j'ai fait un revert mais j'ai ajout\u00e9 une feature importante. Les zones font la largeur indiqu\u00e9e par l'utilisateur mais elles font la hauteur max comme ca toutes les window font la m\u00eame hauteur et ca permet \u00e0 l'utilisateur de ne pas forc\u00e9ment \u00eatre ultra pr\u00e9cis dans sa selection. Ce qui nous donne : \"Resultat final\" Maintenant je dirais que les deux prochaines choses \u00e0 faire seraient de stocker ces zones dans un fichier JSON ou autre pour que la calibration puisse \u00eatre envoy\u00e9e directement dans le logiciel de reconnaissance et ensuite de faire une calibration sur des images qui font la taille qu'on aura pendant les Grands Prix. Pour le moment elles sont au format 16:10 qui est le format d'\u00e9crant de mon laptop. Pour le stockage j'imagine un fichier qui donne des indications assez simples qui permettent de reconstruire le total des zones quand il est import\u00e9 plutot que d'\u00e9crire les coordonn\u00e9es en dur pour chacunes. Chaque Grande zone va impl\u00e9menter une methode qui s'occupe de mettre tous ses enfants dans un fichier. { \"MainZone\" :{ \"x\" : 10 , \"y\" : 20 , \"width\" : 1450 , \"height\" : 1340 , \"DriverZone\" :{ \"x\" : 0 , \"y\" : 23 , \"height\" : 25 , \"Windows\" :[ { \"DriverPositionWindow\" :{ \"x\" : 0 , \"y\" : 0 , \"width\" : 35 } }, { \"DriverPositionChangesWindow\" :{ \"x\" : 0 , \"y\" : 0 , \"width\" : 45 } } ] } } } C'est le r\u00e9sultat auquel j'aimerais arriver. Mais pour y arriver il faut encore que je cr\u00e9e les diff\u00e9rents types de window. Cela veut dire que je dois d\u00e9cider quelles informations je vais r\u00e9cup\u00e8rer de la page. Par exemple je vais conserver la position du pilote mais au final les changements de positions sont difficiles \u00e0 lire et sont redondants. Si je garde un historique des positions des pilotes je peux calculer moi m\u00eame les changements. Pareil pour gap avec la voiture devant. Je pense que je vais juste garder l'information des \u00e9carts absolus et ensuite je pourrai toujours calculer la diff\u00e9rence entre les pilotes. Ca peut para\u00eetre b\u00eate car cela rajoute du calcul mais en r\u00e9alit\u00e9 le calcul de l'OCR est extr\u00eamement gourmand alors il faut que j'\u00e9vite le plus possible d'y faire recours. Il est bien plus rapide de calculer les \u00e9carts que d'essayer de reconnaitre le texte et le convertir en chiffre. J'ai visiblement ajout\u00e9 un bug dans mon code. Maintenant tous les pilotes ont la m\u00eame image quand on les selectionne. Mais visiblement ca n'\u00e9tait pas le cas avant car j'avais pu prendres des images de chaque pilote. J'ai pass\u00e9 3 minutes \u00e0 fixer un bug stupide j'ai un peu envie de br\u00fbler ma place de travail... Mais bon au moins maintenant cela fonctionne ! Toutes les images sont r\u00e9cup\u00e8r\u00e9es et ont un format correct avec le bon nom : \"Verstappen folder\" Avec un peu de code tr\u00e8s moche j'ai pu cr\u00e9er un fichier JSON qui contient les diff\u00e9rentes infos. Cependant en exportant TOUT on se retrouve avec un fichier de 1200 lignes ce qui n'est pas optimal. Mais quand on regarde, il devrait \u00eatre possible de faire un fichier qui ne contient que les infos d'un seul pilote car ensuite il y a simplement un offset \u00e0 appliquer sur la zone et les windows. Je vais donc pouvoir commencer enfin le logiciel de d\u00e9codage qui prend en entr\u00e9e un fichier JSON comme celui ci qui a \u00e9t\u00e9 g\u00e9n\u00e8r\u00e9 avec le programme de calibration. { \"Main\" : { \"x\" : 40 , \"y\" : 230 , \"width\" : 1845 , \"height\" : 719 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : 3 , \"width\" : 1845 , \"height\" : 35 , \"Windows\" : [ { \"Position\" : { \"x\" : 2 , \"y\" : 0 , \"width\" : 32 }, \"GapToLeader\" : { \"x\" : 204 , \"y\" : 0 , \"width\" : 96 }, \"LapTime\" : { \"x\" : 413 , \"y\" : 0 , \"width\" : 105 }, \"Drs\" : { \"x\" : 526 , \"y\" : 0 , \"width\" : 81 }, e t c... } ] } } ] } } Dans le futur il faudrait ajouter d'autres choses comme par exemple les diff\u00e9rents pilotes pr\u00e9sents sur le Grand Prix et ce genre d'infos. Quoique je vais l'ajouter d\u00e9ja maintenant et plus tard je mettrai en place la feature acessible depuis l'interface. Mais le hardcoder maintenant me permet d\u00e9ja de mieux coder l'autre c\u00f4t\u00e9. Ce programme n'est en aucun cas termin\u00e9 et je vais devoir travailler encore un peu dessus pour qu'il soit utilisable correctement mais au moins il fonctionne \u00e0 peu pr\u00e8s. Exemple du json avec les noms de pilotes: { \"Main\" : { \"x\" : 37 , \"y\" : 238 , \"width\" : 1851 , \"height\" : 713 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : -5 , \"width\" : 1851 , \"height\" : 35 } } ] }, \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , e t c... ] } Maintenant je vais m'attaquer au d\u00e9codage. Demain je dois finir le d\u00e9codage du JSON et je dois commencer \u00e0 impl\u00e9menter la reconnaissance des textes. Voire m\u00eame des pneus etc si j'y arrive.","title":"Mardi 4 Avril"},{"location":"jdb.html#mercredi-5-avril","text":"Bon la il faut vraiment que je finisse assez vite la lecture du JSON et la reconstruction des zones pour commencer la reconnaissance. J'ai pris beaucoup de temps \u00e0 faire le programme de calibration mais je pense que c'est essentiel de prendre ce temps maintenant. (BTW il faudra quand m\u00eame retourner faire une plus jolie version par ce que la ca marche mais c'est tout) Bon apr\u00e8s pas mal de boulot je pense avoir r\u00e9ussi. Dans le nouveau programme on arrive \u00e0 r\u00e9cup\u00e8rer les diff\u00e9rentes zones : \"JSON decode result\" Un conseil de notre professeur M.Bonvin a \u00e9t\u00e9 de cr\u00e9er des Releases de versions qui ne fonctionnent pas ou pas tr\u00e8s bien. J'ai donc publi\u00e9 une premi\u00e8re release de l'OCR_TEST qui fonctionne vite fait. J'ai seulement un petit soucis, comme je recr\u00e9e compl\u00eatement la structure des driver zones avec seulement la premi\u00e8re, il y a un petit d\u00e9calage car entre les zones il y avait un gap. Ce qui fait que si la premi\u00e8re zone est parfaitement centr\u00e9e : \"Centered driver\" La vingti\u00e8me ne l'est plus exactement : \"Uncentered Driver\" Pour ca j'ai essay\u00e9 de mettre un espacement arbitraire mais c'est complexe. Je vais plut\u00f4t tenter de faire une diff\u00e9rence entre la taille de la zone compl\u00eate et de la taille additionn\u00e9e de toutes les fen\u00eatre et diviser le resultat entre toutes les fen\u00eatres. Ca n'est pas parfait mais au moins maintenant les donn\u00e9es ne touchent plus les bords de la fen\u00eatre. Et voila ! Maintenant avec le fichier de configuration en Json on arrive \u00e0 r\u00e9cup\u00e8rer toutes les infos comme si elles avaient \u00e9t\u00e9 envoy\u00e9es directement depuis l'app de calibration mais sans le processing time ! \"Verstappen folder 2 On peut donc ENFIN passer au d\u00e9codage de ces FICHUES donn\u00e9es. Je vais pouvoir impl\u00e9menter ce que j'ai fait dans le projet de test de d\u00e9codage. Gr\u00e2ce \u00e0 mon d\u00e9coupage initial qui m'a pris du temps \u00e0 impl\u00e9menter on a enfin un truc qui marche m\u00eame si je n'ai impl\u00e9ment\u00e9 que la reconnaissance de noms. \"Image reconnaissance propre\" Si on se rappelle du syst\u00e8me de window et de zones dans le diagramme plus haut, c'est assez facile de comprendre comment je m'y suis pris. En gros on des listes et des listes de listes de zones, c'est la partie un peu plus technique car il y a des zones qui peuvent contenir d'autres zones etc. Je vais commencer par la reconnaissance de noms. Voici le tableau de pilotes de 2023 \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , \"Hamilton\" , \"Alonso\" , \"Russel\" , \"Gasly\" , \"Stroll\" , \"Sainz\" , \"Hulkenberg\" , \"Norris\" , \"Tsunoda\" , \"Piastri\" , \"Zhou\" , \"Ocon\" , \"Magnussen\" , \"Perez\" , \"Sargeant\" , \"De Vries\" , \"Bottas\" , \"Albon\" ] ET voici le tableau de pilotes de 2022 : \"Drivers\" : [ \"Leclerc\" , \"Verstappen\" , \"Sainz\" , \"Perez\" , \"Hamilton\" , \"Russel\" , \"Magnussen\" , \"Gasly\" , \"Ocon\" , \"Alonso\" , \"Tsunoda\" , \"Bottas\" , \"Zhou\" , \"Albon\" , \"Stroll\" , \"Schumacher\" , \"Hulkenberg\" , \"Norris\" , \"Latifi\" , \"Ricciardo\" ] Je les notes ici car J'ai souvent besoin de changer selon le dataset que j'utilise. Dans le futur je ferai s\u00fbrement un grand dataset qui prend des pilotes de reserves et des pilotes juniors pour que dans le cas ou un pilote est remplac\u00e9 dans l'ann\u00e9e il n'y a pas besoin de tout recalibrer avec l'application. Apr\u00e8s une discussion avec M.Bonvin j'ai d\u00e9cid\u00e9 de tester 3 valeurs de convertion en noir et blanc et si je ne trouve pas un match exact je prend le nom le plus proche. Pour trouver la string la plus proche je pense que je vais utiliser quelque chose qui s'appelle la technique de Levenshtein. De ce que j'ai compris c'est un algorythme qui permet de donner une metric de diff\u00e9rence entre deux strings. Bon et \u00e9videmment il ne faut pas se tromper dans la liste des pilotes GENRE NE PAS OUBLIER QUE GEORGE RUSSELL COMPORTE DEUX WFNEWIEWV DE \"L\" A LA FIN DE SON NOM CE QUI POURRAIT ENGRANGER 2H DE DEBUGGING POUR RIEN ASK ME HOW I KNOW joker laugh J'ai vraiment un soucis avec Tsunoda, Il a trop tendeance \u00e0 le confondre avec \"TSUNDDA\" et pour des raisons obscures, quand j'applique l'algorythme de Levenshtein le plus proche n'est pas \"Tsunoda\" mais \"Sainz\" iniuvbwdiucbiubisc POURQUOI !!??!! Je pense que cela demande moins de changements de lettres enfin bon c'est quand m\u00eame pas id\u00e9al. Il va falloir que je trouve un moyen de le repond\u00e9rer. C'est dommage par ce que cela marche super avec Alonso Verstappen et Albon. J'ai un peu modifi\u00e9 la methode et j'ai fait en sorte d'envoyer tous les noms en majuscules en me disant que cela pourrait r\u00e9duire le nombre de changements. Et ca a march\u00e9 !! Cela va s\u00fbrement demander plus de tests pour \u00eatre bien s\u00fbr que tout fonctionne nikel, cependant pour le moment ca marche parfaitement avec les pilotes de 2022. Pour ce qui est de la reconnaissance de chiffres, j'ai d\u00e9ja fait une partie du boulot le premier jour alors je vais juste reprendre \u00e0 partir de l\u00e0. Je r\u00e9cup\u00e8re une string de ce type \"1:35.123\" le soucis c'est que les : se transforment parfois en . ou inversement mais bon ca devrait pas \u00eatre trop dur \u00e0 g\u00e8rer. Il faut que je transforme cette string en nombre de milisecondes (Du moins je pense que c'est le meilleur moyen pour ensuite pouvoir facilement comparer et stocker l'information). Cela fait que 1:35:123 en milisecondes donne : 1 * 1000 * 60 => 60'000 35 * 1000 => 35'000 123 => 123 Total : 60'000+35'000+123 => 95'123ms Et pour l'affichage : Minutes = ms / 60'000 secondes = (ms - (minutes/60'000))/1000 ms = ms - ((minutes 60'000) + (secondes * 1000)) Et on se retrouve avec 1:35:123 Maintenant apr\u00e8s un peu de temps pour nettoyer la string etc on se retrouve avec un r\u00e9sultat comme le suivant : Position : 0 Gap to leader : 0:0:0 Lap time : 2:15:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:323 Sector 2 : 0:42:340 Sector 3 : 0:0:0 Evidemment pareil pour les autres pilotes Et je me rend compte que j'ai encore tout cass\u00e9 car le laptime ne devrait pas \u00eatre 2:15 mais 1:35... Voila apr\u00e8s une heure de debugging et des ajouts pour nettoyer les chaines on se retrouve avec : Position : 0 Gap to leader : 0:0:0 Lap time : 1:35:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:323 Sector 2 : 0:42:340 Sector 3 : 0:0:0 Note: le traitement commence \u00e0 devenir long, il serait peut-\u00eatre int\u00e9ressant d'utiliser un seul Tesseract Engine ou de voir ce qui prend autant de temps, on d\u00e9passe la seconde de traitement ce qui est un peu ma limite. Apr\u00e8s on peut toujours tester de rajouter du multicore processing mais c'est pour une autre fois. Demain je m'occupe de r\u00e8gler les soucis que j'ai avec la prescision de ces temps au tour et j'\u00e9sp\u00e8re pouvoir m'occuper aussi de la position des pneus et du DRS. J'aimerais finir tout ca cette semaine.","title":"Mercredi 5 Avril"},{"location":"jdb.html#jeudi-6-avril","text":"Une id\u00e9e m'est pass\u00e9e par la t\u00eate pendant que je dormais, dans la liste des pilotes, quand ils sont \u00e0 plus d'un tour de retard avec le leader (Ce qui arrive normalement dans presque tous les Grand Prix) on a pas des minutes mais une string qui montre \"+1 Lap\" ou \"+2Laps\" ce qui est \u00e9videmment un probl\u00e8me. Je pense qu'une bonne facon d'envoyer l'info serait de retourner -1 -2etc... \u00e0 la place des milisecondes, mais encore faut-il detecter le nombre de tours Je devrais \u00eatre en train de commencer la documentation de commment tout ce que j'ai fait fonctionne. Cependant je ne me vois pas faire ca tant que je n'ai pas au moins r\u00e9cup\u00e8r\u00e9 toutes les infos au moins un peu proprement. Cela veut dire que je commence officiellement \u00e0 prendre du retard. (Sachant que si je finis tout aujourd'hui une journ\u00e9e de doc suffira largement le terme est un peu exag\u00e8r\u00e9 mais bon) Bon pour la reconnaissance des temps c'est sp\u00e9cial... Le filtre semble ne pas changer grand chose ce qui est probl\u00e9matique et ca n'est vraiment pas fiable. Voici quelques expemples avec un treshold de 100: \"11ZSD\" Cette image est comprise comme \"11ZSD\" 42340 Cette image est comprise comme \"42340\" \"ZZAEB\" Et celle ci \"ZZAEB\"... Ce qui... n'est pas bon du tout... J'ai essay\u00e9 de trouver un fichier d'entrainement sp\u00e9cifiquement fait pour les digits. J'ai essay\u00e9 de blacklister les chars non voulus pour tenter d'obliger Tesseract \u00e0 trouver des chiffres. Avec la premi\u00e8re option, les r\u00e9sultats ne sont pas meilleurs voire pires. Avec la seconde option c'est d\u00e9ja pas mal mieux mais on perd compl\u00e8tement la possibilit\u00e9 de detecter les mots comme \"LEADER\" ou \"LAP\" et de toute facon ca n'est pas parfait. Le soucis c'est que si je n'ai pas des donn\u00e9es fiables c'est juste impossible de faire des calculs et de l'affichage correct... Il faut absolument que je trouve une solution. J'ai essay\u00e9 d'utiliser de l'interpolation our augmenter la taille de l'image et ensuite appliquer mon filtre pour retirer le flou mais sans succ\u00e8s... Pourtant la on se retrouve avec des images plut\u00f4t claires : \"Clear1\" Ici le programme trouve \"44301\" \"Clear2\" Et ici \"A5151\"... On a toujours les m\u00eames probl\u00e8mes. Bon je suis all\u00e9 me renseigner sur l'OCR et je me suis dit que j'allais tenter de faire les choses proprement. Je vais faire passer plusieurs \u00e9tapes de postProcessing avant de donner l'image \u00e0 Tesseract. GrayScale Tresholding InvertColors Scaling Dilatation Ce qui donne : \"Original\" \"Grayscale\" \"InvertColors\" ; \"Resize\" ; \"Dilatation\" Ce qui ne change : Roulement de tambour RIEN kjd viuwvuirnvoirenbf Tout ca pour rien... C'EST BON !!! Bon en fait au final le probl\u00e8me \u00e9tait une mauvaise configuration de Tesseract. Je vais devoir un peu nettoyer tout ca. Mais avec les changements de l'image on a des r\u00e9sultats BEAUCOUP plus pr\u00e9cis et potentiellement utilisables. La je vais devoir faire un serieux travail de nettoyage et simplification de mon code par ce que la c'est vraiment un chantier vu le nombre de choses que j'ai du essayer. J'ai du aussi beaucoup modifier la gestion de l'image ce qui donne : \"Clean\" Et la on a des r\u00e9sultats qui sont vraiment bons. J'ai pu ajouter assez facilement la detection de position comme c'est simplement un chiffre. On se retrouve maintenant avec ce genre de retours : Position : 1 Gap to leader : 8:33:51 Lap time : 2:19:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:828 Sector 2 : 0:42:940 Sector 3 : 0:0:0 Position : 2 Gap to leader : 0:3:259 Lap time : 23:12:392 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : VERSTAPPEN Sector 1 : 0:38:119 Sector 2 : 0:0:0 Sector 3 : 0:0:0 Il ne manque plus que l'impl\u00e9mentation de la reconnaissance du DRS et des Pneus Et non... je viens de me rendre compte que mon programme a encore cass\u00e9 car le tap time ne peut pas \u00eatre 23 min lol. J'ai un nouveau magnifique probl\u00e8me... Les points et les deux points sont interpr\u00eat\u00e9s comme des chiffres ... Give me a F * * break... J'ai du mal \u00e0 comprendre pourquoi ils ne sont d\u00e9tect\u00e9s comme tels que maintenant. Bon alors il semblerait les temps au tour aie besoin d'un ordre tr\u00e8s pr\u00e9cis pour fonctionner. Grayscale InvertColors Tresholding Resize * 2 Resize * 2 Et la on a des r\u00e9sultats un peu mieux. Bon demain il faut absolument que je me charge de r\u00e8gler tous ces probl\u00e8mes et que je commence la reconnaissance des pneus et de DRS par ce que je commence \u00e0 \u00eatre en retard.","title":"Jeudi 6 Avril"},{"location":"jdb.html#vendredi-6-avril-2023","text":"Alors aujourd'hui c'est le dernier jour avant de commencer \u00e0 \u00eatre en retard pour de bon. J'ai r\u00e9ussi \u00e0 r\u00e8gler le probl\u00e8me des temps au tour, des gaps, et des secteurs. Dans le processus j'ai cass\u00e9 la detection de position mais ca devrait pas \u00eatre TROP compliqu\u00e9. Et voila ... Apr\u00e8s seulement plus de dix heures de gal\u00e8re, si on donne cette image au programme et le bon JSON le programme nous retourne : Position : 1 Gap to leader : 0:05:059 Lap time : 1:39:123 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : LECLERC Sector 1 : 0:31:828 Sector 2 : 0:42:940 Sector 3 : 0:00:000 Position : 2 Gap to leader : 0:03:259 Lap time : 1:39:392 DRS : False Tyre : Undefined laps with the tyre : 0 Driver name : VERSTAPPEN Sector 1 : 0:31:749 Sector 2 : 0:00:000 Sector 3 : 0:00:000 Evidemment le GapToLeader est faux sur leclerc car il est leader mais bon ca je pourrai toujours Hardcoder que le premier a jamais de GapToLeader. Bon j'ai eu beaucoup de soucis que je ne vais pas mentionner ici car ce sont simplement des soucis de logique de programmation pour trouver un DRS ouvert ou non. Au final la technique que j'utilise et qui marche plut\u00f4t bien pour le DRS est que je prend la premi\u00e8re image de DRS et je la d\u00e9clare comme valeur \u00e9talon d'un DRS non actif, en effet dans 99% des cas le leader n'a pas de DRS (cela peut arriver alors il faudra donc juste verifier que les pilotes sont bien \u00e0 moins de deux secondes les uns des autres pour confirmer). Ensuite cette valeur \u00e9talon je la calcule en fonction du nombre de pixels verts dans l'image et si il y a plus de 30% de pixels verts en plus c'est que le DRS est activ\u00e9 ex: Ceci est un DRS ferm\u00e9: \"Closed DRS\" Ceci est un DRS ouvert: \"Open DRS\" Cela marche \u00e0 peu pr\u00e8s tout le temps mais dans le pire des cas on peut toujours verifier que les pilotes sont bien proches pour detecter les potentiels rares cas de faux positifs. J'ai pu augmenter les performances en utilisant un seul engine pour tout le monde et en arr\u00eatant d'utiliser GetPixel et SetPixel qui sont simplement des horreurs \u00e0 utiliser. Mais elles ne sont pas encore bonnes Le soucis avec la detection de pneus cependant, c'est qu'il n'est pas possible d'utiliser la reconnaissance pour savoir ou regarder la couleur car cela ne marcherait pas. Je ne peux pas faire trop de post processing car je dois conserver la couleur Je ne peux pas hardocder un endroit ou aller regarder car cela \u00e9volue tout le long du Grand Prix. Bref c'est la gal\u00e8re. En y r\u00e9flechissant je me suis dit qu'une bonne id\u00e9e pourrait \u00eatre de partir de la droite de la zone du pneu en regardant au milieu de la hauteur. Puis continuer vers la gauche jusqu'\u00e0 ce que je rencontre une couleur diff\u00e9rente. Je pourrai ensuite faire une zone un peu vers la gauche qui devrait contenir les infos du pneu et sur laquelle il sera possible de faire de le reconnaissance de couleur et de la reconnaissance de chiffres. J'ai d\u00e9termin\u00e9 que le background n'\u00e9tait jamais plus clair que #505050 et que donc nimporte quelle couleur qui aurait plus que 50 dans un seul des channels serait consid\u00e8r\u00e9e comme une couleur cassant le background Pour arriver \u00e0 cette conclusion je me suis amus\u00e9 un peu avec les couleurs pour jouer avec les limites de mon algorythme : \"Color fun\" Et je crois que j'ai eu une bonne id\u00e9e, avec une petite methode bien faite on arrive \u00e0 de supers r\u00e9sultats : private Rectangle FindTyreZone () { Bitmap bmp = WindowImage ; int currentPosition = bmp . Width ; int height = bmp . Height / 2 ; Color limitColor = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Color currentColor = Color . FromArgb ( 0 , 0 , 0 ); Size newWindowSize = new Size ( bmp . Height , bmp . Height ); while ( currentColor . R <= limitColor . R && currentColor . G <= limitColor . G && currentColor . B <= limitColor . B && currentPosition > 0 ) { currentPosition --; currentColor = bmp . GetPixel ( currentPosition , height ); } //Its here to let the new window include a little bit of the right side int offset = Convert . ToInt32 (( float ) newWindowSize . Width / 100f * 20f ); int CorrectedX = currentPosition - ( newWindowSize . Width - offset ); if ( CorrectedX <= 0 ) return new Rectangle ( 0 , 0 , newWindowSize . Width , newWindowSize . Height ); return new Rectangle ( CorrectedX , 0 , newWindowSize . Width , newWindowSize . Height ); } \"Tyres\" Maintenant cela devrait \u00eatre beaucoup plus simple de trouver la couleur g\u00e9n\u00e9rale et le nombre de tours. Donc ce que je fais c'est que je fais une reconnaissance de texte sur l'image r\u00e9duite. Si je trouve une lettre c'est facile Ca me donne le type de pneu et ca me dit que c'est le premier tour avec. Si c'est un nombre alors je fais la moyenne de toutes les couleurs de l'image et je prend la couleur de pneu la plus proche. Voici les diff\u00e9rentes couleurs de pneus : SOFT : #FF0000 MEDIUM : #f5bf00 HARD : #d9d8d4 INTER : #00a42e WET : #2760a6 \"Tyre colors\" Les couleurs de pneus peuvent changer de temps \u00e0 autres, par exemple cette r\u00e8gle de pneus est arriv\u00e9e en 2019 et avant il y avait beaucoup plus de couleurs mais dans une volont\u00e9 de rendre le sport plus facile \u00e0 comprendre \u00e0 la t\u00e9l\u00e9 cela a \u00e9t\u00e9 simplifi\u00e9. Je ne pense pas que cela va changer dans les ann\u00e9es qui viennent alors tout est hardcod\u00e9. Je pense que j'ai des soucis avec la detection de texte et de couleur car ma zone est trop grande. Alors bon j'\u00e9crit ces lignes apres des heures de tests. Il semble que la principale difficult\u00e9 avec ces pneus c'est que les chiffres ou lettres sont minuscules. Il est donc extr\u00eamement difficile de faire une reconnaissance ne serait-ce qu'un peu fiable.. Je fais de mon mieux pour tenter de r\u00e8gler le soucis cependant c'est vraiment complexe. Je commence \u00e0 devenir fou, je tente tout et nimporte quoi pour permettre \u00e0 mon algo de fonctionner et m\u00eame quand je fais du post processing comme pas possible il me retourne toujours nimporte quoi... \"5i t'inqui\u00e8tes\" Ici le programme va trouver '5i'... En fait c'est complexe d'expliquer tout ce que je fais car je change tout en boucle en essayant et en ratant ce qui prend des heures. Pour aujourd'hui j'abandonne je vais simplement rentrer chez moi et y r\u00e9flechir cette nuit mais je ne vois pas comment mieux faire la... C'est terrible par ce que je sens que je ne suis pas bien loin.","title":"Vendredi 6 Avril 2023"},{"location":"jdb.html#vacances","text":"Bon je vais un peu laisser de c\u00f4t\u00e9 la detection de chiffres pour me pencher un peu plus sur la d\u00e9tection de couleur. Par ce que techniquement si j'arrive \u00e0 toujours parfaitement la detecter alors je pourrais me passer des chiffres car ils sont redondant si je construit un historique de pneus. J'ai r\u00e9ussi \u00e0 fix mon probl\u00e8me de mauvaise detection de couleur de pneus. Du moins je crois. Seulement j'ai quand m\u00eame un souci, les fen\u00eatres de pneus avec une lettre n'ont pas assez de couleur pour \u00eatre d\u00e9tect\u00e9s. Je vais donc essayer de detecter les cinq lettres possibles et si il ne trouve pas alors je pourrai tenter de detecter les chiffres sans lettres ce qui devrait grandement aider. Le but est encore une fois de r\u00e9duire les possibilit\u00e9s de Tesseract. Je me rend de plus en plus compte que le plus important c'est de r\u00e9duire le scope le plus possible. Moins il y a de mots et lettres et de chiffres possibles meilleure sera la reconnaissance. Bon ca ne veut toujours pas marcher maintenant le 11 est interpr\u00eat\u00e9 comme trois I ou comme un M... J'en ai marre sans rire c'est vraiment p\u00e9nible. Alors j'\u00e9crit ces lignes deux jours plus tard et me rend compte avec horreur que toutes mes modifications sur ce journal de bord n'ont pas \u00e9t\u00e9 auvegard\u00e9e... yess.. Bon pour faire simple, j'ai r\u00e9ussi \u00e0 rendre la detection de couleurs bien plus efficace en r\u00e9duisant la taille de l'image et en ne prenant pas en compte les couleurs que l'on d\u00e9tecte comme \u00e9tant partie int\u00e9grante du background. Par exemple quand on a une image comme celle ci : \"Avec background\" qui contient un background alors que ci dessous, on l'a enlev\u00e9. \"Sans background\" La diff\u00e9rence est t\u00e9nue mais elle permet de grandement am\u00e9liorer la prescision de la reconnaissance de couleurs. Pour ce qui est du nombre de tours je me suis rendu compte que cela n'\u00e9tait d\u00e9ja pas tr\u00e8s utile car avec l'historique on devrait pouvoir le d\u00e9duire. Mais bon pour la forme je me suis dit que cela serait quand m\u00eame une bonne id\u00e9e de v\u00e9rifier avec la reconnaissance. J'\u00e9tais quasi certain que le soucis \u00e9tait le fait que l'on voie le contour du logo de pneu qui faisait que la reconnaissance avait du mal. Et j'avais raison ! En les enlevant (Ce qui n'a pas \u00e9t\u00e9 simple) J'ai pu avoir des chiffres beaucoup plus proches de la r\u00e9alit\u00e9. En m\u00eame temps je ne vois pas bien comment j'aurais pu faire mieux : \"Super 11\" Je suis quand m\u00eame assez fier de voir que j'ai r\u00e9ussi \u00e0 part de l'image que on peut voir un peu plus haut et automatiquement la transormer en celle ci-dessus. J'ai donc pu retirer le round autour du chiffre et cela m'a permit de pouvoir d\u00e9zoomer un peu et c'est avec ca que les lettres ont pu \u00eatre mieux reconnues : \"Super H\" \"Super M\" Maintenant je pense qu'il ne reste \"plus qu'\u00e0\" nettoyer un peu tout ce code qui traine de partout pour tout faire fonctionner et impl\u00e9menter un peu de parrallel processing ainsi que de l'asynchrone pour ne pas bloquer le reste du programme. Par ce qu'il faut savoir que en l'\u00e9t\u00e2t, le programme met 25 secondes \u00e0 d\u00e9marrer et consomme presque 2GB de Ram. Certes cela ne veut pas dire que la reconnaissance \u00e0 elle seule prend 25 secondes car au d\u00e9marrage il y a aussi la lecture du fichier de config et la cr\u00e9ation des window etc.. En r\u00e9alit\u00e9 la partie strictement OCR prend dans les 12s si on en croit la fonction stopWatch de C#. Et quand on change d'image la reconnaissance prend 9s. Dans tout les cas c'est BEAUCOUP trop. J'aurais eu comme objectif de faire une reconnaissance toutes les secondes. Je ne sais pas bien si cela va \u00eatre possible mais en tout cas le but va \u00eatre de s'en rapprocher. Pour \u00eatre plus exact et permettre une comparaison, voici les stats exactes Avec un fichier d'images vide : Loading - 11.8s Splitting d'images - 90ms OCR - 12.5s Avec un fichier d'images plein : Loading - 10.8s Splitting d'images - 80ms Ocr - 11.6s En passant d'une image \u00e0 l'autre : Loading - NaN Splitting d'images - 50ms Ocr - 8.8s Donc on peut voir que les deux endroits ou le programme prend le plus de temps c'est au premier d\u00e9marrage quand il faut lire le fichier et setup les windows etc... Et l'OCR qui prend un temps fou. Ce qui est pratique c'est que les presque 2gb de ram sont utilis\u00e9s que au lancement et ensuite l'application n'en utilise que quelques centaines de mb. Le processeur lui tourne entre 10 et 20% ce qui ne va pas durer :) Je vais m'occuper dabord du loading. J'ai essay\u00e9 d'utiliser un Parrallel.For au moment de la cr\u00e9ation des windows, le probl\u00e8me c'est que visiblement les objets windows sont beaucoup trops complexes et utilisent trop de ressources partag\u00e9es pour \u00eatre vraiment thread Safe. J'\u00e9sp\u00e8re que je n'aurais pas trop de soucis avec ca qu'en j'en viendrai \u00e0 l'optimisation de l'OCR... Ce qui me rend fou c'est que cette boucle toute nulle prend plus de dix secondes \u00e0 s'executer et je ne comprend pas bien pourquoi. for ( int i = 0 ; i < NUMBER_OF_DRIVERS ; i ++) { Point tmpPos = new Point ( 0 , FirstZonePosition . Y + i * FirstZoneSize . Height - Convert . ToInt32 ( i * offset ) /*- (i* (FirstZoneSize.Height / 32))*/ ); Zone newDriverZone = new Zone ( MainZoneImage , new Rectangle ( tmpPos , FirstZoneSize )); Bitmap zoneImg = newDriverZone . ZoneImage ; newDriverZone . AddWindow ( new DriverPositionWindow ( zoneImg , new Rectangle ( driverPositionPosition , driverPositionArea ))); newDriverZone . AddWindow ( new DriverGapToLeaderWindow ( zoneImg , new Rectangle ( driverGapToLeaderPosition , driverGapToLeaderArea ))); newDriverZone . AddWindow ( new DriverLapTimeWindow ( zoneImg , new Rectangle ( driverLapTimePosition , driverLapTimeArea ))); newDriverZone . AddWindow ( new DriverDrsWindow ( zoneImg , new Rectangle ( driverDrsPosition , driverDrsArea ))); newDriverZone . AddWindow ( new DriverTyresWindow ( zoneImg , new Rectangle ( driverTyresPosition , driverTyresArea ))); newDriverZone . AddWindow ( new DriverNameWindow ( zoneImg , new Rectangle ( driverNamePosition , driverNameArea ))); newDriverZone . AddWindow ( new DriverSector1Window ( zoneImg , new Rectangle ( driverSector1Position , driverSector1Area ))); newDriverZone . AddWindow ( new DriverSector2Window ( zoneImg , new Rectangle ( driverSector2Position , driverSector2Area ))); newDriverZone . AddWindow ( new DriverSector3Window ( zoneImg , new Rectangle ( driverSector3Position , driverSector3Area ))); MainZone . AddZone ( newDriverZone ); } Alors que Zone.AddWindow c'est simplement : public virtual void AddWindow ( Window window ) { Windows . Add ( window ); } Et windows est simplement une liste. Donc ca ne peut pas \u00eatre ca qui prend du temps. Et les windows que je cr\u00e9\u00e9 ont ca comme code : public DriverPositionWindow ( Bitmap image , Rectangle bounds ) : base ( image , bounds ) { Name = \"Position\" ; } Sachant que le constructeur de base d'une Window c'est : public Window ( Bitmap image , Rectangle bounds ) { Image = image ; Bounds = bounds ; Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } Sachant que TesseractEngine est en statique et que donc il ne devrait... OHLLALALALALALALALALA je suis un imb\u00e9cile... J'ai juste \u00e0 changer ce constructeur avec ca: if ( Engine == null ) { Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } ET le loading ne prend plus que 2-300 ms... Bon c'est une tr\u00e8s belle am\u00e9lioration pour pas tr\u00e8s ch\u00e8r mais bon c'est un peu b\u00eate... Bon je pense que 2-300ms c'est une dur\u00e9e correcte surtout que ca n'est appel\u00e9 qu'une fois pour le lancement. On peut passer \u00e0 la suite maintenant. Alors il y a un grand soucis avec la parallellisation de l'OCR... Tesseract n'est pas par d\u00e9faut une classe \"Thread safe\" ce qui veut dire que je ne peut utiliser de parallell.Foreach sur mes windows pour acc\u00e8l\u00e8rer le traitement drastiquement. Je pourrais par exemple avoir une instance de Tesseract par window sauf que cela fait 20 pilotes * 9 windows chacuns ce qui donne 180 instances ce qui n'est tout simplement pas raisonnable. Je vais donc essayer de voir avec l'utilisation de methodes asynchrones qui me permettraient de faire un genre de flux tendu de reconnaissance. J'avoue que la je navigue un peu \u00e0 vue, je me base sur diff\u00e9rentes infos que je trouve sur des sites un peu perdus et sur chatGPT, j'esp\u00e8re que j'arriverai \u00e0 trouver une solution car 10 secondes de reconnaissance c'est vraiment beaucoup trop. Alors le soucis avec un Engine unique entre toutes les windows c'est qu'il n'est pas possible de process plusieurs images \u00e0 la fois. Je vais donc retirer l'engine unique pour voir si en cr\u00e9er un par window me permet de passer en multithreading. La grande question sera : Est-ce que les ressources suppl\u00e9mentaires que vont prendre la cr\u00e9ation de tous ces engines va compenser enti\u00e8rement le temps gagn\u00e9 avec la paralellisation. Pour stocker les donn\u00e9es dans un premier temps je vais cr\u00e9er un objet DriverData. Ce qu'il y a de pratique avec ca, c'est que je pourrais ajouter du code de v\u00e9rification de certaines donn\u00e9es directement dedans avant de les donner \u00e0 la suite du programme. Et on peut m\u00eame imaginer une impl\u00e9mentation d'une liste de DriverData pour avoir l'historique. Ce qui serait cool ca serait de grouper toutes ces data avec un num\u00e9ro de tour. Placer ensuite la liste de Data dans une DB serait ainsi super simple. Mais il va falloir savoir quoi mettre, quelles infos sont redondantes et prendre en compte le fait que un tour affich\u00e9 sur la page de la F1TV n'est accompli que par certains des premiers pilotes. D'autres pilotes peuvent \u00eatre dans des tours pr\u00e9c\u00e9dents si ils ont du retard. Il faudra r\u00e9fl\u00e9chir \u00e0 cela quand je viendrai au mod\u00e8le. Bon pour y arriver j'ai du faire de gros changements et le r\u00e9sultat n'est peut-\u00eatre pas aussi cool que ce que j'aurais voulut... Voici un petit point sur les performances maintenant J'ai \u00e9galement d\u00e9sactiv\u00e9 le dump d'images. Pour le moment j'ai tout mis en commentaire mais cela pourrait \u00eatre int\u00e9ressant de faire en sorte de pouvoir l'activer en changeant une ou deux variables Au d\u00e9marrage : Loading - 113ms Splitting d'images - 14ms Ocr - 7s En passant d'une image \u00e0 l'autre : Loading - 113ms Splitting d'images - 13ms Ocr - 5s Alors clairement les stats montrent qu'il y a eu un changement mesurable mais bon je pensais pouvoir en gagner un peu plus... Je soupconne la cr\u00e9ation d'engines d'\u00eatre \u00e0 l'origine de ces performances presque d\u00e9cevantes. Autre soucis, il semble que plus je change d'image plus la detection est lente et plus je consomme de RAM. Il va falloir que je travaille encore un peu. J'ai tent\u00e9 de mettre un stopwatch sur une des cr\u00e9ations d'engine Tesseract et le r\u00e9sultat me parait fou... Plus d'une seconde c'est dingue. J'ai test\u00e9 dans d'autres endroits du code et effectivement il semble que la cr\u00e9ation d'un engine prenne entre une et deux secondes ce qui est une ETERNITEE what ! Donc il faut optimiser tout ca. Une id\u00e9e serait de d\u00e9composer le threading mais cela me demanderait un gros refactor et je n'ai pas envie d'en refaire un la... Sinon, une fois qu'ils sont cr\u00e9\u00e9s ils ne prennent pas de temps du tout. Cr\u00e9er une fois tous les engines et ensuite les utiliser pourrait \u00eatre une bonne id\u00e9e. Cela prendrait longtemps au load mais ensuite les reconnaissances devraient \u00eatre super rapides. Ok alors ca c'est d\u00e9ja plus ce \u00e0 quoi je m'attendais ! On est de nouveau \u00e0 plus de 10s de loading time mais on est descendu \u00e0 deux secondes par OCR. (Bon autre soucis, l'utilisation de la RAM est ridicule plus de 2gb mais ce qui m'inqui\u00e8te c'est que j'ai l'impression qu'elle augmente plus on change d'image) J'ai r\u00e8gl\u00e9 (en partie) le soucis en obligeant le GC (Garbage Collector) \u00e0 collecter apr\u00e8s chaque detection. m\u00eame apr\u00e8s 50 detections l'utilisation de la ram se stabilize autour des 2GB. Bon en paralellisant la cr\u00e9ation des Engines le soucis c'est que cela demande d'allouer beaucoup trop de m\u00e9moire d'un coup alors le programme se fige pendant genre cinq secondes avant de tout cr\u00e9er. Du coup m\u00eame si la cr\u00e9ation est plus rapide, on se retrouve avec un temps total plus long... Je pense que l'on va devoir se contenter de ces dix secondes. Bon la j'allais tenter de faire la documentation mais je viens de me rendre compte que la detection de temps au tour est pas vraiment encore id\u00e9ale... J'ai r\u00e9ussi \u00e0 changer un petit peu le programme de reconnaissance pour rendre la reconnaissance un peu meilleure mais cela a drastiquement augment\u00e9 le temps requis pour d\u00e9coder... On arrive \u00e0 3.5 secondes. Je vais tenter de rajouter un peu de parralell processing sur les boucles de traitement voir si cela peut aider. Alors effectivement cela aide pas mal, on arrive maintenant \u00e0 faire une detection presque tout le temps en dessous de la seconde. Et j'ai aussi du changer un peu le fonctionnement de la detection des Temps au tour. Et voila je pense que je vais m'arr\u00eater la pour la partie d\u00e9codage. Je ne pense pas que je peux facilement faire mieux que ca et il faut que j'avance dans d'autres parties du projet. Je vais pouvoir commencer \u00e0 documenter un peu toute la partie OCR. Il faut que je prenne le temps de le faire bien car c'est la partie la plus int\u00e9ressante du projet et ou je pense que j'aurai le plus essay\u00e9 de choses qui vallent le coup d\u00eatres racont\u00e9es. J'ai aussi pass\u00e9 pas mal de temps sur le poster du projet. J'avais fait des croquis au crayon de ce \u00e0 quoi je pensais, cependant apr\u00e8s de longues discussions avec M.Garcia ils n'\u00e9taient pas forc\u00e9ment tr\u00e8s bons car ils ne repr\u00e9sentent pas assez bien le fonctionnement du projet et sont un peu trop marketings. Du coup j'ai fait une premi\u00e8re version au propre : \"Poster V1\" Mais je n'\u00e9tais pas forc\u00e9ment content du r\u00e9sultat et il manquait des choses je trouve comme par exemple l'utilisation de Selenium. J'ai donc repass\u00e9 des heures \u00e0 faire une seconde version : \"Poster V2\" La police d'\u00e9criture n'est pas encore la bonne mais cela va venir. Mais je pr\u00e9f\u00e8re d\u00e9ja beaucoup cette version \u00e0 la premi\u00e8re. Je ne sais pas encore si la version finale sera une version plus travaill\u00e9e de ce poster ou compl\u00eatement autre chose mais pour l'instant je suis \u00e0 peu pr\u00e8s content de cette version. Je le trouve un tout petit peu trop brouillon ou avec trop d'infos mais il m'a \u00e9t\u00e9 de nombreuses fois reproch\u00e9 de ne pas assez montrer le fonctionnememt interne et je ne peux pas faire plus simple. L'ajout des nombres pour compartimenter le projet ajoute de la structure mais je me demande si cela suffit. Maintenant que je suis \u00e0 peu pr\u00e8s content de mon code pour l'OCR je vais commencer sa documentation. (Uniquement son fonctionnement interne pas comment s'en servir car cela va changer) Bon j'ai cr\u00e9\u00e9 u nouveau projet selenium mais m\u00eame avec les bonnes libraries je n'arrivais pas \u00e0 faire fonctionner firefox j'avais toujours une erreur \"OpenQA.Selenium.WebDriverException: 'Cannot start the driver service on http://localhost:51481/'\" et j'ai pu r\u00e8gler le probl\u00e8me en t\u00e9l\u00e9chargeant directement le gecko driver depuis le git https://github.com/mozilla/geckodriver/releases et utiliser le fichier directement dans le service : var service = FirefoxDriverService . CreateDefaultService ( AppDomain . CurrentDomain . BaseDirectory + @\"geckodriver-v0.27.0-win32\\geckodriver.exe\" ); FirefoxOptions options = new FirefoxOptions (); var driver = new FirefoxDriver ( service , options ); Le seul probl\u00e8me c'est que du coup il faut tout le temps d\u00e9placer le fichier dans le dossier bin si je clone le projet. Il faudra faire un installeur dans la version finale qui s'occupe de tout je pense. Je me suis dit que j'allais garder la doc pour le retour des vacances quand j'aurai un bureau un clavier et un setup complet un peu propres. Bon il va falloir que je parle de la r\u00e9cup\u00e9ration de cookie. J'ai d\u00e9ja pu travailler lors d'un poc sur la meilleure facon de prendres des screenshots de la F1TV : Avoir une page chrome ouverte avec le feed en plein \u00e9cran et un programme qui prend des captures d'\u00e9crans. Avoir une cam\u00e9ra qui prend en photo l'\u00e9cran au cas ou chrome et Firefox emp\u00eachent la prise de captures d'\u00e9crans. R\u00e9cup\u00e8rer directement le feed en faisant du reverse engeneering de la plateforme. Simuler un chrome en background qui prenne des screenshot sans qu'on aie \u00e0 le voir. Dans toutes ces options, je dirais que la pire \u00e9tait celle de la cam\u00e9ra qui filme l'\u00e9cran, mais \u00e0 l'\u00e9poque c'\u00e9tait encore envisageable comme solution de dernier recours. Le soucis de cette solution c'est l'horreur que serait la partie OCR avec une image de tr\u00e8s mauvaise qualit\u00e9. Une autre option qui m'aurait vraiment emb\u00eat\u00e9 aurait \u00e9t\u00e9 de devoir garder une page de Chrome ou Firefox ouverte quelque part sur un \u00e9cran pour que le programme puisse prendres des captures d'\u00e9crans. C'est de loin l'option la plus simple et la plus logique mais elle poss\u00e8de pour moi de tr\u00e8s gros points noirs : On ne peut pas certifier l'int\u00e9grit\u00e9 des donn\u00e9es car l'utilisateur a le contr\u00f4le total sur le feed. Il peut mettre pause, avancer, reculer, tout casser sans faire expr\u00e8s en ouvrant autre chose sur son ordi qui se mette pile devant. Bref c'est un peu bancale. Et surtout on bloque une partie non significative de l'\u00e9cran de l'utilisateur avec des infos redondantes. Et je peux vous dire que quand je commente la F1 j'ai besoin de beaucoup d'informations et que chaque centim\u00e8tre d'\u00e9cran est crucia\u00e9 ! Alors avoir un \u00e9cran complet bloqu\u00e9 est juste un point bloquant qui m'emp\u00eacherait d'utiliser l'app aussi bonne soit-elle dans ses pr\u00e9dictions. Mais bon si aucune autre methode ne fonctionne ce qui est bien c'est que celle la est plut\u00f4t simple \u00e0 mettre en place. Ensuite reverse engeneer le feed serait l'option la plus classe, cependant c'est la plus complexe et la plus bancale au niveau l\u00e9gal haha. L'id\u00e9e serait de r\u00e9cup\u00e8rer le lien vers le broadcast g\u00e9n\u00e9ral et de comprendre comment il fonctionne pour le d\u00e9coder nous m\u00eame pendant un Grand Prix. Seuls soucis : Il n'est pas possible de faire des tests en dehors des periodes de Grand Prix (Et je rappelle que c'est des p\u00e9riodes ou je travaille en plus) Difficile de faire un syst\u00e8me qui marche pareil pour les rediffusions et les lives. (En effet les liens des rediff sont beaucoup plus simple \u00e0 r\u00e9cup\u00e8rer mais ne fonctionnent pas du tout pareil et pour tester l'app il est essentiel de pouvoir s'entrainer sur des anciens Grand Prix) Dernier GROS soucis, je ne sais tout simplement pas faire ca lol. Je ne sais pas comment faire. Peut-\u00eatre que avec des profs qui m'aident et chat gpt ainsi qu'internet je pourrais potentiellement n\u00e9gocier un truc mais c'est hautement improbable et cela serait une perte de temps folle si je n'y arrive pas. Derni\u00e8re option que je trouve la plus s\u00e9duisante. Simuler une instance de Chrome ou de Firefox (Le soucis avec chrome c'est qu'il impl\u00e9mente l'utilisation de DRM dans les vid\u00e9os qui fait qu'il est tr\u00e8s difficile de passer outre la s\u00e9curit\u00e9 avec un bot) pour ensuite prendre des captures d'\u00e9crans automatiquement. Cette solutions offre pleins d'avantages : Pas de place prise sur l'\u00e9cran L'int\u00e9grit\u00e9 des donn\u00e9es est assur\u00e9e car c'est le programme qui d\u00e9cide d'ou partir et de si il met pause ou non C'est une option complexe mais beaucoup moins que le reverse engeneering Elle permet de ne demander presque aucun input de la part de l'utilisateur. Mais elle pose quelques probl\u00e9matiques : Comment se connecter automatiquement sans \u00eatre detect\u00e9 par un Bot et sans demander \u00e0 l'utilisateur ses identifiants (Pour des raisons \u00e9videntes qui sont : QUI VA METTRE SES IDENTIFIANTS SUR UNE VIEILLE APP COMME LA MIENNE??) Comment faire en sorte que le programme prenne les meilleures captures dans la meilleure qualit\u00e9 et en plein \u00e9cran. Mais j'ai d\u00e9cid\u00e9 de partir sur cette option. Pour ce faire j'utilise Selenium. J'ai pu tester Puppetteer Sharp et m\u00eame si dans un premier temps j'ai pu avancer asez vite, malheureusement il y a des bugs qui rendent son utilisation impossible dans notre contexte. J'ai donc d\u00e9cid\u00e9 de tout faire en utilisant un portage de Selenium dans mon programme. Voici un exemple de code qui va ouvrir FireFox et qui va lancer un RickRoll var service = FirefoxDriverService . CreateDefaultService ( AppDomain . CurrentDomain . BaseDirectory + @\"geckodriver-v0.27.0-win32\\geckodriver.exe\" ); service . Host = \"127.0.0.1\" ; service . Port = 5555 ; FirefoxOptions options = new FirefoxOptions (); options . AddArgument ( \"--disable-headless\" ); var driver = new FirefoxDriver ( service , options ); driver . Navigate (). GoToUrl ( \"https://www.youtube.com/watch?v=dQw4w9WgXcQ&autoplay=1&mute=1\" ); Dans cet exemple on d\u00e9sactive le \"Headless\" pour qu'on puisse voir ce que fait l'app car sinon tout est invisible. Alors dans les faits la vid\u00e9o youtube ne se lance pas du tout car il y a des pubs et des prompts de cookies que l'on doit accepter etc... ce qui montre les diff\u00e9rents challenges que l'on va devoir surmonter pour vraiment faire ce que l'on veut. Mais un petit d\u00e9tail extr\u00eamement important, la F1TV est un programme payant un peu comme netflix. Ce qui veut dire que pour acc\u00e8der au contenu il faut \u00eatre connect\u00e9. Sauf que une instance de firefox cr\u00e9\u00e9 par Selenium est comme une page de naviguation priv\u00e9e, ce qui veut dire que si on va sur la page de la F1TV on est pas connect\u00e9s. Je pourrais tout \u00e0 fait demander \u00e0 l'utilisateur de me donner ses identifiants pour que j'aille ensuite automatiquement me connecter sauf que cela pose deux soucis: Personne ne voudra mettre ses identifiants sur mon programme La page de login de la F1TV a \u00e9t\u00e9 prot\u00e8g\u00e9e avec la meilleure technologie de detection de bots que je connaisse. Presque aucun site n'arrive \u00e0 me detecter sauf eux ! Donc c'est tout simplement impossible d'utiliser cette technique. Ensuite je me suis rappel\u00e9 que ce que la page stocke pour me permettre de rester connect\u00e9 ce sont des cookies. Et si je mets le bon cookies dans Selenium alors je serai connect\u00e9. Dans un premier temps je voulais faire un syst\u00e8me ou l'utilisateur irait prendre dans son chrome son cookie et le copie colle dans mon programme mais c'est immonde. C'est alors que vient la partie r\u00e9cup\u00e8ration de cookies ! Tous les cookies de chrome sont stock\u00e9s dans une base de donn\u00e9es SQLITE. On pourrait se dire Banco il suffit d'aller dedans et de retrouver tous les cookies et se connecter. Sauf que, pas b\u00eates, les \u00e9quipes de chrome ont d\u00e9cid\u00e9 que c'\u00e9tait une bonne id\u00e9e d'encoder les cookies pour que tout le monde ne puisse pas venir y mettre son nez... En effet les cookies peuvent contenir des informations importantes. Cela fait que pour utiliser ces cookies il faut pouvoir les d\u00e9coder. Mon hypoth\u00e8se a \u00e9t\u00e9 que si ces cookies peuvent \u00eatre lus par Chrome m\u00eame hors connexion, c'est que la cl\u00e9 de d\u00e9codage existe sur l'appareil et qu'il suffit de la trouver. ET C'EST LE CAS! Apr\u00e8s pas mal de recherches j'ai pu voir que la cl\u00e9 de d\u00e9codage existe bel et bien et qu'il suffit de la d\u00e9coder en utilisant la librairie DPAPI pour la lire. Avec cette cl\u00e9 on peut ensuite d\u00e9coder les cookies et leurs valeurs ce qui veut dire qu'il est th\u00e9oriquement possible d'automatiser le processus sans que l'utilisateur n'aie rien \u00e0 faire. J'ai d\u00e9cid\u00e9 de faire la partie r\u00e9cup\u00e8ration en python pour deux raison : Je n'arrivais pas \u00e0 trouver une bonne impl\u00e9mentation de DPAPI en C# qui me permettait de d\u00e9coder la cl\u00e9. Il existe beaucoup plus de documentation en Python pour ce qui est de la cryptographie et donc si Chrome change de fonctionnement il sera beaucoup plus simple de changer cette partie en particulier sans avoir \u00e0 recompiler le code C#. J'ai donc avec l'aide d'internet et de ChatGPT cr\u00e9\u00e9 ce script : def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key def decrypt_payload ( cipher , payload ): return cipher . decrypt ( payload ) def generate_cipher ( aes_key , iv ): return AES . new ( aes_key , AES . MODE_GCM , iv ) def decrypt_password ( buff , master_key ): try : iv = buff [ 3 : 15 ] payload = buff [ 15 :] cipher = generate_cipher ( master_key , iv ) decrypted_pass = decrypt_payload ( cipher , payload ) decrypted_pass = decrypted_pass [: - 16 ] . decode () # remove suffix bytes return decrypted_pass except Exception : # print(\"Probably saved password from Chrome version older than v80\\n\") # print(str(e)) return \"Chrome < 80\" master_key = get_master_key () cookies_path = Path ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Default \\\\ Network \\\\ Cookies\" ) if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" ) Ce programme va faire tout ce que j'ai expliqu\u00e9 et va ensuite stocker les r\u00e9sultats dans un CSV pour qu'il soit facile d'y acc\u00e8der depuis le C#. Alors oui cela pose certaines questions de s\u00e9curit\u00e9. Car en effet je prend tous les cookies, les d\u00e9code et les stocke. Ce qui veut dire que je pourrais tout \u00e0 fait envoyer ces donn\u00e9es quelque part, par exemple un compte Netflix, et me rincer. Si je devais rendre le projet ouvert au public je pense qu'il faudra que cela soit mentionn\u00e9 clairement et que le projet soit open source pour que les utilisateurs puissent verifier que je ne fais pas ca. Maintenant de l'autre c\u00f4t\u00e9 j'ai juste \u00e0 lire le CSV et le tour est jou\u00e9 ! (Trouver cette solution m'a pris une semaine de vacances \u00e0 l'\u00e9poque) Bon j'ai r\u00e9ussi \u00e0 faire le programme se connecter et naviguer etc.. Par contre quelque chose que j'ai voulu ajouter et qui m'a pris pas mal de temps c'est de faire en sorte de pouvoir selectionner la qualit\u00e9. Pour changer la qualit\u00e9 du feed il faut cliquer sur settings et ensuite prendre le menu deroulant et selectioner 1080p. Le soucis c'est le que la value du select est jamais la m\u00eame. Elle commence toujours pas \"1080_\" mais ensuite ca peut \u00eatre \"1080_45930285\" ou \"1080_56801\" la suite est apparemment random. J'ai donc du utiliser ce code pour le selectioner quand m\u00eame : IWebElement settingsButton = driver . FindElement ( By . ClassName ( \"bmpui-ui-settingstogglebutton\" )); settingsButton . Click (); IWebElement selectElement = driver . FindElement ( By . ClassName ( \"bmpui-ui-videoqualityselectbox\" )); SelectElement select = new SelectElement ( selectElement ); IWebElement selectOption = selectElement . FindElement ( By . CssSelector ( \"option[value^='1080_']\" )); selectOption . Click (); Sauf que pour que cela marche je dois avant cliquer sur le bouton des settings le probl\u00e8me c'est qu'il est invisible alors on doit le faire apparaitre. J'ai tent\u00e9 de le faire aparaitre en bougeant la souris, en cliquant \u00e0 un endroit pr\u00e9cis, impossible de le faire marcher correctement. Puis j'ai eu l'id\u00e9e de mettre pause en envoyant un appui sur la touche Espace et ca a permit de d\u00e9couvrir le bouton et permettre qu'on clique dessus. Ca peut paraitre tout b\u00eate mais rien que ca, ca m'a pris un temps consid\u00e9rable. Bon pour ce qui est du timecode de la vid\u00e9o. Je pense qu'il serait trop complexe de faire en sorte que selenium change le slider de progression de la vid\u00e9o. Alors j'ai fait quelques tests et apparemment, si on quitte la F1TV sur un timecode de la vid\u00e9o que on donne au programme, comme il r\u00e9cup\u00e8re tous les cookies de la F1TV il commencera de la. Donc si on veut utiliser le programme avec des Grand Prix ayant d\u00e9ja eu lieu, on peut le faire, seulement il faudra juste au pr\u00e9alable avoir choisit le bon timecode dans le page de la F1TV avant de le lancer. Ce qui est int\u00e9ressant c'est que la page de la F1TV ressemble \u00e0 ca au d\u00e9part : \"Empty F1TV\" Je pense qu'une bonne id\u00e9e serait de dire au programme que c'est la grille de d\u00e9part et ensuite d\u00e8s qu'il d\u00e9tecte un secteur il sait que la course a commenc\u00e9.","title":"Vacances"},{"location":"jdb.html#lundi-24-avril-2023","text":"Aujourd'hui c'est jour de documentation. J'ai pas mal travaill\u00e9 pendant les vacances mais je n'ai pas encore pu faire de vraie documentation correcte du fonctionnement. Du coup je vais m'en charger aujourd'hui et peut-\u00eatre un peu demain. Ok normalement je ne devrais faire que de la documentation mais je ne peux pas passer \u00e0 cot\u00e9 de ca... Le probl\u00e8me que j'ai avec les pneus ou parfois il d\u00e9tecte un H au lieu d'un '11' et ce genre de choses c'est \u00e0 cause de ma methode \"RemoveBG\" Qui va retirer tous les pixels plus sombres que le background. Sauf que cela va aussi retirer des pixels dans le chiffre lui m\u00eame et qui va donc defigurer les 11 : \"diformed 11\" \"diformed 11\" J'ai r\u00e9ussi \u00e0 les changer en : \"less diformed\" \"less diformed\" Mais au final cela n'a pas augment\u00e9 la pr\u00e9cision de la reconnaissance. Je pense que je vais donc devoir encore changer. Je pense que une bonne facon de trouver serait dabord de trouver la couleur du pneu. Et si il n'y a pas assez de couleur alors c'est que le pneu contient une lettre. Le but est d'arr\u00eater de chercher des lettres ou des chiffres. Comme ca les 11 arr\u00eateront d'\u00eatre pris pour des 'H' En fait on peut faire encore plus simple que ca. On peut simplement regarder la couleur dominante et determiner le pneu. En effet m\u00eame si il y a une lettre sur fond noir pour d\u00e9crire le pneu, mon methode de r\u00e9cup\u00e8ration de la couleur dominante ommet les pixels trop noirs alors il est quand m\u00eame possible de determiner le type de pneus. Et tout simplement si il n'arrive pas \u00e0 lire le chiffre c'est que c'est une lettre et que donc on est \u00e0 0 tours. Cela marche plut\u00f4t bien et cela simplifie pas mal le processing. Voila, la je vais me remettre \u00e0 la documentation sinon je vais encore prendre du retard.","title":"Lundi 24 Avril 2023"},{"location":"jdb.html#mardi-25-avril-2023","text":"Encore une fois j'ai pris du temps de doc pour changer des choses sur la partie OCR. Mais en m\u00eame temps en documentant je vois des choses que j'ai soit mal fait soit que je pourrais faire mieux en changeant tr\u00e8s peu de choses. J'\u00e9sp\u00e8re que les changement que j'ai fait vont aider au moins \u00e0 la coh\u00e9rence du code et un peu pour les performances. Il semble que dans les conditions que j'ai test\u00e9 le nombre de tour soit plut\u00f4t fiable mais je pense que je devrai faire un peu de travail en aval dans la r\u00e9cup\u00e9ration de ces donn\u00e9es car je sens que cela va poser probl\u00e8me quelques fois. Je pense que en utilisant bien l'historique on peut potentiellement se passer de l'utilisation de ce chiffre pas toujours compl\u00eatement fiable. Mais sinon aujourd'hui c'est encore une fois un gros jour de doc. J'essaie d'expliquer les diff\u00e9rents proc\u00e9d\u00e9s avant de les oublier. J'essaie aussi de donner un maximum d'exemples sous formes de photos interm\u00e9diaires mais ca me prend pas mal de temps car il faut que j'ajoute un peu partout dans le code des lignes pour sortir des images interm\u00e9diaires. En plus de la documentation je me suis aussi beaucoup occup\u00e9 de nettoyer mon code et je suis assez content par ce que m\u00eame en ayant du rajouter des couches de complexit\u00e9 pour mieux reconnaitres les temps au tour j'arrive \u00e0 un temps de processing parfois en dessous des 2 secondes ce que je trouve honorable. Quand j'aurai finit de nettoyer tous mes fichiers je ferai une release sur gitea et ce sera la version que j'utiliserai quand je voudrai faire un merge avec les autres parties du projet. J'ai beaucoup beaucoup boss\u00e9 aujourd'hui et je sui bien mort. Faire autant de documentation et de nettoyage de code c'est pas forc\u00e9ment bon pour le cerveau je crois. J'ai besoin d'une sieste. Demain je pense que je vais commencer \u00e0 avancer sur la partie r\u00e9cup\u00e8ration des images. Je sais que la je fais un peu passer les tests \u00e0 la trappe mais d\u00e9ja j'en ai fait tout le long du d\u00e9veloppement de OCR_DECODE et il faut vraiment que j'avance, quitte \u00e0 revenir dessus quand j'aurai merge les deux projets ensemble.","title":"Mardi 25 Avril 2023"},{"location":"jdb.html#26-avril-2023","text":"Aujourd'hui je vais devoir m'occuper de la partie r\u00e9cup\u00e9ration des images. J'ai d\u00e9ja eu l'occasion d'avancer sur ce projet pendant mopn poc et mes vacances. Donc la le but ca va \u00eatre de voir ce qui manque comme v\u00e9ritables features et ensuite je vais pouvoir m'occuper de la vue et de son int\u00e9gration avec le d\u00e9codage. Ok donc maintenant que j'au un programme qui arrive \u00e0 prendre des images depuis la F1TV correctement et en bonne r\u00e9solution. Je pense qu'il est temps de passer \u00e0 l'impl\u00e9mentation de la Forme que ca va prendre. C'est important de se poser au moins cinq minutes la question de comment je pr\u00e9vois de faire car m\u00eame si ca n'est pas la version finale, cette derni\u00e8re prendra tr\u00e8s fort inspiration du desing que je vais faire. Dans cette form j'aurais besoin de : Pouvoir selectionner un Grand Prix en ins\u00e8rant l'URL du feed. Pouvoir lancer la calibration si besoin Indiquer le titre et la date du Grand Prix Indiquer si le Grand Prix vient de commencer ou si il y a d\u00e9ja un certain nombre de tours lanc\u00e9s. Et c'est \u00e0 peu pr\u00e8s tout en fait... J'ai tellement pouss\u00e9 pour avoir un programme qui fait tout tout seul que il ne me faut pas grand chose de plus. Je pense que ce qui serait pas mal ca serait du coup d'utiliser ce temps pour bien impl\u00e9menter la calibration qui elle aura besoin d'une UI un peu plus bal\u00e8ze. On pourrait m\u00eame imaginer que la calibration fasse partie int\u00e9grante des settings... Ca serait peut-\u00eatre bien que quand l'application se lance on se retrouve sur la page principale d'affichage de donn\u00e9es et qu'on puisse simplement cliquer sur la page options qui contient la page calibration et qui permet de rentrer les infos du Grand Prix. Je pense que je vais faire ca. Voici l'interface que j'ai d\u00e9velopp\u00e9e pour regrouper tout ca : \"Screen\" La police le style le placement et les couleurs ne sont pas d\u00e9finitfs, cependant je pense que c'est un bon d\u00e9but. Le but maintenant va \u00eatre de permettre de faire fonctionner la calibration et la r\u00e9cup\u00e8ration d'images. Si j'arrive \u00e0 faire fonctionner ces deux choses sur un m\u00eame projet avant la fin de la semaine cela serait super ! Bon J'ai pu avancer sur l'int\u00e8gration de Selenium mais cela prend un peu de temps car je veux impl\u00e9metner un moyen de pouvoir prendre une Screenshot \u00e0 nimporte quel moment et pas juste en boucle. Demain je finis de faire fonctionner ca et ensuite je commence le cablage du reste.","title":"26 Avril 2023"},{"location":"jdb.html#jeudi-27-avril-2023","text":"C'est assez dur de faire l'importation car il y a des petites diff\u00e9rences qui obligent \u00e0 presque tout r\u00e9\u00e9crire. En fait le programme de calibration avait d\u00e9ja impl\u00e9ment\u00e9 la fonction de Windows et de Zones mais il fonctionnait juste assez diff\u00e9remment pour qu'il faille tout refaire. La je suis en train de perdre \u00e9norm\u00e9ment de temps \u00e0 cause d'un soucis de coordonn\u00e9es. J'ai repris le code de la calibration pour detecter ou l'utilisateur a cliqu\u00e9 pour cr\u00e9er les zones. Cependant, je n'arrive pas \u00e0 le faire fonctionner correctement. La zone est tout le temps d\u00e9cal\u00e9e en haut et en bas mais pas de la m\u00eame facon. En haut, la valeur Y est trop grande alors que en bas la valeur Y est trop petite... Je ne comprends pas bien pourquoi. Si c'\u00e9tait un simple d\u00e9calage cela ne serait pas compliqu\u00e9 \u00e0 g\u00e8rer mais la... J'ai un soucis \u00e9galement avec la r\u00e9solution des screenshots que je r\u00e9cup\u00e8re en full Headless. Voici un exemple de r\u00e9solution que j'arrive \u00e0 r\u00e9cup\u00e8rer sans le headless : \"High Res\" \"Low Res\" Il y a clairement un soucis et le probl\u00e8me c'est que avec une r\u00e9solution pareille, impossible de faire une reconnaissance correcte. BON J?EN PEUX PLUS LA. Ca fait des heures que je bosse sur ce probl\u00e8me d\u00e9bile et impossible de trouver une solution. J'ai essay\u00e9 cinq facons de forcer le browser headless a prendre une plus haute r\u00e9solution aucune ne fonctionne je ne comprends pas. A chaque fois que je me retrouve avec une r\u00e9solution de 1366 x 768 Ou une variante de basse r\u00e9solution du style. J'en peux plus je ne trouve aucune r\u00e9ponse sur internet ni m\u00eame avec chatGPT. Super... La seule chose que j'ai pu faire qui change quelque chose fait que les images font maintenant du 926x517... j'ai un peu envie de commentre un crime de guerre au plus vite.","title":"Jeudi 27 Avril 2023"},{"location":"jdb.html#vendredi-28-avril-2023","text":"Une des solutions que je n'ai pas encore essay\u00e9 est de changer ma version de GeckoDriver. Sauf que ca m'oblige \u00e0 changer les versions de mes libraries ce qui est tr\u00e8s p\u00e9nible, je vais continuer le debugging dans le projet Selenium_clean. Il faut savoir que la librairie de Selenium que j'utilise est bloqu\u00e9e en 0.27 ce qui fait que je ne peux utiliser qu'une version obsol\u00e8te du Gecko Driver. J'ai tent\u00e9 de changer vers une version en 64 bits du GeckoDriver 0.27 mais pareil, je me retrouve toujours avec des images de M. J'essaie toutes les solutions que je trouve sur internet aucune ne convient c'est infernal. J'essaie de changer la r\u00e9solution DPI, j'essaie de changer les param\u00eatres par d\u00e9faut des player de Firefox, j'essaie de changer la r\u00e9solution pendant et au d\u00e9but de l'execution IMPOSSIBLE DE FAIRE MARCHER CETTE MERDE C'EST PAS POSSIBLE !!! J'ai essay\u00e9 avec chrome mais je ne peux pas l'utiliser car les DRM m'emp\u00eacheront de prendre des screenshot du flux vid\u00e9o. J'ai essay\u00e9 de faire tourner avec edge mais edge ne peut pas tourner en headless. JE VAIS DEVENIR FOUF FPWQOVMQEKOVNVIBDBJDAIVOBI. ET MAINTENANT JE N'ARRIVE PLUS A FAIRE DE PROJET AVEC SELENIUM VOIWQNV(UEWQBVU)WEQN=OEJNIVIUWVBWUEV ON CHERCHE A ME FAIRE PETER UN PLOMB C'EST PAS POSSIBLE GIWEGUWEQN VOICI UN EXEMPLE DU CODE QUE JE DEMANDE A UN NOUVEAU PROJET AVEC EXACTEMENT LES MEMES LIBRARIES INSTALLEES : // Create a new FirefoxDriver instance IWebDriver driver = new FirefoxDriver (); // Navigate to the specified URL driver . Navigate (). GoToUrl ( \"https://www.example.com\" ); // Do something with the driver (e.g., find elements or take screenshots) // Quit the driver driver . Quit (); Je ne demande que ca ET MEME CA CA NE VEUT PAS FONCTIONNER VOIWENB)IWUQENV Oui je suis un peu \u00e9nerv\u00e9 ca se voit? A bon? Et maintenant NUGGET ne fonctionne plus... j'en peux plus la. Je ne peux plus t\u00e9l\u00e9charger de librairie sur aucun de mes projets... J'ai tent\u00e9 de supprimer le fichier de config et red\u00e9marrer Visual Studio mais cela ne fait rien. J'ai aussi tent\u00e9 de faire un 'nugget restore' toujours rien. Bon apparemment je ne suis pas le seul qui ne peut pas acc\u00e8der \u00e0 Nuget donc bon c'est pas juste chez moi qu'il y a un soucis. Mais m\u00eame en mettant ma 4G pour me connecter, je n'arrive pas \u00e0 acc\u00e8der \u00e0 certains sites y compris Nuget et je ne peux pas download de librairies... Je ne comprends pas ce qui se passe et du coup je ne peux juste pas bosser... J'ai red\u00e9marr\u00e9 trois fois mon pc et visual studio, j'ai essay\u00e9 de changer mes settings DNS etc... impossible de bosser. Je crois que je n'aurais pas du me reveiller aujourd'hui. Bon je vais tenter d'avancer sur mon poster en attendant que le r\u00e9seau soit en meilleur \u00e9tat.","title":"Vendredi 28 Avril 2023"},{"location":"jdb.html#lundi-1-mai-2023","text":"Bon je bosse depuis chez moi donc j'esp\u00e8re que Nuget va mieux fonctionner. Apr\u00e8s un weekend \u00e0 r\u00e9fl\u00e9chir au sujet de cette resolution je me suis dit deux choses. La seule personne sur internet que j'ai vu avoir le meme soucis avait une r\u00e9solution de 1920x1200 comme moi. Cela veut donc s\u00fbrement dire que le soucis vient de cette r\u00e9solution de laptop comme moi. Si vraiment je n'arrive pas dans un premier temps \u00e0 faire fonctionner le Headless correctement, je peux toujours laisser la page de c\u00f4t\u00e9 et m'occuper du reste du programme. Certes ca serait vraiment infernal d'avoir \u00e0 garder une page chrome ouvert en tous temps et en plus elle doit \u00eatre en plein \u00e9cran mais bon... Si il n'y a vraiment pas d'autres solutions malheureusement je serai bien oblig\u00e9. BON ! JE N'ARRIVE MEME PLUS A FAIRE UN PROJET QUI UTILISE SELENIUM ET QUI MARCHE JE VAIS FAIRE BR\u00dbLER GENEVE. C'est pas possible serieux, je ne comprends pas j'essaie tout ce que je trouve et impossible de juste lancer firefox c'est du grand nimporte quoi. Je prend les m\u00eame putain de librairies que sur les autres projets les m\u00eames versions, je prend le m\u00eame exact code. Sur le nouveau projet impossible de le faire fonctionner. Je commence \u00e0 croire que on essaie de me faire p\u00eater un cable. Du coup dans un \u00e9lan de d\u00e9sespoir je vais tenter de passer sur une autre librairie qui avec un peu de chance marche et en plus me permettrais de prendre des foutues screenshot dans le bon format. Les deux seules librairies qui pourraient potentiellement faire l'affaire sont les librairies : PhantomJS CefSharp Je vais les tester et simplement prier pour qu'elles fonctionnent et que je puisse faire ce que je veux avec. Alors pour le moment avec CEFSharp j'arrive \u00e0 lancer une instance de chrome et prendre une screenshot avec ce code : CefSettings settings = new CefSettings (); settings . CachePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . LocalApplicationData ), \"CefSharp\\\\Cache\" ); // Set cache path settings . LogSeverity = LogSeverity . Disable ; // Disable logging Cef . Initialize ( settings ); // Initialize CEF using ( var browser = new ChromiumWebBrowser ( \"www.google.com\" , new BrowserSettings ())) // Launch Chromium in off-screen mode { browser . Load ( \"https://www.example.com\" ); // Navigate to the test URL browser . Size = new Size ( 1920 , 1080 ); // Set the browser size to 1920x1080 browser . ScreenshotAsync (). ContinueWith ( task => { var bitmap = task . Result ; bitmap . Save ( \"screenshot.png\" , System . Drawing . Imaging . ImageFormat . Png ); // Take a screenshot and save it as a PNG file }). Wait (); } Cef . Shutdown (); // Shutdown CEF Avec ca il faut ces using : using System ; using System.Drawing ; using System.IO ; using CefSharp ; using CefSharp.OffScreen ; C'est assez prometteur m\u00eame si il faut encore beaucoup pour remplacer selenium. Ah bah lol en fait non on peut pas utiliser cette librarie pour faire tourner firefox... J'EN AI MARRE J'AVAIS CHERCHE PRECISEMENT UNE LIB QUI MARCHE AVEC FIREFOX Et phantomJS non plus ne fonctionne pas avec firefox... J'en ai marre. Donc je vais plut\u00f4t partir sur la librairie GeckoFX qui semble pouvoir contr\u00f4ler une instance de firefox. Mais j'avais justement pris un putain de projet C# et pas JS pour ne pas me taper ces probl\u00e8mes de librairies... Et si cette option ne fonctionne pas mon dernier espoir sera de directement int\u00e9ragir avec le geckodriver.exe et la ca risque de pas \u00eatre dr\u00f4le. JE NE COMPRENDS RIEN !!!!! Ca n'a aucun sens la doc est inexistante le seul lien qui pourrait amener sur une doc envoie sur la page principale de bitbucket. Tous les exemples de code que je trouve ne fonctionnent pas. Je n'arrive \u00e0 rien je commence \u00e0 devenir fou. Tout ce travail pour rien c'est pas possible. M\u00eame en essayant directement d'int\u00e9ragir avec le process geckodriver.exe je ne peux pas arriver \u00e0 mes fins. J'arrive \u00e0 lancer le service et tout, mais je n'arrive pas \u00e0 vraiment contr\u00f4ler ce qu'il se passe donc impossible de venir prendre des screenshot. Je ne sais tout simplement pas quoi faire ... Je suis bloqu\u00e9. Je me suis cass\u00e9 la t\u00eate \u00e0 faire un truc qui marchait bien avec selenium et tout. Mais maintenant plus rien ne fonctionne du jour au lendemain et il n'y a simplement aucune alternative. Je vais essayer de changer directement le projet Selenium_Clean mais bon ca va pas \u00eatre dr\u00f4le. Ok alors j'ai tout repris depuis le d\u00e9but et je crois que j'ai enfin une solution. Pour la trouver j'ai re-essay\u00e9 toutes les techniques que j'avais tent\u00e9 avant mais dans l'ordre et en les isolant \u00e0 chaque fois. Cela inclus : Tenter de changer la densit\u00e9 de pixels. En effet je me suis dit que comme la r\u00e9solution \u00e9tait plus basse le soucis \u00e9tait que le virtual screen avait simplement une DPI r\u00e9duite. profile.SetPreference(\"layout.css.devPixelsPerPx\", \"2.0\"); J'ai aussi tent\u00e9 de r\u00e9duire \u00e0 un seule le nombre de process de Firefox. J'ai pu lire sur internet que parfois cela pouvait influer sur les performances du renderer. profile.SetPreference(\"dom.ipc.processCount\", 1); Ensuite j'ai tent\u00e9 tout b\u00eatement de rajouter dans la liste des arguments la taille voulue de l'\u00e9cran. options.AddArgument(\"--window-size=1920,1080\"); Mais comme cela ne foncionnait pas, je me suis rabattu sur un script JS pour tenter de forcer la fen\u00eatre \u00e0 \u00eatre plus grande. js.ExecuteScript(\"window.resizeTo(1920, 1080);\"); Comme cela n'a pas march\u00e9 j'ai pu lire que cela pouvait \u00eatre la taille int\u00e9rieure qui devait \u00eatre chang\u00e9e js.ExecuteScript(\"window.innerWidth = 1920; window.innerHeight = 1080;\"); Encore une fois sans succ\u00e8s. J'ai ensuite tent\u00e9 d'utiliser trois autres versions du GeckoDriver, 0.27,0.26,0.25 et aucune ne m'aidait. Mais en fait la seule chose qui a chang\u00e9 quoi que ce soit \u00e9tait la technique suivante : Changer la window size en utilisant : options . AddArgument ( \"--width=1920\" ); options . AddArgument ( \"--height=1200\" ); Ca ne marchait pas car j'utilisais une autre methode pour resize en m\u00eame temps, qui elle ne marchait pas mais qui emp\u00eachait celle la de marcher. Ensuite le soucis que j'avais c'est que en mettant 1920-1080 je me retrouvais avec 1920-998 ou un truc du genre ce qui n'\u00e9tait pas normal alors je me disais que cette technique ne marchait pas non plus et je l'ai pass\u00e9e. Alors tout n'est pas encore gagn\u00e9, il faut que j'arrive \u00e0 impl\u00e9menter ca dans un plus gros projet et que la vid\u00e9o puisse \u00eatre prise seule. Demain je m'occupe de ca.","title":"Lundi 1 Mai 2023"},{"location":"jdb.html#mardi-2-mai-2023","text":"Bon aujourd'hui je change le programme principal. Le soucis que j'ai c'est que en ajoutant ce syst\u00e8me de resize, maintenant la page fait 100x100 et est grise. Il doit y avoir une technique que j'ai oubli\u00e9 de retirer ou un comportement un peu bizarrre. Bon clairement je ne sais pas QUI DECIDE DE ME POURRIR LA VIE mais il est fort. J'ai t\u00e9l\u00e9charger EXACTEMENT les m\u00eames librairies que sur mon autre projet et j'utilise l'EXACT m\u00eame geckodriver.exe mais dans le projet principal impossible de lui faire chier une image m\u00eame avec l'EXACT m\u00eame code. POURQUOI VOUS ME FAITES CA????= La je ne comprend vraiment pas ce qui peut se passer pour que rien ne fonctionne alors que tout est pareil. JE VIENS DE TOUT VERIFIER TOUT EST PAREIL JE NE COMPRENDS PAS. Bon apr\u00e8s avoir supprim\u00e9 l'int\u00e9gralit\u00e9 de ma classe Emulator cela semble marcher un peu mieux. Je ne vais pas m'\u00e9tendre sur la castrophe niveau temps que cela repr\u00e9sente. Si au moins j'arrive \u00e0 faire fonctionner quelque chose je suis content. Maintenant j'ai un soucis un peu sp\u00e9cial. Depuis que j'ai chang\u00e9 la r\u00e9solution, il semble que le programme aie du mal \u00e0 cliquer sur l'icone de settings. En prenant des screenshots du moment ou l'erreur apparait, j'ai pu me rendre compte que en fait le stream est toujours en train de charger et c'est pour ca que on arrive pas \u00e0 trouver le bouton : \"ERROR 105\" \"ERROR 105\" Je pense que je n'ai le soucis que maintenant car le flux en 1080p se lance moins vite. Je vais essayer de voir si je peux detecter un \u00e9l\u00e9ment d'HTML qui correspond au loading comme ca je peux attendre qu'il disparaisse. Sinon je peux aussi juste essayer de trouver le bouton en boucle pendant une dixaine de secondes. Bon la j'essaie pendant genre plus de 50 secondes et ca ne marche toujours pas. Il semblerait que au final le probl\u00e8me vienne du GP d'azerbidjan. En effet, quand je teste un autre Grand Prix tout va bien. ET MERDE ! J'ai r\u00e9ussi \u00e0 avoir des images en 1080P mais d\u00e9s que je passe l'image en plein \u00e9cran c'est de nouveau du 1366X768 Avant de mettre en plein \u00e9cran: \"Before fullscreen\" Apr\u00e8s: \"After fullscreen\" On peut voir sur l'image que l'option 1080P est effectivement bien selectionn\u00e9e mais il doit y avoir un param\u00e8tre de Firefox qui s'occupe de la r\u00e9solution d'un player vid\u00e9o. Il va juste falloir trouver ce param\u00eatre... J'ai essay\u00e9 d'utiliser : Driver.Manage().Window.Size = new System.Drawing.Size(windowWidth, windowHeight); Sans succ\u00e8s. options.AddArgument(\"--start-maximized\"); Pareil Driver.Manage().Window.Maximize(); Toujours rien profile.SetPreference(\"full-screen-api.ignore-widgets\", true); Nada profile.SetPreference(\"media.hardware-video-decoding.enabled\", true); Toujours pas J'ai vraiment cru que j'avais trouv\u00e9 la solution en trouvant cette commande profile.SetPreference(\"full-screen-api.enabled\", true); Mais non toujours pas... Je commence \u00e0 perdre patience. C'EST BON. Apr\u00e8s litt\u00e9rallement 3h de debugging avec M.Bonvin (Que je remercie IMMENSEMENT) on a r\u00e9ussi \u00e0 trouver au fin fond d'un thread github que la valeur \u00e9tait hard cod\u00e9e dans les variables d'environnement et que donc quoi que je fasse je n'aurais pas pu le changer. En fait la seul moyen de tout r\u00e8gler a \u00e9t\u00e9 de changer les variables d'environnement de ma machine: MOZ_HEADLESS_WIDTH et MOZ_HEADLESS_HEIGHT . Et ce qu'il y a de bien c'est que maintenant je peux mettre de la 4K et cela permet de faire un meilleur upscaling.","title":"Mardi 2 Mai 2023"},{"location":"jdb.html#recrutement-payerne-mai-2023","text":"J'ai du faire mon recrutement \u00e0 Payerne Mercredi et Jeudi. Si vous \u00eates curieux je peux vous dire que comme il n'y avait presque plus de places cet \u00e9t\u00e9 je ferai Canonnier Lance mines. C'\u00e9tait assez frustrant d'avoir perdu deux jours de travail mais on va faire avec.","title":"Recrutement Payerne Mai 2023"},{"location":"jdb.html#vendredi-5-mai-2023","text":"Bon malgr\u00e9s les courbatures il faut que je me mette au boulot un peu serieusement par ce que sinon ca va \u00eatre compliqu\u00e9 de rattraper mon retard. La derni\u00e8re fois si je me souviens bien j'avais r\u00e9ussi \u00e0 trouver un moyen de prendres des images en bonne r\u00e9solution. Il faut maintenant que je commence \u00e0 faire fonctionner la calibration et ce qui serait bien ca serait que je commence \u00e0 ajouter la partie OCR au projet. Il faut que je me d\u00e9p\u00eache car Lundi je dois m'occuper du Poster. OK j'ai compris le soucis que j'avais quand j'essayais de faire la calibration. J'avais mis l'image en ZOOM ce qui fait que si la hauteur n'\u00e9tait pas la bonne, l'image \u00e9tait recentr\u00e9e ce qui fait que cela faussait totalement les r\u00e9sultats. Quand on fait en sorte que l'image prenne toute la place, les coordonn\u00e9es sont prises correctement. Voici un exemple d'ou en est la partie calibration. \"Exemple settings UI\" Normalement il me suffit d'impl\u00e9menter les windows, et on devrait relativement facilement ajouter les pilotes. Et voila. J'ai pu impl\u00e9menter les windows et les pilotes. Et je peux aussi exporter des presets et les loader. Bon le loading est un peu beugg\u00e9 au niveau de l'affichage mais il semble qu'il fonctionne bien quand je save les images. Lundi je m'occupe du poster etc.. mais je pense que la suite va \u00eatre l'impl\u00e9mentation de l'OCR.","title":"Vendredi 5 Mai 2023"},{"location":"jdb.html#lundi-8-mai-2023","text":"Aujourd'hui c'est journ\u00e9e Poster. Je pense que je ne vais pas finir la journ\u00e9e content car les limitations sont un peu trop pr\u00e9sentes. J'ai fait une version que Garcia pourrait accepter, c'est \u00e0 dire en noir et blanc et avec un tout petit peu plus de d\u00e9tail. \"Poster V3\" Le truc c'est que en blanc je trouve que ca ne marche pas super. Et le concept d'avoir trois parties au projet qui se posent autour d'un circuit c'est peut-\u00eatre pas la meilleure id\u00e9e. Je me suis dit que la bonne id\u00e9e serait peut-\u00eatre de prendre un autre circuit pour qu'il y aie bien trois parties : \"Poster V4\" Clairement ce poster doit faire partie des pires. C'est pas clair et ca part dans tous les sens. Je vais essayer avec un autre layout de circuit. \"Poster V5\" Je me suis ensuite dit que le circuit n'\u00e9tait peut \u00eatre tout simplement pas une bonne id\u00e9e. J'ai donc essay\u00e9 de faire quelque chose de plus classique avec juste un peu de background pour qu'on puisse \u00e9viter le soucis de la page blanche derri\u00e8re : \"Poster V6\" Puis je me suis dit que finalement le circuit me manquait. Alors j'ai d\u00e9cid\u00e9 de combiner le background et le circuit ainsi que simplifier l\u00e9g\u00e8rement les diagrammes en retouchant un peu tout le reste on pouvait arriver \u00e0 quelque chose de sympatique : \"Poster V7\" Je ne suis pas content \u00e0 100% mais bon je pense que je vais m'en satisfaire. Pour donner une id\u00e9e de la gal\u00e8re que c'est de cr\u00e9er un poster, voici ce \u00e0 quoi ressemble mon espace de travail Figma : \"Bordel Figma\" Je ne suis pas un graphiste et ca se voit '^^. Je pense que comme il me reste un peu de temps aujourd'hui, je vais faire un peu de documentation de la partie r\u00e9cup\u00e8ration d'images. En effet, je pense que je n'aurai plus besoin de changer grand chose \u00e0 ce niveau. Mais je ne ferai pas la partie analyse fonctionnelle car l'interface n'est clairement pas termin\u00e9e. En fait j'avais oubli\u00e9 mais j'ai eu un rendez vous m\u00e9dical du coup je n'ai pas eu trop le temps de faire la doc que je voulais. Mais au moins je pense avoir finit mon travail sur le poster et le abstract en Anglais qui sont les deux gros livrables \u00e0 venir.","title":"Lundi 8 Mai 2023"},{"location":"jdb.html#mardi-9-mai-2023","text":"Bon je viens de me rendre compte que apparemment on doit rendre l'abstract anglais, le Poster, ET LE PROJET. Je pense que mes deux jours \u00e0 l'arm\u00e9e m'ont fait perdre un peu la notion du temps car j'avais l'impression que l'evaluation interm\u00e9diaire 1 \u00e9tait il y a genre moins d'une semaine. Donc aujourd'hui je ne vais pas trop avancer sur le code et vraiment me focus sur la documentation de la r\u00e9cup\u00e8ration d'images. Je pense que je vais aussi ajouter la partie calibration \u00e0 la documentation. Je pense que c'est important que je prenne le temps maintenant car sinon le prof aura l'impression que ca n'a pas trop avanc\u00e9 depuis la derni\u00e8re fois. Et puis je pense que la partie calibration et r\u00e9cup\u00e8ration d'images ne va pas trop changer et la partie calibration encore moins. La partie anglaise je fais la revoir un peu mais je l'avais d\u00e9ja faite pendant les premiers jours alors ca devrait aller. Pour le rendu il nous \u00e9tait demand\u00e9 de fournir un fichier PDF avec tout dedans avec une table des mati\u00e8res notre code source etc... Pour ce faire j'ai du changer le mkdocs.yml et installer des packages. Voici les changements :: site_name: Documentation Track Trends site_author: Rohmer Maxime copyright: \u00a9CFPTI Tech2 theme: name: material palette: # Palette toggle for light mode - media: \"(prefers-color-scheme: light)\" scheme: default toggle: icon: material/brightness-7 name: Switch to dark mode # Palette toggle for dark mode - media: \"(prefers-color-scheme: dark)\" scheme: slate toggle: icon: material/brightness-4 name: Switch to light mode markdown_extensions: - attr_list - md_in_html - pymdownx.highlight plugins: - glightbox - search - img2fig - with-pdf: cover_subtitle: Vroum Vroum enabled_if_env: ENABLE_PDF_EXPORT - annexes-integration: annexes: # Required (at least 1) - ConfigurationTool.cs: Code/ConfigurationTool.cs # An path to an annex with its title - DriverGapToLeaderWindow.cs: Code/DriverGapToLeaderWindow.cs # An path to an annex with its title - DriverPositionWindow.cs: Code/DriverPositionWindow.cs # An path to an annex with its title - F1TVEmulator.cs: Code/F1TVEmulator.cs # An path to an annex with its title - Program.cs: Code/Program.cs # An path to an annex with its title - Window.cs: Code/Window.cs # An path to an annex with its title - DriverData.cs: Code/DriverData.cs # An path to an annex with its title - DriverLapTimeWindow.cs: Code/DriverLapTimeWindow.cs # An path to an annex with its title - DriverSectorWindow.cs: Code/DriverSectorWindow.cs # An path to an annex with its title - Form1.cs: Code/Form1.cs # An path to an annex with its title - Reader.cs: Code/Reader.cs # An path to an annex with its title - Zone.cs: Code/Zone.cs # An path to an annex with its title - DriverDrsWindow.cs: Code/DriverDrsWindow.cs # An path to an annex with its title - DriverNameWindow.cs: Code/DriverNameWindow.cs # An path to an annex with its title - DriverTyresWindow.cs: Code/DriverTyresWindow.cs # An path to an annex with its title - OcrImage.cs: Code/OcrImage.cs # An path to an annex with its title - Settings.cs: Code/Settings.cs # An path to an annex with its title - recoverCookiesCSV.py: Code/recoverCookiesCSV.py # An path to an annex with its title Je remercie Monsieur Briard le sultan officiel de Mkdocs de la classe de m'avoir aid\u00e9 pour cette partie et avoir cr\u00e9\u00e9 un plugin qui me permet de mettre mon code source directement dans le pdf. Bon au final j'ai quand m\u00eame chang\u00e9 mon poster \"Poster V8\" Mais je suis trop attach\u00e9 \u00e0 l'ancien concept alors je vais plut\u00f4t utiliser ca : \"Poster V9\" Je pense que cette version est meilleure m\u00eame si elle est encore plus en bordel par ce que le texte permet de se faire une meilleure id\u00e9e de l'utilis\u00e9 de chaque partie.","title":"Mardi 9 Mai 2023"},{"location":"jdb.html#mercredi-10-mai-2023","text":"Bon hier je n'ai pas eu le temps de finir la documentation de la recup\u00e8ration d'images et de la calibration. Il faudra donc que je repasse un coup dessus en fin de semaine je pense. Mais la j'aimerais avancer sur la mise en commun du projet, comme la configuration fonctionne plut\u00f4t pas mal je pense que je vais juste vite fait aller commenter les methodes qui ne le sont pas encore et ensuite je vais passer \u00e0 l'impl\u00e9mentation de l'OCR. Je suis presque certain que l'OCR va avoir besoin de plus de r\u00e8glages mais bon on verra bien. Je me rend compte en commentant que la methode de load serait plus efficace avec un tout petit peu plus d'infos de la part du JSON. J'aurais pu ajouter l'offset entre chaque Driver Zone pour eviter un l\u00e8ger drift lors de la reconstruction. Mais bon rien de grave donc je pense que je vais le laisser comme ca pour le moment \u00e0 moins que ca me pose soucis plus tard. J'ai eu quelques soucis avec les images en 4K. Du coup j'ai descendu les variables d'environnement \u00e0 1920x1080 En fait il y a parfois un soucis un peu p\u00e9nible avec l'OCR. Parfois pour un temps comme ci dessous: \"1:45.140\" Le programme ne va pas bien comprendre les ponctuations et il va donner : 1115140 La il y a deux probl\u00e8mes... Le 1:xx.xxx est compris comme 11xxxxx et le 4 s'est transform\u00e9 en 1... J'ai cr\u00e9\u00e9 ce \"petit\" bout de code pour g\u00e8rer les fois ou les '.' et les ':' ont mal \u00e9t\u00e9 interpr\u00eat\u00e9s if ( rawNumbers . Count == 1 ) { //If this code is used it means that its bad ... //The methods that comes are really not that great and are juste quick fixes try { result = Convert . ToInt32 ( rawNumbers [ 0 ]); switch ( windowType ) { case OcrImage . WindowType . Sector : //The usual sector is in this form : 33.456 if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' has been understood like a number result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ]); } if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ]); } break ; case OcrImage . WindowType . LapTime : //The usual Lap time is in this form : 1:45:345 if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' and ':' have been overlooked //I Know Im skipping the cases where there are more than 9 minuts but it happens so rarely that... we dont care result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ] + rawNumbers [ 0 ][ 2 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ]); } if ( rawNumbers [ 0 ]. Length == 7 ) { //There is two possibilities //Either 1:45.140 has been interpreted as 1145.10 or 1:451140. We will assume its the first one result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 4 ] + rawNumbers [ 0 ][ 5 ] + rawNumbers [ 0 ][ 6 ]); } break ; case OcrImage . WindowType . Gap : //The usual Gap is in this form : + 34.567 if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ] + rawNumbers [ 0 ][ 1 ]) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ] + rawNumbers [ 0 ][ 3 ] + rawNumbers [ 0 ][ 4 ]); } break ; } if ( rawNumbers [ 0 ]. Length > 6 ) { //The number definitely has been interpreted wrong } } catch { //It can be because the input is empty or because its the LEADER bracket result = 0 ; } } else { //Auuuugh result = 0 ; } ConfigFile = \"./Presets/Clean_2023.json\" ; string gpUrl = \"https://f1tv.formula1.com/detail/1000006688/2023-azerbaijan-grand-prix?action=play\" ; Bon je n'arrive pas \u00e0 faire fonctionner l'OCR sans tout faire crash \u00e0 chaque fois. Je vais abandonner le travail de la journ\u00e9e pour revenir au point initial... C'est tr\u00e8s frustrant mais bon je ne vois pas comment faire mieux. Rien ne marche alors qu'avant ca marchant super sur le projet OCR normal. Va savoir pourquoi m\u00eame comme ca, impossible de faire marcher l'OCR. Il y a un soucis au niveau de l'ASYNC qui me fait crash tout le temps en me disant qu'un objet est deja en train d'\u00eatre utilis\u00e9. Ca marchait nikel dans mes premi\u00e8res version je ne vois pas pourquoi ca p\u00eate maintenant. Je pense que je vois \u00e0 peu pr\u00e8s le soucis. public virtual async Task < DriverData > Decode ( List < string > driverList ) { int sectorCount = 0 ; DriverData result = new DriverData (); Parallel . ForEach ( Windows , async w => { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) result . Name = ( string ) await ( w as DriverNameWindow ). DecodePng ( driverList ); if ( w is DriverDrsWindow ) result . DRS = ( bool ) await ( w as DriverDrsWindow ). DecodePng (); if ( w is DriverGapToLeaderWindow ) result . GapToLeader = ( int ) await ( w as DriverGapToLeaderWindow ). DecodePng (); if ( w is DriverLapTimeWindow ) result . LapTime = ( int ) await ( w as DriverLapTimeWindow ). DecodePng (); if ( w is DriverPositionWindow ) result . Position = ( int ) await ( w as DriverPositionWindow ). DecodePng (); if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) result . Sector1 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 2 ) result . Sector2 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 3 ) result . Sector3 = ( int ) await ( w as DriverSectorWindow ). DecodePng (); } if ( w is DriverTyresWindow ) result . CurrentTyre = ( Tyre ) await ( w as DriverTyresWindow ). DecodePng (); }); return result ; } Ca c'est ma methode de decoding de chaque Driver Zone. Le message d'erreur me parle d'une windowImage quand il dit qu'un objet est d\u00e9ja utilis\u00e9. Ma conjecture c'est que en essayant de faire toutes les windows en m\u00eame temps. Elles veulent parfois acc\u00e8der \u00e0 l'image principale en m\u00eame temps. Ce qui evidemment pose probl\u00e8me. Je pense que le fix le plus simple serait de faire le traitement sans le parallele quitte \u00e0 exporter ce fonctionnement sur chaque zone en elle m\u00eame pour ne pas perdre trop de performances. Ok je crois que je vois ou est le soucis. En fait dans cette version du programme c'est toujours la premi\u00e8re image qui \u00e9tait juste tout le temps prise et dans la premi\u00e8re image on a une partie des chiffres qui est bloqu\u00e9e par l'UI de la fen\u00eatre... lol... EN FAIT J'avais un soucis dans ma gestion des chiffres mal faits. Visiblement parfois quand je ne prenais pas en compte un :, un LapTime etait compris comme un Gap to leader ou un Secteur Bon j'en ai tellement marre... Je n'arrive tout simplement PAS \u00e0 faire fonctionner l'OCR ca crash tout le temps j'en peux plus. J'ai tent\u00e9 de r\u00e8gler les probl\u00e8mes de mauvaises detections de secteurs et temps au tour qui font crasher l'app : if ( rawNumbers . Count == 2 ) { //ss:ms result = ( Convert . ToInt32 ( rawNumbers [ 0 ]) * 1000 ) + Convert . ToInt32 ( rawNumbers [ 1 ]); if ( result > ( 60000 + 999 )) { if ( windowType == OcrImage . WindowType . LapTime ) { result = 0 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]) * 60000 ; result += Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()) * 1000 ; result += Convert . ToInt32 ( rawNumbers [ 1 ]); } if ( windowType == OcrImage . WindowType . Sector ) { int seconds = 0 ; if ( rawNumbers [ 0 ]. Length == 3 ) { //We have one char that we need to delete //For no apparent reason im going to delete the first seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); } else { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); } int ms = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); result = seconds * 1000 + ms ; } } } Mais toujours impossible de faire fonctionner cette M**** C'est juste infernal. Je pense que je vais encore tout retirer et remplacer par ce que j'ai dans mon projet OCR original. Donc c'est une journ\u00e9e de perdue compl\u00eatement... C'est extr\u00eamement frustrant. Apr\u00e8s des heures de debug j'ai enfin r\u00e9ussi \u00e0 faire fonctionner le programme de temps en temps. Mais j'ai toujours le soucis que l'image ne veut pas changer alors que je fais tout pour et que l'OCR est nulle \u00e0 chier du coup...","title":"Mercredi 10 Mai 2023"},{"location":"jdb.html#jeudi-11-mai-2023","text":"Bon apr\u00e8s une bonne nuit de sommeil je vais reprendre les choses depuis le d\u00e9but. J'ai deux soucis : L'OCR pue du derche L'Image que l'on d\u00e9code ne change pas Pour la premi\u00e8re partie j'ai ma petite th\u00e9orie. Je pense que comme je donne des images 4K alors que le feed est en 1080P, il y a d\u00e9ja un genre d'interpolation qui est faite. Je pense donc qu'il faut que j'adapte mon engine pour qu'il fonctionne avec cette r\u00e9solution. Je me suis demand\u00e9 si ca n'\u00e9tait pas mieux de prendre en compte les deux r\u00e9solutions pour les pc un peu moins bal\u00e8zes et j'ai d\u00e9cid\u00e9 de n'en avoir rien a faire. On verra dans le futur si c'est une feature que je voudrais ajouter mais c'est en dehors du scope du dipl\u00f4me je pense. Pour la seconde partie, je pense qu'il faut que j'aille voir du c\u00f4te de OCR_Decode et de OCR Tester pour voir comment je faisais. Je dois forc\u00e9ment oublier un truc. Bon ca commence mal, quand je vais voir dans le projet OCR_Decode, le changement d'image est exactement le m\u00eame et il fonctionne alors que de mon c\u00f4t\u00e9 ca n'est pas le cas. Alors deux choses. Je me rend compte que le changement d'images n'a AUCUN effet sur la detection de texte, et seconde chose, le d\u00e9calage est trop grand entre les windows. Des que le soucis d'image est r\u00e8gl\u00e9 il va falloir que je change drastiquement ma facon de stocker la config en JSON. Il faut que je conserve les \u00e9carts. Sinon regardez ce que ca donne quand on arrive au dernier pilote : \"Zone de pilote d\u00e9cal\u00e9e\" Je commence \u00e0 devenir FOU. Je n'arrive pas \u00e0 changer cette foutue image wtf... J'ai beau tenter par tous les moyens de la changer par une image noire, l'image semble toujours rester celle du d\u00e9part. Bon j'ai enfin trouv\u00e9 pourquoi et je n'ai pas envie de dire comment j'ai trouv\u00e9... Je pense que l'on a tous droit \u00e0 son petit jardin secret. Maintenant ca veut dire que je peux me focus sur le concept important qui est le changement de la cr\u00e9ation et de la lecture des JSON. Voici un exemple de preset JSON : { \"Main\" : { \"x\" : 40 , \"y\" : 355 , \"width\" : 3784 , \"height\" : 1438 , \"Zones\" : [ { \"DriverZone\" : { \"x\" : 0 , \"y\" : -10 , \"width\" : 3784 , \"height\" : 71 , \"Windows\" : [ { \"Position\" : { \"x\" : 47 , \"y\" : 11 , \"width\" : 72 }, \"GapToLeader\" : { \"x\" : 445 , \"y\" : 13 , \"width\" : 201 }, \"LapTime\" : { \"x\" : 859 , \"y\" : 14 , \"width\" : 221 }, \"DRS\" : { \"x\" : 1094 , \"y\" : 13 , \"width\" : 173 }, \"Tyres\" : { \"x\" : 1270 , \"y\" : 11 , \"width\" : 1452 }, \"Name\" : { \"x\" : 2727 , \"y\" : 11 , \"width\" : 351 }, \"Sector1\" : { \"x\" : 3083 , \"y\" : 10 , \"width\" : 253 }, \"Sector2\" : { \"x\" : 3339 , \"y\" : 14 , \"width\" : 195 }, \"Sector3\" : { \"x\" : 3518 , \"y\" : 14 , \"width\" : 250 } } ] } } ] }, \"Drivers\" : [ \"Perez\" , \"Leclerc\" , \"Sainz\" , \"Alonso\" , \"Stroll\" , \"Russel\" , \"Verstappen\" , \"Zhou\" , \"Ocon\" , \"Hulkenberg\" , \"Hamilton\" , \"Norris\" , \"Tsunoda\" , \"Magnussen\" , \"Piastri\" , \"Albon\" , \"Gasly\" , \"Sargeant\" , \"Bottas\" , \"De Vries\" ] } Je pense que ce qui serait bien ce serait de rajouter un \"offsets\" qui contienne les 19 \u00e9carts restants. Bon... la structure de ma fabrication de JSON etait trop confuse je trouve alors je l'ai compl\u00eatement refaite. J'ai aussi abandonn\u00e9 l'id\u00e9e de faire un fichier le plus petit possible car au final on s'en fiche et le plus important c'est que toutes les windows et les zones soient aux bons endroits. Ca nous fait un fichier d'environs 1300 lignes mais au moins le code pour la serialisation est plut\u00f4t clean : public void SaveToJson ( List < string > drivers , string configName ) { string JSON = \"\" ; JsonObject jsonFileObject = new JsonObject (); //Creating the mainZone object JsonObject mainZoneObject = new JsonObject (); mainZoneObject . Add ( \"x\" , MainZone . Bounds . X ); mainZoneObject . Add ( \"y\" , MainZone . Bounds . Y ); mainZoneObject . Add ( \"width\" , MainZone . Bounds . Width ); mainZoneObject . Add ( \"height\" , MainZone . Bounds . Height ); JsonArray driverZonesArray = new JsonArray (); int DriverID = 0 ; foreach ( Zone driverZone in MainZone . Zones ) { DriverID ++; JsonObject driverZoneObject = new JsonObject (); driverZoneObject . Add ( \"name\" , \"Driver\" + DriverID ); driverZoneObject . Add ( \"x\" , driverZone . Bounds . X ); driverZoneObject . Add ( \"y\" , driverZone . Bounds . Y ); driverZoneObject . Add ( \"width\" , driverZone . Bounds . Width ); driverZoneObject . Add ( \"height\" , driverZone . Bounds . Height ); JsonArray windowsArray = new JsonArray (); JsonObject windowObject = new JsonObject (); foreach ( Window window in driverZone . Windows ) { windowObject . Add ( window . Name , new JsonObject { { \"x\" , window . Bounds . X }, { \"y\" , window . Bounds . Y }, { \"width\" , window . Bounds . Width }, { \"height\" , window . Bounds . Height } }); } windowsArray . Add ( windowObject ); driverZoneObject . Add ( \"Windows\" , windowsArray ); driverZonesArray . Add ( driverZoneObject ); } mainZoneObject . Add ( \"DriverZones\" , driverZonesArray ); JsonArray driversArray = new JsonArray (); foreach ( string driver in drivers ) { driversArray . Add ( driver ); } mainZoneObject . Add ( \"Drivers\" , driversArray ); jsonFileObject . Add ( \"Main\" , mainZoneObject ); JSON = jsonFileObject . ToString (); //Saving the file string path = CONFIGS_FOLDER_NAME + configName ; if ( File . Exists ( path + \".json\" )) { //We need to create a new name int count = 2 ; while ( File . Exists ( path + \"_\" + count + \".json\" )) { count ++; } path += \"_\" + count + \".json\" ; } else { path += \".json\" ; } File . WriteAllText ( path , JSON ); } Et normalement la lecture devrait \u00eatre encore plus simple. En fait c'\u00e9tait pas beaucoup plus simple mais au moins maintenant ca marche. Je vais pas mettre le code de lecture ici car c'est un peu trop long donc il va falloir me croire sur parole. (Ou aller sur Git) Bon bah on est au m\u00eame endroit qu'hier... Bon pour demain le plan de bataille ca va \u00eatre : Changer compl\u00eatement la methode \"GetTimeFromPng\" pour qu'elle prenne en compte toutes les possibilit\u00e9s de bugs et d'oubli de '.' ou de ':' mais pas selon le nombre de blocs mais selon le type de temps que l'on cherche Pour le moment je regarde le nombre de blocs et si il y en a deux alors c'est que c'est un temps de secteur. En fait non cela peut aussi \u00eatre un temps au tour qui a rat\u00e9 un point. Il faut que je bosse juste un peu vite fait la dessus et que j'arr\u00eate de putain de crasher d\u00e8s que un truc est pas au bon format. Ensuite quand ca aura arr\u00eat\u00e9 de crasher je vais reprendre l'OCR et voir pourquoi les resultats sont nuls a chier comme ca. Et le but c'est que demain soir j'ai une reconnaissance de caract\u00e8res plus proche de ce que j'avais dans d'autres projets... J'y croit 0 mais bon l'espoir fait vivre comme on dit.","title":"Jeudi 11 Mai 2023"},{"location":"jdb.html#vendredi-12-mai-2023","text":"Bon aujourd'hui il faut que ca marche. On va y aller par \u00e9tape. Je vais revoir toutes les methodes d'OCR et essayer de r\u00e9apliquer les filtres differemment et revenir au point de d\u00e9part. Avant de commencer je note plusieurs soucis avec les premiers tests : Les positions des pilotes ont l'air pas mal (Pas besoin de tout changer mais peut-\u00eatre simplement checker que les filtres sont bons) L'\u00e9cart avec le leader est \u00e9tonnamment pas mal aussi Le temps au tour est tout simplement horrible. Aucun n'est juste et de tr\u00e8s loin m\u00eame si les d\u00e9cimales ne sont pas forc\u00e9ment loin Le DRS je n'ai pas eu l'occasion de bien le tester mais je dirais que ca devrait \u00eatre bon (\u00e0 verifier quand le reste sera bon) Les pneus ne sont \u00e9tonnamment pas SI horribles, m\u00eame si parfois les lettres sont prises comme des chiffres Les noms de pilotes sont tr\u00e8s bon (pas \u00e9tonnant vu le syst\u00e8me de distance de Levenstein donc ca m\u00e9rite quand m\u00eame un petit check) Les secteurs sont en g\u00e9n\u00e9ral horribles mais pas toujours. C'est peut-\u00eatre un soucis de d\u00e9cimale ou des 4 qui se transforment en 1 J'ai remarqu\u00e9 que les 4 sont souvent pris comme des 1. Peut-\u00eatre que en ayant des images 4K l'interpolation est un peu diff\u00e9rente de ce que j'ai l'habitude de voir. Mais donc le plan aujourd'hui c'est de checker tous ces points et les faire fonctionner (youpi...) J'ai d\u00e9sactiv\u00e9 toutes les methodes de cette facon : int sectorCount = 0 ; DriverData result = new DriverData (); foreach ( Window w in Windows ) { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) //result.Name = (string)await (w as DriverNameWindow).DecodePng(driverList); result . Name = \"Unknown\" ; if ( w is DriverDrsWindow ) //result.DRS = (bool)await (w as DriverDrsWindow).DecodePng(); result . DRS = false ; if ( w is DriverGapToLeaderWindow ) //result.GapToLeader = (int)await (w as DriverGapToLeaderWindow).DecodePng(); result . GapToLeader = 0 ; if ( w is DriverLapTimeWindow ) //result.LapTime = (int)await (w as DriverLapTimeWindow).DecodePng(); result . LapTime = 0 ; if ( w is DriverPositionWindow ) //result.Position = (int)await (w as DriverPositionWindow).DecodePng(); result . Position = 0 ; if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) //result.Sector1 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector1 = 0 ; if ( sectorCount == 2 ) //result.Sector2 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector2 = 0 ; if ( sectorCount == 3 ) //result.Sector3 = (int)await (w as DriverSectorWindow).DecodePng(); result . Sector3 = 0 ; } if ( w is DriverTyresWindow ) //result.CurrentTyre = (Tyre)await (w as DriverTyresWindow).DecodePng(); result . CurrentTyre = new Tyre ( Tyre . Type . Undefined , 0 ); } return result ; Le but c'est que ensuite je puisse y aller \u00e9tape par \u00e9tape. Position : Alors pour cette reconnaissance je dirais que la 4K fait des merveilles qui permettent de retirer du processing. La position apr\u00e8s un simple Treshold est assez bien reconnue et la dilataion et/ou Erosion ne sont pas nescessaires finalement. On va donc pouvoir gagner un certain temps et c'est un bon signe pour la suite. On peut aussi noter que quand un pilote est hors course toutes ses valeurs sont gris\u00e9es et sa position est prise comme un -1 Sectors, alors j'ai refait toute la partie qui concerne les secteurs et qui les nettoie. Et je me suis rendu compte qu'ils \u00e9taient bien souvent juste, le seul truc c'est que ils s'affichent de mani\u00e8re un peu sp\u00e9ciale. En fait dans la page de la F1TV les secteurs peuvent faire plus de 60 secondes sans passer sur un affichage de minutes. Ce qui fait que c'est un peu bizarre \u00e0 regarder mais c'est parfaitement juste. J'ai aussi pu simplifier la reconnaissance gr\u00e2ce \u00e0 l'image de meilleure qualit\u00e9 et maintenant les temps de secteur sont plut\u00f4t corrects. En fait le plus long et complexe c'est de pr\u00e9voir les cas particuliers ou un '.' a \u00e9t\u00e9 mal interpr\u00eat\u00e9... Et en parlant de ca, je vais aller m'occuper des temps au tour qui ajoutent une couche de complexit\u00e9 avec un '.' ET un ':' qui peuvent \u00eatre oubli\u00e9s... Oh et j'y pense, un truc malin pourrait \u00eatre de comparer les temps au tour et les temps de secteur. Ils devraient concorder normalement je pense. Ok je viens de finir la gestion des temps au tour... J'ai un code de genre 170 lignes pour juste nettoyer le resultat dans le cas ou des '.' n'ont pas \u00e9t\u00e9 trouv\u00e9s ou des ':' ont \u00e9t\u00e9 n'ont pas \u00e9t\u00e9 trouv\u00e9 ou si l'un des deux s'est transform\u00e9 en chiffre etc.. etc.. etc.. Le soucis c'est que la maintenant je me rend compte que les \u00e9carts entre les pilotes vont juste \u00eatre un enfer \u00e0 nettoyer... Ils peuvent aussi bien \u00eatre \"0.760\" comme \"1:34.456\" du coup... je sais pas vraiment comment faire pour tout nettoyer. Je pense que je vais juste en avoir rien \u00e0 faire et tant pis si de temps en temps c'est pas g\u00e9nial. Bon du coup j'ai pas pris en compte TOUS les cas possibles mais d\u00e9ja un certain nombre et c'est d\u00e9ja pas mal. Sur les diff\u00e9rents Grand Prix d'exemples ca a l'air de plut\u00f4t bien tourner ! Mais ca demande tellement de tests et de code que c'est un peu ridicule... La methode \"GetTimeFromPng\" fait d\u00e9ja presque 430 lignes \u00e0 cause de tous les cas possibles et tous les try catch. Ca peut para\u00eetre peu \u00e9l\u00e9gant mais j'ai essay\u00e9 de mettre des commentaires un peu partout pour permettre \u00e0 nimporte qui de comprendre ce qui se passe. J'ai aussi pu faire les pneus et maintenant (roulement de tambour) Ca marche (presque) En fait j'ai des soucis parfois quand les pneus sont un peu cach\u00e9s dans les permiers tours : Pneus cach\u00e9s Le soucis c'est que du coup le chiffre est un peu illisible... mais je pense que avec l'historique il devrait y avoir moyen de ne pas prendre en compte les chiffres de pneus pendant cinq tours apr\u00e8s le changement de pneu ou de simplement tenter de faire les calculs de pneus. Pour conclure la journ\u00e9e je pense que je devrais avoir le temps de faire un syst\u00e8me qui permet de refresh \u00e0 volont\u00e9. Par contre je viens de d\u00e9couvrir que quand un temps de secteur est en couleur on arrive pas \u00e0 le lire. Ah et la detection prend un peu moins de trois secondes sur mon pc je crois. Mais c'est seulement si les driver zones sont faites en m\u00eame temps mais en faisant ca de temps en temps ca crash et \u00e0 chaques fois c'est d'un endroit diff\u00e9rent du coup je comprend pas vraiment. Sinon ca prend dix secondes.","title":"vendredi 12 Mai 2023"},{"location":"jdb.html#lundi-15-mai-2023","text":"Aujourd'hui c'est journ\u00e9e poster et visites. Comme on va avoir des visites de premi\u00e8res ann\u00e9es voire de terminales et que le soir c'est visite des parents. Je pense que j'ai finit de tout regrouper (\u00e0 part \u00e9videmment le traitement et le stockage des donn\u00e9es) ce qui veut dire que je suis pas dans une superbe posture. Il va falloir que je sois tr\u00e8s efficace dans la partie stockage de donn\u00e9es et mise en place du mod\u00e8le si je veux avoir une chance de rendre un joli travail de dipl\u00f4me. (et m\u00eame comme ca je peux voir que le temps commence \u00e0 manquer) Dans l'id\u00e9al je devrais avoir termin\u00e9 la partie stockage jeudi... Ce qui veut dire que je n'ai que trois jours pour le faire et que en plus jeudi je dois travailler depuis la maison. Ca va pas \u00eatre simple. Mais aujourd'hui je vais m'occuper d'adapter la documentation de l'OCR et faire la documentation de toute la partie r\u00e9cup\u00e8ration d'images et de la calibration. Bon au final la journ\u00e9e a \u00e9t\u00e9 un peu difficile. On a pas vraiment pu travailler l'apr\u00e8s midi car il a fallu pr\u00e9senter le projet environs 10 fois \u00e0 toutes les classes et \u00e0 des parents voire futurs experts. Les d\u00e9mos ont plut\u00f4t bien fonctionn\u00e9es j'en suis assez content. Mais ca veut dire que la partie doc a pas forc\u00e9ment pu \u00eatre totalement compl\u00eat\u00e9e mais demain il va falloir que je m'occupe de la suite du projet.","title":"Lundi 15 Mai 2023"},{"location":"jdb.html#mardi-16-mai-2023","text":"Bon aujourd'hui c'est la partie stockage qui doit \u00eatre faite. Il y a plusieurs solutions possibles \u00e0 ce probl\u00e8me. Mais comme je n'ai besoin que d'une base de donn\u00e9e locale et que je ne veux pas que chaque utilisateur doive installer un serveur sur sa machine je pense que je vais utiliser une base de donn\u00e9es SQLITE. Il y a eu une petit intervention de mr Bonvin qui est venu me donner une id\u00e9e pour la partie OCR. En fait j'avais un soucis quand je voulais d\u00e9coder du texte de couleur. M\u00eame en appliquant un filtre de gris je n'arrivais pas \u00e0 faire reconnaitre les chiffres. Et il m'a dit que une bonne id\u00e9e cela pourrait de prendre la valeur max de chaque channel et de la faire appliquer \u00e0 tous ce qui blanchit assez bien l'image. J'ai d\u00e9cid\u00e9 d'exag\u00e8rer le blanchiment et cela donne des r\u00e9sultats plut\u00f4t... int\u00e9ressants... \"Filtre vanish oxy action sur un secteur violet\" Le soucis c'est que le violet est une couleur quand m\u00eame assez sombre alors il va falloir que je fasse un syst\u00e8me de treshold un peu sp\u00e9cial qui soit un peu plus sympa et qui prenne plus facilement des couleurs plus basses. Une methode \u00e0 laquelle j'ai pens\u00e9 pour detecter dans quel tour chaque pilote est serait de garder en m\u00e9moire toutes les infos de chaques pilotes au fur et \u00e0 mesure, et d\u00e8s qu'on ne recoit plus d'infos des secteurs ou que le temps au tour a chang\u00e9 on peut savoir qu'il faut passer au tour suivant. Pour detecter les arr\u00eats aux stands je peux essayer de detecter un changement de type de pneus ou de nombre de tours detect\u00e9s sur le m\u00eame pneu Au d\u00e9part je me disais que je pourrais peut-\u00eatre faire une base de donn\u00e9e SQLITE locale qui puisse \u00eatre reprise d'un Grand Prix \u00e0 un autre. Mais je me suis dit que de faire des statistiques inter Grand Prix \u00e9tait un peu en dehors du scope du projet. La base de donn\u00e9e sera donc cr\u00e9\u00e9e \u00e0 chaque d\u00e9marrage de l'app La mani\u00e8re dont je vois les choses en ce moment est qu'on aie deux sources de donn\u00e9es dans l'affichage final. On aurait une partie des infos qui seraient en direct depuis la detection : Les ecarts entre pilotes La position des pilotes Le dernier temps au tour Les derniers secteurs Les pneus Mais on aurait aussi des rubriques cr\u00e9\u00e9es de toutes pi\u00e8ces par des infos qui viennent de la BD Voici les rubriques qui pourraient \u00eatre int\u00e9ressantes \u00e0 voir dans l'interface finale : Les 3 ou 5 pilotes les plus rapides ces cinq derniers tours Le pilote qui a le plus fait de d\u00e9passements Les batailles en cours Les 3 pilotes les plus lents Un classement pond\u00e9r\u00e9 avec les 20s de moins pour tous les pilotes qui ne se sont pas encore arr\u00eat\u00e9s En gros l'id\u00e9e serait que on update une fois par tour et par pilote la base de donn\u00e9e avec des infos comme le temps au tour, le type de pneu etc... Voici les trois tables que je vais cr\u00e9er : Drivers Colonne Type de Data Description Tag ID INTEGER ID du pilote PRIMARY Name VARCHAR Nom du pilote NOT NULL Pitstops Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui a effectu\u00e9 le Pitstop PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL Stats Colonne Type de Data Description Tag Lap INTEGER Tour durant lequel le Pitstop a \u00e9t\u00e9 effectu\u00e9 PRIMARY DriverID INTEGER Pilote qui concern\u00e9 PRIMARY Tyre VARCHAR Pneu chauss\u00e9 par le pilote NOT NULL LapTime INTEGER Temps au tour (MS) NOT NULL Sector1 INTEGER Temps du secteur 1 (MS) NOT NULL Sector2 INTEGER Temps du secteur 2 (MS) NOT NULL Sector3 INTEGER Temps du secteur 3 (MS) NOT NULL GapToLeader INTEGER Ecart avec le leader (MS) NOT NULL Position INTEGER Position pilote NOT NULL Ca n'est pas forc\u00e9ment d\u00e9finitif mais je pense que c'est d\u00e9ja un bon d\u00e9but pour faire des rubriques sympa. Je suis en train de tenter d'impl\u00e9menter le code pour permettre ensuite d'ajouter et retirer des choses facilement.","title":"Mardi 16 Mai 2023"},{"location":"jdb.html#mercredi-17-mai-2023","text":"Aujourd'hui le but c'est de remplir la base SQLITE avec des infos. Si j'arrive \u00e0 tout remplir alors ca devrait pas \u00eatre trop compliqu\u00e9 de venir faire des requ\u00e8tes qui donnent de bonnes infos. Mais la probl\u00e9matique principale va \u00eatre de d\u00e9cider QUAND ins\u00e8rer des choses dans la base de donn\u00e9e. Je pense que le meilleur moyen serait de garder une liste de DriverData par pilote en piste qui puisse contenir toutes les data que l'on recoit. Et \u00e0 chaques fois que l'on veut ajouter \u00e0 cette liste on v\u00e9rifie si un tour a \u00e9t\u00e9 fait pour envoyer les data pr\u00e9c\u00e9dente et r\u00e9initialiser la liste. Il faut donc une liste de 20 listes de DriverData et une liste de int qui repr\u00e9senteront le num\u00e9ro du tour dans lequel chaque pilote se trouve. Pour detecter un arr\u00eat je pense que la meilleure mani\u00e8re est de regarder si le pilote a chang\u00e9 de place ou de type de pneu. Si je prend que les fois ou le pilote change place ET de pneus alors certains arr\u00eats pour ceux qui sont loins devant ou loins derri\u00e8re pourraient ne pas \u00eatre detect\u00e9s. Et si je ne prend que le changement de pneus cela pose un soucis car un pneu pourrait avoir \u00e9t\u00e9 chang\u00e9 pour un autre du m\u00eame type. Et parfois les valeurs de tours faits avec le pneu ne sont pas toujours bien lues et parfois sont compliqu\u00e9es \u00e0 retrouver car tous les pneus ne sont pas neuf quand ils sont chauss\u00e9s. Je crois que la detection de tours et des arr\u00eats aux stands est sur la bonne voie. Le seul soucis que j'ai c'est que pour faire du debug je suis un peu oblig\u00e9 d'attendre pendant 10min si je veux avoir de quoi faire des stats un peu sympa. Je me rend compte que parfois j'obtiens des r\u00e9sultats un peu bizarres mais que c'est la f1TV qui les donne. Par exemple de cas ou Alex Albon n'a que deux tours sur ses pneus alors que tout le monde devant et derri\u00e8re lui en a 3 et que on est au tour 4. \"wtf...?\" Ah et aussi parfois quand les pilotes se d\u00e9passent on se retrouve dans des situations plut\u00f4t rigolotes : \"Wtf...??\" COMMENT JE FAIS POUR DETECTER CA WIONDVIDNJDODVNSDIC Bon je me rend compte que clairement si je veux que mes data soient plus utiles il faudrait que je fasse un tout petit peu plus de taff sur quelques points dans l'OCR. Le nombre de tours des pneus (Les num\u00e9ros sont vraiment mal detect\u00e9s et parfois m\u00eame la couleur est pas dingue) Les 4 qui sont pris pour des 1 ou des 11 (pour les temps et les pneus) apr\u00e8s un test de plus longue haleine je suis content de voir que au moins mon programme peut tourner plus d'une heure sans crasher et qu'il peut \u00eatre fiable quand il veut.","title":"Mercredi 17 Mai 2023"},{"location":"jdb.html#jeudi-18-mai-2023","text":"Aujourd'hui c'est t\u00e9l\u00e9Travail forc\u00e9 et j'\u00e9tais scens\u00e9 aller au Grand Prix d'Imola ce qui malheureusement ne pourra pas se faire pour des raisons d'inondations. En effet la r\u00e9gion est clairement pas en \u00e9tat de recevoir un Grand Prix de Formule 1 et donc ce weekend c'est maison. Le but du jour c'est d'avancer la doc et de tenter d'am\u00e9liorer l'OCR pour que Lundi il soit relativement facile d'avancer sur l'interface de l'app finale. Je suis en train d'explorer une methode de detection de bords de sobel. Le seul soucis c'est que les r\u00e9sultats sont bons mais avec un vide au milieu des chiffres. Cela veut dire que parfois le temps est mal detect\u00e9. Mais il semble que pour le reste du temps cela se passe plut\u00f4t bien. Ca vaut peut \u00eatre le coup de modifier la gestion des erreurs. \"Artefacts de detection de sobel\" En fait le soucis avec ces artefacts c'est que parfois le temps au tour n'est tout simplement pas detect\u00e9. Dans l'exemple ci dessus, la reconnaissance de caract\u00e8res ne trouve tout simplement rien. Il faut donc que je trouve un moyen de corriger ces soucis. Il semblerait que en appliquant un tresholding un peu plus s\u00e9v\u00e8re en amont on arrive \u00e0 r\u00e9duire les artefacts \"Artefacts all\u00e8g\u00e9s\" ; Je crois qu'il faut faire attention avec les 'Bitmap.save' quand on utilise de l'asynchrone. le GDI+ aime pas des masses.","title":"Jeudi 18 Mai 2023"},{"location":"jdb.html#lundi-22-mai-2023","text":"BON ! Il ne reste plus beaucoup de temps ! Selon le planning cette semaine est la derni\u00e8re semaine de programmation. Il va donc falloir CHARBONNER !! Il ne me reste plus que une t\u00e2che \u00e0 vraiment faire (\u00e0 part les tests mais euuuu voila bon). J'essaie d'impl\u00e9menter un peu plus d'error handling mais c'est pas facile... Il y a tellement de choses qui peuvent mal tourner c'est infernal. Une chose qui serait bien serait de rajouter des points d'attente variables dans le code de l'emulateur un peu partout pour eviter de se retrouver bloqu\u00e9 \u00e0 chaque fois. L'int\u00e9r\u00eat serait que des gens avec une moins bonne connexion pourraient quand m\u00eame profiter du programme sans qu'il crashe 300 fois. Ce qui est frustrant c'est que va savoir pourquoi, maintenant, on arrive quasi jamais a avoir la page data... Genre sans deconner c'est une fois sur 5 que l'emulateur nous ressort la page Data et pas juste le feed. C'est absolument infernal. Je ne comprends pas pourquoi en plus. L'emulateur arrive bien \u00e0 cliquer sur le bon bouton mais m\u00eame comme ca ca ne veut pas. CA NA AUCUN SENS BORDEL. Sur une image Jjai de supers resultats pour les temps au tour mais d\u00e8s que l'image change PAF plus aucun temps n'est detect\u00e9. Ah non c'est bon c'est juste que VA SAVOIR POURQUOI les images sont en putain de resolution DEGEULASSE. Je ne comprends pas pourquoi ce matin particuli\u00e8rement le projet marche si mal. Par ce que d\u00e8s que l'image revient \u00e0 une r\u00e9solution normale c'est bon. Un autre soucis que j'ai est que je n'arrive pas \u00e0 paralleliser l'OCR ce qui fait que elle peut prendre parfois plus de 15 secondes. Et le probl\u00e8me avec ca c'est que la detection de tours et de pitstop est grandement impact\u00e9e si on a pas assez de data assez souvent. Je vais me focus sur le reste en attendant mais d\u00e8s que M.Bonvin apparait dans les parages je vais devoir l'alpaguer. J'ai ajout\u00e9 la possibilit\u00e9 d'essayer plusieurs fois de trouver le bouton fullscreen et de cliquer dessus plut\u00f4t que d'attendre dix secondes comme un con et esp\u00e8rer que ca fonctionne. Mais si apr\u00e8s 15 secondes d'essais il n'y arrive pas cela fait quand m\u00eame p\u00eater une erreur. Je pense que je vais m'occuper de la page de configuration maintenant. Voici \u00e0 quoi ressemblait la page de settings ce matin quand je suis arriv\u00e9. \"Ancienne page de settings\" Comme je pense que l'UI de cette page ne va pas vraiment changer d'ici la fin du projet je peux me permettre de lui faire une petite beaut\u00e9 car apr\u00e8s je ne pense pas y retoucher. Pour ca j'ai plusieurs \u00e9tapes comme choisir une palette de couleur, retirer l'inutile et choisir judicieusement le placement des items sur la form pour que cela soit le plus intuitif possible. J'y pense, il fuadrait peut-\u00eatre que je me trouve un logo ca pourrait rendre bien. Voila alors j'ai chang\u00e9 un tout petit peu ce \u00e0 quoi ressemble la page de settings et j'ai ajout\u00e9 du responsive pour que le user puisse mettre l'application en plein \u00e9cran. \"Nouvelle page de configuration\" Mais il manque un peu de couleurs et de d\u00e9tails pour que cela rende vraiment bien. Et apr\u00e8s quelques tentatives on se retrouve avec une page plut\u00f4t sympa je trouve : \"Nouvelle page de config\" Et elle est responsive : \"Nouvelle page de config en plein \u00e9cran\" Et j'ai fait quelques changements pour ce qui est des zones qui s'affichent pour qu'on les voie mieux. \"Nouvelle page de config en action\" Je trouve que franchement ca rend pas mal. Le reste de l'app sera dans ce style. J'ai mis pas mal de temps \u00e0 cr\u00e9er cette page, mais je pense que c'est important que la page de config soit propre. Et en plus tout le temps que j'ai pass\u00e9 ici n'est pas perdu car ensuite j'aurai simplement \u00e0 suivre les m\u00eames directives de style pour le reste de l'UI. Il faut aussi savoir que Windows Form n'est ps forc\u00e9ment le meilleur outil pour travailler avec le design. Truc tout b\u00eate par exemple qui m'a fait perdre 30 minutes. Il est impossible de retirer les bordures des objets \"GroupBox\". Ce que j'ai donc du faire ca a \u00e9t\u00e9 de dessiner un rectangle autour de la couleur du background pour que l'on ne voit plus les bordures et ensuite j'ai du redessiner le texte pour qu'il puisse s'afficher quand m\u00eame. C'est pleins de petites choses comme ca qui sont plut\u00f4t p\u00e9nibles et qui font perdre du temps mais je pense que c'est rentable de s'y attarder. Maintenant ce que je vais faire aujourd'hui et demain c'est l'affichage general de l'app. Je pense que je vais commencer par mettre des placeholder de l'app finale comme ca je saurai quoi implementer comme methodes de r\u00e9cup\u00e8ration demain. J'aimerais quand m\u00eame faire une interface sympa m\u00eame si les data sont pas parfaites. Par ce que je me dis que au pire si je montre une interface qui donne des infos inexacte mais qui a la bonne logique c'est toujours mieux que de ne pas montrer ce que ca pourrait faire avec des donn\u00e9es un peu plus int\u00e8gres. Autre point \u00e0 noter, je me suis rendu compte que ca pourrait \u00eatre potentiellement pas mal de trouver un moyen rapide de lancer l'appli avec un Grand Prix. Genre permettre de selectionner le preset et l'URL du Grand Prix sans avoir \u00e0 passer par la page de configuration. Je me suis rendu compte que c'\u00e9tait super chiant de devoir \u00e0 chaque fois le faire (m\u00eame si je me rends compte que normalement un user ne devrait pas lancer l'app autant) Voila ue premi\u00e8re version de l'App avec tous les placeholders : \"Premi\u00e8re version de la page principale\" Et c'est tout pour aujourd'hui ! Ce fut une journ\u00e9e remplie.","title":"Lundi 22 Mai 2023"},{"location":"jdb.html#mardi-23-mai-2023","text":"Aujourd'hui le but c'est de remplir le framework de hier avec les bonnes Data. Je ne sais pas si je peux tout finir en un jour mais on va essayer. Bon j'ai eu une discussion anim\u00e9e avec M.Bonvin et il semble que je sois oblig\u00e9 de refaire \u00e0 peu pr\u00e8s tout mon code pour le rendre ne serait-ce qu'un peu optimis\u00e9. Bon au final j'ai perdu 6H de travail \u00e0 tenter de convertir mon code dans une version un peu plus optimis\u00e9e... Mais je me rend compte que c'est juste impossible... Il me faudrait au moins plusieurs jours pour faire correctement ce refactor et donc je vais tout simplement faire un git restore... C'est extr\u00eament frustrant mais bon... Pas le choix il semble. J'ai du \u00e9crire au moins 600 lignes de code et tout pars en fum\u00e9e. C'est une d\u00e9bauche d'\u00e9nergie absolument ph\u00e9nomenale. Apr\u00e8s ca valait le coup de tenter je pense. (J'ai envie de mourir) EN FAIT C'EST BON !! Il fallait juste que je croie en mon code original !!! J'ai r\u00e9ussi \u00e0 paralelliser mon ancien code. Il ne manquait presque rien mais M.Bonvin voulait absolument que je change le reste. Maintenant j'ai une detection qui se fait en quelques secondes c'est genial.","title":"Mardi 23 Mai 2023"},{"location":"jdb.html#mercredi-24-mai-2023","text":"Alors hier je n'ai pas bien eu le temps d'expliquer ce que voulait que M.Bonvin. En fait mon programme actuellement utilise un d\u00e9coupage qui peut par\u00e2itre complexe. Et de par sa nature, il pensait qu'il \u00e9tait simplement impossible de paralelliser le traitement car trop complexe et trop couteux. Il voulait donc que je passe sur un traitement plus simple. L'id\u00e9e \u00e9tait que on s'occupe dabord de faire une liste de toutes les Windows et de les traiter toutes \u00e0 la fois pour \u00e9viter que les boucles soient trop complexes. Sauf que pour impl\u00e9menter un truc pareil c'est \u00e9norm\u00e9ment de code car cela va \u00e0 l'encontre totale de la facon dont mon projet fonctionne actuellement. Mais comme j'\u00e9tais ouvert \u00e0 d'autres solutions. J'ai pass\u00e9 six heures \u00e0 tenter de l'impl\u00e9menter. Il en aurait fallu au minimum deux jours soyons clair. Et en fait on s'est retrouv\u00e9s devant pleins de probl\u00e8mes qui ne se posent pas dans mon architecture originale. Par exemple. On a pas trouv\u00e9 de methode simple pour d\u00e9couper les images des fen\u00eatres de mani\u00e8re thread safe. Il aurait donc fallu ajouter des boucles en pr\u00e9alable pour tout d\u00e9couper et le faire de mani\u00e8re s\u00e9quencielle. Ensuite vient le probl\u00e8me que si on traite toutes les donn\u00e9es dans des boucless paralelle on perds leur position originale donc il faut faire une classe pour stocker les r\u00e9sultats temporaires. Il y a aussi le soucis que les Windows ont certe une position mais elle est relative au parent et \u00e0 l'image parente. Donc il faudra faire un syst\u00e8me qui convertis les windows en position absolue sur l'image. Ca peut para\u00eetre \u00eatre de simples changements mais deja il y en a pas mal d'autres et franchement m\u00eame si l'id\u00e9e originale aurait pu simplifier les choses. Les sacrifices que l'on doit faire pour la faire marcher sont juste trop moches et \u00e0 mon avis ne sont pas du tout aussi logiques que mon d\u00e9coupage original. Cette exp\u00e9rience m'a quand m\u00eame permis de me rendre compte des endroits dans mon code qui sont plus ou moins difficile \u00e0 maintenir et cela m'a fait me rendre compte que ma solution n'\u00e9tait pas forc\u00e9ment la plus simple pour tout le monde mais que mine de rien elle peut \u00eatre efficace. La je suis en train de rajouter les routes pour la vue. Je me suis dit que ca serait une bonne id\u00e9e de permettre aux users de cliquer sur un pilote pour avoir ses infos. Mais je me suis dit que ce qui serait encore plus cool serait de pouvoir cliquer sur un des temps au tour d'un pilote et qu'une petite fen\u00eatre s'ouvre pour indiquer les temps par secteurs. Mais en faisant ca je me rends compte qu'il y a quelques soucis dans la facon que je conserve les infos dans la DB et je peux voir directement quand la reconnaissance a du mal avec certains pilotes ou des positions. Ca arrive plus souvent que ce que je voudrais que un pilote soit mal detect\u00e9. Mais ce qui est dr\u00f4le c'est que c'est parfois sur une deux voire trois reconnaissance que le pilote n'est plus reconnu mais ensuite tout va bien. Il faut que je travaille un peu plus sur le filtrage de ces donn\u00e9es limites et peut-\u00eatre de voir si la reconnaissance de la position pourrait \u00eatre un peu v\u00e9rifi\u00e9e. Bon pour \u00eatre honn\u00eate je ne pense pas que le code qui concerne l'affichage soit le meilleur code que j'aie pu produire dans ma vie de d\u00e9veloppeur mais en m\u00eame temps je n'ai pas forc\u00e9ment le temps de le rendre magnifique. La le but est simplement que tout marche. (Et c'est un peu la m\u00eame phylosophie dans tout le reste du projet lol) Demain il me reste pas mal de choses \u00e0 faire et c'est la derni\u00e8re journ\u00e9e ou je peux les faire. Rendre la form plus jolie et changer les couleurs Rendre la form Responsive Ajouter les bons messages d'erreur qui vont bien Modifier les messageBox d'erreur pour qu'elles soient plus agr\u00e9ables \u00e0 utiliser Clean un peu le code mod\u00e8le vue controller Si j'ai le temps ajouter les bons commentaires les bonnes ent\u00eates partout","title":"Mercredi 24 Mai 2023"},{"location":"jdb.html#jeudi-25-mai-2023","text":"Bon bah le but aujourd'hui c'est de finaliser un peu le projet car la semaine prochaine c'est doc. Pas grand chose \u00e0 dire. J'ai pass\u00e9 la journ\u00e9e \u00e0 fix des petits bugs par ci par la. Voici des exemples de ce \u00e0 quoi ressemble l'app \u00e0 la fin de la journ\u00e9e : \"Screenshot de la page principale\" \"Screenshot de la page principale\" On se rend jamais compte mais c'est tellement long de r\u00e8gler chaque petit soucis un par un. Il y a tellement de possibilit\u00e9s de choses qui peuvent mal tourner ou qui ont un comportement diff\u00e9rent selon l'ordre dans lequel on fait les choses. Mais dans l'ensemble, m\u00eame si on est pas sur la meilleure interface que l'on aie vu dans l'histoire. Je trouve que elle fait quand m\u00eame le taff.","title":"Jeudi 25 Mai 2023"},{"location":"jdb.html#vendredi-26-mai-2023","text":"Aujourd'hui c'est d\u00e9part pour Monaco mais comme l'avion etait bien en retard j'ai pu avancer sur le nettoyage du code.","title":"Vendredi 26 Mai 2023"},{"location":"jdb.html#grand-prix-de-monaco","text":"[Insert photos]","title":"Grand Prix de Monaco"},{"location":"jdb.html#lundi-29-mai-2023","text":"Mon vol pour Geneve hier soit a \u00e9t\u00e9 annul\u00e9 et je dois donc prendre une deviation car tous les vols pour Geneve sont pleins. Je dois partir a 7h30 pour prende l'avion de 9H pour Nantes et de la bas je dois prendre un avion \u00e0 17h pour arriver \u00e0 18h30 \u00e0 l'a\u00e9roport de Geneve. C'est pas pratique car j'avais pr\u00e9vu d'avancer aujourd'hui et je suis oblig\u00e9 d'avancer comme je peux dans l'a\u00e9roport. J'avance encore sur le nettoyage rapide du code. Le but est que demain je puisse sortir la premi\u00e8re release en Beta et que je mette vraiment serieusement \u00e0 la Documentation. M.Jayr m'a \u00e9galement demand\u00e9 de lui donner le document d'\u00e9valuation interm\u00e9diaire. Il ne faut pas que j'oublie demain. J'ai mis des notes sur mon code au cas ou des gens viennent \u00e0 le lire. J'y d\u00e9cris les choses que j'aurais fait diff\u00e9remment ou qui pourraient para\u00eetre bizarre au tout venant.","title":"Lundi 29 Mai 2023"},{"location":"jdb.html#mardi-30-mai-2023","text":"Bon aujourd'hui je dois encore avancer sur la partie nettoyage de code et avant de sortir la premi\u00e8re release Beta je vais tenter d'installer le projet sur un autre pc pour voir ce que je n'ai pas mentionn\u00e9 dans mon ReadMe. Bon j'ai pu rendre \u00e0 M.Jayr mon evaluation interm\u00e9diaire et j'ai fait les derni\u00e8res modifications sur le projet pour que je puisse sortir une release correcte. Maintenant je vais me mettre \u00e0 la documentation. Il va falloir que je revoie ce que j'ai d\u00e9ja \u00e9crit en ce qui concerne l'OCR car j'ai fait des modifications depuis et j'ai ajout\u00e9 la methode de SOBEL. Il faut peut-\u00eatre aussi que je parle vite fait dans la partie Emulation que j'ai du changer les variables d'environnement pour faire fonctionner le syst\u00e8me en 4K.","title":"Mardi 30 Mai 2023"},{"location":"jdb.html#mercredi-31-mai-2023","text":"Doc","title":"Mercredi 31 Mai 2023"},{"location":"jdb.html#jeudi-1-juin-2023","text":"Bon je me suis rendu compte que je n'avais fait vraiment aucuns tests et que c'est franchement bof. Je pense que ce que je devrais faire pour faire des tests unitaires c'est prendre des exemples de chaque type de windows possibles en plusieurs exemplaires. Ensuite je note le r\u00e9sultat que j'attends et je regarde si ca me retourne la bonne valeur. Mais ca veut dire que ca va me prendre pas mal de temps de tout mettre en place mais ca m'aurait s\u00fbrement fait gagner beaucoup de temps si je l'avais fait d\u00e8s le d\u00e9but... Je pense que une bonne id\u00e9e serait de prendre trois Grand Prix et de prendre une photo de chaque type de window au d\u00e9but et \u00e0 la fin. Plus je regarde plus je me rend compte que ce pojet aurait carr\u00e9ment du \u00eatre en TDD (Test Driven Developement) par ce que ca m'aurait fait gagner un temps FOU. OK JE SUIS DEBILE POURQUOI J'AI PAS FAIT CA PLUS T\u00d4T ??? En fait ce que j'aurais du faire c'est prendre de gros \u00e9chantillons de toutes les types de windows et j'aurais un parfait framework pour savoir si j'ai am\u00e9lior\u00e9 mon OCR ou non. Voici les exemples que je vais utiliser pour verifier le bon fonctionnement de l'OCR : \"Dataset Ecarts\" ; \"Dataset Tours\" ; \"Dataset Noms\" ; \"Dataset Positions\" ; \"Dataset Sectors\" ; \"Dataset Tyres\" ; Je pense que c'est un set assez correct car j'ai essay\u00e9 de prendre un peu tous les cas possibles. Le seul qui m'inqui\u00e8te un peu c'est celui des pneus mais bon. C'est aussi celui qui m'inqui\u00e8te le plus en temps normal. Non mais c'est juste g\u00e9nial les tests en fait... j'avais pas vu que parfois ma detection de GAP TO LEADER comprenait le \"+1:34.567\" en \"61:34.567\" car le '+' \u00e9tait interpr\u00eat\u00e9 comme un 6. Sans les tests je ne m'en serais pas rendu compte. Ce qui est g\u00e9nial c'est que ca veut dire que si je veux am\u00e9liorer mon OCR j'ai juste \u00e0 mettre plus d'exemples dans le dossier de tests et de run les tests et voir ou il a des soucis. C'est un peu tard mais ca m'aurait fait gagner TELLEMENT de temps c'est absolument ridicule.","title":"Jeudi 1 Juin 2023"},{"location":"jdb.html#vendredi-2-juin-2023","text":"Aujourd'hui c'est de nouveau doc. Mais la je pense qu'il faut que je rajoute une rubrique \"Fonctionnement g\u00e9n\u00e9ral\" qui r\u00e9sume tr\u00e8s simplement toutes les \u00e9tapes du projet avec un bon diagramme. En fait c'est beaucoup plus dur que ce que je pensais de faire un bon diagramme qui explique tout sans \u00eatre illisible. J'ai mis une heure trente \u00e0 faire celui la : \"Diagramme fonctionnement g\u00e9n\u00e9ral\" J'ai pris pas mal de temps aussi \u00e0 faire ces trois autre diagrammes un peu plus graphiques qui montrent de mani\u00e8re un poil plus abstraite le fonctionnement des trois grosses parties du projet. \"Diagramme recup\u00e9ration d'images\" \"Diagramme OCR\" \"Diagramme Traitement\" Je pense qu'ils sont un peu plus faciles \u00e0 comprendre que le gros diagramme g\u00e9n\u00e9ral. Ce que je me dis c'est que je vais faire une section fonctionnement g\u00e9n\u00e9ral ou je vais expliquer les trois parties avec les petits diagramme et r\u00e9sumer avec le grand diagramme.","title":"Vendredi 2 Juin 2023"},{"location":"jdb.html#lundi-5-juin-2023","text":"Ce weekend j'ai voulu essayer le projet pour le Grand Prix de Barcelone qui s'est sold\u00e9 en un \u00e9chec cuisant... J'ai eu trois soucis pour l'utilisation du programme. Les voici dans l'ordre croissant d'importance et de difficult\u00e9 \u00e0 r\u00e8gler : Mon Laptop est incapable de rester plus d'une heure allum\u00e9 m\u00eame compl\u00eatement charg\u00e9 \u00e0 100% Le WIFI de chez moi a du mal \u00e0 g\u00e8rer plusieurs flux 1080p en m\u00eame temps et donc le temps de chargement est trop long ce qui me fait des erreurs 105 \"Ce que voyait le programme pendant les erreurs 105 ce dimanche\" Le fait que quand un flux est en live, quand on clique dessus, un nouveau bouton appar\u00e2it qui n'\u00e9tait pas pr\u00e9vu et qui nous propose de regarder depuis le d\u00e9but ou en live. Le soucis avec ce bouton c'est qu'il n'est pr\u00e9sent que pour les sessions live... Il va donc falloir attendre le prochain GP (Canada 18 Juin) pour faire un test en conditions r\u00e9elles. \"Ce que voyait le programme avant que j'essaie d'impl\u00e9menter le click auto\" J'ai essay\u00e9 de r\u00e8gler le probl\u00e8me en Live, le soucis c'est que j'ai un commentaire \u00e0 fournir pendant la course et donc je n'ai pas eu le temps de plus me pencher sur le cas. Le weekend du prochain Grand Prix je vais essayer de tester sur les sc\u00e9ances d'essais libres.le click du bouton et j'amenerai mon cable chez moi. Bon sinon aujourd'hui, comme d'hab, Doc... Je vais faire le manuel utilisateur. J'ai fait un manuel qui d\u00e9crit \u00e0 peu pr\u00e8s tout ce qui'il faut savoir pour bien utiliser l'app. Cela fait un document un peu long mais je pense que c'est nescessaire car c'est vraiment pas une app facile \u00e0 comprendre quand on ne vient pas du milieu de la F1 (et m\u00eame la...)","title":"Lundi 5 Juin 2023"},{"location":"jdb.html#mardi-6-juin-2023","text":"Aujourd'hui je vais continuer \u00e0 documenter... Ma methode pour l'instant c'est juste de remplir les titres que j'ai pr\u00e9vu au d\u00e9part. Ensuite \u00e0 partir de jeudi (je pense que c'est \u00e0 partir de cette date que j'aurai un peu tout rempli) j'aimerais bien relire la grille d'\u00e9valuation et ensuite faire une lecture de mon journal de bord pour v\u00e9rifier que je n'ai rien oubli\u00e9. Et le but c'est de finir la doc Vendredi soir pour faire une derni\u00e8re release doc + projet. Un coll\u00e8gue M.Briard m'a pas mal aid\u00e9 avec la configuration de mon mkdocs et il a d\u00e9velopp\u00e9 une extension pour ajouter le code source au PDF final. La il est en train de regarder si il peut trouver un moyen de faire une table des figures qui nous est demand\u00e9e. (j'ai plus de 200 images dans ma documentation alors si c'est possible de ne pas avoir \u00e0 faire une table des figures \u00e0 la main je prends)","title":"Mardi 6 Juin 2023"},{"location":"jdb.html#mercredi-7-juin","text":"La je suis en train de parler de l'optimisation de mon application et je viens de me rappeller qu'il manquait des methodes avec de la paralellisation alors je vais les convertir avant de continuer la doc. En fait je viens de me rendre compte qu'aucunes de mes methodes de filtres n'\u00e9taient en parralel... Je ne sais pas si jaurai le temps de le faire aujourd'hui en fait public static Bitmap Grayscale ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); //This is not a proper treshold method but it is helping the sobel edge detection if ( gray <= F1TV_BACKGROUND_TRESHOLD . R ) { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } else { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) gray ; } } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; }","title":"Mercredi 7 Juin"},{"location":"Code/ConfigurationTool.html","text":"ConfigurationTool.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : ConfigurationTool.cs /// Brief : Class that contains all the methods used to create config files for the main programm /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using Tesseract ; using System.IO ; using System.Text.Json ; using System.Text.Json.Nodes ; namespace TrackTrends { public class ConfigurationTool { public Zone MainZone ; public const int NUMBER_OF_DRIVERS = 20 ; public const int NUMBER_OF_ZONES = 9 ; public const string CONFIGS_FOLDER_NAME = \"./Presets/\" ; /// /// Creates the configuration tool. It can only be created if you already have the dimensions of the main zone /// /// The full image coming from the F1TV Data Channel /// The dimensions of the zone where all the drivers data are situated public ConfigurationTool ( Bitmap fullImage , Rectangle mainZoneDimensions ) { MainZone = new Zone ( fullImage , mainZoneDimensions , \"Main\" ); AutoCalibrate (); } /// /// Resets the main zone /// public void ResetMainZone () { MainZone . ResetZones (); } /// /// Reset the windows /// public void ResetWindows () { MainZone . ResetWindows (); } /// /// Save the current config in a JSON file stored in /Presets/ /// /// A list of all the drivers in the GP. IMPORTANT, they need to ALL be mentionned or the program wont be able to detect the missing ones and will F up everything /// The name the config should have public void SaveToJson ( List < string > drivers , string configName ) { string JSON = \"\" ; JsonObject jsonFileObject = new JsonObject (); //Creates the mainZone object JsonObject mainZoneObject = new JsonObject (); mainZoneObject . Add ( \"x\" , MainZone . Bounds . X ); mainZoneObject . Add ( \"y\" , MainZone . Bounds . Y ); mainZoneObject . Add ( \"width\" , MainZone . Bounds . Width ); mainZoneObject . Add ( \"height\" , MainZone . Bounds . Height ); JsonArray driverZonesArray = new JsonArray (); //Creates all the subzones that contain driver infos int DriverID = 0 ; foreach ( Zone driverZone in MainZone . Zones ) { DriverID ++; JsonObject driverZoneObject = new JsonObject (); driverZoneObject . Add ( \"name\" , \"Driver\" + DriverID ); driverZoneObject . Add ( \"x\" , driverZone . Bounds . X ); driverZoneObject . Add ( \"y\" , driverZone . Bounds . Y ); driverZoneObject . Add ( \"width\" , driverZone . Bounds . Width ); driverZoneObject . Add ( \"height\" , driverZone . Bounds . Height ); JsonArray windowsArray = new JsonArray (); JsonObject windowObject = new JsonObject (); //Creates all the windows of the current driver zone //Note : We store ALL the windows and zones in the JSON because they are not spaced exactly the same on the main zone foreach ( Window window in driverZone . Windows ) { windowObject . Add ( window . Name , new JsonObject { { \"x\" , window . Bounds . X }, { \"y\" , window . Bounds . Y }, { \"width\" , window . Bounds . Width }, { \"height\" , window . Bounds . Height } }); } windowsArray . Add ( windowObject ); driverZoneObject . Add ( \"Windows\" , windowsArray ); driverZonesArray . Add ( driverZoneObject ); } mainZoneObject . Add ( \"DriverZones\" , driverZonesArray ); JsonArray driversArray = new JsonArray (); foreach ( string driver in drivers ) { driversArray . Add ( driver ); } mainZoneObject . Add ( \"Drivers\" , driversArray ); jsonFileObject . Add ( \"Main\" , mainZoneObject ); JSON = jsonFileObject . ToString (); //Saving the file string path = CONFIGS_FOLDER_NAME + configName ; if ( File . Exists ( path + \".json\" )) { //We need to create a new name int count = 2 ; while ( File . Exists ( path + \"_\" + count + \".json\" )) { count ++; } path += \"_\" + count + \".json\" ; } else { path += \".json\" ; } File . WriteAllText ( path , JSON ); } /// /// Adds a window in the windows list /// Be carefull of the order. It cant be random or it will crash. The programm expect the first to be position, second Gap to leader etc... /// /// The bounds of the window public void AddWindows ( List < Rectangle > rectangles ) { foreach ( Zone driverZone in MainZone . Zones ) { Bitmap zoneImage = driverZone . ZoneImage ; for ( int i = 1 ; i <= rectangles . Count ; i ++) { switch ( i ) { case 1 : //First zone should be the driver's Position driverZone . AddWindow ( new DriverPositionWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 2 : //Second zone should be the Gap to leader driverZone . AddWindow ( new DriverGapToLeaderWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 3 : //Third zone should be the driver's Lap Time driverZone . AddWindow ( new DriverLapTimeWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 4 : //Fourth zone should be the driver's DRS status driverZone . AddWindow ( new DriverDrsWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 5 : //Fifth zone should be the driver's Tyre's informations driverZone . AddWindow ( new DriverTyresWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 6 : //Sixth zone should be the driver's Name driverZone . AddWindow ( new DriverNameWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 7 : //Seventh zone should be the driver's First Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 1 , false )); break ; case 8 : //Zone number eight should be the driver's Second Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 2 , false )); break ; case 9 : //Zone number nine should be the driver's Position Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 3 , false )); break ; } } } } /// /// This will automatically create all the driver zones at the correct places if the main zone has been weel positionned /// You cant just divide the image by the number of pilots or it will be messy and inconsistent at the end (Garbage in Garbage Out) /// public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); List < Zone > zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Image image = MainZone . ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); //Runs a quick OCR detection. Not to detect any content but just to detect where is all the text positionned. //For each row it decides the best Zone location and adds it to the Driver zone list using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } //DEBUG int i = 1 ; foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); //We add the driver zones Zone driverZone = new Zone ( MainZone . ZoneImage , windowRectangle , \"DriverZone\" ); MainZone . AddZone ( driverZone ); //driverZone.ZoneImage.Save(\"Driver\" + i+\".png\"); i ++; } } } }","title":"ConfigurationTool.cs"},{"location":"Code/ConfigurationTool.html#configurationtoolcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : ConfigurationTool.cs /// Brief : Class that contains all the methods used to create config files for the main programm /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using Tesseract ; using System.IO ; using System.Text.Json ; using System.Text.Json.Nodes ; namespace TrackTrends { public class ConfigurationTool { public Zone MainZone ; public const int NUMBER_OF_DRIVERS = 20 ; public const int NUMBER_OF_ZONES = 9 ; public const string CONFIGS_FOLDER_NAME = \"./Presets/\" ; /// /// Creates the configuration tool. It can only be created if you already have the dimensions of the main zone /// /// The full image coming from the F1TV Data Channel /// The dimensions of the zone where all the drivers data are situated public ConfigurationTool ( Bitmap fullImage , Rectangle mainZoneDimensions ) { MainZone = new Zone ( fullImage , mainZoneDimensions , \"Main\" ); AutoCalibrate (); } /// /// Resets the main zone /// public void ResetMainZone () { MainZone . ResetZones (); } /// /// Reset the windows /// public void ResetWindows () { MainZone . ResetWindows (); } /// /// Save the current config in a JSON file stored in /Presets/ /// /// A list of all the drivers in the GP. IMPORTANT, they need to ALL be mentionned or the program wont be able to detect the missing ones and will F up everything /// The name the config should have public void SaveToJson ( List < string > drivers , string configName ) { string JSON = \"\" ; JsonObject jsonFileObject = new JsonObject (); //Creates the mainZone object JsonObject mainZoneObject = new JsonObject (); mainZoneObject . Add ( \"x\" , MainZone . Bounds . X ); mainZoneObject . Add ( \"y\" , MainZone . Bounds . Y ); mainZoneObject . Add ( \"width\" , MainZone . Bounds . Width ); mainZoneObject . Add ( \"height\" , MainZone . Bounds . Height ); JsonArray driverZonesArray = new JsonArray (); //Creates all the subzones that contain driver infos int DriverID = 0 ; foreach ( Zone driverZone in MainZone . Zones ) { DriverID ++; JsonObject driverZoneObject = new JsonObject (); driverZoneObject . Add ( \"name\" , \"Driver\" + DriverID ); driverZoneObject . Add ( \"x\" , driverZone . Bounds . X ); driverZoneObject . Add ( \"y\" , driverZone . Bounds . Y ); driverZoneObject . Add ( \"width\" , driverZone . Bounds . Width ); driverZoneObject . Add ( \"height\" , driverZone . Bounds . Height ); JsonArray windowsArray = new JsonArray (); JsonObject windowObject = new JsonObject (); //Creates all the windows of the current driver zone //Note : We store ALL the windows and zones in the JSON because they are not spaced exactly the same on the main zone foreach ( Window window in driverZone . Windows ) { windowObject . Add ( window . Name , new JsonObject { { \"x\" , window . Bounds . X }, { \"y\" , window . Bounds . Y }, { \"width\" , window . Bounds . Width }, { \"height\" , window . Bounds . Height } }); } windowsArray . Add ( windowObject ); driverZoneObject . Add ( \"Windows\" , windowsArray ); driverZonesArray . Add ( driverZoneObject ); } mainZoneObject . Add ( \"DriverZones\" , driverZonesArray ); JsonArray driversArray = new JsonArray (); foreach ( string driver in drivers ) { driversArray . Add ( driver ); } mainZoneObject . Add ( \"Drivers\" , driversArray ); jsonFileObject . Add ( \"Main\" , mainZoneObject ); JSON = jsonFileObject . ToString (); //Saving the file string path = CONFIGS_FOLDER_NAME + configName ; if ( File . Exists ( path + \".json\" )) { //We need to create a new name int count = 2 ; while ( File . Exists ( path + \"_\" + count + \".json\" )) { count ++; } path += \"_\" + count + \".json\" ; } else { path += \".json\" ; } File . WriteAllText ( path , JSON ); } /// /// Adds a window in the windows list /// Be carefull of the order. It cant be random or it will crash. The programm expect the first to be position, second Gap to leader etc... /// /// The bounds of the window public void AddWindows ( List < Rectangle > rectangles ) { foreach ( Zone driverZone in MainZone . Zones ) { Bitmap zoneImage = driverZone . ZoneImage ; for ( int i = 1 ; i <= rectangles . Count ; i ++) { switch ( i ) { case 1 : //First zone should be the driver's Position driverZone . AddWindow ( new DriverPositionWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 2 : //Second zone should be the Gap to leader driverZone . AddWindow ( new DriverGapToLeaderWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 3 : //Third zone should be the driver's Lap Time driverZone . AddWindow ( new DriverLapTimeWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 4 : //Fourth zone should be the driver's DRS status driverZone . AddWindow ( new DriverDrsWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 5 : //Fifth zone should be the driver's Tyre's informations driverZone . AddWindow ( new DriverTyresWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 6 : //Sixth zone should be the driver's Name driverZone . AddWindow ( new DriverNameWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], false )); break ; case 7 : //Seventh zone should be the driver's First Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 1 , false )); break ; case 8 : //Zone number eight should be the driver's Second Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 2 , false )); break ; case 9 : //Zone number nine should be the driver's Position Sector driverZone . AddWindow ( new DriverSectorWindow ( driverZone . ZoneImage , rectangles [ i - 1 ], 3 , false )); break ; } } } } /// /// This will automatically create all the driver zones at the correct places if the main zone has been weel positionned /// You cant just divide the image by the number of pilots or it will be messy and inconsistent at the end (Garbage in Garbage Out) /// public void AutoCalibrate () { List < Rectangle > detectedText = new List < Rectangle >(); List < Zone > zones = new List < Zone >(); TesseractEngine engine = new TesseractEngine ( Window . TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Image image = MainZone . ZoneImage ; var tessImage = Pix . LoadFromMemory ( Window . ImageToByte ( image )); Page page = engine . Process ( tessImage ); //Runs a quick OCR detection. Not to detect any content but just to detect where is all the text positionned. //For each row it decides the best Zone location and adds it to the Driver zone list using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { //We remove all the rectangles that are definitely too big if ( boundingBox . Height < image . Height / NUMBER_OF_DRIVERS ) { //Now we add a filter to only get the boxes in the right because they are much more reliable in size if ( boundingBox . X1 > image . Width / 2 ) { //Now we check if an other square box has been found roughly in the same y axis bool match = false ; //The tolerance is roughly half the size that a window will be int tolerance = ( image . Height / NUMBER_OF_DRIVERS ) / 2 ; foreach ( Rectangle rect in detectedText ) { if ( rect . Y > boundingBox . Y1 - tolerance && rect . Y < boundingBox . Y1 + tolerance ) { //There already is a rectangle in this line match = true ; } } //if nothing matched we can add it if (! match ) detectedText . Add ( new Rectangle ( boundingBox . X1 , boundingBox . Y1 , boundingBox . Width , boundingBox . Height )); } } } } while ( iter . Next ( PageIteratorLevel . Word )); } //DEBUG int i = 1 ; foreach ( Rectangle Rectangle in detectedText ) { Rectangle windowRectangle ; Size windowSize = new Size ( image . Width , image . Height / NUMBER_OF_DRIVERS ); Point windowLocation = new Point ( 0 , ( Rectangle . Y + Rectangle . Height / 2 ) - windowSize . Height / 2 ); windowRectangle = new Rectangle ( windowLocation , windowSize ); //We add the driver zones Zone driverZone = new Zone ( MainZone . ZoneImage , windowRectangle , \"DriverZone\" ); MainZone . AddZone ( driverZone ); //driverZone.ZoneImage.Save(\"Driver\" + i+\".png\"); i ++; } } } }","title":"ConfigurationTool.cs"},{"location":"Code/DriverData.html","text":"DriverData.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverData.cs /// Brief : File containing classes that behave just like structures to store data about drivers /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class DriverData { public bool DRS ; //True = Drs is opened public int GapToLeader ; //In ms public int LapTime ; //In ms public string Name ; //Ex: LECLERC public int Position ; //Ex: 1 public int Sector1 ; //in ms public int Sector2 ; //in ms public int Sector3 ; //in ms public Tyre CurrentTyre ; //Ex Soft 11 laps public DriverData ( bool dRS , int gapToLeader , int lapTime , string name , int position , int sector1 , int sector2 , int sector3 , Tyre tyre ) { DRS = dRS ; GapToLeader = gapToLeader ; LapTime = lapTime ; Name = name ; Position = position ; Sector1 = sector1 ; Sector2 = sector2 ; Sector3 = sector3 ; CurrentTyre = tyre ; } /// /// Creates a default driver data with empty values /// public DriverData () { DRS = false ; GapToLeader = - 1 ; LapTime = - 1 ; Name = \"Unknown\" ; Position = - 1 ; Sector1 = - 1 ; Sector2 = - 1 ; Sector3 = - 1 ; CurrentTyre = new Tyre ( Tyre . Type . Undefined , - 1 ); } /// /// Method that displays all the data found in a string /// /// string containing all the driver datas public override string ToString () { string result = \"\" ; //Position result += \"Position : \" + Position + Environment . NewLine ; //Gap result += \"GapToLeader : \" + Reader . ConvertMsToTime ( GapToLeader ) + Environment . NewLine ; //LapTime result += \"LapTime : \" + Reader . ConvertMsToTime ( LapTime ) + Environment . NewLine ; //DRS result += \"DRS : \" + DRS + Environment . NewLine ; //Tyres result += \"Uses \" + CurrentTyre . Coumpound + \" tyre \" + CurrentTyre . NumberOfLaps + \" laps old\" + Environment . NewLine ; //Name result += \"DriverName : \" + Name + Environment . NewLine ; //Sector 1 result += \"Sector1 : \" + Reader . ConvertMsToTime ( Sector1 ) + Environment . NewLine ; //Sector 1 result += \"Sector2 : \" + Reader . ConvertMsToTime ( Sector2 ) + Environment . NewLine ; //Sector 1 result += \"Sector3 : \" + Reader . ConvertMsToTime ( Sector3 ) + Environment . NewLine ; return result ; } } //Structure to store tyres infos public struct Tyre { //If new tyres were to be added you will have to need to change this enum public enum Type { Soft , Medium , Hard , Inter , Wet , Undefined } public Type Coumpound ; public int NumberOfLaps ; public Tyre ( Type type , int laps ) { Coumpound = type ; NumberOfLaps = laps ; } } }","title":"DriverData.cs"},{"location":"Code/DriverData.html#driverdatacs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverData.cs /// Brief : File containing classes that behave just like structures to store data about drivers /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class DriverData { public bool DRS ; //True = Drs is opened public int GapToLeader ; //In ms public int LapTime ; //In ms public string Name ; //Ex: LECLERC public int Position ; //Ex: 1 public int Sector1 ; //in ms public int Sector2 ; //in ms public int Sector3 ; //in ms public Tyre CurrentTyre ; //Ex Soft 11 laps public DriverData ( bool dRS , int gapToLeader , int lapTime , string name , int position , int sector1 , int sector2 , int sector3 , Tyre tyre ) { DRS = dRS ; GapToLeader = gapToLeader ; LapTime = lapTime ; Name = name ; Position = position ; Sector1 = sector1 ; Sector2 = sector2 ; Sector3 = sector3 ; CurrentTyre = tyre ; } /// /// Creates a default driver data with empty values /// public DriverData () { DRS = false ; GapToLeader = - 1 ; LapTime = - 1 ; Name = \"Unknown\" ; Position = - 1 ; Sector1 = - 1 ; Sector2 = - 1 ; Sector3 = - 1 ; CurrentTyre = new Tyre ( Tyre . Type . Undefined , - 1 ); } /// /// Method that displays all the data found in a string /// /// string containing all the driver datas public override string ToString () { string result = \"\" ; //Position result += \"Position : \" + Position + Environment . NewLine ; //Gap result += \"GapToLeader : \" + Reader . ConvertMsToTime ( GapToLeader ) + Environment . NewLine ; //LapTime result += \"LapTime : \" + Reader . ConvertMsToTime ( LapTime ) + Environment . NewLine ; //DRS result += \"DRS : \" + DRS + Environment . NewLine ; //Tyres result += \"Uses \" + CurrentTyre . Coumpound + \" tyre \" + CurrentTyre . NumberOfLaps + \" laps old\" + Environment . NewLine ; //Name result += \"DriverName : \" + Name + Environment . NewLine ; //Sector 1 result += \"Sector1 : \" + Reader . ConvertMsToTime ( Sector1 ) + Environment . NewLine ; //Sector 1 result += \"Sector2 : \" + Reader . ConvertMsToTime ( Sector2 ) + Environment . NewLine ; //Sector 1 result += \"Sector3 : \" + Reader . ConvertMsToTime ( Sector3 ) + Environment . NewLine ; return result ; } } //Structure to store tyres infos public struct Tyre { //If new tyres were to be added you will have to need to change this enum public enum Type { Soft , Medium , Hard , Inter , Wet , Undefined } public Type Coumpound ; public int NumberOfLaps ; public Tyre ( Type type , int laps ) { Coumpound = type ; NumberOfLaps = laps ; } } }","title":"DriverData.cs"},{"location":"Code/DriverGapToLeaderWindow.html","text":"DriverGapToLeaderWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverGapToLeaderWindow.cs /// Brief : Window containing infos about the gap to the leader of a driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class DriverGapToLeaderWindow : Window { public DriverGapToLeaderWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"GapToLeader\" ; } /// /// Decodes the gap to leader using Tesseract OCR /// /// Returns the gap to the leader in miliseconds (int) public override object DecodePng () { int result = GetTimeFromPng ( WindowImage , OcrImage . WindowType . Gap , Engine ); return result ; } } }","title":"DriverGapToLeaderWindow.cs"},{"location":"Code/DriverGapToLeaderWindow.html#drivergaptoleaderwindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverGapToLeaderWindow.cs /// Brief : Window containing infos about the gap to the leader of a driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class DriverGapToLeaderWindow : Window { public DriverGapToLeaderWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"GapToLeader\" ; } /// /// Decodes the gap to leader using Tesseract OCR /// /// Returns the gap to the leader in miliseconds (int) public override object DecodePng () { int result = GetTimeFromPng ( WindowImage , OcrImage . WindowType . Gap , Engine ); return result ; } } }","title":"DriverGapToLeaderWindow.cs"},{"location":"Code/DriverNameWindow.html","text":"DriverNameWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverNameWindow /// Brief : Window containing infos about the name of the driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverNameWindow : Window { public DriverNameWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Name\" ; } /// /// Decodes using OCR wich driver name is in the image /// /// A list of all the names that can be on the image /// a string representing the found driver name. It will be one of the ones given in the list public override object DecodePng ( List < string > DriverList ) { string result = \"\" ; result = GetStringFromPng ( WindowImage , Engine ); if (! IsADriver ( DriverList , result )) { //I put everything in uppercase to try to lower the chances of bad answers result = FindClosestMatch ( DriverList . ConvertAll ( d => d . ToUpper ()), result . ToUpper ()); } return result ; } /// /// Verifies that the name found in the OCR is a valid name /// /// The list of all the drivers name that can be found in the image /// The driver you want to be sure if it exists or not /// If ye or no the driver exists private static bool IsADriver ( List < string > driverList , string potentialDriver ) { bool result = false ; //I cant use drivers.Contains because it has missmatched cases and all foreach ( string name in driverList ) { if ( name . ToUpper () == potentialDriver . ToUpper ()) result = true ; } return result ; } } }","title":"DriverNameWindow.cs"},{"location":"Code/DriverNameWindow.html#drivernamewindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverNameWindow /// Brief : Window containing infos about the name of the driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverNameWindow : Window { public DriverNameWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Name\" ; } /// /// Decodes using OCR wich driver name is in the image /// /// A list of all the names that can be on the image /// a string representing the found driver name. It will be one of the ones given in the list public override object DecodePng ( List < string > DriverList ) { string result = \"\" ; result = GetStringFromPng ( WindowImage , Engine ); if (! IsADriver ( DriverList , result )) { //I put everything in uppercase to try to lower the chances of bad answers result = FindClosestMatch ( DriverList . ConvertAll ( d => d . ToUpper ()), result . ToUpper ()); } return result ; } /// /// Verifies that the name found in the OCR is a valid name /// /// The list of all the drivers name that can be found in the image /// The driver you want to be sure if it exists or not /// If ye or no the driver exists private static bool IsADriver ( List < string > driverList , string potentialDriver ) { bool result = false ; //I cant use drivers.Contains because it has missmatched cases and all foreach ( string name in driverList ) { if ( name . ToUpper () == potentialDriver . ToUpper ()) result = true ; } return result ; } } }","title":"DriverNameWindow.cs"},{"location":"Code/DriverSectorWindow.html","text":"DriverSectorWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverSectorWindow.cs /// Brief : Window containing infos about a driver sector time. Can be the first second or third, does not matter. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverSectorWindow : Window { public DriverSectorWindow ( Bitmap image , Rectangle bounds , int sectorId , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Sector\" + sectorId ; } /// /// Decodes the sector /// /// the sector time in int (ms) public override object DecodePng () { int ocrResult = GetTimeFromPng ( WindowImage , OcrImage . WindowType . Sector , Engine ); return ocrResult ; } } }","title":"DriverSectorWindow.cs"},{"location":"Code/DriverSectorWindow.html#driversectorwindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverSectorWindow.cs /// Brief : Window containing infos about a driver sector time. Can be the first second or third, does not matter. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverSectorWindow : Window { public DriverSectorWindow ( Bitmap image , Rectangle bounds , int sectorId , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Sector\" + sectorId ; } /// /// Decodes the sector /// /// the sector time in int (ms) public override object DecodePng () { int ocrResult = GetTimeFromPng ( WindowImage , OcrImage . WindowType . Sector , Engine ); return ocrResult ; } } }","title":"DriverSectorWindow.cs"},{"location":"Code/F1TVEmulator.html","text":"F1TVEmulator.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : F1TVEmulator.cs /// Brief : Class that contains methods to emulate a browser and navigate the F1TV website /// Version : Alpha 1.0 using OpenQA.Selenium ; using OpenQA.Selenium.Firefox ; using OpenQA.Selenium.Interactions ; using OpenQA.Selenium.Support.UI ; using System ; using System.Collections.Generic ; using System.Diagnostics ; using System.Drawing ; using System.IO ; using System.Linq ; using System.Text ; using System.Threading ; using System.Threading.Tasks ; namespace TrackTrends { internal class F1TVEmulator { public const string COOKIE_HOST = \".formula1.com\" ; public const string PYTHON_COOKIE_RETRIEVAL_FILENAME = \"recoverCookiesCSV.py\" ; public const string GECKODRIVER_FILENAME = @\"geckodriver-v0.27.0-win64\\geckodriver.exe\" ; //BE CAREFULL IF YOU CHANGE IT HERE YOU NEED TO CHANGE IT IN THE PYTHON SCRIPT TOO public const string COOKIES_CSV_FILENAME = \"cookies.csv\" ; private FirefoxDriver Driver ; private bool _ready ; private string _grandPrixUrl ; public string GrandPrixUrl { get => _grandPrixUrl ; private set => _grandPrixUrl = value ; } public bool Ready { get => _ready ; set => _ready = value ; } public F1TVEmulator ( string grandPrixUrl ) { GrandPrixUrl = grandPrixUrl ; Ready = false ; } /// /// Will start the python programm that runs the Cookie Recovering /// private void StartCookieRecovering () { string scriptPath = PYTHON_COOKIE_RETRIEVAL_FILENAME ; Process process = new Process (); process . StartInfo . FileName = \"python.exe\" ; process . StartInfo . Arguments = scriptPath ; process . StartInfo . UseShellExecute = false ; process . StartInfo . RedirectStandardOutput = true ; process . Start (); string output = process . StandardOutput . ReadToEnd (); process . WaitForExit (); } /// /// Method that will recover the needed cookies in the DB /// /// The host of the wanted cookie ex: ./formula1.com /// The name of the wanted cookie ex: login /// returns the value of the cookie if it has been found /// public string GetCookie ( string host , string name ) { StartCookieRecovering (); string value = \"\" ; List < Cookie > cookies = new List < Cookie >(); if ( File . Exists ( COOKIES_CSV_FILENAME )) { using ( var reader = new StreamReader ( COOKIES_CSV_FILENAME )) { // Read the header row and validate column order string header = reader . ReadLine (); string [] expectedColumns = { \"host_key\" , \"name\" , \"value\" , \"path\" , \"expires_utc\" , \"is_secure\" , \"is_httponly\" }; string [] actualColumns = header . Split ( ',' ); for ( int i = 0 ; i < expectedColumns . Length ; i ++) { if ( expectedColumns [ i ] != actualColumns [ i ]) { throw new InvalidOperationException ( $\"Expected column '{expectedColumns[i]}' at index {i} but found '{actualColumns[i]}'\" ); } } // Read each data row and parse values into a Cookie object while (! reader . EndOfStream ) { string line = reader . ReadLine (); string [] fields = line . Split ( ',' ); string hostname = fields [ 0 ]; string cookieName = fields [ 1 ]; if ( hostname == host && cookieName == name ) { value = fields [ 2 ]; } } } } return value ; } /// /// Starts the headless browser /// /// Error code 1xx public async Task < int > Start () { Ready = false ; string loginCookieName = \"login\" ; string loginSessionCookieName = \"login-session\" ; string loginCookieValue = GetCookie ( COOKIE_HOST , loginCookieName ); string loginSessionValue = GetCookie ( COOKIE_HOST , loginSessionCookieName ); //Cookie retreival has gone wrong (usually its because of python not being installed properly) if ( loginCookieValue == \"\" || loginSessionValue == \"\" ) return 100 ; var service = FirefoxDriverService . CreateDefaultService ( GECKODRIVER_FILENAME ); service . Host = \"127.0.0.1\" ; service . Port = 5555 ; FirefoxProfile profile = new FirefoxProfile (); FirefoxOptions options = new FirefoxOptions (); //profile.SetPreference(\"full-screen-api.ignore-widgets\", true); //profile.SetPreference(\"media.hardware-video-decoding.enabled\", true); //profile.SetPreference(\"full-screen-api.enabled\", true); options . Profile = profile ; profile . SetPreference ( \"layout.css.devPixelsPerPx\" , \"1.0\" ); options . AcceptInsecureCertificates = true ; options . AddArgument ( \"--headless\" ); //options.AddArgument(\"--start-maximized\"); //options.AddArgument(\"--window-size=1920x1080\"); //options.AddArgument(\"--width=\" + windowWidth); //options.AddArgument(\"--height=\" + windowHeight); //options.AddArgument(\"-window-size=1920x1080\"); //options.AddArgument(\"--width=1920\"); //options.AddArgument(\"--height=1080\"); //profile try { Driver = new FirefoxDriver ( service , options ); } catch { Ready = false ; return 101 ; } Actions actions = new Actions ( Driver ); var loginCookie = new Cookie ( loginCookieName , loginCookieValue , COOKIE_HOST , \"/\" , DateTime . Now . AddDays ( 5 )); var loginSessionCookie = new Cookie ( loginSessionCookieName , loginSessionValue , COOKIE_HOST , \"/\" , DateTime . Now . AddDays ( 5 )); Driver . Navigate (). GoToUrl ( \"https://f1tv.formula1.com/\" ); Driver . Manage (). Cookies . AddCookie ( loginCookie ); Driver . Manage (). Cookies . AddCookie ( loginSessionCookie ); try { Driver . Navigate (). GoToUrl ( GrandPrixUrl ); } catch { //The url is not a valid url Driver . Dispose (); return 103 ; } //Waits for the page to fully load Driver . Manage (). Timeouts (). PageLoad = TimeSpan . FromSeconds ( 30 ); //Removes the cookie prompt try { IWebElement conscentButton = Driver . FindElement ( By . Id ( \"truste-consent-button\" )); conscentButton . Click (); } catch { //Could not locate the cookie button Screenshot ( \"ERROR104\" ); Driver . Dispose (); return 104 ; } //Again waits for the page to fully load (when you accept cookies it takes a little time for the page to load) //Cannot use The timeout because the feed loading is not really loading so there is not event or anything Thread . Sleep ( 5000 ); //Switches to the Data channel try { IWebElement dataChannelButton = Driver . FindElement ( By . ClassName ( \"data-button\" )); dataChannelButton . Click (); } catch { //If the data button does not exists its because the user is not connected Screenshot ( \"ERROR102\" ); Driver . Dispose (); return 102 ; } //Open settings // Press the space key, this should make the setting button visible // It does not matter if the feed is paused because when changing channel it autoplays actions . SendKeys ( OpenQA . Selenium . Keys . Space ). Perform (); //Clicks on the settings Icon int settingsClickTries = 0 ; bool settingsClickSuccess = false ; while ( settingsClickTries < 100 && ! settingsClickSuccess ) { Thread . Sleep ( 100 ); try { IWebElement settingsButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-settingstogglebutton\" )); settingsButton . Click (); IWebElement selectElement = Driver . FindElement ( By . ClassName ( \"bmpui-ui-videoqualityselectbox\" )); SelectElement select = new SelectElement ( selectElement ); IWebElement selectOption = selectElement . FindElement ( By . CssSelector ( \"option[value^='1080_']\" )); selectOption . Click (); settingsClickSuccess = true ; } catch { //Sometimes it can crash because it could not get the options to show up in time. When it happens just retry settingsClickSuccess = false ; settingsClickTries ++; } } if (! settingsClickSuccess ) { Screenshot ( \"ERROR105\" ); Driver . Dispose (); return 105 ; } Screenshot ( \"BEFOREFULLSCREEN\" ); //Makes the feed fullscreen int fullScreenClickTries = 0 ; bool fullScreenClickSuccess = false ; Driver . Manage (). Window . Maximize (); //WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10)); while ( fullScreenClickTries < 100 && ! fullScreenClickSuccess ) { Thread . Sleep ( 150 ); try { IWebElement fullScreenButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-fullscreentogglebutton\" )); fullScreenButton . Click (); fullScreenClickSuccess = true ; } catch { fullScreenClickSuccess = false ; fullScreenClickTries ++; } } if (! fullScreenClickSuccess ) { Screenshot ( \"ERROR106\" ); Driver . Dispose (); return 106 ; } Screenshot ( \"AFTERFULLSCREEN\" ); //STARTUP FINISHED READY TO SCREENSHOT Ready = true ; return 0 ; } /// /// Takes a screenshot of what the headless browser is displaying /// /// Optional ! The name of the picture so it can be saved /// Returns the screenshot in the bitmap format public Bitmap Screenshot ( string name = \"TEST\" ) { Bitmap result = new Bitmap ( 4242 , 6969 ); try { //Screenshot scrsht = ((ITakesScreenshot)Driver).GetScreenshot(); //profileriver.SetPreferencC:\\Users\\Moi\\source\\repos\\Test_Merge\\README.mde(\"layout.css.devPixelsPerPx\", \"1.0\"); //Screenshot scrsht = Driver.GetFullPageScreenshot(); Screenshot scrsht = Driver . GetScreenshot (); byte [] screenshotBytes = Convert . FromBase64String ( scrsht . AsBase64EncodedString ); MemoryStream stream = new MemoryStream ( screenshotBytes ); result = new Bitmap ( stream ); //result.Save(name + \".png\"); scrsht . SaveAsFile ( name + \".png\" ); } catch { //Nothing for now } return result ; } /// /// Stops the Emulation. Note: if you plan to start it again please use ResetDriver() instead /// public void Stop () { Ready = false ; if ( Driver != null ) Driver . Dispose (); } /// /// Resets the emulation /// public void ResetDriver () { Ready = false ; if ( Driver != null ) Driver . Dispose (); Driver = null ; } } }","title":"F1TVEmulator.cs"},{"location":"Code/F1TVEmulator.html#f1tvemulatorcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : F1TVEmulator.cs /// Brief : Class that contains methods to emulate a browser and navigate the F1TV website /// Version : Alpha 1.0 using OpenQA.Selenium ; using OpenQA.Selenium.Firefox ; using OpenQA.Selenium.Interactions ; using OpenQA.Selenium.Support.UI ; using System ; using System.Collections.Generic ; using System.Diagnostics ; using System.Drawing ; using System.IO ; using System.Linq ; using System.Text ; using System.Threading ; using System.Threading.Tasks ; namespace TrackTrends { internal class F1TVEmulator { public const string COOKIE_HOST = \".formula1.com\" ; public const string PYTHON_COOKIE_RETRIEVAL_FILENAME = \"recoverCookiesCSV.py\" ; public const string GECKODRIVER_FILENAME = @\"geckodriver-v0.27.0-win64\\geckodriver.exe\" ; //BE CAREFULL IF YOU CHANGE IT HERE YOU NEED TO CHANGE IT IN THE PYTHON SCRIPT TOO public const string COOKIES_CSV_FILENAME = \"cookies.csv\" ; private FirefoxDriver Driver ; private bool _ready ; private string _grandPrixUrl ; public string GrandPrixUrl { get => _grandPrixUrl ; private set => _grandPrixUrl = value ; } public bool Ready { get => _ready ; set => _ready = value ; } public F1TVEmulator ( string grandPrixUrl ) { GrandPrixUrl = grandPrixUrl ; Ready = false ; } /// /// Will start the python programm that runs the Cookie Recovering /// private void StartCookieRecovering () { string scriptPath = PYTHON_COOKIE_RETRIEVAL_FILENAME ; Process process = new Process (); process . StartInfo . FileName = \"python.exe\" ; process . StartInfo . Arguments = scriptPath ; process . StartInfo . UseShellExecute = false ; process . StartInfo . RedirectStandardOutput = true ; process . Start (); string output = process . StandardOutput . ReadToEnd (); process . WaitForExit (); } /// /// Method that will recover the needed cookies in the DB /// /// The host of the wanted cookie ex: ./formula1.com /// The name of the wanted cookie ex: login /// returns the value of the cookie if it has been found /// public string GetCookie ( string host , string name ) { StartCookieRecovering (); string value = \"\" ; List < Cookie > cookies = new List < Cookie >(); if ( File . Exists ( COOKIES_CSV_FILENAME )) { using ( var reader = new StreamReader ( COOKIES_CSV_FILENAME )) { // Read the header row and validate column order string header = reader . ReadLine (); string [] expectedColumns = { \"host_key\" , \"name\" , \"value\" , \"path\" , \"expires_utc\" , \"is_secure\" , \"is_httponly\" }; string [] actualColumns = header . Split ( ',' ); for ( int i = 0 ; i < expectedColumns . Length ; i ++) { if ( expectedColumns [ i ] != actualColumns [ i ]) { throw new InvalidOperationException ( $\"Expected column '{expectedColumns[i]}' at index {i} but found '{actualColumns[i]}'\" ); } } // Read each data row and parse values into a Cookie object while (! reader . EndOfStream ) { string line = reader . ReadLine (); string [] fields = line . Split ( ',' ); string hostname = fields [ 0 ]; string cookieName = fields [ 1 ]; if ( hostname == host && cookieName == name ) { value = fields [ 2 ]; } } } } return value ; } /// /// Starts the headless browser /// /// Error code 1xx public async Task < int > Start () { Ready = false ; string loginCookieName = \"login\" ; string loginSessionCookieName = \"login-session\" ; string loginCookieValue = GetCookie ( COOKIE_HOST , loginCookieName ); string loginSessionValue = GetCookie ( COOKIE_HOST , loginSessionCookieName ); //Cookie retreival has gone wrong (usually its because of python not being installed properly) if ( loginCookieValue == \"\" || loginSessionValue == \"\" ) return 100 ; var service = FirefoxDriverService . CreateDefaultService ( GECKODRIVER_FILENAME ); service . Host = \"127.0.0.1\" ; service . Port = 5555 ; FirefoxProfile profile = new FirefoxProfile (); FirefoxOptions options = new FirefoxOptions (); //profile.SetPreference(\"full-screen-api.ignore-widgets\", true); //profile.SetPreference(\"media.hardware-video-decoding.enabled\", true); //profile.SetPreference(\"full-screen-api.enabled\", true); options . Profile = profile ; profile . SetPreference ( \"layout.css.devPixelsPerPx\" , \"1.0\" ); options . AcceptInsecureCertificates = true ; options . AddArgument ( \"--headless\" ); //options.AddArgument(\"--start-maximized\"); //options.AddArgument(\"--window-size=1920x1080\"); //options.AddArgument(\"--width=\" + windowWidth); //options.AddArgument(\"--height=\" + windowHeight); //options.AddArgument(\"-window-size=1920x1080\"); //options.AddArgument(\"--width=1920\"); //options.AddArgument(\"--height=1080\"); //profile try { Driver = new FirefoxDriver ( service , options ); } catch { Ready = false ; return 101 ; } Actions actions = new Actions ( Driver ); var loginCookie = new Cookie ( loginCookieName , loginCookieValue , COOKIE_HOST , \"/\" , DateTime . Now . AddDays ( 5 )); var loginSessionCookie = new Cookie ( loginSessionCookieName , loginSessionValue , COOKIE_HOST , \"/\" , DateTime . Now . AddDays ( 5 )); Driver . Navigate (). GoToUrl ( \"https://f1tv.formula1.com/\" ); Driver . Manage (). Cookies . AddCookie ( loginCookie ); Driver . Manage (). Cookies . AddCookie ( loginSessionCookie ); try { Driver . Navigate (). GoToUrl ( GrandPrixUrl ); } catch { //The url is not a valid url Driver . Dispose (); return 103 ; } //Waits for the page to fully load Driver . Manage (). Timeouts (). PageLoad = TimeSpan . FromSeconds ( 30 ); //Removes the cookie prompt try { IWebElement conscentButton = Driver . FindElement ( By . Id ( \"truste-consent-button\" )); conscentButton . Click (); } catch { //Could not locate the cookie button Screenshot ( \"ERROR104\" ); Driver . Dispose (); return 104 ; } //Again waits for the page to fully load (when you accept cookies it takes a little time for the page to load) //Cannot use The timeout because the feed loading is not really loading so there is not event or anything Thread . Sleep ( 5000 ); //Switches to the Data channel try { IWebElement dataChannelButton = Driver . FindElement ( By . ClassName ( \"data-button\" )); dataChannelButton . Click (); } catch { //If the data button does not exists its because the user is not connected Screenshot ( \"ERROR102\" ); Driver . Dispose (); return 102 ; } //Open settings // Press the space key, this should make the setting button visible // It does not matter if the feed is paused because when changing channel it autoplays actions . SendKeys ( OpenQA . Selenium . Keys . Space ). Perform (); //Clicks on the settings Icon int settingsClickTries = 0 ; bool settingsClickSuccess = false ; while ( settingsClickTries < 100 && ! settingsClickSuccess ) { Thread . Sleep ( 100 ); try { IWebElement settingsButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-settingstogglebutton\" )); settingsButton . Click (); IWebElement selectElement = Driver . FindElement ( By . ClassName ( \"bmpui-ui-videoqualityselectbox\" )); SelectElement select = new SelectElement ( selectElement ); IWebElement selectOption = selectElement . FindElement ( By . CssSelector ( \"option[value^='1080_']\" )); selectOption . Click (); settingsClickSuccess = true ; } catch { //Sometimes it can crash because it could not get the options to show up in time. When it happens just retry settingsClickSuccess = false ; settingsClickTries ++; } } if (! settingsClickSuccess ) { Screenshot ( \"ERROR105\" ); Driver . Dispose (); return 105 ; } Screenshot ( \"BEFOREFULLSCREEN\" ); //Makes the feed fullscreen int fullScreenClickTries = 0 ; bool fullScreenClickSuccess = false ; Driver . Manage (). Window . Maximize (); //WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10)); while ( fullScreenClickTries < 100 && ! fullScreenClickSuccess ) { Thread . Sleep ( 150 ); try { IWebElement fullScreenButton = Driver . FindElement ( By . ClassName ( \"bmpui-ui-fullscreentogglebutton\" )); fullScreenButton . Click (); fullScreenClickSuccess = true ; } catch { fullScreenClickSuccess = false ; fullScreenClickTries ++; } } if (! fullScreenClickSuccess ) { Screenshot ( \"ERROR106\" ); Driver . Dispose (); return 106 ; } Screenshot ( \"AFTERFULLSCREEN\" ); //STARTUP FINISHED READY TO SCREENSHOT Ready = true ; return 0 ; } /// /// Takes a screenshot of what the headless browser is displaying /// /// Optional ! The name of the picture so it can be saved /// Returns the screenshot in the bitmap format public Bitmap Screenshot ( string name = \"TEST\" ) { Bitmap result = new Bitmap ( 4242 , 6969 ); try { //Screenshot scrsht = ((ITakesScreenshot)Driver).GetScreenshot(); //profileriver.SetPreferencC:\\Users\\Moi\\source\\repos\\Test_Merge\\README.mde(\"layout.css.devPixelsPerPx\", \"1.0\"); //Screenshot scrsht = Driver.GetFullPageScreenshot(); Screenshot scrsht = Driver . GetScreenshot (); byte [] screenshotBytes = Convert . FromBase64String ( scrsht . AsBase64EncodedString ); MemoryStream stream = new MemoryStream ( screenshotBytes ); result = new Bitmap ( stream ); //result.Save(name + \".png\"); scrsht . SaveAsFile ( name + \".png\" ); } catch { //Nothing for now } return result ; } /// /// Stops the Emulation. Note: if you plan to start it again please use ResetDriver() instead /// public void Stop () { Ready = false ; if ( Driver != null ) Driver . Dispose (); } /// /// Resets the emulation /// public void ResetDriver () { Ready = false ; if ( Driver != null ) Driver . Dispose (); Driver = null ; } } }","title":"F1TVEmulator.cs"},{"location":"Code/Form1.html","text":"Form1.cs using System ; using System.Collections.Generic ; using System.ComponentModel ; using System.Data ; using System.Diagnostics ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.IO ; namespace TrackTrends { public partial class Main : Form { //private Reader Reader = null; private F1TVEmulator Emulator = null ; private DataWrapper Wrapper = null ; private bool cancelRequested = false ; private SemaphoreSlim semaphore = new SemaphoreSlim ( 1 ); string ConfigFile = \"\" ; string GpUrl = \"\" ; //For the responsive content Size oldSize = new Size (); Size oldRankingSize = new Size (); Size oldLapTimesSize = new Size (); Size oldBattles = new Size (); Size oldPnlBattles = new Size (); Size oldPnlRankings = new Size (); Size oldPnlFastest = new Size (); Size oldPnlSlowest = new Size (); Point oldRankingPosition = new Point (); Point oldBattlePosition = new Point (); Point oldDriverInfoPosition = new Point (); Point olPnlFastestPosition = new Point (); Point oldPnlSlowestPosition = new Point (); public Main () { InitializeComponent (); } public async void RefreshUI () { if ( Directory . Exists ( ConfigurationTool . CONFIGS_FOLDER_NAME )) { lsbPresets . DataSource = null ; lsbPresets . DataSource = Directory . GetFiles ( ConfigurationTool . CONFIGS_FOLDER_NAME ); } } private async void btnSettings_Click ( object sender , EventArgs e ) { if ( Emulator != null ) Emulator . ResetDriver (); btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = false ; btnResetEmulator . Text = \"Launch\" ; Emulator = null ; Wrapper = null ; GC . Collect (); Settings settingsForm = new Settings (); settingsForm . ShowDialog (); RefreshUI (); //MessageBox.Show(settingsForm.GrandPrixUrl + Environment.NewLine + settingsForm.GrandPrixName + Environment.NewLine + settingsForm.GrandPrixYear); if ( settingsForm . GrandPrixUrl != \"\" && settingsForm . SelectedConfigFile != \"\" ) { GpUrl = settingsForm . GrandPrixUrl ; tbxGpUrl . Text = GpUrl ; if ( File . Exists ( settingsForm . SelectedConfigFile )) { ConfigFile = settingsForm . SelectedConfigFile ; for ( int i = 0 ; i < lsbPresets . Items . Count ; i ++) { if ( lsbPresets . Items [ i ]. ToString () == ConfigFile ) lsbPresets . SelectedIndex = i ; } } else { MessageBox . Show ( \"The config file has not been found please return to the config and change it\" ); } } else { //WE dont care anymore, the user will choose its Grand Prix himself in the main program //MessageBox.Show(\"There is no URL for the Grand Prix you want to decode. Please return to the config and add a valid one\"); } } private async void Form1_Load ( object sender , EventArgs e ) { //Those are the default values but they will need to be changed later when the configuration has been done ConfigFile = \"./Presets/Clean_4K_2023.json\" ; GpUrl = \"https://f1tv.formula1.com/detail/1000006688/2023-azerbaijan-grand-prix?action=play\" ; tbxGpUrl . Text = GpUrl ; oldSize = this . Size ; oldRankingSize = gpbxRanking . Size ; oldLapTimesSize = gpbxLapTimes . Size ; oldBattles = gpbxBattles . Size ; oldPnlRankings = pnlLiveRanking . Size ; oldPnlBattles = pnlBattles . Size ; oldPnlFastest = pnlFastest . Size ; oldPnlSlowest = pnlSlowest . Size ; oldRankingPosition = gpbxRanking . Location ; oldBattlePosition = gpbxBattles . Location ; oldDriverInfoPosition = gpbxDriverInfos . Location ; olPnlFastestPosition = pnlFastest . Location ; oldPnlSlowestPosition = pnlSlowest . Location ; tip1 . SetToolTip ( btnResetEmulator , \"Starts or restarts the emulator. You need to start this to use the app\" ); tip1 . SetToolTip ( btnSettings , \"Opens the configuration menu\" ); tip1 . SetToolTip ( tbxGpUrl , \"Insert the URL of the Grand Prix you want to track. Dont forget the \\\"?action=play\\\" at the end\" ); tip1 . SetToolTip ( lsbPresets , \"Select a configuration preset to use with the decoding\" ); tip1 . SetToolTip ( pbxResult , \"A preview of what the program sees. You should see the DATA page of the F1TV here\" ); tip1 . SetToolTip ( lsbOvertakes , \"A list of all the activity. You can scroll to see the most recent overtakes\" ); tip1 . SetToolTip ( gpbxBattles , \"The four first battles in the field. A battle is two drivers less than 3 seconds apart\" ); tip1 . SetToolTip ( gpbxLapTimes , \"The fastest and slowest drivers on track at the moment. It takes the average lapTime of the last 5 laps to choose who is the fastes or the slowest\" ); RefreshUI (); } private async void btnUpdate_Click ( object sender , EventArgs e ) { cancelRequested = false ; if ( Emulator != null && Wrapper != null ) { // Disable UI controls to prevent re-entrancy btnResetEmulator . Enabled = false ; btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = true ; btnSettings . Enabled = false ; while (! cancelRequested ) { await semaphore . WaitAsync (); try { // Start the time-consuming task on a separate thread await Task . Run ( async () => { Stopwatch sw = new Stopwatch (); sw . Start (); Bitmap screen = Emulator . Screenshot (); screen . Save ( \"HopefullyDataScreenshot.png\" ); Invoke (( MethodInvoker ) delegate { pbxResult . Image = ( Bitmap ) screen . Clone (); }); Wrapper . ChangeImage ( screen ); int errorCode = Wrapper . Refresh (); sw . Stop (); // Task completed Invoke (( MethodInvoker ) delegate { DisplayResults ( errorCode , sw , screen ); DisplayBattles (); DisplayDeltas (); DisplayOvertakes (); }); }); } finally { semaphore . Release (); } } // Re-enable UI controls btnStopUpdating . Text = \"Stop\" ; btnStartDecoding . Enabled = true ; btnStopUpdating . Enabled = false ; btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; } } private void DisplayOvertakes () { Wrapper . DisplayOvertakes ( lsbOvertakes ); } private void DisplayBattles () { Wrapper . DisplayBattles ( pnlBattles , this ); } private void DisplayDeltas () { Wrapper . DisplayTimesDeltas ( pnlFastest , pnlSlowest , this ); } private void Form1_FormClosing ( object sender , FormClosingEventArgs e ) { if ( Emulator != null ) { Emulator . Stop (); } } private void DisplayResults ( int errorCode , Stopwatch sw , Bitmap screen ) { if ( errorCode != 0 ) { cancelRequested = true ; MessageBox . Show ( \"An error has occured while trying to recover data from live feed. This can happen sometimes. I would advise you to restart a few times. If the problem persists check your configuration.\" ); } else { Wrapper . DisplayLiveRanking ( pnlLiveRanking , this ); } } private void btnStopUpdating_Click ( object sender , EventArgs e ) { // Set the cancellation flag cancelRequested = true ; btnStopUpdating . Enabled = false ; btnResetEmulator . Enabled = false ; btnStopUpdating . Text = \"Stopping\" ; } private async void button1_Click ( object sender , EventArgs e ) { lsbOvertakes . Items . Clear (); btnResetEmulator . Text = \"Launching\" ; btnResetEmulator . Enabled = false ; btnSettings . Enabled = true ; btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = false ; btnSettings . Enabled = false ; int errorCode = - 1 ; await Task . Run ( async () => { if ( Emulator != null ) Emulator . ResetDriver (); Emulator = null ; Wrapper = null ; GC . Collect (); Emulator = new F1TVEmulator ( GpUrl ); errorCode = await Emulator . Start (); }); if ( errorCode != 0 ) { string message = \"\" ; switch ( errorCode ) { case 100 : message = \"Error \" + errorCode + \" Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again\" ; break ; case 101 : message = \"Error \" + errorCode + \" Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again\" ; break ; case 102 : message = \"Error \" + errorCode + \" Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update\" ; break ; case 103 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 104 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 105 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; case 106 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; default : message = \"Could not start the emulator Error \" + errorCode ; break ; } MessageBox . Show ( message ); btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; btnResetEmulator . Text = \"Retry\" ; } else { Wrapper = new DataWrapper ( ConfigFile , Emulator . Screenshot ()); btnResetEmulator . Text = \"Re launch\" ; btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; btnStartDecoding . Enabled = true ; } } private void removeBorders ( object sender , PaintEventArgs e ) { GroupBox gpbx = ( GroupBox ) sender ; using ( Pen pen = new Pen ( gpbx . BackColor , 50 )) { e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); } using ( var brush = new SolidBrush ( gpbx . ForeColor )) { var textPosition = new Point ( 5 , 0 ); // Adjust the X and Y values as needed e . Graphics . DrawString ( gpbx . Text , gpbx . Font , brush , textPosition ); } } private void lsbPresets_SelectedIndexChanged ( object sender , EventArgs e ) { if ( lsbPresets . SelectedIndex >= 0 ) ConfigFile = lsbPresets . Items [ lsbPresets . SelectedIndex ]. ToString (); } private void textBox1_TextChanged ( object sender , EventArgs e ) { if ( tbxGpUrl . Text != \"\" ) GpUrl = tbxGpUrl . Text ; } public void btnDriver_Click ( object sender , EventArgs e ) { //Removes the cover if ( pnlCover . Visible = true ) pnlCover . Visible = false ; //Happens when a driver button has been clicked //MessageBox.Show((sender as Button).Name + \" has been selected\"); Button btn = ( sender as Button ); string [] parts = btn . Name . Split ( '_' ); DriverData driver = Wrapper . GetFullDriverData ( parts [ 0 ], pnlCurrentDriverLapsHistory , this ); lblCurrentDriverName . Text = driver . Name ; lblCurrentDriverPosition . Text = driver . Position . ToString (); lblCurrentDriverGapToLeader . Text = Reader . ConvertMsToTime ( driver . GapToLeader ); lblCurrentDriverLapTime . Text = Reader . ConvertMsToTime ( driver . LapTime ); lblCurrentDriverTyreAge . Text = driver . CurrentTyre . NumberOfLaps . ToString (); if ( driver . DRS ) { lblCurrentDriverDRS . Text = \"Open\" ; lblCurrentDriverDRS . ForeColor = Color . FromArgb ( 0 , 164 , 46 ); } else { lblCurrentDriverDRS . Text = \"Closed\" ; lblCurrentDriverDRS . ForeColor = Color . Black ; } switch ( driver . CurrentTyre . Coumpound ) { case Tyre . Type . Undefined : lblCurrentDriverTyreType . Text = \"uuuuh...\" ; lblCurrentDriverTyreType . ForeColor = Color . Violet ; break ; case Tyre . Type . Hard : lblCurrentDriverTyreType . Text = \"Hard\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 164 , 165 , 168 ); break ; case Tyre . Type . Medium : lblCurrentDriverTyreType . Text = \"Medium\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 245 , 191 , 0 ); break ; case Tyre . Type . Soft : lblCurrentDriverTyreType . Text = \"Soft\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 255 , 0 , 0 ); break ; case Tyre . Type . Inter : lblCurrentDriverTyreType . Text = \"Intermediate\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 0 , 164 , 46 ); break ; case Tyre . Type . Wet : lblCurrentDriverTyreType . Text = \"Wet\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 39 , 96 , 166 ); break ; } } public void btnLapTime_Click ( object sender , EventArgs e ) { //Happens when a lapTime has been clicked Button btn = sender as Button ; string [] parts = btn . Name . Split ( '_' ); Wrapper . DisplayLapTimeInfos ( parts [ 0 ], Convert . ToInt32 ( parts [ 1 ]), btn . Text ); } private void Main_Resize ( object sender , EventArgs e ) { int xDiff = this . Width - oldSize . Width ; int yDiff = this . Height - oldSize . Height ; int padding = 10 ; //This will take half the newly created space gpbxRanking . Size = new Size ( oldRankingSize . Width + xDiff / 2 , oldRankingSize . Height + yDiff ); gpbxRanking . Location = new Point ( oldRankingPosition . X + xDiff / 2 , gpbxRanking . Location . Y ); //Will take half the new height and half the new height gpbxLapTimes . Size = new Size ( oldLapTimesSize . Width + xDiff / 2 , oldLapTimesSize . Height + yDiff / 2 ); //Will take half the new height and half the new width gpbxBattles . Size = new Size ( oldBattles . Width + xDiff / 2 , oldBattles . Height + yDiff / 2 ); gpbxBattles . Location = new Point ( gpbxBattles . Location . X , oldBattlePosition . Y + yDiff / 2 ); //The infos wont change width but will need to be centerd Point startOfZone = new Point ( gpbxOvertakes . Width + gpbxOvertakes . Location . X , gpbxOvertakes . Location . Y ); Point endOfZone = new Point ( gpbxRanking . Location . X , gpbxOvertakes . Location . Y ); int totalWidth = endOfZone . X - startOfZone . X ; gpbxDriverInfos . Location = new Point ( startOfZone . X + ( totalWidth / 2 - gpbxDriverInfos . Width / 2 ), oldDriverInfoPosition . Y + yDiff ); //Now resizing internals pnlFastest . Size = new Size ( oldPnlFastest . Width + xDiff / 4 , oldPnlFastest . Height + yDiff / 4 ); pnlFastest . Location = new Point ( olPnlFastestPosition . X , olPnlFastestPosition . Y + yDiff / 4 ); pnlSlowest . Size = new Size ( oldPnlSlowest . Width + xDiff / 4 , oldPnlSlowest . Height + yDiff / 4 ); pnlSlowest . Location = new Point ( oldPnlSlowestPosition . X + xDiff / 4 , oldPnlSlowestPosition . Y + yDiff / 4 ); pnlBattles . Size = new Size ( oldPnlBattles . Width + xDiff / 2 , oldPnlBattles . Height + yDiff / 2 ); pnlLiveRanking . Size = new Size ( oldPnlRankings . Width + xDiff / 2 , oldPnlRankings . Height + yDiff ); } } }","title":"Form1.cs"},{"location":"Code/Form1.html#form1cs","text":"using System ; using System.Collections.Generic ; using System.ComponentModel ; using System.Data ; using System.Diagnostics ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.IO ; namespace TrackTrends { public partial class Main : Form { //private Reader Reader = null; private F1TVEmulator Emulator = null ; private DataWrapper Wrapper = null ; private bool cancelRequested = false ; private SemaphoreSlim semaphore = new SemaphoreSlim ( 1 ); string ConfigFile = \"\" ; string GpUrl = \"\" ; //For the responsive content Size oldSize = new Size (); Size oldRankingSize = new Size (); Size oldLapTimesSize = new Size (); Size oldBattles = new Size (); Size oldPnlBattles = new Size (); Size oldPnlRankings = new Size (); Size oldPnlFastest = new Size (); Size oldPnlSlowest = new Size (); Point oldRankingPosition = new Point (); Point oldBattlePosition = new Point (); Point oldDriverInfoPosition = new Point (); Point olPnlFastestPosition = new Point (); Point oldPnlSlowestPosition = new Point (); public Main () { InitializeComponent (); } public async void RefreshUI () { if ( Directory . Exists ( ConfigurationTool . CONFIGS_FOLDER_NAME )) { lsbPresets . DataSource = null ; lsbPresets . DataSource = Directory . GetFiles ( ConfigurationTool . CONFIGS_FOLDER_NAME ); } } private async void btnSettings_Click ( object sender , EventArgs e ) { if ( Emulator != null ) Emulator . ResetDriver (); btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = false ; btnResetEmulator . Text = \"Launch\" ; Emulator = null ; Wrapper = null ; GC . Collect (); Settings settingsForm = new Settings (); settingsForm . ShowDialog (); RefreshUI (); //MessageBox.Show(settingsForm.GrandPrixUrl + Environment.NewLine + settingsForm.GrandPrixName + Environment.NewLine + settingsForm.GrandPrixYear); if ( settingsForm . GrandPrixUrl != \"\" && settingsForm . SelectedConfigFile != \"\" ) { GpUrl = settingsForm . GrandPrixUrl ; tbxGpUrl . Text = GpUrl ; if ( File . Exists ( settingsForm . SelectedConfigFile )) { ConfigFile = settingsForm . SelectedConfigFile ; for ( int i = 0 ; i < lsbPresets . Items . Count ; i ++) { if ( lsbPresets . Items [ i ]. ToString () == ConfigFile ) lsbPresets . SelectedIndex = i ; } } else { MessageBox . Show ( \"The config file has not been found please return to the config and change it\" ); } } else { //WE dont care anymore, the user will choose its Grand Prix himself in the main program //MessageBox.Show(\"There is no URL for the Grand Prix you want to decode. Please return to the config and add a valid one\"); } } private async void Form1_Load ( object sender , EventArgs e ) { //Those are the default values but they will need to be changed later when the configuration has been done ConfigFile = \"./Presets/Clean_4K_2023.json\" ; GpUrl = \"https://f1tv.formula1.com/detail/1000006688/2023-azerbaijan-grand-prix?action=play\" ; tbxGpUrl . Text = GpUrl ; oldSize = this . Size ; oldRankingSize = gpbxRanking . Size ; oldLapTimesSize = gpbxLapTimes . Size ; oldBattles = gpbxBattles . Size ; oldPnlRankings = pnlLiveRanking . Size ; oldPnlBattles = pnlBattles . Size ; oldPnlFastest = pnlFastest . Size ; oldPnlSlowest = pnlSlowest . Size ; oldRankingPosition = gpbxRanking . Location ; oldBattlePosition = gpbxBattles . Location ; oldDriverInfoPosition = gpbxDriverInfos . Location ; olPnlFastestPosition = pnlFastest . Location ; oldPnlSlowestPosition = pnlSlowest . Location ; tip1 . SetToolTip ( btnResetEmulator , \"Starts or restarts the emulator. You need to start this to use the app\" ); tip1 . SetToolTip ( btnSettings , \"Opens the configuration menu\" ); tip1 . SetToolTip ( tbxGpUrl , \"Insert the URL of the Grand Prix you want to track. Dont forget the \\\"?action=play\\\" at the end\" ); tip1 . SetToolTip ( lsbPresets , \"Select a configuration preset to use with the decoding\" ); tip1 . SetToolTip ( pbxResult , \"A preview of what the program sees. You should see the DATA page of the F1TV here\" ); tip1 . SetToolTip ( lsbOvertakes , \"A list of all the activity. You can scroll to see the most recent overtakes\" ); tip1 . SetToolTip ( gpbxBattles , \"The four first battles in the field. A battle is two drivers less than 3 seconds apart\" ); tip1 . SetToolTip ( gpbxLapTimes , \"The fastest and slowest drivers on track at the moment. It takes the average lapTime of the last 5 laps to choose who is the fastes or the slowest\" ); RefreshUI (); } private async void btnUpdate_Click ( object sender , EventArgs e ) { cancelRequested = false ; if ( Emulator != null && Wrapper != null ) { // Disable UI controls to prevent re-entrancy btnResetEmulator . Enabled = false ; btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = true ; btnSettings . Enabled = false ; while (! cancelRequested ) { await semaphore . WaitAsync (); try { // Start the time-consuming task on a separate thread await Task . Run ( async () => { Stopwatch sw = new Stopwatch (); sw . Start (); Bitmap screen = Emulator . Screenshot (); screen . Save ( \"HopefullyDataScreenshot.png\" ); Invoke (( MethodInvoker ) delegate { pbxResult . Image = ( Bitmap ) screen . Clone (); }); Wrapper . ChangeImage ( screen ); int errorCode = Wrapper . Refresh (); sw . Stop (); // Task completed Invoke (( MethodInvoker ) delegate { DisplayResults ( errorCode , sw , screen ); DisplayBattles (); DisplayDeltas (); DisplayOvertakes (); }); }); } finally { semaphore . Release (); } } // Re-enable UI controls btnStopUpdating . Text = \"Stop\" ; btnStartDecoding . Enabled = true ; btnStopUpdating . Enabled = false ; btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; } } private void DisplayOvertakes () { Wrapper . DisplayOvertakes ( lsbOvertakes ); } private void DisplayBattles () { Wrapper . DisplayBattles ( pnlBattles , this ); } private void DisplayDeltas () { Wrapper . DisplayTimesDeltas ( pnlFastest , pnlSlowest , this ); } private void Form1_FormClosing ( object sender , FormClosingEventArgs e ) { if ( Emulator != null ) { Emulator . Stop (); } } private void DisplayResults ( int errorCode , Stopwatch sw , Bitmap screen ) { if ( errorCode != 0 ) { cancelRequested = true ; MessageBox . Show ( \"An error has occured while trying to recover data from live feed. This can happen sometimes. I would advise you to restart a few times. If the problem persists check your configuration.\" ); } else { Wrapper . DisplayLiveRanking ( pnlLiveRanking , this ); } } private void btnStopUpdating_Click ( object sender , EventArgs e ) { // Set the cancellation flag cancelRequested = true ; btnStopUpdating . Enabled = false ; btnResetEmulator . Enabled = false ; btnStopUpdating . Text = \"Stopping\" ; } private async void button1_Click ( object sender , EventArgs e ) { lsbOvertakes . Items . Clear (); btnResetEmulator . Text = \"Launching\" ; btnResetEmulator . Enabled = false ; btnSettings . Enabled = true ; btnStartDecoding . Enabled = false ; btnStopUpdating . Enabled = false ; btnSettings . Enabled = false ; int errorCode = - 1 ; await Task . Run ( async () => { if ( Emulator != null ) Emulator . ResetDriver (); Emulator = null ; Wrapper = null ; GC . Collect (); Emulator = new F1TVEmulator ( GpUrl ); errorCode = await Emulator . Start (); }); if ( errorCode != 0 ) { string message = \"\" ; switch ( errorCode ) { case 100 : message = \"Error \" + errorCode + \" Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again\" ; break ; case 101 : message = \"Error \" + errorCode + \" Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again\" ; break ; case 102 : message = \"Error \" + errorCode + \" Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update\" ; break ; case 103 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 104 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 105 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; case 106 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; default : message = \"Could not start the emulator Error \" + errorCode ; break ; } MessageBox . Show ( message ); btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; btnResetEmulator . Text = \"Retry\" ; } else { Wrapper = new DataWrapper ( ConfigFile , Emulator . Screenshot ()); btnResetEmulator . Text = \"Re launch\" ; btnResetEmulator . Enabled = true ; btnSettings . Enabled = true ; btnStartDecoding . Enabled = true ; } } private void removeBorders ( object sender , PaintEventArgs e ) { GroupBox gpbx = ( GroupBox ) sender ; using ( Pen pen = new Pen ( gpbx . BackColor , 50 )) { e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); } using ( var brush = new SolidBrush ( gpbx . ForeColor )) { var textPosition = new Point ( 5 , 0 ); // Adjust the X and Y values as needed e . Graphics . DrawString ( gpbx . Text , gpbx . Font , brush , textPosition ); } } private void lsbPresets_SelectedIndexChanged ( object sender , EventArgs e ) { if ( lsbPresets . SelectedIndex >= 0 ) ConfigFile = lsbPresets . Items [ lsbPresets . SelectedIndex ]. ToString (); } private void textBox1_TextChanged ( object sender , EventArgs e ) { if ( tbxGpUrl . Text != \"\" ) GpUrl = tbxGpUrl . Text ; } public void btnDriver_Click ( object sender , EventArgs e ) { //Removes the cover if ( pnlCover . Visible = true ) pnlCover . Visible = false ; //Happens when a driver button has been clicked //MessageBox.Show((sender as Button).Name + \" has been selected\"); Button btn = ( sender as Button ); string [] parts = btn . Name . Split ( '_' ); DriverData driver = Wrapper . GetFullDriverData ( parts [ 0 ], pnlCurrentDriverLapsHistory , this ); lblCurrentDriverName . Text = driver . Name ; lblCurrentDriverPosition . Text = driver . Position . ToString (); lblCurrentDriverGapToLeader . Text = Reader . ConvertMsToTime ( driver . GapToLeader ); lblCurrentDriverLapTime . Text = Reader . ConvertMsToTime ( driver . LapTime ); lblCurrentDriverTyreAge . Text = driver . CurrentTyre . NumberOfLaps . ToString (); if ( driver . DRS ) { lblCurrentDriverDRS . Text = \"Open\" ; lblCurrentDriverDRS . ForeColor = Color . FromArgb ( 0 , 164 , 46 ); } else { lblCurrentDriverDRS . Text = \"Closed\" ; lblCurrentDriverDRS . ForeColor = Color . Black ; } switch ( driver . CurrentTyre . Coumpound ) { case Tyre . Type . Undefined : lblCurrentDriverTyreType . Text = \"uuuuh...\" ; lblCurrentDriverTyreType . ForeColor = Color . Violet ; break ; case Tyre . Type . Hard : lblCurrentDriverTyreType . Text = \"Hard\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 164 , 165 , 168 ); break ; case Tyre . Type . Medium : lblCurrentDriverTyreType . Text = \"Medium\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 245 , 191 , 0 ); break ; case Tyre . Type . Soft : lblCurrentDriverTyreType . Text = \"Soft\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 255 , 0 , 0 ); break ; case Tyre . Type . Inter : lblCurrentDriverTyreType . Text = \"Intermediate\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 0 , 164 , 46 ); break ; case Tyre . Type . Wet : lblCurrentDriverTyreType . Text = \"Wet\" ; lblCurrentDriverTyreType . ForeColor = Color . FromArgb ( 39 , 96 , 166 ); break ; } } public void btnLapTime_Click ( object sender , EventArgs e ) { //Happens when a lapTime has been clicked Button btn = sender as Button ; string [] parts = btn . Name . Split ( '_' ); Wrapper . DisplayLapTimeInfos ( parts [ 0 ], Convert . ToInt32 ( parts [ 1 ]), btn . Text ); } private void Main_Resize ( object sender , EventArgs e ) { int xDiff = this . Width - oldSize . Width ; int yDiff = this . Height - oldSize . Height ; int padding = 10 ; //This will take half the newly created space gpbxRanking . Size = new Size ( oldRankingSize . Width + xDiff / 2 , oldRankingSize . Height + yDiff ); gpbxRanking . Location = new Point ( oldRankingPosition . X + xDiff / 2 , gpbxRanking . Location . Y ); //Will take half the new height and half the new height gpbxLapTimes . Size = new Size ( oldLapTimesSize . Width + xDiff / 2 , oldLapTimesSize . Height + yDiff / 2 ); //Will take half the new height and half the new width gpbxBattles . Size = new Size ( oldBattles . Width + xDiff / 2 , oldBattles . Height + yDiff / 2 ); gpbxBattles . Location = new Point ( gpbxBattles . Location . X , oldBattlePosition . Y + yDiff / 2 ); //The infos wont change width but will need to be centerd Point startOfZone = new Point ( gpbxOvertakes . Width + gpbxOvertakes . Location . X , gpbxOvertakes . Location . Y ); Point endOfZone = new Point ( gpbxRanking . Location . X , gpbxOvertakes . Location . Y ); int totalWidth = endOfZone . X - startOfZone . X ; gpbxDriverInfos . Location = new Point ( startOfZone . X + ( totalWidth / 2 - gpbxDriverInfos . Width / 2 ), oldDriverInfoPosition . Y + yDiff ); //Now resizing internals pnlFastest . Size = new Size ( oldPnlFastest . Width + xDiff / 4 , oldPnlFastest . Height + yDiff / 4 ); pnlFastest . Location = new Point ( olPnlFastestPosition . X , olPnlFastestPosition . Y + yDiff / 4 ); pnlSlowest . Size = new Size ( oldPnlSlowest . Width + xDiff / 4 , oldPnlSlowest . Height + yDiff / 4 ); pnlSlowest . Location = new Point ( oldPnlSlowestPosition . X + xDiff / 4 , oldPnlSlowestPosition . Y + yDiff / 4 ); pnlBattles . Size = new Size ( oldPnlBattles . Width + xDiff / 2 , oldPnlBattles . Height + yDiff / 2 ); pnlLiveRanking . Size = new Size ( oldPnlRankings . Width + xDiff / 2 , oldPnlRankings . Height + yDiff ); } } }","title":"Form1.cs"},{"location":"Code/Program.html","text":"Program.cs using System ; using System.Collections.Generic ; using System.Linq ; using System.Threading.Tasks ; using System.Windows.Forms ; namespace TrackTrends { internal static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main () { Application . EnableVisualStyles (); Application . SetCompatibleTextRenderingDefault ( false ); Application . Run ( new Main ()); } } }","title":"Program.cs"},{"location":"Code/Program.html#programcs","text":"using System ; using System.Collections.Generic ; using System.Linq ; using System.Threading.Tasks ; using System.Windows.Forms ; namespace TrackTrends { internal static class Program { /// /// The main entry point for the application. /// [STAThread] static void Main () { Application . EnableVisualStyles (); Application . SetCompatibleTextRenderingDefault ( false ); Application . Run ( new Main ()); } } }","title":"Program.cs"},{"location":"Code/Settings.Designer.html","text":"Settings.Designer.cs namespace TrackTrends { partial class Settings { /// /// Required designer variable. /// private System . ComponentModel . IContainer components = null ; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose ( bool disposing ) { if ( disposing && ( components != null )) { components . Dispose (); } base . Dispose ( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent () { this . components = new System . ComponentModel . Container (); this . label1 = new System . Windows . Forms . Label (); this . label2 = new System . Windows . Forms . Label (); this . gpbxRaceSettings = new System . Windows . Forms . GroupBox (); this . tbxGpUrl = new System . Windows . Forms . TextBox (); this . gpbxDriverList = new System . Windows . Forms . GroupBox (); this . lsbDrivers = new System . Windows . Forms . ListBox (); this . btnRemoveDriver = new System . Windows . Forms . Button (); this . btnAddDriver = new System . Windows . Forms . Button (); this . tbxDriverName = new System . Windows . Forms . TextBox (); this . gpbxPreview = new System . Windows . Forms . GroupBox (); this . lblWindowsRemaining = new System . Windows . Forms . Label (); this . btnResetDriver = new System . Windows . Forms . Button (); this . btnRefresh = new System . Windows . Forms . Button (); this . lblWindowPointsRemaining = new System . Windows . Forms . Label (); this . lblZonePointsRemaning = new System . Windows . Forms . Label (); this . btnCreateWindow = new System . Windows . Forms . Button (); this . pbxPreview = new System . Windows . Forms . PictureBox (); this . btnCreatZone = new System . Windows . Forms . Button (); this . gpbxWindowPreview = new System . Windows . Forms . GroupBox (); this . pbxWindowPreview = new System . Windows . Forms . PictureBox (); this . btnLoadPreset = new System . Windows . Forms . Button (); this . lsbPresets = new System . Windows . Forms . ListBox (); this . tbxPresetName = new System . Windows . Forms . TextBox (); this . btnSavePreset = new System . Windows . Forms . Button (); this . gpbxPresets = new System . Windows . Forms . GroupBox (); this . btnDeletePreset = new System . Windows . Forms . Button (); this . tip1 = new System . Windows . Forms . ToolTip ( this . components ); this . gpbxRaceSettings . SuspendLayout (); this . gpbxDriverList . SuspendLayout (); this . gpbxPreview . SuspendLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxPreview )). BeginInit (); this . gpbxWindowPreview . SuspendLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxWindowPreview )). BeginInit (); this . gpbxPresets . SuspendLayout (); this . SuspendLayout (); // // label1 // this . label1 . AutoSize = true ; this . label1 . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 19.8F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . label1 . ForeColor = System . Drawing . Color . White ; this . label1 . Location = new System . Drawing . Point ( 12 , 14 ); this . label1 . Name = \"label1\" ; this . label1 . Size = new System . Drawing . Size ( 309 , 43 ); this . label1 . TabIndex = 0 ; this . label1 . Text = \"Configuration tool\" ; // // label2 // this . label2 . AutoSize = true ; this . label2 . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . label2 . ForeColor = System . Drawing . Color . White ; this . label2 . Location = new System . Drawing . Point ( 3 , 25 ); this . label2 . Name = \"label2\" ; this . label2 . Size = new System . Drawing . Size ( 132 , 23 ); this . label2 . TabIndex = 1 ; this . label2 . Text = \"Grand Prix URL\" ; // // gpbxRaceSettings // this . gpbxRaceSettings . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxRaceSettings . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxRaceSettings . Controls . Add ( this . tbxGpUrl ); this . gpbxRaceSettings . Controls . Add ( this . label2 ); this . gpbxRaceSettings . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . gpbxRaceSettings . ForeColor = System . Drawing . Color . White ; this . gpbxRaceSettings . Location = new System . Drawing . Point ( 733 , 9 ); this . gpbxRaceSettings . Name = \"gpbxRaceSettings\" ; this . gpbxRaceSettings . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxRaceSettings . Size = new System . Drawing . Size ( 521 , 58 ); this . gpbxRaceSettings . TabIndex = 2 ; this . gpbxRaceSettings . TabStop = false ; this . gpbxRaceSettings . Text = \"RaceSettings\" ; this . gpbxRaceSettings . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // tbxGpUrl // this . tbxGpUrl . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxGpUrl . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxGpUrl . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . tbxGpUrl . ForeColor = System . Drawing . Color . White ; this . tbxGpUrl . Location = new System . Drawing . Point ( 141 , 25 ); this . tbxGpUrl . Name = \"tbxGpUrl\" ; this . tbxGpUrl . Size = new System . Drawing . Size ( 367 , 22 ); this . tbxGpUrl . TabIndex = 4 ; this . tbxGpUrl . TextChanged += new System . EventHandler ( this . tbxGpUrl_TextChanged ); // // gpbxDriverList // this . gpbxDriverList . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxDriverList . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxDriverList . Controls . Add ( this . lsbDrivers ); this . gpbxDriverList . Controls . Add ( this . btnRemoveDriver ); this . gpbxDriverList . Controls . Add ( this . btnAddDriver ); this . gpbxDriverList . Controls . Add ( this . tbxDriverName ); this . gpbxDriverList . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxDriverList . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxDriverList . ForeColor = System . Drawing . Color . White ; this . gpbxDriverList . Location = new System . Drawing . Point ( 995 , 73 ); this . gpbxDriverList . Name = \"gpbxDriverList\" ; this . gpbxDriverList . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxDriverList . Size = new System . Drawing . Size ( 259 , 269 ); this . gpbxDriverList . TabIndex = 3 ; this . gpbxDriverList . TabStop = false ; this . gpbxDriverList . Text = \"DriverList\" ; this . gpbxDriverList . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // lsbDrivers // this . lsbDrivers . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . lsbDrivers . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . lsbDrivers . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . lsbDrivers . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . lsbDrivers . FormattingEnabled = true ; this . lsbDrivers . ItemHeight = 23 ; this . lsbDrivers . Location = new System . Drawing . Point ( 10 , 23 ); this . lsbDrivers . Name = \"lsbDrivers\" ; this . lsbDrivers . Size = new System . Drawing . Size ( 243 , 138 ); this . lsbDrivers . TabIndex = 10 ; // // btnRemoveDriver // this . btnRemoveDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnRemoveDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnRemoveDriver . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . btnRemoveDriver . ForeColor = System . Drawing . Color . White ; this . btnRemoveDriver . Location = new System . Drawing . Point ( 132 , 167 ); this . btnRemoveDriver . Name = \"btnRemoveDriver\" ; this . btnRemoveDriver . Size = new System . Drawing . Size ( 121 , 62 ); this . btnRemoveDriver . TabIndex = 9 ; this . btnRemoveDriver . Text = \"Remove\" ; this . btnRemoveDriver . UseVisualStyleBackColor = false ; this . btnRemoveDriver . Click += new System . EventHandler ( this . btnRemoveDriver_Click ); // // btnAddDriver // this . btnAddDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnAddDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnAddDriver . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . btnAddDriver . ForeColor = System . Drawing . Color . White ; this . btnAddDriver . Location = new System . Drawing . Point ( 10 , 167 ); this . btnAddDriver . Name = \"btnAddDriver\" ; this . btnAddDriver . Size = new System . Drawing . Size ( 116 , 62 ); this . btnAddDriver . TabIndex = 8 ; this . btnAddDriver . Text = \"Add\" ; this . btnAddDriver . UseVisualStyleBackColor = false ; this . btnAddDriver . Click += new System . EventHandler ( this . btnAddDriver_Click ); // // tbxDriverName // this . tbxDriverName . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxDriverName . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxDriverName . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 11F ); this . tbxDriverName . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . tbxDriverName . Location = new System . Drawing . Point ( 10 , 235 ); this . tbxDriverName . Name = \"tbxDriverName\" ; this . tbxDriverName . Size = new System . Drawing . Size ( 243 , 24 ); this . tbxDriverName . TabIndex = 7 ; // // gpbxPreview // this . gpbxPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxPreview . Controls . Add ( this . lblWindowsRemaining ); this . gpbxPreview . Controls . Add ( this . btnResetDriver ); this . gpbxPreview . Controls . Add ( this . btnRefresh ); this . gpbxPreview . Controls . Add ( this . lblWindowPointsRemaining ); this . gpbxPreview . Controls . Add ( this . lblZonePointsRemaning ); this . gpbxPreview . Controls . Add ( this . btnCreateWindow ); this . gpbxPreview . Controls . Add ( this . pbxPreview ); this . gpbxPreview . Controls . Add ( this . btnCreatZone ); this . gpbxPreview . FlatStyle = System . Windows . Forms . FlatStyle . Flat ; this . gpbxPreview . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxPreview . ForeColor = System . Drawing . Color . White ; this . gpbxPreview . Location = new System . Drawing . Point ( 18 , 73 ); this . gpbxPreview . Name = \"gpbxPreview\" ; this . gpbxPreview . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxPreview . Size = new System . Drawing . Size ( 968 , 608 ); this . gpbxPreview . TabIndex = 4 ; this . gpbxPreview . TabStop = false ; this . gpbxPreview . Text = \"Preview\" ; this . gpbxPreview . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // lblWindowsRemaining // this . lblWindowsRemaining . AutoSize = true ; this . lblWindowsRemaining . BackColor = System . Drawing . Color . Transparent ; this . lblWindowsRemaining . ForeColor = System . Drawing . Color . White ; this . lblWindowsRemaining . Location = new System . Drawing . Point ( 215 , 82 ); this . lblWindowsRemaining . Name = \"lblWindowsRemaining\" ; this . lblWindowsRemaining . Size = new System . Drawing . Size ( 183 , 23 ); this . lblWindowsRemaining . TabIndex = 6 ; this . lblWindowsRemaining . Text = \"7 windows remaining\" ; // // btnResetDriver // this . btnResetDriver . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . btnResetDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnResetDriver . Enabled = false ; this . btnResetDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnResetDriver . ForeColor = System . Drawing . Color . White ; this . btnResetDriver . Location = new System . Drawing . Point ( 748 , 20 ); this . btnResetDriver . Name = \"btnResetDriver\" ; this . btnResetDriver . Size = new System . Drawing . Size ( 211 , 33 ); this . btnResetDriver . TabIndex = 2 ; this . btnResetDriver . Text = \"Reset the emulator\" ; this . btnResetDriver . UseVisualStyleBackColor = false ; this . btnResetDriver . Click += new System . EventHandler ( this . btnResetDriver_Click ); // // btnRefresh // this . btnRefresh . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . btnRefresh . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnRefresh . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnRefresh . ForeColor = System . Drawing . Color . White ; this . btnRefresh . Location = new System . Drawing . Point ( 549 , 20 ); this . btnRefresh . Name = \"btnRefresh\" ; this . btnRefresh . Size = new System . Drawing . Size ( 193 , 33 ); this . btnRefresh . TabIndex = 1 ; this . btnRefresh . Text = \"Start the browser\" ; this . btnRefresh . UseVisualStyleBackColor = false ; this . btnRefresh . Click += new System . EventHandler ( this . btnRefresh_Click ); // // lblWindowPointsRemaining // this . lblWindowPointsRemaining . AutoSize = true ; this . lblWindowPointsRemaining . ForeColor = System . Drawing . Color . White ; this . lblWindowPointsRemaining . Location = new System . Drawing . Point ( 215 , 59 ); this . lblWindowPointsRemaining . Name = \"lblWindowPointsRemaining\" ; this . lblWindowPointsRemaining . Size = new System . Drawing . Size ( 163 , 23 ); this . lblWindowPointsRemaining . TabIndex = 4 ; this . lblWindowPointsRemaining . Text = \"0 points remaining\" ; // // lblZonePointsRemaning // this . lblZonePointsRemaning . AutoSize = true ; this . lblZonePointsRemaning . ForeColor = System . Drawing . Color . White ; this . lblZonePointsRemaning . Location = new System . Drawing . Point ( 19 , 59 ); this . lblZonePointsRemaning . Name = \"lblZonePointsRemaning\" ; this . lblZonePointsRemaning . Size = new System . Drawing . Size ( 163 , 23 ); this . lblZonePointsRemaning . TabIndex = 5 ; this . lblZonePointsRemaning . Text = \"0 points remaining\" ; // // btnCreateWindow // this . btnCreateWindow . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnCreateWindow . Enabled = false ; this . btnCreateWindow . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnCreateWindow . ForeColor = System . Drawing . Color . White ; this . btnCreateWindow . Location = new System . Drawing . Point ( 213 , 23 ); this . btnCreateWindow . Name = \"btnCreateWindow\" ; this . btnCreateWindow . Size = new System . Drawing . Size ( 201 , 33 ); this . btnCreateWindow . TabIndex = 2 ; this . btnCreateWindow . Text = \"Create the windows\" ; this . btnCreateWindow . UseVisualStyleBackColor = false ; this . btnCreateWindow . Click += new System . EventHandler ( this . btnCreateWindow_Click ); // // pbxPreview // this . pbxPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . pbxPreview . Location = new System . Drawing . Point ( 10 , 62 ); this . pbxPreview . Name = \"pbxPreview\" ; this . pbxPreview . Size = new System . Drawing . Size ( 950 , 540 ); this . pbxPreview . SizeMode = System . Windows . Forms . PictureBoxSizeMode . StretchImage ; this . pbxPreview . TabIndex = 0 ; this . pbxPreview . TabStop = false ; this . pbxPreview . Click += new System . EventHandler ( this . pbxMain_Click ); this . pbxPreview . MouseClick += new System . Windows . Forms . MouseEventHandler ( this . pbxMain_MouseClick ); // // btnCreatZone // this . btnCreatZone . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnCreatZone . Enabled = false ; this . btnCreatZone . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnCreatZone . ForeColor = System . Drawing . Color . White ; this . btnCreatZone . Location = new System . Drawing . Point ( 6 , 23 ); this . btnCreatZone . Name = \"btnCreatZone\" ; this . btnCreatZone . Size = new System . Drawing . Size ( 201 , 33 ); this . btnCreatZone . TabIndex = 1 ; this . btnCreatZone . Text = \"Create the main zone\" ; this . btnCreatZone . UseVisualStyleBackColor = false ; this . btnCreatZone . Click += new System . EventHandler ( this . btnCreatZone_Click ); // // gpbxWindowPreview // this . gpbxWindowPreview . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Bottom | System . Windows . Forms . AnchorStyles . Left ))); this . gpbxWindowPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxWindowPreview . Controls . Add ( this . pbxWindowPreview ); this . gpbxWindowPreview . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxWindowPreview . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxWindowPreview . ForeColor = System . Drawing . Color . White ; this . gpbxWindowPreview . Location = new System . Drawing . Point ( 18 , 688 ); this . gpbxWindowPreview . Name = \"gpbxWindowPreview\" ; this . gpbxWindowPreview . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxWindowPreview . Size = new System . Drawing . Size ( 1237 , 88 ); this . gpbxWindowPreview . TabIndex = 5 ; this . gpbxWindowPreview . TabStop = false ; this . gpbxWindowPreview . Text = \"DriverZonePreview\" ; this . gpbxWindowPreview . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // pbxWindowPreview // this . pbxWindowPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . pbxWindowPreview . Location = new System . Drawing . Point ( 6 , 30 ); this . pbxWindowPreview . Name = \"pbxWindowPreview\" ; this . pbxWindowPreview . Size = new System . Drawing . Size ( 1225 , 50 ); this . pbxWindowPreview . SizeMode = System . Windows . Forms . PictureBoxSizeMode . StretchImage ; this . pbxWindowPreview . TabIndex = 0 ; this . pbxWindowPreview . TabStop = false ; this . pbxWindowPreview . Click += new System . EventHandler ( this . pbxDriverZone_Click ); this . pbxWindowPreview . MouseClick += new System . Windows . Forms . MouseEventHandler ( this . pbxDriverZone_MouseClick ); // // btnLoadPreset // this . btnLoadPreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnLoadPreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnLoadPreset . ForeColor = System . Drawing . Color . White ; this . btnLoadPreset . Location = new System . Drawing . Point ( 10 , 213 ); this . btnLoadPreset . Name = \"btnLoadPreset\" ; this . btnLoadPreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnLoadPreset . TabIndex = 10 ; this . btnLoadPreset . Text = \"Load the preset\" ; this . btnLoadPreset . UseVisualStyleBackColor = false ; this . btnLoadPreset . Click += new System . EventHandler ( this . btnLoadPreset_Click ); // // lsbPresets // this . lsbPresets . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . lsbPresets . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . lsbPresets . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . lsbPresets . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . lsbPresets . FormattingEnabled = true ; this . lsbPresets . ItemHeight = 23 ; this . lsbPresets . Location = new System . Drawing . Point ( 10 , 23 ); this . lsbPresets . Name = \"lsbPresets\" ; this . lsbPresets . Size = new System . Drawing . Size ( 243 , 138 ); this . lsbPresets . TabIndex = 8 ; this . lsbPresets . SelectedIndexChanged += new System . EventHandler ( this . lsbPresets_SelectedIndexChanged ); // // tbxPresetName // this . tbxPresetName . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxPresetName . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxPresetName . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 11F ); this . tbxPresetName . ForeColor = System . Drawing . Color . White ; this . tbxPresetName . Location = new System . Drawing . Point ( 10 , 303 ); this . tbxPresetName . Name = \"tbxPresetName\" ; this . tbxPresetName . Size = new System . Drawing . Size ( 243 , 24 ); this . tbxPresetName . TabIndex = 7 ; // // btnSavePreset // this . btnSavePreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnSavePreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnSavePreset . ForeColor = System . Drawing . Color . White ; this . btnSavePreset . Location = new System . Drawing . Point ( 10 , 259 ); this . btnSavePreset . Name = \"btnSavePreset\" ; this . btnSavePreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnSavePreset . TabIndex = 7 ; this . btnSavePreset . Text = \"Save current preset\" ; this . btnSavePreset . UseVisualStyleBackColor = false ; this . btnSavePreset . Click += new System . EventHandler ( this . btnSavePreset_Click ); // // gpbxPresets // this . gpbxPresets . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxPresets . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxPresets . Controls . Add ( this . btnSavePreset ); this . gpbxPresets . Controls . Add ( this . btnDeletePreset ); this . gpbxPresets . Controls . Add ( this . tbxPresetName ); this . gpbxPresets . Controls . Add ( this . btnLoadPreset ); this . gpbxPresets . Controls . Add ( this . lsbPresets ); this . gpbxPresets . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxPresets . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxPresets . ForeColor = System . Drawing . Color . White ; this . gpbxPresets . Location = new System . Drawing . Point ( 995 , 348 ); this . gpbxPresets . Name = \"gpbxPresets\" ; this . gpbxPresets . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxPresets . Size = new System . Drawing . Size ( 259 , 333 ); this . gpbxPresets . TabIndex = 6 ; this . gpbxPresets . TabStop = false ; this . gpbxPresets . Text = \"Presets\" ; this . gpbxPresets . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // btnDeletePreset // this . btnDeletePreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnDeletePreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnDeletePreset . ForeColor = System . Drawing . Color . White ; this . btnDeletePreset . Location = new System . Drawing . Point ( 10 , 167 ); this . btnDeletePreset . Name = \"btnDeletePreset\" ; this . btnDeletePreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnDeletePreset . TabIndex = 11 ; this . btnDeletePreset . Text = \"Delete the preset\" ; this . btnDeletePreset . UseVisualStyleBackColor = false ; this . btnDeletePreset . Click += new System . EventHandler ( this . btnDeletePreset_Click ); // // Settings // this . AutoScaleDimensions = new System . Drawing . SizeF ( 8F , 19F ); this . AutoScaleMode = System . Windows . Forms . AutoScaleMode . Font ; this . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . ClientSize = new System . Drawing . Size ( 1266 , 788 ); this . Controls . Add ( this . gpbxPresets ); this . Controls . Add ( this . gpbxWindowPreview ); this . Controls . Add ( this . gpbxPreview ); this . Controls . Add ( this . gpbxDriverList ); this . Controls . Add ( this . label1 ); this . Controls . Add ( this . gpbxRaceSettings ); this . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 7.8F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . Margin = new System . Windows . Forms . Padding ( 3 , 4 , 3 , 4 ); this . MinimumSize = new System . Drawing . Size ( 1284 , 835 ); this . Name = \"Settings\" ; this . StartPosition = System . Windows . Forms . FormStartPosition . CenterScreen ; this . Text = \"Settings\" ; this . FormClosing += new System . Windows . Forms . FormClosingEventHandler ( this . Settings_FormClosing ); this . Resize += new System . EventHandler ( this . Settings_Resize ); this . gpbxRaceSettings . ResumeLayout ( false ); this . gpbxRaceSettings . PerformLayout (); this . gpbxDriverList . ResumeLayout ( false ); this . gpbxDriverList . PerformLayout (); this . gpbxPreview . ResumeLayout ( false ); this . gpbxPreview . PerformLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxPreview )). EndInit (); this . gpbxWindowPreview . ResumeLayout ( false ); (( System . ComponentModel . ISupportInitialize )( this . pbxWindowPreview )). EndInit (); this . gpbxPresets . ResumeLayout ( false ); this . gpbxPresets . PerformLayout (); this . ResumeLayout ( false ); this . PerformLayout (); } #endregion private System . Windows . Forms . Label label1 ; private System . Windows . Forms . Label label2 ; private System . Windows . Forms . GroupBox gpbxRaceSettings ; private System . Windows . Forms . TextBox tbxGpUrl ; private System . Windows . Forms . GroupBox gpbxDriverList ; private System . Windows . Forms . ListBox lsbDrivers ; private System . Windows . Forms . Button btnRemoveDriver ; private System . Windows . Forms . Button btnAddDriver ; private System . Windows . Forms . TextBox tbxDriverName ; private System . Windows . Forms . GroupBox gpbxPreview ; private System . Windows . Forms . PictureBox pbxPreview ; private System . Windows . Forms . GroupBox gpbxWindowPreview ; private System . Windows . Forms . PictureBox pbxWindowPreview ; private System . Windows . Forms . Button btnCreateWindow ; private System . Windows . Forms . Button btnCreatZone ; private System . Windows . Forms . ListBox lsbPresets ; private System . Windows . Forms . TextBox tbxPresetName ; private System . Windows . Forms . Button btnSavePreset ; private System . Windows . Forms . Label lblWindowsRemaining ; private System . Windows . Forms . Label lblZonePointsRemaning ; private System . Windows . Forms . Label lblWindowPointsRemaining ; private System . Windows . Forms . Button btnRefresh ; private System . Windows . Forms . Button btnResetDriver ; private System . Windows . Forms . Button btnLoadPreset ; private System . Windows . Forms . GroupBox gpbxPresets ; private System . Windows . Forms . Button btnDeletePreset ; private System . Windows . Forms . ToolTip tip1 ; } }","title":"Settings.Designer.cs"},{"location":"Code/Settings.Designer.html#settingsdesignercs","text":"namespace TrackTrends { partial class Settings { /// /// Required designer variable. /// private System . ComponentModel . IContainer components = null ; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose ( bool disposing ) { if ( disposing && ( components != null )) { components . Dispose (); } base . Dispose ( disposing ); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent () { this . components = new System . ComponentModel . Container (); this . label1 = new System . Windows . Forms . Label (); this . label2 = new System . Windows . Forms . Label (); this . gpbxRaceSettings = new System . Windows . Forms . GroupBox (); this . tbxGpUrl = new System . Windows . Forms . TextBox (); this . gpbxDriverList = new System . Windows . Forms . GroupBox (); this . lsbDrivers = new System . Windows . Forms . ListBox (); this . btnRemoveDriver = new System . Windows . Forms . Button (); this . btnAddDriver = new System . Windows . Forms . Button (); this . tbxDriverName = new System . Windows . Forms . TextBox (); this . gpbxPreview = new System . Windows . Forms . GroupBox (); this . lblWindowsRemaining = new System . Windows . Forms . Label (); this . btnResetDriver = new System . Windows . Forms . Button (); this . btnRefresh = new System . Windows . Forms . Button (); this . lblWindowPointsRemaining = new System . Windows . Forms . Label (); this . lblZonePointsRemaning = new System . Windows . Forms . Label (); this . btnCreateWindow = new System . Windows . Forms . Button (); this . pbxPreview = new System . Windows . Forms . PictureBox (); this . btnCreatZone = new System . Windows . Forms . Button (); this . gpbxWindowPreview = new System . Windows . Forms . GroupBox (); this . pbxWindowPreview = new System . Windows . Forms . PictureBox (); this . btnLoadPreset = new System . Windows . Forms . Button (); this . lsbPresets = new System . Windows . Forms . ListBox (); this . tbxPresetName = new System . Windows . Forms . TextBox (); this . btnSavePreset = new System . Windows . Forms . Button (); this . gpbxPresets = new System . Windows . Forms . GroupBox (); this . btnDeletePreset = new System . Windows . Forms . Button (); this . tip1 = new System . Windows . Forms . ToolTip ( this . components ); this . gpbxRaceSettings . SuspendLayout (); this . gpbxDriverList . SuspendLayout (); this . gpbxPreview . SuspendLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxPreview )). BeginInit (); this . gpbxWindowPreview . SuspendLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxWindowPreview )). BeginInit (); this . gpbxPresets . SuspendLayout (); this . SuspendLayout (); // // label1 // this . label1 . AutoSize = true ; this . label1 . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 19.8F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . label1 . ForeColor = System . Drawing . Color . White ; this . label1 . Location = new System . Drawing . Point ( 12 , 14 ); this . label1 . Name = \"label1\" ; this . label1 . Size = new System . Drawing . Size ( 309 , 43 ); this . label1 . TabIndex = 0 ; this . label1 . Text = \"Configuration tool\" ; // // label2 // this . label2 . AutoSize = true ; this . label2 . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . label2 . ForeColor = System . Drawing . Color . White ; this . label2 . Location = new System . Drawing . Point ( 3 , 25 ); this . label2 . Name = \"label2\" ; this . label2 . Size = new System . Drawing . Size ( 132 , 23 ); this . label2 . TabIndex = 1 ; this . label2 . Text = \"Grand Prix URL\" ; // // gpbxRaceSettings // this . gpbxRaceSettings . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxRaceSettings . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxRaceSettings . Controls . Add ( this . tbxGpUrl ); this . gpbxRaceSettings . Controls . Add ( this . label2 ); this . gpbxRaceSettings . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . gpbxRaceSettings . ForeColor = System . Drawing . Color . White ; this . gpbxRaceSettings . Location = new System . Drawing . Point ( 733 , 9 ); this . gpbxRaceSettings . Name = \"gpbxRaceSettings\" ; this . gpbxRaceSettings . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxRaceSettings . Size = new System . Drawing . Size ( 521 , 58 ); this . gpbxRaceSettings . TabIndex = 2 ; this . gpbxRaceSettings . TabStop = false ; this . gpbxRaceSettings . Text = \"RaceSettings\" ; this . gpbxRaceSettings . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // tbxGpUrl // this . tbxGpUrl . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxGpUrl . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxGpUrl . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . tbxGpUrl . ForeColor = System . Drawing . Color . White ; this . tbxGpUrl . Location = new System . Drawing . Point ( 141 , 25 ); this . tbxGpUrl . Name = \"tbxGpUrl\" ; this . tbxGpUrl . Size = new System . Drawing . Size ( 367 , 22 ); this . tbxGpUrl . TabIndex = 4 ; this . tbxGpUrl . TextChanged += new System . EventHandler ( this . tbxGpUrl_TextChanged ); // // gpbxDriverList // this . gpbxDriverList . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxDriverList . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxDriverList . Controls . Add ( this . lsbDrivers ); this . gpbxDriverList . Controls . Add ( this . btnRemoveDriver ); this . gpbxDriverList . Controls . Add ( this . btnAddDriver ); this . gpbxDriverList . Controls . Add ( this . tbxDriverName ); this . gpbxDriverList . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxDriverList . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxDriverList . ForeColor = System . Drawing . Color . White ; this . gpbxDriverList . Location = new System . Drawing . Point ( 995 , 73 ); this . gpbxDriverList . Name = \"gpbxDriverList\" ; this . gpbxDriverList . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxDriverList . Size = new System . Drawing . Size ( 259 , 269 ); this . gpbxDriverList . TabIndex = 3 ; this . gpbxDriverList . TabStop = false ; this . gpbxDriverList . Text = \"DriverList\" ; this . gpbxDriverList . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // lsbDrivers // this . lsbDrivers . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . lsbDrivers . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . lsbDrivers . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . lsbDrivers . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . lsbDrivers . FormattingEnabled = true ; this . lsbDrivers . ItemHeight = 23 ; this . lsbDrivers . Location = new System . Drawing . Point ( 10 , 23 ); this . lsbDrivers . Name = \"lsbDrivers\" ; this . lsbDrivers . Size = new System . Drawing . Size ( 243 , 138 ); this . lsbDrivers . TabIndex = 10 ; // // btnRemoveDriver // this . btnRemoveDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnRemoveDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnRemoveDriver . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . btnRemoveDriver . ForeColor = System . Drawing . Color . White ; this . btnRemoveDriver . Location = new System . Drawing . Point ( 132 , 167 ); this . btnRemoveDriver . Name = \"btnRemoveDriver\" ; this . btnRemoveDriver . Size = new System . Drawing . Size ( 121 , 62 ); this . btnRemoveDriver . TabIndex = 9 ; this . btnRemoveDriver . Text = \"Remove\" ; this . btnRemoveDriver . UseVisualStyleBackColor = false ; this . btnRemoveDriver . Click += new System . EventHandler ( this . btnRemoveDriver_Click ); // // btnAddDriver // this . btnAddDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnAddDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnAddDriver . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10.2F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . btnAddDriver . ForeColor = System . Drawing . Color . White ; this . btnAddDriver . Location = new System . Drawing . Point ( 10 , 167 ); this . btnAddDriver . Name = \"btnAddDriver\" ; this . btnAddDriver . Size = new System . Drawing . Size ( 116 , 62 ); this . btnAddDriver . TabIndex = 8 ; this . btnAddDriver . Text = \"Add\" ; this . btnAddDriver . UseVisualStyleBackColor = false ; this . btnAddDriver . Click += new System . EventHandler ( this . btnAddDriver_Click ); // // tbxDriverName // this . tbxDriverName . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxDriverName . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxDriverName . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 11F ); this . tbxDriverName . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . tbxDriverName . Location = new System . Drawing . Point ( 10 , 235 ); this . tbxDriverName . Name = \"tbxDriverName\" ; this . tbxDriverName . Size = new System . Drawing . Size ( 243 , 24 ); this . tbxDriverName . TabIndex = 7 ; // // gpbxPreview // this . gpbxPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxPreview . Controls . Add ( this . lblWindowsRemaining ); this . gpbxPreview . Controls . Add ( this . btnResetDriver ); this . gpbxPreview . Controls . Add ( this . btnRefresh ); this . gpbxPreview . Controls . Add ( this . lblWindowPointsRemaining ); this . gpbxPreview . Controls . Add ( this . lblZonePointsRemaning ); this . gpbxPreview . Controls . Add ( this . btnCreateWindow ); this . gpbxPreview . Controls . Add ( this . pbxPreview ); this . gpbxPreview . Controls . Add ( this . btnCreatZone ); this . gpbxPreview . FlatStyle = System . Windows . Forms . FlatStyle . Flat ; this . gpbxPreview . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxPreview . ForeColor = System . Drawing . Color . White ; this . gpbxPreview . Location = new System . Drawing . Point ( 18 , 73 ); this . gpbxPreview . Name = \"gpbxPreview\" ; this . gpbxPreview . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxPreview . Size = new System . Drawing . Size ( 968 , 608 ); this . gpbxPreview . TabIndex = 4 ; this . gpbxPreview . TabStop = false ; this . gpbxPreview . Text = \"Preview\" ; this . gpbxPreview . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // lblWindowsRemaining // this . lblWindowsRemaining . AutoSize = true ; this . lblWindowsRemaining . BackColor = System . Drawing . Color . Transparent ; this . lblWindowsRemaining . ForeColor = System . Drawing . Color . White ; this . lblWindowsRemaining . Location = new System . Drawing . Point ( 215 , 82 ); this . lblWindowsRemaining . Name = \"lblWindowsRemaining\" ; this . lblWindowsRemaining . Size = new System . Drawing . Size ( 183 , 23 ); this . lblWindowsRemaining . TabIndex = 6 ; this . lblWindowsRemaining . Text = \"7 windows remaining\" ; // // btnResetDriver // this . btnResetDriver . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . btnResetDriver . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnResetDriver . Enabled = false ; this . btnResetDriver . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnResetDriver . ForeColor = System . Drawing . Color . White ; this . btnResetDriver . Location = new System . Drawing . Point ( 748 , 20 ); this . btnResetDriver . Name = \"btnResetDriver\" ; this . btnResetDriver . Size = new System . Drawing . Size ( 211 , 33 ); this . btnResetDriver . TabIndex = 2 ; this . btnResetDriver . Text = \"Reset the emulator\" ; this . btnResetDriver . UseVisualStyleBackColor = false ; this . btnResetDriver . Click += new System . EventHandler ( this . btnResetDriver_Click ); // // btnRefresh // this . btnRefresh . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . btnRefresh . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnRefresh . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnRefresh . ForeColor = System . Drawing . Color . White ; this . btnRefresh . Location = new System . Drawing . Point ( 549 , 20 ); this . btnRefresh . Name = \"btnRefresh\" ; this . btnRefresh . Size = new System . Drawing . Size ( 193 , 33 ); this . btnRefresh . TabIndex = 1 ; this . btnRefresh . Text = \"Start the browser\" ; this . btnRefresh . UseVisualStyleBackColor = false ; this . btnRefresh . Click += new System . EventHandler ( this . btnRefresh_Click ); // // lblWindowPointsRemaining // this . lblWindowPointsRemaining . AutoSize = true ; this . lblWindowPointsRemaining . ForeColor = System . Drawing . Color . White ; this . lblWindowPointsRemaining . Location = new System . Drawing . Point ( 215 , 59 ); this . lblWindowPointsRemaining . Name = \"lblWindowPointsRemaining\" ; this . lblWindowPointsRemaining . Size = new System . Drawing . Size ( 163 , 23 ); this . lblWindowPointsRemaining . TabIndex = 4 ; this . lblWindowPointsRemaining . Text = \"0 points remaining\" ; // // lblZonePointsRemaning // this . lblZonePointsRemaning . AutoSize = true ; this . lblZonePointsRemaning . ForeColor = System . Drawing . Color . White ; this . lblZonePointsRemaning . Location = new System . Drawing . Point ( 19 , 59 ); this . lblZonePointsRemaning . Name = \"lblZonePointsRemaning\" ; this . lblZonePointsRemaning . Size = new System . Drawing . Size ( 163 , 23 ); this . lblZonePointsRemaning . TabIndex = 5 ; this . lblZonePointsRemaning . Text = \"0 points remaining\" ; // // btnCreateWindow // this . btnCreateWindow . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnCreateWindow . Enabled = false ; this . btnCreateWindow . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnCreateWindow . ForeColor = System . Drawing . Color . White ; this . btnCreateWindow . Location = new System . Drawing . Point ( 213 , 23 ); this . btnCreateWindow . Name = \"btnCreateWindow\" ; this . btnCreateWindow . Size = new System . Drawing . Size ( 201 , 33 ); this . btnCreateWindow . TabIndex = 2 ; this . btnCreateWindow . Text = \"Create the windows\" ; this . btnCreateWindow . UseVisualStyleBackColor = false ; this . btnCreateWindow . Click += new System . EventHandler ( this . btnCreateWindow_Click ); // // pbxPreview // this . pbxPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . pbxPreview . Location = new System . Drawing . Point ( 10 , 62 ); this . pbxPreview . Name = \"pbxPreview\" ; this . pbxPreview . Size = new System . Drawing . Size ( 950 , 540 ); this . pbxPreview . SizeMode = System . Windows . Forms . PictureBoxSizeMode . StretchImage ; this . pbxPreview . TabIndex = 0 ; this . pbxPreview . TabStop = false ; this . pbxPreview . Click += new System . EventHandler ( this . pbxMain_Click ); this . pbxPreview . MouseClick += new System . Windows . Forms . MouseEventHandler ( this . pbxMain_MouseClick ); // // btnCreatZone // this . btnCreatZone . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnCreatZone . Enabled = false ; this . btnCreatZone . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnCreatZone . ForeColor = System . Drawing . Color . White ; this . btnCreatZone . Location = new System . Drawing . Point ( 6 , 23 ); this . btnCreatZone . Name = \"btnCreatZone\" ; this . btnCreatZone . Size = new System . Drawing . Size ( 201 , 33 ); this . btnCreatZone . TabIndex = 1 ; this . btnCreatZone . Text = \"Create the main zone\" ; this . btnCreatZone . UseVisualStyleBackColor = false ; this . btnCreatZone . Click += new System . EventHandler ( this . btnCreatZone_Click ); // // gpbxWindowPreview // this . gpbxWindowPreview . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Bottom | System . Windows . Forms . AnchorStyles . Left ))); this . gpbxWindowPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxWindowPreview . Controls . Add ( this . pbxWindowPreview ); this . gpbxWindowPreview . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxWindowPreview . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxWindowPreview . ForeColor = System . Drawing . Color . White ; this . gpbxWindowPreview . Location = new System . Drawing . Point ( 18 , 688 ); this . gpbxWindowPreview . Name = \"gpbxWindowPreview\" ; this . gpbxWindowPreview . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxWindowPreview . Size = new System . Drawing . Size ( 1237 , 88 ); this . gpbxWindowPreview . TabIndex = 5 ; this . gpbxWindowPreview . TabStop = false ; this . gpbxWindowPreview . Text = \"DriverZonePreview\" ; this . gpbxWindowPreview . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // pbxWindowPreview // this . pbxWindowPreview . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . pbxWindowPreview . Location = new System . Drawing . Point ( 6 , 30 ); this . pbxWindowPreview . Name = \"pbxWindowPreview\" ; this . pbxWindowPreview . Size = new System . Drawing . Size ( 1225 , 50 ); this . pbxWindowPreview . SizeMode = System . Windows . Forms . PictureBoxSizeMode . StretchImage ; this . pbxWindowPreview . TabIndex = 0 ; this . pbxWindowPreview . TabStop = false ; this . pbxWindowPreview . Click += new System . EventHandler ( this . pbxDriverZone_Click ); this . pbxWindowPreview . MouseClick += new System . Windows . Forms . MouseEventHandler ( this . pbxDriverZone_MouseClick ); // // btnLoadPreset // this . btnLoadPreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnLoadPreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnLoadPreset . ForeColor = System . Drawing . Color . White ; this . btnLoadPreset . Location = new System . Drawing . Point ( 10 , 213 ); this . btnLoadPreset . Name = \"btnLoadPreset\" ; this . btnLoadPreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnLoadPreset . TabIndex = 10 ; this . btnLoadPreset . Text = \"Load the preset\" ; this . btnLoadPreset . UseVisualStyleBackColor = false ; this . btnLoadPreset . Click += new System . EventHandler ( this . btnLoadPreset_Click ); // // lsbPresets // this . lsbPresets . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . lsbPresets . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . lsbPresets . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . lsbPresets . ForeColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 252 )))), (( int )((( byte )( 252 )))), (( int )((( byte )( 252 ))))); this . lsbPresets . FormattingEnabled = true ; this . lsbPresets . ItemHeight = 23 ; this . lsbPresets . Location = new System . Drawing . Point ( 10 , 23 ); this . lsbPresets . Name = \"lsbPresets\" ; this . lsbPresets . Size = new System . Drawing . Size ( 243 , 138 ); this . lsbPresets . TabIndex = 8 ; this . lsbPresets . SelectedIndexChanged += new System . EventHandler ( this . lsbPresets_SelectedIndexChanged ); // // tbxPresetName // this . tbxPresetName . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . tbxPresetName . BorderStyle = System . Windows . Forms . BorderStyle . None ; this . tbxPresetName . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 11F ); this . tbxPresetName . ForeColor = System . Drawing . Color . White ; this . tbxPresetName . Location = new System . Drawing . Point ( 10 , 303 ); this . tbxPresetName . Name = \"tbxPresetName\" ; this . tbxPresetName . Size = new System . Drawing . Size ( 243 , 24 ); this . tbxPresetName . TabIndex = 7 ; // // btnSavePreset // this . btnSavePreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnSavePreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnSavePreset . ForeColor = System . Drawing . Color . White ; this . btnSavePreset . Location = new System . Drawing . Point ( 10 , 259 ); this . btnSavePreset . Name = \"btnSavePreset\" ; this . btnSavePreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnSavePreset . TabIndex = 7 ; this . btnSavePreset . Text = \"Save current preset\" ; this . btnSavePreset . UseVisualStyleBackColor = false ; this . btnSavePreset . Click += new System . EventHandler ( this . btnSavePreset_Click ); // // gpbxPresets // this . gpbxPresets . Anchor = (( System . Windows . Forms . AnchorStyles )(( System . Windows . Forms . AnchorStyles . Top | System . Windows . Forms . AnchorStyles . Right ))); this . gpbxPresets . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 79 )))), (( int )((( byte )( 79 )))), (( int )((( byte )( 79 ))))); this . gpbxPresets . Controls . Add ( this . btnSavePreset ); this . gpbxPresets . Controls . Add ( this . btnDeletePreset ); this . gpbxPresets . Controls . Add ( this . tbxPresetName ); this . gpbxPresets . Controls . Add ( this . btnLoadPreset ); this . gpbxPresets . Controls . Add ( this . lsbPresets ); this . gpbxPresets . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . gpbxPresets . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 10F ); this . gpbxPresets . ForeColor = System . Drawing . Color . White ; this . gpbxPresets . Location = new System . Drawing . Point ( 995 , 348 ); this . gpbxPresets . Name = \"gpbxPresets\" ; this . gpbxPresets . Padding = new System . Windows . Forms . Padding ( 0 ); this . gpbxPresets . Size = new System . Drawing . Size ( 259 , 333 ); this . gpbxPresets . TabIndex = 6 ; this . gpbxPresets . TabStop = false ; this . gpbxPresets . Text = \"Presets\" ; this . gpbxPresets . Paint += new System . Windows . Forms . PaintEventHandler ( this . removeBorders ); // // btnDeletePreset // this . btnDeletePreset . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . btnDeletePreset . FlatStyle = System . Windows . Forms . FlatStyle . Popup ; this . btnDeletePreset . ForeColor = System . Drawing . Color . White ; this . btnDeletePreset . Location = new System . Drawing . Point ( 10 , 167 ); this . btnDeletePreset . Name = \"btnDeletePreset\" ; this . btnDeletePreset . Size = new System . Drawing . Size ( 243 , 40 ); this . btnDeletePreset . TabIndex = 11 ; this . btnDeletePreset . Text = \"Delete the preset\" ; this . btnDeletePreset . UseVisualStyleBackColor = false ; this . btnDeletePreset . Click += new System . EventHandler ( this . btnDeletePreset_Click ); // // Settings // this . AutoScaleDimensions = new System . Drawing . SizeF ( 8F , 19F ); this . AutoScaleMode = System . Windows . Forms . AutoScaleMode . Font ; this . BackColor = System . Drawing . Color . FromArgb ((( int )((( byte )( 51 )))), (( int )((( byte )( 51 )))), (( int )((( byte )( 51 ))))); this . ClientSize = new System . Drawing . Size ( 1266 , 788 ); this . Controls . Add ( this . gpbxPresets ); this . Controls . Add ( this . gpbxWindowPreview ); this . Controls . Add ( this . gpbxPreview ); this . Controls . Add ( this . gpbxDriverList ); this . Controls . Add ( this . label1 ); this . Controls . Add ( this . gpbxRaceSettings ); this . Font = new System . Drawing . Font ( \"Microsoft YaHei UI\" , 7.8F , System . Drawing . FontStyle . Regular , System . Drawing . GraphicsUnit . Point , (( byte )( 0 ))); this . Margin = new System . Windows . Forms . Padding ( 3 , 4 , 3 , 4 ); this . MinimumSize = new System . Drawing . Size ( 1284 , 835 ); this . Name = \"Settings\" ; this . StartPosition = System . Windows . Forms . FormStartPosition . CenterScreen ; this . Text = \"Settings\" ; this . FormClosing += new System . Windows . Forms . FormClosingEventHandler ( this . Settings_FormClosing ); this . Resize += new System . EventHandler ( this . Settings_Resize ); this . gpbxRaceSettings . ResumeLayout ( false ); this . gpbxRaceSettings . PerformLayout (); this . gpbxDriverList . ResumeLayout ( false ); this . gpbxDriverList . PerformLayout (); this . gpbxPreview . ResumeLayout ( false ); this . gpbxPreview . PerformLayout (); (( System . ComponentModel . ISupportInitialize )( this . pbxPreview )). EndInit (); this . gpbxWindowPreview . ResumeLayout ( false ); (( System . ComponentModel . ISupportInitialize )( this . pbxWindowPreview )). EndInit (); this . gpbxPresets . ResumeLayout ( false ); this . gpbxPresets . PerformLayout (); this . ResumeLayout ( false ); this . PerformLayout (); } #endregion private System . Windows . Forms . Label label1 ; private System . Windows . Forms . Label label2 ; private System . Windows . Forms . GroupBox gpbxRaceSettings ; private System . Windows . Forms . TextBox tbxGpUrl ; private System . Windows . Forms . GroupBox gpbxDriverList ; private System . Windows . Forms . ListBox lsbDrivers ; private System . Windows . Forms . Button btnRemoveDriver ; private System . Windows . Forms . Button btnAddDriver ; private System . Windows . Forms . TextBox tbxDriverName ; private System . Windows . Forms . GroupBox gpbxPreview ; private System . Windows . Forms . PictureBox pbxPreview ; private System . Windows . Forms . GroupBox gpbxWindowPreview ; private System . Windows . Forms . PictureBox pbxWindowPreview ; private System . Windows . Forms . Button btnCreateWindow ; private System . Windows . Forms . Button btnCreatZone ; private System . Windows . Forms . ListBox lsbPresets ; private System . Windows . Forms . TextBox tbxPresetName ; private System . Windows . Forms . Button btnSavePreset ; private System . Windows . Forms . Label lblWindowsRemaining ; private System . Windows . Forms . Label lblZonePointsRemaning ; private System . Windows . Forms . Label lblWindowPointsRemaining ; private System . Windows . Forms . Button btnRefresh ; private System . Windows . Forms . Button btnResetDriver ; private System . Windows . Forms . Button btnLoadPreset ; private System . Windows . Forms . GroupBox gpbxPresets ; private System . Windows . Forms . Button btnDeletePreset ; private System . Windows . Forms . ToolTip tip1 ; } }","title":"Settings.Designer.cs"},{"location":"Code/SqliteStorage.html","text":"SqliteStorage.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : SqliteStorage.cs /// Brief : Class that controls the sqlite database /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Data.SQLite ; using System.IO ; using System.Windows.Forms ; namespace TrackTrends { public class SqliteStorage { private const string DATABASE_FOLDER = \"./Data\" ; private const string DATABASE_FILE = \"/database.sqlite\" ; private const string CONNECTION_STRING = \"Data Source=\" + DATABASE_FOLDER + DATABASE_FILE + \";Version=3;\" ; private SQLiteConnection Connection ; /// /// Creates a new Sqlite Storage and initialize the database /// public SqliteStorage () { Load (); } /// /// Loads a fresh new Database or create a new one if it does not exist. /// private void Load () { if (! Directory . Exists ( DATABASE_FOLDER )) Directory . CreateDirectory ( DATABASE_FOLDER ); if (! File . Exists ( DATABASE_FOLDER + DATABASE_FILE )) { SQLiteConnection . CreateFile ( DATABASE_FOLDER + DATABASE_FILE ); } else { //We are not using the existing DataBase File . Delete ( DATABASE_FOLDER + DATABASE_FILE ); } Connection = new SQLiteConnection ( CONNECTION_STRING ); Connection . Open (); //Create the drivers table string createDriversTableQuery = @\"CREATE TABLE IF NOT EXISTS Drivers (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name VARCHAR NOT NULL);\" ; using ( var command = new SQLiteCommand ( createDriversTableQuery , Connection )) { command . ExecuteNonQuery (); } //Create the drivers table string createPitstopTableQuery = @\"CREATE TABLE Pitstops (Lap INTEGER NOT NULL, DriverID INTEGER NOT NULL, Tyre VARCHAR, PRIMARY KEY (Lap,DriverID));\" ; using ( var command = new SQLiteCommand ( createPitstopTableQuery , Connection )) { command . ExecuteNonQuery (); } //Create the stats string createStatsTableQuery = @\"CREATE TABLE IF NOT EXISTS Stats (Lap INTEGER NOT NULL, DriverID INTEGER NOT NULL, Tyre VARCHAR NOT NULL, LapTime INTEGER NOT NULL, Sector1 INTEGER NOT NULL, Sector2 INTEGER NOT NULL, Sector3 INTEGER NOT NULL, GapToLeader INTEGER NOT NULL, Position INTEGER NOT NULL, PRIMARY KEY (Lap, DriverID));\" ; using ( var command = new SQLiteCommand ( createStatsTableQuery , Connection )) { command . ExecuteNonQuery (); } } /// /// Adds a driver into the drivers table. Meant to be used at the start of the programm /// /// The name of the driver. (non case sensitive) public void AddDriver ( string name ) { string insertQuery = \"INSERT INTO Drivers (Name) VALUES (@name);\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Name\" , name ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert a new driver into de Database\"); } } } /// /// Searches for a driver and returns its id if it has been found /// /// Name of the driver (non case sensitive) /// private int GetDriverID ( string name ) { string selectQuery = \"SELECT ID FROM Drivers where Name LIKE @driverName\" ; int result = 0 ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverName\" , name ); try { using ( var reader = command . ExecuteReader ()) { while ( reader . Read ()) { result = reader . GetInt32 ( 0 ); } } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return result ; } /// /// Gets the sectors from a lapTime. Sectors are subdivisions of a laptime (could be usefull to validate one or the other) /// /// The name of the driver who has done the lap /// The lap at wich the driver has done the time /// A list of the different sectors time in int (ms) public List < int > GetSectorsFromLapTime ( string driverName , int lap ) { int driverId = GetDriverID ( driverName ); string selectQuery = \"SELECT Sector1,Sector2,Sector3 FROM Stats WHERE DriverID = @driverID AND Lap = @lap\" ; List < int > result = new List < int >(); using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@lap\" , lap ); try { SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { result . Add ( reader . GetInt32 ( 0 )); result . Add ( reader . GetInt32 ( 1 )); result . Add ( reader . GetInt32 ( 2 )); } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return result ; } /// /// Get the laptime history of a driver /// /// The name of the driver /// The number of lapTimes you want /// A list of tuples with the lap and the laptime. It will only return the amount it found so even if you ask 5 expect getting less or even 0 public List <( int LapTime , int Lap )> GetDriverLaptimes ( string driverName , int numberOfLaptimes ) { int driverId = GetDriverID ( driverName ); List <( int LapTime , int Lap )> lapData = new List <( int LapTime , int Lap )>(); string selectQuery = \"Select LapTime,Lap from Stats WHERE DriverID = @driverID ORDER BY Lap DESC LIMIT @limit\" ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@limit\" , numberOfLaptimes ); try { SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { int lapTime = reader . GetInt32 ( 0 ); int lap = reader . GetInt32 ( 1 ); lapData . Add (( lapTime , lap )); } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return lapData ; } /// /// Add a pitstop into the db /// /// The name of the driver who made his pitstop /// The lap where he stopped /// The tyre he took out public void AddPitstop ( string driverName , int lap , string tyre ) { string insertQuery = \"INSERT INTO Pitstops (Lap,DriverID,Tyre) VALUES (@Lap,@DriverID,@Tyre)\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Lap\" , lap ); command . Parameters . AddWithValue ( \"@DriverID\" , GetDriverID ( driverName )); command . Parameters . AddWithValue ( \"@Tyre\" , tyre ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert a new pitstop into the DB\" + Environment.NewLine + \"Request :\"+ command.ToString()); } } } /// /// Adds drivers info into the DB (it should only be once per lap) /// /// The Driver data /// The lap from wich the datas are from public void AddDriverStat ( DriverData data , int lap ) { string insertQuery = \"INSERT INTO Stats (Lap,DriverID,Tyre,LapTime,Sector1,Sector2,Sector3,GapToLeader,Position) VALUES (@Lap,@DriverID,@Tyre,@LapTime,@Sector1,@Sector2,@Sector3,@GapToLeader,@Position);\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Lap\" , lap ); command . Parameters . AddWithValue ( \"@DriverID\" , GetDriverID ( data . Name )); command . Parameters . AddWithValue ( \"@Tyre\" , data . CurrentTyre . Coumpound . ToString ()); command . Parameters . AddWithValue ( \"@LapTime\" , data . LapTime ); command . Parameters . AddWithValue ( \"@Sector1\" , data . Sector1 ); command . Parameters . AddWithValue ( \"@Sector2\" , data . Sector2 ); command . Parameters . AddWithValue ( \"@Sector3\" , data . Sector3 ); command . Parameters . AddWithValue ( \"@GapToLeader\" , data . GapToLeader ); command . Parameters . AddWithValue ( \"@Position\" , data . Position ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert infos about a driver\"); } } } } }","title":"SqliteStorage.cs"},{"location":"Code/SqliteStorage.html#sqlitestoragecs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : SqliteStorage.cs /// Brief : Class that controls the sqlite database /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Data.SQLite ; using System.IO ; using System.Windows.Forms ; namespace TrackTrends { public class SqliteStorage { private const string DATABASE_FOLDER = \"./Data\" ; private const string DATABASE_FILE = \"/database.sqlite\" ; private const string CONNECTION_STRING = \"Data Source=\" + DATABASE_FOLDER + DATABASE_FILE + \";Version=3;\" ; private SQLiteConnection Connection ; /// /// Creates a new Sqlite Storage and initialize the database /// public SqliteStorage () { Load (); } /// /// Loads a fresh new Database or create a new one if it does not exist. /// private void Load () { if (! Directory . Exists ( DATABASE_FOLDER )) Directory . CreateDirectory ( DATABASE_FOLDER ); if (! File . Exists ( DATABASE_FOLDER + DATABASE_FILE )) { SQLiteConnection . CreateFile ( DATABASE_FOLDER + DATABASE_FILE ); } else { //We are not using the existing DataBase File . Delete ( DATABASE_FOLDER + DATABASE_FILE ); } Connection = new SQLiteConnection ( CONNECTION_STRING ); Connection . Open (); //Create the drivers table string createDriversTableQuery = @\"CREATE TABLE IF NOT EXISTS Drivers (ID INTEGER PRIMARY KEY AUTOINCREMENT, Name VARCHAR NOT NULL);\" ; using ( var command = new SQLiteCommand ( createDriversTableQuery , Connection )) { command . ExecuteNonQuery (); } //Create the drivers table string createPitstopTableQuery = @\"CREATE TABLE Pitstops (Lap INTEGER NOT NULL, DriverID INTEGER NOT NULL, Tyre VARCHAR, PRIMARY KEY (Lap,DriverID));\" ; using ( var command = new SQLiteCommand ( createPitstopTableQuery , Connection )) { command . ExecuteNonQuery (); } //Create the stats string createStatsTableQuery = @\"CREATE TABLE IF NOT EXISTS Stats (Lap INTEGER NOT NULL, DriverID INTEGER NOT NULL, Tyre VARCHAR NOT NULL, LapTime INTEGER NOT NULL, Sector1 INTEGER NOT NULL, Sector2 INTEGER NOT NULL, Sector3 INTEGER NOT NULL, GapToLeader INTEGER NOT NULL, Position INTEGER NOT NULL, PRIMARY KEY (Lap, DriverID));\" ; using ( var command = new SQLiteCommand ( createStatsTableQuery , Connection )) { command . ExecuteNonQuery (); } } /// /// Adds a driver into the drivers table. Meant to be used at the start of the programm /// /// The name of the driver. (non case sensitive) public void AddDriver ( string name ) { string insertQuery = \"INSERT INTO Drivers (Name) VALUES (@name);\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Name\" , name ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert a new driver into de Database\"); } } } /// /// Searches for a driver and returns its id if it has been found /// /// Name of the driver (non case sensitive) /// private int GetDriverID ( string name ) { string selectQuery = \"SELECT ID FROM Drivers where Name LIKE @driverName\" ; int result = 0 ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverName\" , name ); try { using ( var reader = command . ExecuteReader ()) { while ( reader . Read ()) { result = reader . GetInt32 ( 0 ); } } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return result ; } /// /// Gets the sectors from a lapTime. Sectors are subdivisions of a laptime (could be usefull to validate one or the other) /// /// The name of the driver who has done the lap /// The lap at wich the driver has done the time /// A list of the different sectors time in int (ms) public List < int > GetSectorsFromLapTime ( string driverName , int lap ) { int driverId = GetDriverID ( driverName ); string selectQuery = \"SELECT Sector1,Sector2,Sector3 FROM Stats WHERE DriverID = @driverID AND Lap = @lap\" ; List < int > result = new List < int >(); using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@lap\" , lap ); try { SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { result . Add ( reader . GetInt32 ( 0 )); result . Add ( reader . GetInt32 ( 1 )); result . Add ( reader . GetInt32 ( 2 )); } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return result ; } /// /// Get the laptime history of a driver /// /// The name of the driver /// The number of lapTimes you want /// A list of tuples with the lap and the laptime. It will only return the amount it found so even if you ask 5 expect getting less or even 0 public List <( int LapTime , int Lap )> GetDriverLaptimes ( string driverName , int numberOfLaptimes ) { int driverId = GetDriverID ( driverName ); List <( int LapTime , int Lap )> lapData = new List <( int LapTime , int Lap )>(); string selectQuery = \"Select LapTime,Lap from Stats WHERE DriverID = @driverID ORDER BY Lap DESC LIMIT @limit\" ; using ( var command = new SQLiteCommand ( selectQuery , Connection )) { command . Parameters . AddWithValue ( \"@driverID\" , driverId ); command . Parameters . AddWithValue ( \"@limit\" , numberOfLaptimes ); try { SQLiteDataReader reader = command . ExecuteReader (); while ( reader . Read ()) { int lapTime = reader . GetInt32 ( 0 ); int lap = reader . GetInt32 ( 1 ); lapData . Add (( lapTime , lap )); } } catch { //MessageBox.Show(\"There has been an error while trying to retrieve the ID of a Driver from the database\"); } } return lapData ; } /// /// Add a pitstop into the db /// /// The name of the driver who made his pitstop /// The lap where he stopped /// The tyre he took out public void AddPitstop ( string driverName , int lap , string tyre ) { string insertQuery = \"INSERT INTO Pitstops (Lap,DriverID,Tyre) VALUES (@Lap,@DriverID,@Tyre)\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Lap\" , lap ); command . Parameters . AddWithValue ( \"@DriverID\" , GetDriverID ( driverName )); command . Parameters . AddWithValue ( \"@Tyre\" , tyre ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert a new pitstop into the DB\" + Environment.NewLine + \"Request :\"+ command.ToString()); } } } /// /// Adds drivers info into the DB (it should only be once per lap) /// /// The Driver data /// The lap from wich the datas are from public void AddDriverStat ( DriverData data , int lap ) { string insertQuery = \"INSERT INTO Stats (Lap,DriverID,Tyre,LapTime,Sector1,Sector2,Sector3,GapToLeader,Position) VALUES (@Lap,@DriverID,@Tyre,@LapTime,@Sector1,@Sector2,@Sector3,@GapToLeader,@Position);\" ; using ( var command = new SQLiteCommand ( insertQuery , Connection )) { command . Parameters . AddWithValue ( \"@Lap\" , lap ); command . Parameters . AddWithValue ( \"@DriverID\" , GetDriverID ( data . Name )); command . Parameters . AddWithValue ( \"@Tyre\" , data . CurrentTyre . Coumpound . ToString ()); command . Parameters . AddWithValue ( \"@LapTime\" , data . LapTime ); command . Parameters . AddWithValue ( \"@Sector1\" , data . Sector1 ); command . Parameters . AddWithValue ( \"@Sector2\" , data . Sector2 ); command . Parameters . AddWithValue ( \"@Sector3\" , data . Sector3 ); command . Parameters . AddWithValue ( \"@GapToLeader\" , data . GapToLeader ); command . Parameters . AddWithValue ( \"@Position\" , data . Position ); try { command . ExecuteNonQuery (); } catch { //MessageBox.Show(\"An error has occured while trying to insert infos about a driver\"); } } } } }","title":"SqliteStorage.cs"},{"location":"Code/Zone.html","text":"Zone.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Zone.cs /// Brief : Class that contains all the methods and infos for a zone. This is designed to be potentially be inherited. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class Zone { private Rectangle _bounds ; private List < Zone > _zones ; private List < Window > _windows ; private Bitmap _image ; private string _name ; public Bitmap ZoneImage { get { //This little trickery lets you have the image that the zone sees Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( Image , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Bitmap Image { get { return _image ; } set { //It automatically sets the image for the contained windows and zones _image = value ; foreach ( Window w in Windows ) { w . Image = ZoneImage ; } foreach ( Zone z in Zones ) { z . Image = Image ; } } } public Rectangle Bounds { get => _bounds ; protected set => _bounds = value ; } public List < Zone > Zones { get => _zones ; protected set => _zones = value ; } public List < Window > Windows { get => _windows ; protected set => _windows = value ; } public string Name { get => _name ; protected set => _name = value ; } /// /// Creates a new Zone /// /// Image of the parent zone /// The position and size of the zone /// THe name of the zone (usefull for the JSON formatting) public Zone ( Bitmap image , Rectangle bounds , string name ) { Windows = new List < Window >(); Zones = new List < Zone >(); Name = name ; //You cant set the image in the CTOR because the processing is impossible at first initiation _image = image ; Bounds = bounds ; } /// /// Adds a zone to the list of zones /// /// The zone you want to add public virtual void AddZone ( Zone zone ) { Zones . Add ( zone ); } /// /// Add a window to the list of windows /// /// the window you want to add public virtual void AddWindow ( Window window ) { Windows . Add ( window ); } /// /// Calls all the windows to do OCR and to give back the results so we can send them to the model /// /// A list of all the driver in the race to help with text recognition /// A driver data object that contains all the infos about a driver public virtual DriverData Decode ( List < string > driverList ) { int sectorCount = 0 ; DriverData result = new DriverData (); foreach ( Window w in Windows ) { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) result . Name = ( string )( w as DriverNameWindow ). DecodePng ( driverList ); if ( w is DriverDrsWindow ) result . DRS = ( bool )( w as DriverDrsWindow ). DecodePng (); if ( w is DriverGapToLeaderWindow ) result . GapToLeader = ( int )( w as DriverGapToLeaderWindow ). DecodePng (); if ( w is DriverLapTimeWindow ) result . LapTime = ( int )( w as DriverLapTimeWindow ). DecodePng (); if ( w is DriverPositionWindow ) result . Position = ( int )( w as DriverPositionWindow ). DecodePng (); if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) result . Sector1 = ( int )( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 2 ) result . Sector2 = ( int )( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 3 ) result . Sector3 = ( int )( w as DriverSectorWindow ). DecodePng (); } if ( w is DriverTyresWindow ) result . CurrentTyre = ( Tyre )( w as DriverTyresWindow ). DecodePng (); } return result ; } public virtual Bitmap Draw () { Bitmap img ; //If its the main zone we want to see everything if ( Zones . Count > 0 ) { img = Image ; } else { img = ZoneImage ; } Graphics g = Graphics . FromImage ( img ); //If its the main zone we need to visualize the Zone bounds displayed if ( Zones . Count > 0 ) g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 249 , 194 , 46 )), 5 ), Bounds ); foreach ( Zone z in Zones ) { Rectangle newBounds = new Rectangle ( z . Bounds . X , z . Bounds . Y + Bounds . Y , z . Bounds . Width , z . Bounds . Height ); g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 249 , 194 , 46 )), 5 ), newBounds ); } foreach ( Window w in Windows ) { g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 252 , 252 , 252 )), 5 ), w . Bounds ); } return img ; } public void ResetZones () { Zones . Clear (); } public void ResetWindows () { foreach ( Zone z in Zones ) { z . ResetWindows (); } Windows . Clear (); } /// /// Checks if the given Rectangle fits in the current zone /// /// The Rectangle you want to check the fittment /// protected bool Fits ( Rectangle inputRectangle ) { if ( inputRectangle . X + inputRectangle . Width > Bounds . Width || inputRectangle . Y + inputRectangle . Height > Bounds . Height || inputRectangle . X < 0 || inputRectangle . Y < 0 ) { return false ; } else { return true ; } } } }","title":"Zone.cs"},{"location":"Code/Zone.html#zonecs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Zone.cs /// Brief : Class that contains all the methods and infos for a zone. This is designed to be potentially be inherited. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; namespace TrackTrends { public class Zone { private Rectangle _bounds ; private List < Zone > _zones ; private List < Window > _windows ; private Bitmap _image ; private string _name ; public Bitmap ZoneImage { get { //This little trickery lets you have the image that the zone sees Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( Image , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } public Bitmap Image { get { return _image ; } set { //It automatically sets the image for the contained windows and zones _image = value ; foreach ( Window w in Windows ) { w . Image = ZoneImage ; } foreach ( Zone z in Zones ) { z . Image = Image ; } } } public Rectangle Bounds { get => _bounds ; protected set => _bounds = value ; } public List < Zone > Zones { get => _zones ; protected set => _zones = value ; } public List < Window > Windows { get => _windows ; protected set => _windows = value ; } public string Name { get => _name ; protected set => _name = value ; } /// /// Creates a new Zone /// /// Image of the parent zone /// The position and size of the zone /// THe name of the zone (usefull for the JSON formatting) public Zone ( Bitmap image , Rectangle bounds , string name ) { Windows = new List < Window >(); Zones = new List < Zone >(); Name = name ; //You cant set the image in the CTOR because the processing is impossible at first initiation _image = image ; Bounds = bounds ; } /// /// Adds a zone to the list of zones /// /// The zone you want to add public virtual void AddZone ( Zone zone ) { Zones . Add ( zone ); } /// /// Add a window to the list of windows /// /// the window you want to add public virtual void AddWindow ( Window window ) { Windows . Add ( window ); } /// /// Calls all the windows to do OCR and to give back the results so we can send them to the model /// /// A list of all the driver in the race to help with text recognition /// A driver data object that contains all the infos about a driver public virtual DriverData Decode ( List < string > driverList ) { int sectorCount = 0 ; DriverData result = new DriverData (); foreach ( Window w in Windows ) { // A switch would be prettier but I dont think its supported in this C# version if ( w is DriverNameWindow ) result . Name = ( string )( w as DriverNameWindow ). DecodePng ( driverList ); if ( w is DriverDrsWindow ) result . DRS = ( bool )( w as DriverDrsWindow ). DecodePng (); if ( w is DriverGapToLeaderWindow ) result . GapToLeader = ( int )( w as DriverGapToLeaderWindow ). DecodePng (); if ( w is DriverLapTimeWindow ) result . LapTime = ( int )( w as DriverLapTimeWindow ). DecodePng (); if ( w is DriverPositionWindow ) result . Position = ( int )( w as DriverPositionWindow ). DecodePng (); if ( w is DriverSectorWindow ) { sectorCount ++; if ( sectorCount == 1 ) result . Sector1 = ( int )( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 2 ) result . Sector2 = ( int )( w as DriverSectorWindow ). DecodePng (); if ( sectorCount == 3 ) result . Sector3 = ( int )( w as DriverSectorWindow ). DecodePng (); } if ( w is DriverTyresWindow ) result . CurrentTyre = ( Tyre )( w as DriverTyresWindow ). DecodePng (); } return result ; } public virtual Bitmap Draw () { Bitmap img ; //If its the main zone we want to see everything if ( Zones . Count > 0 ) { img = Image ; } else { img = ZoneImage ; } Graphics g = Graphics . FromImage ( img ); //If its the main zone we need to visualize the Zone bounds displayed if ( Zones . Count > 0 ) g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 249 , 194 , 46 )), 5 ), Bounds ); foreach ( Zone z in Zones ) { Rectangle newBounds = new Rectangle ( z . Bounds . X , z . Bounds . Y + Bounds . Y , z . Bounds . Width , z . Bounds . Height ); g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 249 , 194 , 46 )), 5 ), newBounds ); } foreach ( Window w in Windows ) { g . DrawRectangle ( new Pen ( new SolidBrush ( Color . FromArgb ( 252 , 252 , 252 )), 5 ), w . Bounds ); } return img ; } public void ResetZones () { Zones . Clear (); } public void ResetWindows () { foreach ( Zone z in Zones ) { z . ResetWindows (); } Windows . Clear (); } /// /// Checks if the given Rectangle fits in the current zone /// /// The Rectangle you want to check the fittment /// protected bool Fits ( Rectangle inputRectangle ) { if ( inputRectangle . X + inputRectangle . Width > Bounds . Width || inputRectangle . Y + inputRectangle . Height > Bounds . Height || inputRectangle . X < 0 || inputRectangle . Y < 0 ) { return false ; } else { return true ; } } } }","title":"Zone.cs"},{"location":"Code/DataWrapper.html","text":"DataWrapper.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DataWrapper.cs /// Brief : Class that is used to interface between the main Form (vue) and the Storage (wich is a class that wraps the sqlite database, so the model) its almost MVC :D /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.Drawing ; namespace TrackTrends { internal class DataWrapper { private Reader Reader ; private SqliteStorage Storage ; List < List < DriverData >> LiveDriverDataLogs = new List < List < DriverData >>(); //Note : It could be usefull to get the mainForm at the start of the programm and not have to take it in half of the methods. /// /// Constructs a new DataWrapper. It needs the config file so it can create a Reader, It also needs a first screenshot for the same reason /// /// The JSON config file that is created by the configuration tool /// A screenshot of the public DataWrapper ( string configFile , Bitmap screenshot ) { Reader = new Reader ( configFile , screenshot , true ); //The Storage is here and on the Reader. It seems bad but it is ok as we dont use it at all to insert data and are only using it here to read some. The reader takes care of the inserts (Note: We could technically do both here but I did not find it usefull to transfer everything here) Storage = Reader . Storage ; } /// /// Refreshes the controller so it has the latest driver datas (Be sure to call it everytime you need to use any other method and expects the data to be up to date) /// /// Error code, 0 is success, 1 is not (Note: Maybe it could be interesting in the future to add some more error handling here) public int Refresh () { LiveDriverDataLogs . Add ( Reader . Decode ( Reader . MainZones , Reader . Drivers )); if ( LiveDriverDataLogs . Count > 0 ) return 0 ; return 1 ; } /// /// Changes the image to the newest screenshot in all of the zones and windows /// /// The new screenshot to put everywhere (Do not mix resolutions) public void ChangeImage ( Bitmap image ) { Reader . ChangeImage ( image ); } /// /// Gets all the data from one driver and also displays into the given panel the last five laps (or less if its the sart of the race) Note: Its responsive :D /// /// The name of the driver (should not be case sensitive but it MUST already exist in the first list that has been inserted into the DB) /// The pannel where you want the five last laps to be displayed /// The Main form. /// public DriverData GetFullDriverData ( string driverName , Panel lastFiveLapsPanel , Main form1 ) { //Note : I know that its a bad idea to ask the Form in this method and some others because it means that it wont work with any main form. And to that Ill say that... your right ! DriverData result = new DriverData (); if ( LiveDriverDataLogs . Count > 0 ) { //Searches the most recent live data from the given driverName foreach ( DriverData data in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { if ( data . Name == driverName ) result = data ; } if ( result . Name != \"\" ) { //Recovers and displays the last five laps from the driver lastFiveLapsPanel . Controls . Clear (); Size labelDimensions = new Size ( lastFiveLapsPanel . Width , lastFiveLapsPanel . Height / 5 ); List <( int LapTime , int Lap )> lapsInfos = Storage . GetDriverLaptimes ( driverName , 5 ); int id = 0 ; foreach (( int LapTime , int Lap ) lapData in lapsInfos ) { //Hardcodes the new button. //Note : It could be smart to have like a default button for all the methods to use without needing to rewrite everything. Button newButton = new Button (); lastFiveLapsPanel . Controls . Add ( newButton ); newButton . Name = driverName + \"_\" + lapData . Lap ; newButton . Text = Reader . ConvertMsToTime ( lapData . LapTime ); newButton . Size = labelDimensions ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Click += form1 . btnLapTime_Click ; newButton . Location = new Point ( 0 , id * newButton . Height ); id ++; } } } return result ; } /// /// Runs trough every drivers live data to recover the drivers that are close to each others /// /// The control that will host the displayed battles /// The main form. It needs to have a method called 'btnDriver_Click' so it can reads the buttons clicks public void DisplayBattles ( Panel pnlBattles , Main form1 ) { DriverData oldDriver = null ; List <( DriverData d1 , DriverData d2 , int gap )> battles = new List <( DriverData d1 , DriverData d2 , int gap )>(); //Search trough all the drivers and finds the one battling foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { if ( oldDriver != null && driver . Position != - 1 && oldDriver . Position != - 1 ) { if ( driver . GapToLeader < oldDriver . GapToLeader ) { //There is a problem with the drivers gaps } else { int gap = driver . GapToLeader - oldDriver . GapToLeader ; //3000ms is 3s. If drivers are that close then they are definitely in battle. If they are farther then maybe not if ( gap <= 3000 ) { battles . Add (( oldDriver , driver , gap )); } } oldDriver = driver ; } else { oldDriver = driver ; } } //We will only display 4 battles max int maxBattles = 4 ; if ( battles . Count > 0 ) { pnlBattles . Controls . Clear (); int maxUiHeight = Math . Max ( pnlBattles . Height / maxBattles , pnlBattles . Height / battles . Count ); int id = 0 ; foreach (( DriverData d1 , DriverData d2 , int gap ) battle in battles ) { if ( id < maxBattles ) { //*hardcoding* the different controls that needs to be added to the panel. //Note : this stuff could totally be handled by the Form with method returning a list of the drivers. It was just easier for me at the time to code it this way but its not the prettiest Button btnFirstDriver = new Button (); Button btnSecondDriver = new Button (); Label lblGap = new Label (); pnlBattles . Controls . Add ( btnFirstDriver ); pnlBattles . Controls . Add ( lblGap ); pnlBattles . Controls . Add ( btnSecondDriver ); btnFirstDriver . Anchor = AnchorStyles . Left | AnchorStyles . Top ; btnSecondDriver . Anchor = AnchorStyles . Right | AnchorStyles . Top ; lblGap . Anchor = AnchorStyles . Right | AnchorStyles . Left | AnchorStyles . Top ; lblGap . TextAlign = ContentAlignment . MiddleCenter ; lblGap . Font = new Font ( lblGap . Font . FontFamily , 15 ); btnFirstDriver . Click += form1 . btnDriver_Click ; btnSecondDriver . Click += form1 . btnDriver_Click ; btnFirstDriver . FlatStyle = FlatStyle . Popup ; btnSecondDriver . FlatStyle = FlatStyle . Popup ; lblGap . FlatStyle = FlatStyle . Popup ; btnFirstDriver . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); btnSecondDriver . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); lblGap . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); btnFirstDriver . Location = new Point ( pnlBattles . Width / 3 * 0 , id * maxUiHeight ); lblGap . Location = new Point ( pnlBattles . Width / 3 * 1 , id * maxUiHeight ); btnSecondDriver . Location = new Point ( pnlBattles . Width / 3 * 2 , id * maxUiHeight ); btnFirstDriver . Text = battle . d1 . Name ; lblGap . Text = \"+ \" + Reader . ConvertMsToTime ( battle . gap ); if ( battle . gap <= 2000 ) lblGap . ForeColor = Color . Yellow ; if ( battle . gap <= 1000 ) lblGap . ForeColor = Color . Green ; btnSecondDriver . Text = battle . d2 . Name ; btnFirstDriver . Name = battle . d1 . Name + \"_\" + id ; lblGap . Name = \"lbl_Gap_\" + id ; btnSecondDriver . Name = battle . d2 . Name + \"_\" + id ; } else { break ; } id ++; } } } /// /// Searches the fastest and slowests drivers and displays them in the given panels /// /// Panel that will contain the constructed controls /// Panel that will contain the constructed controls /// The main form that needs to implement the method btnDriver_Click to allow it to recover custom buttons click public void DisplayTimesDeltas ( Panel pnlFastest , Panel pnlSlowest , Main form1 ) { List <( int avg , string driverName )> averages = new List <( int avg , string driverName )>(); foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { //We want to recover the last 5 lap times List <( int lapTime , int lap )> laps = Storage . GetDriverLaptimes ( driver . Name , 5 ); if ( laps . Count > 0 ) { int avg = 0 ; foreach (( int lapTime , int lap ) lap in laps ) { avg += lap . lapTime ; } avg = avg / laps . Count ; averages . Add (( avg , driver . Name )); } } int numberOfDriversToShow = 5 ; if ( averages . Count > 0 && averages . Count > numberOfDriversToShow ) { averages = averages . OrderBy ( item => item . avg ). ToList (); pnlFastest . Controls . Clear (); pnlSlowest . Controls . Clear (); int maxUiSize = pnlFastest . Height / numberOfDriversToShow ; //Displays the fastest drivers for ( int i = 0 ; i < numberOfDriversToShow ; i ++) { Button newButton = new Button (); ( int avg , string driver ) data = averages [ i ]; pnlFastest . Controls . Add ( newButton ); newButton . Size = new Size ( pnlFastest . Width , maxUiSize ); newButton . Location = new Point ( 0 , i * maxUiSize ); newButton . Text = data . driver ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Name = data . driver + \"_fastest_\" + i ; newButton . Click += form1 . btnDriver_Click ; //We take the average time lost per lap if ( i != 0 ) newButton . Text += \" + \" + Reader . ConvertMsToTime ( Convert . ToInt32 ((( float ) data . avg - ( float ) averages [ 0 ]. avg ) / 5.0f )); } //Displays the slowests drivers int badId = 0 ; for ( int i = averages . Count - 1 ; i >= averages . Count - numberOfDriversToShow ; i --) { Button newButton = new Button (); ( int avg , string driver ) data = averages [ i ]; pnlSlowest . Controls . Add ( newButton ); newButton . Size = new Size ( pnlFastest . Width , maxUiSize ); newButton . Location = new Point ( 0 , badId * maxUiSize ); newButton . Text = data . driver ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Name = data . driver + \"_slowest_\" + i ; newButton . Click += form1 . btnDriver_Click ; //We take the average time lost per lap newButton . Text += \" + \" + Reader . ConvertMsToTime ( Convert . ToInt32 ((( float ) data . avg - ( float ) averages [ 0 ]. avg ) / 5.0f )); badId ++; } } } /// /// Will add to the list of overtakes the different changes of position /// /// The listbox containing all the infos public void DisplayOvertakes ( ListBox lsbResult ) { //Note : This method SHOULD REALLY not do this but just return a string or a list of string with the new overtakes so the form can handle it as it wishes if ( LiveDriverDataLogs . Count > 1 ) { List < DriverData > oldList = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 2 ]; List < DriverData > newList = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]; for ( int i = 0 ; i < LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]. Count ; i ++) { if ( oldList [ i ]. Name != newList [ i ]. Name ) { //There has been a change in the standings for ( int y = 0 ; y < oldList . Count ; y ++) { if ( newList [ y ]. Name == oldList [ i ]. Name ) { //We found its new location if ( y > i ) { //The driver overtook someone lsbResult . Items . Add ( newList [ y ]. Name + \" climbed to \" + y ); } else { //The driver got overtook by someone lsbResult . Items . Add ( newList [ y ]. Name + \" fell to \" + y ); } } } } } } } /// /// Displays a messageBox containing the infos about a lap time /// /// The name of the driver that has done the lapTime /// The number of the lap on wich the lapTime has been set (CAUTION ITS NOT THE RACING LAP ITS FROM THE DB) /// The time (in ms) of the lap public void DisplayLapTimeInfos ( string driverName , int Lap , string LapTime ) { List < int > sectors = Storage . GetSectorsFromLapTime ( driverName , Lap ); string message = \"Lap time infos\" + Environment . NewLine ; message += LapTime + Environment . NewLine ; if ( sectors . Count > 0 ) message += \"Sector 1 : \" + Reader . ConvertMsToTime ( sectors [ 0 ]) + Environment . NewLine ; if ( sectors . Count > 1 ) message += \"Sector 2 : \" + Reader . ConvertMsToTime ( sectors [ 1 ]) + Environment . NewLine ; if ( sectors . Count > 2 ) message += \"Sector 3 : \" + Reader . ConvertMsToTime ( sectors [ 2 ]) + Environment . NewLine ; MessageBox . Show ( message ); } /// /// Displays the live ranking with the names of the drivers and their gap to the leader in the right order /// /// The control that will host all the new controls /// The main form public void DisplayLiveRanking ( Panel pnl , Main form1 ) { if ( LiveDriverDataLogs . Count > 0 ) { pnl . Controls . Clear (); //Gets the last item that should be the most recent data List < DriverData > liveData = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]; Button [] buttons = new Button [ liveData . Count ]; Size buttonDimensions = new Size ( pnl . Width , pnl . Height / liveData . Count ); for ( int driverCount = 0 ; driverCount < liveData . Count ; driverCount ++) { Button newButton = new Button (); newButton . Size = buttonDimensions ; newButton . Location = new Point ( 0 , driverCount * buttonDimensions . Height ); newButton . FlatStyle = FlatStyle . Popup ; DriverData driver = liveData [ driverCount ]; if ( driver . Position == - 1 ) { //Its a DNF newButton . Enabled = false ; } if ( driver . Position > 1 ) { newButton . Text = driver . Name + \" +\" + Reader . ConvertMsToTime ( driver . GapToLeader ); } else { newButton . Text = driver . Name ; } newButton . Name = liveData [ driverCount ]. Name ; newButton . TextAlign = ContentAlignment . MiddleLeft ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Click += form1 . btnDriver_Click ; buttons [ driverCount ] = newButton ; } //Note : It could be better to have this directly in the same loop foreach ( Button button in buttons ) { pnl . Controls . Add ( button ); } } } } }","title":"DataWrapper.cs"},{"location":"Code/DataWrapper.html#datawrappercs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DataWrapper.cs /// Brief : Class that is used to interface between the main Form (vue) and the Storage (wich is a class that wraps the sqlite database, so the model) its almost MVC :D /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.Drawing ; namespace TrackTrends { internal class DataWrapper { private Reader Reader ; private SqliteStorage Storage ; List < List < DriverData >> LiveDriverDataLogs = new List < List < DriverData >>(); //Note : It could be usefull to get the mainForm at the start of the programm and not have to take it in half of the methods. /// /// Constructs a new DataWrapper. It needs the config file so it can create a Reader, It also needs a first screenshot for the same reason /// /// The JSON config file that is created by the configuration tool /// A screenshot of the public DataWrapper ( string configFile , Bitmap screenshot ) { Reader = new Reader ( configFile , screenshot , true ); //The Storage is here and on the Reader. It seems bad but it is ok as we dont use it at all to insert data and are only using it here to read some. The reader takes care of the inserts (Note: We could technically do both here but I did not find it usefull to transfer everything here) Storage = Reader . Storage ; } /// /// Refreshes the controller so it has the latest driver datas (Be sure to call it everytime you need to use any other method and expects the data to be up to date) /// /// Error code, 0 is success, 1 is not (Note: Maybe it could be interesting in the future to add some more error handling here) public int Refresh () { LiveDriverDataLogs . Add ( Reader . Decode ( Reader . MainZones , Reader . Drivers )); if ( LiveDriverDataLogs . Count > 0 ) return 0 ; return 1 ; } /// /// Changes the image to the newest screenshot in all of the zones and windows /// /// The new screenshot to put everywhere (Do not mix resolutions) public void ChangeImage ( Bitmap image ) { Reader . ChangeImage ( image ); } /// /// Gets all the data from one driver and also displays into the given panel the last five laps (or less if its the sart of the race) Note: Its responsive :D /// /// The name of the driver (should not be case sensitive but it MUST already exist in the first list that has been inserted into the DB) /// The pannel where you want the five last laps to be displayed /// The Main form. /// public DriverData GetFullDriverData ( string driverName , Panel lastFiveLapsPanel , Main form1 ) { //Note : I know that its a bad idea to ask the Form in this method and some others because it means that it wont work with any main form. And to that Ill say that... your right ! DriverData result = new DriverData (); if ( LiveDriverDataLogs . Count > 0 ) { //Searches the most recent live data from the given driverName foreach ( DriverData data in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { if ( data . Name == driverName ) result = data ; } if ( result . Name != \"\" ) { //Recovers and displays the last five laps from the driver lastFiveLapsPanel . Controls . Clear (); Size labelDimensions = new Size ( lastFiveLapsPanel . Width , lastFiveLapsPanel . Height / 5 ); List <( int LapTime , int Lap )> lapsInfos = Storage . GetDriverLaptimes ( driverName , 5 ); int id = 0 ; foreach (( int LapTime , int Lap ) lapData in lapsInfos ) { //Hardcodes the new button. //Note : It could be smart to have like a default button for all the methods to use without needing to rewrite everything. Button newButton = new Button (); lastFiveLapsPanel . Controls . Add ( newButton ); newButton . Name = driverName + \"_\" + lapData . Lap ; newButton . Text = Reader . ConvertMsToTime ( lapData . LapTime ); newButton . Size = labelDimensions ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Click += form1 . btnLapTime_Click ; newButton . Location = new Point ( 0 , id * newButton . Height ); id ++; } } } return result ; } /// /// Runs trough every drivers live data to recover the drivers that are close to each others /// /// The control that will host the displayed battles /// The main form. It needs to have a method called 'btnDriver_Click' so it can reads the buttons clicks public void DisplayBattles ( Panel pnlBattles , Main form1 ) { DriverData oldDriver = null ; List <( DriverData d1 , DriverData d2 , int gap )> battles = new List <( DriverData d1 , DriverData d2 , int gap )>(); //Search trough all the drivers and finds the one battling foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { if ( oldDriver != null && driver . Position != - 1 && oldDriver . Position != - 1 ) { if ( driver . GapToLeader < oldDriver . GapToLeader ) { //There is a problem with the drivers gaps } else { int gap = driver . GapToLeader - oldDriver . GapToLeader ; //3000ms is 3s. If drivers are that close then they are definitely in battle. If they are farther then maybe not if ( gap <= 3000 ) { battles . Add (( oldDriver , driver , gap )); } } oldDriver = driver ; } else { oldDriver = driver ; } } //We will only display 4 battles max int maxBattles = 4 ; if ( battles . Count > 0 ) { pnlBattles . Controls . Clear (); int maxUiHeight = Math . Max ( pnlBattles . Height / maxBattles , pnlBattles . Height / battles . Count ); int id = 0 ; foreach (( DriverData d1 , DriverData d2 , int gap ) battle in battles ) { if ( id < maxBattles ) { //*hardcoding* the different controls that needs to be added to the panel. //Note : this stuff could totally be handled by the Form with method returning a list of the drivers. It was just easier for me at the time to code it this way but its not the prettiest Button btnFirstDriver = new Button (); Button btnSecondDriver = new Button (); Label lblGap = new Label (); pnlBattles . Controls . Add ( btnFirstDriver ); pnlBattles . Controls . Add ( lblGap ); pnlBattles . Controls . Add ( btnSecondDriver ); btnFirstDriver . Anchor = AnchorStyles . Left | AnchorStyles . Top ; btnSecondDriver . Anchor = AnchorStyles . Right | AnchorStyles . Top ; lblGap . Anchor = AnchorStyles . Right | AnchorStyles . Left | AnchorStyles . Top ; lblGap . TextAlign = ContentAlignment . MiddleCenter ; lblGap . Font = new Font ( lblGap . Font . FontFamily , 15 ); btnFirstDriver . Click += form1 . btnDriver_Click ; btnSecondDriver . Click += form1 . btnDriver_Click ; btnFirstDriver . FlatStyle = FlatStyle . Popup ; btnSecondDriver . FlatStyle = FlatStyle . Popup ; lblGap . FlatStyle = FlatStyle . Popup ; btnFirstDriver . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); btnSecondDriver . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); lblGap . Size = new Size ( pnlBattles . Width / 3 , maxUiHeight ); btnFirstDriver . Location = new Point ( pnlBattles . Width / 3 * 0 , id * maxUiHeight ); lblGap . Location = new Point ( pnlBattles . Width / 3 * 1 , id * maxUiHeight ); btnSecondDriver . Location = new Point ( pnlBattles . Width / 3 * 2 , id * maxUiHeight ); btnFirstDriver . Text = battle . d1 . Name ; lblGap . Text = \"+ \" + Reader . ConvertMsToTime ( battle . gap ); if ( battle . gap <= 2000 ) lblGap . ForeColor = Color . Yellow ; if ( battle . gap <= 1000 ) lblGap . ForeColor = Color . Green ; btnSecondDriver . Text = battle . d2 . Name ; btnFirstDriver . Name = battle . d1 . Name + \"_\" + id ; lblGap . Name = \"lbl_Gap_\" + id ; btnSecondDriver . Name = battle . d2 . Name + \"_\" + id ; } else { break ; } id ++; } } } /// /// Searches the fastest and slowests drivers and displays them in the given panels /// /// Panel that will contain the constructed controls /// Panel that will contain the constructed controls /// The main form that needs to implement the method btnDriver_Click to allow it to recover custom buttons click public void DisplayTimesDeltas ( Panel pnlFastest , Panel pnlSlowest , Main form1 ) { List <( int avg , string driverName )> averages = new List <( int avg , string driverName )>(); foreach ( DriverData driver in LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]) { //We want to recover the last 5 lap times List <( int lapTime , int lap )> laps = Storage . GetDriverLaptimes ( driver . Name , 5 ); if ( laps . Count > 0 ) { int avg = 0 ; foreach (( int lapTime , int lap ) lap in laps ) { avg += lap . lapTime ; } avg = avg / laps . Count ; averages . Add (( avg , driver . Name )); } } int numberOfDriversToShow = 5 ; if ( averages . Count > 0 && averages . Count > numberOfDriversToShow ) { averages = averages . OrderBy ( item => item . avg ). ToList (); pnlFastest . Controls . Clear (); pnlSlowest . Controls . Clear (); int maxUiSize = pnlFastest . Height / numberOfDriversToShow ; //Displays the fastest drivers for ( int i = 0 ; i < numberOfDriversToShow ; i ++) { Button newButton = new Button (); ( int avg , string driver ) data = averages [ i ]; pnlFastest . Controls . Add ( newButton ); newButton . Size = new Size ( pnlFastest . Width , maxUiSize ); newButton . Location = new Point ( 0 , i * maxUiSize ); newButton . Text = data . driver ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Name = data . driver + \"_fastest_\" + i ; newButton . Click += form1 . btnDriver_Click ; //We take the average time lost per lap if ( i != 0 ) newButton . Text += \" + \" + Reader . ConvertMsToTime ( Convert . ToInt32 ((( float ) data . avg - ( float ) averages [ 0 ]. avg ) / 5.0f )); } //Displays the slowests drivers int badId = 0 ; for ( int i = averages . Count - 1 ; i >= averages . Count - numberOfDriversToShow ; i --) { Button newButton = new Button (); ( int avg , string driver ) data = averages [ i ]; pnlSlowest . Controls . Add ( newButton ); newButton . Size = new Size ( pnlFastest . Width , maxUiSize ); newButton . Location = new Point ( 0 , badId * maxUiSize ); newButton . Text = data . driver ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Name = data . driver + \"_slowest_\" + i ; newButton . Click += form1 . btnDriver_Click ; //We take the average time lost per lap newButton . Text += \" + \" + Reader . ConvertMsToTime ( Convert . ToInt32 ((( float ) data . avg - ( float ) averages [ 0 ]. avg ) / 5.0f )); badId ++; } } } /// /// Will add to the list of overtakes the different changes of position /// /// The listbox containing all the infos public void DisplayOvertakes ( ListBox lsbResult ) { //Note : This method SHOULD REALLY not do this but just return a string or a list of string with the new overtakes so the form can handle it as it wishes if ( LiveDriverDataLogs . Count > 1 ) { List < DriverData > oldList = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 2 ]; List < DriverData > newList = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]; for ( int i = 0 ; i < LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]. Count ; i ++) { if ( oldList [ i ]. Name != newList [ i ]. Name ) { //There has been a change in the standings for ( int y = 0 ; y < oldList . Count ; y ++) { if ( newList [ y ]. Name == oldList [ i ]. Name ) { //We found its new location if ( y > i ) { //The driver overtook someone lsbResult . Items . Add ( newList [ y ]. Name + \" climbed to \" + y ); } else { //The driver got overtook by someone lsbResult . Items . Add ( newList [ y ]. Name + \" fell to \" + y ); } } } } } } } /// /// Displays a messageBox containing the infos about a lap time /// /// The name of the driver that has done the lapTime /// The number of the lap on wich the lapTime has been set (CAUTION ITS NOT THE RACING LAP ITS FROM THE DB) /// The time (in ms) of the lap public void DisplayLapTimeInfos ( string driverName , int Lap , string LapTime ) { List < int > sectors = Storage . GetSectorsFromLapTime ( driverName , Lap ); string message = \"Lap time infos\" + Environment . NewLine ; message += LapTime + Environment . NewLine ; if ( sectors . Count > 0 ) message += \"Sector 1 : \" + Reader . ConvertMsToTime ( sectors [ 0 ]) + Environment . NewLine ; if ( sectors . Count > 1 ) message += \"Sector 2 : \" + Reader . ConvertMsToTime ( sectors [ 1 ]) + Environment . NewLine ; if ( sectors . Count > 2 ) message += \"Sector 3 : \" + Reader . ConvertMsToTime ( sectors [ 2 ]) + Environment . NewLine ; MessageBox . Show ( message ); } /// /// Displays the live ranking with the names of the drivers and their gap to the leader in the right order /// /// The control that will host all the new controls /// The main form public void DisplayLiveRanking ( Panel pnl , Main form1 ) { if ( LiveDriverDataLogs . Count > 0 ) { pnl . Controls . Clear (); //Gets the last item that should be the most recent data List < DriverData > liveData = LiveDriverDataLogs [ LiveDriverDataLogs . Count - 1 ]; Button [] buttons = new Button [ liveData . Count ]; Size buttonDimensions = new Size ( pnl . Width , pnl . Height / liveData . Count ); for ( int driverCount = 0 ; driverCount < liveData . Count ; driverCount ++) { Button newButton = new Button (); newButton . Size = buttonDimensions ; newButton . Location = new Point ( 0 , driverCount * buttonDimensions . Height ); newButton . FlatStyle = FlatStyle . Popup ; DriverData driver = liveData [ driverCount ]; if ( driver . Position == - 1 ) { //Its a DNF newButton . Enabled = false ; } if ( driver . Position > 1 ) { newButton . Text = driver . Name + \" +\" + Reader . ConvertMsToTime ( driver . GapToLeader ); } else { newButton . Text = driver . Name ; } newButton . Name = liveData [ driverCount ]. Name ; newButton . TextAlign = ContentAlignment . MiddleLeft ; newButton . FlatStyle = FlatStyle . Popup ; newButton . Click += form1 . btnDriver_Click ; buttons [ driverCount ] = newButton ; } //Note : It could be better to have this directly in the same loop foreach ( Button button in buttons ) { pnl . Controls . Add ( button ); } } } } }","title":"DataWrapper.cs"},{"location":"Code/DriverDrsWindow.html","text":"DriverDrsWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverDrsWindow.cs /// Brief : Window containing DRS related method and infos /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Drawing.Imaging ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using Tesseract ; namespace TrackTrends { public class DriverDrsWindow : Window { private static int EmptyDrsGreenValue = - 1 ; private static Random rnd = new Random (); public DriverDrsWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"DRS\" ; } /// /// Method that will decode the content of the window /// /// returns a boolean (true = DRS OPEN, false = DRS CLOSED) public override object DecodePng () { bool result = false ; //DEBUG //WindowImage.Save(\"./DRS/\"+rnd.Next(0,99999)+\".png\"); int greenValue = GetGreenPixels (); if ( EmptyDrsGreenValue == - 1 ) EmptyDrsGreenValue = greenValue ; if ( greenValue > EmptyDrsGreenValue + EmptyDrsGreenValue / 100 * 30 ) result = true ; return result ; } /// /// Method that will get the green pixel proportion in the image, this can be used to determin if the DRS has been actuated /// /// The number of clearely green pixels private unsafe int GetGreenPixels () { int tot = 0 ; Bitmap bmp = WindowImage ; Rectangle rect = new Rectangle ( 0 , 0 , bmp . Width , bmp . Height ); BitmapData bmpData = bmp . LockBits ( rect , ImageLockMode . ReadOnly , bmp . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( bmp . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < bmp . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmp . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; if ( green > blue * 1.5 && green > red * 1.5 ) { tot ++; } } } } bmp . UnlockBits ( bmpData ); return tot ; } /// /// This method is used to lock on where exactly the DRS window is /// /// Returns a rectangle containing the DRS public Rectangle GetBox () { var tessImage = Pix . LoadFromMemory ( ImageToByte ( WindowImage )); Engine . SetVariable ( \"tessedit_char_whitelist\" , \"\" ); Page page = Engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; // Get the bounding box for the current element if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { page . Dispose (); return new Rectangle ( boundingBox . X1 , boundingBox . X2 , boundingBox . Width , boundingBox . Height ); } } while ( iter . Next ( PageIteratorLevel . Word )); page . Dispose (); return new Rectangle ( 0 , 0 , 0 , 0 ); } } } }","title":"DriverDrsWindow.cs"},{"location":"Code/DriverDrsWindow.html#driverdrswindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverDrsWindow.cs /// Brief : Window containing DRS related method and infos /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Drawing ; using System.Drawing.Imaging ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using Tesseract ; namespace TrackTrends { public class DriverDrsWindow : Window { private static int EmptyDrsGreenValue = - 1 ; private static Random rnd = new Random (); public DriverDrsWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"DRS\" ; } /// /// Method that will decode the content of the window /// /// returns a boolean (true = DRS OPEN, false = DRS CLOSED) public override object DecodePng () { bool result = false ; //DEBUG //WindowImage.Save(\"./DRS/\"+rnd.Next(0,99999)+\".png\"); int greenValue = GetGreenPixels (); if ( EmptyDrsGreenValue == - 1 ) EmptyDrsGreenValue = greenValue ; if ( greenValue > EmptyDrsGreenValue + EmptyDrsGreenValue / 100 * 30 ) result = true ; return result ; } /// /// Method that will get the green pixel proportion in the image, this can be used to determin if the DRS has been actuated /// /// The number of clearely green pixels private unsafe int GetGreenPixels () { int tot = 0 ; Bitmap bmp = WindowImage ; Rectangle rect = new Rectangle ( 0 , 0 , bmp . Width , bmp . Height ); BitmapData bmpData = bmp . LockBits ( rect , ImageLockMode . ReadOnly , bmp . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( bmp . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < bmp . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmp . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; if ( green > blue * 1.5 && green > red * 1.5 ) { tot ++; } } } } bmp . UnlockBits ( bmpData ); return tot ; } /// /// This method is used to lock on where exactly the DRS window is /// /// Returns a rectangle containing the DRS public Rectangle GetBox () { var tessImage = Pix . LoadFromMemory ( ImageToByte ( WindowImage )); Engine . SetVariable ( \"tessedit_char_whitelist\" , \"\" ); Page page = Engine . Process ( tessImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { Rect boundingBox ; // Get the bounding box for the current element if ( iter . TryGetBoundingBox ( PageIteratorLevel . Word , out boundingBox )) { page . Dispose (); return new Rectangle ( boundingBox . X1 , boundingBox . X2 , boundingBox . Width , boundingBox . Height ); } } while ( iter . Next ( PageIteratorLevel . Word )); page . Dispose (); return new Rectangle ( 0 , 0 , 0 , 0 ); } } } }","title":"DriverDrsWindow.cs"},{"location":"Code/DriverLapTimeWindow.html","text":"DriverLapTimeWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverLapTimeWindow /// Brief : Window containing infos about the lap time of a driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverLapTimeWindow : Window { public DriverLapTimeWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"LapTime\" ; } /// /// Decodes the lap time contained in the image using OCR Tesseract /// /// The laptime in int (ms) public override object DecodePng () { int result = GetTimeFromPng ( WindowImage , OcrImage . WindowType . LapTime , Engine ); return result ; } } }","title":"DriverLapTimeWindow.cs"},{"location":"Code/DriverLapTimeWindow.html#driverlaptimewindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverLapTimeWindow /// Brief : Window containing infos about the lap time of a driver /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverLapTimeWindow : Window { public DriverLapTimeWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"LapTime\" ; } /// /// Decodes the lap time contained in the image using OCR Tesseract /// /// The laptime in int (ms) public override object DecodePng () { int result = GetTimeFromPng ( WindowImage , OcrImage . WindowType . LapTime , Engine ); return result ; } } }","title":"DriverLapTimeWindow.cs"},{"location":"Code/DriverPositionWindow.html","text":"DriverPositionWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverPositionWindow.cs /// Brief : Window containing infos about the position of a driver. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverPositionWindow : Window { public DriverPositionWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Position\" ; } /// /// Decodes the position number using Tesseract OCR /// /// An int representing the position of the driver (should be between 1 and 20 included) public override object DecodePng () { string ocrResult = GetStringFromPng ( WindowImage , Engine , \"0123456789\" ); int position ; try { position = Convert . ToInt32 ( ocrResult ); } catch { position = - 1 ; } return position ; } } }","title":"DriverPositionWindow.cs"},{"location":"Code/DriverPositionWindow.html#driverpositionwindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverPositionWindow.cs /// Brief : Window containing infos about the position of a driver. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverPositionWindow : Window { public DriverPositionWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Position\" ; } /// /// Decodes the position number using Tesseract OCR /// /// An int representing the position of the driver (should be between 1 and 20 included) public override object DecodePng () { string ocrResult = GetStringFromPng ( WindowImage , Engine , \"0123456789\" ); int position ; try { position = Convert . ToInt32 ( ocrResult ); } catch { position = - 1 ; } return position ; } } }","title":"DriverPositionWindow.cs"},{"location":"Code/DriverTyresWindow.html","text":"DriverTyresWindow.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverTyresWindow.cs /// Brief : Window containing infos about a driver's tyre /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverTyresWindow : Window { private static Random rnd = new Random (); //Those are the colors I found but you can change them if they change in the future like in 2019 public static Color SOFT_TYRE_COLOR = Color . FromArgb ( 0 xff , 0 x00 , 0 x00 ); public static Color MEDIUM_TYRE_COLOR = Color . FromArgb ( 0 xf5 , 0 xbf , 0 x00 ); public static Color HARD_TYRE_COLOR = Color . FromArgb ( 0 xa4 , 0 xa5 , 0 xa8 ); public static Color INTER_TYRE_COLOR = Color . FromArgb ( 0 x00 , 0 xa4 , 0 x2e ); public static Color WET_TYRE_COLOR = Color . FromArgb ( 0 x27 , 0 x60 , 0 xa6 ); public static Color EMPTY_COLOR = Color . FromArgb ( 0 x20 , 0 x20 , 0 x20 ); public DriverTyresWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Tyres\" ; } /// /// This will decode the content of the image /// /// And object containing what was on the image public override object DecodePng () { return GetTyreInfos (); } /// /// Method that will decode whats on the image and return the tyre infos it could manage to recover /// /// A tyre object containing tyre infos private Tyre GetTyreInfos () { //DEBUG //WindowImage.Save(\"./Tyre/raw_\"+rnd.Next(0,99999)+\".png\"); Bitmap tyreZone = GetSmallBitmapFromBigOne ( WindowImage , FindTyreZone ()); Tyre . Type type = Tyre . Type . Undefined ; type = GetTyreTypeFromColor ( OcrImage . GetAvgColorFromBitmap ( tyreZone )); int laps = - 1 ; string number = GetStringFromPng ( tyreZone , Engine , \"0123456789\" , OcrImage . WindowType . Tyre ); try { laps = Convert . ToInt32 ( number ); } catch { //We could not convert the number so its a letter so its 0 laps old laps = 0 ; } //71 is the most laps an f1 race is ever going to have (mexico) so any more would be considered as bad (and remember you cant go trough a full race without making at least one pitstop) if ( laps > 75 ) laps = 0 ; return new Tyre ( type , laps ); } /// /// Finds where the important part of the image is /// /// A rectangle containing position and dimensions of the important part of the image private Rectangle FindTyreZone () { Bitmap bmp = WindowImage ; int currentPosition = bmp . Width ; int height = bmp . Height / 2 ; Color limitColor = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Color currentColor = Color . FromArgb ( 0 , 0 , 0 ); //25F Size newWindowSize = new Size ( bmp . Height - Convert . ToInt32 (( float ) bmp . Height / 100f * 25f ), bmp . Height - Convert . ToInt32 (( float ) bmp . Height / 100f * 35f )); while ( currentColor . R <= limitColor . R && currentColor . G <= limitColor . G && currentColor . B <= limitColor . B && currentPosition > 0 ) { currentPosition --; currentColor = bmp . GetPixel ( currentPosition , height ); } //Its here to let the new window include a little bit of the right int CorrectedX = currentPosition - ( newWindowSize . Width ) + Convert . ToInt32 (( float ) newWindowSize . Width / 100f * 10f ); int CorrectedY = Convert . ToInt32 (( float ) newWindowSize . Height / 100f * 35f ); if ( CorrectedX <= 0 ) return new Rectangle ( 0 , 0 , newWindowSize . Width , newWindowSize . Height ); return new Rectangle ( CorrectedX , CorrectedY , newWindowSize . Width , newWindowSize . Height ); } //This method has been created with the help of chatGPT /// /// Methods that compares a list of colors to see wich is the closest from the input color and decide wich tyre type it is /// /// The color that you found /// The tyre type public Tyre . Type GetTyreTypeFromColor ( Color inputColor ) { Tyre . Type type = Tyre . Type . Undefined ; List < Color > colors = new List < Color >(); //dont forget that if for some reason someday F1 adds a new Tyre type you will need to add it in the constants but also here in the list //You will also need to add it below in the Tyre object's enum and add an if in the end of this method colors . Add ( SOFT_TYRE_COLOR ); colors . Add ( MEDIUM_TYRE_COLOR ); colors . Add ( HARD_TYRE_COLOR ); colors . Add ( INTER_TYRE_COLOR ); colors . Add ( WET_TYRE_COLOR ); colors . Add ( EMPTY_COLOR ); Color closestColor = colors [ 0 ]; int closestDistance = int . MaxValue ; foreach ( Color color in colors ) { int distance = Math . Abs ( color . R - inputColor . R ) + Math . Abs ( color . G - inputColor . G ) + Math . Abs ( color . B - inputColor . B ); if ( distance < closestDistance ) { closestColor = color ; closestDistance = distance ; } } //We cant use a switch as the colors cant be constants ... if ( closestColor == SOFT_TYRE_COLOR ) type = Tyre . Type . Soft ; if ( closestColor == MEDIUM_TYRE_COLOR ) type = Tyre . Type . Medium ; if ( closestColor == HARD_TYRE_COLOR ) type = Tyre . Type . Hard ; if ( closestColor == INTER_TYRE_COLOR ) type = Tyre . Type . Inter ; if ( closestColor == WET_TYRE_COLOR ) type = Tyre . Type . Wet ; if ( closestColor == EMPTY_COLOR ) return Tyre . Type . Undefined ; return type ; } } }","title":"DriverTyresWindow.cs"},{"location":"Code/DriverTyresWindow.html#drivertyreswindowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : DriverTyresWindow.cs /// Brief : Window containing infos about a driver's tyre /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; namespace TrackTrends { public class DriverTyresWindow : Window { private static Random rnd = new Random (); //Those are the colors I found but you can change them if they change in the future like in 2019 public static Color SOFT_TYRE_COLOR = Color . FromArgb ( 0 xff , 0 x00 , 0 x00 ); public static Color MEDIUM_TYRE_COLOR = Color . FromArgb ( 0 xf5 , 0 xbf , 0 x00 ); public static Color HARD_TYRE_COLOR = Color . FromArgb ( 0 xa4 , 0 xa5 , 0 xa8 ); public static Color INTER_TYRE_COLOR = Color . FromArgb ( 0 x00 , 0 xa4 , 0 x2e ); public static Color WET_TYRE_COLOR = Color . FromArgb ( 0 x27 , 0 x60 , 0 xa6 ); public static Color EMPTY_COLOR = Color . FromArgb ( 0 x20 , 0 x20 , 0 x20 ); public DriverTyresWindow ( Bitmap image , Rectangle bounds , bool generateEngine = true ) : base ( image , bounds , generateEngine ) { Name = \"Tyres\" ; } /// /// This will decode the content of the image /// /// And object containing what was on the image public override object DecodePng () { return GetTyreInfos (); } /// /// Method that will decode whats on the image and return the tyre infos it could manage to recover /// /// A tyre object containing tyre infos private Tyre GetTyreInfos () { //DEBUG //WindowImage.Save(\"./Tyre/raw_\"+rnd.Next(0,99999)+\".png\"); Bitmap tyreZone = GetSmallBitmapFromBigOne ( WindowImage , FindTyreZone ()); Tyre . Type type = Tyre . Type . Undefined ; type = GetTyreTypeFromColor ( OcrImage . GetAvgColorFromBitmap ( tyreZone )); int laps = - 1 ; string number = GetStringFromPng ( tyreZone , Engine , \"0123456789\" , OcrImage . WindowType . Tyre ); try { laps = Convert . ToInt32 ( number ); } catch { //We could not convert the number so its a letter so its 0 laps old laps = 0 ; } //71 is the most laps an f1 race is ever going to have (mexico) so any more would be considered as bad (and remember you cant go trough a full race without making at least one pitstop) if ( laps > 75 ) laps = 0 ; return new Tyre ( type , laps ); } /// /// Finds where the important part of the image is /// /// A rectangle containing position and dimensions of the important part of the image private Rectangle FindTyreZone () { Bitmap bmp = WindowImage ; int currentPosition = bmp . Width ; int height = bmp . Height / 2 ; Color limitColor = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Color currentColor = Color . FromArgb ( 0 , 0 , 0 ); //25F Size newWindowSize = new Size ( bmp . Height - Convert . ToInt32 (( float ) bmp . Height / 100f * 25f ), bmp . Height - Convert . ToInt32 (( float ) bmp . Height / 100f * 35f )); while ( currentColor . R <= limitColor . R && currentColor . G <= limitColor . G && currentColor . B <= limitColor . B && currentPosition > 0 ) { currentPosition --; currentColor = bmp . GetPixel ( currentPosition , height ); } //Its here to let the new window include a little bit of the right int CorrectedX = currentPosition - ( newWindowSize . Width ) + Convert . ToInt32 (( float ) newWindowSize . Width / 100f * 10f ); int CorrectedY = Convert . ToInt32 (( float ) newWindowSize . Height / 100f * 35f ); if ( CorrectedX <= 0 ) return new Rectangle ( 0 , 0 , newWindowSize . Width , newWindowSize . Height ); return new Rectangle ( CorrectedX , CorrectedY , newWindowSize . Width , newWindowSize . Height ); } //This method has been created with the help of chatGPT /// /// Methods that compares a list of colors to see wich is the closest from the input color and decide wich tyre type it is /// /// The color that you found /// The tyre type public Tyre . Type GetTyreTypeFromColor ( Color inputColor ) { Tyre . Type type = Tyre . Type . Undefined ; List < Color > colors = new List < Color >(); //dont forget that if for some reason someday F1 adds a new Tyre type you will need to add it in the constants but also here in the list //You will also need to add it below in the Tyre object's enum and add an if in the end of this method colors . Add ( SOFT_TYRE_COLOR ); colors . Add ( MEDIUM_TYRE_COLOR ); colors . Add ( HARD_TYRE_COLOR ); colors . Add ( INTER_TYRE_COLOR ); colors . Add ( WET_TYRE_COLOR ); colors . Add ( EMPTY_COLOR ); Color closestColor = colors [ 0 ]; int closestDistance = int . MaxValue ; foreach ( Color color in colors ) { int distance = Math . Abs ( color . R - inputColor . R ) + Math . Abs ( color . G - inputColor . G ) + Math . Abs ( color . B - inputColor . B ); if ( distance < closestDistance ) { closestColor = color ; closestDistance = distance ; } } //We cant use a switch as the colors cant be constants ... if ( closestColor == SOFT_TYRE_COLOR ) type = Tyre . Type . Soft ; if ( closestColor == MEDIUM_TYRE_COLOR ) type = Tyre . Type . Medium ; if ( closestColor == HARD_TYRE_COLOR ) type = Tyre . Type . Hard ; if ( closestColor == INTER_TYRE_COLOR ) type = Tyre . Type . Inter ; if ( closestColor == WET_TYRE_COLOR ) type = Tyre . Type . Wet ; if ( closestColor == EMPTY_COLOR ) return Tyre . Type . Undefined ; return type ; } } }","title":"DriverTyresWindow.cs"},{"location":"Code/OcrImage.html","text":"OcrImage.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : OcrImage.cs /// Brief : Class containing all the methods used to enhance images for OCR /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Threading.Tasks ; using System.Drawing ; using System.Drawing.Drawing2D ; using System.Drawing.Imaging ; namespace TrackTrends { public class OcrImage { //this is a hardcoded value based on the colors of the F1TV data channel background you can change it if sometime in the future the color changes //Any color that has any of its R,G or B channel higher than the treshold will be considered as being usefull information public static Color F1TV_BACKGROUND_TRESHOLD = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Bitmap InputBitmap ; public enum WindowType { LapTime , Text , Sector , Gap , Tyre , } /// /// Create a new Ocr image to help enhance the given bitmap for OCR /// /// The image you want to enhance public OcrImage ( Bitmap inputBitmap ) { InputBitmap = inputBitmap ; } /// /// Enhances the image depending on wich type of window the image comes from /// /// The type of the window. Depending on it different enhancing features will be applied /// The enhanced Bitmap public Bitmap Enhance ( WindowType type = WindowType . Text ) { Bitmap outputBitmap = ( Bitmap ) InputBitmap . Clone (); //Note : If you plan to activate all the comments that I used to debug the OCR I would advise to make sure that the debug folder exists switch ( type ) { case WindowType . Gap : //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 165 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\treshold_\" + id + \".png\"); outputBitmap = Resize ( outputBitmap , 2 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\resize_\" + id + \".png\"); outputBitmap = Dilatation ( outputBitmap , 1 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\Final_dilatation_\" + id + \".png\"); break ; case WindowType . Sector : //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = VanishOxyAction ( outputBitmap ); //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\vanish_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 150 ); //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\Final_treshold_\" + id + \".png\"); break ; case WindowType . LapTime : //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 185 ); //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\Treshold_\" + id + \".png\"); outputBitmap = SobelEdgeDetection ( outputBitmap ); //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\SobelDetection_\" + id + \".png\"); break ; case WindowType . Text : //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 165 ); //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @\"\\Final_treshold_\" + id + \".png\"); break ; case WindowType . Tyre : //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = RemoveUseless ( outputBitmap ); //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\uselessRemoved_\" + id + \".png\"); outputBitmap = Dilatation ( outputBitmap , 1 ); //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\Final_dilatation_\" + id + \".png\"); break ; default : outputBitmap = Tresholding ( outputBitmap , 165 ); outputBitmap = Resize ( outputBitmap , 2 ); outputBitmap = Erode ( outputBitmap , 1 ); break ; } return outputBitmap ; } /// /// Method that convert a colored RGB bitmap into a GrayScale image /// /// The Bitmap you want to convert /// The bitmap in grayscale public static Bitmap Grayscale ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); //This is not a proper treshold method but it is helping the sobel edge detection if ( gray <= F1TV_BACKGROUND_TRESHOLD . R ) { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } else { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) gray ; } } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that uses the Sobel Edge detection to outline the edges of the characters to help with the OCR /// /// The image with the sobel edge detection used /// private Bitmap SobelEdgeDetection ( Bitmap grayscaleImage ) { // Create a new bitmap for the edges Bitmap edgesImage = new Bitmap ( grayscaleImage . Width , grayscaleImage . Height ); // Define the Sobel operators // Its just a matrix that we will use on the all image int [,] sobelX = { { - 1 , 0 , 1 }, { - 2 , 0 , 2 }, { - 1 , 0 , 1 } }; int [,] sobelY = { { - 1 , - 2 , - 1 }, { 0 , 0 , 0 }, { 1 , 2 , 1 } }; // Apply the Sobel operators and normalize the gradients // NOTE: I dont know how easy or hard it would be to make this paralel but it could be a good idea to do so if possible. for ( int y = 1 ; y < grayscaleImage . Height - 1 ; y ++) { for ( int x = 1 ; x < grayscaleImage . Width - 1 ; x ++) { int gradientX = CalculateGradient ( grayscaleImage , sobelX , x , y ); int gradientY = CalculateGradient ( grayscaleImage , sobelY , x , y ); int gradient = ( int ) Math . Sqrt ( gradientX * gradientX + gradientY * gradientY ); // Normalize the gradient value // In some rare cases the value can exceed 255 so we limit it with the Math.Min method gradient = Math . Min ( 255 , Math . Max ( 0 , gradient )); edgesImage . SetPixel ( x , y , Color . FromArgb ( gradient , gradient , gradient )); } } return edgesImage ; } /// /// Method that's here to be used by the sobel edge detection method (Chat GPT has been used for parts of this method) /// /// The input image with the grayscale processing already done /// The matrix to apply /// /// /// Returns the processed gradient private int CalculateGradient ( Bitmap grayscaleImage , int [,] sobelOperator , int x , int y ) { int gradient = 0 ; for ( int j = - 1 ; j <= 1 ; j ++) { for ( int i = - 1 ; i <= 1 ; i ++) { int pixelX = grayscaleImage . GetPixel ( x + i , y + j ). R ; gradient += sobelOperator [ j + 1 , i + 1 ] * pixelX ; } } return gradient ; } /// /// Method that is used to whiten an image. Ignore the funny name. Its used to prevent colored text to trouble the OCR when it uses grayscaling /// /// The bitmap to vanish /// public static Bitmap VanishOxyAction ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { //Note : MAKE THIS PARALELL OMG WY DID I LEFT IT LIKE THAT byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int blue = ( int ) pixel [ 0 ]; int green = ( int ) pixel [ 1 ]; int red = ( int ) pixel [ 2 ]; int max = Math . Max ( Math . Max ( blue , green ), red ); if ( max > 255 / 3 ) max = 255 ; pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) max ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that binaries the input image up to a certain treshold given /// /// the bitmap you want to convert to binary colors /// The floor at wich the color is considered as white or black /// The binarised bitmap public static Bitmap Tresholding ( Bitmap inputBitmap , int threshold ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); int bmpHeight = inputBitmap . Height ; int bmpWidth = inputBitmap . Width ; Parallel . For ( 0 , bmpHeight , y => { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmpWidth ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); int value = gray < threshold ? 0 : 255 ; pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) value ; } }); } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that removes the pixels that are flagged as background /// /// The bitmap you want to remove the background from /// The Bitmap without the background public static Bitmap RemoveBG ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R <= F1TV_BACKGROUND_TRESHOLD . R && G <= F1TV_BACKGROUND_TRESHOLD . G && B <= F1TV_BACKGROUND_TRESHOLD . B ) pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that removes all the useless things from the image and returns hopefully only the numbers /// /// The bitmap you want to remove useless things from (Expects a cropped part of the TyreWindow) /// The bitmap with (hopefully) only the digits public unsafe static Bitmap RemoveUseless ( Bitmap inputBitmap ) { //Note you can use something else than a cropped tyre window but I would recommend checking the code first to see if it fits your intended use Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); List < int > pixelsToRemove = new List < int >(); bool fromBorder = true ; for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( fromBorder && B < F1TV_BACKGROUND_TRESHOLD . B && G < F1TV_BACKGROUND_TRESHOLD . G && R < F1TV_BACKGROUND_TRESHOLD . R ) { pixelsToRemove . Add ( x ); } else { if ( fromBorder ) { fromBorder = false ; pixelsToRemove . Add ( x ); } } } fromBorder = true ; for ( int x = inputBitmap . Width - 1 ; x > 0 ; x --) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( fromBorder && B < F1TV_BACKGROUND_TRESHOLD . B && G < F1TV_BACKGROUND_TRESHOLD . G && R < F1TV_BACKGROUND_TRESHOLD . R ) { pixelsToRemove . Add ( x ); } else { if ( fromBorder ) { fromBorder = false ; pixelsToRemove . Add ( x ); } } } foreach ( int pxPos in pixelsToRemove ) { byte * pixel = currentLine + ( pxPos * bytesPerPixel ); pixel [ 0 ] = 0 xFF ; pixel [ 1 ] = 0 xFF ; pixel [ 2 ] = 0 xFF ; } } //Removing the color parts for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R >= F1TV_BACKGROUND_TRESHOLD . R + 25 || G >= F1TV_BACKGROUND_TRESHOLD . G + 25 || B >= F1TV_BACKGROUND_TRESHOLD . B + 25 ) { pixel [ 0 ] = 0 xFF ; pixel [ 1 ] = 0 xFF ; pixel [ 2 ] = 0 xFF ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Recovers the average colors from the Image. NOTE : It wont take in account colors that are lower than the background /// /// The bitmap you want to get the average color from /// The average color of the bitmap public static Color GetAvgColorFromBitmap ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; int totR = 0 ; int totG = 0 ; int totB = 0 ; int totPixels = 1 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); int bmpHeight = inputBitmap . Height ; int bmpWidth = inputBitmap . Width ; Parallel . For ( 0 , bmpHeight , y => { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmpWidth ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R >= F1TV_BACKGROUND_TRESHOLD . R || G >= F1TV_BACKGROUND_TRESHOLD . G || B >= F1TV_BACKGROUND_TRESHOLD . B ) { totPixels ++; totB += pixel [ 0 ]; totG += pixel [ 1 ]; totR += pixel [ 2 ]; } } }); } inputBitmap . UnlockBits ( bmpData ); return Color . FromArgb ( 255 , Math . Min ( Convert . ToInt32 (( float ) totR / ( float ) totPixels ), 255 ), Math . Min ( Convert . ToInt32 (( float ) totG / ( float ) totPixels ), 255 ), Math . Min ( Convert . ToInt32 (( float ) totB / ( float ) totPixels ), 255 )); } /// /// This method simply inverts all the colors in a Bitmap /// /// the bitmap you want to invert the colors from /// The bitmap with inverted colors public static Bitmap InvertColors ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); pixel [ 0 ] = ( byte )( 255 - pixel [ 0 ]); pixel [ 1 ] = ( byte )( 255 - pixel [ 1 ]); pixel [ 2 ] = ( byte )( 255 - pixel [ 2 ]); } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Methods that applies Bicubic interpolation to increase the size and resolution of an image /// /// The bitmap you want to resize /// The factor of resizing you want to use. I recommend using even numbers /// The bitmap witht the new size public static Bitmap Resize ( Bitmap inputBitmap , int resizeFactor ) { var resultBitmap = new Bitmap ( inputBitmap . Width * resizeFactor , inputBitmap . Height * resizeFactor ); using ( var graphics = Graphics . FromImage ( resultBitmap )) { graphics . InterpolationMode = InterpolationMode . HighQualityBicubic ; graphics . DrawImage ( inputBitmap , new Rectangle ( 0 , 0 , resultBitmap . Width , resultBitmap . Height )); } return resultBitmap ; } /// /// method that Highlights the countours of a Bitmap /// /// The bitmap you want to highlight the countours of /// The bitmap with countours highlighted public static Bitmap HighlightContours ( Bitmap inputBitmap ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); Bitmap grayscale = Grayscale ( inputBitmap ); Bitmap thresholded = Tresholding ( grayscale , 128 ); Bitmap dilated = Dilatation ( thresholded , 3 ); Bitmap eroded = Erode ( dilated , 3 ); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { for ( int x = 0 ; x < inputBitmap . Width ; x ++) { Color pixel = inputBitmap . GetPixel ( x , y ); Color dilatedPixel = dilated . GetPixel ( x , y ); Color erodedPixel = eroded . GetPixel ( x , y ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); int threshold = dilatedPixel . R ; if ( gray > threshold ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } else if ( gray <= threshold && erodedPixel . R == 0 ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 0 , 0 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } } } return outputBitmap ; } /// /// Method that that erodes the morphology of a bitmap /// /// The bitmap you want to erode /// The amount of Erosion you want (be carefull its expensive on ressources) /// The Bitmap with the eroded contents public static Bitmap Erode ( Bitmap inputBitmap , int kernelSize ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); int [,] kernel = new int [ kernelSize , kernelSize ]; for ( int i = 0 ; i < kernelSize ; i ++) { for ( int j = 0 ; j < kernelSize ; j ++) { kernel [ i , j ] = 1 ; } } for ( int y = kernelSize / 2 ; y < inputBitmap . Height - kernelSize / 2 ; y ++) { for ( int x = kernelSize / 2 ; x < inputBitmap . Width - kernelSize / 2 ; x ++) { bool flag = true ; for ( int i = - kernelSize / 2 ; i <= kernelSize / 2 ; i ++) { for ( int j = - kernelSize / 2 ; j <= kernelSize / 2 ; j ++) { Color pixel = inputBitmap . GetPixel ( x + i , y + j ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); if ( gray >= 128 && kernel [ i + kernelSize / 2 , j + kernelSize / 2 ] == 1 ) { flag = false ; break ; } } if (! flag ) { break ; } } if ( flag ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } } } return outputBitmap ; } /// /// Method that that use dilatation of the morphology of a bitmap /// /// The bitmap you want to use dilatation on /// The amount of dilatation you want (be carefull its expensive on ressources) /// The Bitmap after Dilatation public static Bitmap Dilatation ( Bitmap inputBitmap , int kernelSize ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); int [,] kernel = new int [ kernelSize , kernelSize ]; for ( int i = 0 ; i < kernelSize ; i ++) { for ( int j = 0 ; j < kernelSize ; j ++) { kernel [ i , j ] = 1 ; } } for ( int y = kernelSize / 2 ; y < inputBitmap . Height - kernelSize / 2 ; y ++) { for ( int x = kernelSize / 2 ; x < inputBitmap . Width - kernelSize / 2 ; x ++) { bool flag = false ; for ( int i = - kernelSize / 2 ; i <= kernelSize / 2 ; i ++) { for ( int j = - kernelSize / 2 ; j <= kernelSize / 2 ; j ++) { Color pixel = inputBitmap . GetPixel ( x + i , y + j ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); if ( gray < 128 && kernel [ i + kernelSize / 2 , j + kernelSize / 2 ] == 1 ) { flag = true ; break ; } } if ( flag ) { break ; } } if ( flag ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } } } return outputBitmap ; } } }","title":"OcrImage.cs"},{"location":"Code/OcrImage.html#ocrimagecs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : OcrImage.cs /// Brief : Class containing all the methods used to enhance images for OCR /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Threading.Tasks ; using System.Drawing ; using System.Drawing.Drawing2D ; using System.Drawing.Imaging ; namespace TrackTrends { public class OcrImage { //this is a hardcoded value based on the colors of the F1TV data channel background you can change it if sometime in the future the color changes //Any color that has any of its R,G or B channel higher than the treshold will be considered as being usefull information public static Color F1TV_BACKGROUND_TRESHOLD = Color . FromArgb ( 0 x50 , 0 x50 , 0 x50 ); Bitmap InputBitmap ; public enum WindowType { LapTime , Text , Sector , Gap , Tyre , } /// /// Create a new Ocr image to help enhance the given bitmap for OCR /// /// The image you want to enhance public OcrImage ( Bitmap inputBitmap ) { InputBitmap = inputBitmap ; } /// /// Enhances the image depending on wich type of window the image comes from /// /// The type of the window. Depending on it different enhancing features will be applied /// The enhanced Bitmap public Bitmap Enhance ( WindowType type = WindowType . Text ) { Bitmap outputBitmap = ( Bitmap ) InputBitmap . Clone (); //Note : If you plan to activate all the comments that I used to debug the OCR I would advise to make sure that the debug folder exists switch ( type ) { case WindowType . Gap : //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 165 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\treshold_\" + id + \".png\"); outputBitmap = Resize ( outputBitmap , 2 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\resize_\" + id + \".png\"); outputBitmap = Dilatation ( outputBitmap , 1 ); //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @\"\\Final_dilatation_\" + id + \".png\"); break ; case WindowType . Sector : //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = VanishOxyAction ( outputBitmap ); //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\vanish_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 150 ); //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @\"\\Final_treshold_\" + id + \".png\"); break ; case WindowType . LapTime : //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 185 ); //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\Treshold_\" + id + \".png\"); outputBitmap = SobelEdgeDetection ( outputBitmap ); //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @\"\\SobelDetection_\" + id + \".png\"); break ; case WindowType . Text : //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = Tresholding ( outputBitmap , 165 ); //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @\"\\Final_treshold_\" + id + \".png\"); break ; case WindowType . Tyre : //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\raw_\" + id + \".png\"); outputBitmap = RemoveUseless ( outputBitmap ); //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\uselessRemoved_\" + id + \".png\"); outputBitmap = Dilatation ( outputBitmap , 1 ); //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @\"\\Final_dilatation_\" + id + \".png\"); break ; default : outputBitmap = Tresholding ( outputBitmap , 165 ); outputBitmap = Resize ( outputBitmap , 2 ); outputBitmap = Erode ( outputBitmap , 1 ); break ; } return outputBitmap ; } /// /// Method that convert a colored RGB bitmap into a GrayScale image /// /// The Bitmap you want to convert /// The bitmap in grayscale public static Bitmap Grayscale ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); //This is not a proper treshold method but it is helping the sobel edge detection if ( gray <= F1TV_BACKGROUND_TRESHOLD . R ) { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } else { pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) gray ; } } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that uses the Sobel Edge detection to outline the edges of the characters to help with the OCR /// /// The image with the sobel edge detection used /// private Bitmap SobelEdgeDetection ( Bitmap grayscaleImage ) { // Create a new bitmap for the edges Bitmap edgesImage = new Bitmap ( grayscaleImage . Width , grayscaleImage . Height ); // Define the Sobel operators // Its just a matrix that we will use on the all image int [,] sobelX = { { - 1 , 0 , 1 }, { - 2 , 0 , 2 }, { - 1 , 0 , 1 } }; int [,] sobelY = { { - 1 , - 2 , - 1 }, { 0 , 0 , 0 }, { 1 , 2 , 1 } }; // Apply the Sobel operators and normalize the gradients // NOTE: I dont know how easy or hard it would be to make this paralel but it could be a good idea to do so if possible. for ( int y = 1 ; y < grayscaleImage . Height - 1 ; y ++) { for ( int x = 1 ; x < grayscaleImage . Width - 1 ; x ++) { int gradientX = CalculateGradient ( grayscaleImage , sobelX , x , y ); int gradientY = CalculateGradient ( grayscaleImage , sobelY , x , y ); int gradient = ( int ) Math . Sqrt ( gradientX * gradientX + gradientY * gradientY ); // Normalize the gradient value // In some rare cases the value can exceed 255 so we limit it with the Math.Min method gradient = Math . Min ( 255 , Math . Max ( 0 , gradient )); edgesImage . SetPixel ( x , y , Color . FromArgb ( gradient , gradient , gradient )); } } return edgesImage ; } /// /// Method that's here to be used by the sobel edge detection method (Chat GPT has been used for parts of this method) /// /// The input image with the grayscale processing already done /// The matrix to apply /// /// /// Returns the processed gradient private int CalculateGradient ( Bitmap grayscaleImage , int [,] sobelOperator , int x , int y ) { int gradient = 0 ; for ( int j = - 1 ; j <= 1 ; j ++) { for ( int i = - 1 ; i <= 1 ; i ++) { int pixelX = grayscaleImage . GetPixel ( x + i , y + j ). R ; gradient += sobelOperator [ j + 1 , i + 1 ] * pixelX ; } } return gradient ; } /// /// Method that is used to whiten an image. Ignore the funny name. Its used to prevent colored text to trouble the OCR when it uses grayscaling /// /// The bitmap to vanish /// public static Bitmap VanishOxyAction ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { //Note : MAKE THIS PARALELL OMG WY DID I LEFT IT LIKE THAT byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int blue = ( int ) pixel [ 0 ]; int green = ( int ) pixel [ 1 ]; int red = ( int ) pixel [ 2 ]; int max = Math . Max ( Math . Max ( blue , green ), red ); if ( max > 255 / 3 ) max = 255 ; pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) max ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that binaries the input image up to a certain treshold given /// /// the bitmap you want to convert to binary colors /// The floor at wich the color is considered as white or black /// The binarised bitmap public static Bitmap Tresholding ( Bitmap inputBitmap , int threshold ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); int bmpHeight = inputBitmap . Height ; int bmpWidth = inputBitmap . Width ; Parallel . For ( 0 , bmpHeight , y => { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmpWidth ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); byte blue = pixel [ 0 ]; byte green = pixel [ 1 ]; byte red = pixel [ 2 ]; //Those a specific values to correct the weights so its more pleasing to the human eye int gray = ( int )( red * 0.3 + green * 0.59 + blue * 0.11 ); int value = gray < threshold ? 0 : 255 ; pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = ( byte ) value ; } }); } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that removes the pixels that are flagged as background /// /// The bitmap you want to remove the background from /// The Bitmap without the background public static Bitmap RemoveBG ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R <= F1TV_BACKGROUND_TRESHOLD . R && G <= F1TV_BACKGROUND_TRESHOLD . G && B <= F1TV_BACKGROUND_TRESHOLD . B ) pixel [ 0 ] = pixel [ 1 ] = pixel [ 2 ] = 0 ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Method that removes all the useless things from the image and returns hopefully only the numbers /// /// The bitmap you want to remove useless things from (Expects a cropped part of the TyreWindow) /// The bitmap with (hopefully) only the digits public unsafe static Bitmap RemoveUseless ( Bitmap inputBitmap ) { //Note you can use something else than a cropped tyre window but I would recommend checking the code first to see if it fits your intended use Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); List < int > pixelsToRemove = new List < int >(); bool fromBorder = true ; for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( fromBorder && B < F1TV_BACKGROUND_TRESHOLD . B && G < F1TV_BACKGROUND_TRESHOLD . G && R < F1TV_BACKGROUND_TRESHOLD . R ) { pixelsToRemove . Add ( x ); } else { if ( fromBorder ) { fromBorder = false ; pixelsToRemove . Add ( x ); } } } fromBorder = true ; for ( int x = inputBitmap . Width - 1 ; x > 0 ; x --) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( fromBorder && B < F1TV_BACKGROUND_TRESHOLD . B && G < F1TV_BACKGROUND_TRESHOLD . G && R < F1TV_BACKGROUND_TRESHOLD . R ) { pixelsToRemove . Add ( x ); } else { if ( fromBorder ) { fromBorder = false ; pixelsToRemove . Add ( x ); } } } foreach ( int pxPos in pixelsToRemove ) { byte * pixel = currentLine + ( pxPos * bytesPerPixel ); pixel [ 0 ] = 0 xFF ; pixel [ 1 ] = 0 xFF ; pixel [ 2 ] = 0 xFF ; } } //Removing the color parts for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R >= F1TV_BACKGROUND_TRESHOLD . R + 25 || G >= F1TV_BACKGROUND_TRESHOLD . G + 25 || B >= F1TV_BACKGROUND_TRESHOLD . B + 25 ) { pixel [ 0 ] = 0 xFF ; pixel [ 1 ] = 0 xFF ; pixel [ 2 ] = 0 xFF ; } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Recovers the average colors from the Image. NOTE : It wont take in account colors that are lower than the background /// /// The bitmap you want to get the average color from /// The average color of the bitmap public static Color GetAvgColorFromBitmap ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; int totR = 0 ; int totG = 0 ; int totB = 0 ; int totPixels = 1 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); int bmpHeight = inputBitmap . Height ; int bmpWidth = inputBitmap . Width ; Parallel . For ( 0 , bmpHeight , y => { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < bmpWidth ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); int B = pixel [ 0 ]; int G = pixel [ 1 ]; int R = pixel [ 2 ]; if ( R >= F1TV_BACKGROUND_TRESHOLD . R || G >= F1TV_BACKGROUND_TRESHOLD . G || B >= F1TV_BACKGROUND_TRESHOLD . B ) { totPixels ++; totB += pixel [ 0 ]; totG += pixel [ 1 ]; totR += pixel [ 2 ]; } } }); } inputBitmap . UnlockBits ( bmpData ); return Color . FromArgb ( 255 , Math . Min ( Convert . ToInt32 (( float ) totR / ( float ) totPixels ), 255 ), Math . Min ( Convert . ToInt32 (( float ) totG / ( float ) totPixels ), 255 ), Math . Min ( Convert . ToInt32 (( float ) totB / ( float ) totPixels ), 255 )); } /// /// This method simply inverts all the colors in a Bitmap /// /// the bitmap you want to invert the colors from /// The bitmap with inverted colors public static Bitmap InvertColors ( Bitmap inputBitmap ) { Rectangle rect = new Rectangle ( 0 , 0 , inputBitmap . Width , inputBitmap . Height ); BitmapData bmpData = inputBitmap . LockBits ( rect , ImageLockMode . ReadWrite , inputBitmap . PixelFormat ); int bytesPerPixel = Bitmap . GetPixelFormatSize ( inputBitmap . PixelFormat ) / 8 ; unsafe { byte * ptr = ( byte *) bmpData . Scan0 . ToPointer (); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { byte * currentLine = ptr + ( y * bmpData . Stride ); for ( int x = 0 ; x < inputBitmap . Width ; x ++) { byte * pixel = currentLine + ( x * bytesPerPixel ); pixel [ 0 ] = ( byte )( 255 - pixel [ 0 ]); pixel [ 1 ] = ( byte )( 255 - pixel [ 1 ]); pixel [ 2 ] = ( byte )( 255 - pixel [ 2 ]); } } } inputBitmap . UnlockBits ( bmpData ); return inputBitmap ; } /// /// Methods that applies Bicubic interpolation to increase the size and resolution of an image /// /// The bitmap you want to resize /// The factor of resizing you want to use. I recommend using even numbers /// The bitmap witht the new size public static Bitmap Resize ( Bitmap inputBitmap , int resizeFactor ) { var resultBitmap = new Bitmap ( inputBitmap . Width * resizeFactor , inputBitmap . Height * resizeFactor ); using ( var graphics = Graphics . FromImage ( resultBitmap )) { graphics . InterpolationMode = InterpolationMode . HighQualityBicubic ; graphics . DrawImage ( inputBitmap , new Rectangle ( 0 , 0 , resultBitmap . Width , resultBitmap . Height )); } return resultBitmap ; } /// /// method that Highlights the countours of a Bitmap /// /// The bitmap you want to highlight the countours of /// The bitmap with countours highlighted public static Bitmap HighlightContours ( Bitmap inputBitmap ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); Bitmap grayscale = Grayscale ( inputBitmap ); Bitmap thresholded = Tresholding ( grayscale , 128 ); Bitmap dilated = Dilatation ( thresholded , 3 ); Bitmap eroded = Erode ( dilated , 3 ); for ( int y = 0 ; y < inputBitmap . Height ; y ++) { for ( int x = 0 ; x < inputBitmap . Width ; x ++) { Color pixel = inputBitmap . GetPixel ( x , y ); Color dilatedPixel = dilated . GetPixel ( x , y ); Color erodedPixel = eroded . GetPixel ( x , y ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); int threshold = dilatedPixel . R ; if ( gray > threshold ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } else if ( gray <= threshold && erodedPixel . R == 0 ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 0 , 0 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } } } return outputBitmap ; } /// /// Method that that erodes the morphology of a bitmap /// /// The bitmap you want to erode /// The amount of Erosion you want (be carefull its expensive on ressources) /// The Bitmap with the eroded contents public static Bitmap Erode ( Bitmap inputBitmap , int kernelSize ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); int [,] kernel = new int [ kernelSize , kernelSize ]; for ( int i = 0 ; i < kernelSize ; i ++) { for ( int j = 0 ; j < kernelSize ; j ++) { kernel [ i , j ] = 1 ; } } for ( int y = kernelSize / 2 ; y < inputBitmap . Height - kernelSize / 2 ; y ++) { for ( int x = kernelSize / 2 ; x < inputBitmap . Width - kernelSize / 2 ; x ++) { bool flag = true ; for ( int i = - kernelSize / 2 ; i <= kernelSize / 2 ; i ++) { for ( int j = - kernelSize / 2 ; j <= kernelSize / 2 ; j ++) { Color pixel = inputBitmap . GetPixel ( x + i , y + j ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); if ( gray >= 128 && kernel [ i + kernelSize / 2 , j + kernelSize / 2 ] == 1 ) { flag = false ; break ; } } if (! flag ) { break ; } } if ( flag ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } } } return outputBitmap ; } /// /// Method that that use dilatation of the morphology of a bitmap /// /// The bitmap you want to use dilatation on /// The amount of dilatation you want (be carefull its expensive on ressources) /// The Bitmap after Dilatation public static Bitmap Dilatation ( Bitmap inputBitmap , int kernelSize ) { Bitmap outputBitmap = new Bitmap ( inputBitmap . Width , inputBitmap . Height ); int [,] kernel = new int [ kernelSize , kernelSize ]; for ( int i = 0 ; i < kernelSize ; i ++) { for ( int j = 0 ; j < kernelSize ; j ++) { kernel [ i , j ] = 1 ; } } for ( int y = kernelSize / 2 ; y < inputBitmap . Height - kernelSize / 2 ; y ++) { for ( int x = kernelSize / 2 ; x < inputBitmap . Width - kernelSize / 2 ; x ++) { bool flag = false ; for ( int i = - kernelSize / 2 ; i <= kernelSize / 2 ; i ++) { for ( int j = - kernelSize / 2 ; j <= kernelSize / 2 ; j ++) { Color pixel = inputBitmap . GetPixel ( x + i , y + j ); int gray = ( int )( pixel . R * 0.3 + pixel . G * 0.59 + pixel . B * 0.11 ); if ( gray < 128 && kernel [ i + kernelSize / 2 , j + kernelSize / 2 ] == 1 ) { flag = true ; break ; } } if ( flag ) { break ; } } if ( flag ) { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 0 , 0 , 0 )); } else { outputBitmap . SetPixel ( x , y , Color . FromArgb ( 255 , 255 , 255 )); } } } return outputBitmap ; } } }","title":"OcrImage.cs"},{"location":"Code/Reader.html","text":"Reader.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Reader.cs /// Brief : Class used to Read the config file for the OCR /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; using System.Windows.Forms ; using System.IO ; using System.Text.Json ; namespace TrackTrends { public class Reader { const int NUMBER_OF_DRIVERS = 20 ; public List < string > Drivers ; public List < Zone > MainZones ; private SqliteStorage _storage ; private List < DriverData >[] DriverDataLogs = new List < DriverData >[ NUMBER_OF_DRIVERS ]; private int [] DriverLaps = new int [ NUMBER_OF_DRIVERS ]; public SqliteStorage Storage { get => _storage ; private set => _storage = value ; } public Reader ( string configFile , Bitmap image , bool loadOCR = true ) { Storage = new SqliteStorage (); MainZones = Load ( image , configFile , ref Drivers , loadOCR ); } /// /// Method that reads the JSON config file and create all the Zones and Windows /// /// The image #id on wich you want to create the zones on public List < Zone > Load ( Bitmap image , string configFilePath , ref List < string > driverListToFill , bool LoadOCR ) { // Note : You may wonder why in the H... I have all the zones and windows stored in a JSON file and not just for example the first and the last // Its because they are not perfectly aligned to each others and every zone has his own alignement to the main image List < Zone > mainZones = new List < Zone >(); Bitmap fullImage = image ; Zone mainZone ; for ( int i = 0 ; i < NUMBER_OF_DRIVERS ; i ++) { DriverDataLogs [ i ] = new List < DriverData >(); DriverLaps [ i ] = 0 ; } try { string jsonString = File . ReadAllText ( configFilePath ); JsonDocument document = JsonDocument . Parse ( jsonString ); JsonElement root = document . RootElement ; mainZones = new List < Zone >(); driverListToFill = new List < string >(); JsonElement main = root . GetProperty ( \"Main\" ); int x = main . GetProperty ( \"x\" ). GetInt32 (); int y = main . GetProperty ( \"y\" ). GetInt32 (); int width = main . GetProperty ( \"width\" ). GetInt32 (); int height = main . GetProperty ( \"height\" ). GetInt32 (); mainZone = new Zone ( fullImage , new Rectangle ( x , y , width , height ), \"Main\" ); mainZone . ResetWindows (); mainZone . ResetZones (); JsonElement driverZones = main . GetProperty ( \"DriverZones\" ); foreach ( JsonElement driverZoneElement in driverZones . EnumerateArray ()) { string name = driverZoneElement . GetProperty ( \"name\" ). GetString (); int driverX = driverZoneElement . GetProperty ( \"x\" ). GetInt32 () + mainZone . Bounds . X ; int driverY = driverZoneElement . GetProperty ( \"y\" ). GetInt32 () + mainZone . Bounds . Y ; int driverWidth = driverZoneElement . GetProperty ( \"width\" ). GetInt32 (); int driverHeight = driverZoneElement . GetProperty ( \"height\" ). GetInt32 (); Zone driverZone = new Zone ( fullImage , new Rectangle ( driverX , driverY , driverWidth , driverHeight ), \"Driver\" ); JsonElement windowsElement = driverZoneElement . GetProperty ( \"Windows\" ); //string[] windowNames = new string[] { \"Position\",\"GapToLeader\",\"LapTime\",\"DRS\",\"Tyres\",\"Name\",\"Sector1\",\"Sector2\",\"Sector3\" }; foreach ( JsonElement windowElement in windowsElement . EnumerateArray ()) { //Position JsonElement posEl = windowElement . GetProperty ( \"Position\" ); DriverPositionWindow positionWindow = new DriverPositionWindow ( driverZone . ZoneImage , new Rectangle ( posEl . GetProperty ( \"x\" ). GetInt32 (), posEl . GetProperty ( \"y\" ). GetInt32 (), posEl . GetProperty ( \"width\" ). GetInt32 (), posEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //GapToLeader JsonElement gapEl = windowElement . GetProperty ( \"GapToLeader\" ); DriverGapToLeaderWindow gapWindow = new DriverGapToLeaderWindow ( driverZone . ZoneImage , new Rectangle ( gapEl . GetProperty ( \"x\" ). GetInt32 (), gapEl . GetProperty ( \"y\" ). GetInt32 (), gapEl . GetProperty ( \"width\" ). GetInt32 (), gapEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //LapTime JsonElement lapEl = windowElement . GetProperty ( \"LapTime\" ); DriverLapTimeWindow lapWindow = new DriverLapTimeWindow ( driverZone . ZoneImage , new Rectangle ( lapEl . GetProperty ( \"x\" ). GetInt32 (), lapEl . GetProperty ( \"y\" ). GetInt32 (), lapEl . GetProperty ( \"width\" ). GetInt32 (), lapEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //DRS JsonElement drsEl = windowElement . GetProperty ( \"DRS\" ); DriverDrsWindow drsWindow = new DriverDrsWindow ( driverZone . ZoneImage , new Rectangle ( drsEl . GetProperty ( \"x\" ). GetInt32 (), drsEl . GetProperty ( \"y\" ). GetInt32 (), drsEl . GetProperty ( \"width\" ). GetInt32 (), drsEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Tyre JsonElement tyresEl = windowElement . GetProperty ( \"Tyres\" ); DriverTyresWindow tyreWindow = new DriverTyresWindow ( driverZone . ZoneImage , new Rectangle ( tyresEl . GetProperty ( \"x\" ). GetInt32 (), tyresEl . GetProperty ( \"y\" ). GetInt32 (), tyresEl . GetProperty ( \"width\" ). GetInt32 (), tyresEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Name JsonElement nameEl = windowElement . GetProperty ( \"Name\" ); DriverNameWindow nameWindow = new DriverNameWindow ( driverZone . ZoneImage , new Rectangle ( nameEl . GetProperty ( \"x\" ). GetInt32 (), nameEl . GetProperty ( \"y\" ). GetInt32 (), nameEl . GetProperty ( \"width\" ). GetInt32 (), nameEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Sector1 JsonElement sec1El = windowElement . GetProperty ( \"Sector1\" ); DriverSectorWindow sec1Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec1El . GetProperty ( \"x\" ). GetInt32 (), sec1El . GetProperty ( \"y\" ). GetInt32 (), sec1El . GetProperty ( \"width\" ). GetInt32 (), sec1El . GetProperty ( \"height\" ). GetInt32 ()), 1 , LoadOCR ); //Sector2 JsonElement sec2El = windowElement . GetProperty ( \"Sector2\" ); DriverSectorWindow sec2Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec2El . GetProperty ( \"x\" ). GetInt32 (), sec2El . GetProperty ( \"y\" ). GetInt32 (), sec2El . GetProperty ( \"width\" ). GetInt32 (), sec2El . GetProperty ( \"height\" ). GetInt32 ()), 2 , LoadOCR ); //Sector3 JsonElement sec3El = windowElement . GetProperty ( \"Sector3\" ); DriverSectorWindow sec3Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec3El . GetProperty ( \"x\" ). GetInt32 (), sec3El . GetProperty ( \"y\" ). GetInt32 (), sec3El . GetProperty ( \"width\" ). GetInt32 (), sec3El . GetProperty ( \"height\" ). GetInt32 ()), 3 , LoadOCR ); driverZone . AddWindow ( positionWindow ); driverZone . AddWindow ( gapWindow ); driverZone . AddWindow ( lapWindow ); driverZone . AddWindow ( drsWindow ); driverZone . AddWindow ( tyreWindow ); driverZone . AddWindow ( nameWindow ); driverZone . AddWindow ( sec1Window ); driverZone . AddWindow ( sec2Window ); driverZone . AddWindow ( sec3Window ); } mainZone . AddZone ( driverZone ); } JsonElement driversElement = main . GetProperty ( \"Drivers\" ); foreach ( JsonElement driverElement in driversElement . EnumerateArray ()) { string driverName = driverElement . GetString (); driverListToFill . Add ( driverName ); Storage . AddDriver ( driverName ); } mainZones . Add ( mainZone ); } catch ( IOException ex ) { MessageBox . Show ( \"Error reading JSON file: \" + ex . Message ); } catch ( JsonException ex ) { MessageBox . Show ( \"Invalid JSON format: \" + ex . Message ); } int driverID = 0 ; foreach ( Zone z in mainZones [ 0 ]. Zones ) { driverID ++; z . ZoneImage . Save ( \"LoadedDriver\" + driverID + \".png\" ); } return mainZones ; } /// /// Method that calls all the zones and windows to get the content they can find on the image to display them /// /// The id of the image we are working with /// a string representation of all the returns public List < DriverData > Decode ( List < Zone > mainZones , List < string > drivers ) { List < DriverData > mainResults = new List < DriverData >(); //Decode for ( int mainZoneId = 0 ; mainZoneId < mainZones . Count ; mainZoneId ++) { switch ( mainZoneId ) { case 0 : //object lockObject = new object(); //Main Zone Parallel . For ( 0 , mainZones [ mainZoneId ]. Zones . Count , async i => //for (int i = 0; i < mainZones[mainZoneId].Zones.Count; i++) { DriverData data = mainZones [ mainZoneId ]. Zones [ i ]. Decode ( new List < string >( drivers )); mainResults . Add ( data ); DriverDataLogs [ i ]. Add ( data ); if ( data . Position != - 1 && DriverDataLogs [ i ]. Count > 1 ) { //Tries to fix the tyres if ( data . CurrentTyre . NumberOfLaps > DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps + 3 ) data . CurrentTyre . NumberOfLaps = DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps + 1 ; //Checking if its a new lap //If the third sector is filled but it was'nt the last time, then it means that a new Lap has been started //Lap detection can be f***ed if the OCR takes so much time that an entire sector can be raced without us knowing. if ( DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Sector3 != 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Sector3 == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Position != - 1 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Position != - 1 ) { DriverData stats = new DriverData (); stats = DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]; DriverLaps [ i ]++; Storage . AddDriverStat ( stats , DriverLaps [ i ]); } //Checking if its a pitstop //Forget this the best way to know if a tyre has been changed is if the number of laps is zero if ( data . CurrentTyre . Coumpound != Tyre . Type . Undefined && data . CurrentTyre . NumberOfLaps == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps != 0 ) { Storage . AddPitstop ( data . Name , DriverLaps [ i ] - 1 , data . CurrentTyre . Coumpound . ToString ()); //Driver laps -1 because it would take AT LEAST one lap for this program to detect a pitstop } } DriverDataLogs [ i ]. Add ( data ); }); break ; //Next there could be a Title Zone and TrackInfoZone } } //mainResults = mainResults.OrderBy(driver => driver.Position >= 0).ThenBy(driver => driver.Position).ToList(); mainResults = mainResults . OrderBy ( driver => driver . Position ). ToList (); return mainResults ; } /// /// Changes the image in all of the zones wich then will do the same for theyre own subzones and windows /// /// The new Image from the F1TV data channel public void ChangeImage ( Bitmap Image ) { foreach ( Zone z in MainZones ) { z . Image = Image ; } } /// /// Method that can be used to convert an amount of miliseconds into a more readable human form /// /// The given amount of miliseconds ton convert /// A human readable string that represents the ms public static string ConvertMsToTime ( int amountOfMs ) { //Convert.ToInt32 would round upand I dont want that int minuts = ( int )(( float ) amountOfMs / ( 1000f * 60f )); int seconds = ( int )(( amountOfMs - ( minuts * 60f * 1000f )) / 1000 ); int ms = amountOfMs - (( minuts * 60 * 1000 ) + ( seconds * 1000 )); return minuts + \":\" + seconds . ToString ( \"00\" ) + \":\" + ms . ToString ( \"000\" ); } /// /// Old method that can draw on an image where the windows and zones are created. mostly used for debugging /// /// the #id of the image we are working with /// the drawed bitmap public Bitmap Draw ( Bitmap image , List < Zone > mainZones ) { Graphics g = Graphics . FromImage ( image ); foreach ( Zone z in mainZones ) { int count = 0 ; foreach ( Zone zz in z . Zones ) { g . DrawRectangle ( Pens . Red , z . Bounds ); foreach ( Window w in zz . Windows ) { g . DrawRectangle ( Pens . Blue , new Rectangle ( z . Bounds . X + zz . Bounds . X , z . Bounds . Y + zz . Bounds . Y , zz . Bounds . Width , zz . Bounds . Height )); } count ++; } } return image ; } } }","title":"Reader.cs"},{"location":"Code/Reader.html#readercs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Reader.cs /// Brief : Class used to Read the config file for the OCR /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; using System.Windows.Forms ; using System.IO ; using System.Text.Json ; namespace TrackTrends { public class Reader { const int NUMBER_OF_DRIVERS = 20 ; public List < string > Drivers ; public List < Zone > MainZones ; private SqliteStorage _storage ; private List < DriverData >[] DriverDataLogs = new List < DriverData >[ NUMBER_OF_DRIVERS ]; private int [] DriverLaps = new int [ NUMBER_OF_DRIVERS ]; public SqliteStorage Storage { get => _storage ; private set => _storage = value ; } public Reader ( string configFile , Bitmap image , bool loadOCR = true ) { Storage = new SqliteStorage (); MainZones = Load ( image , configFile , ref Drivers , loadOCR ); } /// /// Method that reads the JSON config file and create all the Zones and Windows /// /// The image #id on wich you want to create the zones on public List < Zone > Load ( Bitmap image , string configFilePath , ref List < string > driverListToFill , bool LoadOCR ) { // Note : You may wonder why in the H... I have all the zones and windows stored in a JSON file and not just for example the first and the last // Its because they are not perfectly aligned to each others and every zone has his own alignement to the main image List < Zone > mainZones = new List < Zone >(); Bitmap fullImage = image ; Zone mainZone ; for ( int i = 0 ; i < NUMBER_OF_DRIVERS ; i ++) { DriverDataLogs [ i ] = new List < DriverData >(); DriverLaps [ i ] = 0 ; } try { string jsonString = File . ReadAllText ( configFilePath ); JsonDocument document = JsonDocument . Parse ( jsonString ); JsonElement root = document . RootElement ; mainZones = new List < Zone >(); driverListToFill = new List < string >(); JsonElement main = root . GetProperty ( \"Main\" ); int x = main . GetProperty ( \"x\" ). GetInt32 (); int y = main . GetProperty ( \"y\" ). GetInt32 (); int width = main . GetProperty ( \"width\" ). GetInt32 (); int height = main . GetProperty ( \"height\" ). GetInt32 (); mainZone = new Zone ( fullImage , new Rectangle ( x , y , width , height ), \"Main\" ); mainZone . ResetWindows (); mainZone . ResetZones (); JsonElement driverZones = main . GetProperty ( \"DriverZones\" ); foreach ( JsonElement driverZoneElement in driverZones . EnumerateArray ()) { string name = driverZoneElement . GetProperty ( \"name\" ). GetString (); int driverX = driverZoneElement . GetProperty ( \"x\" ). GetInt32 () + mainZone . Bounds . X ; int driverY = driverZoneElement . GetProperty ( \"y\" ). GetInt32 () + mainZone . Bounds . Y ; int driverWidth = driverZoneElement . GetProperty ( \"width\" ). GetInt32 (); int driverHeight = driverZoneElement . GetProperty ( \"height\" ). GetInt32 (); Zone driverZone = new Zone ( fullImage , new Rectangle ( driverX , driverY , driverWidth , driverHeight ), \"Driver\" ); JsonElement windowsElement = driverZoneElement . GetProperty ( \"Windows\" ); //string[] windowNames = new string[] { \"Position\",\"GapToLeader\",\"LapTime\",\"DRS\",\"Tyres\",\"Name\",\"Sector1\",\"Sector2\",\"Sector3\" }; foreach ( JsonElement windowElement in windowsElement . EnumerateArray ()) { //Position JsonElement posEl = windowElement . GetProperty ( \"Position\" ); DriverPositionWindow positionWindow = new DriverPositionWindow ( driverZone . ZoneImage , new Rectangle ( posEl . GetProperty ( \"x\" ). GetInt32 (), posEl . GetProperty ( \"y\" ). GetInt32 (), posEl . GetProperty ( \"width\" ). GetInt32 (), posEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //GapToLeader JsonElement gapEl = windowElement . GetProperty ( \"GapToLeader\" ); DriverGapToLeaderWindow gapWindow = new DriverGapToLeaderWindow ( driverZone . ZoneImage , new Rectangle ( gapEl . GetProperty ( \"x\" ). GetInt32 (), gapEl . GetProperty ( \"y\" ). GetInt32 (), gapEl . GetProperty ( \"width\" ). GetInt32 (), gapEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //LapTime JsonElement lapEl = windowElement . GetProperty ( \"LapTime\" ); DriverLapTimeWindow lapWindow = new DriverLapTimeWindow ( driverZone . ZoneImage , new Rectangle ( lapEl . GetProperty ( \"x\" ). GetInt32 (), lapEl . GetProperty ( \"y\" ). GetInt32 (), lapEl . GetProperty ( \"width\" ). GetInt32 (), lapEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //DRS JsonElement drsEl = windowElement . GetProperty ( \"DRS\" ); DriverDrsWindow drsWindow = new DriverDrsWindow ( driverZone . ZoneImage , new Rectangle ( drsEl . GetProperty ( \"x\" ). GetInt32 (), drsEl . GetProperty ( \"y\" ). GetInt32 (), drsEl . GetProperty ( \"width\" ). GetInt32 (), drsEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Tyre JsonElement tyresEl = windowElement . GetProperty ( \"Tyres\" ); DriverTyresWindow tyreWindow = new DriverTyresWindow ( driverZone . ZoneImage , new Rectangle ( tyresEl . GetProperty ( \"x\" ). GetInt32 (), tyresEl . GetProperty ( \"y\" ). GetInt32 (), tyresEl . GetProperty ( \"width\" ). GetInt32 (), tyresEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Name JsonElement nameEl = windowElement . GetProperty ( \"Name\" ); DriverNameWindow nameWindow = new DriverNameWindow ( driverZone . ZoneImage , new Rectangle ( nameEl . GetProperty ( \"x\" ). GetInt32 (), nameEl . GetProperty ( \"y\" ). GetInt32 (), nameEl . GetProperty ( \"width\" ). GetInt32 (), nameEl . GetProperty ( \"height\" ). GetInt32 ()), LoadOCR ); //Sector1 JsonElement sec1El = windowElement . GetProperty ( \"Sector1\" ); DriverSectorWindow sec1Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec1El . GetProperty ( \"x\" ). GetInt32 (), sec1El . GetProperty ( \"y\" ). GetInt32 (), sec1El . GetProperty ( \"width\" ). GetInt32 (), sec1El . GetProperty ( \"height\" ). GetInt32 ()), 1 , LoadOCR ); //Sector2 JsonElement sec2El = windowElement . GetProperty ( \"Sector2\" ); DriverSectorWindow sec2Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec2El . GetProperty ( \"x\" ). GetInt32 (), sec2El . GetProperty ( \"y\" ). GetInt32 (), sec2El . GetProperty ( \"width\" ). GetInt32 (), sec2El . GetProperty ( \"height\" ). GetInt32 ()), 2 , LoadOCR ); //Sector3 JsonElement sec3El = windowElement . GetProperty ( \"Sector3\" ); DriverSectorWindow sec3Window = new DriverSectorWindow ( driverZone . ZoneImage , new Rectangle ( sec3El . GetProperty ( \"x\" ). GetInt32 (), sec3El . GetProperty ( \"y\" ). GetInt32 (), sec3El . GetProperty ( \"width\" ). GetInt32 (), sec3El . GetProperty ( \"height\" ). GetInt32 ()), 3 , LoadOCR ); driverZone . AddWindow ( positionWindow ); driverZone . AddWindow ( gapWindow ); driverZone . AddWindow ( lapWindow ); driverZone . AddWindow ( drsWindow ); driverZone . AddWindow ( tyreWindow ); driverZone . AddWindow ( nameWindow ); driverZone . AddWindow ( sec1Window ); driverZone . AddWindow ( sec2Window ); driverZone . AddWindow ( sec3Window ); } mainZone . AddZone ( driverZone ); } JsonElement driversElement = main . GetProperty ( \"Drivers\" ); foreach ( JsonElement driverElement in driversElement . EnumerateArray ()) { string driverName = driverElement . GetString (); driverListToFill . Add ( driverName ); Storage . AddDriver ( driverName ); } mainZones . Add ( mainZone ); } catch ( IOException ex ) { MessageBox . Show ( \"Error reading JSON file: \" + ex . Message ); } catch ( JsonException ex ) { MessageBox . Show ( \"Invalid JSON format: \" + ex . Message ); } int driverID = 0 ; foreach ( Zone z in mainZones [ 0 ]. Zones ) { driverID ++; z . ZoneImage . Save ( \"LoadedDriver\" + driverID + \".png\" ); } return mainZones ; } /// /// Method that calls all the zones and windows to get the content they can find on the image to display them /// /// The id of the image we are working with /// a string representation of all the returns public List < DriverData > Decode ( List < Zone > mainZones , List < string > drivers ) { List < DriverData > mainResults = new List < DriverData >(); //Decode for ( int mainZoneId = 0 ; mainZoneId < mainZones . Count ; mainZoneId ++) { switch ( mainZoneId ) { case 0 : //object lockObject = new object(); //Main Zone Parallel . For ( 0 , mainZones [ mainZoneId ]. Zones . Count , async i => //for (int i = 0; i < mainZones[mainZoneId].Zones.Count; i++) { DriverData data = mainZones [ mainZoneId ]. Zones [ i ]. Decode ( new List < string >( drivers )); mainResults . Add ( data ); DriverDataLogs [ i ]. Add ( data ); if ( data . Position != - 1 && DriverDataLogs [ i ]. Count > 1 ) { //Tries to fix the tyres if ( data . CurrentTyre . NumberOfLaps > DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps + 3 ) data . CurrentTyre . NumberOfLaps = DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps + 1 ; //Checking if its a new lap //If the third sector is filled but it was'nt the last time, then it means that a new Lap has been started //Lap detection can be f***ed if the OCR takes so much time that an entire sector can be raced without us knowing. if ( DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Sector3 != 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Sector3 == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. Position != - 1 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]. Position != - 1 ) { DriverData stats = new DriverData (); stats = DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 1 ]; DriverLaps [ i ]++; Storage . AddDriverStat ( stats , DriverLaps [ i ]); } //Checking if its a pitstop //Forget this the best way to know if a tyre has been changed is if the number of laps is zero if ( data . CurrentTyre . Coumpound != Tyre . Type . Undefined && data . CurrentTyre . NumberOfLaps == 0 && DriverDataLogs [ i ][ DriverDataLogs [ i ]. Count - 2 ]. CurrentTyre . NumberOfLaps != 0 ) { Storage . AddPitstop ( data . Name , DriverLaps [ i ] - 1 , data . CurrentTyre . Coumpound . ToString ()); //Driver laps -1 because it would take AT LEAST one lap for this program to detect a pitstop } } DriverDataLogs [ i ]. Add ( data ); }); break ; //Next there could be a Title Zone and TrackInfoZone } } //mainResults = mainResults.OrderBy(driver => driver.Position >= 0).ThenBy(driver => driver.Position).ToList(); mainResults = mainResults . OrderBy ( driver => driver . Position ). ToList (); return mainResults ; } /// /// Changes the image in all of the zones wich then will do the same for theyre own subzones and windows /// /// The new Image from the F1TV data channel public void ChangeImage ( Bitmap Image ) { foreach ( Zone z in MainZones ) { z . Image = Image ; } } /// /// Method that can be used to convert an amount of miliseconds into a more readable human form /// /// The given amount of miliseconds ton convert /// A human readable string that represents the ms public static string ConvertMsToTime ( int amountOfMs ) { //Convert.ToInt32 would round upand I dont want that int minuts = ( int )(( float ) amountOfMs / ( 1000f * 60f )); int seconds = ( int )(( amountOfMs - ( minuts * 60f * 1000f )) / 1000 ); int ms = amountOfMs - (( minuts * 60 * 1000 ) + ( seconds * 1000 )); return minuts + \":\" + seconds . ToString ( \"00\" ) + \":\" + ms . ToString ( \"000\" ); } /// /// Old method that can draw on an image where the windows and zones are created. mostly used for debugging /// /// the #id of the image we are working with /// the drawed bitmap public Bitmap Draw ( Bitmap image , List < Zone > mainZones ) { Graphics g = Graphics . FromImage ( image ); foreach ( Zone z in mainZones ) { int count = 0 ; foreach ( Zone zz in z . Zones ) { g . DrawRectangle ( Pens . Red , z . Bounds ); foreach ( Window w in zz . Windows ) { g . DrawRectangle ( Pens . Blue , new Rectangle ( z . Bounds . X + zz . Bounds . X , z . Bounds . Y + zz . Bounds . Y , zz . Bounds . Width , zz . Bounds . Height )); } count ++; } } return image ; } } }","title":"Reader.cs"},{"location":"Code/Settings.html","text":"Settings.cs using System ; using System.Collections.Generic ; using System.ComponentModel ; using System.Data ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.IO ; using TrackTrends ; namespace TrackTrends { public partial class Settings : Form { private string _grandPrixUrl = \"\" ; private string _selectedConfigFile ; private List < string > _driverList = new List < string >(); private F1TVEmulator Emulator = null ; private ConfigurationTool Config = null ; private bool CreatingZone = false ; private Point ZoneP1 ; private Point ZoneP2 ; private bool CreatingWindow = false ; private Point WindowP1 ; private Point WindowP2 ; List < Rectangle > WindowsToAdd = new List < Rectangle >(); public string GrandPrixUrl { get => _grandPrixUrl ; private set => _grandPrixUrl = value ; } public List < string > DriverList { get => _driverList ; private set => _driverList = value ; } public string SelectedConfigFile { get => _selectedConfigFile ; private set => _selectedConfigFile = value ; } //For the responsive content Size oldSize = new Size (); Size oldGpbxPreviewSize = new Size (); Size oldGpbxWindowPreviewSize = new Size (); Size oldPbxPreviewSize = new Size (); Size oldPbxWindowPreviewSize = new Size (); public Settings () { InitializeComponent (); Load (); } private void Load () { RefreshUI (); oldSize = this . Size ; oldGpbxPreviewSize = gpbxPreview . Size ; oldGpbxWindowPreviewSize = gpbxWindowPreview . Size ; oldPbxPreviewSize = pbxPreview . Size ; oldPbxWindowPreviewSize = pbxWindowPreview . Size ; tip1 . SetToolTip ( btnCreatZone , \"After clicking you can select two points in the image to set the bounds of the important data\" ); tip1 . SetToolTip ( btnCreateWindow , \"After clicking this you will have to select all the windows that are important on the lower image. Refer to the documentation for more infos\" ); tip1 . SetToolTip ( btnRefresh , \"Starts the emulator or refreshes the images if its already running\" ); tip1 . SetToolTip ( btnResetDriver , \"Resets the driver if something went wrong or if you want to test an other URL\" ); tip1 . SetToolTip ( lsbDrivers , \"The drivers that are on the image. Non-Case sensitive\" ); tip1 . SetToolTip ( tbxPresetName , \"The name of the preset you want to save\" ); tip1 . SetToolTip ( pbxPreview , \"What the emulator returns\" ); tip1 . SetToolTip ( pbxWindowPreview , \"One of the driver zones that the program managed to slice from the main zone\" ); } private void RefreshUI () { lsbDrivers . DataSource = null ; lsbDrivers . DataSource = DriverList ; if ( Directory . Exists ( ConfigurationTool . CONFIGS_FOLDER_NAME )) { lsbPresets . DataSource = null ; lsbPresets . DataSource = Directory . GetFiles ( ConfigurationTool . CONFIGS_FOLDER_NAME ); } if ( CreatingZone ) { if ( ZoneP1 == new Point (- 1 , - 1 )) { lblZonePointsRemaning . Text = \"2 points Remaining\" ; } else { lblZonePointsRemaning . Text = \"1 point Remaining\" ; } } else { lblZonePointsRemaning . Text = \"\" ; } if ( CreatingWindow ) { if ( WindowP1 == new Point (- 1 , - 1 )) { lblWindowPointsRemaining . Text = \"2 points Remaining\" ; } else { lblWindowPointsRemaining . Text = \"1 point Remaining\" ; } lblWindowPointsRemaining . Text = ConfigurationTool . NUMBER_OF_ZONES - WindowsToAdd . Count () + \" Windows remaining\" ; } else { lblWindowPointsRemaining . Text = \"\" ; lblWindowsRemaining . Text = \"\" ; } if ( Config != null ) { pbxPreview . Image = Config . MainZone . Draw (); if ( Config . MainZone . Zones . Count > 0 ) pbxWindowPreview . Image = Config . MainZone . Zones [ 0 ]. Draw (); } } private void CreateNewZone ( Point p1 , Point p2 ) { Rectangle dimensions = CreateAbsoluteRectangle ( p1 , p2 ); Config = new ConfigurationTool (( Bitmap ) pbxPreview . Image , dimensions ); RefreshUI (); } private void CreateWindows ( List < Rectangle > dimensions ) { if ( Config != null ) { Config . AddWindows ( dimensions ); } } private void tbxGpUrl_TextChanged ( object sender , EventArgs e ) { GrandPrixUrl = tbxGpUrl . Text ; } private void btnAddDriver_Click ( object sender , EventArgs e ) { string newDriver = tbxDriverName . Text ; DriverList . Add ( newDriver ); tbxDriverName . Text = \"\" ; RefreshUI (); } private void btnRemoveDriver_Click ( object sender , EventArgs e ) { if ( lsbDrivers . SelectedIndex >= 0 ) { DriverList . RemoveAt ( lsbDrivers . SelectedIndex ); } RefreshUI (); } private void SwitchZoneCreation () { if ( CreatingZone ) { CreatingZone = false ; lblZonePointsRemaning . Text = \"\" ; } else { CreatingZone = true ; if ( Config != null ) Config . ResetMainZone (); if ( CreatingWindow ) SwitchWindowCreation (); if ( Emulator != null && Emulator . Ready ) { Config = null ; pbxPreview . Image = Emulator . Screenshot (); } ZoneP1 = new Point (- 1 , - 1 ); ZoneP2 = new Point (- 1 , - 1 ); lblZonePointsRemaning . Text = \"2 Points left\" ; } RefreshUI (); } private void SwitchWindowCreation () { if ( CreatingWindow ) { CreatingWindow = false ; } else { CreatingWindow = true ; if ( Config != null ) Config . ResetWindows (); if ( CreatingZone ) SwitchZoneCreation (); WindowP1 = new Point (- 1 , - 1 ); WindowP2 = new Point (- 1 , - 1 ); WindowsToAdd = new List < Rectangle >(); } RefreshUI (); } private void btnCreatZone_Click ( object sender , EventArgs e ) { SwitchZoneCreation (); } private void btnCreateWindow_Click ( object sender , EventArgs e ) { SwitchWindowCreation (); } private void pbxMain_MouseClick ( object sender , MouseEventArgs e ) { if ( CreatingZone && pbxPreview . Image != null ) { //Point coordinates = pbxMain.PointToClient(new Point(MousePosition.X, MousePosition.Y)); Point coordinates = e . Location ; float xOffset = ( float ) pbxPreview . Image . Width / ( float ) pbxPreview . Width ; float yOffset = ( float ) pbxPreview . Image . Height / ( float ) pbxPreview . Height ; Point newPoint = new Point ( Convert . ToInt32 (( float ) coordinates . X * xOffset ), Convert . ToInt32 (( float ) coordinates . Y * yOffset )); //MessageBox.Show(\"Coordinates\" + Environment.NewLine + \"Old : \" + coordinates.ToString() + Environment.NewLine + \"New : \" + newPoint.ToString()); if ( ZoneP1 == new Point (- 1 , - 1 )) { ZoneP1 = newPoint ; } else { ZoneP2 = newPoint ; CreateNewZone ( ZoneP1 , ZoneP2 ); SwitchZoneCreation (); } RefreshUI (); } } private void pbxMain_Click ( object sender , EventArgs e ) { //Not the right one to use visibly } private void pbxDriverZone_MouseClick ( object sender , MouseEventArgs e ) { if ( CreatingWindow && pbxWindowPreview . Image != null ) { Point coordinates = e . Location ; float xOffset = ( float ) pbxWindowPreview . Image . Width / ( float ) pbxWindowPreview . Width ; float yOffset = ( float ) pbxWindowPreview . Image . Height / ( float ) pbxWindowPreview . Height ; Point newPoint = new Point ( Convert . ToInt32 (( float ) coordinates . X * xOffset ), Convert . ToInt32 (( float ) coordinates . Y * yOffset )); if ( WindowP1 == new Point (- 1 , - 1 )) { WindowP1 = newPoint ; } else { WindowP2 = newPoint ; WindowsToAdd . Add ( CreateAbsoluteRectangle ( WindowP1 , WindowP2 )); if ( WindowsToAdd . Count < ConfigurationTool . NUMBER_OF_ZONES ) { WindowP1 = new Point (- 1 , - 1 ); WindowP2 = new Point (- 1 , - 1 ); } else { WindowP1 = new Point ( WindowP1 . X , 0 ); WindowP2 = new Point ( WindowP2 . X , pbxWindowPreview . Image . Height ); CreateWindows ( WindowsToAdd ); SwitchWindowCreation (); } } RefreshUI (); } } private void pbxDriverZone_Click ( object sender , EventArgs e ) { //Not the right one to use visibly } private Rectangle CreateAbsoluteRectangle ( Point p1 , Point p2 ) { Point newP1 = new Point (); Point newP2 = new Point (); if ( p1 . X < p2 . X ) { newP1 . X = p1 . X ; newP2 . X = p2 . X ; } else { newP1 . X = p2 . X ; newP2 . X = p1 . X ; } if ( p1 . Y < p2 . Y ) { newP1 . Y = p1 . Y ; newP2 . Y = p2 . Y ; } else { newP1 . Y = p2 . Y ; newP2 . Y = p1 . Y ; } return new Rectangle ( newP1 . X , newP1 . Y , newP2 . X - newP1 . X , newP2 . Y - newP1 . Y ); } private async void btnRefresh_Click ( object sender , EventArgs e ) { btnRefresh . Enabled = false ; btnCreatZone . Enabled = false ; btnCreateWindow . Enabled = false ; btnResetDriver . Enabled = false ; if ( Emulator == null || Emulator . GrandPrixUrl != tbxGpUrl . Text ) { Emulator = new F1TVEmulator ( tbxGpUrl . Text ); } if (! Emulator . Ready ) { Task < int > start = Task . Run (() => Emulator . Start ()); int errorCode = await start ; if ( errorCode != 0 ) { string message ; switch ( errorCode ) { case 100 : message = \"Error \" + errorCode + \" Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again\" ; break ; case 101 : message = \"Error \" + errorCode + \" Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again\" ; break ; case 102 : message = \"Error \" + errorCode + \" Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update\" ; break ; case 103 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 104 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 105 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; case 106 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; default : message = \"Could not start the emulator Error \" + errorCode ; break ; } MessageBox . Show ( message ); } else { pbxPreview . Image = Emulator . Screenshot (); } } else { pbxPreview . Image = Emulator . Screenshot (); } btnRefresh . Enabled = true ; btnCreatZone . Enabled = true ; btnCreateWindow . Enabled = true ; btnResetDriver . Enabled = true ; btnRefresh . Text = \"Get a newer image\" ; } private void Settings_FormClosing ( object sender , FormClosingEventArgs e ) { if ( Emulator != null ) { Emulator . Stop (); } Emulator = null ; GC . Collect (); } private void btnResetDriver_Click ( object sender , EventArgs e ) { if ( Emulator != null ) { Emulator . ResetDriver (); } } private void btnSavePreset_Click ( object sender , EventArgs e ) { string presetName = tbxPresetName . Text ; if ( Config != null ) { Config . SaveToJson ( DriverList , presetName ); } RefreshUI (); } private void lsbPresets_SelectedIndexChanged ( object sender , EventArgs e ) { SelectedConfigFile = ( string ) lsbPresets . Items [ lsbPresets . SelectedIndex ]; } private void btnLoadPreset_Click ( object sender , EventArgs e ) { //MessageBox.Show(lsbPresets.SelectedIndex.ToString()); if ( lsbPresets . SelectedIndex >= 0 && pbxPreview . Image != null ) { try { string fileName = lsbPresets . Items [ lsbPresets . SelectedIndex ]. ToString (); Reader reader = new Reader ( fileName , ( Bitmap ) pbxPreview . Image , false ); //MainZones #0 is the big main zone containing driver zones Config = new ConfigurationTool (( Bitmap ) pbxPreview . Image , reader . MainZones [ 0 ]. Bounds ); Config . MainZone = reader . MainZones [ 0 ]; DriverList = reader . Drivers ; SelectedConfigFile = fileName ; } catch ( Exception ex ) { MessageBox . Show ( \"Could not load the settings error :\" + ex ); } RefreshUI (); } } private void Settings_Resize ( object sender , EventArgs e ) { int xDiff = this . Width - oldSize . Width ; int yDiff = this . Height - oldSize . Height ; gpbxPreview . Size = new Size ( oldGpbxPreviewSize . Width + xDiff , oldGpbxPreviewSize . Height + yDiff ); gpbxWindowPreview . Size = new Size ( oldGpbxWindowPreviewSize . Width + xDiff , oldGpbxWindowPreviewSize . Height ); pbxPreview . Size = new Size ( oldPbxPreviewSize . Width + xDiff , oldPbxPreviewSize . Height + yDiff ); pbxWindowPreview . Size = new Size ( oldPbxWindowPreviewSize . Width + xDiff , oldPbxWindowPreviewSize . Height ); } private void btnDeletePreset_Click ( object sender , EventArgs e ) { int selectedIndex = lsbPresets . SelectedIndex ; if ( selectedIndex >= 0 ) { string fileName = lsbPresets . Items [ selectedIndex ]. ToString (); if ( File . Exists ( fileName )) { File . Delete ( fileName ); RefreshUI (); } else { MessageBox . Show ( \"Could not delete the preset because it does not exists\" ); } } } private void removeBorders ( object sender , PaintEventArgs e ) { GroupBox gpbx = ( GroupBox ) sender ; using ( Pen pen = new Pen ( gpbx . BackColor , 50 )) { e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); } using ( var brush = new SolidBrush ( gpbx . ForeColor )) { var textPosition = new Point ( 5 , 0 ); // Adjust the X and Y values as needed e . Graphics . DrawString ( gpbx . Text , gpbx . Font , brush , textPosition ); } } } }","title":"Settings.cs"},{"location":"Code/Settings.html#settingscs","text":"using System ; using System.Collections.Generic ; using System.ComponentModel ; using System.Data ; using System.Drawing ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Windows.Forms ; using System.IO ; using TrackTrends ; namespace TrackTrends { public partial class Settings : Form { private string _grandPrixUrl = \"\" ; private string _selectedConfigFile ; private List < string > _driverList = new List < string >(); private F1TVEmulator Emulator = null ; private ConfigurationTool Config = null ; private bool CreatingZone = false ; private Point ZoneP1 ; private Point ZoneP2 ; private bool CreatingWindow = false ; private Point WindowP1 ; private Point WindowP2 ; List < Rectangle > WindowsToAdd = new List < Rectangle >(); public string GrandPrixUrl { get => _grandPrixUrl ; private set => _grandPrixUrl = value ; } public List < string > DriverList { get => _driverList ; private set => _driverList = value ; } public string SelectedConfigFile { get => _selectedConfigFile ; private set => _selectedConfigFile = value ; } //For the responsive content Size oldSize = new Size (); Size oldGpbxPreviewSize = new Size (); Size oldGpbxWindowPreviewSize = new Size (); Size oldPbxPreviewSize = new Size (); Size oldPbxWindowPreviewSize = new Size (); public Settings () { InitializeComponent (); Load (); } private void Load () { RefreshUI (); oldSize = this . Size ; oldGpbxPreviewSize = gpbxPreview . Size ; oldGpbxWindowPreviewSize = gpbxWindowPreview . Size ; oldPbxPreviewSize = pbxPreview . Size ; oldPbxWindowPreviewSize = pbxWindowPreview . Size ; tip1 . SetToolTip ( btnCreatZone , \"After clicking you can select two points in the image to set the bounds of the important data\" ); tip1 . SetToolTip ( btnCreateWindow , \"After clicking this you will have to select all the windows that are important on the lower image. Refer to the documentation for more infos\" ); tip1 . SetToolTip ( btnRefresh , \"Starts the emulator or refreshes the images if its already running\" ); tip1 . SetToolTip ( btnResetDriver , \"Resets the driver if something went wrong or if you want to test an other URL\" ); tip1 . SetToolTip ( lsbDrivers , \"The drivers that are on the image. Non-Case sensitive\" ); tip1 . SetToolTip ( tbxPresetName , \"The name of the preset you want to save\" ); tip1 . SetToolTip ( pbxPreview , \"What the emulator returns\" ); tip1 . SetToolTip ( pbxWindowPreview , \"One of the driver zones that the program managed to slice from the main zone\" ); } private void RefreshUI () { lsbDrivers . DataSource = null ; lsbDrivers . DataSource = DriverList ; if ( Directory . Exists ( ConfigurationTool . CONFIGS_FOLDER_NAME )) { lsbPresets . DataSource = null ; lsbPresets . DataSource = Directory . GetFiles ( ConfigurationTool . CONFIGS_FOLDER_NAME ); } if ( CreatingZone ) { if ( ZoneP1 == new Point (- 1 , - 1 )) { lblZonePointsRemaning . Text = \"2 points Remaining\" ; } else { lblZonePointsRemaning . Text = \"1 point Remaining\" ; } } else { lblZonePointsRemaning . Text = \"\" ; } if ( CreatingWindow ) { if ( WindowP1 == new Point (- 1 , - 1 )) { lblWindowPointsRemaining . Text = \"2 points Remaining\" ; } else { lblWindowPointsRemaining . Text = \"1 point Remaining\" ; } lblWindowPointsRemaining . Text = ConfigurationTool . NUMBER_OF_ZONES - WindowsToAdd . Count () + \" Windows remaining\" ; } else { lblWindowPointsRemaining . Text = \"\" ; lblWindowsRemaining . Text = \"\" ; } if ( Config != null ) { pbxPreview . Image = Config . MainZone . Draw (); if ( Config . MainZone . Zones . Count > 0 ) pbxWindowPreview . Image = Config . MainZone . Zones [ 0 ]. Draw (); } } private void CreateNewZone ( Point p1 , Point p2 ) { Rectangle dimensions = CreateAbsoluteRectangle ( p1 , p2 ); Config = new ConfigurationTool (( Bitmap ) pbxPreview . Image , dimensions ); RefreshUI (); } private void CreateWindows ( List < Rectangle > dimensions ) { if ( Config != null ) { Config . AddWindows ( dimensions ); } } private void tbxGpUrl_TextChanged ( object sender , EventArgs e ) { GrandPrixUrl = tbxGpUrl . Text ; } private void btnAddDriver_Click ( object sender , EventArgs e ) { string newDriver = tbxDriverName . Text ; DriverList . Add ( newDriver ); tbxDriverName . Text = \"\" ; RefreshUI (); } private void btnRemoveDriver_Click ( object sender , EventArgs e ) { if ( lsbDrivers . SelectedIndex >= 0 ) { DriverList . RemoveAt ( lsbDrivers . SelectedIndex ); } RefreshUI (); } private void SwitchZoneCreation () { if ( CreatingZone ) { CreatingZone = false ; lblZonePointsRemaning . Text = \"\" ; } else { CreatingZone = true ; if ( Config != null ) Config . ResetMainZone (); if ( CreatingWindow ) SwitchWindowCreation (); if ( Emulator != null && Emulator . Ready ) { Config = null ; pbxPreview . Image = Emulator . Screenshot (); } ZoneP1 = new Point (- 1 , - 1 ); ZoneP2 = new Point (- 1 , - 1 ); lblZonePointsRemaning . Text = \"2 Points left\" ; } RefreshUI (); } private void SwitchWindowCreation () { if ( CreatingWindow ) { CreatingWindow = false ; } else { CreatingWindow = true ; if ( Config != null ) Config . ResetWindows (); if ( CreatingZone ) SwitchZoneCreation (); WindowP1 = new Point (- 1 , - 1 ); WindowP2 = new Point (- 1 , - 1 ); WindowsToAdd = new List < Rectangle >(); } RefreshUI (); } private void btnCreatZone_Click ( object sender , EventArgs e ) { SwitchZoneCreation (); } private void btnCreateWindow_Click ( object sender , EventArgs e ) { SwitchWindowCreation (); } private void pbxMain_MouseClick ( object sender , MouseEventArgs e ) { if ( CreatingZone && pbxPreview . Image != null ) { //Point coordinates = pbxMain.PointToClient(new Point(MousePosition.X, MousePosition.Y)); Point coordinates = e . Location ; float xOffset = ( float ) pbxPreview . Image . Width / ( float ) pbxPreview . Width ; float yOffset = ( float ) pbxPreview . Image . Height / ( float ) pbxPreview . Height ; Point newPoint = new Point ( Convert . ToInt32 (( float ) coordinates . X * xOffset ), Convert . ToInt32 (( float ) coordinates . Y * yOffset )); //MessageBox.Show(\"Coordinates\" + Environment.NewLine + \"Old : \" + coordinates.ToString() + Environment.NewLine + \"New : \" + newPoint.ToString()); if ( ZoneP1 == new Point (- 1 , - 1 )) { ZoneP1 = newPoint ; } else { ZoneP2 = newPoint ; CreateNewZone ( ZoneP1 , ZoneP2 ); SwitchZoneCreation (); } RefreshUI (); } } private void pbxMain_Click ( object sender , EventArgs e ) { //Not the right one to use visibly } private void pbxDriverZone_MouseClick ( object sender , MouseEventArgs e ) { if ( CreatingWindow && pbxWindowPreview . Image != null ) { Point coordinates = e . Location ; float xOffset = ( float ) pbxWindowPreview . Image . Width / ( float ) pbxWindowPreview . Width ; float yOffset = ( float ) pbxWindowPreview . Image . Height / ( float ) pbxWindowPreview . Height ; Point newPoint = new Point ( Convert . ToInt32 (( float ) coordinates . X * xOffset ), Convert . ToInt32 (( float ) coordinates . Y * yOffset )); if ( WindowP1 == new Point (- 1 , - 1 )) { WindowP1 = newPoint ; } else { WindowP2 = newPoint ; WindowsToAdd . Add ( CreateAbsoluteRectangle ( WindowP1 , WindowP2 )); if ( WindowsToAdd . Count < ConfigurationTool . NUMBER_OF_ZONES ) { WindowP1 = new Point (- 1 , - 1 ); WindowP2 = new Point (- 1 , - 1 ); } else { WindowP1 = new Point ( WindowP1 . X , 0 ); WindowP2 = new Point ( WindowP2 . X , pbxWindowPreview . Image . Height ); CreateWindows ( WindowsToAdd ); SwitchWindowCreation (); } } RefreshUI (); } } private void pbxDriverZone_Click ( object sender , EventArgs e ) { //Not the right one to use visibly } private Rectangle CreateAbsoluteRectangle ( Point p1 , Point p2 ) { Point newP1 = new Point (); Point newP2 = new Point (); if ( p1 . X < p2 . X ) { newP1 . X = p1 . X ; newP2 . X = p2 . X ; } else { newP1 . X = p2 . X ; newP2 . X = p1 . X ; } if ( p1 . Y < p2 . Y ) { newP1 . Y = p1 . Y ; newP2 . Y = p2 . Y ; } else { newP1 . Y = p2 . Y ; newP2 . Y = p1 . Y ; } return new Rectangle ( newP1 . X , newP1 . Y , newP2 . X - newP1 . X , newP2 . Y - newP1 . Y ); } private async void btnRefresh_Click ( object sender , EventArgs e ) { btnRefresh . Enabled = false ; btnCreatZone . Enabled = false ; btnCreateWindow . Enabled = false ; btnResetDriver . Enabled = false ; if ( Emulator == null || Emulator . GrandPrixUrl != tbxGpUrl . Text ) { Emulator = new F1TVEmulator ( tbxGpUrl . Text ); } if (! Emulator . Ready ) { Task < int > start = Task . Run (() => Emulator . Start ()); int errorCode = await start ; if ( errorCode != 0 ) { string message ; switch ( errorCode ) { case 100 : message = \"Error \" + errorCode + \" Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again\" ; break ; case 101 : message = \"Error \" + errorCode + \" Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again\" ; break ; case 102 : message = \"Error \" + errorCode + \" Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update\" ; break ; case 103 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 104 : message = \"Error \" + errorCode + \" The url is not a valid url\" ; break ; case 105 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; case 106 : message = \"Error \" + errorCode + \" There has been an error trying to emulate button presses. Please try again\" ; break ; default : message = \"Could not start the emulator Error \" + errorCode ; break ; } MessageBox . Show ( message ); } else { pbxPreview . Image = Emulator . Screenshot (); } } else { pbxPreview . Image = Emulator . Screenshot (); } btnRefresh . Enabled = true ; btnCreatZone . Enabled = true ; btnCreateWindow . Enabled = true ; btnResetDriver . Enabled = true ; btnRefresh . Text = \"Get a newer image\" ; } private void Settings_FormClosing ( object sender , FormClosingEventArgs e ) { if ( Emulator != null ) { Emulator . Stop (); } Emulator = null ; GC . Collect (); } private void btnResetDriver_Click ( object sender , EventArgs e ) { if ( Emulator != null ) { Emulator . ResetDriver (); } } private void btnSavePreset_Click ( object sender , EventArgs e ) { string presetName = tbxPresetName . Text ; if ( Config != null ) { Config . SaveToJson ( DriverList , presetName ); } RefreshUI (); } private void lsbPresets_SelectedIndexChanged ( object sender , EventArgs e ) { SelectedConfigFile = ( string ) lsbPresets . Items [ lsbPresets . SelectedIndex ]; } private void btnLoadPreset_Click ( object sender , EventArgs e ) { //MessageBox.Show(lsbPresets.SelectedIndex.ToString()); if ( lsbPresets . SelectedIndex >= 0 && pbxPreview . Image != null ) { try { string fileName = lsbPresets . Items [ lsbPresets . SelectedIndex ]. ToString (); Reader reader = new Reader ( fileName , ( Bitmap ) pbxPreview . Image , false ); //MainZones #0 is the big main zone containing driver zones Config = new ConfigurationTool (( Bitmap ) pbxPreview . Image , reader . MainZones [ 0 ]. Bounds ); Config . MainZone = reader . MainZones [ 0 ]; DriverList = reader . Drivers ; SelectedConfigFile = fileName ; } catch ( Exception ex ) { MessageBox . Show ( \"Could not load the settings error :\" + ex ); } RefreshUI (); } } private void Settings_Resize ( object sender , EventArgs e ) { int xDiff = this . Width - oldSize . Width ; int yDiff = this . Height - oldSize . Height ; gpbxPreview . Size = new Size ( oldGpbxPreviewSize . Width + xDiff , oldGpbxPreviewSize . Height + yDiff ); gpbxWindowPreview . Size = new Size ( oldGpbxWindowPreviewSize . Width + xDiff , oldGpbxWindowPreviewSize . Height ); pbxPreview . Size = new Size ( oldPbxPreviewSize . Width + xDiff , oldPbxPreviewSize . Height + yDiff ); pbxWindowPreview . Size = new Size ( oldPbxWindowPreviewSize . Width + xDiff , oldPbxWindowPreviewSize . Height ); } private void btnDeletePreset_Click ( object sender , EventArgs e ) { int selectedIndex = lsbPresets . SelectedIndex ; if ( selectedIndex >= 0 ) { string fileName = lsbPresets . Items [ selectedIndex ]. ToString (); if ( File . Exists ( fileName )) { File . Delete ( fileName ); RefreshUI (); } else { MessageBox . Show ( \"Could not delete the preset because it does not exists\" ); } } } private void removeBorders ( object sender , PaintEventArgs e ) { GroupBox gpbx = ( GroupBox ) sender ; using ( Pen pen = new Pen ( gpbx . BackColor , 50 )) { e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); e . Graphics . DrawRectangle ( pen , 0 , 0 , gpbx . Width - 1 , gpbx . Height - 1 ); } using ( var brush = new SolidBrush ( gpbx . ForeColor )) { var textPosition = new Point ( 5 , 0 ); // Adjust the X and Y values as needed e . Graphics . DrawString ( gpbx . Text , gpbx . Font , brush , textPosition ); } } } }","title":"Settings.cs"},{"location":"Code/Window.html","text":"Window.cs /// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Window.cs /// Brief : Default Window object that is mainly expected to be inherited. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; using System.IO ; using Tesseract ; using System.Text.RegularExpressions ; using System.Drawing.Drawing2D ; namespace TrackTrends { public class Window { public const string STRING_DEBUG_FOLDER = \"./GetString\" ; public const string LAPTIME_DEBUG_FOLDER = \"./LapTime\" ; public const string GAPTOLEADER_DEBUG_FOLDER = \"./Gap\" ; public const string SECTOR1_DEBUG_FOLDER = \"./Sector1\" ; public const string SECTOR2_DEBUG_FOLDER = \"./Sector2\" ; public const string SECTOR3_DEBUG_FOLDER = \"./Sector3\" ; public const string DRS_DEBUG_FOLDER = \"./DRS\" ; public const string TYRE_DEBUG_FOLDER = \"./Tyre\" ; private Rectangle _bounds ; private Bitmap _image ; private string _name ; protected TesseractEngine Engine ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap Image { get => _image ; set => _image = value ; } public string Name { get => _name ; protected set => _name = value ; } //This will have to be changed if you want to make it run on your machine public static DirectoryInfo TESS_DATA_FOLDER = new DirectoryInfo ( @\"C:\\Users\\Moi\\Pictures\\SeleniumScreens\\TessData\" ); //Debug public static Random rnd = new Random (); public Bitmap WindowImage { get { //This little trickery lets you have the image that the window sees Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( Image , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } /// /// Creates a new Window /// /// The image of the parent zone /// The position and size of the window /// Does the window need to generate a tesseract engine (takes time and ressources) public Window ( Bitmap image , Rectangle bounds , bool generateEngine = true ) { Image = image ; Bounds = bounds ; if ( generateEngine ) { Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } //DEBUG /* if (!Directory.Exists(STRING_DEBUG_FOLDER)) Directory.CreateDirectory(STRING_DEBUG_FOLDER); if (!Directory.Exists(LAPTIME_DEBUG_FOLDER)) Directory.CreateDirectory(LAPTIME_DEBUG_FOLDER); if (!Directory.Exists(GAPTOLEADER_DEBUG_FOLDER)) Directory.CreateDirectory(GAPTOLEADER_DEBUG_FOLDER); if (!Directory.Exists(SECTOR1_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR1_DEBUG_FOLDER); if (!Directory.Exists(SECTOR2_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR2_DEBUG_FOLDER); if (!Directory.Exists(SECTOR3_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR3_DEBUG_FOLDER); if (!Directory.Exists(DRS_DEBUG_FOLDER)) Directory.CreateDirectory(DRS_DEBUG_FOLDER); if (!Directory.Exists(TYRE_DEBUG_FOLDER)) Directory.CreateDirectory(TYRE_DEBUG_FOLDER); */ } /// /// Method that will have to be used by the childrens to let the model make them decode the images they have /// /// Returns an object because we dont know what kind of return it will be public virtual Object DecodePng () { return \"NaN\" ; } /// /// Method that will have to be used by the childrens to let the model make them decode the images they have /// /// This is a list of the different possible drivers in the race. It should not be too big but NEVER be too short /// Returns an object because we dont know what kind of return it will be public virtual Object DecodePng ( List < string > driverList ) { return \"NaN\" ; } /// /// This converts an image into a byte[]. It can be usefull when doing unsafe stuff. Use at your own risks /// /// The image you want to convert /// A byte array containing the image informations public static byte [] ImageToByte ( Image inputImage ) { using ( var stream = new MemoryStream ()) { inputImage . Save ( stream , System . Drawing . Imaging . ImageFormat . Png ); return stream . ToArray (); } } /// /// This method is used to recover a time from a PNG using Tesseract OCR /// /// The image where the text is /// The type of window it is /// The Tesseract Engine /// The time in milliseconds public static int GetTimeFromPng ( Bitmap image , OcrImage . WindowType windowType , TesseractEngine Engine ) { //Kind of a big method but it has a lot of error handling and has to work with three special cases string rawResult = \"\" ; int result = 0 ; //Debug int salt = rnd . Next ( 0 , 999999 ); switch ( windowType ) { case OcrImage . WindowType . Sector : //The usual sector is in this form : 33.456 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.\" ); break ; case OcrImage . WindowType . LapTime : //The usual Lap time is in this form : 1:45:345 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.:\" ); break ; case OcrImage . WindowType . Gap : //The usual Gap is in this form : + 34.567 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.+\" ); break ; default : Engine . SetVariable ( \"tessedit_char_whitelist\" , \"\" ); break ; } Bitmap enhancedImage = new OcrImage ( image ). Enhance ( windowType ); var tessImage = Pix . LoadFromMemory ( ImageToByte ( enhancedImage )); Page page = Engine . Process ( tessImage ); Graphics g = Graphics . FromImage ( enhancedImage ); // Get the iterator for the page layout using ( var iter = page . GetIterator ()) { // Loop over the elements of the page layout iter . Begin (); do { // Get the text for the current element try { rawResult += iter . GetText ( PageIteratorLevel . Word ); } catch { //nothing we just dont add it if its not a number } } while ( iter . Next ( PageIteratorLevel . Word )); } List < string > rawNumbers ; //In the gaps we can find '+' but we dont care about it its redondant a driver will never be - something if ( windowType == OcrImage . WindowType . Gap ) rawResult = Regex . Replace ( rawResult , \"[^0-9.:]\" , \"\" ); //Splits into minuts seconds miliseconds rawNumbers = rawResult . Split ( '.' , ':' ). ToList < string >(); //removes any empty cells (tho this usually sign of a really bad OCR implementation tbh will have to be fixed higher in the chian) rawNumbers . RemoveAll ( x => (( string ) x ) == \"\" ); int minuts = 0 ; int seconds = 0 ; int miliseconds = 0 ; switch ( windowType ) { case OcrImage . WindowType . Sector : //Usually there is supposed to be only 2 parts. if ( rawNumbers . Count == 2 ) { //The perect case try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { if ( rawNumbers . Count == 1 ) { //Here it is a little harder... Usually its because a '.' has been overlooked or interpreted as a number if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' has been understood as a number try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { Console . WriteLine ( \"Sector time convertion failed\" ); } } } else { //The OCR detected more than 1 '.' wich is concerning because that means that something went really wrong Console . WriteLine ( \"Sector time convertion failed\" ); } } result = 0 ; result += seconds * 1000 ; result += miliseconds ; break ; case OcrImage . WindowType . LapTime : if ( rawNumbers . Count == 3 ) { //The normal way try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 2 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers . Count == 2 ) { //Either the ':' or the '.' has been missinterpreted if ( rawNumbers [ 0 ]. Length > rawNumbers [ 1 ]. Length ) { //The ':' has been missinterpreted if ( rawNumbers [ 0 ]. Length == 3 ) { //It has been forgotten try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 4 ) { //I has been translated into an other number try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { //This could happen if the ':' has been missinterpreted with a lap time of over 9 minuts (HIGLY IMPROBABLE) Console . WriteLine ( \"Lap time convertion failed\" ); } } } else { //The '.' has been missinterpreted if ( rawNumbers [ 1 ]. Length == 5 ) { //It has been forgotten minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 0 ]. ToString () + rawNumbers [ 1 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 2 ]. ToString () + rawNumbers [ 1 ][ 3 ]. ToString () + rawNumbers [ 1 ][ 4 ]. ToString ()); } else { if ( rawNumbers [ 1 ]. Length == 6 ) { try { //It has been interpreted as a number minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 0 ]. ToString () + rawNumbers [ 1 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 3 ]. ToString () + rawNumbers [ 1 ][ 4 ]. ToString () + rawNumbers [ 1 ][ 5 ]. ToString ()); } catch { //It can happen and to be honest I dont know how to fix it } } else { Console . WriteLine ( \"Lap time convertion failed\" ); } } } } else { if ( rawNumbers . Count == 1 ) { //Both the '.' and the ':' have been missinterpreted if ( rawNumbers [ 0 ]. Length == 6 ) { //The just all have been forgotten try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 7 ) { //The '.' or ':' have been interpreted as a number (usually the ':') try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString () + rawNumbers [ 0 ][ 6 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 8 ) { //Both have been interpreted as a number try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 5 ]. ToString () + rawNumbers [ 0 ][ 6 ]. ToString () + rawNumbers [ 0 ][ 7 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { //I dont know what could have happened Console . WriteLine ( \"Lap time convertion failed\" ); } } } } else { //I dont know what could have happened Console . WriteLine ( \"Lap time convertion failed\" ); } } } result = 0 ; result += minuts * 60 * 1000 ; result += seconds * 1000 ; result += miliseconds ; break ; case OcrImage . WindowType . Gap : if ( rawNumbers . Count == 2 ) { // This should be the x.xxx or a missed x:xx.xxx if ( rawNumbers [ 0 ]. Length > 2 ) { //Its a missed x:xx.xxx if ( rawNumbers [ 0 ]. Length == 3 ) { //It forgot the \":\" try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { //The \":\" has been mistaken as a number if ( rawNumbers [ 0 ]. Length == 4 ) { try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } else { //It should be a normal x.xxx or xx.xxx try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } else { if ( rawNumbers . Count == 1 ) { //can be anything depending on the size of the string if ( rawNumbers [ 0 ]. Length == 4 ) { //We just missed the '.' try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 5 ) { //We just missed the '.' try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } //There is just too much possibilities that it would be stupid to try and tell them appart so for now im leaving that as just an error Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { if ( rawNumbers . Count == 3 ) { // This should be the x:xx.xxx try { //Gaps cant be more than 9 minuts so if there is more than 1 digit it means that the '+' has been understood as an other number if ( rawNumbers [ 0 ]. Length > 1 ) rawNumbers [ 0 ] = rawNumbers [ 0 ][ rawNumbers [ 0 ]. Length - 1 ]. ToString (); minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 2 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } } result = 0 ; result += minuts * 60 * 1000 ; result += seconds * 1000 ; result += miliseconds ; break ; default : try { result = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); } catch { result = 0 ; } break ; } page . Dispose (); return result ; } /// /// Method that recovers strings from an image using Tesseract OCR /// /// The image of the window that contains text /// The Tesseract engine /// The list of allowed chars /// The type of window the text is on. Depending on the context the OCR will behave differently /// the string it found public static string GetStringFromPng ( Bitmap image , TesseractEngine Engine , string allowedChars = \"\" , OcrImage . WindowType windowType = OcrImage . WindowType . Text ) { string result = \"\" ; //Debug int salt = rnd . Next ( 0 , 999999 ); Engine . SetVariable ( \"tessedit_char_whitelist\" , allowedChars ); Bitmap rawData = image ; Bitmap enhancedImage = new OcrImage ( rawData ). Enhance ( windowType ); Page page = Engine . Process ( enhancedImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { result += iter . GetText ( PageIteratorLevel . Word ); } while ( iter . Next ( PageIteratorLevel . Word )); } page . Dispose (); return result ; } /// /// Get a smaller image from a bigger one /// /// The big bitmap you want to get a part of /// The dimensions of the new bitmap /// The little bitmap protected Bitmap GetSmallBitmapFromBigOne ( Bitmap inputBitmap , Rectangle newBitmapDimensions ) { Bitmap sample = new Bitmap ( newBitmapDimensions . Width , newBitmapDimensions . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( inputBitmap , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), newBitmapDimensions , GraphicsUnit . Pixel ); return sample ; } /// /// Returns the closest string from a list of options /// /// an array of all the possibilities /// the string you want to compare /// The closest option protected static string FindClosestMatch ( List < string > options , string testString ) { var closestMatch = \"\" ; var closestDistance = int . MaxValue ; foreach ( var item in options ) { var distance = LevenshteinDistance ( item , testString ); if ( distance < closestDistance ) { closestMatch = item ; closestDistance = distance ; } } return closestMatch ; } //This method has been generated with the help of ChatGPT /// /// Method that computes a score of distance between two strings /// /// The first string (order irrelevant) /// The second string (order irrelevant) /// The levenshtein distance protected static int LevenshteinDistance ( string string1 , string string2 ) { if ( string . IsNullOrEmpty ( string1 )) { return string . IsNullOrEmpty ( string2 ) ? 0 : string2 . Length ; } if ( string . IsNullOrEmpty ( string2 )) { return string . IsNullOrEmpty ( string1 ) ? 0 : string1 . Length ; } var d = new int [ string1 . Length + 1 , string2 . Length + 1 ]; for ( var i = 0 ; i <= string1 . Length ; i ++) { d [ i , 0 ] = i ; } for ( var j = 0 ; j <= string2 . Length ; j ++) { d [ 0 , j ] = j ; } for ( var i = 1 ; i <= string1 . Length ; i ++) { for ( var j = 1 ; j <= string2 . Length ; j ++) { var cost = ( string1 [ i - 1 ] == string2 [ j - 1 ]) ? 0 : 1 ; d [ i , j ] = Math . Min ( Math . Min ( d [ i - 1 , j ] + 1 , d [ i , j - 1 ] + 1 ), d [ i - 1 , j - 1 ] + cost ); } } return d [ string1 . Length , string2 . Length ]; } } }","title":"Window.cs"},{"location":"Code/Window.html#windowcs","text":"/// Author : Maxime Rohmer /// Date : 30/05/2023 /// File : Window.cs /// Brief : Default Window object that is mainly expected to be inherited. /// Version : Alpha 1.0 using System ; using System.Collections.Generic ; using System.Linq ; using System.Text ; using System.Threading.Tasks ; using System.Drawing ; using System.IO ; using Tesseract ; using System.Text.RegularExpressions ; using System.Drawing.Drawing2D ; namespace TrackTrends { public class Window { public const string STRING_DEBUG_FOLDER = \"./GetString\" ; public const string LAPTIME_DEBUG_FOLDER = \"./LapTime\" ; public const string GAPTOLEADER_DEBUG_FOLDER = \"./Gap\" ; public const string SECTOR1_DEBUG_FOLDER = \"./Sector1\" ; public const string SECTOR2_DEBUG_FOLDER = \"./Sector2\" ; public const string SECTOR3_DEBUG_FOLDER = \"./Sector3\" ; public const string DRS_DEBUG_FOLDER = \"./DRS\" ; public const string TYRE_DEBUG_FOLDER = \"./Tyre\" ; private Rectangle _bounds ; private Bitmap _image ; private string _name ; protected TesseractEngine Engine ; public Rectangle Bounds { get => _bounds ; private set => _bounds = value ; } public Bitmap Image { get => _image ; set => _image = value ; } public string Name { get => _name ; protected set => _name = value ; } //This will have to be changed if you want to make it run on your machine public static DirectoryInfo TESS_DATA_FOLDER = new DirectoryInfo ( @\"C:\\Users\\Moi\\Pictures\\SeleniumScreens\\TessData\" ); //Debug public static Random rnd = new Random (); public Bitmap WindowImage { get { //This little trickery lets you have the image that the window sees Bitmap sample = new Bitmap ( Bounds . Width , Bounds . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( Image , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), Bounds , GraphicsUnit . Pixel ); return sample ; } } /// /// Creates a new Window /// /// The image of the parent zone /// The position and size of the window /// Does the window need to generate a tesseract engine (takes time and ressources) public Window ( Bitmap image , Rectangle bounds , bool generateEngine = true ) { Image = image ; Bounds = bounds ; if ( generateEngine ) { Engine = new TesseractEngine ( TESS_DATA_FOLDER . FullName , \"eng\" , EngineMode . Default ); Engine . DefaultPageSegMode = PageSegMode . SingleLine ; } //DEBUG /* if (!Directory.Exists(STRING_DEBUG_FOLDER)) Directory.CreateDirectory(STRING_DEBUG_FOLDER); if (!Directory.Exists(LAPTIME_DEBUG_FOLDER)) Directory.CreateDirectory(LAPTIME_DEBUG_FOLDER); if (!Directory.Exists(GAPTOLEADER_DEBUG_FOLDER)) Directory.CreateDirectory(GAPTOLEADER_DEBUG_FOLDER); if (!Directory.Exists(SECTOR1_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR1_DEBUG_FOLDER); if (!Directory.Exists(SECTOR2_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR2_DEBUG_FOLDER); if (!Directory.Exists(SECTOR3_DEBUG_FOLDER)) Directory.CreateDirectory(SECTOR3_DEBUG_FOLDER); if (!Directory.Exists(DRS_DEBUG_FOLDER)) Directory.CreateDirectory(DRS_DEBUG_FOLDER); if (!Directory.Exists(TYRE_DEBUG_FOLDER)) Directory.CreateDirectory(TYRE_DEBUG_FOLDER); */ } /// /// Method that will have to be used by the childrens to let the model make them decode the images they have /// /// Returns an object because we dont know what kind of return it will be public virtual Object DecodePng () { return \"NaN\" ; } /// /// Method that will have to be used by the childrens to let the model make them decode the images they have /// /// This is a list of the different possible drivers in the race. It should not be too big but NEVER be too short /// Returns an object because we dont know what kind of return it will be public virtual Object DecodePng ( List < string > driverList ) { return \"NaN\" ; } /// /// This converts an image into a byte[]. It can be usefull when doing unsafe stuff. Use at your own risks /// /// The image you want to convert /// A byte array containing the image informations public static byte [] ImageToByte ( Image inputImage ) { using ( var stream = new MemoryStream ()) { inputImage . Save ( stream , System . Drawing . Imaging . ImageFormat . Png ); return stream . ToArray (); } } /// /// This method is used to recover a time from a PNG using Tesseract OCR /// /// The image where the text is /// The type of window it is /// The Tesseract Engine /// The time in milliseconds public static int GetTimeFromPng ( Bitmap image , OcrImage . WindowType windowType , TesseractEngine Engine ) { //Kind of a big method but it has a lot of error handling and has to work with three special cases string rawResult = \"\" ; int result = 0 ; //Debug int salt = rnd . Next ( 0 , 999999 ); switch ( windowType ) { case OcrImage . WindowType . Sector : //The usual sector is in this form : 33.456 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.\" ); break ; case OcrImage . WindowType . LapTime : //The usual Lap time is in this form : 1:45:345 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.:\" ); break ; case OcrImage . WindowType . Gap : //The usual Gap is in this form : + 34.567 Engine . SetVariable ( \"tessedit_char_whitelist\" , \"0123456789.+\" ); break ; default : Engine . SetVariable ( \"tessedit_char_whitelist\" , \"\" ); break ; } Bitmap enhancedImage = new OcrImage ( image ). Enhance ( windowType ); var tessImage = Pix . LoadFromMemory ( ImageToByte ( enhancedImage )); Page page = Engine . Process ( tessImage ); Graphics g = Graphics . FromImage ( enhancedImage ); // Get the iterator for the page layout using ( var iter = page . GetIterator ()) { // Loop over the elements of the page layout iter . Begin (); do { // Get the text for the current element try { rawResult += iter . GetText ( PageIteratorLevel . Word ); } catch { //nothing we just dont add it if its not a number } } while ( iter . Next ( PageIteratorLevel . Word )); } List < string > rawNumbers ; //In the gaps we can find '+' but we dont care about it its redondant a driver will never be - something if ( windowType == OcrImage . WindowType . Gap ) rawResult = Regex . Replace ( rawResult , \"[^0-9.:]\" , \"\" ); //Splits into minuts seconds miliseconds rawNumbers = rawResult . Split ( '.' , ':' ). ToList < string >(); //removes any empty cells (tho this usually sign of a really bad OCR implementation tbh will have to be fixed higher in the chian) rawNumbers . RemoveAll ( x => (( string ) x ) == \"\" ); int minuts = 0 ; int seconds = 0 ; int miliseconds = 0 ; switch ( windowType ) { case OcrImage . WindowType . Sector : //Usually there is supposed to be only 2 parts. if ( rawNumbers . Count == 2 ) { //The perect case try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { if ( rawNumbers . Count == 1 ) { //Here it is a little harder... Usually its because a '.' has been overlooked or interpreted as a number if ( rawNumbers [ 0 ]. Length == 6 ) { //The '.' has been understood as a number try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 5 ) { //The '.' has been overlooked try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString ()); } catch { Console . WriteLine ( \"Sector time convertion failed\" ); } } else { Console . WriteLine ( \"Sector time convertion failed\" ); } } } else { //The OCR detected more than 1 '.' wich is concerning because that means that something went really wrong Console . WriteLine ( \"Sector time convertion failed\" ); } } result = 0 ; result += seconds * 1000 ; result += miliseconds ; break ; case OcrImage . WindowType . LapTime : if ( rawNumbers . Count == 3 ) { //The normal way try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 2 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers . Count == 2 ) { //Either the ':' or the '.' has been missinterpreted if ( rawNumbers [ 0 ]. Length > rawNumbers [ 1 ]. Length ) { //The ':' has been missinterpreted if ( rawNumbers [ 0 ]. Length == 3 ) { //It has been forgotten try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 4 ) { //I has been translated into an other number try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { //This could happen if the ':' has been missinterpreted with a lap time of over 9 minuts (HIGLY IMPROBABLE) Console . WriteLine ( \"Lap time convertion failed\" ); } } } else { //The '.' has been missinterpreted if ( rawNumbers [ 1 ]. Length == 5 ) { //It has been forgotten minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 0 ]. ToString () + rawNumbers [ 1 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 2 ]. ToString () + rawNumbers [ 1 ][ 3 ]. ToString () + rawNumbers [ 1 ][ 4 ]. ToString ()); } else { if ( rawNumbers [ 1 ]. Length == 6 ) { try { //It has been interpreted as a number minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 0 ]. ToString () + rawNumbers [ 1 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ][ 3 ]. ToString () + rawNumbers [ 1 ][ 4 ]. ToString () + rawNumbers [ 1 ][ 5 ]. ToString ()); } catch { //It can happen and to be honest I dont know how to fix it } } else { Console . WriteLine ( \"Lap time convertion failed\" ); } } } } else { if ( rawNumbers . Count == 1 ) { //Both the '.' and the ':' have been missinterpreted if ( rawNumbers [ 0 ]. Length == 6 ) { //The just all have been forgotten try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 7 ) { //The '.' or ':' have been interpreted as a number (usually the ':') try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 4 ]. ToString () + rawNumbers [ 0 ][ 5 ]. ToString () + rawNumbers [ 0 ][ 6 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 8 ) { //Both have been interpreted as a number try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 5 ]. ToString () + rawNumbers [ 0 ][ 6 ]. ToString () + rawNumbers [ 0 ][ 7 ]. ToString ()); } catch { Console . WriteLine ( \"Lap time convertion failed\" ); } } else { //I dont know what could have happened Console . WriteLine ( \"Lap time convertion failed\" ); } } } } else { //I dont know what could have happened Console . WriteLine ( \"Lap time convertion failed\" ); } } } result = 0 ; result += minuts * 60 * 1000 ; result += seconds * 1000 ; result += miliseconds ; break ; case OcrImage . WindowType . Gap : if ( rawNumbers . Count == 2 ) { // This should be the x.xxx or a missed x:xx.xxx if ( rawNumbers [ 0 ]. Length > 2 ) { //Its a missed x:xx.xxx if ( rawNumbers [ 0 ]. Length == 3 ) { //It forgot the \":\" try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { //The \":\" has been mistaken as a number if ( rawNumbers [ 0 ]. Length == 4 ) { try { minuts = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } else { //It should be a normal x.xxx or xx.xxx try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } else { if ( rawNumbers . Count == 1 ) { //can be anything depending on the size of the string if ( rawNumbers [ 0 ]. Length == 4 ) { //We just missed the '.' try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 1 ]. ToString () + rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { if ( rawNumbers [ 0 ]. Length == 5 ) { //We just missed the '.' try { seconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 0 ]. ToString () + rawNumbers [ 0 ][ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 0 ][ 2 ]. ToString () + rawNumbers [ 0 ][ 3 ]. ToString () + rawNumbers [ 0 ][ 4 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } //There is just too much possibilities that it would be stupid to try and tell them appart so for now im leaving that as just an error Console . WriteLine ( \"Gap to leader convertion failed\" ); } } else { if ( rawNumbers . Count == 3 ) { // This should be the x:xx.xxx try { //Gaps cant be more than 9 minuts so if there is more than 1 digit it means that the '+' has been understood as an other number if ( rawNumbers [ 0 ]. Length > 1 ) rawNumbers [ 0 ] = rawNumbers [ 0 ][ rawNumbers [ 0 ]. Length - 1 ]. ToString (); minuts = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); seconds = Convert . ToInt32 ( rawNumbers [ 1 ]. ToString ()); miliseconds = Convert . ToInt32 ( rawNumbers [ 2 ]. ToString ()); } catch { Console . WriteLine ( \"Gap to leader convertion failed\" ); } } } } result = 0 ; result += minuts * 60 * 1000 ; result += seconds * 1000 ; result += miliseconds ; break ; default : try { result = Convert . ToInt32 ( rawNumbers [ 0 ]. ToString ()); } catch { result = 0 ; } break ; } page . Dispose (); return result ; } /// /// Method that recovers strings from an image using Tesseract OCR /// /// The image of the window that contains text /// The Tesseract engine /// The list of allowed chars /// The type of window the text is on. Depending on the context the OCR will behave differently /// the string it found public static string GetStringFromPng ( Bitmap image , TesseractEngine Engine , string allowedChars = \"\" , OcrImage . WindowType windowType = OcrImage . WindowType . Text ) { string result = \"\" ; //Debug int salt = rnd . Next ( 0 , 999999 ); Engine . SetVariable ( \"tessedit_char_whitelist\" , allowedChars ); Bitmap rawData = image ; Bitmap enhancedImage = new OcrImage ( rawData ). Enhance ( windowType ); Page page = Engine . Process ( enhancedImage ); using ( var iter = page . GetIterator ()) { iter . Begin (); do { result += iter . GetText ( PageIteratorLevel . Word ); } while ( iter . Next ( PageIteratorLevel . Word )); } page . Dispose (); return result ; } /// /// Get a smaller image from a bigger one /// /// The big bitmap you want to get a part of /// The dimensions of the new bitmap /// The little bitmap protected Bitmap GetSmallBitmapFromBigOne ( Bitmap inputBitmap , Rectangle newBitmapDimensions ) { Bitmap sample = new Bitmap ( newBitmapDimensions . Width , newBitmapDimensions . Height ); Graphics g = Graphics . FromImage ( sample ); g . DrawImage ( inputBitmap , new Rectangle ( 0 , 0 , sample . Width , sample . Height ), newBitmapDimensions , GraphicsUnit . Pixel ); return sample ; } /// /// Returns the closest string from a list of options /// /// an array of all the possibilities /// the string you want to compare /// The closest option protected static string FindClosestMatch ( List < string > options , string testString ) { var closestMatch = \"\" ; var closestDistance = int . MaxValue ; foreach ( var item in options ) { var distance = LevenshteinDistance ( item , testString ); if ( distance < closestDistance ) { closestMatch = item ; closestDistance = distance ; } } return closestMatch ; } //This method has been generated with the help of ChatGPT /// /// Method that computes a score of distance between two strings /// /// The first string (order irrelevant) /// The second string (order irrelevant) /// The levenshtein distance protected static int LevenshteinDistance ( string string1 , string string2 ) { if ( string . IsNullOrEmpty ( string1 )) { return string . IsNullOrEmpty ( string2 ) ? 0 : string2 . Length ; } if ( string . IsNullOrEmpty ( string2 )) { return string . IsNullOrEmpty ( string1 ) ? 0 : string1 . Length ; } var d = new int [ string1 . Length + 1 , string2 . Length + 1 ]; for ( var i = 0 ; i <= string1 . Length ; i ++) { d [ i , 0 ] = i ; } for ( var j = 0 ; j <= string2 . Length ; j ++) { d [ 0 , j ] = j ; } for ( var i = 1 ; i <= string1 . Length ; i ++) { for ( var j = 1 ; j <= string2 . Length ; j ++) { var cost = ( string1 [ i - 1 ] == string2 [ j - 1 ]) ? 0 : 1 ; d [ i , j ] = Math . Min ( Math . Min ( d [ i - 1 , j ] + 1 , d [ i , j - 1 ] + 1 ), d [ i - 1 , j - 1 ] + cost ); } } return d [ string1 . Length , string2 . Length ]; } } }","title":"Window.cs"},{"location":"Code/recoverCookiesCSV.html","text":"recoverCookiesCSV.py # Rohmer Maxime # RecoverCookies.py # Little script that recovers the cookies stored in the chrome sqlite database and then decrypts them using the key stored in the chrome files # This script has been created to be used by an other programm or for the data to not be used directly. This is why it stores all the decoded cookies in a csv. (Btw could be smart for the end programm to delete the csv after using it) # Parts of this cript have been created with the help of ChatGPT import os import json import base64 import sqlite3 import win32crypt from Cryptodome.Cipher import AES from pathlib import Path import csv def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key def decrypt_payload ( cipher , payload ): return cipher . decrypt ( payload ) def generate_cipher ( aes_key , iv ): return AES . new ( aes_key , AES . MODE_GCM , iv ) def decrypt_password ( buff , master_key ): try : iv = buff [ 3 : 15 ] payload = buff [ 15 :] cipher = generate_cipher ( master_key , iv ) decrypted_pass = decrypt_payload ( cipher , payload ) decrypted_pass = decrypted_pass [: - 16 ] . decode () # remove suffix bytes return decrypted_pass except Exception : # print(\"Probably saved password from Chrome version older than v80\\n\") # print(str(e)) return \"Chrome < 80\" master_key = get_master_key () cookies_path = Path ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Default \\\\ Network \\\\ Cookies\" ) if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" )","title":"recoverCookiesCSV.py"},{"location":"Code/recoverCookiesCSV.html#recovercookiescsvpy","text":"# Rohmer Maxime # RecoverCookies.py # Little script that recovers the cookies stored in the chrome sqlite database and then decrypts them using the key stored in the chrome files # This script has been created to be used by an other programm or for the data to not be used directly. This is why it stores all the decoded cookies in a csv. (Btw could be smart for the end programm to delete the csv after using it) # Parts of this cript have been created with the help of ChatGPT import os import json import base64 import sqlite3 import win32crypt from Cryptodome.Cipher import AES from pathlib import Path import csv def get_master_key (): with open ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Local State\" , \"r\" ) as f : local_state = f . read () local_state = json . loads ( local_state ) master_key = base64 . b64decode ( local_state [ \"os_crypt\" ][ \"encrypted_key\" ]) master_key = master_key [ 5 :] # removing DPAPI master_key = win32crypt . CryptUnprotectData ( master_key , None , None , None , 0 )[ 1 ] print ( \"MASTER KEY :\" ) print ( master_key ) print ( len ( master_key )) return master_key def decrypt_payload ( cipher , payload ): return cipher . decrypt ( payload ) def generate_cipher ( aes_key , iv ): return AES . new ( aes_key , AES . MODE_GCM , iv ) def decrypt_password ( buff , master_key ): try : iv = buff [ 3 : 15 ] payload = buff [ 15 :] cipher = generate_cipher ( master_key , iv ) decrypted_pass = decrypt_payload ( cipher , payload ) decrypted_pass = decrypted_pass [: - 16 ] . decode () # remove suffix bytes return decrypted_pass except Exception : # print(\"Probably saved password from Chrome version older than v80\\n\") # print(str(e)) return \"Chrome < 80\" master_key = get_master_key () cookies_path = Path ( os . getenv ( \"localappdata\" ) + \" \\\\ Google \\\\ Chrome \\\\ User Data \\\\ Default \\\\ Network \\\\ Cookies\" ) if not cookies_path . exists (): raise ValueError ( \"Cookies file not found\" ) with sqlite3 . connect ( cookies_path ) as connection : connection . row_factory = sqlite3 . Row cursor = connection . cursor () cursor . execute ( \"SELECT * FROM cookies\" ) with open ( 'cookies.csv' , 'a' , newline = '' ) as csvfile : fieldnames = [ 'host_key' , 'name' , 'value' , 'path' , 'expires_utc' , 'is_secure' , 'is_httponly' ] writer = csv . DictWriter ( csvfile , fieldnames = fieldnames ) if csvfile . tell () == 0 : writer . writeheader () for row in cursor . fetchall (): decrypted_value = decrypt_password ( row [ \"encrypted_value\" ], master_key ) writer . writerow ({ 'host_key' : row [ \"host_key\" ], 'name' : row [ \"name\" ], 'value' : decrypted_value , 'path' : row [ \"path\" ], 'expires_utc' : row [ \"expires_utc\" ], 'is_secure' : row [ \"is_secure\" ], 'is_httponly' : row [ \"is_httponly\" ] }) print ( \"Finished CSV\" )","title":"recoverCookiesCSV.py"}]} \ No newline at end of file diff --git a/site/sitemap.xml.gz b/site/sitemap.xml.gz index 50058bae5164959bcdfccd8da061f065cd6f4e46..78244343bbbb6000c1cc6cc1b4da5cd713f1d018 100644 GIT binary patch delta 13 Ucmb=gXP58h;P_$LFp<3i03LV*fdBvi delta 13 Ucmb=gXP58h;Bfp>JCVHt03FE$f&c&j diff --git a/temp_annexes/Code/ConfigurationTool.md b/temp_annexes/Code/ConfigurationTool.md new file mode 100644 index 0000000..a1bcfbc --- /dev/null +++ b/temp_annexes/Code/ConfigurationTool.md @@ -0,0 +1,266 @@ +# ConfigurationTool.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : ConfigurationTool.cs +/// Brief : Class that contains all the methods used to create config files for the main programm +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tesseract; +using System.IO; +using System.Text.Json; +using System.Text.Json.Nodes; + +namespace TrackTrends +{ + public class ConfigurationTool + { + public Zone MainZone; + public const int NUMBER_OF_DRIVERS = 20; + public const int NUMBER_OF_ZONES = 9; + public const string CONFIGS_FOLDER_NAME = "./Presets/"; + /// + /// Creates the configuration tool. It can only be created if you already have the dimensions of the main zone + /// + /// The full image coming from the F1TV Data Channel + /// The dimensions of the zone where all the drivers data are situated + public ConfigurationTool(Bitmap fullImage, Rectangle mainZoneDimensions) + { + MainZone = new Zone(fullImage, mainZoneDimensions,"Main"); + AutoCalibrate(); + } + /// + /// Resets the main zone + /// + public void ResetMainZone() + { + MainZone.ResetZones(); + } + /// + /// Reset the windows + /// + public void ResetWindows() + { + MainZone.ResetWindows(); + } + /// + /// Save the current config in a JSON file stored in /Presets/ + /// + /// A list of all the drivers in the GP. IMPORTANT, they need to ALL be mentionned or the program wont be able to detect the missing ones and will F up everything + /// The name the config should have + public void SaveToJson(List drivers, string configName) + { + string JSON = ""; + + JsonObject jsonFileObject = new JsonObject(); + + //Creates the mainZone object + JsonObject mainZoneObject = new JsonObject(); + + mainZoneObject.Add("x",MainZone.Bounds.X); + mainZoneObject.Add("y",MainZone.Bounds.Y); + mainZoneObject.Add("width",MainZone.Bounds.Width); + mainZoneObject.Add("height",MainZone.Bounds.Height); + + JsonArray driverZonesArray = new JsonArray(); + + //Creates all the subzones that contain driver infos + int DriverID = 0; + foreach (Zone driverZone in MainZone.Zones) + { + DriverID++; + JsonObject driverZoneObject = new JsonObject(); + driverZoneObject.Add("name","Driver"+DriverID); + driverZoneObject.Add("x", driverZone.Bounds.X); + driverZoneObject.Add("y", driverZone.Bounds.Y); + driverZoneObject.Add("width", driverZone.Bounds.Width); + driverZoneObject.Add("height", driverZone.Bounds.Height); + + JsonArray windowsArray = new JsonArray(); + JsonObject windowObject = new JsonObject(); + + //Creates all the windows of the current driver zone + //Note : We store ALL the windows and zones in the JSON because they are not spaced exactly the same on the main zone + foreach (Window window in driverZone.Windows) + { + windowObject.Add(window.Name, new JsonObject { + { "x", window.Bounds.X }, + { "y", window.Bounds.Y }, + { "width", window.Bounds.Width }, + { "height", window.Bounds.Height } + }); + } + windowsArray.Add(windowObject); + + driverZoneObject.Add("Windows",windowsArray); + + driverZonesArray.Add(driverZoneObject); + } + + mainZoneObject.Add("DriverZones",driverZonesArray); + + JsonArray driversArray = new JsonArray(); + + foreach (string driver in drivers) + { + driversArray.Add(driver); + } + + mainZoneObject.Add("Drivers",driversArray); + + jsonFileObject.Add("Main",mainZoneObject); + + JSON = jsonFileObject.ToString(); + + //Saving the file + string path = CONFIGS_FOLDER_NAME + configName; + + if (File.Exists(path + ".json")) + { + //We need to create a new name + int count = 2; + while (File.Exists(path + "_" + count + ".json")) + { + count++; + } + path += "_" + count + ".json"; + } + else + { + path += ".json"; + } + + File.WriteAllText(path, JSON); + } + /// + /// Adds a window in the windows list + /// Be carefull of the order. It cant be random or it will crash. The programm expect the first to be position, second Gap to leader etc... + /// + /// The bounds of the window + public void AddWindows(List rectangles) + { + foreach (Zone driverZone in MainZone.Zones) + { + Bitmap zoneImage = driverZone.ZoneImage; + + for (int i = 1; i <= rectangles.Count; i++) + { + switch (i) + { + case 1: + //First zone should be the driver's Position + driverZone.AddWindow(new DriverPositionWindow(driverZone.ZoneImage, rectangles[i - 1], false)); + break; + case 2: + //Second zone should be the Gap to leader + driverZone.AddWindow(new DriverGapToLeaderWindow(driverZone.ZoneImage, rectangles[i - 1], false)); + break; + case 3: + //Third zone should be the driver's Lap Time + driverZone.AddWindow(new DriverLapTimeWindow(driverZone.ZoneImage, rectangles[i - 1], false)); + break; + case 4: + //Fourth zone should be the driver's DRS status + driverZone.AddWindow(new DriverDrsWindow(driverZone.ZoneImage, rectangles[i - 1], false)); + break; + case 5: + //Fifth zone should be the driver's Tyre's informations + driverZone.AddWindow(new DriverTyresWindow(driverZone.ZoneImage, rectangles[i - 1], false)); + break; + case 6: + //Sixth zone should be the driver's Name + driverZone.AddWindow(new DriverNameWindow(driverZone.ZoneImage, rectangles[i - 1], false)); + break; + case 7: + //Seventh zone should be the driver's First Sector + driverZone.AddWindow(new DriverSectorWindow(driverZone.ZoneImage, rectangles[i - 1], 1, false)); + break; + case 8: + //Zone number eight should be the driver's Second Sector + driverZone.AddWindow(new DriverSectorWindow(driverZone.ZoneImage, rectangles[i - 1], 2, false)); + break; + case 9: + //Zone number nine should be the driver's Position Sector + driverZone.AddWindow(new DriverSectorWindow(driverZone.ZoneImage, rectangles[i - 1], 3, false)); + break; + } + } + } + } + /// + /// This will automatically create all the driver zones at the correct places if the main zone has been weel positionned + /// You cant just divide the image by the number of pilots or it will be messy and inconsistent at the end (Garbage in Garbage Out) + /// + public void AutoCalibrate() + { + List detectedText = new List(); + List zones = new List(); + + TesseractEngine engine = new TesseractEngine(Window.TESS_DATA_FOLDER.FullName, "eng", EngineMode.Default); + Image image = MainZone.ZoneImage; + var tessImage = Pix.LoadFromMemory(Window.ImageToByte(image)); + + Page page = engine.Process(tessImage); + //Runs a quick OCR detection. Not to detect any content but just to detect where is all the text positionned. + //For each row it decides the best Zone location and adds it to the Driver zone list + using (var iter = page.GetIterator()) + { + iter.Begin(); + do + { + Rect boundingBox; + if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out boundingBox)) + { + //We remove all the rectangles that are definitely too big + if (boundingBox.Height < image.Height / NUMBER_OF_DRIVERS) + { + //Now we add a filter to only get the boxes in the right because they are much more reliable in size + if (boundingBox.X1 > image.Width / 2) + { + //Now we check if an other square box has been found roughly in the same y axis + bool match = false; + //The tolerance is roughly half the size that a window will be + int tolerance = (image.Height / NUMBER_OF_DRIVERS) / 2; + + foreach (Rectangle rect in detectedText) + { + if (rect.Y > boundingBox.Y1 - tolerance && rect.Y < boundingBox.Y1 + tolerance) + { + //There already is a rectangle in this line + match = true; + } + } + //if nothing matched we can add it + if (!match) + detectedText.Add(new Rectangle(boundingBox.X1, boundingBox.Y1, boundingBox.Width, boundingBox.Height)); + } + } + } + } while (iter.Next(PageIteratorLevel.Word)); + } + //DEBUG + int i = 1; + foreach (Rectangle Rectangle in detectedText) + { + Rectangle windowRectangle; + Size windowSize = new Size(image.Width, image.Height / NUMBER_OF_DRIVERS); + Point windowLocation = new Point(0, (Rectangle.Y + Rectangle.Height / 2) - windowSize.Height / 2); + windowRectangle = new Rectangle(windowLocation, windowSize); + //We add the driver zones + Zone driverZone = new Zone(MainZone.ZoneImage, windowRectangle, "DriverZone"); + MainZone.AddZone(driverZone); + //driverZone.ZoneImage.Save("Driver" + i+".png"); + i++; + } + } + } +} + +``` diff --git a/temp_annexes/Code/DataWrapper.md b/temp_annexes/Code/DataWrapper.md new file mode 100644 index 0000000..b349a37 --- /dev/null +++ b/temp_annexes/Code/DataWrapper.md @@ -0,0 +1,384 @@ +# DataWrapper.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : DataWrapper.cs +/// Brief : Class that is used to interface between the main Form (vue) and the Storage (wich is a class that wraps the sqlite database, so the model) its almost MVC :D +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.Drawing; + +namespace TrackTrends +{ + internal class DataWrapper + { + private Reader Reader; + private SqliteStorage Storage; + List> LiveDriverDataLogs = new List>(); + //Note : It could be usefull to get the mainForm at the start of the programm and not have to take it in half of the methods. + /// + /// Constructs a new DataWrapper. It needs the config file so it can create a Reader, It also needs a first screenshot for the same reason + /// + /// The JSON config file that is created by the configuration tool + /// A screenshot of the + public DataWrapper(string configFile, Bitmap screenshot) + { + Reader = new Reader(configFile, screenshot, true); + //The Storage is here and on the Reader. It seems bad but it is ok as we dont use it at all to insert data and are only using it here to read some. The reader takes care of the inserts (Note: We could technically do both here but I did not find it usefull to transfer everything here) + Storage = Reader.Storage; + } + /// + /// Refreshes the controller so it has the latest driver datas (Be sure to call it everytime you need to use any other method and expects the data to be up to date) + /// + /// Error code, 0 is success, 1 is not (Note: Maybe it could be interesting in the future to add some more error handling here) + public int Refresh() + { + LiveDriverDataLogs.Add(Reader.Decode(Reader.MainZones, Reader.Drivers)); + if (LiveDriverDataLogs.Count > 0) + return 0; + return 1; + } + /// + /// Changes the image to the newest screenshot in all of the zones and windows + /// + /// The new screenshot to put everywhere (Do not mix resolutions) + public void ChangeImage(Bitmap image) + { + Reader.ChangeImage(image); + } + /// + /// Gets all the data from one driver and also displays into the given panel the last five laps (or less if its the sart of the race) Note: Its responsive :D + /// + /// The name of the driver (should not be case sensitive but it MUST already exist in the first list that has been inserted into the DB) + /// The pannel where you want the five last laps to be displayed + /// The Main form. + /// + public DriverData GetFullDriverData(string driverName, Panel lastFiveLapsPanel, Main form1) + { + //Note : I know that its a bad idea to ask the Form in this method and some others because it means that it wont work with any main form. And to that Ill say that... your right ! + DriverData result = new DriverData(); + if (LiveDriverDataLogs.Count > 0) + { + //Searches the most recent live data from the given driverName + foreach (DriverData data in LiveDriverDataLogs[LiveDriverDataLogs.Count - 1]) + { + if (data.Name == driverName) + result = data; + } + + if (result.Name != "") + { + //Recovers and displays the last five laps from the driver + lastFiveLapsPanel.Controls.Clear(); + Size labelDimensions = new Size(lastFiveLapsPanel.Width, lastFiveLapsPanel.Height / 5); + + List<(int LapTime, int Lap)> lapsInfos = Storage.GetDriverLaptimes(driverName, 5); + + int id = 0; + foreach ((int LapTime, int Lap) lapData in lapsInfos) + { + //Hardcodes the new button. + //Note : It could be smart to have like a default button for all the methods to use without needing to rewrite everything. + Button newButton = new Button(); + lastFiveLapsPanel.Controls.Add(newButton); + newButton.Name = driverName + "_" + lapData.Lap; + newButton.Text = Reader.ConvertMsToTime(lapData.LapTime); + newButton.Size = labelDimensions; + newButton.FlatStyle = FlatStyle.Popup; + newButton.Click += form1.btnLapTime_Click; + newButton.Location = new Point(0, id * newButton.Height); + id++; + } + } + } + + return result; + } + /// + /// Runs trough every drivers live data to recover the drivers that are close to each others + /// + /// The control that will host the displayed battles + /// The main form. It needs to have a method called 'btnDriver_Click' so it can reads the buttons clicks + public void DisplayBattles(Panel pnlBattles,Main form1) + { + DriverData oldDriver = null; + List<(DriverData d1, DriverData d2, int gap)> battles = new List<(DriverData d1, DriverData d2, int gap)>(); + //Search trough all the drivers and finds the one battling + foreach (DriverData driver in LiveDriverDataLogs[LiveDriverDataLogs.Count - 1]) + { + if (oldDriver != null && driver.Position != -1 && oldDriver.Position != -1) + { + if (driver.GapToLeader < oldDriver.GapToLeader) + { + //There is a problem with the drivers gaps + } + else + { + int gap = driver.GapToLeader - oldDriver.GapToLeader; + //3000ms is 3s. If drivers are that close then they are definitely in battle. If they are farther then maybe not + if (gap <= 3000) + { + battles.Add((oldDriver, driver, gap)); + } + } + oldDriver = driver; + } + else + { + oldDriver = driver; + } + } + //We will only display 4 battles max + int maxBattles = 4; + if (battles.Count > 0) + { + pnlBattles.Controls.Clear(); + int maxUiHeight = Math.Max(pnlBattles.Height / maxBattles, pnlBattles.Height / battles.Count); + int id = 0; + foreach ((DriverData d1, DriverData d2, int gap) battle in battles) + { + if(id < maxBattles) + { + //*hardcoding* the different controls that needs to be added to the panel. + //Note : this stuff could totally be handled by the Form with method returning a list of the drivers. It was just easier for me at the time to code it this way but its not the prettiest + Button btnFirstDriver = new Button(); + Button btnSecondDriver = new Button(); + Label lblGap = new Label(); + + pnlBattles.Controls.Add(btnFirstDriver); + pnlBattles.Controls.Add(lblGap); + pnlBattles.Controls.Add(btnSecondDriver); + + btnFirstDriver.Anchor = AnchorStyles.Left | AnchorStyles.Top; + btnSecondDriver.Anchor = AnchorStyles.Right | AnchorStyles.Top; + lblGap.Anchor = AnchorStyles.Right | AnchorStyles.Left | AnchorStyles.Top; + + lblGap.TextAlign = ContentAlignment.MiddleCenter; + lblGap.Font = new Font(lblGap.Font.FontFamily, 15); + + btnFirstDriver.Click += form1.btnDriver_Click; + btnSecondDriver.Click += form1.btnDriver_Click; + + btnFirstDriver.FlatStyle = FlatStyle.Popup; + btnSecondDriver.FlatStyle = FlatStyle.Popup; + lblGap.FlatStyle = FlatStyle.Popup; + + btnFirstDriver.Size = new Size(pnlBattles.Width / 3, maxUiHeight); + btnSecondDriver.Size = new Size(pnlBattles.Width / 3, maxUiHeight); + lblGap.Size = new Size(pnlBattles.Width / 3, maxUiHeight); + + btnFirstDriver.Location = new Point(pnlBattles.Width / 3 * 0, id * maxUiHeight); + lblGap.Location = new Point(pnlBattles.Width / 3 * 1, id * maxUiHeight); + btnSecondDriver.Location = new Point(pnlBattles.Width / 3 * 2, id * maxUiHeight); + + btnFirstDriver.Text = battle.d1.Name; + lblGap.Text = "+ " + Reader.ConvertMsToTime(battle.gap); + if (battle.gap <= 2000) + lblGap.ForeColor = Color.Yellow; + if (battle.gap <= 1000) + lblGap.ForeColor = Color.Green; + btnSecondDriver.Text = battle.d2.Name; + + btnFirstDriver.Name = battle.d1.Name + "_" + id; + lblGap.Name = "lbl_Gap_" + id; + btnSecondDriver.Name = battle.d2.Name + "_" + id; + } + else + { + break; + } + id++; + } + } + } + /// + /// Searches the fastest and slowests drivers and displays them in the given panels + /// + /// Panel that will contain the constructed controls + /// Panel that will contain the constructed controls + /// The main form that needs to implement the method btnDriver_Click to allow it to recover custom buttons click + public void DisplayTimesDeltas(Panel pnlFastest,Panel pnlSlowest, Main form1) + { + List<(int avg, string driverName)> averages = new List<(int avg, string driverName)>(); + foreach (DriverData driver in LiveDriverDataLogs[LiveDriverDataLogs.Count - 1]) + { + //We want to recover the last 5 lap times + List<(int lapTime,int lap)> laps = Storage.GetDriverLaptimes(driver.Name,5); + if(laps.Count > 0) + { + int avg = 0; + foreach ((int lapTime, int lap) lap in laps) + { + avg += lap.lapTime; + } + avg = avg / laps.Count; + averages.Add((avg, driver.Name)); + } + } + int numberOfDriversToShow = 5; + if (averages.Count > 0 && averages.Count > numberOfDriversToShow) + { + averages = averages.OrderBy(item => item.avg).ToList(); + pnlFastest.Controls.Clear(); + pnlSlowest.Controls.Clear(); + int maxUiSize = pnlFastest.Height / numberOfDriversToShow; + + //Displays the fastest drivers + for (int i = 0; i < numberOfDriversToShow; i++) + { + Button newButton = new Button(); + (int avg, string driver) data = averages[i]; + pnlFastest.Controls.Add(newButton); + newButton.Size = new Size(pnlFastest.Width, maxUiSize); + newButton.Location = new Point(0, i * maxUiSize); + newButton.Text = data.driver; + newButton.FlatStyle = FlatStyle.Popup; + newButton.Name = data.driver + "_fastest_" + i; + newButton.Click += form1.btnDriver_Click; + //We take the average time lost per lap + if (i != 0) + newButton.Text += " + " + Reader.ConvertMsToTime(Convert.ToInt32(((float)data.avg - (float)averages[0].avg) / 5.0f)); + } + //Displays the slowests drivers + int badId = 0; + for (int i = averages.Count -1; i >= averages.Count - numberOfDriversToShow; i--) + { + Button newButton = new Button(); + (int avg, string driver) data = averages[i]; + pnlSlowest.Controls.Add(newButton); + newButton.Size = new Size(pnlFastest.Width, maxUiSize); + newButton.Location = new Point(0, badId * maxUiSize); + newButton.Text = data.driver; + newButton.FlatStyle = FlatStyle.Popup; + newButton.Name = data.driver + "_slowest_" + i; + newButton.Click += form1.btnDriver_Click; + //We take the average time lost per lap + newButton.Text += " + " + Reader.ConvertMsToTime(Convert.ToInt32(((float)data.avg - (float)averages[0].avg) / 5.0f)); + badId++; + } + } + } + /// + /// Will add to the list of overtakes the different changes of position + /// + /// The listbox containing all the infos + public void DisplayOvertakes(ListBox lsbResult) + { + //Note : This method SHOULD REALLY not do this but just return a string or a list of string with the new overtakes so the form can handle it as it wishes + if (LiveDriverDataLogs.Count > 1) + { + List oldList = LiveDriverDataLogs[LiveDriverDataLogs.Count - 2]; + List newList = LiveDriverDataLogs[LiveDriverDataLogs.Count - 1]; + for (int i = 0; i < LiveDriverDataLogs[LiveDriverDataLogs.Count - 1].Count;i++) + { + if (oldList[i].Name != newList[i].Name) { + //There has been a change in the standings + for(int y = 0; y < oldList.Count;y++) + { + if (newList[y].Name == oldList[i].Name) + { + //We found its new location + if (y > i) + { + //The driver overtook someone + lsbResult.Items.Add(newList[y].Name + " climbed to " + y); + } + else + { + //The driver got overtook by someone + lsbResult.Items.Add(newList[y].Name + " fell to " + y); + } + + } + } + } + } + } + } + /// + /// Displays a messageBox containing the infos about a lap time + /// + /// The name of the driver that has done the lapTime + /// The number of the lap on wich the lapTime has been set (CAUTION ITS NOT THE RACING LAP ITS FROM THE DB) + /// The time (in ms) of the lap + public void DisplayLapTimeInfos(string driverName, int Lap, string LapTime) + { + List sectors = Storage.GetSectorsFromLapTime(driverName, Lap); + string message = "Lap time infos" + Environment.NewLine; + message += LapTime + Environment.NewLine; + if (sectors.Count > 0) + message += "Sector 1 : " + Reader.ConvertMsToTime(sectors[0]) + Environment.NewLine; + if (sectors.Count > 1) + message += "Sector 2 : " + Reader.ConvertMsToTime(sectors[1]) + Environment.NewLine; + if (sectors.Count > 2) + message += "Sector 3 : " + Reader.ConvertMsToTime(sectors[2]) + Environment.NewLine; + MessageBox.Show(message); + } + /// + /// Displays the live ranking with the names of the drivers and their gap to the leader in the right order + /// + /// The control that will host all the new controls + /// The main form + public void DisplayLiveRanking(Panel pnl, Main form1) + { + if (LiveDriverDataLogs.Count > 0) + { + pnl.Controls.Clear(); + //Gets the last item that should be the most recent data + List liveData = LiveDriverDataLogs[LiveDriverDataLogs.Count - 1]; + + Button[] buttons = new Button[liveData.Count]; + + Size buttonDimensions = new Size(pnl.Width, pnl.Height / liveData.Count); + + for (int driverCount = 0; driverCount < liveData.Count; driverCount++) + { + Button newButton = new Button(); + + newButton.Size = buttonDimensions; + newButton.Location = new Point(0, driverCount * buttonDimensions.Height); + newButton.FlatStyle = FlatStyle.Popup; + + DriverData driver = liveData[driverCount]; + + if (driver.Position == -1) + { + //Its a DNF + newButton.Enabled = false; + } + if (driver.Position > 1) + { + newButton.Text = driver.Name + " +" + Reader.ConvertMsToTime(driver.GapToLeader); + } + else + { + newButton.Text = driver.Name; + } + + newButton.Name = liveData[driverCount].Name; + newButton.TextAlign = ContentAlignment.MiddleLeft; + + newButton.FlatStyle = FlatStyle.Popup; + + newButton.Click += form1.btnDriver_Click; + + buttons[driverCount] = newButton; + } + //Note : It could be better to have this directly in the same loop + foreach (Button button in buttons) + { + pnl.Controls.Add(button); + } + } + } + } +} + +``` diff --git a/temp_annexes/Code/DriverData.md b/temp_annexes/Code/DriverData.md new file mode 100644 index 0000000..b629a2a --- /dev/null +++ b/temp_annexes/Code/DriverData.md @@ -0,0 +1,110 @@ +# DriverData.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : DriverData.cs +/// Brief : File containing classes that behave just like structures to store data about drivers +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrackTrends +{ + public class DriverData + { + public bool DRS; //True = Drs is opened + public int GapToLeader; //In ms + public int LapTime; //In ms + public string Name; //Ex: LECLERC + public int Position; //Ex: 1 + public int Sector1; //in ms + public int Sector2; //in ms + public int Sector3; //in ms + public Tyre CurrentTyre;//Ex Soft 11 laps + + public DriverData(bool dRS, int gapToLeader, int lapTime, string name, int position, int sector1, int sector2, int sector3, Tyre tyre) + { + DRS = dRS; + GapToLeader = gapToLeader; + LapTime = lapTime; + Name = name; + Position = position; + Sector1 = sector1; + Sector2 = sector2; + Sector3 = sector3; + CurrentTyre = tyre; + } + /// + /// Creates a default driver data with empty values + /// + public DriverData() + { + DRS = false; + GapToLeader = -1; + LapTime = -1; + Name = "Unknown"; + Position = -1; + Sector1 = -1; + Sector2 = -1; + Sector3 = -1; + CurrentTyre = new Tyre(Tyre.Type.Undefined, -1); + } + /// + /// Method that displays all the data found in a string + /// + /// string containing all the driver datas + public override string ToString() + { + string result = ""; + + //Position + result += "Position : " + Position + Environment.NewLine; + //Gap + result += "GapToLeader : " + Reader.ConvertMsToTime(GapToLeader) + Environment.NewLine; + //LapTime + result += "LapTime : " + Reader.ConvertMsToTime(LapTime) + Environment.NewLine; + //DRS + result += "DRS : " + DRS + Environment.NewLine; + //Tyres + result += "Uses " + CurrentTyre.Coumpound + " tyre " + CurrentTyre.NumberOfLaps + " laps old" + Environment.NewLine; + //Name + result += "DriverName : " + Name + Environment.NewLine; + //Sector 1 + result += "Sector1 : " + Reader.ConvertMsToTime(Sector1) + Environment.NewLine; + //Sector 1 + result += "Sector2 : " + Reader.ConvertMsToTime(Sector2) + Environment.NewLine; + //Sector 1 + result += "Sector3 : " + Reader.ConvertMsToTime(Sector3) + Environment.NewLine; + + return result; + } + } + //Structure to store tyres infos + public struct Tyre + { + //If new tyres were to be added you will have to need to change this enum + public enum Type + { + Soft, + Medium, + Hard, + Inter, + Wet, + Undefined + } + public Type Coumpound; + public int NumberOfLaps; + public Tyre(Type type, int laps) + { + Coumpound = type; + NumberOfLaps = laps; + } + } +} + +``` diff --git a/temp_annexes/Code/DriverDrsWindow.md b/temp_annexes/Code/DriverDrsWindow.md new file mode 100644 index 0000000..10b957e --- /dev/null +++ b/temp_annexes/Code/DriverDrsWindow.md @@ -0,0 +1,119 @@ +# DriverDrsWindow.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : DriverDrsWindow.cs +/// Brief : Window containing DRS related method and infos +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Tesseract; + +namespace TrackTrends +{ + public class DriverDrsWindow:Window + { + private static int EmptyDrsGreenValue = -1; + private static Random rnd = new Random(); + public DriverDrsWindow(Bitmap image, Rectangle bounds,bool generateEngine = true) : base(image, bounds,generateEngine) + { + Name = "DRS"; + } + /// + /// Method that will decode the content of the window + /// + /// returns a boolean (true = DRS OPEN, false = DRS CLOSED) + public override object DecodePng() + { + bool result = false; + + //DEBUG + //WindowImage.Save("./DRS/"+rnd.Next(0,99999)+".png"); + + int greenValue = GetGreenPixels(); + if (EmptyDrsGreenValue == -1) + EmptyDrsGreenValue = greenValue; + + if (greenValue > EmptyDrsGreenValue + EmptyDrsGreenValue / 100 * 30) + result = true; + + return result; + } + /// + /// Method that will get the green pixel proportion in the image, this can be used to determin if the DRS has been actuated + /// + /// The number of clearely green pixels + private unsafe int GetGreenPixels() + { + int tot = 0; + + Bitmap bmp = WindowImage; + Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height); + BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat); + int bytesPerPixel = Bitmap.GetPixelFormatSize(bmp.PixelFormat) / 8; + + unsafe + { + byte* ptr = (byte*)bmpData.Scan0.ToPointer(); + for (int y = 0; y < bmp.Height; y++) + { + byte* currentLine = ptr + (y * bmpData.Stride); + for (int x = 0; x < bmp.Width; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + byte blue = pixel[0]; + byte green = pixel[1]; + byte red = pixel[2]; + + if (green > blue * 1.5 && green > red * 1.5) + { + tot++; + } + } + } + } + bmp.UnlockBits(bmpData); + + return tot; + } + /// + /// This method is used to lock on where exactly the DRS window is + /// + /// Returns a rectangle containing the DRS + public Rectangle GetBox() + { + var tessImage = Pix.LoadFromMemory(ImageToByte(WindowImage)); + Engine.SetVariable("tessedit_char_whitelist", ""); + Page page = Engine.Process(tessImage); + + using (var iter = page.GetIterator()) + { + iter.Begin(); + do + { + Rect boundingBox; + + // Get the bounding box for the current element + if (iter.TryGetBoundingBox(PageIteratorLevel.Word, out boundingBox)) + { + page.Dispose(); + return new Rectangle(boundingBox.X1, boundingBox.X2, boundingBox.Width, boundingBox.Height); + } + } while (iter.Next(PageIteratorLevel.Word)); + + page.Dispose(); + return new Rectangle(0, 0, 0, 0); + } + } + } +} + +``` diff --git a/temp_annexes/Code/DriverGapToLeaderWindow.md b/temp_annexes/Code/DriverGapToLeaderWindow.md new file mode 100644 index 0000000..ca968d7 --- /dev/null +++ b/temp_annexes/Code/DriverGapToLeaderWindow.md @@ -0,0 +1,37 @@ +# DriverGapToLeaderWindow.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : DriverGapToLeaderWindow.cs +/// Brief : Window containing infos about the gap to the leader of a driver +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrackTrends +{ + public class DriverGapToLeaderWindow:Window + { + public DriverGapToLeaderWindow(Bitmap image, Rectangle bounds, bool generateEngine = true) : base(image, bounds,generateEngine) + { + Name = "GapToLeader"; + } + /// + /// Decodes the gap to leader using Tesseract OCR + /// + /// Returns the gap to the leader in miliseconds (int) + public override object DecodePng() + { + int result = GetTimeFromPng(WindowImage, OcrImage.WindowType.Gap, Engine); + return result; + } + } +} + +``` diff --git a/temp_annexes/Code/DriverLapTimeWindow.md b/temp_annexes/Code/DriverLapTimeWindow.md new file mode 100644 index 0000000..6f8a9d8 --- /dev/null +++ b/temp_annexes/Code/DriverLapTimeWindow.md @@ -0,0 +1,37 @@ +# DriverLapTimeWindow.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : DriverLapTimeWindow +/// Brief : Window containing infos about the lap time of a driver +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace TrackTrends +{ + public class DriverLapTimeWindow:Window + { + public DriverLapTimeWindow(Bitmap image, Rectangle bounds, bool generateEngine = true) : base(image, bounds,generateEngine) + { + Name = "LapTime"; + } + /// + /// Decodes the lap time contained in the image using OCR Tesseract + /// + /// The laptime in int (ms) + public override object DecodePng() + { + int result = GetTimeFromPng(WindowImage, OcrImage.WindowType.LapTime, Engine); + return result; + } + } +} + +``` diff --git a/temp_annexes/Code/DriverNameWindow.md b/temp_annexes/Code/DriverNameWindow.md new file mode 100644 index 0000000..514c98f --- /dev/null +++ b/temp_annexes/Code/DriverNameWindow.md @@ -0,0 +1,62 @@ +# DriverNameWindow.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : DriverNameWindow +/// Brief : Window containing infos about the name of the driver +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace TrackTrends +{ + public class DriverNameWindow : Window + { + public DriverNameWindow(Bitmap image, Rectangle bounds, bool generateEngine = true) : base(image, bounds,generateEngine) + { + Name = "Name"; + } + /// + /// Decodes using OCR wich driver name is in the image + /// + /// A list of all the names that can be on the image + /// a string representing the found driver name. It will be one of the ones given in the list + public override object DecodePng(List DriverList) + { + string result = ""; + result = GetStringFromPng(WindowImage, Engine); + + if (!IsADriver(DriverList, result)) + { + //I put everything in uppercase to try to lower the chances of bad answers + result = FindClosestMatch(DriverList.ConvertAll(d => d.ToUpper()), result.ToUpper()); + } + return result; + } + /// + /// Verifies that the name found in the OCR is a valid name + /// + /// The list of all the drivers name that can be found in the image + /// The driver you want to be sure if it exists or not + /// If ye or no the driver exists + private static bool IsADriver(List driverList, string potentialDriver) + { + bool result = false; + //I cant use drivers.Contains because it has missmatched cases and all + foreach (string name in driverList) + { + if (name.ToUpper() == potentialDriver.ToUpper()) + result = true; + } + return result; + } + } +} + +``` diff --git a/temp_annexes/Code/DriverPositionWindow.md b/temp_annexes/Code/DriverPositionWindow.md new file mode 100644 index 0000000..da0ce68 --- /dev/null +++ b/temp_annexes/Code/DriverPositionWindow.md @@ -0,0 +1,47 @@ +# DriverPositionWindow.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : DriverPositionWindow.cs +/// Brief : Window containing infos about the position of a driver. +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace TrackTrends +{ + public class DriverPositionWindow:Window + { + public DriverPositionWindow(Bitmap image, Rectangle bounds, bool generateEngine = true) : base(image, bounds,generateEngine) + { + Name = "Position"; + } + /// + /// Decodes the position number using Tesseract OCR + /// + /// An int representing the position of the driver (should be between 1 and 20 included) + public override object DecodePng() + { + string ocrResult = GetStringFromPng(WindowImage, Engine, "0123456789"); + + int position; + try + { + position = Convert.ToInt32(ocrResult); + } + catch + { + position = -1; + } + return position; + } + } +} + +``` diff --git a/temp_annexes/Code/DriverSectorWindow.md b/temp_annexes/Code/DriverSectorWindow.md new file mode 100644 index 0000000..3329743 --- /dev/null +++ b/temp_annexes/Code/DriverSectorWindow.md @@ -0,0 +1,37 @@ +# DriverSectorWindow.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : DriverSectorWindow.cs +/// Brief : Window containing infos about a driver sector time. Can be the first second or third, does not matter. +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace TrackTrends +{ + public class DriverSectorWindow:Window + { + public DriverSectorWindow(Bitmap image, Rectangle bounds, int sectorId, bool generateEngine = true) : base(image, bounds,generateEngine) + { + Name = "Sector"+sectorId; + } + /// + /// Decodes the sector + /// + /// the sector time in int (ms) + public override object DecodePng() + { + int ocrResult = GetTimeFromPng(WindowImage, OcrImage.WindowType.Sector, Engine); + return ocrResult; + } + } +} + +``` diff --git a/temp_annexes/Code/DriverTyresWindow.md b/temp_annexes/Code/DriverTyresWindow.md new file mode 100644 index 0000000..a184cf7 --- /dev/null +++ b/temp_annexes/Code/DriverTyresWindow.md @@ -0,0 +1,151 @@ +# DriverTyresWindow.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : DriverTyresWindow.cs +/// Brief : Window containing infos about a driver's tyre +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; + +namespace TrackTrends +{ + public class DriverTyresWindow:Window + { + private static Random rnd = new Random(); + //Those are the colors I found but you can change them if they change in the future like in 2019 + public static Color SOFT_TYRE_COLOR = Color.FromArgb(0xff, 0x00, 0x00); + public static Color MEDIUM_TYRE_COLOR = Color.FromArgb(0xf5, 0xbf, 0x00); + public static Color HARD_TYRE_COLOR = Color.FromArgb(0xa4, 0xa5, 0xa8); + public static Color INTER_TYRE_COLOR = Color.FromArgb(0x00, 0xa4, 0x2e); + public static Color WET_TYRE_COLOR = Color.FromArgb(0x27, 0x60, 0xa6); + public static Color EMPTY_COLOR = Color.FromArgb(0x20, 0x20, 0x20); + + public DriverTyresWindow(Bitmap image, Rectangle bounds, bool generateEngine = true) : base(image, bounds,generateEngine) + { + Name = "Tyres"; + } + /// + /// This will decode the content of the image + /// + /// And object containing what was on the image + public override object DecodePng() + { + return GetTyreInfos(); + } + /// + /// Method that will decode whats on the image and return the tyre infos it could manage to recover + /// + /// A tyre object containing tyre infos + private Tyre GetTyreInfos() + { + //DEBUG + //WindowImage.Save("./Tyre/raw_"+rnd.Next(0,99999)+".png"); + + Bitmap tyreZone = GetSmallBitmapFromBigOne(WindowImage, FindTyreZone()); + Tyre.Type type = Tyre.Type.Undefined; + type = GetTyreTypeFromColor(OcrImage.GetAvgColorFromBitmap(tyreZone)); + int laps = -1; + + string number = GetStringFromPng(tyreZone, Engine, "0123456789", OcrImage.WindowType.Tyre); + try + { + laps = Convert.ToInt32(number); + } + catch + { + //We could not convert the number so its a letter so its 0 laps old + laps = 0; + } + + //71 is the most laps an f1 race is ever going to have (mexico) so any more would be considered as bad (and remember you cant go trough a full race without making at least one pitstop) + if (laps > 75) + laps = 0; + + return new Tyre(type, laps); + } + /// + /// Finds where the important part of the image is + /// + /// A rectangle containing position and dimensions of the important part of the image + private Rectangle FindTyreZone() + { + Bitmap bmp = WindowImage; + int currentPosition = bmp.Width; + int height = bmp.Height / 2; + Color limitColor = Color.FromArgb(0x50, 0x50, 0x50); + Color currentColor = Color.FromArgb(0, 0, 0); + //25F + Size newWindowSize = new Size(bmp.Height - Convert.ToInt32((float)bmp.Height / 100f * 25f), bmp.Height - Convert.ToInt32((float)bmp.Height / 100f * 35f)); + + while (currentColor.R <= limitColor.R && currentColor.G <= limitColor.G && currentColor.B <= limitColor.B && currentPosition > 0) + { + currentPosition--; + currentColor = bmp.GetPixel(currentPosition, height); + } + + //Its here to let the new window include a little bit of the right + int CorrectedX = currentPosition - (newWindowSize.Width) + Convert.ToInt32((float)newWindowSize.Width / 100f * 10f); + int CorrectedY = Convert.ToInt32((float)newWindowSize.Height / 100f * 35f); + if (CorrectedX <= 0) + return new Rectangle(0, 0, newWindowSize.Width, newWindowSize.Height); + + return new Rectangle(CorrectedX, CorrectedY, newWindowSize.Width, newWindowSize.Height); + } + //This method has been created with the help of chatGPT + /// + /// Methods that compares a list of colors to see wich is the closest from the input color and decide wich tyre type it is + /// + /// The color that you found + /// The tyre type + public Tyre.Type GetTyreTypeFromColor(Color inputColor) + { + Tyre.Type type = Tyre.Type.Undefined; + List colors = new List(); + //dont forget that if for some reason someday F1 adds a new Tyre type you will need to add it in the constants but also here in the list + //You will also need to add it below in the Tyre object's enum and add an if in the end of this method + colors.Add(SOFT_TYRE_COLOR); + colors.Add(MEDIUM_TYRE_COLOR); + colors.Add(HARD_TYRE_COLOR); + colors.Add(INTER_TYRE_COLOR); + colors.Add(WET_TYRE_COLOR); + colors.Add(EMPTY_COLOR); + + Color closestColor = colors[0]; + int closestDistance = int.MaxValue; + foreach (Color color in colors) + { + int distance = Math.Abs(color.R - inputColor.R) + Math.Abs(color.G - inputColor.G) + Math.Abs(color.B - inputColor.B); + if (distance < closestDistance) + { + closestColor = color; + closestDistance = distance; + } + } + + //We cant use a switch as the colors cant be constants ... + if (closestColor == SOFT_TYRE_COLOR) + type = Tyre.Type.Soft; + if (closestColor == MEDIUM_TYRE_COLOR) + type = Tyre.Type.Medium; + if (closestColor == HARD_TYRE_COLOR) + type = Tyre.Type.Hard; + if (closestColor == INTER_TYRE_COLOR) + type = Tyre.Type.Inter; + if (closestColor == WET_TYRE_COLOR) + type = Tyre.Type.Wet; + if (closestColor == EMPTY_COLOR) + return Tyre.Type.Undefined; + + return type; + } + } +} + +``` diff --git a/temp_annexes/Code/F1TVEmulator.md b/temp_annexes/Code/F1TVEmulator.md new file mode 100644 index 0000000..e4a98b5 --- /dev/null +++ b/temp_annexes/Code/F1TVEmulator.md @@ -0,0 +1,334 @@ +# F1TVEmulator.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : F1TVEmulator.cs +/// Brief : Class that contains methods to emulate a browser and navigate the F1TV website +/// Version : Alpha 1.0 + +using OpenQA.Selenium; +using OpenQA.Selenium.Firefox; +using OpenQA.Selenium.Interactions; +using OpenQA.Selenium.Support.UI; +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Drawing; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace TrackTrends +{ + internal class F1TVEmulator + { + public const string COOKIE_HOST = ".formula1.com"; + public const string PYTHON_COOKIE_RETRIEVAL_FILENAME = "recoverCookiesCSV.py"; + public const string GECKODRIVER_FILENAME = @"geckodriver-v0.27.0-win64\geckodriver.exe"; + //BE CAREFULL IF YOU CHANGE IT HERE YOU NEED TO CHANGE IT IN THE PYTHON SCRIPT TOO + public const string COOKIES_CSV_FILENAME = "cookies.csv"; + + private FirefoxDriver Driver; + + private bool _ready; + private string _grandPrixUrl; + public string GrandPrixUrl { get => _grandPrixUrl; private set => _grandPrixUrl = value; } + public bool Ready { get => _ready; set => _ready = value; } + public F1TVEmulator(string grandPrixUrl) + { + GrandPrixUrl = grandPrixUrl; + Ready = false; + } + /// + /// Will start the python programm that runs the Cookie Recovering + /// + private void StartCookieRecovering() + { + string scriptPath = PYTHON_COOKIE_RETRIEVAL_FILENAME; + Process process = new Process(); + process.StartInfo.FileName = "python.exe"; + process.StartInfo.Arguments = scriptPath; + process.StartInfo.UseShellExecute = false; + process.StartInfo.RedirectStandardOutput = true; + process.Start(); + string output = process.StandardOutput.ReadToEnd(); + process.WaitForExit(); + } + /// + /// Method that will recover the needed cookies in the DB + /// + /// The host of the wanted cookie ex: ./formula1.com + /// The name of the wanted cookie ex: login + /// returns the value of the cookie if it has been found + /// + public string GetCookie(string host, string name) + { + StartCookieRecovering(); + string value = ""; + List cookies = new List(); + if (File.Exists(COOKIES_CSV_FILENAME)) + { + using (var reader = new StreamReader(COOKIES_CSV_FILENAME)) + { + // Read the header row and validate column order + string header = reader.ReadLine(); + string[] expectedColumns = { "host_key", "name", "value", "path", "expires_utc", "is_secure", "is_httponly" }; + string[] actualColumns = header.Split(','); + for (int i = 0; i < expectedColumns.Length; i++) + { + if (expectedColumns[i] != actualColumns[i]) + { + throw new InvalidOperationException($"Expected column '{expectedColumns[i]}' at index {i} but found '{actualColumns[i]}'"); + } + } + + // Read each data row and parse values into a Cookie object + while (!reader.EndOfStream) + { + string line = reader.ReadLine(); + string[] fields = line.Split(','); + + string hostname = fields[0]; + string cookieName = fields[1]; + + if (hostname == host && cookieName == name) + { + value = fields[2]; + } + } + } + } + return value; + } + /// + /// Starts the headless browser + /// + /// Error code 1xx + public async Task Start() + { + Ready = false; + + string loginCookieName = "login"; + string loginSessionCookieName = "login-session"; + string loginCookieValue = GetCookie(COOKIE_HOST, loginCookieName); + string loginSessionValue = GetCookie(COOKIE_HOST, loginSessionCookieName); + + //Cookie retreival has gone wrong (usually its because of python not being installed properly) + if (loginCookieValue == "" || loginSessionValue == "") + return 100; + + var service = FirefoxDriverService.CreateDefaultService(GECKODRIVER_FILENAME); + service.Host = "127.0.0.1"; + service.Port = 5555; + + FirefoxProfile profile = new FirefoxProfile(); + FirefoxOptions options = new FirefoxOptions(); + //profile.SetPreference("full-screen-api.ignore-widgets", true); + //profile.SetPreference("media.hardware-video-decoding.enabled", true); + //profile.SetPreference("full-screen-api.enabled", true); + options.Profile = profile; + profile.SetPreference("layout.css.devPixelsPerPx", "1.0"); + + options.AcceptInsecureCertificates = true; + options.AddArgument("--headless"); + //options.AddArgument("--start-maximized"); + //options.AddArgument("--window-size=1920x1080"); + //options.AddArgument("--width=" + windowWidth); + //options.AddArgument("--height=" + windowHeight); + //options.AddArgument("-window-size=1920x1080"); + //options.AddArgument("--width=1920"); + //options.AddArgument("--height=1080"); + //profile + + try + { + Driver = new FirefoxDriver(service, options); + } + catch + { + Ready = false; + return 101; + } + + Actions actions = new Actions(Driver); + var loginCookie = new Cookie(loginCookieName, loginCookieValue, COOKIE_HOST, "/", DateTime.Now.AddDays(5)); + var loginSessionCookie = new Cookie(loginSessionCookieName, loginSessionValue, COOKIE_HOST, "/", DateTime.Now.AddDays(5)); + + Driver.Navigate().GoToUrl("https://f1tv.formula1.com/"); + + Driver.Manage().Cookies.AddCookie(loginCookie); + Driver.Manage().Cookies.AddCookie(loginSessionCookie); + + try + { + Driver.Navigate().GoToUrl(GrandPrixUrl); + } + catch + { + //The url is not a valid url + Driver.Dispose(); + return 103; + } + + //Waits for the page to fully load + Driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(30); + + //Removes the cookie prompt + try + { + IWebElement conscentButton = Driver.FindElement(By.Id("truste-consent-button")); + conscentButton.Click(); + } + catch + { + //Could not locate the cookie button + Screenshot("ERROR104"); + Driver.Dispose(); + return 104; + } + + //Again waits for the page to fully load (when you accept cookies it takes a little time for the page to load) + //Cannot use The timeout because the feed loading is not really loading so there is not event or anything + Thread.Sleep(5000); + + //Switches to the Data channel + try + { + IWebElement dataChannelButton = Driver.FindElement(By.ClassName("data-button")); + dataChannelButton.Click(); + } + catch + { + //If the data button does not exists its because the user is not connected + Screenshot("ERROR102"); + Driver.Dispose(); + return 102; + } + + //Open settings + // Press the space key, this should make the setting button visible + // It does not matter if the feed is paused because when changing channel it autoplays + actions.SendKeys(OpenQA.Selenium.Keys.Space).Perform(); + //Clicks on the settings Icon + + int settingsClickTries = 0; + bool settingsClickSuccess = false; + while (settingsClickTries < 100 && !settingsClickSuccess) + { + Thread.Sleep(100); + try + { + IWebElement settingsButton = Driver.FindElement(By.ClassName("bmpui-ui-settingstogglebutton")); + settingsButton.Click(); + IWebElement selectElement = Driver.FindElement(By.ClassName("bmpui-ui-videoqualityselectbox")); + SelectElement select = new SelectElement(selectElement); + IWebElement selectOption = selectElement.FindElement(By.CssSelector("option[value^='1080_']")); + selectOption.Click(); + settingsClickSuccess = true; + } + catch + { + //Sometimes it can crash because it could not get the options to show up in time. When it happens just retry + settingsClickSuccess = false; + settingsClickTries++; + } + } + + if (!settingsClickSuccess) + { + Screenshot("ERROR105"); + Driver.Dispose(); + return 105; + } + + Screenshot("BEFOREFULLSCREEN"); + + //Makes the feed fullscreen + int fullScreenClickTries = 0; + bool fullScreenClickSuccess = false; + Driver.Manage().Window.Maximize(); + //WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(10)); + while (fullScreenClickTries < 100 && !fullScreenClickSuccess) + { + Thread.Sleep(150); + try + { + IWebElement fullScreenButton = Driver.FindElement(By.ClassName("bmpui-ui-fullscreentogglebutton")); + fullScreenButton.Click(); + fullScreenClickSuccess = true; + } + catch + { + fullScreenClickSuccess = false; + fullScreenClickTries++; + } + } + + if (!fullScreenClickSuccess) + { + Screenshot("ERROR106"); + Driver.Dispose(); + return 106; + } + + Screenshot("AFTERFULLSCREEN"); + + //STARTUP FINISHED READY TO SCREENSHOT + Ready = true; + return 0; + } + /// + /// Takes a screenshot of what the headless browser is displaying + /// + /// Optional ! The name of the picture so it can be saved + /// Returns the screenshot in the bitmap format + public Bitmap Screenshot(string name = "TEST") + { + Bitmap result = new Bitmap(4242, 6969); + try + { + //Screenshot scrsht = ((ITakesScreenshot)Driver).GetScreenshot(); + //profileriver.SetPreferencC:\Users\Moi\source\repos\Test_Merge\README.mde("layout.css.devPixelsPerPx", "1.0"); + + //Screenshot scrsht = Driver.GetFullPageScreenshot(); + Screenshot scrsht = Driver.GetScreenshot(); + + byte[] screenshotBytes = Convert.FromBase64String(scrsht.AsBase64EncodedString); + MemoryStream stream = new MemoryStream(screenshotBytes); + + result = new Bitmap(stream); + //result.Save(name + ".png"); + scrsht.SaveAsFile(name + ".png"); + } + catch + { + //Nothing for now + } + return result; + } + /// + /// Stops the Emulation. Note: if you plan to start it again please use ResetDriver() instead + /// + public void Stop() + { + Ready = false; + if (Driver != null) + Driver.Dispose(); + } + /// + /// Resets the emulation + /// + public void ResetDriver() + { + Ready = false; + if (Driver != null) + Driver.Dispose(); + Driver = null; + } + } +} + +``` diff --git a/temp_annexes/Code/Form1.md b/temp_annexes/Code/Form1.md new file mode 100644 index 0000000..0813927 --- /dev/null +++ b/temp_annexes/Code/Form1.md @@ -0,0 +1,427 @@ +# Form1.cs + +``` cs +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Diagnostics; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.IO; + +namespace TrackTrends +{ + public partial class Main : Form + { + //private Reader Reader = null; + private F1TVEmulator Emulator = null; + private DataWrapper Wrapper = null; + private bool cancelRequested = false; + private SemaphoreSlim semaphore = new SemaphoreSlim(1); + + string ConfigFile = ""; + string GpUrl = ""; + + //For the responsive content + + Size oldSize = new Size(); + Size oldRankingSize = new Size(); + Size oldLapTimesSize = new Size(); + Size oldBattles = new Size(); + + Size oldPnlBattles = new Size(); + Size oldPnlRankings = new Size(); + Size oldPnlFastest = new Size(); + Size oldPnlSlowest = new Size(); + + Point oldRankingPosition = new Point(); + Point oldBattlePosition = new Point(); + Point oldDriverInfoPosition = new Point(); + + Point olPnlFastestPosition = new Point(); + Point oldPnlSlowestPosition = new Point(); + + public Main() + { + InitializeComponent(); + } + public async void RefreshUI() + { + if (Directory.Exists(ConfigurationTool.CONFIGS_FOLDER_NAME)) + { + lsbPresets.DataSource = null; + lsbPresets.DataSource = Directory.GetFiles(ConfigurationTool.CONFIGS_FOLDER_NAME); + } + } + private async void btnSettings_Click(object sender, EventArgs e) + { + if (Emulator != null) + Emulator.ResetDriver(); + + btnStartDecoding.Enabled = false; + btnStopUpdating.Enabled = false; + btnResetEmulator.Text = "Launch"; + + Emulator = null; + Wrapper = null; + + GC.Collect(); + + Settings settingsForm = new Settings(); + settingsForm.ShowDialog(); + RefreshUI(); + //MessageBox.Show(settingsForm.GrandPrixUrl + Environment.NewLine + settingsForm.GrandPrixName + Environment.NewLine + settingsForm.GrandPrixYear); + if (settingsForm.GrandPrixUrl != "" && settingsForm.SelectedConfigFile != "") + { + GpUrl = settingsForm.GrandPrixUrl; + tbxGpUrl.Text = GpUrl; + if (File.Exists(settingsForm.SelectedConfigFile)) + { + ConfigFile = settingsForm.SelectedConfigFile; + for(int i = 0; i < lsbPresets.Items.Count; i++) + { + if (lsbPresets.Items[i].ToString() == ConfigFile) + lsbPresets.SelectedIndex = i; + } + } + else + { + MessageBox.Show("The config file has not been found please return to the config and change it"); + } + } + else + { + //WE dont care anymore, the user will choose its Grand Prix himself in the main program + //MessageBox.Show("There is no URL for the Grand Prix you want to decode. Please return to the config and add a valid one"); + } + } + + private async void Form1_Load(object sender, EventArgs e) + { + //Those are the default values but they will need to be changed later when the configuration has been done + ConfigFile = "./Presets/Clean_4K_2023.json"; + GpUrl = "https://f1tv.formula1.com/detail/1000006688/2023-azerbaijan-grand-prix?action=play"; + + tbxGpUrl.Text = GpUrl; + + oldSize = this.Size; + oldRankingSize = gpbxRanking.Size; + oldLapTimesSize = gpbxLapTimes.Size; + oldBattles = gpbxBattles.Size; + + oldPnlRankings = pnlLiveRanking.Size; + oldPnlBattles = pnlBattles.Size; + oldPnlFastest = pnlFastest.Size; + oldPnlSlowest = pnlSlowest.Size; + + oldRankingPosition = gpbxRanking.Location; + oldBattlePosition = gpbxBattles.Location; + oldDriverInfoPosition = gpbxDriverInfos.Location; + + olPnlFastestPosition = pnlFastest.Location; + oldPnlSlowestPosition = pnlSlowest.Location; + + tip1.SetToolTip(btnResetEmulator, "Starts or restarts the emulator. You need to start this to use the app"); + tip1.SetToolTip(btnSettings, "Opens the configuration menu"); + tip1.SetToolTip(tbxGpUrl, "Insert the URL of the Grand Prix you want to track. Dont forget the \"?action=play\" at the end"); + tip1.SetToolTip(lsbPresets, "Select a configuration preset to use with the decoding"); + tip1.SetToolTip(pbxResult,"A preview of what the program sees. You should see the DATA page of the F1TV here"); + tip1.SetToolTip(lsbOvertakes,"A list of all the activity. You can scroll to see the most recent overtakes"); + tip1.SetToolTip(gpbxBattles,"The four first battles in the field. A battle is two drivers less than 3 seconds apart"); + tip1.SetToolTip(gpbxLapTimes,"The fastest and slowest drivers on track at the moment. It takes the average lapTime of the last 5 laps to choose who is the fastes or the slowest"); + + RefreshUI(); + } + + private async void btnUpdate_Click(object sender, EventArgs e) + { + cancelRequested = false; + if (Emulator != null && Wrapper != null) + { + // Disable UI controls to prevent re-entrancy + btnResetEmulator.Enabled = false; + btnStartDecoding.Enabled = false; + btnStopUpdating.Enabled = true; + btnSettings.Enabled = false; + while (!cancelRequested) + { + await semaphore.WaitAsync(); + + try + { + // Start the time-consuming task on a separate thread + await Task.Run(async () => + { + Stopwatch sw = new Stopwatch(); + sw.Start(); + + Bitmap screen = Emulator.Screenshot(); + screen.Save("HopefullyDataScreenshot.png"); + + Invoke((MethodInvoker)delegate + { + pbxResult.Image = (Bitmap)screen.Clone(); + }); + + Wrapper.ChangeImage(screen); + int errorCode = Wrapper.Refresh(); + + sw.Stop(); + // Task completed + Invoke((MethodInvoker)delegate + { + DisplayResults(errorCode, sw, screen); + DisplayBattles(); + DisplayDeltas(); + DisplayOvertakes(); + }); + }); + } + finally + { + semaphore.Release(); + } + } + // Re-enable UI controls + btnStopUpdating.Text = "Stop"; + btnStartDecoding.Enabled = true; + btnStopUpdating.Enabled = false; + btnResetEmulator.Enabled = true; + btnSettings.Enabled = true; + } + } + private void DisplayOvertakes() + { + Wrapper.DisplayOvertakes(lsbOvertakes); + } + private void DisplayBattles() + { + Wrapper.DisplayBattles(pnlBattles, this); + } + private void DisplayDeltas() + { + Wrapper.DisplayTimesDeltas(pnlFastest, pnlSlowest, this); + } + private void Form1_FormClosing(object sender, FormClosingEventArgs e) + { + if (Emulator != null) + { + Emulator.Stop(); + } + } + private void DisplayResults(int errorCode, Stopwatch sw, Bitmap screen) + { + if (errorCode != 0) + { + cancelRequested = true; + MessageBox.Show("An error has occured while trying to recover data from live feed. This can happen sometimes. I would advise you to restart a few times. If the problem persists check your configuration."); + } + else + { + Wrapper.DisplayLiveRanking(pnlLiveRanking, this); + } + } + + private void btnStopUpdating_Click(object sender, EventArgs e) + { + // Set the cancellation flag + cancelRequested = true; + btnStopUpdating.Enabled = false; + btnResetEmulator.Enabled = false; + btnStopUpdating.Text = "Stopping"; + } + private async void button1_Click(object sender, EventArgs e) + { + lsbOvertakes.Items.Clear(); + btnResetEmulator.Text = "Launching"; + btnResetEmulator.Enabled = false; + btnSettings.Enabled = true; + btnStartDecoding.Enabled = false; + btnStopUpdating.Enabled = false; + btnSettings.Enabled = false; + int errorCode = -1; + await Task.Run(async () => + { + if (Emulator != null) + Emulator.ResetDriver(); + + Emulator = null; + Wrapper = null; + + GC.Collect(); + + Emulator = new F1TVEmulator(GpUrl); + errorCode = await Emulator.Start(); + }); + + if (errorCode != 0) + { + string message = ""; + switch (errorCode) + { + case 100: + message = "Error " + errorCode + " Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again"; + break; + case 101: + message = "Error " + errorCode + " Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again"; + break; + case 102: + message = "Error " + errorCode + " Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update"; + break; + case 103: + message = "Error " + errorCode + " The url is not a valid url"; + break; + case 104: + message = "Error " + errorCode + " The url is not a valid url"; + break; + case 105: + message = "Error " + errorCode + " There has been an error trying to emulate button presses. Please try again"; + break; + case 106: + message = "Error " + errorCode + " There has been an error trying to emulate button presses. Please try again"; + break; + default: + message = "Could not start the emulator Error " + errorCode; + break; + } + MessageBox.Show(message); + + btnResetEmulator.Enabled = true; + btnSettings.Enabled = true; + btnResetEmulator.Text = "Retry"; + } + else + { + Wrapper = new DataWrapper(ConfigFile, Emulator.Screenshot()); + btnResetEmulator.Text = "Re launch"; + btnResetEmulator.Enabled = true; + btnSettings.Enabled = true; + btnStartDecoding.Enabled = true; + } + } + private void removeBorders(object sender, PaintEventArgs e) + { + GroupBox gpbx = (GroupBox)sender; + + using (Pen pen = new Pen(gpbx.BackColor, 50)) + { + e.Graphics.DrawRectangle(pen, 0, 0, gpbx.Width - 1, gpbx.Height - 1); + e.Graphics.DrawRectangle(pen, 0, 0, gpbx.Width - 1, gpbx.Height - 1); + } + + using (var brush = new SolidBrush(gpbx.ForeColor)) + { + var textPosition = new Point(5, 0); // Adjust the X and Y values as needed + e.Graphics.DrawString(gpbx.Text, gpbx.Font, brush, textPosition); + } + } + private void lsbPresets_SelectedIndexChanged(object sender, EventArgs e) + { + if (lsbPresets.SelectedIndex >= 0) + ConfigFile = lsbPresets.Items[lsbPresets.SelectedIndex].ToString(); + } + + private void textBox1_TextChanged(object sender, EventArgs e) + { + if (tbxGpUrl.Text != "") + GpUrl = tbxGpUrl.Text; + } + public void btnDriver_Click(object sender, EventArgs e) + { + //Removes the cover + if (pnlCover.Visible = true) + pnlCover.Visible = false; + //Happens when a driver button has been clicked + //MessageBox.Show((sender as Button).Name + " has been selected"); + Button btn = (sender as Button); + string[] parts = btn.Name.Split('_'); + DriverData driver = Wrapper.GetFullDriverData(parts[0], pnlCurrentDriverLapsHistory, this); + lblCurrentDriverName.Text = driver.Name; + lblCurrentDriverPosition.Text = driver.Position.ToString(); + lblCurrentDriverGapToLeader.Text = Reader.ConvertMsToTime(driver.GapToLeader); + lblCurrentDriverLapTime.Text = Reader.ConvertMsToTime(driver.LapTime); + lblCurrentDriverTyreAge.Text = driver.CurrentTyre.NumberOfLaps.ToString(); + if (driver.DRS) + { + lblCurrentDriverDRS.Text = "Open"; + lblCurrentDriverDRS.ForeColor = Color.FromArgb(0, 164, 46); + } + else + { + lblCurrentDriverDRS.Text = "Closed"; + lblCurrentDriverDRS.ForeColor = Color.Black; + } + switch (driver.CurrentTyre.Coumpound) + { + case Tyre.Type.Undefined: + lblCurrentDriverTyreType.Text = "uuuuh..."; + lblCurrentDriverTyreType.ForeColor = Color.Violet; + break; + case Tyre.Type.Hard: + lblCurrentDriverTyreType.Text = "Hard"; + lblCurrentDriverTyreType.ForeColor = Color.FromArgb(164, 165, 168); + break; + case Tyre.Type.Medium: + lblCurrentDriverTyreType.Text = "Medium"; + lblCurrentDriverTyreType.ForeColor = Color.FromArgb(245, 191, 0); + break; + case Tyre.Type.Soft: + lblCurrentDriverTyreType.Text = "Soft"; + lblCurrentDriverTyreType.ForeColor = Color.FromArgb(255, 0, 0); + break; + case Tyre.Type.Inter: + lblCurrentDriverTyreType.Text = "Intermediate"; + lblCurrentDriverTyreType.ForeColor = Color.FromArgb(0, 164, 46); + break; + case Tyre.Type.Wet: + lblCurrentDriverTyreType.Text = "Wet"; + lblCurrentDriverTyreType.ForeColor = Color.FromArgb(39, 96, 166); + break; + } + } + public void btnLapTime_Click(object sender, EventArgs e) + { + //Happens when a lapTime has been clicked + Button btn = sender as Button; + string[] parts = btn.Name.Split('_'); + Wrapper.DisplayLapTimeInfos(parts[0], Convert.ToInt32(parts[1]), btn.Text); + } + + private void Main_Resize(object sender, EventArgs e) + { + int xDiff = this.Width - oldSize.Width; + int yDiff = this.Height - oldSize.Height; + int padding = 10; + //This will take half the newly created space + gpbxRanking.Size = new Size(oldRankingSize.Width + xDiff / 2, oldRankingSize.Height + yDiff); + gpbxRanking.Location = new Point(oldRankingPosition.X + xDiff / 2, gpbxRanking.Location.Y); + //Will take half the new height and half the new height + gpbxLapTimes.Size = new Size(oldLapTimesSize.Width + xDiff / 2, oldLapTimesSize.Height + yDiff / 2); + //Will take half the new height and half the new width + gpbxBattles.Size = new Size(oldBattles.Width + xDiff / 2, oldBattles.Height + yDiff / 2); + gpbxBattles.Location = new Point(gpbxBattles.Location.X, oldBattlePosition.Y + yDiff / 2); + //The infos wont change width but will need to be centerd + Point startOfZone = new Point(gpbxOvertakes.Width + gpbxOvertakes.Location.X, gpbxOvertakes.Location.Y); + Point endOfZone = new Point(gpbxRanking.Location.X, gpbxOvertakes.Location.Y); + int totalWidth = endOfZone.X - startOfZone.X; + gpbxDriverInfos.Location = new Point(startOfZone.X + (totalWidth / 2 - gpbxDriverInfos.Width / 2), oldDriverInfoPosition.Y + yDiff); + //Now resizing internals + pnlFastest.Size = new Size(oldPnlFastest.Width + xDiff / 4,oldPnlFastest.Height + yDiff / 4); + pnlFastest.Location = new Point(olPnlFastestPosition.X,olPnlFastestPosition.Y + yDiff / 4); + + pnlSlowest.Size = new Size(oldPnlSlowest.Width + xDiff / 4, oldPnlSlowest.Height + yDiff / 4); + pnlSlowest.Location = new Point(oldPnlSlowestPosition.X + xDiff / 4, oldPnlSlowestPosition.Y + yDiff / 4); + + pnlBattles.Size = new Size(oldPnlBattles.Width + xDiff / 2,oldPnlBattles.Height + yDiff / 2); + + pnlLiveRanking.Size = new Size(oldPnlRankings.Width + xDiff / 2,oldPnlRankings.Height + yDiff); + } + } +} + +``` diff --git a/temp_annexes/Code/OcrImage.md b/temp_annexes/Code/OcrImage.md new file mode 100644 index 0000000..a59f3e8 --- /dev/null +++ b/temp_annexes/Code/OcrImage.md @@ -0,0 +1,678 @@ +# OcrImage.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : OcrImage.cs +/// Brief : Class containing all the methods used to enhance images for OCR +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Drawing; +using System.Drawing.Drawing2D; +using System.Drawing.Imaging; + +namespace TrackTrends +{ + public class OcrImage + { + //this is a hardcoded value based on the colors of the F1TV data channel background you can change it if sometime in the future the color changes + //Any color that has any of its R,G or B channel higher than the treshold will be considered as being usefull information + public static Color F1TV_BACKGROUND_TRESHOLD = Color.FromArgb(0x50, 0x50, 0x50); + Bitmap InputBitmap; + public enum WindowType + { + LapTime, + Text, + Sector, + Gap, + Tyre, + } + + /// + /// Create a new Ocr image to help enhance the given bitmap for OCR + /// + /// The image you want to enhance + public OcrImage(Bitmap inputBitmap) + { + InputBitmap = inputBitmap; + } + /// + /// Enhances the image depending on wich type of window the image comes from + /// + /// The type of the window. Depending on it different enhancing features will be applied + /// The enhanced Bitmap + public Bitmap Enhance(WindowType type = WindowType.Text) + { + Bitmap outputBitmap = (Bitmap)InputBitmap.Clone(); + //Note : If you plan to activate all the comments that I used to debug the OCR I would advise to make sure that the debug folder exists + switch (type) + { + case WindowType.Gap: + //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @"\raw_" + id + ".png"); + + outputBitmap = Tresholding(outputBitmap, 165); + //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @"\treshold_" + id + ".png"); + + outputBitmap = Resize(outputBitmap, 2); + //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @"\resize_" + id + ".png"); + + outputBitmap = Dilatation(outputBitmap, 1); + //outputBitmap.Save(Window.GAPTOLEADER_DEBUG_FOLDER + @"\Final_dilatation_" + id + ".png"); + break; + case WindowType.Sector: + //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @"\raw_" + id + ".png"); + + outputBitmap = VanishOxyAction(outputBitmap); + //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @"\vanish_" + id + ".png"); + + outputBitmap = Tresholding(outputBitmap, 150); + //outputBitmap.Save(Window.SECTOR1_DEBUG_FOLDER + @"\Final_treshold_" + id + ".png"); + break; + case WindowType.LapTime: + //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @"\raw_" + id + ".png"); + + outputBitmap = Tresholding(outputBitmap,185); + //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @"\Treshold_" + id + ".png"); + + outputBitmap = SobelEdgeDetection(outputBitmap); + //outputBitmap.Save(Window.LAPTIME_DEBUG_FOLDER + @"\SobelDetection_" + id + ".png"); + break; + case WindowType.Text: + //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @"\raw_" + id + ".png"); + + outputBitmap = Tresholding(outputBitmap, 165); + //outputBitmap.Save(Window.STRING_DEBUG_FOLDER + @"\Final_treshold_" + id + ".png"); + break; + case WindowType.Tyre: + //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @"\raw_" + id + ".png"); + + outputBitmap = RemoveUseless(outputBitmap); + //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @"\uselessRemoved_" + id + ".png"); + + outputBitmap = Dilatation(outputBitmap, 1); + //outputBitmap.Save(Window.TYRE_DEBUG_FOLDER + @"\Final_dilatation_" + id + ".png"); + break; + default: + outputBitmap = Tresholding(outputBitmap, 165); + outputBitmap = Resize(outputBitmap, 2); + outputBitmap = Erode(outputBitmap, 1); + break; + } + return outputBitmap; + } + /// + /// Method that convert a colored RGB bitmap into a GrayScale image + /// + /// The Bitmap you want to convert + /// The bitmap in grayscale + public static Bitmap Grayscale(Bitmap inputBitmap) + { + Rectangle rect = new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height); + BitmapData bmpData = inputBitmap.LockBits(rect, ImageLockMode.ReadWrite, inputBitmap.PixelFormat); + int bytesPerPixel = Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8; + + unsafe + { + byte* ptr = (byte*)bmpData.Scan0.ToPointer(); + for (int y = 0; y < inputBitmap.Height; y++) + { + byte* currentLine = ptr + (y * bmpData.Stride); + for (int x = 0; x < inputBitmap.Width; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + byte blue = pixel[0]; + byte green = pixel[1]; + byte red = pixel[2]; + + //Those a specific values to correct the weights so its more pleasing to the human eye + int gray = (int)(red * 0.3 + green * 0.59 + blue * 0.11); + + //This is not a proper treshold method but it is helping the sobel edge detection + if(gray <= F1TV_BACKGROUND_TRESHOLD.R) + { + pixel[0] = pixel[1] = pixel[2] = 0; + } + else + { + pixel[0] = pixel[1] = pixel[2] = (byte)gray; + } + } + } + } + inputBitmap.UnlockBits(bmpData); + + return inputBitmap; + } + /// + /// Method that uses the Sobel Edge detection to outline the edges of the characters to help with the OCR + /// + /// The image with the sobel edge detection used + /// + private Bitmap SobelEdgeDetection(Bitmap grayscaleImage) + { + // Create a new bitmap for the edges + Bitmap edgesImage = new Bitmap(grayscaleImage.Width, grayscaleImage.Height); + + // Define the Sobel operators + // Its just a matrix that we will use on the all image + int[,] sobelX = { { -1, 0, 1 }, { -2, 0, 2 }, { -1, 0, 1 } }; + int[,] sobelY = { { -1, -2, -1 }, { 0, 0, 0 }, { 1, 2, 1 } }; + + // Apply the Sobel operators and normalize the gradients + // NOTE: I dont know how easy or hard it would be to make this paralel but it could be a good idea to do so if possible. + for (int y = 1; y < grayscaleImage.Height - 1; y++) + { + for (int x = 1; x < grayscaleImage.Width - 1; x++) + { + int gradientX = CalculateGradient(grayscaleImage, sobelX, x, y); + int gradientY = CalculateGradient(grayscaleImage, sobelY, x, y); + int gradient = (int)Math.Sqrt(gradientX * gradientX + gradientY * gradientY); + + // Normalize the gradient value + // In some rare cases the value can exceed 255 so we limit it with the Math.Min method + gradient = Math.Min(255, Math.Max(0, gradient)); + + edgesImage.SetPixel(x, y, Color.FromArgb(gradient, gradient, gradient)); + } + } + + return edgesImage; + } + /// + /// Method that's here to be used by the sobel edge detection method (Chat GPT has been used for parts of this method) + /// + /// The input image with the grayscale processing already done + /// The matrix to apply + /// + /// + /// Returns the processed gradient + private int CalculateGradient(Bitmap grayscaleImage, int[,] sobelOperator, int x, int y) + { + int gradient = 0; + + for (int j = -1; j <= 1; j++) + { + for (int i = -1; i <= 1; i++) + { + int pixelX = grayscaleImage.GetPixel(x + i, y + j).R; + gradient += sobelOperator[j + 1, i + 1] * pixelX; + } + } + + return gradient; + } + /// + /// Method that is used to whiten an image. Ignore the funny name. Its used to prevent colored text to trouble the OCR when it uses grayscaling + /// + /// The bitmap to vanish + /// + public static Bitmap VanishOxyAction(Bitmap inputBitmap) + { + Rectangle rect = new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height); + BitmapData bmpData = inputBitmap.LockBits(rect, ImageLockMode.ReadWrite, inputBitmap.PixelFormat); + int bytesPerPixel = Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8; + + unsafe + { + //Note : MAKE THIS PARALELL OMG WY DID I LEFT IT LIKE THAT + byte* ptr = (byte*)bmpData.Scan0.ToPointer(); + for (int y = 0; y < inputBitmap.Height; y++) + { + byte* currentLine = ptr + (y * bmpData.Stride); + for (int x = 0; x < inputBitmap.Width; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + int blue = (int)pixel[0]; + int green = (int)pixel[1]; + int red = (int)pixel[2]; + + int max = Math.Max(Math.Max(blue, green), red); + + if (max > 255 / 3) + max = 255; + + pixel[0] = pixel[1] = pixel[2] = (byte)max; + } + } + } + inputBitmap.UnlockBits(bmpData); + + return inputBitmap; + } + /// + /// Method that binaries the input image up to a certain treshold given + /// + /// the bitmap you want to convert to binary colors + /// The floor at wich the color is considered as white or black + /// The binarised bitmap + public static Bitmap Tresholding(Bitmap inputBitmap, int threshold) + { + Rectangle rect = new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height); + BitmapData bmpData = inputBitmap.LockBits(rect, ImageLockMode.ReadWrite, inputBitmap.PixelFormat); + int bytesPerPixel = Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8; + + unsafe + { + byte* ptr = (byte*)bmpData.Scan0.ToPointer(); + int bmpHeight = inputBitmap.Height; + int bmpWidth = inputBitmap.Width; + Parallel.For(0, bmpHeight, y => + { + byte* currentLine = ptr + (y * bmpData.Stride); + for (int x = 0; x < bmpWidth; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + byte blue = pixel[0]; + byte green = pixel[1]; + byte red = pixel[2]; + //Those a specific values to correct the weights so its more pleasing to the human eye + int gray = (int)(red * 0.3 + green * 0.59 + blue * 0.11); + int value = gray < threshold ? 0 : 255; + + pixel[0] = pixel[1] = pixel[2] = (byte)value; + } + }); + } + inputBitmap.UnlockBits(bmpData); + + return inputBitmap; + } + /// + /// Method that removes the pixels that are flagged as background + /// + /// The bitmap you want to remove the background from + /// The Bitmap without the background + public static Bitmap RemoveBG(Bitmap inputBitmap) + { + Rectangle rect = new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height); + BitmapData bmpData = inputBitmap.LockBits(rect, ImageLockMode.ReadWrite, inputBitmap.PixelFormat); + int bytesPerPixel = Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8; + + unsafe + { + byte* ptr = (byte*)bmpData.Scan0.ToPointer(); + for (int y = 0; y < inputBitmap.Height; y++) + { + byte* currentLine = ptr + (y * bmpData.Stride); + for (int x = 0; x < inputBitmap.Width; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + int B = pixel[0]; + int G = pixel[1]; + int R = pixel[2]; + + if (R <= F1TV_BACKGROUND_TRESHOLD.R && G <= F1TV_BACKGROUND_TRESHOLD.G && B <= F1TV_BACKGROUND_TRESHOLD.B) + pixel[0] = pixel[1] = pixel[2] = 0; + } + } + } + inputBitmap.UnlockBits(bmpData); + + return inputBitmap; + } + /// + /// Method that removes all the useless things from the image and returns hopefully only the numbers + /// + /// The bitmap you want to remove useless things from (Expects a cropped part of the TyreWindow) + /// The bitmap with (hopefully) only the digits + public unsafe static Bitmap RemoveUseless(Bitmap inputBitmap) + { + //Note you can use something else than a cropped tyre window but I would recommend checking the code first to see if it fits your intended use + Rectangle rect = new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height); + BitmapData bmpData = inputBitmap.LockBits(rect, ImageLockMode.ReadWrite, inputBitmap.PixelFormat); + int bytesPerPixel = Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8; + + byte* ptr = (byte*)bmpData.Scan0.ToPointer(); + for (int y = 0; y < inputBitmap.Height; y++) + { + byte* currentLine = ptr + (y * bmpData.Stride); + + List pixelsToRemove = new List(); + + bool fromBorder = true; + + for (int x = 0; x < inputBitmap.Width; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + int B = pixel[0]; + int G = pixel[1]; + int R = pixel[2]; + + if (fromBorder && B < F1TV_BACKGROUND_TRESHOLD.B && G < F1TV_BACKGROUND_TRESHOLD.G && R < F1TV_BACKGROUND_TRESHOLD.R) + { + pixelsToRemove.Add(x); + } + else + { + if (fromBorder) + { + fromBorder = false; + pixelsToRemove.Add(x); + } + } + } + fromBorder = true; + for (int x = inputBitmap.Width - 1; x > 0; x--) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + int B = pixel[0]; + int G = pixel[1]; + int R = pixel[2]; + + if (fromBorder && B < F1TV_BACKGROUND_TRESHOLD.B && G < F1TV_BACKGROUND_TRESHOLD.G && R < F1TV_BACKGROUND_TRESHOLD.R) + { + pixelsToRemove.Add(x); + } + else + { + if (fromBorder) + { + fromBorder = false; + pixelsToRemove.Add(x); + } + } + } + + foreach (int pxPos in pixelsToRemove) + { + byte* pixel = currentLine + (pxPos * bytesPerPixel); + + pixel[0] = 0xFF; + pixel[1] = 0xFF; + pixel[2] = 0xFF; + } + } + + //Removing the color parts + for (int y = 0; y < inputBitmap.Height; y++) + { + byte* currentLine = ptr + (y * bmpData.Stride); + for (int x = 0; x < inputBitmap.Width; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + int B = pixel[0]; + int G = pixel[1]; + int R = pixel[2]; + + if (R >= F1TV_BACKGROUND_TRESHOLD.R +25|| G >= F1TV_BACKGROUND_TRESHOLD.G +25|| B >= F1TV_BACKGROUND_TRESHOLD.B +25) + { + pixel[0] = 0xFF; + pixel[1] = 0xFF; + pixel[2] = 0xFF; + } + } + } + + inputBitmap.UnlockBits(bmpData); + return inputBitmap; + } + /// + /// Recovers the average colors from the Image. NOTE : It wont take in account colors that are lower than the background + /// + /// The bitmap you want to get the average color from + /// The average color of the bitmap + public static Color GetAvgColorFromBitmap(Bitmap inputBitmap) + { + Rectangle rect = new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height); + BitmapData bmpData = inputBitmap.LockBits(rect, ImageLockMode.ReadWrite, inputBitmap.PixelFormat); + int bytesPerPixel = Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8; + + int totR = 0; + int totG = 0; + int totB = 0; + + int totPixels = 1; + + unsafe + { + byte* ptr = (byte*)bmpData.Scan0.ToPointer(); + int bmpHeight = inputBitmap.Height; + int bmpWidth = inputBitmap.Width; + Parallel.For(0, bmpHeight, y => + { + byte* currentLine = ptr + (y * bmpData.Stride); + for (int x = 0; x < bmpWidth; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + int B = pixel[0]; + int G = pixel[1]; + int R = pixel[2]; + + if (R >= F1TV_BACKGROUND_TRESHOLD.R || G >= F1TV_BACKGROUND_TRESHOLD.G || B >= F1TV_BACKGROUND_TRESHOLD.B) + { + totPixels++; + totB += pixel[0]; + totG += pixel[1]; + totR += pixel[2]; + } + } + }); + } + inputBitmap.UnlockBits(bmpData); + + return Color.FromArgb(255,Math.Min(Convert.ToInt32((float)totR / (float)totPixels),255), Math.Min(Convert.ToInt32((float)totG / (float)totPixels),255), Math.Min(Convert.ToInt32((float)totB / (float)totPixels),255)); + } + /// + /// This method simply inverts all the colors in a Bitmap + /// + /// the bitmap you want to invert the colors from + /// The bitmap with inverted colors + public static Bitmap InvertColors(Bitmap inputBitmap) + { + Rectangle rect = new Rectangle(0, 0, inputBitmap.Width, inputBitmap.Height); + BitmapData bmpData = inputBitmap.LockBits(rect, ImageLockMode.ReadWrite, inputBitmap.PixelFormat); + int bytesPerPixel = Bitmap.GetPixelFormatSize(inputBitmap.PixelFormat) / 8; + + unsafe + { + byte* ptr = (byte*)bmpData.Scan0.ToPointer(); + for (int y = 0; y < inputBitmap.Height; y++) + { + byte* currentLine = ptr + (y * bmpData.Stride); + for (int x = 0; x < inputBitmap.Width; x++) + { + byte* pixel = currentLine + (x * bytesPerPixel); + + pixel[0] = (byte)(255 - pixel[0]); + pixel[1] = (byte)(255 - pixel[1]); + pixel[2] = (byte)(255 - pixel[2]); + } + } + } + inputBitmap.UnlockBits(bmpData); + + return inputBitmap; + } + /// + /// Methods that applies Bicubic interpolation to increase the size and resolution of an image + /// + /// The bitmap you want to resize + /// The factor of resizing you want to use. I recommend using even numbers + /// The bitmap witht the new size + public static Bitmap Resize(Bitmap inputBitmap, int resizeFactor) + { + var resultBitmap = new Bitmap(inputBitmap.Width * resizeFactor, inputBitmap.Height * resizeFactor); + + using (var graphics = Graphics.FromImage(resultBitmap)) + { + graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; + graphics.DrawImage(inputBitmap, new Rectangle(0, 0, resultBitmap.Width, resultBitmap.Height)); + } + + return resultBitmap; + } + /// + /// method that Highlights the countours of a Bitmap + /// + /// The bitmap you want to highlight the countours of + /// The bitmap with countours highlighted + public static Bitmap HighlightContours(Bitmap inputBitmap) + { + Bitmap outputBitmap = new Bitmap(inputBitmap.Width, inputBitmap.Height); + + Bitmap grayscale = Grayscale(inputBitmap); + Bitmap thresholded = Tresholding(grayscale, 128); + Bitmap dilated = Dilatation(thresholded, 3); + Bitmap eroded = Erode(dilated, 3); + + for (int y = 0; y < inputBitmap.Height; y++) + { + for (int x = 0; x < inputBitmap.Width; x++) + { + Color pixel = inputBitmap.GetPixel(x, y); + Color dilatedPixel = dilated.GetPixel(x, y); + Color erodedPixel = eroded.GetPixel(x, y); + + int gray = (int)(pixel.R * 0.3 + pixel.G * 0.59 + pixel.B * 0.11); + int threshold = dilatedPixel.R; + + if (gray > threshold) + { + outputBitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255)); + } + else if (gray <= threshold && erodedPixel.R == 0) + { + outputBitmap.SetPixel(x, y, Color.FromArgb(255, 0, 0)); + } + else + { + outputBitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0)); + } + } + } + + return outputBitmap; + } + /// + /// Method that that erodes the morphology of a bitmap + /// + /// The bitmap you want to erode + /// The amount of Erosion you want (be carefull its expensive on ressources) + /// The Bitmap with the eroded contents + public static Bitmap Erode(Bitmap inputBitmap, int kernelSize) + { + Bitmap outputBitmap = new Bitmap(inputBitmap.Width, inputBitmap.Height); + + int[,] kernel = new int[kernelSize, kernelSize]; + + for (int i = 0; i < kernelSize; i++) + { + for (int j = 0; j < kernelSize; j++) + { + kernel[i, j] = 1; + } + } + + for (int y = kernelSize / 2; y < inputBitmap.Height - kernelSize / 2; y++) + { + for (int x = kernelSize / 2; x < inputBitmap.Width - kernelSize / 2; x++) + { + bool flag = true; + + for (int i = -kernelSize / 2; i <= kernelSize / 2; i++) + { + for (int j = -kernelSize / 2; j <= kernelSize / 2; j++) + { + Color pixel = inputBitmap.GetPixel(x + i, y + j); + int gray = (int)(pixel.R * 0.3 + pixel.G * 0.59 + pixel.B * 0.11); + + if (gray >= 128 && kernel[i + kernelSize / 2, j + kernelSize / 2] == 1) + { + flag = false; + break; + } + } + + if (!flag) + { + break; + } + } + + if (flag) + { + outputBitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255)); + } + else + { + outputBitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0)); + } + } + } + + return outputBitmap; + } + /// + /// Method that that use dilatation of the morphology of a bitmap + /// + /// The bitmap you want to use dilatation on + /// The amount of dilatation you want (be carefull its expensive on ressources) + /// The Bitmap after Dilatation + public static Bitmap Dilatation(Bitmap inputBitmap, int kernelSize) + { + Bitmap outputBitmap = new Bitmap(inputBitmap.Width, inputBitmap.Height); + + int[,] kernel = new int[kernelSize, kernelSize]; + + for (int i = 0; i < kernelSize; i++) + { + for (int j = 0; j < kernelSize; j++) + { + kernel[i, j] = 1; + } + } + + for (int y = kernelSize / 2; y < inputBitmap.Height - kernelSize / 2; y++) + { + for (int x = kernelSize / 2; x < inputBitmap.Width - kernelSize / 2; x++) + { + bool flag = false; + + for (int i = -kernelSize / 2; i <= kernelSize / 2; i++) + { + for (int j = -kernelSize / 2; j <= kernelSize / 2; j++) + { + Color pixel = inputBitmap.GetPixel(x + i, y + j); + int gray = (int)(pixel.R * 0.3 + pixel.G * 0.59 + pixel.B * 0.11); + + if (gray < 128 && kernel[i + kernelSize / 2, j + kernelSize / 2] == 1) + { + flag = true; + break; + } + } + + if (flag) + { + break; + } + } + + if (flag) + { + outputBitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0)); + } + else + { + outputBitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255)); + } + } + } + + return outputBitmap; + } + } +} + +``` diff --git a/temp_annexes/Code/Program.md b/temp_annexes/Code/Program.md new file mode 100644 index 0000000..f1e34b0 --- /dev/null +++ b/temp_annexes/Code/Program.md @@ -0,0 +1,27 @@ +# Program.cs + +``` cs +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace TrackTrends +{ + internal static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Application.EnableVisualStyles(); + Application.SetCompatibleTextRenderingDefault(false); + Application.Run(new Main()); + } + } +} + +``` diff --git a/temp_annexes/Code/Reader.md b/temp_annexes/Code/Reader.md new file mode 100644 index 0000000..d91be78 --- /dev/null +++ b/temp_annexes/Code/Reader.md @@ -0,0 +1,343 @@ +# Reader.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : Reader.cs +/// Brief : Class used to Read the config file for the OCR +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; +using System.Windows.Forms; +using System.IO; +using System.Text.Json; + +namespace TrackTrends +{ + public class Reader + { + const int NUMBER_OF_DRIVERS = 20; + public List Drivers; + public List MainZones; + + private SqliteStorage _storage; + private List[] DriverDataLogs = new List[NUMBER_OF_DRIVERS]; + private int[] DriverLaps = new int[NUMBER_OF_DRIVERS]; + + public SqliteStorage Storage { get => _storage; private set => _storage = value; } + + public Reader(string configFile, Bitmap image, bool loadOCR = true) + { + Storage = new SqliteStorage(); + MainZones = Load(image, configFile, ref Drivers, loadOCR); + } + /// + /// Method that reads the JSON config file and create all the Zones and Windows + /// + /// The image #id on wich you want to create the zones on + public List Load(Bitmap image, string configFilePath, ref List driverListToFill, bool LoadOCR) + { + // Note : You may wonder why in the H... I have all the zones and windows stored in a JSON file and not just for example the first and the last + // Its because they are not perfectly aligned to each others and every zone has his own alignement to the main image + List mainZones = new List(); + Bitmap fullImage = image; + Zone mainZone; + + for (int i = 0; i < NUMBER_OF_DRIVERS; i++) + { + DriverDataLogs[i] = new List(); + DriverLaps[i] = 0; + } + + try + { + string jsonString = File.ReadAllText(configFilePath); + + JsonDocument document = JsonDocument.Parse(jsonString); + + JsonElement root = document.RootElement; + + mainZones = new List(); + driverListToFill = new List(); + + JsonElement main = root.GetProperty("Main"); + + int x = main.GetProperty("x").GetInt32(); + int y = main.GetProperty("y").GetInt32(); + int width = main.GetProperty("width").GetInt32(); + int height = main.GetProperty("height").GetInt32(); + + mainZone = new Zone(fullImage, new Rectangle(x, y, width, height), "Main"); + + mainZone.ResetWindows(); + mainZone.ResetZones(); + + JsonElement driverZones = main.GetProperty("DriverZones"); + + foreach (JsonElement driverZoneElement in driverZones.EnumerateArray()) + { + string name = driverZoneElement.GetProperty("name").GetString(); + int driverX = driverZoneElement.GetProperty("x").GetInt32() + mainZone.Bounds.X; + int driverY = driverZoneElement.GetProperty("y").GetInt32() + mainZone.Bounds.Y; + int driverWidth = driverZoneElement.GetProperty("width").GetInt32(); + int driverHeight = driverZoneElement.GetProperty("height").GetInt32(); + + Zone driverZone = new Zone(fullImage, new Rectangle(driverX, driverY, driverWidth, driverHeight), "Driver"); + + JsonElement windowsElement = driverZoneElement.GetProperty("Windows"); + + //string[] windowNames = new string[] { "Position","GapToLeader","LapTime","DRS","Tyres","Name","Sector1","Sector2","Sector3" }; + + foreach (JsonElement windowElement in windowsElement.EnumerateArray()) + { + //Position + JsonElement posEl = windowElement.GetProperty("Position"); + DriverPositionWindow positionWindow = new DriverPositionWindow(driverZone.ZoneImage, + new Rectangle( + posEl.GetProperty("x").GetInt32(), + posEl.GetProperty("y").GetInt32(), + posEl.GetProperty("width").GetInt32(), + posEl.GetProperty("height").GetInt32()), + LoadOCR); + + //GapToLeader + JsonElement gapEl = windowElement.GetProperty("GapToLeader"); + DriverGapToLeaderWindow gapWindow = new DriverGapToLeaderWindow(driverZone.ZoneImage, + new Rectangle( + gapEl.GetProperty("x").GetInt32(), + gapEl.GetProperty("y").GetInt32(), + gapEl.GetProperty("width").GetInt32(), + gapEl.GetProperty("height").GetInt32()), + LoadOCR); + + //LapTime + JsonElement lapEl = windowElement.GetProperty("LapTime"); + DriverLapTimeWindow lapWindow = new DriverLapTimeWindow(driverZone.ZoneImage, + new Rectangle( + lapEl.GetProperty("x").GetInt32(), + lapEl.GetProperty("y").GetInt32(), + lapEl.GetProperty("width").GetInt32(), + lapEl.GetProperty("height").GetInt32()), + LoadOCR); + + //DRS + JsonElement drsEl = windowElement.GetProperty("DRS"); + DriverDrsWindow drsWindow = new DriverDrsWindow(driverZone.ZoneImage, + new Rectangle( + drsEl.GetProperty("x").GetInt32(), + drsEl.GetProperty("y").GetInt32(), + drsEl.GetProperty("width").GetInt32(), + drsEl.GetProperty("height").GetInt32()), + LoadOCR); + + //Tyre + JsonElement tyresEl = windowElement.GetProperty("Tyres"); + DriverTyresWindow tyreWindow = new DriverTyresWindow(driverZone.ZoneImage, + new Rectangle( + tyresEl.GetProperty("x").GetInt32(), + tyresEl.GetProperty("y").GetInt32(), + tyresEl.GetProperty("width").GetInt32(), + tyresEl.GetProperty("height").GetInt32()), + LoadOCR); + + //Name + JsonElement nameEl = windowElement.GetProperty("Name"); + DriverNameWindow nameWindow = new DriverNameWindow(driverZone.ZoneImage, + new Rectangle( + nameEl.GetProperty("x").GetInt32(), + nameEl.GetProperty("y").GetInt32(), + nameEl.GetProperty("width").GetInt32(), + nameEl.GetProperty("height").GetInt32()), + LoadOCR); + + //Sector1 + JsonElement sec1El = windowElement.GetProperty("Sector1"); + DriverSectorWindow sec1Window = new DriverSectorWindow(driverZone.ZoneImage, + new Rectangle( + sec1El.GetProperty("x").GetInt32(), + sec1El.GetProperty("y").GetInt32(), + sec1El.GetProperty("width").GetInt32(), + sec1El.GetProperty("height").GetInt32()), + 1, LoadOCR); + + //Sector2 + JsonElement sec2El = windowElement.GetProperty("Sector2"); + DriverSectorWindow sec2Window = new DriverSectorWindow(driverZone.ZoneImage, + new Rectangle( + sec2El.GetProperty("x").GetInt32(), + sec2El.GetProperty("y").GetInt32(), + sec2El.GetProperty("width").GetInt32(), + sec2El.GetProperty("height").GetInt32()), + 2, LoadOCR); + + //Sector3 + JsonElement sec3El = windowElement.GetProperty("Sector3"); + DriverSectorWindow sec3Window = new DriverSectorWindow(driverZone.ZoneImage, + new Rectangle( + sec3El.GetProperty("x").GetInt32(), + sec3El.GetProperty("y").GetInt32(), + sec3El.GetProperty("width").GetInt32(), + sec3El.GetProperty("height").GetInt32()), + 3, LoadOCR); + + driverZone.AddWindow(positionWindow); + driverZone.AddWindow(gapWindow); + driverZone.AddWindow(lapWindow); + driverZone.AddWindow(drsWindow); + driverZone.AddWindow(tyreWindow); + driverZone.AddWindow(nameWindow); + driverZone.AddWindow(sec1Window); + driverZone.AddWindow(sec2Window); + driverZone.AddWindow(sec3Window); + } + mainZone.AddZone(driverZone); + } + + JsonElement driversElement = main.GetProperty("Drivers"); + foreach (JsonElement driverElement in driversElement.EnumerateArray()) + { + string driverName = driverElement.GetString(); + driverListToFill.Add(driverName); + Storage.AddDriver(driverName); + } + + mainZones.Add(mainZone); + } + catch (IOException ex) + { + MessageBox.Show("Error reading JSON file: " + ex.Message); + } + catch (JsonException ex) + { + MessageBox.Show("Invalid JSON format: " + ex.Message); + } + int driverID = 0; + foreach (Zone z in mainZones[0].Zones) + { + driverID++; + z.ZoneImage.Save("LoadedDriver" + driverID + ".png"); + } + return mainZones; + } + /// + /// Method that calls all the zones and windows to get the content they can find on the image to display them + /// + /// The id of the image we are working with + /// a string representation of all the returns + public List Decode(List mainZones, List drivers) + { + List mainResults = new List(); + //Decode + for (int mainZoneId = 0; mainZoneId < mainZones.Count; mainZoneId++) + { + switch (mainZoneId) + { + case 0: + //object lockObject = new object(); + //Main Zone + Parallel.For(0, mainZones[mainZoneId].Zones.Count, async i => + //for (int i = 0; i < mainZones[mainZoneId].Zones.Count; i++) + { + DriverData data = mainZones[mainZoneId].Zones[i].Decode(new List(drivers)); + mainResults.Add(data); + DriverDataLogs[i].Add(data); + + if (data.Position != -1 && DriverDataLogs[i].Count > 1) + { + //Tries to fix the tyres + if (data.CurrentTyre.NumberOfLaps > DriverDataLogs[i][DriverDataLogs[i].Count - 2].CurrentTyre.NumberOfLaps + 3) + data.CurrentTyre.NumberOfLaps = DriverDataLogs[i][DriverDataLogs[i].Count - 2].CurrentTyre.NumberOfLaps + 1; + + //Checking if its a new lap + //If the third sector is filled but it was'nt the last time, then it means that a new Lap has been started + //Lap detection can be f***ed if the OCR takes so much time that an entire sector can be raced without us knowing. + if ( + DriverDataLogs[i][DriverDataLogs[i].Count - 1].Sector3 != 0 + && DriverDataLogs[i][DriverDataLogs[i].Count - 2].Sector3 == 0 + && DriverDataLogs[i][DriverDataLogs[i].Count - 2].Position != -1 + && DriverDataLogs[i][DriverDataLogs[i].Count - 1].Position != -1) + { + DriverData stats = new DriverData(); + stats = DriverDataLogs[i][DriverDataLogs[i].Count - 1]; + DriverLaps[i]++; + Storage.AddDriverStat(stats, DriverLaps[i]); + } + //Checking if its a pitstop + //Forget this the best way to know if a tyre has been changed is if the number of laps is zero + if (data.CurrentTyre.Coumpound != Tyre.Type.Undefined && data.CurrentTyre.NumberOfLaps == 0 && DriverDataLogs[i][DriverDataLogs[i].Count - 2].CurrentTyre.NumberOfLaps != 0) + { + Storage.AddPitstop(data.Name, DriverLaps[i] - 1, data.CurrentTyre.Coumpound.ToString()); + //Driver laps -1 because it would take AT LEAST one lap for this program to detect a pitstop + } + } + DriverDataLogs[i].Add(data); + }); + break; + //Next there could be a Title Zone and TrackInfoZone + } + } + //mainResults = mainResults.OrderBy(driver => driver.Position >= 0).ThenBy(driver => driver.Position).ToList(); + mainResults = mainResults.OrderBy(driver => driver.Position).ToList(); + return mainResults; + } + /// + /// Changes the image in all of the zones wich then will do the same for theyre own subzones and windows + /// + /// The new Image from the F1TV data channel + public void ChangeImage(Bitmap Image) + { + foreach (Zone z in MainZones) + { + z.Image = Image; + } + } + /// + /// Method that can be used to convert an amount of miliseconds into a more readable human form + /// + /// The given amount of miliseconds ton convert + /// A human readable string that represents the ms + public static string ConvertMsToTime(int amountOfMs) + { + //Convert.ToInt32 would round upand I dont want that + int minuts = (int)((float)amountOfMs / (1000f * 60f)); + int seconds = (int)((amountOfMs - (minuts * 60f * 1000f)) / 1000); + int ms = amountOfMs - ((minuts * 60 * 1000) + (seconds * 1000)); + + return minuts + ":" + seconds.ToString("00") + ":" + ms.ToString("000"); + } + /// + /// Old method that can draw on an image where the windows and zones are created. mostly used for debugging + /// + /// the #id of the image we are working with + /// the drawed bitmap + public Bitmap Draw(Bitmap image, List mainZones) + { + + Graphics g = Graphics.FromImage(image); + + foreach (Zone z in mainZones) + { + int count = 0; + foreach (Zone zz in z.Zones) + { + g.DrawRectangle(Pens.Red, z.Bounds); + foreach (Window w in zz.Windows) + { + g.DrawRectangle(Pens.Blue, new Rectangle(z.Bounds.X + zz.Bounds.X, z.Bounds.Y + zz.Bounds.Y, zz.Bounds.Width, zz.Bounds.Height)); + } + + count++; + } + } + + return image; + } + } +} + +``` diff --git a/temp_annexes/Code/Settings.Designer.md b/temp_annexes/Code/Settings.Designer.md new file mode 100644 index 0000000..2ca6e94 --- /dev/null +++ b/temp_annexes/Code/Settings.Designer.md @@ -0,0 +1,498 @@ +# Settings.Designer.cs + +``` cs +namespace TrackTrends +{ + partial class Settings + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + this.components = new System.ComponentModel.Container(); + this.label1 = new System.Windows.Forms.Label(); + this.label2 = new System.Windows.Forms.Label(); + this.gpbxRaceSettings = new System.Windows.Forms.GroupBox(); + this.tbxGpUrl = new System.Windows.Forms.TextBox(); + this.gpbxDriverList = new System.Windows.Forms.GroupBox(); + this.lsbDrivers = new System.Windows.Forms.ListBox(); + this.btnRemoveDriver = new System.Windows.Forms.Button(); + this.btnAddDriver = new System.Windows.Forms.Button(); + this.tbxDriverName = new System.Windows.Forms.TextBox(); + this.gpbxPreview = new System.Windows.Forms.GroupBox(); + this.lblWindowsRemaining = new System.Windows.Forms.Label(); + this.btnResetDriver = new System.Windows.Forms.Button(); + this.btnRefresh = new System.Windows.Forms.Button(); + this.lblWindowPointsRemaining = new System.Windows.Forms.Label(); + this.lblZonePointsRemaning = new System.Windows.Forms.Label(); + this.btnCreateWindow = new System.Windows.Forms.Button(); + this.pbxPreview = new System.Windows.Forms.PictureBox(); + this.btnCreatZone = new System.Windows.Forms.Button(); + this.gpbxWindowPreview = new System.Windows.Forms.GroupBox(); + this.pbxWindowPreview = new System.Windows.Forms.PictureBox(); + this.btnLoadPreset = new System.Windows.Forms.Button(); + this.lsbPresets = new System.Windows.Forms.ListBox(); + this.tbxPresetName = new System.Windows.Forms.TextBox(); + this.btnSavePreset = new System.Windows.Forms.Button(); + this.gpbxPresets = new System.Windows.Forms.GroupBox(); + this.btnDeletePreset = new System.Windows.Forms.Button(); + this.tip1 = new System.Windows.Forms.ToolTip(this.components); + this.gpbxRaceSettings.SuspendLayout(); + this.gpbxDriverList.SuspendLayout(); + this.gpbxPreview.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pbxPreview)).BeginInit(); + this.gpbxWindowPreview.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pbxWindowPreview)).BeginInit(); + this.gpbxPresets.SuspendLayout(); + this.SuspendLayout(); + // + // label1 + // + this.label1.AutoSize = true; + this.label1.Font = new System.Drawing.Font("Microsoft YaHei UI", 19.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label1.ForeColor = System.Drawing.Color.White; + this.label1.Location = new System.Drawing.Point(12, 14); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(309, 43); + this.label1.TabIndex = 0; + this.label1.Text = "Configuration tool"; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Font = new System.Drawing.Font("Microsoft YaHei UI", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label2.ForeColor = System.Drawing.Color.White; + this.label2.Location = new System.Drawing.Point(3, 25); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(132, 23); + this.label2.TabIndex = 1; + this.label2.Text = "Grand Prix URL"; + // + // gpbxRaceSettings + // + this.gpbxRaceSettings.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.gpbxRaceSettings.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(79)))), ((int)(((byte)(79)))), ((int)(((byte)(79))))); + this.gpbxRaceSettings.Controls.Add(this.tbxGpUrl); + this.gpbxRaceSettings.Controls.Add(this.label2); + this.gpbxRaceSettings.Font = new System.Drawing.Font("Microsoft YaHei UI", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.gpbxRaceSettings.ForeColor = System.Drawing.Color.White; + this.gpbxRaceSettings.Location = new System.Drawing.Point(733, 9); + this.gpbxRaceSettings.Name = "gpbxRaceSettings"; + this.gpbxRaceSettings.Padding = new System.Windows.Forms.Padding(0); + this.gpbxRaceSettings.Size = new System.Drawing.Size(521, 58); + this.gpbxRaceSettings.TabIndex = 2; + this.gpbxRaceSettings.TabStop = false; + this.gpbxRaceSettings.Text = "RaceSettings"; + this.gpbxRaceSettings.Paint += new System.Windows.Forms.PaintEventHandler(this.removeBorders); + // + // tbxGpUrl + // + this.tbxGpUrl.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.tbxGpUrl.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.tbxGpUrl.Font = new System.Drawing.Font("Microsoft YaHei UI", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.tbxGpUrl.ForeColor = System.Drawing.Color.White; + this.tbxGpUrl.Location = new System.Drawing.Point(141, 25); + this.tbxGpUrl.Name = "tbxGpUrl"; + this.tbxGpUrl.Size = new System.Drawing.Size(367, 22); + this.tbxGpUrl.TabIndex = 4; + this.tbxGpUrl.TextChanged += new System.EventHandler(this.tbxGpUrl_TextChanged); + // + // gpbxDriverList + // + this.gpbxDriverList.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.gpbxDriverList.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(79)))), ((int)(((byte)(79)))), ((int)(((byte)(79))))); + this.gpbxDriverList.Controls.Add(this.lsbDrivers); + this.gpbxDriverList.Controls.Add(this.btnRemoveDriver); + this.gpbxDriverList.Controls.Add(this.btnAddDriver); + this.gpbxDriverList.Controls.Add(this.tbxDriverName); + this.gpbxDriverList.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.gpbxDriverList.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F); + this.gpbxDriverList.ForeColor = System.Drawing.Color.White; + this.gpbxDriverList.Location = new System.Drawing.Point(995, 73); + this.gpbxDriverList.Name = "gpbxDriverList"; + this.gpbxDriverList.Padding = new System.Windows.Forms.Padding(0); + this.gpbxDriverList.Size = new System.Drawing.Size(259, 269); + this.gpbxDriverList.TabIndex = 3; + this.gpbxDriverList.TabStop = false; + this.gpbxDriverList.Text = "DriverList"; + this.gpbxDriverList.Paint += new System.Windows.Forms.PaintEventHandler(this.removeBorders); + // + // lsbDrivers + // + this.lsbDrivers.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.lsbDrivers.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.lsbDrivers.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F); + this.lsbDrivers.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(252)))), ((int)(((byte)(252))))); + this.lsbDrivers.FormattingEnabled = true; + this.lsbDrivers.ItemHeight = 23; + this.lsbDrivers.Location = new System.Drawing.Point(10, 23); + this.lsbDrivers.Name = "lsbDrivers"; + this.lsbDrivers.Size = new System.Drawing.Size(243, 138); + this.lsbDrivers.TabIndex = 10; + // + // btnRemoveDriver + // + this.btnRemoveDriver.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.btnRemoveDriver.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnRemoveDriver.Font = new System.Drawing.Font("Microsoft YaHei UI", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnRemoveDriver.ForeColor = System.Drawing.Color.White; + this.btnRemoveDriver.Location = new System.Drawing.Point(132, 167); + this.btnRemoveDriver.Name = "btnRemoveDriver"; + this.btnRemoveDriver.Size = new System.Drawing.Size(121, 62); + this.btnRemoveDriver.TabIndex = 9; + this.btnRemoveDriver.Text = "Remove"; + this.btnRemoveDriver.UseVisualStyleBackColor = false; + this.btnRemoveDriver.Click += new System.EventHandler(this.btnRemoveDriver_Click); + // + // btnAddDriver + // + this.btnAddDriver.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.btnAddDriver.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnAddDriver.Font = new System.Drawing.Font("Microsoft YaHei UI", 10.2F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.btnAddDriver.ForeColor = System.Drawing.Color.White; + this.btnAddDriver.Location = new System.Drawing.Point(10, 167); + this.btnAddDriver.Name = "btnAddDriver"; + this.btnAddDriver.Size = new System.Drawing.Size(116, 62); + this.btnAddDriver.TabIndex = 8; + this.btnAddDriver.Text = "Add"; + this.btnAddDriver.UseVisualStyleBackColor = false; + this.btnAddDriver.Click += new System.EventHandler(this.btnAddDriver_Click); + // + // tbxDriverName + // + this.tbxDriverName.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.tbxDriverName.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.tbxDriverName.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F); + this.tbxDriverName.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(252)))), ((int)(((byte)(252))))); + this.tbxDriverName.Location = new System.Drawing.Point(10, 235); + this.tbxDriverName.Name = "tbxDriverName"; + this.tbxDriverName.Size = new System.Drawing.Size(243, 24); + this.tbxDriverName.TabIndex = 7; + // + // gpbxPreview + // + this.gpbxPreview.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(79)))), ((int)(((byte)(79)))), ((int)(((byte)(79))))); + this.gpbxPreview.Controls.Add(this.lblWindowsRemaining); + this.gpbxPreview.Controls.Add(this.btnResetDriver); + this.gpbxPreview.Controls.Add(this.btnRefresh); + this.gpbxPreview.Controls.Add(this.lblWindowPointsRemaining); + this.gpbxPreview.Controls.Add(this.lblZonePointsRemaning); + this.gpbxPreview.Controls.Add(this.btnCreateWindow); + this.gpbxPreview.Controls.Add(this.pbxPreview); + this.gpbxPreview.Controls.Add(this.btnCreatZone); + this.gpbxPreview.FlatStyle = System.Windows.Forms.FlatStyle.Flat; + this.gpbxPreview.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F); + this.gpbxPreview.ForeColor = System.Drawing.Color.White; + this.gpbxPreview.Location = new System.Drawing.Point(18, 73); + this.gpbxPreview.Name = "gpbxPreview"; + this.gpbxPreview.Padding = new System.Windows.Forms.Padding(0); + this.gpbxPreview.Size = new System.Drawing.Size(968, 608); + this.gpbxPreview.TabIndex = 4; + this.gpbxPreview.TabStop = false; + this.gpbxPreview.Text = "Preview"; + this.gpbxPreview.Paint += new System.Windows.Forms.PaintEventHandler(this.removeBorders); + // + // lblWindowsRemaining + // + this.lblWindowsRemaining.AutoSize = true; + this.lblWindowsRemaining.BackColor = System.Drawing.Color.Transparent; + this.lblWindowsRemaining.ForeColor = System.Drawing.Color.White; + this.lblWindowsRemaining.Location = new System.Drawing.Point(215, 82); + this.lblWindowsRemaining.Name = "lblWindowsRemaining"; + this.lblWindowsRemaining.Size = new System.Drawing.Size(183, 23); + this.lblWindowsRemaining.TabIndex = 6; + this.lblWindowsRemaining.Text = "7 windows remaining"; + // + // btnResetDriver + // + this.btnResetDriver.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnResetDriver.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.btnResetDriver.Enabled = false; + this.btnResetDriver.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnResetDriver.ForeColor = System.Drawing.Color.White; + this.btnResetDriver.Location = new System.Drawing.Point(748, 20); + this.btnResetDriver.Name = "btnResetDriver"; + this.btnResetDriver.Size = new System.Drawing.Size(211, 33); + this.btnResetDriver.TabIndex = 2; + this.btnResetDriver.Text = "Reset the emulator"; + this.btnResetDriver.UseVisualStyleBackColor = false; + this.btnResetDriver.Click += new System.EventHandler(this.btnResetDriver_Click); + // + // btnRefresh + // + this.btnRefresh.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.btnRefresh.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.btnRefresh.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnRefresh.ForeColor = System.Drawing.Color.White; + this.btnRefresh.Location = new System.Drawing.Point(549, 20); + this.btnRefresh.Name = "btnRefresh"; + this.btnRefresh.Size = new System.Drawing.Size(193, 33); + this.btnRefresh.TabIndex = 1; + this.btnRefresh.Text = "Start the browser"; + this.btnRefresh.UseVisualStyleBackColor = false; + this.btnRefresh.Click += new System.EventHandler(this.btnRefresh_Click); + // + // lblWindowPointsRemaining + // + this.lblWindowPointsRemaining.AutoSize = true; + this.lblWindowPointsRemaining.ForeColor = System.Drawing.Color.White; + this.lblWindowPointsRemaining.Location = new System.Drawing.Point(215, 59); + this.lblWindowPointsRemaining.Name = "lblWindowPointsRemaining"; + this.lblWindowPointsRemaining.Size = new System.Drawing.Size(163, 23); + this.lblWindowPointsRemaining.TabIndex = 4; + this.lblWindowPointsRemaining.Text = "0 points remaining"; + // + // lblZonePointsRemaning + // + this.lblZonePointsRemaning.AutoSize = true; + this.lblZonePointsRemaning.ForeColor = System.Drawing.Color.White; + this.lblZonePointsRemaning.Location = new System.Drawing.Point(19, 59); + this.lblZonePointsRemaning.Name = "lblZonePointsRemaning"; + this.lblZonePointsRemaning.Size = new System.Drawing.Size(163, 23); + this.lblZonePointsRemaning.TabIndex = 5; + this.lblZonePointsRemaning.Text = "0 points remaining"; + // + // btnCreateWindow + // + this.btnCreateWindow.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.btnCreateWindow.Enabled = false; + this.btnCreateWindow.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnCreateWindow.ForeColor = System.Drawing.Color.White; + this.btnCreateWindow.Location = new System.Drawing.Point(213, 23); + this.btnCreateWindow.Name = "btnCreateWindow"; + this.btnCreateWindow.Size = new System.Drawing.Size(201, 33); + this.btnCreateWindow.TabIndex = 2; + this.btnCreateWindow.Text = "Create the windows"; + this.btnCreateWindow.UseVisualStyleBackColor = false; + this.btnCreateWindow.Click += new System.EventHandler(this.btnCreateWindow_Click); + // + // pbxPreview + // + this.pbxPreview.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.pbxPreview.Location = new System.Drawing.Point(10, 62); + this.pbxPreview.Name = "pbxPreview"; + this.pbxPreview.Size = new System.Drawing.Size(950, 540); + this.pbxPreview.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pbxPreview.TabIndex = 0; + this.pbxPreview.TabStop = false; + this.pbxPreview.Click += new System.EventHandler(this.pbxMain_Click); + this.pbxPreview.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pbxMain_MouseClick); + // + // btnCreatZone + // + this.btnCreatZone.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.btnCreatZone.Enabled = false; + this.btnCreatZone.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnCreatZone.ForeColor = System.Drawing.Color.White; + this.btnCreatZone.Location = new System.Drawing.Point(6, 23); + this.btnCreatZone.Name = "btnCreatZone"; + this.btnCreatZone.Size = new System.Drawing.Size(201, 33); + this.btnCreatZone.TabIndex = 1; + this.btnCreatZone.Text = "Create the main zone"; + this.btnCreatZone.UseVisualStyleBackColor = false; + this.btnCreatZone.Click += new System.EventHandler(this.btnCreatZone_Click); + // + // gpbxWindowPreview + // + this.gpbxWindowPreview.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.gpbxWindowPreview.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(79)))), ((int)(((byte)(79)))), ((int)(((byte)(79))))); + this.gpbxWindowPreview.Controls.Add(this.pbxWindowPreview); + this.gpbxWindowPreview.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.gpbxWindowPreview.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F); + this.gpbxWindowPreview.ForeColor = System.Drawing.Color.White; + this.gpbxWindowPreview.Location = new System.Drawing.Point(18, 688); + this.gpbxWindowPreview.Name = "gpbxWindowPreview"; + this.gpbxWindowPreview.Padding = new System.Windows.Forms.Padding(0); + this.gpbxWindowPreview.Size = new System.Drawing.Size(1237, 88); + this.gpbxWindowPreview.TabIndex = 5; + this.gpbxWindowPreview.TabStop = false; + this.gpbxWindowPreview.Text = "DriverZonePreview"; + this.gpbxWindowPreview.Paint += new System.Windows.Forms.PaintEventHandler(this.removeBorders); + // + // pbxWindowPreview + // + this.pbxWindowPreview.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.pbxWindowPreview.Location = new System.Drawing.Point(6, 30); + this.pbxWindowPreview.Name = "pbxWindowPreview"; + this.pbxWindowPreview.Size = new System.Drawing.Size(1225, 50); + this.pbxWindowPreview.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage; + this.pbxWindowPreview.TabIndex = 0; + this.pbxWindowPreview.TabStop = false; + this.pbxWindowPreview.Click += new System.EventHandler(this.pbxDriverZone_Click); + this.pbxWindowPreview.MouseClick += new System.Windows.Forms.MouseEventHandler(this.pbxDriverZone_MouseClick); + // + // btnLoadPreset + // + this.btnLoadPreset.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.btnLoadPreset.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnLoadPreset.ForeColor = System.Drawing.Color.White; + this.btnLoadPreset.Location = new System.Drawing.Point(10, 213); + this.btnLoadPreset.Name = "btnLoadPreset"; + this.btnLoadPreset.Size = new System.Drawing.Size(243, 40); + this.btnLoadPreset.TabIndex = 10; + this.btnLoadPreset.Text = "Load the preset"; + this.btnLoadPreset.UseVisualStyleBackColor = false; + this.btnLoadPreset.Click += new System.EventHandler(this.btnLoadPreset_Click); + // + // lsbPresets + // + this.lsbPresets.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.lsbPresets.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.lsbPresets.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F); + this.lsbPresets.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(252)))), ((int)(((byte)(252)))), ((int)(((byte)(252))))); + this.lsbPresets.FormattingEnabled = true; + this.lsbPresets.ItemHeight = 23; + this.lsbPresets.Location = new System.Drawing.Point(10, 23); + this.lsbPresets.Name = "lsbPresets"; + this.lsbPresets.Size = new System.Drawing.Size(243, 138); + this.lsbPresets.TabIndex = 8; + this.lsbPresets.SelectedIndexChanged += new System.EventHandler(this.lsbPresets_SelectedIndexChanged); + // + // tbxPresetName + // + this.tbxPresetName.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.tbxPresetName.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.tbxPresetName.Font = new System.Drawing.Font("Microsoft YaHei UI", 11F); + this.tbxPresetName.ForeColor = System.Drawing.Color.White; + this.tbxPresetName.Location = new System.Drawing.Point(10, 303); + this.tbxPresetName.Name = "tbxPresetName"; + this.tbxPresetName.Size = new System.Drawing.Size(243, 24); + this.tbxPresetName.TabIndex = 7; + // + // btnSavePreset + // + this.btnSavePreset.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.btnSavePreset.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnSavePreset.ForeColor = System.Drawing.Color.White; + this.btnSavePreset.Location = new System.Drawing.Point(10, 259); + this.btnSavePreset.Name = "btnSavePreset"; + this.btnSavePreset.Size = new System.Drawing.Size(243, 40); + this.btnSavePreset.TabIndex = 7; + this.btnSavePreset.Text = "Save current preset"; + this.btnSavePreset.UseVisualStyleBackColor = false; + this.btnSavePreset.Click += new System.EventHandler(this.btnSavePreset_Click); + // + // gpbxPresets + // + this.gpbxPresets.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.gpbxPresets.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(79)))), ((int)(((byte)(79)))), ((int)(((byte)(79))))); + this.gpbxPresets.Controls.Add(this.btnSavePreset); + this.gpbxPresets.Controls.Add(this.btnDeletePreset); + this.gpbxPresets.Controls.Add(this.tbxPresetName); + this.gpbxPresets.Controls.Add(this.btnLoadPreset); + this.gpbxPresets.Controls.Add(this.lsbPresets); + this.gpbxPresets.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.gpbxPresets.Font = new System.Drawing.Font("Microsoft YaHei UI", 10F); + this.gpbxPresets.ForeColor = System.Drawing.Color.White; + this.gpbxPresets.Location = new System.Drawing.Point(995, 348); + this.gpbxPresets.Name = "gpbxPresets"; + this.gpbxPresets.Padding = new System.Windows.Forms.Padding(0); + this.gpbxPresets.Size = new System.Drawing.Size(259, 333); + this.gpbxPresets.TabIndex = 6; + this.gpbxPresets.TabStop = false; + this.gpbxPresets.Text = "Presets"; + this.gpbxPresets.Paint += new System.Windows.Forms.PaintEventHandler(this.removeBorders); + // + // btnDeletePreset + // + this.btnDeletePreset.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.btnDeletePreset.FlatStyle = System.Windows.Forms.FlatStyle.Popup; + this.btnDeletePreset.ForeColor = System.Drawing.Color.White; + this.btnDeletePreset.Location = new System.Drawing.Point(10, 167); + this.btnDeletePreset.Name = "btnDeletePreset"; + this.btnDeletePreset.Size = new System.Drawing.Size(243, 40); + this.btnDeletePreset.TabIndex = 11; + this.btnDeletePreset.Text = "Delete the preset"; + this.btnDeletePreset.UseVisualStyleBackColor = false; + this.btnDeletePreset.Click += new System.EventHandler(this.btnDeletePreset_Click); + // + // Settings + // + this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 19F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(51)))), ((int)(((byte)(51)))), ((int)(((byte)(51))))); + this.ClientSize = new System.Drawing.Size(1266, 788); + this.Controls.Add(this.gpbxPresets); + this.Controls.Add(this.gpbxWindowPreview); + this.Controls.Add(this.gpbxPreview); + this.Controls.Add(this.gpbxDriverList); + this.Controls.Add(this.label1); + this.Controls.Add(this.gpbxRaceSettings); + this.Font = new System.Drawing.Font("Microsoft YaHei UI", 7.8F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4); + this.MinimumSize = new System.Drawing.Size(1284, 835); + this.Name = "Settings"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "Settings"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.Settings_FormClosing); + this.Resize += new System.EventHandler(this.Settings_Resize); + this.gpbxRaceSettings.ResumeLayout(false); + this.gpbxRaceSettings.PerformLayout(); + this.gpbxDriverList.ResumeLayout(false); + this.gpbxDriverList.PerformLayout(); + this.gpbxPreview.ResumeLayout(false); + this.gpbxPreview.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pbxPreview)).EndInit(); + this.gpbxWindowPreview.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)(this.pbxWindowPreview)).EndInit(); + this.gpbxPresets.ResumeLayout(false); + this.gpbxPresets.PerformLayout(); + this.ResumeLayout(false); + this.PerformLayout(); + + } + + #endregion + + private System.Windows.Forms.Label label1; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.GroupBox gpbxRaceSettings; + private System.Windows.Forms.TextBox tbxGpUrl; + private System.Windows.Forms.GroupBox gpbxDriverList; + private System.Windows.Forms.ListBox lsbDrivers; + private System.Windows.Forms.Button btnRemoveDriver; + private System.Windows.Forms.Button btnAddDriver; + private System.Windows.Forms.TextBox tbxDriverName; + private System.Windows.Forms.GroupBox gpbxPreview; + private System.Windows.Forms.PictureBox pbxPreview; + private System.Windows.Forms.GroupBox gpbxWindowPreview; + private System.Windows.Forms.PictureBox pbxWindowPreview; + private System.Windows.Forms.Button btnCreateWindow; + private System.Windows.Forms.Button btnCreatZone; + private System.Windows.Forms.ListBox lsbPresets; + private System.Windows.Forms.TextBox tbxPresetName; + private System.Windows.Forms.Button btnSavePreset; + private System.Windows.Forms.Label lblWindowsRemaining; + private System.Windows.Forms.Label lblZonePointsRemaning; + private System.Windows.Forms.Label lblWindowPointsRemaining; + private System.Windows.Forms.Button btnRefresh; + private System.Windows.Forms.Button btnResetDriver; + private System.Windows.Forms.Button btnLoadPreset; + private System.Windows.Forms.GroupBox gpbxPresets; + private System.Windows.Forms.Button btnDeletePreset; + private System.Windows.Forms.ToolTip tip1; + } +} +``` diff --git a/temp_annexes/Code/Settings.md b/temp_annexes/Code/Settings.md new file mode 100644 index 0000000..b1f14e5 --- /dev/null +++ b/temp_annexes/Code/Settings.md @@ -0,0 +1,482 @@ +# Settings.cs + +``` cs +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using System.IO; +using TrackTrends; + +namespace TrackTrends +{ + public partial class Settings : Form + { + private string _grandPrixUrl = ""; + private string _selectedConfigFile; + private List _driverList = new List(); + + private F1TVEmulator Emulator = null; + private ConfigurationTool Config = null; + + private bool CreatingZone = false; + private Point ZoneP1; + private Point ZoneP2; + + private bool CreatingWindow = false; + private Point WindowP1; + private Point WindowP2; + + List WindowsToAdd = new List(); + + public string GrandPrixUrl { get => _grandPrixUrl; private set => _grandPrixUrl = value; } + public List DriverList { get => _driverList; private set => _driverList = value; } + public string SelectedConfigFile { get => _selectedConfigFile; private set => _selectedConfigFile = value; } + + //For the responsive content + Size oldSize = new Size(); + Size oldGpbxPreviewSize = new Size(); + Size oldGpbxWindowPreviewSize = new Size(); + + Size oldPbxPreviewSize = new Size(); + Size oldPbxWindowPreviewSize = new Size(); + + public Settings() + { + InitializeComponent(); + Load(); + } + private void Load() + { + RefreshUI(); + oldSize = this.Size; + oldGpbxPreviewSize = gpbxPreview.Size; + oldGpbxWindowPreviewSize = gpbxWindowPreview.Size; + oldPbxPreviewSize = pbxPreview.Size; + oldPbxWindowPreviewSize = pbxWindowPreview.Size; + + tip1.SetToolTip(btnCreatZone, "After clicking you can select two points in the image to set the bounds of the important data"); + tip1.SetToolTip(btnCreateWindow, "After clicking this you will have to select all the windows that are important on the lower image. Refer to the documentation for more infos"); + tip1.SetToolTip(btnRefresh, "Starts the emulator or refreshes the images if its already running"); + tip1.SetToolTip(btnResetDriver, "Resets the driver if something went wrong or if you want to test an other URL"); + tip1.SetToolTip(lsbDrivers, "The drivers that are on the image. Non-Case sensitive"); + tip1.SetToolTip(tbxPresetName, "The name of the preset you want to save"); + tip1.SetToolTip(pbxPreview, "What the emulator returns"); + tip1.SetToolTip(pbxWindowPreview, "One of the driver zones that the program managed to slice from the main zone"); + } + private void RefreshUI() + { + lsbDrivers.DataSource = null; + lsbDrivers.DataSource = DriverList; + + if (Directory.Exists(ConfigurationTool.CONFIGS_FOLDER_NAME)) + { + lsbPresets.DataSource = null; + lsbPresets.DataSource = Directory.GetFiles(ConfigurationTool.CONFIGS_FOLDER_NAME); + } + if (CreatingZone) + { + if (ZoneP1 == new Point(-1, -1)) + { + lblZonePointsRemaning.Text = "2 points Remaining"; + } + else + { + lblZonePointsRemaning.Text = "1 point Remaining"; + } + } + else + { + lblZonePointsRemaning.Text = ""; + } + + if (CreatingWindow) + { + if (WindowP1 == new Point(-1, -1)) + { + lblWindowPointsRemaining.Text = "2 points Remaining"; + } + else + { + lblWindowPointsRemaining.Text = "1 point Remaining"; + } + lblWindowPointsRemaining.Text = ConfigurationTool.NUMBER_OF_ZONES - WindowsToAdd.Count() + " Windows remaining"; + } + else + { + lblWindowPointsRemaining.Text = ""; + lblWindowsRemaining.Text = ""; + } + if (Config != null) + { + pbxPreview.Image = Config.MainZone.Draw(); + if (Config.MainZone.Zones.Count > 0) + pbxWindowPreview.Image = Config.MainZone.Zones[0].Draw(); + } + } + private void CreateNewZone(Point p1, Point p2) + { + Rectangle dimensions = CreateAbsoluteRectangle(p1, p2); + Config = new ConfigurationTool((Bitmap)pbxPreview.Image, dimensions); + RefreshUI(); + } + private void CreateWindows(List dimensions) + { + if (Config != null) + { + Config.AddWindows(dimensions); + } + } + private void tbxGpUrl_TextChanged(object sender, EventArgs e) + { + GrandPrixUrl = tbxGpUrl.Text; + } + + private void btnAddDriver_Click(object sender, EventArgs e) + { + string newDriver = tbxDriverName.Text; + DriverList.Add(newDriver); + tbxDriverName.Text = ""; + RefreshUI(); + } + + private void btnRemoveDriver_Click(object sender, EventArgs e) + { + if (lsbDrivers.SelectedIndex >= 0) + { + DriverList.RemoveAt(lsbDrivers.SelectedIndex); + } + RefreshUI(); + } + private void SwitchZoneCreation() + { + if (CreatingZone) + { + CreatingZone = false; + lblZonePointsRemaning.Text = ""; + } + else + { + CreatingZone = true; + + if (Config != null) + Config.ResetMainZone(); + + if (CreatingWindow) + SwitchWindowCreation(); + + if (Emulator != null && Emulator.Ready) + { + Config = null; + pbxPreview.Image = Emulator.Screenshot(); + } + + ZoneP1 = new Point(-1, -1); + ZoneP2 = new Point(-1, -1); + + lblZonePointsRemaning.Text = "2 Points left"; + } + RefreshUI(); + } + private void SwitchWindowCreation() + { + if (CreatingWindow) + { + CreatingWindow = false; + } + else + { + CreatingWindow = true; + + if (Config != null) + Config.ResetWindows(); + + if (CreatingZone) + SwitchZoneCreation(); + + WindowP1 = new Point(-1, -1); + WindowP2 = new Point(-1, -1); + + WindowsToAdd = new List(); + } + RefreshUI(); + } + private void btnCreatZone_Click(object sender, EventArgs e) + { + SwitchZoneCreation(); + } + private void btnCreateWindow_Click(object sender, EventArgs e) + { + SwitchWindowCreation(); + } + private void pbxMain_MouseClick(object sender, MouseEventArgs e) + { + if (CreatingZone && pbxPreview.Image != null) + { + //Point coordinates = pbxMain.PointToClient(new Point(MousePosition.X, MousePosition.Y)); + Point coordinates = e.Location; + float xOffset = (float)pbxPreview.Image.Width / (float)pbxPreview.Width; + float yOffset = (float)pbxPreview.Image.Height / (float)pbxPreview.Height; + Point newPoint = new Point(Convert.ToInt32((float)coordinates.X * xOffset), Convert.ToInt32((float)coordinates.Y * yOffset)); + + //MessageBox.Show("Coordinates" + Environment.NewLine + "Old : " + coordinates.ToString() + Environment.NewLine + "New : " + newPoint.ToString()); + + if (ZoneP1 == new Point(-1, -1)) + { + ZoneP1 = newPoint; + } + else + { + ZoneP2 = newPoint; + CreateNewZone(ZoneP1, ZoneP2); + SwitchZoneCreation(); + } + RefreshUI(); + } + } + private void pbxMain_Click(object sender, EventArgs e) + { + //Not the right one to use visibly + } + private void pbxDriverZone_MouseClick(object sender, MouseEventArgs e) + { + if (CreatingWindow && pbxWindowPreview.Image != null) + { + Point coordinates = e.Location; + + float xOffset = (float)pbxWindowPreview.Image.Width / (float)pbxWindowPreview.Width; + float yOffset = (float)pbxWindowPreview.Image.Height / (float)pbxWindowPreview.Height; + + Point newPoint = new Point(Convert.ToInt32((float)coordinates.X * xOffset), Convert.ToInt32((float)coordinates.Y * yOffset)); + + if (WindowP1 == new Point(-1, -1)) + { + WindowP1 = newPoint; + } + else + { + WindowP2 = newPoint; + WindowsToAdd.Add(CreateAbsoluteRectangle(WindowP1, WindowP2)); + + if (WindowsToAdd.Count < ConfigurationTool.NUMBER_OF_ZONES) + { + WindowP1 = new Point(-1, -1); + WindowP2 = new Point(-1, -1); + } + else + { + WindowP1 = new Point(WindowP1.X, 0); + WindowP2 = new Point(WindowP2.X, pbxWindowPreview.Image.Height); + CreateWindows(WindowsToAdd); + SwitchWindowCreation(); + } + } + RefreshUI(); + } + } + private void pbxDriverZone_Click(object sender, EventArgs e) + { + //Not the right one to use visibly + } + private Rectangle CreateAbsoluteRectangle(Point p1, Point p2) + { + Point newP1 = new Point(); + Point newP2 = new Point(); + + if (p1.X < p2.X) + { + newP1.X = p1.X; + newP2.X = p2.X; + } + else + { + newP1.X = p2.X; + newP2.X = p1.X; + } + + if (p1.Y < p2.Y) + { + newP1.Y = p1.Y; + newP2.Y = p2.Y; + } + else + { + newP1.Y = p2.Y; + newP2.Y = p1.Y; + } + return new Rectangle(newP1.X, newP1.Y, newP2.X - newP1.X, newP2.Y - newP1.Y); + } + + private async void btnRefresh_Click(object sender, EventArgs e) + { + btnRefresh.Enabled = false; + btnCreatZone.Enabled = false; + btnCreateWindow.Enabled = false; + btnResetDriver.Enabled = false; + if (Emulator == null || Emulator.GrandPrixUrl != tbxGpUrl.Text) + { + Emulator = new F1TVEmulator(tbxGpUrl.Text); + } + + if (!Emulator.Ready) + { + Task start = Task.Run(() => Emulator.Start()); + int errorCode = await start; + if (errorCode != 0) + { + string message; + switch (errorCode) + { + case 100: + message = "Error " + errorCode + " Could not recover cookies. It could be because of an improper installation of python or bad cookies in the chrome database. Please try to log on to the F1TV using chrome again"; + break; + case 101: + message = "Error " + errorCode + " Could not start the driver. It could be because an other instance is runnin make sure you closed them all before trying again"; + break; + case 102: + message = "Error " + errorCode + " Could not navigate on the F1TV site. Make sure the correct URL has been given and that you logged from chrome. It can take a few minutes to update"; + break; + case 103: + message = "Error " + errorCode + " The url is not a valid url"; + break; + case 104: + message = "Error " + errorCode + " The url is not a valid url"; + break; + case 105: + message = "Error " + errorCode + " There has been an error trying to emulate button presses. Please try again"; + break; + case 106: + message = "Error " + errorCode + " There has been an error trying to emulate button presses. Please try again"; + break; + default: + message = "Could not start the emulator Error " + errorCode; + break; + } + MessageBox.Show(message); + } + else + { + pbxPreview.Image = Emulator.Screenshot(); + } + } + else + { + pbxPreview.Image = Emulator.Screenshot(); + } + btnRefresh.Enabled = true; + btnCreatZone.Enabled = true; + btnCreateWindow.Enabled = true; + btnResetDriver.Enabled = true; + btnRefresh.Text = "Get a newer image"; + } + + private void Settings_FormClosing(object sender, FormClosingEventArgs e) + { + if (Emulator != null) + { + Emulator.Stop(); + } + Emulator = null; + GC.Collect(); + } + + private void btnResetDriver_Click(object sender, EventArgs e) + { + if (Emulator != null) + { + Emulator.ResetDriver(); + } + } + + private void btnSavePreset_Click(object sender, EventArgs e) + { + string presetName = tbxPresetName.Text; + if (Config != null) + { + Config.SaveToJson(DriverList, presetName); + } + RefreshUI(); + } + + private void lsbPresets_SelectedIndexChanged(object sender, EventArgs e) + { + SelectedConfigFile = (string)lsbPresets.Items[lsbPresets.SelectedIndex]; + } + + private void btnLoadPreset_Click(object sender, EventArgs e) + { + //MessageBox.Show(lsbPresets.SelectedIndex.ToString()); + if (lsbPresets.SelectedIndex >= 0 && pbxPreview.Image != null) + { + try + { + string fileName = lsbPresets.Items[lsbPresets.SelectedIndex].ToString(); + Reader reader = new Reader(fileName, (Bitmap)pbxPreview.Image, false); + //MainZones #0 is the big main zone containing driver zones + Config = new ConfigurationTool((Bitmap)pbxPreview.Image, reader.MainZones[0].Bounds); + Config.MainZone = reader.MainZones[0]; + DriverList = reader.Drivers; + SelectedConfigFile = fileName; + } + catch (Exception ex) + { + MessageBox.Show("Could not load the settings error :" + ex); + } + RefreshUI(); + } + } + + private void Settings_Resize(object sender, EventArgs e) + { + int xDiff = this.Width - oldSize.Width; + int yDiff = this.Height - oldSize.Height; + + gpbxPreview.Size = new Size(oldGpbxPreviewSize.Width + xDiff, oldGpbxPreviewSize.Height + yDiff); + gpbxWindowPreview.Size = new Size(oldGpbxWindowPreviewSize.Width + xDiff, oldGpbxWindowPreviewSize.Height); + pbxPreview.Size = new Size(oldPbxPreviewSize.Width + xDiff, oldPbxPreviewSize.Height + yDiff); + pbxWindowPreview.Size = new Size(oldPbxWindowPreviewSize.Width + xDiff, oldPbxWindowPreviewSize.Height); + } + + private void btnDeletePreset_Click(object sender, EventArgs e) + { + int selectedIndex = lsbPresets.SelectedIndex; + if (selectedIndex >= 0) + { + string fileName = lsbPresets.Items[selectedIndex].ToString(); + if (File.Exists(fileName)) + { + File.Delete(fileName); + RefreshUI(); + } + else + { + MessageBox.Show("Could not delete the preset because it does not exists"); + } + } + } + + private void removeBorders(object sender, PaintEventArgs e) + { + GroupBox gpbx = (GroupBox)sender; + + using (Pen pen = new Pen(gpbx.BackColor, 50)) + { + e.Graphics.DrawRectangle(pen, 0, 0, gpbx.Width - 1, gpbx.Height - 1); + e.Graphics.DrawRectangle(pen, 0, 0, gpbx.Width - 1, gpbx.Height - 1); + } + + using (var brush = new SolidBrush(gpbx.ForeColor)) + { + var textPosition = new Point(5, 0); // Adjust the X and Y values as needed + e.Graphics.DrawString(gpbx.Text, gpbx.Font, brush, textPosition); + } + } + } +} + +``` diff --git a/temp_annexes/Code/SqliteStorage.md b/temp_annexes/Code/SqliteStorage.md new file mode 100644 index 0000000..1d916a4 --- /dev/null +++ b/temp_annexes/Code/SqliteStorage.md @@ -0,0 +1,267 @@ +# SqliteStorage.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : SqliteStorage.cs +/// Brief : Class that controls the sqlite database +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Data.SQLite; +using System.IO; +using System.Windows.Forms; + +namespace TrackTrends +{ + public class SqliteStorage + { + private const string DATABASE_FOLDER = "./Data"; + private const string DATABASE_FILE = "/database.sqlite"; + private const string CONNECTION_STRING = "Data Source=" + DATABASE_FOLDER + DATABASE_FILE + ";Version=3;"; + + private SQLiteConnection Connection; + /// + /// Creates a new Sqlite Storage and initialize the database + /// + public SqliteStorage() + { + Load(); + } + /// + /// Loads a fresh new Database or create a new one if it does not exist. + /// + private void Load() + { + if (!Directory.Exists(DATABASE_FOLDER)) + Directory.CreateDirectory(DATABASE_FOLDER); + + if (!File.Exists(DATABASE_FOLDER + DATABASE_FILE)) + { + SQLiteConnection.CreateFile(DATABASE_FOLDER + DATABASE_FILE); + } + else + { + //We are not using the existing DataBase + File.Delete(DATABASE_FOLDER + DATABASE_FILE); + } + + Connection = new SQLiteConnection(CONNECTION_STRING); + Connection.Open(); + + //Create the drivers table + string createDriversTableQuery = @"CREATE TABLE IF NOT EXISTS Drivers + (ID INTEGER PRIMARY KEY AUTOINCREMENT, + Name VARCHAR NOT NULL);"; + using (var command = new SQLiteCommand(createDriversTableQuery, Connection)) + { + command.ExecuteNonQuery(); + } + + //Create the drivers table + string createPitstopTableQuery = @"CREATE TABLE Pitstops + (Lap INTEGER NOT NULL, + DriverID INTEGER NOT NULL, + Tyre VARCHAR, + PRIMARY KEY (Lap,DriverID));"; + using (var command = new SQLiteCommand(createPitstopTableQuery, Connection)) + { + command.ExecuteNonQuery(); + } + + //Create the stats + string createStatsTableQuery = @"CREATE TABLE IF NOT EXISTS Stats + (Lap INTEGER NOT NULL, + DriverID INTEGER NOT NULL, + Tyre VARCHAR NOT NULL, + LapTime INTEGER NOT NULL, + Sector1 INTEGER NOT NULL, + Sector2 INTEGER NOT NULL, + Sector3 INTEGER NOT NULL, + GapToLeader INTEGER NOT NULL, + Position INTEGER NOT NULL, + PRIMARY KEY (Lap, DriverID));"; + using (var command = new SQLiteCommand(createStatsTableQuery, Connection)) + { + command.ExecuteNonQuery(); + } + } + /// + /// Adds a driver into the drivers table. Meant to be used at the start of the programm + /// + /// The name of the driver. (non case sensitive) + public void AddDriver(string name) + { + string insertQuery = "INSERT INTO Drivers (Name) VALUES (@name);"; + + using (var command = new SQLiteCommand(insertQuery,Connection)) + { + command.Parameters.AddWithValue("@Name",name); + + try + { + command.ExecuteNonQuery(); + } + catch + { + //MessageBox.Show("An error has occured while trying to insert a new driver into de Database"); + } + } + } + /// + /// Searches for a driver and returns its id if it has been found + /// + /// Name of the driver (non case sensitive) + /// + private int GetDriverID(string name) + { + string selectQuery = "SELECT ID FROM Drivers where Name LIKE @driverName"; + int result = 0; + using (var command = new SQLiteCommand(selectQuery,Connection)) + { + command.Parameters.AddWithValue("@driverName",name); + try + { + using (var reader = command.ExecuteReader()) + { + while (reader.Read()) + { + result = reader.GetInt32(0); + } + } + } + catch + { + //MessageBox.Show("There has been an error while trying to retrieve the ID of a Driver from the database"); + } + } + return result; + } + /// + /// Gets the sectors from a lapTime. Sectors are subdivisions of a laptime (could be usefull to validate one or the other) + /// + /// The name of the driver who has done the lap + /// The lap at wich the driver has done the time + /// A list of the different sectors time in int (ms) + public List GetSectorsFromLapTime(string driverName,int lap) + { + int driverId = GetDriverID(driverName); + string selectQuery = "SELECT Sector1,Sector2,Sector3 FROM Stats WHERE DriverID = @driverID AND Lap = @lap"; + List result = new List(); + using (var command = new SQLiteCommand(selectQuery, Connection)) + { + command.Parameters.AddWithValue("@driverID", driverId); + command.Parameters.AddWithValue("@lap", lap); + try + { + SQLiteDataReader reader = command.ExecuteReader(); + while (reader.Read()) + { + result.Add(reader.GetInt32(0)); + result.Add(reader.GetInt32(1)); + result.Add(reader.GetInt32(2)); + } + } + catch + { + //MessageBox.Show("There has been an error while trying to retrieve the ID of a Driver from the database"); + } + } + return result; + } + /// + /// Get the laptime history of a driver + /// + /// The name of the driver + /// The number of lapTimes you want + /// A list of tuples with the lap and the laptime. It will only return the amount it found so even if you ask 5 expect getting less or even 0 + public List<(int LapTime, int Lap)> GetDriverLaptimes(string driverName,int numberOfLaptimes) + { + int driverId = GetDriverID(driverName); + List<(int LapTime, int Lap)> lapData = new List<(int LapTime, int Lap)>(); + string selectQuery = "Select LapTime,Lap from Stats WHERE DriverID = @driverID ORDER BY Lap DESC LIMIT @limit"; + using (var command = new SQLiteCommand(selectQuery, Connection)) + { + command.Parameters.AddWithValue("@driverID", driverId); + command.Parameters.AddWithValue("@limit", numberOfLaptimes); + try + { + SQLiteDataReader reader = command.ExecuteReader(); + while (reader.Read()) + { + int lapTime = reader.GetInt32(0); + int lap = reader.GetInt32(1); + lapData.Add((lapTime, lap)); + } + } + catch + { + //MessageBox.Show("There has been an error while trying to retrieve the ID of a Driver from the database"); + } + } + return lapData; + } + /// + /// Add a pitstop into the db + /// + /// The name of the driver who made his pitstop + /// The lap where he stopped + /// The tyre he took out + public void AddPitstop(string driverName,int lap,string tyre) + { + string insertQuery = "INSERT INTO Pitstops (Lap,DriverID,Tyre) VALUES (@Lap,@DriverID,@Tyre)"; + + using (var command = new SQLiteCommand(insertQuery,Connection)) + { + command.Parameters.AddWithValue("@Lap",lap); + command.Parameters.AddWithValue("@DriverID",GetDriverID(driverName)); + command.Parameters.AddWithValue("@Tyre",tyre); + try + { + command.ExecuteNonQuery(); + } + catch + { + //MessageBox.Show("An error has occured while trying to insert a new pitstop into the DB" + Environment.NewLine + "Request :"+ command.ToString()); + } + } + } + /// + /// Adds drivers info into the DB (it should only be once per lap) + /// + /// The Driver data + /// The lap from wich the datas are from + public void AddDriverStat(DriverData data,int lap) + { + string insertQuery = "INSERT INTO Stats (Lap,DriverID,Tyre,LapTime,Sector1,Sector2,Sector3,GapToLeader,Position) VALUES (@Lap,@DriverID,@Tyre,@LapTime,@Sector1,@Sector2,@Sector3,@GapToLeader,@Position);"; + + using (var command = new SQLiteCommand(insertQuery,Connection)) + { + command.Parameters.AddWithValue("@Lap",lap); + command.Parameters.AddWithValue("@DriverID",GetDriverID(data.Name)); + command.Parameters.AddWithValue("@Tyre",data.CurrentTyre.Coumpound.ToString()); + command.Parameters.AddWithValue("@LapTime",data.LapTime); + command.Parameters.AddWithValue("@Sector1",data.Sector1); + command.Parameters.AddWithValue("@Sector2", data.Sector2); + command.Parameters.AddWithValue("@Sector3", data.Sector3); + command.Parameters.AddWithValue("@GapToLeader", data.GapToLeader); + command.Parameters.AddWithValue("@Position", data.Position); + + try + { + command.ExecuteNonQuery(); + } + catch + { + //MessageBox.Show("An error has occured while trying to insert infos about a driver"); + } + } + } + } +} + +``` diff --git a/temp_annexes/Code/Window.md b/temp_annexes/Code/Window.md new file mode 100644 index 0000000..643b085 --- /dev/null +++ b/temp_annexes/Code/Window.md @@ -0,0 +1,681 @@ +# Window.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : Window.cs +/// Brief : Default Window object that is mainly expected to be inherited. +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Drawing; +using System.IO; +using Tesseract; +using System.Text.RegularExpressions; +using System.Drawing.Drawing2D; + +namespace TrackTrends +{ + public class Window + { + public const string STRING_DEBUG_FOLDER = "./GetString"; + public const string LAPTIME_DEBUG_FOLDER = "./LapTime"; + public const string GAPTOLEADER_DEBUG_FOLDER = "./Gap"; + public const string SECTOR1_DEBUG_FOLDER = "./Sector1"; + public const string SECTOR2_DEBUG_FOLDER = "./Sector2"; + public const string SECTOR3_DEBUG_FOLDER = "./Sector3"; + public const string DRS_DEBUG_FOLDER = "./DRS"; + public const string TYRE_DEBUG_FOLDER = "./Tyre"; + + private Rectangle _bounds; + private Bitmap _image; + private string _name; + protected TesseractEngine Engine; + public Rectangle Bounds { get => _bounds; private set => _bounds = value; } + public Bitmap Image { get => _image; set => _image = value; } + public string Name { get => _name; protected set => _name = value; } + //This will have to be changed if you want to make it run on your machine + public static DirectoryInfo TESS_DATA_FOLDER = new DirectoryInfo(@"C:\Users\Moi\Pictures\SeleniumScreens\TessData"); + //Debug + public static Random rnd = new Random(); + + public Bitmap WindowImage + { + get + { + //This little trickery lets you have the image that the window sees + Bitmap sample = new Bitmap(Bounds.Width, Bounds.Height); + Graphics g = Graphics.FromImage(sample); + g.DrawImage(Image, new Rectangle(0, 0, sample.Width, sample.Height), Bounds, GraphicsUnit.Pixel); + return sample; + } + } + /// + /// Creates a new Window + /// + /// The image of the parent zone + /// The position and size of the window + /// Does the window need to generate a tesseract engine (takes time and ressources) + public Window(Bitmap image, Rectangle bounds, bool generateEngine = true) + { + Image = image; + Bounds = bounds; + if (generateEngine) + { + Engine = new TesseractEngine(TESS_DATA_FOLDER.FullName, "eng", EngineMode.Default); + Engine.DefaultPageSegMode = PageSegMode.SingleLine; + } + + //DEBUG + /* + if (!Directory.Exists(STRING_DEBUG_FOLDER)) + Directory.CreateDirectory(STRING_DEBUG_FOLDER); + if (!Directory.Exists(LAPTIME_DEBUG_FOLDER)) + Directory.CreateDirectory(LAPTIME_DEBUG_FOLDER); + if (!Directory.Exists(GAPTOLEADER_DEBUG_FOLDER)) + Directory.CreateDirectory(GAPTOLEADER_DEBUG_FOLDER); + if (!Directory.Exists(SECTOR1_DEBUG_FOLDER)) + Directory.CreateDirectory(SECTOR1_DEBUG_FOLDER); + if (!Directory.Exists(SECTOR2_DEBUG_FOLDER)) + Directory.CreateDirectory(SECTOR2_DEBUG_FOLDER); + if (!Directory.Exists(SECTOR3_DEBUG_FOLDER)) + Directory.CreateDirectory(SECTOR3_DEBUG_FOLDER); + if (!Directory.Exists(DRS_DEBUG_FOLDER)) + Directory.CreateDirectory(DRS_DEBUG_FOLDER); + if (!Directory.Exists(TYRE_DEBUG_FOLDER)) + Directory.CreateDirectory(TYRE_DEBUG_FOLDER); + */ + } + /// + /// Method that will have to be used by the childrens to let the model make them decode the images they have + /// + /// Returns an object because we dont know what kind of return it will be + public virtual Object DecodePng() + { + return "NaN"; + } + /// + /// Method that will have to be used by the childrens to let the model make them decode the images they have + /// + /// This is a list of the different possible drivers in the race. It should not be too big but NEVER be too short + /// Returns an object because we dont know what kind of return it will be + public virtual Object DecodePng(List driverList) + { + return "NaN"; + } + /// + /// This converts an image into a byte[]. It can be usefull when doing unsafe stuff. Use at your own risks + /// + /// The image you want to convert + /// A byte array containing the image informations + public static byte[] ImageToByte(Image inputImage) + { + using (var stream = new MemoryStream()) + { + inputImage.Save(stream, System.Drawing.Imaging.ImageFormat.Png); + return stream.ToArray(); + } + } + /// + /// This method is used to recover a time from a PNG using Tesseract OCR + /// + /// The image where the text is + /// The type of window it is + /// The Tesseract Engine + /// The time in milliseconds + public static int GetTimeFromPng(Bitmap image, OcrImage.WindowType windowType, TesseractEngine Engine) + { + //Kind of a big method but it has a lot of error handling and has to work with three special cases + string rawResult = ""; + int result = 0; + + //Debug + int salt = rnd.Next(0, 999999); + + switch (windowType) + { + case OcrImage.WindowType.Sector: + //The usual sector is in this form : 33.456 + Engine.SetVariable("tessedit_char_whitelist", "0123456789."); + break; + case OcrImage.WindowType.LapTime: + //The usual Lap time is in this form : 1:45:345 + Engine.SetVariable("tessedit_char_whitelist", "0123456789.:"); + break; + case OcrImage.WindowType.Gap: + //The usual Gap is in this form : + 34.567 + Engine.SetVariable("tessedit_char_whitelist", "0123456789.+"); + break; + default: + Engine.SetVariable("tessedit_char_whitelist", ""); + break; + } + + + Bitmap enhancedImage = new OcrImage(image).Enhance(windowType); + + var tessImage = Pix.LoadFromMemory(ImageToByte(enhancedImage)); + + Page page = Engine.Process(tessImage); + Graphics g = Graphics.FromImage(enhancedImage); + // Get the iterator for the page layout + using (var iter = page.GetIterator()) + { + // Loop over the elements of the page layout + iter.Begin(); + do + { + // Get the text for the current element + try + { + rawResult += iter.GetText(PageIteratorLevel.Word); + } + catch + { + //nothing we just dont add it if its not a number + } + } while (iter.Next(PageIteratorLevel.Word)); + } + + List rawNumbers; + + //In the gaps we can find '+' but we dont care about it its redondant a driver will never be - something + if (windowType == OcrImage.WindowType.Gap) + rawResult = Regex.Replace(rawResult, "[^0-9.:]", ""); + + //Splits into minuts seconds miliseconds + rawNumbers = rawResult.Split('.', ':').ToList(); + //removes any empty cells (tho this usually sign of a really bad OCR implementation tbh will have to be fixed higher in the chian) + rawNumbers.RemoveAll(x => ((string)x) == ""); + + int minuts = 0; + int seconds = 0; + int miliseconds = 0; + switch (windowType) + { + case OcrImage.WindowType.Sector: + //Usually there is supposed to be only 2 parts. + if (rawNumbers.Count == 2) + { + //The perect case + try + { + seconds = Convert.ToInt32(rawNumbers[0].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[1].ToString()); + } + catch + { + Console.WriteLine("Sector time convertion failed"); + } + } + else + { + if (rawNumbers.Count == 1) + { + //Here it is a little harder... Usually its because a '.' has been overlooked or interpreted as a number + + if (rawNumbers[0].Length == 6) + { + //The '.' has been understood as a number + try + { + seconds = Convert.ToInt32(rawNumbers[0][0].ToString() + rawNumbers[0][1].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[0][3].ToString() + rawNumbers[0][4].ToString() + rawNumbers[0][5].ToString()); + } + catch + { + Console.WriteLine("Sector time convertion failed"); + } + } + else + { + if (rawNumbers[0].Length == 5) + { + //The '.' has been overlooked + try + { + seconds = Convert.ToInt32(rawNumbers[0][0].ToString() + rawNumbers[0][1].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[0][2].ToString() + rawNumbers[0][3].ToString() + rawNumbers[0][4].ToString()); + } + catch + { + Console.WriteLine("Sector time convertion failed"); + } + } + else + { + Console.WriteLine("Sector time convertion failed"); + } + } + } + else + { + //The OCR detected more than 1 '.' wich is concerning because that means that something went really wrong + Console.WriteLine("Sector time convertion failed"); + } + } + + result = 0; + result += seconds * 1000; + result += miliseconds; + break; + case OcrImage.WindowType.LapTime: + + if (rawNumbers.Count == 3) + { + //The normal way + try + { + minuts = Convert.ToInt32(rawNumbers[0].ToString()); + seconds = Convert.ToInt32(rawNumbers[1].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[2].ToString()); + } + catch + { + Console.WriteLine("Lap time convertion failed"); + } + } + else + { + if (rawNumbers.Count == 2) + { + //Either the ':' or the '.' has been missinterpreted + if (rawNumbers[0].Length > rawNumbers[1].Length) + { + //The ':' has been missinterpreted + if (rawNumbers[0].Length == 3) + { + //It has been forgotten + try + { + minuts = Convert.ToInt32(rawNumbers[0][0].ToString()); + seconds = Convert.ToInt32(rawNumbers[0][1].ToString() + rawNumbers[0][2].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[1]); + } + catch + { + Console.WriteLine("Lap time convertion failed"); + } + + } + else + { + if (rawNumbers[0].Length == 4) + { + //I has been translated into an other number + try + { + minuts = Convert.ToInt32(rawNumbers[0][0].ToString()); + seconds = Convert.ToInt32(rawNumbers[0][2].ToString() + rawNumbers[0][3].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[1]); + } + catch + { + Console.WriteLine("Lap time convertion failed"); + } + } + else + { + //This could happen if the ':' has been missinterpreted with a lap time of over 9 minuts (HIGLY IMPROBABLE) + Console.WriteLine("Lap time convertion failed"); + } + } + } + else + { + //The '.' has been missinterpreted + if (rawNumbers[1].Length == 5) + { + //It has been forgotten + minuts = Convert.ToInt32(rawNumbers[0].ToString()); + seconds = Convert.ToInt32(rawNumbers[1][0].ToString() + rawNumbers[1][1].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[1][2].ToString() + rawNumbers[1][3].ToString() + rawNumbers[1][4].ToString()); + } + else + { + if (rawNumbers[1].Length == 6) + { + try + { + //It has been interpreted as a number + minuts = Convert.ToInt32(rawNumbers[0].ToString()); + seconds = Convert.ToInt32(rawNumbers[1][0].ToString() + rawNumbers[1][1].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[1][3].ToString() + rawNumbers[1][4].ToString() + rawNumbers[1][5].ToString()); + } + catch + { + //It can happen and to be honest I dont know how to fix it + } + } + else + { + Console.WriteLine("Lap time convertion failed"); + } + } + } + } + else + { + if (rawNumbers.Count == 1) + { + //Both the '.' and the ':' have been missinterpreted + if (rawNumbers[0].Length == 6) + { + //The just all have been forgotten + try + { + minuts = Convert.ToInt32(rawNumbers[0][0].ToString()); + seconds = Convert.ToInt32(rawNumbers[0][1].ToString() + rawNumbers[0][2].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[0][3].ToString() + rawNumbers[0][4].ToString() + rawNumbers[0][5].ToString()); + } + catch + { + Console.WriteLine("Lap time convertion failed"); + } + } + else + { + if (rawNumbers[0].Length == 7) + { + //The '.' or ':' have been interpreted as a number (usually the ':') + try + { + minuts = Convert.ToInt32(rawNumbers[0][0].ToString()); + seconds = Convert.ToInt32(rawNumbers[0][2].ToString() + rawNumbers[0][3].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[0][4].ToString() + rawNumbers[0][5].ToString() + rawNumbers[0][6].ToString()); + } + catch + { + Console.WriteLine("Lap time convertion failed"); + } + } + else + { + if (rawNumbers[0].Length == 8) + { + //Both have been interpreted as a number + try + { + minuts = Convert.ToInt32(rawNumbers[0][0].ToString()); + seconds = Convert.ToInt32(rawNumbers[0][2].ToString() + rawNumbers[0][3].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[0][5].ToString() + rawNumbers[0][6].ToString() + rawNumbers[0][7].ToString()); + } + catch + { + Console.WriteLine("Lap time convertion failed"); + } + } + else + { + //I dont know what could have happened + Console.WriteLine("Lap time convertion failed"); + } + } + } + } + else + { + //I dont know what could have happened + Console.WriteLine("Lap time convertion failed"); + } + } + } + + result = 0; + result += minuts * 60 * 1000; + result += seconds * 1000; + result += miliseconds; + break; + case OcrImage.WindowType.Gap: + if (rawNumbers.Count == 2) + { + // This should be the x.xxx or a missed x:xx.xxx + if (rawNumbers[0].Length > 2) + { + //Its a missed x:xx.xxx + if (rawNumbers[0].Length == 3) + { + //It forgot the ":" + try + { + minuts = Convert.ToInt32(rawNumbers[0][0].ToString()); + seconds = Convert.ToInt32(rawNumbers[0][1].ToString() + rawNumbers[0][2].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[1]); + } + catch + { + Console.WriteLine("Gap to leader convertion failed"); + } + } + else + { + //The ":" has been mistaken as a number + if (rawNumbers[0].Length == 4) + { + try + { + minuts = Convert.ToInt32(rawNumbers[0][0].ToString()); + seconds = Convert.ToInt32(rawNumbers[0][2].ToString() + rawNumbers[0][3].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[1]); + } + catch + { + Console.WriteLine("Gap to leader convertion failed"); + } + } + else + { + Console.WriteLine("Gap to leader convertion failed"); + } + } + + } + else + { + //It should be a normal x.xxx or xx.xxx + try + { + seconds = Convert.ToInt32(rawNumbers[0].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[1].ToString()); + } + catch + { + Console.WriteLine("Gap to leader convertion failed"); + } + } + } + else + { + if (rawNumbers.Count == 1) + { + //can be anything depending on the size of the string + if (rawNumbers[0].Length == 4) + { + //We just missed the '.' + try + { + seconds = Convert.ToInt32(rawNumbers[0][0].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[0][1].ToString() + rawNumbers[0][2].ToString() + rawNumbers[0][3].ToString()); + } + catch + { + Console.WriteLine("Gap to leader convertion failed"); + } + } + else + { + if (rawNumbers[0].Length == 5) + { + //We just missed the '.' + try + { + seconds = Convert.ToInt32(rawNumbers[0][0].ToString() + rawNumbers[0][1].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[0][2].ToString() + rawNumbers[0][3].ToString() + rawNumbers[0][4].ToString()); + } + catch + { + Console.WriteLine("Gap to leader convertion failed"); + } + } + //There is just too much possibilities that it would be stupid to try and tell them appart so for now im leaving that as just an error + Console.WriteLine("Gap to leader convertion failed"); + } + } + else + { + if (rawNumbers.Count == 3) + { + // This should be the x:xx.xxx + try + { + //Gaps cant be more than 9 minuts so if there is more than 1 digit it means that the '+' has been understood as an other number + if (rawNumbers[0].Length > 1) + rawNumbers[0] = rawNumbers[0][rawNumbers[0].Length - 1].ToString(); + + minuts = Convert.ToInt32(rawNumbers[0].ToString()); + seconds = Convert.ToInt32(rawNumbers[1].ToString()); + miliseconds = Convert.ToInt32(rawNumbers[2].ToString()); + } + catch + { + Console.WriteLine("Gap to leader convertion failed"); + } + } + } + } + result = 0; + result += minuts * 60 * 1000; + result += seconds * 1000; + result += miliseconds; + break; + default: + try + { + result = Convert.ToInt32(rawNumbers[0].ToString()); + } + catch + { + result = 0; + } + break; + } + + page.Dispose(); + return result; + } + /// + /// Method that recovers strings from an image using Tesseract OCR + /// + /// The image of the window that contains text + /// The Tesseract engine + /// The list of allowed chars + /// The type of window the text is on. Depending on the context the OCR will behave differently + /// the string it found + public static string GetStringFromPng(Bitmap image, TesseractEngine Engine, string allowedChars = "", OcrImage.WindowType windowType = OcrImage.WindowType.Text) + { + string result = ""; + + //Debug + int salt = rnd.Next(0, 999999); + + Engine.SetVariable("tessedit_char_whitelist", allowedChars); + + Bitmap rawData = image; + Bitmap enhancedImage = new OcrImage(rawData).Enhance(windowType); + + Page page = Engine.Process(enhancedImage); + using (var iter = page.GetIterator()) + { + iter.Begin(); + do + { + result += iter.GetText(PageIteratorLevel.Word); + } while (iter.Next(PageIteratorLevel.Word)); + } + page.Dispose(); + return result; + } + /// + /// Get a smaller image from a bigger one + /// + /// The big bitmap you want to get a part of + /// The dimensions of the new bitmap + /// The little bitmap + protected Bitmap GetSmallBitmapFromBigOne(Bitmap inputBitmap, Rectangle newBitmapDimensions) + { + Bitmap sample = new Bitmap(newBitmapDimensions.Width, newBitmapDimensions.Height); + Graphics g = Graphics.FromImage(sample); + g.DrawImage(inputBitmap, new Rectangle(0, 0, sample.Width, sample.Height), newBitmapDimensions, GraphicsUnit.Pixel); + return sample; + } + /// + /// Returns the closest string from a list of options + /// + /// an array of all the possibilities + /// the string you want to compare + /// The closest option + protected static string FindClosestMatch(List options, string testString) + { + var closestMatch = ""; + var closestDistance = int.MaxValue; + + foreach (var item in options) + { + var distance = LevenshteinDistance(item, testString); + if (distance < closestDistance) + { + closestMatch = item; + closestDistance = distance; + } + } + return closestMatch; + } + //This method has been generated with the help of ChatGPT + /// + /// Method that computes a score of distance between two strings + /// + /// The first string (order irrelevant) + /// The second string (order irrelevant) + /// The levenshtein distance + protected static int LevenshteinDistance(string string1, string string2) + { + if (string.IsNullOrEmpty(string1)) + { + return string.IsNullOrEmpty(string2) ? 0 : string2.Length; + } + + if (string.IsNullOrEmpty(string2)) + { + return string.IsNullOrEmpty(string1) ? 0 : string1.Length; + } + + var d = new int[string1.Length + 1, string2.Length + 1]; + for (var i = 0; i <= string1.Length; i++) + { + d[i, 0] = i; + } + + for (var j = 0; j <= string2.Length; j++) + { + d[0, j] = j; + } + + for (var i = 1; i <= string1.Length; i++) + { + for (var j = 1; j <= string2.Length; j++) + { + var cost = (string1[i - 1] == string2[j - 1]) ? 0 : 1; + d[i, j] = Math.Min(Math.Min(d[i - 1, j] + 1, d[i, j - 1] + 1), d[i - 1, j - 1] + cost); + } + } + + return d[string1.Length, string2.Length]; + } + } +} + +``` diff --git a/temp_annexes/Code/Zone.md b/temp_annexes/Code/Zone.md new file mode 100644 index 0000000..e4dc3fc --- /dev/null +++ b/temp_annexes/Code/Zone.md @@ -0,0 +1,190 @@ +# Zone.cs + +``` cs +/// Author : Maxime Rohmer +/// Date : 30/05/2023 +/// File : Zone.cs +/// Brief : Class that contains all the methods and infos for a zone. This is designed to be potentially be inherited. +/// Version : Alpha 1.0 + +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TrackTrends +{ + public class Zone + { + private Rectangle _bounds; + private List _zones; + private List _windows; + private Bitmap _image; + private string _name; + + public Bitmap ZoneImage + { + get + { + //This little trickery lets you have the image that the zone sees + Bitmap sample = new Bitmap(Bounds.Width, Bounds.Height); + Graphics g = Graphics.FromImage(sample); + g.DrawImage(Image, new Rectangle(0, 0, sample.Width, sample.Height), Bounds, GraphicsUnit.Pixel); + return sample; + } + } + public Bitmap Image + { + get { return _image; } + set + { + //It automatically sets the image for the contained windows and zones + _image = value; + foreach (Window w in Windows) + { + w.Image = ZoneImage; + } + foreach (Zone z in Zones) + { + z.Image = Image; + } + } + } + public Rectangle Bounds { get => _bounds; protected set => _bounds = value; } + public List Zones { get => _zones; protected set => _zones = value; } + public List Windows { get => _windows; protected set => _windows = value; } + public string Name { get => _name; protected set => _name = value; } + /// + /// Creates a new Zone + /// + /// Image of the parent zone + /// The position and size of the zone + /// THe name of the zone (usefull for the JSON formatting) + public Zone(Bitmap image, Rectangle bounds, string name) + { + Windows = new List(); + Zones = new List(); + Name = name; + + //You cant set the image in the CTOR because the processing is impossible at first initiation + _image = image; + Bounds = bounds; + } + /// + /// Adds a zone to the list of zones + /// + /// The zone you want to add + public virtual void AddZone(Zone zone) + { + Zones.Add(zone); + } + /// + /// Add a window to the list of windows + /// + /// the window you want to add + public virtual void AddWindow(Window window) + { + Windows.Add(window); + } + /// + /// Calls all the windows to do OCR and to give back the results so we can send them to the model + /// + /// A list of all the driver in the race to help with text recognition + /// A driver data object that contains all the infos about a driver + public virtual DriverData Decode(List driverList) + { + int sectorCount = 0; + DriverData result = new DriverData(); + foreach(Window w in Windows) + { + // A switch would be prettier but I dont think its supported in this C# version + if (w is DriverNameWindow) + result.Name = (string)(w as DriverNameWindow).DecodePng(driverList); + if (w is DriverDrsWindow) + result.DRS = (bool)(w as DriverDrsWindow).DecodePng(); + if (w is DriverGapToLeaderWindow) + result.GapToLeader = (int)(w as DriverGapToLeaderWindow).DecodePng(); + if (w is DriverLapTimeWindow) + result.LapTime = (int)(w as DriverLapTimeWindow).DecodePng(); + if (w is DriverPositionWindow) + result.Position = (int)(w as DriverPositionWindow).DecodePng(); + if (w is DriverSectorWindow) + { + sectorCount++; + if (sectorCount == 1) + result.Sector1 = (int)(w as DriverSectorWindow).DecodePng(); + if (sectorCount == 2) + result.Sector2 = (int)(w as DriverSectorWindow).DecodePng(); + if (sectorCount == 3) + result.Sector3 = (int)(w as DriverSectorWindow).DecodePng(); + } + if (w is DriverTyresWindow) + result.CurrentTyre = (Tyre)(w as DriverTyresWindow).DecodePng(); + } + return result; + } + public virtual Bitmap Draw() + { + Bitmap img; + + //If its the main zone we want to see everything + if (Zones.Count > 0) + { + img = Image; + } + else + { + img = ZoneImage; + } + + Graphics g = Graphics.FromImage(img); + + //If its the main zone we need to visualize the Zone bounds displayed + if (Zones.Count > 0) + g.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(249,194,46)), 5), Bounds); + + foreach (Zone z in Zones) + { + Rectangle newBounds = new Rectangle(z.Bounds.X, z.Bounds.Y + Bounds.Y, z.Bounds.Width, z.Bounds.Height); + g.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(249, 194, 46)), 5), newBounds); + } + foreach (Window w in Windows) + { + g.DrawRectangle(new Pen(new SolidBrush(Color.FromArgb(252, 252, 252)), 5), w.Bounds); + } + return img; + } + public void ResetZones() + { + Zones.Clear(); + } + public void ResetWindows() + { + foreach (Zone z in Zones) + { + z.ResetWindows(); + } + Windows.Clear(); + } + /// + /// Checks if the given Rectangle fits in the current zone + /// + /// The Rectangle you want to check the fittment + /// + protected bool Fits(Rectangle inputRectangle) + { + if (inputRectangle.X + inputRectangle.Width > Bounds.Width || inputRectangle.Y + inputRectangle.Height > Bounds.Height || inputRectangle.X < 0 || inputRectangle.Y < 0) + { + return false; + } + else + { + return true; + } + } + } +} + +``` diff --git a/temp_annexes/Code/recoverCookiesCSV.md b/temp_annexes/Code/recoverCookiesCSV.md new file mode 100644 index 0000000..33341f6 --- /dev/null +++ b/temp_annexes/Code/recoverCookiesCSV.md @@ -0,0 +1,88 @@ +# recoverCookiesCSV.py + +``` py +# Rohmer Maxime +# RecoverCookies.py +# Little script that recovers the cookies stored in the chrome sqlite database and then decrypts them using the key stored in the chrome files +# This script has been created to be used by an other programm or for the data to not be used directly. This is why it stores all the decoded cookies in a csv. (Btw could be smart for the end programm to delete the csv after using it) +# Parts of this cript have been created with the help of ChatGPT + +import os +import json +import base64 +import sqlite3 +import win32crypt +from Cryptodome.Cipher import AES +from pathlib import Path +import csv + +def get_master_key(): + with open( + os.getenv("localappdata") + "\\Google\\Chrome\\User Data\\Local State", "r" + ) as f: + local_state = f.read() + local_state = json.loads(local_state) + master_key = base64.b64decode(local_state["os_crypt"]["encrypted_key"]) + master_key = master_key[5:] # removing DPAPI + master_key = win32crypt.CryptUnprotectData(master_key, None, None, None, 0)[1] + print("MASTER KEY :") + print(master_key) + print(len(master_key)) + return master_key + +def decrypt_payload(cipher, payload): + return cipher.decrypt(payload) + +def generate_cipher(aes_key, iv): + return AES.new(aes_key, AES.MODE_GCM, iv) + +def decrypt_password(buff, master_key): + try: + iv = buff[3:15] + payload = buff[15:] + cipher = generate_cipher(master_key, iv) + decrypted_pass = decrypt_payload(cipher, payload) + decrypted_pass = decrypted_pass[:-16].decode() # remove suffix bytes + return decrypted_pass + except Exception: + # print("Probably saved password from Chrome version older than v80\n") + # print(str(e)) + return "Chrome < 80" + + +master_key = get_master_key() + +cookies_path = Path( + os.getenv("localappdata") + "\\Google\\Chrome\\User Data\\Default\\Network\\Cookies" +) + +if not cookies_path.exists(): + raise ValueError("Cookies file not found") + +with sqlite3.connect(cookies_path) as connection: + connection.row_factory = sqlite3.Row + cursor = connection.cursor() + cursor.execute("SELECT * FROM cookies") + + with open('cookies.csv', 'a', newline='') as csvfile: + fieldnames = ['host_key', 'name', 'value', 'path', 'expires_utc', 'is_secure', 'is_httponly'] + writer = csv.DictWriter(csvfile, fieldnames=fieldnames) + + if csvfile.tell() == 0: + writer.writeheader() + + for row in cursor.fetchall(): + decrypted_value = decrypt_password(row["encrypted_value"], master_key) + writer.writerow({ + 'host_key': row["host_key"], + 'name': row["name"], + 'value': decrypted_value, + 'path': row["path"], + 'expires_utc': row["expires_utc"], + 'is_secure': row["is_secure"], + 'is_httponly': row["is_httponly"] + }) + +print("Finished CSV") + +```

    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 VZs#L#s{PChS4^yoNk*us{{yW(c9{SG literal 0 HcmV?d00001 diff --git a/site/Planning/PlanningEffectif.pdf b/site/Planning/PlanningEffectif.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ff59f187471e59513b79a971dcab7004aba506f9 GIT binary patch literal 62713 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 GTmJ*d_)kRu literal 0 HcmV?d00001 diff --git a/site/Planning/PlanningEffectif.xlsx b/site/Planning/PlanningEffectif.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d90f7edc57f9a05123be0d739e7b55acd7e595de GIT binary patch literal 11714 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 Outils utilisés +