var regiWait = 0;
var regiTo;
var unameTry = 0;
var commDisplayCount = 4;
var numPlComments = 0;

function getElementsByClassName(node, classname){
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}

if(document.location.search.indexOf("comments=all")!=-1){
	document.write("<style>.articlePluckHidden p{display:none}</style>")
	document.write("<style>#paginationI{display:none}</style>")	
	commDisplayCount = 10;
}else{
	if(document.location.href.indexOf("forums.html")==-1){
		if(document.location.href.indexOf("/photos")==-1){
			commDisplayCount = 0;
			document.write("<style>#articleComments{border-top-width:0px}</style>")
			document.write("<style>#Comments_Container1wrap{padding:0px}</style>")			
			document.write("<style>#viewCommDiv{border-bottom:1px dotted #333;border-top:1px dotted #333;width:99%;padding:8px 0px 8px 0px;}</style>")			
			
			
		}
	}
}

function setATCookie(id, username, timestamp, email, hash) {
	var seed = [id, username, timestamp, email];
	x=seed.join('.')
	setCookie('AT', ['a=' + username.replace(/\s/g, '+'), 'u=' + id, 't=' + timestamp, 'e=' + email, 'h=' + hash].join('&'));
}

function setCookie(name, value) {
	var expires = new Date();
	expires = new Date(expires.getTime() + (typeof value != 'undefined' ? 126144000000 : -3600000));
	document.cookie = name + '=' + escape(value) + '; expires=' + expires.toGMTString() + '; path=/; domain=boston.com';
}

function JSONscriptRequest(fullUrl,ieFlag) {
  this.fullUrl = fullUrl;
  if(ieFlag!="noflag"){this.noCacheIE = '&noCacheIE=' + (new Date()).getTime()}else{this.noCacheIE = ""};
  this.headLoc = document.getElementsByTagName("head").item(0);
  this.scriptId = 'YJscriptId' + JSONscriptRequest.scriptCounter++;
}

JSONscriptRequest.scriptCounter = 1;

JSONscriptRequest.prototype.buildScriptTag = function () {
  this.scriptObj = document.createElement("script");
  this.scriptObj.setAttribute("type", "text/javascript");
  this.scriptObj.setAttribute("src", this.fullUrl + this.noCacheIE);
  this.scriptObj.setAttribute("id", this.scriptId);
}

JSONscriptRequest.prototype.removeScriptTag = function () {
  this.headLoc.removeChild(this.scriptObj);
}

JSONscriptRequest.prototype.addScriptTag = function () {
  this.headLoc.appendChild(this.scriptObj);
}

function getEl(x){return(document.getElementById(x))}
var bw_exp=new Date();
bw_exp.setTime(bw_exp.getTime()+(10*365*24*60*60*1000));
function bwGetCval(offset){var endstr = document.cookie.indexOf (";",offset);if(endstr==-1){endstr=document.cookie.length};return unescape(document.cookie.substring(offset,endstr))}
function bwGetC(name){var arg=name+"=";var alen=arg.length;var clen=document.cookie.length;var i=0;while (i<clen){var j=i+alen;if(document.cookie.substring(i,j)==arg){return bwGetCval (j)};i=document.cookie.indexOf(" ",i)+1;if(i==0){break}}return null}
function bwSetC(name,value,expires,path,domain,secure){document.cookie=name+"="+escape(value)+((expires)?"; expires="+expires.toGMTString():"")+((path)?"; path="+path:"")+((domain)?"; domain="+domain:"")+((secure)?"; secure":"")}
function bwDelC(name, path, domain) {document.cookie = name + "=" + ("; path=/") + ("; domain=boston.com") + "; expires=Thu, 01-Jan-70 00:00:01 GMT";}


function articleOk(){}

