| | |
| | | using System;
|
| | | using ZigBee.Device;
|
| | | using System.Collections.Generic;
|
| | | using System.Threading.Tasks;
|
| | |
|
| | | namespace Shared.Phone.UserCenter.GatewayManage
|
| | | {
|
| | |
| | | #region ■ 变量声明___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 网关名称控件
|
| | | /// 列表控件
|
| | | /// </summary>
|
| | | private FrameCaptionInputControl rowGateway = null;
|
| | | /// <summary>
|
| | | /// 设备明细列表控件的桌布
|
| | | /// </summary>
|
| | | private DeviceInformationListControl listDeviceControl = null;
|
| | | private VerticalListControl listview = null;
|
| | | /// <summary>
|
| | | /// 当前选择的网关
|
| | | /// </summary>
|
| | |
| | | this.zbGateway = i_zbGateway;
|
| | |
|
| | | //设置标题信息
|
| | | base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uEditorGatewayInformation));
|
| | | base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uDeviceSettion));
|
| | |
|
| | | //网关定位
|
| | | var btnIcon = new MostRightIconControl(69, 69);
|
| | | btnIcon.UnSelectedImagePath = "Item/Test.png";
|
| | | topFrameLayout.AddChidren(btnIcon);
|
| | | btnIcon.InitControl();
|
| | |
|
| | | btnIcon.ButtonClickEvent += (sender, e) =>
|
| | | {
|
| | | //测试
|
| | | HdlGatewayLogic.Current.SetTestCommand(i_zbGateway);
|
| | | };
|
| | | //初始化右上角菜单
|
| | | this.InitTopRightMenu();
|
| | |
|
| | | //初始化中部控件
|
| | | this.InitMiddleFrame();
|
| | |
| | | //清空bodyFrame
|
| | | this.ClearBodyFrame();
|
| | |
|
| | | //图片上下的间距(上下间距一致)
|
| | | int picSpcae = Application.GetRealHeight(100);
|
| | | //图片
|
| | | var btnImage = new PicViewControl(838, 530, true);
|
| | | btnImage.Y = picSpcae;
|
| | | btnImage.Gravity = Gravity.CenterHorizontal;
|
| | | HdlGatewayLogic.Current.SetRealGatewayPictrue(btnImage, zbGateway);
|
| | | bodyFrameLayout.AddChidren(btnImage);
|
| | | //初始化桌布
|
| | | var tableContr = new InformationEditorControl();
|
| | | this.listview = tableContr.InitControl(bodyFrameLayout, Language.StringByID(R.MyInternationalizationString.uInfoEditor), 369, 1368);
|
| | |
|
| | | //完成按钮
|
| | | var btnFinish = new BottomClickButton();
|
| | | btnFinish.TextID = R.MyInternationalizationString.uFinish;
|
| | | bodyFrameLayout.AddChidren(btnFinish);
|
| | | btnFinish.MouseUpEventHandler += (sender, e) =>
|
| | | //图片
|
| | | var btnPic = new DeviceInfoIconControl();
|
| | | btnPic.Y = Application.GetRealHeight(92);
|
| | | btnPic.Gravity = Gravity.CenterHorizontal;
|
| | | bodyFrameLayout.AddChidren(btnPic);
|
| | | btnPic.InitControl(this.zbGateway);
|
| | |
|
| | | //设备备注
|
| | | string caption = Language.StringByID(R.MyInternationalizationString.uDeviceNote);
|
| | | string nameValue = HdlGatewayLogic.Current.GetGatewayName(zbGateway);
|
| | | var btnNote = new FrameCaptionInputControl(caption, nameValue, listview.rowSpace / 2);
|
| | | listview.AddChidren(btnNote);
|
| | | btnNote.InitControl();
|
| | | //划线
|
| | | btnNote.AddBottomLine();
|
| | | btnNote.txtInput.FinishInputEvent += () =>
|
| | | {
|
| | | //完成按钮按下
|
| | | this.FinishButtonClick();
|
| | | string oldName = HdlGatewayLogic.Current.GetGatewayName(zbGateway);
|
| | | if (btnNote.Text == string.Empty)
|
| | | {
|
| | | btnNote.Text = oldName;
|
| | | }
|
| | | if (oldName != btnNote.Text)
|
| | | {
|
| | | //修改名字
|
| | | this.SetGatewayName(btnNote.Text, false);
|
| | | }
|
| | | };
|
| | |
|
| | | //白色底部背景
|
| | | var frameBottomWhite = new FrameLayout();
|
| | | frameBottomWhite.Y = btnFinish.Y - ControlCommonResourse.BottomButtonAndListViewSpace;
|
| | | frameBottomWhite.Height = bodyFrameLayout.Height - btnFinish.Y + ControlCommonResourse.BottomButtonAndListViewSpace;
|
| | | frameBottomWhite.BackgroundColor = UserCenterColor.Current.White;
|
| | | bodyFrameLayout.AddChidren(frameBottomWhite);
|
| | | //将完成按钮置顶
|
| | | btnFinish.BringToFront();
|
| | | //设备类型
|
| | | caption = Language.StringByID(R.MyInternationalizationString.uDeviceType);
|
| | | var btnType = new FrameCaptionViewControl(caption, nameValue, listview.rowSpace / 2);
|
| | | btnType.UseClickStatu = false;
|
| | | listview.AddChidren(btnType);
|
| | | btnType.InitControl();
|
| | | HdlGatewayLogic.Current.SetGatewayImageText(btnType.txtView, this.zbGateway);
|
| | | //划线
|
| | | btnType.AddBottomLine();
|
| | |
|
| | | //自定义的设备列表容器
|
| | | this.listDeviceControl = new DeviceInformationListControl();
|
| | | //列表控件最大的高度(完成按钮的Y轴 - 设置的间隔 - 图片Y轴 - 图片的三分之一)
|
| | | int listViewMaxHeight = btnFinish.Y - ControlCommonResourse.BottomButtonAndListViewSpace - btnImage.Y - btnImage.Height / 3;
|
| | | //明细Frame的最小高度(底部frame的Y轴 - 图片底部 - 图片与弧度圆的间距 - 弧度圆高度)
|
| | | int minDetailHeight = frameBottomWhite.Y - btnImage.Bottom - picSpcae - listDeviceControl.halfRoundHeigth;
|
| | | //初始化控件
|
| | | listDeviceControl.InitControl(bodyFrameLayout, frameBottomWhite.Height, listViewMaxHeight, minDetailHeight, 4);
|
| | | //数据上传与下载
|
| | | var rowData = new RowLayoutControl(listview.rowSpace / 2);
|
| | | listview.AddChidren(rowData);
|
| | | rowData.frameTable.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uDataUploadAndDownLoad), 700);
|
| | | //右图标
|
| | | rowData.frameTable.AddRightArrow();
|
| | | //底线
|
| | | rowData.frameTable.AddBottomLine();
|
| | | rowData.frameTable.ButtonClickEvent += (sender, e) =>
|
| | | {
|
| | | };
|
| | |
|
| | | //设备编辑
|
| | | var btnTitle = new DetailTitleControl(Application.GetRealWidth(800), listDeviceControl.titleHeight, false);
|
| | | btnTitle.TextID = R.MyInternationalizationString.uDeviceEditor;
|
| | | listDeviceControl.AddChidren(btnTitle);
|
| | |
|
| | | //添加全部菜单行
|
| | | this.AddAllMenuRow();
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 添加全部菜单行_____________________
|
| | |
|
| | | /// <summary>
|
| | | /// 添加全部菜单行
|
| | | /// </summary>
|
| | | private void AddAllMenuRow()
|
| | | {
|
| | | //网关名称
|
| | | string caption = Language.StringByID(R.MyInternationalizationString.uGatewayName);
|
| | | string nameValue = HdlGatewayLogic.Current.GetGatewayName(zbGateway);
|
| | | this.rowGateway = new FrameCaptionInputControl(caption, nameValue);
|
| | | listDeviceControl.AddChidren(rowGateway);
|
| | | rowGateway.InitControl();
|
| | | rowGateway.AddBottomLine();
|
| | |
|
| | | //网关IP
|
| | | caption = Language.StringByID(R.MyInternationalizationString.uGatewayIP);
|
| | | nameValue = HdlGatewayLogic.Current.GetGatewayBaseInfoAttribute(zbGateway, "IpAddress").ToString();
|
| | | var btnIp = new FrameCaptionViewControl(caption, nameValue);
|
| | | listDeviceControl.AddChidren(btnIp);
|
| | | btnIp.InitControl();
|
| | | btnIp.txtView.TextColor = UserCenterColor.Current.TextGrayColor;
|
| | | btnIp.AddBottomLine();
|
| | | //主网关或者子网关标识
|
| | | var btnFlage = new RowMostRightTextView();
|
| | | btnFlage.TextColor = UserCenterColor.Current.TextGrayColor;
|
| | | btnIp.AddChidren(btnFlage, ChidrenBindMode.NotBind);
|
| | | int result = HdlGatewayLogic.Current.IsMainGateway(this.zbGateway);
|
| | | //主网关
|
| | | if (result == 1) { btnFlage.TextID = R.MyInternationalizationString.uMainGateway; }
|
| | | //子网关
|
| | | else if (result == 0) { btnFlage.TextID = R.MyInternationalizationString.uChidrenGateway; }
|
| | |
|
| | | //网关类型
|
| | | caption = Language.StringByID(R.MyInternationalizationString.uGatewayType);
|
| | | nameValue = HdlGatewayLogic.Current.GetGatewayImageText(this.zbGateway);
|
| | | var btnObject = new FrameCaptionViewControl(caption, nameValue);
|
| | | listDeviceControl.AddChidren(btnObject);
|
| | | btnObject.InitControl();
|
| | | btnObject.txtView.TextColor = UserCenterColor.Current.TextGrayColor;
|
| | | btnObject.AddBottomLine();
|
| | |
|
| | | //固件信息
|
| | | this.AddHardWareInfoRow();
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 添加固件信息行_____________________
|
| | |
|
| | | /// <summary>
|
| | | /// 添加固件信息行
|
| | | /// </summary>
|
| | | private void AddHardWareInfoRow()
|
| | | {
|
| | | var rowInfo = new RowLayoutControl();
|
| | | listDeviceControl.AddChidren(rowInfo);
|
| | |
|
| | | //固件信息
|
| | | //var btnInfo = new RowCenterViewControl(false, 14);
|
| | | //btnInfo.TextID = R.MyInternationalizationString.uFirmwareInformation;
|
| | | //rowInfo.AddChidren(btnInfo);
|
| | |
|
| | | //通用信息
|
| | | var btnGeneral = new FrameRowControl(listview.rowSpace / 2);
|
| | | listview.AddChidren(btnGeneral);
|
| | | btnGeneral.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uGeneralInformation), 600);
|
| | | //向右图标
|
| | | //rowInfo.AddRightArrow();
|
| | | btnGeneral.AddRightArrow();
|
| | | //底线
|
| | | btnGeneral.AddBottomLine();
|
| | | btnGeneral.ButtonClickEvent += (sender, e) =>
|
| | | {
|
| | | var form = new GatewayGeneralInformationForm();
|
| | | form.AddForm(zbGateway);
|
| | | };
|
| | |
|
| | | //新版本提示控件
|
| | | var btnNewVersion = new RowNewVersionTipView();
|
| | | //固件升级
|
| | | var rowUpDate = new FrameRowControl(listview.rowSpace / 2);
|
| | | listview.AddChidren(rowUpDate);
|
| | | rowUpDate.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uFirmwareUpdate), 600);
|
| | | //向右图标
|
| | | rowUpDate.AddRightArrow();
|
| | | //底线
|
| | | rowUpDate.AddBottomLine();
|
| | | //提示有新版本
|
| | | var btnNewVersion = new PicViewControl(78, 55);
|
| | | btnNewVersion.UnSelectedImagePath = "Item/NewVersion.png";
|
| | | btnNewVersion.Visible = false;
|
| | | rowInfo.AddChidren(btnNewVersion);
|
| | | btnNewVersion.X = Application.GetRealWidth(242);
|
| | | btnNewVersion.Y = Application.GetRealHeight(23);
|
| | | rowUpDate.AddChidren(btnNewVersion, ChidrenBindMode.BindEventOnly);
|
| | | rowUpDate.ButtonClickEvent += (sender, e) =>
|
| | | {
|
| | | btnNewVersion.Visible = false;
|
| | | };
|
| | |
|
| | | //rowInfo.MouseUpEvent += (sender, e) =>
|
| | | //{
|
| | | // btnNewVersion.Visible = false;
|
| | | // var form = new GatewayFirmwareInfoForm();
|
| | | // form.AddForm(zbGateway);
|
| | | //};
|
| | | //初始化桌布完成
|
| | | tableContr.FinishInitControl(bodyFrameLayout, this.listview);
|
| | | tableContr = null;
|
| | |
|
| | | //检测新版本
|
| | | this.CheckNewVersion(btnNewVersion);
|
| | | //保存
|
| | | var btnFinish = new BottomClickButton();
|
| | | btnFinish.TextID = R.MyInternationalizationString.uSave;
|
| | | bodyFrameLayout.AddChidren(btnFinish);
|
| | | btnFinish.ButtonClickEvent += (sender, e) =>
|
| | | {
|
| | | string oldName = HdlGatewayLogic.Current.GetGatewayName(zbGateway);
|
| | | if (btnNote.Text == string.Empty)
|
| | | {
|
| | | btnNote.Text = oldName;
|
| | | }
|
| | | if (oldName != btnNote.Text)
|
| | | {
|
| | | //修改名字
|
| | | this.SetGatewayName(btnNote.Text, false);
|
| | | }
|
| | | else
|
| | | {
|
| | | //关闭自身
|
| | | this.CloseForm();
|
| | | }
|
| | | };
|
| | |
|
| | | HdlThreadLogic.Current.RunThread(() =>
|
| | | {
|
| | | //检测新版本
|
| | | this.CheckNewVersion(btnNewVersion, btnType);
|
| | | });
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 右上角菜单_________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 初始化右上角菜单
|
| | | /// </summary>
|
| | | private void InitTopRightMenu()
|
| | | {
|
| | | var btnIcon = new MostRightIconControl(69, 69);
|
| | | btnIcon.UnSelectedImagePath = "Item/More.png";
|
| | | topFrameLayout.AddChidren(btnIcon);
|
| | | btnIcon.InitControl();
|
| | | btnIcon.ButtonClickEvent += ((sender, e) =>
|
| | | {
|
| | | //显示右上角菜单界面
|
| | | this.ShowTopRightMenu();
|
| | | });
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 显示右上角菜单界面
|
| | | /// </summary>
|
| | | private void ShowTopRightMenu()
|
| | | {
|
| | | bool flage = UserCenterResourse.DicActionForm.ContainsKey("NewGateWayMenuSelectForm");
|
| | | var frame = new TopRightMenuControl(flage == true ? 1 : 3);
|
| | | //定位
|
| | | string MenuName = Language.StringByID(R.MyInternationalizationString.uFixedPosition);
|
| | | frame.AddRowMenu(MenuName, "Item/FixedPosition.png", "Item/FixedPositionSelected.png", () =>
|
| | | {
|
| | | //发送定位功能
|
| | | HdlGatewayLogic.Current.SetFixedPositionCommand(zbGateway);
|
| | | });
|
| | | if (flage == true)
|
| | | {
|
| | | //搜索网关的时候,不能删除,不给他切换
|
| | | return;
|
| | | }
|
| | |
|
| | | //切换
|
| | | MenuName = Language.StringByID(R.MyInternationalizationString.uSwitch1);
|
| | | string strWayId = HdlGatewayLogic.Current.GetGatewayId(zbGateway);
|
| | | if (strWayId == GatewayResourse.AppOldSelectGatewayId)
|
| | | {
|
| | | MenuName = Language.StringByID(R.MyInternationalizationString.uRefresh);
|
| | | }
|
| | | frame.AddRowMenu(MenuName, "Item/GwSwitchIcon.png", "Item/GwSwitchIconSelected.png", () =>
|
| | | {
|
| | | string nameValue = HdlGatewayLogic.Current.GetGatewayName(zbGateway);
|
| | | //是否切换到{0}网关?
|
| | | string msg = string.Format(Language.StringByID(R.MyInternationalizationString.uConfirmWantToSwitchTheGateway), "[" + nameValue + "]");
|
| | | if (strWayId == GatewayResourse.AppOldSelectGatewayId)
|
| | | {
|
| | | //是否重新刷新{0}网关?
|
| | | msg = string.Format(Language.StringByID(R.MyInternationalizationString.uConfirmWantToRefreshTheGateway), "[" + nameValue + "]");
|
| | | }
|
| | | this.ShowMassage(ShowMsgType.Confirm, msg, () =>
|
| | | {
|
| | | HdlThreadLogic.Current.RunThread(() =>
|
| | | {
|
| | | //执行切换网关操作
|
| | | this.DoSwitchGateway();
|
| | | });
|
| | | });
|
| | | });
|
| | | //删除
|
| | | MenuName = Language.StringByID(R.MyInternationalizationString.uDelete);
|
| | | frame.AddRowMenu(MenuName, "Item/DeleteIcon2.png", "Item/DeleteIcon2Selected.png", () =>
|
| | | {
|
| | | //如移除网关,该网关绑定的设备列表{0}将清空,确认继续执行该操作?
|
| | | string msg = Language.StringByID(R.MyInternationalizationString.uUnBindedMsg);
|
| | | if (msg.Contains("{0}") == true)
|
| | | {
|
| | | msg = string.Format(msg, "\r\n");
|
| | | }
|
| | | this.ShowMassage(ShowMsgType.Confirm, msg, () =>
|
| | | {
|
| | | this.DeleteGateway(strWayId);
|
| | | });
|
| | | });
|
| | | }
|
| | | #endregion
|
| | |
|
| | | #region ■ 检测新版本_________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 检测新版本
|
| | | /// </summary>
|
| | | /// <param name="btnNewVersion">提示有新版本的控件</param>
|
| | | private async void CheckNewVersion(RowNewVersionTipView btnNewVersion)
|
| | | /// <param name="btnType">网关类型控件</param>
|
| | | private async void CheckNewVersion(PicViewControl btnNewVersion, FrameCaptionViewControl btnType)
|
| | | {
|
| | | //打开进度条
|
| | | this.ShowProgressBar();
|
| | |
|
| | | //获取网关版本信息
|
| | | var result = await HdlGatewayLogic.Current.GetGatewayAllNewVersion(this.zbGateway);
|
| | | if (result == null)
|
| | | {
|
| | | //关闭进度条
|
| | | this.CloseProgressBar(ShowReLoadMode.YES);
|
| | | return;
|
| | | }
|
| | | //关闭进度条
|
| | | this.CloseProgressBar();
|
| | |
|
| | | Application.RunOnMainThread(() =>
|
| | | {
|
| | | if (this.rowGateway != null)
|
| | | if (this.Parent != null)
|
| | | {
|
| | | //设置网关名称
|
| | | this.rowGateway.Text = HdlGatewayLogic.Current.GetGatewayName(zbGateway);
|
| | | HdlGatewayLogic.Current.SetGatewayImageText(btnType.txtView, this.zbGateway);
|
| | | if (result[0] != null || result[1] != null || result[2] != null)
|
| | | {
|
| | | //提示有新版本
|
| | |
| | | /// <summary>
|
| | | /// 完成按钮按下
|
| | | /// </summary>
|
| | | private void FinishButtonClick()
|
| | | /// <param name="gatewayName">网关名</param>
|
| | | private void FinishButtonClick(string gatewayName)
|
| | | {
|
| | | if (string.IsNullOrEmpty(this.rowGateway.Text) == true)
|
| | | if (string.IsNullOrEmpty(gatewayName) == true)
|
| | | {
|
| | | //请输入网关名称
|
| | | this.rowGateway.Text = string.Empty;
|
| | | string msg = Language.StringByID(R.MyInternationalizationString.uGatewayNameMastInput);
|
| | | this.ShowMassage(ShowMsgType.Error, msg);
|
| | | return;
|
| | | }
|
| | | string nameValue = HdlGatewayLogic.Current.GetGatewayName(zbGateway);
|
| | | if (nameValue == this.rowGateway.Text)
|
| | | if (nameValue == gatewayName)
|
| | | {
|
| | | //同名不需要处理
|
| | | this.CloseForm();
|
| | | return;
|
| | | }
|
| | | //修改名字
|
| | | this.SetGatewayName(this.rowGateway.Text);
|
| | | this.SetGatewayName(gatewayName, true);
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
| | | /// 设置网关名字
|
| | | /// </summary>
|
| | | /// <param name="gatewayName">网关名称</param>
|
| | | private async void SetGatewayName(string gatewayName)
|
| | | private async void SetGatewayName(string gatewayName, bool closeForm)
|
| | | {
|
| | | //打开进度条
|
| | | this.ShowProgressBar();
|
| | | //修改网关名
|
| | | var result = await HdlGatewayLogic.Current.ReName(zbGateway, gatewayName);
|
| | | //关闭进度条
|
| | | this.CloseProgressBar();
|
| | |
|
| | | //网关修改失败
|
| | | if (result == false)
|
| | | {
|
| | | return;
|
| | | }
|
| | | Application.RunOnMainThread(() =>
|
| | | if (closeForm == true)
|
| | | {
|
| | | //关闭界面
|
| | | this.CloseForm();
|
| | | }
|
| | | }
|
| | | #endregion
|
| | |
|
| | | #region ■ 网关切换___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 执行切换网关操作
|
| | | /// </summary>
|
| | | /// <param name="gatewayId"></param>
|
| | | /// <param name="online"></param>
|
| | | private async void DoSwitchGateway()
|
| | | {
|
| | | string gatewayId = HdlGatewayLogic.Current.GetGatewayId(zbGateway);
|
| | | var result = await HdlGatewayLogic.Current.DoSwitchGateway(gatewayId);
|
| | | if (result == false)
|
| | | {
|
| | | return;
|
| | | }
|
| | |
|
| | | HdlThreadLogic.Current.RunMain(() =>
|
| | | {
|
| | | //关闭自身
|
| | | this.CloseForm();
|
| | |
|
| | | //关闭指定界面(网关搜索)
|
| | | this.CloseFormByFormName("WiredGatewayListForm");
|
| | | this.CloseFormByFormName("NewGateWayMenuSelectForm");
|
| | |
|
| | | //关闭指定界面(网关编辑)
|
| | | this.CloseFormByFormName("GatewayListForm");
|
| | |
|
| | | if (UserCenterResourse.DicActionForm.ContainsKey("DeviceListMainForm") == false)
|
| | | {
|
| | | //刷新主画面
|
| | | var form = new Device.DeviceListMainForm();
|
| | | form.AddForm();
|
| | | }
|
| | | else
|
| | | {
|
| | | //刷新主画面(不重新获取设备状态)
|
| | | this.LoadFormMethodByName("DeviceListMainForm", "InitMiddleFrame", false);
|
| | | }
|
| | | });
|
| | | }
|
| | |
|
| | | #endregion
|
| | |
|
| | | #region ■ 解绑网关___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 解绑网关
|
| | | /// </summary>
|
| | | /// <param name="strWayId"></param>
|
| | | /// <param name="row"></param>
|
| | | private async void DeleteGateway(string strWayId)
|
| | | {
|
| | | //删除云端网关
|
| | | bool result = await HdlGatewayLogic.Current.DeleteGateway(strWayId);
|
| | | if (result == false)
|
| | | {
|
| | | return;
|
| | | }
|
| | |
|
| | | if (strWayId == GatewayResourse.AppOldSelectGatewayId)
|
| | | {
|
| | | HdlGatewayLogic.Current.SaveGatewayIdToLocation(string.Empty);
|
| | | }
|
| | | //关闭自身
|
| | | this.CloseForm();
|
| | | }
|
| | |
|
| | | #endregion
|
| | | }
|
| | | }
|