Pinkstack/roblox-luau-corpus-text huggingface dataset:
----------------------------------------------------------------------------------------------------
--------------------=[ CFRAME ]=--------------------------------------------------------------------
----------------------------------------------------------------------------------------------------


	,EnableHolster = true
	,HolsterTo = 'UpperTorso'	-- Put the name of the body part you wanna holster to
	,HolsterPos = CFrame.new(0.4,-0.4,-0.6) * CFrame.Angles(math.rad(90),math.rad(120),math.rad(-90))-- x, y, and z | Up, left right, and rotate, only change the middle value of CFrame.Angles to change where gun is pointed

	
	,RightArmPos = CFrame.new(-.875, -0.2, -1.25) * CFrame.Angles(math.rad(-90), math.rad(0), math.rad(0))	--Server
	,LeftArmPos = CFrame.new(1.2,-0.05,-1.65) * CFrame.Angles(math.rad(-120),math.rad(35),math.rad(-25))	--server
	
	,ServerGunPos = CFrame.new(-.3, -1, -0.4) * CFrame.Angles(math.rad(-90), math.rad(0), math.rad(0))
	,GunPos = CFrame.new(0.15, -0.15, 1) * CFrame.Angles(math.rad(90), math.rad(0), math.rad(0))

	,RightPos = CFrame.new(-.875, -0.2, -1.25) * CFrame.Angles(math.rad(-90), math.rad(0), math.rad(0))	--Client
	,LeftPos = CFrame.new(0.85, 0.5,-2.2) * CFrame.Angles(math.rad(-120),math.rad(20),math.rad(-25))	--Client
}

return Config
--[[ SCRIPT VARIABLES ]]


local CHAT_BUBBLE_FONT = Enum.Font.GothamSemibold
local CHAT_BUBBLE_FONT_SIZE = Enum.FontSize.Size24 -- if you change CHAT_BUBBLE_FONT_SIZE_INT please change this to match
local CHAT_BUBBLE_FONT_SIZE_INT = 24 -- if you change CHAT_BUBBLE_FONT_SIZE please change this to match
local CHAT_BUBBLE_LINE_HEIGHT = CHAT_BUBBLE_FONT_SIZE_INT + 10
local CHAT_BUBBLE_TAIL_HEIGHT = 14
local CHAT_BUBBLE_WIDTH_PADDING = 30
local CHAT_BUBBLE_FADE_SPEED = 1.5

local BILLBOARD_MAX_WIDTH = 400
local BILLBOARD_MAX_HEIGHT = 250	--This limits the number of bubble chats that you see above characters

local ELIPSES = "..."
local MaxChatMessageLength = 128 -- max chat message length, including null terminator and elipses.
local MaxChatMessageLengthExclusive
if FFlagUserChatNewMessageLengthCheck2 then
	MaxChatMessageLengthExclusive = MaxChatMessageLength - getMessageLength(ELIPSES) - 1
else
	MaxChatMessageLengthExclusive = MaxChatMessageLength - string.len(ELIPSES) - 1
end

local NEAR_BUBBLE_DISTANCE = 65	--previously 45
local MAX_BUBBLE_DISTANCE = 100	--previously 80
-- Module 4


function NpcModule.CalculeWalk(NPC, Range, MinVector, MaxVector, Minrange)
	local MinRange = 0
	
	if Minrange == nil then
		MinRange = 1.7
	else
	   MinRange = Minrange
	end
	
	-- Calcules	
	local X = math.random(-(Range), Range)
	local Z = math.random(-(Range), Range)
	
	if X < (Range/MinRange) and X >= 0 then
		X = Range/MinRange
	elseif X > (-Range/MinRange) and X < 0 then
		X = -Range/MinRange
	end
	
	if Z < (Range/MinRange) and Z >= 0 then
		Z = Range/MinRange
	elseif Z > (-Range/MinRange) and Z < 0 then
		Z = -Range/MinRange
	end

	X = NPC.PrimaryPart.Position.X + X
	Z = NPC.PrimaryPart.Position.Z + Z
	
	if MinVector ~= nil or MaxVector ~= nil then
		if X < MinVector.X then
			X = MinVector.X
		elseif X > MaxVector.X then
			X = MaxVector.X
		end

		if Z < MinVector.Z then
			Z = MinVector.Z
		elseif Z > MaxVector.Z then
			Z = MaxVector.Z
		end
	end

	local Pos = Vector3.new(X, NpcModule.RayY(X,Z,NPC) , Z)
	return Pos
