|
|
@ -1,192 +1,135 @@ |
|
|
#include "numkeydia.h" |
|
|
#include "numkeydia.h" |
|
|
#include "ui_numkeydia.h" |
|
|
#include "ui_numkeydia.h" |
|
|
#include <QMouseEvent> |
|
|
|
|
|
#include <QDebug> |
|
|
#include <QDebug> |
|
|
#include <QMessageBox> |
|
|
#include <QFile> |
|
|
|
|
|
#include <QMouseEvent> |
|
|
|
|
|
#include <QPushButton> |
|
|
|
|
|
#include <QShortcut> |
|
|
|
|
|
#include <QTextStream> |
|
|
|
|
|
#include <QtGlobal> |
|
|
|
|
|
|
|
|
|
|
|
namespace |
|
|
|
|
|
{ |
|
|
|
|
|
void loadKeyboardStyleSheet(QWidget *widget) |
|
|
|
|
|
{ |
|
|
|
|
|
if(!widget) |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QFile file(QStringLiteral(":/commonWidget.qss")); |
|
|
|
|
|
if(!file.open(QFile::ReadOnly | QFile::Text)) |
|
|
|
|
|
{ |
|
|
|
|
|
qDebug() << QStringLiteral("Unable to load keyboard stylesheet"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
QTextStream stream(&file); |
|
|
|
|
|
widget->setStyleSheet(stream.readAll()); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
NumKeyDia *NumKeyDia::singleton = nullptr; |
|
|
|
|
|
|
|
|
NumKeyDia::NumKeyDia(QWidget *parent) : |
|
|
NumKeyDia::NumKeyDia(QWidget *parent) : |
|
|
QDialog(parent), |
|
|
QDialog(parent), |
|
|
ui(new Ui::NumKeyDia) |
|
|
ui(new Ui::NumKeyDia) |
|
|
{ |
|
|
{ |
|
|
|
|
|
loadKeyboardStyleSheet(this); |
|
|
|
|
|
if(singleton != nullptr) |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
singleton = this; |
|
|
ui->setupUi(this); |
|
|
ui->setupUi(this); |
|
|
this->setWindowFlag(Qt::FramelessWindowHint); |
|
|
this->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint); |
|
|
ui->lineEdit_input->setCursorPosition(Qt::StrongFocus); |
|
|
ui->lineEdit_input->setFocusPolicy(Qt::StrongFocus); |
|
|
auto _btnInputList = ui->widget_input->findChildren<QPushButton *>(); |
|
|
auto _btnInputList = ui->widget_input->findChildren<QPushButton *>(); |
|
|
foreach (auto &i, _btnInputList) |
|
|
foreach (auto &i, _btnInputList) |
|
|
{ |
|
|
{ |
|
|
connect(i, &QPushButton::clicked, this, &NumKeyDia::btn_input_clicked); |
|
|
connect(i, &QPushButton::clicked, this, &NumKeyDia::btn_input_clicked); |
|
|
i->setFocusPolicy(Qt::NoFocus); |
|
|
i->setFocusPolicy(Qt::NoFocus); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
auto *returnShortcut = new QShortcut(QKeySequence(Qt::Key_Return), this); |
|
|
|
|
|
connect(returnShortcut, &QShortcut::activated, this, &NumKeyDia::on_btn_ok_clicked); |
|
|
|
|
|
|
|
|
|
|
|
auto *enterShortcut = new QShortcut(QKeySequence(Qt::Key_Enter), this); |
|
|
|
|
|
connect(enterShortcut, &QShortcut::activated, this, &NumKeyDia::on_btn_ok_clicked); |
|
|
|
|
|
|
|
|
ui->toolButton_ico->installEventFilter(this); |
|
|
ui->toolButton_ico->installEventFilter(this); |
|
|
ui->label_appInfo->installEventFilter(this); |
|
|
ui->label_appInfo->installEventFilter(this); |
|
|
|
|
|
ui->btn_clear->setText(QStringLiteral("<")); |
|
|
|
|
|
setInputPage(InputPage::NumberPage); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
NumKeyDia::~NumKeyDia() |
|
|
NumKeyDia::~NumKeyDia() |
|
|
{ |
|
|
{ |
|
|
|
|
|
if(singleton == this) |
|
|
|
|
|
{ |
|
|
|
|
|
singleton = nullptr; |
|
|
|
|
|
} |
|
|
delete ui; |
|
|
delete ui; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
bool NumKeyDia::eventFilter(QObject *, QEvent *event) |
|
|
bool NumKeyDia::eventFilter(QObject *, QEvent *event) |
|
|
{ |
|
|
{ |
|
|
if(event->type() == QEvent::MouseButtonDblClick) |
|
|
if(event->type() == QEvent::MouseButtonPress) |
|
|
{ |
|
|
|
|
|
if(!m_bMaxFlag) |
|
|
|
|
|
{ |
|
|
{ |
|
|
this->showFullScreen(); |
|
|
auto *mouseEvent = static_cast<QMouseEvent *>(event); |
|
|
m_bMaxFlag = true; |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
this->showNormal(); |
|
|
|
|
|
m_bMaxFlag = false; |
|
|
|
|
|
} |
|
|
|
|
|
return true; |
|
|
|
|
|
} |
|
|
|
|
|
else if(event->type() == QEvent::MouseButtonPress) |
|
|
|
|
|
{ |
|
|
|
|
|
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); |
|
|
|
|
|
m_point = mouseEvent->globalPos() - frameGeometry().topLeft(); |
|
|
m_point = mouseEvent->globalPos() - frameGeometry().topLeft(); |
|
|
//鼠标位置减去左上角的左边
|
|
|
|
|
|
} |
|
|
} |
|
|
else if(event->type() == QEvent::MouseMove) |
|
|
else if(event->type() == QEvent::MouseMove) |
|
|
{ |
|
|
{ |
|
|
QMouseEvent *mouseEvent = static_cast<QMouseEvent *>(event); |
|
|
auto *mouseEvent = static_cast<QMouseEvent *>(event); |
|
|
move(mouseEvent->globalPos() - m_point); |
|
|
move(mouseEvent->globalPos() - m_point); |
|
|
} |
|
|
} |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
QLineEdit *NumKeyDia::pLineEdit() const |
|
|
void NumKeyDia::setValue(const QString &value) |
|
|
{ |
|
|
{ |
|
|
return m_pLineEdit; |
|
|
this->value = value; |
|
|
} |
|
|
setInputPage(InputPage::NumberPage); |
|
|
|
|
|
|
|
|
void NumKeyDia::setPLineEdit(QLineEdit *newPLineEdit) |
|
|
|
|
|
{ |
|
|
|
|
|
m_pLineEdit = newPLineEdit; |
|
|
|
|
|
QString _text = m_pLineEdit->text(); |
|
|
|
|
|
// int _cnt = _text.count();
|
|
|
|
|
|
// for(int i = 0; i < _cnt; ++i)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// if(_text.at(0) != "1" && _text.at(0) != "2" && _text.at(0) != "3" && _text.at(0) != "4" &&
|
|
|
|
|
|
// _text.at(0) != "5" && _text.at(0) != "6" && _text.at(0) != "7" && _text.at(0) != "8" && _text.at(0) != "9")
|
|
|
|
|
|
// {
|
|
|
|
|
|
// _text.remove(0, 1);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// }
|
|
|
|
|
|
ui->lineEdit_input->setFocus(); |
|
|
ui->lineEdit_input->setFocus(); |
|
|
ui->lineEdit_input->setText(_text); |
|
|
ui->lineEdit_input->setText(value); |
|
|
newPLineEdit->setEnabled(false); |
|
|
ui->lineEdit_input->setCursorPosition(ui->lineEdit_input->text().size()); |
|
|
|
|
|
|
|
|
m_firstInputFlag = true; |
|
|
m_firstInputFlag = true; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
ui->label_3->setText(m_pLineEdit->property("Name").toString() + ": "); |
|
|
QString &NumKeyDia::getValue() |
|
|
|
|
|
{ |
|
|
//最大值和最小值显示
|
|
|
return value; |
|
|
m_isNum = m_pLineEdit->property("IsNum").toBool(); |
|
|
|
|
|
if(!m_isNum) |
|
|
|
|
|
{ |
|
|
|
|
|
ui->label_min->setText(tr("no limit")); |
|
|
|
|
|
ui->label_max->setText(tr("no limit")); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
m_minValue = m_pLineEdit->property("Min").toDouble(); |
|
|
|
|
|
m_maxValue = m_pLineEdit->property("Max").toDouble(); |
|
|
|
|
|
|
|
|
|
|
|
m_isDouble = m_pLineEdit->property("IsDouble").toBool(); |
|
|
|
|
|
|
|
|
|
|
|
if(m_isDouble) |
|
|
|
|
|
{ |
|
|
|
|
|
m_format = m_pLineEdit->property("Format").toInt(); |
|
|
|
|
|
m_prec = m_pLineEdit->property("Prec").toInt(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(m_minValue == m_maxValue) |
|
|
|
|
|
{ |
|
|
|
|
|
ui->label_min->setText(tr("no limit")); |
|
|
|
|
|
ui->label_max->setText(tr("no limit")); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
if(m_isDouble) |
|
|
|
|
|
{ |
|
|
|
|
|
ui->label_max->setText(QString::number(m_maxValue, m_format, m_prec)); |
|
|
|
|
|
ui->label_min->setText(QString::number(m_minValue, m_format, m_prec)); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
ui->label_max->setText(QString::number(m_maxValue, 10, 0)); |
|
|
|
|
|
ui->label_min->setText(QString::number(m_minValue, 10, 0)); |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void NumKeyDia::on_btn_ok_clicked() |
|
|
void NumKeyDia::on_btn_ok_clicked() |
|
|
{ |
|
|
{ |
|
|
if(!m_pLineEdit) |
|
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
|
|
//如果输入为空,那么设为0
|
|
|
|
|
|
QString _res = ui->lineEdit_input->text(); |
|
|
QString _res = ui->lineEdit_input->text(); |
|
|
if(_res == "") |
|
|
if(_res.isEmpty()) |
|
|
_res = "0"; |
|
|
|
|
|
|
|
|
|
|
|
//不是数字,直接设置后返回
|
|
|
|
|
|
if(!m_isNum) |
|
|
|
|
|
{ |
|
|
|
|
|
m_pLineEdit->setText(_res); |
|
|
|
|
|
} |
|
|
|
|
|
else |
|
|
|
|
|
{ |
|
|
|
|
|
bool ok; |
|
|
|
|
|
double _d = ui->lineEdit_input->text().toDouble(&ok); |
|
|
|
|
|
|
|
|
|
|
|
if(!ok) |
|
|
|
|
|
{ |
|
|
|
|
|
QMessageBox::critical(this, "error", "Input is not a number!\nPlease reInput"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool _isNotValid = false; |
|
|
|
|
|
if(m_minValue < m_maxValue) |
|
|
|
|
|
{ |
|
|
{ |
|
|
// _d = (_d < m_minValue) ? m_minValue : _d;
|
|
|
_res = QStringLiteral("0"); |
|
|
// _d = (_d > m_maxValue) ? m_maxValue : _d;
|
|
|
|
|
|
if(_d < m_minValue || _d > m_maxValue) |
|
|
|
|
|
_isNotValid = true; |
|
|
|
|
|
} |
|
|
|
|
|
if(_isNotValid) |
|
|
|
|
|
{ |
|
|
|
|
|
QMessageBox::critical(this, "error", "Input is not valid!\nPlease reInput"); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if(m_isDouble) |
|
|
value = _res; |
|
|
m_pLineEdit->setText(QString::number(_d, m_format, m_prec)); |
|
|
|
|
|
else |
|
|
|
|
|
m_pLineEdit->setText(QString::number(_d, 10, 0)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
closeKeyBoard(); |
|
|
closeKeyBoard(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void NumKeyDia::on_btn_cancel_clicked() |
|
|
void NumKeyDia::on_btn_cancel_clicked() |
|
|
{ |
|
|
{ |
|
|
//取消,关闭数字键盘
|
|
|
|
|
|
closeKeyBoard(); |
|
|
closeKeyBoard(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void NumKeyDia::on_btn_clear_clicked() |
|
|
void NumKeyDia::on_btn_clear_clicked() |
|
|
{ |
|
|
{ |
|
|
//清空
|
|
|
m_firstInputFlag = false; |
|
|
ui->lineEdit_input->clear(); |
|
|
const int currentPosition = ui->lineEdit_input->cursorPosition(); |
|
|
|
|
|
ui->lineEdit_input->setCursorPosition(qMax(0, currentPosition - 1)); |
|
|
ui->lineEdit_input->setFocus(); |
|
|
ui->lineEdit_input->setFocus(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void NumKeyDia::on_btn_back_clicked() |
|
|
void NumKeyDia::on_btn_back_clicked() |
|
|
{ |
|
|
{ |
|
|
m_firstInputFlag = false; |
|
|
m_firstInputFlag = false; |
|
|
@ -194,51 +137,127 @@ void NumKeyDia::on_btn_back_clicked() |
|
|
int _index = ui->lineEdit_input->cursorPosition(); |
|
|
int _index = ui->lineEdit_input->cursorPosition(); |
|
|
QString _currentText = ui->lineEdit_input->text(); |
|
|
QString _currentText = ui->lineEdit_input->text(); |
|
|
|
|
|
|
|
|
if(_currentText == "") |
|
|
if(_currentText.isEmpty()) |
|
|
|
|
|
{ |
|
|
ui->lineEdit_input->setFocus(); |
|
|
ui->lineEdit_input->setFocus(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
//当前光标在最前面,不做任何处理
|
|
|
|
|
|
if(_index != 0) |
|
|
if(_index != 0) |
|
|
{ |
|
|
{ |
|
|
//删除前一个字符
|
|
|
|
|
|
_currentText.remove(_index - 1, 1); |
|
|
_currentText.remove(_index - 1, 1); |
|
|
ui->lineEdit_input->setText(_currentText); |
|
|
ui->lineEdit_input->setText(_currentText); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
ui->lineEdit_input->setFocus(); |
|
|
ui->lineEdit_input->setFocus(); |
|
|
ui->lineEdit_input->setCursorPosition(_index - 1); |
|
|
ui->lineEdit_input->setCursorPosition(qMax(0, _index - 1)); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void NumKeyDia::btn_input_clicked() |
|
|
void NumKeyDia::btn_input_clicked() |
|
|
{ |
|
|
{ |
|
|
|
|
|
auto *_btnClicked = qobject_cast<QPushButton *>(sender()); |
|
|
|
|
|
if(!_btnClicked) |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if(_btnClicked->property("isModeSwitch").toBool()) |
|
|
|
|
|
{ |
|
|
|
|
|
const auto nextPage = (m_inputPage == InputPage::NumberPage) |
|
|
|
|
|
? InputPage::SymbolPage |
|
|
|
|
|
: InputPage::NumberPage; |
|
|
|
|
|
setInputPage(nextPage); |
|
|
|
|
|
ui->lineEdit_input->setFocus(); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if(m_firstInputFlag) |
|
|
if(m_firstInputFlag) |
|
|
{ |
|
|
{ |
|
|
ui->lineEdit_input->clear(); |
|
|
ui->lineEdit_input->clear(); |
|
|
m_firstInputFlag = false; |
|
|
m_firstInputFlag = false; |
|
|
} |
|
|
} |
|
|
auto _btnClicked = qobject_cast<QPushButton *>(sender()); |
|
|
|
|
|
QString _inputValue = _btnClicked->text(); |
|
|
const QString _inputValue = _btnClicked->property("inputValue").toString(); |
|
|
|
|
|
if(_inputValue.isEmpty()) |
|
|
|
|
|
{ |
|
|
|
|
|
ui->lineEdit_input->setFocus(); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
int _index = ui->lineEdit_input->cursorPosition(); |
|
|
int _index = ui->lineEdit_input->cursorPosition(); |
|
|
QString _currentText = ui->lineEdit_input->text(); |
|
|
QString _currentText = ui->lineEdit_input->text(); |
|
|
|
|
|
|
|
|
_currentText.insert(_index, _inputValue); |
|
|
_currentText.insert(_index, _inputValue); |
|
|
ui->lineEdit_input->setText(_currentText); |
|
|
ui->lineEdit_input->setText(_currentText); |
|
|
|
|
|
ui->lineEdit_input->setFocus(); |
|
|
|
|
|
ui->lineEdit_input->setCursorPosition(_index + _inputValue.size()); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void NumKeyDia::closeKeyBoard() |
|
|
void NumKeyDia::closeKeyBoard() |
|
|
{ |
|
|
{ |
|
|
this->close(); |
|
|
this->close(); |
|
|
m_pLineEdit->setEnabled(true); |
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void NumKeyDia::setMaxValue(double newMaxValue) |
|
|
void NumKeyDia::setInputPage(InputPage page) |
|
|
{ |
|
|
{ |
|
|
m_maxValue = newMaxValue; |
|
|
m_inputPage = page; |
|
|
|
|
|
refreshInputButtons(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void NumKeyDia::setMinValue(double newMinValue) |
|
|
void NumKeyDia::refreshInputButtons() |
|
|
{ |
|
|
{ |
|
|
m_minValue = newMinValue; |
|
|
if(m_inputPage == InputPage::NumberPage) |
|
|
|
|
|
{ |
|
|
|
|
|
configureInputButton(ui->btn_1, QStringLiteral("1"), QStringLiteral("1"), true); |
|
|
|
|
|
configureInputButton(ui->btn_2, QStringLiteral("2"), QStringLiteral("2"), true); |
|
|
|
|
|
configureInputButton(ui->btn_3, QStringLiteral("3"), QStringLiteral("3"), true); |
|
|
|
|
|
configureInputButton(ui->btn_4, QStringLiteral("4"), QStringLiteral("4"), true); |
|
|
|
|
|
configureInputButton(ui->btn_5, QStringLiteral("5"), QStringLiteral("5"), true); |
|
|
|
|
|
configureInputButton(ui->btn_6, QStringLiteral("6"), QStringLiteral("6"), true); |
|
|
|
|
|
configureInputButton(ui->btn_7, QStringLiteral("7"), QStringLiteral("7"), true); |
|
|
|
|
|
configureInputButton(ui->btn_8, QStringLiteral("8"), QStringLiteral("8"), true); |
|
|
|
|
|
configureInputButton(ui->btn_9, QStringLiteral("9"), QStringLiteral("9"), true); |
|
|
|
|
|
configureInputButton(ui->btn_sub, QStringLiteral("#+="), QString(), true, true); |
|
|
|
|
|
configureInputButton(ui->btn_0, QStringLiteral("0"), QStringLiteral("0"), true); |
|
|
|
|
|
configureInputButton(ui->pushButton_dot, QStringLiteral("."), QStringLiteral("."), true); |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
configureInputButton(ui->btn_1, QStringLiteral("/"), QStringLiteral("/"), true); |
|
|
|
|
|
configureInputButton(ui->btn_2, QStringLiteral("-"), QStringLiteral("-"), true); |
|
|
|
|
|
configureInputButton(ui->btn_3, QStringLiteral(":"), QStringLiteral(":"), true); |
|
|
|
|
|
const QString degreeSymbol(QChar(0x00B0)); |
|
|
|
|
|
configureInputButton(ui->btn_4, degreeSymbol, degreeSymbol, true); |
|
|
|
|
|
configureInputButton(ui->btn_5, QStringLiteral("'"), QStringLiteral("'"), true); |
|
|
|
|
|
configureInputButton(ui->btn_6, QStringLiteral("\""), QStringLiteral("\""), true); |
|
|
|
|
|
configureInputButton(ui->btn_7, QStringLiteral("."), QStringLiteral("."), true); |
|
|
|
|
|
configureInputButton(ui->btn_8, QStringLiteral("_"), QStringLiteral("_"), true); |
|
|
|
|
|
configureInputButton(ui->btn_9, QStringLiteral("@"), QStringLiteral("@"), true); |
|
|
|
|
|
configureInputButton(ui->btn_sub, QStringLiteral("123"), QString(), true, true); |
|
|
|
|
|
configureInputButton(ui->btn_0, QStringLiteral("+"), QStringLiteral("+"), true); |
|
|
|
|
|
configureInputButton(ui->pushButton_dot, QStringLiteral(","), QStringLiteral(","), true); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void NumKeyDia::configureInputButton(QPushButton *button, |
|
|
|
|
|
const QString &label, |
|
|
|
|
|
const QString &value, |
|
|
|
|
|
bool enabled, |
|
|
|
|
|
bool isModeSwitch) |
|
|
|
|
|
{ |
|
|
|
|
|
if(!button) |
|
|
|
|
|
{ |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
button->setText(label); |
|
|
|
|
|
button->setEnabled(enabled); |
|
|
|
|
|
button->setProperty("inputValue", value); |
|
|
|
|
|
button->setProperty("isModeSwitch", isModeSwitch); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
namespace KeyBoard |
|
|
|
|
|
{ |
|
|
|
|
|
NumKeyDia *app() |
|
|
|
|
|
{ |
|
|
|
|
|
return NumKeyDia::instance(); |
|
|
|
|
|
}; |
|
|
|
|
|
}; |
|
|
|