function showValidatorMessageBox(showIt)
{
	if(Page_ValidationSummaries)
	{
		for (sums = 0; sums < Page_ValidationSummaries.length; sums++) 
		{
			Page_ValidationSummaries[sums].showmessagebox = (showIt) ? "True" : "False";
		}
    }
}

function clipboard_cut(value, isFolder) {				
	createCookie('copypaste', value + ':' + isFolder + ':cut', 1);
}

function clipboard_copy(value, isFolder) {			
	createCookie('copypaste', value + ':' + isFolder + ':copy', 1);
}

function clipboard_Value()
{
    var clipCookie = readCookie('copypaste');    
    if((!clipCookie) || (clipCookie == null))
    {
        return null;
    }
    else
    {
        var clipParts = clipCookie.split(':');   
        return (clipParts.length == 3) ? clipParts[0] : null;
    }
}

function clipboard_inAction(action)
{
    var clipCookie = readCookie('copypaste');    
    if((!clipCookie) || (clipCookie == null))
    {
        return false;
    }
    else
    {
        var clipParts = clipCookie.split(':');   
        return ((clipParts.length == 3) && ((!action) || (clipParts[2] == action)));
    }
}

function clipboard_paste(newParent) {
    var clipCookie = readCookie('copypaste');
	if ((!clipCookie) || (clipCookie == null)) 
	{
	    if (top.hideLoader) top.hideLoader();
	}
	else
	{
	    var cookieParts = clipCookie.split(':');
	    if(cookieParts.length == 3)
	    {
	        var value = cookieParts[0];
	        var isFolder = (cookieParts[1].toLowerCase() == 'true') ? true : false;
	        var action = cookieParts[2];	        
		    var options = {
				    parameters: 'newParent=' + parseInt(newParent),
				    onComplete: function() {
					    if(top.hideLoader)
						    top.hideLoader();
					    },
				    onSuccess: function(transport){
					    var xmlRoot = transport.responseXML.documentElement;
					    var error = xmlRoot.getAttribute('Error');
					    if (error != null && error.length != 0)
					    {
						    alert(error);
						    return;
					    }
					    if (isFolder && action == 'cut')
					    {
						    if (typeof(removeNode) == 'function')
							    removeNode(value);
						    else
							    parent.document.getElementById('navigationframe').contentWindow.removeNode(value);
					    }
					    if (typeof(objectAdded) == 'function') {
    					    
					        var newObjId = null;
					        if(action == 'cut')
					            newObjId = top.cutItem;
					        else { // copy-paste action 
                                var results = transport.responseXML.getElementsByTagName('Result');
                                if(results.length > 0) {
                                    newObjId = results.item(0).firstChild.nodeValue;
                                }
					        }
						    objectAdded(newParent, isFolder, newObjId);
					    }
					    else {
						    refresh();
				        }
					    if (action == 'cut') {
						    action = null;
						    top.cutItem = null;
						    value = null;
						    isFolder = false;
					    }
				    }
			    };
    		
		    if(top.showLoader)
			    top.showLoader();
    			
		    callWebservice(
			    parseInt(value), 
			    'MMObjectService', 
			    (action == 'cut') ? 'MoveTo' : 'CopyTo',
			    options);
        }
	}
}

function mmConfirm(message, objid, action, actionargs)
{	
	var url = top.mm_baseUrl + objid + '/Confirm.aspx';
	if (actionargs.itemId)
	{
	    url += '?action=' + actionargs.itemId;
        if(actionargs.itemId=='delete')
		    url += "&showReferenceWarning=true";
        else
            url += "&showReferenceWarning=false";		   
    }
	else
		url += "?showReferenceWarning=false";
	Dialog(url, 400, 200, message, action, actionargs);
}

function displayObject(objectID, target, template)
{
    if(objectID > 0)
    {
	    newURL = top.mm_baseUrl;	
	    target.location.href = newURL + objectID + '/' + template;
	}
}

