Greater ease in porting to wxWidgets:

* Rename class CAutoFlagDialog to AutoFlagDialog
 * Don't allow public access to private data members anymore
 * Initialize private data members with constructor
 * Add public access, read-only, member functions for private data members
 * Upon initialization add button "handlers" to private pointers; rather than retrieving these pointers each time again
 * Use only one function OnRotate() rather than four functions OnRot0, OnRot90, OnRot180 and OnRot270 which all have the exact same definition

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@2205 4a71c877-e1ca-e34f-864e-861f7616d084
master
Giel van Schijndel 2007-07-26 14:12:20 +00:00
parent 80c4492003
commit 90ca240964
5 changed files with 282 additions and 189 deletions

View File

@ -250,7 +250,7 @@ SOURCE=.\wfview.cpp
# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" # PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd"
# Begin Source File # Begin Source File
SOURCE=.\autoflagdialog.h SOURCE=.\autoflagdialog.hpp
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -21,168 +21,224 @@
$Id$ $Id$
$HeadURL$ $HeadURL$
*/ */
// AutoFlagDialog.cpp : implementation file
//
#include "stdafx.h" #include "stdafx.h"
#include "btedit.h" #include "btedit.h"
#include "autoflagdialog.h" #include "autoflagdialog.hpp"
#ifdef _DEBUG #ifdef _DEBUG
#define new DEBUG_NEW #define new DEBUG_NEW
#endif #endif
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CAutoFlagDialog dialog // AutoFlagDialog dialog
CAutoFlagDialog::CAutoFlagDialog(CWnd* pParent /*=NULL*/) AutoFlagDialog::AutoFlagDialog(CWnd* parent,
: CDialog(CAutoFlagDialog::IDD, pParent) bool RandRotate,
bool RandXFlip,
bool RandYFlip,
bool XFlip,
bool YFlip,
unsigned int Rotate,
bool IncRotate,
bool ToggleXFlip,
bool ToggleYFlip) :
CDialog(AutoFlagDialog::IDD, parent),
_RandRotate(RandRotate),
_RandXFlip(RandXFlip),
_RandYFlip(RandYFlip),
_XFlip(XFlip),
_YFlip(YFlip),
_Rotate(Rotate),
_IncRotate(IncRotate),
_ToggleXFlip(ToggleXFlip),
_ToggleYFlip(ToggleYFlip)
{ {
//{{AFX_DATA_INIT(CAutoFlagDialog) //{{AFX_DATA_INIT(AutoFlagDialog)
//}}AFX_DATA_INIT //}}AFX_DATA_INIT
} }
bool AutoFlagDialog::RandRotate() const
{
return _RandRotate;
}
void CAutoFlagDialog::DoDataExchange(CDataExchange* pDX) bool AutoFlagDialog::RandXFlip() const
{
return _RandXFlip;
}
bool AutoFlagDialog::RandYFlip() const
{
return _RandYFlip;
}
bool AutoFlagDialog::XFlip() const
{
return _XFlip;
}
bool AutoFlagDialog::YFlip() const
{
return _YFlip;
}
unsigned int AutoFlagDialog::Rotate() const
{
return _Rotate;
}
bool AutoFlagDialog::IncRotate() const
{
return _IncRotate;
}
bool AutoFlagDialog::ToggleXFlip() const
{
return _ToggleXFlip;
}
bool AutoFlagDialog::ToggleYFlip() const
{
return _ToggleYFlip;
}
void AutoFlagDialog::DoDataExchange(CDataExchange* pDX)
{ {
CDialog::DoDataExchange(pDX); CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAutoFlagDialog) //{{AFX_DATA_MAP(AutoFlagDialog)
//}}AFX_DATA_MAP //}}AFX_DATA_MAP
} }
BEGIN_MESSAGE_MAP(AutoFlagDialog, CDialog)
BEGIN_MESSAGE_MAP(CAutoFlagDialog, CDialog) //{{AFX_MSG_MAP(AutoFlagDialog)
//{{AFX_MSG_MAP(CAutoFlagDialog) ON_BN_CLICKED(IDC_CHKRANDROTATE, OnRandRotate)
ON_BN_CLICKED(IDC_CHKRANDROTATE, OnChkrandrotate) ON_BN_CLICKED(IDC_CHKRANDXFLIP, OnRandXFlip)
ON_BN_CLICKED(IDC_CHKRANDXFLIP, OnChkrandxflip) ON_BN_CLICKED(IDC_CHKRANDYFLIP, OnRandYFlip)
ON_BN_CLICKED(IDC_CHKRANDYFLIP, OnChkrandyflip) ON_BN_CLICKED(IDC_ROT0, OnRotate)
ON_BN_CLICKED(IDC_ROT0, OnRot0) ON_BN_CLICKED(IDC_ROT180, OnRotate)
ON_BN_CLICKED(IDC_ROT180, OnRot180) ON_BN_CLICKED(IDC_ROT270, OnRotate)
ON_BN_CLICKED(IDC_ROT270, OnRot270) ON_BN_CLICKED(IDC_ROT90, OnRotate)
ON_BN_CLICKED(IDC_ROT90, OnRot90) ON_BN_CLICKED(IDC_XFLIP, OnXFlip)
ON_BN_CLICKED(IDC_XFLIP, OnXflip) ON_BN_CLICKED(IDC_YFLIP, OnYFlip)
ON_BN_CLICKED(IDC_YFLIP, OnYflip)
//}}AFX_MSG_MAP //}}AFX_MSG_MAP
END_MESSAGE_MAP() END_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
// CAutoFlagDialog message handlers // AutoFlagDialog message handlers
//int GetCheck( ) const; BOOL AutoFlagDialog::OnInitDialog()
BOOL CAutoFlagDialog::OnInitDialog()
{ {
CDialog::OnInitDialog(); CDialog::OnInitDialog();
// ((CButton*)GetDlgItem(IDC_CHKINCROTATE))->SetCheck(m_IncRotate); Degree0_RadioButton = (CButton*)GetDlgItem(IDC_ROT0);
// ((CButton*)GetDlgItem(IDC_CHKTOGXFLIP))->SetCheck(m_TogXFlip); Degree90_RadioButton = (CButton*)GetDlgItem(IDC_ROT90);
// ((CButton*)GetDlgItem(IDC_CHKTOGYFLIP))->SetCheck(m_TogYFlip); Degree180_RadioButton = (CButton*)GetDlgItem(IDC_ROT180);
((CButton*)GetDlgItem(IDC_XFLIP))->SetCheck(m_XFlip); Degree270_RadioButton = (CButton*)GetDlgItem(IDC_ROT270);
((CButton*)GetDlgItem(IDC_YFLIP))->SetCheck(m_YFlip); XFlip_CheckBox = (CButton*)GetDlgItem(IDC_XFLIP);
((CButton*)GetDlgItem(IDC_CHKRANDROTATE))->SetCheck(m_RandRotate); YFlip_CheckBox = (CButton*)GetDlgItem(IDC_YFLIP);
((CButton*)GetDlgItem(IDC_CHKRANDXFLIP))->SetCheck(m_RandXFlip); RandRotate_CheckBox = (CButton*)GetDlgItem(IDC_CHKRANDROTATE);
((CButton*)GetDlgItem(IDC_CHKRANDYFLIP))->SetCheck(m_RandYFlip); RandXFlip_CheckBox = (CButton*)GetDlgItem(IDC_CHKRANDXFLIP);
RandYFlip_CheckBox = (CButton*)GetDlgItem(IDC_CHKRANDYFLIP);
//IncrementRotate_CheckBox = (CButton*)GetDlgItem(IDC_CHKINCROTATE);
//ToggleXFlip_CheckBox = (CButton*)GetDlgItem(IDC_CHKTOGXFLIP);
//ToggleYFlip_CheckBox = (CButton*)GetDlgItem(IDC_CHKTOGYFLIP);
if(m_RandRotate == FALSE) { // IncrementRotate_CheckBox->setCheck(_IncRotate);
switch(m_Rotate) { // ToggleXFlip_CheckBox->setCheck(_ToggleXFlip);
// ToggleYFlip_CheckBox->setCheck(_ToggleYFlip);
XFlip_CheckBox->SetCheck(_XFlip);
YFlip_CheckBox->SetCheck(_YFlip);
RandRotate_CheckBox->SetCheck(_RandRotate);
RandXFlip_CheckBox->SetCheck(_RandXFlip);
RandYFlip_CheckBox->SetCheck(_RandYFlip);
if(!_RandRotate)
{
switch(_Rotate)
{
case 0: case 0:
((CButton*)GetDlgItem(IDC_ROT0))->SetCheck(1); Degree0_RadioButton->SetCheck(1);
break; break;
case 1: case 1:
((CButton*)GetDlgItem(IDC_ROT90))->SetCheck(1); Degree90_RadioButton->SetCheck(1);
break; break;
case 2: case 2:
((CButton*)GetDlgItem(IDC_ROT180))->SetCheck(1); Degree180_RadioButton->SetCheck(1);
break; break;
case 3: case 3:
((CButton*)GetDlgItem(IDC_ROT270))->SetCheck(1); Degree270_RadioButton->SetCheck(1);
break; break;
} }
} else { }
((CButton*)GetDlgItem(IDC_ROT0))->SetCheck(0); else
((CButton*)GetDlgItem(IDC_ROT90))->SetCheck(0); {
((CButton*)GetDlgItem(IDC_ROT180))->SetCheck(0); Degree0_RadioButton->SetCheck(0);
((CButton*)GetDlgItem(IDC_ROT270))->SetCheck(0); Degree90_RadioButton->SetCheck(0);
Degree180_RadioButton->SetCheck(0);
Degree270_RadioButton->SetCheck(0);
} }
return TRUE; // return TRUE unless you set the focus to a control return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE // EXCEPTION: OCX Property Pages should return FALSE
} }
void CAutoFlagDialog::OnOK() void AutoFlagDialog::OnOK()
{ {
m_IncRotate = 0; //((CButton*)GetDlgItem(IDC_CHKINCROTATE))->GetCheck(); _IncRotate = false; //IncrementRotate_CheckBox->GetCheck();
m_TogXFlip = 0; //((CButton*)GetDlgItem(IDC_CHKTOGXFLIP))->GetCheck(); _ToggleXFlip = false; //ToggleXFlip_CheckBox->GetCheck();
m_TogYFlip = 0; //((CButton*)GetDlgItem(IDC_CHKTOGYFLIP))->GetCheck(); _ToggleYFlip = false; //ToggleYFlip_CheckBox->GetCheck();
m_XFlip = ((CButton*)GetDlgItem(IDC_XFLIP))->GetCheck(); _XFlip = XFlip_CheckBox->GetCheck();
m_YFlip = ((CButton*)GetDlgItem(IDC_YFLIP))->GetCheck(); _YFlip = XFlip_CheckBox->GetCheck();
m_RandRotate = ((CButton*)GetDlgItem(IDC_CHKRANDROTATE))->GetCheck(); _RandRotate = RandRotate_CheckBox->GetCheck();
m_RandXFlip = ((CButton*)GetDlgItem(IDC_CHKRANDXFLIP))->GetCheck(); _RandXFlip = RandXFlip_CheckBox->GetCheck();
m_RandYFlip = ((CButton*)GetDlgItem(IDC_CHKRANDYFLIP))->GetCheck(); _RandYFlip = RandYFlip_CheckBox->GetCheck();
if(((CButton*)GetDlgItem(IDC_ROT0))->GetCheck()) {
m_Rotate = 0;
} else if(((CButton*)GetDlgItem(IDC_ROT90))->GetCheck()) {
m_Rotate = 1;
} else if(((CButton*)GetDlgItem(IDC_ROT180))->GetCheck()) {
m_Rotate = 2;
} else if(((CButton*)GetDlgItem(IDC_ROT270))->GetCheck()) {
m_Rotate = 3;
}
if (Degree0_RadioButton->GetCheck())
_Rotate = 0;
else if (Degree90_RadioButton->GetCheck())
_Rotate = 1;
else if (Degree180_RadioButton->GetCheck())
_Rotate = 2;
else if (Degree270_RadioButton->GetCheck())
_Rotate = 3;
CDialog::OnOK(); CDialog::OnOK();
} }
void CAutoFlagDialog::OnChkrandrotate() void AutoFlagDialog::OnRandRotate()
{ {
((CButton*)GetDlgItem(IDC_ROT0))->SetCheck( 0 ); Degree0_RadioButton->SetCheck(0);
((CButton*)GetDlgItem(IDC_ROT90))->SetCheck( 0 ); Degree90_RadioButton->SetCheck(0);
((CButton*)GetDlgItem(IDC_ROT180))->SetCheck( 0 ); Degree180_RadioButton->SetCheck(0);
((CButton*)GetDlgItem(IDC_ROT270))->SetCheck( 0 ); Degree270_RadioButton->SetCheck(0);
} }
void CAutoFlagDialog::OnChkrandxflip() void AutoFlagDialog::OnRandXFlip()
{ {
((CButton*)GetDlgItem(IDC_XFLIP))->SetCheck( 0 ); XFlip_CheckBox->SetCheck(0);
} }
void CAutoFlagDialog::OnChkrandyflip() void AutoFlagDialog::OnRandYFlip()
{ {
((CButton*)GetDlgItem(IDC_YFLIP))->SetCheck( 0 ); YFlip_CheckBox->SetCheck(0);
} }
void AutoFlagDialog::OnRotate()
void CAutoFlagDialog::OnRot0()
{ {
((CButton*)GetDlgItem(IDC_CHKRANDROTATE))->SetCheck( 0 ); RandRotate_CheckBox->SetCheck(0);
} }
void CAutoFlagDialog::OnRot180() void AutoFlagDialog::OnXFlip()
{ {
((CButton*)GetDlgItem(IDC_CHKRANDROTATE))->SetCheck( 0 ); RandXFlip_CheckBox->SetCheck(0);
} }
void CAutoFlagDialog::OnRot270() void AutoFlagDialog::OnYFlip()
{ {
((CButton*)GetDlgItem(IDC_CHKRANDROTATE))->SetCheck( 0 ); RandYFlip_CheckBox->SetCheck(0);
}
void CAutoFlagDialog::OnRot90()
{
((CButton*)GetDlgItem(IDC_CHKRANDROTATE))->SetCheck( 0 );
}
void CAutoFlagDialog::OnXflip()
{
((CButton*)GetDlgItem(IDC_CHKRANDXFLIP))->SetCheck( 0 );
}
void CAutoFlagDialog::OnYflip()
{
((CButton*)GetDlgItem(IDC_CHKRANDYFLIP))->SetCheck( 0 );
} }

