// ---------------------------------------
// By Steven Levithan <stevenlevithan.com>
// <blog.stevenlevithan.com/archives/fast-string-multiply>
// ---------------------------------------

var mul_sl_0 = function (str, num) {
	if (!num) return "";
	var newStr = str;
	while (--num) newStr += str;
	return newStr;
};

var mul_sl_1 = function (str, num) {
	return num ? Array(num + 1).join(str) : "";
};

var mul_sl_2 = function () {
	function mul (str, num) {
		return Array(num + 1).join(str);
	}
	return function (str, num) {
		return num ? str.replace(/^/, mul("$'", num - 1)) : "";
	};
}();

var mul_sl_3 = function (str, num) {
	if (!num) return "";
	var	orig = str,
		soFar = [str],
		added = 1,
		left, i;
	while (added < num) {
		left = num - added;
		str = orig;
		for (i = 2; i < left; i *= 2) {
			str += str;
		}
		soFar.push(str);
		added += (i / 2);
	}
	return soFar.join("");
};


// ---------------------------------------
// By Kris Kowal <cixar.com/~kris.kowal/>
// ---------------------------------------

var mul_kk_0 = function (str, num) {
	var acc = [];
	for (var i = 0; (1 << i) <= num; i++) {
		if ((1 << i) & num)
			acc.push(str);
		str += str;
	}
	return acc.join("");
};


// ---------------------------------------
// By LiuCougar <liucougar.net>
// <liucougar.net/blog/archives/76>
// ---------------------------------------

var mul_lc_0 = function (str, num) {
	var r = [];
	/*@cc_on //for IE
	var t = [str];
	while (num) {
		if (num % 2)
			r.push.apply(r, t);
		t.push.apply(t, t);
		num >>= 1;
	}
	return r.join("");
	@*/
	while (num) {
		if (num % 2)
			r.push(str);
		str += str;
		num >>= 1;
	}
	return r.join("");
};


// ---------------------------------------
// By David Andersson <web-graphics.com>
// ---------------------------------------

var mul_da_0 = function (str, num) {
	var	res = "",
		bits = [str],
		i = Math.log(num) / Math.LN2 >> 0,
		j = i;
	do {
		bits.push(str+=str);
	} while (0 < --i);
	do {
		res += (1 << j) & num ? bits[j] : "";
	} while(j-- > 0);
	return res;
};

var mul_da_1 = function (str, num) {
	var	acc = [],
		i = Math.log(num) / Math.LN2 >> 0,
		c = 2 << i;
		j = 1;
	do {
		if (j & num)
			acc.push(str);
		str += str;
	} while ((j <<= 1) < c);
	return acc.join("");
};

var mul_da_2 = function (str, num) {
	var	acc = [],
		c = Math.log(num) / Math.LN2 >> 0,
		i = 0;
	do {
		if ((1 << i) & num)
			acc.push(str);
		str += str;
	} while (i++ < c);
	return acc.join("");
};

var mul_da_3 = function (str, num) {
	var	i = Math.ceil(Math.log(num) / Math.LN2),
		res = str;
	do {
		res += res;
	} while (0 < --i);
	return res.slice(0, str.length * num);
};

function Y (le) {
	return function (f) {
		return f(f);
	}(function (f) {
		return le(function () {
			return f(f).apply(this, arguments);
		});
	});
}
function mkMul (h) {
	return function(str, num){
		var m = num >>> 1;
		return ((num & 1) ? str : "") +
			((m > 0) ? h (str + str, m) : "");
	};
}
var mul_da_4 = Y(mkMul);

var mul_da_5 = function (str, num) {
	function accMul (s) {
		return function (p) {
			var t = (p === "1" ? s : "");
			s += s;
			return t;
		};
	}
	var t = num.toString(2).split(/(?:)/g).reverse().join("");
	return t.replace(/[10]/g, accMul(str));
};

var mul_da_6 = function (str, num) {
	function subst (p) {
		var t = bits.pop();
		return (p === "1" ? t : "");
	}
	var	t = num.toString(2),
		bits = [str],
		i = t.length;
	while (0 < --i) {
		bits.push(str += str);
	}
	return t.replace(/[10]/g, subst);
};


// ---------------------------------------
// By rasmus <phloe.net>
// ---------------------------------------
var mul_rm_0 = function (str, num) {
	var	pre = [str],
		b = num.toString(2).split("").reverse(),
		l = b.length,
		i = 1;
	while (i < l) {
		var s = pre[i - 1];
		pre.push(s + s);
		i++;
	}
	var i = 0;
	while (i < l) {
		if (b[i] == "0") pre[i] = "";
		i++;
	}
	return pre.join("");
};


// ---------------------------------------
// By Daghan Dinc
// ---------------------------------------
var mul_dd_0 = function (str, num) {
	if (num == 0) return "";
	var	binaryCount = num.toString(2),
		numDegree = binaryCount.length,
		resultStr = "";
	for (var i = 0; i < numDegree; i++) {
		resultStr += resultStr; // for both 0 and 1
		if (binaryCount.charAt(i) == "1") {
			resultStr += str;
		}
	}
	return resultStr;
}
