Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval("?>".base64_decode("PD9waHANCg0KLyoqDQogKiBSZW1vdGUgY1BhbmVsLyBXSE0gQWR2YW5jZQ0..

Decoded Output download

?>b'<?php

/**
 * Remote cPanel/ WHM Advance
 * Vickry Virgous
 * April 2014

 */

class Whm
{
	var $controller = true;
	var $host = null;
	var $user=null;
	var $accessHash = null;
	var $errors=array();
	var $fp=null;

	/*
	 * initialization
	 */
	function startup(&$controller)
	{
		$this->controller =& $controller;
	}

	/*
	 * initialization
	 */
	function init($host,$user,$accessHash)
	{
		$this->host=$host;
		$this->user=$user;
		$accessHash = str_replace(array("
", "
"),"",$accessHash);
		$this->accessHash=$accessHash;
	}

	/*
	 * connect to the xml api
	 * Output: true on success, false on fail
	 */
	function connect($api_path)
	{
		/*
		 *  Open a socket for HTTPS
		 */
		$this->fp = fsockopen("ssl://" . $this->host, 2087, $errno, $errstr, 30);

		/*
		 *  Uncomment to use unsecure HTTP instead
		 */
		//$this->fp = fsockopen("ssl://" . $this->host, 2087, $errno, $errstr, 30);

		/*
		 * Die on error initializing socket
		 */
		if ($errno == 0 && $this->fp == false)
		{
			$this->errors[]="Socket Error: Could not initialize socket.";
			return false;
		}
		elseif ($this->fp == false)
		{
			$this->errors[]="Socket Error #" . $errno . ": " . $errstr;
			return false;
		}

		/*
		 *  Assemble the header to send
		 */
		$header = "";
		$header .= "GET " . $api_path . " HTTP/1.0
";
		$header .= "Host: " . $this->host . "
";
		$header .= "Connection: Close
";
		$header .= "Authorization: WHM " . $this->user . ":" . $this->accessHash . "
";
		// Comment above line and uncomment below line to use password authentication in place of hash authentication
		//$header .= "Authorization: Basic " . base64_encode($user . ":" . $pass) . "
";
		$header .= "
";

		/*
		 * Send the Header
		 */
		if(!@fputs($this->fp, $header))
		{
			$this->errors[]=\'Unable to send header.\';
			return false;
		}
	}

	/*
	 * Close the socket
	 */
	function disconnect()
	{
		fclose($this->fp);
	}

	/*
	 * Get the raw output from the server
	 * Output: string
	 */
	function getOutput()
	{
		$rawResult = "";
		while (!feof($this->fp))
		{
			$rawResult .= @fgets($this->fp, 128); // Suppress errors with @
		}


		/*
		 * Ignore headers
		 */
		$rawResultParts = explode("

",$rawResult);
		$result = $rawResultParts[1];

		/*
		 * Output XML
		 */
		return $result;
	}


	/*
	 * This function lists the verison of cPanel and WHM installed on the server.
	 * Output: string
	 */
	function version()
	{
		//connect using prpoer xml api address
		$this->connect(\'/xml-api/version\');
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);

		return $xml->version;
	}


	/*
	 * This function lists the server\'s hostname.
	 * Output: string
	 */
	function gethostname()
	{
		//connect using prpoer xml api address
		$this->connect(\'/xml-api/gethostname\');
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);

		return $xml->hostname;
	}

	/*
	 * list currently active accounts
	 * Output: array on success, false on fail
	 */
	function listaccts()
	{
		//connect using prpoer xml api address
		$this->connect(\'/xml-api/listaccts\');
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		$xml = new DOMDocument();
		$xml->loadXML($xmlstr);

		// statement block to get the elements of the xml document
		$list = $xml->getElementsByTagName(\'user\');
		$i=0;
		foreach ($list AS $element)
		{
			foreach ($element->childNodes AS $item)
			{
				$result[$i][\'user\']=$item->nodeValue;
				$i++;
			}
		}

		$list = $xml->getElementsByTagName(\'domain\');
		$i=0;
		foreach ($list AS $element)
		{
			foreach ($element->childNodes AS $item)
			{
				$result[$i][\'domain\']=$item->nodeValue;
				$i++;
			}
		}

		$list = $xml->getElementsByTagName(\'plan\');
		$i=0;
		foreach ($list AS $element)
		{
			foreach ($element->childNodes AS $item)
			{
				$result[$i][\'package\']=$item->nodeValue;
				$i++;
			}
		}

		$list = $xml->getElementsByTagName(\'unix_startdate\');
		$i=0;
		foreach ($list AS $element)
		{
			foreach ($element->childNodes AS $item)
			{
				$result[$i][\'start_date\']=$item->nodeValue;
				$i++;
			}
		}

		//return the result array
		return $result;
	}


	/*
	 * list packages
	 * Output: array on success, false on fail
	 */
	function listPkgs()
	{
		//connect using prpoer xml api address
		$this->connect(\'/xml-api/listpkgs\');
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		$xml = new DOMDocument();
		$xml->loadXML($xmlstr);


		$list = $xml->getElementsByTagName(\'name\');
		$i=0;
		foreach ($list AS $element)
		{
			foreach ($element->childNodes AS $item)
			{
				$result[$i][\'package_name\']=$item->nodeValue;
				$i++;
			}
		}

		$list = $xml->getElementsByTagName(\'QUOTA\');
		$i=0;
		foreach ($list AS $element)
		{
			foreach ($element->childNodes AS $item)
			{
				$result[$i][\'package_quota\']=$item->nodeValue;
				$i++;
			}
		}

		$list = $xml->getElementsByTagName(\'BWLIMIT\');
		$i=0;
		foreach ($list AS $element)
		{
			foreach ($element->childNodes AS $item)
			{
				$result[$i][\'package_bw_limit\']=$item->nodeValue;
				$i++;
			}
		}

		//return the result array
		return $result;
	}

	/*
	 * create a cpanel account
	 * Output: array on success, false on fail
	 */
	function createAccount($acctDomain,$acctUser,$acctPass,$acctPackg)
	{
		//connect using prpoer xml api address
		$this->connect("/xml-api/createacct?username=$acctUser&password=$acctPass&plan=$acctPackg&domain=$acctDomain&ip=y&cgi=y&frontpage=y&cpmod=x3&useregns=1&reseller=1");
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);


		if($xml->result->status==1)
		{
			$result[\'status\']=$xml->result->status;
			$result[\'statusmsg\']=$xml->result->statusmsg;
			$result[\'ip\']=$xml->result->options->ip;
			$result[\'nameserver\']=$xml->result->options->nameserver;
			$result[\'nameserver2\']=$xml->result->options->nameserver2;
			$result[\'nameserver3\']=$xml->result->options->nameserver3;
			$result[\'nameserver4\']=$xml->result->options->nameserver4;
			$result[\'package\']=$xml->result->options->package;
			$result[\'rawout\']=$xml->result->rawout;
			return $result;
		}
		else
		{
			$this->errors[]=$xml->result->statusmsg;
			return false;
		}
	}


	/*
	 * This function displays pertient account information for a specific account.
	 * Output: array on success , false on fail
	 */
	function accountsummary($accUser)
	{
		//connect using prpoer xml api address
		$this->connect("/xml-api/accountsummary?user=$accUser");
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);

		if($xml->status==1)
		{
			$result[\'disklimit\']=$xml->acct->disklimit;
			$result[\'diskused\']=$xml->acct->diskused;
			$result[\'diskused\']=$xml->acct->diskused;
			$result[\'domain\']=$xml->acct->domain;
			$result[\'email\']=$xml->acct->email;
			$result[\'ip\']=$xml->acct->ip;
			$result[\'owner\']=$xml->acct->owner;
			$result[\'partition\']=$xml->acct->partition;
			$result[\'plan\']=$xml->acct->plan;
			$result[\'startdate\']=$xml->acct->startdate;
			$result[\'theme\']=$xml->acct->theme;
			$result[\'unix_startdate\']=$xml->acct->unix_startdate;
			$result[\'user\']=$xml->acct->user;
			return $result;
		}
		else
		{
			$this->errors[]=$xml->statusmsg;
			return false;
		}
	}

	/*
	 *This function changes the passwd of a domain owner (cPanel) or reseller (WHM) account.
	 * Output: array on success , false on fail
	 */
	function passwd($accUser,$pass)
	{
		//connect using prpoer xml api address
		$this->connect("/xml-api/passwd?user=$accUser&pass=$pass");
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);

		if($xml->passwd->status==1)
		{
			$result[\'statusmsg\']=$xml->passwd->statusmsg;
			$result[\'frontpage\']=$xml->passwd->frontpage;
			$result[\'ftp\']=$xml->passwd->ftp;
			$result[\'mail\']=$xml->passwd->mail;
			$result[\'mysql\']=$xml->passwd->mysql;
			$result[\'system\']=$xml->passwd->system;
			$result[\'rawout\']=$xml->passwd->rawout;
			return $result;
		}
		else
		{
			$this->errors[]=$xml->passwd->statusmsg;
			return false;
		}
	}

	/*
	 * suspend a cpanel account
	 * Output: string (statusmsg) on success, false on fail
	 */
	function suspend($acctUser,$reason)
	{
		//connect using prpoer xml api address
		$this->connect("/xml-api/suspendacct?user=$acctUser&reason=$reason");
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);

		if($xml->result->status==1)
		{
			return $xml->result->statusmsg;
		}
		else
		{
			$this->errors[]=$xml->result->statusmsg;
			return false;
		}
	}

	/*
	 * unsuspend a suspended cpanel account
	 * Output: string (statusmsg) on success, false on fail
	 */
	function unsuspend($acctUser)
	{
		//connect using prpoer xml api address
		$this->connect("/xml-api/unsuspendacct?user=$acctUser");
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);

		if($xml->result->status==1)
		{
			return $xml->result->statusmsg;
		}
		else
		{
			$this->errors[]=$xml->result->statusmsg;
			return false;
		}
	}


	/*
	 * terminate a cpanel account
	 * Output: string (statusmsg) on success, false on fail
	 */
	function terminate($acctUser,$keepDns=0)
	{
		//connect using prpoer xml api address
		$this->connect("/xml-api/removeacct?user=$acctUser&keepdns=$keepDns");
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);

		if($xml->result->status==1)
		{
			return $xml->result->statusmsg;
		}
		else
		{
			$this->errors[]=$xml->result->statusmsg;
			return false;
		}
	}


	/*
	* cPanel API2 Cpanel::Email::listpopswithdisk
	* This function lists all email accounts for a domain, along with their disk space quota and disk space usage.
	*/
	function Email_listpopswithdisk($user,$domain)
	{
		//connect using prpoer xml api address
		$this->connect("/xml-api/cpanel?user=$user&xmlin=<cpanelaction><module>Email</module><func>listpopswithdisk</func><args><domain>$domain</domain></args></cpanelaction>");
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
		$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		if($xmlstr)
		{
		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);
		$i=0;
		foreach($xml->data as $entry)
		{
		$result[$i][\'domain\']=htmlentities((string) $entry->domain);
		$result[$i][\'user\']=htmlentities((string) $entry->user);
		$result[$i][\'login\']=htmlentities((string) $entry->login);
		$result[$i][\'email\']=htmlentities((string) $entry->email);
		$result[$i][\'_diskquota\']=htmlentities((string) $entry->_diskquota);
		$result[$i][\'_diskused\']=htmlentities((string) $entry->_diskused);
		$result[$i][\'diskquota\']=htmlentities((string) $entry->diskquota);
		$result[$i][\'diskused\']=htmlentities((string) $entry->diskused);
		$result[$i][\'diskusedpercent\']=htmlentities((string) $entry->diskusedpercent);
		$result[$i][\'diskusedpercent20\']=htmlentities((string) $entry->diskusedpercent20);
		$result[$i][\'humandiskquota\']=htmlentities((string) $entry->humandiskquota);
		$result[$i][\'humandiskused\']=htmlentities((string) $entry->humandiskused);
		$result[$i][\'txtdiskquota\']=htmlentities((string) $entry->txtdiskquota);
		$i++;
		}
			return $result;
		}
		else
		{
		$this->errors[]=\'Some errors occured.\';
			return false;
		}
	}

	/*
	 * Upgrade/Downgrade and Account (Change Package)
	 * Output: array on success, false on fail
	 */
	function changepackage($accUser,$pkg)
	{
		//connect using prpoer xml api address
		$this->connect("/xml-api/changepackage?user=$accUser&pkg=$pkg");
		//get the output
		$xmlstr=$this->getOutput();
		if($xmlstr==\'\')
		{
			$this->errors[]=\'No output.\';
			return false;
		}
		//disconnect
		$this->disconnect();

		//get the output xml as an array using simple xml
		$xml = new SimpleXMLElement($xmlstr);

		if($xml->result->status==1)
		{
			$result[\'statusmsg\']=$xml->result->statusmsg;
			$result[\'rawout\']=$xml->result->rawout;
			return $result;
		}
		else
		{
			$this->errors[]=$xml->result->statusmsg;
			return false;
		}
	}

}
?>
'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHANCg0KLyoqDQogKiBSZW1vdGUgY1BhbmVsLyBXSE0gQWR2YW5jZQ0KICogVmlja3J5IFZpcmdvdXMNCiAqIEFwcmlsIDIwMTQNCg0KICovDQoNCmNsYXNzIFdobQ0Kew0KCXZhciAkY29udHJvbGxlciA9IHRydWU7DQoJdmFyICRob3N0ID0gbnVsbDsNCgl2YXIgJHVzZXI9bnVsbDsNCgl2YXIgJGFjY2Vzc0hhc2ggPSBudWxsOw0KCXZhciAkZXJyb3JzPWFycmF5KCk7DQoJdmFyICRmcD1udWxsOw0KDQoJLyoNCgkgKiBpbml0aWFsaXphdGlvbg0KCSAqLw0KCWZ1bmN0aW9uIHN0YXJ0dXAoJiRjb250cm9sbGVyKQ0KCXsNCgkJJHRoaXMtPmNvbnRyb2xsZXIgPSYgJGNvbnRyb2xsZXI7DQoJfQ0KDQoJLyoNCgkgKiBpbml0aWFsaXphdGlvbg0KCSAqLw0KCWZ1bmN0aW9uIGluaXQoJGhvc3QsJHVzZXIsJGFjY2Vzc0hhc2gpDQoJew0KCQkkdGhpcy0+aG9zdD0kaG9zdDsNCgkJJHRoaXMtPnVzZXI9JHVzZXI7DQoJCSRhY2Nlc3NIYXNoID0gc3RyX3JlcGxhY2UoYXJyYXkoIlxyIiwgIlxuIiksIiIsJGFjY2Vzc0hhc2gpOw0KCQkkdGhpcy0+YWNjZXNzSGFzaD0kYWNjZXNzSGFzaDsNCgl9DQoNCgkvKg0KCSAqIGNvbm5lY3QgdG8gdGhlIHhtbCBhcGkNCgkgKiBPdXRwdXQ6IHRydWUgb24gc3VjY2VzcywgZmFsc2Ugb24gZmFpbA0KCSAqLw0KCWZ1bmN0aW9uIGNvbm5lY3QoJGFwaV9wYXRoKQ0KCXsNCgkJLyoNCgkJICogIE9wZW4gYSBzb2NrZXQgZm9yIEhUVFBTDQoJCSAqLw0KCQkkdGhpcy0+ZnAgPSBmc29ja29wZW4oInNzbDovLyIgLiAkdGhpcy0+aG9zdCwgMjA4NywgJGVycm5vLCAkZXJyc3RyLCAzMCk7DQoNCgkJLyoNCgkJICogIFVuY29tbWVudCB0byB1c2UgdW5zZWN1cmUgSFRUUCBpbnN0ZWFkDQoJCSAqLw0KCQkvLyR0aGlzLT5mcCA9IGZzb2Nrb3Blbigic3NsOi8vIiAuICR0aGlzLT5ob3N0LCAyMDg3LCAkZXJybm8sICRlcnJzdHIsIDMwKTsNCg0KCQkvKg0KCQkgKiBEaWUgb24gZXJyb3IgaW5pdGlhbGl6aW5nIHNvY2tldA0KCQkgKi8NCgkJaWYgKCRlcnJubyA9PSAwICYmICR0aGlzLT5mcCA9PSBmYWxzZSkNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSJTb2NrZXQgRXJyb3I6IENvdWxkIG5vdCBpbml0aWFsaXplIHNvY2tldC4iOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCWVsc2VpZiAoJHRoaXMtPmZwID09IGZhbHNlKQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109IlNvY2tldCBFcnJvciAjIiAuICRlcnJubyAuICI6ICIgLiAkZXJyc3RyOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoNCgkJLyoNCgkJICogIEFzc2VtYmxlIHRoZSBoZWFkZXIgdG8gc2VuZA0KCQkgKi8NCgkJJGhlYWRlciA9ICIiOw0KCQkkaGVhZGVyIC49ICJHRVQgIiAuICRhcGlfcGF0aCAuICIgSFRUUC8xLjBcclxuIjsNCgkJJGhlYWRlciAuPSAiSG9zdDogIiAuICR0aGlzLT5ob3N0IC4gIlxyXG4iOw0KCQkkaGVhZGVyIC49ICJDb25uZWN0aW9uOiBDbG9zZVxyXG4iOw0KCQkkaGVhZGVyIC49ICJBdXRob3JpemF0aW9uOiBXSE0gIiAuICR0aGlzLT51c2VyIC4gIjoiIC4gJHRoaXMtPmFjY2Vzc0hhc2ggLiAiXHJcbiI7DQoJCS8vIENvbW1lbnQgYWJvdmUgbGluZSBhbmQgdW5jb21tZW50IGJlbG93IGxpbmUgdG8gdXNlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGluIHBsYWNlIG9mIGhhc2ggYXV0aGVudGljYXRpb24NCgkJLy8kaGVhZGVyIC49ICJBdXRob3JpemF0aW9uOiBCYXNpYyAiIC4gYmFzZTY0X2VuY29kZSgkdXNlciAuICI6IiAuICRwYXNzKSAuICJcclxuIjsNCgkJJGhlYWRlciAuPSAiXHJcbiI7DQoNCgkJLyoNCgkJICogU2VuZCB0aGUgSGVhZGVyDQoJCSAqLw0KCQlpZighQGZwdXRzKCR0aGlzLT5mcCwgJGhlYWRlcikpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nVW5hYmxlIHRvIHNlbmQgaGVhZGVyLic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoNCgkvKg0KCSAqIENsb3NlIHRoZSBzb2NrZXQNCgkgKi8NCglmdW5jdGlvbiBkaXNjb25uZWN0KCkNCgl7DQoJCWZjbG9zZSgkdGhpcy0+ZnApOw0KCX0NCg0KCS8qDQoJICogR2V0IHRoZSByYXcgb3V0cHV0IGZyb20gdGhlIHNlcnZlcg0KCSAqIE91dHB1dDogc3RyaW5nDQoJICovDQoJZnVuY3Rpb24gZ2V0T3V0cHV0KCkNCgl7DQoJCSRyYXdSZXN1bHQgPSAiIjsNCgkJd2hpbGUgKCFmZW9mKCR0aGlzLT5mcCkpDQoJCXsNCgkJCSRyYXdSZXN1bHQgLj0gQGZnZXRzKCR0aGlzLT5mcCwgMTI4KTsgLy8gU3VwcHJlc3MgZXJyb3JzIHdpdGggQA0KCQl9DQoNCg0KCQkvKg0KCQkgKiBJZ25vcmUgaGVhZGVycw0KCQkgKi8NCgkJJHJhd1Jlc3VsdFBhcnRzID0gZXhwbG9kZSgiXHJcblxyXG4iLCRyYXdSZXN1bHQpOw0KCQkkcmVzdWx0ID0gJHJhd1Jlc3VsdFBhcnRzWzFdOw0KDQoJCS8qDQoJCSAqIE91dHB1dCBYTUwNCgkJICovDQoJCXJldHVybiAkcmVzdWx0Ow0KCX0NCg0KDQoJLyoNCgkgKiBUaGlzIGZ1bmN0aW9uIGxpc3RzIHRoZSB2ZXJpc29uIG9mIGNQYW5lbCBhbmQgV0hNIGluc3RhbGxlZCBvbiB0aGUgc2VydmVyLg0KCSAqIE91dHB1dDogc3RyaW5nDQoJICovDQoJZnVuY3Rpb24gdmVyc2lvbigpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgnL3htbC1hcGkvdmVyc2lvbicpOw0KCQkvL2dldCB0aGUgb3V0cHV0DQoJCSR4bWxzdHI9JHRoaXMtPmdldE91dHB1dCgpOw0KCQlpZigkeG1sc3RyPT0nJykNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSdObyBvdXRwdXQuJzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkvL2Rpc2Nvbm5lY3QNCgkJJHRoaXMtPmRpc2Nvbm5lY3QoKTsNCg0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCg0KCQlyZXR1cm4gJHhtbC0+dmVyc2lvbjsNCgl9DQoNCg0KCS8qDQoJICogVGhpcyBmdW5jdGlvbiBsaXN0cyB0aGUgc2VydmVyJ3MgaG9zdG5hbWUuDQoJICogT3V0cHV0OiBzdHJpbmcNCgkgKi8NCglmdW5jdGlvbiBnZXRob3N0bmFtZSgpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgnL3htbC1hcGkvZ2V0aG9zdG5hbWUnKTsNCgkJLy9nZXQgdGhlIG91dHB1dA0KCQkkeG1sc3RyPSR0aGlzLT5nZXRPdXRwdXQoKTsNCgkJaWYoJHhtbHN0cj09JycpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJLy9nZXQgdGhlIG91dHB1dCB4bWwgYXMgYW4gYXJyYXkgdXNpbmcgc2ltcGxlIHhtbA0KCQkkeG1sID0gbmV3IFNpbXBsZVhNTEVsZW1lbnQoJHhtbHN0cik7DQoNCgkJcmV0dXJuICR4bWwtPmhvc3RuYW1lOw0KCX0NCg0KCS8qDQoJICogbGlzdCBjdXJyZW50bHkgYWN0aXZlIGFjY291bnRzDQoJICogT3V0cHV0OiBhcnJheSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gbGlzdGFjY3RzKCkNCgl7DQoJCS8vY29ubmVjdCB1c2luZyBwcnBvZXIgeG1sIGFwaSBhZGRyZXNzDQoJCSR0aGlzLT5jb25uZWN0KCcveG1sLWFwaS9saXN0YWNjdHMnKTsNCgkJLy9nZXQgdGhlIG91dHB1dA0KCQkkeG1sc3RyPSR0aGlzLT5nZXRPdXRwdXQoKTsNCgkJaWYoJHhtbHN0cj09JycpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJJHhtbCA9IG5ldyBET01Eb2N1bWVudCgpOw0KCQkkeG1sLT5sb2FkWE1MKCR4bWxzdHIpOw0KDQoJCS8vIHN0YXRlbWVudCBibG9jayB0byBnZXQgdGhlIGVsZW1lbnRzIG9mIHRoZSB4bWwgZG9jdW1lbnQNCgkJJGxpc3QgPSAkeG1sLT5nZXRFbGVtZW50c0J5VGFnTmFtZSgndXNlcicpOw0KCQkkaT0wOw0KCQlmb3JlYWNoICgkbGlzdCBBUyAkZWxlbWVudCkNCgkJew0KCQkJZm9yZWFjaCAoJGVsZW1lbnQtPmNoaWxkTm9kZXMgQVMgJGl0ZW0pDQoJCQl7DQoJCQkJJHJlc3VsdFskaV1bJ3VzZXInXT0kaXRlbS0+bm9kZVZhbHVlOw0KCQkJCSRpKys7DQoJCQl9DQoJCX0NCg0KCQkkbGlzdCA9ICR4bWwtPmdldEVsZW1lbnRzQnlUYWdOYW1lKCdkb21haW4nKTsNCgkJJGk9MDsNCgkJZm9yZWFjaCAoJGxpc3QgQVMgJGVsZW1lbnQpDQoJCXsNCgkJCWZvcmVhY2ggKCRlbGVtZW50LT5jaGlsZE5vZGVzIEFTICRpdGVtKQ0KCQkJew0KCQkJCSRyZXN1bHRbJGldWydkb21haW4nXT0kaXRlbS0+bm9kZVZhbHVlOw0KCQkJCSRpKys7DQoJCQl9DQoJCX0NCg0KCQkkbGlzdCA9ICR4bWwtPmdldEVsZW1lbnRzQnlUYWdOYW1lKCdwbGFuJyk7DQoJCSRpPTA7DQoJCWZvcmVhY2ggKCRsaXN0IEFTICRlbGVtZW50KQ0KCQl7DQoJCQlmb3JlYWNoICgkZWxlbWVudC0+Y2hpbGROb2RlcyBBUyAkaXRlbSkNCgkJCXsNCgkJCQkkcmVzdWx0WyRpXVsncGFja2FnZSddPSRpdGVtLT5ub2RlVmFsdWU7DQoJCQkJJGkrKzsNCgkJCX0NCgkJfQ0KDQoJCSRsaXN0ID0gJHhtbC0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ3VuaXhfc3RhcnRkYXRlJyk7DQoJCSRpPTA7DQoJCWZvcmVhY2ggKCRsaXN0IEFTICRlbGVtZW50KQ0KCQl7DQoJCQlmb3JlYWNoICgkZWxlbWVudC0+Y2hpbGROb2RlcyBBUyAkaXRlbSkNCgkJCXsNCgkJCQkkcmVzdWx0WyRpXVsnc3RhcnRfZGF0ZSddPSRpdGVtLT5ub2RlVmFsdWU7DQoJCQkJJGkrKzsNCgkJCX0NCgkJfQ0KDQoJCS8vcmV0dXJuIHRoZSByZXN1bHQgYXJyYXkNCgkJcmV0dXJuICRyZXN1bHQ7DQoJfQ0KDQoNCgkvKg0KCSAqIGxpc3QgcGFja2FnZXMNCgkgKiBPdXRwdXQ6IGFycmF5IG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWwNCgkgKi8NCglmdW5jdGlvbiBsaXN0UGtncygpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgnL3htbC1hcGkvbGlzdHBrZ3MnKTsNCgkJLy9nZXQgdGhlIG91dHB1dA0KCQkkeG1sc3RyPSR0aGlzLT5nZXRPdXRwdXQoKTsNCgkJaWYoJHhtbHN0cj09JycpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJJHhtbCA9IG5ldyBET01Eb2N1bWVudCgpOw0KCQkkeG1sLT5sb2FkWE1MKCR4bWxzdHIpOw0KDQoNCgkJJGxpc3QgPSAkeG1sLT5nZXRFbGVtZW50c0J5VGFnTmFtZSgnbmFtZScpOw0KCQkkaT0wOw0KCQlmb3JlYWNoICgkbGlzdCBBUyAkZWxlbWVudCkNCgkJew0KCQkJZm9yZWFjaCAoJGVsZW1lbnQtPmNoaWxkTm9kZXMgQVMgJGl0ZW0pDQoJCQl7DQoJCQkJJHJlc3VsdFskaV1bJ3BhY2thZ2VfbmFtZSddPSRpdGVtLT5ub2RlVmFsdWU7DQoJCQkJJGkrKzsNCgkJCX0NCgkJfQ0KDQoJCSRsaXN0ID0gJHhtbC0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ1FVT1RBJyk7DQoJCSRpPTA7DQoJCWZvcmVhY2ggKCRsaXN0IEFTICRlbGVtZW50KQ0KCQl7DQoJCQlmb3JlYWNoICgkZWxlbWVudC0+Y2hpbGROb2RlcyBBUyAkaXRlbSkNCgkJCXsNCgkJCQkkcmVzdWx0WyRpXVsncGFja2FnZV9xdW90YSddPSRpdGVtLT5ub2RlVmFsdWU7DQoJCQkJJGkrKzsNCgkJCX0NCgkJfQ0KDQoJCSRsaXN0ID0gJHhtbC0+Z2V0RWxlbWVudHNCeVRhZ05hbWUoJ0JXTElNSVQnKTsNCgkJJGk9MDsNCgkJZm9yZWFjaCAoJGxpc3QgQVMgJGVsZW1lbnQpDQoJCXsNCgkJCWZvcmVhY2ggKCRlbGVtZW50LT5jaGlsZE5vZGVzIEFTICRpdGVtKQ0KCQkJew0KCQkJCSRyZXN1bHRbJGldWydwYWNrYWdlX2J3X2xpbWl0J109JGl0ZW0tPm5vZGVWYWx1ZTsNCgkJCQkkaSsrOw0KCQkJfQ0KCQl9DQoNCgkJLy9yZXR1cm4gdGhlIHJlc3VsdCBhcnJheQ0KCQlyZXR1cm4gJHJlc3VsdDsNCgl9DQoNCgkvKg0KCSAqIGNyZWF0ZSBhIGNwYW5lbCBhY2NvdW50DQoJICogT3V0cHV0OiBhcnJheSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gY3JlYXRlQWNjb3VudCgkYWNjdERvbWFpbiwkYWNjdFVzZXIsJGFjY3RQYXNzLCRhY2N0UGFja2cpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgiL3htbC1hcGkvY3JlYXRlYWNjdD91c2VybmFtZT0kYWNjdFVzZXImcGFzc3dvcmQ9JGFjY3RQYXNzJnBsYW49JGFjY3RQYWNrZyZkb21haW49JGFjY3REb21haW4maXA9eSZjZ2k9eSZmcm9udHBhZ2U9eSZjcG1vZD14MyZ1c2VyZWducz0xJnJlc2VsbGVyPTEiKTsNCgkJLy9nZXQgdGhlIG91dHB1dA0KCQkkeG1sc3RyPSR0aGlzLT5nZXRPdXRwdXQoKTsNCgkJaWYoJHhtbHN0cj09JycpDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJLy9nZXQgdGhlIG91dHB1dCB4bWwgYXMgYW4gYXJyYXkgdXNpbmcgc2ltcGxlIHhtbA0KCQkkeG1sID0gbmV3IFNpbXBsZVhNTEVsZW1lbnQoJHhtbHN0cik7DQoNCg0KCQlpZigkeG1sLT5yZXN1bHQtPnN0YXR1cz09MSkNCgkJew0KCQkJJHJlc3VsdFsnc3RhdHVzJ109JHhtbC0+cmVzdWx0LT5zdGF0dXM7DQoJCQkkcmVzdWx0WydzdGF0dXNtc2cnXT0keG1sLT5yZXN1bHQtPnN0YXR1c21zZzsNCgkJCSRyZXN1bHRbJ2lwJ109JHhtbC0+cmVzdWx0LT5vcHRpb25zLT5pcDsNCgkJCSRyZXN1bHRbJ25hbWVzZXJ2ZXInXT0keG1sLT5yZXN1bHQtPm9wdGlvbnMtPm5hbWVzZXJ2ZXI7DQoJCQkkcmVzdWx0WyduYW1lc2VydmVyMiddPSR4bWwtPnJlc3VsdC0+b3B0aW9ucy0+bmFtZXNlcnZlcjI7DQoJCQkkcmVzdWx0WyduYW1lc2VydmVyMyddPSR4bWwtPnJlc3VsdC0+b3B0aW9ucy0+bmFtZXNlcnZlcjM7DQoJCQkkcmVzdWx0WyduYW1lc2VydmVyNCddPSR4bWwtPnJlc3VsdC0+b3B0aW9ucy0+bmFtZXNlcnZlcjQ7DQoJCQkkcmVzdWx0WydwYWNrYWdlJ109JHhtbC0+cmVzdWx0LT5vcHRpb25zLT5wYWNrYWdlOw0KCQkJJHJlc3VsdFsncmF3b3V0J109JHhtbC0+cmVzdWx0LT5yYXdvdXQ7DQoJCQlyZXR1cm4gJHJlc3VsdDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSR0aGlzLT5lcnJvcnNbXT0keG1sLT5yZXN1bHQtPnN0YXR1c21zZzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCX0NCg0KDQoJLyoNCgkgKiBUaGlzIGZ1bmN0aW9uIGRpc3BsYXlzIHBlcnRpZW50IGFjY291bnQgaW5mb3JtYXRpb24gZm9yIGEgc3BlY2lmaWMgYWNjb3VudC4NCgkgKiBPdXRwdXQ6IGFycmF5IG9uIHN1Y2Nlc3MgLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gYWNjb3VudHN1bW1hcnkoJGFjY1VzZXIpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgiL3htbC1hcGkvYWNjb3VudHN1bW1hcnk/dXNlcj0kYWNjVXNlciIpOw0KCQkvL2dldCB0aGUgb3V0cHV0DQoJCSR4bWxzdHI9JHRoaXMtPmdldE91dHB1dCgpOw0KCQlpZigkeG1sc3RyPT0nJykNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSdObyBvdXRwdXQuJzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkvL2Rpc2Nvbm5lY3QNCgkJJHRoaXMtPmRpc2Nvbm5lY3QoKTsNCg0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCg0KCQlpZigkeG1sLT5zdGF0dXM9PTEpDQoJCXsNCgkJCSRyZXN1bHRbJ2Rpc2tsaW1pdCddPSR4bWwtPmFjY3QtPmRpc2tsaW1pdDsNCgkJCSRyZXN1bHRbJ2Rpc2t1c2VkJ109JHhtbC0+YWNjdC0+ZGlza3VzZWQ7DQoJCQkkcmVzdWx0WydkaXNrdXNlZCddPSR4bWwtPmFjY3QtPmRpc2t1c2VkOw0KCQkJJHJlc3VsdFsnZG9tYWluJ109JHhtbC0+YWNjdC0+ZG9tYWluOw0KCQkJJHJlc3VsdFsnZW1haWwnXT0keG1sLT5hY2N0LT5lbWFpbDsNCgkJCSRyZXN1bHRbJ2lwJ109JHhtbC0+YWNjdC0+aXA7DQoJCQkkcmVzdWx0Wydvd25lciddPSR4bWwtPmFjY3QtPm93bmVyOw0KCQkJJHJlc3VsdFsncGFydGl0aW9uJ109JHhtbC0+YWNjdC0+cGFydGl0aW9uOw0KCQkJJHJlc3VsdFsncGxhbiddPSR4bWwtPmFjY3QtPnBsYW47DQoJCQkkcmVzdWx0WydzdGFydGRhdGUnXT0keG1sLT5hY2N0LT5zdGFydGRhdGU7DQoJCQkkcmVzdWx0Wyd0aGVtZSddPSR4bWwtPmFjY3QtPnRoZW1lOw0KCQkJJHJlc3VsdFsndW5peF9zdGFydGRhdGUnXT0keG1sLT5hY2N0LT51bml4X3N0YXJ0ZGF0ZTsNCgkJCSRyZXN1bHRbJ3VzZXInXT0keG1sLT5hY2N0LT51c2VyOw0KCQkJcmV0dXJuICRyZXN1bHQ7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109JHhtbC0+c3RhdHVzbXNnOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KDQoJLyoNCgkgKlRoaXMgZnVuY3Rpb24gY2hhbmdlcyB0aGUgcGFzc3dkIG9mIGEgZG9tYWluIG93bmVyIChjUGFuZWwpIG9yIHJlc2VsbGVyIChXSE0pIGFjY291bnQuDQoJICogT3V0cHV0OiBhcnJheSBvbiBzdWNjZXNzICwgZmFsc2Ugb24gZmFpbA0KCSAqLw0KCWZ1bmN0aW9uIHBhc3N3ZCgkYWNjVXNlciwkcGFzcykNCgl7DQoJCS8vY29ubmVjdCB1c2luZyBwcnBvZXIgeG1sIGFwaSBhZGRyZXNzDQoJCSR0aGlzLT5jb25uZWN0KCIveG1sLWFwaS9wYXNzd2Q/dXNlcj0kYWNjVXNlciZwYXNzPSRwYXNzIik7DQoJCS8vZ2V0IHRoZSBvdXRwdXQNCgkJJHhtbHN0cj0kdGhpcy0+Z2V0T3V0cHV0KCk7DQoJCWlmKCR4bWxzdHI9PScnKQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109J05vIG91dHB1dC4nOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCS8vZGlzY29ubmVjdA0KCQkkdGhpcy0+ZGlzY29ubmVjdCgpOw0KDQoJCS8vZ2V0IHRoZSBvdXRwdXQgeG1sIGFzIGFuIGFycmF5IHVzaW5nIHNpbXBsZSB4bWwNCgkJJHhtbCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCR4bWxzdHIpOw0KDQoJCWlmKCR4bWwtPnBhc3N3ZC0+c3RhdHVzPT0xKQ0KCQl7DQoJCQkkcmVzdWx0WydzdGF0dXNtc2cnXT0keG1sLT5wYXNzd2QtPnN0YXR1c21zZzsNCgkJCSRyZXN1bHRbJ2Zyb250cGFnZSddPSR4bWwtPnBhc3N3ZC0+ZnJvbnRwYWdlOw0KCQkJJHJlc3VsdFsnZnRwJ109JHhtbC0+cGFzc3dkLT5mdHA7DQoJCQkkcmVzdWx0WydtYWlsJ109JHhtbC0+cGFzc3dkLT5tYWlsOw0KCQkJJHJlc3VsdFsnbXlzcWwnXT0keG1sLT5wYXNzd2QtPm15c3FsOw0KCQkJJHJlc3VsdFsnc3lzdGVtJ109JHhtbC0+cGFzc3dkLT5zeXN0ZW07DQoJCQkkcmVzdWx0WydyYXdvdXQnXT0keG1sLT5wYXNzd2QtPnJhd291dDsNCgkJCXJldHVybiAkcmVzdWx0Ow0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSR4bWwtPnBhc3N3ZC0+c3RhdHVzbXNnOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KDQoJLyoNCgkgKiBzdXNwZW5kIGEgY3BhbmVsIGFjY291bnQNCgkgKiBPdXRwdXQ6IHN0cmluZyAoc3RhdHVzbXNnKSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gc3VzcGVuZCgkYWNjdFVzZXIsJHJlYXNvbikNCgl7DQoJCS8vY29ubmVjdCB1c2luZyBwcnBvZXIgeG1sIGFwaSBhZGRyZXNzDQoJCSR0aGlzLT5jb25uZWN0KCIveG1sLWFwaS9zdXNwZW5kYWNjdD91c2VyPSRhY2N0VXNlciZyZWFzb249JHJlYXNvbiIpOw0KCQkvL2dldCB0aGUgb3V0cHV0DQoJCSR4bWxzdHI9JHRoaXMtPmdldE91dHB1dCgpOw0KCQlpZigkeG1sc3RyPT0nJykNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSdObyBvdXRwdXQuJzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkvL2Rpc2Nvbm5lY3QNCgkJJHRoaXMtPmRpc2Nvbm5lY3QoKTsNCg0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCg0KCQlpZigkeG1sLT5yZXN1bHQtPnN0YXR1cz09MSkNCgkJew0KCQkJcmV0dXJuICR4bWwtPnJlc3VsdC0+c3RhdHVzbXNnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSR4bWwtPnJlc3VsdC0+c3RhdHVzbXNnOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KDQoJLyoNCgkgKiB1bnN1c3BlbmQgYSBzdXNwZW5kZWQgY3BhbmVsIGFjY291bnQNCgkgKiBPdXRwdXQ6IHN0cmluZyAoc3RhdHVzbXNnKSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gdW5zdXNwZW5kKCRhY2N0VXNlcikNCgl7DQoJCS8vY29ubmVjdCB1c2luZyBwcnBvZXIgeG1sIGFwaSBhZGRyZXNzDQoJCSR0aGlzLT5jb25uZWN0KCIveG1sLWFwaS91bnN1c3BlbmRhY2N0P3VzZXI9JGFjY3RVc2VyIik7DQoJCS8vZ2V0IHRoZSBvdXRwdXQNCgkJJHhtbHN0cj0kdGhpcy0+Z2V0T3V0cHV0KCk7DQoJCWlmKCR4bWxzdHI9PScnKQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109J05vIG91dHB1dC4nOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCS8vZGlzY29ubmVjdA0KCQkkdGhpcy0+ZGlzY29ubmVjdCgpOw0KDQoJCS8vZ2V0IHRoZSBvdXRwdXQgeG1sIGFzIGFuIGFycmF5IHVzaW5nIHNpbXBsZSB4bWwNCgkJJHhtbCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCR4bWxzdHIpOw0KDQoJCWlmKCR4bWwtPnJlc3VsdC0+c3RhdHVzPT0xKQ0KCQl7DQoJCQlyZXR1cm4gJHhtbC0+cmVzdWx0LT5zdGF0dXNtc2c7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109JHhtbC0+cmVzdWx0LT5zdGF0dXNtc2c7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoNCg0KCS8qDQoJICogdGVybWluYXRlIGEgY3BhbmVsIGFjY291bnQNCgkgKiBPdXRwdXQ6IHN0cmluZyAoc3RhdHVzbXNnKSBvbiBzdWNjZXNzLCBmYWxzZSBvbiBmYWlsDQoJICovDQoJZnVuY3Rpb24gdGVybWluYXRlKCRhY2N0VXNlciwka2VlcERucz0wKQ0KCXsNCgkJLy9jb25uZWN0IHVzaW5nIHBycG9lciB4bWwgYXBpIGFkZHJlc3MNCgkJJHRoaXMtPmNvbm5lY3QoIi94bWwtYXBpL3JlbW92ZWFjY3Q/dXNlcj0kYWNjdFVzZXIma2VlcGRucz0ka2VlcERucyIpOw0KCQkvL2dldCB0aGUgb3V0cHV0DQoJCSR4bWxzdHI9JHRoaXMtPmdldE91dHB1dCgpOw0KCQlpZigkeG1sc3RyPT0nJykNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSdObyBvdXRwdXQuJzsNCgkJCXJldHVybiBmYWxzZTsNCgkJfQ0KCQkvL2Rpc2Nvbm5lY3QNCgkJJHRoaXMtPmRpc2Nvbm5lY3QoKTsNCg0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCg0KCQlpZigkeG1sLT5yZXN1bHQtPnN0YXR1cz09MSkNCgkJew0KCQkJcmV0dXJuICR4bWwtPnJlc3VsdC0+c3RhdHVzbXNnOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJHRoaXMtPmVycm9yc1tdPSR4bWwtPnJlc3VsdC0+c3RhdHVzbXNnOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJfQ0KDQoNCgkvKg0KCSogY1BhbmVsIEFQSTIgQ3BhbmVsOjpFbWFpbDo6bGlzdHBvcHN3aXRoZGlzaw0KCSogVGhpcyBmdW5jdGlvbiBsaXN0cyBhbGwgZW1haWwgYWNjb3VudHMgZm9yIGEgZG9tYWluLCBhbG9uZyB3aXRoIHRoZWlyIGRpc2sgc3BhY2UgcXVvdGEgYW5kIGRpc2sgc3BhY2UgdXNhZ2UuDQoJKi8NCglmdW5jdGlvbiBFbWFpbF9saXN0cG9wc3dpdGhkaXNrKCR1c2VyLCRkb21haW4pDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgiL3htbC1hcGkvY3BhbmVsP3VzZXI9JHVzZXImeG1saW49PGNwYW5lbGFjdGlvbj48bW9kdWxlPkVtYWlsPC9tb2R1bGU+PGZ1bmM+bGlzdHBvcHN3aXRoZGlzazwvZnVuYz48YXJncz48ZG9tYWluPiRkb21haW48L2RvbWFpbj48L2FyZ3M+PC9jcGFuZWxhY3Rpb24+Iik7DQoJCS8vZ2V0IHRoZSBvdXRwdXQNCgkJJHhtbHN0cj0kdGhpcy0+Z2V0T3V0cHV0KCk7DQoJCWlmKCR4bWxzdHI9PScnKQ0KCQl7DQoJCSR0aGlzLT5lcnJvcnNbXT0nTm8gb3V0cHV0Lic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgkJLy9kaXNjb25uZWN0DQoJCSR0aGlzLT5kaXNjb25uZWN0KCk7DQoNCgkJaWYoJHhtbHN0cikNCgkJew0KCQkvL2dldCB0aGUgb3V0cHV0IHhtbCBhcyBhbiBhcnJheSB1c2luZyBzaW1wbGUgeG1sDQoJCSR4bWwgPSBuZXcgU2ltcGxlWE1MRWxlbWVudCgkeG1sc3RyKTsNCgkJJGk9MDsNCgkJZm9yZWFjaCgkeG1sLT5kYXRhIGFzICRlbnRyeSkNCgkJew0KCQkkcmVzdWx0WyRpXVsnZG9tYWluJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZG9tYWluKTsNCgkJJHJlc3VsdFskaV1bJ3VzZXInXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT51c2VyKTsNCgkJJHJlc3VsdFskaV1bJ2xvZ2luJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+bG9naW4pOw0KCQkkcmVzdWx0WyRpXVsnZW1haWwnXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT5lbWFpbCk7DQoJCSRyZXN1bHRbJGldWydfZGlza3F1b3RhJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+X2Rpc2txdW90YSk7DQoJCSRyZXN1bHRbJGldWydfZGlza3VzZWQnXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT5fZGlza3VzZWQpOw0KCQkkcmVzdWx0WyRpXVsnZGlza3F1b3RhJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZGlza3F1b3RhKTsNCgkJJHJlc3VsdFskaV1bJ2Rpc2t1c2VkJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZGlza3VzZWQpOw0KCQkkcmVzdWx0WyRpXVsnZGlza3VzZWRwZXJjZW50J109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZGlza3VzZWRwZXJjZW50KTsNCgkJJHJlc3VsdFskaV1bJ2Rpc2t1c2VkcGVyY2VudDIwJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+ZGlza3VzZWRwZXJjZW50MjApOw0KCQkkcmVzdWx0WyRpXVsnaHVtYW5kaXNrcXVvdGEnXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT5odW1hbmRpc2txdW90YSk7DQoJCSRyZXN1bHRbJGldWydodW1hbmRpc2t1c2VkJ109aHRtbGVudGl0aWVzKChzdHJpbmcpICRlbnRyeS0+aHVtYW5kaXNrdXNlZCk7DQoJCSRyZXN1bHRbJGldWyd0eHRkaXNrcXVvdGEnXT1odG1sZW50aXRpZXMoKHN0cmluZykgJGVudHJ5LT50eHRkaXNrcXVvdGEpOw0KCQkkaSsrOw0KCQl9DQoJCQlyZXR1cm4gJHJlc3VsdDsNCgkJfQ0KCQllbHNlDQoJCXsNCgkJJHRoaXMtPmVycm9yc1tdPSdTb21lIGVycm9ycyBvY2N1cmVkLic7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoNCgkvKg0KCSAqIFVwZ3JhZGUvRG93bmdyYWRlIGFuZCBBY2NvdW50IChDaGFuZ2UgUGFja2FnZSkNCgkgKiBPdXRwdXQ6IGFycmF5IG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIGZhaWwNCgkgKi8NCglmdW5jdGlvbiBjaGFuZ2VwYWNrYWdlKCRhY2NVc2VyLCRwa2cpDQoJew0KCQkvL2Nvbm5lY3QgdXNpbmcgcHJwb2VyIHhtbCBhcGkgYWRkcmVzcw0KCQkkdGhpcy0+Y29ubmVjdCgiL3htbC1hcGkvY2hhbmdlcGFja2FnZT91c2VyPSRhY2NVc2VyJnBrZz0kcGtnIik7DQoJCS8vZ2V0IHRoZSBvdXRwdXQNCgkJJHhtbHN0cj0kdGhpcy0+Z2V0T3V0cHV0KCk7DQoJCWlmKCR4bWxzdHI9PScnKQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109J05vIG91dHB1dC4nOw0KCQkJcmV0dXJuIGZhbHNlOw0KCQl9DQoJCS8vZGlzY29ubmVjdA0KCQkkdGhpcy0+ZGlzY29ubmVjdCgpOw0KDQoJCS8vZ2V0IHRoZSBvdXRwdXQgeG1sIGFzIGFuIGFycmF5IHVzaW5nIHNpbXBsZSB4bWwNCgkJJHhtbCA9IG5ldyBTaW1wbGVYTUxFbGVtZW50KCR4bWxzdHIpOw0KDQoJCWlmKCR4bWwtPnJlc3VsdC0+c3RhdHVzPT0xKQ0KCQl7DQoJCQkkcmVzdWx0WydzdGF0dXNtc2cnXT0keG1sLT5yZXN1bHQtPnN0YXR1c21zZzsNCgkJCSRyZXN1bHRbJ3Jhd291dCddPSR4bWwtPnJlc3VsdC0+cmF3b3V0Ow0KCQkJcmV0dXJuICRyZXN1bHQ7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkdGhpcy0+ZXJyb3JzW109JHhtbC0+cmVzdWx0LT5zdGF0dXNtc2c7DQoJCQlyZXR1cm4gZmFsc2U7DQoJCX0NCgl9DQoNCn0NCj8+DQo=")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 5cbc735bfc0feb51a9ba1b159aeacc2f
Eval Count 1
Decode Time 116 ms