Roblox/luau_corpus huggingface dataset:
--returns the wielding player of this tool
function getPlayer()
	local char = Tool.Parent
	return game:GetService("Players"):GetPlayerFromCharacter(Character)
end

function Toss(direction)
	local handlePos = Vector3.new(Tool.Handle.Position.X, 0, Tool.Handle.Position.Z)
	local spawnPos = Character.Head.Position
	
	spawnPos  = spawnPos + (direction * 5)
	
	local Object = Tool.Handle:Clone()
	Object.Burn.Attachment.Debris.Enabled = true
	Object.ThinkFast:Destroy()
	Object.Parent = workspace
	Object.Swing.Pitch = Random.new():NextInteger(90, 110)/100
	Object.Swing:Play()
	Object.CanCollide = true
	Object.CFrame = Tool.Handle.CFrame
	Object.Velocity = (direction*AttackVelocity) + Vector3.new(0,AttackVelocity/7.5,0)
	Object.Trail.Enabled = true
	
	local rand = 11.25
	Object.RotVelocity = Vector3.new(Random.new():NextNumber(-rand,rand),Random.new():NextNumber(-rand,rand),Random.new():NextNumber(-rand,rand))
	Object:SetNetworkOwner(getPlayer())
	
	local ScriptClone = DamageScript:Clone()
	ScriptClone.Parent = Object
	ScriptClone.Disabled = false
	
	local tag = Instance.new("ObjectValue")
	tag.Value = getPlayer()
	tag.Name = "creator"
	tag.Parent = Object
end


PowerRemote.OnServerEvent:Connect(function(player, Power)
	local holder = getPlayer()
	if holder ~= player then return end
	
	AttackVelocity = Power
end)

TossRemote.OnServerEvent:Connect(function(player, mousePosition)
	local holder = getPlayer()
	if holder ~= player then return end
	
	if Cooldown.Value == true then return end
	Cooldown.Value = true
	
	if Humanoid and Humanoid.RigType == Enum.HumanoidRigType.R15 then
		TossRemote:FireClient(getPlayer(), "PlayAnimation", "Animation")
	end
	local targetPos = mousePosition.p
	local lookAt = (targetPos - Character.Head.Position).unit
	
	local SecretRNG = Random.new():NextInteger(1,10) --Change RNG value here
	if SecretRNG == 1 then
		local ChucklenutsSound = Tool.Handle.ThinkFast:Play()
	end
	
	Toss(lookAt)
	
	task.wait(CooldownTime)
	Cooldown.Value = false
end)

Tool.Equipped:Connect(function()
	Character = Tool.Parent
	Humanoid = Character:FindFirstChildOfClass("Humanoid")
end)

Tool.Unequipped:Connect(function()
	Character = nil
	Humanoid = nil
end)
-------------------Start_and_Stop-------------------



		

		if (key==keys.stop.code) and planedebounce == false and (on == true) then--if Shutting down
				local PS = script.Parent.Parent.Parent.PlayerGui:findFirstChild("PlaneStats").Frame
				PS.EngineOff.Label.Text = "ENGINE OFF"
				plane.Engine.Spin:Stop()
				local spd = plane.Engine:findFirstChild("Speed")
				if (spd ~= nil) then
				spd.Value = 0
				end
				local spd = plane.Engine:findFirstChild("VerticalSpeed")
				if (spd ~= nil) then
				spd.Value = 0
				end
						plane.Stand.CanCollide = true
				plane.Engine.BodyVelocity.maxForce = Vector3.new(0,0,0)
					local mod = plane:findFirstChild("Rotors")
					for i,v in pairs(mod:GetChildren()) do 
					if(v.Name == "RotorOff") then
					v.Transparency = 0
					v.CanCollide = true
					elseif(v.Name == "RotorOn") then
					v.Spin.inc.Value = 0
					v.Spin.inc.Value = 0
					end
					end
				
					on = false
					Mousefollow=false
				end 
     	if (key==keys.start.code) and (on == false) and startLock then
				local PS = script.Parent.Parent.Parent.PlayerGui:findFirstChild("PlaneStats").Frame
				plane.Engine.StartUp:Play()
				PS.EngineOff.Label.Text = "Starting Up"
				local s = Instance.new("Smoke") 
				s.Color = Color3.new(128,128,128)
				s.Size = .1
				s.RiseVelocity = 9
				s.Opacity = .3
				s.Parent = plane.SmokeA
				s.Enabled = true
				wait(10)
				plane.Engine.StartUp:Stop()
				if (plane.Engine:findFirstChild("Speed") == nil) then 
				local speed = script.Parent.Speed:clone()
				speed.Parent = plane.Engine
				end 
						plane.Stand.CanCollide = false 
						
						game.Debris:AddItem(s,2)
						local mod = plane:findFirstChild("Rotors")
						plane.Engine.Spin:Play()
						for i,v in pairs(mod:GetChildren()) do
						if(v.Name == "RotorOff") then
						v.Transparency = 1
						v.CanCollide = false
						elseif(v.Name == "RotorOn") then 
							local spininc = 0
							for i = 0, 40, .5 do
								wait()
								v.Spin.inc.Value = i
								v.Spin.inc.Value = i
							end
						end
						end 
						plane.Engine.BodyVelocity.maxForce = Vector3.new(1e+012,1e+012,1e+012)
					on = true
				end
		
				if(key == "q") then 
					startLock = true
				end
