From bf5158f0c93b293a11195446b4c559c9a6d32c33 Mon Sep 17 00:00:00 2001 From: TAO Cheng Date: Tue, 20 Jan 2015 21:40:29 +0800 Subject: [PATCH] Add DM200 --- .../Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp | 63 +++++++++++++++++- .../Msi/Hsi/SevenOcean/So7_TCPIP_Server.h | 3 + .../Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc | 5 +- .../UsbUtility/UsbUtil/SO7_Send_Parameter.cpp | 7 +- .../Tools/UsbUtility/UsbUtil/So7_Option.cpp | 4 +- .../UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp | 63 ++++++++++++++++++ .../UsbUtil/So7_Util_PLC_TCPIP_SERVER.h | 2 + .../UsbUtil/Usb_Util.vcxproj.filters | 8 ++- .../Hsi/Tools/UsbUtility/UsbUtil/resource.h | 2 + .../Hsi/Tools/UsbUtility/UsbUtil_VS2010.suo | Bin 156160 -> 156160 bytes 10 files changed, 148 insertions(+), 9 deletions(-) diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp index 3aad8dc..6c342c1 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.cpp @@ -66,9 +66,12 @@ CSo7_TCPIP_Server::CSo7_TCPIP_Server() DM5000= (short *)malloc(sizeof(short)*MAX_DM_PAGE_NUMBER); DM8000= (short *)malloc(sizeof(short)*MAX_DM_PAGE_NUMBER); DM10000= (short *)malloc(sizeof(short)*MAX_DM_PAGE_NUMBER); + DM200= (short *)malloc(sizeof(short)*200); + memset(DM5000,0,sizeof(short)*MAX_DM_PAGE_NUMBER); memset(DM8000,0,sizeof(short)*MAX_DM_PAGE_NUMBER); memset(DM10000,0,sizeof(short)*MAX_DM_PAGE_NUMBER); + memset(DM200,0,sizeof(short)*200); m_TCPIPMsg.Init(); } @@ -88,6 +91,8 @@ CSo7_TCPIP_Server::~CSo7_TCPIP_Server() DM8000=NULL; free(DM10000); DM10000=NULL; + free(DM200); + DM200=NULL; } //================================================================ int CSo7_TCPIP_Server::Init_Winsock() @@ -307,6 +312,38 @@ BOOL CSo7_TCPIP_Server::Response_Handshake() SendBuffer(); return TRUE; } + +//================================================================ +BOOL CSo7_TCPIP_Server::Response_PLC_DM200_R(short _StartAddr,short _DataSize) +{ + if(m_ClientSocket[m_nActiveClient] == INVALID_SOCKET) + { + return FALSE; + } + m_ClearSendBuf(); + memcpy(m_TCPIPBuf[CH_SEND]._buffer,DRW_SData,sizeof(DRW_SData)); + short sData(0); + _StartAddr-=200; + if ((_StartAddr+_DataSize)>=MAX_DM_PAGE_NUMBER) + { + _DataSize=MAX_DM_PAGE_NUMBER-_StartAddr; + } + for (int i=0;i<_DataSize;i++) + { + sData=DM200[_StartAddr+i]; + m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i]=(sData>>8) & 0x0ff; + m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexData+2*i+1]=sData & 0x0ff; + } + short sDataSize(0); + sDataSize=(DRW_SDataIndexData-DRW_SDataHeadDataSize+_DataSize*2); + m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize1]=static_cast((sDataSize>>8) & 0x0ff); + m_TCPIPBuf[CH_SEND]._buffer[DRW_SDataIndexDataSize2]=static_cast(sDataSize & 0x0ff); + m_TCPIPBuf[CH_SEND]._size=DRW_SDataIndexData+_DataSize*2; + + SendBuffer(); + + return TRUE; +} //================================================================ BOOL CSo7_TCPIP_Server::Response_PLC_DM5000_R(short _StartAddr,short _DataSize) { @@ -570,7 +607,12 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s) m_TCPIPMsg._CmdType=0; m_TCPIPMsg._DataAddr=iAddr; m_TCPIPMsg._DataSize=iDataSize; - if (iAddr>=20000) + if (iAddr>=200) + { + Response_PLC_DM200_R(iAddr,iDataSize); + m_TCPIPMsg._MsgType=RESPONSE_READ_PLC_STATE; + } + else if (iAddr>=20000) { m_TCPIPMsg._MsgType=RESPONSE_READ_ERRCODE; } @@ -610,6 +652,25 @@ void CSo7_TCPIP_Server::m_ProcessSocketReadEvent(SOCKET s) m_TCPIPMsg._CmdType=1; m_TCPIPMsg._DataAddr=iAddr; m_TCPIPMsg._DataSize=iDataSize; + if (iAddr>=200) + { + int iBuffsize(0); + int iStartAddr(0); + iStartAddr=iAddr-200; + bData[0]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize1]; + bData[1]=m_TCPIPBuf[CH_RECV]._buffer[DRW_RSDataIndexBufSize2]; + iBuffsize=(bData[0]<<8)+bData[1]; + iBuffsize-=DRW_RDataCCLen; + for (int i=0;i=8000) { int iBuffsize(0); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.h b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.h index bc8a84f..2f3cf5c 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/SevenOcean/So7_TCPIP_Server.h @@ -53,6 +53,7 @@ enum TCPIP_RESPONSE_RESULT RESPONSE_READ_SENSOR_STATE, RESPONSE_READ_CCD_DATA, RESPONSE_READ_ERRCODE, + RESPONSE_READ_PLC_STATUS, RESPONSE_RESULT }; @@ -121,12 +122,14 @@ public: short *DM5000; short *DM8000; short *DM10000; + short *DM200; BOOL StartServer(HWND _hWnd,short _nPort); BOOL StopServer(); BOOL _Send_Cmd_Write_State(); BOOL Response_Handshake(); + BOOL Response_PLC_DM200_R(short _StartAddr,short _DataSize);//PLC State BOOL Response_PLC_DM5000_R(short _StartAddr,short _DataSize);//PLC State BOOL Response_PLC_DM10000_R(short _StartAddr,short _DataSize);//CCD diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc index b33ed5b..67f2ab7 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/Mv_Util.rc @@ -1096,8 +1096,9 @@ BEGIN EDITTEXT IDC_EDIT_PLC_TCPIP_SERVER_PORTNUMBER,51,30,40,14,ES_AUTOHSCROLL LTEXT "Port",IDC_STATIC,29,33,14,8 CONTROL "CCD1 DM",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_CCD_DM,"Button",BS_AUTORADIOBUTTON | WS_GROUP,32,110,46,10 - CONTROL "DM 5000",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM5000,"Button",BS_AUTORADIOBUTTON,93,110,44,10 - CONTROL "DM 8000",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM8000,"Button",BS_AUTORADIOBUTTON,156,110,44,10 + CONTROL "DM 5000",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM5000,"Button",BS_AUTORADIOBUTTON,96,110,44,10 + CONTROL "DM 8000",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM8000,"Button",BS_AUTORADIOBUTTON,158,110,44,10 + CONTROL "DM 200",IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM200,"Button",BS_AUTORADIOBUTTON,220,110,40,10 END IDD_SO7_UTIL_CAMERA DIALOGEX 0, 0, 417, 271 diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp index 60645dc..31a5e9c 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/SO7_Send_Parameter.cpp @@ -222,7 +222,7 @@ BOOL CSO7_Send_Parameter::OnInitDialog() ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA2))->SetWindowTextW(_T("缓冲距离(0-255)")); ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA3))->SetWindowTextW(_T("最低速率(0-255)")); ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA4))->SetWindowTextW(_T("刷新周期(0-255)")); - ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA5))->SetWindowTextW(_T("最大速率(0.0-10.0)")); + ((CStatic *)GetDlgItem(IDC_STATIC_SPEED_PARA5))->SetWindowTextW(_T("最大速率(0.0-65.5)")); } else { @@ -238,7 +238,10 @@ BOOL CSO7_Send_Parameter::OnInitDialog() GetDlgItem(IDC_CHECK_SO7_CONTROL_MODE_Y)->EnableWindow(FALSE); GetDlgItem(IDC_CHECK_SO7_CONTROL_MODE_Z)->EnableWindow(FALSE); } - + else + { + UpdateControlMode(0); + } return TRUE; // return TRUE unless you set the focus to a control } //========================================================================================= 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 8f037e4..2d0deb1 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 @@ -157,9 +157,9 @@ BOOL CSo7_Option::OnInitDialog() ((CButton *)GetDlgItem(IDC_RADIO_SO7_OMRON_PLC))->SetCheck(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_SO7_OMRON_PLC_SERVER))->SetCheck(FALSE); -#ifdef _RELEASE_SO7_CONTROLER_ONLY +#ifdef _RELEASE_SO7_CONTROLER_ONLY/* ((CButton *)GetDlgItem(IDC_RADIO_SO7_OMRON_PLC))->EnableWindow(FALSE); - ((CButton *)GetDlgItem(IDC_RADIO_SO7_OMRON_PLC_SERVER))->EnableWindow(FALSE); + ((CButton *)GetDlgItem(IDC_RADIO_SO7_OMRON_PLC_SERVER))->EnableWindow(FALSE);*/ ((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SDK3000))->EnableWindow(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SV2000E))->EnableWindow(FALSE); ((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SV4000E))->EnableWindow(FALSE); diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp index 1a34d76..d5ce8df 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.cpp @@ -58,6 +58,7 @@ BEGIN_MESSAGE_MAP(CSo7_Util_PLC_TCPIP_SERVER, CDialog) ON_BN_CLICKED(IDC_RADIO_PLC_TCPIP_SERVER_ADDR_CCD_DM, &CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrCcdDm) ON_BN_CLICKED(IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM5000, &CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrDm5000) ON_BN_CLICKED(IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM8000, &CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrDm8000) + ON_BN_CLICKED(IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM200, &CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrDm200) END_MESSAGE_MAP() @@ -417,6 +418,19 @@ void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrDm8000() m_UpdateListControl(E_LISTCTRL_DATA2CONTROL); } //===================================================================== +void CSo7_Util_PLC_TCPIP_SERVER::OnBnClickedRadioPlcTcpipServerAddrDm200() +{ + m_UpdateListControl(E_LISTCTRL_CONTROL2DATA); + if (m_DMAddrList==DM_ADDR_DM5000) + { + m_UpdateControls(FALSE); + } + m_DMAddrList=DM_ADDR_DM200; + m_UpdateListControl(E_LISTCTRL_TITLE); + m_UpdateListControl(E_LISTCTRL_DATA2CONTROL); + +} +//===================================================================== void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateListControl(int _type) { switch(_type) @@ -616,6 +630,31 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateListControl(int _type) m_DataList.SetEditableItemRange(0,MAX_DM_PAGE_NUMBER-1,1,1); m_DataList.SetColorStyleItemRange(0,MAX_DM_PAGE_NUMBER-1,0,2); } + else if (m_DMAddrList==DM_ADDR_DM200) + { + LVCOLUMN vColumn; + vColumn.mask=LVCF_TEXT; + vColumn.pszText=_T("DM200地址"); + vColumn.cchTextMax=10; + m_DataList.SetColumn(0,&vColumn); + iStartRow=0; + iEndRow=MAX_DM_PAGE_NUMBER; + for (int i=iStartRow;iDM200[i]); + if(i==25) + str.Format(_T("0x%X"),g_pSo7_TCPIP_Server->DM200[i]); + m_DataList.SetItemText(i,1,str); + } + } else { ; @@ -748,6 +799,17 @@ void CSo7_Util_PLC_TCPIP_SERVER::m_UpdateListControl(int _type) g_pSo7_TCPIP_Server->DM8000[iRow]=static_cast(atoi(cTmp)); } } + else if (m_DMAddrList==DM_ADDR_DM200) + { + iStartRow=0; + iEndRow=200; + for (int iRow=iStartRow;iRowDM200[iRow]=static_cast(atoi(cTmp)); + } + } break; } default:break; @@ -922,3 +984,4 @@ CString CSo7_Util_PLC_TCPIP_SERVER::TCPIPMsg(s_tcpip_msg_data _MsgData) + diff --git a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h index 541cfaf..5d5fe00 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/So7_Util_PLC_TCPIP_SERVER.h @@ -5,6 +5,7 @@ enum DM_ADDR_LIST DM_ADDR_CCD, DM_ADDR_DM5000, DM_ADDR_DM8000, + DM_ADDR_DM200, DM_ADDR_LIST }; // CSo7_Util_PLC_TCPIP_SERVER dialog @@ -52,4 +53,5 @@ public: afx_msg void OnBnClickedRadioPlcTcpipServerAddrCcdDm(); afx_msg void OnBnClickedRadioPlcTcpipServerAddrDm5000(); afx_msg void OnBnClickedRadioPlcTcpipServerAddrDm8000(); + afx_msg void OnBnClickedRadioPlcTcpipServerAddrDm200(); }; 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 e07f6ce..9561a9b 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 @@ -238,7 +238,9 @@ Sources Files - + + Sources Files + @@ -511,7 +513,9 @@ Header Files - + + Header Files + 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 9b2e260..7ccfd11 100644 --- a/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h +++ b/PcDmis/Base/Interfac/Msi/Hsi/Tools/UsbUtility/UsbUtil/resource.h @@ -950,6 +950,8 @@ #define IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM8000 1806 #define IDC_EDIT_MOVETO_DEG 1807 #define IDC_RADIO_READ_LIMIT_SWITCH 1807 +#define IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM8001 1807 +#define IDC_RADIO_PLC_TCPIP_SERVER_ADDR_DM200 1807 #define IDC_BUTTON_TESA_STAR_SENDMSG 1808 #define IDC_EDIT_TESA_STAR_E_LOG 1809 #define IDC_BUTTON_TESA_STAR_CLEAR_LOG 1810 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 19da8e0f3aca4192dd01b64cd569adbe90c5691d..826e49d8bb54ee536ea7b545010f4c4e5706bbbd 100644 GIT binary patch delta 3319 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 delta 3303 zcmbtW4Nz1^5}uxYyZaUvviypO{Aonc)yK-OMtv+RMnqUq&*bz@jbOy01j+h`8aMIp zOcaIj7}S&V2hn&@k!N`3lGF94PII}6ir$?uo`qH}dd9NEqA0Wyync&IJS%sVs?1iu z?fIsArl+U7XWZvZ?sKN5JOPX>PKXI?3K-CEW%wn~5kfqFS1N@GU?NYkSrFit;$blB z&`%Y*5n*|Tp@l1-dsf^sU9(J+ZT|06^| zafw~*6T`0e3H6dB2>2h!leU4G{k6|hmaWJ2A_`2zjI!?`J=-8cpzS%t2kHAGw~#IG zo2%(49et-7g-?8g%oSIl!R9zh$OA;R#^dT>kTNK~K9D)|l3^G^`}eRX(gYI(A|IrQ zc)jUL_IklT7Lj?HuLxn6N6ccg$BD{3+dqvxP8o?t{t<^ZAbIr+LAY2H@XG0s#0R|% zk!+0KPuSucX0B1Vhu>g#vk&s0kK7(4Z2ag27-bwy3P~~PWLe@V|5D`Ukhk!=Qt=<1 zN|`*Sf#&2U!%8KMopM}3j7>SfBH5y`fk%n{>qtXZiUHfu_HYNpkmnljFs zVb2*SWsXR8*peNqZnI-6_XkfYc1KG~EZ$(ySN~&E-vsu%mjAUy{W{zad%(OYIj^vc|w9M?3>~u%Us+C-S6@&52 zoL~1attCU?v)&m^Qwq{&IV;LsW$g5#B=}0RgU4P3!8pxTQtBw}vA}Dd7v>A9U?g1k zik&=%7EP;zApt$1OMZgG zdXDG$ujBvukU1;E!xJzPd`&_=9XpQy_t@MHuy@Ij53q*RdpYe_tysHUL)S}bZ>X9ixy1O%{RBc%%|Ll06V~A3{ zYO}xO_}No=ccm4$o|fntfXvHCjvo&#O+NHsuNM+M$C1}cs1m*Lo?r8hY@=2&^bSN? zmF0W3=%Acs{jLB;vyvTgSbG<+%e%B*!SH@sj~5(*u;#|I)T=cawHnytgA+xqbiRb- zEeVS213?e3vE@ge(guH4d2~IyTN#ZTob4k5hK5rb#(b_bRYi+Xu4utBct8 z8~Q8zn`Y?v>|9vSq*}95)3U?}Ei7xyK5zOf$Is;fgC&xZaqBG+evcmNEpbA!odcF?RgMp(TeBujmvl7m7waoh5X6ceb>{jZjP;Q-}$`@WkdM- z%`mX}FYyAu768$T{KYRJC_pS*5GxEUw?w{D*B#LHQ7*qV7{Zw6qFaYP)Lf(#U5bJs z<)i{{f(2-i&(jZ)(Te$m=P+#y@N&ZmF0U0=V=o-(S@mtbXo3Lj*8Bin@fPHuN<;#m z&8zwN2G5Fu6^i?+9}SxID1$E^HDq|?#$VmPI$;0O8QM<5`Yzp_6uCz3tTc9}7o*10 zr!&bEHuge)bem?>b#&Y7{LD8X^VX|S#N`4S&fD6+P;>2qunh%zDtjU3@FBvUT+0`# zeIRpv>C`R~Q!Ea8tzyZEAaVi&+GSIO z>&9{EK3M!Gktt**nM4+oBUtvw^5#~MYZrm6cy7qR+ShMVws}f*qHUG^Fkm%qzMcJ& z3ACFOqtF*+?VBiTUzEnBJ>bty9t&sgrYL2_pVtA)J#SXbH#>Cfl1FTQ@+uXy_-%GLw5iLd z!iN6rWR+db&4ZKB=z>6D(cP?L> zM0-Shgh@GR)(rm6EwHNAPcZ=)icTolFKDR@W^L#Rd5I_*{Es2agvpGXhzqY~{__ovetN&f-m C2pS3i