end
-- Testing AC FE support



local event = script.Parent
local car=script.Parent.Parent
local LichtNum = 0


event.OnServerEvent:connect(function(player,data)
	if data['ToggleLight'] then
		if car.Body.Light.on.Value==true then
			car.Body.Light.on.Value=false
		else
			car.Body.Light.on.Value=true
		end
	elseif data['EnableBrakes'] then
		car.Body.Brakes.on.Value=true
	elseif data['DisableBrakes'] then
		car.Body.Brakes.on.Value=false
	elseif data['ToggleLeftBlink'] then
		if car.Body.Left.on.Value==true or car.Body.Right.on.Value==true then
			car.Body.Left.on.Value=false
			car.Body.Right.on.Value=false
		else
			car.Body.Left.on.Value=true
		end
	elseif data['ToggleRightBlink'] then
		if car.Body.Right.on.Value==true or car.Body.Left.on.Value==true then
			car.Body.Right.on.Value=false
			car.Body.Left.on.Value=false
		else
			car.Body.Right.on.Value=true
		end
	elseif data['ReverseOn'] then
		car.Body.Reverse.on.Value=true
	elseif data['ReverseOff'] then
		car.Body.Reverse.on.Value=false
	elseif data['ToggleStandlicht'] then
		if LichtNum == 0 then
			LichtNum = 1
			car.Body.Headlight.on.Value = true
		elseif LichtNum == 1 then
			LichtNum = 0
			car.Body.Headlight.on.Value = false
		end
	elseif data["ToggleHazards"] then
		if car.Body.Left.on.Value == true or car.Body.Right.on.Value==true then
			car.Body.Left.on.Value=false
			car.Body.Right.on.Value=false	
		else
			car.Body.Left.on.Value=true
			car.Body.Right.on.Value=true
		end
	end
end)
-- Local variables


local tool = script.Parent
local muzzle = tool.Muzzle
local currentAmmo	-- current ammo amount in clip
local ammoLeft		-- how much ammo you have left besides what's in your current clip
local remainingAmmo	-- used during reloading to keep track of ammo in old clip
local canFire = true
local reloading = false
local fireSound = muzzle.FireSound

local player = players:GetPlayerFromCharacter(tool.Parent)
while not player do
	tool.AncestryChanged:wait()
	player = players:GetPlayerFromCharacter(tool.Parent)
end

local equipped = false

repeat wait() until player.Character
--Weld stuff here



car.DriveSeat.ChildAdded:connect(function(child)
	if child.Name=="SeatWeld" and child:IsA("Weld") and game.Players:GetPlayerFromCharacter(child.Part1.Parent)~=nil then
		child.C0=CFrame.new(0,-.5,0)*CFrame.fromEulerAnglesXYZ(-(math.pi/2),0,0)*CFrame.Angles(math.rad(13),0,0)
	end
end)

MakeWeld(misc.Wiper.Hinge,car.DriveSeat,"Motor",.1)
ModelWeld(misc.Wiper.Parts,misc.Wiper.Hinge)
MakeWeld(misc.Wiper2.Hinge,car.DriveSeat,"Motor",.1)
ModelWeld(misc.Wiper2.Parts,misc.Wiper2.Hinge)

MakeWeld(car.Misc.Wheel.A,car.DriveSeat,"Motor",.5).Name="W"
ModelWeld(car.Misc.Wheel.Parts,car.Misc.Wheel.A)

MakeWeld(car.Misc.Tach.M,car.DriveSeat,"Motor").Name="M"
ModelWeld(misc.Tach.Parts,misc.Tach.M)
MakeWeld(car.Misc.Speedo.N,car.DriveSeat,"Motor").Name="N"
ModelWeld(misc.Speedo.Parts,misc.Speedo.N)
--Data