function checkComm(){
	if(document.location.href.indexOf("workbench")==-1){
		if(comments_global){
			if(commDisplayCount != 10){
				getEl("relatedContent").innerHTML='<div class="relatedBox" style="padding-bottom:4px;"><table id="commentInviteBox" cellpadding="0" cellspacing="0"><tr><td rowspan="2" style="width:auto"><a href="http://' + document.location.host + document.location.pathname + '?comments=all" id="commentCount"><img style="padding-right:4px;" src="http://cache.boston.com/jobs/i/comments.jpg"/></a></td><td class="commentInvite">Discuss</td></tr><tr><td><a href="http://' + document.location.host + document.location.pathname + '?comments=all" id="commentCount">COMMENTS (<span id="cCount"></span>)</a></td></tr></table></div>' + getEl("relatedContent").innerHTML
				getEl("articleEmbed").style.display="block";
				if(document.location.search.indexOf("comments=all")!=-1){getCcount()};
			}else{
				fGraph = getElementsByClassName(document.body,"firstGraph");
				fGraph[0].innerHTML+="<div id='viewFulArt'><a href='http://" + document.location.host + document.location.pathname + "'>< Read Full Article</a></div>";
				if(document.location.search.indexOf("comments=all")!=-1){getCcountForRepos()};
			}

			if(document.location.search.indexOf("comments=all")==-1){
				aObj = new JSONscriptRequest("http://sitelife.boston.com/ver1.0/Direct/Jsonp?r={%22Requests%22%3A[{%22ArticleKey%22%3A{%22Key%22%3A%22" + pluckID + "%22}}]%2C%22UniqueId%22%3A0}&cb=bcOverCom");
		    	aObj.buildScriptTag();
		    	aObj.addScriptTag();
		    }


		}
	}
}

function bcOverCom(lData){
	if(lData.ResponseBatch){
		if(lData.ResponseBatch.Messages[0].Message=="ok"){
			numPlComments = lData.ResponseBatch.Responses[0].Article.Comments.NumberOfComments
			getEl("cmHeaderCount").innerHTML=getEl("cCount").innerHTML=numPlComments;
			if(commDisplayCount == 4){getEl("cCount2").innerHTML=numPlComments}
		}
	}
}

function getCcountForRepos(){
	var articleKey = new ArticleKey(pluckID);
	var requestBatch = new RequestBatch();
	requestBatch.AddToRequest(articleKey);
	requestBatch.BeginRequest(serverUrl, articleCallbackRepos);
}

function articleCallbackRepos(responseBatch) {
	if(responseBatch.Messages[0].Message=="ok"){
		getEl("cmHeaderCount").innerHTML= numPlComments = responseBatch.Responses[0].Article.Comments.NumberOfComments;
	}
	comLogForm();
}

function getCcount(){
	var articleKey = new ArticleKey(pluckID);
	var requestBatch = new RequestBatch();
	requestBatch.AddToRequest(articleKey);
	requestBatch.BeginRequest(serverUrl, articleCallback);
}

function articleCallback(responseBatch) {
	if(responseBatch.Messages[0].Message=="ok"){
		numPlComments = responseBatch.Responses[0].Article.Comments.NumberOfComments;
		getEl("cmHeaderCount").innerHTML=getEl("cCount").innerHTML=numPlComments;
		if(commDisplayCount == 4){getEl("cCount2").innerHTML=numPlComments}
	}else{
		getEl("cmHeaderCount").innerHTML=getEl("cCount").innerHTML="0";
		if(pluckAccess==0){
			var articleKey = new ArticleKey(pluckID);
			var requestBatch = new RequestBatch();
			var uaAction = new UpdateArticleAction(articleKey, ("http://" + document.location.host + document.location.pathname), escape(pluckTitle), new Section(pluckSection), pluckCats);
			requestBatch.AddToRequest(uaAction);
			requestBatch.BeginRequest(serverUrl,articleOk);
			getEl("seeAllComm").style.display="none";
		}
	}
	//comLogForm();
}

