From 46fb8ed7b2a05faf54997d63f57e7dc0971fa676 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Mon, 1 Jul 2013 16:23:02 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9RS232=E9=80=9A=E4=BF=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PcDmis/Base/Interfac/Msi/Hsi/Keyence/LkIF.h | 11 +- .../Interfac/Msi/Hsi/SevenOcean/CMMIO_BASE.H | 1 - .../Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP | 55 +++-- .../Tools/UsbUtility/Debug/UtilityDebug.Log | 30 +++ .../Tools/UsbUtility/UsbUtil/SO7_UtilDlg.cpp | 13 +- .../UsbUtility/UsbUtil/Setup_so7config.cpp | 229 ++---------------- .../Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj | 2 + .../UsbUtil/Usb_Util.vcxproj.filters | 6 + .../Hsi/Tools/UsbUtility/UsbUtil/stdafx.cpp | 16 ++ .../Msi/Hsi/Tools/UsbUtility/UsbUtil/stdafx.h | 15 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 2355712 -> 2355712 bytes 11 files changed, 123 insertions(+), 255 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/LkIF.h b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/LkIF.h index aac7d91..aa4a735 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Keyence/LkIF.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Keyence/LkIF.h @@ -156,8 +156,17 @@ EXP BOOL WINAPI LKIF_GetStorobeTime(OUT LKIF_STOROBETIME *StorobeTime); /////////////////////////////////////////////// // Mode Change Command // -// Mode Switch EXP BOOL WINAPI LKIF_SetMode(IN LKIF_MODE Mode); +/////////////////////////////////////////////// +// USB Setting Command +// +#define USBPORTNO_MIN 1 +#define USBPORTNO_MAX 13 +// Enumerate Port Number Function (array of 13 ports) +EXP BOOL WINAPI LKIF_EnumPortNo(BOOL IsValidPortNo[USBPORTNO_MAX]); +// Set Port Number Function (1 to 13) +EXP BOOL WINAPI LKIF_SetPortNo(int PortNo); + } // extern "C" #endif // LKIF_INCLUDED \ No newline at end of file diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_BASE.H b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_BASE.H index f0a9124..72c58fd 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_BASE.H +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_BASE.H @@ -7,7 +7,6 @@ #define MAX_OUTPUT_BUFFER_SIZE 2048 #define MAX_RECIEVE_BUFFER_SIZE 30000 - // TCP, serial style routines struct SerialList { diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP index a10b71e..700c9da 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP @@ -222,6 +222,9 @@ int CPSerial::SetPort(int Port,int Baud,char Parity,int Bits,int StopBits,int Ha Bits = m_Bits; if(StopBits == 0) StopBits = m_StopBits; + if (HandShake==0) + HandShake=m_HandShake; + // If the values are ok then store them if( ProgramPort( Port, Baud, Parity, Bits, StopBits, HandShake ) ) @@ -481,21 +484,16 @@ void CPSerial::OnReceive() { // Dummy OnReceieve if not used char s[MAX_RECIEVE_BUFFER_SIZE]={0}; - s[1]='\0'; CurrentPointer = 0; - int num=0; - num = ReadPort(s, MAX_RECIEVE_BUFFER_SIZE); - - if (num>0) + int num = ReadPort(s, MAX_RECIEVE_BUFFER_SIZE); + if ((num>0) && (numDoModal(); delete pSetup_so7config; - if (m_pSO7_PCDSerial) + if (m_pSO7_AutoZoom) { - delete m_pSO7_PCDSerial; - m_pSO7_PCDSerial=NULL; + delete m_pSO7_AutoZoom; + m_pSO7_AutoZoom=NULL; } SetTimer(1,150,NULL); } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Setup_so7config.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Setup_so7config.cpp index aff7d82..3f97fd8 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Setup_so7config.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Setup_so7config.cpp @@ -7,11 +7,10 @@ #include #include "ProcessButton.h" #include "..\..\..\SevenOcean\SO7_Proto.h" -#include "..\..\..\SevenOcean\CMMIO_SERIAL.H" - - +#include "..\..\..\SevenOcean\CAutoZoom.h" #include "Setup_so7config.h" -extern CPSerial* m_pSO7_PCDSerial; + +extern CAutoZoom* m_pSO7_AutoZoom; extern CSO7_Proto* m_pSO7_Proto; #define PI 3.1415926535897932384626433 // CSetup_so7config dialog @@ -96,9 +95,9 @@ BOOL CSetup_so7config::OnInitDialog() m_pSO7_Proto->g_machine.zm._Move_Speed_Gear=2; ((CButton *)GetDlgItem(IDC_RADIO_SO7CONFIG_ZOOM_MOVE_FAST))->SetCheck(true); - if (m_pSO7_PCDSerial) + if (m_pSO7_AutoZoom) { - if(m_pSO7_PCDSerial->Open()) + if(m_pSO7_AutoZoom->Initialization(false)) { ChangGUIWithStep(m_nStep); m_csMsg.Format(_T("串口打开正常!")); @@ -377,209 +376,6 @@ void CSetup_so7config::OnTimer(UINT_PTR nIDEvent) } -//=============================================== -double CSetup_so7config::ReadZoomAngle() -{ - if (_bReading) - { - return -2; - } - else - { - _bReading=true; - double dZoomAngle(-1); - char sendData[6]={'A','D',':','0',13,10}; - DWORD iWriteByte=m_pSO7_PCDSerial->Send(sendData,6); - - INT iRetrys(0); - while(!m_pSO7_PCDSerial->m_iRecvState && iRetrys<20 && iWriteByte==6) - { - iRetrys++; - Sleep(10); - } - if (m_pSO7_PCDSerial->m_iRecvState) - { - if(m_pSO7_PCDSerial->m_RecvData[0]==0) - Sleep(40);//200 - - char *token = NULL; - char cTemp[20]={0}; - - char seps[] = "$AD:"; - - token = strtok(m_pSO7_PCDSerial->m_RecvData,seps); - if (token) - { - memcpy(cTemp,token,8); - dZoomAngle=atof(cTemp); - dZoomAngle=dZoomAngle*180/PI; - }; - token=NULL; - m_pSO7_PCDSerial->m_iRecvState=FALSE; - _bReading=false; - return dZoomAngle; - } - else - { - _bReading=false; - return -2; - } - } -} - -//=============================================== -double CSetup_so7config::GetZoomCurPos() -{ - double dZoomPos(0),dZoomAng(0),dZoomPreAng(0); - INT iCnt2(0); - INT iRetryCount(0); - dZoomAng=ReadZoomAngle(); - - while(iCnt2<3 && iRetryCount<20) - { - Sleep(60); - dZoomPreAng=dZoomAng; - dZoomAng=ReadZoomAngle(); - INT iRetrys(0); - while ((dZoomAng==-1 || dZoomAng==-2 || dZoomAng==0 )&&iRetrys<2) - { - iRetrys++; - Sleep(60); - dZoomAng=ReadZoomAngle(); - } - if(dZoomAng!=-1 && dZoomAng!=-2 && dZoomAng!=0) - { - if ((dZoomAng-dZoomPreAng)<1 && (dZoomPreAng-dZoomAng)<1) - { - dZoomPos+=dZoomAng; - iCnt2++; - } - } - iRetryCount++; - - } - if (iCnt2==0) - { - dZoomPos=-2; - } - else - { - dZoomPos=dZoomPos/(iCnt2); - } - return dZoomPos; -} - -//=============================================== -BOOL CSetup_so7config::CalibrateEncoder() -{ - char sendDataI[12]={'U','P',':','1','1','1','1','1','1','1',13,10}; - char sendDataII[6]={'S','C',':','1',13,10}; - char sendDataIII[6]={'R','F',':','1',13,10}; - CString csRightRecv; - csRightRecv.Format(_T("@OK\r\n")); - CStringA m_csRecv(""); - INT iRetrys(0); - DWORD iWriteByte(0); - - m_pSO7_PCDSerial->m_iRecvState=FALSE; - - //Phase I - iWriteByte=m_pSO7_PCDSerial->Send(sendDataI,12); - while(!m_pSO7_PCDSerial->m_iRecvState && iRetrys<20 && iWriteByte==12) - { - iRetrys++; - Sleep(50); - } - - if (m_pSO7_PCDSerial->m_iRecvState) - { - if(m_pSO7_PCDSerial->m_RecvData[0]==0) - Sleep(100); - m_csRecv.Format(("%s"),m_pSO7_PCDSerial->m_RecvData); - if((CString)m_csRecv==csRightRecv) - { - - m_pSO7_PCDSerial->m_iRecvState=FALSE; - iRetrys=0; - iWriteByte=0; - //Phase II - - iWriteByte=m_pSO7_PCDSerial->Send(sendDataII,6); - while(!m_pSO7_PCDSerial->m_iRecvState && iRetrys<20 && iWriteByte==6) - { - iRetrys++; - Sleep(100); - } - if(m_pSO7_PCDSerial->m_iRecvState) - { - if(m_pSO7_PCDSerial->m_RecvData[0]==0) - Sleep(100); - - m_csRecv.Format(("%s"),m_pSO7_PCDSerial->m_RecvData); - if((CString)m_csRecv==csRightRecv) - { - m_pSO7_PCDSerial->m_iRecvState=FALSE; - iRetrys=0; - iWriteByte=0; - //Phase III - - iWriteByte=m_pSO7_PCDSerial->Send(sendDataIII,6); - while(!m_pSO7_PCDSerial->m_iRecvState && iRetrys<20 && iWriteByte==6) - { - iRetrys++; - Sleep(100); - } - if(m_pSO7_PCDSerial->m_iRecvState) - { - if(m_pSO7_PCDSerial->m_RecvData[0]==0) - Sleep(100); - - m_csRecv.Format(("%s"),m_pSO7_PCDSerial->m_RecvData); - if((CString)m_csRecv==csRightRecv) - { - m_pSO7_PCDSerial->m_iRecvState=FALSE; - iRetrys=0; - iWriteByte=0; - return TRUE; - } - else - { - m_pSO7_PCDSerial->m_iRecvState=FALSE; - return FALSE; - } - } - else - { - return FALSE; - } - } - else - { - - m_pSO7_PCDSerial->m_iRecvState=FALSE; - return FALSE; - } - } - else - { - return FALSE; - } - - } - else - { - - m_pSO7_PCDSerial->m_iRecvState=FALSE; - return FALSE; - } - - } - else - { - return FALSE; - } - -} //=============================================== void CSetup_so7config::ChangGUIWithStep(int _step) { @@ -650,6 +446,21 @@ void CSetup_so7config::OnBnClickedCancel() KillTimer(1); CDialog::OnCancel(); } +//=============================================== +double CSetup_so7config::ReadZoomAngle() +{ + return m_pSO7_AutoZoom->ReadZoomAngle(); +} +//=============================================== +double CSetup_so7config::GetZoomCurPos() +{ + return m_pSO7_AutoZoom->GetZoomCurPos(); +} +//=============================================== +BOOL CSetup_so7config::CalibrateEncoder() +{ + return m_pSO7_AutoZoom->CalibrateEncoder(); +} diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj index 77c270e..45fabb9 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj @@ -306,6 +306,7 @@ ..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Include + @@ -363,6 +364,7 @@ + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters index 098bad4..394f5b4 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Usb_Util.vcxproj.filters @@ -136,6 +136,9 @@ Sources Files + + Sources Files + @@ -303,6 +306,9 @@ Header Files + + Header Files + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/stdafx.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/stdafx.cpp index e86de86..d87c22b 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/stdafx.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/stdafx.cpp @@ -5,4 +5,20 @@ #include "stdafx.h" +CString GetAppPath(void) +{ + CWinApp* pApp=AfxGetApp(); + if(pApp==0) + return _T(""); + + TCHAR buf[256]; + GetModuleFileName(0,buf,256); + + CString sAppPath(buf); + int nPos=sAppPath.ReverseFind('\\'); + if(nPos) + sAppPath=sAppPath.Left(nPos); + return sAppPath; +} + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/stdafx.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/stdafx.h index 2d7ee04..e501d8e 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/stdafx.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/stdafx.h @@ -49,19 +49,6 @@ #endif #endif -static CString GetAppPath() -{ - CWinApp* pApp=AfxGetApp(); - if(pApp==0) - return _T(""); +CString GetAppPath(void); - TCHAR buf[256]; - GetModuleFileName(0,buf,256); - - CString sAppPath(buf); - int nPos=sAppPath.ReverseFind('\\'); - if(nPos) - sAppPath=sAppPath.Left(nPos); - return sAppPath; -} diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo index 83b22ecdb0f1d30da97f6a31a9bd1a3ff6e6d89d..8e46315903a6bf99c7eef1d3a878829e8d56e706 100644 GIT binary patch delta 10955 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 nD3~b3VV%@HaWguWcpcQxY)M delta 12296 zcmd6Ndt8)d-uHc7_cb^w5)cw1;fRQM7`$f~W(M-WoJh?BBAzE|o^3n(%0g>)Dh!5^mgky!pq{GQl;lddHZlCwXj1X&IDdHX+ORYt zNeOe>zZpD$5>2}%?yGP*iScier)ginKErxPgym34TIXnAGjdu#Hb`v^ka6wZUf2F5hXsMxJZGZXQaYqnu2_8DHR!mQ3bfG)8mXg{8czB%bFz z*up#9JNesN#zAfqb@TO0V|hv0PMRgb*|&(5FDVNn@8Z1ow@jeCv2+*THEAPsa2nH8 zPj#VvFG99;fNeA55LiIsk7sKsnZ*0s$CCX#!@hx~X(WlCvQHp~`7QfewpQHw9Rcna-fR zUeGMXJ_oqrOc|stV6l9{nn>RK)ppn(AhEdOqxck6+PW1wGf4uEd{|4iz~xVAEkB=@ z0AaauVat**elk51_}A$El2n2Vye7GL{pM$(Foq;*!mwdA?0B8bhfDKl zBs`l%BXQ6l_&UP@9%HB=Cwcwp{h;fQHWpzBBS*ngOrHv|Vl08SiSkL_wmX$?o22C( zSvTP7Lb40Gma#?Q4?QMH-YC(K1y==j!7e1)>BAoW=%|zY6!2}{66GwVcU41C<&5}kc9S0 z8_&s2C1_GF!*6QH4&LSt*O+kr_xahZXShy@_qO*ZrK&aqu^HzTFn*?Z{PYdD0!N?jshjd!C@lHP8;kH-OxhRstH?)s{gRN)>X9k$t{l~Y-yzv zdHktp#Hii8;hAv0Bp4@zVwm5HSgGV4G}Fh)Ia~o$Qy6zf3v3r%0ND$fNt2B8)$#gK zs(q!R^XH9beogm5zDQNhV= zhO87)(Hch>(Em;Hahrqj$tiIZ)Di`BDTJYn>Q84v_6IbZAJL{l;V=|wbRs#z->OgJ zk>i(qPso>WH*bgdzV8nt9`=nPVS~;{ekn_Gqf(bi1+ZZ_85vC0kq8sM0p?SV0qXe#8UlCY*xsL@}VT96S*JuB0Ih z8q>(}aI5507m6y{w6ZCU7|9_q<6sC3C&|I&apVI6U(QABzcCiiwO2gz^ogIW7e46q zR)w&;DsZDARZc~Iw1t){>`X)keU1n0(PBlB)GdLnicW^VOd!Ki zvCd}ARoM^o{xl*L(d$9dG#OO{ZEGAHpC~VB%|<{zcOrm~MiIE-BCWWTYG*x;mua5H zU5A{cP!i4kc)RQS7zq_l5)GZ7Qa^;xLS?&Qn$(mfxHd&_&G%Ef8meZJF<_iQHVbC& zg+LD4)h@X5072LL0C^Si^T>w?y=aeHVP+B4LT(bTH2l)L6F+*zw?mWZ9Ppe!ciP~5o2qmX+K3FAl4MZ>v?Bnvuc;_1JbhuW|Y zhCe`_fUdD5QX>N1E$Cxw;f=YdeY&~CDop953bfF<5O>_7cIUYlV>D6N`^CNpE)62* zlMjTIysL&W0{KwCb_f6HCJPDFTqSXIlLSi^lTW$-<0eR3OpKtrfO?67L(TXUXA=a91aiCyolUaP!D*ryXmy(YD z{A&62bgDLf0-ntT$ZI$?fU=pG zNRx2B^|1a?5-;zRO5k!VsYj1GpkK&3#=(wV^idH#2p1Itg_{sbk|xU+RL=@$9#IW< zweZn#Xp1PPr=Tm7goCn`Xoc3R$d(9&J5W(hi|0WV)5hb0UQ~C{`520s>E!@4ZY4T6 zx`d)qJcff0qc^M<;b0PUoX7hzfx2W)@b8Zi+=G1~GivTfHsPWd$bnw8y#*v!F6SLn ztvnEj(=5Vew&OD1+w;&IIj{#M`&PvzWY~LbWCi?^U$mA(!+qPPH1Y z45h<(^C0W(P!}aELiIM3@Xu8_jlrmO4?O83@lE?sg5qnP=o4v7#d$EjjAi$&k@s5H>ZRCJSHu#meieWK|zp#oaEgNjbBq1 zOn8PI8pKB8PN4&{J?L&Dv-(RS8ca~zFarhuF_O;&P^#fTu=^M}Nyt57j^LSgVvm8` zEyPS;m!Pwm9PR;c=(vZbXkNm3LNQ6rSD1)>jFMBsG_)Om6zY2m=VbXf4x8ziqExf_PRO>Rc5F~xcxI{4M8 z>rJhHBY#saJPh^60U^JeepDm zZyePqm^McEk{3BPQys<%gXtU4HI(Xj;av}*y3%+E%p)wA7)P(-(*N#C&aQKBZuMnI=Qka2ih3+=)ka zCqlX5PG|jeEU>jh&Zzn|XggLc#7F!_z?F6QaM9;% z47`^ux7^XKvZtH)9eleR84L9#^ZW<9(9=PJ8KLy1{Pms1y8DsnPFijK+{*dYi`R9|vRlA*yO$}(`55xLh zG*$&iH8yqjJBp!`TXF`+ucw5zuA~f(*VFvqrU0#zdE~|1VD4txMxgm7SrA;XoxV?k z#=Z0s;mzqv>n3F3)#cO)llCHOw5Bdr-K=)Rf%bocO_#3bnNx>e;eZ9IHXnqJO{EyL2c=d6r1pV7+ zF3}FdKI3}(4K!o0@=ZuMaQP>!8k)C~$RNV|Mwu5)ZBm2wehaa~ZmEPH*fR_gA0>s* z_!AZn9ZjgEpM@M^?tVEQ5}PpAc4fJJ{(D@#MZuSKlO`a6S zGakXUzKT8{JhGeSlb}*WJ7owov4miPpI*b*se~#`TPcQ8Em#ZGNMltd2r%_OL$|}U z9W*@HhJ8q|YCqjcA$JEwGdf6bkf!IwsKazW=}$6nl(mNgc~Ke z_vx+l^I+o7X>`Anr>HYj(a7o>;eS!+=|UsidXdfyl{V6EKYU3@(v0^4m3mO|B^ogR zqBjpIg|^qxHfzq)L#V=79#9JwjR?jf?&6JG20-q6RLk=+pX4``IEdUxn5Ga#xAQj7 z?uZ$R;TIQa5YBC7lc0GC*#-*M6Ev~7?vrY9MA=15$alSv%J8O3)FG5E=)Xienbw58 z1a|glp$nB8W05zYGoQt1DzHxn#tiFP-=~ys_<+{S{CIP`Nc_f7Hvwf4Tgh{I7_7;l;pl*Wi|0A5MkMIv6CiRa(`u#) z^%O;nWjiBLPFJa02HOWDX=i=1C{9L#vQi!cNkw#=YT(~t_l{6?12Y%Y|7{Xn`jl=X z*TB{wUs3zaz+DDc>A(Se2xqQj=ajN8S^=Bhl0upffve6jEcjJaxz3@$%;tpu7Pf%yc2vAxu~XCA#VZO!rywq50gYx*s_W(;hlrB?!p=-F0?n~ zBqayzxK4%yBctVO+TdT^GK)Yzh zv?2q&02z$jR>|3<70zC! zo?y};d7rlFSvi24PR0^cc(CS}+}ILSoH8m}RU1`!(juRzyC#9o%~+_`8LH;j!`~ic zuVB{M_m<`T2U&_pQa3?cA^QZQceSu^8w8gl?{{I?GWK?b=!*gt1|3V-ZUlGqnhq#j z%4UkCl|p=bSb*{6MlB8sfZzm_p%h8urM4tKBp1% zpM959f7%9tAhCmPF*6BMjfN>+b}HP979L7mXGl$cc0y$1jcO(siKl4jNxd2#g4|^+ z4DCgzU|17dUsa zX)wKlnYjIm`@iEAm*?1i==wVmZ$SRvUTpPySIQS!v+0Cy^d9LGx|Zw8*gtxaRtbSehM+H7&-Q9K9iQF0iBZU3C69x`-_z~E&*m|T z*+gG-KOA9Qe8g|08n%zr;ccGel{|>(y|2k^7?79YD>5%ul}F?Ah)`6I^Az#?WednZ z^WqH1R`%07-hS1ep4;>|>)>yV$<_{#RyibTkOVub*a4_I!tR6E!|WsSI?UdK?*{ko zWERoT0tGK4yKfz4KkGNIy24RiSp&9eHjcalXV0-_SU*!92wlHmW67`8frDnum^!Oq zjw^4fZF<@is6T=!_Wx3!3{;=kZF5|`?H{O9@aigj3#2HDD>QLmYgFj|WoZ08?%?h! zHZfsdd5O2W*yAg4&zWZwL)^{Y=z%`@P{#a5b{iKVhk9_ls*?HM_oSj8T_T$jJU)DkMVObaLo>EpY zt=#K&iw9F5ah z#60f%E2@h;6+I)5+#b0BN3L1wsVb}RmW$!j@uz3$MN_8t4fmE>3VhyLcV2l>QFWEu zQC(H*_pK=QPxtuBylF+1HFb4s4HipAMy5;AI}Ij--e7Pl`b?uUN3SS0#gS=9w>nH2 z>+H`EXO@D0Ypo`SMahAq`_YQ<CN++`=74K=vv* zhDgD`w=yT~PuAfOQN&XnttLE7k`9Z1VBosD6QJW480vJMWXfW73l?KWhS6?U^fsfz zq&K;86usS=k)d}e8D@jaYH+1Ht?TUiIr%+Y^=1?sN(>&o)stz^n@oyX@9|`q^%+H_ zMoV#~rNo?Gyw3i!J_XQC_`cEzh3k{LU@(f>@2jqGmU}9y%fyqOhUw*HOZ}>9L&RUO zAhK`2j9&O3XfQ0=gPyo%BO5@Scj!Mn(ZON|e*>QuMS>nSPltS+y;eWmV_+Fujs za6jC8nK>bwVJ)rekL)fe^0Co#?63D~Wsb>UG}xR@y~&d4!Y`*uZ*^rF^*LszNl8yP zS~DEVx;nI|GM}fi((BVXtA*{j|5FQGu4OU9|Es5c{o%?v7ErhIJ=9aV0&Op_@B!K$ z7C3(Zgtn;8KITZ$6}--b?X^sI@;Li~M5o|AhWB@TAZj_QfXF>8{D;tanoWuo@47>u zv<{KDiI4Ng@Dw{Ih}VyyPhp4Hp76)c&*z#cBCjLY4EYs~&del=~`Id3;{f2ZK>>(HkuKd~dD)wx+meK*wUT zanL}F62wRRj#Ygmz7ZK-H)PacFS^ANd|&24#PIaEMqQt4TpBSee^#D*M!^j6o95`* z$+_G6*EzD>bG$3PRkMn{o~mAx(v?>GbgmpLx)k+5kp+2(z25mMy5Di6J?fDx#Xp!s zg>n`45Yj`?=bk##F@3JnUQ{a~*pn2kn<#hK&K+ieE3-egU;>TL#Frrz!{7>sta(UFm!j+UU}Z@MvUW$|j9 z@1eRM9{b0(JZIM2JcrATzNXmYSW)Y*t}I{U^`#Zp)Iig6mKuE<&XiKC)sks6!0T67 z;)W;x|M!+#?5sp=Fe--hG@)EQOcXr*&t63ZV5j0T*fJbuy&bk6VMD3?F_o>U&a7Uc zrWw_%JH|U~&Z(6()jq$ox)>(D!^Un90B!o`4MB8I|JS-3|55k5zHeu{`t&s7zIo-f zD?Al*{3}YztDWA;>N_RbqiSi66+WN0%I|hQT;-`OFP`G9sF_#pU8RN-Ui-FQu~?kW zbgRW_(AynW^i>vCSa-OT}0)BhR2prl*_en&Ycf zF?@r)xp%3IOuH?|fKXz|G-RNk%e3e-6?3NEY%n>D_RRDQ#bIAp=SQP=i?2Hun_KJk z)w(OnS3HDameX6i%wJujb_#uoFvq8cIcb%p#i1*GWi3VnIVrYuhcn&a(q~#Nc3d>w zrq8rn5zee;gJN=7oi>MIo&5=T^D=t?Qr=>^Q8_lF+2k_j=#7~!hu&nj365CP^%k>B zail9wSB6XZ{s@c1;xc5I9D19}hz=;zm8s7(SnYbN(O@wfO%|8K;96(jrLM67c~fxz z+^J?&|I~}}N>3RcK=sc5Qe5^?FK3+@xRBN9(km9liidP%pvfa}=UALBtI_IGOb+L| zIsvD1H&m7T3mlat2+zgd+S+QLTW$Vf>z&NM0}_97ZT+Py`eT!<4vk`eh zqP3M&mRFTyfa<}Rpija%)xJtYTCotM&Frw4Og5`tahYs-Qw|!p)oQls6|>1`O;<8Z zW{YW^eVaP%*dGEKDsNR8M&UgnwK%)2q$Gr1liy*Zu^5JN#Ub zwQpH@Rax5H+M>Ds@`@ht0mCeLtZBx|0?`(VJFQlO;>d8KvRE9MXh;SVDgmlPhSOxT z+pU={-10j6S~##@9;OD*F}O>i47eNjtQG#66@I(N*Aw^bSI;3bm7&AuI3K8W&o8ek zsa{pQL%JI?K0Ky@Y>jupPUE@6cKh6a;&z-gTcOV>GRR0i`+v5q!nJ@)B?p|?{o0~ zqXWVF{;z@H?NBn*bykhP9J4HEMOjEBufD=2fU=wof_*b(BX7(b@_m)DBS7Rh5PQ=z zEXaO?1KDpdIP^wWy3t~@8_YTBrghGL3nkNP_*-z6_QL<&b5gcN~v7gA&}`?Dx* z1rxbf&l{t8(VbfHpU`uAn||V-AB}W3QVh~yq*$bTkm8VrAjKmMMM^-r7by{G7?KWY dI8sv3KYzsZry%gGoDCgqasVsr_-_gu{ts#T