var __INC_ENCODERS = true;

function F(X, Y, Z) { return (X & Y) | (~X & Z); }
function G(X, Y, Z) { return (X & Z) | (Y & ~Z); }
function H(X, Y, Z) { return X ^ Y ^ Z;          }
function I(X, Y, Z) { return Y ^ (X | ~Z);       }

function FF(A, B, C, D, K, S, T) { return add(B, rot(add(A, add(F(B, C, D), add(K, T))), S)); }
function GG(A, B, C, D, K, S, T) { return add(B, rot(add(A, add(G(B, C, D), add(K, T))), S)); }
function HH(A, B, C, D, K, S, T) { return add(B, rot(add(A, add(H(B, C, D), add(K, T))), S)); }
function II(A, B, C, D, K, S, T) { return add(B, rot(add(A, add(I(B, C, D), add(K, T))), S)); }

function add(X, Y) { return ((X & 0x7fffffff) + (Y & 0x7fffffff)) ^ (X & 0x80000000) ^ (Y & 0x80000000); }
function rot(X, Y) { return (X << Y) | ((X >> (32 - Y)) & (Math.pow(2, Y) - 1)); }

function hex(X) {
  var sHex="0123456789abcdef", hStr="";
  for (var i=0; i<32; i+=8)
    hStr+=sHex.charAt((X >>> (i + 4)) & 0x0f) + sHex.charAt((X >>> i) & 0x0f);
  return hStr;
}

function md5(msg) {
  var md5Msg=new String(msg);
  var md5MsgLen=md5Msg.length * 8;

  md5Msg+=String.fromCharCode(0x80);
  while (md5Msg.length % 64 != 56)
    md5Msg+=String.fromCharCode(0x00);
  md5Msg+=String.fromCharCode(md5MsgLen & 0xff);
  md5Msg+=String.fromCharCode((md5MsgLen >>> 8) & 0xff);
  md5Msg+=String.fromCharCode((md5MsgLen >>> 16) & 0xff);
  md5Msg+=String.fromCharCode((md5MsgLen >>> 24) & 0xff);
  for (var n=0; n<4; n++)
    md5Msg+=String.fromCharCode(0x00);

  var M=new Array();
  var X=new Array();
  for (var n=0; n<md5Msg.length; n+=4)
    M[n >>> 2]=(md5Msg.charCodeAt(n + 3) << 24) |
               (md5Msg.charCodeAt(n + 2) << 16) |
               (md5Msg.charCodeAt(n + 1) << 8) |
                md5Msg.charCodeAt(n);

  var A=0x67452301, AA;
  var B=0xefcdab89, BB;
  var C=0x98badcfe, CC;
  var D=0x10325476, DD;

  for (var n=0; n<M.length; n+=16) {
    for (var p=0; p<16; p++) X[p]=M[n + p];
    AA=A; BB=B; CC=C; DD=D;

    A=FF(A, B, C, D, X[ 0],  7, 0xd76aa478);
    D=FF(D, A, B, C, X[ 1], 12, 0xe8c7b756);
    C=FF(C, D, A, B, X[ 2], 17, 0x242070db);
    B=FF(B, C, D, A, X[ 3], 22, 0xc1bdceee);
    A=FF(A, B, C, D, X[ 4],  7, 0xf57c0faf);
    D=FF(D, A, B, C, X[ 5], 12, 0x4787c62a);
    C=FF(C, D, A, B, X[ 6], 17, 0xa8304613);
    B=FF(B, C, D, A, X[ 7], 22, 0xfd469501);
    A=FF(A, B, C, D, X[ 8],  7, 0x698098d8);
    D=FF(D, A, B, C, X[ 9], 12, 0x8b44f7af);
    C=FF(C, D, A, B, X[10], 17, 0xffff5bb1);
    B=FF(B, C, D, A, X[11], 22, 0x895cd7be);
    A=FF(A, B, C, D, X[12],  7, 0x6b901122);
    D=FF(D, A, B, C, X[13], 12, 0xfd987193);
    C=FF(C, D, A, B, X[14], 17, 0xa679438e);
    B=FF(B, C, D, A, X[15], 22, 0x49b40821);

    A=GG(A, B, C, D, X[ 1],  5, 0xf61e2562);
    D=GG(D, A, B, C, X[ 6],  9, 0xc040b340);
    C=GG(C, D, A, B, X[11], 14, 0x265e5a51);
    B=GG(B, C, D, A, X[ 0], 20, 0xe9b6c7aa);
    A=GG(A, B, C, D, X[ 5],  5, 0xd62f105d);
    D=GG(D, A, B, C, X[10],  9, 0x02441453);
    C=GG(C, D, A, B, X[15], 14, 0xd8a1e681);
    B=GG(B, C, D, A, X[ 4], 20, 0xe7d3fbc8);
    A=GG(A, B, C, D, X[ 9],  5, 0x21e1cde6);
    D=GG(D, A, B, C, X[14],  9, 0xc33707d6);
    C=GG(C, D, A, B, X[ 3], 14, 0xf4d50d87);
    B=GG(B, C, D, A, X[ 8], 20, 0x455a14ed);
    A=GG(A, B, C, D, X[13],  5, 0xa9e3e905);
    D=GG(D, A, B, C, X[ 2],  9, 0xfcefa3f8);
    C=GG(C, D, A, B, X[ 7], 14, 0x676f02d9);
    B=GG(B, C, D, A, X[12], 20, 0x8d2a4c8a);

    A=HH(A, B, C, D, X[ 5],  4, 0xfffa3942);
    D=HH(D, A, B, C, X[ 8], 11, 0x8771f681);
    C=HH(C, D, A, B, X[11], 16, 0x6d9d6122);
    B=HH(B, C, D, A, X[14], 23, 0xfde5380c);
    A=HH(A, B, C, D, X[ 1],  4, 0xa4beea44);
    D=HH(D, A, B, C, X[ 4], 11, 0x4bdecfa9);
    C=HH(C, D, A, B, X[ 7], 16, 0xf6bb4b60);
    B=HH(B, C, D, A, X[10], 23, 0xbebfbc70);
    A=HH(A, B, C, D, X[13],  4, 0x289b7ec6);
    D=HH(D, A, B, C, X[ 0], 11, 0xeaa127fa);
    C=HH(C, D, A, B, X[ 3], 16, 0xd4ef3085);
    B=HH(B, C, D, A, X[ 6], 23, 0x04881d05);
    A=HH(A, B, C, D, X[ 9],  4, 0xd9d4d039);
    D=HH(D, A, B, C, X[12], 11, 0xe6db99e5);
    C=HH(C, D, A, B, X[15], 16, 0x1fa27cf8);
    B=HH(B, C, D, A, X[ 2], 23, 0xc4ac5665);

    A=II(A, B, C, D, X[ 0],  6, 0xf4292244);
    D=II(D, A, B, C, X[ 7], 10, 0x432aff97);
    C=II(C, D, A, B, X[14], 15, 0xab9423a7);
    B=II(B, C, D, A, X[ 5], 21, 0xfc93a039);
    A=II(A, B, C, D, X[12],  6, 0x655b59c3);
    D=II(D, A, B, C, X[ 3], 10, 0x8f0ccc92);
    C=II(C, D, A, B, X[10], 15, 0xffeff47d);
    B=II(B, C, D, A, X[ 1], 21, 0x85845dd1);
    A=II(A, B, C, D, X[ 8],  6, 0x6fa87e4f);
    D=II(D, A, B, C, X[15], 10, 0xfe2ce6e0);
    C=II(C, D, A, B, X[ 6], 15, 0xa3014314);
    B=II(B, C, D, A, X[13], 21, 0x4e0811a1);
    A=II(A, B, C, D, X[ 4],  6, 0xf7537e82);
    D=II(D, A, B, C, X[11], 10, 0xbd3af235);
    C=II(C, D, A, B, X[ 2], 15, 0x2ad7d2bb);
    B=II(B, C, D, A, X[ 9], 21, 0xeb86d391);

    A=add(A, AA); B=add(B, BB); C=add(C, CC); D=add(D, DD);
  }
  return hex(A) + hex(B) + hex(C) + hex(D);
}

