From d658799b20199ce6343e76d4efcdeb14a81d6947 Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Mon, 23 Feb 2015 15:13:14 +0100 Subject: [PATCH] eiger reading master slave top bottom configuration from firmware;not reading from file anymore, serial is hardcoded for each master: also bug changes in gui getting frame from receiver in postprocessing --- slsDetectorSoftware/eigerDetectorServer/Beb.c | 38 +- slsDetectorSoftware/eigerDetectorServer/Beb.h | 6 +- .../eigerDetectorServer/FebControl.c | 159 +++----- .../eigerDetectorServer/FebControl.h | 9 +- .../eigerDetectorServer/FebInterface.c | 2 +- .../eigerDetectorServer/LocalLinkInterface.c | 33 +- .../eigerDetectorServer/LocalLinkInterface.h | 3 +- .../bin/eigerDetectorServer | Bin 237703 -> 237734 bytes .../slsDetectorFunctionList.c | 373 +++++++++--------- .../eigerDetectorServer/xparameters.h | 4 +- .../multiSlsDetector/multiSlsDetector.cpp | 70 ++-- .../slsDetector/slsDetectorUtils.cpp | 16 +- .../slsDetectorAnalysis/postProcessing.cpp | 39 +- .../slsDetectorFunctionList.h | 3 +- .../slsDetectorServer/slsDetectorServer.c | 2 + .../slsDetectorServer_funcs.c | 13 +- 16 files changed, 394 insertions(+), 376 deletions(-) diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.c b/slsDetectorSoftware/eigerDetectorServer/Beb.c index e77a5efc9..71e7a9d00 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.c +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.c @@ -11,7 +11,7 @@ #include #include - +#include #include "xfs_types.h" @@ -89,7 +89,7 @@ void BebInfo_Print(struct BebInfo* bebInfo){ } -void Beb_Beb(int arg1){ +void Beb_Beb(){ Beb_send_ndata = 0; Beb_send_buffer_size = 1026; @@ -137,14 +137,32 @@ void Beb_Beb(int arg1){ Beb_SetByteOrder(); -/* - ll_beb_new_memory = &ll_beb_new_memory_local; - Local_LocalLinkInterface(ll_beb_new_memory); - if(!Local_InitNewMemory(ll_beb_new_memory,XPAR_PLB_LL_NEW_MEMORY, arg1)) - printf("New Memory FAIL\n"); - else - printf("New Memory OK\n"); -*/ +} + + + +void Beb_GetModuleCopnfiguration(int* master, int* top){ + *top = 0; + *master = 0; + //mapping new memory to read master top module configuration + ll_beb_new_memory = &ll_beb_new_memory_local; + Local_LocalLinkInterface(ll_beb_new_memory); + int ret = Local_GetModuleConfiguration(ll_beb_new_memory,XPAR_PLB_GPIO_SYS_BASEADDR, MODULE_CONFIGURATION); + if(!ret) + printf("Module Configuration FAIL\n"); + else{ + printf("Module Configuration OK\n"); + printf("Beb: value =0x%x\n",ret); + if(ret&0xf){ + *top = 1; + // printf("Beb.c: TOP\n\n\n\n"); + }//else printf("Beb.c: BOTTOM\n\n\n\n"); + + if(ret&0x200){ + *master = 1; + // printf("Beb.c: MASTER\n\n\n\n"); + }//else printf("Beb.c: SLAVE\n\n\n\n"); + } } diff --git a/slsDetectorSoftware/eigerDetectorServer/Beb.h b/slsDetectorSoftware/eigerDetectorServer/Beb.h index 86c36b0e5..86a97c9d7 100644 --- a/slsDetectorSoftware/eigerDetectorServer/Beb.h +++ b/slsDetectorSoftware/eigerDetectorServer/Beb.h @@ -40,8 +40,6 @@ struct BebInfo{ - - void Beb_ClearBebInfos(); int Beb_InitBebInfos(); int Beb_ReadSetUpFromFile(char* file_name); @@ -67,9 +65,7 @@ struct BebInfo{ int Beb_SetByteOrder(); - - - void Beb_Beb(int arg1); + void Beb_Beb(); int Beb_SetBebSrcHeaderInfos(unsigned int beb_number, int ten_gig, char* src_mac, char* src_ip, unsigned int src_port); diff --git a/slsDetectorSoftware/eigerDetectorServer/FebControl.c b/slsDetectorSoftware/eigerDetectorServer/FebControl.c index c7cace647..b8b6ff4bd 100644 --- a/slsDetectorSoftware/eigerDetectorServer/FebControl.c +++ b/slsDetectorSoftware/eigerDetectorServer/FebControl.c @@ -53,9 +53,9 @@ unsigned int Feb_Control_trimbit_size; unsigned int* Feb_Control_last_downloaded_trimbits; -int Feb_Control_current_mod; +int Feb_Control_module_number; int Feb_Control_current_index; -int Feb_Control_am_i_master; + void Module_Module(struct Module* mod,unsigned int number, unsigned int address_top){ unsigned int i; @@ -151,124 +151,96 @@ int Feb_Control_IsBottomModule(){ int Feb_Control_GetModuleNumber(){ - return Feb_Control_current_mod; + return Feb_Control_module_number; } void Feb_Control_FebControl(){ - Feb_Control_staticBits=Feb_Control_acquireNReadoutMode=Feb_Control_triggerMode=Feb_Control_externalEnableMode=Feb_Control_subFrameMode=0; - Feb_Control_trimbit_size=263680; Feb_Control_last_downloaded_trimbits = malloc(Feb_Control_trimbit_size * sizeof(int)); - -/* - printf("\nDefault Settings:\n"); - Feb_Control_nimages = 1; - Feb_Control_exposure_time_in_sec = 1; - Feb_Control_exposure_period_in_sec = 0; - Feb_Control_SetTestModeVariable(0); - //SetPhotonEnergyCalibrationParameters(-5.8381e-5,1.838515,5.09948e-7,-4.32390e-11,1.32527e-15); - //SetRateCorrection(0); //deactivate rate correction - Feb_Control_SetDynamicRange(16); - Feb_Control_SetPhotonEnergy(8000); - Feb_Control_SetReadoutMode(0); - Feb_Control_SetReadoutSpeed(0); - Feb_Control_SetTriggerMode(0,1); - Feb_Control_SetExternalEnableMode(0,1); - printf("\n\n"); - - Feb_Control_Init(); -*/ - - - - /* - unsigned int reg_nums[1]; - unsigned int reg_vals[1]; - reg_nums[0]=DAQ_REG_CHIP_CMDS; - reg_vals[0]=(0|Feb_Control_acquireNReadoutMode|Feb_Control_triggerMode|Feb_Control_externalEnableMode|Feb_Control_subFrameMode); - - if(!Feb_Interface_WriteRegisters(Feb_Control_AddressToAll(),1,reg_nums,reg_vals,0,0)){ - printf("Trouble setting them up as slaves\n");; - } - - */ - - + moduleSize = 0; } -void Feb_Control_ClearModules(){ - unsigned int i; - //for(i=0;i /*class LocalLinkInterface: public HardwareIO{ //*/ @@ -35,7 +36,7 @@ struct LocalLinkInterface{ int Local_Test(struct LocalLinkInterface* ll,unsigned int buffer_len, void *buffer); void Local_LocalLinkInterface(struct LocalLinkInterface* ll); - int Local_InitNewMemory (struct LocalLinkInterface* ll,unsigned int addr, int ifg); + int Local_GetModuleConfiguration (struct LocalLinkInterface* ll, u_int32_t baseaddr, u_int32_t offset); /* int FiFoReset(unsigned int numb); diff --git a/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer b/slsDetectorSoftware/eigerDetectorServer/bin/eigerDetectorServer index e1ffbab481310741843a9d6a8bb53c6f48d973e6..5abcad5afe61d8c51b955d9113325843e0c6898c 100755 GIT binary patch delta 47136 zcmb@v4O~@K)<1ssxqyJESLGdq%Zt1y>czKELGi7wZ-t44MS4w4C{!#gEbLxN8*9+e zt!^zeDr@w~W-xWo(xMrfu}KRjd&VX#DlIK6EG;eU{=R#keeON?g3kP(&!5lddiGvx z?X}lld+oK?emTeAz1{QWw|mwkksa%k@Ai+cRMhzOzmN4VRg_r!`rS7N#ahg&`0X{3 zRFnEeGtKb3g@o*_^!wiA2vL-nz6$=#rlbxHhB~VXiD@w4Qo}?(pltlpcDzP*Hm7=^{nxrKd|# zN>7(7N^d<~sVIH)^eRQ^tEa0KB~(vuRFp71U5ol7^vn)LiPY1(6(vef?^Bd$J$(o| z)zeLi(oatxRg^eAeL_*<^>mA(SoHL1MM==pZHkg4(hju#qM{`0hz>>RFVp?~6eUGZ zhbT&_o(@%%G(8=wDCv4SSy2Y)=?p~~sHcZ3N`{`!R+K?{dXl0H)>YAex}prx5&5(- zcu3G%n?n3;dUlBF^_YaO*KSGUK5*QrheUrgoQdj z4KEw>smtYfvOPDqR>>ISN(rU5?gNRL9jGG~y0QBQ{btlSlt5>^5;(-EC?E>WR?Mo^ z{>2HKDRK{WhNPyi&w}aI$19Opc0~d7$x3@nMNPaCTNkgSfn<-)sZ4QZ< zbCqKyuUG@GL0O8+g;IfNMS&A_W;qpql$znD-%hNcH&u2wRXDpRmI)r)l{^l!Drq5f zQjgn72(_EjyO&I>$g!JEqwWK=xkt>1vP_FYMA=|d#rgq>WjtLqP6_0^)(=c9M_$de zf6=DXRDp(Cdd85KXm-!I;4c-e3E?ZL`KBcL+4sHamYz$4syVr++T1IKY@!*x;`^8L zsrqB{v z*DHF!m&r&@;f=2hLW6@)TBtE}HitR>`eQ|xsy}E`lvbIqMSd6Z%`(3O`K`z|%KSd$pG3Z1 z<_{si0{J?bZ$iGr1}{`20Y?Ft0|KYa!!G+yL7w+9?DWeP;? zGw3~1MeCF9B>prc`Ek;FZ%y)Jrhqf8HuY*0jZ7OE@RedyJ5JGjo=isad0NAhlaO3U zkESgkpHpl4Im9=8EsZGEngk*;kXcZg*!3sz(9ANRu4)dt7!e8XvbG4!C*f3 zazL!IDe7X*1dPuD&Mh{ZD^eTmiL3ZvpXO?P2i`Xnm4piauuX{s<4}0WnSh7z^fcF* zK~*p(@Xc~O2{YdAIwbgLUQ+Tovn#v1R@p_g?i9!t%ly&1#JH(|?TC=`Z zI0vhe9zu5y9vS>Kw{&DvTWH(hxZtma5g^+}Lx-f23RW``%;pUlP7c$JLne}o^yHAC zeZICpYO_b#7Z1ZMlIS>VY}iF$0`nE~XzoICEM{d?`iKfzW=(Zm)N&&WHB%B!02OCQ z_zh_iF6GnVqo+&wK21;^p1nrG4|v0KVkKN?%ER9=X`@6mdKZ{8Bgu4p>5|&M4o2 z0DN(iEKuMLU%Feu?cVTmy#Ynu@QNdnzSJB3NNHtv2M-3s#9>g;$~;-1+)#jwN_Qqp zc!f9ou}}%G^oBovS;C#(@YT%{zAD?{=^Iq=yGatU#=F28tAtm3!=Exsc#RKSx1o*R z@O1@}ev1xw%L!(Wqd)o7$>@ZQrJ{|RcYcY*!7idwwk4O^r@t={m1 ztu$}Mjlo|}(!lVabtCQ^6(RyR^}CPYuOl(p1oG(zA)z0_1v1U`#c>W7C7kIYS#_qf zfSUk6xZ#FGI(JAMEgu)AF@6WA3U)-qgcT{PXi0Zdi)hv+RcO z;IE}Ef~w{Q$9S*VyfOgMWk6!3m|(Ump%5@stD~*Am}C&kNE|mfUgs8?mo;t*=R$I~ zE2p{WJhF9m6I?iq`$I16j#1-G9r`4|>8y3BEjG1nH6|S1`<&Y$dNONpz}HP#@um*w z%Sy9H-I+5RRhv1)>F9P=)0eK7&qi?^pIwAlwMvm>Bm@z&mihH5wBP7^5{`K_pjP1{ ziC1Y=htSNdhR1yIwoeO z^a-hLITjILwP+E?xlFV>gU1j&MiBKXXDu2{dI+Zx9EFa~t>$T6ue9#Ifpp&LUQ=5> zmTlteF|O+5uC1qK52r(Q77sqrV0A6)X<_#5q>}E-PL1mAp-F9lWtue${NxI??!SqS z$+09{^3nPAGxke0TtlgMYu0rcH>)DqEv` zY6Z0;yO=sB#HmkDp>-2d5#b-<8A7cSQ^_f6o*1XDJ18=nXaUbG6PX#bj%U(E#-E-= zX6@%-kfNSA%qvb1gBn&8%Nxd{*Bpy+XtplYg5swq4JYZeY0})_v!^vmI8F2GbJY*u zq3tugUFqu&gz2`K&uKljX-gS!E!+I`6gq+1l;&lX=NHpf+gSCV>C`eM#^}KRNod=R z@laOCO?L#J?QjcIcGE-j`xy~lPW}HRNlTTtB+re4B;&|2UqL>234+9_AFQUk4`tG| z*?s6MQzC-TNku|E%`fCr%hVW{fBnM|bk@{Jtoicp45iMg@dW)cHQv~)_YwfViRv~EERT{>f8@VN@!ic#rM+o2gT=-u{3;p%(yeQnEp z^ZnuFRkBJmM0Ptv>MTj3Z`>S-MQz6&DeAiysO46#%HDm4+8b`6OVE3uGwQ~b^k`m8I#-)}rLP;bm}s{vg_tJHnmRVlr{*-`o*Dg3tTrtl-)6_M9WBxJIJYaq zkv5AUNLhbIc0#CECvZdmeo=(l^f3)APEnio_)65YTJ(aeCWtoX_YD3NMA1 zmidbCm&rmYQ*R2R-ENNv{$`ci5NbBwP93+0V!`e!g29n!-KIr{V!DmK)|feZhL#pY zhktWX>)j3#|z&{~JnwglbQmqxQSvZv56O zAjEizwW)vSQ+wnS^rX#0C$F z_`1?aoBFrqv}JCp&x9riEsdO)a?Rd<=L#*D7pE?Il2*)1QH%T2x_JZCh0E#Dd5^$Y zZT3XzHjXj=BraSGaq#tdzdwHz}^nm@I;I?wNk(SQCiEQ&-zF1Z)?ZMTa z22UJ`u;U8NyL*76lgiMZzq~Eglgq6|crEoWBfRaaZB>rzqgE<@#>i*~H^aZJ81ua^xY3waP)v@kKTt%Y~}wLSA&yJ+LX zaRGb#!#Xj8?@m--yXtHGuN{{@tXJ^)NViz#*N4->RiX6gJrRi1x)5#YqP{+&4L#i3 zOJPD^=dDs-n8y$I#t5}^(%1KkBFPyz*i?8bACF(Z9wT!YeY$vH@cBHqY<&5+^WGTR zt0aVsps^)GeFW+GhKOrrtc!5HWDLoqhe}ehsa!WTA}mXA@>+)f5i#ezbA!(p`BX9l zUFhBT4SRfiT6E8Y{k_^$ci$M&o3`8+pD+h%=NrTsFfLo?N_QVe>tg5)rQ@O>5-U!a zdoom*EVfPgIgol_1+6KK@3)>a^0sO(uNmF5;kb}N93sIE>+XZgTog#-7n`9~>*7=# zT)`Ck8`cW1lyEbz8izR$JG7|U%!hzY{qt2?zaWXewKz5U!PRmk2!HI6sv&5@l2ioH z-n$N6XlDOMUYcoNGKRcOGnU4U-hIWOnlAcdmxziw3%5T^2=|AjsrM}J!G-e(wLe`7 z3nyFtk`GSM@-_l@#T&Qpf-HylZ#nV7eMAqH$Ix5Kx(A=H5FN<3%gdI}qtlj~!))l< zGC(mSoZo1`E)AP*z|^}j?aK;j-h+MVC(FR@r~y28?EPz{5W{WC{Uc=Biu6{Q&O&;R zOlM>FCJmic%mbTguGbQ1_5EYqK3$v9v7U1VCtiO>e{C`ic_2PvE!dT5lkMznvI_4} z%7f9R4@8oMbj<^)IESf!z{{z<)SH%7gh$uE1eq|*>$l+vA6vf(Pq@hXwKSxB>OEz` zm^}Se|GcaV{Z-bFrwusW@X%jn%Y1OcZqb+Mud)?BxEbiLl+Jw>6YSMN4+o$3?Ugv6 z9!XiEn^Ue$Su9KjRc0fti;W&xl1@7wj2BS?pDVBrAr8;GiW2Ule|TtI&smyd(q{`z zuNb8jVw6_IC-5CH-D7A5=jEpARzlMeVkZZR-W{YVdN3xCD^=VS^(jnl!-z;$Um4Jv>nwF&Nr15zb4f6LqQ7P>q`41|RnMQL z&W9tg3dwUsh;ViY=|Ni`_FDXIJ3|{C5j6ghP;yXALfHrteg^8b1BUuTou9$giv`=u#N8_q z)ZvIs=Vr$PPCeSOqJl2G^4396(m+BmR}Q1`&Vj+-8J3;P^EIa-ry#GE8N5;AwbmCq z=AdQp1v92>s0t7M?f_Sl2*xc{3t&LGs|TxW6fIlrWkIYrZG3!g@OLNN)aKW1wED5` zKJHKxO1Q&o3h=^mO@Qe=gaB=BmSxNHX~E;Yq!62C`wFoMYJm{n^Sxe8WG#A%zqSw) zuBC;#^_mb%q_SH;xtx|i7U`amyZk^ z`}C8>I^+;FoE;cXrk=hFby;=#D)6LrPsR@#1ju!yedda>W?C0DoLZi`C;0mc4wgG3 zvpTIPHtZ>(i+>-EEgv6eTXREMuCzi?S~z!g%O2fAbGMTWT|~YBlT8v~ynFV_uO4~L zb?uf{>5giz1w?Cg3_|9P>Ns`MF&euz(eZsXYBL)bS=w~Nt{B&lkWzSY-bPJIHlM2s zV`qm=W!y5k+W1|Pu6Vub9$VUKoVSFJzmP0CWpz*b-rC6YAfIu@&xEpsTD`{EQ`k#h z7tiDDb+-n8-z*3q6Rmk_B7JY2nJo9!v3b@5bm`M$d=^pnZafE(_|}5lBfF7rBwLM( z5H#l+s@XKzM>V<|Ic-xn5qDEPZX|-?Qk5HR3^&CA!hhTce8G-RsXO%b& zsI}tA@s9NUAM{I@6yD@elOqS ztitxT_pwOTyW%vWY8TE$Qs}*GdhmrZcXJ!reO>LV7SnxO#*w?IWorcOzBLq9W7#?o zSJHTX0rDTyimjuAFRaOtoktICfp4AN`aVtybkiJs-)UUhZbqr(UJjy%FxN zi{yH-+AlN#bDS1DlM27)e8ww2c@!IAfMX-rgYU#6~ zq=c?|c1iGs6Yd7KFPlwg)`sJ9r?)%gZt?=)Q+(h!?|*5YT{ol=@ zm$xMj9{sWG?^r{Bw|DKUeiuY-+b4|v!BXW=%(Bm8b1>GjiqYqjW>u_Qh<;B&zl&h= ziEY>H_Z3%s`+dc68v9&4KiGWkj_@DsHg)w{uH;P14sfx@rZjuZthVgDjoJ2|%a(w=Cet9)Ft_KcA>hILwy;;XelE zz^t-L+~-zU20Xr=Ha@SJOP43x*Bpe8V^`~i8z+$2|vh@M9Xpvw9+f$7UPh zod@P)ufhjK(nBu<2YadS{=q*^@{tzCU3EqG?e6}Pp*$^naR@)+doiY$VgG13HWld~ z7bMf~UYs8MBM(oFv2Q4?-Vu@TDjIP8m2qo9G0k`>*zsdURy@h~_MwlS=NlcFc4eq+ zXC-I~d}!X4G|Qhu_0cLxbi}}@%!^2U^e##Bi-D%phh~&b z87smubXKG|j@+i`2Vt76DV>ZZGTWv)6d zxV81iT3Ytz1zO1OES-XZH$|&BIig}`Dm)9=VQbZZMehR)=#|s!1 zSOfp7Q=nqHO`?0 zaM3e|aWDODeK@~}?scKUM+441F;V@lqkzHcq9ET@?LB-ASr94hFGQM6yITkC%kpXS zYu#t+t4I--^BXSM5!F`+R$l7bE6Mx0b&LC37%pZQD1z4LV>DxLOjoo2vSYOD@f3Ao ziLay!$9Ey=B`&dMVP(q;rAzSM&L3PBX3$9nr#GyYdDv)(J<8_L=6$I+H1}EjFMx6E zzbE)on!CE1{SS4D9en!3J|{YQ@g+m$zP1ogfBmx=VUy4P+5Cf8-D9V`!OX7*HK1CX zyV~Z4hZ6YWMc>Zg6LeR5q>JbW2O`v7E9uz-+>M0w*k`sTVPy*1JE}TgD*LAEbf~f(P~K)t$QOnAOpK{ zgJ#giHzo|dw4>^}VQ|SH_w?!;1{Xf*8x9rDr`3nzv5C6-(1h@SFepQq%dp0uhQlVY zBN}iQwSO4ySacXohB^Oam!1#Xx{G$97tQ&Kbts1+|1J;lxEXQv@WZk7X^CR}makYw zN}89vXtccq%sZS2YY+;8>$^ zw2ag_u1`~v|AQ18wK8?#S{eHCo4xT))`2&Z@NWzMcf(senJoUbiGNGq8VE?~TQR+} zu+5iktbjJXHF3rXG`^or`3RRJZWyokQdL@FvrdUEj-&3GQ^^Vf91D=2oHn)S4BqU} z^IMSrhz@V$FNu{lCaQkxX-#7UGCLcS99OwF0G~{gGB*)Y1XVIE_t7o+EoUR`aNI>f0gV z{omG*E6&@Lo97^nYngYy!^|-xmAy5I^v0QsGT)|rSfw`{{dNr{jGXCF!h%7P)ePpG zLT+%t$tE`QwKZph^iibw`!s=w4G>pv_*}5pqTHi$!$s~?{Deiq-F#C<^UwC5uspbX zn}NRBhaMM;?_TMl|2f&Fs&~UJ9nIL=`u4qKs{JsxdR_=_jNiYOyF~WGhC@a9>2QB+s1}*;k zz=S3=h3nn;f?1P+vWZ%nLg|se5AO5xZfBgarFXtd1CJ~XtCpP+YbaE`xBAEu0)5hs zcOO$rGWRwO=Gc!2t?8VdAH;`wK?Ildlt{YogL~C`W>ZUZT=3;mn>y7~$T26O2Z%{AS)7;~6>aEMD{dlxmc92#c9~gGT zGlys!*O?Yndg%BwJujbtDO)h=lWofJQ?&J;acVnG96yZcF~We@$`R4+%PXHss^I(S ze7Nxa44gCLZduuSj-GJk)z0V-u2ybGk(DtZRe6+S5%yTCy}mlE@p7A?79y(u{uH0M zd*;pYV44q$`oG`Wxq_t^P(Q8^|1&Q9^6}2-4-#nmhjHqaKx#e_r{3~BwVsGp7oVfk zPk5BV_YthTpM+AXPdwW5idC9)q)ojU9^<3UQ?E=nfOrTRsag5L9Nl>#^xVj~jIy|2 z1?^hxv8Svw?SFd?-6W3o<@n@LE5C0Zsl8c~xEn&rj=oZCQ)j>z-cv%0|M!InSGIU0 znSRhC$)d#uNrcZZu&d|n#JRs7%uCg$p3pOEAs(l7F`{1Ok z)bfKLtvNYYy>f!KpPU*ztp_O7Oa<9VA5RUQdXQ(W&MU2S%g4_IPYrWtv;X~!V~Vy; zSAJ1EqS(#|29{s&_KT9IyJeedJ0{_=fFCfx_e*#h;D+0xHa;U^0{CS(;HwPut1%Q3 zG25B5=&e;q2@-^(Ntr zjfS@2R1AsS8++<*((@Pig~{8{N`xSOS+wl4P+IqCpMYNu0bD{4d^$MbS9JO05wuND zLb%UfSHIarb6ZoXsdbF{P3GR*R@Fc5*L>MAnDfSJuVf=&)}os`@OlHLtpmE6oI!~P z=$bQ2`utk%DU@>zawyc2m`aCyHRg^x-i4h7a$Ayb&5P{^9LgOs!2JYA&3!iNX+$}0 z8oZ;ZaC$4g?2%)^s7X(3q(}QEQ*%=)?e+D<=!H)j)aEn@h?wtdKA%^AeMA3hDTY{j zX`4|l!=U?hqfN~o#p)g+vDETYUlfWw`&o}-&qbWkS83#T@m`SQ)Ozj#QcMqgcONO< zYyM^tF`~0p`WDEV=~bYn?Gdj6BhL927=a6Go*Jn6n^fkS!ME1iyYKz$_hvuTed5Qb z@o&*ZF2~7>JY9V00lbska_KhqT`q}YAKXd8sQsr|Jx&{Rdzv=>6yLwqpsH3+O9usU zb?VC_TK03ens|~no{DkU`KLATNsS%!ZDkAnT&b-b*S!LB@|v3Glxoh*W1>l7JQ?yK zJkI5&gy7nRE8I#}E4SF5@7R>Ut=wubM)_D57ezo;0+)ikP^#sd0qITmA|= zAGimVBQ*K-$f$9~%g!0;5Kap!fa3ya7vMAan|`5H5|?TD^{8+rUhl*Y>;apL%?}C~ ztLtsOV_=dQlJd3mOF!sHp6Y&D;ch8xmpdL4lC zrGm=q;|+Eo!w<+p&=5toxY^@M2V9k1Aiq|S!>A4zFl(IdyE zbn7hz(cB?MC8ENUa#`$v>IaCmGlbxqPI6m_*!l46XOTBM6{~hJ9$huf^;4MMhwzZA zK!^3Sd2|&fKF7N%-ypnJIdRvmCQb}}XqeaKz*V3Bo&n(%dovK_uT|l~|0w8vUAIuX zu;?Y}|0h93Sl}xtt@|z_=cJgyp(FUK-0|Cft44^#Z#zZWlxN;S8gp10Uvy&4m{wv_ zwy))V!VO}SL#bmm@g$liUdeEDcvc^3n)mg5_x4!_=7_We-uakC>V$FGJ2C*n%1_%7)=qM_sb#2#FElXkc1!||)B6A*wQ3Du`SjS8sJIRrc)3-K@!XN+l4X^S zd>Z@ffU&7jvIk5UNEXe$JM7ZFFWc1At$YN74dJ+9jU7&2r6yMDLR$LEU^R6Ht^H-} zgpM7CQba42TB1`6&d!cDaGas{Ic`scb`mH>m=FRsqd*-V)+tpQ>y&ey1xlGA1WFk} z_x(B{+$d20GqThS8q$$6y8mR43|I5fsi8Kt{|dbM!C%Z0-_`(gJ(SZ&A_ijrS7~WS zQV+vWYrjHkI|dpd7iQDStHX?t_A~U*)kvCgwYw2|VM?cx%X~{-ASgL7Q#Z*FgGusD z1eoNeU7ATIZ9@ZLl1Vdc%GPBx^0x^AS1rhXOzpqLIj-ulHe!sVyWrNcxf6hr`KG2Y zCaZGQCY8)-MuCP$%kb}4b!*`81WoBzE3WNCzFWa{>;9mRnt0ynxTeSXZl&H4@Kjln zx$`>A1-*g!`fJmEubVc8v4=U|PP~RU`fk6EqMu9BGXM%Kp+ ztaBw<|Np>xD{CYqT5a3YNz!lMHn7W*?8aZ8-M7L8JG>APerM5AEPhLa&4C^jpwLF`|Thf+E*oynO%q@+^gi1 zA?fA_5qY1PT;F`oDokW>^wrA}8Ro-0oi&=s1B9^Qeq{65-!kM#Dz>Tp_)97L^#&eH z6d)bKr_~%p)T2tQ7po8(^h;N4d~<^zppUxGdXWYClSDOk8{ab>bdrB!iITL(F8u737qpYrF@#}^aa)m zyyNRl2Hn(ix@oSnVl+$L)CwItf3s`2uSf7b2bq3S>Wi1@E!6Y)mlcj3-&Q!@!B@n@ z6`YtSQQqxUg$~lK7h^HKh@g!{bt6%Z7_sc~G*Nz2OJ zFm@nKd{?3@$6{8qN?h_YT9NyixjW~(hGl?nVuWs%M!q%RJ5%y4VeLVnbM4mTip3BXmHqwE@UVKeGf_B-=m{l z=U8qC8PG>5<8pX*hQb!JO289Ck9+##SKj}DHZ{y&n5-Q)EYz@N>_`Y18=%x7J&1+$ zAj2}<(;vK7AU<8Q9Mze-S^#PIFXynb9warvU2K}`%L}~LF^yWhj`c3$?(HA313gIM zV5R|wv%sDt$ul8qHJBrIM#Tq>>_Czms|zqM*gCg|us z=h^gLWK6id(V2A7%iB0Y(IWhU09_BzI5`;ehM$xi9fu;A*o zmKF9P14kJ8@)Lc;;yMB;yta}*$zhFQWB~iB4@r-5mq&-iVsf-hbA56JEk41VeMwAM zSLk=N*pHRPz*8w=Qa$z5eDwdv56SN<)f|Z4l7-LWW>ndvu_XeFT z;WE$aN=GLzvAhTp-zDm8qx#eWkNUdL5bE=)^;qXx{WVSXi6H4+@;`p zR2|%3jG*dC`2NL=m{i)_)}8f@Buj5oH5aP}i9;_L70LCJde*}r2)jDsU0OXl)uukh zwVcy3}9ct%$(b9)!}27(FO-hr!` zeK;A&K8qqZs2i5E$Y?NGe;1n+O$OhwS&Wj(I0TFcWzn6uf4Awpmp4<^3STT};86K^ z=R(?)ZDRf8_Ik>OgS?!EYn;K3Mw969ZKpaP2faChbwrbU@7UBs&}(($@UeELcfIR{ zHC^YN!&twN; zNxT=?WOh21OpLm?GF@zk#p-@(n(M=J=($2UvbsR;=QiW$G;nxV4y!Zq?embXrle`E z=EZW&a}E55?pE5A!QKTr~x;);Kaa@sX=s@7$;nBgw5GKRv93 z8&D52Ydpe7StZU}tI}kZ;_TJj&g}8zJ)@%EpUtu?WNsh7LTUFlI9*KjWIWqxA=}kW z#qR)z>AeNo5o}+A_pJ2Zp3O<# zj_GJW7LrJ&k&CQ83E|8KGa0^$9`DYENiT3Dk$COnytmeu(R=T3M$v3S63KKIALYgE z{i~AO=_K-pFx|dFbcv_Aj=jz5l1W5YsQ0(Bqse4~x;~1T`;*%f470YoJKCil18t;Z zK3mft(L+ZjpGoggJ4Ug{6f%Ysv-}itZ-9TAjr_WtHKmYsi4O?d^6puGeY+>tMt)h& z%2UZu)xVtWOa;rmQ&@81qe5;q zd;=TDXa4P=d7f=a!zjIf5Nk~%qXPoWfJHG&I!{Bk%O5j)I!V;hdm7fHV<*Kw8=shY zx8djj@_`>uAHKxuhIn`Ho9V212t-?wz}kILLCj(WYVmQFYb7ZG0p&Jw;TS8mdJq0L z`)eE)&tV6wKFs|khaeW1sdMmW!!yam^cHO|-;#|cn&fRxaem{q{Yu)?SzRU>Lx=s8 z$gXCR-hBdA*+_eTQAi8MPBP0-ZUECfupQ;E6<-|(}$9|YB4?}6qUq27)ny3 z7alVVN^KUg2kfws@6(xi72I~&@c9A=DjNz| z^6f{gXe2aOl+I3%#8kQ9D#I7A2ShIr)1bEo0}E~Bn=>r`25j&xn8KQFfbj;d0c-@T zm_o7}aWIMIo>BSr3`mV35ZGoTU-OUF^MG1L2tlz1I`*gjB$*-n4Q0QMCN+~! z=Lebi3j+FS?P=Z`NW*t%tpcu@&*`Ed#dvzlPZ&{OP?n8+Rl=IbU<;Cy1R7aM5(xfP zrmiTkHg&;TJHFC(TXfbfHge_)%grX?gM+g@O*pe!;~QKF{JXNL+QFY)!1jv}pMHPT z!ds^{8%4TK>vD~BvWlaq0?WW0664^ltacn39MGc?X>|8EUIP8|1xkzbWu&#z_(plZNY6~(Gt?u)=OxUUOCl0P zXJuM?P7*2;yNXGn`dnorpNp9#Nf;^26pO%H6MGirSg=o-o_MxuisDz5uEi4W@PxFk z)XsF(ZURXh{pfl<(&5#L+fL-u`JG_OR@{hc z>(U$_+!S6m)6&ar=FaYk9iBdHNte8FEc|Ql%5lbh4ARnrBdtoWjXBrt)KAVxx<;)l zKRL`YZY2K`ow!M#HDG6Q(&>e{|C1@K{YG+IfH}lQ{*6tBo5;`s=HW>1ms3E;G}mvU zk>2jsoDZ7yZ0Akbj5a%wUM%VNp?=(;P0bo*!QPD+%i=Je!`1+%_`o=w^ba0qSv4?; z8@wnZ>HQ3R_3u9m&uL|oZ6r#idzjruB6_cp^coIwF!<5|6X;#M{d`ygJ;&Kf&HGA;K`PB|yQ@$)a+JO69;zkrpAO6W2Boy8g9~bl)yzEKWQXMX*{oO!6l{f6C?LcA#!}NFgi?df<_F6B++k@J`3j+ z!mu@iOR{Oa^+A%9@2Tr<{PjoSg>)s5%g)KF>hd-E!j@uFsZajoGnuov!v4~t^;KnF$U2o(-%XU(^g#FS%i z8`>3#4kvmZ#uF(-wfBi+k+aAnv)!GC%@?u5iX+BkT;s$ipf8J&YgPK>dRldiACL02 z#!1f7stj|NpXT~yhStkR7t)&KL>8P+ERH@!o?&!!EmUeod9lgnnSuHg+sM((Ea5-Z z8Y$jJzz)L(^U-1v2_Zk3+oQZyV;zNffzxJM`WygFh4-@Vz4f?NQ;~mz62R4;G=94p z$ccDELT$G}Nj)?4xxTw|Xm)|yYo4t+07;sZQ)ZThrm%1|-Sythdlq>%T7 z-h|IO5b5gjgXHuvQ<~ z$EBqwTSnqVPM?x!KwA#s2ebL zvm$NeNDw;;4*h(+l(fCRn4^#MWA+r1#QwAaw?jK(NU)j|$@1oq@O%57u#vwX)T~wf zmp@{2;qiYYWnH^@KUQ%=DpG0`euE7{$#^13^L64?)1)kJ2vDD&Fcc;7Bi1|z&CFu$ za}fGZ7k)lYeBV`ce^rTB>FKPQBJj!b8U{+_?1sEM$g>1o8mmY|zw6W&zM5GIN%W0< z;m?}zc9;@q$A}cN!WaA0mM3p;%8iwzWbbMt-e%51;kLFElKB2&vec&4BwLOJ;WS#j zet<_4&hAMz)>24fh>cw?B&p-I651Sa%@WXvpYWGmakJkgxK-YTEh~I)p8U0nzvGp} zp8h@Qzu8XwSo>WhqK8{D#F{o1I+vtEg6z5E7Cfrwl94?_hfCARu#vy`v*x*E(HytM zahEyG^_{=CRdEg5mNe;dGr3Fqmozh2%{<~D|6pc2E`NmT`+YFj#;q8rVy3n_hkeRy z0$(I0iv@l@@S<;l|B5*U-YM}G;M0K@Q2_8w?0~@6N_?`7ymbM15yAlf1#1`hLlU0` z{6XL|xGeyGmZi-nafzYQ5h~EkTU7#QABH!xOgxz4GeZ+Ao==jvBIlENc(l#OCeEAl znR5XNzb6#ytT)&4QGqy^U$xnS8bScm<7X8!rWn4N_^%h?y3M+q1WlM6edSdsgW50$ zgjql{$;%4K;Ti1g-B@pnx(EwhK<-rm1Ic`(12 zJR8_y{0$02-G^T4qHcbx)2D814T`#XJ%`petSTZAYSeUih*(TVe2YjMiPFN^zI%k_ zwP+8&MdTqUta1^#&))_s4`i0j7)>_jS4`d@!&zf7p;5ytm2Sg%lnLcUa+UMgrY{HMjHp#%l=V<8MwI z&J)6PE8?_xuD=3i}9mnQ5g9T5`Tw1yfPcx zl6F6|qz;>YWDmavA6PYxe>hkBe*rwL310&y^4_nw!;cn**8wK3zw-$_+lhB)>J(E} zqe2ip1#->UNc|};JhyQ0b^m_@oG+_cN&?1)*P~v2CyvL$oG&!DXFsP$Z&-L}jq?0k zyMci7#hFw60Wt(P6Ivf25m6_3zwnzfyd|S7dhnlml9|g%T=>soe*(JF27?HKfSXiK zQo~O2We5hfO(;POI-s287$+y$4m`p*^WR`uT%9ty0!0f7gTik)`J4LFM_lYg_T6%l zt?pXOG9DyxJtJa07PxB{D|nEMOx(raWX57=Cy!yoa2mhORSmxA+z6|U?0TNnKS*v& zh|s4NIOv^Mx%weI-x4V2w3(I&7V!{C8ol!!u)#V(tRuR?cKAw+7vZ;eba*eoLq!!z zL?IUm__eJ3A(9yE&d=xTi7`QCyoFqStfq!UWIDC1dm&rE^KzL~AYu;wfAVP@MUckK z)!5Xn%)}y2kZSAMLY=EzZB_WNwHw&lz1jX@8y_URN&`Qx16_=ApSnu3m2fw*n9GJ0 zV()3LAMtsp_v6`HD@ok#nqw{E&J4cAU=m5f`Ps zZREv|S?ePhEfp-Vl8hZ4p>?J>XHIf2aX|LGL4I^34BZ~FMzjNZs2Y%jqx?!}sF2lF zV!QaoQ5*V(-<;$`Kk=;uWqhq`l_+G1*dhvP6;ybFgBLD!QNeCQ1*KXArCJ3qtVIRU zNfo{oV5m0Q$P2HE{RZ<25)>moKA2R#XMr2>}X4P!NrlDMhQ&lLPLI;RLBwuu{~`WVr^U9(Lr%kidZ zq}9-3F*arR?PQl9CGn%YK>Q|$zVqlSR#j>e?#54FW7%vfQELU?Un!ZQS^< zd`=$W5woDjm_cN(i7V+@jgt%=9C=zdVR6BMJU0l#AKp~?n{*kxJREiuO#Hd|tlde% zM@J<}GM4=~4qBtybY0m}k3_cBc$=V*wK6ixpWhXXWtQy( z3-B!@fPJ%?~8eOvW3@d#CZ2x_yCTCO& z(d^nIZ#(|y;#1Y6U!UkT-gR%d)Vbb=P-W{{l7iF6ZtF;ry8a`Uv5ss<_Puo^re_Vm zm=0r(MretPW*66yKZZx20NdfbNmzYq-wGi$Q`mv0$<1Bjo<753Ysdppb#fjO^9>Ip zWPS_VQiCZ?cv{20c#UqC@Od@f^ZwI0UCgkx2Kri`d4DIz8LH$n0rKw9r9N9pamNMq z-j%Hrmj(17gEiNX&@>n4nNVSBRDotjhIsX4Wc2B)@#)omvKA~mdnVGMeg5pHLv=5}_X4?S*YV$doPe<1wU zyv>@1BU|7i!KZC&CqBa4>}0~*?9{vsxN>j9xpw7kb~eD#N81u)uBP>HalP z(r=(o7OR(9{Z3hopLECYeUD9Mhql2wyqh6h$xbF*$<7A2k^zD0#oY~+FO#1B>i2aG z)vu6$_fYKH!wgp$f(%xaGTgW$R+IZG{3h#}4UTG#@ zSR2|;k=ux4&>GiogVVf!g9^0#Ae-yAL6>E^!kea3nJu6_fZxvR)A^KhbgJBk;QwEI zps#QaA3&r}-bXY4jc|jGT${(BlRmg8p9%&QYXpPNHng;o3=$lC>%#d(D+Ui99NZA_ z1@ZHXUVO;)+mekwzoW>XX31ZXmmT+8UBBJmfnTzG^7Mc4dm#J2qq{DzY}dHo?ze$a zK7MxmO7W|}Zxwzu_|@XK6Tf}$eB88`gYHelj^;aJqhb0gSwU zzA)eXf1>xrUpwDTtJvA#*G4w@-#x)HWl2eS$^6oihv%1rB1gg|&sbWt zymX;u;?gDelq_0)zowKM$4{9K_Fdv`nWjuwc=u?_gY!$5FSO)XEBaRiH!KWM3;Y}< zOBPv{EPTkac;Vuu_peZf6fJyk2-4uB1W%m5B(>afPsx%Ziw;i!Tu)n;mMvVeut=v{ zJim-{;cP7P?_W4SfzwW$m1ng8QwF+;OP7}xS(Yp<7X>wz4Q*z1q@QC$vCFl-62Dgb z(zNG>qlP@k;U{3gZzwSQ%y>s9*X7!rA%Bf{9+AJ3c~j52 zHhw_9;wPUKhCIjN_X=Pf|4NhL*X(lbJA_}M_WSd2muo+S7e7?$&LhoXJim9J=eK{i zgT$D|KwI_rg}JVNw-ZlD`s5ZoTU@TEvAL?Wqs8TlLeNTT$1~UE+K3J(`Dh6ye6q&n zs_nqD*5%q(h-baawY?Tk2>KlO5LCW14WITui9L$`U*TD^qx!*sAVo!0~o82 zu+b0Ci+GkPiYd_LdK-poip8@HPpixIm(#2npJ*9y{v-rT#*hD*@q=({_Tjr?bx8BS zEc_tox=AcHLLEI|eJ=9gA^tdh4H^}R=UELT2FMP;+L<##9eV4g1KA@0j3f<;Il%lP)fDw*3(JU9ZyfMy2;i}j2K>ox zm+OzA1{mrhjZm0{)kdm!sQaqfWt6}5a3IQ*ddjH@L*9l`RW;Mo+Umbod$)XNXzo=vR7WD?Qk5yaL$HrbdX(pFi z@WW^4E}h2jEPieHUBs`$On&miFAzU7ev$ZD@Jqul13zoS^aK?PJCzkBsyU7qxirO6 z8vcldg(!YKVF36ulO0?;J4HtON8r2t&W&#Zc#SW<`v4vP(sbZ-O>r_&zUN;h-a%gC zU0er*{wD}}KcO>t1zlju){%G$eCTK$|HqAhwfW-12kH1fIe|Oti;uKuc!!zPqxB{O zUaKJbL!H51;N3RJ>4X6Np3(6KxrXcdRngvR=W5P6)We7e69h$G0Q{*U1J({u_AI4*^3@R3gzY+m&nwtp`>X5J zFPhn`6g45>#eIBaG(4Q5_BP23Tc55j3fK_~L{r0W>1u#UW?1kbby4t+CNtqk{OmgTwNCY(g8E!qoDgd_S{@GmVJ7+ z`UIOZLhTixVc3!p>i2j2VGI11|5Ac6{)c2F{T>!cGl$;Glm8RQlk<7<<&B)6P9$wS zxmhGbdGcAF+*!$KX9{ROYZ$2>41T4+O!!#qxyc|!Y!;+=rI2G-W|sOx(krVVYc;fe zmh&njxR#*ofQBb2y@1$(-)?r}DAk&@`>2`h#;{b!fG_}WA|Uw^2q`Dr4Ttus!nTf5 zrv$tTRljrqub%uMAua5~1H3G*>bn zn$s}s(edi{j{UjdtM%VLKVHA+zrF1oD*CUXnI}d6?c2c#ME~t8;7QSc`$V^k{`>QE zPAmFvUr}!eZO3nHA9t%DcvOti7iuWOuL4NcHbLDIa1iEuu#!DBQGHKO-#JNryxYM^ zfKLx)>k8F4W}2)<1{|#9j*BHs=9F6chso-aq=Ox(&cq$c#$LTs1f9jH*?WUO^=6<@D>X_9CxsplaSqxzc!)rd3QMb?Pm4O;P;>&?qU2MQ+-40UEGj@2%=&5^xMg`k|BkHVgG1gAzV;Hhh%N>pyncOx_PNoI{2B{_V$;LVX{VaRQ;f6K8o+sPDuMo)l*IuU1Yg)OX?{n|p`4Ke#1X zbN3lD*!zX*G4{=!kU#^nU++}k4QPRloXTVWC{$bY^zOUVa{;IF%;eJ$_Uv4=Tc+=y z2l%HUX7ZU|!+bm9BR#Wyz8XyeKJ(*_z2VKfIYwrFU7!Y$fY#Iah<-&w@IvmswG2xr zhWq}!0(&#V*}7tNh}@@Pe=Sxg27KNGxE~8CQHKV6VdXRplS5F8lGOG9#vJ$ z26z2lZAPN0VaPi5AFBG&boOhFdQOE;|7yKD+@!uz$Qrk*Sq=G{)Ypg#k6F4!9nFsI zQllE~WNI&>{>j+@(5*zRFKqy2JyG`-H{AcMnqyKA#y0HPuJ$JC!ODiF=hQhwef>~F z{PXHWqP}sUq38v*ubaN4U2cH`Kk(Q`RgCm zetv38G6Taf_Va6MhuTupaA~hvNYqn#4YT&EGl}|XNW;s2<|U!pkOS&eliGTk6}+MT zrhZ<@3J$3g&~jFLNF9oXv*ttUXtbM!99Bp2W>4Zz&{rM?9P|fxo^N>_Rv+D@{tI8~ znPrL#_@YiB2y8dbG9?Co(TH>-uKn9tBXIt)76lXCm$OVs{;?;JZ0MeEnndswhP>IP z_@FXHO)Q0nnZzoPMQnyFtDOzv5Rq(}ZAvAjtc^b?3%w1G4_P*U{DBqm#~xPAAFJ3t z{e;Omw%68t4DngOmz?yG2{ck2(fIq~JA^Zue zXyi}id+?`OMJw=!d{6#Fp8c!9RFhC9p^*Y=O2Tj#R8d+!C8S}^98)jS8!lWSa1zmY z&NrJvpFpzRwrKIXPnW?s&kSzgWex?ljF!G-Fa#{7?)+kO$4Gxy_Jw zBHzvqpuD&toTqUo`^~1*H6YXTe?@I@Snm9B0@Cf?=UN8Cm}Bd^5o_Ap+=)X3Tv@GOnB>p$E@~=8HFj>nx0(zR2;3FWA zfPgTwa^?UCR%rwQ@nC2HUNQ{85mchnkk3SZiy=SOOqTF2l6@R-6Uy@z>*eQ|m3#8t z4RR;}i(u+4ATUE>46J~1sF=4fO$zWkv$EhM3RKEGKIw9U6L}qfz^wcLft5muKZ*+Z z(9tVAZC3soXyA9jtQ<>2-pT2)+UbT#sUQ>#J2VE}qR}EQkYvzpoLNCHVC+e}4HXm^ z@OPP&HRwVjM@hG0;KU#3@z-sIS=ngEXfn(4zc(viUj%|Tz=1yPwh65vO z(158?<{Qk)`+V3*BkK09nZ$7cb%9PJE&eRx-)=u@IYrU(f!)v`?ha&w0;A2!X|4fu zxq};3Am+~z=rg5St1xh;nP|HZ+OP?n3kK){Hv@d~Ui$+*{sLF&3r0y_0}b(UuUEKR zkl`Om|2FVk0KeYQeZR_Z4K&nrX&gQl3t#Ae_#WPX8JxdbCriX9SwKKhyWsa`=1hGiY{oIwZ} z!02Z30yas%)2uvx8GU|I=KqZMrcc0lWgiE<&&%>Z;PDsKDjxVp=6{4nIm{td6dZza zT@Qd&V;BtAnOKgzjvtJ)_|q5!k29Nw@h%&nX()Iq=plfc{&q8Y02(8KlHc9>#*x-V z!KG&9RoI+EZIJ{Hvof*}435e?tn^+RR2U-jOw^8lkjG!}E~vBviT~Hu`3F~3TycDF zZqP{bl9S{mc_A;q-b=?&BL)l*5o@%uKn+7Gh>YME5Hx6zG^U!$j~6tS;G_;tqX9vT zN-ecG#gR_1rDLS1jHMbCJ9I!NgVfRy3uuaThEDt0d(RDzPWKPI-+O-S*|TTQp51rB zPNl!ava(o%a_mPJr{1wgtdwmkZ}*x;d)r_~$YwM4teBMqN@};SFx?UN1?G^%;L+1F z*i4uTQwKkrNqWARh23PhoyuQA<^%^GOrI*|%{^dEMCqj7?=<0&>B_&9ymQjK?eJZg z&Sukk0D*dCND!3PBRU1?KgD8#ZWO;lrmO^O=1hNEOw0ydi^_ip&1+y<`YCbJ8B6Mr zPtUjv{fQhgcQI z;SVsI&GlQMm-+l5Y9YUYX`x&`oF75okUzjs5&Qo=O$ev~Ar4>H4#Qck3U0!ngJ3l% zG)v5kS`=um58ZL`2t&)nX{>_(fXc7JgUw0uYcDQPLO)@SuRcuzvgamT9@+@A*VN*E z?nj6Lx7K%I=$B&N$K^pm5@Ox|FarVI??aqQt_ZW%KA0iV=GwKb=JG$ z%&b5`R27^gRS!c~7t3YAZKXdYl21(3L)Vy)Z;6@Q0Y2`_%LFlDJd#=mw)?+KC9|c% zU^5+=P3py*LxHQincOPoEwD4F3Kmg7Oox4s;`_y!lQaNX&j{@*&?yv_bsP_v6n{$P zdGf?oFw5H8|ApP`ttc-lRpD>MEJh$mH1d0K5?vV3t@L-r%xS_v^^klf&MHPkqVcv{ zIZubS16{V+5piZ)x_TtLhRoRxuFsk431r_u49rvkf-u`YdkuxO?AxJl=OIwY{avgd zgVf+`3XnKK<f)U7;>^cG=BU!Aajx%%fA zFs5HS*hj9mb23vI*q{Ah0hDgn>0pw=e~Nj1m>4+c^XFb7W<3K4Dx};(qMQMk8l_i? zsULygn*stmmrV4Br7#>+2Ie^43Ra7AZx&}GBM5>hccC~BAB28f`R^8U@F=)J@sGu= z%m8amn7d9)9duV$K`v**=3YFy+v87|+|Au1wzW@bVfd>9yfnz2lt8DzaOXuh94Gw*ar`*{Nv)h5Khv!UCd)c;C7|ICgw}zQ+mNR zv4r=D>BHrzn%Tmv+sr|5j|vbQC#B^3*&}mI9d2_{-TbJ>|x;$?Qb$mBigC?&{%4^fV?5-^-5<-@{WPGdKmvRhk2*OOt&3cmta6XBPve=o9q;uYV-LS!Ttth zTKrXzUnI_w^WYQ8f2Ej0JAh`z*U-Ttu*N|C_rQA;(_j7qp1o!d7PS0(*-VCcs89u6 z;+ADt3I-5I`A_ID4ip~#(_|C{iLX2QsFF;#dV*v%pd%zlmg=ym4ScidDo&gnpTg-%Z=(@@ZYbi1l)@8cP z3a=Mua~cBeDli|K*L(vCNwr^Fm+w&e8vdo+Uij-3lUl#t3w@E|?HDuyRu2^pij#5< ztU+5yUP+uCemmEj8ho#A0J zUAN*J>2Lx3wnH*mQ6tY@gH9{DhZ_q!1-k5tI>l7%V%Z%~`6t9Y624$yQQ|pqwhAva zD2jf^dA$w=8&%+Aar%0ouU1UOGj|?XM^rR=iR2p)9V5>7(H9sTy__nz6MfabeDu2% zG*NJqzf2R++3e@`#V%#wo-am+flH$gQ9v+)pgxFF;d~GQYmh~^iCNP~hlf=DHT$a) z1`hijL41?&rHHg#c9}tK@sJrAUV?jy~bkJfAO;jfJYVlR?GkbqXxYz?(`-L#b1fx>drVippq2MdV3&iOq5V&*Y5^*!f*Hgk|`K~%K`&R z$lX7v0PCEUG*k6j1)jz5ujAQkeupJ};@nzyVT2_V81;5lG(ore-{jYM>*4eMl$3B% zDo4MKDequW@;NnNH3C5gUt!Qru)4G~owM9|u>8>55y?Z>J!*SS)23zKjRlrONO)M6ZEqrCT@(*`VoH`b*;6)&$lV zD18Hkjo`rGLt@S@05>cDmuz0v<%fM-#_oDPLe(ABi^a05#5{pO%0^|lPMoLv5zu8; zwn&_xZNz1RN?%5YtD$R$WeF&10nnW0$)M-P2w!CVuadZIcK@b9^|!-FJFSf{a_t&c^e~4OTy%Z7e_8!t(HG0 zW?BOs1_u2K{#{A@6uBR?+x@pg4d9k)^(G9^5tSbmr*1D;gRcA=;s4kMZuR+NhM=oO zp$1(nB+j}F=sJb5B7zPBg3T#5o&hk0!2n`Y#aSryAKW;^IOO_`4rnpv*q&ZT1;~Vp zhv3(}BKEkL;vG!cPBrK$5?KxWwTj7v&lA*+C}x2E_g4Ngj2#oVDuK&VZH39n#=Fl! zK1d|7b7E%oqCiI+A4>&9lC!uX?NZl;4^^N4SzthNI4l>QPmoHZyzF*V?&i}1j1#eX7I?}WZp@n4Yj z8kiR6N~Ve!2&&@v8TSA6ExZ`^1u96DW4kOXcr1n!#c|eYFa;H1aAy*ZbDPZ+1O`@I z1wA8)J_{^K_%3ib2|tu7&Xzp`=T^C^ocu`>&4VkJ-#=k;&7?^@E$*;SSNCmL<3_KU zY}%IHbLag(TJgYy$x|jy@etpHduVDhZBlhIZPLWPPuI9po!Wu?weE=17w>eB8&pP>(=u5&+j`gV7@xdZN_?v*J6^^duir^s@?;ICiSzU;2{m2Gp|SGM+*Z*U6+ zHm`U8=C~FnHn_zDyEnKWr$!rA-nF>p&Kdt-efJaY!n8|PEPkMUS=+#|r`=((`m#E`2P*60i@lj%7VxeMcVq#)pQ9(15-mq(h9&KZx zQJLvYi*9<+nKp+Wme0|NneGhqE7Ruf6tK zYp=ETV}?z81E1a-Sd&2NS0&!-8Brn05v%?j?O7~I(S@tF-tH4>R%HIXYa+=e`BlJyD6riUIBq>l&7fDi2Jzb1edb(7Sg7kE` zB=yqMc1h~3r>i9?SWnkTQiz_eMgL)Xre2c5_4H;*iqO*yk`$?@cY>#Sx=E5^^z?p7 ziq+FCk`$+>TP4Y?r`si|kDfjwNeMh{!{|FDDN(PuEJ=Muy00WjNqX8_l9KhbB1tKF zI$V-c^|V=%()4tSB=ytN7D-Ci(;1S~Ur*;q(g2+meXWu-P_M{SD|`p~tguSN(@OsJ zy1LzWaO|;mt0|&-O&>>lg}1y(t&)_{cEwafq{QmzB!AVzZ(xXGJ04m(^0>ocThW=5 zQzxa5bR;RN)vq7%r?syWv%1FbV9fX$o8)bele`DoB?&;mS&|}KijG~dn!>lKcK_tm zXF;Rf5GRFa6iE_Fmsb=;mDj{c(e-gsO1|VVs={O{x0=GXsV)9d)32~vfh*d8D>XxM zIMB))qbRVW&kVcdiB{vg;5QHp;7t{NrgFPqd@;wdLCRxg7AeJB%?+4FywxHl)o;PX z^6VnTl(`V4Edf!(iU*k`!rS_q%2%bu7qfKLXvv%5TGcPU1bKN-(Q$trrV22sIWUU6 zqGkog`W`oHLkN9T&6%8_p6?7&YX*3zb%6_gs#z1>z0xy^tWwi^#`P^>-DSi{iIoW; z#H^SyR-{yC)JsxElO$F2V9W@qR7-n?Mjp2y`HEFC)q%r`;7Xp=6g*F@?-`kPJQvAv zi~$us7_<*sb5;gVVP&>|{9In)!LS8iQBU?9NUGIfWg`9-DL3J7t&&VmsZC1g9mfl; zrrxRD(exhXil+B5#)lzI$IGmyUR+KZuQBVpy6U|Pb;s0{pm^KYxfMQgFaxRTCrPZS zMG|E`rcJloJ7{>TI8EV{xI^(k#7+BHsqHgUoY|} zk)LOUC8`kx9VnOz0K3RTH+zpmzEtF|B0miIA}#;5H}Y%(<%xVS@*&9Qh#gqVeP_tAKd7G@ zoDc-9cQ`;GpE1z#Vl{7n)VuEnXL*uEYG=et^%hJ8YglqFlC#z3lsV*>YDs;H zoK?4{&H~ZFX-^SPwKi=Q2~jU2-AAqHH;rVfhxWPl_L#qdbWlx2@^#_*ViH=j5RZtQ%%&@J1a&Bp6ed7)4Pf^QS zlAuoR9hC9{uNrTx1!(!b%dvPh}k>h=M{2Y-{ua9X6~)~W@Pv?5jV zU6}mdSEgsRdb$6P-hK~QI`!2BOj@C18*jsYWu*!y}lU= z)+kP9U)T#>NKn82&_~U)^bYAnt#`hpj9|7S+pI{Lsl!Uu&L6_n8cR=Gr&cmNU(+LQ z0YF^3D8I=p$|a2$y?jKjDBtc{o@E#1J6+4Oxz$?LPvQ)9;oz#kG9Aj>p@ze8N=$&pnN^gHRzQncs@wpX#HWm$VuVG+O zrByU2Gc+KXsrG15UhZ1{q`xSya4mnTQ(;0*friqSk_NrOKr}bHY8U$0{l!``USbmWC8=*Ns+j38q+Bw`W z$k6u0Mdm5g`iNLH?WWt{EiDg(`hHWR5y&W6|B&jJ;h$P+^y3v?h%3F~%XsLyK?;UT z4AwgB2vKt~LgjC^ss$ON$FoKxXM=Q-p<^Dx-h(${Wz6<5YIkOiHeJ;XKkv3axz#Fn zU|k|HNwX2OsO=d8N5roPhmcT(@-a|`N}{qa}>-^S(Xh|l@X8k zIl^5d;wk~j<^_W^jB(U`UjI?7@^>+6_{cb$KGa-}${5nfXS+N-LYhQFy=<|6lW3LC z9@Rr0jL-r<9L!)CyH+K|mvVS1`AoK%hfb|pTyd7gnCUE1V39zUl*ZWdpP?F1sy74T z4LMuRu3%}Mm1_IQk>rFLofS3EAkwy7Y{WoncB)H!DOM65P!}@M(YCI}roOd&y!v*Q zKPgjpXC+5OI3bf;0jX$;)ke4%j?2y^*HmSct70&wIeJ>!O`h; z&Y^*FEev6r!<2xtSZGtJ+F}p2eY5lW13$e011f{SqX*hejxp<{pngP*CvMOZJ{@dQ%0$P%_5zoQ#bI`DJxKiGHde-Hs?gT567%xdxd}!?gJPlT zGfP#=*f_F{L#s95=bma5fbW98?@sGVbzsNwK4DB$L)Fx&h!kfMvA5ECpMor8AhR zhRHQsrByL%^`x6IvgS!6u?+OSEg2eNxh>8(n$KQQ3vZk0dvYbCEi)BDTKQh2{6DAE z_S?eL^S6c>on}Mj!kBRG5T%D672R;*>gG?azkMWDpl!D&V`a)%mvfH`>pn&Ilkf9A z*W?u3w>Qd23Vi6XU7-uVMr+3Eup1uOtZ7uhO8>B+meMRGkI$aH) zk~H{a3)DB!Xipjc?O#Ks*%p-i#WkSU%(mvwOV!dT2u*Haw!e5^t)DUwoNdA1Ypd@_ zCP%I}-jBDa4R=jeU%MkL>6Ew5;L3hjU}Fah@=JC#)`!6LJGyb*vi?E!nLAT_Pgyj_ zdgv8(_nncUHOB;Vf{je!N*uSyTXoFuDepU>D#c0izFpU&Z69Vs{(Ziuio0ado_{Cl z?=B0-T-`G@Y(UA1if0naD;7kRuNo~Wt7b7>lQPg2=KoX$m>cah@1LJgJ?=^tGfF4s zLns;wAH5zeAKnH&J?wj`wu=_aw1u#Te_*}3x!4Iel2!9r>@pOCLUTX6128Liee9|wEToxJR>&r z^iVc@g9VGW%Af32>t;lTp5EVm|MT>IwRy&O15W3Ie8Y~@$1xhKPP^N~aI5_Bqw2|- z$!eN)w%qBsIIEJ`MQ)z%^x8`*e8^_YF1@3+;U8!j01=$|B>>ZO4T}#1(PN7;^V(%yIJ8kHnDrQsSWeu zU}0M3CCTr4UQcWPdK5OPKvhCj4Zt#RgcW??MBt$_d`GkJE38r zI18gN(a+=xmci$~&vv)XE-Y)GKaiY*v1CEmb^KPtI@Me`Ob?cZB#8CB`hFLe z`PL~+vR2=El#@BSWVHP7In`bghF$L3lDHVG$#8fj z>5D)n3Kt6*8Q6G))5ec<;>)n~OHkt$g+mS*i;@W<=S6XS4eNq8moTqa1sBB34Z<7+ z^!QulMxw4**a+ZU4Z*NV`|ye5>WaDrZgq=9I|y(wS8oH(DG*?k`gNIKcOfbv zdEibd1cwm8MV^a8@(nfaqV26Nd>H6l#CzYOK7xoGt5m`@48&$3y-t)vyj?K4LcHa! zHssZ8Oo(Vq80=;6)A0(8Hp7+_^CNFRGCJ^%Y^HBr9!nDvpY-K%Q)U?Em1gN&=2bn{ z#O~tS8ls77Yk(%Mt)7~=-n^!6E}uoFyID!Kq4J>_W{eVSU+_8$Y(crg_BF5z!*osT zTk$Z_J??>4yt&*s1mSJ+dD;JFP5owHh^UxR%AyggbjJ+U`q-$*GgmrR$NQ1Ju*1_-_3?1B!+pStm4$NigVc60lV({3rOfUH2hJ|aaYfU1r^Rvc5X06`HNWcW!zXlv%S#I*|lH5SH$!l|w z+PYz!ZC~4hiH~sfH~XG#V58!Jre#{b+FL5~>vvXIL{!4q z3A&rRI|@PI7jFu@^n1k;Pf(O4Zt7oT~4{Mj8B+W!arKrYQbKjH+L&Q8fNhwPjhT z?{`DH2exq6AOAo74qu88t}F{8PY$@dtE!jw&$vyCNu1uyggcfnQ}{ zCK544FoUraeOF?YH|zi%n)A|hw@j`1(?BfMn*QV>jnyGsWgLGB#tvoua;sYSwBK}n zQ?HhhBkZcaskDrhWtzM0DA;+QIHJflI~Q{d#=`gF*Kc8IaT;$|o1Tv9--lUJ4&h>n zSNU*AZSNbmH<&3MH%9fYo;;8Bq2thL+i8H-Y1_!k{`a)iZ8PAts|~r4wwk`zC$1&{ zpp5+*DS}9+7+x~Qos9TahT2jT&*51pXO(WvX6A}_iT1cPqNO!Gx5IaM+tsNnLbF%t zAh?QU7Z%5GN?|KTa9 zdTMTnVmbe8*f?=eNar#3V4Cc-%9N=mV^#AFTE2sh&768|-+*n>g{faW8;|- zXynukWINri(Lwb*wYH`o?gg=(`GYU@^ZlOtbUqIAs)gOP!+27V$GNHN!qC<6H`ImI z=hV{Gv4g*_=)SEc%8Zxcr0>(S&0^QNX>}CLS=;I)dF->QhdRpl`=TyJ3;)D*lZ_uI zP?CwwKC3kTgt|{12;b>;6tN7)hil>x4e8_U@aRHknKn&5za|*Y*iClEF?WmPZaC)W zm#7_U#}3HR!*~R9`o>*{8Bz=GuHDZQHE%eX7N9x3bkVcDFIzb91tx)FgLb-IMuwl!@~Nr*{)=9HSVAk?7Zt6z*7$ET%5 z>e$B=oOjGjsQk=3y5b`ANN44G)Gs_>ILa`!J6ZvIL@jzTIdv(UbfOgtSQ70vuVNje z^LoG&*sXh!@7BFI5T_eOFNLXbF9nlNd1@k3*gSZtANE>TzVv`^hckAuKRi{PUKdJ! zbQgb3oek%`ZaQIEZ|kEwFqe5C%zPFI#W~078=nO=eUn+ck%&TR*@ zC!?Lo5O+4KwU&m3o(0F~=k{6UWtHmA`ndip&@nSO5cIh-D822!H->S0>La!EmH2zd z?D*qF!w=EfW@jM7qHi=^iypLF+8g*iMWfnX_lW+6^ZThxHSyJ3#t!E@WZ*Q5_`s$g znB*ZyQgb5hV|J21b@6ZSMDyhVXq}cjALa+9LaaxZ+YTJ zw(=iTBn=iYHGnB_gE=5zSOmfN#PAfm!E6yQFBtF?0cLu+^QyxW%LUMW1ENwlM6(6V zuLhVBH<)azl%1{mZ;HLWo2GVl0S`wyp|JjM zhIK!qV!mqYn+f<{f$QOw+lFrG)~JX~!|c~$K`s8*=F`E)!sL=v_3+jtxrC@!x4ICt z@Q9kS4FolJ5u{jWt1I3LMKJM){pP$K6|q3{OAw{F_RF01g6ZnUw};?-$*s%cE9mlO zb@GV5s(D!tAE&F*?eC$6P#m1PdM39~Bgl+=sLu_D%@+39`Egs=-^Uh^1!~D(1ARN4 z@e#r;8yBBg&kIkN%geNFTiqjCP$pY$xRiX5sW0D0gZ3-XKw_05K7t|A_aktR`?^6v zfFUYag1}~Zl00vTJN5I%JE`Z)*3_r8P_=LOGDIh8&GxAN5eC+1VTd+5HWK|Bfe1rN zXYdZ^TyyVm&JlDtMEyFauWH``mSuIR2)p@lc*n?Y;e(ry8vYg)am7H0tBRC96{mhS zrl&j`_h($A_t|^-lK;-eU|e0YOrESZHir3j7P@qApNKmt<9o=ngVem8ZfCns$bmRK z+c_Hk#IkE33ygNTY$?pbO{QJR?D%unOyACmF1*@ZLw1)aM4oxpO##*ayKs2{JllKm zzMX5b;k3ntlc+v1P>>XGCYXz(j=Q>GW>2hAze=l=K2F{L-q^vNJF7{{0I9Llho3w}1EC@u%L1p(*B+M+CEIo^_XgD~_E(l2QB9!SftX=%?D z48|%YED?f;)~w-7$&9Fl?}u2W#G@L}BbWgbu>(EywyrHFO@CPQqwl2c7se`BjJw$? z&tbclBDDVTB=XB?(M=?T#>A4|@3w#V7@08pQ{l#$v1NCf{WUF{{i&fPqV3rcnWH(g zpyfY#=%EAPy|wV5Xv@1B_uWTgXB|a5X8I6D{KO2o;cCaMkJOZpW93=vRqMyGk@r-h zbuh4ccVPq5tTeW-?thVkS(CeoHd#rK9g-6uzPZx(Q6OxHGG+Op<-KP%_d1hbL|Fb9M z`QzWM`OHMRAQL&H7M3hiH#gtW>!%8##yAbQ{VYK#`hX^s*nk^)l~Dkd*}OChUs}V&Ii%_5T0<{`wEhEl|5N5UYnspT z{=fgUdj}8rp#SBpI`ksxUj5mW)kk9GpSP=Kyz;iGIY%N{cwKnJ$rQHLYGHEXOsPBa zMBvYDV)jB5lOgc`d11oOmkmWMq7Bz{ea=)}G6=5MFf5touJ2f0pY7?#Eo#P>frD4` z(`_+DS!l`bjE6IKh&}y{AW8`O0(K5=hgqCkrIvsB>evhVr6CY^+ec1H=5haQu*F7n zn;CjB3pcBUt)Gv*P$UL~b^W9rK%*I8X-=kLK-~I(D)D`(_^k#sTVbaxs^w=7wf^W# z`GS4*R}*|EMF2n^Bwetp`N&SxE|%FZtW-CD^`h^@KCITlvXlP(qHRJY&q^1zIw=`1 zR)QCH!${|K*-3f)QI6PrVL!@u8p`*I^1~>PHk6C~_zUeQUuGy@g_#f!|EpxE^V&j^ zE_67>I)0u$OR7*0yqsZG0$C3$0muBZz9)v{GHFOstE-N?3Mm7hzIw8KYj+lc28s@AB!7)VveP zYVQ*x<AxK96N`1!r=RV{M-SNlt;E1vnDlu zr`p^*Q8j;r`~7Ebj-2y~K@4^Sfy>m2Gt9Nuow=zm|2ikgU^dBHJNI{NbxyiVIaWD) z9L>3lq^RbzJ*PSMgKJv-#$KY$xki)<<5Y11AE)mmS5ufw;H(B>KyCKeh%(jUR2b-Kmd)VfhPw*GvDxzlpDy!tB?ba7vD#rcfDyBJn zq9R&j8U?kRYnA&?*JUf>Mr}QYa)azvTIF<`*!sUzn~Bw#(*pGGBjN@GFqdi>0qnjI z5c{z5Dm)+(LFA=6SPsQ?(=MHFFX#JsjpA(5EOi^3Y9JJ$p@jV{$vei(?jnw08%LH- ze&ht|Cps=2?TVq%5NEP&OzYSvsz&p}HZd6z{MCl@Vf|aUwbpbqXUuv>tt;>1PqJek=Kh8hV<(H2%RAUqsNp(&Y88m{Fd-hr!6S)}GT!U9_IC4F_C@`^gw zkq}_erJqi$%_9AbB|m4Y&5j|)lAjK&^(QW^eje1V)%0$y&Z1TL+Gf(5w5)9>k)i5d zkQHu~lU8B8_>N!F7^_5AP=%1OUcc-_{s1i?B-ZxJe!&~~ilix+3+yCGqhiR;*;CoQyDCUcBZJnuuZOk^}_Doo@7 z`G*y>!$hK{8g$`@RXPof1SYJBjvp#3o`_;s#Dp<&AL9@F4xMcS-()NkZ6au)2Z@?t zM7_g+I!Ay7{1?#NJB(k*0(eWuQ^&$fzFV|?5-(PbhB!=$v zA`cOXruQH(1YX`JCK!S}vnOroL83xBs}R4(q)Jw{Ol2p4nF}qQFL;yq$T;>j-0N*f zwa_eY5*5_q_Ukk)wAh;@1~b0_YS@LuVw`K1;ydx+nm37+PcETN-Xv5$eU!E$KjCbp zVR#L!%|yp{eC`UV)N$6?FJIQ`&c?8XqDU_hY(Sf{S7?q82@Q>9D+YZT(~^zYFEiEB zNlSbns@T4~PIIlGT>P4p=A&B>P_U^1TxZ@l(6o~GUwd`OHfX2l;9A=Qb&MHq;v7DTX>I0*dqh;!f?u{KvC#{Dr7vC-%L zhzNSpm)vf7*8a5*Z(PR@4*393m9D zf~X;CFN`u`ji{rv#Gl0a{;FvBqPEbQ0I2t`X4)A@B4fZj>6to*B+Owm}RyHQ9 z6oji*a;=lbUvmY{K?WL&oivI*21H!EP9OPJIr4zkN8~AIA8Y2(k^mCv`)jF&J93*w zuNdzw5lgOv%MM)Q1+Lk^by%Z!KwnH576J>N{#qw+4s*d7AAaRJIJa8m2)6wU9!8v{ zh2WL%ulu$35%0US9~I8s1$4k5gI`1#rdybweZoK8^d@U$LVvs*C*Y%D{Xek;2%*7g&0 zZV*YjJ9IpoD7 zNPdF~gs|NLf0|cF66l_xBp6QF-it)xRo9D5HU>#wSJL#}Bs%>1Ollv)Y6qfSVQ(@s z^0!WOA#MRANKOq1CbZ#Zauf9nCcgz<<;zM84agD&+ z&eD}3B+5wFvA(oDf~3*oAtW`VOWX`A{HA%L@_?{7l=QnE!13t< zped9@4!&CMq)j>Z-^7NWC7DhA!(54NTc8m;GmNB0T#wj!_z}buY7S*Fg}$tHj-{>t ze<8T-r~t?bCy~RiZg&#gbCFIkY$RJk-$2`so}xA3u0($|MI-u~@auEhTbkY+zMyKZwXxY(?mZRqwEq7jzIbZF%F&WDZWCUJIcajkhL3c-z5AM2F z!pf|&{}eVKm}x=)$yeSM>6+aM@6XPe6B)?@MssP>wK@ZgxPN|aCvAx$X|mr@dX>Fx z7imf~iI;7M=p_E$MoaOIw5<^4okjD)MP5V9;P)uq8cpt%Yo4V_4B9`xl;+(^!fAdC z2~AqVqnnCYtiln+LPc=RXpN_frIP-9mev6F_LsQ->#|@{%^?QI2P}Os&wW2XtA2Dl zE3fs6Cd1#=khmwfvc`zCkmNQVEt)Z9Jx87vocj?TQAYN z#hK_hatHz|6f^2N)$4_3*v%w#!tZQi_+Q_`{cEaN)!d-|$SY2!zBit>n@ObXbyPc& z4eCRtMEcp8*=0XhQTgC=(Xba~qpf7;t{oEG-aYNBC96qHC5;5nc1+GIU)KPd+oUvL%~Z z63EP6zh4j>x5A9VKYI+L^$BEytWKvni7?a--FT;4Wz$q@Pb87O9C=3Gqdb*vO?2HJ zIk1klCAylI&poL*iA2)azGM*Tqw=q%Vonvn|*3`P7hQZm`({yZAs*fF}l9^JN4z@7A8ipFdbuYS=kHaF~GJ|(S6Beto-~S>YYNS^)dKZ zT{@0x!A5T@aez%JBuRGkrIz9B_bJcfV7iYt?MQ)9aP+52Dj7-U(n+c0elJIpmHfVd z?oK7o#V_Gg##QS0Ib$dY^9)vUZ2>JwBZFo5@%l92e`hw`pN5s<)pKf1VhFvKMl!vm z94oncmS*)MX^`NF zcrE>Uqdgs4C7u}*9sAyC+}EER^kC^d$7t4_ajV+%BW-6@3(wMw zAtY%q!H;uZ*sJL-$uNWtH<)Wp0UGLsOK8Io*IxI)L2%T4UKmP}ycp)6uh8_N~`r1Jpt9{q6K zA5LGoiKG}O`FrbW%T2Dc@Vz7SGMc851~er?6m#9@fF6=ebi6l}S~D1YroRAY@PA)IYXRR&P6zyKCx8B)Nn21pLM}!*?hNP$vhqsgBLsgdZj5)=7HY}Fkma3L z^24XJFca*$cMNUIgu}cygnEwv+h(8b&R+R~m7F_DCyl^{-|X3R_XsGv$&9j8S~`hj z(fZz`SL1|{BugG{(hq|%hrb&G(h)nGmLa`dkSF2&J2Jv}H62o7z6thyS*0SFym~VkKv1fF0Y}&>?Xdv4Mp**Hn+Ie6I zXZyY|nncZJ5bT`A4YNm?m7HPUNy-(NS)`NBTT32?o!08iqZ&s1sscIlz8I<4o#16) z{BV-N#;)%cVTf{zu}3~c8zUsgSS%3F1>!y+r1lSnXueLndMo+%EZP~g5JO;|n^e!;>?_Ft`D&8jXWw z&Wi+v4Rw&&yG`e%-7i7WJ)V`EL_CExnR@dt;nZ<687X^TrCGVK&i{FoRaofCTykH$ zPk6SOZ3V`6R*jcDs#3KGrR!UL1 z|CHNa$7bTkKbKb~1GyEKXUK^uZ2Uu-eAq5FgI|l7D#S!iAUe5)q}{c4ir!u)D62jv zQHy{dU*cY8CG9cY%A^-~s`jUpUgUH9aQV zK?%-xlZR$vqgm5s?Lq^}mZ3~?D`RlN*f~vVRX?u(3=hAJfQt?M@`J$ZA#iY0YN6Q^ zNkrPJPZ^7tI3_xN4bTsi4G1(~5Jv42N!r*|OP%mnc3lUaTVc_mEIMS9k`r6iFTS02 zOe8mnAHT+LU+Wv_j0Egcd2&9~ClBTCrsQQA?UIzqBaggH*0pOu;5XDt{=I{Fv9XbU zup$4}SN`nqJdfeP9jrC9c@pC5leA+JxhZ6gfy3N-Sfr$rG~+gs(0`5AY0^n&r<40! zztgYQ)9TyE^Q4uA-%j2ot&PpMlT9S_%jwJ(<08ohVXNR!z8puZ^GH(YmocKQ#8Btc zxG#@9N8`l^wi?4Km4Pp?+|TA80wB_b^gQji!vJwmAgbGkBFGaF@(d0`gLmkDT`{Y4zwj$ z0g4M89zrt`*io18s0oQ+8|k_tLJrU1ng*B0VKnp3)k3>=mM|1&GF-hiElbGNaO+bg zfs5bJ*QBg_oSjW_?d*#muhW_4kGaoHFuQdY&N>@p9@2z2EQ)^?&C4f|Nneb^E;li# z47-s+tmKRLIb4x{3eu}+O+EtB4rjo4t&+AEk}wiXTk=Wh*njbu5qipJ>^uDuEUdR| zGxJFaDPp*WU?d@$X;hYdANClc@Re(y_3WO}5TGl&iwqxpr3xljziH*bJnyd)h-j#Q zp%xqs*18zdLEG*k@kxh1<#k-33Bh0hGoQlfBm^Uk*wDY2CQc)dlMY%xjYN*PvVs>& z{xw3!5q=!vUrND7Ln~`;k%kxs{@ZNu$Ja_)@S{bE@ier6m~H;sox0Pq7Dq;@aD!R@$lu0>DlV8$>>x9K8#GQTcU=n| zT!#~+@_f3ZfJDRw_@i;xX=Ba?(vh)8+#qfW2&NqcWYpk;F@lfyxkY^q9FVRJTrRSb zgX{Tm0cl}IO}5krSZU#OGD1E$h1O0dv9|=UB}W?@to>!Vh+jV^2V=B02iYZow#?DQ zt}_D{e#W7!-L32#y*eH1;a@_i-q%;1OPu@8AffrJD{P=q&wd$1qYL2! zf@xMEcHIo5U7SH13Q1_MfRmcw5SHyh$!B84FI~pSOl)K9sedL6b*0!y@P)OE8*`-^sV3HWvk?wnoA!J` zpD>i^1_a>2bw`rJ32mD};yi|Co15tQA`%`$@?-grfO3tfTHw;!N*iiPSkO?HSs;Z~ zH5Se!FA*}7*8how#r#2kA@9)iA`)o}#Oi%NTV;6{VM6lp!DzbmHc9*(DIdGtH^J=M zZRj~6eO%XaY~?tF-GRerM|ooVfpCit)5!6xN`pu7b1HQ%Z7CvQp1CmY9<+2eENU+G zm`#!cxZe@8LIXlg-fSHHD5&ROu4HQ|xWQz^g>ngi|nN92F z5F7cJM$aX&cLdgo-l44f*p(12DT{r`S2$L29?)rbW?&}Cem18pQs8#c4jVoD7N8w> zb7=PsUCHsbhmOp0iCoL&XqyLt9(ls{;R5Cy*wO-qUSX7RZ1$d$tmH#Jw@}9}>eqr2*!mAs#mHp%L^fhLiJp0^ zt!{q-6QemCsjLcZ1WYMla$R(p?44?-7w;o|y?AFn)I6WuAG>$z4G1c;lD$=Q^L#8q z_xjNN^U3YEH|=7?z-yUu)^`z8?n+FPzWr?^hFz_6BWBMjdf`5-s(YfJrge=q#UxCQ zU?;%r=j+&2IxhaMsnK*lSMxL4OIb)B0Y|GBl7)OydB5-ypHoT+d5>7s&JUyTTa>}{ zw-PcJ%cG)2sI<`XMUaMt)-8go`}?P~brE^ht7om1{CyX-KS1sc?5Qgt6nEDZ+W7#9 z4eY5a9V`!$3^r%7k!nrt$6e#hokAzq@zEDcSsJfWU z@=|h8KBn>VVse~#DcCh^oI%@`khHs{uH8q-*#g;Pp+NXDa7dHF7R|_;X0wi*p5<@b zpeI^~lCn~0IdtZ4YXuPvNaOV5L2Roj+mT+UmLBEYp?e-8akneYu+g%W>|o!!bl!id zlZI+Kq_pBK{BjbH<^j*XxfjlV9EI%AcchkC$#&S>GLjUyeG720{~3hH*UoUu|WIAnGie>rL1LD0!yqAmjY?}2L8A$)V6q<20g6*|rt^TnG zwLMJyGuaz|M5%N#@*Lk$_5uA=(!JcMprg9P%aaj9rSA?63 zOtT(_Cm*Jr%r@+!tuOghF$F<8_kK1z~94&&l-4pd#UxIExSRneo+qr-F=ULg$m z?~p=1Z>&S?Mq@yne3X1F|H8NE;_2s)VH@+U1=Rm>s8tXTjA3&it+$rbjK|6F__uD; zLe6dPV-jempX(hfnItSlK^DMO(wfJ~Eq#K9I_=;#{3n%e6v|NNZf^ z))}9jZk?4H;7i>)D>l^4|Pm zk8+w~gNm2a0vnl6N@2VROpay;9 z2$77q3f)2^mn&`)9lu=E#zJS>vCsZ=B?-u7j1ewEkE_aD?^q_3L1VMfAv}K&XBuV$ zY{nMPj3Uz+E7`n*HrX+Y%IFz888sqEQxAS%no!|%eVZ!{^fML3KVu21=Hmb#s?rh) zXi*j7>jG-8!d~X)kk!3IZ%?RzV6?Bo)H#;%M&_Ve-bm}9%-O*khpyAXRznBHS_j2i z2X8Du2ayS7?j2wXH(ALWh~QGlP|dUPAM{EnU_T-xe*Io&RWWUSl8n78XrGmAI>*VA zdP%%XW1Cx@A+6m9cu-e$pD5#BzfUOUWl64OwDc)lSly&8xiq*6?s311Ls9VZ}3flSMk`uHErVXWxT9!ezU5g5r zk+k8j4}*dX<)bg^#f^=2YM;Oj4MS`9N+@#;a9$^L_cC(pAU+_(=6O2Ni0k=)P{ws` zP*JaqdL5Lcf|{Qu;jqOU`8FLquR<+YgFyRAmy^K*dKuSXP|}S)n9Z=Q(#OIAD2z@^ zQEyh4Ok4HEqn=Hv4lofpuPosGXv-B2dlT4N zTTRA>2E!n|(%(r|FoLF6VrXYITyII0Hbrq&&SBOZW4#YeUqSYeeA=-BaY0li@yEPQ zc?P%G3usdvxzn=%?23NjHC)fJtS4UdpU;qN^yU3$Tw@G|I5zC1ll~0o;>Pkn!>j_) znw4aTj>!9EZYNS+#s*aZEqs~GVQ60_k3=xEkalOXmKx_6{a10CaV!|3ORLwy9n~oj9Gt40e4R{U7KiTXQO6zHbR(PX6I%fJO7d`0&dOPENk4n9;Oj!nm2Sq!;Q{H z%8kxO&FBCrGdc|E^^DHOMi`yd#0xvjL)yrhS;h zuzgSWp>?l9OI!v{xnbEzxnbGZ2*Z-*EnivLSokIh^u#ya8%r9;Qwp=;4|*T*<1?-Uv|y^-w-o+ z^Nn!~-sx5s;q6*5*sA3R?{D0Filmdq3#W zk#;;l$KNddzj(^c|2w!p#ASAj{{4}3Aj-g#izg3HA)aD9Wq9m(R^q9}vk?yne`GhF z{df*LelIsSmUWOzCfgfx9lyT;L@tkenS1`f!MoSrINw9-cy427Ct2-z`@QBliytU^ zaB&HHKUDVM(m7>|A2iQh{J=ac#-y?1#$LaCa(@2g+stXMA4#H3mq>8qq+dv>2MzBf zM@J7RD=%Y+=FclDUi?tm1G5*+lVI_szH=q1(fcadAJPc8sUDH@%n!_a#Jp(UqQwtB ziu!?b=RG_SIV2mu43#H(*wku=V|AUwp(3JRZPngthcnOWcs zB=NN4eMUT&@z(P!&B~Fl-D-F;95%7(+7i5hthN~MYKLP(G~RW1SK!^?aJ;-5?|lwOJ@AlLhhqyo znk+dS4XBr`4#zvSco#Yxe;ot>xzyp<3B+;1`&^9gYw4@Q!vk{^5_e z#o^fJL0h8b__Uu}K^S29N5NkZx8g8YqhsU|X{(En@4&-8488_~ zVlZb|0X`Ny8!qa+3T;4o#1hZ%KPA9p%x6c3T~ew}%?a3XpCB!*Xa{tbDh;V=KLk_IG@c zf;M12|6m+)fy42E9l0i6!fBOD9F9G}FYPvz*--}mNS6&|YaEWIowPJguAwz?a_Rr; zpS%~$a%ez^S&>7E@YLg>31)eqe5{G)o8_BG16^sBpB&ZMp^(l_JQwg>#&cC6KjH_{ ze)Ptp;0ebQjVBRLI-a3;vhd{K$!(m}M~)(NVZ1y--f)<{5iiHeFK5wD`1>UNmc8ps zXpaQ;Zl%fWy{Vku%HCVH)A{WEmwNg%d%syt-(c^zs_7@}y*-P5%indhM)Vd$)PeH~71je$rQdPCnL2rzOdKyfz$G$je!cPbA4fCXu0QQ|0--FM|y) zpM=;iHro2jJ7oG^x_q0LR!Rf=%k#ZnKB6F145f;_4b%Rx)-V(_erJ~&K1fA_09p>Cdw2?X+LE|MOP z@uY>7-p`V+r?BK~mV9M91E}Z8VwQY?Cx^1+ODy?X9fO_1OUvkc!{uFGo5~de`8;-$ zyu)i#1y2vlkbm;pv=KCHrTsJIFt1JfkZz_EGG&X`8yyPS>`m>gd^0p>vze~Xl*fB* z2JbdspdFcVme-c;3W2N#jF6i|y79sYIhlC5LiCbk9sVfleDGS9-m8rbzV4k{K&Jy8Jy-fW}i zN6TReTQR7uYap-w0QAD$Y9u!TP-TEy*WlSoQ*-3WUfY@!vTZ+oB1gX2_bt${Jxh{; zzt;rflino|t%^Q51_Eg)Vm#ymc{`EO!3FZR!b-V7{@TfsTp(}nV*p$rZkhho7&&JBpUT@W4z_s+;SotNd?a;gJb@aKL<PoQl#%MS+mZqjHkVeMHxy);gKAYn&z5bSv^IJlC?B!Q@nPxDFn0c_$?5WNN>DVo-h9`j|Sk|xn4V<1v@U# z0akg6@86)Ud*(_~R7;oaHqnXWWj`;irm=9m97gWmRn$x8+s-pcYJA(-#7a5e-p^r4 z&bOWE41n{kaU)A|zBMuonj*g!%wRd+8XM?=3GzF>d%%;A>m(`el!1&1lR(CvVph|5 z&m_88QYodtrcv(X5Q`MkdIXg=%r({P1+nnHh_D(~_7 z4BdXVkM6lkp6UBpGt%%7rWs5N!|14K@?qc4LFAXYSd9*JVy4FnFcz(*@q7WkntS)5 zNf4)|iU%u@)L42jpOtc!9!X?L&eE0|2EbX`;?0trr3d%1Bv-{RBnHb_+7e9fh41tF zG8bet;3})!rl%eE$e((B2~B}*{k)KsYw3m=@>#FeQiZ_QzC07066uF$$!C3!rYq#D zL^%6EHk?TEfZ_jt-uJPfQHy$J&u@M^Ko9I{l-!S%m`DMpoodvm}So zZ|^iEc!nNEvax5rDVL-|W4bz z*^c1XOt(%mC19>diBIE?{vj%n!|CN|roRpX3-B>Xl0SQcCGG5ud;oj%;cEFnk*EJI zFxB+IP&iaLFEu4JhWPx5YDIo;Hg1Tm}xoQuSJwqis;Q8z&W-ddm1tMd3_S9QMg8W}0H-bK$I|QkZHGV|q)o&m_8+%=3R! zq)+zK-GH-I0#42qa2*isT(t85kHgUJiX!c9LH4Rv@8P9Lza*lb`3T_kh{JCSmmpst z@)l-!VaoPv{di=upa%6FB0okk^;wC0J@AL1{T+&p{HYTKWdgxmh1}B&E?pM+rKsZ{ z!2JjzO zPI-K<;5TE?Kp*k%;Lv`wVH^S>o}P;IEt8ud$P=*IN9)itMImFD95Xb6JQ07~)r#hu zMcy_AKa-pefJveNVZ*UJxMNst*=P3RsMZ=2Zz6 zvk|5U0%{a#P7B~GME+%k46R09uivXkKZ0PXP}Cn$q{|nO7b5h6k|!{caE?I!Jvfie_pO@Lwv@fh^Pu zrRs53AyKToAjsPTY5pMt-H% zq4yGnY+xKH*5$Pl6(~VgMdO>wRE|9zb57H9oltnbisr7Hb3WnWm88 zjG)6dQLsRf8o)wX68TDn<(O|PCGv9he+ExS( zi4pt0t4PE1QQs`!_bAf+IjHv+`Oi?tKZ1Z`u!Kwz?V=vOrMZLYpU_gj9my-bN}@UDP}TW zChB)7($DBnH$?sifsnxq9rFJM@xVTGm@eQiD5Rzo926oBz!t#m9e~&K@$mmykRdT^ z4Fa-J$v?>B6L32&;9}ayE!qeJutPHk1d&n!Uj*;TL}C$nyCU6c0eqpzW52;Tpny6M zd=l`2;DGHmh1@n21^Y#Ve}aW`4FCsRBbb0Am_`_Zcc~!gYrygk+T#;&9@{k)5J`r{ z!GOz(^m!HtZr1Pzdg5PZGe8j!1loElBqbUKW3vG0r%3-aqk+)Uz+sB?B^zOls2{~z zvyawcAlzv@SgwyK@E%3-4+aMWhXU`@c6U6tYXk)@hDc#YbZ2A>d=fG(2Li#uz*>f! zeMAR;K?jgwR|kkp5nrlo3V6spli zK^inDqiLHeHUtxengGI~QJ@!;UusIxi3SwgRQUrd)6y|*Xoq$vP^%-gnN}H`i8d|N zVQQvD#gVoQ?dN&lec|l$M|i*Q?z7MCKKtym&vTb>@#|oxpgY+TtQV8np5DO#x@y8y zNWXV3Z}$xd$Hq}yNwHndh)>1mQV(qhf1_DH|yKC$T9M2+h|0zvO+dA3s#UX?M*6+~+Tw(y3y$PSByxSD=(D zr8kFh*iNO_vYCv-uX9{_wb$D)`nWa7yvlQ1B%DIbAlTePVCxfzD}G4CE_{3%7s zz)5GA7gL6H0CM*&%wbT$M95t3Ud;6P^hg*B+!U$6$mhiTg8l`keR+|YVm4uMa1e>y zOprT|HY)uNF|*zN9~?d--C_>3!Jw%!LdBBl$s2%@>+f(Ql6;sN5%j%bHB#NLAfK@Au=&XlwwK%+iF5qhZ; z=q%=75-mbO=OOh#G{v*mkVlJ7$3xB_M<+<5v&1&IIbZLO7hS+JAw!skKLF#(fL4&4@%r=jxwr?r_uf^Q91_P3c-$S9iDJlC< z%nufxHy~C3-375uNi51&(9?tZB5q8Kb==esR*%H6sMgK7DJgKNHg>)HtO=;AAU03z zx7?hb@D+%07ECw;7Atl&rJIsqKv#n8QS8RcJr3|19cVE=COS68gQm*Z&n1*9b`%sK zj$#Mhrvohe0e>0B*sR8PKpxQn#~rV0D(@d+&Nkt(Lq5IyLZ2GYbLACOKxcTVnXCMA zvCEEwXKM#`uiqR7Ymk-C;^dRe!&v;>A?A38@-M+cCr@Lbe4W@!`%xgEKg)*z#MlLm zo&h;i{-W5Gya?vBoXe`KodUW{$|=d*UE?`{V`9TD$Xa#46YOSAp?!);-R=WJv)T7h zdiu+CZh7|&jV zPK%%N{^5s@6H~EpCQ$c+M73BM1Zxl`*o?k{0oL)etP=~wT;@D_O85W7w<$75c+sc~ zobLzg>7WWFHbe884oIr~sE`-Cl>aAU?|{c@%p^#yAMJ*|Kl8s<>c}1_r3>DIUKO|eb zZ^C#Dep&7 z)jWF*I<4|4E-0MKb(vLC^VQ+e3trRy9Niu%&Qp*JilHkQKZx?m_qp+CLBLkOLz3I` zrx0k@D5h?ozW}VOBFS$G`^{G%$(74j@Q&sndIRf)6WwpO~>Cum)A~bunvExZo|Nzvq9_#mUCI{Xvbpi%mr&TRt?_UF+uk<^)v#AG(ojZ)j;>yqVeA0QKQ8D)e8Mpq=31B}S-I}M+ClYE};28WUuKKrob`1fv z>i@ehsIC%IAq=PnRezDA-7Xk4CaOtf*Y5-O`wCR^5k@Xk$P2Zg`eACmX<(hRY7Q3v zbOKc4YU06fs=xtixB=cQRDq=Cm%-eWdQ(vSj@WAC1u<0p2_;?%ew9~aB^S!L0aSsS z3hr{9LYn()xQJx=o=Y_RdZX=eE>{a{$Yg(K-501uHOs~SdQ+3HPz~FArUm{${uVJW zogp=MDSf-=e>Z|}QO%Dy>Ffm#E5pyk-rfe*Ij?yWfvw;`;4u=H8(^{WpJ8)yEA!a=1! z2_1pw=))8&PC>o(N>TO3PlDCr6g8n4!2`OAa;bO4{rNL9Mdu_nNsTv2heJ95XT7#< zXxyy$Ecb-Vp{t8)%RifHYsqxm2hUqrdyUw{I0m)*{cGFAcBjDpcsWx`!BD>$fm)~6 z-j6`%LbbToEvuqDJS^r#6r3t5@W*1VX4w@43b|{z-Ff`)kO#WJeae4K?1M}(CnvDY5rg$7-Es+b;J7+f-?!vx(l1ZdEulVaC^tcbhob6TtT&Lf_fI*^49}v5v z4u17W8VlcX3ZM3uVfsS}O(O;hT>;6#CH*Nhuetr7mbpO8+yMkE_Xo%%*zHb1s8h^& z-F?r+=(^4{3x6K-yhWM0@H>S9e!hXxfC0gNpLvK6BpShcR34kvO=p<0&AR_*c2PF( zgP~0s_{8Jw^$bv~__u7&U3g$b@i?jZF!UXYPtezEU|Qxslw5nD@Ac_*Y-W!*11A)h z@F5rS{mq1uxQ-~!M8P^|b<~8JHFUK_f~&KUjtcS5IZbe8`e88j z^#$c~x)*f>^6y@?Vnz4TY)9|1uF*R;h0fZcyB-TAKf}`5+p(mh*ONcm_gLsi;plx^ aLU$C69)2eD=g{cyo(;V)W$4l2Q09MO<@5dk diff --git a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c index 0ff446401..0648b116b 100644 --- a/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c +++ b/slsDetectorSoftware/eigerDetectorServer/slsDetectorFunctionList.c @@ -56,118 +56,121 @@ int dst_requested[32] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 int default_dac_values[16] = {0,2480,3300,1400,4000,2556,1000,1000,4000,1000,1000,1000,1000,200,2000,1550}; -enum masterFlags masterMode=NO_MASTER; -int bottom = 0; -//enum masterFlags trialMasterMode=NO_MASTER; +enum masterFlags masterMode=IS_SLAVE; +int top = 0; +int master = 0; + int initDetector(){ - int imod,i,n; - n = getNModBoard(1); + int imod,i,n; + n = getNModBoard(1); - printf("This is the EIGER Server of revision %llx\n", getDetectorId(DETECTOR_SOFTWARE_VERSION)); + printf("This is the EIGER Server of revision %llx\n", getDetectorId(DETECTOR_SOFTWARE_VERSION)); - //#ifdef VERBOSE - printf("Board is for %d half modules\n",n); - //#endif + //#ifdef VERBOSE + printf("Board is for %d half modules\n",n); + //#endif - detectorModules=malloc(n*sizeof(sls_detector_module)); - detectorChips=malloc(n*NCHIP*sizeof(int)); + //Allocation of memory + detectorModules=malloc(n*sizeof(sls_detector_module)); + detectorChips=malloc(n*NCHIP*sizeof(int)); - detectorChans=malloc(n*NCHIP*NCHAN*sizeof(int)); - detectorDacs=malloc(n*NDAC*sizeof(dacs_t)); - detectorAdcs=malloc(n*NADC*sizeof(dacs_t)); + detectorChans=malloc(n*NCHIP*NCHAN*sizeof(int)); + detectorDacs=malloc(n*NDAC*sizeof(dacs_t)); + detectorAdcs=malloc(n*NADC*sizeof(dacs_t)); #ifdef VERBOSE - printf("modules from 0x%x to 0x%x\n",detectorModules, detectorModules+n); - printf("chips from 0x%x to 0x%x\n",detectorChips, detectorChips+n*NCHIP); - printf("chans from 0x%x to 0x%x\n",detectorChans, detectorChans+n*NCHIP*NCHAN); - printf("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs+n*NDAC); - printf("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs+n*NADC); + printf("modules from 0x%x to 0x%x\n",detectorModules, detectorModules+n); + printf("chips from 0x%x to 0x%x\n",detectorChips, detectorChips+n*NCHIP); + printf("chans from 0x%x to 0x%x\n",detectorChans, detectorChans+n*NCHIP*NCHAN); + printf("dacs from 0x%x to 0x%x\n",detectorDacs, detectorDacs+n*NDAC); + printf("adcs from 0x%x to 0x%x\n",detectorAdcs, detectorAdcs+n*NADC); #endif - for (imod=0; imoddacs=detectorDacs+imod*NDAC; - (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; - (detectorModules+imod)->chipregs=detectorChips+imod*NCHIP; - (detectorModules+imod)->chanregs=detectorChans+imod*NCHIP*NCHAN; - (detectorModules+imod)->ndac=NDAC; - (detectorModules+imod)->nadc=NADC; - (detectorModules+imod)->nchip=NCHIP; - (detectorModules+imod)->nchan=NCHIP*NCHAN; - (detectorModules+imod)->module=imod; - (detectorModules+imod)->gain=0; - (detectorModules+imod)->offset=0; - (detectorModules+imod)->reg=0; - /* initialize registers, dacs, retrieve sn, adc values etc */ - } - thisSettings = STANDARD;/**UNITIALIZED*/ - /*sChan=noneSelected; + for (imod=0; imoddacs=detectorDacs+imod*NDAC; + (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; + (detectorModules+imod)->chipregs=detectorChips+imod*NCHIP; + (detectorModules+imod)->chanregs=detectorChans+imod*NCHIP*NCHAN; + (detectorModules+imod)->ndac=NDAC; + (detectorModules+imod)->nadc=NADC; + (detectorModules+imod)->nchip=NCHIP; + (detectorModules+imod)->nchan=NCHIP*NCHAN; + (detectorModules+imod)->module=imod; + (detectorModules+imod)->gain=0; + (detectorModules+imod)->offset=0; + (detectorModules+imod)->reg=0; + /* initialize registers, dacs, retrieve sn, adc values etc */ + } + thisSettings = STANDARD;/**UNITIALIZED*/ + /*sChan=noneSelected; sChip=noneSelected; sMod=noneSelected; sDac=noneSelected; sAdc=noneSelected; -*/ + */ - Feb_Interface_FebInterface(); - Feb_Control_FebControl(); - Feb_Control_Init(); - printf("FEb control constructor done\n"); - Beb_Beb(-1); - printf("BEB constructor done\n"); + //Feb and Beb Initializations + getModuleConfiguration(); + Feb_Interface_FebInterface(); + Feb_Control_FebControl(); + Feb_Control_Init(master,top); + printf("FEB Initialization done\n"); + Beb_Beb(); + printf("BEB Initialization done\n"); - //get dac values - int retval[2]; + //Get dac values + int retval[2]; for(i=0;i<(detectorModules)->ndac;i++) setDAC((enum detDacIndex)i,default_dac_values[i],(detectorModules)->module,0,retval); - /* initialize dynamic range etc. */ - - - //set number of frames to 1 - setTimer(FRAME_NUMBER,1); - setTimer(ACQUISITION_TIME,1E9); - setTimer(FRAME_PERIOD,1E9); - setDynamicRange(16); - setThresholdEnergy(8000,0); - setReadOutFlags(PARALLEL); - setSpeed(0,1);//clk_devider,half speed - setHighVolage(150,0); - setIODelay(675,0); - setTiming(AUTO_TIMING); - //setMaster(GET_MASTER); - int enable[2] = {0,1}; - setExternalGating(enable);//disable external gating - - Feb_Control_SetTestModeVariable(0); - - Feb_Control_CheckSetup(); - - //top or bottom - bottom = Feb_Control_IsBottomModule(); - /*if(getDetectorNumber()==0xbeb031) - bottom = 0; - else bottom = 1; -*/ - if(bottom) - printf("BOTTOM ***************\n"); - else - printf("TOP ***************\n"); - - - //if(getDetectorNumber()==0xbeb031){ - // printf("************** master ********************\n"); - // trialMasterMode = IS_MASTER; - //Feb_Control_Set_Master(); - // } - //else printf("************** slave ********************\n"); - - - - - return 1; + //setting default measurement parameters + setTimer(FRAME_NUMBER,1); + setTimer(ACQUISITION_TIME,1E9); + setTimer(FRAME_PERIOD,1E9); + setDynamicRange(16); + setThresholdEnergy(8000,0); + setReadOutFlags(PARALLEL); + setSpeed(0,1);//clk_devider,half speed + setHighVolage(150,0); + setIODelay(675,0); + setTiming(AUTO_TIMING); + //SetPhotonEnergyCalibrationParameters(-5.8381e-5,1.838515,5.09948e-7,-4.32390e-11,1.32527e-15); + //SetRateCorrection(0); //deactivate rate correction + int enable[2] = {0,1}; + setExternalGating(enable);//disable external gating + Feb_Control_SetTestModeVariable(0); + Feb_Control_CheckSetup(); + printf("\n"); + return 1; } +int initDetectorStop(){ + getModuleConfiguration(); + Feb_Interface_FebInterface(); + Feb_Control_Init(master,top); + printf("FEB Initialization done\n"); + /* Beb_Beb(-1); + printf("BEB constructor done\n");*/ + + printf("\n"); + return 1; +} + + + +void getModuleConfiguration(){ + int *m=&master; + int *t=⊤ + Beb_GetModuleCopnfiguration(m,t); + if(top) printf("*************** TOP ***************\n"); + else printf("*************** BOTTOM ***************\n"); + if(master) printf("*************** MASTER ***************\n"); + else printf("*************** SLAVE ***************\n"); +} + + int setNMod(int nm, enum dimension dim){ return 1; @@ -183,7 +186,7 @@ int getNModBoard(enum dimension arg){ int64_t getModuleId(enum idMode arg, int imod){ -/**/ + /**/ return -1; } @@ -215,16 +218,16 @@ int64_t getDetectorId(enum idMode arg){ int getDetectorNumber(){ int res=0; - char hostname[100]; - if (gethostname(hostname, sizeof hostname) == 0) - puts(hostname); - else - perror("gethostname"); - sscanf(hostname,"%x",&res); - return res; + char hostname[100]; + if (gethostname(hostname, sizeof hostname) == 0) + puts(hostname); + else + perror("gethostname"); + sscanf(hostname,"%x",&res); + return res; -/* + /* char output[255]=""; int res=0; FILE* sysFile = popen("hostname", "r"); @@ -232,18 +235,18 @@ int getDetectorNumber(){ pclose(sysFile); sscanf(output,"%x",&res); return res; -*/ + */ /* int res=0; char hostname[100] = "beb000"; sscanf(hostname,"%x",&res); return res; - */ + */ } u_int64_t getDetectorMAC() { - /* + /* char output[255],mac[255]=""; u_int64_t res=0; FILE* sysFile = popen("ifconfig eth0 | grep HWaddr | cut -d \" \" -f 11", "r"); @@ -259,8 +262,8 @@ u_int64_t getDetectorMAC() { sscanf(mac,"%llx",&res); printf("mac:%llx\n",res); return res; - */ - return 0; + */ + return 0; } int moduleTest( enum digitalTestMode arg, int imod){ @@ -379,9 +382,9 @@ int enableTenGigabitEthernet(int val){ int setModule(sls_detector_module myMod){ int retval[2]; -//#ifdef VERBOSE + //#ifdef VERBOSE printf("Setting module with settings %d\n",myMod.reg); -//#endif + //#endif int i; for(i=0;i= 0) EigerSetNumberOfExposures((unsigned int)val); return EigerGetNumberOfExposures(); @@ -648,9 +649,9 @@ int64_t setTimer(enum timerIndex ind, int64_t val){ if(Feb_Control_SetNExposures((unsigned int)val*eiger_nexposures)){ eiger_ncycles = val; //SetDestinationParameters(EigerGetNumberOfExposures()*EigerGetNumberOfCycles()); - on_dst = 0; - int i; - for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested + on_dst = 0; + int i; + for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested nimages_per_request = eiger_nexposures * eiger_ncycles; } }return eiger_ncycles; @@ -678,12 +679,12 @@ int setDynamicRange(int dr){ if(Feb_Control_SetDynamicRange(dr)){ //EigerSetBitMode(dr); - on_dst = 0; - int i; - for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested - if(Beb_SetUpTransferParameters(dr)) - eiger_dynamicrange = dr; - else printf("ERROR:Could not set bit mode in the back end\n"); + on_dst = 0; + int i; + for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested + if(Beb_SetUpTransferParameters(dr)) + eiger_dynamicrange = dr; + else printf("ERROR:Could not set bit mode in the back end\n"); } } //make sure back end and front end have the same bit mode @@ -714,7 +715,7 @@ enum readOutFlags setReadOutFlags(enum readOutFlags val){ default:ret=-1; break; } - return ret; + return ret; } @@ -748,17 +749,17 @@ int configureMAC(int ipad, long long int macad, long long int detectormacadd, in sprintf(src_ip,"%d.%d.%d.%d",(detipad>>24)&0xff,(detipad>>16)&0xff,(detipad>>8)&0xff,(detipad)&0xff); sprintf(dst_ip,"%d.%d.%d.%d",(ipad>>24)&0xff,(ipad>>16)&0xff,(ipad>>8)&0xff,(ipad)&0xff); sprintf(src_mac,"%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int)((detectormacadd>>40)&0xFF), - (unsigned int)((detectormacadd>>32)&0xFF), - (unsigned int)((detectormacadd>>24)&0xFF), - (unsigned int)((detectormacadd>>16)&0xFF), - (unsigned int)((detectormacadd>>8)&0xFF), - (unsigned int)((detectormacadd>>0)&0xFF)); + (unsigned int)((detectormacadd>>32)&0xFF), + (unsigned int)((detectormacadd>>24)&0xFF), + (unsigned int)((detectormacadd>>16)&0xFF), + (unsigned int)((detectormacadd>>8)&0xFF), + (unsigned int)((detectormacadd>>0)&0xFF)); sprintf(dst_mac,"%02x:%02x:%02x:%02x:%02x:%02x",(unsigned int)((macad>>40)&0xFF), - (unsigned int)((macad>>32)&0xFF), - (unsigned int)((macad>>24)&0xFF), - (unsigned int)((macad>>16)&0xFF), - (unsigned int)((macad>>8)&0xFF), - (unsigned int)((macad>>0)&0xFF)); + (unsigned int)((macad>>32)&0xFF), + (unsigned int)((macad>>24)&0xFF), + (unsigned int)((macad>>16)&0xFF), + (unsigned int)((macad>>8)&0xFF), + (unsigned int)((macad>>0)&0xFF)); printf("src_port:%d\n",src_port); printf("src_ip:%s\n",src_ip); @@ -775,27 +776,27 @@ int configureMAC(int ipad, long long int macad, long long int detectormacadd, in int i=0; /* for(i=0;i<32;i++){/** modified for Aldo*/ - if(Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && - Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) - printf("set up left ok\n"); - else return -1; - /*}*/ + if(Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && + Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) + printf("set up left ok\n"); + else return -1; + /*}*/ header_number = 32; dst_port = udpport2; printf("dst_port:%d\n\n",dst_port); - /*for(i=0;i<32;i++){*//** modified for Aldo*/ - if(Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && - Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) - printf("set up right ok\n\n"); - else return -1; + /*for(i=0;i<32;i++){*//** modified for Aldo*/ + if(Beb_SetBebSrcHeaderInfos(beb_num,send_to_ten_gig,src_mac,src_ip,src_port) && + Beb_SetUpUDPHeader(beb_num,send_to_ten_gig,header_number+i,dst_mac,dst_ip, dst_port)) + printf("set up right ok\n\n"); + else return -1; /*}*/ - on_dst = 0; + on_dst = 0; - for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested - nimages_per_request=eiger_nexposures * eiger_ncycles; + for(i=0;i<32;i++) dst_requested[i] = 0; //clear dst requested + nimages_per_request=eiger_nexposures * eiger_ncycles; return 0; } @@ -947,8 +948,8 @@ enum externalCommunicationMode setTiming( enum externalCommunicationMode arg){ void setExternalGating(int enable[]){ if(enable>=0){ Feb_Control_SetExternalEnableMode(enable[0], enable[1]);//enable = 0 or 1, polarity = 0 or 1 , where 1 is positive - eiger_extgating = enable[0]; - eiger_extgatingpolarity = enable[1]; + eiger_extgating = enable[0]; + eiger_extgatingpolarity = enable[1]; } enable[0] = eiger_extgating; enable[1] = eiger_extgatingpolarity; diff --git a/slsDetectorSoftware/eigerDetectorServer/xparameters.h b/slsDetectorSoftware/eigerDetectorServer/xparameters.h index 06eed3092..b6ef24bcc 100644 --- a/slsDetectorSoftware/eigerDetectorServer/xparameters.h +++ b/slsDetectorSoftware/eigerDetectorServer/xparameters.h @@ -49,6 +49,8 @@ XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT_BASEADDR #define XPAR_PLB_GPIO_SYS_BASEADDR 0xD1000000 #define XPAR_PLB_GPIO_SYS_HIGHADDR 0xD100FFFF +/* Master Slave Top Bottom Definition */ +#define MODULE_CONFIGURATION 0x84 /* Definitions for peripheral PLB_GPIO_TEST */ #define XPAR_PLB_GPIO_TEST_BASEADDR 0xD1010000 @@ -60,7 +62,7 @@ XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT_BASEADDR #define XPAR_PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_LEFT_HIGHADDR 0xC410FFFF /* Definitions for a new memory */ -#define XPAR_PLB_LL_NEW_MEMORY 0xC4200000 +//#define XPAR_PLB_LL_NEW_MEMORY 0xD1000000//0xD1000084//0xC4200000 /* Definitions for peripheral PLB_LL_FIFO_AURORA_DUAL_CTRL_FEB_RIGHT */ diff --git a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp index bcd2e7a54..a04b6e03d 100644 --- a/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp +++ b/slsDetectorSoftware/multiSlsDetector/multiSlsDetector.cpp @@ -4542,7 +4542,7 @@ int* multiSlsDetector::readFrameFromReceiver(char* fName, int &fIndex){ return NULL; } - int n; + int n,complete=OK; int i,k,offsetX, offsetY, maxX, maxY; double dr; int* retval=new int[nel]; int *retdet, *p=retval; @@ -4560,42 +4560,45 @@ int* multiSlsDetector::readFrameFromReceiver(char* fName, int &fIndex){ retdet=detectors[id]->readFrameFromReceiver(fName,fIndex); if(detectors[id]->getErrorMask()) setErrorMask(getErrorMask()|(1<getDataBytes(); - - if(getDetectorsType() == EIGER){ - //cout << "fname:"<getMaxNumberOfChannels()<<" n:"<getMaxNumberOfChannels(); - //cout << "dr:"<getMaxNumberOfChannels(X)*dr);//bit mode - //cout << "k:"<offsetY[id] + detectors[id]->getMaxNumberOfChannels(Y))) * maxX)*dr);//bit mode - offsetX = (int)(thisMultiDetector->offsetX[id]*dr); - //cout << "offsetY"<getDataBytes(); + if(getDetectorsType() == EIGER){ + //cout << "fname:"<getMaxNumberOfChannels()<<" n:"<getMaxNumberOfChannels(); + //cout << "dr:"<getMaxNumberOfChannels(X)*dr);//bit mode + //cout << "k:"<offsetY[id] + detectors[id]->getMaxNumberOfChannels(Y))) * maxX)*dr);//bit mode + offsetX = (int)(thisMultiDetector->offsetX[id]*dr); + //cout << "offsetY"<= 0) { +#ifdef VERY_VERY_DEBUG + cout<<"GOT data"<