From 1fae912cb2e5b40e9ea669da6303e2e509310f1e Mon Sep 17 00:00:00 2001 From: Dhanya Maliakal Date: Thu, 4 Feb 2016 16:18:01 +0100 Subject: [PATCH] jungfrau server making it uniform, left to do: register confirmation and server_defs --- .../commonFiles/communication_funcs.c | 97 ++- .../commonFiles/communication_funcs.h | 5 +- .../jungfrauDetectorServer/Makefile | 2 +- .../jungfrauDetectorServer/firmware_funcs.c | 42 +- .../jungfrauDetectorServerTest | Bin 125656 -> 127828 bytes .../jungfrauDetectorServer/mcb_funcs.c | 55 +- .../jungfrauDetectorServer/registers_m.h | 30 +- .../jungfrauDetectorServer/server_funcs.c | 328 ++++---- .../jungfrauDetectorServer/trimming_funcs.c | 765 ------------------ .../jungfrauDetectorServer/trimming_funcs.h | 20 - .../slsDetector/slsDetector.cpp | 15 +- 11 files changed, 276 insertions(+), 1083 deletions(-) delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/trimming_funcs.c delete mode 100755 slsDetectorSoftware/jungfrauDetectorServer/trimming_funcs.h diff --git a/slsDetectorSoftware/commonFiles/communication_funcs.c b/slsDetectorSoftware/commonFiles/communication_funcs.c index 1e7a72d39..a42371570 100755 --- a/slsDetectorSoftware/commonFiles/communication_funcs.c +++ b/slsDetectorSoftware/commonFiles/communication_funcs.c @@ -403,7 +403,13 @@ int sendChip(int file_des, sls_detector_chip *myChip) { return ts; } + int sendModule(int file_des, sls_detector_module *myMod) { + return sendModuleGeneral(file_des, myMod, 1); +} + + +int sendModuleGeneral(int file_des, sls_detector_module *myMod, int sendAll) { int ts=0; #ifdef VERBOSE int idac; @@ -421,11 +427,12 @@ int sendModule(int file_des, sls_detector_module *myMod) { ts+=sendData(file_des,&(myMod->nadc),sizeof(myMod->nadc),INT32); ts+=sendData(file_des,&(myMod->reg),sizeof(myMod->reg),INT32); ts+=sendData(file_des,myMod->dacs,sizeof(myMod->ndac),OTHER); -#ifndef JUNGFRAU_DHANYA ts+=sendData(file_des,myMod->adcs,sizeof(myMod->nadc),OTHER); - ts+=sendData(file_des,myMod->chipregs,sizeof(myMod->nchip),OTHER); - ts+=sendData(file_des,myMod->chanregs,sizeof(myMod->nchan),OTHER); -#endif + /*some detectors dont require sending all trimbits etc.*/ + if(sendAll){ + ts+=sendData(file_des,myMod->chipregs,sizeof(myMod->nchip),OTHER); + ts+=sendData(file_des,myMod->chanregs,sizeof(myMod->nchan),OTHER); + } ts+=sendData(file_des,&(myMod->gain), sizeof(myMod->gain),OTHER); ts+=sendData(file_des,&(myMod->offset), sizeof(myMod->offset),OTHER); @@ -438,21 +445,22 @@ int sendModule(int file_des, sls_detector_module *myMod) { for (idac=0; idac< nDacs; idac++) printf("dac %d is %d\n",idac,(int)myMod->dacs[idac]); #endif - -#ifndef JUNGFRAU_DHANYA ts+= sendData(file_des,myMod->adcs,sizeof(dacs_t)*nAdcs,INT32); #ifdef VERBOSE printf("adcs %d of size %d sent\n",myMod->module, ts); #endif - ts+=sendData(file_des,myMod->chipregs,sizeof(int)*nChips,INT32); + + /*some detectors dont require sending all trimbits etc.*/ + if(sendAll){ + ts+=sendData(file_des,myMod->chipregs,sizeof(int)*nChips,INT32); #ifdef VERBOSE - printf("chips %d of size %d sent\n",myMod->module, ts); + printf("chips %d of size %d sent\n",myMod->module, ts); #endif - ts+=sendData(file_des,myMod->chanregs,sizeof(int)*nChans,INT32); + ts+=sendData(file_des,myMod->chanregs,sizeof(int)*nChans,INT32); #ifdef VERBOSE - printf("chans %d of size %d sent - %d\n",myMod->module, ts, myMod->nchan); -#endif + printf("chans %d of size %d sent - %d\n",myMod->module, ts, myMod->nchan); #endif + } #ifdef VERBOSE printf("module %d of size %d sent register %x\n",myMod->module, ts, myMod->reg); @@ -513,7 +521,12 @@ int receiveChip(int file_des, sls_detector_chip* myChip) { return ts; } + int receiveModule(int file_des, sls_detector_module* myMod) { + return receiveModuleGeneral(file_des,myMod,1); +} + +int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveAll) { int ts=0; dacs_t *dacptr=myMod->dacs; dacs_t *adcptr=myMod->adcs; @@ -534,11 +547,12 @@ int receiveModule(int file_des, sls_detector_module* myMod) { ts+=receiveData(file_des,&(myMod->nadc),sizeof(myMod->nadc),INT32); ts+=receiveData(file_des,&(myMod->reg),sizeof(myMod->reg),INT32); ts+=receiveData(file_des,myMod->dacs,sizeof(myMod->ndac),INT32); -#ifndef JUNGFRAU_DHANYA ts+=receiveData(file_des,myMod->adcs,sizeof(myMod->nadc),INT32); - ts+=receiveData(file_des,myMod->chipregs,sizeof(myMod->nchip),INT32); - ts+=receiveData(file_des,myMod->chanregs,sizeof(myMod->nchan),INT32); -#endif + /*some detectors dont require sending all trimbits etc.*/ + if(receiveAll){ + ts+=receiveData(file_des,myMod->chipregs,sizeof(myMod->nchip),INT32); + ts+=receiveData(file_des,myMod->chanregs,sizeof(myMod->nchan),INT32); + } ts+=receiveData(file_des,&(myMod->gain), sizeof(myMod->gain),OTHER); ts+=receiveData(file_des,&(myMod->offset), sizeof(myMod->offset),OTHER); @@ -606,7 +620,6 @@ int receiveModule(int file_des, sls_detector_module* myMod) { return FAIL; } -#ifndef JUNGFRAU_DHANYA if (nadcdiff<=0) { ts+=receiveData(file_des,myMod->adcs, sizeof(dacs_t)*nAdcs,INT32); #ifdef VERBOSE @@ -621,34 +634,38 @@ int receiveModule(int file_des, sls_detector_module* myMod) { return FAIL; } - if (nchipdiff<=0) { - ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nChips,INT32); -#ifdef VERBOSE - printf("chips received\n"); -#endif - } else { - chipptr=(int*)malloc(nchipdiff*sizeof(int)); - myMod->nchip=nchipold; - ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nchipold,INT32); - ts+=receiveData(file_des,chipptr, sizeof(int)*nchipdiff,INT32); - free(chipptr); - return FAIL; - } - if (nchandiff<=0) { - ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nChans,INT32); + /*some detectors dont require sending all trimbits etc.*/ + if(receiveAll){ + + if (nchipdiff<=0) { + ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nChips,INT32); #ifdef VERBOSE - printf("chans received\n"); + printf("chips received\n"); #endif - } else { - chanptr=(int*)malloc(nchandiff*sizeof(int)); - myMod->nchan=nchanold; - ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nchanold,INT32); - ts+=receiveData(file_des,chanptr, sizeof(int)*nchandiff,INT32); - free(chanptr); - return FAIL; + } else { + chipptr=(int*)malloc(nchipdiff*sizeof(int)); + myMod->nchip=nchipold; + ts+=receiveData(file_des,myMod->chipregs, sizeof(int)*nchipold,INT32); + ts+=receiveData(file_des,chipptr, sizeof(int)*nchipdiff,INT32); + free(chipptr); + return FAIL; + } + + if (nchandiff<=0) { + ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nChans,INT32); +#ifdef VERBOSE + printf("chans received\n"); +#endif + } else { + chanptr=(int*)malloc(nchandiff*sizeof(int)); + myMod->nchan=nchanold; + ts+=receiveData(file_des,myMod->chanregs, sizeof(int)*nchanold,INT32); + ts+=receiveData(file_des,chanptr, sizeof(int)*nchandiff,INT32); + free(chanptr); + return FAIL; + } } -#endif #ifdef VERBOSE printf("received module %d of size %d register %x\n",myMod->module,ts,myMod->reg); #endif diff --git a/slsDetectorSoftware/commonFiles/communication_funcs.h b/slsDetectorSoftware/commonFiles/communication_funcs.h index 7ed8bf28b..e4e3fac27 100755 --- a/slsDetectorSoftware/commonFiles/communication_funcs.h +++ b/slsDetectorSoftware/commonFiles/communication_funcs.h @@ -42,9 +42,10 @@ int getServerError(int socketDescriptor); int sendChannel(int file_des, sls_detector_channel *myChan); int sendChip(int file_des, sls_detector_chip *myChip); int sendModule(int file_des, sls_detector_module *myMod); +int sendModuleGeneral(int file_des, sls_detector_module *myMod, int sendAll); int receiveChannel(int file_des, sls_detector_channel *myChan); int receiveChip(int file_des, sls_detector_chip* myChip); -int receiveModule(int file_des, sls_detector_module* myMod); - +int receiveModule(int file_des, sls_detector_module* myMod); +int receiveModuleGeneral(int file_des, sls_detector_module* myMod, int receiveAll); #endif diff --git a/slsDetectorSoftware/jungfrauDetectorServer/Makefile b/slsDetectorSoftware/jungfrauDetectorServer/Makefile index 1a5b41550..2a3101d1f 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/Makefile +++ b/slsDetectorSoftware/jungfrauDetectorServer/Makefile @@ -16,7 +16,7 @@ INSTMODE= 0777 BINS = testlib_sharedlibc -SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c trimming_funcs.c sharedmemory.c +SRCS = server.c server_funcs.c communication_funcs.c firmware_funcs.c mcb_funcs.c sharedmemory.c OBJS = $(SRCS:%.c=%.o) diff --git a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c index da99993e3..c4494ece4 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c +++ b/slsDetectorSoftware/jungfrauDetectorServer/firmware_funcs.c @@ -124,7 +124,7 @@ const int nDacs=NDAC; const int nAdcs=NADC; #endif - +extern enum detectorType myDetectorType; int mapCSP0(void) { @@ -1140,11 +1140,10 @@ u_int32_t testRAM(void) { int getNModBoard() { -#ifdef JUNGFRAU_DHANYA +if(myDetectorType == JUNGFRAU) return 1; -#else +else return 32;//nModX; -#endif } int setNMod(int n) { @@ -1343,14 +1342,15 @@ int64_t getFramesFromStart(){ ROI *setROI(int nroi,ROI* arg,int *retvalsize, int *ret) { -#ifdef JUNGFRAU_DHANYA + + if(myDetectorType == JUNGFRAU) cprintf(RED,"ROI Not implemented for Jungfrau yet\n"); - return NULL; -#else + return NULL; + ROI retval[MAX_ROIS]; int i, ich; - adcDisableMask=0xfffffffff; /**has one f too many?, dhanya*/ + adcDisableMask=0xfffffffff; /*warning: integer constant is too large for ‘long’ type,warning: large integer implicitly truncated to unsigned type*/ printf("Setting ROI\n"); if (nroi>=0) { @@ -1403,15 +1403,13 @@ ROI *setROI(int nroi,ROI* arg,int *retvalsize, int *ret) { } } getDynamicRange(); - return retval; -#endif + return retval;/*warning: function returns address of local variable*/ + } int loadImage(int index, short int ImageVals[]){ - index; - Imagevals; printf("loadImage Not implemented yet\n"); /* @@ -1700,7 +1698,7 @@ ip.ip_destip = destip; count=sizeof(ip); - addr=&(ip); + addr=&(ip); /* warning: assignment from incompatible pointer type */ while( count > 1 ) { sum += *addr++; count -= 2; @@ -2348,15 +2346,15 @@ int setDynamicRange(int dr) { int getDynamicRange() { -#ifdef JUNGFRAU_DHANYA + if(myDetectorType == JUNGFRAU){ dynamicRange=16; - return dynamicRange; -#else + return dynamicRange; + } + nSamples=bus_r(NSAMPLES_REG); getChannels(); dataBytes=nModX*NCHIP*getChannels()*2; return dynamicRange*bus_r(NSAMPLES_REG);//nSamples; -#endif } int testBus() { @@ -2866,7 +2864,7 @@ int readCounterBlock(int startACQ, short int CounterVals[]){ printf("Value of multipurpose reg:%d\n",bus_r(MULTI_PURPOSE_REG)); #endif - memcpy(CounterVals,ptr,dataBytes); + memcpy(CounterVals,ptr,dataBytes); /*warning: passing argument 2 of ‘memcpy’ discards qualifiers from pointer target type*/ #ifdef VERBOSE int i; printf("Copied counter memory block with size of %d bytes..\n",dataBytes); @@ -2936,7 +2934,7 @@ int resetCounterBlock(int startACQ){ #endif - memcpy(counterVals,ptr,dataBytes); + memcpy(counterVals,ptr,dataBytes);/*warning: passing argument 2 of ‘memcpy’ discards qualifiers from pointer target type*/ #ifdef VERBOSE int i; printf("Copied counter memory block with size of %d bytes..\n",(int)sizeof(counterVals)); @@ -3128,7 +3126,7 @@ uint64_t writePatternWord(int addr, uint64_t word) { return readPatternWord(addr); } uint64_t writePatternIOControl(uint64_t word) { - if (word!=0xffffffffffffffff) { + if (word!=0xffffffffffffffff) { /*warning: integer constant is too large for ‘long’ type*/ // printf("%llx %llx %lld",get64BitReg(PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB),word); set64BitReg(word,PATTERN_IOCTRL_REG_LSB,PATTERN_IOCTRL_REG_MSB); // printf("************ write IOCTRL (%x)\n",PATTERN_IOCTRL_REG_MSB); @@ -3137,7 +3135,7 @@ uint64_t writePatternIOControl(uint64_t word) { } uint64_t writePatternClkControl(uint64_t word) { - if (word!=0xffffffffffffffff) set64BitReg(word,PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB); + if (word!=0xffffffffffffffff) set64BitReg(word,PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB);/*warning: integer constant is too large for ‘long’ type*/ return get64BitReg(PATTERN_IOCLKCTRL_REG_LSB,PATTERN_IOCLKCTRL_REG_MSB); } @@ -3282,7 +3280,7 @@ void initDac(int dacnum) { printf("data bit=%d, clkbit=%d, csbit=%d",ddx,cdx,csdx); - codata=((((0x6)<<4)+((0xf))<<16)+((0x0<<4)&0xfff0)); + codata=((((0x6)<<4)+((0xf))<<16)+((0x0<<4)&0xfff0)); /*warning: suggest parentheses around + or - inside shift*/ valw=0xffff; bus_w(offw,(valw)); // start point valw=((valw&(~(0x1<Gd7`)AHR3L zxmMW1n`(yk8a=CnuxZvmT|P6Luv;NIqt##u%Sj$OvF5%^oPFEca*r6F(EG-sMZ-YyVU@1h)!|1-EzLiMaL zB$mnN=+d5MbNJhP&*Fu~S)BMkHJssgW20Md2`j62^7_t3t8ji6M@h_lnjPR1?6Y~n zFuPDVyi13~iI(R$!w5hbXLFQ9+O;y#Fj`pza(7Jd*gDpVS63XLEXL+*ZMd8YJmj?2N8S7kt-hClv_UsL$5aA6ZK{CePt0iLbAf;izTL7xbW@ z2ft4DMK>po;;P*Zg`9YyPlKmOaPA35YH%A_1L}U;7hIaGLiHRwhd=1-+RHOZo@r)I zbnA>}rGc@A6Knf=Jzg|gqH{_AJN0w9lZBjCz5YUs7Oq!6tKbA*W{4UK)Hr_o&?bm4emaG^fz{RFG92@ptP?V2zQyAwI5ANl8N2x~`6 z!+kkT-?ZkO{ifAu2sh>8e|JNQiSl}b(bONZ+p;ShDaU4HR^b3J9GIJHN7LW0$qZCl zrOMN&JUzDnbBK;1~G?kei8&K-rijccLe<`%mX?`T zp_MBb2XO;6k~lIz5VOvv*LN^-;`I`%P=;XD zcuQws`fxS#g~r+co@upp2k*8aRvXD^@(`yjS%7U7Ck!#$mZRkUA!)YD(>bwZNP{g3 z`Fn?$g&~k{fiP$oFKkKY!~>c7>9!IcFz;oWg$E_sM?y+2RQcG5M;e^#)yqc0zMou_oHyU@VK>MONVP90KrsQliC!CG0 z)|70H0kIgbrsQlaU}BAXR6HRjEU~8Qy=uvp?wqityH``PGagea-fq+sP40meqerQx zWOEXTB^jHdHNEwj(KoZPsjH@Jb1%U4GB%ksW!|2g;O%K_iqVw0QlK;`#-=!>%np%S z`oOv9V{GcK6ryZg8i!KSw%W0RHPf5k~C%c{W&4O zzp<&Orc9r~33h#kvB|6{Jb}U!C`;CqwPbQaOQx}@m!|BL1*2y%Hl=FHd?@pwEJai1 z7{CdR0mi1@nzHIUu%O;yZ0f@m*#jz*eJ9NEoyMlV8o=U#=-ohLQ$J1Fi5xJPV{A&- zlpV?Agd=&zrZi1i;vg)VgN#l6HDxPNwi0Ex1 zwG4(71{<3!nzBSIh**tH12knPhJe8##-=Py*}7qzux^;K=?+a<#c&LheYmkHTT?i3 z1Sd=!VQjinQ?_y>xE^V28mK8N8-*2Ql(Fe~O<8IYC!`h`o2oTsXHj+*Wp`=Hn(yU= z=6j7zc_@oiX6)e-_+lmOyuoC5y(?R`7Fes6dHZ2lQa6ynqf+>#RV5a|Z*WfZEdcu*U zoH1Q6Uag%(4&iIhlXt@z`k^eXg`CM^U@V?rXqg0@o7SsX^mfAlAXU)l4e5a<6VYVi z{6ZLh9TK69tx7N}2rE!q0fdD>Sng-i5U8z0Z6#{2pmxgobRiW?)H{nTWY43}VHpdR z^pPdpsU0b729nM551~o^de$6iPE*9=LWOJo8C0a8E3(UFtZ9U=EBAw0y2R#uoT|6L z;FtQ~x#|rDQ;FrEe|!%FY9h^T2j%yvY-JboJqo3xpmcQpIZ!&auEa7O2&lhXQpqh2 z9ENyBdA&978nRT7`J<0HCuD zy{+1lWcC5q%Xc`@-8nnLk)mqI)d?|C`v`1Xs!0%I{EDGBgc?mK>R_hEC6;8r5E9Xc zYQJC#{AJM)41`tc_1q|!kW}V1Vqx{qq8#)pr#u`Ujs=3L@*}v^OV;Jcc6B*no!;j4 zG`L+J7j(0u$p!MECcPPobw{H|4+a}O9i_hnrwpdChPr@Vh@peg#O6muWbFc#wqyEw zFJ-iEWWBZ*+Yyx%7}LpMeR8=DtRH$>9n-bFyKZpRoZ(?y_0;3Xh!&G}cg*_LO5g3+j;A>m?228Jy*V3@$)RD1x z_Lh9@TgzHvl2VH;UXS3p3ySnMwt6}X5A_kCA_4*g+;gEo^OA+-#padOmvaJ=c<~A9 zj~@O#0jkp0la8T=dL`301@$VYj;4R4+N(gP04=Q)TnalCn-LK933Td2`6pRz1@0DbFWdbH0l8^QcE zjP3B-8$1u;e~QKBnSlRsc@3WX@jnmcC1%yKoi*P|x}7C~{Ayv?u>@+DK~8*nWp{Hm zq_GV<{cXEwd*FYnY48}#Rgg&th6+g>zmlXx@;BkXY-&iS*MdQ^eY7SivuCBb{RtdO z?#DtiyV@-&pj1N_@WRjqq*O1hCZ%eT7Nsd>TJs%-_6^wT)nr{9?gkkBVB2a6(uFAK zg0p>H=tSE<@#^EuX-YS~(YvA0=?OI-bJJ?{U2pcaDJAuB6uMx-sp#9@F3)ba7Yh?D zNwiq`*Jg9~*vYPUbljRa}C(7!#2Dd+>EV{lX|yE>V2SRW5C!=_m}PI zskdOuU)rcyrT{I?zimBPb$9bPMJ=~LR9hD8fT%uyN}V$sf%N90az91G=7gB6!afY; zz6Hn7pUlTuNPHjr+0=%@27edt>)jxYV`u;TISSyT5^$%-!-G}{vf)|{xC0Ed)qsBO z^h)tR6O=mkyZ9afJvfifonJuSzppWCvVw}e|_FmR3)oEVbH$`Z_Z$_lAB+-Pg6 z+t)8iy%wxse@sZRWGv(aByrG+Qa2Y7ZW`m}Ew&Q<*ks{w7{Vp9OFd&S(Q*KVB&Mxk z#>BYs*P(p<%?<9V>3V%%BLNHr0Fu}RXp(LEun=P@W=NP+HyL$EBEO=ud5pUO{eL5; z6!Y2!pUSp_=C%C9RwgFeD*=ooezSbH+YBC#Sd)cXD?&fBot`=nT8(-n@r&gh%r3VR zg4G+MKy0_WPf>{s%p9*q)~I2eiPx&Fe_JrvDXXUOqD zndZ%V39kWZS*y zuy^4>OpM!?tE+$)1iT9mq13uu@n%Bd*U|*)Hi{;d9@4i8&1l_>*5odCS+1A{@}M-{ zj--?MU`}y%ru&!AtRDJ=8w`LlRZ@Gf>ZGJ3rOSpz@V*zljBb{o%OqS*)c0gZlM;0W z8SGrrK>MvUwec33`f6oo=$g;v#RRB!*SYtgFCB{<0YfMIt?-s4pP~^%d(c0MTN9;_ zrDXs4-u}YPi2+wB;8ZBXxFL}p?x}7{%;=L@>eD_4lw%fRVd!5au=;Ll|6g^m6myD> z^=HG)V@m~$g;wgJ@Wo|5wN}aijAW(sw08m(PMn+Q(%4)@X`tc0MIZXGv#cQC@9ER|0p81Sb*bmvZBThVJmCw_HfNj@1T$2ACVrp=6Ag9i`Y-mIFBJu{_d{PfeUW{aj z$?G-}6arEH4O=O|N+qyO5*TMQgS@2;`M!vkQ}af*IfzI(T9+?64kF8>);8-}t4fq-xzzmVwggd>Qcl<80= zqRaukM)VWCqg@i^IYU=tZ9R^N`aKPqQCUsBRoJ$Oqa?nzthyd8j1Ifd+FHGzzz0L` zRGqwWQF7d3s&8IqHs6;uy?p)tbioC7SL~lOXMO$RdOn-mvZqmJ?r?-N={Is)^c$<| z>+1J_t-8``&&B#`x1HB_khs$l4>b})w9|0FD)4>-u(rDs{gS;xWf54}U2lQ)D|JH5 zN~A(D3JU{u4VV}QtCVr)L{C+tG(7lg7vHH;#)=bnRXN;&V0&{s!dMh6kX5sP6{+UU z)G|_1%kEWPzgostk@Dg&wu)v0X$<}b>4L15cGAnK*lkq<+=$ek(&d>H7A2i+M`iDp zFep8|nQEp>P)gq=)l~Ig)y-}an8VgqHP!u@*W`lXyO}Hf3*7o@3>B^NoFNX*Up1B} zhat+ui9hzG0pr6uLs_ZRUJaEYZKm+qn$ln`pys3n^0E(W3R$fIX>uNVAhxHq3(8EP zkQvRC$GTU0O#YcdWi(S3piI>h$vWGydzfs}TVTdZB?BVvawuZt#NRm-VPVQRe9}1L zulQR>wWKHVkxVG`ghDf_$vKR9et3}%hU$@(>N(9olWbNEn&3}{8p)gj(1ZRJJO-eO zJ}aw8n2CMeCuyo;uT&b@Xh=&xEpjd0Zls}-=&2!b5|C|4eAe)qS-2cRyr+CzTmbfq~+JKN8qR=kWrRWYV(_M^h`#YqYvZ?Hh{c)9F z__~~KY-O4n%1f-^g~SS)sAZ39yL+RJ)apRnj-GiW#Ei{x2KkbDgdtUtnr~EOsZ5Plbin!OvXt}=C;G66ZoAKdw_q=4NS(~l*vwU?ChuQSw=td1a)s)b4IHJ_2(FRE@S!_mx zV>34WxN?GcuFqX1a1MAfP=Soa*v2i!5$oQ9H_fR;!Ao^Gs35NC0*S)) zdlkgB7xOq4+$Ju;+1e7~_WKHTj$|)^6Sw3ilwPgSsGomBHUifTvz-im zYpk+6)K2$Hfl{wx)SElOq|3giYTfP$vTk=Fw|!4I(yg8J*U^b$bje=4M6o^y4_6eR zA&(?4YI|dqI>p%Uh*i*!t@*_Bni)Y~D54KC%EQ994TQJt!3L@<@C;vn9|CUsb{T7M z@d!^&DfA|@2-m{Sf=R9b0U0a?4VGe0zZB;rMM4FhDs~uaqAZ83^-j9>@o?-^kRONR z5JB1oQw%@H&=V&PIfg_;aa1Ybu2ibAjP4RCi_~Nc+vFus)e4-r%7t*n7WED^GY0K& z)&YFol6b6}iz-$4-z`!N8jcXqf0?8SZG$^yyg`ng6gl#HSafElW;2@|G@Q5n%He!# zQ82~#W7>|~{uqV7u{Bq4Xv2xQ{py{q;=WcW6#G+V*Fbn`CwjYc$p#pj(~qf3zcc1m zo3D=^BX3Gxs|wL_{Vkzg5_C1RrW0nCU;cKn_aZ8K5?xlcyH}7n5{(UrN!UD#J=5K} zScoh9D|z)TR`R$-510ja6&ycHMvWe> zMFETx4cF_)Gp{8spaZE(c_DQv>A;tdssWH%fcb9fU;pt@@`wcVD+l6567O8-LU$g* z#H47O&Blk1G}cK2-~@y-FaTCzBJxOf@igM^BU2hY$2?XuC%z*+4Z_pLUQ{*^PrXy= zX#k$iNwpbx>Vk;wF;8DSO_FL;@U%pF>Vc<6r6&`fo|T?r@U&feqM>kUhQeMTNMiv( zURprB>mlYj;0;N9e!-0v-sSnuP2sR1f@5h1B%Q_Qin4UD&~?T47LfnjB5e;YMETnI zdMK9y-;Gg9+yes=4rfn36*$QjWF^>7fHaagVu7kG%@~^IrJvZaWwO@)Z`n^S3jfRJ zHj~QHy38vb`>fM{lz^+yU<1i6MwDx}PPDU7O>?wSl}+1S#prTUr3~|Kw=9PVmO}p( zLf%q@xe?Y&)`0}z&_4=e{HQ9)nDV`DC-zmi)5zmbp%DA14oTfy^(=27E2&|IGlW5` zlYt0H+&f=63zjEeUx+_g;grc2kD5ry4$6?xMyE7*7u^(Z?i_~YMvl9%=d!Z`#!=n4 zrY)szstS9q%dKW%lmtz@zYdew4^hL8CfsGlf9altI2SR5X&CVw!(=!Us-XS**Gz0; zDLCB~E>1g>war|8j4inHPWy>&E?hkEV$S{!$h+ey3=`vHl*UMGnkA5~jbaPpEuRjAh@I-Ojk4c*H7PMMsgu$axe*A(7vOQBiCrXXp-%Q|{MV zJv`m21#ZqjMo}r3@7;2u4&{0bTcACQf_NHbN=H@Y9Ena?ALA&AtJteK3GH;WKVZrLgCssYx9#6@#372+G>&S1M+>qFk|j+;KP%Y8$8$N-aS*VkI^tP z5Lcc7d=$XN5-^^mT)(;M6rL6#@6*)PiT#k9nk~PKfs-!rqt4i&?7>E6j}NbA1omdQ z1Km;DoizryX1<}Z26F_(vo>R(Ht%P%^7`22$9m@~NP>^>qH@j-9;se(6j}^aa^OiG zNiO+ODk%p{xgVxUDp`t>rT&t?p+vqqzB*SMVmgL$`DWA3#A;6+ELC!h-{m_TsQN=9 zOB!SvIID*r!Vj<`0MH{TxaPNkn#>-oe30qRSK0tP1%QC6V=qi^*CF%_zEr64;KhrC6AOYG@~B1c5%DE+ANfDMHaqPMR8gN5o-ewFZv-AB#nNE zwE>7DZE&3OLo922L?CFs!@g{Ce3EecNcfwj_h^`#ZPSTJzZmuB9A1BvuL)K;&{9)p3S)@ zDgP8IPE}G+^y68yj14xT%FMxW^orIhBBK} zwscm&L=GKnRxJ9w!No<2F{}my)ypaH_BQrKRsK-S;_zFo(wi5`W>AhjY_ulDDA-if zx||KL-eunoPLRaEJbXxF?6!j@m7aT;@L=i1dvgk(w0!?}M)jkIjo3UE2|wcK)ra#4 za-QlE$(POPibDv6gc@mPSFHmTQREb;H`)$>tpm#sK@?wMU!r)}FZ<1H`*Z8y0-9S| z=G%tS$yvE!+o1JCB5?I6@8OP;v#}?Y`3h1L=1hgz0m+^Kb0?PTpeQrgw8CyPZj|`w z|2r$-@vB*Pv$v?Co^&z}?(N1*$Dc&AERxiifV^Jc6*D`?Z$JYQWfr(slr0+l&TxPScOSKu1;wYQ7q}-_X3Uyq88T~x z#XL*hQhwf-Sw@)@ow#q*(xE57Es~fq-Rd3#ChkjvV}?i%ESnv|ZO@8rn?u2`YFsCDx>cu@mZ%%Ambz}?_b1w1 z5PoNqS2`|zEs4(H>43ZumlY4X8|9m%_kfgYDmjBmx>?y3^VS8RLi9j;v-HnsrX9HN z*_z_p6oJ(j_py}WIG_y20eF4F=$cvK`5kT>huL({yjSPT-l87vLk2VoNxXL&iyR$4 zb>ubVvb+vhvvlOuoAUej7;dOZtZsQaOI z;C#+79VT-7u5cu}_tp($N1+SIIMT2|uV2>x>lz0IGDXhs*fgXbxC8@5X) z=FpqrE71T+e0pj;8gLQay3_V9JlX3`yRQJ`5HH`)EG4Pnm>zEwV8f7A;}k$ugcR%c zVoD#vR|s0>lBseSUIH)wBk_V8+Y<3jAdV#FPUXZJ)Q}Ip6J}72BZnl~r_e>SGUSlN$|>}=a5-{F;^HYSGwWSn+I` z@a-7z?fV@Va3h9!_ngQ^42sF3Xbtm~#^v0oyRylMhdjD%iLlZ!rc(C5Y)rij%&MA}*~;@?{n)KK9rq9`-4x3j#uz&~cb4N~jD=|ze&)dy5jZb4=jgMrXj5l<7 z@49mL2cOBX6tLFu-P!f=2L89K^MvjR)j_p&Wq9w}MZtnr@hLWVLihQP2I{ZuJXU84 z)XvkCM{QNhrv}RD3k?Y-dZYWw&M_K@(E*4nJ8LxM1#Izz?tC`;&4ljuz8aWgbqJ0i z3NCZjDt6b@MQv>is_Pu6BkDZ^)bZsD4ThF$ibRM53WBTH&rw~dbXCg5raaJ7CthPu zK48*)b&VOvn-V`pHMYihqmYC--7l^}i0i;LmOn8&p$-7pa+cy)0RYJwd2V9Anb7aTA0m*v>`_sg3{6hBUiG9OjpTu;35*t6(>A@b|Mg-b4;Pk5>E+rUoE!4sWJ(w^t zGf*c>X}4REQ*xjNYpA#yTSzBXXGK+Rrb2N66?)K`c;+g4TaVuEZ`+xZSDEiY)4(G^ z0NUPof@-QXa`^pKcF!b}y)Fpgpax)5poUaVRmgRk@~Ew9`N}|fu*#_r^8*kx;8J;> zq~p^971D4%EbB21=h&c{I!(Ki;W-!~B(Z+N#)nK{6Ols_-(<-Tb)T^kIVADL z30HQO)_GwD;JJ+T;oQax4~EXEw*Uf3Tr&ZlaYR??k{xx{8KjG6{;i0g*17(seE88c z@}JCPFFzD-KN6^x)te6ty(dt^Vd#?}+s6Ix;=?jgZIu1Z031oKzj3QywVt18^jz85 z=q}w&Z5o4^dRA#;-!E%iRDi5QsoHM@S&{ZH`yV&kG(8-%)f$9scA!PI)WcjrQx8jK zn!!M++v_6RQ5w`{w7-qrx1WHGmgE2f)&M#)7z!R)JV+}~KQ%(O7hDl}lck;K*G zam5JF-Y1g@*c5^m+ zn60iP9w;IoC=z@g#B@C5=J}s$WRxNJmIsnJQbJh-lxCD5iG#;0u;jyJpcF}58YrbZ zGcvBI8kmlfs#3g51E`^Px-nxLZ=NY|7INcOeW+ihfWnI|EfS0e!jX&&U+#eewT2_F z&4#8(;!sGS0?$a|^#{mv!<>*m5!B4X_8^$8!N=03q+mxD4o+C0N1kNT-; zv4`P8AKpdXSPINYqVoYZbZSbdT*1nx=HK($)a5vN>IsK?Gko05@b?i($D!b6J8g!- zY^xA3s-3K@J&M|+_WfA8r$4}&roODZT*g*SOVNE-#@?8gt~*x7j!(-rzgtE-H^FTd z#^B>Et>V|$$wN8;K9Iy+<5(Y?MfY48n`pD#(Tq|gF?Sp%?J!!!sjc-+eZ*8_y|X}g z20{2|cE}D*RE=3^^eWTkc`Ri_QG;&}N{M4g1ISv@+Uhtcy`s^4zZc$pl&Qh(C<04%VH_&Q zIcNj^*ZX(7EfV>L>vzDO5yxun(Ln9)>kaO8)L5uQTO{$x`{jLEtN7Y=tFR8GNaB+F z=@s5q@gtO}c(w=dJd5)23W_NK6st5S#`;mbaosE!`{ICWCJhSh#x{cpl2~xRJiG-U z^y)Q=@8kN`O!nf8l-R#mec*8$0Jk|VJ4st6-_MTD7@MRW&S=&GWAWVnTok&EBgsBl*zAUHA^$E@pf3MKI0RR6?7oMSVwDQS z($xyb!%4R(6-K-kP7Wz2_TZw;_^g`^Hxal9DA+0BJVhH^v59^9aNkfv6*e|itmWa2 z3MbXG%%N74TC3Q*vt}rzNwbrb$HLh~aZ3TPv`X1Y1(@49J5_-?I=hcuW`_iWT_;Y! zeTad`{go#cbuGelV=3)5BaLm#>8lE@;_>S_?ckxeG}^)&+2T1dNx}5!Y+g%|ZJqOL z*lgQOVSm6a7@c+fu3yLK0PL=5z@RWtsC%y`w$m(FPONfnpRE5Z+_qdZ@7%;0!SZNV zZs6u-(r>)>E4aIFUR&;Fx6`F|xQn%KzBZyA(EpapW!F;M!4fP(We7>vA{1TgKvOY) zzM{l?XU)&l8P-A9*HzJ3)lZ|Db3u{)k@5IM7Cr*AvNgBq2^?H)2EgX30^vv%kA!9W zzD7^F(1IhvGwwnQecOr?4~%OBf{ypeGqOnH z=+WVLFWf4Gtb+fs3X!7G?8?HivF25{nXu|7P24GZG_x(rj-8B($w3uA6tnG%EQT#W zuw~Un^u$}t&Z3|Z1&va{o?>RMFxyj~Lipn;ys=V@cX08HBu>DyQeIO`M~~Oh3AiWH??^^zKVJw(ggmqYMbyAf>1lK6$(YEIx* zFR$BQ$BCa6t*G&J8W5Ni7QFf?9NeD4rco{WJ^H1HFj1 ztwJwOUW1Ev0~(7=_`5=_L@Pje>Tp)QEG71<;cbWD+A!*O?7pBDccVrB;q2#S&m}Gx zZn7j>%)-Sk)sUjj*1pi=oaiVy4!GwJCI#{EQkM$-C5bcOWjX7 zb+`|S@C{$uD!SOB%2CP7e!_^K>W6t+@e|z@9bzVLILu6?RWn<~huL2$d+_7gFO~iH z2`qVecfN=XTHY%q(}7=#u`rCGJVx3g9J zhcB;g)rUF#>87|7)juyq4gj6Wt3Bs5bX4)RU+G`1n$Mg?Ktl#b^of zt0?Ept>SJU^>!&bfh6K{cGCALp?I(dN^eywAHt!Pu~mE#t*{vx=L7w~@O7X{Q>(bn zr|P=W;7K2?vuZgl7n?v7N&I=3_HCDX3~fE$c9FXP1LSBGd4DHq5&8FzN{0)$R`HVE zpQWlF@J!r|l=`G>!#k;cl5U$>g##drB<>$3ql!XXFWQ!InDiRiefT4}26UPIELxnE z2Dx#V50~}IIQfk)!`f7M_-i@wg<*7n9BGyr&<8Q_(J=P;6Q;qJepF;81D!`6afY>s zGXTL`eqPptmnuImFKKvrjP-u<0e%O2{K*7<3#)yyx4r+5xNU35Gs;4b{;{&@YHOys zRTS~%yi|YbV^V45w^v&m@NQSC5yu;#ha~!jwu(*Hb1ZV}nLpBdKATauc`aSSPsRsR zy`GiS9SrEWAS_=btb^($+Xaq?ZvQ|T68_mA$kTWbQ_MetHTZt5KRzI>BW7?Pj||%8a8xMR5?bE<0FAY_*Ed{6INUJ%mKU zUQbXIZEVfg{$PysC05))B<7V`dg)5R76Mc<{*L`2IkYK^Tq zhwlSToX&}7?q!vZ)a;`h!iA$7h;uKVyc>))2d%2xbi_)bxCMA`UJf~w!^D*DU|z@S zQ2#}hNmVxGv7stkdAw4!A@Nq2nRAu()&N&mWrX^vWj+;e_rD=0O!EtuL{V6_XR zjh%$a4s;HfbpLKPNaBLRd-3*@tV6#!k6EB6 z6<>Q^F4=sZK30ZxOK&tigCjtezaZ6H?l_OF0XZbL`6M^iVGDKKKhLp4Yx8v{&TV`;Nq6`hGe4c3_`7p~bq#AkCoDeMz>g$4tgPbcp_31uGYeCI zxCX=QIY*zfE)YDpdEoK1ihF|^cYqeE;-H&lft+Xz2#p*UMGnlkF5P|tB0C}ZGh}IE z+u1?GLg_ogu8^iZ7O-2Ui0>1g!Fb8-Nh_#*-c8!~hv#$(luqp$Tl2D~8W&7rO*QVY zh>py?u7}O~Ll?Bm1^z)lgyU%xo(BFvA253mPXjbGKS&rJph+)v{yLg$;QEa0D;J1J z7!dyJ0ukwsC*K7kLQmgcPzsr8nuPCw+LkanpJ zp2cR~cF?mBSm6;|7!@dgSSp_(mH&8w4MNG3{Gh-h7*@%ie!!LAMf zLPn$*B-2kcWKJc_3Xo9->DQB?!GG<%;RY%+O0}S3m)A{G#HoZk0%YhVU6RJHC-WfC zRosM3Sx{#biOFlTp1t+V?IUi~33HIV!XcJc@i*rc#c1@b59&~uRR1_jezxzg#5L}` ztV~9jrLpbc8p@vk)wp_`e^63Px;;tXM^(nz2-{D5N3d(p4z??&SUkS)*DC(>Grh^$ zD&F@Cee0c6{Z1^0mw3EZG#b7gYA?rdkZI+2bX~;1^wk(GEl!G|?H%TYmmgJ35M#bW zK-~}vfB5{*t>TAhNuKOb*gYii@A-6iGkG0nr$6GK^J&Y6?Vudafsv#O7WBmql?dG= z;KUr9R1hqw!Hp+k)P)*<7cTrPcfsiy5tT%ihNf6eB7W4bQVdpWlVDuW9@&_pyKNAAabs4Oj^8eJuX0zzKcNoBvp;X_VekCy!NNkJc)bp3 ziTi1(R{d7x4|z^_!?fxm@EW2IGbP}P6qqYtKOM|{lZOLv@!f$6Z@UL-c`F5P)YVGB zBZ)`y@Ja=qk;GMbMt3r1#MfPau(%8Gu;WLZok9XMdQ0=zI+kO10oJvi{DF;m^-f2L z&vVf|QrZyz{;XMgDfr1E*x({;vZd13{H05Zu;W8pB=OEXd^@WoZ2E)P8%+3tzJY+Z zHc@wY{W13$@cwX~jOoE51-IiYyh1>DJED199viwT-*jqy2jSHE7H4jq+`kSM;wmGL zZQhiU`}YgM%nkIj5enwG0CWBQrT-qK5K3YH+;nf3Ef-GF=1N$=5sPj%`h@{qR$iz_ zhmwUwQrS!F*%xZ;&FkTEu9sg&bvr3IIxV*m*Z5MUdq6ARHrC+7k9a=gre{6A65J|2 zBCdFwPL2&5uxH%>MMR5M@d=a~S#V8m?v%>zQY-f+-Wdw^mc9*z(QE{C(_|&3*Yi_WtIkm(C?h$=l2yXj{z_z`#&@dVOnY@95e{=6*NiUmt2fOR# z+tTbf+;`*DKdee$svk`otxAqBUG?F_RhSlNQYkgbx{E#Y@>-M3^dYw>?I4s-B#8rA z`YWlrOO34b6*Dig!N2XR`=XJ({K`H2F7}sKZs%)R*p|CHRyKy&8d>shdkmf3NE}{5 z?=H1EsCSKsynxoG4e}Z89RuksvsHZl`ge#I_7b+Vn)GL|HQ5K4eH%!zQwFk~TPk!B z5=q_FZniMZ#4)U-dtSND#7{z6IsVz7*f;a;E`pBGAZfi4c98Fa{+u z1|rnxIgS-wW+l2t2(Y-SG#p_MyUY>Y^R(b6T#oF%IjGDC=IEZ_4Ki)CZiZfFjIgHx z`$)8G19>-uC37NkOrYBVy6#3$2{JkhoA3aW8()pHw?XKKvfAj!U)ryuuO8Bm#k61B zC|%5MzYcpdn|DvtUQJuOMxfDI1W>xSMhnoUzIr!aWhkTDDfn8FJ_9?8@wOK zghoVQ8WDj(Gy$a*hl0xzafc@ncX+gLcbHLVZc{i1jpwv!T!ykTl));o5zYzWXEAM% z#PU1XcIS3`_HVGw{0)@n4!V;Vnw?bFEf9lthmMGgXLp0)$2&aKmnnX$m zQu)Z`OSyml6>+FQ-KD=Ogk>B2Uke`{4dGbzwh((Mkd{g$KKU!{O6XS%%TQJ(l{Neo zPN5V6#>Ot}p9y&JBmln$EUAO=7FcS}Qv3(j?64EEtxzRFznP;Y^kjgsN)WG<7+ZP^ z#%2XEHVura+M${-nXdi6(%3ePWr5H$VCfl&rT)mN(n$qbKQT!++7kBD?S9j#!qVT! z%aU8khi5XwEtp{~x0qq<#W(WovLgOB%~VaS#P2V5RwK*VdaH#`F$Z+!px7f^@;B1gq-bC5l71~np6~>t7*k#! z1%iI_Q4?mvHz>pCjNe~k$6hs5LPDRXqBB7S)ag;5$>C6zj9><+Ew1Il1<6EP*>D7t zH-fyf%Hi-yBCg~e2D^-a-dH5!N<~9}96TQQEJc1hA51(P#2Zm3Pfufw&yx)tvY`uR zf{qH*as{3b(@%pam`Kri=ld(#q*~WwT{RraI!^G6{ZlMM5;iXt-!6JZ{wVm^OT+v#tSQ|tbIl6Y2Ie}!5V z^B2gebw^IJYL`jF^1DHZcLgEd-UhKV2=Plnh&P_pw-JUT2=nqF%#XCeJTD0I%plB@ zPjZCWu6DR62=kC2%=v9FX9r=vEeLa;la)7UM`93sR~0@B$`vUgR~ZRKwW^A(C$yu| za>Cq(?IzT#(BA|>pE?mdhF;XFWB4(0>KGn6QSWD4<)l6c_ih!p9c=GtgM4cc@>hb8 zZ#u!*tezZmn9b_0vbNOm<4QfHxEw)qNF`SlL~eyj4%C(eQM0#-^MlBh1(BO_!U_+@ z>an`ruzepUP=LBqC;FS-N!#a9V9O?X&&`lrR1vYfh`xgPLOC^(}o z?5gkae_i^2)yi)Vth@hd>CgIam;RuYpO|SxEZQfzA<9bM=&>kbB0q#eqv~`@!?N%6 zBug(Bbpvt#{8?3>uPZ*w8tUK3SEuWQV`OzSa|d>0^fARWw3$1o8+?pyb!Tdpgp^|e zEkJbwa;mY4J*LqD)EZE$+SZQ9sf=9rDnz5E>%$HtXzP4lrL%r_lz!6WW`UTS>qG_I zLC62n9i(BXz%V$ZVeoH6jWrbzyy6<_%N)1RiE7j-?w!-~f7FQ);HDbfID?deNGJ+I z=W)u&)3-I!Ox5mE=tKp+_^i>1O`d$+`)Am3PpUs?b{RX~E?#_#0mlC7vy{^Z<#^=e zpc&O&`GV{MeJ|Ab9EU_@zAtFd)qL|8+7<$GYTegrogGcT{6gu#e~Jds)R(*Z|7-S5 z49D=`3Zb+OP^2htLE4*s3VCJr$;%Zj5?1_&e0wUygCs6b#bG<1k?>Jv ziX>FlIXtj(*a7#9uJ+VBy@5fL_rVG)H?xDX8N8V+T(Z{LrM@-%U)2s;=YrNX1Zf?S zP?*%0Vap|qLq_zc?lO2#J}0~e`oK1RK~MiZoFY0|JaS11O+Y{7s}R!nDfi=4(udxwV;>Di zM%jd`2ULZn9qBx47+e3R1pl(_Mn30rB`&!QJ>B*km1Tae^dQ*uQk@y_3VAt{SdVt~ zQoHB?uA?YBDwXMPzy)}_zrmHyZjS6c>g0fFBak&p$j*G$mNAw1i8i<{yQn?+OPA38 zl4KPQeP$K(&vQbY{&_MI9%R+ZeV?)VhRo7L)F(>SwQZ;={8#{Cks#IvAYQ^y|1&{> zP;o5#j14@P@&e?QaZ=$kw74co zp;fgqDS&JukWG}3#RibceNjY1ghDmQ^uW~s$;z>*x$L$>-IL@|kfT#gN9n|c(lE0Z zdYknbD?7A05F@1c)H_&LwN0KqimMu6r2Kgq#hNzxCyu%>A?R03=>%mKDCq-CW#pt7K+u?Dc&gXT4^Lcjt zaGdTJGmHD+5vAn058~{*{Lxx32+=Jm(!CWRB>Pk{+x^?H-K!0o2|;WY1+fVa4bZ1C zPN$#$$xS2mC@9h|o6%Wg2iEJuelb^3d-eHTyq7lKEGuFuoAzOMySW;dIjUtIKKle$ zX_3$N=RatZ{{!+`_;)@@hFr9ov=b0oz1-F&zXf?M{HBsmWXtW8wzIp@t&w10q@RH` zpHMW?(T2#1Hb@@%B&UwV+A1FWgbn{FFL83UPMBQ%rTabU%L4;l^?e_={{hq`02+i>*H~~^))&{U-M7*chc<@{ECQ1 zq^=~{)Er|yKIq3zd|YS`hOQ2Rp5upZ#8jXOlUS5-1cLf9TQ4e`QK4njQ+OwZ- z*SyJge;U)}q4TtZEA-En^X$t{OQN^b;5V6TARYg!0dsn=?4zZ2FVK5y=sYFQk39Q( z8CBkS`G3WgU@NrmBPHq~57bWNwXAIWhaO2j&W##_Adw<}io|G#mZm42QdmU~X_>tOc6=e_M2-_!NV zwmo?B!{8pgioBN7+7I~w;R-FmJ9$lRx$Z2x$9r{r>;A`B4bY%Xd9s6v;RytU@JVcA?nHKE0Xwh0(UmP2O(v{U@KuLC6M zC%?{v$a!F`a$kgF%Zc|Vu&LgG879UHCU(V{Q%AZ*6`633NZMsz$kHzK|6h2FHF$@H zU2B$m+<`?L>+5%yWXUc1K(2Y|AD5l)hqf%b}Q2FEu-cE|g$XO3I!+$K)oHj#}@ikCZL zY7SmaoQH`q0~nLNX;~aE99D*d*4>|AOtdS|+QY%Zcrt)P4ob>6mK?6I`?apfW|WX< zwYE%Zl#dv21!BNHH;4DqLJ6uhf7S;7ZkN!X?;J~FZl&|sXojD3{-{%m(Q5I?AVfOn!7l&qV(h1p{nDu0=?uv;SPo`^19{4jh|2$elM7R6~vg2<;b~VVZ_LDt+2%l@v z}g+Ykkl*W1)UJ`f;5T$+Er3(wZvZEHCU}_ zENK#J@n(aLR$v)z=%(V!QZ$JjZd1e)2|l-ew9gaVyBM_4_P#UnQtx~F4OWK+RYPwF zdFu=K7{Cj%e$MU+{fuX&rw#qfP>dv&bfuU?K3)@PM9@pVc;5M2a+7;ucTU&PKWG2` z+wJV#)0v8wdG2&t*dNczm8)68-^TR&Sh~KxTBHT@@1UNV}W=?VBb$SllD@V%P3f-oU>6W?fzDRT_iCqHn4ZcCAwJb-sx);Fj1&S z5_3@xk>OGlE#+H((01#hsO{E1iQ7f&;NK@G9ZUMg9KKzYSzRcy#J^csJ_F=Q?0-(1*uqAW zLjIY?c!Sc1&H)C@%QidQhA?Di0af16V1$6jMCBe(5%f>pwl}Br{nZJ!qZ@z<%VJ|eh zb?-*9(tixpy&TEb{o`f6nDsh$7jIz?oqI1uM!I2=@g;sNXLz$~hdHZ0T=P`FtaF81 zJt4TgbU1=#f1jz_8NtfFAF81L{r6?cqv^bvFJQUnZ|D25x#vICy>DOxFAUVZX$dQ9tzKt$PRkFqqdJ?#x#HI8yg&=e-~P7#ga3MbAF}*Q5M2Htgrwp_^X_6E?rF zchAq6JimYmzub*iGJ3YWrE3XgM_Y#LPK2`9%ZCjwgmMpGzKsW4)uDUOUar>doqR2o z4?Ts(r(W2*_IgSfzqj^xo%q>)?%s>j^JZP>x;^;p)SlY>aDHig#*R<{$vj%f+!2Aa z3sY#3W^hIL-^mh=zqNUt`SftA53>}v~Z zh8Zq*Tk$r|{9!9{b`%KK9fiWs9X}nw*J1HJN9zt9a-4V}!i*DZys6e@QP!|U#o%@r zzBy^Y|1yr=Kk0IvN$$*Np&WOu?K_IW(gQUH{H@LC!kd#!wF~!j0;7Z<@1BL;_WNOme{@rzYv*<0 z%aZ=XP@nI@XK04{y%Zx~&4=dKh70+%@6|`~(Y$`-j@#xKgpoUHk4N(vq57`)SWeg4 zkQhG8Sh}OW>6`0QZ6UTh0a3c6c6bcGBh*scL9o=m_j3%Nql;_a>Gd>v-mIHm6Kdn; zbg+Fp(lnoaS)N*q=W{2Ycdkal`K7Y@x zMLvV;h;KMOKxTo~1$GaBY1&pQ2TQv+=x*H$D7qr|{0PzgX$loQT~eog?w8-lT8eo1DlW z*M**{jSx=N)@JwQ2ZkPjk{_w9t?0>*kM!-NrGm@iF|&L-Yftp#bJDW+bP}@nkh*uV zY@FUI+FNCQI=UDL8s|17dtGCF0K^lg^(2L4F7~eg$(W!h!VS8A*St2bmmbds|thw!A zt#zdG1MgGu+DL>-^HED5Wr3X6zUxTJAXIIRuo z&8O!%!L{=(TG0JZI4JBAI~o`wkkV@kE#W2f>6=WxOV+%aF_Y&)U;KTW)0R+JLecO#^GOR8g?oR4V5bkO~X!FEXpDD@;zf~3Jo0+J3$fTsYUR#n9YFkzXqs=m~f=p z5Bu?xLzkk((mn5`rSs46ks)v6jpnxzL3|r;HNRbZxIb@>TM2-b5=vbnk#HdI*i(C@ zKcADhTGDA)pFMQw9&e;iDkw6qy)T203$=liEv9x}2A`N(ftD3}T3#a<8B0B$le40; z(z8Z_2|ZHnjto9&>?w5d)J}bkk&VXMM%Qy2QPQ~c0j956KAjW)8i{MpC^@}T3Kf?b zna=zGu&&%wiK(-4kCELA{yQU4f26(?-^RzAIzlWFS<|`pY7;~CUBU%@m)eE5@u`Yf zHs8ko!2c&>wC#5O|Fw4ZQB_@M!hbd%$psM+Q4tBbC1?>5ugF)C5G06*h)9SfF3U2A zgiwNn5JC*`qNQkvA4HK$DZ?<<5TsWmlmbBq5fO@OPnmzj1}9Khlz&|1eW99#;L2$;zaKT zTg0+%!QrUoM*P^L8?niWKSA@Iz8>~t>G8kr%Rpa-M}1kwxAbMXx~15l?5&K0b>-FN zA6)yu`Gdp{@EFT05*wY5rA39hzHTUbaW!3A6t^g0{a4i=J`-4O#v3?46A`v|h|%!a zqZVeKDa@E?Q7whM=Jt*3z_f?AYU;jmgGCt|!?QI_hcx~P*5t^7+@Cr$2wDwuz)C6`t~BcFZaywS}`M{aFBsY6UT zflALG2He6~cc-AQuYWTwLa!I!b)2(7HW>D7iR0z3RF0h;F%HJe#u>4g*%YV{uIqUO<$s^!R{9t>_Q)=qbcFWdKm7%_K!!z|i%}wkC8lE`W zVjrfQm31v1sXb}(UabyUo7py>Gg9Q zf9gANa)IyOEkS?!{Wr(H{^pw~yCn`Az7!rNrS2Iba_K(*@rdh^UpVtO#%8!$jvVKY zEeVf?Qr9vPu3Xf&25J%iv19UBqe2{X^rEYq&M%1>Y|W@MWvx+q>zTBjS!XI+qq@}} zOh1WKD~$h94&TnVU3Gt34wh1|l!PVO|60d(k(mB%CCbdFogY5Xhg%Bc(Y$T0`+J45 z>D}pRMf}C{WZ${^Jum1?GuNtR#z})bc>cFc*_LjFf~Lfo;l3Sk@2P51Quwhk@7fu7S@JA3dq;nvs{J6Y+qZEGmT>BwAPqha4)X8_AoW2t6t8$YI? zEmOj%!Sbwav6p{K^shr(<}6ETTWZ=e*X)qFz7MAn^Mei^P7Ia@m4}mprR~E>!Q>F7 zoLvWTx@8)2poHH1>kqPr-Zn)qU%A2!}=oH(O@aL_aytM*$N`b-%cRj`9o z-C7>g`1iQ$rl&n-d0=bas61Taf3G+2FIpS8y|^wg{QLT)hG?#^MOyA`RIW<3m}YNM zdkp2=(#pB{CHpEndsm&FpQjwDd~n2?y%P3H8mF^W%2sJ(OXntK^*`QFhU3-V@0Mrg zvnupa?LYioXo=JJezRVFRwdFV?9p$_7ViY*svXUl8Z|{Fs^iMe^lyo3z17WumZ0ZV z@?+MMW}7c3&8F&YYSkS6z{-tp9=*%p5%rs|K8b0$wM|)REe<%qyt zd+vqIS8YwFUQ$oCTzg5iTA50Is-B#_CO&>+yy^U#YO!_RB14|7Shk(bKej{hctNPTP+4}g6>ulxO9XUBKWxiq!dYXQ>)l08FaNZj`a`Z2~oRzWTyCG?FaJmj#pm|Ui8qTYo7V5yI-XRF4t%8e92q?YTAS2X)omN&|6L{O0gV& z)mxwZT8@5aX2u)eJ!)(EbEaCpI3QRg^LrA;eiRaqY(-LnTf%p$RLwCqM&u51bpr=u zMXtrRw7se}D`QfE$k_M9@6rBZ*zssP?t9mKzfA_`_anRhhwHxA&iJ1O|K0`vtLLx$ zC*^pj^4$Rk|I-D3d;YuE{#V;&|4kn!zJG4P_YQ4h4# zaFK%&;eQV=YkYLMrO6|)bo=m9llGnpo7QAjEnikDJ7t=vRMw`f8m9H}N;TubmP;ba zd@E5Wlsu64;rpht8nsl7n>sC+Fx|4?j>+YH^+WaVrttUGQY)oQJKt9eW_Y5_h(#kS zWomg}EizhEbb3rlJ_jT0b^EM})E53-(!<)Xrim-Z44g0FeBR$Vujg1C=XE+I)oh2` z+ePrh{_yl)Y5S%XS^eB%x}}dCHfp)%z=LZvuCY5j?N?U&I6Oo294uwa&&HHmtK6(x z*^aU`71yf8HY05B->Rg{^ve5cp^eT;ME?^dH!ZvKO?|Z_V3O&2EoP>etWK&W#&MLH z(8R`G#KsZ2!^O}K2Ej-e4HMy3m<}@`*4q@oL+}W!h9@8yY10h5U=JLC*CDSsY{ua| zcwZCS01?|@O^mh-Y|Fs5(J&UGfGrBxCc$Kw4Rc`;EQS@Z3f99$*a^EK1KBc=?HIfT z@8c>fO=dX4d2liGf=u5tLSZb7=bvDjk<3Oa2Xf&qSPT!rDtH`X(F`n_(G4%d>+lA= z1#fF&XT?ln4d+1@=mmXXC=7@3a5GGW>2Md^4G+O1MmCPKQ3IP{8@vp!z#DMbj(X6P zZzbN%N0ft=rW|acgQjNNiJI*Ky`e!#7Q&VnxMY)wg26U@}qwp@IgD2?ViEOwF z?uUmo_emM{Y{7~GFf&IGSWlj0Jit_h?ArOxRmWT?(fWQWbfq|W{ zPcy33I#H|VX==3_^w8A$R8i}5U=hTk^^NeXreX?2#T=r7 zGof)M6m^860Zzb4T#sUIDB{)(+u=C8O$adHiN!D%?u97wL>nH9!DCw>?R<*y5I>9j zEFL6Oenu?w8)jn+S9#znUzi9{B(NM8)j$Rayo-nI@Q|aXBC172)Z&>;Jd=+n9PxxR z#IhJHi^+z$unFRc4Jmji1JBUz$Ml!Tb%|V;NY2I1*g~d? zg-jKXSBX5%RHMgsy`v`X*F@Y0nVWu?B=W;#O+1f?c$R6hgbS8%!IB)9r^yN|UxDQ- zn8jBxi?2k{l_=`JTf~2_CIOWq0o9rWVfl}+{6`G2G!f<>nTyNk;_~@;czzBZD#Am>cm%~3qSzB*B2O42 zH2J{|ksl0evM5$$Q9PET@e(xlVqh-@UP{BIH1v)a@!qV-a_(Epxo@o?S5}ZKz8v@E zxIdoq$5VkLB7viLq6ANrYVuTw$Wvh$N=PCINu(_X+QZu-#>l%^I)tSoSb7gj?`yKI zUSwS(e;^!JMdK=_3t69z<&jt(jm6nmoC_Jio&oHy!fTq$(uvHngO#uvcEihfM(~UV z384caoZUli_2Q{1G0Gevxv+E&mO5pKIA!5FTs#*S&!xd!8qDYRF`wJVTs$-v4>`Nw zN;ge5UKiPTgQUYF3-CxB*Tr$&f(G`RAQmscVwX^oF&v_h3koe{ey;%b0?Fb2lK5{QMabm&TluD!62Y|bH@^WZIbTN88Wb`h@iOruIN zART+s@e;Cn30dt`NUrRM9QWe*(l~M^0iyU)6!#|Ez4b637Qj(BPW^jNi7X=o%M8#D z4#S%;0VZnVgR6ZoZy7nTj2!U6LLV$#hJwpb(1(z4&yr;o>{qeBjr|n%$^KjE()&=;1#QrHArnRxUfK^~BfgXlPj5CsvUbttqB zg`!VTMYWm)+ld4_z};{!^n^xlHb&VX7OM!sDnhWT5jHbp(QybJhoDdh3O$7#Zv{a5O%_D*axq|Tktj{w4sDHER-2992UW1*aLet;a(@k)o2uk3&U_>7@i2j z6RW*MR{OwU7z(jyH5RSj4-dc_a2Vd_>E23{a7Q=~a$Pvrg>zjv*M+yic1XYB^!rSl z$TJBr1*XB<)c-SgnVBk?nW`a{M_~DyYNp~7%usX`Nk?mm^;%-he^(+=xPDzet}Vc| zA-FaSV(EI(B*sc4#v0%_c4e;es9CXD*$b}rB3+UIfY zrXZ0`A&`MLF>ri1FGM0CE|16M&(guObnt8#q}{WFa0pJoJDMbTiX?bL22Nn$ga{Y~ zYnJ%MCTFk(ppmLwFzL$DlHLPC;2ND@f01d=R)7$*?pgg$r`5`qLmkT4D> zpfhyUyu4qNOk$Nu zta8%$t(pO^z&>b#@cwSu@&G+V*#$*Qz5daN|U{Hyl$!28Kg))M z;%9`Sa0@X_g2cR#m=~UawQv$nY4Y=1B0s;aNf84UF<>zsD8>WtP0Aca%I3i#I0ErZ8J;Pl zqcS=&*^8LyrveXD-~p2h`)&{yoA7WsAuT7QanmDo`u8krY5J!jnm}D>27#glLlXrh5${P=ZQ4C zKn!cfu;wP%s!5AMq{UB@jtX87S5f~Rbl5?M=eh7a7hWJ{7l_#fTz>)AcSZ6BGFp?1 zXnYZk@uqa^G`Zv{a>*NV{u1YFgL$143S(hBOopj27w&>sUW?^sI}CKd0CK3_gZghy zM6<1M0A5E!ENa1`j_W9P1H~wt^OVhnaTJ?7DqW#1{qFzr=p+T?V+P$w@qM z5>K40g=R>oP7DO@4h<e3$?;U=}0BiB4;${ z3iZ$c{a_4?gFV#$nO-(<(HUHH)`PD$o-hnXz$35>*26|fh|UtCf3_C+XIo9$%_8j$ zkSuQ}%g+(ha~?1RhCxDij?kUk1$RTr`yAzc4iB8e1LxYQ|8t#e5bJZq`rHJ(L+tH{ zy#qwk4m9mZgBdUv?$V^QO{B9Oj=@{x2A;Zrr!Hi`EVv&Y(4=Qlq-RQ#kMPt-cjl4*ck8gPT|kk}3o+JOX^2#a8`CfA(#fa3~-U2-MB!d7@zlfiV6 z!Aw{Mk8ARIn#kuFkn29@x-Yv~&UG2ygkzcvlS9Mg&@hS*qxe_k!dK+NS52^0ldlQs z*M#)zZ7_wTyhl>rr~Xf+kmYG)djTwj*)SJgh1bYdjcnCHJXMdU>hV-Po;uC((;Ppo zhaQ^rV_83z^Pd!qFdvS< zQL09$8V!0tPZ$O*zyCihVWSih`wxlzhf|b~P)1nPhDB|-z75y66~g@x&$Qv0He%mK z?9Y%)XGo?q40whC&)}gmc<4+kJPRk`6xHKI^*F;+m=2k5jAxl}+UcmBj?USU{SIU~ zF73dj9U(A`Y)0b?XnX;UFQ9NQvFp80a@vxd_AnTR!e|&vj`)%z0WcnJCI|4yS9s*B z-Ec1+DZ(QpW2@!)zx6H_)8IoIe2D8mJdR~_+(yT3lv^9+*2WCi#te5R9ZND{9jwO! zYb>#aIWP}H?qh%ziu<6rFACG|1^WHO1;yN;7xY1~a1@I~p-k%kE0U!31RB-CZg?3* z(D*|%{_rxqf&u|35DbsQ8WgZc0Y?}L!{GqDjv@?rmI2RJ!xMNEMb4qfIgndSM?lqH%{s<1H`=jT!g?1Amf_rUmc-ETQflsCy?!Xg(!0pA+lPiS?HZ{3Qc_ zg#lk-z}In4}`NeWr37cRmcfCRGdP9(M>ZY77^>Fv=g(T%AlCp;ZdKjR`8ycAT?3no+ zU<8bUgz6(g^-&2drT#xc!;jGL;|h_Ft4OXGk}D1t!$Xkcy&UhO<32j>!{vRrye}K( zLbAB82#XeDkr%|1gLrcA4xGeOPI$_hi76gKH^U-WjK}aKe@c#xFg7CKIGoUA#FdX> zdPr!#CNy8WL3cF9Lm%Ox!4NtQqa(_4n6mr`*MEfTKN^9f%<;k;ufZWWf?1`PAV5Ip!b9_+nNyBnHZ!PCYoxcbVV$dw_ID~aSv zhSl%{?1g=BijD=#JF&bQ4#S&x;1(XZ%>Z=#6&-&{Kc8Cq8HW>G*UxnWTz8-IRw#(# zeJI{{6<$M8PwM}7-fWO;zdHciVJEx^$C#3>nUZbUzsvqT_R+i_&3~WH6rBmLz<%z6 zXSoY@a2L!K`NJ-F4Gxm+5oCK5cRNpRa*Xpwa^a8U!XJ0Ty&UhL{;zd$*F(d9LBr1i zL_Q0Kxb`z#`x&123{QME3dgywhr461CjXMc^=YsIRzZ&c3&#hE^&qkSyaU(M@8^B+ zDjb3%n%syIxe)^o!6TY{VT=~}B9@I3SgOeoF&QExLq}j4^&Lxn$HP)sPD47rLB}`f z_y!%{pyL~K`~{);g3x?{%fG?3*dNuC1O0Gl-V6E6P~F8|kiBL8}y{XzDJG?~J4Q(2mt z#s`*ZRLeL6k2CO}D@FcX4Y~f$Tt9)L69d%$U(!VWlA+08IPjMNP1*7F&Cc>^h)*|j z8etFYgM7i6!xtPUzTh}{Ys#79&b^wNS1f8CA6Q(2MY)DT26o*F2jMX6f<2IrV!Xmt zu2*0`EQI^{HsxBzMg`>ClPjNq7BcWc27cTi>Ty5Fr<}+6l;aUD$|Dk5Lt9NPrh~=% zHMQ!ts8xKk;*|>j5rn3m-X`kl6j%$*nhIk-%(74Wr)eJ&DJmoy7C>Vm-skQSUAH~+X!+gj`v9%bq7K7IE z@oX(0$D)HoMTbBXh(>|vG?<~Ogx#Wy2}Nvli%Pi6=ezxUzB>R>U=|9@It#n`TGuAZ z5f?7Qb<3`^-_Aa+U)In54fZ?PCq&Bz*vI9(u2=JG36VV^a^Tw)JPvE%0KCqloC}X~ZZHlezzSH!FQ7c?zbT*JeBu1&i-g%Q zm)j-{+G%h;lHY#Okcs8|E`IxQ59lJRyY|Ba+y&=x7j%JK*Ufd8IDd)rmpFfk^SvQV zwP8$9woFj=n%oRxIa&zSf+2sxkUtsCY&2*xO4*EN!3lVWvbs)L-M|xf@x(nm(2WN! zW3dModqNZ{MxkQngJR}`;$BFZzT?U(7Cn}sSQCmZ$3x5U&^`>@hk?bEdokr+%)C;} zykaaaV55)&BXE>=Gjw!-j+T$oa9oq8bs|sO@oLsbB*K?humQY+4c25ouH26+_cy~f zh~oQEyck1@G2|U<6tShhPWtQC}iC}ymTt! zrBgBcj_l8ap)efkp$CkCahkliOXS7fywAhJm#{D$7pLRm^vm!HZ^>@)mh84BZ*ct^ zT>l3Bzd`@Iw(yoLNs~9}|4qyD|C_k-OIiB!ims$+F^xJ0Qo`b3BF_Fov>= zL6Mk2+TEZX{rK@Q-LDx^mVQ?><*ygz?+HUxGGxg6G47EO;4)fq%SWJh^ zY%%*G7sg;oU=|H_^O2j0XM+Y4ARd^L$$;4`gkYZV>|()#Ckq}7kb#z9@sb+I4CrOe z`UhL+0G%Kn^Gbn5VpLvCI7?kv0HKG>^8b6HhFeM@M*ONi>XyhhP=F z3_0&rMu+S#wW7T}^n$)H2Nu9`h#@{vqI@>PZ7_qSCe=pPnw($*m#<)kThRy^cp(}u zbYVFFnyyaORJgaOa4dVqN7OTP97RZ?2+6v;qSoEh)Fze>Y$Ddr;?igFs7Dp|h&pCg zJeq)ksar&)l5|4yiG|596`Ia{qGtIRxPKX#bPd>Hs6Y*FB`ZcD-SW*_`Oaf$4C?s0 zL3h*CCu*T_L`0)rr_<4N4N~~iDg5coFw>b~rZduXMw(7JOs5>C--GvA2;j{^00ZA< znIL8{K|I+Z@?;ku94Rvo%FM$I8~6|z&xgp(kUCw=)ceCeK15#SyB=k>j50F@a3X*c zuctCcr}I|Xz*}WMCV&PefF@09qD5+AVLu$;^;Ze6ze<@{TA5hR!W(c{lle@Q^O-8= zAAx0jRMPWti8_AY$z)kzHpBxZc;E6jvT~hORIbrb9e) z6we&(g?*5uK1x!TCbIf(E6juWup3^6H{lpJ6F(jtjs>y70LK_0qf{iLoPq5a*a4Qq zN=@Fy1MlL2cSqqk3YDQy1;q77aQ#tYc{B`S$WaU_wPpZY`m?7$N9YRmFbqb(SQrnp zd2q-e7MZvz6IW%TVI~^xtQ6T42$%Srmp$7$eP@pFj zrb7(v!O$MY?J+WN&0;k7g2^xyVqpyywqr>RGvNfhgTf&w90uE||KE1`u22s{VL0rDmo*u~@-ZwQBNxWVg|R3Y1B>AySPIJ_E+6ATVm1#Dv)v#s z4%BRZn>j}E%Ojd65j&nl95}&`z}cZ3=Z5cC$#Db6xz6t@k3!dY!r_T#eYvJ$yhX)u zKab%FC5HR7KMxlEv7A57`5KP%$P}}f`#3jZ4{pSZcpg~96O2zb4-UE9n3F6I4#^z2 z$ASAC$Y-A?4c~O`(3w2B(2(^xYDp_kC}(*>;m+;F6O0!MdZD1#F1VX^479?7yFZUm zh7R_xv44a8UiSOgr@s~Sx55@W@^ER-!zJ8oEEcty$A-;Vv>A&wbKzz#+>9cdNv>%D zBGZB)$uo`QnMP7hBPl~8`9Tp46JR2DLuSh5%#_PdKr(o_9(us7a2wnW_rgxt4X?m{ z>fb<;7)TPs7MKLfU$D@a99%?YY`h; z=mOoKH#9(U#)h1+iG!584ashkO8wj9u#v}sB3KNu#0E=j>R>%Q3p*eh+n})xGolSM zqRnl1R})(Xv}HhB2DD{BTOa5P!(k-c47Wh4z?Leo#S^x8!uAL(qyBAc*rn{%6i(!;1qxFb!tF-Ec2tf|si$GEG(LZMXVc^SyQ|Rz%veb#-SCSg(GlOli3(H8^dNFfn~6R`~Ph2QnSZ6a7z=% zZLGOWfg~MoD#Y;)oMd648w(5FVJ_SS8(}jXghMPi>|ntm{WxLSTr8Wr7<$2Mmt!vLbOF41r+~PdMX=1!VC8vUour%!kZm3(T+| z4zMDzm=%eKAf9l+6E350oCS%5a3LXFSP83HXc)vo!w{GOv!IdWc%0;T9L?R(+>HU; z7{ILt*0J)C22ar72{UYfgK&uTx7Mt`wS|4~DvM8v@ehcxJ4xqG(z$coo#Ri^-;?zB z}g)q`X;dK9ox$jZb>RwhP6Jh2E*EZ)x#h6C_2yaFfS9ezN};|GKb z+zhv{f>Fl`MmtF8JPDmAp76vItgaVU*NZ0#d!q0X6kdYDOT3^D!~;vRsQ)ERY_ziE zF_ zpEvz^55W;uFcz|ckr#*JLz(zcCd-NOa$>wZ4kkb}TuzJ(gup-u3^6bcrowcHq6QQ- z(6NDzSLm4$Js{Vu;JOtDU2b zD;RI`qqLkKrIm1u`hVsYuf?!90*fQ!;bvF|>)|LIXC)&Ytf7N7G+aZ&HJz}Vm5o>u zi6xPdFd7!XLP+~a+DDE-`d`b0vzEZG&4k&Ie%8{@TH`e~26-R1mG^PmATEr;g;69` z6iF3z8{TE9WCTkkqhJoqgEg>@C6hXqPTD~{5{*ZqQ8XGwqkCX4yaOj$`|ZZkN_U9I z*5k4D4X}y&Uw@B{`>dhtVhLprYb^6wV_Co&OFE3D!`NDAX04?cYb|{sA=yYsHe$&} zEZMjl?uFIx1nh?caEdkD!dmW77!E676}$<@xEZ0?W0TasJ(k;JxkETNiAd)BEavMo|{Jf`M+rs6|P#YdP*%}k{Y%!Eu$OpJa+j8+Yhl-J=c zc$*~jBniDqHbU|gAqg!d*~%dbhobP)gS=`TB6lXqohfp_ksO!@@pL4fUOP(2#|a_1 zv(8BJtZQbYjacOpt6jtf*RIF4ak026o>i@Q=y^Q!oVCbvw(Q5T&jh8@^T_4FZ5oAV zqOiR$o(#Z~4tUZDPZB~$Lg+|8j`TCP3XdMgqj+jQo^sBh{++XMX)!K6gi9CWQZHQE zhD+OVDIF}LgC&)?v>KNZV=rR7l!i-b=N*JgLvSe;F2}+ZD7XRzeLe7~Cmv-$e+CT1 zGl6*KM}+oAgmzUAp6tbwI_f{fjtwji!Sbivap_`Qcm)^sijMh*_ktA0n z$+ebHttC`ZLsZ8I9>jok7!Vze2V?PI3?7WbgWh=1z{@5t-ZA;W8*ms;a{f8aKev_o zf6n4sEP4)$;#;}kEF6auEC^0wL2xqM4-dc^ScmIvalJj3(BUdNe0l_hM+r?7p^1Sh zFpalfO}zDLg*V|C{SxzdLLQGt;_=9HMmGj_XCoMfLI!w_0iNrEJ@78P$6GNc-ikRB zYm#UtNn{^JtRr~j!eg`Wm;?Pd(2oP2bik9d$&uOQh~r{n?*%cy5d)kGc~aU>E|ic9 zrPTj?G@g&f&RFVS#%uM@ceLs=Z9L${r?cjb%f-?LN6@z zIs(h!9XLs{q1aLsTZ+q;;xcby=}j!X55N*`-z29G$+=u333c3#vDAR22FlMs`SH?K zc1@C5aqL%rv56UpWtl1sAokgUBVD+;bb!8L<$h@>Tyk%V$BxwV$uigF-nDbJ{W zXnFo$=SKFr!*W;&2jF$GIgxDM3UO^Tu3e8S*N4Mmc!=z#T^#M=3Sc2gheFSz(DQp? z5o@<``F32s-2naIR=5qK@OBj5o=^R6FJObD+fLGLzYFhal0wHRbeuvgQ;1~>3Z0=|k{1+qyr6J^&d^npj(U-fM%V|hLXxzD zB<+}lQ@kmm-}Cf)-WBRumO~C*Acrmt!<+CP^?!lbciHj^#U7$r7n*hXKwm7$z>+L1 z&|`rI41*C6%gtDBCWdB0c*+}#3@`@9!3tOf+h9AZ)%;kk76cPuBJ72I(DENO*H5sF zErMliQ7{Fj!3Nj_vFtRKHDEyl7BqywFgzl7M1v^SjAAXsx`kM`#K8oZ1~Xs*EQFP? z8WM^YLeWu(hxSwd9VghR#YJAY$Ood~c{Dtq0ka?%p69~zba0*y&eOqpI=E1V=PDqY zTxi2%DAt8yUF1d=xzV*7?uA^}#dTeTs*6x{;gK#pauLHWUZwsoPOx!@1NR`I==R{X znJ1*fZaVBnp>7oFMxkyL>du4te48a?mk8OVd61;K5J?Jm*o5{g_xkxM9Y2}LfU z$R!lHgd&$vM!+bz1t#&{u7dY=Rb0pM zT8`J_xq3WT-wC@38SPKg{&X-5g(qMwq2jt`u4|5k@el=@jcC}6Ma@{$TmnlWu5QNF zV+=UPfMY2z4Yt8{*adqaxid!Y{F|M~zd1lp=&h+ueBIjQr&BL`BHoArvFrySAxM}` z(4PG4M-ExigY1okq)F6=|g&SDtA9piO@Ee zwz;&;rETs3qy#BN%5~~Z#(I;n-ejyd^*W<^(?h57Ig!sryLFJp`S}O~ZEz zqpx3kA_ioGAO9DGgdpBJb;=cqLUIr~I@N>Fpxznby81*UAK_em2g142SaX_wPH+AH DXwJdw delta 60521 zcmb?^eLz&j`u{mA;(`kvUc}`^To4rzbtTl5P#1hdd;tw#GPPAv(MZWG(X2%@GqYly z3hP=eYFox15Sz6a>kH^T&Y&9$Ns{8xQIeYe;MfCRlet&-qoSAv% zd7gP@=9y=ndD)Xq?M{E*E`9dMu|*8S1R)G(*jWt2?lds$0XxHR(l^5`LLNKW{_V5X zk8EZ2w&7jJS=#U~S$=U0Aqb=o zYtn39LrU1b-7GBcwlG5Ei;S)>=XPq1A;tA}R@5qCpFS&&5#9rWAdazkTZMY`I)Nx>@^g}^w|szLhKp|j+P`FwVg}~i(Qf_ zZ_AwT#xy$y)iT1by|lVeh$*394#OwRVT8w4Yti`IHZu78W4hL8<};ClAnaIe;2A9= zxW!a6QW1pLSDR`W-2~KOEKJT)$9WlEPc`oY22v4Lp zjOX@q^_)(tkEoB;CF!|(t&Y?8g3Oqmp$H}mN6h>IlsqtJ5K44k-N%q`^<|pH%rnS5 zGbaa``qc)1!8|eV2J&vq8I8Qq)sg-@26>cxc6#MU=GA6iU(C=TG*`-GBW#cvQW1oo zFd!IRuUPc5-UhyanOa~?;-M;pzx9%$EKoUp-^hV@_o#Aq_oAfQLEz1E%)FP$DT0`R z8bN5NWP|}@p$-s75XuqXVW#kHMw{`M87(t}(P+_X4|C0PJT7w_zZ+d+_v|!&ows^g z=zdevx8AQxLh1*d`<6Tu+?8ENUJUMNUFX$ite+NP)1ZMmt9JM{(Hj2HdsQMT5gBcT#j7PAN*r^mq>+XHi6rQGxjEZUIwvqKv!5r{uM)W8pecysuB zN3i_nG)6G@(gGdyv2ZUWdOz}#_;8L9G7$?IY%E{|cB9k=kh_@?QdM%dCi@~%W5uho zI`-0AuAy7LS!m`R5IutM-Kyp}H0_s6>3^4j(*KbD(tnrl{}ThG_{)f+0sGRwoy_#_ z+8o+&J2Tp$t2Y)iR{BR+vC7OxI~ar<{vX^u3EhBU4zNtMQ=GrW~a=bE~z z65YKS-rbvPN>QaXBdr-}$*Qzv`kgnxm+|!F4xpwm8KmIrme%drU9x%4-!2{dr_6<7=gAM!8KK>(#l3MeA!5@ zX`m`?=_vI4QCw4&Dy?t~!xxU>n(l=v@F|A#K|b|D6(zG?}I{ zLLX~^k@sn!_q#%eIG}VK&`3P&Ug0lY$%?SV0k3z3bvzf{dM+b`K%BBtGy|o1?h2rM z>Y0{BS9c|!hV`*7@9J@RoE5qboKmb1#R}(sg<|8Mq4sCUEz`M>Ta2!dleHzREm#%# zeCB(h2x5#&6QCm3p+{ z^p-}|#;_(rnU=y7TbJ+5#=%Lb`RCUq(*7eVFX+zX&mvbMlD3tfQL^{HfP z;s!RCZXT8(^G?9<{rO1}$#u8NjHV+aecoAQoOse~P)S{v5Fqr9oX2U>MZ!dtO9l!b z6@5}`sd6P^7Gng1(T=Jf+Zu`xVWTEake-$g!xE&53ZbpoDaZjXF5^~GqpQlP)#>yF z#vETSzM7;pHbMrCt;nD$iD)Ad{1upr3QV0B3KON_=>p>_AA&EEq{a$wwae~$S_{cH zI2|sBlhL)+J3u~IuQf2j_P%bH)}XbxU2Vm`6i(e{!CWIspyjLqO=kl+@GI8gppS)T zPzTQ)+Htu*uTf{^5NXd>x** z9)s%%(K+~%? zSrVO9e0mlwdsti0`{I&8|3ee)raJCEK zI;Q)DeHE3uI`1e7)vYctvOcjK?ILND*8AF*D_W$qiA)Ju&f<->6^c-_|;%{D!ON#wgY;z z!?ne!^k;59%X4sVe7)jZzy>kGzR6@rOq{0uRPkTL{rDF{HpE10LS~4c7h-fBzK^Fy zdK3!KL34l%j_E`$#6)T?Q;;~#O^XO=>=bG}-K)X%0NS@M-Qk*o|1$?PxbDOMV@NMB z6d03ylKm+0Zj${|B^Ad1LJ(GQGQ^^2MXaF;lF(uuuiZ&k2fi;`gG*;v1$m^PnGl4g zP0=*QPhI9&Rooi8iZkd#r!r1 z|3E2^qhGBC3-nGfN-~zyAuHAYI#;9Emj) z$+PYOi0;7rw;{TjtCWGY6j<*py3wm>``RHkGk+3oescbC)bE3Gk{#FG`gl@9ZiBDN z?xY5>!Q1-=*+l?f6oISDLj$G~s_4~Sr6U+<*;U%h)l$_;HcD?M_^M3!xXymHsw;t& zQbKLf&nlqq=QZ1B};>zJ6Nh6!%4OwzCYjwA)o~pa3o}0_aZ}G|2u_ajkl`z7`%L?HM2-Qz;vPMgR zc488LI0QyYaiMDh#@AiW*5A#L={a|$spO+f369O`iOGBh|>&C+Un zaI{1*N+1Yt0&fyrJwaR{21|&Tw-R{>f^AuQt6_q(0aCk^S%|@Z7$(@^t#t7FzHAPR zA4ZqVH8_`Bw4sSG>lj_Ez7_;F0SSVzcv-E}0A`PvllW>gBg`+hyK0cX4fzPdgUi|& z98Np%Xmt@_f)0S)B^rdkJ5M>S>Yks!?DlR`1r3wr>-k6G-6EP8Xc&1kd=T&J8i12W zO`ShYv5DmYvfZCoMU@VDxpSxS@@R3RwcRC^5XVZak?530=fsVmdgswH->OzLsD4j! zy>q73gW7va4x(xP_P8>YctF5|?!*X%)E917Lf}MI;jQz z=HqHrqB5C81(68mXep|6XZdD|=y+|sq#;@vO2P5uNMd5PT;=oyFz6S&hH8HMlq6_) z#(aY#NYB8srN$5y0HcfN_JNqZZ}QjMlFpao`Pt?8FYT-U`EBvV#S7|VzcJei^^dd z5PR-8Y4m-HOfw{Fx}}n*3=?(tjBqGioiW6vU5fRHT1yLA9|S^17!&7cMZ{ml5<}8( zjV+$cOB%0vwg-7XX+X3huSEX@v@tm*S8j-wRm78EN(sBl$S z3@+?Hz--x6z#zql6?;9z*o+lB)NEYC{)YMr;G|?|kEd})*OB|ao)P+We?}V$v#?=5 zUvK8iFgC6DBfRmbn-<|Jc(2zjf)7!xZd#iT8uly9wrp?mXcxoyj9I15{ZlfM7rniI zT8Xp1rk>4YHt%t33~i1udhJGLvv#Aq{&Kwr^%ou-+qgf+*;vnN+lai$-GQ@Vb;?oh z#pc+b#yfoVq)l?76IvCUHsSg-zD||?Q72iA-mWt1{dtX`>x4JRS_L5>2wyL0s8>AP zox~MsgG*|)zE;}NXhUJL#ew+b}nc!&Z|40`sQFw@Sg}K3X z(CKlqq)S?-h4m0&{erX3U!X2!18w&s4z!}$-5@Q1)mCUKc&Aoq2d<_3;$!4xOM9%q zR{12&#SnX%;!5&>tVdKg7nZ9#(CucRy1iRgs^pO%10(#WC+*olVViU3da5 zwST$FE+WUrL?zUBlqSgV+gRV#ku2<$=wGF$0!iw^LqM|T|G=b1Wb$|`Oqzk;ypZbL zqT869ct<8j1Tr}tNTx5OtCYn51CyJ}s3iZ=3X@BLf9b+Kz<)`-FrkvPUW~qzB)^T8 zXC=4F>()-xagC~Ox&hcXEZhR@^;i|0N%bJlz7V@*3+d9oPuXQByfH=eM25#1VzCuy z@f`}!r~@#L(1lQ2U2hewj9;VVOnJF@F-k^1(RS3e6}{rmJ*BxQ z3p)&25Z3O75-Rq8!I`@UqPY=L}HQdx}H{hh1!O$0~<+ zqqgqS^%!Bt9#Dw{4=r=t(_d$C|RtlBEq zS**-uv2qW?vH38%*~7G!oKkUN!^29AVMoGyQ-v9v(S@mCRy>UT?1yoNDitU)A66Wd zHzGXZDqVNm-1IYYw3twHd~Nc*2q`HJYVn7Pu0MxLw@w9%Qy-=+|M$me%VWWZ?=Mk~ zS}th$9{$=C`W?gXJVxyZ9yKk6z!8LQ50gHbdh1Ctkqe9e0@x zjPNJ%>t1}7C(*P4_-da_zxv^;QOr%p*H2EL z{kc?ejr4_>)b>sLXotLDP9_EYJ6b!50Dk-3cSeOyJa9oQf(v314)v8P9VTHBykU!u zS{UKtQe_-!l-6jaF-|R|la|t*RHomII%)}aN!Ku{hHp8X3QODKz#=1D?;%9w;O<>Ekh#E>YOBHDm^MGjUo18~9+i&lS8<9i%VvWzZTQ5Q?lh~^)-Cb*NHP3Ni zUE)TtBY0FS7J+QhqWvH{6VjOF!?Tq0tx>2YXZ0yCrEiWF#SvK7QXnc_v;@jLYbjbD zg5M0~DQ(L$g5#kEIyzN4h|z_hhd2O-AXpxfw{@gNcXu#AS1Pp1nSp!zvB(PdjXye$ zA~?I#P{0{4JE=1x6iz-`f1(+b;de_YoPY5s?5jNr!qBttX24qbsY0a%#= zF|iXePlzOG=Fj-LGs!&*l@&xHWG1(b)HLK=R(7hakb@Spe9+=#bOiSjWqh3vmpcQ= zyVnpc1E&Hwbur!SJg|hUytjL>58;k`GyM~%(t4FkVE-+K{kItK3+NJ*ihLj%MYhVQ zU)PLt5ez~O4z;oLa2s$-T3=3=j=!N-B3+B!ZGU+Z0r9w{;n4*hB8OiJ2A3|Dk6XaZ zT_E=WvLd^CLSWZ4hI?G0*m6t&-Gn-FAluYRC4PGZXH-!M1i^?(G^%_9LE+N4i&m|m zlHKU$EmCu00 zkOhV4MlZr%Z^Sy4LR9GZgi=UYs*+( zTgC|70_uLpml*r0#N(`;qt!+QFk%3#0kGFgC@j9j*r^g__&yjWnfAA9#)-($8w$uH zLpnxFN2js>FZ`pueBPP7HY6_C=Xz`$6HPuH5*&PEFNzML zhl4y!+L7Mo(NS`TF+uvKvbQ0C{^VJ6=T>@hXK^W)#$UZP1!tKG0bf{#ji009=PgQes_#)&NA^$v5XzpZRu7NLR@{Mevg5iu0VuT;!6()bC2qGhK`#>`N zAV*ptIqie!isgi~2~5vdPe&(05X|!jojc$)^D7ZY5KLrsPPd-x%G&Vj$}T&MwM%NL zB@zQR;{mzfn|00wXa}GXga~pxXWWnjh#e@?0p`1T9vnrdW1%NDsgB1FI=2tdCy|dJ zd@*m(xq4u5BJCW~5QJm%$n@N?nKuxI~hT?sI8y-QQe*}A6^XO2#1yd?ImYm5= z%uYu}`Xkhfv}_)oS%-2sxZQ<;1p=e3OM_28D@M=MM___J@;3DBw~NStVQEt(kwn={ zVD+*iqxSLIy|td&wy1O=D)dcfD9uDu(|ca3=;>xo6$n;|1k>k*8nVv42kz>SRwt$< z&yzI~sUK#LmH0Qq#`=5HIWTbU5$e5ofD9hqX@cC#6zw*05!Ds)LNpQ!(VwwP;DLLW z9!SG!pwPQb)jh~t!w1g20ge!aXXYMKDYP4)O;b0`r4%sh;_iyf?;SPg9Tn$eBxgia z!eDVf%>?(fj8k#b!Rs(Umci~3%3%|32^7YXLy*B5tTbes?KPhgZG8o}_+e@VsJXq} z>Y!)T0*$c%WgoVe5zZI46%7l0S5iDOS!Qm-NM)8y1#_uOH0U9min;E0W$r(v|6iC} z>SHb@g^V5LXKv}JEPwCG19N#xzJlalB?m`!YDE{V0V{OwWN=hcEv?&UMc?!;&h7zn zf|zd3X%8_;J?|=d9_@F%yGdTnP{sD6J~y&3PZumXO~}eTf1lryr<^k^2G_+)&Vp+l z7Bq5uCu{H4kAHtiu1CuMwjP~Pk+L~bdtXnHgre%4bhaxWt&{t}`q62AaaMrgiY0Un z^2$TXWFeUrirE{fGEQ0wFlG*ApPnORgfmeR?K@ljTW9M5T|n;1?F3`Eo%{Lsr0|Uq^glh!R`MvW0X|CBjva2WbgyvPTpe%*tQHI`7i0AJhP3JZOE+?1 zY@FP9q2o%&20g0bgC12Mi0D5n$2r9~d)|Y_Ve>{A4fB-!jZ9n}Q5+)gww0XNil3Go z8n-kh6}%t_Us=rJDUrJFFuve8F!R~SK@dK%kZI%nOsp6`QS)YZ@~M(?Y5Z8t(G-$h z&_`yptiU)@k`&x3mIitU#la%v@k&ARkHCS96VRMvPMK?`fwP2IG!VtOhop@*EmTMa zS`R_EHnSS^;hA!dGFHs@I1CngLMg-&3HZ(rahCEX4}7Wcoh_(xncl)p#|7n0m%a34 zOQW+A>0d9b5N{&N_>T9S**vGw^)M89Ph_84$mnK4mFnQ?*13-5GgnT|K|0N={3xn|uB;=8f`4*{{xV9C_?}i`{ge~OViKDG4;4B4~u_V&T zd*2S#zwfyR1cl~h?muWvS@0D{neW*iDIVVz>>A}=(l(V03v z2jo};vhBW%5i3UwL6|bbgjfY)2twhEeg>?h*CC1^ zjGmE(%$E>D5OQbG{Vh9U2*SNH5)j*g7=n;Fqa$Jt#1MquGw3;wdc+Wf?lb6}y#~Y( zgf26h=hQp;8=xQOYmG^0Qytn=S66{H<%93=UHRQ5O-^FS=ge;_<8rx^Da9dz05 z74{M91F;?6zNIxnmlZl(xP@+9MV@~kHmpVkRYg8Q*<%lccDTO#c#Ym)dKsB8J(gWa z9-1E8cZMGah4DB!cqAn{UZKFB=a4rTNx`((gi%QMfUZZRo1~(cb&Kex={3D?k(o2} z8pAD8J|k1p_7-_(hCaUerq+m6Ss}c-;8tCm9|=DrHuf8T{`K7vHA-Dikf@nGdXzkl z-v2l*2Ti48IvQ6x8HU0^cd0nuMP|+HI4yUs!*zYP+gatH5bgkojeaUpU2CyFOr`1- zp7!Tp{t;fmn#+!<&F7OoA0su%g_&l}eK$$^gZhM#fcMlx3j15uXV6Vzc~CzfJpf>p zN=#h>a@0*0d6T^Jpgy*(AAq)sB8zLJpCy*PNXFprw`8tm(6|kd3xdE*y}rB3PLK9i zIN6C+u2s%5%$#&TZ8snggrBEe-_6y~Eku_06DI_A=lnh@7~`NRvuRX?_Mzj$vd1}E#({kRc$lp2C>Z2TPOPqG7$58 zNX5P1EgoYM+w^=0gVp~sSR2cr(5K+wJHAtvCGi@L&J6cYrpnkPPMk*MAP9@6(5397 z&`NnoK@jF4MLN7^;8}J@L0K(>iM*yD&Vp?q-Q;|}2v?el-lMag@5?5koC*X8!blNi zK2R=23W6|riVRD&d<9YwgeCq|x)m+qim;*Q6s#)5)CZ_d%jib*%qa$*G15sbyYeF~ zZqCbO*}{B&DVSLbW&naI=4pmbVs$8rAml;%I8Os?LZ!+YS2^lX)8jtHB9ce9M}KKa-DZrOR@B(HoUdNSqJ364fis<&4aQ2n&7 zAZK!wGiS2hX)a(VJ79vAf=X%m9w&v%m_&>v-L2{*{iIrFsz}^>YY8-RI)s4;H=08 zOICgdGIx~ICCZmYwN9f*zTwtA7*CXACHJU5xAsM8h!QzqiICfbX zSQAnXxwtSfSmI_c_fR-%9ln$0hwqd+S~E~I+v(7l!Zq9JQ!Q|7f)T@V*_6xY&FCR! z*yeid2`Vvamj-j!>~vdi6q9YhLo*hPWM&}xlw1PN$=gfBi$(e{U42D*GKu~oq`owv zeKzQ2)3t!GnS5K?BiI6dEX#@R;f=u(>tx%*hTxZw`qFZ8^x@fQ>I!i-R7M-2ciAy_ ziw|2QFQSiB_)1P*lpk{hC6C-zKl1*f6dAvJQFp6U2P$H^CHo*f4dp{3Nsh`ROn-YS zl}k8|VFg0dE2m!J#4S@Rc<3^%B|Jx-UL2JeSTT67wQ7pw{l$NT&6dSv_WRw1(RsH9 z{xL@TVTHosEHJtry5^W$39S?hloQ!d_J8GCCfDZH&{oK`Do!w|YLtGy-Y>O^`{p0u zdiEpTGXlHB{8nhUlr`D^NJ7APqYmv>T04-v0PY^UnbHcOK$*%-O8Z_|%f3e@E$QOx z*n3wj>7&t|LH|FqoVp=A<4N7pd~4YhT=B<^`IX*5O;2Ly;35DnF2_dc3T%|F!2Dm} zcBS#n*s?k6%r#8&McbL##{WaDF|(DW79NC5|i@#N%VhPZ4*5ri@0 zLvc$ESC$Y*5QdE>;g3&@UJ5izS6or8=ehA@>Ek$|fDA`K#>H{uz~e@p2M9bXE~6%& zjw8)T$b16J)+cC!V;sp`W+*C00)p_Tac2HBz7d2;_?FXO97p$lZWO_TBfZ0fM-r&Q zF!Mnx85)GA#s%tSyu;G4EU~|I6&-FEU$Hg}7R@MvAn3>Wp0L4~GX5q%DdZK>NK|=G zb_N+--l@lg-%K^jYZ##|BVj1R;imSCsdjm-sm3cz{mtzv$NwVoM0rwj;Ytl(xbg`s z5~M3;^dMMSZ7r??4yvJ7&3+$CJ}57VJ}}y79AwOg6@r}|SV)W@f{xAr$yz6uI(5YE8;T)eWG{L z)4jT0$B4_JHkS?j2z)v1Ug4%EtETcJO$BSw8uKh=AaT`m&2HdF ziIA5(`~A78c;d?|eCJsXJfp?jZ#@pYMo>{%zNH~Ir%*5Ef9~-(59V&NlmPZ$R*(PH zFRfQN;-Ony-pPvU{2TJAasT|3LcEJOE8oD66A|x4I%Dt(A9`qQn^6e_p>mYJyNQ;x zR9i(^2QhRR>lNNcDSGnW<09u*M_M;~ls+tjZ1m9SPD!VFUjG!{UV4fVw4>CA!V}QE z2{;rkF};dsD!f8RU$v-p)xlrI9L6hXRXG}33C?R3ri-g0LBc5rktS zB_a_(d+ujxL33Rtt*?HjGc-LUT7nWKPtj(*GScHr!qP{pr7sIsAss>Z^GLdd7H*&n zEbs~m0StUOlC|*gWGJ^%$iUiPuKOU2%EWY*J@I)Cu9 z)~L6X7qCSN{x-gbagfiR?q(hOGkvEoivtb4SLpt8dD9JVAA?sA@GMY@FZDSwwfwsq zUcBarRA?q}fgor`dWEK2CZkk(+0XPSeF6?6Cs^qz*n37&eXx>N9JosYu>3229eQOF z9wlVa?Jv;?ZNTPB)H1jqU7!^_)GM!! zon1`#cgSyR4JMhC0b3$+55v-^_+Tz&%PZI~(HQNcSU82e6)*QlGX5F;c;&`|Tr>#A zCgmFU*3k$3Z7S!a-CdKLX>bqtEO($Qt(4r$eDC&%Re!^)@1{*(&`aFzOn0mju)+I=xY*07d%fra6=VB7?xhKM? zHL^x-G7kHq+iwQ?&DK@UjTq}s3?msErblzoNZd}@cQ3`rmJMmanaIf8Nlt7?x2Ah# zA*gSs95K@_VgQ%{6Bcz;(PwBcqZYeC20>`frH-=+=-zTC(;BZJ{~YoWg!8$K5W~_L zwM~H^1|pK7@%|qTtypX5~|B)PdAv58Z3;wwUJ)j-5ay9?{cvSP$mI|+n@s~@`$GL@QH&FrjD0m)SQq7LF!*ji!%YpBw86% zA4RK{m&CI%I`^PoBk03^jNgD3k_ym%KnrB43dk!@>U8M^=V~@kXYV8vtI{p&FLeOm zAXMV%OQHB0jjxJJ^d*z~@%4m?$cOPG{Y2;;q(4aHo2vB8;UbX`ARHlC+T0Ix`|m*Jod7bj#7KoLhRlA+ zFzWX9Hv|YPRGiU1zc|R({BGB?0YVEA^FJj2e5uDD#P!BSsVi~NG80?D^#U3A@*l-D z|Kj~3U-W<$eJM?DWDc5~cF!r~t(S*dmF*WdR7dLX^a2(ZH^1Yx1hGT+hw*Zi#b(TS zuMmseYf%gYdgyz)^DLd6gLBW=Y^ScG|BP&e-5fENLj37_c%^mGuz!<(_X;KpC2nVdTahy?5WT|i@70_;oRssIDCbrm>zRJmUBAJ$Y{B~92K!hSIj5Y1YyTuGtaGJXb`px_6k9lIad-`FS=rM<+w~+w8m@Wyu$Y$ z`Y>@jqi6xXN1m-7lV-c*74H9SJrn{I3FJNzwq7ATMyWuCAlyILudZ)ZXQaM0h%VMm zTNt5mka|7;M1~X_ZXAcHEUqt^x+#NQLY~{yFXMg>S4`J4CSXJmdJhi4DIZFs7%2$C zxok7P4&UomO@NF#4Zg5taMhv-k=pMCf3(FTPJ;YFgKTPT%|#H)cK5r?j1-#L!-T*v;z@cK%mDozb z!`Vmg<(x?v4*HHi8=X1$IRCTKd?nSjl#q;vaM_tx7hun@lN%oEp_&F2i_ zdsiQgfx^ninpI5w$(QOHgXI*;A_!03tF=@Vgv`1h_Vmk_=%aYprA1y|<#8u{$nr1u zN|=D$0W&~#BL(P>^;~uh6HHOH9vw?-8&yukRA=3NyUcO?kYEie2?q(2BX?l2{Fw#A;~= z^NE3UThA-JcvEKVO>szhXjwkAmv4*6eFb=Db#d-0TZDF5ozQ7B`XUEyMylOy+~SKxAd)?W&@+P0#=UfW)>XcwIQ zyJD<)z?rv(x)GUga8U@c>0<2K*Xr06#1zOMzgCM<5t}3|>c_0NufoepS}aZTc?*PY z5rr-b(=VX&ZLIJ}t5JUdLS6?i^FY`~PJET(kCPTDThX^v;t-{=8>DuNq)Z^yfLMbV>xY<*VJ;PKOA!&Y3IeX-_Br~79ClzvqOG?38BEBKcj90 z{*1a`C`0VOux7;wlSY{$3Hl<0;2MS7B~&QBx~&VbwN z(G)L3z6nf{OJ4lV5OH|bV~3dAUn-Jaf zG*Cg`Yo~K6^BenQxx?}L6QJ&Ts#k2R)6i467!L}Q9aKZ&j zn=o8#!WG!=Yd~29p~OfI?;W3%f1|B|?s9vDFr1yLfTx1)X^+0y7G?=eJx1=S>zXb* zO|e+KNFU1c3SDkU|G&H;4|}TSy~3AYlFGW&VhfB0i@1+AMb%{*(b@&LZeF1qi&WW= zz_z5%1gV4taNG{bg$%l5KC#OsN%(s)k-y_jSvVd;^e7+^B?I0YX;tV?zzTQlS*;O= zr$WZ)Vd3lYRJfh?K-%buA*MU#E3_kRElak6C0_+*Oqhc^(KA^-Zi3#=_RTD&EgUgz zx!Y_g>j>)Rm6a4u)`~9?)8&steA`{p0u)9zPFS4AlFM?o5X-6pZHN~0txwBXZ58lL z(WfuyGZ=Kc!6^j4?*EuF=ebXp+sP!Olrf}}Ca**vaH;7}kHCa7~(NtfZ-5baQiLdw9( z296nukp85T)?#%1Em_HCJ$#=f{<-)BO7xm7vddgf`o6!7$ZjO0;$D7K#taZU@9t#aQjB4wzCUYlY_SL~b^6v&Gykr|55jb%Ob)Kx_(t zu$?kzsWR7}iUGQ4Ke5UHVoxBZ32S7g%09_T(9;;jLQH-EuUmaPg~>jN;a4#2#!1?Hszm>&+nJnxJ0 z+j__J0QgA?dU2!O4N}lNpLkqUM2S9fTfY!HQn?tT5=@7&eNo&5S z_pz-|YyMo#$z{ZRdHullh0g<<@hq|xiv*dJfmK*}zC0iwK%#s73vV6OaV|`ewHQ(pH}IHwj{o zA*SRl67k0>g9{MFR)F}L1<@IZDGW{a6SrYH_zo7HHY`R_Yk(gSP49L6YXRRo z0KPk7s`__90ey=C9Rmu42M}lnc%0-631sQUXX*<5ikMQNOP|$4vs2CNmx@(52N2(Q zLXEyg%%3TI@tLXDI%5Y+*pwM*!lu@PJVCo%MkON6*2-{7)w{8;kR)Dy=!8PP@e^|> zTT}iWDLS-WHLj~q(1(jvV+V@j`4eW09ka{aa_k__dV&o2dmoj0pMApL3y}Q)V!mF0 zSkVbpFF<@OauroJ0x?Bl4Dl0ODTc0R{6<6`UwBl$p zl)-MQ5REwBqLQLxsf{sB_V&)-440s>8ZsmY47vYV^X`?Ig)PNF6h$(q-N}d(yqK?ZI_-`wF+RRc_|9_3Xsi9~d9E=gI zcUg)R;>w}5;U|;FzPET-Nt&*xq+>Dq8sQ1>PhswlvaK5+9t2@ucet+bjUd!^r(S{b znhF=R99FYGL{+)!?T!9Ml-9H|D|ga^k{Y~|EF4m=vx;?V_`h~L^g0K6T|+>xqa+oH-Hh7fXFor>zjDcR&Y5`CB23(E+K$a&WOKuIB4_EZRi0-I9bvl5jKSRg3=3nqcBUUEH{_`o^;r_gn9>(Z0{5GM)$K${(830mz5#o}OD8=Wsh|g>R zKRGaN6~=$k&u@53C`JH8vJIs8V8kV>LW=iq5%1jszFUiU=TC5-9*V2M83N0L_$?2L zEyXK@LpBYrx)w~d`J~xS-JD)w;wQxPX;Gqforc%06Yz6D4LF#97n5rr@&6iD|E}ci zPnTE&L8<~keoB@GP9s>M2To}3Tme?p6?^DdV0;eZYC$}3OkI)ufQrEQiU9cVbqvB4 zCvD8SWU~8Tnbu+?6|Wmq!w4@WOC5CDCF(632Vb_`$(rf$bK26$Xz6u;UAImWa~RNV zMtrj`-nK>j=Es5XzkZwq8LE5TML?XisygvGnxKlGL0nznuT#vaE2RnuKbBF5t; z>zx6PB)P$po4$sF;pPw@%= zSc}b7MZQ1YDJlgpDbLcDdpb#Ks4*nsL`Q2L((|5`8ifI_>4;DF#hZ`9TvO$Hj?!hU zv@;`>_#P0_zKsODLlC&_SBCk0f>{&4yw5hiMBOJ68)S+ zeBNcCdQd&_PbsJNN2o|krRe7W=T#|f?nSyb%k`E0jm-bNATnq@P5`e*<$Z^tw|5~& zJ}{cCccrEzV@nRtm22V|p0={N#k+G&G$DLt|;J#zJz z(_Z1#FUf^37Dkq$x~1!>%9GB1pGqY2P929V0kTzYe1ak8IKLRWFE#hiUPyK_eJ&k(^7s}AT z%3Nh)=Q--D)~`QE1m3+6Sm@nAlGNzbDb>}MpqAQ>cv)WA8yG%&gCegd z6Wov|*ON-E>zUrx66BX`pxSnNf>i0`^MP}X`$O93IC=tFM3NTR0Jkx)rvGg|ZDHmNMrmGj{jzQ!8;T=H87Uq@H`% zBd(sCD?g-aUd`HaKqym^)hj%L1U0|{f6eIJO0~S&jGG2%wHY@Nadm#a$TWTYN?nzq zfKnSU0}&VVLww4p?}y}zuhX*Ep*7ZRkfaj@7UcEZ=*G)c=9%%rcUV?Pdt3gkkcS?+DC*O#${_&{J9qK)rTw4LJFCG9d1cxUtCKv zFX8w5K;|OQUi6WP1X^`Gv_)Lgg3S2a$PBoROcW*4Df@ZY3(rduv;7_RgDU=Pi}a9&)eyapdE!!EHnC z1+mcGhulgKQV+SMh^vQO>7kZGZVn)nAqU?m;)Z9e4E{(Bcb}iD)`r}0fUAdGHsb0b zmnkyca>(@rl)9Oc5LY)-ERJbv&ZUi05B-}5F|DFirusV6uPx#~A+Co1?jRk4l{h&e z4Z?mThaVSQ`n-lOeO?@cv3jvXDJj<9I=L~R0dKEnT&#SGPu~nXDEB3OSYMFefm-kIbiy%DTiTV+;ah%=_51Mqox8rxz>g|fwD^K}R`}XwyM+;&yVKvSz!4!acDcI*J%RN6en!YtU)e+;9_4og(DOoj zY0X8Kqr78AQ|V&w9N0w=M#cCS^Ei8>ROce{5rk#Phvcxlqto^lEcTRY{YOw&>jRP7 z#bna?DMmH5{qYp49s=>W`io-e?R$T^a`uQ__1z{qVePvdXdL|7#Eu5L(Wj-iKO(ro@g%UWwYLJAu`=dP)gL_M&Y=E zyg~y%{3dHHj0N~EknjsLK>Sc(s5OG{YP281cRuWzg9;gzE+7zub$*E9tn{l&gKAfx z5gRb~P=m4EhI3#;;h+tHbUL~UuY`WjhObsgw!muB>ccRQ$WyL_cp-^5wo z77rwMaHBb?%E8&jnpN5_;^DCeSwmZpMe|C{wgJtyp$FRS9o)}WJGSL^Jq!Q@;SJ=I zkrxcZgQN2KG8_RY!|8he7akDA^>mz08UxS0FW1Ie=$nP7BXRW#r^`=^C(flW^7e&< z;a?!5bwuZZh~8ccM6{zdM4>+>=lZbQ%*AvWH8Mfb2Ml_;OnsuQ-d^ZvJ#X)#AGfo? zD__L>rZ1AXpNyJxj*P{>D2_b!(@Z(z>`znWPxB=MTSI1Dx`%y+ynM;2N$Wrge;%L- z??Bf5{2JRpx_Sn(+sFf+eaRBi_0zal*@=wq&mG&8RDSgI>Yf=Fa<{mGaQe;^PBJg| z(HO!>@#Wz%`gblD%b)ry2KGHN=t^Jqb+X{f$C`m*WWX;2H1T0%(JxzYDJ0@*PquFF zy;p~_8k3H!{54M#rQ7?_uff5Z4k6^z|2)oqMn>G2AAIA55dOvsd-vSv!{XWpf0JJO z=yGe9rnDV7c59?2uN{f@9@d4lW9DA#&4R6VrCVzK_X$eZp9SCivnmOjNt7i#o7NtyNotc?82ae&g0KgvYS&&1?%r z=w$N>d%Ro*o`Rm2%$pgi03t(;wK@DtTYq!3GfpzH_`*G9@jCo_=&e7srOz+YE7A0U z#!0qRS3=NzG>NcjkjSI6NT!PRZ8Z~FGuOiPfZKOpM1R?pP4ZwJ3r)rNnmYF~IPYtqDw-QMVOyZ&4=%NA^5 zO4?Yyo5S&Aw^vV(XEz2jHgs-V_0@QGZSW3I+)-6sk-+Nl4O6wM`i%s(yY+lk2!Fmx zYh;+bS6OXlG~V9<I1Uzz<=b5h!9?hQt?3t>hJ=Ye8lma^BW+xc7 zz;&!jpMh6)Q0@%MJv;5bX*v9Xs=SwRVXZ18gPUxdHsNJ$(P&`xxG1%@23nrceblL> zdRS++cZ}B7p4ZwQGJaS*k~i3xlD3(__`h#$XEvMtZvu8FvN0+FztV+Gop$#&na%uq zpe^2nDuPb&FeYQLE+l#sbb-=J@^IXS;rMI7NUyH!!Ww-n(Jovuzmu_Lm#uE>!X~R& z+IOQ1Yhm@5&$SC}AN{+T{xZ%akbbm%xDk)GoZGiFi9MkS&bEc|*|zGjDeQpYbQ{a3 z+p5>4u#>}!w$rCKm<$#}sc3uk#S|9j+IO|%H|?rU>&7MoAKRtjkL}twwi{c{25;IN z%5U1d?`U`EKC|{MI*cThpnYpLgJ<5}!Vk~S$5U^3{C*j0GU8{mL>T;Z)>{+~_0|nV z7dW#EO$q!x+4S7juyitp8zn5e*g&jEVNCSz5uQ4t6N1Hn>aG)t#>C<+VrL{$7Y5`C1g&#f0j11onHo=ZS8%O z$2t)XwH9tbj)79EK9|PM9H7)ss@n)-N#P~2ENTV}Fe%a3ZYx{fi_Olsy=++_rTU&o z6;GVpMsr_NFE&*ZqiAEbF0M}L!&)#1a`}|)Qn#jERfCw+Rn20$+%;0Riy9wI-neU` zEmzkjp`CFyBMk@&PgU1!==GaWYdgZBMZ&AU>BCMBK8+HmckMIxWnW;!OSa>p-FEzP z@^&~ww^yGrvW6Hp0Nf%>=I8{aP)Nuxor%1o{7d7 z-h)W5^?c{5VX+r?eAVvcAGlR(bBs~oT4xOZ`6465HAfr^8QVvJEcu`TQ?PlvXK zT{9=z!b)c|BaGE~8Em-mk3iOkTP z+rXq~iD>XmjSy;d(AiMY5vki~D^+2tt)f#cDn}>rcD_lxI=w$@RN<2F(2jLyTrUCF zOFmqbKE*|$_igFVhHI?mZJX?yYERedYp2#irrS8%)IIu_OY(*!EHkd1p99pCamqxn zXfIHbl088gABX%f1P0%88LP3KuLQSEgUOyw+l{b1s3|}v|GB7|G|5A;>={Ry2{GPB zLM&mFACn2AiCtVhD~s*lqv*6D<5A-+C~6%Pbo(DJJJ(M5moGN*^gkx(@V2B^$f^Eo z7TbmGSN(Ms`+4Y7-~Ni1265v0Z1sVA*|;FD@b9zLU){@2)$ZQH)wBHWE!A1sY!

fI(9p=zs#kj zCd-Z-_Hgjn?c(>6T=s_Vd*9MwY$>anPOC5czt-+QzQ;39^#65dZ)v1yni?fdQ_YZS z5TvOg)l7yoBGptwjbly5prJUVMpKJ%#27VJjXG+@dibi5G-EVKjfyHp)mZCTV~sJY zzK*fhco<&~4-dz29LJnz+RpCG?Ckk||M>p#_PT#uKi=2-$93JG>%LK9iA<_D&DOVc z9TcTUi7EAMf1OfaS5g`+OH6Z|R$q6j)Y_P)kmK8>QFdu|{r7*;_Sf0^xzX&z82?^$(Q%W!|&Dep=0^>k~YjB>nAQc(@tjESWq|GK?Qe+%2iEs~Q}Q${JC> zZ>xU~tp1_=1)~do^NZj8%|HL{cV#Kv(w_fym0uQB^>t?kM;VD#YFE{_+;JTJelVHO z{_9Cy;gF~>ZK@hm>)ZHM@`|HZ>gyH{iLw&Et?sw$>$VJu4o2hZUVAQjqV`|2Vg46S z|9_edt(nl85v{TQFKL`oYM8%I#Bkr&(m#LdFK*3?FWO0K_;YzO>_4}ewCLA)^T+2u znDyOpNp+8vM?GuL^$4H+NN8OWTAK~>S%#Yef8XJ)m($+*)2FG{m3zBqsefvdW0L(m z4O@RZeLX2LJ=;G#Hz;LE`-H4`>>#<=hCG;GoA>>HnE+bTzBQRGOSSU3bw)VWqxB)Z zb-ez^$A9U%b;@eZ?ADZSooXh82lGFlMbbWN;PZK*b=v!UPH3(BxiT;Q=g-S0j_sL0 zAS;CQzsW1>pJ}f5v!HceN|RFG@zXBlbK`yPfV#@(qk@coEz&mgkH=lN<@u;NF~#(g z($G>hG)n%9q%$9S9QpN`59?+Qi*}@zH>T%(u&r}mPJUYn(9(Z+v@LS+gKf9BUHdTW zvx{}NUyK$f?EZP(!Vyvbv|06oJp(5EdRBd#N%yoq4IUj4WoMi{o|Sj*gKl}2q|Ar% z{^xT&tc9)1(X9HGl&?pbQS?k*w~^6z^X^z5?^tig=SL~2nMqkz*d{Bif2(4AexkD* z?%#N~jiXzRZoS)bdSsOF|GLE7{twZDKg`ZWqoSfOQvdVcldZ1v^Ovpv<=5}|QPC)M z27K|Gw58-Pqs+LjY)rHvnqT+ZG0}4gqkq*>@U3Y4J&Bc#ZGT42RT5FldHY!#@9si@-v_CbWRFMDXAc%Nfntz7LaPPiY)z1>e{^)ZK_*4 zGs^9{|118}ls}Op&QFlDEc2|1*XDe=9Tk-zaC-;SW2U z^lu9M@%=w6`|llh{y(&l_ow$B{*wzwzc6!=>vcbz7p1pMofoZ7C|Wilgj-dgOLxbu zQu&3n-upkvya{#lz8m$eoB!RYPrK1ChtNzGP13+*;Wwq_;CG|$32o%T6VvLheJ|=* zcWYsEU*c!+A6o8N7`2VQxS95Plu`FT7DgRgdc7WXP3n4nV+iej{Ks?INpLUu z$1SUV5EUoYj+ild+O)~lFK4~>YU`ilCybjGKI`+PNw2)}>V$92teG@p!mE?MHLkkK zvBFtHU#ZEOJZ<{a3DYK2*G#C&n)u3$tRb&ezg#+F+-sj}_gVecvfuiv$u*O{HFd(w z2~+=_YPEk@@6UDo@6`LFYMp8P_p@b~Af$F0{}&sY6{EN~oJ{&H3Ho%S6|8ltd} z93a0x#=74%MGw`@t&dXb(%y~IA6fn5D6HN@TKNakS~a0AdN+EwZtS~J(j%XhdH0L5 zt>wRv*5!{p=`XcYPFoFHQef6h4#nxV|obbJQcc zSU08>m+O|a;%eQF&C%o0f2%v|EdHM%oUeOgYxHp23x3`Axf8<0*3*vn<~U6<=FI;U z>UwX99!u=wEBVs8ix<$IJhsZg1=LosO+4XIrnI zah%ttE@5lbH8Ck6gz5jGuGdz1Fm0UPYR< z4RL6jitW%-LfdT2$G%vCWjGQ?<0PDlb8sFm#pSpTH()bv$NhK^#YS>M9BSL@xUG(p z+quxe4GOfSKyp{--LXFw;ZPioew!yx#F;n;m*6tgQL>Jbx8V*vh==hsp2e$pJr4IW z$GwTz0W;#-aBp`9y<8~5VjPYmaUxDZBf8g!?p=l}a052t4%~%@@hG0f^LQO^#vvs! zgp_2=z)si;^RXC9aU_nebuh(2HO|8YxB^#UBW_9wA&R4(IU(wq8%Md>AhPgOcnr^?1|HHt#^?}bjK}FXGmg4Q;x21& z7g8)cA@~iCeX$7V;5^)c?$v7bzLx{R|!m(I|3vsCt=NfT;EXRsC z>RlS5-bT{95-HG|;=Og;dkb!hqr5moc^xntSuEc_=9O;%`K!?Y^EctnxHfwFT8N&$ z8%Kry@!!IfI4T_)qS8vNMk6X+gAH*scv6T4*C0y_X8OTRxE=3=s4O9lhEsI-3RHgh z`Z#)VYKUH(g9iBGVy-#IH5a*tLigsPdMU}Zd}O34llY{NPs;EJp5T(eB{5g5;EL6F z3ePb;#U7%_L+h{+PvB`TFo29y9D`GkA{iT4tPhJ7qk7$Du+R_|YPBF&^{zFt-iI9= zXQ~vY%D@3gk^K2gvRSuzQIzr*Zw z$P#7cEHr{;)Eln77nOTaxfjJu@{3IT;&~S?*OhILHYB#W8A6-eb=S5>PuE@wA-)oa zHr|xBNkVf_8*@;bQXGPnI2L7M8=2VVARdlGqNyNpLmcjz8p1u(aX%i!lW3~B=L%kn zL%#(f^jl=EOEBjp;(S~v@s3EmW9Fv&vO~BpCl0bF+*gSHE7AMb#vx6rr%Ck(c7^c3 z-Z-=~x3n|2e5omfFEz)Zy)m@E9ft>{`h%r$=x{fLjtOx{Pw`VLEe;QD2!ZE9#?BBj zcB3gH!<6yJ#1I~t5{E}A`sitMQ|I*|bZ&^lV~awNB%y0{2wi93WxN`P$31a9J|Ygi zjJ%hT_qu_%;*fXB{C_46`Re7X_oNP=)M1~+)|{otVtrVwUmgqei9DwVZeb?OdwT&TstqCvUODGy-eXwgAd4K1!&fNu6$%v`GU6j~7%(@40rL$|djqvsJTHXW;sr)XlV>PW zvd9RR#9>hX5C#Gu1$YFHF`Wtzs?gE$(b4kpU0h*L(bXSnxf3 z5D()myc37a_8v6S(Fik*FjIq>8q8dYt3`34C?0@2a2Hbe5eh$Y18>El)65V$&EeW6 zu5FG(7xlWR_ZZ7P#&TU)whPN<*V6nkns+S`?Pa(R5AZ!xKhD%SWBI-cUC(jd5)r!P z;Zj_V6z)dh?iB4#(e4M3MZ2HEGpPL@+V7Et*_e-gaRiQ%|2>$n2NU*~i}P^>t`b}o zf@?$^dX|OIvmA}6rxEp9E7;Zxwljk5oHR_4hG}tlqA`RgHaQ>ae7O69tGC$7+v0p1 zUcqb1byBV~?!?{l|B15>&byF`?L@B*^L3bCiDU6P-jv_7Q$r4Yp#FIzyINrqD zf_1uJtr4twg0+w6UoHCA#-VR=2z^tXZ+E`ad5!Z~xEuG$|9(X#h+=HQX6Z6gx{O9q zTCfr+P(XpFjPxlZeaZ-*GQy`Q_!I@7nuGIjF)lT+95%5WjYDBO8weecsSBC9kV1tN zD$K{e$fAX{Oj@|Z!7dbpg@Ul~2HuLpSKEj1)pQj7UlsjdU4qMS9d1D7zN%c2az)A& zmEsW8aFKS4xTuJWimu@e6Wlx#+ye7Jj(H##4ZL=Mkq^u@A>^45G*qmiXUt&Fn88Xi z%?DXbo5Zv!cnFU$v5}S<>ELA{3|@gOH<;zh_Iu@gFb>a3=Vzt!vukm^G}Yd7+8caC zxnpq{!LlP*w!Ag}%SG$+I(}Zq&-3Z?eEK|-KhNYtH84~ILscBA;tP{Pcws8e#re1$ zccPA8(D4h$@C2U4^LPcXp>%sex>XoRg@IIbzzocm{}nk7_@shQDh6N)@^J+pS5)Fy z9}TsWEwN1wtosKe1Z{6=O7-^hwX|LGz0uW`Q3 z`3_X?8|rGil5im|c3p#& z8vLe?zp3LfEHs9N#;n10aroAm5WaOT4r9ygHI?IfY>@wBnS3mhkK?0pd^9cxbJ4so zZVK|{IKCXG!Z;PiUBWA5YjsxV!J>HVxmZX<5u(@uQa87puEPQt0U8~4Rw9@EVe1M_q| zPsiUI8p8L6;}JX-hlL3tEab|Cg*YG%ubUTMAA(%^I+woAqOY^)>s(p;I$tizw(pb^ zhwpa{;rrd=uxyHrtLiws$%k+9;j&rI=Q`KWn;LpkLvL#6t)dX#Dt11@`OG*hH}d61 zzFe>^7i`O~;&r@@cjK@kH-r^=$Z{)KZpB6Uzv8ln1kGE5<}D_Bi^<-aj|DVSCYroUnGzhUxK<@RDLFatYbA1puvS!E!r4&f10epPGvrAXUV{wI*I zsyPm;lS5dY8izH|!(luc zhj+N(9WL-?MR;c-p2o9rXyl4Uu4ohsjbfo`K?qHYkOEB<*qr6dvus?8>*LUpXsan1 zxw?g`Ta;^2u69?tE%eMd?COjCQG>fQxO;dAyGNot*Y6kjiN{;p22ezSwoR^6mY)B`T8*-tREkTANC62hxwR>?NKcJP%Qj#3RY7<{%?@~ z8|L8xJcVMZK7qv(<$wKD2h(veE{(&7M)aW(eRvKp=(wGZJD`qs>uAGx4RFNxlG^{Ym1>8vTTieo~4vaAq9dPY>b!Ocb>53)=UW;&R-G zO~`fcbKUza@;-~ae;e<{VMhnASu&6%cCf?_uHM1bJ1XV>j zjZ1JD^6e46J+coEpy)p$`j0LQ;pk#)z>P@JqZB=c$M7F(vqSjDoH!gm=?&EBIQ$|x zgkPlM2|R@g{zAc1`QB{x#o;(I4xb33PXy5?6#soPO_duJ z+^FD>+lTPubliknTtDIZDd&Rg$AW9i;SjbQ#S3^z)`;q@qI&C8oQ|Sm6AWWKTMBc{2r@r^^3kBWX60W*s!^p!pi!kTwIPO$qY(dwl+$AbL*_y{E(Xbhu3r zZ4*S>vM~p%a1zePg?JoK;#IsZ8?^JjcHWWCKh^ z?bbGHxLKMtOSAX5;5{yQ?4c_Ukdcc4cJJ5R0_01QTv{#eQy(Pp+GSO zN>PW~boi4L6H^+6DDpl<-k0C+%kLdrvx94P6ks7zct@+k2k|h44^vpbA77IHA762B z3-8GHx$=EJ^3Bh<<`;bZ3%)+3<5N05Z3L%{;M3jGY99qgQed=>b9J1j;r<#flK&Jx zLh<8Qr1doxNN0geYsvv@${`dRABv3+Yi~HXWpRluE=ib$*;ctSt6Vvbz)^A7+b4v* z1t=)@3d+4Y*sFuRt8uLvZ zylLbt`3XyY(uB<{IEn=;aWO8H|DW>Br+oA25?n@OCi*E89hViyWyL9Jc}iODWBPqe zzpnyE;8dJ$jxRUIS0LAY#C0F7Mi%+#5FSx(jB?|#5jWvwyy||Q`+em9J_YwF_>qx( zWF#Na^dp+?cYVL>`%mE+7NFok3Lad8>#PYZ@OP~im~P}XM!41p*Bb~6e#(L$m$K*( zYYI~zVCtWhiK%itj7PPTqMh0_2L%oaaS~3|U@r~k<4_!~;n5l%gBt#%)ioMAsG)(;(oR36hBDuzZ*co5?qO^@dn;9^>#P)_QK)v|IkPWGhCR7<8fjf{+{N4 zPxHS&iKor!{Y}wDR=*spUoM`qdlmDs$M`&-l_G+*h zw~Kl%KF!6aXW?9|l_sa9$)^Q^rVuaTl{lQq4B<>x9L_TNStdU>(R=18&dZ#a$G(B{ z-E{jnoHuWrH*cKpirr)Xi;&NH&!Un4lab$?8p6%#akxvdyA->4!rRzWarn*J5Pq{> z{{Ke7-za$bcnFtI#^JX#{4EWC>-@JTKbguo#=&1suwEvd!cfF z`#AcN>tEU)M-R*h(F5LhbnG0Wj$P4;;4UFi29e~a$FflPdk6Q^<4e_y}X<1*DFN*@^KPQ_3G!4S3gJMXn@y$11`tW zz&RlrI1jz*8R%8dz=P=iz%!_$ftT7?fTMq}Mt@yiO1|p7oZzX`Yb zO}GP1JS`@kT?hOoJcKv!mQ{0sRdW$4w_CYA?(cDbkNbPv-@nlm-ee-1X(F2=yBcKI zM%k1g|Ia2mNXJY(g=gaMUn@iSuVbZMsk9ry0y^lggZWF0e3=nnGU6+?T>9H`DMA+c z9*cZ$9xgB-uu3c;7tn5 zF$K>t1MuHnGGW&w_OU_L+b4)a2C)y{R5{L0zGoEY4 z-^APY^>*0T+hv!Gg5Rd#jI0o5WaA=SVwcQ}`KlT7)r)vJ4mJ9#(O->vHM^|;uNl#6 zM)aByy=FvXm~sqLj#-W?J;mHs2!4yh8sGf#;dw1P?9ZI|2J7Rw^I`~V^NWr{Z?akHR5?qPv zwKrUQV{r=F|BD8jxdu;11qT~R{wM_}IybQlHnEfydbd14ha+`3+II)$fi6vPl%3}L zf^^hTwh?D9Lo;0VRlJV3@J<{(#$u0^V>Oyjx+eJCAPG&?wOwav&w$mf;9rb}aT~$5LeR zToYLCnlL)b)$xNg?vM~ig)}W38b{uIMBaQvMIAy^q~T|{=V@q67(L!DNUQ&M*T{qj-$bVcSOHwUKyjhT}*)j~BfQl_#m^ z#dogw%{?HqB|xqO=vd+1

;&W4!HY^0uehTN*6F=kra%eQ`ZDpzF`KUYB6cOR!-Q zXPAT==6sm*g^hN3H=&tep_yRzCW*TRcj9i(x4A0hsxWt(Oy42pkC^t4;bpuUhxuL2 zP2Ei$qf8x@I2Y&RB3yziakbsy4R(hcu^G4HUfi$U-P+x!Jr=2Dk=kM`#Y(Il>tKq5 zYFvZskjAw%ZvE|3drJrFbg%(8qFMTNBYE9OzJFK;M{OUc**Fp(&zC_WN zrs8y*g>!KQu3}nq;X-ra_it0^ZX6c(4`Fc;9>l|O_-iixYc5^FRZF<)4gI{KpEssk z-`=Qkz*KKA)f*@AbR3pu`)=55zqAksAd@cLj>qss9DZN~KQMwH6k#zg#pS4jALwAh zd@oNHQlN?glaK`#-=GME|C+)}22i8~uUg-hT-UK#_zko08!K@&8p#_*vUH3N$9pT| zyvq56Bn?}iCgfrs8tDWhouJ$V5iUU{e3=PfK7;4*2Hw(es)pMkOHE>_NhMf@6qrPT zNo#REZpWQ?1driGyo~ypte@J+nGUjO$mf&!eDVyOiA!)9GU;R{oh+RuOQ*>colMcm z*YTzivB(q_nNo)3I2NmL0WQMTxE8nIHavt!@GQ3G|CE~!ZpYz2W`*z{v-!%%78}{( zp*S2*<5|9&%XjnntUH(W;-UmDN<``OhID#kBQ|lF`b*Vcx(3&Y2@3vzfa9@a1Uc6<^Q@G2eWV;Zopl*7X{-w!MM&y*BR;CX?E<}Bj3Nx_ivYD1y053o@s7- zrnwu3cQZnGw-fU9yL|nw4&T+`yO;2a9e#>8QGEL<4{x<=JeBESw+{9sdKyc%XR+6w z#eO`FC;j5@>=%Dm%)>q^&QftM?!aCC84>q)y1%m!2iP>x@rOG8kOe$=W8S+@gUk8rV{dr5fg&?dOeL`mB>a>z3m3I9yQSg7O!1a6tzb%CH=l zpjf%E5?7-RE?9u?wZNt%#!-reIK@ws`+9ls&c_>g%k|EoHcIL0f(7xug;wx%E4YHa zcY9RW=Mlh)UphaI2DcBX8@fQJ#f2udn+{++XIpM~cCz);WvUqZY46t(T8l z;k#Mqx{a}jSvPZsIQNlRw~NlJoLh){4zIPUjkKbx*hR(c^&!e`h<$n+qQ|W8kNK7M z7zH02j}ukYQErMA(<4TYjn4NuKj?hB^PSFzJJ(*1>&|b-QQMm#YKy~WglL$Rc9;PT zGoWG04O4Dd8=4H8R9EqTM;WzG@%K~w{nR+BQkWwo5hwn`d;of%G8M|U%?2kimD2~DLXhioK z(Y=ds39i9)xCOW2emsaL@ibn>t9Unrl!Q2>w8IYARVt=*chKL3A{>gtaXe1MnK%cR z;4)l?8+^xj)OU=>ogZ+12v6f#ypA`0d}q$M&zx}|3*9#am*Yy0Us5$ys-_;oBR)aP zwG`hkXzn*j+;5V&--zxvqWkyZ0c4r`Stf11-@Xe`P^JmWG$TthvIj={W^D{E#-+Fo zcf_Hcplv5;+bzZAxEuH3MZE0Owj!Ul72_OB@t5W~XuyrWann$H4YfD2_D0tJDqi=a zn}r@MLbKq5X2Az3@*qVz+zg?^ZO@HH+|h__qy!r&p(BgfCkg4X&kB=}CDK_UT@a@W z;)e$K2Cf8ar#q-|um;z~A!E3Y;YK1$WUxd=Gj2yd%;3X^t9%PL$v17mH*GQY!2%Q; zkBE&&DESvTNBQzmzRa>@W?3@7%*S8mvd^4Bqo4HghL}}S|B2GcE z)Kx5X-HENAnsq(z;G&P~5`A2kjAdAkg645SlheURb{RMdD{&dFKn>*VMlQ(Vf^OM9 zy30W^Vfqc-7UE)*4c%lzw`+JK4&A$k(7iiW;0XEOU4z{<*jRxe4UquVxYGe=zRiD`ARSLm0l8d!p>NXrKrO^9p*LSCOn2Ge6+`f zPjF#=l8^LKP{;W?&gYtZuJKzs_$?jsFU$Y@tG?Ew;gd9cayr(aV0=^A%rvU-6~ma^$kU3BKY>#O~M&r{Z*E>Ao!8cRTLHtMb3^ z^*HpSKtBrfYru`jBK=sTfQbv3xL^*>!+m%FX#p)NUU#x>-9Te}vy?7h%+A-43GunBk3Mb*$FFCm4t3DwB7-P8h@zze+S>-~gRzj?SFcM2~?FJSckS@!#~u^cOe(f%)-Si{0zmPp?HbtC|O}@8C1+GrM!~BD~ZUYrL87C&17eNb9u=( zmsfnjxWX5VtDKumN1XGlW8_IjejkNw8i)JTyHCCQPgxJoSm*ArU|`7(n8A`0S#kQ9-qaObD453Q_g2fCho?>-P;&>CsF# zhUvyL-9)CF$#ip=PB0Y704n<%ga51Lvk4%-sa z!7v>RtH2S+1;e;tm?$15itpRcw+CfOk}OF<3Z_!<{)>ElS=JQEnqodr_iU4iT=@W3 zw$ola?X}l&dmTSGN(@wrfiyADUJTUoaXKHTpT@HuA(%9SNgrmBhgl@E*&B!LVj~tC zNq7z~NIMEYO5rT7$>N$X*NB-}sGTosr%R$IfMhX5p==6eufSDS{v%fYV`7R0A7{bZ z$FDiKA-Jjq*9<&{Cj?o4K~{uoalK&EV0R66pM+B_yc;aMje;*l@TFNums?0z3c?@= zV?ij&dyDeC?$*0r*1Ln&yTgKVwV+&Uxk|8HC3>`YQZPIz82T_-A13R!k8ckMN~SMh z`loU&7kTnq!~Hc}bk{17AV^0D(orbL1_-i&6dOpf;tIh!La?&nGc5Rw0X$;>B`j6K zQYCy}!uNx+1#M1i{*QMc+6P_0OQN{5DDH}f@u;bpO9pevb1FWkV!08Q8}ZjE^mPh- zJr&#ekhq->i928>W?>nYqmC zkhja^?XtbNUxjrlY~Zsjd7F(xaky=UeYP16_>69q&*;|pQYpuWNxA5}zV&CxGjR?slmEL`I9TJtIwLt@B=UH}dLwB-BimqP z^`gCAwAT;Ek=TUIcm$6b8O0hX)*wh41Z~51+=<$2(B3=cKB20>sW=@E;32#q|KH*B z#ylqJgDlX<0*z~NJ?_SRHbhixQn6_%E@u%w+{}lY-QVo~W*u$T(dH|7&3;Le{gM=H zkLf<2x#shk8!VH?GVPITTDYdA)(BgSu;mn} zY{KJs5-;ObJ3GpKsN9Dv@*#_S*cH3mNh-9HGyp4cEONzeuBhF;+`&p0G`L%XyD7Ar zLc1xnn?k!UAPeo`vpsyaX8|rk!MH~-?on@#dV46cha!6@vWFsjDYBO$dnvM)B6}&a zmm+W9@$qTEOI&?L{=dx>Z!^V@cltVQH}cJo`R1pI_Oy}}Y;wPuFQs3D^n0h6%Sv$z zZo^%;m#eb5Du;`-*QC8B*PC2#qF58fnhd1LK$Wn|6ZKp7O^Ta*kXem&g@zi(Df&lA>yV^}9NDd*LIULj%iwR zinJc6sWo5ejt>4Es3O%G}4}AlN^#u@<<<2KnlqKQbNj-YNOZ69aNAJWE80+ zV+kc*Gm6)ylIf&|%p!Bie6o-%CQHe3vXZPOYsq@jKsJ&l(oD9Kon#+5Kn{^3wf;Cp zPLNaN9JxR)kt^gHxj}A`J1i4OOp-_nNh9q^I>{v2B!}dZJkp00kO8EGl#y~$K}L|; zQT`a46wOv~wu-Y=oUP()6=$nByOLy)LZXq`8kwz;*&3Oxk=YuVt&Q1-$PsdkoFJ!? zqSsfGCelo{lbvKYSxeTF2L6A2V^Z{HAelr*Z^k5rv?m25mr&@ zWp}WUj38slEHaf$CpDyuj3SdrIjJC(q>2pS|2IpLqDF-p-E4HTQA3RyY#cz`tG|^L zHN+&vvCbNjh{_F=ZfHn~-f6w3Zi9LaI%?2(14SCN)v%PTB&*3dacs=detectorDacs+imod*NDAC; -#ifndef JUNGFRAU_DHANYA - (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; - (detectorModules+imod)->chipregs=detectorChips+imod*NCHIP; - (detectorModules+imod)->chanregs=detectorChans+imod*NCHIP*NCHAN; -#endif + (detectorModules+imod)->adcs=detectorAdcs+imod*NADC; + if(myDetectorType != JUNGFRAU){ + (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; @@ -217,28 +221,27 @@ int copyModule(sls_detector_module *destMod, sls_detector_module *srcMod) { // printf("copying gain and offset %f %f to %f %f\n",srcMod->gain,srcMod->offset,destMod->gain,destMod->offset); -#ifndef JUNGFRAU_DHANYA - for (ichip=0; ichip<(srcMod->nchip); ichip++) { - if (*((srcMod->chipregs)+ichip)>=0) - *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); + if(myDetectorType != JUNGFRAU){ + for (ichip=0; ichip<(srcMod->nchip); ichip++) { + if (*((srcMod->chipregs)+ichip)>=0) + *((destMod->chipregs)+ichip)=*((srcMod->chipregs)+ichip); + } + for (ichan=0; ichan<(srcMod->nchan); ichan++) { + if (*((srcMod->chanregs)+ichan)>=0) + *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); + } } - for (ichan=0; ichan<(srcMod->nchan); ichan++) { - if (*((srcMod->chanregs)+ichan)>=0) - *((destMod->chanregs)+ichan)=*((srcMod->chanregs)+ichan); - } -#endif for (idac=0; idac<(srcMod->ndac); idac++) { if (*((srcMod->dacs)+idac)>=0) *((destMod->dacs)+idac)=*((srcMod->dacs)+idac); } -#ifndef JUNGFRAU_DHANYA for (iadc=0; iadc<(srcMod->nadc); iadc++) { if (*((srcMod->adcs)+iadc)>=0) *((destMod->adcs)+iadc)=*((srcMod->adcs)+iadc); } -#endif + return ret; } @@ -900,9 +903,9 @@ int setSettings(int i, int imod) { } thisSettings=isett; -#ifdef VERBOSE +//#ifdef VERBOSE printf("detector settings are %d\n",thisSettings); -#endif +//#endif return thisSettings; } diff --git a/slsDetectorSoftware/jungfrauDetectorServer/registers_m.h b/slsDetectorSoftware/jungfrauDetectorServer/registers_m.h index 09ee8d333..96e836710 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/registers_m.h +++ b/slsDetectorSoftware/jungfrauDetectorServer/registers_m.h @@ -19,21 +19,21 @@ #define FPGA_INIT_PAT 0x60008 #define FPGA_INIT_ADDR 0xb0000000 -#ifdef JUNGFRAU_DHANYA -#define POWER_ON_REG 0x5e<<11 -#define ADCREG1 0x08 -#define ADCREG2 0x14 -#define ADCREG3 0x4 -#define ADCREG4 0x5 -#define ADCREG_VREFS 0x18 -#define ADC_PIPELINE_REG 0x42<<11 // adc_offset_reg -#define DBIT_PIPELINE_REG 0x59<<11 -#define MEM_MACHINE_FIFOS_REG 0x4f<<11 -#define CONFGAIN_REG 0x5d<<11 /** was actually GAIN_REG which seems to be set to 0 later in this file*/ -#endif +//#ifdef JUNGFRAU_DHANYA +#define POWER_ON_REG 0x5e<<11 +#define ADCREG1 8 //same as PLL_BANDWIDTH_REG +#define ADCREG2 20 //0x14 +#define ADCREG3 4 //same as PLL_M_COUNTER_REG +#define ADCREG4 5 //same as PLL_C_COUNTER_REG +#define ADCREG_VREFS 24 //0x18 +#define DBIT_PIPELINE_REG 89<<11 //0x59 same PATTERN_N_LOOP2_REG +#define MEM_MACHINE_FIFOS_REG 79<<11 //0x4f same as CONTROL_REG +#define CONFGAIN_REG 93<<11 //0x5d same as DAQ_REG +#define ADC_PIPELINE_REG 66<<11 //0x42 same as ADC_OFFSET_REG +//#endif - -#define ADC_INVERSION_REG 67<<11 /** picked up from after ADC_OFFSET_REG*/ +#define ADC_OFFSET_REG 66<<11 //same as ADC_PIPELINE_REG +#define ADC_INVERSION_REG 67<<11 @@ -131,7 +131,7 @@ //#define ADC_SYNC_REG 66<<11//0x19<<11 //#define HV_REG 67<<11//0x20<<11 -#define ADC_OFFSET_REG 66<<11 + //#define MUTIME_REG 0x1a<<11 diff --git a/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.c b/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.c index 02f2fcc2c..16cbea70f 100755 --- a/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.c +++ b/slsDetectorSoftware/jungfrauDetectorServer/server_funcs.c @@ -4,7 +4,6 @@ #include "server_defs.h" #include "firmware_funcs.h" #include "mcb_funcs.h" -#include "trimming_funcs.h" #include "registers_m.h" #include "gitInfoMoench.h" @@ -59,18 +58,15 @@ int adcvpp=0x4; int init_detector(int b, int checkType) { int i; -#ifndef JUNGFRAU_DHANYA - int retvalsize,ret; -#endif if (mapCSP0()==FAIL) { printf("Could not map memory\n"); exit(1); } - // - + //print version printf("v: 0x%x\n",bus_r(FPGA_VERSION_REG)); printf("fp: 0x%x\n",bus_r(FIX_PATT_REG)); + //checktype if (checkType) { printf("Bus test... (checktype is %d; b is %d)",checkType,b ); for (i=0; i<1000000; i++) { @@ -82,7 +78,9 @@ int init_detector(int b, int checkType) { printf("Finished\n"); }else printf("(checktype is %d; b is %d)",checkType,b ); - //confirm if it is really moench + + + //confirm the detector type switch ((bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>>DETECTOR_TYPE_OFFSET) { case MOENCH03_MODULE_ID: myDetectorType=MOENCH; @@ -102,18 +100,14 @@ int init_detector(int b, int checkType) { default: myDetectorType=GENERIC; printf("Unknown detector type %02x\n",(bus_r(PCB_REV_REG) & DETECTOR_TYPE_MASK)>>DETECTOR_TYPE_OFFSET); - + break; } - printf("Detector type is %d\n", myDetectorType); - - // return OK; + //control server only-- if (b) { - - resetPLL(); bus_w16(CONTROL_REG, SYNC_RESET); bus_w16(CONTROL_REG, 0); @@ -122,29 +116,24 @@ int init_detector(int b, int checkType) { #ifdef MCB_FUNCS printf("\nBoard Revision:0x%x\n",(bus_r(PCB_REV_REG)&BOARD_REVISION_MASK)); -#ifdef JUNGFRAU_DHANYA - initDetector(); -#endif + if(myDetectorType == JUNGFRAU) + initDetector(); /*allocating detectorModules, detectorsDacs etc for "settings", also does allocate RAM*/ printf("Initializing Detector\n"); //bus_w16(CONTROL_REG, SYNC_RESET); // reset registers #endif - // testFpga(); // testRAM(); // printf("ADC_SYNC_REG:%x\n",bus_r(ADC_SYNC_REG)); //moench specific - - // setPhaseShiftOnce(); //firmware.h - - prepareADC(); // server_funcs + // setPhaseShiftOnce(); + /*some registers set, which is in common with jungfrau, please check */ + prepareADC(); //setADC(-1); //already does setdaqreg and clean fifo // setSettings(GET_SETTINGS,-1); - + /*some registers set, which is in common with jungfrau, please check */ initDac(0); initDac(8); //initializes the two dacs -#ifdef JUNGFRAU_DHANYA - if(myDetectorType==JUNGFRAU){ //set dacs int retval = -1; @@ -186,7 +175,7 @@ int init_detector(int b, int checkType) { bus_w(ADC_INVERSION_REG,0x453b2a9c); //set adc_pipeline - bus_w(ADC_PIPELINE_REG,0x20); + bus_w(ADC_PIPELINE_REG,0x20); //same as ADC_OFFSET_REG //set dbit_pipeline bus_w(DBIT_PIPELINE_REG,0x100e); @@ -202,13 +191,10 @@ int init_detector(int b, int checkType) { //set default setting setSettings(DYNAMICGAIN,-1); - cprintf(BLUE,"set to dynamic gain\n"); } -#endif - - //Initialization + //Initialization of acquistion parameters setFrames(-1); setTrains(-1); setExposureTime(-1); @@ -220,20 +206,23 @@ int init_detector(int b, int checkType) { setMaster(GET_MASTER); setSynchronization(GET_SYNCHRONIZATION_MODE); startReceiver(0); //firmware - } + }//end of control server only-- else printf("\n\n"); + + //common for both control and stop server strcpy(mess,"dummy message"); strcpy(lastClientIP,"none"); strcpy(thisClientIP,"none1"); lockStatus=0; // getDynamicRange(); -#ifndef JUNGFRAU_DHANYA - setROI(-1,NULL,&retvalsize,&ret); - allocateRAM(); //dhanya - already being done.. and all this should be inside if (b){} ?? -#endif - + /* both these functions setROI and allocateRAM should go into the control server part. */ + if(myDetectorType!=JUNGFRAU){ + int retvalsize,ret; + setROI(-1,NULL,&retvalsize,&ret); + allocateRAM(); + } return OK; } @@ -1505,50 +1494,54 @@ int get_chip(int file_des) { } int set_module(int file_des) { - sls_detector_module myModule; - int *myDac=malloc(NDAC*sizeof(int)); -#ifndef JUNGFRAU_DHANYA - int *myChip=malloc(NCHIP*sizeof(int)); - int *myChan=malloc(NCHIP*NCHAN*sizeof(int)); - int *myAdc=malloc(NADC*sizeof(int)); -#endif + int retval, n; int ret=OK; - int dr;// ow; + int dr; + sls_detector_module myModule; + int *myDac=malloc(NDAC*sizeof(int)); + int *myAdc=malloc(NADC*sizeof(int)); + int *myChip=NULL; + int *myChan=NULL; + /*not required for jungfrau. so save memory*/ + if(myDetectorType != JUNGFRAU){ + myChip=malloc(NCHIP*sizeof(int)); + myChan=malloc(NCHIP*NCHAN*sizeof(int)); + } - dr=setDynamicRange(-1); + dr=setDynamicRange(-1); /* move this down to after initialization?*/ + //initialize myModule values if (myDac) myModule.dacs=myDac; else { sprintf(mess,"could not allocate dacs\n"); ret=FAIL; } - -#ifndef JUNGFRAU_DHANYA if (myAdc) - myModule.adcs=myAdc; - else { - sprintf(mess,"could not allocate adcs\n"); - ret=FAIL; + myModule.adcs=myAdc; + else { + sprintf(mess,"could not allocate adcs\n"); + ret=FAIL; } - if (myChip) - myModule.chipregs=myChip; - else { - sprintf(mess,"could not allocate chips\n"); - ret=FAIL; - } - if (myChan) - myModule.chanregs=myChan; - else { - sprintf(mess,"could not allocate chans\n"); - ret=FAIL; - } -#else - myModule.adcs=NULL; + myModule.chipregs=NULL; myModule.chanregs=NULL; -#endif + /*not required for jungfrau. so save memory*/ + if(myDetectorType != JUNGFRAU){ + if (myChip) + myModule.chipregs=myChip; + else { + sprintf(mess,"could not allocate chips\n"); + ret=FAIL; + } + if (myChan) + myModule.chanregs=myChan; + else { + sprintf(mess,"could not allocate chans\n"); + ret=FAIL; + } +} myModule.ndac=NDAC; myModule.nchip=NCHIP; @@ -1558,7 +1551,11 @@ int set_module(int file_des) { #ifdef VERBOSE printf("Setting module\n"); #endif - ret=receiveModule(file_des, &myModule); + + if(myDetectorType != JUNGFRAU) + ret=receiveModuleGeneral(file_des, &myModule, 1); //1 is to receive everything + else + ret=receiveModuleGeneral(file_des, &myModule, 0); //0 is to receive partially (without trimbits etc.) if (ret>=0) ret=OK; @@ -1609,17 +1606,12 @@ int set_module(int file_des) { } free(myDac); -#ifndef JUNGFRAU_DHANYA - free(myChip); - free(myChan); - free(myAdc); -#endif + if(myAdc != NULL) free(myAdc); + if(myChip != NULL) free(myChip); + if(myChan != NULL) free(myChan); - - - // setDynamicRange(dr); always 16 commented out -printf("freed\n"); + //setDynamicRange(dr); always 16 commented out return ret; } @@ -1629,23 +1621,23 @@ printf("freed\n"); int get_module(int file_des) { - int ret=OK; - - int arg; int imod; int n; - - - sls_detector_module myModule; int *myDac=malloc(NDAC*sizeof(int)); -#ifndef JUNGFRAU_DHANYA - int *myChip=malloc(NCHIP*sizeof(int)); - int *myChan=malloc(NCHIP*NCHAN*sizeof(int)); - int *myAdc=malloc(NADC*sizeof(int)); -#endif + int *myChip=NULL; + int *myChan=NULL; + int *myAdc=NULL; + + /*not required for jungfrau. so save memory*/ + if(myDetectorType != JUNGFRAU){ + myChip=malloc(NCHIP*sizeof(int)); + myChan=malloc(NCHIP*NCHAN*sizeof(int)); + myAdc=malloc(NADC*sizeof(int)); + } + if (myDac) myModule.dacs=myDac; @@ -1654,30 +1646,32 @@ int get_module(int file_des) { ret=FAIL; } -#ifndef JUNGFRAU_DHANYA - if (myAdc) - myModule.adcs=myAdc; - else { - sprintf(mess,"could not allocate adcs\n"); - ret=FAIL; - } - if (myChip) - myModule.chipregs=myChip; - else { - sprintf(mess,"could not allocate chips\n"); - ret=FAIL; - } - if (myChan) - myModule.chanregs=myChan; - else { - sprintf(mess,"could not allocate chans\n"); - ret=FAIL; - } -#else + myModule.adcs=NULL; myModule.chipregs=NULL; myModule.chanregs=NULL; -#endif + /*not required for jungfrau. so save memory*/ + if(myDetectorType != JUNGFRAU){ + if (myAdc) + myModule.adcs=myAdc; + else { + sprintf(mess,"could not allocate adcs\n"); + ret=FAIL; + } + if (myChip) + myModule.chipregs=myChip; + else { + sprintf(mess,"could not allocate chips\n"); + ret=FAIL; + } + if (myChan) + myModule.chanregs=myChan; + else { + sprintf(mess,"could not allocate chans\n"); + ret=FAIL; + } + } + myModule.ndac=NDAC; myModule.nchip=NCHIP; myModule.nchan=NCHAN*NCHIP; @@ -1685,8 +1679,6 @@ int get_module(int file_des) { - - n = receiveDataOnly(file_des,&arg,sizeof(arg)); if (n < 0) { sprintf(mess,"Error reading from socket\n"); @@ -1717,17 +1709,19 @@ int get_module(int file_des) { n = sendDataOnly(file_des,&ret,sizeof(ret)); if (ret!=FAIL) { /* send return argument */ - ret=sendModule(file_des, &myModule); + if(myDetectorType != JUNGFRAU) + ret=sendModuleGeneral(file_des, &myModule,1); //1 is to send everything + else + ret=sendModuleGeneral(file_des, &myModule,0); //0 is to send partially (without trimbits etc.) } else { n += sendDataOnly(file_des,mess,sizeof(mess)); } free(myDac); -#ifndef JUNGFRAU_DHANYA - free(myChip); - free(myChan); - free(myAdc); -#endif + if(myChip != NULL) free(myChip); + if(myChan != NULL) free(myChan); + if(myAdc != NULL) free(myAdc); + /*return ok/fail*/ return ret; @@ -1951,7 +1945,7 @@ int get_run_status(int file_des) { retval= runState(); printf("\n\nSTATUS=%08x\n",retval); -#ifdef JUNGFRAU_DHANYA + if(myDetectorType == JUNGFRAU){ if(!(retval&RUN_BUSY_BIT)){ if((retval&READMACHINE_BUSY_BIT) ){ @@ -1979,7 +1973,7 @@ int get_run_status(int file_des) { s=RUNNING; } } -#else +}else{ //error if(retval&SOME_FIFO_FULL_BIT){ printf("-----------------------------------ERROR--------------------------------------x%0x\n",retval); @@ -2025,7 +2019,7 @@ int get_run_status(int file_des) { } } -#endif +} if (ret!=OK) { @@ -2049,10 +2043,8 @@ int get_run_status(int file_des) { int read_frame(int file_des) { - u_int16_t* p=NULL; - if (differentClients==1 && lockStatus==1) { dataret=FAIL; sprintf(mess,"Detector locked by %s\n",lastClientIP); @@ -2066,28 +2058,6 @@ int read_frame(int file_des) { } - -#ifdef JUNGFRAU_DHANYA1 - while(runBusy()){ - usleep(0); - if (getFrames() <= -1) { - printf("no frames left, but still busy\n"); - } - } - if (getFrames() > -1) { - dataret=FAIL; - sprintf(mess,"no data and run stopped: %d frames left\n",(int)(getFrames())); - printf("Warning: %s\n",mess); - }else{ - dataret = FINISHED; - sprintf(mess,"acquisition successfully finished\n"); - printf("%s\n",mess); - } - sendDataOnly(file_des,&dataret,sizeof(dataret)); - sendDataOnly(file_des,mess,sizeof(mess)); - //dataret is never ok to send databytes for jungfrau (not reading from fifo) -#else - p=fifo_read_frame(); if (p) { nframes++; @@ -2120,7 +2090,7 @@ int read_frame(int file_des) { sendDataOnly(file_des,mess,sizeof(mess)); } -#endif + return dataret; @@ -2441,62 +2411,50 @@ int set_roi(int file_des) { ROI arg[MAX_ROIS]; ROI* retval=0; strcpy(mess,"Could not set/get roi\n"); - - // u_int32_t disable_reg=0; - n = receiveDataOnly(file_des,&nroi,sizeof(nroi)); if (n < 0) { sprintf(mess,"Error reading from socket\n"); ret=FAIL; } -#ifdef JUNGFRAU_DHANYA - ret = FAIL; - strcpy(mess,"Not applicable/implemented for this detector\n"); - printf("Error:Set ROI-%s",mess); -#else + if(myDetectorType == JUNGFRAU){ + ret = FAIL; + strcpy(mess,"Not applicable/implemented for this detector\n"); + printf("Error:Set ROI-%s",mess); + } + else{ - if(nroi>=0){ - n = receiveDataOnly(file_des,arg,nroi*sizeof(ROI)); - if (n != (nroi*sizeof(ROI))) { - sprintf(mess,"Received wrong number of bytes for ROI\n"); + if(nroi>=0){ + n = receiveDataOnly(file_des,arg,nroi*sizeof(ROI)); + if (n != (nroi*sizeof(ROI))) { + sprintf(mess,"Received wrong number of bytes for ROI\n"); + ret=FAIL; + } + + printf("Setting ROI to:"); + for( i=0;i - - - -extern int nModX; -//extern int *values; - -extern const int nChans; -extern const int nChips; -extern const int nDacs; -extern const int nAdcs; - - -int trim_fixed_settings(int countlim, int par2, int im) -{ - - int retval=OK; -#ifdef VERBOSE - printf("Trimming with fixed settings\n"); -#endif -#ifdef VIRTUAL - return OK; -#endif - - if (par2<=0) - retval=trim_with_level(countlim, im); - else - retval=trim_with_median(countlim,im); - - - return retval; -} - - -int trim_with_noise(int countlim, int nsigma, int im) -{ - - - int retval=OK, retval1=OK, retval2=OK; -#ifdef VERBOSE - printf("Trimming using noise\n"); -#endif -#ifdef VIRTUAL - return OK; -#endif - - /* threshold scan */ - -#ifdef VERBOSE - printf("chosing vthresh and vtrim....."); -#endif - retval1=choose_vthresh_and_vtrim(countlim,nsigma, im); - -#ifdef VERBOSE - printf("trimming with noise.....\n"); -#endif - retval2=trim_with_level(countlim, im); - -#ifdef DEBUGOUT - printf("done\n"); -#endif - if (retval1==OK && retval2==OK) - retval=OK; - else - retval=FAIL; - - return retval; - -} - -int trim_with_beam(int countlim, int nsigma, int im) //rpc -{ - - - int retval=OK, retval1=OK, retval2=OK; - - printf("Trimming using beam\n"); - //return OK; -#ifdef VIRTUAL - printf("Trimming using beam\n"); - return OK; -#endif - /* threshold scan */ -#ifdef DEBUGOUT - printf("chosing vthresh and vtrim....."); -#endif - - retval1=choose_vthresh_and_vtrim(countlim,nsigma,im); - retval2=trim_with_median(TRIM_DR, im); - -#ifdef DEBUGOUT - printf("done\n"); -#endif - - if (retval1==OK && retval2==OK) - retval=OK; - else - retval=FAIL; - - return retval; - -} - - -int trim_improve(int maxit, int par2, int im) //rpc -{ - - int retval=OK, retval1=OK, retval2=OK; - - -#ifdef VERBOSE - printf("Improve the trimming\n"); -#endif -#ifdef VIRTUAL - return OK; -#endif - - - if (par2!=0 && im==ALLMOD) - retval1=choose_vthresh(); - - retval2=trim_with_median(2*maxit+1, im); -#ifdef DEBUGOUT - printf("done\n"); -#endif - if (retval1==OK && retval2==OK) - retval=OK; - else - retval=FAIL; - - return retval; - -} - -int calcthr_from_vcal(int vcal) { - int thrmin; - //thrmin=140+3*vcal/5; - thrmin=180+3*vcal/5; - return thrmin; -} - -int calccal_from_vthr(int vthr) { - int vcal; - vcal=5*(vthr-140)/3; - return vcal; -} - -int choose_vthresh_and_vtrim(int countlim, int nsigma, int im) { - int retval=OK; -#ifdef JUNGFRAU_DHANYA - cprintf(RED,"choose_vthresh_and_vtrim Not implemented for JungFrau\n");//did not want to fix warnings -#else - -#ifdef MCB_FUNCS - int modma, modmi, nm; - int thr, thrstep=5, nthr=31; - - int *fifodata; - - double vthreshmean, vthreshSTDev; - int *thrmi, *thrma; - double c; - double b=BVTRIM; - double a=AVTRIM; - int *trim; - int ich, imod, ichan; - int nvalid=0; - u_int32_t *scan; - int ithr; - sls_detector_channel myChan; - - - - setFrames(1); - // setNMod(getNModBoard()); - - if (im==ALLMOD){ - modmi=0; - modma=nModX; - } else { - modmi=im; - modma=im+1; - } - nm=modma-modmi; - - trim=malloc(sizeof(int)*nChans*nChips*nModX); - thrmi=malloc(sizeof(int)*nModX); - thrma=malloc(sizeof(int)*nModX); - - - for (ich=0; ichcountlim && trim[ich]==-1) { -//commented out by dhanya trim[ich]=getDACbyIndexDACU(VTHRESH,imod); -#ifdef VERBOSE - // printf("yes: %d %d %d\n",ich,ithr,scan[ich]); -#endif - } -#ifdef VERBOSE - /* else { - printf("no: %d %d %d\n",ich,ithr,scan[ich]); - }*/ -#endif - } - } - free(scan); - } - - for (imod=modmi; imodthrmi[imod] && trim[ich]0) { - vthreshmean=vthreshmean/nvalid; - //commented out by dhanya vthreshSTDev=sqrt((vthreshSTDev/nvalid)-vthreshmean*vthreshmean); - } else { - vthreshmean=thrmi[imod]; - vthreshSTDev=nthr*thrstep; - printf("No valid channel for module %d\n",imod); - retval=FAIL; - } - -#ifdef DEBUGOUT - printf("module= %d nvalid = %d mean=%f RMS=%f\n",imod, nvalid, vthreshmean,vthreshSTDev); -#endif - // *vthresh=round(vthreshmean-nsigma*vthreshSTDev); - thr=(int)(vthreshmean-nsigma*vthreshSTDev); - if (thr<0 || thr>(DAC_DR-1)) { - thr=thrmi[imod]/2; - printf("Can't find correct threshold for module %d\n",imod); - retval=FAIL; - } -//commented out by dhanya initDACbyIndexDACU(VTHRESH,thr,imod); -#ifdef VERBOSE - printf("vthresh=%d \n",thr); -#endif - c=CVTRIM-2.*nsigma*vthreshSTDev/63.; - //commented out by dhanya thr=(int)((-b-sqrt(b*b-4*a*c))/(2*a)); - if (thr<500 || thr>(DAC_DR-1)) { - thr=750; - printf("Can't find correct trimbit size for module %d\n",imod); - retval=FAIL; - } - - //commented out by dhanya initDACbyIndexDACU(VTRIM,thr,imod); - -#ifdef VERBOSE - printf("vtrim=%d \n",thr); -#endif - - } - free(trim); - free(thrmi); - free(thrma); - -#endif -#endif - return retval; -} - - - - - -int trim_with_level(int countlim, int im) { - int retval=OK; -#ifdef JUNGFRAU_DHANYA - cprintf(RED,"trim_with_level Not implemented for JungFrau\n"); //did not want to fix warnings -#else - int ich, itrim, ichan, ichip, imod; - u_int32_t *scan; - int *inttrim; - int modma, modmi, nm; - int *fifodata; - sls_detector_channel myChan; - printf("trimming module number %d", im); - - -#ifdef MCB_FUNCS - setFrames(1); - // setNMod(getNModBoard()); - - if (im==ALLMOD){ - modmi=0; - modma=nModX; - } else { - modmi=im; - modma=im+1; - } - nm=modma-modmi; - - inttrim=malloc(sizeof(int)*nChips*nChans*nModX); - printf("countlim=%d\n",countlim); - for (ich=0; ichcountlim){ - inttrim[ich]=itrim; - if (scan[ich]>2*countlim && itrim>0) { - //if (scan[ich]>2*countlim || itrim==0) { - inttrim[ich]=itrim-1; - } -#ifdef VERBOSE - printf("Channel %d trimbit %d counted %d (%08x) countlim %d\n",ich,itrim,scan[ich],fifodata[ich],countlim); -#endif - } - } -#ifdef VERBOSE - /* else - printf("Channel %d trimbit %d counted %d countlim %d\n",ich,itrim,scan[ich],countlim);*/ -#endif - } - } - free(scan); - } - - for (imod=modmi; imod0) - direction[ichan]=1; - else - direction[ichan]=-1; - } - //commented out by dhanya vthresh=getDACbyIndexDACU(VTHRESH,imod); - if ( direction[ichan]!=-3) { - if (abs(diff)>abs(olddiff[ichan])) { - vthresh=vthresh-direction[ichan]; - if (vthresh>(DAC_DR-1)) { - vthresh=(DAC_DR-1); - printf("can't equalize threshold for module %d\n", ichan); - retval=FAIL; - } - if (vthresh<0) { - vthresh=0; - printf("can't equalize threshold for module %d\n", ichan); - retval=FAIL; - } - direction[ichan]=-3; - } else { - vthresh=vthresh+direction[ichan]; - olddiff[ichan]=diff; - change_flag=1; - } -//commented out by dhanya initDACbyIndex(VTHRESH,vthresh, ichan); - } - } - iteration++; - free(scan); - free(scan1); - } -#endif -#endif - return retval; -} - - - - - -int trim_with_median(int stop, int im) { - - - int retval=OK; -#ifdef JUNGFRAU_DHANYA - cprintf(RED,"trim_with_median Not implemented for JungFrau\n"); //did not want to fix warnings -#else -#ifdef MCB_FUNCS - int ichan, imod, ichip, ich; - u_int32_t *scan, *scan1; - int *olddiff, *direction; - int med, diff; - int change_flag=1; - int iteration=0; - int me[nModX], me1[nModX]; - int modma, modmi, nm; - int trim; - int *fifodata; - - setFrames(1); - // setNMod(getNModBoard()); - - if (im==ALLMOD){ - modmi=0; - modma=nModX; - } else { - modmi=im; - modma=im+1; - } - nm=modma-modmi; - - olddiff=malloc(4*nModX*nChips*nChans); - direction=malloc(4*nModX*nChips*nChans); - for (imod=modmi; imod0) { - direction[ichan]=1; - } else { - direction[ichan]=-1; - } - } - if ( direction[ichan]!=-3) { - if (abs(diff)>abs(olddiff[ichan])) { - trim=getTrimbit(imod,ichip,ich)+direction[ichan]; - printf("%d old diff %d < new diff %d %d - trimbit %d\n",ichan, olddiff[ichan], diff, direction[ichan], trim); - direction[ichan]=-3; - } else { - trim=getTrimbit(imod,ichip,ich)-direction[ichan]; - olddiff[ichan]=diff; - change_flag=1; - } - if (trim>TRIM_DR) { - trim=63; - printf("can't trim channel %d chip %d module %d to trim %d\n",ich, ichip, imod, trim); - retval=FAIL; - } - if (trim<0) { - printf("can't trim channel %d chip %d module %d to trim %d\n",ich, ichip, imod, trim); - trim=0; - retval=FAIL; - } - initChannel(trim,0,0,1,0,0,imod); - } - } - } - } - iteration++; - free(scan); - free(scan1); - } - free(olddiff); - free(direction); -#endif -#endif - return retval; -} diff --git a/slsDetectorSoftware/jungfrauDetectorServer/trimming_funcs.h b/slsDetectorSoftware/jungfrauDetectorServer/trimming_funcs.h deleted file mode 100755 index 42ecea24a..000000000 --- a/slsDetectorSoftware/jungfrauDetectorServer/trimming_funcs.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef TRIMMING_FUNCS_H -#define TRIMMING_FUNCS_H - -#include "sls_detector_defs.h" - -int trim_fixed_settings(int countlim, int par2, int imod); -int trim_with_noise(int countlim, int nsigma, int imod); -int trim_with_beam(int countlim, int nsigma, int imod); -int trim_improve(int maxit, int par2, int imod); -int calcthr_from_vcal(int vcal); -int calccal_from_vthr(int vthr); -int choose_vthresh_and_vtrim(int countlim, int nsigma, int imod); - -int choose_vthresh(); -int trim_with_level(int countlim, int imod); -int trim_with_median(int stop, int imod); -int calcthr_from_vcal(int vcal); -int calccal_from_vthr(int vthr); - -#endif diff --git a/slsDetectorSoftware/slsDetector/slsDetector.cpp b/slsDetectorSoftware/slsDetector/slsDetector.cpp index 23581e43c..ceea9dac6 100644 --- a/slsDetectorSoftware/slsDetector/slsDetector.cpp +++ b/slsDetectorSoftware/slsDetector/slsDetector.cpp @@ -1083,18 +1083,18 @@ int slsDetector::sendModule(sls_detector_module *myMod) { ts+=controlSocket->SendDataOnly(&(myMod->nadc),sizeof(myMod->nadc)); ts+=controlSocket->SendDataOnly(&(myMod->reg),sizeof(myMod->reg)); ts+=controlSocket->SendDataOnly(myMod->dacs,sizeof(myMod->ndac)); + ts+=controlSocket->SendDataOnly(myMod->adcs,sizeof(myMod->nadc)); if(thisDetector->myDetectorType != JUNGFRAU){ - ts+=controlSocket->SendDataOnly(myMod->adcs,sizeof(myMod->nadc)); ts+=controlSocket->SendDataOnly(myMod->chipregs,sizeof(myMod->nchip)); ts+=controlSocket->SendDataOnly(myMod->chanregs,sizeof(myMod->nchan)); } ts+=controlSocket->SendDataOnly(&(myMod->gain),sizeof(myMod->gain)); ts+=controlSocket->SendDataOnly(&(myMod->offset), sizeof(myMod->offset)); ts+=controlSocket->SendDataOnly(myMod->dacs,sizeof(dacs_t)*(myMod->ndac)); + ts+=controlSocket->SendDataOnly(myMod->adcs,sizeof(dacs_t)*(myMod->nadc)); if(thisDetector->myDetectorType != JUNGFRAU){ - ts+=controlSocket->SendDataOnly(myMod->adcs,sizeof(dacs_t)*(myMod->nadc)); ts+=controlSocket->SendDataOnly(myMod->chipregs,sizeof(int)*(myMod->nchip)); ts+=controlSocket->SendDataOnly(myMod->chanregs,sizeof(int)*(myMod->nchan)); } @@ -1151,8 +1151,9 @@ int slsDetector::receiveModule(sls_detector_module* myMod) { ts+=controlSocket->ReceiveDataOnly(&(myMod->nadc),sizeof(myMod->nadc)); ts+=controlSocket->ReceiveDataOnly(&(myMod->reg),sizeof(myMod->reg)); ts+=controlSocket->ReceiveDataOnly(myMod->dacs,sizeof(myMod->ndac)); + ts+=controlSocket->ReceiveDataOnly(myMod->adcs,sizeof(myMod->nadc)); + if(thisDetector->myDetectorType != JUNGFRAU){ - ts+=controlSocket->ReceiveDataOnly(myMod->adcs,sizeof(myMod->nadc)); ts+=controlSocket->ReceiveDataOnly(myMod->chipregs,sizeof(myMod->nchip)); ts+=controlSocket->ReceiveDataOnly(myMod->chanregs,sizeof(myMod->nchan)); } @@ -1172,12 +1173,12 @@ int slsDetector::receiveModule(sls_detector_module* myMod) { #ifdef VERBOSE std::cout<< "received dacs " << myMod->module << " of size "<< ts << std::endl; #endif + ts+=controlSocket->ReceiveDataOnly(myMod->adcs,sizeof(dacs_t)*(myMod->nadc)); +#ifdef VERBOSE + std::cout<< "received adcs " << myMod->module << " of size "<< ts << std::endl; +#endif if(thisDetector->myDetectorType != JUNGFRAU){ - ts+=controlSocket->ReceiveDataOnly(myMod->adcs,sizeof(dacs_t)*(myMod->nadc)); -#ifdef VERBOSE - std::cout<< "received adcs " << myMod->module << " of size "<< ts << std::endl; -#endif ts+=controlSocket->ReceiveDataOnly(myMod->chipregs,sizeof(int)*(myMod->nchip)); #ifdef VERBOSE std::cout<< "received chips " << myMod->module << " of size "<< ts << std::endl;