function rc4(un,pw) {
  sb=[]; op="";
  for (i=0; i<256; i++) sb[i]=i;
  for (t=0, i=un.length-1; i>=0; --i) {
    t=(un.charCodeAt(i) + sb[i] + t) % 256;
    n=sb[i]; sb[i]=sb[t]; sb[t]=n;
  }
  for (vl=0, i=0; i<pw.length; ++i) {
    t=i & 255; vl=(sb[t] + vl) & 255;
    n=sb[t]; sb[t]=sb[vl]; sb[vl]=n;
    op+=String.fromCharCode(pw.charCodeAt(i) ^ sb[(sb[t] + sb[vl]) % 256]);
  }
  return(op);
}

function toBase64(t) {
  op=""; tl=t.length-1;
  b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  for(m=0, a=0, n=0; n<=tl; n++) {
    c=t.charCodeAt(n);
    op+=b64.charAt((c << m | a) & 63);
    a=c >> (6-m); m+=2;
    if (m==6 || n==tl) {
      op+=b64.charAt(a); m=0; a=0;
    }
  }
  return(op);
}

function fromBase64(t) {
  op="";
  b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  for(m=0, a=0, n=0; n<t.length; n++) {
    c=b64.indexOf(t.charAt(n))
    if (c>=0) {
      if(m) op+=String.fromCharCode((c << (8-m)) & 255 | a);
    a=c >> m; m+=2;
    if (m==8) m=0;
    }
  }
  return(op);
}
