| | |
| | | import android.os.Bundle; |
| | | import android.text.TextUtils; |
| | | import android.util.Log; |
| | | import android.view.KeyEvent; |
| | | import android.view.LayoutInflater; |
| | | import android.widget.Toast; |
| | | import android.view.View; |
| | | |
| | | import com.dayu.baselibrary.tools.HexUtil; |
| | | import com.dayu.baselibrary.utils.AidlUtil; |
| | | import com.dayu.baselibrary.utils.BaseCommon; |
| | | import com.dayu.baselibrary.utils.DateUtil; |
| | | import com.dayu.baselibrary.utils.MornyUtil; |
| | | import com.dayu.baselibrary.utils.TipUtil; |
| | | |
| | | import com.dayu.baselibrary.view.ConfirmDialog; |
| | | import com.dayu.baselibrary.view.TitleBar; |
| | | import com.dayu.qihealonelibrary.QHAloneApplication; |
| | | import com.dayu.qihealonelibrary.R; |
| | | import com.dayu.qihealonelibrary.card.CleanCard; |
| | | import com.dayu.qihealonelibrary.card.CleanUserCard; |
| | | import com.dayu.qihealonelibrary.card.ConfigurationPowerCard; |
| | | import com.dayu.qihealonelibrary.card.ConfigureDeviceRegistrationCrad; |
| | | import com.dayu.qihealonelibrary.card.DomainCard; |
| | | import com.dayu.qihealonelibrary.card.ElectricPriceCard; |
| | | import com.dayu.qihealonelibrary.card.ManageCard; |
| | | import com.dayu.qihealonelibrary.card.PassWordCard; |
| | | import com.dayu.qihealonelibrary.card.RegionCard; |
| | | import com.dayu.qihealonelibrary.card.RegisteredCard; |
| | | import com.dayu.qihealonelibrary.card.TestCard; |
| | | import com.dayu.qihealonelibrary.card.UserCard; |
| | | import com.dayu.qihealonelibrary.databinding.ActivityWriteTextBinding; |
| | | import com.dayu.qihealonelibrary.databinding.ActivityWriteTextQhaBinding; |
| | | import com.dayu.qihealonelibrary.dbBean.AdminDataBean; |
| | | import com.dayu.qihealonelibrary.dbBean.RechargeBean; |
| | | import com.dayu.qihealonelibrary.dbBean.UserCardBean; |
| | | import com.dayu.qihealonelibrary.tools.NFCWriteHelper; |
| | | import com.dayu.qihealonelibrary.tools.NfcReadHelper; |
| | | import com.dayu.qihealonelibrary.tools.WriteCardUtils; |
| | | import com.dayu.qihealonelibrary.utils.DeviceNumberUtils; |
| | | import com.dayu.qihealonelibrary.utils.MyCommon; |
| | | import com.dayu.qihealonelibrary.utils.CardCommon; |
| | | import com.tencent.bugly.crashreport.CrashReport; |
| | | import java.util.Arrays; |
| | | |
| | | import java.util.Calendar; |
| | | |
| | | /** |
| | | * Copyright (C), 2023, |
| | |
| | | */ |
| | | public class NFCWreatActivity extends BaseNfcActivity { |
| | | |
| | | RegisteredCard registeredCard; |
| | | CleanUserCard cleanUserCard; |
| | | ManageCard manageCard; |
| | | DomainCard domainCard; |
| | | |
| | | CleanCard cleanCard; |
| | | ConfigureDeviceRegistrationCrad configureDeviceRegistrationCrad; |
| | | TestCard testCard; |
| | | //区域表号卡 |
| | | RegionCard regionCard; |
| | | ConfigurationPowerCard configurationPowerCard; |
| | | //密码卡 |
| | | PassWordCard passWordCard; |
| | | //用户电量单价卡 |
| | | ElectricPriceCard electricPriceCard; |
| | | UserCardBean userCardBeanByManager; |
| | | boolean electricPriceFlag = false; |
| | | boolean passwordFlag = false; |
| | | boolean cleanFlag = false; |
| | | boolean regionFlag = false; |
| | | boolean userFlag = false; |
| | | boolean manageCardFlag = false; |
| | | boolean registeredFlag = false; |
| | |
| | | UserCard olduserCard; |
| | | |
| | | String morny; |
| | | String rechageWater;//充值的水量 |
| | | String userName; |
| | | AdminDataBean adminData; |
| | | RechargeBean rechargeBean; |
| | | Intent intent; |
| | | |
| | | |
| | | RegisteredCard registeredCard; |
| | | CleanUserCard cleanUserCard; |
| | | ManageCard manageCard; |
| | | DomainCard domainCard; |
| | | |
| | | CleanCard cleanCard; |
| | | ConfigureDeviceRegistrationCrad configureDeviceRegistrationCrad; |
| | | TestCard testCard; |
| | | |
| | | ConfigurationPowerCard configurationPowerCard; |
| | | //打印 |
| | | QHAloneApplication baseApp; |
| | | |
| | |
| | | |
| | | //是否是充值过程 |
| | | boolean isRecharge = false; |
| | | //充值通信是否完成 |
| | | boolean rechargeIsOk = false; |
| | | ActivityWriteTextBinding binding; |
| | | |
| | | ActivityWriteTextQhaBinding binding; |
| | | |
| | | //当前卡的物理卡号 |
| | | String cardNumber; |
| | | ConfirmDialog confirmDialog; |
| | | |
| | | @Override |
| | | protected void onCreate(Bundle savedInstanceState) { |
| | | super.onCreate(savedInstanceState); |
| | | try { |
| | | binding = ActivityWriteTextBinding.inflate(LayoutInflater.from(this)); |
| | | binding = ActivityWriteTextQhaBinding.inflate(LayoutInflater.from(this)); |
| | | setContentView(binding.getRoot()); |
| | | nfcWreatActivity = this; |
| | | getData(); |
| | | titleBack(); |
| | | baseApp = QHAloneApplication.getInstance(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | |
| | | if (this.getIntent().hasExtra("userCard")) { |
| | | userCard = (UserCard) this.getIntent().getSerializableExtra("userCard"); |
| | | } |
| | | if (this.getIntent().hasExtra("electricPriceCard")) { |
| | | electricPriceCard = (ElectricPriceCard) this.getIntent().getSerializableExtra("electricPriceCard"); |
| | | binding.cardData.setText("制作用户电量单价卡\n当前单价:" + electricPriceCard.getElectricPrice().toString() + " 元"); |
| | | } |
| | | if (this.getIntent().hasExtra("passWordCard")) { |
| | | passWordCard = (PassWordCard) this.getIntent().getSerializableExtra("passWordCard"); |
| | | binding.cardData.setText("制作密码卡"); |
| | | } |
| | | if (this.getIntent().hasExtra("cleanCard")) { |
| | | cleanCard = (CleanCard) this.getIntent().getSerializableExtra("cleanCard"); |
| | | binding.cardData.setText("制作清零卡"); |
| | | } |
| | | if (this.getIntent().hasExtra("manageCard")) { |
| | | cardNumber = this.getIntent().getStringExtra("cardNumber"); |
| | | manageCard = (ManageCard) this.getIntent().getSerializableExtra("manageCard"); |
| | | binding.cardData.setText("制作管理卡"); |
| | | if (this.getIntent().hasExtra("userCardBean_manager")) { |
| | | userCardBeanByManager = (UserCardBean) this.getIntent().getSerializableExtra("userCardBean_manager"); |
| | | } |
| | | //显示的时候要反过来 |
| | | String hex = HexUtil.spaceHex(manageCard.getUserCard()); |
| | | hex = HexUtil.HighLowHex(hex); |
| | | binding.cardData.setText("制作管理卡(请将管理卡贴在设备上)\n用户卡号:" + hex); |
| | | } |
| | | if (this.getIntent().hasExtra("registeredCard")) { |
| | | registeredCard = (RegisteredCard) this.getIntent().getSerializableExtra("registeredCard"); |
| | |
| | | configurationPowerCard = (ConfigurationPowerCard) this.getIntent().getSerializableExtra("configurationPowerCard"); |
| | | binding.cardData.setText("制作配置水泵功率卡"); |
| | | } |
| | | if (this.getIntent().hasExtra("regionCard")) { |
| | | regionCard = (RegionCard) this.getIntent().getSerializableExtra("regionCard"); |
| | | binding.cardData.setText("制作区域表号卡"); |
| | | } |
| | | if (this.getIntent().hasExtra("morny")) { |
| | | startAnim(); |
| | | // 充值逻辑 |
| | | isRecharge = true; |
| | | morny = this.getIntent().getStringExtra("morny"); |
| | | userName = this.getIntent().getStringExtra("userName"); |
| | | binding.cardData.setText("充值金额:" + morny + "元"); |
| | | // 充值逻辑 |
| | | // recharge(userCard.getInitPeasantCode(), userName, "启用"); |
| | | cardNumber = this.getIntent().getStringExtra("cardNumber"); |
| | | userCardBean = (UserCardBean) this.getIntent().getSerializableExtra("userCardBean"); |
| | | // rechageWater = this.getIntent().getStringExtra("rechageWater"); |
| | | binding.cardData.setText("充值金额:" + morny + " 元"); |
| | | } |
| | | |
| | | try { |
| | |
| | | */ |
| | | private void checkHasUser() { |
| | | |
| | | String cardType = NfcReadHelper.getInstence(intent, this).getCradType(); |
| | | Log.i("NFCWreatActivity", "cardType=" + cardType); |
| | | if (cardType.equals(MyCommon.USER_CARD_TYPE_1) || |
| | | cardType.equals(MyCommon.USER_CARD_TYPE_2) || |
| | | cardType.equals(MyCommon.USER_CARD_TYPE_3) |
| | | ) { |
| | | binding.textView.setText("该卡已经写入用户信息,请更换卡片"); |
| | | binding.textView.setTextColor(getResources().getColor(com.dayu.baselibrary.R.color.red)); |
| | | } else if (cardType.equals("-1")) { |
| | | TipUtil.show(NFCWreatActivity.this, "请勿移动卡片,读卡失败请重试!!"); |
| | | } else { |
| | | Log.i("NFCWreatActivity", "olduserCard!=null saveData"); |
| | | saveData(); |
| | | try { |
| | | String cardType = NfcReadHelper.getInstence(intent, this).getCradTypeAndCardNumber(); |
| | | |
| | | String[] cardTypes = cardType.split(","); |
| | | if (cardTypes != null && cardTypes.length == 2) { |
| | | cardNumber = cardType.split(",")[0]; |
| | | cardNumber = HexUtil.spaceHex(cardNumber); |
| | | cardNumber = HexUtil.HighLowHex(cardNumber); |
| | | cardType = cardType.split(",")[1]; |
| | | } |
| | | Log.i("NFCWreatActivity", "cardType=" + cardType); |
| | | if (cardType.equals(CardCommon.USER_CARD_TYPE_1) || |
| | | cardType.equals(CardCommon.USER_CARD_TYPE_2) || |
| | | cardType.equals(CardCommon.USER_CARD_TYPE_3) |
| | | ) { |
| | | binding.textView.setText("该卡已经写入用户信息,请更换卡片"); |
| | | binding.textView.setTextColor(getResources().getColor(com.dayu.baselibrary.R.color.red)); |
| | | } else if (cardType.equals(BaseCommon.CARD_TYPE_ERROR1)) { |
| | | TipUtil.show(NFCWreatActivity.this, "请勿移动卡片,读卡失败请重试!!"); |
| | | } else if (cardType.equals(BaseCommon.CARD_TYPE_ERROR2)) { |
| | | TipUtil.show(NFCWreatActivity.this, "卡片未能识别,请检查卡片是否是本公司卡片"); |
| | | } else { |
| | | Log.i("NFCWreatActivity", "olduserCard!=null saveData"); |
| | | userCardBean.setCardNumber(cardNumber); |
| | | baseDao.userCardDao().insert(userCardBean); |
| | | saveData(); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | stopAnim(); |
| | |
| | | || registeredCard != null || cleanUserCard != null |
| | | || domainCard != null || testCard != null |
| | | || configureDeviceRegistrationCrad != null |
| | | || configurationPowerCard != null) { |
| | | || configurationPowerCard != null || regionCard != null || passWordCard != null || electricPriceCard != null) { |
| | | if (userCard != null && TextUtils.isEmpty(morny)) { |
| | | |
| | | userFlag = WriteCardUtils.setUser(intent, userCard, this); |
| | | } |
| | | if (electricPriceCard != null) { |
| | | setElectricPriceCard(intent, electricPriceCard); |
| | | } |
| | | if (passWordCard != null) { |
| | | setPassWordCard(intent, passWordCard); |
| | | } |
| | | if (regionCard != null) { |
| | | setRegionCard(intent, regionCard); |
| | | } |
| | | if (cleanCard != null) { |
| | | setClean(intent, cleanCard); |
| | | } |
| | | if (manageCard != null) { |
| | | setmanageCard(intent, manageCard); |
| | | // if (manageCardFlag && userCardBeanByManager != null) { |
| | | // //修改用户表信息修改成新卡卡号 |
| | | // userCardBeanByManager.setCardNumber(cardNumber); |
| | | // baseDao.userCardDao().update(userCardBeanByManager); |
| | | // } |
| | | } |
| | | if (registeredCard != null) { |
| | | setRegisteredCard(intent, registeredCard); |
| | |
| | | if (configurationPowerCard != null) { |
| | | setConfigurationPower(intent, configurationPowerCard); |
| | | } |
| | | if ((configPowerFlag || configDeviceRegiestFlag || testCardFlag || domainCrdFlag || userFlag || cleanFlag || manageCardFlag || registeredFlag || administrativeCardFlag || cleanUserCardFlag)) { |
| | | if (electricPriceFlag || passwordFlag || regionFlag || configPowerFlag || configDeviceRegiestFlag || testCardFlag || domainCrdFlag || userFlag || cleanFlag || manageCardFlag || registeredFlag || administrativeCardFlag || cleanUserCardFlag) { |
| | | try { |
| | | if (userFlag && userCardBean != null) { |
| | | //用户卡 |
| | | startDetailActivity(userCardBean.getUserName(), "启用"); |
| | | startDetailActivity(userCardBean.getUserName(), "终端写卡"); |
| | | } else if (!TextUtils.isEmpty(morny)) { |
| | | TipUtil.show(NFCWreatActivity.this, "充值成功", () -> NFCWreatActivity.this.finish()); |
| | | } else { |
| | |
| | | super.onNewIntent(intent); |
| | | try { |
| | | this.intent = intent; |
| | | startAnim(); |
| | | // startAnim(); |
| | | Log.i("NFCWreatActivity", "isUser:" + isUser); |
| | | if (isUser) { |
| | | //新卡注册逻辑 |
| | | checkHasUser(); |
| | | } else if (isRecharge) { |
| | | if (rechargeIsOk) { |
| | | rechargeWrratCard(); |
| | | } else { |
| | | Toast.makeText(this, "正在通信请稍后", Toast.LENGTH_SHORT).show(); |
| | | } |
| | | |
| | | //充值逻辑 |
| | | rechargeWreatCard(); |
| | | } else { |
| | | //其他管理卡逻辑 |
| | | saveData(); |
| | | } |
| | | } catch (Exception e) { |
| | |
| | | StringBuffer data = new StringBuffer(); |
| | | if (rechargeBean != null) { |
| | | data.append("*****************************" + "\n"); |
| | | data.append(getResources().getString(com.dayu.baselibrary.R.string.login_title) + "\n"); |
| | | data.append("设备序列号:" + rechargeBean.getSerial() + "\n"); |
| | | data.append("用户名:" + rechargeBean.getUserName() + "\n"); |
| | | // data.append("户 号:" + rechargeBean.getUserNum() + "\n"); |
| | | data.append("充值金额:" + rechargeBean.getMorny() + "元" + "\n"); |
| | | data.append("卡内余额:" + rechargeBean.getBalance() + "元" + "\n"); |
| | | data.append("卡 号:" + rechargeBean.getCardNumber() + "\n"); |
| | | data.append("充值金额:" + rechargeBean.getMorny() + " 元" + "\n"); |
| | | data.append("卡内余额:" + rechargeBean.getBalance() + " 元" + "\n"); |
| | | data.append("日 期:" + DateUtil.dateToStamp(rechargeBean.getDate(), DateUtil.type2) + "\n\n"); |
| | | data.append("*****************************"); |
| | | } |
| | | |
| | | float size = 26; |
| | | |
| | | try { |
| | | AidlUtil.getInstance().printText(data.toString(), size, true, false); |
| | | AidlUtil.getInstance().print3Line(); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | e.printStackTrace(); |
| | | } |
| | | |
| | | } catch (Exception e) { |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | //往卡内写充值后的数据 |
| | | private void rechargeWrratCard() { |
| | | UserCard userCardold = NfcReadHelper.getInstence(intent, this).getUserCardData(); |
| | | if (userCardold != null) { |
| | | private void rechargeWreatCard() { |
| | | try { |
| | | String cardNumberThis = NfcReadHelper.getInstence(intent, this).getCardNumber(); |
| | | cardNumberThis = HexUtil.spaceHex(cardNumberThis); |
| | | cardNumberThis = HexUtil.HighLowHex(cardNumberThis); |
| | | //判断是否充值的是一个卡 |
| | | // if (userCard.getInitPeasantCode().equals(userCardold.getInitPeasantCode())) { |
| | | // userCard.setState("00"); |
| | | // userFlag = WriteCardUtils.setUser(intent, userCard, this); |
| | | // // 打印相关 |
| | | // if (userFlag) { |
| | | // setPrinterData(rechargeBean); |
| | | // startDetailActivity(userName, "启用"); |
| | | // } else { |
| | | // TipUtil.show(NFCWreatActivity.this, "写卡失败,请重新再试"); |
| | | // } |
| | | // } else { |
| | | // TipUtil.show(NFCWreatActivity.this, "读取的卡和充值的卡不一致"); |
| | | // } |
| | | } else { |
| | | if (cardNumberThis.equalsIgnoreCase(cardNumber)) { |
| | | //余额 |
| | | int balance = userCard.getBalance() + MornyUtil.changeY2F(morny); |
| | | userCard.setBalance(balance); |
| | | //剩余水量 |
| | | // int surplusWater = userCard.getSurplusWater() + MornyUtil.changeY2F(rechageWater); |
| | | // userCard.setSurplusWater(surplusWater); |
| | | |
| | | int rechageTims = userCard.getRechargeTimes() + 1; |
| | | if (rechageTims == 256) { |
| | | rechageTims = 0; |
| | | } |
| | | userCard.setRechargeTimes((short) rechageTims); |
| | | userCard.setRechargeDate(Calendar.getInstance()); |
| | | userFlag = WriteCardUtils.setUser(intent, userCard, this); |
| | | if (userFlag) { |
| | | rechargeBean = new RechargeBean(); |
| | | rechargeBean.setUserName(userName); |
| | | rechargeBean.setSerial(userCardBean.getSerial()); |
| | | rechargeBean.setUserId(userCardBean.getUserID()); |
| | | rechargeBean.setDate(System.currentTimeMillis()); |
| | | rechargeBean.setMorny(morny); |
| | | rechargeBean.setBalance(MornyUtil.changeF2Y(balance)); |
| | | rechargeBean.setCardNumber(cardNumber); |
| | | rechargeBean.setSurplusWater(MornyUtil.changeF2Y(0)); |
| | | rechargeBean.setRechargeWater(rechageWater); |
| | | try { |
| | | baseDao.rechargeDao().insert(rechargeBean); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | // 打印相关 |
| | | setPrinterData(rechargeBean); |
| | | startDetailActivity(userName, "终端写卡"); |
| | | } else { |
| | | TipUtil.show(NFCWreatActivity.this, "写卡失败,请重新再试"); |
| | | } |
| | | } else { |
| | | TipUtil.show(NFCWreatActivity.this, "读取的卡和充值的卡不一致"); |
| | | } |
| | | } catch (Exception e) { |
| | | TipUtil.show(NFCWreatActivity.this, "读取错误,请重试"); |
| | | } |
| | | } |
| | | |
| | | private void setmanageCard(Intent intent, final ManageCard manageCard) { |
| | | manageCardFlag = NFCWriteHelper.getInstence(intent, this).writeData(manageCard.toZeroByte(baseDao), 1, 0); |
| | | manageCardFlag = NFCWriteHelper.getInstence(intent, this).writeData(manageCard.toByte(baseDao), 1, 0); |
| | | } |
| | | |
| | | /** |
| | |
| | | * @param intent |
| | | * @param clearOrInitCard |
| | | */ |
| | | private void setClean(Intent intent, final CleanCard clearOrInitCard) { |
| | | private void setClean(Intent intent, CleanCard clearOrInitCard) { |
| | | cleanFlag = NFCWriteHelper.getInstence(intent, this).writeData(clearOrInitCard.toByte(baseDao), 1, 0); |
| | | } |
| | | |
| | | /** |
| | | * 保存区域表号卡 |
| | | * |
| | | * @param intent |
| | | * @param regionCard |
| | | */ |
| | | private void setRegionCard(Intent intent, RegionCard regionCard) { |
| | | regionFlag = NFCWriteHelper.getInstence(intent, this).writeData(regionCard.toByte(), 1, 0); |
| | | } |
| | | |
| | | /** |
| | | * 密码卡 |
| | | * |
| | | * @param intent |
| | | * @param passWordCard |
| | | */ |
| | | private void setPassWordCard(Intent intent, PassWordCard passWordCard) { |
| | | passwordFlag = NFCWriteHelper.getInstence(intent, this).writeData(passWordCard.toByte(baseDao), 1, 0); |
| | | } |
| | | |
| | | /** |
| | | * 用户电量单价 |
| | | * |
| | | * @param intent |
| | | * @param electricPriceCard |
| | | */ |
| | | private void setElectricPriceCard(Intent intent, ElectricPriceCard electricPriceCard) { |
| | | electricPriceFlag = NFCWriteHelper.getInstence(intent, this).writeData(electricPriceCard.toByte(baseDao), 1, 0); |
| | | } |
| | | |
| | | /** |
| | | * 重新注册设备卡 |
| | |
| | | |
| | | |
| | | private void startDetailActivity(String userName, String statu) { |
| | | Intent detail = new Intent(this, RechargeDetail.class); |
| | | Intent detail = new Intent(this, RechargeDetailActivity.class); |
| | | detail.putExtra("userName", userName); |
| | | detail.putExtra("statu", statu); |
| | | detail.putExtra("userCard", userCard); |
| | | if (!TextUtils.isEmpty(morny)) { |
| | | detail.putExtra("morny", morny); |
| | | detail.putExtra("rechageWater", rechageWater); |
| | | } |
| | | if (!TextUtils.isEmpty(cardNumber)) { |
| | | detail.putExtra("cardNumber", cardNumber); |
| | | } |
| | | |
| | | startActivity(detail); |
| | | if (NewCardActivity.newCardActivity != null) { |
| | | NewCardActivity.newCardActivity.finish(); |
| | |
| | | } |
| | | |
| | | |
| | | |
| | | protected void onDestroy() { |
| | | super.onDestroy(); |
| | | nfcWreatActivity = null; |
| | | } |
| | | |
| | | /** |
| | | * 点击返回时提示用户还未写卡 |
| | | * |
| | | * @param keyCode |
| | | * @param event |
| | | * @return |
| | | */ |
| | | @Override |
| | | public boolean onKeyDown(int keyCode, KeyEvent event) { |
| | | if (keyCode == KeyEvent.KEYCODE_BACK) { |
| | | back(); |
| | | return true; |
| | | } |
| | | return super.onKeyDown(keyCode, event); |
| | | } |
| | | |
| | | private void back() { |
| | | confirmDialog = new ConfirmDialog(NFCWreatActivity.this, v -> { |
| | | confirmDialog.dismiss(); |
| | | if (NewCardActivity.newCardActivity != null) { |
| | | NewCardActivity.newCardActivity.finish(); |
| | | } |
| | | if (RechargeActivity.rechargeActivity != null) { |
| | | RechargeActivity.rechargeActivity.finish(); |
| | | } |
| | | NFCWreatActivity.nfcWreatActivity.finish(); |
| | | }); |
| | | confirmDialog.show(); |
| | | } |
| | | |
| | | private void titleBack() { |
| | | titleBar.setOnItemclickListner(TitleBar.ClickType_LEFT_IMAGE, new View.OnClickListener() { |
| | | @Override |
| | | public void onClick(View v) { |
| | | back(); |
| | | } |
| | | }); |
| | | } |
| | | } |