From f769cef71a252f5d4355c6447fd53a3300cea454 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Fri, 14 Jun 2013 10:13:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=8B=E5=8A=A8=E6=9C=BA?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=8C=E5=8F=AF=E6=AD=A3=E5=B8=B8=E4=B8=B2?= =?UTF-8?q?=E5=8F=A3=E9=80=9A=E4=BF=A1=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP | 11 +- .../Msi/Hsi/SevenOcean/CMMIO_SERIAL.H | 1 + .../Tools/UsbUtility/Debug/UtilityDebug.Log | 6 + .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 23 +-- .../UsbUtility/UsbUtil/So7_Manual_Machine.cpp | 146 +++++++++++++----- .../UsbUtility/UsbUtil/So7_Manual_Machine.h | 7 +- .../Tools/UsbUtility/UsbUtil/So7_Option.cpp | 25 ++- .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 6 +- .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 1202176 -> 1202176 bytes 9 files changed, 162 insertions(+), 63 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP index 22a3880..34e0b1e 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/CMMIO_SERIAL.CPP @@ -482,6 +482,7 @@ void CPSerial::OnReceive() { // Dummy OnReceieve if not used char s[255]={0}; + CStringA csTemp; s[1]='\0'; CurrentPointer = 0; @@ -496,7 +497,15 @@ void CPSerial::OnReceive() if (num!=0) { - csTemp.Format("%s",s); + for (int i=0;i<255;i++) + { + m_RecvData[i]=0; + } + for (int i=0;iSetCheck(TRUE); ((CButton *)GetDlgItem(IDC_RADIO_SO7_MANUAL_MACHINE_SEND_DATA_TYPE_ANSCII))->SetCheck(FALSE); + m_SendType=HEXADECIMAL; //=============================================================================== // 创建状态栏 @@ -86,7 +88,8 @@ BOOL CSo7_Manual_Machine::OnInitDialog() m_StatusBar.SetText(_T("System ready."), 0, 0); GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA)->EnableWindow(FALSE); - + GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_STOP_MACHINE)->EnableWindow(FALSE); + UpdateData(FALSE); return TRUE; // return TRUE unless you set the focus to a control } @@ -95,16 +98,36 @@ BOOL CSo7_Manual_Machine::OnInitDialog() //=================================================== void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineStartMachine() { - if (m_pSO7_Serial) + if (m_pSO7_PCDSerial) { - CString Params; - Params =_T("[COM1]Baud=19200,Parity=N,Data=8,Stop=0"); + m_pSO7_PCDSerial->SetPort(1,CBR_19200); + CString Param,Params; + int Port; + int Baud; + char Parity; + int Bits; + int StopBits; + int HandShake; + m_pSO7_PCDSerial->GetPortData(&Port,&Baud,&Parity,&Bits,&StopBits,&HandShake); + + Params.Format( TEXT("[COM%d]"), Port ); + Param.Format( TEXT(" Baud=%d"), Baud ); + Params += Param; + Param.Format( TEXT(" Parity=%c"), Parity ); + Params += Param; + Param.Format( TEXT(" Data=%d"), Bits ); + Params += Param; + Param.Format( TEXT(" Stop=%d"), StopBits ); + Params += Param; m_StatusBar.SetText(Params, 0, 0); - if(m_pSO7_Serial->Open(1,19200)) + if(m_pSO7_PCDSerial->Open()) { m_StatusBar.SetText(_T("成功打开串口"), 1, 0); GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA)->EnableWindow(TRUE); + GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_STOP_MACHINE)->EnableWindow(TRUE); + GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_START_MACHINE)->EnableWindow(FALSE); + } else { @@ -117,29 +140,30 @@ void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineStartMachine() //=================================================== void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineStopMachine() { - if (m_pSO7_Serial) + if (m_pSO7_PCDSerial) { - m_pSO7_Serial->Close(); + m_pSO7_PCDSerial->Close(); } - GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA)->EnableWindow(TRUE); + GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_SEND_DATA)->EnableWindow(FALSE); + GetDlgItem(IDC_BUTTON_SO7_MANUAL_MACHINE_START_MACHINE)->EnableWindow(TRUE); } //=================================================== void CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineCommonCmd1() { - // TODO: Add your control notification handler code here + GetDlgItem(IDC_EDIT_SO7_MANUAL_MACHINE_DATA)->SetWindowTextW(_T("F4 0D")); } //=================================================== void CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineCommonCmd2() { - // TODO: Add your control notification handler code here + GetDlgItem(IDC_EDIT_SO7_MANUAL_MACHINE_DATA)->SetWindowTextW(_T("F5 0D")); } //=================================================== void CSo7_Manual_Machine::OnBnClickedRadioSo7ManualMachineCommonCmd3() { - // TODO: Add your control notification handler code here + GetDlgItem(IDC_EDIT_SO7_MANUAL_MACHINE_DATA)->SetWindowTextW(_T("F6 0D")); } //=================================================== @@ -164,30 +188,27 @@ void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineSendData() GetDlgItem(IDC_EDIT_SO7_MANUAL_MACHINE_DATA)->GetWindowText(csSendData); const char* cSendData=T2A(csSendData); - int iSendDataLength(0); - int iWriteByte(0); - int iReadByte(0); - - if (m_SendType==HEXADECIMAL) + DWORD iSendDataLength(0); + DWORD iWriteByte(0); + m_pSO7_PCDSerial->m_csRecv=_T(""); + if (true)//m_SendType==HEXADECIMAL) { char* stop; BYTE bSendData[MAX_OUTPUT_BUFFER_SIZE]={0}; iSendDataLength=(csSendData.GetLength()+1)/3; - for(int i=0;iSendData((const char*)bSendData,iSendDataLength); + iWriteByte=m_pSO7_PCDSerial->Send((const char*)bSendData,iSendDataLength); } else { //加上回车换行符 - CString csTemp; - csTemp.Format(_T("\r\n")); - csSendData+=csTemp; + csSendData+=_T("\r\n"); cSendData=T2A(csSendData); iSendDataLength=csSendData.GetLength(); - iWriteByte=m_pSO7_Serial->SendData(cSendData,iSendDataLength); + iWriteByte=m_pSO7_PCDSerial->Send(cSendData,iSendDataLength); } m_OutMessage=_T("[Send] ")+csSendData; @@ -197,19 +218,47 @@ void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineSendData() m_StatusBar.SetText(m_OutMessage, 1, 0); //接受数据 INT iRetrys(0); - while(!m_pSO7_Serial->ReadDataWaiting() && iRetrys<20) + CString csTemp; + while(!m_pSO7_PCDSerial->m_iRecvState && iRetrys<20) { iRetrys++; Sleep(100); } - if (iRetrys<20) + if (m_pSO7_PCDSerial->m_iRecvState) { - BYTE RecvData[MAX_OUTPUT_BUFFER_SIZE]={0}; - iReadByte=m_pSO7_Serial->ReadData(RecvData,MAX_OUTPUT_BUFFER_SIZE); - m_OutMessage.Format(_T("[Recv]%s"),RecvData); - OutputWithScroll(m_OutMessage,m_edMSG); - m_OutMessage.Format(_T("Recv(%dByte)"),iReadByte); - m_StatusBar.SetText(m_OutMessage, 2, 0); + if(m_pSO7_PCDSerial->m_csRecv==_T("")) + { + m_pSO7_PCDSerial->m_iRecvState=FALSE; + INT iRetrys2(0); + while(!m_pSO7_PCDSerial->m_iRecvState && iRetrys2<60) + { + iRetrys2++; + Sleep(100); + } + m_OutMessage=_T("[Recv]"); + for (INT i=0;im_iRecvByte;i++) + { + csTemp.Format(_T("%X "),m_pSO7_PCDSerial->m_RecvData[i]); + m_OutMessage+=csTemp; + } + OutputWithScroll(m_OutMessage,m_edMSG); + m_OutMessage.Format(_T("Recv(%dByte)"),m_pSO7_PCDSerial->m_iRecvByte); + m_StatusBar.SetText(m_OutMessage, 2, 0); + } + else + { + m_OutMessage=_T("[Recv]"); + for (INT i=0;im_iRecvByte;i++) + { + csTemp.Format(_T("%X "),(BYTE)m_pSO7_PCDSerial->m_RecvData[i]); + m_OutMessage+=csTemp; + } + OutputWithScroll(m_OutMessage,m_edMSG); + m_OutMessage.Format(_T("Recv(%dByte)"),m_pSO7_PCDSerial->m_iRecvByte); + m_StatusBar.SetText(m_OutMessage, 2, 0); + } + m_pSO7_PCDSerial->m_csRecv=_T(""); + m_pSO7_PCDSerial->m_iRecvState=FALSE; } else { @@ -219,26 +268,41 @@ void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineSendData() //=================================================== void CSo7_Manual_Machine::OnEnKillfocusEditXScaleCoefficient() -{ - // TODO: Add your control notification handler code here +{ + UpdateData(TRUE); + USES_CONVERSION; + CString str; + GetDlgItem(IDC_EDIT_X_AXIS)->GetWindowText(str); + const char* cTempValue=T2A(str); + m_pSO7_Proto->g_machine.s_machine_config.x_axis._scale_resolution=atof(cTempValue); } //=================================================== void CSo7_Manual_Machine::OnEnKillfocusEditYScaleCoefficient() { - // TODO: Add your control notification handler code here + UpdateData(TRUE); + USES_CONVERSION; + CString str; + GetDlgItem(IDC_EDIT_Y_AXIS)->GetWindowText(str); + const char* cTempValue=T2A(str); + m_pSO7_Proto->g_machine.s_machine_config.y_axis._scale_resolution=atof(cTempValue); } //=================================================== void CSo7_Manual_Machine::OnEnKillfocusEditZScaleCoefficient() { - // TODO: Add your control notification handler code here + UpdateData(TRUE); + USES_CONVERSION; + CString str; + GetDlgItem(IDC_EDIT_Z_AXIS)->GetWindowText(str); + const char* cTempValue=T2A(str); + m_pSO7_Proto->g_machine.s_machine_config.z_axis._scale_resolution=atof(cTempValue); } //=================================================== void CSo7_Manual_Machine::OnBnClickedButtonSo7ManualMachineClearMsg() { - // TODO: Add your control notification handler code here + GetDlgItem(IDC_EDIT_MANUAL_MACHINE_MSG)->SetWindowTextW(_T("")); } //=================================================== diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.h index 1b5ca44..9faf7c3 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Manual_Machine.h @@ -22,12 +22,13 @@ protected: virtual BOOL OnInitDialog(); DECLARE_MESSAGE_MAP() protected: - CStatusBarCtrl m_StatusBar; + RS232SendType m_SendType; CString m_OutMessage; + CStatusBarCtrl m_StatusBar; CEdit m_edMSG; - char m_SendType; - void OutputWithScroll(const CString &strNewText,CEdit &edtOutput); + public: + void OutputWithScroll(const CString &strNewText,CEdit &edtOutput); afx_msg void OnBnClickedButtonSo7ManualMachineStartMachine(); afx_msg void OnBnClickedButtonSo7ManualMachineStopMachine(); afx_msg void OnBnClickedRadioSo7ManualMachineCommonCmd1(); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp index a39bf04..3265655 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Option.cpp @@ -39,7 +39,7 @@ #include "afxdialogex.h" //#define _RELEASE_ONLY_ONE_FUNCTION -CSerial* m_pSO7_Serial=NULL; +//CSerial* m_pSO7_Serial=NULL; CPSerial* m_pSO7_PCDSerial=NULL; CSO7_Proto* m_pSO7_Proto=NULL; CKeyence_Laser* m_pKeyence_Laser=NULL; @@ -198,20 +198,33 @@ void CSo7_Option::OnBnClickedOk() { CSO7_Verfication_Algorithm* pSO7_Verfication_Algorithm=new CSO7_Verfication_Algorithm(); pSO7_Verfication_Algorithm->DoModal(); + delete pSO7_Verfication_Algorithm; } else if (((CButton *)GetDlgItem(IDC_RADIO__SO7_RS232))->GetCheck()) { - if (!m_pSO7_Serial) - m_pSO7_Serial = new CSerial(); + if (!m_pSO7_Proto) + { + m_pSO7_Proto = new CSO7_Proto(); + } + if (!m_pSO7_PCDSerial) + { + m_pSO7_PCDSerial = new CPSerial(); + } CSo7_Manual_Machine* pSo7_Manual_Machine=new CSo7_Manual_Machine(); pSo7_Manual_Machine->DoModal(); + delete pSo7_Manual_Machine; - if (m_pSO7_Serial) + if (m_pSO7_PCDSerial) { - delete m_pSO7_Serial; - m_pSO7_Serial=NULL; + delete m_pSO7_PCDSerial; + m_pSO7_PCDSerial=NULL; } + if (m_pSO7_Proto) + { + delete m_pSO7_Proto; + m_pSO7_Proto=NULL; + } } diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h index 0192be3..e893a3d 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -254,6 +254,7 @@ #define IDC_CHECK_MIRROR_VERTICALLY 1204 #define IDC_CHECK_SV2000E_MIRROR_VERTICALLY 1204 #define IDC_CHECK_CONTINUE_READ_LASER_VALUE 1204 +#define IDC_CHECK_SO7_MANUAL_MACHINE_READ_POS_CONTINUE 1204 #define IDC_RADIO_MACHINE_SevenOcean 1205 #define IDC_CHECK_CONTINUE_READ_LASER_LK_H_VALUE 1205 #define IDC_BUTTON_INIT_SO7USB 1206 @@ -345,7 +346,6 @@ #define IDC_EDIT_IMAGEDLL_2LASER_TOPZ1 1274 #define IDC_EDIT_FRESHSPEED_X2 1275 #define IDC_EDIT_IMAGEDLL_2LASER_TOPZ2 1275 -#define IDC_EDIT_REPRETEST2 1275 #define IDC_EDIT_MANUAL_MACHINE_MSG 1275 #define IDC_EDIT_FRESHSPEED_X3 1276 #define IDC_EDIT_IMAGEDLL_2LASER_TOPZ3 1276 @@ -743,6 +743,8 @@ #define IDC_EDIT_IMAGEDLL_2LASER_MEASURED_VALUE9 1610 #define IDC_EDIT_TEST_KEYENCE_SETFOCUS 1650 #define IDC_RADIO_SO7_VERIFICATION_ALGORITHM 1651 +#define IDC_BUTTON4 1652 +#define IDC_BUTTON_SO7_MANUAL_MACHINEREAD_POS 1652 // Next default values for new objects // @@ -750,7 +752,7 @@ #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 168 #define _APS_NEXT_COMMAND_VALUE 32771 -#define _APS_NEXT_CONTROL_VALUE 1652 +#define _APS_NEXT_CONTROL_VALUE 1653 #define _APS_NEXT_SYMED_VALUE 101 #endif #endif 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 8063e9504ea451a3862f9567173c6d511e535990..bf06d31c9ef7d6b8880d0825044fb206861737a0 100644 GIT binary patch delta 8364 zcmcgReO#1P*3Y?jW*iVLeaQDG1?)Ko-NDn&?CG(UjQ5Wfa8zd{AB z&ha}$mMqOsj6q8st#!>cBlBJRP#4Yeqt?{OUH!G&p8E`g*1NyoyMMh8zr*u9_qq4n zbI%ZT^8tB-{POn z&}D~kQ5cY}>FgO7EdifGnH&*w$ew5SLaMsUQ*I%e5$gbJ|S=;>y|_dhA9J-L|URKCIYKc zL|~;UPbt&sOSUpq{Ig4vNWG`2w>_cZ`WTwzPv9oLFnA1j!7p?LddAxKrKfuYbcy^Y zhl?h&p+3X>9oIr98frai=yG;O5f4L0=;h+B>IdS6?hT+Ri$rm^5&GZJpd_i4P2E1x zX%$}&hWeIpALuYwi6Bbz=uc6Oi~W(Gup$K$let+DbsL?iM=6yz83~sj2g-N zR1adJVnmjxYt)I(YRI*~7L|JI2I$_YkPLXX67`slk0b6KML^h&O%EVgn2Ws8m<$DC^ou4m z{+X2@n0-p4=|KCaMk5OIgM=Z!UVM-~_&~uau8EY^<@P%BeV8cNW+JwPYz153pI;$tFa>zY;p2V&g~X4X1r{ch#b-?0nc2@7!RsMZ`5dXwZK-BsvPgTyHM@JxCo9 zg|DP*;@Z%+yyC;qmI({c6--=D6R($Ki*lo-m8kLJlKqb&+8!?M4Y1YQR=KzsGAUP_ zw0FUCIZ*1j!TJG+b&F5Bzpp#NG4B-?to0)z%h5j>refU}5b75}4tFjcf$WFAY?7iB zRkQlTeG#>FPxS_!pLDH{T-ISs=m!I_sXGi3maRrl!mwx(3=|!{Np#F3J+F;}F7@#{P5_qPWrOf=H|9h77DhC<+_siF zvpZ&OCR>|7CF-S?q|vlWRlL#&Vn`@Hq$iRQlM*_B+GG?k#4y{_4*t-`FpgeHU6C{ z1FW6}S)%Hwj7lmNobUOSuNGesOm1b#QN)dpq3o%sOnpKVLUNGmDOvs zZLOU9n#gJh(w?Q)^B%Og<16Swij_o|k5bqyq1bA|;#165*js|(E#ZH4GnU7L5!Q(8 zdmrKX8!W@)b-hK_Jsn1Ogb$%XqF-Cj{t@2=lZ~YNO!eQgl>~j!=sRTwp78oG0@N! zXn0RhoWFDe(1;In+^#FDDHv@}QV0mxuf~3Z8j-Y{30Y-p2#VI)=xvj9f+ZqvTcB3v zBzw_66aL_KCcQ9!C7|SN5Za%BP-mzaE^1Y0Hlx*>H6 zB4!>?vz7^HPcdd7si6jLx4DMV*fIes(cT>b*(91bmnGoGT_FU|ZG(f-RJyBjOC~gz zMRw(TGTxGmdeHk0$>@=_;iMzR-jD%gOC+GGOz1)ZWK1tO1{g0BhW+-r2dPVjB(`whC^B)CQJ z9l`eme{J^KOx#O}7fo>{ zwDkg`s3~i}rTrlchx8*4Kzee3JCq!e9k&b@#6TCcMv~rrt~!iICZKIc_{t@ZCZcT# zi-VtWXDsaMu!*waIAszg(gn&qTowo2oS|`W5%54PMQZ66a7QfYh@B zI|?=k+i)FbJwqp#aR|$ov2ZYmDCcH8I~XFg{Rm%;WMqZZ(*U?3qs+$`lMee}RjcEV zMr%4LcCC6una4tZT#^P$@cfS~9GhanM-7CSmj;Hmg!>ETjhDwluyn0EVGsIdvH<9S z?~H*9WFmKy`44Oa2>aeGt%-;QvoeTevY59-X52bF`xAKMZJFcM3_B>@eyHkK69h!B z#l`)>tiFDWQ#P{aMN?mkn%-$I5(iGYBgG?sIUkoj2e0!=Qmf-B^GNlA+PgEAaGI@V zZKAv?RvSUAxU6zo4Kmhep^G?wGaU1NWLa=Q_2+7`rIlgSifgke4m4$f3*L8c__-g1 zk`SJ!uZP>t?4y$DBOv9~)({%Zo~CopEc0Z|cs7R)d9Y}kTESp2y}>$i{?qWzR*D_b z18q**blL@Hy~u+x^CVcDwp?(v6HU9is46^+Hgu4v7K+2`gRtoZ!WOf&3ag%C0cgup zwf&0ymD&Ol`(fX3)#a?FC2HDCA%|lAeI4G(CkcP~==2m~O>j*GN>VY~3i6Gf`U}k~NP*8UCtnw^oDNW}y5&0&L(s6CB)zW` zj)GhDMApwn{8u^X*c!Jxl>!wH*T``3rO1A9Wo;S7kjg%MkoFmQST(ssS10m@L&Wi% zU04;vr2c9+~kv3P1<*9qRjCU$rq(d>oADG&7s2J zXBAeB-s##v#RJxKV#BbmlK7zJM=zm~o>5Z)TVxr!>5(psBO2Dq64R`ve?JiN1~K-S zz`U){lWHr~x}-G|i8s}cB|TKKx}$ju9ZZG;(VFM!;X^ur49@}R_#=xz`zFxw15{du z^pO6=jYXF1?i^h*KMY^k$THmOwbBCLVdU#HwR#7XlQ~CChI(w;$NH1q%h+{I7PCbS z)sPtqb8+W*9wK)3v^iZT<&hgt6T$AP0rM)E13{lT`mb z;uM%2JBiI{Rj{ey3>fr%mJRh~A!{3-|9MHfK5s0a?XnP|G2+j+g8Vtb;?Y1p(u7py@aHd>?qDah7<*|MfX68(rH#NK9S;D?W4JswL?rR8wThaktS509!;eAxO1-L7> z=*Lq1@qk4pc9}9&*$%)|6AObgWS`k0IxbLTy{U5s2ePZ=vX9Kxj-`znFls&{mVeAN z+7LqC=&t%?0!Cz0KjI$ijG7=8O{%7G_77sGIo^97R%r`pu|v(o9Z#@WI#z2+G)UOv z~3LooLK?Qqga6R`)=&KH~MS9))2*PK?#aNnJ+bq6t&?Z+eYbBTF+7Y zEJhlY4X4MNNi^b_FH5dDqGbDgsn|ZXqnRGh#X`CoKW=p*=Uqnz_GJKNX%AMh5gIMX(5?2QoP}#ynMOnxmEPAKxO zkc2;%fd#SjIcoeg$LVnNM)Ic8?8Rx{AUwK(rtc<%0`Cach3aLpjHlEn=r@`;?pE11 z>3C`rDbcZo9mRlDlGnK{EWe$XTHwi0uIfA%R>;@hd*5APo$iYIvSFwFXpnVngU%*-0z zV=15+;8~4@@5_z*(|g~xu@)NBDpvKKdYf2ygpI+ZTo=?ELCL;GQ7bJ{;-7XX_t zG7Wxpn03QlpC<5w&NOM9?bT(^%)cch5pk^OM21_Cf3m$+t5 zXo}wystJGwsCtMfr6wM^BABrPBgD^r^ z@BHNoE8*h!A55ZZz$_YBqdElA&Ipn7B1JP#yqQS5*QmNkq#Csw>9sA5vC0g_ag*hM z!(9gXCU`q?8C5#B7*#rR9`ke31*@e#^-N+_t~$JUN2WZGsp@*QWkfYB+U}CfEeU+O zC!K*@%)ZH97v*8Y8d{jGqvMj)4=--FVEK%{TELpH>>fFn!j+Vq$}S^S za^xmtBlw`FySM4LsbxwyH^>C`TXGN5>d3Nt((;lXy~Ua9v!FYE(ua4&6UAgD)@a_u zg=KLD#-C;ut!z}4xdT_~Q@lWw_E@F*1+DDYFDDFxodwB!F5uh&yi!z(XxX$PdSnl~ z%AM59x>zgw*E?jFV6)7ZsOgw}Z>uZ=BPiol+j?s1KZ0ht^JI56XB)(Ie2tnXz1*76 zc;UP_zSWZ_kBH+vi954vZQNT_uZWP{L77E16C!tN>WZa8H=a^IR|2xXt})Py)*7FVVxUBbH>_LEK(G$atUD~uaRyd4i~5M zOZfU&egP9hjMbRA0Q|8sgZG9HF~6&^5`!jlZyfS0??p`s&?|Fp?s)NQFT3rlHWYqn z9nX8QQ3{To%s;}2dEDFi^+Y~T>pVY&9|PxSQ@HED`j0eoBf>0x4DBbGEnM~_50V%v z=)Rt`Q?^itccESZy?b(s;Uq=*jxH^EJJ+9>t$noB+LuO@QA6XO6fVcR6Sr;osn~p0!fy z1FYy;z+LU#Te|o4M`~DB3RrE!A(trq^Pt!Oj$)qWf8~Gr6(v60oIgurDcJJk^f$t! zN2#dO<2yAx23^JcqW?#euPz#tmS1r{YL))N%AK<`a*ETnh;z__?Ea}S6I&K@a{ZF0 z&v`iDEL_4h;Qzv8u{=`uPT+#RZzdhRKKtxkk^NnObNf<06|f?M_xZo&8UPJzNa&(+ zfK6C5M(n^FI$*#^67yR z!O;2t#KW@^`pV>+w!LKfnIJ~oL=Z9k2Gzb;e?LK&?o*U@L1lmH}nH4T9M{JmQ ziAA=F^Vgbz^;!H1{MKiYGc}qzlDBNTWO5?oLb78bIYjySN!dnqUnZBwt4@yTckS<; z*4Q5NqY&kcpTSQsXNNGOt6im*a*(&dqMt!}G0mfZ+GG;{LGeJ-3#)HYf-;>xL=tXQ zX|zvE_v8M!8$x92r%RJV3KnmsBrbG4m^Ck`s3vh_i|}J zyBst4;Q!YLTZnO&JNU3rW1`8dcOOmu52t5YuqXdEBB=s0jcc3Pd~7&9tMYqHGU_b< zJ8iS5DM`;-ypzdme|1b}_jUZscFty-aWCNB?L6J-mt?%loOf%uA2|I+8OJf_xPyEP zU-{_~2^s<|fsUXZfu6vNz?+~wfe%3k0$&0@0)z9@BmSmt7&(u7IU9nEYX^8KvZ|FL kaQltI3C1xZDLsn1VDz9S{}YYrs=xNRNp+e=6_%p>8yk-6M*si- delta 8209 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