-- Set up the event handlers for the Close TextButtons in the windows
for _, window in ipairs(gui:GetChildren()) do
	if window:IsA("Frame") then
		local closeButton = window:FindFirstChild("Close")
		if closeButton and closeButton:IsA("TextButton") then
			closeButton.MouseButton1Click:Connect(function()
				openGui.Visible = true
				window:TweenSizeAndPosition(
					UDim2.new(1, 0, 0.022, 0),
					UDim2.new(0.0, 0, 0.978, 0),
					'Out',
					'Quad',
					0.2,
					false,
					function()
						window.Visible = false
					end
				)
			end)
		end
	end
end
----------------------------------
------------VARIABLES-------------
----------------------------------

User = nil

Connector = game.Workspace:FindFirstChild("GlobalPianoConnector")
if not Connector or not Connector:IsA("RemoteEvent") then
	error("The piano requires a RemoteEvent named GlobalPianoConnector to be in Workspace.")
end
--[[ Please do not delete this module
	
	
	Novena Constraint Type: Motorcycle
	The Bike Chassis, Beta Build: 1
	
				Avxnturador | Novena
					RikOne2 | Enjin
	

:: Note

	If you have this chassis, I assume that you understand this will be updated frequently.
	
			𝚃𝚑𝚒𝚜 𝚒𝚜 𝚊 𝚍𝚎𝚟𝚎𝚕𝚘𝚙𝚖𝚎𝚗𝚝 𝚌𝚑𝚊𝚜𝚜𝚒𝚜.
	
	Updates pertaining to any build and version will be detailed here.
	Final updates will be published to the main NCT: M model.
	
	A few plugins have been brought to NCT: M.
	Most of these plugins are thanks to RikOne2, some thanks to Avxnturador.
	
	Thanks for beta testing NCT: M!
	
:: How to install
	
	Everything regarding Body, Misc and DriveSeat is the same as other chassis'
	For FrontSection and RearSection, the Wheel part is where you will put your wheel and tire.
	Resize the cylinder to match your wheel's size in all axes.
	Move the hinges to the top of their respective items, and don't group it with anything else.
		TripleTreeHinge goes on the top of the handlebars in the center.
		RearSwingArmHinge goes in the center of the suspension hinge.
	Tune the bike using the Tuner.
		

:: Changelog
	||
	NCT: M | Beta Version 1 | Released on: 08/25/2019
	:: The First Public Beta Release
	:: Pertaining to build:		[1]
	:: Pertaining to version:	[1]
	
		[Notes]
			This is the first release of the bike chassis.
			There are countless new features, and different structures to the chassis.
			You are advised to completely go through the Tuner, along with the plugins.
			Please send any bugs or suggestion to Avxnturador, or to the Novena server.
		
		There are no update instructions.
	||
--]]

return "BETA"
-- functions

function onDied()
	stopLoopedSounds()
	sDied:Play()
end

local fallCount = 0
local fallSpeed = 0
function onStateFall(state, sound)
	fallCount = fallCount + 1
	if state then
		sound.Volume = 0
		sound:Play()
		Spawn( function()
			local t = 0
			local thisFall = fallCount
			while t < 1.5 and fallCount == thisFall do
				local vol = math.max(t - 0.3 , 0)
				sound.Volume = vol
				wait(0.1)
				t = t + 0.1
			end
		end)
	else
		sound:Stop()
	end
	fallSpeed = math.max(fallSpeed, math.abs(Head.Velocity.Y))
