From f8d6f87bf2d6f647aee96b5e97900ab66deeb917 Mon Sep 17 00:00:00 2001 From: ForsakenShell Date: Sat, 15 Aug 2015 20:53:23 -0600 Subject: [PATCH 1/4] Code optimizations Better sanity checks (debug only) Code beautification --- DLL_Project/Alerts/Alert_NeedBatteries.cs | 56 +-- .../Alerts/Alert_PlaceWorker_Restriction.cs | 76 +-- DLL_Project/Buildings/Building_Hydroponic.cs | 48 +- .../Building_SunLampHeatController.cs | 86 +++- DLL_Project/Commands/ChangeColor.cs | 61 +++ DLL_Project/Commands/CommandChangeColor.cs | 54 -- .../CommandGroupOfDefOrThingCompInRoom.cs | 83 ---- .../CommandGroupOfTouchingThingsByDef.cs | 82 --- .../CommandGroupOfTouchingThingsByLinker.cs | 82 --- ...CommandGroupOfTouchingThingsByThingComp.cs | 82 --- DLL_Project/Commands/Commands.cs | 11 +- DLL_Project/Commands/DefOrThingCompInRoom.cs | 94 ++++ DLL_Project/Commands/TouchingByDef.cs | 93 ++++ DLL_Project/Commands/TouchingByLinker.cs | 92 ++++ DLL_Project/Commands/TouchingByThingComp.cs | 94 ++++ DLL_Project/CommunityCoreLibrary.csproj | 32 +- .../CompProperties_ColoredLight.cs | 37 +- .../CompProperties_LowIdleDraw.cs | 38 +- .../RestrictedPlacement_Properties.cs | 27 +- DLL_Project/Defs/AdvancedResearchDef.cs | 213 +++++++- .../Defs/AdvancedResearchDefExtensions.cs | 34 -- DLL_Project/Defs/CCLVersionDef.cs | 23 +- DLL_Project/Defs/HelpCategoryDef.cs | 92 ++-- DLL_Project/Defs/HelpDef.cs | 38 +- DLL_Project/Enumerations/LowIdleDrawMode.cs | 12 + DLL_Project/Extensions/IntVec3_Extensions.cs | 28 ++ .../Extensions/ThingComp_Extensions.cs | 37 ++ DLL_Project/Extensions/ThingDef_Extensions.cs | 47 ++ .../Extensions/ThingWithComps_Extensions.cs | 27 + DLL_Project/Extensions/Thing_Extensions.cs | 465 ++++++++++++++++++ DLL_Project/ITabs/ModInit.cs | 21 +- .../MapComponents/MapComponent_Research.cs | 383 --------------- DLL_Project/MapComponents/ResearchControl.cs | 322 ++++++++++++ DLL_Project/MonoBehaviour/Controller.cs | 51 +- DLL_Project/OTabs/OTab_ModHelp.cs | 302 +++++++----- .../PlaceWorkers/PlaceWorker_NotOnTerrain.cs | 44 +- .../PlaceWorkers/PlaceWorker_NotOnThing.cs | 43 +- .../PlaceWorkers/PlaceWorker_OnlyOnSurface.cs | 33 +- .../PlaceWorkers/PlaceWorker_OnlyOnTerrain.cs | 44 +- .../PlaceWorkers/PlaceWorker_OnlyOnThing.cs | 56 ++- .../PlaceWorkers/PlaceWorker_OnlyUnderRoof.cs | 30 +- .../PlaceWorker_RestrictedCount.cs | 45 +- .../PlaceWorker_WallAttachment.cs | 34 +- DLL_Project/StaticClasses/CommonFunctions.cs | 54 +- DLL_Project/StaticClasses/Icons.cs | 28 +- DLL_Project/StaticClasses/LightColor.cs | 29 +- .../PlaceWorker_Restriction_Alert_Data.cs | 52 ++ DLL_Project/StaticClasses/Research.cs | 25 +- DLL_Project/StaticClasses/ThingGroup.cs | 335 ------------- DLL_Project/Structures/ColorName.cs | 20 + .../Structures/ResearchCompletePair.cs | 21 + DLL_Project/ThingComps/CompColoredLight.cs | 260 +++++----- .../ThingComps/CompHeatPusherPowered.cs | 125 +++-- DLL_Project/ThingComps/CompLifespanPowered.cs | 66 ++- .../ThingComps/CompNeighbourlyGrower.cs | 137 ++++-- .../ThingComps/CompPowerLowIdleDraw.cs | 259 ++++++---- DLL_Project/ThingComps/CompRefrigerated.cs | 114 +++-- .../ThingComps/RestrictedPlacement_Comp.cs | 89 ++-- DLL_Project/Toils/Toils_Common.cs | 21 +- .../Assemblies/Community Core Library.dll | Bin 60928 -> 0 bytes suggestions.csv | 1 + 61 files changed, 3014 insertions(+), 2274 deletions(-) create mode 100644 DLL_Project/Commands/ChangeColor.cs delete mode 100644 DLL_Project/Commands/CommandChangeColor.cs delete mode 100644 DLL_Project/Commands/CommandGroupOfDefOrThingCompInRoom.cs delete mode 100644 DLL_Project/Commands/CommandGroupOfTouchingThingsByDef.cs delete mode 100644 DLL_Project/Commands/CommandGroupOfTouchingThingsByLinker.cs delete mode 100644 DLL_Project/Commands/CommandGroupOfTouchingThingsByThingComp.cs create mode 100644 DLL_Project/Commands/DefOrThingCompInRoom.cs create mode 100644 DLL_Project/Commands/TouchingByDef.cs create mode 100644 DLL_Project/Commands/TouchingByLinker.cs create mode 100644 DLL_Project/Commands/TouchingByThingComp.cs delete mode 100644 DLL_Project/Defs/AdvancedResearchDefExtensions.cs create mode 100644 DLL_Project/Enumerations/LowIdleDrawMode.cs create mode 100644 DLL_Project/Extensions/IntVec3_Extensions.cs create mode 100644 DLL_Project/Extensions/ThingComp_Extensions.cs create mode 100644 DLL_Project/Extensions/ThingDef_Extensions.cs create mode 100644 DLL_Project/Extensions/ThingWithComps_Extensions.cs create mode 100644 DLL_Project/Extensions/Thing_Extensions.cs delete mode 100644 DLL_Project/MapComponents/MapComponent_Research.cs create mode 100644 DLL_Project/MapComponents/ResearchControl.cs create mode 100644 DLL_Project/StaticClasses/PlaceWorker_Restriction_Alert_Data.cs delete mode 100644 DLL_Project/StaticClasses/ThingGroup.cs create mode 100644 DLL_Project/Structures/ColorName.cs create mode 100644 DLL_Project/Structures/ResearchCompletePair.cs delete mode 100644 _Mod/Community Core Library/Assemblies/Community Core Library.dll diff --git a/DLL_Project/Alerts/Alert_NeedBatteries.cs b/DLL_Project/Alerts/Alert_NeedBatteries.cs index 77c7e98..572936e 100644 --- a/DLL_Project/Alerts/Alert_NeedBatteries.cs +++ b/DLL_Project/Alerts/Alert_NeedBatteries.cs @@ -1,67 +1,47 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; using RimWorld; -using UnityEngine; using Verse; -using Verse.AI; namespace CommunityCoreLibrary { public class Alert_NeedBatteries : RimWorld.Alert_NeedBatteries { - private bool CheckBuilding( Building b ) + + static bool CheckThing( Thing thing ) { - // Only check for power traders - var p = b.TryGetComp(); - if( p == null ) - return false; + var p = thing.TryGetComp< CompPowerTrader >(); + // Only check for power traders // That are connected to a power network - if( p.PowerNet == null ) - return false; - // Which aren't powered on - if( p.PowerOn == true ) - return false; - - // Which want to be powered on - if( p.DesirePowerOn == false ) - return false; + // But want to be powered on + return + ( p != null )&& + ( p.PowerNet != null )&& + ( !p.PowerOn )&& + ( p.DesirePowerOn ); - /* - // Batteries on network, don't worry about it for now - if( p.PowerNet.CurrentStoredEnergy() >= 1 ) - return false; - - // Where the network power is too low - var netEnergy = p.PowerNet.CurrentEnergyGainRate() / CompPower.WattsToWattDaysPerTick; - if( netEnergy > -p.EnergyOutputPerTick ) - return false; - */ - - // And return this building is under powered - return true; } - public override AlertReport Report + public override AlertReport Report { get { // Check for individual power trader which is low - var powerTraders = Find.ListerBuildings.allBuildingsColonist.FindAll( b => CheckBuilding( b ) == true ); + var powerTraders = Find.ListerBuildings.allBuildingsColonist.FindAll( CheckThing ); if( ( powerTraders != null )&& ( powerTraders.Count > 0 ) ) + { return AlertReport.CulpritIs( powerTraders.RandomElement() ); + } - // All trader's good - return (AlertReport) false; + // All power trader's good + return AlertReport.Inactive; } } } -} +} diff --git a/DLL_Project/Alerts/Alert_PlaceWorker_Restriction.cs b/DLL_Project/Alerts/Alert_PlaceWorker_Restriction.cs index dcee086..23533ef 100644 --- a/DLL_Project/Alerts/Alert_PlaceWorker_Restriction.cs +++ b/DLL_Project/Alerts/Alert_PlaceWorker_Restriction.cs @@ -1,91 +1,53 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Text; using RimWorld; -using UnityEngine; using Verse; -using Verse.AI; namespace CommunityCoreLibrary { - public static class PlaceWorker_Restriction_Alert_Data - { - private static List< Thing > destroyedThings; - public static List< Thing > DestroyedThings - { - get{ return destroyedThings; } - } - - private static int cooldownTicks; - - public static bool AlertPlayer - { - get{ return ( destroyedThings.Count > 0 ); } - } - - static PlaceWorker_Restriction_Alert_Data() - { - destroyedThings = new List(); - cooldownTicks = 0; - } - - public static void Cooldown( int ticks = 1 ) - { - cooldownTicks -= ticks; - if( ( cooldownTicks <= 0 )&& - ( destroyedThings.Count > 0 ) ) - destroyedThings.Clear(); - } - - public static void Add( Thing thing ) - { - destroyedThings.Add( thing ); - cooldownTicks = 250; - } - - } - public class Alert_PlaceWorker_Restriction : Alert_Critical { - public override AlertReport Report + + public override AlertReport Report { get { - // Alert the player if something got destroyed - if( PlaceWorker_Restriction_Alert_Data.AlertPlayer == false ) - return false; - - // Return the first or default instance as the culprit - return AlertReport.CulpritIs( PlaceWorker_Restriction_Alert_Data.DestroyedThings.FirstOrDefault() ); + // Alert the player that something got destroyed + return !PlaceWorker_Restriction_Alert_Data.AlertPlayer + ? AlertReport.Inactive + : AlertReport.CulpritIs( PlaceWorker_Restriction_Alert_Data.DestroyedThings.RandomElement() ); } } - public override string FullExplanation{ - get{ + public override string FullExplanation + { + get + { var msg = new StringBuilder(); msg.AppendLine( "AlertPlaceWorkerRestrictionSupportRemovedDesc".Translate() ); foreach( var t in PlaceWorker_Restriction_Alert_Data.DestroyedThings ) + { msg.AppendLine( " " + t.def.defName ); + } return msg.ToString(); } } - public override void AlertActiveUpdate() + + public override void AlertActiveUpdate() { - if( PlaceWorker_Restriction_Alert_Data.AlertPlayer == true ) + if( PlaceWorker_Restriction_Alert_Data.AlertPlayer ) { base.AlertActiveUpdate(); PlaceWorker_Restriction_Alert_Data.Cooldown(); } } - public Alert_PlaceWorker_Restriction() + public Alert_PlaceWorker_Restriction() { - this.baseLabel = "AlertPlaceWorkerRestrictionSupportRemovedLabel".Translate(); + baseLabel = "AlertPlaceWorkerRestrictionSupportRemovedLabel".Translate(); } } -} +} diff --git a/DLL_Project/Buildings/Building_Hydroponic.cs b/DLL_Project/Buildings/Building_Hydroponic.cs index 3f59bac..8c9b726 100644 --- a/DLL_Project/Buildings/Building_Hydroponic.cs +++ b/DLL_Project/Buildings/Building_Hydroponic.cs @@ -1,36 +1,40 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using RimWorld; -using UnityEngine; +using RimWorld; using Verse; -using Verse.AI; namespace CommunityCoreLibrary { public class Building_Hydroponic : Building_PlantGrower { - private CompPowerTrader compPower{ - get { return this.TryGetComp(); } - } - private List comps{ - get { return this.AllComps; } + + CompPowerTrader CompPowerTrader + { + get + { + return this.TryGetComp< CompPowerTrader >(); + } } - public override void TickRare() + public override void TickRare() { - // Building_PlantGrower does not call base.TickRare() so we have to do it here - for (int index = 0; index < this.comps.Count; ++index) - this.comps[index].CompTickRare(); - - if (this.compPower == null || this.compPower.PowerOn) + // Building_PlantGrower does not call base.TickRare() so do it here + for( int i = 0; i < AllComps.Count; ++i ) + { + AllComps[ i ].CompTickRare(); + } + + if( ( CompPowerTrader == null )|| + ( CompPowerTrader.PowerOn ) ) + { return; - foreach (Thing thing in this.PlantsOnMe) - thing.TakeDamage(new DamageInfo(DamageDefOf.Rotting, 4, (Thing) null, new BodyPartDamageInfo?(), (ThingDef) null)); + } + + foreach( var plant in PlantsOnMe ) + { + plant.TakeDamage( new DamageInfo( DamageDefOf.Rotting, 4, (Thing) null, new BodyPartDamageInfo?(), (ThingDef) null ) ); + } } + } -} +} diff --git a/DLL_Project/Buildings/Building_SunLampHeatController.cs b/DLL_Project/Buildings/Building_SunLampHeatController.cs index d1e79da..343dbf1 100644 --- a/DLL_Project/Buildings/Building_SunLampHeatController.cs +++ b/DLL_Project/Buildings/Building_SunLampHeatController.cs @@ -1,43 +1,70 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using RimWorld; using UnityEngine; using Verse; -using Verse.AI; -using Verse.Sound; namespace CommunityCoreLibrary { - internal class Building_SunLampHeatController : Building + + public class Building_SunLampHeatController : Building { - public CompTempControl compTempControl; - public CompPowerTrader compPowerTrader; - public override void SpawnSetup() + CompPowerTrader CompPowerTrader + { + get + { + return this.TryGetComp< CompPowerTrader >(); + } + } + + CompTempControl CompTempControl + { + get + { + return this.TryGetComp< CompTempControl >(); + } + } + +#if DEBUG + public override void SpawnSetup() { base.SpawnSetup(); - this.compTempControl = base.GetComp(); - this.compPowerTrader = base.GetComp(); + + // Validate power trade + if( CompPowerTrader == null ) + { + Log.Error( "Community Core Library :: Building_SunLampHeatController :: " + def.defName + " requires CompPowerTrader!" ); + return; + } + + // Validate temp control + if( CompTempControl == null ) + { + Log.Error( "Community Core Library :: Building_SunLampHeatController :: " + def.defName + " requires CompTempControl!" ); + return; + } } +#endif - public IEnumerable GrowableCells + public IEnumerable GrowableCells { get { - return GenRadial.RadialCellsAround( base.Position, this.def.specialDisplayRadius, true ); + return GenRadial.RadialCellsAround( Position, def.specialDisplayRadius, true ); } } - public override IEnumerable GetGizmos() + public override IEnumerable GetGizmos() { // Default gizmos - foreach( Gizmo curGizmo in base.GetGizmos() ) yield return curGizmo; + foreach( Gizmo curGizmo in base.GetGizmos() ) + yield return curGizmo; // Grow zone gizmo - Command_Action comActGrowZone = new Command_Action(); + var comActGrowZone = new Command_Action(); if( comActGrowZone != null ) { comActGrowZone.icon = Icon.GrowZone; @@ -55,20 +82,23 @@ public override IEnumerable GetGizmos() yield break; } - private void MakeMatchingGrowZone() + void MakeMatchingGrowZone() { - Designator_ZoneAdd_Growing designator = new Designator_ZoneAdd_Growing(); + var designator = new Designator_ZoneAdd_Growing(); designator.DesignateMultiCell( - from tempCell in this.GrowableCells + from tempCell in GrowableCells where designator.CanDesignateCell( tempCell ).Accepted select tempCell ); } - public override void TickRare() + public override void TickRare() { - if( this.compPowerTrader.PowerOn ) + var PowerTrader = CompPowerTrader; + if( PowerTrader.PowerOn ) { - float temperature = base.Position.GetTemperature(); + var TempControl = CompTempControl; + + float temperature = Position.GetTemperature(); float num; if( temperature < 20f ) { @@ -82,20 +112,22 @@ public override void TickRare() { num = Mathf.InverseLerp( 120f, 20f, temperature ); } - float energyLimit = this.compTempControl.props.energyPerSecond * num * 4.16666651f; - float num2 = GenTemperature.ControlTemperatureTempChange( base.Position, energyLimit, this.compTempControl.targetTemperature ); + float energyLimit = TempControl.props.energyPerSecond * num * 4.16666651f; + float num2 = GenTemperature.ControlTemperatureTempChange( Position, energyLimit, TempControl.targetTemperature ); bool flag = !Mathf.Approximately( num2, 0f ); if( flag ) { - base.Position.GetRoom().Temperature += num2; - this.compPowerTrader.PowerOutput = -this.compPowerTrader.props.basePowerConsumption; + Position.GetRoom().Temperature += num2; + PowerTrader.PowerOutput = -PowerTrader.props.basePowerConsumption; } else { - this.compPowerTrader.PowerOutput = -this.compPowerTrader.props.basePowerConsumption * this.compTempControl.props.lowPowerConsumptionFactor; + PowerTrader.PowerOutput = -PowerTrader.props.basePowerConsumption * PowerTrader.props.lowPowerConsumptionFactor; } - this.compTempControl.operatingAtHighPower = flag; + TempControl.operatingAtHighPower = flag; } } + } -} \ No newline at end of file + +} diff --git a/DLL_Project/Commands/ChangeColor.cs b/DLL_Project/Commands/ChangeColor.cs new file mode 100644 index 0000000..105ee65 --- /dev/null +++ b/DLL_Project/Commands/ChangeColor.cs @@ -0,0 +1,61 @@ +using System.Text; + +using RimWorld; +using UnityEngine; +using Verse; + +namespace CommunityCoreLibrary.Commands +{ + + public class ChangeColor : Command + { + + readonly CompColoredLight parentLight; + + public override string Desc + { + get + { + var stringBuilder = new StringBuilder(); + + stringBuilder.AppendFormat( + "CommandChangeColorDesc".Translate(), + parentLight.NextColorName(), + parentLight.PrevColorName() ); + + return stringBuilder.ToString(); + } + } + + public override SoundDef CurActivateSound + { + get + { + return SoundDefOf.Click; + } + } + + public ChangeColor( CompColoredLight light ) + { + parentLight = light; + icon = Icon.NextButton; + defaultLabel = "CommandChangeColorLabel".Translate(); + } + + public override void ProcessInput( Event ev ) + { + base.ProcessInput( ev ); + + if( ev.button == 0 ) + { + parentLight.IncrementColorIndex(); + } + else if( ev.button == 1 ) + { + parentLight.DecrementColorIndex(); + } + } + + } + +} diff --git a/DLL_Project/Commands/CommandChangeColor.cs b/DLL_Project/Commands/CommandChangeColor.cs deleted file mode 100644 index 2f36470..0000000 --- a/DLL_Project/Commands/CommandChangeColor.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using RimWorld; -using UnityEngine; -using Verse; -using Verse.AI; - -namespace CommunityCoreLibrary.Commands -{ - - public class CommandChangeColor : Command - { - private CompColoredLight _light; - - public override string Desc { - get { - var stringBuilder = new StringBuilder(); - stringBuilder.AppendFormat( - "CommandChangeColorDesc".Translate(), - _light.NextColorName(), - _light.PrevColorName() ); - return stringBuilder.ToString(); - } - } - - public override SoundDef CurActivateSound - { - get { - return SoundDefOf.Click; - } - } - - public CommandChangeColor( CompColoredLight light ) - { - _light = light; - icon = Icon.NextButton; - defaultLabel = "CommandChangeColorLabel".Translate(); - } - - public override void ProcessInput( Event ev ) { - base.ProcessInput( ev ); - - if( ev.button == 0 ) - _light.IncrementColorIndex(); - else if (ev.button == 1) - _light.DecrementColorIndex(); - } - } - -} - diff --git a/DLL_Project/Commands/CommandGroupOfDefOrThingCompInRoom.cs b/DLL_Project/Commands/CommandGroupOfDefOrThingCompInRoom.cs deleted file mode 100644 index 372e74f..0000000 --- a/DLL_Project/Commands/CommandGroupOfDefOrThingCompInRoom.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using RimWorld; -using UnityEngine; -using Verse; -using Verse.AI; - -namespace CommunityCoreLibrary.Commands -{ - - public class CommandGroupOfDefOrThingCompInRoom : Command - { - private Type parentType; - private Thing parentThing; - - public string ByDefLabel; - public string ByThingCompLabel; - public Action_OnThings ByDefAction = null; - public Action_OnThings ByThingCompAction = null; - - public override string Desc { - get { - bool addedTo = false; - StringBuilder stringBuilder = new StringBuilder(); - - if( ( ByDefAction != null )&&( parentThing.HasRoommateByDef() ) ) - { - stringBuilder.Append( ByDefLabel ); - addedTo = true; - } - - if( ( ByThingCompAction != null )&&( parentThing.HasRoommateByThingComp( parentType ) ) ) - { - if( addedTo == true ) - stringBuilder.AppendLine( ";" ); - stringBuilder.Append( ByThingCompLabel ); - } - return stringBuilder.ToString(); - } - } - - public override SoundDef CurActivateSound - { - get { - return SoundDefOf.Click; - } - } - - public CommandGroupOfDefOrThingCompInRoom ( - Thing parent, - Type RequiredType, - string label ) - { - parentThing = parent; - icon = Icon.NextButton; - - parentType = RequiredType; - - defaultLabel = label; - } - - public override void ProcessInput( Event ev ) { - base.ProcessInput( ev ); - - // Process a list of things by def or thingcomp in a room - if( !parentThing.Position.IsInRoom() ) - return; - - // Left click (if assigned) all in room - if( ( ByDefAction != null )&& - ( ev.button == 0 )&& - ( parentThing.HasRoommateByDef() ) ) - ByDefAction.Invoke( parentThing.GetGroupOfByDefInRoom() ); - else if( ( ByThingCompAction != null )&& - ( ev.button == 1 )&& - ( parentThing.HasRoommateByThingComp( parentType ) ) ) - ByThingCompAction.Invoke( parentThing.GetGroupOfByThingCompInRoom( parentType ) ); - } - } -} diff --git a/DLL_Project/Commands/CommandGroupOfTouchingThingsByDef.cs b/DLL_Project/Commands/CommandGroupOfTouchingThingsByDef.cs deleted file mode 100644 index 602127a..0000000 --- a/DLL_Project/Commands/CommandGroupOfTouchingThingsByDef.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using RimWorld; -using UnityEngine; -using Verse; -using Verse.AI; - -namespace CommunityCoreLibrary.Commands -{ - - public class CommandGroupOfTouchingThingsByDef : Command - { - - private Thing parentThing; - private Action_OnThings _laction = null; - private Action_OnThings _raction = null; - - public override string Desc { - get { - bool addedTo = false; - StringBuilder stringBuilder = new StringBuilder(); - - if( ( _laction != null )&&( parentThing.Position.IsInRoom() ) ) - { - stringBuilder.Append( "CommandGroupOfThingsLClick".Translate() ); - addedTo = true; - } - - if( _raction != null ) - { - if( addedTo == true ) - stringBuilder.AppendLine( ";" ); - stringBuilder.Append( "CommandGroupOfThingsRClick".Translate() ); - } - return stringBuilder.ToString(); - } - } - - public override SoundDef CurActivateSound - { - get { - return SoundDefOf.Click; - } - } - - public CommandGroupOfTouchingThingsByDef( Thing parent, Action_OnThings lAction = null, Action_OnThings rAction = null ) - { - parentThing = parent; - icon = Icon.NextButton; - - _laction = lAction; - _raction = rAction; - - defaultDesc = Desc; - - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendFormat( "CommandGroupOfThingsByDefLabel".Translate(), parent.def.label ); - defaultLabel = stringBuilder.ToString(); - } - - public override void ProcessInput( Event ev ) { - base.ProcessInput( ev ); - - // Process a list of touching things by def - if( !parentThing.HasTouchingByDef() ) - return; - - // Left click (if assigned) all in room - if( ( _laction != null )&& - ( ev.button == 0 )&& - ( parentThing.Position.IsInRoom() ) ) - _laction.Invoke( parentThing.GetGroupOfTouchingByDef( true ) ); - // right click (if assigned) all on map - else if( ( _raction != null )&& - ( ev.button == 1 ) ) - _raction.Invoke( parentThing.GetGroupOfTouchingByDef( false ) ); - } - } -} diff --git a/DLL_Project/Commands/CommandGroupOfTouchingThingsByLinker.cs b/DLL_Project/Commands/CommandGroupOfTouchingThingsByLinker.cs deleted file mode 100644 index a9fe220..0000000 --- a/DLL_Project/Commands/CommandGroupOfTouchingThingsByLinker.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using RimWorld; -using UnityEngine; -using Verse; -using Verse.AI; - -namespace CommunityCoreLibrary.Commands -{ - - public class CommandGroupOfTouchingThingsByLinker : Command - { - - private Thing parentThing; - private Action_OnThings _laction = null; - private Action_OnThings _raction = null; - - public override string Desc { - get { - bool addedTo = false; - StringBuilder stringBuilder = new StringBuilder(); - - if( ( _laction != null )&&( parentThing.Position.IsInRoom() ) ) - { - stringBuilder.Append( "CommandGroupOfThingsLClick".Translate() ); - addedTo = true; - } - - if( _raction != null ) - { - if( addedTo == true ) - stringBuilder.AppendLine( ";" ); - stringBuilder.Append( "CommandGroupOfThingsRClick".Translate() ); - } - return stringBuilder.ToString(); - } - } - - public override SoundDef CurActivateSound - { - get { - return SoundDefOf.Click; - } - } - - public CommandGroupOfTouchingThingsByLinker( Thing parent, Action_OnThings lAction = null, Action_OnThings rAction = null ) - { - parentThing = parent; - icon = Icon.NextButton; - - _laction = lAction; - _raction = rAction; - - defaultDesc = Desc; - - StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.AppendFormat( "CommandGroupOfThingsByLinkerLabel".Translate(), parent.def.label ); - defaultLabel = stringBuilder.ToString(); - } - - public override void ProcessInput( Event ev ) { - base.ProcessInput( ev ); - - // Process a list of touching things by def - if( !parentThing.HasTouchingByLinker() ) - return; - - // Left click (if assigned) all in room - if( ( _laction != null )&& - ( ev.button == 0 )&& - ( parentThing.Position.IsInRoom() ) ) - _laction.Invoke( parentThing.GetGroupOfTouchingByLinker( true ) ); - // right click (if assigned) all on map - else if( ( _raction != null )&& - ( ev.button == 1 ) ) - _raction.Invoke( parentThing.GetGroupOfTouchingByLinker( false ) ); - } - } -} diff --git a/DLL_Project/Commands/CommandGroupOfTouchingThingsByThingComp.cs b/DLL_Project/Commands/CommandGroupOfTouchingThingsByThingComp.cs deleted file mode 100644 index 6745fd8..0000000 --- a/DLL_Project/Commands/CommandGroupOfTouchingThingsByThingComp.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -using RimWorld; -using UnityEngine; -using Verse; -using Verse.AI; - -namespace CommunityCoreLibrary.Commands -{ - - public class CommandGroupOfTouchingThingsByThingComp : Command - { - - private Type parentType; - private Thing parentThing; - private Action_OnThings _laction = null; - private Action_OnThings _raction = null; - - public override string Desc { - get { - bool addedTo = false; - StringBuilder stringBuilder = new StringBuilder(); - - if( ( _laction != null )&&( parentThing.Position.IsInRoom() ) ) - { - stringBuilder.Append( "CommandGroupOfThingsLClick".Translate() ); - addedTo = true; - } - - if( _raction != null ) - { - if( addedTo == true ) - stringBuilder.Append( ";\n" ); - stringBuilder.Append( "CommandGroupOfThingsRClick".Translate() ); - } - return stringBuilder.ToString(); - } - } - - public override SoundDef CurActivateSound - { - get { - return SoundDefOf.Click; - } - } - - public CommandGroupOfTouchingThingsByThingComp( Thing parent, Type RequiredType, string label, Action_OnThings lAction = null, Action_OnThings rAction = null ) - { - parentThing = parent; - icon = Icon.NextButton; - - parentType = RequiredType; - - _laction = lAction; - _raction = rAction; - - defaultDesc = Desc; - defaultLabel = label; - } - - public override void ProcessInput( Event ev ) { - base.ProcessInput( ev ); - - // Process a list of touching things by def - if( !parentThing.HasTouchingByThingComp( parentType ) ) - return; - - // Left click (if assigned) all in room - if( ( _laction != null )&& - ( ev.button == 0 )&& - ( parentThing.Position.IsInRoom() )) - _laction.Invoke( parentThing.GetGroupOfTouchingByThingComp( parentType, true ) ); - // right click (if assigned) all on map - else if( ( _raction != null )&& - ( ev.button == 1 ) ) - _raction.Invoke( parentThing.GetGroupOfTouchingByThingComp( parentType, false ) ); - } - } -} diff --git a/DLL_Project/Commands/Commands.cs b/DLL_Project/Commands/Commands.cs index 5dc9be4..1c529da 100644 --- a/DLL_Project/Commands/Commands.cs +++ b/DLL_Project/Commands/Commands.cs @@ -1,17 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; -using RimWorld; -using UnityEngine; using Verse; -using Verse.AI; namespace CommunityCoreLibrary.Commands { - public delegate void Action_OnThings( List< Thing > things ); + public delegate void Action_OnThings( List< Thing > things ); } - diff --git a/DLL_Project/Commands/DefOrThingCompInRoom.cs b/DLL_Project/Commands/DefOrThingCompInRoom.cs new file mode 100644 index 0000000..a66bde5 --- /dev/null +++ b/DLL_Project/Commands/DefOrThingCompInRoom.cs @@ -0,0 +1,94 @@ +using System; +using System.Text; + +using RimWorld; +using UnityEngine; +using Verse; + +namespace CommunityCoreLibrary.Commands +{ + + public class DefOrThingCompInRoom : Command + { + + readonly Type parentType; + readonly Thing parentThing; + + public string LabelByDef; + public string LabelByThingComp; + public Action_OnThings ClickByDef; + public Action_OnThings ClickByThingComp; + + public override string Desc + { + get + { + var addedToOutput = false; + var stringBuilder = new StringBuilder(); + + if( ( ClickByDef != null )&& + ( parentThing.IsSameThingDefInRoom() ) ) + { + stringBuilder.Append( LabelByDef ); + addedToOutput = true; + } + + if( ( ClickByThingComp != null )&& + ( parentThing.IsSameThingCompInRoom( parentType ) ) ) + { + if( addedToOutput ) + { + stringBuilder.AppendLine( ";" ); + } + stringBuilder.Append( LabelByThingComp ); + } + return stringBuilder.ToString(); + } + } + + public override SoundDef CurActivateSound + { + get + { + return SoundDefOf.Click; + } + } + + public DefOrThingCompInRoom ( Thing parent, Type RequiredType, string label ) + { + parentThing = parent; + icon = Icon.NextButton; + + parentType = RequiredType; + + defaultLabel = label; + } + + public override void ProcessInput( Event ev ) + { + base.ProcessInput( ev ); + + // Process a list of things by def or thingcomp in a room + if( !parentThing.Position.IsInRoom() ) + { + return; + } + + // Left click (if assigned) all in room + if( ( ClickByDef != null )&& + ( ev.button == 0 )&& + ( parentThing.IsSameThingDefInRoom() ) ) + { + ClickByDef.Invoke( parentThing.ListSameThingDefInRoom() ); + } + else if( ( ClickByThingComp != null )&& + ( ev.button == 1 )&& + ( parentThing.IsSameThingCompInRoom( parentType ) ) ) + { + ClickByThingComp.Invoke( parentThing.ListSameThingCompInRoom( parentType ) ); + } + } + + } + +} diff --git a/DLL_Project/Commands/TouchingByDef.cs b/DLL_Project/Commands/TouchingByDef.cs new file mode 100644 index 0000000..8a67e0e --- /dev/null +++ b/DLL_Project/Commands/TouchingByDef.cs @@ -0,0 +1,93 @@ +using System.Text; + +using RimWorld; +using UnityEngine; +using Verse; + +namespace CommunityCoreLibrary.Commands +{ + + public class TouchingByDef : Command + { + + readonly Thing parentThing; + readonly Action_OnThings ClickLeft = null; + readonly Action_OnThings ClickRight = null; + + public override string Desc + { + get + { + var addedToOutput = false; + var stringBuilder = new StringBuilder(); + + if( ( ClickLeft != null )&& + ( parentThing.Position.IsInRoom() ) ) + { + stringBuilder.Append( "CommandGroupOfThingsLClick".Translate() ); + addedToOutput = true; + } + + if( ClickRight != null ) + { + if( addedToOutput ) + { + stringBuilder.AppendLine( ";" ); + } + stringBuilder.Append( "CommandGroupOfThingsRClick".Translate() ); + } + return stringBuilder.ToString(); + } + } + + public override SoundDef CurActivateSound + { + get + { + return SoundDefOf.Click; + } + } + + public TouchingByDef( Thing parent, Action_OnThings LeftClick = null, Action_OnThings RightClick = null ) + { + parentThing = parent; + icon = Icon.NextButton; + + ClickLeft = LeftClick; + ClickRight = RightClick; + + defaultDesc = Desc; + + var stringBuilder = new StringBuilder(); + stringBuilder.AppendFormat( "CommandGroupOfThingsByDefLabel".Translate(), parent.def.label ); + defaultLabel = stringBuilder.ToString(); + } + + public override void ProcessInput( Event ev ) + { + base.ProcessInput( ev ); + + // Process a list of touching things by def + if( !parentThing.IsSameThingDefTouching() ) + { + return; + } + + // Left click (if assigned) all in room + if( ( ClickLeft != null )&& + ( ev.button == 0 )&& + ( parentThing.Position.IsInRoom() ) ) + { + ClickLeft.Invoke( parentThing.ListSameThingDefTouching( true ) ); + } + // right click (if assigned) all on map + else if( ( ClickRight != null )&& + ( ev.button == 1 ) ) + { + ClickRight.Invoke( parentThing.ListSameThingDefTouching( false ) ); + } + } + + } + +} diff --git a/DLL_Project/Commands/TouchingByLinker.cs b/DLL_Project/Commands/TouchingByLinker.cs new file mode 100644 index 0000000..8551554 --- /dev/null +++ b/DLL_Project/Commands/TouchingByLinker.cs @@ -0,0 +1,92 @@ +using System.Text; + +using RimWorld; +using UnityEngine; +using Verse; + +namespace CommunityCoreLibrary.Commands +{ + + public class TouchingByLinker : Command + { + + readonly Thing parentThing; + readonly Action_OnThings ClickLeft = null; + readonly Action_OnThings ClickRight = null; + + public override string Desc + { + get + { + var addedToOutput = false; + var stringBuilder = new StringBuilder(); + + if( ( ClickLeft != null )&&( parentThing.Position.IsInRoom() ) ) + { + stringBuilder.Append( "CommandGroupOfThingsLClick".Translate() ); + addedToOutput = true; + } + + if( ClickRight != null ) + { + if( addedToOutput ) + { + stringBuilder.AppendLine( ";" ); + } + stringBuilder.Append( "CommandGroupOfThingsRClick".Translate() ); + } + return stringBuilder.ToString(); + } + } + + public override SoundDef CurActivateSound + { + get + { + return SoundDefOf.Click; + } + } + + public TouchingByLinker( Thing parent, Action_OnThings LeftClick = null, Action_OnThings RightClick = null ) + { + parentThing = parent; + icon = Icon.NextButton; + + ClickLeft = LeftClick; + ClickRight = RightClick; + + defaultDesc = Desc; + + var stringBuilder = new StringBuilder(); + stringBuilder.AppendFormat( "CommandGroupOfThingsByLinkerLabel".Translate(), parent.def.label ); + defaultLabel = stringBuilder.ToString(); + } + + public override void ProcessInput( Event ev ) + { + base.ProcessInput( ev ); + + // Process a list of touching things by def + if( !parentThing.IsSameGraphicLinkerTouching() ) + { + return; + } + + // Left click (if assigned) all in room + if( ( ClickLeft != null )&& + ( ev.button == 0 )&& + ( parentThing.Position.IsInRoom() ) ) + { + ClickLeft.Invoke( parentThing.ListSameGraphicLinkerTouching( true ) ); + } + // right click (if assigned) all on map + else if( ( ClickRight != null )&& + ( ev.button == 1 ) ) + { + ClickRight.Invoke( parentThing.ListSameGraphicLinkerTouching( false ) ); + } + } + + } + +} diff --git a/DLL_Project/Commands/TouchingByThingComp.cs b/DLL_Project/Commands/TouchingByThingComp.cs new file mode 100644 index 0000000..062d436 --- /dev/null +++ b/DLL_Project/Commands/TouchingByThingComp.cs @@ -0,0 +1,94 @@ +using System; +using System.Text; + +using RimWorld; +using UnityEngine; +using Verse; + +namespace CommunityCoreLibrary.Commands +{ + + public class TouchingByThingComp : Command + { + + readonly Type parentType; + readonly Thing parentThing; + readonly Action_OnThings ClickLeft = null; + readonly Action_OnThings ClickRight = null; + + public override string Desc + { + get + { + var addedToOutput = false; + var stringBuilder = new StringBuilder(); + + if( ( ClickLeft != null )&& + ( parentThing.Position.IsInRoom() ) ) + { + stringBuilder.Append( "CommandGroupOfThingsLClick".Translate() ); + addedToOutput = true; + } + + if( ClickRight != null ) + { + if( addedToOutput ) + { + stringBuilder.AppendLine( ";" ); + } + stringBuilder.Append( "CommandGroupOfThingsRClick".Translate() ); + } + return stringBuilder.ToString(); + } + } + + public override SoundDef CurActivateSound + { + get + { + return SoundDefOf.Click; + } + } + + public TouchingByThingComp( Thing parent, Type RequiredType, string label, Action_OnThings LeftClick = null, Action_OnThings RightClick = null ) + { + parentThing = parent; + icon = Icon.NextButton; + + parentType = RequiredType; + + ClickLeft = LeftClick; + ClickRight = RightClick; + + defaultDesc = Desc; + defaultLabel = label; + } + + public override void ProcessInput( Event ev ) + { + base.ProcessInput( ev ); + + // Process a list of touching things by def + if( !parentThing.IsSameThingCompTouching( parentType ) ) + { + return; + } + + // Left click (if assigned) all in room + if( ( ClickLeft != null )&& + ( ev.button == 0 )&& + ( parentThing.Position.IsInRoom() ) ) + { + ClickLeft.Invoke( parentThing.ListSameThingCompTouching( parentType, true ) ); + } + // right click (if assigned) all on map + else if( ( ClickRight != null )&& + ( ev.button == 1 ) ) + { + ClickRight.Invoke( parentThing.ListSameThingCompTouching( parentType, false ) ); + } + } + + } + +} diff --git a/DLL_Project/CommunityCoreLibrary.csproj b/DLL_Project/CommunityCoreLibrary.csproj index 7a6ea04..32e6e7d 100644 --- a/DLL_Project/CommunityCoreLibrary.csproj +++ b/DLL_Project/CommunityCoreLibrary.csproj @@ -50,7 +50,6 @@ - @@ -62,11 +61,8 @@ - - - @@ -74,15 +70,8 @@ - - - - - - - @@ -91,6 +80,24 @@ + + + + + + + + + + + + + + + + + + - - - - MakeArtilleryShells - 0 - - -
  • Mortars
  • -
  • Machining
  • -
    - - -
  • MakeArtilleryShell
  • -
    - - -
  • TableMachining
  • -
    - -
    - - \ No newline at end of file diff --git a/_Mod/Modders Resource/Community Core Library/About/About.xml b/_Mod/Modders Resource/Community Core Library/About/About.xml new file mode 100644 index 0000000..f70669e --- /dev/null +++ b/_Mod/Modders Resource/Community Core Library/About/About.xml @@ -0,0 +1,8 @@ + + + Community Core Library v0.11.5 + RimWorld CCL Team + https://ludeon.com/forums/index.php?topic=14172.0 + RimWorld Alpha 11d + Provides a common core set of library functions for modders as well as making the necessary core compatibility changes.\n\nThis is the modders build release, it has robust error checking to help you find problems with your CCL based mod. + \ No newline at end of file diff --git a/_Mod/Modders Resource/Community Core Library/Assemblies/Community Core Library.dll b/_Mod/Modders Resource/Community Core Library/Assemblies/Community Core Library.dll new file mode 100644 index 0000000000000000000000000000000000000000..de5182257c81df50565e86287f3cb940f24ba5f2 GIT binary patch literal 72192 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 + + + + + + + MakeArtilleryShells + 0 + + +
  • Mortars
  • +
  • Machining
  • +
    + + +
  • MakeArtilleryShell
  • +
    + + +
  • TableMachining
  • +
    + +
    + + + + PlantHops + 0 + + +
  • Brewing
  • +
    + + +
  • Ground
  • +
  • Hydroponic
  • +
    + + +
  • PlantHops
  • +
    + +
    + + + + PlantXerigium + 0 + + +
  • HospitalBed
  • +
    + + +
  • Ground
  • +
  • Hydroponic
  • +
    + + +
  • PlantXerigium
  • +
    + +
    + +
    \ No newline at end of file diff --git a/_Mod/Community Core Library/Defs/CCLVersionDefs/CCLVersion.xml b/_Mod/Modders Resource/Community Core Library/Defs/CCLVersionDefs/CCLVersion.xml similarity index 100% rename from _Mod/Community Core Library/Defs/CCLVersionDefs/CCLVersion.xml rename to _Mod/Modders Resource/Community Core Library/Defs/CCLVersionDefs/CCLVersion.xml diff --git a/_Mod/Community Core Library/Defs/HelpCategoryDefs/HelpCategoryDefs.xml b/_Mod/Modders Resource/Community Core Library/Defs/HelpCategoryDefs/HelpCategoryDefs.xml similarity index 83% rename from _Mod/Community Core Library/Defs/HelpCategoryDefs/HelpCategoryDefs.xml rename to _Mod/Modders Resource/Community Core Library/Defs/HelpCategoryDefs/HelpCategoryDefs.xml index ca4e7eb..a7b6559 100644 --- a/_Mod/Community Core Library/Defs/HelpCategoryDefs/HelpCategoryDefs.xml +++ b/_Mod/Modders Resource/Community Core Library/Defs/HelpCategoryDefs/HelpCategoryDefs.xml @@ -2,7 +2,7 @@ + + + + + ExclusiveTreeOne + 0 + + true + + +
  • ExclusiveTechOne
  • +
    + + +
  • ExclusiveTechTwo
  • +
    + +
    + + + + + ExclusiveTreeTwo + 0 + + true + + +
  • ExclusiveTechTwo
  • +
    + + +
  • ExclusiveTechOne
  • +
    + +
    + +
    \ No newline at end of file diff --git a/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/AdvancedResearchDefs/Advanced_Inclusive_Tech.xml b/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/AdvancedResearchDefs/Advanced_Inclusive_Tech.xml new file mode 100644 index 0000000..b427f84 --- /dev/null +++ b/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/AdvancedResearchDefs/Advanced_Inclusive_Tech.xml @@ -0,0 +1,71 @@ + + + + + + + + + InclusiveTreeOne + 0 + + +
  • ExclusiveTechOneTwo
  • +
    + + +
  • InclusiveTech
  • +
    + +
    + + + + + InclusiveTreeTwo + 0 + + +
  • ExclusiveTechTwoTwo
  • +
    + + +
  • InclusiveTech
  • +
    + +
    + +
    \ No newline at end of file diff --git a/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/CCLVersionDefs/CCLVersion.xml b/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/CCLVersionDefs/CCLVersion.xml new file mode 100644 index 0000000..f776005 --- /dev/null +++ b/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/CCLVersionDefs/CCLVersion.xml @@ -0,0 +1,18 @@ + + + + + + + ReplacingTechVersion + Modders Resource: Exclusive Tech + 0.11.5 + + + \ No newline at end of file diff --git a/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/ResearchProjectDefs/Research_Exclusive_Tech.xml b/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/ResearchProjectDefs/Research_Exclusive_Tech.xml new file mode 100644 index 0000000..4888ace --- /dev/null +++ b/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/ResearchProjectDefs/Research_Exclusive_Tech.xml @@ -0,0 +1,40 @@ + + + + + ExclusiveTechOne + + Researching this will prevent access to Exclusive Tree Two. + 1 + + + + + ExclusiveTechOneTwo + + Exclusive Tree Two is now inaccessible. Research this to enable the inclusive tech. + 1 + +
  • ExclusiveTechOne
  • +
    +
    + + + ExclusiveTechTwo + + Researching this will prevent access to Exclusive Tree One. + 1 + + + + + ExclusiveTechTwoTwo + + Exclusive Tree One is now inaccessible. Research this to enable the inclusive tech. + 1 + +
  • ExclusiveTechTwo
  • +
    +
    + +
    \ No newline at end of file diff --git a/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/ResearchProjectDefs/Research_Inclusive_Tech.xml b/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/ResearchProjectDefs/Research_Inclusive_Tech.xml new file mode 100644 index 0000000..acc267a --- /dev/null +++ b/_Mod/Modders Resource/Examples/Advanced Research/Advanced Tech/Defs/ResearchProjectDefs/Research_Inclusive_Tech.xml @@ -0,0 +1,24 @@ + + + + + InclusiveTech + + Either one of the Exclusive Trees are complete. + 1 + +
  • CommunityCoreLibraryResearchLocker
  • +
    +
    + + + InclusiveTechOne + + Inclusive Tree has been accessed. + 1 + +
  • InclusiveTech
  • +
    +
    + +
    \ No newline at end of file diff --git a/_Mod/Modders Resource/Advanced Research/Ancient Tech/About/About.xml b/_Mod/Modders Resource/Examples/Advanced Research/Ancient Tech/About/About.xml similarity index 84% rename from _Mod/Modders Resource/Advanced Research/Ancient Tech/About/About.xml rename to _Mod/Modders Resource/Examples/Advanced Research/Ancient Tech/About/About.xml index ac83081..f3a6456 100644 --- a/_Mod/Modders Resource/Advanced Research/Ancient Tech/About/About.xml +++ b/_Mod/Modders Resource/Examples/Advanced Research/Ancient Tech/About/About.xml @@ -3,7 +3,7 @@ Ancient Tech RimWorld CCL Team n/a - Community Core Library v0.11.2 + Community Core Library v0.11.5 This is an example of how to lock and unlock buildings as new research is complete. diff --git a/_Mod/Modders Resource/Advanced Research/Ancient Tech/Defs/AdvancedResearchDefs/Advanced_Ancient_Tech.xml b/_Mod/Modders Resource/Examples/Advanced Research/Ancient Tech/Defs/AdvancedResearchDefs/Advanced_Ancient_Tech.xml similarity index 56% rename from _Mod/Modders Resource/Advanced Research/Ancient Tech/Defs/AdvancedResearchDefs/Advanced_Ancient_Tech.xml rename to _Mod/Modders Resource/Examples/Advanced Research/Ancient Tech/Defs/AdvancedResearchDefs/Advanced_Ancient_Tech.xml index 6a267ac..6d4ff62 100644 --- a/_Mod/Modders Resource/Advanced Research/Ancient Tech/Defs/AdvancedResearchDefs/Advanced_Ancient_Tech.xml +++ b/_Mod/Modders Resource/Examples/Advanced Research/Ancient Tech/Defs/AdvancedResearchDefs/Advanced_Ancient_Tech.xml @@ -1,24 +1,31 @@  - + + + + MakeArtilleryShells + 0 + + +
  • Mortars
  • +
  • Machining
  • +
    + + +
  • MakeArtilleryShell
  • +
    + + +
  • TableMachining
  • +
    + +
    + + + + PlantHops + 0 + + +
  • Brewing
  • +
    + + +
  • Ground
  • +
  • Hydroponic
  • +
    + + +
  • PlantHops
  • +
    + +
    + + + + PlantXerigium + 0 + + +
  • HospitalBed
  • +
    + + +
  • Ground
  • +
  • Hydroponic
  • +
    + + +
  • PlantXerigium
  • +
    + +
    + +
    \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Defs/CCLVersionDefs/CCLVersion.xml b/_Mod/User Release/Community Core Library/Defs/CCLVersionDefs/CCLVersion.xml new file mode 100644 index 0000000..5373e79 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Defs/CCLVersionDefs/CCLVersion.xml @@ -0,0 +1,18 @@ + + + + + + + CCLVersion + Community Core Library + 0.11.5 + + + \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Defs/HelpCategoryDefs/HelpCategoryDefs.xml b/_Mod/User Release/Community Core Library/Defs/HelpCategoryDefs/HelpCategoryDefs.xml new file mode 100644 index 0000000..a7b6559 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Defs/HelpCategoryDefs/HelpCategoryDefs.xml @@ -0,0 +1,19 @@ + + + + + + + CCLGizmoHelp + Community Core Library + + + + \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Defs/HelpDefs/HelpDefs.xml b/_Mod/User Release/Community Core Library/Defs/HelpDefs/HelpDefs.xml new file mode 100644 index 0000000..dfffb1f --- /dev/null +++ b/_Mod/User Release/Community Core Library/Defs/HelpDefs/HelpDefs.xml @@ -0,0 +1,28 @@ + + + + + + + CCLColoredLights + CCLGizmoHelp + + Buildings which support colored lights will offer buttons to change the light color as well as share the color with other lights when the appropriate research is complete. + + + + CCLNeighbourlyGrowers + CCLGizmoHelp + + Hydroponics which are neighbourly growers support sharing the sowed plant with other neighbourly growers allowing you to set one building and then use a button to share it. + + + \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Defs/ResearchProjectDefs/Research_Locker.xml b/_Mod/User Release/Community Core Library/Defs/ResearchProjectDefs/Research_Locker.xml new file mode 100644 index 0000000..1434027 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Defs/ResearchProjectDefs/Research_Locker.xml @@ -0,0 +1,15 @@ + + + + + CommunityCoreLibraryResearchLocker + + This should never be seen. + How did it come to this? + 1 + +
  • CommunityCoreLibraryResearchLocker
  • +
    +
    + +
    \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Lights.xml b/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Lights.xml new file mode 100644 index 0000000..e4e7867 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Lights.xml @@ -0,0 +1,208 @@ + + + + + Building + Building + BulletImpactMetal + true + MapMeshAndRealTime + Light + Repair + true + BuildingRubble + + + + StandingLamp + + Building + Building + + Things/Building/Furniture/LampStanding + Graphic_Single + + 0.3 + 0.3 + 0.6 + (0,0,-0.1) + + + Waist + PassThroughOnly + + 50 + 115 + 1.0 + + true + Standing lamp that lights an area. + + 15 + + false + BulletImpactMetal + +
  • + CompPowerTrader + 150 + false + PowerOnSmall + PowerOffSmall +
  • +
  • + CompGlower + 12 + (217,217,208,0) +
  • +
  • + CommunityCoreLibrary.CompColoredLight +
  • +
    + Furniture + false + L +
    + + + StandingLamp_Red + + Building + Building + + Things/Building/Furniture/LampStanding + Graphic_Single + + 0.3 + 0.3 + 0.6 + (0,0,-0.1) + + + Waist + PassThroughOnly + + 50 + 130 + 1.0 + + true + Standing lamp that lights an area in red. + + 15 + + false + +
  • + CompPowerTrader + 150 + false + PowerOnSmall + PowerOffSmall +
  • +
  • + CompGlower + 12 + (217,0,0,0) +
  • +
    + None + false + CommunityCoreLibraryResearchLocker +
    + + + StandingLamp_Green + + Building + Building + + Things/Building/Furniture/LampStanding + Graphic_Single + + 0.3 + 0.3 + 0.6 + (0,0,-0.1) + + + Waist + PassThroughOnly + + 50 + 130 + 1.0 + + true + Standing lamp that lights an area in green. + + 15 + + false + +
  • + CompPowerTrader + 150 + false + PowerOnSmall + PowerOffSmall +
  • +
  • + CompGlower + 12 + (0,217,0,0) +
  • +
    + None + false + CommunityCoreLibraryResearchLocker +
    + + + StandingLamp_Blue + + Building + Building + + Things/Building/Furniture/LampStanding + Graphic_Single + + 0.3 + 0.3 + 0.6 + (0,0,-0.1) + + + Waist + PassThroughOnly + + 50 + 130 + 1.0 + + true + Standing lamp that lights an area in blue. + + 15 + + false + +
  • + CompPowerTrader + 150 + false + PowerOnSmall + PowerOffSmall +
  • +
  • + CompGlower + 12 + (0,0,217,0) +
  • +
    + None + false + CommunityCoreLibraryResearchLocker +
    + +
    \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Power.xml b/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Power.xml new file mode 100644 index 0000000..ea72844 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Power.xml @@ -0,0 +1,71 @@ + + + + + Building + BulletImpactMetal + true + MapMeshAndRealTime + Light + Repair + true + BuildingRubble + + + + GeothermalGenerator + + Building_PowerPlantSteam + + Things/Building/Power/GeothermalPlant + Graphic_Single + (6,6) + + BuildingTall + Impassable + true + 1 + true + + 500 + 6000 + 1.0 + -40 + + Normal + Produces electricity from geothermal steam geysers. Must be placed on a geyser. + (6,6) + + 400 + + +
  • + CompPowerTrader + -3600 + true + false +
  • +
  • + CommunityCoreLibrary.RestrictedPlacement_Comp + +
  • SteamGeyser
  • + + +
    + false + Heavy + Power + 1.0 + +
  • CommunityCoreLibrary.PlaceWorker_OnlyOnThing
  • +
    + + GeothermalPlant_Ambience + true + + ConstructMetal + G + GeothermalPower +
    + +
    \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Production.xml b/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Production.xml new file mode 100644 index 0000000..4d79654 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Production.xml @@ -0,0 +1,500 @@ + + + + + Building + BulletImpactMetal + true + MapMeshAndRealTime + Light + Repair + true + BuildingRubble + + + + NutrientPasteDispenser + + Building_NutrientPasteDispenser + + Things/Building/Production/NutrientDispenser + Graphic_Single + (3,4) + + BuildingTall + Impassable + true + 1 + + 2200 + 350 + 1.0 + + Synthesizes nutrient paste from organic feedstocks. It consumes less ingredients and time than any other meal production method - but nobody likes eating nutrient paste. + + true + true + 6 + DispensePaste + + Normal + +
  • + CompPowerTrader + true + 200 +
  • +
  • + CommunityCoreLibrary.CompPowerLowIdleDraw + 0.25 + WhenNear +
  • +
    + (3,4) + + 90 + + true + (0,0,3) + true + Heavy + Production + 0.75 + ConstructMetal + N +
    + + + TableTailor + + Building_WorkTable + A workbench equipped for cloth refinement and clothing production. + + Things/Building/Production/TableTailor + Graphic_Single + (3,1) + + 75 + + 50 + + +
  • Metallic
  • +
  • Woody
  • +
    + Waist + 0.5 + True + + 2500 + 180 + 1.0 + + (3,1) + Production + PassThroughOnly + 70 + True + (0,0,-1) + Item + +
  • ITab_Bills
  • +
    + + BillsTab + + Normal + +
  • + CompPowerTrader + true + 120 + PowerOnSmall + PowerOffSmall +
  • +
  • + CommunityCoreLibrary.CompPowerLowIdleDraw +
  • +
    + P +
    + + + TableSmithing + + Building_WorkTable + A workbench equipped for weapons and tools production. + + Things/Building/Production/TableSmithing + Graphic_Single + (3,1) + + + 40 + 100 + + ConstructWood + Waist + 0.5 + True + + 3000 + 180 + 1.0 + + (3,1) + Production + PassThroughOnly + 70 + True + (0,0,-1) + Item + +
  • ITab_Bills
  • +
    + + BillsTab + + Normal + +
  • + CompPowerTrader + true + 210 + PowerOnSmall + PowerOffSmall +
  • +
  • + CommunityCoreLibrary.CompPowerLowIdleDraw +
  • +
  • + CompGlower + 3 + (217,112,33,0) +
  • +
    + M +
    + + + TableMachining + + Building_WorkTable + A table and tools for assembling and disassembling machine components like mechanoids bodies and ammunition. + + Things/Building/Production/TableMachining + Graphic_Single + (3,1) + + + 150 + + Waist + 0.5 + True + + 3000 + 180 + 1.0 + + (3,1) + Production + PassThroughOnly + 70 + True + (0,0,-1) + Item + +
  • ButcherCorpseMechanoid
  • +
  • MakeArtilleryShell
  • +
    + +
  • ITab_Bills
  • +
    + +
  • + CompPowerTrader + true + 350 + PowerOnSmall + PowerOffSmall +
  • +
  • + CommunityCoreLibrary.CompPowerLowIdleDraw +
  • +
  • + CompGlower + 5 + (73,123,138,0) +
  • +
    + + BillsTab + + Normal + ConstructMetal + Machining + I +
    + + + CookStove + + Building_WorkTable_HeatPush + A simple stove and attached countertop for preparing meals. + + Things/Building/Production/TableCookStove + Graphic_Single + (3,1) + + ConstructMetal + + 90 + + Waist + 0.5 + True + + 2000 + 180 + 1.0 + + (3,1) + Production + PassThroughOnly + 70 + True + (0,0,-1) + Item + +
  • CookMealSimple
  • +
  • CookMealFine
  • +
  • CookMealLavish
  • +
    + +
  • ITab_Bills
  • +
    + +
  • + CompPowerTrader + true + 350 + PowerOnSmall + PowerOffSmall +
  • +
  • + CommunityCoreLibrary.CompPowerLowIdleDraw +
  • +
  • + CompGlower + 3 + (217,112,33,0) +
  • +
    + + true + BillsTab + 0.25 + + Normal + O +
    + + + ElectricSmelter + + Building_WorkTable_HeatPush + Extracts usable metal from slag chunks and other mixed metal items. Consumes a lot of power. + + Things/Building/Production/ElectricSmelter + Graphic_Single + (3,1) + + ConstructMetal + + 170 + + Waist + 0.5 + True + + 3500 + 180 + 1.0 + + (3,1) + Production + PassThroughOnly + 70 + True + (0,0,-1) + Item + +
  • ExtractMetalFromSlag
  • +
  • SmeltWeapon
  • +
    + +
  • ITab_Bills
  • +
    + +
  • + CompPowerTrader + 700 + true +
  • +
  • + CommunityCoreLibrary.CompPowerLowIdleDraw +
  • +
  • + CompGlower + 6 + (217,112,33,0) +
  • +
  • + CommunityCoreLibrary.CompHeatPusherPowered + 12 + 1500 +
  • +
    + + BillsTab + 0.5 + + Normal + ElectricSmelting + L +
    + + + Crematorium + + Building_WorkTable_HeatPush + Cremates corpses. + + Things/Building/Production/Crematorium + Graphic_Single + CutoutComplex + (3,2) + + +
  • Stony
  • +
    + 150 + + 20 + + Waist + True + + 4500 + 300 + 0 + + (3,2) + Production + 1 + Impassable + True + (0,0,-1) + Item + +
  • CremateCorpse
  • +
  • BurnApparel
  • +
    + +
  • ITab_Bills
  • +
    + +
  • + CompPowerTrader + 250 + true + PowerOnSmall + PowerOffSmall +
  • +
  • + CommunityCoreLibrary.CompPowerLowIdleDraw +
  • +
  • + CompGlower + 6 + (217,112,33,0) +
  • +
  • + CommunityCoreLibrary.CompHeatPusherPowered + 15 + 1000 +
  • +
    + + BillsTab + 0.6 + + Normal + Cremation + K +
    + + + + + HydroponicsBasin + + CommunityCoreLibrary.Building_Hydroponic + + Things/Building/Production/HydroponicsBasin + Graphic_Single + (1,4) + + FloorEmplacement + PassThroughOnly + 60 + true + ConstructMetal + + 2800 + 180 + 1.0 + + For growing food. Hydroponics basins grow a few plants quickly. The basin requires power to work, and plants will die if power is cut. + (1,4) + + 100 + + +
  • ITab_Growing
  • +
    + 1.7 + + PlantPotato + true + Hydroponic + + Rare + +
  • + CompForbiddable +
  • +
  • + CompPowerTrader + 100 +
  • +
  • + CommunityCoreLibrary.CompPowerLowIdleDraw + 0.50 + Cycle + 5000 + 2500 +
  • +
  • + CommunityCoreLibrary.CompNeighbourlyGrower +
  • +
    + Hydroponics + Heavy + Production + + Y +
    + +
    \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Structure.xml b/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Structure.xml new file mode 100644 index 0000000..e879039 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Defs/ThingDefs/Buildings_Structure.xml @@ -0,0 +1,106 @@ + + + + + Building + BulletImpactMetal + true + MapMeshAndRealTime + Light + Repair + true + BuildingRubble + + + + Building_Door + Blueprint_Door + Building + + Things/Building/Door/Door_Blueprint + + DoorMoveable + 1 + true + +
  • Metallic
  • +
  • Woody
  • +
  • Stony
  • +
    + + 250 + 1.0 + + false + true + Normal + false + BulletImpactMetal + Light + Structure + true + 1.0 + true + RealtimeOnly + + DoorOpenPowered + DoorClosePowered + DoorOpenManual + DoorCloseManual + true + true + + +
  • + CompForbiddable +
  • +
    +
    + + + Door + + Divides rooms. Must be manually opened and closed, which slows people down. + + 850 + + + Things/Building/Door/DoorSimple_Mover + Graphic_Single + + Things/Building/Door/DoorSimple_MenuIcon + 25 + P + + + + Autodoor + + Divides rooms. Powered operation allows people to move through the door without slowing down. + + 1100 + + + Things/Building/Door/Autodoor_Mover + Graphic_Single + + Things/Building/Door/Autodoor_MenuIcon + + 40 + + 25 + +
  • + CompPowerTrader + 100 +
  • +
  • + CommunityCoreLibrary.CompPowerLowIdleDraw + 0.1 + WhenNear +
  • +
    + O +
    + +
    \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Defs/ThingDefs/CCL_Init.xml b/_Mod/User Release/Community Core Library/Defs/ThingDefs/CCL_Init.xml new file mode 100644 index 0000000..6d1d04f --- /dev/null +++ b/_Mod/User Release/Community Core Library/Defs/ThingDefs/CCL_Init.xml @@ -0,0 +1,15 @@ + + + + + CCLInit + Building + true + + Thing + +
  • CommunityCoreLibrary.ModInit
  • +
    +
    + +
    \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Languages/English/Keyed/Colors.xml b/_Mod/User Release/Community Core Library/Languages/English/Keyed/Colors.xml new file mode 100644 index 0000000..67b1222 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Languages/English/Keyed/Colors.xml @@ -0,0 +1,13 @@ + + + + + white + red + green + blue + yellow + orange + purple + + \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Languages/English/Keyed/PlaceWorkers.xml b/_Mod/User Release/Community Core Library/Languages/English/Keyed/PlaceWorkers.xml new file mode 100644 index 0000000..5148d97 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Languages/English/Keyed/PlaceWorkers.xml @@ -0,0 +1,14 @@ + + + + + Must be placed on an item surface! + Must be placed under a roof! + Must place against a supporting structure! + Can not have more than: + You can not place that on + You can not place that here! + A support was removed! + Something has been destroyed because it's support has been removed or destroyed!\n\nThe following things have been destroyed because their supports are missing: + + \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Languages/English/Keyed/UI_Elements.xml b/_Mod/User Release/Community Core Library/Languages/English/Keyed/UI_Elements.xml new file mode 100644 index 0000000..49b241f --- /dev/null +++ b/_Mod/User Release/Community Core Library/Languages/English/Keyed/UI_Elements.xml @@ -0,0 +1,33 @@ + + + + + + Color: + + Change color + LClick - {0};\nRClick - {1} + + Syncronize colorable lights in room + LClick - Only {0} + RClick - All lights + + Syncronize all touching plant growers + Syncronize plant growers in room + LClick - Only {0} + RClick - All growers + + LClick - In room + RClick - On map + + Syncronize all touching {0} + Syncronize all linked {0} + + Syncronize all {0} in room + Syncronize all linked {0} in room + + Mod Help + No help defs found + + + \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Languages/French/Keyed/Colors.xml b/_Mod/User Release/Community Core Library/Languages/French/Keyed/Colors.xml new file mode 100644 index 0000000..98f2c7d --- /dev/null +++ b/_Mod/User Release/Community Core Library/Languages/French/Keyed/Colors.xml @@ -0,0 +1,13 @@ + + + + + blanc + rouge + vert + bleu + jaune + orange + mauve + + \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Languages/French/Keyed/PlaceWorkers.xml b/_Mod/User Release/Community Core Library/Languages/French/Keyed/PlaceWorkers.xml new file mode 100644 index 0000000..a6c2c43 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Languages/French/Keyed/PlaceWorkers.xml @@ -0,0 +1,14 @@ + + + + + Doit être placé en surface! + Doit être placé sous un toit! + Doit être placé contre une structure portante! + Impossible d'en avoir plus de: + Impossible de placer par dessus + Impossible à placer ici + Un support a été enlevé! + Quelque chose a été cassé car son support a été enlevé ou detruit!\n\nLes objets suivant ont été détruit à cause d'un support manquant: + + \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Languages/French/Keyed/UI_Elements.xml b/_Mod/User Release/Community Core Library/Languages/French/Keyed/UI_Elements.xml new file mode 100644 index 0000000..4f00f76 --- /dev/null +++ b/_Mod/User Release/Community Core Library/Languages/French/Keyed/UI_Elements.xml @@ -0,0 +1,29 @@ + + + + + + Couleur: + + Changer couleur + ClicGauche - {0};\nClicDroit - {1} + + Synchoniser les lampes colorées de la pièce + ClicG - Seulement {0} + ClicD - Toutes les lampes + + Synchroniser tous les bassins adjacents + Synchroniser tous les bassins dans la pièce + ClicG - Seulement {0} + ClicD - Tous les bassins + + ClicG - Dans la pièce + ClicD - Sur la carte + + Synchroniser tous les {0} adjacents + Synchroniser tous les {0} + + Synchroniser tous les {0} de la pièce + Synchroniser tous les {0} liés de la pièce + + \ No newline at end of file diff --git a/_Mod/User Release/Community Core Library/Textures/UI/HelpMenu/ArrowDown.png b/_Mod/User Release/Community Core Library/Textures/UI/HelpMenu/ArrowDown.png new file mode 100644 index 0000000000000000000000000000000000000000..d3a2984be84b125f1868f08e1c3a1f74892c1d57 GIT binary patch literal 19593 zcmeI43piBkzsHxI+({SRq&+T`WX#3PFw+>9aSaJ0bYEtcF=1w!nR00-5>f3W6%kvt zOSx5)5(-HdA+@_wb|I-vr&PM(tU=2p?f>k(|L2_Nf1X*-Gv?=gf4}ehuFrc}zqRIh zR{Wxc4(ck?RR91`cXG7#fWI}xA0-9&?~mR6ApE7wck~qkfa*l?M-E8cKNSE}+&Fal zqD28b5lOcH)<*sSv*cn^;$33^%w@fZ_vs}3-(cD=nauQ$_zQg7SU}Y~C znVvG+6UdYYR@E^5T7X4pVAY(BPj3N{>F@WgmjjmW*42{BOaxF9p*UM0U_Ovrzj&)1 z;DZGw`8!vUfqQ5G>*Ve42%IXE78v{DD><3`L*=5)#vc70N}AGqM^?iQ#d_xzCvVh-@#d3 z@&PMUGuQTP^Dh`@bsEU*c;Ma57qhWDu(SC7{kGQDdkd;;mV(#3H}tV9SC)JC27QR2 ze(rhu`}rpZQTXLi4)X7Rue|=op3S99dRC8 z87MDDo!1tEAIMvl*`G_Ce+9sA`W##8fZH8a;BN7o+G%?6QM2ir?GLKnV2N<436nF^ zZU|0Ix7bcP(0(H)VBCWQ8vQc1{Ml4R)2bk>N%cjWljg?CNz9s)dbw&j)zeQb&K*+{ z|CU*QGDLntlwG+pNj}5|1kySfEJWZH$_CC8jmK^!m8`epYLKeee0i(Bsrkr4!=ncnakkUm*d!m)6%9YPGwIEnR-0M<;b*K+ooM+V9jtZQrh>8 z+sE_rF)A|pNh|T1%AN窹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 R!uLl@74oKZU6#!IRIaKPB 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 JuC?!`e*uEbdRPDe literal 0 HcmV?d00001 diff --git a/_Mod/User Release/Community Core Library/Textures/UI/Icons/Commands/GroupButton.png b/_Mod/User Release/Community Core Library/Textures/UI/Icons/Commands/GroupButton.png new file mode 100644 index 0000000000000000000000000000000000000000..9d6cbb48a10f1999ab179f6beaae79631637902d GIT binary patch literal 4166 zcmV-M5V`M(P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000GXNklxV z{76hlG@2MMNR$`@H|h;hgI9uHK#T_Cg|L7SCnMlU*+SQ`wPW2*IsG{2yk2lx&t}`v zuIt*a|Kv@2dfuLs=Xaj>d7t-rPbDD)t64Tyxf%c(02%-q02%-q02%;Ruk6MCK$4_# z-P;fJSdJe7h=fbh~KocH?R-?e==oARbOK7fPapk|^Uz=0XV)(KJA_ z-EG_M?r=CcIg zM6bq~z8WWTMIjbcK|&HbT6{8fI}uH*WetJ_)R!?nu+zt;0YAPT_p$|*$dJPL`52Rz z=Fn7q-Z@P*W;HcA3XGd^La77*0D1@fYtO0^PMsG)?CHb63i*qf%iuY4-Jh@LU0LVBO~OP&4AMUVB1N5=Hj zoFW1LTfAujt+Hmx?w1{3k)f(1dKJvjb*oTQjS{L%?R)X*0IH zvQCn0QYpsU%(4D>C5$g8fX%>L0KNPDwx%v;-j158Gkf#DQktD3QMv3DAKdP1WT; zKOfUAbNs1VEQz&ep8lqNo#YFAcPCSfoSe+0Vuyj}fM7bVhb4(o;8@L+#1`lv;Bk0m z5qQj(H|+oO!z4ypNWcj2kvY!y8d^3zovvj7tb1aOBs+6ElQN!UVsJKd_<<$JjZg(z z$`I%Wb^xs3-I}-4t>5n;41rmiIzg3bDFF5Xv~;_(m6=?TKYT8`O8v?Vfb|8yzde7x zKXXIP6fSgg`AWS2Xa{x!_#bY`+iCh*JoE97N@jPJ0I&y;9bTC=y`KCYFp^E`expiN zDu5jTZCjcswCI@&C9ED$R{(Ycd4nH-o-#6ZdMdTDt0aJ30Br@_KRJ`F+Nu<}T~+M> z)&s2ot()=#NX=ydgs5Vb0$?kEyUl^!BNrF~*)(^m-T?FgcmvLYos6_$9Rl^|0p4}4 zf}Je;2hMr}5CCWn6b2x>vzPYNB>?9lTidcjvIfoi1F+cMzN;uufEjuG`J`L zXN#Q45@nYDI!yJg1|vfXdeX=r1Z|QP(&oAYF#JuJv+rCN*S^1v0ATq6et5-bwMvr** z>usX%;M&ah7pm3Hr2xpzc-$+FUb2Gl23%GEGb^1BEGGb~o&-)>LD(FUfkbSz0I;UZ zM}Zk6V$}>_Io}k`#0l%7NL@()IqhluZElsT0iXe(0iXe(0iXe373<#t07=WiKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000GXNklxV z{76hlG@2MMNR$`@H|h;hgI9uHK#T_Cg|L7SCnMlU*+SQ`wPW2*IsG{2yk2lx&t}`v zuIt*a|Kv@2dfuLs=Xaj>d7t-rPbDD)t64Tyxf%c(02%-q02%-q02%;Ruk6MCK$4_# z-P;fJSdJe7h=fbh~KocH?R-?e==oARbOK7fPapk|^Uz=0XV)(KJA_ z-EG_M?r=CcIg zM6bq~z8WWTMIjbcK|&HbT6{8fI}uH*WetJ_)R!?nu+zt;0YAPT_p$|*$dJPL`52Rz z=Fn7q-Z@P*W;HcA3XGd^La77*0D1@fYtO0^PMsG)?CHb63i*qf%iuY4-Jh@LU0LVBO~OP&4AMUVB1N5=Hj zoFW1LTfAujt+Hmx?w1{3k)f(1dKJvjb*oTQjS{L%?R)X*0IH zvQCn0QYpsU%(4D>C5$g8fX%>L0KNPDwx%v;-j158Gkf#DQktD3QMv3DAKdP1WT; zKOfUAbNs1VEQz&ep8lqNo#YFAcPCSfoSe+0Vuyj}fM7bVhb4(o;8@L+#1`lv;Bk0m z5qQj(H|+oO!z4ypNWcj2kvY!y8d^3zovvj7tb1aOBs+6ElQN!UVsJKd_<<$JjZg(z z$`I%Wb^xs3-I}-4t>5n;41rmiIzg3bDFF5Xv~;_(m6=?TKYT8`O8v?Vfb|8yzde7x zKXXIP6fSgg`AWS2Xa{x!_#bY`+iCh*JoE97N@jPJ0I&y;9bTC=y`KCYFp^E`expiN zDu5jTZCjcswCI@&C9ED$R{(Ycd4nH-o-#6ZdMdTDt0aJ30Br@_KRJ`F+Nu<}T~+M> z)&s2ot()=#NX=ydgs5Vb0$?kEyUl^!BNrF~*)(^m-T?FgcmvLYos6_$9Rl^|0p4}4 zf}Je;2hMr}5CCWn6b2x>vzPYNB>?9lTidcjvIfoi1F+cMzN;uufEjuG`J`L zXN#Q45@nYDI!yJg1|vfXdeX=r1Z|QP(&oAYF#JuJv+rCN*S^1v0ATq6et5-bwMvr** z>usX%;M&ah7pm3Hr2xpzc-$+FUb2Gl23%GEGb^1BEGGb~o&-)>LD(FUfkbSz0I;UZ zM}Zk6V$}>_Io}k`#0l%7NL@()IqhluZElsT0iXe(0iXe(0iXe373<#t07=WiKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000GXNklxV z{76hlG@2MMNR$`@H|h;hgI9uHK#T_Cg|L7SCnMlU*+SQ`wPW2*IsG{2yk2lx&t}`v zuIt*a|Kv@2dfuLs=Xaj>d7t-rPbDD)t64Tyxf%c(02%-q02%-q02%;Ruk6MCK$4_# z-P;fJSdJe7h=fbh~KocH?R-?e==oARbOK7fPapk|^Uz=0XV)(KJA_ z-EG_M?r=CcIg zM6bq~z8WWTMIjbcK|&HbT6{8fI}uH*WetJ_)R!?nu+zt;0YAPT_p$|*$dJPL`52Rz z=Fn7q-Z@P*W;HcA3XGd^La77*0D1@fYtO0^PMsG)?CHb63i*qf%iuY4-Jh@LU0LVBO~OP&4AMUVB1N5=Hj zoFW1LTfAujt+Hmx?w1{3k)f(1dKJvjb*oTQjS{L%?R)X*0IH zvQCn0QYpsU%(4D>C5$g8fX%>L0KNPDwx%v;-j158Gkf#DQktD3QMv3DAKdP1WT; zKOfUAbNs1VEQz&ep8lqNo#YFAcPCSfoSe+0Vuyj}fM7bVhb4(o;8@L+#1`lv;Bk0m z5qQj(H|+oO!z4ypNWcj2kvY!y8d^3zovvj7tb1aOBs+6ElQN!UVsJKd_<<$JjZg(z z$`I%Wb^xs3-I}-4t>5n;41rmiIzg3bDFF5Xv~;_(m6=?TKYT8`O8v?Vfb|8yzde7x zKXXIP6fSgg`AWS2Xa{x!_#bY`+iCh*JoE97N@jPJ0I&y;9bTC=y`KCYFp^E`expiN zDu5jTZCjcswCI@&C9ED$R{(Ycd4nH-o-#6ZdMdTDt0aJ30Br@_KRJ`F+Nu<}T~+M> z)&s2ot()=#NX=ydgs5Vb0$?kEyUl^!BNrF~*)(^m-T?FgcmvLYos6_$9Rl^|0p4}4 zf}Je;2hMr}5CCWn6b2x>vzPYNB>?9lTidcjvIfoi1F+cMzN;uufEjuG`J`L zXN#Q45@nYDI!yJg1|vfXdeX=r1Z|QP(&oAYF#JuJv+rCN*S^1v0ATq6et5-bwMvr** z>usX%;M&ah7pm3Hr2xpzc-$+FUb2Gl23%GEGb^1BEGGb~o&-)>LD(FUfkbSz0I;UZ zM}Zk6V$}>_Io}k`#0l%7NL@()IqhluZElsT0iXe(0iXe(0iXe373<#t07=WiKLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z000GXNklxV z{76hlG@2MMNR$`@H|h;hgI9uHK#T_Cg|L7SCnMlU*+SQ`wPW2*IsG{2yk2lx&t}`v zuIt*a|Kv@2dfuLs=Xaj>d7t-rPbDD)t64Tyxf%c(02%-q02%-q02%;Ruk6MCK$4_# z-P;fJSdJe7h=fbh~KocH?R-?e==oARbOK7fPapk|^Uz=0XV)(KJA_ z-EG_M?r=CcIg zM6bq~z8WWTMIjbcK|&HbT6{8fI}uH*WetJ_)R!?nu+zt;0YAPT_p$|*$dJPL`52Rz z=Fn7q-Z@P*W;HcA3XGd^La77*0D1@fYtO0^PMsG)?CHb63i*qf%iuY4-Jh@LU0LVBO~OP&4AMUVB1N5=Hj zoFW1LTfAujt+Hmx?w1{3k)f(1dKJvjb*oTQjS{L%?R)X*0IH zvQCn0QYpsU%(4D>C5$g8fX%>L0KNPDwx%v;-j158Gkf#DQktD3QMv3DAKdP1WT; zKOfUAbNs1VEQz&ep8lqNo#YFAcPCSfoSe+0Vuyj}fM7bVhb4(o;8@L+#1`lv;Bk0m z5qQj(H|+oO!z4ypNWcj2kvY!y8d^3zovvj7tb1aOBs+6ElQN!UVsJKd_<<$JjZg(z z$`I%Wb^xs3-I}-4t>5n;41rmiIzg3bDFF5Xv~;_(m6=?TKYT8`O8v?Vfb|8yzde7x zKXXIP6fSgg`AWS2Xa{x!_#bY`+iCh*JoE97N@jPJ0I&y;9bTC=y`KCYFp^E`expiN zDu5jTZCjcswCI@&C9ED$R{(Ycd4nH-o-#6ZdMdTDt0aJ30Br@_KRJ`F+Nu<}T~+M> z)&s2ot()=#NX=ydgs5Vb0$?kEyUl^!BNrF~*)(^m-T?FgcmvLYos6_$9Rl^|0p4}4 zf}Je;2hMr}5CCWn6b2x>vzPYNB>?9lTidcjvIfoi1F+cMzN;uufEjuG`J`L zXN#Q45@nYDI!yJg1|vfXdeX=r1Z|QP(&oAYF#JuJv+rCN*S^1v0ATq6et5-bwMvr** z>usX%;M&ah7pm3Hr2xpzc-$+FUb2Gl23%GEGb^1BEGGb~o&-)>LD(FUfkbSz0I;UZ zM}Zk6V$}>_Io}k`#0l%7NL@()IqhluZElsT0iXe(0iXe(0iXe373<#t07=Wi