function comLogForm(){
	if(bwGetC("pathAuth")||bwGetC("pathAuthSess")){
		if((bwGetC("PSyncHint")) && (bwGetC("PSyncHint")!="-")){
			if(bwGetC("AT")){
				var landPage = "";
				if(numPlComments>=10){
					landPage = "%26plckCurrentPage%3D" + Math.floor(numPlComments/10);
				}
				getEl("Comments_Container1wrap").style.borderTop="3px solid #b9dbfe";
				getEl("Comments_Container1wrap").style.padding="4px 0px 4px 0px";
				getEl("Comments_Container1").innerHTML=('<div class="Sitelife_PluckLogo"><a target="_blank" href="http://www.pluck.com"><img src="http://sitelife.boston.com/ver1.0/Content/images/poweredbypluck.gif" style="border: 0px none ;"/></a></div><div class="Comments_Container" id="Comments_OuterContainer"><iframe frameborder="0" scrolling="no" border="0" marginheight="0" marginwidth="0" style="width: 539px; height: 175px;" class="Comments_Iframe" src="http://sitelife.boston.com/ver1.0/Comment/CommentsFrame?&amp;plckTargetTitle=' + encodeURI(document.title.replace(/\s+/g, '+')) + '&amp;plckTargetUrl=' + encodeURIComponent(document.location.href) + '&amp;plckTargetKey=' + pluckID + '&amp;plckTargetKeyType=ExternalResource&amp;plckRedirectToUrl=http%3a%2f%2f' + encodeURIComponent(document.location.host + document.location.pathname) + '%3fcomments%3dall' + landPage + '" id="commentsiframe" name="commentsiframe"></iframe></div>')
				tmpPlckUid = bwGetC("AT").split("&u=")[1].split("&")[0];			
				getEl("notYou").innerHTML="&nbsp;&nbsp;&nbsp;Screen name: <a href='http://www.boston.com/community/persona.html?UID=" + tmpPlckUid + "&plckUserId=" + tmpPlckUid + "'>" + bwGetC("PSyncHint") + "</a> (not you? <a href='#' onclick='setCookie(\"AT\");bwDelC(\"pathAuth\");location.reload();return false;'>Log out</a>)</b>"
				getEl("notYou").style.display=getEl("pPolicy").style.display="";
				
			}else{
				getEl("pass").value=getEl("userName").value="";
				getEl("commLoginForm").style.display="";
			}
		}else{
			getEl("commLoginForm").style.display="";
			getEl("unameTrMsg").innerHTML="You must choose a screen name before you can comment";
			getEl("unameS1").style.display=getEl("unameS2").style.display=getEl("unameTr").style.display="";
			unameTry++;
		}
	}else{
		getEl("pass").value=getEl("userName").value="";
		getEl("commLoginForm").style.display="";
	}
}

function bcSubmitLogin() {
	getEl("wait").style.top=(getEl("commLoginForm").offsetTop+"px");
	getEl("wait").style.display="";
	getEl("snameRetry").style.display="none";
	var blnSubmit = true;
	regiWait = 1;
	clearTimeout(regiTo);
	regiTo = window.setTimeout("regiStop()",3000)
	var strUserName = escape(getEl("userName").value);
	var strPass = escape(getEl("pass").value);
	var sName = escape(getEl("sname").value);
	if (strUserName.length <= 0 || strPass.length <= 0) {
		getEl("comErrMsg").innerHTML = "Please enter an email address and password.";
		blnSubmit = false;
		clearTimeout(regiTo);
		getEl("wait").style.display="none";
	}
	if (blnSubmit) {
		pword = hex_sha256(strPass)
		if(sName==""){
			var request = 'http://members.boston.com/reg/loginpluck.do?dispatch=views&username_l=' + strUserName + '&password_l=' + pword;
		}else{
			var request = 'http://members.boston.com/reg/loginpluck.do?dispatch=views&username_l=' + strUserName + '&password_l=' + pword + '&alias=' + sName;
		}
		aObj = new JSONscriptRequest(request);
	    aObj.buildScriptTag();
	    aObj.addScriptTag();
	}
}