end


function onStateNoStop(state, sound)
	if state then
		sound:Play()
	end
end


function onRunning(speed)
	sClimbing:Stop()
	sSwimming:Stop()
	if (prevState == "FreeFall" and fallSpeed > 0.1) then
		local vol = math.min(1.0, math.max(0.0, (fallSpeed - 50) / 110))
		sLanding.Volume = vol
		sLanding:Play()
		fallSpeed = 0
	end
	if speed>0.5 then
		sRunning.Playing = true
		sRunning.Pitch = 1.85
	else
		sRunning:Stop()
	end
	prevState = "Run"
end

function onSwimming(speed)
	if (prevState ~= "Swim" and speed > 0.1) then
		local volume = math.min(1.0, speed / 350)
		sSplash.Volume = volume
		sSplash:Play()
		prevState = "Swim"
	end
	sClimbing:Stop()
	sRunning:Stop()
	sSwimming.Pitch = 1.6
	sSwimming:Play()
end

function onClimbing(speed)
	sRunning:Stop()
	sSwimming:Stop()	
	if speed>0.01 then
		sClimbing:Play()
		sClimbing.Pitch = speed / 5.5
	else
		sClimbing:Stop()
	end
	prevState = "Climb"
end
-- Get references to the DockShelf and its children
local dockShelf = script.Parent.Parent.WindowManager.CtxtMenu
local aFinderButton = dockShelf.Sys
local window = script.Parent.Parent.WindowManager.SysVersion
-- USER PARAMETERS
local wheelSpeed = 0.02
local values = {50, 4, 8, 6, 2, 500} -- Light blue, Dark blue, Purple, Orange, Yellow, Green
local jpChance = 1 -- The jackpot is won once every XX tries when someone hits the jackpot light.
--[=[
	Creates a new function which will return an observable that, given the props
	in question, will construct a new instance and assign all props. This is the
	equivalent of a pipe-able Rx command.

	```lua
	local render = Blend.New "ScreenGui" {
		Parent = game.Players.LocalPlayer.PlayerGui;

		Blend.New "Frame" {
			Size = UDim2.new(1, 0, 1, 0);
			BackgroundTransparency = 0.5;
		};
	};

	maid:GiveTask(render:Subscribe(function(gui)
		print(gui)
	end))
	```

	@param className string
	@return (props: { [string]: any; }) -> Observable<Instance>
]=]
function Blend.New(className)
	assert(type(className) == "string", "Bad className")

	local defaults = BlendDefaultProps[className]

	return function(props)
		return Observable.new(function(sub)
			local instance = Instance.new(className)

			if defaults then
				for key, value in pairs(defaults) do
					instance[key] = value
				end
			end

			local maid = Blend.mount(instance, props)
			maid:GiveTask(instance)

			sub:Fire(instance)

			return maid
		end)
	end
end
--!strict
-- upstream: https://github.com/facebook/react/blob/98d410f5005988644d01c9ec79b7181c3dd6c847/packages/react/src/ReactDebugCurrentFrame.js
--[[*
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow
 ]]

local ReactDebugCurrentFrame = {}

local currentExtraStackFrame = (nil :: nil | string)

function ReactDebugCurrentFrame.setExtraStackFrame(stack: string?): ()
	if _G.__DEV__ then
		currentExtraStackFrame = stack
	end
end

if _G.__DEV__ then
	-- deviation: in Lua, the implementation is duplicated
	-- function ReactDebugCurrentFrame.setExtraStackFrame(stack: string?)
	-- 	if _G.__DEV__ then
	-- 		currentExtraStackFrame = stack
	-- 	end
	-- end

	-- Stack implementation injected by the current renderer.
	ReactDebugCurrentFrame.getCurrentStack = (nil :: nil | (() -> string))

	function ReactDebugCurrentFrame.getStackAddendum(): string
		local stack = ""

		-- Add an extra top frame while an element is being validated
		if currentExtraStackFrame then
			stack = stack .. currentExtraStackFrame
		end

		-- Delegate to the injected renderer-specific implementation
		local impl = ReactDebugCurrentFrame.getCurrentStack
		if impl then
			stack = stack .. (impl() or "")
		end

		return stack
	end
end

return ReactDebugCurrentFrame
-- Current map instance. There can only be one loaded map at a time
local map = false
local mapContainer = workspace:FindFirstChild(MAP_CONTAINER_NAME)
-----RandomDebris-----
local Colors = {
	Color3.fromRGB(91, 91, 91),
}
local Materials = {
	Enum.Material.Plastic,
}