View File

@ -1,76 +0,0 @@
/*
This file is part of Warzone 2100.
Copyright (C) 1999-2004 Eidos Interactive
Copyright (C) 2005-2007 Warzone Resurrection Project
Warzone 2100 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Warzone 2100 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Warzone 2100; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
$Revision$
$Id$
$HeadURL$
*/
// AutoFlagDialog.h : header file
//
/////////////////////////////////////////////////////////////////////////////
// CAutoFlagDialog dialog
class CAutoFlagDialog : public CDialog
{
// Construction
public:
CAutoFlagDialog(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CAutoFlagDialog)
enum { IDD = IDD_AUTOFLAGDIALOG };
//}}AFX_DATA
BOOL m_IncRotate;
BOOL m_TogXFlip;
BOOL m_TogYFlip;
BOOL m_RandRotate;
BOOL m_RandXFlip;
BOOL m_RandYFlip;
BOOL m_XFlip;
BOOL m_YFlip;
int m_Rotate;
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAutoFlagDialog)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CAutoFlagDialog)
virtual BOOL OnInitDialog();
virtual void OnOK();
afx_msg void OnChkrandrotate();
afx_msg void OnChkrandxflip();
afx_msg void OnChkrandyflip();
afx_msg void OnRot0();
afx_msg void OnRot180();
afx_msg void OnRot270();
afx_msg void OnRot90();
afx_msg void OnXflip();
afx_msg void OnYflip();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};