var comLogErr = "<div id='cleMsg'>There was a problem with the screen name or login, please <a href='http://members.boston.com/reg/login.do?dispatch=loginpage'>register</a> or <a href='http://members.boston.com/reg/login.do?dispatch=editpage'>update your profile</a>.</div>"

function regiStop(){
	if(regiWait){regiWait=2;getEl("wait").style.display="none";getEl("commLoginForm").innerHTML=(comLogErr)}
}

var pSourcePage = "com";
var nextPage;

function logCb(lData){
	if(pSourcePage == "com"){
		if(regiWait!=2){
			regiWait = 0;
			getEl("wait").style.display="none";
			if(lData.pathAuth){
				bwSetC("pathAuth",lData.pathAuth,bw_exp,"/","boston.com")
				if(lData.PSyncHint){
					bwSetC("PSyncHint",lData.PSyncHint,bw_exp,"/","boston.com")
					setATCookie(lData.pluckId, lData.PSyncHint, lData.Timestamp, lData.Email, lData.pluckHash)
					getEl("commLoginForm").style.display="none";
					var landPage = "";
					if(numPlComments>=10){
						landPage = "%26plckCurrentPage%3D" + Math.floor(numPlComments/10);
					}
					getEl("Comments_Container1wrap").style.borderTop="3px solid #b9dbfe";
					getEl("Comments_Container1wrap").style.padding="4px 0px 4px 0px";
					getEl("Comments_Container1").innerHTML=('<div class="Sitelife_PluckLogo"><a target="_blank" href="http://www.pluck.com"><img src="http://sitelife.boston.com/ver1.0/Content/images/poweredbypluck.gif" style="border: 0px none ;"/></a></div><div class="Comments_Container" id="Comments_OuterContainer"><iframe frameborder="0" scrolling="no" border="0" marginheight="0" marginwidth="0" style="width: 539px; height: 175px;" class="Comments_Iframe" src="http://sitelife.boston.com/ver1.0/Comment/CommentsFrame?&amp;plckTargetTitle=' + encodeURI(document.title.replace(/\s+/g, '+')) + '&amp;plckTargetUrl=' + encodeURIComponent(document.location.href) + '&amp;plckTargetKey=' + pluckID + '&amp;plckTargetKeyType=ExternalResource&amp;plckRedirectToUrl=http%3a%2f%2f' + encodeURIComponent(document.location.host + document.location.pathname) + '%3fcomments%3dall' + landPage + '" id="commentsiframe" name="commentsiframe"></iframe></div>')
					tmpPlckUid = bwGetC("AT").split("&u=")[1].split("&")[0];
					getEl("notYou").innerHTML="&nbsp;&nbsp;&nbsp;Screen name: <a href='http://www.boston.com/community/persona.html?UID=" + tmpPlckUid + "&plckUserId=" + tmpPlckUid + "'>" + bwGetC("PSyncHint") + "</a> (not you? <a href='#' onclick='setCookie(\"AT\");bwDelC(\"pathAuth\");location.reload();return false;'>Log out</a>)"
					getEl("notYou").style.display=getEl("pPolicy").style.display="";
				}else{
					unameTry++;
					if(unameTry==1){
						getEl("unameTrMsg").innerHTML="You must choose a screen name before you can comment";
						getEl("unameS1").style.display=getEl("unameS2").style.display=getEl("unameTr").style.display="";
					}else{
						if((unameTry<3)&&(unameTry>1)){
							getEl("snameMsg").innerHTML="Screen name already taken, try again";
						}else{
							getEl("commLoginForm").innerHTML=(comLogErr)
						}
					}
				}
			}else{
				unameTry++;
				if((unameTry<=3)&&(unameTry>=1)){	
					getEl("snameRetry").style.display="";
				}else{
					getEl("commLoginForm").innerHTML=(comLogErr)
				}
			}
		}
	}else{
	
	
	
	
	
		if(regiWait!=2){
			regiWait = 0;
			getEl("wait").style.display="none";
			if(lData.pathAuth){
				bwSetC("pathAuth",lData.pathAuth,bw_exp,"/","boston.com")
				if(lData.PSyncHint){
					bwSetC("PSyncHint",lData.PSyncHint,bw_exp,"/","boston.com")
					setATCookie(lData.pluckId, lData.PSyncHint, lData.Timestamp, lData.Email, lData.pluckHash)
					getEl("commLoginForm").style.display="none";
					location.reload();
				}else{
					unameTry++;
					if(unameTry==1){
						getEl("unameTrMsg").innerHTML="You must choose a screen name before you can comment";
						getEl("unameS1").style.display=getEl("unameS2").style.display=getEl("unameTr").style.display="";
					}else{
						if((unameTry<3)&&(unameTry>1)){
							getEl("snameMsg").innerHTML="Screen name already taken, try again";
						}else{
							getEl("commLoginForm").innerHTML=(comLogErr)
						}
					}
				}
			}else{
				unameTry++;
				if((unameTry<=3)&&(unameTry>=1)){	
					getEl("snameRetry").style.display="";
				}else{
					getEl("commLoginForm").innerHTML=(comLogErr)
				}
			}
		}	
	
	
	
	
	
	
	
	}
}


