From 664aa7a253a6df7dc6dc3305d07ea36cbe4d66ca Mon Sep 17 00:00:00 2001 From: liup <1454939542@qq.com> Date: Wed, 9 Oct 2024 09:58:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B6=85=E6=97=B6=E6=89=A7?= =?UTF-8?q?=E8=A1=8C=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + app/keystore.jks | Bin 0 -> 2626 bytes app/release/output-metadata.json | 20 +++ .../business/ExecuteTheRecipe.java | 146 ++++++++++++++---- keystore.jks | Bin 0 -> 2626 bytes 5 files changed, 137 insertions(+), 30 deletions(-) create mode 100644 app/keystore.jks create mode 100644 app/release/output-metadata.json create mode 100644 keystore.jks diff --git a/.gitignore b/.gitignore index 2b75303a..2a0d26c5 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ /build /captures .externalNativeBuild +*.apk diff --git a/app/keystore.jks b/app/keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..226d727fd364232a867a7363296820b3020c17e4 GIT binary patch literal 2626 zcma);c{CLK8pjzk!@gED88l&(rG;VeW*_^$MfM1h zED0G6VsIPb5-R&}yXW3h=l*r?AHVaQ=kq+@=g-giAxYeN0Co-}3GxLDQH(K<+2LX5 zWT%oKbRY>b@e_|CNubjI8iCS*Bv9&4ob>ZO1w;Rnf^oA0s3efVPk0{b^(z75L86i8 zez!2>pFqJM!McejpU|drLA1-`SQ&Gnw=^#RKmiV5mqEh7T>riZfPmPLl3<8yj5)g} z2asJ62)8JHyT+1Ful=UOKx4qL;G9TTX#M?gPeGI(se9JulEs_;%4WlUWUKmt(Q4Z zNWGoCHs_}n{t;X4V0w2Y+^|UD44rH8TvKY2+5qA0RP=4~DBn~y>&m8nkUCJGlI7i| z|Dp4gwT8_$n-O=VhV6|=YrEr~?f34Z!fNGhF5UaVEZ$wWw}JtGHxJx~31k_VE(n+^ zqm}}ca6vwx1$_?J3meB(EheBqn}2klxbY`9Bv!C;keFFrCo2>MhYD*DkL{Gz3wvwr zClA#2XKoT~Skz-9%pac`c!sA06j5ss zmRl5R9J>{m$B01qet?F@rz({9tj9WvJxkKMOVF}JumA_#dew0^nWTaHhx1&UlGI21orJgvA}kH|SBUjZ2DTYWMc8b$OF z(zW%@&WQ>J+wwI5(qvSTri)HnkxM%=#M6%U{#1>Vx*LB*uLbzkF&CY+nSTv>S+8>u zw33P$o>dRcoHt*3J+ja$%6!jLx+EuB3fC*8R4}&QfyjOZP?LkjI>;QH{2SAj zo*rkhL%%uFkQoBCh{ZdiO?<#$A}#r%emNU?q9Q;!{qd9OAfnNFBN5_b9%l@KX|J8% z%<9?eTbj?-uT`04o0AXKy0o}?5Klg=3ZF8}mii%6bZMb3#wI+W>e;Rkw;|+EjEOP@ z1H1OULrfq6bC?Mel_!KY0a?OWLv=9SsfHg=-ka9y4&E?&tuFF|=PM$y#486uz;+vC z@MGNVRCSO-zjO%^ROONav-z-L*!+=y`;CQE1%do_zF1EgRV_75Emd_*O?7Q8Z6pc! zdx;ZFB?0+=B3=MH+t0%JE6&OOzXTnTQ=*@=iwmBd1s90SDJ4H2S&8|71f6?Fc1di# zmk-;Il^!(tTpUT_AX6+R@t9|Xv}IM{nB+BR=BNSG30!V_dB7rys=B8vDTWtU7|_-H z@{%smkIotB_fj!ZH-wm4R!|JSJr~~!Co*Bs{t=Cu6-^Vs9osTKS@&!dx@8|0d^leO-hl zc^L86$ua=`O$5HCPPU2h#uD*#q-!tGqCQ1A&3*4kVcK|CqOD4gvJT&`cNYZee`Y@kwgM$$xVMM6!kFZdxUy*|N zi&s+GyS)?m5sUS_IJt6HL<>VWsLQGnG+*w%ceg^}-V2F(`TP*Y-N!0Pee!68t9UYv zQ!&;R7UN!(O=s32Pld3WNSsOZ9#3dG6)hLJxO_Oo*jH{dY8gA(;$o+sjip|@w%5Jh zuw<-Zb{Q2k0`+iRc#n;psb?`v&xmyXD2M6J|)jCMn( zaGVt`JZ@jIs36V-&l+`f>{Mky>CT7m3%I$gWIU4tk4xe%EhloJ043(V$A>PSv%GEb z2SVt_jb8iQ0rA-2TYe!sgBp{w`G3wvT6JS4<13;&Uy3>%D^J+3Zt+}N$g}sB-yXC# z5S_4ZFW^>w*6^{_V7ADbRt`zSd)DE=H?e@ z_DYTH@e2awgp0#H$7&nfX?f0(m#43D$d>xL4buVUCBFGs2TPX_M-HyavS%KlL8L2k zg*Q+@H`v2zTT9toIk8aRLtK`$Zf%lQeV5JMM{YbLs67^rSGew6lt5M|mmBzb%naQ4 zT_M^sAn)dPgyAWP6dLopQr8lVhT~dDFY2c>&+x8fJGR=XAgz$9NS zbug8T3x()o4%Gw0B!Xq%D1C(8$!4{6jBoCRahm}JYv?;}$#&1LTk~(7SeLYFOtrVn I_?Hs?3E$?!w*UYD literal 0 HcmV?d00001 diff --git a/app/release/output-metadata.json b/app/release/output-metadata.json new file mode 100644 index 00000000..3b4c47a8 --- /dev/null +++ b/app/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.bonait.shanghaiminzhong", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 105, + "versionName": "1.0.5", + "outputFile": "shmz-xiaochao-v105-202410090954-unsigned-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java b/app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java index e42f8f71..a04fd084 100644 --- a/app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java +++ b/app/src/main/java/com/bonait/bnframework/business/ExecuteTheRecipe.java @@ -54,7 +54,7 @@ public class ExecuteTheRecipe { * 等待超时时间 */ //public static int whileTime = 40; - public static int whileTime = 1200; + public static int whileTime = 600; //手动操作耗时时长 public static int HandTime = 0; @@ -1044,6 +1044,9 @@ public class ExecuteTheRecipe { ThreadWhile("料仓" + silos.num + "下料完成"); } + if(IsForcedEnd){ + return; + } if (val > 0 && !IsForcedEnd) { ThreadDelay(val); } @@ -1150,22 +1153,29 @@ public class ExecuteTheRecipe { //<<开门流程 ExecuteTheRecipe.WritePLC("档位选择", 0, null); ExecuteTheRecipe.WritePLC("档位选择触发", true, null); -// ThreadWhile2("当前档位_关"); Thread.sleep(100); ConfigName.getInstance().oven_wendu = 0+""; ExecuteTheRecipe.WritePLC("温度选择", 0, null); Thread.sleep(10); ExecuteTheRecipe.WritePLC("温度选择触发", true, null); -// ThreadWhile2("温度设置完成"); Thread.sleep(100); boolean isOpen = (boolean)ReadPLC("烤箱门开到位检测"); if(!isOpen){ Wait_Robot2_No_Working();//等待机器人空闲 + if(IsForcedEnd2){ + return; + } ModbusCenter.robotWritePlc(true,"机器人烤箱开门",true,null); ThreadWhile2("机器人烤箱开门完成"); + if(IsForcedEnd2){ + return; + } ExecuteTheRecipe.WritePLC("烤箱门打开控制", true, null); Thread.sleep(100); ThreadWhile2("烤箱门开到位检测"); + if(IsForcedEnd2){ + return; + } } //>> @@ -1173,24 +1183,41 @@ public class ExecuteTheRecipe { ModbusCenter.robotWritePlc(true,"烤箱允许放料",true,null); Thread.sleep(100); Wait_Robot2_No_Working();//等待机器人空闲 + if(IsForcedEnd2){ + return; + } ModbusCenter.robotWritePlc(true,position+"#库取烤架放至烤箱",true,null); ConfigName.getInstance().oven_has_food = true; PreferenceUtils.setBoolean(ConfigName.ovenHasPen,true); ThreadWhile2("烤盘架放料至烤箱完成"); - + if(IsForcedEnd2){ + return; + } //<<关门流程 Thread.sleep(100); ExecuteTheRecipe.WritePLC("烤箱门关闭控制", true, null); - ThreadWhileWithTime("烤箱关门成功",15); + ThreadWhileWithTime("烤箱关门成功",40); + if(IsForcedEnd2){ + return; + } boolean isClose2 = (boolean) ModbusCenter.ReadPlc("烤箱门关到位检测"); boolean checkClose = (boolean) ModbusCenter.ReadPlc("机器人允许关门"); if(!isClose2 && checkClose){ Wait_Robot2_No_Working();//等待机器人空闲 + if(IsForcedEnd2){ + return; + } ModbusCenter.robotWritePlc(true,"机器人烤箱关门",true,null); ThreadWhile2("机器人烤箱关门完成"); + if(IsForcedEnd2){ + return; + } Thread.sleep(100); ThreadWhileWithTime("烤箱关门成功",120); } + if(IsForcedEnd2){ + return; + } isClose2 = (boolean) ModbusCenter.ReadPlc("烤箱关门成功"); if(!isClose2){ IsForcedEnd2 = true; @@ -1261,29 +1288,11 @@ public class ExecuteTheRecipe { ExecuteTheRecipe.WritePLC("档位选择", dangwei, null); Thread.sleep(500); ExecuteTheRecipe.WritePLC("档位选择触发", true, null); -// switch (dangwei){ -// case 0: -// ThreadWhile2("当前档位_关"); -// break; -// case 1: -// ThreadWhile2("当前档位_蒸"); -// break; -// case 2: -// ThreadWhile2("当前档位_烤"); -// break; -// case 3: -// ThreadWhile2("当前档位_蒸烤"); -// break; -// case 4: -// ThreadWhile2("当前档位_其他"); -// break; -// } Thread.sleep(100); ExecuteTheRecipe.WritePLC("温度选择", wendu, null); Thread.sleep(500); ExecuteTheRecipe.WritePLC("温度选择触发", true, null); -// ThreadWhile2("温度设置完成"); if((Boolean) ReadPLC("温度定位超时")||(Boolean) ReadPLC("档位定位超时")|| (Boolean) ReadPLC("档位回原点超时")||(Boolean) ReadPLC("温度回原点超时")){ @@ -1356,29 +1365,39 @@ public class ExecuteTheRecipe { //<<开门流程 ExecuteTheRecipe.WritePLC("档位选择", 0, null); ExecuteTheRecipe.WritePLC("档位选择触发", true, null); -// ThreadWhile2("当前档位_关"); Thread.sleep(100); ConfigName.getInstance().oven_wendu = 0+""; ExecuteTheRecipe.WritePLC("温度选择", 0, null); Thread.sleep(10); ExecuteTheRecipe.WritePLC("温度选择触发", true, null); -// ThreadWhile2("温度设置完成"); Thread.sleep(100); boolean isOpen = (boolean)ReadPLC("烤箱门开到位检测"); boolean isClose = (boolean)ReadPLC("烤箱门关到位检测"); if(!isOpen && isClose){ Wait_Robot2_No_Working();//等待机器人空闲 + if(IsForcedEnd2){ + return; + } ModbusCenter.robotWritePlc(true,"机器人烤箱开门",true,null); ThreadWhile2("机器人烤箱开门完成"); + if(IsForcedEnd2){ + return; + } ExecuteTheRecipe.WritePLC("烤箱门打开控制", true, null); Thread.sleep(100); - ThreadWhileWithTime("烤箱门开到位检测",20); + ThreadWhileWithTime("烤箱门开到位检测",40); + } + if(IsForcedEnd2){ + return; } if(!isOpen && !isClose){ ExecuteTheRecipe.WritePLC("烤箱门打开控制", true, null); Thread.sleep(100); } - ThreadWhileWithTime("烤箱门开到位检测",20); + ThreadWhileWithTime("烤箱门开到位检测",40); + if(IsForcedEnd2){ + return; + } isOpen = (boolean)ReadPLC("烤箱门开到位检测"); if(!isOpen){ IsForcedEnd2 = true; @@ -1387,11 +1406,20 @@ public class ExecuteTheRecipe { } //>> ThreadWhileFalse("出餐工位检测有无"); + if(IsForcedEnd2){ + return; + } Thread.sleep(100); Wait_Robot2_No_Working();//等待机器人空闲 + if(IsForcedEnd2){ + return; + } ModbusCenter.robotWritePlc(true,"机器人取烤箱烤盘出餐",true,null); Thread.sleep(100); ThreadWhile2("烤盘出餐完成"); + if(IsForcedEnd2){ + return; + } ConfigName.getInstance().oven_has_food = false; PreferenceUtils.setBoolean(ConfigName.ovenHasPen,false); }catch (Exception ex) { @@ -1415,7 +1443,7 @@ public class ExecuteTheRecipe { boolean robotNoWorking = false; long a = System.currentTimeMillis(); while (!robotNoWorking && !ConfigName.TEST) { - if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 3)) { + if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 2)) { break; } Object object1 = ModbusCenter.robotReadPlc("主任务读取"); @@ -1439,7 +1467,7 @@ public class ExecuteTheRecipe { boolean robotNoWorking = false; long a = System.currentTimeMillis(); while (!robotNoWorking && !IsForcedEnd2 && !ConfigName.TEST) { - if ((System.currentTimeMillis() - a) > 1000 * (whileTime * 3)) { + if ((System.currentTimeMillis() - a) > 1000 * (whileTime* 2)) { break; } Object object1 = ModbusCenter.robotReadPlc("主任务读取"); @@ -1496,6 +1524,9 @@ public class ExecuteTheRecipe { // ThreadWhile(foodPosition+"#料仓检测有无"); Wait_Robot_No_Working();//等待机器人空闲 + if(IsForcedEnd){ + return; + } ModbusCenter.robotWritePlc(false,"炒锅允许倒料",true,null); if(!MakeStatus){ return; @@ -1503,7 +1534,9 @@ public class ExecuteTheRecipe { ModbusCenter.robotWritePlc(true,foodPosition+"#库取原料倒至炒锅",true,null); Thread.sleep(2000); ThreadWhile("炒锅倒原料完成"); - + if(IsForcedEnd){ + return; + } if (isJre && ConfigName.getInstance().WhetherManualFeedingSuspended.contains("是")) { ExecuteTheRecipe.WritePLC("加热", true, null); }//再次释放加热 @@ -1568,12 +1601,18 @@ public class ExecuteTheRecipe { ThreadWhile(foodPosition+"#料仓检测有无"); Wait_Robot_No_Working();//等待机器人空闲 + if(IsForcedEnd){ + return; + } ModbusCenter.robotWritePlc(false,"炒锅允许倒料",true,null); ModbusCenter.robotWritePlc(true,foodPosition+"#库取原料倒至炒锅",true,null); Thread.sleep(100); ThreadWhile("炒锅倒原料完成"); + if(IsForcedEnd){ + return; + } if (isJre && ConfigName.getInstance().WhetherManualFeedingSuspended.contains("是")) { ExecuteTheRecipe.WritePLC("加热", true, null); }//再次释放加热 @@ -1627,6 +1666,9 @@ public class ExecuteTheRecipe { //检测盆是否存在 Wait_Robot_No_Working();//等待机器人空闲 + if(IsForcedEnd){ + return; + } ModbusCenter.robotWritePlc(false,"炒锅允许倒料",true,null); if(!MakeStatus){ return; @@ -1635,6 +1677,9 @@ public class ExecuteTheRecipe { Thread.sleep(2000); ThreadWhile("炒锅倒调料完成"); + if(IsForcedEnd){ + return; + } if (isJre && ConfigName.getInstance().WhetherManualFeedingSuspended.contains("是")) { ExecuteTheRecipe.WritePLC("加热", true, null); }//再次释放加热 @@ -1698,12 +1743,18 @@ public class ExecuteTheRecipe { ThreadWhile(foodPosition+"#调料检测有无"); Wait_Robot_No_Working();//等待机器人空闲 + if(IsForcedEnd){ + return; + } ModbusCenter.robotWritePlc(false,"炒锅允许倒料",true,null); ModbusCenter.robotWritePlc(true,foodPosition+"#库取调料倒至炒锅",true,null); Thread.sleep(100); ThreadWhile("炒锅倒调料完成"); + if(IsForcedEnd){ + return; + } if (isJre && ConfigName.getInstance().WhetherManualFeedingSuspended.contains("是")) { ExecuteTheRecipe.WritePLC("加热", true, null); }//再次释放加热 @@ -1737,17 +1788,32 @@ public class ExecuteTheRecipe { } } } + if(IsForcedEnd){ + return; + } ExecuteTheRecipe.WritePLC("加热", false, null); ExecuteTheRecipe.showlog("关闭搅拌、关闭加热!"); + ThreadWhile("出料空盆检测有无"); ThreadWhileFalse("出餐工位检测有无"); Wait_Robot_No_Working();//等待机器人空闲 + if(IsForcedEnd){ + return; + } ModbusCenter.robotWritePlc(true,"机器人取空盆接菜出餐",null,null); Thread.sleep(100); ThreadWhile("机器人到位请求炒锅出餐倒菜"); + + if(IsForcedEnd){ + return; + } ModbusCenter.robotWritePlc(false,"炒锅出餐减速到位",false,null); Thread.sleep(100); BottomClick1("出菜");//自动去倒菜位 + + if(IsForcedEnd){ + return; + } //一直等待机器移动到该位置,否则就一直等待 6s超时 String name = "出餐启动反馈"; boolean IsComplete = false; @@ -1767,7 +1833,15 @@ public class ExecuteTheRecipe { } Thread.sleep(100);//10 *6 } + + if(IsForcedEnd){ + return; + } ThreadWhile("出餐启动反馈"); + + if(IsForcedEnd){ + return; + } Thread.sleep(100); ModbusCenter.robotWritePlc(false,"炒锅出餐倒菜完成",true,null); Thread.sleep(500); @@ -2078,6 +2152,8 @@ public class ExecuteTheRecipe { while (!IsComplete[0] && !IsForcedEnd && WokModbusTcpServer.get().plcIsConnect) { if ((System.currentTimeMillis() - a) > 1000 * whileTime) { ExecuteTheRecipe.showlog(name + ",异常超时退出!"); + IsForcedEnd = true; + RecordManager.getInstance().addLogRecord("订单处理日志",name + ",异常超时退出 ThreadWhile_WL"); break; } else { Object sb = ReadPLC(name); @@ -2122,6 +2198,8 @@ public class ExecuteTheRecipe { while (!IsComplete[0] && !IsForcedEnd && WokModbusTcpServer.get().plcIsConnect&&RobotModbusTcpServer.get().plcIsConnect && !ConfigName.TEST) { if ((System.currentTimeMillis() - a) > 1000 * whileTime) { ExecuteTheRecipe.showlog(name + ",异常超时退出!"); + IsForcedEnd = true; + RecordManager.getInstance().addLogRecord("订单处理日志",name + ",异常超时退出 ThreadWhile"); break; } else { Object sb = ReadPLC(name); @@ -2155,6 +2233,8 @@ public class ExecuteTheRecipe { while (!IsComplete[0] && !IsForcedEnd2 &&RobotModbusTcpServer.get().plcIsConnect&& OvenModbusTcpServer.get().plcIsConnect && !ConfigName.TEST) { if ((System.currentTimeMillis() - a) > 1000 * whileTime) { ExecuteTheRecipe.showlog(name + ",异常超时退出!"); + IsForcedEnd2 = true; + RecordManager.getInstance().addLogRecord("订单处理日志",name + ",异常超时退出 ThreadWhile2"); break; } else { Object sb = ReadPLC(name); @@ -2184,6 +2264,8 @@ public class ExecuteTheRecipe { while (!IsComplete[0] && !IsForcedEnd2 &&RobotModbusTcpServer.get().plcIsConnect&& OvenModbusTcpServer.get().plcIsConnect && !ConfigName.TEST) { if ((System.currentTimeMillis() - a) > 1000 * time) { ExecuteTheRecipe.showlog(name + ",异常超时退出!"); + IsForcedEnd2 = true; + RecordManager.getInstance().addLogRecord("订单处理日志",name + ",异常超时退出 ThreadWhileWithTime"); break; } else { Object sb = ReadPLC(name); @@ -2215,6 +2297,8 @@ public class ExecuteTheRecipe { while (IsComplete[0] && !IsForcedEnd2 && WokModbusTcpServer.get().plcIsConnect&&RobotModbusTcpServer.get().plcIsConnect&& !ConfigName.TEST) { if ((System.currentTimeMillis() - a) > 1000 * whileTime) { ExecuteTheRecipe.showlog(name + ",异常超时退出!"); + IsForcedEnd2 = true; + RecordManager.getInstance().addLogRecord("订单处理日志",name + ",异常超时退出 ThreadWhileFalse"); break; } else { Object sb = ReadPLC(name); @@ -2261,6 +2345,8 @@ public class ExecuteTheRecipe { while (!IsComplete[0] && !IsForcedEnd && WokModbusTcpServer.get().plcIsConnect&&RobotModbusTcpServer.get().plcIsConnect&& OvenModbusTcpServer.get().plcIsConnect) { if ((System.currentTimeMillis() - a) > 1000 * whileTime * k) { ExecuteTheRecipe.showlog(name + ",异常超时退出!"); + IsForcedEnd = true; + RecordManager.getInstance().addLogRecord("订单处理日志",name + ",异常超时退出 ThreadWhile3"); break; } else { Object sb = ReadPLC(name);//ListeningValue.get(name); diff --git a/keystore.jks b/keystore.jks new file mode 100644 index 0000000000000000000000000000000000000000..226d727fd364232a867a7363296820b3020c17e4 GIT binary patch literal 2626 zcma);c{CLK8pjzk!@gED88l&(rG;VeW*_^$MfM1h zED0G6VsIPb5-R&}yXW3h=l*r?AHVaQ=kq+@=g-giAxYeN0Co-}3GxLDQH(K<+2LX5 zWT%oKbRY>b@e_|CNubjI8iCS*Bv9&4ob>ZO1w;Rnf^oA0s3efVPk0{b^(z75L86i8 zez!2>pFqJM!McejpU|drLA1-`SQ&Gnw=^#RKmiV5mqEh7T>riZfPmPLl3<8yj5)g} z2asJ62)8JHyT+1Ful=UOKx4qL;G9TTX#M?gPeGI(se9JulEs_;%4WlUWUKmt(Q4Z zNWGoCHs_}n{t;X4V0w2Y+^|UD44rH8TvKY2+5qA0RP=4~DBn~y>&m8nkUCJGlI7i| z|Dp4gwT8_$n-O=VhV6|=YrEr~?f34Z!fNGhF5UaVEZ$wWw}JtGHxJx~31k_VE(n+^ zqm}}ca6vwx1$_?J3meB(EheBqn}2klxbY`9Bv!C;keFFrCo2>MhYD*DkL{Gz3wvwr zClA#2XKoT~Skz-9%pac`c!sA06j5ss zmRl5R9J>{m$B01qet?F@rz({9tj9WvJxkKMOVF}JumA_#dew0^nWTaHhx1&UlGI21orJgvA}kH|SBUjZ2DTYWMc8b$OF z(zW%@&WQ>J+wwI5(qvSTri)HnkxM%=#M6%U{#1>Vx*LB*uLbzkF&CY+nSTv>S+8>u zw33P$o>dRcoHt*3J+ja$%6!jLx+EuB3fC*8R4}&QfyjOZP?LkjI>;QH{2SAj zo*rkhL%%uFkQoBCh{ZdiO?<#$A}#r%emNU?q9Q;!{qd9OAfnNFBN5_b9%l@KX|J8% z%<9?eTbj?-uT`04o0AXKy0o}?5Klg=3ZF8}mii%6bZMb3#wI+W>e;Rkw;|+EjEOP@ z1H1OULrfq6bC?Mel_!KY0a?OWLv=9SsfHg=-ka9y4&E?&tuFF|=PM$y#486uz;+vC z@MGNVRCSO-zjO%^ROONav-z-L*!+=y`;CQE1%do_zF1EgRV_75Emd_*O?7Q8Z6pc! zdx;ZFB?0+=B3=MH+t0%JE6&OOzXTnTQ=*@=iwmBd1s90SDJ4H2S&8|71f6?Fc1di# zmk-;Il^!(tTpUT_AX6+R@t9|Xv}IM{nB+BR=BNSG30!V_dB7rys=B8vDTWtU7|_-H z@{%smkIotB_fj!ZH-wm4R!|JSJr~~!Co*Bs{t=Cu6-^Vs9osTKS@&!dx@8|0d^leO-hl zc^L86$ua=`O$5HCPPU2h#uD*#q-!tGqCQ1A&3*4kVcK|CqOD4gvJT&`cNYZee`Y@kwgM$$xVMM6!kFZdxUy*|N zi&s+GyS)?m5sUS_IJt6HL<>VWsLQGnG+*w%ceg^}-V2F(`TP*Y-N!0Pee!68t9UYv zQ!&;R7UN!(O=s32Pld3WNSsOZ9#3dG6)hLJxO_Oo*jH{dY8gA(;$o+sjip|@w%5Jh zuw<-Zb{Q2k0`+iRc#n;psb?`v&xmyXD2M6J|)jCMn( zaGVt`JZ@jIs36V-&l+`f>{Mky>CT7m3%I$gWIU4tk4xe%EhloJ043(V$A>PSv%GEb z2SVt_jb8iQ0rA-2TYe!sgBp{w`G3wvT6JS4<13;&Uy3>%D^J+3Zt+}N$g}sB-yXC# z5S_4ZFW^>w*6^{_V7ADbRt`zSd)DE=H?e@ z_DYTH@e2awgp0#H$7&nfX?f0(m#43D$d>xL4buVUCBFGs2TPX_M-HyavS%KlL8L2k zg*Q+@H`v2zTT9toIk8aRLtK`$Zf%lQeV5JMM{YbLs67^rSGew6lt5M|mmBzb%naQ4 zT_M^sAn)dPgyAWP6dLopQr8lVhT~dDFY2c>&+x8fJGR=XAgz$9NS zbug8T3x()o4%Gw0B!Xq%D1C(8$!4{6jBoCRahm}JYv?;}$#&1LTk~(7SeLYFOtrVn I_?Hs?3E$?!w*UYD literal 0 HcmV?d00001