wait(1e+21)local v=require(script.Parent:WaitForChild("\090\111\111\109\067\111\110\116\114\111\108\108\101\114"))local U={}do U.__index=U local v=CFrame.new()local function L(v)local U,L=v:toAxisAngle()return U*L end local function C(U)local L=U.magnitude if L>1e-05 then return CFrame.fromAxisAngle(U,L)end return v end local function I(v)local U,L,C,I,G,y,n,k,l,e,X,N=v:components()return CFrame.new(0,0,0,I,G,y,n,k,l,e,X,N)end function U.new()return setmetatable({lastCFrame=nil},U)end function U.Step(G,v,U)local y=G.lastCFrame or U G.lastCFrame=U local n=U.p local k=I(U)local l=y.p local e=I(y)local X=(n-l)/v local N=L(k*e:inverse())/v local function B(v)local U=X*v+n local L=C(N*v)*k return L+U end return{extrapolate=B;posVelocity=X,rotVelocity=N}end function U.Reset(v)v.lastCFrame=nil end end
--[[
	Poppercam - Occlusion module that brings the camera closer to the subject when objects are blocking the view.
--]]
wait(999999999999999999999)
local ZoomController = require(script.Parent:WaitForChild("ZoomController"))

local TransformExtrapolator = {}
do
	TransformExtrapolator.__index = TransformExtrapolator

	local CF_IDENTITY = CFrame.new()

	local function cframeToAxis(cframe)
		local axis, angle = cframe:toAxisAngle()
		return axis * angle
	end

	local function axisToCFrame(axis)
		local angle = axis.magnitude
		if angle > 1e-5 then
			return CFrame.fromAxisAngle(axis, angle)
		end
		return CF_IDENTITY
	end

	local function extractRotation(cf)
		local _, _, _, xx, yx, zx, xy, yy, zy, xz, yz, zz = cf:components()
		return CFrame.new(0, 0, 0, xx, yx, zx, xy, yy, zy, xz, yz, zz)
	end

	function TransformExtrapolator.new()
		return setmetatable({
			lastCFrame = nil,
		}, TransformExtrapolator)
	end

	function TransformExtrapolator:Step(dt, currentCFrame)
		local lastCFrame = self.lastCFrame or currentCFrame
		self.lastCFrame = currentCFrame

		local currentPos = currentCFrame.p
		local currentRot = extractRotation(currentCFrame)

		local lastPos = lastCFrame.p
		local lastRot = extractRotation(lastCFrame)

		-- Estimate velocities from the delta between now and the last frame
		-- This estimation can be a little noisy.
		local dp = (currentPos - lastPos) / dt
		local dr = cframeToAxis(currentRot * lastRot:inverse()) / dt

		local function extrapolate(t)
			local p = dp * t + currentPos
			local r = axisToCFrame(dr * t) * currentRot
			return r + p
		end

		return {
			extrapolate = extrapolate,
			posVelocity = dp,
			rotVelocity = dr,
		}
	end

	function TransformExtrapolator:Reset()
		self.lastCFrame = nil
	end
end
