var dtable = new Array('A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'0','1','2','3','4','5','6','7','8','9','.','_');

function inchar(d) 
{
  r = -1;
  for (var i = 0; i < dtable.length; i++) 
  {
    if (d == dtable[i]) 
	{
      r = i;
      break;
    }
  }
  return r;
}

function enCode64(n) 
{
  var o1 = o2 = o3 =o4 = 0;
  var text = "";
  j = 0;
  for (var i = 0; i < n.length; i += 3) 
  {
    t = Math.min(3, n.length - i); 
    if (t == 1) 
	{
       x = n.charCodeAt(i); 
       text += dtable[(x >> 2)]; 
       text += dtable[((x & 0X00000003) << 4)]; 
       text += '-'; 
       text += '-'; 
    }
	else if (t == 2) 
	{
       x = n.charCodeAt(i); 
       y = n.charCodeAt(i+1); 
       text += dtable[(x >> 2)]; 
       text += dtable[((x & 0X00000003) << 4) | (y >> 4)]; 
       text += dtable[((y & 0X0000000f) << 2)]; 
       text += '-'; 
    }
	else 
	{
       x = n.charCodeAt(i); 
       y = n.charCodeAt(i+1); 
       z = n.charCodeAt(i+2); 
       text += dtable[x >> 2]; 
       text += dtable[((x & 0x00000003) << 4) | (y >> 4)]; 
       text += dtable[((y & 0X0000000f) << 2) | (z >> 6)]; 
       text += dtable[z & 0X0000003f]; 
    }
  }
  return text; 
}

function deCode64(n) {
  var p;
  var o1 = o2 = o3 = 0;
  var text = "";
  if ((n.length % 4) != 0) return null;
  j = 0;
  for (var i = 0; i < n.length; i += 4) 
  {
    x1 = inchar(n.charAt(i));
    x2 = inchar(n.charAt(i+1));
    x3 = inchar(n.charAt(i+2));
    x4 = inchar(n.charAt(i+3));
    ol = 4;
    if (x4 == -1) { ol--; x4 = 0;}
    if (x3 == -1) { ol--; x3 = 0;}
    if (ol == 4) 
	{
      o1 = ((x1 << 2) | (x2 >> 4)); p = (o1 > 256)? (o1%256) : o1; text += String.fromCharCode(p);
      o2 = ((x2 << 4) | (x3 >> 2)); p = (o2 > 256)? (o2%256) : o2; text += String.fromCharCode(p);
      o3 = ((x3 << 6) | x4);        p = (o3 > 256)? (o3%256) : o3; text += String.fromCharCode(p);
    }
	else if (ol == 3) 
	{
      o1 = ((x1 << 2) | (x2 >> 4)); p = (o1 > 256)? (o1%256) : o1; text += String.fromCharCode(p);
      o2 = ((x2 << 4) | (x3 >> 2)); p = (o2 > 256)? (o2%256) : o2; text += String.fromCharCode(p);
    }
	else if (ol == 2) 
	{
      o1 = ((x1 << 2) | (x2 >> 4)); p = (o1 > 256)? (o1%256) : o1; text += String.fromCharCode(p);
    }
  }
  return text;
}   
 