long CCompileEditView::DeleteCurExp(WPARAM wParam /*= 0*/, LPARAM lParam /*= 0*/) { HSTreeToCompileEdit* pppData = (HSTreeToCompileEdit*)lParam; if(pppData == NULL) return 0; CTreeGroup* pTreeGroup = (CTreeGroup*)pppData->m_pName; if(pTreeGroup != NULL) { CExpression* pExpress = pTreeGroup->GetData(); if(pExpress != NULL) { CString strName; strName.Format("%s",pExpress->GetName()); CValue* pValoare; if ( m_pExternExpression->Lookup(strName,pExpress->GetExpressType(),pValoare) ) { if( !pExpress->GetPWD().IsEmpty() ) // 有密码 { CInputPassPwD dlg(this,_T("请输入公式密码"),strName); dlg.m_pExp = pExpress; if( dlg.DoModal() == IDCANCEL ) { return 2; } } if( wParam ) { m_pExternExpression->RemoveKey(strName,pExpress->GetExpressType()); delete pValoare; } } if(m_pwndDlgMainBar != NULL) { CComboBox* pCombox = (CComboBox*)m_pwndDlgMainBar->GetDlgItem(IDC_NAMECOMBO); if(pCombox != NULL) { int nIndex = pCombox->FindString( 0, strName ); if(nIndex != -1) { pCombox->DeleteString( nIndex ); } } } } } else { } if(m_hExpressInTreePos == (HTREEITEM)pppData->m_pData) { OnNewExpress(); } return 0; }
void CDlgFormulaFind::OnLvnItemActivateResultlist(NMHDR *pNMHDR, LRESULT *pResult) { LPNMITEMACTIVATE pNMIA = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR); DWORD dwData = m_wndResultList.GetItemData(pNMIA->iItem); //发双击在K线处显示消息 //双击指标 将指标发送回外部 if(m_pParentWnd != NULL) { m_pParentWnd->SendMessage(HX_USER_DRAGDATA, HSCurKeyInfo::UpdateExpressData/*HX_USER_DRAGDATA-1*/, (LPARAM)dwData); if( !m_pParentWnd->IsZoomed() && !m_pParentWnd->IsIconic() ) { CRect rect,rcDes,rcThis; CWnd* pDesWnd = GetDesktopWindow(); if( pDesWnd ) { pDesWnd->GetWindowRect(rcDes); } m_pParentWnd->GetWindowRect(rect); this->GetWindowRect(rcThis); if( rect.right + rcThis.Width() > rcDes.right ) rect.right = rcDes.right - rcThis.Width(); this->SetWindowPos(NULL,rect.right,rcThis.top,0,0,SWP_NOSIZE); } //m_pParentWnd->SetFocus(); } else { CExpression* pExpression = (CExpression*)dwData; ExpPropery NameProp; NameProp.m_dExpType = pExpression->GetExpressType(); NameProp.m_strName.Format("%s", pExpression->GetName()); NameProp.m_strDescribe.Format("%s", pExpression->GetDescribe()); NameProp.m_bStyle = pExpression->GetStyle(); if ( g_pFormulaMan ) g_pFormulaMan->SendLinkMsg(DiagramMsg_FormulaParamChanged, (LPARAM)&NameProp); } *pResult = 0; }
long CDlgStrategyParamConf::LoadCurExp(WPARAM wParam /*= 0*/, LPARAM lParam /*= 0*/) { m_sSingleSel.m_nType = hx_DefMaxValues; CDlgFormulaMan* pParentDlg = (CDlgFormulaMan*)AfxGetMainWnd(); if( pParentDlg == NULL ) return 0; EnableItem(FALSE); if( wParam == CTreeCtrlFormula::YlsBrowser ) { if(m_nType == 1) { CTreeGroup* pTreeGroup = (CTreeGroup*)lParam; // CString strItem = *(CString*)lParam; /* if( !strItem.CompareNoCase(CTreeCtrlFormula::g_strUnionCondition) ) { m_sSingleSel.m_nType = CExpression::Union; m_sSingleSel.m_strExp.Format("%s",CTreeCtrlFormula::g_strUnionCondition); m_wndPeriod.ShowWindow(SW_HIDE); m_wndPeriodStc.ShowWindow(SW_HIDE); m_wndConNotes.ShowWindow(SW_HIDE); m_wndCon.ShowWindow(SW_HIDE); m_wndStaticCon.ShowWindow(SW_HIDE); m_wndCompare.ShowWindow(SW_HIDE); m_wndData1.ShowWindow(SW_HIDE); m_wndAndOr.ShowWindow(SW_HIDE); m_wndData2.ShowWindow(SW_HIDE); m_wndMiddle.ShowWindow(SW_HIDE); }*/ // else if( !strItem.CompareNoCase(CTreeCtrlFormula::g_strJiben) ) /* else*/ if( pTreeGroup->m_dwID == CExpression::JiBenMian ) { m_sSingleSel.m_nType = CExpression::JiBenMian; m_sSingleSel.m_strExp.Format("%s",CTreeCtrlFormula::g_strJiben); m_wndPeriod.ShowWindow(SW_HIDE); #ifdef _ONLY_SUPPORT_DAYLINE m_wndPeriod.SetCurSel(0); #else m_wndPeriod.SetCurSel(5); #endif m_wndPeriodStc.ShowWindow(SW_HIDE); m_wndConNotes.ShowWindow(SW_SHOW); m_wndConNotes.SetWindowText(HS_LANGUAGE("财务指标")); m_wndCon.ShowWindow(SW_SHOW); m_wndStaticCon.ShowWindow(SW_SHOW); m_wndCompare.ShowWindow(SW_SHOW); m_wndData1.ShowWindow(SW_SHOW); m_wndAndOr.ShowWindow(SW_HIDE); m_wndData2.ShowWindow(SW_HIDE); m_wndMiddle.ShowWindow(SW_HIDE); m_wndData1.ResetContent(); m_wndData2.ResetContent(); m_wndCon.ResetContent(); CDlgCondition::InitCWData(&m_wndCon,YLS_GB_GUBEN_NAME); CDlgCondition::InitCWData(&m_wndCon,YLS_Cj_GUBEN_NAME); CDlgCondition::InitCondition(&m_wndCompare,4); } } } else if( wParam == CCompileEditView::UpdateExpress ) { CDlgFormulaEdit* pDlg = pParentDlg->GetExpDlg(); if( pDlg != NULL ) { if(pDlg->SendMessage(HX_USER_LOADCUR,wParam,lParam)) { pParentDlg->Enable(FALSE); pDlg->ShowWindowEx(SW_SHOWNORMAL); } } } else if( wParam == HX_EXPRESSSENTENCE ) { //EnableItem(FALSE); CExpression* pExpression = (CExpression*)lParam; if( pExpression == NULL ) return 0; // if(m_nType == 1) { m_sSingleSel.m_nType = pExpression->GetExpressType(); m_sSingleSel.m_strExp.Format("%s",pExpression->GetName()); CDlgCondition::InitCondition(&m_wndCompare,-1); switch ( m_sSingleSel.m_nType ) { case CExpression::Tech: { //"选出技术指标数值满足下列条件的股票:"); m_wndPeriod.ShowWindow(SW_SHOW); #ifdef _ONLY_SUPPORT_DAYLINE m_wndPeriod.SetCurSel(0); #else m_wndPeriod.SetCurSel(5); #endif m_wndPeriodStc.ShowWindow(SW_SHOW); m_wndConNotes.ShowWindow(SW_SHOW); m_wndConNotes.SetWindowText(HS_LANGUAGE("指标线")); m_wndCon.ShowWindow(SW_SHOW); m_wndCon.ResetContent(); m_wndStaticCon.ShowWindow(SW_SHOW); m_wndCompare.ShowWindow(SW_SHOW); m_wndData1.ShowWindow(SW_SHOW); CValue* valoare = NULL; if( CExpression::m_pExternExpression->Lookup(pExpression->GetName(),pExpression->GetExpressType(),valoare) ) // over { CExpValue* pExpValue = (CExpValue*)valoare; BOOL bFree = FALSE; CExpression* pCurExpression = pExpValue->GetExp(); if( pCurExpression && pCurExpression == pExpression ) { if( !pCurExpression->IsCompile() ) { if( !pCurExpression->Compile() ) { bFree = TRUE; } } CArray<CFormulaDrawParam*,CFormulaDrawParam*> ayDraw; CString strParam; int nCount = pCurExpression->GetDraw(strParam,ayDraw); CFormulaDrawParam* pParam; if( nCount > 0 ) { for(int i = 0; i < nCount; i++) { pParam = ayDraw.GetAt(i); if( nCount == 1 && CString(pParam->m_strName).IsEmpty() ) { m_wndCon.AddString(CTreeCtrlFormula::g_strFirstTechLine); } else { m_wndCon.AddString(pParam->m_strName); } delete pParam; } } else { m_wndCon.AddString(CTreeCtrlFormula::g_strFirstTechLine); } m_wndCon.SetCurSel(m_wndCon.GetCount()-1); OnSelchangeCompare(); } if( bFree ) { pExpValue->Free(); } } } break; case CExpression::Condition: { //"选出满足下列条件的股票:"); m_sSingleSel.m_SubData.m_cType = FormulaCompareSubData::Condition; m_wndPeriod.ShowWindow(SW_SHOW); #ifdef _ONLY_SUPPORT_DAYLINE m_wndPeriod.SetCurSel(0); #else m_wndPeriod.SetCurSel(5); #endif m_wndPeriodStc.ShowWindow(SW_SHOW); m_wndConNotes.ShowWindow(SW_HIDE); m_wndCon.ShowWindow(SW_HIDE); m_wndStaticCon.ShowWindow(SW_HIDE); m_wndCompare.ShowWindow(SW_HIDE); m_wndData1.ShowWindow(SW_HIDE); m_wndAndOr.ShowWindow(SW_HIDE); m_wndData2.ShowWindow(SW_HIDE); m_wndMiddle.ShowWindow(SW_HIDE); } break; case CExpression::Exchange: { //"选出交易系统发出以下信号的股票:"); m_sSingleSel.m_SubData.m_cType = FormulaCompareSubData::Exchange; m_wndPeriod.ShowWindow(SW_SHOW); #ifdef _ONLY_SUPPORT_DAYLINE m_wndPeriod.SetCurSel(0); #else m_wndPeriod.SetCurSel(5); #endif m_wndPeriodStc.ShowWindow(SW_SHOW); m_wndConNotes.ShowWindow(SW_HIDE); m_wndConNotes.SetWindowText(HS_LANGUAGE("发出")); m_wndCon.ShowWindow(SW_HIDE); m_wndStaticCon.ShowWindow(SW_HIDE); m_wndCompare.ShowWindow(SW_HIDE); m_wndData1.ShowWindow(SW_HIDE); m_wndAndOr.ShowWindow(SW_HIDE); m_wndData2.ShowWindow(SW_HIDE); m_wndMiddle.ShowWindow(SW_HIDE); } break; case CExpression::MoreKLine: { //"选出五彩K线发出指示的股票:"); m_sSingleSel.m_SubData.m_cType = FormulaCompareSubData::MoreKLine; m_wndPeriod.ShowWindow(SW_SHOW); #ifdef _ONLY_SUPPORT_DAYLINE m_wndPeriod.SetCurSel(0); #else m_wndPeriod.SetCurSel(5); #endif m_wndPeriodStc.ShowWindow(SW_SHOW); m_wndConNotes.ShowWindow(SW_HIDE); m_wndCon.ShowWindow(SW_HIDE); m_wndStaticCon.ShowWindow(SW_HIDE); m_wndCompare.ShowWindow(SW_HIDE); m_wndData1.ShowWindow(SW_HIDE); m_wndAndOr.ShowWindow(SW_HIDE); m_wndData2.ShowWindow(SW_HIDE); m_wndMiddle.ShowWindow(SW_HIDE); } break; } } // 注释/参数修改 // CWnd* pWnd = GetDlgItem(IDC_NOTES); // pWnd->ShowWindow(SW_SHOW); m_EditEidolon.ShowWindow(SW_SHOW); CDlgNotesAndEidolon* pDlgNotes = pParentDlg->GetDlgNotes(); CDlgNotesAndEidolon* pDlgParam = pParentDlg->GetDlgParam(); if( pDlgNotes != NULL && pDlgNotes->IsWindowVisible() ) { pDlgNotes->SetNotes(pExpression->GetNotes(), pExpression->GetName()); } if( m_EditEidolon.m_hWnd != NULL ) { CString strText; strText.Format("%s",pExpression->GetEidolon()); if( !strText.IsEmpty() ) { m_EditEidolon.SetText(strText,pExpression->GetParamVar(),FALSE); } else { CStringArray* pArray = pExpression->GetDefEidolon(); if(pArray->GetSize() <= 1) { pArray = NULL; } m_EditEidolon.SetText(pArray,pExpression->GetParamVar(),FALSE); } m_EditEidolon.Invalidate(); } } return 0; }
//查找线程处理函数 DWORD WINAPI CDlgFormulaFind::FindComp(LPVOID pParameter) { CDlgFormulaFind* pCompFind = (CDlgFormulaFind*)(pParameter); if( pCompFind == NULL) return 0; CWnd* pWnd = pCompFind->GetDlgItem(IDC_STARTBUTTON); if(pWnd != NULL) { pWnd->EnableWindow(false); } pWnd = pCompFind->GetDlgItem(IDC_STOPBUT); if(pWnd != NULL) { pWnd->EnableWindow(true); } pCompFind->m_wndAnimate.Play(0,-1,-1); CString strKey ; pCompFind->m_wndKeyCombo.GetWindowText(strKey); strKey.MakeUpper(); // DWORD dwFindMask = pCompFind->GetFindMask(); DWORD dwFindMask = pCompFind->m_nFindMask; if( dwFindMask == 0 ) return 0; CListCtrl* pListCtrl = &(pCompFind->m_wndResultList); if( pListCtrl == NULL) return 0; pListCtrl->DeleteAllItems(); CMapVariabile* pVarsMap = CDlgFormulaMan::m_pExternExpression; if(pVarsMap != NULL) { POSITION pos = pVarsMap->GetStartPosition(); pWnd = pCompFind->GetDlgItem(IDC_RESULTSTATIC); CString sName; CValue *pVal; while (pos != NULL && pCompFind->m_bThreadRun) { pVarsMap->GetNextAssoc (pos, sName, pVal); if(pVal != NULL) { if( pVal->IsStyle(HX_EXPRESSSENTENCE) ) { CString strFindText = _T("正在查找 --"); strFindText += ((CExpValue*)pVal)->GetWholeName(); pWnd->SetWindowText( strFindText); CString strRet; if( ((CExpValue*)pVal)->Find(strKey,strRet,dwFindMask) ) { int nCount = pListCtrl->GetItemCount(); CString strText; strText.Format(TEXT("%d"), nCount+1); // Insert the item, select every other item. CExpression* pExpression = ((CExpValue*)pVal)->GetExp(); if(pExpression ) { DWORD dwMask = (DWORD)pExpression->GetExpressType(); dwMask &= 0xf; if ((pCompFind->m_dwMask & dwMask) == 0) { continue; } pListCtrl->InsertItem( LVIF_TEXT|LVIF_STATE, nCount, strText, (nCount%2)==0 ? LVIS_SELECTED : 0, LVIS_SELECTED, 0, 0); pListCtrl->SetItemData(nCount,(DWORD)pExpression); int nNameIndex = strRet.Find(_T("公式全名")); int nDescrible = strRet.Find(_T("公式描述")); if( nDescrible - nNameIndex != 8) { CString strDescrible = strRet.Mid( nNameIndex+8,nDescrible-nNameIndex-8); pListCtrl->SetItemText(nCount, 2, strDescrible); } CString strWholeName = strRet.Left(nNameIndex); pListCtrl->SetItemText(nCount, 1, strWholeName.Mid(1,nNameIndex)); CString strGroup; switch( dwMask ) { case Tech : { strGroup = CTreeCtrlFormula::g_strTech; break; } case Exchange : { strGroup = CTreeCtrlFormula::g_strExchange; break; } case Condition : { strGroup = CTreeCtrlFormula::g_strCondition; break; } case MoreKLine : { strGroup = CTreeCtrlFormula::g_strColorKLine; break; } case Strategy : //20090302 YJT 增加 Strategy { strGroup = CTreeCtrlFormula::g_strStrategy; break; } default : { return 0; } } pListCtrl->SetItemText(nCount, 3, strGroup); } } } } } CString strFindText ; strFindText.Format(_T("找到 %d 个对象"),pListCtrl->GetItemCount()); pWnd->SetWindowText( strFindText); pWnd = pCompFind->GetDlgItem(IDC_STARTBUTTON); if(pWnd != NULL) { pWnd->EnableWindow(true); } pWnd = pCompFind->GetDlgItem(IDC_STOPBUT); if(pWnd != NULL) { pWnd->EnableWindow(false); } pCompFind->m_wndAnimate.Stop(); } return 0; }
long CCompileEditView::Compile(CDlgFormulaEdit* pDlg, LPARAM lParam /*= 0*/) { if(m_pListCtrl != NULL) { m_pListCtrl->DeleteAllItems(); } if( m_pParentDlg == NULL && pDlg != NULL ) { m_pParentDlg = pDlg; } if( pDlg == NULL ) return 0; this->SetFocus(); CString strValue; GetRichEditCtrl().GetWindowText(strValue); if(strValue.IsEmpty()) return -1; CString strName; CWnd* pNameEdit = pDlg->GetDlgItem(IDC_NAMEEDIT); // 名称 if( pNameEdit != NULL ) { pNameEdit->GetWindowText(strName); } if(strName.IsEmpty()) { MessageBox(_T("请输入名称!"),_T("提示"),MB_ICONINFORMATION); if(pNameEdit != NULL) { pNameEdit->SetFocus(); } return FALSE; } strName.TrimLeft(); strName.TrimRight(); strName.MakeUpper(); CValue* pValoare = NULL; if( pDlg->IsType(CDlgFormulaEdit::Update) ) { if( strName.CompareNoCase(pDlg->m_strOldName) && m_pExternExpression->Lookup(strName,pDlg->m_nExpressType,pValoare) ) { CString strPrompt; strPrompt.Format(_T("公式 \"%s\" 已经存在,请改名保存"),strName); MessageBox(strPrompt,_T("提示"),MB_ICONINFORMATION); pNameEdit->SetFocus(); ((CEdit*)pNameEdit)->SetSel(0,-1); return 0; } if( m_pExternExpression->Lookup(pDlg->m_strOldName,pDlg->m_nExpressType,pValoare) ) { } } else if ( m_pExternExpression->Lookup(strName,pDlg->m_nExpressType,pValoare) ) { if( pDlg->IsType(CDlgFormulaEdit::NewExp) ) { CString strPrompt; strPrompt.Format(_T("公式 \"%s\" 已经存在,请改名保存"),strName); MessageBox(strPrompt,_T("提示"),MB_ICONINFORMATION); pNameEdit->SetFocus(); ((CEdit*)pNameEdit)->SetSel(0,-1); return 0; } } CExpression* pExpresie = new CExpression(m_pExternExpression, m_pExternVariabile,m_pExternFunction); if( pDlg) { pDlg->AddToParamerList(pExpresie); } //CWnd* pPromptWnd = m_pParentDlg->GetDlgItem(IDC_PROMTEDIT); //CWnd* pBtError = m_pParentDlg->GetDlgItem(IDC_ERROR); CWnd* pPromptWnd = m_pParentDlg->m_pErrorDlg; CString strErroText; nodErrorInfo info(0,0,0,strName); int nErrorCount = pExpresie->ChangeExpression(strValue); if( nErrorCount == 0 ) { strErroText = _T("公式编译(测试)通过!"); CTreeCtrlFormula* pHxTreeCtrl = NULL; BOOL bAdd = FALSE; CExpValue* pValue = NULL; if(pValoare != NULL) { pValue = (CExpValue*)pValoare; CExpression* pOldExpress = pValue->GetExp(); if(pOldExpress != NULL) { pExpresie->SetExpressType(pDlg->m_nExpressType); //qinhn 20090729 Add 保证在修改编译公式时,其"常用指标"的属性不变 if (pOldExpress->IsStyle(HS_EXP_DEFAULT_TECH)) { pExpresie->AddStyle(HS_EXP_DEFAULT_TECH); } //qinhn 20090729 Add End } pValue->Clean(); if( pDlg->IsType(CDlgFormulaEdit::Update) && strName.CompareNoCase(pDlg->m_strOldName) ) { m_pExternExpression->RemoveKey(pDlg->m_strOldName,pDlg->m_nExpressType); bAdd = TRUE; } } else { pExpresie->SetExpressType(pDlg->m_nExpressType); } if(pValue == NULL) { pValue = new CExpValue; bAdd = TRUE; } pValue->SetValue(pExpresie); pExpresie->SetName(strName); //qinhn 20090727 modify 设置类型,只编译保存则类型不变 if (CDlgFormulaEdit::bNeedChangeStyle ) pExpresie->AddStyle( ((!pDlg->m_nMainChart)?HS_EXP_MAINCHART:HS_EXP_SUBCHART) ); else pExpresie->AddStyle(((!pDlg->m_CharType)?HS_EXP_MAINCHART:HS_EXP_SUBCHART)); pExpresie->AddStyle( HS_EXP_OUTTYPE(pDlg->m_dStyle) ); CDlgFormulaEdit::bNeedChangeStyle = false; //qinhn 20090717 modify End if( bAdd ) { m_pExternExpression->AddExpress(strName,pValue); } CString strText; CWnd* pWnd = pDlg->GetDlgItem(IDC_DESCRIBEEDIT); // 公式描述 if(pWnd != NULL) { pWnd->GetWindowText(strText); pExpresie->SetDescribe(strText); } pWnd = pDlg->GetDlgItem(IDC_PWDEDIT); // 密码 if(pWnd != NULL && !(pWnd->GetStyle() & WS_DISABLED) ) { pWnd->GetWindowText(strText); pExpresie->SetPWD(strText); } if(pDlg->m_pDlgNotes != NULL) // 注释 { strText = pDlg->m_pDlgNotes->GetText(); pExpresie->SetNotes(strText); } if( pDlg->m_pDlgEidolon ) // 参数精灵 { strText = pDlg->m_pDlgEidolon->GetText(); pExpresie->SetEidolon(strText); } if( m_pEstopPeriodDlg != NULL ) { *pExpresie->GetEstopPeriod() = m_pEstopPeriodDlg->GetEstopPeriod(); // 禁用周期 *pExpresie->GetDefaultPeriod() = m_pEstopPeriodDlg->GetDefaultPeriod(); // 缺省周期 } // 更新树 if( pDlg->m_pFormulaMan != NULL ) { pHxTreeCtrl = pDlg->m_pFormulaMan->GetCurTree((WORD)pDlg->m_nExpressType); if(pHxTreeCtrl != NULL) { //pExpresie->SetExpressType(pHxTreeCtrl->GetType()); if(pValoare != NULL) { //pHxTreeCtrl->UpdateTreeItemData(pValoare,pValue); } else { if(pDlg != NULL) { pDlg->SetTitle(pExpresie->GetExpressType(),strName); } pHxTreeCtrl->AddItem(strName,pValue,m_pExternExpression); if( pDlg->IsType(CDlgFormulaEdit::NewExp) ) { pDlg->m_strOldName = strName; pExpresie->AddStyle(HS_EXP_USEREDIT); pDlg->SetType(CDlgFormulaEdit::Update | pDlg->IsType(CDlgFormulaEdit::SpeedNew)); } } } } // 更新绘图窗口 ExpPropery NameProp; NameProp.m_dExpType = pExpresie->GetExpressType(); NameProp.m_strName.Format("%s", pExpresie->GetName()); NameProp.m_strDescribe.Format("%s", pExpresie->GetDescribe()); NameProp.m_bStyle = pExpresie->GetStyle(); if ( g_pFormulaMan ) g_pFormulaMan->SendLinkMsg(DiagramMsg_FormulaParamChanged,(LPARAM)&NameProp); if(pPromptWnd != NULL) { pPromptWnd->SendMessage(HX_USER_COMPILE_INFO,0,0); //pPromptWnd->SetWindowText(strErroText); } m_pParentDlg->ShowResult(CDlgFormulaEdit::CompileResult); ::SendMessage(g_hParentWnd,g_SendReLoadTabItemMsg,0,0); //qinhn 20090721 Add 重新载入T指标ab页,防止点修改公式对话框里面的"保存"后出错 return (long)pExpresie; } else { /*strErroText = "公式有几个错误!"; if(pBtError != NULL) { pBtError->EnableWindow(TRUE); } if(pPromptWnd != NULL) { pPromptWnd->SetWindowText(strErroText); }*/ //AddCompileInfotoList(11,(LPARAM)&info); m_pParentDlg->ShowResult(CDlgFormulaEdit::CompileResult); delete pExpresie; } return 0; }