From 96c9799c174a0dcbca97d9909f61ae18515111e9 Mon Sep 17 00:00:00 2001 From: Fasteroid <29342750+Fasteroid@users.noreply.github.com> Date: Fri, 22 Dec 2023 22:13:50 -0500 Subject: [PATCH] move to wire extras --- lua/entities/gmod_wire_ledtape.lua | 340 ++++++++++++++++++ lua/weapons/gmod_tool/stools/wire_ledtape.lua | 188 ++++++++++ materials/fasteroid/elwire.vmt | 8 + materials/fasteroid/elwire.vtf | Bin 0 -> 11120 bytes materials/fasteroid/elwire_sprite.vmt | 7 + materials/fasteroid/elwire_sprite.vtf | Bin 0 -> 22024 bytes materials/fasteroid/ledtape01.vmt | 8 + materials/fasteroid/ledtape01.vtf | Bin 0 -> 4224 bytes materials/fasteroid/ledtape01_sprite.vmt | 8 + materials/fasteroid/ledtape01_sprite.vtf | Bin 0 -> 8320 bytes materials/fasteroid/ledtape02.vmt | 5 + materials/fasteroid/ledtape02.vtf | Bin 0 -> 8320 bytes materials/fasteroid/ledtape02_sprite.vmt | 8 + materials/fasteroid/ledtape02_sprite.vtf | Bin 0 -> 22024 bytes 14 files changed, 572 insertions(+) create mode 100644 lua/entities/gmod_wire_ledtape.lua create mode 100644 lua/weapons/gmod_tool/stools/wire_ledtape.lua create mode 100644 materials/fasteroid/elwire.vmt create mode 100644 materials/fasteroid/elwire.vtf create mode 100644 materials/fasteroid/elwire_sprite.vmt create mode 100644 materials/fasteroid/elwire_sprite.vtf create mode 100644 materials/fasteroid/ledtape01.vmt create mode 100644 materials/fasteroid/ledtape01.vtf create mode 100644 materials/fasteroid/ledtape01_sprite.vmt create mode 100644 materials/fasteroid/ledtape01_sprite.vtf create mode 100644 materials/fasteroid/ledtape02.vmt create mode 100644 materials/fasteroid/ledtape02.vtf create mode 100644 materials/fasteroid/ledtape02_sprite.vmt create mode 100644 materials/fasteroid/ledtape02_sprite.vtf diff --git a/lua/entities/gmod_wire_ledtape.lua b/lua/entities/gmod_wire_ledtape.lua new file mode 100644 index 00000000..43fb23cf --- /dev/null +++ b/lua/entities/gmod_wire_ledtape.lua @@ -0,0 +1,340 @@ +AddCSLuaFile() +DEFINE_BASECLASS( "base_wire_entity" ) +ENT.PrintName = "Wire LED Tape Controller" +ENT.WireDebugName = "LED Tape" + +function ENT:SharedInit() + self.Color = Color(255,255,255) + self.Path = {} +end + +Wire_LEDTape = Wire_LEDTape or {} + +Wire_LEDTape.MaxPoints = 256 +Wire_LEDTape.NumBits = math.ceil( math.log(Wire_LEDTape.MaxPoints, 2) ) + +if CLIENT then + + --[[ + name = tooltip to display in the spawnmenu ........................ (required) + sprite = path to 3x width sprite material ........................... (optional) + scale = scaled texture height divided by original texture height ... (required with sprite) + backlit = draw fullbright base texture even when using a sprite? ..... (optional) + connect = connect the beams in the sprite texture? ................... (optional) + ]]-- + + Wire_LEDTape.materialData = { + ["fasteroid/ledtape01"] = { + name = "5050 Sparse", + sprite = "fasteroid/ledtape01_sprite", + scale = 512 / 904 + }, + ["fasteroid/ledtape02"] = { + name = "5050 Dense", + sprite = "fasteroid/ledtape02_sprite", + scale = 512 / 434 + }, + ["cable/white"] = { + name = "White Cable" + }, + ["arrowire/arrowire2"] = { + name = "Glowing Arrows", + }, + ["fasteroid/elwire"] = { + name = "Electroluminescent Wire", + sprite = "fasteroid/elwire_sprite", + scale = 256 / 2048, + backlit = true + }, + } + + local DEFAULT_SCALE = 0.5 + + local LIGHT_UPDATE_INTERVAL = CreateClientConVar( "wire_ledtape_lightinterval", "0.5", true, false, "How often environmental lighting on LED tape is calculated", 0 ) + + local LIGHT_DIRECTIONS = { + Vector(1,0,0), + Vector(-1,0,0), + Vector(0,1,0), + Vector(0,-1,0), + Vector(0,0,1), + Vector(0,0,-1) + } + + local function getLitNodeColor(node) + if not node.lighting or node.nextlight < CurTime() then + local lightsum = Vector() + local pos = node[1]:LocalToWorld( node[2] ) + for _, dir in ipairs(LIGHT_DIRECTIONS) do + lightsum:Add( render.ComputeLighting(pos, dir) ) + end + lightsum:Mul( 1 / #LIGHT_DIRECTIONS ) + node.lighting = lightsum:ToColor() + node.nextlight = CurTime() + LIGHT_UPDATE_INTERVAL:GetFloat() + end + return node.lighting + end + + + -- This system prevents calling LocalToWorld hundreds of times every frame, as it strains the garbage collector. + -- This is a necessary evil to prevent stuttering. + local LocalToWorld_NoGarbage_Ents = {} + + local function LocalToWorld_NoGarbage(ent, pos) + ent.LEDTapeVecs = ent.LEDTapeVecs or {} + local LEDTapeVecs = ent.LEDTapeVecs + + if ent.LEDTapeLastPos == ent:GetPos() and ent.LEDTapeLastAng == ent:GetAngles() and LEDTapeVecs[pos] then + return LEDTapeVecs[pos] + end + + LEDTapeVecs[pos] = ent:LocalToWorld(pos) + LocalToWorld_NoGarbage_Ents[ent] = true -- update positions at the end + + return LEDTapeVecs[pos] + end + + local function LocalToWorld_NoGarbage_End() + for ent, _ in pairs(LocalToWorld_NoGarbage_Ents) do + if not IsValid(ent) then continue end + ent.LEDTapeLastPos = ent:GetPos() + ent.LEDTapeLastAng = ent:GetAngles() + end + LocalToWorld_NoGarbage_Ents = {} + end + + hook.Add("PostDrawOpaqueRenderables","LEDTapeCleanup",LocalToWorld_NoGarbage_End) + + local function DrawBeams(width, scrollmul, mater, path, getColor, extravertex) + + if not IsValid(path[1][1]) then return end + + local scroll = 0 + local beam = render.AddBeam + + local beam2 = extravertex and beam or function() end -- branchless programming ftw + local vertexnum = extravertex and 3 or 2 + + scrollmul = scrollmul / width -- scale this + + render.SetMaterial(mater) + render.StartBeam(#path * vertexnum) + + local node1 = path[1] + + local pt1 = LocalToWorld_NoGarbage(node1[1], node1[2]) + + beam(pt1, width, scroll, getColor(node1)) + + for i = 2, #path do + local node2 = path[i] + local nodeEnt = node2[1] + if not IsValid(nodeEnt) then continue end + local nodeOffset = node2[2] + + local pt2 = LocalToWorld_NoGarbage(nodeEnt, nodeOffset) + local distance = pt2:Distance(pt1) * scrollmul * 0.5 + + beam( pt1, width, scroll, getColor(node1)) + scroll = scroll + distance + beam( pt2, width, scroll, getColor(node2)) + beam2( pt2, width, scroll, getColor(node2)) -- add another point if extravertex is set, prevents some sprites from looking yucky + + pt1 = pt2 + node1 = node2 + end + + beam(pt1, width, scroll, getColor(node1)) + + render.EndBeam() + return pt1 + end + + function Wire_LEDTape.DrawShaded(width, scrollmul, mater, path) + return DrawBeams(width, scrollmul, mater, path, getLitNodeColor) + end + + function Wire_LEDTape.DrawFullbright(width, scrollmul, color, mater, path, extravert) + return DrawBeams(width, scrollmul, mater, path, function(node) return color end, extravert) + end + + function ENT:Initialize() + + self:SharedInit() + self.ScrollMul = DEFAULT_SCALE + + if CLIENT then + + net.Start("LEDTapeData") + net.WriteEntity(self) + net.WriteBool(true) -- request full update + net.SendToServer() + + local DrawShaded = Wire_LEDTape.DrawShaded + local DrawFullbright = Wire_LEDTape.DrawFullbright + hook.Add("PostDrawOpaqueRenderables", self, function() + + if #self.Path < 2 then return end + + if self.SpriteMaterial then + + if self.Backlit then + DrawFullbright(self.Width, self.ScrollMul / 3, self.Color, self.BaseMaterial, self.Path, false) + else + DrawShaded(self.Width, self.ScrollMul / 3, self.BaseMaterial, self.Path) + end + + DrawFullbright(self.Width * 3, self.ScrollMul, self.Color, self.SpriteMaterial, self.Path, not self.Connect) + + else + DrawFullbright(self.Width, self.ScrollMul, self.Color, self.BaseMaterial, self.Path) + end + + end) + end + + self:SetOverlayText("LED Tape Controller") + + end + + function ENT:Think() + self.Color.r = self:GetNW2Int("LedTape_R") + self.Color.g = self:GetNW2Int("LedTape_G") + self.Color.b = self:GetNW2Int("LedTape_B") + end + + net.Receive("LEDTapeData", function() + + local controller = net.ReadEntity() + if not IsValid(controller) then return end + + local full = net.ReadBool() + + controller.Width = net.ReadFloat() + local mater = net.ReadString() + + controller.BaseMaterial = Material( mater ) + + local metadata = Wire_LEDTape.materialData[mater] + + if metadata then + controller.SpriteMaterial = metadata.sprite and Material( metadata.sprite ) + controller.ScrollMul = metadata.scale or DEFAULT_SCALE + controller.Connect = metadata.connect or false + controller.Backlit = metadata.backlit or false + end + + if not full then return end + + local pathLength = net.ReadUInt(Wire_LEDTape.NumBits) + 1 + for i = 1, pathLength do + table.insert(controller.Path,{net.ReadEntity(), net.ReadVector()}) + end + + controller:SetOverlayText("LED Tape Controller\n(" .. (pathLength-1) .. " Segments)") + + end ) + +end + + +if SERVER then + + util.AddNetworkString("LEDTapeData") + net.Receive("LEDTapeData", function(len, ply) + local controller = net.ReadEntity() + local full = net.ReadBool() + if not IsValid(controller) then return end + table.insert(controller.DownloadQueue, {ply = ply, full = full}) + end ) + + function ENT:Initialize() + BaseClass.Initialize(self) + WireLib.CreateInputs(self, { + "Color [VECTOR]" + }) + self:SharedInit() + self.DownloadQueue = {} + end + + function ENT:SendMaterialUpdate() + net.WriteFloat ( self.Width ) + net.WriteString ( self.BaseMaterial ) + end + + function ENT:SendFullUpdate() + self:SendMaterialUpdate() + net.WriteUInt(#self.Path - 1, Wire_LEDTape.NumBits) + for k, node in ipairs(self.Path) do + net.WriteEntity(node[1]) + net.WriteVector(node[2]) + end + end + + function ENT:Think() + + if self.BaseMaterial and self.Width and self.Path then -- don't send updates with nil stuff! + for _, request in ipairs(self.DownloadQueue) do + net.Start("LEDTapeData") + + net.WriteEntity( self ) + net.WriteBool(request.full) + + if request.full then self:SendFullUpdate() + else self:SendMaterialUpdate() end + + net.Send(request.ply) + end + self.DownloadQueue = {} + end + + BaseClass.Think( self ) + self:NextThink(CurTime() + 0.05) + return true + end + + -- duplicator support + function ENT:BuildDupeInfo() + local info = BaseClass.BuildDupeInfo(self) or {} + info.BaseMaterial = self.BaseMaterial + info.Width = self.Width + info.Path = {} + for k, node in ipairs(self.Path) do + info.Path[k] = {node[1]:EntIndex(), node[2]} + end + return info + end + + function ENT:ApplyDupeInfo(ply, ent, info, GetEntByID) + BaseClass.ApplyDupeInfo(self, ply, ent, info, GetEntByID) + self.BaseMaterial = info.BaseMaterial + self.Width = info.Width + self.Path = {} + for k, node in ipairs(info.Path) do + self.Path[k] = { GetEntByID(node[1], game.GetWorld()), node[2] } + end + end + duplicator.RegisterEntityClass("gmod_wire_ledtape", WireLib.MakeWireEnt, "Data") + + function ENT:TriggerInput(iname, value) + if (iname == "Color") then + self:SetNW2Int("LedTape_R", value[1]) + self:SetNW2Int("LedTape_G", value[2]) + self:SetNW2Int("LedTape_B", value[3]) + end + end + + function MakeWireLEDTapeController( pl, Pos, Ang, model, path, width, material ) + local controller = WireLib.MakeWireEnt(pl, {Class = "gmod_wire_ledtape", Pos = Pos, Angle = Ang, Model = model}) + if not IsValid(controller) then return end + + controller.Path = path + controller.Width = math.Clamp(width,0.1,4) + controller.BaseMaterial = material + + return controller + end + +end + + diff --git a/lua/weapons/gmod_tool/stools/wire_ledtape.lua b/lua/weapons/gmod_tool/stools/wire_ledtape.lua new file mode 100644 index 00000000..4ba247f0 --- /dev/null +++ b/lua/weapons/gmod_tool/stools/wire_ledtape.lua @@ -0,0 +1,188 @@ +WireToolSetup.setCategory( "Visuals" ) +WireToolSetup.open( "ledtape", "LED Tape", "gmod_wire_ledtape", nil, "LED Tape Controllers" ) +WireToolSetup.BaseLang() +WireToolSetup.SetupMax(8) + +--[[ + I would have used the original wirepath system, but it looks like it was never designed for a tool like this. + So we're stuck with whatever horribleness I come up with. Sorry. + - Fast +]]-- + +TOOL.ClientConVar = { + material = "cable/white", + width = "1", + model = "models/beer/wiremod/hydraulic.mdl", + modelsize = "" +} + +TOOL.ToolPath = {} +TOOL.CurWidth = 1 +TOOL.Scale = 1 + +function TOOL:GetConVars() + return self:GetClientInfo("material") or "cable/rope", self:GetClientNumber("width", 3) +end + +local function isLookingAtController(trace) + return trace.Entity and trace.Entity:GetClass() == "gmod_wire_ledtape" +end + +if CLIENT then + + language.Add( "Tool.wire_ledtape.name", "LED Tape Tool (Wire)" ) + language.Add( "Tool.wire_ledtape.desc", "Makes a group of ropes with controllable color" ) + language.Add( "Tool.wire_ledtape.width", "Width:" ) + language.Add( "Tool.wire_ledtape.material", "Material:" ) + TOOL.Information = { + { name = "right_0", stage = 0, text = "Start LED Tape" }, + { name = "left_0", stage = 0, text = "Update material of existing controller" }, + { name = "right_1", stage = 1, text = "Place another point" }, + { name = "left_2", stage = 2, text = "Finish tape and place controller" }, + { name = "right_2", stage = 2, text = "Place more points" }, + { name = "left_3", stage = 3, text = "Finish tape and place controller" }, + } + + for _, data in ipairs(TOOL.Information) do -- needed for wire extras, not sure why + language.Add( "Tool.wire_ledtape." .. data.name, data.text ) + end + + WireToolSetup.setToolMenuIcon( "icon16/chart_line.png" ) + + local YELLOW = Color(255,255,0) -- it wastes memory and strains the garbage collector + + function TOOL:Holster() + self.ToolPath = {} + self:ReleaseGhostEntity() + end + + function TOOL:Preview() + + if #self.ToolPath < 1 then hook.Remove("PostDrawOpaqueRenderables","LEDTape_Preview") return end -- something happened, bail + + render.SetMaterial(self.CurMater) + + local pt2 = Wire_LEDTape.DrawFullbright(self.CurWidth, self.ScrollMul / 3, color_white, self.CurMater, self.ToolPath) + + if pt2 and (#self.ToolPath + 1 < Wire_LEDTape.MaxPoints) then + local eyetrace = LocalPlayer():GetEyeTrace() + local pt3 = eyetrace.HitPos + eyetrace.HitNormal * self.CurWidth * 0.5 + render.DrawLine( pt2, pt3, YELLOW ) + end + + end + +end + +if SERVER then + + function TOOL:MakeEnt(ply, model, Ang, trace) + local material, width = self:GetConVars() + return MakeWireLEDTapeController(ply, trace.HitPos, Ang, model, self.ToolPath, width, material) + end + + function TOOL:Holster() + self:SetStage(0) + self.ToolPath = {} + end + +end + +function TOOL:RightClick( trace ) + + if not trace.Hit or ( trace.Entity:IsValid() and trace.Entity:IsPlayer() ) or trace.Entity:IsWorld() then return end + if ( SERVER and not util.IsValidPhysicsObject( trace.Entity, trace.PhysicsBone ) ) then return false end + + local mater, width = self:GetConVars() + + if self:GetStage() == 3 then return false end + + if self:GetStage() == 0 then + self.ToolPath = {} + + self:SetStage(1) + + self.CurMater = Material and Material(mater) or mater -- material on client, string on server + self.CurWidth = width + + if CLIENT then + + hook.Add("PostDrawOpaqueRenderables","LEDTape_Preview", function() self:Preview() end) + + local metadata = Wire_LEDTape.materialData[mater] + self.ScrollMul = metadata and metadata.scale or 1 + + end + end + + local nextPos = trace.Entity:WorldToLocal(trace.HitPos + trace.HitNormal * self.CurWidth * 0.5) + + if #self.ToolPath > 0 then + local prevPoint = self.ToolPath[ #self.ToolPath ] + if prevPoint[1] == trace.Entity and prevPoint[2]:IsEqualTol( nextPos, 0.1 ) then -- disallow placing the same point + return false + end + end + + table.insert(self.ToolPath, {trace.Entity, nextPos}) + + if #self.ToolPath == 1 then + self:SetStage(2) + elseif #self.ToolPath == Wire_LEDTape.MaxPoints then + self:SetStage(3) + end + + return true + +end + +function TOOL:LeftClick( trace ) + + if self:GetStage() == 0 and isLookingAtController(trace) then + if CLIENT then return true end -- only server + local controller = trace.Entity + controller.BaseMaterial = self:GetConVars() + for _, ply in ipairs(player.GetHumans()) do + table.insert(controller.DownloadQueue, {ply = ply, full = false}) + end + return true + end + + if self:GetStage() < 1 or isLookingAtController(trace) then return false end + + local ply = self:GetOwner() + self:SetStage(0) + + if SERVER then + local controller = self:LeftClick_Make(trace, ply) + if isbool(controller) then return controller end + self:LeftClick_PostMake(controller, ply, trace) + end + + self.ToolPath = {} + + return true + +end + +-- I just wanted to match the vanilla look, not write a horrible hacky workaround! +local function emptyRopeMaterialPanel(panel) + table.Empty(panel.Controls) + for k, v in ipairs( panel.List:GetItems() ) do v:Remove() end +end + +function TOOL.BuildCPanel(panel) + + WireToolHelpers.MakeModelSizer(panel, "wire_ledtape_modelsize") + WireDermaExts.ModelSelect(panel, "wire_ledtape_model", list.Get( "Wire_Hydraulic_Models" ), 1, true) + + panel:NumSlider("#Tool.wire_ledtape.width","wire_ledtape_width",0,4,2) + local ropeMaterials = panel:AddControl( "RopeMaterial", { Label = "#Tool.wire_ledtape.material", convar = "wire_ledtape_material" } ) + + emptyRopeMaterialPanel(ropeMaterials) -- remove garry's materials + + for texpath, data in pairs( Wire_LEDTape.materialData ) do -- add mine + ropeMaterials:AddMaterial(data.name, texpath) + end + +end \ No newline at end of file diff --git a/materials/fasteroid/elwire.vmt b/materials/fasteroid/elwire.vmt new file mode 100644 index 00000000..0cabe2d1 --- /dev/null +++ b/materials/fasteroid/elwire.vmt @@ -0,0 +1,8 @@ +"Cable" +{ + "$basetexture" "fasteroid/elwire" + "$vertexcolor" 1 + $alphatest 1 + $alphatestreference .5 + $allowalphatocoverage 1 +} \ No newline at end of file diff --git a/materials/fasteroid/elwire.vtf b/materials/fasteroid/elwire.vtf new file mode 100644 index 0000000000000000000000000000000000000000..60c4632c853f3aaca169d1e6ef5276a31786fbec GIT binary patch literal 11120 zcmds74Nz3q6~6E7FS_flmMs!Bg6xl(qKH3KE9in#!m69@=z<$c&9Y!Lp(>S`6#oh= z+Js3pyA%+O8iTPj#nzxUOj-*r@uxCqL?<{HIug})0DkMxhQ(Cq*$82U8 z@d;;X@?Rl~m`sV3oLYzuy*pKsdGgej$4SAe*Y)|*h=*u&s_xJkd-$AVGS?j2? z*pE0Cc6HB;>0)F4L4A1WSawPTG)kpOdY}&(Lxs@b$oE_$q+B&eQ$v>6)hTv$bQU3I zbB39YWkU7P@O}n}KR&_LlYRV+90|%hbm+{P6J+rXwV~8EJ}ouX-}u|okkTnv_qY7z zN~ZM8g$p}|6_0vM1@brk26=h+`Vwb$Z(X8Pu9;IVTu{5Vt!7di&ObFZ&F}oh^J}vv zz>r`3h7eUtYU(9H3akD6)bxpW5~XPwmQDWT^XL0_$&s#U%=grYXG31za)0BQUA1c` z)UKW{WhVknzva4zNas}ac`ki~Xgu3c-)A;e@cnfUil z?oM9!1vGq~9Ee^dYy`AndGs;m|C=qTJQ(}@6z+K!iW)94mMI#GU4!y-bDzEZe%aM= zEpPrZl+wS=OFVV+W)HK*u3OT@*|*7LF+Xekz09xE+Rr4-rL;-15Dykn><4r^asp;>+XnPptob7h6L{*WmsY$wTDATW|m2 zymZGEN^QywwxmUTd3^p!<=-U+=S0IEHR2a(%3J{sLdouevm zp(K}0Xs-JG){cYYU)hrHe%A8&&%Z}PGc7Mpa8ufpo}0BOF}%CR*j6;@sxc=5)+598 zwDI%h3vaE<6tB!)h4$D`RI;Ok*s3%(yB6&=*P8pxQ7Kc;@E zl(Sb$M%s#}jh_L30Oz^z6!;r(H>zF|Tlv2DM-7zPm2$b_ZT|W^ZTa2Aus6HW8H)Q6 z!V^)aYU+Zh>7~=qA2&6fN_^JxFENb{SxK3U^9Lfi{2t5X%{?<7@{xe<;$328fN-5skts|L@#GXU-3c{~&cJmhbG^Sn+V5DY@Y zelrk%z5Vf26ylWqSt-Evy53M!NQG9rrda^z86isw3aG#F{Qd-Ayd%W%Dj<6MoAC^O zk2L&QHCW)5K>M11w)llZ`vv9Uet8fU>0l(U9-y?o*9G$$l;^FuvW+&hV|jUhnu5lnmzMGD>WiBR zNm;h+vCq#y$1gg{)i0tjK1x-oM07=1vXvEEDV1dj!2UHc$1q=M!}a)I;)g)T-$zQE zvUy4Y7oRZ<@vbAY6Q3_jqI72-?*BMr&9t^Z{r})+hvFMf-w@w;NTf1R@@k>)JR79F zGOe49MgMQiLHr^0$Bk_tO==y||A=}KU%&qN?|T13K7{o);Ss0{t5oIX;eYHue6p{2 zp)sc^ofH-`vM#;CO$0HR9|;5kiJNR2 z92FFlsYD+&qj+XJ>L1X<3gI&OJ|I6BQNQ!oA87db^X(x=9iff8PNO|A48*^$vFrgd z8}hN8d4dqpoLKZ9Kk?<05br!_T(|DiJ@I8D0kY5P$>^@fE9jgRO54t?!+d1NCf62Qge$Z(_OkOW+wQ*l3h+j$Y}_&Z66Gql8+f%vgL zGP-m3SXSo-d$22;T`t$4QjpXxTyNlU(jb8dcKl<`#Mw^NzP6de z5B1CYawvvE$cX+B!Xv$BlyE@=)XR)HvaIUYtE-3eWyFv9a z-ZVDqyj{)32Z+Cqf#Q&b)gfL21romh2zLD1nA)t(wV9m$IsB^xP!5|rmC}FN0KQ99 zQjk3l|QEU2HTPHB=ubdcM8$`C!98$iVx%5~mXJi$o0LmFh$G zS>IZX^-!>X&5t`v_MQvD-=E-i_n#jI8~(9<$%vt+mR#oE zFFs0rB+&H_@Bj7)4HfDy)4B64mFgv1T#|`JSRbn^cyDr#C>-i#X$R2W(H_JpM-$qh zM2h^Q)JFpyKi^&lBw=Mtq*8$R-}6#BFiIGG*Tv4J6n}9Dcl+`8{Qh9WKgiB=jBa!& hx5DpA2L}hQQ(>VX!GiU`L@ArJXbB&mKmJMa{|AW*suKVJ literal 0 HcmV?d00001 diff --git a/materials/fasteroid/elwire_sprite.vmt b/materials/fasteroid/elwire_sprite.vmt new file mode 100644 index 00000000..f6d38eb2 --- /dev/null +++ b/materials/fasteroid/elwire_sprite.vmt @@ -0,0 +1,7 @@ +"UnlitGeneric" +{ + "$basetexture" "fasteroid/elwire_sprite" + "$additive" 1 + "$vertexcolor" 1 + "$decal" 1 +} \ No newline at end of file diff --git a/materials/fasteroid/elwire_sprite.vtf b/materials/fasteroid/elwire_sprite.vtf new file mode 100644 index 0000000000000000000000000000000000000000..437aea8117d899764f3dcf558385c5d2e40d62ca GIT binary patch literal 22024 zcmd6ve`r+an#U9MvT--=4YbP*To)87WO@^fP@#c#O#&_?-EeErV&|$&6THNPT(nss zCN{m6ASgC}6fNvU%T2rS))_`Yh<^xbKvpS&`9s#i77|Je2}xnvbz#JIJ^Os#=R9-H zoXliqtoH5;>D%|5^Uia=@AJIR&-eJo&VR1>n~I8xHS*Ube}Al~sFY6sBmLk1_jCVb ze_WR*wyl%@uH`>fHSXC}T=p9my5z4>{{Ad~SEg>(Zr!wLQ+nk6n%&YE%W$iW>1Dj> zzFglU_rqfu?)hQ1qQaAQpuMeqm-LCwg_fN=D=R-d{b}vn(k@HiChe!vIliT(YOA!p z>5l$?khc3)GQLyV_E<~R9%;9m^!{vSW`z6CPgb@5tF#w3mUch-`$z8HiN6v0eds{{ zWueRO?@bT%L!WujhYt6l`;XG*yz~h7d9PCL7yJG9Yg(%Q_r{GIx0^n#h0fiu--ExCp!mwdb***dO~;f@#DwLPbM#1;JtXhzGtC@`S6|b$C>J$ zgVMm&BMqGV9(;lqJsJGmHF@)`tY6k zo~QHS>$91^!O@Sr|B2=A|98L3Pv6Z?2J2Vl*5B6eT>9JYV(TaDOBCZD`?|ZE^$++b z%kTKleA`DiYekM@vDodVH5*w^Ay#|Q7Y zeb0Vpe7ouET6%sLI}ql(i0|V2H5C;JX-5BR=u4aT>5mV#IX#pfsqPsXLJoB7d0$+E z{`Jh|)4bRCpy{ckqhIaQKfmRh4a?|@Jwa|o{fPd^rN3t5`!(03RkbSqi-Wq48pohN zG<5m2jy>BVYRJ$(3Z$mq3HRa8tjH#gfD`j?~`{aCxwuNhN%hfa0$^EeZ|FrpE`lz7#h--{)tm!oP$41zpZ^!4BXfg`VUVl{llp{amJqa zZd&kHuAd)p?{z1>KgRFZ_Z(;!_#Y%Xl^^?KhQ9^;4~;(fksBKue)#{Yw6^x`KK-Pl z_u=XBLFD(NsWAQ3tG}Gp_ew_SpX^kA1oYkdN9n(wk3RT}exvA3#+QBiSF-d!&Vc{w zeU*zu=XM`|o5NoU{nw=xr=N>|Ieo>S=(P3!x#*vB{QoKI|N868`ET-HT>kc^SFbKd z{@$)SdNh##Lh@(y>snR*(<3VXw*Ow5RDQ7kpuabLF=zk%OHW^?%75I2XFFZ564b@7XJ-|7BG|3E*V{uzqwKT$u^Vfn+4 zjOyP@Bc^{<&M%)f`fuJ9@@qY>aSZw$%k=NOum1x5E9y5#{|fvZ{Lo*?{v13wG;}Cp ze?0H=F2io4cd+C1*md;f%*a9uW92>R{1DR{khcD2>PiPSO_zjE~ zTGni&|GL)29a;J&ckBbDuYLgZC#7Mxp}Q1UKNz`&en5*%3w?_@X(MJ!67_YT4c6#&X%?-!5+;sHWNBkc2-;q||qkc7Z zpX;7?^*;OP`N@Q%zeDWwCb`bOg)Vx8o_$U4=s$Y&$ml_TtuWHY=n0{}+2~`(p@Uw5 zK6ak*yJGk0J#YOy^beJ{|jlw>9;xj*m>w)y>Ild`}CI_{>!H?{!H{$&OJ}* zXR`RqqyMzl|Gv-vCtLqO{!5iV{7&V+lfULCl|T5uZe8yF=Xay~uU_}xLEC@$-AaG` z{Pc8l^H14-5=K>q<*y;M|4Y$7LcTeyf8@O+?`Qfa@BV*m^x%JK`d9ToahBpX{re{R zx9i^7z9-VZVf!QI=SE@slXUhkus@ei%X_TLXMaSWiM?EIe|mlWL*666FZM54j{Q}8 zi2W5h5`XWU#QxPRv%fKCf3UykJ>UMS{&#tomMZVP_udQazs14UYhDj~v`ysUn+>1T zY?HPGw`Ap6uj(VrvKbHBPA!`}f*wueI0rBszPAF?ZtnzB?rU0^iop-#e@P zyPjFSdeth=JC{a&uinRx!hUL;O}>|Lbc(Z>c1NPUmmUY z@vB`u>EFMdi+|tE+D~f!EUgs$j~<2dFNWLteE2tuT~z*qKP5QsWbrS#IJI%CqaXYo zA`jy3HCOlO`VhZ^`{T^c2>w^_AG&tm(mYCfMD6BDKY!rxi$jcG2me`D_#VZ-DfV@( zgclDB;P;~Zh3{cMAbKA^fqX=m|M*4wW11HNKX~rMV=g~+aZu$O|I6?TF2UdC?%zAB z_F~REoMN8mxDWq-m}URg-qJW`#>ao4UE{Z<_r>8sm_5Mqfihnlq z@IORvi``)N!~Y|9yCi{nWlHmS;sy+PQC#}$Z=11`p*BE}*A3XS_^fhCu--y2qKl~q; z{mgyjo1VONF8(W1yg&MZzFzbteSp8N75(SqKg4=)-{j+Xe*A*FrApuz!T;7e<^G96~j;5A@0%}<>Ei@%l`qN|Kug$Yvb4--2OKF7Y94~@&Di(_cNm3 z>9KcOH&Oj}J+sTl|OeZ%Tj=GPX-ul{`)zuL8@hd-4{ zHT+ckwYLoaEAz;+;eR*%lEZKH9sFh1!|*3Mqw*i~^@GYk_L%2+zrJCOb5_ES-;!pg1{9jrB?M**T{rAlHU)26Tss1ly z{{sDA$o@I~|1hlo%8>s=IrcA=nw$*we}4bR@E7ub0{g$7{V(y4`akD<`(McaDa-!* z@y|;3&+J{P_`~s^`hROSO8C3X|I6q9HaGY7n*SH}f2sFb{P!&UUny&sjI zkN?d758}UO@qdYbr=9i^gG1pdvwJ$u9-$d&)3AOBVP z`2pg;VX=G2r^Ua0i;D}T#6NGm5u67wxd{4l<6n*c3&+0}|3~BB`wste=Sqryzqk08 z{0sZNK>S-2f49W{Z@pD^{4e=0&40ADYaOO|{zLuaGX?V>nQP!EC;!3orQ|=v%}E6O ze1iOkpa0F~e_a00@;{pYGW_Wg=YNCz_ZQb#2h;!L!^nT%pNi(c-Tr=P`G4?R{#(?Y>V%LK{kbiJ1{%zZ+e{GicCqD-c z>=XUCoO_}V*T2O4_gei6|Azb5^VGk(x|*9;s((rOOX@$l^)JJ3eq!PJkJNcZ9s*pt z9#;Qy_0L2?&Ywls$>G0&92tJ(7{;Bn0 zAOFFX@UtJH_`ogYU#tJ-#m{*_#lLOa%Jpx~r)iwy@Jj*QumARv&tQG5{{8E@p#HsT z)#}xHerS67%h_oCyQ+1!$iLNpgZj7CM|1LI54XqkoFnz`$B%#fk@u#@4=RLT%D-{{?jz}JebtM0#_$MYMbF+JxH=(o$hq=!#GN&`RjU?2aoeXjfm ze?^6Sz9Q!j3*%=Us4M=hG{cYFfrC0Uz2yPfr(yhdAN|F1NA60bFO58i9N!J)K{XDh zehLou4L$36K@>nE=N~2}CfH|OPx|-KL!+a^L+neg=fj_`&h7BacNgH7{B9~ge$Qha zSHS-&dI&u5iJm&O;m04Rj?eWV54yw0PaGJIgR~A3)B)O@9|ZoGtP^^5V&d4bi-X^G zgA=_=4}SVEe)t~de?I(%*TbKIm*s)6OEMHMZYi$#543~d>I5_X zId1G6^E@xN4&-_H>tG#HM@IfRR{(zM?BHFB#6kEaT!;Sw{_nm+{)^!kw|2_#MtiFx z<5#`-;)}llzZ?_4f!|5P4*?H;Fm}<$|6A-f`=2^C_k%j1<-v|b>Yy$TI7pow999R# zkA(mD)gt~A)Y-Xj`0>LSlLt9^^r-WLIR^yazLQoO{;87i|3(^qHtPU>aJBh$FzWJ* z!T(!n_^sf#I=R(>Ee^u(<=n0LLDa!D4$wL<&w~s6@L%yCJC^qG<9Bo4{AA4oJ$%Uf zm5U#}9_71@!~8e=^oE}}1l)EGg7e>D{P2hS1HKx}e;vnk&j19k@0}01L>IZ`#`6sUce$E+y zw?2zs{p2uy^5$Xu0)IvP0)IvP0)H9)`ez>oYJe(LOsU*&`S$M{L{lLssnKi|2szu>>(Po>C1fg|bT9~b_2NW(q} z{9f>H-8wZzUW?}*_~*dLdod39Z*h>tf$HZ_M-lhGlDazlH~hra#DUnCEPhcSydV5W zUPTW`d{?{h!2dPw`^*5p^4IVa7lGgWWc!YV zIybn<`z!uA{~V}02iZ)W3>?@Idc#j$75-Ca<2wE(J^lwhby@lsg#Y{Y96bvE85hG} zP94bb^WNASded)-&iwezPo}QL^MT&i)byD8j@KZ=7{D89Y z;}45FoHq_M{kIZ+|X?>MFYk;(tlA{W-5x{$KKpKJ2Qg*d$#yXmH$*x{)5-#U*Jog(BxnDKj$9U2b_Z` z#{XFC!Ug01vz34T9R}O?)|V>(rvGjK*Jbg8b1AF;|9|Sg<+xYGFaDp|KlT5fmi^oP z6zu<#*uQe{tN$0ppWpwB`ahNjKbJQDuaN%}_`le_!v2r?zY+UCTB`q3j{l!Zh5i2* zBK}`~{P;(u`oCf>7zqnCP+5f+g4E*0*{L%O);{R{8_{Zu% zoO?zu1pfaIv&|C!b4~*Pk2q3$=l?tVhyLfB1=pkgKk=W0KN0_*`u@uCPq*m1|9r~v zZ->kO1o6*S!D;btPzSsciT|SUZ_?o>{v}UL{9EbpKi&8j{3XPH3HH-pEB_(zV;28E zll+Hl&_epJSpJLr19EKnze|z)U!CTEHuGHz&ynAv*Y9A~WzPZ4dAsF1n6A)wFuK3T z<-0QUE%`s>pZpi!KdzMj+8xP%O8RG6{loCW|H*RkO9Ir-e@Xr~7k@PWNq!EzeAh%z zou8iXU~<0$a_1lp@|{q4e~0s*$Bs=*MDw5IpLia7EdRXG6Xt(|@BeLGtk2=U;3oeq z>F-PU_197<$^W|i_d4obDZvGP^8b{@?(l$^P7A}CgSh- zUo8JUB!(aTTyFlC?;8wnv=7%mUJTX03e-Qc_>oWiU-C2HEmr@S%ho?szoRd89fJA? z{I~iC`9{8{#=i1gzWT>^-)a4?Sp9>zHi{d&A)kZ0`fvXFm)3tut$(Gn-vLpP~NAcg@H_xc({se3{@^|If|==c|8;`ny2=6Zy|q{~VHY zJmLCZwEmlq|C;a7`Y-vVeEf&+CjZpcZusB7%YK=(ypCW0mi&IQ%=$O~eiity%Xbjd i)1}nECnmo7%Ie?vSK{6c7pZ@{`v0Rxh0Z@LF8&{~^wtvq literal 0 HcmV?d00001 diff --git a/materials/fasteroid/ledtape01.vmt b/materials/fasteroid/ledtape01.vmt new file mode 100644 index 00000000..a7442d44 --- /dev/null +++ b/materials/fasteroid/ledtape01.vmt @@ -0,0 +1,8 @@ +"Cable" +{ + "$basetexture" "fasteroid/ledtape01" + "$vertexcolor" 1 + $alphatest 1 + $alphatestreference .5 + $allowalphatocoverage 1 +} diff --git a/materials/fasteroid/ledtape01.vtf b/materials/fasteroid/ledtape01.vtf new file mode 100644 index 0000000000000000000000000000000000000000..9422b9a54ab7d65d8dcbc5c973a338af18ec49cc GIT binary patch literal 4224 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 H;r;%9@)fl( literal 0 HcmV?d00001 diff --git a/materials/fasteroid/ledtape01_sprite.vmt b/materials/fasteroid/ledtape01_sprite.vmt new file mode 100644 index 00000000..523c55e8 --- /dev/null +++ b/materials/fasteroid/ledtape01_sprite.vmt @@ -0,0 +1,8 @@ +"UnlitGeneric" +{ + "$basetexture" "fasteroid/ledtape01_sprite" + "$nocull" 1 + "$additive" 1 + "$vertexcolor" 1 + "$decal" 1 +} diff --git a/materials/fasteroid/ledtape01_sprite.vtf b/materials/fasteroid/ledtape01_sprite.vtf new file mode 100644 index 0000000000000000000000000000000000000000..5f0ef57b5eb3315f705279dd88b34ac51449ba34 GIT binary patch literal 8320 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 E2SK>{;{X5v literal 0 HcmV?d00001 diff --git a/materials/fasteroid/ledtape02_sprite.vmt b/materials/fasteroid/ledtape02_sprite.vmt new file mode 100644 index 00000000..12ec82d6 --- /dev/null +++ b/materials/fasteroid/ledtape02_sprite.vmt @@ -0,0 +1,8 @@ +"UnlitGeneric" +{ + "$basetexture" "fasteroid/ledtape02_sprite" + "$nocull" 1 + "$additive" 1 + "$vertexcolor" 1 + "$decal" 1 +} diff --git a/materials/fasteroid/ledtape02_sprite.vtf b/materials/fasteroid/ledtape02_sprite.vtf new file mode 100644 index 0000000000000000000000000000000000000000..e33b5bd8d71de42610391246d53a4d81ad28c542 GIT binary patch literal 22024 zcmcJXe~469+UI+F0^8PAY}hOaGk>Jn2)5UvA}BWTl76dA=fr^1Zgjdi%LK%1mOhE!&w6kj2z9}D-;UfHvcr< z=r+>QTs~L$tnsJuG!4=M4X-RrjM2RzrF-u4nCG44eDP%{Rg0LHj9(pKn$7Gk&0qAI4QKSCjD@zy0poOuE)> zNejjNl@48sS?@Sz=2xJW;i-FSLo ziS^ykHe-g}EFX?}jWVtWp`*pFe` z;k~H?2R|NXeLFX&$98|eNj{%D`R3jR3wi$Q=T2tt)uTY?`)%8KzhFQ4_PyM}>B5Cg z$@=%~eQJW&)1RJ24*aaFoU6%?RDNuS6znJUJ*nfQ)0=m0*&W_*96SB~{&c$8_~_=# zr=z&pm9{&jyzPZTDQ7=k%lTfRFn#b((4CEQtxtA+Jg%J9&!R`(fBE$7nNOk(`1=r8Klh~E^d**C)Kkui1``wwd-DW2G`PP}U`BJBCJMS0l$LocUu|LfBSM2vg zhO2c~Rz7SLaOhvMU)O>8HuMYab{s!Jj@@sYcTPmePufO)wj;N^{j_7>!+dkfZzlp& zE>R|(et-X|?GY1yaJ;%7`FEwrKW}@Rh1jp%OXPPD0UEcn{5Vdl)!6*irl5z+OOviA zy>4mOsqM&T!~6S#UB>ItN4Hsvx6NLgxmT}_Nay?25!>^nV#j{SsWZ0w)bs5g#O)dUGd^?n@^R9;J5HH|A zvv2PG{jTHK=?{(@A3kenm+9!En{U^$#OFYX&$i>|?UzpV1x&|V!E^DQ`! zR6QIxkW1``{p+huA^xY87t`a1S9eLZAL&o$Z=9$>-?{$E0?SE%xAG6yyR|ry=8K)S z?apIA$M-!*!EvMmJurXRKf?TMj|W}H=FMS#;&1xF{BI5BzkGZ#><2%czjMOhe{?fj zldi1%qioFK^m;`SJN z1UWk2r|1{bxZ5-?rW?Osy4y@GHe1rla%swT{3>TZhR^w)^X%FCiE$tPgC7)~r_&qw z-@!!w=gzfS7if2U?F9c#Z^3_z2ikKI7q-p1FFn05elp55yPq|_IX}91FDorC&u49K z_e%NkliOz7g<{V4lKswoCzo?v{GWIg{4nVKz=5f$V2Aj>@dW;B`biY0YgczYJHd1F zedNbJ(A1uw#HVeusrX9w*y$T5Mwnl_FE6hUpSI0bI>o&G+MQy~_lWl;$3ZS7$8C2C zMdyM4;xojZDdrvep?0t#y))>6`3H8;ATB2HY;k7GZs*^}zM85xyB{21KP&%I`M15& zFXinA|0Ump-(q5Sxtwxm{(|!yEllTz^A4$UXl1i4`yu}HApWJ7cKs1O=nrGNrPpQ> zdsshvd#2uO)TGNKWVRn7&e>0W`<`?V|AuleI1ge!Fr0TtUDvst>2xxG9KA95!!t}5 z$wv(;U&O~qKD*6&B;V|Bqk+!%%eLoB{kHv*xO0m5R|xUXIN-Pi;-T~84i+B7KlK3H zE%ie9jnz{v9Y^Y|SpL|F`46 z^S+bJ-?(-6qnlAw>q^`0V%~P9&l&%r#s8c5Pxw8T$Uj|kpJJNYK>i`_kl(YreL(ze zP%oZ2OB^Jxf4i2#|D_fD-*)nI^3)HAzqy=tSSTFK4dkD5T-G)4gF-R*K`wV-LceRZ zh=0$FLsLHupG?;C%l#vk==onf9}{PjKJ4{_*? zN#k&0f7T5XW9_4bVH|i6|MUxnZ|En^dy##ZFxYhc#6#lDp1sa*{xcfayW=O1%sIc* z`7a;;>+2QfH&0?82z(oF9fzVgP_@_KJQwOOB_dny7`;hSm_8aDP%E3G@ zCjOfDjcl#o+c$T6=FcKknLh!>i z@pm%hp9Fy0#MuV<=lYO;E{;m)i_2x($?JN9_55M|2lGM;Mm`9dVL%} zkK8x(_mGDX2XD{p3Hj%dxoaW+ym4aNtnnwI%Vpci|5yk4CwZ9f8TTB=c<{qBuZ{Wq z8uJ^E9^*U2-+-5Fcy@w1Cgj~OO|qQ$+RV}}SO5?^|9^9yXb}>yO1><0jKlkN;Bs`MaeJ>(*^pS^3@4(L;xh{&VtA%J)J1 zH~$>Q-y#2>Jeq&AyWBAUZM=H@=>_A%7k8(>rao**sSl@YH_q4(HgkjcTlzKrVLy>S z31||3Yfa-+gyXw!GG9~ur_(Pq)T{oVMbE}x^=|x;8h>mz{@RbYms9_)NBs}uUz=a( z-|9iT%aMRiXn!PLN&S^>Xs7b2-I9Jb7P0@BxF&<|hZ+5JWThy8|r>pEP&^Xu30t)Dx;elP!0 z_aEDx-+pcC^ewwDnty`dC3utL5{Coc23Zq-lt%+O{6hQ-`RBUy=8%7~KK6raGoy>m zd&c4A`}6bWpUj87|9bxEJUJL2^8HKHeywh!`8x3;oyo*sZE{~qr=OY#`Pt-4lTS_1 z9DTCujmaiB&C;$nqJGi{{NM zR~D;*-e0~XKc!NC*?ygNrR;m1PN(8HcQ*=uhLu#R31Bbo?yy)H88> zYCHLHvsS+fKGJ9`uuqE5nm1Y}#F6WUjH(yH_NaR5-n#;B0^jx2$i6xA_rvq494@i3=9Mn4{ZeY^($KRomCIQviReqMu~LjKeXk@yh5 zj?{ZnFKpS}%)}|zzmSenfp7M!Bk;?H0*X4~xia+Q5_ zJ#|E<9OO{!RBkg4`wF_F2~fzdhFltn{VpoGBb`yY5mcu>hSZs}<0rGt#nCfo zpF4>dMm{~e9UQGX;&V3Nuh`E#23+qr?3W!UM_!>ErqF-z2mHW!^@m^wQ0*W$T{!GI zVKdl44ug;n;z>omI_-8vKBxE@@;#*fzT0gyv=`!9e1ZMAj{Pgo1`G$igAW>a(s4{( z4$e$Iq(1Zq^Izqp{gSuA_mMeq%VVeS$annH`Ik?Vuf#hRs9V9McPxB!KD&|{NoZx{ zY1>Q7<)6;~C-SI%$M;Cc26Rh*!>{hPsY(7i8D16eHFjkyg9ug@%MB_eHibw zclp0@f;^Fa>QVX)d@GN)Yu}u2fm?jm*s;)RMx%F|;FsuqNNu0O@9j5*;(brOI}Utu z{$XBuDDem6;JgLwJc$Q|o^~MKoW#RYLA@0Y5B%WWLa+mWFaN+b#i8DZ)b?5?laYUM z0Qt{kHg0^DaWa{RdVqW!#+^rg^>_18{Sq^Xju5|LHy%Hk;IyA&=kT3T-;MOT=x%ez zLYKJm&h^h4-TGqc^P8K#hX2t4Ex&sGW&<1*9AU>o3BI$nPtU@C$8mBPwBuSg1Ur~6 z6r5K)$92FKcoTV6XXpph)2^HCFT?@%L2wuIuHk;r>kauHQu)X1L)^o>Bl(Z`(Vz4O z`A=`yux^aJriOqLyBD8fe?t!XDTF#foHUcs-fjPklOW6@^D2C655N8H)$8m7(Vy@9 z<(6^qJt_6W&$nK^PMjl;|EvK&ozFlz@n7(amrt9=J1+X}I1lU>oENqWAszxKxh|f2 zuCq`$ddPLde@8yp7X$y~6Cn;tN8lIuF*~I45Bp)im+$X+k7xF~Bp(lc4?p@FX23bi zmVgJYC*ILaosgcBYOm6#7ml5lev3Y(pWnQTS7qY=e)li8tY21E-n)YvaK`=Kol?78 zRvxJLu>D}C=XrzY6%`FSbmKa+WsfB9L<|33NO{E+`MXYF^l`AXpbpRjkIzqtGJ zE$Pb2t-GWAtgL*u!rg)|ZFk-Fllq?Y>4h_ArN~7X=U_qqwa56UUR=w6V*d~MKXw`%r8dxiO}+Z8o~<*~`)F#B z^TGG-lq;RQeqeoKzaIG6K>x*o{)><5pWi=$|BKr@B*qWu%w9O9pLpdZC?CUXkATDL*_zqnmK^t%jszkbLg^;zKm1^qNezxpkt@ge>n z$LZShUw_u1ZsGpK^IxZ^I=!H{wi|MIN8^5~-pxuqA6Gu*c0aG) zJwMrj-GkqijQ`?w<^gREPOKB!6ne&g&vEy#4$d>CT^I6U|HJ>MbJV-k14I6a1M=nX z)iaMz-v4S%Zs)N7fkVna<$v=j`3DJogZvV+$XsQf4e8CB-FFce_1)xNnmMNj9|fni z9*#5h=5r^(NqPR}{BtKG7#8EU+*EZ@)Dud-ase}mo; zLteY@QBNE9+A!=qu%C1P?_e0N1HE&v;M8{I;5sqyp6l+wuzb+1Bwt1FNcqQXo?L%7 zx-IiR)Sa<@ApBGBeoP)vubEeE1PIZ;kVDu9Cc#6rKiCH!;Cu`{YX@wa6-!ktTsfr(e3SHs+?hJg-PuZ`s+=p+@{keCM=)K5!;`-TkVJ7E1 z^6$L8zUN$5cO3;!unt!au9M%B|6JJA>z7LMfj9>B@csMppUdU*L%$!=3ED~j!#;tJ(6ym^dqG)4?1IR)9g1z7eoDYJJfX~FWn)-<1bYmO)Qp7o(=TgeW^`|oRd)mWj zTx%UWJ$`azYcp%UFW*CId%0cA+K+R@DgB6eFlAi94ZyWI-viHf9?uhitU$M!i>XeEF8jCvpEl+#B*gr1pc&fgjX@ABaO~Pw`~Bp?%4h`F1AL zY$|`kLBn{UzV%CRDsVG!q96zSq26fSP!9EGOTNI(yW_+&_`f@#|0T3v>T`Yoj@2LV z4Gs2=BLshkI*)O|d9?%AfjCO){YwrOT&L~w-z#}fguD-XmoM#Q$mcIn`!%~mKTr;@ zjg9^$+Grkun(+hngL*C40rt*qGU8z-!+8yMP;YWxyk)QQvHnj*+JkZsH(Ni;d3jfT zrm9!&eLy}x@_w}y=*P=h+bh+6-hP!{F7JDlUMcT5=pB3KTo*k%kMS_*oj9i6;g@?Y z#QR>c=sG(%xa%$>5dB#kP`#IOxixj)YB|`i#lENuw`{69+jrQ6Bd=w}#*Um51J*srFaq z?T7t?BXXXy+-HB=v$u@FJ8m0Bod>%Q@s4nivo7nQVD(;Zw?n>Pdrkh`7lR*A4`^>u9EEx~isM*ZE&}Kir{f%r`e4uAX2Ad6 z-@k#pP+V^`6~*#bU97K&`=#m$t$beP85|RS?N_d}1OA1+I8WNMm$01+{=VGryU+Lg zea^MeJAppLJNR~8hv3_F76Shh;9tdX&R5Fk|EAub#6S0;g8s!Z9T)Zk|Lphc0{`Sk z7q`E`?wH=_x@uSI!4K*W@lWC+_$PIRe8q7p;Gf{0ivjnnC-~?6{s8~%5Ae@QrL5gd z!MFTFit-QN;6Btj1O8!ufPW_ZQziuc6aLXZxL2|GZqWPG-;aOVAM+155OrI~hle;A zb#K5wDd&RyKZ1YOv`gz6?UdVe0spK`KEyxOZ@0O)HQ=9Ds-xO{w!2adbZVs<+V5An zzXkqT^u8(e-QfZLN&V}%*89!_9`FGF)c%2a!hVk#l!N}MbG3i!#}M~R{a$Ax;GfyQ zX$SHT?j3L->(=1^snqEA+CMm_ai#_kX568$*=QURCsjY0EyU0c;C=XTS&6 z&$hbtlyR=Rvbfc_C;st}ZkwIDzg)53RK9=7_wuTMh5Qf`_GJ&Pk8V!T(nGxz?4f0q<;qf4Ki42k^cRj!)gc zR2Dy)=RCmtf%_yK#}W5)+#Gzri5--{J%SxjD7y~y+|wTsLxOvOA7}@81QqN6071S= z#r_)HW5~a_Kl#r&`{Aww{4+`o@XwlgMGe0;?gIx0+*>?Dz3V4c{FLX&JVpJx{zk3N zJ!){kdNgWY(*plA&&hV{0sjR5fbxtTgm!Qc`+l6fh*tu*t_z@ zy+gbg=L+!-e^4K=9o^R6Ur^uPLyw~$|EqX+J!9PtjXx#d>(=8@^V|gg^!`p2{4=4U z9sJjR-sAK=anL)+&vRw>NA>GGxl#dtzz$$E*a5$BKPVnf;vv_Yumf?AeosEY#X151 zyx$M_=M(_wQ13&k-Wvoo?FFDJ*gfYtA>JF$j5D}H+WnsE?i;ochhQ_{-r~U8Dg1*2 zZJR|tk$U9b(mM0`Ml+7BYm|d^POG_?y4lPw$p5#ER{{=d`xN;94&)>5?RzEgKkHuY z-ElGZ1ph1*js`mb08HXR;s?M+oj1@ExJU2<evm6A_g)ATL%xSp{=ugP z_-8ufdprjGQ>uM|>#@&^e9t zJ_6@x;r~+PP=5aF4;y*-wx8!7zGvJ!bN0>&+&AdzX{(*l7 z{1bB6{e#~J{FAUYz(0%Rh2#Zvkbjzg75~IO9^ikg@XsOs^%(vM8{EgH?&HUKD33Yc zU5$SR{3m0*Za;CW8dQDaMgjkXX2id`2uj?G&m+M9-n)}8w#(u`IrJ<31z!RGlt0IT zt-k~RytrMw*LCt*!Fa{}j@q3)Ni zKpYN2*?a~+E;^G(T-}=S( zT(|n?v7lY~Y#i*-;6CfK>yWw+K&BtnzxP|@<4O3p``x4Ukp547m-s*R-J||b`)d3% z_&;Uu0RQxRiv<7G|0xrP_-E6&4nE4g9q><-|-g$t3 zihKH=@<{N{LdkI{|G3vQ#Q(kDSS%Wcr21u#|Iz=&Kh0Bnw9AKjALxIGe?IX4N8>+! z{W$(f9rrAC72*i|qxPL4{xzEc?@*ua$Fv9B3tW&}=-$(8ayxhYq&R^4UJOnm-X{+B z&h>Ab3I6%~*CX*g@K0!EK5KiM`-ArL9=q>Zw>ys1al!Ed4(4}T&YRrt9NP`Q0spi< zmVaQtoOuv<$AJF?{{$}_;-3%h-#yAd=KdJ&1Ahtr8BKB@o&677)ct=Q^{jax*X6-E z_UwgC?xkOw5hpT#6%W#0Bk&*fC*PiHM(AC;76aPWxx{O;e{ zyZmg0y04E``LK!oP5aNnuQ;IX;y?D&4vrze3b=*&A2@c=aodLreAfUj0^j<*a&R4} zJ>Z|{7aR!u^GET|uQrK~$Okw<&%9PVT)(GzP5w7QJoGyZ<&a9b54<)8?zzGJ1M{zI zPjOtYYhT>M8lD4$dY|8e^I!+yU)yFEXMlacKlxq*YF#r54kn%p4%QOy9EJT)&%S(m zq}mRJbl4sg#@^>x;DOwya~$QMzvBksezE)q zy@P|g4&#IC0_Q5KckCqieGdRsdqzwp_1YmI4Eg*eYQN_28~{GGAL4madBy;s+84(@ z+z;d&0Dn;a;9Uv+iJ^Ou>yu-{(t_wHsyUq@QAnbPp z3i-hQ`||bZeb3c=uYUGD?ZCPbc0)eEeh})xNfH|EfPHa*e_9uP!Z}EW`+rNj7VGsZ zt{bs*#s8wXo)P~8502NvpZtseRl&ifmFmw4{@K4jZ$I%*-!pDG4&f^AxSf8#AMQUA z$1Y-j#IphZ+4)hsC;lh+C)9P*Ey2G^|6KgD)o`3lJg5h2gL)V$|M8^vV!%H)q&K)O z^1qDuuk_8mlbnmj;39ABuh%ny|4cm--=5+7?*9>|{`xxiAo&?m+mCYJN&b7_oW9oq z$8a3;`bqeQ{lGuvKu`Z8t*N+h-PQzqe;v z|8sGxbg`P^yIH;;yHp93x|jQoi!=RY@B4vsPyi?TF9iHEN9C*ibA1c@_ugNzFaOjv zW%UnC5bAx{5B4u^EFZa2aZSCun&08GegY2G@I7F#QTYevN$FSO9mW~&i79_C^yvQ! z)c>vvGWr&A%6ixOT)e|P9lBM&@7}9#HNJs=rjE>sgQiBLd2kTh^DE1IKX!YD`(IVx z%iZr^avX3T?11~Py-vk>;Ir(!Gt`Uvzj&AXGjLDObyDt!e3$MC?!|p#`FhfKA49%} zRKB}|dvGlnbi8iYb8zp!K8}N-fA~i4;D4?UJ*TVqE1%~^0T-xeQu2cs!o63-kl>*A z7E|U0;C~}Gr10;)H#J`k_de&BFO_{y{4dA>{L6892KVE>*Nop4^L;b8pm6~9!#M!g z{emA%(ZO}+^U3~)y#zY|5B?i(fz2|+vAcvfC;C?)OIZqD$wKs5~ za2|vm^jueoXV>XHLGu8_5%5p&u5b_9XZ?V1xF#Mdp9TRhiFb{#-(&V6@7oLj>bM(* z_nt$XNAKW(>Rr5Vn>ZNp(7a7NR6QaW{tkoRYu5R@Dre4ue{&D?r}OYX`XTkLc0Z)H zdk@flQ`o!jsc*;0f%iHtY_)?wK%E!&Z)<8jA_JZAuUoBy8{@(o<_9OKHziIWOe^{@0UZQ=A zgNt9_F5G*48vL^sZ~FRe{w~L2N}TU)z5@^!5dXBDxK|M`gzbv&p|7^%z*oRO(Ra^z zP-C!z5^>&j6fkVpMcfDfBp%Ywbst6!^5K3d|LzO&2_CX$Kd_zpKk$$LhkR$_#svR# z|2E!Z2Lb;iJPz(Zr9*yayXO?*ph550i}*EsXWpicS1$4=4lE9YUqs>^en0nn>3qLp zyLz{uxUY3^3H;jg0CCXgsQI;|%1eegF;lC*dvB|I^dS{jXwwupe+BCjW>j zyL|H{b$19~{KLfd3NLlY4N;Nxcyc zhWKwd|LRaU%O~wmjQ{L^q26cNA@3ExcOO9xlkO|xo$fRK-hC$qFLwVE?{!~_cy|92 z2X)_yxF5KKeN6n%eI6LBCEht2HM{PA;y;02x*u>*jsd2^yZ`ekOzZ{t;vIx3$S*>e$?&Zz7Nk` z`G?;H;{fK6;GZyP-Vq}Q?azCE=07n2n0bnJE?%v^&F9cJ+@Cq?JwWrE6!(75)t+AP z@23Qc9Mm^{khdRj*Od7WV&Lz&i2Iik91#3hzZVB~UhzNI0V$gQz-EGj!Jz9d6bdu) z&o#hs4{(_O@VF-bn}GiY_@{UgYHW&oq3@dKN5DCu-sdym1ov8(?1R8z;T!-pgZsU? z7rvW`9n_lUt-waz=U9IX-mM--xd8bMc`o%$OKs`ZtGRs+4XoDcUviG%ZjZv+wSy;#ay z|B8d|LGOpS@9ezdoUQ}5!u?nF2lyBN?3XUEZrmi;J@y{{&H*st8oOW3fAE9hJ?K=j zAEv-Dm4kL*Ts01c{eVEB{89TthzIzMb{WM%y0{hOWcW~ZPi1*;!u9L7=FpdEu z2EA7*olda(U%B_ZS`OL)$9Ca7Xc!NPgUNmnPlkBF`3QNzAGgN@LiLfUd;gJrkr%|R z5Jxx<8}KzlObg|KD+N_n>#rbL4*p z9QzaF-CM=5&wt7OuH7pa`6uoL{!xFZ_c#VvbKiY6zpI~>7dTkJf5~?S_;0N?*bhQp z7{`;b>!>vs*cbi&J)IG!BwYyjXUu!*kLS9$W}KpFbWB{L6R3zxm!X{GFv@z(0TO HyyyP_e>&E) literal 0 HcmV?d00001