From 0252fbe89d7e101505f495e3ae2805a59b3a3bf4 Mon Sep 17 00:00:00 2001 From: choieigun Date: Mon, 16 Mar 2026 14:52:43 +0900 Subject: [PATCH 1/9] =?UTF-8?q?=EC=9E=A5=EB=B9=84=20=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Machines/ILSOS_CCW_H52A/EquipmentSetup.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs index 4ed0b99..f1b6cbc 100644 --- a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs +++ b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs @@ -57,7 +57,8 @@ namespace ILSOS_CCW_H52A public override string GetEquipmentName() { - return "ILSOS CCWH52A"; + var equipSetting = AuroraEnv.SettingEntry[AuroraSettings.Equipment] as EquipmentInfo; + return equipSetting is null ? "ILSOS CCWH52A" : equipSetting.EquipmentName; } public void OnSetAlarm(int code, bool isHeavy) From f52f72812a4ca3f95a768a1bc9fba1d9dfd42ee6 Mon Sep 17 00:00:00 2001 From: choieigun Date: Mon, 16 Mar 2026 21:54:28 +0900 Subject: [PATCH 2/9] =?UTF-8?q?Auto=20Run=20=EC=A7=84=ED=96=89=20=EC=A0=84?= =?UTF-8?q?,=20Recipe=20View=20Enable/Disable=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Machines/ILSOS_CCW_H52A/EquipmentSetup.cs | 40 +++++ .../Views/Main/UCMainAutoRunViewModel.cs | 20 --- .../LASA/GUI/Dialog/WeldingParamDlg.cs | 166 +++++++++--------- 3 files changed, 123 insertions(+), 103 deletions(-) diff --git a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs index f1b6cbc..0a7fcb3 100644 --- a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs +++ b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs @@ -39,6 +39,9 @@ using WeldingCommon.Utils; using WeldingCommon.Views; using WeldingCommon.Vision.Factory; using static WeldingCommon.Vision.Factory.VisionFactory; +using System.Reactive.Linq; +using System; +using System.Windows; namespace ILSOS_CCW_H52A { @@ -79,6 +82,43 @@ namespace ILSOS_CCW_H52A AuroraEnv.SequenceEntry[SequenceIds.AlarmMonitoring].Start(); AuroraEnv.GetProcessManager().Init(AuroraEnv); + + // 최초에 permission에 대한 값을 적용해줌 + OnPermissionChanged(null); + AuroraEnv.EventObservable.AsObservable(AuroraSysEvent.SYS_PERMISSION_CHANGED) + .Subscribe(OnPermissionChanged); + + var seq = AuroraEnv.SequenceEntry[SequenceIds.SeqAutoRunCCWH52A] as ISequence; + seq.RunStateChanged += AutoRunSeq_RunStateChanged; + } + private void AutoRunSeq_RunStateChanged(object sender, (string sequenceId, SequenceRunState state) e) + { + //AutoRun 상황에서 Recipe Save Lock + AuroraEnv.RecipeManager.SaveLock(CommonRecipeIds.ScannerObjectTeaching, e.state != SequenceRunState.Idle); + //AutoRun 상황에서 Reicpe 화면 수정할 수 없도록 함 + Application.Current.Dispatcher.Invoke(() => { + // Running으로 변경되면 Active된 레시피로 변경하도록 함 + if (e.state == SequenceRunState.Running) { + WeldingRecipeManager.OnActiveReloaded(); + } + + _UCRecipe.IsEnabled = e.state != SequenceRunState.Running; + }); + } + private void OnPermissionChanged(EventMessage message) + { + bool LoginState = ApplicationExt.PermissionLevel <= (ushort)PermissionLevel.LEVEL3; + if (LoginState == false) { + // Login 권한이 없어지면 Active된 레시피로 변경하도록 함 + Application.Current.Dispatcher.Invoke(() => { + WeldingRecipeManager.OnActiveReloaded(); + }); + } + + //LogOut 상황에서 Recipe Save Lock + AuroraEnv.RecipeManager.SaveLock(CommonRecipeIds.ScannerObjectTeaching, !LoginState); + //LogOut 상황에서 Reicpe 화면 수정할 수 없도록 함 + Application.Current.Dispatcher.Invoke(() => { _UCRecipe.IsEnabled = LoginState; }); } // For Selection LaserDevice diff --git a/Machines/ILSOS_CCW_H52A/Views/Main/UCMainAutoRunViewModel.cs b/Machines/ILSOS_CCW_H52A/Views/Main/UCMainAutoRunViewModel.cs index d5295b1..f83df86 100644 --- a/Machines/ILSOS_CCW_H52A/Views/Main/UCMainAutoRunViewModel.cs +++ b/Machines/ILSOS_CCW_H52A/Views/Main/UCMainAutoRunViewModel.cs @@ -78,7 +78,6 @@ namespace ILSOS_CCW_H52A.Views _Plc = _Aurora.DeviceManager[CommonDeviceIds.PLCDevice] as PLCControllerCCWH52A; _SeqAutoRun = _Aurora.SequenceEntry[SequenceIds.SeqAutoRunCCWH52A]; - _SeqAutoRun.RunStateChanged += AutoRunSeq_RunStateChanged; InitVariable(); @@ -253,24 +252,5 @@ namespace ILSOS_CCW_H52A.Views return; } } - - private void AutoRunSeq_RunStateChanged(object sender, (string sequenceId, SequenceRunState state) e) - { - //AutoRun 상황에서 Recipe Save Lock - _RecipeManager.SaveLock( - CommonRecipeIds.ScannerObjectTeaching, - e.state != SequenceRunState.Idle); - //AutoRun 상황에서 Reicpe 화면 수정할 수 없도록 함 - if (e.state == SequenceRunState.Running) { - Application.Current.Dispatcher.InvokeAsync(() => { - _UCRecipe.IsEnabled = false; - }); - } else { - Application.Current.Dispatcher.InvokeAsync(() => { - _UCRecipe.IsEnabled = true; - }); - } - } - } } diff --git a/WeldingComponents/LASA/GUI/Dialog/WeldingParamDlg.cs b/WeldingComponents/LASA/GUI/Dialog/WeldingParamDlg.cs index fcd6aab..3a46490 100644 --- a/WeldingComponents/LASA/GUI/Dialog/WeldingParamDlg.cs +++ b/WeldingComponents/LASA/GUI/Dialog/WeldingParamDlg.cs @@ -86,103 +86,103 @@ namespace CoreUnit.Scanner.UserControl.Canvas.Dialog btnOk.Enabled = false; btnCancel.Enabled = true; } - if(_MachineName == eMachineName.H52A_CCW || _MachineName == eMachineName.H52A_ACW || _MachineName == eMachineName.CIT) { - label58.Text = "(0~4000)"; - label31.Text = "(0~4000)"; - label32.Text = "(0~10000)"; - label17.Text = "(1~8000)"; + //if(_MachineName == eMachineName.H52A_CCW || _MachineName == eMachineName.H52A_ACW || _MachineName == eMachineName.CIT) { + label58.Text = _MachineName == eMachineName.H52A_CCW ? "(0~1500)" : "(0~4000)"; + label31.Text = _MachineName == eMachineName.H52A_CCW ? "(0~2500)" : "(0~4000)"; + label32.Text = "(0~10000)"; + label17.Text = "(1~8000)"; - label22.Enabled = false; - tbLaserPower2.Enabled = false; - label29.Enabled = false; - label31.Enabled = false; + label22.Enabled = _MachineName == eMachineName.H52A_CCW; + tbLaserPower2.Enabled = _MachineName == eMachineName.H52A_CCW; + label29.Enabled = _MachineName == eMachineName.H52A_CCW; + label31.Enabled = _MachineName == eMachineName.H52A_CCW; - // Ramping Start, End 구분 후 사용한다. Power 2번은 여전히 막아둠 - //label68.Enabled = false; - //label69.Enabled = false; - //label71.Enabled = false; - //label72.Enabled = false; - //label73.Enabled = false; - //label70.Enabled = false; + // Ramping Start, End 구분 후 사용한다. Power 2번은 여전히 막아둠 + //label68.Enabled = false; + //label69.Enabled = false; + //label71.Enabled = false; + //label72.Enabled = false; + //label73.Enabled = false; + //label70.Enabled = false; - nudRampingStartPower2.Enabled = false; + nudRampingStartPower2.Enabled = false; - nudRampingEndPower2.Enabled = false; + nudRampingEndPower2.Enabled = false; - #region Permission Checking - // Engineer 이상 등급만 사용 가능 - bool PermissionCheck = ApplicationExt.PermissionLevel <= (ushort)Aurora.Api.PermissionLevel.LEVEL3; - label15.Enabled = PermissionCheck; - label14.Enabled = PermissionCheck; - label13.Enabled = PermissionCheck; - label12.Enabled = PermissionCheck; - label11.Enabled = PermissionCheck; - label10.Enabled = PermissionCheck; - label57.Enabled = PermissionCheck; - label63.Enabled = PermissionCheck; - label46.Enabled = PermissionCheck; - label36.Enabled = PermissionCheck; - label45.Enabled = PermissionCheck; - label41.Enabled = PermissionCheck; - nudRampingStartDist.Enabled = PermissionCheck; - tbMarkDelay.Enabled = PermissionCheck; - label62.Enabled = PermissionCheck; + #region Permission Checking + // Engineer 이상 등급만 사용 가능 + bool PermissionCheck = ApplicationExt.PermissionLevel <= (ushort)Aurora.Api.PermissionLevel.LEVEL3; + label15.Enabled = PermissionCheck; + label14.Enabled = PermissionCheck; + label13.Enabled = PermissionCheck; + label12.Enabled = PermissionCheck; + label11.Enabled = PermissionCheck; + label10.Enabled = PermissionCheck; + label57.Enabled = PermissionCheck; + label63.Enabled = PermissionCheck; + label46.Enabled = PermissionCheck; + label36.Enabled = PermissionCheck; + label45.Enabled = PermissionCheck; + label41.Enabled = PermissionCheck; + nudRampingStartDist.Enabled = PermissionCheck; + tbMarkDelay.Enabled = PermissionCheck; + label62.Enabled = PermissionCheck; - //label22.Enabled = PermissionCheck; - //tbLaserPower2.Enabled = PermissionCheck; - //label29.Enabled = PermissionCheck; - //label31.Enabled = PermissionCheck; + //label22.Enabled = PermissionCheck; + //tbLaserPower2.Enabled = PermissionCheck; + //label29.Enabled = PermissionCheck; + //label31.Enabled = PermissionCheck; - label16.Enabled = PermissionCheck; - label17.Enabled = PermissionCheck; - label18.Enabled = PermissionCheck; - label23.Enabled = PermissionCheck; - label24.Enabled = PermissionCheck; - label25.Enabled = PermissionCheck; - label58.Enabled = PermissionCheck; - label42.Enabled = PermissionCheck; - label35.Enabled = PermissionCheck; - label34.Enabled = PermissionCheck; - label51.Enabled = PermissionCheck; - nudRampingEndDist.Enabled = PermissionCheck; + label16.Enabled = PermissionCheck; + label17.Enabled = PermissionCheck; + label18.Enabled = PermissionCheck; + label23.Enabled = PermissionCheck; + label24.Enabled = PermissionCheck; + label25.Enabled = PermissionCheck; + label58.Enabled = PermissionCheck; + label42.Enabled = PermissionCheck; + label35.Enabled = PermissionCheck; + label34.Enabled = PermissionCheck; + label51.Enabled = PermissionCheck; + nudRampingEndDist.Enabled = PermissionCheck; - tbDrawSpeed.Enabled = PermissionCheck; - tbJumpSpeed.Enabled = PermissionCheck; - tbLaserOnDelay.Enabled = PermissionCheck; - tbLaserOffDelay.Enabled = PermissionCheck; - tbJumpDelay.Enabled = PermissionCheck; - tbPolygonDelay.Enabled = PermissionCheck; - tbLaserPower1.Enabled = PermissionCheck; - nudRampingStartPower1.Enabled = PermissionCheck; - nudRampingEndPower1.Enabled = PermissionCheck; + tbDrawSpeed.Enabled = PermissionCheck; + tbJumpSpeed.Enabled = PermissionCheck; + tbLaserOnDelay.Enabled = PermissionCheck; + tbLaserOffDelay.Enabled = PermissionCheck; + tbJumpDelay.Enabled = PermissionCheck; + tbPolygonDelay.Enabled = PermissionCheck; + tbLaserPower1.Enabled = PermissionCheck; + nudRampingStartPower1.Enabled = PermissionCheck; + nudRampingEndPower1.Enabled = PermissionCheck; - nudRampingStartAPower1.Enabled = PermissionCheck; - nudRampingStartAPower2.Enabled = PermissionCheck; - nudRampingStartADist.Enabled = PermissionCheck; - label74.Enabled = PermissionCheck; - label77.Enabled = PermissionCheck; - label76.Enabled = PermissionCheck; - label81.Enabled = PermissionCheck; - label75.Enabled = PermissionCheck; - label80.Enabled = PermissionCheck; + nudRampingStartAPower1.Enabled = PermissionCheck; + nudRampingStartAPower2.Enabled = PermissionCheck; + nudRampingStartADist.Enabled = PermissionCheck; + label74.Enabled = PermissionCheck; + label77.Enabled = PermissionCheck; + label76.Enabled = PermissionCheck; + label81.Enabled = PermissionCheck; + label75.Enabled = PermissionCheck; + label80.Enabled = PermissionCheck; - label68.Enabled = PermissionCheck; - label69.Enabled = PermissionCheck; - label71.Enabled = PermissionCheck; - label72.Enabled = PermissionCheck; - //label73.Enabled = PermissionCheck; - //label70.Enabled = PermissionCheck; + label68.Enabled = PermissionCheck; + label69.Enabled = PermissionCheck; + label71.Enabled = PermissionCheck; + label72.Enabled = PermissionCheck; + //label73.Enabled = PermissionCheck; + //label70.Enabled = PermissionCheck; - label79.Enabled = PermissionCheck; - label65.Enabled = PermissionCheck; - label78.Enabled = PermissionCheck; + label79.Enabled = PermissionCheck; + label65.Enabled = PermissionCheck; + label78.Enabled = PermissionCheck; - nudRampingStartPower2.Visible = false; - nudRampingEndPower2.Visible = false; + nudRampingStartPower2.Visible = false; + nudRampingEndPower2.Visible = false; - #endregion - } + #endregion + //} //Welding Paramter 색 지정 //rbParam1.ForeColor = Color.FromName(((WeldingParameterIDEditor.eWeldingColor)1).ToString()); From 4626c07d860a67bb140c8270a51b0e571437d38e Mon Sep 17 00:00:00 2001 From: choieigun Date: Mon, 16 Mar 2026 23:06:00 +0900 Subject: [PATCH 3/9] =?UTF-8?q?Permission=20or=20AutoRunChange=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20RecipeLoad=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Machines/ILSOS_CCW_H52A/EquipmentSetup.cs | 36 +++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs index 0a7fcb3..c3f2f7c 100644 --- a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs +++ b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs @@ -91,34 +91,34 @@ namespace ILSOS_CCW_H52A var seq = AuroraEnv.SequenceEntry[SequenceIds.SeqAutoRunCCWH52A] as ISequence; seq.RunStateChanged += AutoRunSeq_RunStateChanged; } + private void ApplyRecipeByState(bool bON) + { + Application.Current.Dispatcher.Invoke(() => { + if (bON == false) + WeldingRecipeManager.OnActiveReloaded(); + else + WeldingRecipeManager.ReloadWeldingRecipe(WeldingRecipeManager.SelectedRecipe.name); + }); + } private void AutoRunSeq_RunStateChanged(object sender, (string sequenceId, SequenceRunState state) e) { //AutoRun 상황에서 Recipe Save Lock AuroraEnv.RecipeManager.SaveLock(CommonRecipeIds.ScannerObjectTeaching, e.state != SequenceRunState.Idle); - //AutoRun 상황에서 Reicpe 화면 수정할 수 없도록 함 - Application.Current.Dispatcher.Invoke(() => { - // Running으로 변경되면 Active된 레시피로 변경하도록 함 - if (e.state == SequenceRunState.Running) { - WeldingRecipeManager.OnActiveReloaded(); - } - - _UCRecipe.IsEnabled = e.state != SequenceRunState.Running; - }); + bool AutoRunState = e.state == SequenceRunState.Running; + ApplyRecipeByState(AutoRunState); + _UCRecipe.IsEnabled = e.state != SequenceRunState.Running; } private void OnPermissionChanged(EventMessage message) { - bool LoginState = ApplicationExt.PermissionLevel <= (ushort)PermissionLevel.LEVEL3; - if (LoginState == false) { - // Login 권한이 없어지면 Active된 레시피로 변경하도록 함 - Application.Current.Dispatcher.Invoke(() => { - WeldingRecipeManager.OnActiveReloaded(); - }); - } + bool permissionOn = ApplicationExt.PermissionLevel <= (ushort)PermissionLevel.LEVEL3; + AuroraEnv.RecipeManager.SaveLock(CommonRecipeIds.ScannerObjectTeaching, !permissionOn); + + // Login 권한이 없어지면 Active된 레시피로 변경하도록 함 + ApplyRecipeByState(permissionOn); //LogOut 상황에서 Recipe Save Lock - AuroraEnv.RecipeManager.SaveLock(CommonRecipeIds.ScannerObjectTeaching, !LoginState); //LogOut 상황에서 Reicpe 화면 수정할 수 없도록 함 - Application.Current.Dispatcher.Invoke(() => { _UCRecipe.IsEnabled = LoginState; }); + Application.Current.Dispatcher.Invoke(() => { _UCRecipe.IsEnabled = permissionOn; }); } // For Selection LaserDevice From 94c10a62f658449422ea4d414d250220e9ddb89e Mon Sep 17 00:00:00 2001 From: choieigun Date: Mon, 16 Mar 2026 23:16:31 +0900 Subject: [PATCH 4/9] =?UTF-8?q?Log=20=ED=8C=8C=EC=9D=BC=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- External/Aurora/bin/hislogger.config | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/External/Aurora/bin/hislogger.config b/External/Aurora/bin/hislogger.config index c574b19..df4e39c 100644 --- a/External/Aurora/bin/hislogger.config +++ b/External/Aurora/bin/hislogger.config @@ -5,7 +5,7 @@ "collector_mode": "MANUAL", "console_out": false, "file_out": true, - "log_save_dir": "_log", + "log_save_dir": "D:\\ILSOSConfig\\_log", "log_save_level": 0, "log_file_prefix": "Aurora", "log_file_size": 5, @@ -20,7 +20,7 @@ "collector_mode": "MANUAL", "console_out": false, "file_out": true, - "log_save_dir": "_process", + "log_save_dir": "D:\\ILSOSConfig\\_process", "log_save_level": 0, "log_file_prefix": "process", "log_file_size": 5, @@ -35,7 +35,7 @@ "collector_mode": "MANUAL", "console_out": false, "file_out": true, - "log_save_dir": "_vision", + "log_save_dir": "D:\\ILSOSConfig\\_vision", "log_save_level": 0, "log_file_prefix": "vision", "log_file_size": 5, From 04918eaffd8045dc1367a8c1746e4202f06372b1 Mon Sep 17 00:00:00 2001 From: choieigun Date: Mon, 16 Mar 2026 23:24:16 +0900 Subject: [PATCH 5/9] =?UTF-8?q?=EC=9E=AC=EB=B0=9C=EC=9E=A5=EC=A7=80?= =?UTF-8?q?=EB=8C=80=EC=B1=85=EC=84=9C=20=EC=9E=91=EC=84=B1=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=A0=84=EB=8B=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/LGES/재발방지대책_260316.pptx | Bin 0 -> 42012 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Doc/LGES/재발방지대책_260316.pptx diff --git a/Doc/LGES/재발방지대책_260316.pptx b/Doc/LGES/재발방지대책_260316.pptx new file mode 100644 index 0000000000000000000000000000000000000000..29e6594ea857d8288b961e5b98015b1357230a0b GIT binary patch literal 42012 zcmeEtV~}RsvTeDl%XXJ-+qP}nwr#t*Y}@LxZFbo0RSXm0058xAb>OlZEc*4ZJczK-0h4V zwQ1a}t?=?efXH$IfWFuN|Lec;7nn#LwfRj4A99ua3L9U8LO+u-7txzHUIwLb0^B+Z zVDodm9wxZu$_P+?KqG8~IDz}_>yEw7uwyZO;5Sxaoz|$|!aKzcUkJsn1AJWUmST}O z*I8Ornj9h!1E?g&#a)AnZF!$ZX$lLT;L-ihA{K0ciOL!#v8emx@bvy-47thQwk!Y| zH7Zz4N^|~BD5-97E@yzRRzz7(Y<-te`;z^BZcpk43Y2(UGSG7X+GX^3=LsR^)NUi# zLnmq?l19l{W1_|xhM`*PP*Q4&_~Dhbac5iC&X_p<%f>@p_2>)V*Iaxcm zL?GeCmPyUR6SE6$Sbb^zviKm5d)6SZUxsnqa5-URlS>ijioG3~kZiA|XqB!R-qTj) zA~ZRH>IG?wY3^UCWoZxY=!*1|k95Tqhz#1Pab@xX#hHi<%#tHcngYcdO;K_suZaa* zo9;K~wtBuHtNh&Zs!W*v_Fi{BEHzPaV)TF~N(wO{8x7XoGx}R1c%mS6|K_x7??;P3dNX zi`s(6P{7ItCJPChq(85vQ<-BXL?h^4OCKq4qu$qxeN{N&ffw2a8Si!CgwMY3Ak`IB zx?M}!R(^(+?!%CqPB*wjCZ_2Kn$IotimSPnn1!a1tr`}Z?RjH1jFDWU^MG0QC2jWNnm6ODGVeXZDf;WEvpC$g1YLbds0}&x zM3L3WTLyoP(OvNHzCb@JN5tWlF%$0lGyGSd@vop@VgB})F=zk)T2fEVGl3FM<`R@LBD!#Ww7Ax2aBDorZK0YdUW#C zNRXQ-eF)fE@R2jUT?T48eUy-hM5Zkkukd9q_9IN{FnFct-njvtD9Nl}XsQ)CZVt-q zmFw%(SVfu=6f;O4O#4R&g2$LbJ8N-<$FHeJIff4+O88RiB8v3BqBZw617CWt(Jno< zsLlkGfThn<#!rV1YKCX>2E*`^8h&Iu)zB@pcL`wLsD2~l;1L<=3s?%CheO6I-pi-yWxT!8y`O4Vp6r(+ z1+fmSt}BO^CK^47=TX+6pCIc)qo%1zBBN||P-t>u!0jv@Kc*~pL-h@l`%`|lt@f@~ zP6qdT4V`Z}l%19=Dj-aqhjWbdT_sl(TmF{asF^7?IwdYj3%L3DOGM_!n$^ns>qiPg zCc{QLfG5KCVxLU#%4(!b+pv;bZ;EJq`q@GT1(V1v64nvG7>=9O#)-x)fi7}ZM=&?d zbs(jKLE2 z?)|8eG37P@kwXhUV{A$n{1Q;(isp6aV3ILs3W3Qmhd+onnzAVxV2w=$7P_!#|AGE9Kjbt z!gW?K38#CR;Xs3}un|DwXMi0}D;!Lke#C-MAmcb3y=v{$aA&yn2VZmv`R61z zGkTT<0ONte5gf}`S%R}1%hgXnAnkDjJg{dG^d*!4AvBNgc2(6IZPpbipaTm(xWWIx zFD1jEQ!XEE`(9}%MaF}pyP_{=wa?`-m78mvyXfrKwKJuBrm*j`r*E$hVsv1&V&RM;FXL2I-$umx(2Bb(KbALtYfWxEWIZHU7*Cxp_5 z1XkTlv5=9?Wfi5Fgj6B*RByCcH>hhhQZJe?F3x49tZ6ltms_J!M4GJHqzBIdPgy5f z(D(zLXC@ZXOOybiJk#{i+sw10fivu?@7AJYq)1`eoPUH^BTK?ml+rY25HC`sQK?&Z zIe7LD)X$Tp30Pg}^i)-W06aiV4j8{sDGa`0l8?1|pk@4gA457c^=pwOV3#|x% zIQ>*oHJgrG(~V??XQ+h}r9NYAbcbEy|A) zq%Z(tcg`&PHIf2kGA=VH=HYMLF-ezBcV=ty%MN0aEsFu%Cv21o(5#%jNET4SKir~m zd0-3d=q)L_QVBwsI!dUDJ#W3w>dk>%JTTUveGFqzdVrR|6~a&uc3V-ubW7bhDvT!l ztwZg@P8jf)Y-#DbFP2II33+x8#_$>ZbrI8n;>U1woCK+eSi#mWguQH^TQjIAux-En zVcW#60;I>@8BLe4hTAFqbP9Jf4hG#bPsZ9Klo4i1sP&HY&%^eb$bSTI|< z!|Z-};OHgNVXNmHQPQf!tO6i4wI%W?tjPUb-p@~{xO3i7PHENLGtuj@^0OenD?-4+ zI4w}gm99+B-(D^3ukHXQhm!}9G%Xho0XSS!SkawOtY07R=Dzn{uFpra$0fRaxBaFC zHQ=LL<2R|KihG^@ZMUc_ZU8^h-%DPvu)J>|^rLiF#z`#bh^p5}^v3`ES5-Fj962@~&x=}v`&g06422N)EY0dC#{(enw-ce6V z@og4w7ap&7w$(Q%qK}XLRhEj($v?I=G_sLxIk5>xf%|$$L~y!MExujvYzbe(@xEl} zE?K5mnUP3%*008DUNWhIOY~zLFa{)V#FHjXM$Ht`P3CIN7Su}P7X36R${lL8l`0K$ zW+mu;o zXve;4*IF5H@(aN6!1Abpx#or|KRirElZBl|iBl|vMd0yboXtJLBA2SxMuZ*6qJYSA z1>vT2BTBz!HV+gctN`gFIH2RSTE`E#x?fB}@(+h5^@Dl=5|{?;CFxn5Kzmn)`O&YM zlHQ)QnyUShJnVPyvHMdT02B`n507#-#WKht0p?@oi>W^53`-)eKU3MXtDWrhvw!ZrVZ03J#OGN3hRB+Kx^8yv9a zg2%cDc-5(U$mquje;zXc?oatW!n>myozsU8>f>`vEBo=e$z1Q#(;=ckiEU=fejtCa zLlbI<^2f+DbTv`cwm9_e=0_tx3I_pyVp+ImGghmZg9LU3xcswM~d&MQXe6zXy zRAsnMxx%2{z zeDskryh8P~veHO^il(xrc+irBsHg=m24K4p8OWPr$E z`n}jIAJI#Q28TEeKs%h^ICj-i!&J6pXU5+KjO)bO*UK$!S9Q+7|FZ8?iusM6=nOV9 z=SY)-l!TPXbTZS|2e|x}QdOx8A^bB+sK&i+d-(j}Krw+7x5z1#G9oibSLg!1IE3p{ zCb-VSHbAaN_C58A|FOT&h@qP- z`-ePR!(M)Z3GM3TQ%^k_Z#`rN_XkF$b&Kpac+m%ickZ_3Rc3Vkw!vw#Z$eE^u&&Ht z#ph_n%jk9v4=$}&?!I2*!I#j@kp|7+dubYHSa#MgHkp1FPG?bP=yBz$DiLYx4i{zT z3Y76vwg;Dzxr6z{fm#|_*_A(w#iT!c0K@|X=@}TE*!d9hR3ZgLzckameS)Yu`K|@3e8% zhipl}lG~z_=-S<(X*b-zG@@l`s47VOb9k~vLnaP1rI2vgyHux}inG#elZ<91*gPu5 zqBI^?1!}0${Gi~>U$Y|JWyDiBm!a-RZ`7xQZHqbC8CN>vN-rVDnQbpm#_-D)JArT# zemx|>d#1LjewA+Q)@z=@xS%j`(qbKEb%9B{iK0P6-Ifd49xv@K-aQYZCHPBGktKY2 z!N{DrNr{<~3MNB?{LILQ#C}mB*@`kAK9HfpbbfciAgj<74-znYff#x-33UAgAt{U5 zG;beb)d!xAkY6b02c%c*+)4l#0t+y-hm2h6TsKK&S6`8xIPp_N)QJc{+mP}KNj&k0 zGuUnx&#<$2pV_1`PtiC z(w|pAf%fw&44F2jaen&EckLza{n708y0%;3D|mUpfd0BWzvdukqs#?Mkt?~Dv$8b> zuc-+G;)@!7`b-`>oHkToS=~99G*);vCWxuE^l0-vH$(OgLGv}?ac6$j5B0jbh=P5R z4cVUeq+Z80`nrq<9r*>nOJ3Yk(u;J^J2(*FZ1amqZ-idob++) z**Cmvde_v{RH5%?J3PLtVA-}PB)@)zjGf%nWDB(L;x$Iv!(i@G3mcDqOJcUgWym-S z)L5ymXsbfKItQ)Ea%f8F(9benuT6s?GGES;Q3SdM6vez}02K#My9^XH>m6pe-_TuC z96^KU*kWX{xJvPIBuy4VjXPY$Gdt}J{9c4a`=o{!R)@SxLO9siGonsPwctwdg!_-| z2uOHB1mjzoTl>Z=TmT5bzf^{QsdN9Q*6^Qd9pJYt|NX#!@2hiRR-&H{8EnV1&lTcm ztN6kxf@(7wq61#&4A|(x97`%OZoqtdtM=r42tp@G`&Z9oP7S_O-TNu=YOb>YC75~w z5Wn(?Mrlf)=8Ky%_<(!01x=Fx7%+z#YARYJTGB?Sa5d6U{7gP};FPDMY*_`zd7ES- zKgutrwa1On+2)1o)9e zHN@So{2?`X#4XewU0_gN zMGCJ)$ChP?2ZKegHL;%8F&9;YbF+^WSq`#9mz*#qQI~DTpF%HRnuvc0DoK4;inykW zE$+=UDSu!JJTZmbH6Q1>9MEbVu2Z*1=O&pmTMZR_D;u=C%K17(U0qb4CQ5->=yiFO zqM=U6mo9U$#r)3--v8b1|2}{Gx842UeCYqd-QPlj2YlvW_BKmV=Hbq$Py8XJrWeY^8XJ5;tkQTC8*zzel`US}k+?tOp1 zC>^in>=?W%$R!Qh1int7BAmI-=sfBTXVBk{)YzS(LBzs(!YXoDHK08@*`tC`qulyp zlWdur$&-{1>jHdEb?(JYvUq3NI*J}jUv{l1UgkPB26h2`g3!aybsO=) zl0wCn>!S_&R62d)?ciI!a;2HEQ37VN2&`8}8OqLyQIIx$e_cGb<%Qtw@@D?L$+mml z6(i#UXR$tPthY%EroNF}R<@e6uiF=p{9PYS+z}`}s;pE{a9mwbx~BNZGMC|lYBz)9 zRIwwt#@-8_mqYA6SMc<1Bqt(+;^)Ww+xVG2vS%P7uU)N)sH5ulabcB2v6VrYwK!VdyWMZGWrWqct;Q@e)@^OX76KqI_b5y=Ul9EaRa z?=<~9jWWATNXa=8?%Kpl{P_)k%3e4vpsT0E^KddDxZO_T3_QRyN>3f>`-g9fFTj z1SgDHX&>Byxuf;q%;TZs$%dP|#QD7z0gRgS%O}yjt53qL&y$bmNmZ*_AcqhL+&ubh zPS@exAi0VlwvT>X^`q(SWk&(^*(|=|>QfQT6sJLEqDnogbdBLS4k3Haj03Zu!|g9w zdSr}&YD8bOW&Y5?W|5A-6(D8hb+2u8P8@|)NRKZaT5etUX(Crdf=s_CNY-|6=Do+RP=*_}sM zv2&=np}U9ZXk~_mzdD@?57=N-vshj?&u%hRodpzCn?^dS%~y*l^+f}5RcDFj@zfls z=4bbt|DX$Xy9=Bts44RLr@P755V7FoEfcdy2Ybj&RX!sBtkCkmS#wghiG?YE0_;70F>xYLq*IUacCOLCPQr}^7XtV^o<+>2wBv=XiF>88i{bN@nB{yk3)WE5J{&5D*{@cx&m>o7-P$j6C*6Twd24T$8m+Y(EcY6 z9ukk++vM?}u8)VWQVB?BeiGjrG;#rOfhKG&(OE)Kg&08uFiR5(bd>#F(oCS+5&wH; zUTR-TdttCaayK-!o;vfhg9#3;UQn%ls(aoVbtMkthSjTiBKOl>PwYzj`R4JNYUO@T zch;&^9E$Wn^MOG}K{K&Y2M1Apg+%kkSb~9G*Jj_qx!LO^sR52NE-X0O0fDXywQ4>y z5$(hvr*45NGm<6q8lBa$K!V{)N|3XWM6)4(o=bRz<^^mWleI#DBRWMGK1a1?1~2x< z85(ZPr#G;3x^6k+5Cx@M#f0@b3o|GQ`6@*JSc|nlx+60|o6z7&9n82qCsm7L(DV@t zL`}-N`K@qVk@$$LNxW7uYp9%X&`5EfnMb;)Fsy8qak%=g)>rw*vQ$XU4u}+YWdAR? z+{MknrK#%QMv#f*Qef26Pl0IxBCDlD62$4prO857M6C%s5&{%I%7`?G0V6I%^*h0* z^w8vwiDyZJb1hJgT6zgGxAYkb;o6B2nZ@k|B5Gq`l>15cRT9PP!L?=N?wo&&_e-Q+ zp`#w>XVB=1P|YY?v}YZn9+xv~PpLpT*-NW-2&FDKxrb5BELya`*P8fO>&!FL&N82> zT~})7asg{8YfJ&l!m&Nm#BKi!-y(Mr}Yb zJf0kvPw2R4FYhYu60P5P;jQVy`cMluRwi$ygZr!cl#fhvUEkGTK~?ltJ}K&;P4m-V z*Gv1Uk*Cb)Lp#CABvbUA;tAggpe&vmz)-RJkFh_*BnRWDWqa5s^jB4muuw_SX;t{f zm6?lubf3Ze4x<*~+j;7uf;%qsxq$u|XJ;?@Zg=mEUlknq`w4{=0rsZTF6<~+u#*kj zO)*`d8Y2kH7YdKGBIr39q4x{H9?UVkl|vZ2xsT%R1@o2||42sDegtERc)t~ly?4At z({dy=0DBWm$CNEKE>VL#HGE26OVH;D@2{~X^T?0iEygd+AztEtKjQ)8ph#P(`=9ez ziX+OEbR{+TJ&|#YS&}1@nEN4lRjIbF$POWnH{cEPj_Hl*Gd^+BGUhwcRRnZntBY{s zq}eGH4Wb;Zh(s-u!)UnP*Kk~xUlZJ9rCGI)(^=Y0!^vU~p;1M6L86rxpSGw0Wcd$<&->uTNhl$P==pl;hoeyum(=zi0b|0-yu zwtb=+f&u`nApRdjMoQn^*4gPlh|IqRe-oJrHO<%s7Ig2Lg)jJ`X_MW7DdRyZ2?lXx zXQ;4X+&F0lPK36_8|V&UN^4p;h(ZZv&E!zwU4PW3d_;lLe3YILQIkX71($?Ts*YYA zwMN>yy_MnZBS){@{oSG}s$>%SvIK&w@#_ErNqZbr`2^d?1FU6ly)gyhKrYBRg4nlP z7p>7$72c11gEobtS&drlsImdNTMOdjaYBjlWStsFQF~M+v$}tx!On&&O(6x8q4zMNTlig`7a(0l;_fQWcHr~!>rNS>Izj2<@)$7Q~eN^M-lYE zr>YmhtC~VDf@e;;rL)Z}KWm*~^{XHQ*{&Oz5jAQzFq3nWt~ zH|ID&<+lTuBvh5=QG!EM)s3UHA0W@N;CA&%h#19%76e%LM`JQp9dm5T7|Q1q*6wT1 zO==C$K1c8VVO~=6o=gr$PkJY)C$N&kw2N$0_oJ;Dg-)pse`5n@T{=5C zIlaHhUfmSE!~G=@Y5i#S`EhyPCu#n<7rDBZ^9;=_`e0QwQZp%8_-eCiQDs%~b^OP@mh1BU_{=t*RufCL~}epuICW+AW4sT2g0JnX4;?2Q$& z$2_9}u3a-&mzUQDJ$Zv^w!kkq>9>Iu6TOKc0lcEOM{K3Y><&@Vf9MC(yro}JPF{KF zw1QpR$C6SDQ2p z%>4YL!D9^9NtCEuOSm0G0i(?m27T(;Np6zqQINZ3y%dt=S)&8J?5m3^%JWb8W&svB z!|T$5U~i8t_<*|Mwg^uWArNUnUhY#*y0&$DR7>H| zo280Hu>|MurgRboP1FREbYp=94ChX7xxu6Nj&H3-m(g$qBy)o1?pL#4KG4P)dXJRA zLU{dtG0y-t;KSi9-uuCaZ-`BO6zcgRNAXLe9@Wp{qq&o1U6{<)UhBlQe}MAJ*gb96H@i}dD=2f20}Xl0k;@g)kzl$)Ygd?DGnTfR zf#=MLfVYvcCpCyXLq;K}F0}T;n00L2r1_nq;Xqhz*ZlbSDCJO*J0|Vs#&zO(Jn{61kV5V-Hj<90sqsrczUH6;^ygD;j|QDQ z-(lHsgVsj@YQbcqEae7g|8i#eGNw~RP?8&c8h_>>Jyrs(=<9DlgLm^1-m8ZWO0iU^LZ$>8!?j91I}U zWG6ADZ7F2m`JKkx=68ZZ`xi2^XT$|ZdTD~5k+I6a%NKQp{#m+^e)17#w(xXXqSa0gybbI_s@ATF4# z=>tp|g%cgjiev)zYU9$rb7NlVme4c369M@0x5%lD^Ol3e8iM_7h0$4Fr5KG z-YNdExOGuz1;%Tziq}TgnAVLH+X~OUZN{ zsm=y|NW4_euez3m)1O`ld0Q0l9dOK8JHZEaEir((R+PPRR`X2I+B)&=g5VA_Qr(t*Ok!_k~fe5#blu4OU3T_%SOzf}f5ZENp=a8Gvt} zhi|56ZDmDG)03{q66O3bZA;0{P7`T3MB*b(thuzpXVAt9+-01@afOm zxkrl57zEZ#RcEgE#E#ZEF?{OBp1UP(&NrZwxgrCr29#T#(hTw0+tuH)%(yFpCQ#hg z1Lj@C8EG?tJwH6wrfP`+aSPdcht4_AGlS@z6ayMb`}Hgj5QqT$D1N}13`I3t8NprQkRm|6ID=j71}K{7iZBoiYx)A+TVny z*4&c|sbPfl=4-P9x>9hU;diszeir?6T`>irYFOnrIbHiM?D*eQwtpa}e=Cg>YMU_& zEXdt83$9^vmW=khL{ky!N!!h*sPIs5@QBkgLZ2CKA)5q+){?{^7DeS%V}k_t{CP@v z_(Db2izR;&(!E31WEdEsprrU4)-s<-k5;yCo>tkXP8iqKDWb)dNrksk|Bwr(h~c2v zC)hq5NTLDz8J897WCw6xVTD(lW4&!FiET1xMLAXXBB(I>mccDHW;1?Ze)ToLI zCIml}% z7sL4UNK0~N)o7bAGZwaBiMr;24!=yITFVg1iKj~;)>n&GM@w2(Kc6+hlypz4i%Iq6 z{`L7Nl<{82>wf)w@LBDqn~Fv$;6{z>tC5^}@FLNg{WGVgkm#_#@zSBjdp0B7gaP3*G>M04o3s*&x_>>iKdlR#Yc@m6`WA zp1z}@5(59^kv%EBS*M6)ijcBA8n6ciMZF4c_5^wXd{dM|+OiT$aFGW^Ezl$&geOjI z79K#vr8&t^Gp^p5M+XqJqiO`1hjp*@{!b+5HhCdc3vya?#jKT()^y>1654TnO3I9x zq(+xXN%?fzyLfCv7=tc+xQqy6i)Xq`x!F7$GU`~0C1piMUE>Cf4y}T98H6jlr}0W7 zst|W3suk4E4d{#|r^L%bp@m^`EBrwtJAaI2-6vxf#ggQ7z#3Y%lz04hio>Lkcd0f7 zKU$g*g|s=CSrYcv#?=Y&Wl}g>8QV?X)*B@Y=K;;_3z@4=%AfD8yxz}9IeGd;=~c-5 z&V6CeTQo{lNT+>Iyw`oU7m~C&m(n@hsjxOz5~n|ssg<JKFT__Z$a2z7}KqcSwMl%btQ0Nu=;dM6qcQB|@G%%<$qa~``ZyG2jc z*Q8%-$TdbJ9Xe|lienR*Q($J%?G`69!74Vpwq!O$ldxNRNO^Z7nG8u=^2pR=o?M3@ zC_Bd>pA?TR>yfv5t?dPj(>L2Sv1>sQbel-_1wW(zafqVUVhV*~MuH5d4o=m?LHmw= zgB7$pgA|7qF1ObXanw47F{;XS&lFi)o!CZ^%UZpb1lA`PE|qTVBdD~$_73z?w{3^R zQv8b4DzLYfyz#~bEH#J6TYm5Z_J(^dH{e*2^Tx8Mm^L$@ zfVzO`cbYL~iB8)}TMK(z)x7)0Yz@p>$^0;t7PaS;(SAnt&%;-i+PD&6%_r>PW_l&6 zClA+?C_xFcgm}DFOy&KJFi6O4V*awJ(#!<99P-raiU4w}0W=(yJ=Tm0( zTxG(s8WDYA@x_zdpX5(pvj-NVtR`PTHr&6i9j{*YkGRcm&ky^u1yiX%g2sAhu~iv= z{!}YQ1lT{b$|;uvML%i(qwb;C_IYY7S8}r|?^1}kkenr#wn=9Vu_8PVHe%!|J>0ZP zk82kW&f;itnrnBYC1YNY{f_lr23em%?@k6?MH0a8)?VqKPRd)X`jT%zoCBhyNvJO zK|RyoMK)=h7T+v)_zKD!JWofq5M%PVe*iW?g`&s?dv_lYS=_Q>R<&p~dK2DG6Ffj# zQb3b#5Ky<3nVcG?56#A0mn2pFg40O^SBKQ4c6p&Mc;h@uR zqRv72o3frPs4NFmzMYA3tNQ>*8(HGC$REwroQ<+Nq{z+svLCMckkJ@>!n0!457H{8 zG3&-;&{*OQL!9E{fbM3DQXQxGT$`5?F}8l#KpYbC3MZ2@oS105JjqR-qIoZ}A!_>d zV+77KomcF45=$bo{<-|2ZyWZ3F{`Fe%IYlv)hg4&@v?S)1$$)5);Q{=7Y(FykHLsW zF59rc6WSi1SXU6U(w9{AVA3&{QHi_1szge{8xh~>%k9)a$JE%HO|SwB`VJg8TK zOD$Ow?V8PlAx9v94(?w{UE%GiEv7T@+aj@vt2Nx&-}5h#>YW0((CK^ z)Q_&BDLTE&`vIC#z|<1|wCdR>ljK$gL@Mt6=2rB9oFZYqc|rjY+y zA+ZnT&ak>=(7jBHFvD*C$VhcIuAiU=a~d2AP`25Jr92a{C80SX(2nkZ#XsV0!U7!^ zI=`XzWChOILI$NRzI$*?3s{eoZa&#CyOM9J`l|lMN$PE zS;!?YtTJ7F6;_b<8GV1+<#9DNo_nD-%c}iw7B>B@d}Ucmm``xqjtE~WnC!a4iA@PY z5%GD*V_VGgU9EOxjgAXB`hthe`<}AQ0!xCeBD<`KJj`no?cyRjjn1We5$p5v0m8KH zRIJlZp6!0ChTi3-bU}}cW3Aj_X-XGZ%&J(0D`hRhF3NP)p_tisMAy)!S@mUKUUZTK z+@sB&Bw3E#9$+P`Vzfh+0$m$}PnTy2xSvr9o;TP-c_qhgK~tgti(+xy<wIStHRVUqMOtq!H;~j^1J(ROp4AFmJE!W-Y@CSrv4~_Kffo7< zM{vmvang^by%|Zk;NU5Ij50nI0435e`Wy?`xt$PIH&)q_M=rkdP(Ge7{l=HOiom7< zsRYTf!b*P4{^B26`AB}!F5C>*DNG*B`A8SvgnB;T|2EQJb*A>XmFqx@3nmpU z)9d1zrSoPz%s1sxblcW(5X<%__8?zZAv#&HKL7HP-+cc$4-poaUVstcIx*O~JdORn ztDPjx-p(r?dwh`M6#J19nRbg75|Cz#lpnJhz_^KKpIvxGI(KMVxkss-F*d0FSSM!< zU6qVUs|Vrp{xQoXTyNQ7EkZ@>y@tEpM9lk)G!&VV}Wlj172tSao? zJ*&E*hPq_ar{4tA`LDPfWG!wm+&&<4VNy!jKZ)0wSfHgl5A>*RAM}j1ybceb`Y{Pi zqWJZerP;w-PB>0}8(w`TWW9ZtDE?Qymt01rFaQhypyRt<k8j#xs)%YpfpoBb45pG8A0L=FqmRkQ(q`vpIAv2XN@7(xH4maB?nDD6KTaC3PTwI zEf&fxO>24dQ$!)*g2={@Q|wRVh7hu}&k^=7SzNdxt)99?*uv_Z!YVSY%3ezc;oE)< zCEH-E$Yf4Snp_m}$>@b2;6|<^mZK`Y1Z>YgEcfsz|i* z#m1%kbsZ1th>y6BrLctN)Vg(}0u9+t>5xs>@(8L#i*?K3WCI_D(f86>vqdk?a_2Rl zv;(|wTsMq6UhC%FMxjVj{zxQVV>*LJ@znZ@G~rBZ5lcAj|bCwIzopNxTun<^pb?$xeju_}%nEva&)NZbhhzj{eT z9v1GS>rbeym=jof>XYM|Q7NhP*WYcEpI$W6mBu+O`?oY4jVD$#<}n!CH84wK(7y|= zr?O#0$@@=ux6eLq1a>V6vDIZ7=89zIG%7b7wFd`cBK^iS07glGiUXZ?C@7qfC!3Iy zH;x+c)k}%H#l}n@613v7#LYUCCG(jqjFv6rJM=`v=~5)aBD5S>uh=0@M+Puwm=b}E zPFU!)6+u^=u?@x`>6zYq>VPJWZYlChQ3287Q`5!v4oY2ElYfU9N073}Zs-a9lJ<$t zB+k=N-$C2E#T7PeoiKEiQr0d|B9bLWr+7AM&Wpk)aflZwr9ek|aAI&gcEew1D0pSb z>7J?%u-X!cGpSg0*@?_d`$DiGq8j!ePTsKr;px$i@5IwYee!|0tUS~)lI#iu{|J2> z?w~CS0Diyh$o_2jD%``3eFc|oC47mv^$QL@ok9Au@g`oJLd5y`2@d;tE#~p&Q1f*v z$KlgRNbV@X9-)+7J^s+YxR$U2JIk#L;=_kRTKBCgNU&04+pcI(- z0?L8AtG^&rqPTvH*Fmar0ZF1zc%`AF7^2h~K~#_>g@I=NJy?UN3|RX=fT`fkr_mr>}#1c&cV|Z+xa5^Z?*d_=D-DF=Su^b6hE~>d`pJ_v zt=Y$MO~)MQoJ2njQ_ zY$FR@n$`@tJ=^j$s=Z1NV|=YF;ZKlFMG(P+h;F4p8l1&17m>=lq$w_Uss|nJV_Z61 z9IlJ2D=9q@BQp-hkIjOzN#u?zrP=dKS!=LKy~9}_-=`}_YUvW}=PqO1jOD}-VXZ|4 z5(nf!6u)9vBW*?O()O4t4&3tdJ%L;0VMzvF@x^LfOI*S0o@0*XUZ z8wF5JL~jMbbvXn!;lcizHFl-KKK`)-4uH|9R(DZ)_wjfT08#$nKm#unHRZKKaYBSJQ(a~2} zr2BK_ma5(kRFm6NU(_ouI;x^&c59p%;(y;g6Bk`fKzh+)Lr69kjzDr2Q~)I452ncm zfa`yxq`G;9a)&lGz$d^$yxbmb6>M+eTtqo2WG*L$6Id3PuLB66eal8??Rku6<$DIA zs!CWLsneq(DN&qhy^dQlvi;-Z(%n4I`w!RCINK?(p1c?KgPcAdyM7W!4;?|`N>a+e ztqdkh>3Dz^Yao0^h$;q(qD__KCH$BRwk~Ui>2_0Z)fgxd3iHf(wWa0&h5SF$Qu<;K zR~Dhy`@rylgCzn{Dc90n8zAR1vzK!^S6`kGmBh8iWG9SOgerDY%uj{%`GJrKQjJqp zD{1mBTYw7W1^7TdwEmL8SaU;0GEgR2R7{PMtUX}tG1FE~B8Jfkf(S4ZhA1(h=6 z2D$w(ipypQsp1;vF!ygy1Un}hlj8All~l)kIrADlT`%9Y_~ky?#F|DrGHoPFWT!kB z$4FBZ-TDhRL5GD~WRx0Vrh5qoL6P|DjEEvQ5lwd!wNmrU4hg6pXVcYtx-rA%QliFO zljePy!swF_XgAA=jpZGSs3=*($9s2X z5^L}~(ARmnw?6MZ4c2x|(oGNg|zWzn+M^k(p+!s{)ZiZ-^DOV0Fz8GUC0X{{)kEP}YQ z|E!QKVF#1OiG?((IMfzXOo6=@l{W&FLC1#=$Kf;ahP?agh;P-oSB) z3fzsGG^%BD+hn##bYjZ9eQ+05&QI*Cgf2xEkKnG4o3u0D(JsQ!T{P4P@Z^fs^m4fS zyn6dmV=61#s6x)};ZV!vQIP#%*Ut4RZ?dsZ-LJrjULh6*8}KFCcPXdl_2l60RocbL zuGQ^PmEFZQQ;8)Jyr=Ova=O~vTm_KZdkM(P1WX6r3DJHC5nK7^wM?wFw0=86N{l7N zKb-SN=K8Zd8AhbSqS0C8{l^wWSRgYXW(fMT**?H|Q~-b>Tt@duGgO4#*nF1A$yUHylgV)C*lfAzKaOcMk(KS{jSrB_usU;%=^(3k0F-cIXpZwL1TV8?grD^` z)A#VaUN*Ib`_vIsR*-(eUn$G?pw{Hy=|~Yn1Q8JN6Y-ISIOD)`unHPj2memv)hqKm zrBloUkSdTrnREJ?1@H$$lcF;x8(YR348Qr2t=Nl=&W zr&n4`@x#Wjogu!>^$UjO3-F&Pa^aq!`s8=Lvl8ULM;O+>5hi8&uY}w1Rq!XA0Cy~L zw8)&rD95qscgihM`qM9*=?rD5CdP!d0|snf(JW>%4;0*kyl6%cf`_QcS2{-h&G&d- ztbTK?sMrY~ZSvTBEAwgVsUZGxQx~PJ-l%i5+#w&6v%S2Qp=_>_E2}gXchIbmB0Be5 zV<yE`X==3X@^h+yCq)K z{imgbfwo|itb+zlS%lV5svg~fb}3i-VVS}l5Ok*NbaEuFu8j|OqHM-1f@x)T^7ynn zcNJW#lUpsv*3ad#0@~$Jc?<%k}I1`((Pq&90ESCb8q1 zCDIajOAK@i-hNx!U6 zd6m3}rYC81A@kEN3U-U6dZ1a2XigYfRj1$0hTK=95}=)`+kC`KIZfgI@FJvrwQ4fe z$j3hrD0?K9FN$ULl0-PBu;@|FvPLu8yCwkS)T<5zUaFA@%qnBV;N3@v^Mbi3@4ct7 zFxs)O;aW?S=;BeRreM*sE@*?2;sTehaeCeDl=5hC%ONKRe|4G?dvFDFKqBl%rKH-0 zYgZa#osck`H+yR%;ggQ?r{l=U;C@Oj$oOeI>XT_;$-SH6O-kbF_H1-Mzx1yso=NS- zCW#NF(djSjf{Pvu+ zrmU(}U)5mM;UHRJe^p$3)Ur2U;z~yI-Is^{V|C8>Ek=(AD8;Q}#0733gdbTow<{QL9u{D2A@!o!hlrPNjzZb83sTQ6C*vDfEQwmrt^OI1G*!yx6HlFo;y~7bp ztg+-cBdxg$KgtU%b8|1XrrL{jDCNxnRug)6b2*0C#K>>jviTuUTi(B{9=~eRawGe$ zEr-UGe$$p~R-~HmhMYMHNK|L`HOtUu25$Rl&$E?^CQl9v#t**gDshV6w+{k?7B!*e z$Je=FTH9{q4}~Xs^5$638O@723$*bSh=V3v%ma$)Du(cAUc7;Ap~vf6y-yWbNI1)2 z4^kh^xz9N4d?j<{uL&Z#xfpV6PxHk)wTtF-_~lURN?Vdx8u_)7+sEm_=Msta2zQ?f zG7?+Wl2$%_hIJOPjBXAI?rBroNFYV#sl zUFB=c8?w?HIqd9S-ijWDahTjJ7ZtLw^4_A7U05MlszPWsReF@o8d~07xcT<5WOI)z zO(#RPi%+6FdQB%*>nvhb@fLI^0n11_II@%0%X(`UlC=wccPKuK`e^!(uZAS&a@sd5 z?HE8aRtm+nqUhea3xGQ-g|b!Uu0I;J);QOn%2TU$9k;5EW<1g1dpSoP3vAP%vr#F% z6OmVBCT^=TEmUB|_j=%dIt{ou9!$HR2HKEM8{g7X>C@4g*P5#XJ}MZ7DPriLnt{DX zj;G8sQVVsA4m)IpBI)~Lph%>s)320<8aB0QF-`a)RmiU-5mkf+xvKnnkN)-~Zr=TMLki@ku;>^s;f- z8lr#+ifrAUnduP2INQO?WqkHn&bPFT*Q%p_TQu9L{gg7iRXsx&$KlcNEZpCoA$ur#xM!u|eTO~mxeLSUjs3pF&Lq$!S2RW5`wUF<%fx6DLdh?Vg=q$O~rPKe;6!8 zq=5644?=6-t-o?tfk!u%?RW{j%58QYFEo)YPo^2lE&uU->42yiyLYd{Qx}fh*GZz! z1@rg#JQ=T3Npb}WkfVDn5J$N!sDseuyk>^iPr5=BxL*dFJ!22*MC(=Bj?%HU8wLJ# zUWt2a#fV`*6-sAY_Dz4PNW+)>ty=>X{F=$8+sBc5$W6(@4#WvXj0*B(!lAg?a#leM zD3DpBXPF5gmUrG`Yer5IzPcST&JyJ}^fr02p?Dp+N@KK@ijE1buPxdMis8$*u?2f; zVd1C$P-^D~g)!oQI&Jcg99P>U2b#GWw)w%ZNUD9GW1mZO*CQl_Xt>#T(ItWSGZUPnEW zqmCM6ES0ijh%QfIrs*r#cu0JwwaVSk7+A{qsWZFq)uXWn8>S3tMW{ z9|JuIWdS;1UVN@YVkH@}s*jdE+ZKMrA1B(jf_KCpwerv+;PF+o3w?f?7ygzK$0OYs zZ+=@NN9&o!NN&M!rWtgD;*(rZ$fN-wWXV&GHM_94VNvY$O|&M8skx$2m*x2?W(HiH z1XTgKf4{|8i^EHcF~`VYD>k_5Jj`uP#cq5nD7M2ef@6dy7y45gGFVlHfxH|qf|7wc zUL@7z1KqU>l=jd7-)%iG7qMLW2|m1!TkNBO24sE0FGjEqfo`zRh-Y&NQN~ z%mP@2^izd2><0#$4fV1X=PrHnlGxi5vH@m^kb()84YI!UdHaW7VatCcn|D2f_Bo3WkF&|_>EdSxf2D4eel6~vbI(J{et zS{6nAGE_tiJvSopbEVLT(f}QerSb8RelxJI{<{a$hNarDYDU#e)ogX*GHb zN3l4Qa8f}EjdRQ~NiPIU%7O~$EF#7xVflV{P?@$$NNaS4)Xi(Tl3P&)ZuSGW=t8j# z%oK`pEHZswqeNk_>s$9!wcPZKGB}xcG3@6q{OGC=@4mbsuY8SMg`EYX;5j%P5VXrm z0QK>73ML(dDIG8JRm3T$Sa=YHi|q8Rv;f5iW`sUDGeJw(DB^)T6+l$>l#c;uFftjh z1&CmTJlOslA8yPcI>5L0aD!}_oX0YQefwP>Hp=9yUye;&HXWPP!uyA%9aD`tj(ndpg1U8HEXv@+R4N~yw?;s znhFfz|NJ5nUAoNrQ9u2HIv|P<@=?1J{k45)AdE5m(Ix`g2=-ShY;s=9&Qu6qh(GzZ z!pOx7huwBgTT794v+knK?dFibl0^1x@pw7TqgYb0zV00PYV<0P z4?9B+NePC`0v{fEoXy8k2vCELrn9?8&HSO%eC3R!V)Hlg-uuAdxGG=opt-KKdi1E9!r_a^JFKJP6;LJ?)u2S zo!`d>5q?7}h%KI;XGY!8bH+ALbuJO7ef`i3e=ho-qFK^2nEt(FEB|A2)!k0i-Ad8= zsQbjpc8h-y%c8KIsNvfFlj6ZMk{=1y=TQLk30;8 z1uB*Ur3BsR+x9$6dtH3o_DX4^H|d}E@;1%LiS&c0H-hpPA;Z-^Sd{lyTO!_ zA`b6N1!6E2))=Znz9<&gdGQ70OZnpRMR3oYB2z7$*+Su9P5cWF6?F?ceoMo>VaCx3 zF%RcJ3A!@h=jYd+FVPKTh0Jhi5Tpx%P7`ah{`i~sGy+Ym$i#Z@m{8{Qs5d{A2vHC< zUw;<9TWI^!?Lz6jzV;l@7U~Lg4JHP@Yq6V@ZUBSid%tQ$6*Tw?4OxJaYchdp9Y%I^~@|LsvHg zPxkmw!_e*L)N!p=<`EXtmnLZm-C1D_A1hym=6uQTUdZw|7kz7?TBxdVu~|&pm(~2j z>~;X?9IRQ2xnJD&%sNh(+&3&sD;R6rv8ND1||^)1C&22(TgN_d--xvXfoBI_D46qlKt0ej;N*>WNg7GMcQm3 zmI`Zh7Vu3>31m!>5jx<5l51|2$(OmrBf2_`ReZM(A*}OHTFF-UQeN{3h;6q{Zr;}? zkG_d&${dtL&B|f?In!p2;jl2uuVxG4t{S?OVv4I77ECuPutOrw7S3u)@fgCOSa;~Y zgt2PH5&7WVE3fMt4CUnDNPW)k|2lwTAA5NcJTH+i=qgTiUC4AK?OZ*Q=A?fU2qTb_Lod zoxHku5Tq$C&Q($Z>RA^io~1=Yk~8fxQgM1d(K9s=W{*jsi2a4WPODw;gj^{8*2N>h z+)~XaxLn8j%jS14HR;~>m#9%o1fwHapw-WZkta8o%&51k3@}fOm}`ZOc%-Pq&&|=? z;c4_6kA-%)5Eac+FZKny6x>8I`U{a(CT6UvlYPBur0vF0#~jTOvE_g#&A`aFOwl2gv3sE z=y$gM3WVKK@>Ofus}Fo9(TDROpp4ahJ<03fkGJO?*>sX*(nOMMd%-Cj=?we`th}TC z=&0TU+szP}p_42FMyBf)V#C6G*=Ao|iXaY7c3#D%E%&1V)&`AZS08ynt7pSej?yO* zg9OB4^RM&Vbvj#KO)d|k6^y?wgPh~9!F_;Vu{cau3%7-2LvqSj_r@>Ub8v0nJ!{`8 zO50nx8qC*j`;f2g>|U$Ch~3a=Mhu2$gCf67pb*qvrGXI?Sd#X%cid@O)&`K-uoz3b z%cE|KHDmIT3_F=|X!p#=BAipfFw@;7?uC}xO7`7pC=FMHvePtH7=o6xN6j@CmQV_m zdV9jzn!|1ECAy)PpfVSeXND>7__l;gPbYTm!>;x_Q;!E1vr*6-E-<^N{C$LVfp>IJ+W1KKAbtfkjZBxfO;A(OlT%KWspS4?AUq2w|IFORi&uA zDP5~`Vql@TZ7Ed5jG;ZIVtI<&eV=ETTo{7?=77=!J6V0OLuLC8#8Olsq$obx2RaS} zycN5UvwnE$7X8Tm`hCZQ_n)qdrdirV7(m-@FYpNx?a%AtzuEaeMW^_QqyIflLD#gj z88Ai##F}TOGhCt`)TtiCi6EK9ayg~r$`=XtT8!>#AltMoTvQ-eIiK#&SvRyR zr8S)~2&5fxWbg1u5)XI+80?s_p6lgWj=_md9z4v;EV70HoYZT>sMO^vrKRQrV+?Qk zO!=3(arWJJjE5@E&CF9POY|m`;w-S< z)ZWEc%%7`!{i%Vx(s3ph8K|Wwqx^$y=MU0gqPjKE@1u7$`UWwvP(;dVwvTa`NP0Mc^^W>l6nQ7sUQVvc|vMX6h%+yV42C@qt84xMi$5HrV9on zerFpvkvn!Hw@;s4z6>h&_$y#{8^&*`Dl5?UXCWKQtw>hZl)9L+3Fc8MunxKDCL7x- zF9p+_e&2ZLxfK`G5joC?Fmxh{_up#TrcGp#h$~hTAbr}G*XqLIJ=obM%&}1~6>ni~ z2D3+!7mqh2M)*XEmU6mn+OzZEh1#t}fBlNcDu zZ-Kf@*{%)^uPJSUyQpgINDJHS&E-cCS`SVXtTd4x6#!&Ei>Zf1;D&ToO9X9HB~w=c$58(;Xf&YGdh;jUGdgQjsJcmkcG%;gu5ZBErq= zQBo3^X503x9F>?ftce)9p`#Sl{9Ug?@P3cU3T}zEK%RB=(ep`lGpr~r^*C2Wyz4w3 zvxAZK_VRjL_XL^+HFnzAQWp+rg;&>LVW0&>v^>~c{I#+l%<{@`eT&St2=GdxUMuuy zR7JYcxx=~&1H(4PyT)JdF`8LXtnlaSjE&CXhWr$INF;dd=H*`3zkD>&(|-x2dekN)>CD>@YUDzCrMU z;!|_cX-!u{f;;^H4g?H!JGzge4kFV?EFVy(w?>m{8$SY#O$3Vd>5aQ%6|vXsbGtH` z;D$*enoNiSrnGQ8rXtF_qPXWNewy`iWDc)|6JA>F?Cwj;LBDAnI^Kj|R{PjHk=uXd zS^KK?N{xSRSvh5r;t3jR^+?9~IaAfX3Cr~@?8Fki)qWG#RD=!ZV*IC~mczYstWO=C z(l1&*C^Y&Wq?GEDY`EionzN58p`s^#d(&kP`ewT1JU_6Tb!&nE?KX`Y_58XUYv?pga4vihvy*u9e3^?2RvC=84BLxj{l^A?sc@ zj*9b4*M;4A8IqROqbH(j2-cyoRS|3%n*~>dh=L6&7c3(36|MirqHMugMkoA9pzm{q zBIS*A?T1qb3yj;edfKzMPtRqyAj{ef`Hv;k#?ff4mgFKa~HEm%{gFMgJR1f$nD||F7?wzMDY*j~KqIu&c92%Bf)p$DBToX=Mtn zDg{}jntJ-U8Vhqwa}znZgivOHJY`NULqO|xW*j80$*!dLkdRQym4L#;TzYhgsZ|Q{ zu3JX}>nhh*hmrAd)!}YQ3KWo6!M0MH32$0u?Es-c4sSO$0A@wl#iXd9MV$DoPY_4@893CYcUwU9aXtY5F zo6|36yDvoa!o}zHTQKM?A$}7svIpDHMXYx;M8tLmEOwp`s(p0eqOqX~`W+n-V~%`v zGg^DI0AhCA7PqpQqLK?!z%#^c2{ih=5uh6=)*L*gshWfH!Lr$WyYYoG$BCuP1C9%V zMDh`2>+1CzJR?Ez$;Ec}G^2d;{n-yWs*CNjl82@094ENwsLy2B$H>Z*F5eevzUYb5 zsQ8qUzF4M=d4jGu^irAl`MYM7cWXq3o-ku00ieBtL-{7~L8#Xo;~d^kCpb3;v(L48 z?`J^XV85Xcl8l#cQ;1*PADyNq z>*FV{Iqh-Uz-%vY1 zyqaLJ$9u77-O1im_aX>2RwHd*T%)ZcBp-z7*1UjgJ~jD~8-klC&`Q^SZVsjRE|#40QU zOUB2OAVf`$316-;JtG3Q^3>~`{HS{#cQGw%6i?Gg^YP zSQEsI@x%x*i8=aRl|Gq9BI=dgc0(b@E*{-qcyOv6v~U+dZH2q?cti zXxxaOwW&gEwPe8VrcLu3YhP}WC0wdeAk}HD-^7KV1Zl51tkbRtpGk3*S&tl~Jn4JJ z)@6(qC7&05ZZ34SR+Luj+dcTOof|oWy1fDjXCk`Odp(9YONRX3-Fxc2e`9ul64vWU zS$3>RoO+)Z%aCEAG8NF*!kqDwahLEQ+69Q5iSqP=6nqxbCGW~rt0iCcn=~{xZvyE; zIh&RDY7v7m(xllnZf;3+@@4M6tqz)~vXy1R#4JhTS!P6X+K8=h-)hY#m7A!ku*QAW z!2D{wj^WA)QgGDE$DvEwDIItrc1snl?RGuHmu4(wKaVkZmK=I8@3KG`4Z{)pk{n*x z)uk9IqoOS3qa=dc0D21Rez^0xdHl;6JFt*p0?q{Y(tU9@VNRgo;`TV!LiEkY$Ra5S zapbzxOcm^}(#(T#w&MZ3QaWGdDj%WYx&R%~VVA{tVySjC%KK*F&nX*>_ByLlAN#p+ z!h209?L;R^JrXD@_&p`d_s5b*Tb@TmbbusPq{!k96uplJd6oDsp6yklp&w7phFYVV zg~;ZzWTOaCQlO1(mO-p5=72TI@sZ6mW^T=|H}eJ zsIJP=sh05fOBZXhqF%~MMJ&WFb}yWW2d%wt-I)8q-5ioMUxOzyE!iCq$|^1H`{$&{J0b=ilVD<71MBcmf^{)-P|?1iN|o3ZTQhsS1g-& z+R;W1?f~m{JM>WGQIO9WkdV-zUUZQ%ZIrKMqO|znw|K}3E8R9jt*Dg(WRz8%09z`$Bx*3R0-9=Po}TIyNpnp)7C*%%r>%{{FFkR?RLMFAin zAOIcU7vO0TAPfKl1^xB{7I5GT0vZAW92^1`3JMY$9u^)R4i*j$0TC4$0TBfe4h|U; z83hd;0|Nsd2@4w&9UB!L1N|Ea2pF&qI0Os?1PnR?90L0Pa(QY8pg;qnKmcGM!~jqf z5HJ*wr!HW;dH@Inu(jVB{I3E63Tz`J6f_Jh9PkY_$N*3fFfdSXuy3sfzS|S{e*icN z1S%2J3rI9MT_|E(bY|b^OlT6JiVh6<@e@)OJv%=bSWGNz99%MT3Q8(!RyKAHPA+cY zmm;FC#Ka}uC@3l^tEj5!8yFfHo0yu}J2*NyySTdfzYPcs3JwX4iH(a-c%PV*oRyuE zo0nhkv9PkLx~8_SzM=6`XIFPmZ(skw#N^cU%zLpFt)Bf?$A0u{0RRt70Sbx&h5`@(JiN&Y zr3CyxJqnf8YFg5IV;=1X(79ABx84I{KzI~3IR)Z1i|163P_(vuQ`Bu(9`C0BZHqIj z=L6SI0D$omV1x2;rS=JsuH1G5Ch!D6QDaNxeU(#Nxga=A8&Oz@Q!Mhybq!gJocE{$ zke&u|@d514ZSm1n>j|(1{{*-fdHxF+6$7tij_FsAx@)zP_?j@0m+x6Lh+hWy#Y2R& z_ZgB*FO`o`~JORTy5)JK&pV3Y9K+PcrC|E*%T@kvZH?>iFpY@W8I2F7& zZ(a&i1UDvg;p}K{hlO}>Ul$2%+EhG+YqlNSVwE`)n>aEt46=)*NZ=QDW3`-IsbXco zav3=9;zo$SiYH~CEj(Y+qzg+|kihjI!Ca6_g!Tb9&_Qc*1)D4Y8(CZ%Nn_|7mi!cH zyDd_{>1t(}HP`PG%x-1G1%q2aI~)PY?&BwbagXEQt%X14&|iazYD(m{#4Ua|+zu)x z{^s+VBdO!9YnfP<4_7!;hyKe`grhv;KyTh5{fEgASxLg^xQeKcvYkE!_5HjFdTwr% zA3#I@=BWDc1c(m2e*8B0F1U(Be?2b%6aBq%<)@~Du^#TVYrYEHT8LCe98j zuME{2ZLu?jrgZQVxG&T6%y4^$>NHKUVe5-o9Wodj)kzJ*+d=hFiifvD%P?gmZYgJ) z3m{#jnJZ3|Z3Pg&e@(SbtuEMJ$myWbY%zddh6fuRJ1o9_3})Jj8@Nv+!&=hS&*B=! zN&P~u9jAxOXprNSX(PgSYJ-(RAF*?J>jIeZ4`^xW#l!A6hlW`Bkzhfou^P zpy0>`N0Q|kirazKvx#idWFV#r8hLzc7shgbpDg!MG=0bi}!5f#jJ28%7i-f&PO{E8sRL73aa%zb38ZEYLKJzoBbw6k$OU(Ha8mqXgfSf&sq_@>zx4a7xH7)U;n zHLSO+FYwgVq@R6)taFv>4htPv_eF^I|BNcQ=_`o8zpoUQ5-_ChbkuLd$jS8t=zV`q zPy=;Oifet9+GyMAqx~{7eW?%3x7Ydx^?`$-pp@I&=MlbSm^`7t~|J{kBG@TVG7V=V(e`Vh&DnuA26qzW4uN+S>latL}WNq;AkxIHOI2(eTw-II}re1RK zB6;{YpPJ3QDXez3X{;7yfHzdhKVfDuz@yp&(g8R$qpKK-PPk>OR70Sl3=9lSkv4f`!bBEID24bDh zxux5yim3gX8VK*;XFn)G<~v{Ewdi?Mo4$2oj42ljUb9LeWvMJ^@9!tc1=uLP>J{!H zK!|)(e+SQ8sIl*~@d$;|Uu!wDxviAsEava#n?cVHf~d~E?P0+yvN0b~UXm%cXh9ab z!M5PBo1z1`<*}j?ZwJpy$+;wn>G5Xfo+o?xhM`BTI=K>>*r@i*W*Au!@v|Ztbp;7r zyO(G9t92wWlbP6?*p3CS23JR0o3oZL*KTH5Y)_Y3UhDix`FODTz%OXwX7Pf>+`yz2R~o`%rzWq>9YOt$o@hA%*D%- zMJ?GIUHXdVHreF!9jOgAaVUS3sU5Y0(n3;z+LD-&3(u6p~_OW7mcc& zrkS9H{eJbe*>FpjvTSj=MC{8|$4#99ueZvf`(8LF7U}4xV2d~J52F_MOff&y4x?3m z8WYD}V1{OB72;sp@e#y+b{&*C?uZ0;qqTwXMyqbJxi7oUM6X8uooUSalD3yEP>|iXRg+)3ZZ8lVD`DGb#!*um3#LeI* zz3cAe?#rGQ>ZMZpmvWMyQOc|BUgzt;7GlT?VGWVm;LzS&3s07?nGZjgP2OcMVji?E zP*=smJR9b}JXaYG?49?EjP_EHixH&+n>)Oeq^VzbpCv%h` zQ8|PmP72^6y($BraP&sF5fB^OuJx3ly13I*U7?gmk6>$nNETqFE@Vo&(X+Yf$6m}m z#d=xQe2QKRr7(3-Q7CEdY-^j}iR`K$AMnA?l(+pDb4R$&6mFE3@xvvO@B(kw=8l$| z{p|gg0!+bzSXEqOz+0U2;Hc*e_|9$)e4aF&PA4?;i z5x|#ztvY$Jm}2hUbYQOjF6|R^UXtAQ0`uYvE(^r^+{c-UJMTHKdF!hsuq$gek0E3+ z;D{5dxJSx$L9EES7pR*#yr;pQ?kQP!h&hs>W3eW`2+t8RvdkY+?3vcRPMMlj&354s zz9}kMxEC&eRemS+X7LG-qt2`uq?kUP$obxA=~)4FCzxGybBqJn3}Iv7o=OL+Jp>^d z9%PT8?&O^R1<6cqDa)r-MCDF5R!jufXKPxy+npk2M5-RuiXi}aiMMC#y%fQpPU^u} zh5e!lNzviZk)$ejKfc$ArNrH znm=>IU`24oQ-4&0#B58@BZOt0h;(8cs9Cx=Mg$89vD&UqGm0Wo*qXT=o%;kZ9z>T# zX=oi8a}Dk8e^JqT%*RDR?!z;_aR|NJtBgC7>JVjP{W$wP3Q6WNY4Pjyfv4!i5oeCy zK2D5=tK~Ca|7~Y@lv$c{Pp&c!ZQrP}PqQaMSIeX6v(L>QCp(Xj>Yp91W;C)t9JO(% zd4=Bz+&I5HU3s^0W7OhlEnOiA7`5r4B2fwRw&x`X`iSqc!wRw&y5Hr~9z6?n|5XuM zU`rRM4V9^TKOmZYzDGIvG}``1a*A1DZZk1jD!H>%L8#>;mh|d%2&orta{cg(a>6+4^OKgo4eIN z0dP&#(i^NxRZP*~-1oj5PLp%ksl`2PSP6RT8 zW`Wv(k zQ`WhubPB)cO=`1%&sAz=Md+O@8`-=LUp68xLQ2#Fn!0v#G~$iBu-cjDvT)#(Q-)tS z=b5+EekKkR;w*&I<)xY0RZfj~iyc)-KRLu3sXEh)pLr9WRwGS5ao=o?hO>dtfKgY# zbx_l)yDLtD!}^{8ZmjeWbw-nX`Y<}_t(FR0f^>NFDoqDLe9$_++iK?mVo1K(*SPnM z;S01`+eFD?slz1bpwd1d2@9Dgb6{LsGp%WxEpUpJt<7~)=!+_!=;;k&IKp1xK=`M% z+bBwcE$Ku+_u&NvH6!J?Xe&;YT`VfrBs>sBybM>AlPBx|z(QRwZEeLY+W>IEgv&9@ z7vHILF&0Z=gTa+UqMC-K?miO-(gE9ynkesFoh<5bzxwCN^Lr0^wL+dx@X8<)#`M&%~O+hM;xW!%X~v^p)&xsNeIdkHj|4EGGe-l z#LJhnx6l$$np~l}f7ktm-#nVqMlp!)%nv(^o_k`>gYV=q$vk&a-E{C7uC7syFiq`H zA1T)$ey58vNL8RB2{^oif-EH8=-cY1!NI|#!xg3G@T~ff{HRXqN^qX6JyG z=foDWaM|_fwjj%PN-qyWIBa!cADSgmkPnbw0yjj7?yJa*W$$t{}uFR zvCWLvu9+cOE}JnM!Zq2dim#omtYe&|m}u%udH|)7eba3_SA#%94zQsS<6CB{=XZuc zdxtgf{@w%(^LjnO|08?CHRC92vYC1g_)_a9BFpjPNPhKaJ24GAVYZ?C1UCX%E=H@} z$O}u_{m+99W7Om8Q^kmkO|fqY!w3;*khyj+rd)CB?jPs9*YJR5lm*^!^+#`uwi5)P zh2{`o`&GMx4os}#s4Ie&M|7b*#7R;{0*L{LV)Ao?wlShKd1q|aw-1#->kr2hV6*y{PX*+!wSn)h zB6$cPhI~-z%{Pr|YPJ#O)ErWY^e_hFT?1LDGw1nRX^4i7{2l&yR#o%QJtGh;c>)O3 zYTrNtja*K^YhHXzqVxpFSY)^d^M2%c6#dieekr0ofS54pVBqKgNB}SsAds({ zZ9rlk4zyJ>1N|F;uJPaLSl`mDemBT}V_y|d$XPEEA_La0#qW?XkHHz)BT6{q@t>Ja z5abm;fb{jiBr`#aEq>hher`WOz0CSC`O1ONq1V|aC53{I3~9pE@H1`{24qO8J4?Z> ztp8mTpN4-I6cdsjb5(H%(q6~#)p>q+NpY;!$cwj$Ux&#m#=g+V`Rha13iVyT`WT>% zL$l+;j+-wMtnMu6j~00f%9n|*A6PBRQoq#{xs_t8(6W^$um{bFWoxHK`dCoxU1B64 zf7lr5oMUMr&mU06uc6f6{}Gqh8Di1Va7Hk257CHJQdixH&LDLRRNpV9+T}K0y3$Ox z70c=-tNVqMKdc7$X(-A3bKVj+<7S-BLXNK!6qTRlxXq^~s5{ zPmO`Bs`eFWu+kBoL}jPjDYr~<98n3i_gf9KL(iw86}6i7-Wspg>0S+XPj|k{TSs~AH!7AkUF;UDVqq%#nr*W_67uMtnxf8C`)P0;A^8c8wIwjde2a^IHNxxp z`JoK(%KUd9T<`*x{8Zqz6Z`4fIhh(d|JSt(dn0YV$OzwpH0O=%pnZt0+K6o%irDG2 zrz_aJ!WL4&whNb)%6)s8ZAf8ROW=mq-`jglX=*Q^(us&H=dOI-E!~g9xfkzbIqc20 zD&V;eA8R9lef;6`D?zWehZ|kALjS;>jA#_!PKl{zNh$>q-%2o=lO8A=g~dA)ku1jA zfY6Pk;1VjUK|4j2O#F=1*@8ttTN+i^TA+{R&PEW-54wGDY$QtrP9g zxk1bOv(!buK!E^XUh?~97X(X>zP?LfD!SYax0PU#Y>ei&cE(e*kZI82Pbf9GA@;VV z&&0CO14-%a2zqszP%scJns2&eSj^PoTq$!St#jTuM48m6r%bCa_2kR|;9;Nb8=IF&J(0LfIFenFUDl2<5AyOf*z6!YaWv+V9r;CF zXeH%*=5c#|fwgt&k*bm>Q~vPNBe5UTaPA>IvKV-gYk>#azowysuAYVA8wXblL;G(N z5q?M<(T@>ZaJ?nO+2qlaPFM~Y43dz>c^`y2j%ZKNBpY>e+3@x(hGAGhBI~`%7XwzX zr!^4NMz-Y~D9A{6e|^Cj+htqRYMpXeIM>?MTwYrlSNkG#<%6+2lN1}sYa_$J+=xn z(+wXVsA;_fD+T^^oPzO*8L0q6)tCW2$&rBxo&W23pRSF~x1JGZf&ZTj&OpgED~y_> zy+Ch;dqf&sNg0krWtFOpi;MBE@Xfj8J!+MP{eczuVcXP>8F*7EXCb1C1YC_W#^=g2a6d|L*$5d|^*_E30v9e17 z@R4~Ig1<=5jf}iTt=ss8MxyY9O#u={b?;R{86bBO{3B=@foB?X$WST0W5>7u{FqHAe4@xZlrmjYMaPwhB!*KZ(~eD zf7QQRZQm`0+2%qyWIs8}pJ95%@Taqpd;pQc3Ak%~1kOm5pJ$`KwVmPrnT|l2{i}q< zw7mwhDubL!SBTEixxEWvi%H`Fj#=_#p@J3(_R@5yJeA9N%OAVi``Z1cg4Rk*R((k= zCzKc&7ut^bm(%bsuvE>4UzpO11TRJS(;`dtXpj;$K1ccjXJ9HUBK3xf@TKHf!Sl2X z2wDm$YHX?`f97Y^ipg)uX_3aK5>s`G=h2x9dB}(cY={*_rCk+ZMyTBLV01=p-8jL7 z_01?t-#V?}j%(pmDJ6|6sKMz45(U7&9iKa_ziG#nO?s^Q@H(O|EX5GfJ4sMb{!#K*dHi^ahR5Jki!i?%t#v;XRaQ$-5(lN%j$~ihIeL- zE>YGJil`Go&2mD0C|Kl-hox(dcn7;?SLlPe=%&@a~>dktTq zh$!l0ZW06a^wo%0FnY&@Z}HT!j>Cy>iOIGR$p)2rml0b>$AQ&=&Z)g z$x)04pw$1k#Q_1O1N_(-sl_t9>w&{n0^yIH@!wbHkDuzo)>aONRu0+^ev)hX9HFmfd9ii^G8iGAV>FG z+=6d6%D@lTbuhKI`m>MzY$vf=3Uu<2eFgvk(*gZd!eIVD_*drnA35iLZ^Xs6R5T9| zLJOE<;#UYu#QzTQon7=h1fE9#swWVF1n6t?E5sr&f#!e3U-(zr%BF9?mcA`H4dI!~OU7ru{YA4(?x}{UBle zbF^)|ze4*#X8IlN_l)a5db$Z55&tFme>1$lkAk1L-M_>Ap7-gIc z<@tNK@BF0S;eLSSLjJP}_kF?oy`{g?MStKi>i-GePc8jv8vkia{~DRy;GZD>^@{k{ z$h?OC1o^L5$G=7vGWsXTKj@SHT+U*~{{;C5CGnplzc%?N$UkU){~TGt^q(OApw9hs zWHqyYg8YMy_Ro=Z%>N1U4~o~{A%7!E{U}Bj{{;DumEwP#D!)QoTK*&GzrGjwozU~6 z)ecsFK>tqf`J>-|?Hc_9!NTz`9i@L4-tRWuA0Rhje>CG43-9mMe>W@ss9qiMNA+Kf zjK5d^-IVpCx_8vSgz&3j>vw=(%|$<|0{|M)Kgr-<#-rbB|Ek{pTzfz6r`rEkc4Z|Y VfD9}EfC~6!4ZP8R|Nh(A{{@j~DQy4% literal 0 HcmV?d00001 From 5a9579b88796dacad92129b09b21446c037d6b5b Mon Sep 17 00:00:00 2001 From: choieigun Date: Mon, 16 Mar 2026 23:25:11 +0900 Subject: [PATCH 6/9] =?UTF-8?q?=ED=94=84=EB=A1=9C=EA=B7=B8=EB=9E=A8=20?= =?UTF-8?q?=EB=B2=84=EC=A0=84=20=EC=97=85=201.0.0.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Machines/ILSOS_CCW_H52A/Properties/AssemblyInfo.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Machines/ILSOS_CCW_H52A/Properties/AssemblyInfo.cs b/Machines/ILSOS_CCW_H52A/Properties/AssemblyInfo.cs index d3d445d..32f0249 100644 --- a/Machines/ILSOS_CCW_H52A/Properties/AssemblyInfo.cs +++ b/Machines/ILSOS_CCW_H52A/Properties/AssemblyInfo.cs @@ -45,9 +45,9 @@ using System.Windows; // Minor Version // Build Number // Revision -// +//ㄴ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.1")] -[assembly: AssemblyFileVersion("1.0.0.1")] +[assembly: AssemblyVersion("1.0.0.2")] +[assembly: AssemblyFileVersion("1.0.0.2")] From a73ee05068b211ca95bec1e9ea01ea4ab774d3d6 Mon Sep 17 00:00:00 2001 From: choiminyeong Date: Tue, 17 Mar 2026 12:26:47 +0900 Subject: [PATCH 7/9] =?UTF-8?q?Key=20=EC=9E=85=EB=A0=A5=20Offset=20Log=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20&=20Apply=20=EB=A9=94=EC=84=9C=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Machines/ILSOS_CCW_H52A/EquipmentSetup.cs | 34 +++++++++++-------- .../LASA/GUI/Canvas/CanvasCtrl/Canvas.cs | 10 ++++++ 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs index c3f2f7c..d455e8d 100644 --- a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs +++ b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs @@ -23,12 +23,16 @@ using CoreUnit.Scanner.UserControl.ScannerCanvas; using DB; using DB.Recipe; using GUI; +using Hermes; using ILSOS_CCW_H52A.Alarm; using ILSOS_CCW_H52A.Device; using ILSOS_CCW_H52A.Models; using ILSOS_CCW_H52A.Recipes; using ILSOS_CCW_H52A.Sequences; using ILSOS_CCW_H52A.Views; +using System; +using System.Reactive.Linq; +using System.Windows; using System.Windows.Controls; using System.Windows.Media; using WeldingCommon; @@ -39,9 +43,6 @@ using WeldingCommon.Utils; using WeldingCommon.Views; using WeldingCommon.Vision.Factory; using static WeldingCommon.Vision.Factory.VisionFactory; -using System.Reactive.Linq; -using System; -using System.Windows; namespace ILSOS_CCW_H52A { @@ -91,22 +92,20 @@ namespace ILSOS_CCW_H52A var seq = AuroraEnv.SequenceEntry[SequenceIds.SeqAutoRunCCWH52A] as ISequence; seq.RunStateChanged += AutoRunSeq_RunStateChanged; } - private void ApplyRecipeByState(bool bON) - { - Application.Current.Dispatcher.Invoke(() => { - if (bON == false) - WeldingRecipeManager.OnActiveReloaded(); - else - WeldingRecipeManager.ReloadWeldingRecipe(WeldingRecipeManager.SelectedRecipe.name); - }); - } + private void AutoRunSeq_RunStateChanged(object sender, (string sequenceId, SequenceRunState state) e) { //AutoRun 상황에서 Recipe Save Lock AuroraEnv.RecipeManager.SaveLock(CommonRecipeIds.ScannerObjectTeaching, e.state != SequenceRunState.Idle); bool AutoRunState = e.state == SequenceRunState.Running; - ApplyRecipeByState(AutoRunState); - _UCRecipe.IsEnabled = e.state != SequenceRunState.Running; + Application.Current.Dispatcher.Invoke(() => { + if (AutoRunState) + WeldingRecipeManager.OnActiveReloaded(); + else + WeldingRecipeManager.ReloadWeldingRecipe(WeldingRecipeManager.SelectedRecipe.name); + + _UCRecipe.IsEnabled = e.state != SequenceRunState.Running; + }); } private void OnPermissionChanged(EventMessage message) { @@ -114,7 +113,12 @@ namespace ILSOS_CCW_H52A AuroraEnv.RecipeManager.SaveLock(CommonRecipeIds.ScannerObjectTeaching, !permissionOn); // Login 권한이 없어지면 Active된 레시피로 변경하도록 함 - ApplyRecipeByState(permissionOn); + Application.Current.Dispatcher.Invoke(() => { + if (!permissionOn) + WeldingRecipeManager.OnActiveReloaded(); + else + WeldingRecipeManager.ReloadWeldingRecipe(WeldingRecipeManager.SelectedRecipe.name); + }); //LogOut 상황에서 Recipe Save Lock //LogOut 상황에서 Reicpe 화면 수정할 수 없도록 함 diff --git a/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs b/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs index 0ff7596..015cd56 100644 --- a/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs +++ b/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs @@ -1,9 +1,12 @@ +using Aurora.Api; using CoreUnit.ScannerCanvasCoreUnit; using GUI.Properties; using System; using System.Collections.Generic; using System.Drawing; +using System.Drawing.Text; using System.Linq; +using System.Security.Cryptography.X509Certificates; using System.Windows.Forms; namespace CoreUnit.Control.UserControl.Canvas @@ -253,6 +256,7 @@ namespace CoreUnit.Control.UserControl.Canvas public partial class CanvasCtrl : System.Windows.Forms.UserControl { public List scannerParamColorList = new List(); + public Logger Log = new Logger("CanvasCtrl"); // ´õºí¹öÆÛ Å׽ºƮ private BufferedGraphicsContext context; @@ -1660,6 +1664,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { float offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(0, offsetValue), Model.SelectedObjects, true); + Log.I($"Input Key Up, Layer Move. [X : 0, {offsetValue}"); DoInvalidate(true); } break; @@ -1668,6 +1673,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { float offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(0, -1 * offsetValue), Model.SelectedObjects, true); + Log.I($"Input Key Down, Layer Move. [X : 0, {-1 * offsetValue}"); DoInvalidate(true); } break; @@ -1676,6 +1682,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { float offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(offsetValue, 0), Model.SelectedObjects, true); + Log.I($"Input Key Right, Layer Move. [X : {offsetValue}, 0"); DoInvalidate(true); } break; @@ -1684,6 +1691,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { double offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(-1 * offsetValue, 0), Model.SelectedObjects, true); + Log.I($"Input Key Left, Layer Move. [X : {-1 * offsetValue}, 0"); DoInvalidate(true); } break; @@ -1692,6 +1700,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetAngleOffsetValue != null) { float angleOffset = evtGetAngleOffsetValue(); ((DataModel)Model).RotateObjects(-1 * (float)angleOffset, Model.SelectedObjects, true); + Log.I($"Input Key E, Angle Rotate"); DoInvalidate(true); } break; @@ -1700,6 +1709,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetAngleOffsetValue != null) { float angleOffset = evtGetAngleOffsetValue(); ((DataModel)Model).RotateObjects((float)angleOffset, Model.SelectedObjects, true); + Log.I($"Input Key Q, Angle Rotate"); DoInvalidate(true); } break; From d8f13d07e456cf87defbd3d8c8560d004c221614 Mon Sep 17 00:00:00 2001 From: choiminyeong Date: Tue, 17 Mar 2026 12:47:24 +0900 Subject: [PATCH 8/9] =?UTF-8?q?Log=20=EB=AC=B8=EA=B5=AC=20=EC=9D=BC?= =?UTF-8?q?=EB=B6=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Recipes/RecipeEventHelper.cs | 24 +++++++++---------- .../LASA/GUI/Canvas/CanvasCtrl/Canvas.cs | 8 +++---- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/Machines/ILSOS_ACW_H52A/Recipes/RecipeEventHelper.cs b/Machines/ILSOS_ACW_H52A/Recipes/RecipeEventHelper.cs index 7552cfe..e79a7e5 100644 --- a/Machines/ILSOS_ACW_H52A/Recipes/RecipeEventHelper.cs +++ b/Machines/ILSOS_ACW_H52A/Recipes/RecipeEventHelper.cs @@ -87,10 +87,10 @@ namespace ILSOS_ACW_H52A.Recipes { plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_A_POWER_2, (int)(_LineParam_1.RampingStartAPower2 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_A_POWER_2.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_A_DISTANCE, (int)(_LineParam_1.RampingStartADist * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_A_DISTANCE.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_B_POWER_1, (int)(_LineParam_1.RampingStartPower1 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_B_POWER_1.ToString()))); - plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_B_POWER_2, (int)(_LineParam_1.RampingStartPower3 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_B_POWER_2.ToString()))); + plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_B_POWER_2, (int)(_LineParam_1.RampingStartPower2 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_B_POWER_2.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_B_DISTANCE, (int)(_LineParam_1.RampingStartDist * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_START_B_DISTANCE.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_END_POWER_1, (int)(_LineParam_1.RampingEndPower1 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_END_POWER_1.ToString()))); - plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_END_POWER_2, (int)(_LineParam_1.RampingEndPower3 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_END_POWER_2.ToString()))); + plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_END_POWER_2, (int)(_LineParam_1.RampingEndPower2 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_END_POWER_2.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_1_WELDING_RAMPING_END_DISTANCE, (int)(_LineParam_1.RampingEndDist * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_1_WELDING_RAMPING_END_DISTANCE.ToString()))); #endregion #region PLC Upload Parameter 2 @@ -104,10 +104,10 @@ namespace ILSOS_ACW_H52A.Recipes { plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_A_POWER_2, (int)(_LineParam_2.RampingStartAPower2 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_A_POWER_2.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_A_DISTANCE, (int)(_LineParam_2.RampingStartADist * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_A_DISTANCE.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_B_POWER_1, (int)(_LineParam_2.RampingStartPower1 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_B_POWER_1.ToString()))); - plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_B_POWER_2, (int)(_LineParam_2.RampingStartPower3 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_B_POWER_2.ToString()))); + plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_B_POWER_2, (int)(_LineParam_2.RampingStartPower2 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_B_POWER_2.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_B_DISTANCE, (int)(_LineParam_2.RampingStartDist * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_START_B_DISTANCE.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_END_POWER_1, (int)(_LineParam_2.RampingEndPower1 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_END_POWER_1.ToString()))); - plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_END_POWER_2, (int)(_LineParam_2.RampingEndPower3 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_END_POWER_2.ToString()))); + plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_END_POWER_2, (int)(_LineParam_2.RampingEndPower2 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_END_POWER_2.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_2_WELDING_RAMPING_END_DISTANCE, (int)(_LineParam_2.RampingEndDist * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_2_WELDING_RAMPING_END_DISTANCE.ToString()))); #endregion #region PLC Upload Parameter 3 @@ -121,10 +121,10 @@ namespace ILSOS_ACW_H52A.Recipes { plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_A_POWER_2, (int)(_LineParam_3.RampingStartAPower2 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_A_POWER_2.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_A_DISTANCE, (int)(_LineParam_3.RampingStartADist * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_A_DISTANCE.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_B_POWER_1, (int)(_LineParam_3.RampingStartPower1 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_B_POWER_1.ToString()))); - plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_B_POWER_2, (int)(_LineParam_3.RampingStartPower3 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_B_POWER_2.ToString()))); + plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_B_POWER_2, (int)(_LineParam_3.RampingStartPower2 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_B_POWER_2.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_B_DISTANCE, (int)(_LineParam_3.RampingStartDist * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_START_B_DISTANCE.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_END_POWER_1, (int)(_LineParam_3.RampingEndPower1 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_END_POWER_1.ToString()))); - plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_END_POWER_2, (int)(_LineParam_3.RampingEndPower3 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_END_POWER_2.ToString()))); + plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_END_POWER_2, (int)(_LineParam_3.RampingEndPower2 * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_END_POWER_2.ToString()))); plc.WriteDWord((int)eWordOutput.PC_PARAM_3_WELDING_RAMPING_END_DISTANCE, (int)(_LineParam_3.RampingEndDist * (plc as PLCControllerACWH52A).ConvertTo2WordDivisionIndex(eWordOutput.PC_PARAM_3_WELDING_RAMPING_END_DISTANCE.ToString()))); #endregion @@ -199,10 +199,10 @@ namespace ILSOS_ACW_H52A.Recipes { _LineParam_1.RampingStartAPower2 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_START_A_POWER_2); _LineParam_1.RampingStartADist = (double)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_START_A_DISTANCE); _LineParam_1.RampingStartPower1 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_START_B_POWER_1); - _LineParam_1.RampingStartPower3 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_START_B_POWER_2); + _LineParam_1.RampingStartPower2 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_START_B_POWER_2); _LineParam_1.RampingStartDist = (double)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_START_B_DISTANCE); _LineParam_1.RampingEndPower1 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_END_POWER_1); - _LineParam_1.RampingEndPower3 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_END_POWER_2); + _LineParam_1.RampingEndPower2 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_END_POWER_2); _LineParam_1.RampingEndDist = (double)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_1_WELDING_RAMPING_END_DISTANCE); #endregion #region Scanner Upload Parameter 2 @@ -216,10 +216,10 @@ namespace ILSOS_ACW_H52A.Recipes { _LineParam_2.RampingStartAPower2 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_START_A_POWER_2); _LineParam_2.RampingStartADist = (double)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_START_A_DISTANCE); _LineParam_2.RampingStartPower1 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_START_B_POWER_1); - _LineParam_2.RampingStartPower3 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_START_B_POWER_2); + _LineParam_2.RampingStartPower2 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_START_B_POWER_2); _LineParam_2.RampingStartDist = (double)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_START_B_DISTANCE); _LineParam_2.RampingEndPower1 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_END_POWER_1); - _LineParam_2.RampingEndPower3 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_END_POWER_2); + _LineParam_2.RampingEndPower2 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_END_POWER_2); _LineParam_2.RampingEndDist = (double)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_2_WELDING_RAMPING_END_DISTANCE); #endregion #region Scanner Upload Parameter 3 @@ -233,10 +233,10 @@ namespace ILSOS_ACW_H52A.Recipes { _LineParam_3.RampingStartAPower2 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_START_A_POWER_2); _LineParam_3.RampingStartADist = (double)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_START_A_DISTANCE); _LineParam_3.RampingStartPower1 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_START_B_POWER_1); - _LineParam_3.RampingStartPower3 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_START_B_POWER_2); + _LineParam_3.RampingStartPower2 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_START_B_POWER_2); _LineParam_3.RampingStartDist = (double)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_START_B_DISTANCE); _LineParam_3.RampingEndPower1 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_END_POWER_1); - _LineParam_3.RampingEndPower3 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_END_POWER_2); + _LineParam_3.RampingEndPower2 = (uint)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_END_POWER_2); _LineParam_3.RampingEndDist = (double)(plc as PLCControllerACWH52A).ReadDWordByDivision(eWordInput.PLC_PARAM_3_WELDING_RAMPING_END_DISTANCE); #endregion diff --git a/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs b/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs index 015cd56..1479f87 100644 --- a/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs +++ b/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs @@ -1664,7 +1664,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { float offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(0, offsetValue), Model.SelectedObjects, true); - Log.I($"Input Key Up, Layer Move. [X : 0, {offsetValue}"); + Log.I($"Input Key Up, Layer Move. [X : 0, | Y : {offsetValue}]"); DoInvalidate(true); } break; @@ -1673,7 +1673,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { float offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(0, -1 * offsetValue), Model.SelectedObjects, true); - Log.I($"Input Key Down, Layer Move. [X : 0, {-1 * offsetValue}"); + Log.I($"Input Key Down, Layer Move. [X : 0, | Y : {-1 * offsetValue}]"); DoInvalidate(true); } break; @@ -1682,7 +1682,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { float offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(offsetValue, 0), Model.SelectedObjects, true); - Log.I($"Input Key Right, Layer Move. [X : {offsetValue}, 0"); + Log.I($"Input Key Right, Layer Move. [X : | Y : {offsetValue}, 0]"); DoInvalidate(true); } break; @@ -1691,7 +1691,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { double offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(-1 * offsetValue, 0), Model.SelectedObjects, true); - Log.I($"Input Key Left, Layer Move. [X : {-1 * offsetValue}, 0"); + Log.I($"Input Key Left, Layer Move. [X : | Y : {-1 * offsetValue}, 0]"); DoInvalidate(true); } break; From 9265b22328e30881eb6e279cab9e08bd28580eb9 Mon Sep 17 00:00:00 2001 From: choiminyeong Date: Tue, 17 Mar 2026 16:07:19 +0900 Subject: [PATCH 9/9] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=A1=B0?= =?UTF-8?q?=EC=9E=91=20=EC=8B=9C=20Log=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Machines/ILSOS_CCW_H52A/EquipmentSetup.cs | 29 +++++-- .../LASA/GUI/Canvas/CanvasCtrl/Canvas.cs | 82 ++++++++++++------- .../UCScannerObjectTeachingViewModel.cs | 1 + 3 files changed, 75 insertions(+), 37 deletions(-) diff --git a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs index d455e8d..5d4afdc 100644 --- a/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs +++ b/Machines/ILSOS_CCW_H52A/EquipmentSetup.cs @@ -44,12 +44,10 @@ using WeldingCommon.Views; using WeldingCommon.Vision.Factory; using static WeldingCommon.Vision.Factory.VisionFactory; -namespace ILSOS_CCW_H52A -{ - internal class EquipmentSetup : CommonEquipmentSetup, IEquipmentSetup - { +namespace ILSOS_CCW_H52A { + internal class EquipmentSetup : CommonEquipmentSetup, IEquipmentSetup { private SequenceBuilder _SeqAutoRunCCWH52A_Builder; - + public Logger Log = new Logger("EquipmentSetup"); public override void BuildMainStatusView(MainStatusBuilder builder) { base.BuildMainStatusView(builder); @@ -92,7 +90,7 @@ namespace ILSOS_CCW_H52A var seq = AuroraEnv.SequenceEntry[SequenceIds.SeqAutoRunCCWH52A] as ISequence; seq.RunStateChanged += AutoRunSeq_RunStateChanged; } - + private void AutoRunSeq_RunStateChanged(object sender, (string sequenceId, SequenceRunState state) e) { //AutoRun 상황에서 Recipe Save Lock @@ -103,15 +101,23 @@ namespace ILSOS_CCW_H52A WeldingRecipeManager.OnActiveReloaded(); else WeldingRecipeManager.ReloadWeldingRecipe(WeldingRecipeManager.SelectedRecipe.name); - + _UCRecipe.IsEnabled = e.state != SequenceRunState.Running; + + }); + + Application.Current.Dispatcher.Invoke(() => { + if (AutoRunState) + Log.E($"AutoRun Start. Recipe Lock Enable True"); + else + Log.E("AutoRun End. Recipe Lock Enable False"); }); } private void OnPermissionChanged(EventMessage message) { bool permissionOn = ApplicationExt.PermissionLevel <= (ushort)PermissionLevel.LEVEL3; AuroraEnv.RecipeManager.SaveLock(CommonRecipeIds.ScannerObjectTeaching, !permissionOn); - + // Login 권한이 없어지면 Active된 레시피로 변경하도록 함 Application.Current.Dispatcher.Invoke(() => { if (!permissionOn) @@ -123,6 +129,13 @@ namespace ILSOS_CCW_H52A //LogOut 상황에서 Recipe Save Lock //LogOut 상황에서 Reicpe 화면 수정할 수 없도록 함 Application.Current.Dispatcher.Invoke(() => { _UCRecipe.IsEnabled = permissionOn; }); + Application.Current.Dispatcher.Invoke(() => { + if (!permissionOn) + Log.E($"User LogOut. Recipe Lock Enable True"); + else + Log.E("User Login. Recipe Lock Enable False"); + }); + } // For Selection LaserDevice diff --git a/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs b/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs index 1479f87..715cc8b 100644 --- a/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs +++ b/WeldingComponents/LASA/GUI/Canvas/CanvasCtrl/Canvas.cs @@ -7,6 +7,7 @@ using System.Drawing; using System.Drawing.Text; using System.Linq; using System.Security.Cryptography.X509Certificates; +using System.Text; using System.Windows.Forms; namespace CoreUnit.Control.UserControl.Canvas @@ -1309,7 +1310,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (m_commandType == eCommandType.select || m_commandType == eCommandType.move) { m_commandType = eCommandType.pan; } - + Log.E("Recipe View Command Pan"); UpdateCursor(); } @@ -1323,11 +1324,16 @@ namespace CoreUnit.Control.UserControl.Canvas public void CommandDeleteSelected() { + StringBuilder sb = new StringBuilder(); if (m_model.SelectedCount > 0) { + foreach(var layer in m_model.SelectedObjects) { + sb.Append($"{layer.No + 1} "); + } m_model.DeleteObjects(m_model.SelectedObjects); m_model.ClearSelectedObjects(); DoInvalidate(true); UpdateCursor(); + Log.E($"Layer Delete Success. No. [{sb}]"); } } @@ -1344,6 +1350,7 @@ namespace CoreUnit.Control.UserControl.Canvas public void CommandScaleToFit() { Model.Zoom = ((DataModel)Model).ScaleToFit; + Log.E("Recipe View Scale to Fit"); DoInvalidate(true); } @@ -1357,6 +1364,7 @@ namespace CoreUnit.Control.UserControl.Canvas { SetCenter(new UnitPoint(0, 0)); DoInvalidate(true); + Log.E("Recipe View Focus Center"); } public void CommandZoomIn() @@ -1532,14 +1540,15 @@ namespace CoreUnit.Control.UserControl.Canvas if ((System.Windows.Forms.Control.ModifierKeys & Keys.Control) == Keys.Control) { if (e.KeyCode >= Keys.D1 && e.KeyCode <= Keys.D9) { - int id = e.KeyCode - Keys.D0; + //int id = e.KeyCode - Keys.D0; - foreach (var obj in m_model.ActiveLayer.Objects) { - if (obj.ScannerParamID == id) - m_model.AddSelectedObject(obj); - } - - DoInvalidate(true); + // CMY - Arc¸¦ ¼±ÅÃÇϷÁ°í Çϸé OverFlow ¶á´Ù.. ȮÀÎ Çʿä + //foreach (var obj in m_model.ActiveLayer.Objects) { + // if (obj.ScannerParamID == id) + // m_model.AddSelectedObject(obj); + //} + //Log.I($"Recipe View Parameter All Select. ID : {id}"); + //DoInvalidate(true); } else { switch (e.KeyCode) { case Keys.G: @@ -1549,6 +1558,7 @@ namespace CoreUnit.Control.UserControl.Canvas case Keys.S: RunningSnapsModeChange(); + Log.E("Recipe View Key Input Save!"); break; case Keys.Right: @@ -1556,6 +1566,7 @@ namespace CoreUnit.Control.UserControl.Canvas float offsetValue = evtGetOffsetValue(); ((DataModel)Model).RotateObjects((float)(-1 * offsetValue), Model.SelectedObjects, true); DoInvalidate(true); + Log.E("Recipe View Key Input Right Rotate"); } break; @@ -1564,56 +1575,69 @@ namespace CoreUnit.Control.UserControl.Canvas float offsetValue = evtGetOffsetValue(); ((DataModel)Model).RotateObjects((float)offsetValue, Model.SelectedObjects, true); DoInvalidate(true); + Log.E("Recipe View Key Input Left Rotate"); } break; case Keys.C: copies = new List(); + StringBuilder Copy_sb = new StringBuilder(); foreach (IDrawObject obj in Model.SelectedObjects) { copies.Add(obj.Clone()); + Copy_sb.Append($"{obj.No + 1} "); } iterationOffsetValue = 0; DoInvalidate(true); + Log.E($"Recipe View Layer Copy. No [{Copy_sb}]"); break; case Keys.V: if (copies.Count != 0) { + StringBuilder Paste_sb = new StringBuilder(); + double offsetValue = 3; ((DataModel)Model).CopyObjects(new UnitPoint(iterationOffsetValue + offsetValue, iterationOffsetValue + offsetValue), copies); iterationOffsetValue = iterationOffsetValue + offsetValue; DoInvalidate(true); + foreach (var layer in copies) { + Paste_sb.Append($"{layer.No + 1} "); + } + Log.E($"Recipe View Layer Paste. No [{Paste_sb}]"); } break; case Keys.Z: //Undo CommandDoUndo(); + Log.E("Recipe View Do Undo"); break; case Keys.Y: //Redo CommandDoRedo(); + Log.E("Recipe View Do Redo"); break; - //Űº¸µå·Î °´ü À̵¿ - case Keys.Up://¼±ÅõÈ °´ü¸¦ ÁöÁ¤µÈ À§ġ°ª ¸¸ŭ »ó½Â - if (evtGetOffsetValue != null) { - float offsetValue = evtGetOffsetValue(); - Model.MoveObjects(new UnitPoint(0, offsetValue), Model.SelectedObjects, true); - DoInvalidate(true); - } - break; + ////Űº¸µå·Î °´ü À̵¿ + //case Keys.Up://¼±ÅõÈ °´ü¸¦ ÁöÁ¤µÈ À§ġ°ª ¸¸ŭ »ó½Â + // if (evtGetOffsetValue != null) { + // float offsetValue = evtGetOffsetValue(); + // Model.MoveObjects(new UnitPoint(0, offsetValue), Model.SelectedObjects, true); + // DoInvalidate(true); + // } + // break; - case Keys.Down://¼±ÅõÈ °´ü¸¦ ÁöÁ¤µÈ À§ġ°ª ¸¸ŭ Çϰ­ - if (evtGetOffsetValue != null) { - float offsetValue = evtGetOffsetValue(); - Model.MoveObjects(new UnitPoint(0, -1 * offsetValue), Model.SelectedObjects, true); - DoInvalidate(true); - } - break; + //case Keys.Down://¼±ÅõÈ °´ü¸¦ ÁöÁ¤µÈ À§ġ°ª ¸¸ŭ Çϰ­ + // if (evtGetOffsetValue != null) { + // float offsetValue = evtGetOffsetValue(); + // Model.MoveObjects(new UnitPoint(0, -1 * offsetValue), Model.SelectedObjects, true); + // DoInvalidate(true); + // } + // break; case Keys.A: foreach (var obj in m_model.ActiveLayer.Objects) { m_model.AddSelectedObject(obj); } + Log.E("Recipe View All Layer Select"); break; } @@ -1664,7 +1688,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { float offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(0, offsetValue), Model.SelectedObjects, true); - Log.I($"Input Key Up, Layer Move. [X : 0, | Y : {offsetValue}]"); + Log.E($"Input Key Up, Layer Move. [X : 0, | Y : {offsetValue}]"); DoInvalidate(true); } break; @@ -1673,7 +1697,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { float offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(0, -1 * offsetValue), Model.SelectedObjects, true); - Log.I($"Input Key Down, Layer Move. [X : 0, | Y : {-1 * offsetValue}]"); + Log.E($"Input Key Down, Layer Move. [X : 0, | Y : {-1 * offsetValue}]"); DoInvalidate(true); } break; @@ -1682,7 +1706,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { float offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(offsetValue, 0), Model.SelectedObjects, true); - Log.I($"Input Key Right, Layer Move. [X : | Y : {offsetValue}, 0]"); + Log.E($"Input Key Right, Layer Move. [X : {offsetValue} | Y : 0]"); DoInvalidate(true); } break; @@ -1691,7 +1715,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetOffsetValue != null) { double offsetValue = evtGetOffsetValue(); Model.MoveObjects(new UnitPoint(-1 * offsetValue, 0), Model.SelectedObjects, true); - Log.I($"Input Key Left, Layer Move. [X : | Y : {-1 * offsetValue}, 0]"); + Log.E($"Input Key Left, Layer Move. [X : {-1 * offsetValue} | Y : 0]"); DoInvalidate(true); } break; @@ -1700,7 +1724,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetAngleOffsetValue != null) { float angleOffset = evtGetAngleOffsetValue(); ((DataModel)Model).RotateObjects(-1 * (float)angleOffset, Model.SelectedObjects, true); - Log.I($"Input Key E, Angle Rotate"); + Log.E($"Input Key E, Angle Rotate"); DoInvalidate(true); } break; @@ -1709,7 +1733,7 @@ namespace CoreUnit.Control.UserControl.Canvas if (evtGetAngleOffsetValue != null) { float angleOffset = evtGetAngleOffsetValue(); ((DataModel)Model).RotateObjects((float)angleOffset, Model.SelectedObjects, true); - Log.I($"Input Key Q, Angle Rotate"); + Log.E($"Input Key Q, Angle Rotate"); DoInvalidate(true); } break; diff --git a/WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingViewModel.cs b/WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingViewModel.cs index dbcbf86..7da3a62 100644 --- a/WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingViewModel.cs +++ b/WeldingComponents/WeldingCommon/Views/Recipes/UCScannerObjectTeachingViewModel.cs @@ -181,6 +181,7 @@ namespace WeldingCommon.Views public void OnChanged((int id, string name) recipe) { + Log.I($"Recipe Select. ID : {recipe.id}, Name : {recipe.name}"); if (WeldingRecipeManager.SelectedRecipe.id == recipe.id && WeldingRecipeManager.SelectedRecipe.name == recipe.name) { return; }