export type SubtitleData = {
    Time: number?,
    Duration: number?,
    Message: string,
    MessageColor: Color3?,
    Speaker: string?,
    SpeakerModifier: string?,
    SpeakerDisplayName: string?,
    SpeakerColor: Color3?,
    Level: string | number?,
    Macro: string?,
}

export type SubtitleSpeaker = {
    Color: Color3?,
    DisplayName: string?,
    Modifiers: {[string]: {Color: Color3?, DisplayName: string?}}?,
}

export type SubtitleDataModule = {
    Speakers: {[string]: SubtitleSpeaker},
    Macros: {[string]: SubtitleData},
    Levels: {[string]: number},
}
-- functions



function stopAllAnimations()
    local oldAnim = currentAnim

    -- return to idle if finishing an emote
    if (emoteNames[oldAnim] ~= nil and emoteNames[oldAnim] == false) then
        oldAnim = "idle"
    end

    currentAnim = ""
    currentAnimInstance = nil
    if (currentAnimKeyframeHandler ~= nil) then
        currentAnimKeyframeHandler:disconnect()
    end

    if (currentAnimTrack ~= nil) then
        currentAnimTrack:Stop()
        currentAnimTrack:Destroy()
        currentAnimTrack = nil
    end
    return oldAnim
end

function setAnimationSpeed(speed)
    if speed ~= currentAnimSpeed then
        currentAnimSpeed = speed
        currentAnimTrack:AdjustSpeed(currentAnimSpeed)
    end
end

function keyFrameReachedFunc(frameName)
    if (frameName == "End") then

        local repeatAnim = currentAnim
        -- return to idle if finishing an emote
        if (emoteNames[repeatAnim] ~= nil and emoteNames[repeatAnim] == false) then
            repeatAnim = "idle"
        end

        local animSpeed = currentAnimSpeed
        playAnimation(repeatAnim, 0.0, Humanoid)
        setAnimationSpeed(animSpeed)
    end
end
-- Handle remote functions/events


function runStarting(player)
	if player.Character then
		if player.Character:FindFirstChild("FastStartScript") then
			player.Character.FastStartScript.Disabled = false
		end
	end
end
game.ReplicatedStorage.RemoteEvents.RunStarting.OnServerEvent:connect(runStarting)

local behaviourModules = {}

coroutine.wrap(function()
	for _, behaviourScript in ipairs(script.Behaviours:GetChildren()) do
		local success, errMessage = pcall(function()
			behaviourModules[behaviourScript.Name] = require(behaviourScript)
		end)
		if not success then
			warn("Failed to load module" ..behaviourScript.Name.. ".\n" ..errMessage)
		end
	end
end)()

function executeBehaviour(player, character, brickTouched, behaviourName)
	if behaviourModules[behaviourName] ~= nil then
		behaviourModules[behaviourName]:ExecuteBehaviour(brickTouched, character)
	end
end
game.ReplicatedStorage.RemoteEvents.ExecuteBehaviour.OnServerEvent:connect(executeBehaviour)
--edit the function below to return true when you want this response/prompt to be valid
--player is the player speaking to the dialogue, and dialogueFolder is the object containing the dialogue data


return function(player, dialogueFolder)
	local ClassInformationTable = require(game.ReplicatedStorage.Source.Modules.CharacterScripts.Classes.ClassInformation)
	return (not ClassInformationTable:GetClassFolder(player,"Brawler").Obtained.Value)
end
--Key Function
--if(string.byte(key) == --BYTE--) then 


function onKeyDown(key,mo)
	print(key)
	if (key~=nil) then
		key = key:lower()
		local vehicle = findPlane(game:GetService("Players").LocalPlayer)
		if (vehicle==nil) then return end
		plane = vehicle.Parts
		local engine = vehicle.Parts.Engine
		--STOP THAT SONG IN MY HEAD!!!! WHAAA!!
--[[
	Server Module
--]]



