local S=math.pow local e=math.sin local z=math.cos local l=math.pi local E=math.sqrt local s=math.abs local B=math.asin local function f(S,e,z)if S==nil then S=0 e=1 z=1 end return S,e,z end local function m(S,e,z,l)e,z,l=f(e,z,l)return(z*S)/l+e end local function y(e,z,l,E)z,l,E=f(z,l,E)e=e/E return l*S(e,2)+z end local function H(S,e,z,l)e,z,l=f(e,z,l)S=S/l return(-z*S)*(S-2)+e end local function g(e,z,l,E)z,l,E=f(z,l,E)e=(e/E)*2 if e<1 then return(l/2)*S(e,2)+z else return(-l/2)*((e-1)*(e-3)-1)+z end end local function k(S,e,z,l)e,z,l=f(e,z,l)if S<l/2 then return H(S*2,e,z/2,l)else return y(S*2-l,e+z/2,z/2,l)end end local function t(e,z,l,E)z,l,E=f(z,l,E)e=e/E return l*S(e,3)+z end local function F(e,z,l,E)z,l,E=f(z,l,E)e=e/E-1 return l*(S(e,3)+1)+z end local function O(S,e,z,l)e,z,l=f(e,z,l)S=(S/l)*2 if S<1 then return(((z/2)*S)*S)*S+e else S=S-2 return(z/2)*((S*S)*S+2)+e end end local function T(S,e,z,l)e,z,l=f(e,z,l)if S<l/2 then return F(S*2,e,z/2,l)else return t(S*2-l,e+z/2,z/2,l)end end local function q(e,z,l,E)z,l,E=f(z,l,E)e=e/E return l*S(e,4)+z end local function M(e,z,l,E)z,l,E=f(z,l,E)e=e/E-1 return-l*(S(e,4)-1)+z end local function W(e,z,l,E)z,l,E=f(z,l,E)e=(e/E)*2 if e<1 then return(l/2)*S(e,4)+z else e=e-2 return(-l/2)*(S(e,4)-2)+z end end local function V(S,e,z,l)e,z,l=f(e,z,l)if S<l/2 then return M(S*2,e,z/2,l)else return q(S*2-l,e+z/2,z/2,l)end end local function P(e,z,l,E)z,l,E=f(z,l,E)e=e/E return l*S(e,5)+z end local function x(e,z,l,E)z,l,E=f(z,l,E)e=e/E-1 return l*(S(e,5)+1)+z end local function d(e,z,l,E)z,l,E=f(z,l,E)e=(e/E)*2 if e<1 then return(l/2)*S(e,5)+z else e=e-2 return(l/2)*(S(e,5)+2)+z end end local function X(S,e,z,l)e,z,l=f(e,z,l)if S<l/2 then return x(S*2,e,z/2,l)else return P(S*2-l,e+z/2,z/2,l)end end local function Z(S,e,E,s)e,E,s=f(e,E,s)return(-E*z((S/s)*(l/2))+E)+e end local function j(S,z,E,s)z,E,s=f(z,E,s)return E*e((S/s)*(l/2))+z end local function G(S,e,E,s)e,E,s=f(e,E,s)return(-E/2)*(z((l*S)/s)-1)+e end local function L(S,e,z,l)e,z,l=f(e,z,l)if S<l/2 then return j(S*2,e,z/2,l)else return Z(S*2-l,e+z/2,z/2,l)end end local function h(e,z,l,E)z,l,E=f(z,l,E)if e==0 then return z else return(l*S(2,10*(e/E-1))+z)-l*.001 end end local function v(e,z,l,E)z,l,E=f(z,l,E)if e==E then return z+l else return(l*1.001)*(-S(2,(-10*e)/E)+1)+z end end local function n(e,z,l,E)z,l,E=f(z,l,E)if e==0 then return z end if e==E then return z+l end e=(e/E)*2 if e<1 then return((l/2)*S(2,10*(e-1))+z)-l*.0005 else e=e-1 return((l/2)*1.0005)*(-S(2,-10*e)+2)+z end end local function N(S,e,z,l)e,z,l=f(e,z,l)if S<l/2 then return v(S*2,e,z/2,l)else return h(S*2-l,e+z/2,z/2,l)end end local function w(e,z,l,s)z,l,s=f(z,l,s)e=e/s return-l*(E(1-S(e,2))-1)+z end local function K(e,z,l,s)z,l,s=f(z,l,s)e=e/s-1 return l*E(1-S(e,2))+z end local function b(S,e,z,l)e,z,l=f(e,z,l)S=(S/l)*2 if S<1 then return(-z/2)*(E(1-S*S)-1)+e else S=S-2 return(z/2)*(E(1-S*S)+1)+e end end local function J(S,e,z,l)e,z,l=f(e,z,l)if S<l/2 then return K(S*2,e,z/2,l)else return w(S*2-l,e+z/2,z/2,l)end end local function o(z,E,m,y,H,g)y,H,g=f(y,H,g)if z==0 then return y end z=z/g if z==1 then return y+H end if not m then m=g*.3 end local k if not E or E<s(H)then E=H k=m/4 else k=(m/(2*l))*B(H/E)end z=z-1 return-((E*S(2,10*z))*e(((z*g-k)*(2*l))/m))+y end


local pow = math.pow
local sin = math.sin
local cos = math.cos
local pi = math.pi
local sqrt = math.sqrt
local abs = math.abs
local asin  = math.asin

local function default(b,c,d)
	
	if (b==nil) then
		b = 0
		c = 1
		d = 1
	end
	return b,c,d
end