function deleteObject(objectId, isFolder, parentIdNeeded)
{
	if (top.showLoader)
	{
		top.showLoader();
	} 
	if (!parseInt(objectId))
	{
		if (top.hideLoader) {top.hideLoader();}
		return; //hmmmm.. how come?
	}
	var opts = {};
	if ((typeof(myGridUpdater) != 'undefined') && isFolder) {
		opts.onSuccess = function() {
			refresh();
			parent.document.getElementById('navigationframe').contentWindow.removeNode(objectId);
		};
	}
	else if (typeof(myGridUpdater) != 'undefined') {
		opts.onSuccess=refresh;
	}
	else if (typeof(mytreeview) != 'undefined') {
		opts.onSuccess = function() {
			removeNode(objectId, parentIdNeeded);
			if (typeof(top.objectDeleted) == 'function')
			{
				top.objectDeleted(objectId);
			}
		};
	}
	else {
		opts.doRefresh = true;
	}
	if (document.getElementById('about') != null)
		displayObject(parentId, document.getElementById('about').contentWindow, 'about.aspx');
	callWebservice(objectId, 'MMObjectService', 'Delete', opts);
	
	eraseCookie('copypaste');
	top.cutItem = null;
}

function goToWebsite(objectId)
{
	if (!parseInt(objectId))
		return; // to be on the safe side
	var url = top.mm_baseUrl + objectId + '/WebsiteUIService.asmx/GetSiteUrl';
	var response = new top.Ajax.Request(url, {method: 'get', asynchronous:false}).transport.responseXML;
	var siteUrl = response.documentElement.firstChild.text;		
	top.location.href = siteUrl + '/admin.aspx';
}

function moveup(objectId)
{
    callWebservice(objectId, 'MMObjectService', 'MoveUp', {doRefresh: true, objectId: objectId, folderChanged: true});
}

function movedown(objectId)
{
    callWebservice(objectId, 'MMObjectService', 'MoveDown', {doRefresh: true, objectId: objectId, folderChanged: true});
}

function moveobject(objectId, parentId, displayOrder)
{
	callWebservice(objectId, 'MMObjectService', 'MoveObject',
		{ doRefresh: true, parameters: 'objectID='+objectId
		+ '&newParentID='+parentId+'&newDispOrder='+displayOrder });
}

function callWebservice(objectId, serviceName, functionName, serviceOptions, withLoader)
{
	if (!parseInt(objectId))
		return; //hmmmm.. how come?
		
	if((withLoader) && (top.showLoader))
		top.showLoader();
				
	var options = {
	        method: 'get',
			//onComplete: function() {top.hideLoader();},
			onSuccess: (serviceOptions && serviceOptions.doRefresh ? function() {refresh(serviceOptions.objectId, serviceOptions.parentId, serviceOptions.folderChanged); if(top.hideLoader) top.hideLoader();} : function() {if(top.hideLoader) top.hideLoader();}),
			//onLoading: function() {top.showLoader();},
			onFailure: function(response) {alert(response.responseText); if(top.hideLoader) top.hideLoader();}
		};
	top.Object.extend(options, serviceOptions);
	var url = ((top.mm_baseUrl) ? top.mm_baseUrl : '') + parseInt(objectId) + '/' + serviceName + '.asmx/' + functionName;
	new top.Ajax.Request(url, options || {});
}