local Settings = { --, not ; ? | server module!!
	 BulletHoleTexture = 'http://www.roblox.com/asset/?id=64291961'
	,Damage = {30, 39}
	,OneHanded = false --DONT USE YET
	,FakeArms = true
    ,FakeArmTransparency = 0
    ,RightPos = CFrame.new(-1,0.7,0.45) * CFrame.Angles(math.rad(-90), 0, 0)
	,LeftPos = CFrame.new(0.8,0.8,0.3) * CFrame.Angles(math.rad(-90), math.rad(45), 0)
}

return Settings
-- // WHILE LOOP



while true do
	local Sprinting = Shadow:GetAttribute("Sprinting")
	if Sprinting == false then
		Debounce = false
		SprintAnim:Stop()
	elseif Sprinting == true then
		if not Debounce then
			Debounce = true
			SprintAnim:Play()
		end
	end
	task.wait()
end
----------------------------------------------------------------------------------------------------
-------------------=[ PROJETIL ]=-------------------------------------------------------------------
----------------------------------------------------------------------------------------------------


	,Distance = 10000
	,BDrop = .25
	,BSpeed = 2200

	,SuppressMaxDistance = 25	--- Studs
	,SuppressTime = 10			--- Seconds

	,BulletWhiz = true
	,BWEmitter = 25
	,BWMaxDistance = 200
	
	,BulletFlare = false
	,BulletFlareColor = Color3.fromRGB(255,255,255)

	,Tracer = true
	,TracerColor = Color3.fromRGB(255,255,255)
	,TracerLightEmission = 1
	,TracerLightInfluence = 0
	,TracerLifeTime = .2
	,TracerWidth = .1
	,RandomTracer = false
	,TracerEveryXShots = 0
	,TracerChance = 100
	
	,BulletLight = false
	,BulletLightBrightness = 1
	,BulletLightColor = Color3.fromRGB(255,255,255)
	,BulletLightRange = 10

	,ExplosiveHit = false
	,ExPressure = 500
	,ExpRadius = 25
	,DestroyJointRadiusPercent = 0	--- Between 0 & 1
	,ExplosionDamage = 100

	,LauncherDamage = {20,40}
	,LauncherRadius = 25
	,LauncherPressure = 500
	,LauncherDestroyJointRadiusPercent = 0
--[[Transmission]]


	Tune.TransModes		= {"Semi"}												--[[
	[Modes]
		"Auto"		: Automatic shifting
		"Semi"		: Clutchless manual shifting, dual clutch transmission
		"Manual"	: Manual shifting with clutch
		
		>Include within brackets
			eg: {"Semi"} or {"Auto", "Manual"}								
		>First mode is default mode													]]
	
	--Automatic Settings
	Tune.AutoShiftMode	= "Speed"												--[[
	[Modes]
		"Speed"		: Shifts based on wheel speed
		"RPM"		: Shifts based on RPM											]]	
	Tune.AutoUpThresh	= -200		--Automatic upshift point 	(relative to peak RPM, positive = Over-rev)
	Tune.AutoDownThresh = 1400		--Automatic downshift point (relative to peak RPM, positive = Under-rev)
	
	--Gear Ratios
	Tune.FinalDrive		= 3.97			-- Gearing determines top speed and wheel torque
	Tune.Ratios			= {				-- Higher ratio = more torque, Lower ratio = higher top speed
		--[[Reverse]]	3.42		,	-- Copy and paste a ratio to add a gear
		--[[Neutral]]	0			,	-- Ratios can also be deleted
		--[[ 1 ]]		3.75		,	-- Reverse, Neutral, and 1st gear are required
		--[[ 2 ]]		2.10		,
		--[[ 3 ]]		1.40		,
		--[[ 4 ]]		1.00		,
		--[[ 5 ]]		0.71		,
		--[[ 6 ]]		0.61			,
		--[[ 7 ]]		0.51		,
	}
	Tune.FDMult			= 1			-- Ratio multiplier (Change this value instead of FinalDrive if car is struggling with torque ; Default = 1)
-- Display name in report when matcher fails same as in snapshot file,
-- but with optional hint argument in bold weight.


