function init(b)local W=b.Element local s=b._Maid local D=b._DragBind local j=Vector3.new()s:Mark(b._DragBind)s:Mark(b._StartBind)s:Mark(b._StopBind)s:Mark(W.InputBegan:Connect(function(W)if VALID_PRESS[W.UserInputType]then j=W.Position b.IsDragging=true b._StartBind:Fire()end end))s:Mark(UIS.InputEnded:Connect(function(W)if VALID_PRESS[W.UserInputType]then b.IsDragging=false b._StopBind:Fire()end end))s:Mark(UIS.InputChanged:Connect(function(s,m)if b.IsDragging then if VALID_MOVEMENT[s.UserInputType]then local b=s.Position-j j=s.Position D:Fire(W,s,b)end end end))end
-- Private Methods

function init(self)
	local element = self.Element
	local maid = self._Maid
	local dragBind = self._DragBind
	local lastMousePosition = Vector3.new()

	maid:Mark(self._DragBind)
	maid:Mark(self._StartBind)
	maid:Mark(self._StopBind)

	maid:Mark(element.InputBegan:Connect(function(input)
		if VALID_PRESS[input.UserInputType] then
			lastMousePosition = input.Position
			self.IsDragging = true
			self._StartBind:Fire()
		end
	end))

	maid:Mark(UIS.InputEnded:Connect(function(input)
		if VALID_PRESS[input.UserInputType] then
			self.IsDragging = false
			self._StopBind:Fire()
		end
	end))

	maid:Mark(UIS.InputChanged:Connect(function(input, process)
		if self.IsDragging then
			if VALID_MOVEMENT[input.UserInputType] then
				local delta = input.Position - lastMousePosition
				lastMousePosition = input.Position
				dragBind:Fire(element, input, delta)
			end
		end
	end))
end