var m_idfield, m_displayfield
function openFileDialog(moduleurl, idfield, displayfield, actionHandler) {

    m_idfield = idfield;
    m_displayfield = displayfield;

    var url = '';
	var height = 440;
	var width = 610;
	var vleft = (screen.availWidth / 2) - (width / 2);
	var vtop = (screen.availHeight / 2) - (height / 2);		
	var idvalue, dispvalue;
	if(idfield && $(idfield))
		idvalue = $F(idfield);
	if(displayfield && $(displayfield))
		dispvalue = $F(displayfield).toLowerCase();

    if (moduleurl.toString().indexOf('?') < 0)
        moduleurl += '?';

    if ((!(isNaN(idvalue))) && (idvalue > 0))
	{
	    var parts = moduleurl.split('/');

	    if (parts.length == 1) {
	        url = idvalue + '/' + parts[0];
	    }
	    else {
	        for (i = 0; i < parts.length; i++) {
	            if (i == parts.length - 2) {
	                if (isNaN(parseInt(parts[i]))) {
	                    url += parts[i]
	                    url += '/';
	                    url += idvalue;
	                }
	                else {
	                    url += idvalue;
	                }
	            }
	            else {
	                url += parts[i];
	            }

	            if (i < parts.length - 1) {
	                url += '/';
	            }
	        }
	    }
	}
	else if((dispvalue) && (dispvalue.indexOf('.aspx') > 0))
	{
		if(dispvalue.indexOf('../') != 0) {
			
			var urlparts = dispvalue.split('/');
					
			for(i=0; i<urlparts.length-1; i++)
			{
				url += urlparts[i] + '/';
			}
			
			modparts = moduleurl.split('/');
			url += modparts[modparts.length-1];
		}
		else {
			var urlparts = dispvalue.split('/');
			
			var moduleurlparts = moduleurl.split('/');
			for(var i = 0; i < moduleurlparts.length; i++) {
				if(i != moduleurlparts.length-2) {
					url += moduleurlparts[i] + '/';
				}
				else url += urlparts[urlparts.length-2] + '/';
			}
			
			url = url.substring(0, url.length-1);
			url += '&openlast=false'; // to make sure this object is selected instead of the last visited object (from session).
		}
	}
	else
	{
		url = moduleurl;
	}
	
	if(!actionHandler)
		actionHandler = defaultActionHandler;
	
	var baseUrl = null;
	
	try
	{
		if(window.top && window.top.mm_baseUrl)
			baseUrl = window.top.mm_baseUrl;
		else if(window.opener && window.opener.top.mm_baseUrl)
			baseUrl = window.opener.top.mm_baseUrl;
		else if(window.opener && window.opener.opener && window.opener.opener.top.mm_baseUrl)
			baseUrl = window.opener.opener.top.mm_baseUrl;		
	}
	catch(e){}
		
	var init = {
		mm_baseUrl: baseUrl
	}

	url += "&idfield=" + idfield + "&displayfield=" + displayfield;
	
	Dialog(url, width, height, init, actionHandler, null);
	//var win = window.open(url + "&idfield=" + idfield + "&displayfield=" + displayfield, 'opendialog', 'top=' + vtop + ',left=' + vleft + ',width=' + width + ',height=' + height + ',fullscreen=no,toolbar=no,status=no,menubar=no,scrollbars=no,resizable=no,directories=no,location=no')
	//win.focus();
}

// default action handler for parameters returned
// by opendialog, only used when no 'actionHandler' is
// set when calling the 'openFileDialog' function;
function defaultActionHandler(returnVal, actionArgs)
{
	if(returnVal && returnVal.ok){
		if(returnVal.objectName) {
			$(m_displayfield).value = returnVal.objectName;
		}
		if(returnVal.objectId) {
			$(m_idfield).value = returnVal.objectId;
		}
		if (typeof(actionHandled) == 'function')
		    actionHandled(returnVal);
	}
}

function Dialog(url, width, height, init, action, actionargs, useVeil) {
    if (typeof init == "undefined") {
        init = window;     // pass this window object by default
    }
    
    if (window.showModalDialog && !useVeil) 
    { 
        // here we hope that Mozilla will never support document.all
        var value =
            window.showModalDialog(url, init, 'dialogWidth: ' + width + 'px; dialogHeight: ' + height + 'px;resizable: no; help: no; status: no; scroll: no');
        
        if (action) {
            action(value, actionargs);
        }
    }
    else
    {
		if (!top.veil)
			top.veil = new Veil(top);
		top.veil.show();
		
		var dlg = window.open(url, "ha_dialog","toolbar=no,menubar=no,personalbar=no," +
										"width=" + width + ",height=" + height + ",scrollbars=no,resizable=no," +
										"dependent=yes,z-lock=yes,modal=yes");
		
		dlg.dialogArguments = init;
		dlg.actionArgs = actionargs;
		// make up a function to be called when the Dialog ends.
		dlg._return = function () {
			
			if (dlg.removeEventListener) {
				dlg.removeEventListener('unload', dlg._return, false);
			}
			else if (dlg.detachEvent) {
				dlg.detachEvent('onunload', dlg._return);
			}
			
			if (action) {
				action(dlg.returnValue, dlg.actionArgs);				
			}
			top.veil.hide();
		};
		
		var set_observer = function() {
		
			if (dlg.addEventListener) {
				dlg.addEventListener('unload', dlg._return, false);
			}
			else if (dlg.attachEvent) {
				dlg.attachEvent('onunload', dlg._return);
			}			
			
			if (dlg.removeEventListener) {
				dlg.removeEventListener('load', set_observer, false);
			}
			else if (dlg.detachEvent) {
				dlg.detachEvent('onload', set_observer);
			}
		};		
			
		if (dlg.addEventListener) {
			dlg.addEventListener('load', set_observer, false);
		}
		else if (dlg.attachEvent) {
			dlg.attachEvent('onload', set_observer);
		}
	}
};

