/*
  Developed by Alexander Wilhelm and Tom Wu.

  Commercial License.
*/
var b64="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function encodeBase64(str){var o1,o2,o3,h1,h2,h3,h4,bits,i=0,enc='';do{o1=str.charCodeAt(i++);o2=str.charCodeAt(i++);o3=str.charCodeAt(i++);bits=o1<<16|o2<<8|o3;h1=bits>>18&0x3f;h2=bits>>12&0x3f;h3=bits>>6&0x3f;h4=bits&0x3f;if(isNaN(o3))h4=64;if(isNaN(o2))h3=64;enc+=b64.charAt(h1)+b64.charAt(h2)+b64.charAt(h3)+b64.charAt(h4)}while(i<str.length);return enc}
function decodeBase64(str){var o1,o2,o3,h1,h2,h3,h4,bits,i=0,enc='';do{h1=b64.indexOf(str.charAt(i++));h2=b64.indexOf(str.charAt(i++));h3=b64.indexOf(str.charAt(i++));h4=b64.indexOf(str.charAt(i++));bits=h1<<18|h2<<12|h3<<6|h4;o1=bits>>16&0xff;o2=bits>>8&0xff;o3=bits&0xff;if(h3==64)enc+=String.fromCharCode(o1);else if(h4==64)enc+=String.fromCharCode(o1,o2);else enc+=String.fromCharCode(o1,o2,o3)}while(i<str.length);return enc}
var codeArray=new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
function toHex(n){var result='';var start=true;for(var i=32;i>0;){i-=4;var code=(n>>i)&0xf;if(!start||code!=0){start=false;result+=codeArray[code]}}return(result==''?'0':result)}
function ntos(n){n=n.toString(16);if(n.length==1)n="0"+n;n="%"+n;return unescape(n)}
function pad(str,len,pad){var result=str;for(var i=str.length;i<len;i++){result=pad+result}return result}
function encodeHex(str){var result="";for(var i=0;i<str.length;i++){result+=pad(toHex(str.charCodeAt(i)&0xff),2,'0')}return result}
function decodeHex(str){str=str.replace(new RegExp("s/[^0-9a-zA-Z]//g"));var result="";var nextchar="";for(var i=0;i<str.length;i++){nextchar+=str.charAt(i);if(nextchar.length==2){result+=ntos(eval('0x'+nextchar));nextchar=""}}return result}
function byteArrayToHexStr(b){var s='';for(var i=0;i<b.length;i++)s+=b[i].toString(16);return s}
function hexToByteArray(s){var b=[];if(s.length%2)return;for(var i=0;i<s.length;i+=2)b[Math.floor(i/2)]=parseInt(s.slice(i,i+2),16);return b}