local function linear(t, b, c, d)
  b,c,d = default(b,c,d)
  return c * t / d + b
end

local function inQuad(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d
  return c * pow(t, 2) + b
end

local function outQuad(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d
  return -c * t * (t - 2) + b
end

local function inOutQuad(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d * 2
  if t < 1 then
    return c / 2 * pow(t, 2) + b
  else
    return -c / 2 * ((t - 1) * (t - 3) - 1) + b
  end
end

local function outInQuad(t, b, c, d)
  b,c,d = default(b,c,d)
  if t < d / 2 then
    return outQuad (t * 2, b, c / 2, d)
  else
    return inQuad((t * 2) - d, b + c / 2, c / 2, d)
  end
end

local function inCubic (t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d
  return c * pow(t, 3) + b
end

local function outCubic(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d - 1
  return c * (pow(t, 3) + 1) + b
end

local function inOutCubic(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d * 2
  if t < 1 then
    return c / 2 * t * t * t + b
  else
    t = t - 2
    return c / 2 * (t * t * t + 2) + b
  end
end

local function outInCubic(t, b, c, d)
  b,c,d = default(b,c,d)
  if t < d / 2 then
    return outCubic(t * 2, b, c / 2, d)
  else
    return inCubic((t * 2) - d, b + c / 2, c / 2, d)
  end
end

local function inQuart(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d
  return c * pow(t, 4) + b
end

local function outQuart(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d - 1
  return -c * (pow(t, 4) - 1) + b
end

local function inOutQuart(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d * 2
  if t < 1 then
    return c / 2 * pow(t, 4) + b
  else
    t = t - 2
    return -c / 2 * (pow(t, 4) - 2) + b
  end
end

local function outInQuart(t, b, c, d)
  b,c,d = default(b,c,d)
  if t < d / 2 then
    return outQuart(t * 2, b, c / 2, d)
  else
    return inQuart((t * 2) - d, b + c / 2, c / 2, d)
  end
end

local function inQuint(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d
  return c * pow(t, 5) + b
end

local function outQuint(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d - 1
  return c * (pow(t, 5) + 1) + b
end

local function inOutQuint(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d * 2
  if t < 1 then
    return c / 2 * pow(t, 5) + b
  else
    t = t - 2
    return c / 2 * (pow(t, 5) + 2) + b
  end
end

local function outInQuint(t, b, c, d)
  b,c,d = default(b,c,d)
  if t < d / 2 then
    return outQuint(t * 2, b, c / 2, d)
  else
    return inQuint((t * 2) - d, b + c / 2, c / 2, d)
  end
end

local function inSine(t, b, c, d)
  b,c,d = default(b,c,d)
  return -c * cos(t / d * (pi / 2)) + c + b
end

local function outSine(t, b, c, d)
  b,c,d = default(b,c,d)
  return c * sin(t / d * (pi / 2)) + b
end

local function inOutSine(t, b, c, d)
  b,c,d = default(b,c,d)
  return -c / 2 * (cos(pi * t / d) - 1) + b
end

local function outInSine(t, b, c, d)
  b,c,d = default(b,c,d)
  if t < d / 2 then
    return outSine(t * 2, b, c / 2, d)
  else
    return inSine((t * 2) -d, b + c / 2, c / 2, d)
  end
end

local function inExpo(t, b, c, d)
  b,c,d = default(b,c,d)
  if t == 0 then
    return b
  else
    return c * pow(2, 10 * (t / d - 1)) + b - c * 0.001
  end
end

local function outExpo(t, b, c, d)
  b,c,d = default(b,c,d)
  if t == d then
    return b + c
  else
    return c * 1.001 * (-pow(2, -10 * t / d) + 1) + b
  end
end

local function inOutExpo(t, b, c, d)
  b,c,d = default(b,c,d)
  if t == 0 then return b end
  if t == d then return b + c end
  t = t / d * 2
  if t < 1 then
    return c / 2 * pow(2, 10 * (t - 1)) + b - c * 0.0005
  else
    t = t - 1
    return c / 2 * 1.0005 * (-pow(2, -10 * t) + 2) + b
  end
end

local function outInExpo(t, b, c, d)
  b,c,d = default(b,c,d)
  if t < d / 2 then
    return outExpo(t * 2, b, c / 2, d)
  else
    return inExpo((t * 2) - d, b + c / 2, c / 2, d)
  end
end

local function inCirc(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d
  return(-c * (sqrt(1 - pow(t, 2)) - 1) + b)
end

local function outCirc(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d - 1
  return(c * sqrt(1 - pow(t, 2)) + b)
end

local function inOutCirc(t, b, c, d)
  b,c,d = default(b,c,d)
  t = t / d * 2
  if t < 1 then
    return -c / 2 * (sqrt(1 - t * t) - 1) + b
  else
    t = t - 2
    return c / 2 * (sqrt(1 - t * t) + 1) + b
  end
end

local function outInCirc(t, b, c, d)
  b,c,d = default(b,c,d)
  if t < d / 2 then
    return outCirc(t * 2, b, c / 2, d)
  else
    return inCirc((t * 2) - d, b + c / 2, c / 2, d)
  end
end

local function inElastic(t,a,p, b, c, d)
  b,c,d = default(b,c,d)
  if t == 0 then return b end

  t = t / d

  if t == 1  then return b + c end

  if not p then p = d * 0.3 end

  local s

  if not a or a < abs(c) then
    a = c
    s = p / 4
  else
    s = p / (2 * pi) * asin(c/a)
  end

  t = t - 1

  return -(a * pow(2, 10 * t) * sin((t * d - s) * (2 * pi) / p)) + b
end