var Veil = top.Class.create();
Veil.prototype = {

	initialize: function(options)
	{
		this.win = options.window || window;
		this.options = options || {};
	},
	
	show: function()
	{
		if (this.veilOverlay == null) { // once per page
			this.veilOverlay = this.win.document.createElement('div');
			this.veilOverlay.className = this.options.className || "mmVeil"; // CSS className
			this.veilOverlay.style.zIndex =  this.options.zIndex || 100000;
			this.veilOverlay.style.position = 'absolute';
			this.veilOverlay.style.display = 'none';
			this.veilOverlay.style.top = '0px';
			this.veilOverlay.style.left = '0px';
			this.veilOverlay.style.cursor = "default";
			this.veilOverlay.style.backgroundColor = '#6a74cb';
			this.veilOverlay.style.filter = 'alpha(opacity=5)';
			//this.veilOverlay.style.mozOpacity = '0.05';
			this.veilOverlay.style.opacity = '0.05';
  
  			this.veilOverlay.innerHTML = "&nbsp;";
			this.setWidth();
			top.Event.observe(this.win, 'resize', this.setWidth.bindAsEventListener(this), false);
			this.win.document.body.appendChild(this.veilOverlay);
		}
		this.veilOverlay.style.display = "block";
	},

	hide: function()
	{
		if (this.veilOverlay != null)
			this.veilOverlay.style.display = "none";
	},

	setWidth: function() {
		this.veilOverlay.style.width = this.win.document.body.scrollWidth;
		this.veilOverlay.style.height = this.win.document.body.scrollHeight;
	}
}

function KeyWordHiLite()
{ 
 
  var rng;
  var before = '<span class="search_texthighlight">';
  var after = '</span>';

  try
  {
     
    keywords = arguments;
    
    if (!keywords || keywords.length < 1) { return true; }
 
    for(k=0;k<keywords.length;k++)
    {

      rng = document.body.createTextRange();  
  
      for (i=0;rng.findText(keywords[k])!=false; i++)
      { 
 
        try       { rng.pasteHTML(before + rng.text + after);   }
        catch (e) { alert(e.message);    }	
        finally   { rng.collapse(false); }
      
      }

      rng.collapse(true);
    }

  }
  catch (exception) { alert(exception.message); }
  
}