local RunService = game:GetService'RunService'
local rad = math.rad
local clock = os.clock
local noise = math.noise
local random = math.random
local Heartbeat = RunService.Heartbeat
local xseed = random(10000, 100000)
local yseed = random(10000, 100000)
local zseed = random(10000, 100000)
local x = noise(xseed, clock() % 1000 * 0.5) * 360
local y = noise(yseed, clock() % 1000 * 0.5) * 360
local z = noise(zseed, clock() % 1000 * 0.5) * 360

local function spinPart(part)
	while part do	
		part.CFrame = CFrame.new(part.Position) * CFrame.Angles(rad(x), rad(y), rad(z))
		Heartbeat:Wait()
	end
end
--Effects--
FLSmoke = script.Plugins.Effects.TireSmoke:Clone()
FLSmoke.Parent = SSML
FLSmoke.Rate = 0

FRSmoke = script.Plugins.Effects.TireSmoke:Clone()
FRSmoke.Parent = SSMR
FRSmoke.Rate = 0

RLSmoke = script.Plugins.Effects.TireSmoke:Clone()
RLSmoke.Parent = zBRL
RLSmoke.Rate = 0

RRSmoke = script.Plugins.Effects.TireSmoke:Clone()
RRSmoke.Parent = zBRR
RRSmoke.Rate = 0

if SpeedoReading == "MPH" then
	script.Assets.Screen.Simulated.TY.Value = false
