!
function(a, b) {
	"function" == typeof define && define.amd ? define(b) : "object" == typeof exports ? module.exports = b(require, exports, module) : a.CountUp = b()
} (this,
function() {
	var d = function(a, b, c, d, e, f) {
		for (var g = 0,
		h = ["webkit", "moz", "ms", "o"], i = 0; i < h.length && !window.requestAnimationFrame; ++i) window.requestAnimationFrame = window[h[i] + "RequestAnimationFrame"],
		window.cancelAnimationFrame = window[h[i] + "CancelAnimationFrame"] || window[h[i] + "CancelRequestAnimationFrame"];
		window.requestAnimationFrame || (window.requestAnimationFrame = function(a) {
			var c = (new Date).getTime(),
			d = Math.max(0, 16 - (c - g)),
			e = window.setTimeout(function() {
				a(c + d)
			},
			d);
			return g = c + d,
			e
		}),
		window.cancelAnimationFrame || (window.cancelAnimationFrame = function(a) {
			clearTimeout(a)
		}),
		this.options = {
			useEasing: !0,
			useGrouping: !0,
			separator: ",",
			decimal: "."
		};
		for (var j in f) f.hasOwnProperty(j) && (this.options[j] = f[j]);
		"" === this.options.separator && (this.options.useGrouping = !1),
		this.options.prefix || (this.options.prefix = ""),
		this.options.suffix || (this.options.suffix = ""),
		this.d = "string" == typeof a ? document.getElementById(a) : a,
		this.startVal = Number(b),
		isNaN(b) && (this.startVal = Number(b.match(/[\d]+/g).join(""))),
		this.endVal = Number(c),
		isNaN(c) && (this.endVal = Number(c.match(/[\d]+/g).join(""))),
		this.countDown = this.startVal > this.endVal,
		this.frameVal = this.startVal,
		this.decimals = Math.max(0, d || 0),
		this.dec = Math.pow(10, this.decimals),
		this.duration = 1e3 * Number(e) || 2e3;
		var k = this;
		this.version = function() {
			return "1.5.3"
		},
		this.printValue = function(a) {
			var b = isNaN(a) ? "--": k.formatNumber(a);
			"INPUT" == k.d.tagName ? this.d.value = b: "text" == k.d.tagName ? this.d.textContent = b: this.d.innerHTML = b
		},
		this.easeOutExpo = function(a, b, c, d) {
			return 1024 * c * ( - Math.pow(2, -10 * a / d) + 1) / 1023 + b
		},
		this.count = function(a) {
			k.startTime || (k.startTime = a),
			k.timestamp = a;
			var b = a - k.startTime;
			k.remaining = k.duration - b,
			k.frameVal = k.options.useEasing ? k.countDown ? k.startVal - k.easeOutExpo(b, 0, k.startVal - k.endVal, k.duration) : k.easeOutExpo(b, k.startVal, k.endVal - k.startVal, k.duration) : k.countDown ? k.startVal - (k.startVal - k.endVal) * (b / k.duration) : k.startVal + (k.endVal - k.startVal) * (b / k.duration),
			k.frameVal = k.countDown ? k.frameVal < k.endVal ? k.endVal: k.frameVal: k.frameVal > k.endVal ? k.endVal: k.frameVal,
			k.frameVal = Math.round(k.frameVal * k.dec) / k.dec,
			k.printValue(k.frameVal),
			b < k.duration ? k.rAF = requestAnimationFrame(k.count) : k.callback && k.callback()
		},
		this.start = function(a) {
			return k.callback = a,
			isNaN(k.endVal) || isNaN(k.startVal) || k.startVal === k.endVal ? (console.log("countUp error: startVal or endVal is not a number"), k.printValue(c)) : k.rAF = requestAnimationFrame(k.count),
			!1
		},
		this.pauseResume = function() {
			k.paused ? (k.paused = !1, delete k.startTime, k.duration = k.remaining, k.startVal = k.frameVal, requestAnimationFrame(k.count)) : (k.paused = !0, cancelAnimationFrame(k.rAF))
		},
		this.reset = function() {
			k.paused = !1,
			delete k.startTime,
			k.startVal = b,
			cancelAnimationFrame(k.rAF),
			k.printValue(k.startVal)
		},
		this.update = function(a) {
			cancelAnimationFrame(k.rAF),
			k.paused = !1,
			delete k.startTime,
			k.startVal = k.frameVal,
			k.endVal = Number(a),
			k.countDown = k.startVal > k.endVal,
			k.rAF = requestAnimationFrame(k.count)
		},
		this.formatNumber = function(a) {
			a = a.toFixed(k.decimals),
			a += "";
			var b, c, d, e;
			if (b = a.split("."), c = b[0], d = b.length > 1 ? k.options.decimal + b[1] : "", e = /(\d+)(\d{3})/, k.options.useGrouping) for (; e.test(c);) c = c.replace(e, "$1" + k.options.separator + "$2");
			return k.options.prefix + c + d + k.options.suffix
		},
		k.printValue(k.startVal)
	};
	return d
});