function getQueryStringArray() {
  var querystring_data = new Object();
    // The Object ("Array") where our data will be stored.
  separator = ',';
    // The token used to separate data from multi-select inputs
  query = '' + this.location;
  qu = query
    // Get the current URL so we can parse out the data.
    // Adding a null-string '' forces an implicit type cast
    // from property to string, for NS2 compatibility.
  query = query.substring((query.indexOf('?')) + 1);
    // Keep everything after the question mark '?'.
  if (query.length < 1) { return false; }  // Perhaps we got some bad data?
  keypairs = new Object();
  numKP = 1;
    // Local vars used to store and keep track of name/value pairs
    // as we parse them back into a usable form.
  while (query.indexOf('&') > -1) {
    keypairs[numKP] = query.substring(0,query.indexOf('&'));
    query = query.substring((query.indexOf('&')) + 1);
    numKP++;
      // Split the query string at each '&', storing the left-hand side
      // of the split in a new keypairs[] holder, and chopping the query
      // so that it gets the value of the right-hand string.
  }
  keypairs[numKP] = query;
    // Store what's left in the query string as the final keypairs[] data.<
  for (i in keypairs) {
    keyName = keypairs[i].substring(0,keypairs[i].indexOf('='));
      // Left of '=' is name.
    keyValue = keypairs[i].substring((keypairs[i].indexOf('=')) + 1);
      // Right of '=' is value.
    while (keyValue.indexOf('+') > -1) {
      keyValue = keyValue.substring(0,keyValue.indexOf('+')) + ' ' + keyValue.substring(keyValue.indexOf('+') + 1);
        // Replace each '+' in data string with a space.
    }
    keyValue = unescape(keyValue);
      // Unescape non-alphanumerics
    if (querystring_data[keyName]) {
      querystring_data[keyName] = querystring_data[keyName] + separator + keyValue;
        // Object already exists, it is probably a multi-select input,
        // and we need to generate a separator-delimited string
        // by appending to what we already have stored.
    } else {
      querystring_data[keyName] = keyValue;
        // Normal case: name gets value.
    }
  }
  return querystring_data;
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

function outlookTree(rootNodeID)
{
    this.id = rootNodeID;
    this.rootNode = document.getElementById(this.id);
    this.selectedModules = new Array();
    	    
    var sel = readCookie('otree');	               
    if(sel)
    {
        var parts = sel.split(':');
        for(var i=0; i<parts.length; i+=2)
        {
            if((parts[i] == this.id) && (parts.length > i+1))
            {
                var selected = parts[i+1].split('-');
                for(var a=0; a<selected.length; a++)
                {
                    if((selected[a]) && (selected[a].length > 0))
                    {
                        this.selectedModules.push(selected[a]);
                    }
                }            
                break;
            }
        }
    }
    
    var mLists = this.rootNode.getElementsByTagName('DIV');
    for(var i=0; i<mLists.length; i++)
    {
	    if(mLists[i].className == 'modulename')
	    {
            mLists[i].onclick = this.toggleModule.bind(this);
            mLists[i].onmouseover = this.overModule.bind(this);
            mLists[i].onmouseout = this.outModule.bind(this);
        }
    }	   
    
    this.updateList();
}	

outlookTree.prototype.overModule = function(e)
{
    var evn = (e) ? e : window.event;        
    var elem = (evn.srcElement) ? evn.srcElement : evn.target;
    while((elem) && (elem.className.indexOf('modulename') < 0))
        elem = elem.parentElement;
    
    if((elem) && (elem.className.indexOf('_hover') < 0))
        elem.className += '_hover';               
}

outlookTree.prototype.outModule = function(e)
{
    var evn = (e) ? e : window.event;
    var elem = (evn.srcElement) ? evn.srcElement : evn.target;
    if(elem)    
        elem.className = elem.className.replace('_hover', '');
}

outlookTree.prototype.toggleModule = function(e)
{
    var evn = (e) ? e : window.event;
    var elem = (evn.srcElement) ? evn.srcElement : evn.target;
    var mid = elem.getAttribute('moduleid');
    if(mid)
    {
        var newItem = true;
        
        for(var i=this.selectedModules.length-1; i>=0; i--)
        {
            if(this.selectedModules[i] == mid)
            {
                newItem = false;
                this.selectedModules.splice(i, 1);
                break;
            }
        }
        
        if(newItem)
        {
            this.selectedModules.push(mid);
        }
        
        this.updateList();
    }
}

outlookTree.prototype.updateList = function()
{
    var bList = this.rootNode.getElementsByTagName('DIV');
    
    for(var i=0; i<bList.length; i++)
    {
        var mid = bList[i].getAttribute('moduleid');
        
        if(mid)
        {
            var selected = (this.isSelected(mid));
            
            if(bList[i].className == 'blocklist')
            {            
                bList[i].style.display = selected ? 'block' : 'none';
                                
                if((selected) && (!bList[i].getAttribute('wasselected')))
                {
                    var elms = getChildElements(bList[i]);
                    for(var bls=0; bls<elms.length; bls++)
                    {
                        var ico = getChildElements(elms[bls])[0];
                        ico.setAttribute('src', ico.getAttribute('iconsrc'));
                    }
                    
                    bList[i].setAttribute('wasselected', true)
                }
            }
            else if(bList[i].className.indexOf('modulename') == 0)
            {
                if(selected)
                { 
                    if(!bList[i].className.indexOf('modulenameselected') == 0)
                        bList[i].className = bList[i].className.replace('modulename', 'modulenameselected');
                }
                else
                {
                    if(bList[i].className.indexOf('modulenameselected') == 0)
                        bList[i].className = bList[i].className.replace('modulenameselected', 'modulename');                
                }
            }
        }
    }
}

outlookTree.prototype.isSelected = function(moduleID)
{
    for(var j=0; j<this.selectedModules.length; j++)
    {
        if(this.selectedModules[j] == moduleID)
        {
            return true;
        }
    }
    
    return false;
}

outlookTree.prototype.save = function()
{
    var newCookie = this.id + ':';    
    for(var o=0; o<this.selectedModules.length; o++)
    {
        newCookie += this.selectedModules[o] + '-';
    }    
    newCookie += ':';
    
    var sel = readCookie('otree');	               
    if((sel) && (sel.length > 0))
    {
        var parts = sel.split(':');
        for(var i=0; i<parts.length; i+=2)
        {
            if((parts[i]) && (parts[i].length > 0) && (parts[i] != this.id) && (parts.length > (i+1)))
            {
                newCookie += parts[i] + ':' + parts[i+1] + ':';
            }
        }
    }
    
    createCookie('otree', newCookie.replace('--', '-'), 365);
}	

function getChildElements(parent)
{
    if(parent.children) //IE
    {
        return parent.children;
    }
    else //W3C
    {
        var childElements = new Array();    
        for(var i=0; i<parent.childNodes.length; i++)
        {
            if(parent.childNodes[i].nodeType == Node.ELEMENT_NODE)
            {
                childElements.push(parent.childNodes[i]);
            }
        }    
        return childElements;
    }
}

var mmCryptoData = new Array(76,102,114,122,92,99,115,108,76,126,106,83,77,84);
var mmCryptoKey = '6228e5ed74b46ee1a95f90a4dd07bcd14cee98116487224a80355f58e6b18221e43da743bbf88b7f69c4b1b42207b1894b4ce4674060d61f9b0a9435a22b075635f28804b4e2acfe32688ce804e9454a046c28ddf6d980b06736bcc3f2ec33d998dd00a35a56d91fcc3f3a160bd66b59e909ae24fc18a9033604534b4ec43cd084d782f4904dcf1abff35c6bb71d5758b3649f7886ae95be5a84e73750e7a0e5ea6c3b77a71c7917d7744097780e34c7e3d6c4ad1e54897cb910bac741f058d418facb7d9012c2d7cf2a7c6b631ac050186793a2986e52442e38e4ae2614bb5488946a1cba454af3d9f500e0ea17c26d9b87011878a3aa15aa32002a830a5bdd04afc569f2e0394a5e905c872dc932dcbfb7717c5c854b693477c9694db59417b3525ae672964de686e1fd37be89c8dfd6d10a4f8e20cf23ba9faa441b0ec37b7d78c4fb24673db0f3e4e86cb8e71df9fcea5bdd77c770b855b8752ca131343ab939abd8f34780ff4c1001ef89b13d310c70a0f1e797d8a88d226d514be937d658baa9c90114310a07f2956b17977845366afb14b16a502fcfac2bfbc36e308fca495129a3b1391aa9b592ee6a36c4e1fe09968dbbedebf60775f020dd4e140eb9e441d907cde140412dbb73e98018e4dcccad21e4d5f03b9e6f69d7887f0a39963fa247953ed1e5c28097efff91e6d92e496ffd8aa0f348b6a4516fada44d2b87f88afd429f08587bc843e245ae87ec0fca6eccd666b428ce189c7eba8bed54355f5857608b16039248d66b8e55e729de94836760b6d61ad281a6f51925dc1032699fc1c9d19f94c63b6909b7eb26c05f46e2dd87475b40689ed3a6eb36519304c9b0e4f4a2864553bc08abc8444b6bf33398522d8d70436965351bdff51adc1bf7b0ccb52eba895f84c229b46d43aab3220f351c47195426bd6c272872da5c7a4895ea660fe8896634327d88756ae59c41e520c71ba183dec5e4d7833b6e5d459f3e87e61d7ea90d8352fdebf73f409010b44eccc9a5c87ac8039edc0dacd9fd63117734abe2a3a1cccbd09abad0acbcc60d31dde1457cbc4de2fe807ea60dda1a74dbe954a75077300345071998368941dd63253a6ebc2001ffff0906b8fefa97724716021937e3f84bf9376f3057566d468dd2f98d9e2d1f95a32ba75e19e79e3990ea7e53fc1f0de5f197a5acf99e01ee1453b8e34f351d31c64651a2127753e41c2d5f2cc2ca54bf3ac3f76502b022bad96cd2038d6d36691032e498a0d8254f66e32b417a4f29066f7ea9f89cd40f7cf3313406c7f2ebc099cfcf52f26d394e1d9959c9668025b10acc1285714734ab0c529376ff30881f6467f39d4e7d95be45775c9cdbaf94f9381394e544e0dd411f7baab37d7a5959673cdbd7ac5694aa40d106e5bd3f7e6ce1a1f20b971e0714dd5ed6867efcc316bef64ba74c21ad592dce59e28f839ee94302c81315357831e76b7f7aefd8a619f9bd1aaa22421df8e8474a31d9dd6322276161e88d9ce0f992f2d0644003f35ea16a5f7a9544561b1338bc0aa6d8385d0b8d5b908f1af06e235304cbe7d9f0cef2eb09736c79b2717e41c06dc068d5a98a23447303297a8ebca81a4a828d38b91c4f60a974987925aa35f5bf19c057d0a2b51da1ca9221dbb9084476e3b8a4f224e38ae0a89bceff0ae3b59aa46f9d26b7c5f09daaccc98c4f5f75e02cd1cf3149fe4c7d602d27c288c8fe6d134fccc9276019c863f924debacc68d09f859f4e455866c3e9afa4620356f4af396ed46e78c5264efa16c6b8b55adf7774c1307bea2d4550240042aced80fabb8b1d59257cae2ddacd3c5541efdab59d00ee0d441dadd8750f975df79c70e69f4ebcd8ee6551b3490673b026baa0134dda7a78a84a820b4c9b841f25138492db5d354b41b1db10e8dc3e83794c2f065050e1a585f0e7d60ab9b199081b7b28d0affcc130683cfbee295be60082e521b6756008ffb53053f04bb6fdd5e2b00857bf1499ad8ad631b046f6ddfed88914c5cde70e901865a0aa74294b48ee56b98857d76015e83dd0b41a4fc3dc4085f155cfb88b5d7e529ca73316924cb080133982405e039861b722089d40522e51db630be03559719c21aa4db94593c7c50e350c0b7b9f8dd5be26a4f6497fd788ee6ef305b135a43bfeae52d6caa12f7fd41a98632a0c49cfb78db2ef572c7a22a39d7425f97c68c9f7a155a11dc06cd18d466d9273add65a46fd683344d74b1a45d79bcd664349e712f411d7f520e7f8584246db7836e9b6a73f1be2ccfaf9367f394175c3d922e4e59deb11441b91960ede5ac6cfa10eaddaae482c50bb4332051a363e416beae03a01f8adae6ee6233e25b23fa53475020d64ebb7299c4b2e050e2c4e55c8fb4f06a057c48bd6d583a5882ede2f1c5ec73e77807815ca7341e01e12642c29da1319570ce6357939d7e8912d2904e78f8385459b9a8605f8573af7f5d91f4e4d8b9266f11e6fd85c9744b1344bd24026add5877a5c3e292f8fb7d4e71ffcc62ef65ce6013631da36304328cf7d4f3dfb2efaeb41d3294e3888b4bc8f6f4c31424167a7a1de337a4ed3494c06af80ef92b57e6705303195650ccf64f5dcb05dfaf6a4827ec04233f685c03270bb4996a97a4b728c36f49f52b0984a37a57cf89bb2e08e10fb348b6a4334aae139d20261f2016ede75eeda1d544689cb645fe7e6ebd95e2749a9608eded72f008d45c191e26d5bab70f54120bfc84427e66d67c1db8bf59f75ee165381180459fd620c2342fedce50833218ab736bc564974ed586fd814ab32bfb057010acfac92266aff2cced2c79c51d90e0a1844be38728a68a11fb1f09dfd61594647fc119c01740f3f9cfd09bf548e48d8838b7b0198d848396e2a7ef63912092a9a46f948f1a408ec646dee8f87fffd8187fe50923064df671d35c5fbab0c3cb6ba0f27c8b44ff7894e9fb3b7f325a402a26d03e14fe93917efdf61b1697522d4d89518a0c2a747d7aa3b0d11369528c4bb43e7491c55d8e3f3e02cfd7cea5203a92d4ba7d8ebb1e9bfe033db16af02102c8072b24ad2c2e6290e8c5dbcf25fa0351d9cbaf4cff8d0fb7c3310443a393091fbbb50874ded353d8c616330a7f1a3602cceae5a67250d9728fa5f86c7bf16f990c83248ace6c9b1cad18a30f91fec5a6b89af3e3e0dfc20bbdea6106520e42e9f45c88a9f7cba599f0949c43a6e9922575c1923686adc9e7c4fc7e7dcbb56ab618644a224eaf5ceadc67fecc2dc075e4ecfa30613412a93432b62663c36aec3829b1555a52a1f03d5c4da058bc598cb709d6a70a4df42aa6fcafe2a670d2ca0301a138c0bdcfcd6ff402278e07ecc31d731d30085b4f5b08a488545847f2389b27b7298daa48916d16b1d728083c87d8f9cd8fcc5daff0f359ff96573864c0ac1ce1a2e40223fd45a2ae4f4d4d61525c1d547e20cb347618de1ccd15b412afb73b5996221aed714df7af3b254c38bf5a78e080c725fbc296e46034be5f465dd2558a704218cd3643a8b56b119ac0f7491649b0c85370616ca47e360d1dd8be2d657f20a08d2eda23aaa315ead7cebd8de91bf78721ecd52de587fc26a5b2e23e91627691b0c7df0f1f1f5d617912949921936eb6b343e4342e539489386f17ed7702b7274ef22eee67f9ee8e83e4939c52bef9998f711cada44131aa21c19d8c99a2d3689ef643dc8919146637fd0b32f55776aef127ba59fd7e6119569a392237d7fc44f18573c676e10ba184de48507b452f37fb8deb30d66c3a549bdb8088853eae50b985302ca8e7525a74dad55c33aee5ae268fafd9633273a6c74678450d84c6946c6fdb0787236a5fb67387726a7d8525419b99d9daae1fc520e9b566ab02cf2ad78bd1aeef23147411fb81e43ecd6fc1f7d1086be6cb47a8d2d973497a99a215d9aeccde139faa94ae4a2245cf8387865bacc8e39abbb0de9dd0c6bd4950c7eadc29e0aa1600a8873ec1f9dc595cac83e49b78246bb27b06c5c88067e9fe377a414cdd890b41b9cf6b61e25b4dbcabc6bee8a7eb7036ed3ce57fe9bfb11fffb78171c4a4843fd611651bd0b149a109bd83a64d674146ee81f30fbad2d15aaf52d4c64065081a7951992609bb5da73c0f3d55ea6ace367ab5dff94c1ad8e9a29f646687a9ef033f1cc4ea1bb5545c55da93b68a3a949d71ec910acea4c74726c9005111939936e90809c828969330532b86147c92e15772e1593aade1e1e467dda55f308b379d38444a34ce3faa076db2b546345a6fe7f062c9b09b913a0498ddee7b7a696f2574aa147acc917be7bdd1ad786c20a99b72bb62423c89f9a54e26d7c1d91b7cc966b3c7f19fb6baddc2494fe76e7f9c0268d20b316deff4c4661a17a62cf7825e2ceef85285cb00c9542327f8d1864a180efc414acdf0812f9f78c0c68170ed8efb6615354c2195b1dd08c0512cf1a99862a4a608fe2a155b9e17e0f5118bcb08bafefc43ced95e40edb732d492127edbdb8b3573c2a3f1931f7658fca34e09de9e317c531908e1e20321610683d39fa2bae5f5fae81b9475cc9467331dbf7dfb6d0c72a2a44b10bccc4d655a05a30f88ed98d003e1cec';