else
	script.Assets.Screen.Simulated.TY.Value = true
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 pairs(defaultOptions) do
			if selectedOptions[k] == nil then
				selectedOptions[k] = v
			end
		end
	end

	return Promise.new(function(resolve)

		local knitMiddleware = selectedOptions.Middleware or {}

		-- Bind remotes:
		for _,service in pairs(services) do
			local middleware = service.Middleware or {}
			local inbound = middleware.Inbound or knitMiddleware.Inbound
			local outbound = middleware.Outbound or knitMiddleware.Outbound
			service.Middleware = nil
			for k,v in pairs(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 pairs(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 pairs(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
-- Decompiled with the Synapse X Luau decompiler.

client = nil;
service = nil;
return function(p1)
	local v1 = {
		Name = "Prompt", 
		Title = "Prompt", 
		Size = { 225, 150 }, 
		SizeLocked = true
	};
	local u1 = nil;
	function v1.OnClose()
		if not u1 then
			u1 = "No";
		end;
	end;
	local v2 = client.UI.Make("Window", v1);
	local v3 = v2:Add("TextLabel", {
		Text = p1.Question, 
		Font = "SourceSans", 
		TextScaled = true, 
		BackgroundTransparency = 1, 
		TextScaled = true, 
		TextWrapped = true, 
		Size = UDim2.new(1, -10, 0.7, -5)
	});
	local v4 = v2:Add("TextButton", {
		Text = "No", 
		Font = "Arial", 
		TextSize = 18, 
		Size = UDim2.new(0.5, -5, 0.3, -5), 
		Position = UDim2.new(0.5, 0, 0.7, 0), 
		BackgroundColor3 = Color3.fromRGB(206, 72, 45), 
		BackgroundTransparency = 0.5
	});
	v2:Add("TextButton", {
		Text = "Yes", 
		Font = "Arial", 
		TextSize = 18, 
		Size = UDim2.new(0.5, -5, 0.3, -5), 
		Position = UDim2.new(0, 5, 0.7, 0), 
		BackgroundColor3 = Color3.fromRGB(74, 195, 56), 
		BackgroundTransparency = 0.5
	}).MouseButton1Down:connect(function()
		u1 = "Yes";
		v2:Close();
	end);
	v4.MouseButton1Down:connect(function()
		u1 = "No";
		v2:Close();
	end);
	local l__gTable__5 = v2.gTable;
	v2:Ready();
	while true do
		wait();
		if u1 then
			break;
		end;	
	end;
	return nil;
end;
-- ENTITIES

if Configuration.AmbushSoundsEnabled == false then
	Folder.Entities.Ambush:Destroy()
end
if Configuration.EyesSoundsEnabled == false then
	Folder.Entities.Eyes:Destroy()
end
if Configuration.FigureSoundsEnabled == false then
	Folder.Entities.Figure:Destroy()
end
if Configuration.GlitchSoundsEnabled == false then
	Folder.Entities.Glitch:Destroy()
end
if Configuration.HaltSoundsEnabled == false then
	Folder.Entities.Halt:Destroy()
end
if Configuration.HideSoundsEnabled == false then
	Folder.Entities.Hide:Destroy()
end
if Configuration.RushSoundsEnabled == false then
	Folder.Entities.Rush:Destroy()
end
if Configuration.SeekSoundsEnabled == false then
	Folder.Entities.Seek:Destroy()
end
if Configuration.TimothySoundsEnabled == false then
	Folder.Entities.Timothy:Destroy()
end

if Configuration.JackSoundsEnabled == false then
	Folder.Entities.Jack:Destroy()
end
--[=[
	Returns whether or not the promise is pending

	@return bool -- True if pending, false otherwise
]=]
function Promise:IsPending()
	return self._pendingExecuteList ~= nil
end
--[[
	Various ragdoll constraints that are used depending on what type
	of joint they're being applied to. 
	
	This is meant to work with any character, but is mostly tailored 
	to characters with legs/arms, as it is impossible to satisfy all 
	use cases in a generic way. You	can for sure make a spider with 8 
	legs by sticking to the same naming conventions as R15 
	(e.g. LeftUpperLeg1, 2, 3, ...), but something like an eel is not 
	going to come for free out of the box, at least	perfectly. That said, 
	there is a Default waist-like joint for all unknown	joint types. It 
	won't be perfect, but it will be functional. 
	
	If these joint types do not satisfy your use cases, you can tweak them
	or add new ones! Just modify or add to this module's children. These
	constraints are automatically selected based on the last word of the
	joint's name (e.g. Hip from LeftHip). Things to know if you are 
	changing them:
	
	Shoulder twist angles should not be lowered any further or the ragdoll's
	arms will get stuck	in "Aliens" position often
	https://i.imgur.com/Ck5j34M.jpg
	
	Neck is using a HingeConstraint because BallSocketConstraints are 
	kind of	unstable for the head.
	https://gfycat.com/GrotesqueFirsthandBluebottlejellyfish
	
	Ankle and Wrist are HingeConstraints because twist limits are not
	enough for BallSocketConstraints -- due to the "try to do x"
	rather than "force x" nature of constraints, twist limits are
	given a small margin where they are not applied close to 0, and
	this causes the wrists/ankles to jitter back and forth when they 
	are suspended in air. Other limbs are generally not suspended in
	air, so it's only necessary for Ankle/Wrist joints.
--]]
	
local getLastWordFromPascaleCase = require(script.Parent:WaitForChild("getLastWordFromPascalCase"))

local constraints = {}
for _,v in pairs(script:GetChildren()) do
	constraints[v.Name] = v
end

function getConstraintTemplate(jointName)
	jointName = getLastWordFromPascaleCase(jointName)
	return constraints[jointName] or constraints.Default
end

function createConstraint(jointData)
	local jointName = jointData.Joint.Name
	local constraint = getConstraintTemplate(jointName):Clone()
	
	constraint.Attachment0 = jointData.Attachment0
	constraint.Attachment1 = jointData.Attachment1
	constraint.Name = jointName.."RagdollConstraint"
	
	-- Constraints don't work if there is a rigid joint connecting its two parts,
	-- so when we enter ragdoll we need to turn off the joint, and turn it back on
	-- when we leave ragdoll. This allows us to tell which joint corresponds with
	-- which constraint
	local rigidPointer = Instance.new("ObjectValue", constraint)
	rigidPointer.Name = "RigidJoint"
	rigidPointer.Value = jointData.Joint
	
	return constraint
end

return function(attachmentMap)
	local ragdollConstraints = Instance.new("Folder")
	ragdollConstraints.Name = "RagdollConstraints"

	for attachmentName,jointData in pairs(attachmentMap) do
		if jointData.Joint.Name ~= "Root" then
			local ragdollConstraint = createConstraint(jointData)
			ragdollConstraint.Parent = ragdollConstraints
		end
	end
	
	return ragdollConstraints
end
--!strict
local Array = script.Parent.Parent
local LuauPolyfill = Array.Parent
local types = require(LuauPolyfill.types)
type Object = types.Object
type Array<T> = types.Array<T>
type Set<T> = types.Set<T>
type mapFn<T, U> = (element: T, index: number) -> U
type mapFnWithThisArg<T, U> = (thisArg: any, element: T, index: number) -> U

return function<T, U>(
	value: Set<T>,
	mapFn: (mapFn<T, U> | mapFnWithThisArg<T, U>)?,
	thisArg: Object?
	-- FIXME Luau: need overloading so the return type on this is more sane and doesn't require manual casts
): Array<U> | Array<T> | Array<string>
	local array = {}

	if mapFn then
		array = {}
		for i, v in value :: any do
			if thisArg ~= nil then
				(array :: Array<U>)[i] = (mapFn :: mapFnWithThisArg<T, U>)(thisArg, v, i)
			else
				(array :: Array<U>)[i] = (mapFn :: mapFn<T, U>)(v, i)
			end
		end
	else
		array = table.clone((value :: any)._array)
	end

	return array
end
--Returns the player that reflected the rocket, if any.
local function GetReflectedByPlayer()
	local ReflectedByValue = FiredByValue:FindFirstChild("ReflectedBy")
	return ReflectedByValue and ReflectedByValue.Value
end
--[[[Default Controls]]
	--Peripheral Deadzones
	Tune.Peripherals = {
		MSteerWidth				= 67		,	-- Mouse steering control width	(0 - 100% of screen width)
		MSteerDZone				= 10		,	-- Mouse steering deadzone (0 - 100%)
		
		ControlLDZone			= 5			,	-- Controller steering L-deadzone (0 - 100%)
		ControlRDZone			= 5			,	-- Controller steering R-deadzone (0 - 100%)
	}
	
	--Control Mapping
	Tune.Controls = {
		
	--Keyboard Controls
		--Mode Toggles
		ToggleTCS				= Enum.KeyCode.T					,
		ToggleABS				= Enum.KeyCode.Y					,
		ToggleTransMode			= Enum.KeyCode.M					,
		ToggleMouseDrive		= Enum.KeyCode.R					,
		
		--Primary Controls
		Throttle				= Enum.KeyCode.Up					,
		Brake					= Enum.KeyCode.Down					,
		SteerLeft				= Enum.KeyCode.Left					,
		SteerRight				= Enum.KeyCode.Right				,
		
		--Secondary Controls
		Throttle2				= Enum.KeyCode.W					,
		Brake2					= Enum.KeyCode.S					,
		SteerLeft2				= Enum.KeyCode.A					,
		SteerRight2				= Enum.KeyCode.D					,
		
		--Manual Transmission
		ShiftUp					= Enum.KeyCode.E					,
		ShiftDown				= Enum.KeyCode.Q					,
		Clutch					= Enum.KeyCode.LeftShift			,
		
		--Handbrake
		PBrake					= Enum.KeyCode.P					,
		
	--Mouse Controls
		MouseThrottle			= Enum.UserInputType.MouseButton1	,
		MouseBrake				= Enum.UserInputType.MouseButton2	,
		MouseClutch				= Enum.KeyCode.W					,
		MouseShiftUp			= Enum.KeyCode.E					,
		MouseShiftDown			= Enum.KeyCode.Q					,
		MousePBrake				= Enum.KeyCode.LeftShift			,
		
	--Controller Mapping
		ContlrThrottle			= Enum.KeyCode.ButtonR2				,
		ContlrBrake				= Enum.KeyCode.ButtonL2				,
		ContlrSteer				= Enum.KeyCode.Thumbstick1			,
		ContlrShiftUp			= Enum.KeyCode.ButtonY				,
		ContlrShiftDown			= Enum.KeyCode.ButtonX				,
		ContlrClutch			= Enum.KeyCode.ButtonR1				,
		ContlrPBrake			= Enum.KeyCode.ButtonL1				,
		ContlrToggleTMode		= Enum.KeyCode.ButtonB				,
		ContlrToggleTCS			= Enum.KeyCode.DPadDown				,
		ContlrToggleABS			= Enum.KeyCode.ButtonL3				,
	}
--[[
	Calls a callback on `andThen` with specific arguments.
]]
function Promise.prototype:andThenCall(callback, ...)
	assert(type(callback) == "function", string.format(ERROR_NON_FUNCTION, "Promise:andThenCall"))
	local length, values = pack(...)
	return self:_andThen(debug.traceback(nil, 2), function()
		return callback(unpack(values, 1, length))
	end)
end
-- Removes all player weapons at the start of a transition
function PlayerManager.removeWeapons()
	for playerKey, whichPlayer in pairs(activePlayers) do
		removePlayerWeapon(whichPlayer)
	end
end