View File

@ -0,0 +1,111 @@
/*
This file is part of Warzone 2100.
Copyright (C) 1999-2004 Eidos Interactive
Copyright (C) 2005-2007 Warzone Resurrection Project
Warzone 2100 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
Warzone 2100 is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Warzone 2100; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
$Revision$
$Id$
$HeadURL$
*/
#ifndef __INCLUDE_AUTOFLAGDIALOG_HPP__
#define __INCLUDE_AUTOFLAGDIALOG_HPP__
/////////////////////////////////////////////////////////////////////////////
// AutoFlagDialog dialog
class AutoFlagDialog : public CDialog
{
public:
// Construction
AutoFlagDialog(CWnd* parent = NULL,
bool RandRotate = false,
bool RandXFlip = false,
bool RandYFlip = false,
bool XFlip = false,
bool YFlip = false,
unsigned int Rotate = 0,
bool IncRotate = false,
bool ToggleXFlip = false,
bool ToggleYFlip = false);
bool RandRotate() const;
bool RandXFlip() const;
bool RandYFlip() const;
bool XFlip() const;
bool YFlip() const;
unsigned int Rotate() const;
bool IncRotate() const;
bool ToggleXFlip() const;
bool ToggleYFlip() const;
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAutoFlagDialog)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
private:
// Generated message map functions
//{{AFX_MSG(CAutoFlagDialog)
virtual BOOL OnInitDialog();
virtual void OnOK();
afx_msg void OnRandRotate();
afx_msg void OnRandXFlip();
afx_msg void OnRandYFlip();
afx_msg void OnRotate();
afx_msg void OnXFlip();
afx_msg void OnYFlip();
//}}AFX_MSG
CButton* Degree0_RadioButton;
CButton* Degree90_RadioButton;
CButton* Degree180_RadioButton;
CButton* Degree270_RadioButton;
CButton* XFlip_CheckBox;
CButton* YFlip_CheckBox;
CButton* RandRotate_CheckBox;
CButton* RandXFlip_CheckBox;
CButton* RandYFlip_CheckBox;
// CButton* IncrementRotate_CheckBox;
// CButton* ToggleXFlip_CheckBox;
// CButton* ToggleYFlip_CheckBox;
private:
DECLARE_MESSAGE_MAP();
private:
// Dialog Data
//{{AFX_DATA(CAutoFlagDialog)
enum { IDD = IDD_AUTOFLAGDIALOG };
//}}AFX_DATA
bool _RandRotate;
bool _RandXFlip;
bool _RandYFlip;
bool _XFlip;
bool _YFlip;
unsigned int _Rotate;
bool _IncRotate;
bool _ToggleXFlip;
bool _ToggleYFlip;
};
#endif // __INCLUDE_AUTOFLAGDIALOG_HPP__