//////////SHA-2

/* A JavaScript implementation of the Secure Hash Standard
 * Version 0.3 Copyright Angel Marin 2003-2004 - http://anmar.eu.org/
 * Distributed under the BSD License
 * Some bits taken from Paul Johnstons SHA-1 implementation
 */

var chrsz   = 8;  /* bits per input character. 8 - ASCII; 16 - Unicode      */
var hexcase = 0;/* hex output format. 0 - lowercase; 1 - uppercase        */

function safe_add (x, y) {
  var lsw = (x & 0xFFFF) + (y & 0xFFFF);
  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
  return (msw << 16) | (lsw & 0xFFFF);
}

function S (X, n) {return ( X >>> n ) | (X << (32 - n));}

function R (X, n) {return ( X >>> n );}

function Ch(x, y, z) {return ((x & y) ^ ((~x) & z));}

function Maj(x, y, z) {return ((x & y) ^ (x & z) ^ (y & z));}

function Sigma0256(x) {return (S(x, 2) ^ S(x, 13) ^ S(x, 22));}

function Sigma1256(x) {return (S(x, 6) ^ S(x, 11) ^ S(x, 25));}

function Gamma0256(x) {return (S(x, 7) ^ S(x, 18) ^ R(x, 3));}

function Gamma1256(x) {return (S(x, 17) ^ S(x, 19) ^ R(x, 10));}

function Sigma0512(x) {return (S(x, 28) ^ S(x, 34) ^ S(x, 39));}

function Sigma1512(x) {return (S(x, 14) ^ S(x, 18) ^ S(x, 41));}

function Gamma0512(x) {return (S(x, 1) ^ S(x, 8) ^ R(x, 7));}

function Gamma1512(x) {return (S(x, 19) ^ S(x, 61) ^ R(x, 6));}

