sys.base64tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
sys.binNums = new Array(0x00001,0x00002,0x00004,0x00008,0x00010,0x00020);

function base2String(str) {
var i, j, k, m, n, x = "", y = "", z = "", h, d = 0
// Decode characters into binary strings
for (i = 0; i < str.length; i++) {
	j = str.substr(i,1)
	k = sys.base64tab.indexOf(j)
	if (k < 0) {
		alert("Invalid character " + j + " in base64 encoded string")
		return false
	}
	d = 0
	for (n = 32; n >= 1; n/=2) {
		z += Math.floor(k/n)
		k = k % n
	}
}
return z
}


function bit2Int(binStr) {
var i, z = 0, lg = binStr.length, x = lg-1
for (i=lg -1;i>=0;i--) {
	z += (binStr.substr(i,1) == "1") ? sys.binNums[x-i] : 0
}
return z
}


function decodePuzzle(b64) {
var i, j, z = base2String(b64), op = "", x
for (i=0;i<z.length;i+=4){
	j = z.substr(i,4)
	if (j.length == 4) {
		k = bit2Int(j)
		if (k > 9) {
			for (x=0; x<=k-10; x++) {
				op += "0"
			}
		} else {
			op += k.toString()		
		}	
	}
}
if (op.length < 81) {
	return "Invalid puzzle string"
} else {	
	return op.substr(0,81)
}
}
