Commit 75d50573 刘韬

1

1 个父辈 233ceb77
正在显示 49 个修改的文件 包含 2853 行增加535 行删除
......@@ -11,6 +11,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DeviceLibrary", "DeviceLibr
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TheMachine", "TheMachine\TheMachine.csproj", "{61FDFF14-8BB7-439A-85A0-592E3011F4C4}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteSheardObject", "RemoteSheardObject\RemoteSheardObject.csproj", "{49004F82-8AEE-46DA-BB14-BD02AC990CE2}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
......@@ -33,6 +35,10 @@ Global
{61FDFF14-8BB7-439A-85A0-592E3011F4C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
{61FDFF14-8BB7-439A-85A0-592E3011F4C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{61FDFF14-8BB7-439A-85A0-592E3011F4C4}.Release|Any CPU.Build.0 = Release|Any CPU
{49004F82-8AEE-46DA-BB14-BD02AC990CE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{49004F82-8AEE-46DA-BB14-BD02AC990CE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
{49004F82-8AEE-46DA-BB14-BD02AC990CE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49004F82-8AEE-46DA-BB14-BD02AC990CE2}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
......
......@@ -180,7 +180,8 @@ namespace OnlineStore
if ((strCurLanguage == null || strCurLanguage.Equals("")) && (!defaultStr.Equals("")))
{
strCurLanguage = defaultStr;
NoIdLog(id, defaultStr);
if (HasChinese(defaultStr))
NoIdLog(id, defaultStr);
}
}
catch (Exception ex)
......@@ -305,7 +306,7 @@ namespace OnlineStore
if (Con_GetTxt(con, out txt))
{
if (HasChinese(txt))
//if (HasChinese(txt))
{
newStr = GetString(GetTextIdStr(className, con.Name), txt);
if (!newStr.Equals(""))
......
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.IO;
using System.Linq;
using System.Net;
......@@ -104,13 +105,41 @@ namespace OnlineStore.Common
}
catch (Exception e)
{
LogUtil.error("POST ERROR:" + e.ToString()+"\r\n"+ url, 101);
LogUtil.error("POST ERROR:" + e.ToString() + "\r\n" + url, 101);
}
return result;
}
public static string Post(string url, NameValueCollection paramData, int timeOut = 10000)
{
string result = "";
if (url.ToLower().IndexOf("https", System.StringComparison.Ordinal) > -1)
{
ServicePointManager.ServerCertificateValidationCallback =
new RemoteCertificateValidationCallback((sender, certificate, chain, errors) => { return true; });
}
try
{
using (var wc = new MyWebClient(timeOut))
{
byte[] buf = wc.UploadValues(url, "POST", paramData);
result = Encoding.UTF8.GetString(buf);
}
//LogUtil.info(result);
}
catch (Exception e)
{
LogUtil.error("POST ERROR:" + e.ToString() + "\r\n" + url, 101);
}
return result;
}
static object lockpost = new object();
public static Operation Post(string url, Operation operation,int timeout=5000, bool printlog=false)
public static Operation Post(string url, Operation operation, int timeout = 5000, bool printlog = false)
{
try
{
......
......@@ -47,6 +47,9 @@
<Reference Include="ConfigHelper">
<HintPath>..\..\ConfigHelper\ConfigHelper\bin\Debug\ConfigHelper.dll</HintPath>
</Reference>
<Reference Include="Fleck, Version=1.2.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\Fleck.1.2.0\lib\net45\Fleck.dll</HintPath>
</Reference>
<Reference Include="halcondotnet">
<HintPath>..\..\RC1271-DUOStore\dll\halcondotnet.dll</HintPath>
</Reference>
......@@ -91,7 +94,6 @@
<Compile Include="DeviceLibrary\AxisBean.cs" />
<Compile Include="theMachine\Common.cs" />
<Compile Include="theMachine\JobList.cs" />
<Compile Include="theMachine\LabelParam.cs" />
<Compile Include="theMachine\DeviceRunControl.cs" />
<Compile Include="theMachine\MainMachine _BtnProcess.cs" />
<Compile Include="theMachine\DeviceBase.cs" />
......@@ -102,6 +104,7 @@
<Compile Include="theMachine\MoveStep.cs" />
<Compile Include="DeviceLibrary\AlarmBuzzer.cs" />
<Compile Include="DeviceLibrary\CodeManager.cs" />
<Compile Include="theMachine\RemoteService.cs" />
<Compile Include="theMachine\RobotManage.cs" />
<Compile Include="theMachine\IRobot.cs" />
<Compile Include="DeviceLibrary\IAxisManager.cs" />
......@@ -155,6 +158,10 @@
<Project>{064bebf5-8faa-4ea2-a5f3-a06e6e7d9251}</Project>
<Name>LoadCSVLibrary</Name>
</ProjectReference>
<ProjectReference Include="..\RemoteSheardObject\RemoteSheardObject.csproj">
<Project>{49004f82-8aee-46da-bb14-bd02ac990ce2}</Project>
<Name>RemoteSheardObject</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<None Include="Config\general.config">
......
......@@ -29,7 +29,7 @@ namespace DeviceLibrary
moveInfo.WaitList.Add(WaitResultInfo.WaitIO(Low, IO_VALUE.LOW));
moveInfo.WaitList.Add(WaitResultInfo.WaitIO(High, IO_VALUE.HIGH));
}
Resume();
Resume(false);
LogUtil.info($"{Name},设置{High}=High");
}
public void ToLow(MoveInfo moveInfo)
......@@ -40,7 +40,7 @@ namespace DeviceLibrary
moveInfo.WaitList.Add(WaitResultInfo.WaitIO(Low, IO_VALUE.HIGH));
moveInfo.WaitList.Add(WaitResultInfo.WaitIO(High, IO_VALUE.LOW));
}
Resume();
Resume(false);
LogUtil.info($"{Name},设置{High}=Low");
}
......@@ -51,11 +51,11 @@ namespace DeviceLibrary
LogUtil.info($"{Name},没有在运行");
return;
}
else if (currentIOvalue == IO_VALUE.HIGH && IOManager.IOValue(High).Equals(IO_VALUE.HIGH))
else if (currentIOvalue == IO_VALUE.HIGH && IOManager.IOValue(High, DeviceGroup).Equals(IO_VALUE.HIGH))
{
LogUtil.info($"{Name},currentIOvalue:{currentIOvalue},暂停是IO已到位");
return;
}else if (currentIOvalue == IO_VALUE.LOW && IOManager.IOValue(Low).Equals(IO_VALUE.HIGH))
}else if (currentIOvalue == IO_VALUE.LOW && IOManager.IOValue(Low, DeviceGroup).Equals(IO_VALUE.HIGH))
{
LogUtil.info($"{Name},currentIOvalue:{currentIOvalue},暂停是IO已到位");
return;
......@@ -65,13 +65,14 @@ namespace DeviceLibrary
IOManager.IOMove(High, IO_VALUE.LOW, DeviceGroup);
}
public void Resume()
public void Resume(bool islog=true)
{
if (currentIOvalue == IO_VALUE.None)
return;
IOManager.IOMove(Low, currentIOvalue == IO_VALUE.LOW ? IO_VALUE.HIGH : IO_VALUE.LOW, DeviceGroup);
IOManager.IOMove(High, currentIOvalue == IO_VALUE.HIGH ? IO_VALUE.HIGH : IO_VALUE.LOW, DeviceGroup);
LogUtil.info($"{Name},恢复运行");
if (islog)
LogUtil.info($"{Name},恢复运行");
}
}
......
......@@ -22,7 +22,7 @@ namespace DeviceLibrary
public static void IOMove(string ioType, IO_VALUE ioValue,string device="root")
{
if (StoreManager.Config.DOList.ContainsKey(ioType))
if (StoreManager.Config.DOList[device].ContainsKey(ioType))
{
ConfigIO configIo = StoreManager.Config.DOList[device][ioType];
instance.WriteSingleDO(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr(), ioValue);
......@@ -30,7 +30,7 @@ namespace DeviceLibrary
}
else
{
LogUtil.error("没有DO=" + ioType);
LogUtil.error("没有DO="+ device + ":" + ioType);
}
}
......@@ -43,14 +43,14 @@ namespace DeviceLibrary
ioValue = instance.GetDIValue(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr());
//UpdateDoValue(ioType, ioValue);
}
else if (StoreManager.Config.DOList.ContainsKey(ioType))
else if (StoreManager.Config.DOList[device].ContainsKey(ioType))
{
ConfigIO configIo = StoreManager.Config.DOList[device][ioType];
ioValue = instance.GetDOValue(configIo.DeviceName, configIo.SlaveID, configIo.GetIOAddr());
}
else
{
LogUtil.error("没有DO=" + ioType);
LogUtil.error("没有DO="+ device + ":" + ioType);
}
return ioValue;
}
......
......@@ -9,7 +9,7 @@ namespace DeviceLibrary
interface ISafetyDevice
{
void Pause();
void Resume();
void Resume(bool islog);
}
class SafetyDevice
......@@ -23,7 +23,7 @@ namespace DeviceLibrary
List.ForEach(x => x.Pause());
}
public static void ResumeAll() {
List.ForEach(x => x.Resume());
List.ForEach(x => x.Resume(true));
}
......
......@@ -69,7 +69,7 @@ namespace DeviceLibrary
LogUtil.info(Name + $" 线体管理器 暂停线体.");
}
}
public void Resume() {
public void Resume(bool islog=true) {
if (pauseTime != DateTime.MinValue)
{
......@@ -87,7 +87,7 @@ namespace DeviceLibrary
}
pauseTime = DateTime.MinValue;
lineTimer.Enabled = true;
if (linrunlist.Count > 0)
if (linrunlist.Count > 0 && islog)
LogUtil.info(Name + $" 线体管理器 恢复运行线体.");
}
......
......@@ -4,6 +4,7 @@ using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading;
......@@ -45,7 +46,8 @@ namespace DeviceLibrary
{
//if (!RobotManage.isRunning)
// ProcessMsg(MsgService.MSList);
SendLineStatus();
if (!string.IsNullOrWhiteSpace(server))
SendLineStatus();
}
catch (Exception ex)
{
......@@ -163,15 +165,6 @@ namespace DeviceLibrary
lineOperation.status = (int)storeStatus;
//判断如果是等待料盘拿走超时,状态改为4Warning
//if (alarmType.Equals(StoreAlarmType.IoSingleTimeOut) && StoreMove.MoveType.Equals(StoreMoveType.OutStore))
//{
// if (StoreMove.MoveStep.Equals(StoreMoveStep.SO_15_WaitTake) || StoreMove.MoveStep.Equals(StoreMoveStep.SO_16_CheckIsTake))
// {
// lineOperation.status = (int)StoreStatus.Warning;
// }
//}
BoxStatus boxStatus = new BoxStatus();
boxStatus.boxId = StoreID;
boxStatus.humidity = HumitureController.LastData.Humidity.ToString();
......@@ -208,6 +201,23 @@ namespace DeviceLibrary
return lineOperation;
}
private static string api_communication = "service/store/communication"; //流水线状态通信接口
public static string GetPostApi(string api)
{
var host = server;
if (!host.StartsWith("http://"))
{
host = "http://" + host;
}
if (!host.EndsWith("/"))
{
host = host + "/";
}
if (api.StartsWith("/"))
{
api = api.Substring(1);
}
return host + api;
}
public static string GetPostApi()
{
var host = server;
......@@ -234,16 +244,7 @@ namespace DeviceLibrary
DateTime time = DateTime.Now;
//构建发送给服务器的对象
Operation lineOperation = getLineBoxStatus();
//如果还没湿度范围,先获取
if (getthtime < 3)
{
if (Max_Humidity <= 0 || (Max_Temperature <= 0))
{
lineOperation.op = 5;
LogUtil.info(StoreName + "没有湿度预警范围,需要从服务器获取,发送OP=" + lineOperation.op);
getthtime++;
}
}
if (lineOperation.status != laststatus) {
......@@ -273,23 +274,6 @@ namespace DeviceLibrary
//判断服务端是否返回出库操作
return;
}
if (resultOperation.op.Equals(1))
{
var barcode = "";
if (resultOperation.data.ContainsKey("code"))
barcode = resultOperation.data["code"];
ReviceInStoreProcess(barcode, resultOperation);
}
else if (resultOperation.op.Equals(2))
{
ReviceOutStoreProcess(resultOperation);
}
else if (resultOperation.op.Equals(5))
{
//ProcessHumidityCMD(resultOperation);
}
ProcessHumidityCMD(resultOperation);
if (resultOperation.data != null)
{
string result = "";
......@@ -311,165 +295,8 @@ namespace DeviceLibrary
//SendLineStatus(result);
}
}
/// <summary>
/// 处理服务器入库库位消息
/// </summary>
/// <param name="message"></param>
/// <param name="resultOperation"></param>
private void ReviceInStoreProcess(string message, Operation resultOperation)
{
Dictionary<string, string> data = resultOperation.data;
if (data != null && data.ContainsKey(ParamDefine.posId) && data.ContainsKey(ParamDefine.plateH) && data.ContainsKey(ParamDefine.plateW))
{
//服务器返回时有:posId库位编号,plateW:料盘宽度,plateH:料盘高度,
//postId格式BoxId#位置
string posId = data[ParamDefine.posId];
int.TryParse(data[ParamDefine.plateW], out int plateW);
int.TryParse(data[ParamDefine.plateH], out int plateH);
//string[] posArray = posId.Split('#');
//if (!(posArray.Length == 2))
//{
// WarnMsg = StoreName + "入库库位格式错误:二维码【" + message + "】库位【" + posId + "】";
// //SetWarnMsg(ResourceControl.InStoreError, message, posId);
// LogUtil.error("服务器反馈 入库库位格式错误:二维码【" + message + "】库位【" + posId + "】");
// return;
//}
//int storeId = int.Parse(posArray[0]);
//根据发送的posId获取位置列表
ACStorePosition position = CSVPositionReader<ACStorePosition>.GetPositon(posId);
if (position == null)
{
//出入库没有找到服务器发送的库位,需要打印日志方便查询原因
//SetWarnMsg(ResourceControl.InStoreNoPosition, message, posId);
WarnMsg = crc.GetString("Res0156","入库未找到库位:") + posId;//0505
LogUtil.info("收到服务器入库命令:入库未找到库位:二维码【" + message + "】库位【" + posId + "】");
return;
}
//TODO:判断BOX是否处于可以入库状态,如果调试或急停中,需要返回给服务器;
}
}
public float Max_Humidity;
public float Max_Temperature;
/// <summary>
/// 处理服务器温湿度消息
/// </summary>
/// <param name="resultOperation"></param>
private void ProcessHumidityCMD(Operation resultOperation)
{
if (resultOperation.data == null)
return;
Dictionary<string, string> data = resultOperation.data;
if (data.ContainsKey(ParamDefine.maxHumidity) && data.ContainsKey(ParamDefine.maxTemperature))
{
string maxHumidity = data[ParamDefine.maxHumidity];
string maxTemp = data[ParamDefine.maxTemperature];
LogUtil.info( "收到服务器温湿度预警值:maxHumidity=" + maxHumidity + ",maxTemperature=" + maxTemp);
try
{
this.Max_Humidity = (float)Convert.ToDouble(maxHumidity);
this.Max_Temperature = (float)Convert.ToDouble(maxTemp);
LogUtil.info( "保存温湿度预警值:Max_Humidity=" + Max_Humidity + ",Max_Temperature=" + Max_Temperature);
}
catch (Exception ex)
{
LogUtil.error("转换温湿度失败:" + ex.ToString());
}
}
}
/// <summary>
/// 处理服务器出库任务消息
/// </summary>
/// <param name="resultOperation"></param>
private void ReviceOutStoreProcess(Operation resultOperation)
{
DateTime time = DateTime.Now;
Dictionary<string, string> data = resultOperation.data;
if (data != null && data.ContainsKey(ParamDefine.posId)
&& data.ContainsKey(ParamDefine.plateH) && data.ContainsKey(ParamDefine.plateW))
{
string posIdStr = data[ParamDefine.posId];
string plateWStr = data[ParamDefine.plateW];
string plateHStr = data[ParamDefine.plateH];
string singleOut = data[ParamDefine.singleOut];
LogUtil.info("收到服务器出库消息:poaIs=" + posIdStr + ",platew=" + plateWStr + ",plateh=" + plateHStr + ",singleOut=" + singleOut);
char splitChar = '|';
string[] posIdArray = posIdStr.Split(splitChar);
string[] plateWArray = plateWStr.Split(splitChar);
string[] plateHArray = plateHStr.Split(splitChar);
string[] singleOutArray = singleOut.Split(splitChar);
int index = -1;
foreach (string posId in posIdArray)
{
index++;
int.TryParse(plateWArray[index], out int plateW);
int.TryParse(plateHArray[index], out int plateH);
bool isSingleOut = singleOutArray[index].ToLower().Equals("true");
//根据发送的posId获取位置列表
ACStorePosition position = CSVPositionReader<ACStorePosition>.GetPositon(posId);
if (position == null)
{
//出入库没有找到服务器发送的库位,需要打印日志方便查询原因
WarnMsg = StoreName + "出库未找库位:【" + posId + "】";
LogUtil.error( "收到服务器出库命令:未找到【" + posId + "】的库位信息");
continue;
}
else
{
//if (isSingleOut)
// RobotManage.mainMachine.AddSingleStoreTask(posId,plateW,plateH);
// else
// RobotManage.mainMachine.AddOutStoreTask(posId, plateW, plateH);
}
}
TimeSpan span = DateTime.Now - time;
if (span.TotalMilliseconds > 100)
{
LogUtil.info(StoreName + "执行 ReviceOutStoreProcess 共处理了【" + span.TotalMilliseconds + "】毫秒");
}
}
}
private static string Addr_cancelPutInTask = "/service/store/cancelPutInTask";
public string cancelPutInTask(string deviceName, string barcode)
{
string msg = "";
try
{
Dictionary<string, string> paramMap = new Dictionary<string, string>();
paramMap.Add("barcode", barcode);
string server = GetAddr(Addr_cancelPutInTask, paramMap);
DateTime startTime = DateTime.Now;
string resultStr = HttpHelper.Post(server, "");
LogUtil.info(deviceName + "cancelPutInTask " + FormUtil.GetSpanStr(DateTime.Now - startTime) + " 【" + server + "】【" + resultStr + "】");
ResultData data = JsonHelper.DeserializeJsonToObject<ResultData>(resultStr);
if (data == null)
{
return msg = deviceName + " cancelPutInTask【 " + barcode + "】 没有收到服务器反馈";
}
else if (data.code.Equals(0).Equals(false))
{
return msg = deviceName + " cancelPutInTask【 " + barcode + "】 :" + data.msg;
}
return "";
}
catch (Exception ex)
{
LogUtil.error(deviceName + " " + ex.ToString());
}
return msg;
}
private static string GetAddr(string addr, Dictionary<string, string> paramsMap)
{
if (server.EndsWith("/"))
......@@ -486,8 +313,17 @@ namespace DeviceLibrary
return path;
}
public static void UpdateRobotStatus(string code,RobotStatusE robotStatus,string trayrfid) {
NameValueCollection nameValue = new NameValueCollection();
nameValue.Add("code", code);
nameValue.Add("status", robotStatus.ToString());
nameValue.Add("locInfo", trayrfid);
var data = HttpHelper.Post(GetPostApi("/service/store/robotBox/emptyPosForPutin"), nameValue);
}
}
public class ResultData
{
//{"code":0,"msg":"ok","data":"7"}
......
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Fleck" version="1.2.0" targetFramework="net461" />
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net461" />
<package id="System.ValueTuple" version="4.5.0" targetFramework="net461" />
</packages>
\ No newline at end of file
......@@ -15,6 +15,16 @@ namespace DeviceLibrary
{
public class Common
{
public static string RfidFilter(byte[] data) {
var rfid = Encoding.ASCII.GetString(data).Trim();
if (rfid.StartsWith("Z")) {
rfid=rfid.Substring(1);
}
rfid = rfid.Trim();
return rfid.Trim('\x00');
}
/**获取角度*/
// 求3点形成的夹角
public static float getAngle2(Point pt1, Point pt2, Point pt0)
......
......@@ -12,14 +12,16 @@ namespace DeviceLibrary
{
public class DeviceBase
{
public string CurrrentRFID = "";
public TrayInfo CurrrentTrayInfo { get => TrayManager.Traylist[CurrrentRFID]; }
public MsgService Msg { get; set; }
public string Name { get; set; }
public string GroupName { get; set; }
public void StopMove(bool ServoOff=false)
public void StopMove(bool ServoOff = false)
{
//runStatus = RunStatus.Stop;
MoveInfo.List.ForEach((m)=> { m.EndMove(); });
MoveInfo.List.ForEach((m) => { m.EndMove(); });
if (AxisBean.List.ContainsKey(GroupName))
AxisBean.StopMultiAxis(AxisBean.List[GroupName]);
......@@ -31,12 +33,18 @@ namespace DeviceLibrary
}
public void OpenAllServo()
{
AxisBean.RunMultiAxis(true, out _, AxisBean.List[GroupName]);
if (AxisBean.List.ContainsKey(GroupName))
AxisBean.RunMultiAxis(true, out _, AxisBean.List[GroupName]);
else
LogUtil.info($"{GroupName},没有伺服");
}
int logType = 1000;
string WarnMsg = "";
public bool CheckWait(MoveInfo MoveInfo)
{
if (Msg == null) {
LogUtil.info("msg为空");
}
//当等待超过一分钟时,需要打印提示
TimeSpan span = DateTime.Now - MoveInfo.LastSetpTime;
string NotOkMsg = "";
......@@ -61,11 +69,11 @@ namespace DeviceLibrary
{
if (wait.IsEnd)
{
if(!wait.WaitType.Equals(WaitEnum.W002_IOValue))
if (!wait.WaitType.Equals(WaitEnum.W002_IOValue))
{
continue;
}
}
NotOkMsg = wait.ToStr();
if (wait.WaitType.Equals(WaitEnum.W001_AxisMove))
......@@ -91,15 +99,17 @@ namespace DeviceLibrary
else if (wait.WaitType.Equals(WaitEnum.W002_IOValue))
{
ConfigIO io = RobotManage.Config.GetWaitIO(wait.IoType, GroupName);
NotOkMsg = MoveInfo.Name + crc.GetString("Res0157","等待")+"【" + io.DisplayStr + "】=【" + wait.IoValue + "】";
wait.IsEnd = IOManager.IOValue(wait.IoType).Equals(wait.IoValue);
if (io == null)
throw new Exception($"找不到io:{wait.IoType},{GroupName}");
NotOkMsg = MoveInfo.Name + crc.GetString("Res0157", "等待") + "【" + io.DisplayStr + "】=【" + wait.IoValue + "】";
wait.IsEnd = IOManager.IOValue(wait.IoType, GroupName).Equals(wait.IoValue);
if (!wait.IsEnd)
{
int timeOutMs = RobotManage.Config.IOSingle_TimerOut * 1000;
if (span.TotalMilliseconds > timeOutMs && NoAlarm())
{
WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveStep + "] "+ crc.GetString("Res0157","等待")+"(" + io.DisplayStr + "=" + wait.IoValue + $")"+ crc.GetString("Res0158","超时");
WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveStep + "] " + crc.GetString("Res0157", "等待") + "(" + io.DisplayStr + "=" + wait.IoValue + $")" + crc.GetString("Res0158", "超时");
Msg.add(WarnMsg, MsgLevel.alarm);
if (NoAlarm())
......@@ -125,7 +135,7 @@ namespace DeviceLibrary
wait.IsEnd = wait.Action.Invoke(wait);
LogUtil.info($"{Name} 自定义等待 IsEnd={wait.IsEnd},Type={wait.Action.GetType()}");
}
if (wait.IsEnd)
{
......@@ -151,7 +161,7 @@ namespace DeviceLibrary
}
else if (span.TotalSeconds > MoveInfo.TimeOutSeconds)
{
WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveStep + "]"+crc.GetString("Res0157","等待") + NotOkMsg + crc.GetString("Res0158","超时");
WarnMsg = MoveInfo.Name + "[" + MoveInfo.MoveStep + "]" + crc.GetString("Res0157", "等待") + NotOkMsg + crc.GetString("Res0158", "超时");
int second = (int)(MoveInfo.TimeOutSeconds / span.TotalSeconds) * 10;
if (second > 120)
......@@ -237,7 +247,7 @@ namespace DeviceLibrary
moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IoHighType, IO_VALUE.HIGH));
}
}
public IO_VALUE IOValue(string ioType) => IOManager.IOValue(ioType,GroupName);
public IO_VALUE IOValue(string ioType) => IOManager.IOValue(ioType, GroupName);
public void IOMove(string IoType, IO_VALUE value, int msTime = 0)
{
if (msTime <= 0)
......@@ -246,7 +256,7 @@ namespace DeviceLibrary
}
else
{
Task.Run(()=>
Task.Run(() =>
{
IOManager.IOMove(IoType, value, GroupName);
Thread.Sleep(msTime);
......@@ -259,21 +269,5 @@ namespace DeviceLibrary
}
}
public enum StringStateE
{
None=0,
InStore,
OutStore,
Full,
ManualOut
}
public enum StringTypeE
{
None=0,
In,
Out
}
}
}
\ No newline at end of file
......@@ -55,6 +55,7 @@ namespace DeviceLibrary
msg += m;
TrayStop.Init(Config, DeviceGroup, out m);
msg += m;
TrayManager.Init(DeviceGroup);
#region 初始化led
RunningLed = new Led(Config.DOList["root"][IO_Type.Run_Led].GetIOAddr(), LedColor.green);
StandbyLed = new Led(Config.DOList["root"][IO_Type.Standby_Led].GetIOAddr(), LedColor.yellow);
......@@ -147,9 +148,10 @@ namespace DeviceLibrary
public void Start() {
Run();
}
public void Stop() {
public void Stop() {
mstart = false;
IOMove(IO_Type.Line_Run, IO_VALUE.LOW);
ResetEvent.Set();
Alarm(AlarmType.None);
StopMove(true);
LedProcess(null);
......@@ -164,6 +166,8 @@ namespace DeviceLibrary
Alarm(AlarmType.None);
runStatus = RunStatus.HomeReset;
SideMove.DeviceList.Values.ToList().ForEach(s => s.Start());
TransplantMove.DeviceList.Values.ToList().ForEach(s => s.Start());
TrayStop.DeviceList.Values.ToList().ForEach(s => s.Start());
}
......@@ -173,6 +177,7 @@ namespace DeviceLibrary
bool ok = true;
if (!lastSafeCheckStatus && ok)
{
IOMove(IO_Type.Line_Run, IO_VALUE.HIGH);
SafetyDevice.ResumeAll();
}
lastSafeCheckStatus = ok;
......
......@@ -155,6 +155,7 @@ namespace DeviceLibrary
wait.WaitType = WaitEnum.W002_IOValue;
wait.IoType = ioType;
wait.IoValue = ioValue;
//wait.Devicegroup = devicegroup;
return wait;
}
public static WaitResultInfo WaitAxis(ConfigMoveAxis axis, int targetPosition, int targetSpeed)
......@@ -295,7 +296,8 @@ namespace DeviceLibrary
/// <summary>
/// IO类型
/// </summary>
public String IoType { get; set; }
public string IoType { get; set; }
public string Devicegroup { get; set; }
/// <summary>
/// IO值
/// </summary>
......
......@@ -42,6 +42,7 @@ namespace DeviceLibrary
SideMove_11,
SideMove_12,
SideMove_13,
SideMove_13_2,
SideMove_14,
SideMove_15,
SideMove_16,
......@@ -55,8 +56,8 @@ namespace DeviceLibrary
TrayStop_05,
TrayStop_06,
TrayStop_07,
TrayStop_WaitLoadLeave,
TrayStop_LoadLeaved,
TrayStop_WaitLoadProcess,
TrayStop_LoadProcessed,
TransplantMove_01,
TransplantMove_02,
......@@ -76,7 +77,16 @@ namespace DeviceLibrary
TransplantMove_16,
TransplantMove_17,
TransplantMove_18,
TransplantMove_19,
TransplantMove_20,
TransplantMove_21,
TransplantMove_22,
TransplantMove_23,
TransplantMove_24,
TransplantMove_25,
TransplantMove_26,
TransplantMove_27,
TransplantMove_28,
TransplantMove_29,
TransplantMove_30,
TransplantMove_31,
TransplantMove_32,
......
using Fleck;
using Newtonsoft.Json;
using OnlineStore.Common;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DeviceLibrary
{
public static class RemoteService
{
/// <summary>
/// deviceGroupName
/// </summary>
static Dictionary<string,IWebSocketConnection> allClients;
static WebSocketServer server;
public static void Init() {
FleckLog.Level = LogLevel.Debug;
allClients = new Dictionary<string, IWebSocketConnection>();
server = new WebSocketServer("ws://0.0.0.0:26901");
server.Start(client =>
{
client.OnOpen = () =>
{
var deviceGroupName = client.ConnectionInfo.Path.Substring(1);
LogUtil.info($"客户端OnOpen:{deviceGroupName}");
lock (allClients)
{
if (allClients.ContainsKey(deviceGroupName))
allClients.Add(deviceGroupName, client);
else
allClients.Add(deviceGroupName,client);
}
};
client.OnClose = () =>
{
var deviceGroupName = client.ConnectionInfo.Path.Substring(1);
LogUtil.info($"客户端OnClose:{deviceGroupName}");
lock (allClients)
{
allClients.Remove(deviceGroupName);
}
};
client.OnMessage = message =>
{
var deviceGroupName = client.ConnectionInfo.Path.Substring(1);
//SetINCall(deviceGroupName, JsonConvert.DeserializeObject<RemoteLoad>(message));
ProcessMessage(deviceGroupName,message);
};
});
}
static volatile RemoteResult lastresult = RemoteResult.None;
static void ProcessMessage(string deviceGroupName, string message) {
bool isok = true;
try
{
lastresult = RemoteResult.None;
var remoteLoad = JsonConvert.DeserializeObject<RemoteLoad>(message);
switch (remoteLoad.Action)
{
case "SetTrayRequest":
TrayManager.SetTrayRequest(remoteLoad);
break;
case "TrayRelease":
TrayManager.TrayRelease(remoteLoad);
break;
case "OK":
case "FAIL":
lastresult = remoteLoad.Action == "OK" ? RemoteResult.True : RemoteResult.False;
LogUtil.info("Revice Command Callback:" + remoteLoad.GroupName + " - " + remoteLoad.Action);
return;
default:
break;
}
}
catch(Exception e) {
isok = false;
LogUtil.info("Remote process error:"+e.ToString());
}
SendResult(deviceGroupName, isok);
}
public static void SendMessage(string deviceGroupName,RemoteLoad message) {
if (!allClients.ContainsKey(deviceGroupName))
{
LogUtil.info($"设备:{deviceGroupName} 不在线");
return;
}
try
{
allClients[deviceGroupName].Send(JsonConvert.SerializeObject(message));
}
catch (Exception ex){
LogUtil.info($"设备:{deviceGroupName} 消息发送出错:"+ex.ToString());
}
}
public static RemoteResult SendAndWait(string GroupName, RemoteLoad remoteLoad, int waittime = 3000)
{
remoteLoad.GroupName = GroupName;
if (remoteLoad.RequestLoadInfo != null && string.IsNullOrEmpty(remoteLoad.RequestLoadInfo.DeviceGroupName))
remoteLoad.RequestLoadInfo.DeviceGroupName = GroupName;
LogUtil.info($"{GroupName},发送:{remoteLoad.Action}");
SendMessage(GroupName, remoteLoad);
return WaitResult(waittime);
}
static RemoteResult WaitResult(int waittime = 3000)
{
while (lastresult == RemoteResult.None && waittime > 0)
{
System.Threading.Thread.Sleep(50);
waittime = waittime - 50;
}
if (lastresult == RemoteResult.None)
{
LogUtil.info("等待远程反馈超时");
lastresult = RemoteResult.Timeout;
}
return lastresult;
}
public static void SendResult(string deviceGroupName, bool result)
{
RemoteLoad remoteLoad = new RemoteLoad();
remoteLoad.Action = result?"OK":"FAIL";
remoteLoad.GroupName = deviceGroupName;
SendMessage(deviceGroupName, remoteLoad);
}
}
}
......@@ -48,6 +48,7 @@ namespace DeviceLibrary
IsLoadOk = false;
msg += crc.GetString("Res0180","找不到库位配置文件")+ "\n";
}
RemoteService.Init();
mainMachine = new MainMachine(out string m);
if (!string.IsNullOrWhiteSpace(m)) {
IsLoadOk = false;
......
......@@ -9,7 +9,7 @@ using System.Threading.Tasks;
namespace DeviceLibrary
{
public partial class TrayManager
public static partial class TrayManager
{
public static Dictionary<string,TrayInfo> Traylist = new Dictionary<string,TrayInfo>();
/// <summary>
......@@ -22,7 +22,7 @@ namespace DeviceLibrary
public static bool Process(string rfid, int addr, out TrayInfo trayInfo) {
lock (Traylist)
{
LogUtil.info($"处理RFID:{rfid},地址{addr},设备:{AddrDesc[addr]}");
LogUtil.info($"处理RFID:{rfid},地址{addr},设备:{(AddrDesc.ContainsKey(addr)? AddrDesc[addr]:"")}");
if (!Traylist.ContainsKey(rfid))
{
Traylist.Add(rfid, new TrayInfo());
......@@ -32,12 +32,160 @@ namespace DeviceLibrary
Traylist[rfid].LastAddr = addr;
Traylist[rfid].Destination = TrayManager.AddrDesc[Traylist[rfid].DestinationAddr];
Traylist[rfid].LastPosition = TrayManager.AddrDesc[Traylist[rfid].LastAddr];
trayInfo = Traylist[rfid];
Statistics();
//Statistics();
}
return true;
}
public static void SetTrayLoadInfo(string rfid, RequestLoadInfo requestLoadInfo)
{
lock (Traylist)
{
LogUtil.info($"SetTrayLoadInfo:{rfid},{requestLoadInfo?.LoadParam?.ToStr()},{requestLoadInfo?.DeviceGroupName}");
if (requestLoadInfo == null)
{
Traylist[rfid].SetToEmpty();
}
else
{
Traylist[rfid].LoadType = (TrayTypeE)Enum.Parse(typeof(TrayTypeE), requestLoadInfo.TrayType);
Traylist[rfid].TrayParam = requestLoadInfo.LoadParam.clone();
Traylist[rfid].DestinationAddr = GetAddrByGroupName(requestLoadInfo.DeviceGroupName);
}
}
}
/// <summary>
/// deviceGroupName,RequestLoadInfo
/// </summary>
public static Dictionary<string, RequestLoadInfo> TrayRequest = new Dictionary<string, RequestLoadInfo>();
public static bool HasTrayRequest(string deviceGroupName,string rfid,out ReelParam reelParam)
{
reelParam = null;
LogUtil.info($"HasTrayRequest:{deviceGroupName},{rfid},{TrayRequest.ContainsKey(deviceGroupName)}");
lock (TrayRequest)
{
if (!TrayRequest.ContainsKey(deviceGroupName))
return false;
bool hasrequest = rfid.StartsWith(TrayRequest[deviceGroupName].TrayType, true, null);
if (hasrequest)
{
reelParam = TrayRequest[deviceGroupName].LoadParam?.clone();
TrayRequest.Remove(deviceGroupName);
return true;
}
else
return false;
}
}
public static void ClearTrayRequest(string deviceGroupName)
{
lock (TrayRequest)
{ TrayRequest.Remove(deviceGroupName); }
}
/// <summary>
/// 设置托盘需求
/// </summary>
/// <param name="requestLoadInfo"></param>
public static void SetTrayRequest(RemoteLoad remoteLoad)
{
LogUtil.info($"SetTrayRequest:{remoteLoad.GroupName}=>{remoteLoad.RequestLoadInfo.DeviceGroupName},{remoteLoad.RequestLoadInfo.TrayType}");
lock (TrayRequest)
{
if (!TrayRequest.ContainsKey(remoteLoad.GroupName))
TrayRequest.Add(remoteLoad.GroupName, remoteLoad.RequestLoadInfo);
TrayRequest[remoteLoad.GroupName] = remoteLoad.RequestLoadInfo;
}
}
public static bool CalcNeedTrans(int curaddr1, int destaddr1, bool hasload) {
if (!hasload)
{
var addrs = TrayRequest.Values.Select(x => new { TaryType = x.GetTrayType, Addr = GetAddrByGroupName(x.DeviceGroupName) }).ToList();
foreach (var a in addrs)
{
var trayaddrs = TrayManager.Traylist.Values.Where(t => (DateTime.Now - t.LastUpdateTime).TotalSeconds < 30 && t.TrayType == a.TaryType && !hasload).Select(t => t.LastAddr).ToList();
if (trayaddrs.Count == 0)
return false;
var ttt = 0;
if (curaddr1 == 9)
ttt = 15;
else if (curaddr1 == 4)
ttt = 19;
else if (curaddr1 == 19)
ttt = 4;
//当前托盘到需求距离
var ts = dis(a.Addr, ttt);
return !(trayaddrs.Where(t1 => dis(a.Addr, t1) < ts).Count() > 0);
};
return false;
}
else
return calc(curaddr1, destaddr1);
bool calc(int curaddr, int destaddr)
{
if (destaddr == -1)
return false;
if (curaddr == 9 && (destaddr > 15 || destaddr < 9))
return true;
if (curaddr == 4 && (destaddr > 19 || destaddr < 4))
return true;
if (curaddr == 19 && (destaddr > 4 && destaddr < 19))
return true;
return false;
}
int dis(int needa,int trayb) {
var d = needa - trayb;
if (d >= 0)
return d;
else
return d + 20;
}
}
public static void SetToEmpty(string rfid)
{
lock (Traylist)
{
LogUtil.info("清空托盘信息 RFID:" + rfid);
Traylist[rfid].SetToEmpty();
}
}
/// <summary>
/// 托盘释放
/// </summary>
/// <param name="requestLoadInfo"></param>
public static void TrayRelease(RemoteLoad remoteLoad)
{
var requestLoadInfo = remoteLoad.RequestLoadInfo;
LogUtil.info($"TrayRelease:{remoteLoad.GroupName}{requestLoadInfo.DeviceGroupName},{requestLoadInfo?.LoadParam.ToStr()}");
lock (requestLoadInfo)
{
var device = TrayStop.DeviceList[remoteLoad.GroupName];
if (requestLoadInfo.IsEmpty)
{
SetTrayLoadInfo(device.CurrrentRFID, null);
ServerCommunication.UpdateRobotStatus(requestLoadInfo.LoadParam.WareCode, RobotStatusE.FINISHED, remoteLoad.GroupName);
}
else {
SetTrayLoadInfo(device.CurrrentRFID, requestLoadInfo);
}
LogUtil.info("释放设备:"+device.GroupName);
device.TrayRelease();
}
}
/// <summary>
/// 空托盘数量
/// </summary>
......@@ -64,7 +212,7 @@ namespace DeviceLibrary
OfflineCount = 0;
lastrefresh = DateTime.Now;
Traylist.Values.ToList().ForEach(ti=> {
if ((lastrefresh - ti.LastUpdateTime).TotalSeconds > 10)
if ((lastrefresh - ti.LastUpdateTime).TotalSeconds > 15)
{
ti.isOnline = false;
OfflineCount++;
......@@ -80,7 +228,7 @@ namespace DeviceLibrary
});
}
}
public class TrayInfo {
string _rfid;
public string RFID { get => _rfid; set {
......@@ -99,26 +247,23 @@ namespace DeviceLibrary
public int DestinationAddr=-1;
public int LastAddr=-1;
public string LastPosition;
public bool HasLoad { get => LoadType == LoadTypeE.None; }
public LoadTypeE LoadType = LoadTypeE.None;
public bool HasLoad { get => LoadType != TrayTypeE.None; }
public TrayTypeE LoadType = TrayTypeE.None;
public TrayTypeE TrayType;
public DateTime LastUpdateTime;
public ReelParam ReelParam;
public DirectionE Direction { get => (Destination == "AMH-ML5-1" || Destination == "AMH-ML5-2") ? DirectionE.Out : DirectionE.In; }
public ReelParam TrayParam;
public bool SenSorStatus = false;
public DirectionE Direction { get => (Destination ==StoreCID.AMH_ML5_1 || Destination == StoreCID.AMH_ML5_2) ? DirectionE.Out : DirectionE.In; }
public bool isOnline = true;
public void SetToEmpty() {
LoadType = TrayTypeE.None;
DestinationAddr = -1;
TrayParam = new ReelParam();
SenSorStatus = false;
}
}
public enum LoadTypeE {
None,
MTP2, //流水线治具托盘
MTP1, //流水线料盘托盘
S007, //料串
M03, //Tray料格
M02, //PCB料格
M01, //PizzaBOX料格
M04, //ShoeBOX料格
}
public enum TrayTypeE
{
public enum MagzineTypeE {
C01, //PCB治具
C02, //Pizza治具
C03, //Tray治具
......@@ -128,38 +273,51 @@ namespace DeviceLibrary
{
In,Out
}
public partial class TrayManager
public static partial class TrayManager
{
public static Dictionary<LoadTypeE, string> LoadTypeDesc = new Dictionary<LoadTypeE, string>();
public static Dictionary<TrayTypeE, string> TrayTypeDesc = new Dictionary<TrayTypeE, string>();
public static Dictionary<int, string> AddrDesc = new Dictionary<int, string>();
static TrayManager() {
LoadTypeDesc.Add(LoadTypeE.None, crc.GetString("Res0002","空"));
LoadTypeDesc.Add(LoadTypeE.MTP2, crc.GetString("Res0003","流水线治具托盘"));
LoadTypeDesc.Add(LoadTypeE.MTP1, crc.GetString("Res0004","流水线料盘托盘"));
LoadTypeDesc.Add(LoadTypeE.S007, crc.GetString("Res0005","料串"));
LoadTypeDesc.Add(LoadTypeE.M03, crc.GetString("Res0006","Tray料格"));
LoadTypeDesc.Add(LoadTypeE.M02, crc.GetString("Res0007","PCB料格"));
LoadTypeDesc.Add(LoadTypeE.M01, crc.GetString("Res0008","PizzaBOX料格"));
LoadTypeDesc.Add(LoadTypeE.M04, crc.GetString("Res0009","ShoeBOX料格"));
TrayTypeDesc.Add(TrayTypeE.C01, crc.GetString("Res0010","PCB治具"));
TrayTypeDesc.Add(TrayTypeE.C02, crc.GetString("Res0011","Pizza治具"));
TrayTypeDesc.Add(TrayTypeE.C03, crc.GetString("Res0012","Tray治具"));
TrayTypeDesc.Add(TrayTypeE.C04, crc.GetString("Res0013","ShoeBOX治具"));
TrayTypeDesc.Add(TrayTypeE.None, crc.GetString("Res0002","空"));
TrayTypeDesc.Add(TrayTypeE.MTP1, crc.GetString("Res0003","流水线治具托盘"));
TrayTypeDesc.Add(TrayTypeE.MTP2, crc.GetString("Res0004","流水线料盘托盘"));
TrayTypeDesc.Add(TrayTypeE.S007, crc.GetString("Res0005","料串"));
TrayTypeDesc.Add(TrayTypeE.M03, crc.GetString("Res0006","Tray料格"));
TrayTypeDesc.Add(TrayTypeE.M02, crc.GetString("Res0007","PCB料格"));
TrayTypeDesc.Add(TrayTypeE.M01, crc.GetString("Res0008","PizzaBOX料格"));
TrayTypeDesc.Add(TrayTypeE.M04, crc.GetString("Res0009","ShoeBOX料格"));
//TrayTypeDesc.Add(TrayTypeE.C01, crc.GetString("Res0010","PCB治具"));
//TrayTypeDesc.Add(TrayTypeE.C02, crc.GetString("Res0011","Pizza治具"));
//TrayTypeDesc.Add(TrayTypeE.C03, crc.GetString("Res0012","Tray治具"));
//TrayTypeDesc.Add(TrayTypeE.C04, crc.GetString("Res0013","ShoeBOX治具"));
}
public static void Init(Dictionary<string, DeviceGroup> deviceGroup) {
if (!AddrDesc.ContainsKey(-1))
AddrDesc.Add(-1, crc.GetString("Res0014", "未知"));
foreach (var dg in deviceGroup) {
AddrDesc.Add(-1, crc.GetString("Res0014","未知"));
if (dg.Value.addr_2 >= 0)
{
AddrDesc.Add(dg.Value.addr_1, dg.Value.GroupName + "-1");
AddrDesc.Add(dg.Value.addr_2, dg.Value.GroupName + "-2");
if (!AddrDesc.ContainsKey(dg.Value.addr_1))
AddrDesc.Add(dg.Value.addr_1, dg.Value.GroupName + "-1");
if (!AddrDesc.ContainsKey(dg.Value.addr_2))
AddrDesc.Add(dg.Value.addr_2, dg.Value.GroupName + "-2");
}
else {
AddrDesc.Add(dg.Value.addr_1, dg.Value.GroupName);
if (!AddrDesc.ContainsKey(dg.Value.addr_1))
AddrDesc.Add(dg.Value.addr_1, dg.Value.GroupName);
}
}
}
/// <summary>
/// 获取设备地址
/// </summary>
/// <returns></returns>
public static int GetAddrByGroupName(string groupname) {
var addr = AddrDesc.Where(a => a.Value == groupname).First();
return addr.Key;
}
}
}
\ No newline at end of file
......@@ -14,6 +14,7 @@ namespace DeviceLibrary
DeviceStateE DeviceState { get; set; }
void Start();
void Stop();
void TrayRelease();
}
public enum DeviceStateE
......
......@@ -30,7 +30,6 @@ namespace DeviceLibrary
CylinderManger Location_B = null;
public PuYueRFID_C2S RFID_1 = null;
public PuYueRFID_C2S RFID_2 = null;
MsgService Msg;
public LineRunMonitor Line;
LS_TypeE LS_Type = LS_TypeE.NoRfid;
public SideMove(DeviceGroup device,out string msg) {
......@@ -129,45 +128,51 @@ namespace DeviceLibrary
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_03);
IOMove(IO_Type.Ls_A_Front_Stop, IO_VALUE.HIGH, StopDelayMS);
IOMove(IO_Type.Ls_A_BufStop_Fwd, IO_VALUE.HIGH, StopBufDelayMS);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_A_Tray_Check, IO_VALUE.HIGH));
break;
case MoveStep.SideMove_03:
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_04);
IOMove(IO_Type.Ls_B_BufStop_Fwd, IO_VALUE.HIGH, 500);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
if (IOValue(IO_Type.Ls_A_Tray_Check).Equals(IO_VALUE.HIGH)) {
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_04);
IOMove(IO_Type.Ls_B_BufStop_Fwd, IO_VALUE.HIGH, 500);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
}
else if (LSAMoveInfo.IsTimeOut(10))
{
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_01);
}
break;
case MoveStep.SideMove_04:
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_05);
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_06);
Location_A.ToHigh(LSAMoveInfo);
Location_B.ToHigh(LSAMoveInfo);
break;
case MoveStep.SideMove_05:
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_06);
Line.LineRun("n",false, 999);
break;
case MoveStep.SideMove_06:
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_07);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_B_Tray_Check, IO_VALUE.HIGH));
Line.LineRun("n",false, 999);
break;
case MoveStep.SideMove_07:
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_08);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_B_Tray_Check, IO_VALUE.HIGH));
break;
case MoveStep.SideMove_08:
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_09);
Line.LineStop("n");
Location_A.ToLow(LSAMoveInfo);
Location_B.ToLow(LSAMoveInfo);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
break;
case MoveStep.SideMove_09:
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_10);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_B_Tray_Check, IO_VALUE.LOW));
Line.LineStop("n");
Location_A.ToLow(LSAMoveInfo);
Location_B.ToLow(LSAMoveInfo);
break;
case MoveStep.SideMove_10:
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_11);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Ls_B_Tray_Check, IO_VALUE.LOW));
break;
case MoveStep.SideMove_11:
LSAMoveInfo.NextMoveStep(MoveStep.SideMove_12);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
break;
case MoveStep.SideMove_12:
LSAMoveInfo.NewMove(MoveStep.SideMove_01);
break;
}
......@@ -187,6 +192,9 @@ namespace DeviceLibrary
var Ls_A_Stop = $"Ls_{side}_Stop";
var Ls_A_BufStop_Rwd = $"Ls_{side}_BufStop_Rwd";
var Ls_A_Tray_Check = $"Ls_{side}_Tray_Check";
var Location_a = Minfo == LSAMoveInfo ? Location_A: Location_B;
var Location_b = Minfo == LSAMoveInfo ? Location_B : Location_A;
var sideb = side == "A" ? "B" : "A";
var Ls_B_Location_Up = $"Ls_{sideb}_Location_Up";
var Ls_B_Location_Down = $"Ls_{sideb}_Location_Down";
......@@ -198,6 +206,7 @@ namespace DeviceLibrary
var RFID = Minfo == LSAMoveInfo ? RFID_1 : RFID_2;
var lsb = (Minfo == LSAMoveInfo ? LSBMoveInfo : LSAMoveInfo);
var addr = (Minfo == LSAMoveInfo ? DeviceGroup.addr_1 : DeviceGroup.addr_2);
switch (Minfo.MoveStep)
{
case MoveStep.Wait:
......@@ -205,14 +214,20 @@ namespace DeviceLibrary
break;
case MoveStep.SideMove_01:
Minfo.NextMoveStep(MoveStep.SideMove_01);
if (lsb.MoveStep >= MoveStep.SideMove_10) {
Msg.add(sideb+crc.GetString("Res0015","侧穿越中"), MsgLevel.info);
}else if (IOValue(Ls_A_Tray_Check).Equals(IO_VALUE.HIGH))
{
Minfo.log("中间检测到托盘");
Minfo.NextMoveStep(MoveStep.SideMove_06);
Location_a.ToLow(Minfo);
}
else if (IOValue(Ls_A_Front_Check).Equals(IO_VALUE.HIGH))
{
Minfo.NextMoveStep(MoveStep.SideMove_02);
CylinderMove(Minfo, Ls_A_Location_Up, Ls_A_Location_Down, IO_VALUE.LOW);
IOMove(IO_Type.Ls_A_Stop, IO_VALUE.LOW);
Location_a.ToLow(Minfo);
IOMove(Ls_A_Stop, IO_VALUE.LOW);
}
else
{
......@@ -221,26 +236,47 @@ namespace DeviceLibrary
break;
case MoveStep.SideMove_02:
Minfo.NextMoveStep(MoveStep.SideMove_03);
Minfo.CanWhileCount = 3;
Minfo.log($"{Ls_A_Front_Stop}下降,{Ls_A_BufStop_Rwd}回退");
IOMove(Ls_A_Front_Stop, IO_VALUE.HIGH, StopDelayMS);
IOMove(Ls_A_BufStop_Rwd, IO_VALUE.HIGH, StopBufDelayMS);
Minfo.WaitList.Add(WaitResultInfo.WaitIO(Ls_A_Tray_Check, IO_VALUE.HIGH));
break;
case MoveStep.SideMove_03:
if (LS_Type == LS_TypeE.OneWay)
if (IOValue(Ls_A_Tray_Check).Equals(IO_VALUE.HIGH))
{
Minfo.NextMoveStep(MoveStep.SideMove_04);
Minfo.log($"检测到进入的托盘");
Minfo.CanWhileCount = 3;
Minfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
}
else if (Minfo.IsTimeOut(10))
{
Minfo.log($"没有检测到进入的托盘");
Minfo.NextMoveStep(MoveStep.SideMove_01);
}
break;
case MoveStep.SideMove_04:
Minfo.NextMoveStep(MoveStep.SideMove_05);
if (LS_Type == LS_TypeE.OneWay && Minfo == LSBMoveInfo)
{
Minfo.NextMoveStep(MoveStep.SideMove_07);
Location_a.ToLow(Minfo);
return;
}
//Location_a.ToHigh(Minfo);
break;
case MoveStep.SideMove_05:
if (RFID.ReadByte(0x20,16,out byte[] data))
{
var rfid = Encoding.ASCII.GetString(data).Trim();
var through = TrayManager.Process(rfid, addr, out TrayInfo trayInfo);
if (through)
Minfo.NextMoveStep(MoveStep.SideMove_04);
else
var rfid = Common.RfidFilter(data);
TrayManager.Process(rfid, addr, out TrayInfo trayInfo);
if (TrayManager.CalcNeedTrans(addr, trayInfo.DestinationAddr, trayInfo.HasLoad))
Minfo.NextMoveStep(MoveStep.SideMove_10);
else
Minfo.NextMoveStep(MoveStep.SideMove_06);
Minfo.WaitList.Add(WaitResultInfo.WaitTime(500));
}
else if (Minfo.CanWhileCount > 0)
......@@ -251,74 +287,92 @@ namespace DeviceLibrary
}
else {
Minfo.log("RFid读取失败,直接通过");
Minfo.NextMoveStep(MoveStep.SideMove_04);
Minfo.NextMoveStep(MoveStep.SideMove_06);
}
//Minfo.NextMoveStep(MoveStep.SideMove_10);
//Location_a.ToLow(Minfo);
break;
///直接穿过流程
case MoveStep.SideMove_04:
Minfo.NextMoveStep(MoveStep.SideMove_05);
case MoveStep.SideMove_06:
Minfo.NextMoveStep(MoveStep.SideMove_07);
IOMove(Ls_A_Stop, IO_VALUE.HIGH, StopDelayMS);
IOMove(Ls_A_BufStop_Rwd, IO_VALUE.HIGH, StopBufDelayMS);
Minfo.log($"{Ls_A_Stop}阻挡放行");
break;
case MoveStep.SideMove_05:
Minfo.NextMoveStep(MoveStep.SideMove_06);
Minfo.WaitList.Add(WaitResultInfo.WaitIO(Ls_A_Tray_Check, IO_VALUE.LOW));
case MoveStep.SideMove_07:
if (IOValue(Ls_A_Tray_Check).Equals(IO_VALUE.LOW))
{
Minfo.NextMoveStep(MoveStep.SideMove_08);
}
else if (Minfo.IsTimeOut(5)) {
Minfo.NextMoveStep(MoveStep.SideMove_06);
}
break;
case MoveStep.SideMove_06:
case MoveStep.SideMove_08:
Minfo.NextMoveStep(MoveStep.SideMove_01);
Minfo.WaitList.Add(WaitResultInfo.WaitTime(500));
Minfo.WaitList.Add(WaitResultInfo.WaitTime(3000));
Minfo.log($"放行结束");
break;
///横移流程
case MoveStep.SideMove_10:
if (lsb.MoveStep == MoveStep.SideMove_01)
{
Minfo.NextMoveStep(MoveStep.SideMove_11);
}
else if (lsb.MoveStep >= MoveStep.SideMove_11) {
Minfo.NextMoveStep(MoveStep.SideMove_04);
else if (lsb.MoveStep >= MoveStep.SideMove_11)
{
Minfo.NextMoveStep(MoveStep.SideMove_06);
Minfo.log($"{sideb}侧也在等待横移,本侧直接穿过");
}
else
else if (LSBMoveInfo.MoveStep == MoveStep.SideMove_10 && Minfo == LSAMoveInfo)
{
Minfo.NextMoveStep(MoveStep.SideMove_11);
}
else{
Msg.add($"等待{sideb}侧空闲", MsgLevel.info);
}
break;
case MoveStep.SideMove_11:
Minfo.NextMoveStep(MoveStep.SideMove_05);
Location_A.ToHigh(Minfo);
Location_B.ToHigh(Minfo);
Minfo.NextMoveStep(MoveStep.SideMove_12);
Location_a.ToHigh(Minfo);
Location_b.ToHigh(Minfo);
IOMove(Ls_B_BufStop_Fwd, IO_VALUE.HIGH, StopBufDelayMS);
Minfo.log($"2侧顶升升起");
break;
case MoveStep.SideMove_12:
Minfo.NextMoveStep(MoveStep.SideMove_06);
Line.LineRun("n", false, 999);
Minfo.NextMoveStep(MoveStep.SideMove_13);
Line.LineRun("n", Minfo==LSAMoveInfo? false:true, 999);
Minfo.WaitList.Add(WaitResultInfo.WaitIO(Ls_B_Tray_Check, IO_VALUE.HIGH));
Minfo.log($"横移线体运行");
break;
case MoveStep.SideMove_13:
Minfo.NextMoveStep(MoveStep.SideMove_07);
Minfo.WaitList.Add(WaitResultInfo.WaitTime(500));
Minfo.NextMoveStep(MoveStep.SideMove_13_2);
Minfo.WaitList.Add(WaitResultInfo.WaitTime(3500));
break;
case MoveStep.SideMove_13_2:
Minfo.NextMoveStep(MoveStep.SideMove_14);
IOMove(Ls_B_BufStop_Rwd, IO_VALUE.HIGH, StopBufDelayMS);
Minfo.WaitList.Add(WaitResultInfo.WaitTime(3500));
break;
case MoveStep.SideMove_14:
Minfo.NextMoveStep(MoveStep.SideMove_08);
Minfo.NextMoveStep(MoveStep.SideMove_15);
Line.LineStop("n");
Location_A.ToLow(Minfo);
Location_B.ToLow(Minfo);
Location_a.ToLow(Minfo);
Location_b.ToLow(Minfo);
Minfo.log($"顶升下降横移线体停止");
break;
case MoveStep.SideMove_15:
Minfo.NextMoveStep(MoveStep.SideMove_09);
IOMove(Ls_B_Stop, IO_VALUE.HIGH, StopDelayMS);
Minfo.NextMoveStep(MoveStep.SideMove_16);
if (LS_Type!= LS_TypeE.NoRfid)
IOMove(Ls_B_Stop, IO_VALUE.HIGH, StopDelayMS);
break;
case MoveStep.SideMove_16:
Minfo.NextMoveStep(MoveStep.SideMove_10);
Minfo.NextMoveStep(MoveStep.SideMove_17);
Minfo.WaitList.Add(WaitResultInfo.WaitIO(Ls_B_Tray_Check, IO_VALUE.LOW));
break;
case MoveStep.SideMove_17:
Minfo.NextMoveStep(MoveStep.SideMove_11);
Minfo.NextMoveStep(MoveStep.SideMove_18);
Minfo.WaitList.Add(WaitResultInfo.WaitTime(500));
break;
case MoveStep.SideMove_18:
......@@ -339,7 +393,8 @@ namespace DeviceLibrary
break;
case MoveStep.H01_HomeReset:
LSAMoveInfo.NextMoveStep(MoveStep.H02_HomeReset);
IOMove(IO_Type.Ls_A_BufStop_Rwd, IO_VALUE.HIGH, StopBufDelayMS);
IOMove(IO_Type.Ls_B_BufStop_Rwd, IO_VALUE.HIGH, StopBufDelayMS);
var loAdown = IOValue(IO_Type.Ls_A_Location_Down).Equals(IO_VALUE.HIGH);
var loBdown = IOValue(IO_Type.Ls_B_Location_Down).Equals(IO_VALUE.HIGH);
var trayAstate = IOValue(IO_Type.Ls_A_Tray_Check).Equals(IO_VALUE.HIGH);
......@@ -347,6 +402,7 @@ namespace DeviceLibrary
LSAMoveInfo.log($"Ls_A_Location_Down:{loAdown},Ls_B_Location_Down:{loBdown},Ls_A_Tray_Check:{trayAstate},Ls_B_Tray_Check:{trayBstate}");
if (loAdown && loBdown)
{
if (!trayAstate && !trayBstate)
{
LSAMoveInfo.log("托盘上没有料盘回原结束");
......@@ -365,9 +421,12 @@ namespace DeviceLibrary
}
else if (trayBstate)
{
LSBMoveInfo.log("有过路料直接放行");
//LSBMoveInfo.log("有过路料直接放行");
//DeviceState = DeviceStateE.Run;
//LSBMoveInfo.NewMove(MoveStep.SideMove_04);
DeviceState = DeviceStateE.Run;
LSBMoveInfo.NewMove(MoveStep.SideMove_04);
LSAMoveInfo.EndMove();
}
}
break;
......@@ -375,7 +434,8 @@ namespace DeviceLibrary
LSAMoveInfo.NextMoveStep(MoveStep.H03_HomeReset);
Location_A.ToHigh(LSAMoveInfo);
Location_B.ToHigh(LSAMoveInfo);
IOMove(IO_Type.Ls_B_BufStop_Fwd, IO_VALUE.HIGH,StopBufDelayMS);
if (LS_Type== LS_TypeE.NoRfid)
IOMove(IO_Type.Ls_B_BufStop_Fwd, IO_VALUE.HIGH,StopBufDelayMS);
LSAMoveInfo.log($"顶升顶起");
break;
case MoveStep.H03_HomeReset:
......@@ -392,6 +452,7 @@ namespace DeviceLibrary
break;
case MoveStep.H05_HomeReset:
LSAMoveInfo.NextMoveStep(MoveStep.H06_HomeReset);
if (LS_Type!= LS_TypeE.NoRfid)
IOMove(IO_Type.Ls_B_Stop, IO_VALUE.HIGH, StopDelayMS);
LSAMoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
LSAMoveInfo.log($"缓冲回退");
......@@ -407,6 +468,12 @@ namespace DeviceLibrary
break;
}
}
/// <summary>
/// 无需实现该接口
/// </summary>
public void TrayRelease()
{
}
enum LS_TypeE {
NoRfid,
......
......@@ -55,6 +55,7 @@ namespace DeviceLibrary
}
public void Start()
{
OpenAllServo();
DeviceState = DeviceStateE.HomeReset;
MoveInfo.NewMove(MoveStep.H01_HomeReset);
MoveInfo.log("开始回原");
......@@ -85,6 +86,13 @@ namespace DeviceLibrary
switch (MoveInfo.MoveStep)
{
case MoveStep.Wait:
if (IOValue(IO_Type.AMH_In_Check).Equals(IO_VALUE.HIGH))
{
MoveInfo.log("中间检测到托盘");
MoveInfo.NextMoveStep(MoveStep.TransplantMove_04);
Location.ToLow(MoveInfo);
}
else
if (IOValue(IO_Type.AMH_Front_Check).Equals(IO_VALUE.HIGH))
{
MoveInfo.NextMoveStep(MoveStep.TransplantMove_01);
......@@ -98,46 +106,127 @@ namespace DeviceLibrary
case MoveStep.TransplantMove_01:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_02);
IOMove(IO_Type.AMH_Front_Stop, IO_VALUE.HIGH, StopDelayMS);
MoveInfo.CanWhileCount = 3;
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.MI_In_Check, IO_VALUE.HIGH));
MoveInfo.log($"前阻挡放行");
break;
case MoveStep.TransplantMove_02:
if (IOValue(IO_Type.AMH_In_Check).Equals(IO_VALUE.HIGH))
{
MoveInfo.NextMoveStep(MoveStep.TransplantMove_03);
MoveInfo.CanWhileCount = 3;
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
Location.ToHigh(MoveInfo);
}
else if (MoveInfo.IsTimeOut(10)) {
MoveInfo.log("没有检测到托盘进入");
MoveInfo.NextMoveStep(MoveStep.Wait);
}
break;
case MoveStep.TransplantMove_03:
if (RFID_1.ReadByte(0x20, 16, out byte[] data))
{
var rfid = Encoding.ASCII.GetString(data).Trim();
var through = TrayManager.Process(rfid, DeviceGroup.addr_1, out TrayInfo trayInfo);
if (through)
MoveInfo.NextMoveStep(MoveStep.TransplantMove_03);
else if (IOValue(IO_Type.AMH_Reel_Check).Equals(IO_VALUE.HIGH))
MoveInfo.NextMoveStep(MoveStep.TransplantMove_10);
CurrrentRFID = Common.RfidFilter(data);
MoveInfo.MoveParam.RFID = CurrrentRFID;
var through = TrayManager.Process(CurrrentRFID, DeviceGroup.addr_1, out TrayInfo trayInfo);
MoveInfo.log($"rfid:{CurrrentRFID},TrayManager.Process:{trayInfo.DestinationAddr},{DeviceGroup.addr_1},AMH_Reel_Check:{IOValue(IO_Type.AMH_Reel_Check)},HasLoad:{trayInfo.HasLoad}");
if (trayInfo.DestinationAddr == DeviceGroup.addr_1 && trayInfo.HasLoad)
{
if (IOValue(IO_Type.AMH_Reel_Check).Equals(IO_VALUE.HIGH))
{
RemoteLoad remoteLoad1 = new RemoteLoad();
remoteLoad1.Action = "DoorLock";
remoteLoad1.RequestLoadInfo = new RequestLoadInfo();
remoteLoad1.RequestLoadInfo.IsEmpty = false;
MoveInfo.MoveParam = trayInfo.TrayParam.clone();
MoveInfo.MoveParam.RFID = CurrrentRFID;
if (RemoteService.SendAndWait(GroupName, remoteLoad1) == RemoteResult.True)
{
MoveInfo.log($"{GroupName} 开始转移物料置料仓");
MoveInfo.NextMoveStep(MoveStep.TransplantMove_10); // 送达料仓
SRec.info("物料横移", GroupName, "载物托盘", "开始将物料转移至料仓", CurrrentRFID, MoveInfo.MoveParam.ToStr());
return;
}
else
{
MoveInfo.log($"入库托盘与 {GroupName} 通讯失败,放行托盘,{MoveInfo.MoveParam.ToStr()}");
MoveInfo.NextMoveStep(MoveStep.TransplantMove_04);
SRec.error("物料横移", GroupName, "载物托盘", "料仓当前不可用,放行托盘", CurrrentRFID, MoveInfo.MoveParam.ToStr());
}
}
else
{
Msg.add("托盘没有检测到治具", MsgLevel.warning);
return;
}
}
else if (!trayInfo.HasLoad && TrayManager.HasTrayRequest(GroupName, CurrrentRFID,out ReelParam reelParam))
{
if (IOValue(IO_Type.AMH_Reel_Check).Equals(IO_VALUE.LOW))
{
RemoteLoad remoteLoad2 = new RemoteLoad();
remoteLoad2.Action = "DoorLock";
remoteLoad2.RequestLoadInfo = new RequestLoadInfo();
remoteLoad2.RequestLoadInfo.IsEmpty = true;
if (RemoteService.SendAndWait(GroupName, remoteLoad2) == RemoteResult.True)
{
MoveInfo.MoveParam = reelParam.clone();
trayInfo.TrayParam= reelParam.clone();
MoveInfo.MoveParam.RFID = CurrrentRFID;
MoveInfo.NextMoveStep(MoveStep.TransplantMove_20); //从料仓取出
SRec.info("物料横移", GroupName, "空托盘", "开始从料仓转移物料至托盘", CurrrentRFID, MoveInfo.MoveParam.ToStr());
return;
}
else
{
MoveInfo.log($"出库托盘与 {GroupName} 通讯失败,放行托盘");
MoveInfo.NextMoveStep(MoveStep.TransplantMove_04);
SRec.error("物料横移", GroupName, "空托盘", "料仓当前不可用,放行托盘", CurrrentRFID, MoveInfo.MoveParam.ToStr());
}
}
else {
Msg.add("托盘标记为空托盘,但检测到治具", MsgLevel.warning);
return;
}
}
else
MoveInfo.NextMoveStep(MoveStep.TransplantMove_30);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
MoveInfo.NextMoveStep(MoveStep.TransplantMove_04);
}
else if (MoveInfo.CanWhileCount > 0)
{
MoveInfo.CanWhileCount--;
MoveInfo.log($"RFid读取失败,重试第{3 - MoveInfo.CanWhileCount}次");
MoveInfo.WaitList.Add(WaitResultInfo.WaitMsg(crc.GetString("Res0016","RFid读取失败"), MsgLevel.warning));
MoveInfo.WaitList.Add(WaitResultInfo.WaitMsg(crc.GetString("Res0016", "RFid读取失败"), MsgLevel.warning));
}
else
{
MoveInfo.log("RFid读取失败,直接通过");
MoveInfo.NextMoveStep(MoveStep.TransplantMove_03);
MoveInfo.NextMoveStep(MoveStep.TransplantMove_04);
}
Location.ToLow(MoveInfo);
break;
case MoveStep.TransplantMove_03:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_04);
case MoveStep.TransplantMove_04:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_05);
IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, StopDelayMS);
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.MI_In_Check, IO_VALUE.LOW));
Location.ToLow(MoveInfo);
MoveInfo.log($"后阻挡放行");
break;
case MoveStep.TransplantMove_04:
MoveInfo.NextMoveStep(MoveStep.Wait);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
MoveInfo.log("托盘已放行");
case MoveStep.TransplantMove_05:
if (IOValue(IO_Type.AMH_In_Check).Equals(IO_VALUE.LOW))
{
MoveInfo.NextMoveStep(MoveStep.Wait);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
MoveInfo.log("托盘已放行");
} else if (MoveInfo.IsTimeOut(10)) {
MoveInfo.log("托盘放行失败,重新放行");
MoveInfo.NextMoveStep(MoveStep.TransplantMove_04);
}
break;
//线体=>料仓
case MoveStep.TransplantMove_10:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_11);
Location.ToHigh(MoveInfo);
......@@ -147,7 +236,7 @@ namespace DeviceLibrary
break;
case MoveStep.TransplantMove_11:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_12);
var AMH_TS_P2 = Config.AMH_TS_P2 - (MoveInfo.MoveParam.PlateH - 8) * Config.AMH_TS_PoToMM;
var AMH_TS_P2 = DeviceGroup.p2 - (MoveInfo.MoveParam.PlateH - 70) * Config.AMH_TS_PoToMM;
axis.AbsMove(MoveInfo, AMH_TS_P2, Config.AMH_TS_P1_speed);
IOMove(IO_Type.AMH_Sucker, IO_VALUE.HIGH);
MoveInfo.log($"PlateH:{MoveInfo.MoveParam.PlateH},AMH_TS_P2:{AMH_TS_P2}");
......@@ -158,11 +247,13 @@ namespace DeviceLibrary
case MoveStep.TransplantMove_13:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_14);
axis.AbsMove(MoveInfo, Config.AMH_TS_P1, Config.AMH_TS_P1_speed);
MoveInfo.log("取料轴到P1,等待离开信号");
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.AMH_Reel_Check,IO_VALUE.LOW));
break;
case MoveStep.TransplantMove_14:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_15);
MoveInfo2.NewMove(MoveStep.TransplantMove_01);
MoveInfo2.MoveParam = MoveInfo.MoveParam.clone();
Location.ToLow(MoveInfo);
MoveInfo.log("料盘已取走,放行托盘, 子流程开始移栽入库");
break;
......@@ -172,18 +263,98 @@ namespace DeviceLibrary
break;
case MoveStep.TransplantMove_16:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_17);
ServerCommunication.UpdateRobotStatus(MoveInfo.MoveParam.WareCode, RobotStatusE.BOXDOOR, MoveInfo.MoveParam.RFID);
TrayManager.SetToEmpty(CurrrentRFID);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
break;
case MoveStep.TransplantMove_17:
MoveInfo.NewMove(MoveStep.Wait);
MoveInfo.log("托盘放行结束");
SRec.info("物料横移", GroupName, "空托盘", "载荷已取走");
MoveInfo.NewMove(MoveStep.Wait);
break;
case MoveStep.TransplantMove_30:
MoveInfo.NextMoveStep(MoveStep.Wait);
//从料仓=>线体
case MoveStep.TransplantMove_20:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_21);
Location.ToHigh(MoveInfo);
axis.AbsMove(MoveInfo, Config.AMH_TS_P1, Config.AMH_TS_P1_speed);
Transplant.ToHigh(MoveInfo);
MoveInfo.log("顶升上升,取料轴到P1,移栽气缸回位");
break;
case MoveStep.TransplantMove_21:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_22);
AMH_TS_P2 = DeviceGroup.p3 - (MoveInfo.MoveParam.PlateH - 70) * Config.AMH_TS_PoToMM;
axis.AbsMove(MoveInfo, AMH_TS_P2, Config.AMH_TS_P1_speed);
IOMove(IO_Type.AMH_Sucker, IO_VALUE.HIGH);
MoveInfo.log($"PlateH:{MoveInfo.MoveParam.PlateH},AMH_TS_P2:{AMH_TS_P2}");
break;
case MoveStep.TransplantMove_22:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_23);
break;
case MoveStep.TransplantMove_23:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_24);
axis.AbsMove(MoveInfo, Config.AMH_TS_P1, Config.AMH_TS_P1_speed);
//MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.AMH_Reel_Check, IO_VALUE.LOW));
break;
case MoveStep.TransplantMove_24:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_25);
Transplant.ToLow(MoveInfo);
MoveInfo2.log("移栽气缸的前进");
break;
case MoveStep.TransplantMove_25:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_26);
AMH_TS_P2 = DeviceGroup.p2 - (MoveInfo.MoveParam.PlateH - 70) * Config.AMH_TS_PoToMM;
axis.AbsMove(MoveInfo2, AMH_TS_P2, Config.AMH_TS_P2_speed);
MoveInfo2.log($"PlateH:{MoveInfo.MoveParam.PlateH},AMH_TS_P2:{AMH_TS_P2}");
break;
case MoveStep.TransplantMove_26:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_27);
IOMove(IO_Type.AMH_Sucker, IO_VALUE.LOW);
break;
case MoveStep.TransplantMove_27:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_28);
axis.AbsMove(MoveInfo2, Config.AMH_TS_P1, Config.AMH_TS_P1_speed);
Location.ToLow(MoveInfo);
MoveInfo.log("载荷离开, 顶升下降");
break;
case MoveStep.TransplantMove_28:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_29);
var remoteLoad = new RemoteLoad();
remoteLoad.Action = "DoorRelease";
remoteLoad.RequestLoadInfo = new RequestLoadInfo();
remoteLoad.RequestLoadInfo.IsEmpty = true;
remoteLoad.RequestLoadInfo.LoadParam = MoveInfo.MoveParam.clone();
var tarytype = CurrrentTrayInfo.TrayType;
remoteLoad.RequestLoadInfo.TrayType = tarytype.ToString();
if (tarytype == TrayTypeE.MTP1)
remoteLoad.RequestLoadInfo.DeviceGroupName = StoreCID.AMH_ML5_1;
else
remoteLoad.RequestLoadInfo.DeviceGroupName = StoreCID.AMH_ML5_2;
if (RemoteService.SendAndWait(GroupName, remoteLoad) != RemoteResult.True)
{
MoveInfo.NextMoveStep(MoveStep.TransplantMove_28);
return;
}
TrayManager.ClearTrayRequest(GroupName);
MoveInfo.log("释放料仓门, 设置托盘信息");
remoteLoad.RequestLoadInfo.IsEmpty = false;
TrayManager.SetTrayLoadInfo(CurrrentRFID, remoteLoad.RequestLoadInfo);
ServerCommunication.UpdateRobotStatus(MoveInfo.MoveParam.WareCode, RobotStatusE.INROBOT, CurrrentRFID);
break;
case MoveStep.TransplantMove_29:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_30);
IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, StopDelayMS);
break;
case MoveStep.TransplantMove_30:
MoveInfo.NextMoveStep(MoveStep.TransplantMove_31);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1000));
break;
case MoveStep.TransplantMove_31:
SRec.error("物料横移", GroupName, "载物托盘", "物料已到托盘", CurrrentRFID, MoveInfo.MoveParam.ToStr());
MoveInfo.NewMove(MoveStep.Wait);
MoveInfo.log("从线体到料仓移栽结束");
break;
}
}
public void SecondProcess()
......@@ -197,14 +368,15 @@ namespace DeviceLibrary
break;
case MoveStep.TransplantMove_01:
MoveInfo2.NextMoveStep(MoveStep.TransplantMove_02);
Transplant.ToHigh(MoveInfo);
Transplant.ToHigh(MoveInfo2);
MoveInfo2.log("移栽气缸的前进");
break;
case MoveStep.TransplantMove_02:
MoveInfo2.NextMoveStep(MoveStep.TransplantMove_03);
var AMH_TS_P2 = Config.AMH_TS_P2 - (MoveInfo.MoveParam.PlateH - 8) * Config.AMH_TS_PoToMM;
var AMH_TS_P2 = DeviceGroup.p3 - (MoveInfo2.MoveParam.PlateH - 70) * Config.AMH_TS_PoToMM;
axis.AbsMove(MoveInfo2, AMH_TS_P2, Config.AMH_TS_P2_speed);
MoveInfo2.log($"PlateH:{MoveInfo.MoveParam.PlateH},AMH_TS_P2:{AMH_TS_P2}");
MoveInfo2.log($"PlateH:{MoveInfo2.MoveParam.PlateH},AMH_TS_P2:{AMH_TS_P2}");
break;
case MoveStep.TransplantMove_03:
MoveInfo2.NextMoveStep(MoveStep.TransplantMove_04);
......@@ -215,6 +387,12 @@ namespace DeviceLibrary
axis.AbsMove(MoveInfo2, Config.AMH_TS_P1, Config.AMH_TS_P1_speed);
break;
case MoveStep.TransplantMove_05:
RemoteLoad remoteLoad = new RemoteLoad();
remoteLoad.Action = "DoorRelease";
remoteLoad.RequestLoadInfo = new RequestLoadInfo();
remoteLoad.RequestLoadInfo.IsEmpty=false;
remoteLoad.RequestLoadInfo.LoadParam = MoveInfo2.MoveParam.clone();
RemoteService.SendMessage(GroupName, remoteLoad);
MoveInfo2.NewMove(MoveStep.Wait);
MoveInfo.log("从线体到料仓移栽结束");
break;
......@@ -228,23 +406,28 @@ namespace DeviceLibrary
switch (MoveInfo.MoveStep)
{
case MoveStep.Wait:
MoveInfo.NextMoveStep(MoveStep.SideMove_01);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
//MoveInfo.NextMoveStep(MoveStep.SideMove_01);
//MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
break;
case MoveStep.SideMove_01:
MoveInfo.NextMoveStep(MoveStep.SideMove_02);
CylinderMove(MoveInfo, IO_Type.MI_Location_Down, IO_Type.MI_Location_Up, IO_VALUE.LOW);
case MoveStep.H01_HomeReset:
MoveInfo.NextMoveStep(MoveStep.H02_HomeReset);
axis.HomeMove(MoveInfo);
break;
case MoveStep.SideMove_02:
MoveInfo.NextMoveStep(MoveStep.SideMove_03);
IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, StopDelayMS);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1500));
case MoveStep.H02_HomeReset:
MoveInfo.NextMoveStep(MoveStep.H03_HomeReset);
Location.ToLow(MoveInfo);
Transplant.ToLow(MoveInfo);
break;
case MoveStep.SideMove_03:
case MoveStep.H03_HomeReset:
MoveInfo.EndMove();
DeviceState = DeviceStateE.Run;
break;
}
}
public void TrayRelease()
{
throw new NotImplementedException();
}
}
}
\ No newline at end of file
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
......@@ -28,6 +30,7 @@ namespace DeviceLibrary
CylinderManger Location;
AxisBean axis;
AxisBean axis2;
public TrayStop(DeviceGroup device,out string msg) {
msg = "";
......@@ -55,6 +58,7 @@ namespace DeviceLibrary
public DeviceStateE DeviceState { get; set; }
public void Start()
{
OpenAllServo();
DeviceState = DeviceStateE.HomeReset;
MoveInfo.NewMove(MoveStep.H01_HomeReset);
MoveInfo.log("开始回原");
......@@ -84,64 +88,140 @@ namespace DeviceLibrary
switch (MoveInfo.MoveStep)
{
case MoveStep.Wait:
if (IOValue(IO_Type.MI_Front_Check).Equals(IO_VALUE.HIGH))
if (IOValue(IO_Type.MI_In_Check).Equals(IO_VALUE.HIGH))
{
MoveInfo.NextMoveStep(MoveStep.SideMove_01);
MoveInfo.log("中间检测到托盘");
MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
Location.ToLow(MoveInfo);
}
else if (IOValue(IO_Type.MI_Front_Check).Equals(IO_VALUE.HIGH))
{
MoveInfo.NextMoveStep(MoveStep.TrayStop_01);
Location.ToLow(MoveInfo);
MoveInfo.log("入口检测到托盘");
}
else {
Msg.add(crc.GetString("Res0184","空闲中"), MsgLevel.info);
}
break;
case MoveStep.TrayStop_01:
MoveInfo.NextMoveStep(MoveStep.SideMove_02);
IOMove(IO_Type.AMH_Front_Stop, IO_VALUE.HIGH, StopDelayMS);
MoveInfo.CanWhileCount = 3;
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.MI_In_Check, IO_VALUE.HIGH));
MoveInfo.NextMoveStep(MoveStep.TrayStop_02);
IOMove(IO_Type.AMH_Front_Stop, IO_VALUE.HIGH, StopDelayMS);
break;
case MoveStep.TrayStop_02:
if (IOValue(IO_Type.MI_In_Check).Equals(IO_VALUE.HIGH))
{
MoveInfo.NextMoveStep(MoveStep.TrayStop_03);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
MoveInfo.CanWhileCount = 3;
Location.ToHigh(MoveInfo);
} else if (MoveInfo.IsTimeOut(10)){
MoveInfo.log("没有检测到托盘");
MoveInfo.NextMoveStep(MoveStep.Wait);
}
break;
case MoveStep.TrayStop_03:
if (RFID_1.ReadByte(0x20, 16, out byte[] data))
{
var rfid = Encoding.ASCII.GetString(data).Trim();
var through = TrayManager.Process(rfid, DeviceGroup.addr_1, out TrayInfo trayInfo);
if (through)
MoveInfo.NextMoveStep(MoveStep.TrayStop_03);
CurrrentRFID = Common.RfidFilter(data);
TrayManager.Process(CurrrentRFID, DeviceGroup.addr_1, out TrayInfo trayInfo);
var stop = TrayManager.HasTrayRequest(GroupName, CurrrentRFID,out _);
MoveInfo.log($"CurrrentRFID:{CurrrentRFID},HasLoad:{trayInfo.HasLoad},MI_Reel_Check:{IOValue(IO_Type.MI_Reel_Check)},NeedStop:{stop}");
if (stop && !trayInfo.HasLoad && IOValue(IO_Type.MI_Reel_Check).Equals(IO_VALUE.LOW))
{
MoveInfo.NextMoveStep(MoveStep.TrayStop_WaitLoadProcess);
RemoteLoad remoteLoad = new RemoteLoad();
remoteLoad.Action = "TrayReady";
remoteLoad.RequestLoadInfo = new RequestLoadInfo();
remoteLoad.RequestLoadInfo.TrayType = trayInfo.TrayType.ToString();
if (trayInfo.TrayParam!=null)
remoteLoad.RequestLoadInfo.LoadParam = trayInfo.TrayParam.clone();
remoteLoad.RequestLoadInfo.IsEmpty = true;
if (RemoteService.SendAndWait(GroupName, remoteLoad)!=RemoteResult.True)
MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
SRec.info("托盘挡停", GroupName, "空托盘","准备接料", CurrrentRFID);
ServerCommunication.UpdateRobotStatus(trayInfo.TrayParam.WareCode, RobotStatusE.INROBOT, MoveInfo.MoveParam.RFID);
return;
}
else if (trayInfo.DestinationAddr == DeviceGroup.addr_1 && trayInfo.HasLoad && IOValue(IO_Type.MI_Reel_Check).Equals(IO_VALUE.HIGH))
{
MoveInfo.NextMoveStep(MoveStep.TrayStop_WaitLoadProcess);
RemoteLoad remoteLoad = new RemoteLoad();
remoteLoad.Action = "TrayReady";
remoteLoad.RequestLoadInfo = new RequestLoadInfo();
remoteLoad.RequestLoadInfo.TrayType = trayInfo.TrayType.ToString();
remoteLoad.RequestLoadInfo.LoadParam = trayInfo.TrayParam.clone();
remoteLoad.RequestLoadInfo.IsEmpty = false;
var result = RemoteService.SendAndWait(GroupName, remoteLoad);
if (result != RemoteResult.True)
{
MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
MoveInfo.log($"{GroupName} 请求入库失败:{result}");
}
else
{
SRec.info("托盘挡停", GroupName, "载物托盘", "等待物料被接走", CurrrentRFID, remoteLoad.RequestLoadInfo.LoadParam.WareCode);
MoveInfo.log($"{GroupName} 请求出库成功");
}
return;
}
else
MoveInfo.NextMoveStep(MoveStep.TrayStop_WaitLoadLeave);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
}
else if (MoveInfo.CanWhileCount > 0)
{
MoveInfo.CanWhileCount--;
MoveInfo.log($"RFid读取失败,重试第{3 - MoveInfo.CanWhileCount}次");
MoveInfo.WaitList.Add(WaitResultInfo.WaitMsg(crc.GetString("Res0016","RFid读取失败"), MsgLevel.warning));
MoveInfo.WaitList.Add(WaitResultInfo.WaitMsg(crc.GetString("Res0016", "RFid读取失败"), MsgLevel.warning));
}
else
{
MoveInfo.log("RFid读取失败,直接通过");
MoveInfo.NextMoveStep(MoveStep.SideMove_04);
MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
}
Location.ToLow(MoveInfo);
break;
case MoveStep.TrayStop_03:
MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
case MoveStep.TrayStop_04:
MoveInfo.NextMoveStep(MoveStep.TrayStop_05);
Location.ToLow(MoveInfo);
break;
case MoveStep.TrayStop_05:
MoveInfo.NextMoveStep(MoveStep.TrayStop_06);
IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, StopDelayMS);
MoveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.MI_In_Check, IO_VALUE.LOW));
break;
case MoveStep.TrayStop_04:
MoveInfo.NextMoveStep(MoveStep.Wait);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
MoveInfo.log("托盘已放行");
case MoveStep.TrayStop_06:
if (IOValue(IO_Type.MI_In_Check).Equals(IO_VALUE.LOW))
{
MoveInfo.NextMoveStep(MoveStep.Wait);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(500));
MoveInfo.log("托盘已放行");
}
else if (MoveInfo.IsTimeOut(10))
{
MoveInfo.log("托盘放行失败, 重新放行");
MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
}
break;
case MoveStep.TrayStop_WaitLoadLeave:
case MoveStep.TrayStop_WaitLoadProcess:
Msg.add("等待处理载荷",MsgLevel.info);
break;
case MoveStep.TrayStop_LoadLeaved:
MoveInfo.NextMoveStep(MoveStep.Wait);
case MoveStep.TrayStop_LoadProcessed:
MoveInfo.NextMoveStep(MoveStep.TrayStop_04);
Location.ToLow(MoveInfo);
MoveInfo.log("载荷离开, 顶升下降");
SRec.info("托盘挡停", GroupName, "载物托盘", "处理结束", CurrrentRFID);
break;
}
}
/// <summary>
/// 释放托盘
/// </summary>
public void TrayRelease() {
MoveInfo.log("释放托盘");
MoveInfo.NextMoveStep(MoveStep.TrayStop_LoadProcessed);
}
public void ResetProcess()
{
if (CheckWait(MoveInfo))
......@@ -150,19 +230,19 @@ namespace DeviceLibrary
switch (MoveInfo.MoveStep)
{
case MoveStep.Wait:
MoveInfo.NextMoveStep(MoveStep.SideMove_01);
MoveInfo.NextMoveStep(MoveStep.H01_HomeReset);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(2000));
break;
case MoveStep.SideMove_01:
MoveInfo.NextMoveStep(MoveStep.SideMove_02);
CylinderMove(MoveInfo, IO_Type.MI_Location_Down, IO_Type.MI_Location_Up, IO_VALUE.LOW);
case MoveStep.H01_HomeReset:
MoveInfo.NextMoveStep(MoveStep.H02_HomeReset);
Location.ToLow(MoveInfo);
break;
case MoveStep.SideMove_02:
MoveInfo.NextMoveStep(MoveStep.SideMove_03);
case MoveStep.H02_HomeReset:
MoveInfo.NextMoveStep(MoveStep.H03_HomeReset);
IOMove(IO_Type.AMH_Tray_Stop, IO_VALUE.HIGH, StopDelayMS);
MoveInfo.WaitList.Add(WaitResultInfo.WaitTime(1500));
break;
case MoveStep.SideMove_03:
case MoveStep.H03_HomeReset:
MoveInfo.EndMove();
DeviceState = DeviceStateE.Run;
break;
......
......@@ -215,8 +215,7 @@ namespace DeviceLibrary
//
// FixtureSizeConfigControl
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.Controls.Add(this.groupBox_add);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.button2);
......
......@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
......@@ -19,7 +20,7 @@ namespace DeviceLibrary
public FixtureSizeConfigControl()
{
InitializeComponent();
if (DesignMode)
if (Process.GetCurrentProcess().ProcessName == "devenv")
return;
this.Tag = "not";
crc.OpenResourceLog = true;
......@@ -29,6 +30,8 @@ namespace DeviceLibrary
private void FixtureSizeConfigControl_Load(object sender, EventArgs e)
{
if (Process.GetCurrentProcess().ProcessName == "devenv")
return;
RefreshList();
}
void RefreshList() {
......
......@@ -4,11 +4,13 @@ AXIS,0,AMH-SBDH2-1伺服移栽,AMH_SBDH2_1_Axis,1,HC,,20000,0,0,0,40000,0,10,700,0,0
AXIS,0,AMH-SBDH2-2伺服移栽,AMH_SBDH2_2_Axis,2,HC,,60000,0,0,0,10000,0,10,700,0,0
AXIS,0,AMH-SBSH1伺服移栽,AMH_SBSH1_Axis,3,HC,,20000,0,0,0,40000,0,10,700,0,0
AXIS,0,MI1压紧伺服,MI1_Axis,4,HC,,60000,0,0,0,10000,0,10,700,0,0
AXIS,0,AMH-SBDH3-1伺服移栽,AMH_SBDH3_1_Axis,5,HC,,20000,0,0,0,40000,0,10,700,0,0
AXIS,0,AMH-SBDH3-2伺服移栽,AMH_SBDH3_2_Axis,6,HC,,60000,0,0,0,10000,0,10,700,0,0
AXIS,0,AMH-SBDH1-1伺服移栽,AMH_SBDH1_1_Axis,7,HC,,20000,0,0,0,40000,0,10,700,0,0
AXIS,0,AMH-SBDH1-2伺服移栽,AMH_SBDH1_2_Axis,8,HC,,60000,0,0,0,10000,0,10,700,0,0
AXIS,0,MI2压紧伺服,MI2_Axis,9,HC,,20000,0,0,0,40000,0,10,700,0,0
AXIS,0,MI1定位伺服,MI1_Rotate_Axis,5,HC,,60000,0,0,0,10000,0,10,700,0,0
AXIS,0,AMH-SBDH3-1伺服移栽,AMH_SBDH3_1_Axis,6,HC,,20000,0,0,0,40000,0,10,700,0,0
AXIS,0,AMH-SBDH3-2伺服移栽,AMH_SBDH3_2_Axis,7,HC,,60000,0,0,0,10000,0,10,700,0,0
AXIS,0,AMH-SBDH1-1伺服移栽,AMH_SBDH1_1_Axis,8,HC,,20000,0,0,0,40000,0,10,700,0,0
AXIS,0,AMH-SBDH1-2伺服移栽,AMH_SBDH1_2_Axis,9,HC,,60000,0,0,0,10000,0,10,700,0,0
AXIS,0,MI2压紧伺服,MI2_Axis,10,HC,,20000,0,0,0,40000,0,10,700,0,0
AXIS,0,MI1定位伺服,MI2_Rotate_Axis,11,HC,,60000,0,0,0,10000,0,10,700,0,0
,,,,,,,,,,,,,,,,
PRO,50,IO信号超时时间(秒),IOSingle_TimerOut,5,,,,,,,,,,,,
PRO,0,气压检测超时,AirCheckSeconds,5,,,,,,,,,,,,
......@@ -222,7 +224,7 @@ DO,0,LS2-1托盘前阻挡下降,Ls_A_Front_Stop,37,LS2,Y37,,,,,,,,,,
DO,0,LS2-1托盘阻挡下降,Ls_A_Stop,38,LS2,Y38,,,,,,,,,,
DO,0,LS2-2顶升上升,Ls_B_Location_Up,39,LS2,Y39,,,,,,,,,,
DO,0,LS2-2顶升下降,Ls_B_Location_Down,40,LS2,Y40,,,,,,,,,,
DO,0,LS2-2托盘前阻挡下降,Ls_B_Stop,41,LS2,Y41,,,,,,,,,,
DO,0,LS2-2托盘前阻挡下降,Ls_B_Front_Stop,41,LS2,Y41,,,,,,,,,,
DO,0,LS2-2托盘缓冲阻挡前进,Ls_B_BufStop_Fwd,42,LS2,Y42,,,,,,,,,,
DO,0,LS2-2托盘缓冲阻挡后退,Ls_B_BufStop_Rwd,43,LS2,Y43,,,,,,,,,,
,,,,,,,,,,,,,,,,
......
设备组,名称,设备类型,RFID-1,RFID-2,伺服轴号,伺服轴号2,地址号-1,地址号-2,设备侧8mm放料点,料仓侧8mm放料点,位置,优先级,高度,宽度
LS1,横移,LS,,,,,11,12,,,,,,
LS2,横移,LS,192.168.103.115,,,,9,15,,,,,,
LS2,横移,LS,192.168.103.115,,,,8,15,,,,,,
LS3,横移,LS,192.168.103.110,192.168.103.106,,,4,19,,,,,,
LS4,横移,LS,,,,,0,1,,,,,,
,,,,,,,,,,,,,,
AMH-MI1,定位,RT,192.168.103.103,,4,4,16,,,345,,,,
AMH-MI2,定位,RT,192.168.103.107,,9,9,20,,,345,,,,
AMH-MI1,定位,RT,192.168.103.103,,4,9,16,,,345,,,,
AMH-MI2,定位,RT,192.168.103.107,,10,11,20,,,345,,,,
,,,,,,,,,,,,,,
AMH-ML5-1,定位,RT,192.168.103.108,,-1,,2,,,,,,,
AMH-ML5-2,定位,RT,192.168.103.109,,-1,,3,,,,,,,
......@@ -16,7 +16,7 @@ AMH-SBSH2,移栽,SISO,192.168.103.116,,0,,10,,123,234,,,,
AMH-SBDH2-1,移栽,SISO,192.168.103.101,,1,,13,,123,234,,,,
AMH-SBDH2-2,移栽,SISO,192.168.103.102,,2,,14,,123,234,,,,
AMH-SBSH1,移栽,SISO,192.168.103.114,,3,,8,,123,234,,,,
AMH-SBDH3-1,移栽,SISO,192.168.103.112,,5,,6,,123,234,,,,
AMH-SBDH3-2,移栽,SISO,192.168.103.113,,6,,7,,123,234,,,,
AMH-SBDH1-1,移栽,SISO,192.168.103.104,,7,,17,,123,234,,,,
AMH-SBDH1-2,移栽,SISO,192.168.103.105,,8,,18,,123,234,,,,
AMH-SBDH3-1,移栽,SISO,192.168.103.112,,6,,6,,123,234,,,,
AMH-SBDH3-2,移栽,SISO,192.168.103.113,,7,,7,,123,234,,,,
AMH-SBDH1-1,移栽,SISO,192.168.103.104,,8,,17,,123,234,,,,
AMH-SBDH1-2,移栽,SISO,192.168.103.105,,9,,18,,123,234,,,,
......@@ -73,6 +73,18 @@ namespace OnlineStore.LoadCSVLibrary
[ConfigProAttribute("MI2_Axis")]
public ConfigMoveAxis MI2_Axis { get; set; }
/// <summary>
/// AXIS,0,MI1定位伺服,MI1_Rotate_Axis,5,HC,,60000,0,0,0,10000,0,10,700,0,0
/// </summary>
[ConfigProAttribute("MI1_Rotate_Axis")]
public ConfigMoveAxis MI1_Rotate_Axis { get; set; }
/// <summary>
/// AXIS,0,MI1定位伺服,MI2_Rotate_Axis,11,HC,,60000,0,0,0,10000,0,10,700,0,0
/// </summary>
[ConfigProAttribute("MI2_Rotate_Axis")]
public ConfigMoveAxis MI2_Rotate_Axis { get; set; }
/// <summary>
/// PRO,50,IO信号超时时间(秒),IOSingle_TimerOut,5,,,,,,,,,,,,
......
using CodeLibrary;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading.Tasks;
[Serializable]
public class RemoteLoad
{
public string Action;
public int Seq;
public string GroupName;
public RequestLoadInfo RequestLoadInfo;
}
[Serializable]
public class RequestLoadInfo
{
public string DeviceGroupName;
public string TrayType;
public bool IsEmpty;
public ReelParam LoadParam;
//public DoorStatusE DoorStatus;
[Newtonsoft.Json.JsonIgnore]
public TrayTypeE GetTrayType
{
get
{
try
{
return (TrayTypeE)Enum.Parse(typeof(TrayTypeE), TrayType);
}
catch {
return TrayTypeE.None;
}
}
}
}
public enum RobotStatusE
{
INROBOT, BOXDOOR, FINISHED
}
public enum TrayTypeE
{
None,
MTP1, //流水线治具托盘
MTP2, //流水线料盘托盘
S007, //料串
M03, //Tray料格
M02, //PCB料格
M01, //PizzaBOX料格
M04, //ShoeBOX料格
}
[Serializable]
public class ReelParam
{
/// <summary>
/// 创建新出入库信息
/// </summary>
/// <param name="wareNo">二维码内容</param>
/// <param name="platew">宽度</param>
/// <param name="plateh">高度</param>
/// <param name="IsNg">是否是入库NG料</param>
/// <param name="ngMsg">NG消息</param>
public ReelParam(string wareNo = "", int platew = 0, int plateh = 0, bool _IsNg = false, string ngMsg = "")
{
WareCode = wareNo;
PlateW = platew;
PlateH = plateh;
IsNg = _IsNg;
NgMsg = ngMsg;
}
/// <summary>
/// 物品二维码信息
/// </summary>
public string WareCode { get; set; }
/// <summary>
/// 库位号
/// </summary>
public string PosID { get; set; }
public string bitmapfilename = "";
public List<CodeInfo> codeInfos { get; set; }
/// <summary>
/// 料盘高度
/// </summary>
public int PlateH { get; set; }
/// <summary>
/// 料盘宽度
/// </summary>
public int PlateW { get; set; }
/// <summary>
/// 是否是入料NG料
/// </summary>
public bool IsNg = false;
/// <summary>
/// 入料NG消息
/// </summary>
public string NgMsg = "";
/// <summary>
/// 物料编码
/// </summary>
public string PN { get; set; }
/// <summary>
/// 数量
/// </summary>
public int QTY { get; set; } = 0;
/// <summary>
/// 厂家代码
/// </summary>
public string FC { get; set; }
/// <summary>
/// 唯一序列号
/// </summary>
public string RI { get; set; }
/// <summary>
/// 批次号
/// </summary>
public string Batch { get; set; }
public string cid { get; set; }
public bool ReelOnFixture { get; set; } = false;
public int HeightPos = 0;
public string RFID = "";
public ReelParam clone()
{
ReelParam dstobject;
using (MemoryStream mStream = new MemoryStream())
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mStream, this);
mStream.Seek(0, SeekOrigin.Begin);//指定当前流的位置为流的开头。
dstobject = (ReelParam)bf.Deserialize(mStream);
mStream.Close();
}
return dstobject;
}
public string ToStr()
{
if (IsNg)
{
return $":{NgMsg}[{WareCode}][{RFID}]";
}
else
{
return $":[{PosID}][{WareCode}][{RFID}] ";
}
}
}
public enum DoorStatusE {
Busy,
Free,
CanInStore,
CanOutStore,
CanInOut,
}
public enum RemoteResult
{
None,
Timeout,
False,
True
}
\ No newline at end of file
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// 有关程序集的一般信息由以下
// 控制。更改这些特性值可修改
// 与程序集关联的信息。
[assembly: AssemblyTitle("RemoteSheardObject")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("RemoteSheardObject")]
[assembly: AssemblyCopyright("Copyright © 2022")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// 将 ComVisible 设置为 false 会使此程序集中的类型
//对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型
//请将此类型的 ComVisible 特性设置为 true。
[assembly: ComVisible(false)]
// 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID
[assembly: Guid("49004f82-8aee-46da-bb14-bd02ac990ce2")]
// 程序集的版本信息由下列四个值组成:
//
// 主版本
// 次版本
// 生成号
// 修订号
//
//可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
//通过使用 "*",如下所示:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
using log4net;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
public class RemoteClient
{
public string GroupName;
public string Serveraddr;
WebSocket4Net.WebSocket webSocket;
readonly ILog LOGGER = LogManager.GetLogger("RollingLogFileAppender");
System.Timers.Timer timer;
public RemoteClient( string groupName, string serveraddr)
{
GroupName = groupName;
Serveraddr = serveraddr;
timer = new System.Timers.Timer(2000);
timer.Enabled = false;
timer.AutoReset = true;
timer.Elapsed += Timer_Elapsed;
webSocket = new WebSocket4Net.WebSocket(Serveraddr + GroupName);
LOGGER.Info("webSocket:" + serveraddr + GroupName);
webSocket.MessageReceived += WebSocket_MessageReceived;
webSocket.Closed += WebSocket_Closed;
webSocket.Opened += WebSocket_Opened;
//webSocket.AutoSendPingInterval = 2;
//webSocket.EnableAutoSendPing = true;
LOGGER.Info("webSocket open");
webSocket.Open();
timer.Start();
}
private void WebSocket_Opened(object sender, EventArgs e)
{
LOGGER.Info($"Remote:{GroupName} 连接成功");
LastState = webSocket.State;
}
private void WebSocket_Closed(object sender, EventArgs e)
{
if (LastState != webSocket.State)
{
LOGGER.Info($"Remote:{GroupName} 掉线了");
}
LastState = webSocket.State;
}
WebSocket4Net.WebSocketState LastState = WebSocket4Net.WebSocketState.None;
public bool IsOnline { get => webSocket.State == WebSocket4Net.WebSocketState.Open; }
private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
if (webSocket.State == WebSocket4Net.WebSocketState.Closed)
{
try
{
LOGGER.Info($"Remote:{GroupName} 重新连接");
//webSocket.Close();
//webSocket.Dispose();
//webSocket = new WebSocket4Net.WebSocket(Serveraddr + GroupName);
//LOGGER.Info("webSocket:" + Serveraddr + GroupName);
//webSocket.MessageReceived += WebSocket_MessageReceived;
//webSocket.Closed += WebSocket_Closed;
//webSocket.Opened += WebSocket_Opened;
webSocket.Open();
}
catch { }
}
}
volatile RemoteResult lastresult = RemoteResult.None;
private void WebSocket_MessageReceived(object sender, WebSocket4Net.MessageReceivedEventArgs e)
{
bool isok = false;
lastresult = RemoteResult.None;
RemoteLoad remoteLoad;
try
{
remoteLoad = JsonConvert.DeserializeObject<RemoteLoad>(e.Message);
}
catch
{
LOGGER.Info("Cant Deserialize remote command:" + e.Message);
return;
}
switch (remoteLoad.Action)
{
case "OK":
case "FAIL":
lastresult = remoteLoad.Action == "OK" ? RemoteResult.True : RemoteResult.False;
LOGGER.Info("Revice Command Callback" + remoteLoad.GroupName + "-" + remoteLoad.Action);
return;
default:
if (actionlist.ContainsKey(remoteLoad.Action)) {
isok= actionlist[remoteLoad.Action].Invoke(remoteLoad.RequestLoadInfo);
}
else
LOGGER.Info("unknow remote command:" + remoteLoad.Action);
break;
}
SendResult(isok);
}
Dictionary<string, Func<RequestLoadInfo, bool>> actionlist = new Dictionary<string, Func<RequestLoadInfo, bool>>();
public void AddAction(string actionName, Func<RequestLoadInfo, bool> action)
{
actionlist[actionName] = action;
}
RemoteResult WaitResult(int waittime=3000)
{
while (lastresult == RemoteResult.None && waittime > 0)
{
System.Threading.Thread.Sleep(50);
waittime = waittime - 50;
}
if (lastresult == RemoteResult.None)
{
LOGGER.Info("等待远程反馈超时");
lastresult = RemoteResult.Timeout;
}
return lastresult;
}
public RemoteResult SendAndWait(RemoteLoad remoteLoad, int waittime= 3000) {
remoteLoad.GroupName = GroupName;
if (remoteLoad.RequestLoadInfo != null)
{
if (string.IsNullOrEmpty(remoteLoad.RequestLoadInfo.DeviceGroupName))
remoteLoad.RequestLoadInfo.DeviceGroupName = GroupName;
}
webSocket.Send(JsonConvert.SerializeObject(remoteLoad));
return WaitResult(waittime);
}
void SendResult(bool result)
{
RemoteLoad remoteLoad = new RemoteLoad();
remoteLoad.Action = result ? "OK" : "FAIL";
remoteLoad.GroupName = GroupName;
webSocket.Send(JsonConvert.SerializeObject(remoteLoad));
}
}
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{49004F82-8AEE-46DA-BB14-BD02AC990CE2}</ProjectGuid>
<OutputType>Library</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>RemoteSheardObject</RootNamespace>
<AssemblyName>RemoteSheardObject</AssemblyName>
<TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<Deterministic>true</Deterministic>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="CodeLibrary">
<HintPath>..\..\GeneralClassLibrary\CodeLibraryProject\CodeLibrary\bin\Debug\CodeLibrary.dll</HintPath>
</Reference>
<Reference Include="log4net, Version=2.0.12.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion>
<HintPath>..\..\增广夹爪\Rmaxis\bin\Debug\log4net.dll</HintPath>
</Reference>
<Reference Include="Newtonsoft.Json, Version=13.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="SuperSocket.ClientEngine, Version=0.10.0.0, Culture=neutral, PublicKeyToken=ee9af13f57f00acc, processorArchitecture=MSIL">
<HintPath>..\packages\SuperSocket.ClientEngine.Core.0.10.0\lib\net45\SuperSocket.ClientEngine.dll</HintPath>
</Reference>
<Reference Include="System" />
<Reference Include="System.Collections.Specialized, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Collections.Specialized.4.3.0\lib\net46\System.Collections.Specialized.dll</HintPath>
</Reference>
<Reference Include="System.Core" />
<Reference Include="System.Net.NameResolution, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.NameResolution.4.3.0\lib\net46\System.Net.NameResolution.dll</HintPath>
</Reference>
<Reference Include="System.Net.Security, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Security.4.3.0\lib\net46\System.Net.Security.dll</HintPath>
</Reference>
<Reference Include="System.Net.Sockets, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Algorithms, Version=4.1.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Algorithms.4.3.0\lib\net461\System.Security.Cryptography.Algorithms.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Encoding, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.Primitives, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll</HintPath>
</Reference>
<Reference Include="System.Security.Cryptography.X509Certificates, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
</Reference>
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="WebSocket4Net, Version=0.15.2.11, Culture=neutral, PublicKeyToken=eb4e154b696bf72a, processorArchitecture=MSIL">
<HintPath>..\packages\WebSocket4Net.0.15.2\lib\net45\WebSocket4Net.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="Class1.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="RemoteClient.cs" />
<Compile Include="SLog.cs" />
<Compile Include="StoreCID.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
using log4net;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class SRec
{
static readonly ILog LOGGER = LogManager.GetLogger("SLog");
public SRec() { }
static string lastmsg = "";
public static void info(params string[] logtxts) {
var msg = string.Join("\t", logtxts);
if (msg == lastmsg)
return;
LOGGER.Info(msg);
lastmsg = msg;
}
public static void error(params string[] logtxts)
{
var msg = string.Join("\t", logtxts);
if (msg == lastmsg)
return;
LOGGER.Error(msg);
lastmsg = msg;
}
}
\ No newline at end of file

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
public class StoreCID
{
/// <summary>
/// 治具出入库口
/// </summary>
public const string AMH_ML5_1 = "AMH-ML5-1";
/// <summary>
/// 料串出入库口
/// </summary>
public const string AMH_ML5_2 = "AMH-ML5-2";
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="13.0.1" targetFramework="net461" />
<package id="SuperSocket.ClientEngine.Core" version="0.10.0" targetFramework="net461" />
<package id="System.Collections.Specialized" version="4.3.0" targetFramework="net461" />
<package id="System.Linq" version="4.3.0" targetFramework="net461" />
<package id="System.Net.NameResolution" version="4.3.0" targetFramework="net461" />
<package id="System.Net.Security" version="4.3.0" targetFramework="net461" />
<package id="System.Net.Sockets" version="4.3.0" targetFramework="net461" />
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net461" />
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net461" />
<package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net461" />
<package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="net461" />
<package id="System.Threading" version="4.3.0" targetFramework="net461" />
<package id="System.Threading.Timer" version="4.3.0" targetFramework="net461" />
<package id="WebSocket4Net" version="0.15.2" targetFramework="net461" />
</packages>
\ No newline at end of file
......@@ -29,6 +29,16 @@
<conversionPattern value="[%date][%t]%-5p %m%n"/>
</layout>
</appender>
<appender name="SLog" type="log4net.Appender.RollingFileAppender">
<file value="logs/SLog.log"/>
<param name="Encoding" value="UTF-8"/>
<appendToFile value="true"/>
<rollingStyle value="Date"/>
<datePattern value="yyyy-MM-dd"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="[%date][%t]%-5p %m%n"/>
</layout>
</appender>
<appender name="LngResource" type="log4net.Appender.RollingFileAppender">
<file value="logs/LngResource.log"/>
<param name="Encoding" value="UTF-8"/>
......@@ -51,6 +61,10 @@
<level value="ALL"/>
<appender-ref ref="LngResource"/>
</logger>
<logger name="SLog" additivity="false">
<level value="ALL"/>
<appender-ref ref="SLog"/>
</logger>
<!--<root>
<level value="Info" />
<appender-ref ref="RollingLogFileAppender" />
......
......@@ -58,7 +58,7 @@ namespace TheMachine
this.tabPage2.Padding = new System.Windows.Forms.Padding(3);
this.tabPage2.Size = new System.Drawing.Size(594, 489);
this.tabPage2.TabIndex = 1;
this.tabPage2.Text = "信息";
this.tabPage2.Text = "状态";
this.tabPage2.UseVisualStyleBackColor = true;
//
// groupBox1
......
......@@ -30,12 +30,18 @@ namespace TheMachine
List<T1> hYControls = new List<T1>();
List<MoveInfo> MoveInfos = new List<MoveInfo>();
public string DeviceName = "";
public void Init(string devicegroup) {
public void Init(string devicegroup,string prefixfilter="") {
//tabControl1.TabPages.Clear();
foreach (var dg in RobotManage.DeviceGroup.Values) {
if (dg.DeviceType != devicegroup)
continue;
if (!string.IsNullOrEmpty(prefixfilter))
{
if (!dg.GroupName.StartsWith(prefixfilter))
continue;
}
if (string.IsNullOrEmpty(DeviceName))
DeviceName = dg.Name;
......
......@@ -29,8 +29,13 @@ namespace TheMachine
/// </summary>
private void InitializeComponent()
{
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
this.设备操作ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.btn_run = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator();
this.btn_stop = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator();
this.启用调试模式ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator();
this.退出ToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();
......@@ -44,8 +49,6 @@ namespace TheMachine
this.listView1 = new TheMachine.DoubleBufferListView();
this.cb_EnableBuzzer = new System.Windows.Forms.CheckBox();
this.btn_PauseBuzzer = new System.Windows.Forms.Button();
this.btn_stop = new System.Windows.Forms.Button();
this.btn_run = new System.Windows.Forms.Button();
this.menuStrip1.SuspendLayout();
this.tabc.SuspendLayout();
this.tabP1.SuspendLayout();
......@@ -69,6 +72,10 @@ namespace TheMachine
// 设备操作ToolStripMenuItem
//
this.设备操作ToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.btn_run,
this.toolStripSeparator1,
this.btn_stop,
this.toolStripSeparator2,
this.启用调试模式ToolStripMenuItem,
this.toolStripSeparator4,
this.退出ToolStripMenuItem});
......@@ -77,6 +84,30 @@ namespace TheMachine
this.设备操作ToolStripMenuItem.Size = new System.Drawing.Size(86, 25);
this.设备操作ToolStripMenuItem.Text = "设备操作";
//
// btn_run
//
this.btn_run.Name = "btn_run";
this.btn_run.Size = new System.Drawing.Size(176, 26);
this.btn_run.Text = "启动";
this.btn_run.Click += new System.EventHandler(this.btn_run_Click);
//
// toolStripSeparator1
//
this.toolStripSeparator1.Name = "toolStripSeparator1";
this.toolStripSeparator1.Size = new System.Drawing.Size(173, 6);
//
// btn_stop
//
this.btn_stop.Name = "btn_stop";
this.btn_stop.Size = new System.Drawing.Size(176, 26);
this.btn_stop.Text = "停止";
this.btn_stop.Click += new System.EventHandler(this.btn_stop_Click);
//
// toolStripSeparator2
//
this.toolStripSeparator2.Name = "toolStripSeparator2";
this.toolStripSeparator2.Size = new System.Drawing.Size(173, 6);
//
// 启用调试模式ToolStripMenuItem
//
this.启用调试模式ToolStripMenuItem.Enabled = false;
......@@ -84,12 +115,14 @@ namespace TheMachine
this.启用调试模式ToolStripMenuItem.Size = new System.Drawing.Size(176, 26);
this.启用调试模式ToolStripMenuItem.Tag = "not";
this.启用调试模式ToolStripMenuItem.Text = "启用配置模式";
this.启用调试模式ToolStripMenuItem.Visible = false;
this.启用调试模式ToolStripMenuItem.Click += new System.EventHandler(this.启用调试模式ToolStripMenuItem_Click);
//
// toolStripSeparator4
//
this.toolStripSeparator4.Name = "toolStripSeparator4";
this.toolStripSeparator4.Size = new System.Drawing.Size(173, 6);
this.toolStripSeparator4.Visible = false;
//
// 退出ToolStripMenuItem
//
......@@ -139,10 +172,10 @@ namespace TheMachine
| System.Windows.Forms.AnchorStyles.Right)));
this.tabc.Controls.Add(this.tabP1);
this.tabc.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.tabc.Location = new System.Drawing.Point(0, 119);
this.tabc.Location = new System.Drawing.Point(0, 35);
this.tabc.Name = "tabc";
this.tabc.SelectedIndex = 0;
this.tabc.Size = new System.Drawing.Size(1008, 610);
this.tabc.Size = new System.Drawing.Size(1008, 361);
this.tabc.TabIndex = 1;
//
// tabP1
......@@ -150,9 +183,9 @@ namespace TheMachine
this.tabP1.Controls.Add(this.pnl);
this.tabP1.Location = new System.Drawing.Point(4, 30);
this.tabP1.Name = "tabP1";
this.tabP1.Size = new System.Drawing.Size(1000, 576);
this.tabP1.Size = new System.Drawing.Size(1000, 327);
this.tabP1.TabIndex = 0;
this.tabP1.Text = "信息";
this.tabP1.Text = "状态";
this.tabP1.UseVisualStyleBackColor = true;
//
// pnl
......@@ -161,28 +194,27 @@ namespace TheMachine
this.pnl.Dock = System.Windows.Forms.DockStyle.Fill;
this.pnl.Location = new System.Drawing.Point(0, 0);
this.pnl.Name = "pnl";
this.pnl.Size = new System.Drawing.Size(1000, 576);
this.pnl.Size = new System.Drawing.Size(1000, 327);
this.pnl.TabIndex = 273;
//
// listView1
//
this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.listView1.BorderStyle = System.Windows.Forms.BorderStyle.None;
this.listView1.Dock = System.Windows.Forms.DockStyle.Fill;
this.listView1.HeaderStyle = System.Windows.Forms.ColumnHeaderStyle.Nonclickable;
this.listView1.HideSelection = false;
this.listView1.Location = new System.Drawing.Point(8, 3);
this.listView1.Location = new System.Drawing.Point(0, 0);
this.listView1.MultiSelect = false;
this.listView1.Name = "listView1";
this.listView1.ShowGroups = false;
this.listView1.Size = new System.Drawing.Size(989, 327);
this.listView1.Size = new System.Drawing.Size(1000, 327);
this.listView1.TabIndex = 2;
this.listView1.UseCompatibleStateImageBehavior = false;
//
// cb_EnableBuzzer
//
this.cb_EnableBuzzer.AutoSize = true;
this.cb_EnableBuzzer.Location = new System.Drawing.Point(344, 63);
this.cb_EnableBuzzer.Location = new System.Drawing.Point(334, 6);
this.cb_EnableBuzzer.Name = "cb_EnableBuzzer";
this.cb_EnableBuzzer.Size = new System.Drawing.Size(96, 18);
this.cb_EnableBuzzer.TabIndex = 5;
......@@ -193,51 +225,27 @@ namespace TheMachine
// btn_PauseBuzzer
//
this.btn_PauseBuzzer.BackColor = System.Drawing.Color.OrangeRed;
this.btn_PauseBuzzer.Location = new System.Drawing.Point(551, 51);
this.btn_PauseBuzzer.ForeColor = System.Drawing.Color.White;
this.btn_PauseBuzzer.Location = new System.Drawing.Point(490, 0);
this.btn_PauseBuzzer.Name = "btn_PauseBuzzer";
this.btn_PauseBuzzer.Size = new System.Drawing.Size(301, 40);
this.btn_PauseBuzzer.Size = new System.Drawing.Size(301, 29);
this.btn_PauseBuzzer.TabIndex = 6;
this.btn_PauseBuzzer.Text = "本次暂停警报器响声";
this.btn_PauseBuzzer.UseVisualStyleBackColor = false;
this.btn_PauseBuzzer.Visible = false;
this.btn_PauseBuzzer.Click += new System.EventHandler(this.btn_PauseBuzzer_Click);
//
// btn_stop
//
this.btn_stop.Enabled = false;
this.btn_stop.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btn_stop.Location = new System.Drawing.Point(154, 42);
this.btn_stop.Name = "btn_stop";
this.btn_stop.Size = new System.Drawing.Size(105, 55);
this.btn_stop.TabIndex = 3;
this.btn_stop.Text = "停止";
this.btn_stop.UseVisualStyleBackColor = true;
this.btn_stop.Click += new System.EventHandler(this.btn_stop_Click);
//
// btn_run
//
this.btn_run.Font = new System.Drawing.Font("微软雅黑", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.btn_run.Location = new System.Drawing.Point(25, 42);
this.btn_run.Name = "btn_run";
this.btn_run.Size = new System.Drawing.Size(105, 55);
this.btn_run.TabIndex = 4;
this.btn_run.Tag = "not";
this.btn_run.Text = "启动";
this.btn_run.UseVisualStyleBackColor = true;
this.btn_run.Click += new System.EventHandler(this.btn_run_Click);
//
// Form1
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.BackColor = System.Drawing.Color.White;
this.ClientSize = new System.Drawing.Size(1008, 729);
this.ClientSize = new System.Drawing.Size(1008, 396);
this.Controls.Add(this.tabc);
this.Controls.Add(this.btn_stop);
this.Controls.Add(this.btn_PauseBuzzer);
this.Controls.Add(this.cb_EnableBuzzer);
this.Controls.Add(this.btn_run);
this.Controls.Add(this.menuStrip1);
this.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MainMenuStrip = this.menuStrip1;
this.Name = "Form1";
this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
......@@ -263,8 +271,6 @@ namespace TheMachine
private System.Windows.Forms.ToolStripMenuItem 启用调试模式ToolStripMenuItem;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator4;
private DoubleBufferListView listView1;
private System.Windows.Forms.Button btn_stop;
private System.Windows.Forms.Button btn_run;
private System.Windows.Forms.TabPage tabP1;
private System.Windows.Forms.ToolStripMenuItem 关于ToolStripMenuItem;
private System.Windows.Forms.CheckBox cb_EnableBuzzer;
......@@ -273,6 +279,10 @@ namespace TheMachine
private System.Windows.Forms.ToolStripMenuItem 语言toolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem 简体中文ToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem englishToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem btn_run;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator1;
private System.Windows.Forms.ToolStripMenuItem btn_stop;
private System.Windows.Forms.ToolStripSeparator toolStripSeparator2;
}
}
......@@ -65,7 +65,9 @@ namespace TheMachine
TrayManagerControl tmc = new TrayManagerControl();
DeviceControl<HYControl> hy = new DeviceControl<HYControl>();
DeviceControl<TransplantControl> yz = new DeviceControl<TransplantControl>();
DeviceControl<TrayStopControl> ts = new DeviceControl<TrayStopControl>();
DeviceControl<TrayStopControl> ml = new DeviceControl<TrayStopControl>();
DeviceControl<TrayStopControl> mi = new DeviceControl<TrayStopControl>();
DeviceControl<TrayStopControl> ci = new DeviceControl<TrayStopControl>();
AxisControl ac = new AxisControl();
SettingControl sc = new SettingControl();
......@@ -105,17 +107,13 @@ namespace TheMachine
listView1.Columns.Add(timecol);
listView1.Columns.Add(devicecol);
listView1.Columns.Add(msgcol);
listView1.ColumnWidthChanging += listView_ColumnWidthChanging;
//listView1.ColumnWidthChanging += listView_ColumnWidthChanging;
#endregion
LogUtil.info("开始初始化");
cb_EnableBuzzer.Checked = Setting_Init.Device_EnableBuzzer;
AlarmBuzzer.BuzzerStateChange += AlarmBuzzer_BuzzerStateChange;
RobotManage.LoadFinishEvent += RobotManage_LoadFinishEvent;
//if (!Setting_Init.Device_DisableLogWindow)
// AddForm("tab_log", crc.GetString(L.tab_log, "日志"), lc);
RobotManage.UserPauseSet += RobotManage_UserPauseSet;
......@@ -148,12 +146,14 @@ namespace TheMachine
}
const int tabpagecount = 5;
void addTablePage() {
AddForm("tab_io","I/O", ioc);
AddForm("tab_io","MT", ioc);
AddForm("tab_tmc",crc.GetString("Form1_tabc_tab_tmc_Text","托盘"), tmc);
AddForm("tab_sidemove", hy.DeviceName, hy);
AddForm("tab_transmove", yz.DeviceName, yz);
AddForm("tab_traystop", ts.DeviceName, ts);
AddForm("tab_setting", crc.GetString("Form1_tabc_tab_setting_Text","相关设置"), sc);
AddForm("tab_traystopML", "ML", ml);
AddForm("tab_traystopMI", "MI", mi);
AddForm("tab_traystopCI", "CI", ci);
AddForm("tab_traysetting", crc.GetString("Form1_tabc_tab_setting__SettingControl_tabControl1_tabPage1_Text","治具设置"), sc);
crc.LanguageProcess(this);
}
......@@ -241,7 +241,6 @@ namespace TheMachine
return;
}
pnl.Enabled = true;
if (state)
{
......@@ -250,10 +249,11 @@ namespace TheMachine
MsgService.ShowMsg += MsgService_ShowMsg;
}
hy.Init("LS");
yz.Init("SISO");
ts.Init("RT");
ml.Init("RT", "AMH-ML");
mi.Init("RT", "AMH-MI");
ci.Init("RT", "CI");
ioc.Config = RobotManage.Config;
tmc.Config = RobotManage.Config;
addTablePage();
......@@ -398,15 +398,14 @@ namespace TheMachine
if (e)
{
userpause = true;
(btn_run as Button).Text = crc.GetString("Res0203","恢复运行");
(btn_run as Button).BackColor = Color.LightGreen;
(btn_run as ToolStripMenuItem).Text = crc.GetString("Res0203","恢复运行");
(btn_run as ToolStripMenuItem).BackColor = Color.LightGreen;
}
else
{
userpause = false;
(btn_run as Button).Text = crc.GetString("Res0204","暂停运行");
(btn_run as Button).BackColor = Color.Yellow;
(btn_run as ToolStripMenuItem).Text = crc.GetString("Res0204","暂停运行");
(btn_run as ToolStripMenuItem).BackColor = Color.Yellow;
}
......@@ -522,9 +521,9 @@ namespace TheMachine
if (RobotManage.isRunning)
{
if (userpause)
(btn_run as Button).Text = crc.GetString("Res0203","恢复运行");
(btn_run as ToolStripMenuItem).Text = crc.GetString("Res0203","恢复运行");
else
(btn_run as Button).Text = crc.GetString("Res0204","暂停运行");
(btn_run as ToolStripMenuItem).Text = crc.GetString("Res0204","暂停运行");
}
}
......@@ -539,5 +538,18 @@ namespace TheMachine
Setting_Init.Device_Default_Language = "en-US";
crc.LanguageChange();
}
private void button1_Click(object sender, EventArgs e)
{
RequestLoadInfo requestLoadInfo = new RequestLoadInfo();
requestLoadInfo.DeviceGroupName = "AMH-SBDH1-1";
requestLoadInfo.IsEmpty = false;
requestLoadInfo.TrayType = "MTP1";
requestLoadInfo.LoadParam = new ReelParam();
requestLoadInfo.LoadParam.WareCode = "C001-0002";
requestLoadInfo.LoadParam.PosID = "SO1053S05_4_3_1";
requestLoadInfo.LoadParam.PlateH = 70;
TrayManager.SetTrayLoadInfo("MTP1-0012", requestLoadInfo);
}
}
}
\ No newline at end of file
......@@ -120,4 +120,1137 @@
<metadata name="menuStrip1.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAgIAAAAEAIAAoCAEAFgAAACgAAACAAAAAAAEAAAEAIAAAAAAAAAABABILAAASCwAAAAAAAAAA
AAD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8APDw8EIaGhkiGhoZIqqqqcKqqqoKqqqqCqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqp/qqqqbKqqqmx/f38/KioqCv///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wA8PDwQhoaGSIaGhkiqqqpwqqqqgqqqqoKqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqq
qoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqoWqqqqFqqqqhaqqqn+qqqpsqqqqbH9/
fz8qKioK////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AFxcXChcXFwo6enpnP///+Ti4uK24uLitri4uIyqqqp3qqqqd6qq
qnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqq
qnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqq
qnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqq
qnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqq
qnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqqqnKqqqpyqqqqcqqq
qnKqqqpyqqqqcqqqqnKqqqpyqqqqer+/v5K/v7+S6enpv////+LU1NSJ1NTUiU1NTRr///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AHBwcBhwcHAbNzc2C////4v//
/+LGxsZ5SEhIFP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AVVVVHtvb243b29uN////47GxsWWxsbFlDg4OAf///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AD8/Pwzw8PCz8PDws/Dw8LRcXFwZXFxcGf///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wB4eHgq////zP//
/8zi4uKSIyMjAyMjIwP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8APz8/DPDw8LPw8PCz8PDwtFxc
XBlcXFwZ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AHh4eCr////M////zOLi4pIjIyMDIyMjA////wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AIyMjBCMjIwTw8PCu4uLioOLi4qAcHBwG////AP///wD///8A////AP///wD///8AHBwcASoq
KggqKioIKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioq
KgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioq
KgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioq
KgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioq
KgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioKKioqCioq
KgoqKioKKioqCioqKgoqKioKKioqCioqKgoqKioH////AP///wD///8A////AP///wD///8A////ADg4
OA84ODgP8PDwwdTU1IjU1NSI////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wDGxsZzxsbGc/f3970qKioGKioqBv//
/wD///8A////AP///wAwMDANsbGxeLGxsXjw8PDK////5f///+X////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f///+n////q////6v//
/+Pp6enA6enpwKKiomUeHh4G////AP///wD///8A////AP///wBNTU0U////2P///9ibm5tL////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AMbGxnPGxsZz9/f3vSoqKgYqKioG////AP///wD///8A////ADAwMA2xsbF4sbGxePDw
8Mr////l////5f///+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f///+n////p////6f//
/+n////p////6f///+n////p////6f///+r////q////4+np6cDp6enAoqKiZR4eHgb///8A////AP//
/wD///8A////AE1NTRT////Y////2Jubm0v///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wBNTU0b////5f///+VVVVUi////AP//
/wD///8A////AP///wBqamoi+Pj4z9vb25/b29ufjY2NNioqKg0qKioNKioqBioqKgYqKioGKioqBioq
KgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioq
KgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioq
KgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioq
KgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioq
KgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioqKgYqKioGKioqBioq
KgY4ODgRlJSUQ5SUlEPp6em18vLyu0ZGRhFGRkYR////AP///wD///8A////AH9/f0J/f39C////2CMj
Iwj///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AMbGxoXU1NSO1NTUjv///wD///8A////AP///wA/Pz8TPz8/E////9e2trZi////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ABwcHAHOzs6D9/f3vff3
970cHBwG////AP///wD///8AHBwcARwcHAHp6em4m5ubW////wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AxsbGhdTU1I7U1NSO////AP//
/wD///8A////AD8/PxM/Pz8T////17a2tmL///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AHBwcAc7OzoP39/e99/f3vRwcHAb///8A////AP///wAcHBwBHBwcAenp
6bibm5tb////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////ACoqKgH////XcXFxLXFxcS3///8A////AP///wD///8A1NTUmNTU1JjU1NSP////AP//
/wD///8A////AP///wD///8A////AP///wD///8AcXFxI39/fz1NTU0RTU1NEf///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ACoq
KgcqKioHeHh4NXFxcS9xcXEvHBwcA////wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wBNTU0Pf39/O39/fztxcXEk////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wBqamoif39/PH9/fzxNTU0R////AP///wD///8A////AP///wD///8AHh4eA+np
6bfp6em3sbGxbv///wD///8A////AP///wD///8Am5ubVPf397H///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AVVVVJf///9kYGBgBGBgYAf//
/wD///8A////AFtbWxv////h////4UhISBH///8A////AP///wD///8A////AP///wAqKioI4ODgpeDg
4KX////G1NTUo////9f////XsLCwYv///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wBiYmIs////0v///9La2tqt5ubms+bm5rP4+PjJYWFhI2Fh
YSP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wCwsLBcsLCwXP///9bU1NSl1NTUpf///8Pf39+dGBgYAhgYGAL///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////ADAwMAkwMDAJ7Ozsp////8bOzs6kzs7OpP//
/9a8vLxjvLy8Y////wD///8A////AP///wD///8Ac3NzLHNzcyz////aMDAwBjAwMAb///8A////AP//
/wBCQkIT////5CoqKggqKioI////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wB/f39K4uLis////wD///8A////AP///wD///8Af39/VOLi4qri4uKq////AP//
/wD///8A////AP///wD///8A////AKqqqmvw8PCt8PDwrSMjIwP///8AY2NjG2NjYxv////jY2NjHGNj
Yxz///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////APLy
8q6xsbFOsbGxTv///wD///8A////AMbGxm739/eu9/f3rv///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8ARkZGE////+T////kY2NjIf///wD///8AFRUVA+Dg
4LCNjY1MjY2NTP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AoqKibKKiomzp6emsIyMjA////wD///8AY2NjHP///+X////lRkZGGv///wD///8A////AP//
/wAODg4BDg4OAf///9RVVVUqVVVVKv///wD///8A////AP///wD////dVVVVIFVVVSD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AH9/f0ri4uKz////AP//
/wD///8A////AP///wB/f39U4uLiquLi4qr///8A////AP///wD///8A////AP///wD///8Aqqqqa/Dw
8K3w8PCtIyMjA////wBjY2MbY2NjG////+NjY2McY2NjHP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A8vLyrrGxsU6xsbFO////AP///wD///8AxsbGbvf3
96739/eu////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wBGRkYT////5P///+RjY2Mh////AP///wAVFRUD4ODgsI2NjUyNjY1M////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wCioqJsoqKibOnp6awjIyMD////AP//
/wBjY2Mc////5f///+VGRkYa////AP///wD///8A////AA4ODgEODg4B////1FVVVSpVVVUq////AP//
/wD///8A////AP///91VVVUgVVVVIP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8Af39/U9TU1Kb///8A////AP///wD///8A////AH9/f2rU1NSM1NTUjP//
/wD///8A////AP///wD///8A////AP///wDU1NSZlJSUZJSUlGT///8A////AP///wD///8A1NTUuH9/
f0F/f39B////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD////MKioqDSoqKg3///8A////AP///wBVVVUd////4P///+D///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AH9/fzbp6enC6enpwv///wD///8A////AP//
/wCjo6Nvqqqqe6qqqnv///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AKqqqpmqqqqZqqqqXv///wD///8A////AP///wD///+6////ulVVVT////8A////AP//
/wD///8A////AP///wD///+3VVVVP1VVVT////8A////AP///wD///8A////0FVVVShVVVUo////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wB/f39L4uLisv//
/wD///8A////AP///wD///8Af39/VuLi4qji4uKo////AP///wD///8A////AP///wD///8A////AKqq
qm/p6emn6enppxUVFQL///8AXFxcFlxcXBb////iampqHmpqah7///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////APLy8rObm5tEm5ubRP///wD///8A////ALi4
uGL39/e09/f3tP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8ATU1NFf///+T////kXFxcHf///wD///8AFRUVAdra2quUlJRQlJSUUP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AoqKicKKionDi4uKmIyMjAf//
/wD///8AXFxcGP///+T////kRkZGHP///wD///8A////AP///wD///8A////AP///9JVVVUrVVVVK///
/wD///8A////AP///wD////bVVVVIVVVVSH///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AH9/f0vi4uKy////AP///wD///8A////AP///wB/f39W4uLiqOLi
4qj///8A////AP///wD///8A////AP///wD///8Aqqqqb+np6afp6emnFRUVAv///wBcXFwWXFxcFv//
/+JqamoeampqHv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A8vLys5ubm0Sbm5tE////AP///wD///8AuLi4Yvf397T39/e0////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wBNTU0V////5P///+RcXFwd////AP//
/wAVFRUB2traq5SUlFCUlJRQ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wCioqJwoqKicOLi4qYjIyMB////AP///wBcXFwY////5P///+RGRkYc////AP//
/wD///8A////AP///wD///8A////0lVVVStVVVUr////AP///wD///8A////AP///9tVVVUhVVVVIf//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AXFxcK///
/9X///8A////AP///wD///8A////AGNjYyL////g////4Dg4OAf///8A////AP///wD///8A////AP//
/wAxMTEM8PDwxfDw8MXi4uK2sbGxiPf399f39/fX29vbfv///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wB5eXk7////4////+PGxsaU1NTUndTU
1J3////fcXFxLXFxcS3///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wDU1NR11NTUdff399u/v7+Kv7+/iuLi4rL4+Pi5IyMjBSMjIwX///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ADg4OA04ODgN9/f3xenp
6be4uLiJuLi4iff399nNzc19zc3Nff///wD///8A////AP///wD///8AY2NjHmNjYx7////jODg4CTg4
OAn///8A////AP///wA4ODgP////5zExMQoxMTEK////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wA/Pz8E////4Gpqah9qamof////AP///wD///8A////APDw
8Lbw8PC2uLi4a////wD///8A////AP///wD///8A////AP///wAxMTEIMTExCJubm1eqqqp2eHh4Onh4
eDr///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wBVVVUhVVVVIaKiom+bm5tpm5ubaT8/Pxf///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AeHh4Nqqq
qnWqqqp1m5ubWyoqKgj///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wAqKioIlJSUV6qqqnaqqqp2eHh4Of///wD///8A////AP//
/wD///8A////AP///wDU1NSV1NTUldTU1Iv///8A////AP///wD///8A////AJSUlEP///+/////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD8/
PwT////gampqH2pqah////8A////AP///wD///8A8PDwtvDw8La4uLhr////AP///wD///8A////AP//
/wD///8A////ADExMQgxMTEIm5ubV6qqqnZ4eHg6eHh4Ov///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AFVVVSFVVVUhoqKib5ub
m2mbm5tpPz8/F////wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wB4eHg2qqqqdaqqqnWbm5tbKioqCP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ACoq
KgiUlJRXqqqqdqqqqnZ4eHg5////AP///wD///8A////AP///wD///8A////ANTU1JXU1NSV1NTUi///
/wD///8A////AP///wD///8AlJSUQ////7////8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////ANTU1Jq/v792v7+/dv///wD///8A////AP//
/wBjY2MoY2NjKP///+OLi4s6////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wCqqqpX////2P///9g4ODgS////AP///wD///8A////AP///wDb29ugsbGxb///
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AampqLv///+D////gODg4EP///wD///8A////AP///wD///8AoqKiQf///92xsbFnsbGxZ0ZG
Rgz///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AFVVVRRVVVUUxsbGf////9h4eHgoeHh4KP//
/wD///8A////AP///wBjY2MoY2NjKP///+M/Pz8S////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A29vbmNvb25ji4uKZ////AP//
/wD///8A////AP///wD///8AZ2dnKuLi4rDi4uKw////5v///8j////I////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z////O////5P///+TU1NSeTk5OGv///wD///8A////AP///wD///8AKioqBvf397739/e+uLi4bv//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wDb29uY29vbmOLi4pn///8A////AP///wD///8A////AP///wBnZ2cq4uLisOLi
4rD////m////yP///8j///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP///7z///+8////vP//
/7z///+8////vP///7z///+8////vP///7z///+8////vP///87////k////5NTU1J5OTk4a////AP//
/wD///8A////AP///wAqKioG9/f3vvf39764uLhu////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////ADg4OA84ODgP9/f30MbG
xnPGxsZz////AP///wD///8A////AP///wD///8A////AEZGRg9VVVUzVVVVM1VVVTxVVVU8VVVVPFVV
VTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVV
VTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVV
VTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVV
VTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVV
VTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVVVTxVVVU8VVVVPFVV
VTxVVVU8VVVVLz8/Pwo/Pz8K////AP///wD///8A////AP///wAcHBwEHBwcBNvb25ji4uKy4uLisiMj
IwP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wBbW1sb+Pj4xfj4+MXOzs6UPDw8ETw8PBH///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AVVVVHuDg4K/g4OCv7Ozsqzw8PAw8PDwM////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AFtb
Wxv4+PjF+Pj4xc7OzpQ8PDwRPDw8Ef///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wBVVVUe4ODgr+Dg4K/s7OyrPDw8DDw8
PAz///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////ACMjIwkjIyMJzc3Njf///+D////guLi4a0hI
SA3///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AFVV
VRbNzc2Azc3NgP///+TGxsZxxsbGcQ4ODgP///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AhoaGM4aGhjPp6emq////4dvb26vb29uruLi4gKqqqmmqqqppqqqqZ6qq
qmeqqqpnqqqqZ6qqqmeqqqpnqqqqZ6qqqmeqqqpoqqqqaKqqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qq
qm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qq
qm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqmqqqqpnqqqqZ6qqqmeqqqpnqqqqZ6qqqmiqqqpvqqqqb6qq
qm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qq
qm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpsqqqqbKqqqmeqqqpnqqqqZ6qq
qmeqqqpnqqqqZ6qqqmeqqqprv7+/hr+/v4bi4uK1////4uLi4pji4uKYampqIv///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCGhoYzhoaGM+np
6ar////h29vbq9vb26u4uLiAqqqqaaqqqmmqqqpnqqqqZ6qqqmeqqqpnqqqqZ6qqqmeqqqpnqqqqZ6qq
qmiqqqpoqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qq
qm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqaqqq
qmeqqqpnqqqqZ6qqqmeqqqpnqqqqaKqqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qq
qm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qqqm+qqqpvqqqqb6qq
qm+qqqpvqqqqb6qqqmyqqqpsqqqqZ6qqqmeqqqpnqqqqZ6qqqmeqqqpnqqqqZ6qqqmu/v7+Gv7+/huLi
4rX////i4uLimOLi4phqamoi////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AGFhYRiGhoZVhoaGVaqqqnuqqqqMqqqqjKqq
qo2qqqqNqqqqjaqqqo2qqqqNqqqqjaqqqo2qqqqNxsbGl8bGxpfy8vLlqqqqm6qqqpuqqqqbqqqqm6qq
qpuqqqqbqqqqm6qqqpuqqqqbqqqqm6qqqpuqqqqbqqqqm6qqqpuqqqqbqqqqm6qqqpuqqqqbqqqqm6qq
qpuqqqqbqqqqm6qqqpuqqqqb4uLi0uLi4tLi4uK7qqqqjaqqqo2qqqqNqqqqjaqqqo24uLiS////87i4
uJ+4uLifqqqqm6qqqpuqqqqbqqqqm6qqqpuqqqqbqqqqm6qqqpuqqqqbqqqqm6qqqpuqqqqbqqqqm6qq
qpuqqqqbqqqqm6qqqpuqqqqbqqqqm6qqqpuqqqqbqqqqm6qqqpva2tq/4uLiyuLi4sqqqqqNqqqqjaqq
qo2qqqqNqqqqjaqqqo2qqqqNqqqqiqqqqneqqqp3f39/TE5OThD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wBVVVUWVVVVFtra2r7///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCqqqqNqqqqjaqq
qmf///8A////AP///wD///8A////ACoqKgv////jKioqCioqKgr///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AJGRkV2qqqqJqqqqif///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AFVVVRZVVVUW2travv///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AKqqqo2qqqqNqqqqZ////wD///8A////AP///wD///8AKioqC///
/+MqKioKKioqCv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AkZGRXaqqqomqqqqJ////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AVVVVFlVVVRba2tq+////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8Aqqqqjaqq
qo2qqqpn////AP///wD///8A////AP///wAqKioL////4yoqKgoqKioK////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wCRkZFdqqqqiaqqqon///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wBVVVUWVVVVFtra2r7///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wCqqqqNqqqqjaqqqmf///8A////AP///wD///8A////ACoq
Kgv////jKioqCioqKgr///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AJGRkV2qqqqJqqqqif//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AFVVVRZVVVUW2travv///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AKqq
qo2qqqqNqqqqZ////wD///8A////AP///wD///8AKioqC////+MqKioKKioqCv///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AkZGRXaqqqomqqqqJ////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AVVVVFlVVVRba2tq+////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8Aqqqqjaqqqo2qqqpn////AP///wD///8A////AP//
/wAqKioL////4yoqKgoqKioK////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCRkZFdqqqqiaqq
qon///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wBVVVUWVVVVFtra2r7///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wCqqqqNqqqqjaqqqmf///8A////AP///wD///8A////ACoqKgv////jKioqCioqKgr///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AJGRkV2qqqqJqqqqif///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AFVVVRZVVVUW2travv//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AKqqqo2qqqqNqqqqZ////wD///8A////AP//
/wD///8AKioqC////+MqKioKKioqCv///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AkZGRXaqq
qomqqqqJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AVVVVFlVVVRba2tq+////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8Aqqqqjaqqqo2qqqpn////AP///wD///8A////AP///wAqKioL////4yoqKgoqKioK////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wCRkZFdqqqqiaqqqon///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wBVVVUWVVVVFtra
2r7///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wCqqqqNqqqqjaqqqmf///8A////AP//
/wD///8A////ACoqKgv////jKioqCioqKgr///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AJGR
kV2qqqqJqqqqif///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AFVVVRZVVVUW2travv///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AKqqqo2qqqqNqqqqZ////wD///8A////AP///wD///8AKioqC////+MqKioKKioqCv//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8AkZGRXaqqqomqqqqJ////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AVVVVFlVV
VRba2tq+////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8Aqqqqjaqqqo2qqqpn////AP//
/wD///8A////AP///wAqKioL////4yoqKgoqKioK////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wCRkZFdqqqqiaqqqon///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wBVVVUWVVVVFtra2r7///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wCqqqqNqqqqjaqqqmf///8A////AP///wD///8A////ACoqKgv////jKioqCioq
Kgr///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AJGRkV2qqqqJqqqqif///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AFVV
VRZVVVUW2travv///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AKqqqo2qqqqNqqqqZ///
/wD///8A////AP///wD///8AKioqC////+MqKioKKioqCv///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AkZGRXaqqqomqqqqJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8AVVVVGFVVVRjs7OzMf39/O39/fzt/f387f39/O39/
fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/
fzt/f387f39/O39/fzt/f3871NTUp9TU1Keqqqpr////AP///wD///8A////AP///wAqKioN////6JSU
lEOUlJRDf39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/
fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzvIyMiDqqqqjKqqqoz///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wBVVVUYVVVVGOzs7Mx/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/
fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzvU1NSn1NTUp6qq
qmv///8A////AP///wD///8A////ACoqKg3////olJSUQ5SUlEN/f387f39/O39/fzt/f387f39/O39/
fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/fzt/f387f39/O39/
fzt/f387f39/O8jIyIOqqqqMqqqqjP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AFVVVSFVVVUh+Pj47tTU1L3U1NS91NTUvdTU
1L3U1NS91NTUvdTU1L3U1NS91NTUvdTU1L3U1NS91NTUvdTU1L3U1NS91NTUvdTU1L3U1NS91NTUvdTU
1L3U1NS91NTUvdTU1L3U1NS91NTUvfDw8OTw8PDkqqqqd////wD///8A////AP///wD///8AKioqEf//
//bb29vA29vbwNTU1L3U1NS91NTUvdTU1L3U1NS91NTUvdTU1L3U1NS91NTUvdTU1L3U1NS91NTUvdTU
1L3U1NS91NTUvdTU1L3U1NS91NTUvdTU1L3U1NS91NTUvdTU1L3U1NS97Ozs2KqqqpOqqqqT////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8AVVVVIVVVVSHa2trK////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8Aqqqql6qq
qpeqqqp3////AP///wD///8A////AP///wAqKioR////9CoqKgwqKioM////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wCRkZFrqqqqk6qqqpP///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wBVVVUhVVVVIdra2sr///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wCqqqqXqqqql6qqqnf///8A////AP///wD///8A////ACoq
KhH////0KioqDCoqKgz///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AJGRkWuqqqqTqqqqk///
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AFVVVSFVVVUh2trayv///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AKqq
qpeqqqqXqqqqd////wD///8A////AP///wD///8AKioqEf////QqKioMKioqDP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8AkZGRa6qqqpOqqqqT////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AVVVVIVVVVSHa2trK////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8Aqqqql6qqqpeqqqp3////AP///wD///8A////AP//
/wAqKioR////9CoqKgwqKioM////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCRkZFrqqqqk6qq
qpP///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wBVVVUhVVVVIezs7Nt/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/
f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/
f1fU1NS61NTUuqqqqnf///8A////AP///wD///8A////ACoqKhH////1lJSUX5SUlF9/f39Xf39/V39/
f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/
f1d/f39Xf39/V39/f1d/f39Xf39/V8jIyJ2qqqqTqqqqk////wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AFVVVSFVVVUh7Ozs239/
f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/
f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V9TU1LrU1NS6qqqqd////wD///8A////AP//
/wD///8AKioqEf////WUlJRflJSUX39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/
f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39Xf39/V39/f1d/f39XyMjInaqq
qpOqqqqT////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8ARkZGF0ZGRhfU1NS31NTUutTU1LrU1NS61NTUutTU1LrU1NS61NTUutTU
1LrU1NS61NTUutTU1LrU1NS61NTUutTU1LrU1NS61NTUutTU1LrU1NS61NTUutTU1LrU1NS61NTUutTU
1LrU1NS61NTUutTU1LqNjY1W////AP///wD///8A////AP///wAjIyMM1NTUtNTU1LrU1NS61NTUutTU
1LrU1NS61NTUutTU1LrU1NS61NTUutTU1LrU1NS61NTUutTU1LrU1NS61NTUutTU1LrU1NS61NTUutTU
1LrU1NS61NTUutTU1LrU1NS61NTUutTU1LrU1NS6jY2Na42NjWv///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP//
/wD///8A////AP///wD///8A////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////gAAAA
AAAAAAAAAAP/////4AAAAAAAAAAAAAAD/////wAAAAAAAAAAAAAAAH////gP//////////////gP///w
P///////////////A///8D///////////////wP//8D8AAAAAAAAAAAAAD+D///B4AAAAAAAAAAAAAAD
4f//weAAAAAAAAAAAAAAA+H//4fAAAAAAAAAAAAAAADw//+PD//////////////wcP//jw//////////
////8HD//w8f8P//wP//4f//4fh8//8OH4B//4A//4A//wB8HD//Pj+EH/+OP/8MP/8MPB4//z4/hB//
jj//DD//DDweP/8+P48f/44//x4//x4/Hj//Pj+EH/+OP/8MP/8MPx4//z4/hB//jj//DD//DD8eP/8+
H4B//4A//4A//wB8HD//Dx/A///A///g///B/Hz//w8fwP//wP//4P//wfx8//+PD//////////////4
fP//h8H/////////////wPD//8fgAAAAAAAAAAAAAAPh///H4AAAAAAAAAAAAAAD4f//wfwAAAAAAAAA
AAAAD4H///A///////////////8D///wP///////////////A///+A//////////////+A////8AAAAA
AAAAAAAAAAB/////AAAAAAAAAAAAAAAAf////+AAAAAAAAAAAAAAA////////4////Hw///+P///////
//+P///x8P///j//////////j///8fD///4//////////4////Hw///+P/////////+P///x8P///j//
////////j///8fD///4//////////4////Hw///+P/////////+P///x8P///j//////////j///8fD/
//4//////////4////Hw///+P/////////+P///x8P///j//////////j///8fD///4//////////4//
//Hw///+P/////////+P///x8P///j//////////gAAAAfAAAAA//////////4AAAAHwAAAAP///////
//+AAAAB8AAAAD//////////j///8fD///4//////////4////Hw///+P/////////+P///x8P///j//
////////j///8fD///4//////////4AAAAHwAAAAP/////////+AAAAB8AAAAD//////////gAAAAfAA
AAA/////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////8=
</value>
</data>
</root>
\ No newline at end of file
此文件类型无法预览
......@@ -35,13 +35,12 @@ namespace TheMachine
this.tabControl1 = new System.Windows.Forms.TabControl();
this.tabPage_set = new System.Windows.Forms.TabPage();
this.tabPage_ledtower = new System.Windows.Forms.TabPage();
this.uC_LedConfig1 = new TheMachine.UC.UC_LedConfig();
this.tabPage1 = new System.Windows.Forms.TabPage();
this.fixtureSizeConfigControl1 = new DeviceLibrary.FixtureSizeConfigControl();
this.uC_LedConfig1 = new TheMachine.UC.UC_LedConfig();
this.tabControl1.SuspendLayout();
this.tabPage_set.SuspendLayout();
this.tabPage_ledtower.SuspendLayout();
this.tabPage1.SuspendLayout();
this.SuspendLayout();
//
// chbAutoRun
......@@ -50,7 +49,7 @@ namespace TheMachine
this.chbAutoRun.Location = new System.Drawing.Point(24, 29);
this.chbAutoRun.Margin = new System.Windows.Forms.Padding(10);
this.chbAutoRun.Name = "chbAutoRun";
this.chbAutoRun.Size = new System.Drawing.Size(84, 16);
this.chbAutoRun.Size = new System.Drawing.Size(96, 18);
this.chbAutoRun.TabIndex = 1;
this.chbAutoRun.Text = "开机自启动";
this.chbAutoRun.UseVisualStyleBackColor = true;
......@@ -65,20 +64,20 @@ namespace TheMachine
this.tabControl1.Controls.Add(this.tabPage_set);
this.tabControl1.Controls.Add(this.tabPage_ledtower);
this.tabControl1.Controls.Add(this.tabPage1);
this.tabControl1.Dock = System.Windows.Forms.DockStyle.Fill;
this.tabControl1.Location = new System.Drawing.Point(0, 0);
this.tabControl1.Location = new System.Drawing.Point(840, 152);
this.tabControl1.Name = "tabControl1";
this.tabControl1.SelectedIndex = 0;
this.tabControl1.Size = new System.Drawing.Size(1024, 740);
this.tabControl1.TabIndex = 8;
this.tabControl1.Visible = false;
//
// tabPage_set
//
this.tabPage_set.Controls.Add(this.chbAutoRun);
this.tabPage_set.Location = new System.Drawing.Point(4, 22);
this.tabPage_set.Location = new System.Drawing.Point(4, 24);
this.tabPage_set.Name = "tabPage_set";
this.tabPage_set.Padding = new System.Windows.Forms.Padding(3);
this.tabPage_set.Size = new System.Drawing.Size(1016, 714);
this.tabPage_set.Size = new System.Drawing.Size(1016, 712);
this.tabPage_set.TabIndex = 0;
this.tabPage_set.Text = "常规设置";
this.tabPage_set.UseVisualStyleBackColor = true;
......@@ -94,9 +93,17 @@ namespace TheMachine
this.tabPage_ledtower.Text = "灯塔设置";
this.tabPage_ledtower.UseVisualStyleBackColor = true;
//
// uC_LedConfig1
//
this.uC_LedConfig1.Config = null;
this.uC_LedConfig1.Location = new System.Drawing.Point(6, 6);
this.uC_LedConfig1.Name = "uC_LedConfig1";
this.uC_LedConfig1.Size = new System.Drawing.Size(859, 498);
this.uC_LedConfig1.TabIndex = 0;
this.uC_LedConfig1.Tag = "not";
//
// tabPage1
//
this.tabPage1.Controls.Add(this.fixtureSizeConfigControl1);
this.tabPage1.Location = new System.Drawing.Point(4, 22);
this.tabPage1.Name = "tabPage1";
this.tabPage1.Padding = new System.Windows.Forms.Padding(3);
......@@ -107,24 +114,17 @@ namespace TheMachine
//
// fixtureSizeConfigControl1
//
this.fixtureSizeConfigControl1.Location = new System.Drawing.Point(6, 6);
this.fixtureSizeConfigControl1.Location = new System.Drawing.Point(0, 3);
this.fixtureSizeConfigControl1.Name = "fixtureSizeConfigControl1";
this.fixtureSizeConfigControl1.Size = new System.Drawing.Size(602, 489);
this.fixtureSizeConfigControl1.Size = new System.Drawing.Size(623, 591);
this.fixtureSizeConfigControl1.TabIndex = 0;
//
// uC_LedConfig1
//
this.uC_LedConfig1.Config = null;
this.uC_LedConfig1.Location = new System.Drawing.Point(6, 6);
this.uC_LedConfig1.Name = "uC_LedConfig1";
this.uC_LedConfig1.Size = new System.Drawing.Size(859, 498);
this.uC_LedConfig1.TabIndex = 0;
this.uC_LedConfig1.Tag = "not";
//
// SettingControl
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.Controls.Add(this.fixtureSizeConfigControl1);
this.Controls.Add(this.tabControl1);
this.Font = new System.Drawing.Font("宋体", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Name = "SettingControl";
this.Size = new System.Drawing.Size(1024, 740);
this.Load += new System.EventHandler(this.SettingControl_Load);
......@@ -132,7 +132,6 @@ namespace TheMachine
this.tabPage_set.ResumeLayout(false);
this.tabPage_set.PerformLayout();
this.tabPage_ledtower.ResumeLayout(false);
this.tabPage1.ResumeLayout(false);
this.ResumeLayout(false);
}
......
......@@ -35,7 +35,7 @@
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<ApplicationIcon>icon.ico</ApplicationIcon>
<ApplicationIcon>MT.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<ApplicationManifest>app.manifest</ApplicationManifest>
......@@ -261,9 +261,14 @@
<Project>{064bebf5-8faa-4ea2-a5f3-a06e6e7d9251}</Project>
<Name>LoadCSVLibrary</Name>
</ProjectReference>
<ProjectReference Include="..\RemoteSheardObject\RemoteSheardObject.csproj">
<Project>{49004F82-8AEE-46DA-BB14-BD02AC990CE2}</Project>
<Name>RemoteSheardObject</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<Content Include="icon.ico" />
<Content Include="MT.ico" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
......
......@@ -33,6 +33,7 @@ namespace TheMachine
this.timer1 = new System.Windows.Forms.Timer(this.components);
this.listView1 = new TheMachine.DoubleBufferListView();
this.label_Statistics = new System.Windows.Forms.Label();
this.ListView2 = new TheMachine.DoubleBufferListView();
this.SuspendLayout();
//
// timer1
......@@ -42,32 +43,40 @@ namespace TheMachine
//
// listView1
//
this.listView1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)));
this.listView1.HideSelection = false;
this.listView1.Location = new System.Drawing.Point(0, 0);
this.listView1.Name = "listView1";
this.listView1.Size = new System.Drawing.Size(574, 446);
this.listView1.Size = new System.Drawing.Size(671, 355);
this.listView1.TabIndex = 0;
this.listView1.UseCompatibleStateImageBehavior = false;
//
// label_Statistics
//
this.label_Statistics.AutoSize = true;
this.label_Statistics.Location = new System.Drawing.Point(629, 16);
this.label_Statistics.Location = new System.Drawing.Point(754, 18);
this.label_Statistics.Name = "label_Statistics";
this.label_Statistics.Size = new System.Drawing.Size(56, 16);
this.label_Statistics.TabIndex = 1;
this.label_Statistics.Text = "label1";
//
// ListView2
//
this.ListView2.HideSelection = false;
this.ListView2.Location = new System.Drawing.Point(0, 379);
this.ListView2.Name = "ListView2";
this.ListView2.Size = new System.Drawing.Size(671, 244);
this.ListView2.TabIndex = 0;
this.ListView2.UseCompatibleStateImageBehavior = false;
//
// TrayManagerControl
//
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None;
this.Controls.Add(this.label_Statistics);
this.Controls.Add(this.ListView2);
this.Controls.Add(this.listView1);
this.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
this.Name = "TrayManagerControl";
this.Size = new System.Drawing.Size(846, 449);
this.Size = new System.Drawing.Size(1007, 642);
this.Load += new System.EventHandler(this.TrayManagerControl_Load);
this.ResumeLayout(false);
this.PerformLayout();
......@@ -79,5 +88,6 @@ namespace TheMachine
private DoubleBufferListView listView1;
private System.Windows.Forms.Timer timer1;
private System.Windows.Forms.Label label_Statistics;
private DoubleBufferListView ListView2;
}
}
......@@ -28,6 +28,12 @@ namespace TheMachine
public TrayManagerControl()
{
InitializeComponent();
crc.LanguageChangeEvent += Crc_LanguageChangeEvent;
}
private void Crc_LanguageChangeEvent(object sender, EventArgs e)
{
Init();
}
private void TrayManagerControl_Load(object sender, EventArgs e)
......@@ -35,20 +41,43 @@ namespace TheMachine
}
void Init() {
timer1.Stop();
#region listview初始化
var ColList = new string[] { "RFID", crc.GetString("Res0019", "上次地址"), crc.GetString("Res0020", "更新时间"), crc.GetString("Res0021", "托盘类型"), crc.GetString("Res0022", "载荷"), crc.GetString("Res0023", "目的地") };
listView1.Columns.Clear();
var ColList = new string[] { "RFID", crc.GetString("Res0019", "上次地址"), crc.GetString("Res0020", "更新时间"), crc.GetString("Res0021", "托盘类型"), crc.GetString("Res0022", "载荷"), crc.GetString("Res0023", "目的地"),"ID" };
listView1.View = View.Details;
foreach (var coltxt in ColList)
{
ColumnHeader col1 = new ColumnHeader();
col1.Text = coltxt;
col1.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
col1.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
col1.Width = 100;
listView1.Columns.Add(col1);
}
listView1.ColumnClick += ListView1_ColumnClick;
#endregion
#region listview2初始化
ListView2.Columns.Clear();
var ColList2 = new string[] { "设备", crc.GetString("Res0021", "托盘类型"), "备注" };
ListView2.View = View.Details;
foreach (var coltxt in ColList2)
{
ColumnHeader col1 = new ColumnHeader();
col1.Text = coltxt;
col1.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
col1.Width = 100;
ListView2.Columns.Add(col1);
}
//ListView2.ColumnClick += ListView1_ColumnClick;
#endregion
timer1.Start();
}
int sortCol = 0;
private void ListView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
sortCol = e.Column;
}
private void timer1_Tick(object sender, EventArgs e)
{
......@@ -56,6 +85,28 @@ namespace TheMachine
return;
var traylist = TrayManager.Traylist.Values.ToList();
traylist.Sort((a, b) => {
switch (sortCol)
{
case 0:
return string.Compare(a.RFID, b.RFID);
case 1:
return a.LastAddr- b.LastAddr;
case 2:
return (int)(a.LastUpdateTime-b.LastUpdateTime).TotalSeconds;
case 3:
return string.Compare(a.LoadType.ToString(), b.LoadType.ToString());
case 4:
return string.Compare(a.LoadType.ToString(), b.LoadType.ToString());
case 5:
return a.DestinationAddr- b.DestinationAddr;
default:
return string.Compare(a.RFID, b.RFID);
}
});
listView1.Items.Clear();
foreach (var ti in traylist) {
var timego = (DateTime.Now - ti.LastUpdateTime);
var lasttime = timego.Seconds + crc.GetString("Res0024","秒前");
......@@ -64,24 +115,44 @@ namespace TheMachine
if (timego.Hours > 0)
lasttime = timego.Hours + crc.GetString("Res0026","时 ") + lasttime;
var traydesc = TrayManager.TrayTypeDesc[ti.TrayType];
var loaddesc = TrayManager.LoadTypeDesc[ti.LoadType];
var loaddesc = TrayManager.TrayTypeDesc[ti.LoadType];
var lastaddrdesc = TrayManager.AddrDesc[ti.LastAddr];
var toaddrdesc = TrayManager.AddrDesc[ti.DestinationAddr];
var items = new string[] { ti.RFID, lastaddrdesc.ToString(), lasttime, traydesc, loaddesc, toaddrdesc };
var reelid = "";
reelid = ti.TrayParam?.WareCode;
var items = new string[] {lastaddrdesc.ToString(), lasttime, traydesc, loaddesc, toaddrdesc, reelid };
var listviewitem = new ListViewItem();
if (timego.TotalSeconds < 10)
listviewitem.BackColor = Color.DarkGreen;
if (timego.TotalSeconds < 15)
listviewitem.ForeColor = Color.DarkGreen;
else if (timego.TotalSeconds > 30)
listviewitem.BackColor = Color.DarkGray;
listviewitem.ForeColor = Color.DarkGray;
else
listviewitem.BackColor = Color.Black;
listviewitem.ForeColor = Color.Black;
listviewitem.UseItemStyleForSubItems = true;
listviewitem.Text = ti.RFID;
listviewitem.SubItems.AddRange(items);
listView1.Items.Add(listviewitem);
}
ListView2.Items.Clear();
foreach (var tivk in TrayManager.TrayRequest.ToArray())
{
var ti = tivk.Value;
var traydesc = TrayManager.TrayTypeDesc[ti.GetTrayType];
var desc = ti.IsEmpty ? "空托盘" :"";
var items = new string[] { traydesc, desc };
var listviewitem = new ListViewItem();
listviewitem.UseItemStyleForSubItems = true;
listviewitem.Text = tivk.Key;
listviewitem.SubItems.AddRange(items);
ListView2.Items.Add(listviewitem);
}
TrayManager.Statistics();
//listView1.AutoResizeColumn(0, ColumnHeaderAutoResizeStyle.ColumnContent);
label_Statistics.Text = crc.GetString("Res0027","托盘统计")+":" + "\n"
+ crc.GetString("Res0028","离线总数") + ": " + TrayManager.OfflineCount + "\n"
+ crc.GetString("Res0029","在线总数") + ": " + TrayManager.TotalCount + "\n"
+ crc.GetString("Res0029","在线总数") + ": " + (TrayManager.TotalCount- TrayManager.OfflineCount) + "\n"
+ crc.GetString("Res0030","空托盘") + ": " + TrayManager.EmptyCount + "\n"
+ crc.GetString("Res0031","入库托盘") + ": " + TrayManager.InStoreCount + "\n"
+ crc.GetString("Res0032","出库托盘") + ": " + TrayManager.OutStoreCount + "\n";
......
......@@ -43,7 +43,8 @@ namespace TheMachine
{
if (Config == null)
return;
LoadPosList();
crc.LanguageProcess(this);LoadPosList();
}
void LoadPosList()
......
......@@ -193,7 +193,7 @@ namespace TheMachine
private ConfigIO GetSelectDO()
{
string text = cmbWriteIO.SelectedValue.ToString();
if (Config.DOList.ContainsKey(text))
if (Config.DOList[DeviceKey].ContainsKey(text))
{
ConfigIO io = Config.DOList[DeviceKey][text];
return io;
......
using DeviceLibrary;
using OnlineStore;
using System;
using System.Collections.Generic;
......@@ -28,7 +29,8 @@ namespace TheMachine.UC
private void button_read_Click(object sender, EventArgs e)
{
if (rFID_C2S1.ReadByte(0x20, 16, out byte[] data)) {
textBox_rfidlabel.Text = Encoding.ASCII.GetString(data).Trim();
var rfid = Common.RfidFilter(data);
textBox_rfidlabel.Text = rfid;
} else {
textBox_rfidlabel.Text = crc.GetString("Res0033","读取失败");
}
......
......@@ -85,7 +85,7 @@ namespace TheMachine
this.button_p2.Name = "button_p2";
this.button_p2.Size = new System.Drawing.Size(162, 23);
this.button_p2.TabIndex = 9;
this.button_p2.Text = "移栽流水线放料点P2-8mm";
this.button_p2.Text = "移栽流水线放料点P2-70mm";
this.button_p2.UseVisualStyleBackColor = true;
this.button_p2.Click += new System.EventHandler(this.button_p2_Click);
//
......@@ -95,7 +95,7 @@ namespace TheMachine
this.button_p3.Name = "button_p3";
this.button_p3.Size = new System.Drawing.Size(162, 23);
this.button_p3.TabIndex = 9;
this.button_p3.Text = "移栽料仓放料点P3-8mm";
this.button_p3.Text = "移栽料仓放料点P3-70mm";
this.button_p3.UseVisualStyleBackColor = true;
this.button_p3.Click += new System.EventHandler(this.button_p3_Click);
//
......
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!