return function(e,X)local y=X(nil,{script=script})setfenv(1,y)local j,Z,B,P,S,U,g,t,V,N,l,h,u,d,c,w,I,s,r,f,a,T,W,x,p,A,F,n,G,K,J,i,m,E,R,Y,M,H,O,D,v,C,q,b,L,o,z,k,Q,ej,Xj,yj,jj,Zj,Bj,Pj,Sj,Uj,gj=_G,game,script,getfenv,setfenv,workspace,getmetatable,setmetatable,loadstring,coroutine,rawequal,typeof,print,math,warn,error,pcall,xpcall,select,rawset,rawget,ipairs,pairs,next,Rect,Axes,os,time,Faces,unpack,string,Color3,newproxy,tostring,tonumber,Instance,TweenInfo,BrickColor,NumberRange,ColorSequence,NumberSequence,ColorSequenceKeypoint,NumberSequenceKeypoint,PhysicalProperties,Region3int16,Vector3int16,require,table,type,wait,Enum,UDim,UDim2,Vector2,Vector3,Region3,CFrame,Ray,delay local tj=B local Vj=e.Service local Nj=e.Client local lj,hj,uj,dj,cj,wj,Ij local function sj()wj=Nj.UI lj=Nj.Anti hj=Nj.Core Ij=Nj.Variables uj=Nj.Functions dj=Nj.Process cj=Nj.Remote cj.Init=nil end local function rj()log("~\033 \070\105\114\101 \099\108\105\101\110\116 \108\111\097\100\101\100")Nj.Remote.Send("\067\108\105\101\110\116\076\111\097\100\101\100")log("~\033 \083\116\097\114\116 \067\108\105\101\110\116\067\104\101\099\107 \108\111\111\112")gj(5,function()Vj.StartLoop("\067\108\105\101\110\116\067\104\101\099\107",30,cj.CheckClient,true)end)log("\071\101\116 \115\101\116\116\105\110\103\115")local e=Nj.Remote.Get("\083\101\116\116\105\110\103",{"\071\095\065\080\073";"\065\108\108\111\119\101\100\095\065\080\073\095\067\097\108\108\115","\072\101\108\112\066\117\116\116\111\110\073\109\097\103\101"})if e then Nj.G_API=e.G_API Nj.Allowed_API_Calls=e.Allowed_API_Calls Nj.HelpButtonImage=e.HelpButtonImage else log("~\033 \071\069\084 \083\069\084\084\073\078\071\083 \070\065\073\076\069\068\063")c("\070\065\073\076\069\068 \084\079 \071\069\084 \083\069\084\084\073\078\071\083 \070\082\079\077 \083\069\082\086\069\082")end cj.RunAfterLoaded=nil end local function fj()cj.RunLast=nil end;(P()).client=nil;(P()).service=nil;(P()).script=nil Nj.Remote={Init=sj;RunLast=fj;RunAfterLoaded=rj,Returns={};PendingReturns={},EncodeCache={};DecodeCache={};Received=0;Sent=0,CheckClient=function()if F.time()-hj.LastUpdate>=10 then cj.Send("\067\108\105\101\110\116\067\104\101\099\107",{Sent=cj.Sent or 0;Received=cj.Received},Nj.DepsName)end end,Returnables={Test=function(e)return"\072\069\076\076\079 \070\082\079\077 \084\072\069 \067\076\073\069\078\084 \083\073\068\069 \058\041\033 ",K(e)end;Ping=function(e)return cj.Ping()end,ClientHooked=function(e)return hj.Special end,TaskManager=function(e)local X=e[1]if X=="\071\101\116\084\097\115\107\115"then local e={}for X,y in x,Vj.GetTasks()do local j={}j.Status=y.Status j.Name=y.Name j.Index=y.Index j.Created=y.Created j.CurrentTime=F.time()j.Function=E(y.Function)k.insert(e,j)end return e end end,LoadCode=function(e)local y=e[1]local j=hj.LoadCode(y,X())if j then return j()end end;Function=function(e)local X=Nj.Functions[e[1]]if X and Q(X)=="\102\117\110\099\116\105\111\110"then return X(K(e,2))end end;Handler=function(e)local X=Nj.Handlers[e[1]]if X and Q(X)=="\102\117\110\099\116\105\111\110"then return X(K(e,2))end end,UIKeepAlive=function(e)if Ij.UIKeepAlive then for e,X in x,Nj.GUIs do if X.KeepAlive then if X.Class=="\083\099\114\101\101\110\071\117\105"or X.Class=="\071\117\105\077\097\105\110"then X.Object.Parent=Vj.Player.PlayerGui elseif X.Class=="\084\101\120\116\076\097\098\101\108"then X.Object.Parent=wj.GetHolder()end X.KeepAlive=false end end end return true end,UI=function(e)local X=e[1]local y=e[2]local j=e[3]Ij.LastServerTheme=y or Ij.LastServerTheme return wj.Make(X,j,y)end;InstanceList=function(e)local X=Vj.GetAdonisObjects()local y={}for e,X in W(X)do k.insert(y,{Text=X:GetFullName(),Desc=X.ClassName})end return y end;ClientLog=function(e)local X={}local function y(e,y,j)for e,Z in x,Vj.ExtractLines(e)do k.insert(X,{Text=Z;Desc=y..Z;Color=j})end end for e,X in x,Vj.LogService:GetLogHistory()do local j=X.messageType y(X.message,(j==Xj.MessageType.MessageWarning and"\087\097\114\110\105\110\103"or j==Xj.MessageType.MessageInfo and"\073\110\102\111"or j==Xj.MessageType.MessageError and"\069\114\114\111\114"or"\079\117\116\112\117\116").." - ",j==Xj.MessageType.MessageWarning and i.new(.866667,.733333,.0509804)or j==Xj.MessageType.MessageInfo and i.new(.054902,.305882,1)or j==Xj.MessageType.MessageError and i.new(1,.196078,.054902))end return X end,LocallyFormattedTime=function(e)if Q(e[1])=="\116\097\098\108\101"then local X={}for y,j in T(e[1])do X[y]=Vj.FormatTime(j,r(2,K(e)))end return X end return Vj.FormatTime(K(e))end},UnEncrypted={},Commands={GetReturn=function(e)u("\084\072\069 \083\069\082\086\069\082 \073\083 \065\083\075\073\078\071 \085\083 \070\079\082 \065 \082\069\084\085\082\078")local X=e[1]local y=e[2]local j={K(e,3)}local Z=cj.Returnables[X]local B=Z and{I(Z,j)}or{}if B[1]~=true then logError(B[2])cj.Send("\071\105\118\101\082\101\116\117\114\110",y,"\095\095\065\068\079\078\073\083\095\082\069\084\085\082\078\095\069\082\082\079\082",B[2])else u("\083\069\078\084 \082\069\084\085\082\078")cj.Send("\071\105\118\101\082\101\116\117\114\110",y,K(B,2))end end;GiveReturn=function(e)u("\083\069\082\086\069\082 \071\065\086\069 \085\083 \065 \082\069\084\085\082\078")if cj.PendingReturns[e[1]]then u("\086\065\076\073\068 \080\069\078\068\073\078\071 \082\069\084\085\082\078")cj.PendingReturns[e[1]]=nil Vj.Events[e[1]]:Fire(K(e,2))end end,SessionData=function(e)local X=e[1]if X then Vj.Events.SessionData:Fire(X,k.unpack(e,2))end end;SetVariables=function(e)local X=e[1]for e,X in W(X)do Ij[e]=X end end,Print=function(e)u(K(e))end;FireEvent=function(e)Vj.FireEvent(K(e))end,Test=function(e)u("\079\075 \087\069 \071\079\084 \067\079\077\077\085\078\073\067\065\084\073\079\078\033  \079\082\071\076\058 "..E(e[1]))end;TestError=function(e)w("\084\072\073\083 \073\083 \065 \084\069\083\084 \069\082\082\079\082")end,TestEvent=function(e)cj.PlayerEvent(e[1],K(e,2))end,LoadCode=function(e)local y=e[1]local j=hj.LoadCode(y,X())if j then return j()end end,LaunchAnti=function(e)lj.Launch(e[1],e[2])end;UI=function(e)local X=e[1]local y=e[2]local j=e[3]Ij.LastServerTheme=y or Ij.LastServerTheme wj.Make(X,j,y)end;RemoveUI=function(e)wj.Remove(e[1],e[2])end;RefreshUI=function(e)local X=e[1]local y=e[2]wj.Remove(X,y)local j=e[3]local Z=e[4]Ij.LastServerTheme=j or Ij.LastServerTheme wj.Make(X,Z,j)end,StartLoop=function(e)local y=e[1]local j=e[2]local Z=e[3]local B=hj.LoadCode(Z,X())if y and(j and(Z and B))then Vj.StartLoop(y,j,B)end end;StopLoop=function(e)Vj.StopLoop(e[1])end,Function=function(e)local X=Nj.Functions[e[1]]if X and Q(X)=="\102\117\110\099\116\105\111\110"then Pcall(X,K(e,2))end end;Handler=function(e)local X=Nj.Handlers[e[1]]if X and Q(X)=="\102\117\110\099\116\105\111\110"then Pcall(X,K(e,2))end end};Fire=function(...)local e=dj.RateLimits local X=e and e.Remote or.01 local y=hj.RemoteEvent local j={...}if y and y.Object then Vj.Queue("\082\069\077\079\084\069\095\083\069\078\068",function()cj.Sent=cj.Sent+1 y.Object:FireServer({Mode="\070\105\114\101";Module=Nj.Module;Loader=Nj.Loader;Sent=cj.Sent;Received=cj.Received},K(j))ej(X)end)end end;Send=function(e,...)hj.LastUpdate=F.time()cj.Fire(cj.Encrypt(e,hj.Key),...)end;GetFire=function(...)local e=hj.RemoteEvent local X=dj.RateLimits local y=X and X.Remote or.02 local j={...}local Z if e and e.Function then local X=Vj.Yield()Vj.Queue("\082\069\077\079\084\069\095\083\069\078\068",function()cj.Sent=cj.Sent+1 gj(0,function()Z={e.Function:InvokeServer({Mode="\071\101\116";Module=Nj.Module;Loader=Nj.Loader,Sent=cj.Sent;Received=cj.Received},K(j))}X:Release(Z)end)ej(y)end)if not Z then X:Wait()end X:Destroy()if Z then return K(Z)end end end;RawGet=function(...)local e={...}local X=hj.RemoteEvent if X and X.Function then cj.Sent=cj.Sent+1 return X.Function:InvokeServer({Mode="\071\101\116";Module=Nj.Module,Loader=Nj.Loader;Sent=cj.Sent,Received=cj.Received},K(e))end end,Get=function(e,...)hj.LastUpdate=F.time()local X=cj.GetFire(cj.Encrypt(e,hj.Key),...)if Q(X)=="\116\097\098\108\101"then return K(X)else return X end end;OldGet=function(e,...)local X local y=uj:GetRandom()local j=Vj.New("\066\105\110\100\097\098\108\101\069\118\101\110\116")local Z=Vj.Events[y]:Connect(function(...)u("\087\069 \065\082\069 \071\069\084\084\073\078\071 \065 \082\069\084\085\082\078\033")X={...}j:Fire()ej()j:Fire()j:Destroy()end)cj.PendingReturns[y]=true cj.Send("\071\101\116\082\101\116\117\114\110",e,y,...)u(J.format("\071\069\084\084\073\078\071 \082\069\084\085\082\078\083\063 \037\115",E(X)))j.Event:Wait()u(J.format("\087\069 \071\079\084 \073\084\033 \037\115",E(X)))Z:Disconnect()if X then if X[1]=="\095\095\065\068\079\078\073\083\095\082\069\084\085\082\078\095\069\082\082\079\082"then w(X[2])else return K(X)end else return nil end end;Ping=function()local e=n()local X=cj.Get("\080\105\110\103")if not X then return false end local y=n()local j=1000.0 local Z=(d.floor((y-e)*j+.5)/j)*1000 return Z end;PlayerEvent=function(e,...)cj.Send("\080\108\097\121\101\114\069\118\101\110\116",e,...)end;Encrypt=function(e,X,y)y=y or cj.EncodeCache or{}if not X or not e then return e elseif y[X]and y[X][e]then return y[X][e]else local j=J.byte local Z=J.sub local B=J.char local P=y[X]or{}local S={}for y=1,#e,1 do local P=y%#X+1 S[y]=B((j(Z(e,y,y))+j(Z(X,P,P)))%126+1)end S=k.concat(S)y[X]=P P[e]=S return S end end,Decrypt=function(e,X,y)y=y or cj.DecodeCache or{}if not X or not e then return e elseif y[X]and y[X][e]then return y[X][e]else local j=y[X]or{}local Z=J.byte local B=J.sub local P=J.char local S={}for y=1,#e,1 do local j=y%#X+1 S[y]=P((Z(B(e,y,y))-Z(B(X,j,j)))%126-1)end S=k.concat(S)y[X]=j j[e]=S return S end end}end

return function(Vargs, GetEnv)
	local env = GetEnv(nil, {script = script})
	setfenv(1, env)

	local _G, game, script, getfenv, setfenv, workspace,
		getmetatable, setmetatable, loadstring, coroutine,
		rawequal, typeof, print, math, warn, error,  pcall,
		xpcall, select, rawset, rawget, ipairs, pairs,
		next, Rect, Axes, os, time, Faces, unpack, string, Color3,
		newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor,
		NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint,
		NumberSequenceKeypoint, PhysicalProperties, Region3int16,
		Vector3int16, require, table, type, wait,
		Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay =
		_G, game, script, getfenv, setfenv, workspace,
		getmetatable, setmetatable, loadstring, coroutine,
		rawequal, typeof, print, math, warn, error,  pcall,
		xpcall, select, rawset, rawget, ipairs, pairs,
		next, Rect, Axes, os, time, Faces, unpack, string, Color3,
		newproxy, tostring, tonumber, Instance, TweenInfo, BrickColor,
		NumberRange, ColorSequence, NumberSequence, ColorSequenceKeypoint,
		NumberSequenceKeypoint, PhysicalProperties, Region3int16,
		Vector3int16, require, table, type, wait,
		Enum, UDim, UDim2, Vector2, Vector3, Region3, CFrame, Ray, delay

	local script = script
	local service = Vargs.Service
	local client = Vargs.Client
	local Anti, Core, Functions, Process, Remote, UI, Variables
	local function Init()
		UI = client.UI;
		Anti = client.Anti;
		Core = client.Core;
		Variables = client.Variables
		Functions = client.Functions;
		Process = client.Process;
		Remote = client.Remote;

		Remote.Init = nil;
	end

	local function RunAfterLoaded()
		--// Report client finished loading
		log("~! Fire client loaded")
		client.Remote.Send("ClientLoaded")

		--// Ping loop
		log("~! Start ClientCheck loop");
		delay(5, function() service.StartLoop("ClientCheck", 30, Remote.CheckClient, true) end)

		--// Get settings
		log("Get settings");
		local settings = client.Remote.Get("Setting",{"G_API","Allowed_API_Calls","HelpButtonImage"})
		if settings then
			client.G_API = settings.G_API
			--client.G_Access = settings.G_Access
			--client.G_Access_Key = settings.G_Access_Key
			--client.G_Access_Perms = settings.G_Access_Perms
			client.Allowed_API_Calls = settings.Allowed_API_Calls
			client.HelpButtonImage = settings.HelpButtonImage
		else
			log("~! GET SETTINGS FAILED?")
			warn("FAILED TO GET SETTINGS FROM SERVER");
		end

		Remote.RunAfterLoaded = nil;
	end

	local function RunLast()
		--[[client = service.ReadOnly(client, {
				[client.Variables] = true;
				[client.Handlers] = true;
				G_API = true;
				G_Access = true;
				G_Access_Key = true;
				G_Access_Perms = true;
				Allowed_API_Calls = true;
				HelpButtonImage = true;
				Finish_Loading = true;
				RemoteEvent = true;
				ScriptCache = true;
				Returns = true;
				PendingReturns = true;
				EncodeCache = true;
				DecodeCache = true;
				Received = true;
				Sent = true;
				Service = true;
				Holder = true;
				GUIs = true;
				LastUpdate = true;
				RateLimits = true;

				Init = true;
				RunLast = true;
				RunAfterInit = true;
				RunAfterLoaded = true;
				RunAfterPlugins = true;
			}, true)--]]

			Remote.RunLast = nil;
	end

	getfenv().client = nil
	getfenv().service = nil
	getfenv().script = nil

	client.Remote = {
		Init = Init;
		RunLast = RunLast;
		RunAfterLoaded = RunAfterLoaded;
		Returns = {};
		PendingReturns = {};
		EncodeCache = {};
		DecodeCache = {};
		Received = 0;
		Sent = 0;

		CheckClient = function()
			if os.time() - Core.LastUpdate >= 10 then
				Remote.Send("ClientCheck", {
					Sent = Remote.Sent or 0;
					Received = Remote.Received;
				}, client.DepsName)
			end
		end;

		Returnables = {
			Test = function(args)
				return "HELLO FROM THE CLIENT SIDE :)! ", unpack(args)
			end;

			Ping = function(args)
				return Remote.Ping()
			end;

			ClientHooked = function(args)
				return Core.Special
			end;

			TaskManager = function(args)
				local action = args[1]
				if action == "GetTasks" then
					local tab = {}
					for i,v in next,service.GetTasks() do
						local new = {}
						new.Status = v.Status
						new.Name = v.Name
						new.Index = v.Index
						new.Created = v.Created
						new.CurrentTime = os.time()
						new.Function = tostring(v.Function)
						table.insert(tab,new)
					end
					return tab
				end
			end;

			LoadCode = function(args)
				local code = args[1]
				local func = Core.LoadCode(code, GetEnv())
				if func then
					return func()
				end
			end;

			Function = function(args)
				local func = client.Functions[args[1]]
				if func and type(func) == "function" then
					return func(unpack(args, 2))
				end
			end;

			Handler = function(args)
				local handler = client.Handlers[args[1]]
				if handler and type(handler) == "function" then
					return handler(unpack(args, 2))
				end
			end;

			UIKeepAlive = function(args)
				if Variables.UIKeepAlive then
					for ind,g in next,client.GUIs do
						if g.KeepAlive then
							if g.Class == "ScreenGui" or g.Class == "GuiMain" then
								g.Object.Parent = service.Player.PlayerGui
							elseif g.Class == "TextLabel" then
								g.Object.Parent = UI.GetHolder()
							end

							g.KeepAlive = false
						end
					end
				end

				return true;
			end;

			UI = function(args)
				local guiName = args[1]
				local themeData = args[2]
				local guiData = args[3]

				Variables.LastServerTheme = themeData or Variables.LastServerTheme;
				return UI.Make(guiName, guiData, themeData)
			end;

			InstanceList = function(args)
				local objects = service.GetAdonisObjects()
				local temp = {}
				for i,v in pairs(objects) do
					table.insert(temp, {
						Text = v:GetFullName();
						Desc = v.ClassName;
					})
				end
				return temp
			end;

			ClientLog = function(args)
				local temp={}
				local function toTab(str, desc, color)
					for i,v in next,service.ExtractLines(str) do
						table.insert(temp, {Text = v; Desc = desc..v; Color = color;})
					end
				end

				for i,v in next,service.LogService:GetLogHistory() do
					local mType = v.messageType
					toTab(v.message, (mType  == Enum.MessageType.MessageWarning and "Warning" or mType  == Enum.MessageType.MessageInfo and "Info" or mType  == Enum.MessageType.MessageError and "Error" or "Output").." - ", mType  == Enum.MessageType.MessageWarning and Color3.new(0.866667, 0.733333, 0.0509804) or mType  == Enum.MessageType.MessageInfo and Color3.new(0.054902, 0.305882, 1) or mType  == Enum.MessageType.MessageError and Color3.new(1, 0.196078, 0.054902))
				end

				return temp
			end;

			LocallyFormattedTime = function(args)
				if type(args[1]) == "table" then
					local results = {}
					for i, t in ipairs(args[1]) do
						results[i] = service.FormatTime(t, select(2, unpack(args)))
					end
					return results
				end
				return service.FormatTime(unpack(args))
			end;
		};

		UnEncrypted = {};

		Commands = {
			GetReturn = function(args)
				print("THE SERVER IS ASKING US FOR A RETURN");
				local com = args[1]
				local key = args[2]
				local parms = {unpack(args, 3)}
				local retfunc = Remote.Returnables[com]
				local retable = (retfunc and {pcall(retfunc,parms)}) or {}
				if retable[1] ~= true then
					logError(retable[2])
					Remote.Send("GiveReturn", key, "__ADONIS_RETURN_ERROR", retable[2])
				else
					print("SENT RETURN");
					Remote.Send("GiveReturn", key, unpack(retable,2))
				end
			end;

			GiveReturn = function(args)
				print("SERVER GAVE US A RETURN")
				if Remote.PendingReturns[args[1]] then
					print("VALID PENDING RETURN")
					Remote.PendingReturns[args[1]] = nil
					service.Events[args[1]]:Fire(unpack(args, 2))
				end
			end;

			SessionData = function(args)
				local sessionKey = args[1];
				if sessionKey then
					service.Events.SessionData:Fire(sessionKey, table.unpack(args, 2))
				end
			end;

			SetVariables = function(args)
				local vars = args[1]
				for var, val in pairs(vars) do
					Variables[var] = val
				end
			end;

			Print = function(args)
				print(unpack(args))
			end;

			FireEvent = function(args)
				service.FireEvent(unpack(args))
			end;

			Test = function(args)
				print("OK WE GOT COMMUNICATION!  ORGL: "..tostring(args[1]))
			end;

			TestError = function(args)
				error("THIS IS A TEST ERROR")
			end;

			TestEvent = function(args)
				Remote.PlayerEvent(args[1],unpack(args,2))
			end;

			LoadCode = function(args)
				local code = args[1]
				local func = Core.LoadCode(code, GetEnv())
				if func then
					return func()
				end
			end;

			LaunchAnti = function(args)
				Anti.Launch(args[1],args[2])
			end;

			UI = function(args)
				local guiName = args[1]
				local themeData = args[2]
				local guiData = args[3]

				Variables.LastServerTheme = themeData or Variables.LastServerTheme;
				UI.Make(guiName,guiData,themeData)
			end;

			RemoveUI = function(args)
				UI.Remove(args[1],args[2])
			end;
				
			RefreshUI = function(args)
				local guiName = args[1]
				local ignore = args[2]
				
				UI.Remove(guiName,ignore)
				
				local themeData = args[3]
				local guiData = args[4]

				Variables.LastServerTheme = themeData or Variables.LastServerTheme;
				UI.Make(guiName,guiData,themeData)
			end;

			StartLoop = function(args)
				local name = args[1]
				local delay = args[2]
				local code = args[3]
				local func = Core.LoadCode(code, GetEnv())
				if name and delay and code and func then
					service.StartLoop(name,delay,func)
				end
			end;

			StopLoop = function(args)
				service.StopLoop(args[1])
			end;

			Function = function(args)
				local func = client.Functions[args[1]]
				if func and type(func) == "function" then
					Pcall(func,unpack(args,2))
				end
			end;

			Handler = function(args)
				local handler = client.Handlers[args[1]]
				if handler and type(handler) == "function" then
					Pcall(handler, unpack(args, 2))
				end
			end;
		};

		Fire = function(...)
			local limits = Process.RateLimits
			local limit = (limits and limits.Remote) or 0.01;
			local RemoteEvent = Core.RemoteEvent;
			local extra = {...};

			if RemoteEvent and RemoteEvent.Object then
				service.Queue("REMOTE_SEND", function()
					Remote.Sent = Remote.Sent+1;
					RemoteEvent.Object:FireServer({Mode = "Fire", Module = client.Module, Loader = client.Loader, Sent = Remote.Sent, Received = Remote.Received}, unpack(extra));
					wait(limit);
				end)
			end
		end;

		Send = function(com,...)
			Core.LastUpdate = os.time()
			Remote.Fire(Remote.Encrypt(com,Core.Key),...)
		end;

		GetFire = function(...)
			local RemoteEvent = Core.RemoteEvent;
			local limits = Process.RateLimits;
			local limit = (limits and limits.Remote) or 0.02;
			local extra = {...};
			local returns;

			if RemoteEvent and RemoteEvent.Function then
				local Yield = service.Yield();

				service.Queue("REMOTE_SEND", function()
					Remote.Sent = Remote.Sent+1;
					delay(0, function() -- Wait for return in new thread; We don't want to hold the entire fire queue up while waiting for one thing to return since we just want to limit fire speed;
						returns = {
							RemoteEvent.Function:InvokeServer({
								Mode = "Get",
								Module = client.Module,
								Loader = client.Loader,
								Sent = Remote.Sent,
								Received = Remote.Received
							}, unpack(extra))
						}

						Yield:Release(returns);
					end)

					wait(limit)
				end)

				if not returns then
					Yield:Wait();
				end

				Yield:Destroy();

				if returns then
					return unpack(returns)
				end
			end
		end;

		RawGet = function(...)
			local extra = {...};
			local RemoteEvent = Core.RemoteEvent;
			if RemoteEvent and RemoteEvent.Function then
				Remote.Sent = Remote.Sent+1;
				return RemoteEvent.Function:InvokeServer({Mode = "Get", Module = client.Module, Loader = client.Loader, Sent = Remote.Sent, Received = Remote.Received}, unpack(extra));
			end
		end;

		Get = function(com,...)
			Core.LastUpdate = os.time()
			local ret = Remote.GetFire(Remote.Encrypt(com,Core.Key),...)
			if type(ret) == "table" then
				return unpack(ret);
			else
				return ret;
			end
		end;

		OldGet = function(com,...)
			local returns
			local key = Functions:GetRandom()
			local waiter = service.New("BindableEvent");
			local event = service.Events[key]:Connect(function(...) print("WE ARE GETTING A RETURN!") returns = {...} waiter:Fire() wait() waiter:Fire() waiter:Destroy() end)

			Remote.PendingReturns[key] = true
			Remote.Send("GetReturn",com,key,...)
			print(string.format("GETTING RETURNS? %s", tostring(returns)))
			--returns = returns or {event:Wait()}
			waiter.Event:Wait();
			print(string.format("WE GOT IT! %s", tostring(returns)))

			event:Disconnect()

			if returns then
				if returns[1] == "__ADONIS_RETURN_ERROR" then
					error(returns[2])
				else
					return unpack(returns)
				end
			else
				return nil
			end
		end;

		Ping = function()
			local t = time()
			local ping = Remote.Get("Ping")
			if not ping then return false end
			local t2 = time()
			local mult = 10^3
			local ms = ((math.floor((t2-t)*mult+0.5)/mult)*1000)
			return ms
		end;

		PlayerEvent = function(event,...)
			Remote.Send("PlayerEvent",event,...)
		end;

		Encrypt = function(str, key, cache)
			cache = cache or Remote.EncodeCache or {}

			if not key or not str then
				return str
			elseif cache[key] and cache[key][str] then
				return cache[key][str]
			else
				local byte = string.byte
				local sub = string.sub
				local char = string.char

				local keyCache = cache[key] or {}				
				local endStr = {}

				for i = 1, #str do
					local keyPos = (i % #key) + 1
					endStr[i] = char(((byte(sub(str, i, i)) + byte(sub(key, keyPos, keyPos)))%126) + 1)
				end

				endStr = table.concat(endStr)
				cache[key] = keyCache
				keyCache[str] = endStr
				return endStr
			end
		end;

		Decrypt = function(str, key, cache)
			cache = cache or Remote.DecodeCache or {}

			if not key or not str then
				return str
			elseif cache[key] and cache[key][str] then
				return cache[key][str]
			else
				local keyCache = cache[key] or {}
				local byte = string.byte
				local sub = string.sub
				local char = string.char
				local endStr = {}

				for i = 1, #str do
					local keyPos = (i % #key)+1
					endStr[i] = char(((byte(sub(str, i, i)) - byte(sub(key, keyPos, keyPos)))%126) - 1)
				end

				endStr = table.concat(endStr)
				cache[key] = keyCache
				keyCache[str] = endStr
				return endStr
			end
		end;
	}
end