local function printSnapshotName(concatenatedBlockNames_: string?, hint_: string?, count: number): string
	local concatenatedBlockNames = if concatenatedBlockNames_ then concatenatedBlockNames_ else ""
	local hint = if hint_ then hint_ else ""
	local hasNames = concatenatedBlockNames:len() ~= 0
	local hasHint = #hint ~= 0

	local retval = "Snapshot name: `"
	if hasNames then
		retval = retval .. utils.escapeBacktickString(concatenatedBlockNames)
	end

	if hasNames and hasHint then
		retval = retval .. ": "
	end

	if hasHint then
		retval = retval .. BOLD_WEIGHT(utils.escapeBacktickString(hint))
	end

	retval = retval .. " " .. count .. "`"

	return retval
end
--[[
	   ___  _____
	  / _ |/ ___/	Avxnturador | Novena
	 / __ / /__			 LuaInt | Novena
	/_/ |_\___/   Build 6C, Version 1.5, Update 2
	
	Please install this chassis from scratch.
	More info can be found in the README.
	
	New values will have (Username) appended to the end of the description.
]]



local Tune = {}
--This device is entirely open-source.



Light = script.Parent.Light
Scanner = script.Parent.Scanner
Host = script.Parent.Parent.Parent.Events.DoorOpen


function verify(card)
	if card == nil then
		return false
	else
		Host.BypassLevel.Value = true
		Host:Fire()
		Light.Color = Color3.new(0,1,0)
		wait(2)
		Light.Color = Color3.new(1,0,0)
	end
end
Scanner.Touched:Connect(verify)
--[[Susupension]]


	Tune.SusEnabled		= true		-- works only in with PGSPhysicsSolverEnabled, defaults to false when PGS is disabled
	
	--Front Suspension
	Tune.FSusDamping	= 300		-- Spring Dampening
	Tune.FSusStiffness	= 8000		-- Spring Force
	Tune.FAntiRoll 		= 50		-- Anti-Roll (Gyro Dampening)
	
	Tune.FSusLength		= 2.2			-- Suspension length (in studs)
	Tune.FPreCompress	= .95		-- Pre-compression adds resting length force
	Tune.FExtensionLim	= 1.1		-- Max Extension Travel (in studs)
	Tune.FCompressLim	= .1		-- Max Compression Travel (in studs)
	Tune.FSusAngle		= 90		-- Suspension Angle (degrees from horizontal)
		
	Tune.FWsBoneLen		= 5			-- Wishbone Length
	Tune.FWsBoneAngle	= 0.5		-- Wishbone angle (degrees from horizontal)
	Tune.FAnchorOffset	= {			-- Suspension anchor point offset (relative to center of wheel)
	 --[[Lateral]]		-.4		,	-- positive = outward
	 --[[Vertical]]		-0.3		,	-- positive = upward
	 --[[Forward]]		0		}	-- positive = forward
	
	--Rear Suspension
	Tune.RSusDamping	= 300		-- Spring Dampening
	Tune.RSusStiffness	= 8000		-- Spring Force
	Tune.FAntiRoll 		= 50		-- Anti-Roll (Gyro Dampening)

	Tune.RSusLength		= 2.2		-- Suspension length (in studs)
	Tune.RPreCompress	= .7		-- Pre-compression adds resting length force
	Tune.RExtensionLim	= 1.1		-- Max Extension Travel (in studs)
	Tune.RCompressLim	= .1		-- Max Compression Travel (in studs)
	Tune.RSusAngle		= 90		-- Suspension Angle (degrees from horizontal)
		
	Tune.RWsBoneLen		= 5			-- Wishbone Length
	Tune.RWsBoneAngle	= 0.5			-- Wishbone angle (degrees from horizontal)
	Tune.RAnchorOffset	= {			-- Suspension anchor point offset (relative to center of wheel)
	 --[[Lateral]]		-.4		,	-- positive = outward
	 --[[Vertical]]		-0.3		,	-- positive = upward
	 --[[Forward]]		0		}	-- positive = forward
	--Aesthetics	
	Tune.SusVisible		= false			-- Spring Visible
	Tune.WsBVisible		= true			-- Wishbone Visible
	Tune.SusRadius		= .2			-- Suspension Coil Radius
	Tune.SusThickness	= .1			-- Suspension Coil Thickness
	Tune.SusColor		= "Bright red"	-- Suspension Color [BrickColor]
	Tune.SusCoilCount	= 6				-- Suspension Coil Count
	Tune.WsColor		= "Black"		-- Wishbone Color [BrickColor]
	Tune.WsThickness	= .1			-- Wishbone Rod Thickness