function core_sha256 (m, l) {
    var K = new Array(0x428A2F98,0x71374491,0xB5C0FBCF,0xE9B5DBA5,0x3956C25B,0x59F111F1,0x923F82A4,0xAB1C5ED5,0xD807AA98,0x12835B01,0x243185BE,0x550C7DC3,0x72BE5D74,0x80DEB1FE,0x9BDC06A7,0xC19BF174,0xE49B69C1,0xEFBE4786,0xFC19DC6,0x240CA1CC,0x2DE92C6F,0x4A7484AA,0x5CB0A9DC,0x76F988DA,0x983E5152,0xA831C66D,0xB00327C8,0xBF597FC7,0xC6E00BF3,0xD5A79147,0x6CA6351,0x14292967,0x27B70A85,0x2E1B2138,0x4D2C6DFC,0x53380D13,0x650A7354,0x766A0ABB,0x81C2C92E,0x92722C85,0xA2BFE8A1,0xA81A664B,0xC24B8B70,0xC76C51A3,0xD192E819,0xD6990624,0xF40E3585,0x106AA070,0x19A4C116,0x1E376C08,0x2748774C,0x34B0BCB5,0x391C0CB3,0x4ED8AA4A,0x5B9CCA4F,0x682E6FF3,0x748F82EE,0x78A5636F,0x84C87814,0x8CC70208,0x90BEFFFA,0xA4506CEB,0xBEF9A3F7,0xC67178F2);
    var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
    var W = new Array(64);
    var a, b, c, d, e, f, g, h, i, j;
    var T1, T2;

    /* append padding */
    m[l >> 5] |= 0x80 << (24 - l % 32);
    m[((l + 64 >> 9) << 4) + 15] = l;

    for ( var i = 0; i<m.length; i+=16 ) {
        a = HASH[0];
        b = HASH[1];
        c = HASH[2];
        d = HASH[3];
        e = HASH[4];
        f = HASH[5];
        g = HASH[6];
        h = HASH[7];

        for ( var j = 0; j<64; j++) {
            if (j < 16) W[j] = m[j + i];
            else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);

            T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
            T2 = safe_add(Sigma0256(a), Maj(a, b, c));

            h = g;
            g = f;
            f = e;
            e = safe_add(d, T1);
            d = c;
            c = b;
            b = a;
            a = safe_add(T1, T2);
        }

        HASH[0] = safe_add(a, HASH[0]);
        HASH[1] = safe_add(b, HASH[1]);
        HASH[2] = safe_add(c, HASH[2]);
        HASH[3] = safe_add(d, HASH[3]);
        HASH[4] = safe_add(e, HASH[4]);
        HASH[5] = safe_add(f, HASH[5]);
        HASH[6] = safe_add(g, HASH[6]);
        HASH[7] = safe_add(h, HASH[7]);
    }
    return HASH;
}

function core_sha512 (m, l) {
    var K = new Array(0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc, 0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118, 0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2, 0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694, 0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65, 0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5, 0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4, 0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70, 0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df, 0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b, 0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30, 0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8, 0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8, 0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3, 0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec, 0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b, 0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178, 0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b, 0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c, 0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817);
    var HASH = new Array(0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179);
    var W = new Array(80);
    var a, b, c, d, e, f, g, h, i, j;
    var T1, T2;

}

function str2binb (str) {
  var bin = Array();
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < str.length * chrsz; i += chrsz)
    bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
  return bin;
}

function binb2str (bin) {
  var str = "";
  var mask = (1 << chrsz) - 1;
  for(var i = 0; i < bin.length * 32; i += chrsz)
    str += String.fromCharCode((bin[i>>5] >>> (24 - i%32)) & mask);
  return str;
}

function binb2hex (binarray) {
  var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i++)
  {
    str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
           hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8  )) & 0xF);
  }
  return str;
}

function binb2b64 (binarray) {
  var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
  var str = "";
  for(var i = 0; i < binarray.length * 4; i += 3)
  {
    var triplet = (((binarray[i   >> 2] >> 8 * (3 -  i   %4)) & 0xFF) << 16)
                | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 )
                |  ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF);
    for(var j = 0; j < 4; j++)
    {
      if(i * 8 + j * 6 > binarray.length * 32) str += b64pad;
      else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F);
    }
  }
  return str;
}

function hex_sha256(s){return binb2hex(core_sha256(str2binb(s),s.length * chrsz));}
function b64_sha256(s){return binb2b64(core_sha256(str2binb(s),s.length * chrsz));}
function str_sha256(s){return binb2str(core_sha256(str2binb(s),s.length * chrsz));}