View File

@ -29,7 +29,7 @@
#include "bteditdoc.h" #include "bteditdoc.h"
#include "textureview.h" #include "textureview.h"
#include "tiletypes.h" #include "tiletypes.h"
#include "autoflagdialog.h" #include "autoflagdialog.hpp"
#include "debugprint.hpp" #include "debugprint.hpp"
#ifdef _DEBUG #ifdef _DEBUG
@ -739,23 +739,25 @@ void CTextureView::OnLButtonDblClk(UINT nFlags, CPoint point)
DebugPrint("Double clicked on tile %d\n",Selected); DebugPrint("Double clicked on tile %d\n",Selected);
CAutoFlagDialog Dlg; AutoFlagDialog Dlg(NULL,
Dlg.m_IncRotate = Selector->GetTextureFlags(Selected) & SF_INCTEXTUREROTATE; Selector->GetTextureFlags(Selected) & SF_RANDTEXTUREROTATE,
Dlg.m_TogXFlip = Selector->GetTextureFlags(Selected) & SF_TOGTEXTUREFLIPX; Selector->GetTextureFlags(Selected) & SF_RANDTEXTUREFLIPX,
Dlg.m_TogYFlip = Selector->GetTextureFlags(Selected) & SF_TOGTEXTUREFLIPY; Selector->GetTextureFlags(Selected) & SF_RANDTEXTUREFLIPY,
Dlg.m_RandRotate = Selector->GetTextureFlags(Selected) & SF_RANDTEXTUREROTATE; Selector->GetTextureFlags(Selected) & SF_TEXTUREFLIPX,
Dlg.m_RandXFlip = Selector->GetTextureFlags(Selected) & SF_RANDTEXTUREFLIPX; Selector->GetTextureFlags(Selected) & SF_TEXTUREFLIPY,
Dlg.m_RandYFlip = Selector->GetTextureFlags(Selected) & SF_RANDTEXTUREFLIPY; Selector->GetTextureRotate(Selected),
Dlg.m_Rotate = Selector->GetTextureRotate(Selected); Selector->GetTextureFlags(Selected) & SF_INCTEXTUREROTATE,
Dlg.m_XFlip = Selector->GetTextureFlags(Selected) & SF_TEXTUREFLIPX; Selector->GetTextureFlags(Selected) & SF_TOGTEXTUREFLIPX,
Dlg.m_YFlip = Selector->GetTextureFlags(Selected) & SF_TEXTUREFLIPY; Selector->GetTextureFlags(Selected) & SF_TOGTEXTUREFLIPY);
if(Dlg.DoModal() == IDOK) {
Selector->SetTextureRotate(Selected,Dlg.m_Rotate); if(Dlg.DoModal() == IDOK)
Selector->SetTextureFlip(Selected,Dlg.m_XFlip,Dlg.m_YFlip); {
Selector->SetTextureRandomFlip(Selected,Dlg.m_RandXFlip,Dlg.m_RandYFlip); Selector->SetTextureRotate(Selected, Dlg.Rotate());
Selector->SetTextureToggleFlip(Selected,Dlg.m_TogXFlip,Dlg.m_TogYFlip); Selector->SetTextureFlip(Selected, Dlg.XFlip(), Dlg.YFlip());
Selector->SetTextureRandomRotate(Selected,Dlg.m_RandRotate); Selector->SetTextureRandomFlip(Selected, Dlg.RandXFlip(), Dlg.RandYFlip());
Selector->SetTextureIncrementRotate(Selected,Dlg.m_IncRotate); Selector->SetTextureToggleFlip(Selected, Dlg.ToggleXFlip(), Dlg.ToggleYFlip());
Selector->SetTextureRandomRotate(Selected, Dlg.RandRotate());
Selector->SetTextureIncrementRotate(Selected, Dlg.IncRotate());
pDoc->SelectTexture(SelX,SelY); pDoc->SelectTexture(SelX,SelY);
InvalidateRect(NULL,NULL); InvalidateRect(NULL,NULL);
} }