--[[ @brief Pulls all key-value pairs from 'draw' so long as they don't already exist in 'origin'.
     @param origin The table to modify (this is in-place).
     @param draw The table to pull into 'origin'.
     @return A reference to 'origin'. It will have all keys defined which are defined in origin or draw.
--]]


function module.Incorporate(origin, draw)
	for i, v in pairs(draw) do
		if origin[i] == nil then
			origin[i] = v;
		end
	end
	return origin;
end

function module.StableSort(t, compare)
	for i = 1, #t do
		local j = 1;
		while j < i and not compare(t[i], t[j]) do
			j = j + 1;
		end
		for k = i - 1, j, -1 do
			t[k], t[k+1] = t[k+1], t[k];
		end
	end
end

function module.ConvertArrayToMap(t)
	local s = {};
	for i = 1, #t do
		s[t[i]] = true;
	end
	return s;
end

return module
--------LIGHTED RECTANGLES--------



game.Workspace.pillar1.BrickColor = BrickColor.new(game.Workspace.Lighting.cyan.Value)
game.Workspace.pillar2.BrickColor = BrickColor.new(game.Workspace.Lighting.cyan.Value)
game.Workspace.pillar3.BrickColor = BrickColor.new(game.Workspace.Lighting.cyan.Value)
game.Workspace.pillar4.BrickColor = BrickColor.new(game.Workspace.Lighting.cyan.Value)
game.Workspace.pillar5.BrickColor = BrickColor.new(game.Workspace.Lighting.cyan.Value)
game.Workspace.pillar6.BrickColor = BrickColor.new(game.Workspace.Lighting.cyan.Value)
game.Workspace.pillar7.BrickColor = BrickColor.new(game.Workspace.Lighting.cyan.Value)
game.Workspace.pillar8.BrickColor = BrickColor.new(game.Workspace.Lighting.cyan.Value)
--[[ 

HOW TO USE IT:
- 1: Use CollectionService to tag the character you want to ragdoll with the tag "Ragdoll";
- 2: Once tagged the character will instantly go to ragdoll state;
- 3: To return from ragdoll, remove the tag.

If you're using my Misc module and you have the ChildAdded checks inside your NPCs or Dummies like mine,
you can just require the Misc module and use the miscModule.Ragdoll(Target, Duration) function.

--]]
-- ROBLOX TODO: Use Symbol again once jest-mock knows to exclude the LuauPolyfill module from being reset
-- deviation: In Lua, Symbol will be a callable table, not a function
-- if typeof(Symbol) == "table" and Symbol.for_ ~= nil then
--   local symbolFor = Symbol.for_
--   exports.REACT_ELEMENT_TYPE = symbolFor('react.element')
--   exports.REACT_PORTAL_TYPE = symbolFor('react.portal')
--   exports.REACT_FRAGMENT_TYPE = symbolFor('react.fragment')
--   exports.REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode')
--   exports.REACT_PROFILER_TYPE = symbolFor('react.profiler')
--   exports.REACT_PROVIDER_TYPE = symbolFor('react.provider')
--   exports.REACT_CONTEXT_TYPE = symbolFor('react.context')
--   exports.REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref')
--   exports.REACT_SUSPENSE_TYPE = symbolFor('react.suspense')
--   exports.REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list')
--   exports.REACT_MEMO_TYPE = symbolFor('react.memo')
--   exports.REACT_LAZY_TYPE = symbolFor('react.lazy')
--   exports.REACT_BLOCK_TYPE = symbolFor('react.block')
--   exports.REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block')
--   exports.REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental')
--   exports.REACT_SCOPE_TYPE = symbolFor('react.scope')
--   exports.REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id')
--   exports.REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode')
--   exports.REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen')
--   exports.REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden')
-- end
--[=[
	@return Promise
	Starts Knit. Should only be called once.

	Optionally, `KnitOptions` can be passed in order to set
	Knit's custom configurations.

	:::caution
	Be sure that all services have been created _before_
	calling `Start`. Services cannot be added later.
	:::

	```lua
	Knit.Start():andThen(function()
		print("Knit started!")
	end):catch(warn)
	```
	
	Example of Knit started with options:
	```lua
	Knit.Start({
		Middleware = {
			Inbound = {
				function(player, args)
					print("Player is giving following args to server:", args)
					return true
				end
			},
		},
	}):andThen(function()
		print("Knit started!")
	end):catch(warn)
	```
]=]


