From d2565068cc5fee5237e187cbaf46eaf7469683d7 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sun, 3 Apr 2016 13:29:55 +0200 Subject: [PATCH] Optimize Messages --- Moose/Client.lua | 26 ++++- Moose/Message.lua | 2 +- Moose/Stage.lua | 120 ++++++++++++++++++------ Test Missions/miz/MOOSE_Pickup_Test.miz | Bin 27279 -> 27335 bytes 4 files changed, 116 insertions(+), 32 deletions(-) diff --git a/Moose/Client.lua b/Moose/Client.lua index b18c3085b..45c270ae4 100644 --- a/Moose/Client.lua +++ b/Moose/Client.lua @@ -101,9 +101,33 @@ function CLIENT:Alive( CallBack ) return self end +-- Is Functions + +--- Checks if the CLIENT is a multi-seated UNIT. +-- @param #CLIENT self +-- @return #boolean true if multi-seated. +function CLIENT:IsMultiSeated() + self:F( self.ClientName ) + + local ClientMultiSeatedTypes = { + ["Mi-8MT"] = "Mi-8MT", + ["UH-1H"] = "UH-1H", + ["P-51B"] = "P-51B" + } + + if self:IsAlive() then + local ClientTypeName = self:GetClientGroupUnit():GetTypeName() + if ClientMultiSeatedTypes[ClientTypeName] then + return true + end + end + + return false +end + --- Checks if client is alive and returns true or false. -- @param #CLIENT self --- @param #boolean Returns true if client is alive. +-- @returns #boolean Returns true if client is alive. function CLIENT:IsAlive() self:F( self.ClientName ) diff --git a/Moose/Message.lua b/Moose/Message.lua index 14a11d92b..ebfa47b1f 100644 --- a/Moose/Message.lua +++ b/Moose/Message.lua @@ -42,7 +42,7 @@ function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) -- When no messagecategory is given, we don't show it as a title... if MessageCategory and MessageCategory ~= "" then - self.MessageCategory = MessageCategory .. ":" + self.MessageCategory = MessageCategory .. ": " else self.MessageCategory = "" end diff --git a/Moose/Stage.lua b/Moose/Stage.lua index 11301093f..08d0d4f06 100644 --- a/Moose/Stage.lua +++ b/Moose/Stage.lua @@ -107,9 +107,9 @@ function STAGESTART:Execute( Mission, Client, Task ) self:F() local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) if Task.TaskBriefing then - Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Mission Command: Tasking" ) + Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) else - Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Mission Command: Tasking" ) + Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) end self.StageStartTime = timer.getTime() return Valid @@ -220,16 +220,27 @@ function STAGEROUTE:New() end +--- Execute the routing. +-- @param #STAGEROUTE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task function STAGEROUTE:Execute( Mission, Client, Task ) self:F() local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - local RouteMessage = "Fly to " + local RouteMessage = "Fly to: " self:T( Task.LandingZones ) for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do - RouteMessage = RouteMessage .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km. ' + RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' end - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot: Route", 20 ) + + if Client:IsMultiSeated() then + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) + else + Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) + end + if Mission.MissionReportFlash and Client:IsTransport() then Client:ShowCargo() @@ -279,10 +290,19 @@ function STAGELANDING:New() return self end +--- Execute the landing coordination. +-- @param #STAGELANDING self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task function STAGELANDING:Execute( Mission, Client, Task ) self:F() - Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot: Arrived", 10 ) + if Client:IsMultiSeated() then + Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) + else + Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) + end Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() @@ -326,7 +346,7 @@ function STAGELANDING:Execute( Mission, Client, Task ) HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." end - Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":", 10 ) + Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")", 10 ) end end @@ -385,8 +405,8 @@ function STAGELANDED:Execute( Mission, Client, Task ) self:F() if Task.IsLandingRequired then - Client:Message( 'We have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', - self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":" ) + Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', + self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" ) if not self.MenusAdded then Task.Cargo = nil Task:RemoveCargoMenus( Client ) @@ -436,10 +456,21 @@ function STAGEUNLOAD:New() return self end +--- Coordinate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task function STAGEUNLOAD:Execute( Mission, Client, Task ) self:F() - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot: Unload" ) + + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) + else + Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', + self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) + end Task:RemoveCargoMenus( Client ) end @@ -463,6 +494,11 @@ function STAGEUNLOAD:Executing( Mission, Client, Task ) end end +--- Validate UnLoading +-- @param #STAGEUNLOAD self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task function STAGEUNLOAD:Validate( Mission, Client, Task ) self:F() env.info( 'STAGEUNLOAD:Validate()' ) @@ -470,25 +506,39 @@ function STAGEUNLOAD:Validate( Mission, Client, Task ) if routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName ) then else Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot: Unload" ) + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end return 1 end if not Client:GetClientGroupDCSUnit():inAir() then else Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot: Unload" ) + Task:RemoveCargoMenus( Client ) + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', + _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) + end return 1 end if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot: Unload" ) - Task:RemoveCargoMenus( Client ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. + if Client:IsMultiSeated() then + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) + end + Task:RemoveCargoMenus( Client ) + Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. return 1 end @@ -513,7 +563,7 @@ function STAGELOAD:Execute( Mission, Client, Task ) if not Task.IsSlingLoad then Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":" ) + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" ) -- Route the cargo to the Carrier Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) @@ -539,14 +589,14 @@ function STAGELOAD:Executing( Mission, Client, Task ) -- Message to the pilot that cargo has been loaded. Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", - 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":" ) + 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" ) Task.ExecuteStage = _TransportExecuteStage.SUCCESS Client:ShowCargo() end else Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":", 10 ) + _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")", 10 ) for CargoID, Cargo in pairs( CARGOS ) do self:T( "Cargo.CargoName = " .. Cargo.CargoName ) @@ -562,7 +612,7 @@ function STAGELOAD:Executing( Mission, Client, Task ) Cargo:StatusLoaded() Task.Cargo = Cargo Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', - self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":" ) + self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" ) Task.ExecuteStage = _TransportExecuteStage.SUCCESS break end @@ -586,7 +636,7 @@ function STAGELOAD:Validate( Mission, Client, Task ) Task.ExecuteStage = _TransportExecuteStage.FAILED Task.CargoName = nil Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":" ) + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" ) return -1 end @@ -597,14 +647,14 @@ function STAGELOAD:Validate( Mission, Client, Task ) Task.ExecuteStage = _TransportExecuteStage.NONE Task.CargoName = nil Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.2." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":" ) + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.2." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" ) return -1 end if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then Task:RemoveCargoMenus( Client ) Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":" ) + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" ) Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) return 1 end @@ -614,7 +664,7 @@ function STAGELOAD:Validate( Mission, Client, Task ) CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" .. ":" ) + self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Task.HostUnitName, Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" ) Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) return 1 end @@ -666,12 +716,22 @@ function STAGEARRIVE:New() return self end + +--- Execute Arrival +-- @param #STAGEARRIVE self +-- @param Mission#MISSION Mission +-- @param Client#CLIENT Client +-- @param Task#TASK Task function STAGEARRIVE:Execute( Mission, Client, Task ) self:F() - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot: Arrived" ) + if Client:IsMultiSeated() then + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) + else + Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) + end - end +end function STAGEARRIVE:Validate( Mission, Client, Task ) self:F() diff --git a/Test Missions/miz/MOOSE_Pickup_Test.miz b/Test Missions/miz/MOOSE_Pickup_Test.miz index f1e0e890c443cf158d440531d833424792c51aed..28934e59bb42f43092d2b61b3b8ba9e0d46f6682 100644 GIT binary patch delta 10687 zcmZ9yV|3>|`0iUz?M`jmwmG%!PHp2`W9nb6ncB9ewrx!9som~*{%fDT&pB^$B`aCU zi)7`K-1il~2tK?BUi-ifpAXG0xd#CTmV^r8AOuphzr|;R&qQM76qLisDej0Ms4v7pU9m4KC``!MO&6dyrS(!Lf{Tex+j^X(I z>o(%>M9Y1v%Ut$eP@tUf=+-E<_w54wS)`2r6E@>T)V5uAj-dA4+2$Lr?Kf(eGqM^b zYz&|Up>yiC6^c;yi3CT>uUqQ zo^pRvV14|V9^cy^p<8(^o+mU|9`j@WZt0@x#o!`W*&%<(1 zF}XaKY0t^f{n-v;LnCA3G!i_UlcNPGF&SF|E>E=dz z=W@y9=xV$RQ}L4>bP6f9cpMKO!>O*0Ihzd_HSDjXn`#y^OT#9%_{KC$;BVl_p|k_S z*}>R5?vidL@9d>*Lk)cy-AR*I`ndXdnXf30;>&7}za;rO4+c@%E8yj zf*?xmLr%%lgk-%E*N;be^fxGQbOhCA^AM$|Faw6#rxoac=uPcz$2P^QqpgbHM)!SJ zdcuDz-9NWyjq*Q}euIo=*kH$Bp5qT7oJkp9>f*oBd+ss|+Tt@fFyMdI4)tD*Z0#bP zcknw#Z36;t!NdViTEcI@Q~aR7VdsqH=jrFup0E!-*&+$Lg;RrTD(U(!!toF3Pxm&i zu5b1)Jk?bqIcVKYsiJb2@BAh0eE>AV=FVuD*8bbo+198m3V+2&>v&%L6QHIy&-UtccNJzGaVVeV{@y9q0Bt4++Yszys-7*B zwfHXLRsSKnsxdoho8Zl_9HDG@HWa;HDKv(x@CgSrI#~keSLcCUd~Mv^ z&A`FVTJ>Rhp{{1(E3DFC{mMvfJLp>(2blXv&3UVR*vM(%bI<8npz644acMy!7Xs?r@|NmZN_;_mpKcgj$U(O7d`v4ACpBzQwm&#Ie$;us&-g|xab0%#JIxH~qLM4$~=Ke!sc}qKBF5?#qJma_N-ti8Zo1EAitQI+6 zHo@O723P*I&6Av6ZBd%-Tg=pEK(EwEHRXvt6gP7h%$IJ)bv>n5 z3P+1WqURTVwGkQ{UCnNpN?jv^X+z2W>c?v{^-0G#tVrY{KWK0!;$4@{Ix#dQ`?JI1 zHZGf28hgw(Gt6IZ+2Q>1fbs_F=OK>8!5m!L$g-|ke8Z=oXAVr39L8D%u_;l~wK+!) zi>GO0J;)i;=9dN;h=P+e7Oi4nu1UudL$6TZqiT%)L#5``S^aU3rD%)4f!Ro{@uBoiR(FWtO4vZ_F}Zj8wku=coJ) z<)&FwGUnPCF#lC7V%G{+!ThUY=ss_@XlVOS)rC;xiW7$1ES18nnYfaD>x1U2gs<$s z!8j!b+?Ser_gvYs)_(8{Ppz`ElX|VZCJwOE>a%MUuG8rNeP;HFrm|O6d&x$_@qjBZ z_(bdZY?S!&NpXa8P7a1?rw`zN#9;UKH@jpKsp={AAK<_j_wOp74{U9lK9mVOds}#u zX)(%%Ve#G#r;1yRUki03d#TIL(Ro9Lm)7NKo#)!(GdpZ>zIw5)crWwg^N)wW?gc;4 z;>zQhylDc*MSV4Q-Z4}aw4u51v_cz|>sS?Ab z=8~V|U9%WciiDYoQ$03=@Vf*o1`z~qn)WNO2=BTs8SP`Te*%v)%u6ZdDcig)d7QW| zkE?5KEq-Tf^;LoAgzci(uv&t`?~D5$1`I>=OnN}I8$CVW^|x?Cj_xPO!jbxw)#eU8 z&JFCe*Id)RWPF|HYrN<53$QRq+q2yRE+@J!`7@qGP*a>$|Ct7z{ZoWF&5_k@O_CAe zM3-&hQ>q-*0)Asr8OUK^mgaSPBXB0V;JhO%aG?fzttjGl2_NYuxrWDH7JAHRQ9UoB0MmxJHq(=4;@;&XSKkkuWVq-nc{w3gufw z+H=M7p+0d%kI#Xu`=6#UUZ$PTq#6fwHw0c{PO`qXI4a1O3?dQ4p9td*Sd@GcaI4g? zu%2ND>T5wma|MGUZ;m}svl2dRH(F`sJpsP=Ra~%?{DRUC8SX<7obRofwHGLt7iZ3M;Ao=$x+bs7X||SBJzA>*z$kx$fA-Wzn}di}p_1BN zM(8XrQVcLU?&RtWYTEsF00%mI z@_1g;rcL>~Q)MM3Jo;-cEcqcD5SK0Ukz#w{Pbyf7uq08JllAR8ENYYxpGi``2Qb{_ zx_oav%pKHwB&hmqfXa-E9ezUogM}nzt`}jWx}ZHPPHSh5)E2D}BS__SP@o;9^VAN1+9Z6VV(j)2-U@@f28g`>-piTt_dbqOu{BRJ3OWEL^xGZJcA)&I*x{7w!02)(b%fZF9OU4bCvb zb#fpzCnl91h4*9W-b>yt!{LZQmLMd@>$;CK{0B0QE##T)C1W25;BH&Lj`ik_r{f)B zb#bErP=SXrC^o;K6F~xoVMy%ji*!}9{iE2PzzVLy*x=~ta>9SwBp0M3g_z0QJa7Ta= z`8fN94LS#WF&5+n?9f6wu86cvq&|LR969)m`khP)#`v%`6oUbTB_d!jsWm@k8$%ps z>A;nHh5>L|(8`)oi>TW~Q~F;-d!dF}&)ckzkF4iGE0*ZDF`r5#s^>44>G;d*1N=8+ z?G;VzHDC-XT|m#P`BM0ROf+Q5#*>1YWvYE*1Q&XR&Rs81MCA@)mvLF1(&&x1Qnb!NuRH?ujimC|~v0Sbp`cFMy)7L>p zzQ7EcCc-em;7*OovapC$&&piZyv&2N(~;Bm_`cbBtTUwMI<{SpEW-LNQ zky3Ju9Sjd(sn`COJMNmY`|GzuJ)m3HAFe2!Iw-q#5yj>P=;Q9?x3cG5rI&Q}Xa5@j zm{d7->|!uc1EXgcgKWE12ghef8oR~~}Ab3lH zwEOnW&;KfV;E$?#p+b5yODPSM>^k+`nIDTGZo1r?AI_EXI{UCaeQ%BD@n`d-IJS;a zY`z4VodlsKKkoJjmY4md8;S-Xqla4H)Tmi{Jzf(X5Y4f%sK%7j`3w_~R-1>#*H{YI z6?0wY1c{l4hwMl?$XHeU`xX>ht43PlPb#A^)E23iXnF!-{SFsczqq}(d@Qx(TJ=?- z2(J^T)y4@G_(Hinj6w$2^4iaaT#!jAD{cZ`+`(H+2pKpOTJC4Qh{+bs^e+=C>igOk z-zGS4?sLfnqlvlDIP+XPIP6y!Eb&t#@g_V7H`Iag&h+luxi9_IX_RQb(6hDrbfBK; zE=Q{0M_+_Ca*2Y!eadk)Gx05&&6{*5?y|EIgjWtZ)9;w&2d3geEAJwPl$D`spQQld zD+xtD=qU+GE&b<|)TTZuXK%gwfw)jqNHix}yFIoqT9G-(k}a_#2&OWH$DQ!lL@1wD z5jm76^g*|<2`^BU_Rw4=ep|25S%q4dFy=}Wh0u|sQ?B_PH_R%`JvAu^T33v` zO}}$5&kc1*l?FzCf!|2rk*8d&AF2cR6zg0oG*gdGf^O$YkLH2M9)#Khh1*}PEmMv9 zB&Cs_zX*J}fRZR?A)0iji;?z?k(S>-L=zK$T1rm?zXn@Xg5R4Z9TNBPRlz|CyQaaQ zkBQKab*_Tn%VQye-y@Z*{!jkZ7j?0Q#7zV!O0kAQh~cNG>>{oc_}lCNz(yzfnuWAw z0Dey;QNu(4^S@C$i^A|jkj;O_Y8vlxP}B+|;t=;{YYo^{iD!R74T+bU{Lhri|8A`N zT$x14XHm4B#E4*bk&$2Em3t(_m{DwY*SF=1?0H0(;PHTvl(|j$7fH+&iAqIiu9F*4 zG}q!~3IxogU7Q(!imXMA8Pb04LlmvInpR_zbZvjV%-wPItINk`2Vz14Jf)x5{-_;T za4f<0E7_H2T!am{wd&7)h0F)}JDCK>SRl<%)BlQ_KgF*=w{>bos}c|cXa+_kTZ z{6lo-KDeV0ogOuhM3u*Wy`8I+_F^twa&I<&&8Ay0MNo|EcS@>*V% zT&n!q?)v}-f%FOs6||o_Hn`1)V>M0pTH|Vo%VobFY}#gFna)fXoazKLvBytMpGTNd z7x%y|zMfu#xsShb#DBq=S9x(md6MJa?xjBb&LZD^$rNstFVdc!;UgfjdBhbkeJ=D! zON0_>8xD<1i!ZtgJ0^wt-rj=N*ejD&c=c+%L!Jo4F~YdoA)~ACg@Pt`j)Gt7aRPbZ z`ouF3{~foa-5v#)UXj5P$v`*;HfBihrCwigc!(uvsB`U~#Hy$);WY3N#U#c~F3{j= zs4URnN%>l+wMSs!kX;MuVm*pdkoJ|h4Nm9rF(-&n$2Q(JvmbE6)Q~$0u@|hyAfBWAlk|jyc%+|Ka%(N6qjEGEA^mlPOh+}>?9_p=OdS3f6Tzm43mlz%`4}_-+M7#(jAXbj{(2b-cQ$t!E0xn<3OmrxZ?{Moo%l>Qp=VWI}uj zo%@G5n?$DEeNrIuw%M{C0%9etcqy(->7VO2R^rTxm%12&GaDr&TrRT=H?fun=PT-_$>S5R+yXa1?UkDCGY_*#C=1_VCi!&Tj$2o38tG zPK0-5G>um1VIGJ_*o;zM{!%)kv$Gk|(=Cnv8>*eJ7LZ zm%YF&`*S}!EsmUwcG?1T2cY|aT>U8Y0MLydA1s4)cjXg>8SjF|Xob?;=6E>k30#*O z6gh6^+;bkBE=F!Htt50-f0V{4~gtJrHI?K(_Ie|Hzn3Lvs7U-w!eKNsPX&XUS|DSvV-D zXSZKX0-lB?3Ia&N^rru(Nj;}(#-KE0Dpsn3ATCb5T-hO*C-ZJ(+5G5EEfve+Tnc!( zxhGm0IHORrKoD#jF1(zW+P@|=<*bMZGBl-%GWrcIjjR^dKne{_6jWO<=${0GWM+jq zlO>4Y#f}g1XyE1QYw-4Tv63Z3W&d#~dH;xL1VFL*LK#Ht+RXE(axn3@_UIZjArzzm zE{mBU0WSL=hY}?GGE%e+&r~SdVMVS+j46D*IpFT*yx&diJ>UlY=?{svb>%x?#GDc1 zn>X~j-E%k~pfuYCxC~)(5i%X$VTD+XV3q{^B2$0j2oQ11xOO*HOR>U zdZ&CtFi%6P&kj}id1W;do%#Vode^t3ybjCN>7{ty}Y zcSFc9BKaioT8)sClgU$5-fD5T#ws-TBk1zVS?TVqY4FZVrjBI@8C&5QTeuwp3Q9u- z=S@DNm3ELUW_6j5{utHmLW{*c~|GM?(rt8=d9QSxt~ z#57*!Mg;v)S~ZJQXj%vmDMPNgJsLoufIJ28;W|&r5{ThYvbbP za!pT{<0aAKscYkH9*buu%inAZn0+`Vw??%$C$odBe@S#RDgFy{7Lzw%ZC6{^V>wQu z$>n&JV<>Tbqo)2DlYLmEyYf64y?rZqjVV@Gfiaz31c6F;Q$~G`+Zcx`fx+HU4+A}K zuGlF=5U+-u+w#Q*h!aK%BcX$%E@Sj&BRjT{W}&9~ks3YW2ikNBMNy#K zp!`?mWZ*Q~HsaEzK^<{I5>x@fkkV7zj!6A%e}%o=U#i0~bgcmzf}q1Y0_9Vze$`=k zqol+zgOjQM6Bv;ih+gC1e5FOOValvpyv?u`O8JwPoal?AD#+nz(9;8dF0ZxOyoo+l|951i&m1FUA=MwT(NSR{r;N01kbE+>;7rjdhp+ z_n2(8{i@A}i0hqqnwOs>3)sbgcb8}GmE${>Vm%yO=^^b_1k~0L4Mt(lo7Xqg&150b zs}ZQtViuOcd^XV?D%fdnCN+X+q(9sFjE4L3J5&Gu)4VHsZ{D`hwd2ozL_fpzl?RHx z9I0|xi(ua}Qk%cxF8-~AMzjM0sU~}YKL~+%Y0GY3@Eptr1g0AF$08F=3D|{o$%j~^ zWrN`{{DQW_&|;=)qLx23%7`l<SvaN-dR^3%EHvFy+#b98ZYf3sG<*K-B-~!qW^r{UvcR@E> zTSQX)d4hos-w~l48N^GdShD6-em0*G*@o}08s6EnDEd-{tMhtcCM7h8F}xeIpnJH* zIicf|yQtv=dT8vGRY?xAoVbeuSlNn$hj@?g=qs9^F&W+${3_ocSc!k_U*}wZ-?+Ta zaf(>z2=J2*fodW6<7el^RwYN0HjZGrF@n!|uUJEMct<3^Z#>~sbF}j}&C`M`wO%FP zx?a>SR7J?97$c*K|3z2O2abho{z`<;j%#5afrEs)Y_m&_#&fGW-vXZo&}g&^Qjs^x zVzEAR#9-oF-64ITG4Uv!tuNshcH*YfY(7-0tEbb{92{e_P;c9jFQojNk18Oy*|N{D z=synri^@8;KfRi5Ws=Hge6R3&;`pU+5Op*&)zyd9Q3vZg4!rDVd&J-D#b8mH){ z7$HWNsW4P_eK6Un%-a_pKo62hCoJc#+WLw9lq_8JW__T-XJ9TS;LaEnS!Yeb*ptr~DK#9ff5-kQ)YmxfDGbR=E^ClhJ6kixkWu zy2A3i6nV$9XcehfbC|SwYU$#~Nq3vlj0#3A)=P4Hi+^B0Be1z9A;gorag!wJsV}gnL zR7~Z<=}-ZwK^5||2ST-(5Y{YfkRt(_R2VY8El6vM?l`Z+7_TXxcw-e*NGqD&$Vm;0 z{jmyyYda&ISXfnkD{Cm~(!$q5YJqS64?OWXBkqZWCmI3Yu}3;*2Q5>POa33~i0f5P zIk?6O)#x!w9ON=$#jX>d+EIk_6UPE9sY{4=~5_YRte(Mpq^GA`s2Tj1B@6=e_Mx3B*O3oZTp-I~H`7(e`HkRjP=pgw!ct*+gpR(aI0iF1V7;7F$LB zkuf{kloilpwUSEdypt67BL;m{k-Fx1qKL5nowDnxj3$?SnRzOCkm3upzqDt|F5Viz zfK6Xeq%Jm|*u(R=cprKT)Vt`&71d+PG~kbZtKCBzo%b5hIr-aE zm291k2PV%1%Yroz`DWx_faT8Byv7R%I6W%ny$}nbHrHH9`?S9(D5)$oNhkv4E)cUPu zT;j8(RL4%<0OwP#JdthoI;x2_w{I5eK3t^%UoD=LFg?OpK5GYs!A&Z)G$urf)s-kz zqUMFZsgb%5ADTyJ%_s|^cC(s89%vFkZi?BbDThwuE-IvhSf0h33i3ygGVY1r?(hXy+0NcL3x$h34o zkP5ov9Yt=lqjj>$J1NSgMDo3dvJ}g!_!1kL*;tKcT2zTH6aS3SWr;S8vq`arbd4+% zPNg__MXoQkiOy@Oa8BZaza~OJUSEWd4jWvEvis)exq4*;5zi#KVcbCJH8g@SqGV1y zB0Yv919T8n$%81hs~jExDLpAh>kTw>nsgf3tq!~;T8bbzbQA2{VvfsLn5POXT2%k> zv3tX+WU(D%*Cdhw&T;6;gx)8n59^^ zI6l{R$Hnhh(tn8Y!d8{HW?`xJ_8!|SlZB%>$mO6PBJKIq>Ff(x1mHOm@n^sf>ds)x z%g{4n;A$t(KSHURc?l6RVA30{w04&+06a$3{4#nir0koK3jN|of5*n+Qx2kM7!;8w zxftsoww)>^@=44nWEAJ%xP~rl3N#+SPb-c6x&2h@n|i@ID07GtZIWfli{(&LW`_J7 zS$GLG$CqJEgL8_O+fq1nR}aZg;$doXhwtS6BuGA6g7cwGB{@6Vb7*JMKiUiepNa19*TEob0>&AoH2IpBmK8vw_0vp|(&=P+PPUNOYi#+Oypix?%uODL() zCGt1~oCRM$Blyh|$4zNXzYgP90X&;h>s#BuM?V%9GpcGv)MDe_&jwGepKPx5X3kvK ziOb{aWX+S|^j2v9Vo*rFvv*K#0ZwEl2N}WRTQgc6ffF?n^rYGW73+F#fC{8V!?cnG zJ+24)UZj<~e&%~Sq0g0G%DB<%)}*n|tu3G5UG<-vz0RvirPo&;;f4_x$L{^6bsYqm zh~eipyC}vVIHE>6+7NV@*2T1Jmlh71ebgEQ9N10lr?L){}Q8 z2NG9zOhu}f+p^i|@{zcP04K8AZ~p0rZk?-PAKMUgctzOxD0D9*Unaj9%u5bPL;_Kth!MLvyYOjW! z3(vSB#{oYSV(VMdyR`rV70aqJ%bjl2t59_}YbWdgO>NTf?XX}W64 z@8}diUy_#_QIcL;ts9m?G@_zVXx6-Qr*+58-`8`vVyKW3wsv2^|Gr(5yYM9lBU7M9 z{Uz*Yh+jr7phN4({mQct(iCZkw}e+_Lvi%SO488SC$9==coL??y~>mC%XdwAIkg#&HuR0z`*j7x~=i>|Nj*Fzx|d;x7Hlsc}X-j S;t<$oN%l4bFjp4;b^kAu%cVI0 delta 10610 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