function KnitServer.Start(options: KnitOptions?)
	if started then
		return Promise.reject("Knit already started")
	end

	started = true

	if options == nil then
		selectedOptions = defaultOptions
	else
		assert(typeof(options) == "table", `KnitOptions should be a table or nil; got {typeof(options)}`)
		selectedOptions = options
		for k, v in defaultOptions do
			if selectedOptions[k] == nil then
				selectedOptions[k] = v
			end
		end
	end

	return Promise.new(function(resolve)
		local knitMiddleware = if selectedOptions.Middleware ~= nil then selectedOptions.Middleware else {}

		-- Bind remotes:
		for _, service in services do
			local middleware = if service.Middleware ~= nil then service.Middleware else {}
			local inbound = if middleware.Inbound ~= nil then middleware.Inbound else knitMiddleware.Inbound
			local outbound = if middleware.Outbound ~= nil then middleware.Outbound else knitMiddleware.Outbound
			service.Middleware = nil
			for k, v in service.Client do
				if type(v) == "function" then
					service.KnitComm:WrapMethod(service.Client, k, inbound, outbound)
				elseif v == SIGNAL_MARKER then
					service.Client[k] = service.KnitComm:CreateSignal(k, inbound, outbound)
				elseif type(v) == "table" and v[1] == PROPERTY_MARKER then
					service.Client[k] = service.KnitComm:CreateProperty(k, v[2], inbound, outbound)
				end
			end
		end

		-- Init:
		local promisesInitServices = {}
		for _, service in services do
			if type(service.KnitInit) == "function" then
				table.insert(
					promisesInitServices,
					Promise.new(function(r)
						debug.setmemorycategory(service.Name)
						service:KnitInit()
						r()
					end)
				)
			end
		end

		resolve(Promise.all(promisesInitServices))
	end):andThen(function()
		-- Start:
		for _, service in services do
			if type(service.KnitStart) == "function" then
				task.spawn(function()
					debug.setmemorycategory(service.Name)
					service:KnitStart()
				end)
			end
		end

		startedComplete = true
		onStartedComplete:Fire()

		task.defer(function()
			onStartedComplete:Destroy()
		end)

		-- Expose service remotes to everyone:
		knitRepServiceFolder.Parent = script.Parent
	end)
end
--[[
primaryWeaponSlot.ChildRemoved:Connect(function(newChild)
	weapon1Label.BackgroundColor3 = onColor
end)
secondaryWeaponSlot.ChildRemoved:Connect(function(newChild)
	weapon2Label.BackgroundColor3 = onColor
end)
tertiaryWeaponSlot.ChildRemoved:Connect(function(newChild)
	weapon3Label.BackgroundColor3 = onColor
end)
--]]


localPlayer.CharacterAdded:Connect(function(newCharacter)
	character = newCharacter
end)
-- settings.AntiHumanoidDeletion and settings.ProtectHats have been superseded Workspace.RejectCharacterDeletions 



settings.AntiSpeed = true 			-- (Client-Sided) Attempts to detect speed exploits
settings.AntiBuildingTools = false	-- (Client-Sided) Attempts to detect any HopperBin(s)/Building Tools added to the client
settings.AntiAntiIdle = false 		-- (Client-Sided) Kick the player if they are using an anti-idle exploit. Highly useful for grinding/farming games
settings.ExploitGuiDetection = false 		-- (Client-Sided) If any exploit GUIs are found in the CoreGui the exploiter gets kicked (If you use StarterGui:SetCore("SendNotification") with an image this will kick you)